/* =========================================== Shell Layout =========================================== */ .shell { --shell-pad: 16px; --shell-gap: 16px; --shell-nav-width: 240px; --shell-topbar-height: 62px; --shell-focus-duration: 200ms; --shell-focus-ease: var(--ease-out); height: 100vh; display: grid; grid-template-columns: var(--shell-nav-width) minmax(0, 1fr); grid-template-rows: var(--shell-topbar-height) 1fr; grid-template-areas: "nav topbar" "nav content"; gap: 0; animation: dashboard-enter 0.4s var(--ease-out); transition: grid-template-columns var(--shell-focus-duration) var(--shell-focus-ease); overflow: hidden; } @supports (height: 100dvh) { .shell { height: 100dvh; } } .shell--chat { min-height: 100vh; height: 100vh; overflow: hidden; } @supports (height: 100dvh) { .shell--chat { height: 100dvh; } } .shell--nav-collapsed { grid-template-columns: 60px minmax(0, 1fr); } .shell--chat-focus { grid-template-columns: 0px minmax(0, 1fr); } .shell--onboarding { grid-template-rows: 0 1fr; } .shell--onboarding .topbar { display: none; } .shell--onboarding .content { padding-top: 0; } .shell--chat-focus .content { padding-top: 0; } .shell--chat-focus .content > * + * { margin-top: 0; } /* =========================================== Topbar =========================================== */ .topbar { grid-area: topbar; position: sticky; top: 0; z-index: 40; display: flex; justify-content: space-between; align-items: center; gap: 12px; padding: 0 20px; height: var(--shell-topbar-height); background: var(--topbar-bg); backdrop-filter: saturate(var(--glass-saturate)) blur(var(--glass-blur)); -webkit-backdrop-filter: saturate(var(--glass-saturate)) blur(var(--glass-blur)); border-bottom: var(--topbar-border); } /* --- Left: Dashboard Header --- */ .dashboard-header { display: flex; align-items: center; gap: 0.5rem; min-width: 0; } .dashboard-header__breadcrumb { display: flex; align-items: center; gap: 6px; font-size: 0.82rem; min-width: 0; } .dashboard-header__breadcrumb-link { color: var(--muted); text-decoration: none; cursor: pointer; white-space: nowrap; } .dashboard-header__breadcrumb-link:hover { color: var(--text); } .dashboard-header__breadcrumb-sep { color: var(--muted); opacity: 0.5; } .dashboard-header__breadcrumb-current { color: var(--text); font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .dashboard-header__actions { margin-left: auto; display: flex; align-items: center; gap: 8px; } /* --- Center: Search / Command Palette Trigger --- */ .topbar-search { display: flex; align-items: center; gap: 8px; padding: 6px 12px; min-width: 200px; max-width: 340px; flex: 1; height: 34px; border: 1px solid var(--border); border-radius: var(--radius-full); background: color-mix(in srgb, var(--secondary) 60%, transparent); color: var(--muted); font-size: 13px; font-family: var(--font-body); cursor: pointer; transition: border-color 180ms ease, background 180ms ease, box-shadow 180ms ease; -webkit-appearance: none; appearance: none; } .topbar-search:hover { border-color: var(--border-strong); background: color-mix(in srgb, var(--secondary) 85%, transparent); } .topbar-search:focus-visible { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-subtle); } .topbar-search__label { flex: 1; text-align: left; pointer-events: none; } .topbar-search__kbd { display: inline-flex; align-items: center; justify-content: center; padding: 1px 6px; min-width: 22px; height: 20px; border: 1px solid var(--border); border-radius: var(--radius-sm); background: color-mix(in srgb, var(--bg) 70%, transparent); color: var(--muted); font-size: 11px; font-family: var(--font-body); font-weight: 500; line-height: 1; pointer-events: none; flex-shrink: 0; } /* --- Right: Status area --- */ .topbar-status { display: flex; align-items: center; gap: 10px; flex-shrink: 0; } .topbar-divider { width: 1px; height: 20px; background: var(--border); flex-shrink: 0; } /* Connection indicator */ .topbar-connection { display: inline-flex; align-items: center; gap: 6px; padding: 4px 10px; border-radius: var(--radius-full); font-size: 12px; font-weight: 500; color: var(--danger); background: var(--danger-subtle); transition: color 250ms ease, background 250ms ease; } .topbar-connection--ok { color: var(--ok); background: var(--ok-subtle); } .topbar-connection__dot { width: 6px; height: 6px; border-radius: var(--radius-full); background: currentColor; box-shadow: 0 0 6px currentColor; flex-shrink: 0; } .topbar-connection:not(.topbar-connection--ok) .topbar-connection__dot { animation: pulse-subtle 2s ease-in-out infinite; } .topbar-connection__label { text-transform: uppercase; letter-spacing: 0.04em; line-height: 1; } /* Redact / stream-mode toggle */ .topbar-redact { display: inline-flex; align-items: center; justify-content: center; gap: 6px; min-width: 28px; height: 28px; padding: 0 4px; border: 1px solid transparent; border-radius: var(--radius); background: none; color: var(--muted); cursor: pointer; transition: color 180ms ease, background 180ms ease, border-color 180ms ease; flex-shrink: 0; } .topbar-redact svg { width: 14px; height: 14px; } .topbar-redact:hover { color: var(--text); background: color-mix(in srgb, var(--secondary) 80%, transparent); border-color: var(--border); } .topbar-redact--active { border-radius: var(--radius-full); padding: 4px 10px; color: var(--warn); background: var(--warn-subtle); } .topbar-redact--active:hover { color: var(--warn); background: color-mix(in srgb, var(--warn-subtle) 80%, var(--warn) 10%); } .topbar-redact__label { font-size: 12px; font-weight: 500; letter-spacing: 0.04em; text-transform: uppercase; line-height: 1; white-space: nowrap; } /* Topbar theme toggle sizing */ .topbar-status .theme-toggle { height: 30px; } .topbar-status .theme-btn svg { width: 13px; height: 13px; } /* =========================================== Navigation Sidebar =========================================== */ .sidebar { grid-area: nav; display: flex; flex-direction: column; overflow-y: auto; overflow-x: hidden; scrollbar-width: none; background: var(--sidebar-bg); backdrop-filter: saturate(var(--glass-saturate)) blur(var(--glass-blur)); -webkit-backdrop-filter: saturate(var(--glass-saturate)) blur(var(--glass-blur)); transition: width var(--shell-focus-duration) var(--shell-focus-ease), padding var(--shell-focus-duration) var(--shell-focus-ease), opacity var(--shell-focus-duration) var(--shell-focus-ease); min-height: 0; border-right: 1px solid var(--glass-border); } .sidebar::-webkit-scrollbar { display: none; } .shell--chat-focus .sidebar { width: 0; padding: 0; border-width: 0; overflow: hidden; pointer-events: none; opacity: 0; } .sidebar--collapsed { align-items: center; } .sidebar--collapsed .sidebar-header { justify-content: center; padding: 10px 8px; min-height: 54px; } .sidebar--collapsed .nav-group__items { padding: 4px 0; align-items: center; } .sidebar--collapsed .nav-item { margin: 0; padding: 10px; justify-content: center; width: 44px; height: 44px; } .sidebar--collapsed .nav-item__icon { width: 22px; height: 22px; opacity: 0.85; } .sidebar--collapsed .nav-item__icon svg { width: 22px; height: 22px; stroke-width: 1.75px; } .sidebar--collapsed .nav-item--active { border-left: 0; } .sidebar--collapsed .sidebar-footer { display: flex; flex-direction: column; align-items: center; padding: 8px 0; } .sidebar--collapsed .sidebar-footer .nav-item { margin: 0; padding: 10px; width: 44px; height: 44px; } /* Sidebar header (brand + collapse) */ .sidebar-header { display: flex; flex-direction: row; align-items: center; padding: 10px 8px; gap: 0; flex-shrink: 0; min-height: 54px; } .sidebar-brand { flex: 2; display: flex; align-items: center; gap: 10px; min-width: 0; max-height: 28px; padding-left: 10px; padding-right: 10px; @media (max-width: 1100px) { padding-left: 0; padding-right: 0; } } .sidebar-brand__logo { width: 28px; height: 28px; flex-shrink: 0; object-fit: contain; } .sidebar-brand__title { font-size: 15px; font-weight: 700; letter-spacing: -0.03em; line-height: 1.1; color: var(--text-strong); white-space: nowrap; } .sidebar-collapse-btn { flex: 1; height: 32px; @media (max-width: 1100px) { height: 28px; } display: flex; align-items: center; justify-content: center; background: var(--bg); border: var(--border) 1px solid transparent; border-radius: var(--radius-sm); cursor: pointer; color: var(--muted); flex-shrink: 0; transition: background var(--duration-fast) ease, border-color var(--duration-fast) ease, color var(--duration-fast) ease; } .sidebar--collapsed .sidebar-collapse-btn { flex: none; width: 100%; } .sidebar-collapse-btn:hover { background: var(--bg); border-color: var(--border); color: var(--text); } .sidebar-collapse-btn svg { width: 24px; height: 24px; stroke: currentColor; fill: none; stroke-width: 1.5px; stroke-linecap: round; stroke-linejoin: round; } /* Sidebar nav section */ .sidebar-nav { flex: 1; padding: 4px 8px; overflow-y: auto; overflow-x: hidden; scrollbar-width: none; } .sidebar-nav::-webkit-scrollbar { display: none; } /* Nav groups */ .nav-group { margin-bottom: 16px; display: grid; gap: 2px; } .nav-group:last-child { margin-bottom: 0; } .nav-group__items { display: grid; gap: 1px; } .nav-group--collapsed .nav-group__items { display: none; } /* Nav group label */ .nav-group__label { display: flex; align-items: center; justify-content: space-between; gap: 8px; width: 100%; padding: 6px 10px; font-size: 12px; font-weight: 600; color: var(--muted); margin-bottom: 4px; background: transparent; border: none; cursor: pointer; text-align: left; border-radius: var(--radius-sm); text-transform: uppercase; letter-spacing: 0.04em; transition: color var(--duration-fast) ease, background var(--duration-fast) ease; } .nav-group__label:hover { color: var(--text); background: var(--bg-hover); } .nav-group__label-text { flex: 1; } .nav-group__chevron { display: flex; align-items: center; justify-content: center; width: 12px; height: 12px; opacity: 0.5; transition: transform var(--duration-fast) ease; } .nav-group__chevron svg { width: 12px; height: 12px; stroke: currentColor; fill: none; stroke-width: 2px; stroke-linecap: round; stroke-linejoin: round; } /* Nav items */ .nav-item { position: relative; display: flex; align-items: center; justify-content: flex-start; gap: 10px; padding: 9px 12px; border-radius: var(--radius-md); border: 1px solid transparent; background: transparent; color: var(--muted); cursor: pointer; text-decoration: none; transition: border-color var(--duration-fast) ease, background var(--duration-fast) ease, color var(--duration-fast) ease, box-shadow var(--duration-fast) ease; } .nav-item__icon { width: 18px; height: 18px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; opacity: 0.7; transition: opacity var(--duration-fast) ease; } .nav-item__icon svg { width: 18px; height: 18px; stroke: currentColor; fill: none; stroke-width: 1.5px; stroke-linecap: round; stroke-linejoin: round; } .nav-item__text { font-size: 14px; font-weight: 500; white-space: nowrap; } .nav-item__external-icon { display: flex; align-items: center; margin-left: auto; opacity: 0.4; } .nav-item__external-icon svg { width: 12px; height: 12px; stroke: currentColor; fill: none; stroke-width: 1.5px; stroke-linecap: round; stroke-linejoin: round; } .nav-item:hover { color: var(--text); background: color-mix(in srgb, var(--secondary) 90%, transparent); border-color: color-mix(in srgb, var(--border) 75%, transparent); text-decoration: none; } .nav-item:hover .nav-item__icon { opacity: 1; } .nav-item--active { color: var(--text-strong); background: color-mix(in srgb, var(--accent-subtle) 70%, var(--secondary)); border-color: color-mix(in srgb, var(--accent) 34%, transparent); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--accent) 20%, transparent); } .nav-item--active .nav-item__icon { opacity: 1; color: var(--accent); } /* Sidebar footer — aligned with chat compose bar */ .sidebar-footer { padding: 14px 8px 6px; border-top: 1px solid var(--border); flex-shrink: 0; margin-top: auto; } .sidebar-version { display: flex; align-items: center; justify-content: center; padding: 6px 10px; } .sidebar-version__text { font-size: 12px; font-weight: 500; color: var(--muted); letter-spacing: 0.02em; } .sidebar-version__dot { width: 6px; height: 6px; border-radius: 50%; background: var(--muted); opacity: 0.4; } /* =========================================== Content Area =========================================== */ .content { grid-area: content; padding: 14px 18px 36px; display: block; min-height: 0; overflow-y: auto; overflow-x: hidden; } .content > * + * { margin-top: 24px; } .content--chat { display: flex; flex-direction: column; gap: 24px; overflow: hidden; padding-bottom: 0; } .content--chat > * + * { margin-top: 0; } /* Content header */ .content-header { display: flex; align-items: flex-end; justify-content: space-between; gap: 12px; padding: 2px 0; overflow: hidden; transform-origin: top center; transition: opacity var(--shell-focus-duration) var(--shell-focus-ease), transform var(--shell-focus-duration) var(--shell-focus-ease), max-height var(--shell-focus-duration) var(--shell-focus-ease), padding var(--shell-focus-duration) var(--shell-focus-ease); max-height: 64px; } .shell--chat-focus .content-header { opacity: 0; transform: translateY(-8px); max-height: 0px; padding: 0; pointer-events: none; } .page-title { font-size: 22px; font-weight: 600; letter-spacing: -0.03em; line-height: 1.2; color: var(--text-strong); } .page-sub { color: var(--muted); font-size: 13px; font-weight: 400; margin-top: 2px; letter-spacing: -0.01em; } .page-meta { display: flex; gap: 6px; align-items: center; } /* Chat view header adjustments */ .content--chat .content-header { flex-direction: row; align-items: center; justify-content: space-between; gap: 12px; } .content--chat .content-header > div:first-child { text-align: left; } .content--chat .page-meta { justify-content: flex-start; } .content--chat .chat-controls { flex-shrink: 0; } /* =========================================== Grid Utilities =========================================== */ .grid { display: grid; gap: 20px; } .grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } .grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } .stat-grid { display: grid; gap: 14px; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); } .note-grid { display: grid; gap: 16px; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); } .row { display: flex; gap: 12px; align-items: center; } .stack { display: grid; gap: 12px; grid-template-columns: minmax(0, 1fr); } .filters { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; } /* =========================================== Responsive - Tablet =========================================== */ @media (max-width: 1100px) { .shell { --shell-pad: 12px; --shell-gap: 12px; grid-template-columns: 1fr; grid-template-rows: auto auto 1fr; grid-template-areas: "topbar" "nav" "content"; } .sidebar { position: static; max-height: none; display: flex; flex-direction: row; gap: 6px; overflow-x: auto; border-right: none; border-bottom: 1px solid var(--border); } .sidebar-header { display: none; } .sidebar-footer { display: none; } .sidebar-nav { display: flex; flex-direction: row; gap: 6px; padding: 10px 14px; overflow-x: auto; } .nav-group { grid-auto-flow: column; grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); margin-bottom: 0; } .grid-cols-2, .grid-cols-3 { grid-template-columns: 1fr; } .topbar { position: static; padding: 12px 14px; gap: 10px; } .topbar-search__kbd { display: none; } .topbar-status { flex-wrap: nowrap; } .table-head, .table-row { grid-template-columns: 1fr; } .list-item { grid-template-columns: 1fr; } }