@timbal-ai/timbal-react 1.2.0 → 1.3.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.
@@ -15,14 +15,14 @@ import {
15
15
  studioIntegrationCardClass,
16
16
  studioTopbarPillHeightClass,
17
17
  toNum
18
- } from "./chunk-UY7AKWJL.esm.js";
18
+ } from "./chunk-GQBYZRD7.esm.js";
19
19
  import {
20
20
  Checkbox,
21
21
  Skeleton
22
- } from "./chunk-FEYZUVBM.esm.js";
22
+ } from "./chunk-UCGVL7ZY.esm.js";
23
23
  import {
24
24
  PillSegmentedTabs
25
- } from "./chunk-NAMKO2MU.esm.js";
25
+ } from "./chunk-VXMM2HX7.esm.js";
26
26
  import {
27
27
  Button,
28
28
  Dialog,
@@ -35,7 +35,7 @@ import {
35
35
  TimbalV2Button,
36
36
  cn,
37
37
  controlClass
38
- } from "./chunk-BMXFXLVV.esm.js";
38
+ } from "./chunk-QU7ET55D.esm.js";
39
39
 
40
40
  // src/design/ui-vocabulary.ts
41
41
  var SEMANTIC_COLOR_TOKENS = [
@@ -254,7 +254,7 @@ Presentational groups \u2014 import from the package root, not from these paths:
254
254
 
255
255
  Also re-exported: \`Button\`, \`TimbalChat\`, \`ChartArtifactView\`, \`APP_KIT_AGENT_INSTRUCTIONS\`.
256
256
 
257
- Theming helpers (import from the package root or \`/app\`): \`createTimbalTheme\`, \`themeToCss\`, \`applyTimbalTheme\`, \`TIMBAL_THEME_PRESETS\`, \`applyThemePreset\`, \`ThemePresetGallery\`, \`TimbalThemeStyle\`, \`THEME_AGENT_INSTRUCTIONS\`.
257
+ Theming helpers (import from the package root or \`/app\`): \`createTimbalTheme\`, \`themeToCss\`, \`applyTimbalTheme\`, \`TIMBAL_THEME_PRESETS\`, \`applyThemePreset\`, \`TimbalThemeStyle\`, \`THEME_AGENT_INSTRUCTIONS\`. Theming is **configured by the developer**, not surfaced as an end-user theme picker.
258
258
 
259
259
  ### Design guidelines (required)
260
260
 
@@ -263,8 +263,9 @@ Theming helpers (import from the package root or \`/app\`): \`createTimbalTheme\
263
263
  | **Copilot** | Use \`AppCopilotProvider\` for page context (\`useAppCopilotContext\`). Copilot is a **floating overlay** via \`AppShell\` \`chat={<AppChatPanel />}\` \u2014 not a sidebar column that shrinks main content. |
264
264
  | **Chat panel** | \`AppChatPanel\` only; \`Thread\` uses \`variant="panel"\` internally. Dismiss with **X**; trigger is a **text-only** pill (e.g. "Assistant") \u2014 **no** MessageSquare or chat icons on the shell trigger. |
265
265
  | **Context** | Do not show raw JSON context in the panel header; keep context in \`AppCopilotProvider\` only. |
266
- | **Theming** | Use semantic Tailwind tokens (\`bg-background\`, \`text-foreground\`, \`border-border\`, \`bg-elevated-from\`, etc.) from the host app's \`styles.css\`. To rebrand, **never hand-author OKLCH** \u2014 call \`createTimbalTheme({ brand })\` + \`themeToCss\`/\`applyTimbalTheme\`, or apply a catalog preset (\`TIMBAL_THEME_PRESETS\` / \`applyThemePreset\`). To offer styles, render \`ThemePresetGallery\`. See \`THEME_AGENT_INSTRUCTIONS\`. |
267
- | **Layout chrome** | \`Page\` \u2192 \`Section\` for main content hierarchy. \`AppShellTopbar\` for global actions (auth, theme). |
266
+ | **Theming** | Use semantic Tailwind tokens (\`bg-background\`, \`text-foreground\`, \`border-border\`, \`bg-elevated-from\`, etc.) from the host app's \`styles.css\`. To rebrand, **never hand-author OKLCH** \u2014 call \`createTimbalTheme({ brand })\` + \`themeToCss\`/\`applyTimbalTheme\`, or apply a catalog preset (\`TIMBAL_THEME_PRESETS\` / \`applyThemePreset\`). Apply the theme **programmatically** \u2014 do **not** add an end-user theme selector to generated apps. See \`THEME_AGENT_INSTRUCTIONS\`. |
267
+ | **Layout chrome** | \`Page\` \u2192 \`Section\` for main content hierarchy. Default to **no global topbar** \u2014 put account/theme/global actions in the \`Page\` \`actions\` slot (or the sidebar). Add \`AppShellTopbar\` only when a full-width global bar is explicitly requested. |
268
+ | **Density** | Set \`density="compact"\` on \`Page\` for tighter dashboards (full-width column, smaller section gaps, card padding, metric tiles, default chart height 220). Default is \`"default"\` (platform spacing). Wrap custom layouts with \`AppDensityProvider\` when not using \`Page\`. Per-section override: \`Section density="compact"\`. Do **not** hand-tune five layers of \`className\` padding when density covers the need. |
268
269
  | **Data** | Prefer \`DataTable\` with typed \`columns\` / \`rows\` / \`getRowKey\`; use \`ChartPanel\` with a \`ChartArtifact\` for charts (set \`chartType\` + options \u2014 see the chart catalog). Chart colors come from the theme \`--chart-1..6\` tokens; pass \`series[].color\` / \`colors\` only to override, never raw hex on every series. |
269
270
  | **Modals** | Use \`AppConfirmDialog\` for destructive/export confirmations. |
270
271
  | **Metrics** | Overview KPIs \u2192 \`MetricRow\` or \`MetricChartCard\` (not four separate heavy cards). Values use **normal** font weight, not bold. |
@@ -301,8 +302,8 @@ The cause of slop is dropping **below** the curated block layer into raw primiti
301
302
  | \`AppCopilotProvider\` | React context for copilot-aware tools (page, filters, selection, etc.). |
302
303
  | \`AppChatPanel\` | Floating thread: \`workforceId\`, \`welcome\`, \`debug\`. |
303
304
  | \`useAppShellChat\` | Custom open/close trigger when \`hideChatTrigger\` on shell. |
304
- | \`Page\` | Page title, description, \`breadcrumbs\`, \`actions\`, children. |
305
- | \`Section\` | Titled block inside a page. |
305
+ | \`Page\` | Page title, description, \`breadcrumbs\`, \`actions\`, \`density\` (\`"default"\` | \`"compact"\`), children. |
306
+ | \`Section\` | Titled block inside a page. Optional \`density\` overrides inherited page density. |
306
307
  | \`SubNav\` | **Section switcher** (Overview / Reports pill bar): \`items\`, \`activeId\`, \`onChange\`. Never use Radix/shadcn \`Tabs\` \u2014 it is not in this package. Switch panels with state or the router. |
307
308
  | **Menus** | **Select** = short list, no search. **Combobox** = searchable (same trigger as Select). **Command** only inside \`PopoverContent variant="list"\` or Combobox \u2014 never padded default Popover. See \`examples/app-kit/src/recipes/primitives-catalog.ts\`. |
308
309
  | \`Breadcrumbs\` | Trail: \`items: [{ label, href? }]\`. |
@@ -314,7 +315,7 @@ The cause of slop is dropping **below** the curated block layer into raw primiti
314
315
  | \`SearchInput\` | Filter field with consistent app styling. |
315
316
  | \`DataTable\` | Sortable table: \`columns\`, \`rows\`, \`getRowKey\`, optional \`sort\` / \`onSortChange\`, \`emptyTitle\`, \`showRowCount\`, \`caption\`, \`truncate: true\` on columns with long text. **Scales:** \`pageSize\` (built-in client pager), \`selectable\` + \`onSelectionChange\` (checkbox column for bulk actions), \`loading\` (skeleton rows). \`onRowClick\` for row \u2192 detail (open a \`Sheet\`). |
316
317
  | \`Avatar\` / \`AvatarFallback\` | User initials: \`variant="secondary"\` (or \`primary\` / \`chart\` alias) on **both** \`Avatar\` and \`AvatarFallback\` \u2014 same chrome as catalog **Action** buttons (\`Button variant="secondary"\`: elevated gradient, \`border-border\`, \`shadow-card\`, \`text-foreground\`). Never dark primary CTA fill or raw \`bg-blue-600\`. |
317
- | \`ChartPanel\` | Same shell as \`MetricChartCard\`: title row (\`px-4 pt-4\`), flush plot (\`pt-2\` only) with **no axis ticks** \u2014 hover tooltips show category + value. Pass \`title\` + \`artifact\` (omit \`artifact.title\` to avoid duplicates) or \`children\`. \`loading\` renders a plot-height skeleton. |
318
+ | \`ChartPanel\` | Same shell as \`MetricChartCard\`: title row (\`px-4 pt-4\`), flush plot (\`pt-2\` only) with **no axis ticks** \u2014 hover tooltips show category + value. Pass \`title\` + \`artifact\` (omit \`artifact.title\` to avoid duplicates) or \`children\`. \`loading\` renders a plot-height skeleton. Default plot height follows page \`density\` (300 default, 220 compact); pass \`height\` to override. |
318
319
  | \`FieldInput\`, \`FieldTextarea\`, \`FieldSelect\`, \`FieldSwitch\` | Settings-style forms with labels and hints. |
319
320
  | \`FormSection\` | Grouped form block. |
320
321
  | \`AppConfirmDialog\` | Confirm/cancel modal: \`open\`, \`onOpenChange\`, \`title\`, \`description\`, \`onConfirm\`. |
@@ -334,7 +335,7 @@ Charts run on **recharts** with shadcn \`ChartContainer\` / \`ChartTooltipConten
334
335
  | \`Sparkline\` | Tiny inline trend (table cells): \`data\`, \`color\`, \`area\`. |
335
336
  | \`MetricTile\` | Low-level KPI cell \u2014 prefer \`MetricRow\` / \`MetricChartCard\` instead of hand-wiring tiles. |
336
337
  | \`MetricRow\` | KPI strip in one elevated card (no chart). Props: \`metrics: [{ id, label, value, unit?, trend?, trendTone? }]\`, optional \`onMetricChange\`, \`metricsAriaLabel\`, \`loading\` (skeleton tiles). |
337
- | \`MetricChartCard\` | KPI strip + flush chart; tile click swaps series. Same metrics shape + \`data\` per metric. Default chart height 300. \`loading\` renders skeleton tiles + chart. |
338
+ | \`MetricChartCard\` | KPI strip + flush chart; tile click swaps series. Same metrics shape + \`data\` per metric. Default chart height follows page \`density\` (300 / 220); pass \`height\` to override. \`loading\` renders skeleton tiles + chart. |
338
339
 
339
340
  #### Settings
340
341
 
@@ -397,7 +398,7 @@ Ready-made **section patterns** assembled from the components above. Each is a c
397
398
  **Shells & theming**
398
399
  - **Minimal shell** \u2014 \`AppShell\` + \`Page\` (no sidebar/chat).
399
400
  - **Copilot overlay** \u2014 \`AppShell\` + floating \`AppChatPanel\`.
400
- - **Theme presets** \u2014 \`ThemePresetGallery\` + \`applyTimbalTheme\` (never hand-author OKLCH).
401
+ - **Theme presets** \u2014 apply a brand preset programmatically (\`applyThemePreset\` / \`applyTimbalTheme\`); never hand-author OKLCH and don't expose a theme picker to end users.
401
402
 
402
403
  ### Typical compositions
403
404
 
@@ -1282,8 +1283,7 @@ Each preset is a **full personality** (color + radius + shadows + font), not jus
1282
1283
  | \`folio\` | Editorial serif (Fraunces), near-sharp corners \u2014 content / docs |
1283
1284
  | \`carbon\` | Terminal monospace (JetBrains Mono), green accent \u2014 dev / infra |
1284
1285
 
1285
- - To present options visually, render \`<ThemePresetGallery value={id} onSelect={setId} />\` \u2014 each swatch previews real components (Button + metric tile) scoped via \`data-timbal-theme\`, so the live app doesn't change until the user picks.
1286
- - On selection, call \`applyThemePreset(id)\` (persists to \`localStorage\` and restores on reload).
1286
+ - Pick a preset at build/config time and apply it with \`applyThemePreset(id)\` (persists to \`localStorage\` and restores on reload). Theme selection is a **developer/config** choice \u2014 do **not** surface an end-user theme picker in generated apps.
1287
1287
 
1288
1288
  ### Rules
1289
1289
 
@@ -1317,17 +1317,142 @@ var TimbalThemeStyle = ({
1317
1317
  ] });
1318
1318
  };
1319
1319
 
1320
+ // src/design/app-classes.ts
1321
+ var appPageColumnClass = "mx-auto w-full max-w-[100rem] px-4 md:px-6 lg:px-8";
1322
+ var appShellTopbarInsetClass = "w-full px-4 md:px-6";
1323
+ var appShellInsetTopClass = "pt-4 md:pt-6";
1324
+ var appShellInsetBottomClass = "pb-8 md:pb-10";
1325
+ var appShellTopbarRowClass = cn(
1326
+ studioTopbarPillHeightClass,
1327
+ "flex w-full items-center justify-between gap-2"
1328
+ );
1329
+ var appShellTopbarStickyClass = cn(
1330
+ "shrink-0 bg-background pb-2",
1331
+ appShellInsetTopClass
1332
+ );
1333
+ var appPageHeaderClass = cn(
1334
+ "flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",
1335
+ "pb-4 pt-2"
1336
+ );
1337
+ var appSectionClass = "flex flex-col gap-4 py-4";
1338
+ var appSectionTitleClass = "text-lg font-semibold text-foreground";
1339
+ var appSectionDescriptionClass = "text-sm text-muted-foreground";
1340
+ var appSurfaceCardClass = cn(
1341
+ studioIntegrationCardClass,
1342
+ "p-4 md:p-5"
1343
+ );
1344
+ var appStatTileClass = cn(
1345
+ appSurfaceCardClass,
1346
+ "flex flex-col gap-1 px-4 py-3 shadow-none"
1347
+ );
1348
+ var appStatValueClass = "text-2xl font-normal tracking-tight text-foreground tabular-nums";
1349
+ var appStatLabelClass = "text-xs font-normal text-muted-foreground";
1350
+ var appFilterBarClass = "flex flex-wrap items-end gap-2";
1351
+ var appSearchInputClass = controlClass({}, "inline-flex items-center gap-2");
1352
+ var appBreadcrumbsClass = "flex flex-wrap items-center gap-1.5 text-sm text-muted-foreground";
1353
+ var appBreadcrumbLinkClass = "transition-colors hover:text-foreground";
1354
+ var appFieldClass = "flex flex-col gap-1.5";
1355
+ var appFieldLabelClass = "text-sm font-medium text-foreground";
1356
+ var appFieldHintClass = "text-xs text-muted-foreground";
1357
+ var appInputClass = controlClass({}, "w-full");
1358
+ var appEmptyStateClass = cn(
1359
+ appSurfaceCardClass,
1360
+ "flex flex-col items-center justify-center gap-2 py-12 text-center"
1361
+ );
1362
+ var appEmptyStateTitleClass = "text-base font-medium text-foreground";
1363
+ var appEmptyStateDescriptionClass = "max-w-sm text-sm text-muted-foreground";
1364
+ var appChartPanelClass = cn(appSurfaceCardClass, "flex flex-col gap-3");
1365
+
1366
+ // src/design/app-density.ts
1367
+ var APP_DENSITY_CHART_HEIGHT = {
1368
+ default: 300,
1369
+ compact: 220
1370
+ };
1371
+ var compactSurfaceCardClass = cn(studioIntegrationCardClass, "p-3");
1372
+ var compactStatTileClass = cn(
1373
+ compactSurfaceCardClass,
1374
+ "flex flex-col gap-1 px-3 py-2 shadow-none"
1375
+ );
1376
+ var compactEmptyStateClass = cn(
1377
+ compactSurfaceCardClass,
1378
+ "flex flex-col items-center justify-center gap-2 py-8 text-center"
1379
+ );
1380
+ var APP_DENSITY_CLASSES = {
1381
+ pageColumn: {
1382
+ default: appPageColumnClass,
1383
+ compact: "mx-auto w-full max-w-none px-3 md:px-4"
1384
+ },
1385
+ pageHeader: {
1386
+ default: appPageHeaderClass,
1387
+ compact: "flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between pb-2 pt-1"
1388
+ },
1389
+ section: {
1390
+ default: appSectionClass,
1391
+ compact: "flex flex-col gap-2 py-2"
1392
+ },
1393
+ surfaceCard: {
1394
+ default: appSurfaceCardClass,
1395
+ compact: compactSurfaceCardClass
1396
+ },
1397
+ statTile: {
1398
+ default: appStatTileClass,
1399
+ compact: compactStatTileClass
1400
+ },
1401
+ emptyState: {
1402
+ default: appEmptyStateClass,
1403
+ compact: compactEmptyStateClass
1404
+ },
1405
+ metricCardHeader: {
1406
+ default: "flex items-start justify-between gap-3 px-4 pb-1 pt-3",
1407
+ compact: "flex items-start justify-between gap-2 px-3 pb-0.5 pt-2"
1408
+ },
1409
+ metricTile: {
1410
+ default: "relative flex min-w-0 flex-1 flex-col gap-1 px-4 py-3 text-left font-normal",
1411
+ compact: "relative flex min-w-0 flex-1 flex-col gap-1 px-3 py-2 text-left font-normal"
1412
+ },
1413
+ metricChartRegion: {
1414
+ default: "relative min-h-0 w-full overflow-x-hidden border-t border-border/40 pt-2",
1415
+ compact: "relative min-h-0 w-full overflow-x-hidden border-t border-border/40 pt-1"
1416
+ },
1417
+ metricChartPlotRegion: {
1418
+ default: "relative min-h-0 w-full overflow-x-hidden border-t border-border/40 px-0 pt-5 pb-3",
1419
+ compact: "relative min-h-0 w-full overflow-x-hidden border-t border-border/40 px-0 pt-3 pb-2"
1420
+ },
1421
+ chartPanelBody: {
1422
+ default: "pt-2 pb-3",
1423
+ compact: "pt-1 pb-2"
1424
+ }
1425
+ };
1426
+ function appDensityClass(key, density = "default") {
1427
+ return APP_DENSITY_CLASSES[key][density];
1428
+ }
1429
+
1430
+ // src/app/layout/app-density-context.tsx
1431
+ import { createContext, useContext } from "react";
1432
+ import { jsx as jsx2 } from "react/jsx-runtime";
1433
+ var AppDensityContext = createContext("default");
1434
+ var AppDensityProvider = ({
1435
+ density = "default",
1436
+ children
1437
+ }) => {
1438
+ return /* @__PURE__ */ jsx2(AppDensityContext.Provider, { value: density, children });
1439
+ };
1440
+ function useAppDensity() {
1441
+ return useContext(AppDensityContext);
1442
+ }
1443
+ function useAppDensityClass(key, override) {
1444
+ const inherited = useAppDensity();
1445
+ return appDensityClass(key, override ?? inherited);
1446
+ }
1447
+
1320
1448
  // src/app/data/metrics-shared.tsx
1321
- import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
1449
+ import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
1322
1450
  var metricCardShellClass = cn(
1323
1451
  studioIntegrationCardClass,
1324
1452
  "aui-app-metric-card shadow-none",
1325
1453
  "flex flex-col overflow-hidden"
1326
1454
  );
1327
- var metricCardHeaderClass = "flex items-start justify-between gap-3 px-4 pb-1 pt-3";
1328
1455
  var metricTilesRowClass = "grid w-full min-w-0";
1329
- var metricChartRegionClass = "relative min-h-0 w-full overflow-x-hidden border-t border-border/40 pt-2";
1330
- var metricChartPlotRegionClass = "relative min-h-0 w-full overflow-x-hidden border-t border-border/40 px-0 pt-5 pb-3";
1331
1456
  var metricCellDividerClass = "border-r border-border/40";
1332
1457
  var MetricCardHeader = ({
1333
1458
  title,
@@ -1335,13 +1460,14 @@ var MetricCardHeader = ({
1335
1460
  description,
1336
1461
  actions
1337
1462
  }) => {
1463
+ const headerClass = useAppDensityClass("metricCardHeader");
1338
1464
  if (!title && !description && !actions) return null;
1339
- return /* @__PURE__ */ jsxs2("header", { className: metricCardHeaderClass, children: [
1465
+ return /* @__PURE__ */ jsxs2("header", { className: headerClass, children: [
1340
1466
  /* @__PURE__ */ jsxs2("div", { className: "min-w-0", children: [
1341
- title ? /* @__PURE__ */ jsx2("h3", { id: titleId, className: "text-base font-normal text-foreground", children: title }) : null,
1342
- description ? /* @__PURE__ */ jsx2("p", { className: "mt-0.5 text-sm text-muted-foreground", children: description }) : null
1467
+ title ? /* @__PURE__ */ jsx3("h3", { id: titleId, className: "text-base font-normal text-foreground", children: title }) : null,
1468
+ description ? /* @__PURE__ */ jsx3("p", { className: "mt-0.5 text-sm text-muted-foreground", children: description }) : null
1343
1469
  ] }),
1344
- actions ? /* @__PURE__ */ jsx2("div", { className: "shrink-0", children: actions }) : null
1470
+ actions ? /* @__PURE__ */ jsx3("div", { className: "shrink-0", children: actions }) : null
1345
1471
  ] });
1346
1472
  };
1347
1473
  function metricTilesGridColsClass(n) {
@@ -1362,15 +1488,13 @@ function metricTilesGridColsClass(n) {
1362
1488
  }
1363
1489
 
1364
1490
  // src/app/data/MetricTile.tsx
1365
- import { Fragment as Fragment2, jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
1491
+ import { Fragment as Fragment2, jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
1366
1492
  var trendToneClass = {
1367
1493
  up: "border-border/80 bg-muted/40 text-muted-foreground",
1368
1494
  down: "border-border/80 bg-muted/40 text-muted-foreground",
1369
1495
  neutral: "border-border/80 bg-muted/30 text-muted-foreground"
1370
1496
  };
1371
- var metricTileBaseClass = "relative flex min-w-0 flex-1 flex-col gap-1 px-4 py-3 text-left font-normal";
1372
- var metricTileInteractiveClass = cn(
1373
- metricTileBaseClass,
1497
+ var metricTileInteractiveExtraClass = cn(
1374
1498
  "bg-transparent hover:bg-transparent active:bg-transparent",
1375
1499
  "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-foreground/10"
1376
1500
  );
@@ -1386,21 +1510,22 @@ var MetricTile = ({
1386
1510
  ariaLabel,
1387
1511
  className
1388
1512
  }) => {
1513
+ const metricTileBaseClass = useAppDensityClass("metricTile");
1389
1514
  const content = /* @__PURE__ */ jsxs3(Fragment2, { children: [
1390
- active ? /* @__PURE__ */ jsx3(
1515
+ active ? /* @__PURE__ */ jsx4(
1391
1516
  "span",
1392
1517
  {
1393
1518
  "aria-hidden": true,
1394
1519
  className: "absolute inset-x-0 bottom-0 h-0.5 bg-foreground dark:bg-white"
1395
1520
  }
1396
1521
  ) : null,
1397
- /* @__PURE__ */ jsx3("span", { className: "text-xs font-normal text-muted-foreground", children: label }),
1522
+ /* @__PURE__ */ jsx4("span", { className: "text-xs font-normal text-muted-foreground", children: label }),
1398
1523
  /* @__PURE__ */ jsxs3("span", { className: "flex items-center gap-2", children: [
1399
1524
  /* @__PURE__ */ jsxs3("span", { className: "flex items-baseline gap-1", children: [
1400
- /* @__PURE__ */ jsx3("span", { className: "text-2xl font-normal tracking-tight text-foreground tabular-nums", children: value }),
1401
- unit ? /* @__PURE__ */ jsx3("span", { className: "text-xs font-normal text-muted-foreground", children: unit }) : null
1525
+ /* @__PURE__ */ jsx4("span", { className: "text-2xl font-normal tracking-tight text-foreground tabular-nums", children: value }),
1526
+ unit ? /* @__PURE__ */ jsx4("span", { className: "text-xs font-normal text-muted-foreground", children: unit }) : null
1402
1527
  ] }),
1403
- trend ? /* @__PURE__ */ jsx3(
1528
+ trend ? /* @__PURE__ */ jsx4(
1404
1529
  "span",
1405
1530
  {
1406
1531
  className: cn(
@@ -1414,159 +1539,38 @@ var MetricTile = ({
1414
1539
  ] });
1415
1540
  const divider = showDivider ? metricCellDividerClass : void 0;
1416
1541
  if (onSelect) {
1417
- return /* @__PURE__ */ jsx3(
1542
+ return /* @__PURE__ */ jsx4(
1418
1543
  "button",
1419
1544
  {
1420
1545
  type: "button",
1421
1546
  onClick: onSelect,
1422
1547
  "aria-pressed": active,
1423
1548
  "aria-label": ariaLabel,
1424
- className: cn(metricTileInteractiveClass, divider, className),
1549
+ className: cn(metricTileBaseClass, metricTileInteractiveExtraClass, divider, className),
1425
1550
  children: content
1426
1551
  }
1427
1552
  );
1428
1553
  }
1429
- return /* @__PURE__ */ jsx3("div", { className: cn(metricTileBaseClass, divider, className), children: content });
1554
+ return /* @__PURE__ */ jsx4("div", { className: cn(metricTileBaseClass, divider, className), children: content });
1430
1555
  };
1431
1556
 
1432
1557
  // src/app/theme/ThemePresetGallery.tsx
1433
- import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
1434
- var ThemePresetGallery = ({
1435
- value,
1436
- onSelect,
1437
- presets,
1438
- className
1439
- }) => {
1440
- const items = presets ? TIMBAL_THEME_PRESETS.filter((p) => presets.includes(p.id)) : TIMBAL_THEME_PRESETS;
1441
- return /* @__PURE__ */ jsx4(
1442
- "div",
1443
- {
1444
- role: "radiogroup",
1445
- "aria-label": "Theme presets",
1446
- className: cn(
1447
- "grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3",
1448
- className
1449
- ),
1450
- children: items.map((preset) => {
1451
- const selected = value === preset.id;
1452
- return /* @__PURE__ */ jsxs4("div", { "data-timbal-theme": preset.id, children: [
1453
- /* @__PURE__ */ jsx4(TimbalThemeStyle, { preset: preset.id, scope: preset.id }),
1454
- /* @__PURE__ */ jsxs4(
1455
- "button",
1456
- {
1457
- type: "button",
1458
- role: "radio",
1459
- "aria-checked": selected,
1460
- "aria-label": `${preset.label} theme`,
1461
- onClick: () => onSelect?.(preset.id),
1462
- className: cn(
1463
- "group flex w-full flex-col gap-3 rounded-xl border bg-card p-3 text-left transition-colors",
1464
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
1465
- selected ? "border-primary ring-2 ring-primary/30" : "border-border hover:border-foreground/30"
1466
- ),
1467
- children: [
1468
- /* @__PURE__ */ jsxs4("div", { className: "flex items-center justify-between gap-2", children: [
1469
- /* @__PURE__ */ jsxs4("span", { className: "flex items-center gap-2", children: [
1470
- /* @__PURE__ */ jsx4(
1471
- "span",
1472
- {
1473
- "aria-hidden": true,
1474
- className: "size-4 shrink-0 rounded-full ring-1 ring-black/10",
1475
- style: { background: preset.swatch }
1476
- }
1477
- ),
1478
- /* @__PURE__ */ jsx4("span", { className: "text-sm font-medium text-foreground", children: preset.label })
1479
- ] }),
1480
- selected ? /* @__PURE__ */ jsx4("span", { className: "text-xs font-medium text-primary", children: "Selected" }) : null
1481
- ] }),
1482
- /* @__PURE__ */ jsx4("p", { className: "text-xs leading-snug text-muted-foreground", children: preset.description }),
1483
- preset.font ? /* @__PURE__ */ jsxs4("span", { className: "text-[10px] uppercase tracking-wide text-muted-foreground", children: [
1484
- "Aa \xB7 ",
1485
- preset.font
1486
- ] }) : null,
1487
- /* @__PURE__ */ jsxs4("div", { className: "flex flex-col gap-2 rounded-lg border border-border bg-background p-2", children: [
1488
- /* @__PURE__ */ jsxs4("div", { className: "flex items-center gap-2", children: [
1489
- /* @__PURE__ */ jsx4(Button, { size: "xs", className: "pointer-events-none", children: "Primary" }),
1490
- /* @__PURE__ */ jsx4("span", { className: "size-5 rounded-md bg-primary", "aria-hidden": true }),
1491
- /* @__PURE__ */ jsx4("span", { className: "size-5 rounded-md bg-muted", "aria-hidden": true }),
1492
- /* @__PURE__ */ jsx4(
1493
- "span",
1494
- {
1495
- className: "size-5 rounded-md border border-border bg-accent",
1496
- "aria-hidden": true
1497
- }
1498
- )
1499
- ] }),
1500
- /* @__PURE__ */ jsx4(MetricTile, { label: "Active users", value: "1,248", trend: "+8%" })
1501
- ] })
1502
- ]
1503
- }
1504
- )
1505
- ] }, preset.id);
1506
- })
1507
- }
1508
- );
1509
- };
1510
-
1511
- // src/design/app-classes.ts
1512
- var appPageColumnClass = "mx-auto w-full max-w-6xl px-4 md:px-6";
1513
- var appShellTopbarInsetClass = "w-full px-4 md:px-6";
1514
- var appShellInsetTopClass = "pt-4 md:pt-6";
1515
- var appShellTopbarRowClass = cn(
1516
- studioTopbarPillHeightClass,
1517
- "flex w-full items-center justify-between gap-2"
1518
- );
1519
- var appShellTopbarStickyClass = cn(
1520
- "shrink-0 bg-background pb-2",
1521
- appShellInsetTopClass
1522
- );
1523
- var appPageHeaderClass = cn(
1524
- "flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",
1525
- "pb-4 pt-2"
1526
- );
1527
- var appSectionClass = "flex flex-col gap-4 py-4";
1528
- var appSectionTitleClass = "text-lg font-semibold text-foreground";
1529
- var appSectionDescriptionClass = "text-sm text-muted-foreground";
1530
- var appSurfaceCardClass = cn(
1531
- studioIntegrationCardClass,
1532
- "p-4 md:p-5"
1533
- );
1534
- var appStatTileClass = cn(
1535
- appSurfaceCardClass,
1536
- "flex flex-col gap-1 px-4 py-3 shadow-none"
1537
- );
1538
- var appStatValueClass = "text-2xl font-normal tracking-tight text-foreground tabular-nums";
1539
- var appStatLabelClass = "text-xs font-normal text-muted-foreground";
1540
- var appFilterBarClass = "flex flex-wrap items-end gap-2";
1541
- var appSearchInputClass = controlClass({}, "inline-flex items-center gap-2");
1542
- var appBreadcrumbsClass = "flex flex-wrap items-center gap-1.5 text-sm text-muted-foreground";
1543
- var appBreadcrumbLinkClass = "transition-colors hover:text-foreground";
1544
- var appFieldClass = "flex flex-col gap-1.5";
1545
- var appFieldLabelClass = "text-sm font-medium text-foreground";
1546
- var appFieldHintClass = "text-xs text-muted-foreground";
1547
- var appInputClass = controlClass({}, "w-full");
1548
- var appEmptyStateClass = cn(
1549
- appSurfaceCardClass,
1550
- "flex flex-col items-center justify-center gap-2 py-12 text-center"
1551
- );
1552
- var appEmptyStateTitleClass = "text-base font-medium text-foreground";
1553
- var appEmptyStateDescriptionClass = "max-w-sm text-sm text-muted-foreground";
1554
- var appChartPanelClass = cn(appSurfaceCardClass, "flex flex-col gap-3");
1558
+ import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
1555
1559
 
1556
1560
  // src/app/layout/app-shell-chat-context.tsx
1557
- import { createContext, useContext } from "react";
1558
- var AppShellChatContext = createContext(null);
1561
+ import { createContext as createContext2, useContext as useContext2 } from "react";
1562
+ var AppShellChatContext = createContext2(null);
1559
1563
  var AppShellChatProvider = AppShellChatContext.Provider;
1560
1564
  function useAppShellChat() {
1561
- return useContext(AppShellChatContext);
1565
+ return useContext2(AppShellChatContext);
1562
1566
  }
1563
1567
 
1564
1568
  // src/app/layout/app-shell-nav-context.tsx
1565
- import { createContext as createContext2, useContext as useContext2 } from "react";
1566
- var AppShellNavContext = createContext2(null);
1569
+ import { createContext as createContext3, useContext as useContext3 } from "react";
1570
+ var AppShellNavContext = createContext3(null);
1567
1571
  var AppShellNavProvider = AppShellNavContext.Provider;
1568
1572
  function useAppShellNav() {
1569
- return useContext2(AppShellNavContext) ?? {
1573
+ return useContext3(AppShellNavContext) ?? {
1570
1574
  open: false,
1571
1575
  setOpen: () => {
1572
1576
  },
@@ -1578,7 +1582,7 @@ function useAppShellNav() {
1578
1582
  // src/app/layout/AppShell.tsx
1579
1583
  import { motion, useReducedMotion } from "motion/react";
1580
1584
  import { useCallback, useMemo, useState } from "react";
1581
- import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
1585
+ import { jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
1582
1586
  var floatingTriggerClass = cn(
1583
1587
  "aui-app-shell-chat-trigger-fixed fixed z-50 rounded-full px-5 py-2.5 text-sm font-medium shadow-card-elevated",
1584
1588
  "bg-primary text-primary-foreground transition-colors hover:bg-primary/90",
@@ -1607,7 +1611,7 @@ var AppShellBody = ({
1607
1611
  layoutDirection
1608
1612
  );
1609
1613
  const insetPadding = sidebar ? insetPaddingPx : 0;
1610
- return /* @__PURE__ */ jsx5(
1614
+ return /* @__PURE__ */ jsx6(
1611
1615
  motion.div,
1612
1616
  {
1613
1617
  className: "aui-app-shell-body relative z-10 flex min-h-0 min-w-0 flex-1 flex-col",
@@ -1622,8 +1626,18 @@ var AppShellBody = ({
1622
1626
  !topbarContent && appShellInsetTopClass
1623
1627
  ),
1624
1628
  children: [
1625
- topbarContent ? /* @__PURE__ */ jsx5("header", { className: cn("aui-app-shell-topbar-region", appShellTopbarStickyClass), children: /* @__PURE__ */ jsx5("div", { className: appShellTopbarInsetClass, children: topbarContent }) }) : null,
1626
- /* @__PURE__ */ jsx5("main", { className: cn("aui-app-shell-main min-w-0 flex-1", mainClassName), children })
1629
+ topbarContent ? /* @__PURE__ */ jsx6("header", { className: cn("aui-app-shell-topbar-region", appShellTopbarStickyClass), children: /* @__PURE__ */ jsx6("div", { className: appShellTopbarInsetClass, children: topbarContent }) }) : null,
1630
+ /* @__PURE__ */ jsx6(
1631
+ "main",
1632
+ {
1633
+ className: cn(
1634
+ "aui-app-shell-main min-w-0 flex-1",
1635
+ appShellInsetBottomClass,
1636
+ mainClassName
1637
+ ),
1638
+ children
1639
+ }
1640
+ )
1627
1641
  ]
1628
1642
  }
1629
1643
  )
@@ -1689,7 +1703,7 @@ var AppShell = ({
1689
1703
  setInsetPaddingPx(insetPx);
1690
1704
  }, []);
1691
1705
  const insetExpanded = insetPaddingPx >= SIDEBAR_INSET_PX_EXPANDED;
1692
- const shellBody = /* @__PURE__ */ jsx5(
1706
+ const shellBody = /* @__PURE__ */ jsx6(
1693
1707
  AppShellBody,
1694
1708
  {
1695
1709
  sidebar,
@@ -1700,7 +1714,7 @@ var AppShell = ({
1700
1714
  children
1701
1715
  }
1702
1716
  );
1703
- const tree = /* @__PURE__ */ jsx5(ShellInsetProvider, { value: sidebar ? reportShellInset : null, children: /* @__PURE__ */ jsxs5(
1717
+ const tree = /* @__PURE__ */ jsx6(ShellInsetProvider, { value: sidebar ? reportShellInset : null, children: /* @__PURE__ */ jsxs5(
1704
1718
  "div",
1705
1719
  {
1706
1720
  className: cn(
@@ -1710,7 +1724,7 @@ var AppShell = ({
1710
1724
  style: studioChromeShellStyle,
1711
1725
  children: [
1712
1726
  sidebar,
1713
- sidebar && navOpen ? /* @__PURE__ */ jsx5(
1727
+ sidebar && navOpen ? /* @__PURE__ */ jsx6(
1714
1728
  "button",
1715
1729
  {
1716
1730
  type: "button",
@@ -1720,7 +1734,7 @@ var AppShell = ({
1720
1734
  }
1721
1735
  ) : null,
1722
1736
  shellBody,
1723
- hasChat && chatOpen ? /* @__PURE__ */ jsx5(
1737
+ hasChat && chatOpen ? /* @__PURE__ */ jsx6(
1724
1738
  "div",
1725
1739
  {
1726
1740
  className: floatingPanelClass,
@@ -1733,7 +1747,7 @@ var AppShell = ({
1733
1747
  children: chat
1734
1748
  }
1735
1749
  ) : null,
1736
- hasChat && chatCollapsible && !chatOpen && !hideChatTrigger ? /* @__PURE__ */ jsx5(
1750
+ hasChat && chatCollapsible && !chatOpen && !hideChatTrigger ? /* @__PURE__ */ jsx6(
1737
1751
  "button",
1738
1752
  {
1739
1753
  type: "button",
@@ -1746,11 +1760,11 @@ var AppShell = ({
1746
1760
  ]
1747
1761
  }
1748
1762
  ) });
1749
- const withNav = /* @__PURE__ */ jsx5(AppShellNavProvider, { value: navControls, children: tree });
1763
+ const withNav = /* @__PURE__ */ jsx6(AppShellNavProvider, { value: navControls, children: tree });
1750
1764
  if (!hasChat) {
1751
1765
  return withNav;
1752
1766
  }
1753
- return /* @__PURE__ */ jsx5(
1767
+ return /* @__PURE__ */ jsx6(
1754
1768
  AppShellChatProvider,
1755
1769
  {
1756
1770
  value: {
@@ -1765,7 +1779,7 @@ var AppShell = ({
1765
1779
  };
1766
1780
 
1767
1781
  // src/app/layout/AppShellTopbar.tsx
1768
- import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
1782
+ import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
1769
1783
  var AppShellTopbar = ({
1770
1784
  start,
1771
1785
  actions,
@@ -1777,12 +1791,12 @@ var AppShellTopbar = ({
1777
1791
  start,
1778
1792
  children
1779
1793
  ] }),
1780
- actions ? /* @__PURE__ */ jsx6("div", { className: "aui-app-shell-topbar-actions flex shrink-0 items-center gap-2", children: actions }) : null
1794
+ actions ? /* @__PURE__ */ jsx7("div", { className: "aui-app-shell-topbar-actions flex shrink-0 items-center gap-2", children: actions }) : null
1781
1795
  ] });
1782
1796
  };
1783
1797
 
1784
1798
  // src/app/layout/AppShellChatTrigger.tsx
1785
- import { jsx as jsx7 } from "react/jsx-runtime";
1799
+ import { jsx as jsx8 } from "react/jsx-runtime";
1786
1800
  var floatingPositionClass = "fixed bottom-6 right-6 z-50 max-sm:bottom-4 max-sm:right-4";
1787
1801
  var AppShellChatTrigger = ({
1788
1802
  className,
@@ -1791,7 +1805,7 @@ var AppShellChatTrigger = ({
1791
1805
  }) => {
1792
1806
  const shellChat = useAppShellChat();
1793
1807
  if (!shellChat || shellChat.open) return null;
1794
- return /* @__PURE__ */ jsx7(
1808
+ return /* @__PURE__ */ jsx8(
1795
1809
  TimbalV2Button,
1796
1810
  {
1797
1811
  type: "button",
@@ -1812,13 +1826,13 @@ var AppShellChatTrigger = ({
1812
1826
 
1813
1827
  // src/app/layout/AppShellSidebarTrigger.tsx
1814
1828
  import { MenuIcon } from "lucide-react";
1815
- import { jsx as jsx8 } from "react/jsx-runtime";
1829
+ import { jsx as jsx9 } from "react/jsx-runtime";
1816
1830
  var AppShellSidebarTrigger = ({
1817
1831
  label = "Open navigation",
1818
1832
  className
1819
1833
  }) => {
1820
1834
  const nav = useAppShellNav();
1821
- return /* @__PURE__ */ jsx8(
1835
+ return /* @__PURE__ */ jsx9(
1822
1836
  "button",
1823
1837
  {
1824
1838
  type: "button",
@@ -1830,75 +1844,96 @@ var AppShellSidebarTrigger = ({
1830
1844
  "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-foreground/10",
1831
1845
  className
1832
1846
  ),
1833
- children: /* @__PURE__ */ jsx8(MenuIcon, { className: "size-5", "aria-hidden": true })
1847
+ children: /* @__PURE__ */ jsx9(MenuIcon, { className: "size-5", "aria-hidden": true })
1834
1848
  }
1835
1849
  );
1836
1850
  };
1837
1851
 
1838
1852
  // src/app/layout/PageHeader.tsx
1839
- import { jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
1853
+ import { jsx as jsx10, jsxs as jsxs7 } from "react/jsx-runtime";
1840
1854
  var PageHeader = ({
1841
1855
  title,
1842
1856
  description,
1843
1857
  actions,
1844
1858
  className
1845
1859
  }) => {
1846
- return /* @__PURE__ */ jsxs7("header", { className: cn("aui-app-page-header", appPageHeaderClass, className), children: [
1860
+ const pageHeaderClass = useAppDensityClass("pageHeader");
1861
+ return /* @__PURE__ */ jsxs7("header", { className: cn("aui-app-page-header", pageHeaderClass, className), children: [
1847
1862
  /* @__PURE__ */ jsxs7("div", { className: "min-w-0", children: [
1848
- /* @__PURE__ */ jsx9("h1", { className: "text-2xl font-semibold tracking-tight text-foreground", children: title }),
1849
- description ? /* @__PURE__ */ jsx9("p", { className: "mt-1 text-sm text-muted-foreground", children: description }) : null
1863
+ /* @__PURE__ */ jsx10("h1", { className: "text-2xl font-semibold tracking-tight text-foreground", children: title }),
1864
+ description ? /* @__PURE__ */ jsx10("p", { className: "mt-1 text-sm text-muted-foreground", children: description }) : null
1850
1865
  ] }),
1851
- actions ? /* @__PURE__ */ jsx9("div", { className: "aui-app-page-header-actions flex shrink-0 flex-wrap items-center gap-2", children: actions }) : null
1866
+ actions ? /* @__PURE__ */ jsx10("div", { className: "aui-app-page-header-actions flex shrink-0 flex-wrap items-center gap-2", children: actions }) : null
1852
1867
  ] });
1853
1868
  };
1854
1869
 
1855
1870
  // src/app/layout/Page.tsx
1856
- import { jsx as jsx10, jsxs as jsxs8 } from "react/jsx-runtime";
1871
+ import { jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
1872
+ var PageFrame = ({
1873
+ children,
1874
+ breadcrumbs,
1875
+ className,
1876
+ ...headerProps
1877
+ }) => {
1878
+ const density = useAppDensity();
1879
+ const pageColumnClass = useAppDensityClass("pageColumn");
1880
+ return /* @__PURE__ */ jsxs8(
1881
+ "div",
1882
+ {
1883
+ className: cn("aui-app-page", pageColumnClass, className),
1884
+ "data-density": density,
1885
+ children: [
1886
+ breadcrumbs,
1887
+ /* @__PURE__ */ jsx11(PageHeader, { ...headerProps }),
1888
+ children
1889
+ ]
1890
+ }
1891
+ );
1892
+ };
1857
1893
  var Page = ({
1894
+ density = "default",
1858
1895
  children,
1859
1896
  breadcrumbs,
1860
1897
  className,
1861
1898
  ...headerProps
1862
1899
  }) => {
1863
- return /* @__PURE__ */ jsxs8("div", { className: cn("aui-app-page", appPageColumnClass, className), children: [
1864
- breadcrumbs,
1865
- /* @__PURE__ */ jsx10(PageHeader, { ...headerProps }),
1866
- children
1867
- ] });
1900
+ return /* @__PURE__ */ jsx11(AppDensityProvider, { density, children: /* @__PURE__ */ jsx11(PageFrame, { breadcrumbs, className, ...headerProps, children }) });
1868
1901
  };
1869
1902
 
1870
1903
  // src/app/layout/Section.tsx
1871
- import { jsx as jsx11, jsxs as jsxs9 } from "react/jsx-runtime";
1904
+ import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
1872
1905
  var Section = ({
1873
1906
  title,
1874
1907
  description,
1875
1908
  children,
1909
+ density,
1876
1910
  className
1877
1911
  }) => {
1878
- return /* @__PURE__ */ jsxs9("section", { className: cn("aui-app-section", appSectionClass, className), children: [
1879
- title ? /* @__PURE__ */ jsx11("h2", { className: appSectionTitleClass, children: title }) : null,
1880
- description ? /* @__PURE__ */ jsx11("p", { className: appSectionDescriptionClass, children: description }) : null,
1912
+ const sectionClass = useAppDensityClass("section", density);
1913
+ return /* @__PURE__ */ jsxs9("section", { className: cn("aui-app-section", sectionClass, className), children: [
1914
+ title ? /* @__PURE__ */ jsx12("h2", { className: appSectionTitleClass, children: title }) : null,
1915
+ description ? /* @__PURE__ */ jsx12("p", { className: appSectionDescriptionClass, children: description }) : null,
1881
1916
  children
1882
1917
  ] });
1883
1918
  };
1884
1919
 
1885
1920
  // src/app/copilot/app-copilot-context.tsx
1886
- import { createContext as createContext3, useContext as useContext3 } from "react";
1887
- import { jsx as jsx12 } from "react/jsx-runtime";
1888
- var AppCopilotContext = createContext3(null);
1921
+ import { createContext as createContext4, useContext as useContext4 } from "react";
1922
+ import { jsx as jsx13 } from "react/jsx-runtime";
1923
+ var AppCopilotContext = createContext4(null);
1889
1924
  var AppCopilotProvider = ({
1890
1925
  value,
1891
1926
  children
1892
1927
  }) => {
1893
- return /* @__PURE__ */ jsx12(AppCopilotContext.Provider, { value, children });
1928
+ return /* @__PURE__ */ jsx13(AppCopilotContext.Provider, { value, children });
1894
1929
  };
1895
1930
  function useAppCopilotContext() {
1896
- return useContext3(AppCopilotContext) ?? {};
1931
+ return useContext4(AppCopilotContext) ?? {};
1897
1932
  }
1898
1933
 
1899
1934
  // src/app/chat/AppChatPanel.tsx
1900
1935
  import { XIcon } from "lucide-react";
1901
- import { jsx as jsx13, jsxs as jsxs10 } from "react/jsx-runtime";
1936
+ import { jsx as jsx14, jsxs as jsxs10 } from "react/jsx-runtime";
1902
1937
  var shellClass = "aui-app-chat-panel flex h-full min-h-0 flex-col overflow-hidden";
1903
1938
  var chromeClass = cn(
1904
1939
  "aui-app-chat-panel-chrome relative z-20 flex min-h-10 shrink-0 items-center justify-end px-2 pt-2"
@@ -1944,17 +1979,17 @@ var AppChatPanel = ({
1944
1979
  }) => {
1945
1980
  const shellChat = useAppShellChat();
1946
1981
  return /* @__PURE__ */ jsxs10("div", { className: cn(shellClass, className), children: [
1947
- shellChat?.collapsible ? /* @__PURE__ */ jsx13("div", { className: chromeClass, children: /* @__PURE__ */ jsx13(
1982
+ shellChat?.collapsible ? /* @__PURE__ */ jsx14("div", { className: chromeClass, children: /* @__PURE__ */ jsx14(
1948
1983
  "button",
1949
1984
  {
1950
1985
  type: "button",
1951
1986
  className: closeButtonClass,
1952
1987
  onClick: () => shellChat.setOpen(false),
1953
1988
  "aria-label": "Close assistant",
1954
- children: /* @__PURE__ */ jsx13(XIcon, { className: "size-4", "aria-hidden": true })
1989
+ children: /* @__PURE__ */ jsx14(XIcon, { className: "size-4", "aria-hidden": true })
1955
1990
  }
1956
1991
  ) }) : null,
1957
- /* @__PURE__ */ jsx13("div", { className: bodyClass, children: /* @__PURE__ */ jsx13(
1992
+ /* @__PURE__ */ jsx14("div", { className: bodyClass, children: /* @__PURE__ */ jsx14(
1958
1993
  TimbalRuntimeProvider,
1959
1994
  {
1960
1995
  workforceId,
@@ -1964,7 +1999,7 @@ var AppChatPanel = ({
1964
1999
  attachmentsUploadUrl,
1965
2000
  attachmentsAccept,
1966
2001
  debug,
1967
- children: /* @__PURE__ */ jsx13(
2002
+ children: /* @__PURE__ */ jsx14(
1968
2003
  Thread,
1969
2004
  {
1970
2005
  variant: "panel",
@@ -1985,66 +2020,91 @@ var AppChatPanel = ({
1985
2020
  };
1986
2021
 
1987
2022
  // src/app/surfaces/SurfaceCard.tsx
1988
- import { jsx as jsx14 } from "react/jsx-runtime";
2023
+ import { jsx as jsx15 } from "react/jsx-runtime";
1989
2024
  var SurfaceCard = ({ children, className }) => {
1990
- return /* @__PURE__ */ jsx14("div", { className: cn("aui-app-surface-card", appSurfaceCardClass, className), children });
2025
+ const surfaceCardClass = useAppDensityClass("surfaceCard");
2026
+ return /* @__PURE__ */ jsx15("div", { className: cn("aui-app-surface-card", surfaceCardClass, className), children });
1991
2027
  };
1992
2028
 
1993
2029
  // src/app/surfaces/StatTile.tsx
1994
- import { jsx as jsx15, jsxs as jsxs11 } from "react/jsx-runtime";
2030
+ import { jsx as jsx16, jsxs as jsxs11 } from "react/jsx-runtime";
1995
2031
  var StatTile = ({ label, value, hint, className }) => {
1996
- return /* @__PURE__ */ jsxs11("div", { className: cn("aui-app-stat-tile", appStatTileClass, className), children: [
1997
- /* @__PURE__ */ jsx15("span", { className: appStatLabelClass, children: label }),
1998
- /* @__PURE__ */ jsx15("span", { className: appStatValueClass, children: value }),
1999
- hint ? /* @__PURE__ */ jsx15("span", { className: "text-xs text-muted-foreground", children: hint }) : null
2032
+ const statTileClass = useAppDensityClass("statTile");
2033
+ return /* @__PURE__ */ jsxs11("div", { className: cn("aui-app-stat-tile", statTileClass, className), children: [
2034
+ /* @__PURE__ */ jsx16("span", { className: appStatLabelClass, children: label }),
2035
+ /* @__PURE__ */ jsx16("span", { className: appStatValueClass, children: value }),
2036
+ hint ? /* @__PURE__ */ jsx16("span", { className: "text-xs text-muted-foreground", children: hint }) : null
2000
2037
  ] });
2001
2038
  };
2002
2039
 
2003
2040
  // src/app/surfaces/EmptyState.tsx
2004
- import { jsx as jsx16, jsxs as jsxs12 } from "react/jsx-runtime";
2041
+ import { jsx as jsx17, jsxs as jsxs12 } from "react/jsx-runtime";
2005
2042
  var EmptyState = ({
2006
2043
  title,
2007
2044
  description,
2008
2045
  action,
2009
2046
  className
2010
2047
  }) => {
2011
- return /* @__PURE__ */ jsxs12("div", { className: cn("aui-app-empty-state", appEmptyStateClass, className), children: [
2012
- /* @__PURE__ */ jsx16("p", { className: appEmptyStateTitleClass, children: title }),
2013
- description ? /* @__PURE__ */ jsx16("p", { className: appEmptyStateDescriptionClass, children: description }) : null,
2048
+ const emptyStateClass = useAppDensityClass("emptyState");
2049
+ return /* @__PURE__ */ jsxs12("div", { className: cn("aui-app-empty-state", emptyStateClass, className), children: [
2050
+ /* @__PURE__ */ jsx17("p", { className: appEmptyStateTitleClass, children: title }),
2051
+ description ? /* @__PURE__ */ jsx17("p", { className: appEmptyStateDescriptionClass, children: description }) : null,
2014
2052
  action
2015
2053
  ] });
2016
2054
  };
2017
2055
 
2018
2056
  // src/app/surfaces/StatusBadge.tsx
2019
- import { jsx as jsx17 } from "react/jsx-runtime";
2057
+ import { jsx as jsx18, jsxs as jsxs13 } from "react/jsx-runtime";
2020
2058
  var statusBadgeToneClass = {
2021
- default: "bg-muted text-foreground",
2022
- primary: "bg-primary/10 text-primary",
2023
- success: "bg-emerald-500/10 text-emerald-600 dark:text-emerald-400",
2024
- warn: "bg-amber-500/10 text-amber-600 dark:text-amber-400",
2025
- danger: "bg-destructive/10 text-destructive",
2026
- muted: "bg-muted/80 text-muted-foreground"
2059
+ default: "bg-muted text-foreground ring-border",
2060
+ primary: "bg-primary/10 text-primary ring-primary/20",
2061
+ success: "bg-emerald-500/10 text-emerald-700 ring-emerald-500/20 dark:text-emerald-400",
2062
+ warn: "bg-amber-500/10 text-amber-700 ring-amber-500/25 dark:text-amber-400",
2063
+ danger: "bg-destructive/10 text-destructive ring-destructive/20",
2064
+ muted: "bg-muted/70 text-muted-foreground ring-border/60"
2065
+ };
2066
+ var statusBadgeDotClass = {
2067
+ default: "bg-foreground/40",
2068
+ primary: "bg-primary",
2069
+ success: "bg-emerald-500",
2070
+ warn: "bg-amber-500",
2071
+ danger: "bg-destructive",
2072
+ muted: "bg-muted-foreground/60"
2027
2073
  };
2028
2074
  var StatusBadge = ({
2029
2075
  children,
2030
2076
  tone = "default",
2077
+ dot = false,
2031
2078
  className
2032
2079
  }) => {
2033
- return /* @__PURE__ */ jsx17(
2080
+ return /* @__PURE__ */ jsxs13(
2034
2081
  "span",
2035
2082
  {
2036
2083
  className: cn(
2037
- "aui-app-status-badge inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium",
2084
+ "aui-app-status-badge inline-flex items-center gap-1.5 rounded-full px-2 py-0.5",
2085
+ "text-xs font-medium leading-none ring-1 ring-inset",
2038
2086
  statusBadgeToneClass[tone],
2039
2087
  className
2040
2088
  ),
2041
- children
2089
+ children: [
2090
+ dot ? /* @__PURE__ */ jsx18(
2091
+ "span",
2092
+ {
2093
+ "aria-hidden": true,
2094
+ className: cn(
2095
+ "size-1.5 shrink-0 rounded-full",
2096
+ statusBadgeDotClass[tone]
2097
+ )
2098
+ }
2099
+ ) : null,
2100
+ children
2101
+ ]
2042
2102
  }
2043
2103
  );
2044
2104
  };
2045
2105
 
2046
2106
  // src/app/surfaces/AppConfirmDialog.tsx
2047
- import { jsx as jsx18, jsxs as jsxs13 } from "react/jsx-runtime";
2107
+ import { jsx as jsx19, jsxs as jsxs14 } from "react/jsx-runtime";
2048
2108
  var bodyClass2 = "flex flex-col gap-4 p-6";
2049
2109
  var titleClass = "pr-8";
2050
2110
  var actionsClass = "flex flex-wrap justify-end gap-2";
@@ -2059,15 +2119,15 @@ var AppConfirmDialog = ({
2059
2119
  destructive = false,
2060
2120
  className
2061
2121
  }) => {
2062
- return /* @__PURE__ */ jsx18(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsx18(
2122
+ return /* @__PURE__ */ jsx19(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsx19(
2063
2123
  DialogContent,
2064
2124
  {
2065
2125
  className: cn("gap-0 p-0 sm:max-w-md", className),
2066
- children: /* @__PURE__ */ jsxs13("div", { className: bodyClass2, children: [
2067
- /* @__PURE__ */ jsx18(DialogTitle, { className: titleClass, children: title }),
2068
- description ? /* @__PURE__ */ jsx18("p", { className: "text-sm text-muted-foreground", children: description }) : null,
2069
- /* @__PURE__ */ jsxs13("div", { className: actionsClass, children: [
2070
- /* @__PURE__ */ jsx18(
2126
+ children: /* @__PURE__ */ jsxs14("div", { className: bodyClass2, children: [
2127
+ /* @__PURE__ */ jsx19(DialogTitle, { className: titleClass, children: title }),
2128
+ description ? /* @__PURE__ */ jsx19("p", { className: "text-sm text-muted-foreground", children: description }) : null,
2129
+ /* @__PURE__ */ jsxs14("div", { className: actionsClass, children: [
2130
+ /* @__PURE__ */ jsx19(
2071
2131
  TimbalV2Button,
2072
2132
  {
2073
2133
  type: "button",
@@ -2077,7 +2137,7 @@ var AppConfirmDialog = ({
2077
2137
  children: cancelLabel
2078
2138
  }
2079
2139
  ),
2080
- /* @__PURE__ */ jsx18(
2140
+ /* @__PURE__ */ jsx19(
2081
2141
  TimbalV2Button,
2082
2142
  {
2083
2143
  type: "button",
@@ -2097,7 +2157,7 @@ var AppConfirmDialog = ({
2097
2157
  };
2098
2158
 
2099
2159
  // src/app/surfaces/InfoCard.tsx
2100
- import { jsx as jsx19, jsxs as jsxs14 } from "react/jsx-runtime";
2160
+ import { jsx as jsx20, jsxs as jsxs15 } from "react/jsx-runtime";
2101
2161
  var toneClass = {
2102
2162
  neutral: "border-border bg-muted/40",
2103
2163
  info: "border-primary/25 bg-primary/5",
@@ -2112,7 +2172,7 @@ var InfoCard = ({
2112
2172
  action,
2113
2173
  tone = "neutral",
2114
2174
  className
2115
- }) => /* @__PURE__ */ jsxs14(
2175
+ }) => /* @__PURE__ */ jsxs15(
2116
2176
  "div",
2117
2177
  {
2118
2178
  className: cn(
@@ -2121,18 +2181,18 @@ var InfoCard = ({
2121
2181
  className
2122
2182
  ),
2123
2183
  children: [
2124
- icon ? /* @__PURE__ */ jsx19("span", { className: "mt-0.5 shrink-0 text-muted-foreground", children: icon }) : null,
2125
- /* @__PURE__ */ jsxs14("div", { className: "min-w-0 flex-1", children: [
2126
- title ? /* @__PURE__ */ jsx19("p", { className: "text-sm font-medium text-foreground", children: title }) : null,
2127
- children ? /* @__PURE__ */ jsx19("div", { className: cn("text-sm text-muted-foreground", title && "mt-1"), children }) : null
2184
+ icon ? /* @__PURE__ */ jsx20("span", { className: "mt-0.5 shrink-0 text-muted-foreground", children: icon }) : null,
2185
+ /* @__PURE__ */ jsxs15("div", { className: "min-w-0 flex-1", children: [
2186
+ title ? /* @__PURE__ */ jsx20("p", { className: "text-sm font-medium text-foreground", children: title }) : null,
2187
+ children ? /* @__PURE__ */ jsx20("div", { className: cn("text-sm text-muted-foreground", title && "mt-1"), children }) : null
2128
2188
  ] }),
2129
- action ? /* @__PURE__ */ jsx19("div", { className: "shrink-0", children: action }) : null
2189
+ action ? /* @__PURE__ */ jsx20("div", { className: "shrink-0", children: action }) : null
2130
2190
  ]
2131
2191
  }
2132
2192
  );
2133
2193
 
2134
2194
  // src/app/surfaces/StatusDot.tsx
2135
- import { jsx as jsx20, jsxs as jsxs15 } from "react/jsx-runtime";
2195
+ import { jsx as jsx21, jsxs as jsxs16 } from "react/jsx-runtime";
2136
2196
  var dotClass = {
2137
2197
  online: "bg-emerald-500",
2138
2198
  busy: "bg-amber-500",
@@ -2145,9 +2205,9 @@ var StatusDot = ({
2145
2205
  label,
2146
2206
  pulse = false,
2147
2207
  className
2148
- }) => /* @__PURE__ */ jsxs15("span", { className: cn("inline-flex items-center gap-1.5", className), children: [
2149
- /* @__PURE__ */ jsxs15("span", { className: "relative flex size-2", children: [
2150
- pulse ? /* @__PURE__ */ jsx20(
2208
+ }) => /* @__PURE__ */ jsxs16("span", { className: cn("inline-flex items-center gap-1.5", className), children: [
2209
+ /* @__PURE__ */ jsxs16("span", { className: "relative flex size-2", children: [
2210
+ pulse ? /* @__PURE__ */ jsx21(
2151
2211
  "span",
2152
2212
  {
2153
2213
  className: cn(
@@ -2156,25 +2216,25 @@ var StatusDot = ({
2156
2216
  )
2157
2217
  }
2158
2218
  ) : null,
2159
- /* @__PURE__ */ jsx20("span", { className: cn("relative inline-flex size-2 rounded-full", dotClass[tone]) })
2219
+ /* @__PURE__ */ jsx21("span", { className: cn("relative inline-flex size-2 rounded-full", dotClass[tone]) })
2160
2220
  ] }),
2161
- label ? /* @__PURE__ */ jsx20("span", { className: "text-xs text-muted-foreground", children: label }) : null
2221
+ label ? /* @__PURE__ */ jsx21("span", { className: "text-xs text-muted-foreground", children: label }) : null
2162
2222
  ] });
2163
2223
 
2164
2224
  // src/app/surfaces/DescriptionList.tsx
2165
- import { jsx as jsx21, jsxs as jsxs16 } from "react/jsx-runtime";
2225
+ import { jsx as jsx22, jsxs as jsxs17 } from "react/jsx-runtime";
2166
2226
  var DescriptionList = ({
2167
2227
  items,
2168
2228
  stacked = false,
2169
2229
  className
2170
- }) => /* @__PURE__ */ jsx21(
2230
+ }) => /* @__PURE__ */ jsx22(
2171
2231
  "dl",
2172
2232
  {
2173
2233
  className: cn(
2174
2234
  "divide-y divide-border rounded-xl border border-border bg-card",
2175
2235
  className
2176
2236
  ),
2177
- children: items.map((item, i) => /* @__PURE__ */ jsxs16(
2237
+ children: items.map((item, i) => /* @__PURE__ */ jsxs17(
2178
2238
  "div",
2179
2239
  {
2180
2240
  className: cn(
@@ -2182,8 +2242,8 @@ var DescriptionList = ({
2182
2242
  stacked ? "flex flex-col gap-0.5" : "flex items-center justify-between gap-4"
2183
2243
  ),
2184
2244
  children: [
2185
- /* @__PURE__ */ jsx21("dt", { className: "text-sm text-muted-foreground", children: item.label }),
2186
- /* @__PURE__ */ jsx21(
2245
+ /* @__PURE__ */ jsx22("dt", { className: "text-sm text-muted-foreground", children: item.label }),
2246
+ /* @__PURE__ */ jsx22(
2187
2247
  "dd",
2188
2248
  {
2189
2249
  className: cn(
@@ -2203,8 +2263,8 @@ var DescriptionList = ({
2203
2263
  // src/app/surfaces/ExpandableSection.tsx
2204
2264
  import { useId, useState as useState2 } from "react";
2205
2265
  import { AnimatePresence, motion as motion2, useReducedMotion as useReducedMotion2 } from "motion/react";
2206
- import { jsx as jsx22, jsxs as jsxs17 } from "react/jsx-runtime";
2207
- var Chevron = ({ open }) => /* @__PURE__ */ jsx22(
2266
+ import { jsx as jsx23, jsxs as jsxs18 } from "react/jsx-runtime";
2267
+ var Chevron = ({ open }) => /* @__PURE__ */ jsx23(
2208
2268
  "svg",
2209
2269
  {
2210
2270
  viewBox: "0 0 24 24",
@@ -2218,7 +2278,7 @@ var Chevron = ({ open }) => /* @__PURE__ */ jsx22(
2218
2278
  strokeLinecap: "round",
2219
2279
  strokeLinejoin: "round",
2220
2280
  "aria-hidden": true,
2221
- children: /* @__PURE__ */ jsx22("path", { d: "m6 9 6 6 6-6" })
2281
+ children: /* @__PURE__ */ jsx23("path", { d: "m6 9 6 6 6-6" })
2222
2282
  }
2223
2283
  );
2224
2284
  var ExpandableSection = ({
@@ -2239,8 +2299,8 @@ var ExpandableSection = ({
2239
2299
  if (openProp == null) setInternalOpen((o) => !o);
2240
2300
  onOpenChange?.(!open);
2241
2301
  };
2242
- return /* @__PURE__ */ jsxs17("div", { className: cn("border-b border-border last:border-0", className), children: [
2243
- /* @__PURE__ */ jsxs17(
2302
+ return /* @__PURE__ */ jsxs18("div", { className: cn("border-b border-border last:border-0", className), children: [
2303
+ /* @__PURE__ */ jsxs18(
2244
2304
  "button",
2245
2305
  {
2246
2306
  type: "button",
@@ -2249,16 +2309,16 @@ var ExpandableSection = ({
2249
2309
  "aria-controls": panelId,
2250
2310
  className: "flex w-full items-center justify-between gap-3 bg-transparent px-4 py-3 text-left hover:bg-transparent active:bg-transparent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-foreground/10",
2251
2311
  children: [
2252
- /* @__PURE__ */ jsxs17("span", { className: "flex min-w-0 items-center gap-3", children: [
2253
- icon ? /* @__PURE__ */ jsx22("span", { className: "flex size-8 items-center justify-center rounded-lg border border-border bg-muted text-muted-foreground", children: icon }) : null,
2254
- /* @__PURE__ */ jsx22("span", { className: "truncate text-sm font-medium text-foreground", children: title }),
2255
- count != null ? /* @__PURE__ */ jsx22("span", { className: "rounded-full border border-border bg-muted px-2 py-0.5 text-xs text-muted-foreground", children: count }) : null
2312
+ /* @__PURE__ */ jsxs18("span", { className: "flex min-w-0 items-center gap-3", children: [
2313
+ icon ? /* @__PURE__ */ jsx23("span", { className: "flex size-8 items-center justify-center rounded-lg border border-border bg-muted text-muted-foreground", children: icon }) : null,
2314
+ /* @__PURE__ */ jsx23("span", { className: "truncate text-sm font-medium text-foreground", children: title }),
2315
+ count != null ? /* @__PURE__ */ jsx23("span", { className: "rounded-full border border-border bg-muted px-2 py-0.5 text-xs text-muted-foreground", children: count }) : null
2256
2316
  ] }),
2257
- /* @__PURE__ */ jsx22(Chevron, { open })
2317
+ /* @__PURE__ */ jsx23(Chevron, { open })
2258
2318
  ]
2259
2319
  }
2260
2320
  ),
2261
- /* @__PURE__ */ jsx22(AnimatePresence, { initial: false, children: open ? /* @__PURE__ */ jsx22(
2321
+ /* @__PURE__ */ jsx23(AnimatePresence, { initial: false, children: open ? /* @__PURE__ */ jsx23(
2262
2322
  motion2.div,
2263
2323
  {
2264
2324
  id: panelId,
@@ -2267,7 +2327,7 @@ var ExpandableSection = ({
2267
2327
  exit: reduceMotion ? void 0 : { height: 0, opacity: 0 },
2268
2328
  transition: { duration: 0.2, ease: "easeOut" },
2269
2329
  className: "overflow-hidden",
2270
- children: /* @__PURE__ */ jsx22("div", { className: "bg-muted/20", children })
2330
+ children: /* @__PURE__ */ jsx23("div", { className: "bg-muted/20", children })
2271
2331
  },
2272
2332
  "body"
2273
2333
  ) : null })
@@ -2275,7 +2335,7 @@ var ExpandableSection = ({
2275
2335
  };
2276
2336
 
2277
2337
  // src/app/surfaces/ResourceCard.tsx
2278
- import { Fragment as Fragment3, jsx as jsx23, jsxs as jsxs18 } from "react/jsx-runtime";
2338
+ import { Fragment as Fragment3, jsx as jsx24, jsxs as jsxs19 } from "react/jsx-runtime";
2279
2339
  var resourceCardShellClass = cn(
2280
2340
  "flex min-h-[8.5rem] flex-col rounded-2xl p-4 text-left font-normal",
2281
2341
  TIMBAL_V2_ELEVATED_SURFACE
@@ -2300,35 +2360,35 @@ var ResourceCard = ({
2300
2360
  ariaLabel,
2301
2361
  className
2302
2362
  }) => {
2303
- const body = /* @__PURE__ */ jsxs18(Fragment3, { children: [
2304
- /* @__PURE__ */ jsxs18("div", { className: "flex items-start gap-3", children: [
2305
- media ? /* @__PURE__ */ jsx23("span", { className: mediaShellClass, children: media }) : null,
2306
- /* @__PURE__ */ jsxs18("div", { className: "min-w-0 flex-1 pt-0.5", children: [
2307
- /* @__PURE__ */ jsx23("p", { className: "truncate text-sm font-normal leading-snug text-foreground", children: title }),
2308
- subtitle ? /* @__PURE__ */ jsx23("p", { className: "mt-1 line-clamp-2 text-xs font-normal text-muted-foreground", children: subtitle }) : null
2363
+ const body = /* @__PURE__ */ jsxs19(Fragment3, { children: [
2364
+ /* @__PURE__ */ jsxs19("div", { className: "flex items-start gap-3", children: [
2365
+ media ? /* @__PURE__ */ jsx24("span", { className: mediaShellClass, children: media }) : null,
2366
+ /* @__PURE__ */ jsxs19("div", { className: "min-w-0 flex-1 pt-0.5", children: [
2367
+ /* @__PURE__ */ jsx24("p", { className: "truncate text-sm font-normal leading-snug text-foreground", children: title }),
2368
+ subtitle ? /* @__PURE__ */ jsx24("p", { className: "mt-1 line-clamp-2 text-xs font-normal text-muted-foreground", children: subtitle }) : null
2309
2369
  ] }),
2310
- badge ? /* @__PURE__ */ jsx23("span", { className: "shrink-0 pt-0.5", children: badge }) : null
2370
+ badge ? /* @__PURE__ */ jsx24("span", { className: "shrink-0 pt-0.5", children: badge }) : null
2311
2371
  ] }),
2312
- footer || action ? /* @__PURE__ */ jsxs18("div", { className: "mt-auto flex items-center justify-between gap-3 border-t border-border/40 pt-3 text-xs font-normal text-muted-foreground", children: [
2313
- /* @__PURE__ */ jsx23("span", { className: "min-w-0 truncate", children: footer }),
2314
- action ? /* @__PURE__ */ jsx23("span", { className: "shrink-0 opacity-80", children: action }) : null
2372
+ footer || action ? /* @__PURE__ */ jsxs19("div", { className: "mt-auto flex items-center justify-between gap-3 border-t border-border/40 pt-3 text-xs font-normal text-muted-foreground", children: [
2373
+ /* @__PURE__ */ jsx24("span", { className: "min-w-0 truncate", children: footer }),
2374
+ action ? /* @__PURE__ */ jsx24("span", { className: "shrink-0 opacity-80", children: action }) : null
2315
2375
  ] }) : null
2316
2376
  ] });
2317
2377
  if (onClick) {
2318
- return /* @__PURE__ */ jsx23("button", { type: "button", onClick, "aria-label": ariaLabel, className: cn(resourceCardInteractiveClass, className), children: body });
2378
+ return /* @__PURE__ */ jsx24("button", { type: "button", onClick, "aria-label": ariaLabel, className: cn(resourceCardInteractiveClass, className), children: body });
2319
2379
  }
2320
- return /* @__PURE__ */ jsx23("article", { className: cn(resourceCardShellClass, className), children: body });
2380
+ return /* @__PURE__ */ jsx24("article", { className: cn(resourceCardShellClass, className), children: body });
2321
2381
  };
2322
2382
 
2323
2383
  // src/app/settings/SettingsSection.tsx
2324
- import { jsx as jsx24, jsxs as jsxs19 } from "react/jsx-runtime";
2384
+ import { jsx as jsx25, jsxs as jsxs20 } from "react/jsx-runtime";
2325
2385
  var SettingsSectionHeader = ({
2326
2386
  title,
2327
2387
  description,
2328
2388
  className
2329
- }) => /* @__PURE__ */ jsxs19("div", { className: cn("flex flex-col", className), children: [
2330
- /* @__PURE__ */ jsx24("h3", { className: "text-[17px] font-medium leading-tight text-foreground", children: title }),
2331
- description ? /* @__PURE__ */ jsx24("p", { className: "mt-1 text-sm text-muted-foreground", children: description }) : null
2389
+ }) => /* @__PURE__ */ jsxs20("div", { className: cn("flex flex-col", className), children: [
2390
+ /* @__PURE__ */ jsx25("h3", { className: "text-[17px] font-medium leading-tight text-foreground", children: title }),
2391
+ description ? /* @__PURE__ */ jsx25("p", { className: "mt-1 text-sm text-muted-foreground", children: description }) : null
2332
2392
  ] });
2333
2393
  var SettingsSection = ({
2334
2394
  title,
@@ -2337,7 +2397,7 @@ var SettingsSection = ({
2337
2397
  children,
2338
2398
  noBorderTop = false,
2339
2399
  className
2340
- }) => /* @__PURE__ */ jsxs19(
2400
+ }) => /* @__PURE__ */ jsxs20(
2341
2401
  "section",
2342
2402
  {
2343
2403
  className: cn(
@@ -2346,18 +2406,18 @@ var SettingsSection = ({
2346
2406
  className
2347
2407
  ),
2348
2408
  children: [
2349
- /* @__PURE__ */ jsxs19("div", { className: "min-w-0", children: [
2350
- /* @__PURE__ */ jsx24("h2", { className: "text-sm font-medium text-foreground", children: title }),
2351
- description ? /* @__PURE__ */ jsx24("p", { className: "mt-1 text-sm text-muted-foreground", children: description }) : null,
2352
- descriptionFooter ? /* @__PURE__ */ jsx24("div", { className: "mt-3 min-w-0", children: descriptionFooter }) : null
2409
+ /* @__PURE__ */ jsxs20("div", { className: "min-w-0", children: [
2410
+ /* @__PURE__ */ jsx25("h2", { className: "text-sm font-medium text-foreground", children: title }),
2411
+ description ? /* @__PURE__ */ jsx25("p", { className: "mt-1 text-sm text-muted-foreground", children: description }) : null,
2412
+ descriptionFooter ? /* @__PURE__ */ jsx25("div", { className: "mt-3 min-w-0", children: descriptionFooter }) : null
2353
2413
  ] }),
2354
- /* @__PURE__ */ jsx24("div", { className: "min-w-0 space-y-3", children })
2414
+ /* @__PURE__ */ jsx25("div", { className: "min-w-0 space-y-3", children })
2355
2415
  ]
2356
2416
  }
2357
2417
  );
2358
2418
 
2359
2419
  // src/app/settings/FieldRow.tsx
2360
- import { jsx as jsx25, jsxs as jsxs20 } from "react/jsx-runtime";
2420
+ import { jsx as jsx26, jsxs as jsxs21 } from "react/jsx-runtime";
2361
2421
  var FieldRow = ({
2362
2422
  label,
2363
2423
  children,
@@ -2367,7 +2427,7 @@ var FieldRow = ({
2367
2427
  className
2368
2428
  }) => {
2369
2429
  if (inline) {
2370
- return /* @__PURE__ */ jsxs20(
2430
+ return /* @__PURE__ */ jsxs21(
2371
2431
  "div",
2372
2432
  {
2373
2433
  className: cn(
@@ -2375,8 +2435,8 @@ var FieldRow = ({
2375
2435
  className
2376
2436
  ),
2377
2437
  children: [
2378
- /* @__PURE__ */ jsxs20("div", { className: "min-w-0", children: [
2379
- /* @__PURE__ */ jsx25(
2438
+ /* @__PURE__ */ jsxs21("div", { className: "min-w-0", children: [
2439
+ /* @__PURE__ */ jsx26(
2380
2440
  "label",
2381
2441
  {
2382
2442
  htmlFor,
@@ -2384,17 +2444,17 @@ var FieldRow = ({
2384
2444
  children: label
2385
2445
  }
2386
2446
  ),
2387
- description ? /* @__PURE__ */ jsx25("p", { className: "mt-0.5 text-xs text-muted-foreground", children: description }) : null
2447
+ description ? /* @__PURE__ */ jsx26("p", { className: "mt-0.5 text-xs text-muted-foreground", children: description }) : null
2388
2448
  ] }),
2389
- /* @__PURE__ */ jsx25("div", { className: "shrink-0", children })
2449
+ /* @__PURE__ */ jsx26("div", { className: "shrink-0", children })
2390
2450
  ]
2391
2451
  }
2392
2452
  );
2393
2453
  }
2394
- return /* @__PURE__ */ jsxs20("div", { className: cn("flex flex-col gap-1.5", className), children: [
2395
- /* @__PURE__ */ jsx25("label", { htmlFor, className: "text-sm font-medium text-foreground", children: label }),
2454
+ return /* @__PURE__ */ jsxs21("div", { className: cn("flex flex-col gap-1.5", className), children: [
2455
+ /* @__PURE__ */ jsx26("label", { htmlFor, className: "text-sm font-medium text-foreground", children: label }),
2396
2456
  children,
2397
- description ? /* @__PURE__ */ jsx25("p", { className: "text-xs text-muted-foreground", children: description }) : null
2457
+ description ? /* @__PURE__ */ jsx26("p", { className: "text-xs text-muted-foreground", children: description }) : null
2398
2458
  ] });
2399
2459
  };
2400
2460
 
@@ -2402,7 +2462,7 @@ var FieldRow = ({
2402
2462
  import { useEffect, useState as useState3 } from "react";
2403
2463
  import { createPortal } from "react-dom";
2404
2464
  import { AnimatePresence as AnimatePresence2, motion as motion3, useReducedMotion as useReducedMotion3 } from "motion/react";
2405
- import { jsx as jsx26, jsxs as jsxs21 } from "react/jsx-runtime";
2465
+ import { jsx as jsx27, jsxs as jsxs22 } from "react/jsx-runtime";
2406
2466
  var FloatingUnsavedChangesBar = ({
2407
2467
  visible,
2408
2468
  message = "Unsaved changes",
@@ -2420,7 +2480,7 @@ var FloatingUnsavedChangesBar = ({
2420
2480
  useEffect(() => setMounted(true), []);
2421
2481
  if (!mounted || typeof document === "undefined") return null;
2422
2482
  return createPortal(
2423
- /* @__PURE__ */ jsx26(AnimatePresence2, { children: visible ? /* @__PURE__ */ jsx26("div", { className: "pointer-events-none fixed inset-x-0 bottom-5 z-50 flex justify-center px-4", children: /* @__PURE__ */ jsxs21(
2483
+ /* @__PURE__ */ jsx27(AnimatePresence2, { children: visible ? /* @__PURE__ */ jsx27("div", { className: "pointer-events-none fixed inset-x-0 bottom-5 z-50 flex justify-center px-4", children: /* @__PURE__ */ jsxs22(
2424
2484
  motion3.div,
2425
2485
  {
2426
2486
  role: "region",
@@ -2434,10 +2494,10 @@ var FloatingUnsavedChangesBar = ({
2434
2494
  className
2435
2495
  ),
2436
2496
  children: [
2437
- /* @__PURE__ */ jsx26("span", { className: "text-sm text-muted-foreground", children: message }),
2438
- /* @__PURE__ */ jsxs21("span", { className: "flex items-center gap-1.5", children: [
2439
- /* @__PURE__ */ jsx26(Button, { variant: "ghost", size: "sm", onClick: onDiscard, disabled: isSaving, children: discardLabel }),
2440
- /* @__PURE__ */ jsx26(Button, { size: "sm", onClick: onSave, disabled: saveDisabled || isSaving, children: isSaving ? "Saving\u2026" : saveLabel })
2497
+ /* @__PURE__ */ jsx27("span", { className: "text-sm text-muted-foreground", children: message }),
2498
+ /* @__PURE__ */ jsxs22("span", { className: "flex items-center gap-1.5", children: [
2499
+ /* @__PURE__ */ jsx27(Button, { variant: "ghost", size: "sm", onClick: onDiscard, disabled: isSaving, children: discardLabel }),
2500
+ /* @__PURE__ */ jsx27(Button, { size: "sm", onClick: onSave, disabled: saveDisabled || isSaving, children: isSaving ? "Saving\u2026" : saveLabel })
2441
2501
  ] })
2442
2502
  ]
2443
2503
  }
@@ -2447,13 +2507,13 @@ var FloatingUnsavedChangesBar = ({
2447
2507
  };
2448
2508
 
2449
2509
  // src/app/settings/DangerZone.tsx
2450
- import { jsx as jsx27, jsxs as jsxs22 } from "react/jsx-runtime";
2510
+ import { jsx as jsx28, jsxs as jsxs23 } from "react/jsx-runtime";
2451
2511
  var DangerZoneAction = ({
2452
2512
  title,
2453
2513
  description,
2454
2514
  action,
2455
2515
  className
2456
- }) => /* @__PURE__ */ jsxs22(
2516
+ }) => /* @__PURE__ */ jsxs23(
2457
2517
  "div",
2458
2518
  {
2459
2519
  className: cn(
@@ -2461,11 +2521,11 @@ var DangerZoneAction = ({
2461
2521
  className
2462
2522
  ),
2463
2523
  children: [
2464
- /* @__PURE__ */ jsxs22("div", { className: "min-w-0", children: [
2465
- /* @__PURE__ */ jsx27("p", { className: "text-sm font-medium text-foreground", children: title }),
2466
- description ? /* @__PURE__ */ jsx27("p", { className: "mt-0.5 text-sm text-muted-foreground", children: description }) : null
2524
+ /* @__PURE__ */ jsxs23("div", { className: "min-w-0", children: [
2525
+ /* @__PURE__ */ jsx28("p", { className: "text-sm font-medium text-foreground", children: title }),
2526
+ description ? /* @__PURE__ */ jsx28("p", { className: "mt-0.5 text-sm text-muted-foreground", children: description }) : null
2467
2527
  ] }),
2468
- /* @__PURE__ */ jsx27("div", { className: "shrink-0", children: action })
2528
+ /* @__PURE__ */ jsx28("div", { className: "shrink-0", children: action })
2469
2529
  ]
2470
2530
  }
2471
2531
  );
@@ -2474,7 +2534,7 @@ var DangerZone = ({
2474
2534
  description,
2475
2535
  children,
2476
2536
  className
2477
- }) => /* @__PURE__ */ jsxs22(
2537
+ }) => /* @__PURE__ */ jsxs23(
2478
2538
  "section",
2479
2539
  {
2480
2540
  className: cn(
@@ -2482,18 +2542,18 @@ var DangerZone = ({
2482
2542
  className
2483
2543
  ),
2484
2544
  children: [
2485
- (title || description) && /* @__PURE__ */ jsxs22("header", { className: "border-b border-destructive/20 bg-destructive/5 px-4 py-3", children: [
2486
- title ? /* @__PURE__ */ jsx27("h3", { className: "text-sm font-semibold text-destructive", children: title }) : null,
2487
- description ? /* @__PURE__ */ jsx27("p", { className: "mt-0.5 text-sm text-muted-foreground", children: description }) : null
2545
+ (title || description) && /* @__PURE__ */ jsxs23("header", { className: "border-b border-destructive/20 bg-destructive/5 px-4 py-3", children: [
2546
+ title ? /* @__PURE__ */ jsx28("h3", { className: "text-sm font-semibold text-destructive", children: title }) : null,
2547
+ description ? /* @__PURE__ */ jsx28("p", { className: "mt-0.5 text-sm text-muted-foreground", children: description }) : null
2488
2548
  ] }),
2489
- /* @__PURE__ */ jsx27("div", { className: "divide-y divide-border bg-card", children })
2549
+ /* @__PURE__ */ jsx28("div", { className: "divide-y divide-border bg-card", children })
2490
2550
  ]
2491
2551
  }
2492
2552
  );
2493
2553
 
2494
2554
  // src/app/integrations/IntegrationCard.tsx
2495
2555
  import { useId as useId2 } from "react";
2496
- import { Fragment as Fragment4, jsx as jsx28, jsxs as jsxs23 } from "react/jsx-runtime";
2556
+ import { Fragment as Fragment4, jsx as jsx29, jsxs as jsxs24 } from "react/jsx-runtime";
2497
2557
  var INTEGRATION_CATALOG_CARD_HEIGHT_CLASS = "h-[12.25rem] min-h-[12.25rem] max-h-[12.25rem]";
2498
2558
  var statusLabel = {
2499
2559
  available: null,
@@ -2534,12 +2594,12 @@ var IntegrationCard = ({
2534
2594
  const titleId = useId2();
2535
2595
  const locked = status === "locked";
2536
2596
  const dimmed = status === "disabled" || locked;
2537
- const body = /* @__PURE__ */ jsxs23("div", { className: "flex h-full min-h-0 flex-col", children: [
2538
- /* @__PURE__ */ jsxs23("div", { className: "flex shrink-0 items-start gap-3 pr-2", children: [
2539
- logo ? /* @__PURE__ */ jsx28("span", { className: logoShellClass, "aria-hidden": Boolean(ariaLabel), children: logo }) : null,
2540
- /* @__PURE__ */ jsx28("div", { className: "min-w-0 flex-1 pt-0.5", children: /* @__PURE__ */ jsxs23("div", { className: "flex items-start justify-between gap-2", children: [
2541
- /* @__PURE__ */ jsxs23("div", { className: "min-w-0", children: [
2542
- /* @__PURE__ */ jsx28(
2597
+ const body = /* @__PURE__ */ jsxs24("div", { className: "flex h-full min-h-0 flex-col", children: [
2598
+ /* @__PURE__ */ jsxs24("div", { className: "flex shrink-0 items-start gap-3 pr-2", children: [
2599
+ logo ? /* @__PURE__ */ jsx29("span", { className: logoShellClass, "aria-hidden": Boolean(ariaLabel), children: logo }) : null,
2600
+ /* @__PURE__ */ jsx29("div", { className: "min-w-0 flex-1 pt-0.5", children: /* @__PURE__ */ jsxs24("div", { className: "flex items-start justify-between gap-2", children: [
2601
+ /* @__PURE__ */ jsxs24("div", { className: "min-w-0", children: [
2602
+ /* @__PURE__ */ jsx29(
2543
2603
  "h4",
2544
2604
  {
2545
2605
  id: onClick && !action ? void 0 : titleId,
@@ -2547,12 +2607,12 @@ var IntegrationCard = ({
2547
2607
  children: name
2548
2608
  }
2549
2609
  ),
2550
- statusLabel[status] ? /* @__PURE__ */ jsx28("p", { className: "mt-0.5 text-xs text-muted-foreground", children: statusLabel[status] }) : null
2610
+ statusLabel[status] ? /* @__PURE__ */ jsx29("p", { className: "mt-0.5 text-xs text-muted-foreground", children: statusLabel[status] }) : null
2551
2611
  ] }),
2552
- badge ? /* @__PURE__ */ jsx28("span", { className: "shrink-0", children: badge }) : null
2612
+ badge ? /* @__PURE__ */ jsx29("span", { className: "shrink-0", children: badge }) : null
2553
2613
  ] }) })
2554
2614
  ] }),
2555
- description ? /* @__PURE__ */ jsx28(
2615
+ description ? /* @__PURE__ */ jsx29(
2556
2616
  "p",
2557
2617
  {
2558
2618
  className: cn(
@@ -2562,9 +2622,9 @@ var IntegrationCard = ({
2562
2622
  children: description
2563
2623
  }
2564
2624
  ) : null,
2565
- action ? /* @__PURE__ */ jsxs23(Fragment4, { children: [
2566
- /* @__PURE__ */ jsx28("div", { className: "min-h-0 flex-1", "aria-hidden": true }),
2567
- /* @__PURE__ */ jsx28("div", { className: "relative mt-3 shrink-0", children: action })
2625
+ action ? /* @__PURE__ */ jsxs24(Fragment4, { children: [
2626
+ /* @__PURE__ */ jsx29("div", { className: "min-h-0 flex-1", "aria-hidden": true }),
2627
+ /* @__PURE__ */ jsx29("div", { className: "relative mt-3 shrink-0", children: action })
2568
2628
  ] }) : null
2569
2629
  ] });
2570
2630
  const shellClass3 = cn(
@@ -2574,7 +2634,7 @@ var IntegrationCard = ({
2574
2634
  className
2575
2635
  );
2576
2636
  if (onClick && !action) {
2577
- return /* @__PURE__ */ jsx28(
2637
+ return /* @__PURE__ */ jsx29(
2578
2638
  "button",
2579
2639
  {
2580
2640
  type: "button",
@@ -2591,12 +2651,12 @@ var IntegrationCard = ({
2591
2651
  }
2592
2652
  );
2593
2653
  }
2594
- return /* @__PURE__ */ jsx28("article", { className: shellClass3, "aria-labelledby": titleId, children: body });
2654
+ return /* @__PURE__ */ jsx29("article", { className: shellClass3, "aria-labelledby": titleId, children: body });
2595
2655
  };
2596
2656
 
2597
2657
  // src/app/integrations/IntegrationsEmptyState.tsx
2598
2658
  import { useId as useId3 } from "react";
2599
- import { jsx as jsx29, jsxs as jsxs24 } from "react/jsx-runtime";
2659
+ import { jsx as jsx30, jsxs as jsxs25 } from "react/jsx-runtime";
2600
2660
  var IntegrationsEmptyState = ({
2601
2661
  title = "No integrations yet",
2602
2662
  description = "Connect a provider to start syncing data and powering your workforce.",
@@ -2605,7 +2665,7 @@ var IntegrationsEmptyState = ({
2605
2665
  className
2606
2666
  }) => {
2607
2667
  const titleId = useId3();
2608
- return /* @__PURE__ */ jsxs24(
2668
+ return /* @__PURE__ */ jsxs25(
2609
2669
  "section",
2610
2670
  {
2611
2671
  className: cn(
@@ -2615,7 +2675,7 @@ var IntegrationsEmptyState = ({
2615
2675
  ),
2616
2676
  "aria-labelledby": titleId,
2617
2677
  children: [
2618
- icon ? /* @__PURE__ */ jsx29(
2678
+ icon ? /* @__PURE__ */ jsx30(
2619
2679
  "span",
2620
2680
  {
2621
2681
  className: cn(
@@ -2627,21 +2687,21 @@ var IntegrationsEmptyState = ({
2627
2687
  children: icon
2628
2688
  }
2629
2689
  ) : null,
2630
- /* @__PURE__ */ jsx29("h3", { id: titleId, className: "text-base font-normal text-foreground", children: title }),
2631
- description ? /* @__PURE__ */ jsx29("p", { className: "max-w-sm text-sm text-muted-foreground", children: description }) : null,
2632
- action ? /* @__PURE__ */ jsx29("div", { className: "mt-1", children: action }) : null
2690
+ /* @__PURE__ */ jsx30("h3", { id: titleId, className: "text-base font-normal text-foreground", children: title }),
2691
+ description ? /* @__PURE__ */ jsx30("p", { className: "max-w-sm text-sm text-muted-foreground", children: description }) : null,
2692
+ action ? /* @__PURE__ */ jsx30("div", { className: "mt-1", children: action }) : null
2633
2693
  ]
2634
2694
  }
2635
2695
  );
2636
2696
  };
2637
2697
 
2638
2698
  // src/app/integrations/PlanBadge.tsx
2639
- import { jsx as jsx30 } from "react/jsx-runtime";
2699
+ import { jsx as jsx31 } from "react/jsx-runtime";
2640
2700
  var planBadgeClass = "inline-flex h-5 max-w-full shrink-0 items-center rounded-md border border-border bg-muted/90 px-2 text-[11px] font-normal text-muted-foreground dark:border-white/10 dark:bg-white/5 dark:text-muted-foreground";
2641
- var PlanBadge = ({ children, className }) => /* @__PURE__ */ jsx30("span", { className: cn(planBadgeClass, className), children });
2701
+ var PlanBadge = ({ children, className }) => /* @__PURE__ */ jsx31("span", { className: cn(planBadgeClass, className), children });
2642
2702
 
2643
2703
  // src/app/integrations/ConnectionRow.tsx
2644
- import { Fragment as Fragment5, jsx as jsx31, jsxs as jsxs25 } from "react/jsx-runtime";
2704
+ import { Fragment as Fragment5, jsx as jsx32, jsxs as jsxs26 } from "react/jsx-runtime";
2645
2705
  var logoShellClass2 = cn(
2646
2706
  "flex size-9 shrink-0 items-center justify-center overflow-hidden rounded-lg",
2647
2707
  TIMBAL_V2_LOGO_TILE
@@ -2656,14 +2716,14 @@ var ConnectionRow = ({
2656
2716
  ariaLabel,
2657
2717
  className
2658
2718
  }) => {
2659
- const inner = /* @__PURE__ */ jsxs25(Fragment5, { children: [
2660
- logo ? /* @__PURE__ */ jsx31("span", { className: logoShellClass2, children: logo }) : null,
2661
- /* @__PURE__ */ jsxs25("div", { className: "min-w-0 flex-1", children: [
2662
- /* @__PURE__ */ jsx31("p", { className: "truncate text-sm font-normal text-foreground", children: name }),
2663
- meta ? /* @__PURE__ */ jsx31("p", { className: "truncate text-xs text-muted-foreground", children: meta }) : null
2719
+ const inner = /* @__PURE__ */ jsxs26(Fragment5, { children: [
2720
+ logo ? /* @__PURE__ */ jsx32("span", { className: logoShellClass2, children: logo }) : null,
2721
+ /* @__PURE__ */ jsxs26("div", { className: "min-w-0 flex-1", children: [
2722
+ /* @__PURE__ */ jsx32("p", { className: "truncate text-sm font-normal text-foreground", children: name }),
2723
+ meta ? /* @__PURE__ */ jsx32("p", { className: "truncate text-xs text-muted-foreground", children: meta }) : null
2664
2724
  ] }),
2665
- badge ? /* @__PURE__ */ jsx31("span", { className: "shrink-0", children: badge }) : null,
2666
- action ? /* @__PURE__ */ jsx31("span", { className: "shrink-0", children: action }) : null
2725
+ badge ? /* @__PURE__ */ jsx32("span", { className: "shrink-0", children: badge }) : null,
2726
+ action ? /* @__PURE__ */ jsx32("span", { className: "shrink-0", children: action }) : null
2667
2727
  ] });
2668
2728
  const rowClass2 = cn(
2669
2729
  "flex w-full items-center gap-3 px-4 py-3 text-left",
@@ -2671,7 +2731,7 @@ var ConnectionRow = ({
2671
2731
  className
2672
2732
  );
2673
2733
  if (onClick) {
2674
- return /* @__PURE__ */ jsx31(
2734
+ return /* @__PURE__ */ jsx32(
2675
2735
  "button",
2676
2736
  {
2677
2737
  type: "button",
@@ -2683,7 +2743,7 @@ var ConnectionRow = ({
2683
2743
  }
2684
2744
  );
2685
2745
  }
2686
- return /* @__PURE__ */ jsx31("div", { role: "listitem", className: rowClass2, children: inner });
2746
+ return /* @__PURE__ */ jsx32("div", { role: "listitem", className: rowClass2, children: inner });
2687
2747
  };
2688
2748
  var connectionRowListClass = cn(
2689
2749
  "overflow-hidden rounded-2xl",
@@ -2691,12 +2751,12 @@ var connectionRowListClass = cn(
2691
2751
  );
2692
2752
 
2693
2753
  // src/app/integrations/ConnectionRowList.tsx
2694
- import { jsx as jsx32 } from "react/jsx-runtime";
2754
+ import { jsx as jsx33 } from "react/jsx-runtime";
2695
2755
  var ConnectionRowList = ({
2696
2756
  children,
2697
2757
  "aria-label": ariaLabel = "Connected integrations",
2698
2758
  className
2699
- }) => /* @__PURE__ */ jsx32(
2759
+ }) => /* @__PURE__ */ jsx33(
2700
2760
  "div",
2701
2761
  {
2702
2762
  role: "list",
@@ -2707,7 +2767,7 @@ var ConnectionRowList = ({
2707
2767
  );
2708
2768
 
2709
2769
  // src/app/navigation/SubNav.tsx
2710
- import { jsx as jsx33 } from "react/jsx-runtime";
2770
+ import { jsx as jsx34 } from "react/jsx-runtime";
2711
2771
  var SubNav = ({
2712
2772
  items,
2713
2773
  activeId,
@@ -2716,7 +2776,7 @@ var SubNav = ({
2716
2776
  "aria-label": ariaLabel = "Section navigation",
2717
2777
  layoutId
2718
2778
  }) => {
2719
- return /* @__PURE__ */ jsx33("nav", { className: cn("aui-app-sub-nav", className), "aria-label": ariaLabel, children: /* @__PURE__ */ jsx33(
2779
+ return /* @__PURE__ */ jsx34("nav", { className: cn("aui-app-sub-nav", className), "aria-label": ariaLabel, children: /* @__PURE__ */ jsx34(
2720
2780
  PillSegmentedTabs,
2721
2781
  {
2722
2782
  value: activeId,
@@ -2730,13 +2790,13 @@ var SubNav = ({
2730
2790
  };
2731
2791
 
2732
2792
  // src/app/navigation/Breadcrumbs.tsx
2733
- import { jsx as jsx34, jsxs as jsxs26 } from "react/jsx-runtime";
2793
+ import { jsx as jsx35, jsxs as jsxs27 } from "react/jsx-runtime";
2734
2794
  var Breadcrumbs = ({ items, className }) => {
2735
- return /* @__PURE__ */ jsx34("nav", { className: cn("aui-app-breadcrumbs", appBreadcrumbsClass, className), "aria-label": "Breadcrumb", children: /* @__PURE__ */ jsx34("ol", { className: "flex flex-wrap items-center gap-1.5", children: items.map((item, index) => {
2795
+ return /* @__PURE__ */ jsx35("nav", { className: cn("aui-app-breadcrumbs", appBreadcrumbsClass, className), "aria-label": "Breadcrumb", children: /* @__PURE__ */ jsx35("ol", { className: "flex flex-wrap items-center gap-1.5", children: items.map((item, index) => {
2736
2796
  const isLast = index === items.length - 1;
2737
- return /* @__PURE__ */ jsxs26("li", { className: "inline-flex items-center gap-1.5", children: [
2738
- index > 0 ? /* @__PURE__ */ jsx34("span", { className: "text-muted-foreground/50", "aria-hidden": true, children: "/" }) : null,
2739
- isLast ? /* @__PURE__ */ jsx34("span", { className: "text-foreground", "aria-current": "page", children: item.label }) : item.href ? /* @__PURE__ */ jsx34("a", { href: item.href, className: appBreadcrumbLinkClass, children: item.label }) : /* @__PURE__ */ jsx34(
2797
+ return /* @__PURE__ */ jsxs27("li", { className: "inline-flex items-center gap-1.5", children: [
2798
+ index > 0 ? /* @__PURE__ */ jsx35("span", { className: "text-muted-foreground/50", "aria-hidden": true, children: "/" }) : null,
2799
+ isLast ? /* @__PURE__ */ jsx35("span", { className: "text-foreground", "aria-current": "page", children: item.label }) : item.href ? /* @__PURE__ */ jsx35("a", { href: item.href, className: appBreadcrumbLinkClass, children: item.label }) : /* @__PURE__ */ jsx35(
2740
2800
  "button",
2741
2801
  {
2742
2802
  type: "button",
@@ -2750,7 +2810,7 @@ var Breadcrumbs = ({ items, className }) => {
2750
2810
  };
2751
2811
 
2752
2812
  // src/app/forms/Field.tsx
2753
- import { jsx as jsx35, jsxs as jsxs27 } from "react/jsx-runtime";
2813
+ import { jsx as jsx36, jsxs as jsxs28 } from "react/jsx-runtime";
2754
2814
  var Field = ({
2755
2815
  label,
2756
2816
  hint,
@@ -2759,11 +2819,11 @@ var Field = ({
2759
2819
  className,
2760
2820
  htmlFor
2761
2821
  }) => {
2762
- return /* @__PURE__ */ jsxs27("div", { className: cn("aui-app-field", appFieldClass, className), children: [
2763
- /* @__PURE__ */ jsx35("label", { className: appFieldLabelClass, htmlFor, children: label }),
2822
+ return /* @__PURE__ */ jsxs28("div", { className: cn("aui-app-field", appFieldClass, className), children: [
2823
+ /* @__PURE__ */ jsx36("label", { className: appFieldLabelClass, htmlFor, children: label }),
2764
2824
  children,
2765
- hint && !error ? /* @__PURE__ */ jsx35("p", { className: appFieldHintClass, children: hint }) : null,
2766
- error ? /* @__PURE__ */ jsx35("p", { className: "text-xs text-destructive", role: "alert", children: error }) : null
2825
+ hint && !error ? /* @__PURE__ */ jsx36("p", { className: appFieldHintClass, children: hint }) : null,
2826
+ error ? /* @__PURE__ */ jsx36("p", { className: "text-xs text-destructive", role: "alert", children: error }) : null
2767
2827
  ] });
2768
2828
  };
2769
2829
  var FieldInput = ({
@@ -2776,7 +2836,7 @@ var FieldInput = ({
2776
2836
  ...inputProps
2777
2837
  }) => {
2778
2838
  const inputId = id ?? inputProps.name;
2779
- return /* @__PURE__ */ jsx35(
2839
+ return /* @__PURE__ */ jsx36(
2780
2840
  Field,
2781
2841
  {
2782
2842
  label,
@@ -2784,7 +2844,7 @@ var FieldInput = ({
2784
2844
  error,
2785
2845
  htmlFor: inputId,
2786
2846
  className: fieldClassName,
2787
- children: /* @__PURE__ */ jsx35(
2847
+ children: /* @__PURE__ */ jsx36(
2788
2848
  "input",
2789
2849
  {
2790
2850
  id: inputId,
@@ -2798,7 +2858,7 @@ var FieldInput = ({
2798
2858
  };
2799
2859
 
2800
2860
  // src/app/forms/FieldTextarea.tsx
2801
- import { jsx as jsx36 } from "react/jsx-runtime";
2861
+ import { jsx as jsx37 } from "react/jsx-runtime";
2802
2862
  var textareaClass = cn(
2803
2863
  appInputClass,
2804
2864
  "min-h-[5.5rem] resize-y py-2.5 leading-relaxed"
@@ -2813,7 +2873,7 @@ var FieldTextarea = ({
2813
2873
  ...props
2814
2874
  }) => {
2815
2875
  const textareaId = id ?? props.name;
2816
- return /* @__PURE__ */ jsx36(
2876
+ return /* @__PURE__ */ jsx37(
2817
2877
  Field,
2818
2878
  {
2819
2879
  label,
@@ -2821,7 +2881,7 @@ var FieldTextarea = ({
2821
2881
  error,
2822
2882
  htmlFor: textareaId,
2823
2883
  className: fieldClassName,
2824
- children: /* @__PURE__ */ jsx36(
2884
+ children: /* @__PURE__ */ jsx37(
2825
2885
  "textarea",
2826
2886
  {
2827
2887
  id: textareaId,
@@ -2836,7 +2896,7 @@ var FieldTextarea = ({
2836
2896
 
2837
2897
  // src/app/forms/FieldSelect.tsx
2838
2898
  import { ChevronDownIcon } from "lucide-react";
2839
- import { jsx as jsx37, jsxs as jsxs28 } from "react/jsx-runtime";
2899
+ import { jsx as jsx38, jsxs as jsxs29 } from "react/jsx-runtime";
2840
2900
  var selectWrapClass = "relative";
2841
2901
  var selectClass = cn(
2842
2902
  appInputClass,
@@ -2853,7 +2913,7 @@ var FieldSelect = ({
2853
2913
  ...props
2854
2914
  }) => {
2855
2915
  const selectId = id ?? props.name;
2856
- return /* @__PURE__ */ jsx37(
2916
+ return /* @__PURE__ */ jsx38(
2857
2917
  Field,
2858
2918
  {
2859
2919
  label,
@@ -2861,8 +2921,8 @@ var FieldSelect = ({
2861
2921
  error,
2862
2922
  htmlFor: selectId,
2863
2923
  className: fieldClassName,
2864
- children: /* @__PURE__ */ jsxs28("div", { className: selectWrapClass, children: [
2865
- /* @__PURE__ */ jsx37(
2924
+ children: /* @__PURE__ */ jsxs29("div", { className: selectWrapClass, children: [
2925
+ /* @__PURE__ */ jsx38(
2866
2926
  "select",
2867
2927
  {
2868
2928
  id: selectId,
@@ -2872,7 +2932,7 @@ var FieldSelect = ({
2872
2932
  children
2873
2933
  }
2874
2934
  ),
2875
- /* @__PURE__ */ jsx37(
2935
+ /* @__PURE__ */ jsx38(
2876
2936
  ChevronDownIcon,
2877
2937
  {
2878
2938
  className: "pointer-events-none absolute top-1/2 right-3 size-4 -translate-y-1/2 text-muted-foreground",
@@ -2885,7 +2945,7 @@ var FieldSelect = ({
2885
2945
  };
2886
2946
 
2887
2947
  // src/app/forms/FieldSwitch.tsx
2888
- import { jsx as jsx38, jsxs as jsxs29 } from "react/jsx-runtime";
2948
+ import { jsx as jsx39, jsxs as jsxs30 } from "react/jsx-runtime";
2889
2949
  var trackClass = cn(
2890
2950
  "relative inline-flex h-5 w-9 shrink-0 items-center rounded-full transition-[background,box-shadow,border-color] duration-200",
2891
2951
  "peer-focus-visible:ring-2 peer-focus-visible:ring-foreground/10",
@@ -2906,7 +2966,7 @@ var FieldSwitch = ({
2906
2966
  ...props
2907
2967
  }) => {
2908
2968
  const inputId = id ?? props.name ?? "switch";
2909
- return /* @__PURE__ */ jsxs29(
2969
+ return /* @__PURE__ */ jsxs30(
2910
2970
  "label",
2911
2971
  {
2912
2972
  className: cn(
@@ -2915,8 +2975,8 @@ var FieldSwitch = ({
2915
2975
  ),
2916
2976
  htmlFor: inputId,
2917
2977
  children: [
2918
- /* @__PURE__ */ jsxs29("span", { className: "relative mt-0.5", children: [
2919
- /* @__PURE__ */ jsx38(
2978
+ /* @__PURE__ */ jsxs30("span", { className: "relative mt-0.5", children: [
2979
+ /* @__PURE__ */ jsx39(
2920
2980
  "input",
2921
2981
  {
2922
2982
  id: inputId,
@@ -2926,11 +2986,11 @@ var FieldSwitch = ({
2926
2986
  ...props
2927
2987
  }
2928
2988
  ),
2929
- /* @__PURE__ */ jsx38("span", { className: trackClass, "aria-hidden": true, children: /* @__PURE__ */ jsx38("span", { className: thumbClass }) })
2989
+ /* @__PURE__ */ jsx39("span", { className: trackClass, "aria-hidden": true, children: /* @__PURE__ */ jsx39("span", { className: thumbClass }) })
2930
2990
  ] }),
2931
- /* @__PURE__ */ jsxs29("span", { className: "flex min-w-0 flex-col gap-0.5", children: [
2932
- /* @__PURE__ */ jsx38("span", { className: "text-sm font-medium text-foreground", children: label }),
2933
- description ? /* @__PURE__ */ jsx38("span", { className: "text-xs text-muted-foreground", children: description }) : null
2991
+ /* @__PURE__ */ jsxs30("span", { className: "flex min-w-0 flex-col gap-0.5", children: [
2992
+ /* @__PURE__ */ jsx39("span", { className: "text-sm font-medium text-foreground", children: label }),
2993
+ description ? /* @__PURE__ */ jsx39("span", { className: "text-xs text-muted-foreground", children: description }) : null
2934
2994
  ] })
2935
2995
  ]
2936
2996
  }
@@ -2939,13 +2999,13 @@ var FieldSwitch = ({
2939
2999
 
2940
3000
  // src/app/forms/SearchInput.tsx
2941
3001
  import { SearchIcon } from "lucide-react";
2942
- import { jsx as jsx39, jsxs as jsxs30 } from "react/jsx-runtime";
3002
+ import { jsx as jsx40, jsxs as jsxs31 } from "react/jsx-runtime";
2943
3003
  var SearchInput = ({
2944
3004
  className,
2945
3005
  placeholder = "Search\u2026",
2946
3006
  ...props
2947
3007
  }) => {
2948
- return /* @__PURE__ */ jsxs30(
3008
+ return /* @__PURE__ */ jsxs31(
2949
3009
  "label",
2950
3010
  {
2951
3011
  className: cn(
@@ -2954,8 +3014,8 @@ var SearchInput = ({
2954
3014
  className
2955
3015
  ),
2956
3016
  children: [
2957
- /* @__PURE__ */ jsx39(SearchIcon, { className: "size-4 shrink-0 text-muted-foreground", "aria-hidden": true }),
2958
- /* @__PURE__ */ jsx39(
3017
+ /* @__PURE__ */ jsx40(SearchIcon, { className: "size-4 shrink-0 text-muted-foreground", "aria-hidden": true }),
3018
+ /* @__PURE__ */ jsx40(
2959
3019
  "input",
2960
3020
  {
2961
3021
  type: "search",
@@ -2970,18 +3030,26 @@ var SearchInput = ({
2970
3030
  };
2971
3031
 
2972
3032
  // src/app/forms/FormSection.tsx
2973
- import { jsx as jsx40, jsxs as jsxs31 } from "react/jsx-runtime";
3033
+ import { jsx as jsx41, jsxs as jsxs32 } from "react/jsx-runtime";
2974
3034
  var FormSection = ({ title, children, className }) => {
2975
- return /* @__PURE__ */ jsxs31("fieldset", { className: cn("aui-app-form-section", appSectionClass, "border-0 p-0", className), children: [
2976
- title ? /* @__PURE__ */ jsx40("legend", { className: cn(appSectionTitleClass, "mb-3 px-0"), children: title }) : null,
2977
- /* @__PURE__ */ jsx40("div", { className: "flex flex-col gap-4", children })
2978
- ] });
3035
+ const density = useAppDensity();
3036
+ const sectionClass = useAppDensityClass("section");
3037
+ return /* @__PURE__ */ jsxs32(
3038
+ "fieldset",
3039
+ {
3040
+ className: cn("aui-app-form-section", sectionClass, "border-0 p-0", className),
3041
+ children: [
3042
+ title ? /* @__PURE__ */ jsx41("legend", { className: cn(appSectionTitleClass, "mb-3 px-0"), children: title }) : null,
3043
+ /* @__PURE__ */ jsx41("div", { className: cn("flex flex-col", density === "compact" ? "gap-2" : "gap-4"), children })
3044
+ ]
3045
+ }
3046
+ );
2979
3047
  };
2980
3048
 
2981
3049
  // src/app/data/FilterBar.tsx
2982
- import { jsx as jsx41 } from "react/jsx-runtime";
3050
+ import { jsx as jsx42 } from "react/jsx-runtime";
2983
3051
  var FilterBar = ({ children, className }) => {
2984
- return /* @__PURE__ */ jsx41(
3052
+ return /* @__PURE__ */ jsx42(
2985
3053
  "div",
2986
3054
  {
2987
3055
  className: cn("aui-app-filter-bar", appFilterBarClass, className),
@@ -2993,14 +3061,14 @@ var FilterBar = ({ children, className }) => {
2993
3061
  };
2994
3062
 
2995
3063
  // src/app/data/FilterField.tsx
2996
- import { jsx as jsx42, jsxs as jsxs32 } from "react/jsx-runtime";
3064
+ import { jsx as jsx43, jsxs as jsxs33 } from "react/jsx-runtime";
2997
3065
  var FilterField = ({
2998
3066
  label,
2999
3067
  children,
3000
3068
  className
3001
3069
  }) => {
3002
- return /* @__PURE__ */ jsxs32("div", { className: cn("aui-app-filter-field", appFieldClass, className), children: [
3003
- label ? /* @__PURE__ */ jsx42("span", { className: appFieldLabelClass, children: label }) : null,
3070
+ return /* @__PURE__ */ jsxs33("div", { className: cn("aui-app-filter-field", appFieldClass, className), children: [
3071
+ label ? /* @__PURE__ */ jsx43("span", { className: appFieldLabelClass, children: label }) : null,
3004
3072
  children
3005
3073
  ] });
3006
3074
  };
@@ -3014,19 +3082,20 @@ import {
3014
3082
  ChevronLeftIcon,
3015
3083
  ChevronRightIcon
3016
3084
  } from "lucide-react";
3017
- import { jsx as jsx43, jsxs as jsxs33 } from "react/jsx-runtime";
3018
- var shellClass2 = "overflow-hidden rounded-xl border border-border bg-card shadow-card";
3085
+ import { jsx as jsx44, jsxs as jsxs34 } from "react/jsx-runtime";
3086
+ var shellClass2 = "overflow-hidden rounded-xl border border-border bg-gradient-to-b from-elevated-from to-elevated-to shadow-card";
3019
3087
  var tableClass = "w-full border-collapse bg-transparent text-sm";
3020
- var headCellClass = "border-b border-border/60 bg-transparent px-4 py-2.5 text-left text-xs font-medium uppercase tracking-wide text-muted-foreground";
3088
+ var headRowClass = "bg-muted/40";
3089
+ var headCellClass = "border-b border-border/70 px-4 py-2.5 text-left text-[11px] font-semibold uppercase tracking-[0.04em] text-muted-foreground/90";
3021
3090
  var bodyCellClass = "border-b border-border/40 bg-transparent px-4 py-2.5 text-foreground";
3022
- var rowClass = "bg-transparent transition-colors hover:bg-foreground/[0.03] data-[clickable=true]:cursor-pointer data-[selected=true]:bg-primary/[0.04]";
3023
- var footCellClass = "border-t border-border/60 bg-transparent px-4 py-2.5 text-xs text-muted-foreground";
3091
+ var rowClass = "bg-transparent transition-colors hover:bg-muted/40 data-[clickable=true]:cursor-pointer data-[selected=true]:bg-primary/[0.06]";
3092
+ var footCellClass = "border-t border-border/60 bg-muted/20 px-4 py-2.5 text-xs text-muted-foreground";
3024
3093
  var footInnerClass = "flex flex-wrap items-center gap-2";
3025
3094
  var emptyCellClass = "bg-transparent px-4 py-10 text-center text-sm text-muted-foreground";
3026
- var sortButtonClass = "group inline-flex min-w-0 items-center gap-1.5 rounded-md -mx-1 px-1 py-0.5 text-left font-medium text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-foreground/10";
3027
- var stickyHeadClass = "sticky top-0 z-[1] bg-card/95 shadow-[0_1px_0_0_hsl(var(--border)/0.5)] backdrop-blur-sm [&_th]:bg-card/95";
3095
+ var sortButtonClass = "group inline-flex min-w-0 items-center gap-1.5 rounded-md -mx-1 px-1 py-0.5 text-left font-semibold text-muted-foreground/90 transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-foreground/10";
3096
+ var stickyHeadClass = "sticky top-0 z-[1] bg-muted/95 shadow-[0_1px_0_0_hsl(var(--border)/0.6)] backdrop-blur-sm";
3028
3097
  var selectCellClass = "w-10 px-4 py-2.5 align-middle";
3029
- var pagerButtonClass = "inline-flex size-7 items-center justify-center rounded-md border border-border bg-transparent text-muted-foreground transition-colors hover:bg-foreground/[0.04] hover:text-foreground disabled:pointer-events-none disabled:opacity-40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-foreground/10";
3098
+ var pagerButtonClass = "inline-flex size-7 items-center justify-center rounded-md border border-border bg-gradient-to-b from-elevated-from to-elevated-to text-muted-foreground shadow-card transition-colors hover:from-secondary-fill-hover-from hover:to-secondary-fill-hover-to hover:text-foreground disabled:pointer-events-none disabled:opacity-40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-foreground/10";
3030
3099
  var alignClass = {
3031
3100
  left: "text-left",
3032
3101
  center: "text-center",
@@ -3056,12 +3125,12 @@ function SortIndicator({
3056
3125
  }) {
3057
3126
  const iconClass = "size-3.5 shrink-0 opacity-60 group-hover:opacity-100";
3058
3127
  if (!active) {
3059
- return /* @__PURE__ */ jsx43(ArrowUpDownIcon, { className: iconClass, "aria-hidden": true });
3128
+ return /* @__PURE__ */ jsx44(ArrowUpDownIcon, { className: iconClass, "aria-hidden": true });
3060
3129
  }
3061
3130
  if (direction === "desc") {
3062
- return /* @__PURE__ */ jsx43(ArrowDownIcon, { className: iconClass, "aria-hidden": true });
3131
+ return /* @__PURE__ */ jsx44(ArrowDownIcon, { className: iconClass, "aria-hidden": true });
3063
3132
  }
3064
- return /* @__PURE__ */ jsx43(ArrowUpIcon, { className: iconClass, "aria-hidden": true });
3133
+ return /* @__PURE__ */ jsx44(ArrowUpIcon, { className: iconClass, "aria-hidden": true });
3065
3134
  }
3066
3135
  function DataTable({
3067
3136
  columns,
@@ -3159,7 +3228,7 @@ function DataTable({
3159
3228
  const headPad = dense ? "px-3 py-2" : void 0;
3160
3229
  const colSpan = columns.length + (selectable ? 1 : 0);
3161
3230
  if (!loading && rows.length === 0 && emptyMode === "replace") {
3162
- return /* @__PURE__ */ jsx43(EmptyState, { title: emptyTitle, description: emptyDescription, className });
3231
+ return /* @__PURE__ */ jsx44(EmptyState, { title: emptyTitle, description: emptyDescription, className });
3163
3232
  }
3164
3233
  const allKeys = sortedRows.map(getRowKey);
3165
3234
  const allSelected = allKeys.length > 0 && allKeys.every((k) => selectedSet.has(k));
@@ -3184,10 +3253,10 @@ function DataTable({
3184
3253
  const hasPager = paginated && !loading && sortedRows.length > 0;
3185
3254
  const hasFoot = (showRowCount || footer || hasPager) && (loading || sortedRows.length > 0);
3186
3255
  const skeletonCount = loadingRows ?? pageSize ?? 5;
3187
- return /* @__PURE__ */ jsx43("div", { className: cn("aui-app-data-table", shellClass2, className), children: /* @__PURE__ */ jsx43("div", { className: "overflow-x-auto", children: /* @__PURE__ */ jsxs33("table", { className: tableClass, children: [
3188
- caption ? /* @__PURE__ */ jsx43("caption", { className: "sr-only", children: caption }) : null,
3189
- /* @__PURE__ */ jsx43("thead", { className: cn(stickyHeader && stickyHeadClass), children: /* @__PURE__ */ jsxs33("tr", { children: [
3190
- selectable ? /* @__PURE__ */ jsx43("th", { scope: "col", className: cn(selectCellClass, headPad), children: /* @__PURE__ */ jsx43(
3256
+ return /* @__PURE__ */ jsx44("div", { className: cn("aui-app-data-table", shellClass2, className), children: /* @__PURE__ */ jsx44("div", { className: "overflow-x-auto", children: /* @__PURE__ */ jsxs34("table", { className: tableClass, children: [
3257
+ caption ? /* @__PURE__ */ jsx44("caption", { className: "sr-only", children: caption }) : null,
3258
+ /* @__PURE__ */ jsx44("thead", { className: cn(headRowClass, stickyHeader && stickyHeadClass), children: /* @__PURE__ */ jsxs34("tr", { children: [
3259
+ selectable ? /* @__PURE__ */ jsx44("th", { scope: "col", className: cn(selectCellClass, headPad), children: /* @__PURE__ */ jsx44(
3191
3260
  Checkbox,
3192
3261
  {
3193
3262
  checked: headerCheckedState,
@@ -3199,19 +3268,19 @@ function DataTable({
3199
3268
  columns.map((col) => {
3200
3269
  const isSorted = sort?.columnId === col.id;
3201
3270
  const ariaSort = col.sortable ? isSorted ? sort.direction === "asc" ? "ascending" : "descending" : "none" : void 0;
3202
- const headerContent = col.sortable ? /* @__PURE__ */ jsxs33(
3271
+ const headerContent = col.sortable ? /* @__PURE__ */ jsxs34(
3203
3272
  "button",
3204
3273
  {
3205
3274
  type: "button",
3206
3275
  className: sortButtonClass,
3207
3276
  onClick: () => setSort(nextSort(sort, col.id)),
3208
3277
  children: [
3209
- /* @__PURE__ */ jsx43("span", { className: "truncate", children: col.header }),
3210
- /* @__PURE__ */ jsx43(SortIndicator, { active: Boolean(isSorted), direction: sort?.direction })
3278
+ /* @__PURE__ */ jsx44("span", { className: "truncate", children: col.header }),
3279
+ /* @__PURE__ */ jsx44(SortIndicator, { active: Boolean(isSorted), direction: sort?.direction })
3211
3280
  ]
3212
3281
  }
3213
3282
  ) : col.header;
3214
- return /* @__PURE__ */ jsx43(
3283
+ return /* @__PURE__ */ jsx44(
3215
3284
  "th",
3216
3285
  {
3217
3286
  scope: "col",
@@ -3228,9 +3297,9 @@ function DataTable({
3228
3297
  );
3229
3298
  })
3230
3299
  ] }) }),
3231
- /* @__PURE__ */ jsx43("tbody", { className: cn(!hasFoot && "[&_tr:last-child_td]:border-b-0"), children: loading ? Array.from({ length: skeletonCount }).map((_, rowIdx) => /* @__PURE__ */ jsxs33("tr", { className: rowClass, "aria-hidden": true, children: [
3232
- selectable ? /* @__PURE__ */ jsx43("td", { className: cn(selectCellClass, cellPad), children: /* @__PURE__ */ jsx43(Skeleton, { className: "size-4 rounded-[4px]" }) }) : null,
3233
- columns.map((col) => /* @__PURE__ */ jsx43(
3300
+ /* @__PURE__ */ jsx44("tbody", { className: cn(!hasFoot && "[&_tr:last-child_td]:border-b-0"), children: loading ? Array.from({ length: skeletonCount }).map((_, rowIdx) => /* @__PURE__ */ jsxs34("tr", { className: rowClass, "aria-hidden": true, children: [
3301
+ selectable ? /* @__PURE__ */ jsx44("td", { className: cn(selectCellClass, cellPad), children: /* @__PURE__ */ jsx44(Skeleton, { className: "size-4 rounded-[4px]" }) }) : null,
3302
+ columns.map((col) => /* @__PURE__ */ jsx44(
3234
3303
  "td",
3235
3304
  {
3236
3305
  className: cn(
@@ -3239,17 +3308,17 @@ function DataTable({
3239
3308
  col.align && alignClass[col.align],
3240
3309
  col.className
3241
3310
  ),
3242
- children: /* @__PURE__ */ jsx43(Skeleton, { className: "h-4 w-[60%]" })
3311
+ children: /* @__PURE__ */ jsx44(Skeleton, { className: "h-4 w-[60%]" })
3243
3312
  },
3244
3313
  col.id
3245
3314
  ))
3246
- ] }, `skeleton-${rowIdx}`)) : visibleRows.length === 0 ? /* @__PURE__ */ jsx43("tr", { children: /* @__PURE__ */ jsx43("td", { colSpan, className: emptyCellClass, children: /* @__PURE__ */ jsxs33("div", { className: "flex flex-col items-center gap-1", children: [
3247
- /* @__PURE__ */ jsx43("p", { className: "font-medium text-foreground", children: emptyTitle }),
3248
- emptyDescription ? /* @__PURE__ */ jsx43("p", { className: "max-w-sm text-muted-foreground", children: emptyDescription }) : null
3315
+ ] }, `skeleton-${rowIdx}`)) : visibleRows.length === 0 ? /* @__PURE__ */ jsx44("tr", { children: /* @__PURE__ */ jsx44("td", { colSpan, className: emptyCellClass, children: /* @__PURE__ */ jsxs34("div", { className: "flex flex-col items-center gap-1", children: [
3316
+ /* @__PURE__ */ jsx44("p", { className: "font-medium text-foreground", children: emptyTitle }),
3317
+ emptyDescription ? /* @__PURE__ */ jsx44("p", { className: "max-w-sm text-muted-foreground", children: emptyDescription }) : null
3249
3318
  ] }) }) }) : visibleRows.map((row) => {
3250
3319
  const key = getRowKey(row);
3251
3320
  const isSelected = selectedSet.has(key);
3252
- return /* @__PURE__ */ jsxs33(
3321
+ return /* @__PURE__ */ jsxs34(
3253
3322
  "tr",
3254
3323
  {
3255
3324
  className: rowClass,
@@ -3265,12 +3334,12 @@ function DataTable({
3265
3334
  tabIndex: onRowClick ? 0 : void 0,
3266
3335
  role: onRowClick ? "button" : void 0,
3267
3336
  children: [
3268
- selectable ? /* @__PURE__ */ jsx43(
3337
+ selectable ? /* @__PURE__ */ jsx44(
3269
3338
  "td",
3270
3339
  {
3271
3340
  className: cn(selectCellClass, cellPad),
3272
3341
  onClick: (event) => event.stopPropagation(),
3273
- children: /* @__PURE__ */ jsx43(
3342
+ children: /* @__PURE__ */ jsx44(
3274
3343
  Checkbox,
3275
3344
  {
3276
3345
  checked: isSelected,
@@ -3280,7 +3349,7 @@ function DataTable({
3280
3349
  )
3281
3350
  }
3282
3351
  ) : null,
3283
- columns.map((col) => /* @__PURE__ */ jsx43(
3352
+ columns.map((col) => /* @__PURE__ */ jsx44(
3284
3353
  "td",
3285
3354
  {
3286
3355
  className: cn(
@@ -3290,7 +3359,7 @@ function DataTable({
3290
3359
  col.align && alignClass[col.align],
3291
3360
  col.className
3292
3361
  ),
3293
- children: col.truncate ? /* @__PURE__ */ jsx43("div", { className: "truncate", children: col.cell(row) }) : col.cell(row)
3362
+ children: col.truncate ? /* @__PURE__ */ jsx44("div", { className: "truncate", children: col.cell(row) }) : col.cell(row)
3294
3363
  },
3295
3364
  col.id
3296
3365
  ))
@@ -3299,7 +3368,7 @@ function DataTable({
3299
3368
  key
3300
3369
  );
3301
3370
  }) }),
3302
- hasFoot ? /* @__PURE__ */ jsx43("tfoot", { children: /* @__PURE__ */ jsx43("tr", { children: /* @__PURE__ */ jsx43("td", { colSpan, className: footCellClass, children: /* @__PURE__ */ jsxs33(
3371
+ hasFoot ? /* @__PURE__ */ jsx44("tfoot", { children: /* @__PURE__ */ jsx44("tr", { children: /* @__PURE__ */ jsx44("td", { colSpan, className: footCellClass, children: /* @__PURE__ */ jsxs34(
3303
3372
  "div",
3304
3373
  {
3305
3374
  className: cn(
@@ -3307,18 +3376,18 @@ function DataTable({
3307
3376
  (showRowCount || footer || hasPager) && "justify-between"
3308
3377
  ),
3309
3378
  children: [
3310
- /* @__PURE__ */ jsxs33("div", { className: footInnerClass, children: [
3311
- showRowCount ? /* @__PURE__ */ jsxs33("span", { children: [
3379
+ /* @__PURE__ */ jsxs34("div", { className: footInnerClass, children: [
3380
+ showRowCount ? /* @__PURE__ */ jsxs34("span", { children: [
3312
3381
  rowCountText,
3313
3382
  selectable && selectedSet.size > 0 ? ` \xB7 ${selectedSet.size} selected` : null
3314
- ] }) : selectable && selectedSet.size > 0 ? /* @__PURE__ */ jsxs33("span", { children: [
3383
+ ] }) : selectable && selectedSet.size > 0 ? /* @__PURE__ */ jsxs34("span", { children: [
3315
3384
  selectedSet.size,
3316
3385
  " selected"
3317
3386
  ] }) : null,
3318
3387
  footer
3319
3388
  ] }),
3320
- hasPager ? /* @__PURE__ */ jsxs33("div", { className: "flex items-center gap-2", children: [
3321
- /* @__PURE__ */ jsxs33("span", { className: "tabular-nums", children: [
3389
+ hasPager ? /* @__PURE__ */ jsxs34("div", { className: "flex items-center gap-2", children: [
3390
+ /* @__PURE__ */ jsxs34("span", { className: "tabular-nums", children: [
3322
3391
  pageIndex * pageSize + 1,
3323
3392
  "\u2013",
3324
3393
  Math.min(
@@ -3329,8 +3398,8 @@ function DataTable({
3329
3398
  "of ",
3330
3399
  sortedRows.length
3331
3400
  ] }),
3332
- /* @__PURE__ */ jsxs33("div", { className: "flex items-center gap-1", children: [
3333
- /* @__PURE__ */ jsx43(
3401
+ /* @__PURE__ */ jsxs34("div", { className: "flex items-center gap-1", children: [
3402
+ /* @__PURE__ */ jsx44(
3334
3403
  "button",
3335
3404
  {
3336
3405
  type: "button",
@@ -3338,10 +3407,10 @@ function DataTable({
3338
3407
  onClick: () => setPage(pageIndex - 1),
3339
3408
  disabled: pageIndex <= 0,
3340
3409
  "aria-label": "Previous page",
3341
- children: /* @__PURE__ */ jsx43(ChevronLeftIcon, { className: "size-4", "aria-hidden": true })
3410
+ children: /* @__PURE__ */ jsx44(ChevronLeftIcon, { className: "size-4", "aria-hidden": true })
3342
3411
  }
3343
3412
  ),
3344
- /* @__PURE__ */ jsx43(
3413
+ /* @__PURE__ */ jsx44(
3345
3414
  "button",
3346
3415
  {
3347
3416
  type: "button",
@@ -3349,7 +3418,7 @@ function DataTable({
3349
3418
  onClick: () => setPage(pageIndex + 1),
3350
3419
  disabled: pageIndex >= pageCount - 1,
3351
3420
  "aria-label": "Next page",
3352
- children: /* @__PURE__ */ jsx43(ChevronRightIcon, { className: "size-4", "aria-hidden": true })
3421
+ children: /* @__PURE__ */ jsx44(ChevronRightIcon, { className: "size-4", "aria-hidden": true })
3353
3422
  }
3354
3423
  )
3355
3424
  ] })
@@ -3362,28 +3431,32 @@ function DataTable({
3362
3431
 
3363
3432
  // src/app/data/ChartPanel.tsx
3364
3433
  import { useId as useId4 } from "react";
3365
- import { jsx as jsx44, jsxs as jsxs34 } from "react/jsx-runtime";
3434
+ import { jsx as jsx45, jsxs as jsxs35 } from "react/jsx-runtime";
3366
3435
  var ChartPanel = ({
3367
3436
  title,
3368
3437
  description,
3369
3438
  artifact,
3370
3439
  children,
3371
3440
  actions,
3372
- height = 300,
3441
+ height: heightProp,
3373
3442
  loading = false,
3374
3443
  className
3375
3444
  }) => {
3445
+ const density = useAppDensity();
3446
+ const height = heightProp ?? APP_DENSITY_CHART_HEIGHT[density];
3447
+ const metricChartPlotRegionClass = useAppDensityClass("metricChartPlotRegion");
3448
+ const chartPanelBodyClass = useAppDensityClass("chartPanelBody");
3376
3449
  const titleId = useId4();
3377
3450
  const resolvedTitle = title ?? artifact?.title;
3378
3451
  const hasHeader = Boolean(resolvedTitle || description || actions);
3379
- const body = loading ? /* @__PURE__ */ jsx44(Skeleton, { className: "w-full rounded-lg", style: { height }, "aria-hidden": true }) : children ?? (artifact ? /* @__PURE__ */ jsx44(ChartArtifactView, { artifact, embedded: true, height }) : null);
3380
- return /* @__PURE__ */ jsxs34(
3452
+ const body = loading ? /* @__PURE__ */ jsx45(Skeleton, { className: "w-full rounded-lg", style: { height }, "aria-hidden": true }) : children ?? (artifact ? /* @__PURE__ */ jsx45(ChartArtifactView, { artifact, embedded: true, height }) : null);
3453
+ return /* @__PURE__ */ jsxs35(
3381
3454
  "section",
3382
3455
  {
3383
3456
  className: cn(metricCardShellClass, "aui-app-chart-panel", className),
3384
3457
  "aria-labelledby": resolvedTitle ? titleId : void 0,
3385
3458
  children: [
3386
- /* @__PURE__ */ jsx44(
3459
+ /* @__PURE__ */ jsx45(
3387
3460
  MetricCardHeader,
3388
3461
  {
3389
3462
  title: resolvedTitle,
@@ -3392,14 +3465,14 @@ var ChartPanel = ({
3392
3465
  actions
3393
3466
  }
3394
3467
  ),
3395
- /* @__PURE__ */ jsx44(
3468
+ /* @__PURE__ */ jsx45(
3396
3469
  "div",
3397
3470
  {
3398
3471
  className: cn(
3399
3472
  "relative min-h-0 w-full",
3400
- hasHeader ? metricChartPlotRegionClass : "pt-2 pb-3"
3473
+ hasHeader ? metricChartPlotRegionClass : chartPanelBodyClass
3401
3474
  ),
3402
- children: body ?? /* @__PURE__ */ jsx44(
3475
+ children: body ?? /* @__PURE__ */ jsx45(
3403
3476
  "div",
3404
3477
  {
3405
3478
  className: "flex items-center justify-center text-sm font-normal text-muted-foreground",
@@ -3417,7 +3490,7 @@ var ChartPanel = ({
3417
3490
 
3418
3491
  // src/app/data/MetricRow.tsx
3419
3492
  import { useId as useId5, useState as useState5 } from "react";
3420
- import { jsx as jsx45, jsxs as jsxs35 } from "react/jsx-runtime";
3493
+ import { jsx as jsx46, jsxs as jsxs36 } from "react/jsx-runtime";
3421
3494
  var MetricRow = ({
3422
3495
  title,
3423
3496
  description,
@@ -3430,6 +3503,7 @@ var MetricRow = ({
3430
3503
  loading = false,
3431
3504
  className
3432
3505
  }) => {
3506
+ const metricTileClass = useAppDensityClass("metricTile");
3433
3507
  const titleId = useId5();
3434
3508
  const selectable = onMetricChange != null || activeMetricId != null;
3435
3509
  const [internalId, setInternalId] = useState5(
@@ -3440,13 +3514,13 @@ var MetricRow = ({
3440
3514
  if (activeMetricId == null) setInternalId(id);
3441
3515
  onMetricChange?.(id);
3442
3516
  };
3443
- return /* @__PURE__ */ jsxs35(
3517
+ return /* @__PURE__ */ jsxs36(
3444
3518
  "section",
3445
3519
  {
3446
3520
  className: cn(metricCardShellClass, className),
3447
3521
  "aria-labelledby": title ? titleId : void 0,
3448
3522
  children: [
3449
- /* @__PURE__ */ jsx45(
3523
+ /* @__PURE__ */ jsx46(
3450
3524
  MetricCardHeader,
3451
3525
  {
3452
3526
  title,
@@ -3455,7 +3529,7 @@ var MetricRow = ({
3455
3529
  actions
3456
3530
  }
3457
3531
  ),
3458
- /* @__PURE__ */ jsx45(
3532
+ /* @__PURE__ */ jsx46(
3459
3533
  "div",
3460
3534
  {
3461
3535
  role: selectable ? "group" : void 0,
@@ -3466,18 +3540,18 @@ var MetricRow = ({
3466
3540
  metricTilesGridColsClass(loading ? metrics.length || 4 : metrics.length),
3467
3541
  (title || description || actions) && "mt-3"
3468
3542
  ),
3469
- children: loading ? Array.from({ length: metrics.length || 4 }).map((_, index) => /* @__PURE__ */ jsxs35(
3543
+ children: loading ? Array.from({ length: metrics.length || 4 }).map((_, index) => /* @__PURE__ */ jsxs36(
3470
3544
  "div",
3471
3545
  {
3472
- className: "flex min-w-0 flex-1 flex-col gap-2 px-4 py-3",
3546
+ className: cn("flex min-w-0 flex-1 flex-col gap-2", metricTileClass),
3473
3547
  "aria-hidden": true,
3474
3548
  children: [
3475
- /* @__PURE__ */ jsx45(Skeleton, { className: "h-3 w-20" }),
3476
- /* @__PURE__ */ jsx45(Skeleton, { className: "h-7 w-24" })
3549
+ /* @__PURE__ */ jsx46(Skeleton, { className: "h-3 w-20" }),
3550
+ /* @__PURE__ */ jsx46(Skeleton, { className: "h-7 w-24" })
3477
3551
  ]
3478
3552
  },
3479
3553
  `skeleton-${index}`
3480
- )) : metrics.map((m, index) => /* @__PURE__ */ jsx45(
3554
+ )) : metrics.map((m, index) => /* @__PURE__ */ jsx46(
3481
3555
  MetricTile,
3482
3556
  {
3483
3557
  label: m.label,
@@ -3500,7 +3574,7 @@ var MetricRow = ({
3500
3574
 
3501
3575
  // src/app/data/MetricChartCard.tsx
3502
3576
  import { useId as useId6, useState as useState6 } from "react";
3503
- import { jsx as jsx46, jsxs as jsxs36 } from "react/jsx-runtime";
3577
+ import { jsx as jsx47, jsxs as jsxs37 } from "react/jsx-runtime";
3504
3578
  var MetricChartCard = ({
3505
3579
  title,
3506
3580
  description,
@@ -3511,7 +3585,7 @@ var MetricChartCard = ({
3511
3585
  onMetricChange,
3512
3586
  xKey = "date",
3513
3587
  variant = "area",
3514
- height = 300,
3588
+ height: heightProp,
3515
3589
  formatX,
3516
3590
  formatValue,
3517
3591
  emptyLabel = "No data yet",
@@ -3519,6 +3593,10 @@ var MetricChartCard = ({
3519
3593
  loading = false,
3520
3594
  className
3521
3595
  }) => {
3596
+ const density = useAppDensity();
3597
+ const height = heightProp ?? APP_DENSITY_CHART_HEIGHT[density];
3598
+ const metricChartRegionClass = useAppDensityClass("metricChartRegion");
3599
+ const metricTileClass = useAppDensityClass("metricTile");
3522
3600
  const titleId = useId6();
3523
3601
  const [internalId, setInternalId] = useState6(
3524
3602
  defaultActiveMetricId ?? metrics[0]?.id
@@ -3531,13 +3609,13 @@ var MetricChartCard = ({
3531
3609
  };
3532
3610
  const hasHeader = Boolean(title || description || actions);
3533
3611
  const chartAriaLabel = typeof active?.label === "string" ? `${active.label} over time` : "Metric chart";
3534
- return /* @__PURE__ */ jsxs36(
3612
+ return /* @__PURE__ */ jsxs37(
3535
3613
  "section",
3536
3614
  {
3537
3615
  className: cn(metricCardShellClass, className),
3538
3616
  "aria-labelledby": title ? titleId : void 0,
3539
3617
  children: [
3540
- /* @__PURE__ */ jsx46(
3618
+ /* @__PURE__ */ jsx47(
3541
3619
  MetricCardHeader,
3542
3620
  {
3543
3621
  title,
@@ -3546,7 +3624,7 @@ var MetricChartCard = ({
3546
3624
  actions
3547
3625
  }
3548
3626
  ),
3549
- /* @__PURE__ */ jsx46(
3627
+ /* @__PURE__ */ jsx47(
3550
3628
  "div",
3551
3629
  {
3552
3630
  role: "group",
@@ -3557,18 +3635,18 @@ var MetricChartCard = ({
3557
3635
  metricTilesGridColsClass(loading ? metrics.length || 4 : metrics.length),
3558
3636
  hasHeader && "mt-3"
3559
3637
  ),
3560
- children: loading ? Array.from({ length: metrics.length || 4 }).map((_, index) => /* @__PURE__ */ jsxs36(
3638
+ children: loading ? Array.from({ length: metrics.length || 4 }).map((_, index) => /* @__PURE__ */ jsxs37(
3561
3639
  "div",
3562
3640
  {
3563
- className: "flex min-w-0 flex-1 flex-col gap-2 px-4 py-3",
3641
+ className: cn("flex min-w-0 flex-1 flex-col gap-2", metricTileClass),
3564
3642
  "aria-hidden": true,
3565
3643
  children: [
3566
- /* @__PURE__ */ jsx46(Skeleton, { className: "h-3 w-20" }),
3567
- /* @__PURE__ */ jsx46(Skeleton, { className: "h-7 w-24" })
3644
+ /* @__PURE__ */ jsx47(Skeleton, { className: "h-3 w-20" }),
3645
+ /* @__PURE__ */ jsx47(Skeleton, { className: "h-7 w-24" })
3568
3646
  ]
3569
3647
  },
3570
3648
  `skeleton-${index}`
3571
- )) : metrics.map((m, index) => /* @__PURE__ */ jsx46(
3649
+ )) : metrics.map((m, index) => /* @__PURE__ */ jsx47(
3572
3650
  MetricTile,
3573
3651
  {
3574
3652
  label: m.label,
@@ -3584,14 +3662,14 @@ var MetricChartCard = ({
3584
3662
  ))
3585
3663
  }
3586
3664
  ),
3587
- /* @__PURE__ */ jsx46("div", { className: metricChartRegionClass, "aria-live": "polite", "aria-atomic": "true", children: loading ? /* @__PURE__ */ jsx46(
3665
+ /* @__PURE__ */ jsx47("div", { className: metricChartRegionClass, "aria-live": "polite", "aria-atomic": "true", children: loading ? /* @__PURE__ */ jsx47(
3588
3666
  Skeleton,
3589
3667
  {
3590
3668
  className: "w-full rounded-lg",
3591
3669
  style: { height },
3592
3670
  "aria-hidden": true
3593
3671
  }
3594
- ) : active?.data && active.data.length > 0 ? /* @__PURE__ */ jsx46(
3672
+ ) : active?.data && active.data.length > 0 ? /* @__PURE__ */ jsx47(
3595
3673
  LineAreaChart,
3596
3674
  {
3597
3675
  data: active.data,
@@ -3611,7 +3689,7 @@ var MetricChartCard = ({
3611
3689
  ariaLabel: chartAriaLabel
3612
3690
  },
3613
3691
  active.id
3614
- ) : /* @__PURE__ */ jsx46(
3692
+ ) : /* @__PURE__ */ jsx47(
3615
3693
  "div",
3616
3694
  {
3617
3695
  className: "flex w-full items-center justify-center text-sm font-normal text-muted-foreground",
@@ -3717,7 +3795,7 @@ function useLiveQuery(fetcher, options = {}) {
3717
3795
 
3718
3796
  // src/charts/sparkline.tsx
3719
3797
  import { useId as useId7 } from "react";
3720
- import { Fragment as Fragment6, jsx as jsx47, jsxs as jsxs37 } from "react/jsx-runtime";
3798
+ import { Fragment as Fragment6, jsx as jsx48, jsxs as jsxs38 } from "react/jsx-runtime";
3721
3799
  var Sparkline = ({
3722
3800
  data,
3723
3801
  dataKey = "value",
@@ -3732,7 +3810,7 @@ var Sparkline = ({
3732
3810
  const uid = useId7();
3733
3811
  const values = data.map((d) => typeof d === "number" ? d : toNum(d[dataKey]));
3734
3812
  if (values.length === 0) {
3735
- return /* @__PURE__ */ jsx47("span", { className: cn("inline-block", className), style: { width, height } });
3813
+ return /* @__PURE__ */ jsx48("span", { className: cn("inline-block", className), style: { width, height } });
3736
3814
  }
3737
3815
  const pad = strokeWidth + 1;
3738
3816
  const min = Math.min(...values);
@@ -3744,7 +3822,7 @@ var Sparkline = ({
3744
3822
  x: pad + (values.length > 1 ? i / (values.length - 1) * innerW : innerW / 2),
3745
3823
  y: pad + innerH - (v - min) / range * innerH
3746
3824
  }));
3747
- return /* @__PURE__ */ jsxs37(
3825
+ return /* @__PURE__ */ jsxs38(
3748
3826
  "svg",
3749
3827
  {
3750
3828
  width,
@@ -3755,14 +3833,14 @@ var Sparkline = ({
3755
3833
  "aria-label": ariaLabel,
3756
3834
  preserveAspectRatio: "none",
3757
3835
  children: [
3758
- area && /* @__PURE__ */ jsxs37(Fragment6, { children: [
3759
- /* @__PURE__ */ jsx47("defs", { children: /* @__PURE__ */ jsxs37("linearGradient", { id: `${uid}-spark`, x1: "0", x2: "0", y1: "0", y2: "1", children: [
3760
- /* @__PURE__ */ jsx47("stop", { offset: "0%", style: { stopColor: color, stopOpacity: 0.25 } }),
3761
- /* @__PURE__ */ jsx47("stop", { offset: "100%", style: { stopColor: color, stopOpacity: 0 } })
3836
+ area && /* @__PURE__ */ jsxs38(Fragment6, { children: [
3837
+ /* @__PURE__ */ jsx48("defs", { children: /* @__PURE__ */ jsxs38("linearGradient", { id: `${uid}-spark`, x1: "0", x2: "0", y1: "0", y2: "1", children: [
3838
+ /* @__PURE__ */ jsx48("stop", { offset: "0%", style: { stopColor: color, stopOpacity: 0.25 } }),
3839
+ /* @__PURE__ */ jsx48("stop", { offset: "100%", style: { stopColor: color, stopOpacity: 0 } })
3762
3840
  ] }) }),
3763
- /* @__PURE__ */ jsx47("path", { d: monotoneAreaPath(points, height - pad), fill: `url(#${uid}-spark)` })
3841
+ /* @__PURE__ */ jsx48("path", { d: monotoneAreaPath(points, height - pad), fill: `url(#${uid}-spark)` })
3764
3842
  ] }),
3765
- /* @__PURE__ */ jsx47(
3843
+ /* @__PURE__ */ jsx48(
3766
3844
  "path",
3767
3845
  {
3768
3846
  d: monotoneLinePath(points),
@@ -3801,8 +3879,6 @@ export {
3801
3879
  getStoredThemePreset,
3802
3880
  THEME_AGENT_INSTRUCTIONS,
3803
3881
  TimbalThemeStyle,
3804
- MetricTile,
3805
- ThemePresetGallery,
3806
3882
  appPageColumnClass,
3807
3883
  appShellTopbarInsetClass,
3808
3884
  appShellInsetTopClass,
@@ -3810,6 +3886,13 @@ export {
3810
3886
  appStatTileClass,
3811
3887
  appFilterBarClass,
3812
3888
  appSearchInputClass,
3889
+ APP_DENSITY_CHART_HEIGHT,
3890
+ APP_DENSITY_CLASSES,
3891
+ appDensityClass,
3892
+ AppDensityProvider,
3893
+ useAppDensity,
3894
+ useAppDensityClass,
3895
+ MetricTile,
3813
3896
  useAppShellChat,
3814
3897
  useAppShellNav,
3815
3898
  AppShell,