@timbal-ai/timbal-react 0.8.1 → 0.8.2

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.
@@ -359,6 +359,38 @@ function relativeLuminance(color) {
359
359
  }
360
360
 
361
361
  // src/design/theme.ts
362
+ var SHADOW_PRESETS = {
363
+ none: {
364
+ lightCard: "none",
365
+ lightElevated: "none",
366
+ darkCard: "none",
367
+ darkElevated: "none"
368
+ },
369
+ hairline: {
370
+ lightCard: "0 0 0 1px rgba(15, 23, 42, 0.06)",
371
+ lightElevated: "0 1px 2px rgba(15, 23, 42, 0.06)",
372
+ darkCard: "0 0 0 1px rgba(255, 255, 255, 0.06)",
373
+ darkElevated: "0 2px 8px rgba(0, 0, 0, 0.4)"
374
+ },
375
+ soft: {
376
+ lightCard: "0 1px 2px rgba(15, 23, 42, 0.04)",
377
+ lightElevated: "0 8px 30px rgba(15, 23, 42, 0.07)",
378
+ darkCard: "0 1px 2px rgba(0, 0, 0, 0.3)",
379
+ darkElevated: "0 10px 34px rgba(0, 0, 0, 0.45)"
380
+ },
381
+ medium: {
382
+ lightCard: "0 1px 2px -0.5px rgba(0, 0, 0, 0.05)",
383
+ lightElevated: "0 4px 24px rgba(0, 0, 0, 0.06)",
384
+ darkCard: "0 1px 3px rgba(0, 0, 0, 0.22)",
385
+ darkElevated: "0 4px 24px rgba(0, 0, 0, 0.35)"
386
+ },
387
+ strong: {
388
+ lightCard: "0 2px 6px rgba(15, 23, 42, 0.10)",
389
+ lightElevated: "0 16px 48px rgba(15, 23, 42, 0.16)",
390
+ darkCard: "0 2px 6px rgba(0, 0, 0, 0.4)",
391
+ darkElevated: "0 18px 50px rgba(0, 0, 0, 0.6)"
392
+ }
393
+ };
362
394
  function primaryForMode(brand, mode) {
363
395
  if (mode === "light") {
364
396
  return { ...brand, l: Math.min(Math.max(brand.l, 0.42), 0.68) };
@@ -394,8 +426,26 @@ function createTimbalTheme(intent) {
394
426
  const light = {};
395
427
  const dark = {};
396
428
  const root = {};
429
+ let fontFamily;
430
+ let fontImportUrl;
397
431
  if (typeof intent.radius === "number") {
398
432
  root["--radius"] = `${intent.radius}rem`;
433
+ root["--radius-2xl"] = `${Math.max(intent.radius + 0.25, 0)}rem`;
434
+ }
435
+ if (intent.typography) {
436
+ const { sans, display, mono, importUrl } = intent.typography;
437
+ root["--font-sans"] = sans;
438
+ if (display) root["--font-display"] = display;
439
+ if (mono) root["--font-mono"] = mono;
440
+ fontFamily = sans;
441
+ fontImportUrl = importUrl;
442
+ }
443
+ if (intent.shadow) {
444
+ const s = SHADOW_PRESETS[intent.shadow];
445
+ light["--shadow-card-value"] = s.lightCard;
446
+ light["--shadow-card-elevated-value"] = s.lightElevated;
447
+ dark["--shadow-card-value"] = s.darkCard;
448
+ dark["--shadow-card-elevated-value"] = s.darkElevated;
399
449
  }
400
450
  const primaryLight = primaryForMode(brand, "light");
401
451
  const primaryDark = primaryForMode(brand, "dark");
@@ -493,7 +543,7 @@ function createTimbalTheme(intent) {
493
543
  );
494
544
  }
495
545
  }
496
- return { light, dark, root };
546
+ return { light, dark, root, fontFamily, fontImportUrl };
497
547
  }
498
548
  function declarations(map, indent) {
499
549
  return Object.entries(map).map(([name, value]) => `${indent}${name}: ${value};`).join("\n");
@@ -516,6 +566,11 @@ ${declarations(theme.dark, indent)}
516
566
  }`
517
567
  );
518
568
  }
569
+ if (theme.fontFamily) {
570
+ blocks.push(`${sel} {
571
+ ${indent}font-family: var(--font-sans);
572
+ }`);
573
+ }
519
574
  } else {
520
575
  if (Object.keys(lightVars).length) {
521
576
  blocks.push(`:root {
@@ -525,15 +580,45 @@ ${declarations(lightVars, indent)}
525
580
  if (Object.keys(theme.dark).length) {
526
581
  blocks.push(`.dark {
527
582
  ${declarations(theme.dark, indent)}
583
+ }`);
584
+ }
585
+ if (theme.fontFamily) {
586
+ blocks.push(`:root,
587
+ body {
588
+ ${indent}font-family: var(--font-sans);
528
589
  }`);
529
590
  }
530
591
  }
531
- return blocks.join("\n\n");
592
+ const css = blocks.join("\n\n");
593
+ if (options.includeFontImport && theme.fontImportUrl) {
594
+ return `@import url("${theme.fontImportUrl}");
595
+
596
+ ${css}`;
597
+ }
598
+ return css;
532
599
  }
533
600
  var RUNTIME_STYLE_ID = "timbal-theme-runtime";
