gridsmith-ui 0.2.16 → 0.2.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-HA6M6FBR.js → chunk-H2XI6OUB.js} +36 -14
- package/dist/chunk-H2XI6OUB.js.map +1 -0
- package/dist/icons.d.ts +8 -1
- package/dist/icons.js +1 -1
- package/dist/index.d.ts +22 -8
- package/dist/index.js +217 -208
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/dist/chunk-HA6M6FBR.js.map +0 -1
|
@@ -5,10 +5,14 @@ import { jsx } from 'react/jsx-runtime';
|
|
|
5
5
|
function pascalToKebab(s) {
|
|
6
6
|
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();
|
|
7
7
|
}
|
|
8
|
+
function isRenderableComponent(value) {
|
|
9
|
+
if (typeof value === "function") return true;
|
|
10
|
+
return typeof value === "object" && value !== null && "$$typeof" in value;
|
|
11
|
+
}
|
|
8
12
|
function buildExtendedMap(mod, aliases, opts) {
|
|
9
13
|
const map = {};
|
|
10
14
|
for (const [exportName, value] of Object.entries(mod)) {
|
|
11
|
-
if (
|
|
15
|
+
if (!isRenderableComponent(value)) continue;
|
|
12
16
|
if (!exportName[0] || exportName[0] !== exportName[0].toUpperCase()) continue;
|
|
13
17
|
let name = exportName;
|
|
14
18
|
if (opts?.stripPrefix && name.startsWith(opts.stripPrefix)) {
|
|
@@ -78,7 +82,9 @@ async function loadLucide() {
|
|
|
78
82
|
"edit": L.Pencil,
|
|
79
83
|
"menu": L.Menu,
|
|
80
84
|
"star": L.Star,
|
|
81
|
-
"bookmark": L.Bookmark
|
|
85
|
+
"bookmark": L.Bookmark,
|
|
86
|
+
"download": L.Download,
|
|
87
|
+
"upload": L.Upload
|
|
82
88
|
};
|
|
83
89
|
return buildExtendedMap(L, aliases);
|
|
84
90
|
}
|
|
@@ -135,7 +141,9 @@ async function loadPhosphor() {
|
|
|
135
141
|
"edit": P.PencilSimple,
|
|
136
142
|
"menu": P.List,
|
|
137
143
|
"star": P.Star,
|
|
138
|
-
"bookmark": P.BookmarkSimple
|
|
144
|
+
"bookmark": P.BookmarkSimple,
|
|
145
|
+
"download": P.DownloadSimple,
|
|
146
|
+
"upload": P.UploadSimple
|
|
139
147
|
};
|
|
140
148
|
return buildExtendedMap(P, aliases);
|
|
141
149
|
}
|
|
@@ -192,7 +200,10 @@ async function loadHeroicons() {
|
|
|
192
200
|
"edit": H.PencilIcon,
|
|
193
201
|
"menu": H.Bars3Icon,
|
|
194
202
|
"star": H.StarIcon,
|
|
195
|
-
"bookmark": H.BookmarkIcon
|
|
203
|
+
"bookmark": H.BookmarkIcon,
|
|
204
|
+
// Heroicons has no Download/Upload exports — tray arrows are its equivalents
|
|
205
|
+
"download": H.ArrowDownTrayIcon,
|
|
206
|
+
"upload": H.ArrowUpTrayIcon
|
|
196
207
|
};
|
|
197
208
|
return buildExtendedMap(H, aliases, { stripSuffix: "Icon" });
|
|
198
209
|
}
|
|
@@ -249,7 +260,9 @@ async function loadTabler() {
|
|
|
249
260
|
"edit": T.IconPencil,
|
|
250
261
|
"menu": T.IconMenu2,
|
|
251
262
|
"star": T.IconStar,
|
|
252
|
-
"bookmark": T.IconBookmark
|
|
263
|
+
"bookmark": T.IconBookmark,
|
|
264
|
+
"download": T.IconDownload,
|
|
265
|
+
"upload": T.IconUpload
|
|
253
266
|
};
|
|
254
267
|
return buildExtendedMap(T, aliases, { stripPrefix: "Icon" });
|
|
255
268
|
}
|
|
@@ -306,7 +319,9 @@ async function loadFeather() {
|
|
|
306
319
|
"edit": F.FiEdit2,
|
|
307
320
|
"menu": F.FiMenu,
|
|
308
321
|
"star": F.FiStar,
|
|
309
|
-
"bookmark": F.FiBookmark
|
|
322
|
+
"bookmark": F.FiBookmark,
|
|
323
|
+
"download": F.FiDownload,
|
|
324
|
+
"upload": F.FiUpload
|
|
310
325
|
};
|
|
311
326
|
return buildExtendedMap(F, aliases, { stripPrefix: "Fi" });
|
|
312
327
|
}
|
|
@@ -351,24 +366,31 @@ function getPhosphorWeight(numericWeight) {
|
|
|
351
366
|
function Icon({ name, size = 16, className }) {
|
|
352
367
|
const { pack, weight } = useContext(IconCtx);
|
|
353
368
|
const map = useIconMap(pack);
|
|
369
|
+
const needsFallback = pack !== "lucide" && map !== null && !map[name];
|
|
370
|
+
const lucideMap = useIconMap(needsFallback ? "lucide" : pack);
|
|
354
371
|
if (!map) return null;
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
if (
|
|
372
|
+
let Comp = map[name];
|
|
373
|
+
let renderPack = pack;
|
|
374
|
+
if (!Comp) {
|
|
375
|
+
if (!needsFallback || !lucideMap?.[name]) return null;
|
|
376
|
+
Comp = lucideMap[name];
|
|
377
|
+
renderPack = "lucide";
|
|
378
|
+
}
|
|
379
|
+
if (renderPack === "phosphor") {
|
|
358
380
|
return /* @__PURE__ */ jsx(Comp, { size, weight: getPhosphorWeight(weight), className });
|
|
359
381
|
}
|
|
360
|
-
if (
|
|
382
|
+
if (renderPack === "heroicons") {
|
|
361
383
|
return /* @__PURE__ */ jsx(Comp, { className, style: { width: size, height: size, strokeWidth: weight } });
|
|
362
384
|
}
|
|
363
|
-
if (
|
|
385
|
+
if (renderPack === "tabler") {
|
|
364
386
|
return /* @__PURE__ */ jsx(Comp, { size, stroke: weight, className });
|
|
365
387
|
}
|
|
366
|
-
if (
|
|
388
|
+
if (renderPack === "feather") {
|
|
367
389
|
return /* @__PURE__ */ jsx(Comp, { size, className, strokeWidth: weight });
|
|
368
390
|
}
|
|
369
391
|
return /* @__PURE__ */ jsx(Comp, { size, strokeWidth: weight, className });
|
|
370
392
|
}
|
|
371
393
|
|
|
372
394
|
export { Icon, IconProvider };
|
|
373
|
-
//# sourceMappingURL=chunk-
|
|
374
|
-
//# sourceMappingURL=chunk-
|
|
395
|
+
//# sourceMappingURL=chunk-H2XI6OUB.js.map
|
|
396
|
+
//# sourceMappingURL=chunk-H2XI6OUB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../showcase/src/lib/icons.tsx"],"names":[],"mappings":"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","file":"chunk-H2XI6OUB.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/* ── Helpers ───────────────────────────────────────────────────── */\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\n/**\n * True for anything React can render as a component: plain function\n * components (feather) and forwardRef/memo exotic objects (lucide, phosphor,\n * heroicons, tabler all export forwardRef components, whose typeof is\n * \"object\", not \"function\").\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\n/**\n * Build an extended icon map from a pack module's exports.\n * Each PascalCase component export is converted to a kebab-case entry.\n * Pack prefixes/suffixes (Icon*, *Icon, Fi*) are stripped before conversion.\n * Curated aliases always take precedence over auto-generated names.\n */\nfunction 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\n/* ── Pack loading ─────────────────────────────────────────────── */\n\nconst packCache = new Map<IconPack, IconMap>();\n\nconst fullyLoaded = new Set<IconPack>();\n\nasync function loadLucide(): Promise<IconMap> {\n const L = await import(\"lucide-react\");\n const aliases: IconMap = {\n \"home\": L.Home, \"folder\": L.FolderKanban, \"chart\": L.BarChart3, \"settings\": L.Settings,\n \"chevron-right\": L.ChevronRight, \"close\": L.X, \"plus\": L.Plus, \"search\": L.Search,\n \"bell\": L.Bell, \"user\": L.User, \"check\": L.Check, \"warning\": L.AlertTriangle,\n \"info\": L.Info, \"error\": L.AlertCircle, \"clock\": L.Clock, \"calendar\": L.CalendarDays,\n \"bold\": L.Bold, \"italic\": L.Italic, \"underline\": L.Underline, \"strikethrough\": L.Strikethrough,\n \"align-left\": L.AlignLeft, \"align-center\": L.AlignCenter, \"align-right\": L.AlignRight,\n \"list\": L.List, \"list-ordered\": L.ListOrdered, \"list-checks\": L.ListChecks,\n \"link\": L.Link, \"image\": L.Image, \"table\": L.Table, \"code\": L.Code,\n \"quote\": L.Quote, \"minus\": L.Minus, \"superscript\": L.Superscript, \"subscript\": L.Subscript,\n \"highlight\": L.Highlighter, \"type\": L.Type, \"chevron-up\": L.ChevronUp, \"chevron-down\": L.ChevronDown,\n \"trash\": L.Trash2, \"undo\": L.Undo2, \"redo\": L.Redo2,\n \"arrow-left\": L.ArrowLeft, \"grip-vertical\": L.GripVertical,\n \"mic\": L.Mic, \"paperclip\": L.Paperclip, \"send\": L.Send,\n \"log-out\": L.LogOut, \"edit\": L.Pencil, \"menu\": L.Menu,\n \"star\": L.Star, \"bookmark\": L.Bookmark,\n \"download\": L.Download, \"upload\": L.Upload,\n };\n return buildExtendedMap(L as unknown as Record<string, unknown>, aliases);\n}\n\nasync function loadPhosphor(): Promise<IconMap> {\n const P = await import(\"@phosphor-icons/react\");\n const aliases: IconMap = {\n \"home\": P.House, \"folder\": P.FolderSimple, \"chart\": P.ChartBar,\n \"settings\": P.Gear, \"chevron-right\": P.CaretRight, \"close\": P.X,\n \"plus\": P.Plus, \"search\": P.MagnifyingGlass, \"bell\": P.Bell, \"user\": P.User,\n \"check\": P.Check, \"warning\": P.Warning, \"info\": P.Info,\n \"error\": P.WarningCircle, \"clock\": P.Clock, \"calendar\": P.CalendarBlank,\n \"bold\": P.TextB, \"italic\": P.TextItalic, \"underline\": P.TextUnderline,\n \"strikethrough\": P.TextStrikethrough, \"align-left\": P.TextAlignLeft,\n \"align-center\": P.TextAlignCenter, \"align-right\": P.TextAlignRight,\n \"list\": P.ListBullets, \"list-ordered\": P.ListNumbers, \"list-checks\": P.ListChecks,\n \"link\": P.Link, \"image\": P.Image, \"table\": P.Table, \"code\": P.Code,\n \"quote\": P.Quotes, \"minus\": P.Minus, \"superscript\": P.TextSuperscript,\n \"subscript\": P.TextSubscript, \"highlight\": P.Highlighter, \"type\": P.TextT,\n \"chevron-up\": P.CaretUp, \"chevron-down\": P.CaretDown, \"trash\": P.Trash,\n \"undo\": P.ArrowCounterClockwise, \"redo\": P.ArrowClockwise,\n \"arrow-left\": P.ArrowLeft, \"grip-vertical\": P.DotsSixVertical,\n \"mic\": P.Microphone, \"paperclip\": P.Paperclip, \"send\": P.PaperPlaneTilt,\n \"log-out\": P.SignOut, \"edit\": P.PencilSimple, \"menu\": P.List,\n \"star\": P.Star, \"bookmark\": P.BookmarkSimple,\n \"download\": P.DownloadSimple, \"upload\": P.UploadSimple,\n };\n return buildExtendedMap(P as unknown as Record<string, unknown>, aliases);\n}\n\nasync function loadHeroicons(): Promise<IconMap> {\n const H = await import(\"@heroicons/react/24/outline\");\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 // Heroicons has no Download/Upload exports — tray arrows are its equivalents\n \"download\": H.ArrowDownTrayIcon, \"upload\": H.ArrowUpTrayIcon,\n };\n return buildExtendedMap(H as unknown as Record<string, unknown>, aliases, { stripSuffix: \"Icon\" });\n}\n\nasync function loadTabler(): Promise<IconMap> {\n const T = await import(\"@tabler/icons-react\");\n const aliases: IconMap = {\n \"home\": T.IconHome, \"folder\": T.IconFolder, \"chart\": T.IconChartBar,\n \"settings\": T.IconSettings, \"chevron-right\": T.IconChevronRight,\n \"close\": T.IconX, \"plus\": T.IconPlus, \"search\": T.IconSearch,\n \"bell\": T.IconBell, \"user\": T.IconUser, \"check\": T.IconCheck,\n \"warning\": T.IconAlertTriangle, \"info\": T.IconInfoCircle,\n \"error\": T.IconAlertCircle, \"clock\": T.IconClock, \"calendar\": T.IconCalendar,\n \"bold\": T.IconBold, \"italic\": T.IconItalic, \"underline\": T.IconUnderline,\n \"strikethrough\": T.IconStrikethrough, \"align-left\": T.IconAlignLeft,\n \"align-center\": T.IconAlignCenter, \"align-right\": T.IconAlignRight,\n \"list\": T.IconList, \"list-ordered\": T.IconListNumbers, \"list-checks\": T.IconListCheck,\n \"link\": T.IconLink, \"image\": T.IconPhoto, \"table\": T.IconTable, \"code\": T.IconCode,\n \"quote\": T.IconQuote, \"minus\": T.IconMinus, \"superscript\": T.IconSuperscript,\n \"subscript\": T.IconSubscript, \"highlight\": T.IconHighlight, \"type\": T.IconTypography,\n \"chevron-up\": T.IconChevronUp, \"chevron-down\": T.IconChevronDown, \"trash\": T.IconTrash,\n \"undo\": T.IconArrowBackUp, \"redo\": T.IconArrowForwardUp,\n \"arrow-left\": T.IconArrowLeft, \"grip-vertical\": T.IconGripVertical,\n \"mic\": T.IconMicrophone, \"paperclip\": T.IconPaperclip, \"send\": T.IconSend,\n \"log-out\": T.IconLogout, \"edit\": T.IconPencil, \"menu\": T.IconMenu2,\n \"star\": T.IconStar, \"bookmark\": T.IconBookmark,\n \"download\": T.IconDownload, \"upload\": T.IconUpload,\n };\n return buildExtendedMap(T as unknown as Record<string, unknown>, aliases, { stripPrefix: \"Icon\" });\n}\n\nasync function loadFeather(): Promise<IconMap> {\n const F = await import(\"react-icons/fi\");\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\n/** Exported for the icon-completeness test — not part of the public API. */\nexport const packLoaders: Record<IconPack, () => Promise<IconMap>> = {\n lucide: loadLucide,\n phosphor: loadPhosphor,\n heroicons: loadHeroicons,\n tabler: loadTabler,\n feather: loadFeather,\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 packLoaders[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"]}
|
package/dist/icons.d.ts
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Runtime list of curated icon names. The CuratedIconName type derives from
|
|
6
|
+
* this array, so adding a name here extends autocomplete automatically.
|
|
7
|
+
* Every name must have an alias (or auto-kebab match) in ALL five packs —
|
|
8
|
+
* icon-completeness.test.tsx enforces this.
|
|
9
|
+
*/
|
|
10
|
+
declare const CURATED_ICON_NAMES: readonly ["home", "folder", "chart", "settings", "chevron-right", "close", "plus", "search", "bell", "user", "check", "warning", "info", "error", "clock", "calendar", "bold", "italic", "underline", "strikethrough", "align-left", "align-center", "align-right", "list", "list-ordered", "list-checks", "link", "image", "table", "code", "quote", "minus", "superscript", "subscript", "highlight", "type", "chevron-up", "chevron-down", "trash", "undo", "redo", "arrow-left", "grip-vertical", "mic", "paperclip", "send", "log-out", "edit", "menu", "star", "bookmark", "download", "upload"];
|
|
11
|
+
type CuratedIconName = (typeof CURATED_ICON_NAMES)[number];
|
|
5
12
|
/**
|
|
6
13
|
* Curated names provide autocomplete and work identically across all 5 packs.
|
|
7
14
|
* Any kebab-case string is also accepted — it resolves directly against the
|
package/dist/icons.js
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -55,7 +55,7 @@ interface BulkActionBarProps {
|
|
|
55
55
|
declare function BulkActionBar({ selectedCount, actions, onClearSelection, className }: BulkActionBarProps): react_jsx_runtime.JSX.Element | null;
|
|
56
56
|
|
|
57
57
|
type InputSize = "sm" | "md";
|
|
58
|
-
declare function Input({ className, size, error, prefix, suffix, ...props }: Omit<InputHTMLAttributes<HTMLInputElement>, "size"> & {
|
|
58
|
+
declare function Input({ className, size, error, prefix, suffix, ...props }: Omit<InputHTMLAttributes<HTMLInputElement>, "size" | "prefix"> & {
|
|
59
59
|
size?: InputSize;
|
|
60
60
|
error?: boolean;
|
|
61
61
|
prefix?: ReactNode;
|
|
@@ -172,8 +172,10 @@ interface DatePickerProps {
|
|
|
172
172
|
container?: Element | DocumentFragment;
|
|
173
173
|
error?: boolean;
|
|
174
174
|
label?: string;
|
|
175
|
+
/** Forwarded to the trigger button so an external Label htmlFor can be associated. Defaults to a generated id used by the built-in label. */
|
|
176
|
+
id?: string;
|
|
175
177
|
}
|
|
176
|
-
declare function DatePicker({ value, onChange, placeholder, disabled, className, ref, container, error, label }: DatePickerProps): react_jsx_runtime.JSX.Element;
|
|
178
|
+
declare function DatePicker({ value, onChange, placeholder, disabled, className, ref, container, error, label, id }: DatePickerProps): react_jsx_runtime.JSX.Element;
|
|
177
179
|
|
|
178
180
|
interface FileUploadProps {
|
|
179
181
|
onFiles: (files: File[]) => void;
|
|
@@ -210,8 +212,10 @@ interface TimePickerProps {
|
|
|
210
212
|
ref?: Ref<HTMLDivElement>;
|
|
211
213
|
container?: Element | DocumentFragment;
|
|
212
214
|
error?: boolean;
|
|
215
|
+
/** Forwarded to the trigger button so a Label htmlFor can be associated. */
|
|
216
|
+
id?: string;
|
|
213
217
|
}
|
|
214
|
-
declare function TimePicker({ value, onChange, use24Hour, minuteStep, disabled, className, ref, container, error, }: TimePickerProps): react_jsx_runtime.JSX.Element;
|
|
218
|
+
declare function TimePicker({ value, onChange, use24Hour, minuteStep, disabled, className, ref, container, error, id, }: TimePickerProps): react_jsx_runtime.JSX.Element;
|
|
215
219
|
|
|
216
220
|
interface NumberInputProps {
|
|
217
221
|
value: number;
|
|
@@ -226,8 +230,10 @@ interface NumberInputProps {
|
|
|
226
230
|
size?: "sm" | "md" | "lg";
|
|
227
231
|
className?: string;
|
|
228
232
|
error?: boolean;
|
|
233
|
+
/** Forwarded to the inner input element so a Label htmlFor can be associated. */
|
|
234
|
+
id?: string;
|
|
229
235
|
}
|
|
230
|
-
declare function NumberInput({ value, onChange, min, max, step, disabled, placeholder, prefix, suffix, size, className, error, }: NumberInputProps): react_jsx_runtime.JSX.Element;
|
|
236
|
+
declare function NumberInput({ value, onChange, min, max, step, disabled, placeholder, prefix, suffix, size, className, error, id, }: NumberInputProps): react_jsx_runtime.JSX.Element;
|
|
231
237
|
|
|
232
238
|
interface TagInputProps {
|
|
233
239
|
value: string[];
|
|
@@ -237,8 +243,10 @@ interface TagInputProps {
|
|
|
237
243
|
disabled?: boolean;
|
|
238
244
|
className?: string;
|
|
239
245
|
error?: boolean;
|
|
246
|
+
/** Forwarded to the inner input element so a Label htmlFor can be associated. */
|
|
247
|
+
id?: string;
|
|
240
248
|
}
|
|
241
|
-
declare function TagInput({ value, onChange, placeholder, maxTags, disabled, className, error, }: TagInputProps): react_jsx_runtime.JSX.Element;
|
|
249
|
+
declare function TagInput({ value, onChange, placeholder, maxTags, disabled, className, error, id, }: TagInputProps): react_jsx_runtime.JSX.Element;
|
|
242
250
|
|
|
243
251
|
interface PinInputProps {
|
|
244
252
|
value: string;
|
|
@@ -249,8 +257,10 @@ interface PinInputProps {
|
|
|
249
257
|
size?: "sm" | "md" | "lg";
|
|
250
258
|
className?: string;
|
|
251
259
|
error?: boolean;
|
|
260
|
+
/** Forwarded to the first pin box so a Label htmlFor can be associated. */
|
|
261
|
+
id?: string;
|
|
252
262
|
}
|
|
253
|
-
declare function PinInput({ value, onChange, length, mask, disabled, size, className, error, }: PinInputProps): react_jsx_runtime.JSX.Element;
|
|
263
|
+
declare function PinInput({ value, onChange, length, mask, disabled, size, className, error, id, }: PinInputProps): react_jsx_runtime.JSX.Element;
|
|
254
264
|
|
|
255
265
|
interface RatingProps {
|
|
256
266
|
value: number;
|
|
@@ -1095,15 +1105,19 @@ interface HoverCardProps {
|
|
|
1095
1105
|
}
|
|
1096
1106
|
declare function HoverCard({ content, children, side, delay, closeDelay, className, container, }: HoverCardProps): react_jsx_runtime.JSX.Element;
|
|
1097
1107
|
|
|
1098
|
-
interface
|
|
1108
|
+
interface ContextMenuActionItem {
|
|
1099
1109
|
label: string;
|
|
1100
1110
|
icon?: IconName;
|
|
1101
1111
|
shortcut?: string;
|
|
1102
1112
|
disabled?: boolean;
|
|
1103
1113
|
destructive?: boolean;
|
|
1104
|
-
separator?:
|
|
1114
|
+
separator?: false;
|
|
1105
1115
|
onClick?: () => void;
|
|
1106
1116
|
}
|
|
1117
|
+
interface ContextMenuSeparatorItem {
|
|
1118
|
+
separator: true;
|
|
1119
|
+
}
|
|
1120
|
+
type ContextMenuItem = ContextMenuActionItem | ContextMenuSeparatorItem;
|
|
1107
1121
|
interface ContextMenuProps {
|
|
1108
1122
|
items: ContextMenuItem[];
|
|
1109
1123
|
children: ReactNode;
|