@timbal-ai/timbal-react 1.6.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +8 -0
  3. package/dist/app.cjs +167 -75
  4. package/dist/app.d.cts +3 -3
  5. package/dist/app.d.ts +3 -3
  6. package/dist/app.esm.js +5 -5
  7. package/dist/{chart-artifact-VAqgH-My.d.cts → chart-artifact-CuTiCITz.d.cts} +230 -15
  8. package/dist/{chart-artifact-C2pZQsaP.d.ts → chart-artifact-U-x0UNJm.d.ts} +230 -15
  9. package/dist/chat.esm.js +3 -3
  10. package/dist/{chunk-YYEI6XME.esm.js → chunk-22KWC2LS.esm.js} +5 -5
  11. package/dist/{chunk-MBS7XHV2.esm.js → chunk-45NXD3IG.esm.js} +3 -3
  12. package/dist/{chunk-24B4I4XC.esm.js → chunk-64RHAJVG.esm.js} +1 -1
  13. package/dist/{chunk-WQIQW7EM.esm.js → chunk-7AGIAQE6.esm.js} +1 -1
  14. package/dist/{chunk-NO5AWNWT.esm.js → chunk-7WU3IKAN.esm.js} +1 -1
  15. package/dist/{chunk-6SQMTBPL.esm.js → chunk-M5IBJBEY.esm.js} +109 -23
  16. package/dist/{chunk-HSL36SJ4.esm.js → chunk-PMMI7LBV.esm.js} +20 -8
  17. package/dist/{chunk-TMP7RIA7.esm.js → chunk-VKXOHVDE.esm.js} +2 -2
  18. package/dist/{chunk-ELEY66OH.esm.js → chunk-XOCOZU7J.esm.js} +11 -1
  19. package/dist/cli/timbal-ui-lint.mjs +534 -0
  20. package/dist/index.cjs +303 -200
  21. package/dist/index.d.cts +2 -2
  22. package/dist/index.d.ts +2 -2
  23. package/dist/index.esm.js +9 -9
  24. package/dist/{kanban-FFBeaZPS.d.cts → kanban-BQxWliCS.d.cts} +17 -0
  25. package/dist/{kanban-FFBeaZPS.d.ts → kanban-BQxWliCS.d.ts} +17 -0
  26. package/dist/studio.cjs +104 -85
  27. package/dist/studio.esm.js +6 -6
  28. package/dist/ui.cjs +6 -6
  29. package/dist/ui.d.cts +1 -1
  30. package/dist/ui.d.ts +1 -1
  31. package/dist/ui.esm.js +4 -4
  32. package/package.json +13 -3
package/dist/app.cjs CHANGED
@@ -272,6 +272,13 @@ var HOUSE_RULES = [
272
272
  slop: `<span className="text-blue-600 bg-green-50">`,
273
273
  good: `<span className="text-primary bg-muted">`
274
274
  },