601
+ var FONT_LINK_ATTR = "data-timbal-theme-font";
602
+ function ensureThemeFontLink(url) {
603
+ if (typeof document === "undefined") return;
604
+ const existing = document.head.querySelector(
605
+ `link[${FONT_LINK_ATTR}]`
606
+ );
607
+ if (!url) {
608
+ existing?.remove();
609
+ return;
610
+ }
611
+ if (existing?.getAttribute("href") === url) return;
612
+ const link = existing ?? document.createElement("link");
613
+ link.rel = "stylesheet";
614
+ link.href = url;
615
+ link.setAttribute(FONT_LINK_ATTR, "");
616
+ if (!existing) document.head.appendChild(link);
617
+ }
534
618
  function applyTimbalTheme(theme) {
535
619
  if (typeof document === "undefined") return () => {
536
620
  };
621
+ ensureThemeFontLink(theme.fontImportUrl);
537
622
  let el = document.getElementById(RUNTIME_STYLE_ID);
538
623
  if (!el) {
539
624
  el = document.createElement("style");
@@ -544,11 +629,13 @@ function applyTimbalTheme(theme) {
544
629
  el.textContent = themeToCss(theme);
545
630
  return () => {
546
631
  el?.parentNode?.removeChild(el);
632
+ ensureThemeFontLink(void 0);
547
633
  };
548
634
  }
549
635
  function clearTimbalTheme() {
550
636
  if (typeof document === "undefined") return;
551
637
  document.getElementById(RUNTIME_STYLE_ID)?.remove();
638
+ ensureThemeFontLink(void 0);
552
639
  }
553
640
  function isDev() {
554
641
  if (typeof process !== "undefined" && process.env?.NODE_ENV === "production") {
@@ -559,48 +646,122 @@ function isDev() {
559
646
 
560
647
  // src/design/theme-presets.ts
561
648
  var EMPTY_TOKENS = { light: {}, dark: {}, root: {} };
649
+ var FONT_URL = {
650
+ geist: "https://fonts.googleapis.com/css2?family=Geist:wght@400..600&display=swap",
651
+ sora: "https://fonts.googleapis.com/css2?family=Sora:wght@400..600&display=swap",
652
+ lexend: "https://fonts.googleapis.com/css2?family=Lexend:wght@400..600&display=swap",
653
+ inter: "https://fonts.googleapis.com/css2?family=Inter:wght@400..600&display=swap",
654
+ fraunces: "https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,400..600&display=swap",
655
+ jetbrains: "https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400..600&display=swap"
656
+ };
657
+ var STACK = {
658
+ geist: '"Geist", ui-sans-serif, system-ui, sans-serif',
659
+ sora: '"Sora", ui-sans-serif, system-ui, sans-serif',
660
+ lexend: '"Lexend", ui-sans-serif, system-ui, sans-serif',
661
+ inter: '"Inter", ui-sans-serif, system-ui, sans-serif',
662
+ fraunces: '"Fraunces", ui-serif, Georgia, "Times New Roman", serif',
663
+ jetbrains: '"JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace'
664
+ };
562
665
  var TIMBAL_THEME_PRESETS = [
563
666
  {
564
667
  id: "platform",
565
668
  label: "Platform",
566
- description: "Shipped neutral monochrome \u2014 the Timbal Platform default. Calm, brand-agnostic.",
669
+ description: "Shipped neutral monochrome \u2014 the Timbal Platform default. Calm, brand-agnostic, system font.",
567
670
  swatch: "oklch(0.205 0 0)",
671
+ font: null,
568
672
  tokens: EMPTY_TOKENS
569
673
  },
570
674
  {
571
675
  id: "indigo",
572
676
  label: "Indigo",
573
- description: "Cool, trustworthy blue-violet \u2014 good for analytics & ops dashboards.",
677
+ description: "Cool, trustworthy blue-violet, Geist type, generous radius, soft shadows \u2014 analytics & ops dashboards.",
574
678
  swatch: "#4f46e5",
575
- tokens: createTimbalTheme({ brand: "#4f46e5" })
679
+ font: "Geist",
680
+ tokens: createTimbalTheme({
681
+ brand: "#4f46e5",
682
+ radius: 0.875,
683
+ shadow: "soft",
684
+ typography: { sans: STACK.geist, importUrl: FONT_URL.geist }
685
+ })
576
686
  },
577
687
  {
578
688
  id: "violet",
579
689
  label: "Violet",
580
- description: "Vivid purple \u2014 expressive, product/marketing-leaning surfaces.",
690
+ description: "Vivid purple, Sora type, rounded, soft shadows \u2014 expressive product / marketing surfaces.",
581
691
  swatch: "#7c3aed",
582
- tokens: createTimbalTheme({ brand: "#7c3aed" })
692
+ font: "Sora",
693
+ tokens: createTimbalTheme({
694
+ brand: "#7c3aed",
695
+ radius: 1,
696
+ shadow: "soft",
697
+ typography: { sans: STACK.sora, importUrl: FONT_URL.sora }
698
+ })
583
699
  },
584
700
  {
585
701
  id: "forest",
586
702
  label: "Forest",
587
- description: "Grounded green \u2014 finance, sustainability, status-positive apps.",
703
+ description: "Grounded green, Lexend type, compact radius \u2014 finance, sustainability, status-positive apps.",
588
704
  swatch: "#16a34a",
589
- tokens: createTimbalTheme({ brand: "#16a34a" })
705
+ font: "Lexend",
706
+ tokens: createTimbalTheme({
707
+ brand: "#16a34a",
708
+ radius: 0.625,
709
+ shadow: "soft",
710
+ typography: { sans: STACK.lexend, importUrl: FONT_URL.lexend }
711
+ })
590
712
  },
591
713
  {
592
714
  id: "warm",
593
715
  label: "Warm",
594
- description: "Energetic orange \u2014 consumer, creative, high-engagement tools.",
716
+ description: "Energetic orange, Lexend type, friendly radius \u2014 consumer, creative, high-engagement tools.",
595
717
  swatch: "#ea580c",
596
- tokens: createTimbalTheme({ brand: "#ea580c" })
718
+ font: "Lexend",
719
+ tokens: createTimbalTheme({
720
+ brand: "#ea580c",
721
+ radius: 0.875,
722
+ shadow: "soft",
723
+ typography: { sans: STACK.lexend, importUrl: FONT_URL.lexend }
724
+ })
597
725
  },
598
726
  {
599
727
  id: "slate",
600
728
  label: "Slate",
601
- description: "Muted cool gray-blue with a subtle tint \u2014 understated enterprise.",
729
+ description: "Muted enterprise gray-blue, Inter type, tight radius, hairline shadows, tinted neutrals.",
602
730
  swatch: "#475569",
603
- tokens: createTimbalTheme({ brand: "#475569", tintNeutrals: true })
731
+ font: "Inter",
732
+ tokens: createTimbalTheme({
733
+ brand: "#475569",
734
+ radius: 0.5,
735
+ shadow: "hairline",
736
+ tintNeutrals: true,
737
+ typography: { sans: STACK.inter, importUrl: FONT_URL.inter }
738
+ })
739
+ },
740
+ {
741
+ id: "folio",
742
+ label: "Folio",
743
+ description: "Editorial serif (Fraunces), near-sharp corners, hairline shadows \u2014 content / docs / reports.",
744
+ swatch: "#9a3412",
745
+ font: "Fraunces",
746
+ tokens: createTimbalTheme({
747
+ brand: "#9a3412",
748
+ radius: 0.25,
749
+ shadow: "hairline",
750
+ typography: { sans: STACK.fraunces, importUrl: FONT_URL.fraunces }
751
+ })
752
+ },
753
+ {
754
+ id: "carbon",
755
+ label: "Carbon",
756
+ description: "Terminal monospace (JetBrains Mono), crisp corners, green accent \u2014 developer / infra tools.",
757
+ swatch: "#15803d",
758
+ font: "JetBrains Mono",
759
+ tokens: createTimbalTheme({
760
+ brand: "#15803d",
761
+ radius: 0.375,
762
+ shadow: "hairline",
763
+ typography: { sans: STACK.jetbrains, importUrl: FONT_URL.jetbrains }
764
+ })
604
765
  }
605
766
  ];
606
767
  var PRESET_BY_ID = new Map(
@@ -641,18 +802,29 @@ The package ships a complete light + dark token system (\`styles.css\`). Compone
641
802
 
642
803
  **Never write \`oklch(...)\` / hex literals or hand-author paired \`:root\` + \`.dark\` blocks.** Express intent and let the package derive a complete, contrast-correct, paired palette.
643
804
 
644
- ### Pick a brand color (rebrand)
805
+ ### Generate a full personality (color + roundness + fonts + shadows)
645
806
 
646
807
  \`\`\`ts
647
808
  import { createTimbalTheme, themeToCss } from "@timbal-ai/timbal-react";
648
809
 
649
- const theme = createTimbalTheme({ brand: "#4f46e5" /* accent?, radius?, tintNeutrals? */ });
650
- // Build-time: write once into your app CSS (paired light + dark, guaranteed in sync):
651
- const css = themeToCss(theme);
810
+ const theme = createTimbalTheme({
811
+ brand: "#4f46e5",
812
+ radius: 0.875, // corner roundness in rem (sets --radius + --radius-2xl)
813
+ shadow: "soft", // "none" | "hairline" | "soft" | "medium" | "strong"
814
+ tintNeutrals: false, // tint background/border toward the brand hue
815
+ accent: "#10b981", // optional secondary accent
816
+ typography: { // optional \u2014 re-skins every component's font
817
+ sans: '"Geist", ui-sans-serif, system-ui, sans-serif',
818
+ importUrl: "https://fonts.googleapis.com/css2?family=Geist:wght@400..600&display=swap",
819
+ // display?, mono? also supported
820
+ },
821
+ });
822
+ const css = themeToCss(theme); // paired light + dark, guaranteed in sync
652
823
  \`\`\`
653
824
 
654
- - For a real company, look up the actual brand hex first (brandfetch / "<company> brand color hex"), then pass it as \`brand\`.
655
- - \`createTimbalTheme\` derives \`--primary\`, its foreground, ring, the full button gradient, and a soft playground tint. You only supply intent.
825
+ - \`createTimbalTheme\` derives \`--primary\`, its foreground, ring, the full button gradient, and a soft playground tint from \`brand\`. \`radius\` sets roundness, \`shadow\` sets card depth, \`typography\` sets fonts. You only supply intent \u2014 never raw OKLCH.
826
+ - For a real company, look up the actual brand hex first (brandfetch / "<company> brand color hex").
827
+ - **Web fonts must be loaded.** \`applyTimbalTheme\` / \`TimbalThemeStyle\` inject the \`<link>\` for \`typography.importUrl\` automatically. For build-time \`themeToCss\`, add the \`<link rel="stylesheet" href="\u2026">\` to your \`index.html\` yourself (or pass \`themeToCss(theme, { includeFontImport: true })\` when the result is a standalone stylesheet).
656
828
 
657
829
  ### Apply a theme
658
830
 
@@ -669,14 +841,18 @@ import { TIMBAL_THEME_PRESETS, applyThemePreset } from "@timbal-ai/timbal-react"
669
841
  // TIMBAL_THEME_PRESETS: { id, label, description, swatch, tokens }[]
670
842
  \`\`\`
671
843
 
672
- | Preset id | Use when |
673
- |-----------|----------|
674
- | \`platform\` | Neutral monochrome default (no brand) |
675
- | \`indigo\` | Cool, trustworthy \u2014 analytics / ops dashboards |
676
- | \`violet\` | Expressive purple \u2014 product / marketing |
677
- | \`forest\` | Green \u2014 finance, sustainability, positive status |
678
- | \`warm\` | Orange \u2014 consumer / creative / high-engagement |
679
- | \`slate\` | Muted enterprise gray-blue (tinted neutrals) |
844
+ Each preset is a **full personality** (color + radius + shadows + font), not just a color:
845
+
846
+ | Preset id | Personality |
847
+ |-----------|-------------|
848
+ | \`platform\` | Neutral monochrome, system font (the default \u2014 no brand) |
849
+ | \`indigo\` | Blue-violet, Geist, generous radius, soft shadows \u2014 analytics / ops |
850
+ | \`violet\` | Purple, Sora, rounded \u2014 product / marketing |
851
+ | \`forest\` | Green, Lexend, compact \u2014 finance / sustainability |
852
+ | \`warm\` | Orange, Lexend, friendly \u2014 consumer / creative |
853
+ | \`slate\` | Enterprise gray-blue, Inter, tight radius, hairline shadows |
854
+ | \`folio\` | Editorial serif (Fraunces), near-sharp corners \u2014 content / docs |
855
+ | \`carbon\` | Terminal monospace (JetBrains Mono), green accent \u2014 dev / infra |
680
856
 
681
857
  - To present options visually, render \`<ThemePresetGallery value={id} onSelect={setId} />\` \u2014 each swatch previews real components (Button + metric tile) scoped via \`data-timbal-theme\`, so the live app doesn't change until the user picks.
682
858
  - On selection, call \`applyThemePreset(id)\` (persists to \`localStorage\` and restores on reload).
@@ -689,7 +865,7 @@ import { TIMBAL_THEME_PRESETS, applyThemePreset } from "@timbal-ai/timbal-react"
689
865
  `.trim();
690
866
 
691
867
  // src/app/theme/TimbalThemeStyle.tsx
692
- import { jsx } from "react/jsx-runtime";
868
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
693
869
  var TimbalThemeStyle = ({
694
870
  theme,
695
871
  preset,
@@ -700,18 +876,21 @@ var TimbalThemeStyle = ({
700
876
  if (!tokens) return null;
701
877
  const css = themeToCss(tokens, scope ? { scope } : void 0);
702
878
  if (!css) return null;
703
- return /* @__PURE__ */ jsx(
704
- "style",
705
- {
706
- "data-timbal-theme-style": scope ?? "root",
707
- nonce,
708
- dangerouslySetInnerHTML: { __html: css }
709
- }
710
- );
879
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
880
+ tokens.fontImportUrl ? /* @__PURE__ */ jsx("link", { rel: "stylesheet", href: tokens.fontImportUrl }) : null,
881
+ /* @__PURE__ */ jsx(
882
+ "style",
883
+ {
884
+ "data-timbal-theme-style": scope ?? "root",
885
+ nonce,
886
+ dangerouslySetInnerHTML: { __html: css }
887
+ }
888
+ )
889
+ ] });
711
890
  };
712
891
 
713
892
  // src/app/data/metrics-shared.tsx
714
- import { jsx as jsx2, jsxs } from "react/jsx-runtime";
893
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
715
894
  var metricCardShellClass = cn(
716
895
  studioIntegrationCardClass,
717
896
  "aui-app-metric-card shadow-none",
@@ -729,8 +908,8 @@ var MetricCardHeader = ({
729
908
  actions
730
909
  }) => {
731
910
  if (!title && !description && !actions) return null;
732
- return /* @__PURE__ */ jsxs("header", { className: metricCardHeaderClass, children: [
733
- /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
911
+ return /* @__PURE__ */ jsxs2("header", { className: metricCardHeaderClass, children: [
912
+ /* @__PURE__ */ jsxs2("div", { className: "min-w-0", children: [
734
913
  title ? /* @__PURE__ */ jsx2("h3", { id: titleId, className: "text-base font-normal text-foreground", children: title }) : null,
735
914
  description ? /* @__PURE__ */ jsx2("p", { className: "mt-0.5 text-sm text-muted-foreground", children: description }) : null
736
915
  ] }),
@@ -755,7 +934,7 @@ function metricTilesGridColsClass(n) {
755
934
  }
756
935
 
757
936
  // src/app/data/MetricTile.tsx
758
- import { Fragment, jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
937
+ import { Fragment as Fragment2, jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
759
938
  var trendToneClass = {
760
939
  up: "border-border/80 bg-muted/40 text-muted-foreground",
761
940
  down: "border-border/80 bg-muted/40 text-muted-foreground",
@@ -779,7 +958,7 @@ var MetricTile = ({
779
958
  ariaLabel,
780
959
  className
781
960
  }) => {
782
- const content = /* @__PURE__ */ jsxs2(Fragment, { children: [
961
+ const content = /* @__PURE__ */ jsxs3(Fragment2, { children: [
783
962
  active ? /* @__PURE__ */ jsx3(
784
963
  "span",
785
964
  {
@@ -788,8 +967,8 @@ var MetricTile = ({
788
967
  }
789
968
  ) : null,
790
969
  /* @__PURE__ */ jsx3("span", { className: "text-xs font-normal text-muted-foreground", children: label }),
791
- /* @__PURE__ */ jsxs2("span", { className: "flex items-center gap-2", children: [
792
- /* @__PURE__ */ jsxs2("span", { className: "flex items-baseline gap-1", children: [
970
+ /* @__PURE__ */ jsxs3("span", { className: "flex items-center gap-2", children: [
971
+ /* @__PURE__ */ jsxs3("span", { className: "flex items-baseline gap-1", children: [
793
972
  /* @__PURE__ */ jsx3("span", { className: "text-2xl font-normal tracking-tight text-foreground tabular-nums", children: value }),
794
973
  unit ? /* @__PURE__ */ jsx3("span", { className: "text-xs font-normal text-muted-foreground", children: unit }) : null
795
974
  ] }),
@@ -823,7 +1002,7 @@ var MetricTile = ({
823
1002
  };
824
1003
 
825
1004
  // src/app/theme/ThemePresetGallery.tsx
826
- import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
1005
+ import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
827
1006
  var ThemePresetGallery = ({
828
1007
  value,
829
1008
  onSelect,
@@ -842,9 +1021,9 @@ var ThemePresetGallery = ({
842
1021
  ),
843
1022
  children: items.map((preset) => {
844
1023
  const selected = value === preset.id;
845
- return /* @__PURE__ */ jsxs3("div", { "data-timbal-theme": preset.id, children: [
1024
+ return /* @__PURE__ */ jsxs4("div", { "data-timbal-theme": preset.id, children: [
846
1025
  /* @__PURE__ */ jsx4(TimbalThemeStyle, { preset: preset.id, scope: preset.id }),
847
- /* @__PURE__ */ jsxs3(
1026
+ /* @__PURE__ */ jsxs4(
848
1027
  "button",
849
1028
  {
850
1029
  type: "button",
@@ -858,8 +1037,8 @@ var ThemePresetGallery = ({
858
1037
  selected ? "border-primary ring-2 ring-primary/30" : "border-border hover:border-foreground/30"
859
1038
  ),
860
1039
  children: [
861
- /* @__PURE__ */ jsxs3("div", { className: "flex items-center justify-between gap-2", children: [
862
- /* @__PURE__ */ jsxs3("span", { className: "flex items-center gap-2", children: [
1040
+ /* @__PURE__ */ jsxs4("div", { className: "flex items-center justify-between gap-2", children: [
1041
+ /* @__PURE__ */ jsxs4("span", { className: "flex items-center gap-2", children: [
863
1042
  /* @__PURE__ */ jsx4(
864
1043
  "span",
865
1044
  {
@@ -873,8 +1052,12 @@ var ThemePresetGallery = ({
873
1052
  selected ? /* @__PURE__ */ jsx4("span", { className: "text-xs font-medium text-primary", children: "Selected" }) : null
874
1053
  ] }),
875
1054
  /* @__PURE__ */ jsx4("p", { className: "text-xs leading-snug text-muted-foreground", children: preset.description }),
876
- /* @__PURE__ */ jsxs3("div", { className: "flex flex-col gap-2 rounded-lg border border-border bg-background p-2", children: [
877
- /* @__PURE__ */ jsxs3("div", { className: "flex items-center gap-2", children: [
1055
+ preset.font ? /* @__PURE__ */ jsxs4("span", { className: "text-[10px] uppercase tracking-wide text-muted-foreground", children: [
1056
+ "Aa \xB7 ",
1057
+ preset.font
1058
+ ] }) : null,
1059
+ /* @__PURE__ */ jsxs4("div", { className: "flex flex-col gap-2 rounded-lg border border-border bg-background p-2", children: [
1060
+ /* @__PURE__ */ jsxs4("div", { className: "flex items-center gap-2", children: [
878
1061
  /* @__PURE__ */ jsx4(Button, { size: "xs", className: "pointer-events-none", children: "Primary" }),
879
1062
  /* @__PURE__ */ jsx4("span", { className: "size-5 rounded-md bg-primary", "aria-hidden": true }),
880
1063
  /* @__PURE__ */ jsx4("span", { className: "size-5 rounded-md bg-muted", "aria-hidden": true }),
@@ -961,7 +1144,7 @@ function useAppShellChat() {
961
1144
  // src/app/layout/AppShell.tsx
962
1145
  import { motion, useReducedMotion } from "motion/react";
963
1146
  import { useCallback, useState } from "react";
964
- import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
1147
+ import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
965
1148
  var floatingTriggerClass = cn(
966
1149
  "aui-app-shell-chat-trigger-fixed fixed z-50 rounded-full px-5 py-2.5 text-sm font-medium shadow-card-elevated",
967
1150
  "bg-primary text-primary-foreground transition-colors hover:bg-primary/90",
@@ -997,7 +1180,7 @@ var AppShellBody = ({
997
1180
  initial: false,
998
1181
  animate: { paddingLeft: insetPadding },
999
1182
  transition: layoutTransition,
1000
- children: /* @__PURE__ */ jsxs4(
1183
+ children: /* @__PURE__ */ jsxs5(
1001
1184
  "div",
1002
1185
  {
1003
1186
  className: cn(
@@ -1065,7 +1248,7 @@ var AppShell = ({
1065
1248
  children
1066
1249
  }
1067
1250
  );
1068
- const tree = /* @__PURE__ */ jsx5(ShellInsetProvider, { value: sidebar ? reportShellInset : null, children: /* @__PURE__ */ jsxs4(
1251
+ const tree = /* @__PURE__ */ jsx5(ShellInsetProvider, { value: sidebar ? reportShellInset : null, children: /* @__PURE__ */ jsxs5(
1069
1252
  "div",
1070
1253
  {
1071
1254
  className: cn(
@@ -1120,15 +1303,15 @@ var AppShell = ({
1120
1303
  };
1121
1304
 
1122
1305
  // src/app/layout/AppShellTopbar.tsx
1123
- import { jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
1306
+ import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
1124
1307
  var AppShellTopbar = ({
1125
1308
  start,
1126
1309
  actions,
1127
1310
  children,
1128
1311
  className
1129
1312
  }) => {
1130
- return /* @__PURE__ */ jsxs5("div", { className: cn("aui-app-shell-topbar", appShellTopbarRowClass, className), children: [
1131
- /* @__PURE__ */ jsxs5("div", { className: "flex min-w-0 flex-1 items-center gap-2", children: [
1313
+ return /* @__PURE__ */ jsxs6("div", { className: cn("aui-app-shell-topbar", appShellTopbarRowClass, className), children: [
1314
+ /* @__PURE__ */ jsxs6("div", { className: "flex min-w-0 flex-1 items-center gap-2", children: [
1132
1315
  start,
1133
1316
  children
1134
1317
  ] }),
@@ -1166,15 +1349,15 @@ var AppShellChatTrigger = ({
1166
1349
  };
1167
1350
 
1168
1351
  // src/app/layout/PageHeader.tsx
1169
- import { jsx as jsx8, jsxs as jsxs6 } from "react/jsx-runtime";
1352
+ import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
1170
1353
  var PageHeader = ({
1171
1354
  title,
1172
1355
  description,
1173
1356
  actions,
1174
1357
  className
1175
1358
  }) => {
1176
- return /* @__PURE__ */ jsxs6("header", { className: cn("aui-app-page-header", appPageHeaderClass, className), children: [
1177
- /* @__PURE__ */ jsxs6("div", { className: "min-w-0", children: [
1359
+ return /* @__PURE__ */ jsxs7("header", { className: cn("aui-app-page-header", appPageHeaderClass, className), children: [
1360
+ /* @__PURE__ */ jsxs7("div", { className: "min-w-0", children: [
1178
1361
  /* @__PURE__ */ jsx8("h1", { className: "text-2xl font-semibold tracking-tight text-foreground", children: title }),
1179
1362
  description ? /* @__PURE__ */ jsx8("p", { className: "mt-1 text-sm text-muted-foreground", children: description }) : null
1180
1363
  ] }),
@@ -1183,14 +1366,14 @@ var PageHeader = ({
1183
1366
  };
1184
1367
 
1185
1368
  // src/app/layout/Page.tsx
1186
- import { jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
1369
+ import { jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
1187
1370
  var Page = ({
1188
1371
  children,
1189
1372
  breadcrumbs,
1190
1373
  className,
1191
1374
  ...headerProps
1192
1375
  }) => {
1193
- return /* @__PURE__ */ jsxs7("div", { className: cn("aui-app-page", appPageColumnClass, className), children: [
1376
+ return /* @__PURE__ */ jsxs8("div", { className: cn("aui-app-page", appPageColumnClass, className), children: [
1194
1377
  breadcrumbs,
1195
1378
  /* @__PURE__ */ jsx9(PageHeader, { ...headerProps }),
1196
1379
  children
@@ -1198,14 +1381,14 @@ var Page = ({
1198
1381
  };
1199
1382
 
1200
1383
  // src/app/layout/Section.tsx
1201
- import { jsx as jsx10, jsxs as jsxs8 } from "react/jsx-runtime";
1384
+ import { jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
1202
1385
  var Section = ({
1203
1386
  title,
1204
1387
  description,
1205
1388
  children,
1206
1389
  className
1207
1390
  }) => {
1208
- return /* @__PURE__ */ jsxs8("section", { className: cn("aui-app-section", appSectionClass, className), children: [
1391
+ return /* @__PURE__ */ jsxs9("section", { className: cn("aui-app-section", appSectionClass, className), children: [
1209
1392
  title ? /* @__PURE__ */ jsx10("h2", { className: appSectionTitleClass, children: title }) : null,
1210
1393
  description ? /* @__PURE__ */ jsx10("p", { className: appSectionDescriptionClass, children: description }) : null,
1211
1394
  children
@@ -1228,7 +1411,7 @@ function useAppCopilotContext() {
1228
1411
 
1229
1412
  // src/app/chat/AppChatPanel.tsx
1230
1413
  import { XIcon } from "lucide-react";
1231
- import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
1414
+ import { jsx as jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
1232
1415
  var shellClass = "aui-app-chat-panel flex h-full min-h-0 flex-col overflow-hidden";
1233
1416
  var chromeClass = cn(
1234
1417
  "aui-app-chat-panel-chrome relative z-20 flex min-h-10 shrink-0 items-center justify-end px-2 pt-2"
@@ -1273,7 +1456,7 @@ var AppChatPanel = ({
1273
1456
  ...rest
1274
1457
  }) => {
1275
1458
  const shellChat = useAppShellChat();
1276
- return /* @__PURE__ */ jsxs9("div", { className: cn(shellClass, className), children: [
1459
+ return /* @__PURE__ */ jsxs10("div", { className: cn(shellClass, className), children: [
1277
1460
  shellChat?.collapsible ? /* @__PURE__ */ jsx12("div", { className: chromeClass, children: /* @__PURE__ */ jsx12(
1278
1461
  "button",
1279
1462
  {
@@ -1321,9 +1504,9 @@ var SurfaceCard = ({ children, className }) => {
1321
1504
  };
1322
1505
 
1323
1506
  // src/app/surfaces/StatTile.tsx
1324
- import { jsx as jsx14, jsxs as jsxs10 } from "react/jsx-runtime";
1507
+ import { jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
1325
1508
  var StatTile = ({ label, value, hint, className }) => {
1326
- return /* @__PURE__ */ jsxs10("div", { className: cn("aui-app-stat-tile", appStatTileClass, className), children: [
1509
+ return /* @__PURE__ */ jsxs11("div", { className: cn("aui-app-stat-tile", appStatTileClass, className), children: [
1327
1510
  /* @__PURE__ */ jsx14("span", { className: appStatLabelClass, children: label }),
1328
1511
  /* @__PURE__ */ jsx14("span", { className: appStatValueClass, children: value }),
1329
1512
  hint ? /* @__PURE__ */ jsx14("span", { className: "text-xs text-muted-foreground", children: hint }) : null
@@ -1331,14 +1514,14 @@ var StatTile = ({ label, value, hint, className }) => {
1331
1514
  };
1332
1515
 
1333
1516
  // src/app/surfaces/EmptyState.tsx
1334
- import { jsx as jsx15, jsxs as jsxs11 } from "react/jsx-runtime";
1517
+ import { jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
1335
1518
  var EmptyState = ({
1336
1519
  title,
1337
1520
  description,
1338
1521
  action,
1339
1522
  className
1340
1523
  }) => {
1341
- return /* @__PURE__ */ jsxs11("div", { className: cn("aui-app-empty-state", appEmptyStateClass, className), children: [
1524
+ return /* @__PURE__ */ jsxs12("div", { className: cn("aui-app-empty-state", appEmptyStateClass, className), children: [
1342
1525
  /* @__PURE__ */ jsx15("p", { className: appEmptyStateTitleClass, children: title }),
1343
1526
  description ? /* @__PURE__ */ jsx15("p", { className: appEmptyStateDescriptionClass, children: description }) : null,
1344
1527
  action
@@ -1373,7 +1556,7 @@ var StatusBadge = ({
1373
1556
  };
1374
1557
 
1375
1558
  // src/app/surfaces/AppConfirmDialog.tsx
1376
- import { jsx as jsx17, jsxs as jsxs12 } from "react/jsx-runtime";
1559
+ import { jsx as jsx17, jsxs as jsxs13 } from "react/jsx-runtime";
1377
1560
  var bodyClass2 = "flex flex-col gap-4 p-6";
1378
1561
  var titleClass = "pr-8";
1379
1562
  var actionsClass = "flex flex-wrap justify-end gap-2";
@@ -1392,10 +1575,10 @@ var AppConfirmDialog = ({
1392
1575
  DialogContent,
1393
1576
  {
1394
1577
  className: cn("gap-0 p-0 sm:max-w-md", className),
1395
- children: /* @__PURE__ */ jsxs12("div", { className: bodyClass2, children: [
1578
+ children: /* @__PURE__ */ jsxs13("div", { className: bodyClass2, children: [
1396
1579
  /* @__PURE__ */ jsx17(DialogTitle, { className: titleClass, children: title }),
1397
1580
  description ? /* @__PURE__ */ jsx17("p", { className: "text-sm text-muted-foreground", children: description }) : null,
1398
- /* @__PURE__ */ jsxs12("div", { className: actionsClass, children: [
1581
+ /* @__PURE__ */ jsxs13("div", { className: actionsClass, children: [
1399
1582
  /* @__PURE__ */ jsx17(
1400
1583
  TimbalV2Button,
1401
1584
  {
@@ -1426,7 +1609,7 @@ var AppConfirmDialog = ({
1426
1609
  };
1427
1610
 
1428
1611
  // src/app/surfaces/InfoCard.tsx
1429
- import { jsx as jsx18, jsxs as jsxs13 } from "react/jsx-runtime";
1612
+ import { jsx as jsx18, jsxs as jsxs14 } from "react/jsx-runtime";
1430
1613
  var toneClass = {
1431
1614
  neutral: "border-border bg-muted/40",
1432
1615
  info: "border-primary/25 bg-primary/5",
@@ -1441,7 +1624,7 @@ var InfoCard = ({
1441
1624
  action,
1442
1625
  tone = "neutral",
1443
1626
  className
1444
- }) => /* @__PURE__ */ jsxs13(
1627
+ }) => /* @__PURE__ */ jsxs14(
1445
1628
  "div",
1446
1629
  {
1447
1630
  className: cn(
@@ -1451,7 +1634,7 @@ var InfoCard = ({
1451
1634
  ),
1452
1635
  children: [
1453
1636
  icon ? /* @__PURE__ */ jsx18("span", { className: "mt-0.5 shrink-0 text-muted-foreground", children: icon }) : null,
1454
- /* @__PURE__ */ jsxs13("div", { className: "min-w-0 flex-1", children: [
1637
+ /* @__PURE__ */ jsxs14("div", { className: "min-w-0 flex-1", children: [
1455
1638
  title ? /* @__PURE__ */ jsx18("p", { className: "text-sm font-medium text-foreground", children: title }) : null,
1456
1639
  children ? /* @__PURE__ */ jsx18("div", { className: cn("text-sm text-muted-foreground", title && "mt-1"), children }) : null
1457
1640
  ] }),
@@ -1461,7 +1644,7 @@ var InfoCard = ({
1461
1644
  );
1462
1645
 
1463
1646
  // src/app/surfaces/StatusDot.tsx
1464
- import { jsx as jsx19, jsxs as jsxs14 } from "react/jsx-runtime";
1647
+ import { jsx as jsx19, jsxs as jsxs15 } from "react/jsx-runtime";
1465
1648
  var dotClass = {
1466
1649
  online: "bg-emerald-500",
1467
1650
  busy: "bg-amber-500",
@@ -1474,8 +1657,8 @@ var StatusDot = ({
1474
1657
  label,
1475
1658
  pulse = false,
1476
1659
  className
1477
- }) => /* @__PURE__ */ jsxs14("span", { className: cn("inline-flex items-center gap-1.5", className), children: [
1478
- /* @__PURE__ */ jsxs14("span", { className: "relative flex size-2", children: [
1660
+ }) => /* @__PURE__ */ jsxs15("span", { className: cn("inline-flex items-center gap-1.5", className), children: [
1661
+ /* @__PURE__ */ jsxs15("span", { className: "relative flex size-2", children: [
1479
1662
  pulse ? /* @__PURE__ */ jsx19(
1480
1663
  "span",
1481
1664
  {
@@ -1491,7 +1674,7 @@ var StatusDot = ({
1491
1674
  ] });
1492
1675
 
1493
1676
  // src/app/surfaces/DescriptionList.tsx
1494
- import { jsx as jsx20, jsxs as jsxs15 } from "react/jsx-runtime";
1677
+ import { jsx as jsx20, jsxs as jsxs16 } from "react/jsx-runtime";
1495
1678
  var DescriptionList = ({
1496
1679
  items,
1497
1680
  stacked = false,
@@ -1503,7 +1686,7 @@ var DescriptionList = ({
1503
1686
  "divide-y divide-border rounded-xl border border-border bg-card",
1504
1687
  className
1505
1688
  ),
1506
- children: items.map((item, i) => /* @__PURE__ */ jsxs15(
1689
+ children: items.map((item, i) => /* @__PURE__ */ jsxs16(
1507
1690
  "div",
1508
1691
  {
1509
1692
  className: cn(
@@ -1532,7 +1715,7 @@ var DescriptionList = ({
1532
1715
  // src/app/surfaces/ExpandableSection.tsx
1533
1716
  import { useId, useState as useState2 } from "react";
1534
1717
  import { AnimatePresence, motion as motion2, useReducedMotion as useReducedMotion2 } from "motion/react";
1535
- import { jsx as jsx21, jsxs as jsxs16 } from "react/jsx-runtime";
1718
+ import { jsx as jsx21, jsxs as jsxs17 } from "react/jsx-runtime";
1536
1719
  var Chevron = ({ open }) => /* @__PURE__ */ jsx21(
1537
1720
  "svg",
1538
1721
  {
@@ -1568,8 +1751,8 @@ var ExpandableSection = ({
1568
1751
  if (openProp == null) setInternalOpen((o) => !o);
1569
1752
  onOpenChange?.(!open);
1570
1753
  };
1571
- return /* @__PURE__ */ jsxs16("div", { className: cn("border-b border-border last:border-0", className), children: [
1572
- /* @__PURE__ */ jsxs16(
1754
+ return /* @__PURE__ */ jsxs17("div", { className: cn("border-b border-border last:border-0", className), children: [
1755
+ /* @__PURE__ */ jsxs17(
1573
1756
  "button",
1574
1757
  {
1575
1758
  type: "button",
@@ -1578,7 +1761,7 @@ var ExpandableSection = ({
1578
1761
  "aria-controls": panelId,
1579
1762
  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",
1580
1763
  children: [
1581
- /* @__PURE__ */ jsxs16("span", { className: "flex min-w-0 items-center gap-3", children: [
1764
+ /* @__PURE__ */ jsxs17("span", { className: "flex min-w-0 items-center gap-3", children: [
1582
1765
  icon ? /* @__PURE__ */ jsx21("span", { className: "flex size-8 items-center justify-center rounded-lg border border-border bg-muted text-muted-foreground", children: icon }) : null,
1583
1766
  /* @__PURE__ */ jsx21("span", { className: "truncate text-sm font-medium text-foreground", children: title }),
1584
1767
  count != null ? /* @__PURE__ */ jsx21("span", { className: "rounded-full border border-border bg-muted px-2 py-0.5 text-xs text-muted-foreground", children: count }) : null
@@ -1604,7 +1787,7 @@ var ExpandableSection = ({
1604
1787
  };
1605
1788
 
1606
1789
  // src/app/surfaces/ResourceCard.tsx
1607
- import { Fragment as Fragment2, jsx as jsx22, jsxs as jsxs17 } from "react/jsx-runtime";
1790
+ import { Fragment as Fragment3, jsx as jsx22, jsxs as jsxs18 } from "react/jsx-runtime";
1608
1791
  var resourceCardShellClass = cn(
1609
1792
  "flex min-h-[8.5rem] flex-col rounded-2xl p-4 text-left font-normal",
1610
1793
  TIMBAL_V2_ELEVATED_SURFACE
@@ -1629,16 +1812,16 @@ var ResourceCard = ({
1629
1812
  ariaLabel,
1630
1813
  className
1631
1814
  }) => {
1632
- const body = /* @__PURE__ */ jsxs17(Fragment2, { children: [
1633
- /* @__PURE__ */ jsxs17("div", { className: "flex items-start gap-3", children: [
1815
+ const body = /* @__PURE__ */ jsxs18(Fragment3, { children: [
1816
+ /* @__PURE__ */ jsxs18("div", { className: "flex items-start gap-3", children: [
1634
1817
  media ? /* @__PURE__ */ jsx22("span", { className: mediaShellClass, children: media }) : null,
1635
- /* @__PURE__ */ jsxs17("div", { className: "min-w-0 flex-1 pt-0.5", children: [
1818
+ /* @__PURE__ */ jsxs18("div", { className: "min-w-0 flex-1 pt-0.5", children: [
1636
1819
  /* @__PURE__ */ jsx22("p", { className: "truncate text-sm font-normal leading-snug text-foreground", children: title }),
1637
1820
  subtitle ? /* @__PURE__ */ jsx22("p", { className: "mt-1 line-clamp-2 text-xs font-normal text-muted-foreground", children: subtitle }) : null
1638
1821
  ] }),
1639
1822
  badge ? /* @__PURE__ */ jsx22("span", { className: "shrink-0 pt-0.5", children: badge }) : null
1640
1823
  ] }),
1641
- footer || action ? /* @__PURE__ */ jsxs17("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: [
1824
+ footer || action ? /* @__PURE__ */ jsxs18("div", { className: "mt-auto flex items-center justify-between gap-3 border-t border-border/40 pt-3 text-xs font-normal text-muted-foreground", children: [
1642
1825
  /* @__PURE__ */ jsx22("span", { className: "min-w-0 truncate", children: footer }),
1643
1826
  action ? /* @__PURE__ */ jsx22("span", { className: "shrink-0 opacity-80", children: action }) : null
1644
1827
  ] }) : null
@@ -1650,12 +1833,12 @@ var ResourceCard = ({
1650
1833
  };
1651
1834
 
1652
1835
  // src/app/settings/SettingsSection.tsx
1653
- import { jsx as jsx23, jsxs as jsxs18 } from "react/jsx-runtime";
1836
+ import { jsx as jsx23, jsxs as jsxs19 } from "react/jsx-runtime";
1654
1837
  var SettingsSectionHeader = ({
1655
1838
  title,
1656
1839
  description,
1657
1840
  className
1658
- }) => /* @__PURE__ */ jsxs18("div", { className: cn("flex flex-col", className), children: [
1841
+ }) => /* @__PURE__ */ jsxs19("div", { className: cn("flex flex-col", className), children: [
1659
1842
  /* @__PURE__ */ jsx23("h3", { className: "text-[17px] font-medium leading-tight text-foreground", children: title }),
1660
1843
  description ? /* @__PURE__ */ jsx23("p", { className: "mt-1 text-sm text-muted-foreground", children: description }) : null
1661
1844
  ] });
@@ -1666,7 +1849,7 @@ var SettingsSection = ({
1666
1849
  children,
1667
1850
  noBorderTop = false,
1668
1851
  className
1669
- }) => /* @__PURE__ */ jsxs18(
1852
+ }) => /* @__PURE__ */ jsxs19(
1670
1853
  "section",
1671
1854
  {
1672
1855
  className: cn(
@@ -1675,7 +1858,7 @@ var SettingsSection = ({
1675
1858
  className
1676
1859
  ),
1677
1860
  children: [
1678
- /* @__PURE__ */ jsxs18("div", { className: "min-w-0", children: [
1861
+ /* @__PURE__ */ jsxs19("div", { className: "min-w-0", children: [
1679
1862
  /* @__PURE__ */ jsx23("h2", { className: "text-sm font-medium text-foreground", children: title }),
1680
1863
  description ? /* @__PURE__ */ jsx23("p", { className: "mt-1 text-sm text-muted-foreground", children: description }) : null,
1681
1864
  descriptionFooter ? /* @__PURE__ */ jsx23("div", { className: "mt-3 min-w-0", children: descriptionFooter }) : null
@@ -1686,7 +1869,7 @@ var SettingsSection = ({
1686
1869
  );
1687
1870
 
1688
1871
  // src/app/settings/FieldRow.tsx
1689
- import { jsx as jsx24, jsxs as jsxs19 } from "react/jsx-runtime";
1872
+ import { jsx as jsx24, jsxs as jsxs20 } from "react/jsx-runtime";
1690
1873
  var FieldRow = ({
1691
1874
  label,
1692
1875
  children,
@@ -1696,7 +1879,7 @@ var FieldRow = ({
1696
1879
  className
1697
1880
  }) => {
1698
1881
  if (inline) {
1699
- return /* @__PURE__ */ jsxs19(
1882
+ return /* @__PURE__ */ jsxs20(
1700
1883
  "div",
1701
1884
  {
1702
1885
  className: cn(
@@ -1704,7 +1887,7 @@ var FieldRow = ({
1704
1887
  className
1705
1888
  ),
1706
1889
  children: [
1707
- /* @__PURE__ */ jsxs19("div", { className: "min-w-0", children: [
1890
+ /* @__PURE__ */ jsxs20("div", { className: "min-w-0", children: [
1708
1891
  /* @__PURE__ */ jsx24(
1709
1892
  "label",
1710
1893
  {
@@ -1720,7 +1903,7 @@ var FieldRow = ({
1720
1903
  }
1721
1904
  );
1722
1905
  }
1723
- return /* @__PURE__ */ jsxs19("div", { className: cn("flex flex-col gap-1.5", className), children: [
1906
+ return /* @__PURE__ */ jsxs20("div", { className: cn("flex flex-col gap-1.5", className), children: [
1724
1907
  /* @__PURE__ */ jsx24("label", { htmlFor, className: "text-sm font-medium text-foreground", children: label }),
1725
1908
  children,
1726
1909
  description ? /* @__PURE__ */ jsx24("p", { className: "text-xs text-muted-foreground", children: description }) : null
@@ -1731,7 +1914,7 @@ var FieldRow = ({
1731
1914
  import { useEffect, useState as useState3 } from "react";
1732
1915
  import { createPortal } from "react-dom";
1733
1916
  import { AnimatePresence as AnimatePresence2, motion as motion3, useReducedMotion as useReducedMotion3 } from "motion/react";
1734
- import { jsx as jsx25, jsxs as jsxs20 } from "react/jsx-runtime";
1917
+ import { jsx as jsx25, jsxs as jsxs21 } from "react/jsx-runtime";
1735
1918
  var FloatingUnsavedChangesBar = ({
1736
1919
  visible,
1737
1920
  message = "Unsaved changes",
@@ -1749,7 +1932,7 @@ var FloatingUnsavedChangesBar = ({
1749
1932
  useEffect(() => setMounted(true), []);
1750
1933
  if (!mounted || typeof document === "undefined") return null;
1751
1934
  return createPortal(
1752
- /* @__PURE__ */ jsx25(AnimatePresence2, { children: visible ? /* @__PURE__ */ jsx25("div", { className: "pointer-events-none fixed inset-x-0 bottom-5 z-50 flex justify-center px-4", children: /* @__PURE__ */ jsxs20(
1935
+ /* @__PURE__ */ jsx25(AnimatePresence2, { children: visible ? /* @__PURE__ */ jsx25("div", { className: "pointer-events-none fixed inset-x-0 bottom-5 z-50 flex justify-center px-4", children: /* @__PURE__ */ jsxs21(
1753
1936
  motion3.div,
1754
1937
  {
1755
1938
  role: "region",
@@ -1764,7 +1947,7 @@ var FloatingUnsavedChangesBar = ({
1764
1947
  ),
1765
1948
  children: [
1766
1949
  /* @__PURE__ */ jsx25("span", { className: "text-sm text-muted-foreground", children: message }),
1767
- /* @__PURE__ */ jsxs20("span", { className: "flex items-center gap-1.5", children: [
1950
+ /* @__PURE__ */ jsxs21("span", { className: "flex items-center gap-1.5", children: [
1768
1951
  /* @__PURE__ */ jsx25(Button, { variant: "ghost", size: "sm", onClick: onDiscard, disabled: isSaving, children: discardLabel }),
1769
1952
  /* @__PURE__ */ jsx25(Button, { size: "sm", onClick: onSave, disabled: saveDisabled || isSaving, children: isSaving ? "Saving\u2026" : saveLabel })
1770
1953
  ] })
@@ -1776,13 +1959,13 @@ var FloatingUnsavedChangesBar = ({
1776
1959
  };
1777
1960
 
1778
1961
  // src/app/settings/DangerZone.tsx
1779
- import { jsx as jsx26, jsxs as jsxs21 } from "react/jsx-runtime";
1962
+ import { jsx as jsx26, jsxs as jsxs22 } from "react/jsx-runtime";
1780
1963
  var DangerZoneAction = ({
1781
1964
  title,
1782
1965
  description,
1783
1966
  action,
1784
1967
  className
1785
- }) => /* @__PURE__ */ jsxs21(
1968
+ }) => /* @__PURE__ */ jsxs22(
1786
1969
  "div",
1787
1970
  {
1788
1971
  className: cn(
@@ -1790,7 +1973,7 @@ var DangerZoneAction = ({
1790
1973
  className
1791
1974
  ),
1792
1975
  children: [
1793
- /* @__PURE__ */ jsxs21("div", { className: "min-w-0", children: [
1976
+ /* @__PURE__ */ jsxs22("div", { className: "min-w-0", children: [
1794
1977
  /* @__PURE__ */ jsx26("p", { className: "text-sm font-medium text-foreground", children: title }),
1795
1978
  description ? /* @__PURE__ */ jsx26("p", { className: "mt-0.5 text-sm text-muted-foreground", children: description }) : null
1796
1979
  ] }),
@@ -1803,7 +1986,7 @@ var DangerZone = ({
1803
1986
  description,
1804
1987
  children,
1805
1988
  className
1806
- }) => /* @__PURE__ */ jsxs21(
1989
+ }) => /* @__PURE__ */ jsxs22(
1807
1990
  "section",
1808
1991
  {
1809
1992
  className: cn(
@@ -1811,7 +1994,7 @@ var DangerZone = ({
1811
1994
  className
1812
1995
  ),
1813
1996
  children: [
1814
- (title || description) && /* @__PURE__ */ jsxs21("header", { className: "border-b border-destructive/20 bg-destructive/5 px-4 py-3", children: [
1997
+ (title || description) && /* @__PURE__ */ jsxs22("header", { className: "border-b border-destructive/20 bg-destructive/5 px-4 py-3", children: [
1815
1998
  title ? /* @__PURE__ */ jsx26("h3", { className: "text-sm font-semibold text-destructive", children: title }) : null,
1816
1999
  description ? /* @__PURE__ */ jsx26("p", { className: "mt-0.5 text-sm text-muted-foreground", children: description }) : null
1817
2000
  ] }),
@@ -1822,7 +2005,7 @@ var DangerZone = ({
1822
2005
 
1823
2006
  // src/app/integrations/IntegrationCard.tsx
1824
2007
  import { useId as useId2 } from "react";
1825
- import { Fragment as Fragment3, jsx as jsx27, jsxs as jsxs22 } from "react/jsx-runtime";
2008
+ import { Fragment as Fragment4, jsx as jsx27, jsxs as jsxs23 } from "react/jsx-runtime";
1826
2009
  var INTEGRATION_CATALOG_CARD_HEIGHT_CLASS = "h-[12.25rem] min-h-[12.25rem] max-h-[12.25rem]";
1827
2010
  var statusLabel = {
1828
2011
  available: null,
@@ -1863,11 +2046,11 @@ var IntegrationCard = ({
1863
2046
  const titleId = useId2();
1864
2047
  const locked = status === "locked";
1865
2048
  const dimmed = status === "disabled" || locked;
1866
- const body = /* @__PURE__ */ jsxs22("div", { className: "flex h-full min-h-0 flex-col", children: [
1867
- /* @__PURE__ */ jsxs22("div", { className: "flex shrink-0 items-start gap-3 pr-2", children: [
2049
+ const body = /* @__PURE__ */ jsxs23("div", { className: "flex h-full min-h-0 flex-col", children: [
2050
+ /* @__PURE__ */ jsxs23("div", { className: "flex shrink-0 items-start gap-3 pr-2", children: [
1868
2051
  logo ? /* @__PURE__ */ jsx27("span", { className: logoShellClass, "aria-hidden": Boolean(ariaLabel), children: logo }) : null,
1869
- /* @__PURE__ */ jsx27("div", { className: "min-w-0 flex-1 pt-0.5", children: /* @__PURE__ */ jsxs22("div", { className: "flex items-start justify-between gap-2", children: [
1870
- /* @__PURE__ */ jsxs22("div", { className: "min-w-0", children: [
2052
+ /* @__PURE__ */ jsx27("div", { className: "min-w-0 flex-1 pt-0.5", children: /* @__PURE__ */ jsxs23("div", { className: "flex items-start justify-between gap-2", children: [
2053
+ /* @__PURE__ */ jsxs23("div", { className: "min-w-0", children: [
1871
2054
  /* @__PURE__ */ jsx27(
1872
2055
  "h4",
1873
2056
  {
@@ -1891,7 +2074,7 @@ var IntegrationCard = ({
1891
2074
  children: description
1892
2075
  }
1893
2076
  ) : null,
1894
- action ? /* @__PURE__ */ jsxs22(Fragment3, { children: [
2077
+ action ? /* @__PURE__ */ jsxs23(Fragment4, { children: [
1895
2078
  /* @__PURE__ */ jsx27("div", { className: "min-h-0 flex-1", "aria-hidden": true }),
1896
2079
  /* @__PURE__ */ jsx27("div", { className: "relative mt-3 shrink-0", children: action })
1897
2080
  ] }) : null
@@ -1925,7 +2108,7 @@ var IntegrationCard = ({
1925
2108
 
1926
2109
  // src/app/integrations/IntegrationsEmptyState.tsx
1927
2110
  import { useId as useId3 } from "react";
1928
- import { jsx as jsx28, jsxs as jsxs23 } from "react/jsx-runtime";
2111
+ import { jsx as jsx28, jsxs as jsxs24 } from "react/jsx-runtime";
1929
2112
  var IntegrationsEmptyState = ({
1930
2113
  title = "No integrations yet",
1931
2114
  description = "Connect a provider to start syncing data and powering your workforce.",
@@ -1934,7 +2117,7 @@ var IntegrationsEmptyState = ({
1934
2117
  className
1935
2118
  }) => {
1936
2119
  const titleId = useId3();
1937
- return /* @__PURE__ */ jsxs23(
2120
+ return /* @__PURE__ */ jsxs24(
1938
2121
  "section",
1939
2122
  {
1940
2123
  className: cn(
@@ -1970,7 +2153,7 @@ var planBadgeClass = "inline-flex h-5 max-w-full shrink-0 items-center rounded-m
1970
2153
  var PlanBadge = ({ children, className }) => /* @__PURE__ */ jsx29("span", { className: cn(planBadgeClass, className), children });
1971
2154
 
1972
2155
  // src/app/integrations/ConnectionRow.tsx
1973
- import { Fragment as Fragment4, jsx as jsx30, jsxs as jsxs24 } from "react/jsx-runtime";
2156
+ import { Fragment as Fragment5, jsx as jsx30, jsxs as jsxs25 } from "react/jsx-runtime";
1974
2157
  var logoShellClass2 = cn(
1975
2158
  "flex size-9 shrink-0 items-center justify-center overflow-hidden rounded-lg",
1976
2159
  TIMBAL_V2_LOGO_TILE
@@ -1985,9 +2168,9 @@ var ConnectionRow = ({
1985
2168
  ariaLabel,
1986
2169
  className
1987
2170
  }) => {
1988
- const inner = /* @__PURE__ */ jsxs24(Fragment4, { children: [
2171
+ const inner = /* @__PURE__ */ jsxs25(Fragment5, { children: [
1989
2172
  logo ? /* @__PURE__ */ jsx30("span", { className: logoShellClass2, children: logo }) : null,
1990
- /* @__PURE__ */ jsxs24("div", { className: "min-w-0 flex-1", children: [
2173
+ /* @__PURE__ */ jsxs25("div", { className: "min-w-0 flex-1", children: [
1991
2174
  /* @__PURE__ */ jsx30("p", { className: "truncate text-sm font-normal text-foreground", children: name }),
1992
2175
  meta ? /* @__PURE__ */ jsx30("p", { className: "truncate text-xs text-muted-foreground", children: meta }) : null
1993
2176
  ] }),
@@ -2059,11 +2242,11 @@ var SubNav = ({
2059
2242
  };
2060
2243
 
2061
2244
  // src/app/navigation/Breadcrumbs.tsx
2062
- import { jsx as jsx33, jsxs as jsxs25 } from "react/jsx-runtime";
2245
+ import { jsx as jsx33, jsxs as jsxs26 } from "react/jsx-runtime";
2063
2246
  var Breadcrumbs = ({ items, className }) => {
2064
2247
  return /* @__PURE__ */ jsx33("nav", { className: cn("aui-app-breadcrumbs", appBreadcrumbsClass, className), "aria-label": "Breadcrumb", children: /* @__PURE__ */ jsx33("ol", { className: "flex flex-wrap items-center gap-1.5", children: items.map((item, index) => {
2065
2248
  const isLast = index === items.length - 1;
2066
- return /* @__PURE__ */ jsxs25("li", { className: "inline-flex items-center gap-1.5", children: [
2249
+ return /* @__PURE__ */ jsxs26("li", { className: "inline-flex items-center gap-1.5", children: [
2067
2250
  index > 0 ? /* @__PURE__ */ jsx33("span", { className: "text-muted-foreground/50", "aria-hidden": true, children: "/" }) : null,
2068
2251
  isLast ? /* @__PURE__ */ jsx33("span", { className: "text-foreground", "aria-current": "page", children: item.label }) : item.href ? /* @__PURE__ */ jsx33("a", { href: item.href, className: appBreadcrumbLinkClass, children: item.label }) : /* @__PURE__ */ jsx33(
2069
2252
  "button",
@@ -2079,7 +2262,7 @@ var Breadcrumbs = ({ items, className }) => {
2079
2262
  };
2080
2263
 
2081
2264
  // src/app/forms/Field.tsx
2082
- import { jsx as jsx34, jsxs as jsxs26 } from "react/jsx-runtime";
2265
+ import { jsx as jsx34, jsxs as jsxs27 } from "react/jsx-runtime";
2083
2266
  var Field = ({
2084
2267
  label,
2085
2268
  hint,
@@ -2088,7 +2271,7 @@ var Field = ({
2088
2271
  className,
2089
2272
  htmlFor
2090
2273
  }) => {
2091
- return /* @__PURE__ */ jsxs26("div", { className: cn("aui-app-field", appFieldClass, className), children: [
2274
+ return /* @__PURE__ */ jsxs27("div", { className: cn("aui-app-field", appFieldClass, className), children: [
2092
2275
  /* @__PURE__ */ jsx34("label", { className: appFieldLabelClass, htmlFor, children: label }),
2093
2276
  children,
2094
2277
  hint && !error ? /* @__PURE__ */ jsx34("p", { className: appFieldHintClass, children: hint }) : null,
@@ -2165,7 +2348,7 @@ var FieldTextarea = ({
2165
2348
 
2166
2349
  // src/app/forms/FieldSelect.tsx
2167
2350
  import { ChevronDownIcon } from "lucide-react";
2168
- import { jsx as jsx36, jsxs as jsxs27 } from "react/jsx-runtime";
2351
+ import { jsx as jsx36, jsxs as jsxs28 } from "react/jsx-runtime";
2169
2352
  var selectWrapClass = "relative";
2170
2353
  var selectClass = cn(
2171
2354
  appInputClass,
@@ -2190,7 +2373,7 @@ var FieldSelect = ({
2190
2373
  error,
2191
2374
  htmlFor: selectId,
2192
2375
  className: fieldClassName,
2193
- children: /* @__PURE__ */ jsxs27("div", { className: selectWrapClass, children: [
2376
+ children: /* @__PURE__ */ jsxs28("div", { className: selectWrapClass, children: [
2194
2377
  /* @__PURE__ */ jsx36(
2195
2378
  "select",
2196
2379
  {
@@ -2214,7 +2397,7 @@ var FieldSelect = ({
2214
2397
  };
2215
2398
 
2216
2399
  // src/app/forms/FieldSwitch.tsx
2217
- import { jsx as jsx37, jsxs as jsxs28 } from "react/jsx-runtime";
2400
+ import { jsx as jsx37, jsxs as jsxs29 } from "react/jsx-runtime";
2218
2401
  var trackClass = cn(
2219
2402
  "relative inline-flex h-5 w-9 shrink-0 items-center rounded-full transition-[background,box-shadow,border-color] duration-200",
2220
2403
  "peer-focus-visible:ring-2 peer-focus-visible:ring-foreground/10",
@@ -2235,7 +2418,7 @@ var FieldSwitch = ({
2235
2418
  ...props
2236
2419
  }) => {
2237
2420
  const inputId = id ?? props.name ?? "switch";
2238
- return /* @__PURE__ */ jsxs28(
2421
+ return /* @__PURE__ */ jsxs29(
2239
2422
  "label",
2240
2423
  {
2241
2424
  className: cn(
@@ -2244,7 +2427,7 @@ var FieldSwitch = ({
2244
2427
  ),
2245
2428
  htmlFor: inputId,
2246
2429
  children: [
2247
- /* @__PURE__ */ jsxs28("span", { className: "relative mt-0.5", children: [
2430
+ /* @__PURE__ */ jsxs29("span", { className: "relative mt-0.5", children: [
2248
2431
  /* @__PURE__ */ jsx37(
2249
2432
  "input",
2250
2433
  {
@@ -2257,7 +2440,7 @@ var FieldSwitch = ({
2257
2440
  ),
2258
2441
  /* @__PURE__ */ jsx37("span", { className: trackClass, "aria-hidden": true, children: /* @__PURE__ */ jsx37("span", { className: thumbClass }) })
2259
2442
  ] }),
2260
- /* @__PURE__ */ jsxs28("span", { className: "flex min-w-0 flex-col gap-0.5", children: [
2443
+ /* @__PURE__ */ jsxs29("span", { className: "flex min-w-0 flex-col gap-0.5", children: [
2261
2444
  /* @__PURE__ */ jsx37("span", { className: "text-sm font-medium text-foreground", children: label }),
2262
2445
  description ? /* @__PURE__ */ jsx37("span", { className: "text-xs text-muted-foreground", children: description }) : null
2263
2446
  ] })
@@ -2268,13 +2451,13 @@ var FieldSwitch = ({
2268
2451
 
2269
2452
  // src/app/forms/SearchInput.tsx
2270
2453
  import { SearchIcon } from "lucide-react";
2271
- import { jsx as jsx38, jsxs as jsxs29 } from "react/jsx-runtime";
2454
+ import { jsx as jsx38, jsxs as jsxs30 } from "react/jsx-runtime";
2272
2455
  var SearchInput = ({
2273
2456
  className,
2274
2457
  placeholder = "Search\u2026",
2275
2458
  ...props
2276
2459
  }) => {
2277
- return /* @__PURE__ */ jsxs29(
2460
+ return /* @__PURE__ */ jsxs30(
2278
2461
  "label",
2279
2462
  {
2280
2463
  className: cn(
@@ -2299,9 +2482,9 @@ var SearchInput = ({
2299
2482
  };
2300
2483
 
2301
2484
  // src/app/forms/FormSection.tsx
2302
- import { jsx as jsx39, jsxs as jsxs30 } from "react/jsx-runtime";
2485
+ import { jsx as jsx39, jsxs as jsxs31 } from "react/jsx-runtime";
2303
2486
  var FormSection = ({ title, children, className }) => {
2304
- return /* @__PURE__ */ jsxs30("fieldset", { className: cn("aui-app-form-section", appSectionClass, "border-0 p-0", className), children: [
2487
+ return /* @__PURE__ */ jsxs31("fieldset", { className: cn("aui-app-form-section", appSectionClass, "border-0 p-0", className), children: [
2305
2488
  title ? /* @__PURE__ */ jsx39("legend", { className: cn(appSectionTitleClass, "mb-3 px-0"), children: title }) : null,
2306
2489
  /* @__PURE__ */ jsx39("div", { className: "flex flex-col gap-4", children })
2307
2490
  ] });
@@ -2324,7 +2507,7 @@ var FilterBar = ({ children, className }) => {
2324
2507
  // src/app/data/DataTable.tsx
2325
2508
  import { useMemo, useState as useState4 } from "react";
2326
2509
  import { ArrowDownIcon, ArrowUpDownIcon, ArrowUpIcon } from "lucide-react";
2327
- import { jsx as jsx41, jsxs as jsxs31 } from "react/jsx-runtime";
2510
+ import { jsx as jsx41, jsxs as jsxs32 } from "react/jsx-runtime";
2328
2511
  var shellClass2 = "overflow-hidden rounded-xl border border-border bg-card shadow-card";
2329
2512
  var tableClass = "w-full border-collapse bg-transparent text-sm";
2330
2513
  var headCellClass = "border-b border-border/60 bg-transparent px-4 py-2.5 text-left text-xs font-medium uppercase tracking-wide text-muted-foreground";
@@ -2424,12 +2607,12 @@ function DataTable({
2424
2607
  }
2425
2608
  const rowCountText = rowCountLabel?.(sortedRows.length) ?? `${sortedRows.length} row${sortedRows.length === 1 ? "" : "s"}`;
2426
2609
  const hasFoot = Boolean((showRowCount || footer) && sortedRows.length > 0);
2427
- return /* @__PURE__ */ jsx41("div", { className: cn("aui-app-data-table", shellClass2, className), children: /* @__PURE__ */ jsx41("div", { className: "overflow-x-auto", children: /* @__PURE__ */ jsxs31("table", { className: tableClass, children: [
2610
+ return /* @__PURE__ */ jsx41("div", { className: cn("aui-app-data-table", shellClass2, className), children: /* @__PURE__ */ jsx41("div", { className: "overflow-x-auto", children: /* @__PURE__ */ jsxs32("table", { className: tableClass, children: [
2428
2611
  caption ? /* @__PURE__ */ jsx41("caption", { className: "sr-only", children: caption }) : null,
2429
2612
  /* @__PURE__ */ jsx41("thead", { className: cn(stickyHeader && stickyHeadClass), children: /* @__PURE__ */ jsx41("tr", { children: columns.map((col) => {
2430
2613
  const isSorted = sort?.columnId === col.id;
2431
2614
  const ariaSort = col.sortable ? isSorted ? sort.direction === "asc" ? "ascending" : "descending" : "none" : void 0;
2432
- const headerContent = col.sortable ? /* @__PURE__ */ jsxs31(
2615
+ const headerContent = col.sortable ? /* @__PURE__ */ jsxs32(
2433
2616
  "button",
2434
2617
  {
2435
2618
  type: "button",
@@ -2457,7 +2640,7 @@ function DataTable({
2457
2640
  col.id
2458
2641
  );
2459
2642
  }) }) }),
2460
- /* @__PURE__ */ jsx41("tbody", { className: cn(!hasFoot && "[&_tr:last-child_td]:border-b-0"), children: sortedRows.length === 0 ? /* @__PURE__ */ jsx41("tr", { children: /* @__PURE__ */ jsx41("td", { colSpan: columns.length, className: emptyCellClass, children: /* @__PURE__ */ jsxs31("div", { className: "flex flex-col items-center gap-1", children: [
2643
+ /* @__PURE__ */ jsx41("tbody", { className: cn(!hasFoot && "[&_tr:last-child_td]:border-b-0"), children: sortedRows.length === 0 ? /* @__PURE__ */ jsx41("tr", { children: /* @__PURE__ */ jsx41("td", { colSpan: columns.length, className: emptyCellClass, children: /* @__PURE__ */ jsxs32("div", { className: "flex flex-col items-center gap-1", children: [
2461
2644
  /* @__PURE__ */ jsx41("p", { className: "font-medium text-foreground", children: emptyTitle }),
2462
2645
  emptyDescription ? /* @__PURE__ */ jsx41("p", { className: "max-w-sm text-muted-foreground", children: emptyDescription }) : null
2463
2646
  ] }) }) }) : sortedRows.map((row) => /* @__PURE__ */ jsx41(
@@ -2490,7 +2673,7 @@ function DataTable({
2490
2673
  },
2491
2674
  getRowKey(row)
2492
2675
  )) }),
2493
- hasFoot ? /* @__PURE__ */ jsx41("tfoot", { children: /* @__PURE__ */ jsx41("tr", { children: /* @__PURE__ */ jsx41("td", { colSpan: columns.length, className: footCellClass, children: /* @__PURE__ */ jsxs31(
2676
+ hasFoot ? /* @__PURE__ */ jsx41("tfoot", { children: /* @__PURE__ */ jsx41("tr", { children: /* @__PURE__ */ jsx41("td", { colSpan: columns.length, className: footCellClass, children: /* @__PURE__ */ jsxs32(
2494
2677
  "div",
2495
2678
  {
2496
2679
  className: cn(
@@ -2508,7 +2691,7 @@ function DataTable({
2508
2691
 
2509
2692
  // src/app/data/ChartPanel.tsx
2510
2693
  import { useId as useId4 } from "react";
2511
- import { jsx as jsx42, jsxs as jsxs32 } from "react/jsx-runtime";
2694
+ import { jsx as jsx42, jsxs as jsxs33 } from "react/jsx-runtime";
2512
2695
  var ChartPanel = ({
2513
2696
  title,
2514
2697
  description,
@@ -2522,7 +2705,7 @@ var ChartPanel = ({
2522
2705
  const resolvedTitle = title ?? artifact?.title;
2523
2706
  const hasHeader = Boolean(resolvedTitle || description || actions);
2524
2707
  const body = children ?? (artifact ? /* @__PURE__ */ jsx42(ChartArtifactView, { artifact, embedded: true, height }) : null);
2525
- return /* @__PURE__ */ jsxs32(
2708
+ return /* @__PURE__ */ jsxs33(
2526
2709
  "section",
2527
2710
  {
2528
2711
  className: cn(metricCardShellClass, "aui-app-chart-panel", className),
@@ -2562,7 +2745,7 @@ var ChartPanel = ({
2562
2745
 
2563
2746
  // src/app/data/MetricRow.tsx
2564
2747
  import { useId as useId5, useState as useState5 } from "react";
2565
- import { jsx as jsx43, jsxs as jsxs33 } from "react/jsx-runtime";
2748
+ import { jsx as jsx43, jsxs as jsxs34 } from "react/jsx-runtime";
2566
2749
  var MetricRow = ({
2567
2750
  title,
2568
2751
  description,
@@ -2584,7 +2767,7 @@ var MetricRow = ({
2584
2767
  if (activeMetricId == null) setInternalId(id);
2585
2768
  onMetricChange?.(id);
2586
2769
  };
2587
- return /* @__PURE__ */ jsxs33(
2770
+ return /* @__PURE__ */ jsxs34(
2588
2771
  "section",
2589
2772
  {
2590
2773
  className: cn(metricCardShellClass, className),
@@ -2632,7 +2815,7 @@ var MetricRow = ({
2632
2815
 
2633
2816
  // src/app/data/MetricChartCard.tsx
2634
2817
  import { useId as useId6, useState as useState6 } from "react";
2635
- import { jsx as jsx44, jsxs as jsxs34 } from "react/jsx-runtime";
2818
+ import { jsx as jsx44, jsxs as jsxs35 } from "react/jsx-runtime";
2636
2819
  var MetricChartCard = ({
2637
2820
  title,
2638
2821
  description,
@@ -2662,7 +2845,7 @@ var MetricChartCard = ({
2662
2845
  };
2663
2846
  const hasHeader = Boolean(title || description || actions);
2664
2847
  const chartAriaLabel = typeof active?.label === "string" ? `${active.label} over time` : "Metric chart";
2665
- return /* @__PURE__ */ jsxs34(
2848
+ return /* @__PURE__ */ jsxs35(
2666
2849
  "section",
2667
2850
  {
2668
2851
  className: cn(metricCardShellClass, className),
@@ -2739,7 +2922,7 @@ var MetricChartCard = ({
2739
2922
 
2740
2923
  // src/charts/sparkline.tsx
2741
2924
  import { useId as useId7 } from "react";
2742
- import { Fragment as Fragment5, jsx as jsx45, jsxs as jsxs35 } from "react/jsx-runtime";
2925
+ import { Fragment as Fragment6, jsx as jsx45, jsxs as jsxs36 } from "react/jsx-runtime";
2743
2926
  var Sparkline = ({
2744
2927
  data,
2745
2928
  dataKey = "value",
@@ -2766,7 +2949,7 @@ var Sparkline = ({
2766
2949
  x: pad + (values.length > 1 ? i / (values.length - 1) * innerW : innerW / 2),
2767
2950
  y: pad + innerH - (v - min) / range * innerH
2768
2951
  }));
2769
- return /* @__PURE__ */ jsxs35(
2952
+ return /* @__PURE__ */ jsxs36(
2770
2953
  "svg",
2771
2954
  {
2772
2955
  width,
@@ -2777,8 +2960,8 @@ var Sparkline = ({
2777
2960
  "aria-label": ariaLabel,
2778
2961
  preserveAspectRatio: "none",
2779
2962
  children: [
2780
- area && /* @__PURE__ */ jsxs35(Fragment5, { children: [
2781
- /* @__PURE__ */ jsx45("defs", { children: /* @__PURE__ */ jsxs35("linearGradient", { id: `${uid}-spark`, x1: "0", x2: "0", y1: "0", y2: "1", children: [
2963
+ area && /* @__PURE__ */ jsxs36(Fragment6, { children: [
2964
+ /* @__PURE__ */ jsx45("defs", { children: /* @__PURE__ */ jsxs36("linearGradient", { id: `${uid}-spark`, x1: "0", x2: "0", y1: "0", y2: "1", children: [
2782
2965
  /* @__PURE__ */ jsx45("stop", { offset: "0%", style: { stopColor: color, stopOpacity: 0.25 } }),
2783
2966
  /* @__PURE__ */ jsx45("stop", { offset: "100%", style: { stopColor: color, stopOpacity: 0 } })
2784
2967
  ] }) }),
@@ -2804,6 +2987,7 @@ export {
2804
2987
  APP_KIT_AGENT_INSTRUCTIONS,
2805
2988
  createTimbalTheme,
2806
2989
  themeToCss,
2990
+ ensureThemeFontLink,
2807
2991
  applyTimbalTheme,
2808
2992
  clearTimbalTheme,
2809
2993
  TIMBAL_THEME_PRESETS,