/* ============================================================ TalentFlow ATS — Utopia Brands Design System ------------------------------------------------------------ Palette source: Utopia Brands Brand Guideline Primary #004d43 deep green · #1a3134 ink teal #ceff71 lime · #eafff4 mint white Secondary #25e9a5 mint · #8e92ff periwinkle Neutral #ffffff · #000000 Typography Display / main headings ....... Inter Tight (semibold, tight tracking) UI, body & sub-headings ....... Neue Montreal (Inter fallback) Wordmark only ................. Belleza Theme model Light — white/mint surfaces, deep green as the action colour. Dark — brand ink-teal surfaces, lime as the action colour. Because the action colour inverts between themes, ALWAYS pair `background: var(--primary)` with `color: var(--primary-fg)`. The same applies to --success/--warning/--danger/--info. ============================================================ */ /* ---------- Brand constants (identical in both themes) ---------- */ :root { --brand-green: #004d43; --brand-ink: #1a3134; --brand-lime: #ceff71; --brand-mint: #25e9a5; --brand-peri: #8e92ff; --brand-tint: #eafff4; } /* ============================ LIGHT ============================ */ :root { color-scheme: light; --bg: #f1f7f4; --bg-elev: #ffffff; --bg-sunken: #e8f2ec; --sidebar-bg: #1a3134; --sidebar-fg: #9fb8b4; --sidebar-fg-active: #ffffff; --sidebar-active-bg: rgba(206,255,113,.14); --sidebar-rail: #ceff71; --border: #dbe8e2; --border-strong: #c2d6ce; --text: #10231f; --text-2: #4a625c; --text-3: #54726c; /* Action colour — deep brand green on light surfaces */ --primary: #004d43; --primary-600: #00382f; --primary-fg: #ffffff; --primary-soft: #eafff4; --primary-border: #b4e3d2; /* Signature accent — lime. Light on white, so it is a SURFACE colour here, never a text colour. Use --accent-ink for text. */ --accent: #ceff71; --accent-fg: #1a3134; --accent-ink: #4f6619; --accent-soft: #f4ffdf; --success: #00734f; --success-fg: #ffffff; --success-soft: #d9f7ec; --warning: #8a5a00; --warning-fg: #ffffff; --warning-soft: #fff2d9; --danger: #b3243a; --danger-fg: #ffffff; --danger-soft: #ffe6ea; --info: #0d6580; --info-fg: #ffffff; --info-soft: #e4f4f9; --purple: #4b4fd6; --purple-fg: #ffffff; --purple-soft: #ecedff; --teal: #00734f; --teal-soft: #d9f7ec; --shadow-sm: 0 1px 2px rgba(10,35,31,.05); --shadow: 0 1px 3px rgba(10,35,31,.07), 0 1px 2px rgba(10,35,31,.04); --shadow-md: 0 4px 12px rgba(10,35,31,.08), 0 2px 4px rgba(10,35,31,.05); --shadow-lg: 0 12px 32px rgba(10,35,31,.12), 0 4px 8px rgba(10,35,31,.06); --radius-sm: 7px; --radius: 11px; --radius-lg: 16px; --radius-xl: 22px; --sidebar-w: 262px; --sidebar-w-collapsed: 74px; --topbar-h: 64px; --font: 'Neue Montreal', 'PP Neue Montreal', 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; --font-display: 'Inter Tight', 'Neue Montreal', 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; --font-brand: 'Belleza', 'Inter Tight', 'Inter', sans-serif; --mono: 'SF Mono', ui-monospace, 'Cascadia Code', Menlo, monospace; /* Type scale — 9 steps that the 20-size census collapses onto. Theme-invariant; declared once here, never redefined in dark. */ --fs-2xs: 11px; /* eyebrow labels, micro-meta */ --fs-xs: 12px; /* badges, chips, cell-sub */ --fs-sm: 13px; /* secondary body, form labels, small buttons */ --fs-base: 14px; /* body, tables, buttons, nav */ --fs-md: 15px; /* card titles */ --fs-lg: 18px; /* section headings, empty states */ --fs-xl: 22px; /* modal titles */ --fs-2xl: 25px; /* profile hero name, mobile page title */ --fs-3xl: 30px; /* page title (Inter Tight) */ --lh-display: 1.15; /* display headings */ --lh-heading: 1.25; /* h2–h6, card titles */ --lh-body: 1.5; /* running copy */ --lh-label: 1.35; /* eyebrows, form labels, table headers */ /* Spacing scale. --gap is the app's signature 18px stack rhythm (grid gap, mt/mb-18, card-head padding) — a sanctioned step, kept. */ --space-1: 4px; --space-2: 8px; --space-3: 12px; --space-4: 16px; --space-5: 20px; --space-6: 24px; --space-7: 32px; --space-8: 40px; --gap: 18px; /* Categorical chart series — brand hues darkened to hold >=3:1 against white so lines and small marks stay legible. */ --c1: #004d43; --c2: #0f9d76; --c3: #5b60e8; --c4: #6f8f14; --c5: #0e7490; --c6: #8a5a00; --c7: #a8327d; --c8: #3f6d64; /* Avatar + pipeline-stage ramps. Both invert with the theme, so the JS emits `var(--av-n)` / `var(--stage-n)` rather than fixed hex. */ --avatar-fg: #ffffff; --av-1: #004d43; --av-2: #1a3134; --av-3: #0f5f4a; --av-4: #2f4858; --av-5: #4b4fd6; --av-6: #155e63; --av-7: #5b3f8f; --av-8: #8a2f4a; --stage-1: #0e7490; --stage-2: #5b60e8; --stage-3: #8a5a00; --stage-4: #004d43; --stage-5: #0f9d76; --stage-6: #6f8f14; --stage-7: #b3243a; --stage-8: #0b6e4f; --stage-9: #b45309; --ring: 0 0 0 3px rgba(0,77,67,.20); /* select chevron: whole url() is tokenised so the stroke can follow the theme */ --chev-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2354726c' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E"); } /* ============================= DARK ============================= */ [data-theme="dark"] { color-scheme: dark; --bg: #0e1d1f; --bg-elev: #16292c; --bg-sunken: #1a3134; --sidebar-bg: #0a1618; --sidebar-fg: #8fa9a4; --sidebar-fg-active: #ffffff; --sidebar-active-bg: rgba(206,255,113,.12); --sidebar-rail: #ceff71; --border: #24403f; --border-strong: #33534f; --text: #e6f2ec; --text-2: #a3bdb6; --text-3: #8fada6; /* Action colour inverts to lime — brand's dark-surface highlight */ --primary: #ceff71; --primary-600: #dcff96; --primary-fg: #0d2523; --primary-soft: rgba(206,255,113,.08); --primary-border: rgba(206,255,113,.32); --accent: #ceff71; --accent-fg: #12292b; --accent-ink: #ceff71; --accent-soft: rgba(206,255,113,.10); --success: #25e9a5; --success-fg: #06251b; --success-soft: rgba(37,233,165,.12); --warning: #f5c451; --warning-fg: #2a1e04; --warning-soft: rgba(245,196,81,.12); --danger: #ff7a8a; --danger-fg: #2d0a10; --danger-soft: rgba(255,122,138,.12); --info: #5fd3e8; --info-fg: #05242b; --info-soft: rgba(95,211,232,.12); --purple: #8e92ff; --purple-fg: #12133a; --purple-soft: rgba(142,146,255,.12); --teal: #25e9a5; --teal-soft: rgba(37,233,165,.12); --shadow-sm: 0 1px 2px rgba(0,0,0,.45); --shadow: 0 1px 3px rgba(0,0,0,.55); --shadow-md: 0 4px 14px rgba(0,0,0,.6); --shadow-lg: 0 14px 40px rgba(0,0,0,.65); /* Same series, brightened for dark surfaces — lime and mint lead. */ --c1: #ceff71; --c2: #25e9a5; --c3: #8e92ff; --c4: #a8e063; --c5: #5fd3e8; --c6: #f5c451; --c7: #ff9ec4; --c8: #7fb3aa; --avatar-fg: #0d2523; --av-1: #ceff71; --av-2: #25e9a5; --av-3: #8e92ff; --av-4: #a8e063; --av-5: #5fd3e8; --av-6: #f5c451; --av-7: #ff9ec4; --av-8: #7fb3aa; --stage-1: #5fd3e8; --stage-2: #8e92ff; --stage-3: #f5c451; --stage-4: #ceff71; --stage-5: #25e9a5; --stage-6: #a8e063; --stage-7: #ff7a8a; --stage-8: #5ee0b5; --stage-9: #ffb020; --ring: 0 0 0 3px rgba(206,255,113,.28); --chev-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%238fada6' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E"); } * { box-sizing: border-box; margin: 0; padding: 0; } html { height: 100%; /* iOS inflates text when a phone is rotated to landscape unless this is pinned; Windows/Android high-contrast modes need the adjust too. */ -webkit-text-size-adjust: 100%; text-size-adjust: 100%; } body { min-height: 100%; font-family: var(--font); background: var(--bg); color: var(--text); font-size: var(--fs-base); line-height: var(--lh-body); -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; /* Grey flash on tap (iOS/Android WebKit + Chromium); we provide our own :active feedback further down instead. */ -webkit-tap-highlight-color: transparent; /* Stop the whole page rubber-banding behind fixed chrome on iOS. */ overscroll-behavior-y: none; } svg { width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; } button { font-family: inherit; cursor: pointer; border: none; background: none; color: inherit; touch-action: manipulation; /* removes the legacy 300ms tap delay */ } input, select, textarea { font-family: inherit; font-size: var(--fs-base); color: var(--text); } a { color: inherit; text-decoration: none; -webkit-tap-highlight-color: transparent; } img, svg, video, canvas { max-width: 100%; } ::-webkit-scrollbar { width: 14px; height: 14px; } ::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 20px; border: 3px solid transparent; background-clip: padding-box; } ::-webkit-scrollbar-thumb:hover { background: var(--text-3); background-clip: padding-box; } ::selection { background: var(--brand-lime); color: var(--brand-ink); } /* Firefox-only scrollbar colors. Chrome 121+ also passes @supports (scrollbar-color: auto), and any non-auto scrollbar-color/width makes Chromium IGNORE the ::-webkit-scrollbar rules above — the old `scrollbar-width: thin` here is what forced the skinny native bars. Gate on -moz-appearance so only Firefox takes this path. */ @supports (-moz-appearance: none) { * { scrollbar-color: var(--border-strong) transparent; } } /* ============================================================ INPUT MODALITY Hover styling belongs to devices that can hover. On touch, :hover sticks after a tap and leaves rows/buttons stuck in a hover state, so every hover rule is gated and touch gets :active feedback instead. ============================================================ */ @media (hover: none) { .btn:active, .icon-btn:active, .nav-item:active, .act-btn:active, .page-btn:active, .dropdown-link:active, .prompt-chip:active, .search-item:active, .k-card:active, .platform-card:active, .role-item:active, .inbox-item:active, .tab:active, .pill-tab:active { opacity: .68; transition: opacity .05s; } } /* Prevent iOS Safari from zooming the page when a control gains focus. Safari zooms whenever the focused field is under 16px, so on any coarse pointer the controls step up to 16px rather than shrinking the viewport. */ @media (pointer: coarse) { input, select, textarea, .form-field input, .form-field select, .form-field textarea, .toolbar-search input, .topbar-search input, .chat-input-bar textarea, .select { font-size: 16px; } } /* ============================================================ BRAND TYPOGRAPHY Display face is Inter Tight — a headline grotesque that shares Inter's skeleton, so titles read as the same voice as the UI, only set semibold with negative tracking. Belleza (the brand guideline's decorative face) is confined to the wordmark: at text sizes and weight 400 it read thin and informal against a dense data UI. Everything structural (labels, tables, controls) stays in the UI face for legibility. ============================================================ */ .page-title, .modal-head h2, .ph-name, .ai-hero h2, .empty-state h3 { font-family: var(--font-display); font-weight: 600; letter-spacing: -0.015em; } .page-title { font-size: var(--fs-3xl); line-height: var(--lh-display); letter-spacing: -0.02em; } .page-title-sm { font-size: var(--fs-xl); letter-spacing: -0.015em; } /* embedded sub-page titles (h2) */ .modal-head h2 { font-size: var(--fs-xl); } .ph-name { font-size: var(--fs-2xl); } .brand-name { font-family: var(--font-brand); font-size: var(--fs-lg); font-weight: 400; letter-spacing: .2px; } /* Metrics read as data — hero numbers use the display face (Inter Tight keeps Inter's figures), everything else stays in the UI face; all tabular-lining so digits don't jitter as values update. */ .kpi-value, .stat-mini-val, .ats-ring .ats-num, .cell-mono, .mono, table.data td, .k-count, .nav-badge { font-variant-numeric: tabular-nums; } /* Base heading scale. Any heading a class doesn't reach lands on a sane step instead of the UA default (which rendered bare h3/h4 LARGER and bolder than the styled card titles beside them). Component rules (.page-title, .modal-head h2, .card-head h3, …) win by specificity. */ h1, h2, h3, h4, h5, h6 { line-height: var(--lh-heading); } h1 { font-family: var(--font-display); font-weight: 600; font-size: var(--fs-3xl); line-height: var(--lh-display); letter-spacing: -0.02em; } h2 { font-size: var(--fs-xl); font-weight: 600; } h3 { font-size: var(--fs-md); font-weight: 600; } h4 { font-size: var(--fs-base); font-weight: 600; } h5, h6 { font-size: var(--fs-sm); font-weight: 600; } /* Eyebrow labels — one concept, one rule. Previously eleven near-identical declarations at five sizes and five letter-spacings. Selectors keep only their unique bits (padding, borders, sticky) at their own definitions. */ .nav-section-label, .search-group-label, .form-section-title, table.data thead th, .rbac-matrix th, .cal-dow, .info-item .il, .hf-tile .hf-k, .hf-block-title, .hf-sign .hf-sign-role, .hf-rate-head > div, .hf-rate-foot > div:first-child { font-size: var(--fs-2xs); font-weight: 700; text-transform: uppercase; letter-spacing: .6px; line-height: var(--lh-label); color: var(--text-3); } /* ============================================================ FOCUS & MOTION (accessibility) ============================================================ */ :where(a, button, input, select, textarea, [tabindex]):focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; border-radius: var(--radius-sm); } :focus:not(:focus-visible) { outline: none; } .sidebar :where(a, button):focus-visible { outline-color: var(--brand-lime); } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; scroll-behavior: auto !important; } } /* dvh tracks the visible area as mobile browser chrome collapses; the vh line above it is the fallback for engines without dvh support. */ #app { display: flex; min-height: 100vh; min-height: 100dvh; } /* ================= SIDEBAR ================= */ .sidebar { width: var(--sidebar-w); background: var(--sidebar-bg); color: var(--sidebar-fg); display: flex; flex-direction: column; position: sticky; top: 0; height: 100vh; height: 100dvh; flex-shrink: 0; transition: width .22s cubic-bezier(.4,0,.2,1); z-index: 60; } .sidebar-brand { display: flex; align-items: center; gap: 12px; padding: 18px 20px; height: var(--topbar-h); border-bottom: 1px solid rgba(255,255,255,.06); position: relative; } .brand-logo { width: 38px; height: 38px; border-radius: 10px; flex-shrink: 0; background: var(--brand-green); display: grid; place-items: center; color: var(--brand-lime); box-shadow: 0 4px 12px rgba(0,0,0,.28); } /* The global `svg` rule strokes icons; the emblem is a filled shape. */ .brand-mark { width: 22px; height: auto; fill: currentColor; stroke: none; } .brand-text { display: flex; flex-direction: column; line-height: 1.1; overflow: hidden; } .brand-name { color: #fff; } .brand-sub { color: var(--sidebar-fg); font-size: 11px; letter-spacing: .3px; } .sidebar-collapse-btn { margin-left: auto; color: var(--sidebar-fg); width: 26px; height: 26px; border-radius: 6px; display: grid; place-items: center; transition: .15s; } .sidebar-collapse-btn:hover { background: rgba(255,255,255,.08); color: #fff; } .sidebar-collapse-btn svg { width: 18px; height: 18px; } .sidebar-nav { flex: 1; overflow-y: auto; overscroll-behavior: contain; -webkit-overflow-scrolling: touch; padding: 14px 12px; } .sidebar-nav::-webkit-scrollbar { width: 6px; } .sidebar-nav::-webkit-scrollbar-thumb { background: rgba(255,255,255,.1); } .nav-section-label { letter-spacing: .8px; /* brand moment — wider than the base eyebrow */ padding: 20px 12px 6px; /* clear air between nav groups */ } .sidebar-nav > div:first-child .nav-section-label { padding-top: 4px; } .nav-item { display: flex; align-items: center; gap: 12px; padding: 9px 12px; border-radius: 9px; margin-bottom: 2px; color: var(--sidebar-fg); font-weight: 500; font-size: var(--fs-base); transition: background .14s, color .14s; position: relative; white-space: nowrap; } .nav-item svg { width: 19px; height: 19px; flex-shrink: 0; stroke-width: 1.9; } .nav-item:hover { background: rgba(255,255,255,.05); color: #fff; } .nav-item.active { background: var(--sidebar-active-bg); color: #fff; font-weight: 600; } .nav-item.active::before { content: ''; position: absolute; left: -12px; top: 50%; transform: translateY(-50%); width: 3px; height: 20px; background: var(--sidebar-rail); border-radius: 0 3px 3px 0; } .nav-badge { margin-left: auto; background: rgba(255,255,255,.12); color: #fff; font-size: var(--fs-xs); font-weight: 600; padding: 1px 8px; border-radius: 20px; min-width: 22px; text-align: center; } .nav-badge-alert { background: var(--danger); color: var(--danger-fg); } .nav-badge-ai { background: var(--brand-lime); color: var(--brand-ink); font-weight: 700; letter-spacing: .3px; } /* The sidebar is a dark surface in BOTH themes, so anything inside it must use sidebar tokens. Left on the global text/surface tokens these dropped to ~2:1 in light mode (the section labels and the Upgrade button). */ .sidebar .nav-section-label { color: var(--sidebar-fg); } .sidebar .btn-ghost { color: var(--sidebar-fg); } .sidebar .btn-ghost:hover { background: rgba(255,255,255,.10); color: #fff; } .sidebar .btn-secondary { background: rgba(255,255,255,.06); color: #fff; border-color: rgba(255,255,255,.14); } .sidebar-footer { padding: 14px; border-top: 1px solid rgba(255,255,255,.06); } .usage-card { background: rgba(255,255,255,.04); border: 1px solid rgba(255,255,255,.07); border-radius: 12px; padding: 14px; } .usage-top { display: flex; justify-content: space-between; font-size: 12px; color: var(--sidebar-fg); margin-bottom: 8px; } .usage-top span:last-child { color: #fff; font-weight: 600; } .usage-bar { height: 6px; background: rgba(255,255,255,.1); border-radius: 20px; overflow: hidden; margin-bottom: 12px; } .usage-fill { height: 100%; background: linear-gradient(90deg, var(--brand-mint), var(--brand-lime)); border-radius: 20px; } /* Collapsed sidebar */ .sidebar.collapsed { width: var(--sidebar-w-collapsed); } .sidebar.collapsed .brand-text, .sidebar.collapsed .nav-item span:not(.nav-badge), .sidebar.collapsed .nav-section-label, .sidebar.collapsed .sidebar-footer, .sidebar.collapsed .nav-badge { display: none; } .sidebar.collapsed .sidebar-collapse-btn { transform: rotate(180deg); position: absolute; right: 8px; } .sidebar.collapsed .nav-item { justify-content: center; padding: 10px; } .sidebar.collapsed .sidebar-brand { justify-content: center; padding: 18px 0; } /* ================= MAIN WRAP ================= */ .main-wrap { flex: 1; display: flex; flex-direction: column; min-width: 0; } /* ================= TOPBAR ================= */ .topbar { height: var(--topbar-h); background: var(--bg-elev); border-bottom: 1px solid var(--border); display: flex; align-items: center; gap: 16px; padding: 0 22px; position: sticky; top: 0; z-index: 50; } /* Double class: .icon-btn { display: grid } is declared later with equal specificity and used to win, leaving the hamburger visible on desktop — where clicking it stranded the scrim over the page with scroll locked. */ .icon-btn.menu-toggle { display: none; } .topbar-search { position: relative; flex: 1; max-width: 480px; display: flex; align-items: center; } .topbar-search > svg { position: absolute; left: 14px; width: 18px; height: 18px; color: var(--text-3); pointer-events: none; } .topbar-search input { width: 100%; padding: 9px 14px 9px 42px; border-radius: 10px; background: var(--bg-sunken); border: 1px solid transparent; outline: none; transition: .15s; } .topbar-search input:focus { background: var(--bg-elev); border-color: var(--primary); box-shadow: var(--ring); } .search-kbd { position: absolute; right: 12px; font-family: var(--mono); font-size: 11px; color: var(--text-3); background: var(--bg-elev); border: 1px solid var(--border); padding: 2px 6px; border-radius: 5px; pointer-events: none; } .search-results { position: absolute; top: calc(100% + 8px); left: 0; right: 0; background: var(--bg-elev); border: 1px solid var(--border); border-radius: 12px; box-shadow: var(--shadow-lg); max-height: 420px; overflow-y: auto; display: none; z-index: 80; padding: 6px; } .search-results.open { display: block; } .search-group-label { padding: 8px 10px 4px; } .search-item { display: flex; align-items: center; gap: 10px; padding: 8px 10px; border-radius: 8px; cursor: pointer; } .search-item:hover { background: var(--bg-sunken); } .search-item .si-title { font-weight: 600; font-size: 13px; } .search-item .si-sub { font-size: 12px; color: var(--text-3); } .search-empty { padding: 24px; text-align: center; color: var(--text-3); font-size: 13px; } .topbar-actions { display: flex; align-items: center; gap: 6px; margin-left: auto; } .topbar-divider { width: 1px; height: 30px; background: var(--border); margin: 0 6px; } .icon-btn { position: relative; width: 40px; height: 40px; border-radius: 10px; display: grid; place-items: center; color: var(--text-2); transition: .15s; } .icon-btn:hover { background: var(--bg-sunken); color: var(--text); } .icon-btn svg { width: 20px; height: 20px; } .icon-sun { display: none; } [data-theme="dark"] .icon-sun { display: block; } [data-theme="dark"] .icon-moon { display: none; } .dot { position: absolute; top: 9px; right: 10px; width: 8px; height: 8px; border-radius: 50%; border: 2px solid var(--bg-elev); } .dot-red { background: var(--danger); } .dot-blue { background: var(--info); } .avatar { width: 36px; height: 36px; border-radius: 50%; display: grid; place-items: center; font-weight: 600; font-size: 13px; color: var(--avatar-fg); flex-shrink: 0; } .avatar-grad { background: linear-gradient(135deg, var(--brand-green), var(--brand-mint)); color: #fff; } .avatar-lg { width: 44px; height: 44px; font-size: 15px; } .profile-btn { display: flex; align-items: center; gap: 10px; padding: 5px 8px 5px 5px; border-radius: 30px; transition: .15s; } .profile-btn:hover { background: var(--bg-sunken); } .profile-meta { display: flex; flex-direction: column; line-height: 1.2; text-align: left; } .profile-name { font-weight: 600; font-size: 13px; } .profile-role { font-size: 11.5px; color: var(--text-3); } .chev { width: 16px; height: 16px; color: var(--text-3); } /* ================= DROPDOWN ================= */ .dropdown { position: relative; } .dropdown-menu { position: absolute; top: calc(100% + 10px); right: 0; min-width: 230px; background: var(--bg-elev); border: 1px solid var(--border); border-radius: 14px; box-shadow: var(--shadow-lg); padding: 8px; opacity: 0; visibility: hidden; transform: translateY(-6px); transition: .16s; z-index: 90; } .dropdown.open .dropdown-menu { opacity: 1; visibility: visible; transform: translateY(0); } .dropdown-menu-wide { min-width: 340px; padding: 0; } .dropdown-head { display: flex; justify-content: space-between; align-items: center; padding: 14px 16px; font-weight: 700; font-size: 14px; border-bottom: 1px solid var(--border); } .dropdown-foot { padding: 10px 16px; border-top: 1px solid var(--border); text-align: center; } .dropdown-foot a { color: var(--primary); font-weight: 600; font-size: 13px; } .dropdown-profile { display: flex; gap: 12px; align-items: center; padding: 14px; } .dp-name { font-weight: 600; } .dp-email { font-size: 12px; color: var(--text-3); } .dropdown-divider { height: 1px; background: var(--border); margin: 6px 0; } .dropdown-link { display: flex; align-items: center; gap: 10px; padding: 9px 12px; border-radius: 8px; font-size: var(--fs-base); font-weight: 500; width: 100%; text-align: left; color: var(--text); } .dropdown-link svg { width: 17px; height: 17px; color: var(--text-3); } .dropdown-link:hover { background: var(--bg-sunken); } .dropdown-link.danger { color: var(--danger); } .dropdown-link.danger svg { color: var(--danger); } .link-btn { color: var(--primary); font-size: 12px; font-weight: 600; } /* Rendered as a