275
+ {
276
+ id: "chart-token-color",
277
+ rule: "Pass chart and theme color tokens directly (var(--chart-1)) \u2014 never wrap them in hsl(), rgb(), or oklch().",
278
+ why: "The --chart-N and theme tokens are already full OKLCH colors. Wrapping them in hsl()/rgb() is invalid CSS, so the chart renders empty/uncolored \u2014 and the build still passes, so it's a silent runtime bug.",
279
+ slop: `<Cell fill="hsl(var(--chart-1))" />`,
280
+ good: `<Cell fill="var(--chart-1)" />`
281
+ },
275
282
  {
276
283
  id: "no-decorative-icons",
277
284
  rule: "Icons must earn their place (action, nav, or status). Never add an icon beside a label that already says the thing.",
@@ -318,7 +325,11 @@ var HOUSE_RULES = [
318
325
  {
319
326
  id: "compose-from-blocks",
320
327
  rule: "Build from premade blocks (MetricRow, MetricChartCard, DataTable, IntegrationCard). Drop to raw primitives only when no block fits.",
321
- why: "Slop appears the moment generation falls below the curated block layer."
328
+ why: "Slop appears the moment generation falls below the curated block layer.",
329
+ // "Should have used a block" is a judgement about absence, not a textual
330
+ // pattern — no high-precision deterministic check exists, so this stays
331
+ // prompt-only rather than risk false-positives blocking valid UIs.
332
+ enforcement: "prompt-only"
322
333
  },
323
334
  {
324
335
  id: "use-kit-controls",
@@ -399,7 +410,7 @@ The content region is a **padded scroll area** by default \u2014 great for stack
399
410
  - Give the filling child **\`min-h-0 flex-1\`** (or \`h-full\`) so its own scroll/footer resolves \u2014 e.g. \`<TimbalChat className="min-h-0 flex-1" />\`, or a two-pane row where each pane is \`min-h-0 overflow-y-auto\`.
400
411
 
401
412
  \`\`\`tsx
402
- <AppShell contentFill topbar={<div className="flex justify-end p-4"><ModeToggle /></div>}>
413
+ <AppShell contentFill> {/* no global topbar / theme switch */}
403
414
  <Page fill> {/* headerless: omit title */}
404
415
  <TimbalChat workforceId="\u2026" className="min-h-0 flex-1" />
405
416
  </Page>
@@ -503,6 +514,8 @@ The cause of slop is dropping **below** the curated block layer into raw primiti
503
514
 
504
515
  Charts run on **recharts** with shadcn \`ChartContainer\` / \`ChartTooltipContent\` chrome (see \`src/ui/chart.tsx\`). Series colors default to \`--chart-1..6\`; override those CSS tokens to rebrand every chart.
505
516
 
517
+ > **React 19 requirement \u2014 do not hand-roll SVG charts to work around this.** recharts under React 19 crashes (\`Cannot assign to read only property 'lanes'\`, blank route) when \`immer\` resolves to **11.0.0**. The fix is a dependency override in the app's \`package.json\` \u2014 \`"overrides": { "immer": ">=11.0.1" }\` (Yarn: \`"resolutions"\`) \u2014 **not** a code change. Always keep using \`LineAreaChart\` / \`PieChart\` / \`ChartPanel\`; never replace them with raw SVG/CSS charts.
518
+
506
519
  | Component | Use for |
507
520
  |-----------|---------|
508
521
  | \`LineAreaChart\` | Cartesian engine (shadcn-style chrome). Bar fills use theme gradients automatically. Props: \`data\`, \`xKey\`, \`series: [{ dataKey, label?, color? }]\`, \`variant\` (\`area\`\\|\`line\`\\|\`bar\`), \`orientation\` (\`horizontal\` for horizontal bars), \`stacked\`, \`curve\`, \`dots\`, \`gridLines\`, \`tooltipIndicator\`, \`layout\` (\`flush\` \u2014 hides axes by default; category + values on hover tooltip), \`showXAxis\` / \`showYAxis\` to opt back in, \`clipTicks\` (truncates long axis labels when axes are on), \`height\`, \`showLegend\`, \`formatX\`, \`formatValue\`, \`ariaLabel\`. |
@@ -667,6 +680,7 @@ var RAW_COLOR_RE = new RegExp(
667
680
  "g"
668
681
  );
669
682
  var COLOR_LITERAL_RE = /#[0-9a-fA-F]{3,8}\b|\b(?:oklch|rgba?|hsla?)\s*\(/g;
683
+ var COLOR_FN_WRAPPING_VAR_RE = /\b(?:hsl|hsla|rgb|rgba|oklch|oklab|lab|lch|hwb|color)\s*\(\s*var\(\s*--/i;
670
684
  var INLINE_STYLE_COLOR_RE = /style=\{\{[^}]*\b(?:color|background|backgroundColor|borderColor|fill|stroke)\b/;
671
685
  var BOLD_VALUE_RE = /text-(?:xl|2xl|3xl|4xl|5xl|6xl)[^"'`]*\bfont-(?:bold|extrabold|black|semibold)|font-(?:bold|extrabold|black|semibold)[^"'`]*text-(?:xl|2xl|3xl|4xl|5xl|6xl)/;
672
686
  var GRADIENT_RE = /\bbg-(?:gradient|linear|radial|conic)-/;
@@ -683,15 +697,32 @@ var GRADIENT_DIRECTIONS = /* @__PURE__ */ new Set([
683
697
  var ICON_IMPORT_RE = /from\s+["']lucide-react["']/;
684
698
  var RAW_CONTROL_SURFACE_RE = /\bborder-input\b/;
685
699
  var COLORED_HOVER_RE = /\bhover:(?:bg|from|to|via)-(?:primary|destructive|success|warn|danger|blue|emerald|green|amber|red|indigo|violet|purple|pink|rose|sky|cyan|teal|lime|yellow|orange|fuchsia)\b/;
700
+ var TREND_CONTEXT_RE = /\b(?:trend|delta|TrendingUp|TrendingDown|ArrowUp|ArrowDown|ArrowUpRight|ArrowDownRight|MoveUp|MoveDown)\b|[+\-]\d+(?:\.\d+)?\s*%/;
701
+ var TREND_COLOR_RE = /\b(?:text|bg|border)-(?:success|destructive|emerald|green|lime|teal|red|rose|orange|amber)(?:-\d{2,3})?(?:\/\d{1,3})?\b/;
686
702
  var RESERVED_GRADIENT_SET = new Set(RESERVED_GRADIENT_TOKENS);
687
703
  function stripVariants(util) {
688
704
  return util.replace(/^(?:[a-z-]+:)*/, "");
689
705
  }
706
+ function describeArg(value) {
707
+ if (value === null) return "null";
708
+ if (Array.isArray(value)) return "an array";
709
+ const t = typeof value;
710
+ if (t === "object") {
711
+ const keys = Object.keys(value).slice(0, 4);
712
+ return keys.length ? `an object with keys { ${keys.join(", ")} }` : "an object";
713
+ }
714
+ return `a ${t}`;
715
+ }
690
716
  function isCommentOrImport(line) {
691
717
  const t = line.trim();
692
718
  return t.startsWith("//") || t.startsWith("*") || t.startsWith("/*") || t.startsWith("import ") || t.startsWith("export ");
693
719
  }
694
720
  function lintGeneratedUi(source, options = {}) {
721
+ if (typeof source !== "string") {
722
+ throw new TypeError(
723
+ `lintGeneratedUi(source, options?) expects the generated code as a string, but received ${describeArg(source)}. Pass the raw .tsx source \u2014 lintGeneratedUi(code) \u2014 not an object like { filename, source } and not a previous LintResult.`
724
+ );
725
+ }
695
726
  const maxIcons = options.maxIconsPerView ?? SLOP_BUDGETS.maxIconsPerView;
696
727
  const maxRowDividers = options.maxRowDividers ?? SLOP_BUDGETS.maxRowDividers;
697
728
  const findings = [];
@@ -726,6 +757,16 @@ function lintGeneratedUi(source, options = {}) {
726
757
  if (cardMatch) {
727
758
  const isSelfClosing = /\/>/.test(line) && line.indexOf(cardMatch[0]) < line.indexOf("/>");
728
759
  if (!isSelfClosing) {
760
+ if (openCards.length > 0) {
761
+ const parentCard = openCards[openCards.length - 1];
762
+ findings.push({
763
+ rule: "no-card-in-card",
764
+ severity: "warn",
765
+ line: lineNo,
766
+ message: `Card inside card. A <${cardMatch[1]}> is nested inside the <${parentCard.type}> opened on L${parentCard.line}. Double borders/shadows add no information \u2014 group with spacing or a <Section> instead.`,
767
+ snippet: line.trim().slice(0, 120)
768
+ });
769
+ }
729
770
  openCards.push({ type: cardMatch[1], line: lineNo });
730
771
  }
731
772
  }
@@ -761,7 +802,17 @@ function lintGeneratedUi(source, options = {}) {
761
802
  });
762
803
  }
763
804
  }
764
- const literals = line.match(COLOR_LITERAL_RE);
805
+ const wrapsTokenInColorFn = COLOR_FN_WRAPPING_VAR_RE.test(line);
806
+ if (wrapsTokenInColorFn) {
807
+ findings.push({
808
+ rule: "chart-token-color-fn",
809
+ severity: "error",
810
+ line: lineNo,
811
+ message: "Color function wrapping a token (e.g. hsl(var(--chart-1))). The --chart-N and theme tokens are already OKLCH colors \u2014 wrapping them in hsl()/rgb() is invalid CSS and renders an empty/uncolored chart (the build still passes). Pass the token directly: var(--chart-1), or let the app-kit charts use --chart-N automatically.",
812
+ snippet: line.trim().slice(0, 120)
813
+ });
814
+ }
815
+ const literals = wrapsTokenInColorFn ? null : line.match(COLOR_LITERAL_RE);
765
816
  if (literals) {
766
817
  findings.push({
767
818
  rule: "color-literal",
@@ -798,6 +849,15 @@ function lintGeneratedUi(source, options = {}) {
798
849
  snippet: line.trim().slice(0, 120)
799
850
  });
800
851
  }
852
+ if (TREND_CONTEXT_RE.test(line) && TREND_COLOR_RE.test(line)) {
853
+ findings.push({
854
+ rule: "neutral-trend",
855
+ severity: "warn",
856
+ line: lineNo,
857
+ message: "Colored trend indicator. House style: don't tint deltas green/red on every metric \u2014 show a trend only when the change is the point, and keep it muted (text-muted-foreground).",
858
+ snippet: line.trim().slice(0, 120)
859
+ });
860
+ }
801
861
  if (BOLD_VALUE_RE.test(line)) {
802
862
  findings.push({
803
863
  rule: "bold-metric",
@@ -903,6 +963,11 @@ function lintGeneratedUi(source, options = {}) {
903
963
  };
904
964
  }
905
965
  function formatLintReport(findings) {
966
+ if (!Array.isArray(findings)) {
967
+ throw new TypeError(
968
+ `formatLintReport(findings) expects the findings array, but received ${describeArg(findings)}. Pass result.findings \u2014 formatLintReport(lintGeneratedUi(code).findings) \u2014 not the whole LintResult.`
969
+ );
970
+ }
906
971
  if (findings.length === 0) return "";
907
972
  const lines = findings.slice().sort((a, b) => a.line - b.line).map((f) => {
908
973
  const tag = f.severity === "error" ? "ERROR" : "warn ";
@@ -2676,6 +2741,7 @@ var MetricTile = ({
2676
2741
  var import_jsx_runtime7 = require("react/jsx-runtime");
2677
2742
 
2678
2743
  // src/app/layout/AppShell.tsx
2744
+ var import_lucide_react = require("lucide-react");
2679
2745
  var import_react6 = require("motion/react");
2680
2746
  var import_react7 = require("react");
2681
2747
 
@@ -2722,18 +2788,25 @@ function useAppShellChat() {
2722
2788
  return (0, import_react4.useContext)(AppShellChatContext);
2723
2789
  }
2724
2790
 
2725
- // src/app/layout/app-shell-nav-context.tsx
2791
+ // src/layout/shell-nav-context.tsx
2726
2792
  var import_react5 = require("react");
2727
- var AppShellNavContext = (0, import_react5.createContext)(null);
2728
- var AppShellNavProvider = AppShellNavContext.Provider;
2793
+ var ShellNavContext = (0, import_react5.createContext)(null);
2794
+ var ShellNavProvider = ShellNavContext.Provider;
2795
+ function useOptionalShellNav() {
2796
+ return (0, import_react5.useContext)(ShellNavContext);
2797
+ }
2798
+
2799
+ // src/app/layout/app-shell-nav-context.tsx
2800
+ var AppShellNavProvider = ShellNavProvider;
2801
+ var NAV_NOOP = {
2802
+ open: false,
2803
+ setOpen: () => {
2804
+ },
2805
+ toggle: () => {
2806
+ }
2807
+ };
2729
2808
  function useAppShellNav() {
2730
- return (0, import_react5.useContext)(AppShellNavContext) ?? {
2731
- open: false,
2732
- setOpen: () => {
2733
- },
2734
- toggle: () => {
2735
- }
2736
- };
2809
+ return useOptionalShellNav() ?? NAV_NOOP;
2737
2810
  }
2738
2811
 
2739
2812
  // src/app/layout/AppShell.tsx
@@ -2744,6 +2817,12 @@ var floatingTriggerClass = cn(
2744
2817
  "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
2745
2818
  "bottom-6 right-6 max-sm:bottom-4 max-sm:right-4"
2746
2819
  );
2820
+ var floatingNavTriggerClass = cn(
2821
+ "aui-app-shell-nav-trigger-fixed fixed left-4 top-4 z-30 inline-flex size-10 items-center justify-center rounded-xl md:hidden",
2822
+ "border border-border/60 bg-card/85 text-foreground shadow-card-elevated backdrop-blur-xl supports-backdrop-filter:bg-card/75",
2823
+ "transition-colors hover:bg-card",
2824
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"
2825
+ );
2747
2826
  var floatingPanelClass = cn(
2748
2827
  "aui-app-shell-chat-float fixed z-50 flex flex-col overflow-hidden rounded-2xl border border-border/60 shadow-card-elevated",
2749
2828
  "bg-card/85 backdrop-blur-xl supports-backdrop-filter:bg-card/75",
@@ -2834,12 +2913,14 @@ var AppShell = ({
2834
2913
  navOpen: navOpenProp,
2835
2914
  defaultNavOpen = false,
2836
2915
  onNavOpenChange,
2916
+ mobileSidebarTrigger = "auto",
2837
2917
  className,
2838
2918
  mainClassName,
2839
2919
  contentFill = false
2840
2920
  }) => {
2841
2921
  const topbarContent = topbar ?? header;
2842
2922
  const hasChat = Boolean(chat);
2923
+ const showFloatingNavTrigger = Boolean(sidebar) && mobileSidebarTrigger !== "none" && !(mobileSidebarTrigger === "topbar") && !topbarContent;
2843
2924
  const [uncontrolledNavOpen, setUncontrolledNavOpen] = (0, import_react7.useState)(defaultNavOpen);
2844
2925
  const isNavControlled = navOpenProp !== void 0;
2845
2926
  const navOpen = isNavControlled ? navOpenProp : uncontrolledNavOpen;
@@ -2899,6 +2980,17 @@ var AppShell = ({
2899
2980
  style: studioChromeShellStyle,
2900
2981
  children: [
2901
2982
  sidebar,
2983
+ showFloatingNavTrigger && !navOpen ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
2984
+ "button",
2985
+ {
2986
+ type: "button",
2987
+ "aria-label": "Open navigation",
2988
+ "aria-expanded": false,
2989
+ onClick: () => setNavOpen(true),
2990
+ className: floatingNavTriggerClass,
2991
+ children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_lucide_react.MenuIcon, { className: "size-5", "aria-hidden": true })
2992
+ }
2993
+ ) : null,
2902
2994
  sidebar && navOpen ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
2903
2995
  "button",
2904
2996
  {
@@ -3112,7 +3204,7 @@ var AppShellChatTrigger = ({
3112
3204
  };
3113
3205
 
3114
3206
  // src/app/layout/AppShellSidebarTrigger.tsx
3115
- var import_lucide_react = require("lucide-react");
3207
+ var import_lucide_react2 = require("lucide-react");
3116
3208
  var import_jsx_runtime11 = require("react/jsx-runtime");
3117
3209
  var AppShellSidebarTrigger = ({
3118
3210
  label = "Open navigation",
@@ -3131,7 +3223,7 @@ var AppShellSidebarTrigger = ({
3131
3223
  "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-foreground/10",
3132
3224
  className
3133
3225
  ),
3134
- children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react.MenuIcon, { className: "size-5", "aria-hidden": true })
3226
+ children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react2.MenuIcon, { className: "size-5", "aria-hidden": true })
3135
3227
  }
3136
3228
  );
3137
3229
  };
@@ -3283,17 +3375,17 @@ function useAppCopilotContext() {
3283
3375
  }
3284
3376
 
3285
3377
  // src/app/chat/AppChatPanel.tsx
3286
- var import_lucide_react10 = require("lucide-react");
3378
+ var import_lucide_react11 = require("lucide-react");
3287
3379
 
3288
3380
  // src/chat/thread.tsx
3289
3381
  var import_react38 = require("react");
3290
3382
  var import_react39 = require("@assistant-ui/react");
3291
- var import_lucide_react9 = require("lucide-react");
3383
+ var import_lucide_react10 = require("lucide-react");
3292
3384
  var import_react40 = require("motion/react");
3293
3385
 
3294
3386
  // src/chat/attachment.tsx
3295
3387
  var import_react10 = require("react");
3296
- var import_lucide_react3 = require("lucide-react");
3388
+ var import_lucide_react4 = require("lucide-react");
3297
3389
  var import_react11 = require("@assistant-ui/react");
3298
3390
  var import_shallow = require("zustand/shallow");
3299
3391
 
@@ -3348,7 +3440,7 @@ function TooltipContent({
3348
3440
  }
3349
3441
 
3350
3442
  // src/ui/dialog.tsx
3351
- var import_lucide_react2 = require("lucide-react");
3443
+ var import_lucide_react3 = require("lucide-react");
3352
3444
  var import_radix_ui4 = require("radix-ui");
3353
3445
  var import_jsx_runtime18 = require("react/jsx-runtime");
3354
3446
  function Dialog({
@@ -3408,7 +3500,7 @@ function DialogContent({
3408
3500
  "data-slot": "dialog-close",
3409
3501
  className: "ring-offset-background focus:ring-ring data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-[opacity,background-color] hover:bg-ghost-fill-hover hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
3410
3502
  children: [
3411
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_lucide_react2.XIcon, {}),
3503
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_lucide_react3.XIcon, {}),
3412
3504
  /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: "sr-only", children: "Close" })
3413
3505
  ]
3414
3506
  }
@@ -3636,7 +3728,7 @@ var AttachmentThumb = () => {
3636
3728
  className: "aui-attachment-tile-image object-cover"
3637
3729
  }
3638
3730
  ),
3639
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(AvatarFallback, { delayMs: isImage ? 200 : 0, children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_lucide_react3.FileText, { className: "aui-attachment-tile-fallback-icon size-8 text-muted-foreground" }) })
3731
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(AvatarFallback, { delayMs: isImage ? 200 : 0, children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_lucide_react4.FileText, { className: "aui-attachment-tile-fallback-icon size-8 text-muted-foreground" }) })
3640
3732
  ] });
3641
3733
  };
3642
3734
  var AttachmentUI = () => {
@@ -3692,7 +3784,7 @@ var AttachmentRemove = () => {
3692
3784
  tooltip: "Remove file",
3693
3785
  className: "aui-attachment-tile-remove absolute top-1.5 right-1.5 size-3.5 rounded-full bg-card text-foreground opacity-100 shadow-card hover:bg-card! [&_svg]:text-foreground hover:[&_svg]:text-destructive",
3694
3786
  side: "top",
3695
- children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_lucide_react3.XIcon, { className: "aui-attachment-remove-icon size-3" })
3787
+ children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_lucide_react4.XIcon, { className: "aui-attachment-remove-icon size-3" })
3696
3788
  }
3697
3789
  ) });
3698
3790
  };
@@ -3716,7 +3808,7 @@ var ComposerAddAttachment = () => {
3716
3808
  variant: "secondary",
3717
3809
  className: "aui-composer-add-attachment shrink-0 text-muted-foreground",
3718
3810
  "aria-label": "Add Attachment",
3719
- children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_lucide_react3.PlusIcon, { className: "aui-attachment-add-icon size-4 stroke-[1.5]" })
3811
+ children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_lucide_react4.PlusIcon, { className: "aui-attachment-add-icon size-4 stroke-[1.5]" })
3720
3812
  }
3721
3813
  ) });
