gridsmith-ui 0.3.5 → 0.6.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 (65) hide show
  1. package/README.md +63 -3
  2. package/dist/charts.d.ts +246 -0
  3. package/dist/charts.js +1028 -0
  4. package/dist/charts.js.map +1 -0
  5. package/dist/chunk-4SDKQDYV.js +93 -0
  6. package/dist/chunk-4SDKQDYV.js.map +1 -0
  7. package/dist/chunk-CHNY75QI.js +278 -0
  8. package/dist/chunk-CHNY75QI.js.map +1 -0
  9. package/dist/chunk-DPF6776I.js +36 -0
  10. package/dist/chunk-DPF6776I.js.map +1 -0
  11. package/dist/{chunk-5XIPPVH7.js → chunk-IUBWNDUK.js} +15 -4
  12. package/dist/chunk-IUBWNDUK.js.map +1 -0
  13. package/dist/chunk-OUYJXVLQ.js +41 -0
  14. package/dist/chunk-OUYJXVLQ.js.map +1 -0
  15. package/dist/chunk-XUBVMRIE.js +149 -0
  16. package/dist/chunk-XUBVMRIE.js.map +1 -0
  17. package/dist/data-grid.d.ts +27 -0
  18. package/dist/data-grid.js +293 -0
  19. package/dist/data-grid.js.map +1 -0
  20. package/dist/editor.d.ts +18 -0
  21. package/dist/editor.js +632 -0
  22. package/dist/editor.js.map +1 -0
  23. package/dist/feather-V32UNIQL.js +71 -0
  24. package/dist/feather-V32UNIQL.js.map +1 -0
  25. package/dist/heroicons-CA5OQ76O.js +71 -0
  26. package/dist/heroicons-CA5OQ76O.js.map +1 -0
  27. package/dist/icons.d.ts +9 -1
  28. package/dist/icons.js +1 -2
  29. package/dist/index.d.ts +430 -133
  30. package/dist/index.js +10510 -98031
  31. package/dist/index.js.map +1 -1
  32. package/dist/kanban.d.ts +25 -0
  33. package/dist/kanban.js +224 -0
  34. package/dist/kanban.js.map +1 -0
  35. package/dist/lucide-AILUUOAJ.js +71 -0
  36. package/dist/lucide-AILUUOAJ.js.map +1 -0
  37. package/dist/phosphor-A4JOBGMT.js +71 -0
  38. package/dist/phosphor-A4JOBGMT.js.map +1 -0
  39. package/dist/resizable.d.ts +39 -0
  40. package/dist/resizable.js +89 -0
  41. package/dist/resizable.js.map +1 -0
  42. package/dist/roots.css +46 -11
  43. package/dist/tabler-TVOR6AFM.js +71 -0
  44. package/dist/tabler-TVOR6AFM.js.map +1 -0
  45. package/dist/use-breakpoint-Cn51IubK.d.ts +30 -0
  46. package/dist/utils.js +1 -2
  47. package/dist/virtualized.d.ts +16 -0
  48. package/dist/virtualized.js +55 -0
  49. package/dist/virtualized.js.map +1 -0
  50. package/package.json +144 -4
  51. package/dist/chunk-5WRI5ZAA.js +0 -29
  52. package/dist/chunk-5WRI5ZAA.js.map +0 -1
  53. package/dist/chunk-5XIPPVH7.js.map +0 -1
  54. package/dist/chunk-WVB3SRXW.js +0 -82
  55. package/dist/chunk-WVB3SRXW.js.map +0 -1
  56. package/dist/feather-N37QZ7LA.js +0 -72
  57. package/dist/feather-N37QZ7LA.js.map +0 -1
  58. package/dist/heroicons-HJTKMLIJ.js +0 -72
  59. package/dist/heroicons-HJTKMLIJ.js.map +0 -1
  60. package/dist/lucide-6TGT4G26.js +0 -67
  61. package/dist/lucide-6TGT4G26.js.map +0 -1
  62. package/dist/phosphor-BWDP4PU7.js +0 -72
  63. package/dist/phosphor-BWDP4PU7.js.map +0 -1
  64. package/dist/tabler-6TPNTLFV.js +0 -72
  65. package/dist/tabler-6TPNTLFV.js.map +0 -1
package/dist/roots.css CHANGED
@@ -52,7 +52,7 @@
52
52
  --ds-ambient-hover-ease: cubic-bezier(0.33, 1, 0.68, 1);
53
53
 
54
54
  --ds-sidebar-width: 224px;
55
- --ds-sidebar-compact-width: 72px;
55
+ --ds-sidebar-compact-width: 76px;
56
56
  --ds-sidebar-collapsed-width: 56px;
57
57
  --ds-navbar-height: 48px;
58
58
  --ds-navbar-height-compact: 40px;
@@ -195,11 +195,27 @@
195
195
  --ds-touch-target-min: 44px;
196
196
 
197
197
  /* ── L1: Z-Index Scale ─────────────────────────────────────────── */
198
-
199
- --ds-z-dropdown: 100;
198
+ /*
199
+ * Stacking order (low → high). Floating layers attached to a control
200
+ * (dropdowns, menus, pickers, popovers, hover cards) sit ABOVE modals
201
+ * because they are routinely opened from inside a Dialog or Drawer.
202
+ *
203
+ * sticky 200 navbars, sticky page headers, page-top alerts
204
+ * overlay 300 scrims / backdrops behind drawers and sheets
205
+ * modal 400 Dialog, Drawer, Sheet, CommandPalette
206
+ * popover 450 Dropdown, DropdownMenu, Combobox, Popover, ContextMenu,
207
+ * HoverCard, DatePicker/DateRangePicker/TimePicker panels,
208
+ * NavMenu, SidebarNav flyouts, editor menus
209
+ * tooltip 500 Tooltip (must show above an open popover)
210
+ * toast 600 Toast / ToastProvider stack
211
+ *
212
+ * --ds-z-dropdown is kept as an alias of popover for existing consumers.
213
+ */
200
214
  --ds-z-sticky: 200;
201
215
  --ds-z-overlay: 300;
202
216
  --ds-z-modal: 400;
217
+ --ds-z-popover: 450;
218
+ --ds-z-dropdown: var(--ds-z-popover);
203
219
  --ds-z-tooltip: 500;
204
220
  --ds-z-toast: 600;
