gridsmith-ui 0.3.0 → 0.3.2

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,30 @@
1
+ // ../../showcase/src/lib/icon-packs/utils.ts
2
+ function pascalToKebab(s) {
3
+ return s.replace(/([a-z0-9])([A-Z])/g, "$1-$2").replace(/([A-Z])([A-Z][a-z])/g, "$1-$2").replace(/([a-zA-Z])(\d)/g, "$1-$2").replace(/(\d)([a-zA-Z])/g, "$1-$2").toLowerCase();
4
+ }
5
+ function isRenderableComponent(value) {
6
+ if (typeof value === "function") return true;
7
+ return typeof value === "object" && value !== null && "$$typeof" in value;
8
+ }
9
+ function buildExtendedMap(mod, aliases, opts) {
10
+ const map = {};
11
+ for (const [exportName, value] of Object.entries(mod)) {
12
+ if (!isRenderableComponent(value)) continue;
13
+ if (!exportName[0] || exportName[0] !== exportName[0].toUpperCase()) continue;
14
+ let name = exportName;
15
+ if (opts?.stripPrefix && name.startsWith(opts.stripPrefix)) {
16
+ name = name.slice(opts.stripPrefix.length);
17
+ }
18
+ if (opts?.stripSuffix && name.endsWith(opts.stripSuffix)) {
19
+ name = name.slice(0, -opts.stripSuffix.length);
20
+ }
21
+ if (!name) continue;
22
+ map[pascalToKebab(name)] = value;
23
+ }
24
+ Object.assign(map, aliases);
25
+ return map;
26
+ }
27
+
28
+ export { buildExtendedMap };
29
+ //# sourceMappingURL=chunk-GYVBRUO2.js.map
30
+ //# sourceMappingURL=chunk-GYVBRUO2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../showcase/src/lib/icon-packs/utils.ts"],"names":[],"mappings":";AAEA,SAAS,cAAc,CAAA,EAAmB;AACxC,EAAA,OAAO,EACJ,OAAA,CAAQ,oBAAA,EAAsB,OAAO,CAAA,CACrC,QAAQ,sBAAA,EAAwB,OAAO,CAAA,CACvC,OAAA,CAAQ,mBAAmB,OAAO,CAAA,CAClC,QAAQ,iBAAA,EAAmB,OAAO,EAClC,WAAA,EAAY;AACjB;AAEA,SAAS,sBAAsB,KAAA,EAAyB;AACtD,EAAA,IAAI,OAAO,KAAA,KAAU,UAAA,EAAY,OAAO,IAAA;AACxC,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,UAAA,IAAc,KAAA;AACtE;AAEO,SAAS,gBAAA,CACd,GAAA,EACA,OAAA,EACA,IAAA,EACS;AACT,EAAA,MAAM,MAAe,EAAC;AAEtB,EAAA,KAAA,MAAW,CAAC,UAAA,EAAY,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AACrD,IAAA,IAAI,CAAC,qBAAA,CAAsB,KAAK,CAAA,EAAG;AACnC,IAAA,IAAI,CAAC,UAAA,CAAW,CAAC,CAAA,IAAK,UAAA,CAAW,CAAC,CAAA,KAAM,UAAA,CAAW,CAAC,CAAA,CAAE,WAAA,EAAY,EAAG;AAErE,IAAA,IAAI,IAAA,GAAO,UAAA;AACX,IAAA,IAAI,MAAM,WAAA,IAAe,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,WAAW,CAAA,EAAG;AAC1D,MAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AAAA,IAC3C;AACA,IAAA,IAAI,MAAM,WAAA,IAAe,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,WAAW,CAAA,EAAG;AACxD,MAAA,IAAA,GAAO,KAAK,KAAA,CAAM,CAAA,EAAG,CAAC,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,IAC/C;AACA,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,GAAA,CAAI,aAAA,CAAc,IAAI,CAAC,CAAA,GAAI,KAAA;AAAA,EAC7B;AAEA,EAAA,MAAA,CAAO,MAAA,CAAO,KAAK,OAAO,CAAA;AAC1B,EAAA,OAAO,GAAA;AACT","file":"chunk-GYVBRUO2.js","sourcesContent":["import type { IconMap, IconComponent } from './types'\n\nfunction pascalToKebab(s: string): string {\n return s\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/([A-Z])([A-Z][a-z])/g, \"$1-$2\")\n .replace(/([a-zA-Z])(\\d)/g, \"$1-$2\")\n .replace(/(\\d)([a-zA-Z])/g, \"$1-$2\")\n .toLowerCase()\n}\n\nfunction isRenderableComponent(value: unknown): boolean {\n if (typeof value === \"function\") return true\n return typeof value === \"object\" && value !== null && \"$$typeof\" in value\n}\n\nexport function buildExtendedMap(\n mod: Record<string, unknown>,\n aliases: IconMap,\n opts?: { stripPrefix?: string; stripSuffix?: string },\n): IconMap {\n const map: IconMap = {}\n\n for (const [exportName, value] of Object.entries(mod)) {\n if (!isRenderableComponent(value)) continue\n if (!exportName[0] || exportName[0] !== exportName[0].toUpperCase()) continue\n\n let name = exportName\n if (opts?.stripPrefix && name.startsWith(opts.stripPrefix)) {\n name = name.slice(opts.stripPrefix.length)\n }\n if (opts?.stripSuffix && name.endsWith(opts.stripSuffix)) {\n name = name.slice(0, -opts.stripSuffix.length)\n }\n if (!name) continue\n\n map[pascalToKebab(name)] = value as IconComponent\n }\n\n Object.assign(map, aliases)\n return map\n}\n"]}
@@ -0,0 +1,82 @@
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
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,72 @@
1
+ import { buildExtendedMap } from './chunk-GYVBRUO2.js';
2
+ import './chunk-5WRI5ZAA.js';
3
+
4
+ // ../../showcase/src/lib/icon-packs/feather.ts
5
+ async function load() {
6
+ let F;
7
+ try {
8
+ F = await import('react-icons/fi');
9
+ } catch {
10
+ throw new Error("gridsmith-ui: react-icons is not installed. Run: npm install react-icons");
11
+ }
12
+ const aliases = {
13
+ "home": F.FiHome,
14
+ "folder": F.FiFolder,
15
+ "chart": F.FiBarChart2,
16
+ "settings": F.FiSettings,
17
+ "chevron-right": F.FiChevronRight,
18
+ "close": F.FiX,
19
+ "plus": F.FiPlus,
20
+ "search": F.FiSearch,
21
+ "bell": F.FiBell,
22
+ "user": F.FiUser,
23
+ "check": F.FiCheck,
24
+ "warning": F.FiAlertTriangle,
25
+ "info": F.FiInfo,
26
+ "error": F.FiAlertCircle,
27
+ "clock": F.FiClock,
28
+ "calendar": F.FiCalendar,
29
+ "bold": F.FiBold,
30
+ "italic": F.FiItalic,
31
+ "underline": F.FiUnderline,
32
+ "strikethrough": F.FiSlash,
33
+ "align-left": F.FiAlignLeft,
34
+ "align-center": F.FiAlignCenter,
35
+ "align-right": F.FiAlignRight,
36
+ "list": F.FiList,
37
+ "list-ordered": F.FiList,
38
+ "list-checks": F.FiCheckSquare,
39
+ "link": F.FiLink,
40
+ "image": F.FiImage,
41
+ "table": F.FiGrid,
42
+ "code": F.FiCode,
43
+ "quote": F.FiMessageSquare,
44
+ "minus": F.FiMinus,
45
+ "superscript": F.FiChevronUp,
46
+ "subscript": F.FiChevronDown,
47
+ "highlight": F.FiEdit2,
48
+ "type": F.FiType,
49
+ "chevron-up": F.FiChevronUp,
50
+ "chevron-down": F.FiChevronDown,
51
+ "trash": F.FiTrash2,
52
+ "undo": F.FiRotateCcw,
53
+ "redo": F.FiRotateCw,
54
+ "arrow-left": F.FiArrowLeft,
55
+ "grip-vertical": F.FiMoreVertical,
56
+ "mic": F.FiMic,
57
+ "paperclip": F.FiPaperclip,
58
+ "send": F.FiSend,
59
+ "log-out": F.FiLogOut,
60
+ "edit": F.FiEdit2,
61
+ "menu": F.FiMenu,
62
+ "star": F.FiStar,
63
+ "bookmark": F.FiBookmark,
64
+ "download": F.FiDownload,
65
+ "upload": F.FiUpload
66
+ };
67
+ return buildExtendedMap(F, aliases, { stripPrefix: "Fi" });
68
+ }
69
+
70
+ export { load };
71
+ //# sourceMappingURL=feather-N37QZ7LA.js.map
72
+ //# sourceMappingURL=feather-N37QZ7LA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../showcase/src/lib/icon-packs/feather.ts"],"names":[],"mappings":";;;;AAGA,eAAsB,IAAA,GAAyB;AAC7C,EAAA,IAAI,CAAA;AACJ,EAAA,IAAI;AAAE,IAAA,CAAA,GAAI,MAAM,OAAO,gBAAgB,CAAA;AAAA,EAAE,CAAA,CAAA,MACnC;AAAE,IAAA,MAAM,IAAI,MAAM,0EAA0E,CAAA;AAAA,EAAE;AACpG,EAAA,MAAM,OAAA,GAAmB;AAAA,IACvB,QAAQ,CAAA,CAAE,MAAA;AAAA,IAAQ,UAAU,CAAA,CAAE,QAAA;AAAA,IAAU,SAAS,CAAA,CAAE,WAAA;AAAA,IAAa,YAAY,CAAA,CAAE,UAAA;AAAA,IAC9E,iBAAiB,CAAA,CAAE,cAAA;AAAA,IAAgB,SAAS,CAAA,CAAE,GAAA;AAAA,IAAK,QAAQ,CAAA,CAAE,MAAA;AAAA,IAAQ,UAAU,CAAA,CAAE,QAAA;AAAA,IACjF,QAAQ,CAAA,CAAE,MAAA;AAAA,IAAQ,QAAQ,CAAA,CAAE,MAAA;AAAA,IAAQ,SAAS,CAAA,CAAE,OAAA;AAAA,IAAS,WAAW,CAAA,CAAE,eAAA;AAAA,IACrE,QAAQ,CAAA,CAAE,MAAA;AAAA,IAAQ,SAAS,CAAA,CAAE,aAAA;AAAA,IAAe,SAAS,CAAA,CAAE,OAAA;AAAA,IAAS,YAAY,CAAA,CAAE,UAAA;AAAA,IAC9E,QAAQ,CAAA,CAAE,MAAA;AAAA,IAAQ,UAAU,CAAA,CAAE,QAAA;AAAA,IAAU,aAAa,CAAA,CAAE,WAAA;AAAA,IAAa,iBAAiB,CAAA,CAAE,OAAA;AAAA,IACvF,cAAc,CAAA,CAAE,WAAA;AAAA,IAAa,gBAAgB,CAAA,CAAE,aAAA;AAAA,IAAe,eAAe,CAAA,CAAE,YAAA;AAAA,IAC/E,QAAQ,CAAA,CAAE,MAAA;AAAA,IAAQ,gBAAgB,CAAA,CAAE,MAAA;AAAA,IAAQ,eAAe,CAAA,CAAE,aAAA;AAAA,IAC7D,QAAQ,CAAA,CAAE,MAAA;AAAA,IAAQ,SAAS,CAAA,CAAE,OAAA;AAAA,IAAS,SAAS,CAAA,CAAE,MAAA;AAAA,IAAQ,QAAQ,CAAA,CAAE,MAAA;AAAA,IACnE,SAAS,CAAA,CAAE,eAAA;AAAA,IAAiB,SAAS,CAAA,CAAE,OAAA;AAAA,IAAS,eAAe,CAAA,CAAE,WAAA;AAAA,IACjE,aAAa,CAAA,CAAE,aAAA;AAAA,IAAe,aAAa,CAAA,CAAE,OAAA;AAAA,IAAS,QAAQ,CAAA,CAAE,MAAA;AAAA,IAChE,cAAc,CAAA,CAAE,WAAA;AAAA,IAAa,gBAAgB,CAAA,CAAE,aAAA;AAAA,IAAe,SAAS,CAAA,CAAE,QAAA;AAAA,IACzE,QAAQ,CAAA,CAAE,WAAA;AAAA,IAAa,QAAQ,CAAA,CAAE,UAAA;AAAA,IACjC,cAAc,CAAA,CAAE,WAAA;AAAA,IAAa,iBAAiB,CAAA,CAAE,cAAA;AAAA,IAChD,OAAO,CAAA,CAAE,KAAA;AAAA,IAAO,aAAa,CAAA,CAAE,WAAA;AAAA,IAAa,QAAQ,CAAA,CAAE,MAAA;AAAA,IACtD,WAAW,CAAA,CAAE,QAAA;AAAA,IAAU,QAAQ,CAAA,CAAE,OAAA;AAAA,IAAS,QAAQ,CAAA,CAAE,MAAA;AAAA,IACpD,QAAQ,CAAA,CAAE,MAAA;AAAA,IAAQ,YAAY,CAAA,CAAE,UAAA;AAAA,IAChC,YAAY,CAAA,CAAE,UAAA;AAAA,IAAY,UAAU,CAAA,CAAE;AAAA,GACxC;AACA,EAAA,OAAO,iBAAiB,CAAA,EAAyC,OAAA,EAAS,EAAE,WAAA,EAAa,MAAM,CAAA;AACjG","file":"feather-N37QZ7LA.js","sourcesContent":["import type { IconMap } from './types'\nimport { buildExtendedMap } from './utils'\n\nexport async function load(): Promise<IconMap> {\n let F: typeof import(\"react-icons/fi\")\n try { F = await import(\"react-icons/fi\") }\n catch { throw new Error('gridsmith-ui: react-icons is not installed. Run: npm install react-icons') }\n const aliases: IconMap = {\n \"home\": F.FiHome, \"folder\": F.FiFolder, \"chart\": F.FiBarChart2, \"settings\": F.FiSettings,\n \"chevron-right\": F.FiChevronRight, \"close\": F.FiX, \"plus\": F.FiPlus, \"search\": F.FiSearch,\n \"bell\": F.FiBell, \"user\": F.FiUser, \"check\": F.FiCheck, \"warning\": F.FiAlertTriangle,\n \"info\": F.FiInfo, \"error\": F.FiAlertCircle, \"clock\": F.FiClock, \"calendar\": F.FiCalendar,\n \"bold\": F.FiBold, \"italic\": F.FiItalic, \"underline\": F.FiUnderline, \"strikethrough\": F.FiSlash,\n \"align-left\": F.FiAlignLeft, \"align-center\": F.FiAlignCenter, \"align-right\": F.FiAlignRight,\n \"list\": F.FiList, \"list-ordered\": F.FiList, \"list-checks\": F.FiCheckSquare,\n \"link\": F.FiLink, \"image\": F.FiImage, \"table\": F.FiGrid, \"code\": F.FiCode,\n \"quote\": F.FiMessageSquare, \"minus\": F.FiMinus, \"superscript\": F.FiChevronUp,\n \"subscript\": F.FiChevronDown, \"highlight\": F.FiEdit2, \"type\": F.FiType,\n \"chevron-up\": F.FiChevronUp, \"chevron-down\": F.FiChevronDown, \"trash\": F.FiTrash2,\n \"undo\": F.FiRotateCcw, \"redo\": F.FiRotateCw,\n \"arrow-left\": F.FiArrowLeft, \"grip-vertical\": F.FiMoreVertical,\n \"mic\": F.FiMic, \"paperclip\": F.FiPaperclip, \"send\": F.FiSend,\n \"log-out\": F.FiLogOut, \"edit\": F.FiEdit2, \"menu\": F.FiMenu,\n \"star\": F.FiStar, \"bookmark\": F.FiBookmark,\n \"download\": F.FiDownload, \"upload\": F.FiUpload,\n }\n return buildExtendedMap(F as unknown as Record<string, unknown>, aliases, { stripPrefix: \"Fi\" })\n}\n"]}
@@ -0,0 +1,72 @@
1
+ import { buildExtendedMap } from './chunk-GYVBRUO2.js';
2
+ import './chunk-5WRI5ZAA.js';
3
+
4
+ // ../../showcase/src/lib/icon-packs/heroicons.ts
5
+ async function load() {
6
+ let H;
7
+ try {
8
+ H = await import('@heroicons/react/24/outline');
9
+ } catch {
10
+ throw new Error("gridsmith-ui: @heroicons/react is not installed. Run: npm install @heroicons/react");
11
+ }
12
+ const aliases = {
13
+ "home": H.HomeIcon,
14
+ "folder": H.FolderIcon,
15
+ "chart": H.ChartBarIcon,
16
+ "settings": H.Cog6ToothIcon,
17
+ "chevron-right": H.ChevronRightIcon,
18
+ "close": H.XMarkIcon,
19
+ "plus": H.PlusIcon,
20
+ "search": H.MagnifyingGlassIcon,
21
+ "bell": H.BellIcon,
22
+ "user": H.UserIcon,
23
+ "check": H.CheckIcon,
24
+ "warning": H.ExclamationTriangleIcon,
25
+ "info": H.InformationCircleIcon,
26
+ "error": H.ExclamationCircleIcon,
27
+ "clock": H.ClockIcon,
28
+ "calendar": H.CalendarDaysIcon,
29
+ "bold": H.BoldIcon,
30
+ "italic": H.ItalicIcon,
31
+ "underline": H.UnderlineIcon,
32
+ "strikethrough": H.StrikethroughIcon,
33
+ "align-left": H.Bars3BottomLeftIcon,
34
+ "align-center": H.Bars3Icon,
35
+ "align-right": H.Bars3BottomRightIcon,
36
+ "list": H.ListBulletIcon,
37
+ "list-ordered": H.NumberedListIcon,
38
+ "list-checks": H.ClipboardDocumentCheckIcon,
39
+ "link": H.LinkIcon,
40
+ "image": H.PhotoIcon,
41
+ "table": H.TableCellsIcon,
42
+ "code": H.CodeBracketIcon,
43
+ "quote": H.ChatBubbleBottomCenterTextIcon,
44
+ "minus": H.MinusIcon,
45
+ "superscript": H.H1Icon,
46
+ "subscript": H.H2Icon,
47
+ "highlight": H.PaintBrushIcon,
48
+ "type": H.LanguageIcon,
49
+ "chevron-up": H.ChevronUpIcon,
50
+ "chevron-down": H.ChevronDownIcon,
51
+ "trash": H.TrashIcon,
52
+ "undo": H.ArrowUturnLeftIcon,
53
+ "redo": H.ArrowUturnRightIcon,
54
+ "arrow-left": H.ArrowLeftIcon,
55
+ "grip-vertical": H.Bars2Icon,
56
+ "mic": H.MicrophoneIcon,
57
+ "paperclip": H.PaperClipIcon,
58
+ "send": H.PaperAirplaneIcon,
59
+ "log-out": H.ArrowRightStartOnRectangleIcon,
60
+ "edit": H.PencilIcon,
61
+ "menu": H.Bars3Icon,
62
+ "star": H.StarIcon,
63
+ "bookmark": H.BookmarkIcon,
64
+ "download": H.ArrowDownTrayIcon,
65
+ "upload": H.ArrowUpTrayIcon
66
+ };
67
+ return buildExtendedMap(H, aliases, { stripSuffix: "Icon" });
68
+ }
69
+
70
+ export { load };
71
+ //# sourceMappingURL=heroicons-HJTKMLIJ.js.map
72
+ //# sourceMappingURL=heroicons-HJTKMLIJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../showcase/src/lib/icon-packs/heroicons.ts"],"names":[],"mappings":";;;;AAGA,eAAsB,IAAA,GAAyB;AAC7C,EAAA,IAAI,CAAA;AACJ,EAAA,IAAI;AAAE,IAAA,CAAA,GAAI,MAAM,OAAO,6BAA6B,CAAA;AAAA,EAAE,CAAA,CAAA,MAChD;AAAE,IAAA,MAAM,IAAI,MAAM,oFAAoF,CAAA;AAAA,EAAE;AAC9G,EAAA,MAAM,OAAA,GAAmB;AAAA,IACvB,QAAQ,CAAA,CAAE,QAAA;AAAA,IAAU,UAAU,CAAA,CAAE,UAAA;AAAA,IAAY,SAAS,CAAA,CAAE,YAAA;AAAA,IACvD,YAAY,CAAA,CAAE,aAAA;AAAA,IAAe,iBAAiB,CAAA,CAAE,gBAAA;AAAA,IAChD,SAAS,CAAA,CAAE,SAAA;AAAA,IAAW,QAAQ,CAAA,CAAE,QAAA;AAAA,IAAU,UAAU,CAAA,CAAE,mBAAA;AAAA,IACtD,QAAQ,CAAA,CAAE,QAAA;AAAA,IAAU,QAAQ,CAAA,CAAE,QAAA;AAAA,IAAU,SAAS,CAAA,CAAE,SAAA;AAAA,IACnD,WAAW,CAAA,CAAE,uBAAA;AAAA,IAAyB,QAAQ,CAAA,CAAE,qBAAA;AAAA,IAChD,SAAS,CAAA,CAAE,qBAAA;AAAA,IAAuB,SAAS,CAAA,CAAE,SAAA;AAAA,IAAW,YAAY,CAAA,CAAE,gBAAA;AAAA,IACtE,QAAQ,CAAA,CAAE,QAAA;AAAA,IAAU,UAAU,CAAA,CAAE,UAAA;AAAA,IAAY,aAAa,CAAA,CAAE,aAAA;AAAA,IAC3D,iBAAiB,CAAA,CAAE,iBAAA;AAAA,IAAmB,cAAc,CAAA,CAAE,mBAAA;AAAA,IACtD,gBAAgB,CAAA,CAAE,SAAA;AAAA,IAAW,eAAe,CAAA,CAAE,oBAAA;AAAA,IAC9C,QAAQ,CAAA,CAAE,cAAA;AAAA,IAAgB,gBAAgB,CAAA,CAAE,gBAAA;AAAA,IAC5C,eAAe,CAAA,CAAE,0BAAA;AAAA,IAA4B,QAAQ,CAAA,CAAE,QAAA;AAAA,IACvD,SAAS,CAAA,CAAE,SAAA;AAAA,IAAW,SAAS,CAAA,CAAE,cAAA;AAAA,IAAgB,QAAQ,CAAA,CAAE,eAAA;AAAA,IAC3D,SAAS,CAAA,CAAE,8BAAA;AAAA,IAAgC,SAAS,CAAA,CAAE,SAAA;AAAA,IACtD,eAAe,CAAA,CAAE,MAAA;AAAA,IAAQ,aAAa,CAAA,CAAE,MAAA;AAAA,IACxC,aAAa,CAAA,CAAE,cAAA;AAAA,IAAgB,QAAQ,CAAA,CAAE,YAAA;AAAA,IACzC,cAAc,CAAA,CAAE,aAAA;AAAA,IAAe,gBAAgB,CAAA,CAAE,eAAA;AAAA,IAAiB,SAAS,CAAA,CAAE,SAAA;AAAA,IAC7E,QAAQ,CAAA,CAAE,kBAAA;AAAA,IAAoB,QAAQ,CAAA,CAAE,mBAAA;AAAA,IACxC,cAAc,CAAA,CAAE,aAAA;AAAA,IAAe,iBAAiB,CAAA,CAAE,SAAA;AAAA,IAClD,OAAO,CAAA,CAAE,cAAA;AAAA,IAAgB,aAAa,CAAA,CAAE,aAAA;AAAA,IAAe,QAAQ,CAAA,CAAE,iBAAA;AAAA,IACjE,WAAW,CAAA,CAAE,8BAAA;AAAA,IAAgC,QAAQ,CAAA,CAAE,UAAA;AAAA,IAAY,QAAQ,CAAA,CAAE,SAAA;AAAA,IAC7E,QAAQ,CAAA,CAAE,QAAA;AAAA,IAAU,YAAY,CAAA,CAAE,YAAA;AAAA,IAClC,YAAY,CAAA,CAAE,iBAAA;AAAA,IAAmB,UAAU,CAAA,CAAE;AAAA,GAC/C;AACA,EAAA,OAAO,iBAAiB,CAAA,EAAyC,OAAA,EAAS,EAAE,WAAA,EAAa,QAAQ,CAAA;AACnG","file":"heroicons-HJTKMLIJ.js","sourcesContent":["import type { IconMap } from './types'\nimport { buildExtendedMap } from './utils'\n\nexport async function load(): Promise<IconMap> {\n let H: typeof import(\"@heroicons/react/24/outline\")\n try { H = await import(\"@heroicons/react/24/outline\") }\n catch { throw new Error('gridsmith-ui: @heroicons/react is not installed. Run: npm install @heroicons/react') }\n const aliases: IconMap = {\n \"home\": H.HomeIcon, \"folder\": H.FolderIcon, \"chart\": H.ChartBarIcon,\n \"settings\": H.Cog6ToothIcon, \"chevron-right\": H.ChevronRightIcon,\n \"close\": H.XMarkIcon, \"plus\": H.PlusIcon, \"search\": H.MagnifyingGlassIcon,\n \"bell\": H.BellIcon, \"user\": H.UserIcon, \"check\": H.CheckIcon,\n \"warning\": H.ExclamationTriangleIcon, \"info\": H.InformationCircleIcon,\n \"error\": H.ExclamationCircleIcon, \"clock\": H.ClockIcon, \"calendar\": H.CalendarDaysIcon,\n \"bold\": H.BoldIcon, \"italic\": H.ItalicIcon, \"underline\": H.UnderlineIcon,\n \"strikethrough\": H.StrikethroughIcon, \"align-left\": H.Bars3BottomLeftIcon,\n \"align-center\": H.Bars3Icon, \"align-right\": H.Bars3BottomRightIcon,\n \"list\": H.ListBulletIcon, \"list-ordered\": H.NumberedListIcon,\n \"list-checks\": H.ClipboardDocumentCheckIcon, \"link\": H.LinkIcon,\n \"image\": H.PhotoIcon, \"table\": H.TableCellsIcon, \"code\": H.CodeBracketIcon,\n \"quote\": H.ChatBubbleBottomCenterTextIcon, \"minus\": H.MinusIcon,\n \"superscript\": H.H1Icon, \"subscript\": H.H2Icon,\n \"highlight\": H.PaintBrushIcon, \"type\": H.LanguageIcon,\n \"chevron-up\": H.ChevronUpIcon, \"chevron-down\": H.ChevronDownIcon, \"trash\": H.TrashIcon,\n \"undo\": H.ArrowUturnLeftIcon, \"redo\": H.ArrowUturnRightIcon,\n \"arrow-left\": H.ArrowLeftIcon, \"grip-vertical\": H.Bars2Icon,\n \"mic\": H.MicrophoneIcon, \"paperclip\": H.PaperClipIcon, \"send\": H.PaperAirplaneIcon,\n \"log-out\": H.ArrowRightStartOnRectangleIcon, \"edit\": H.PencilIcon, \"menu\": H.Bars3Icon,\n \"star\": H.StarIcon, \"bookmark\": H.BookmarkIcon,\n \"download\": H.ArrowDownTrayIcon, \"upload\": H.ArrowUpTrayIcon,\n }\n return buildExtendedMap(H as unknown as Record<string, unknown>, aliases, { stripSuffix: \"Icon\" })\n}\n"]}
package/dist/icons.js CHANGED
@@ -1,4 +1,4 @@
1
- export { Icon, IconProvider } from './chunk-H2XI6OUB.js';
1
+ export { Icon, IconProvider } from './chunk-WVB3SRXW.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
@@ -68,12 +68,14 @@ interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {
68
68
  }