3722
3814
  };
@@ -3729,7 +3821,7 @@ var import_remark_gfm = __toESM(require("remark-gfm"), 1);
3729
3821
  var import_remark_math = __toESM(require("remark-math"), 1);
3730
3822
  var import_rehype_katex = __toESM(require("rehype-katex"), 1);
3731
3823
  var import_react25 = require("react");
3732
- var import_lucide_react5 = require("lucide-react");
3824
+ var import_lucide_react6 = require("lucide-react");
3733
3825
 
3734
3826
  // src/chat/syntax-highlighter.tsx
3735
3827
  var import_react24 = require("react");
@@ -4963,7 +5055,7 @@ function inferDataKeys(data, xKey) {
4963
5055
  // src/artifacts/question-artifact.tsx
4964
5056
  var import_react16 = require("react");
4965
5057
  var import_react17 = require("@assistant-ui/react");
4966
- var import_lucide_react4 = require("lucide-react");
5058
+ var import_lucide_react5 = require("lucide-react");
4967
5059
  var import_jsx_runtime32 = require("react/jsx-runtime");
4968
5060
  function optionKey(option, index) {
4969
5061
  const id = option.id?.trim();
@@ -4977,7 +5069,7 @@ var OptionRadio = ({ selected }) => /* @__PURE__ */ (0, import_jsx_runtime32.jsx
4977
5069
  selected ? "border-foreground bg-foreground text-background" : "border-border bg-background"
4978
5070
  ),
4979
5071
  "aria-hidden": true,
4980
- children: selected ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_lucide_react4.CheckIcon, { className: "size-2.5 stroke-[3]" }) : null
5072
+ children: selected ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_lucide_react5.CheckIcon, { className: "size-2.5 stroke-[3]" }) : null
4981
5073
  }