205
221
 
@@ -264,13 +280,32 @@
264
280
  --ds-accent-primary: var(--ds-primary-500);
265
281
  --ds-accent-primary-hover: var(--ds-primary-600);
266
282
  --ds-accent-primary-active: var(--ds-primary-700);
267
- --ds-accent-subtle: color-mix(in oklch, var(--ds-accent-primary) 10%, transparent);
268
-
269
- /* Data-visualisation fills the sanctioned way to use the accent ramp
270
- as a fill. "Never accent as solid background" applies to interactive
271
- surfaces; chart bars, area fills, and legend swatches use these. */
272
- --ds-chart-fill: var(--ds-accent-primary);
273
- --ds-chart-fill-soft: color-mix(in oklch, var(--ds-accent-primary) 30%, transparent);
283
+ --ds-accent-whisper: color-mix(in srgb, var(--ds-accent-primary) 5%, transparent);
284
+ --ds-accent-subtle: color-mix(in srgb, var(--ds-accent-primary) 10%, transparent);
285
+ --ds-accent-muted: color-mix(in srgb, var(--ds-accent-primary) 20%, transparent);
286
+ --ds-accent-soft: color-mix(in srgb, var(--ds-accent-primary) 30%, transparent);
287
+ --ds-accent-subtle-text: var(--ds-accent-primary);
288
+
289
+ /* Categorical chart scale 6 series colours for data visualisation.
290
+ chart-1 is the accent, chart-2–6 map to palette bold variants.
291
+ When palette tokens are absent (no theme loaded), chart-2–6 fall
292
+ back to neutral shades so something visible always renders. */
293
+ --ds-chart-1: var(--ds-accent-primary);
294
+ --ds-chart-1-soft: color-mix(in oklch, var(--ds-accent-primary) 30%, transparent);
295
+ --ds-chart-2: var(--ds-palette-1-bold, var(--ds-neutral-500));
296
+ --ds-chart-2-soft: color-mix(in oklch, var(--ds-chart-2) 30%, transparent);
297
+ --ds-chart-3: var(--ds-palette-2-bold, var(--ds-neutral-400));
298
+ --ds-chart-3-soft: color-mix(in oklch, var(--ds-chart-3) 30%, transparent);
299
+ --ds-chart-4: var(--ds-palette-3-bold, var(--ds-neutral-600));
300
+ --ds-chart-4-soft: color-mix(in oklch, var(--ds-chart-4) 30%, transparent);
301
+ --ds-chart-5: var(--ds-palette-4-bold, var(--ds-neutral-300));
302
+ --ds-chart-5-soft: color-mix(in oklch, var(--ds-chart-5) 30%, transparent);
303
+ --ds-chart-6: var(--ds-palette-5-bold, var(--ds-neutral-700));
304
+ --ds-chart-6-soft: color-mix(in oklch, var(--ds-chart-6) 30%, transparent);
305
+
306
+ /* Backwards-compat aliases */
307
+ --ds-chart-fill: var(--ds-chart-1);
308
+ --ds-chart-fill-soft: var(--ds-chart-1-soft);
274
309
 
275
310
  --ds-status-success: var(--ds-success-500);
276
311
  --ds-status-success-bg: var(--ds-success-100);
@@ -290,7 +325,7 @@
290
325
  --ds-sidebar-text-secondary: var(--ds-text-secondary);
291
326
  --ds-sidebar-text-muted: var(--ds-text-muted);
292
327
  --ds-sidebar-accent: var(--ds-accent-primary);
293
- --ds-sidebar-accent-subtle: color-mix(in oklch, var(--ds-sidebar-accent) 10%, transparent);
328
+ --ds-sidebar-accent-subtle: color-mix(in srgb, var(--ds-sidebar-accent) 10%, transparent);
294
329
 
295
330
  /* Tab strip — presets can override for stronger contrast (e.g. Modern Dark) */
296
331
  --ds-tab-hover-bg: var(--ds-bg-muted);
