@columenlabs/lumen-ui 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE +12 -0
  3. package/README.md +4 -2
  4. package/dist/add-column.d.ts +23 -0
  5. package/dist/add-column.js +62 -0
  6. package/dist/api-fetch.d.ts +9 -0
  7. package/dist/api-fetch.js +60 -0
  8. package/dist/app-switcher.d.ts +21 -0
  9. package/dist/app-switcher.js +12 -0
  10. package/dist/app-views.d.ts +18 -0
  11. package/dist/app-views.js +41 -0
  12. package/dist/assistant-context.d.ts +72 -0
  13. package/dist/assistant-context.js +30 -0
  14. package/dist/assistant-panel.d.ts +58 -0
  15. package/dist/assistant-panel.js +244 -0
  16. package/dist/assistant-screen.d.ts +124 -0
  17. package/dist/assistant-screen.js +252 -0
  18. package/dist/card-switch.d.ts +16 -0
  19. package/dist/card-switch.js +16 -0
  20. package/dist/color-dot.d.ts +14 -0
  21. package/dist/color-dot.js +19 -0
  22. package/dist/confirm.d.ts +18 -0
  23. package/dist/confirm.js +5 -0
  24. package/dist/connections.d.ts +45 -0
  25. package/dist/connections.js +275 -0
  26. package/dist/coverage-calendar-map.d.ts +27 -0
  27. package/dist/coverage-calendar-map.js +84 -0
  28. package/dist/coverage-cells.d.ts +55 -0
  29. package/dist/coverage-cells.js +85 -0
  30. package/dist/coverage-map.d.ts +112 -0
  31. package/dist/coverage-map.js +428 -0
  32. package/dist/details-table.d.ts +20 -0
  33. package/dist/details-table.js +13 -0
  34. package/dist/drawer-section.d.ts +27 -0
  35. package/dist/drawer-section.js +23 -0
  36. package/dist/floating-head.d.ts +2 -0
  37. package/dist/floating-head.js +57 -0
  38. package/dist/fold.d.ts +16 -0
  39. package/dist/fold.js +70 -0
  40. package/dist/form-issues.d.ts +32 -0
  41. package/dist/form-issues.js +60 -0
  42. package/dist/formula-input.d.ts +17 -0
  43. package/dist/formula-input.js +104 -0
  44. package/dist/frame-script.d.ts +7 -0
  45. package/dist/frame-script.js +103 -0
  46. package/dist/freshness.d.ts +24 -0
  47. package/dist/freshness.js +99 -0
  48. package/dist/group-button.d.ts +33 -0
  49. package/dist/group-button.js +67 -0
  50. package/dist/growth-chart.d.ts +77 -0
  51. package/dist/growth-chart.js +195 -0
  52. package/dist/hooks/use-keyboard-fit.d.ts +15 -0
  53. package/dist/hooks/use-keyboard-fit.js +29 -0
  54. package/dist/hooks/use-mobile.d.ts +1 -0
  55. package/dist/hooks/use-mobile.js +15 -0
  56. package/dist/icon-button.d.ts +21 -0
  57. package/dist/icon-button.js +22 -0
  58. package/dist/icon-picker.d.ts +14 -0
  59. package/dist/icon-picker.js +36 -0
  60. package/dist/index.d.ts +83 -0
  61. package/dist/index.js +90 -0
  62. package/dist/integrations.d.ts +57 -0
  63. package/dist/integrations.js +73 -0
  64. package/dist/joins.d.ts +128 -0
  65. package/dist/joins.js +767 -0
  66. package/dist/kit-config.d.ts +13 -0
  67. package/dist/kit-config.js +15 -0
  68. package/dist/lib/utils.d.ts +2 -0
  69. package/dist/lib/utils.js +5 -0
  70. package/dist/lumen-boundary.d.ts +7 -0
  71. package/dist/lumen-boundary.js +10 -0
  72. package/dist/lumen-code-editor-impl.d.ts +2 -0
  73. package/dist/lumen-code-editor-impl.js +16 -0
  74. package/dist/lumen-code-editor.d.ts +11 -0
  75. package/dist/lumen-code-editor.js +11 -0
  76. package/dist/lumen-code.d.ts +22 -0
  77. package/dist/lumen-code.js +75 -0
  78. package/dist/lumen-drawer.d.ts +30 -0
  79. package/dist/lumen-drawer.js +27 -0
  80. package/dist/lumen-echart.d.ts +58 -0
  81. package/dist/lumen-echart.js +129 -0
  82. package/dist/lumen-filter.d.ts +75 -0
  83. package/dist/lumen-filter.js +546 -0
  84. package/dist/lumen-finder.d.ts +62 -0
  85. package/dist/lumen-finder.js +275 -0
  86. package/dist/lumen-form.d.ts +34 -0
  87. package/dist/lumen-form.js +81 -0
  88. package/dist/lumen-geo-map.d.ts +9 -0
  89. package/dist/lumen-geo-map.js +135 -0
  90. package/dist/lumen-grid.d.ts +49 -0
  91. package/dist/lumen-grid.js +203 -0
  92. package/dist/lumen-layout.d.ts +150 -0
  93. package/dist/lumen-layout.js +658 -0
  94. package/dist/lumen-links.d.ts +96 -0
  95. package/dist/lumen-links.js +213 -0
  96. package/dist/lumen-page-state.d.ts +20 -0
  97. package/dist/lumen-page-state.js +15 -0
  98. package/dist/lumen-selector.d.ts +139 -0
  99. package/dist/lumen-selector.js +308 -0
  100. package/dist/lumen-source.d.ts +137 -0
  101. package/dist/lumen-source.js +327 -0
  102. package/dist/lumen-tab-drawer.d.ts +27 -0
  103. package/dist/lumen-tab-drawer.js +26 -0
  104. package/dist/lumen-tabs.d.ts +21 -0
  105. package/dist/lumen-tabs.js +6 -0
  106. package/dist/lumen-toast.d.ts +11 -0
  107. package/dist/lumen-toast.js +16 -0
  108. package/dist/lumen-trend.d.ts +18 -0
  109. package/dist/lumen-trend.js +157 -0
  110. package/dist/lumen-view-card.d.ts +35 -0
  111. package/dist/lumen-view-card.js +50 -0
  112. package/dist/lumen-view.d.ts +172 -0
  113. package/dist/lumen-view.js +645 -0
  114. package/dist/lumen-widget-charts.d.ts +57 -0
  115. package/dist/lumen-widget-charts.js +69 -0
  116. package/dist/lumen-widget.d.ts +614 -0
  117. package/dist/lumen-widget.js +594 -0
  118. package/dist/market/compare-chart.d.ts +34 -0
  119. package/dist/market/compare-chart.js +292 -0
  120. package/dist/market/indicator-picker.d.ts +29 -0
  121. package/dist/market/indicator-picker.js +125 -0
  122. package/dist/market/indicators.d.ts +63 -0
  123. package/dist/market/indicators.js +314 -0
  124. package/dist/market/live.d.ts +120 -0
  125. package/dist/market/live.js +444 -0
  126. package/dist/market/lumen-chart.d.ts +88 -0
  127. package/dist/market/lumen-chart.js +645 -0
  128. package/dist/market/market-widget.d.ts +45 -0
  129. package/dist/market/market-widget.js +346 -0
  130. package/dist/market/option-chain.d.ts +19 -0
  131. package/dist/market/option-chain.js +53 -0
  132. package/dist/market/price-chart.d.ts +128 -0
  133. package/dist/market/price-chart.js +619 -0
  134. package/dist/mcp-settings.d.ts +20 -0
  135. package/dist/mcp-settings.js +65 -0
  136. package/dist/nav.d.ts +77 -0
  137. package/dist/nav.js +73 -0
  138. package/dist/note-line.d.ts +13 -0
  139. package/dist/note-line.js +5 -0
  140. package/dist/notifications.d.ts +9 -0
  141. package/dist/notifications.js +166 -0
  142. package/dist/origin-legend.d.ts +14 -0
  143. package/dist/origin-legend.js +38 -0
  144. package/dist/overview.d.ts +84 -0
  145. package/dist/overview.js +105 -0
  146. package/dist/page-inputs.d.ts +14 -0
  147. package/dist/page-inputs.js +16 -0
  148. package/dist/page.d.ts +32 -0
  149. package/dist/page.js +45 -0
  150. package/dist/pager.d.ts +10 -0
  151. package/dist/pager.js +14 -0
  152. package/dist/prefs.d.ts +71 -0
  153. package/dist/prefs.js +126 -0
  154. package/dist/query-client.d.ts +7 -0
  155. package/dist/query-client.js +19 -0
  156. package/dist/refresh.d.ts +4 -0
  157. package/dist/refresh.js +19 -0
  158. package/dist/rename-field.d.ts +11 -0
  159. package/dist/rename-field.js +26 -0
  160. package/dist/reset-button.d.ts +9 -0
  161. package/dist/reset-button.js +10 -0
  162. package/dist/route-error.d.ts +42 -0
  163. package/dist/route-error.js +229 -0
  164. package/dist/schedules.d.ts +88 -0
  165. package/dist/schedules.js +221 -0
  166. package/dist/settings.d.ts +51 -0
  167. package/dist/settings.js +181 -0
  168. package/dist/shell.d.ts +99 -0
  169. package/dist/shell.js +137 -0
  170. package/dist/source-health.d.ts +12 -0
  171. package/dist/source-health.js +58 -0
  172. package/dist/spotlight.d.ts +23 -0
  173. package/dist/spotlight.js +138 -0
  174. package/dist/status-health.d.ts +16 -0
  175. package/dist/status-health.js +41 -0
  176. package/dist/status.d.ts +9 -0
  177. package/dist/status.js +12 -0
  178. package/dist/summary-cards.d.ts +56 -0
  179. package/dist/summary-cards.js +270 -0
  180. package/dist/symbol-sheet-context.d.ts +4 -0
  181. package/dist/symbol-sheet-context.js +5 -0
  182. package/dist/symbol-sheet.d.ts +9 -0
  183. package/dist/symbol-sheet.js +24 -0
  184. package/dist/tasks.d.ts +29 -0
  185. package/dist/tasks.js +278 -0
  186. package/dist/theme.css +606 -0
  187. package/dist/tile.d.ts +37 -0
  188. package/dist/tile.js +23 -0
  189. package/dist/ui/alert-dialog.d.ts +18 -0
  190. package/dist/ui/alert-dialog.js +41 -0
  191. package/dist/ui/alert.d.ts +10 -0
  192. package/dist/ui/alert.js +27 -0
  193. package/dist/ui/avatar.d.ts +11 -0
  194. package/dist/ui/avatar.js +22 -0
  195. package/dist/ui/badge.d.ts +9 -0
  196. package/dist/ui/badge.js +27 -0
  197. package/dist/ui/breadcrumb.d.ts +11 -0
  198. package/dist/ui/breadcrumb.js +27 -0
  199. package/dist/ui/button-group.d.ts +11 -0
  200. package/dist/ui/button-group.js +27 -0
  201. package/dist/ui/button.d.ts +10 -0
  202. package/dist/ui/button.js +38 -0
  203. package/dist/ui/card.d.ts +11 -0
  204. package/dist/ui/card.js +24 -0
  205. package/dist/ui/chart.d.ts +44 -0
  206. package/dist/ui/chart.js +117 -0
  207. package/dist/ui/checkbox.d.ts +4 -0
  208. package/dist/ui/checkbox.js +8 -0
  209. package/dist/ui/collapsible.d.ts +5 -0
  210. package/dist/ui/collapsible.js +12 -0
  211. package/dist/ui/combobox.d.ts +24 -0
  212. package/dist/ui/combobox.js +60 -0
  213. package/dist/ui/command.d.ts +18 -0
  214. package/dist/ui/command.js +34 -0
  215. package/dist/ui/dialog.d.ts +23 -0
  216. package/dist/ui/dialog.js +50 -0
  217. package/dist/ui/dropdown-menu.d.ts +29 -0
  218. package/dist/ui/dropdown-menu.js +50 -0
  219. package/dist/ui/emoji-picker.d.ts +6 -0
  220. package/dist/ui/emoji-picker.js +28 -0
  221. package/dist/ui/empty.d.ts +11 -0
  222. package/dist/ui/empty.js +33 -0
  223. package/dist/ui/field.d.ts +24 -0
  224. package/dist/ui/field.js +65 -0
  225. package/dist/ui/hover-card.d.ts +6 -0
  226. package/dist/ui/hover-card.js +13 -0
  227. package/dist/ui/input-group.d.ts +16 -0
  228. package/dist/ui/input-group.js +56 -0
  229. package/dist/ui/input.d.ts +3 -0
  230. package/dist/ui/input.js +6 -0
  231. package/dist/ui/item.d.ts +23 -0
  232. package/dist/ui/item.js +67 -0
  233. package/dist/ui/kbd.d.ts +3 -0
  234. package/dist/ui/kbd.js +9 -0
  235. package/dist/ui/label.d.ts +4 -0
  236. package/dist/ui/label.js +7 -0
  237. package/dist/ui/popover.d.ts +10 -0
  238. package/dist/ui/popover.js +25 -0
  239. package/dist/ui/progress.d.ts +4 -0
  240. package/dist/ui/progress.js +9 -0
  241. package/dist/ui/resizable.d.ts +7 -0
  242. package/dist/ui/resizable.js +13 -0
  243. package/dist/ui/scroll-area.d.ts +5 -0
  244. package/dist/ui/scroll-area.js +10 -0
  245. package/dist/ui/select.d.ts +15 -0
  246. package/dist/ui/select.js +36 -0
  247. package/dist/ui/separator.d.ts +4 -0
  248. package/dist/ui/separator.js +7 -0
  249. package/dist/ui/sheet.d.ts +14 -0
  250. package/dist/ui/sheet.js +54 -0
  251. package/dist/ui/sidebar.d.ts +69 -0
  252. package/dist/ui/sidebar.js +206 -0
  253. package/dist/ui/skeleton.d.ts +2 -0
  254. package/dist/ui/skeleton.js +6 -0
  255. package/dist/ui/slider.d.ts +4 -0
  256. package/dist/ui/slider.js +9 -0
  257. package/dist/ui/sonner.d.ts +3 -0
  258. package/dist/ui/sonner.js +24 -0
  259. package/dist/ui/spinner.d.ts +2 -0
  260. package/dist/ui/spinner.js +7 -0
  261. package/dist/ui/switch.d.ts +6 -0
  262. package/dist/ui/switch.js +7 -0
  263. package/dist/ui/table.d.ts +10 -0
  264. package/dist/ui/table.js +31 -0
  265. package/dist/ui/tabs.d.ts +7 -0
  266. package/dist/ui/tabs.js +22 -0
  267. package/dist/ui/textarea.d.ts +3 -0
  268. package/dist/ui/textarea.js +6 -0
  269. package/dist/ui/toggle-group.d.ts +10 -0
  270. package/dist/ui/toggle-group.js +22 -0
  271. package/dist/ui/toggle.d.ts +9 -0
  272. package/dist/ui/toggle.js +25 -0
  273. package/dist/ui/tooltip.d.ts +7 -0
  274. package/dist/ui/tooltip.js +16 -0
  275. package/dist/view-edit-cell.d.ts +49 -0
  276. package/dist/view-edit-cell.js +198 -0
  277. package/dist/view-editor.d.ts +52 -0
  278. package/dist/view-editor.js +940 -0
  279. package/dist/view-formulas.d.ts +61 -0
  280. package/dist/view-formulas.js +247 -0
  281. package/dist/view-icons.d.ts +20 -0
  282. package/dist/view-icons.js +70 -0
  283. package/dist/view-model.d.ts +390 -0
  284. package/dist/view-model.js +316 -0
  285. package/dist/whats-new.d.ts +3 -0
  286. package/dist/whats-new.js +53 -0
  287. package/dist/widget-controls.d.ts +9 -0
  288. package/dist/widget-controls.js +26 -0
  289. package/dist/widget-settings.d.ts +436 -0
  290. package/dist/widget-settings.js +290 -0
  291. package/dist/widget-thumbs.d.ts +3 -0
  292. package/dist/widget-thumbs.js +29 -0
  293. package/dist/workspace-keys.d.ts +12 -0
  294. package/dist/workspace-keys.js +13 -0
  295. package/dist/workspaces.d.ts +57 -0
  296. package/dist/workspaces.js +473 -0
  297. package/package.json +82 -4
