gridsmith-ui 0.3.4 → 0.4.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.
@@ -0,0 +1,140 @@
1
+ import { createContext, useEffect, useContext, useSyncExternalStore } from 'react';
2
+ import { jsx } from 'react/jsx-runtime';
3
+
4
+ // ../../showcase/src/lib/icons.tsx
5
+ var subscribers = /* @__PURE__ */ new Set();
6
+ function notifySubscribers() {
7
+ subscribers.forEach((fn) => fn());
8
+ }
9
+ function subscribe(cb) {
10
+ subscribers.add(cb);
11
+ return () => {
12
+ subscribers.delete(cb);
13
+ };
14
+ }
15
+ var curatedCache = /* @__PURE__ */ new Map();
16
+ var extendedCache = /* @__PURE__ */ new Map();
17
+ function useCuratedMap(pack) {
18
+ return useSyncExternalStore(
19
+ subscribe,
20
+ () => curatedCache.get(pack) ?? null,
21
+ () => null
22
+ );
23
+ }
24
+ function useExtendedMap(pack) {
25
+ return useSyncExternalStore(
26
+ subscribe,
27
+ () => extendedCache.get(pack) ?? null,
28
+ () => null
29
+ );
30
+ }
31
+ var loadingPacks = /* @__PURE__ */ new Set();
32
+ async function loadPack(pack) {
33
+ if (curatedCache.has(pack) || loadingPacks.has(pack)) return;
34
+ loadingPacks.add(pack);
35
+ let mod;
36
+ switch (pack) {
37
+ case "lucide":
38
+ mod = await import('./lucide-Z74WVRAK.js');
39
+ break;
40
+ case "phosphor":
41
+ try {
42
+ mod = await import('./phosphor-DYUCR5S2.js');
43
+ } catch {
44
+ throw new Error("gridsmith-ui: @phosphor-icons/react is not installed. Run: npm install @phosphor-icons/react");
45
+ }
46
+ break;
47
+ case "heroicons":
48
+ try {
49
+ mod = await import('./heroicons-CCKJHFZY.js');
50
+ } catch {
51
+ throw new Error("gridsmith-ui: @heroicons/react is not installed. Run: npm install @heroicons/react");
52
+ }
53
+ break;
54
+ case "tabler":
55
+ try {
56
+ mod = await import('./tabler-GRXDPAHR.js');
57
+ } catch {
58
+ throw new Error("gridsmith-ui: @tabler/icons-react is not installed. Run: npm install @tabler/icons-react");
59
+ }
60
+ break;
61
+ case "feather":
62
+ try {
63
+ mod = await import('./feather-432JQGUB.js');
64
+ } catch {
65
+ throw new Error("gridsmith-ui: react-icons is not installed. Run: npm install react-icons");
66
+ }
67
+ break;
68
+ }
69
+ curatedCache.set(pack, mod.loadCurated());
70
+ notifySubscribers();
71
+ mod.loadExtended().then((extended) => {
72
+ extendedCache.set(pack, extended);
73
+ notifySubscribers();
74
+ });
75
+ }
76
+ var IconCtx = createContext({ pack: "lucide", weight: 1.5 });
77
+ function IconProvider({ pack, weight, children }) {
78
+ useEffect(() => {
79
+ loadPack(pack);
80
+ if (pack !== "lucide") loadPack("lucide");
81
+ }, [pack]);
82
+ return /* @__PURE__ */ jsx(IconCtx.Provider, { value: { pack, weight }, children });
83
+ }
84
+ function preloadPack(pack) {
85
+ loadPack(pack);
86
+ }
87
+ function getPhosphorWeight(numericWeight) {
88
+ if (numericWeight <= 0.75) return "thin";
89
+ if (numericWeight <= 1.25) return "light";
90
+ if (numericWeight <= 1.75) return "regular";
91
+ if (numericWeight <= 2.25) return "bold";
92
+ return "fill";
93
+ }
94
+ function Icon({ name, size = 16, className }) {
95
+ const { pack, weight } = useContext(IconCtx);
96
+ const curatedMap = useCuratedMap(pack);
97
+ const extendedMap = useExtendedMap(pack);
98
+ const lucideCurated = useCuratedMap("lucide");
99
+ const lucideExtended = useExtendedMap("lucide");
100
+ if (!curatedCache.has(pack) && !loadingPacks.has(pack)) {
101
+ loadPack(pack);
102
+ }
103
+ let Comp = null;
104
+ let renderPack = pack;
105
+ if (curatedMap) {
106
+ Comp = curatedMap[name];
107
+ }
108
+ if (!Comp && extendedMap) {
109
+ Comp = extendedMap[name];
110
+ }
111
+ if (!Comp && pack !== "lucide") {
112
+ const fallback = lucideCurated?.[name] ?? lucideExtended?.[name];
113
+ if (fallback) {
114
+ Comp = fallback;
115
+ renderPack = "lucide";
116
+ }
117
+ }
118
+ if (!Comp) {
119
+ const allMapsLoaded = curatedMap && extendedMap && (pack === "lucide" || lucideCurated && lucideExtended);
120
+ if (allMapsLoaded) return null;
121
+ return /* @__PURE__ */ jsx("span", { style: { display: "inline-block", width: size, height: size }, className });
122
+ }
123
+ if (renderPack === "phosphor") {
124
+ return /* @__PURE__ */ jsx(Comp, { size, weight: getPhosphorWeight(weight), className });
125
+ }
126
+ if (renderPack === "heroicons") {
127
+ return /* @__PURE__ */ jsx(Comp, { className, style: { width: size, height: size, strokeWidth: weight } });
128
+ }
129
+ if (renderPack === "tabler") {
130
+ return /* @__PURE__ */ jsx(Comp, { size, stroke: weight, className });
131
+ }
132
+ if (renderPack === "feather") {
133
+ return /* @__PURE__ */ jsx(Comp, { size, className, strokeWidth: weight });
134
+ }
135
+ return /* @__PURE__ */ jsx(Comp, { size, strokeWidth: weight, className });
136
+ }
137
+
138
+ export { Icon, IconProvider, preloadPack };
139
+ //# sourceMappingURL=chunk-6TMNEBBJ.js.map
140
+ //# sourceMappingURL=chunk-6TMNEBBJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../showcase/src/lib/icons.tsx"],"names":[],"mappings":"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","file":"chunk-6TMNEBBJ.js","sourcesContent":["import { createContext, useContext, useEffect, useSyncExternalStore, 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/* ── External store ──────────────────────────────────────────── */\n\ntype Subscriber = () => void;\nconst subscribers = new Set<Subscriber>();\nfunction notifySubscribers() {\n subscribers.forEach((fn) => fn());\n}\nfunction subscribe(cb: Subscriber): () => void {\n subscribers.add(cb);\n return () => { subscribers.delete(cb); };\n}\n\nconst curatedCache = new Map<IconPack, IconMap>();\nconst extendedCache = new Map<IconPack, IconMap>();\n\nfunction useCuratedMap(pack: IconPack): IconMap | null {\n return useSyncExternalStore(\n subscribe,\n () => curatedCache.get(pack) ?? null,\n () => null,\n );\n}\n\nfunction useExtendedMap(pack: IconPack): IconMap | null {\n return useSyncExternalStore(\n subscribe,\n () => extendedCache.get(pack) ?? null,\n () => null,\n );\n}\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 won't resolve unused pack dependencies at build time.\n\n Loading is two-phase:\n 1. Curated map (50 static named imports) — available as soon as\n the pack chunk loads, cached and notified immediately.\n 2. Extended map (full barrel import + kebab-case iteration) —\n loaded in the background, cached and notified when ready. */\n\nconst loadingPacks = new Set<IconPack>();\n\ntype PackModule = {\n loadCurated(): IconMap;\n loadExtended(): Promise<IconMap>;\n};\n\nasync function loadPack(pack: IconPack): Promise<void> {\n if (curatedCache.has(pack) || loadingPacks.has(pack)) return;\n loadingPacks.add(pack);\n\n let mod: PackModule;\n switch (pack) {\n case \"lucide\":\n mod = await import(\"./icon-packs/lucide\");\n break;\n case \"phosphor\":\n try { mod = await import(\"./icon-packs/phosphor\"); }\n catch { throw new Error(\"gridsmith-ui: @phosphor-icons/react is not installed. Run: npm install @phosphor-icons/react\"); }\n break;\n case \"heroicons\":\n try { mod = await import(\"./icon-packs/heroicons\"); }\n catch { throw new Error(\"gridsmith-ui: @heroicons/react is not installed. Run: npm install @heroicons/react\"); }\n break;\n case \"tabler\":\n try { mod = await import(\"./icon-packs/tabler\"); }\n catch { throw new Error(\"gridsmith-ui: @tabler/icons-react is not installed. Run: npm install @tabler/icons-react\"); }\n break;\n case \"feather\":\n try { mod = await import(\"./icon-packs/feather\"); }\n catch { throw new Error(\"gridsmith-ui: react-icons is not installed. Run: npm install react-icons\"); }\n break;\n }\n\n curatedCache.set(pack, mod!.loadCurated());\n notifySubscribers();\n\n mod!.loadExtended().then((extended) => {\n extendedCache.set(pack, extended);\n notifySubscribers();\n });\n}\n\n/** Exported for the icon-completeness test — not part of the public API. */\nexport const packLoaders: Record<IconPack, {\n curated: () => Promise<IconMap>;\n extended: () => Promise<IconMap>;\n}> = {\n lucide: { curated: () => import(\"./icon-packs/lucide\").then((m) => m.loadCurated()), extended: () => import(\"./icon-packs/lucide\").then((m) => m.loadExtended()) },\n phosphor: { curated: () => import(\"./icon-packs/phosphor\").then((m) => m.loadCurated()), extended: () => import(\"./icon-packs/phosphor\").then((m) => m.loadExtended()) },\n heroicons: { curated: () => import(\"./icon-packs/heroicons\").then((m) => m.loadCurated()), extended: () => import(\"./icon-packs/heroicons\").then((m) => m.loadExtended()) },\n tabler: { curated: () => import(\"./icon-packs/tabler\").then((m) => m.loadCurated()), extended: () => import(\"./icon-packs/tabler\").then((m) => m.loadExtended()) },\n feather: { curated: () => import(\"./icon-packs/feather\").then((m) => m.loadCurated()), extended: () => import(\"./icon-packs/feather\").then((m) => m.loadExtended()) },\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 useEffect(() => {\n loadPack(pack);\n if (pack !== \"lucide\") loadPack(\"lucide\");\n }, [pack]);\n\n return <IconCtx.Provider value={{ pack, weight }}>{children}</IconCtx.Provider>;\n}\n\n/**\n * Start loading a pack's icon chunk before React mounts. Call this in your\n * app's entry point (e.g. main.tsx) for the fastest possible cold start:\n *\n * import { preloadPack } from 'gridsmith-ui/icons'\n * preloadPack('lucide')\n */\nexport function preloadPack(pack: IconPack): void {\n loadPack(pack);\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\n const curatedMap = useCuratedMap(pack);\n const extendedMap = useExtendedMap(pack);\n const lucideCurated = useCuratedMap(\"lucide\");\n const lucideExtended = useExtendedMap(\"lucide\");\n\n // Ensure the active pack is loading (covers cases where Icon mounts\n // before IconProvider's useEffect fires, e.g. during SSR hydration)\n if (!curatedCache.has(pack) && !loadingPacks.has(pack)) {\n loadPack(pack);\n }\n\n let Comp: IconComponent | undefined | null = null;\n let renderPack: IconPack = pack;\n\n // Tier 1: curated map (available once pack chunk has loaded)\n if (curatedMap) {\n Comp = curatedMap[name];\n }\n\n // Tier 2: extended map (available after barrel import completes)\n if (!Comp && extendedMap) {\n Comp = extendedMap[name];\n }\n\n // Tier 3: lucide fallback (curated first, then extended)\n if (!Comp && pack !== \"lucide\") {\n const fallback = lucideCurated?.[name] ?? lucideExtended?.[name];\n if (fallback) {\n Comp = fallback;\n renderPack = \"lucide\";\n }\n }\n\n if (!Comp) {\n const allMapsLoaded = curatedMap && extendedMap &&\n (pack === \"lucide\" || (lucideCurated && lucideExtended));\n if (allMapsLoaded) return null;\n return <span style={{ display: \"inline-block\", width: size, height: size }} className={className} />;\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"]}
@@ -0,0 +1,72 @@
1
+ import { buildExtendedMap } from './chunk-GYVBRUO2.js';
2
+ import './chunk-5WRI5ZAA.js';
3
+ import { FiUpload, FiDownload, FiBookmark, FiStar, FiMenu, FiEdit2, FiLogOut, FiSend, FiPaperclip, FiMic, FiMoreVertical, FiArrowLeft, FiRotateCw, FiRotateCcw, FiTrash2, FiChevronDown, FiChevronUp, FiType, FiMinus, FiMessageSquare, FiCode, FiGrid, FiImage, FiLink, FiCheckSquare, FiList, FiAlignRight, FiAlignCenter, FiAlignLeft, FiSlash, FiUnderline, FiItalic, FiBold, FiCalendar, FiClock, FiAlertCircle, FiInfo, FiAlertTriangle, FiCheck, FiUser, FiBell, FiSearch, FiPlus, FiX, FiChevronRight, FiSettings, FiBarChart2, FiFolder, FiHome } from 'react-icons/fi';
4
+
5
+ var curated = {
6
+ "home": FiHome,
7
+ "folder": FiFolder,
8
+ "chart": FiBarChart2,
9
+ "settings": FiSettings,
10
+ "chevron-right": FiChevronRight,
11
+ "close": FiX,
12
+ "plus": FiPlus,
13
+ "search": FiSearch,
14
+ "bell": FiBell,
15
+ "user": FiUser,
16
+ "check": FiCheck,
17
+ "warning": FiAlertTriangle,
18
+ "info": FiInfo,
19
+ "error": FiAlertCircle,
20
+ "clock": FiClock,
21
+ "calendar": FiCalendar,
22
+ "bold": FiBold,
23
+ "italic": FiItalic,
24
+ "underline": FiUnderline,
25
+ "strikethrough": FiSlash,
26
+ "align-left": FiAlignLeft,
27
+ "align-center": FiAlignCenter,
28
+ "align-right": FiAlignRight,
29
+ "list": FiList,
30
+ "list-ordered": FiList,
31
+ "list-checks": FiCheckSquare,
32
+ "link": FiLink,
33
+ "image": FiImage,
34
+ "table": FiGrid,
35
+ "code": FiCode,
36
+ "quote": FiMessageSquare,
37
+ "minus": FiMinus,
38
+ "superscript": FiChevronUp,
39
+ "subscript": FiChevronDown,
40
+ "highlight": FiEdit2,
41
+ "type": FiType,
42
+ "chevron-up": FiChevronUp,
43
+ "chevron-down": FiChevronDown,
44
+ "trash": FiTrash2,
45
+ "undo": FiRotateCcw,
46
+ "redo": FiRotateCw,
47
+ "arrow-left": FiArrowLeft,
48
+ "grip-vertical": FiMoreVertical,
49
+ "mic": FiMic,
50
+ "paperclip": FiPaperclip,
51
+ "send": FiSend,
52
+ "log-out": FiLogOut,
53
+ "edit": FiEdit2,
54
+ "menu": FiMenu,
55
+ "star": FiStar,
56
+ "bookmark": FiBookmark,
57
+ "download": FiDownload,
58
+ "upload": FiUpload
59
+ };
60
+ function loadCurated() {
61
+ return curated;
62
+ }
63
+ async function loadExtended() {
64
+ const F = await import('react-icons/fi');
65
+ const extended = buildExtendedMap(F, {}, { stripPrefix: "Fi" });
66
+ Object.assign(extended, curated);
67
+ return extended;
68
+ }
69
+
70
+ export { loadCurated, loadExtended };
71
+ //# sourceMappingURL=feather-432JQGUB.js.map
72
+ //# sourceMappingURL=feather-432JQGUB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../showcase/src/lib/icon-packs/feather.ts"],"names":[],"mappings":";;;;AAsBA,IAAM,OAAA,GAAmB;AAAA,EACvB,MAAA,EAAQ,MAAA;AAAA,EAAQ,QAAA,EAAU,QAAA;AAAA,EAAU,OAAA,EAAS,WAAA;AAAA,EAAa,UAAA,EAAY,UAAA;AAAA,EACtE,eAAA,EAAiB,cAAA;AAAA,EAAgB,OAAA,EAAS,GAAA;AAAA,EAAK,MAAA,EAAQ,MAAA;AAAA,EAAQ,QAAA,EAAU,QAAA;AAAA,EACzE,MAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA,EAAS,OAAA;AAAA,EAAS,SAAA,EAAW,eAAA;AAAA,EAC7D,MAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA,EAAS,aAAA;AAAA,EAAe,OAAA,EAAS,OAAA;AAAA,EAAS,UAAA,EAAY,UAAA;AAAA,EACtE,MAAA,EAAQ,MAAA;AAAA,EAAQ,QAAA,EAAU,QAAA;AAAA,EAAU,WAAA,EAAa,WAAA;AAAA,EAAa,eAAA,EAAiB,OAAA;AAAA,EAC/E,YAAA,EAAc,WAAA;AAAA,EAAa,cAAA,EAAgB,aAAA;AAAA,EAAe,aAAA,EAAe,YAAA;AAAA,EACzE,MAAA,EAAQ,MAAA;AAAA,EAAQ,cAAA,EAAgB,MAAA;AAAA,EAAQ,aAAA,EAAe,aAAA;AAAA,EACvD,MAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA,EAAS,OAAA;AAAA,EAAS,OAAA,EAAS,MAAA;AAAA,EAAQ,MAAA,EAAQ,MAAA;AAAA,EAC3D,OAAA,EAAS,eAAA;AAAA,EAAiB,OAAA,EAAS,OAAA;AAAA,EAAS,aAAA,EAAe,WAAA;AAAA,EAC3D,WAAA,EAAa,aAAA;AAAA,EAAe,WAAA,EAAa,OAAA;AAAA,EAAS,MAAA,EAAQ,MAAA;AAAA,EAC1D,YAAA,EAAc,WAAA;AAAA,EAAa,cAAA,EAAgB,aAAA;AAAA,EAAe,OAAA,EAAS,QAAA;AAAA,EACnE,MAAA,EAAQ,WAAA;AAAA,EAAa,MAAA,EAAQ,UAAA;AAAA,EAC7B,YAAA,EAAc,WAAA;AAAA,EAAa,eAAA,EAAiB,cAAA;AAAA,EAC5C,KAAA,EAAO,KAAA;AAAA,EAAO,WAAA,EAAa,WAAA;AAAA,EAAa,MAAA,EAAQ,MAAA;AAAA,EAChD,SAAA,EAAW,QAAA;AAAA,EAAU,MAAA,EAAQ,OAAA;AAAA,EAAS,MAAA,EAAQ,MAAA;AAAA,EAC9C,MAAA,EAAQ,MAAA;AAAA,EAAQ,UAAA,EAAY,UAAA;AAAA,EAC5B,UAAA,EAAY,UAAA;AAAA,EAAY,QAAA,EAAU;AACpC,CAAA;AAEO,SAAS,WAAA,GAAuB;AACrC,EAAA,OAAO,OAAA;AACT;AAEA,eAAsB,YAAA,GAAiC;AACrD,EAAA,MAAM,CAAA,GAAI,MAAM,OAAO,gBAAgB,CAAA;AACvC,EAAA,MAAM,QAAA,GAAW,iBAAiB,CAAA,EAAyC,IAAI,EAAE,WAAA,EAAa,MAAM,CAAA;AACpG,EAAA,MAAA,CAAO,MAAA,CAAO,UAAU,OAAO,CAAA;AAC/B,EAAA,OAAO,QAAA;AACT","file":"feather-432JQGUB.js","sourcesContent":["import type { IconMap } from './types'\nimport { buildExtendedMap } from './utils'\nimport {\n FiHome, FiFolder, FiBarChart2, FiSettings,\n FiChevronRight, FiX, FiPlus, FiSearch,\n FiBell, FiUser, FiCheck, FiAlertTriangle,\n FiInfo, FiAlertCircle, FiClock, FiCalendar,\n FiBold, FiItalic, FiUnderline, FiSlash,\n FiAlignLeft, FiAlignCenter, FiAlignRight,\n FiList, FiCheckSquare,\n FiLink, FiImage, FiGrid, FiCode,\n FiMessageSquare, FiMinus, FiChevronUp,\n FiChevronDown, FiEdit2, FiType,\n FiTrash2,\n FiRotateCcw, FiRotateCw,\n FiArrowLeft, FiMoreVertical,\n FiMic, FiPaperclip, FiSend,\n FiLogOut, FiMenu,\n FiStar, FiBookmark,\n FiDownload, FiUpload,\n} from \"react-icons/fi\"\n\nconst curated: IconMap = {\n \"home\": FiHome, \"folder\": FiFolder, \"chart\": FiBarChart2, \"settings\": FiSettings,\n \"chevron-right\": FiChevronRight, \"close\": FiX, \"plus\": FiPlus, \"search\": FiSearch,\n \"bell\": FiBell, \"user\": FiUser, \"check\": FiCheck, \"warning\": FiAlertTriangle,\n \"info\": FiInfo, \"error\": FiAlertCircle, \"clock\": FiClock, \"calendar\": FiCalendar,\n \"bold\": FiBold, \"italic\": FiItalic, \"underline\": FiUnderline, \"strikethrough\": FiSlash,\n \"align-left\": FiAlignLeft, \"align-center\": FiAlignCenter, \"align-right\": FiAlignRight,\n \"list\": FiList, \"list-ordered\": FiList, \"list-checks\": FiCheckSquare,\n \"link\": FiLink, \"image\": FiImage, \"table\": FiGrid, \"code\": FiCode,\n \"quote\": FiMessageSquare, \"minus\": FiMinus, \"superscript\": FiChevronUp,\n \"subscript\": FiChevronDown, \"highlight\": FiEdit2, \"type\": FiType,\n \"chevron-up\": FiChevronUp, \"chevron-down\": FiChevronDown, \"trash\": FiTrash2,\n \"undo\": FiRotateCcw, \"redo\": FiRotateCw,\n \"arrow-left\": FiArrowLeft, \"grip-vertical\": FiMoreVertical,\n \"mic\": FiMic, \"paperclip\": FiPaperclip, \"send\": FiSend,\n \"log-out\": FiLogOut, \"edit\": FiEdit2, \"menu\": FiMenu,\n \"star\": FiStar, \"bookmark\": FiBookmark,\n \"download\": FiDownload, \"upload\": FiUpload,\n}\n\nexport function loadCurated(): IconMap {\n return curated\n}\n\nexport async function loadExtended(): Promise<IconMap> {\n const F = await import(\"react-icons/fi\")\n const extended = buildExtendedMap(F as unknown as Record<string, unknown>, {}, { stripPrefix: \"Fi\" })\n Object.assign(extended, curated)\n return extended\n}\n"]}
@@ -0,0 +1,72 @@
1
+ import { buildExtendedMap } from './chunk-GYVBRUO2.js';
2
+ import './chunk-5WRI5ZAA.js';
3
+ import { ArrowUpTrayIcon, ArrowDownTrayIcon, BookmarkIcon, StarIcon, Bars3Icon, PencilIcon, ArrowRightStartOnRectangleIcon, PaperAirplaneIcon, PaperClipIcon, MicrophoneIcon, Bars2Icon, ArrowLeftIcon, ArrowUturnRightIcon, ArrowUturnLeftIcon, TrashIcon, ChevronDownIcon, ChevronUpIcon, LanguageIcon, PaintBrushIcon, H2Icon, H1Icon, MinusIcon, ChatBubbleBottomCenterTextIcon, CodeBracketIcon, TableCellsIcon, PhotoIcon, LinkIcon, ClipboardDocumentCheckIcon, NumberedListIcon, ListBulletIcon, Bars3BottomRightIcon, Bars3BottomLeftIcon, StrikethroughIcon, UnderlineIcon, ItalicIcon, BoldIcon, CalendarDaysIcon, ClockIcon, ExclamationCircleIcon, InformationCircleIcon, ExclamationTriangleIcon, CheckIcon, UserIcon, BellIcon, MagnifyingGlassIcon, PlusIcon, XMarkIcon, ChevronRightIcon, Cog6ToothIcon, ChartBarIcon, FolderIcon, HomeIcon } from '@heroicons/react/24/outline';
4
+
5
+ var curated = {
6
+ "home": HomeIcon,
7
+ "folder": FolderIcon,
8
+ "chart": ChartBarIcon,
9
+ "settings": Cog6ToothIcon,
10
+ "chevron-right": ChevronRightIcon,
11
+ "close": XMarkIcon,
12
+ "plus": PlusIcon,
13
+ "search": MagnifyingGlassIcon,
14
+ "bell": BellIcon,
15
+ "user": UserIcon,
16
+ "check": CheckIcon,
17
+ "warning": ExclamationTriangleIcon,
18
+ "info": InformationCircleIcon,
19
+ "error": ExclamationCircleIcon,
20
+ "clock": ClockIcon,
21
+ "calendar": CalendarDaysIcon,
22
+ "bold": BoldIcon,
23
+ "italic": ItalicIcon,
24
+ "underline": UnderlineIcon,
25
+ "strikethrough": StrikethroughIcon,
26
+ "align-left": Bars3BottomLeftIcon,
27
+ "align-center": Bars3Icon,
28
+ "align-right": Bars3BottomRightIcon,
29
+ "list": ListBulletIcon,
30
+ "list-ordered": NumberedListIcon,
31
+ "list-checks": ClipboardDocumentCheckIcon,
32
+ "link": LinkIcon,
33
+ "image": PhotoIcon,
34
+ "table": TableCellsIcon,
35
+ "code": CodeBracketIcon,
36
+ "quote": ChatBubbleBottomCenterTextIcon,
37
+ "minus": MinusIcon,
38
+ "superscript": H1Icon,
39
+ "subscript": H2Icon,
40
+ "highlight": PaintBrushIcon,
41
+ "type": LanguageIcon,
42
+ "chevron-up": ChevronUpIcon,
43
+ "chevron-down": ChevronDownIcon,
44
+ "trash": TrashIcon,
45
+ "undo": ArrowUturnLeftIcon,
46
+ "redo": ArrowUturnRightIcon,
47
+ "arrow-left": ArrowLeftIcon,
48
+ "grip-vertical": Bars2Icon,
49
+ "mic": MicrophoneIcon,
50
+ "paperclip": PaperClipIcon,
51
+ "send": PaperAirplaneIcon,
52
+ "log-out": ArrowRightStartOnRectangleIcon,
53
+ "edit": PencilIcon,
54
+ "menu": Bars3Icon,
55
+ "star": StarIcon,
56
+ "bookmark": BookmarkIcon,
57
+ "download": ArrowDownTrayIcon,
58
+ "upload": ArrowUpTrayIcon
59
+ };
60
+ function loadCurated() {
61
+ return curated;
62
+ }
63
+ async function loadExtended() {
64
+ const H = await import('@heroicons/react/24/outline');
65
+ const extended = buildExtendedMap(H, {}, { stripSuffix: "Icon" });
66
+ Object.assign(extended, curated);
67
+ return extended;
68
+ }
69
+
70
+ export { loadCurated, loadExtended };
71
+ //# sourceMappingURL=heroicons-CCKJHFZY.js.map
72
+ //# sourceMappingURL=heroicons-CCKJHFZY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../showcase/src/lib/icon-packs/heroicons.ts"],"names":[],"mappings":";;;;AA2BA,IAAM,OAAA,GAAmB;AAAA,EACvB,MAAA,EAAQ,QAAA;AAAA,EAAU,QAAA,EAAU,UAAA;AAAA,EAAY,OAAA,EAAS,YAAA;AAAA,EACjD,UAAA,EAAY,aAAA;AAAA,EAAe,eAAA,EAAiB,gBAAA;AAAA,EAC5C,OAAA,EAAS,SAAA;AAAA,EAAW,MAAA,EAAQ,QAAA;AAAA,EAAU,QAAA,EAAU,mBAAA;AAAA,EAChD,MAAA,EAAQ,QAAA;AAAA,EAAU,MAAA,EAAQ,QAAA;AAAA,EAAU,OAAA,EAAS,SAAA;AAAA,EAC7C,SAAA,EAAW,uBAAA;AAAA,EAAyB,MAAA,EAAQ,qBAAA;AAAA,EAC5C,OAAA,EAAS,qBAAA;AAAA,EAAuB,OAAA,EAAS,SAAA;AAAA,EAAW,UAAA,EAAY,gBAAA;AAAA,EAChE,MAAA,EAAQ,QAAA;AAAA,EAAU,QAAA,EAAU,UAAA;AAAA,EAAY,WAAA,EAAa,aAAA;AAAA,EACrD,eAAA,EAAiB,iBAAA;AAAA,EAAmB,YAAA,EAAc,mBAAA;AAAA,EAClD,cAAA,EAAgB,SAAA;AAAA,EAAW,aAAA,EAAe,oBAAA;AAAA,EAC1C,MAAA,EAAQ,cAAA;AAAA,EAAgB,cAAA,EAAgB,gBAAA;AAAA,EACxC,aAAA,EAAe,0BAAA;AAAA,EAA4B,MAAA,EAAQ,QAAA;AAAA,EACnD,OAAA,EAAS,SAAA;AAAA,EAAW,OAAA,EAAS,cAAA;AAAA,EAAgB,MAAA,EAAQ,eAAA;AAAA,EACrD,OAAA,EAAS,8BAAA;AAAA,EAAgC,OAAA,EAAS,SAAA;AAAA,EAClD,aAAA,EAAe,MAAA;AAAA,EAAQ,WAAA,EAAa,MAAA;AAAA,EACpC,WAAA,EAAa,cAAA;AAAA,EAAgB,MAAA,EAAQ,YAAA;AAAA,EACrC,YAAA,EAAc,aAAA;AAAA,EAAe,cAAA,EAAgB,eAAA;AAAA,EAAiB,OAAA,EAAS,SAAA;AAAA,EACvE,MAAA,EAAQ,kBAAA;AAAA,EAAoB,MAAA,EAAQ,mBAAA;AAAA,EACpC,YAAA,EAAc,aAAA;AAAA,EAAe,eAAA,EAAiB,SAAA;AAAA,EAC9C,KAAA,EAAO,cAAA;AAAA,EAAgB,WAAA,EAAa,aAAA;AAAA,EAAe,MAAA,EAAQ,iBAAA;AAAA,EAC3D,SAAA,EAAW,8BAAA;AAAA,EAAgC,MAAA,EAAQ,UAAA;AAAA,EAAY,MAAA,EAAQ,SAAA;AAAA,EACvE,MAAA,EAAQ,QAAA;AAAA,EAAU,UAAA,EAAY,YAAA;AAAA,EAC9B,UAAA,EAAY,iBAAA;AAAA,EAAmB,QAAA,EAAU;AAC3C,CAAA;AAEO,SAAS,WAAA,GAAuB;AACrC,EAAA,OAAO,OAAA;AACT;AAEA,eAAsB,YAAA,GAAiC;AACrD,EAAA,MAAM,CAAA,GAAI,MAAM,OAAO,6BAA6B,CAAA;AACpD,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":"heroicons-CCKJHFZY.js","sourcesContent":["import type { IconMap } from './types'\nimport { buildExtendedMap } from './utils'\nimport {\n HomeIcon, FolderIcon, ChartBarIcon,\n Cog6ToothIcon, ChevronRightIcon,\n XMarkIcon, PlusIcon, MagnifyingGlassIcon,\n BellIcon, UserIcon, CheckIcon,\n ExclamationTriangleIcon, InformationCircleIcon,\n ExclamationCircleIcon, ClockIcon, CalendarDaysIcon,\n BoldIcon, ItalicIcon, UnderlineIcon,\n StrikethroughIcon, Bars3BottomLeftIcon,\n Bars3Icon, Bars3BottomRightIcon,\n ListBulletIcon, NumberedListIcon,\n ClipboardDocumentCheckIcon, LinkIcon,\n PhotoIcon, TableCellsIcon, CodeBracketIcon,\n ChatBubbleBottomCenterTextIcon, MinusIcon,\n H1Icon, H2Icon,\n PaintBrushIcon, LanguageIcon,\n ChevronUpIcon, ChevronDownIcon, TrashIcon,\n ArrowUturnLeftIcon, ArrowUturnRightIcon,\n ArrowLeftIcon, Bars2Icon,\n MicrophoneIcon, PaperClipIcon, PaperAirplaneIcon,\n ArrowRightStartOnRectangleIcon, PencilIcon,\n StarIcon, BookmarkIcon,\n ArrowDownTrayIcon, ArrowUpTrayIcon,\n} from \"@heroicons/react/24/outline\"\n\nconst curated: IconMap = {\n \"home\": HomeIcon, \"folder\": FolderIcon, \"chart\": ChartBarIcon,\n \"settings\": Cog6ToothIcon, \"chevron-right\": ChevronRightIcon,\n \"close\": XMarkIcon, \"plus\": PlusIcon, \"search\": MagnifyingGlassIcon,\n \"bell\": BellIcon, \"user\": UserIcon, \"check\": CheckIcon,\n \"warning\": ExclamationTriangleIcon, \"info\": InformationCircleIcon,\n \"error\": ExclamationCircleIcon, \"clock\": ClockIcon, \"calendar\": CalendarDaysIcon,\n \"bold\": BoldIcon, \"italic\": ItalicIcon, \"underline\": UnderlineIcon,\n \"strikethrough\": StrikethroughIcon, \"align-left\": Bars3BottomLeftIcon,\n \"align-center\": Bars3Icon, \"align-right\": Bars3BottomRightIcon,\n \"list\": ListBulletIcon, \"list-ordered\": NumberedListIcon,\n \"list-checks\": ClipboardDocumentCheckIcon, \"link\": LinkIcon,\n \"image\": PhotoIcon, \"table\": TableCellsIcon, \"code\": CodeBracketIcon,\n \"quote\": ChatBubbleBottomCenterTextIcon, \"minus\": MinusIcon,\n \"superscript\": H1Icon, \"subscript\": H2Icon,\n \"highlight\": PaintBrushIcon, \"type\": LanguageIcon,\n \"chevron-up\": ChevronUpIcon, \"chevron-down\": ChevronDownIcon, \"trash\": TrashIcon,\n \"undo\": ArrowUturnLeftIcon, \"redo\": ArrowUturnRightIcon,\n \"arrow-left\": ArrowLeftIcon, \"grip-vertical\": Bars2Icon,\n \"mic\": MicrophoneIcon, \"paperclip\": PaperClipIcon, \"send\": PaperAirplaneIcon,\n \"log-out\": ArrowRightStartOnRectangleIcon, \"edit\": PencilIcon, \"menu\": Bars3Icon,\n \"star\": StarIcon, \"bookmark\": BookmarkIcon,\n \"download\": ArrowDownTrayIcon, \"upload\": ArrowUpTrayIcon,\n}\n\nexport function loadCurated(): IconMap {\n return curated\n}\n\nexport async function loadExtended(): Promise<IconMap> {\n const H = await import(\"@heroicons/react/24/outline\")\n const extended = buildExtendedMap(H as unknown as Record<string, unknown>, {}, { stripSuffix: \"Icon\" })\n Object.assign(extended, curated)\n return extended\n}\n"]}
package/dist/icons.d.ts CHANGED
@@ -21,10 +21,18 @@ declare function IconProvider({ pack, weight, children }: {
21
21
  weight: number;
22
22
  children: ReactNode;
23
23
  }): react_jsx_runtime.JSX.Element;