@@ -0,0 +1,71 @@
1
+ import { buildExtendedMap } from './chunk-GYVBRUO2.js';
2
+ import { IconUpload, IconDownload, IconBookmark, IconStar, IconMenu2, IconPencil, IconLogout, IconSend, IconPaperclip, IconMicrophone, IconGripVertical, IconArrowLeft, IconArrowForwardUp, IconArrowBackUp, IconTrash, IconChevronDown, IconChevronUp, IconTypography, IconHighlight, IconSubscript, IconSuperscript, IconMinus, IconQuote, IconCode, IconTable, IconPhoto, IconLink, IconListCheck, IconListNumbers, IconList, IconAlignRight, IconAlignCenter, IconAlignLeft, IconStrikethrough, IconUnderline, IconItalic, IconBold, IconCalendar, IconClock, IconAlertCircle, IconInfoCircle, IconAlertTriangle, IconCheck, IconUser, IconBell, IconSearch, IconPlus, IconX, IconChevronRight, IconSettings, IconChartBar, IconFolder, IconHome } from '@tabler/icons-react';
3
+
4
+ var curated = {
5
+ "home": IconHome,
6
+ "folder": IconFolder,
7
+ "chart": IconChartBar,
8
+ "settings": IconSettings,
9
+ "chevron-right": IconChevronRight,
10
+ "close": IconX,
11
+ "plus": IconPlus,
12
+ "search": IconSearch,
13
+ "bell": IconBell,
14
+ "user": IconUser,
15
+ "check": IconCheck,
16
+ "warning": IconAlertTriangle,
17
+ "info": IconInfoCircle,
18
+ "error": IconAlertCircle,
19
+ "clock": IconClock,
20
+ "calendar": IconCalendar,
21
+ "bold": IconBold,
22
+ "italic": IconItalic,
23
+ "underline": IconUnderline,
24
+ "strikethrough": IconStrikethrough,
25
+ "align-left": IconAlignLeft,
26
+ "align-center": IconAlignCenter,
27
+ "align-right": IconAlignRight,
28
+ "list": IconList,
29
+ "list-ordered": IconListNumbers,
30
+ "list-checks": IconListCheck,
31
+ "link": IconLink,
32
+ "image": IconPhoto,
33
+ "table": IconTable,
34
+ "code": IconCode,
35
+ "quote": IconQuote,
36
+ "minus": IconMinus,
37
+ "superscript": IconSuperscript,
38
+ "subscript": IconSubscript,
39
+ "highlight": IconHighlight,
40
+ "type": IconTypography,
41
+ "chevron-up": IconChevronUp,
42
+ "chevron-down": IconChevronDown,
43
+ "trash": IconTrash,
44
+ "undo": IconArrowBackUp,
45
+ "redo": IconArrowForwardUp,
46
+ "arrow-left": IconArrowLeft,
47
+ "grip-vertical": IconGripVertical,
48
+ "mic": IconMicrophone,
49
+ "paperclip": IconPaperclip,
50
+ "send": IconSend,
51
+ "log-out": IconLogout,
52
+ "edit": IconPencil,
53
+ "menu": IconMenu2,
54
+ "star": IconStar,
55
+ "bookmark": IconBookmark,
56
+ "download": IconDownload,
57
+ "upload": IconUpload
58
+ };
59
+ function loadCurated() {
60
+ return curated;
61
+ }
62
+ async function loadExtended() {
63
+ const T = await import('@tabler/icons-react');
64
+ const extended = buildExtendedMap(T, {}, { stripPrefix: "Icon" });
65
+ Object.assign(extended, curated);
66
+ return extended;
67
+ }
68
+
69
+ export { loadCurated, loadExtended };
70
+ //# sourceMappingURL=tabler-TVOR6AFM.js.map
71
+ //# sourceMappingURL=tabler-TVOR6AFM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../showcase/src/lib/icon-packs/tabler.ts"],"names":[],"mappings":";;;AAyBA,IAAM,OAAA,GAAmB;AAAA,EACvB,MAAA,EAAQ,QAAA;AAAA,EAAU,QAAA,EAAU,UAAA;AAAA,EAAY,OAAA,EAAS,YAAA;AAAA,EACjD,UAAA,EAAY,YAAA;AAAA,EAAc,eAAA,EAAiB,gBAAA;AAAA,EAC3C,OAAA,EAAS,KAAA;AAAA,EAAO,MAAA,EAAQ,QAAA;AAAA,EAAU,QAAA,EAAU,UAAA;AAAA,EAC5C,MAAA,EAAQ,QAAA;AAAA,EAAU,MAAA,EAAQ,QAAA;AAAA,EAAU,OAAA,EAAS,SAAA;AAAA,EAC7C,SAAA,EAAW,iBAAA;AAAA,EAAmB,MAAA,EAAQ,cAAA;AAAA,EACtC,OAAA,EAAS,eAAA;AAAA,EAAiB,OAAA,EAAS,SAAA;AAAA,EAAW,UAAA,EAAY,YAAA;AAAA,EAC1D,MAAA,EAAQ,QAAA;AAAA,EAAU,QAAA,EAAU,UAAA;AAAA,EAAY,WAAA,EAAa,aAAA;AAAA,EACrD,eAAA,EAAiB,iBAAA;AAAA,EAAmB,YAAA,EAAc,aAAA;AAAA,EAClD,cAAA,EAAgB,eAAA;AAAA,EAAiB,aAAA,EAAe,cAAA;AAAA,EAChD,MAAA,EAAQ,QAAA;AAAA,EAAU,cAAA,EAAgB,eAAA;AAAA,EAAiB,aAAA,EAAe,aAAA;AAAA,EAClE,MAAA,EAAQ,QAAA;AAAA,EAAU,OAAA,EAAS,SAAA;AAAA,EAAW,OAAA,EAAS,SAAA;AAAA,EAAW,MAAA,EAAQ,QAAA;AAAA,EAClE,OAAA,EAAS,SAAA;AAAA,EAAW,OAAA,EAAS,SAAA;AAAA,EAAW,aAAA,EAAe,eAAA;AAAA,EACvD,WAAA,EAAa,aAAA;AAAA,EAAe,WAAA,EAAa,aAAA;AAAA,EAAe,MAAA,EAAQ,cAAA;AAAA,EAChE,YAAA,EAAc,aAAA;AAAA,EAAe,cAAA,EAAgB,eAAA;AAAA,EAAiB,OAAA,EAAS,SAAA;AAAA,EACvE,MAAA,EAAQ,eAAA;AAAA,EAAiB,MAAA,EAAQ,kBAAA;AAAA,EACjC,YAAA,EAAc,aAAA;AAAA,EAAe,eAAA,EAAiB,gBAAA;AAAA,EAC9C,KAAA,EAAO,cAAA;AAAA,EAAgB,WAAA,EAAa,aAAA;AAAA,EAAe,MAAA,EAAQ,QAAA;AAAA,EAC3D,SAAA,EAAW,UAAA;AAAA,EAAY,MAAA,EAAQ,UAAA;AAAA,EAAY,MAAA,EAAQ,SAAA;AAAA,EACnD,MAAA,EAAQ,QAAA;AAAA,EAAU,UAAA,EAAY,YAAA;AAAA,EAC9B,UAAA,EAAY,YAAA;AAAA,EAAc,QAAA,EAAU;AACtC,CAAA;AAEO,SAAS,WAAA,GAAuB;AACrC,EAAA,OAAO,OAAA;AACT;AAEA,eAAsB,YAAA,GAAiC;AACrD,EAAA,MAAM,CAAA,GAAI,MAAM,OAAO,qBAAqB,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAW,iBAAiB,CAAA,EAAyC,IAAI,EAAE,WAAA,EAAa,QAAQ,CAAA;AACtG,EAAA,MAAA,CAAO,MAAA,CAAO,UAAU,OAAO,CAAA;AAC/B,EAAA,OAAO,QAAA;AACT","file":"tabler-TVOR6AFM.js","sourcesContent":["import type { IconMap } from './types'\nimport { buildExtendedMap } from './utils'\nimport {\n IconHome, IconFolder, IconChartBar,\n IconSettings, IconChevronRight,\n IconX, IconPlus, IconSearch,\n IconBell, IconUser, IconCheck,\n IconAlertTriangle, IconInfoCircle,\n IconAlertCircle, IconClock, IconCalendar,\n IconBold, IconItalic, IconUnderline,\n IconStrikethrough, IconAlignLeft,\n IconAlignCenter, IconAlignRight,\n IconList, IconListNumbers, IconListCheck,\n IconLink, IconPhoto, IconTable, IconCode,\n IconQuote, IconMinus, IconSuperscript,\n IconSubscript, IconHighlight, IconTypography,\n IconChevronUp, IconChevronDown, IconTrash,\n IconArrowBackUp, IconArrowForwardUp,\n IconArrowLeft, IconGripVertical,\n IconMicrophone, IconPaperclip, IconSend,\n IconLogout, IconPencil, IconMenu2,\n IconStar, IconBookmark,\n IconDownload, IconUpload,\n} from \"@tabler/icons-react\"\n\nconst curated: IconMap = {\n \"home\": IconHome, \"folder\": IconFolder, \"chart\": IconChartBar,\n \"settings\": IconSettings, \"chevron-right\": IconChevronRight,\n \"close\": IconX, \"plus\": IconPlus, \"search\": IconSearch,\n \"bell\": IconBell, \"user\": IconUser, \"check\": IconCheck,\n \"warning\": IconAlertTriangle, \"info\": IconInfoCircle,\n \"error\": IconAlertCircle, \"clock\": IconClock, \"calendar\": IconCalendar,\n \"bold\": IconBold, \"italic\": IconItalic, \"underline\": IconUnderline,\n \"strikethrough\": IconStrikethrough, \"align-left\": IconAlignLeft,\n \"align-center\": IconAlignCenter, \"align-right\": IconAlignRight,\n \"list\": IconList, \"list-ordered\": IconListNumbers, \"list-checks\": IconListCheck,\n \"link\": IconLink, \"image\": IconPhoto, \"table\": IconTable, \"code\": IconCode,\n \"quote\": IconQuote, \"minus\": IconMinus, \"superscript\": IconSuperscript,\n \"subscript\": IconSubscript, \"highlight\": IconHighlight, \"type\": IconTypography,\n \"chevron-up\": IconChevronUp, \"chevron-down\": IconChevronDown, \"trash\": IconTrash,\n \"undo\": IconArrowBackUp, \"redo\": IconArrowForwardUp,\n \"arrow-left\": IconArrowLeft, \"grip-vertical\": IconGripVertical,\n \"mic\": IconMicrophone, \"paperclip\": IconPaperclip, \"send\": IconSend,\n \"log-out\": IconLogout, \"edit\": IconPencil, \"menu\": IconMenu2,\n \"star\": IconStar, \"bookmark\": IconBookmark,\n \"download\": IconDownload, \"upload\": IconUpload,\n}\n\nexport function loadCurated(): IconMap {\n return curated\n}\n\nexport async function loadExtended(): Promise<IconMap> {\n const T = await import(\"@tabler/icons-react\")\n const extended = buildExtendedMap(T as unknown as Record<string, unknown>, {}, { stripPrefix: \"Icon\" })\n Object.assign(extended, curated)\n return extended\n}\n"]}
@@ -0,0 +1,30 @@
1
+ import * as react from 'react';
2
+ import { ReactNode } from 'react';
3
+
4
+ declare const DEFAULT_BREAKPOINTS: {
5
+ readonly sm: 640;
6
+ readonly md: 768;
7
+ readonly lg: 1024;
8
+ readonly xl: 1280;
9
+ };
10
+ type BreakpointKey = keyof typeof DEFAULT_BREAKPOINTS;
11
+ /**
12
+ * Provides an override container width for all `useBreakpoint` calls within
13
+ * this subtree. Used by the builder's viewport preview to make components
14
+ * respond to the constrained canvas width instead of the browser viewport.
15
+ */
16
+ declare function BreakpointWidthProvider({ width, children }: {
17
+ width: number | null;
18
+ children: ReactNode;
19
+ }): react.FunctionComponentElement<react.ProviderProps<number | null>>;
20
+ /**
21
+ * Reactive breakpoint check that reads `--ds-bp-*` CSS variables.
22
+ * Returns true when the viewport (or override container) is at or below the
23
+ * named breakpoint.
24
+ *
25
+ * @example
26
+ * const isMobile = useBreakpoint("md"); // true when ≤768px
27
+ */
28
+ declare function useBreakpoint(key: BreakpointKey): boolean;
29
+
30
+ export { type BreakpointKey as B, BreakpointWidthProvider as a, useBreakpoint as u };
package/dist/utils.js CHANGED
@@ -1,4 +1,3 @@
1
- export { GLASS_BACKDROP, GLASS_DROPDOWN, GLASS_OVERLAY, GLASS_SURFACE, cn } from './chunk-5XIPPVH7.js';
2
- import './chunk-5WRI5ZAA.js';
1
+ export { GLASS_BACKDROP, GLASS_DROPDOWN, GLASS_OVERLAY, GLASS_SURFACE, cn } from './chunk-IUBWNDUK.js';
3
2
  //# sourceMappingURL=utils.js.map