4982
5074
  );
4983
5075
  var QuestionArtifactView = ({
@@ -5792,8 +5884,8 @@ var CodeHeader = ({ language, code }) => {
5792
5884
  onClick: onCopy,
5793
5885
  className: "transition-colors hover:text-foreground",
5794
5886
  children: [
5795
- !isCopied && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_lucide_react5.CopyIcon, { className: "h-3.5 w-3.5" }),
5796
- isCopied && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_lucide_react5.CheckIcon, { className: "h-3.5 w-3.5 text-emerald-500" })
5887
+ !isCopied && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_lucide_react6.CopyIcon, { className: "h-3.5 w-3.5" }),
5888
+ isCopied && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_lucide_react6.CheckIcon, { className: "h-3.5 w-3.5 text-emerald-500" })
5797
5889
  ]
5798
5890
  }
5799
5891
  )
@@ -6013,7 +6105,7 @@ var defaultComponents = (0, import_react_markdown.unstable_memoizeMarkdownCompon
6013
6105
 
6014
6106
  // src/chat/tool-fallback.tsx
6015
6107
  var import_react32 = require("react");
6016
- var import_lucide_react6 = require("lucide-react");
6108
+ var import_lucide_react7 = require("lucide-react");
6017
6109
  var import_react33 = require("@assistant-ui/react");
6018
6110
 
6019
6111
  // src/ui/shimmer.tsx
@@ -7054,7 +7146,7 @@ var TimelineActionLabel = ({ action, detail, shimmer = false }) => /* @__PURE__
7054
7146
  detail ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: studioTimelineDetailClass, children: detail }) : null
7055
7147
  ] });
7056
7148
  var TimelineHoverChevron = ({ expanded }) => /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
7057
- import_lucide_react6.ChevronRightIcon,
7149
+ import_lucide_react7.ChevronRightIcon,
7058
7150
  {
7059
7151
  className: studioTimelineChevronClass(expanded),
7060
7152
  "aria-hidden": true
@@ -7204,7 +7296,7 @@ var ToolArtifactFallback = (props) => {
7204
7296
 
7205
7297
  // src/chat/composer.tsx
7206
7298
  var import_react34 = require("@assistant-ui/react");
7207
- var import_lucide_react7 = require("lucide-react");
7299
+ var import_lucide_react8 = require("lucide-react");
7208
7300
  var import_jsx_runtime48 = require("react/jsx-runtime");
7209
7301
  var Composer = ({
7210
7302
  placeholder = "Send a message...",
@@ -7296,7 +7388,7 @@ var ComposerSendOrCancel = ({ sendTooltip }) => {
7296
7388
  type: "submit",
7297
7389
  className: "aui-composer-send shrink-0 disabled:opacity-30",
7298
7390
  "aria-label": "Send message",
7299
- children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react7.ArrowUpIcon, { className: "aui-composer-send-icon size-4" })
7391
+ children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react8.ArrowUpIcon, { className: "aui-composer-send-icon size-4" })
7300
7392
  }
7301
7393
  ) }) }),
7302
7394
  /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_react34.AuiIf, { condition: (s) => s.thread.isRunning, children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_react34.ComposerPrimitive.Cancel, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
@@ -7306,7 +7398,7 @@ var ComposerSendOrCancel = ({ sendTooltip }) => {
7306
7398
  variant: "primary",
7307
7399
  className: "aui-composer-cancel shrink-0",
7308
7400
  "aria-label": "Stop generating",
7309
- children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react7.SquareIcon, { className: "aui-composer-cancel-icon size-3 fill-current" })
7401
+ children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react8.SquareIcon, { className: "aui-composer-cancel-icon size-3 fill-current" })
7310
7402
  }
7311
7403
  ) }) })
7312
7404
  ] });
@@ -7315,7 +7407,7 @@ var ComposerSendOrCancel = ({ sendTooltip }) => {
7315
7407
  // src/chat/suggestions.tsx
7316
7408
  var import_react35 = require("react");
7317
7409
  var import_react36 = require("@assistant-ui/react");
7318
- var import_lucide_react8 = require("lucide-react");
7410
+ var import_lucide_react9 = require("lucide-react");
7319
7411
  var import_jsx_runtime49 = require("react/jsx-runtime");
7320
7412
  var Suggestions = ({
7321
7413
  suggestions,
@@ -7350,7 +7442,7 @@ var SuggestionRow = ({ suggestion }) => {
7350
7442
  onClick,
7351
7443
  className: cn("aui-thread-suggestion", studioListRowButtonClass),
7352
7444
  children: [
7353
- /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("span", { className: "aui-thread-suggestion-icon shrink-0 text-muted-foreground", children: suggestion.icon ?? /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_lucide_react8.ArrowUpIcon, { className: "size-4", strokeWidth: 1.75, "aria-hidden": true }) }),
7445
+ /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("span", { className: "aui-thread-suggestion-icon shrink-0 text-muted-foreground", children: suggestion.icon ?? /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_lucide_react9.ArrowUpIcon, { className: "size-4", strokeWidth: 1.75, "aria-hidden": true }) }),
7354
7446
  /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("span", { className: "aui-thread-suggestion-text min-w-0 flex-1 text-left", children: [
7355
7447
  /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("span", { className: "aui-thread-suggestion-text-1 block truncate text-sm font-normal text-foreground", children: suggestion.title }),
7356
7448
  suggestion.description && /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("span", { className: "aui-thread-suggestion-text-2 mt-0.5 block truncate text-xs text-muted-foreground", children: suggestion.description })
@@ -7570,7 +7662,7 @@ var ThreadScrollToBottom = () => {
7570
7662
  tooltip: "Scroll to bottom",
7571
7663
  variant: "secondary",
7572
7664
  className: "aui-thread-scroll-to-bottom absolute -top-12 z-10 self-center disabled:invisible",
7573
- children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_lucide_react9.ArrowDownIcon, { className: "size-4" })
7665
+ children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_lucide_react10.ArrowDownIcon, { className: "size-4" })
7574
7666
  }
7575
7667
  ) });
7576
7668
  };
@@ -7711,8 +7803,8 @@ var AssistantActionBar = () => {
7711
7803
  variant: "ghost",
7712
7804
  className: ASSISTANT_ACTION_ICON_CLASS,
7713
7805
  children: [
7714
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react39.AuiIf, { condition: (s) => s.message.isCopied, children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_lucide_react9.CheckIcon, { className: "size-3" }) }),
7715
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react39.AuiIf, { condition: (s) => !s.message.isCopied, children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_lucide_react9.CopyIcon, { className: "size-3" }) })
7806
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react39.AuiIf, { condition: (s) => s.message.isCopied, children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_lucide_react10.CheckIcon, { className: "size-3" }) }),
7807
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react39.AuiIf, { condition: (s) => !s.message.isCopied, children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_lucide_react10.CopyIcon, { className: "size-3" }) })
7716
7808
  ]
7717
7809
  }
7718
7810
  ) }),
@@ -7722,7 +7814,7 @@ var AssistantActionBar = () => {
7722
7814
  tooltip: "Regenerate",
7723
7815
  variant: "ghost",
7724
7816
  className: ASSISTANT_ACTION_ICON_CLASS,
7725
- children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_lucide_react9.RefreshCwIcon, { className: "size-3" })
7817
+ children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_lucide_react10.RefreshCwIcon, { className: "size-3" })
7726
7818
  }
7727
7819
  ) }),
7728
7820
  /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react39.ActionBarMorePrimitive.Root, { children: [
@@ -7735,7 +7827,7 @@ var AssistantActionBar = () => {
7735
7827
  ASSISTANT_ACTION_ICON_CLASS,
7736
7828
  "data-[state=open]:text-muted-foreground/80"
7737
7829
  ),
7738
- children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_lucide_react9.MoreHorizontalIcon, { className: "size-3" })
7830
+ children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_lucide_react10.MoreHorizontalIcon, { className: "size-3" })
7739
7831
  }
7740
7832
  ) }),
7741
7833
  /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
@@ -7745,7 +7837,7 @@ var AssistantActionBar = () => {
7745
7837
  align: "start",
7746
7838
  className: "aui-action-bar-more-content z-50 min-w-36 overflow-hidden rounded-lg border border-border bg-popover p-1 text-popover-foreground shadow-card-elevated",
7747
7839
  children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_react39.ActionBarPrimitive.ExportMarkdown, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_react39.ActionBarMorePrimitive.Item, { className: "aui-action-bar-more-item flex cursor-pointer select-none items-center gap-2 rounded-md px-2 py-1.5 text-sm outline-none hover:bg-muted focus:bg-muted", children: [
7748
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_lucide_react9.DownloadIcon, { className: "size-4 shrink-0" }),
7840
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_lucide_react10.DownloadIcon, { className: "size-4 shrink-0" }),
7749
7841
  "Export as Markdown"
7750
7842
  ] }) })
7751
7843
  }
@@ -7803,7 +7895,7 @@ var UserActionBar = () => {
7803
7895
  tooltip: "Edit",
7804
7896
  variant: "ghost",
7805
7897
  className: ASSISTANT_ACTION_ICON_CLASS,
7806
- children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_lucide_react9.PencilIcon, { className: "size-3" })
7898
+ children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_lucide_react10.PencilIcon, { className: "size-3" })
7807
7899
  }
7808
7900
  ) })
7809
7901
  }
@@ -7879,7 +7971,7 @@ var AppChatPanel = ({
7879
7971
  className: closeButtonClass,
7880
7972
  onClick: () => shellChat.setOpen(false),
7881
7973
  "aria-label": "Close assistant",
7882
- children: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_lucide_react10.XIcon, { className: "size-4", "aria-hidden": true })
7974
+ children: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_lucide_react11.XIcon, { className: "size-4", "aria-hidden": true })
7883
7975
  }
7884
7976
  ) }) : null,
7885
7977
  /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", { className: bodyClass, children: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
@@ -8408,7 +8500,7 @@ var ResourceCard = ({
8408
8500
  };
8409
8501
 
8410
8502
  // src/app/surfaces/AlertCard.tsx
8411
- var import_lucide_react11 = require("lucide-react");
8503
+ var import_lucide_react12 = require("lucide-react");
8412
8504
  var import_jsx_runtime62 = require("react/jsx-runtime");
8413
8505
  var alertCardShellClass = cn(
8414
8506
  "flex flex-col rounded-2xl p-4 text-left font-normal border border-border shadow-card",
@@ -8452,7 +8544,7 @@ var AlertCard = ({
8452
8544
  ] });
8453
8545
  const cardContent = /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)("div", { className: "flex items-start justify-between gap-4 w-full h-full", children: [
8454
8546
  bodyContent,
8455
- showTrailing ? /* @__PURE__ */ (0, import_jsx_runtime62.jsx)("div", { className: "shrink-0 flex items-center justify-center self-center text-muted-foreground/50", children: trailing || /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_lucide_react11.ChevronRight, { className: "size-4" }) }) : null
8547
+ showTrailing ? /* @__PURE__ */ (0, import_jsx_runtime62.jsx)("div", { className: "shrink-0 flex items-center justify-center self-center text-muted-foreground/50", children: trailing || /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_lucide_react12.ChevronRight, { className: "size-4" }) }) : null
8456
8548
  ] });
