mirror of
https://github.com/willmiao/ComfyUI-Lora-Manager.git
synced 2026-09-21 03:01:27 -03:00
feat(ui): make app header full-width and move Doctor into header controls
- Drop the fixed max-width on .header-container so the header spans the viewport while the card grid keeps its own content width - Keep header icon click targets at 32px at all breakpoints and add role/tabindex/aria-label plus Enter/Space activation - Relocate the Doctor trigger from the page toolbar to the header icon group (also available on the statistics page and in the hamburger menu), removing the now-unused .doctor-trigger styles
This commit is contained in:
@@ -12,7 +12,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.header-container {
|
.header-container {
|
||||||
max-width: 1400px;
|
max-width: none;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
padding: 0 15px;
|
padding: 0 15px;
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -38,19 +38,6 @@
|
|||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Responsive header container for larger screens */
|
|
||||||
@media (min-width: 2150px) {
|
|
||||||
.header-container {
|
|
||||||
max-width: 1800px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: 3000px) {
|
|
||||||
.header-container {
|
|
||||||
max-width: 2400px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Logo and title styling */
|
/* Logo and title styling */
|
||||||
.header-branding {
|
.header-branding {
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -356,6 +343,27 @@
|
|||||||
transform: translateY(-2px);
|
transform: translateY(-2px);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Doctor trigger in the header: accent-tinted icon with the status badge
|
||||||
|
pinned to the corner like the other header badges. */
|
||||||
|
.header-controls .doctor-toggle i {
|
||||||
|
color: var(--lora-accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-controls .doctor-toggle:hover i {
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-controls .doctor-status-badge {
|
||||||
|
position: absolute;
|
||||||
|
top: -6px;
|
||||||
|
right: -6px;
|
||||||
|
min-width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
padding: 0 4px;
|
||||||
|
font-size: 10px;
|
||||||
|
border: 2px solid var(--card-bg);
|
||||||
|
}
|
||||||
|
|
||||||
.theme-toggle {
|
.theme-toggle {
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
@@ -716,11 +724,6 @@
|
|||||||
.header-controls {
|
.header-controls {
|
||||||
gap: 6px;
|
gap: 6px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.header-controls > div {
|
|
||||||
width: 30px;
|
|
||||||
height: 30px;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Responsive: Hide nav icons at 1100px to save space */
|
/* Responsive: Hide nav icons at 1100px to save space */
|
||||||
|
|||||||
@@ -1,13 +1,3 @@
|
|||||||
.doctor-trigger {
|
|
||||||
min-width: 120px;
|
|
||||||
position: relative;
|
|
||||||
border-color: color-mix(in srgb, var(--lora-accent) 24%, var(--border-color));
|
|
||||||
}
|
|
||||||
|
|
||||||
.doctor-trigger i {
|
|
||||||
color: var(--lora-accent);
|
|
||||||
}
|
|
||||||
|
|
||||||
.doctor-status-badge {
|
.doctor-status-badge {
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@@ -247,15 +237,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 760px) {
|
@media (max-width: 760px) {
|
||||||
.doctor-trigger {
|
|
||||||
min-width: auto;
|
|
||||||
padding-inline: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.doctor-trigger span:not(.doctor-status-badge) {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.doctor-hero,
|
.doctor-hero,
|
||||||
.doctor-footer {
|
.doctor-footer {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
|||||||
@@ -49,6 +49,18 @@ export class HeaderManager {
|
|||||||
initializeCommonElements() {
|
initializeCommonElements() {
|
||||||
this.initializeThemePopover();
|
this.initializeThemePopover();
|
||||||
|
|
||||||
|
// Header icon buttons are divs with role="button"; make Enter/Space activate them
|
||||||
|
const headerControls = document.getElementById('headerControls');
|
||||||
|
if (headerControls) {
|
||||||
|
headerControls.addEventListener('keydown', (e) => {
|
||||||
|
if (e.key !== 'Enter' && e.key !== ' ') return;
|
||||||
|
const target = e.target.closest('[role="button"]');
|
||||||
|
if (!target || !headerControls.contains(target)) return;
|
||||||
|
e.preventDefault();
|
||||||
|
target.click();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const settingsToggle = document.querySelector('.settings-toggle');
|
const settingsToggle = document.querySelector('.settings-toggle');
|
||||||
if (settingsToggle) {
|
if (settingsToggle) {
|
||||||
settingsToggle.addEventListener('click', () => {
|
settingsToggle.addEventListener('click', () => {
|
||||||
@@ -295,6 +307,13 @@ export class HeaderManager {
|
|||||||
case 'notifications':
|
case 'notifications':
|
||||||
updateService.toggleUpdateModal();
|
updateService.toggleUpdateModal();
|
||||||
break;
|
break;
|
||||||
|
case 'doctor': {
|
||||||
|
const doctorToggle = document.getElementById('doctorTriggerBtn');
|
||||||
|
if (doctorToggle) {
|
||||||
|
doctorToggle.click();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case 'support':
|
case 'support':
|
||||||
if (window.modalManager) {
|
if (window.modalManager) {
|
||||||
window.modalManager.toggleModal('supportModal');
|
window.modalManager.toggleModal('supportModal');
|
||||||
|
|||||||
@@ -144,13 +144,6 @@
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<div class="control-group doctor-control-group">
|
|
||||||
<button id="doctorTriggerBtn" class="doctor-trigger" title="{{ t('doctor.buttonTitle', default='Run diagnostics and common fixes') }}">
|
|
||||||
<i class="fas fa-stethoscope"></i>
|
|
||||||
<span>{{ t('doctor.title', default='Doctor') }}</span>
|
|
||||||
<span id="doctorStatusBadge" class="doctor-status-badge hidden" aria-hidden="true"></span>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -68,23 +68,34 @@
|
|||||||
<!-- Right section: Controls -->
|
<!-- Right section: Controls -->
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="header-controls" id="headerControls">
|
<div class="header-controls" id="headerControls">
|
||||||
<div class="theme-toggle" title="{{ t('header.theme.toggle') }}">
|
<div class="doctor-toggle" id="doctorTriggerBtn" role="button" tabindex="0"
|
||||||
|
title="{{ t('doctor.buttonTitle', default='Run diagnostics and common fixes') }}"
|
||||||
|
aria-label="{{ t('doctor.title', default='Doctor') }}">
|
||||||
|
<i class="fas fa-stethoscope"></i>
|
||||||
|
<span id="doctorStatusBadge" class="doctor-status-badge hidden" aria-hidden="true"></span>
|
||||||
|
</div>
|
||||||
|
<div class="theme-toggle" role="button" tabindex="0" title="{{ t('header.theme.toggle') }}"
|
||||||
|
aria-label="{{ t('header.theme.toggle') }}">
|
||||||
<i class="fas fa-moon dark-icon"></i>
|
<i class="fas fa-moon dark-icon"></i>
|
||||||
<i class="fas fa-sun light-icon"></i>
|
<i class="fas fa-sun light-icon"></i>
|
||||||
<i class="fas fa-adjust auto-icon"></i>
|
<i class="fas fa-adjust auto-icon"></i>
|
||||||
</div>
|
</div>
|
||||||
<div class="settings-toggle" title="{{ t('common.actions.settings') }}">
|
<div class="settings-toggle" role="button" tabindex="0" title="{{ t('common.actions.settings') }}"
|
||||||
|
aria-label="{{ t('common.actions.settings') }}">
|
||||||
<i class="fas fa-cog"></i>
|
<i class="fas fa-cog"></i>
|
||||||
</div>
|
</div>
|
||||||
<div class="help-toggle" id="helpToggleBtn" title="{{ t('common.actions.help') }}">
|
<div class="help-toggle" id="helpToggleBtn" role="button" tabindex="0" title="{{ t('common.actions.help') }}"
|
||||||
|
aria-label="{{ t('common.actions.help') }}">
|
||||||
<i class="fas fa-question-circle"></i>
|
<i class="fas fa-question-circle"></i>
|
||||||
<span class="update-badge"></span>
|
<span class="update-badge"></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="update-toggle" id="updateToggleBtn" title="{{ t('header.actions.notifications') }}">
|
<div class="update-toggle" id="updateToggleBtn" role="button" tabindex="0"
|
||||||
|
title="{{ t('header.actions.notifications') }}" aria-label="{{ t('header.actions.notifications') }}">
|
||||||
<i class="fas fa-bell"></i>
|
<i class="fas fa-bell"></i>
|
||||||
<span class="update-badge"></span>
|
<span class="update-badge"></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="support-toggle" id="supportToggleBtn" title="{{ t('header.actions.support') }}">
|
<div class="support-toggle" id="supportToggleBtn" role="button" tabindex="0"
|
||||||
|
title="{{ t('header.actions.support') }}" aria-label="{{ t('header.actions.support') }}">
|
||||||
<i class="fas fa-heart"></i>
|
<i class="fas fa-heart"></i>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -110,6 +121,10 @@
|
|||||||
<i class="fas fa-bell"></i>
|
<i class="fas fa-bell"></i>
|
||||||
<span>{{ t('header.actions.notifications') }}</span>
|
<span>{{ t('header.actions.notifications') }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="dropdown-item" data-action="doctor">
|
||||||
|
<i class="fas fa-stethoscope"></i>
|
||||||
|
<span>{{ t('doctor.title', default='Doctor') }}</span>
|
||||||
|
</div>
|
||||||
<div class="dropdown-divider"></div>
|
<div class="dropdown-divider"></div>
|
||||||
<div class="dropdown-item" data-action="support">
|
<div class="dropdown-item" data-action="support">
|
||||||
<i class="fas fa-heart"></i>
|
<i class="fas fa-heart"></i>
|
||||||
|
|||||||
Reference in New Issue
Block a user