4
3
  //# sourceMappingURL=utils.js.map
@@ -0,0 +1,16 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode, Ref } from 'react';
3
+ import { VirtualItem } from '@tanstack/react-virtual';
4
+
5
+ interface VirtualizedListProps<T> {
6
+ items: T[];
7
+ estimateSize: (index: number) => number;
8
+ renderItem: (item: T, index: number, virtualItem: VirtualItem) => ReactNode;
9
+ overscan?: number;
10
+ height?: number | string;
11
+ className?: string;
12
+ ref?: Ref<HTMLDivElement>;
13
+ }
14
+ declare function VirtualizedList<T>({ items, estimateSize, renderItem, overscan, height, className, ref, }: VirtualizedListProps<T>): react_jsx_runtime.JSX.Element;
15
+
16
+ export { VirtualizedList };
@@ -0,0 +1,55 @@
1
+ import { cn } from './chunk-IUBWNDUK.js';
2
+ import { useRef } from 'react';
3
+ import { useVirtualizer } from '@tanstack/react-virtual';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ function VirtualizedList({
7
+ items,
8
+ estimateSize,
9
+ renderItem,
10
+ overscan = 5,
11
+ height = 400,
12
+ className,
13
+ ref
14
+ }) {
15
+ const parentRef = useRef(null);
16
+ const virtualizer = useVirtualizer({
17
+ count: items.length,
18
+ getScrollElement: () => parentRef.current,
19
+ estimateSize,
20
+ overscan
21
+ });
22
+ return /* @__PURE__ */ jsx(
23
+ "div",
24
+ {
25
+ ref: (node) => {
26
+ parentRef.current = node;
27
+ if (typeof ref === "function") ref(node);
28
+ else if (ref) ref.current = node;
29
+ },
30
+ className: cn(
31
+ "overflow-auto",
32
+ "rounded-[var(--ds-radius-md)]",
33
+ "border-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)]",
34
+ "bg-[var(--ds-bg-surface)]",
35
+ className
36
+ ),
37
+ style: { height },
38
+ children: /* @__PURE__ */ jsx("div", { className: "relative w-full", style: { height: virtualizer.getTotalSize() }, children: virtualizer.getVirtualItems().map((virtualItem) => /* @__PURE__ */ jsx(
39
+ "div",
40
+ {
41
+ "data-index": virtualItem.index,
42
+ ref: virtualizer.measureElement,
43
+ className: "absolute top-0 left-0 w-full",
44
+ style: { transform: `translateY(${virtualItem.start}px)` },
45
+ children: renderItem(items[virtualItem.index], virtualItem.index, virtualItem)
46
+ },
47
+ virtualItem.key
48
+ )) })
49
+ }
50
+ );
51
+ }
52
+
53
+ export { VirtualizedList };
54
+ //# sourceMappingURL=virtualized.js.map
55
+ //# sourceMappingURL=virtualized.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../showcase/src/components/VirtualizedList.tsx"],"names":[],"mappings":";;;;;AAcO,SAAS,eAAA,CAAmB;AAAA,EACjC,KAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA,GAAW,CAAA;AAAA,EACX,MAAA,GAAS,GAAA;AAAA,EACT,SAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,SAAA,GAAY,OAAuB,IAAI,CAAA;AAE7C,EAAA,MAAM,cAAc,cAAA,CAAe;AAAA,IACjC,OAAO,KAAA,CAAM,MAAA;AAAA,IACb,gBAAA,EAAkB,MAAM,SAAA,CAAU,OAAA;AAAA,IAClC,YAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,CAAC,IAAA,KAAS;AACb,QAAC,UAA4D,OAAA,GAAU,IAAA;AACvE,QAAA,IAAI,OAAO,GAAA,KAAQ,UAAA,EAAY,GAAA,CAAI,IAAI,CAAA;AAAA,aAAA,IAC9B,GAAA,EAAM,GAAA,CAAsD,OAAA,GAAU,IAAA;AAAA,MACjF,CAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,eAAA;AAAA,QACA,+BAAA;AAAA,QACA,yEAAA;AAAA,QACA,2BAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,MAEhB,8BAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EAAkB,KAAA,EAAO,EAAE,MAAA,EAAQ,WAAA,CAAY,YAAA,EAAa,IACxE,QAAA,EAAA,WAAA,CAAY,eAAA,EAAgB,CAAE,GAAA,CAAI,CAAC,WAAA,qBAClC,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,cAAY,WAAA,CAAY,KAAA;AAAA,UACxB,KAAK,WAAA,CAAY,cAAA;AAAA,UACjB,SAAA,EAAU,8BAAA;AAAA,UACV,OAAO,EAAE,SAAA,EAAW,CAAA,WAAA,EAAc,WAAA,CAAY,KAAK,CAAA,GAAA,CAAA,EAAM;AAAA,UAExD,qBAAW,KAAA,CAAM,WAAA,CAAY,KAAK,CAAA,EAAG,WAAA,CAAY,OAAO,WAAW;AAAA,SAAA;AAAA,QAN/D,WAAA,CAAY;AAAA,OAQpB,CAAA,EACH;AAAA;AAAA,GACF;AAEJ","file":"virtualized.js","sourcesContent":["import { useRef, type ReactNode, type Ref } from \"react\";\nimport { useVirtualizer, type VirtualItem } from \"@tanstack/react-virtual\";\nimport { cn } from \"../lib/utils\";\n\nexport interface VirtualizedListProps<T> {\n items: T[];\n estimateSize: (index: number) => number;\n renderItem: (item: T, index: number, virtualItem: VirtualItem) => ReactNode;\n overscan?: number;\n height?: number | string;\n className?: string;\n ref?: Ref<HTMLDivElement>;\n}\n\nexport function VirtualizedList<T>({\n items,\n estimateSize,\n renderItem,\n overscan = 5,\n height = 400,\n className,\n ref,\n}: VirtualizedListProps<T>) {\n const parentRef = useRef<HTMLDivElement>(null);\n\n const virtualizer = useVirtualizer({\n count: items.length,\n getScrollElement: () => parentRef.current,\n estimateSize,\n overscan,\n });\n\n return (\n <div\n ref={(node) => {\n (parentRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n }}\n className={cn(\n \"overflow-auto\",\n \"rounded-[var(--ds-radius-md)]\",\n \"border-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)]\",\n \"bg-[var(--ds-bg-surface)]\",\n className,\n )}\n style={{ height }}\n >\n <div className=\"relative w-full\" style={{ height: virtualizer.getTotalSize() }}>\n {virtualizer.getVirtualItems().map((virtualItem) => (\n <div\n key={virtualItem.key}\n data-index={virtualItem.index}\n ref={virtualizer.measureElement}\n className=\"absolute top-0 left-0 w-full\"\n style={{ transform: `translateY(${virtualItem.start}px)` }}\n >\n {renderItem(items[virtualItem.index], virtualItem.index, virtualItem)}\n </div>\n ))}\n </div>\n </div>\n );\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "gridsmith-ui",
3
- "version": "0.3.5",
4
- "description": "Gridsmith component library 82 React components with design tokens and a CSS custom property theming engine",
3
+ "version": "0.6.0",
4
+ "description": "Gridsmith component library \u2014 98 React components with design tokens and a CSS custom property theming engine",
5
5
  "type": "module",