24
+ /**
25
+ * Start loading a pack's icon chunk before React mounts. Call this in your
26
+ * app's entry point (e.g. main.tsx) for the fastest possible cold start:
27
+ *
28
+ * import { preloadPack } from 'gridsmith-ui/icons'
29
+ * preloadPack('lucide')
30
+ */
31
+ declare function preloadPack(pack: IconPack): void;
24
32
  declare function Icon({ name, size, className }: {
25
33
  name: IconName;
26
34
  size?: number;
27
35
  className?: string;
28
36
  }): react_jsx_runtime.JSX.Element | null;
29
37
 
30
- export { Icon, type IconName, type IconPack, IconProvider };
38
+ export { Icon, type IconName, type IconPack, IconProvider, preloadPack };
package/dist/icons.js CHANGED
@@ -1,4 +1,4 @@
1
- export { Icon, IconProvider } from './chunk-WVB3SRXW.js';
1
+ export { Icon, IconProvider, preloadPack } from './chunk-6TMNEBBJ.js';
2
2
  import './chunk-5WRI5ZAA.js';
3
3
  //# sourceMappingURL=icons.js.map
4
4
  //# sourceMappingURL=icons.js.map
package/dist/index.d.ts CHANGED
@@ -43,6 +43,7 @@ declare function DropdownMenu({ trigger, items, align, className, container }: D
43
43
 
44
44
  interface BulkAction {
45
45
  label: string;
46
+ icon?: IconName;
46
47
  onClick: () => void;
47
48
  variant?: "default" | "destructive";
48
49
  }
@@ -332,15 +333,17 @@ interface TransferListProps {
332
333
  }
333
334
  declare function TransferList({ available, selected, onChange, availableTitle, selectedTitle, searchable, className, ref, }: TransferListProps): react_jsx_runtime.JSX.Element;
334
335
 
336
+ type ToolbarGroup = "blockType" | "fontFamily" | "textSize" | "formatting" | "colors" | "alignment" | "lists" | "blocks" | "insert" | "extras" | "history";
335
337
  interface RichTextEditorProps {
336
338
  content?: string;
337
339
  placeholder?: string;
338
340
  onChange?: (html: string) => void;
339
341
  editable?: boolean;
342
+ toolbar?: ToolbarGroup[] | "full" | "minimal";
340
343
  className?: string;
341
344
  ref?: Ref<HTMLDivElement>;
342
345
  }
343
- declare function RichTextEditor({ content, placeholder, onChange, editable, className, ref, }: RichTextEditorProps): react_jsx_runtime.JSX.Element | null;
346
+ declare function RichTextEditor({ content, placeholder, onChange, editable, toolbar, className, ref, }: RichTextEditorProps): react_jsx_runtime.JSX.Element | null;
344
347
 
345
348
  interface MentionSuggestion {
346
349
  id: string;
@@ -494,6 +497,7 @@ interface EventCategory {
494
497
  label: string;
495
498
  }
496
499
  type CalendarView = "month" | "week" | "year";
500
+ type CalendarSize = "default" | "compact";
497
501
  interface CalendarProps {
498
502
  events?: CalendarEvent[];
499
503
  view?: CalendarView;
@@ -510,10 +514,11 @@ interface CalendarProps {
510
514
  onDayClick?: (date: Date) => void;
511
515
  categories?: Record<string, EventCategory>;
512
516
  weekStartsOn?: 0 | 1;
517
+ size?: CalendarSize;
513
518
  className?: string;
514
519
  }
515
520
 
516
- declare function Calendar({ events, view: controlledView, defaultView, onViewChange, date: controlledDate, defaultDate, onDateChange, onDateRangeChange, onEventClick, onDayClick, categories, weekStartsOn, className, }: CalendarProps): react_jsx_runtime.JSX.Element;
521
+ declare function Calendar({ events, view: controlledView, defaultView, onViewChange, date: controlledDate, defaultDate, onDateChange, onDateRangeChange, onEventClick, onDayClick, categories, weekStartsOn, size, className, }: CalendarProps): react_jsx_runtime.JSX.Element;
517
522
 
518
523
  type BadgeVariant = "default" | "neutral" | "subtle" | "success" | "success-soft" | "warning" | "warning-soft" | "error" | "error-soft" | "outline";
519
524
  type BadgeSize = "xs" | "sm" | "md";
@@ -570,7 +575,7 @@ interface TimelineItem {
570
575
  }
571
576
  interface TimelineProps {
572
577
  items: TimelineItem[];
573
- orientation?: "vertical" | "horizontal";
578
+ orientation?: "vertical" | "horizontal" | "responsive";
574
579
  className?: string;
575
580
  ref?: Ref<HTMLDivElement>;
576
581
  }
@@ -733,6 +738,7 @@ interface StackedListItem {
733
738
  interface StackedListProps {
734
739
  items: StackedListItem[];
735
740
  divided?: boolean;
741
+ flush?: boolean;
736
742
  className?: string;
737
743
  }
738
744
  declare const StackedList: react.ForwardRefExoticComponent<StackedListProps & react.RefAttributes<HTMLUListElement>>;
@@ -1043,7 +1049,7 @@ interface DrawerProps {
1043
1049
  onClose: () => void;
1044
1050
  position?: "left" | "right" | "bottom";
1045
1051
  width?: string;
1046
- title?: string;
1052
+ title?: ReactNode;
1047
1053
  children: ReactNode;
1048
1054
  footer?: ReactNode;
1049
1055
  container?: Element | DocumentFragment;
@@ -1262,9 +1268,10 @@ type PanelGroupProps = ComponentProps<typeof Group>;
1262
1268
  type Direction = "horizontal" | "vertical";
1263
1269
  interface ResizablePanelGroupProps extends Omit<PanelGroupProps, "className" | "orientation"> {
1264
1270
  direction?: Direction;
1271
+ stackOnMobile?: boolean;
1265
1272
  className?: string;
1266
1273
  }
1267
- declare function ResizablePanelGroup({ className, direction, ...props }: ResizablePanelGroupProps): react_jsx_runtime.JSX.Element;
1274
+ declare function ResizablePanelGroup({ className, direction, stackOnMobile, ...props }: ResizablePanelGroupProps): react_jsx_runtime.JSX.Element;
1268
1275
  type PanelProps = ComponentProps<typeof Panel>;
1269
1276
  interface ResizablePanelProps extends Omit<PanelProps, "className"> {
1270
1277
  className?: string;