@misael703/ui 1.26.0 → 1.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-SHS4QYYN.mjs → chunk-ER2Z5JEO.mjs} +6 -5
- package/dist/chunk-ER2Z5JEO.mjs.map +1 -0
- package/dist/{chunk-6BRRRENF.js → chunk-MSP4BOPZ.js} +6 -5
- package/dist/chunk-MSP4BOPZ.js.map +1 -0
- package/dist/components/AppShell.d.mts +9 -1
- package/dist/components/AppShell.d.ts +9 -1
- package/dist/components/AppShell.js +3 -3
- package/dist/components/AppShell.mjs +1 -1
- package/dist/index.js +3 -3
- package/dist/index.mjs +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/dist/chunk-6BRRRENF.js.map +0 -1
- package/dist/chunk-SHS4QYYN.mjs.map +0 -1
|
@@ -38,7 +38,7 @@ var NavItemNode = React.memo(function NavItemNode2({
|
|
|
38
38
|
});
|
|
39
39
|
function AppShell(props) {
|
|
40
40
|
const {
|
|
41
|
-
sections,
|
|
41
|
+
sections = [],
|
|
42
42
|
footer,
|
|
43
43
|
defaultCollapsed = false,
|
|
44
44
|
collapsed: ctrlCollapsed,
|
|
@@ -78,14 +78,15 @@ function AppShell(props) {
|
|
|
78
78
|
const collapsedRail = props.collapsedRail ?? false;
|
|
79
79
|
const headerApi = { collapsed, toggle: () => setCollapsed(!collapsed), setCollapsed };
|
|
80
80
|
const slot = (s) => typeof s === "function" ? s(headerApi) : s;
|
|
81
|
-
|
|
81
|
+
const hasSidebar = sections.length > 0;
|
|
82
|
+
return /* @__PURE__ */ jsxs("div", { className: cx("appshell", `appshell--${theme}`, "appshell--header-top", `appshell--header-${headerTheme}`, collapsedRail && "appshell--rail", !hasSidebar && "appshell--no-nav", collapsed && "is-collapsed", className), children: [
|
|
82
83
|
/* @__PURE__ */ jsxs("header", { className: "appshell__header", role: "banner", "data-tone": headerTheme === "brand" ? "inverse" : void 0, children: [
|
|
83
84
|
/* @__PURE__ */ jsx("div", { className: "appshell__header-left", children: slot(header?.left) }),
|
|
84
85
|
/* @__PURE__ */ jsx("div", { className: "appshell__header-center", children: slot(header?.center) }),
|
|
85
86
|
/* @__PURE__ */ jsx("div", { className: "appshell__header-right", children: slot(header?.right) })
|
|
86
87
|
] }),
|
|
87
88
|
/* @__PURE__ */ jsxs("div", { className: "appshell__body", children: [
|
|
88
|
-
/* @__PURE__ */ jsxs("aside", { className: "appshell__sidebar", "aria-label": t["appshell.mainNav"], children: [
|
|
89
|
+
hasSidebar && /* @__PURE__ */ jsxs("aside", { className: "appshell__sidebar", "aria-label": t["appshell.mainNav"], children: [
|
|
89
90
|
/* @__PURE__ */ jsx("nav", { className: "appshell__nav", children: sections.map((s, i) => /* @__PURE__ */ jsxs("div", { className: "appshell__navsection", children: [
|
|
90
91
|
s.label && /* @__PURE__ */ jsx("div", { className: "appshell__navlabel-section", children: s.label }),
|
|
91
92
|
/* @__PURE__ */ jsx("ul", { children: s.items.map((it) => /* @__PURE__ */ jsx(NavItemNode, { item: it, depth: 0, linkAs, onCloseMobile: closeMobile }, it.id)) })
|
|
@@ -160,5 +161,5 @@ function PageHeader({ title, description, breadcrumbs, actions, meta, className
|
|
|
160
161
|
}
|
|
161
162
|
|
|
162
163
|
export { AppShell, PageHeader };
|
|
163
|
-
//# sourceMappingURL=chunk-
|
|
164
|
-
//# sourceMappingURL=chunk-
|
|
164
|
+
//# sourceMappingURL=chunk-ER2Z5JEO.mjs.map
|
|
165
|
+
//# sourceMappingURL=chunk-ER2Z5JEO.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/AppShell.tsx"],"names":["NavItemNode"],"mappings":"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","file":"chunk-ER2Z5JEO.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { ChevronLeft, ChevronRight, MenuIcon } from './Icons';\nimport { useLocale } from '../locale/LocaleProvider';\n\n// ---------- AppShell (Sidebar + Topbar + Content) -----------------------\n// Designed to drop into a Next.js app/layout.tsx as a Client Component shell.\n\nexport interface NavItem {\n id: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n href?: string;\n active?: boolean;\n badge?: React.ReactNode;\n onSelect?: () => void;\n children?: NavItem[];\n}\n\nexport interface NavSection {\n id?: string;\n label?: React.ReactNode;\n items: NavItem[];\n}\n\nexport type AppShellTheme = 'default' | 'brand';\n\nexport type AppShellHeaderLayout = 'side' | 'top';\n\n/**\n * Collapse API handed to header-slot render-props so a consumer-placed control\n * (e.g. a hamburger in `left`) can drive the sidebar — crucially in\n * **uncontrolled** mode, where the `top` layout otherwise has no toggle\n * affordance. This is what lets `persistKey` (uncontrolled) coexist with a\n * custom header trigger: the kit owns the state + persistence, the consumer\n * owns the trigger's look and placement.\n */\nexport interface AppShellHeaderApi {\n /** Current collapsed state. */\n collapsed: boolean;\n /** Flip the collapsed state (persisted if `persistKey` is set). */\n toggle: () => void;\n /** Set the collapsed state explicitly. */\n setCollapsed: (collapsed: boolean) => void;\n}\n\n/**\n * A header slot: a static node, or a render-prop receiving {@link AppShellHeaderApi}.\n * The function form is the only way to toggle an uncontrolled shell from the\n * header (no built-in toggle exists in `top`).\n */\nexport type AppShellHeaderSlot =\n | React.ReactNode\n | ((api: AppShellHeaderApi) => React.ReactNode);\n\nexport interface AppShellHeader {\n /** Left slot — typically a menu/hamburger trigger or back action. */\n left?: AppShellHeaderSlot;\n /** Center slot — typically the brand (Logo). Lands at the true viewport centre. */\n center?: AppShellHeaderSlot;\n /** Right slot — notifications, user avatar, utilities. */\n right?: AppShellHeaderSlot;\n}\n\n/**\n * Props shared by both layouts. The layout-specific props live in\n * `AppShellSideProps` / `AppShellTopProps`; `AppShellProps` is the\n * discriminated union of the two, keyed on `headerLayout`.\n */\nexport interface AppShellBaseProps {\n /**\n * Navigation sections that populate the sidebar. Omit (or pass an empty\n * array) in `headerLayout=\"top\"` to render a **top-bar-only** shell — no\n * sidebar at all, body collapses to a single column. Use when the app is\n * flat-route (no panel nav), e.g. a kiosk/cobros-mesón style layout.\n * Required (effectively) in `headerLayout=\"side\"`: that layout is the\n * sidebar; omitting sections renders an empty rail.\n */\n sections?: NavSection[];\n footer?: React.ReactNode;\n defaultCollapsed?: boolean;\n collapsed?: boolean;\n onCollapsedChange?: (c: boolean) => void;\n /**\n * Persist the collapsed state in `localStorage[persistKey]` so it survives\n * reloads. Opt-in: omit it and the shell keeps the default behaviour (resets\n * to `defaultCollapsed` on each mount). SSR-safe — the initial render still\n * uses `defaultCollapsed` (no hydration mismatch); the stored value is read\n * after mount, so a differing value may flash for one frame. Ignored in\n * controlled mode (when `collapsed` is provided): the host owns persistence.\n */\n persistKey?: string;\n children: React.ReactNode;\n className?: string;\n /**\n * Color theme (applies to both layouts):\n * - `default` (light): claro, mejor para apps data-heavy de uso prolongado.\n * - `brand`: superficie azul de marca con texto blanco. Mayor brand recall.\n * En `side` tiñe el sidebar; en `top` tiñe header + sidebar (un solo knob).\n */\n theme?: AppShellTheme;\n /** Render-prop for navigation links so the host app can use Next.js Link, etc. */\n linkAs?: (item: NavItem, content: React.ReactNode, className: string) => React.ReactNode;\n}\n\n/**\n * Sidebar layout (default, `headerLayout=\"side\"` or omitted). The brand\n * block + collapse rail live in the sidebar; the topbar sits over the\n * content with a mobile hamburger. `header` is **not** valid here — that\n * slot belongs to the `top` layout.\n */\nexport interface AppShellSideProps extends AppShellBaseProps {\n headerLayout?: 'side';\n /** Brand node in the sidebar header (expanded state). */\n brand?: React.ReactNode;\n /** Brand node shown when the rail is collapsed. Falls back to `brand`. */\n brandCollapsed?: React.ReactNode;\n /** Content of the topbar over the page (search, etc.). */\n topbar?: React.ReactNode;\n /** User slot at the right of the topbar (avatar/menu). */\n user?: React.ReactNode;\n /** Not valid in the `side` layout — the header slots belong to `top`. */\n header?: never;\n}\n\n/**\n * Top-header layout (`headerLayout=\"top\"`, v1.15.0). Full-width header\n * above the body with three slots (`header.{left,center,right}`); the\n * centre slot lands at the **true viewport centre** (1fr·auto·1fr grid).\n * The sidebar has no brand block and `collapsed` hides it entirely (no\n * 72px rail); the header is **invariant** to the collapse. `theme=\"brand\"`\n * tints both bands. The `side`-only props are **not** valid here — put your\n * chrome in `header`.\n */\nexport interface AppShellTopProps extends AppShellBaseProps {\n headerLayout: 'top';\n /** Slots for the full-width header. Brand usually goes in `center`. */\n header?: AppShellHeader;\n /**\n * Theme of the **header band only**, independent of the sidebar (`theme`).\n * Defaults to `theme`, so `theme=\"brand\"` still tints both bands (no\n * change for existing consumers). Set `theme=\"default\" headerTheme=\"brand\"`\n * for a branded top bar over a neutral, legible sidebar — common in\n * data-heavy admin apps.\n */\n headerTheme?: AppShellTheme;\n /**\n * Collapse to an icon rail (72px) instead of hiding the sidebar entirely.\n * Default `false` → `collapsed` hides the sidebar (the original `top`\n * behavior). `true` → `collapsed` keeps a 72px rail showing the nav icons\n * (labels hidden, active-item bar kept) — like the `side` layout — and\n * renders a built-in expand/collapse toggle at the bottom of the rail.\n */\n collapsedRail?: boolean;\n /** Not valid in `top` — use `header.center` for the brand. */\n brand?: never;\n /** Not valid in `top` — the sidebar collapses entirely. */\n brandCollapsed?: never;\n /** Not valid in `top` — use the `header` slots. */\n topbar?: never;\n /** Not valid in `top` — use `header.right`. */\n user?: never;\n}\n\n/**\n * Discriminated union keyed on `headerLayout`. TypeScript enforces that\n * `header` is only accepted with `headerLayout=\"top\"` and that\n * `brand`/`brandCollapsed`/`topbar`/`user` are only accepted with the\n * (default) `side` layout — passing the wrong prop for the layout is a\n * compile error instead of being silently ignored at runtime.\n */\nexport type AppShellProps = AppShellSideProps | AppShellTopProps;\n\n// Recursive nav item, memoized so a single item's parent re-render doesn't\n// churn through every other item in the tree. Stability of `linkAs` and\n// `onCloseMobile` is the parent's responsibility (we stabilize\n// `onCloseMobile` via useCallback below; consumers should memoize `linkAs`\n// if they care about avoiding renders, but for typical Next.js Link usage\n// the inline arrow is rarely a hot path).\ninterface NavItemNodeProps {\n item: NavItem;\n depth: number;\n linkAs?: AppShellBaseProps['linkAs'];\n onCloseMobile: () => void;\n}\n\nconst NavItemNode = React.memo(function NavItemNode({\n item, depth, linkAs, onCloseMobile,\n}: NavItemNodeProps) {\n const klass = cx('appshell__navitem', item.active && 'is-active', `appshell__navitem--depth-${depth}`);\n const inner = (\n <>\n {item.icon && <span className=\"appshell__navicon\" aria-hidden=\"true\">{item.icon}</span>}\n <span className=\"appshell__navlabel\">{item.label}</span>\n {item.badge && <span className=\"appshell__navbadge\">{item.badge}</span>}\n </>\n );\n const node = item.href && linkAs\n ? linkAs(item, inner, klass)\n : (\n <a\n href={item.href ?? '#'}\n className={klass}\n aria-current={item.active ? 'page' : undefined}\n onClick={(e) => {\n if (!item.href) e.preventDefault();\n item.onSelect?.();\n onCloseMobile();\n }}\n >\n {inner}\n </a>\n );\n return (\n <li>\n {node}\n {item.children && item.children.length > 0 && (\n <ul className=\"appshell__navchildren\">\n {item.children.map((c) => (\n <NavItemNode key={c.id} item={c} depth={depth + 1} linkAs={linkAs} onCloseMobile={onCloseMobile} />\n ))}\n </ul>\n )}\n </li>\n );\n});\n\nexport function AppShell(props: AppShellProps) {\n const {\n sections = [], footer, defaultCollapsed = false,\n collapsed: ctrlCollapsed, onCollapsedChange, persistKey,\n children, className, theme = 'default', linkAs,\n } = props;\n const [internalCollapsed, setInternalCollapsed] = React.useState(defaultCollapsed);\n const [mobileOpen, setMobileOpen] = React.useState(false);\n const t = useLocale();\n const collapsed = ctrlCollapsed ?? internalCollapsed;\n\n // SSR-safe persistence: the initial render uses `defaultCollapsed` (server\n // and first client render agree → no hydration mismatch), then we sync from\n // localStorage after mount. Only in uncontrolled mode; reads can throw\n // (Safari private mode), so they're guarded. Runs once per persistKey.\n React.useEffect(() => {\n if (persistKey == null || ctrlCollapsed !== undefined) return;\n try {\n const stored = window.localStorage.getItem(persistKey);\n if (stored === '0' || stored === '1') setInternalCollapsed(stored === '1');\n } catch {\n /* localStorage unavailable — keep defaultCollapsed */\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- sync once at mount; ctrlCollapsed read intentionally not tracked\n }, [persistKey]);\n\n const setCollapsed = (v: boolean) => {\n if (ctrlCollapsed === undefined) setInternalCollapsed(v);\n if (persistKey != null && ctrlCollapsed === undefined) {\n try {\n window.localStorage.setItem(persistKey, v ? '1' : '0');\n } catch {\n /* localStorage unavailable — persistence is best-effort */\n }\n }\n onCollapsedChange?.(v);\n };\n const closeMobile = React.useCallback(() => setMobileOpen(false), []);\n\n // Top-header variant: full-width header above the body. Topbar is\n // invariant to `collapsed` (only the inner body's columns animate); brand\n // lives in `header.center` at the true viewport centre. Default\n // `headerLayout=\"side\"` falls through to the legacy JSX below\n // (byte-identical for existing consumers). The `props.headerLayout`\n // check narrows the discriminated union, so `header` (top) and\n // `brand`/`topbar`/`user` (side) are each only in scope in their branch.\n if (props.headerLayout === 'top') {\n const { header } = props;\n // Header band themes independently of the sidebar; defaults to `theme`\n // so `theme=\"brand\"` keeps tinting both bands (back-compat).\n const headerTheme = props.headerTheme ?? theme;\n const collapsedRail = props.collapsedRail ?? false;\n // Hand the collapse API to header slots so a consumer trigger (hamburger)\n // can toggle the shell — the only path in uncontrolled `top` (no built-in\n // toggle here). A function slot is called with the API; a node renders as-is.\n const headerApi: AppShellHeaderApi = { collapsed, toggle: () => setCollapsed(!collapsed), setCollapsed };\n const slot = (s: AppShellHeaderSlot): React.ReactNode =>\n typeof s === 'function' ? (s as (api: AppShellHeaderApi) => React.ReactNode)(headerApi) : s;\n // Top-bar-only mode (v1.27.0): with no `sections` the shell is just a\n // header band over a single-column content area — no sidebar. For\n // flat-route apps (kiosk, checkout, single-flow tools) that don't need\n // panel navigation. Stays inside `AppShell` (no new component) so the\n // already-shipped `top` header band is reused as-is.\n const hasSidebar = sections.length > 0;\n return (\n <div className={cx('appshell', `appshell--${theme}`, 'appshell--header-top', `appshell--header-${headerTheme}`, collapsedRail && 'appshell--rail', !hasSidebar && 'appshell--no-nav', collapsed && 'is-collapsed', className)}>\n {/* On a brand header the band is dark, so re-scope foreground tokens\n via data-tone=\"inverse\" — anything inside (Avatar, badges, links)\n becomes band-aware automatically without per-call-site colors. */}\n <header className=\"appshell__header\" role=\"banner\" data-tone={headerTheme === 'brand' ? 'inverse' : undefined}>\n <div className=\"appshell__header-left\">{slot(header?.left)}</div>\n <div className=\"appshell__header-center\">{slot(header?.center)}</div>\n <div className=\"appshell__header-right\">{slot(header?.right)}</div>\n </header>\n <div className=\"appshell__body\">\n {hasSidebar && (\n <aside className=\"appshell__sidebar\" aria-label={t['appshell.mainNav']}>\n <nav className=\"appshell__nav\">\n {sections.map((s, i) => (\n <div key={s.id ?? i} className=\"appshell__navsection\">\n {s.label && <div className=\"appshell__navlabel-section\">{s.label}</div>}\n <ul>{s.items.map((it) => (\n <NavItemNode key={it.id} item={it} depth={0} linkAs={linkAs} onCloseMobile={closeMobile} />\n ))}</ul>\n </div>\n ))}\n </nav>\n {footer != null && (\n <div className=\"appshell__sidebar-foot\">{footer}</div>\n )}\n </aside>\n )}\n <main className=\"appshell__content\" role=\"main\">{children}</main>\n </div>\n </div>\n );\n }\n\n const { brand, brandCollapsed, topbar, user } = props;\n return (\n <div className={cx('appshell', `appshell--${theme}`, collapsed && 'is-collapsed', mobileOpen && 'is-mobile-open', className)}>\n <aside className=\"appshell__sidebar\" aria-label={t['appshell.mainNav']}>\n <div className=\"appshell__brand\">\n {collapsed ? (brandCollapsed ?? brand) : brand}\n </div>\n <nav className=\"appshell__nav\">\n {sections.map((s, i) => (\n <div key={s.id ?? i} className=\"appshell__navsection\">\n {s.label && <div className=\"appshell__navlabel-section\">{s.label}</div>}\n <ul>{s.items.map((it) => (\n <NavItemNode key={it.id} item={it} depth={0} linkAs={linkAs} onCloseMobile={closeMobile} />\n ))}</ul>\n </div>\n ))}\n </nav>\n <div className=\"appshell__sidebar-foot\">\n {footer}\n <button\n type=\"button\"\n className=\"appshell__collapse\"\n onClick={() => setCollapsed(!collapsed)}\n aria-expanded={!collapsed}\n aria-label={collapsed ? t['appshell.expandMenu'] : t['appshell.collapseMenu']}\n title={collapsed ? t['appshell.expand'] : t['appshell.collapse']}\n >\n {collapsed ? <ChevronRight size={14} /> : <ChevronLeft size={14} />}\n </button>\n </div>\n </aside>\n\n <div className=\"appshell__main\">\n <header className=\"appshell__topbar\">\n <button\n type=\"button\"\n className=\"appshell__hamburger\"\n aria-label={t['appshell.openMenu']}\n aria-expanded={mobileOpen}\n onClick={() => setMobileOpen((o) => !o)}\n ><MenuIcon size={20} /></button>\n <div className=\"appshell__topbar-content\">{topbar}</div>\n {user && <div className=\"appshell__topbar-user\">{user}</div>}\n </header>\n <main className=\"appshell__content\" role=\"main\">{children}</main>\n </div>\n\n {mobileOpen && (\n <div className=\"appshell__scrim\" onClick={() => setMobileOpen(false)} aria-hidden=\"true\" />\n )}\n </div>\n );\n}\n\n// ---------- PageHeader --------------------------------------------------\nexport interface PageHeaderProps {\n title: React.ReactNode;\n description?: React.ReactNode;\n breadcrumbs?: Array<{ label: React.ReactNode; href?: string }>;\n actions?: React.ReactNode;\n meta?: React.ReactNode;\n className?: string;\n}\n\nexport function PageHeader({ title, description, breadcrumbs, actions, meta, className }: PageHeaderProps) {\n const t = useLocale();\n return (\n <div className={cx('page-header', className)}>\n {breadcrumbs && breadcrumbs.length > 0 && (\n <nav className=\"page-header__crumbs\" aria-label={t['appshell.breadcrumb']}>\n <ol>\n {breadcrumbs.map((c, i) => (\n <li key={i}>\n {c.href ? <a href={c.href}>{c.label}</a> : <span aria-current=\"page\">{c.label}</span>}\n {i < breadcrumbs.length - 1 && <span className=\"page-header__crumb-sep\" aria-hidden=\"true\">/</span>}\n </li>\n ))}\n </ol>\n </nav>\n )}\n <div className=\"page-header__row\">\n <div className=\"page-header__title-wrap\">\n <h1 className=\"page-header__title\">{title}</h1>\n {description && <p className=\"page-header__desc\">{description}</p>}\n </div>\n {actions && <div className=\"page-header__actions\">{actions}</div>}\n </div>\n {meta && <div className=\"page-header__meta\">{meta}</div>}\n </div>\n );\n}\n"]}
|
|
@@ -60,7 +60,7 @@ var NavItemNode = React__namespace.memo(function NavItemNode2({
|
|
|
60
60
|
});
|
|
61
61
|
function AppShell(props) {
|
|
62
62
|
const {
|
|
63
|
-
sections,
|
|
63
|
+
sections = [],
|
|
64
64
|
footer,
|
|
65
65
|
defaultCollapsed = false,
|
|
66
66
|
collapsed: ctrlCollapsed,
|
|
@@ -100,14 +100,15 @@ function AppShell(props) {
|
|
|
100
100
|
const collapsedRail = props.collapsedRail ?? false;
|
|
101
101
|
const headerApi = { collapsed, toggle: () => setCollapsed(!collapsed), setCollapsed };
|
|
102
102
|
const slot = (s) => typeof s === "function" ? s(headerApi) : s;
|
|
103
|
-
|
|
103
|
+
const hasSidebar = sections.length > 0;
|
|
104
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunkPASF6T4H_js.cx("appshell", `appshell--${theme}`, "appshell--header-top", `appshell--header-${headerTheme}`, collapsedRail && "appshell--rail", !hasSidebar && "appshell--no-nav", collapsed && "is-collapsed", className), children: [
|
|
104
105
|
/* @__PURE__ */ jsxRuntime.jsxs("header", { className: "appshell__header", role: "banner", "data-tone": headerTheme === "brand" ? "inverse" : void 0, children: [
|
|
105
106
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "appshell__header-left", children: slot(header?.left) }),
|
|
106
107
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "appshell__header-center", children: slot(header?.center) }),
|
|
107
108
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "appshell__header-right", children: slot(header?.right) })
|
|
108
109
|
] }),
|
|
109
110
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "appshell__body", children: [
|
|
110
|
-
/* @__PURE__ */ jsxRuntime.jsxs("aside", { className: "appshell__sidebar", "aria-label": t["appshell.mainNav"], children: [
|
|
111
|
+
hasSidebar && /* @__PURE__ */ jsxRuntime.jsxs("aside", { className: "appshell__sidebar", "aria-label": t["appshell.mainNav"], children: [
|
|
111
112
|
/* @__PURE__ */ jsxRuntime.jsx("nav", { className: "appshell__nav", children: sections.map((s, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "appshell__navsection", children: [
|
|
112
113
|
s.label && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "appshell__navlabel-section", children: s.label }),
|
|
113
114
|
/* @__PURE__ */ jsxRuntime.jsx("ul", { children: s.items.map((it) => /* @__PURE__ */ jsxRuntime.jsx(NavItemNode, { item: it, depth: 0, linkAs, onCloseMobile: closeMobile }, it.id)) })
|
|
@@ -183,5 +184,5 @@ function PageHeader({ title, description, breadcrumbs, actions, meta, className
|
|
|
183
184
|
|
|
184
185
|
exports.AppShell = AppShell;
|
|
185
186
|
exports.PageHeader = PageHeader;
|
|
186
|
-
//# sourceMappingURL=chunk-
|
|
187
|
-
//# sourceMappingURL=chunk-
|
|
187
|
+
//# sourceMappingURL=chunk-MSP4BOPZ.js.map
|
|
188
|
+
//# sourceMappingURL=chunk-MSP4BOPZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/AppShell.tsx"],"names":["React","NavItemNode","cx","jsxs","Fragment","jsx","useLocale","ChevronRight","ChevronLeft","MenuIcon"],"mappings":"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","file":"chunk-MSP4BOPZ.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { ChevronLeft, ChevronRight, MenuIcon } from './Icons';\nimport { useLocale } from '../locale/LocaleProvider';\n\n// ---------- AppShell (Sidebar + Topbar + Content) -----------------------\n// Designed to drop into a Next.js app/layout.tsx as a Client Component shell.\n\nexport interface NavItem {\n id: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n href?: string;\n active?: boolean;\n badge?: React.ReactNode;\n onSelect?: () => void;\n children?: NavItem[];\n}\n\nexport interface NavSection {\n id?: string;\n label?: React.ReactNode;\n items: NavItem[];\n}\n\nexport type AppShellTheme = 'default' | 'brand';\n\nexport type AppShellHeaderLayout = 'side' | 'top';\n\n/**\n * Collapse API handed to header-slot render-props so a consumer-placed control\n * (e.g. a hamburger in `left`) can drive the sidebar — crucially in\n * **uncontrolled** mode, where the `top` layout otherwise has no toggle\n * affordance. This is what lets `persistKey` (uncontrolled) coexist with a\n * custom header trigger: the kit owns the state + persistence, the consumer\n * owns the trigger's look and placement.\n */\nexport interface AppShellHeaderApi {\n /** Current collapsed state. */\n collapsed: boolean;\n /** Flip the collapsed state (persisted if `persistKey` is set). */\n toggle: () => void;\n /** Set the collapsed state explicitly. */\n setCollapsed: (collapsed: boolean) => void;\n}\n\n/**\n * A header slot: a static node, or a render-prop receiving {@link AppShellHeaderApi}.\n * The function form is the only way to toggle an uncontrolled shell from the\n * header (no built-in toggle exists in `top`).\n */\nexport type AppShellHeaderSlot =\n | React.ReactNode\n | ((api: AppShellHeaderApi) => React.ReactNode);\n\nexport interface AppShellHeader {\n /** Left slot — typically a menu/hamburger trigger or back action. */\n left?: AppShellHeaderSlot;\n /** Center slot — typically the brand (Logo). Lands at the true viewport centre. */\n center?: AppShellHeaderSlot;\n /** Right slot — notifications, user avatar, utilities. */\n right?: AppShellHeaderSlot;\n}\n\n/**\n * Props shared by both layouts. The layout-specific props live in\n * `AppShellSideProps` / `AppShellTopProps`; `AppShellProps` is the\n * discriminated union of the two, keyed on `headerLayout`.\n */\nexport interface AppShellBaseProps {\n /**\n * Navigation sections that populate the sidebar. Omit (or pass an empty\n * array) in `headerLayout=\"top\"` to render a **top-bar-only** shell — no\n * sidebar at all, body collapses to a single column. Use when the app is\n * flat-route (no panel nav), e.g. a kiosk/cobros-mesón style layout.\n * Required (effectively) in `headerLayout=\"side\"`: that layout is the\n * sidebar; omitting sections renders an empty rail.\n */\n sections?: NavSection[];\n footer?: React.ReactNode;\n defaultCollapsed?: boolean;\n collapsed?: boolean;\n onCollapsedChange?: (c: boolean) => void;\n /**\n * Persist the collapsed state in `localStorage[persistKey]` so it survives\n * reloads. Opt-in: omit it and the shell keeps the default behaviour (resets\n * to `defaultCollapsed` on each mount). SSR-safe — the initial render still\n * uses `defaultCollapsed` (no hydration mismatch); the stored value is read\n * after mount, so a differing value may flash for one frame. Ignored in\n * controlled mode (when `collapsed` is provided): the host owns persistence.\n */\n persistKey?: string;\n children: React.ReactNode;\n className?: string;\n /**\n * Color theme (applies to both layouts):\n * - `default` (light): claro, mejor para apps data-heavy de uso prolongado.\n * - `brand`: superficie azul de marca con texto blanco. Mayor brand recall.\n * En `side` tiñe el sidebar; en `top` tiñe header + sidebar (un solo knob).\n */\n theme?: AppShellTheme;\n /** Render-prop for navigation links so the host app can use Next.js Link, etc. */\n linkAs?: (item: NavItem, content: React.ReactNode, className: string) => React.ReactNode;\n}\n\n/**\n * Sidebar layout (default, `headerLayout=\"side\"` or omitted). The brand\n * block + collapse rail live in the sidebar; the topbar sits over the\n * content with a mobile hamburger. `header` is **not** valid here — that\n * slot belongs to the `top` layout.\n */\nexport interface AppShellSideProps extends AppShellBaseProps {\n headerLayout?: 'side';\n /** Brand node in the sidebar header (expanded state). */\n brand?: React.ReactNode;\n /** Brand node shown when the rail is collapsed. Falls back to `brand`. */\n brandCollapsed?: React.ReactNode;\n /** Content of the topbar over the page (search, etc.). */\n topbar?: React.ReactNode;\n /** User slot at the right of the topbar (avatar/menu). */\n user?: React.ReactNode;\n /** Not valid in the `side` layout — the header slots belong to `top`. */\n header?: never;\n}\n\n/**\n * Top-header layout (`headerLayout=\"top\"`, v1.15.0). Full-width header\n * above the body with three slots (`header.{left,center,right}`); the\n * centre slot lands at the **true viewport centre** (1fr·auto·1fr grid).\n * The sidebar has no brand block and `collapsed` hides it entirely (no\n * 72px rail); the header is **invariant** to the collapse. `theme=\"brand\"`\n * tints both bands. The `side`-only props are **not** valid here — put your\n * chrome in `header`.\n */\nexport interface AppShellTopProps extends AppShellBaseProps {\n headerLayout: 'top';\n /** Slots for the full-width header. Brand usually goes in `center`. */\n header?: AppShellHeader;\n /**\n * Theme of the **header band only**, independent of the sidebar (`theme`).\n * Defaults to `theme`, so `theme=\"brand\"` still tints both bands (no\n * change for existing consumers). Set `theme=\"default\" headerTheme=\"brand\"`\n * for a branded top bar over a neutral, legible sidebar — common in\n * data-heavy admin apps.\n */\n headerTheme?: AppShellTheme;\n /**\n * Collapse to an icon rail (72px) instead of hiding the sidebar entirely.\n * Default `false` → `collapsed` hides the sidebar (the original `top`\n * behavior). `true` → `collapsed` keeps a 72px rail showing the nav icons\n * (labels hidden, active-item bar kept) — like the `side` layout — and\n * renders a built-in expand/collapse toggle at the bottom of the rail.\n */\n collapsedRail?: boolean;\n /** Not valid in `top` — use `header.center` for the brand. */\n brand?: never;\n /** Not valid in `top` — the sidebar collapses entirely. */\n brandCollapsed?: never;\n /** Not valid in `top` — use the `header` slots. */\n topbar?: never;\n /** Not valid in `top` — use `header.right`. */\n user?: never;\n}\n\n/**\n * Discriminated union keyed on `headerLayout`. TypeScript enforces that\n * `header` is only accepted with `headerLayout=\"top\"` and that\n * `brand`/`brandCollapsed`/`topbar`/`user` are only accepted with the\n * (default) `side` layout — passing the wrong prop for the layout is a\n * compile error instead of being silently ignored at runtime.\n */\nexport type AppShellProps = AppShellSideProps | AppShellTopProps;\n\n// Recursive nav item, memoized so a single item's parent re-render doesn't\n// churn through every other item in the tree. Stability of `linkAs` and\n// `onCloseMobile` is the parent's responsibility (we stabilize\n// `onCloseMobile` via useCallback below; consumers should memoize `linkAs`\n// if they care about avoiding renders, but for typical Next.js Link usage\n// the inline arrow is rarely a hot path).\ninterface NavItemNodeProps {\n item: NavItem;\n depth: number;\n linkAs?: AppShellBaseProps['linkAs'];\n onCloseMobile: () => void;\n}\n\nconst NavItemNode = React.memo(function NavItemNode({\n item, depth, linkAs, onCloseMobile,\n}: NavItemNodeProps) {\n const klass = cx('appshell__navitem', item.active && 'is-active', `appshell__navitem--depth-${depth}`);\n const inner = (\n <>\n {item.icon && <span className=\"appshell__navicon\" aria-hidden=\"true\">{item.icon}</span>}\n <span className=\"appshell__navlabel\">{item.label}</span>\n {item.badge && <span className=\"appshell__navbadge\">{item.badge}</span>}\n </>\n );\n const node = item.href && linkAs\n ? linkAs(item, inner, klass)\n : (\n <a\n href={item.href ?? '#'}\n className={klass}\n aria-current={item.active ? 'page' : undefined}\n onClick={(e) => {\n if (!item.href) e.preventDefault();\n item.onSelect?.();\n onCloseMobile();\n }}\n >\n {inner}\n </a>\n );\n return (\n <li>\n {node}\n {item.children && item.children.length > 0 && (\n <ul className=\"appshell__navchildren\">\n {item.children.map((c) => (\n <NavItemNode key={c.id} item={c} depth={depth + 1} linkAs={linkAs} onCloseMobile={onCloseMobile} />\n ))}\n </ul>\n )}\n </li>\n );\n});\n\nexport function AppShell(props: AppShellProps) {\n const {\n sections = [], footer, defaultCollapsed = false,\n collapsed: ctrlCollapsed, onCollapsedChange, persistKey,\n children, className, theme = 'default', linkAs,\n } = props;\n const [internalCollapsed, setInternalCollapsed] = React.useState(defaultCollapsed);\n const [mobileOpen, setMobileOpen] = React.useState(false);\n const t = useLocale();\n const collapsed = ctrlCollapsed ?? internalCollapsed;\n\n // SSR-safe persistence: the initial render uses `defaultCollapsed` (server\n // and first client render agree → no hydration mismatch), then we sync from\n // localStorage after mount. Only in uncontrolled mode; reads can throw\n // (Safari private mode), so they're guarded. Runs once per persistKey.\n React.useEffect(() => {\n if (persistKey == null || ctrlCollapsed !== undefined) return;\n try {\n const stored = window.localStorage.getItem(persistKey);\n if (stored === '0' || stored === '1') setInternalCollapsed(stored === '1');\n } catch {\n /* localStorage unavailable — keep defaultCollapsed */\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- sync once at mount; ctrlCollapsed read intentionally not tracked\n }, [persistKey]);\n\n const setCollapsed = (v: boolean) => {\n if (ctrlCollapsed === undefined) setInternalCollapsed(v);\n if (persistKey != null && ctrlCollapsed === undefined) {\n try {\n window.localStorage.setItem(persistKey, v ? '1' : '0');\n } catch {\n /* localStorage unavailable — persistence is best-effort */\n }\n }\n onCollapsedChange?.(v);\n };\n const closeMobile = React.useCallback(() => setMobileOpen(false), []);\n\n // Top-header variant: full-width header above the body. Topbar is\n // invariant to `collapsed` (only the inner body's columns animate); brand\n // lives in `header.center` at the true viewport centre. Default\n // `headerLayout=\"side\"` falls through to the legacy JSX below\n // (byte-identical for existing consumers). The `props.headerLayout`\n // check narrows the discriminated union, so `header` (top) and\n // `brand`/`topbar`/`user` (side) are each only in scope in their branch.\n if (props.headerLayout === 'top') {\n const { header } = props;\n // Header band themes independently of the sidebar; defaults to `theme`\n // so `theme=\"brand\"` keeps tinting both bands (back-compat).\n const headerTheme = props.headerTheme ?? theme;\n const collapsedRail = props.collapsedRail ?? false;\n // Hand the collapse API to header slots so a consumer trigger (hamburger)\n // can toggle the shell — the only path in uncontrolled `top` (no built-in\n // toggle here). A function slot is called with the API; a node renders as-is.\n const headerApi: AppShellHeaderApi = { collapsed, toggle: () => setCollapsed(!collapsed), setCollapsed };\n const slot = (s: AppShellHeaderSlot): React.ReactNode =>\n typeof s === 'function' ? (s as (api: AppShellHeaderApi) => React.ReactNode)(headerApi) : s;\n // Top-bar-only mode (v1.27.0): with no `sections` the shell is just a\n // header band over a single-column content area — no sidebar. For\n // flat-route apps (kiosk, checkout, single-flow tools) that don't need\n // panel navigation. Stays inside `AppShell` (no new component) so the\n // already-shipped `top` header band is reused as-is.\n const hasSidebar = sections.length > 0;\n return (\n <div className={cx('appshell', `appshell--${theme}`, 'appshell--header-top', `appshell--header-${headerTheme}`, collapsedRail && 'appshell--rail', !hasSidebar && 'appshell--no-nav', collapsed && 'is-collapsed', className)}>\n {/* On a brand header the band is dark, so re-scope foreground tokens\n via data-tone=\"inverse\" — anything inside (Avatar, badges, links)\n becomes band-aware automatically without per-call-site colors. */}\n <header className=\"appshell__header\" role=\"banner\" data-tone={headerTheme === 'brand' ? 'inverse' : undefined}>\n <div className=\"appshell__header-left\">{slot(header?.left)}</div>\n <div className=\"appshell__header-center\">{slot(header?.center)}</div>\n <div className=\"appshell__header-right\">{slot(header?.right)}</div>\n </header>\n <div className=\"appshell__body\">\n {hasSidebar && (\n <aside className=\"appshell__sidebar\" aria-label={t['appshell.mainNav']}>\n <nav className=\"appshell__nav\">\n {sections.map((s, i) => (\n <div key={s.id ?? i} className=\"appshell__navsection\">\n {s.label && <div className=\"appshell__navlabel-section\">{s.label}</div>}\n <ul>{s.items.map((it) => (\n <NavItemNode key={it.id} item={it} depth={0} linkAs={linkAs} onCloseMobile={closeMobile} />\n ))}</ul>\n </div>\n ))}\n </nav>\n {footer != null && (\n <div className=\"appshell__sidebar-foot\">{footer}</div>\n )}\n </aside>\n )}\n <main className=\"appshell__content\" role=\"main\">{children}</main>\n </div>\n </div>\n );\n }\n\n const { brand, brandCollapsed, topbar, user } = props;\n return (\n <div className={cx('appshell', `appshell--${theme}`, collapsed && 'is-collapsed', mobileOpen && 'is-mobile-open', className)}>\n <aside className=\"appshell__sidebar\" aria-label={t['appshell.mainNav']}>\n <div className=\"appshell__brand\">\n {collapsed ? (brandCollapsed ?? brand) : brand}\n </div>\n <nav className=\"appshell__nav\">\n {sections.map((s, i) => (\n <div key={s.id ?? i} className=\"appshell__navsection\">\n {s.label && <div className=\"appshell__navlabel-section\">{s.label}</div>}\n <ul>{s.items.map((it) => (\n <NavItemNode key={it.id} item={it} depth={0} linkAs={linkAs} onCloseMobile={closeMobile} />\n ))}</ul>\n </div>\n ))}\n </nav>\n <div className=\"appshell__sidebar-foot\">\n {footer}\n <button\n type=\"button\"\n className=\"appshell__collapse\"\n onClick={() => setCollapsed(!collapsed)}\n aria-expanded={!collapsed}\n aria-label={collapsed ? t['appshell.expandMenu'] : t['appshell.collapseMenu']}\n title={collapsed ? t['appshell.expand'] : t['appshell.collapse']}\n >\n {collapsed ? <ChevronRight size={14} /> : <ChevronLeft size={14} />}\n </button>\n </div>\n </aside>\n\n <div className=\"appshell__main\">\n <header className=\"appshell__topbar\">\n <button\n type=\"button\"\n className=\"appshell__hamburger\"\n aria-label={t['appshell.openMenu']}\n aria-expanded={mobileOpen}\n onClick={() => setMobileOpen((o) => !o)}\n ><MenuIcon size={20} /></button>\n <div className=\"appshell__topbar-content\">{topbar}</div>\n {user && <div className=\"appshell__topbar-user\">{user}</div>}\n </header>\n <main className=\"appshell__content\" role=\"main\">{children}</main>\n </div>\n\n {mobileOpen && (\n <div className=\"appshell__scrim\" onClick={() => setMobileOpen(false)} aria-hidden=\"true\" />\n )}\n </div>\n );\n}\n\n// ---------- PageHeader --------------------------------------------------\nexport interface PageHeaderProps {\n title: React.ReactNode;\n description?: React.ReactNode;\n breadcrumbs?: Array<{ label: React.ReactNode; href?: string }>;\n actions?: React.ReactNode;\n meta?: React.ReactNode;\n className?: string;\n}\n\nexport function PageHeader({ title, description, breadcrumbs, actions, meta, className }: PageHeaderProps) {\n const t = useLocale();\n return (\n <div className={cx('page-header', className)}>\n {breadcrumbs && breadcrumbs.length > 0 && (\n <nav className=\"page-header__crumbs\" aria-label={t['appshell.breadcrumb']}>\n <ol>\n {breadcrumbs.map((c, i) => (\n <li key={i}>\n {c.href ? <a href={c.href}>{c.label}</a> : <span aria-current=\"page\">{c.label}</span>}\n {i < breadcrumbs.length - 1 && <span className=\"page-header__crumb-sep\" aria-hidden=\"true\">/</span>}\n </li>\n ))}\n </ol>\n </nav>\n )}\n <div className=\"page-header__row\">\n <div className=\"page-header__title-wrap\">\n <h1 className=\"page-header__title\">{title}</h1>\n {description && <p className=\"page-header__desc\">{description}</p>}\n </div>\n {actions && <div className=\"page-header__actions\">{actions}</div>}\n </div>\n {meta && <div className=\"page-header__meta\">{meta}</div>}\n </div>\n );\n}\n"]}
|
|
@@ -54,7 +54,15 @@ interface AppShellHeader {
|
|
|
54
54
|
* discriminated union of the two, keyed on `headerLayout`.
|
|
55
55
|
*/
|
|
56
56
|
interface AppShellBaseProps {
|
|
57
|
-
|
|
57
|
+
/**
|
|
58
|
+
* Navigation sections that populate the sidebar. Omit (or pass an empty
|
|
59
|
+
* array) in `headerLayout="top"` to render a **top-bar-only** shell — no
|
|
60
|
+
* sidebar at all, body collapses to a single column. Use when the app is
|
|
61
|
+
* flat-route (no panel nav), e.g. a kiosk/cobros-mesón style layout.
|
|
62
|
+
* Required (effectively) in `headerLayout="side"`: that layout is the
|
|
63
|
+
* sidebar; omitting sections renders an empty rail.
|
|
64
|
+
*/
|
|
65
|
+
sections?: NavSection[];
|
|
58
66
|
footer?: React.ReactNode;
|
|
59
67
|
defaultCollapsed?: boolean;
|
|
60
68
|
collapsed?: boolean;
|
|
@@ -54,7 +54,15 @@ interface AppShellHeader {
|
|
|
54
54
|
* discriminated union of the two, keyed on `headerLayout`.
|
|
55
55
|
*/
|
|
56
56
|
interface AppShellBaseProps {
|
|
57
|
-
|
|
57
|
+
/**
|
|
58
|
+
* Navigation sections that populate the sidebar. Omit (or pass an empty
|
|
59
|
+
* array) in `headerLayout="top"` to render a **top-bar-only** shell — no
|
|
60
|
+
* sidebar at all, body collapses to a single column. Use when the app is
|
|
61
|
+
* flat-route (no panel nav), e.g. a kiosk/cobros-mesón style layout.
|
|
62
|
+
* Required (effectively) in `headerLayout="side"`: that layout is the
|
|
63
|
+
* sidebar; omitting sections renders an empty rail.
|
|
64
|
+
*/
|
|
65
|
+
sections?: NavSection[];
|
|
58
66
|
footer?: React.ReactNode;
|
|
59
67
|
defaultCollapsed?: boolean;
|
|
60
68
|
collapsed?: boolean;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var chunkMSP4BOPZ_js = require('../chunk-MSP4BOPZ.js');
|
|
5
5
|
require('../chunk-4VMQLSHV.js');
|
|
6
6
|
require('../chunk-3HA3VO2I.js');
|
|
7
7
|
require('../chunk-PASF6T4H.js');
|
|
@@ -10,11 +10,11 @@ require('../chunk-PASF6T4H.js');
|
|
|
10
10
|
|
|
11
11
|
Object.defineProperty(exports, "AppShell", {
|
|
12
12
|
enumerable: true,
|
|
13
|
-
get: function () { return
|
|
13
|
+
get: function () { return chunkMSP4BOPZ_js.AppShell; }
|
|
14
14
|
});
|
|
15
15
|
Object.defineProperty(exports, "PageHeader", {
|
|
16
16
|
enumerable: true,
|
|
17
|
-
get: function () { return
|
|
17
|
+
get: function () { return chunkMSP4BOPZ_js.PageHeader; }
|
|
18
18
|
});
|
|
19
19
|
//# sourceMappingURL=AppShell.js.map
|
|
20
20
|
//# sourceMappingURL=AppShell.js.map
|
package/dist/index.js
CHANGED
|
@@ -41,7 +41,7 @@ var chunkXMLBKK7X_js = require('./chunk-XMLBKK7X.js');
|
|
|
41
41
|
var chunkCRKYET66_js = require('./chunk-CRKYET66.js');
|
|
42
42
|
var chunkWAGWB35Q_js = require('./chunk-WAGWB35Q.js');
|
|
43
43
|
var chunk3PXYCXDW_js = require('./chunk-3PXYCXDW.js');
|
|
44
|
-
var
|
|
44
|
+
var chunkMSP4BOPZ_js = require('./chunk-MSP4BOPZ.js');
|
|
45
45
|
var chunk4VMQLSHV_js = require('./chunk-4VMQLSHV.js');
|
|
46
46
|
var chunkAJ22SXI2_js = require('./chunk-AJ22SXI2.js');
|
|
47
47
|
var chunkEUB4PHPI_js = require('./chunk-EUB4PHPI.js');
|
|
@@ -667,11 +667,11 @@ Object.defineProperty(exports, "resetBrand", {
|
|
|
667
667
|
});
|
|
668
668
|
Object.defineProperty(exports, "AppShell", {
|
|
669
669
|
enumerable: true,
|
|
670
|
-
get: function () { return
|
|
670
|
+
get: function () { return chunkMSP4BOPZ_js.AppShell; }
|
|
671
671
|
});
|
|
672
672
|
Object.defineProperty(exports, "PageHeader", {
|
|
673
673
|
enumerable: true,
|
|
674
|
-
get: function () { return
|
|
674
|
+
get: function () { return chunkMSP4BOPZ_js.PageHeader; }
|
|
675
675
|
});
|
|
676
676
|
Object.defineProperty(exports, "LocaleProvider", {
|
|
677
677
|
enumerable: true,
|
package/dist/index.mjs
CHANGED
|
@@ -39,7 +39,7 @@ export { useDismiss } from './chunk-6P2TKRTL.mjs';
|
|
|
39
39
|
export { usePopoverPosition } from './chunk-5XT2LX3I.mjs';
|
|
40
40
|
export { Portal } from './chunk-FKBQYQQD.mjs';
|
|
41
41
|
export { BRAND_DEFAULTS, configureBrand, getBrand, resetBrand } from './chunk-5GEWIK4T.mjs';
|
|
42
|
-
export { AppShell, PageHeader } from './chunk-
|
|
42
|
+
export { AppShell, PageHeader } from './chunk-ER2Z5JEO.mjs';
|
|
43
43
|
export { LocaleProvider, esMessages, useLocale } from './chunk-PQV7HHCJ.mjs';
|
|
44
44
|
export { Button, ButtonGroup } from './chunk-NAL457NQ.mjs';
|
|
45
45
|
export { AspectRatio, ScrollArea, Separator, Slot, Slottable } from './chunk-IEPKSPBX.mjs';
|
package/dist/styles.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
@layer elalba;@layer elalba{:root{--color-primary:var(--color-primary-800);--color-secondary:var(--color-secondary-400);--color-primary-900:#2e2b26;--color-primary-800:#423e37;--color-primary-700:#554839;--color-primary-600:#6b5a47;--color-primary-500:#87735e;--color-primary-400:#a8957f;--color-primary-300:#c8b8a6;--color-primary-200:#dfd3c6;--color-primary-100:#f0e9e1;--color-primary-50:#faf6f2;--color-secondary-900:#573820;--color-secondary-800:#7a4f30;--color-secondary-700:#9c6840;--color-secondary-600:#be8456;--color-secondary-500:#d4a074;--color-secondary-400:#e4bb97;--color-secondary-300:#ebcbab;--color-secondary-200:#f1dbc2;--color-secondary-100:#f8eddf;--color-secondary-50:#fcf7f1;--color-ink:#1c1917;--color-gray-900:#292524;--color-gray-800:#44403c;--color-gray-700:#57534e;--color-gray-600:#78716c;--color-gray-500:#a8a29e;--color-gray-400:#c4bcb4;--color-gray-300:#d6d3d1;--color-gray-200:#e7e5e4;--color-gray-150:#efedeb;--color-gray-100:#f5f5f4;--color-gray-50:#fafaf9;--color-white:#fff;--color-green-900:#0f4d22;--color-green-800:#166130;--color-green-700:#1f7a3d;--color-green-600:#2f9e44;--color-green-500:#4ab35a;--color-green-400:#6ec47e;--color-green-300:#95d5a1;--color-green-200:#c1e6c8;--color-green-100:#e0f1e3;--color-green-50:#f0f8f2;--color-yellow-900:#6b4400;--color-yellow-800:#8c5800;--color-yellow-700:#b67200;--color-yellow-600:#d68b00;--color-yellow-500:#f59f00;--color-yellow-400:#f7b633;--color-yellow-300:#f9cc66;--color-yellow-200:#fbe199;--color-yellow-100:#fdedc4;--color-yellow-50:#fef7e3;--color-red-900:#5b0e0e;--color-red-800:#7e1818;--color-red-700:#b91c1c;--color-red-600:#dc2626;--color-red-500:#ef4444;--color-red-400:#f87171;--color-red-300:#fca5a5;--color-red-200:#fecaca;--color-red-100:#fee2e2;--color-red-50:#fef2f2;--color-info-900:#0a3a66;--color-info-800:#0f4d85;--color-info-700:#1660a5;--color-info-600:#1a73c2;--color-info-500:#408fd0;--color-info-400:#6ba9da;--color-info-300:#95c2e4;--color-info-200:#c0d8ee;--color-info-100:#dee9f5;--color-info-50:#eef4fa;--color-success:var(--color-green-600);--color-warning:var(--color-yellow-500);--color-danger:var(--color-red-600);--color-info:var(--color-info-600);--bg-canvas:#fef5ef;--bg-surface:var(--color-white);--bg-subtle:var(--color-gray-100);--bg-muted:var(--color-gray-150);--bg-inverse:var(--color-primary);--bg-inverse-strong:var(--color-primary-900);--fg-default:var(--color-ink);--fg-muted:#6b6560;--fg-subtle:#726c66;--fg-meta:var(--fg-subtle);--fg-on-brand:var(--color-white);--fg-on-secondary:var(--color-primary);--fg-link:var(--color-primary);--fg-link-hover:var(--color-secondary-600);--accent-primary:var(--color-primary);--accent-secondary:var(--color-secondary);--border-default:var(--color-gray-200);--border-strong:var(--color-gray-300);--border-brand:var(--color-primary);--border-focus:var(--color-secondary);--cat-1:#2f6fed;--cat-1-bg:#e8f0fe;--cat-1-fg:#1c4fa3;--cat-2:#14a08c;--cat-2-bg:#d9f2ee;--cat-2-fg:#0f6b5f;--cat-3:#7c4ddb;--cat-3-bg:#efe7fb;--cat-3-fg:#5b3aa8;--cat-4:#c98a00;--cat-4-bg:#fcf0d8;--cat-4-fg:#8a5a00;--cat-5:#e0457e;--cat-5-bg:#fde4ec;--cat-5-fg:#a52a5a;--cat-6:#64748b;--cat-6-bg:#e6e9ef;--cat-6-fg:#3f4756;--bp-sm:480px;--bp-md:768px;--bp-lg:1024px;--bp-xl:1280px;--font-display:"Outfit","Helvetica Neue",Arial,sans-serif;--font-body:"DM Sans","Helvetica Neue",Arial,sans-serif;--font-mono:"JetBrains Mono",ui-monospace,"SF Mono",Menlo,Consolas,monospace;--weight-thin:100;--weight-extralight:200;--weight-light:300;--weight-regular:400;--weight-medium:500;--weight-semibold:600;--weight-bold:700;--weight-extrabold:800;--weight-black:900;--text-2xs:0.6875rem;--text-xs:0.75rem;--text-sm:0.875rem;--text-md:1rem;--text-lg:1.125rem;--text-xl:1.25rem;--text-2xl:1.5rem;--text-3xl:1.875rem;--text-4xl:2.5rem;--text-5xl:3.25rem;--text-6xl:4.25rem;--text-7xl:5.5rem;--leading-tight:1.05;--leading-snug:1.2;--leading-normal:1.45;--leading-relaxed:1.6;--tracking-tight:-0.01em;--tracking-normal:0;--tracking-snug:0.02em;--tracking-wide:0.04em;--tracking-wider:0.08em;--tt-label:uppercase;--tt-data:none;--tt-title:none;--space-0:0;--space-1:4px;--space-2:8px;--space-3:12px;--space-4:16px;--space-5:20px;--space-6:24px;--space-8:32px;--space-10:40px;--space-12:48px;--space-16:64px;--space-20:80px;--space-24:96px;--radius-none:0;--radius-xs:2px;--radius-sm:4px;--radius-md:8px;--radius-lg:12px;--radius-xl:18px;--radius-pill:999px;--shadow-xs:0 1px 2px rgba(12,18,32,.06);--shadow-sm:0 2px 6px rgba(12,18,32,.08);--shadow-md:0 8px 20px rgba(12,18,32,.1);--shadow-lg:0 18px 40px rgba(12,18,32,.14);--shadow-brand:0 10px 30px rgba(0,47,135,.25);--shadow-card:0 1px 2px rgba(12,18,32,.05),0 8px 24px -16px rgba(12,18,32,.2);--shadow-card-hover:0 2px 4px rgba(12,18,32,.06),0 16px 32px -14px rgba(12,18,32,.26);--ease-out-quart:cubic-bezier(0.25,1,0.5,1);--ease-out-quint:cubic-bezier(0.22,1,0.36,1);--ease-out-expo:cubic-bezier(0.16,1,0.3,1);--ease-standard:var(--ease-out-quint);--ease-out:var(--ease-out-quint);--ease-in:cubic-bezier(0.4,0,1,1);--duration-fast:120ms;--duration-base:200ms;--duration-slow:320ms;--duration-exit:150ms;--z-base:1;--z-dropdown:50;--z-sticky:60;--z-overlay:100;--z-toast:200;--z-tooltip:1000;--z-popover:1300;--z-floating:1300;--focus-ring-brand:0 0 0 3px color-mix(in srgb,var(--color-primary) 15%,transparent);--focus-ring-accent:0 0 0 3px color-mix(in srgb,var(--color-secondary) 35%,transparent);--focus-ring-danger:0 0 0 3px color-mix(in srgb,var(--color-red-600) 18%,transparent);--backdrop:color-mix(in srgb,var(--color-ink) 55%,transparent)}.h-display,.h1{font-size:var(--text-6xl);line-height:var(--leading-tight)}.h-display,.h1,.h2{color:var(--fg-default);font-family:var(--font-display);font-weight:700;letter-spacing:var(--tracking-tight);text-transform:var(--tt-title)}.h2{font-size:var(--text-4xl);line-height:var(--leading-snug)}.h3{font-family:var(--font-display);font-size:var(--text-2xl);text-transform:var(--tt-title)}.h3,.h4{color:var(--fg-default);font-weight:700;line-height:var(--leading-snug)}.h4{font-size:var(--text-xl)}.eyebrow,.h4{font-family:var(--font-body)}.eyebrow{color:var(--accent-secondary);font-size:var(--text-sm);font-weight:700;letter-spacing:var(--tracking-wider);text-transform:var(--tt-label)}.body-lg{font-size:var(--text-lg)}.body,.body-lg,p{color:var(--fg-default);font-family:var(--font-body);font-weight:400;line-height:var(--leading-relaxed)}.body,p{font-size:var(--text-md)}.body-sm{font-weight:400;line-height:var(--leading-normal)}.body-sm,.label{color:var(--fg-muted);font-family:var(--font-body);font-size:var(--text-sm)}.label{font-weight:500;letter-spacing:var(--tracking-wide);text-transform:var(--tt-data)}.caption{color:var(--fg-subtle);font-size:var(--text-xs);letter-spacing:var(--tracking-wide)}.caption,.cell-meta{font-family:var(--font-body);font-weight:400}.cell-meta{color:var(--fg-meta);display:block;font-size:var(--text-2xs);line-height:var(--leading-normal)}.cell-mono{font-family:var(--font-mono);font-variant-numeric:tabular-nums}.cell-wrap{overflow-wrap:anywhere;white-space:normal}.mono,code{font-family:var(--font-mono);font-size:.95em}.mono,:not(pre)>code{background:var(--bg-subtle);border-radius:var(--radius-sm);padding:2px 6px}a{border-bottom:1px solid transparent;color:var(--fg-link);text-decoration:none;transition:color var(--duration-fast) var(--ease-standard),border-color var(--duration-fast) var(--ease-standard)}a:hover{border-bottom-color:currentColor;color:var(--fg-link-hover)}.surface-inverse,[data-tone=inverse]{--fg-default:var(--fg-on-brand);--fg-muted:color-mix(in srgb,var(--fg-on-brand) 70%,transparent);--fg-subtle:color-mix(in srgb,var(--fg-on-brand) 50%,transparent);--fg-link:var(--fg-on-brand);--fg-link-hover:var(--color-secondary);--border-default:color-mix(in srgb,var(--fg-on-brand) 20%,transparent);--border-strong:color-mix(in srgb,var(--fg-on-brand) 35%,transparent);--bg-subtle:color-mix(in srgb,var(--fg-on-brand) 12%,transparent);--bg-muted:color-mix(in srgb,var(--fg-on-brand) 18%,transparent);color:var(--fg-default)}.surface-inverse--brand{background:var(--color-primary)}.surface-inverse--dark{background:var(--color-primary-900)}}@layer elalba{}@layer elalba{:where(html,body){color:var(--fg-default);font-family:var(--font-body);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}svg text{font-family:inherit}button,input,optgroup,select,textarea{font:inherit}button,input,select,textarea{box-sizing:border-box}.btn{align-items:center;border:1px solid transparent;border-radius:var(--radius-md);cursor:pointer;display:inline-flex;font-family:var(--font-body);font-size:var(--text-sm);font-weight:700;gap:8px;justify-content:center;letter-spacing:var(--tracking-wide);text-decoration:none;text-transform:var(--tt-label);transition:background var(--duration-fast) var(--ease-standard),color var(--duration-fast) var(--ease-standard),border-color var(--duration-fast) var(--ease-standard),transform var(--duration-fast) var(--ease-standard),box-shadow var(--duration-fast) var(--ease-standard);-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap}.btn:focus-visible{box-shadow:var(--focus-ring-accent);outline:none}.btn:active:not(:disabled){box-shadow:var(--shadow-xs);transform:scale(.98)}.btn:disabled{cursor:not-allowed;opacity:.45}.btn--xs{font-size:var(--text-2xs);min-height:28px;padding:6px 10px}.btn--sm{font-size:var(--text-xs);min-height:36px;padding:8px 14px}.btn--md{font-size:var(--text-sm);min-height:44px;padding:10px 18px}.btn--lg{font-size:var(--text-md);min-height:52px;padding:14px 24px}.btn--xl{font-size:var(--text-lg);min-height:60px;padding:18px 32px}.btn--icon{aspect-ratio:1;padding:0}.btn--icon.btn--sm{width:36px}.btn--icon.btn--md{width:44px}.btn--icon.btn--lg{width:52px}.btn--block{display:flex;width:100%}.btn--primary{background:var(--btn-primary-bg,var(--color-primary));color:var(--btn-primary-fg,var(--fg-on-brand))}.btn--primary:hover:not(:disabled){background:var(--btn-primary-bg-hover,var(--color-primary-900))}.btn--secondary{background:var(--btn-secondary-bg,var(--color-secondary));color:var(--btn-secondary-fg,var(--fg-on-secondary))}.btn--secondary:hover:not(:disabled){background:var(--btn-secondary-bg-hover,var(--color-secondary-500))}.btn--outline{background:transparent;border-color:var(--color-primary);color:var(--color-primary)}.btn--outline:hover:not(:disabled){background:var(--color-primary);color:var(--color-white)}.btn--ghost{background:transparent;color:var(--fg-default)}.btn--ghost:hover:not(:disabled),.btn--subtle{background:var(--bg-subtle)}.btn--subtle{color:var(--fg-default)}.btn--subtle:hover:not(:disabled){background:var(--bg-muted)}.btn--danger{background:var(--color-danger);color:var(--color-white)}.btn--danger:hover:not(:disabled){background:var(--color-red-700)}.btn--success{background:var(--color-success);color:var(--color-white)}.btn--success:hover:not(:disabled){background:var(--color-green-700)}.btn--warning{background:var(--color-warning);color:var(--color-yellow-900)}.btn--warning:hover:not(:disabled){background:var(--color-yellow-600)}.btn--link{background:transparent;color:var(--color-primary);font-weight:700;letter-spacing:0;min-height:auto;padding:4px 6px;text-transform:none}.btn--link:hover:not(:disabled){color:var(--color-secondary-700);text-decoration:underline}.btn-group{display:inline-flex}.btn-group .btn{border-radius:var(--radius-none);border-right-width:0}.btn-group .btn:first-child{border-bottom-left-radius:var(--radius-md);border-top-left-radius:var(--radius-md)}.btn-group .btn:last-child{border-bottom-right-radius:var(--radius-md);border-right-width:1px;border-top-right-radius:var(--radius-md)}.btn-group .btn--outline+.btn--outline{border-left:1px solid var(--color-primary)}.field{display:flex;flex-direction:column;gap:6px}.field__label{align-items:center;color:var(--fg-default);display:flex;font-family:var(--font-body);font-size:var(--text-sm);font-weight:700;gap:4px}.field__label .req{color:var(--color-danger)}.field__label .opt{font-weight:400}.field__help,.field__label .opt{color:var(--fg-subtle);font-size:var(--text-xs)}.field__error,.field__help{font-family:var(--font-body)}.field__error{align-items:center;color:var(--color-danger);display:flex;font-size:var(--text-xs);font-weight:700;gap:4px}.input,.select,.textarea{background:var(--bg-surface);border:1px solid var(--border-strong);border-radius:var(--radius-md);color:var(--fg-default);font-family:var(--font-body);font-size:var(--text-md);min-height:var(--field-min-h,44px);padding:var(--field-pad-y,10px) var(--field-pad-x,14px);transition:border-color var(--duration-fast),box-shadow var(--duration-fast);width:100%}.fields--dense{--field-min-h:36px;--field-pad-y:6px;--field-pad-x:10px}.fields--dense .combobox__input,.fields--dense .input,.fields--dense .select,.fields--dense .textarea{font-size:var(--text-sm)}.input::-moz-placeholder,.textarea::-moz-placeholder{color:var(--fg-subtle)}.input::placeholder,.textarea::placeholder{color:var(--fg-subtle)}.input:hover:not(:disabled),.select:hover:not(:disabled),.textarea:hover:not(:disabled){border-color:var(--border-strong)}.input:focus,.select:focus,.textarea:focus{border-color:var(--color-primary);box-shadow:var(--focus-ring-brand);outline:none}.input:disabled,.select:disabled,.textarea:disabled{background:var(--bg-subtle);color:var(--fg-subtle);cursor:not-allowed}.field--error .input,.field--error .select,.field--error .textarea{border-color:var(--color-danger)}.field--error .input:focus{box-shadow:var(--focus-ring-danger)}.form-field{display:flex;flex-direction:column;gap:6px}.form-field__hint{color:var(--fg-subtle)}.form-field__error,.form-field__hint{font-family:var(--font-body);font-size:var(--text-xs)}.form-field__error{align-items:center;color:var(--color-danger);display:flex;font-weight:700;gap:4px}.select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' stroke='%235b6173' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");background-position:right 12px center;background-repeat:no-repeat;padding-right:40px}.textarea{min-height:96px;padding-bottom:12px;padding-top:12px;resize:vertical}.input-group{align-items:stretch;background:var(--bg-surface);border:1px solid var(--border-strong);border-radius:var(--radius-md);display:flex;overflow:hidden;transition:border-color var(--duration-fast),box-shadow var(--duration-fast)}.input-group:focus-within{border-color:var(--color-primary);box-shadow:var(--focus-ring-brand)}.input-group .input{border:0;border-radius:var(--radius-none);box-shadow:none}.input-group .input:focus{box-shadow:none}.input-group__addon{align-items:center;background:var(--bg-subtle);border-right:1px solid var(--border-default);color:var(--fg-muted);display:flex;font-family:var(--font-body);font-size:var(--text-sm);font-weight:700;padding:0 14px}.input-group__addon:last-child{border-left:1px solid var(--border-default);border-right:0}.input-wrap{align-items:center;display:flex;position:relative;width:100%}.input-wrap__icon{align-items:center;color:var(--fg-subtle);display:inline-flex;height:20px;justify-content:center;pointer-events:none;position:absolute;width:20px}.input-wrap__icon--left{left:12px}.input-wrap__icon--right{right:12px}.input-wrap .input{width:100%}.input--has-left{padding-left:40px}.input--has-right{padding-right:40px}.input-wrap.is-invalid .input{border-color:var(--color-danger)}.input-wrap.is-invalid .input:focus{box-shadow:var(--focus-ring-danger)}.check{align-items:flex-start;color:var(--fg-default);cursor:pointer;display:inline-flex;font-family:var(--font-body);font-size:var(--text-sm);gap:10px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.check input{opacity:0;pointer-events:none;position:absolute}.check__box{align-items:center;background:var(--bg-surface);border:1.5px solid var(--border-strong);border-radius:var(--radius-sm);display:inline-flex;flex:none;height:20px;justify-content:center;margin-top:1px;transition:background var(--duration-fast),border-color var(--duration-fast);width:20px}.check input:checked~.check__box{background:var(--color-primary);border-color:var(--color-primary);color:var(--color-white)}.check input:focus-visible~.check__box{box-shadow:var(--focus-ring-accent);outline:none}.check:hover .check__box{border-color:var(--border-strong)}.check input:disabled~.check__box{background:var(--bg-subtle);border-color:var(--border-default)}.check__box svg{opacity:0;transition:opacity var(--duration-fast)}.check input:checked~.check__box svg{opacity:1}.check--radio .check__box,.check--radio .check__box:after{border-radius:var(--radius-pill)}.check--radio .check__box:after{background:var(--color-white);content:"";height:8px;opacity:0;transition:opacity var(--duration-fast);width:8px}.check--radio input:checked~.check__box:after{opacity:1}.switch{align-items:center;cursor:pointer;display:inline-flex;gap:10px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.switch input{opacity:0;pointer-events:none;position:absolute}.switch__track{background:var(--color-gray-300);border-radius:var(--radius-pill);flex:none;height:22px;position:relative;transition:background var(--duration-fast) var(--ease-standard);width:40px}.switch__track:after{background:var(--color-white);border-radius:var(--radius-pill);box-shadow:var(--shadow-xs);content:"";height:18px;left:2px;position:absolute;top:2px;transition:transform var(--duration-fast) var(--ease-standard);width:18px}.switch input:checked~.switch__track{background:var(--color-primary)}.switch input:checked~.switch__track:after{transform:translateX(18px)}.switch input:focus-visible~.switch__track{box-shadow:var(--focus-ring-accent)}.switch input:disabled~.switch__track{opacity:.5}.badge{align-items:center;background:var(--bg-subtle);border:1px solid var(--border-default);border-radius:var(--radius-pill);color:var(--fg-muted);display:inline-flex;font-family:var(--font-body);font-size:var(--text-xs);font-weight:600;gap:6px;letter-spacing:var(--tracking-wide);padding:3px 8px;text-transform:none;white-space:nowrap;--badge-ink:var(--color-gray-800)}.badge--label{text-transform:var(--tt-label)}.badge--primary{background:var(--color-primary-100);border-color:var(--color-primary-200);color:var(--color-primary-800);--badge-ink:var(--color-primary-800)}.badge--accent{background:var(--color-secondary-100);border-color:var(--color-secondary-200);color:var(--color-secondary-800);--badge-ink:var(--color-secondary-800)}.badge--success{background:var(--color-green-50);border-color:var(--color-green-200);color:var(--color-green-800);--badge-ink:var(--color-green-800)}.badge--warning{background:var(--color-yellow-50);border-color:var(--color-yellow-200);color:var(--color-yellow-800);--badge-ink:var(--color-yellow-800)}.badge--danger{background:var(--color-red-50);border-color:var(--color-red-200);color:var(--color-red-800);--badge-ink:var(--color-red-800)}.badge--info{background:var(--color-info-50);border-color:var(--color-info-200);color:var(--color-info-800);--badge-ink:var(--color-info-800)}.badge--cat-1{background:var(--cat-1-bg);border-color:transparent;color:var(--cat-1-fg);--badge-ink:var(--cat-1-fg)}.badge--cat-2{background:var(--cat-2-bg);border-color:transparent;color:var(--cat-2-fg);--badge-ink:var(--cat-2-fg)}.badge--cat-3{background:var(--cat-3-bg);border-color:transparent;color:var(--cat-3-fg);--badge-ink:var(--cat-3-fg)}.badge--cat-4{background:var(--cat-4-bg);border-color:transparent;color:var(--cat-4-fg);--badge-ink:var(--cat-4-fg)}.badge--cat-5{background:var(--cat-5-bg);border-color:transparent;color:var(--cat-5-fg);--badge-ink:var(--cat-5-fg)}.badge--cat-6{background:var(--cat-6-bg);border-color:transparent;color:var(--cat-6-fg);--badge-ink:var(--cat-6-fg)}.badge--app-solid{background:var(--badge-ink);border-color:transparent;color:var(--color-white)}.badge--app-outline{background:transparent;border-color:var(--badge-ink);color:var(--badge-ink)}.badge--solid{background:var(--color-primary)}.badge--solid,.badge--solid-orange{border-color:transparent;color:var(--color-white)}.badge--solid-orange{background:var(--color-secondary)}.badge__dot{background:currentColor;border-radius:var(--radius-pill);height:6px;width:6px}.badge__dot.is-pulsing{animation:status-pulse 1.6s ease-out infinite}@media (prefers-reduced-motion:reduce){.badge__dot.is-pulsing{animation:none}}.chip{align-items:center;background:var(--bg-subtle);border:1px solid var(--border-default);border-radius:var(--radius-pill);color:var(--fg-default);cursor:pointer;display:inline-flex;font-family:var(--font-body);font-size:var(--text-sm);gap:6px;padding:6px 12px;transition:background var(--duration-fast),border-color var(--duration-fast)}.chip:hover{background:var(--bg-muted)}.chip--active{background:var(--color-primary);border-color:var(--color-primary);color:var(--color-white)}.chip__close{align-items:center;background:transparent;border:0;border-radius:var(--radius-pill);color:inherit;cursor:pointer;display:inline-flex;height:16px;justify-content:center;opacity:.6;padding:0;transition:opacity var(--duration-fast),background var(--duration-fast);width:16px}.chip__close:hover{background:rgba(0,0,0,.08);opacity:1}.chip--active .chip__close:hover{background:hsla(0,0%,100%,.2)}.chip__close:focus-visible{box-shadow:var(--focus-ring-accent);outline:none}.chip__close svg{display:block}.avatar{align-items:center;border-radius:var(--radius-pill);display:inline-flex;flex:none;font-size:var(--text-sm);font-weight:700;height:40px;justify-content:center;letter-spacing:.02em;position:relative;text-transform:var(--tt-label);width:40px}.avatar img{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.avatar--xs{font-size:.625rem;height:24px;width:24px}.avatar--sm{font-size:var(--text-2xs);height:32px;width:32px}.avatar--lg{font-size:var(--text-md);height:56px;width:56px}.avatar--xl{font-size:var(--text-xl);height:80px;width:80px}.avatar-stack{display:inline-flex}.avatar-stack .avatar{border:2px solid var(--bg-surface);margin-left:-10px}.avatar-stack .avatar:first-child{margin-left:0}.card{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);box-shadow:var(--shadow-card);overflow:hidden}.card .card{box-shadow:none}.card__body,.card__header{padding:20px 24px}.card__header{border-bottom:1px solid var(--border-default)}.card__footer{background:var(--bg-subtle);border-top:1px solid var(--border-default);padding:16px 24px}.card__title{font-family:var(--font-body);font-size:var(--text-lg);font-weight:700;margin:0 0 4px}.card__subtitle{color:var(--fg-muted);font-size:var(--text-sm);margin:0}.card--interactive{cursor:pointer;transition:box-shadow var(--duration-base) var(--ease-standard),transform var(--duration-base) var(--ease-standard)}.card--interactive:hover{box-shadow:var(--shadow-card-hover);transform:translateY(-2px)}.card--accent-brand,.card--accent-cat-1,.card--accent-cat-2,.card--accent-cat-3,.card--accent-cat-4,.card--accent-cat-5,.card--accent-cat-6,.card--accent-danger,.card--accent-info,.card--accent-neutral,.card--accent-secondary,.card--accent-success,.card--accent-warning{box-shadow:inset 4px 0 0 var(--card-accent-color),var(--shadow-card)}.card--accent-brand{--card-accent-color:var(--color-primary)}.card--accent-secondary{--card-accent-color:var(--accent-secondary)}.card--accent-success{--card-accent-color:var(--color-success)}.card--accent-warning{--card-accent-color:var(--color-warning)}.card--accent-danger{--card-accent-color:var(--color-danger)}.card--accent-info{--card-accent-color:var(--color-info)}.card--accent-neutral{--card-accent-color:var(--border-strong)}.card--accent-cat-1{--card-accent-color:var(--cat-1)}.card--accent-cat-2{--card-accent-color:var(--cat-2)}.card--accent-cat-3{--card-accent-color:var(--cat-3)}.card--accent-cat-4{--card-accent-color:var(--cat-4)}.card--accent-cat-5{--card-accent-color:var(--cat-5)}.card--accent-cat-6{--card-accent-color:var(--cat-6)}.card--interactive.card--accent-brand:hover,.card--interactive.card--accent-cat-1:hover,.card--interactive.card--accent-cat-2:hover,.card--interactive.card--accent-cat-3:hover,.card--interactive.card--accent-cat-4:hover,.card--interactive.card--accent-cat-5:hover,.card--interactive.card--accent-cat-6:hover,.card--interactive.card--accent-danger:hover,.card--interactive.card--accent-info:hover,.card--interactive.card--accent-neutral:hover,.card--interactive.card--accent-secondary:hover,.card--interactive.card--accent-success:hover,.card--interactive.card--accent-warning:hover{box-shadow:inset 4px 0 0 var(--card-accent-color),var(--shadow-card-hover)}.kpi-card{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);display:flex;flex-direction:column;gap:8px;padding:20px 24px}.kpi-card__label{color:var(--fg-muted);font-family:var(--font-body);font-size:var(--text-xs);font-weight:700;letter-spacing:var(--tracking-wider);text-transform:var(--tt-label)}.kpi-card__value{color:var(--fg-default);font-family:var(--font-display);font-size:var(--text-4xl);font-weight:700;line-height:1}.kpi-card__trend{align-items:center;display:inline-flex;font-family:var(--font-body);font-size:var(--text-xs);font-weight:700;gap:4px}.kpi-card__trend--up{color:var(--color-success)}.kpi-card__trend--down{color:var(--color-danger)}.product-card{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);display:flex;flex-direction:column;overflow:hidden;position:relative;transition:box-shadow var(--duration-base),transform var(--duration-base)}.product-card:hover{box-shadow:var(--shadow-md);transform:translateY(-2px)}.product-card__media{aspect-ratio:1;background:var(--bg-subtle);overflow:hidden;position:relative}.product-card__media,.product-card__placeholder{align-items:center;display:flex;justify-content:center}.product-card__placeholder{background-image:linear-gradient(45deg,var(--bg-muted) 25%,transparent 25%),linear-gradient(-45deg,var(--bg-muted) 25%,transparent 25%);background-size:16px 16px;color:var(--color-gray-500);font-size:var(--text-xs);height:100%;width:100%}.product-card__body{display:flex;flex:1;flex-direction:column;gap:6px;padding:16px}.product-card__title{font-size:var(--text-md);font-weight:700;line-height:1.3;margin:0}.product-card__sku{color:var(--fg-subtle);font-family:var(--font-mono);font-size:var(--text-xs)}.product-card__price{color:var(--color-primary);font-size:var(--text-xl);font-weight:700}.product-card__footer{align-items:center;display:flex;gap:8px;justify-content:space-between;padding:0 16px 16px}.product-card__tag{background:var(--color-secondary);color:var(--color-white);font-size:var(--text-2xs);font-weight:700;left:12px;letter-spacing:var(--tracking-wide);padding:4px 8px;position:absolute;text-transform:var(--tt-label);top:12px}.alert{align-items:flex-start;background:var(--bg-subtle);border:1px solid var(--border-default);border-radius:var(--radius-md);display:flex;font-family:var(--font-body);font-size:var(--text-sm);gap:12px;line-height:1.5;padding:14px 18px}.alert__icon{flex:none;margin-top:1px}.alert__body{flex:1}.alert__title{font-weight:700;margin-bottom:2px}.alert__desc{color:inherit;font-size:var(--text-sm);line-height:1.5;opacity:.92}.alert--info{background:var(--color-info-50);border-color:var(--color-info-200);color:var(--color-info-800)}.alert--info .alert__icon{color:var(--color-info)}.alert--success{background:var(--color-green-50);border-color:var(--color-green-200);color:var(--color-green-800)}.alert--success .alert__icon{color:var(--color-success)}.alert--warning{background:var(--color-yellow-50);border-color:var(--color-yellow-200);color:var(--color-yellow-800)}.alert--warning .alert__icon{color:var(--color-warning)}.alert--danger{background:var(--color-red-50);border-color:var(--color-red-200);color:var(--color-red-800)}.alert--danger .alert__icon{color:var(--color-danger)}.alert__close{background:transparent;border:0;color:currentColor;cursor:pointer;opacity:.7;padding:2px}.alert__close:hover{opacity:1}.tooltip{display:inline-flex;position:relative}.tooltip__bubble{background:var(--color-ink);border-radius:var(--radius-sm);color:var(--color-white);font-family:var(--font-body);font-size:var(--text-xs);font-weight:700;opacity:0;padding:6px 10px;pointer-events:none;position:absolute;transition:opacity var(--duration-fast);white-space:nowrap;z-index:var(--z-tooltip)}.tooltip__bubble:after{border:4px solid transparent;content:"";position:absolute}.tooltip--top .tooltip__bubble{bottom:calc(100% + 8px);left:50%;transform:translateX(-50%)}.tooltip--top .tooltip__bubble:after{border-top-color:var(--color-ink);left:50%;top:100%;transform:translateX(-50%)}.tooltip--bottom .tooltip__bubble{left:50%;top:calc(100% + 8px);transform:translateX(-50%)}.tooltip--bottom .tooltip__bubble:after{border-bottom-color:var(--color-ink);bottom:100%;left:50%;transform:translateX(-50%)}.tooltip--left .tooltip__bubble{right:calc(100% + 8px);top:50%;transform:translateY(-50%)}.tooltip--left .tooltip__bubble:after{border-left-color:var(--color-ink);left:100%;top:50%;transform:translateY(-50%)}.tooltip--right .tooltip__bubble{left:calc(100% + 8px);top:50%;transform:translateY(-50%)}.tooltip--right .tooltip__bubble:after{border-right-color:var(--color-ink);right:100%;top:50%;transform:translateY(-50%)}.tooltip:focus-within .tooltip__bubble,.tooltip:hover .tooltip__bubble{opacity:1}.tabs{display:flex;flex-direction:column}.tabs__list{border-bottom:1px solid var(--border-default);display:flex;gap:4px}.tabs__tab{background:transparent;border:0;border-bottom:2px solid transparent;color:var(--fg-default);cursor:pointer;font-family:var(--font-body);font-size:var(--text-sm);font-weight:600;margin-bottom:-1px;padding:12px 18px;transition:color var(--duration-fast),border-color var(--duration-fast)}.tabs__tab.is-active,.tabs__tab:hover{color:var(--color-primary)}.tabs__tab.is-active{border-bottom-color:var(--color-secondary)}.tabs__tab:focus-visible{border-radius:var(--radius-sm);box-shadow:var(--focus-ring-accent);outline:none}.tabs__panel{padding:16px 0}.tabs--pill .tabs__list{background:var(--bg-subtle);border:0;border-radius:var(--radius-md);display:inline-flex;gap:8px;padding:4px}.tabs--pill .tabs__tab{border:0;border-radius:var(--radius-sm);margin:0;padding:8px 14px}.tabs--pill .tabs__tab.is-active{background:var(--bg-surface);box-shadow:var(--shadow-xs);color:var(--color-primary)}.pagination__btn{align-items:center;display:inline-flex;font-weight:500;height:36px;justify-content:center;min-width:36px;padding:0 10px;transition:background var(--duration-fast),border-color var(--duration-fast)}.pagination__btn.active{background:var(--color-primary);border-color:var(--color-primary);color:var(--color-white)}.pagination__ellipsis{align-self:center;color:var(--fg-subtle)}.breadcrumbs{align-items:center;display:flex;flex-wrap:wrap;gap:6px}.breadcrumbs__current{color:var(--fg-default);font-weight:700}.table-wrap{background:linear-gradient(to right,var(--bg-surface) 30%,transparent) 0,linear-gradient(to left,var(--bg-surface) 30%,transparent) 100%,linear-gradient(to right,rgba(0,0,0,.08),transparent 24px) 0,linear-gradient(to left,rgba(0,0,0,.08),transparent 24px) 100%,var(--bg-surface);background-attachment:local,local,scroll,scroll,scroll;background-clip:padding-box;background-repeat:no-repeat;background-size:30px 100%,30px 100%,24px 100%,24px 100%,100% 100%;border:1px solid var(--border-default);border-radius:var(--radius-lg);overflow-x:auto}.table-wrap>.data-table thead tr:first-child th:first-child{border-top-left-radius:var(--radius-lg)}.table-wrap>.data-table thead tr:first-child th:last-child{border-top-right-radius:var(--radius-lg)}.table{border-collapse:collapse;color:var(--fg-default);font-family:var(--font-body);font-size:var(--text-sm);width:100%}.table th{background:var(--bg-subtle);border-bottom:1px solid var(--border-default);color:var(--fg-muted);font-size:var(--text-xs);font-weight:500;letter-spacing:var(--tracking-snug);padding:8px 12px;text-align:left;text-transform:var(--tt-data);white-space:nowrap}.data-table__sort{display:inline-flex;margin-left:4px;opacity:.75;vertical-align:middle}.data-table__sort-btn{align-items:center;background:transparent;border:0;color:inherit;cursor:pointer;display:inline-flex;font-size:inherit;font-weight:inherit;gap:4px;letter-spacing:inherit;padding:0;text-transform:inherit}.data-table__sort-btn:hover{color:var(--fg-default)}.data-table__sort-btn:focus-visible{border-radius:var(--radius-sm);box-shadow:var(--focus-ring-accent);outline:none}.table th[aria-sort=ascending],.table th[aria-sort=descending]{background:var(--color-primary-50);border-bottom-color:var(--color-primary);color:var(--color-primary)}.data-table__error{color:var(--color-danger);font-size:var(--text-sm)}.table-pagination{align-items:center;display:flex;flex-wrap:wrap;gap:var(--space-3);justify-content:space-between;padding:var(--space-3) 0}.table-pagination__size{align-items:center;color:var(--fg-muted);display:inline-flex;font-size:var(--text-sm);gap:var(--space-2)}.table-pagination__size .select{min-width:0;width:auto}@media (max-width:600px){.table-pagination{justify-content:center}}.table-wrap--sticky{max-height:70vh;overflow-y:auto}.table-wrap--sticky .table thead th{background:var(--bg-subtle);box-shadow:inset 0 -1px 0 var(--border-default);position:sticky;top:0;z-index:1}@media (max-width:600px){.table-wrap--cards .table{border:0}.table-wrap--cards .table thead{display:none}.table-wrap--cards .table tr{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);display:block;margin-bottom:var(--space-3);padding:var(--space-3)}.table-wrap--cards .table td{align-items:baseline;border:0;display:flex;gap:var(--space-3);justify-content:space-between;overflow:visible;padding:var(--space-2) 0;text-align:left!important;text-overflow:clip;white-space:normal}.table-wrap--cards .table td:not(:last-child){border-bottom:1px solid var(--border-subtle)}.table-wrap--cards .table td[data-label]:before{color:var(--fg-muted);content:attr(data-label);flex-shrink:0;font-size:var(--text-xs);font-weight:600;letter-spacing:var(--tracking-wide);text-transform:var(--tt-label)}}.table th[aria-sort=ascending] .data-table__sort,.table th[aria-sort=descending] .data-table__sort{color:var(--color-primary);opacity:1}.table td{border-bottom:1px solid var(--border-default);font-size:var(--text-sm);overflow:hidden;padding:8px 12px;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.table tr:last-child td{border-bottom:0}.table tbody tr{transition:background var(--duration-fast)}.table tbody tr:hover{background:var(--bg-muted)}.table--compact td,.table--compact th{font-size:var(--text-xs);padding:8px 12px}.table--comfortable th{padding:14px 16px}.table--comfortable td{font-size:var(--text-sm);overflow:visible;padding:14px 16px;text-overflow:clip;white-space:normal}.table__num{font-family:var(--font-mono)}.table td.table__align-right,.table__num{text-align:right}.table td.table__align-center{text-align:center}.table td.table__align-right>*{margin-left:auto}.table td.table__align-center>*{margin-inline:auto}.table-toolbar{align-items:center;background:var(--bg-surface);border-bottom:1px solid var(--border-default);display:flex;flex-wrap:wrap;gap:12px;padding:14px 16px}.table-toolbar>.grow,.table-toolbar>.input,.table-toolbar>.input-wrap,.table-toolbar>.select{flex:1 1 200px;min-width:0}.table-toolbar+.table-wrap{border-top:0;border-top-left-radius:0;border-top-right-radius:0}.table-surface{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);overflow:hidden}.table-surface__bar{border-bottom:1px solid var(--border-default)}.table-surface>.table-wrap{border:0;border-radius:0}.table-surface .data-table thead tr:first-child th:first-child{border-top-left-radius:0}.table-surface .data-table thead tr:first-child th:last-child{border-top-right-radius:0}.modal-backdrop{align-items:center;animation:fadeIn var(--duration-base) var(--ease-standard);background:var(--backdrop);display:flex;inset:0;justify-content:center;padding:24px;position:fixed;z-index:var(--z-overlay)}.modal{animation:rise var(--duration-base) var(--ease-standard);background:var(--bg-surface);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);display:flex;flex-direction:column;max-height:calc(100vh - 48px);max-width:520px;overflow:hidden;width:100%}.modal--sm{max-width:380px}.modal--md{max-width:520px}.modal--lg{max-width:760px}.modal__header{align-items:center;border-bottom:1px solid var(--border-default);display:flex;justify-content:space-between;padding:20px 24px}.modal__title{font-family:var(--font-display);font-size:var(--text-xl);font-weight:700;letter-spacing:var(--tracking-tight);margin:0;text-transform:var(--tt-title)}.modal__body{min-width:0;overflow-x:hidden;overflow-y:auto;padding:24px}.modal__footer{background:var(--bg-subtle);border-top:1px solid var(--border-default);display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end;padding:16px 24px}.modal__close{background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-muted);cursor:pointer;padding:4px}.modal__close:hover{background:var(--bg-subtle);color:var(--fg-default)}.drawer-backdrop{animation:fadeIn var(--duration-base) var(--ease-standard);background:var(--backdrop);display:flex;inset:0;justify-content:flex-end;position:fixed;z-index:var(--z-overlay)}.drawer{animation:slideIn var(--duration-base) var(--ease-standard);background:var(--bg-surface);box-shadow:var(--shadow-lg);display:flex;flex-direction:column;height:100%;max-width:480px;width:100%}.drawer-backdrop:has(.drawer--left){justify-content:flex-start}.drawer--left{animation:slideInLeft var(--duration-base) var(--ease-standard)}.drawer__header{align-items:center;border-bottom:1px solid var(--border-default);display:flex;justify-content:space-between;padding:20px 24px}.drawer__title{font-family:var(--font-display);font-size:var(--text-xl);font-weight:700;letter-spacing:var(--tracking-tight);margin:0;text-transform:var(--tt-title)}.drawer__body{flex:1;overflow-y:auto;padding:24px}.drawer__footer{background:var(--bg-subtle);border-top:1px solid var(--border-default);display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end;padding:16px 24px}.drawer__close{background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-muted);cursor:pointer;padding:4px}.drawer__close:hover{background:var(--bg-subtle);color:var(--fg-default)}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes rise{0%{opacity:0;transform:translateY(8px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes slideIn{0%{opacity:0;transform:translateX(20px)}to{opacity:1;transform:translateX(0)}}@keyframes slideInLeft{0%{opacity:0;transform:translateX(-20px)}to{opacity:1;transform:translateX(0)}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}@keyframes sink{0%{opacity:1;transform:translateY(0) scale(1)}to{opacity:0;transform:translateY(8px) scale(.98)}}@keyframes slideOut{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(20px)}}@keyframes slideOutLeft{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(-20px)}}.modal-backdrop.is-closing{animation:fadeOut var(--duration-exit) var(--ease-standard) forwards}.modal.is-closing{animation:sink var(--duration-exit) var(--ease-standard) forwards}.drawer-backdrop.is-closing{animation:fadeOut var(--duration-exit) var(--ease-standard) forwards}.drawer--right.is-closing{animation:slideOut var(--duration-exit) var(--ease-standard) forwards}.drawer--left.is-closing{animation:slideOutLeft var(--duration-exit) var(--ease-standard) forwards}@keyframes slideInBottom{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes slideOutBottom{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(100%)}}@media (max-width:600px){.drawer-backdrop{align-items:flex-end;justify-content:stretch}.drawer-backdrop:has(.drawer--left){justify-content:stretch}.drawer{animation:slideInBottom var(--duration-base) var(--ease-standard);border-radius:var(--radius-lg) var(--radius-lg) 0 0;height:auto;max-height:90vh;max-width:none;width:100%}.drawer--left.is-closing,.drawer--right.is-closing,.drawer.is-closing{animation:slideOutBottom var(--duration-exit) var(--ease-standard) forwards}}.menu-item{align-items:center;background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;display:flex;font-family:var(--font-body);font-size:var(--text-sm);gap:8px;padding:8px 10px;text-align:left;width:100%}.menu-item:hover{background:var(--bg-subtle)}.menu-item--danger{color:var(--color-danger)}.menu-divider{background:var(--border-default);height:1px;margin:4px 0}.toast-stack{bottom:24px;display:flex;flex-direction:column;gap:8px;pointer-events:none;position:fixed;right:24px;z-index:var(--z-toast)}.toast{align-items:center;animation:slideUp var(--duration-base) var(--ease-standard);background:var(--bg-surface);border:1px solid var(--border-default);border-left-width:4px;border-radius:var(--radius-md);box-shadow:var(--shadow-lg);color:var(--fg-default);display:flex;font-family:var(--font-body);font-size:var(--text-sm);gap:12px;max-width:420px;min-width:320px;padding:14px 16px 14px 14px;pointer-events:auto}.toast:has(.toast__desc){align-items:flex-start}.toast:has(.toast__desc) .toast__icon{margin-top:1px}.toast__body{flex:1;min-width:0}.toast__title{color:var(--fg-default);font-weight:700}.toast:has(.toast__desc) .toast__title{margin-bottom:2px}.toast__desc{color:var(--fg-muted);font-size:var(--text-xs);line-height:1.4}.toast__close,.toast__icon{display:inline-flex;flex:none}.toast__close{align-items:center;align-self:flex-start;background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-muted);cursor:pointer;justify-content:center;line-height:1;padding:2px 6px}.toast__close:hover{background:var(--bg-subtle);color:var(--fg-default)}.toast--success{border-left-color:var(--color-success)}.toast--success .toast__icon{color:var(--color-success)}.toast--warning{border-left-color:var(--color-warning)}.toast--warning .toast__icon{color:var(--color-warning)}.toast--danger{border-left-color:var(--color-danger)}.toast--danger .toast__icon{color:var(--color-danger)}.toast--info{border-left-color:var(--color-info)}.toast--info .toast__icon{color:var(--color-info)}@keyframes slideUp{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes toastSlideOut{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(100%)}}.toast.is-closing{animation:toastSlideOut var(--duration-exit) var(--ease-standard) forwards}.empty{background:var(--bg-subtle);border:1px dashed var(--border-strong);border-radius:var(--radius-lg);padding:48px 24px;text-align:center}.empty,.empty__icon{color:var(--fg-muted)}.empty__icon{align-items:center;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-pill);display:inline-flex;height:56px;justify-content:center;margin:0 auto 16px;width:56px}.empty__title{color:var(--fg-default);font-family:var(--font-display);font-size:var(--text-xl);font-weight:700;margin:0 0 8px;text-transform:var(--tt-title)}.empty__desc{color:var(--fg-muted);font-size:var(--text-sm);line-height:1.5;margin:0 0 16px;margin-inline:auto;max-width:360px}.skel{animation:shimmer 1.6s linear infinite;background:linear-gradient(90deg,var(--bg-subtle),var(--bg-muted),var(--bg-subtle));background-size:200% 100%;border-radius:var(--radius-sm);display:block}@keyframes shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.progress{background:var(--bg-subtle);border-radius:var(--radius-pill);height:8px;overflow:hidden}.progress__bar{background:var(--color-primary);border-radius:inherit;height:100%;transition:width var(--duration-base)}.progress__bar--orange{background:var(--color-secondary)}.progress__bar--success{background:var(--color-success)}.spinner{animation:spin .8s linear infinite;border:2px solid var(--border-default);border-radius:var(--radius-pill);border-top-color:var(--color-primary);display:inline-block;height:20px;width:20px}.spinner--lg{border-width:3px;height:32px;width:32px}.spinner--inverse{border-color:hsla(0,0%,100%,.35);border-top-color:var(--color-white);border-width:2px;height:16px;width:16px}@keyframes spin{to{transform:rotate(1turn)}}.stepper{gap:0;list-style:none;margin:0;padding:0;width:100%}.stepper,.stepper__item{align-items:center;display:flex}.stepper__item{flex:1;gap:12px}.stepper__item:last-child{flex:0 0 auto}.stepper__circle{align-items:center;background:var(--bg-surface);border:2px solid var(--border-strong);border-radius:var(--radius-pill);color:var(--fg-muted);display:inline-flex;flex:none;font-family:var(--font-body);font-size:var(--text-md);font-weight:700;height:36px;justify-content:center;line-height:1;width:36px}.stepper__item.is-current .stepper__circle{background:var(--color-primary);border-color:var(--color-primary);color:var(--color-white)}.stepper__item.is-done .stepper__circle{background:var(--color-success);border-color:var(--color-success);color:var(--color-white)}.stepper__label{color:var(--fg-muted);font-size:var(--text-sm);font-weight:700}.stepper__desc,.stepper__label{font-family:var(--font-body);white-space:nowrap}.stepper__desc{color:var(--fg-subtle);font-size:var(--text-xs)}.stepper__item.is-current .stepper__label,.stepper__item.is-done .stepper__label{color:var(--fg-default)}.stepper__item:not(:last-child):after{background:var(--border-default);content:"";flex:1;height:2px;margin:0 12px}.stepper__item.is-done:not(:last-child):after{background:var(--color-success)}.accordion{border-radius:var(--radius-lg)}.accordion__item{border-bottom:1px solid var(--border-default)}.accordion__item:last-child{border-bottom:0}.upload{background:var(--bg-subtle);border:1.5px dashed var(--border-strong);border-radius:var(--radius-lg);color:var(--fg-muted);cursor:pointer;padding:32px 24px;text-align:center;transition:border-color var(--duration-fast),background var(--duration-fast)}.upload.dragover,.upload:hover{background:var(--color-primary-50);border-color:var(--color-primary);color:var(--color-primary)}.upload__title{color:var(--fg-default);font-family:var(--font-body);font-weight:700;margin:8px 0 4px}.divider{height:1px;width:100%}.divider,.divider--vertical{background:var(--border-default)}.divider--vertical{height:100%;min-height:24px;width:1px}.tpl-nav{background:var(--color-primary);color:var(--color-white);gap:16px;justify-content:space-between;padding:12px 24px}.tpl-nav,.tpl-nav__brand{align-items:center;display:flex}.tpl-nav__brand{gap:12px}.tpl-nav__brand img{height:32px}.tpl-nav__title{font-family:var(--font-display);font-size:var(--text-md);font-weight:700;letter-spacing:var(--tracking-wide);text-transform:var(--tt-title)}.tpl-nav__items{display:flex;gap:4px}.tpl-nav__items a{border-radius:var(--radius-sm);color:hsla(0,0%,100%,.85);font-size:var(--text-sm);font-weight:700;padding:8px 14px}.tpl-nav__items a:hover{background:hsla(0,0%,100%,.1);color:var(--color-white)}.tpl-nav__items a.active{background:hsla(0,0%,100%,.15);color:var(--color-white)}.tpl-sb{background:var(--bg-surface);border-right:1px solid var(--border-default);display:flex;flex:none;flex-direction:column;height:100%;width:240px}.tpl-sb__brand{align-items:center;border-bottom:1px solid var(--border-default);display:flex;gap:10px;padding:18px 20px}.tpl-sb__brand img{height:28px}.tpl-sb__title{font-family:var(--font-display);font-size:var(--text-sm);font-weight:700;text-transform:var(--tt-title)}.tpl-sb__nav{flex:1;overflow-y:auto;padding:12px}.tpl-sb__group{color:var(--fg-subtle);font-family:var(--font-body);font-size:var(--text-2xs);font-weight:700;letter-spacing:var(--tracking-wider);padding:12px 12px 6px;text-transform:var(--tt-label)}.tpl-sb__link{align-items:center;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;display:flex;font-size:var(--text-sm);font-weight:700;gap:10px;padding:8px 12px}.tpl-sb__link:hover{background:var(--bg-subtle)}.tpl-sb__link.active{background:var(--color-primary-100);color:var(--color-primary)}.tpl-sb__link.active:before{background:var(--color-secondary);border-radius:var(--radius-xs);content:"";height:16px;margin-left:-12px;margin-right:9px;width:3px}.divider-h{border-top:1px solid var(--border-default)}.kv{display:grid;font-size:var(--text-sm);gap:8px 16px;grid-template-columns:200px 1fr}.kv__k{color:var(--fg-muted);font-weight:700}.kv__v{color:var(--fg-default)}.list-group{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);list-style:none;margin:0;overflow:hidden;padding:0}.list-group__item--interactive{cursor:pointer}.list-group__item{align-items:center;border-bottom:1px solid var(--border-default);display:flex;gap:12px;padding:14px 18px}.list-group__item:last-child{border-bottom:0}.list-group__item:hover{background:var(--bg-subtle)}.template-frame{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);overflow:hidden}.template-frame__chrome{align-items:center;background:var(--bg-subtle);border-bottom:1px solid var(--border-default);color:var(--fg-subtle);display:flex;font-family:var(--font-mono);font-size:var(--text-xs);gap:10px;padding:8px 14px}.template-frame__chrome:before{background-image:radial-gradient(circle,#ff5f57 5px,transparent 0),radial-gradient(circle,#febc2e 5px,transparent 0),radial-gradient(circle,#28c840 5px,transparent 0);background-position:0 0,20px 0,40px 0;background-repeat:no-repeat;background-size:20px 12px;content:"";display:inline-flex;height:12px;width:56px}.number-input,.template-frame__body{background:var(--bg-surface)}.number-input{align-items:stretch;border:1px solid var(--border-default);border-radius:var(--radius-sm);display:inline-flex;height:40px;overflow:hidden}.number-input.is-invalid{border-color:var(--color-danger)}.number-input.is-disabled{opacity:.55;pointer-events:none}.number-input--block{display:flex;width:100%}.number-input--block .number-input__field{flex:1 1 auto;min-width:0;text-align:left}.number-input__btn{background:var(--bg-subtle);border:none;color:var(--fg-default);cursor:pointer;font-size:var(--text-lg);font-weight:500;width:36px}.number-input__btn:hover{background:var(--color-grey-200)}.number-input__field{background:transparent;border:none;color:var(--fg-default);font-family:var(--font-body);font-size:var(--text-sm);min-width:80px;outline:none;padding:0 12px;text-align:center}.number-input__field::-webkit-inner-spin-button,.number-input__field::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.number-input__field{-moz-appearance:textfield}.number-input__affix{background:var(--bg-subtle);padding:0 8px}.number-input__affix,.pagination{align-items:center;color:var(--fg-muted);display:inline-flex;font-size:var(--text-sm)}.pagination{font-family:var(--font-body);gap:4px}.pagination__info{color:var(--fg-muted);margin-right:12px}.pagination__btn{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;font-family:var(--font-body);font-size:var(--text-sm);height:32px;min-width:32px;padding:0 8px;transition:background var(--duration-fast)}.pagination__btn:hover:not(:disabled){background:var(--bg-subtle)}.pagination__btn:disabled{cursor:not-allowed;opacity:.4}.pagination__btn.is-active{background:var(--color-primary);border-color:var(--color-primary);color:var(--color-white)}.pagination__ellipsis{color:var(--fg-muted);padding:0 4px}.kpi{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);display:flex;flex-direction:column;gap:6px;padding:16px 18px}.kpi__head{align-items:center;display:flex;justify-content:space-between}.kpi__label{font-family:var(--font-body);font-size:var(--text-xs);letter-spacing:var(--tracking-wider);text-transform:var(--tt-label)}.kpi__icon,.kpi__label{color:var(--fg-muted)}.kpi__value{color:var(--fg-default);font-family:var(--font-display);font-size:var(--text-3xl);font-weight:700;line-height:1.2}.kpi__foot{align-items:center;display:flex;font-size:var(--text-sm);gap:10px}.kpi__delta{font-weight:600}.kpi__delta--up{color:var(--color-success)}.kpi__delta--down{color:var(--color-danger)}.kpi__delta--flat,.kpi__hint{color:var(--fg-muted)}.combobox{display:inline-block;min-width:220px;position:relative}.combobox__input,.combobox__trigger{background:var(--bg-surface);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' stroke='%235b6173' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");background-position:right 12px center;background-repeat:no-repeat;border:1px solid var(--border-strong);border-radius:var(--radius-md);color:var(--fg-default);font-family:var(--font-body);font-size:var(--text-md);min-height:var(--field-min-h,44px);padding:var(--field-pad-y,10px) 38px var(--field-pad-y,10px) var(--field-pad-x,14px);width:100%}.combobox__input:focus,.combobox__trigger:focus-visible{box-shadow:var(--focus-ring-accent);outline:none}.combobox.is-invalid .combobox__input,.combobox.is-invalid .combobox__trigger{border-color:var(--color-danger)}.combobox__trigger{-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;text-align:left}.combobox__trigger[disabled]{cursor:not-allowed;opacity:.6}.combobox__trigger-placeholder{color:var(--fg-subtle)}.combobox__clear{align-items:center;background:var(--bg-subtle);border:none;border-radius:var(--radius-pill);color:var(--fg-muted);cursor:pointer;display:inline-flex;font-size:var(--text-sm);height:22px;justify-content:center;padding:0;position:absolute;right:8px;top:50%;transform:translateY(-50%);width:22px}.combobox__clear:focus-visible{box-shadow:var(--focus-ring-accent);outline:none}.combobox__list{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-sm);box-shadow:var(--shadow-md);left:0;list-style:none;margin:0;max-height:240px;overflow-y:auto;padding:4px;position:absolute;right:0;top:calc(100% + 4px);z-index:var(--z-tooltip)}.combobox__option{border-radius:var(--radius-sm);cursor:pointer;display:flex;flex-direction:column;gap:2px;padding:8px 10px}.combobox__option.is-active{background:var(--bg-subtle)}.combobox__option.is-selected{background:var(--color-primary-50);color:var(--color-primary)}.combobox__option.is-disabled{cursor:not-allowed;opacity:.4}.combobox__option-label{color:var(--fg-default);font-size:var(--text-sm)}.combobox__option-desc{color:var(--fg-muted);font-size:var(--text-xs)}.combobox__empty{color:var(--fg-muted);font-size:var(--text-sm);padding:16px;text-align:center}.datepicker{align-items:stretch;border-radius:var(--radius-sm);display:inline-flex;position:relative;width:-moz-fit-content;width:fit-content}.datepicker:focus-within{box-shadow:var(--focus-ring-accent);outline:none}.datepicker__input{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-sm) 0 0 var(--radius-sm);color:var(--fg-default);font-family:var(--font-body);font-size:var(--text-sm);height:40px;min-width:160px;padding:0 12px}.datepicker__input:focus{outline:none}.datepicker.is-invalid .datepicker__input{border-color:var(--color-danger)}.datepicker__toggle{align-items:center;background:var(--bg-subtle);border:1px solid var(--border-default);border-left:none;border-radius:0 var(--radius-sm) var(--radius-sm) 0;color:var(--fg-default);cursor:pointer;display:inline-flex;height:40px;justify-content:center;padding:0;width:40px}.datepicker__toggle:focus-visible{outline:none}.datepicker__popover{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-md);left:0;min-width:280px;padding:12px;position:absolute;top:calc(100% + 4px);z-index:var(--z-tooltip)}.datepicker__nav{align-items:center;display:flex;justify-content:space-between;margin-bottom:8px}.datepicker__nav button{background:transparent;border:none;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;height:28px;width:28px}.datepicker__nav button:hover{background:var(--bg-subtle)}.datepicker__title{font-family:var(--font-body);font-size:var(--text-sm);font-weight:600}.datepicker__grid{display:grid;gap:2px;grid-template-columns:repeat(7,1fr)}.datepicker__dow{color:var(--fg-muted);font-size:var(--text-2xs);padding:4px 0;text-align:center;text-transform:var(--tt-label)}.datepicker__day{background:transparent;border:none;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;font-family:var(--font-body);font-size:var(--text-sm);height:32px}.datepicker__day:hover:not(:disabled){background:var(--bg-subtle)}.datepicker__day.is-today{color:var(--color-primary);font-weight:700}.datepicker__day.is-selected{background:var(--color-primary);color:var(--color-white)}.datepicker__day.is-disabled,.datepicker__day:disabled{cursor:not-allowed;opacity:.3}.gridpicker{align-items:stretch;border-radius:var(--radius-sm);display:inline-flex;position:relative;width:-moz-fit-content;width:fit-content}.gridpicker:focus-within{box-shadow:var(--focus-ring-accent);outline:none}.gridpicker__input{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-sm) 0 0 var(--radius-sm);color:var(--fg-default);cursor:pointer;font-family:var(--font-body);font-size:var(--text-sm);height:40px;min-width:160px;padding:0 12px}.gridpicker__input:focus{outline:none}.gridpicker__input::-moz-placeholder{color:var(--fg-subtle)}.gridpicker__input::placeholder{color:var(--fg-subtle)}.gridpicker.is-invalid .gridpicker__input{border-color:var(--color-danger)}.gridpicker.is-disabled{opacity:.6;pointer-events:none}.gridpicker__toggle{align-items:center;background:var(--bg-subtle);border:1px solid var(--border-default);border-left:none;border-radius:0 var(--radius-sm) var(--radius-sm) 0;color:var(--fg-default);cursor:pointer;display:inline-flex;height:40px;justify-content:center;padding:0;width:40px}.gridpicker__toggle:focus-visible{box-shadow:var(--focus-ring-accent);outline:none}.gridpicker__popover{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-md);min-width:260px;padding:12px;position:absolute}.gridpicker__nav{align-items:center;display:flex;justify-content:space-between;margin-bottom:8px}.gridpicker__nav button{background:transparent;border:none;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;height:28px;width:28px}.gridpicker__nav button:hover{background:var(--bg-subtle)}.gridpicker__nav button:focus-visible{box-shadow:var(--focus-ring-accent);outline:none}.gridpicker__title{font-family:var(--font-body);font-size:var(--text-sm);font-weight:600}.gridpicker__grid{display:grid;gap:4px;grid-template-columns:repeat(3,1fr)}.gridpicker__cell{background:transparent;border:none;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;font-family:var(--font-body);font-size:var(--text-sm);min-height:44px;padding:8px 6px}.gridpicker__cell:hover:not(:disabled){background:var(--bg-subtle)}.gridpicker__cell:focus-visible{box-shadow:var(--focus-ring-accent);outline:none}.gridpicker__cell.is-out{color:var(--fg-subtle)}.gridpicker__cell.is-selected{background:var(--color-primary);color:var(--color-white)}.gridpicker__cell:disabled{cursor:not-allowed;opacity:.3}.file-upload{background:var(--bg-subtle);border:2px dashed var(--border-default);border-radius:var(--radius-md);cursor:pointer;padding:28px 20px;text-align:center;transition:background var(--duration-fast),border-color var(--duration-fast)}.file-upload.is-drag,.file-upload:hover{background:var(--color-primary-50);border-color:var(--color-primary)}.file-upload.is-disabled{opacity:.5;pointer-events:none}.file-upload__icon{color:var(--fg-muted);font-size:var(--text-3xl);margin-bottom:8px}.file-upload__title{color:var(--fg-default);font-family:var(--font-body);font-weight:600}.file-upload__hint{color:var(--fg-muted);font-size:var(--text-xs);margin-top:4px}.data-table tr.is-selected{background:var(--color-primary-50)}.data-table tr.is-clickable{cursor:pointer;position:relative}.data-table tr.is-clickable:hover{background:var(--bg-subtle)}.data-table tr.is-clickable:focus-within{box-shadow:inset 0 0 0 2px var(--border-focus)}.data-table__rowlink{background:transparent;border:0;color:transparent;cursor:pointer;font-size:0;inset:0;margin:0;padding:0;position:absolute;z-index:1}.data-table__rowlink:focus,.data-table__rowlink:focus-visible{outline:none}.data-table tr.is-clickable .data-table__cell--above,.data-table tr.is-clickable [data-row-interactive]{position:relative;z-index:2}.data-table__th{align-items:center;display:inline-flex;gap:6px}.data-table__sort{color:var(--fg-muted);font-size:var(--text-2xs)}.accordion{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);overflow:hidden}.accordion__item+.accordion__item{border-top:1px solid var(--border-default)}.accordion__trigger{align-items:center;background:transparent;border:none;color:var(--fg-default);cursor:pointer;display:flex;font-family:var(--font-body);font-size:var(--text-sm);font-weight:600;justify-content:space-between;padding:14px 16px;text-align:left;width:100%}.accordion__trigger:hover{background:var(--bg-subtle)}.accordion__chev{color:var(--fg-muted);transition:transform var(--duration-fast)}.accordion__item.is-open .accordion__chev{transform:rotate(180deg)}.accordion__panel{color:var(--fg-default);font-size:var(--text-sm);padding:0 16px 16px}.breadcrumbs{color:var(--fg-muted);font-family:var(--font-body);font-size:var(--text-sm)}.breadcrumbs ol{display:flex;flex-wrap:wrap;gap:6px;list-style:none;margin:0;padding:0}.breadcrumbs a{color:var(--fg-muted);text-decoration:none}.breadcrumbs a:hover{color:var(--color-primary);text-decoration:underline}.breadcrumbs [aria-current=page]{color:var(--fg-default);font-weight:600}.breadcrumbs__sep{color:var(--fg-subtle);margin:0 2px}.slider{align-items:center;display:inline-flex;gap:12px;width:100%}.slider__input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;height:22px;outline:none;width:100%}.slider__input::-webkit-slider-runnable-track{background:linear-gradient(to right,var(--color-primary) 0,var(--color-primary) var(--pct,0),var(--bg-muted) var(--pct,0),var(--bg-muted) 100%);border-radius:var(--radius-pill);height:6px}.slider__input::-moz-range-track{background:var(--bg-muted);border-radius:var(--radius-pill);height:6px}.slider__input::-moz-range-progress{background:var(--color-primary);border-radius:var(--radius-pill);height:6px}.slider__input::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;background:var(--bg-surface);border:2px solid var(--color-primary);border-radius:var(--radius-pill);box-shadow:var(--shadow-xs);cursor:pointer;height:18px;margin-top:-6px;width:18px}.slider__input::-moz-range-thumb{background:var(--bg-surface);border:2px solid var(--color-primary);border-radius:var(--radius-pill);cursor:pointer;height:18px;width:18px}.slider__input:focus-visible::-webkit-slider-thumb{box-shadow:0 0 0 4px rgba(0,47,135,.18)}.slider__value{color:var(--fg-default);font-family:var(--font-mono);font-size:var(--text-sm);min-width:48px;text-align:right}.progress--sm{height:4px}.progress__bar--blue{background:var(--color-primary)}.progress__bar--warning{background:var(--color-warning)}.progress__bar--danger{background:var(--color-danger)}.progress__label{color:var(--fg-muted);display:inline-block;font-family:var(--font-mono);font-size:var(--text-xs);margin-left:8px}.progress-circle{display:inline-block;position:relative}.progress-circle__label{align-items:center;color:var(--fg-default);display:flex;font-family:var(--font-display);font-size:var(--text-sm);font-weight:700;inset:0;justify-content:center;position:absolute}.tag-input{align-items:center;background:var(--bg-surface);border:1px solid var(--border-strong);border-radius:var(--radius-md);cursor:text;display:flex;flex-wrap:wrap;gap:6px;min-height:44px;padding:6px 8px}.tag-input:focus-within{border-color:var(--color-primary);box-shadow:var(--focus-ring-brand)}.tag-input.is-disabled{opacity:.55;pointer-events:none}.tag-input__tag{align-items:center;background:var(--color-primary-100);border:1px solid var(--color-primary-200);border-radius:var(--radius-pill);color:var(--color-primary-800);display:inline-flex;font-family:var(--font-body);font-size:var(--text-xs);font-weight:600;gap:4px;padding:2px 4px 2px 10px}.tag-input__tag button{align-items:center;background:transparent;border:0;border-radius:var(--radius-pill);color:inherit;cursor:pointer;display:inline-flex;height:18px;justify-content:center;line-height:1;width:18px}.tag-input__tag button:hover{background:rgba(0,0,0,.08)}.tag-input__field{background:transparent;border:0;color:var(--fg-default);flex:1;font-family:var(--font-body);font-size:var(--text-sm);min-width:80px;outline:none;padding:4px 6px}.phone-input{align-items:stretch;background:var(--bg-surface);border:1px solid var(--border-strong);border-radius:var(--radius-md);display:inline-flex;height:44px;overflow:hidden;width:100%}.phone-input:focus-within{border-color:var(--color-primary);box-shadow:var(--focus-ring-brand)}.phone-input.is-invalid{border-color:var(--color-danger)}.phone-input.is-disabled{opacity:.55;pointer-events:none}.phone-input__prefix{align-items:center;background:var(--bg-subtle);border-right:1px solid var(--border-default);color:var(--fg-muted);display:inline-flex;font-family:var(--font-mono);font-size:var(--text-sm);padding:0 12px}.phone-input__field{background:transparent;border:0;color:var(--fg-default);flex:1;font-family:var(--font-body);font-size:var(--text-sm);outline:none;padding:0 12px}.option-group{display:flex;gap:12px}.option-group--vertical{flex-direction:column}.option-group--horizontal{flex-direction:row;flex-wrap:wrap}.option-row{align-items:flex-start;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);cursor:pointer;display:flex;gap:10px;padding:10px 12px;transition:border-color var(--duration-fast),background var(--duration-fast)}.option-row:hover{background:var(--bg-subtle);border-color:var(--border-strong)}.option-row.is-disabled{cursor:not-allowed;opacity:.55}.option-row input{accent-color:var(--color-primary);margin-top:3px}.option-row__body{display:flex;flex-direction:column;gap:2px}.option-row__label{color:var(--fg-default);font-family:var(--font-body);font-size:var(--text-sm);font-weight:600}.option-row__desc{color:var(--fg-muted);font-size:var(--text-xs)}.avatar{background:var(--color-primary-100);color:var(--color-primary)}.surface-inverse .avatar,[data-tone=inverse] .avatar{background:color-mix(in srgb,var(--fg-on-brand) 16%,transparent);color:var(--fg-on-brand)}.avatar--circle{border-radius:var(--radius-pill)}.avatar--square{border-radius:var(--radius-md)}.avatar__initials{font-family:var(--font-body);font-weight:700;letter-spacing:.02em;line-height:1;transform:translateY(.06em)}.avatar__status{border:2px solid var(--bg-surface);border-radius:var(--radius-pill);bottom:4%;box-sizing:border-box;height:34%;min-height:10px;min-width:10px;position:absolute;right:4%;width:34%}.avatar__status--online{background:var(--color-success)}.avatar__status--offline{background:var(--color-gray-400)}.avatar__status--busy{background:var(--color-danger)}.avatar-group{align-items:center;display:inline-flex}.avatar-group .avatar{border:2px solid var(--bg-surface)}.avatar.avatar--overflow{background:var(--bg-muted);color:var(--fg-default);font-size:var(--text-xs)}.is-floating.is-floating{z-index:var(--z-floating)}.menu{display:inline-block;position:relative}.menu__panel{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-md);display:flex;flex-direction:column;gap:2px;max-width:320px;min-width:220px;padding:6px;z-index:var(--z-floating)}.menu__sep{background:var(--border-default);height:1px;margin:4px 0}.menu__label{color:var(--fg-subtle);font-size:var(--text-2xs);font-weight:700;letter-spacing:var(--tracking-wider);padding:6px 10px;text-transform:var(--tt-label)}.menu__item,.menu__label{font-family:var(--font-body)}.menu__item{align-items:flex-start;background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;display:flex;font-size:var(--text-sm);gap:10px;padding:8px 10px;text-align:left;width:100%}.menu__item:disabled{cursor:not-allowed;opacity:.5}.menu__item.is-active{background:var(--bg-subtle)}.menu__item.is-destructive{color:var(--color-danger)}.menu__icon{align-items:center;display:inline-flex;flex:none;height:16px;justify-content:center;margin-top:1px;width:16px}.menu__body{display:flex;flex:1;flex-direction:column;gap:2px}.menu__label-row{align-items:center;display:flex;gap:12px;justify-content:space-between}.menu__desc{color:var(--fg-muted);font-size:var(--text-xs)}.menu__kbd{background:var(--bg-subtle);border:1px solid var(--border-default);border-radius:var(--radius-sm);color:var(--fg-muted);font-family:var(--font-mono);font-size:var(--text-2xs);padding:2px 6px}.stat{display:flex;flex-direction:column;gap:4px}.stat--center{align-items:center;text-align:center}.stat__label{color:var(--fg-muted);font-family:var(--font-body);font-size:var(--text-xs);font-weight:700;letter-spacing:var(--tracking-wider);text-transform:var(--tt-label)}.stat__value{color:var(--fg-default);font-family:var(--font-display);font-size:var(--text-3xl);font-weight:700;line-height:1.1}.stat__foot{align-items:center;display:inline-flex;font-size:var(--text-xs);gap:8px}.stat__trend--up{color:var(--color-success);font-weight:700}.stat__trend--down{color:var(--color-danger);font-weight:700}.stat__trend--flat{font-weight:700}.stat__hint,.stat__trend--flat{color:var(--fg-muted)}.multicombo{min-width:240px;position:relative}.multicombo__chips{align-items:center;background:var(--bg-surface);border:1px solid var(--border-strong);border-radius:var(--radius-md);cursor:text;display:flex;flex-wrap:wrap;gap:6px;min-height:44px;padding:6px 8px}.multicombo:focus-within .multicombo__chips,.multicombo__chips:focus-within{border-color:var(--color-primary);box-shadow:var(--focus-ring-brand)}.multicombo.is-invalid .multicombo__chips{border-color:var(--color-danger)}.multicombo.is-disabled{opacity:.55;pointer-events:none}.multicombo__chip{align-items:center;background:var(--color-primary-100);border:1px solid var(--color-primary-200);border-radius:var(--radius-pill);color:var(--color-primary-800);display:inline-flex;font-family:var(--font-body);font-size:var(--text-xs);font-weight:600;gap:4px;padding:2px 4px 2px 10px}.multicombo__chip--more{background:var(--bg-muted);border-color:var(--border-default);color:var(--fg-muted);padding:2px 10px}.multicombo__chip button{align-items:center;background:transparent;border:0;border-radius:var(--radius-pill);color:inherit;cursor:pointer;display:inline-flex;height:18px;justify-content:center;line-height:1;width:18px}.multicombo__chip button:hover{background:rgba(0,0,0,.08)}.multicombo__input{background:transparent;border:0;color:var(--fg-default);flex:1;font-family:var(--font-body);font-size:var(--text-sm);min-width:80px;outline:none;padding:4px 6px}.multicombo__list{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-md);left:0;list-style:none;margin:0;max-height:280px;overflow:auto;padding:4px;position:absolute;right:0;top:calc(100% + 4px);z-index:40}.multicombo__option{align-items:center;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;display:flex;font-family:var(--font-body);font-size:var(--text-sm);gap:10px;padding:8px 10px}.multicombo__option:has(.multicombo__option-desc){align-items:flex-start}.multicombo__option.is-active{background:var(--bg-subtle)}.multicombo__option.is-selected{color:var(--color-primary);font-weight:600}.multicombo__option.is-disabled{opacity:.5;pointer-events:none}.multicombo__check{align-items:center;border:1.5px solid var(--border-strong);border-radius:var(--radius-sm);color:var(--bg-surface);display:inline-flex;flex:none;font-size:var(--text-xs);height:18px;justify-content:center;width:18px}.multicombo__option:has(.multicombo__option-desc) .multicombo__check{margin-top:1px}.multicombo__check.is-checked{background:var(--color-primary);border-color:var(--color-primary)}.multicombo__option-body{display:flex;flex-direction:column;gap:2px}.multicombo__option-label{color:var(--fg-default);font-size:var(--text-sm)}.multicombo__option-desc{color:var(--fg-muted);font-size:var(--text-xs)}.multicombo__empty{color:var(--fg-muted);font-size:var(--text-sm);padding:12px;text-align:center}.daterange{display:inline-block;position:relative}.daterange__trigger{align-items:center;background:var(--bg-surface);border:1px solid var(--border-strong);border-radius:var(--radius-md);color:var(--fg-default);cursor:pointer;display:inline-flex;font-family:var(--font-body);font-size:var(--text-sm);gap:8px;height:44px;padding:0 14px}.daterange__trigger:focus-visible{box-shadow:var(--focus-ring-accent);outline:none}.daterange.is-invalid .daterange__trigger{border-color:var(--color-danger)}.daterange.is-disabled{opacity:.55;pointer-events:none}.daterange__icon{color:var(--fg-muted)}.daterange__popover{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);display:flex;left:0;min-width:560px;position:absolute;top:calc(100% + 6px);z-index:var(--z-tooltip)}.daterange__presets{border-right:1px solid var(--border-default);display:flex;flex-direction:column;gap:2px;list-style:none;margin:0;min-width:140px;padding:8px}.daterange__presets button{background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;font-family:var(--font-body);font-size:var(--text-sm);padding:8px 10px;text-align:left;width:100%}.daterange__presets button:hover{background:var(--bg-subtle)}.daterange__panes{flex:1;padding:12px}.daterange__nav{align-items:center;display:grid;grid-template-columns:auto 1fr auto;margin-bottom:8px}.daterange__nav button{background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;font-size:var(--text-lg);height:28px;width:28px}.daterange__nav button:hover{background:var(--bg-subtle)}.daterange__months{display:grid;gap:16px;grid-template-columns:1fr 1fr}.daterange__month{font-family:var(--font-body)}.daterange__title{font-family:var(--font-display);font-size:var(--text-sm);font-weight:700;letter-spacing:var(--tracking-wide);margin-bottom:8px;text-align:center;text-transform:var(--tt-title)}.daterange__grid{display:grid;gap:2px;grid-template-columns:repeat(7,1fr)}.daterange__dow{color:var(--fg-subtle);font-family:var(--font-body);font-size:.625rem;font-weight:700;letter-spacing:var(--tracking-wider);padding:4px 0;text-align:center;text-transform:var(--tt-label)}.daterange__day{background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;font-family:var(--font-body);font-size:var(--text-sm);height:32px}.daterange__day:hover:not(:disabled){background:var(--bg-subtle)}.daterange__day.is-today{color:var(--color-primary);font-weight:700}.daterange__day.is-range{background:var(--color-primary-100);border-radius:var(--radius-none);color:var(--color-primary-800)}.daterange__day.is-selected{background:var(--color-primary);color:var(--color-white);font-weight:700}.daterange__day.is-disabled{opacity:.3;pointer-events:none}.daterange__actions{border-top:1px solid var(--border-default);display:flex;gap:8px;justify-content:flex-end;margin-top:12px;padding-top:12px}.daterange__apply,.daterange__clear{background:transparent;border:1px solid var(--border-default);border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;font-family:var(--font-body);font-size:var(--text-sm);font-weight:700;padding:6px 14px}.daterange__apply{background:var(--color-primary);border-color:var(--color-primary);color:var(--color-white)}.daterange__apply:disabled{cursor:not-allowed;opacity:.5}.cmdk__overlay{align-items:flex-start;animation:fadeIn var(--duration-base) var(--ease-standard);background:var(--backdrop);display:flex;inset:0;justify-content:center;padding-top:12vh;position:fixed;z-index:var(--z-toast)}.cmdk__panel{animation:rise var(--duration-base) var(--ease-standard);background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);display:flex;flex-direction:column;max-width:560px;overflow:hidden;width:100%}.cmdk__searchbar{align-items:center;border-bottom:1px solid var(--border-default);display:flex;gap:10px;padding:14px 16px}.cmdk__icon{color:var(--fg-muted);font-size:var(--text-lg)}.cmdk__input{background:transparent;border:0;color:var(--fg-default);flex:1;font-family:var(--font-body);font-size:var(--text-md);outline:none}.cmdk__esc{background:var(--bg-subtle);border:1px solid var(--border-default);border-radius:var(--radius-sm);color:var(--fg-muted);font-family:var(--font-mono);font-size:var(--text-2xs);padding:2px 6px}.cmdk__list{list-style:none;margin:0;max-height:60vh;overflow:auto;padding:6px}.cmdk__group{color:var(--fg-subtle);font-size:var(--text-2xs);font-weight:700;letter-spacing:var(--tracking-wider);padding:8px 10px 4px;text-transform:var(--tt-label)}.cmdk__group,.cmdk__item{font-family:var(--font-body)}.cmdk__item{align-items:center;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;display:flex;font-size:var(--text-sm);gap:12px;padding:10px 12px}.cmdk__item.is-active{background:var(--bg-subtle)}.cmdk__item-icon{color:var(--fg-muted);flex:none;width:18px}.cmdk__item-body{display:flex;flex:1;flex-direction:column;gap:2px}.cmdk__item-label{color:var(--fg-default);font-size:var(--text-sm);font-weight:500}.cmdk__item-desc{color:var(--fg-muted);font-size:var(--text-xs)}.cmdk__kbd{background:var(--bg-default);border:1px solid var(--border-default);border-radius:var(--radius-sm);color:var(--fg-muted);font-family:var(--font-mono);font-size:var(--text-2xs);padding:2px 6px}.cmdk__empty{color:var(--fg-muted);font-size:var(--text-sm);padding:24px;text-align:center}.appshell{background:var(--bg-canvas);display:grid;grid-template-columns:248px 1fr;min-height:100vh;transition:grid-template-columns var(--duration-base,.2s) var(--ease-standard,cubic-bezier(.22,1,.36,1))}.appshell.is-collapsed{grid-template-columns:72px 1fr}.appshell__sidebar{background:var(--bg-surface);border-right:1px solid var(--border-default);display:flex;flex-direction:column;height:100vh;overflow:hidden;position:sticky;top:0}.appshell__brand{align-items:center;border-bottom:1px solid var(--border-default);display:flex;font-family:var(--font-display);font-weight:700;justify-content:center;letter-spacing:var(--tracking-wide);min-height:64px;padding:12px 20px;text-transform:var(--tt-title)}.appshell.is-collapsed .appshell__brand{overflow:hidden;padding:12px}.appshell__brand-text{overflow:hidden;transition:opacity var(--duration-fast,.12s) ease,max-width var(--duration-base,.2s) var(--ease-standard,cubic-bezier(.22,1,.36,1))}.appshell.is-collapsed .appshell__brand-text{margin:0;max-width:0;opacity:0;padding:0;pointer-events:none}.appshell__foot-text{overflow:hidden;transition:opacity var(--duration-fast,.12s) ease,max-width var(--duration-base,.2s) var(--ease-standard,cubic-bezier(.22,1,.36,1));white-space:nowrap}.appshell.is-collapsed .appshell__foot-text{margin:0;max-width:0;opacity:0;padding:0;pointer-events:none}.appshell.is-collapsed .appshell__sidebar-foot{align-items:center;flex-direction:column;gap:6px;justify-content:center;overflow:hidden;padding:8px 0}.appshell.is-collapsed .appshell__collapse{margin:0 auto}.appshell__nav{flex:1;overflow:auto;padding:12px 8px}.appshell__navsection{padding:4px 0 12px}.appshell__navlabel-section{color:var(--fg-subtle);font-family:var(--font-body);font-size:var(--text-2xs);font-weight:700;letter-spacing:var(--tracking-wider);padding:10px 12px 4px;text-transform:var(--tt-label)}.appshell.is-collapsed .appshell__navlabel-section{display:none}.appshell__nav ul{list-style:none;margin:0;padding:0}.appshell__navitem{align-items:center;border-bottom:0;border-radius:var(--radius-sm);color:var(--fg-default);display:flex;font-family:var(--font-body);font-size:var(--text-sm);font-weight:600;gap:12px;margin:1px 4px;padding:10px 12px;position:relative;text-decoration:none}.appshell__navitem:hover{background:var(--bg-subtle);border-bottom:0;color:var(--fg-default)}.appshell__navitem.is-active{background:var(--color-primary-100);color:var(--color-primary)}.appshell__navitem.is-active:before{background:var(--color-secondary);border-radius:var(--radius-xs);bottom:8px;content:"";left:-4px;position:absolute;top:8px;width:3px}.appshell__navicon{align-items:center;color:var(--fg-muted);display:inline-flex;flex:none;justify-content:center;width:20px}.appshell__navitem.is-active .appshell__navicon{color:var(--color-primary)}.appshell__navlabel{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.appshell__navbadge,.appshell__navlabel{transition:opacity var(--duration-fast,.12s) ease,max-width var(--duration-base,.2s) var(--ease-standard,cubic-bezier(.22,1,.36,1))}.appshell__navbadge{background:var(--color-secondary-100);border-radius:var(--radius-pill);color:var(--color-secondary-800);font-size:var(--text-2xs);font-weight:700;padding:1px 8px}.appshell.is-collapsed .appshell__navbadge,.appshell.is-collapsed .appshell__navlabel{margin:0;max-width:0;opacity:0;overflow:hidden;padding:0;pointer-events:none}.appshell.is-collapsed .appshell__navchildren{display:none}.appshell__navlabel-section{transition:opacity var(--duration-fast,.12s) ease,visibility 0s linear 0s}.appshell.is-collapsed .appshell__navlabel-section{height:0;opacity:0;overflow:hidden;padding:0;pointer-events:none;transition:opacity var(--duration-fast,.12s) ease,visibility 0s linear var(--duration-fast,.12s);visibility:hidden}.appshell__navchildren{padding-left:28px}.appshell__navitem--depth-1{font-size:var(--text-sm);font-weight:500;padding:8px 10px}.appshell--brand .appshell__sidebar{background:var(--color-primary);border-right-color:transparent;color:var(--color-white)}.appshell--brand .appshell__brand{border-bottom-color:hsla(0,0%,100%,.12);color:var(--color-white)}.appshell--brand .appshell__navlabel-section{color:hsla(0,0%,100%,.55)}.appshell--brand .appshell__navitem{color:hsla(0,0%,100%,.85)}.appshell--brand .appshell__navitem:hover{background:hsla(0,0%,100%,.08);color:var(--color-white)}.appshell--brand .appshell__navitem.is-active{background:hsla(0,0%,100%,.16);color:var(--color-white)}.appshell--brand .appshell__navitem.is-active:before{background:var(--color-secondary)}.appshell--brand .appshell__navicon{color:hsla(0,0%,100%,.7)}.appshell--brand .appshell__navitem.is-active .appshell__navicon,.appshell--brand .appshell__navitem:hover .appshell__navicon{color:var(--color-white)}.appshell--brand .appshell__navbadge{background:var(--color-secondary);color:var(--color-white)}.appshell--brand .appshell__sidebar-foot{border-top-color:hsla(0,0%,100%,.12)}.appshell--brand .appshell__collapse{background:transparent;color:hsla(0,0%,100%,.7)}.appshell--brand .appshell__collapse:hover{background:hsla(0,0%,100%,.1);color:var(--color-white)}.appshell.appshell--header-top{grid-template-columns:1fr;grid-template-rows:auto 1fr;height:100vh}.appshell--header-top .appshell__header{align-items:center;background:var(--bg-surface);border-bottom:1px solid var(--border-default);color:var(--fg-default);display:grid;gap:12px;grid-template-columns:1fr auto 1fr;min-height:56px;padding:8px 16px}.appshell--header-top .appshell__header-left{align-items:center;display:flex;justify-self:start}.appshell--header-top .appshell__header-center{align-items:center;display:flex;justify-self:center}.appshell--header-top .appshell__header-right{align-items:center;display:flex;gap:10px;justify-self:end}.appshell--header-top .appshell__body{display:grid;grid-template-columns:240px 1fr;min-height:0;transition:grid-template-columns var(--duration-base) var(--ease-standard)}.appshell--header-top.is-collapsed .appshell__body{grid-template-columns:0 1fr}.appshell--header-top.appshell--rail.is-collapsed .appshell__body{grid-template-columns:72px 1fr}.appshell--header-top .appshell__sidebar{height:auto;overflow:hidden}.appshell--header-top .appshell__content{min-height:0;overflow-y:auto}.appshell--header-top:not(.appshell--rail) .appshell__body{position:relative;transition:none}.appshell--header-top:not(.appshell--rail).is-collapsed .appshell__sidebar{inset:0 auto 0 0;position:absolute;transform:translateX(-100%);width:240px}.appshell--header-top:not(.appshell--rail) .appshell__sidebar{transition:transform var(--duration-base) var(--ease-standard)}.appshell--header-top.appshell--header-brand .appshell__header{background:var(--color-primary);border-bottom:1px solid hsla(0,0%,100%,.12);color:var(--color-white)}.appshell__sidebar-foot{align-items:center;border-top:1px solid var(--border-default);display:flex;gap:8px;justify-content:space-between;padding:8px}.appshell__collapse{background:transparent;border:1px solid var(--border-default);border-radius:var(--radius-sm);color:var(--fg-muted);cursor:pointer;height:28px;margin-left:auto;width:28px}.appshell__collapse:hover{background:var(--bg-subtle)}.appshell__main{display:flex;flex-direction:column;min-width:0}.appshell__topbar{align-items:center;background:var(--bg-surface);border-bottom:1px solid var(--border-default);display:flex;gap:16px;min-height:64px;padding:12px 24px;position:sticky;top:0;z-index:20}.appshell__topbar-content{align-items:center;display:flex;flex:1;gap:16px;min-width:0;overflow:hidden}.appshell__topbar-user{align-items:center;display:flex;flex:none;gap:12px}.appshell__hamburger{background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;display:none;font-size:var(--text-lg);height:36px;width:36px}.appshell__hamburger:hover{background:var(--bg-subtle)}.appshell__content{min-height:0;padding:24px}.appshell__scrim{background:var(--backdrop);display:none;inset:0;position:fixed;z-index:30}@media (max-width:900px){.appshell{grid-template-columns:1fr}.appshell__sidebar{bottom:0;left:0;position:fixed;top:0;transform:translateX(-100%);transition:transform var(--duration-base) var(--ease-standard);width:280px;z-index:40}.appshell.is-mobile-open .appshell__sidebar{transform:translateX(0)}.appshell.is-mobile-open .appshell__scrim{display:block}.appshell__hamburger{align-items:center;display:inline-flex;justify-content:center}}@media (max-width:768px){.appshell__content{padding:16px}.combobox{min-width:min(220px,100%)}.multicombo{min-width:min(240px,100%)}.datepicker__input{min-width:min(160px,100%)}.number-input{min-width:min(140px,100%)}}@media (max-width:600px){.daterange__popover{flex-direction:column;min-width:0}.daterange__months{grid-template-columns:1fr}.daterange__presets{display:none}.toast-stack{left:0;padding:0 12px;right:0}.toast{max-width:none;min-width:0;width:100%}}.page-header{margin-bottom:24px}.page-header__crumbs ol{align-items:center;color:var(--fg-muted);display:flex;flex-wrap:wrap;font-family:var(--font-body);font-size:var(--text-sm);gap:6px;list-style:none;margin:0;padding:0}.page-header__crumbs a{border:0;color:var(--fg-muted)}.page-header__crumbs a:hover{color:var(--color-primary)}.page-header__crumb-sep{color:var(--fg-subtle)}.page-header__row{align-items:flex-end;display:flex;flex-wrap:wrap;gap:16px;justify-content:space-between;margin-top:8px}.page-header__title-wrap{display:flex;flex-direction:column;gap:4px;min-width:0}.page-header__title{color:var(--fg-default);font-family:var(--font-display);font-size:clamp(var(--text-xl),3vw + .75rem,var(--text-3xl));font-weight:700;letter-spacing:var(--tracking-tight);line-height:1.1;margin:0;text-transform:var(--tt-title)}.page-header__desc{color:var(--fg-muted);font-size:var(--text-sm);margin:0}.page-header__actions{display:flex;flex-wrap:wrap;gap:8px}.page-header__meta{margin-top:12px}.chart{position:relative;width:100%}.chart--donut{align-items:stretch;display:flex;flex-direction:column;gap:var(--space-3)}.chart__donut-area{position:relative;width:100%}.chart__center{align-items:center;font-size:var(--text-base);inset:0;pointer-events:none;position:absolute;text-align:center}.chart__center,.chart__legend{color:var(--fg-default);display:flex;justify-content:center}.chart__legend{flex-wrap:wrap;font-size:var(--text-xs);gap:var(--space-2) var(--space-4);list-style:none;margin:0;padding:0}.chart__legend-item{align-items:center;display:inline-flex;gap:var(--space-2)}.chart__legend-swatch{border-radius:var(--radius-xs);flex:none;height:10px;width:10px}.chart__legend-label{font-weight:500}.sparkline{display:inline-block;vertical-align:middle}.user-cell{align-items:center;display:inline-flex;gap:var(--space-3);min-width:0}.user-cell__body{display:flex;flex-direction:column;line-height:1.3;min-width:0}.user-cell__name{color:var(--fg-default);font-size:var(--text-sm);font-weight:700}.user-cell__meta,.user-cell__name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.user-cell__meta{color:var(--fg-muted);font-size:var(--text-xs)}.status-indicator{align-items:center;color:var(--fg-default);display:inline-flex;font-size:var(--text-sm);gap:var(--space-2)}.status-indicator__dot{border-radius:var(--radius-pill);flex:none;height:8px;width:8px}.status-indicator__dot--success{background:var(--color-success)}.status-indicator__dot--warning{background:var(--color-warning)}.status-indicator__dot--danger{background:var(--color-danger)}.status-indicator__dot--info{background:var(--color-info)}.status-indicator__dot--neutral{background:var(--color-gray-400)}.status-indicator__dot.is-pulsing{animation:status-pulse 1.6s ease-out infinite}@keyframes status-pulse{0%{box-shadow:0 0 0 0 currentColor}70%{box-shadow:0 0 0 8px transparent}to{box-shadow:0 0 0 0 transparent}}.timeline{display:flex;flex-direction:column;gap:var(--space-4);list-style:none;margin:0;padding:0}.timeline__item{display:flex;gap:var(--space-3);position:relative}.timeline__item:not(:last-child):before{background:var(--border-default);bottom:calc(var(--space-4)*-1 + 4px);content:"";left:11px;position:absolute;top:28px;width:2px}.timeline__marker{align-items:center;background:var(--bg-surface);border:2px solid var(--border-default);border-radius:var(--radius-pill);color:var(--fg-muted);display:inline-flex;flex:none;height:24px;justify-content:center;margin-top:2px;width:24px;z-index:1}.timeline__marker--success{border-color:var(--color-success);color:var(--color-success)}.timeline__marker--warning{border-color:var(--color-warning);color:var(--color-warning)}.timeline__marker--danger{border-color:var(--color-danger);color:var(--color-danger)}.timeline__marker--info{border-color:var(--color-info);color:var(--color-info)}.timeline__body{flex:1;min-width:0}.timeline__title{color:var(--fg-default);font-size:var(--text-sm);font-weight:700}.timeline__meta{color:var(--fg-muted);font-size:var(--text-xs);margin-top:2px}.timeline__content{color:var(--fg-default);font-size:var(--text-sm);margin-top:var(--space-2)}.tree{font-family:var(--font-body);font-size:var(--text-sm);margin:0;padding:0}.tree,.tree__node{list-style:none}.tree__row{align-items:center;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;display:flex;gap:var(--space-2);padding:var(--space-2) var(--space-2);transition:background var(--duration-fast)}.tree__row:hover{background:var(--bg-subtle)}.tree__row:focus-visible{box-shadow:var(--focus-ring-accent);outline:none}.tree__row.is-selected{background:var(--color-primary-100);color:var(--color-primary);font-weight:700}.tree__chev{align-items:center;background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-muted);cursor:pointer;display:inline-flex;flex:none;height:18px;justify-content:center;width:18px}.tree__chev:hover{background:var(--bg-muted);color:var(--fg-default)}.tree__chev--placeholder{cursor:default}.tree__icon{color:var(--fg-muted);display:inline-flex}.tree__label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tree__meta{color:var(--fg-subtle);font-size:var(--text-xs)}.tree__children{list-style:none;margin:0;padding:0}.calendar{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);font-family:var(--font-body);overflow:hidden}.calendar__head{align-items:center;border-bottom:1px solid var(--border-default);display:flex;justify-content:space-between;padding:var(--space-3) var(--space-4)}.calendar__title{color:var(--fg-default);font-family:var(--font-display);font-size:var(--text-md);font-weight:700;text-transform:var(--tt-title)}.calendar__nav{align-items:center;background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;display:inline-flex;height:32px;justify-content:center;width:32px}.calendar__nav:hover{background:var(--bg-subtle)}.calendar__grid{display:grid;grid-template-columns:repeat(7,1fr)}.calendar__weekdays{background:var(--bg-subtle);border-bottom:1px solid var(--border-default)}.calendar__weekday{color:var(--fg-muted);font-size:var(--text-2xs);font-weight:700;letter-spacing:var(--tracking-wider);padding:var(--space-2);text-align:center;text-transform:var(--tt-label)}.calendar__day{background:var(--bg-surface);border:0;border-bottom:1px solid var(--border-default);border-right:1px solid var(--border-default);color:var(--fg-default);cursor:pointer;display:flex;flex-direction:column;font-family:var(--font-body);gap:var(--space-1);min-height:84px;padding:var(--space-2);text-align:left}.calendar__day:hover{background:var(--bg-subtle)}.calendar__day:nth-child(7n){border-right:0}.calendar__day.is-out{background:var(--bg-canvas);color:var(--fg-subtle)}.calendar__day.is-today .calendar__daynum{align-items:center;background:var(--color-primary);border-radius:var(--radius-pill);color:var(--color-white);display:inline-flex;font-weight:700;height:22px;justify-content:center;width:22px}.calendar__daynum{font-size:var(--text-xs)}.calendar__events{display:flex;flex-direction:column;gap:2px;min-width:0}.calendar__event{background:var(--color-primary-100);border-radius:var(--radius-sm);color:var(--color-primary-800);cursor:pointer;font-size:var(--text-2xs);overflow:hidden;padding:1px var(--space-2);text-overflow:ellipsis;white-space:nowrap}.calendar__event--success{background:var(--color-green-100);color:var(--color-green-800)}.calendar__event--warning{background:var(--color-yellow-100);color:var(--color-yellow-800)}.calendar__event--danger{background:var(--color-red-100);color:var(--color-red-800)}.calendar__event--info{background:var(--color-info-100);color:var(--color-info-800)}.calendar__more{color:var(--fg-muted);font-size:var(--text-2xs)}.notif{display:inline-block;position:relative}.notif__trigger{align-items:center;background:transparent;border:0;border-radius:var(--radius-pill);color:var(--fg-default);cursor:pointer;display:inline-flex;height:40px;justify-content:center;position:relative;width:40px}.notif__trigger:hover{background:var(--bg-subtle)}.notif__badge{align-items:center;background:var(--color-danger);border:2px solid var(--bg-surface);border-radius:var(--radius-pill);box-sizing:border-box;color:var(--color-white);display:inline-flex;font-size:var(--text-2xs);font-weight:700;height:16px;justify-content:center;line-height:1;min-width:16px;padding:0 4px;position:absolute;right:-2px;top:-2px}.notif__panel{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);display:flex;flex-direction:column;max-height:480px;position:absolute;right:0;top:calc(100% + var(--space-2));width:380px;z-index:var(--z-dropdown)}.notif__head{align-items:center;border-bottom:1px solid var(--border-default);display:flex;gap:var(--space-2);justify-content:space-between;padding:var(--space-3) var(--space-4)}.notif__title{color:var(--fg-default);font-weight:700}.notif__head-actions{display:flex;gap:var(--space-2)}.notif__action{background:transparent;border:0;color:var(--color-primary);cursor:pointer;font-size:var(--text-xs);font-weight:700;padding:var(--space-1) var(--space-2)}.notif__action:hover{text-decoration:underline}.notif__list{flex:1;overflow-y:auto}.notif__empty{color:var(--fg-muted);font-size:var(--text-sm);padding:var(--space-8) var(--space-4);text-align:center}.notif__item{align-items:flex-start;background:transparent;border:0;border-bottom:1px solid var(--border-default);cursor:pointer;display:flex;gap:var(--space-3);padding:var(--space-3) var(--space-4);text-align:left;width:100%}.notif__item:last-child{border-bottom:0}.notif__item:hover{background:var(--bg-subtle)}.notif__item.is-unread{background:var(--color-primary-50)}.notif__dot{border-radius:var(--radius-pill);flex:none;height:8px;margin-top:6px;width:8px}.notif__dot--info{background:var(--color-info)}.notif__dot--success{background:var(--color-success)}.notif__dot--warning{background:var(--color-warning)}.notif__dot--danger{background:var(--color-danger)}.notif__body{flex:1;min-width:0}.notif__item-title{color:var(--fg-default);font-size:var(--text-sm);font-weight:700}.notif__item-desc{color:var(--fg-muted);font-size:var(--text-xs);line-height:1.4;margin-top:2px}.notif__time{color:var(--fg-subtle);font-size:var(--text-2xs);margin-top:var(--space-1)}.codeblock{background:var(--color-gray-900);border-radius:var(--radius-md);font-family:var(--font-mono);font-size:var(--text-sm);overflow:hidden}.codeblock__head{align-items:center;background:var(--color-gray-800);border-bottom:1px solid var(--color-gray-700);display:flex;justify-content:space-between;padding:var(--space-2) var(--space-3)}.codeblock__meta{align-items:center;display:flex;gap:var(--space-3)}.codeblock__filename{color:var(--color-gray-200);font-size:var(--text-xs);font-weight:700}.codeblock__lang{color:var(--color-gray-400);font-size:var(--text-2xs);letter-spacing:var(--tracking-wider);text-transform:var(--tt-label)}.codeblock__copy{align-items:center;background:transparent;border:0;border-radius:var(--radius-sm);color:var(--color-gray-200);cursor:pointer;display:inline-flex;font-family:var(--font-body);font-size:var(--text-xs);gap:var(--space-1);padding:var(--space-1) var(--space-2)}.codeblock__copy:hover{background:var(--color-gray-700)}.codeblock__body{color:var(--color-gray-100);line-height:1.5;margin:0;overflow-x:auto;padding:var(--space-4)}.jsonviewer{background:var(--bg-subtle);border:1px solid var(--border-default);border-radius:var(--radius-md);color:var(--fg-default);font-family:var(--font-mono);font-size:var(--text-xs);line-height:1.6;overflow-x:auto;padding:var(--space-3)}.json__line,.json__node{display:block}.json__children{padding-left:var(--space-4)}.json__toggle{background:transparent;border:0;color:var(--fg-muted);cursor:pointer;font-family:var(--font-mono);font-size:var(--text-xs);padding:0 var(--space-1) 0 0}.json__key{color:var(--color-info-700)}.json__str{color:var(--color-green-700)}.json__num{color:var(--color-secondary-700)}.json__bool{color:var(--color-info);font-weight:700}.json__null{color:var(--fg-subtle);font-style:italic}.json__brace{color:var(--fg-muted)}.json__count{color:var(--fg-subtle);font-size:var(--text-2xs);padding:0 var(--space-2)}.filter-panel{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);flex:none;width:240px}.filter-panel__head{align-items:center;border-bottom:1px solid var(--border-default);display:flex;justify-content:space-between;padding:var(--space-3) var(--space-4)}.filter-panel__title{color:var(--fg-default);gap:var(--space-2)}.filter-panel__count,.filter-panel__title{align-items:center;display:inline-flex;font-weight:700}.filter-panel__count{background:var(--color-primary);border-radius:var(--radius-pill);color:var(--color-white);font-size:var(--text-2xs);justify-content:center;min-width:18px;padding:0 var(--space-2)}.filter-panel__clear{background:transparent;border:0;color:var(--color-primary);cursor:pointer;font-size:var(--text-xs);font-weight:700}.filter-panel__body{padding:var(--space-2)}.filter-section{border-bottom:1px solid var(--border-default)}.filter-section:last-child{border-bottom:0}.filter-section__head{align-items:center;background:transparent;border:0;color:var(--fg-default);cursor:pointer;display:flex;font-family:var(--font-body);font-size:var(--text-sm);font-weight:700;justify-content:space-between;padding:var(--space-3) var(--space-2);width:100%}.filter-section__head:hover{color:var(--color-primary)}.filter-section__body{display:flex;flex-direction:column;gap:var(--space-2);padding:0 var(--space-2) var(--space-3)}.filter-bar{align-items:flex-end;display:flex;flex-wrap:wrap}.filter-bar,.filter-bar__fields{gap:var(--space-3) var(--space-4)}.filter-bar__fields{display:grid;flex:1 1 auto;grid-template-columns:repeat(auto-fit,minmax(var(--filter-col-min,160px),1fr))}.filter-bar--fixed-cols .filter-bar__fields{grid-template-columns:repeat(var(--filter-cols,4),minmax(0,1fr))}.filter-bar__actions{align-items:flex-end;display:flex;gap:var(--space-2)}.filter-bar .combobox{display:block;min-width:0;width:100%}.filter-field{display:flex;flex-direction:column;gap:4px;min-width:0}.filter-field__label{color:var(--fg-muted);font-family:var(--font-body);font-size:var(--text-xs);font-weight:500;letter-spacing:normal;text-transform:none}.bulk-bar{align-items:center;background:var(--color-gray-900);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);color:var(--color-white);display:flex;gap:var(--space-3);padding:var(--space-2) var(--space-4)}.bulk-bar__count{font-size:var(--text-sm);font-weight:700;gap:var(--space-2)}.bulk-bar__clear,.bulk-bar__count{align-items:center;display:inline-flex}.bulk-bar__clear{background:transparent;border:0;border-radius:var(--radius-sm);color:var(--color-white);cursor:pointer;height:24px;justify-content:center;margin-left:var(--space-1);opacity:.85;width:24px}.bulk-bar__clear:hover{background:hsla(0,0%,100%,.12);opacity:1}.bulk-bar__clear:focus-visible{box-shadow:0 0 0 2px var(--color-white);outline:none}.bulk-bar__actions{display:flex;gap:var(--space-2);margin-left:auto}.bulk-bar .btn--outline{background:transparent;border-color:hsla(0,0%,100%,.4);color:var(--color-white)}.bulk-bar .btn--outline:hover:not(:disabled){background:hsla(0,0%,100%,.12);border-color:var(--color-white);color:var(--color-white)}.bulk-bar .btn--ghost{color:var(--color-white)}.bulk-bar .btn--ghost:hover:not(:disabled){background:hsla(0,0%,100%,.12)}.bulk-bar .btn--secondary{background:hsla(0,0%,100%,.1);border-color:transparent;color:var(--color-white)}.bulk-bar .btn--secondary:hover:not(:disabled){background:hsla(0,0%,100%,.18)}.sort-dropdown{align-items:center;display:inline-flex;gap:var(--space-2)}.sort-dropdown__label{color:var(--fg-muted);font-size:var(--text-sm);white-space:nowrap}.sort-dropdown__select{min-height:36px;min-width:180px;padding:var(--space-2) var(--space-3)}.comments{gap:var(--space-4)}.comments,.comments__list{display:flex;flex-direction:column}.comments__list{gap:var(--space-3);list-style:none;margin:0;padding:0}.comment{background:var(--bg-subtle);border-radius:var(--radius-md);display:flex;gap:var(--space-3);padding:var(--space-3)}.comment--internal{background:var(--color-yellow-50);border:1px dashed var(--color-yellow-300)}.comment__body{flex:1;min-width:0}.comment__head{align-items:center;display:flex;flex-wrap:wrap;gap:var(--space-2)}.comment__author{color:var(--fg-default);font-size:var(--text-sm);font-weight:700}.comment__time{color:var(--fg-subtle);font-size:var(--text-xs)}.comment__tag{background:var(--color-yellow-200);border-radius:var(--radius-sm);color:var(--color-yellow-900);font-size:var(--text-2xs);font-weight:700;letter-spacing:var(--tracking-wider);padding:0 var(--space-2);text-transform:var(--tt-label)}.comment__text{color:var(--fg-default);font-size:var(--text-sm);line-height:1.5;margin-top:var(--space-1)}.comments__compose{display:flex;flex-direction:column;gap:var(--space-2)}.comments__compose-actions{align-items:center;display:flex;gap:var(--space-3);justify-content:space-between}.comments__internal-toggle{align-items:center;color:var(--fg-muted);cursor:pointer;display:inline-flex;font-size:var(--text-sm);gap:var(--space-2)}.attachments{display:flex;flex-direction:column;gap:var(--space-2);list-style:none;margin:0;padding:0}.attachments__empty{border:1px dashed var(--border-default);border-radius:var(--radius-md);color:var(--fg-muted);font-size:var(--text-sm);padding:var(--space-4);text-align:center}.attachment{align-items:center;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);display:flex;gap:var(--space-3);padding:var(--space-2) var(--space-3)}.attachment__icon{color:var(--fg-muted);flex:none}.attachment__body{flex:1;min-width:0}.attachment__name{color:var(--fg-default);font-size:var(--text-sm);font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.attachment__meta{color:var(--fg-subtle);display:flex;flex-wrap:wrap;font-size:var(--text-xs);gap:var(--space-1)}.attachment__actions{display:flex;flex:none;gap:var(--space-1)}.attachment__action{align-items:center;background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-muted);cursor:pointer;display:inline-flex;height:32px;justify-content:center;text-decoration:none;width:32px}.attachment__action:hover{background:var(--bg-subtle);color:var(--fg-default)}.attachment__action--danger:hover{color:var(--color-danger)}.confirm__desc{color:var(--fg-default);font-size:var(--text-sm);line-height:1.5;margin:0}.desc-list{display:grid;gap:var(--space-2) var(--space-4);grid-template-columns:200px 1fr;margin:0}.desc-list__label{color:var(--fg-muted);font-size:var(--text-sm);font-weight:700}.desc-list__value{align-items:center;color:var(--fg-default);display:flex;font-size:var(--text-sm);gap:var(--space-2);justify-content:space-between;margin:0}.desc-list__edit{background:transparent;border:0;color:var(--color-primary);cursor:pointer;font-size:var(--text-xs);font-weight:700}.desc-list__edit:hover{text-decoration:underline}.diff{border:1px solid var(--border-default);border-radius:var(--radius-md);display:grid;font-size:var(--text-sm);grid-template-columns:200px 1fr 1fr;overflow:hidden}.diff__head{display:contents}.diff__head>div{background:var(--bg-subtle);border-bottom:1px solid var(--border-default);color:var(--fg-muted);font-size:var(--text-xs);font-weight:700;letter-spacing:var(--tracking-wide);padding:var(--space-2) var(--space-3);text-transform:var(--tt-label)}.diff__row{display:contents}.diff__row>div{border-bottom:1px solid var(--border-default);padding:var(--space-2) var(--space-3)}.diff__row:last-child>div{border-bottom:0}.diff__field{color:var(--fg-muted);font-weight:700}.diff__before{background:var(--color-red-50);color:var(--color-red-800)}.diff__after{background:var(--color-green-50);color:var(--color-green-800)}.diff__after ins,.diff__before del{text-decoration:none}@media (max-width:600px){.desc-list{gap:var(--space-1) 0;grid-template-columns:1fr}.desc-list__label{padding-top:var(--space-2)}.desc-list__value{border-bottom:1px solid var(--border-subtle);padding-bottom:var(--space-2)}.desc-list__value:last-of-type{border-bottom:0}.diff{grid-template-columns:1fr}.diff__head{display:none}.diff__row>div{border-bottom:0;padding:var(--space-2) var(--space-3)}.diff__row{border-bottom:1px solid var(--border-default);padding-bottom:var(--space-2)}.diff__row:last-child{border-bottom:0}.diff__field{background:var(--bg-subtle);font-size:var(--text-xs);letter-spacing:var(--tracking-wide);text-transform:var(--tt-label)}.diff__after[data-label]:before,.diff__before[data-label]:before{color:var(--fg-muted);content:attr(data-label) ": ";font-weight:700;margin-right:var(--space-1)}}.transfer{align-items:stretch;display:grid;gap:var(--space-3);grid-template-columns:1fr auto 1fr}.transfer__col{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);display:flex;flex-direction:column;min-width:0;overflow:hidden}.transfer__col-head{align-items:center;background:var(--bg-subtle);border-bottom:1px solid var(--border-default);display:flex;justify-content:space-between;padding:var(--space-2) var(--space-3)}.transfer__col-title{color:var(--fg-default);font-size:var(--text-sm);font-weight:700}.transfer__col-count{background:var(--bg-muted);border-radius:var(--radius-pill);color:var(--fg-muted);font-size:var(--text-xs);padding:0 var(--space-2)}.transfer__list{flex:1;list-style:none;margin:0;max-height:320px;overflow-y:auto;padding:var(--space-1)}.transfer__empty{color:var(--fg-muted);font-size:var(--text-sm);padding:var(--space-4);text-align:center}.transfer__item{align-items:center;border-radius:var(--radius-sm);cursor:pointer;display:flex;gap:var(--space-2);padding:var(--space-2)}.transfer__item:has(.transfer__item-desc){align-items:flex-start}.transfer__item:hover{background:var(--bg-subtle)}.transfer__item.is-checked{background:var(--color-primary-50)}.transfer__item.is-disabled{cursor:not-allowed;opacity:.5}.transfer__item-body{color:var(--fg-default);flex:1;font-size:var(--text-sm);min-width:0}.transfer__item-desc{color:var(--fg-muted);font-size:var(--text-xs)}.transfer__controls{display:flex;flex-direction:column;gap:var(--space-2);justify-content:center}.permissions{border:1px solid var(--border-default);border-radius:var(--radius-md);overflow-x:auto}.permissions__table{border-collapse:collapse;font-family:var(--font-body);font-size:var(--text-sm);width:100%}.permissions__table td,.permissions__table th{border-bottom:1px solid var(--border-default);padding:var(--space-3)}.permissions__table thead th{background:var(--bg-subtle);text-align:left}.permissions__action-col{min-width:240px}.permissions__role-col{min-width:120px;text-align:center}.permissions__role-head{align-items:center;display:flex;flex-direction:column;gap:var(--space-1)}.permissions__role-toggle{background:transparent;border:0;color:var(--color-primary);cursor:pointer;font-size:var(--text-2xs);font-weight:700}.permissions__action-cell{color:var(--fg-default);font-weight:600;text-align:left}.permissions__action-desc{color:var(--fg-muted);font-size:var(--text-xs);font-weight:400;margin-top:2px}.permissions__cell{text-align:center}.gallery{display:flex;flex-direction:column;gap:var(--space-3)}.gallery--thumbs-left{flex-direction:row}.gallery__main{aspect-ratio:1;background:var(--bg-subtle);border-radius:var(--radius-lg);flex:1;overflow:hidden;position:relative}.gallery__image{display:block;height:100%;-o-object-fit:contain;object-fit:contain;width:100%}.gallery__nav{align-items:center;background:rgba(0,0,0,.5);border:0;border-radius:var(--radius-pill);color:var(--color-white);cursor:pointer;display:inline-flex;height:40px;justify-content:center;opacity:0;position:absolute;top:50%;transform:translateY(-50%);transition:opacity var(--duration-fast);width:40px}.gallery__main:hover .gallery__nav{opacity:1}.gallery__nav--prev{left:var(--space-3)}.gallery__nav--next{right:var(--space-3)}.gallery__thumbs{display:flex;flex-wrap:wrap;gap:var(--space-2)}.gallery--thumbs-left .gallery__thumbs{flex-direction:column;flex-wrap:nowrap;max-width:80px}.gallery__thumb{background:var(--bg-subtle);border:2px solid transparent;border-radius:var(--radius-md);cursor:pointer;height:64px;overflow:hidden;padding:0;width:64px}.gallery__thumb img{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.gallery__thumb.is-active{border-color:var(--color-primary)}.lightbox{align-items:center;background:rgba(12,18,32,.92);cursor:zoom-out;display:flex;inset:0;justify-content:center;padding:var(--space-8);position:fixed;z-index:var(--z-tooltip)}.lightbox__image{cursor:default;max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain}.lightbox__close,.lightbox__nav{align-items:center;background:hsla(0,0%,100%,.1);border:0;border-radius:var(--radius-pill);color:var(--color-white);cursor:pointer;display:inline-flex;height:48px;justify-content:center;position:absolute;width:48px}.lightbox__close:hover,.lightbox__nav:hover{background:hsla(0,0%,100%,.2)}.lightbox__close{right:var(--space-4);top:var(--space-4)}.lightbox__nav--prev{left:var(--space-4);top:50%;transform:translateY(-50%)}.lightbox__nav--next{right:var(--space-4);top:50%;transform:translateY(-50%)}.lightbox__counter{bottom:var(--space-4);color:var(--color-white);font-family:var(--font-mono);font-size:var(--text-sm);left:50%;position:absolute;transform:translateX(-50%)}.rating{display:inline-flex;gap:2px}.rating__star{background:transparent;border:0;color:var(--color-gray-300);cursor:default;display:inline-flex;padding:2px}.rating--interactive .rating__star{cursor:pointer}.rating--interactive .rating__star:hover{color:var(--color-yellow-400)}.rating__star.is-full,.rating__star.is-half{color:var(--color-yellow-500)}.rating__star.is-half{opacity:.6}.price{align-items:baseline;display:inline-flex;flex-wrap:wrap;font-family:var(--font-body);gap:var(--space-2)}.price__amount{color:var(--fg-default);font-weight:700}.price__compare{color:var(--fg-subtle);font-size:.85em}.price__discount{background:var(--color-red-100);border-radius:var(--radius-sm);color:var(--color-red-800);font-size:var(--text-xs);font-weight:700;padding:2px var(--space-2)}.price--sm .price__amount{font-size:var(--text-md)}.price--md .price__amount{font-size:var(--text-lg)}.price--lg .price__amount{font-size:var(--text-2xl)}.price--xl .price__amount{font-family:var(--font-display);font-size:var(--text-3xl)}.qty{align-items:center;background:var(--bg-surface);border:1px solid var(--border-strong);border-radius:var(--radius-md);display:inline-flex;overflow:hidden}.qty.is-disabled{opacity:.5;pointer-events:none}.qty__btn{align-items:center;background:transparent;border:0;color:var(--fg-default);cursor:pointer;display:inline-flex;height:32px;justify-content:center;width:32px}.qty__btn:hover:not(:disabled){background:var(--bg-subtle)}.qty__btn:disabled{cursor:not-allowed;opacity:.4}.qty__input{-moz-appearance:textfield;background:transparent;border:0;border-left:1px solid var(--border-default);border-right:1px solid var(--border-default);color:var(--fg-default);font-family:var(--font-body);font-size:var(--text-sm);height:32px;text-align:center;width:44px}.qty__input::-webkit-inner-spin-button,.qty__input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.qty--sm .qty__btn{height:28px;width:28px}.qty--sm .qty__input{font-size:var(--text-xs);height:28px;width:36px}.variants{display:flex;flex-direction:column;gap:var(--space-2)}.variants__label{color:var(--fg-default);font-size:var(--text-sm);font-weight:700}.variants__options{display:flex;flex-wrap:wrap;gap:var(--space-2)}.variants__chip{background:var(--bg-surface);border:1px solid var(--border-strong);border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;font-family:var(--font-body);font-size:var(--text-sm);font-weight:700;padding:var(--space-2) var(--space-3)}.variants__chip.is-selected,.variants__chip:hover:not(:disabled){border-color:var(--color-primary)}.variants__chip.is-selected{background:var(--color-primary);color:var(--color-white)}.variants__chip.is-disabled{cursor:not-allowed;opacity:.4;text-decoration:line-through}.variants__swatch{align-items:center;border:2px solid var(--border-default);border-radius:var(--radius-pill);color:var(--color-white);cursor:pointer;display:inline-flex;height:32px;justify-content:center;position:relative;width:32px}.variants__swatch.is-selected{border-color:var(--color-primary);box-shadow:0 0 0 2px var(--bg-surface),0 0 0 4px var(--color-primary)}.variants__swatch.is-disabled{cursor:not-allowed;opacity:.4}.wishlist{align-items:center;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-pill);color:var(--fg-muted);cursor:pointer;display:inline-flex;height:36px;justify-content:center;transition:color var(--duration-fast),background var(--duration-fast);width:36px}.wishlist.is-active,.wishlist:hover{color:var(--color-danger)}.wishlist.is-active{background:var(--color-red-50);border-color:var(--color-red-200)}.promo{flex-direction:column}.promo,.promo__row{display:flex;gap:var(--space-2)}.promo__input{flex:1;letter-spacing:var(--tracking-wide);text-transform:var(--tt-label)}.promo__message{border-radius:var(--radius-sm);font-size:var(--text-xs);padding:var(--space-1) var(--space-2)}.promo__message--success{background:var(--color-green-50);color:var(--color-green-800)}.promo__message--error{background:var(--color-red-50);color:var(--color-red-800)}.shipping-progress{display:flex;flex-direction:column;gap:var(--space-2)}.shipping-progress__text{color:var(--fg-default);font-size:var(--text-sm)}.shipping-progress__track{background:var(--bg-muted);border-radius:var(--radius-pill);height:6px;overflow:hidden}.shipping-progress__bar{background:var(--color-secondary);height:100%;transition:width var(--duration-base) var(--ease-standard)}.shipping-progress.is-achieved .shipping-progress__bar{background:var(--color-success)}.shipping-progress.is-achieved .shipping-progress__text{color:var(--color-green-800);font-weight:700}.cart__empty{color:var(--fg-muted);font-size:var(--text-sm);padding:var(--space-12) var(--space-4);text-align:center}.cart__list{flex-direction:column;list-style:none;margin:0;padding:0}.cart__item,.cart__list{display:flex;gap:var(--space-3)}.cart__item{background:var(--bg-subtle);border-radius:var(--radius-md);padding:var(--space-3)}.cart__item-media{background:var(--bg-surface);border-radius:var(--radius-sm);flex:none;height:64px;overflow:hidden;width:64px}.cart__item-media img{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.cart__item-placeholder{background:var(--bg-muted);height:100%;width:100%}.cart__item-body{display:flex;flex:1;flex-direction:column;gap:var(--space-1);min-width:0}.cart__item-name{color:var(--fg-default);font-size:var(--text-sm);font-weight:700}.cart__item-variant{color:var(--fg-muted);font-size:var(--text-xs)}.cart__item-price{color:var(--color-primary);font-size:var(--text-sm);font-weight:700}.cart__item-actions{align-items:flex-end;display:flex;flex-direction:column;gap:var(--space-2)}.cart__item-qty{color:var(--fg-muted);font-size:var(--text-sm);font-weight:700}.cart__item-remove{background:transparent;border:0;color:var(--fg-muted);cursor:pointer;padding:var(--space-1)}.cart__item-remove:hover{color:var(--color-danger)}.cart__footer{display:flex;flex-direction:column;gap:var(--space-3);width:100%}.cart__totals{align-items:center;display:flex;font-size:var(--text-md);justify-content:space-between}.order-summary{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);padding:var(--space-4)}.order-summary__title{border-bottom:1px solid var(--border-default);color:var(--fg-default);font-size:var(--text-md);font-weight:700;margin-bottom:var(--space-3);padding-bottom:var(--space-2)}.order-summary__list{display:flex;flex-direction:column;gap:var(--space-2);margin:0}.order-summary__row{align-items:center;color:var(--fg-default);display:flex;font-size:var(--text-sm);gap:var(--space-3);justify-content:space-between}.order-summary__row dt{color:var(--fg-muted);margin:0}.order-summary__row dd{color:var(--fg-default);font-weight:600;margin:0}.order-summary__row.is-emphasis{border-top:1px solid var(--border-default);font-size:var(--text-md);padding-top:var(--space-2)}.order-summary__row.is-emphasis dd,.order-summary__row.is-emphasis dt{color:var(--fg-default);font-weight:700}.address-form{display:grid;gap:var(--space-3) var(--space-3);grid-template-columns:repeat(6,1fr)}.address-form__field--full{grid-column:span 6}.address-form__field--half{grid-column:span 3}.address-form__field--third{grid-column:span 2}@media (max-width:600px){.address-form__field--half,.address-form__field--third{grid-column:span 6}}.compare{border:1px solid var(--border-default);border-radius:var(--radius-lg);overflow-x:auto}.compare__table{border-collapse:collapse;font-family:var(--font-body);font-size:var(--text-sm);width:100%}.compare__table td,.compare__table th{border-bottom:1px solid var(--border-default);padding:var(--space-3);text-align:center;vertical-align:top}.compare__head{align-items:center;display:flex;flex-direction:column;gap:var(--space-2);position:relative}.compare__img{height:80px;-o-object-fit:contain;object-fit:contain;width:80px}.compare__name{color:var(--fg-default);font-weight:700}.compare__price{color:var(--color-primary);font-weight:700}.compare__remove{align-items:center;background:var(--bg-subtle);border:0;border-radius:var(--radius-pill);color:var(--fg-muted);cursor:pointer;display:inline-flex;height:24px;justify-content:center;position:absolute;right:0;top:0;width:24px}.compare__remove:hover{background:var(--color-red-50);color:var(--color-danger)}.compare__attr{background:var(--bg-subtle);color:var(--fg-muted);font-weight:700;text-align:left}.compare__cell{color:var(--fg-default)}.hero{--hero-fg:var(--fg-default);background-position:50%;background-size:cover;border-radius:var(--radius-lg);color:var(--hero-fg);padding:var(--space-12) var(--space-6);position:relative}.hero--brand{background:var(--color-primary)}.hero--brand,.hero--inverse{--hero-fg:var(--color-white)}.hero--inverse{background:var(--color-ink)}.hero--subtle{--hero-fg:var(--fg-default);background:var(--bg-subtle)}.hero--image{--hero-fg:var(--color-white)}.hero--image:before{background:linear-gradient(180deg,transparent,rgba(12,18,32,.6));border-radius:inherit;content:"";inset:0;position:absolute}.hero--sm{padding:var(--space-8) var(--space-6)}.hero--lg{padding:var(--space-20) var(--space-8)}.hero__inner{display:flex;flex-direction:column;gap:var(--space-3);max-width:720px;position:relative;width:100%}.hero--align-center .hero__inner{align-items:center;margin:0 auto;text-align:center}.hero--align-end .hero__inner{align-items:flex-end;margin-left:auto;text-align:right}.hero__eyebrow{font-size:var(--text-sm);letter-spacing:var(--tracking-wider);opacity:.85;text-transform:var(--tt-label)}.hero__eyebrow,.hero__title{color:var(--hero-fg);font-weight:700}.hero__title{font-family:var(--font-display);font-size:clamp(var(--text-3xl),5vw + 1rem,var(--text-5xl));letter-spacing:var(--tracking-tight);line-height:var(--leading-tight);margin:0;text-transform:var(--tt-title)}.hero--sm .hero__title{font-size:var(--text-3xl)}.hero__subtitle{color:var(--hero-fg);font-size:var(--text-lg);line-height:var(--leading-relaxed);margin:0;opacity:.92}.hero__actions{display:flex;flex-wrap:wrap;gap:var(--space-3);margin-top:var(--space-3)}.hero--align-center .hero__actions{justify-content:center}.hero--align-end .hero__actions{justify-content:flex-end}.hero--brand .hero__actions .btn--outline,.hero--image .hero__actions .btn--outline,.hero--inverse .hero__actions .btn--outline{background:transparent;border-color:hsla(0,0%,100%,.6);color:var(--color-white)}.hero--brand .hero__actions .btn--outline:hover:not(:disabled),.hero--image .hero__actions .btn--outline:hover:not(:disabled),.hero--inverse .hero__actions .btn--outline:hover:not(:disabled){background:hsla(0,0%,100%,.15);border-color:var(--color-white);color:var(--color-white)}.hero--brand .hero__actions .btn--ghost,.hero--image .hero__actions .btn--ghost,.hero--inverse .hero__actions .btn--ghost{color:var(--color-white)}.hero--brand .hero__actions .btn--ghost:hover:not(:disabled),.hero--image .hero__actions .btn--ghost:hover:not(:disabled),.hero--inverse .hero__actions .btn--ghost:hover:not(:disabled){background:hsla(0,0%,100%,.12)}.hero--brand .hero__actions .btn--primary,.hero--image .hero__actions .btn--primary,.hero--inverse .hero__actions .btn--primary{background:var(--color-white);color:var(--color-primary)}.hero--brand .hero__actions .btn--primary:hover:not(:disabled),.hero--image .hero__actions .btn--primary:hover:not(:disabled),.hero--inverse .hero__actions .btn--primary:hover:not(:disabled){background:hsla(0,0%,100%,.88)}.testimonial{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);display:flex;flex-direction:column;gap:var(--space-3);margin:0;padding:var(--space-6)}.testimonial__rating{color:var(--color-gray-300);display:inline-flex;gap:2px}.testimonial__rating .is-filled{color:var(--color-yellow-500)}.testimonial__quote{color:var(--fg-default);font-family:var(--font-body);font-size:var(--text-lg);font-style:italic;line-height:var(--leading-relaxed);margin:0}.testimonial__caption{align-items:center;display:flex;gap:var(--space-3);margin:0}.testimonial__avatar{border-radius:var(--radius-pill);height:40px;-o-object-fit:cover;object-fit:cover;width:40px}.testimonial__author{color:var(--fg-default);font-size:var(--text-sm);font-weight:700}.testimonial__meta{color:var(--fg-muted);font-size:var(--text-xs)}.category-nav{display:block}.category-nav__list{display:flex;gap:var(--space-1);list-style:none;margin:0;padding:0}.category-nav__item{position:relative}.category-nav__link{align-items:center;background:transparent;border:0;color:var(--fg-default);cursor:pointer;display:inline-flex;font-family:var(--font-body);font-size:var(--text-sm);font-weight:700;gap:var(--space-1);padding:var(--space-3) var(--space-4);text-decoration:none}.category-nav__link.is-open,.category-nav__link:hover{color:var(--color-primary)}.category-nav__mega{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);display:grid;gap:var(--space-5);grid-template-columns:repeat(auto-fit,minmax(180px,1fr));left:0;min-width:480px;padding:var(--space-5);position:absolute;top:100%;z-index:var(--z-dropdown)}.category-nav__group-title{color:var(--fg-muted);font-size:var(--text-xs);font-weight:700;letter-spacing:var(--tracking-wider);margin-bottom:var(--space-2);text-transform:var(--tt-label)}.category-nav__group-items{display:flex;flex-direction:column;gap:var(--space-1);list-style:none;margin:0;padding:0}.category-nav__group-items a{border:0;color:var(--fg-default);font-size:var(--text-sm);padding:var(--space-1) 0;text-decoration:none}.category-nav__group-items a:hover{color:var(--color-primary)}.popover{display:inline-block;position:relative}.popover__trigger{cursor:pointer;display:inline-flex}.popover__content{animation:popover-fade var(--duration-fast,.12s) var(--ease-standard,cubic-bezier(.22,1,.36,1));background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);color:var(--fg-default);font-size:var(--text-sm);max-width:320px;min-width:200px;padding:var(--space-3);z-index:var(--z-popover,1300)}@keyframes popover-fade{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.hover-card{display:inline-block;position:relative}.hover-card__trigger{display:inline-flex}.hover-card__content{animation:popover-fade var(--duration-fast,.12s) var(--ease-standard,cubic-bezier(.22,1,.36,1));background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);color:var(--fg-default);font-size:var(--text-sm);max-width:320px;min-width:220px;padding:var(--space-3);z-index:var(--z-popover,1300)}.context-menu{display:inline-block}.context-menu__menu{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);font-size:var(--text-sm);list-style:none;margin:0;min-width:200px;padding:var(--space-1)}.context-menu__item{align-items:center;background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;display:flex;gap:var(--space-2);padding:var(--space-2) var(--space-3);text-align:left;width:100%}.context-menu__item:hover:not(:disabled){background:var(--bg-subtle)}.context-menu__item.is-disabled,.context-menu__item:disabled{cursor:not-allowed;opacity:.5}.context-menu__item--danger{color:var(--color-danger)}.context-menu__icon{display:inline-flex}.context-menu__separator{background:var(--border-default);height:1px;margin:var(--space-1) 0}.toggle{align-items:center;background:transparent;border:1px solid transparent;border-radius:var(--radius-md);color:var(--fg-default);cursor:pointer;display:inline-flex;font-weight:500;gap:var(--space-2);justify-content:center;transition:background var(--duration-fast,.12s),color var(--duration-fast,.12s),border-color var(--duration-fast,.12s)}.toggle--sm{font-size:var(--text-xs);height:28px;padding:4px var(--space-2)}.toggle--md{font-size:var(--text-sm);height:36px;padding:6px var(--space-3)}.toggle--lg{font-size:var(--text-base);height:44px;padding:8px var(--space-4)}.toggle--outline{border-color:var(--border-default)}.toggle:hover:not(:disabled):not(.is-pressed):not([aria-pressed=true]){background:var(--bg-subtle)}.toggle.is-pressed,.toggle[aria-pressed=true]{background:var(--bg-inverse,var(--fg-default));border-color:transparent;color:var(--bg-canvas)}.toggle.is-pressed:hover:not(:disabled),.toggle[aria-pressed=true]:hover:not(:disabled){filter:brightness(1.15)}.toggle:disabled{cursor:not-allowed;opacity:.5}.toggle-group{background:var(--bg-subtle);border:1px solid var(--border-default);border-radius:var(--radius-md);display:inline-flex;gap:2px;padding:2px}.toggle-group__item{border:0;border-radius:calc(var(--radius-md) - 2px)}.toggle-group__item:hover:not(:disabled){background:var(--bg-surface)}.toggle-group__item.is-pressed,.toggle-group__item[aria-pressed=true]{background:var(--bg-surface);box-shadow:var(--shadow-sm);color:var(--fg-default)}.toggle-group--segmented{display:flex}.toggle-group--segmented .toggle-group__item{flex:1 1 0}.input-otp{display:inline-flex;gap:var(--space-2)}.input-otp__slot{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);caret-color:var(--color-primary);color:var(--fg-default);font-family:var(--font-mono,ui-monospace,monospace);font-size:var(--text-xl);font-weight:600;height:52px;text-align:center;transition:border-color var(--duration-fast,.12s),box-shadow var(--duration-fast,.12s);width:44px}.input-otp__slot:focus{border-color:var(--border-focus,var(--color-primary));box-shadow:0 0 0 3px color-mix(in srgb,var(--color-primary) 25%,transparent);outline:none}.input-otp.is-invalid .input-otp__slot{border-color:var(--color-danger)}.input-otp.is-disabled .input-otp__slot{opacity:.5}.separator{background:var(--border-default);flex:none}.separator--horizontal{height:1px;width:100%}.separator--vertical{align-self:stretch;height:100%;width:1px}.carousel{position:relative}.carousel:focus{outline:none}.carousel:focus-visible{border-radius:var(--radius-md);box-shadow:var(--focus-ring-accent);outline:none}.carousel__viewport{border-radius:var(--radius-lg);overflow:hidden;position:relative}.carousel__track{display:flex;transition:transform .32s var(--ease-standard,cubic-bezier(.22,1,.36,1))}.carousel__slide{flex:0 0 100%;min-width:0}.carousel__control{align-items:center;background:color-mix(in srgb,var(--bg-surface) 90%,transparent);border:1px solid var(--border-default);border-radius:var(--radius-pill);box-shadow:var(--shadow-sm);color:var(--fg-default);cursor:pointer;display:inline-flex;height:40px;justify-content:center;position:absolute;top:50%;transform:translateY(-50%);width:40px}.carousel__control:hover:not(:disabled){background:var(--bg-surface)}.carousel__control:disabled{cursor:not-allowed;opacity:.4}.carousel__control--prev{left:var(--space-2)}.carousel__control--next{right:var(--space-2)}.carousel__dots{display:flex;gap:var(--space-2);justify-content:center;list-style:none;margin-top:var(--space-3);padding:0}.carousel__dot{background:var(--border-strong,var(--border-default));border:0;border-radius:var(--radius-pill);cursor:pointer;height:8px;padding:0;transition:background var(--duration-fast,.12s),width var(--duration-fast,.12s);width:8px}.carousel__dot.is-active{background:var(--color-primary);width:24px}.resizable{display:flex;height:100%;width:100%}.resizable--horizontal{flex-direction:row}.resizable--vertical{flex-direction:column}.resizable__panel{min-height:0;min-width:0;overflow:auto}.resizable__handle{background:var(--border-default);flex:none;position:relative;transition:background var(--duration-fast,.12s)}.resizable__handle:focus-visible,.resizable__handle:hover{background:var(--color-primary)}.resizable__handle--horizontal{cursor:col-resize;width:4px}.resizable__handle--vertical{cursor:row-resize;height:4px}.menubar{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);display:inline-flex;gap:2px;padding:2px}.menubar__menu{position:relative}.menubar__trigger{background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;font-weight:500;padding:var(--space-1) var(--space-3)}.menubar__trigger.is-open,.menubar__trigger:hover{background:var(--bg-subtle)}.menubar__list{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);left:0;list-style:none;margin:0;min-width:200px;padding:var(--space-1);position:absolute;top:calc(100% + 4px);z-index:var(--z-popover,1300)}.menubar__item{align-items:center;background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;display:flex;gap:var(--space-4);justify-content:space-between;padding:var(--space-2) var(--space-3);text-align:left;width:100%}.menubar__item:hover:not(:disabled){background:var(--bg-subtle)}.menubar__item.is-disabled,.menubar__item:disabled{cursor:not-allowed;opacity:.5}.menubar__shortcut{color:var(--fg-subtle);font-family:var(--font-mono,ui-monospace,monospace);font-size:var(--text-xs)}.menubar__separator{background:var(--border-default);height:1px;margin:var(--space-1) 0}.nav-menu{position:relative}.nav-menu__list{display:flex;gap:var(--space-1);list-style:none;margin:0;padding:0}.nav-menu__item{position:relative}.nav-menu__trigger{align-items:center;background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;display:inline-flex;font-weight:500;gap:var(--space-1);padding:var(--space-2) var(--space-3);text-decoration:none}.nav-menu__trigger.is-open,.nav-menu__trigger:hover{background:var(--bg-subtle);color:var(--color-primary)}.nav-menu__chevron{transition:transform var(--duration-fast,.12s)}.nav-menu__trigger.is-open .nav-menu__chevron{transform:rotate(180deg)}.nav-menu__panel{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);display:grid;gap:var(--space-3);grid-template-columns:1fr;left:0;min-width:320px;padding:var(--space-3);position:absolute;top:calc(100% + 8px);z-index:var(--z-popover,1300)}.nav-menu__featured{background:var(--bg-subtle);border-radius:var(--radius-sm);padding:var(--space-3)}.nav-menu__featured strong{color:var(--fg-default);display:block;font-size:var(--text-base)}.nav-menu__featured p{color:var(--fg-muted);font-size:var(--text-sm);margin:var(--space-1) 0 0}.nav-menu__sublist{display:flex;flex-direction:column;gap:2px;list-style:none;margin:0;padding:0}.nav-menu__link{align-items:flex-start;border-radius:var(--radius-sm);color:var(--fg-default);display:flex;gap:var(--space-2);padding:var(--space-2);text-decoration:none}.nav-menu__link:hover{background:var(--bg-subtle);color:var(--color-primary)}.nav-menu__link-icon{display:inline-flex}.nav-menu__link-body{display:flex;flex-direction:column;gap:2px}.nav-menu__link-label{font-size:var(--text-sm);font-weight:500}.nav-menu__link-desc{color:var(--fg-muted);font-size:var(--text-xs)}.grid--responsive{display:grid;grid-template-columns:repeat(var(--grid-cols,1),minmax(0,1fr))}@media (min-width:480px){.grid--responsive{grid-template-columns:repeat(var(--grid-cols-sm,var(--grid-cols,1)),minmax(0,1fr))}}@media (min-width:768px){.grid--responsive{grid-template-columns:repeat(var(--grid-cols-md,var(--grid-cols-sm,var(--grid-cols,1))),minmax(0,1fr))}}@media (min-width:1024px){.grid--responsive{grid-template-columns:repeat(var(--grid-cols-lg,var(--grid-cols-md,var(--grid-cols-sm,var(--grid-cols,1)))),minmax(0,1fr))}}@media (min-width:1280px){.grid--responsive{grid-template-columns:repeat(var(--grid-cols-xl,var(--grid-cols-lg,var(--grid-cols-md,var(--grid-cols-sm,var(--grid-cols,1))))),minmax(0,1fr))}}}@media (prefers-reduced-motion:reduce){*,:after,:before{animation-duration:.01ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition-duration:.01ms!important}}.aspect-ratio{overflow:hidden;position:relative;width:100%}.aspect-ratio>*{height:100%;inset:0;position:absolute;width:100%}.aspect-ratio>iframe,.aspect-ratio>img,.aspect-ratio>video{display:block;-o-object-fit:cover;object-fit:cover}.collapsible__trigger{background:transparent;border:0;color:inherit;cursor:pointer;padding:0}.collapsible__trigger:focus-visible{border-radius:var(--radius-sm);box-shadow:var(--focus-ring-accent);outline:none}.scroll-area{scrollbar-color:var(--border-strong) transparent;scrollbar-width:thin}.scroll-area--vertical{overflow-x:hidden;overflow-y:auto}.scroll-area--horizontal{overflow-x:auto;overflow-y:hidden}.scroll-area--both{overflow:auto}.scroll-area::-webkit-scrollbar{height:8px;width:8px}.scroll-area::-webkit-scrollbar-track{background:transparent}.scroll-area::-webkit-scrollbar-thumb{background:var(--border-strong);background-clip:padding-box;border:2px solid transparent;border-radius:var(--radius-pill)}.scroll-area::-webkit-scrollbar-thumb:hover{background-color:var(--fg-muted)}.scroll-area::-webkit-scrollbar-corner{background:transparent}
|
|
1
|
+
@layer elalba;@layer elalba{:root{--color-primary:var(--color-primary-800);--color-secondary:var(--color-secondary-400);--color-primary-900:#2e2b26;--color-primary-800:#423e37;--color-primary-700:#554839;--color-primary-600:#6b5a47;--color-primary-500:#87735e;--color-primary-400:#a8957f;--color-primary-300:#c8b8a6;--color-primary-200:#dfd3c6;--color-primary-100:#f0e9e1;--color-primary-50:#faf6f2;--color-secondary-900:#573820;--color-secondary-800:#7a4f30;--color-secondary-700:#9c6840;--color-secondary-600:#be8456;--color-secondary-500:#d4a074;--color-secondary-400:#e4bb97;--color-secondary-300:#ebcbab;--color-secondary-200:#f1dbc2;--color-secondary-100:#f8eddf;--color-secondary-50:#fcf7f1;--color-ink:#1c1917;--color-gray-900:#292524;--color-gray-800:#44403c;--color-gray-700:#57534e;--color-gray-600:#78716c;--color-gray-500:#a8a29e;--color-gray-400:#c4bcb4;--color-gray-300:#d6d3d1;--color-gray-200:#e7e5e4;--color-gray-150:#efedeb;--color-gray-100:#f5f5f4;--color-gray-50:#fafaf9;--color-white:#fff;--color-green-900:#0f4d22;--color-green-800:#166130;--color-green-700:#1f7a3d;--color-green-600:#2f9e44;--color-green-500:#4ab35a;--color-green-400:#6ec47e;--color-green-300:#95d5a1;--color-green-200:#c1e6c8;--color-green-100:#e0f1e3;--color-green-50:#f0f8f2;--color-yellow-900:#6b4400;--color-yellow-800:#8c5800;--color-yellow-700:#b67200;--color-yellow-600:#d68b00;--color-yellow-500:#f59f00;--color-yellow-400:#f7b633;--color-yellow-300:#f9cc66;--color-yellow-200:#fbe199;--color-yellow-100:#fdedc4;--color-yellow-50:#fef7e3;--color-red-900:#5b0e0e;--color-red-800:#7e1818;--color-red-700:#b91c1c;--color-red-600:#dc2626;--color-red-500:#ef4444;--color-red-400:#f87171;--color-red-300:#fca5a5;--color-red-200:#fecaca;--color-red-100:#fee2e2;--color-red-50:#fef2f2;--color-info-900:#0a3a66;--color-info-800:#0f4d85;--color-info-700:#1660a5;--color-info-600:#1a73c2;--color-info-500:#408fd0;--color-info-400:#6ba9da;--color-info-300:#95c2e4;--color-info-200:#c0d8ee;--color-info-100:#dee9f5;--color-info-50:#eef4fa;--color-success:var(--color-green-600);--color-warning:var(--color-yellow-500);--color-danger:var(--color-red-600);--color-info:var(--color-info-600);--bg-canvas:#fef5ef;--bg-surface:var(--color-white);--bg-subtle:var(--color-gray-100);--bg-muted:var(--color-gray-150);--bg-inverse:var(--color-primary);--bg-inverse-strong:var(--color-primary-900);--fg-default:var(--color-ink);--fg-muted:#6b6560;--fg-subtle:#726c66;--fg-meta:var(--fg-subtle);--fg-on-brand:var(--color-white);--fg-on-secondary:var(--color-primary);--fg-link:var(--color-primary);--fg-link-hover:var(--color-secondary-600);--accent-primary:var(--color-primary);--accent-secondary:var(--color-secondary);--border-default:var(--color-gray-200);--border-strong:var(--color-gray-300);--border-brand:var(--color-primary);--border-focus:var(--color-secondary);--cat-1:#2f6fed;--cat-1-bg:#e8f0fe;--cat-1-fg:#1c4fa3;--cat-2:#14a08c;--cat-2-bg:#d9f2ee;--cat-2-fg:#0f6b5f;--cat-3:#7c4ddb;--cat-3-bg:#efe7fb;--cat-3-fg:#5b3aa8;--cat-4:#c98a00;--cat-4-bg:#fcf0d8;--cat-4-fg:#8a5a00;--cat-5:#e0457e;--cat-5-bg:#fde4ec;--cat-5-fg:#a52a5a;--cat-6:#64748b;--cat-6-bg:#e6e9ef;--cat-6-fg:#3f4756;--bp-sm:480px;--bp-md:768px;--bp-lg:1024px;--bp-xl:1280px;--font-display:"Outfit","Helvetica Neue",Arial,sans-serif;--font-body:"DM Sans","Helvetica Neue",Arial,sans-serif;--font-mono:"JetBrains Mono",ui-monospace,"SF Mono",Menlo,Consolas,monospace;--weight-thin:100;--weight-extralight:200;--weight-light:300;--weight-regular:400;--weight-medium:500;--weight-semibold:600;--weight-bold:700;--weight-extrabold:800;--weight-black:900;--text-2xs:0.6875rem;--text-xs:0.75rem;--text-sm:0.875rem;--text-md:1rem;--text-lg:1.125rem;--text-xl:1.25rem;--text-2xl:1.5rem;--text-3xl:1.875rem;--text-4xl:2.5rem;--text-5xl:3.25rem;--text-6xl:4.25rem;--text-7xl:5.5rem;--leading-tight:1.05;--leading-snug:1.2;--leading-normal:1.45;--leading-relaxed:1.6;--tracking-tight:-0.01em;--tracking-normal:0;--tracking-snug:0.02em;--tracking-wide:0.04em;--tracking-wider:0.08em;--tt-label:uppercase;--tt-data:none;--tt-title:none;--space-0:0;--space-1:4px;--space-2:8px;--space-3:12px;--space-4:16px;--space-5:20px;--space-6:24px;--space-8:32px;--space-10:40px;--space-12:48px;--space-16:64px;--space-20:80px;--space-24:96px;--radius-none:0;--radius-xs:2px;--radius-sm:4px;--radius-md:8px;--radius-lg:12px;--radius-xl:18px;--radius-pill:999px;--shadow-xs:0 1px 2px rgba(12,18,32,.06);--shadow-sm:0 2px 6px rgba(12,18,32,.08);--shadow-md:0 8px 20px rgba(12,18,32,.1);--shadow-lg:0 18px 40px rgba(12,18,32,.14);--shadow-brand:0 10px 30px rgba(0,47,135,.25);--shadow-card:0 1px 2px rgba(12,18,32,.05),0 8px 24px -16px rgba(12,18,32,.2);--shadow-card-hover:0 2px 4px rgba(12,18,32,.06),0 16px 32px -14px rgba(12,18,32,.26);--ease-out-quart:cubic-bezier(0.25,1,0.5,1);--ease-out-quint:cubic-bezier(0.22,1,0.36,1);--ease-out-expo:cubic-bezier(0.16,1,0.3,1);--ease-standard:var(--ease-out-quint);--ease-out:var(--ease-out-quint);--ease-in:cubic-bezier(0.4,0,1,1);--duration-fast:120ms;--duration-base:200ms;--duration-slow:320ms;--duration-exit:150ms;--z-base:1;--z-dropdown:50;--z-sticky:60;--z-overlay:100;--z-toast:200;--z-tooltip:1000;--z-popover:1300;--z-floating:1300;--focus-ring-brand:0 0 0 3px color-mix(in srgb,var(--color-primary) 15%,transparent);--focus-ring-accent:0 0 0 3px color-mix(in srgb,var(--color-secondary) 35%,transparent);--focus-ring-danger:0 0 0 3px color-mix(in srgb,var(--color-red-600) 18%,transparent);--backdrop:color-mix(in srgb,var(--color-ink) 55%,transparent)}.h-display,.h1{font-size:var(--text-6xl);line-height:var(--leading-tight)}.h-display,.h1,.h2{color:var(--fg-default);font-family:var(--font-display);font-weight:700;letter-spacing:var(--tracking-tight);text-transform:var(--tt-title)}.h2{font-size:var(--text-4xl);line-height:var(--leading-snug)}.h3{font-family:var(--font-display);font-size:var(--text-2xl);text-transform:var(--tt-title)}.h3,.h4{color:var(--fg-default);font-weight:700;line-height:var(--leading-snug)}.h4{font-size:var(--text-xl)}.eyebrow,.h4{font-family:var(--font-body)}.eyebrow{color:var(--accent-secondary);font-size:var(--text-sm);font-weight:700;letter-spacing:var(--tracking-wider);text-transform:var(--tt-label)}.body-lg{font-size:var(--text-lg)}.body,.body-lg,p{color:var(--fg-default);font-family:var(--font-body);font-weight:400;line-height:var(--leading-relaxed)}.body,p{font-size:var(--text-md)}.body-sm{font-weight:400;line-height:var(--leading-normal)}.body-sm,.label{color:var(--fg-muted);font-family:var(--font-body);font-size:var(--text-sm)}.label{font-weight:500;letter-spacing:var(--tracking-wide);text-transform:var(--tt-data)}.caption{color:var(--fg-subtle);font-size:var(--text-xs);letter-spacing:var(--tracking-wide)}.caption,.cell-meta{font-family:var(--font-body);font-weight:400}.cell-meta{color:var(--fg-meta);display:block;font-size:var(--text-2xs);line-height:var(--leading-normal)}.cell-mono{font-family:var(--font-mono);font-variant-numeric:tabular-nums}.cell-wrap{overflow-wrap:anywhere;white-space:normal}.mono,code{font-family:var(--font-mono);font-size:.95em}.mono,:not(pre)>code{background:var(--bg-subtle);border-radius:var(--radius-sm);padding:2px 6px}a{border-bottom:1px solid transparent;color:var(--fg-link);text-decoration:none;transition:color var(--duration-fast) var(--ease-standard),border-color var(--duration-fast) var(--ease-standard)}a:hover{border-bottom-color:currentColor;color:var(--fg-link-hover)}.surface-inverse,[data-tone=inverse]{--fg-default:var(--fg-on-brand);--fg-muted:color-mix(in srgb,var(--fg-on-brand) 70%,transparent);--fg-subtle:color-mix(in srgb,var(--fg-on-brand) 50%,transparent);--fg-link:var(--fg-on-brand);--fg-link-hover:var(--color-secondary);--border-default:color-mix(in srgb,var(--fg-on-brand) 20%,transparent);--border-strong:color-mix(in srgb,var(--fg-on-brand) 35%,transparent);--bg-subtle:color-mix(in srgb,var(--fg-on-brand) 12%,transparent);--bg-muted:color-mix(in srgb,var(--fg-on-brand) 18%,transparent);color:var(--fg-default)}.surface-inverse--brand{background:var(--color-primary)}.surface-inverse--dark{background:var(--color-primary-900)}}@layer elalba{}@layer elalba{:where(html,body){color:var(--fg-default);font-family:var(--font-body);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}svg text{font-family:inherit}button,input,optgroup,select,textarea{font:inherit}button,input,select,textarea{box-sizing:border-box}.btn{align-items:center;border:1px solid transparent;border-radius:var(--radius-md);cursor:pointer;display:inline-flex;font-family:var(--font-body);font-size:var(--text-sm);font-weight:700;gap:8px;justify-content:center;letter-spacing:var(--tracking-wide);text-decoration:none;text-transform:var(--tt-label);transition:background var(--duration-fast) var(--ease-standard),color var(--duration-fast) var(--ease-standard),border-color var(--duration-fast) var(--ease-standard),transform var(--duration-fast) var(--ease-standard),box-shadow var(--duration-fast) var(--ease-standard);-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap}.btn:focus-visible{box-shadow:var(--focus-ring-accent);outline:none}.btn:active:not(:disabled){box-shadow:var(--shadow-xs);transform:scale(.98)}.btn:disabled{cursor:not-allowed;opacity:.45}.btn--xs{font-size:var(--text-2xs);min-height:28px;padding:6px 10px}.btn--sm{font-size:var(--text-xs);min-height:36px;padding:8px 14px}.btn--md{font-size:var(--text-sm);min-height:44px;padding:10px 18px}.btn--lg{font-size:var(--text-md);min-height:52px;padding:14px 24px}.btn--xl{font-size:var(--text-lg);min-height:60px;padding:18px 32px}.btn--icon{aspect-ratio:1;padding:0}.btn--icon.btn--sm{width:36px}.btn--icon.btn--md{width:44px}.btn--icon.btn--lg{width:52px}.btn--block{display:flex;width:100%}.btn--primary{background:var(--btn-primary-bg,var(--color-primary));color:var(--btn-primary-fg,var(--fg-on-brand))}.btn--primary:hover:not(:disabled){background:var(--btn-primary-bg-hover,var(--color-primary-900))}.btn--secondary{background:var(--btn-secondary-bg,var(--color-secondary));color:var(--btn-secondary-fg,var(--fg-on-secondary))}.btn--secondary:hover:not(:disabled){background:var(--btn-secondary-bg-hover,var(--color-secondary-500))}.btn--outline{background:transparent;border-color:var(--color-primary);color:var(--color-primary)}.btn--outline:hover:not(:disabled){background:var(--color-primary);color:var(--color-white)}.btn--ghost{background:transparent;color:var(--fg-default)}.btn--ghost:hover:not(:disabled),.btn--subtle{background:var(--bg-subtle)}.btn--subtle{color:var(--fg-default)}.btn--subtle:hover:not(:disabled){background:var(--bg-muted)}.btn--danger{background:var(--color-danger);color:var(--color-white)}.btn--danger:hover:not(:disabled){background:var(--color-red-700)}.btn--success{background:var(--color-success);color:var(--color-white)}.btn--success:hover:not(:disabled){background:var(--color-green-700)}.btn--warning{background:var(--color-warning);color:var(--color-yellow-900)}.btn--warning:hover:not(:disabled){background:var(--color-yellow-600)}.btn--link{background:transparent;color:var(--color-primary);font-weight:700;letter-spacing:0;min-height:auto;padding:4px 6px;text-transform:none}.btn--link:hover:not(:disabled){color:var(--color-secondary-700);text-decoration:underline}.btn-group{display:inline-flex}.btn-group .btn{border-radius:var(--radius-none);border-right-width:0}.btn-group .btn:first-child{border-bottom-left-radius:var(--radius-md);border-top-left-radius:var(--radius-md)}.btn-group .btn:last-child{border-bottom-right-radius:var(--radius-md);border-right-width:1px;border-top-right-radius:var(--radius-md)}.btn-group .btn--outline+.btn--outline{border-left:1px solid var(--color-primary)}.field{display:flex;flex-direction:column;gap:6px}.field__label{align-items:center;color:var(--fg-default);display:flex;font-family:var(--font-body);font-size:var(--text-sm);font-weight:700;gap:4px}.field__label .req{color:var(--color-danger)}.field__label .opt{font-weight:400}.field__help,.field__label .opt{color:var(--fg-subtle);font-size:var(--text-xs)}.field__error,.field__help{font-family:var(--font-body)}.field__error{align-items:center;color:var(--color-danger);display:flex;font-size:var(--text-xs);font-weight:700;gap:4px}.input,.select,.textarea{background:var(--bg-surface);border:1px solid var(--border-strong);border-radius:var(--radius-md);color:var(--fg-default);font-family:var(--font-body);font-size:var(--text-md);min-height:var(--field-min-h,44px);padding:var(--field-pad-y,10px) var(--field-pad-x,14px);transition:border-color var(--duration-fast),box-shadow var(--duration-fast);width:100%}.fields--dense{--field-min-h:36px;--field-pad-y:6px;--field-pad-x:10px}.fields--dense .combobox__input,.fields--dense .input,.fields--dense .select,.fields--dense .textarea{font-size:var(--text-sm)}.input::-moz-placeholder,.textarea::-moz-placeholder{color:var(--fg-subtle)}.input::placeholder,.textarea::placeholder{color:var(--fg-subtle)}.input:hover:not(:disabled),.select:hover:not(:disabled),.textarea:hover:not(:disabled){border-color:var(--border-strong)}.input:focus,.select:focus,.textarea:focus{border-color:var(--color-primary);box-shadow:var(--focus-ring-brand);outline:none}.input:disabled,.select:disabled,.textarea:disabled{background:var(--bg-subtle);color:var(--fg-subtle);cursor:not-allowed}.field--error .input,.field--error .select,.field--error .textarea{border-color:var(--color-danger)}.field--error .input:focus{box-shadow:var(--focus-ring-danger)}.form-field{display:flex;flex-direction:column;gap:6px}.form-field__hint{color:var(--fg-subtle)}.form-field__error,.form-field__hint{font-family:var(--font-body);font-size:var(--text-xs)}.form-field__error{align-items:center;color:var(--color-danger);display:flex;font-weight:700;gap:4px}.select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' stroke='%235b6173' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");background-position:right 12px center;background-repeat:no-repeat;padding-right:40px}.textarea{min-height:96px;padding-bottom:12px;padding-top:12px;resize:vertical}.input-group{align-items:stretch;background:var(--bg-surface);border:1px solid var(--border-strong);border-radius:var(--radius-md);display:flex;overflow:hidden;transition:border-color var(--duration-fast),box-shadow var(--duration-fast)}.input-group:focus-within{border-color:var(--color-primary);box-shadow:var(--focus-ring-brand)}.input-group .input{border:0;border-radius:var(--radius-none);box-shadow:none}.input-group .input:focus{box-shadow:none}.input-group__addon{align-items:center;background:var(--bg-subtle);border-right:1px solid var(--border-default);color:var(--fg-muted);display:flex;font-family:var(--font-body);font-size:var(--text-sm);font-weight:700;padding:0 14px}.input-group__addon:last-child{border-left:1px solid var(--border-default);border-right:0}.input-wrap{align-items:center;display:flex;position:relative;width:100%}.input-wrap__icon{align-items:center;color:var(--fg-subtle);display:inline-flex;height:20px;justify-content:center;pointer-events:none;position:absolute;width:20px}.input-wrap__icon--left{left:12px}.input-wrap__icon--right{right:12px}.input-wrap .input{width:100%}.input--has-left{padding-left:40px}.input--has-right{padding-right:40px}.input-wrap.is-invalid .input{border-color:var(--color-danger)}.input-wrap.is-invalid .input:focus{box-shadow:var(--focus-ring-danger)}.check{align-items:flex-start;color:var(--fg-default);cursor:pointer;display:inline-flex;font-family:var(--font-body);font-size:var(--text-sm);gap:10px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.check input{opacity:0;pointer-events:none;position:absolute}.check__box{align-items:center;background:var(--bg-surface);border:1.5px solid var(--border-strong);border-radius:var(--radius-sm);display:inline-flex;flex:none;height:20px;justify-content:center;margin-top:1px;transition:background var(--duration-fast),border-color var(--duration-fast);width:20px}.check input:checked~.check__box{background:var(--color-primary);border-color:var(--color-primary);color:var(--color-white)}.check input:focus-visible~.check__box{box-shadow:var(--focus-ring-accent);outline:none}.check:hover .check__box{border-color:var(--border-strong)}.check input:disabled~.check__box{background:var(--bg-subtle);border-color:var(--border-default)}.check__box svg{opacity:0;transition:opacity var(--duration-fast)}.check input:checked~.check__box svg{opacity:1}.check--radio .check__box,.check--radio .check__box:after{border-radius:var(--radius-pill)}.check--radio .check__box:after{background:var(--color-white);content:"";height:8px;opacity:0;transition:opacity var(--duration-fast);width:8px}.check--radio input:checked~.check__box:after{opacity:1}.switch{align-items:center;cursor:pointer;display:inline-flex;gap:10px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.switch input{opacity:0;pointer-events:none;position:absolute}.switch__track{background:var(--color-gray-300);border-radius:var(--radius-pill);flex:none;height:22px;position:relative;transition:background var(--duration-fast) var(--ease-standard);width:40px}.switch__track:after{background:var(--color-white);border-radius:var(--radius-pill);box-shadow:var(--shadow-xs);content:"";height:18px;left:2px;position:absolute;top:2px;transition:transform var(--duration-fast) var(--ease-standard);width:18px}.switch input:checked~.switch__track{background:var(--color-primary)}.switch input:checked~.switch__track:after{transform:translateX(18px)}.switch input:focus-visible~.switch__track{box-shadow:var(--focus-ring-accent)}.switch input:disabled~.switch__track{opacity:.5}.badge{align-items:center;background:var(--bg-subtle);border:1px solid var(--border-default);border-radius:var(--radius-pill);color:var(--fg-muted);display:inline-flex;font-family:var(--font-body);font-size:var(--text-xs);font-weight:600;gap:6px;letter-spacing:var(--tracking-wide);padding:3px 8px;text-transform:none;white-space:nowrap;--badge-ink:var(--color-gray-800)}.badge--label{text-transform:var(--tt-label)}.badge--primary{background:var(--color-primary-100);border-color:var(--color-primary-200);color:var(--color-primary-800);--badge-ink:var(--color-primary-800)}.badge--accent{background:var(--color-secondary-100);border-color:var(--color-secondary-200);color:var(--color-secondary-800);--badge-ink:var(--color-secondary-800)}.badge--success{background:var(--color-green-50);border-color:var(--color-green-200);color:var(--color-green-800);--badge-ink:var(--color-green-800)}.badge--warning{background:var(--color-yellow-50);border-color:var(--color-yellow-200);color:var(--color-yellow-800);--badge-ink:var(--color-yellow-800)}.badge--danger{background:var(--color-red-50);border-color:var(--color-red-200);color:var(--color-red-800);--badge-ink:var(--color-red-800)}.badge--info{background:var(--color-info-50);border-color:var(--color-info-200);color:var(--color-info-800);--badge-ink:var(--color-info-800)}.badge--cat-1{background:var(--cat-1-bg);border-color:transparent;color:var(--cat-1-fg);--badge-ink:var(--cat-1-fg)}.badge--cat-2{background:var(--cat-2-bg);border-color:transparent;color:var(--cat-2-fg);--badge-ink:var(--cat-2-fg)}.badge--cat-3{background:var(--cat-3-bg);border-color:transparent;color:var(--cat-3-fg);--badge-ink:var(--cat-3-fg)}.badge--cat-4{background:var(--cat-4-bg);border-color:transparent;color:var(--cat-4-fg);--badge-ink:var(--cat-4-fg)}.badge--cat-5{background:var(--cat-5-bg);border-color:transparent;color:var(--cat-5-fg);--badge-ink:var(--cat-5-fg)}.badge--cat-6{background:var(--cat-6-bg);border-color:transparent;color:var(--cat-6-fg);--badge-ink:var(--cat-6-fg)}.badge--app-solid{background:var(--badge-ink);border-color:transparent;color:var(--color-white)}.badge--app-outline{background:transparent;border-color:var(--badge-ink);color:var(--badge-ink)}.badge--solid{background:var(--color-primary)}.badge--solid,.badge--solid-orange{border-color:transparent;color:var(--color-white)}.badge--solid-orange{background:var(--color-secondary)}.badge__dot{background:currentColor;border-radius:var(--radius-pill);height:6px;width:6px}.badge__dot.is-pulsing{animation:status-pulse 1.6s ease-out infinite}@media (prefers-reduced-motion:reduce){.badge__dot.is-pulsing{animation:none}}.chip{align-items:center;background:var(--bg-subtle);border:1px solid var(--border-default);border-radius:var(--radius-pill);color:var(--fg-default);cursor:pointer;display:inline-flex;font-family:var(--font-body);font-size:var(--text-sm);gap:6px;padding:6px 12px;transition:background var(--duration-fast),border-color var(--duration-fast)}.chip:hover{background:var(--bg-muted)}.chip--active{background:var(--color-primary);border-color:var(--color-primary);color:var(--color-white)}.chip__close{align-items:center;background:transparent;border:0;border-radius:var(--radius-pill);color:inherit;cursor:pointer;display:inline-flex;height:16px;justify-content:center;opacity:.6;padding:0;transition:opacity var(--duration-fast),background var(--duration-fast);width:16px}.chip__close:hover{background:rgba(0,0,0,.08);opacity:1}.chip--active .chip__close:hover{background:hsla(0,0%,100%,.2)}.chip__close:focus-visible{box-shadow:var(--focus-ring-accent);outline:none}.chip__close svg{display:block}.avatar{align-items:center;border-radius:var(--radius-pill);display:inline-flex;flex:none;font-size:var(--text-sm);font-weight:700;height:40px;justify-content:center;letter-spacing:.02em;position:relative;text-transform:var(--tt-label);width:40px}.avatar img{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.avatar--xs{font-size:.625rem;height:24px;width:24px}.avatar--sm{font-size:var(--text-2xs);height:32px;width:32px}.avatar--lg{font-size:var(--text-md);height:56px;width:56px}.avatar--xl{font-size:var(--text-xl);height:80px;width:80px}.avatar-stack{display:inline-flex}.avatar-stack .avatar{border:2px solid var(--bg-surface);margin-left:-10px}.avatar-stack .avatar:first-child{margin-left:0}.card{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);box-shadow:var(--shadow-card);overflow:hidden}.card .card{box-shadow:none}.card__body,.card__header{padding:20px 24px}.card__header{border-bottom:1px solid var(--border-default)}.card__footer{background:var(--bg-subtle);border-top:1px solid var(--border-default);padding:16px 24px}.card__title{font-family:var(--font-body);font-size:var(--text-lg);font-weight:700;margin:0 0 4px}.card__subtitle{color:var(--fg-muted);font-size:var(--text-sm);margin:0}.card--interactive{cursor:pointer;transition:box-shadow var(--duration-base) var(--ease-standard),transform var(--duration-base) var(--ease-standard)}.card--interactive:hover{box-shadow:var(--shadow-card-hover);transform:translateY(-2px)}.card--accent-brand,.card--accent-cat-1,.card--accent-cat-2,.card--accent-cat-3,.card--accent-cat-4,.card--accent-cat-5,.card--accent-cat-6,.card--accent-danger,.card--accent-info,.card--accent-neutral,.card--accent-secondary,.card--accent-success,.card--accent-warning{box-shadow:inset 4px 0 0 var(--card-accent-color),var(--shadow-card)}.card--accent-brand{--card-accent-color:var(--color-primary)}.card--accent-secondary{--card-accent-color:var(--accent-secondary)}.card--accent-success{--card-accent-color:var(--color-success)}.card--accent-warning{--card-accent-color:var(--color-warning)}.card--accent-danger{--card-accent-color:var(--color-danger)}.card--accent-info{--card-accent-color:var(--color-info)}.card--accent-neutral{--card-accent-color:var(--border-strong)}.card--accent-cat-1{--card-accent-color:var(--cat-1)}.card--accent-cat-2{--card-accent-color:var(--cat-2)}.card--accent-cat-3{--card-accent-color:var(--cat-3)}.card--accent-cat-4{--card-accent-color:var(--cat-4)}.card--accent-cat-5{--card-accent-color:var(--cat-5)}.card--accent-cat-6{--card-accent-color:var(--cat-6)}.card--interactive.card--accent-brand:hover,.card--interactive.card--accent-cat-1:hover,.card--interactive.card--accent-cat-2:hover,.card--interactive.card--accent-cat-3:hover,.card--interactive.card--accent-cat-4:hover,.card--interactive.card--accent-cat-5:hover,.card--interactive.card--accent-cat-6:hover,.card--interactive.card--accent-danger:hover,.card--interactive.card--accent-info:hover,.card--interactive.card--accent-neutral:hover,.card--interactive.card--accent-secondary:hover,.card--interactive.card--accent-success:hover,.card--interactive.card--accent-warning:hover{box-shadow:inset 4px 0 0 var(--card-accent-color),var(--shadow-card-hover)}.kpi-card{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);display:flex;flex-direction:column;gap:8px;padding:20px 24px}.kpi-card__label{color:var(--fg-muted);font-family:var(--font-body);font-size:var(--text-xs);font-weight:700;letter-spacing:var(--tracking-wider);text-transform:var(--tt-label)}.kpi-card__value{color:var(--fg-default);font-family:var(--font-display);font-size:var(--text-4xl);font-weight:700;line-height:1}.kpi-card__trend{align-items:center;display:inline-flex;font-family:var(--font-body);font-size:var(--text-xs);font-weight:700;gap:4px}.kpi-card__trend--up{color:var(--color-success)}.kpi-card__trend--down{color:var(--color-danger)}.product-card{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);display:flex;flex-direction:column;overflow:hidden;position:relative;transition:box-shadow var(--duration-base),transform var(--duration-base)}.product-card:hover{box-shadow:var(--shadow-md);transform:translateY(-2px)}.product-card__media{aspect-ratio:1;background:var(--bg-subtle);overflow:hidden;position:relative}.product-card__media,.product-card__placeholder{align-items:center;display:flex;justify-content:center}.product-card__placeholder{background-image:linear-gradient(45deg,var(--bg-muted) 25%,transparent 25%),linear-gradient(-45deg,var(--bg-muted) 25%,transparent 25%);background-size:16px 16px;color:var(--color-gray-500);font-size:var(--text-xs);height:100%;width:100%}.product-card__body{display:flex;flex:1;flex-direction:column;gap:6px;padding:16px}.product-card__title{font-size:var(--text-md);font-weight:700;line-height:1.3;margin:0}.product-card__sku{color:var(--fg-subtle);font-family:var(--font-mono);font-size:var(--text-xs)}.product-card__price{color:var(--color-primary);font-size:var(--text-xl);font-weight:700}.product-card__footer{align-items:center;display:flex;gap:8px;justify-content:space-between;padding:0 16px 16px}.product-card__tag{background:var(--color-secondary);color:var(--color-white);font-size:var(--text-2xs);font-weight:700;left:12px;letter-spacing:var(--tracking-wide);padding:4px 8px;position:absolute;text-transform:var(--tt-label);top:12px}.alert{align-items:flex-start;background:var(--bg-subtle);border:1px solid var(--border-default);border-radius:var(--radius-md);display:flex;font-family:var(--font-body);font-size:var(--text-sm);gap:12px;line-height:1.5;padding:14px 18px}.alert__icon{flex:none;margin-top:1px}.alert__body{flex:1}.alert__title{font-weight:700;margin-bottom:2px}.alert__desc{color:inherit;font-size:var(--text-sm);line-height:1.5;opacity:.92}.alert--info{background:var(--color-info-50);border-color:var(--color-info-200);color:var(--color-info-800)}.alert--info .alert__icon{color:var(--color-info)}.alert--success{background:var(--color-green-50);border-color:var(--color-green-200);color:var(--color-green-800)}.alert--success .alert__icon{color:var(--color-success)}.alert--warning{background:var(--color-yellow-50);border-color:var(--color-yellow-200);color:var(--color-yellow-800)}.alert--warning .alert__icon{color:var(--color-warning)}.alert--danger{background:var(--color-red-50);border-color:var(--color-red-200);color:var(--color-red-800)}.alert--danger .alert__icon{color:var(--color-danger)}.alert__close{background:transparent;border:0;color:currentColor;cursor:pointer;opacity:.7;padding:2px}.alert__close:hover{opacity:1}.tooltip{display:inline-flex;position:relative}.tooltip__bubble{background:var(--color-ink);border-radius:var(--radius-sm);color:var(--color-white);font-family:var(--font-body);font-size:var(--text-xs);font-weight:700;opacity:0;padding:6px 10px;pointer-events:none;position:absolute;transition:opacity var(--duration-fast);white-space:nowrap;z-index:var(--z-tooltip)}.tooltip__bubble:after{border:4px solid transparent;content:"";position:absolute}.tooltip--top .tooltip__bubble{bottom:calc(100% + 8px);left:50%;transform:translateX(-50%)}.tooltip--top .tooltip__bubble:after{border-top-color:var(--color-ink);left:50%;top:100%;transform:translateX(-50%)}.tooltip--bottom .tooltip__bubble{left:50%;top:calc(100% + 8px);transform:translateX(-50%)}.tooltip--bottom .tooltip__bubble:after{border-bottom-color:var(--color-ink);bottom:100%;left:50%;transform:translateX(-50%)}.tooltip--left .tooltip__bubble{right:calc(100% + 8px);top:50%;transform:translateY(-50%)}.tooltip--left .tooltip__bubble:after{border-left-color:var(--color-ink);left:100%;top:50%;transform:translateY(-50%)}.tooltip--right .tooltip__bubble{left:calc(100% + 8px);top:50%;transform:translateY(-50%)}.tooltip--right .tooltip__bubble:after{border-right-color:var(--color-ink);right:100%;top:50%;transform:translateY(-50%)}.tooltip:focus-within .tooltip__bubble,.tooltip:hover .tooltip__bubble{opacity:1}.tabs{display:flex;flex-direction:column}.tabs__list{border-bottom:1px solid var(--border-default);display:flex;gap:4px}.tabs__tab{background:transparent;border:0;border-bottom:2px solid transparent;color:var(--fg-default);cursor:pointer;font-family:var(--font-body);font-size:var(--text-sm);font-weight:600;margin-bottom:-1px;padding:12px 18px;transition:color var(--duration-fast),border-color var(--duration-fast)}.tabs__tab.is-active,.tabs__tab:hover{color:var(--color-primary)}.tabs__tab.is-active{border-bottom-color:var(--color-secondary)}.tabs__tab:focus-visible{border-radius:var(--radius-sm);box-shadow:var(--focus-ring-accent);outline:none}.tabs__panel{padding:16px 0}.tabs--pill .tabs__list{background:var(--bg-subtle);border:0;border-radius:var(--radius-md);display:inline-flex;gap:8px;padding:4px}.tabs--pill .tabs__tab{border:0;border-radius:var(--radius-sm);margin:0;padding:8px 14px}.tabs--pill .tabs__tab.is-active{background:var(--bg-surface);box-shadow:var(--shadow-xs);color:var(--color-primary)}.pagination__btn{align-items:center;display:inline-flex;font-weight:500;height:36px;justify-content:center;min-width:36px;padding:0 10px;transition:background var(--duration-fast),border-color var(--duration-fast)}.pagination__btn.active{background:var(--color-primary);border-color:var(--color-primary);color:var(--color-white)}.pagination__ellipsis{align-self:center;color:var(--fg-subtle)}.breadcrumbs{align-items:center;display:flex;flex-wrap:wrap;gap:6px}.breadcrumbs__current{color:var(--fg-default);font-weight:700}.table-wrap{background:linear-gradient(to right,var(--bg-surface) 30%,transparent) 0,linear-gradient(to left,var(--bg-surface) 30%,transparent) 100%,linear-gradient(to right,rgba(0,0,0,.08),transparent 24px) 0,linear-gradient(to left,rgba(0,0,0,.08),transparent 24px) 100%,var(--bg-surface);background-attachment:local,local,scroll,scroll,scroll;background-clip:padding-box;background-repeat:no-repeat;background-size:30px 100%,30px 100%,24px 100%,24px 100%,100% 100%;border:1px solid var(--border-default);border-radius:var(--radius-lg);overflow-x:auto}.table-wrap>.data-table thead tr:first-child th:first-child{border-top-left-radius:var(--radius-lg)}.table-wrap>.data-table thead tr:first-child th:last-child{border-top-right-radius:var(--radius-lg)}.table{border-collapse:collapse;color:var(--fg-default);font-family:var(--font-body);font-size:var(--text-sm);width:100%}.table th{background:var(--bg-subtle);border-bottom:1px solid var(--border-default);color:var(--fg-muted);font-size:var(--text-xs);font-weight:500;letter-spacing:var(--tracking-snug);padding:8px 12px;text-align:left;text-transform:var(--tt-data);white-space:nowrap}.data-table__sort{display:inline-flex;margin-left:4px;opacity:.75;vertical-align:middle}.data-table__sort-btn{align-items:center;background:transparent;border:0;color:inherit;cursor:pointer;display:inline-flex;font-size:inherit;font-weight:inherit;gap:4px;letter-spacing:inherit;padding:0;text-transform:inherit}.data-table__sort-btn:hover{color:var(--fg-default)}.data-table__sort-btn:focus-visible{border-radius:var(--radius-sm);box-shadow:var(--focus-ring-accent);outline:none}.table th[aria-sort=ascending],.table th[aria-sort=descending]{background:var(--color-primary-50);border-bottom-color:var(--color-primary);color:var(--color-primary)}.data-table__error{color:var(--color-danger);font-size:var(--text-sm)}.table-pagination{align-items:center;display:flex;flex-wrap:wrap;gap:var(--space-3);justify-content:space-between;padding:var(--space-3) 0}.table-pagination__size{align-items:center;color:var(--fg-muted);display:inline-flex;font-size:var(--text-sm);gap:var(--space-2)}.table-pagination__size .select{min-width:0;width:auto}@media (max-width:600px){.table-pagination{justify-content:center}}.table-wrap--sticky{max-height:70vh;overflow-y:auto}.table-wrap--sticky .table thead th{background:var(--bg-subtle);box-shadow:inset 0 -1px 0 var(--border-default);position:sticky;top:0;z-index:1}@media (max-width:600px){.table-wrap--cards .table{border:0}.table-wrap--cards .table thead{display:none}.table-wrap--cards .table tr{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);display:block;margin-bottom:var(--space-3);padding:var(--space-3)}.table-wrap--cards .table td{align-items:baseline;border:0;display:flex;gap:var(--space-3);justify-content:space-between;overflow:visible;padding:var(--space-2) 0;text-align:left!important;text-overflow:clip;white-space:normal}.table-wrap--cards .table td:not(:last-child){border-bottom:1px solid var(--border-subtle)}.table-wrap--cards .table td[data-label]:before{color:var(--fg-muted);content:attr(data-label);flex-shrink:0;font-size:var(--text-xs);font-weight:600;letter-spacing:var(--tracking-wide);text-transform:var(--tt-label)}}.table th[aria-sort=ascending] .data-table__sort,.table th[aria-sort=descending] .data-table__sort{color:var(--color-primary);opacity:1}.table td{border-bottom:1px solid var(--border-default);font-size:var(--text-sm);overflow:hidden;padding:8px 12px;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.table tr:last-child td{border-bottom:0}.table tbody tr{transition:background var(--duration-fast)}.table tbody tr:hover{background:var(--bg-muted)}.table--compact td,.table--compact th{font-size:var(--text-xs);padding:8px 12px}.table--comfortable th{padding:14px 16px}.table--comfortable td{font-size:var(--text-sm);overflow:visible;padding:14px 16px;text-overflow:clip;white-space:normal}.table__num{font-family:var(--font-mono)}.table td.table__align-right,.table__num{text-align:right}.table td.table__align-center{text-align:center}.table td.table__align-right>*{margin-left:auto}.table td.table__align-center>*{margin-inline:auto}.table-toolbar{align-items:center;background:var(--bg-surface);border-bottom:1px solid var(--border-default);display:flex;flex-wrap:wrap;gap:12px;padding:14px 16px}.table-toolbar>.grow,.table-toolbar>.input,.table-toolbar>.input-wrap,.table-toolbar>.select{flex:1 1 200px;min-width:0}.table-toolbar+.table-wrap{border-top:0;border-top-left-radius:0;border-top-right-radius:0}.table-surface{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);overflow:hidden}.table-surface__bar{border-bottom:1px solid var(--border-default)}.table-surface>.table-wrap{border:0;border-radius:0}.table-surface .data-table thead tr:first-child th:first-child{border-top-left-radius:0}.table-surface .data-table thead tr:first-child th:last-child{border-top-right-radius:0}.modal-backdrop{align-items:center;animation:fadeIn var(--duration-base) var(--ease-standard);background:var(--backdrop);display:flex;inset:0;justify-content:center;padding:24px;position:fixed;z-index:var(--z-overlay)}.modal{animation:rise var(--duration-base) var(--ease-standard);background:var(--bg-surface);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);display:flex;flex-direction:column;max-height:calc(100vh - 48px);max-width:520px;overflow:hidden;width:100%}.modal--sm{max-width:380px}.modal--md{max-width:520px}.modal--lg{max-width:760px}.modal__header{align-items:center;border-bottom:1px solid var(--border-default);display:flex;justify-content:space-between;padding:20px 24px}.modal__title{font-family:var(--font-display);font-size:var(--text-xl);font-weight:700;letter-spacing:var(--tracking-tight);margin:0;text-transform:var(--tt-title)}.modal__body{min-width:0;overflow-x:hidden;overflow-y:auto;padding:24px}.modal__footer{background:var(--bg-subtle);border-top:1px solid var(--border-default);display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end;padding:16px 24px}.modal__close{background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-muted);cursor:pointer;padding:4px}.modal__close:hover{background:var(--bg-subtle);color:var(--fg-default)}.drawer-backdrop{animation:fadeIn var(--duration-base) var(--ease-standard);background:var(--backdrop);display:flex;inset:0;justify-content:flex-end;position:fixed;z-index:var(--z-overlay)}.drawer{animation:slideIn var(--duration-base) var(--ease-standard);background:var(--bg-surface);box-shadow:var(--shadow-lg);display:flex;flex-direction:column;height:100%;max-width:480px;width:100%}.drawer-backdrop:has(.drawer--left){justify-content:flex-start}.drawer--left{animation:slideInLeft var(--duration-base) var(--ease-standard)}.drawer__header{align-items:center;border-bottom:1px solid var(--border-default);display:flex;justify-content:space-between;padding:20px 24px}.drawer__title{font-family:var(--font-display);font-size:var(--text-xl);font-weight:700;letter-spacing:var(--tracking-tight);margin:0;text-transform:var(--tt-title)}.drawer__body{flex:1;overflow-y:auto;padding:24px}.drawer__footer{background:var(--bg-subtle);border-top:1px solid var(--border-default);display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end;padding:16px 24px}.drawer__close{background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-muted);cursor:pointer;padding:4px}.drawer__close:hover{background:var(--bg-subtle);color:var(--fg-default)}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes rise{0%{opacity:0;transform:translateY(8px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes slideIn{0%{opacity:0;transform:translateX(20px)}to{opacity:1;transform:translateX(0)}}@keyframes slideInLeft{0%{opacity:0;transform:translateX(-20px)}to{opacity:1;transform:translateX(0)}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}@keyframes sink{0%{opacity:1;transform:translateY(0) scale(1)}to{opacity:0;transform:translateY(8px) scale(.98)}}@keyframes slideOut{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(20px)}}@keyframes slideOutLeft{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(-20px)}}.modal-backdrop.is-closing{animation:fadeOut var(--duration-exit) var(--ease-standard) forwards}.modal.is-closing{animation:sink var(--duration-exit) var(--ease-standard) forwards}.drawer-backdrop.is-closing{animation:fadeOut var(--duration-exit) var(--ease-standard) forwards}.drawer--right.is-closing{animation:slideOut var(--duration-exit) var(--ease-standard) forwards}.drawer--left.is-closing{animation:slideOutLeft var(--duration-exit) var(--ease-standard) forwards}@keyframes slideInBottom{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes slideOutBottom{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(100%)}}@media (max-width:600px){.drawer-backdrop{align-items:flex-end;justify-content:stretch}.drawer-backdrop:has(.drawer--left){justify-content:stretch}.drawer{animation:slideInBottom var(--duration-base) var(--ease-standard);border-radius:var(--radius-lg) var(--radius-lg) 0 0;height:auto;max-height:90vh;max-width:none;width:100%}.drawer--left.is-closing,.drawer--right.is-closing,.drawer.is-closing{animation:slideOutBottom var(--duration-exit) var(--ease-standard) forwards}}.menu-item{align-items:center;background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;display:flex;font-family:var(--font-body);font-size:var(--text-sm);gap:8px;padding:8px 10px;text-align:left;width:100%}.menu-item:hover{background:var(--bg-subtle)}.menu-item--danger{color:var(--color-danger)}.menu-divider{background:var(--border-default);height:1px;margin:4px 0}.toast-stack{bottom:24px;display:flex;flex-direction:column;gap:8px;pointer-events:none;position:fixed;right:24px;z-index:var(--z-toast)}.toast{align-items:center;animation:slideUp var(--duration-base) var(--ease-standard);background:var(--bg-surface);border:1px solid var(--border-default);border-left-width:4px;border-radius:var(--radius-md);box-shadow:var(--shadow-lg);color:var(--fg-default);display:flex;font-family:var(--font-body);font-size:var(--text-sm);gap:12px;max-width:420px;min-width:320px;padding:14px 16px 14px 14px;pointer-events:auto}.toast:has(.toast__desc){align-items:flex-start}.toast:has(.toast__desc) .toast__icon{margin-top:1px}.toast__body{flex:1;min-width:0}.toast__title{color:var(--fg-default);font-weight:700}.toast:has(.toast__desc) .toast__title{margin-bottom:2px}.toast__desc{color:var(--fg-muted);font-size:var(--text-xs);line-height:1.4}.toast__close,.toast__icon{display:inline-flex;flex:none}.toast__close{align-items:center;align-self:flex-start;background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-muted);cursor:pointer;justify-content:center;line-height:1;padding:2px 6px}.toast__close:hover{background:var(--bg-subtle);color:var(--fg-default)}.toast--success{border-left-color:var(--color-success)}.toast--success .toast__icon{color:var(--color-success)}.toast--warning{border-left-color:var(--color-warning)}.toast--warning .toast__icon{color:var(--color-warning)}.toast--danger{border-left-color:var(--color-danger)}.toast--danger .toast__icon{color:var(--color-danger)}.toast--info{border-left-color:var(--color-info)}.toast--info .toast__icon{color:var(--color-info)}@keyframes slideUp{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes toastSlideOut{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(100%)}}.toast.is-closing{animation:toastSlideOut var(--duration-exit) var(--ease-standard) forwards}.empty{background:var(--bg-subtle);border:1px dashed var(--border-strong);border-radius:var(--radius-lg);padding:48px 24px;text-align:center}.empty,.empty__icon{color:var(--fg-muted)}.empty__icon{align-items:center;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-pill);display:inline-flex;height:56px;justify-content:center;margin:0 auto 16px;width:56px}.empty__title{color:var(--fg-default);font-family:var(--font-display);font-size:var(--text-xl);font-weight:700;margin:0 0 8px;text-transform:var(--tt-title)}.empty__desc{color:var(--fg-muted);font-size:var(--text-sm);line-height:1.5;margin:0 0 16px;margin-inline:auto;max-width:360px}.skel{animation:shimmer 1.6s linear infinite;background:linear-gradient(90deg,var(--bg-subtle),var(--bg-muted),var(--bg-subtle));background-size:200% 100%;border-radius:var(--radius-sm);display:block}@keyframes shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.progress{background:var(--bg-subtle);border-radius:var(--radius-pill);height:8px;overflow:hidden}.progress__bar{background:var(--color-primary);border-radius:inherit;height:100%;transition:width var(--duration-base)}.progress__bar--orange{background:var(--color-secondary)}.progress__bar--success{background:var(--color-success)}.spinner{animation:spin .8s linear infinite;border:2px solid var(--border-default);border-radius:var(--radius-pill);border-top-color:var(--color-primary);display:inline-block;height:20px;width:20px}.spinner--lg{border-width:3px;height:32px;width:32px}.spinner--inverse{border-color:hsla(0,0%,100%,.35);border-top-color:var(--color-white);border-width:2px;height:16px;width:16px}@keyframes spin{to{transform:rotate(1turn)}}.stepper{gap:0;list-style:none;margin:0;padding:0;width:100%}.stepper,.stepper__item{align-items:center;display:flex}.stepper__item{flex:1;gap:12px}.stepper__item:last-child{flex:0 0 auto}.stepper__circle{align-items:center;background:var(--bg-surface);border:2px solid var(--border-strong);border-radius:var(--radius-pill);color:var(--fg-muted);display:inline-flex;flex:none;font-family:var(--font-body);font-size:var(--text-md);font-weight:700;height:36px;justify-content:center;line-height:1;width:36px}.stepper__item.is-current .stepper__circle{background:var(--color-primary);border-color:var(--color-primary);color:var(--color-white)}.stepper__item.is-done .stepper__circle{background:var(--color-success);border-color:var(--color-success);color:var(--color-white)}.stepper__label{color:var(--fg-muted);font-size:var(--text-sm);font-weight:700}.stepper__desc,.stepper__label{font-family:var(--font-body);white-space:nowrap}.stepper__desc{color:var(--fg-subtle);font-size:var(--text-xs)}.stepper__item.is-current .stepper__label,.stepper__item.is-done .stepper__label{color:var(--fg-default)}.stepper__item:not(:last-child):after{background:var(--border-default);content:"";flex:1;height:2px;margin:0 12px}.stepper__item.is-done:not(:last-child):after{background:var(--color-success)}.accordion{border-radius:var(--radius-lg)}.accordion__item{border-bottom:1px solid var(--border-default)}.accordion__item:last-child{border-bottom:0}.upload{background:var(--bg-subtle);border:1.5px dashed var(--border-strong);border-radius:var(--radius-lg);color:var(--fg-muted);cursor:pointer;padding:32px 24px;text-align:center;transition:border-color var(--duration-fast),background var(--duration-fast)}.upload.dragover,.upload:hover{background:var(--color-primary-50);border-color:var(--color-primary);color:var(--color-primary)}.upload__title{color:var(--fg-default);font-family:var(--font-body);font-weight:700;margin:8px 0 4px}.divider{height:1px;width:100%}.divider,.divider--vertical{background:var(--border-default)}.divider--vertical{height:100%;min-height:24px;width:1px}.tpl-nav{background:var(--color-primary);color:var(--color-white);gap:16px;justify-content:space-between;padding:12px 24px}.tpl-nav,.tpl-nav__brand{align-items:center;display:flex}.tpl-nav__brand{gap:12px}.tpl-nav__brand img{height:32px}.tpl-nav__title{font-family:var(--font-display);font-size:var(--text-md);font-weight:700;letter-spacing:var(--tracking-wide);text-transform:var(--tt-title)}.tpl-nav__items{display:flex;gap:4px}.tpl-nav__items a{border-radius:var(--radius-sm);color:hsla(0,0%,100%,.85);font-size:var(--text-sm);font-weight:700;padding:8px 14px}.tpl-nav__items a:hover{background:hsla(0,0%,100%,.1);color:var(--color-white)}.tpl-nav__items a.active{background:hsla(0,0%,100%,.15);color:var(--color-white)}.tpl-sb{background:var(--bg-surface);border-right:1px solid var(--border-default);display:flex;flex:none;flex-direction:column;height:100%;width:240px}.tpl-sb__brand{align-items:center;border-bottom:1px solid var(--border-default);display:flex;gap:10px;padding:18px 20px}.tpl-sb__brand img{height:28px}.tpl-sb__title{font-family:var(--font-display);font-size:var(--text-sm);font-weight:700;text-transform:var(--tt-title)}.tpl-sb__nav{flex:1;overflow-y:auto;padding:12px}.tpl-sb__group{color:var(--fg-subtle);font-family:var(--font-body);font-size:var(--text-2xs);font-weight:700;letter-spacing:var(--tracking-wider);padding:12px 12px 6px;text-transform:var(--tt-label)}.tpl-sb__link{align-items:center;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;display:flex;font-size:var(--text-sm);font-weight:700;gap:10px;padding:8px 12px}.tpl-sb__link:hover{background:var(--bg-subtle)}.tpl-sb__link.active{background:var(--color-primary-100);color:var(--color-primary)}.tpl-sb__link.active:before{background:var(--color-secondary);border-radius:var(--radius-xs);content:"";height:16px;margin-left:-12px;margin-right:9px;width:3px}.divider-h{border-top:1px solid var(--border-default)}.kv{display:grid;font-size:var(--text-sm);gap:8px 16px;grid-template-columns:200px 1fr}.kv__k{color:var(--fg-muted);font-weight:700}.kv__v{color:var(--fg-default)}.list-group{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);list-style:none;margin:0;overflow:hidden;padding:0}.list-group__item--interactive{cursor:pointer}.list-group__item{align-items:center;border-bottom:1px solid var(--border-default);display:flex;gap:12px;padding:14px 18px}.list-group__item:last-child{border-bottom:0}.list-group__item:hover{background:var(--bg-subtle)}.template-frame{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);overflow:hidden}.template-frame__chrome{align-items:center;background:var(--bg-subtle);border-bottom:1px solid var(--border-default);color:var(--fg-subtle);display:flex;font-family:var(--font-mono);font-size:var(--text-xs);gap:10px;padding:8px 14px}.template-frame__chrome:before{background-image:radial-gradient(circle,#ff5f57 5px,transparent 0),radial-gradient(circle,#febc2e 5px,transparent 0),radial-gradient(circle,#28c840 5px,transparent 0);background-position:0 0,20px 0,40px 0;background-repeat:no-repeat;background-size:20px 12px;content:"";display:inline-flex;height:12px;width:56px}.number-input,.template-frame__body{background:var(--bg-surface)}.number-input{align-items:stretch;border:1px solid var(--border-default);border-radius:var(--radius-sm);display:inline-flex;height:40px;overflow:hidden}.number-input.is-invalid{border-color:var(--color-danger)}.number-input.is-disabled{opacity:.55;pointer-events:none}.number-input--block{display:flex;width:100%}.number-input--block .number-input__field{flex:1 1 auto;min-width:0;text-align:left}.number-input__btn{background:var(--bg-subtle);border:none;color:var(--fg-default);cursor:pointer;font-size:var(--text-lg);font-weight:500;width:36px}.number-input__btn:hover{background:var(--color-grey-200)}.number-input__field{background:transparent;border:none;color:var(--fg-default);font-family:var(--font-body);font-size:var(--text-sm);min-width:80px;outline:none;padding:0 12px;text-align:center}.number-input__field::-webkit-inner-spin-button,.number-input__field::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.number-input__field{-moz-appearance:textfield}.number-input__affix{background:var(--bg-subtle);padding:0 8px}.number-input__affix,.pagination{align-items:center;color:var(--fg-muted);display:inline-flex;font-size:var(--text-sm)}.pagination{font-family:var(--font-body);gap:4px}.pagination__info{color:var(--fg-muted);margin-right:12px}.pagination__btn{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;font-family:var(--font-body);font-size:var(--text-sm);height:32px;min-width:32px;padding:0 8px;transition:background var(--duration-fast)}.pagination__btn:hover:not(:disabled){background:var(--bg-subtle)}.pagination__btn:disabled{cursor:not-allowed;opacity:.4}.pagination__btn.is-active{background:var(--color-primary);border-color:var(--color-primary);color:var(--color-white)}.pagination__ellipsis{color:var(--fg-muted);padding:0 4px}.kpi{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);display:flex;flex-direction:column;gap:6px;padding:16px 18px}.kpi__head{align-items:center;display:flex;justify-content:space-between}.kpi__label{font-family:var(--font-body);font-size:var(--text-xs);letter-spacing:var(--tracking-wider);text-transform:var(--tt-label)}.kpi__icon,.kpi__label{color:var(--fg-muted)}.kpi__value{color:var(--fg-default);font-family:var(--font-display);font-size:var(--text-3xl);font-weight:700;line-height:1.2}.kpi__foot{align-items:center;display:flex;font-size:var(--text-sm);gap:10px}.kpi__delta{font-weight:600}.kpi__delta--up{color:var(--color-success)}.kpi__delta--down{color:var(--color-danger)}.kpi__delta--flat,.kpi__hint{color:var(--fg-muted)}.combobox{display:inline-block;min-width:220px;position:relative}.combobox__input,.combobox__trigger{background:var(--bg-surface);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' stroke='%235b6173' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");background-position:right 12px center;background-repeat:no-repeat;border:1px solid var(--border-strong);border-radius:var(--radius-md);color:var(--fg-default);font-family:var(--font-body);font-size:var(--text-md);min-height:var(--field-min-h,44px);padding:var(--field-pad-y,10px) 38px var(--field-pad-y,10px) var(--field-pad-x,14px);width:100%}.combobox__input:focus,.combobox__trigger:focus-visible{box-shadow:var(--focus-ring-accent);outline:none}.combobox.is-invalid .combobox__input,.combobox.is-invalid .combobox__trigger{border-color:var(--color-danger)}.combobox__trigger{-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;text-align:left}.combobox__trigger[disabled]{cursor:not-allowed;opacity:.6}.combobox__trigger-placeholder{color:var(--fg-subtle)}.combobox__clear{align-items:center;background:var(--bg-subtle);border:none;border-radius:var(--radius-pill);color:var(--fg-muted);cursor:pointer;display:inline-flex;font-size:var(--text-sm);height:22px;justify-content:center;padding:0;position:absolute;right:8px;top:50%;transform:translateY(-50%);width:22px}.combobox__clear:focus-visible{box-shadow:var(--focus-ring-accent);outline:none}.combobox__list{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-sm);box-shadow:var(--shadow-md);left:0;list-style:none;margin:0;max-height:240px;overflow-y:auto;padding:4px;position:absolute;right:0;top:calc(100% + 4px);z-index:var(--z-tooltip)}.combobox__option{border-radius:var(--radius-sm);cursor:pointer;display:flex;flex-direction:column;gap:2px;padding:8px 10px}.combobox__option.is-active{background:var(--bg-subtle)}.combobox__option.is-selected{background:var(--color-primary-50);color:var(--color-primary)}.combobox__option.is-disabled{cursor:not-allowed;opacity:.4}.combobox__option-label{color:var(--fg-default);font-size:var(--text-sm)}.combobox__option-desc{color:var(--fg-muted);font-size:var(--text-xs)}.combobox__empty{color:var(--fg-muted);font-size:var(--text-sm);padding:16px;text-align:center}.datepicker{align-items:stretch;border-radius:var(--radius-sm);display:inline-flex;position:relative;width:-moz-fit-content;width:fit-content}.datepicker:focus-within{box-shadow:var(--focus-ring-accent);outline:none}.datepicker__input{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-sm) 0 0 var(--radius-sm);color:var(--fg-default);font-family:var(--font-body);font-size:var(--text-sm);height:40px;min-width:160px;padding:0 12px}.datepicker__input:focus{outline:none}.datepicker.is-invalid .datepicker__input{border-color:var(--color-danger)}.datepicker__toggle{align-items:center;background:var(--bg-subtle);border:1px solid var(--border-default);border-left:none;border-radius:0 var(--radius-sm) var(--radius-sm) 0;color:var(--fg-default);cursor:pointer;display:inline-flex;height:40px;justify-content:center;padding:0;width:40px}.datepicker__toggle:focus-visible{outline:none}.datepicker__popover{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-md);left:0;min-width:280px;padding:12px;position:absolute;top:calc(100% + 4px);z-index:var(--z-tooltip)}.datepicker__nav{align-items:center;display:flex;justify-content:space-between;margin-bottom:8px}.datepicker__nav button{background:transparent;border:none;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;height:28px;width:28px}.datepicker__nav button:hover{background:var(--bg-subtle)}.datepicker__title{font-family:var(--font-body);font-size:var(--text-sm);font-weight:600}.datepicker__grid{display:grid;gap:2px;grid-template-columns:repeat(7,1fr)}.datepicker__dow{color:var(--fg-muted);font-size:var(--text-2xs);padding:4px 0;text-align:center;text-transform:var(--tt-label)}.datepicker__day{background:transparent;border:none;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;font-family:var(--font-body);font-size:var(--text-sm);height:32px}.datepicker__day:hover:not(:disabled){background:var(--bg-subtle)}.datepicker__day.is-today{color:var(--color-primary);font-weight:700}.datepicker__day.is-selected{background:var(--color-primary);color:var(--color-white)}.datepicker__day.is-disabled,.datepicker__day:disabled{cursor:not-allowed;opacity:.3}.gridpicker{align-items:stretch;border-radius:var(--radius-sm);display:inline-flex;position:relative;width:-moz-fit-content;width:fit-content}.gridpicker:focus-within{box-shadow:var(--focus-ring-accent);outline:none}.gridpicker__input{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-sm) 0 0 var(--radius-sm);color:var(--fg-default);cursor:pointer;font-family:var(--font-body);font-size:var(--text-sm);height:40px;min-width:160px;padding:0 12px}.gridpicker__input:focus{outline:none}.gridpicker__input::-moz-placeholder{color:var(--fg-subtle)}.gridpicker__input::placeholder{color:var(--fg-subtle)}.gridpicker.is-invalid .gridpicker__input{border-color:var(--color-danger)}.gridpicker.is-disabled{opacity:.6;pointer-events:none}.gridpicker__toggle{align-items:center;background:var(--bg-subtle);border:1px solid var(--border-default);border-left:none;border-radius:0 var(--radius-sm) var(--radius-sm) 0;color:var(--fg-default);cursor:pointer;display:inline-flex;height:40px;justify-content:center;padding:0;width:40px}.gridpicker__toggle:focus-visible{box-shadow:var(--focus-ring-accent);outline:none}.gridpicker__popover{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-md);min-width:260px;padding:12px;position:absolute}.gridpicker__nav{align-items:center;display:flex;justify-content:space-between;margin-bottom:8px}.gridpicker__nav button{background:transparent;border:none;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;height:28px;width:28px}.gridpicker__nav button:hover{background:var(--bg-subtle)}.gridpicker__nav button:focus-visible{box-shadow:var(--focus-ring-accent);outline:none}.gridpicker__title{font-family:var(--font-body);font-size:var(--text-sm);font-weight:600}.gridpicker__grid{display:grid;gap:4px;grid-template-columns:repeat(3,1fr)}.gridpicker__cell{background:transparent;border:none;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;font-family:var(--font-body);font-size:var(--text-sm);min-height:44px;padding:8px 6px}.gridpicker__cell:hover:not(:disabled){background:var(--bg-subtle)}.gridpicker__cell:focus-visible{box-shadow:var(--focus-ring-accent);outline:none}.gridpicker__cell.is-out{color:var(--fg-subtle)}.gridpicker__cell.is-selected{background:var(--color-primary);color:var(--color-white)}.gridpicker__cell:disabled{cursor:not-allowed;opacity:.3}.file-upload{background:var(--bg-subtle);border:2px dashed var(--border-default);border-radius:var(--radius-md);cursor:pointer;padding:28px 20px;text-align:center;transition:background var(--duration-fast),border-color var(--duration-fast)}.file-upload.is-drag,.file-upload:hover{background:var(--color-primary-50);border-color:var(--color-primary)}.file-upload.is-disabled{opacity:.5;pointer-events:none}.file-upload__icon{color:var(--fg-muted);font-size:var(--text-3xl);margin-bottom:8px}.file-upload__title{color:var(--fg-default);font-family:var(--font-body);font-weight:600}.file-upload__hint{color:var(--fg-muted);font-size:var(--text-xs);margin-top:4px}.data-table tr.is-selected{background:var(--color-primary-50)}.data-table tr.is-clickable{cursor:pointer;position:relative}.data-table tr.is-clickable:hover{background:var(--bg-subtle)}.data-table tr.is-clickable:focus-within{box-shadow:inset 0 0 0 2px var(--border-focus)}.data-table__rowlink{background:transparent;border:0;color:transparent;cursor:pointer;font-size:0;inset:0;margin:0;padding:0;position:absolute;z-index:1}.data-table__rowlink:focus,.data-table__rowlink:focus-visible{outline:none}.data-table tr.is-clickable .data-table__cell--above,.data-table tr.is-clickable [data-row-interactive]{position:relative;z-index:2}.data-table__th{align-items:center;display:inline-flex;gap:6px}.data-table__sort{color:var(--fg-muted);font-size:var(--text-2xs)}.accordion{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);overflow:hidden}.accordion__item+.accordion__item{border-top:1px solid var(--border-default)}.accordion__trigger{align-items:center;background:transparent;border:none;color:var(--fg-default);cursor:pointer;display:flex;font-family:var(--font-body);font-size:var(--text-sm);font-weight:600;justify-content:space-between;padding:14px 16px;text-align:left;width:100%}.accordion__trigger:hover{background:var(--bg-subtle)}.accordion__chev{color:var(--fg-muted);transition:transform var(--duration-fast)}.accordion__item.is-open .accordion__chev{transform:rotate(180deg)}.accordion__panel{color:var(--fg-default);font-size:var(--text-sm);padding:0 16px 16px}.breadcrumbs{color:var(--fg-muted);font-family:var(--font-body);font-size:var(--text-sm)}.breadcrumbs ol{display:flex;flex-wrap:wrap;gap:6px;list-style:none;margin:0;padding:0}.breadcrumbs a{color:var(--fg-muted);text-decoration:none}.breadcrumbs a:hover{color:var(--color-primary);text-decoration:underline}.breadcrumbs [aria-current=page]{color:var(--fg-default);font-weight:600}.breadcrumbs__sep{color:var(--fg-subtle);margin:0 2px}.slider{align-items:center;display:inline-flex;gap:12px;width:100%}.slider__input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;height:22px;outline:none;width:100%}.slider__input::-webkit-slider-runnable-track{background:linear-gradient(to right,var(--color-primary) 0,var(--color-primary) var(--pct,0),var(--bg-muted) var(--pct,0),var(--bg-muted) 100%);border-radius:var(--radius-pill);height:6px}.slider__input::-moz-range-track{background:var(--bg-muted);border-radius:var(--radius-pill);height:6px}.slider__input::-moz-range-progress{background:var(--color-primary);border-radius:var(--radius-pill);height:6px}.slider__input::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;background:var(--bg-surface);border:2px solid var(--color-primary);border-radius:var(--radius-pill);box-shadow:var(--shadow-xs);cursor:pointer;height:18px;margin-top:-6px;width:18px}.slider__input::-moz-range-thumb{background:var(--bg-surface);border:2px solid var(--color-primary);border-radius:var(--radius-pill);cursor:pointer;height:18px;width:18px}.slider__input:focus-visible::-webkit-slider-thumb{box-shadow:0 0 0 4px rgba(0,47,135,.18)}.slider__value{color:var(--fg-default);font-family:var(--font-mono);font-size:var(--text-sm);min-width:48px;text-align:right}.progress--sm{height:4px}.progress__bar--blue{background:var(--color-primary)}.progress__bar--warning{background:var(--color-warning)}.progress__bar--danger{background:var(--color-danger)}.progress__label{color:var(--fg-muted);display:inline-block;font-family:var(--font-mono);font-size:var(--text-xs);margin-left:8px}.progress-circle{display:inline-block;position:relative}.progress-circle__label{align-items:center;color:var(--fg-default);display:flex;font-family:var(--font-display);font-size:var(--text-sm);font-weight:700;inset:0;justify-content:center;position:absolute}.tag-input{align-items:center;background:var(--bg-surface);border:1px solid var(--border-strong);border-radius:var(--radius-md);cursor:text;display:flex;flex-wrap:wrap;gap:6px;min-height:44px;padding:6px 8px}.tag-input:focus-within{border-color:var(--color-primary);box-shadow:var(--focus-ring-brand)}.tag-input.is-disabled{opacity:.55;pointer-events:none}.tag-input__tag{align-items:center;background:var(--color-primary-100);border:1px solid var(--color-primary-200);border-radius:var(--radius-pill);color:var(--color-primary-800);display:inline-flex;font-family:var(--font-body);font-size:var(--text-xs);font-weight:600;gap:4px;padding:2px 4px 2px 10px}.tag-input__tag button{align-items:center;background:transparent;border:0;border-radius:var(--radius-pill);color:inherit;cursor:pointer;display:inline-flex;height:18px;justify-content:center;line-height:1;width:18px}.tag-input__tag button:hover{background:rgba(0,0,0,.08)}.tag-input__field{background:transparent;border:0;color:var(--fg-default);flex:1;font-family:var(--font-body);font-size:var(--text-sm);min-width:80px;outline:none;padding:4px 6px}.phone-input{align-items:stretch;background:var(--bg-surface);border:1px solid var(--border-strong);border-radius:var(--radius-md);display:inline-flex;height:44px;overflow:hidden;width:100%}.phone-input:focus-within{border-color:var(--color-primary);box-shadow:var(--focus-ring-brand)}.phone-input.is-invalid{border-color:var(--color-danger)}.phone-input.is-disabled{opacity:.55;pointer-events:none}.phone-input__prefix{align-items:center;background:var(--bg-subtle);border-right:1px solid var(--border-default);color:var(--fg-muted);display:inline-flex;font-family:var(--font-mono);font-size:var(--text-sm);padding:0 12px}.phone-input__field{background:transparent;border:0;color:var(--fg-default);flex:1;font-family:var(--font-body);font-size:var(--text-sm);outline:none;padding:0 12px}.option-group{display:flex;gap:12px}.option-group--vertical{flex-direction:column}.option-group--horizontal{flex-direction:row;flex-wrap:wrap}.option-row{align-items:flex-start;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);cursor:pointer;display:flex;gap:10px;padding:10px 12px;transition:border-color var(--duration-fast),background var(--duration-fast)}.option-row:hover{background:var(--bg-subtle);border-color:var(--border-strong)}.option-row.is-disabled{cursor:not-allowed;opacity:.55}.option-row input{accent-color:var(--color-primary);margin-top:3px}.option-row__body{display:flex;flex-direction:column;gap:2px}.option-row__label{color:var(--fg-default);font-family:var(--font-body);font-size:var(--text-sm);font-weight:600}.option-row__desc{color:var(--fg-muted);font-size:var(--text-xs)}.avatar{background:var(--color-primary-100);color:var(--color-primary)}.surface-inverse .avatar,[data-tone=inverse] .avatar{background:color-mix(in srgb,var(--fg-on-brand) 16%,transparent);color:var(--fg-on-brand)}.avatar--circle{border-radius:var(--radius-pill)}.avatar--square{border-radius:var(--radius-md)}.avatar__initials{font-family:var(--font-body);font-weight:700;letter-spacing:.02em;line-height:1;transform:translateY(.06em)}.avatar__status{border:2px solid var(--bg-surface);border-radius:var(--radius-pill);bottom:4%;box-sizing:border-box;height:34%;min-height:10px;min-width:10px;position:absolute;right:4%;width:34%}.avatar__status--online{background:var(--color-success)}.avatar__status--offline{background:var(--color-gray-400)}.avatar__status--busy{background:var(--color-danger)}.avatar-group{align-items:center;display:inline-flex}.avatar-group .avatar{border:2px solid var(--bg-surface)}.avatar.avatar--overflow{background:var(--bg-muted);color:var(--fg-default);font-size:var(--text-xs)}.is-floating.is-floating{z-index:var(--z-floating)}.menu{display:inline-block;position:relative}.menu__panel{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-md);display:flex;flex-direction:column;gap:2px;max-width:320px;min-width:220px;padding:6px;z-index:var(--z-floating)}.menu__sep{background:var(--border-default);height:1px;margin:4px 0}.menu__label{color:var(--fg-subtle);font-size:var(--text-2xs);font-weight:700;letter-spacing:var(--tracking-wider);padding:6px 10px;text-transform:var(--tt-label)}.menu__item,.menu__label{font-family:var(--font-body)}.menu__item{align-items:flex-start;background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;display:flex;font-size:var(--text-sm);gap:10px;padding:8px 10px;text-align:left;width:100%}.menu__item:disabled{cursor:not-allowed;opacity:.5}.menu__item.is-active{background:var(--bg-subtle)}.menu__item.is-destructive{color:var(--color-danger)}.menu__icon{align-items:center;display:inline-flex;flex:none;height:16px;justify-content:center;margin-top:1px;width:16px}.menu__body{display:flex;flex:1;flex-direction:column;gap:2px}.menu__label-row{align-items:center;display:flex;gap:12px;justify-content:space-between}.menu__desc{color:var(--fg-muted);font-size:var(--text-xs)}.menu__kbd{background:var(--bg-subtle);border:1px solid var(--border-default);border-radius:var(--radius-sm);color:var(--fg-muted);font-family:var(--font-mono);font-size:var(--text-2xs);padding:2px 6px}.stat{display:flex;flex-direction:column;gap:4px}.stat--center{align-items:center;text-align:center}.stat__label{color:var(--fg-muted);font-family:var(--font-body);font-size:var(--text-xs);font-weight:700;letter-spacing:var(--tracking-wider);text-transform:var(--tt-label)}.stat__value{color:var(--fg-default);font-family:var(--font-display);font-size:var(--text-3xl);font-weight:700;line-height:1.1}.stat__foot{align-items:center;display:inline-flex;font-size:var(--text-xs);gap:8px}.stat__trend--up{color:var(--color-success);font-weight:700}.stat__trend--down{color:var(--color-danger);font-weight:700}.stat__trend--flat{font-weight:700}.stat__hint,.stat__trend--flat{color:var(--fg-muted)}.multicombo{min-width:240px;position:relative}.multicombo__chips{align-items:center;background:var(--bg-surface);border:1px solid var(--border-strong);border-radius:var(--radius-md);cursor:text;display:flex;flex-wrap:wrap;gap:6px;min-height:44px;padding:6px 8px}.multicombo:focus-within .multicombo__chips,.multicombo__chips:focus-within{border-color:var(--color-primary);box-shadow:var(--focus-ring-brand)}.multicombo.is-invalid .multicombo__chips{border-color:var(--color-danger)}.multicombo.is-disabled{opacity:.55;pointer-events:none}.multicombo__chip{align-items:center;background:var(--color-primary-100);border:1px solid var(--color-primary-200);border-radius:var(--radius-pill);color:var(--color-primary-800);display:inline-flex;font-family:var(--font-body);font-size:var(--text-xs);font-weight:600;gap:4px;padding:2px 4px 2px 10px}.multicombo__chip--more{background:var(--bg-muted);border-color:var(--border-default);color:var(--fg-muted);padding:2px 10px}.multicombo__chip button{align-items:center;background:transparent;border:0;border-radius:var(--radius-pill);color:inherit;cursor:pointer;display:inline-flex;height:18px;justify-content:center;line-height:1;width:18px}.multicombo__chip button:hover{background:rgba(0,0,0,.08)}.multicombo__input{background:transparent;border:0;color:var(--fg-default);flex:1;font-family:var(--font-body);font-size:var(--text-sm);min-width:80px;outline:none;padding:4px 6px}.multicombo__list{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-md);left:0;list-style:none;margin:0;max-height:280px;overflow:auto;padding:4px;position:absolute;right:0;top:calc(100% + 4px);z-index:40}.multicombo__option{align-items:center;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;display:flex;font-family:var(--font-body);font-size:var(--text-sm);gap:10px;padding:8px 10px}.multicombo__option:has(.multicombo__option-desc){align-items:flex-start}.multicombo__option.is-active{background:var(--bg-subtle)}.multicombo__option.is-selected{color:var(--color-primary);font-weight:600}.multicombo__option.is-disabled{opacity:.5;pointer-events:none}.multicombo__check{align-items:center;border:1.5px solid var(--border-strong);border-radius:var(--radius-sm);color:var(--bg-surface);display:inline-flex;flex:none;font-size:var(--text-xs);height:18px;justify-content:center;width:18px}.multicombo__option:has(.multicombo__option-desc) .multicombo__check{margin-top:1px}.multicombo__check.is-checked{background:var(--color-primary);border-color:var(--color-primary)}.multicombo__option-body{display:flex;flex-direction:column;gap:2px}.multicombo__option-label{color:var(--fg-default);font-size:var(--text-sm)}.multicombo__option-desc{color:var(--fg-muted);font-size:var(--text-xs)}.multicombo__empty{color:var(--fg-muted);font-size:var(--text-sm);padding:12px;text-align:center}.daterange{display:inline-block;position:relative}.daterange__trigger{align-items:center;background:var(--bg-surface);border:1px solid var(--border-strong);border-radius:var(--radius-md);color:var(--fg-default);cursor:pointer;display:inline-flex;font-family:var(--font-body);font-size:var(--text-sm);gap:8px;height:44px;padding:0 14px}.daterange__trigger:focus-visible{box-shadow:var(--focus-ring-accent);outline:none}.daterange.is-invalid .daterange__trigger{border-color:var(--color-danger)}.daterange.is-disabled{opacity:.55;pointer-events:none}.daterange__icon{color:var(--fg-muted)}.daterange__popover{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);display:flex;left:0;min-width:560px;position:absolute;top:calc(100% + 6px);z-index:var(--z-tooltip)}.daterange__presets{border-right:1px solid var(--border-default);display:flex;flex-direction:column;gap:2px;list-style:none;margin:0;min-width:140px;padding:8px}.daterange__presets button{background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;font-family:var(--font-body);font-size:var(--text-sm);padding:8px 10px;text-align:left;width:100%}.daterange__presets button:hover{background:var(--bg-subtle)}.daterange__panes{flex:1;padding:12px}.daterange__nav{align-items:center;display:grid;grid-template-columns:auto 1fr auto;margin-bottom:8px}.daterange__nav button{background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;font-size:var(--text-lg);height:28px;width:28px}.daterange__nav button:hover{background:var(--bg-subtle)}.daterange__months{display:grid;gap:16px;grid-template-columns:1fr 1fr}.daterange__month{font-family:var(--font-body)}.daterange__title{font-family:var(--font-display);font-size:var(--text-sm);font-weight:700;letter-spacing:var(--tracking-wide);margin-bottom:8px;text-align:center;text-transform:var(--tt-title)}.daterange__grid{display:grid;gap:2px;grid-template-columns:repeat(7,1fr)}.daterange__dow{color:var(--fg-subtle);font-family:var(--font-body);font-size:.625rem;font-weight:700;letter-spacing:var(--tracking-wider);padding:4px 0;text-align:center;text-transform:var(--tt-label)}.daterange__day{background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;font-family:var(--font-body);font-size:var(--text-sm);height:32px}.daterange__day:hover:not(:disabled){background:var(--bg-subtle)}.daterange__day.is-today{color:var(--color-primary);font-weight:700}.daterange__day.is-range{background:var(--color-primary-100);border-radius:var(--radius-none);color:var(--color-primary-800)}.daterange__day.is-selected{background:var(--color-primary);color:var(--color-white);font-weight:700}.daterange__day.is-disabled{opacity:.3;pointer-events:none}.daterange__actions{border-top:1px solid var(--border-default);display:flex;gap:8px;justify-content:flex-end;margin-top:12px;padding-top:12px}.daterange__apply,.daterange__clear{background:transparent;border:1px solid var(--border-default);border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;font-family:var(--font-body);font-size:var(--text-sm);font-weight:700;padding:6px 14px}.daterange__apply{background:var(--color-primary);border-color:var(--color-primary);color:var(--color-white)}.daterange__apply:disabled{cursor:not-allowed;opacity:.5}.cmdk__overlay{align-items:flex-start;animation:fadeIn var(--duration-base) var(--ease-standard);background:var(--backdrop);display:flex;inset:0;justify-content:center;padding-top:12vh;position:fixed;z-index:var(--z-toast)}.cmdk__panel{animation:rise var(--duration-base) var(--ease-standard);background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);display:flex;flex-direction:column;max-width:560px;overflow:hidden;width:100%}.cmdk__searchbar{align-items:center;border-bottom:1px solid var(--border-default);display:flex;gap:10px;padding:14px 16px}.cmdk__icon{color:var(--fg-muted);font-size:var(--text-lg)}.cmdk__input{background:transparent;border:0;color:var(--fg-default);flex:1;font-family:var(--font-body);font-size:var(--text-md);outline:none}.cmdk__esc{background:var(--bg-subtle);border:1px solid var(--border-default);border-radius:var(--radius-sm);color:var(--fg-muted);font-family:var(--font-mono);font-size:var(--text-2xs);padding:2px 6px}.cmdk__list{list-style:none;margin:0;max-height:60vh;overflow:auto;padding:6px}.cmdk__group{color:var(--fg-subtle);font-size:var(--text-2xs);font-weight:700;letter-spacing:var(--tracking-wider);padding:8px 10px 4px;text-transform:var(--tt-label)}.cmdk__group,.cmdk__item{font-family:var(--font-body)}.cmdk__item{align-items:center;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;display:flex;font-size:var(--text-sm);gap:12px;padding:10px 12px}.cmdk__item.is-active{background:var(--bg-subtle)}.cmdk__item-icon{color:var(--fg-muted);flex:none;width:18px}.cmdk__item-body{display:flex;flex:1;flex-direction:column;gap:2px}.cmdk__item-label{color:var(--fg-default);font-size:var(--text-sm);font-weight:500}.cmdk__item-desc{color:var(--fg-muted);font-size:var(--text-xs)}.cmdk__kbd{background:var(--bg-default);border:1px solid var(--border-default);border-radius:var(--radius-sm);color:var(--fg-muted);font-family:var(--font-mono);font-size:var(--text-2xs);padding:2px 6px}.cmdk__empty{color:var(--fg-muted);font-size:var(--text-sm);padding:24px;text-align:center}.appshell{background:var(--bg-canvas);display:grid;grid-template-columns:248px 1fr;min-height:100vh;transition:grid-template-columns var(--duration-base,.2s) var(--ease-standard,cubic-bezier(.22,1,.36,1))}.appshell.is-collapsed{grid-template-columns:72px 1fr}.appshell__sidebar{background:var(--bg-surface);border-right:1px solid var(--border-default);display:flex;flex-direction:column;height:100vh;overflow:hidden;position:sticky;top:0}.appshell__brand{align-items:center;border-bottom:1px solid var(--border-default);display:flex;font-family:var(--font-display);font-weight:700;justify-content:center;letter-spacing:var(--tracking-wide);min-height:64px;padding:12px 20px;text-transform:var(--tt-title)}.appshell.is-collapsed .appshell__brand{overflow:hidden;padding:12px}.appshell__brand-text{overflow:hidden;transition:opacity var(--duration-fast,.12s) ease,max-width var(--duration-base,.2s) var(--ease-standard,cubic-bezier(.22,1,.36,1))}.appshell.is-collapsed .appshell__brand-text{margin:0;max-width:0;opacity:0;padding:0;pointer-events:none}.appshell__foot-text{overflow:hidden;transition:opacity var(--duration-fast,.12s) ease,max-width var(--duration-base,.2s) var(--ease-standard,cubic-bezier(.22,1,.36,1));white-space:nowrap}.appshell.is-collapsed .appshell__foot-text{margin:0;max-width:0;opacity:0;padding:0;pointer-events:none}.appshell.is-collapsed .appshell__sidebar-foot{align-items:center;flex-direction:column;gap:6px;justify-content:center;overflow:hidden;padding:8px 0}.appshell.is-collapsed .appshell__collapse{margin:0 auto}.appshell__nav{flex:1;overflow:auto;padding:12px 8px}.appshell__navsection{padding:4px 0 12px}.appshell__navlabel-section{color:var(--fg-subtle);font-family:var(--font-body);font-size:var(--text-2xs);font-weight:700;letter-spacing:var(--tracking-wider);padding:10px 12px 4px;text-transform:var(--tt-label)}.appshell.is-collapsed .appshell__navlabel-section{display:none}.appshell__nav ul{list-style:none;margin:0;padding:0}.appshell__navitem{align-items:center;border-bottom:0;border-radius:var(--radius-sm);color:var(--fg-default);display:flex;font-family:var(--font-body);font-size:var(--text-sm);font-weight:600;gap:12px;margin:1px 4px;padding:10px 12px;position:relative;text-decoration:none}.appshell__navitem:hover{background:var(--bg-subtle);border-bottom:0;color:var(--fg-default)}.appshell__navitem.is-active{background:var(--color-primary-100);color:var(--color-primary)}.appshell__navitem.is-active:before{background:var(--color-secondary);border-radius:var(--radius-xs);bottom:8px;content:"";left:-4px;position:absolute;top:8px;width:3px}.appshell__navicon{align-items:center;color:var(--fg-muted);display:inline-flex;flex:none;justify-content:center;width:20px}.appshell__navitem.is-active .appshell__navicon{color:var(--color-primary)}.appshell__navlabel{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.appshell__navbadge,.appshell__navlabel{transition:opacity var(--duration-fast,.12s) ease,max-width var(--duration-base,.2s) var(--ease-standard,cubic-bezier(.22,1,.36,1))}.appshell__navbadge{background:var(--color-secondary-100);border-radius:var(--radius-pill);color:var(--color-secondary-800);font-size:var(--text-2xs);font-weight:700;padding:1px 8px}.appshell.is-collapsed .appshell__navbadge,.appshell.is-collapsed .appshell__navlabel{margin:0;max-width:0;opacity:0;overflow:hidden;padding:0;pointer-events:none}.appshell.is-collapsed .appshell__navchildren{display:none}.appshell__navlabel-section{transition:opacity var(--duration-fast,.12s) ease,visibility 0s linear 0s}.appshell.is-collapsed .appshell__navlabel-section{height:0;opacity:0;overflow:hidden;padding:0;pointer-events:none;transition:opacity var(--duration-fast,.12s) ease,visibility 0s linear var(--duration-fast,.12s);visibility:hidden}.appshell__navchildren{padding-left:28px}.appshell__navitem--depth-1{font-size:var(--text-sm);font-weight:500;padding:8px 10px}.appshell--brand .appshell__sidebar{background:var(--color-primary);border-right-color:transparent;color:var(--color-white)}.appshell--brand .appshell__brand{border-bottom-color:hsla(0,0%,100%,.12);color:var(--color-white)}.appshell--brand .appshell__navlabel-section{color:hsla(0,0%,100%,.55)}.appshell--brand .appshell__navitem{color:hsla(0,0%,100%,.85)}.appshell--brand .appshell__navitem:hover{background:hsla(0,0%,100%,.08);color:var(--color-white)}.appshell--brand .appshell__navitem.is-active{background:hsla(0,0%,100%,.16);color:var(--color-white)}.appshell--brand .appshell__navitem.is-active:before{background:var(--color-secondary)}.appshell--brand .appshell__navicon{color:hsla(0,0%,100%,.7)}.appshell--brand .appshell__navitem.is-active .appshell__navicon,.appshell--brand .appshell__navitem:hover .appshell__navicon{color:var(--color-white)}.appshell--brand .appshell__navbadge{background:var(--color-secondary);color:var(--color-white)}.appshell--brand .appshell__sidebar-foot{border-top-color:hsla(0,0%,100%,.12)}.appshell--brand .appshell__collapse{background:transparent;color:hsla(0,0%,100%,.7)}.appshell--brand .appshell__collapse:hover{background:hsla(0,0%,100%,.1);color:var(--color-white)}.appshell.appshell--header-top{grid-template-columns:1fr;grid-template-rows:auto 1fr;height:100vh}.appshell--header-top .appshell__header{align-items:center;background:var(--bg-surface);border-bottom:1px solid var(--border-default);color:var(--fg-default);display:grid;gap:12px;grid-template-columns:1fr auto 1fr;min-height:56px;padding:8px 16px}.appshell--header-top .appshell__header-left{align-items:center;display:flex;justify-self:start}.appshell--header-top .appshell__header-center{align-items:center;display:flex;justify-self:center}.appshell--header-top .appshell__header-right{align-items:center;display:flex;gap:10px;justify-self:end}.appshell--header-top .appshell__body{display:grid;grid-template-columns:240px 1fr;min-height:0;transition:grid-template-columns var(--duration-base) var(--ease-standard)}.appshell--header-top.is-collapsed .appshell__body{grid-template-columns:0 1fr}.appshell--header-top.appshell--rail.is-collapsed .appshell__body{grid-template-columns:72px 1fr}.appshell--header-top.appshell--no-nav .appshell__body{grid-template-columns:1fr}.appshell--header-top .appshell__sidebar{height:auto;overflow:hidden}.appshell--header-top .appshell__content{min-height:0;overflow-y:auto}.appshell--header-top:not(.appshell--rail) .appshell__body{position:relative;transition:none}.appshell--header-top:not(.appshell--rail).is-collapsed .appshell__sidebar{inset:0 auto 0 0;position:absolute;transform:translateX(-100%);width:240px}.appshell--header-top:not(.appshell--rail) .appshell__sidebar{transition:transform var(--duration-base) var(--ease-standard)}.appshell--header-top.appshell--header-brand .appshell__header{background:var(--color-primary);border-bottom:1px solid hsla(0,0%,100%,.12);color:var(--color-white)}.appshell__sidebar-foot{align-items:center;border-top:1px solid var(--border-default);display:flex;gap:8px;justify-content:space-between;padding:8px}.appshell__collapse{background:transparent;border:1px solid var(--border-default);border-radius:var(--radius-sm);color:var(--fg-muted);cursor:pointer;height:28px;margin-left:auto;width:28px}.appshell__collapse:hover{background:var(--bg-subtle)}.appshell__main{display:flex;flex-direction:column;min-width:0}.appshell__topbar{align-items:center;background:var(--bg-surface);border-bottom:1px solid var(--border-default);display:flex;gap:16px;min-height:64px;padding:12px 24px;position:sticky;top:0;z-index:20}.appshell__topbar-content{align-items:center;display:flex;flex:1;gap:16px;min-width:0;overflow:hidden}.appshell__topbar-user{align-items:center;display:flex;flex:none;gap:12px}.appshell__hamburger{background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;display:none;font-size:var(--text-lg);height:36px;width:36px}.appshell__hamburger:hover{background:var(--bg-subtle)}.appshell__content{min-height:0;padding:24px}.appshell__scrim{background:var(--backdrop);display:none;inset:0;position:fixed;z-index:30}@media (max-width:900px){.appshell{grid-template-columns:1fr}.appshell__sidebar{bottom:0;left:0;position:fixed;top:0;transform:translateX(-100%);transition:transform var(--duration-base) var(--ease-standard);width:280px;z-index:40}.appshell.is-mobile-open .appshell__sidebar{transform:translateX(0)}.appshell.is-mobile-open .appshell__scrim{display:block}.appshell__hamburger{align-items:center;display:inline-flex;justify-content:center}}@media (max-width:768px){.appshell__content{padding:16px}.combobox{min-width:min(220px,100%)}.multicombo{min-width:min(240px,100%)}.datepicker__input{min-width:min(160px,100%)}.number-input{min-width:min(140px,100%)}}@media (max-width:600px){.daterange__popover{flex-direction:column;min-width:0}.daterange__months{grid-template-columns:1fr}.daterange__presets{display:none}.toast-stack{left:0;padding:0 12px;right:0}.toast{max-width:none;min-width:0;width:100%}}.page-header{margin-bottom:24px}.page-header__crumbs ol{align-items:center;color:var(--fg-muted);display:flex;flex-wrap:wrap;font-family:var(--font-body);font-size:var(--text-sm);gap:6px;list-style:none;margin:0;padding:0}.page-header__crumbs a{border:0;color:var(--fg-muted)}.page-header__crumbs a:hover{color:var(--color-primary)}.page-header__crumb-sep{color:var(--fg-subtle)}.page-header__row{align-items:flex-end;display:flex;flex-wrap:wrap;gap:16px;justify-content:space-between;margin-top:8px}.page-header__title-wrap{display:flex;flex-direction:column;gap:4px;min-width:0}.page-header__title{color:var(--fg-default);font-family:var(--font-display);font-size:clamp(var(--text-xl),3vw + .75rem,var(--text-3xl));font-weight:700;letter-spacing:var(--tracking-tight);line-height:1.1;margin:0;text-transform:var(--tt-title)}.page-header__desc{color:var(--fg-muted);font-size:var(--text-sm);margin:0}.page-header__actions{display:flex;flex-wrap:wrap;gap:8px}.page-header__meta{margin-top:12px}.chart{position:relative;width:100%}.chart--donut{align-items:stretch;display:flex;flex-direction:column;gap:var(--space-3)}.chart__donut-area{position:relative;width:100%}.chart__center{align-items:center;font-size:var(--text-base);inset:0;pointer-events:none;position:absolute;text-align:center}.chart__center,.chart__legend{color:var(--fg-default);display:flex;justify-content:center}.chart__legend{flex-wrap:wrap;font-size:var(--text-xs);gap:var(--space-2) var(--space-4);list-style:none;margin:0;padding:0}.chart__legend-item{align-items:center;display:inline-flex;gap:var(--space-2)}.chart__legend-swatch{border-radius:var(--radius-xs);flex:none;height:10px;width:10px}.chart__legend-label{font-weight:500}.sparkline{display:inline-block;vertical-align:middle}.user-cell{align-items:center;display:inline-flex;gap:var(--space-3);min-width:0}.user-cell__body{display:flex;flex-direction:column;line-height:1.3;min-width:0}.user-cell__name{color:var(--fg-default);font-size:var(--text-sm);font-weight:700}.user-cell__meta,.user-cell__name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.user-cell__meta{color:var(--fg-muted);font-size:var(--text-xs)}.status-indicator{align-items:center;color:var(--fg-default);display:inline-flex;font-size:var(--text-sm);gap:var(--space-2)}.status-indicator__dot{border-radius:var(--radius-pill);flex:none;height:8px;width:8px}.status-indicator__dot--success{background:var(--color-success)}.status-indicator__dot--warning{background:var(--color-warning)}.status-indicator__dot--danger{background:var(--color-danger)}.status-indicator__dot--info{background:var(--color-info)}.status-indicator__dot--neutral{background:var(--color-gray-400)}.status-indicator__dot.is-pulsing{animation:status-pulse 1.6s ease-out infinite}@keyframes status-pulse{0%{box-shadow:0 0 0 0 currentColor}70%{box-shadow:0 0 0 8px transparent}to{box-shadow:0 0 0 0 transparent}}.timeline{display:flex;flex-direction:column;gap:var(--space-4);list-style:none;margin:0;padding:0}.timeline__item{display:flex;gap:var(--space-3);position:relative}.timeline__item:not(:last-child):before{background:var(--border-default);bottom:calc(var(--space-4)*-1 + 4px);content:"";left:11px;position:absolute;top:28px;width:2px}.timeline__marker{align-items:center;background:var(--bg-surface);border:2px solid var(--border-default);border-radius:var(--radius-pill);color:var(--fg-muted);display:inline-flex;flex:none;height:24px;justify-content:center;margin-top:2px;width:24px;z-index:1}.timeline__marker--success{border-color:var(--color-success);color:var(--color-success)}.timeline__marker--warning{border-color:var(--color-warning);color:var(--color-warning)}.timeline__marker--danger{border-color:var(--color-danger);color:var(--color-danger)}.timeline__marker--info{border-color:var(--color-info);color:var(--color-info)}.timeline__body{flex:1;min-width:0}.timeline__title{color:var(--fg-default);font-size:var(--text-sm);font-weight:700}.timeline__meta{color:var(--fg-muted);font-size:var(--text-xs);margin-top:2px}.timeline__content{color:var(--fg-default);font-size:var(--text-sm);margin-top:var(--space-2)}.tree{font-family:var(--font-body);font-size:var(--text-sm);margin:0;padding:0}.tree,.tree__node{list-style:none}.tree__row{align-items:center;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;display:flex;gap:var(--space-2);padding:var(--space-2) var(--space-2);transition:background var(--duration-fast)}.tree__row:hover{background:var(--bg-subtle)}.tree__row:focus-visible{box-shadow:var(--focus-ring-accent);outline:none}.tree__row.is-selected{background:var(--color-primary-100);color:var(--color-primary);font-weight:700}.tree__chev{align-items:center;background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-muted);cursor:pointer;display:inline-flex;flex:none;height:18px;justify-content:center;width:18px}.tree__chev:hover{background:var(--bg-muted);color:var(--fg-default)}.tree__chev--placeholder{cursor:default}.tree__icon{color:var(--fg-muted);display:inline-flex}.tree__label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tree__meta{color:var(--fg-subtle);font-size:var(--text-xs)}.tree__children{list-style:none;margin:0;padding:0}.calendar{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);font-family:var(--font-body);overflow:hidden}.calendar__head{align-items:center;border-bottom:1px solid var(--border-default);display:flex;justify-content:space-between;padding:var(--space-3) var(--space-4)}.calendar__title{color:var(--fg-default);font-family:var(--font-display);font-size:var(--text-md);font-weight:700;text-transform:var(--tt-title)}.calendar__nav{align-items:center;background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;display:inline-flex;height:32px;justify-content:center;width:32px}.calendar__nav:hover{background:var(--bg-subtle)}.calendar__grid{display:grid;grid-template-columns:repeat(7,1fr)}.calendar__weekdays{background:var(--bg-subtle);border-bottom:1px solid var(--border-default)}.calendar__weekday{color:var(--fg-muted);font-size:var(--text-2xs);font-weight:700;letter-spacing:var(--tracking-wider);padding:var(--space-2);text-align:center;text-transform:var(--tt-label)}.calendar__day{background:var(--bg-surface);border:0;border-bottom:1px solid var(--border-default);border-right:1px solid var(--border-default);color:var(--fg-default);cursor:pointer;display:flex;flex-direction:column;font-family:var(--font-body);gap:var(--space-1);min-height:84px;padding:var(--space-2);text-align:left}.calendar__day:hover{background:var(--bg-subtle)}.calendar__day:nth-child(7n){border-right:0}.calendar__day.is-out{background:var(--bg-canvas);color:var(--fg-subtle)}.calendar__day.is-today .calendar__daynum{align-items:center;background:var(--color-primary);border-radius:var(--radius-pill);color:var(--color-white);display:inline-flex;font-weight:700;height:22px;justify-content:center;width:22px}.calendar__daynum{font-size:var(--text-xs)}.calendar__events{display:flex;flex-direction:column;gap:2px;min-width:0}.calendar__event{background:var(--color-primary-100);border-radius:var(--radius-sm);color:var(--color-primary-800);cursor:pointer;font-size:var(--text-2xs);overflow:hidden;padding:1px var(--space-2);text-overflow:ellipsis;white-space:nowrap}.calendar__event--success{background:var(--color-green-100);color:var(--color-green-800)}.calendar__event--warning{background:var(--color-yellow-100);color:var(--color-yellow-800)}.calendar__event--danger{background:var(--color-red-100);color:var(--color-red-800)}.calendar__event--info{background:var(--color-info-100);color:var(--color-info-800)}.calendar__more{color:var(--fg-muted);font-size:var(--text-2xs)}.notif{display:inline-block;position:relative}.notif__trigger{align-items:center;background:transparent;border:0;border-radius:var(--radius-pill);color:var(--fg-default);cursor:pointer;display:inline-flex;height:40px;justify-content:center;position:relative;width:40px}.notif__trigger:hover{background:var(--bg-subtle)}.notif__badge{align-items:center;background:var(--color-danger);border:2px solid var(--bg-surface);border-radius:var(--radius-pill);box-sizing:border-box;color:var(--color-white);display:inline-flex;font-size:var(--text-2xs);font-weight:700;height:16px;justify-content:center;line-height:1;min-width:16px;padding:0 4px;position:absolute;right:-2px;top:-2px}.notif__panel{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);display:flex;flex-direction:column;max-height:480px;position:absolute;right:0;top:calc(100% + var(--space-2));width:380px;z-index:var(--z-dropdown)}.notif__head{align-items:center;border-bottom:1px solid var(--border-default);display:flex;gap:var(--space-2);justify-content:space-between;padding:var(--space-3) var(--space-4)}.notif__title{color:var(--fg-default);font-weight:700}.notif__head-actions{display:flex;gap:var(--space-2)}.notif__action{background:transparent;border:0;color:var(--color-primary);cursor:pointer;font-size:var(--text-xs);font-weight:700;padding:var(--space-1) var(--space-2)}.notif__action:hover{text-decoration:underline}.notif__list{flex:1;overflow-y:auto}.notif__empty{color:var(--fg-muted);font-size:var(--text-sm);padding:var(--space-8) var(--space-4);text-align:center}.notif__item{align-items:flex-start;background:transparent;border:0;border-bottom:1px solid var(--border-default);cursor:pointer;display:flex;gap:var(--space-3);padding:var(--space-3) var(--space-4);text-align:left;width:100%}.notif__item:last-child{border-bottom:0}.notif__item:hover{background:var(--bg-subtle)}.notif__item.is-unread{background:var(--color-primary-50)}.notif__dot{border-radius:var(--radius-pill);flex:none;height:8px;margin-top:6px;width:8px}.notif__dot--info{background:var(--color-info)}.notif__dot--success{background:var(--color-success)}.notif__dot--warning{background:var(--color-warning)}.notif__dot--danger{background:var(--color-danger)}.notif__body{flex:1;min-width:0}.notif__item-title{color:var(--fg-default);font-size:var(--text-sm);font-weight:700}.notif__item-desc{color:var(--fg-muted);font-size:var(--text-xs);line-height:1.4;margin-top:2px}.notif__time{color:var(--fg-subtle);font-size:var(--text-2xs);margin-top:var(--space-1)}.codeblock{background:var(--color-gray-900);border-radius:var(--radius-md);font-family:var(--font-mono);font-size:var(--text-sm);overflow:hidden}.codeblock__head{align-items:center;background:var(--color-gray-800);border-bottom:1px solid var(--color-gray-700);display:flex;justify-content:space-between;padding:var(--space-2) var(--space-3)}.codeblock__meta{align-items:center;display:flex;gap:var(--space-3)}.codeblock__filename{color:var(--color-gray-200);font-size:var(--text-xs);font-weight:700}.codeblock__lang{color:var(--color-gray-400);font-size:var(--text-2xs);letter-spacing:var(--tracking-wider);text-transform:var(--tt-label)}.codeblock__copy{align-items:center;background:transparent;border:0;border-radius:var(--radius-sm);color:var(--color-gray-200);cursor:pointer;display:inline-flex;font-family:var(--font-body);font-size:var(--text-xs);gap:var(--space-1);padding:var(--space-1) var(--space-2)}.codeblock__copy:hover{background:var(--color-gray-700)}.codeblock__body{color:var(--color-gray-100);line-height:1.5;margin:0;overflow-x:auto;padding:var(--space-4)}.jsonviewer{background:var(--bg-subtle);border:1px solid var(--border-default);border-radius:var(--radius-md);color:var(--fg-default);font-family:var(--font-mono);font-size:var(--text-xs);line-height:1.6;overflow-x:auto;padding:var(--space-3)}.json__line,.json__node{display:block}.json__children{padding-left:var(--space-4)}.json__toggle{background:transparent;border:0;color:var(--fg-muted);cursor:pointer;font-family:var(--font-mono);font-size:var(--text-xs);padding:0 var(--space-1) 0 0}.json__key{color:var(--color-info-700)}.json__str{color:var(--color-green-700)}.json__num{color:var(--color-secondary-700)}.json__bool{color:var(--color-info);font-weight:700}.json__null{color:var(--fg-subtle);font-style:italic}.json__brace{color:var(--fg-muted)}.json__count{color:var(--fg-subtle);font-size:var(--text-2xs);padding:0 var(--space-2)}.filter-panel{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);flex:none;width:240px}.filter-panel__head{align-items:center;border-bottom:1px solid var(--border-default);display:flex;justify-content:space-between;padding:var(--space-3) var(--space-4)}.filter-panel__title{color:var(--fg-default);gap:var(--space-2)}.filter-panel__count,.filter-panel__title{align-items:center;display:inline-flex;font-weight:700}.filter-panel__count{background:var(--color-primary);border-radius:var(--radius-pill);color:var(--color-white);font-size:var(--text-2xs);justify-content:center;min-width:18px;padding:0 var(--space-2)}.filter-panel__clear{background:transparent;border:0;color:var(--color-primary);cursor:pointer;font-size:var(--text-xs);font-weight:700}.filter-panel__body{padding:var(--space-2)}.filter-section{border-bottom:1px solid var(--border-default)}.filter-section:last-child{border-bottom:0}.filter-section__head{align-items:center;background:transparent;border:0;color:var(--fg-default);cursor:pointer;display:flex;font-family:var(--font-body);font-size:var(--text-sm);font-weight:700;justify-content:space-between;padding:var(--space-3) var(--space-2);width:100%}.filter-section__head:hover{color:var(--color-primary)}.filter-section__body{display:flex;flex-direction:column;gap:var(--space-2);padding:0 var(--space-2) var(--space-3)}.filter-bar{align-items:flex-end;display:flex;flex-wrap:wrap}.filter-bar,.filter-bar__fields{gap:var(--space-3) var(--space-4)}.filter-bar__fields{display:grid;flex:1 1 auto;grid-template-columns:repeat(auto-fit,minmax(var(--filter-col-min,160px),1fr))}.filter-bar--fixed-cols .filter-bar__fields{grid-template-columns:repeat(var(--filter-cols,4),minmax(0,1fr))}.filter-bar__actions{align-items:flex-end;display:flex;gap:var(--space-2)}.filter-bar .combobox{display:block;min-width:0;width:100%}.filter-field{display:flex;flex-direction:column;gap:4px;min-width:0}.filter-field__label{color:var(--fg-muted);font-family:var(--font-body);font-size:var(--text-xs);font-weight:500;letter-spacing:normal;text-transform:none}.bulk-bar{align-items:center;background:var(--color-gray-900);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);color:var(--color-white);display:flex;gap:var(--space-3);padding:var(--space-2) var(--space-4)}.bulk-bar__count{font-size:var(--text-sm);font-weight:700;gap:var(--space-2)}.bulk-bar__clear,.bulk-bar__count{align-items:center;display:inline-flex}.bulk-bar__clear{background:transparent;border:0;border-radius:var(--radius-sm);color:var(--color-white);cursor:pointer;height:24px;justify-content:center;margin-left:var(--space-1);opacity:.85;width:24px}.bulk-bar__clear:hover{background:hsla(0,0%,100%,.12);opacity:1}.bulk-bar__clear:focus-visible{box-shadow:0 0 0 2px var(--color-white);outline:none}.bulk-bar__actions{display:flex;gap:var(--space-2);margin-left:auto}.bulk-bar .btn--outline{background:transparent;border-color:hsla(0,0%,100%,.4);color:var(--color-white)}.bulk-bar .btn--outline:hover:not(:disabled){background:hsla(0,0%,100%,.12);border-color:var(--color-white);color:var(--color-white)}.bulk-bar .btn--ghost{color:var(--color-white)}.bulk-bar .btn--ghost:hover:not(:disabled){background:hsla(0,0%,100%,.12)}.bulk-bar .btn--secondary{background:hsla(0,0%,100%,.1);border-color:transparent;color:var(--color-white)}.bulk-bar .btn--secondary:hover:not(:disabled){background:hsla(0,0%,100%,.18)}.sort-dropdown{align-items:center;display:inline-flex;gap:var(--space-2)}.sort-dropdown__label{color:var(--fg-muted);font-size:var(--text-sm);white-space:nowrap}.sort-dropdown__select{min-height:36px;min-width:180px;padding:var(--space-2) var(--space-3)}.comments{gap:var(--space-4)}.comments,.comments__list{display:flex;flex-direction:column}.comments__list{gap:var(--space-3);list-style:none;margin:0;padding:0}.comment{background:var(--bg-subtle);border-radius:var(--radius-md);display:flex;gap:var(--space-3);padding:var(--space-3)}.comment--internal{background:var(--color-yellow-50);border:1px dashed var(--color-yellow-300)}.comment__body{flex:1;min-width:0}.comment__head{align-items:center;display:flex;flex-wrap:wrap;gap:var(--space-2)}.comment__author{color:var(--fg-default);font-size:var(--text-sm);font-weight:700}.comment__time{color:var(--fg-subtle);font-size:var(--text-xs)}.comment__tag{background:var(--color-yellow-200);border-radius:var(--radius-sm);color:var(--color-yellow-900);font-size:var(--text-2xs);font-weight:700;letter-spacing:var(--tracking-wider);padding:0 var(--space-2);text-transform:var(--tt-label)}.comment__text{color:var(--fg-default);font-size:var(--text-sm);line-height:1.5;margin-top:var(--space-1)}.comments__compose{display:flex;flex-direction:column;gap:var(--space-2)}.comments__compose-actions{align-items:center;display:flex;gap:var(--space-3);justify-content:space-between}.comments__internal-toggle{align-items:center;color:var(--fg-muted);cursor:pointer;display:inline-flex;font-size:var(--text-sm);gap:var(--space-2)}.attachments{display:flex;flex-direction:column;gap:var(--space-2);list-style:none;margin:0;padding:0}.attachments__empty{border:1px dashed var(--border-default);border-radius:var(--radius-md);color:var(--fg-muted);font-size:var(--text-sm);padding:var(--space-4);text-align:center}.attachment{align-items:center;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);display:flex;gap:var(--space-3);padding:var(--space-2) var(--space-3)}.attachment__icon{color:var(--fg-muted);flex:none}.attachment__body{flex:1;min-width:0}.attachment__name{color:var(--fg-default);font-size:var(--text-sm);font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.attachment__meta{color:var(--fg-subtle);display:flex;flex-wrap:wrap;font-size:var(--text-xs);gap:var(--space-1)}.attachment__actions{display:flex;flex:none;gap:var(--space-1)}.attachment__action{align-items:center;background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-muted);cursor:pointer;display:inline-flex;height:32px;justify-content:center;text-decoration:none;width:32px}.attachment__action:hover{background:var(--bg-subtle);color:var(--fg-default)}.attachment__action--danger:hover{color:var(--color-danger)}.confirm__desc{color:var(--fg-default);font-size:var(--text-sm);line-height:1.5;margin:0}.desc-list{display:grid;gap:var(--space-2) var(--space-4);grid-template-columns:200px 1fr;margin:0}.desc-list__label{color:var(--fg-muted);font-size:var(--text-sm);font-weight:700}.desc-list__value{align-items:center;color:var(--fg-default);display:flex;font-size:var(--text-sm);gap:var(--space-2);justify-content:space-between;margin:0}.desc-list__edit{background:transparent;border:0;color:var(--color-primary);cursor:pointer;font-size:var(--text-xs);font-weight:700}.desc-list__edit:hover{text-decoration:underline}.diff{border:1px solid var(--border-default);border-radius:var(--radius-md);display:grid;font-size:var(--text-sm);grid-template-columns:200px 1fr 1fr;overflow:hidden}.diff__head{display:contents}.diff__head>div{background:var(--bg-subtle);border-bottom:1px solid var(--border-default);color:var(--fg-muted);font-size:var(--text-xs);font-weight:700;letter-spacing:var(--tracking-wide);padding:var(--space-2) var(--space-3);text-transform:var(--tt-label)}.diff__row{display:contents}.diff__row>div{border-bottom:1px solid var(--border-default);padding:var(--space-2) var(--space-3)}.diff__row:last-child>div{border-bottom:0}.diff__field{color:var(--fg-muted);font-weight:700}.diff__before{background:var(--color-red-50);color:var(--color-red-800)}.diff__after{background:var(--color-green-50);color:var(--color-green-800)}.diff__after ins,.diff__before del{text-decoration:none}@media (max-width:600px){.desc-list{gap:var(--space-1) 0;grid-template-columns:1fr}.desc-list__label{padding-top:var(--space-2)}.desc-list__value{border-bottom:1px solid var(--border-subtle);padding-bottom:var(--space-2)}.desc-list__value:last-of-type{border-bottom:0}.diff{grid-template-columns:1fr}.diff__head{display:none}.diff__row>div{border-bottom:0;padding:var(--space-2) var(--space-3)}.diff__row{border-bottom:1px solid var(--border-default);padding-bottom:var(--space-2)}.diff__row:last-child{border-bottom:0}.diff__field{background:var(--bg-subtle);font-size:var(--text-xs);letter-spacing:var(--tracking-wide);text-transform:var(--tt-label)}.diff__after[data-label]:before,.diff__before[data-label]:before{color:var(--fg-muted);content:attr(data-label) ": ";font-weight:700;margin-right:var(--space-1)}}.transfer{align-items:stretch;display:grid;gap:var(--space-3);grid-template-columns:1fr auto 1fr}.transfer__col{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);display:flex;flex-direction:column;min-width:0;overflow:hidden}.transfer__col-head{align-items:center;background:var(--bg-subtle);border-bottom:1px solid var(--border-default);display:flex;justify-content:space-between;padding:var(--space-2) var(--space-3)}.transfer__col-title{color:var(--fg-default);font-size:var(--text-sm);font-weight:700}.transfer__col-count{background:var(--bg-muted);border-radius:var(--radius-pill);color:var(--fg-muted);font-size:var(--text-xs);padding:0 var(--space-2)}.transfer__list{flex:1;list-style:none;margin:0;max-height:320px;overflow-y:auto;padding:var(--space-1)}.transfer__empty{color:var(--fg-muted);font-size:var(--text-sm);padding:var(--space-4);text-align:center}.transfer__item{align-items:center;border-radius:var(--radius-sm);cursor:pointer;display:flex;gap:var(--space-2);padding:var(--space-2)}.transfer__item:has(.transfer__item-desc){align-items:flex-start}.transfer__item:hover{background:var(--bg-subtle)}.transfer__item.is-checked{background:var(--color-primary-50)}.transfer__item.is-disabled{cursor:not-allowed;opacity:.5}.transfer__item-body{color:var(--fg-default);flex:1;font-size:var(--text-sm);min-width:0}.transfer__item-desc{color:var(--fg-muted);font-size:var(--text-xs)}.transfer__controls{display:flex;flex-direction:column;gap:var(--space-2);justify-content:center}.permissions{border:1px solid var(--border-default);border-radius:var(--radius-md);overflow-x:auto}.permissions__table{border-collapse:collapse;font-family:var(--font-body);font-size:var(--text-sm);width:100%}.permissions__table td,.permissions__table th{border-bottom:1px solid var(--border-default);padding:var(--space-3)}.permissions__table thead th{background:var(--bg-subtle);text-align:left}.permissions__action-col{min-width:240px}.permissions__role-col{min-width:120px;text-align:center}.permissions__role-head{align-items:center;display:flex;flex-direction:column;gap:var(--space-1)}.permissions__role-toggle{background:transparent;border:0;color:var(--color-primary);cursor:pointer;font-size:var(--text-2xs);font-weight:700}.permissions__action-cell{color:var(--fg-default);font-weight:600;text-align:left}.permissions__action-desc{color:var(--fg-muted);font-size:var(--text-xs);font-weight:400;margin-top:2px}.permissions__cell{text-align:center}.gallery{display:flex;flex-direction:column;gap:var(--space-3)}.gallery--thumbs-left{flex-direction:row}.gallery__main{aspect-ratio:1;background:var(--bg-subtle);border-radius:var(--radius-lg);flex:1;overflow:hidden;position:relative}.gallery__image{display:block;height:100%;-o-object-fit:contain;object-fit:contain;width:100%}.gallery__nav{align-items:center;background:rgba(0,0,0,.5);border:0;border-radius:var(--radius-pill);color:var(--color-white);cursor:pointer;display:inline-flex;height:40px;justify-content:center;opacity:0;position:absolute;top:50%;transform:translateY(-50%);transition:opacity var(--duration-fast);width:40px}.gallery__main:hover .gallery__nav{opacity:1}.gallery__nav--prev{left:var(--space-3)}.gallery__nav--next{right:var(--space-3)}.gallery__thumbs{display:flex;flex-wrap:wrap;gap:var(--space-2)}.gallery--thumbs-left .gallery__thumbs{flex-direction:column;flex-wrap:nowrap;max-width:80px}.gallery__thumb{background:var(--bg-subtle);border:2px solid transparent;border-radius:var(--radius-md);cursor:pointer;height:64px;overflow:hidden;padding:0;width:64px}.gallery__thumb img{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.gallery__thumb.is-active{border-color:var(--color-primary)}.lightbox{align-items:center;background:rgba(12,18,32,.92);cursor:zoom-out;display:flex;inset:0;justify-content:center;padding:var(--space-8);position:fixed;z-index:var(--z-tooltip)}.lightbox__image{cursor:default;max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain}.lightbox__close,.lightbox__nav{align-items:center;background:hsla(0,0%,100%,.1);border:0;border-radius:var(--radius-pill);color:var(--color-white);cursor:pointer;display:inline-flex;height:48px;justify-content:center;position:absolute;width:48px}.lightbox__close:hover,.lightbox__nav:hover{background:hsla(0,0%,100%,.2)}.lightbox__close{right:var(--space-4);top:var(--space-4)}.lightbox__nav--prev{left:var(--space-4);top:50%;transform:translateY(-50%)}.lightbox__nav--next{right:var(--space-4);top:50%;transform:translateY(-50%)}.lightbox__counter{bottom:var(--space-4);color:var(--color-white);font-family:var(--font-mono);font-size:var(--text-sm);left:50%;position:absolute;transform:translateX(-50%)}.rating{display:inline-flex;gap:2px}.rating__star{background:transparent;border:0;color:var(--color-gray-300);cursor:default;display:inline-flex;padding:2px}.rating--interactive .rating__star{cursor:pointer}.rating--interactive .rating__star:hover{color:var(--color-yellow-400)}.rating__star.is-full,.rating__star.is-half{color:var(--color-yellow-500)}.rating__star.is-half{opacity:.6}.price{align-items:baseline;display:inline-flex;flex-wrap:wrap;font-family:var(--font-body);gap:var(--space-2)}.price__amount{color:var(--fg-default);font-weight:700}.price__compare{color:var(--fg-subtle);font-size:.85em}.price__discount{background:var(--color-red-100);border-radius:var(--radius-sm);color:var(--color-red-800);font-size:var(--text-xs);font-weight:700;padding:2px var(--space-2)}.price--sm .price__amount{font-size:var(--text-md)}.price--md .price__amount{font-size:var(--text-lg)}.price--lg .price__amount{font-size:var(--text-2xl)}.price--xl .price__amount{font-family:var(--font-display);font-size:var(--text-3xl)}.qty{align-items:center;background:var(--bg-surface);border:1px solid var(--border-strong);border-radius:var(--radius-md);display:inline-flex;overflow:hidden}.qty.is-disabled{opacity:.5;pointer-events:none}.qty__btn{align-items:center;background:transparent;border:0;color:var(--fg-default);cursor:pointer;display:inline-flex;height:32px;justify-content:center;width:32px}.qty__btn:hover:not(:disabled){background:var(--bg-subtle)}.qty__btn:disabled{cursor:not-allowed;opacity:.4}.qty__input{-moz-appearance:textfield;background:transparent;border:0;border-left:1px solid var(--border-default);border-right:1px solid var(--border-default);color:var(--fg-default);font-family:var(--font-body);font-size:var(--text-sm);height:32px;text-align:center;width:44px}.qty__input::-webkit-inner-spin-button,.qty__input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.qty--sm .qty__btn{height:28px;width:28px}.qty--sm .qty__input{font-size:var(--text-xs);height:28px;width:36px}.variants{display:flex;flex-direction:column;gap:var(--space-2)}.variants__label{color:var(--fg-default);font-size:var(--text-sm);font-weight:700}.variants__options{display:flex;flex-wrap:wrap;gap:var(--space-2)}.variants__chip{background:var(--bg-surface);border:1px solid var(--border-strong);border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;font-family:var(--font-body);font-size:var(--text-sm);font-weight:700;padding:var(--space-2) var(--space-3)}.variants__chip.is-selected,.variants__chip:hover:not(:disabled){border-color:var(--color-primary)}.variants__chip.is-selected{background:var(--color-primary);color:var(--color-white)}.variants__chip.is-disabled{cursor:not-allowed;opacity:.4;text-decoration:line-through}.variants__swatch{align-items:center;border:2px solid var(--border-default);border-radius:var(--radius-pill);color:var(--color-white);cursor:pointer;display:inline-flex;height:32px;justify-content:center;position:relative;width:32px}.variants__swatch.is-selected{border-color:var(--color-primary);box-shadow:0 0 0 2px var(--bg-surface),0 0 0 4px var(--color-primary)}.variants__swatch.is-disabled{cursor:not-allowed;opacity:.4}.wishlist{align-items:center;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-pill);color:var(--fg-muted);cursor:pointer;display:inline-flex;height:36px;justify-content:center;transition:color var(--duration-fast),background var(--duration-fast);width:36px}.wishlist.is-active,.wishlist:hover{color:var(--color-danger)}.wishlist.is-active{background:var(--color-red-50);border-color:var(--color-red-200)}.promo{flex-direction:column}.promo,.promo__row{display:flex;gap:var(--space-2)}.promo__input{flex:1;letter-spacing:var(--tracking-wide);text-transform:var(--tt-label)}.promo__message{border-radius:var(--radius-sm);font-size:var(--text-xs);padding:var(--space-1) var(--space-2)}.promo__message--success{background:var(--color-green-50);color:var(--color-green-800)}.promo__message--error{background:var(--color-red-50);color:var(--color-red-800)}.shipping-progress{display:flex;flex-direction:column;gap:var(--space-2)}.shipping-progress__text{color:var(--fg-default);font-size:var(--text-sm)}.shipping-progress__track{background:var(--bg-muted);border-radius:var(--radius-pill);height:6px;overflow:hidden}.shipping-progress__bar{background:var(--color-secondary);height:100%;transition:width var(--duration-base) var(--ease-standard)}.shipping-progress.is-achieved .shipping-progress__bar{background:var(--color-success)}.shipping-progress.is-achieved .shipping-progress__text{color:var(--color-green-800);font-weight:700}.cart__empty{color:var(--fg-muted);font-size:var(--text-sm);padding:var(--space-12) var(--space-4);text-align:center}.cart__list{flex-direction:column;list-style:none;margin:0;padding:0}.cart__item,.cart__list{display:flex;gap:var(--space-3)}.cart__item{background:var(--bg-subtle);border-radius:var(--radius-md);padding:var(--space-3)}.cart__item-media{background:var(--bg-surface);border-radius:var(--radius-sm);flex:none;height:64px;overflow:hidden;width:64px}.cart__item-media img{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.cart__item-placeholder{background:var(--bg-muted);height:100%;width:100%}.cart__item-body{display:flex;flex:1;flex-direction:column;gap:var(--space-1);min-width:0}.cart__item-name{color:var(--fg-default);font-size:var(--text-sm);font-weight:700}.cart__item-variant{color:var(--fg-muted);font-size:var(--text-xs)}.cart__item-price{color:var(--color-primary);font-size:var(--text-sm);font-weight:700}.cart__item-actions{align-items:flex-end;display:flex;flex-direction:column;gap:var(--space-2)}.cart__item-qty{color:var(--fg-muted);font-size:var(--text-sm);font-weight:700}.cart__item-remove{background:transparent;border:0;color:var(--fg-muted);cursor:pointer;padding:var(--space-1)}.cart__item-remove:hover{color:var(--color-danger)}.cart__footer{display:flex;flex-direction:column;gap:var(--space-3);width:100%}.cart__totals{align-items:center;display:flex;font-size:var(--text-md);justify-content:space-between}.order-summary{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);padding:var(--space-4)}.order-summary__title{border-bottom:1px solid var(--border-default);color:var(--fg-default);font-size:var(--text-md);font-weight:700;margin-bottom:var(--space-3);padding-bottom:var(--space-2)}.order-summary__list{display:flex;flex-direction:column;gap:var(--space-2);margin:0}.order-summary__row{align-items:center;color:var(--fg-default);display:flex;font-size:var(--text-sm);gap:var(--space-3);justify-content:space-between}.order-summary__row dt{color:var(--fg-muted);margin:0}.order-summary__row dd{color:var(--fg-default);font-weight:600;margin:0}.order-summary__row.is-emphasis{border-top:1px solid var(--border-default);font-size:var(--text-md);padding-top:var(--space-2)}.order-summary__row.is-emphasis dd,.order-summary__row.is-emphasis dt{color:var(--fg-default);font-weight:700}.address-form{display:grid;gap:var(--space-3) var(--space-3);grid-template-columns:repeat(6,1fr)}.address-form__field--full{grid-column:span 6}.address-form__field--half{grid-column:span 3}.address-form__field--third{grid-column:span 2}@media (max-width:600px){.address-form__field--half,.address-form__field--third{grid-column:span 6}}.compare{border:1px solid var(--border-default);border-radius:var(--radius-lg);overflow-x:auto}.compare__table{border-collapse:collapse;font-family:var(--font-body);font-size:var(--text-sm);width:100%}.compare__table td,.compare__table th{border-bottom:1px solid var(--border-default);padding:var(--space-3);text-align:center;vertical-align:top}.compare__head{align-items:center;display:flex;flex-direction:column;gap:var(--space-2);position:relative}.compare__img{height:80px;-o-object-fit:contain;object-fit:contain;width:80px}.compare__name{color:var(--fg-default);font-weight:700}.compare__price{color:var(--color-primary);font-weight:700}.compare__remove{align-items:center;background:var(--bg-subtle);border:0;border-radius:var(--radius-pill);color:var(--fg-muted);cursor:pointer;display:inline-flex;height:24px;justify-content:center;position:absolute;right:0;top:0;width:24px}.compare__remove:hover{background:var(--color-red-50);color:var(--color-danger)}.compare__attr{background:var(--bg-subtle);color:var(--fg-muted);font-weight:700;text-align:left}.compare__cell{color:var(--fg-default)}.hero{--hero-fg:var(--fg-default);background-position:50%;background-size:cover;border-radius:var(--radius-lg);color:var(--hero-fg);padding:var(--space-12) var(--space-6);position:relative}.hero--brand{background:var(--color-primary)}.hero--brand,.hero--inverse{--hero-fg:var(--color-white)}.hero--inverse{background:var(--color-ink)}.hero--subtle{--hero-fg:var(--fg-default);background:var(--bg-subtle)}.hero--image{--hero-fg:var(--color-white)}.hero--image:before{background:linear-gradient(180deg,transparent,rgba(12,18,32,.6));border-radius:inherit;content:"";inset:0;position:absolute}.hero--sm{padding:var(--space-8) var(--space-6)}.hero--lg{padding:var(--space-20) var(--space-8)}.hero__inner{display:flex;flex-direction:column;gap:var(--space-3);max-width:720px;position:relative;width:100%}.hero--align-center .hero__inner{align-items:center;margin:0 auto;text-align:center}.hero--align-end .hero__inner{align-items:flex-end;margin-left:auto;text-align:right}.hero__eyebrow{font-size:var(--text-sm);letter-spacing:var(--tracking-wider);opacity:.85;text-transform:var(--tt-label)}.hero__eyebrow,.hero__title{color:var(--hero-fg);font-weight:700}.hero__title{font-family:var(--font-display);font-size:clamp(var(--text-3xl),5vw + 1rem,var(--text-5xl));letter-spacing:var(--tracking-tight);line-height:var(--leading-tight);margin:0;text-transform:var(--tt-title)}.hero--sm .hero__title{font-size:var(--text-3xl)}.hero__subtitle{color:var(--hero-fg);font-size:var(--text-lg);line-height:var(--leading-relaxed);margin:0;opacity:.92}.hero__actions{display:flex;flex-wrap:wrap;gap:var(--space-3);margin-top:var(--space-3)}.hero--align-center .hero__actions{justify-content:center}.hero--align-end .hero__actions{justify-content:flex-end}.hero--brand .hero__actions .btn--outline,.hero--image .hero__actions .btn--outline,.hero--inverse .hero__actions .btn--outline{background:transparent;border-color:hsla(0,0%,100%,.6);color:var(--color-white)}.hero--brand .hero__actions .btn--outline:hover:not(:disabled),.hero--image .hero__actions .btn--outline:hover:not(:disabled),.hero--inverse .hero__actions .btn--outline:hover:not(:disabled){background:hsla(0,0%,100%,.15);border-color:var(--color-white);color:var(--color-white)}.hero--brand .hero__actions .btn--ghost,.hero--image .hero__actions .btn--ghost,.hero--inverse .hero__actions .btn--ghost{color:var(--color-white)}.hero--brand .hero__actions .btn--ghost:hover:not(:disabled),.hero--image .hero__actions .btn--ghost:hover:not(:disabled),.hero--inverse .hero__actions .btn--ghost:hover:not(:disabled){background:hsla(0,0%,100%,.12)}.hero--brand .hero__actions .btn--primary,.hero--image .hero__actions .btn--primary,.hero--inverse .hero__actions .btn--primary{background:var(--color-white);color:var(--color-primary)}.hero--brand .hero__actions .btn--primary:hover:not(:disabled),.hero--image .hero__actions .btn--primary:hover:not(:disabled),.hero--inverse .hero__actions .btn--primary:hover:not(:disabled){background:hsla(0,0%,100%,.88)}.testimonial{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);display:flex;flex-direction:column;gap:var(--space-3);margin:0;padding:var(--space-6)}.testimonial__rating{color:var(--color-gray-300);display:inline-flex;gap:2px}.testimonial__rating .is-filled{color:var(--color-yellow-500)}.testimonial__quote{color:var(--fg-default);font-family:var(--font-body);font-size:var(--text-lg);font-style:italic;line-height:var(--leading-relaxed);margin:0}.testimonial__caption{align-items:center;display:flex;gap:var(--space-3);margin:0}.testimonial__avatar{border-radius:var(--radius-pill);height:40px;-o-object-fit:cover;object-fit:cover;width:40px}.testimonial__author{color:var(--fg-default);font-size:var(--text-sm);font-weight:700}.testimonial__meta{color:var(--fg-muted);font-size:var(--text-xs)}.category-nav{display:block}.category-nav__list{display:flex;gap:var(--space-1);list-style:none;margin:0;padding:0}.category-nav__item{position:relative}.category-nav__link{align-items:center;background:transparent;border:0;color:var(--fg-default);cursor:pointer;display:inline-flex;font-family:var(--font-body);font-size:var(--text-sm);font-weight:700;gap:var(--space-1);padding:var(--space-3) var(--space-4);text-decoration:none}.category-nav__link.is-open,.category-nav__link:hover{color:var(--color-primary)}.category-nav__mega{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);display:grid;gap:var(--space-5);grid-template-columns:repeat(auto-fit,minmax(180px,1fr));left:0;min-width:480px;padding:var(--space-5);position:absolute;top:100%;z-index:var(--z-dropdown)}.category-nav__group-title{color:var(--fg-muted);font-size:var(--text-xs);font-weight:700;letter-spacing:var(--tracking-wider);margin-bottom:var(--space-2);text-transform:var(--tt-label)}.category-nav__group-items{display:flex;flex-direction:column;gap:var(--space-1);list-style:none;margin:0;padding:0}.category-nav__group-items a{border:0;color:var(--fg-default);font-size:var(--text-sm);padding:var(--space-1) 0;text-decoration:none}.category-nav__group-items a:hover{color:var(--color-primary)}.popover{display:inline-block;position:relative}.popover__trigger{cursor:pointer;display:inline-flex}.popover__content{animation:popover-fade var(--duration-fast,.12s) var(--ease-standard,cubic-bezier(.22,1,.36,1));background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);color:var(--fg-default);font-size:var(--text-sm);max-width:320px;min-width:200px;padding:var(--space-3);z-index:var(--z-popover,1300)}@keyframes popover-fade{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.hover-card{display:inline-block;position:relative}.hover-card__trigger{display:inline-flex}.hover-card__content{animation:popover-fade var(--duration-fast,.12s) var(--ease-standard,cubic-bezier(.22,1,.36,1));background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);color:var(--fg-default);font-size:var(--text-sm);max-width:320px;min-width:220px;padding:var(--space-3);z-index:var(--z-popover,1300)}.context-menu{display:inline-block}.context-menu__menu{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);font-size:var(--text-sm);list-style:none;margin:0;min-width:200px;padding:var(--space-1)}.context-menu__item{align-items:center;background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;display:flex;gap:var(--space-2);padding:var(--space-2) var(--space-3);text-align:left;width:100%}.context-menu__item:hover:not(:disabled){background:var(--bg-subtle)}.context-menu__item.is-disabled,.context-menu__item:disabled{cursor:not-allowed;opacity:.5}.context-menu__item--danger{color:var(--color-danger)}.context-menu__icon{display:inline-flex}.context-menu__separator{background:var(--border-default);height:1px;margin:var(--space-1) 0}.toggle{align-items:center;background:transparent;border:1px solid transparent;border-radius:var(--radius-md);color:var(--fg-default);cursor:pointer;display:inline-flex;font-weight:500;gap:var(--space-2);justify-content:center;transition:background var(--duration-fast,.12s),color var(--duration-fast,.12s),border-color var(--duration-fast,.12s)}.toggle--sm{font-size:var(--text-xs);height:28px;padding:4px var(--space-2)}.toggle--md{font-size:var(--text-sm);height:36px;padding:6px var(--space-3)}.toggle--lg{font-size:var(--text-base);height:44px;padding:8px var(--space-4)}.toggle--outline{border-color:var(--border-default)}.toggle:hover:not(:disabled):not(.is-pressed):not([aria-pressed=true]){background:var(--bg-subtle)}.toggle.is-pressed,.toggle[aria-pressed=true]{background:var(--bg-inverse,var(--fg-default));border-color:transparent;color:var(--bg-canvas)}.toggle.is-pressed:hover:not(:disabled),.toggle[aria-pressed=true]:hover:not(:disabled){filter:brightness(1.15)}.toggle:disabled{cursor:not-allowed;opacity:.5}.toggle-group{background:var(--bg-subtle);border:1px solid var(--border-default);border-radius:var(--radius-md);display:inline-flex;gap:2px;padding:2px}.toggle-group__item{border:0;border-radius:calc(var(--radius-md) - 2px)}.toggle-group__item:hover:not(:disabled){background:var(--bg-surface)}.toggle-group__item.is-pressed,.toggle-group__item[aria-pressed=true]{background:var(--bg-surface);box-shadow:var(--shadow-sm);color:var(--fg-default)}.toggle-group--segmented{display:flex}.toggle-group--segmented .toggle-group__item{flex:1 1 0}.input-otp{display:inline-flex;gap:var(--space-2)}.input-otp__slot{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);caret-color:var(--color-primary);color:var(--fg-default);font-family:var(--font-mono,ui-monospace,monospace);font-size:var(--text-xl);font-weight:600;height:52px;text-align:center;transition:border-color var(--duration-fast,.12s),box-shadow var(--duration-fast,.12s);width:44px}.input-otp__slot:focus{border-color:var(--border-focus,var(--color-primary));box-shadow:0 0 0 3px color-mix(in srgb,var(--color-primary) 25%,transparent);outline:none}.input-otp.is-invalid .input-otp__slot{border-color:var(--color-danger)}.input-otp.is-disabled .input-otp__slot{opacity:.5}.separator{background:var(--border-default);flex:none}.separator--horizontal{height:1px;width:100%}.separator--vertical{align-self:stretch;height:100%;width:1px}.carousel{position:relative}.carousel:focus{outline:none}.carousel:focus-visible{border-radius:var(--radius-md);box-shadow:var(--focus-ring-accent);outline:none}.carousel__viewport{border-radius:var(--radius-lg);overflow:hidden;position:relative}.carousel__track{display:flex;transition:transform .32s var(--ease-standard,cubic-bezier(.22,1,.36,1))}.carousel__slide{flex:0 0 100%;min-width:0}.carousel__control{align-items:center;background:color-mix(in srgb,var(--bg-surface) 90%,transparent);border:1px solid var(--border-default);border-radius:var(--radius-pill);box-shadow:var(--shadow-sm);color:var(--fg-default);cursor:pointer;display:inline-flex;height:40px;justify-content:center;position:absolute;top:50%;transform:translateY(-50%);width:40px}.carousel__control:hover:not(:disabled){background:var(--bg-surface)}.carousel__control:disabled{cursor:not-allowed;opacity:.4}.carousel__control--prev{left:var(--space-2)}.carousel__control--next{right:var(--space-2)}.carousel__dots{display:flex;gap:var(--space-2);justify-content:center;list-style:none;margin-top:var(--space-3);padding:0}.carousel__dot{background:var(--border-strong,var(--border-default));border:0;border-radius:var(--radius-pill);cursor:pointer;height:8px;padding:0;transition:background var(--duration-fast,.12s),width var(--duration-fast,.12s);width:8px}.carousel__dot.is-active{background:var(--color-primary);width:24px}.resizable{display:flex;height:100%;width:100%}.resizable--horizontal{flex-direction:row}.resizable--vertical{flex-direction:column}.resizable__panel{min-height:0;min-width:0;overflow:auto}.resizable__handle{background:var(--border-default);flex:none;position:relative;transition:background var(--duration-fast,.12s)}.resizable__handle:focus-visible,.resizable__handle:hover{background:var(--color-primary)}.resizable__handle--horizontal{cursor:col-resize;width:4px}.resizable__handle--vertical{cursor:row-resize;height:4px}.menubar{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);display:inline-flex;gap:2px;padding:2px}.menubar__menu{position:relative}.menubar__trigger{background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;font-weight:500;padding:var(--space-1) var(--space-3)}.menubar__trigger.is-open,.menubar__trigger:hover{background:var(--bg-subtle)}.menubar__list{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);left:0;list-style:none;margin:0;min-width:200px;padding:var(--space-1);position:absolute;top:calc(100% + 4px);z-index:var(--z-popover,1300)}.menubar__item{align-items:center;background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;display:flex;gap:var(--space-4);justify-content:space-between;padding:var(--space-2) var(--space-3);text-align:left;width:100%}.menubar__item:hover:not(:disabled){background:var(--bg-subtle)}.menubar__item.is-disabled,.menubar__item:disabled{cursor:not-allowed;opacity:.5}.menubar__shortcut{color:var(--fg-subtle);font-family:var(--font-mono,ui-monospace,monospace);font-size:var(--text-xs)}.menubar__separator{background:var(--border-default);height:1px;margin:var(--space-1) 0}.nav-menu{position:relative}.nav-menu__list{display:flex;gap:var(--space-1);list-style:none;margin:0;padding:0}.nav-menu__item{position:relative}.nav-menu__trigger{align-items:center;background:transparent;border:0;border-radius:var(--radius-sm);color:var(--fg-default);cursor:pointer;display:inline-flex;font-weight:500;gap:var(--space-1);padding:var(--space-2) var(--space-3);text-decoration:none}.nav-menu__trigger.is-open,.nav-menu__trigger:hover{background:var(--bg-subtle);color:var(--color-primary)}.nav-menu__chevron{transition:transform var(--duration-fast,.12s)}.nav-menu__trigger.is-open .nav-menu__chevron{transform:rotate(180deg)}.nav-menu__panel{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);display:grid;gap:var(--space-3);grid-template-columns:1fr;left:0;min-width:320px;padding:var(--space-3);position:absolute;top:calc(100% + 8px);z-index:var(--z-popover,1300)}.nav-menu__featured{background:var(--bg-subtle);border-radius:var(--radius-sm);padding:var(--space-3)}.nav-menu__featured strong{color:var(--fg-default);display:block;font-size:var(--text-base)}.nav-menu__featured p{color:var(--fg-muted);font-size:var(--text-sm);margin:var(--space-1) 0 0}.nav-menu__sublist{display:flex;flex-direction:column;gap:2px;list-style:none;margin:0;padding:0}.nav-menu__link{align-items:flex-start;border-radius:var(--radius-sm);color:var(--fg-default);display:flex;gap:var(--space-2);padding:var(--space-2);text-decoration:none}.nav-menu__link:hover{background:var(--bg-subtle);color:var(--color-primary)}.nav-menu__link-icon{display:inline-flex}.nav-menu__link-body{display:flex;flex-direction:column;gap:2px}.nav-menu__link-label{font-size:var(--text-sm);font-weight:500}.nav-menu__link-desc{color:var(--fg-muted);font-size:var(--text-xs)}.grid--responsive{display:grid;grid-template-columns:repeat(var(--grid-cols,1),minmax(0,1fr))}@media (min-width:480px){.grid--responsive{grid-template-columns:repeat(var(--grid-cols-sm,var(--grid-cols,1)),minmax(0,1fr))}}@media (min-width:768px){.grid--responsive{grid-template-columns:repeat(var(--grid-cols-md,var(--grid-cols-sm,var(--grid-cols,1))),minmax(0,1fr))}}@media (min-width:1024px){.grid--responsive{grid-template-columns:repeat(var(--grid-cols-lg,var(--grid-cols-md,var(--grid-cols-sm,var(--grid-cols,1)))),minmax(0,1fr))}}@media (min-width:1280px){.grid--responsive{grid-template-columns:repeat(var(--grid-cols-xl,var(--grid-cols-lg,var(--grid-cols-md,var(--grid-cols-sm,var(--grid-cols,1))))),minmax(0,1fr))}}}@media (prefers-reduced-motion:reduce){*,:after,:before{animation-duration:.01ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition-duration:.01ms!important}}.aspect-ratio{overflow:hidden;position:relative;width:100%}.aspect-ratio>*{height:100%;inset:0;position:absolute;width:100%}.aspect-ratio>iframe,.aspect-ratio>img,.aspect-ratio>video{display:block;-o-object-fit:cover;object-fit:cover}.collapsible__trigger{background:transparent;border:0;color:inherit;cursor:pointer;padding:0}.collapsible__trigger:focus-visible{border-radius:var(--radius-sm);box-shadow:var(--focus-ring-accent);outline:none}.scroll-area{scrollbar-color:var(--border-strong) transparent;scrollbar-width:thin}.scroll-area--vertical{overflow-x:hidden;overflow-y:auto}.scroll-area--horizontal{overflow-x:auto;overflow-y:hidden}.scroll-area--both{overflow:auto}.scroll-area::-webkit-scrollbar{height:8px;width:8px}.scroll-area::-webkit-scrollbar-track{background:transparent}.scroll-area::-webkit-scrollbar-thumb{background:var(--border-strong);background-clip:padding-box;border:2px solid transparent;border-radius:var(--radius-pill)}.scroll-area::-webkit-scrollbar-thumb:hover{background-color:var(--fg-muted)}.scroll-area::-webkit-scrollbar-corner{background:transparent}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@misael703/ui",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.27.0",
|
|
4
4
|
"description": "Generic React + TypeScript UI kit, optimized for Next.js. Tokens, accessible components, runtime-configurable theming via presets.",
|
|
5
5
|
"author": "Misael Ocas <misael.ocas@gmail.com>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/AppShell.tsx"],"names":["React","NavItemNode","cx","jsxs","Fragment","jsx","useLocale","ChevronRight","ChevronLeft","MenuIcon"],"mappings":"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","file":"chunk-6BRRRENF.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { ChevronLeft, ChevronRight, MenuIcon } from './Icons';\nimport { useLocale } from '../locale/LocaleProvider';\n\n// ---------- AppShell (Sidebar + Topbar + Content) -----------------------\n// Designed to drop into a Next.js app/layout.tsx as a Client Component shell.\n\nexport interface NavItem {\n id: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n href?: string;\n active?: boolean;\n badge?: React.ReactNode;\n onSelect?: () => void;\n children?: NavItem[];\n}\n\nexport interface NavSection {\n id?: string;\n label?: React.ReactNode;\n items: NavItem[];\n}\n\nexport type AppShellTheme = 'default' | 'brand';\n\nexport type AppShellHeaderLayout = 'side' | 'top';\n\n/**\n * Collapse API handed to header-slot render-props so a consumer-placed control\n * (e.g. a hamburger in `left`) can drive the sidebar — crucially in\n * **uncontrolled** mode, where the `top` layout otherwise has no toggle\n * affordance. This is what lets `persistKey` (uncontrolled) coexist with a\n * custom header trigger: the kit owns the state + persistence, the consumer\n * owns the trigger's look and placement.\n */\nexport interface AppShellHeaderApi {\n /** Current collapsed state. */\n collapsed: boolean;\n /** Flip the collapsed state (persisted if `persistKey` is set). */\n toggle: () => void;\n /** Set the collapsed state explicitly. */\n setCollapsed: (collapsed: boolean) => void;\n}\n\n/**\n * A header slot: a static node, or a render-prop receiving {@link AppShellHeaderApi}.\n * The function form is the only way to toggle an uncontrolled shell from the\n * header (no built-in toggle exists in `top`).\n */\nexport type AppShellHeaderSlot =\n | React.ReactNode\n | ((api: AppShellHeaderApi) => React.ReactNode);\n\nexport interface AppShellHeader {\n /** Left slot — typically a menu/hamburger trigger or back action. */\n left?: AppShellHeaderSlot;\n /** Center slot — typically the brand (Logo). Lands at the true viewport centre. */\n center?: AppShellHeaderSlot;\n /** Right slot — notifications, user avatar, utilities. */\n right?: AppShellHeaderSlot;\n}\n\n/**\n * Props shared by both layouts. The layout-specific props live in\n * `AppShellSideProps` / `AppShellTopProps`; `AppShellProps` is the\n * discriminated union of the two, keyed on `headerLayout`.\n */\nexport interface AppShellBaseProps {\n sections: NavSection[];\n footer?: React.ReactNode;\n defaultCollapsed?: boolean;\n collapsed?: boolean;\n onCollapsedChange?: (c: boolean) => void;\n /**\n * Persist the collapsed state in `localStorage[persistKey]` so it survives\n * reloads. Opt-in: omit it and the shell keeps the default behaviour (resets\n * to `defaultCollapsed` on each mount). SSR-safe — the initial render still\n * uses `defaultCollapsed` (no hydration mismatch); the stored value is read\n * after mount, so a differing value may flash for one frame. Ignored in\n * controlled mode (when `collapsed` is provided): the host owns persistence.\n */\n persistKey?: string;\n children: React.ReactNode;\n className?: string;\n /**\n * Color theme (applies to both layouts):\n * - `default` (light): claro, mejor para apps data-heavy de uso prolongado.\n * - `brand`: superficie azul de marca con texto blanco. Mayor brand recall.\n * En `side` tiñe el sidebar; en `top` tiñe header + sidebar (un solo knob).\n */\n theme?: AppShellTheme;\n /** Render-prop for navigation links so the host app can use Next.js Link, etc. */\n linkAs?: (item: NavItem, content: React.ReactNode, className: string) => React.ReactNode;\n}\n\n/**\n * Sidebar layout (default, `headerLayout=\"side\"` or omitted). The brand\n * block + collapse rail live in the sidebar; the topbar sits over the\n * content with a mobile hamburger. `header` is **not** valid here — that\n * slot belongs to the `top` layout.\n */\nexport interface AppShellSideProps extends AppShellBaseProps {\n headerLayout?: 'side';\n /** Brand node in the sidebar header (expanded state). */\n brand?: React.ReactNode;\n /** Brand node shown when the rail is collapsed. Falls back to `brand`. */\n brandCollapsed?: React.ReactNode;\n /** Content of the topbar over the page (search, etc.). */\n topbar?: React.ReactNode;\n /** User slot at the right of the topbar (avatar/menu). */\n user?: React.ReactNode;\n /** Not valid in the `side` layout — the header slots belong to `top`. */\n header?: never;\n}\n\n/**\n * Top-header layout (`headerLayout=\"top\"`, v1.15.0). Full-width header\n * above the body with three slots (`header.{left,center,right}`); the\n * centre slot lands at the **true viewport centre** (1fr·auto·1fr grid).\n * The sidebar has no brand block and `collapsed` hides it entirely (no\n * 72px rail); the header is **invariant** to the collapse. `theme=\"brand\"`\n * tints both bands. The `side`-only props are **not** valid here — put your\n * chrome in `header`.\n */\nexport interface AppShellTopProps extends AppShellBaseProps {\n headerLayout: 'top';\n /** Slots for the full-width header. Brand usually goes in `center`. */\n header?: AppShellHeader;\n /**\n * Theme of the **header band only**, independent of the sidebar (`theme`).\n * Defaults to `theme`, so `theme=\"brand\"` still tints both bands (no\n * change for existing consumers). Set `theme=\"default\" headerTheme=\"brand\"`\n * for a branded top bar over a neutral, legible sidebar — common in\n * data-heavy admin apps.\n */\n headerTheme?: AppShellTheme;\n /**\n * Collapse to an icon rail (72px) instead of hiding the sidebar entirely.\n * Default `false` → `collapsed` hides the sidebar (the original `top`\n * behavior). `true` → `collapsed` keeps a 72px rail showing the nav icons\n * (labels hidden, active-item bar kept) — like the `side` layout — and\n * renders a built-in expand/collapse toggle at the bottom of the rail.\n */\n collapsedRail?: boolean;\n /** Not valid in `top` — use `header.center` for the brand. */\n brand?: never;\n /** Not valid in `top` — the sidebar collapses entirely. */\n brandCollapsed?: never;\n /** Not valid in `top` — use the `header` slots. */\n topbar?: never;\n /** Not valid in `top` — use `header.right`. */\n user?: never;\n}\n\n/**\n * Discriminated union keyed on `headerLayout`. TypeScript enforces that\n * `header` is only accepted with `headerLayout=\"top\"` and that\n * `brand`/`brandCollapsed`/`topbar`/`user` are only accepted with the\n * (default) `side` layout — passing the wrong prop for the layout is a\n * compile error instead of being silently ignored at runtime.\n */\nexport type AppShellProps = AppShellSideProps | AppShellTopProps;\n\n// Recursive nav item, memoized so a single item's parent re-render doesn't\n// churn through every other item in the tree. Stability of `linkAs` and\n// `onCloseMobile` is the parent's responsibility (we stabilize\n// `onCloseMobile` via useCallback below; consumers should memoize `linkAs`\n// if they care about avoiding renders, but for typical Next.js Link usage\n// the inline arrow is rarely a hot path).\ninterface NavItemNodeProps {\n item: NavItem;\n depth: number;\n linkAs?: AppShellBaseProps['linkAs'];\n onCloseMobile: () => void;\n}\n\nconst NavItemNode = React.memo(function NavItemNode({\n item, depth, linkAs, onCloseMobile,\n}: NavItemNodeProps) {\n const klass = cx('appshell__navitem', item.active && 'is-active', `appshell__navitem--depth-${depth}`);\n const inner = (\n <>\n {item.icon && <span className=\"appshell__navicon\" aria-hidden=\"true\">{item.icon}</span>}\n <span className=\"appshell__navlabel\">{item.label}</span>\n {item.badge && <span className=\"appshell__navbadge\">{item.badge}</span>}\n </>\n );\n const node = item.href && linkAs\n ? linkAs(item, inner, klass)\n : (\n <a\n href={item.href ?? '#'}\n className={klass}\n aria-current={item.active ? 'page' : undefined}\n onClick={(e) => {\n if (!item.href) e.preventDefault();\n item.onSelect?.();\n onCloseMobile();\n }}\n >\n {inner}\n </a>\n );\n return (\n <li>\n {node}\n {item.children && item.children.length > 0 && (\n <ul className=\"appshell__navchildren\">\n {item.children.map((c) => (\n <NavItemNode key={c.id} item={c} depth={depth + 1} linkAs={linkAs} onCloseMobile={onCloseMobile} />\n ))}\n </ul>\n )}\n </li>\n );\n});\n\nexport function AppShell(props: AppShellProps) {\n const {\n sections, footer, defaultCollapsed = false,\n collapsed: ctrlCollapsed, onCollapsedChange, persistKey,\n children, className, theme = 'default', linkAs,\n } = props;\n const [internalCollapsed, setInternalCollapsed] = React.useState(defaultCollapsed);\n const [mobileOpen, setMobileOpen] = React.useState(false);\n const t = useLocale();\n const collapsed = ctrlCollapsed ?? internalCollapsed;\n\n // SSR-safe persistence: the initial render uses `defaultCollapsed` (server\n // and first client render agree → no hydration mismatch), then we sync from\n // localStorage after mount. Only in uncontrolled mode; reads can throw\n // (Safari private mode), so they're guarded. Runs once per persistKey.\n React.useEffect(() => {\n if (persistKey == null || ctrlCollapsed !== undefined) return;\n try {\n const stored = window.localStorage.getItem(persistKey);\n if (stored === '0' || stored === '1') setInternalCollapsed(stored === '1');\n } catch {\n /* localStorage unavailable — keep defaultCollapsed */\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- sync once at mount; ctrlCollapsed read intentionally not tracked\n }, [persistKey]);\n\n const setCollapsed = (v: boolean) => {\n if (ctrlCollapsed === undefined) setInternalCollapsed(v);\n if (persistKey != null && ctrlCollapsed === undefined) {\n try {\n window.localStorage.setItem(persistKey, v ? '1' : '0');\n } catch {\n /* localStorage unavailable — persistence is best-effort */\n }\n }\n onCollapsedChange?.(v);\n };\n const closeMobile = React.useCallback(() => setMobileOpen(false), []);\n\n // Top-header variant: full-width header above the body. Topbar is\n // invariant to `collapsed` (only the inner body's columns animate); brand\n // lives in `header.center` at the true viewport centre. Default\n // `headerLayout=\"side\"` falls through to the legacy JSX below\n // (byte-identical for existing consumers). The `props.headerLayout`\n // check narrows the discriminated union, so `header` (top) and\n // `brand`/`topbar`/`user` (side) are each only in scope in their branch.\n if (props.headerLayout === 'top') {\n const { header } = props;\n // Header band themes independently of the sidebar; defaults to `theme`\n // so `theme=\"brand\"` keeps tinting both bands (back-compat).\n const headerTheme = props.headerTheme ?? theme;\n const collapsedRail = props.collapsedRail ?? false;\n // Hand the collapse API to header slots so a consumer trigger (hamburger)\n // can toggle the shell — the only path in uncontrolled `top` (no built-in\n // toggle here). A function slot is called with the API; a node renders as-is.\n const headerApi: AppShellHeaderApi = { collapsed, toggle: () => setCollapsed(!collapsed), setCollapsed };\n const slot = (s: AppShellHeaderSlot): React.ReactNode =>\n typeof s === 'function' ? (s as (api: AppShellHeaderApi) => React.ReactNode)(headerApi) : s;\n return (\n <div className={cx('appshell', `appshell--${theme}`, 'appshell--header-top', `appshell--header-${headerTheme}`, collapsedRail && 'appshell--rail', collapsed && 'is-collapsed', className)}>\n {/* On a brand header the band is dark, so re-scope foreground tokens\n via data-tone=\"inverse\" — anything inside (Avatar, badges, links)\n becomes band-aware automatically without per-call-site colors. */}\n <header className=\"appshell__header\" role=\"banner\" data-tone={headerTheme === 'brand' ? 'inverse' : undefined}>\n <div className=\"appshell__header-left\">{slot(header?.left)}</div>\n <div className=\"appshell__header-center\">{slot(header?.center)}</div>\n <div className=\"appshell__header-right\">{slot(header?.right)}</div>\n </header>\n <div className=\"appshell__body\">\n <aside className=\"appshell__sidebar\" aria-label={t['appshell.mainNav']}>\n <nav className=\"appshell__nav\">\n {sections.map((s, i) => (\n <div key={s.id ?? i} className=\"appshell__navsection\">\n {s.label && <div className=\"appshell__navlabel-section\">{s.label}</div>}\n <ul>{s.items.map((it) => (\n <NavItemNode key={it.id} item={it} depth={0} linkAs={linkAs} onCloseMobile={closeMobile} />\n ))}</ul>\n </div>\n ))}\n </nav>\n {footer != null && (\n <div className=\"appshell__sidebar-foot\">{footer}</div>\n )}\n </aside>\n <main className=\"appshell__content\" role=\"main\">{children}</main>\n </div>\n </div>\n );\n }\n\n const { brand, brandCollapsed, topbar, user } = props;\n return (\n <div className={cx('appshell', `appshell--${theme}`, collapsed && 'is-collapsed', mobileOpen && 'is-mobile-open', className)}>\n <aside className=\"appshell__sidebar\" aria-label={t['appshell.mainNav']}>\n <div className=\"appshell__brand\">\n {collapsed ? (brandCollapsed ?? brand) : brand}\n </div>\n <nav className=\"appshell__nav\">\n {sections.map((s, i) => (\n <div key={s.id ?? i} className=\"appshell__navsection\">\n {s.label && <div className=\"appshell__navlabel-section\">{s.label}</div>}\n <ul>{s.items.map((it) => (\n <NavItemNode key={it.id} item={it} depth={0} linkAs={linkAs} onCloseMobile={closeMobile} />\n ))}</ul>\n </div>\n ))}\n </nav>\n <div className=\"appshell__sidebar-foot\">\n {footer}\n <button\n type=\"button\"\n className=\"appshell__collapse\"\n onClick={() => setCollapsed(!collapsed)}\n aria-expanded={!collapsed}\n aria-label={collapsed ? t['appshell.expandMenu'] : t['appshell.collapseMenu']}\n title={collapsed ? t['appshell.expand'] : t['appshell.collapse']}\n >\n {collapsed ? <ChevronRight size={14} /> : <ChevronLeft size={14} />}\n </button>\n </div>\n </aside>\n\n <div className=\"appshell__main\">\n <header className=\"appshell__topbar\">\n <button\n type=\"button\"\n className=\"appshell__hamburger\"\n aria-label={t['appshell.openMenu']}\n aria-expanded={mobileOpen}\n onClick={() => setMobileOpen((o) => !o)}\n ><MenuIcon size={20} /></button>\n <div className=\"appshell__topbar-content\">{topbar}</div>\n {user && <div className=\"appshell__topbar-user\">{user}</div>}\n </header>\n <main className=\"appshell__content\" role=\"main\">{children}</main>\n </div>\n\n {mobileOpen && (\n <div className=\"appshell__scrim\" onClick={() => setMobileOpen(false)} aria-hidden=\"true\" />\n )}\n </div>\n );\n}\n\n// ---------- PageHeader --------------------------------------------------\nexport interface PageHeaderProps {\n title: React.ReactNode;\n description?: React.ReactNode;\n breadcrumbs?: Array<{ label: React.ReactNode; href?: string }>;\n actions?: React.ReactNode;\n meta?: React.ReactNode;\n className?: string;\n}\n\nexport function PageHeader({ title, description, breadcrumbs, actions, meta, className }: PageHeaderProps) {\n const t = useLocale();\n return (\n <div className={cx('page-header', className)}>\n {breadcrumbs && breadcrumbs.length > 0 && (\n <nav className=\"page-header__crumbs\" aria-label={t['appshell.breadcrumb']}>\n <ol>\n {breadcrumbs.map((c, i) => (\n <li key={i}>\n {c.href ? <a href={c.href}>{c.label}</a> : <span aria-current=\"page\">{c.label}</span>}\n {i < breadcrumbs.length - 1 && <span className=\"page-header__crumb-sep\" aria-hidden=\"true\">/</span>}\n </li>\n ))}\n </ol>\n </nav>\n )}\n <div className=\"page-header__row\">\n <div className=\"page-header__title-wrap\">\n <h1 className=\"page-header__title\">{title}</h1>\n {description && <p className=\"page-header__desc\">{description}</p>}\n </div>\n {actions && <div className=\"page-header__actions\">{actions}</div>}\n </div>\n {meta && <div className=\"page-header__meta\">{meta}</div>}\n </div>\n );\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/AppShell.tsx"],"names":["NavItemNode"],"mappings":"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","file":"chunk-SHS4QYYN.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { ChevronLeft, ChevronRight, MenuIcon } from './Icons';\nimport { useLocale } from '../locale/LocaleProvider';\n\n// ---------- AppShell (Sidebar + Topbar + Content) -----------------------\n// Designed to drop into a Next.js app/layout.tsx as a Client Component shell.\n\nexport interface NavItem {\n id: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n href?: string;\n active?: boolean;\n badge?: React.ReactNode;\n onSelect?: () => void;\n children?: NavItem[];\n}\n\nexport interface NavSection {\n id?: string;\n label?: React.ReactNode;\n items: NavItem[];\n}\n\nexport type AppShellTheme = 'default' | 'brand';\n\nexport type AppShellHeaderLayout = 'side' | 'top';\n\n/**\n * Collapse API handed to header-slot render-props so a consumer-placed control\n * (e.g. a hamburger in `left`) can drive the sidebar — crucially in\n * **uncontrolled** mode, where the `top` layout otherwise has no toggle\n * affordance. This is what lets `persistKey` (uncontrolled) coexist with a\n * custom header trigger: the kit owns the state + persistence, the consumer\n * owns the trigger's look and placement.\n */\nexport interface AppShellHeaderApi {\n /** Current collapsed state. */\n collapsed: boolean;\n /** Flip the collapsed state (persisted if `persistKey` is set). */\n toggle: () => void;\n /** Set the collapsed state explicitly. */\n setCollapsed: (collapsed: boolean) => void;\n}\n\n/**\n * A header slot: a static node, or a render-prop receiving {@link AppShellHeaderApi}.\n * The function form is the only way to toggle an uncontrolled shell from the\n * header (no built-in toggle exists in `top`).\n */\nexport type AppShellHeaderSlot =\n | React.ReactNode\n | ((api: AppShellHeaderApi) => React.ReactNode);\n\nexport interface AppShellHeader {\n /** Left slot — typically a menu/hamburger trigger or back action. */\n left?: AppShellHeaderSlot;\n /** Center slot — typically the brand (Logo). Lands at the true viewport centre. */\n center?: AppShellHeaderSlot;\n /** Right slot — notifications, user avatar, utilities. */\n right?: AppShellHeaderSlot;\n}\n\n/**\n * Props shared by both layouts. The layout-specific props live in\n * `AppShellSideProps` / `AppShellTopProps`; `AppShellProps` is the\n * discriminated union of the two, keyed on `headerLayout`.\n */\nexport interface AppShellBaseProps {\n sections: NavSection[];\n footer?: React.ReactNode;\n defaultCollapsed?: boolean;\n collapsed?: boolean;\n onCollapsedChange?: (c: boolean) => void;\n /**\n * Persist the collapsed state in `localStorage[persistKey]` so it survives\n * reloads. Opt-in: omit it and the shell keeps the default behaviour (resets\n * to `defaultCollapsed` on each mount). SSR-safe — the initial render still\n * uses `defaultCollapsed` (no hydration mismatch); the stored value is read\n * after mount, so a differing value may flash for one frame. Ignored in\n * controlled mode (when `collapsed` is provided): the host owns persistence.\n */\n persistKey?: string;\n children: React.ReactNode;\n className?: string;\n /**\n * Color theme (applies to both layouts):\n * - `default` (light): claro, mejor para apps data-heavy de uso prolongado.\n * - `brand`: superficie azul de marca con texto blanco. Mayor brand recall.\n * En `side` tiñe el sidebar; en `top` tiñe header + sidebar (un solo knob).\n */\n theme?: AppShellTheme;\n /** Render-prop for navigation links so the host app can use Next.js Link, etc. */\n linkAs?: (item: NavItem, content: React.ReactNode, className: string) => React.ReactNode;\n}\n\n/**\n * Sidebar layout (default, `headerLayout=\"side\"` or omitted). The brand\n * block + collapse rail live in the sidebar; the topbar sits over the\n * content with a mobile hamburger. `header` is **not** valid here — that\n * slot belongs to the `top` layout.\n */\nexport interface AppShellSideProps extends AppShellBaseProps {\n headerLayout?: 'side';\n /** Brand node in the sidebar header (expanded state). */\n brand?: React.ReactNode;\n /** Brand node shown when the rail is collapsed. Falls back to `brand`. */\n brandCollapsed?: React.ReactNode;\n /** Content of the topbar over the page (search, etc.). */\n topbar?: React.ReactNode;\n /** User slot at the right of the topbar (avatar/menu). */\n user?: React.ReactNode;\n /** Not valid in the `side` layout — the header slots belong to `top`. */\n header?: never;\n}\n\n/**\n * Top-header layout (`headerLayout=\"top\"`, v1.15.0). Full-width header\n * above the body with three slots (`header.{left,center,right}`); the\n * centre slot lands at the **true viewport centre** (1fr·auto·1fr grid).\n * The sidebar has no brand block and `collapsed` hides it entirely (no\n * 72px rail); the header is **invariant** to the collapse. `theme=\"brand\"`\n * tints both bands. The `side`-only props are **not** valid here — put your\n * chrome in `header`.\n */\nexport interface AppShellTopProps extends AppShellBaseProps {\n headerLayout: 'top';\n /** Slots for the full-width header. Brand usually goes in `center`. */\n header?: AppShellHeader;\n /**\n * Theme of the **header band only**, independent of the sidebar (`theme`).\n * Defaults to `theme`, so `theme=\"brand\"` still tints both bands (no\n * change for existing consumers). Set `theme=\"default\" headerTheme=\"brand\"`\n * for a branded top bar over a neutral, legible sidebar — common in\n * data-heavy admin apps.\n */\n headerTheme?: AppShellTheme;\n /**\n * Collapse to an icon rail (72px) instead of hiding the sidebar entirely.\n * Default `false` → `collapsed` hides the sidebar (the original `top`\n * behavior). `true` → `collapsed` keeps a 72px rail showing the nav icons\n * (labels hidden, active-item bar kept) — like the `side` layout — and\n * renders a built-in expand/collapse toggle at the bottom of the rail.\n */\n collapsedRail?: boolean;\n /** Not valid in `top` — use `header.center` for the brand. */\n brand?: never;\n /** Not valid in `top` — the sidebar collapses entirely. */\n brandCollapsed?: never;\n /** Not valid in `top` — use the `header` slots. */\n topbar?: never;\n /** Not valid in `top` — use `header.right`. */\n user?: never;\n}\n\n/**\n * Discriminated union keyed on `headerLayout`. TypeScript enforces that\n * `header` is only accepted with `headerLayout=\"top\"` and that\n * `brand`/`brandCollapsed`/`topbar`/`user` are only accepted with the\n * (default) `side` layout — passing the wrong prop for the layout is a\n * compile error instead of being silently ignored at runtime.\n */\nexport type AppShellProps = AppShellSideProps | AppShellTopProps;\n\n// Recursive nav item, memoized so a single item's parent re-render doesn't\n// churn through every other item in the tree. Stability of `linkAs` and\n// `onCloseMobile` is the parent's responsibility (we stabilize\n// `onCloseMobile` via useCallback below; consumers should memoize `linkAs`\n// if they care about avoiding renders, but for typical Next.js Link usage\n// the inline arrow is rarely a hot path).\ninterface NavItemNodeProps {\n item: NavItem;\n depth: number;\n linkAs?: AppShellBaseProps['linkAs'];\n onCloseMobile: () => void;\n}\n\nconst NavItemNode = React.memo(function NavItemNode({\n item, depth, linkAs, onCloseMobile,\n}: NavItemNodeProps) {\n const klass = cx('appshell__navitem', item.active && 'is-active', `appshell__navitem--depth-${depth}`);\n const inner = (\n <>\n {item.icon && <span className=\"appshell__navicon\" aria-hidden=\"true\">{item.icon}</span>}\n <span className=\"appshell__navlabel\">{item.label}</span>\n {item.badge && <span className=\"appshell__navbadge\">{item.badge}</span>}\n </>\n );\n const node = item.href && linkAs\n ? linkAs(item, inner, klass)\n : (\n <a\n href={item.href ?? '#'}\n className={klass}\n aria-current={item.active ? 'page' : undefined}\n onClick={(e) => {\n if (!item.href) e.preventDefault();\n item.onSelect?.();\n onCloseMobile();\n }}\n >\n {inner}\n </a>\n );\n return (\n <li>\n {node}\n {item.children && item.children.length > 0 && (\n <ul className=\"appshell__navchildren\">\n {item.children.map((c) => (\n <NavItemNode key={c.id} item={c} depth={depth + 1} linkAs={linkAs} onCloseMobile={onCloseMobile} />\n ))}\n </ul>\n )}\n </li>\n );\n});\n\nexport function AppShell(props: AppShellProps) {\n const {\n sections, footer, defaultCollapsed = false,\n collapsed: ctrlCollapsed, onCollapsedChange, persistKey,\n children, className, theme = 'default', linkAs,\n } = props;\n const [internalCollapsed, setInternalCollapsed] = React.useState(defaultCollapsed);\n const [mobileOpen, setMobileOpen] = React.useState(false);\n const t = useLocale();\n const collapsed = ctrlCollapsed ?? internalCollapsed;\n\n // SSR-safe persistence: the initial render uses `defaultCollapsed` (server\n // and first client render agree → no hydration mismatch), then we sync from\n // localStorage after mount. Only in uncontrolled mode; reads can throw\n // (Safari private mode), so they're guarded. Runs once per persistKey.\n React.useEffect(() => {\n if (persistKey == null || ctrlCollapsed !== undefined) return;\n try {\n const stored = window.localStorage.getItem(persistKey);\n if (stored === '0' || stored === '1') setInternalCollapsed(stored === '1');\n } catch {\n /* localStorage unavailable — keep defaultCollapsed */\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- sync once at mount; ctrlCollapsed read intentionally not tracked\n }, [persistKey]);\n\n const setCollapsed = (v: boolean) => {\n if (ctrlCollapsed === undefined) setInternalCollapsed(v);\n if (persistKey != null && ctrlCollapsed === undefined) {\n try {\n window.localStorage.setItem(persistKey, v ? '1' : '0');\n } catch {\n /* localStorage unavailable — persistence is best-effort */\n }\n }\n onCollapsedChange?.(v);\n };\n const closeMobile = React.useCallback(() => setMobileOpen(false), []);\n\n // Top-header variant: full-width header above the body. Topbar is\n // invariant to `collapsed` (only the inner body's columns animate); brand\n // lives in `header.center` at the true viewport centre. Default\n // `headerLayout=\"side\"` falls through to the legacy JSX below\n // (byte-identical for existing consumers). The `props.headerLayout`\n // check narrows the discriminated union, so `header` (top) and\n // `brand`/`topbar`/`user` (side) are each only in scope in their branch.\n if (props.headerLayout === 'top') {\n const { header } = props;\n // Header band themes independently of the sidebar; defaults to `theme`\n // so `theme=\"brand\"` keeps tinting both bands (back-compat).\n const headerTheme = props.headerTheme ?? theme;\n const collapsedRail = props.collapsedRail ?? false;\n // Hand the collapse API to header slots so a consumer trigger (hamburger)\n // can toggle the shell — the only path in uncontrolled `top` (no built-in\n // toggle here). A function slot is called with the API; a node renders as-is.\n const headerApi: AppShellHeaderApi = { collapsed, toggle: () => setCollapsed(!collapsed), setCollapsed };\n const slot = (s: AppShellHeaderSlot): React.ReactNode =>\n typeof s === 'function' ? (s as (api: AppShellHeaderApi) => React.ReactNode)(headerApi) : s;\n return (\n <div className={cx('appshell', `appshell--${theme}`, 'appshell--header-top', `appshell--header-${headerTheme}`, collapsedRail && 'appshell--rail', collapsed && 'is-collapsed', className)}>\n {/* On a brand header the band is dark, so re-scope foreground tokens\n via data-tone=\"inverse\" — anything inside (Avatar, badges, links)\n becomes band-aware automatically without per-call-site colors. */}\n <header className=\"appshell__header\" role=\"banner\" data-tone={headerTheme === 'brand' ? 'inverse' : undefined}>\n <div className=\"appshell__header-left\">{slot(header?.left)}</div>\n <div className=\"appshell__header-center\">{slot(header?.center)}</div>\n <div className=\"appshell__header-right\">{slot(header?.right)}</div>\n </header>\n <div className=\"appshell__body\">\n <aside className=\"appshell__sidebar\" aria-label={t['appshell.mainNav']}>\n <nav className=\"appshell__nav\">\n {sections.map((s, i) => (\n <div key={s.id ?? i} className=\"appshell__navsection\">\n {s.label && <div className=\"appshell__navlabel-section\">{s.label}</div>}\n <ul>{s.items.map((it) => (\n <NavItemNode key={it.id} item={it} depth={0} linkAs={linkAs} onCloseMobile={closeMobile} />\n ))}</ul>\n </div>\n ))}\n </nav>\n {footer != null && (\n <div className=\"appshell__sidebar-foot\">{footer}</div>\n )}\n </aside>\n <main className=\"appshell__content\" role=\"main\">{children}</main>\n </div>\n </div>\n );\n }\n\n const { brand, brandCollapsed, topbar, user } = props;\n return (\n <div className={cx('appshell', `appshell--${theme}`, collapsed && 'is-collapsed', mobileOpen && 'is-mobile-open', className)}>\n <aside className=\"appshell__sidebar\" aria-label={t['appshell.mainNav']}>\n <div className=\"appshell__brand\">\n {collapsed ? (brandCollapsed ?? brand) : brand}\n </div>\n <nav className=\"appshell__nav\">\n {sections.map((s, i) => (\n <div key={s.id ?? i} className=\"appshell__navsection\">\n {s.label && <div className=\"appshell__navlabel-section\">{s.label}</div>}\n <ul>{s.items.map((it) => (\n <NavItemNode key={it.id} item={it} depth={0} linkAs={linkAs} onCloseMobile={closeMobile} />\n ))}</ul>\n </div>\n ))}\n </nav>\n <div className=\"appshell__sidebar-foot\">\n {footer}\n <button\n type=\"button\"\n className=\"appshell__collapse\"\n onClick={() => setCollapsed(!collapsed)}\n aria-expanded={!collapsed}\n aria-label={collapsed ? t['appshell.expandMenu'] : t['appshell.collapseMenu']}\n title={collapsed ? t['appshell.expand'] : t['appshell.collapse']}\n >\n {collapsed ? <ChevronRight size={14} /> : <ChevronLeft size={14} />}\n </button>\n </div>\n </aside>\n\n <div className=\"appshell__main\">\n <header className=\"appshell__topbar\">\n <button\n type=\"button\"\n className=\"appshell__hamburger\"\n aria-label={t['appshell.openMenu']}\n aria-expanded={mobileOpen}\n onClick={() => setMobileOpen((o) => !o)}\n ><MenuIcon size={20} /></button>\n <div className=\"appshell__topbar-content\">{topbar}</div>\n {user && <div className=\"appshell__topbar-user\">{user}</div>}\n </header>\n <main className=\"appshell__content\" role=\"main\">{children}</main>\n </div>\n\n {mobileOpen && (\n <div className=\"appshell__scrim\" onClick={() => setMobileOpen(false)} aria-hidden=\"true\" />\n )}\n </div>\n );\n}\n\n// ---------- PageHeader --------------------------------------------------\nexport interface PageHeaderProps {\n title: React.ReactNode;\n description?: React.ReactNode;\n breadcrumbs?: Array<{ label: React.ReactNode; href?: string }>;\n actions?: React.ReactNode;\n meta?: React.ReactNode;\n className?: string;\n}\n\nexport function PageHeader({ title, description, breadcrumbs, actions, meta, className }: PageHeaderProps) {\n const t = useLocale();\n return (\n <div className={cx('page-header', className)}>\n {breadcrumbs && breadcrumbs.length > 0 && (\n <nav className=\"page-header__crumbs\" aria-label={t['appshell.breadcrumb']}>\n <ol>\n {breadcrumbs.map((c, i) => (\n <li key={i}>\n {c.href ? <a href={c.href}>{c.label}</a> : <span aria-current=\"page\">{c.label}</span>}\n {i < breadcrumbs.length - 1 && <span className=\"page-header__crumb-sep\" aria-hidden=\"true\">/</span>}\n </li>\n ))}\n </ol>\n </nav>\n )}\n <div className=\"page-header__row\">\n <div className=\"page-header__title-wrap\">\n <h1 className=\"page-header__title\">{title}</h1>\n {description && <p className=\"page-header__desc\">{description}</p>}\n </div>\n {actions && <div className=\"page-header__actions\">{actions}</div>}\n </div>\n {meta && <div className=\"page-header__meta\">{meta}</div>}\n </div>\n );\n}\n"]}
|