@timbal-ai/timbal-react 0.8.2 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -33,7 +33,25 @@ __export(index_exports, {
33
33
  APP_KIT_AGENT_INSTRUCTIONS: () => APP_KIT_AGENT_INSTRUCTIONS,
34
34
  ARTIFACT_AGENT_INSTRUCTIONS: () => ARTIFACT_AGENT_INSTRUCTIONS,
35
35
  ARTIFACT_FENCE_LANGUAGES: () => ARTIFACT_FENCE_LANGUAGES,
36
+ Accordion: () => Accordion,
37
+ AccordionContent: () => AccordionContent,
38
+ AccordionItem: () => AccordionItem,
39
+ AccordionTrigger: () => AccordionTrigger,
36
40
  ActionBarPrimitive: () => import_react69.ActionBarPrimitive,
41
+ Alert: () => Alert,
42
+ AlertDescription: () => AlertDescription,
43
+ AlertDialog: () => AlertDialog,
44
+ AlertDialogAction: () => AlertDialogAction,
45
+ AlertDialogCancel: () => AlertDialogCancel,
46
+ AlertDialogContent: () => AlertDialogContent,
47
+ AlertDialogDescription: () => AlertDialogDescription,
48
+ AlertDialogFooter: () => AlertDialogFooter,
49
+ AlertDialogHeader: () => AlertDialogHeader,
50
+ AlertDialogOverlay: () => AlertDialogOverlay,
51
+ AlertDialogPortal: () => AlertDialogPortal,
52
+ AlertDialogTitle: () => AlertDialogTitle,
53
+ AlertDialogTrigger: () => AlertDialogTrigger,
54
+ AlertTitle: () => AlertTitle,
37
55
  AppChatPanel: () => AppChatPanel,
38
56
  AppConfirmDialog: () => AppConfirmDialog,
39
57
  AppCopilotProvider: () => AppCopilotProvider,
@@ -43,25 +61,88 @@ __export(index_exports, {
43
61
  ArtifactCard: () => ArtifactCard,
44
62
  ArtifactRegistryProvider: () => ArtifactRegistryProvider,
45
63
  ArtifactView: () => ArtifactView,
64
+ AspectRatio: () => AspectRatio,
46
65
  AssistantRuntimeProvider: () => import_react69.AssistantRuntimeProvider,
47
66
  AuiIf: () => import_react69.AuiIf,
48
67
  AuthGuard: () => AuthGuard,
49
68
  Avatar: () => Avatar,
50
69
  AvatarFallback: () => AvatarFallback,
51
70
  AvatarImage: () => AvatarImage,
71
+ Badge: () => Badge,
72
+ Breadcrumb: () => Breadcrumb,
73
+ BreadcrumbEllipsis: () => BreadcrumbEllipsis,
74
+ BreadcrumbItem: () => BreadcrumbItem,
75
+ BreadcrumbLink: () => BreadcrumbLink,
76
+ BreadcrumbList: () => BreadcrumbList,
77
+ BreadcrumbPage: () => BreadcrumbPage,
78
+ BreadcrumbSeparator: () => BreadcrumbSeparator,
52
79
  Breadcrumbs: () => Breadcrumbs,
53
80
  Button: () => Button,
54
81
  CHART_PALETTE: () => CHART_PALETTE,
82
+ COLOR_UTILITY_PREFIXES: () => COLOR_UTILITY_PREFIXES,
83
+ CONTROL_SIZE: () => CONTROL_SIZE,
84
+ Calendar: () => Calendar,
85
+ CalendarDayButton: () => CalendarDayButton,
86
+ Card: () => Card,
87
+ CardContent: () => CardContent,
88
+ CardDescription: () => CardDescription,
89
+ CardFooter: () => CardFooter,
90
+ CardHeader: () => CardHeader,
91
+ CardTitle: () => CardTitle,
55
92
  ChartArtifactView: () => ChartArtifactView,
56
93
  ChartPanel: () => ChartPanel,
94
+ Checkbox: () => Checkbox,
95
+ Collapsible: () => Collapsible,
96
+ CollapsibleContent: () => CollapsibleContent,
97
+ CollapsibleTrigger: () => CollapsibleTrigger,
98
+ Combobox: () => Combobox,
99
+ ComboboxAnchor: () => ComboboxAnchor,
100
+ ComboboxCommand: () => ComboboxCommand,
101
+ ComboboxContent: () => ComboboxContent,
102
+ ComboboxEmpty: () => ComboboxEmpty,
103
+ ComboboxGroup: () => ComboboxGroup,
104
+ ComboboxInput: () => ComboboxInput,
105
+ ComboboxItem: () => ComboboxItem,
106
+ ComboboxList: () => ComboboxList,
107
+ ComboboxSeparator: () => ComboboxSeparator,
108
+ ComboboxShortcut: () => ComboboxShortcut,
109
+ ComboboxTrigger: () => ComboboxTrigger,
110
+ Command: () => Command,
111
+ CommandDialog: () => CommandDialog,
112
+ CommandEmpty: () => CommandEmpty,
113
+ CommandGroup: () => CommandGroup,
114
+ CommandInput: () => CommandInput,
115
+ CommandItem: () => CommandItem,
116
+ CommandList: () => CommandList,
117
+ CommandSeparator: () => CommandSeparator,
118
+ CommandShortcut: () => CommandShortcut,
57
119
  Composer: () => Composer,
58
120
  ComposerPrimitive: () => import_react69.ComposerPrimitive,
59
121
  ConnectionRow: () => ConnectionRow,
60
122
  ConnectionRowList: () => ConnectionRowList,
123
+ ContextMenu: () => ContextMenu,
124
+ ContextMenuCheckboxItem: () => ContextMenuCheckboxItem,
125
+ ContextMenuContent: () => ContextMenuContent,
126
+ ContextMenuGroup: () => ContextMenuGroup,
127
+ ContextMenuItem: () => ContextMenuItem,
128
+ ContextMenuLabel: () => ContextMenuLabel,
129
+ ContextMenuRadioGroup: () => ContextMenuRadioGroup,
130
+ ContextMenuRadioItem: () => ContextMenuRadioItem,
131
+ ContextMenuSeparator: () => ContextMenuSeparator,
132
+ ContextMenuShortcut: () => ContextMenuShortcut,
133
+ ContextMenuSub: () => ContextMenuSub,
134
+ ContextMenuSubContent: () => ContextMenuSubContent,
135
+ ContextMenuSubTrigger: () => ContextMenuSubTrigger,
136
+ ContextMenuTrigger: () => ContextMenuTrigger,
61
137
  DEFAULT_UPLOAD_ACCEPT: () => DEFAULT_UPLOAD_ACCEPT,
62
138
  DangerZone: () => DangerZone,
63
139
  DangerZoneAction: () => DangerZoneAction,
64
140
  DataTable: () => DataTable,
141
+ DatePicker: () => DatePicker,
142
+ DatePickerButton: () => DatePickerButton,
143
+ DatePickerCalendar: () => DatePickerCalendar,
144
+ DatePickerContent: () => DatePickerContent,
145
+ DatePickerTrigger: () => DatePickerTrigger,
65
146
  DescriptionList: () => DescriptionList,
66
147
  Dialog: () => Dialog,
67
148
  DialogClose: () => DialogClose,
@@ -97,32 +178,93 @@ __export(index_exports, {
97
178
  FieldTextarea: () => FieldTextarea,
98
179
  FilterBar: () => FilterBar,
99
180
  FloatingUnsavedChangesBar: () => FloatingUnsavedChangesBar,
181
+ Form: () => Form,
182
+ FormControl: () => FormControl,
183
+ FormField: () => FormField,
184
+ FormItem: () => FormItem,
185
+ FormLabel: () => FormLabel,
186
+ FormMessage: () => FormMessage,
100
187
  FormSection: () => FormSection,
188
+ FormSubmit: () => FormSubmit,
189
+ HOUSE_RULES: () => HOUSE_RULES,
190
+ HoverCard: () => HoverCard,
191
+ HoverCardContent: () => HoverCardContent,
192
+ HoverCardTrigger: () => HoverCardTrigger,
101
193
  HtmlArtifactView: () => HtmlArtifactView,
102
194
  INTEGRATION_CATALOG_CARD_HEIGHT_CLASS: () => INTEGRATION_CATALOG_CARD_HEIGHT_CLASS,
103
195
  InfoCard: () => InfoCard,
196
+ Input: () => Input,
197
+ InputGroup: () => InputGroup,
198
+ InputGroupAddon: () => InputGroupAddon,
199
+ InputGroupInput: () => InputGroupInput,
200
+ InputGroupText: () => InputGroupText,
201
+ InputOTP: () => InputOTP,
202
+ InputOTPGroup: () => InputOTPGroup,
203
+ InputOTPHiddenInput: () => InputOTPHiddenInput,
204
+ InputOTPSeparator: () => InputOTPSeparator,
205
+ InputOTPSlot: () => InputOTPSlot,
104
206
  IntegrationCard: () => IntegrationCard,
105
207
  IntegrationsEmptyState: () => IntegrationsEmptyState,
106
208
  JsonArtifactView: () => JsonArtifactView,
209
+ Kbd: () => Kbd,
210
+ KbdGroup: () => KbdGroup,
211
+ Label: () => Label,
107
212
  LineAreaChart: () => LineAreaChart,
108
213
  MarkdownText: () => MarkdownText,
109
214
  MemoPillSegmentedTabs: () => MemoPillSegmentedTabs,
215
+ Menubar: () => Menubar,
216
+ MenubarCheckboxItem: () => MenubarCheckboxItem,
217
+ MenubarContent: () => MenubarContent,
218
+ MenubarItem: () => MenubarItem,
219
+ MenubarLabel: () => MenubarLabel,
220
+ MenubarMenu: () => MenubarMenu,
221
+ MenubarRadioGroup: () => MenubarRadioGroup,
222
+ MenubarRadioItem: () => MenubarRadioItem,
223
+ MenubarSeparator: () => MenubarSeparator,
224
+ MenubarShortcut: () => MenubarShortcut,
225
+ MenubarSub: () => MenubarSub,
226
+ MenubarSubContent: () => MenubarSubContent,
227
+ MenubarSubTrigger: () => MenubarSubTrigger,
228
+ MenubarTrigger: () => MenubarTrigger,
110
229
  MessagePrimitive: () => import_react69.MessagePrimitive,
111
230
  MetricChartCard: () => MetricChartCard,
112
231
  MetricRow: () => MetricRow,
113
232
  MetricTile: () => MetricTile,
114
233
  ModeToggle: () => ModeToggle,
234
+ NavigationMenu: () => NavigationMenu,
235
+ NavigationMenuContent: () => NavigationMenuContent,
236
+ NavigationMenuIndicator: () => NavigationMenuIndicator,
237
+ NavigationMenuItem: () => NavigationMenuItem,
238
+ NavigationMenuLink: () => NavigationMenuLink,
239
+ NavigationMenuList: () => NavigationMenuList,
240
+ NavigationMenuTrigger: () => NavigationMenuTrigger,
241
+ NavigationMenuViewport: () => NavigationMenuViewport,
115
242
  Page: () => Page,
116
243
  PageHeader: () => PageHeader,
244
+ Pagination: () => Pagination,
245
+ PaginationContent: () => PaginationContent,
246
+ PaginationEllipsis: () => PaginationEllipsis,
247
+ PaginationItem: () => PaginationItem,
248
+ PaginationLink: () => PaginationLink,
249
+ PaginationNext: () => PaginationNext,
250
+ PaginationPrevious: () => PaginationPrevious,
117
251
  PillSegmentedTabs: () => PillSegmentedTabs,
118
252
  PlanBadge: () => PlanBadge,
119
253
  Popover: () => Popover,
120
254
  PopoverAnchor: () => PopoverAnchor,
121
255
  PopoverContent: () => PopoverContent,
122
256
  PopoverTrigger: () => PopoverTrigger,
257
+ Progress: () => Progress,
123
258
  QuestionArtifactView: () => QuestionArtifactView,
259
+ RESERVED_GRADIENT_TOKENS: () => RESERVED_GRADIENT_TOKENS,
260
+ RadioGroup: () => RadioGroup,
261
+ RadioGroupItem: () => RadioGroupItem,
124
262
  ResourceCard: () => ResourceCard,
263
+ SEMANTIC_COLOR_TOKENS: () => SEMANTIC_COLOR_TOKENS,
264
+ SLOP_BUDGETS: () => SLOP_BUDGETS,
125
265
  STUDIO_NAV_MODE: () => STUDIO_NAV_MODE,
266
+ ScrollArea: () => ScrollArea,
267
+ ScrollBar: () => ScrollBar,
126
268
  SearchInput: () => SearchInput,
127
269
  Section: () => Section,
128
270
  Select: () => Select,
@@ -135,11 +277,23 @@ __export(index_exports, {
135
277
  SelectSeparator: () => SelectSeparator,
136
278
  SelectTrigger: () => SelectTrigger,
137
279
  SelectValue: () => SelectValue,
280
+ Separator: () => Separator,
138
281
  SessionProvider: () => SessionProvider,
139
282
  SettingsSection: () => SettingsSection,
140
283
  SettingsSectionHeader: () => SettingsSectionHeader,
284
+ Sheet: () => Sheet,
285
+ SheetClose: () => SheetClose,
286
+ SheetContent: () => SheetContent,
287
+ SheetDescription: () => SheetDescription,
288
+ SheetFooter: () => SheetFooter,
289
+ SheetHeader: () => SheetHeader,
290
+ SheetTitle: () => SheetTitle,
291
+ SheetTrigger: () => SheetTrigger,
141
292
  Shimmer: () => Shimmer,
293
+ Skeleton: () => Skeleton,
294
+ Slider: () => Slider,
142
295
  Sparkline: () => Sparkline,
296
+ Spinner: () => Spinner,
143
297
  StatTile: () => StatTile,
144
298
  StatusBadge: () => StatusBadge,
145
299
  StatusDot: () => StatusDot,
@@ -149,10 +303,21 @@ __export(index_exports, {
149
303
  SubNav: () => SubNav,
150
304
  Suggestions: () => Suggestions,
151
305
  SurfaceCard: () => SurfaceCard,
306
+ Switch: () => Switch,
307
+ TAILWIND_PALETTE_COLORS: () => TAILWIND_PALETTE_COLORS,
152
308
  THEME_AGENT_INSTRUCTIONS: () => THEME_AGENT_INSTRUCTIONS,
153
309
  THREAD_DEFAULT_MAX_WIDTH: () => THREAD_DEFAULT_MAX_WIDTH,
154
310
  TIMBAL_THEME_PRESETS: () => TIMBAL_THEME_PRESETS,
311
+ Table: () => Table,
155
312
  TableArtifactView: () => TableArtifactView,
313
+ TableBody: () => TableBody,
314
+ TableCaption: () => TableCaption,
315
+ TableCell: () => TableCell,
316
+ TableFooter: () => TableFooter,
317
+ TableHead: () => TableHead,
318
+ TableHeader: () => TableHeader,
319
+ TableRow: () => TableRow,
320
+ Textarea: () => Textarea,
156
321
  ThemePresetGallery: () => ThemePresetGallery,
157
322
  Thread: () => Thread,
158
323
  ThreadPrimitive: () => import_react69.ThreadPrimitive,
@@ -162,27 +327,49 @@ __export(index_exports, {
162
327
  TimbalRuntimeProvider: () => TimbalRuntimeProvider,
163
328
  TimbalStudioShell: () => TimbalStudioShell,
164
329
  TimbalThemeStyle: () => TimbalThemeStyle,
330
+ Toast: () => Toast,
331
+ ToastAction: () => ToastAction,
332
+ ToastClose: () => ToastClose,
333
+ ToastDescription: () => ToastDescription,
334
+ ToastProvider: () => ToastProvider,
335
+ ToastTitle: () => ToastTitle,
336
+ ToastViewport: () => ToastViewport,
337
+ Toaster: () => Toaster,
338
+ Toggle: () => Toggle,
339
+ ToggleGroup: () => ToggleGroup,
340
+ ToggleGroupItem: () => ToggleGroupItem,
165
341
  ToolArtifactFallback: () => ToolArtifactFallback,
166
342
  ToolFallback: () => ToolFallback,
343
+ Toolbar: () => Toolbar,
344
+ ToolbarButton: () => ToolbarButton,
345
+ ToolbarLink: () => ToolbarLink,
346
+ ToolbarSeparator: () => ToolbarSeparator,
347
+ ToolbarToggleGroup: () => ToolbarToggleGroup,
348
+ ToolbarToggleItem: () => ToolbarToggleItem,
167
349
  Tooltip: () => Tooltip,
168
350
  TooltipContent: () => TooltipContent,
169
351
  TooltipIconButton: () => TooltipIconButton,
170
352
  TooltipProvider: () => TooltipProvider,
171
353
  TooltipTrigger: () => TooltipTrigger,
354
+ UI_REVIEW_AGENT_INSTRUCTIONS: () => UI_REVIEW_AGENT_INSTRUCTIONS,
172
355
  UiArtifactView: () => UiArtifactView,
173
356
  UiCustomNodeRegistryProvider: () => UiCustomNodeRegistryProvider,
174
357
  UiEventProvider: () => UiEventProvider,
175
358
  UiNodeView: () => UiNodeView,
176
359
  WorkforceSelector: () => WorkforceSelector,
360
+ alertVariants: () => alertVariants,
177
361
  applyThemePreset: () => applyThemePreset,
178
362
  applyTimbalTheme: () => applyTimbalTheme,
179
363
  assistantMessageContentClass: () => assistantMessageContentClass,
180
364
  assistantMessageRootClass: () => assistantMessageRootClass,
181
365
  authFetch: () => authFetch,
366
+ badgeVariants: () => badgeVariants,
182
367
  clearTimbalTheme: () => clearTimbalTheme,
183
368
  clearTokens: () => clearTokens,
184
369
  cn: () => cn,
185
370
  connectionRowListClass: () => connectionRowListClass,
371
+ controlClass: () => controlClass,
372
+ controlSurfaceClass: () => controlSurfaceClass,
186
373
  createDefaultAttachmentAdapter: () => createDefaultAttachmentAdapter,
187
374
  createTimbalTheme: () => createTimbalTheme,
188
375
  createUploadAttachmentAdapter: () => createUploadAttachmentAdapter,
@@ -190,6 +377,8 @@ __export(index_exports, {
190
377
  ensureThemeFontLink: () => ensureThemeFontLink,
191
378
  fetchCurrentUser: () => fetchCurrentUser,
192
379
  findMarkdownArtifacts: () => findMarkdownArtifacts,
380
+ formatLintReport: () => formatLintReport,
381
+ formatPickerDate: () => formatPickerDate,
193
382
  getAccessToken: () => getAccessToken,
194
383
  getPath: () => getPath,
195
384
  getRefreshToken: () => getRefreshToken,
@@ -198,17 +387,26 @@ __export(index_exports, {
198
387
  isArtifact: () => isArtifact,
199
388
  isArtifactFenceLanguage: () => isArtifactFenceLanguage,
200
389
  isUiBinding: () => isUiBinding,
390
+ lintGeneratedUi: () => lintGeneratedUi,
391
+ navigationMenuTriggerStyle: () => navigationMenuTriggerStyle,
392
+ overlayAnimationClass: () => overlayAnimationClass,
393
+ overlayItemClass: () => overlayItemClass,
394
+ overlayListPanelClass: () => overlayListPanelClass,
395
+ overlaySurfaceClass: () => overlaySurfaceClass,
201
396
  parseArtifactFromToolResult: () => parseArtifactFromToolResult,
202
397
  parseSSELine: () => import_timbal_sdk2.parseSSELine,
203
398
  refreshAccessToken: () => refreshAccessToken,
204
399
  resolveAttachmentAdapter: () => resolveAttachmentAdapter,
205
400
  resolveBindable: () => resolveBindable,
401
+ reviewGeneratedUi: () => reviewGeneratedUi,
206
402
  setAccessToken: () => setAccessToken,
207
403
  setPath: () => setPath,
208
404
  setRefreshToken: () => setRefreshToken,
209
405
  splitMarkdownByArtifacts: () => splitMarkdownByArtifacts,
210
406
  themeToCss: () => themeToCss,
211
407
  threadMessageColumnClass: () => threadMessageColumnClass,
408
+ toast: () => toast,
409
+ toggleVariants: () => toggleVariants,
212
410
  useAppCopilotContext: () => useAppCopilotContext,
213
411
  useAppShellChat: () => useAppShellChat,
214
412
  useArtifactRegistry: () => useArtifactRegistry,
@@ -221,6 +419,7 @@ __export(index_exports, {
221
419
  useThreadRuntime: () => import_react69.useThreadRuntime,
222
420
  useTimbalRuntime: () => useTimbalRuntime,
223
421
  useTimbalStream: () => useTimbalStream,
422
+ useToast: () => useToast,
224
423
  useToolRunning: () => useToolRunning,
225
424
  useUiCustomNodeRegistry: () => useUiCustomNodeRegistry,
226
425
  useUiDispatch: () => useUiDispatch,
@@ -2755,7 +2954,7 @@ var import_jsx_runtime16 = require("react/jsx-runtime");
2755
2954
  var UiStateContext = (0, import_react12.createContext)({});
2756
2955
  var UiDispatchContext = (0, import_react12.createContext)(() => {
2757
2956
  });
2758
- var UiStateProvider = ({ state, dispatch, children }) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(UiStateContext.Provider, { value: state, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(UiDispatchContext.Provider, { value: dispatch, children }) });
2957
+ var UiStateProvider = ({ state, dispatch: dispatch2, children }) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(UiStateContext.Provider, { value: state, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(UiDispatchContext.Provider, { value: dispatch2, children }) });
2759
2958
  function useUiState() {
2760
2959
  return (0, import_react12.useContext)(UiStateContext);
2761
2960
  }
@@ -2879,7 +3078,7 @@ var UiNodeView = ({ node }) => {
2879
3078
  };
2880
3079
  function useActionRunner() {
2881
3080
  const state = useUiState();
2882
- const dispatch = useUiDispatch();
3081
+ const dispatch2 = useUiDispatch();
2883
3082
  const runtime = (0, import_react15.useThreadRuntime)();
2884
3083
  const emit = useUiEventEmitter();
2885
3084
  return (0, import_react13.useCallback)(
@@ -2900,11 +3099,11 @@ function useActionRunner() {
2900
3099
  }
2901
3100
  case "set": {
2902
3101
  const value = resolveBindable(action.value, state);
2903
- dispatch({ type: "set", path: action.path, value });
3102
+ dispatch2({ type: "set", path: action.path, value });
2904
3103
  break;
2905
3104
  }
2906
3105
  case "toggle": {
2907
- dispatch({ type: "toggle", path: action.path });
3106
+ dispatch2({ type: "toggle", path: action.path });
2908
3107
  break;
2909
3108
  }
2910
3109
  case "emit": {
@@ -2914,7 +3113,7 @@ function useActionRunner() {
2914
3113
  }
2915
3114
  }
2916
3115
  },
2917
- [state, dispatch, runtime, emit]
3116
+ [state, dispatch2, runtime, emit]
2918
3117
  );
2919
3118
  }
2920
3119
  var ALIGN_CLS = {
@@ -3047,12 +3246,12 @@ var ButtonNode = ({ node }) => {
3047
3246
  };
3048
3247
  var ToggleNode = ({ node }) => {
3049
3248
  const state = useUiState();
3050
- const dispatch = useUiDispatch();
3249
+ const dispatch2 = useUiDispatch();
3051
3250
  const run = useActionRunner();
3052
3251
  const value = Boolean(getPath(state, node.binding));
3053
3252
  const label = node.label ? String(resolveBindable(node.label, state) ?? "") : null;
3054
3253
  const onToggle = () => {
3055
- dispatch({ type: "toggle", path: node.binding });
3254
+ dispatch2({ type: "toggle", path: node.binding });
3056
3255
  run(node.onChange);
3057
3256
  };
3058
3257
  return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
@@ -3094,7 +3293,7 @@ var ToggleNode = ({ node }) => {
3094
3293
  };
3095
3294
  var SliderNode = ({ node }) => {
3096
3295
  const state = useUiState();
3097
- const dispatch = useUiDispatch();
3296
+ const dispatch2 = useUiDispatch();
3098
3297
  const run = useActionRunner();
3099
3298
  const min = node.min ?? 0;
3100
3299
  const max = node.max ?? 100;
@@ -3105,7 +3304,7 @@ var SliderNode = ({ node }) => {
3105
3304
  const label = node.label ? String(resolveBindable(node.label, state) ?? "") : null;
3106
3305
  const onChange = (e) => {
3107
3306
  const next = Number(e.target.value);
3108
- dispatch({ type: "set", path: node.binding, value: next });
3307
+ dispatch2({ type: "set", path: node.binding, value: next });
3109
3308
  };
3110
3309
  return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: cn("aui-ui-slider flex flex-col gap-1", node.className), children: [
3111
3310
  (label || showValue) && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "flex items-center justify-between text-xs text-muted-foreground", children: [
@@ -3180,11 +3379,11 @@ function resolveProps(props, state) {
3180
3379
  // src/artifacts/ui/ui-artifact.tsx
3181
3380
  var import_jsx_runtime19 = require("react/jsx-runtime");
3182
3381
  var UiArtifactView = ({ artifact }) => {
3183
- const [state, dispatch] = (0, import_react16.useReducer)(
3382
+ const [state, dispatch2] = (0, import_react16.useReducer)(
3184
3383
  uiStateReducer,
3185
3384
  artifact.initialState ?? {}
3186
3385
  );
3187
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(ArtifactCard, { title: artifact.title, kind: "ui", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(UiStateProvider, { state, dispatch, children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "aui-ui-root p-3", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(UiNodeView, { node: artifact.root }) }) }) });
3386
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(ArtifactCard, { title: artifact.title, kind: "ui", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(UiStateProvider, { state, dispatch: dispatch2, children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "aui-ui-root p-3", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(UiNodeView, { node: artifact.root }) }) }) });
3188
3387
  };
3189
3388
 
3190
3389
  // src/artifacts/registry.tsx
@@ -4666,6 +4865,41 @@ function TimbalChat({
4666
4865
 
4667
4866
  // src/chat/workforce-selector.tsx
4668
4867
  var import_lucide_react9 = require("lucide-react");
4868
+
4869
+ // src/design/control-surface.ts
4870
+ var CONTROL_SIZE = {
4871
+ sm: "h-9 px-3",
4872
+ default: "h-10 px-3"
4873
+ };
4874
+ var CONTROL_SHAPE = {
4875
+ field: "rounded-lg",
4876
+ pill: "rounded-full"
4877
+ };
4878
+ var controlSurfaceClass = cn(
4879
+ TIMBAL_V2_SECONDARY_CHROME,
4880
+ "text-sm text-foreground outline-none",
4881
+ "placeholder:text-muted-foreground/70",
4882
+ "focus-visible:ring-2 focus-visible:ring-foreground/10",
4883
+ "focus-within:ring-2 focus-within:ring-foreground/10",
4884
+ "disabled:cursor-not-allowed disabled:opacity-50",
4885
+ "data-[placeholder]:text-muted-foreground"
4886
+ );
4887
+ function controlClass(options = {}, className) {
4888
+ const { size = "default", shape = "field" } = options;
4889
+ return cn(controlSurfaceClass, CONTROL_SIZE[size], CONTROL_SHAPE[shape], className);
4890
+ }
4891
+ var overlayAnimationClass = "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2";
4892
+ var overlaySurfaceClass = cn(
4893
+ "z-[80] border border-border bg-popover text-popover-foreground shadow-card",
4894
+ overlayAnimationClass
4895
+ );
4896
+ var overlayListPanelClass = cn(
4897
+ overlaySurfaceClass,
4898
+ "overflow-hidden rounded-lg p-0 outline-hidden"
4899
+ );
4900
+ var overlayItemClass = "relative flex cursor-default items-center gap-2 rounded-md px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground";
4901
+
4902
+ // src/chat/workforce-selector.tsx
4669
4903
  var import_jsx_runtime31 = require("react/jsx-runtime");
4670
4904
  var WorkforceSelector = ({
4671
4905
  workforces,
@@ -4682,8 +4916,8 @@ var WorkforceSelector = ({
4682
4916
  {
4683
4917
  className: cn(
4684
4918
  "aui-workforce-selector relative inline-flex items-center",
4919
+ controlSurfaceClass,
4685
4920
  studioTopbarPillHeightClass,
4686
- studioSecondaryChromeClass,
4687
4921
  "rounded-full",
4688
4922
  className
4689
4923
  ),
@@ -6476,7 +6710,191 @@ var StudioModeSwitch = (0, import_react53.memo)(
6476
6710
  }
6477
6711
  );
6478
6712
 
6713
+ // src/design/ui-vocabulary.ts
6714
+ var SEMANTIC_COLOR_TOKENS = [
6715
+ // shadcn-style base tokens
6716
+ "background",
6717
+ "foreground",
6718
+ "card",
6719
+ "card-foreground",
6720
+ "popover",
6721
+ "popover-foreground",
6722
+ "primary",
6723
+ "primary-foreground",
6724
+ "secondary",
6725
+ "secondary-foreground",
6726
+ "muted",
6727
+ "muted-foreground",
6728
+ "accent",
6729
+ "accent-foreground",
6730
+ "destructive",
6731
+ "destructive-foreground",
6732
+ "border",
6733
+ "input",
6734
+ "ring",
6735
+ // sidebar scope
6736
+ "sidebar",
6737
+ "sidebar-foreground",
6738
+ "sidebar-primary",
6739
+ "sidebar-primary-foreground",
6740
+ "sidebar-accent",
6741
+ "sidebar-accent-foreground",
6742
+ "sidebar-border",
6743
+ "sidebar-ring",
6744
+ // timbal chrome extensions
6745
+ "elevated-from",
6746
+ "elevated-to",
6747
+ "modal-from",
6748
+ "modal-to",
6749
+ "playground-from",
6750
+ "playground-via",
6751
+ "playground-to",
6752
+ "composer-bg",
6753
+ "composer-border",
6754
+ "composer-border-focus",
6755
+ "bubble-user",
6756
+ "bubble-user-foreground",
6757
+ "code-block-bg",
6758
+ "code-header-bg"
6759
+ ];
6760
+ var RESERVED_GRADIENT_TOKENS = [
6761
+ "primary-fill-from",
6762
+ "primary-fill-to",
6763
+ "primary-fill-hover-from",
6764
+ "primary-fill-hover-to",
6765
+ "primary-fill-active-from",
6766
+ "primary-fill-active-to",
6767
+ "secondary-fill-hover-from",
6768
+ "secondary-fill-hover-to",
6769
+ "secondary-fill-active-from",
6770
+ "secondary-fill-active-to",
6771
+ "destructive-fill-hover-from",
6772
+ "destructive-fill-hover-to",
6773
+ "destructive-fill-active-from",
6774
+ "destructive-fill-active-to",
6775
+ "ghost-fill-hover",
6776
+ "ghost-fill-active",
6777
+ "elevated-from",
6778
+ "elevated-to",
6779
+ "modal-from",
6780
+ "modal-to",
6781
+ "playground-from",
6782
+ "playground-via",
6783
+ "playground-to"
6784
+ ];
6785
+ var TAILWIND_PALETTE_COLORS = [
6786
+ "slate",
6787
+ "gray",
6788
+ "zinc",
6789
+ "neutral",
6790
+ "stone",
6791
+ "red",
6792
+ "orange",
6793
+ "amber",
6794
+ "yellow",
6795
+ "lime",
6796
+ "green",
6797
+ "emerald",
6798
+ "teal",
6799
+ "cyan",
6800
+ "sky",
6801
+ "blue",
6802
+ "indigo",
6803
+ "violet",
6804
+ "purple",
6805
+ "fuchsia",
6806
+ "pink",
6807
+ "rose"
6808
+ ];
6809
+ var COLOR_UTILITY_PREFIXES = [
6810
+ "bg",
6811
+ "text",
6812
+ "border",
6813
+ "ring",
6814
+ "from",
6815
+ "via",
6816
+ "to",
6817
+ "fill",
6818
+ "stroke",
6819
+ "decoration",
6820
+ "outline",
6821
+ "shadow",
6822
+ "divide",
6823
+ "accent",
6824
+ "caret"
6825
+ ];
6826
+ var SLOP_BUDGETS = {
6827
+ /** Max decorative/standalone icons rendered in a single generated file. */
6828
+ maxIconsPerView: 6,
6829
+ /** Max consecutive list rows separated by an explicit border/divider before
6830
+ * it reads as a "ruled table" — prefer spacing or zebra instead. */
6831
+ maxRowDividers: 2
6832
+ };
6833
+ var HOUSE_RULES = [
6834
+ {
6835
+ id: "semantic-color",
6836
+ rule: "Color only through semantic tokens \u2014 never a raw palette color, hex, or oklch literal.",
6837
+ why: "The theme generator owns every color; hardcoding breaks dark mode and rebranding.",
6838
+ slop: `<span className="text-blue-600 bg-green-50">`,
6839
+ good: `<span className="text-primary bg-muted">`
6840
+ },
6841
+ {
6842
+ id: "no-decorative-icons",
6843
+ rule: "Icons must earn their place (action, nav, or status). Never add an icon beside a label that already says the thing.",
6844
+ why: "An icon on every tile/card is the #1 tell of generated slop.",
6845
+ slop: `<StatTile label={<><BarChart2 /> Revenue</>} value="$95k" />`,
6846
+ good: `<StatTile label="Revenue" value="$95k" />`
6847
+ },
6848
+ {
6849
+ id: "neutral-trend",
6850
+ rule: "Don't put a colored trend pill on every metric. Use a trend only when the delta is the point, and keep it muted.",
6851
+ why: "Loud green/red pills everywhere are noise, not signal.",
6852
+ slop: `<MetricTile trend="+8%" className="text-green-500" />`,
6853
+ good: `<MetricTile label="Win rate" value="50%" />`
6854
+ },
6855
+ {
6856
+ id: "values-normal-weight",
6857
+ rule: "Metric values use normal font weight, not bold.",
6858
+ why: "Giant bold numbers read as a template; normal weight reads as a product.",
6859
+ slop: `<span className="text-3xl font-bold tabular-nums">$322k</span>`,
6860
+ good: `<span className="text-2xl font-normal tabular-nums">$322k</span>`
6861
+ },
6862
+ {
6863
+ id: "no-card-in-card",
6864
+ rule: "Don't nest a bordered card inside another bordered card. Group with spacing or a Section instead.",
6865
+ why: "Card-in-card doubles borders and shadows for no information gain."
6866
+ },
6867
+ {
6868
+ id: "no-row-dividers",
6869
+ rule: "Don't put a divider between every list row. Use spacing or zebra striping.",
6870
+ why: "A rule under every row turns a clean list into a dense ledger."
6871
+ },
6872
+ {
6873
+ id: "no-data-gradient",
6874
+ rule: "Gradients are reserved for chrome (composer, elevated surface, playground). Never on a data card, tile, or table.",
6875
+ why: "Gradient stat cards are the canonical 'AI dashboard' look."
6876
+ },
6877
+ {
6878
+ id: "compose-from-blocks",
6879
+ rule: "Build from premade blocks (MetricRow, MetricChartCard, DataTable, IntegrationCard). Drop to raw primitives only when no block fits.",
6880
+ why: "Slop appears the moment generation falls below the curated block layer."
6881
+ },
6882
+ {
6883
+ id: "use-kit-controls",
6884
+ rule: "Use the kit's controls (SearchInput, Select, DropdownMenu, FieldInput, FieldSelect) \u2014 never hand-roll an input/trigger surface (`border-input rounded-* bg-\u2026`).",
6885
+ why: "Hand-rolled controls drift from the shared control-surface skin and look foreign next to kit controls.",
6886
+ slop: `<button className="rounded-lg border border-input bg-transparent px-3 h-9">`,
6887
+ good: `<SelectTrigger><SelectValue /></SelectTrigger>`
6888
+ }
6889
+ ];
6890
+
6479
6891
  // src/app/agent-instructions.ts
6892
+ var ANTI_SLOP_CHECKLIST = HOUSE_RULES.map((r) => {
6893
+ const pair = r.slop && r.good ? `
6894
+ - slop: \`${r.slop}\`
6895
+ - good: \`${r.good}\`` : "";
6896
+ return `- **${r.id}** \u2014 ${r.rule} (${r.why})${pair}`;
6897
+ }).join("\n");
6480
6898
  var APP_KIT_AGENT_INSTRUCTIONS = `
6481
6899
  ## App kit (@timbal-ai/timbal-react/app)
6482
6900
 
@@ -6524,7 +6942,15 @@ Theming helpers (import from the package root or \`/app\`): \`createTimbalTheme\
6524
6942
  | **Modals** | Use \`AppConfirmDialog\` for destructive/export confirmations. |
6525
6943
  | **Metrics** | Overview KPIs \u2192 \`MetricRow\` or \`MetricChartCard\` (not four separate heavy cards). Values use **normal** font weight, not bold. |
6526
6944
  | **Integrations** | Catalog \u2192 \`IntegrationCard\` grid; connected list \u2192 \`ConnectionRow\` inside \`ConnectionRowList\`. Footer CTAs: \`Button variant="secondary"\`. |
6527
- | **Anti-slop** | No loud green/red trend pills on every tile; no \`bg-card\` flat grids when platform chrome exists; avoid recycling demo names ("Operations", mock workforce lists). |
6945
+ | **Anti-slop** | Follow the **anti-slop checklist** below. No loud green/red trend pills on every tile; no \`bg-card\` flat grids when platform chrome exists; avoid recycling demo names ("Operations", mock workforce lists). |
6946
+
6947
+ ### Anti-slop checklist (required \u2014 output is linted against this)
6948
+
6949
+ Generated UIs are checked by \`lintGeneratedUi\` and rejected on any error. Self-review against these before returning code (icon budget: ${SLOP_BUDGETS.maxIconsPerView} per view; at most ${SLOP_BUDGETS.maxRowDividers} ruled rows before it reads as a ledger):
6950
+
6951
+ ${ANTI_SLOP_CHECKLIST}
6952
+
6953
+ The cause of slop is dropping **below** the curated block layer into raw primitives + free Tailwind. Stay on the blocks; reach for primitives only when no block fits, and even then keep colors on semantic tokens.
6528
6954
 
6529
6955
  ### Accessibility (required)
6530
6956
 
@@ -6550,7 +6976,8 @@ Theming helpers (import from the package root or \`/app\`): \`createTimbalTheme\
6550
6976
  | \`useAppShellChat\` | Custom open/close trigger when \`hideChatTrigger\` on shell. |
6551
6977
  | \`Page\` | Page title, description, \`breadcrumbs\`, \`actions\`, children. |
6552
6978
  | \`Section\` | Titled block inside a page. |
6553
- | \`SubNav\` | In-page tabs: \`items\`, \`activeId\`, \`onChange\`. |
6979
+ | \`SubNav\` | **Section switcher** (Overview / Reports pill bar): \`items\`, \`activeId\`, \`onChange\`. Never use Radix/shadcn \`Tabs\` \u2014 it is not in this package. Switch panels with state or the router. |
6980
+ | **Menus** | **Select** = short list, no search. **Combobox** = searchable (same trigger as Select). **Command** only inside \`PopoverContent variant="list"\` or Combobox \u2014 never padded default Popover. See \`examples/app-kit/src/recipes/primitives-catalog.ts\`. |
6554
6981
  | \`Breadcrumbs\` | Trail: \`items: [{ label, href? }]\`. |
6555
6982
  | \`Button\` | Actions \u2014 \`variant="secondary"\` for catalog/secondary CTAs; \`variant="default"\` for primary. |
6556
6983
  | \`StatTile\` | Single KPI in its own card (grid of scattered stats). Prefer \`MetricRow\` for a unified overview strip. |
@@ -6606,19 +7033,36 @@ Theming helpers (import from the package root or \`/app\`): \`createTimbalTheme\
6606
7033
 
6607
7034
  Studio chrome (\`StudioSidebar\`, \`ModeToggle\`, \u2026) lives in \`@timbal-ai/timbal-react/studio\` \u2014 optional, not required for every dashboard.
6608
7035
 
6609
- ### Recipe index (\`examples/app-kit/recipes/\`)
7036
+ ### Block recipes \u2014 compose these (don't clone wholesale)
7037
+
7038
+ Ready-made **section patterns** assembled from the components above. Each is a composition to rebuild in your own domain with your data \u2014 **not** an importable component. Reach for a block before dropping to raw primitives.
7039
+
7040
+ **Settings**
7041
+ - **Project settings** \u2014 General / Usage / Danger sections; the floating save bar appears on first edit. Compose \`SettingsSection\` + \`FieldInput\`/\`FieldSwitch\` + \`FieldRow\` + \`InfoCard\` + \`DangerZone\` + \`FloatingUnsavedChangesBar\`.
7042
+ - **Settings form** \u2014 compact stacked form for one concern (profile, billing). Compose \`FormSection\` + \`FieldInput\`/\`FieldSelect\`/\`FieldTextarea\`.
7043
+
7044
+ **Data & metrics**
7045
+ - **Metrics row** \u2014 KPI strip in one elevated card. Compose \`MetricRow\` + \`MetricTile\`.
7046
+ - **Analytics card** \u2014 selectable KPI tiles driving a shared chart. Compose \`MetricChartCard\` + \`LineAreaChart\`.
7047
+ - **Charts panel** \u2014 embedded chart artifact. Compose \`ChartPanel\` + \`ChartArtifactView\`.
7048
+ - **Table + filters** \u2014 \`FilterBar\` above a sortable \`DataTable\` (+ \`StatusBadge\` in cells).
6610
7049
 
6611
- | Recipe file | Components to study |
6612
- |-------------|---------------------|
6613
- | \`metrics-row.tsx\` | \`Page\`, \`MetricRow\` |
6614
- | \`analytics-card.tsx\` | \`MetricChartCard\`, \`Button\` |
6615
- | \`integrations-grid.tsx\` | \`IntegrationCard\`, \`ConnectionRowList\`, \`PlanBadge\` |
6616
- | \`table-with-filters.tsx\` | \`FilterBar\`, \`DataTable\` |
6617
- | \`settings-page.tsx\` | \`SettingsSection\`, \`DangerZone\`, \`FloatingUnsavedChangesBar\` |
6618
- | \`resource-gallery.tsx\` | \`ResourceCard\`, \`StatusDot\`, \`Sparkline\` |
6619
- | \`charts-panel.tsx\` | \`ChartPanel\`, \`ChartArtifact\` |
6620
- | \`copilot-overlay.tsx\` | \`AppShell\`, \`AppChatPanel\` |
6621
- | \`theme-presets.tsx\` | \`ThemePresetGallery\`, \`applyTimbalTheme\` |
7050
+ **Collections**
7051
+ - **Integrations grid** \u2014 connector catalog + connected list. Compose \`IntegrationCard\` + \`PlanBadge\` + \`ConnectionRowList\` (\`IntegrationsEmptyState\` when empty).
7052
+ - **Resource gallery** \u2014 project / agent / dataset cards. Compose \`ResourceCard\` + \`StatusDot\` + \`Sparkline\`.
7053
+
7054
+ **Overlays & flows** (animate automatically)
7055
+ - **Confirm & destructive** \u2014 confirm/cancel modal or destructive alert. Compose \`AppConfirmDialog\` (or \`AlertDialog\`) + \`Button\`; never hand-roll a \`Dialog\` for confirms.
7056
+ - **Detail sheet** \u2014 slide-over edit panel without leaving the list. Compose \`Sheet\` + \`Field*\` + \`Button\` + \`Separator\`.
7057
+
7058
+ **States & auth**
7059
+ - **Empty states** \u2014 no-data / no-results / first-run. Compose \`EmptyState\` + \`Card\` + \`Button\`.
7060
+ - **Sign-in card** \u2014 centered auth entry. Compose \`Card\` + \`Input\` + \`Label\` + \`Button\`.
7061
+
7062
+ **Shells & theming**
7063
+ - **Minimal shell** \u2014 \`AppShell\` + \`Page\` (no sidebar/chat).
7064
+ - **Copilot overlay** \u2014 \`AppShell\` + floating \`AppChatPanel\`.
7065
+ - **Theme presets** \u2014 \`ThemePresetGallery\` + \`applyTimbalTheme\` (never hand-author OKLCH).
6622
7066
 
6623
7067
  ### Typical compositions
6624
7068
 
@@ -6629,6 +7073,7 @@ Studio chrome (\`StudioSidebar\`, \`ModeToggle\`, \u2026) lives in \`@timbal-ai/
6629
7073
  - **Integrations** \u2014 grid of \`IntegrationCard\`; \`ConnectionRowList\` for connected providers; \`IntegrationsEmptyState\` when empty.
6630
7074
  - **Resource gallery** \u2014 grid of \`ResourceCard\`.
6631
7075
  - **Copilot-assisted app** \u2014 \`AppCopilotProvider\` + \`AppShell\` with \`chat={<AppChatPanel workforceId="\u2026" />}\`.
7076
+ - **Motion is automatic** \u2014 Dialog, AlertDialog, Sheet, Popover, DropdownMenu, Select, Tooltip, Toast, and Accordion/Collapsible animate out of the box (fade/zoom/slide/height) via the engine inlined in \`styles.css\`. Do not add a separate animation library or hand-write \`@keyframes\`.
6632
7077
 
6633
7078
  ### Example imports
6634
7079
 
@@ -6664,6 +7109,211 @@ import {
6664
7109
  - For rich in-chat widgets, use **artifacts** (\`ARTIFACT_AGENT_INSTRUCTIONS\`) \u2014 app kit is for the **host application shell**.
6665
7110
  `.trim();
6666
7111
 
7112
+ // src/design/ui-lint.ts
7113
+ var PALETTE_GROUP = TAILWIND_PALETTE_COLORS.join("|");
7114
+ var PREFIX_GROUP = COLOR_UTILITY_PREFIXES.join("|");
7115
+ var RAW_COLOR_RE = new RegExp(
7116
+ `(?:^|[\\s"'\`:])(?:[a-z-]+:)*(?:${PREFIX_GROUP})-(?:${PALETTE_GROUP})-\\d{2,3}(?:/\\d{1,3})?`,
7117
+ "g"
7118
+ );
7119
+ var COLOR_LITERAL_RE = /#[0-9a-fA-F]{3,8}\b|\b(?:oklch|rgba?|hsla?)\s*\(/g;
7120
+ var INLINE_STYLE_COLOR_RE = /style=\{\{[^}]*\b(?:color|background|backgroundColor|borderColor|fill|stroke)\b/;
7121
+ 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)/;
7122
+ var GRADIENT_RE = /\bbg-(?:gradient|linear|radial|conic)-/;
7123
+ var GRADIENT_DIRECTIONS = /* @__PURE__ */ new Set([
7124
+ "t",
7125
+ "tr",
7126
+ "r",
7127
+ "br",
7128
+ "b",
7129
+ "bl",
7130
+ "l",
7131
+ "tl"
7132
+ ]);
7133
+ var ICON_IMPORT_RE = /from\s+["']lucide-react["']/;
7134
+ var RAW_CONTROL_SURFACE_RE = /\bborder-input\b/;
7135
+ var RESERVED_GRADIENT_SET = new Set(RESERVED_GRADIENT_TOKENS);
7136
+ function stripVariants(util) {
7137
+ return util.replace(/^(?:[a-z-]+:)*/, "");
7138
+ }
7139
+ function isCommentOrImport(line) {
7140
+ const t = line.trim();
7141
+ return t.startsWith("//") || t.startsWith("*") || t.startsWith("/*") || t.startsWith("import ") || t.startsWith("export ");
7142
+ }
7143
+ function lintGeneratedUi(source, options = {}) {
7144
+ const maxIcons = options.maxIconsPerView ?? SLOP_BUDGETS.maxIconsPerView;
7145
+ const maxRowDividers = options.maxRowDividers ?? SLOP_BUDGETS.maxRowDividers;
7146
+ const findings = [];
7147
+ const lines = source.split("\n");
7148
+ let usesLucide = false;
7149
+ let iconUsageCount = 0;
7150
+ let dividerRunCount = 0;
7151
+ const lucideNames = /* @__PURE__ */ new Set();
7152
+ for (let i = 0; i < lines.length; i++) {
7153
+ const line = lines[i];
7154
+ const lineNo = i + 1;
7155
+ if (ICON_IMPORT_RE.test(line)) {
7156
+ usesLucide = true;
7157
+ const named = line.match(/\{([^}]*)\}/);
7158
+ if (named) {
7159
+ for (const raw of named[1].split(",")) {
7160
+ const name = raw.trim().split(/\s+as\s+/)[0].trim();
7161
+ if (name) lucideNames.add(name);
7162
+ }
7163
+ }
7164
+ continue;
7165
+ }
7166
+ if (isCommentOrImport(line)) continue;
7167
+ const rawColors = line.match(RAW_COLOR_RE);
7168
+ if (rawColors) {
7169
+ for (const m of rawColors) {
7170
+ findings.push({
7171
+ rule: "raw-color",
7172
+ severity: "error",
7173
+ line: lineNo,
7174
+ message: "Hardcoded palette color. Use a semantic token (text-primary, bg-muted, border-border, text-muted-foreground, \u2026) so dark mode and rebranding work.",
7175
+ snippet: m.trim().replace(/^["'`:\s]+/, "")
7176
+ });
7177
+ }
7178
+ }
7179
+ const literals = line.match(COLOR_LITERAL_RE);
7180
+ if (literals) {
7181
+ findings.push({
7182
+ rule: "color-literal",
7183
+ severity: "error",
7184
+ line: lineNo,
7185
+ message: "Hardcoded color literal. Colors must come from the theme generator (createTimbalTheme) and semantic tokens \u2014 never inline hex/oklch/rgb.",
7186
+ snippet: line.trim().slice(0, 120)
7187
+ });
7188
+ }
7189
+ if (INLINE_STYLE_COLOR_RE.test(line)) {
7190
+ findings.push({
7191
+ rule: "inline-style-color",
7192
+ severity: "error",
7193
+ line: lineNo,
7194
+ message: "Inline style color. Move color to a semantic Tailwind token on className.",
7195
+ snippet: line.trim().slice(0, 120)
7196
+ });
7197
+ }
7198
+ if (RAW_CONTROL_SURFACE_RE.test(line)) {
7199
+ findings.push({
7200
+ rule: "raw-control-surface",
7201
+ severity: "warn",
7202
+ line: lineNo,
7203
+ message: "Hand-rolled control surface (border-input). Use a kit control \u2014 SearchInput, Select, DropdownMenu, FieldInput, FieldSelect \u2014 so it matches every other control.",
7204
+ snippet: line.trim().slice(0, 120)
7205
+ });
7206
+ }
7207
+ if (BOLD_VALUE_RE.test(line)) {
7208
+ findings.push({
7209
+ rule: "bold-metric",
7210
+ severity: "warn",
7211
+ line: lineNo,
7212
+ message: "Bold large value. House style: metric values use font-normal, not bold \u2014 bold giant numbers read as a template.",
7213
+ snippet: line.trim().slice(0, 120)
7214
+ });
7215
+ }
7216
+ if (GRADIENT_RE.test(line)) {
7217
+ const fromTo = line.match(
7218
+ new RegExp(`(?:from|via|to)-([a-z-]+)`, "g")
7219
+ );
7220
+ const colorStops = (fromTo ?? []).map((u) => stripVariants(u).replace(/^(?:from|via|to)-/, "")).filter((token) => !GRADIENT_DIRECTIONS.has(token));
7221
+ const allReserved = colorStops.length > 0 && colorStops.every((token) => RESERVED_GRADIENT_SET.has(token));
7222
+ if (!allReserved) {
7223
+ findings.push({
7224
+ rule: "data-gradient",
7225
+ severity: "warn",
7226
+ line: lineNo,
7227
+ message: "Gradient outside chrome. Gradients are reserved for buttons / elevated / modal / playground \u2014 never a data card, tile, or table.",
7228
+ snippet: line.trim().slice(0, 120)
7229
+ });
7230
+ }
7231
+ }
7232
+ if (/\b(?:border-t|border-b|divide-y)\b/.test(line)) {
7233
+ dividerRunCount++;
7234
+ if (dividerRunCount === maxRowDividers + 1) {
7235
+ findings.push({
7236
+ rule: "row-divider",
7237
+ severity: "warn",
7238
+ line: lineNo,
7239
+ message: "Divider on every row. Prefer spacing (gap-*) or zebra striping over a rule under each list item.",
7240
+ snippet: line.trim().slice(0, 120)
7241
+ });
7242
+ }
7243
+ } else if (line.trim() !== "" && !line.includes("className")) {
7244
+ if (!/^\s*[)>}/]/.test(line)) dividerRunCount = 0;
7245
+ }
7246
+ if (usesLucide && lucideNames.size > 0) {
7247
+ for (const name of lucideNames) {
7248
+ const usage = new RegExp(`<${name}\\b`, "g");
7249
+ const hits = line.match(usage);
7250
+ if (hits) iconUsageCount += hits.length;
7251
+ }
7252
+ }
7253
+ }
7254
+ if (usesLucide && iconUsageCount > maxIcons) {
7255
+ findings.push({
7256
+ rule: "icon-spam",
7257
+ severity: "warn",
7258
+ line: 1,
7259
+ message: `Too many icons (${iconUsageCount} > ${maxIcons}). Icons should mark actions/nav/status \u2014 not decorate every label, tile, and card.`,
7260
+ snippet: `${iconUsageCount} lucide-react icon usages`
7261
+ });
7262
+ }
7263
+ const effectiveErrors = findings.filter(
7264
+ (f) => f.severity === "error" || options.strict && f.severity === "warn"
7265
+ ).length;
7266
+ return {
7267
+ findings,
7268
+ errorCount: findings.filter((f) => f.severity === "error").length,
7269
+ warnCount: findings.filter((f) => f.severity === "warn").length,
7270
+ ok: effectiveErrors === 0
7271
+ };
7272
+ }
7273
+ function formatLintReport(findings) {
7274
+ if (findings.length === 0) return "";
7275
+ const lines = findings.slice().sort((a, b) => a.line - b.line).map((f) => {
7276
+ const tag = f.severity === "error" ? "ERROR" : "warn ";
7277
+ return ` ${tag} L${f.line} [${f.rule}] ${f.message}
7278
+ \u2192 ${f.snippet}`;
7279
+ });
7280
+ const errs = findings.filter((f) => f.severity === "error").length;
7281
+ const warns = findings.filter((f) => f.severity === "warn").length;
7282
+ return `Anti-slop review: ${errs} error(s), ${warns} warning(s)
7283
+ ${lines.join("\n")}`;
7284
+ }
7285
+
7286
+ // src/design/ui-review.ts
7287
+ function reviewGeneratedUi(source, options = {}) {
7288
+ const lint = lintGeneratedUi(source, options);
7289
+ const report = formatLintReport(lint.findings);
7290
+ if (lint.ok) {
7291
+ return { lint, passed: true, report, revisionPrompt: null };
7292
+ }
7293
+ const revisionPrompt = [
7294
+ "The generated UI failed the Timbal anti-slop review. Fix every issue below, then return the corrected code only.",
7295
+ "",
7296
+ report,
7297
+ "",
7298
+ "Rules: colors come only from semantic tokens (text-primary, bg-muted, border-border, text-muted-foreground, \u2026) \u2014 never palette colors, hex, or oklch. Icons mark actions/nav/status, not decoration. Metric values use font-normal. No gradients on data surfaces. No divider under every row. Do not change anything that already passed."
7299
+ ].join("\n");
7300
+ return { lint, passed: false, report, revisionPrompt };
7301
+ }
7302
+ var UI_REVIEW_AGENT_INSTRUCTIONS = `
7303
+ ## Self-review before returning UI (anti-slop)
7304
+
7305
+ Before you output any generated UI code, silently re-read it and fix anything that matches the slop checklist \u2014 this is the same rubric an automated linter applies, so output that fails it will be rejected and sent back:
7306
+
7307
+ - **No hardcoded colors.** Every color is a semantic token (\`text-primary\`, \`bg-muted\`, \`border-border\`, \`text-muted-foreground\`, \`bg-destructive\`, \u2026). No \`text-blue-600\`, no \`#hex\`, no \`oklch(...)\`, no \`style={{ color }}\`.
7308
+ - **No decorative icons.** An icon must mark an action, nav target, or status. Remove icons that sit beside a label that already says the thing. Aim for very few icons per view.
7309
+ - **Muted, sparse trends.** No colored up/down pill on every metric. Show a trend only when the change is the point.
7310
+ - **Normal-weight values.** Metric numbers use \`font-normal\`, never \`font-bold\` at large sizes.
7311
+ - **No card-in-card, no per-row dividers, no gradients on data surfaces.** Group with spacing/Sections; reserve gradients for chrome.
7312
+ - **Compose from blocks.** Prefer \`MetricRow\` / \`MetricChartCard\` / \`DataTable\` / \`IntegrationCard\` over hand-assembled primitives.
7313
+
7314
+ If a check fails, fix it and re-read once more. Only return code that would pass clean.
7315
+ `.trim();
7316
+
6667
7317
  // src/design/oklch.ts
6668
7318
  var clamp = (n, min, max) => Math.min(max, Math.max(min, n));
6669
7319
  var round2 = (n, digits) => {
@@ -7559,18 +8209,13 @@ var appFilterBarClass = cn(
7559
8209
  "flex flex-wrap items-center gap-2",
7560
8210
  studioTopbarPillHeightClass
7561
8211
  );
7562
- var appSearchInputClass = cn(studioSearchChromeClass, "text-sm");
8212
+ var appSearchInputClass = controlClass({}, "inline-flex items-center gap-2");
7563
8213
  var appBreadcrumbsClass = "flex flex-wrap items-center gap-1.5 text-sm text-muted-foreground";
7564
8214
  var appBreadcrumbLinkClass = "transition-colors hover:text-foreground";
7565
8215
  var appFieldClass = "flex flex-col gap-1.5";
7566
8216
  var appFieldLabelClass = "text-sm font-medium text-foreground";
7567
8217
  var appFieldHintClass = "text-xs text-muted-foreground";
7568
- var appInputClass = cn(
7569
- studioSecondaryChromeClass,
7570
- "h-10 w-full rounded-lg px-3 text-sm text-foreground outline-none",
7571
- "placeholder:text-muted-foreground/70",
7572
- "focus-visible:ring-2 focus-visible:ring-foreground/10"
7573
- );
8218
+ var appInputClass = controlClass({}, "w-full");
7574
8219
  var appEmptyStateClass = cn(
7575
8220
  appSurfaceCardClass,
7576
8221
  "flex flex-col items-center justify-center gap-2 py-12 text-center"
@@ -9617,7 +10262,8 @@ function DropdownMenuContent({
9617
10262
  "data-slot": "dropdown-menu-content",
9618
10263
  sideOffset,
9619
10264
  className: cn(
9620
- "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-[80] max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] origin-[var(--radix-dropdown-menu-content-transform-origin)] overflow-x-hidden overflow-y-auto rounded-lg border border-border p-1 shadow-card",
10265
+ overlayListPanelClass,
10266
+ "max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] origin-[var(--radix-dropdown-menu-content-transform-origin)] overflow-x-hidden overflow-y-auto p-1",
9621
10267
  className
9622
10268
  ),
9623
10269
  ...props
@@ -9637,7 +10283,8 @@ function DropdownMenuItem({
9637
10283
  "data-inset": inset,
9638
10284
  "data-variant": variant,
9639
10285
  className: cn(
9640
- "relative flex cursor-default items-center gap-2 rounded-md px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground",
10286
+ overlayItemClass,
10287
+ "data-[inset]:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10",
9641
10288
  className
9642
10289
  ),
9643
10290
  ...props
@@ -9654,10 +10301,7 @@ function DropdownMenuCheckboxItem({
9654
10301
  import_radix_ui5.DropdownMenu.CheckboxItem,
9655
10302
  {
9656
10303
  "data-slot": "dropdown-menu-checkbox-item",
9657
- className: cn(
9658
- "relative flex cursor-default items-center gap-2 rounded-md py-1.5 pr-2 pl-8 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
9659
- className
9660
- ),
10304
+ className: cn(overlayItemClass, "py-1.5 pr-2 pl-8", className),
9661
10305
  checked,
9662
10306
  ...props,
9663
10307
  children: [
@@ -9687,10 +10331,7 @@ function DropdownMenuRadioItem({
9687
10331
  import_radix_ui5.DropdownMenu.RadioItem,
9688
10332
  {
9689
10333
  "data-slot": "dropdown-menu-radio-item",
9690
- className: cn(
9691
- "relative flex cursor-default items-center gap-2 rounded-md py-1.5 pr-2 pl-8 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
9692
- className
9693
- ),
10334
+ className: cn(overlayItemClass, "py-1.5 pr-2 pl-8", className),
9694
10335
  ...props,
9695
10336
  children: [
9696
10337
  /* @__PURE__ */ (0, import_jsx_runtime95.jsx)("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime95.jsx)(import_radix_ui5.DropdownMenu.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime95.jsx)(import_lucide_react20.CircleIcon, { className: "size-2 fill-current" }) }) }),
@@ -9763,7 +10404,8 @@ function DropdownMenuSubTrigger({
9763
10404
  "data-slot": "dropdown-menu-sub-trigger",
9764
10405
  "data-inset": inset,
9765
10406
  className: cn(
9766
- "flex cursor-default items-center rounded-md px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground data-[inset]:pl-8",
10407
+ overlayItemClass,
10408
+ "data-[state=open]:bg-accent data-[state=open]:text-accent-foreground data-[inset]:pl-8",
9767
10409
  className
9768
10410
  ),
9769
10411
  ...props,
@@ -9783,7 +10425,8 @@ function DropdownMenuSubContent({
9783
10425
  {
9784
10426
  "data-slot": "dropdown-menu-sub-content",
9785
10427
  className: cn(
9786
- "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-[80] min-w-[8rem] origin-[var(--radix-dropdown-menu-content-transform-origin)] overflow-hidden rounded-lg border border-border p-1 shadow-card",
10428
+ overlayListPanelClass,
10429
+ "min-w-[8rem] origin-[var(--radix-dropdown-menu-content-transform-origin)] overflow-hidden p-1",
9787
10430
  className
9788
10431
  ),
9789
10432
  ...props
@@ -9813,16 +10456,24 @@ function PopoverContent({
9813
10456
  className,
9814
10457
  align = "center",
9815
10458
  sideOffset = 4,
10459
+ variant = "default",
9816
10460
  ...props
9817
10461
  }) {
9818
10462
  return /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(import_radix_ui6.Popover.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
9819
10463
  import_radix_ui6.Popover.Content,
9820
10464
  {
9821
10465
  "data-slot": "popover-content",
10466
+ "data-variant": variant,
9822
10467
  align,
9823
10468
  sideOffset,
9824
10469
  className: cn(
9825
- "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-[80] w-72 origin-[var(--radix-popover-content-transform-origin)] rounded-xl border border-border p-4 shadow-card outline-hidden",
10470
+ variant === "list" ? cn(
10471
+ overlayListPanelClass,
10472
+ "min-w-[8rem] origin-[var(--radix-popover-content-transform-origin)]"
10473
+ ) : cn(
10474
+ overlaySurfaceClass,
10475
+ "w-72 origin-[var(--radix-popover-content-transform-origin)] rounded-xl p-4 outline-hidden"
10476
+ ),
9826
10477
  className
9827
10478
  ),
9828
10479
  ...props
@@ -9861,7 +10512,8 @@ function SelectTrigger({
9861
10512
  "data-slot": "select-trigger",
9862
10513
  "data-size": size,
9863
10514
  className: cn(
9864
- "flex w-fit items-center justify-between gap-2 rounded-lg border border-input bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/40 disabled:cursor-not-allowed disabled:opacity-50 data-[placeholder]:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground",
10515
+ controlClass({ size }),
10516
+ "flex w-fit items-center justify-between gap-2 whitespace-nowrap *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground",
9865
10517
  className
9866
10518
  ),
9867
10519
  ...props,
@@ -9883,7 +10535,8 @@ function SelectContent({
9883
10535
  {
9884
10536
  "data-slot": "select-content",
9885
10537
  className: cn(
9886
- "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-[80] max-h-[var(--radix-select-content-available-height)] min-w-[8rem] origin-[var(--radix-select-content-transform-origin)] overflow-x-hidden overflow-y-auto rounded-lg border border-border shadow-card",
10538
+ overlayListPanelClass,
10539
+ "relative max-h-[var(--radix-select-content-available-height)] min-w-[8rem] origin-[var(--radix-select-content-transform-origin)] overflow-x-hidden overflow-y-auto",
9887
10540
  position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
9888
10541
  className
9889
10542
  ),
@@ -9929,7 +10582,8 @@ function SelectItem({
9929
10582
  {
9930
10583
  "data-slot": "select-item",
9931
10584
  className: cn(
9932
- "relative flex w-full cursor-default items-center gap-2 rounded-md py-1.5 pr-8 pl-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground",
10585
+ overlayItemClass,
10586
+ "w-full py-1.5 pr-8 pl-2 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",
9933
10587
  className
9934
10588
  ),
9935
10589
  ...props,
@@ -9981,12 +10635,2873 @@ function SelectScrollDownButton({
9981
10635
  }
9982
10636
  );
9983
10637
  }
10638
+
10639
+ // src/ui/input.tsx
10640
+ var import_jsx_runtime98 = require("react/jsx-runtime");
10641
+ function Input({
10642
+ className,
10643
+ type,
10644
+ controlSize,
10645
+ ...props
10646
+ }) {
10647
+ return /* @__PURE__ */ (0, import_jsx_runtime98.jsx)(
10648
+ "input",
10649
+ {
10650
+ type,
10651
+ "data-slot": "input",
10652
+ className: cn(
10653
+ controlClass({ size: controlSize }),
10654
+ "w-full file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground",
10655
+ className
10656
+ ),
10657
+ ...props
10658
+ }
10659
+ );
10660
+ }
10661
+
10662
+ // src/ui/textarea.tsx
10663
+ var import_jsx_runtime99 = require("react/jsx-runtime");
10664
+ function Textarea({ className, ...props }) {
10665
+ return /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(
10666
+ "textarea",
10667
+ {
10668
+ "data-slot": "textarea",
10669
+ className: cn(
10670
+ controlSurfaceClass,
10671
+ "min-h-16 w-full resize-y rounded-lg px-3 py-2 leading-relaxed",
10672
+ className
10673
+ ),
10674
+ ...props
10675
+ }
10676
+ );
10677
+ }
10678
+
10679
+ // src/ui/label.tsx
10680
+ var import_radix_ui8 = require("radix-ui");
10681
+ var import_jsx_runtime100 = require("react/jsx-runtime");
10682
+ function Label({
10683
+ className,
10684
+ ...props
10685
+ }) {
10686
+ return /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(
10687
+ import_radix_ui8.Label.Root,
10688
+ {
10689
+ "data-slot": "label",
10690
+ className: cn(
10691
+ "flex select-none items-center gap-2 text-sm font-medium text-foreground",
10692
+ "group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
10693
+ className
10694
+ ),
10695
+ ...props
10696
+ }
10697
+ );
10698
+ }
10699
+
10700
+ // src/ui/checkbox.tsx
10701
+ var import_radix_ui9 = require("radix-ui");
10702
+ var import_lucide_react22 = require("lucide-react");
10703
+ var import_jsx_runtime101 = require("react/jsx-runtime");
10704
+ function Checkbox({
10705
+ className,
10706
+ ...props
10707
+ }) {
10708
+ return /* @__PURE__ */ (0, import_jsx_runtime101.jsx)(
10709
+ import_radix_ui9.Checkbox.Root,
10710
+ {
10711
+ "data-slot": "checkbox",
10712
+ className: cn(
10713
+ "peer size-4 shrink-0 rounded-[4px] border border-border bg-gradient-to-b from-elevated-from to-elevated-to shadow-card outline-none transition-[box-shadow,background-color,border-color]",
10714
+ "focus-visible:ring-2 focus-visible:ring-foreground/10 disabled:cursor-not-allowed disabled:opacity-50",
10715
+ "data-[state=checked]:border-foreground/15 data-[state=checked]:from-primary-fill-from data-[state=checked]:to-primary-fill-to data-[state=checked]:text-primary-foreground",
10716
+ className
10717
+ ),
10718
+ ...props,
10719
+ children: /* @__PURE__ */ (0, import_jsx_runtime101.jsx)(
10720
+ import_radix_ui9.Checkbox.Indicator,
10721
+ {
10722
+ "data-slot": "checkbox-indicator",
10723
+ className: "flex items-center justify-center text-current transition-none",
10724
+ children: /* @__PURE__ */ (0, import_jsx_runtime101.jsx)(import_lucide_react22.CheckIcon, { className: "size-3.5" })
10725
+ }
10726
+ )
10727
+ }
10728
+ );
10729
+ }
10730
+
10731
+ // src/ui/switch.tsx
10732
+ var import_radix_ui10 = require("radix-ui");
10733
+ var import_jsx_runtime102 = require("react/jsx-runtime");
10734
+ function Switch({
10735
+ className,
10736
+ ...props
10737
+ }) {
10738
+ return /* @__PURE__ */ (0, import_jsx_runtime102.jsx)(
10739
+ import_radix_ui10.Switch.Root,
10740
+ {
10741
+ "data-slot": "switch",
10742
+ className: cn(
10743
+ "peer inline-flex h-5 w-9 shrink-0 items-center rounded-full outline-none transition-[background,box-shadow,border-color] duration-200",
10744
+ TIMBAL_V2_SWITCH_TRACK_OFF,
10745
+ "focus-visible:ring-2 focus-visible:ring-foreground/10 disabled:cursor-not-allowed disabled:opacity-50",
10746
+ "data-[state=checked]:border-foreground/15 data-[state=checked]:from-primary-fill-from data-[state=checked]:to-primary-fill-to data-[state=checked]:shadow-card",
10747
+ className
10748
+ ),
10749
+ ...props,
10750
+ children: /* @__PURE__ */ (0, import_jsx_runtime102.jsx)(
10751
+ import_radix_ui10.Switch.Thumb,
10752
+ {
10753
+ "data-slot": "switch-thumb",
10754
+ className: cn(
10755
+ TIMBAL_V2_SWITCH_THUMB,
10756
+ "pointer-events-none block size-4 translate-x-0.5 rounded-full transition-transform data-[state=checked]:translate-x-4"
10757
+ )
10758
+ }
10759
+ )
10760
+ }
10761
+ );
10762
+ }
10763
+
10764
+ // src/ui/radio-group.tsx
10765
+ var import_radix_ui11 = require("radix-ui");
10766
+ var import_lucide_react23 = require("lucide-react");
10767
+ var import_jsx_runtime103 = require("react/jsx-runtime");
10768
+ function RadioGroup({
10769
+ className,
10770
+ ...props
10771
+ }) {
10772
+ return /* @__PURE__ */ (0, import_jsx_runtime103.jsx)(
10773
+ import_radix_ui11.RadioGroup.Root,
10774
+ {
10775
+ "data-slot": "radio-group",
10776
+ className: cn("grid gap-2.5", className),
10777
+ ...props
10778
+ }
10779
+ );
10780
+ }
10781
+ function RadioGroupItem({
10782
+ className,
10783
+ ...props
10784
+ }) {
10785
+ return /* @__PURE__ */ (0, import_jsx_runtime103.jsx)(
10786
+ import_radix_ui11.RadioGroup.Item,
10787
+ {
10788
+ "data-slot": "radio-group-item",
10789
+ className: cn(
10790
+ "aspect-square size-4 shrink-0 rounded-full border border-border bg-gradient-to-b from-elevated-from to-elevated-to shadow-card outline-none transition-[box-shadow,border-color]",
10791
+ "focus-visible:ring-2 focus-visible:ring-foreground/10 disabled:cursor-not-allowed disabled:opacity-50",
10792
+ "data-[state=checked]:border-foreground/30",
10793
+ className
10794
+ ),
10795
+ ...props,
10796
+ children: /* @__PURE__ */ (0, import_jsx_runtime103.jsx)(
10797
+ import_radix_ui11.RadioGroup.Indicator,
10798
+ {
10799
+ "data-slot": "radio-group-indicator",
10800
+ className: "flex items-center justify-center",
10801
+ children: /* @__PURE__ */ (0, import_jsx_runtime103.jsx)(import_lucide_react23.CircleIcon, { className: "size-2 fill-foreground text-foreground" })
10802
+ }
10803
+ )
10804
+ }
10805
+ );
10806
+ }
10807
+
10808
+ // src/ui/form.tsx
10809
+ var import_radix_ui12 = require("radix-ui");
10810
+ var import_jsx_runtime104 = require("react/jsx-runtime");
10811
+ function Form({ ...props }) {
10812
+ return /* @__PURE__ */ (0, import_jsx_runtime104.jsx)(import_radix_ui12.Form.Root, { "data-slot": "form", ...props });
10813
+ }
10814
+ function FormField({
10815
+ ...props
10816
+ }) {
10817
+ return /* @__PURE__ */ (0, import_jsx_runtime104.jsx)(import_radix_ui12.Form.Field, { "data-slot": "form-field", ...props });
10818
+ }
10819
+ function FormItem({ className, ...props }) {
10820
+ return /* @__PURE__ */ (0, import_jsx_runtime104.jsx)(
10821
+ "div",
10822
+ {
10823
+ "data-slot": "form-item",
10824
+ className: cn("grid gap-1.5", className),
10825
+ ...props
10826
+ }
10827
+ );
10828
+ }
10829
+ function FormLabel({
10830
+ className,
10831
+ ...props
10832
+ }) {
10833
+ return /* @__PURE__ */ (0, import_jsx_runtime104.jsx)(import_radix_ui12.Form.Label, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime104.jsx)(Label, { "data-slot": "form-label", className, ...props }) });
10834
+ }
10835
+ function FormControl({
10836
+ ...props
10837
+ }) {
10838
+ return /* @__PURE__ */ (0, import_jsx_runtime104.jsx)(import_radix_ui12.Form.Control, { "data-slot": "form-control", ...props });
10839
+ }
10840
+ function FormMessage({
10841
+ className,
10842
+ ...props
10843
+ }) {
10844
+ return /* @__PURE__ */ (0, import_jsx_runtime104.jsx)(
10845
+ import_radix_ui12.Form.Message,
10846
+ {
10847
+ "data-slot": "form-message",
10848
+ className: cn("text-xs text-destructive", className),
10849
+ ...props
10850
+ }
10851
+ );
10852
+ }
10853
+ function FormSubmit({
10854
+ className,
10855
+ ...props
10856
+ }) {
10857
+ return /* @__PURE__ */ (0, import_jsx_runtime104.jsx)(
10858
+ import_radix_ui12.Form.Submit,
10859
+ {
10860
+ "data-slot": "form-submit",
10861
+ className,
10862
+ ...props
10863
+ }
10864
+ );
10865
+ }
10866
+
10867
+ // src/ui/aspect-ratio.tsx
10868
+ var import_radix_ui13 = require("radix-ui");
10869
+ var import_jsx_runtime105 = require("react/jsx-runtime");
10870
+ function AspectRatio({
10871
+ ...props
10872
+ }) {
10873
+ return /* @__PURE__ */ (0, import_jsx_runtime105.jsx)(import_radix_ui13.AspectRatio.Root, { "data-slot": "aspect-ratio", ...props });
10874
+ }
10875
+
10876
+ // src/ui/breadcrumb.tsx
10877
+ var import_lucide_react24 = require("lucide-react");
10878
+ var import_radix_ui14 = require("radix-ui");
10879
+ var import_jsx_runtime106 = require("react/jsx-runtime");
10880
+ function Breadcrumb({ ...props }) {
10881
+ return /* @__PURE__ */ (0, import_jsx_runtime106.jsx)("nav", { "data-slot": "breadcrumb", "aria-label": "Breadcrumb", ...props });
10882
+ }
10883
+ function BreadcrumbList({ className, ...props }) {
10884
+ return /* @__PURE__ */ (0, import_jsx_runtime106.jsx)(
10885
+ "ol",
10886
+ {
10887
+ "data-slot": "breadcrumb-list",
10888
+ className: cn(
10889
+ "flex flex-wrap items-center gap-1.5 text-sm text-muted-foreground",
10890
+ className
10891
+ ),
10892
+ ...props
10893
+ }
10894
+ );
10895
+ }
10896
+ function BreadcrumbItem({ className, ...props }) {
10897
+ return /* @__PURE__ */ (0, import_jsx_runtime106.jsx)(
10898
+ "li",
10899
+ {
10900
+ "data-slot": "breadcrumb-item",
10901
+ className: cn("inline-flex items-center gap-1.5", className),
10902
+ ...props
10903
+ }
10904
+ );
10905
+ }
10906
+ function BreadcrumbLink({
10907
+ className,
10908
+ asChild,
10909
+ ...props
10910
+ }) {
10911
+ const Comp = asChild ? import_radix_ui14.Slot.Root : "a";
10912
+ return /* @__PURE__ */ (0, import_jsx_runtime106.jsx)(
10913
+ Comp,
10914
+ {
10915
+ "data-slot": "breadcrumb-link",
10916
+ className: cn("transition-colors hover:text-foreground", className),
10917
+ ...props
10918
+ }
10919
+ );
10920
+ }
10921
+ function BreadcrumbPage({ className, ...props }) {
10922
+ return /* @__PURE__ */ (0, import_jsx_runtime106.jsx)(
10923
+ "span",
10924
+ {
10925
+ "data-slot": "breadcrumb-page",
10926
+ role: "link",
10927
+ "aria-disabled": "true",
10928
+ "aria-current": "page",
10929
+ className: cn("font-normal text-foreground", className),
10930
+ ...props
10931
+ }
10932
+ );
10933
+ }
10934
+ function BreadcrumbSeparator({
10935
+ children,
10936
+ className,
10937
+ ...props
10938
+ }) {
10939
+ return /* @__PURE__ */ (0, import_jsx_runtime106.jsx)(
10940
+ "li",
10941
+ {
10942
+ "data-slot": "breadcrumb-separator",
10943
+ role: "presentation",
10944
+ "aria-hidden": "true",
10945
+ className: cn("[&>svg]:size-3.5", className),
10946
+ ...props,
10947
+ children: children ?? /* @__PURE__ */ (0, import_jsx_runtime106.jsx)(import_lucide_react24.ChevronRightIcon, {})
10948
+ }
10949
+ );
10950
+ }
10951
+ function BreadcrumbEllipsis({
10952
+ className,
10953
+ ...props
10954
+ }) {
10955
+ return /* @__PURE__ */ (0, import_jsx_runtime106.jsxs)(
10956
+ "span",
10957
+ {
10958
+ "data-slot": "breadcrumb-ellipsis",
10959
+ role: "presentation",
10960
+ "aria-hidden": "true",
10961
+ className: cn("flex size-9 items-center justify-center", className),
10962
+ ...props,
10963
+ children: [
10964
+ /* @__PURE__ */ (0, import_jsx_runtime106.jsx)(import_lucide_react24.MoreHorizontalIcon, { className: "size-4" }),
10965
+ /* @__PURE__ */ (0, import_jsx_runtime106.jsx)("span", { className: "sr-only", children: "More" })
10966
+ ]
10967
+ }
10968
+ );
10969
+ }
10970
+
10971
+ // src/ui/pagination.tsx
10972
+ var import_lucide_react25 = require("lucide-react");
10973
+ var import_jsx_runtime107 = require("react/jsx-runtime");
10974
+ function Pagination({ className, ...props }) {
10975
+ return /* @__PURE__ */ (0, import_jsx_runtime107.jsx)(
10976
+ "nav",
10977
+ {
10978
+ "data-slot": "pagination",
10979
+ role: "navigation",
10980
+ "aria-label": "pagination",
10981
+ className: cn("mx-auto flex w-full justify-center", className),
10982
+ ...props
10983
+ }
10984
+ );
10985
+ }
10986
+ function PaginationContent({ className, ...props }) {
10987
+ return /* @__PURE__ */ (0, import_jsx_runtime107.jsx)(
10988
+ "ul",
10989
+ {
10990
+ "data-slot": "pagination-content",
10991
+ className: cn("flex flex-row items-center gap-1", className),
10992
+ ...props
10993
+ }
10994
+ );
10995
+ }
10996
+ function PaginationItem({ ...props }) {
10997
+ return /* @__PURE__ */ (0, import_jsx_runtime107.jsx)("li", { "data-slot": "pagination-item", ...props });
10998
+ }
10999
+ function PaginationLink({
11000
+ className,
11001
+ isActive,
11002
+ size = "icon",
11003
+ ...props
11004
+ }) {
11005
+ return /* @__PURE__ */ (0, import_jsx_runtime107.jsx)(Button, { asChild: true, variant: isActive ? "outline" : "ghost", size, className, children: /* @__PURE__ */ (0, import_jsx_runtime107.jsx)(
11006
+ "a",
11007
+ {
11008
+ "data-slot": "pagination-link",
11009
+ "aria-current": isActive ? "page" : void 0,
11010
+ ...props
11011
+ }
11012
+ ) });
11013
+ }
11014
+ function PaginationPrevious({
11015
+ className,
11016
+ ...props
11017
+ }) {
11018
+ return /* @__PURE__ */ (0, import_jsx_runtime107.jsxs)(
11019
+ PaginationLink,
11020
+ {
11021
+ "aria-label": "Go to previous page",
11022
+ size: "default",
11023
+ className: cn("gap-1 px-2.5 sm:pl-2.5", className),
11024
+ ...props,
11025
+ children: [
11026
+ /* @__PURE__ */ (0, import_jsx_runtime107.jsx)(import_lucide_react25.ChevronLeftIcon, { className: "size-4" }),
11027
+ /* @__PURE__ */ (0, import_jsx_runtime107.jsx)("span", { className: "hidden sm:block", children: "Previous" })
11028
+ ]
11029
+ }
11030
+ );
11031
+ }
11032
+ function PaginationNext({
11033
+ className,
11034
+ ...props
11035
+ }) {
11036
+ return /* @__PURE__ */ (0, import_jsx_runtime107.jsxs)(
11037
+ PaginationLink,
11038
+ {
11039
+ "aria-label": "Go to next page",
11040
+ size: "default",
11041
+ className: cn("gap-1 px-2.5 sm:pr-2.5", className),
11042
+ ...props,
11043
+ children: [
11044
+ /* @__PURE__ */ (0, import_jsx_runtime107.jsx)("span", { className: "hidden sm:block", children: "Next" }),
11045
+ /* @__PURE__ */ (0, import_jsx_runtime107.jsx)(import_lucide_react25.ChevronRightIcon, { className: "size-4" })
11046
+ ]
11047
+ }
11048
+ );
11049
+ }
11050
+ function PaginationEllipsis({
11051
+ className,
11052
+ ...props
11053
+ }) {
11054
+ return /* @__PURE__ */ (0, import_jsx_runtime107.jsxs)(
11055
+ "span",
11056
+ {
11057
+ "data-slot": "pagination-ellipsis",
11058
+ "aria-hidden": true,
11059
+ className: cn("flex size-9 items-center justify-center", className),
11060
+ ...props,
11061
+ children: [
11062
+ /* @__PURE__ */ (0, import_jsx_runtime107.jsx)(import_lucide_react25.MoreHorizontalIcon, { className: "size-4" }),
11063
+ /* @__PURE__ */ (0, import_jsx_runtime107.jsx)("span", { className: "sr-only", children: "More pages" })
11064
+ ]
11065
+ }
11066
+ );
11067
+ }
11068
+
11069
+ // src/ui/toolbar.tsx
11070
+ var import_radix_ui15 = require("radix-ui");
11071
+ var import_jsx_runtime108 = require("react/jsx-runtime");
11072
+ function Toolbar({
11073
+ className,
11074
+ ...props
11075
+ }) {
11076
+ return /* @__PURE__ */ (0, import_jsx_runtime108.jsx)(
11077
+ import_radix_ui15.Toolbar.Root,
11078
+ {
11079
+ "data-slot": "toolbar",
11080
+ className: cn(
11081
+ "flex items-center gap-1 rounded-lg border border-border bg-gradient-to-b from-elevated-from to-elevated-to p-1 shadow-card",
11082
+ className
11083
+ ),
11084
+ ...props
11085
+ }
11086
+ );
11087
+ }
11088
+ function ToolbarButton({
11089
+ className,
11090
+ ...props
11091
+ }) {
11092
+ return /* @__PURE__ */ (0, import_jsx_runtime108.jsx)(
11093
+ import_radix_ui15.Toolbar.Button,
11094
+ {
11095
+ "data-slot": "toolbar-button",
11096
+ className: cn(
11097
+ "inline-flex h-8 min-w-8 items-center justify-center rounded-md px-2 text-sm font-medium text-foreground outline-none transition-colors",
11098
+ "hover:bg-muted focus-visible:ring-2 focus-visible:ring-foreground/10 disabled:pointer-events-none disabled:opacity-50",
11099
+ className
11100
+ ),
11101
+ ...props
11102
+ }
11103
+ );
11104
+ }
11105
+ function ToolbarSeparator({
11106
+ className,
11107
+ ...props
11108
+ }) {
11109
+ return /* @__PURE__ */ (0, import_jsx_runtime108.jsx)(
11110
+ import_radix_ui15.Toolbar.Separator,
11111
+ {
11112
+ "data-slot": "toolbar-separator",
11113
+ className: cn("mx-1 h-6 w-px bg-border", className),
11114
+ ...props
11115
+ }
11116
+ );
11117
+ }
11118
+ function ToolbarToggleGroup({
11119
+ className,
11120
+ ...props
11121
+ }) {
11122
+ return /* @__PURE__ */ (0, import_jsx_runtime108.jsx)(
11123
+ import_radix_ui15.Toolbar.ToggleGroup,
11124
+ {
11125
+ "data-slot": "toolbar-toggle-group",
11126
+ className: cn("flex items-center gap-0.5", className),
11127
+ ...props
11128
+ }
11129
+ );
11130
+ }
11131
+ function ToolbarToggleItem({
11132
+ className,
11133
+ ...props
11134
+ }) {
11135
+ return /* @__PURE__ */ (0, import_jsx_runtime108.jsx)(
11136
+ import_radix_ui15.Toolbar.ToggleItem,
11137
+ {
11138
+ "data-slot": "toolbar-toggle-item",
11139
+ className: cn(
11140
+ "inline-flex h-8 min-w-8 items-center justify-center rounded-md px-2 text-sm outline-none transition-colors",
11141
+ "hover:bg-muted focus-visible:ring-2 focus-visible:ring-foreground/10",
11142
+ "data-[state=on]:bg-accent data-[state=on]:text-accent-foreground",
11143
+ className
11144
+ ),
11145
+ ...props
11146
+ }
11147
+ );
11148
+ }
11149
+ function ToolbarLink({
11150
+ className,
11151
+ ...props
11152
+ }) {
11153
+ return /* @__PURE__ */ (0, import_jsx_runtime108.jsx)(
11154
+ import_radix_ui15.Toolbar.Link,
11155
+ {
11156
+ "data-slot": "toolbar-link",
11157
+ className: cn(
11158
+ "inline-flex h-8 items-center rounded-md px-2 text-sm text-foreground outline-none transition-colors hover:bg-muted focus-visible:ring-2 focus-visible:ring-foreground/10",
11159
+ className
11160
+ ),
11161
+ ...props
11162
+ }
11163
+ );
11164
+ }
11165
+
11166
+ // src/ui/menubar.tsx
11167
+ var import_radix_ui16 = require("radix-ui");
11168
+ var import_lucide_react26 = require("lucide-react");
11169
+ var import_jsx_runtime109 = require("react/jsx-runtime");
11170
+ function Menubar({
11171
+ className,
11172
+ ...props
11173
+ }) {
11174
+ return /* @__PURE__ */ (0, import_jsx_runtime109.jsx)(
11175
+ import_radix_ui16.Menubar.Root,
11176
+ {
11177
+ "data-slot": "menubar",
11178
+ className: cn(
11179
+ "flex h-9 items-center gap-1 rounded-lg border border-border bg-gradient-to-b from-elevated-from to-elevated-to p-1 shadow-card",
11180
+ className
11181
+ ),
11182
+ ...props
11183
+ }
11184
+ );
11185
+ }
11186
+ function MenubarMenu({
11187
+ ...props
11188
+ }) {
11189
+ return /* @__PURE__ */ (0, import_jsx_runtime109.jsx)(import_radix_ui16.Menubar.Menu, { "data-slot": "menubar-menu", ...props });
11190
+ }
11191
+ function MenubarTrigger({
11192
+ className,
11193
+ ...props
11194
+ }) {
11195
+ return /* @__PURE__ */ (0, import_jsx_runtime109.jsx)(
11196
+ import_radix_ui16.Menubar.Trigger,
11197
+ {
11198
+ "data-slot": "menubar-trigger",
11199
+ className: cn(
11200
+ "flex cursor-default items-center rounded-md px-2 py-1 text-sm font-medium outline-none select-none",
11201
+ "focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground",
11202
+ className
11203
+ ),
11204
+ ...props
11205
+ }
11206
+ );
11207
+ }
11208
+ function MenubarContent({
11209
+ className,
11210
+ align = "start",
11211
+ alignOffset = -4,
11212
+ sideOffset = 8,
11213
+ ...props
11214
+ }) {
11215
+ return /* @__PURE__ */ (0, import_jsx_runtime109.jsx)(import_radix_ui16.Menubar.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime109.jsx)(
11216
+ import_radix_ui16.Menubar.Content,
11217
+ {
11218
+ "data-slot": "menubar-content",
11219
+ align,
11220
+ alignOffset,
11221
+ sideOffset,
11222
+ className: cn(
11223
+ overlaySurfaceClass,
11224
+ "min-w-[12rem] origin-[var(--radix-menubar-content-transform-origin)] overflow-hidden rounded-lg p-1",
11225
+ className
11226
+ ),
11227
+ ...props
11228
+ }
11229
+ ) });
11230
+ }
11231
+ function MenubarItem({
11232
+ className,
11233
+ inset,
11234
+ variant = "default",
11235
+ ...props
11236
+ }) {
11237
+ return /* @__PURE__ */ (0, import_jsx_runtime109.jsx)(
11238
+ import_radix_ui16.Menubar.Item,
11239
+ {
11240
+ "data-slot": "menubar-item",
11241
+ "data-inset": inset,
11242
+ "data-variant": variant,
11243
+ className: cn(
11244
+ overlayItemClass,
11245
+ "data-[inset]:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10",
11246
+ className
11247
+ ),
11248
+ ...props
11249
+ }
11250
+ );
11251
+ }
11252
+ function MenubarCheckboxItem({
11253
+ className,
11254
+ children,
11255
+ checked,
11256
+ ...props
11257
+ }) {
11258
+ return /* @__PURE__ */ (0, import_jsx_runtime109.jsxs)(
11259
+ import_radix_ui16.Menubar.CheckboxItem,
11260
+ {
11261
+ "data-slot": "menubar-checkbox-item",
11262
+ className: cn(overlayItemClass, "py-1.5 pr-2 pl-8", className),
11263
+ checked,
11264
+ ...props,
11265
+ children: [
11266
+ /* @__PURE__ */ (0, import_jsx_runtime109.jsx)("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime109.jsx)(import_radix_ui16.Menubar.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime109.jsx)(import_lucide_react26.CheckIcon, { className: "size-4" }) }) }),
11267
+ children
11268
+ ]
11269
+ }
11270
+ );
11271
+ }
11272
+ function MenubarRadioGroup({
11273
+ ...props
11274
+ }) {
11275
+ return /* @__PURE__ */ (0, import_jsx_runtime109.jsx)(import_radix_ui16.Menubar.RadioGroup, { "data-slot": "menubar-radio-group", ...props });
11276
+ }
11277
+ function MenubarRadioItem({
11278
+ className,
11279
+ children,
11280
+ ...props
11281
+ }) {
11282
+ return /* @__PURE__ */ (0, import_jsx_runtime109.jsxs)(
11283
+ import_radix_ui16.Menubar.RadioItem,
11284
+ {
11285
+ "data-slot": "menubar-radio-item",
11286
+ className: cn(overlayItemClass, "py-1.5 pr-2 pl-8", className),
11287
+ ...props,
11288
+ children: [
11289
+ /* @__PURE__ */ (0, import_jsx_runtime109.jsx)("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime109.jsx)(import_radix_ui16.Menubar.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime109.jsx)(import_lucide_react26.CircleIcon, { className: "size-2 fill-current" }) }) }),
11290
+ children
11291
+ ]
11292
+ }
11293
+ );
11294
+ }
11295
+ function MenubarLabel({
11296
+ className,
11297
+ inset,
11298
+ ...props
11299
+ }) {
11300
+ return /* @__PURE__ */ (0, import_jsx_runtime109.jsx)(
11301
+ import_radix_ui16.Menubar.Label,
11302
+ {
11303
+ "data-slot": "menubar-label",
11304
+ "data-inset": inset,
11305
+ className: cn(
11306
+ "px-2 py-1.5 text-xs font-medium text-muted-foreground data-[inset]:pl-8",
11307
+ className
11308
+ ),
11309
+ ...props
11310
+ }
11311
+ );
11312
+ }
11313
+ function MenubarSeparator({
11314
+ className,
11315
+ ...props
11316
+ }) {
11317
+ return /* @__PURE__ */ (0, import_jsx_runtime109.jsx)(
11318
+ import_radix_ui16.Menubar.Separator,
11319
+ {
11320
+ "data-slot": "menubar-separator",
11321
+ className: cn("-mx-1 my-1 h-px bg-border", className),
11322
+ ...props
11323
+ }
11324
+ );
11325
+ }
11326
+ function MenubarShortcut({
11327
+ className,
11328
+ ...props
11329
+ }) {
11330
+ return /* @__PURE__ */ (0, import_jsx_runtime109.jsx)(
11331
+ "span",
11332
+ {
11333
+ "data-slot": "menubar-shortcut",
11334
+ className: cn(
11335
+ "ml-auto text-xs tracking-widest text-muted-foreground",
11336
+ className
11337
+ ),
11338
+ ...props
11339
+ }
11340
+ );
11341
+ }
11342
+ function MenubarSub({
11343
+ ...props
11344
+ }) {
11345
+ return /* @__PURE__ */ (0, import_jsx_runtime109.jsx)(import_radix_ui16.Menubar.Sub, { "data-slot": "menubar-sub", ...props });
11346
+ }
11347
+ function MenubarSubTrigger({
11348
+ className,
11349
+ inset,
11350
+ children,
11351
+ ...props
11352
+ }) {
11353
+ return /* @__PURE__ */ (0, import_jsx_runtime109.jsxs)(
11354
+ import_radix_ui16.Menubar.SubTrigger,
11355
+ {
11356
+ "data-slot": "menubar-sub-trigger",
11357
+ "data-inset": inset,
11358
+ className: cn(
11359
+ overlayItemClass,
11360
+ "data-[state=open]:bg-accent data-[state=open]:text-accent-foreground data-[inset]:pl-8",
11361
+ className
11362
+ ),
11363
+ ...props,
11364
+ children: [
11365
+ children,
11366
+ /* @__PURE__ */ (0, import_jsx_runtime109.jsx)(import_lucide_react26.ChevronRightIcon, { className: "ml-auto size-4" })
11367
+ ]
11368
+ }
11369
+ );
11370
+ }
11371
+ function MenubarSubContent({
11372
+ className,
11373
+ ...props
11374
+ }) {
11375
+ return /* @__PURE__ */ (0, import_jsx_runtime109.jsx)(
11376
+ import_radix_ui16.Menubar.SubContent,
11377
+ {
11378
+ "data-slot": "menubar-sub-content",
11379
+ className: cn(
11380
+ overlaySurfaceClass,
11381
+ "min-w-[8rem] origin-[var(--radix-menubar-content-transform-origin)] overflow-hidden rounded-lg p-1",
11382
+ className
11383
+ ),
11384
+ ...props
11385
+ }
11386
+ );
11387
+ }
11388
+
11389
+ // src/ui/navigation-menu.tsx
11390
+ var import_radix_ui17 = require("radix-ui");
11391
+ var import_lucide_react27 = require("lucide-react");
11392
+ var import_class_variance_authority2 = require("class-variance-authority");
11393
+ var import_jsx_runtime110 = require("react/jsx-runtime");
11394
+ function NavigationMenu({
11395
+ className,
11396
+ children,
11397
+ viewport = true,
11398
+ ...props
11399
+ }) {
11400
+ return /* @__PURE__ */ (0, import_jsx_runtime110.jsxs)(
11401
+ import_radix_ui17.NavigationMenu.Root,
11402
+ {
11403
+ "data-slot": "navigation-menu",
11404
+ "data-viewport": viewport,
11405
+ className: cn(
11406
+ "group/navigation-menu relative flex max-w-max flex-1 items-center justify-center",
11407
+ className
11408
+ ),
11409
+ ...props,
11410
+ children: [
11411
+ children,
11412
+ viewport ? /* @__PURE__ */ (0, import_jsx_runtime110.jsx)(NavigationMenuViewport, {}) : null
11413
+ ]
11414
+ }
11415
+ );
11416
+ }
11417
+ function NavigationMenuList({
11418
+ className,
11419
+ ...props
11420
+ }) {
11421
+ return /* @__PURE__ */ (0, import_jsx_runtime110.jsx)(
11422
+ import_radix_ui17.NavigationMenu.List,
11423
+ {
11424
+ "data-slot": "navigation-menu-list",
11425
+ className: cn(
11426
+ "group flex flex-1 list-none items-center justify-center gap-1",
11427
+ className
11428
+ ),
11429
+ ...props
11430
+ }
11431
+ );
11432
+ }
11433
+ function NavigationMenuItem({
11434
+ ...props
11435
+ }) {
11436
+ return /* @__PURE__ */ (0, import_jsx_runtime110.jsx)(import_radix_ui17.NavigationMenu.Item, { "data-slot": "navigation-menu-item", ...props });
11437
+ }
11438
+ var navigationMenuTriggerStyle = (0, import_class_variance_authority2.cva)(
11439
+ "group inline-flex h-9 w-max items-center justify-center rounded-lg bg-transparent px-4 py-2 text-sm font-medium transition-colors hover:bg-muted hover:text-foreground focus:bg-muted focus:text-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[state=open]:bg-muted/80 data-[state=open]:text-foreground"
11440
+ );
11441
+ function NavigationMenuTrigger({
11442
+ className,
11443
+ children,
11444
+ ...props
11445
+ }) {
11446
+ return /* @__PURE__ */ (0, import_jsx_runtime110.jsxs)(
11447
+ import_radix_ui17.NavigationMenu.Trigger,
11448
+ {
11449
+ "data-slot": "navigation-menu-trigger",
11450
+ className: cn(navigationMenuTriggerStyle(), "group", className),
11451
+ ...props,
11452
+ children: [
11453
+ children,
11454
+ " ",
11455
+ /* @__PURE__ */ (0, import_jsx_runtime110.jsx)(
11456
+ import_lucide_react27.ChevronDownIcon,
11457
+ {
11458
+ className: "relative top-px ml-1 size-3 transition duration-300 group-data-[state=open]:rotate-180",
11459
+ "aria-hidden": "true"
11460
+ }
11461
+ )
11462
+ ]
11463
+ }
11464
+ );
11465
+ }
11466
+ function NavigationMenuContent({
11467
+ className,
11468
+ ...props
11469
+ }) {
11470
+ return /* @__PURE__ */ (0, import_jsx_runtime110.jsx)(
11471
+ import_radix_ui17.NavigationMenu.Content,
11472
+ {
11473
+ "data-slot": "navigation-menu-content",
11474
+ className: cn(
11475
+ "data-[motion^=from-]:animate-in data-[motion^=to-]:animate-out data-[motion^=from-]:fade-in data-[motion^=to-]:fade-out data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 top-0 left-0 w-full p-2 pr-2.5 md:absolute md:w-auto",
11476
+ "group-data-[viewport=false]/navigation-menu:bg-popover group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:data-[state=open]:animate-in group-data-[viewport=false]/navigation-menu:data-[state=closed]:animate-out group-data-[viewport=false]/navigation-menu:data-[state=closed]:zoom-out-95 group-data-[viewport=false]/navigation-menu:data-[state=open]:zoom-in-95 group-data-[viewport=false]/navigation-menu:top-full group-data-[viewport=false]/navigation-menu:mt-1.5 group-data-[viewport=false]/navigation-menu:overflow-hidden group-data-[viewport=false]/navigation-menu:rounded-lg group-data-[viewport=false]/navigation-menu:border group-data-[viewport=false]/navigation-menu:border-border group-data-[viewport=false]/navigation-menu:shadow-card",
11477
+ className
11478
+ ),
11479
+ ...props
11480
+ }
11481
+ );
11482
+ }
11483
+ function NavigationMenuViewport({
11484
+ className,
11485
+ ...props
11486
+ }) {
11487
+ return /* @__PURE__ */ (0, import_jsx_runtime110.jsx)("div", { className: cn("absolute top-full left-0 isolate z-[80] flex justify-center"), children: /* @__PURE__ */ (0, import_jsx_runtime110.jsx)(
11488
+ import_radix_ui17.NavigationMenu.Viewport,
11489
+ {
11490
+ "data-slot": "navigation-menu-viewport",
11491
+ className: cn(
11492
+ overlaySurfaceClass,
11493
+ "origin-top-center relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-lg md:w-[var(--radix-navigation-menu-viewport-width)]",
11494
+ className
11495
+ ),
11496
+ ...props
11497
+ }
11498
+ ) });
11499
+ }
11500
+ function NavigationMenuLink({
11501
+ className,
11502
+ ...props
11503
+ }) {
11504
+ return /* @__PURE__ */ (0, import_jsx_runtime110.jsx)(
11505
+ import_radix_ui17.NavigationMenu.Link,
11506
+ {
11507
+ "data-slot": "navigation-menu-link",
11508
+ className: cn(
11509
+ "flex flex-col gap-1 rounded-md p-2 text-sm transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none data-[active=true]:bg-accent/50 data-[active=true]:text-accent-foreground [&_svg:not([class*='size-'])]:size-4",
11510
+ className
11511
+ ),
11512
+ ...props
11513
+ }
11514
+ );
11515
+ }
11516
+ function NavigationMenuIndicator({
11517
+ className,
11518
+ ...props
11519
+ }) {
11520
+ return /* @__PURE__ */ (0, import_jsx_runtime110.jsx)(
11521
+ import_radix_ui17.NavigationMenu.Indicator,
11522
+ {
11523
+ "data-slot": "navigation-menu-indicator",
11524
+ className: cn(
11525
+ "top-full z-[1] flex h-1.5 items-end justify-center overflow-hidden data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:animate-in data-[state=visible]:fade-in",
11526
+ className
11527
+ ),
11528
+ ...props,
11529
+ children: /* @__PURE__ */ (0, import_jsx_runtime110.jsx)("div", { className: "relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm bg-border shadow-md" })
11530
+ }
11531
+ );
11532
+ }
11533
+
11534
+ // src/ui/command.tsx
11535
+ var import_cmdk = require("cmdk");
11536
+ var import_lucide_react28 = require("lucide-react");
11537
+ var import_jsx_runtime111 = require("react/jsx-runtime");
11538
+ function Command({
11539
+ className,
11540
+ ...props
11541
+ }) {
11542
+ return /* @__PURE__ */ (0, import_jsx_runtime111.jsx)(
11543
+ import_cmdk.Command,
11544
+ {
11545
+ "data-slot": "command",
11546
+ className: cn(
11547
+ "flex h-full w-full flex-col overflow-hidden bg-popover text-popover-foreground",
11548
+ className
11549
+ ),
11550
+ ...props
11551
+ }
11552
+ );
11553
+ }
11554
+ function CommandDialog({
11555
+ title = "Command palette",
11556
+ description = "Search for a command to run\u2026",
11557
+ children,
11558
+ className,
11559
+ showCloseButton = true,
11560
+ ...props
11561
+ }) {
11562
+ return /* @__PURE__ */ (0, import_jsx_runtime111.jsxs)(Dialog, { ...props, children: [
11563
+ /* @__PURE__ */ (0, import_jsx_runtime111.jsxs)(DialogHeader, { className: "sr-only", children: [
11564
+ /* @__PURE__ */ (0, import_jsx_runtime111.jsx)(DialogTitle, { children: title }),
11565
+ /* @__PURE__ */ (0, import_jsx_runtime111.jsx)(DialogDescription, { children: description })
11566
+ ] }),
11567
+ /* @__PURE__ */ (0, import_jsx_runtime111.jsx)(
11568
+ DialogContent,
11569
+ {
11570
+ className: cn("overflow-hidden p-0", className),
11571
+ showCloseButton,
11572
+ children: /* @__PURE__ */ (0, import_jsx_runtime111.jsx)(Command, { className: "[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:size-4 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-2 [&_[cmdk-item]_svg]:size-4", children })
11573
+ }
11574
+ )
11575
+ ] });
11576
+ }
11577
+ function CommandInput({
11578
+ className,
11579
+ ...props
11580
+ }) {
11581
+ return /* @__PURE__ */ (0, import_jsx_runtime111.jsxs)(
11582
+ "div",
11583
+ {
11584
+ "data-slot": "command-input-wrapper",
11585
+ className: "flex h-10 items-center gap-2 border-b border-border px-3",
11586
+ children: [
11587
+ /* @__PURE__ */ (0, import_jsx_runtime111.jsx)(import_lucide_react28.SearchIcon, { className: "size-4 shrink-0 text-muted-foreground" }),
11588
+ /* @__PURE__ */ (0, import_jsx_runtime111.jsx)(
11589
+ import_cmdk.Command.Input,
11590
+ {
11591
+ "data-slot": "command-input",
11592
+ className: cn(
11593
+ "flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground/70 disabled:cursor-not-allowed disabled:opacity-50",
11594
+ className
11595
+ ),
11596
+ ...props
11597
+ }
11598
+ )
11599
+ ]
11600
+ }
11601
+ );
11602
+ }
11603
+ function CommandList({
11604
+ className,
11605
+ ...props
11606
+ }) {
11607
+ return /* @__PURE__ */ (0, import_jsx_runtime111.jsx)(
11608
+ import_cmdk.Command.List,
11609
+ {
11610
+ "data-slot": "command-list",
11611
+ className: cn("max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto", className),
11612
+ ...props
11613
+ }
11614
+ );
11615
+ }
11616
+ function CommandEmpty({
11617
+ ...props
11618
+ }) {
11619
+ return /* @__PURE__ */ (0, import_jsx_runtime111.jsx)(
11620
+ import_cmdk.Command.Empty,
11621
+ {
11622
+ "data-slot": "command-empty",
11623
+ className: "py-6 text-center text-sm text-muted-foreground",
11624
+ ...props
11625
+ }
11626
+ );
11627
+ }
11628
+ function CommandGroup({
11629
+ className,
11630
+ ...props
11631
+ }) {
11632
+ return /* @__PURE__ */ (0, import_jsx_runtime111.jsx)(
11633
+ import_cmdk.Command.Group,
11634
+ {
11635
+ "data-slot": "command-group",
11636
+ className: cn(
11637
+ "overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground",
11638
+ className
11639
+ ),
11640
+ ...props
11641
+ }
11642
+ );
11643
+ }
11644
+ function CommandSeparator({
11645
+ className,
11646
+ ...props
11647
+ }) {
11648
+ return /* @__PURE__ */ (0, import_jsx_runtime111.jsx)(
11649
+ import_cmdk.Command.Separator,
11650
+ {
11651
+ "data-slot": "command-separator",
11652
+ className: cn("-mx-1 h-px bg-border", className),
11653
+ ...props
11654
+ }
11655
+ );
11656
+ }
11657
+ function CommandItem({
11658
+ className,
11659
+ ...props
11660
+ }) {
11661
+ return /* @__PURE__ */ (0, import_jsx_runtime111.jsx)(
11662
+ import_cmdk.Command.Item,
11663
+ {
11664
+ "data-slot": "command-item",
11665
+ className: cn(
11666
+ overlayItemClass,
11667
+ "data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground",
11668
+ className
11669
+ ),
11670
+ ...props
11671
+ }
11672
+ );
11673
+ }
11674
+ function CommandShortcut({
11675
+ className,
11676
+ ...props
11677
+ }) {
11678
+ return /* @__PURE__ */ (0, import_jsx_runtime111.jsx)(
11679
+ "span",
11680
+ {
11681
+ "data-slot": "command-shortcut",
11682
+ className: cn(
11683
+ "ml-auto text-xs tracking-widest text-muted-foreground",
11684
+ className
11685
+ ),
11686
+ ...props
11687
+ }
11688
+ );
11689
+ }
11690
+
11691
+ // src/ui/calendar.tsx
11692
+ var React3 = __toESM(require("react"), 1);
11693
+ var import_lucide_react29 = require("lucide-react");
11694
+ var import_react_day_picker = require("react-day-picker");
11695
+ var import_jsx_runtime112 = require("react/jsx-runtime");
11696
+ function Calendar({
11697
+ className,
11698
+ classNames,
11699
+ showOutsideDays = true,
11700
+ ...props
11701
+ }) {
11702
+ return /* @__PURE__ */ (0, import_jsx_runtime112.jsx)(
11703
+ import_react_day_picker.DayPicker,
11704
+ {
11705
+ showOutsideDays,
11706
+ className: cn("p-3", className),
11707
+ classNames: {
11708
+ months: "flex flex-col gap-4 sm:flex-row sm:gap-4",
11709
+ month: "flex flex-col gap-4",
11710
+ month_caption: "relative flex items-center justify-center pt-1",
11711
+ caption_label: "text-sm font-medium",
11712
+ nav: "flex items-center gap-1",
11713
+ button_previous: cn(
11714
+ buttonVariants({ variant: "outline" }),
11715
+ "absolute left-1 size-7 bg-transparent p-0 opacity-70 hover:opacity-100"
11716
+ ),
11717
+ button_next: cn(
11718
+ buttonVariants({ variant: "outline" }),
11719
+ "absolute right-1 size-7 bg-transparent p-0 opacity-70 hover:opacity-100"
11720
+ ),
11721
+ month_grid: "w-full border-collapse",
11722
+ weekdays: "flex",
11723
+ weekday: "w-9 rounded-md text-[0.8rem] font-normal text-muted-foreground",
11724
+ week: "mt-2 flex w-full",
11725
+ day: cn(
11726
+ "relative size-9 p-0 text-center text-sm",
11727
+ "[&:has([aria-selected].day-range-end)]:rounded-r-md",
11728
+ "[&:has([aria-selected].day-outside)]:bg-accent/50",
11729
+ "[&:has([aria-selected])]:bg-accent",
11730
+ "first:[&:has([aria-selected])]:rounded-l-md",
11731
+ "last:[&:has([aria-selected])]:rounded-r-md",
11732
+ "focus-within:relative focus-within:z-10"
11733
+ ),
11734
+ day_button: cn(
11735
+ buttonVariants({ variant: "ghost" }),
11736
+ "size-9 p-0 font-normal aria-selected:opacity-100"
11737
+ ),
11738
+ range_start: "day-range-start rounded-l-md",
11739
+ range_middle: "day-range-middle aria-selected:bg-accent",
11740
+ range_end: "day-range-end rounded-r-md",
11741
+ selected: "bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground",
11742
+ today: "bg-accent text-accent-foreground",
11743
+ outside: "day-outside text-muted-foreground aria-selected:bg-accent/50 aria-selected:text-muted-foreground",
11744
+ disabled: "text-muted-foreground opacity-50",
11745
+ hidden: "invisible",
11746
+ ...classNames
11747
+ },
11748
+ components: {
11749
+ Chevron: ({ orientation, className: className2, ...chevronProps }) => {
11750
+ const Icon = orientation === "left" ? import_lucide_react29.ChevronLeftIcon : import_lucide_react29.ChevronRightIcon;
11751
+ return /* @__PURE__ */ (0, import_jsx_runtime112.jsx)(Icon, { className: cn("size-4", className2), ...chevronProps });
11752
+ },
11753
+ DayButton: CalendarDayButton
11754
+ },
11755
+ ...props
11756
+ }
11757
+ );
11758
+ }
11759
+ function CalendarDayButton({
11760
+ className,
11761
+ day,
11762
+ modifiers,
11763
+ ...props
11764
+ }) {
11765
+ const ref = React3.useRef(null);
11766
+ React3.useEffect(() => {
11767
+ if (modifiers.focused) ref.current?.focus();
11768
+ }, [modifiers.focused]);
11769
+ return /* @__PURE__ */ (0, import_jsx_runtime112.jsx)(
11770
+ "button",
11771
+ {
11772
+ ref,
11773
+ type: "button",
11774
+ "data-day": day.date.toLocaleDateString(),
11775
+ "data-selected-single": modifiers.selected && !modifiers.range_start && !modifiers.range_end && !modifiers.range_middle,
11776
+ "data-range-start": modifiers.range_start,
11777
+ "data-range-end": modifiers.range_end,
11778
+ "data-range-middle": modifiers.range_middle,
11779
+ className: cn(
11780
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors",
11781
+ "hover:bg-accent hover:text-accent-foreground",
11782
+ "focus-visible:ring-2 focus-visible:ring-foreground/10 focus-visible:outline-none",
11783
+ "disabled:pointer-events-none disabled:opacity-50",
11784
+ "data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground",
11785
+ "data-[range-middle=true]:bg-accent data-[range-middle=true]:text-accent-foreground",
11786
+ "data-[range-start=true]:rounded-l-md data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground",
11787
+ "data-[range-end=true]:rounded-r-md data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground",
11788
+ className
11789
+ ),
11790
+ ...props
11791
+ }
11792
+ );
11793
+ }
11794
+
11795
+ // src/ui/combobox.tsx
11796
+ var import_lucide_react30 = require("lucide-react");
11797
+ var import_jsx_runtime113 = require("react/jsx-runtime");
11798
+ function Combobox({
11799
+ ...props
11800
+ }) {
11801
+ return /* @__PURE__ */ (0, import_jsx_runtime113.jsx)(Popover, { "data-slot": "combobox", ...props });
11802
+ }
11803
+ function ComboboxTrigger({
11804
+ className,
11805
+ size = "default",
11806
+ children,
11807
+ ...props
11808
+ }) {
11809
+ return /* @__PURE__ */ (0, import_jsx_runtime113.jsxs)(
11810
+ PopoverTrigger,
11811
+ {
11812
+ "data-slot": "combobox-trigger",
11813
+ className: cn(
11814
+ controlClass({ size }),
11815
+ "flex w-full items-center justify-between gap-2 whitespace-nowrap font-normal",
11816
+ "[&_svg]:pointer-events-none [&_svg]:shrink-0",
11817
+ className
11818
+ ),
11819
+ ...props,
11820
+ children: [
11821
+ /* @__PURE__ */ (0, import_jsx_runtime113.jsx)("span", { className: "truncate", children }),
11822
+ /* @__PURE__ */ (0, import_jsx_runtime113.jsx)(import_lucide_react30.ChevronDownIcon, { className: "size-4 shrink-0 opacity-50" })
11823
+ ]
11824
+ }
11825
+ );
11826
+ }
11827
+ function ComboboxAnchor({
11828
+ ...props
11829
+ }) {
11830
+ return /* @__PURE__ */ (0, import_jsx_runtime113.jsx)(PopoverAnchor, { "data-slot": "combobox-anchor", ...props });
11831
+ }
11832
+ function ComboboxContent({
11833
+ className,
11834
+ align = "start",
11835
+ ...props
11836
+ }) {
11837
+ return /* @__PURE__ */ (0, import_jsx_runtime113.jsx)(
11838
+ PopoverContent,
11839
+ {
11840
+ "data-slot": "combobox-content",
11841
+ variant: "list",
11842
+ align,
11843
+ className: cn(
11844
+ "w-[var(--radix-popover-trigger-width)] min-w-[8rem] p-0",
11845
+ className
11846
+ ),
11847
+ ...props
11848
+ }
11849
+ );
11850
+ }
11851
+ function ComboboxCommand({
11852
+ className,
11853
+ ...props
11854
+ }) {
11855
+ return /* @__PURE__ */ (0, import_jsx_runtime113.jsx)(
11856
+ Command,
11857
+ {
11858
+ "data-slot": "combobox-command",
11859
+ className,
11860
+ ...props
11861
+ }
11862
+ );
11863
+ }
11864
+ function ComboboxInput({
11865
+ ...props
11866
+ }) {
11867
+ return /* @__PURE__ */ (0, import_jsx_runtime113.jsx)(CommandInput, { "data-slot": "combobox-input", ...props });
11868
+ }
11869
+ function ComboboxList({
11870
+ ...props
11871
+ }) {
11872
+ return /* @__PURE__ */ (0, import_jsx_runtime113.jsx)(CommandList, { "data-slot": "combobox-list", ...props });
11873
+ }
11874
+ function ComboboxEmpty({
11875
+ ...props
11876
+ }) {
11877
+ return /* @__PURE__ */ (0, import_jsx_runtime113.jsx)(CommandEmpty, { "data-slot": "combobox-empty", ...props });
11878
+ }
11879
+ function ComboboxGroup({
11880
+ ...props
11881
+ }) {
11882
+ return /* @__PURE__ */ (0, import_jsx_runtime113.jsx)(CommandGroup, { "data-slot": "combobox-group", ...props });
11883
+ }
11884
+ function ComboboxItem({
11885
+ ...props
11886
+ }) {
11887
+ return /* @__PURE__ */ (0, import_jsx_runtime113.jsx)(CommandItem, { "data-slot": "combobox-item", ...props });
11888
+ }
11889
+ function ComboboxSeparator({
11890
+ ...props
11891
+ }) {
11892
+ return /* @__PURE__ */ (0, import_jsx_runtime113.jsx)(CommandSeparator, { "data-slot": "combobox-separator", ...props });
11893
+ }
11894
+ function ComboboxShortcut({
11895
+ ...props
11896
+ }) {
11897
+ return /* @__PURE__ */ (0, import_jsx_runtime113.jsx)(CommandShortcut, { "data-slot": "combobox-shortcut", ...props });
11898
+ }
11899
+
11900
+ // src/ui/date-picker.tsx
11901
+ var import_lucide_react31 = require("lucide-react");
11902
+ var import_jsx_runtime114 = require("react/jsx-runtime");
11903
+ function DatePicker({
11904
+ ...props
11905
+ }) {
11906
+ return /* @__PURE__ */ (0, import_jsx_runtime114.jsx)(Popover, { "data-slot": "date-picker", ...props });
11907
+ }
11908
+ function DatePickerTrigger({
11909
+ ...props
11910
+ }) {
11911
+ return /* @__PURE__ */ (0, import_jsx_runtime114.jsx)(PopoverTrigger, { "data-slot": "date-picker-trigger", ...props });
11912
+ }
11913
+ function DatePickerContent({
11914
+ className,
11915
+ align = "start",
11916
+ ...props
11917
+ }) {
11918
+ return /* @__PURE__ */ (0, import_jsx_runtime114.jsx)(
11919
+ PopoverContent,
11920
+ {
11921
+ "data-slot": "date-picker-content",
11922
+ align,
11923
+ className: cn("w-auto p-0", className),
11924
+ ...props
11925
+ }
11926
+ );
11927
+ }
11928
+ function DatePickerCalendar({
11929
+ className,
11930
+ ...props
11931
+ }) {
11932
+ return /* @__PURE__ */ (0, import_jsx_runtime114.jsx)(
11933
+ Calendar,
11934
+ {
11935
+ "data-slot": "date-picker-calendar",
11936
+ className: cn("rounded-lg border-0", className),
11937
+ ...props
11938
+ }
11939
+ );
11940
+ }
11941
+ function formatPickerDate(date) {
11942
+ return date.toLocaleDateString(void 0, {
11943
+ month: "short",
11944
+ day: "numeric",
11945
+ year: "numeric"
11946
+ });
11947
+ }
11948
+ function DatePickerButton({
11949
+ date,
11950
+ placeholder = "Pick a date",
11951
+ className,
11952
+ ...props
11953
+ }) {
11954
+ return /* @__PURE__ */ (0, import_jsx_runtime114.jsxs)(
11955
+ "button",
11956
+ {
11957
+ type: "button",
11958
+ "data-slot": "date-picker-button",
11959
+ className: cn(
11960
+ controlClass(),
11961
+ "flex w-full items-center justify-start gap-2 text-left font-normal",
11962
+ !date && "text-muted-foreground",
11963
+ className
11964
+ ),
11965
+ ...props,
11966
+ children: [
11967
+ /* @__PURE__ */ (0, import_jsx_runtime114.jsx)(import_lucide_react31.CalendarIcon, { className: "size-4 shrink-0 opacity-70" }),
11968
+ date ? formatPickerDate(date) : placeholder
11969
+ ]
11970
+ }
11971
+ );
11972
+ }
11973
+
11974
+ // src/ui/input-otp.tsx
11975
+ var import_lucide_react32 = require("lucide-react");
11976
+ var import_radix_ui18 = require("radix-ui");
11977
+ var import_jsx_runtime115 = require("react/jsx-runtime");
11978
+ function InputOTP({
11979
+ className,
11980
+ containerClassName,
11981
+ children,
11982
+ ...props
11983
+ }) {
11984
+ return /* @__PURE__ */ (0, import_jsx_runtime115.jsx)(
11985
+ import_radix_ui18.unstable_OneTimePasswordField.Root,
11986
+ {
11987
+ "data-slot": "input-otp",
11988
+ className: cn(
11989
+ "flex items-center gap-2 has-disabled:opacity-50",
11990
+ containerClassName,
11991
+ className
11992
+ ),
11993
+ ...props,
11994
+ children
11995
+ }
11996
+ );
11997
+ }
11998
+ function InputOTPGroup({
11999
+ className,
12000
+ ...props
12001
+ }) {
12002
+ return /* @__PURE__ */ (0, import_jsx_runtime115.jsx)(
12003
+ "div",
12004
+ {
12005
+ "data-slot": "input-otp-group",
12006
+ className: cn("flex items-center", className),
12007
+ ...props
12008
+ }
12009
+ );
12010
+ }
12011
+ function InputOTPSlot({
12012
+ className,
12013
+ ...props
12014
+ }) {
12015
+ return /* @__PURE__ */ (0, import_jsx_runtime115.jsx)(
12016
+ import_radix_ui18.unstable_OneTimePasswordField.Input,
12017
+ {
12018
+ "data-slot": "input-otp-slot",
12019
+ className: cn(
12020
+ controlSurfaceClass,
12021
+ "relative size-9 rounded-none text-center text-sm tabular-nums",
12022
+ "-ms-px first:ms-0 first:rounded-s-lg last:rounded-e-lg",
12023
+ "focus-visible:z-10",
12024
+ className
12025
+ ),
12026
+ ...props
12027
+ }
12028
+ );
12029
+ }
12030
+ function InputOTPHiddenInput({
12031
+ ...props
12032
+ }) {
12033
+ return /* @__PURE__ */ (0, import_jsx_runtime115.jsx)(import_radix_ui18.unstable_OneTimePasswordField.HiddenInput, { "data-slot": "input-otp-hidden-input", ...props });
12034
+ }
12035
+ function InputOTPSeparator({
12036
+ className,
12037
+ ...props
12038
+ }) {
12039
+ return /* @__PURE__ */ (0, import_jsx_runtime115.jsx)(
12040
+ "div",
12041
+ {
12042
+ role: "separator",
12043
+ "data-slot": "input-otp-separator",
12044
+ "aria-hidden": true,
12045
+ className: cn("text-muted-foreground", className),
12046
+ ...props,
12047
+ children: /* @__PURE__ */ (0, import_jsx_runtime115.jsx)(import_lucide_react32.MinusIcon, { className: "size-4" })
12048
+ }
12049
+ );
12050
+ }
12051
+
12052
+ // src/ui/kbd.tsx
12053
+ var import_jsx_runtime116 = require("react/jsx-runtime");
12054
+ function Kbd({ className, ...props }) {
12055
+ return /* @__PURE__ */ (0, import_jsx_runtime116.jsx)(
12056
+ "kbd",
12057
+ {
12058
+ "data-slot": "kbd",
12059
+ className: cn(
12060
+ "pointer-events-none inline-flex h-5 min-w-5 items-center justify-center gap-1 rounded border border-border bg-muted px-1.5 font-mono text-[0.625rem] font-medium text-muted-foreground",
12061
+ className
12062
+ ),
12063
+ ...props
12064
+ }
12065
+ );
12066
+ }
12067
+ function KbdGroup({ className, ...props }) {
12068
+ return /* @__PURE__ */ (0, import_jsx_runtime116.jsx)(
12069
+ "div",
12070
+ {
12071
+ "data-slot": "kbd-group",
12072
+ className: cn("inline-flex items-center gap-1", className),
12073
+ ...props
12074
+ }
12075
+ );
12076
+ }
12077
+
12078
+ // src/ui/spinner.tsx
12079
+ var import_jsx_runtime117 = require("react/jsx-runtime");
12080
+ function Spinner({
12081
+ className,
12082
+ ...props
12083
+ }) {
12084
+ return /* @__PURE__ */ (0, import_jsx_runtime117.jsxs)(
12085
+ "svg",
12086
+ {
12087
+ "data-slot": "spinner",
12088
+ role: "status",
12089
+ "aria-label": "Loading",
12090
+ viewBox: "0 0 24 24",
12091
+ fill: "none",
12092
+ className: cn("size-4 animate-spin text-muted-foreground", className),
12093
+ ...props,
12094
+ children: [
12095
+ /* @__PURE__ */ (0, import_jsx_runtime117.jsx)(
12096
+ "circle",
12097
+ {
12098
+ className: "opacity-25",
12099
+ cx: "12",
12100
+ cy: "12",
12101
+ r: "10",
12102
+ stroke: "currentColor",
12103
+ strokeWidth: "3"
12104
+ }
12105
+ ),
12106
+ /* @__PURE__ */ (0, import_jsx_runtime117.jsx)(
12107
+ "path",
12108
+ {
12109
+ className: "opacity-75",
12110
+ fill: "currentColor",
12111
+ d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
12112
+ }
12113
+ )
12114
+ ]
12115
+ }
12116
+ );
12117
+ }
12118
+
12119
+ // src/ui/input-group.tsx
12120
+ var import_jsx_runtime118 = require("react/jsx-runtime");
12121
+ function InputGroup({
12122
+ className,
12123
+ ...props
12124
+ }) {
12125
+ return /* @__PURE__ */ (0, import_jsx_runtime118.jsx)(
12126
+ "div",
12127
+ {
12128
+ "data-slot": "input-group",
12129
+ className: cn(
12130
+ controlClass(),
12131
+ "flex w-full items-stretch overflow-hidden p-0",
12132
+ "has-[[data-slot=input-group-control]:disabled]:opacity-50",
12133
+ className
12134
+ ),
12135
+ ...props
12136
+ }
12137
+ );
12138
+ }
12139
+ function InputGroupAddon({
12140
+ className,
12141
+ align = "inline-start",
12142
+ ...props
12143
+ }) {
12144
+ return /* @__PURE__ */ (0, import_jsx_runtime118.jsx)(
12145
+ "div",
12146
+ {
12147
+ "data-slot": "input-group-addon",
12148
+ "data-align": align,
12149
+ className: cn(
12150
+ "flex shrink-0 items-center bg-transparent px-3 text-sm text-muted-foreground",
12151
+ align === "inline-start" && "border-r border-border",
12152
+ align === "inline-end" && "border-l border-border",
12153
+ className
12154
+ ),
12155
+ ...props
12156
+ }
12157
+ );
12158
+ }
12159
+ function InputGroupInput({
12160
+ className,
12161
+ ...props
12162
+ }) {
12163
+ return /* @__PURE__ */ (0, import_jsx_runtime118.jsx)(
12164
+ "input",
12165
+ {
12166
+ "data-slot": "input-group-control",
12167
+ className: cn(
12168
+ "min-w-0 flex-1 border-0 bg-transparent px-3 py-2 text-sm text-foreground shadow-none outline-none",
12169
+ "placeholder:text-muted-foreground/70 focus-visible:ring-0",
12170
+ className
12171
+ ),
12172
+ ...props
12173
+ }
12174
+ );
12175
+ }
12176
+ function InputGroupText({
12177
+ className,
12178
+ ...props
12179
+ }) {
12180
+ return /* @__PURE__ */ (0, import_jsx_runtime118.jsx)(
12181
+ "span",
12182
+ {
12183
+ "data-slot": "input-group-text",
12184
+ className: cn("text-sm text-muted-foreground", className),
12185
+ ...props
12186
+ }
12187
+ );
12188
+ }
12189
+
12190
+ // src/ui/accordion.tsx
12191
+ var import_radix_ui19 = require("radix-ui");
12192
+ var import_lucide_react33 = require("lucide-react");
12193
+ var import_jsx_runtime119 = require("react/jsx-runtime");
12194
+ function Accordion({
12195
+ ...props
12196
+ }) {
12197
+ return /* @__PURE__ */ (0, import_jsx_runtime119.jsx)(import_radix_ui19.Accordion.Root, { "data-slot": "accordion", ...props });
12198
+ }
12199
+ function AccordionItem({
12200
+ className,
12201
+ ...props
12202
+ }) {
12203
+ return /* @__PURE__ */ (0, import_jsx_runtime119.jsx)(
12204
+ import_radix_ui19.Accordion.Item,
12205
+ {
12206
+ "data-slot": "accordion-item",
12207
+ className: cn("border-b border-border last:border-b-0", className),
12208
+ ...props
12209
+ }
12210
+ );
12211
+ }
12212
+ function AccordionTrigger({
12213
+ className,
12214
+ children,
12215
+ ...props
12216
+ }) {
12217
+ return /* @__PURE__ */ (0, import_jsx_runtime119.jsx)(import_radix_ui19.Accordion.Header, { className: "flex", children: /* @__PURE__ */ (0, import_jsx_runtime119.jsxs)(
12218
+ import_radix_ui19.Accordion.Trigger,
12219
+ {
12220
+ "data-slot": "accordion-trigger",
12221
+ className: cn(
12222
+ "flex flex-1 items-center justify-between gap-4 rounded-md py-4 text-left text-sm font-medium outline-none transition-all",
12223
+ "focus-visible:ring-2 focus-visible:ring-foreground/10 disabled:pointer-events-none disabled:opacity-50",
12224
+ "hover:underline [&[data-state=open]>svg]:rotate-180",
12225
+ className
12226
+ ),
12227
+ ...props,
12228
+ children: [
12229
+ children,
12230
+ /* @__PURE__ */ (0, import_jsx_runtime119.jsx)(import_lucide_react33.ChevronDownIcon, { className: "pointer-events-none size-4 shrink-0 text-muted-foreground transition-transform duration-200" })
12231
+ ]
12232
+ }
12233
+ ) });
12234
+ }
12235
+ function AccordionContent({
12236
+ className,
12237
+ children,
12238
+ ...props
12239
+ }) {
12240
+ return /* @__PURE__ */ (0, import_jsx_runtime119.jsx)(
12241
+ import_radix_ui19.Accordion.Content,
12242
+ {
12243
+ "data-slot": "accordion-content",
12244
+ className: "overflow-hidden text-sm text-muted-foreground data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",
12245
+ ...props,
12246
+ children: /* @__PURE__ */ (0, import_jsx_runtime119.jsx)("div", { className: cn("pt-0 pb-4", className), children })
12247
+ }
12248
+ );
12249
+ }
12250
+
12251
+ // src/ui/separator.tsx
12252
+ var import_radix_ui20 = require("radix-ui");
12253
+ var import_jsx_runtime120 = require("react/jsx-runtime");
12254
+ function Separator({
12255
+ className,
12256
+ orientation = "horizontal",
12257
+ decorative = true,
12258
+ ...props
12259
+ }) {
12260
+ return /* @__PURE__ */ (0, import_jsx_runtime120.jsx)(
12261
+ import_radix_ui20.Separator.Root,
12262
+ {
12263
+ "data-slot": "separator",
12264
+ decorative,
12265
+ orientation,
12266
+ className: cn(
12267
+ "shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px",
12268
+ className
12269
+ ),
12270
+ ...props
12271
+ }
12272
+ );
12273
+ }
12274
+
12275
+ // src/ui/slider.tsx
12276
+ var React4 = __toESM(require("react"), 1);
12277
+ var import_radix_ui21 = require("radix-ui");
12278
+ var import_jsx_runtime121 = require("react/jsx-runtime");
12279
+ function Slider({
12280
+ className,
12281
+ defaultValue,
12282
+ value,
12283
+ min = 0,
12284
+ max = 100,
12285
+ ...props
12286
+ }) {
12287
+ const thumbs = React4.useMemo(() => {
12288
+ if (Array.isArray(value)) return value;
12289
+ if (Array.isArray(defaultValue)) return defaultValue;
12290
+ return [min];
12291
+ }, [value, defaultValue, min]);
12292
+ return /* @__PURE__ */ (0, import_jsx_runtime121.jsxs)(
12293
+ import_radix_ui21.Slider.Root,
12294
+ {
12295
+ "data-slot": "slider",
12296
+ defaultValue,
12297
+ value,
12298
+ min,
12299
+ max,
12300
+ className: cn(
12301
+ "relative flex w-full touch-none items-center select-none data-[disabled]:opacity-50",
12302
+ "data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-44 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col",
12303
+ className
12304
+ ),
12305
+ ...props,
12306
+ children: [
12307
+ /* @__PURE__ */ (0, import_jsx_runtime121.jsx)(
12308
+ import_radix_ui21.Slider.Track,
12309
+ {
12310
+ "data-slot": "slider-track",
12311
+ className: "relative grow overflow-hidden rounded-full bg-muted data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5",
12312
+ children: /* @__PURE__ */ (0, import_jsx_runtime121.jsx)(
12313
+ import_radix_ui21.Slider.Range,
12314
+ {
12315
+ "data-slot": "slider-range",
12316
+ className: "absolute bg-gradient-to-b from-primary-fill-from to-primary-fill-to data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full"
12317
+ }
12318
+ )
12319
+ }
12320
+ ),
12321
+ Array.from({ length: thumbs.length }, (_, i) => /* @__PURE__ */ (0, import_jsx_runtime121.jsx)(
12322
+ import_radix_ui21.Slider.Thumb,
12323
+ {
12324
+ "data-slot": "slider-thumb",
12325
+ className: "block size-4 shrink-0 rounded-full border border-border bg-gradient-to-b from-elevated-from to-elevated-to shadow-card outline-none transition-[box-shadow] focus-visible:ring-2 focus-visible:ring-foreground/10 disabled:pointer-events-none disabled:opacity-50"
12326
+ },
12327
+ i
12328
+ ))
12329
+ ]
12330
+ }
12331
+ );
12332
+ }
12333
+
12334
+ // src/ui/progress.tsx
12335
+ var import_radix_ui22 = require("radix-ui");
12336
+ var import_jsx_runtime122 = require("react/jsx-runtime");
12337
+ function Progress({
12338
+ className,
12339
+ value,
12340
+ ...props
12341
+ }) {
12342
+ return /* @__PURE__ */ (0, import_jsx_runtime122.jsx)(
12343
+ import_radix_ui22.Progress.Root,
12344
+ {
12345
+ "data-slot": "progress",
12346
+ className: cn(
12347
+ "relative h-2 w-full overflow-hidden rounded-full bg-muted",
12348
+ className
12349
+ ),
12350
+ ...props,
12351
+ children: /* @__PURE__ */ (0, import_jsx_runtime122.jsx)(
12352
+ import_radix_ui22.Progress.Indicator,
12353
+ {
12354
+ "data-slot": "progress-indicator",
12355
+ className: "h-full w-full flex-1 bg-gradient-to-b from-primary-fill-from to-primary-fill-to transition-transform",
12356
+ style: { transform: `translateX(-${100 - (value ?? 0)}%)` }
12357
+ }
12358
+ )
12359
+ }
12360
+ );
12361
+ }
12362
+
12363
+ // src/ui/badge.tsx
12364
+ var import_radix_ui23 = require("radix-ui");
12365
+ var import_class_variance_authority3 = require("class-variance-authority");
12366
+ var import_jsx_runtime123 = require("react/jsx-runtime");
12367
+ var badgeVariants = (0, import_class_variance_authority3.cva)(
12368
+ "inline-flex w-fit shrink-0 items-center justify-center gap-1 whitespace-nowrap rounded-md border px-2 py-0.5 text-xs font-medium [&>svg]:pointer-events-none [&>svg]:size-3",
12369
+ {
12370
+ variants: {
12371
+ variant: {
12372
+ default: "border-transparent bg-gradient-to-b from-primary-fill-from to-primary-fill-to text-primary-foreground",
12373
+ secondary: "border-border bg-gradient-to-b from-elevated-from to-elevated-to text-foreground shadow-card",
12374
+ destructive: "border-destructive/45 bg-destructive/10 text-destructive",
12375
+ outline: "border-border text-foreground"
12376
+ }
12377
+ },
12378
+ defaultVariants: {
12379
+ variant: "default"
12380
+ }
12381
+ }
12382
+ );
12383
+ function Badge({
12384
+ className,
12385
+ variant,
12386
+ asChild = false,
12387
+ ...props
12388
+ }) {
12389
+ const Comp = asChild ? import_radix_ui23.Slot.Root : "span";
12390
+ return /* @__PURE__ */ (0, import_jsx_runtime123.jsx)(
12391
+ Comp,
12392
+ {
12393
+ "data-slot": "badge",
12394
+ className: cn(badgeVariants({ variant }), className),
12395
+ ...props
12396
+ }
12397
+ );
12398
+ }
12399
+
12400
+ // src/ui/sheet.tsx
12401
+ var import_lucide_react34 = require("lucide-react");
12402
+ var import_radix_ui24 = require("radix-ui");
12403
+ var import_class_variance_authority4 = require("class-variance-authority");
12404
+ var import_jsx_runtime124 = require("react/jsx-runtime");
12405
+ function Sheet({ ...props }) {
12406
+ return /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(import_radix_ui24.Dialog.Root, { "data-slot": "sheet", ...props });
12407
+ }
12408
+ function SheetTrigger({
12409
+ ...props
12410
+ }) {
12411
+ return /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(import_radix_ui24.Dialog.Trigger, { "data-slot": "sheet-trigger", ...props });
12412
+ }
12413
+ function SheetClose({
12414
+ ...props
12415
+ }) {
12416
+ return /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(import_radix_ui24.Dialog.Close, { "data-slot": "sheet-close", ...props });
12417
+ }
12418
+ function SheetPortal({
12419
+ ...props
12420
+ }) {
12421
+ return /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(import_radix_ui24.Dialog.Portal, { "data-slot": "sheet-portal", ...props });
12422
+ }
12423
+ function SheetOverlay({
12424
+ className,
12425
+ ...props
12426
+ }) {
12427
+ return /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(
12428
+ import_radix_ui24.Dialog.Overlay,
12429
+ {
12430
+ "data-slot": "sheet-overlay",
12431
+ className: cn(
12432
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-[70] bg-black/50",
12433
+ className
12434
+ ),
12435
+ ...props
12436
+ }
12437
+ );
12438
+ }
12439
+ var sheetContentVariants = (0, import_class_variance_authority4.cva)(
12440
+ cn(
12441
+ TIMBAL_V2_MODAL_SURFACE,
12442
+ "data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-[70] flex flex-col gap-4 shadow-card-elevated transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500"
12443
+ ),
12444
+ {
12445
+ variants: {
12446
+ side: {
12447
+ top: "data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 border-b p-6",
12448
+ bottom: "data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 border-t p-6",
12449
+ left: "data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r p-6 sm:max-w-sm",
12450
+ right: "data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l p-6 sm:max-w-sm"
12451
+ }
12452
+ },
12453
+ defaultVariants: {
12454
+ side: "right"
12455
+ }
12456
+ }
12457
+ );
12458
+ function SheetContent({
12459
+ className,
12460
+ children,
12461
+ side = "right",
12462
+ showCloseButton = true,
12463
+ ...props
12464
+ }) {
12465
+ return /* @__PURE__ */ (0, import_jsx_runtime124.jsxs)(SheetPortal, { children: [
12466
+ /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(SheetOverlay, {}),
12467
+ /* @__PURE__ */ (0, import_jsx_runtime124.jsxs)(
12468
+ import_radix_ui24.Dialog.Content,
12469
+ {
12470
+ "data-slot": "sheet-content",
12471
+ className: cn(sheetContentVariants({ side }), className),
12472
+ ...props,
12473
+ children: [
12474
+ children,
12475
+ showCloseButton ? /* @__PURE__ */ (0, import_jsx_runtime124.jsxs)(import_radix_ui24.Dialog.Close, { className: "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-foreground/10 focus:outline-hidden disabled:pointer-events-none", children: [
12476
+ /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(import_lucide_react34.XIcon, { className: "size-4" }),
12477
+ /* @__PURE__ */ (0, import_jsx_runtime124.jsx)("span", { className: "sr-only", children: "Close" })
12478
+ ] }) : null
12479
+ ]
12480
+ }
12481
+ )
12482
+ ] });
12483
+ }
12484
+ function SheetHeader({ className, ...props }) {
12485
+ return /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(
12486
+ "div",
12487
+ {
12488
+ "data-slot": "sheet-header",
12489
+ className: cn("flex flex-col gap-1.5 p-0", className),
12490
+ ...props
12491
+ }
12492
+ );
12493
+ }
12494
+ function SheetFooter({ className, ...props }) {
12495
+ return /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(
12496
+ "div",
12497
+ {
12498
+ "data-slot": "sheet-footer",
12499
+ className: cn("mt-auto flex flex-col gap-2 sm:flex-row sm:justify-end", className),
12500
+ ...props
12501
+ }
12502
+ );
12503
+ }
12504
+ function SheetTitle({
12505
+ className,
12506
+ ...props
12507
+ }) {
12508
+ return /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(
12509
+ import_radix_ui24.Dialog.Title,
12510
+ {
12511
+ "data-slot": "sheet-title",
12512
+ className: cn("text-lg font-semibold text-foreground", className),
12513
+ ...props
12514
+ }
12515
+ );
12516
+ }
12517
+ function SheetDescription({
12518
+ className,
12519
+ ...props
12520
+ }) {
12521
+ return /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(
12522
+ import_radix_ui24.Dialog.Description,
12523
+ {
12524
+ "data-slot": "sheet-description",
12525
+ className: cn("text-sm text-muted-foreground", className),
12526
+ ...props
12527
+ }
12528
+ );
12529
+ }
12530
+
12531
+ // src/ui/alert-dialog.tsx
12532
+ var import_radix_ui25 = require("radix-ui");
12533
+ var import_jsx_runtime125 = require("react/jsx-runtime");
12534
+ function AlertDialog({
12535
+ ...props
12536
+ }) {
12537
+ return /* @__PURE__ */ (0, import_jsx_runtime125.jsx)(import_radix_ui25.AlertDialog.Root, { "data-slot": "alert-dialog", ...props });
12538
+ }
12539
+ function AlertDialogTrigger({
12540
+ ...props
12541
+ }) {
12542
+ return /* @__PURE__ */ (0, import_jsx_runtime125.jsx)(import_radix_ui25.AlertDialog.Trigger, { "data-slot": "alert-dialog-trigger", ...props });
12543
+ }
12544
+ function AlertDialogPortal({
12545
+ ...props
12546
+ }) {
12547
+ return /* @__PURE__ */ (0, import_jsx_runtime125.jsx)(import_radix_ui25.AlertDialog.Portal, { "data-slot": "alert-dialog-portal", ...props });
12548
+ }
12549
+ function AlertDialogOverlay({
12550
+ className,
12551
+ ...props
12552
+ }) {
12553
+ return /* @__PURE__ */ (0, import_jsx_runtime125.jsx)(
12554
+ import_radix_ui25.AlertDialog.Overlay,
12555
+ {
12556
+ "data-slot": "alert-dialog-overlay",
12557
+ className: cn(
12558
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-[70] bg-black/50",
12559
+ className
12560
+ ),
12561
+ ...props
12562
+ }
12563
+ );
12564
+ }
12565
+ function AlertDialogContent({
12566
+ className,
12567
+ ...props
12568
+ }) {
12569
+ return /* @__PURE__ */ (0, import_jsx_runtime125.jsxs)(AlertDialogPortal, { children: [
12570
+ /* @__PURE__ */ (0, import_jsx_runtime125.jsx)(AlertDialogOverlay, {}),
12571
+ /* @__PURE__ */ (0, import_jsx_runtime125.jsx)(
12572
+ import_radix_ui25.AlertDialog.Content,
12573
+ {
12574
+ "data-slot": "alert-dialog-content",
12575
+ className: cn(
12576
+ TIMBAL_V2_MODAL_SURFACE,
12577
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-[70] grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-xl p-6 duration-200 outline-none sm:max-w-lg",
12578
+ className
12579
+ ),
12580
+ ...props
12581
+ }
12582
+ )
12583
+ ] });
12584
+ }
12585
+ function AlertDialogHeader({ className, ...props }) {
12586
+ return /* @__PURE__ */ (0, import_jsx_runtime125.jsx)(
12587
+ "div",
12588
+ {
12589
+ "data-slot": "alert-dialog-header",
12590
+ className: cn("flex flex-col gap-2 text-center sm:text-left", className),
12591
+ ...props
12592
+ }
12593
+ );
12594
+ }
12595
+ function AlertDialogFooter({ className, ...props }) {
12596
+ return /* @__PURE__ */ (0, import_jsx_runtime125.jsx)(
12597
+ "div",
12598
+ {
12599
+ "data-slot": "alert-dialog-footer",
12600
+ className: cn(
12601
+ "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",
12602
+ className
12603
+ ),
12604
+ ...props
12605
+ }
12606
+ );
12607
+ }
12608
+ function AlertDialogTitle({
12609
+ className,
12610
+ ...props
12611
+ }) {
12612
+ return /* @__PURE__ */ (0, import_jsx_runtime125.jsx)(
12613
+ import_radix_ui25.AlertDialog.Title,
12614
+ {
12615
+ "data-slot": "alert-dialog-title",
12616
+ className: cn("text-lg font-semibold", className),
12617
+ ...props
12618
+ }
12619
+ );
12620
+ }
12621
+ function AlertDialogDescription({
12622
+ className,
12623
+ ...props
12624
+ }) {
12625
+ return /* @__PURE__ */ (0, import_jsx_runtime125.jsx)(
12626
+ import_radix_ui25.AlertDialog.Description,
12627
+ {
12628
+ "data-slot": "alert-dialog-description",
12629
+ className: cn("text-sm text-muted-foreground", className),
12630
+ ...props
12631
+ }
12632
+ );
12633
+ }
12634
+ function AlertDialogAction({
12635
+ className,
12636
+ ...props
12637
+ }) {
12638
+ return /* @__PURE__ */ (0, import_jsx_runtime125.jsx)(Button, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime125.jsx)(
12639
+ import_radix_ui25.AlertDialog.Action,
12640
+ {
12641
+ "data-slot": "alert-dialog-action",
12642
+ className,
12643
+ ...props
12644
+ }
12645
+ ) });
12646
+ }
12647
+ function AlertDialogCancel({
12648
+ className,
12649
+ ...props
12650
+ }) {
12651
+ return /* @__PURE__ */ (0, import_jsx_runtime125.jsx)(Button, { asChild: true, variant: "outline", children: /* @__PURE__ */ (0, import_jsx_runtime125.jsx)(
12652
+ import_radix_ui25.AlertDialog.Cancel,
12653
+ {
12654
+ "data-slot": "alert-dialog-cancel",
12655
+ className,
12656
+ ...props
12657
+ }
12658
+ ) });
12659
+ }
12660
+
12661
+ // src/ui/collapsible.tsx
12662
+ var import_radix_ui26 = require("radix-ui");
12663
+ var import_jsx_runtime126 = require("react/jsx-runtime");
12664
+ function Collapsible({
12665
+ ...props
12666
+ }) {
12667
+ return /* @__PURE__ */ (0, import_jsx_runtime126.jsx)(import_radix_ui26.Collapsible.Root, { "data-slot": "collapsible", ...props });
12668
+ }
12669
+ function CollapsibleTrigger({
12670
+ ...props
12671
+ }) {
12672
+ return /* @__PURE__ */ (0, import_jsx_runtime126.jsx)(import_radix_ui26.Collapsible.Trigger, { "data-slot": "collapsible-trigger", ...props });
12673
+ }
12674
+ function CollapsibleContent({
12675
+ className,
12676
+ ...props
12677
+ }) {
12678
+ return /* @__PURE__ */ (0, import_jsx_runtime126.jsx)(
12679
+ import_radix_ui26.Collapsible.Content,
12680
+ {
12681
+ "data-slot": "collapsible-content",
12682
+ className: cn(
12683
+ "overflow-hidden data-[state=closed]:animate-collapsible-up data-[state=open]:animate-collapsible-down",
12684
+ className
12685
+ ),
12686
+ ...props
12687
+ }
12688
+ );
12689
+ }
12690
+
12691
+ // src/ui/scroll-area.tsx
12692
+ var import_radix_ui27 = require("radix-ui");
12693
+ var import_jsx_runtime127 = require("react/jsx-runtime");
12694
+ function ScrollArea({
12695
+ className,
12696
+ children,
12697
+ ...props
12698
+ }) {
12699
+ return /* @__PURE__ */ (0, import_jsx_runtime127.jsxs)(
12700
+ import_radix_ui27.ScrollArea.Root,
12701
+ {
12702
+ "data-slot": "scroll-area",
12703
+ className: cn("relative overflow-hidden", className),
12704
+ ...props,
12705
+ children: [
12706
+ /* @__PURE__ */ (0, import_jsx_runtime127.jsx)(
12707
+ import_radix_ui27.ScrollArea.Viewport,
12708
+ {
12709
+ "data-slot": "scroll-area-viewport",
12710
+ className: "size-full rounded-[inherit] outline-none transition-[color,box-shadow] focus-visible:ring-2 focus-visible:ring-foreground/10",
12711
+ children
12712
+ }
12713
+ ),
12714
+ /* @__PURE__ */ (0, import_jsx_runtime127.jsx)(ScrollBar, {}),
12715
+ /* @__PURE__ */ (0, import_jsx_runtime127.jsx)(import_radix_ui27.ScrollArea.Corner, {})
12716
+ ]
12717
+ }
12718
+ );
12719
+ }
12720
+ function ScrollBar({
12721
+ className,
12722
+ orientation = "vertical",
12723
+ ...props
12724
+ }) {
12725
+ return /* @__PURE__ */ (0, import_jsx_runtime127.jsx)(
12726
+ import_radix_ui27.ScrollArea.ScrollAreaScrollbar,
12727
+ {
12728
+ "data-slot": "scroll-area-scrollbar",
12729
+ orientation,
12730
+ className: cn(
12731
+ "flex touch-none p-px transition-colors select-none",
12732
+ orientation === "vertical" && "h-full w-2.5 border-l border-l-transparent",
12733
+ orientation === "horizontal" && "h-2.5 flex-col border-t border-t-transparent",
12734
+ className
12735
+ ),
12736
+ ...props,
12737
+ children: /* @__PURE__ */ (0, import_jsx_runtime127.jsx)(
12738
+ import_radix_ui27.ScrollArea.ScrollAreaThumb,
12739
+ {
12740
+ "data-slot": "scroll-area-thumb",
12741
+ className: "relative flex-1 rounded-full bg-border"
12742
+ }
12743
+ )
12744
+ }
12745
+ );
12746
+ }
12747
+
12748
+ // src/ui/toggle.tsx
12749
+ var import_radix_ui28 = require("radix-ui");
12750
+ var import_class_variance_authority5 = require("class-variance-authority");
12751
+ var import_jsx_runtime128 = require("react/jsx-runtime");
12752
+ var toggleVariants = (0, import_class_variance_authority5.cva)(
12753
+ "inline-flex items-center justify-center gap-2 rounded-lg text-sm font-medium whitespace-nowrap outline-none transition-[color,box-shadow,background-color,border-color] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0",
12754
+ {
12755
+ variants: {
12756
+ variant: {
12757
+ default: cn(
12758
+ "border border-border bg-gradient-to-b from-elevated-from to-elevated-to shadow-card",
12759
+ "hover:from-secondary-fill-hover-from hover:to-secondary-fill-hover-to",
12760
+ "data-[state=on]:border-foreground/15 data-[state=on]:from-primary-fill-from data-[state=on]:to-primary-fill-to data-[state=on]:text-primary-foreground",
12761
+ "focus-visible:ring-2 focus-visible:ring-foreground/10"
12762
+ ),
12763
+ outline: cn(
12764
+ "border border-border bg-transparent",
12765
+ "hover:bg-muted hover:text-foreground",
12766
+ "data-[state=on]:bg-accent data-[state=on]:text-accent-foreground",
12767
+ "focus-visible:ring-2 focus-visible:ring-foreground/10"
12768
+ )
12769
+ },
12770
+ size: {
12771
+ default: "h-10 px-3 min-w-10",
12772
+ sm: "h-9 px-2.5 min-w-9",
12773
+ lg: "h-11 px-5 min-w-11"
12774
+ }
12775
+ },
12776
+ defaultVariants: {
12777
+ variant: "default",
12778
+ size: "default"
12779
+ }
12780
+ }
12781
+ );
12782
+ function Toggle({
12783
+ className,
12784
+ variant,
12785
+ size,
12786
+ ...props
12787
+ }) {
12788
+ return /* @__PURE__ */ (0, import_jsx_runtime128.jsx)(
12789
+ import_radix_ui28.Toggle.Root,
12790
+ {
12791
+ "data-slot": "toggle",
12792
+ className: cn(toggleVariants({ variant, size, className })),
12793
+ ...props
12794
+ }
12795
+ );
12796
+ }
12797
+
12798
+ // src/ui/toggle-group.tsx
12799
+ var import_radix_ui29 = require("radix-ui");
12800
+ var import_jsx_runtime129 = require("react/jsx-runtime");
12801
+ function ToggleGroup({
12802
+ className,
12803
+ ...props
12804
+ }) {
12805
+ return /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
12806
+ import_radix_ui29.ToggleGroup.Root,
12807
+ {
12808
+ "data-slot": "toggle-group",
12809
+ className: cn("flex items-center gap-1", className),
12810
+ ...props
12811
+ }
12812
+ );
12813
+ }
12814
+ function ToggleGroupItem({
12815
+ className,
12816
+ ...props
12817
+ }) {
12818
+ return /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
12819
+ import_radix_ui29.ToggleGroup.Item,
12820
+ {
12821
+ "data-slot": "toggle-group-item",
12822
+ className: cn(toggleVariants({ variant: "default", size: "default" }), className),
12823
+ ...props
12824
+ }
12825
+ );
12826
+ }
12827
+
12828
+ // src/ui/hover-card.tsx
12829
+ var import_radix_ui30 = require("radix-ui");
12830
+ var import_jsx_runtime130 = require("react/jsx-runtime");
12831
+ function HoverCard({
12832
+ ...props
12833
+ }) {
12834
+ return /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(import_radix_ui30.HoverCard.Root, { "data-slot": "hover-card", ...props });
12835
+ }
12836
+ function HoverCardTrigger({
12837
+ ...props
12838
+ }) {
12839
+ return /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(import_radix_ui30.HoverCard.Trigger, { "data-slot": "hover-card-trigger", ...props });
12840
+ }
12841
+ function HoverCardContent({
12842
+ className,
12843
+ align = "center",
12844
+ sideOffset = 4,
12845
+ ...props
12846
+ }) {
12847
+ return /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(import_radix_ui30.HoverCard.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(
12848
+ import_radix_ui30.HoverCard.Content,
12849
+ {
12850
+ "data-slot": "hover-card-content",
12851
+ align,
12852
+ sideOffset,
12853
+ className: cn(
12854
+ overlaySurfaceClass,
12855
+ "w-64 origin-[var(--radix-hover-card-content-transform-origin)] rounded-xl p-4 outline-hidden",
12856
+ className
12857
+ ),
12858
+ ...props
12859
+ }
12860
+ ) });
12861
+ }
12862
+
12863
+ // src/ui/context-menu.tsx
12864
+ var import_radix_ui31 = require("radix-ui");
12865
+ var import_lucide_react35 = require("lucide-react");
12866
+ var import_jsx_runtime131 = require("react/jsx-runtime");
12867
+ function ContextMenu({
12868
+ ...props
12869
+ }) {
12870
+ return /* @__PURE__ */ (0, import_jsx_runtime131.jsx)(import_radix_ui31.ContextMenu.Root, { "data-slot": "context-menu", ...props });
12871
+ }
12872
+ function ContextMenuTrigger({
12873
+ ...props
12874
+ }) {
12875
+ return /* @__PURE__ */ (0, import_jsx_runtime131.jsx)(import_radix_ui31.ContextMenu.Trigger, { "data-slot": "context-menu-trigger", ...props });
12876
+ }
12877
+ function ContextMenuGroup({
12878
+ ...props
12879
+ }) {
12880
+ return /* @__PURE__ */ (0, import_jsx_runtime131.jsx)(import_radix_ui31.ContextMenu.Group, { "data-slot": "context-menu-group", ...props });
12881
+ }
12882
+ function ContextMenuContent({
12883
+ className,
12884
+ ...props
12885
+ }) {
12886
+ return /* @__PURE__ */ (0, import_jsx_runtime131.jsx)(import_radix_ui31.ContextMenu.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime131.jsx)(
12887
+ import_radix_ui31.ContextMenu.Content,
12888
+ {
12889
+ "data-slot": "context-menu-content",
12890
+ className: cn(
12891
+ overlaySurfaceClass,
12892
+ "max-h-[var(--radix-context-menu-content-available-height)] min-w-[8rem] origin-[var(--radix-context-menu-content-transform-origin)] overflow-x-hidden overflow-y-auto rounded-lg p-1",
12893
+ className
12894
+ ),
12895
+ ...props
12896
+ }
12897
+ ) });
12898
+ }
12899
+ function ContextMenuItem({
12900
+ className,
12901
+ inset,
12902
+ variant = "default",
12903
+ ...props
12904
+ }) {
12905
+ return /* @__PURE__ */ (0, import_jsx_runtime131.jsx)(
12906
+ import_radix_ui31.ContextMenu.Item,
12907
+ {
12908
+ "data-slot": "context-menu-item",
12909
+ "data-inset": inset,
12910
+ "data-variant": variant,
12911
+ className: cn(
12912
+ overlayItemClass,
12913
+ "data-[inset]:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10",
12914
+ className
12915
+ ),
12916
+ ...props
12917
+ }
12918
+ );
12919
+ }
12920
+ function ContextMenuCheckboxItem({
12921
+ className,
12922
+ children,
12923
+ checked,
12924
+ ...props
12925
+ }) {
12926
+ return /* @__PURE__ */ (0, import_jsx_runtime131.jsxs)(
12927
+ import_radix_ui31.ContextMenu.CheckboxItem,
12928
+ {
12929
+ "data-slot": "context-menu-checkbox-item",
12930
+ className: cn(overlayItemClass, "py-1.5 pr-2 pl-8", className),
12931
+ checked,
12932
+ ...props,
12933
+ children: [
12934
+ /* @__PURE__ */ (0, import_jsx_runtime131.jsx)("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime131.jsx)(import_radix_ui31.ContextMenu.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime131.jsx)(import_lucide_react35.CheckIcon, { className: "size-4" }) }) }),
12935
+ children
12936
+ ]
12937
+ }
12938
+ );
12939
+ }
12940
+ function ContextMenuRadioGroup({
12941
+ ...props
12942
+ }) {
12943
+ return /* @__PURE__ */ (0, import_jsx_runtime131.jsx)(
12944
+ import_radix_ui31.ContextMenu.RadioGroup,
12945
+ {
12946
+ "data-slot": "context-menu-radio-group",
12947
+ ...props
12948
+ }
12949
+ );
12950
+ }
12951
+ function ContextMenuRadioItem({
12952
+ className,
12953
+ children,
12954
+ ...props
12955
+ }) {
12956
+ return /* @__PURE__ */ (0, import_jsx_runtime131.jsxs)(
12957
+ import_radix_ui31.ContextMenu.RadioItem,
12958
+ {
12959
+ "data-slot": "context-menu-radio-item",
12960
+ className: cn(overlayItemClass, "py-1.5 pr-2 pl-8", className),
12961
+ ...props,
12962
+ children: [
12963
+ /* @__PURE__ */ (0, import_jsx_runtime131.jsx)("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime131.jsx)(import_radix_ui31.ContextMenu.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime131.jsx)(import_lucide_react35.CircleIcon, { className: "size-2 fill-current" }) }) }),
12964
+ children
12965
+ ]
12966
+ }
12967
+ );
12968
+ }
12969
+ function ContextMenuLabel({
12970
+ className,
12971
+ inset,
12972
+ ...props
12973
+ }) {
12974
+ return /* @__PURE__ */ (0, import_jsx_runtime131.jsx)(
12975
+ import_radix_ui31.ContextMenu.Label,
12976
+ {
12977
+ "data-slot": "context-menu-label",
12978
+ "data-inset": inset,
12979
+ className: cn(
12980
+ "px-2 py-1.5 text-xs font-medium text-muted-foreground data-[inset]:pl-8",
12981
+ className
12982
+ ),
12983
+ ...props
12984
+ }
12985
+ );
12986
+ }
12987
+ function ContextMenuSeparator({
12988
+ className,
12989
+ ...props
12990
+ }) {
12991
+ return /* @__PURE__ */ (0, import_jsx_runtime131.jsx)(
12992
+ import_radix_ui31.ContextMenu.Separator,
12993
+ {
12994
+ "data-slot": "context-menu-separator",
12995
+ className: cn("-mx-1 my-1 h-px bg-border", className),
12996
+ ...props
12997
+ }
12998
+ );
12999
+ }
13000
+ function ContextMenuShortcut({
13001
+ className,
13002
+ ...props
13003
+ }) {
13004
+ return /* @__PURE__ */ (0, import_jsx_runtime131.jsx)(
13005
+ "span",
13006
+ {
13007
+ "data-slot": "context-menu-shortcut",
13008
+ className: cn(
13009
+ "ml-auto text-xs tracking-widest text-muted-foreground",
13010
+ className
13011
+ ),
13012
+ ...props
13013
+ }
13014
+ );
13015
+ }
13016
+ function ContextMenuSub({
13017
+ ...props
13018
+ }) {
13019
+ return /* @__PURE__ */ (0, import_jsx_runtime131.jsx)(import_radix_ui31.ContextMenu.Sub, { "data-slot": "context-menu-sub", ...props });
13020
+ }
13021
+ function ContextMenuSubTrigger({
13022
+ className,
13023
+ inset,
13024
+ children,
13025
+ ...props
13026
+ }) {
13027
+ return /* @__PURE__ */ (0, import_jsx_runtime131.jsxs)(
13028
+ import_radix_ui31.ContextMenu.SubTrigger,
13029
+ {
13030
+ "data-slot": "context-menu-sub-trigger",
13031
+ "data-inset": inset,
13032
+ className: cn(
13033
+ overlayItemClass,
13034
+ "data-[state=open]:bg-accent data-[state=open]:text-accent-foreground data-[inset]:pl-8",
13035
+ className
13036
+ ),
13037
+ ...props,
13038
+ children: [
13039
+ children,
13040
+ /* @__PURE__ */ (0, import_jsx_runtime131.jsx)(import_lucide_react35.ChevronRightIcon, { className: "ml-auto size-4" })
13041
+ ]
13042
+ }
13043
+ );
13044
+ }
13045
+ function ContextMenuSubContent({
13046
+ className,
13047
+ ...props
13048
+ }) {
13049
+ return /* @__PURE__ */ (0, import_jsx_runtime131.jsx)(
13050
+ import_radix_ui31.ContextMenu.SubContent,
13051
+ {
13052
+ "data-slot": "context-menu-sub-content",
13053
+ className: cn(
13054
+ overlaySurfaceClass,
13055
+ "min-w-[8rem] origin-[var(--radix-context-menu-content-transform-origin)] overflow-hidden rounded-lg p-1",
13056
+ className
13057
+ ),
13058
+ ...props
13059
+ }
13060
+ );
13061
+ }
13062
+
13063
+ // src/ui/alert.tsx
13064
+ var import_class_variance_authority6 = require("class-variance-authority");
13065
+ var import_jsx_runtime132 = require("react/jsx-runtime");
13066
+ var alertVariants = (0, import_class_variance_authority6.cva)(
13067
+ "relative grid w-full gap-1 rounded-xl border px-4 py-3 text-sm [&>svg]:absolute [&>svg]:top-3.5 [&>svg]:left-4 [&>svg]:size-4 [&>svg+div]:translate-y-[-3px] [&:has(svg)]:pl-11",
13068
+ {
13069
+ variants: {
13070
+ variant: {
13071
+ default: "border-border bg-gradient-to-b from-elevated-from to-elevated-to text-foreground shadow-card",
13072
+ destructive: "border-destructive/45 bg-destructive/10 text-destructive [&>svg]:text-destructive"
13073
+ }
13074
+ },
13075
+ defaultVariants: {
13076
+ variant: "default"
13077
+ }
13078
+ }
13079
+ );
13080
+ function Alert({
13081
+ className,
13082
+ variant,
13083
+ ...props
13084
+ }) {
13085
+ return /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(
13086
+ "div",
13087
+ {
13088
+ "data-slot": "alert",
13089
+ role: "alert",
13090
+ className: cn(alertVariants({ variant }), className),
13091
+ ...props
13092
+ }
13093
+ );
13094
+ }
13095
+ function AlertTitle({ className, ...props }) {
13096
+ return /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(
13097
+ "div",
13098
+ {
13099
+ "data-slot": "alert-title",
13100
+ className: cn("font-medium tracking-tight", className),
13101
+ ...props
13102
+ }
13103
+ );
13104
+ }
13105
+ function AlertDescription({ className, ...props }) {
13106
+ return /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(
13107
+ "div",
13108
+ {
13109
+ "data-slot": "alert-description",
13110
+ className: cn("text-sm text-muted-foreground [&_p]:leading-relaxed", className),
13111
+ ...props
13112
+ }
13113
+ );
13114
+ }
13115
+
13116
+ // src/ui/card.tsx
13117
+ var import_jsx_runtime133 = require("react/jsx-runtime");
13118
+ function Card({ className, ...props }) {
13119
+ return /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(
13120
+ "div",
13121
+ {
13122
+ "data-slot": "card",
13123
+ className: cn(
13124
+ TIMBAL_V2_ELEVATED_SURFACE,
13125
+ "flex flex-col gap-4 rounded-xl py-4 text-card-foreground",
13126
+ className
13127
+ ),
13128
+ ...props
13129
+ }
13130
+ );
13131
+ }
13132
+ function CardHeader({ className, ...props }) {
13133
+ return /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(
13134
+ "div",
13135
+ {
13136
+ "data-slot": "card-header",
13137
+ className: cn("flex flex-col gap-1.5 px-4", className),
13138
+ ...props
13139
+ }
13140
+ );
13141
+ }
13142
+ function CardTitle({ className, ...props }) {
13143
+ return /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(
13144
+ "div",
13145
+ {
13146
+ "data-slot": "card-title",
13147
+ className: cn("text-base font-semibold leading-none", className),
13148
+ ...props
13149
+ }
13150
+ );
13151
+ }
13152
+ function CardDescription({ className, ...props }) {
13153
+ return /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(
13154
+ "div",
13155
+ {
13156
+ "data-slot": "card-description",
13157
+ className: cn("text-sm text-muted-foreground", className),
13158
+ ...props
13159
+ }
13160
+ );
13161
+ }
13162
+ function CardContent({ className, ...props }) {
13163
+ return /* @__PURE__ */ (0, import_jsx_runtime133.jsx)("div", { "data-slot": "card-content", className: cn("px-4", className), ...props });
13164
+ }
13165
+ function CardFooter({ className, ...props }) {
13166
+ return /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(
13167
+ "div",
13168
+ {
13169
+ "data-slot": "card-footer",
13170
+ className: cn("flex items-center px-4", className),
13171
+ ...props
13172
+ }
13173
+ );
13174
+ }
13175
+
13176
+ // src/ui/skeleton.tsx
13177
+ var import_jsx_runtime134 = require("react/jsx-runtime");
13178
+ function Skeleton({ className, ...props }) {
13179
+ return /* @__PURE__ */ (0, import_jsx_runtime134.jsx)(
13180
+ "div",
13181
+ {
13182
+ "data-slot": "skeleton",
13183
+ className: cn("animate-pulse rounded-lg bg-muted", className),
13184
+ ...props
13185
+ }
13186
+ );
13187
+ }
13188
+
13189
+ // src/ui/table.tsx
13190
+ var import_jsx_runtime135 = require("react/jsx-runtime");
13191
+ function Table({ className, ...props }) {
13192
+ return /* @__PURE__ */ (0, import_jsx_runtime135.jsx)("div", { "data-slot": "table-container", className: "relative w-full overflow-x-auto", children: /* @__PURE__ */ (0, import_jsx_runtime135.jsx)(
13193
+ "table",
13194
+ {
13195
+ "data-slot": "table",
13196
+ className: cn("w-full caption-bottom text-sm", className),
13197
+ ...props
13198
+ }
13199
+ ) });
13200
+ }
13201
+ function TableHeader({ className, ...props }) {
13202
+ return /* @__PURE__ */ (0, import_jsx_runtime135.jsx)(
13203
+ "thead",
13204
+ {
13205
+ "data-slot": "table-header",
13206
+ className: cn("[&_tr]:border-b [&_tr]:border-border", className),
13207
+ ...props
13208
+ }
13209
+ );
13210
+ }
13211
+ function TableBody({ className, ...props }) {
13212
+ return /* @__PURE__ */ (0, import_jsx_runtime135.jsx)(
13213
+ "tbody",
13214
+ {
13215
+ "data-slot": "table-body",
13216
+ className: cn("[&_tr:last-child]:border-0", className),
13217
+ ...props
13218
+ }
13219
+ );
13220
+ }
13221
+ function TableFooter({ className, ...props }) {
13222
+ return /* @__PURE__ */ (0, import_jsx_runtime135.jsx)(
13223
+ "tfoot",
13224
+ {
13225
+ "data-slot": "table-footer",
13226
+ className: cn(
13227
+ "border-t border-border bg-muted/50 font-medium [&>tr]:last:border-b-0",
13228
+ className
13229
+ ),
13230
+ ...props
13231
+ }
13232
+ );
13233
+ }
13234
+ function TableRow({ className, ...props }) {
13235
+ return /* @__PURE__ */ (0, import_jsx_runtime135.jsx)(
13236
+ "tr",
13237
+ {
13238
+ "data-slot": "table-row",
13239
+ className: cn(
13240
+ "border-b border-border transition-colors hover:bg-muted/40 data-[state=selected]:bg-muted",
13241
+ className
13242
+ ),
13243
+ ...props
13244
+ }
13245
+ );
13246
+ }
13247
+ function TableHead({ className, ...props }) {
13248
+ return /* @__PURE__ */ (0, import_jsx_runtime135.jsx)(
13249
+ "th",
13250
+ {
13251
+ "data-slot": "table-head",
13252
+ className: cn(
13253
+ "h-10 px-3 text-left align-middle text-xs font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0",
13254
+ className
13255
+ ),
13256
+ ...props
13257
+ }
13258
+ );
13259
+ }
13260
+ function TableCell({ className, ...props }) {
13261
+ return /* @__PURE__ */ (0, import_jsx_runtime135.jsx)(
13262
+ "td",
13263
+ {
13264
+ "data-slot": "table-cell",
13265
+ className: cn(
13266
+ "p-3 align-middle text-sm [&:has([role=checkbox])]:pr-0",
13267
+ className
13268
+ ),
13269
+ ...props
13270
+ }
13271
+ );
13272
+ }
13273
+ function TableCaption({ className, ...props }) {
13274
+ return /* @__PURE__ */ (0, import_jsx_runtime135.jsx)(
13275
+ "caption",
13276
+ {
13277
+ "data-slot": "table-caption",
13278
+ className: cn("mt-4 text-sm text-muted-foreground", className),
13279
+ ...props
13280
+ }
13281
+ );
13282
+ }
13283
+
13284
+ // src/ui/toast.tsx
13285
+ var import_radix_ui32 = require("radix-ui");
13286
+ var import_lucide_react36 = require("lucide-react");
13287
+ var import_jsx_runtime136 = require("react/jsx-runtime");
13288
+ function ToastProvider({
13289
+ ...props
13290
+ }) {
13291
+ return /* @__PURE__ */ (0, import_jsx_runtime136.jsx)(import_radix_ui32.Toast.Provider, { "data-slot": "toast-provider", ...props });
13292
+ }
13293
+ function ToastViewport({
13294
+ className,
13295
+ ...props
13296
+ }) {
13297
+ return /* @__PURE__ */ (0, import_jsx_runtime136.jsx)(
13298
+ import_radix_ui32.Toast.Viewport,
13299
+ {
13300
+ "data-slot": "toast-viewport",
13301
+ className: cn(
13302
+ "fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse gap-2 p-4 sm:top-auto sm:right-0 sm:bottom-0 sm:max-w-[420px] sm:flex-col",
13303
+ className
13304
+ ),
13305
+ ...props
13306
+ }
13307
+ );
13308
+ }
13309
+ function Toast({
13310
+ className,
13311
+ variant = "default",
13312
+ ...props
13313
+ }) {
13314
+ return /* @__PURE__ */ (0, import_jsx_runtime136.jsx)(
13315
+ import_radix_ui32.Toast.Root,
13316
+ {
13317
+ "data-slot": "toast",
13318
+ className: cn(
13319
+ TIMBAL_V2_ELEVATED_SURFACE,
13320
+ "group pointer-events-auto relative flex w-full items-center justify-between gap-3 overflow-hidden rounded-xl p-4 pr-8 shadow-card-elevated transition-all",
13321
+ "data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-80 data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full data-[state=closed]:slide-out-to-right-full",
13322
+ variant === "destructive" && "border-destructive/45 bg-destructive/10 text-destructive",
13323
+ className
13324
+ ),
13325
+ ...props
13326
+ }
13327
+ );
13328
+ }
13329
+ function ToastAction({
13330
+ className,
13331
+ ...props
13332
+ }) {
13333
+ return /* @__PURE__ */ (0, import_jsx_runtime136.jsx)(
13334
+ import_radix_ui32.Toast.Action,
13335
+ {
13336
+ "data-slot": "toast-action",
13337
+ className: cn(
13338
+ "inline-flex h-8 shrink-0 items-center justify-center rounded-lg border border-border bg-transparent px-3 text-sm font-medium transition-colors hover:bg-muted focus:ring-2 focus:ring-foreground/10 focus:outline-hidden disabled:pointer-events-none disabled:opacity-50",
13339
+ className
13340
+ ),
13341
+ ...props
13342
+ }
13343
+ );
13344
+ }
13345
+ function ToastClose({
13346
+ className,
13347
+ ...props
13348
+ }) {
13349
+ return /* @__PURE__ */ (0, import_jsx_runtime136.jsx)(
13350
+ import_radix_ui32.Toast.Close,
13351
+ {
13352
+ "data-slot": "toast-close",
13353
+ className: cn(
13354
+ "absolute top-3 right-3 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-foreground/10 focus:outline-hidden",
13355
+ className
13356
+ ),
13357
+ "toast-close": "",
13358
+ ...props,
13359
+ children: /* @__PURE__ */ (0, import_jsx_runtime136.jsx)(import_lucide_react36.XIcon, { className: "size-4" })
13360
+ }
13361
+ );
13362
+ }
13363
+ function ToastTitle({
13364
+ className,
13365
+ ...props
13366
+ }) {
13367
+ return /* @__PURE__ */ (0, import_jsx_runtime136.jsx)(
13368
+ import_radix_ui32.Toast.Title,
13369
+ {
13370
+ "data-slot": "toast-title",
13371
+ className: cn("text-sm font-medium", className),
13372
+ ...props
13373
+ }
13374
+ );
13375
+ }
13376
+ function ToastDescription({
13377
+ className,
13378
+ ...props
13379
+ }) {
13380
+ return /* @__PURE__ */ (0, import_jsx_runtime136.jsx)(
13381
+ import_radix_ui32.Toast.Description,
13382
+ {
13383
+ "data-slot": "toast-description",
13384
+ className: cn("text-sm text-muted-foreground", className),
13385
+ ...props
13386
+ }
13387
+ );
13388
+ }
13389
+
13390
+ // src/ui/use-toast.ts
13391
+ var React5 = __toESM(require("react"), 1);
13392
+ var TOAST_LIMIT = 3;
13393
+ var TOAST_REMOVE_DELAY = 5e3;
13394
+ var listeners = /* @__PURE__ */ new Set();
13395
+ var memoryState = {
13396
+ toasts: [],
13397
+ add: () => "",
13398
+ dismiss: () => {
13399
+ },
13400
+ remove: () => {
13401
+ }
13402
+ };
13403
+ function dispatch(partial) {
13404
+ memoryState = { ...memoryState, ...partial };
13405
+ for (const listener of listeners) listener(memoryState);
13406
+ }
13407
+ function genId() {
13408
+ return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
13409
+ }
13410
+ var removeTimeouts = /* @__PURE__ */ new Map();
13411
+ function scheduleRemove(id, delay = TOAST_REMOVE_DELAY) {
13412
+ if (removeTimeouts.has(id)) return;
13413
+ const timeout = setTimeout(() => {
13414
+ removeTimeouts.delete(id);
13415
+ dispatch({
13416
+ toasts: memoryState.toasts.filter((t) => t.id !== id)
13417
+ });
13418
+ }, delay);
13419
+ removeTimeouts.set(id, timeout);
13420
+ }
13421
+ function addToast(toastInput) {
13422
+ const id = genId();
13423
+ dispatch({
13424
+ toasts: [{ ...toastInput, id }, ...memoryState.toasts].slice(0, TOAST_LIMIT)
13425
+ });
13426
+ scheduleRemove(id, toastInput.duration ?? TOAST_REMOVE_DELAY);
13427
+ return id;
13428
+ }
13429
+ function dismissToast(id) {
13430
+ scheduleRemove(id, 300);
13431
+ }
13432
+ memoryState = {
13433
+ toasts: [],
13434
+ add: addToast,
13435
+ dismiss: dismissToast,
13436
+ remove: (id) => {
13437
+ dispatch({ toasts: memoryState.toasts.filter((t) => t.id !== id) });
13438
+ }
13439
+ };
13440
+ function toast(input) {
13441
+ return memoryState.add(input);
13442
+ }
13443
+ function useToast() {
13444
+ const [state, setState] = React5.useState(memoryState);
13445
+ React5.useEffect(() => {
13446
+ listeners.add(setState);
13447
+ return () => {
13448
+ listeners.delete(setState);
13449
+ };
13450
+ }, []);
13451
+ return {
13452
+ toasts: state.toasts,
13453
+ toast,
13454
+ dismiss: state.dismiss
13455
+ };
13456
+ }
13457
+
13458
+ // src/ui/toaster.tsx
13459
+ var import_jsx_runtime137 = require("react/jsx-runtime");
13460
+ function Toaster() {
13461
+ const { toasts, dismiss } = useToast();
13462
+ return /* @__PURE__ */ (0, import_jsx_runtime137.jsxs)(ToastProvider, { children: [
13463
+ toasts.map(({ id, title, description, variant }) => /* @__PURE__ */ (0, import_jsx_runtime137.jsxs)(
13464
+ Toast,
13465
+ {
13466
+ variant,
13467
+ onOpenChange: (open) => !open && dismiss(id),
13468
+ children: [
13469
+ /* @__PURE__ */ (0, import_jsx_runtime137.jsxs)("div", { className: "grid gap-1", children: [
13470
+ title ? /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(ToastTitle, { children: title }) : null,
13471
+ description ? /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(ToastDescription, { children: description }) : null
13472
+ ] }),
13473
+ /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(ToastClose, {})
13474
+ ]
13475
+ },
13476
+ id
13477
+ )),
13478
+ /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(ToastViewport, {})
13479
+ ] });
13480
+ }
9984
13481
  // Annotate the CommonJS export names for ESM import in node:
9985
13482
  0 && (module.exports = {
9986
13483
  APP_KIT_AGENT_INSTRUCTIONS,
9987
13484
  ARTIFACT_AGENT_INSTRUCTIONS,
9988
13485
  ARTIFACT_FENCE_LANGUAGES,
13486
+ Accordion,
13487
+ AccordionContent,
13488
+ AccordionItem,
13489
+ AccordionTrigger,
9989
13490
  ActionBarPrimitive,
13491
+ Alert,
13492
+ AlertDescription,
13493
+ AlertDialog,
13494
+ AlertDialogAction,
13495
+ AlertDialogCancel,
13496
+ AlertDialogContent,
13497
+ AlertDialogDescription,
13498
+ AlertDialogFooter,
13499
+ AlertDialogHeader,
13500
+ AlertDialogOverlay,
13501
+ AlertDialogPortal,
13502
+ AlertDialogTitle,
13503
+ AlertDialogTrigger,
13504
+ AlertTitle,
9990
13505
  AppChatPanel,
9991
13506
  AppConfirmDialog,
9992
13507
  AppCopilotProvider,
@@ -9996,25 +13511,88 @@ function SelectScrollDownButton({
9996
13511
  ArtifactCard,
9997
13512
  ArtifactRegistryProvider,
9998
13513
  ArtifactView,
13514
+ AspectRatio,
9999
13515
  AssistantRuntimeProvider,
10000
13516
  AuiIf,
10001
13517
  AuthGuard,
10002
13518
  Avatar,
10003
13519
  AvatarFallback,
10004
13520
  AvatarImage,
13521
+ Badge,
13522
+ Breadcrumb,
13523
+ BreadcrumbEllipsis,
13524
+ BreadcrumbItem,
13525
+ BreadcrumbLink,
13526
+ BreadcrumbList,
13527
+ BreadcrumbPage,
13528
+ BreadcrumbSeparator,
10005
13529
  Breadcrumbs,
10006
13530
  Button,
10007
13531
  CHART_PALETTE,
13532
+ COLOR_UTILITY_PREFIXES,
13533
+ CONTROL_SIZE,
13534
+ Calendar,
13535
+ CalendarDayButton,
13536
+ Card,
13537
+ CardContent,
13538
+ CardDescription,
13539
+ CardFooter,
13540
+ CardHeader,
13541
+ CardTitle,
10008
13542
  ChartArtifactView,
10009
13543
  ChartPanel,
13544
+ Checkbox,
13545
+ Collapsible,
13546
+ CollapsibleContent,
13547
+ CollapsibleTrigger,
13548
+ Combobox,
13549
+ ComboboxAnchor,
13550
+ ComboboxCommand,
13551
+ ComboboxContent,
13552
+ ComboboxEmpty,
13553
+ ComboboxGroup,
13554
+ ComboboxInput,
13555
+ ComboboxItem,
13556
+ ComboboxList,
13557
+ ComboboxSeparator,
13558
+ ComboboxShortcut,
13559
+ ComboboxTrigger,
13560
+ Command,
13561
+ CommandDialog,
13562
+ CommandEmpty,
13563
+ CommandGroup,
13564
+ CommandInput,
13565
+ CommandItem,
13566
+ CommandList,
13567
+ CommandSeparator,
13568
+ CommandShortcut,
10010
13569
  Composer,
10011
13570
  ComposerPrimitive,
10012
13571
  ConnectionRow,
10013
13572
  ConnectionRowList,
13573
+ ContextMenu,
13574
+ ContextMenuCheckboxItem,
13575
+ ContextMenuContent,
13576
+ ContextMenuGroup,
13577
+ ContextMenuItem,
13578
+ ContextMenuLabel,
13579
+ ContextMenuRadioGroup,
13580
+ ContextMenuRadioItem,
13581
+ ContextMenuSeparator,
13582
+ ContextMenuShortcut,
13583
+ ContextMenuSub,
13584
+ ContextMenuSubContent,
13585
+ ContextMenuSubTrigger,
13586
+ ContextMenuTrigger,
10014
13587
  DEFAULT_UPLOAD_ACCEPT,
10015
13588
  DangerZone,
10016
13589
  DangerZoneAction,
10017
13590
  DataTable,
13591
+ DatePicker,
13592
+ DatePickerButton,
13593
+ DatePickerCalendar,
13594
+ DatePickerContent,
13595
+ DatePickerTrigger,
10018
13596
  DescriptionList,
10019
13597
  Dialog,
10020
13598
  DialogClose,
@@ -10050,32 +13628,93 @@ function SelectScrollDownButton({
10050
13628
  FieldTextarea,
10051
13629
  FilterBar,
10052
13630
  FloatingUnsavedChangesBar,
13631
+ Form,
13632
+ FormControl,
13633
+ FormField,
13634
+ FormItem,
13635
+ FormLabel,
13636
+ FormMessage,
10053
13637
  FormSection,
13638
+ FormSubmit,
13639
+ HOUSE_RULES,
13640
+ HoverCard,
13641
+ HoverCardContent,
13642
+ HoverCardTrigger,
10054
13643
  HtmlArtifactView,
10055
13644
  INTEGRATION_CATALOG_CARD_HEIGHT_CLASS,
10056
13645
  InfoCard,
13646
+ Input,
13647
+ InputGroup,
13648
+ InputGroupAddon,
13649
+ InputGroupInput,
13650
+ InputGroupText,
13651
+ InputOTP,
13652
+ InputOTPGroup,
13653
+ InputOTPHiddenInput,
13654
+ InputOTPSeparator,
13655
+ InputOTPSlot,
10057
13656
  IntegrationCard,
10058
13657
  IntegrationsEmptyState,
10059
13658
  JsonArtifactView,
13659
+ Kbd,
13660
+ KbdGroup,
13661
+ Label,
10060
13662
  LineAreaChart,
10061
13663
  MarkdownText,
10062
13664
  MemoPillSegmentedTabs,
13665
+ Menubar,
13666
+ MenubarCheckboxItem,
13667
+ MenubarContent,
13668
+ MenubarItem,
13669
+ MenubarLabel,
13670
+ MenubarMenu,
13671
+ MenubarRadioGroup,
13672
+ MenubarRadioItem,
13673
+ MenubarSeparator,
13674
+ MenubarShortcut,
13675
+ MenubarSub,
13676
+ MenubarSubContent,
13677
+ MenubarSubTrigger,
13678
+ MenubarTrigger,
10063
13679
  MessagePrimitive,
10064
13680
  MetricChartCard,
10065
13681
  MetricRow,
10066
13682
  MetricTile,
10067
13683
  ModeToggle,
13684
+ NavigationMenu,
13685
+ NavigationMenuContent,
13686
+ NavigationMenuIndicator,
13687
+ NavigationMenuItem,
13688
+ NavigationMenuLink,
13689
+ NavigationMenuList,
13690
+ NavigationMenuTrigger,
13691
+ NavigationMenuViewport,
10068
13692
  Page,
10069
13693
  PageHeader,
13694
+ Pagination,
13695
+ PaginationContent,
13696
+ PaginationEllipsis,
13697
+ PaginationItem,
13698
+ PaginationLink,
13699
+ PaginationNext,
13700
+ PaginationPrevious,
10070
13701
  PillSegmentedTabs,
10071
13702
  PlanBadge,
10072
13703
  Popover,
10073
13704
  PopoverAnchor,
10074
13705
  PopoverContent,
10075
13706
  PopoverTrigger,
13707
+ Progress,
10076
13708
  QuestionArtifactView,
13709
+ RESERVED_GRADIENT_TOKENS,
13710
+ RadioGroup,
13711
+ RadioGroupItem,
10077
13712
  ResourceCard,
13713
+ SEMANTIC_COLOR_TOKENS,
13714
+ SLOP_BUDGETS,
10078
13715
  STUDIO_NAV_MODE,
13716
+ ScrollArea,
13717
+ ScrollBar,
10079
13718
  SearchInput,
10080
13719
  Section,
10081
13720
  Select,
@@ -10088,11 +13727,23 @@ function SelectScrollDownButton({
10088
13727
  SelectSeparator,
10089
13728
  SelectTrigger,
10090
13729
  SelectValue,
13730
+ Separator,
10091
13731
  SessionProvider,
10092
13732
  SettingsSection,
10093
13733
  SettingsSectionHeader,
13734
+ Sheet,
13735
+ SheetClose,
13736
+ SheetContent,
13737
+ SheetDescription,
13738
+ SheetFooter,
13739
+ SheetHeader,
13740
+ SheetTitle,
13741
+ SheetTrigger,
10094
13742
  Shimmer,
13743
+ Skeleton,
13744
+ Slider,
10095
13745
  Sparkline,
13746
+ Spinner,
10096
13747
  StatTile,
10097
13748
  StatusBadge,
10098
13749
  StatusDot,
@@ -10102,10 +13753,21 @@ function SelectScrollDownButton({
10102
13753
  SubNav,
10103
13754
  Suggestions,
10104
13755
  SurfaceCard,
13756
+ Switch,
13757
+ TAILWIND_PALETTE_COLORS,
10105
13758
  THEME_AGENT_INSTRUCTIONS,
10106
13759
  THREAD_DEFAULT_MAX_WIDTH,
10107
13760
  TIMBAL_THEME_PRESETS,
13761
+ Table,
10108
13762
  TableArtifactView,
13763
+ TableBody,
13764
+ TableCaption,
13765
+ TableCell,
13766
+ TableFooter,
13767
+ TableHead,
13768
+ TableHeader,
13769
+ TableRow,
13770
+ Textarea,
10109
13771
  ThemePresetGallery,
10110
13772
  Thread,
10111
13773
  ThreadPrimitive,
@@ -10115,27 +13777,49 @@ function SelectScrollDownButton({
10115
13777
  TimbalRuntimeProvider,
10116
13778
  TimbalStudioShell,
10117
13779
  TimbalThemeStyle,
13780
+ Toast,
13781
+ ToastAction,
13782
+ ToastClose,
13783
+ ToastDescription,
13784
+ ToastProvider,
13785
+ ToastTitle,
13786
+ ToastViewport,
13787
+ Toaster,
13788
+ Toggle,
13789
+ ToggleGroup,
13790
+ ToggleGroupItem,
10118
13791
  ToolArtifactFallback,
10119
13792
  ToolFallback,
13793
+ Toolbar,
13794
+ ToolbarButton,
13795
+ ToolbarLink,
13796
+ ToolbarSeparator,
13797
+ ToolbarToggleGroup,
13798
+ ToolbarToggleItem,
10120
13799
  Tooltip,
10121
13800
  TooltipContent,
10122
13801
  TooltipIconButton,
10123
13802
  TooltipProvider,
10124
13803
  TooltipTrigger,
13804
+ UI_REVIEW_AGENT_INSTRUCTIONS,
10125
13805
  UiArtifactView,
10126
13806
  UiCustomNodeRegistryProvider,
10127
13807
  UiEventProvider,
10128
13808
  UiNodeView,
10129
13809
  WorkforceSelector,
13810
+ alertVariants,
10130
13811
  applyThemePreset,
10131
13812
  applyTimbalTheme,
10132
13813
  assistantMessageContentClass,
10133
13814
  assistantMessageRootClass,
10134
13815
  authFetch,
13816
+ badgeVariants,
10135
13817
  clearTimbalTheme,
10136
13818
  clearTokens,
10137
13819
  cn,
10138
13820
  connectionRowListClass,
13821
+ controlClass,
13822
+ controlSurfaceClass,
10139
13823
  createDefaultAttachmentAdapter,
10140
13824
  createTimbalTheme,
10141
13825
  createUploadAttachmentAdapter,
@@ -10143,6 +13827,8 @@ function SelectScrollDownButton({
10143
13827
  ensureThemeFontLink,
10144
13828
  fetchCurrentUser,
10145
13829
  findMarkdownArtifacts,
13830
+ formatLintReport,
13831
+ formatPickerDate,
10146
13832
  getAccessToken,
10147
13833
  getPath,
10148
13834
  getRefreshToken,
@@ -10151,17 +13837,26 @@ function SelectScrollDownButton({
10151
13837
  isArtifact,
10152
13838
  isArtifactFenceLanguage,
10153
13839
  isUiBinding,
13840
+ lintGeneratedUi,
13841
+ navigationMenuTriggerStyle,
13842
+ overlayAnimationClass,
13843
+ overlayItemClass,
13844
+ overlayListPanelClass,
13845
+ overlaySurfaceClass,
10154
13846
  parseArtifactFromToolResult,
10155
13847
  parseSSELine,
10156
13848
  refreshAccessToken,
10157
13849
  resolveAttachmentAdapter,
10158
13850
  resolveBindable,
13851
+ reviewGeneratedUi,
10159
13852
  setAccessToken,
10160
13853
  setPath,
10161
13854
  setRefreshToken,
10162
13855
  splitMarkdownByArtifacts,
10163
13856
  themeToCss,
10164
13857
  threadMessageColumnClass,
13858
+ toast,
13859
+ toggleVariants,
10165
13860
  useAppCopilotContext,
10166
13861
  useAppShellChat,
10167
13862
  useArtifactRegistry,
@@ -10174,6 +13869,7 @@ function SelectScrollDownButton({
10174
13869
  useThreadRuntime,
10175
13870
  useTimbalRuntime,
10176
13871
  useTimbalStream,
13872
+ useToast,
10177
13873
  useToolRunning,
10178
13874
  useUiCustomNodeRegistry,
10179
13875
  useUiDispatch,