diff --git a/portal/templates/portal/base.html b/portal/templates/portal/base.html index dead2a8..65e6a6c 100644 --- a/portal/templates/portal/base.html +++ b/portal/templates/portal/base.html @@ -124,6 +124,210 @@ .mt-2 { margin-top: 1rem; } .mb-1 { margin-bottom: 0.5rem; } .mb-2 { margin-bottom: 1rem; } + + /* ── AppSwitcher ── */ + .app-switcher { + position: relative; + } + .app-switcher-trigger { + display: flex; + align-items: center; + gap: 8px; + padding: 5px 10px; + border-radius: 8px; + font-size: 0.875rem; + font-weight: 600; + background: rgba(255,255,255,0.08); + color: #cbd5e1; + border: none; + cursor: pointer; + transition: background 0.15s; + line-height: 1; + } + .app-switcher-trigger:hover { + background: rgba(255,255,255,0.12); + } + .app-switcher-badge { + width: 24px; + height: 24px; + border-radius: 6px; + display: flex; + align-items: center; + justify-content: center; + font-size: 10px; + font-weight: 900; + color: #0f172a; + line-height: 1; + flex-shrink: 0; + } + .app-switcher-arrow { + font-size: 0.7em; + opacity: 0.6; + } + .app-switcher-dropdown { + display: none; + position: absolute; + top: 100%; + left: 0; + margin-top: 6px; + width: 300px; + max-height: 70vh; + overflow-y: auto; + border-radius: 12px; + background: #1e293b; + border: 1px solid rgba(255,255,255,0.1); + box-shadow: 0 20px 40px rgba(0,0,0,0.3); + z-index: 9999; + } + .app-switcher-dropdown.open { + display: block; + } + .app-switcher-header { + padding: 12px 14px; + border-bottom: 1px solid rgba(255,255,255,0.08); + display: flex; + align-items: center; + gap: 10px; + } + .app-switcher-header-badge { + width: 28px; + height: 28px; + border-radius: 8px; + background: linear-gradient(135deg, #67e8f9, #c4b5fd, #fda4af); + display: flex; + align-items: center; + justify-content: center; + font-size: 11px; + font-weight: 900; + color: #0f172a; + line-height: 1; + flex-shrink: 0; + } + .app-switcher-header-title { + font-size: 0.875rem; + font-weight: 700; + color: #fff; + } + .app-switcher-header-sub { + font-size: 10px; + color: #94a3b8; + } + .app-switcher-cat { + padding: 12px 14px 4px; + font-size: 0.6rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.1em; + color: #64748b; + user-select: none; + } + .app-switcher-item { + display: flex; + align-items: center; + transition: background 0.12s; + } + .app-switcher-item:hover { + background: rgba(255,255,255,0.04); + } + .app-switcher-item.current { + background: rgba(255,255,255,0.07); + } + .app-switcher-item a.app-switcher-link { + display: flex; + align-items: center; + gap: 10px; + flex: 1; + padding: 8px 14px; + color: #cbd5e1; + text-decoration: none; + min-width: 0; + } + .app-switcher-item-info { + display: flex; + flex-direction: column; + min-width: 0; + flex: 1; + } + .app-switcher-item-name { + display: flex; + align-items: center; + gap: 6px; + } + .app-switcher-item-name span:first-child { + font-size: 0.875rem; + font-weight: 600; + } + .app-switcher-item-name span:last-child { + font-size: 0.875rem; + flex-shrink: 0; + } + .app-switcher-item-desc { + font-size: 11px; + color: #94a3b8; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + .app-switcher-item .app-switcher-ext { + width: 32px; + display: flex; + align-items: center; + justify-content: center; + font-size: 12px; + color: #22d3ee; + opacity: 0; + text-decoration: none; + flex-shrink: 0; + transition: opacity 0.12s; + } + .app-switcher-item:hover .app-switcher-ext { + opacity: 0.5; + } + .app-switcher-item .app-switcher-ext:hover { + opacity: 1 !important; + } + .app-switcher-footer { + padding: 10px 14px; + border-top: 1px solid rgba(255,255,255,0.08); + text-align: center; + } + .app-switcher-footer a { + font-size: 11px; + color: #64748b; + text-decoration: none; + transition: color 0.15s; + } + .app-switcher-footer a:hover { + color: #22d3ee; + } + /* badge colors */ + .badge-teal { background: #5eead4; } + .badge-amber { background: #fcd34d; } + .badge-rose { background: #fda4af; } + .badge-sky { background: #7dd3fc; } + .badge-emerald { background: #6ee7b7; } + .badge-green { background: #86efac; } + .badge-indigo { background: #a5b4fc; } + .badge-fuchsia { background: #f0abfc; } + .badge-violet { background: #c4b5fd; } + .badge-lime { background: #bef264; } + .badge-yellow { background: #fde047; } + .badge-orange { background: #fdba74; } + .badge-red { background: #fca5a5; } + .badge-blue { background: #93c5fd; } + .badge-cyan { background: #67e8f9; } + .badge-pink { background: #f9a8d4; } + .badge-purple { background: #d8b4fe; } + .app-switcher-dropdown::-webkit-scrollbar { + width: 6px; + } + .app-switcher-dropdown::-webkit-scrollbar-track { + background: transparent; + } + .app-switcher-dropdown::-webkit-scrollbar-thumb { + background: rgba(255,255,255,0.1); + border-radius: 3px; + } {% block extra_css %}{% endblock %} @@ -131,7 +335,18 @@