69
69
  declare function Textarea({ className, autoResize, maxRows, ref, ...props }: TextareaProps): react_jsx_runtime.JSX.Element;
70
70
  declare function Label({ className, children, ...props }: LabelHTMLAttributes<HTMLLabelElement>): react_jsx_runtime.JSX.Element;
71
- declare function Toggle({ checked, onChange, label, disabled, error, "aria-labelledby": ariaLabelledBy, ...rest }: {
71
+ type ToggleLayout = "full" | "compact";
72
+ declare function Toggle({ checked, onChange, label, disabled, error, layout, "aria-labelledby": ariaLabelledBy, ...rest }: {
72
73
  checked: boolean;
73
74
  onChange: (v: boolean) => void;
74
75
  label?: string;
75
76
  disabled?: boolean;
76
77
  error?: boolean;
78
+ layout?: ToggleLayout;
77
79
  "aria-labelledby"?: string;
78
80
  } & Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "onChange">): react_jsx_runtime.JSX.Element;
79
81
 
@@ -1049,8 +1051,10 @@ interface DrawerProps {
1049
1051
  flush?: boolean;
1050
1052
  /** Use a lighter backdrop (no blur, subtle dim). Use for compact overlays. */
1051
1053
  lightBackdrop?: boolean;
1054
+ /** Offset the drawer from the top of its container. When set, the area above this offset remains visible and interactive (e.g. keeping a navbar accessible). */
1055
+ topOffset?: string;
1052
1056
  }
1053
- declare function Drawer({ open, onClose, position, width, title, children, footer, container, flush, lightBackdrop }: DrawerProps): react.ReactPortal | null;
1057
+ declare function Drawer({ open, onClose, position, width, title, children, footer, container, flush, lightBackdrop, topOffset }: DrawerProps): react.ReactPortal | null;
1054
1058
 
1055
1059
  interface TooltipProps {
1056
1060
  content: ReactNode;
@@ -1207,9 +1211,10 @@ interface ToastProps {
1207
1211
  pauseOnHover?: boolean;
1208
1212
  action?: ToastAction;
1209
1213
  position?: ToastPosition;
1214
+ mode?: "light" | "dark";
1210
1215
  container?: Element | DocumentFragment;
1211
1216
  }
1212
- declare function Toast({ variant, message, visible, onDismiss, duration, pauseOnHover, action, position, container }: ToastProps): react.ReactPortal | null;
1217
+ declare function Toast({ variant, message, visible, onDismiss, duration, pauseOnHover, action, position, mode, container }: ToastProps): react.ReactPortal | null;
1213
1218
 
1214
1219
  type ProgressVariant = "default" | "success" | "warning" | "error";
1215
1220
  interface ProgressProps {