@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.
- package/CHANGELOG.md +20 -0
- package/LICENSE +201 -0
- package/README.md +7 -4
- package/dist/app.cjs +1218 -1128
- package/dist/app.d.cts +21 -5
- package/dist/app.d.ts +21 -5
- package/dist/app.esm.js +17 -7
- package/dist/{chart-artifact-_PEJgCpQ.d.ts → chart-artifact-Q5QgMtbj.d.ts} +79 -26
- package/dist/{chart-artifact-E58ve76I.d.cts → chart-artifact-WDEW9dHT.d.cts} +79 -26
- package/dist/chat.esm.js +3 -3
- package/dist/{chunk-UY7AKWJL.esm.js → chunk-GQBYZRD7.esm.js} +1 -1
- package/dist/{chunk-AGJKK6R7.esm.js → chunk-OFWC4MIY.esm.js} +2 -2
- package/dist/{chunk-4VULP3CJ.esm.js → chunk-OH23AX2V.esm.js} +757 -56
- package/dist/{chunk-BMXFXLVV.esm.js → chunk-QU7ET55D.esm.js} +0 -1
- package/dist/{chunk-MTYXREHK.esm.js → chunk-THBA27QY.esm.js} +4 -4
- package/dist/{chunk-FEYZUVBM.esm.js → chunk-UCGVL7ZY.esm.js} +1 -1
- package/dist/{chunk-NAMKO2MU.esm.js → chunk-VXMM2HX7.esm.js} +1 -1
- package/dist/{chunk-XDIY2WSL.esm.js → chunk-YCXN67SD.esm.js} +559 -476
- package/dist/{pill-segmented-tabs-BsIOW1Lo.d.ts → circular-progress-Ci8L-Hfa.d.cts} +199 -3
- package/dist/{pill-segmented-tabs-BsIOW1Lo.d.cts → circular-progress-Ci8L-Hfa.d.ts} +199 -3
- package/dist/index.cjs +1716 -929
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.esm.js +28 -10
- package/dist/studio.esm.js +5 -5
- package/dist/ui.cjs +758 -49
- package/dist/ui.d.cts +1 -1
- package/dist/ui.d.ts +1 -1
- package/dist/ui.esm.js +24 -4
- package/package.json +1 -1
|
@@ -15,14 +15,14 @@ import {
|
|
|
15
15
|
studioIntegrationCardClass,
|
|
16
16
|
studioTopbarPillHeightClass,
|
|
17
17
|
toNum
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-GQBYZRD7.esm.js";
|
|
19
19
|
import {
|
|
20
20
|
Checkbox,
|
|
21
21
|
Skeleton
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-UCGVL7ZY.esm.js";
|
|
23
23
|
import {
|
|
24
24
|
PillSegmentedTabs
|
|
25
|
-
} from "./chunk-
|
|
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-
|
|
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\`, \`
|
|
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\`).
|
|
267
|
-
| **Layout chrome** | \`Page\` \u2192 \`Section\` for main content hierarchy.
|
|
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 \`
|
|
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
|
-
-
|
|
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
|
|
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:
|
|
1465
|
+
return /* @__PURE__ */ jsxs2("header", { className: headerClass, children: [
|
|
1340
1466
|
/* @__PURE__ */ jsxs2("div", { className: "min-w-0", children: [
|
|
1341
|
-
title ? /* @__PURE__ */
|
|
1342
|
-
description ? /* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
1401
|
-
unit ? /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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(
|
|
1549
|
+
className: cn(metricTileBaseClass, metricTileInteractiveExtraClass, divider, className),
|
|
1425
1550
|
children: content
|
|
1426
1551
|
}
|
|
1427
1552
|
);
|
|
1428
1553
|
}
|
|
1429
|
-
return /* @__PURE__ */
|
|
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
|
|
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 =
|
|
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
|
|
1565
|
+
return useContext2(AppShellChatContext);
|
|
1562
1566
|
}
|
|
1563
1567
|
|
|
1564
1568
|
// src/app/layout/app-shell-nav-context.tsx
|
|
1565
|
-
import { createContext as
|
|
1566
|
-
var AppShellNavContext =
|
|
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
|
|
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
|
|
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__ */
|
|
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__ */
|
|
1626
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
1763
|
+
const withNav = /* @__PURE__ */ jsx6(AppShellNavProvider, { value: navControls, children: tree });
|
|
1750
1764
|
if (!hasChat) {
|
|
1751
1765
|
return withNav;
|
|
1752
1766
|
}
|
|
1753
|
-
return /* @__PURE__ */
|
|
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
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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
|
-
|
|
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__ */
|
|
1849
|
-
description ? /* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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
|
|
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
|
-
|
|
1879
|
-
|
|
1880
|
-
|
|
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
|
|
1887
|
-
import { jsx as
|
|
1888
|
-
var AppCopilotContext =
|
|
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__ */
|
|
1928
|
+
return /* @__PURE__ */ jsx13(AppCopilotContext.Provider, { value, children });
|
|
1894
1929
|
};
|
|
1895
1930
|
function useAppCopilotContext() {
|
|
1896
|
-
return
|
|
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
|
|
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__ */
|
|
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__ */
|
|
1989
|
+
children: /* @__PURE__ */ jsx14(XIcon, { className: "size-4", "aria-hidden": true })
|
|
1955
1990
|
}
|
|
1956
1991
|
) }) : null,
|
|
1957
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
2023
|
+
import { jsx as jsx15 } from "react/jsx-runtime";
|
|
1989
2024
|
var SurfaceCard = ({ children, className }) => {
|
|
1990
|
-
|
|
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
|
|
2030
|
+
import { jsx as jsx16, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
1995
2031
|
var StatTile = ({ label, value, hint, className }) => {
|
|
1996
|
-
|
|
1997
|
-
|
|
1998
|
-
/* @__PURE__ */
|
|
1999
|
-
|
|
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
|
|
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
|
-
|
|
2012
|
-
|
|
2013
|
-
|
|
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
|
|
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-
|
|
2024
|
-
warn: "bg-amber-500/10 text-amber-
|
|
2025
|
-
danger: "bg-destructive/10 text-destructive",
|
|
2026
|
-
muted: "bg-muted/
|
|
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__ */
|
|
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
|
|
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
|
|
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__ */
|
|
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__ */
|
|
2067
|
-
/* @__PURE__ */
|
|
2068
|
-
description ? /* @__PURE__ */
|
|
2069
|
-
/* @__PURE__ */
|
|
2070
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
2125
|
-
/* @__PURE__ */
|
|
2126
|
-
title ? /* @__PURE__ */
|
|
2127
|
-
children ? /* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
2149
|
-
/* @__PURE__ */
|
|
2150
|
-
pulse ? /* @__PURE__ */
|
|
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__ */
|
|
2219
|
+
/* @__PURE__ */ jsx21("span", { className: cn("relative inline-flex size-2 rounded-full", dotClass[tone]) })
|
|
2160
2220
|
] }),
|
|
2161
|
-
label ? /* @__PURE__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
2186
|
-
/* @__PURE__ */
|
|
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
|
|
2207
|
-
var Chevron = ({ open }) => /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
2243
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2253
|
-
icon ? /* @__PURE__ */
|
|
2254
|
-
/* @__PURE__ */
|
|
2255
|
-
count != null ? /* @__PURE__ */
|
|
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__ */
|
|
2317
|
+
/* @__PURE__ */ jsx23(Chevron, { open })
|
|
2258
2318
|
]
|
|
2259
2319
|
}
|
|
2260
2320
|
),
|
|
2261
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
2304
|
-
/* @__PURE__ */
|
|
2305
|
-
media ? /* @__PURE__ */
|
|
2306
|
-
/* @__PURE__ */
|
|
2307
|
-
/* @__PURE__ */
|
|
2308
|
-
subtitle ? /* @__PURE__ */
|
|
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__ */
|
|
2370
|
+
badge ? /* @__PURE__ */ jsx24("span", { className: "shrink-0 pt-0.5", children: badge }) : null
|
|
2311
2371
|
] }),
|
|
2312
|
-
footer || action ? /* @__PURE__ */
|
|
2313
|
-
/* @__PURE__ */
|
|
2314
|
-
action ? /* @__PURE__ */
|
|
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__ */
|
|
2378
|
+
return /* @__PURE__ */ jsx24("button", { type: "button", onClick, "aria-label": ariaLabel, className: cn(resourceCardInteractiveClass, className), children: body });
|
|
2319
2379
|
}
|
|
2320
|
-
return /* @__PURE__ */
|
|
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
|
|
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__ */
|
|
2330
|
-
/* @__PURE__ */
|
|
2331
|
-
description ? /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
2350
|
-
/* @__PURE__ */
|
|
2351
|
-
description ? /* @__PURE__ */
|
|
2352
|
-
descriptionFooter ? /* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
2379
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2447
|
+
description ? /* @__PURE__ */ jsx26("p", { className: "mt-0.5 text-xs text-muted-foreground", children: description }) : null
|
|
2388
2448
|
] }),
|
|
2389
|
-
/* @__PURE__ */
|
|
2449
|
+
/* @__PURE__ */ jsx26("div", { className: "shrink-0", children })
|
|
2390
2450
|
]
|
|
2391
2451
|
}
|
|
2392
2452
|
);
|
|
2393
2453
|
}
|
|
2394
|
-
return /* @__PURE__ */
|
|
2395
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
2438
|
-
/* @__PURE__ */
|
|
2439
|
-
/* @__PURE__ */
|
|
2440
|
-
/* @__PURE__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
2465
|
-
/* @__PURE__ */
|
|
2466
|
-
description ? /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
2486
|
-
title ? /* @__PURE__ */
|
|
2487
|
-
description ? /* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
2538
|
-
/* @__PURE__ */
|
|
2539
|
-
logo ? /* @__PURE__ */
|
|
2540
|
-
/* @__PURE__ */
|
|
2541
|
-
/* @__PURE__ */
|
|
2542
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2610
|
+
statusLabel[status] ? /* @__PURE__ */ jsx29("p", { className: "mt-0.5 text-xs text-muted-foreground", children: statusLabel[status] }) : null
|
|
2551
2611
|
] }),
|
|
2552
|
-
badge ? /* @__PURE__ */
|
|
2612
|
+
badge ? /* @__PURE__ */ jsx29("span", { className: "shrink-0", children: badge }) : null
|
|
2553
2613
|
] }) })
|
|
2554
2614
|
] }),
|
|
2555
|
-
description ? /* @__PURE__ */
|
|
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__ */
|
|
2566
|
-
/* @__PURE__ */
|
|
2567
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
2631
|
-
description ? /* @__PURE__ */
|
|
2632
|
-
action ? /* @__PURE__ */
|
|
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
|
|
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__ */
|
|
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
|
|
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__ */
|
|
2660
|
-
logo ? /* @__PURE__ */
|
|
2661
|
-
/* @__PURE__ */
|
|
2662
|
-
/* @__PURE__ */
|
|
2663
|
-
meta ? /* @__PURE__ */
|
|
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__ */
|
|
2666
|
-
action ? /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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
|
|
2793
|
+
import { jsx as jsx35, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
2734
2794
|
var Breadcrumbs = ({ items, className }) => {
|
|
2735
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
2738
|
-
index > 0 ? /* @__PURE__ */
|
|
2739
|
-
isLast ? /* @__PURE__ */
|
|
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
|
|
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__ */
|
|
2763
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2766
|
-
error ? /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
2865
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
2919
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2989
|
+
/* @__PURE__ */ jsx39("span", { className: trackClass, "aria-hidden": true, children: /* @__PURE__ */ jsx39("span", { className: thumbClass }) })
|
|
2930
2990
|
] }),
|
|
2931
|
-
/* @__PURE__ */
|
|
2932
|
-
/* @__PURE__ */
|
|
2933
|
-
description ? /* @__PURE__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
2958
|
-
/* @__PURE__ */
|
|
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
|
|
3033
|
+
import { jsx as jsx41, jsxs as jsxs32 } from "react/jsx-runtime";
|
|
2974
3034
|
var FormSection = ({ title, children, className }) => {
|
|
2975
|
-
|
|
2976
|
-
|
|
2977
|
-
|
|
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
|
|
3050
|
+
import { jsx as jsx42 } from "react/jsx-runtime";
|
|
2983
3051
|
var FilterBar = ({ children, className }) => {
|
|
2984
|
-
return /* @__PURE__ */
|
|
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
|
|
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__ */
|
|
3003
|
-
label ? /* @__PURE__ */
|
|
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
|
|
3018
|
-
var shellClass2 = "overflow-hidden rounded-xl border border-border bg-
|
|
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
|
|
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-
|
|
3023
|
-
var footCellClass = "border-t border-border/60 bg-
|
|
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-
|
|
3027
|
-
var stickyHeadClass = "sticky top-0 z-[1] bg-
|
|
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-
|
|
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__ */
|
|
3128
|
+
return /* @__PURE__ */ jsx44(ArrowUpDownIcon, { className: iconClass, "aria-hidden": true });
|
|
3060
3129
|
}
|
|
3061
3130
|
if (direction === "desc") {
|
|
3062
|
-
return /* @__PURE__ */
|
|
3131
|
+
return /* @__PURE__ */ jsx44(ArrowDownIcon, { className: iconClass, "aria-hidden": true });
|
|
3063
3132
|
}
|
|
3064
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
3188
|
-
caption ? /* @__PURE__ */
|
|
3189
|
-
/* @__PURE__ */
|
|
3190
|
-
selectable ? /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
3210
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
3232
|
-
selectable ? /* @__PURE__ */
|
|
3233
|
-
columns.map((col) => /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
3247
|
-
/* @__PURE__ */
|
|
3248
|
-
emptyDescription ? /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
3337
|
+
selectable ? /* @__PURE__ */ jsx44(
|
|
3269
3338
|
"td",
|
|
3270
3339
|
{
|
|
3271
3340
|
className: cn(selectCellClass, cellPad),
|
|
3272
3341
|
onClick: (event) => event.stopPropagation(),
|
|
3273
|
-
children: /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
3311
|
-
showRowCount ? /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
3321
|
-
/* @__PURE__ */
|
|
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__ */
|
|
3333
|
-
/* @__PURE__ */
|
|
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__ */
|
|
3410
|
+
children: /* @__PURE__ */ jsx44(ChevronLeftIcon, { className: "size-4", "aria-hidden": true })
|
|
3342
3411
|
}
|
|
3343
3412
|
),
|
|
3344
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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
|
|
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__ */
|
|
3380
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
3468
|
+
/* @__PURE__ */ jsx45(
|
|
3396
3469
|
"div",
|
|
3397
3470
|
{
|
|
3398
3471
|
className: cn(
|
|
3399
3472
|
"relative min-h-0 w-full",
|
|
3400
|
-
hasHeader ? metricChartPlotRegionClass :
|
|
3473
|
+
hasHeader ? metricChartPlotRegionClass : chartPanelBodyClass
|
|
3401
3474
|
),
|
|
3402
|
-
children: body ?? /* @__PURE__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
3546
|
+
className: cn("flex min-w-0 flex-1 flex-col gap-2", metricTileClass),
|
|
3473
3547
|
"aria-hidden": true,
|
|
3474
3548
|
children: [
|
|
3475
|
-
/* @__PURE__ */
|
|
3476
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
3641
|
+
className: cn("flex min-w-0 flex-1 flex-col gap-2", metricTileClass),
|
|
3564
3642
|
"aria-hidden": true,
|
|
3565
3643
|
children: [
|
|
3566
|
-
/* @__PURE__ */
|
|
3567
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
3759
|
-
/* @__PURE__ */
|
|
3760
|
-
/* @__PURE__ */
|
|
3761
|
-
/* @__PURE__ */
|
|
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__ */
|
|
3841
|
+
/* @__PURE__ */ jsx48("path", { d: monotoneAreaPath(points, height - pad), fill: `url(#${uid}-spark)` })
|
|
3764
3842
|
] }),
|
|
3765
|
-
/* @__PURE__ */
|
|
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,
|