@@ -0,0 +1,206 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from '../lib/utils.js';
3
+ import { cva } from 'class-variance-authority';
4
+ import { Slot } from 'radix-ui';
5
+ import * as React from 'react';
6
+ import { Button } from './button.js';
7
+ import { Input } from './input.js';
8
+ import { Separator } from './separator.js';
9
+ import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle, } from './sheet.js';
10
+ import { Skeleton } from './skeleton.js';
11
+ import { Tooltip, TooltipContent, TooltipTrigger } from './tooltip.js';
12
+ import { useIsMobile } from '../hooks/use-mobile.js';
13
+ import { PanelLeftIcon } from 'lucide-react';
14
+ const SIDEBAR_COOKIE_NAME = 'sidebar_state';
15
+ const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
16
+ const SIDEBAR_WIDTH = 'var(--shell-sidebar-width)';
17
+ const SIDEBAR_WIDTH_MOBILE = '18rem';
18
+ const SIDEBAR_WIDTH_ICON = '3rem';
19
+ const SIDEBAR_KEYBOARD_SHORTCUT = 'b';
20
+ const SidebarContext = React.createContext(null);
21
+ function useSidebar() {
22
+ const context = React.useContext(SidebarContext);
23
+ if (!context) {
24
+ throw new Error('useSidebar must be used within a SidebarProvider.');
25
+ }
26
+ return context;
27
+ }
28
+ function SidebarProvider({ defaultOpen = true, open: openProp, onOpenChange: setOpenProp, className, style, children, ...props }) {
29
+ const isMobile = useIsMobile();
30
+ const [openMobile, setOpenMobile] = React.useState(false);
31
+ // This is the internal state of the sidebar.
32
+ // We use openProp and setOpenProp for control from outside the component.
33
+ const [_open, _setOpen] = React.useState(defaultOpen);
34
+ const open = openProp ?? _open;
35
+ const setOpen = React.useCallback((value) => {
36
+ const openState = typeof value === 'function' ? value(open) : value;
37
+ if (setOpenProp) {
38
+ setOpenProp(openState);
39
+ }
40
+ else {
41
+ _setOpen(openState);
42
+ }
43
+ // This sets the cookie to keep the sidebar state.
44
+ document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;
45
+ }, [setOpenProp, open]);
46
+ // Helper to toggle the sidebar.
47
+ const toggleSidebar = React.useCallback(() => {
48
+ return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open);
49
+ }, [isMobile, setOpen, setOpenMobile]);
50
+ // Adds a keyboard shortcut to toggle the sidebar.
51
+ React.useEffect(() => {
52
+ const handleKeyDown = (event) => {
53
+ if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {
54
+ event.preventDefault();
55
+ toggleSidebar();
56
+ }
57
+ };
58
+ window.addEventListener('keydown', handleKeyDown);
59
+ return () => window.removeEventListener('keydown', handleKeyDown);
60
+ }, [toggleSidebar]);
61
+ // We add a state so that we can do data-state="expanded" or "collapsed".
62
+ // This makes it easier to style the sidebar with Tailwind classes.
63
+ const state = open ? 'expanded' : 'collapsed';
64
+ const contextValue = React.useMemo(() => ({
65
+ state,
66
+ open,
67
+ setOpen,
68
+ isMobile,
69
+ openMobile,
70
+ setOpenMobile,
71
+ toggleSidebar,
72
+ }), [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]);
73
+ return (_jsx(SidebarContext.Provider, { value: contextValue, children: _jsx("div", { "data-slot": "sidebar-wrapper", style: {
74
+ '--sidebar-width': SIDEBAR_WIDTH,
75
+ '--sidebar-width-icon': SIDEBAR_WIDTH_ICON,
76
+ ...style,
77
+ }, className: cn('group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar', className), ...props, children: children }) }));
78
+ }
79
+ function Sidebar({ side = 'left', variant = 'sidebar', collapsible = 'offcanvas', className, children, dir, ...props }) {
80
+ const { isMobile, state, openMobile, setOpenMobile } = useSidebar();
81
+ if (collapsible === 'none') {
82
+ return (_jsx("div", { "data-slot": "sidebar", className: cn('flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground', className), ...props, children: children }));
83
+ }
84
+ if (isMobile) {
85
+ return (_jsxs(_Fragment, { children: [!openMobile && _jsx("div", { hidden: true, children: children }), _jsx(Sheet, { open: openMobile, onOpenChange: setOpenMobile, ...props, children: _jsxs(SheetContent, { dir: dir, "data-sidebar": "sidebar", "data-slot": "sidebar", "data-mobile": "true", className: "w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden", style: {
86
+ '--sidebar-width': SIDEBAR_WIDTH_MOBILE,
87
+ }, side: side, children: [_jsxs(SheetHeader, { className: "sr-only", children: [_jsx(SheetTitle, { children: "Sidebar" }), _jsx(SheetDescription, { children: "Displays the mobile sidebar." })] }), _jsx("div", { className: "flex h-full w-full flex-col", children: children })] }) })] }));
88
+ }
89
+ return (_jsxs("div", { className: "group peer hidden text-sidebar-foreground md:block", "data-state": state, "data-collapsible": state === 'collapsed' ? collapsible : '', "data-variant": variant, "data-side": side, "data-slot": "sidebar", children: [_jsx("div", { "data-slot": "sidebar-gap", className: cn('transition-[width] duration-200 ease-linear relative w-(--sidebar-width) bg-transparent', 'group-data-[collapsible=offcanvas]:w-0', 'group-data-[side=right]:rotate-180', variant === 'floating' || variant === 'inset'
90
+ ? 'group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]'
91
+ : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon)') }), _jsx("div", { "data-slot": "sidebar-container", "data-side": side, className: cn('fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear data-[side=left]:left-0 data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)] data-[side=right]:right-0 data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)] md:flex',
92
+ // Adjust the padding for floating and inset variants.
93
+ variant === 'floating' || variant === 'inset'
94
+ ? 'p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]'
95
+ : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l', className), ...props, children: _jsx("div", { "data-sidebar": "sidebar", "data-slot": "sidebar-inner", className: "bg-sidebar group-data-[variant=floating]:ring-sidebar-border group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1 flex size-full flex-col", children: children }) })] }));
96
+ }
97
+ function SidebarTrigger({ className, onClick, ...props }) {
98
+ const { toggleSidebar } = useSidebar();
99
+ return (_jsxs(Button, { "data-sidebar": "trigger", "data-slot": "sidebar-trigger", variant: "ghost", size: "icon-sm", className: cn(className), onClick: (event) => {
100
+ onClick?.(event);
101
+ toggleSidebar();
102
+ }, ...props, children: [_jsx(PanelLeftIcon, { className: "cn-rtl-flip" }), _jsx("span", { className: "sr-only", children: "Toggle Sidebar" })] }));
103
+ }
104
+ function SidebarRail({ className, ...props }) {
105
+ const { toggleSidebar } = useSidebar();
106
+ return (_jsx("button", { "data-sidebar": "rail", "data-slot": "sidebar-rail", "aria-label": "Toggle Sidebar", tabIndex: -1, onClick: toggleSidebar, title: "Toggle Sidebar", className: cn('hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:start-1/2 after:w-[2px] sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2', 'in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize', '[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize', 'group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar', '[[data-side=left][data-collapsible=offcanvas]_&]:-right-2', '[[data-side=right][data-collapsible=offcanvas]_&]:-left-2', className), ...props }));
107
+ }
108
+ function SidebarInset({ className, ...props }) {
109
+ return (_jsx("main", { "data-slot": "sidebar-inset", className: cn('bg-background md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2 relative flex w-full flex-1 flex-col', className), ...props }));
110
+ }
111
+ function SidebarInput({ className, ...props }) {
112
+ return (_jsx(Input, { "data-slot": "sidebar-input", "data-sidebar": "input", className: cn('bg-background h-8 w-full shadow-none', className), ...props }));
113
+ }
114
+ function SidebarHeader({ className, ...props }) {
115
+ return (_jsx("div", { "data-slot": "sidebar-header", "data-sidebar": "header", className: cn('gap-2 p-2 flex flex-col', className), ...props }));
116
+ }
117
+ function SidebarFooter({ className, ...props }) {
118
+ return (_jsx("div", { "data-slot": "sidebar-footer", "data-sidebar": "footer", className: cn('gap-2 p-2 flex flex-col', className), ...props }));
119
+ }
120
+ function SidebarSeparator({ className, ...props }) {
121
+ return (_jsx(Separator, { "data-slot": "sidebar-separator", "data-sidebar": "separator", className: cn('bg-sidebar-border mx-2 w-auto', className), ...props }));
122
+ }
123
+ function SidebarContent({ className, ...props }) {
124
+ return (_jsx("div", { "data-slot": "sidebar-content", "data-sidebar": "content", className: cn('no-scrollbar gap-0 flex min-h-0 flex-1 flex-col overflow-auto group-data-[collapsible=icon]:overflow-hidden', className), ...props }));
125
+ }
126
+ function SidebarGroup({ className, ...props }) {
127
+ return (_jsx("div", { "data-slot": "sidebar-group", "data-sidebar": "group", className: cn('p-2 relative flex w-full min-w-0 flex-col', className), ...props }));
128
+ }
129
+ function SidebarGroupLabel({ className, asChild = false, ...props }) {
130
+ const Comp = asChild ? Slot.Root : 'div';
131
+ return (_jsx(Comp, { "data-slot": "sidebar-group-label", "data-sidebar": "group-label", className: cn('text-sidebar-foreground ring-sidebar-ring h-8 rounded-md px-2 text-xs font-bold uppercase tracking-wider transition-[margin,opacity] duration-200 ease-linear group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0 focus-visible:ring-1 [&>svg]:size-4 flex shrink-0 items-center outline-hidden [&>svg]:shrink-0', className), ...props }));
132
+ }
133
+ function SidebarGroupAction({ className, asChild = false, ...props }) {
134
+ const Comp = asChild ? Slot.Root : 'button';
135
+ return (_jsx(Comp, { "data-slot": "sidebar-group-action", "data-sidebar": "group-action", className: cn('text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-3.5 right-3 w-5 rounded-md p-0 focus-visible:ring-1 [&>svg]:size-4 flex aspect-square items-center justify-center outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 md:after:hidden [&>svg]:shrink-0', className), ...props }));
136
+ }
137
+ function SidebarGroupContent({ className, ...props }) {
138
+ return (_jsx("div", { "data-slot": "sidebar-group-content", "data-sidebar": "group-content", className: cn(
139
+ // Items sit indented under a section header; not on the icon rail.
140
+ 'text-sm w-full [[data-sidebar=group-label]~&]:pl-2 group-data-[collapsible=icon]:[[data-sidebar=group-label]~&]:pl-0', className), ...props }));
141
+ }
142
+ function SidebarMenu({ className, ...props }) {
143
+ return (_jsx("ul", { "data-slot": "sidebar-menu", "data-sidebar": "menu", className: cn('gap-0 flex w-full min-w-0 flex-col', className), ...props }));
144
+ }
145
+ function SidebarMenuItem({ className, ...props }) {
146
+ return (_jsx("li", { "data-slot": "sidebar-menu-item", "data-sidebar": "menu-item", className: cn('group/menu-item relative', className), ...props }));
147
+ }
148
+ const sidebarMenuButtonVariants = cva('ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground gap-2 rounded-md p-2 text-left text-sm transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! focus-visible:ring-1 data-active:font-medium peer/menu-button group/menu-button flex w-full items-center overflow-hidden outline-hidden disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&_svg]:size-4 [&_svg]:shrink-0 [&>span:last-child]:truncate', {
149
+ variants: {
150
+ variant: {
151
+ default: 'hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',
152
+ outline: 'bg-background hover:bg-sidebar-accent hover:text-sidebar-accent-foreground shadow-[0_0_0_1px_var(--sidebar-border)] hover:shadow-[0_0_0_1px_var(--sidebar-accent)]',
153
+ },
154
+ size: {
155
+ default: 'h-8 text-sm',
156
+ sm: 'h-7 text-xs',
157
+ lg: 'h-12 text-sm group-data-[collapsible=icon]:p-0!',
158
+ },
159
+ },
160
+ defaultVariants: {
161
+ variant: 'default',
162
+ size: 'default',
163
+ },
164
+ });
165
+ function SidebarMenuButton({ asChild = false, isActive = false, variant = 'default', size = 'default', tooltip, className, ...props }) {
166
+ const Comp = asChild ? Slot.Root : 'button';
167
+ const { isMobile, state } = useSidebar();
168
+ const button = (_jsx(Comp, { "data-slot": "sidebar-menu-button", "data-sidebar": "menu-button", "data-size": size, "data-active": isActive, className: cn(sidebarMenuButtonVariants({ variant, size }), className), ...props }));
169
+ if (!tooltip) {
170
+ return button;
171
+ }
172
+ if (typeof tooltip === 'string') {
173
+ tooltip = {
174
+ children: tooltip,
175
+ };
176
+ }
177
+ return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: button }), _jsx(TooltipContent, { side: "right", align: "center", hidden: state !== 'collapsed' || isMobile, ...tooltip })] }));
178
+ }
179
+ function SidebarMenuAction({ className, asChild = false, showOnHover = false, ...props }) {
180
+ const Comp = asChild ? Slot.Root : 'button';
181
+ return (_jsx(Comp, { "data-slot": "sidebar-menu-action", "data-sidebar": "menu-action", className: cn('text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 right-1 aspect-square w-5 rounded-md p-0 peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 focus-visible:ring-1 [&>svg]:size-4 flex items-center justify-center outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 md:after:hidden [&>svg]:shrink-0', showOnHover &&
182
+ 'group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-active/menu-button:text-sidebar-accent-foreground aria-expanded:opacity-100 md:opacity-0', className), ...props }));
183
+ }
184
+ function SidebarMenuBadge({ className, ...props }) {
185
+ return (_jsx("div", { "data-slot": "sidebar-menu-badge", "data-sidebar": "menu-badge", className: cn('text-sidebar-foreground peer-hover/menu-button:text-sidebar-accent-foreground peer-data-active/menu-button:text-sidebar-accent-foreground pointer-events-none absolute right-1 h-5 min-w-5 rounded-md px-1 text-xs font-medium peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 flex items-center justify-center tabular-nums select-none group-data-[collapsible=icon]:hidden', className), ...props }));
186
+ }
187
+ function SidebarMenuSkeleton({ className, showIcon = false, ...props }) {
188
+ // Random width between 50 to 90%.
189
+ const [width] = React.useState(() => {
190
+ return `${Math.floor(Math.random() * 40) + 50}%`;
191
+ });
192
+ return (_jsxs("div", { "data-slot": "sidebar-menu-skeleton", "data-sidebar": "menu-skeleton", className: cn('h-8 gap-2 rounded-md px-2 flex items-center', className), ...props, children: [showIcon && _jsx(Skeleton, { className: "size-4 rounded-md", "data-sidebar": "menu-skeleton-icon" }), _jsx(Skeleton, { className: "h-4 max-w-(--skeleton-width) flex-1", "data-sidebar": "menu-skeleton-text", style: {
193
+ '--skeleton-width': width,
194
+ } })] }));
195
+ }
196
+ function SidebarMenuSub({ className, ...props }) {
197
+ return (_jsx("ul", { "data-slot": "sidebar-menu-sub", "data-sidebar": "menu-sub", className: cn('border-sidebar-border mx-3.5 translate-x-px gap-1 border-l px-2.5 py-0.5 group-data-[collapsible=icon]:hidden flex min-w-0 flex-col', className), ...props }));
198
+ }
199
+ function SidebarMenuSubItem({ className, ...props }) {
200
+ return (_jsx("li", { "data-slot": "sidebar-menu-sub-item", "data-sidebar": "menu-sub-item", className: cn('group/menu-sub-item relative', className), ...props }));
201
+ }
202
+ function SidebarMenuSubButton({ asChild = false, size = 'md', isActive = false, className, ...props }) {
203
+ const Comp = asChild ? Slot.Root : 'a';
204
+ return (_jsx(Comp, { "data-slot": "sidebar-menu-sub-button", "data-sidebar": "menu-sub-button", "data-size": size, "data-active": isActive, className: cn('text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground h-7 gap-2 rounded-md px-2 focus-visible:ring-1 data-[size=md]:text-sm data-[size=sm]:text-xs [&>svg]:size-4 flex min-w-0 -translate-x-px items-center overflow-hidden outline-hidden group-data-[collapsible=icon]:hidden disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:shrink-0', className), ...props }));
205
+ }
206
+ export { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, useSidebar, };
@@ -0,0 +1,2 @@
1
+ declare function Skeleton({ className, ...props }: React.ComponentProps<'div'>): import("react").JSX.Element;
2
+ export { Skeleton };
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from '../lib/utils.js';
3
+ function Skeleton({ className, ...props }) {
4
+ return (_jsx("div", { "data-slot": "skeleton", className: cn('bg-muted rounded-md animate-pulse', className), ...props }));
5
+ }
6
+ export { Skeleton };
@@ -0,0 +1,4 @@
1
+ import { Slider as SliderPrimitive } from 'radix-ui';
2
+ import * as React from 'react';
3
+ declare function Slider({ className, defaultValue, value, min, max, ...props }: React.ComponentProps<typeof SliderPrimitive.Root>): React.JSX.Element;
4
+ export { Slider };
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from '../lib/utils.js';
3
+ import { Slider as SliderPrimitive } from 'radix-ui';
4
+ import * as React from 'react';
5
+ function Slider({ className, defaultValue, value, min = 0, max = 100, ...props }) {
6
+ const _values = React.useMemo(() => (Array.isArray(value) ? value : Array.isArray(defaultValue) ? defaultValue : [min, max]), [value, defaultValue, min, max]);
7
+ return (_jsxs(SliderPrimitive.Root, { "data-slot": "slider", defaultValue: defaultValue, value: value, min: min, max: max, className: cn('data-vertical:min-h-40 relative flex w-full touch-none items-center select-none data-disabled:opacity-50 data-vertical:h-full data-vertical:w-auto data-vertical:flex-col', className), ...props, children: [_jsx(SliderPrimitive.Track, { "data-slot": "slider-track", className: "bg-muted rounded-full data-horizontal:h-1 data-vertical:w-1 relative grow overflow-hidden data-horizontal:w-full data-vertical:h-full", children: _jsx(SliderPrimitive.Range, { "data-slot": "slider-range", className: "bg-primary absolute select-none data-horizontal:h-full data-vertical:w-full" }) }), Array.from({ length: _values.length }, (_, index) => (_jsx(SliderPrimitive.Thumb, { "data-slot": "slider-thumb", className: "border-ring ring-ring/50 relative size-3 rounded-full border bg-white transition-[color,box-shadow] after:absolute after:-inset-2 hover:ring-3 focus-visible:ring-3 focus-visible:outline-hidden active:ring-3 block shrink-0 select-none disabled:pointer-events-none disabled:opacity-50" }, index)))] }));
8
+ }
9
+ export { Slider };
@@ -0,0 +1,3 @@
1
+ import { type ToasterProps } from 'sonner';
2
+ declare const Toaster: ({ ...props }: ToasterProps) => import("react").JSX.Element;
3
+ export { Toaster };
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { resolvedTheme, usePrefs } from '../prefs.js';
3
+ import { CircleCheckIcon, InfoIcon, Loader2Icon, OctagonXIcon, TriangleAlertIcon, } from 'lucide-react';
4
+ import { Toaster as Sonner } from 'sonner';
5
+ const Toaster = ({ ...props }) => {
6
+ const theme = resolvedTheme(usePrefs());
7
+ return (_jsx(Sonner, { theme: theme, className: "toaster group", icons: {
8
+ success: _jsx(CircleCheckIcon, { className: "size-4" }),
9
+ info: _jsx(InfoIcon, { className: "size-4" }),
10
+ warning: _jsx(TriangleAlertIcon, { className: "size-4" }),
11
+ error: _jsx(OctagonXIcon, { className: "size-4" }),
12
+ loading: _jsx(Loader2Icon, { className: "size-4 animate-spin" }),
13
+ }, style: {
14
+ '--normal-bg': 'var(--popover)',
15
+ '--normal-text': 'var(--popover-foreground)',
16
+ '--normal-border': 'var(--border)',
17
+ '--border-radius': 'var(--radius)',
18
+ }, toastOptions: {
19
+ classNames: {
20
+ toast: 'cn-toast',
21
+ },
22
+ }, ...props }));
23
+ };
24
+ export { Toaster };
@@ -0,0 +1,2 @@
1
+ declare function Spinner({ className, ...props }: React.ComponentProps<'svg'>): import("react").JSX.Element;
2
+ export { Spinner };
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from '../lib/utils.js';
3
+ import { Loader2Icon } from 'lucide-react';
4
+ function Spinner({ className, ...props }) {
5
+ return (_jsx(Loader2Icon, { "data-slot": "spinner", role: "status", "aria-label": "Loading", className: cn('size-4 animate-spin', className), ...props }));
6
+ }
7
+ export { Spinner };
@@ -0,0 +1,6 @@
1
+ import { Switch as SwitchPrimitive } from 'radix-ui';
2
+ import type * as React from 'react';
3
+ declare function Switch({ className, size, ...props }: React.ComponentProps<typeof SwitchPrimitive.Root> & {
4
+ size?: 'sm' | 'default';
5
+ }): React.JSX.Element;
6
+ export { Switch };
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from '../lib/utils.js';
3
+ import { Switch as SwitchPrimitive } from 'radix-ui';
4
+ function Switch({ className, size = 'default', ...props }) {
5
+ return (_jsx(SwitchPrimitive.Root, { "data-slot": "switch", "data-size": size, className: cn('data-checked:bg-primary data-unchecked:bg-input focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 dark:data-unchecked:bg-input/80 shrink-0 rounded-full border border-transparent focus-visible:ring-3 aria-invalid:ring-3 group-has-[:focus-visible]/field-label:ring-0 group-has-[:focus-visible]/field-label:border-transparent data-[size=default]:h-[18.4px] data-[size=default]:w-[32px] data-[size=sm]:h-[14px] data-[size=sm]:w-[24px] peer group/switch relative inline-flex items-center transition-all outline-none after:absolute after:-inset-x-3 after:-inset-y-2 data-disabled:cursor-not-allowed data-disabled:opacity-50', className), ...props, children: _jsx(SwitchPrimitive.Thumb, { "data-slot": "switch-thumb", className: "bg-background dark:data-unchecked:bg-foreground dark:data-checked:bg-primary-foreground rounded-full group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-unchecked:translate-x-0 pointer-events-none block ring-0 transition-transform" }) }));
6
+ }
7
+ export { Switch };
@@ -0,0 +1,10 @@
1
+ import type * as React from 'react';
2
+ declare function Table({ className, ...props }: React.ComponentProps<'table'>): React.JSX.Element;
3
+ declare function TableHeader({ className, ...props }: React.ComponentProps<'thead'>): React.JSX.Element;
4
+ declare function TableBody({ className, ...props }: React.ComponentProps<'tbody'>): React.JSX.Element;
5
+ declare function TableFooter({ className, ...props }: React.ComponentProps<'tfoot'>): React.JSX.Element;
6
+ declare function TableRow({ className, ...props }: React.ComponentProps<'tr'>): React.JSX.Element;
7
+ declare function TableHead({ className, ...props }: React.ComponentProps<'th'>): React.JSX.Element;
8
+ declare function TableCell({ className, ...props }: React.ComponentProps<'td'>): React.JSX.Element;
9
+ declare function TableCaption({ className, ...props }: React.ComponentProps<'caption'>): React.JSX.Element;
10
+ export { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption };
@@ -0,0 +1,31 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from '../lib/utils.js';
3
+ // A table scrolls sideways only when it is wider than its box, and never up and down: the page
4
+ // scrolls straight through it. The last column clips sideways so a control's invisible hit area
5
+ // (a switch's, 12px each side) can't stick out past the edge and make a few pixels of sideways
6
+ // scroll that catches the trackpad.
7
+ function Table({ className, ...props }) {
8
+ return (_jsx("div", { "data-slot": "table-container", className: "relative w-full overflow-x-auto overflow-y-hidden", children: _jsx("table", { "data-slot": "table", className: cn('w-full caption-bottom text-sm', className), ...props }) }));
9
+ }
10
+ function TableHeader({ className, ...props }) {
11
+ return _jsx("thead", { "data-slot": "table-header", className: cn('[&_tr]:border-b', className), ...props });
12
+ }
13
+ function TableBody({ className, ...props }) {
14
+ return (_jsx("tbody", { "data-slot": "table-body", className: cn('[&_tr:last-child]:border-0', className), ...props }));
15
+ }
16
+ function TableFooter({ className, ...props }) {
17
+ return (_jsx("tfoot", { "data-slot": "table-footer", className: cn('border-t bg-muted/50 font-medium [&>tr]:last:border-b-0', className), ...props }));
18
+ }
19
+ function TableRow({ className, ...props }) {
20
+ return (_jsx("tr", { "data-slot": "table-row", className: cn('border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted', className), ...props }));
21
+ }
22
+ function TableHead({ className, ...props }) {
23
+ return (_jsx("th", { "data-slot": "table-head", className: cn('h-(--row-h) px-(--cell-x) text-left align-middle font-medium whitespace-nowrap text-foreground last:overflow-x-clip [&:has([role=checkbox])]:pr-0', className), ...props }));
24
+ }
25
+ function TableCell({ className, ...props }) {
26
+ return (_jsx("td", { "data-slot": "table-cell", className: cn('px-(--cell-x) py-(--cell-y) align-middle whitespace-nowrap last:overflow-x-clip [&:has([role=checkbox])]:pr-0', className), ...props }));
27
+ }
28
+ function TableCaption({ className, ...props }) {
29
+ return (_jsx("caption", { "data-slot": "table-caption", className: cn('mt-4 text-sm text-muted-foreground', className), ...props }));
30
+ }
31
+ export { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption };
@@ -0,0 +1,7 @@
1
+ import { Tabs as TabsPrimitive } from 'radix-ui';
2
+ import type * as React from 'react';
3
+ declare function Tabs({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Root>): React.JSX.Element;
4
+ declare function TabsList({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.List>): React.JSX.Element;
5
+ declare function TabsTrigger({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Trigger>): React.JSX.Element;
6
+ declare function TabsContent({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Content>): React.JSX.Element;
7
+ export { Tabs, TabsList, TabsTrigger, TabsContent };
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from '../lib/utils.js';
3
+ import { Tabs as TabsPrimitive } from 'radix-ui';
4
+ // One tab look on every desk: the open tab is underlined in the desk colour, so
5
+ // tabs read as navigation and the segmented ToggleGroups under them stay controls. No hairline across
6
+ // the row (option A): it cut across glass's wash and stopped short of the row's
7
+ // actions. Many tabs scroll sideways on a phone. Compact: little
8
+ // padding above and below, so a tab row costs one line and its text sits the gutter below the
9
+ // header, as the page sits from the sidebar ("too much space").
10
+ function Tabs({ className, ...props }) {
11
+ return (_jsx(TabsPrimitive.Root, { "data-slot": "tabs", className: cn('flex flex-col gap-2', className), ...props }));
12
+ }
13
+ function TabsList({ className, ...props }) {
14
+ return (_jsx(TabsPrimitive.List, { "data-slot": "tabs-list", className: cn('inline-flex w-full items-center justify-start gap-6 overflow-x-auto overflow-y-hidden text-muted-foreground [scrollbar-width:none]', className), ...props }));
15
+ }
16
+ function TabsTrigger({ className, ...props }) {
17
+ return (_jsx(TabsPrimitive.Trigger, { "data-slot": "tabs-trigger", className: cn("relative inline-flex shrink-0 items-center gap-1.5 px-0 pt-0 pb-2 after:absolute after:inset-x-0 after:bottom-0 after:h-0.5 after:rounded-full after:bg-transparent text-sm leading-4 font-medium whitespace-nowrap text-muted-foreground transition-colors outline-none hover:text-foreground focus-visible:rounded-sm focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:text-foreground data-[state=active]:after:bg-primary data-[state=active]:[&_svg]:text-primary [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), ...props }));
18
+ }
19
+ function TabsContent({ className, ...props }) {
20
+ return (_jsx(TabsPrimitive.Content, { "data-slot": "tabs-content", className: cn('flex-1 outline-none', className), ...props }));
21
+ }
22
+ export { Tabs, TabsList, TabsTrigger, TabsContent };
@@ -0,0 +1,3 @@
1
+ import type * as React from 'react';
2
+ declare function Textarea({ className, ...props }: React.ComponentProps<'textarea'>): React.JSX.Element;
3
+ export { Textarea };
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from '../lib/utils.js';
3
+ function Textarea({ className, ...props }) {
4
+ return (_jsx("textarea", { "data-slot": "textarea", className: cn('border-input dark:bg-input/30 focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 disabled:bg-input/50 dark:disabled:bg-input/80 rounded-lg border bg-transparent px-2.5 py-2 text-base transition-colors focus-visible:ring-0 aria-invalid:ring-3 md:text-sm flex field-sizing-content min-h-16 w-full outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50', className), ...props }));
5
+ }
6
+ export { Textarea };
@@ -0,0 +1,10 @@
1
+ import type { VariantProps } from 'class-variance-authority';
2
+ import { ToggleGroup as ToggleGroupPrimitive } from 'radix-ui';
3
+ import * as React from 'react';
4
+ import { toggleVariants } from './toggle.js';
5
+ declare function ToggleGroup({ className, variant, size, spacing, orientation, children, ...props }: React.ComponentProps<typeof ToggleGroupPrimitive.Root> & VariantProps<typeof toggleVariants> & {
6
+ spacing?: number;
7
+ orientation?: 'horizontal' | 'vertical';
8
+ }): React.JSX.Element;
9
+ declare function ToggleGroupItem({ className, children, variant, size, ...props }: React.ComponentProps<typeof ToggleGroupPrimitive.Item> & VariantProps<typeof toggleVariants>): React.JSX.Element;
10
+ export { ToggleGroup, ToggleGroupItem };
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from '../lib/utils.js';
3
+ import { ToggleGroup as ToggleGroupPrimitive } from 'radix-ui';
4
+ import * as React from 'react';
5
+ import { toggleVariants } from './toggle.js';
6
+ const ToggleGroupContext = React.createContext({
7
+ size: 'default',
8
+ variant: 'default',
9
+ spacing: 2,
10
+ orientation: 'horizontal',
11
+ });
12
+ function ToggleGroup({ className, variant, size, spacing = 2, orientation = 'horizontal', children, ...props }) {
13
+ return (_jsx(ToggleGroupPrimitive.Root, { "data-slot": "toggle-group", "data-variant": variant, "data-size": size, "data-spacing": spacing, "data-orientation": orientation, style: { '--gap': spacing }, className: cn('rounded-lg data-[size=sm]:rounded-[min(var(--radius-md),10px)] group/toggle-group flex w-fit flex-row items-center gap-[--spacing(var(--gap))] data-vertical:flex-col data-vertical:items-stretch', className), ...props, children: _jsx(ToggleGroupContext.Provider, { value: { variant, size, spacing, orientation }, children: children }) }));
14
+ }
15
+ function ToggleGroupItem({ className, children, variant = 'default', size = 'default', ...props }) {
16
+ const context = React.useContext(ToggleGroupContext);
17
+ return (_jsx(ToggleGroupPrimitive.Item, { "data-slot": "toggle-group-item", "data-variant": context.variant || variant, "data-size": context.size || size, "data-spacing": context.spacing, className: cn('group-data-[spacing=0]/toggle-group:rounded-none group-data-[spacing=0]/toggle-group:px-2 group-data-[spacing=0]/toggle-group:has-data-[icon=inline-end]:pr-1.5 group-data-[spacing=0]/toggle-group:has-data-[icon=inline-start]:pl-1.5 group-data-horizontal/toggle-group:data-[spacing=0]:first:rounded-l-lg group-data-vertical/toggle-group:data-[spacing=0]:first:rounded-t-lg group-data-horizontal/toggle-group:data-[spacing=0]:last:rounded-r-lg group-data-vertical/toggle-group:data-[spacing=0]:last:rounded-b-lg shrink-0 focus:z-10 focus-visible:z-10 group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:border-l-0 group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:border-t-0 group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-l group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-t', toggleVariants({
18
+ variant: context.variant || variant,
19
+ size: context.size || size,
20
+ }), className), ...props, children: children }));
21
+ }
22
+ export { ToggleGroup, ToggleGroupItem };
@@ -0,0 +1,9 @@
1
+ import { type VariantProps } from 'class-variance-authority';
2
+ import { Toggle as TogglePrimitive } from 'radix-ui';
3
+ import type * as React from 'react';
4
+ declare const toggleVariants: (props?: ({
5
+ variant?: "default" | "outline" | null | undefined;
6
+ size?: "default" | "lg" | "sm" | null | undefined;
7
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
8
+ declare function Toggle({ className, variant, size, ...props }: React.ComponentProps<typeof TogglePrimitive.Root> & VariantProps<typeof toggleVariants>): React.JSX.Element;
9
+ export { Toggle, toggleVariants };
@@ -0,0 +1,25 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from '../lib/utils.js';
3
+ import { cva } from 'class-variance-authority';
4
+ import { Toggle as TogglePrimitive } from 'radix-ui';
5
+ const toggleVariants = cva("hover:text-foreground aria-pressed:bg-muted aria-checked:bg-muted focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive data-[state=on]:bg-muted gap-1 rounded-lg text-sm font-medium transition-all [&_svg:not([class*='size-'])]:size-4 group/toggle inline-flex items-center justify-center whitespace-nowrap outline-none hover:bg-muted focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0", {
6
+ variants: {
7
+ variant: {
8
+ default: 'bg-transparent',
9
+ outline: 'border-input hover:bg-muted border bg-transparent',
10
+ },
11
+ size: {
12
+ default: 'h-8 min-w-8 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2',
13
+ sm: "h-7 min-w-7 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
14
+ lg: 'h-9 min-w-9 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2',
15
+ },
16
+ },
17
+ defaultVariants: {
18
+ variant: 'default',
19
+ size: 'default',
20
+ },
21
+ });
22
+ function Toggle({ className, variant = 'default', size = 'default', ...props }) {
23
+ return (_jsx(TogglePrimitive.Root, { "data-slot": "toggle", className: cn(toggleVariants({ variant, size, className })), ...props }));
24
+ }
25
+ export { Toggle, toggleVariants };
@@ -0,0 +1,7 @@
1
+ import { Tooltip as TooltipPrimitive } from 'radix-ui';
2
+ import type * as React from 'react';
3
+ declare function TooltipProvider({ delayDuration, ...props }: React.ComponentProps<typeof TooltipPrimitive.Provider>): React.JSX.Element;
4
+ declare function Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>): React.JSX.Element;
5
+ declare function TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>): React.JSX.Element;
6
+ declare function TooltipContent({ className, sideOffset, children, ...props }: React.ComponentProps<typeof TooltipPrimitive.Content>): React.JSX.Element;
7
+ export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from '../lib/utils.js';
3
+ import { Tooltip as TooltipPrimitive } from 'radix-ui';
4
+ function TooltipProvider({ delayDuration = 0, ...props }) {
5
+ return (_jsx(TooltipPrimitive.Provider, { "data-slot": "tooltip-provider", delayDuration: delayDuration, ...props }));
6
+ }
7
+ function Tooltip({ ...props }) {
8
+ return _jsx(TooltipPrimitive.Root, { "data-slot": "tooltip", ...props });
9
+ }
10
+ function TooltipTrigger({ ...props }) {
11
+ return _jsx(TooltipPrimitive.Trigger, { "data-slot": "tooltip-trigger", ...props });
12
+ }
13
+ function TooltipContent({ className, sideOffset = 0, children, ...props }) {
14
+ return (_jsx(TooltipPrimitive.Portal, { children: _jsxs(TooltipPrimitive.Content, { "data-slot": "tooltip-content", sideOffset: sideOffset, className: cn('data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-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 inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs has-data-[slot=kbd]:pr-1.5 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm z-50 w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) border bg-popover text-popover-foreground shadow-md', className), ...props, children: [children, _jsx(TooltipPrimitive.Arrow, { className: "size-2.5 rotate-45 rounded-[2px] z-50 translate-y-[calc(-50%_-_2px)] border-r border-b bg-popover fill-popover" })] }) }));
15
+ }
16
+ export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };
@@ -0,0 +1,49 @@
1
+ import { type ReactNode } from 'react';
2
+ export declare function EditCell({ label, value, options, unused, chip, note, colorOf, fixed, edited, onSave, }: {
3
+ /** The field's name, e.g. `Basket`. */
4
+ label: string;
5
+ value: string | null;
6
+ /** Values already in use, offered first. */
7
+ options: string[];
8
+ /** Values that exist but no row has, offered after. */
9
+ unused?: string[];
10
+ chip?: boolean;
11
+ /** One line under the input saying what the edit covers, e.g. `every SPY holding`. */
12
+ note?: string;
13
+ /** A value's colour dot (the field's `color`). */
14
+ colorOf?: (value: string) => string | undefined;
15
+ /** Only `options` and `unused` may be picked; nothing typed is taken. */
16
+ fixed?: boolean;
17
+ /** Changed by hand from what it was: a small ✎ marks it. */
18
+ edited?: boolean;
19
+ onSave: (value: string | null) => Promise<unknown>;
20
+ }): import("react").JSX.Element;
21
+ /**
22
+ * A cell of several values (labels): each shows as a chip with its colour;
23
+ * a tap opens a picker that ticks any number and takes a typed name, and closing it saves them all
24
+ * at once. Clicks stay off the row, which opens its details.
25
+ */
26
+ export declare function EditManyCell({ label, values, options, unused, note, colorOf, onSave, }: {
27
+ label: string;
28
+ values: string[];
29
+ options: string[];
30
+ unused?: string[];
31
+ note?: string;
32
+ colorOf?: (value: string) => string | undefined;
33
+ onSave: (values: string[]) => Promise<unknown>;
34
+ }): import("react").JSX.Element;
35
+ /**
36
+ * A cell typed in place (Edits in place), as in a sheet: a click or tap turns
37
+ * the value into a box, Enter saves, Esc leaves it, Tab saves and moves to the next editable cell
38
+ * on the row, and so does clicking away. A cell the person typed carries a small ✎.
39
+ */
40
+ export declare function EditInputCell({ label, value, type, edited, children, onSave, }: {
41
+ label: string;
42
+ /** The raw value, for the box. */
43
+ value: string | number | null;
44
+ type: 'number' | 'text';
45
+ edited?: boolean;
46
+ /** The value as the table draws it. */
47
+ children: ReactNode;
48
+ onSave: (value: string | null) => Promise<unknown>;
49
+ }): import("react").JSX.Element;