mirror of
https://github.com/willmiao/ComfyUI-Lora-Manager.git
synced 2026-03-25 23:25:43 -03:00
Enhance duplicates management: add help tooltip for duplicate groups and improve responsive styling for banners and groups.
This commit is contained in:
@@ -17,12 +17,13 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.duplicates-banner .banner-content {
|
.duplicates-banner .banner-content {
|
||||||
max-width: 1400px; /* Match the container max-width */
|
position: relative;
|
||||||
|
max-width: 1400px;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 12px;
|
gap: 12px;
|
||||||
padding: 0 16px; /* Move horizontal padding to the content */
|
padding: 0 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Responsive container for larger screens - match container in layout.css */
|
/* Responsive container for larger screens - match container in layout.css */
|
||||||
@@ -122,6 +123,23 @@
|
|||||||
margin-bottom: 24px;
|
margin-bottom: 24px;
|
||||||
background: var(--card-bg);
|
background: var(--card-bg);
|
||||||
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.12); /* Add subtle shadow to groups */
|
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.12); /* Add subtle shadow to groups */
|
||||||
|
/* Add responsive width settings to match banner */
|
||||||
|
max-width: 1400px;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add responsive container adjustments for duplicate groups - match container in banner */
|
||||||
|
@media (min-width: 2000px) {
|
||||||
|
.duplicate-group {
|
||||||
|
max-width: 1800px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 3000px) {
|
||||||
|
.duplicate-group {
|
||||||
|
max-width: 2400px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.duplicate-group-header {
|
.duplicate-group-header {
|
||||||
@@ -345,6 +363,49 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Help icon styling */
|
||||||
|
.help-icon {
|
||||||
|
color: var(--text-color);
|
||||||
|
opacity: 0.7;
|
||||||
|
cursor: help;
|
||||||
|
font-size: 16px;
|
||||||
|
margin-left: 8px;
|
||||||
|
transition: all 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.help-icon:hover {
|
||||||
|
opacity: 1;
|
||||||
|
color: oklch(var(--lora-accent-l) var(--lora-accent-c) var(--lora-accent-h));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Help tooltip */
|
||||||
|
.help-tooltip {
|
||||||
|
display: none;
|
||||||
|
position: absolute;
|
||||||
|
max-width: 400px;
|
||||||
|
background: var(--card-bg);
|
||||||
|
color: var(--text-color);
|
||||||
|
border: 1px solid var(--border-color);
|
||||||
|
border-radius: var(--border-radius-sm);
|
||||||
|
padding: 12px 16px;
|
||||||
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
|
||||||
|
z-index: var(--z-overlay);
|
||||||
|
font-size: 0.9em;
|
||||||
|
margin-top: 10px;
|
||||||
|
text-align: left;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.help-tooltip:after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: -8px;
|
||||||
|
left: 10px; /* Position the arrow near the left instead of center */
|
||||||
|
border-width: 0 8px 8px 8px;
|
||||||
|
border-style: solid;
|
||||||
|
border-color: transparent transparent var(--card-bg) transparent;
|
||||||
|
}
|
||||||
|
|
||||||
/* Responsive adjustments */
|
/* Responsive adjustments */
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
.duplicates-banner .banner-content {
|
.duplicates-banner .banner-content {
|
||||||
@@ -375,6 +436,15 @@
|
|||||||
margin-left: 0;
|
margin-left: 0;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.help-tooltip {
|
||||||
|
max-width: calc(100% - 40px);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remove the fixed positioning adjustments for mobile since we're now using dynamic positioning */
|
||||||
|
.help-tooltip:after {
|
||||||
|
left: 10px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* In dark mode, add additional distinction */
|
/* In dark mode, add additional distinction */
|
||||||
@@ -387,6 +457,10 @@ html[data-theme="dark"] .duplicate-group {
|
|||||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.25); /* Stronger shadow in dark mode */
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.25); /* Stronger shadow in dark mode */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
html[data-theme="dark"] .help-tooltip {
|
||||||
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
/* Styles for disabled controls during duplicates mode */
|
/* Styles for disabled controls during duplicates mode */
|
||||||
.disabled-during-duplicates {
|
.disabled-during-duplicates {
|
||||||
opacity: 0.5 !important;
|
opacity: 0.5 !important;
|
||||||
|
|||||||
@@ -123,6 +123,9 @@ export class ModelDuplicatesManager {
|
|||||||
if (banner && countSpan) {
|
if (banner && countSpan) {
|
||||||
countSpan.textContent = `Found ${this.duplicateGroups.length} duplicate group${this.duplicateGroups.length !== 1 ? 's' : ''}`;
|
countSpan.textContent = `Found ${this.duplicateGroups.length} duplicate group${this.duplicateGroups.length !== 1 ? 's' : ''}`;
|
||||||
banner.style.display = 'block';
|
banner.style.display = 'block';
|
||||||
|
|
||||||
|
// Setup help tooltip behavior
|
||||||
|
this.setupHelpTooltip();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Disable virtual scrolling if active
|
// Disable virtual scrolling if active
|
||||||
@@ -551,4 +554,46 @@ export class ModelDuplicatesManager {
|
|||||||
// Use this method after refresh operations
|
// Use this method after refresh operations
|
||||||
this.checkDuplicatesCount();
|
this.checkDuplicatesCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add this new method for tooltip behavior
|
||||||
|
setupHelpTooltip() {
|
||||||
|
const helpIcon = document.getElementById('duplicatesHelp');
|
||||||
|
const helpTooltip = document.getElementById('duplicatesHelpTooltip');
|
||||||
|
|
||||||
|
if (!helpIcon || !helpTooltip) return;
|
||||||
|
|
||||||
|
helpIcon.addEventListener('mouseenter', (e) => {
|
||||||
|
// Get the container's positioning context
|
||||||
|
const bannerContent = helpIcon.closest('.banner-content');
|
||||||
|
|
||||||
|
// Get positions relative to the viewport
|
||||||
|
const iconRect = helpIcon.getBoundingClientRect();
|
||||||
|
const bannerRect = bannerContent.getBoundingClientRect();
|
||||||
|
|
||||||
|
// Set initial position relative to the banner content
|
||||||
|
helpTooltip.style.display = 'block';
|
||||||
|
helpTooltip.style.top = `${iconRect.bottom - bannerRect.top + 10}px`;
|
||||||
|
helpTooltip.style.left = `${iconRect.left - bannerRect.left - 10}px`;
|
||||||
|
|
||||||
|
// Check if the tooltip is going off-screen to the right
|
||||||
|
const tooltipRect = helpTooltip.getBoundingClientRect();
|
||||||
|
const viewportWidth = window.innerWidth;
|
||||||
|
|
||||||
|
if (tooltipRect.right > viewportWidth - 20) {
|
||||||
|
// Reposition relative to container if too close to right edge
|
||||||
|
helpTooltip.style.left = `${bannerContent.offsetWidth - tooltipRect.width - 20}px`;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Rest of the event listeners remain unchanged
|
||||||
|
helpIcon.addEventListener('mouseleave', () => {
|
||||||
|
helpTooltip.style.display = 'none';
|
||||||
|
});
|
||||||
|
|
||||||
|
document.addEventListener('click', (e) => {
|
||||||
|
if (!helpIcon.contains(e.target)) {
|
||||||
|
helpTooltip.style.display = 'none';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,6 +37,7 @@
|
|||||||
<div class="banner-content">
|
<div class="banner-content">
|
||||||
<i class="fas fa-exclamation-triangle"></i>
|
<i class="fas fa-exclamation-triangle"></i>
|
||||||
<span id="duplicatesCount">Found 0 duplicate groups</span>
|
<span id="duplicatesCount">Found 0 duplicate groups</span>
|
||||||
|
<i class="fas fa-question-circle help-icon" id="duplicatesHelp" aria-label="Help information"></i>
|
||||||
<div class="banner-actions">
|
<div class="banner-actions">
|
||||||
<button class="btn-delete-selected disabled" onclick="modelDuplicatesManager.deleteSelectedDuplicates()">
|
<button class="btn-delete-selected disabled" onclick="modelDuplicatesManager.deleteSelectedDuplicates()">
|
||||||
Delete Selected (<span id="duplicatesSelectedCount">0</span>)
|
Delete Selected (<span id="duplicatesSelectedCount">0</span>)
|
||||||
@@ -46,6 +47,10 @@
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="help-tooltip" id="duplicatesHelpTooltip">
|
||||||
|
<p>Identical hashes mean identical model files, even if they have different names or previews.</p>
|
||||||
|
<p>Keep only one version (preferably with better metadata/previews) and safely delete the others.</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Checkpoint cards container -->
|
<!-- Checkpoint cards container -->
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
<div class="banner-content">
|
<div class="banner-content">
|
||||||
<i class="fas fa-exclamation-triangle"></i>
|
<i class="fas fa-exclamation-triangle"></i>
|
||||||
<span id="duplicatesCount">Found 0 duplicate groups</span>
|
<span id="duplicatesCount">Found 0 duplicate groups</span>
|
||||||
|
<i class="fas fa-question-circle help-icon" id="duplicatesHelp" aria-label="Help information"></i>
|
||||||
<div class="banner-actions">
|
<div class="banner-actions">
|
||||||
<button class="btn-delete-selected disabled" onclick="modelDuplicatesManager.deleteSelectedDuplicates()">
|
<button class="btn-delete-selected disabled" onclick="modelDuplicatesManager.deleteSelectedDuplicates()">
|
||||||
Delete Selected (<span id="duplicatesSelectedCount">0</span>)
|
Delete Selected (<span id="duplicatesSelectedCount">0</span>)
|
||||||
@@ -35,6 +36,10 @@
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="help-tooltip" id="duplicatesHelpTooltip">
|
||||||
|
<p>Identical hashes mean identical model files, even if they have different names or previews.</p>
|
||||||
|
<p>Keep only one version (preferably with better metadata/previews) and safely delete the others.</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Lora卡片容器 -->
|
<!-- Lora卡片容器 -->
|
||||||
|
|||||||
Reference in New Issue
Block a user