Current section
Files
Jump to
Current section
Files
priv/static/lantern_ui.css
/*
* LanternUI component styles (namespaced `lui-*`).
*
* ALWAYS import this file when using LanternUI components.
*
* Theming comes from `--lantern-*` custom properties, defined one of two ways:
* - Standalone host: also import `lantern_ui_theme.css` (the default light/dark
* theme + density modes).
* - Fluxon (or any token-bearing) host: DON'T import the theme — define a small
* bridge mapping `--lantern-*` onto your host tokens instead, e.g.
*
* :root {
* --lantern-fg: var(--foreground);
* --lantern-fg-muted: var(--foreground-softer);
* --lantern-surface: var(--background-base);
* --lantern-surface-raised: var(--card, var(--background-base));
* --lantern-surface-sunken: var(--background-accent);
* --lantern-surface-hover: var(--background-accent);
* --lantern-border: var(--border-base);
* --lantern-primary: var(--foreground);
* --lantern-primary-fg: var(--background-base);
* --lantern-accent: var(--primary);
* --lantern-ring: var(--primary);
* --lantern-danger: var(--danger);
* --lantern-success: var(--success);
* --lantern-warning: var(--warning);
* }
*/
/* ═══ Components ══════════════════════════════════════════════════════════
*
* Namespaced (`lui-`) so LanternUI coexists with any host CSS (incl. Fluxon)
* with zero build step. Every value reads the tokens above; the consumer's
* `class=` attribute merges on top via LanternUI.Class.
*/
/* ── Icon ── */
.lui-icon {
width: 1.05em;
height: 1.05em;
flex-shrink: 0;
}
/* ── Button ──
* Colors set --lui-c; variants derive bg/border/fg from it, so all
* color × variant combinations work without a compiled class matrix. */
.lui-btn {
--lui-c: var(--lantern-primary);
--lui-c-fg: var(--lantern-primary-fg);
display: inline-flex;
align-items: center;
justify-content: center;
gap: 0.375rem;
height: var(--lantern-control-h);
padding: 0 var(--lantern-control-px);
font-family: var(--lantern-font);
font-size: var(--lantern-text);
font-weight: 500;
letter-spacing: -0.006em;
white-space: nowrap;
border-radius: var(--lantern-radius);
border: 1px solid transparent;
cursor: pointer;
outline: none;
transition:
background-color var(--lantern-duration) var(--lantern-ease),
border-color var(--lantern-duration) var(--lantern-ease),
box-shadow var(--lantern-duration) var(--lantern-ease),
opacity var(--lantern-duration) var(--lantern-ease);
}
.lui-btn[data-color="danger"] { --lui-c: var(--lantern-danger); --lui-c-fg: var(--lantern-danger-fg); }
.lui-btn[data-color="warning"] { --lui-c: var(--lantern-warning); --lui-c-fg: #ffffff; }
.lui-btn[data-color="success"] { --lui-c: var(--lantern-success); --lui-c-fg: #ffffff; }
.lui-btn[data-color="info"] { --lui-c: var(--lantern-accent); --lui-c-fg: var(--lantern-accent-fg); }
.lui-btn[data-variant="solid"] {
background: var(--lui-c);
color: var(--lui-c-fg);
box-shadow: var(--lantern-shadow);
}
.lui-btn[data-variant="solid"]:hover { opacity: 0.9; }
.lui-btn[data-variant="soft"] {
background: color-mix(in oklab, var(--lui-c) 10%, transparent);
color: var(--lui-c);
}
.lui-btn[data-variant="soft"]:hover {
background: color-mix(in oklab, var(--lui-c) 16%, transparent);
}
.lui-btn[data-variant="surface"] {
background: var(--lantern-surface-sunken);
color: var(--lantern-fg);
}
.lui-btn[data-variant="surface"]:hover { background: var(--lantern-surface-hover); }
.lui-btn[data-variant="outline"],
.lui-btn[data-variant="dashed"] {
background: var(--lantern-surface-raised);
color: var(--lantern-fg);
border-color: var(--lantern-border);
box-shadow: var(--lantern-shadow);
}
.lui-btn[data-variant="dashed"] { border-style: dashed; }
.lui-btn[data-variant="outline"]:hover,
.lui-btn[data-variant="dashed"]:hover { background: var(--lantern-surface-sunken); }
.lui-btn[data-variant="ghost"] {
background: transparent;
color: var(--lantern-fg);
}
.lui-btn[data-variant="ghost"]:hover { background: var(--lantern-surface-sunken); }
.lui-btn:focus-visible,
.lui-input-wrap:focus-within,
.lui-cal-day:focus-visible,
.lui-cal-nav:focus-visible {
border-color: var(--lantern-ring);
box-shadow: 0 0 0 3px var(--lantern-ring-soft);
}
.lui-btn[disabled] {
opacity: 0.5;
pointer-events: none;
}
.lui-btn[data-size="xs"] { height: 1.5rem; padding: 0 0.5rem; font-size: var(--lantern-text-sm); }
.lui-btn[data-size="sm"] { height: 1.75rem; padding: 0 0.625rem; font-size: var(--lantern-text-sm); }
.lui-btn[data-size="lg"] { height: 2.25rem; padding: 0 1rem; }
.lui-btn[data-size="xl"] { height: 2.5rem; padding: 0 1.25rem; font-size: 0.875rem; }
.lui-btn[data-size^="icon"] { padding: 0; }
.lui-btn[data-size="icon-xs"] { width: 1.5rem; height: 1.5rem; }
.lui-btn[data-size="icon-sm"] { width: 1.75rem; height: 1.75rem; }
.lui-btn[data-size="icon-md"],
.lui-btn[data-size="icon"] { width: var(--lantern-control-h); height: var(--lantern-control-h); }
.lui-btn[data-size="icon-lg"] { width: 2.25rem; height: 2.25rem; }
.lui-btn[data-size="icon-xl"] { width: 2.5rem; height: 2.5rem; }
.lui-btn-group {
display: inline-flex;
}
.lui-btn-group .lui-btn:not(:first-child) {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
margin-left: -1px;
}
.lui-btn-group .lui-btn:not(:last-child) {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
/* ── Form field ── */
.lui-field {
display: flex;
flex-direction: column;
gap: 0.3125rem;
font-family: var(--lantern-font);
}
.lui-label {
font-size: var(--lantern-text);
font-weight: 550;
color: var(--lantern-fg);
display: inline-flex;
align-items: baseline;
gap: 0.375rem;
}
.lui-sublabel {
font-size: var(--lantern-text-sm);
font-weight: 400;
color: var(--lantern-fg-muted);
}
.lui-description,
.lui-help {
font-size: var(--lantern-text-sm);
color: var(--lantern-fg-muted);
margin: 0;
}
.lui-error {
display: flex;
align-items: center;
gap: 0.3125rem;
font-size: var(--lantern-text-sm);
color: var(--lantern-danger);
margin: 0;
}
.lui-error-icon { width: 0.875rem; height: 0.875rem; }
.lui-input-row {
display: flex;
align-items: stretch;
gap: 0.4375rem;
}
.lui-input-wrap {
flex: 1;
display: flex;
align-items: center;
gap: 0.4375rem;
min-width: 0;
height: var(--lantern-control-h);
padding: 0 0.625rem;
background: var(--lantern-surface);
border: 1px solid var(--lantern-border);
border-radius: var(--lantern-radius);
box-shadow: var(--lantern-shadow);
transition:
border-color var(--lantern-duration) var(--lantern-ease),
box-shadow var(--lantern-duration) var(--lantern-ease);
}
.lui-input-wrap[data-invalid] {
border-color: var(--lantern-danger);
}
.lui-input-wrap[data-invalid]:focus-within {
border-color: var(--lantern-danger);
box-shadow: 0 0 0 3px color-mix(in oklab, var(--lantern-danger) 20%, transparent);
}
.lui-input-wrap[data-disabled] {
opacity: 0.5;
pointer-events: none;
}
.lui-input {
flex: 1;
min-width: 0;
border: none;
background: none;
outline: none;
padding: 0;
font-family: inherit;
font-size: var(--lantern-text);
color: var(--lantern-fg);
}
.lui-input::placeholder { color: var(--lantern-fg-subtle); }
.lui-inner-affix {
display: inline-flex;
align-items: center;
color: var(--lantern-fg-muted);
font-size: var(--lantern-text-sm);
}
.lui-outer-affix { display: inline-flex; align-items: center; }
.lui-field[data-size="xs"] .lui-input-wrap { height: 1.5rem; }
.lui-field[data-size="sm"] .lui-input-wrap { height: 1.75rem; }
.lui-field[data-size="lg"] .lui-input-wrap { height: 2.25rem; }
.lui-field[data-size="xl"] .lui-input-wrap { height: 2.5rem; }
/* ── Calendar ── */
.lui-cal {
display: inline-block;
padding: 0.75rem;
background: var(--lantern-surface-raised);
border: 1px solid var(--lantern-border);
border-radius: var(--lantern-radius-lg);
box-shadow: var(--lantern-shadow-md);
font-family: var(--lantern-font);
user-select: none;
}
.lui-cal-head {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 0.5rem;
}
.lui-cal-title {
font-size: var(--lantern-text);
font-weight: 600;
color: var(--lantern-fg);
letter-spacing: -0.01em;
}
.lui-cal-nav {
display: inline-flex;
align-items: center;
justify-content: center;
width: 1.75rem;
height: 1.75rem;
border: 1px solid var(--lantern-border);
border-radius: var(--lantern-radius-sm);
background: var(--lantern-surface-raised);
color: var(--lantern-fg-muted);
cursor: pointer;
outline: none;
transition: background-color var(--lantern-duration) var(--lantern-ease);
}
.lui-cal-nav:hover { background: var(--lantern-surface-sunken); color: var(--lantern-fg); }
.lui-cal-nav .lui-icon { width: 0.875rem; height: 0.875rem; }
.lui-cal-grid { display: flex; flex-direction: column; gap: 2px; }
.lui-cal-row { display: grid; grid-template-columns: repeat(7, 2rem); gap: 2px; }
.lui-cal-wd {
text-align: center;
font-size: var(--lantern-text-sm);
color: var(--lantern-fg-subtle);
font-weight: 500;
padding: 0.25rem 0;
}
.lui-cal-day {
height: 2rem;
display: inline-flex;
align-items: center;
justify-content: center;
font-size: var(--lantern-text);
font-variant-numeric: tabular-nums;
color: var(--lantern-fg);
background: transparent;
border: 1px solid transparent;
border-radius: var(--lantern-radius-sm);
cursor: pointer;
outline: none;
transition: background-color var(--lantern-duration) var(--lantern-ease);
}
.lui-cal-day:hover { background: var(--lantern-surface-sunken); }
.lui-cal-day[data-outside] { color: var(--lantern-fg-subtle); }
.lui-cal-day[data-today] { box-shadow: inset 0 0 0 1.5px var(--lantern-accent); }
.lui-cal-day[aria-selected="true"] {
background: var(--lantern-primary);
color: var(--lantern-primary-fg);
font-weight: 600;
}
.lui-cal-day[disabled] {
opacity: 0.35;
pointer-events: none;
}
/* ── Segmented date/time field ── */
.lui-dtf {
display: inline-flex;
flex-wrap: nowrap; /* hosts must never wrap the segments (defensive) */
min-width: 0;
align-items: center;
gap: 0.25rem;
height: var(--lantern-control-h);
padding: 0 0.625rem;
background: var(--lantern-surface);
border: 1px solid var(--lantern-border);
border-radius: var(--lantern-radius);
box-shadow: var(--lantern-shadow);
font-family: var(--lantern-font);
font-size: var(--lantern-text);
font-variant-numeric: tabular-nums;
color: var(--lantern-fg);
transition:
border-color var(--lantern-duration) var(--lantern-ease),
box-shadow var(--lantern-duration) var(--lantern-ease);
}
.lui-dtf:focus-within {
border-color: var(--lantern-ring);
box-shadow: 0 0 0 3px var(--lantern-ring-soft);
}
.lui-dtf[data-disabled] {
opacity: 0.5;
pointer-events: none;
}
.lui-dtf-segs {
display: inline-flex;
flex-wrap: nowrap;
align-items: baseline;
flex: 1;
min-width: 0;
overflow: hidden;
white-space: nowrap;
}
.lui-dtf-seg {
padding: 0.0625rem 0.1875rem;
border-radius: 0.25rem;
outline: none;
cursor: text;
}
.lui-dtf-seg:hover { background: var(--lantern-surface-sunken); }
.lui-dtf-seg:focus {
background: var(--lantern-primary);
color: var(--lantern-primary-fg);
}
.lui-dtf-seg:not([data-set]) { color: var(--lantern-fg-subtle); }
.lui-dtf-seg:not([data-set]):focus { color: var(--lantern-primary-fg); }
.lui-dtf-sep {
color: var(--lantern-fg-subtle);
padding: 0 0.0625rem;
}
.lui-dtf-clear {
border: none;
background: none;
color: var(--lantern-fg-subtle);
font-size: var(--lantern-text);
line-height: 1;
padding: 0.125rem 0.25rem;
border-radius: 0.25rem;
cursor: pointer;
}
.lui-dtf-clear:hover { color: var(--lantern-danger); background: var(--lantern-surface-sunken); }
.lui-dtf-suffix {
display: inline-flex;
align-items: center;
color: var(--lantern-fg-muted);
}
/* ── Picker (field + calendar popover composition) ── */
.lui-picker {
position: relative;
display: inline-flex;
flex: 1;
min-width: 0;
}
.lui-picker .lui-dtf { flex: 1; }
.lui-picker-toggle {
display: inline-flex;
align-items: center;
justify-content: center;
border: none;
background: none;
color: var(--lantern-fg-muted);
padding: 0.125rem;
border-radius: 0.25rem;
cursor: pointer;
outline: none;
}
.lui-picker-toggle:hover { color: var(--lantern-fg); background: var(--lantern-surface-sunken); }
.lui-picker-toggle:focus-visible {
box-shadow: 0 0 0 3px var(--lantern-ring-soft);
}
.lui-picker-toggle .lui-icon { width: 1rem; height: 1rem; }
.lui-picker-panel {
z-index: 50;
/* position:fixed + top/left set by the runtime's position() */
background: var(--lantern-surface-raised);
border: 1px solid var(--lantern-border);
border-radius: var(--lantern-radius-lg);
box-shadow: var(--lantern-shadow-md);
padding: 0.375rem 0.75rem 0.625rem;
}
.lui-picker-panel .lui-cal {
background: transparent;
border: none;
box-shadow: none;
border-radius: 0;
padding: 0.375rem 0 0.25rem;
}
/* The footer's Clear covers it; the pane's own null glyph reads as noise. */
.lui-picker-time-field .lui-dtf-clear {
display: none;
}
.lui-picker-panel .lui-picker-cal { display: block; }
.lui-picker-time {
display: flex;
align-items: center;
justify-content: space-between;
gap: 0.5rem;
margin-top: 0.5rem;
padding-top: 0.625rem;
border-top: 1px solid var(--lantern-border);
}
.lui-picker-time-label {
font-size: var(--lantern-text);
color: var(--lantern-fg);
}
.lui-picker-time-field {
background: var(--lantern-surface-sunken);
border-color: transparent;
box-shadow: none;
}
.lui-picker-foot {
display: flex;
align-items: center;
gap: 0.25rem;
padding: 0.5rem 0.75rem;
margin-top: -0.25rem;
background: var(--lantern-surface-raised);
border: 1px solid var(--lantern-border);
border-top: none;
border-radius: 0 0 var(--lantern-radius-lg) var(--lantern-radius-lg);
box-shadow: var(--lantern-shadow-md);
}
.lui-picker-foot-space { flex: 1; }
/* ── Checkbox ── */
.lui-checkbox-field { display: flex; flex-direction: column; gap: 0.25rem; }
.lui-checkbox-row { display: flex; align-items: flex-start; gap: 0.5rem; cursor: pointer;
font-size: var(--lantern-text); }
.lui-checkbox-row[data-disabled] { opacity: 0.55; cursor: not-allowed; }
.lui-checkbox { appearance: none; -webkit-appearance: none; margin: 0.15rem 0 0;
width: 1rem; height: 1rem; flex-shrink: 0; border-radius: 0.25rem;
border: 1px solid var(--lantern-border-strong, var(--lantern-border));
background: var(--lantern-surface); cursor: inherit;
transition: background var(--lantern-duration) var(--lantern-ease),
border-color var(--lantern-duration) var(--lantern-ease); }
.lui-checkbox:checked { background: var(--lantern-primary); border-color: var(--lantern-primary);
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none'%3E%3Cpath d='M3.5 8.5l3 3 6-7' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
background-size: 0.75rem; background-position: center; background-repeat: no-repeat; }
.dark .lui-checkbox:checked { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none'%3E%3Cpath d='M3.5 8.5l3 3 6-7' stroke='%2318181b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); }
.lui-checkbox:focus-visible { outline: none;
box-shadow: 0 0 0 3px var(--lantern-ring-soft, rgba(37, 99, 235, 0.25)); }
.lui-checkbox-label { display: flex; flex-direction: column; gap: 0.1rem; color: var(--lantern-fg); }
.lui-checkbox-desc { font-size: var(--lantern-text-sm); color: var(--lantern-fg-muted); }
/* ── Modal ── */
.lui-modal { position: fixed; inset: 0; z-index: 60; display: flex;
align-items: center; justify-content: center; padding: 1.5rem; }
.lui-modal[data-placement="top"] { align-items: flex-start; padding-top: 4.5rem; }
.lui-modal-backdrop { position: absolute; inset: 0;
background: color-mix(in oklab, #000 45%, transparent);
animation: lui-fade var(--lantern-duration) var(--lantern-ease); }
.lui-modal-panel { position: relative; background: var(--lantern-surface-raised);
color: var(--lantern-fg); border: 1px solid var(--lantern-border);
border-radius: var(--lantern-radius-lg); box-shadow: var(--lantern-shadow-md);
padding: 1.25rem 1.5rem; max-width: 28rem; width: 100%; max-height: calc(100vh - 4rem);
overflow-y: auto; animation: lui-pop var(--lantern-duration) var(--lantern-ease); }
.lui-modal-close { position: absolute; top: 0.75rem; right: 0.75rem; border: none;
background: none; color: var(--lantern-fg-subtle); cursor: pointer; padding: 0.25rem;
border-radius: var(--lantern-radius-sm); line-height: 0; }
.lui-modal-close:hover { color: var(--lantern-fg); background: var(--lantern-surface-sunken); }
@keyframes lui-fade { from { opacity: 0; } }
@keyframes lui-pop { from { opacity: 0; transform: scale(0.97); } }
/* ── Dropdown menu ── */
.lui-dropdown { display: inline-block; position: relative; }
.lui-dropdown-menu { z-index: 50; min-width: 11rem; padding: 0.25rem;
background: var(--lantern-surface-raised); border: 1px solid var(--lantern-border);
border-radius: var(--lantern-radius-md); box-shadow: var(--lantern-shadow-md);
animation: lui-pop var(--lantern-duration) var(--lantern-ease); }
.lui-dropdown-header { padding: 0.375rem 0.625rem; font-size: var(--lantern-text-sm);
font-weight: 600; color: var(--lantern-fg-muted); white-space: nowrap; overflow: hidden;
text-overflow: ellipsis; }
.lui-dropdown-separator { height: 1px; margin: 0.25rem -0.25rem;
background: var(--lantern-border); }
.lui-dropdown-item { display: flex; align-items: center; gap: 0.5rem; width: 100%;
box-sizing: border-box; padding: 0.375rem 0.625rem; border: none; background: none;
text-align: left; text-decoration: none; font-size: var(--lantern-text);
font-family: inherit; color: var(--lantern-fg); border-radius: var(--lantern-radius-sm);
cursor: pointer; }
.lui-dropdown-item:hover, .lui-dropdown-item:focus-visible { outline: none;
background: var(--lantern-surface-sunken); }
.lui-dropdown-item[disabled], .lui-dropdown-item[data-disabled] { opacity: 0.5;
cursor: not-allowed; }
.lui-dropdown-item[data-danger] { color: var(--lantern-danger); }
.lui-dropdown-custom { padding: 0.375rem 0.625rem; }
/* ── Breadcrumb ── */
.lui-breadcrumb-list { display: flex; flex-wrap: wrap; align-items: center; gap: 0.25rem;
list-style: none; margin: 0; padding: 0; font-size: var(--lantern-text); }
.lui-breadcrumb-item { display: inline-flex; align-items: center; gap: 0.25rem;
min-width: 0; }
.lui-breadcrumb-sep { color: var(--lantern-fg-subtle); user-select: none; }
.lui-breadcrumb-link { border: none; background: none; padding: 0.125rem 0.25rem;
font: inherit; color: var(--lantern-fg-muted); text-decoration: none; cursor: pointer;
border-radius: var(--lantern-radius-sm); max-width: 16rem; overflow: hidden;
text-overflow: ellipsis; white-space: nowrap; }
.lui-breadcrumb-link:hover { color: var(--lantern-accent);
background: var(--lantern-surface-sunken); }
.lui-breadcrumb-current { color: var(--lantern-fg); font-weight: 550;
padding: 0.125rem 0.25rem; max-width: 16rem; overflow: hidden; text-overflow: ellipsis;
white-space: nowrap; }
/* ── Empty state ── */
.lui-empty { display: flex; flex-direction: column; align-items: center; gap: 0.375rem;
padding: 2.5rem 1.5rem; text-align: center; }
.lui-empty-icon { width: 1.75rem; height: 1.75rem; color: var(--lantern-fg-subtle); }
.lui-empty-title { margin: 0; font-size: var(--lantern-text); font-weight: 600;
color: var(--lantern-fg); }
.lui-empty-desc { margin: 0; font-size: var(--lantern-text-sm);
color: var(--lantern-fg-muted); max-width: 26rem; }
.lui-empty-actions { display: flex; gap: 0.5rem; margin-top: 0.5rem; }
@media (prefers-reduced-motion: reduce) {
.lui-modal-backdrop, .lui-modal-panel, .lui-dropdown-menu { animation: none; }
}
/* ── App-shell layout (sidebar + main + topbar) ── */
.lui-shell { --lui-sidebar-w: 15rem; display: grid;
grid-template-columns: var(--lui-sidebar-w) minmax(0, 1fr); min-height: 100vh;
transition: grid-template-columns var(--lantern-duration) var(--lantern-ease); }
.lui-shell[data-collapsed] { --lui-sidebar-w: 3.5rem; }
.lui-sidebar { position: sticky; top: 0; height: 100vh; overflow-x: hidden; overflow-y: auto;
display: flex; flex-direction: column; background: var(--lantern-surface);
border-right: 1px solid var(--lantern-border); }
.lui-sidebar-header { display: flex; align-items: center; gap: 0.5rem; height: 3.25rem;
padding: 0 0.9rem; font-weight: 700; font-size: 0.95rem; letter-spacing: -0.02em;
color: var(--lantern-fg); white-space: nowrap; flex-shrink: 0;
border-bottom: 1px solid var(--lantern-border); }
.lui-sidebar-header .lui-icon { color: var(--lantern-accent); flex-shrink: 0; font-size: 1.15rem; }
.lui-sidebar-nav { flex: 1; min-height: 0; overflow-y: auto; padding: 0.75rem 0.6rem; }
.lui-nav-group { margin-bottom: 1rem; }
.lui-nav-group-label { font-size: 0.6875rem; font-weight: 600; text-transform: uppercase;
letter-spacing: 0.05em; color: var(--lantern-fg-subtle); padding: 0 0.5rem; margin-bottom: 0.25rem;
white-space: nowrap; }
.lui-nav-item { display: flex; align-items: center; gap: 0.6rem; padding: 0.4rem 0.5rem;
border-radius: var(--lantern-radius-sm); font-size: 0.8125rem; font-weight: 500; line-height: 1.3;
color: var(--lantern-fg-muted); text-decoration: none; white-space: nowrap; cursor: pointer;
background: none; border: none; width: 100%; text-align: left; box-sizing: border-box; }
.lui-nav-item:hover { color: var(--lantern-fg); background: var(--lantern-surface-sunken); }
.lui-nav-item-active { color: var(--lantern-accent); font-weight: 600;
background: var(--lantern-accent-soft); }
.lui-nav-item-active:hover { color: var(--lantern-accent); background: var(--lantern-accent-soft); }
.lui-nav-item-icon { font-size: 1.05rem; flex-shrink: 0; }
.lui-nav-item-label { overflow: hidden; text-overflow: ellipsis; }
/* Collapsed rail: hide text, center the icons. */
.lui-shell[data-collapsed] .lui-nav-item-label,
.lui-shell[data-collapsed] .lui-nav-group-label,
.lui-shell[data-collapsed] .lui-brand-name { display: none; }
.lui-shell[data-collapsed] .lui-nav-item { justify-content: center; padding-inline: 0; }
.lui-shell[data-collapsed] .lui-sidebar-header { justify-content: center; padding-inline: 0; }
.lui-shell[data-collapsed] .lui-nav-group { margin-bottom: 0.5rem; }
.lui-shell-main { display: flex; flex-direction: column; min-width: 0; }
.lui-topbar { position: sticky; top: 0; z-index: 20; display: flex; align-items: center; gap: 0.75rem;
height: 3.25rem; padding: 0 1.25rem; background: var(--lantern-surface);
border-bottom: 1px solid var(--lantern-border); }
.lui-shell-content { flex: 1; min-width: 0; padding: 1.5rem 1.25rem 4rem; }
.lui-sidebar-toggle { display: inline-flex; align-items: center; justify-content: center;
width: 2rem; height: 2rem; border: none; background: none; color: var(--lantern-fg-muted);
border-radius: var(--lantern-radius-sm); cursor: pointer; flex-shrink: 0; }
.lui-sidebar-toggle:hover { color: var(--lantern-fg); background: var(--lantern-surface-sunken); }
.lui-sidebar-toggle-icon { font-size: 1.15rem; }
/* Narrow viewports: sidebar drops to a horizontal strip above the content. */
@media (max-width: 768px) {
.lui-shell, .lui-shell[data-collapsed] { grid-template-columns: 1fr; }
.lui-sidebar { position: static; height: auto; flex-direction: row; align-items: center;
overflow-x: auto; overflow-y: hidden; border-right: none;
border-bottom: 1px solid var(--lantern-border); }
.lui-sidebar-header { border-bottom: none; border-right: 1px solid var(--lantern-border); height: auto;
padding: 0.75rem 0.9rem; }
.lui-sidebar-nav { display: flex; gap: 0.5rem; padding: 0.5rem 0.6rem; }
.lui-nav-group { display: flex; gap: 0.15rem; margin-bottom: 0; flex-shrink: 0; }
.lui-nav-group-label { display: none; }
.lui-sidebar-toggle { display: none; }
}