8457
8549
  if (onClick) {
8458
8550
  return /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
@@ -8470,11 +8562,11 @@ var AlertCard = ({
8470
8562
  };
8471
8563
 
8472
8564
  // src/app/surfaces/CatalogCard.tsx
8473
- var import_lucide_react13 = require("lucide-react");
8565
+ var import_lucide_react14 = require("lucide-react");
8474
8566
 
8475
8567
  // src/ui/copy-button.tsx
8476
8568
  var React4 = __toESM(require("react"), 1);
8477
- var import_lucide_react12 = require("lucide-react");
8569
+ var import_lucide_react13 = require("lucide-react");
8478
8570
  var import_jsx_runtime63 = require("react/jsx-runtime");
8479
8571
  function CopyButton({
8480
8572
  value,
@@ -8500,7 +8592,7 @@ function CopyButton({
8500
8592
  } catch {
8501
8593
  }
8502
8594
  };
8503
- const Icon = copied ? import_lucide_react12.CheckIcon : import_lucide_react12.CopyIcon;
8595
+ const Icon = copied ? import_lucide_react13.CheckIcon : import_lucide_react13.CopyIcon;
8504
8596
  return /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(
8505
8597
  "button",
8506
8598
  {
@@ -8572,7 +8664,7 @@ var CatalogCard = ({
8572
8664
  onClick: (e) => e.stopPropagation(),
8573
8665
  children: [
8574
8666
  /* @__PURE__ */ (0, import_jsx_runtime64.jsx)("span", { className: "truncate", children: title }),
8575
- /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(import_lucide_react13.ExternalLink, { className: "size-3.5 shrink-0 text-muted-foreground/60" })
8667
+ /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(import_lucide_react14.ExternalLink, { className: "size-3.5 shrink-0 text-muted-foreground/60" })
8576
8668
  ]
8577
8669
  }
8578
8670
  ) : /* @__PURE__ */ (0, import_jsx_runtime64.jsx)("h4", { className: "text-sm font-medium leading-snug text-foreground truncate", children: title }) }),
@@ -8599,7 +8691,7 @@ var CatalogCard = ({
8599
8691
  onClick: (e) => e.stopPropagation(),
8600
8692
  children: [
8601
8693
  /* @__PURE__ */ (0, import_jsx_runtime64.jsx)("span", { children: link.label }),
8602
- /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(import_lucide_react13.ExternalLink, { className: "size-2.5 shrink-0 text-muted-foreground/50" })
8694
+ /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(import_lucide_react14.ExternalLink, { className: "size-2.5 shrink-0 text-muted-foreground/50" })
8603
8695
  ]
8604
8696
  },
8605
8697
  idx
@@ -9264,7 +9356,7 @@ var FieldTextarea = ({
9264
9356
 
9265
9357
  // src/app/forms/FieldSelect.tsx
9266
9358
  var import_react51 = require("react");
9267
- var import_lucide_react14 = require("lucide-react");
9359
+ var import_lucide_react15 = require("lucide-react");
9268
9360
  var import_jsx_runtime79 = require("react/jsx-runtime");
9269
9361
  var selectWrapClass = "relative";
9270
9362
  var selectClass = cn(
@@ -9303,7 +9395,7 @@ var FieldSelect = ({
9303
9395
  }
9304
9396
  ),
9305
9397
  /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(
9306
- import_lucide_react14.ChevronDownIcon,
9398
+ import_lucide_react15.ChevronDownIcon,
9307
9399
  {
9308
9400
  className: "pointer-events-none absolute top-1/2 right-3 size-4 -translate-y-1/2 text-muted-foreground",
9309
9401
  "aria-hidden": true
@@ -9370,7 +9462,7 @@ var FieldSwitch = ({
9370
9462
  };
9371
9463
 
9372
9464
  // src/app/forms/SearchInput.tsx
9373
- var import_lucide_react15 = require("lucide-react");
9465
+ var import_lucide_react16 = require("lucide-react");
9374
9466
  var import_jsx_runtime81 = require("react/jsx-runtime");
9375
9467
  var SearchInput = ({
9376
9468
  className,
@@ -9386,7 +9478,7 @@ var SearchInput = ({
9386
9478
  className
9387
9479
  ),
9388
9480
  children: [
9389
- /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react15.SearchIcon, { className: "size-4 shrink-0 text-muted-foreground", "aria-hidden": true }),
9481
+ /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react16.SearchIcon, { className: "size-4 shrink-0 text-muted-foreground", "aria-hidden": true }),
9390
9482
  /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
9391
9483
  "input",
9392
9484
  {
@@ -9447,11 +9539,11 @@ var FilterField = ({
9447
9539
 
9448
9540
  // src/app/data/FilterDropdown.tsx
9449
9541
  var import_react53 = require("react");
9450
- var import_lucide_react18 = require("lucide-react");
9542
+ var import_lucide_react19 = require("lucide-react");
9451
9543
 
9452
9544
  // src/ui/checkbox.tsx
9453
9545
  var import_radix_ui6 = require("radix-ui");
9454
- var import_lucide_react16 = require("lucide-react");
9546
+ var import_lucide_react17 = require("lucide-react");
9455
9547
  var import_jsx_runtime85 = require("react/jsx-runtime");
9456
9548
  function Checkbox({
9457
9549
  className,
@@ -9473,7 +9565,7 @@ function Checkbox({
9473
9565
  {
9474
9566
  "data-slot": "checkbox-indicator",
9475
9567
  className: "flex items-center justify-center text-current animate-checkbox-pop",
9476
- children: /* @__PURE__ */ (0, import_jsx_runtime85.jsx)(import_lucide_react16.CheckIcon, { className: "size-2.5 stroke-[3.5px]" })
9568
+ children: /* @__PURE__ */ (0, import_jsx_runtime85.jsx)(import_lucide_react17.CheckIcon, { className: "size-2.5 stroke-[3.5px]" })
9477
9569
  }
9478
9570
  )
9479
9571
  }
@@ -9482,7 +9574,7 @@ function Checkbox({
9482
9574
 
9483
9575
  // src/ui/select.tsx
9484
9576
  var import_radix_ui7 = require("radix-ui");
9485
- var import_lucide_react17 = require("lucide-react");
9577
+ var import_lucide_react18 = require("lucide-react");
9486
9578
  var import_jsx_runtime86 = require("react/jsx-runtime");
9487
9579
  function Select({
9488
9580
  ...props
@@ -9513,7 +9605,7 @@ function SelectTrigger({
9513
9605
  ...props,
9514
9606
  children: [
9515
9607
  children,
9516
- /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(import_radix_ui7.Select.Icon, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(import_lucide_react17.ChevronDownIcon, { className: "size-4 opacity-50" }) })
9608
+ /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(import_radix_ui7.Select.Icon, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(import_lucide_react18.ChevronDownIcon, { className: "size-4 opacity-50" }) })
9517
9609
  ]
9518
9610
  }
9519
9611
  );
@@ -9569,7 +9661,7 @@ function SelectItem({
9569
9661
  ),
9570
9662
  ...props,
9571
9663
  children: [
9572
- /* @__PURE__ */ (0, import_jsx_runtime86.jsx)("span", { className: "absolute right-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(import_radix_ui7.Select.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(import_lucide_react17.CheckIcon, { className: "size-4" }) }) }),
9664
+ /* @__PURE__ */ (0, import_jsx_runtime86.jsx)("span", { className: "absolute right-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(import_radix_ui7.Select.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(import_lucide_react18.CheckIcon, { className: "size-4" }) }) }),
9573
9665
  /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(import_radix_ui7.Select.ItemText, { children })
9574
9666
  ]
9575
9667
  }
@@ -9585,7 +9677,7 @@ function SelectScrollUpButton({
9585
9677
  "data-slot": "select-scroll-up-button",
9586
9678
  className: cn("flex cursor-default items-center justify-center py-1", className),
9587
9679
  ...props,
9588
- children: /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(import_lucide_react17.ChevronUpIcon, { className: "size-4" })
9680
+ children: /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(import_lucide_react18.ChevronUpIcon, { className: "size-4" })
9589
9681
  }
9590
9682
  );
9591
9683
  }
@@ -9599,7 +9691,7 @@ function SelectScrollDownButton({
9599
9691
  "data-slot": "select-scroll-down-button",
9600
9692
  className: cn("flex cursor-default items-center justify-center py-1", className),
9601
9693
  ...props,
9602
- children: /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(import_lucide_react17.ChevronDownIcon, { className: "size-4" })
9694
+ children: /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(import_lucide_react18.ChevronDownIcon, { className: "size-4" })
9603
9695
  }
9604
9696
  );
9605
9697
  }
@@ -9767,7 +9859,7 @@ function FilterDropdown({
9767
9859
  variant: "outline",
9768
9860
  size: "sm",
9769
9861
  className: "border-dashed font-medium text-muted-foreground hover:text-foreground",
9770
- iconLeading: /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(import_lucide_react18.ListFilterIcon, { className: "size-4" }),
9862
+ iconLeading: /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(import_lucide_react19.ListFilterIcon, { className: "size-4" }),
9771
9863
  children: label
9772
9864
  }
9773
9865
  ) }),
@@ -9795,7 +9887,7 @@ function FilterDropdown({
9795
9887
  field.icon,
9796
9888
  /* @__PURE__ */ (0, import_jsx_runtime88.jsx)("span", { children: field.label })
9797
9889
  ] }),
9798
- /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(import_lucide_react18.ChevronRightIcon, { className: "size-4 text-muted-foreground/50" })
9890
+ /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(import_lucide_react19.ChevronRightIcon, { className: "size-4 text-muted-foreground/50" })
9799
9891
  ]
9800
9892
  },
9801
9893
  field.id
@@ -9843,7 +9935,7 @@ function FilterChip({ label, onRemove }) {
9843
9935
  onClick: onRemove,
9844
9936
  "aria-label": `Remove ${label}`,
9845
9937
  className: "flex size-5 items-center justify-center rounded-full text-muted-foreground outline-none transition-colors hover:bg-muted hover:text-foreground",
9846
- children: /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(import_lucide_react18.XIcon, { className: "size-3.5" })
9938
+ children: /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(import_lucide_react19.XIcon, { className: "size-3.5" })
9847
9939
  }
9848
9940
  )
9849
9941
  ] });
@@ -10106,7 +10198,7 @@ function ApplyClear({ onClear, onApply }) {
10106
10198
 
10107
10199
  // src/app/data/DataTable.tsx
10108
10200
  var import_react54 = require("react");
10109
- var import_lucide_react19 = require("lucide-react");
10201
+ var import_lucide_react20 = require("lucide-react");
10110
10202
 
10111
10203
  // src/ui/skeleton.tsx
10112
10204
  var import_jsx_runtime89 = require("react/jsx-runtime");
@@ -10165,12 +10257,12 @@ function SortIndicator({
10165
10257
  }) {
10166
10258
  const iconClass = "size-3.5 shrink-0 opacity-60 group-hover:opacity-100";
10167
10259
  if (!active) {
10168
- return /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(import_lucide_react19.ArrowUpDownIcon, { className: iconClass, "aria-hidden": true });
10260
+ return /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(import_lucide_react20.ArrowUpDownIcon, { className: iconClass, "aria-hidden": true });
10169
10261
  }
10170
10262
  if (direction === "desc") {
10171
- return /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(import_lucide_react19.ArrowDownIcon, { className: iconClass, "aria-hidden": true });
10263
+ return /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(import_lucide_react20.ArrowDownIcon, { className: iconClass, "aria-hidden": true });
10172
10264
  }
10173
- return /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(import_lucide_react19.ArrowUpIcon, { className: iconClass, "aria-hidden": true });
10265
+ return /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(import_lucide_react20.ArrowUpIcon, { className: iconClass, "aria-hidden": true });
10174
10266
  }
10175
10267
  function DataTable({
10176
10268
  columns,
@@ -10447,7 +10539,7 @@ function DataTable({
10447
10539
  onClick: () => setPage(pageIndex - 1),
10448
10540
  disabled: pageIndex <= 0,
10449
10541
  "aria-label": "Previous page",
10450
- children: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(import_lucide_react19.ChevronLeftIcon, { className: "size-4", "aria-hidden": true })
10542
+ children: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(import_lucide_react20.ChevronLeftIcon, { className: "size-4", "aria-hidden": true })
10451
10543
  }
10452
10544
  ),
10453
10545
  /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(
@@ -10458,7 +10550,7 @@ function DataTable({
10458
10550
  onClick: () => setPage(pageIndex + 1),
10459
10551
  disabled: pageIndex >= pageCount - 1,
10460
10552
  "aria-label": "Next page",
10461
- children: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(import_lucide_react19.ChevronRightIcon, { className: "size-4", "aria-hidden": true })
10553
+ children: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(import_lucide_react20.ChevronRightIcon, { className: "size-4", "aria-hidden": true })
10462
10554
  }
10463
10555
  )
10464
10556
  ] })
@@ -10997,7 +11089,7 @@ function UntitledButton({
10997
11089
  }
10998
11090
 
10999
11091
  // src/ui/banner.tsx
11000
- var import_lucide_react20 = require("lucide-react");
11092
+ var import_lucide_react21 = require("lucide-react");
11001
11093
  var import_jsx_runtime95 = require("react/jsx-runtime");
11002
11094
  var bannerSoftClass = {
11003
11095
  default: "border-border/50 bg-muted/30 text-foreground/90 dark:bg-muted/15",
@@ -11094,7 +11186,7 @@ function Banner({
11094
11186
  isSingleLine ? "self-center" : "-mt-0.5",
11095
11187
  isSolid ? "opacity-80 hover:bg-background/15 hover:opacity-100" : "text-muted-foreground hover:bg-foreground/10 hover:text-foreground"
11096
11188
  ),
11097
- children: /* @__PURE__ */ (0, import_jsx_runtime95.jsx)(import_lucide_react20.XIcon, { className: "size-4", "aria-hidden": true })
11189
+ children: /* @__PURE__ */ (0, import_jsx_runtime95.jsx)(import_lucide_react21.XIcon, { className: "size-4", "aria-hidden": true })
11098
11190
  }
11099
11191
  ) : null
11100
11192
  ]
@@ -11193,7 +11285,7 @@ var React5 = __toESM(require("react"), 1);
11193
11285
  var import_core2 = require("@dnd-kit/core");
11194
11286
  var import_sortable = require("@dnd-kit/sortable");
11195
11287
  var import_utilities = require("@dnd-kit/utilities");
11196
- var import_lucide_react21 = require("lucide-react");
11288
+ var import_lucide_react22 = require("lucide-react");
11197
11289
  var import_jsx_runtime97 = require("react/jsx-runtime");
11198
11290
  var columnTitleToneClass = {
11199
11291
  default: "text-foreground",
@@ -11279,7 +11371,7 @@ function SortableCard({
11279
11371
  className: "absolute right-1.5 top-1.5 z-10 grid size-6 cursor-grab touch-none place-items-center rounded-md text-muted-foreground/40 opacity-0 transition hover:bg-foreground/5 hover:text-foreground focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-foreground/15 group-hover/kanban-card:opacity-100 active:cursor-grabbing",
11280
11372
  ...attributes,
11281
11373
  ...listeners,
11282
- children: /* @__PURE__ */ (0, import_jsx_runtime97.jsx)(import_lucide_react21.GripVerticalIcon, { className: "size-4", "aria-hidden": true })
11374
+ children: /* @__PURE__ */ (0, import_jsx_runtime97.jsx)(import_lucide_react22.GripVerticalIcon, { className: "size-4", "aria-hidden": true })
11283
11375
  }
11284
11376
  ) : null,
11285
11377
  renderCard(card, { column, isDragging, isOverlay: false, dragHandleProps })