@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.
- package/CHANGELOG.md +19 -0
- package/README.md +14 -4
- package/dist/app.cjs +220 -35
- package/dist/app.d.cts +1 -1
- package/dist/app.d.ts +1 -1
- package/dist/app.esm.js +3 -1
- package/dist/{chart-artifact-DwfRtQWL.d.ts → chart-artifact-Bl67kre7.d.ts} +60 -11
- package/dist/{chart-artifact-DWkqIAK5.d.cts → chart-artifact-BzcvblDe.d.cts} +60 -11
- package/dist/{chunk-GBBLAM3G.esm.js → chunk-6YVKCVEP.esm.js} +329 -145
- package/dist/index.cjs +220 -35
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.esm.js +3 -1
- package/package.json +1 -1
|
@@ -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
|
-
|
|
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
|
|
677
|
+
description: "Cool, trustworthy blue-violet, Geist type, generous radius, soft shadows \u2014 analytics & ops dashboards.",
|
|
574
678
|
swatch: "#4f46e5",
|
|
575
|
-
|
|
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
|
|
690
|
+
description: "Vivid purple, Sora type, rounded, soft shadows \u2014 expressive product / marketing surfaces.",
|
|
581
691
|
swatch: "#7c3aed",
|
|
582
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
729
|
+
description: "Muted enterprise gray-blue, Inter type, tight radius, hairline shadows, tinted neutrals.",
|
|
602
730
|
swatch: "#475569",
|
|
603
|
-
|
|
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
|
-
###
|
|
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({
|
|
650
|
-
|
|
651
|
-
|
|
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
|
-
-
|
|
655
|
-
-
|
|
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
|
-
|
|
673
|
-
|
|
674
|
-
|
|
|
675
|
-
|
|
676
|
-
| \`
|
|
677
|
-
| \`
|
|
678
|
-
| \`
|
|
679
|
-
| \`
|
|
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__ */
|
|
704
|
-
"
|
|
705
|
-
|
|
706
|
-
"
|
|
707
|
-
|
|
708
|
-
|
|
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__ */
|
|
733
|
-
/* @__PURE__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
792
|
-
/* @__PURE__ */
|
|
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
|
|
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__ */
|
|
1024
|
+
return /* @__PURE__ */ jsxs4("div", { "data-timbal-theme": preset.id, children: [
|
|
846
1025
|
/* @__PURE__ */ jsx4(TimbalThemeStyle, { preset: preset.id, scope: preset.id }),
|
|
847
|
-
/* @__PURE__ */
|
|
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__ */
|
|
862
|
-
/* @__PURE__ */
|
|
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__ */
|
|
877
|
-
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
1131
|
-
/* @__PURE__ */
|
|
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
|
|
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__ */
|
|
1177
|
-
/* @__PURE__ */
|
|
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
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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
|
|
1507
|
+
import { jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
1325
1508
|
var StatTile = ({ label, value, hint, className }) => {
|
|
1326
|
-
return /* @__PURE__ */
|
|
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
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
1478
|
-
/* @__PURE__ */
|
|
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
|
|
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__ */
|
|
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
|
|
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__ */
|
|
1572
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
1633
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
1867
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1870
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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
|
|
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__ */
|
|
2171
|
+
const inner = /* @__PURE__ */ jsxs25(Fragment5, { children: [
|
|
1989
2172
|
logo ? /* @__PURE__ */ jsx30("span", { className: logoShellClass2, children: logo }) : null,
|
|
1990
|
-
/* @__PURE__ */
|
|
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
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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
|
|
2485
|
+
import { jsx as jsx39, jsxs as jsxs31 } from "react/jsx-runtime";
|
|
2303
2486
|
var FormSection = ({ title, children, className }) => {
|
|
2304
|
-
return /* @__PURE__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
2781
|
-
/* @__PURE__ */ jsx45("defs", { children: /* @__PURE__ */
|
|
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,
|