6
6
  "sideEffects": [
7
7
  "*.css"
@@ -19,6 +19,30 @@
19
19
  "types": "./dist/icons.d.ts",
20
20
  "import": "./dist/icons.js"
21
21
  },
22
+ "./charts": {
23
+ "types": "./dist/charts.d.ts",
24
+ "import": "./dist/charts.js"
25
+ },
26
+ "./editor": {
27
+ "types": "./dist/editor.d.ts",
28
+ "import": "./dist/editor.js"
29
+ },
30
+ "./kanban": {
31
+ "types": "./dist/kanban.d.ts",
32
+ "import": "./dist/kanban.js"
33
+ },
34
+ "./data-grid": {
35
+ "types": "./dist/data-grid.d.ts",
36
+ "import": "./dist/data-grid.js"
37
+ },
38
+ "./virtualized": {
39
+ "types": "./dist/virtualized.d.ts",
40
+ "import": "./dist/virtualized.js"
41
+ },
42
+ "./resizable": {
43
+ "types": "./dist/resizable.d.ts",
44
+ "import": "./dist/resizable.js"
45
+ },
22
46
  "./roots.css": "./dist/roots.css",
23
47
  "./tokens.css": "./dist/tokens.css",
24
48
  "./tailwind.css": "./dist/tailwind.css"
