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.
@@ -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 (typeof value !== "function") continue;
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
- const Comp = map[name];
356
- if (!Comp) return null;
357
- if (pack === "phosphor") {
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 (pack === "heroicons") {
382
+ if (renderPack === "heroicons") {
361
383
  return /* @__PURE__ */ jsx(Comp, { className, style: { width: size, height: size, strokeWidth: weight } });
362
384
  }
363
- if (pack === "tabler") {
385
+ if (renderPack === "tabler") {
364
386
  return /* @__PURE__ */ jsx(Comp, { size, stroke: weight, className });
365
387
  }
366
- if (pack === "feather") {
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-HA6M6FBR.js.map
374
- //# sourceMappingURL=chunk-HA6M6FBR.js.map
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":";;;;AA4CA,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;AAQA,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;AAQA,SAAS,gBAAA,CACP,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;AAIA,IAAM,SAAA,uBAAgB,GAAA,EAAuB;AAE7C,IAAM,WAAA,uBAAkB,GAAA,EAAc;AAEtC,eAAe,UAAA,GAA+B;AAC5C,EAAA,MAAM,CAAA,GAAI,MAAM,OAAO,cAAc,CAAA;AACrC,EAAA,MAAM,OAAA,GAAmB;AAAA,IACvB,QAAQ,CAAA,CAAE,IAAA;AAAA,IAAM,UAAU,CAAA,CAAE,YAAA;AAAA,IAAc,SAAS,CAAA,CAAE,SAAA;AAAA,IAAW,YAAY,CAAA,CAAE,QAAA;AAAA,IAC9E,iBAAiB,CAAA,CAAE,YAAA;AAAA,IAAc,SAAS,CAAA,CAAE,CAAA;AAAA,IAAG,QAAQ,CAAA,CAAE,IAAA;AAAA,IAAM,UAAU,CAAA,CAAE,MAAA;AAAA,IAC3E,QAAQ,CAAA,CAAE,IAAA;AAAA,IAAM,QAAQ,CAAA,CAAE,IAAA;AAAA,IAAM,SAAS,CAAA,CAAE,KAAA;AAAA,IAAO,WAAW,CAAA,CAAE,aAAA;AAAA,IAC/D,QAAQ,CAAA,CAAE,IAAA;AAAA,IAAM,SAAS,CAAA,CAAE,WAAA;AAAA,IAAa,SAAS,CAAA,CAAE,KAAA;AAAA,IAAO,YAAY,CAAA,CAAE,YAAA;AAAA,IACxE,QAAQ,CAAA,CAAE,IAAA;AAAA,IAAM,UAAU,CAAA,CAAE,MAAA;AAAA,IAAQ,aAAa,CAAA,CAAE,SAAA;AAAA,IAAW,iBAAiB,CAAA,CAAE,aAAA;AAAA,IACjF,cAAc,CAAA,CAAE,SAAA;AAAA,IAAW,gBAAgB,CAAA,CAAE,WAAA;AAAA,IAAa,eAAe,CAAA,CAAE,UAAA;AAAA,IAC3E,QAAQ,CAAA,CAAE,IAAA;AAAA,IAAM,gBAAgB,CAAA,CAAE,WAAA;AAAA,IAAa,eAAe,CAAA,CAAE,UAAA;AAAA,IAChE,QAAQ,CAAA,CAAE,IAAA;AAAA,IAAM,SAAS,CAAA,CAAE,KAAA;AAAA,IAAO,SAAS,CAAA,CAAE,KAAA;AAAA,IAAO,QAAQ,CAAA,CAAE,IAAA;AAAA,IAC9D,SAAS,CAAA,CAAE,KAAA;AAAA,IAAO,SAAS,CAAA,CAAE,KAAA;AAAA,IAAO,eAAe,CAAA,CAAE,WAAA;AAAA,IAAa,aAAa,CAAA,CAAE,SAAA;AAAA,IACjF,aAAa,CAAA,CAAE,WAAA;AAAA,IAAa,QAAQ,CAAA,CAAE,IAAA;AAAA,IAAM,cAAc,CAAA,CAAE,SAAA;AAAA,IAAW,gBAAgB,CAAA,CAAE,WAAA;AAAA,IACzF,SAAS,CAAA,CAAE,MAAA;AAAA,IAAQ,QAAQ,CAAA,CAAE,KAAA;AAAA,IAAO,QAAQ,CAAA,CAAE,KAAA;AAAA,IAC9C,cAAc,CAAA,CAAE,SAAA;AAAA,IAAW,iBAAiB,CAAA,CAAE,YAAA;AAAA,IAC9C,OAAO,CAAA,CAAE,GAAA;AAAA,IAAK,aAAa,CAAA,CAAE,SAAA;AAAA,IAAW,QAAQ,CAAA,CAAE,IAAA;AAAA,IAClD,WAAW,CAAA,CAAE,MAAA;AAAA,IAAQ,QAAQ,CAAA,CAAE,MAAA;AAAA,IAAQ,QAAQ,CAAA,CAAE,IAAA;AAAA,IACjD,QAAQ,CAAA,CAAE,IAAA;AAAA,IAAM,YAAY,CAAA,CAAE,QAAA;AAAA,IAC9B,YAAY,CAAA,CAAE,QAAA;AAAA,IAAU,UAAU,CAAA,CAAE;AAAA,GACtC;AACA,EAAA,OAAO,gBAAA,CAAiB,GAAyC,OAAO,CAAA;AAC1E;AAEA,eAAe,YAAA,GAAiC;AAC9C,EAAA,MAAM,CAAA,GAAI,MAAM,OAAO,uBAAuB,CAAA;AAC9C,EAAA,MAAM,OAAA,GAAmB;AAAA,IACvB,QAAQ,CAAA,CAAE,KAAA;AAAA,IAAO,UAAU,CAAA,CAAE,YAAA;AAAA,IAAc,SAAS,CAAA,CAAE,QAAA;AAAA,IACtD,YAAY,CAAA,CAAE,IAAA;AAAA,IAAM,iBAAiB,CAAA,CAAE,UAAA;AAAA,IAAY,SAAS,CAAA,CAAE,CAAA;AAAA,IAC9D,QAAQ,CAAA,CAAE,IAAA;AAAA,IAAM,UAAU,CAAA,CAAE,eAAA;AAAA,IAAiB,QAAQ,CAAA,CAAE,IAAA;AAAA,IAAM,QAAQ,CAAA,CAAE,IAAA;AAAA,IACvE,SAAS,CAAA,CAAE,KAAA;AAAA,IAAO,WAAW,CAAA,CAAE,OAAA;AAAA,IAAS,QAAQ,CAAA,CAAE,IAAA;AAAA,IAClD,SAAS,CAAA,CAAE,aAAA;AAAA,IAAe,SAAS,CAAA,CAAE,KAAA;AAAA,IAAO,YAAY,CAAA,CAAE,aAAA;AAAA,IAC1D,QAAQ,CAAA,CAAE,KAAA;AAAA,IAAO,UAAU,CAAA,CAAE,UAAA;AAAA,IAAY,aAAa,CAAA,CAAE,aAAA;AAAA,IACxD,iBAAiB,CAAA,CAAE,iBAAA;AAAA,IAAmB,cAAc,CAAA,CAAE,aAAA;AAAA,IACtD,gBAAgB,CAAA,CAAE,eAAA;AAAA,IAAiB,eAAe,CAAA,CAAE,cAAA;AAAA,IACpD,QAAQ,CAAA,CAAE,WAAA;AAAA,IAAa,gBAAgB,CAAA,CAAE,WAAA;AAAA,IAAa,eAAe,CAAA,CAAE,UAAA;AAAA,IACvE,QAAQ,CAAA,CAAE,IAAA;AAAA,IAAM,SAAS,CAAA,CAAE,KAAA;AAAA,IAAO,SAAS,CAAA,CAAE,KAAA;AAAA,IAAO,QAAQ,CAAA,CAAE,IAAA;AAAA,IAC9D,SAAS,CAAA,CAAE,MAAA;AAAA,IAAQ,SAAS,CAAA,CAAE,KAAA;AAAA,IAAO,eAAe,CAAA,CAAE,eAAA;AAAA,IACtD,aAAa,CAAA,CAAE,aAAA;AAAA,IAAe,aAAa,CAAA,CAAE,WAAA;AAAA,IAAa,QAAQ,CAAA,CAAE,KAAA;AAAA,IACpE,cAAc,CAAA,CAAE,OAAA;AAAA,IAAS,gBAAgB,CAAA,CAAE,SAAA;AAAA,IAAW,SAAS,CAAA,CAAE,KAAA;AAAA,IACjE,QAAQ,CAAA,CAAE,qBAAA;AAAA,IAAuB,QAAQ,CAAA,CAAE,cAAA;AAAA,IAC3C,cAAc,CAAA,CAAE,SAAA;AAAA,IAAW,iBAAiB,CAAA,CAAE,eAAA;AAAA,IAC9C,OAAO,CAAA,CAAE,UAAA;AAAA,IAAY,aAAa,CAAA,CAAE,SAAA;AAAA,IAAW,QAAQ,CAAA,CAAE,cAAA;AAAA,IACzD,WAAW,CAAA,CAAE,OAAA;AAAA,IAAS,QAAQ,CAAA,CAAE,YAAA;AAAA,IAAc,QAAQ,CAAA,CAAE,IAAA;AAAA,IACxD,QAAQ,CAAA,CAAE,IAAA;AAAA,IAAM,YAAY,CAAA,CAAE,cAAA;AAAA,IAC9B,YAAY,CAAA,CAAE,cAAA;AAAA,IAAgB,UAAU,CAAA,CAAE;AAAA,GAC5C;AACA,EAAA,OAAO,gBAAA,CAAiB,GAAyC,OAAO,CAAA;AAC1E;AAEA,eAAe,aAAA,GAAkC;AAC/C,EAAA,MAAM,CAAA,GAAI,MAAM,OAAO,6BAA6B,CAAA;AACpD,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;AAAA,IAElC,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;AAEA,eAAe,UAAA,GAA+B;AAC5C,EAAA,MAAM,CAAA,GAAI,MAAM,OAAO,qBAAqB,CAAA;AAC5C,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,YAAA;AAAA,IAAc,iBAAiB,CAAA,CAAE,gBAAA;AAAA,IAC/C,SAAS,CAAA,CAAE,KAAA;AAAA,IAAO,QAAQ,CAAA,CAAE,QAAA;AAAA,IAAU,UAAU,CAAA,CAAE,UAAA;AAAA,IAClD,QAAQ,CAAA,CAAE,QAAA;AAAA,IAAU,QAAQ,CAAA,CAAE,QAAA;AAAA,IAAU,SAAS,CAAA,CAAE,SAAA;AAAA,IACnD,WAAW,CAAA,CAAE,iBAAA;AAAA,IAAmB,QAAQ,CAAA,CAAE,cAAA;AAAA,IAC1C,SAAS,CAAA,CAAE,eAAA;AAAA,IAAiB,SAAS,CAAA,CAAE,SAAA;AAAA,IAAW,YAAY,CAAA,CAAE,YAAA;AAAA,IAChE,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,aAAA;AAAA,IACtD,gBAAgB,CAAA,CAAE,eAAA;AAAA,IAAiB,eAAe,CAAA,CAAE,cAAA;AAAA,IACpD,QAAQ,CAAA,CAAE,QAAA;AAAA,IAAU,gBAAgB,CAAA,CAAE,eAAA;AAAA,IAAiB,eAAe,CAAA,CAAE,aAAA;AAAA,IACxE,QAAQ,CAAA,CAAE,QAAA;AAAA,IAAU,SAAS,CAAA,CAAE,SAAA;AAAA,IAAW,SAAS,CAAA,CAAE,SAAA;AAAA,IAAW,QAAQ,CAAA,CAAE,QAAA;AAAA,IAC1E,SAAS,CAAA,CAAE,SAAA;AAAA,IAAW,SAAS,CAAA,CAAE,SAAA;AAAA,IAAW,eAAe,CAAA,CAAE,eAAA;AAAA,IAC7D,aAAa,CAAA,CAAE,aAAA;AAAA,IAAe,aAAa,CAAA,CAAE,aAAA;AAAA,IAAe,QAAQ,CAAA,CAAE,cAAA;AAAA,IACtE,cAAc,CAAA,CAAE,aAAA;AAAA,IAAe,gBAAgB,CAAA,CAAE,eAAA;AAAA,IAAiB,SAAS,CAAA,CAAE,SAAA;AAAA,IAC7E,QAAQ,CAAA,CAAE,eAAA;AAAA,IAAiB,QAAQ,CAAA,CAAE,kBAAA;AAAA,IACrC,cAAc,CAAA,CAAE,aAAA;AAAA,IAAe,iBAAiB,CAAA,CAAE,gBAAA;AAAA,IAClD,OAAO,CAAA,CAAE,cAAA;AAAA,IAAgB,aAAa,CAAA,CAAE,aAAA;AAAA,IAAe,QAAQ,CAAA,CAAE,QAAA;AAAA,IACjE,WAAW,CAAA,CAAE,UAAA;AAAA,IAAY,QAAQ,CAAA,CAAE,UAAA;AAAA,IAAY,QAAQ,CAAA,CAAE,SAAA;AAAA,IACzD,QAAQ,CAAA,CAAE,QAAA;AAAA,IAAU,YAAY,CAAA,CAAE,YAAA;AAAA,IAClC,YAAY,CAAA,CAAE,YAAA;AAAA,IAAc,UAAU,CAAA,CAAE;AAAA,GAC1C;AACA,EAAA,OAAO,iBAAiB,CAAA,EAAyC,OAAA,EAAS,EAAE,WAAA,EAAa,QAAQ,CAAA;AACnG;AAEA,eAAe,WAAA,GAAgC;AAC7C,EAAA,MAAM,CAAA,GAAI,MAAM,OAAO,gBAAgB,CAAA;AACvC,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;AAGO,IAAM,WAAA,GAAwD;AAAA,EACnE,MAAA,EAAQ,UAAA;AAAA,EACR,QAAA,EAAU,YAAA;AAAA,EACV,SAAA,EAAW,aAAA;AAAA,EACX,MAAA,EAAQ,UAAA;AAAA,EACR,OAAA,EAAS;AACX,CAAA;AASA,IAAM,UAAU,aAAA,CAAgC,EAAE,MAAM,QAAA,EAAU,MAAA,EAAQ,KAAK,CAAA;AAExE,SAAS,YAAA,CAAa,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAS,EAA4D;AAChH,EAAA,uBAAO,GAAA,CAAC,QAAQ,QAAA,EAAR,EAAiB,OAAO,EAAE,IAAA,EAAM,MAAA,EAAO,EAAI,QAAA,EAAS,CAAA;AAC9D;AAIA,SAAS,WAAW,IAAA,EAAgC;AAClD,EAAA,MAAM,CAAC,KAAK,MAAM,CAAA,GAAI,SAAyB,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,IAAK,IAAI,CAAA;AAE1E,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA,EAAG;AACzB,MAAA,MAAM,MAAA,GAAS,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA;AACjC,MAAA,IAAI,MAAA,SAAe,MAAM,CAAA;AACzB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,WAAA,CAAY,IAAI,CAAA,EAAE,CAAE,IAAA,CAAK,CAAC,MAAA,KAAW;AACnC,MAAA,SAAA,CAAU,GAAA,CAAI,MAAM,MAAM,CAAA;AAC1B,MAAA,WAAA,CAAY,IAAI,IAAI,CAAA;AACpB,MAAA,IAAI,CAAC,SAAA,EAAW,MAAA,CAAO,MAAM,CAAA;AAAA,IAC/B,CAAC,CAAA;AACD,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAM,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,OAAO,GAAA;AACT;AAIA,SAAS,kBAAkB,aAAA,EAAmF;AAC5G,EAAA,IAAI,aAAA,IAAiB,MAAM,OAAO,MAAA;AAClC,EAAA,IAAI,aAAA,IAAiB,MAAM,OAAO,OAAA;AAClC,EAAA,IAAI,aAAA,IAAiB,MAAM,OAAO,SAAA;AAClC,EAAA,IAAI,aAAA,IAAiB,MAAM,OAAO,MAAA;AAClC,EAAA,OAAO,MAAA;AACT;AAIO,SAAS,KAAK,EAAE,IAAA,EAAM,IAAA,GAAO,EAAA,EAAI,WAAU,EAA0D;AAC1G,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,WAAW,OAAO,CAAA;AAC3C,EAAA,MAAM,GAAA,GAAM,WAAW,IAAI,CAAA;AAO3B,EAAA,MAAM,gBAAgB,IAAA,KAAS,QAAA,IAAY,QAAQ,IAAA,IAAQ,CAAC,IAAI,IAAI,CAAA;AACpE,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,aAAA,GAAgB,QAAA,GAAW,IAAI,CAAA;AAE5D,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,EAAA,IAAI,IAAA,GAAO,IAAI,IAAI,CAAA;AACnB,EAAA,IAAI,UAAA,GAAuB,IAAA;AAC3B,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,SAAA,GAAY,IAAI,GAAG,OAAO,IAAA;AACjD,IAAA,IAAA,GAAO,UAAU,IAAI,CAAA;AACrB,IAAA,UAAA,GAAa,QAAA;AAAA,EACf;AAEA,EAAA,IAAI,eAAe,UAAA,EAAY;AAC7B,IAAA,2BAAQ,IAAA,EAAA,EAAK,IAAA,EAAY,QAAQ,iBAAA,CAAkB,MAAM,GAAG,SAAA,EAAsB,CAAA;AAAA,EACpF;AAEA,EAAA,IAAI,eAAe,WAAA,EAAa;AAC9B,IAAA,uBAAO,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAsB,KAAA,EAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,WAAA,EAAa,MAAA,EAAO,EAAG,CAAA;AAAA,EAChG;AAEA,EAAA,IAAI,eAAe,QAAA,EAAU;AAC3B,IAAA,uBAAO,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAY,MAAA,EAAQ,QAAQ,SAAA,EAAsB,CAAA;AAAA,EACjE;AAEA,EAAA,IAAI,eAAe,SAAA,EAAW;AAC5B,IAAA,uBAAO,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAY,SAAA,EAAsB,aAAa,MAAA,EAAQ,CAAA;AAAA,EACtE;AAEA,EAAA,uBAAO,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAY,WAAA,EAAa,QAAQ,SAAA,EAAsB,CAAA;AACtE","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
- type CuratedIconName = "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";
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
@@ -1,4 +1,4 @@
1
- export { Icon, IconProvider } from './chunk-HA6M6FBR.js';
1
+ export { Icon, IconProvider } from './chunk-H2XI6OUB.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
@@ -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 ContextMenuItem {
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?: boolean;
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;