gridsmith-ui 0.6.0 → 0.6.1

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.
@@ -37,32 +37,32 @@ async function loadPack(pack) {
37
37
  try {
38
38
  switch (pack) {
39
39
  case "lucide":
40
- mod = await import('./lucide-AILUUOAJ.js');
40
+ mod = await import('./lucide-OGUV44TQ.js');
41
41
  break;
42
42
  case "phosphor":
43
43
  try {
44
- mod = await import('./phosphor-A4JOBGMT.js');
44
+ mod = await import('./phosphor-QG2ZMEMZ.js');
45
45
  } catch {
46
46
  throw new Error("gridsmith-ui: @phosphor-icons/react is not installed. Run: npm install @phosphor-icons/react");
47
47
  }
48
48
  break;
49
49
  case "heroicons":
50
50
  try {
51
- mod = await import('./heroicons-CA5OQ76O.js');
51
+ mod = await import('./heroicons-D3G7QU45.js');
52
52
  } catch {
53
53
  throw new Error("gridsmith-ui: @heroicons/react is not installed. Run: npm install @heroicons/react");
54
54
  }
55
55
  break;
56
56
  case "tabler":
57
57
  try {
58
- mod = await import('./tabler-TVOR6AFM.js');
58
+ mod = await import('./tabler-MW2HN55L.js');
59
59
  } catch {
60
60
  throw new Error("gridsmith-ui: @tabler/icons-react is not installed. Run: npm install @tabler/icons-react");
61
61
  }
62
62
  break;
63
63
  case "feather":
64
64
  try {
65
- mod = await import('./feather-V32UNIQL.js');
65
+ mod = await import('./feather-U45EQTAU.js');
66
66
  } catch {
67
67
  throw new Error("gridsmith-ui: react-icons is not installed. Run: npm install react-icons");
68
68
  }
@@ -145,5 +145,5 @@ function Icon({ name, size = 16, className }) {
145
145
  }
146
146
 
147
147
  export { Icon, IconProvider, preloadPack };
148
- //# sourceMappingURL=chunk-XUBVMRIE.js.map
149
- //# sourceMappingURL=chunk-XUBVMRIE.js.map
148
+ //# sourceMappingURL=chunk-GX6O72IV.js.map
149
+ //# sourceMappingURL=chunk-GX6O72IV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../showcase/src/lib/icons.tsx"],"names":[],"mappings":"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","file":"chunk-GX6O72IV.js","sourcesContent":["import { createContext, useContext, useEffect, useSyncExternalStore, type ReactNode, type ComponentType } from \"react\";\n\n/* ── Types ────────────────────────────────────────────────────── */\n\n/**\n * Runtime list of curated icon names. The CuratedIconName type derives from\n * this array, so adding a name here extends autocomplete automatically.\n * Every name must have an alias (or auto-kebab match) in ALL five packs —\n * icon-completeness.test.tsx enforces this.\n */\nexport const CURATED_ICON_NAMES = [\n \"home\", \"folder\", \"chart\", \"settings\",\n \"chevron-right\", \"close\", \"plus\", \"search\",\n \"bell\", \"user\", \"check\", \"warning\", \"info\", \"error\",\n \"clock\", \"calendar\",\n \"bold\", \"italic\", \"underline\", \"strikethrough\",\n \"align-left\", \"align-center\", \"align-right\",\n \"list\", \"list-ordered\", \"list-checks\",\n \"link\", \"image\", \"table\", \"code\", \"quote\", \"minus\",\n \"superscript\", \"subscript\", \"highlight\", \"type\",\n \"chevron-up\", \"chevron-down\", \"trash\",\n \"undo\", \"redo\",\n \"arrow-left\", \"grip-vertical\",\n \"mic\", \"paperclip\", \"send\",\n \"log-out\", \"edit\", \"menu\", \"more-horizontal\",\n \"star\", \"bookmark\", \"download\", \"upload\",\n] as const;\n\ntype CuratedIconName = (typeof CURATED_ICON_NAMES)[number];\n\n/**\n * Curated names provide autocomplete and work identically across all 5 packs.\n * Any kebab-case string is also accepted — it resolves directly against the\n * active pack's native exports (e.g. \"clipboard-copy\" → Lucide's ClipboardCopy).\n */\nexport type IconName = CuratedIconName | (string & {});\n\nexport type IconPack = \"lucide\" | \"phosphor\" | \"heroicons\" | \"tabler\" | \"feather\";\n\ntype IconComponent = ComponentType<Record<string, unknown>>;\ntype IconMap = Record<string, IconComponent>;\n\n/* ── External store ──────────────────────────────────────────── */\n\ntype Subscriber = () => void;\nconst subscribers = new Set<Subscriber>();\nfunction notifySubscribers() {\n subscribers.forEach((fn) => fn());\n}\nfunction subscribe(cb: Subscriber): () => void {\n subscribers.add(cb);\n return () => { subscribers.delete(cb); };\n}\n\nconst curatedCache = new Map<IconPack, IconMap>();\nconst extendedCache = new Map<IconPack, IconMap>();\n\nfunction useCuratedMap(pack: IconPack): IconMap | null {\n return useSyncExternalStore(\n subscribe,\n () => curatedCache.get(pack) ?? null,\n () => null,\n );\n}\n\nfunction useExtendedMap(pack: IconPack): IconMap | null {\n return useSyncExternalStore(\n subscribe,\n () => extendedCache.get(pack) ?? null,\n () => null,\n );\n}\n\n/* ── Pack loading ────────────────────────────────────────────────\n Each pack is isolated in its own file under ./icon-packs/.\n Only the active pack's module is dynamically imported at runtime,\n so bundlers won't resolve unused pack dependencies at build time.\n\n Loading is two-phase:\n 1. Curated map (50 static named imports) — available as soon as\n the pack chunk loads, cached and notified immediately.\n 2. Extended map (full barrel import + kebab-case iteration) —\n loaded in the background, cached and notified when ready. */\n\nconst loadingPacks = new Set<IconPack>();\nconst failedPacks = new Set<IconPack>();\n\ntype PackModule = {\n loadCurated(): IconMap;\n loadExtended(): Promise<IconMap>;\n};\n\nasync function loadPack(pack: IconPack): Promise<void> {\n if (curatedCache.has(pack) || loadingPacks.has(pack) || failedPacks.has(pack)) return;\n loadingPacks.add(pack);\n\n let mod: PackModule;\n try {\n switch (pack) {\n case \"lucide\":\n mod = await import(\"./icon-packs/lucide\");\n break;\n case \"phosphor\":\n try { mod = await import(\"./icon-packs/phosphor\"); }\n catch { throw new Error(\"gridsmith-ui: @phosphor-icons/react is not installed. Run: npm install @phosphor-icons/react\"); }\n break;\n case \"heroicons\":\n try { mod = await import(\"./icon-packs/heroicons\"); }\n catch { throw new Error(\"gridsmith-ui: @heroicons/react is not installed. Run: npm install @heroicons/react\"); }\n break;\n case \"tabler\":\n try { mod = await import(\"./icon-packs/tabler\"); }\n catch { throw new Error(\"gridsmith-ui: @tabler/icons-react is not installed. Run: npm install @tabler/icons-react\"); }\n break;\n case \"feather\":\n try { mod = await import(\"./icon-packs/feather\"); }\n catch { throw new Error(\"gridsmith-ui: react-icons is not installed. Run: npm install react-icons\"); }\n break;\n }\n } catch (err) {\n loadingPacks.delete(pack);\n failedPacks.add(pack);\n console.error(err instanceof Error ? err.message : err);\n return;\n }\n\n curatedCache.set(pack, mod!.loadCurated());\n notifySubscribers();\n\n mod!.loadExtended().then((extended) => {\n extendedCache.set(pack, extended);\n notifySubscribers();\n }).catch(() => {\n // Extended map failed (e.g. network error loading the full barrel).\n // Curated icons still work; extended names will not resolve.\n });\n}\n\n/** Exported for the icon-completeness test — not part of the public API. */\nexport const packLoaders: Record<IconPack, {\n curated: () => Promise<IconMap>;\n extended: () => Promise<IconMap>;\n}> = {\n lucide: { curated: () => import(\"./icon-packs/lucide\").then((m) => m.loadCurated()), extended: () => import(\"./icon-packs/lucide\").then((m) => m.loadExtended()) },\n phosphor: { curated: () => import(\"./icon-packs/phosphor\").then((m) => m.loadCurated()), extended: () => import(\"./icon-packs/phosphor\").then((m) => m.loadExtended()) },\n heroicons: { curated: () => import(\"./icon-packs/heroicons\").then((m) => m.loadCurated()), extended: () => import(\"./icon-packs/heroicons\").then((m) => m.loadExtended()) },\n tabler: { curated: () => import(\"./icon-packs/tabler\").then((m) => m.loadCurated()), extended: () => import(\"./icon-packs/tabler\").then((m) => m.loadExtended()) },\n feather: { curated: () => import(\"./icon-packs/feather\").then((m) => m.loadCurated()), extended: () => import(\"./icon-packs/feather\").then((m) => m.loadExtended()) },\n};\n\n/* ── Context ──────────────────────────────────────────────────── */\n\ninterface IconContextValue {\n pack: IconPack;\n weight: number;\n}\n\nconst IconCtx = createContext<IconContextValue>({ pack: \"lucide\", weight: 1.5 });\n\nexport function IconProvider({ pack, weight, children }: { pack: IconPack; weight: number; children: ReactNode }) {\n useEffect(() => {\n loadPack(pack);\n if (pack !== \"lucide\") loadPack(\"lucide\");\n }, [pack]);\n\n return <IconCtx.Provider value={{ pack, weight }}>{children}</IconCtx.Provider>;\n}\n\n/**\n * Start loading a pack's icon chunk before React mounts. Call this in your\n * app's entry point (e.g. main.tsx) for the fastest possible cold start:\n *\n * import { preloadPack } from 'gridsmith-ui/icons'\n * preloadPack('lucide')\n */\nexport function preloadPack(pack: IconPack): void {\n loadPack(pack);\n}\n\n/* ── Phosphor weight mapping ──────────────────────────────────── */\n\nfunction getPhosphorWeight(numericWeight: number): \"thin\" | \"light\" | \"regular\" | \"bold\" | \"fill\" | \"duotone\" {\n if (numericWeight <= 0.75) return \"thin\";\n if (numericWeight <= 1.25) return \"light\";\n if (numericWeight <= 1.75) return \"regular\";\n if (numericWeight <= 2.25) return \"bold\";\n return \"fill\";\n}\n\n/* ── Icon component ───────────────────────────────────────────── */\n\nexport function Icon({ name, size = 16, className }: { name: IconName; size?: number; className?: string }) {\n const { pack, weight } = useContext(IconCtx);\n\n const curatedMap = useCuratedMap(pack);\n const extendedMap = useExtendedMap(pack);\n const lucideCurated = useCuratedMap(\"lucide\");\n const lucideExtended = useExtendedMap(\"lucide\");\n\n // Ensure the active pack is loading (covers cases where Icon mounts\n // before IconProvider's useEffect fires, e.g. during SSR hydration)\n if (!curatedCache.has(pack) && !loadingPacks.has(pack)) {\n loadPack(pack);\n }\n\n let Comp: IconComponent | undefined | null = null;\n let renderPack: IconPack = pack;\n\n // Tier 1: curated map (available once pack chunk has loaded)\n if (curatedMap) {\n Comp = curatedMap[name];\n }\n\n // Tier 2: extended map (available after barrel import completes)\n if (!Comp && extendedMap) {\n Comp = extendedMap[name];\n }\n\n // Tier 3: lucide fallback (curated first, then extended)\n if (!Comp && pack !== \"lucide\") {\n const fallback = lucideCurated?.[name] ?? lucideExtended?.[name];\n if (fallback) {\n Comp = fallback;\n renderPack = \"lucide\";\n }\n }\n\n if (!Comp) {\n const allMapsLoaded = curatedMap && extendedMap &&\n (pack === \"lucide\" || (lucideCurated && lucideExtended));\n if (allMapsLoaded) return null;\n return <span style={{ display: \"inline-block\", width: size, height: size }} className={className} />;\n }\n\n if (renderPack === \"phosphor\") {\n return <Comp size={size} weight={getPhosphorWeight(weight)} className={className} />;\n }\n\n if (renderPack === \"heroicons\") {\n return <Comp className={className} style={{ width: size, height: size, strokeWidth: weight }} />;\n }\n\n if (renderPack === \"tabler\") {\n return <Comp size={size} stroke={weight} className={className} />;\n }\n\n if (renderPack === \"feather\") {\n return <Comp size={size} className={className} strokeWidth={weight} />;\n }\n\n return <Comp size={size} strokeWidth={weight} className={className} />;\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { useTextOverflow, Tooltip } from './chunk-CHNY75QI.js';
2
- import { Icon } from './chunk-XUBVMRIE.js';
2
+ import { Icon } from './chunk-GX6O72IV.js';
3
3
  import { cn } from './chunk-IUBWNDUK.js';
4
4
  import { jsxs, jsx } from 'react/jsx-runtime';
5
5
 
@@ -89,5 +89,5 @@ function Badge({ variant = "default", size = "md", color, iconLeft, iconRight, m
89
89
  }
90
90
 
91
91
  export { Badge };
92
- //# sourceMappingURL=chunk-4SDKQDYV.js.map
93
- //# sourceMappingURL=chunk-4SDKQDYV.js.map
92
+ //# sourceMappingURL=chunk-UYGTAVKR.js.map
93
+ //# sourceMappingURL=chunk-UYGTAVKR.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../showcase/src/components/Badge.tsx"],"names":[],"mappings":"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","file":"chunk-4SDKQDYV.js","sourcesContent":["import { cn } from \"../lib/utils\";\nimport { Icon, type IconName } from \"../lib/icons\";\nimport { Tooltip } from \"./Tooltip\";\nimport { useTextOverflow } from \"../lib/use-text-overflow\";\nimport type { ReactNode } from \"react\";\n\nexport type BadgeVariant =\n | \"default\"\n | \"neutral\"\n | \"subtle\"\n | \"success\"\n | \"success-soft\"\n | \"warning\"\n | \"warning-soft\"\n | \"error\"\n | \"error-soft\"\n | \"outline\";\n\nexport type BadgeSize = \"xs\" | \"sm\" | \"md\";\nexport type BadgePaletteColor = 1 | 2 | 3 | 4 | 5;\n\nconst variantStyles: Record<BadgeVariant, string> = {\n default: \"bg-[var(--ds-accent-primary)] [background-image:var(--ds-gradient)] text-[var(--ds-text-on-primary)]\",\n neutral: \"bg-[var(--ds-text-muted)]/[0.12] text-[var(--ds-text-secondary)]\",\n subtle: \"bg-[var(--ds-bg-muted)] text-[var(--ds-text-secondary)]\",\n success: \"bg-[var(--ds-status-success)] text-[var(--ds-text-on-primary)]\",\n \"success-soft\": \"bg-[var(--ds-status-success-bg)] text-[var(--ds-status-success)] border-[length:var(--ds-border-width)] border-[var(--ds-status-success)]/[0.2]\",\n warning: \"bg-[var(--ds-status-warning)] text-[var(--ds-text-on-primary)]\",\n \"warning-soft\": \"bg-[var(--ds-status-warning-bg)] text-[var(--ds-status-warning-text)] border-[length:var(--ds-border-width)] border-[var(--ds-status-warning)]/[0.2]\",\n error: \"bg-[var(--ds-status-error)] text-[var(--ds-text-on-primary)]\",\n \"error-soft\": \"bg-[var(--ds-status-error-bg)] text-[var(--ds-status-error)] border-[length:var(--ds-border-width)] border-[var(--ds-status-error)]/[0.2]\",\n outline: \"bg-transparent text-[var(--ds-text-primary)] border-[length:var(--ds-border-width)] border-[var(--ds-border-default)]\",\n};\n\nconst sizeStyles: Record<BadgeSize, string> = {\n xs: \"px-ds-1.5 py-[1px] text-[length:10px] gap-[3px]\",\n sm: \"px-ds-2 py-ds-0.5 text-[length:var(--ds-font-size-xs)] gap-ds-1\",\n md: \"px-ds-2.5 py-ds-0.5 text-[length:var(--ds-font-size-xs)] gap-ds-1\",\n};\n\nconst iconSizes: Record<BadgeSize, number> = {\n xs: 10,\n sm: 12,\n md: 12,\n};\n\ntype PaletteStyleFn = (n: BadgePaletteColor) => string;\n\nconst paletteByVariant: Record<string, PaletteStyleFn> = {\n default: (n) => paletteDefault[n],\n neutral: (n) => paletteSubtle[n],\n subtle: (n) => paletteSubtle[n],\n outline: (n) => paletteOutline[n],\n};\n\nconst paletteDefault: Record<BadgePaletteColor, string> = {\n 1: \"bg-[var(--ds-palette-1-bold)] text-[var(--ds-text-on-primary)]\",\n 2: \"bg-[var(--ds-palette-2-bold)] text-[var(--ds-text-on-primary)]\",\n 3: \"bg-[var(--ds-palette-3-bold)] text-[var(--ds-text-on-primary)]\",\n 4: \"bg-[var(--ds-palette-4-bold)] text-[var(--ds-text-on-primary)]\",\n 5: \"bg-[var(--ds-palette-5-bold)] text-[var(--ds-text-on-primary)]\",\n};\n\nconst paletteSubtle: Record<BadgePaletteColor, string> = {\n 1: \"bg-[var(--ds-palette-1-bg)] text-[var(--ds-palette-1-text)]\",\n 2: \"bg-[var(--ds-palette-2-bg)] text-[var(--ds-palette-2-text)]\",\n 3: \"bg-[var(--ds-palette-3-bg)] text-[var(--ds-palette-3-text)]\",\n 4: \"bg-[var(--ds-palette-4-bg)] text-[var(--ds-palette-4-text)]\",\n 5: \"bg-[var(--ds-palette-5-bg)] text-[var(--ds-palette-5-text)]\",\n};\n\nconst paletteOutline: Record<BadgePaletteColor, string> = {\n 1: \"bg-transparent text-[var(--ds-palette-1-bold)] border-[length:var(--ds-border-width)] border-[var(--ds-palette-1-bold)]\",\n 2: \"bg-transparent text-[var(--ds-palette-2-bold)] border-[length:var(--ds-border-width)] border-[var(--ds-palette-2-bold)]\",\n 3: \"bg-transparent text-[var(--ds-palette-3-bold)] border-[length:var(--ds-border-width)] border-[var(--ds-palette-3-bold)]\",\n 4: \"bg-transparent text-[var(--ds-palette-4-bold)] border-[length:var(--ds-border-width)] border-[var(--ds-palette-4-bold)]\",\n 5: \"bg-transparent text-[var(--ds-palette-5-bold)] border-[length:var(--ds-border-width)] border-[var(--ds-palette-5-bold)]\",\n};\n\nfunction getPaletteClasses(color: BadgePaletteColor, variant: BadgeVariant): string {\n const styleFn = paletteByVariant[variant] ?? paletteByVariant.default;\n return styleFn(color);\n}\n\ninterface BadgeProps {\n variant?: BadgeVariant;\n size?: BadgeSize;\n /** Palette colour (1-5). Overrides variant colour with decorative palette tokens. */\n color?: BadgePaletteColor;\n /** Icon to show before the label */\n iconLeft?: IconName;\n /** Icon to show after the label */\n iconRight?: IconName;\n /** Max width before truncation (e.g. \"120px\", \"16ch\"). Shows tooltip when truncated. */\n maxWidth?: string;\n className?: string;\n children?: ReactNode;\n}\n\nexport function Badge({ variant = \"default\", size = \"md\", color, iconLeft, iconRight, maxWidth, className, children }: BadgeProps) {\n const { ref: truncRef, isTruncated } = useTextOverflow({ lines: 1, disabled: !maxWidth });\n const iconSize = iconSizes[size];\n const isIconOnly = (iconLeft || iconRight) && !children;\n\n const colorClasses = color\n ? getPaletteClasses(color, variant)\n : variantStyles[variant];\n\n const badge = (\n <span\n className={cn(\n \"inline-flex items-center font-medium max-w-full whitespace-nowrap\",\n \"rounded-[var(--ds-radius-full)]\",\n sizeStyles[size],\n isIconOnly && size === \"xs\" && \"px-[3px]\",\n isIconOnly && size === \"sm\" && \"px-ds-1\",\n isIconOnly && size === \"md\" && \"px-ds-1.5\",\n colorClasses,\n className\n )}\n style={maxWidth ? { maxWidth } : undefined}\n >\n {iconLeft && <Icon name={iconLeft} size={iconSize} className=\"shrink-0\" />}\n {maxWidth ? (\n <span ref={truncRef} className=\"truncate\">{children}</span>\n ) : (\n children\n )}\n {iconRight && <Icon name={iconRight} size={iconSize} className=\"shrink-0\" />}\n </span>\n );\n\n if (isTruncated) {\n return <Tooltip content={children}>{badge}</Tooltip>;\n }\n return badge;\n}\n"]}
1
+ {"version":3,"sources":["../../../showcase/src/components/Badge.tsx"],"names":[],"mappings":"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","file":"chunk-UYGTAVKR.js","sourcesContent":["import { cn } from \"../lib/utils\";\nimport { Icon, type IconName } from \"../lib/icons\";\nimport { Tooltip } from \"./Tooltip\";\nimport { useTextOverflow } from \"../lib/use-text-overflow\";\nimport type { ReactNode } from \"react\";\n\nexport type BadgeVariant =\n | \"default\"\n | \"neutral\"\n | \"subtle\"\n | \"success\"\n | \"success-soft\"\n | \"warning\"\n | \"warning-soft\"\n | \"error\"\n | \"error-soft\"\n | \"outline\";\n\nexport type BadgeSize = \"xs\" | \"sm\" | \"md\";\nexport type BadgePaletteColor = 1 | 2 | 3 | 4 | 5;\n\nconst variantStyles: Record<BadgeVariant, string> = {\n default: \"bg-[var(--ds-accent-primary)] [background-image:var(--ds-gradient)] text-[var(--ds-text-on-primary)]\",\n neutral: \"bg-[var(--ds-text-muted)]/[0.12] text-[var(--ds-text-secondary)]\",\n subtle: \"bg-[var(--ds-bg-muted)] text-[var(--ds-text-secondary)]\",\n success: \"bg-[var(--ds-status-success)] text-[var(--ds-text-on-primary)]\",\n \"success-soft\": \"bg-[var(--ds-status-success-bg)] text-[var(--ds-status-success)] border-[length:var(--ds-border-width)] border-[var(--ds-status-success)]/[0.2]\",\n warning: \"bg-[var(--ds-status-warning)] text-[var(--ds-text-on-primary)]\",\n \"warning-soft\": \"bg-[var(--ds-status-warning-bg)] text-[var(--ds-status-warning-text)] border-[length:var(--ds-border-width)] border-[var(--ds-status-warning)]/[0.2]\",\n error: \"bg-[var(--ds-status-error)] text-[var(--ds-text-on-primary)]\",\n \"error-soft\": \"bg-[var(--ds-status-error-bg)] text-[var(--ds-status-error)] border-[length:var(--ds-border-width)] border-[var(--ds-status-error)]/[0.2]\",\n outline: \"bg-transparent text-[var(--ds-text-primary)] border-[length:var(--ds-border-width)] border-[var(--ds-border-default)]\",\n};\n\nconst sizeStyles: Record<BadgeSize, string> = {\n xs: \"px-ds-1.5 py-[1px] text-[length:10px] gap-[3px]\",\n sm: \"px-ds-2 py-ds-0.5 text-[length:var(--ds-font-size-xs)] gap-ds-1\",\n md: \"px-ds-2.5 py-ds-0.5 text-[length:var(--ds-font-size-xs)] gap-ds-1\",\n};\n\nconst iconSizes: Record<BadgeSize, number> = {\n xs: 10,\n sm: 12,\n md: 12,\n};\n\ntype PaletteStyleFn = (n: BadgePaletteColor) => string;\n\nconst paletteByVariant: Record<string, PaletteStyleFn> = {\n default: (n) => paletteDefault[n],\n neutral: (n) => paletteSubtle[n],\n subtle: (n) => paletteSubtle[n],\n outline: (n) => paletteOutline[n],\n};\n\nconst paletteDefault: Record<BadgePaletteColor, string> = {\n 1: \"bg-[var(--ds-palette-1-bold)] text-[var(--ds-text-on-primary)]\",\n 2: \"bg-[var(--ds-palette-2-bold)] text-[var(--ds-text-on-primary)]\",\n 3: \"bg-[var(--ds-palette-3-bold)] text-[var(--ds-text-on-primary)]\",\n 4: \"bg-[var(--ds-palette-4-bold)] text-[var(--ds-text-on-primary)]\",\n 5: \"bg-[var(--ds-palette-5-bold)] text-[var(--ds-text-on-primary)]\",\n};\n\nconst paletteSubtle: Record<BadgePaletteColor, string> = {\n 1: \"bg-[var(--ds-palette-1-bg)] text-[var(--ds-palette-1-text)]\",\n 2: \"bg-[var(--ds-palette-2-bg)] text-[var(--ds-palette-2-text)]\",\n 3: \"bg-[var(--ds-palette-3-bg)] text-[var(--ds-palette-3-text)]\",\n 4: \"bg-[var(--ds-palette-4-bg)] text-[var(--ds-palette-4-text)]\",\n 5: \"bg-[var(--ds-palette-5-bg)] text-[var(--ds-palette-5-text)]\",\n};\n\nconst paletteOutline: Record<BadgePaletteColor, string> = {\n 1: \"bg-transparent text-[var(--ds-palette-1-bold)] border-[length:var(--ds-border-width)] border-[var(--ds-palette-1-bold)]\",\n 2: \"bg-transparent text-[var(--ds-palette-2-bold)] border-[length:var(--ds-border-width)] border-[var(--ds-palette-2-bold)]\",\n 3: \"bg-transparent text-[var(--ds-palette-3-bold)] border-[length:var(--ds-border-width)] border-[var(--ds-palette-3-bold)]\",\n 4: \"bg-transparent text-[var(--ds-palette-4-bold)] border-[length:var(--ds-border-width)] border-[var(--ds-palette-4-bold)]\",\n 5: \"bg-transparent text-[var(--ds-palette-5-bold)] border-[length:var(--ds-border-width)] border-[var(--ds-palette-5-bold)]\",\n};\n\nfunction getPaletteClasses(color: BadgePaletteColor, variant: BadgeVariant): string {\n const styleFn = paletteByVariant[variant] ?? paletteByVariant.default;\n return styleFn(color);\n}\n\ninterface BadgeProps {\n variant?: BadgeVariant;\n size?: BadgeSize;\n /** Palette colour (1-5). Overrides variant colour with decorative palette tokens. */\n color?: BadgePaletteColor;\n /** Icon to show before the label */\n iconLeft?: IconName;\n /** Icon to show after the label */\n iconRight?: IconName;\n /** Max width before truncation (e.g. \"120px\", \"16ch\"). Shows tooltip when truncated. */\n maxWidth?: string;\n className?: string;\n children?: ReactNode;\n}\n\nexport function Badge({ variant = \"default\", size = \"md\", color, iconLeft, iconRight, maxWidth, className, children }: BadgeProps) {\n const { ref: truncRef, isTruncated } = useTextOverflow({ lines: 1, disabled: !maxWidth });\n const iconSize = iconSizes[size];\n const isIconOnly = (iconLeft || iconRight) && !children;\n\n const colorClasses = color\n ? getPaletteClasses(color, variant)\n : variantStyles[variant];\n\n const badge = (\n <span\n className={cn(\n \"inline-flex items-center font-medium max-w-full whitespace-nowrap\",\n \"rounded-[var(--ds-radius-full)]\",\n sizeStyles[size],\n isIconOnly && size === \"xs\" && \"px-[3px]\",\n isIconOnly && size === \"sm\" && \"px-ds-1\",\n isIconOnly && size === \"md\" && \"px-ds-1.5\",\n colorClasses,\n className\n )}\n style={maxWidth ? { maxWidth } : undefined}\n >\n {iconLeft && <Icon name={iconLeft} size={iconSize} className=\"shrink-0\" />}\n {maxWidth ? (\n <span ref={truncRef} className=\"truncate\">{children}</span>\n ) : (\n children\n )}\n {iconRight && <Icon name={iconRight} size={iconSize} className=\"shrink-0\" />}\n </span>\n );\n\n if (isTruncated) {\n return <Tooltip content={children}>{badge}</Tooltip>;\n }\n return badge;\n}\n"]}
package/dist/data-grid.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { useBreakpoint } from './chunk-DPF6776I.js';
2
2
  import { useTextOverflow, Tooltip } from './chunk-CHNY75QI.js';
3
- import { Icon } from './chunk-XUBVMRIE.js';
3
+ import { Icon } from './chunk-GX6O72IV.js';
4
4
  import { cn } from './chunk-IUBWNDUK.js';
5
5
  import { useState, useMemo, useCallback } from 'react';
6
6
  import { useReactTable, getPaginationRowModel, getSortedRowModel, getCoreRowModel, flexRender } from '@tanstack/react-table';
package/dist/editor.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { useBreakpoint } from './chunk-DPF6776I.js';
2
- import { Icon } from './chunk-XUBVMRIE.js';
2
+ import { Icon } from './chunk-GX6O72IV.js';
3
3
  import { cn } from './chunk-IUBWNDUK.js';
4
4
  import { useState, useEffect, useRef, useCallback } from 'react';
5
5
  import { useEditor, EditorContent } from '@tiptap/react';
@@ -1,5 +1,5 @@
1
1
  import { buildExtendedMap } from './chunk-GYVBRUO2.js';
2
- import { FiUpload, FiDownload, FiBookmark, FiStar, FiMenu, FiEdit2, FiLogOut, FiSend, FiPaperclip, FiMic, FiMoreVertical, FiArrowLeft, FiRotateCw, FiRotateCcw, FiTrash2, FiChevronDown, FiChevronUp, FiType, FiMinus, FiMessageSquare, FiCode, FiGrid, FiImage, FiLink, FiCheckSquare, FiList, FiAlignRight, FiAlignCenter, FiAlignLeft, FiSlash, FiUnderline, FiItalic, FiBold, FiCalendar, FiClock, FiAlertCircle, FiInfo, FiAlertTriangle, FiCheck, FiUser, FiBell, FiSearch, FiPlus, FiX, FiChevronRight, FiSettings, FiBarChart2, FiFolder, FiHome } from 'react-icons/fi';
2
+ import { FiUpload, FiDownload, FiBookmark, FiStar, FiMoreHorizontal, FiMenu, FiEdit2, FiLogOut, FiSend, FiPaperclip, FiMic, FiMoreVertical, FiArrowLeft, FiRotateCw, FiRotateCcw, FiTrash2, FiChevronDown, FiChevronUp, FiType, FiMinus, FiMessageSquare, FiCode, FiGrid, FiImage, FiLink, FiCheckSquare, FiList, FiAlignRight, FiAlignCenter, FiAlignLeft, FiSlash, FiUnderline, FiItalic, FiBold, FiCalendar, FiClock, FiAlertCircle, FiInfo, FiAlertTriangle, FiCheck, FiUser, FiBell, FiSearch, FiPlus, FiX, FiChevronRight, FiSettings, FiBarChart2, FiFolder, FiHome } from 'react-icons/fi';
3
3
 
4
4
  var curated = {
5
5
  "home": FiHome,
@@ -51,6 +51,7 @@ var curated = {
51
51
  "log-out": FiLogOut,
52
52
  "edit": FiEdit2,
53
53
  "menu": FiMenu,
54
+ "more-horizontal": FiMoreHorizontal,
54
55
  "star": FiStar,
55
56
  "bookmark": FiBookmark,
56
57
  "download": FiDownload,
@@ -67,5 +68,5 @@ async function loadExtended() {
67
68
  }
68
69
 
69
70
  export { loadCurated, loadExtended };
70
- //# sourceMappingURL=feather-V32UNIQL.js.map
71
- //# sourceMappingURL=feather-V32UNIQL.js.map
71
+ //# sourceMappingURL=feather-U45EQTAU.js.map
72
+ //# sourceMappingURL=feather-U45EQTAU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../showcase/src/lib/icon-packs/feather.ts"],"names":[],"mappings":";;;AAuBA,IAAM,OAAA,GAAmB;AAAA,EACvB,MAAA,EAAQ,MAAA;AAAA,EAAQ,QAAA,EAAU,QAAA;AAAA,EAAU,OAAA,EAAS,WAAA;AAAA,EAAa,UAAA,EAAY,UAAA;AAAA,EACtE,eAAA,EAAiB,cAAA;AAAA,EAAgB,OAAA,EAAS,GAAA;AAAA,EAAK,MAAA,EAAQ,MAAA;AAAA,EAAQ,QAAA,EAAU,QAAA;AAAA,EACzE,MAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA,EAAS,OAAA;AAAA,EAAS,SAAA,EAAW,eAAA;AAAA,EAC7D,MAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA,EAAS,aAAA;AAAA,EAAe,OAAA,EAAS,OAAA;AAAA,EAAS,UAAA,EAAY,UAAA;AAAA,EACtE,MAAA,EAAQ,MAAA;AAAA,EAAQ,QAAA,EAAU,QAAA;AAAA,EAAU,WAAA,EAAa,WAAA;AAAA,EAAa,eAAA,EAAiB,OAAA;AAAA,EAC/E,YAAA,EAAc,WAAA;AAAA,EAAa,cAAA,EAAgB,aAAA;AAAA,EAAe,aAAA,EAAe,YAAA;AAAA,EACzE,MAAA,EAAQ,MAAA;AAAA,EAAQ,cAAA,EAAgB,MAAA;AAAA,EAAQ,aAAA,EAAe,aAAA;AAAA,EACvD,MAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA,EAAS,OAAA;AAAA,EAAS,OAAA,EAAS,MAAA;AAAA,EAAQ,MAAA,EAAQ,MAAA;AAAA,EAC3D,OAAA,EAAS,eAAA;AAAA,EAAiB,OAAA,EAAS,OAAA;AAAA,EAAS,aAAA,EAAe,WAAA;AAAA,EAC3D,WAAA,EAAa,aAAA;AAAA,EAAe,WAAA,EAAa,OAAA;AAAA,EAAS,MAAA,EAAQ,MAAA;AAAA,EAC1D,YAAA,EAAc,WAAA;AAAA,EAAa,cAAA,EAAgB,aAAA;AAAA,EAAe,OAAA,EAAS,QAAA;AAAA,EACnE,MAAA,EAAQ,WAAA;AAAA,EAAa,MAAA,EAAQ,UAAA;AAAA,EAC7B,YAAA,EAAc,WAAA;AAAA,EAAa,eAAA,EAAiB,cAAA;AAAA,EAC5C,KAAA,EAAO,KAAA;AAAA,EAAO,WAAA,EAAa,WAAA;AAAA,EAAa,MAAA,EAAQ,MAAA;AAAA,EAChD,SAAA,EAAW,QAAA;AAAA,EAAU,MAAA,EAAQ,OAAA;AAAA,EAAS,MAAA,EAAQ,MAAA;AAAA,EAAQ,iBAAA,EAAmB,gBAAA;AAAA,EACzE,MAAA,EAAQ,MAAA;AAAA,EAAQ,UAAA,EAAY,UAAA;AAAA,EAC5B,UAAA,EAAY,UAAA;AAAA,EAAY,QAAA,EAAU;AACpC,CAAA;AAEO,SAAS,WAAA,GAAuB;AACrC,EAAA,OAAO,OAAA;AACT;AAEA,eAAsB,YAAA,GAAiC;AACrD,EAAA,MAAM,CAAA,GAAI,MAAM,OAAO,gBAAgB,CAAA;AACvC,EAAA,MAAM,QAAA,GAAW,iBAAiB,CAAA,EAAyC,IAAI,EAAE,WAAA,EAAa,MAAM,CAAA;AACpG,EAAA,MAAA,CAAO,MAAA,CAAO,UAAU,OAAO,CAAA;AAC/B,EAAA,OAAO,QAAA;AACT","file":"feather-U45EQTAU.js","sourcesContent":["import type { IconMap } from './types'\nimport { buildExtendedMap } from './utils'\nimport {\n FiHome, FiFolder, FiBarChart2, FiSettings,\n FiChevronRight, FiX, FiPlus, FiSearch,\n FiBell, FiUser, FiCheck, FiAlertTriangle,\n FiInfo, FiAlertCircle, FiClock, FiCalendar,\n FiBold, FiItalic, FiUnderline, FiSlash,\n FiAlignLeft, FiAlignCenter, FiAlignRight,\n FiList, FiCheckSquare,\n FiLink, FiImage, FiGrid, FiCode,\n FiMessageSquare, FiMinus, FiChevronUp,\n FiChevronDown, FiEdit2, FiType,\n FiTrash2,\n FiRotateCcw, FiRotateCw,\n FiArrowLeft, FiMoreVertical,\n FiMic, FiPaperclip, FiSend,\n FiLogOut, FiMenu,\n FiStar, FiBookmark,\n FiDownload, FiUpload,\n FiMoreHorizontal,\n} from \"react-icons/fi\"\n\nconst curated: IconMap = {\n \"home\": FiHome, \"folder\": FiFolder, \"chart\": FiBarChart2, \"settings\": FiSettings,\n \"chevron-right\": FiChevronRight, \"close\": FiX, \"plus\": FiPlus, \"search\": FiSearch,\n \"bell\": FiBell, \"user\": FiUser, \"check\": FiCheck, \"warning\": FiAlertTriangle,\n \"info\": FiInfo, \"error\": FiAlertCircle, \"clock\": FiClock, \"calendar\": FiCalendar,\n \"bold\": FiBold, \"italic\": FiItalic, \"underline\": FiUnderline, \"strikethrough\": FiSlash,\n \"align-left\": FiAlignLeft, \"align-center\": FiAlignCenter, \"align-right\": FiAlignRight,\n \"list\": FiList, \"list-ordered\": FiList, \"list-checks\": FiCheckSquare,\n \"link\": FiLink, \"image\": FiImage, \"table\": FiGrid, \"code\": FiCode,\n \"quote\": FiMessageSquare, \"minus\": FiMinus, \"superscript\": FiChevronUp,\n \"subscript\": FiChevronDown, \"highlight\": FiEdit2, \"type\": FiType,\n \"chevron-up\": FiChevronUp, \"chevron-down\": FiChevronDown, \"trash\": FiTrash2,\n \"undo\": FiRotateCcw, \"redo\": FiRotateCw,\n \"arrow-left\": FiArrowLeft, \"grip-vertical\": FiMoreVertical,\n \"mic\": FiMic, \"paperclip\": FiPaperclip, \"send\": FiSend,\n \"log-out\": FiLogOut, \"edit\": FiEdit2, \"menu\": FiMenu, \"more-horizontal\": FiMoreHorizontal,\n \"star\": FiStar, \"bookmark\": FiBookmark,\n \"download\": FiDownload, \"upload\": FiUpload,\n}\n\nexport function loadCurated(): IconMap {\n return curated\n}\n\nexport async function loadExtended(): Promise<IconMap> {\n const F = await import(\"react-icons/fi\")\n const extended = buildExtendedMap(F as unknown as Record<string, unknown>, {}, { stripPrefix: \"Fi\" })\n Object.assign(extended, curated)\n return extended\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { buildExtendedMap } from './chunk-GYVBRUO2.js';
2
- import { ArrowUpTrayIcon, ArrowDownTrayIcon, BookmarkIcon, StarIcon, Bars3Icon, PencilIcon, ArrowRightStartOnRectangleIcon, PaperAirplaneIcon, PaperClipIcon, MicrophoneIcon, Bars2Icon, ArrowLeftIcon, ArrowUturnRightIcon, ArrowUturnLeftIcon, TrashIcon, ChevronDownIcon, ChevronUpIcon, LanguageIcon, PaintBrushIcon, H2Icon, H1Icon, MinusIcon, ChatBubbleBottomCenterTextIcon, CodeBracketIcon, TableCellsIcon, PhotoIcon, LinkIcon, ClipboardDocumentCheckIcon, NumberedListIcon, ListBulletIcon, Bars3BottomRightIcon, Bars3BottomLeftIcon, StrikethroughIcon, UnderlineIcon, ItalicIcon, BoldIcon, CalendarDaysIcon, ClockIcon, ExclamationCircleIcon, InformationCircleIcon, ExclamationTriangleIcon, CheckIcon, UserIcon, BellIcon, MagnifyingGlassIcon, PlusIcon, XMarkIcon, ChevronRightIcon, Cog6ToothIcon, ChartBarIcon, FolderIcon, HomeIcon } from '@heroicons/react/24/outline';
2
+ import { ArrowUpTrayIcon, ArrowDownTrayIcon, BookmarkIcon, StarIcon, EllipsisHorizontalIcon, Bars3Icon, PencilIcon, ArrowRightStartOnRectangleIcon, PaperAirplaneIcon, PaperClipIcon, MicrophoneIcon, Bars2Icon, ArrowLeftIcon, ArrowUturnRightIcon, ArrowUturnLeftIcon, TrashIcon, ChevronDownIcon, ChevronUpIcon, LanguageIcon, PaintBrushIcon, H2Icon, H1Icon, MinusIcon, ChatBubbleBottomCenterTextIcon, CodeBracketIcon, TableCellsIcon, PhotoIcon, LinkIcon, ClipboardDocumentCheckIcon, NumberedListIcon, ListBulletIcon, Bars3BottomRightIcon, Bars3BottomLeftIcon, StrikethroughIcon, UnderlineIcon, ItalicIcon, BoldIcon, CalendarDaysIcon, ClockIcon, ExclamationCircleIcon, InformationCircleIcon, ExclamationTriangleIcon, CheckIcon, UserIcon, BellIcon, MagnifyingGlassIcon, PlusIcon, XMarkIcon, ChevronRightIcon, Cog6ToothIcon, ChartBarIcon, FolderIcon, HomeIcon } from '@heroicons/react/24/outline';
3
3
 
4
4
  var curated = {
5
5
  "home": HomeIcon,
@@ -51,6 +51,7 @@ var curated = {
51
51
  "log-out": ArrowRightStartOnRectangleIcon,
52
52
  "edit": PencilIcon,
53
53
  "menu": Bars3Icon,
54
+ "more-horizontal": EllipsisHorizontalIcon,
54
55
  "star": StarIcon,
55
56
  "bookmark": BookmarkIcon,
56
57
  "download": ArrowDownTrayIcon,
@@ -67,5 +68,5 @@ async function loadExtended() {
67
68
  }
68
69
 
69
70
  export { loadCurated, loadExtended };
70
- //# sourceMappingURL=heroicons-CA5OQ76O.js.map
71
- //# sourceMappingURL=heroicons-CA5OQ76O.js.map
71
+ //# sourceMappingURL=heroicons-D3G7QU45.js.map
72
+ //# sourceMappingURL=heroicons-D3G7QU45.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../showcase/src/lib/icon-packs/heroicons.ts"],"names":[],"mappings":";;;AA4BA,IAAM,OAAA,GAAmB;AAAA,EACvB,MAAA,EAAQ,QAAA;AAAA,EAAU,QAAA,EAAU,UAAA;AAAA,EAAY,OAAA,EAAS,YAAA;AAAA,EACjD,UAAA,EAAY,aAAA;AAAA,EAAe,eAAA,EAAiB,gBAAA;AAAA,EAC5C,OAAA,EAAS,SAAA;AAAA,EAAW,MAAA,EAAQ,QAAA;AAAA,EAAU,QAAA,EAAU,mBAAA;AAAA,EAChD,MAAA,EAAQ,QAAA;AAAA,EAAU,MAAA,EAAQ,QAAA;AAAA,EAAU,OAAA,EAAS,SAAA;AAAA,EAC7C,SAAA,EAAW,uBAAA;AAAA,EAAyB,MAAA,EAAQ,qBAAA;AAAA,EAC5C,OAAA,EAAS,qBAAA;AAAA,EAAuB,OAAA,EAAS,SAAA;AAAA,EAAW,UAAA,EAAY,gBAAA;AAAA,EAChE,MAAA,EAAQ,QAAA;AAAA,EAAU,QAAA,EAAU,UAAA;AAAA,EAAY,WAAA,EAAa,aAAA;AAAA,EACrD,eAAA,EAAiB,iBAAA;AAAA,EAAmB,YAAA,EAAc,mBAAA;AAAA,EAClD,cAAA,EAAgB,SAAA;AAAA,EAAW,aAAA,EAAe,oBAAA;AAAA,EAC1C,MAAA,EAAQ,cAAA;AAAA,EAAgB,cAAA,EAAgB,gBAAA;AAAA,EACxC,aAAA,EAAe,0BAAA;AAAA,EAA4B,MAAA,EAAQ,QAAA;AAAA,EACnD,OAAA,EAAS,SAAA;AAAA,EAAW,OAAA,EAAS,cAAA;AAAA,EAAgB,MAAA,EAAQ,eAAA;AAAA,EACrD,OAAA,EAAS,8BAAA;AAAA,EAAgC,OAAA,EAAS,SAAA;AAAA,EAClD,aAAA,EAAe,MAAA;AAAA,EAAQ,WAAA,EAAa,MAAA;AAAA,EACpC,WAAA,EAAa,cAAA;AAAA,EAAgB,MAAA,EAAQ,YAAA;AAAA,EACrC,YAAA,EAAc,aAAA;AAAA,EAAe,cAAA,EAAgB,eAAA;AAAA,EAAiB,OAAA,EAAS,SAAA;AAAA,EACvE,MAAA,EAAQ,kBAAA;AAAA,EAAoB,MAAA,EAAQ,mBAAA;AAAA,EACpC,YAAA,EAAc,aAAA;AAAA,EAAe,eAAA,EAAiB,SAAA;AAAA,EAC9C,KAAA,EAAO,cAAA;AAAA,EAAgB,WAAA,EAAa,aAAA;AAAA,EAAe,MAAA,EAAQ,iBAAA;AAAA,EAC3D,SAAA,EAAW,8BAAA;AAAA,EAAgC,MAAA,EAAQ,UAAA;AAAA,EAAY,MAAA,EAAQ,SAAA;AAAA,EAAW,iBAAA,EAAmB,sBAAA;AAAA,EACrG,MAAA,EAAQ,QAAA;AAAA,EAAU,UAAA,EAAY,YAAA;AAAA,EAC9B,UAAA,EAAY,iBAAA;AAAA,EAAmB,QAAA,EAAU;AAC3C,CAAA;AAEO,SAAS,WAAA,GAAuB;AACrC,EAAA,OAAO,OAAA;AACT;AAEA,eAAsB,YAAA,GAAiC;AACrD,EAAA,MAAM,CAAA,GAAI,MAAM,OAAO,6BAA6B,CAAA;AACpD,EAAA,MAAM,QAAA,GAAW,iBAAiB,CAAA,EAAyC,IAAI,EAAE,WAAA,EAAa,QAAQ,CAAA;AACtG,EAAA,MAAA,CAAO,MAAA,CAAO,UAAU,OAAO,CAAA;AAC/B,EAAA,OAAO,QAAA;AACT","file":"heroicons-D3G7QU45.js","sourcesContent":["import type { IconMap } from './types'\nimport { buildExtendedMap } from './utils'\nimport {\n HomeIcon, FolderIcon, ChartBarIcon,\n Cog6ToothIcon, ChevronRightIcon,\n XMarkIcon, PlusIcon, MagnifyingGlassIcon,\n BellIcon, UserIcon, CheckIcon,\n ExclamationTriangleIcon, InformationCircleIcon,\n ExclamationCircleIcon, ClockIcon, CalendarDaysIcon,\n BoldIcon, ItalicIcon, UnderlineIcon,\n StrikethroughIcon, Bars3BottomLeftIcon,\n Bars3Icon, Bars3BottomRightIcon,\n ListBulletIcon, NumberedListIcon,\n ClipboardDocumentCheckIcon, LinkIcon,\n PhotoIcon, TableCellsIcon, CodeBracketIcon,\n ChatBubbleBottomCenterTextIcon, MinusIcon,\n H1Icon, H2Icon,\n PaintBrushIcon, LanguageIcon,\n ChevronUpIcon, ChevronDownIcon, TrashIcon,\n ArrowUturnLeftIcon, ArrowUturnRightIcon,\n ArrowLeftIcon, Bars2Icon,\n MicrophoneIcon, PaperClipIcon, PaperAirplaneIcon,\n ArrowRightStartOnRectangleIcon, PencilIcon,\n StarIcon, BookmarkIcon,\n ArrowDownTrayIcon, ArrowUpTrayIcon,\n EllipsisHorizontalIcon,\n} from \"@heroicons/react/24/outline\"\n\nconst curated: IconMap = {\n \"home\": HomeIcon, \"folder\": FolderIcon, \"chart\": ChartBarIcon,\n \"settings\": Cog6ToothIcon, \"chevron-right\": ChevronRightIcon,\n \"close\": XMarkIcon, \"plus\": PlusIcon, \"search\": MagnifyingGlassIcon,\n \"bell\": BellIcon, \"user\": UserIcon, \"check\": CheckIcon,\n \"warning\": ExclamationTriangleIcon, \"info\": InformationCircleIcon,\n \"error\": ExclamationCircleIcon, \"clock\": ClockIcon, \"calendar\": CalendarDaysIcon,\n \"bold\": BoldIcon, \"italic\": ItalicIcon, \"underline\": UnderlineIcon,\n \"strikethrough\": StrikethroughIcon, \"align-left\": Bars3BottomLeftIcon,\n \"align-center\": Bars3Icon, \"align-right\": Bars3BottomRightIcon,\n \"list\": ListBulletIcon, \"list-ordered\": NumberedListIcon,\n \"list-checks\": ClipboardDocumentCheckIcon, \"link\": LinkIcon,\n \"image\": PhotoIcon, \"table\": TableCellsIcon, \"code\": CodeBracketIcon,\n \"quote\": ChatBubbleBottomCenterTextIcon, \"minus\": MinusIcon,\n \"superscript\": H1Icon, \"subscript\": H2Icon,\n \"highlight\": PaintBrushIcon, \"type\": LanguageIcon,\n \"chevron-up\": ChevronUpIcon, \"chevron-down\": ChevronDownIcon, \"trash\": TrashIcon,\n \"undo\": ArrowUturnLeftIcon, \"redo\": ArrowUturnRightIcon,\n \"arrow-left\": ArrowLeftIcon, \"grip-vertical\": Bars2Icon,\n \"mic\": MicrophoneIcon, \"paperclip\": PaperClipIcon, \"send\": PaperAirplaneIcon,\n \"log-out\": ArrowRightStartOnRectangleIcon, \"edit\": PencilIcon, \"menu\": Bars3Icon, \"more-horizontal\": EllipsisHorizontalIcon,\n \"star\": StarIcon, \"bookmark\": BookmarkIcon,\n \"download\": ArrowDownTrayIcon, \"upload\": ArrowUpTrayIcon,\n}\n\nexport function loadCurated(): IconMap {\n return curated\n}\n\nexport async function loadExtended(): Promise<IconMap> {\n const H = await import(\"@heroicons/react/24/outline\")\n const extended = buildExtendedMap(H as unknown as Record<string, unknown>, {}, { stripSuffix: \"Icon\" })\n Object.assign(extended, curated)\n return extended\n}\n"]}
package/dist/icons.d.ts CHANGED
@@ -7,7 +7,7 @@ import { ReactNode } from 'react';
7
7
  * Every name must have an alias (or auto-kebab match) in ALL five packs —
8
8
  * icon-completeness.test.tsx enforces this.
9
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"];
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", "more-horizontal", "star", "bookmark", "download", "upload"];
11
11
  type CuratedIconName = (typeof CURATED_ICON_NAMES)[number];
12
12
  /**
13
13
  * Curated names provide autocomplete and work identically across all 5 packs.
package/dist/icons.js CHANGED
@@ -1,3 +1,3 @@
1
- export { Icon, IconProvider, preloadPack } from './chunk-XUBVMRIE.js';
1
+ export { Icon, IconProvider, preloadPack } from './chunk-GX6O72IV.js';
2
2
  //# sourceMappingURL=icons.js.map
3
3
  //# sourceMappingURL=icons.js.map
package/dist/index.js CHANGED
@@ -1,12 +1,12 @@
1
1
  import { Skeleton } from './chunk-OUYJXVLQ.js';
2
2
  export { Skeleton } from './chunk-OUYJXVLQ.js';
3
- import { Badge } from './chunk-4SDKQDYV.js';
4
- export { Badge } from './chunk-4SDKQDYV.js';
3
+ import { Badge } from './chunk-UYGTAVKR.js';
4
+ export { Badge } from './chunk-UYGTAVKR.js';
5
5
  import { useBreakpoint } from './chunk-DPF6776I.js';
6
6
  export { BreakpointWidthProvider, useBreakpoint } from './chunk-DPF6776I.js';
7
7
  import { Tooltip, useTextOverflow, usePosition, Slot } from './chunk-CHNY75QI.js';
8
8
  export { Tooltip, useTextOverflow } from './chunk-CHNY75QI.js';
9
- import { Icon } from './chunk-XUBVMRIE.js';
9
+ import { Icon } from './chunk-GX6O72IV.js';
10
10
  import { cn, GLASS_SURFACE, GLASS_BACKDROP, GLASS_DROPDOWN, lockBodyScroll, unlockBodyScroll, GLASS_OVERLAY } from './chunk-IUBWNDUK.js';
11
11
  import { createContext, forwardRef, useContext, useState, useRef, useEffect, useCallback, useId, isValidElement, cloneElement, useMemo, Children, Fragment as Fragment$1, useLayoutEffect } from 'react';
12
12
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
@@ -81,6 +81,7 @@ var Button = forwardRef(function Button2({ variant = "default", size: sizeProp,
81
81
  "button",
82
82
  {
83
83
  ref,
84
+ "data-variant": variant,
84
85
  className: cn(
85
86
  "relative inline-flex items-center justify-center gap-ds-2 whitespace-nowrap font-medium",
86
87
  isLink ? cn(
@@ -598,12 +599,13 @@ function Dropdown({
598
599
  focusOption(current < 0 ? els.length - 1 : current - 1);
599
600
  return;
600
601
  }
601
- if (e.key === "Home") {
602
+ const inSearch = document.activeElement === searchRef.current;
603
+ if (e.key === "Home" && !inSearch) {
602
604
  e.preventDefault();
603
605
  focusOption(0);
604
606
  return;
605
607
  }
606
- if (e.key === "End") {
608
+ if (e.key === "End" && !inSearch) {
607
609
  e.preventDefault();
608
610
  focusOption(els.length - 1);
609
611
  return;
@@ -1152,6 +1154,38 @@ function RadioGroup({ value, onChange, options, orientation = "vertical", classN
1152
1154
  )
1153
1155
  ] });
1154
1156
  }
1157
+ var FOCUSABLE = 'a[href], button:not(:disabled), input:not(:disabled), select:not(:disabled), textarea:not(:disabled), [tabindex]:not([tabindex="-1"])';
1158
+ var FIELD = "input, select, textarea, [contenteditable='true']";
1159
+ var SAFE_BUTTON = 'button:not([data-variant="destructive"])';
1160
+ var OVERLAY_CLOSE_ATTR = "data-overlay-close";
1161
+ function focusInitial(root, opts = {}) {
1162
+ if (!root) return false;
1163
+ const all = Array.from(root.querySelectorAll(FOCUSABLE));
1164
+ if (!all.length) return false;
1165
+ const candidates = all.filter((el) => !el.hasAttribute(OVERLAY_CLOSE_ATTR));
1166
+ if (opts.destructive) {
1167
+ const safe = candidates.find((el) => el.matches(SAFE_BUTTON));
1168
+ if (safe) {
1169
+ safe.focus();
1170
+ return true;
1171
+ }
1172
+ }
1173
+ const target = candidates.find((el) => el.matches(FIELD)) ?? candidates[0] ?? all[0];
1174
+ target.focus();
1175
+ return true;
1176
+ }
1177
+ function useReturnFocus(open) {
1178
+ const triggerRef = useRef(null);
1179
+ useEffect(() => {
1180
+ if (open) {
1181
+ triggerRef.current = document.activeElement;
1182
+ return;
1183
+ }
1184
+ const el = triggerRef.current;
1185
+ triggerRef.current = null;
1186
+ if (el && el.isConnected && typeof el.focus === "function") el.focus();
1187
+ }, [open]);
1188
+ }
1155
1189
  var DAYS = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"];
1156
1190
  var MONTHS = [
1157
1191
  "January",
@@ -1214,6 +1248,10 @@ function DatePicker({ value, onChange, placeholder = "Pick a date", disabled, cl
1214
1248
  const nextMonth = () => setViewDate(new Date(year, month + 1, 1));
1215
1249
  const startOf = (d) => new Date(d.getFullYear(), d.getMonth(), d.getDate());
1216
1250
  const isDisabledDay = (d) => !!min && d < startOf(min) || !!max && d > startOf(max);
1251
+ useReturnFocus(open);
1252
+ useEffect(() => {
1253
+ if (open) requestAnimationFrame(() => focusInitial(panelRef.current));
1254
+ }, [open]);
1217
1255
  const selectDay = (day) => {
1218
1256
  const d = new Date(year, month, day);
1219
1257
  if (isDisabledDay(d)) return;
@@ -1589,6 +1627,10 @@ function DateRangePicker({
1589
1627
  const pos = usePosition(triggerRef, panelRef, open, { side: "bottom", align: "start", offset: 4, flip: true });
1590
1628
  const today = useMemo(() => startOfDay(/* @__PURE__ */ new Date()), []);
1591
1629
  const dayNames = getOrderedDayNamesShort(weekStartsOn);
1630
+ useReturnFocus(open);
1631
+ useEffect(() => {
1632
+ if (open) requestAnimationFrame(() => focusInitial(panelRef.current));
1633
+ }, [open]);
1592
1634
  useEffect(() => {
1593
1635
  if (!open) return;
1594
1636
  const onMouse = (e) => {
@@ -7776,7 +7818,7 @@ function Popover({ open, onOpenChange, trigger, children, side = "bottom", align
7776
7818
  };
7777
7819
  }, [open, onOpenChange]);
7778
7820
  useEffect(() => {
7779
- if (open) floatingRef.current?.querySelector("a, button, input, [tabindex]")?.focus();
7821
+ if (open) focusInitial(floatingRef.current);
7780
7822
  }, [open]);
7781
7823
  return /* @__PURE__ */ jsxs(Fragment, { children: [
7782
7824
  /* @__PURE__ */ jsx(
@@ -9910,11 +9952,12 @@ function Drawer({ open, onClose, position = "right", width = "400px", title, chi
9910
9952
  if (!container) unlockBodyScroll();
9911
9953
  };
9912
9954
  }, [open, container]);
9955
+ useReturnFocus(open);
9913
9956
  useEffect(() => {
9914
- if (!open) return;
9915
- const focusable = panelRef.current?.querySelector("a, button, input, [tabindex]");
9916
- focusable?.focus();
9917
- }, [open]);
9957
+ if (!open || !mounted) return;
9958
+ const raf = requestAnimationFrame(() => focusInitial(panelRef.current));
9959
+ return () => cancelAnimationFrame(raf);
9960
+ }, [open, mounted]);
9918
9961
  if (!mounted) return null;
9919
9962
  const slide = slideClasses[position];
9920
9963
  const isHorizontal = position === "left" || position === "right";
@@ -9984,6 +10027,7 @@ function Drawer({ open, onClose, position = "right", width = "400px", title, chi
9984
10027
  "button",
9985
10028
  {
9986
10029
  onClick: onClose,
10030
+ ...{ [OVERLAY_CLOSE_ATTR]: "" },
9987
10031
  className: "text-[var(--ds-text-muted)] hover:text-[var(--ds-text-primary)] transition-colors cursor-pointer",
9988
10032
  "aria-label": "Close",
9989
10033
  children: /* @__PURE__ */ jsx(Icon, { name: "close", size: 18 })
@@ -10552,7 +10596,6 @@ var sizeClasses = {
10552
10596
  xl: "max-w-4xl",
10553
10597
  full: "max-w-[calc(100vw-2rem)]"
10554
10598
  };
10555
- var FOCUSABLE = 'a[href], button:not(:disabled), input:not(:disabled), select:not(:disabled), textarea:not(:disabled), [tabindex]:not([tabindex="-1"])';
10556
10599
  function Dialog({ open, onClose, title, description, children, footer, variant = "default", size = "md", alert = false, container, onSubmit }) {
10557
10600
  const titleId = useId();
10558
10601
  const descriptionId = useId();
@@ -10584,14 +10627,7 @@ function Dialog({ open, onClose, title, description, children, footer, variant =
10584
10627
  if (!open) return;
10585
10628
  triggerRef.current = document.activeElement;
10586
10629
  requestAnimationFrame(() => {
10587
- const focusable = dialogRef.current?.querySelectorAll(FOCUSABLE);
10588
- if (focusable?.length) {
10589
- if (variant === "destructive" && focusable.length > 1) {
10590
- focusable[focusable.length - 1].focus();
10591
- } else {
10592
- focusable[0].focus();
10593
- }
10594
- }
10630
+ focusInitial(dialogRef.current, { destructive: variant === "destructive" });
10595
10631
  });
10596
10632
  }, [open, variant]);
10597
10633
  useEffect(() => {
@@ -10662,6 +10698,7 @@ function Dialog({ open, onClose, title, description, children, footer, variant =
10662
10698
  {
10663
10699
  type: "button",
10664
10700
  onClick: onClose,
10701
+ ...{ [OVERLAY_CLOSE_ATTR]: "" },
10665
10702
  className: "absolute right-4 top-4 text-[var(--ds-text-muted)] hover:text-[var(--ds-text-primary)] transition-colors cursor-pointer",
10666
10703
  "aria-label": "Close",
10667
10704
  children: /* @__PURE__ */ jsx(Icon, { name: "close", size: 18 })
@@ -11070,6 +11107,12 @@ function Sheet({ open, onClose, title, children, footer, snapPoints = [0.5, 0.92
11070
11107
  function handleTransitionEnd() {
11071
11108
  if (!open) setMounted(false);
11072
11109
  }
11110
+ useReturnFocus(open);
11111
+ useEffect(() => {
11112
+ if (!open || !mounted) return;
11113
+ const raf = requestAnimationFrame(() => focusInitial(panelRef.current));
11114
+ return () => cancelAnimationFrame(raf);
11115
+ }, [open, mounted]);
11073
11116
  useEffect(() => {
11074
11117
  if (!open) return;
11075
11118
  const onKeyDown = (e) => {
@@ -11182,6 +11225,7 @@ function Sheet({ open, onClose, title, children, footer, snapPoints = [0.5, 0.92
11182
11225
  "button",
11183
11226
  {
11184
11227
  onClick: onClose,
11228
+ ...{ [OVERLAY_CLOSE_ATTR]: "" },
11185
11229
  className: "text-[var(--ds-text-muted)] hover:text-[var(--ds-text-primary)] transition-colors cursor-pointer",
11186
11230
  "aria-label": "Close",
11187
11231
  children: /* @__PURE__ */ jsx(Icon, { name: "close", size: 18 })
@@ -11953,8 +11997,6 @@ var toastSeq = 0;
11953
11997
  function ToastProvider({ children, maxVisible = 3, position = "bottom-right", duration = 3e3, mode, pauseOnHover = true }) {
11954
11998
  const [queue, setQueue] = useState([]);
11955
11999
  const isMobile = useBreakpoint("sm");
11956
- const queueRef = useRef(queue);
11957
- queueRef.current = queue;
11958
12000
  const dismiss = useCallback((id) => {
11959
12001
  setQueue((q) => q.filter((t) => t.id !== id));
11960
12002
  }, []);