@@ -43,12 +67,44 @@
43
67
  "react": "^18.0.0 || ^19.0.0",
44
68
  "react-dom": "^18.0.0 || ^19.0.0",
45
69
  "lucide-react": "^1.0.0",
70
+ "recharts": "^3.8.0",
46
71
  "@phosphor-icons/react": "^2.0.0",
47
72
  "@heroicons/react": "^2.0.0",
48
73
  "@tabler/icons-react": "^3.0.0",
49
- "react-icons": "^5.0.0"
74
+ "react-icons": "^5.0.0",
75
+ "@tiptap/react": "^3.22.4",
76
+ "@tiptap/pm": "^3.22.4",
77
+ "@tiptap/starter-kit": "^3.22.4",
78
+ "@tiptap/extension-code-block-lowlight": "^3.22.4",
79
+ "@tiptap/extension-color": "^3.22.4",
80
+ "@tiptap/extension-font-family": "^3.22.4",
81
+ "@tiptap/extension-highlight": "^3.22.4",
82
+ "@tiptap/extension-image": "^3.22.4",
83
+ "@tiptap/extension-link": "^3.22.4",
84
+ "@tiptap/extension-placeholder": "^3.22.4",
85
+ "@tiptap/extension-subscript": "^3.22.4",
86
+ "@tiptap/extension-superscript": "^3.22.4",
87
+ "@tiptap/extension-table": "^3.22.4",
88
+ "@tiptap/extension-table-cell": "^3.22.4",
89
+ "@tiptap/extension-table-header": "^3.22.4",
90
+ "@tiptap/extension-table-row": "^3.22.4",
91
+ "@tiptap/extension-task-item": "^3.22.4",
92
+ "@tiptap/extension-task-list": "^3.22.4",
93
+ "@tiptap/extension-text-align": "^3.22.4",
94
+ "@tiptap/extension-text-style": "^3.22.4",
95
+ "@tiptap/extension-underline": "^3.22.4",
96
+ "lowlight": "^3.3.0",
97
+ "@dnd-kit/core": "^6.3.1",
98
+ "@dnd-kit/sortable": "^10.0.0",
99
+ "@dnd-kit/utilities": "^3.2.2",
100
+ "@tanstack/react-table": "^8.21.3",
101
+ "@tanstack/react-virtual": "^3.13.24",
102
+ "react-resizable-panels": "^4.10.0"
50
103
  },
51
104
  "peerDependenciesMeta": {
105
+ "recharts": {
106
+ "optional": true
107
+ },
52
108
  "@phosphor-icons/react": {
53
109
  "optional": true
54
110
  },
@@ -60,6 +116,90 @@
60
116
  },
61
117
  "react-icons": {
62
118
  "optional": true
119
+ },
120
+ "@tiptap/react": {
121
+ "optional": true
122
+ },
123
+ "@tiptap/pm": {
124
+ "optional": true
125
+ },
126
+ "@tiptap/starter-kit": {
127
+ "optional": true
128
+ },
129
+ "@tiptap/extension-code-block-lowlight": {
130
+ "optional": true
131
+ },
132
+ "@tiptap/extension-color": {
133
+ "optional": true
134
+ },
135
+ "@tiptap/extension-font-family": {
136
+ "optional": true
137
+ },
138
+ "@tiptap/extension-highlight": {
139
+ "optional": true
140
+ },
141
+ "@tiptap/extension-image": {
142
+ "optional": true
143
+ },
144
+ "@tiptap/extension-link": {
145
+ "optional": true
146
+ },
147
+ "@tiptap/extension-placeholder": {
148
+ "optional": true
149
+ },
150
+ "@tiptap/extension-subscript": {
151
+ "optional": true
152
+ },
153
+ "@tiptap/extension-superscript": {
154
+ "optional": true
155
+ },
156
+ "@tiptap/extension-table": {
157
+ "optional": true
158
+ },
159
+ "@tiptap/extension-table-cell": {
160
+ "optional": true
161
+ },
162
+ "@tiptap/extension-table-header": {
163
+ "optional": true
164
+ },
165
+ "@tiptap/extension-table-row": {
166
+ "optional": true
167
+ },
168
+ "@tiptap/extension-task-item": {
169
+ "optional": true
170
+ },
171
+ "@tiptap/extension-task-list": {
172
+ "optional": true
173
+ },
174
+ "@tiptap/extension-text-align": {
175
+ "optional": true
176
+ },
177
+ "@tiptap/extension-text-style": {
178
+ "optional": true
179
+ },
180
+ "@tiptap/extension-underline": {
181
+ "optional": true
182
+ },
183
+ "lowlight": {
184
+ "optional": true
185
+ },
186
+ "@dnd-kit/core": {
187
+ "optional": true
188
+ },
189
+ "@dnd-kit/sortable": {
190
+ "optional": true
191
+ },
192
+ "@dnd-kit/utilities": {
193
+ "optional": true
194
+ },
195
+ "@tanstack/react-table": {
196
+ "optional": true
197
+ },
198
+ "@tanstack/react-virtual": {
199
+ "optional": true
200
+ },
201
+ "react-resizable-panels": {
202
+ "optional": true
63
203
  }
64
204
  },
65
205
  "devDependencies": {
@@ -86,4 +226,4 @@
86
226
  "type": "git",
87
227
  "url": "https://github.com/gridsmith/ui"
88
228
  }
89
- }
229
+ }
@@ -1,29 +0,0 @@
1
- var __create = Object.create;
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __getProtoOf = Object.getPrototypeOf;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __commonJS = (cb, mod) => function __require() {
8
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
19
- // If the importer is in node compatibility mode or this is not an ESM
20
- // file that has been converted to a CommonJS file using a Babel-
21
- // compatible transform (i.e. "__esModule" has not been set), then set
22
- // "default" to the CommonJS "module.exports" for node compatibility.
23
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
24
- mod
25
- ));
26
-
27
- export { __commonJS, __toESM };
28
- //# sourceMappingURL=chunk-5WRI5ZAA.js.map
29
- //# sourceMappingURL=chunk-5WRI5ZAA.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-5WRI5ZAA.js"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../showcase/src/lib/utils.ts"],"names":[],"mappings":";;;;AAGO,SAAS,MAAM,MAAA,EAA8B;AAClD,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;AAEO,IAAM,cAAA,GAAiB;AAEvB,IAAM,aAAA,GAAgB,GAAG,cAAc,CAAA,qDAAA;AAEvC,IAAM,aAAA,GAAgB,GAAG,cAAc,CAAA,sDAAA;AAEvC,IAAM,cAAA,GAAiB,GAAG,cAAc,CAAA,yDAAA;AAExC,SAAS,cAAA,GAAiB;AAC/B,EAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,QAAA;AACjC;AAEO,SAAS,gBAAA,GAAmB;AACjC,EAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,EAAA;AACjC","file":"chunk-5XIPPVH7.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n\nexport const GLASS_BACKDROP = \"[backdrop-filter:var(--ds-glass-filter)] [-webkit-backdrop-filter:var(--ds-glass-filter)]\";\n\nexport const GLASS_SURFACE = `${GLASS_BACKDROP} shadow-[var(--ds-shadow-card),var(--ds-glass-inset)]`;\n\nexport const GLASS_OVERLAY = `${GLASS_BACKDROP} shadow-[var(--ds-shadow-modal),var(--ds-glass-inset)]`;\n\nexport const GLASS_DROPDOWN = `${GLASS_BACKDROP} shadow-[var(--ds-shadow-dropdown),var(--ds-glass-inset)]`;\n\nexport function lockBodyScroll() {\n document.body.style.overflow = \"hidden\";\n}\n\nexport function unlockBodyScroll() {\n document.body.style.overflow = \"\";\n}\n"]}
@@ -1,82 +0,0 @@
1
- import { createContext, useContext, useState, useEffect } from 'react';
2
- import { jsx } from 'react/jsx-runtime';
3
-
4
- // ../../showcase/src/lib/icons.tsx
5
- var packCache = /* @__PURE__ */ new Map();
6
- var fullyLoaded = /* @__PURE__ */ new Set();
7
- async function loadPack(pack) {
8
- switch (pack) {
9
- case "lucide":
10
- return (await import('./lucide-6TGT4G26.js')).load();
11
- case "phosphor":
12
- return (await import('./phosphor-BWDP4PU7.js')).load();
13
- case "heroicons":
14
- return (await import('./heroicons-HJTKMLIJ.js')).load();
15
- case "tabler":
16
- return (await import('./tabler-6TPNTLFV.js')).load();
17
- case "feather":
18
- return (await import('./feather-N37QZ7LA.js')).load();
19
- }
20
- }
21
- var IconCtx = createContext({ pack: "lucide", weight: 1.5 });
22
- function IconProvider({ pack, weight, children }) {
23
- return /* @__PURE__ */ jsx(IconCtx.Provider, { value: { pack, weight }, children });
24
- }
25
- function useIconMap(pack) {
26
- const [map, setMap] = useState(packCache.get(pack) ?? null);
27
- useEffect(() => {
28
- if (fullyLoaded.has(pack)) {
29
- const cached = packCache.get(pack);
30
- if (cached) setMap(cached);
31
- return;
32
- }
33
- let cancelled = false;
34
- loadPack(pack).then((loaded) => {
35
- packCache.set(pack, loaded);
36
- fullyLoaded.add(pack);
37
- if (!cancelled) setMap(loaded);
38
- });
39
- return () => {
40
- cancelled = true;
41
- };
42
- }, [pack]);
43
- return map;
44
- }
45
- function getPhosphorWeight(numericWeight) {
46
- if (numericWeight <= 0.75) return "thin";
47
- if (numericWeight <= 1.25) return "light";
48
- if (numericWeight <= 1.75) return "regular";
49
- if (numericWeight <= 2.25) return "bold";
50
- return "fill";
51
- }
52
- function Icon({ name, size = 16, className }) {
53
- const { pack, weight } = useContext(IconCtx);
54
- const map = useIconMap(pack);
55
- const needsFallback = pack !== "lucide" && map !== null && !map[name];
56
- const lucideMap = useIconMap(needsFallback ? "lucide" : pack);
57
- if (!map) return null;
58
- let Comp = map[name];
59
- let renderPack = pack;
60
- if (!Comp) {
61
- if (!needsFallback || !lucideMap?.[name]) return null;
62
- Comp = lucideMap[name];
63
- renderPack = "lucide";
64
- }
65
- if (renderPack === "phosphor") {
66
- return /* @__PURE__ */ jsx(Comp, { size, weight: getPhosphorWeight(weight), className });
67
- }
68
- if (renderPack === "heroicons") {
69
- return /* @__PURE__ */ jsx(Comp, { className, style: { width: size, height: size, strokeWidth: weight } });
70
- }
71
- if (renderPack === "tabler") {
72
- return /* @__PURE__ */ jsx(Comp, { size, stroke: weight, className });
73
- }
74
- if (renderPack === "feather") {
75
- return /* @__PURE__ */ jsx(Comp, { size, className, strokeWidth: weight });
76
- }
77
- return /* @__PURE__ */ jsx(Comp, { size, strokeWidth: weight, className });
78
- }
79
-
80
- export { Icon, IconProvider };
81
- //# sourceMappingURL=chunk-WVB3SRXW.js.map
82
- //# sourceMappingURL=chunk-WVB3SRXW.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../showcase/src/lib/icons.tsx"],"names":[],"mappings":"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","file":"chunk-WVB3SRXW.js","sourcesContent":["import { createContext, useContext, useState, useEffect, type ReactNode, type ComponentType } from \"react\";\n\n/* ── Types ────────────────────────────────────────────────────── */\n\n/**\n * Runtime list of curated icon names. The CuratedIconName type derives from\n * this array, so adding a name here extends autocomplete automatically.\n * Every name must have an alias (or auto-kebab match) in ALL five packs —\n * icon-completeness.test.tsx enforces this.\n */\nexport const CURATED_ICON_NAMES = [\n \"home\", \"folder\", \"chart\", \"settings\",\n \"chevron-right\", \"close\", \"plus\", \"search\",\n \"bell\", \"user\", \"check\", \"warning\", \"info\", \"error\",\n \"clock\", \"calendar\",\n \"bold\", \"italic\", \"underline\", \"strikethrough\",\n \"align-left\", \"align-center\", \"align-right\",\n \"list\", \"list-ordered\", \"list-checks\",\n \"link\", \"image\", \"table\", \"code\", \"quote\", \"minus\",\n \"superscript\", \"subscript\", \"highlight\", \"type\",\n \"chevron-up\", \"chevron-down\", \"trash\",\n \"undo\", \"redo\",\n \"arrow-left\", \"grip-vertical\",\n \"mic\", \"paperclip\", \"send\",\n \"log-out\", \"edit\", \"menu\",\n \"star\", \"bookmark\", \"download\", \"upload\",\n] as const;\n\ntype CuratedIconName = (typeof CURATED_ICON_NAMES)[number];\n\n/**\n * Curated names provide autocomplete and work identically across all 5 packs.\n * Any kebab-case string is also accepted — it resolves directly against the\n * active pack's native exports (e.g. \"clipboard-copy\" → Lucide's ClipboardCopy).\n */\nexport type IconName = CuratedIconName | (string & {});\n\nexport type IconPack = \"lucide\" | \"phosphor\" | \"heroicons\" | \"tabler\" | \"feather\";\n\ntype IconComponent = ComponentType<Record<string, unknown>>;\ntype IconMap = Record<string, IconComponent>;\n\n/* ── Pack loading ─────────────────────────────────────────────── \n Each pack is isolated in its own file under ./icon-packs/.\n Only the active pack's module is dynamically imported at runtime,\n so bundlers (including Turbopack) won't resolve unused pack\n dependencies at build time. */\n\nconst packCache = new Map<IconPack, IconMap>();\nconst fullyLoaded = new Set<IconPack>();\n\nasync function loadPack(pack: IconPack): Promise<IconMap> {\n switch (pack) {\n case \"lucide\": return (await import(\"./icon-packs/lucide\")).load();\n case \"phosphor\": return (await import(\"./icon-packs/phosphor\")).load();\n case \"heroicons\": return (await import(\"./icon-packs/heroicons\")).load();\n case \"tabler\": return (await import(\"./icon-packs/tabler\")).load();\n case \"feather\": return (await import(\"./icon-packs/feather\")).load();\n }\n}\n\n/** Exported for the icon-completeness test — not part of the public API. */\nexport const packLoaders: Record<IconPack, () => Promise<IconMap>> = {\n lucide: () => loadPack(\"lucide\"),\n phosphor: () => loadPack(\"phosphor\"),\n heroicons: () => loadPack(\"heroicons\"),\n tabler: () => loadPack(\"tabler\"),\n feather: () => loadPack(\"feather\"),\n};\n\n/* ── Context ──────────────────────────────────────────────────── */\n\ninterface IconContextValue {\n pack: IconPack;\n weight: number;\n}\n\nconst IconCtx = createContext<IconContextValue>({ pack: \"lucide\", weight: 1.5 });\n\nexport function IconProvider({ pack, weight, children }: { pack: IconPack; weight: number; children: ReactNode }) {\n return <IconCtx.Provider value={{ pack, weight }}>{children}</IconCtx.Provider>;\n}\n\n/* ── Hook ─────────────────────────────────────────────────────── */\n\nfunction useIconMap(pack: IconPack): IconMap | null {\n const [map, setMap] = useState<IconMap | null>(packCache.get(pack) ?? null);\n\n useEffect(() => {\n if (fullyLoaded.has(pack)) {\n const cached = packCache.get(pack);\n if (cached) setMap(cached);\n return;\n }\n\n let cancelled = false;\n loadPack(pack).then((loaded) => {\n packCache.set(pack, loaded);\n fullyLoaded.add(pack);\n if (!cancelled) setMap(loaded);\n });\n return () => { cancelled = true; };\n }, [pack]);\n\n return map;\n}\n\n/* ── Phosphor weight mapping ──────────────────────────────────── */\n\nfunction getPhosphorWeight(numericWeight: number): \"thin\" | \"light\" | \"regular\" | \"bold\" | \"fill\" | \"duotone\" {\n if (numericWeight <= 0.75) return \"thin\";\n if (numericWeight <= 1.25) return \"light\";\n if (numericWeight <= 1.75) return \"regular\";\n if (numericWeight <= 2.25) return \"bold\";\n return \"fill\";\n}\n\n/* ── Icon component ───────────────────────────────────────────── */\n\nexport function Icon({ name, size = 16, className }: { name: IconName; size?: number; className?: string }) {\n const { pack, weight } = useContext(IconCtx);\n const map = useIconMap(pack);\n\n // Lucide doubles as the universal fallback: when the active pack has loaded\n // but lacks the requested name, resolve against lucide instead of rendering\n // nothing. The hook call is unconditional (no conditional-hook violation) —\n // it only re-targets lucide once a miss is confirmed, which triggers the\n // lazy load and a re-render when the map arrives.\n const needsFallback = pack !== \"lucide\" && map !== null && !map[name];\n const lucideMap = useIconMap(needsFallback ? \"lucide\" : pack);\n\n if (!map) return null;\n\n let Comp = map[name];\n let renderPack: IconPack = pack;\n if (!Comp) {\n if (!needsFallback || !lucideMap?.[name]) return null;\n Comp = lucideMap[name];\n renderPack = \"lucide\";\n }\n\n if (renderPack === \"phosphor\") {\n return <Comp size={size} weight={getPhosphorWeight(weight)} className={className} />;\n }\n\n if (renderPack === \"heroicons\") {\n return <Comp className={className} style={{ width: size, height: size, strokeWidth: weight }} />;\n }\n\n if (renderPack === \"tabler\") {\n return <Comp size={size} stroke={weight} className={className} />;\n }\n\n if (renderPack === \"feather\") {\n return <Comp size={size} className={className} strokeWidth={weight} />;\n }\n\n return <Comp size={size} strokeWidth={weight} className={className} />;\n}\n"]}