@particle-academy/react-fancy 5.57.0 → 5.59.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/dist/{PdfViewer.types-DyoUBa2g.d.cts → PdfViewer.types-BRtcZt-X.d.cts} +28 -2
  3. package/dist/{PdfViewer.types-BEk2Jq6p.d.ts → PdfViewer.types-sM52m3OI.d.ts} +28 -2
  4. package/dist/{chunk-MTTRPPHH.js → chunk-5PHPJL7Z.js} +3 -3
  5. package/dist/{chunk-MTTRPPHH.js.map → chunk-5PHPJL7Z.js.map} +1 -1
  6. package/dist/{chunk-7MDHCYEB.cjs → chunk-5QKQXM5V.cjs} +52 -5
  7. package/dist/chunk-5QKQXM5V.cjs.map +1 -0
  8. package/dist/{chunk-SLCR7A6W.cjs → chunk-AQ4DZT4Y.cjs} +4 -4
  9. package/dist/{chunk-SLCR7A6W.cjs.map → chunk-AQ4DZT4Y.cjs.map} +1 -1
  10. package/dist/{chunk-MORXQ5UM.js → chunk-CS2ZYMYP.js} +54 -7
  11. package/dist/chunk-CS2ZYMYP.js.map +1 -0
  12. package/dist/{chunk-WUG646R4.cjs → chunk-IB673TEG.cjs} +39 -5
  13. package/dist/chunk-IB673TEG.cjs.map +1 -0
  14. package/dist/{chunk-KUJ5XRBD.js → chunk-YUNOVQQJ.js} +39 -5
  15. package/dist/chunk-YUNOVQQJ.js.map +1 -0
  16. package/dist/{index-Bwrc9ktU.d.ts → index-BiyyxWtb.d.ts} +1 -1
  17. package/dist/{index-Bd4br4sF.d.cts → index-WG8UdfiE.d.cts} +1 -1
  18. package/dist/index.cjs +7 -7
  19. package/dist/index.d.cts +3 -3
  20. package/dist/index.d.ts +3 -3
  21. package/dist/index.js +3 -3
  22. package/dist/inputs.cjs +2 -2
  23. package/dist/inputs.d.cts +1 -1
  24. package/dist/inputs.d.ts +1 -1
  25. package/dist/inputs.js +1 -1
  26. package/dist/media-viewer.cjs +3 -3
  27. package/dist/media-viewer.d.cts +2 -2
  28. package/dist/media-viewer.d.ts +2 -2
  29. package/dist/media-viewer.js +2 -2
  30. package/dist/multi-switch.cjs +2 -2
  31. package/dist/multi-switch.d.cts +15 -3
  32. package/dist/multi-switch.d.ts +15 -3
  33. package/dist/multi-switch.js +1 -1
  34. package/dist/pdf-viewer.cjs +2 -2
  35. package/dist/pdf-viewer.d.cts +2 -2
  36. package/dist/pdf-viewer.d.ts +2 -2
  37. package/dist/pdf-viewer.js +1 -1
  38. package/dist/time-grid.d.cts +3 -2
  39. package/dist/time-grid.d.ts +3 -2
  40. package/package.json +1 -1
  41. package/dist/chunk-7MDHCYEB.cjs.map +0 -1
  42. package/dist/chunk-KUJ5XRBD.js.map +0 -1
  43. package/dist/chunk-MORXQ5UM.js.map +0 -1
  44. package/dist/chunk-WUG646R4.cjs.map +0 -1
@@ -1,8 +1,8 @@
1
1
  import { FauxClient } from './chunk-GVMWJ4NI.js';
2
2
  import { useControllableState } from './chunk-EDYAXGUM.js';
3
3
  import { cn } from './chunk-MMW2JGKZ.js';
4
- import { forwardRef, useRef, useState, useEffect, useCallback, useLayoutEffect, useId } from 'react';
5
- import { jsxs, jsx } from 'react/jsx-runtime';
4
+ import { forwardRef, useRef, useState, useCallback, useEffect, useLayoutEffect, useId } from 'react';
5
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
6
6
 
7
7
  var ZOOM_STEP = 1.25;
8
8
  var MIN_ZOOM = 0.25;
@@ -28,6 +28,8 @@ var PdfPages = forwardRef(
28
28
  onZoomChange,
29
29
  policy,
30
30
  watermark,
31
+ onPageError,
32
+ renderPageError,
31
33
  title,
32
34
  className,
33
35
  style
@@ -43,6 +45,17 @@ var PdfPages = forwardRef(
43
45
  const scale = scaleBucket(zoom);
44
46
  const scrollerRef = useRef(null);
45
47
  const [ratios, setRatios] = useState({});
48
+ const [failed, setFailed] = useState({});
49
+ const [attempts, setAttempts] = useState({});
50
+ const retryPage = useCallback((n) => {
51
+ setFailed((prev) => {
52
+ if (!(n in prev)) return prev;
53
+ const next = { ...prev };
54
+ delete next[n];
55
+ return next;
56
+ });
57
+ setAttempts((prev) => ({ ...prev, [n]: (prev[n] ?? 0) + 1 }));
58
+ }, []);
46
59
  const ratioOf = (n) => ratios[n] ?? pages.aspectRatio ?? 1 / Math.SQRT2;
47
60
  const observable = typeof IntersectionObserver !== "undefined";
48
61
  const [near, setNear] = useState(() => /* @__PURE__ */ new Set([page, page + 1]));
@@ -222,19 +235,48 @@ var PdfPages = forwardRef(
222
235
  style: { padding: GAP, filter: obscured ? "blur(24px)" : void 0 },
223
236
  children: /* @__PURE__ */ jsx("div", { className: "mx-auto flex flex-col", style: { width: `${zoom * 100}%`, gap: GAP }, children: Array.from({ length: count }, (_, i) => {
224
237
  const n = i + 1;
238
+ const near2 = isNear(n);
239
+ const src = near2 ? pages.url(n, scale) : "";
240
+ const isFailed = near2 && failed[n] === src;
225
241
  return /* @__PURE__ */ jsxs(
226
242
  "div",
227
243
  {
228
244
  "data-react-fancy-pdf-viewer-page": "",
229
245
  "data-page": n,
246
+ "data-state": isFailed ? "error" : void 0,
230
247
  className: "relative w-full overflow-hidden bg-white shadow-sm",
231
248
  style: { aspectRatio: String(ratioOf(n)) },
232
249
  children: [
233
- isNear(n) && /* @__PURE__ */ jsx(
250
+ isFailed && /* @__PURE__ */ jsx(
251
+ "div",
252
+ {
253
+ "data-react-fancy-pdf-viewer-page-error": "",
254
+ role: "alert",
255
+ className: "absolute inset-0 flex flex-col items-center justify-center gap-2 bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] p-4 text-center text-sm text-[color:var(--fancy-text-subtle,var(--color-zinc-600))] dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))] dark:text-[color:var(--fancy-text-subtle-dark,var(--color-zinc-400))]",
256
+ children: renderPageError ? renderPageError({ page: n, scale, url: src, retry: () => retryPage(n) }) : /* @__PURE__ */ jsxs(Fragment, { children: [
257
+ /* @__PURE__ */ jsx("span", { children: `Page ${n} couldn't be shown.` }),
258
+ /* @__PURE__ */ jsx(
259
+ "button",
260
+ {
261
+ type: "button",
262
+ "data-react-fancy-pdf-viewer-page-retry": "",
263
+ onClick: () => retryPage(n),
264
+ className: "rounded-md border border-[color:var(--fancy-border-strong,var(--color-zinc-300))] bg-[color:var(--fancy-surface,var(--color-white))] px-2.5 py-1 text-xs font-medium text-[color:var(--fancy-text,var(--color-zinc-900))] hover:bg-[color:var(--fancy-surface-hover,var(--color-zinc-50))] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[color:var(--fancy-focus,var(--color-blue-500))]/50 dark:border-[color:var(--fancy-border-strong-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-dark,var(--color-zinc-100))] dark:hover:bg-[color:var(--fancy-surface-hover-dark,color-mix(in_oklab,var(--color-zinc-800)_50%,transparent))]",
265
+ children: "Retry"
266
+ }
267
+ )
268
+ ] })
269
+ }
270
+ ),
271
+ near2 && !isFailed && /* @__PURE__ */ jsx(
234
272
  "img",
235
273
  {
236
274
  "data-react-fancy-pdf-viewer-image": "",
237
- src: pages.url(n, scale),
275
+ src,
276
+ onError: () => {
277
+ setFailed((prev) => prev[n] === src ? prev : { ...prev, [n]: src });
278
+ onPageError?.(n, { scale, url: src });
279
+ },
238
280
  alt: `Page ${n}`,
239
281
  decoding: "async",
240
282
  draggable: download ? void 0 : false,
@@ -246,7 +288,8 @@ var PdfPages = forwardRef(
246
288
  setRatios((prev) => prev[n] === r ? prev : { ...prev, [n]: r });
247
289
  }
248
290
  }
249
- }
291
+ },
292
+ attempts[n] ?? 0
250
293
  ),
251
294
  watermark?.text && /* @__PURE__ */ jsx(Watermark, { id: `${markId}-${n}`, ...watermark })
252
295
  ]
@@ -333,6 +376,8 @@ var PdfViewer = forwardRef(
333
376
  onZoomChange,
334
377
  policy,
335
378
  watermark,
379
+ onPageError,
380
+ renderPageError,
336
381
  title = "PDF document",
337
382
  className,
338
383
  style,
@@ -353,6 +398,8 @@ var PdfViewer = forwardRef(
353
398
  onZoomChange,
354
399
  policy,
355
400
  watermark,
401
+ onPageError,
402
+ renderPageError,
356
403
  title,
357
404
  className: cn(frame && "rounded-none", className),
358
405
  style
@@ -408,5 +455,5 @@ var PdfViewer = forwardRef(
408
455
  PdfViewer.displayName = "PdfViewer";
409
456
 
410
457
  export { PdfViewer };
411
- //# sourceMappingURL=chunk-MORXQ5UM.js.map
412
- //# sourceMappingURL=chunk-MORXQ5UM.js.map
458
+ //# sourceMappingURL=chunk-CS2ZYMYP.js.map
459
+ //# sourceMappingURL=chunk-CS2ZYMYP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/PdfViewer/PdfPages.tsx","../src/components/PdfViewer/PdfViewer.tsx"],"names":["near","forwardRef","jsx","jsxs"],"mappings":"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","file":"chunk-CS2ZYMYP.js","sourcesContent":["import { forwardRef, useCallback, useEffect, useId, useLayoutEffect, useRef, useState } from \"react\";\nimport type { CSSProperties, KeyboardEvent, ReactNode, SyntheticEvent } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useControllableState } from \"../../hooks/use-controllable-state\";\nimport type { PdfPageErrorContext, PdfPageSource, PdfViewerPolicy, PdfViewerWatermark } from \"./PdfViewer.types\";\n\n/** One click of the zoom bar. Matches `FauxClient` and `ImageViewer`. */\nconst ZOOM_STEP = 1.25;\nconst MIN_ZOOM = 0.25;\nconst MAX_ZOOM = 4;\n/** The resolutions a page is requested at, so zooming refetches rarely. */\nconst SCALE_BUCKETS = [1, 1.5, 2, 3, 4];\n/** How long PrintScreen keeps the pages obscured. */\nconst PRINT_SCREEN_MS = 1500;\n/** Gap around and between pages, px. */\nconst GAP = 16;\n\nconst clamp = (n: number, min: number, max: number) => Math.min(max, Math.max(min, n));\n\nfunction scaleBucket(zoom: number): number {\n const dpr = typeof window !== \"undefined\" && window.devicePixelRatio > 0 ? window.devicePixelRatio : 1;\n const want = zoom * dpr;\n return SCALE_BUCKETS.find((b) => b >= want - 1e-9) ?? SCALE_BUCKETS[SCALE_BUCKETS.length - 1];\n}\n\n/*\n * Print is blanked from CSS, because a page can print without our key handler\n * ever seeing it (the browser menu, window.print()). `*` as well as the root, so\n * no descendant can set itself visible again.\n */\nconst PRINT_BLOCK_CSS =\n '@media print{[data-react-fancy-pdf-viewer][data-print-blocked=\"true\"],[data-react-fancy-pdf-viewer][data-print-blocked=\"true\"] *{visibility:hidden!important}}';\n\nexport interface PdfPagesProps {\n pages: PdfPageSource;\n page?: number;\n defaultPage?: number;\n onPageChange?: (page: number) => void;\n zoom?: number;\n defaultZoom?: number;\n onZoomChange?: (zoom: number) => void;\n policy?: PdfViewerPolicy;\n watermark?: PdfViewerWatermark;\n onPageError?: (page: number, info: { scale: number; url: string }) => void;\n renderPageError?: (ctx: PdfPageErrorContext) => ReactNode;\n title: string;\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * Page-image mode of `PdfViewer`: images the app rendered, shown under a policy.\n * It never sees the PDF, so it has nothing to search and nothing to download.\n */\nexport const PdfPages = forwardRef<HTMLDivElement, PdfPagesProps>(\n (\n {\n pages,\n page: controlledPage,\n defaultPage = 1,\n onPageChange,\n zoom: controlledZoom,\n defaultZoom = 1,\n onZoomChange,\n policy,\n watermark,\n onPageError,\n renderPageError,\n title,\n className,\n style,\n },\n ref,\n ) => {\n const count = Math.max(0, Math.floor(pages.count));\n const download = policy?.download !== false;\n const print = policy?.print !== false;\n const copy = policy?.copy !== false;\n const deter = policy?.screenshot === \"deter\";\n\n const [rawPage, setPage] = useControllableState(controlledPage, defaultPage, onPageChange);\n const page = clamp(rawPage, 1, Math.max(1, count));\n const [zoom, setZoom] = useControllableState(controlledZoom, defaultZoom, onZoomChange);\n const scale = scaleBucket(zoom);\n\n const scrollerRef = useRef<HTMLDivElement>(null);\n const [ratios, setRatios] = useState<Record<number, number>>({});\n // Per page: the URL whose image failed. Keyed on the URL, so a new one (a\n // sharper zoom bucket, a refreshed signature) tries again by itself.\n const [failed, setFailed] = useState<Record<number, string>>({});\n // Per page: bumped by Retry to remount the <img> on the SAME url. The url\n // is never altered, so a signed URL stays valid.\n const [attempts, setAttempts] = useState<Record<number, number>>({});\n const retryPage = useCallback((n: number) => {\n setFailed((prev) => {\n if (!(n in prev)) return prev;\n const next = { ...prev };\n delete next[n];\n return next;\n });\n setAttempts((prev) => ({ ...prev, [n]: (prev[n] ?? 0) + 1 }));\n }, []);\n const ratioOf = (n: number) => ratios[n] ?? pages.aspectRatio ?? 1 / Math.SQRT2;\n\n // ---- Which pages have an image: those near the viewport ---------------\n // Without IntersectionObserver there is no way to know what is near, so\n // every page renders (SSR markup, very old browsers).\n const observable = typeof IntersectionObserver !== \"undefined\";\n const [near, setNear] = useState<Set<number>>(() => new Set([page, page + 1]));\n const isNear = (n: number) => !observable || n === page || near.has(n);\n\n useEffect(() => {\n const scroller = scrollerRef.current;\n if (!observable || !scroller) return;\n const io = new IntersectionObserver(\n (entries) => {\n setNear((prev) => {\n const next = new Set(prev);\n for (const e of entries) {\n const n = Number((e.target as HTMLElement).dataset.page);\n if (e.isIntersecting) next.add(n);\n else next.delete(n);\n }\n return next;\n });\n },\n // A viewport's worth above and below, so a page is there before it scrolls in.\n { root: scroller, rootMargin: \"100% 0px\" },\n );\n scroller.querySelectorAll(\"[data-react-fancy-pdf-viewer-page]\").forEach((el) => io.observe(el));\n return () => io.disconnect();\n }, [observable, count]);\n\n // ---- The current page follows scrolling; a set page scrolls to it ------\n const fromScroll = useRef<number | null>(null);\n const scrollToPage = useCallback((n: number) => {\n const scroller = scrollerRef.current;\n const slot = scroller?.querySelector<HTMLElement>(`[data-react-fancy-pdf-viewer-page][data-page=\"${n}\"]`);\n if (scroller && slot) scroller.scrollTop = Math.max(0, slot.offsetTop - GAP);\n }, []);\n\n useEffect(() => {\n if (fromScroll.current === page) {\n fromScroll.current = null;\n return;\n }\n scrollToPage(page);\n }, [page, scrollToPage]);\n\n // Zooming changes every page's height: keep the current page in place.\n const firstZoom = useRef(true);\n useLayoutEffect(() => {\n if (firstZoom.current) {\n firstZoom.current = false;\n return;\n }\n scrollToPage(page);\n // Only on zoom; the page effect handles page changes.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [zoom]);\n\n // A width change (full screen, a resized panel) re-flows every page's\n // height, so the scroll offset no longer points at the same page: put the\n // current one back.\n const pageRef = useRef(page);\n pageRef.current = page;\n useEffect(() => {\n const scroller = scrollerRef.current;\n if (!scroller || typeof ResizeObserver === \"undefined\") return;\n let width: number | null = null;\n const ro = new ResizeObserver(() => {\n const w = scroller.clientWidth;\n if (width !== null && w !== width) scrollToPage(pageRef.current);\n width = w;\n });\n ro.observe(scroller);\n return () => ro.disconnect();\n }, [scrollToPage]);\n\n const frame = useRef(0);\n const onScroll = () => {\n if (frame.current || typeof requestAnimationFrame === \"undefined\") return;\n frame.current = requestAnimationFrame(() => {\n frame.current = 0;\n const scroller = scrollerRef.current;\n if (!scroller) return;\n // The page under a line a third of the way down the viewport.\n const line = scroller.getBoundingClientRect().top + scroller.clientHeight / 3;\n let current = 1;\n scroller.querySelectorAll<HTMLElement>(\"[data-react-fancy-pdf-viewer-page]\").forEach((el) => {\n if (el.getBoundingClientRect().top <= line) current = Number(el.dataset.page);\n });\n if (current !== page) {\n fromScroll.current = current;\n setPage(current);\n }\n });\n };\n useEffect(() => () => {\n if (frame.current) cancelAnimationFrame(frame.current);\n }, []);\n\n const zoomTo = (z: number) => setZoom(clamp(Math.round(z * 100) / 100, MIN_ZOOM, MAX_ZOOM));\n const fitPage = () => {\n const scroller = scrollerRef.current;\n if (!scroller || scroller.clientWidth <= GAP * 2) return;\n const pageHeightAtFit = (scroller.clientWidth - GAP * 2) / ratioOf(page);\n zoomTo((scroller.clientHeight - GAP * 2) / pageHeightAtFit);\n };\n\n // ---- screenshot: \"deter\" ---------------------------------------------\n const [hidden, setHidden] = useState(false);\n const [blurred, setBlurred] = useState(false);\n const [snapped, setSnapped] = useState(false);\n useEffect(() => {\n if (!deter || typeof window === \"undefined\") return;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const onVisibility = () => setHidden(document.visibilityState === \"hidden\");\n const onBlur = () => setBlurred(true);\n const onFocus = () => setBlurred(false);\n const onKeyUp = (e: globalThis.KeyboardEvent) => {\n if (e.key !== \"PrintScreen\") return;\n // Best effort. The OS has usually taken the shot before this fires;\n // what is left is to obscure, and to clear a capture that went to the\n // clipboard (which fails quietly where the page may not write it).\n setSnapped(true);\n clearTimeout(timer);\n timer = setTimeout(() => setSnapped(false), PRINT_SCREEN_MS);\n void navigator.clipboard?.writeText?.(\"\").catch(() => {});\n };\n document.addEventListener(\"visibilitychange\", onVisibility);\n window.addEventListener(\"blur\", onBlur);\n window.addEventListener(\"focus\", onFocus);\n window.addEventListener(\"keyup\", onKeyUp);\n return () => {\n clearTimeout(timer);\n document.removeEventListener(\"visibilitychange\", onVisibility);\n window.removeEventListener(\"blur\", onBlur);\n window.removeEventListener(\"focus\", onFocus);\n window.removeEventListener(\"keyup\", onKeyUp);\n };\n }, [deter]);\n const obscured = deter && (hidden || blurred || snapped);\n\n const onKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {\n if (!print && (e.ctrlKey || e.metaKey) && e.key.toLowerCase() === \"p\") e.preventDefault();\n };\n const block = (e: SyntheticEvent) => e.preventDefault();\n\n const markId = useId().replace(/[^a-zA-Z0-9_-]/g, \"\");\n\n return (\n <div\n ref={ref}\n data-react-fancy-pdf-viewer=\"\"\n data-mode=\"pages\"\n data-print-blocked={print ? undefined : \"true\"}\n data-obscured={String(obscured)}\n aria-label={title}\n role=\"document\"\n onKeyDown={onKeyDown}\n className={cn(\n \"relative flex h-full min-h-[20rem] w-full flex-col overflow-hidden rounded-md bg-zinc-100 dark:bg-zinc-900\",\n className,\n )}\n style={copy ? style : { ...style, userSelect: \"none\", WebkitUserSelect: \"none\" }}\n >\n {!print && <style>{PRINT_BLOCK_CSS}</style>}\n\n <div\n data-react-fancy-pdf-viewer-toolbar=\"\"\n className=\"flex shrink-0 items-center gap-1 border-b border-zinc-200 bg-[color:var(--fancy-surface,var(--color-white))] px-2 py-1 text-xs text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:border-zinc-800 dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))]\"\n >\n <ToolButton attr=\"prev\" label=\"Previous page\" disabled={page <= 1} onClick={() => setPage(page - 1)}>\n <Chevron dir=\"up\" />\n </ToolButton>\n <span data-react-fancy-pdf-viewer-page-label=\"\" className=\"min-w-[3.5rem] text-center tabular-nums\" aria-live=\"polite\">\n {page} / {count}\n </span>\n <ToolButton attr=\"next\" label=\"Next page\" disabled={page >= count} onClick={() => setPage(page + 1)}>\n <Chevron dir=\"down\" />\n </ToolButton>\n <span className=\"mx-1 h-4 w-px bg-zinc-200 dark:bg-zinc-700\" aria-hidden=\"true\" />\n <ToolButton attr=\"zoom-out\" label=\"Zoom out\" disabled={zoom <= MIN_ZOOM} onClick={() => zoomTo(zoom / ZOOM_STEP)}>\n <span aria-hidden=\"true\">−</span>\n </ToolButton>\n <ToolButton attr=\"zoom-reset\" label=\"Reset zoom\" wide onClick={() => zoomTo(1)}>\n {Math.round(zoom * 100)}%\n </ToolButton>\n <ToolButton attr=\"zoom-in\" label=\"Zoom in\" disabled={zoom >= MAX_ZOOM} onClick={() => zoomTo(zoom * ZOOM_STEP)}>\n <span aria-hidden=\"true\">+</span>\n </ToolButton>\n <ToolButton attr=\"fit-width\" label=\"Fit width\" wide onClick={() => zoomTo(1)}>\n Width\n </ToolButton>\n <ToolButton attr=\"fit-page\" label=\"Fit page\" wide onClick={fitPage}>\n Page\n </ToolButton>\n </div>\n\n <div\n ref={scrollerRef}\n data-react-fancy-pdf-viewer-pages=\"\"\n tabIndex={0}\n onScroll={onScroll}\n onContextMenu={download ? undefined : block}\n onDragStart={download ? undefined : block}\n className=\"relative min-h-0 flex-1 overflow-auto outline-none transition-[filter] duration-150\"\n style={{ padding: GAP, filter: obscured ? \"blur(24px)\" : undefined }}\n >\n <div className=\"mx-auto flex flex-col\" style={{ width: `${zoom * 100}%`, gap: GAP }}>\n {Array.from({ length: count }, (_, i) => {\n const n = i + 1;\n const near = isNear(n);\n const src = near ? pages.url(n, scale) : \"\";\n const isFailed = near && failed[n] === src;\n return (\n <div\n key={n}\n data-react-fancy-pdf-viewer-page=\"\"\n data-page={n}\n data-state={isFailed ? \"error\" : undefined}\n className=\"relative w-full overflow-hidden bg-white shadow-sm\"\n style={{ aspectRatio: String(ratioOf(n)) }}\n >\n {isFailed && (\n <div\n data-react-fancy-pdf-viewer-page-error=\"\"\n role=\"alert\"\n className=\"absolute inset-0 flex flex-col items-center justify-center gap-2 bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] p-4 text-center text-sm text-[color:var(--fancy-text-subtle,var(--color-zinc-600))] dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))] dark:text-[color:var(--fancy-text-subtle-dark,var(--color-zinc-400))]\"\n >\n {renderPageError ? (\n renderPageError({ page: n, scale, url: src, retry: () => retryPage(n) })\n ) : (\n <>\n <span>{`Page ${n} couldn't be shown.`}</span>\n <button\n type=\"button\"\n data-react-fancy-pdf-viewer-page-retry=\"\"\n onClick={() => retryPage(n)}\n className=\"rounded-md border border-[color:var(--fancy-border-strong,var(--color-zinc-300))] bg-[color:var(--fancy-surface,var(--color-white))] px-2.5 py-1 text-xs font-medium text-[color:var(--fancy-text,var(--color-zinc-900))] hover:bg-[color:var(--fancy-surface-hover,var(--color-zinc-50))] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[color:var(--fancy-focus,var(--color-blue-500))]/50 dark:border-[color:var(--fancy-border-strong-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-dark,var(--color-zinc-100))] dark:hover:bg-[color:var(--fancy-surface-hover-dark,color-mix(in_oklab,var(--color-zinc-800)_50%,transparent))]\"\n >\n Retry\n </button>\n </>\n )}\n </div>\n )}\n {near && !isFailed && (\n <img\n key={attempts[n] ?? 0}\n data-react-fancy-pdf-viewer-image=\"\"\n src={src}\n onError={() => {\n setFailed((prev) => (prev[n] === src ? prev : { ...prev, [n]: src }));\n onPageError?.(n, { scale, url: src });\n }}\n alt={`Page ${n}`}\n decoding=\"async\"\n draggable={download ? undefined : false}\n className=\"block h-full w-full\"\n onLoad={(e) => {\n const img = e.currentTarget;\n if (img.naturalWidth > 0 && img.naturalHeight > 0) {\n const r = img.naturalWidth / img.naturalHeight;\n setRatios((prev) => (prev[n] === r ? prev : { ...prev, [n]: r }));\n }\n }}\n />\n )}\n {watermark?.text && <Watermark id={`${markId}-${n}`} {...watermark} />}\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n },\n);\n\nPdfPages.displayName = \"PdfPages\";\n\n/** A tiled SVG pattern, so the text repeats at a constant size whatever the zoom. */\nfunction Watermark({ id, text, opacity = 0.15, angle = -30, density = 1 }: PdfViewerWatermark & { id: string }) {\n const fontSize = 14;\n const gap = 80 / Math.max(0.1, density);\n const w = text.length * fontSize * 0.55 + gap;\n const h = fontSize + gap;\n return (\n <svg\n data-react-fancy-pdf-viewer-watermark=\"\"\n aria-hidden=\"true\"\n className=\"absolute inset-0 h-full w-full select-none\"\n style={{ pointerEvents: \"none\" }}\n >\n <defs>\n <pattern id={id} width={w} height={h} patternUnits=\"userSpaceOnUse\" patternTransform={`rotate(${angle})`}>\n <text x={gap / 2} y={h / 2} fontSize={fontSize} fontFamily=\"ui-sans-serif, system-ui, sans-serif\" fillOpacity={clamp(opacity, 0, 1)}\n // The light-mode text role in both modes: page images are paper.\n style={{ fill: \"var(--fancy-text, var(--color-zinc-700))\" }}\n >\n {text}\n </text>\n </pattern>\n </defs>\n <rect width=\"100%\" height=\"100%\" fill={`url(#${id})`} />\n </svg>\n );\n}\n\nfunction ToolButton({\n attr,\n label,\n disabled,\n wide,\n onClick,\n children,\n}: {\n attr: string;\n label: string;\n disabled?: boolean;\n wide?: boolean;\n onClick: () => void;\n children: ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n {...{ [`data-react-fancy-pdf-viewer-${attr}`]: \"\" }}\n aria-label={label}\n title={label}\n disabled={disabled}\n onClick={onClick}\n className={cn(\n \"flex h-6 items-center justify-center rounded-full tabular-nums transition-colors disabled:pointer-events-none disabled:opacity-30\",\n \"hover:bg-zinc-900/5 hover:text-zinc-700 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500/50 dark:hover:bg-white/10 dark:hover:text-zinc-200\",\n wide ? \"min-w-[2.25rem] px-1.5\" : \"w-6\",\n )}\n >\n {children}\n </button>\n );\n}\n\nfunction Chevron({ dir }: { dir: \"up\" | \"down\" }) {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d={dir === \"up\" ? \"m18 15-6-6-6 6\" : \"m6 9 6 6 6-6\"} />\n </svg>\n );\n}\n","import { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { FauxClient } from \"../FauxClient\";\nimport { PdfPages } from \"./PdfPages\";\nimport type { PdfViewerProps } from \"./PdfViewer.types\";\n\n/**\n * A standalone PDF viewer — embeds the document via the browser's native PDF\n * plugin (`<object>`), falling back to an `<iframe>`, then to a download link.\n * Fills its container, so give it a height (a `min-h` floor is built in).\n * Renders for PDF sources inside `<MediaViewer>`.\n *\n * ```tsx\n * <PdfViewer src=\"/report.pdf\" title=\"report.pdf\" style={{ height: 600 }} />\n * ```\n *\n * With `pages` it shows page images the app rendered instead, and never\n * fetches or references the PDF; `policy` and `watermark` apply there.\n *\n * ```tsx\n * <PdfViewer\n * pages={{ count: 12, url: (n, scale) => `/docs/7/pages/${n}.png?scale=${scale}` }}\n * policy={{ download: false, print: false, copy: false, screenshot: \"deter\" }}\n * watermark={{ text: \"jane@example.com\" }}\n * />\n * ```\n */\nexport const PdfViewer = forwardRef<HTMLDivElement, PdfViewerProps>(\n (\n {\n src,\n pages,\n page,\n defaultPage,\n onPageChange,\n zoom,\n defaultZoom,\n onZoomChange,\n policy,\n watermark,\n onPageError,\n renderPageError,\n title = \"PDF document\",\n className,\n style,\n frame = false,\n frameProps,\n },\n ref,\n ) => {\n if (pages) {\n // `src` is deliberately not passed on: in this mode the PDF is never\n // referenced, so it cannot leak through an attribute or a fallback link.\n const pageViewer = (\n <PdfPages\n ref={ref}\n pages={pages}\n page={page}\n defaultPage={defaultPage}\n onPageChange={onPageChange}\n zoom={zoom}\n defaultZoom={defaultZoom}\n onZoomChange={onZoomChange}\n policy={policy}\n watermark={watermark}\n onPageError={onPageError}\n renderPageError={renderPageError}\n title={title}\n className={cn(frame && \"rounded-none\", className)}\n style={style}\n />\n );\n if (!frame) return pageViewer;\n // Zoom lives on the viewer's own toolbar, which knows the page size; the\n // frame adds full screen.\n return (\n <FauxClient variant=\"browser\" url={title} controls={{ zoom: false }} fill {...frameProps}>\n {pageViewer}\n </FauxClient>\n );\n }\n\n const viewer = (\n <div\n ref={ref}\n data-react-fancy-pdf-viewer=\"\"\n className={cn(\n \"relative h-full min-h-[20rem] w-full overflow-hidden rounded-md bg-zinc-100 dark:bg-zinc-900\",\n className,\n )}\n style={style}\n >\n <object data={src} type=\"application/pdf\" className=\"h-full w-full\">\n <iframe\n src={src}\n title={title}\n className=\"h-full w-full border-0\"\n />\n <div className=\"flex h-full flex-col items-center justify-center gap-2 p-4 text-center text-sm text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))]\">\n <span>This browser can&apos;t display the PDF inline.</span>\n <a\n href={src}\n download\n className=\"font-medium text-blue-600 hover:underline dark:text-blue-400\"\n >\n Download PDF\n </a>\n </div>\n </object>\n </div>\n );\n\n if (!frame) return viewer;\n\n // Full screen from the frame; zoom stays on the browser's PDF toolbar. A\n // plugin fits the page to its box, so scaling the box only re-fits it, and\n // the `#zoom=` open parameter is relative to the page's real size, which a\n // frame cannot know -- its bar would jump by uneven steps.\n return (\n // The browser variant, because the plugin swallows the pointer: hover over\n // the PDF never reaches the frame, so controls over it could not be\n // revealed, and its top-right corner is the PDF toolbar's. In the address\n // bar they are reachable and collide with nothing.\n <FauxClient variant=\"browser\" url={title} controls={{ zoom: false }} fill {...frameProps}>\n {viewer}\n </FauxClient>\n );\n },\n);\n\nPdfViewer.displayName = \"PdfViewer\";\n"]}
@@ -11,6 +11,35 @@ var chunkZU5Q77OT_cjs = require('./chunk-ZU5Q77OT.cjs');
11
11
  var react = require('react');
12
12
  var jsxRuntime = require('react/jsx-runtime');
13
13
 
14
+ // src/components/inputs/MultiSwitch/MultiSwitch.colors.ts
15
+ var multiSwitchColorClasses = {
16
+ // The host's colour, from CSS variables -- no dark: variant, because a
17
+ // host that themes per mode scopes the variables themselves.
18
+ brand: { thumb: "bg-brand", text: "text-brand-contrast", border: "border-brand" },
19
+ slate: { thumb: "bg-slate-600 dark:bg-slate-500", text: "text-white", border: "border-slate-500 dark:border-slate-400" },
20
+ gray: { thumb: "bg-gray-600 dark:bg-gray-500", text: "text-white", border: "border-gray-500 dark:border-gray-400" },
21
+ zinc: { thumb: "bg-zinc-600 dark:bg-zinc-500", text: "text-white", border: "border-zinc-500 dark:border-zinc-400" },
22
+ neutral: { thumb: "bg-neutral-600 dark:bg-neutral-500", text: "text-white", border: "border-neutral-500 dark:border-neutral-400" },
23
+ stone: { thumb: "bg-stone-600 dark:bg-stone-500", text: "text-white", border: "border-stone-500 dark:border-stone-400" },
24
+ red: { thumb: "bg-red-600 dark:bg-red-500", text: "text-white", border: "border-red-500 dark:border-red-400" },
25
+ orange: { thumb: "bg-orange-600 dark:bg-orange-500", text: "text-white", border: "border-orange-500 dark:border-orange-400" },
26
+ amber: { thumb: "bg-amber-400 dark:bg-amber-300", text: "text-amber-950", border: "border-amber-500 dark:border-amber-400" },
27
+ yellow: { thumb: "bg-yellow-400 dark:bg-yellow-300", text: "text-yellow-950", border: "border-yellow-500 dark:border-yellow-400" },
28
+ lime: { thumb: "bg-lime-400 dark:bg-lime-300", text: "text-lime-950", border: "border-lime-500 dark:border-lime-400" },
29
+ green: { thumb: "bg-green-600 dark:bg-green-500", text: "text-white", border: "border-green-500 dark:border-green-400" },
30
+ emerald: { thumb: "bg-emerald-600 dark:bg-emerald-500", text: "text-white", border: "border-emerald-500 dark:border-emerald-400" },
31
+ teal: { thumb: "bg-teal-600 dark:bg-teal-500", text: "text-white", border: "border-teal-500 dark:border-teal-400" },
32
+ cyan: { thumb: "bg-cyan-600 dark:bg-cyan-500", text: "text-white", border: "border-cyan-500 dark:border-cyan-400" },
33
+ sky: { thumb: "bg-sky-600 dark:bg-sky-500", text: "text-white", border: "border-sky-500 dark:border-sky-400" },
34
+ blue: { thumb: "bg-blue-600 dark:bg-blue-500", text: "text-white", border: "border-blue-500 dark:border-blue-400" },
35
+ indigo: { thumb: "bg-indigo-600 dark:bg-indigo-500", text: "text-white", border: "border-indigo-500 dark:border-indigo-400" },
36
+ violet: { thumb: "bg-violet-600 dark:bg-violet-500", text: "text-white", border: "border-violet-500 dark:border-violet-400" },
37
+ purple: { thumb: "bg-purple-600 dark:bg-purple-500", text: "text-white", border: "border-purple-500 dark:border-purple-400" },
38
+ fuchsia: { thumb: "bg-fuchsia-600 dark:bg-fuchsia-500", text: "text-white", border: "border-fuchsia-500 dark:border-fuchsia-400" },
39
+ pink: { thumb: "bg-pink-600 dark:bg-pink-500", text: "text-white", border: "border-pink-500 dark:border-pink-400" },
40
+ rose: { thumb: "bg-rose-600 dark:bg-rose-500", text: "text-white", border: "border-rose-500 dark:border-rose-400" }
41
+ };
42
+ var BORDER_DEFAULT = "border-[color:var(--fancy-border-strong,var(--color-zinc-300))] dark:border-[color:var(--fancy-border-strong-dark,var(--color-zinc-700))]";
14
43
  var sizeClasses = {
15
44
  xs: "px-2 py-1 text-xs",
16
45
  sm: "px-2.5 py-1.5 text-sm",
@@ -53,6 +82,8 @@ function MultiSwitch({
53
82
  const selectedIndex = resolvedOptions.findIndex(
54
83
  (o) => o.value === value
55
84
  );
85
+ const selectedColor = resolvedOptions[selectedIndex]?.color;
86
+ const colorClasses = selectedColor ? multiSwitchColorClasses[selectedColor] : void 0;
56
87
  const updateIndicator = react.useCallback(() => {
57
88
  const container = containerRef.current;
58
89
  const activeItem = itemRefs.current[selectedIndex];
@@ -83,7 +114,8 @@ function MultiSwitch({
83
114
  if (interactive && !e.currentTarget.contains(e.relatedTarget)) exitEdit();
84
115
  },
85
116
  className: chunkZU5Q77OT_cjs.cn(
86
- "relative inline-flex rounded-lg border border-[color:var(--fancy-border-strong,var(--color-zinc-300))] bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] dark:border-[color:var(--fancy-border-strong-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]",
117
+ "relative inline-flex rounded-lg border bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]",
118
+ colorClasses ? colorClasses.border : BORDER_DEFAULT,
87
119
  dirty && "ring-2 ring-amber-400/50",
88
120
  error && "ring-2 ring-red-500/50",
89
121
  disabled && "opacity-50 cursor-not-allowed",
@@ -93,7 +125,9 @@ function MultiSwitch({
93
125
  indicator && /* @__PURE__ */ jsxRuntime.jsx(
94
126
  "span",
95
127
  {
96
- className: "absolute top-0 bottom-0 rounded-lg bg-blue-600 transition-all duration-200 ease-out",
128
+ "data-react-fancy-multi-switch-thumb": "",
129
+ "data-color": selectedColor,
130
+ className: colorClasses ? `absolute top-0 bottom-0 rounded-lg ${colorClasses.thumb} transition-all duration-200 ease-out` : "absolute top-0 bottom-0 rounded-lg bg-blue-600 transition-all duration-200 ease-out",
97
131
  style: { left: indicator.left, width: indicator.width }
98
132
  }
99
133
  ),
@@ -121,7 +155,7 @@ function MultiSwitch({
121
155
  className: chunkZU5Q77OT_cjs.cn(
122
156
  "relative z-10 font-medium transition-colors duration-200",
123
157
  sizeClasses[size],
124
- isSelected ? "text-white" : "text-[color:var(--fancy-text-subtle,var(--color-zinc-600))] hover:text-[color:var(--fancy-text,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-subtle-dark,var(--color-zinc-400))] dark:hover:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]",
158
+ isSelected ? colorClasses?.text ?? "text-white" : "text-[color:var(--fancy-text-subtle,var(--color-zinc-600))] hover:text-[color:var(--fancy-text,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-subtle-dark,var(--color-zinc-400))] dark:hover:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]",
125
159
  (disabled || option.disabled) && "cursor-not-allowed"
126
160
  ),
127
161
  children: option.label
@@ -154,5 +188,5 @@ function MultiSwitch({
154
188
  MultiSwitch.displayName = "MultiSwitch";
155
189
 
156
190
  exports.MultiSwitch = MultiSwitch;
157
- //# sourceMappingURL=chunk-WUG646R4.cjs.map
158
- //# sourceMappingURL=chunk-WUG646R4.cjs.map
191
+ //# sourceMappingURL=chunk-IB673TEG.cjs.map
192
+ //# sourceMappingURL=chunk-IB673TEG.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/inputs/MultiSwitch/MultiSwitch.colors.ts","../src/components/inputs/MultiSwitch/MultiSwitch.tsx"],"names":["useId","resolveOption","useFieldMode","useInlineEdit","useControllableState","useRef","useMemo","composeRefs","useState","useCallback","useEffect","DisplayValue","jsxs","cn","jsx","Field"],"mappings":"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","file":"chunk-IB673TEG.cjs","sourcesContent":["// Literal Tailwind class strings for every color in the v4 palette so the\n// scanner can detect them in the published dist (template-built names are\n// invisible to Tailwind's JIT). Shades follow badgeSolid: 600 / dark 500 for\n// the thumb, with dark label text on the light hues (amber, yellow, lime).\nimport type { Color } from \"../../../utils/types\";\n\nexport type MultiSwitchColorClasses = {\n /** The selected thumb's fill. */\n thumb: string;\n /** The selected option's label, readable on the thumb. */\n text: string;\n /** The container border while this option is selected. */\n border: string;\n};\n\nexport const multiSwitchColorClasses: Record<Color, MultiSwitchColorClasses> = {\n // The host's colour, from CSS variables -- no dark: variant, because a\n // host that themes per mode scopes the variables themselves.\n brand: { thumb: \"bg-brand\", text: \"text-brand-contrast\", border: \"border-brand\" },\n slate: { thumb: \"bg-slate-600 dark:bg-slate-500\", text: \"text-white\", border: \"border-slate-500 dark:border-slate-400\" },\n gray: { thumb: \"bg-gray-600 dark:bg-gray-500\", text: \"text-white\", border: \"border-gray-500 dark:border-gray-400\" },\n zinc: { thumb: \"bg-zinc-600 dark:bg-zinc-500\", text: \"text-white\", border: \"border-zinc-500 dark:border-zinc-400\" },\n neutral: { thumb: \"bg-neutral-600 dark:bg-neutral-500\", text: \"text-white\", border: \"border-neutral-500 dark:border-neutral-400\" },\n stone: { thumb: \"bg-stone-600 dark:bg-stone-500\", text: \"text-white\", border: \"border-stone-500 dark:border-stone-400\" },\n red: { thumb: \"bg-red-600 dark:bg-red-500\", text: \"text-white\", border: \"border-red-500 dark:border-red-400\" },\n orange: { thumb: \"bg-orange-600 dark:bg-orange-500\", text: \"text-white\", border: \"border-orange-500 dark:border-orange-400\" },\n amber: { thumb: \"bg-amber-400 dark:bg-amber-300\", text: \"text-amber-950\", border: \"border-amber-500 dark:border-amber-400\" },\n yellow: { thumb: \"bg-yellow-400 dark:bg-yellow-300\", text: \"text-yellow-950\", border: \"border-yellow-500 dark:border-yellow-400\" },\n lime: { thumb: \"bg-lime-400 dark:bg-lime-300\", text: \"text-lime-950\", border: \"border-lime-500 dark:border-lime-400\" },\n green: { thumb: \"bg-green-600 dark:bg-green-500\", text: \"text-white\", border: \"border-green-500 dark:border-green-400\" },\n emerald: { thumb: \"bg-emerald-600 dark:bg-emerald-500\", text: \"text-white\", border: \"border-emerald-500 dark:border-emerald-400\" },\n teal: { thumb: \"bg-teal-600 dark:bg-teal-500\", text: \"text-white\", border: \"border-teal-500 dark:border-teal-400\" },\n cyan: { thumb: \"bg-cyan-600 dark:bg-cyan-500\", text: \"text-white\", border: \"border-cyan-500 dark:border-cyan-400\" },\n sky: { thumb: \"bg-sky-600 dark:bg-sky-500\", text: \"text-white\", border: \"border-sky-500 dark:border-sky-400\" },\n blue: { thumb: \"bg-blue-600 dark:bg-blue-500\", text: \"text-white\", border: \"border-blue-500 dark:border-blue-400\" },\n indigo: { thumb: \"bg-indigo-600 dark:bg-indigo-500\", text: \"text-white\", border: \"border-indigo-500 dark:border-indigo-400\" },\n violet: { thumb: \"bg-violet-600 dark:bg-violet-500\", text: \"text-white\", border: \"border-violet-500 dark:border-violet-400\" },\n purple: { thumb: \"bg-purple-600 dark:bg-purple-500\", text: \"text-white\", border: \"border-purple-500 dark:border-purple-400\" },\n fuchsia: { thumb: \"bg-fuchsia-600 dark:bg-fuchsia-500\", text: \"text-white\", border: \"border-fuchsia-500 dark:border-fuchsia-400\" },\n pink: { thumb: \"bg-pink-600 dark:bg-pink-500\", text: \"text-white\", border: \"border-pink-500 dark:border-pink-400\" },\n rose: { thumb: \"bg-rose-600 dark:bg-rose-500\", text: \"text-white\", border: \"border-rose-500 dark:border-rose-400\" },\n};\n","import { useRef, useState, useEffect, useCallback, useId, useMemo, type Ref } from \"react\";\nimport { cn } from \"../../../utils/cn\";\nimport { composeRefs } from \"../../../utils/compose-refs\";\nimport { useControllableState } from \"../../../hooks/use-controllable-state\";\nimport { Field } from \"../Field\";\nimport { useFieldMode } from \"../mode/FieldMode.context\";\nimport { DisplayValue } from \"../mode/DisplayValue\";\nimport { useInlineEdit } from \"../mode/useInlineEdit\";\nimport { resolveOption } from \"../inputs.utils\";\nimport type { Color, Size } from \"../../../utils/types\";\nimport type { MultiSwitchProps } from \"./MultiSwitch.types\";\nimport { multiSwitchColorClasses } from \"./MultiSwitch.colors\";\n\nconst BORDER_DEFAULT =\n \"border-[color:var(--fancy-border-strong,var(--color-zinc-300))] dark:border-[color:var(--fancy-border-strong-dark,var(--color-zinc-700))]\";\n\nconst sizeClasses: Record<Size, string> = {\n xs: \"px-2 py-1 text-xs\",\n sm: \"px-2.5 py-1.5 text-sm\",\n md: \"px-3 py-2 text-sm\",\n lg: \"px-4 py-2.5 text-base\",\n xl: \"px-5 py-3 text-lg\",\n};\n\nexport function MultiSwitch<V = string>({\n size = \"md\",\n dirty,\n error,\n label,\n labelHidden,\n description,\n required,\n disabled,\n className,\n id,\n name,\n list,\n value: controlledValue,\n defaultValue,\n onValueChange,\n linear,\n mode,\n ...rest\n}: MultiSwitchProps<V>) {\n const reactId = useId();\n // A `<label for>` cannot name a div[role=\"radiogroup\"], so the group points at\n // the label instead. Needs an id the label and the group both agree on.\n const labelId = label ? `${id ?? reactId}-label` : undefined;\n\n // resolveOption hands an object option back as-is, so `color` survives it.\n const resolvedOptions = list.map(resolveOption) as Array<\n ReturnType<typeof resolveOption<V>> & { color?: Color }\n >;\n const fallback = defaultValue ?? resolvedOptions[0]?.value;\n const resolvedMode = useFieldMode(mode);\n const { showControl, interactive, enterEdit, exitEdit } = useInlineEdit(resolvedMode, disabled);\n const [value, setValue] = useControllableState(controlledValue, fallback as V, onValueChange);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const externalRef = (rest as { ref?: Ref<HTMLDivElement> }).ref;\n const containerSetRef = useMemo(() => composeRefs(externalRef, containerRef), [externalRef]);\n const itemRefs = useRef<(HTMLButtonElement | null)[]>([]);\n const [indicator, setIndicator] = useState<{ left: number; width: number } | null>(null);\n\n const selectedIndex = resolvedOptions.findIndex(\n (o) => o.value === value,\n );\n const selectedColor = resolvedOptions[selectedIndex]?.color;\n const colorClasses = selectedColor ? multiSwitchColorClasses[selectedColor] : undefined;\n\n const updateIndicator = useCallback(() => {\n const container = containerRef.current;\n const activeItem = itemRefs.current[selectedIndex];\n if (!container || !activeItem) {\n setIndicator(null);\n return;\n }\n const containerRect = container.getBoundingClientRect();\n const itemRect = activeItem.getBoundingClientRect();\n setIndicator({\n left: itemRect.left - containerRect.left,\n width: itemRect.width,\n });\n }, [selectedIndex]);\n\n useEffect(() => {\n updateIndicator();\n }, [updateIndicator]);\n\n const control = !showControl ? (\n <DisplayValue size={size} interactive={interactive} onActivate={enterEdit}>\n {resolvedOptions.find((o) => o.value === value)?.label}\n </DisplayValue>\n ) : (\n <div\n {...rest}\n // React 19 passes `ref` to a function component as a plain prop, so a\n // caller's ref (Tooltip's anchor, or anyone's) arrives in `rest`. Spread\n // after `ref={containerRef}` it REPLACED the ref the thumb is measured\n // from, and the selected thumb never rendered. Feed both instead.\n ref={containerSetRef}\n data-react-fancy-multi-switch=\"\"\n role=\"radiogroup\"\n id={id}\n aria-labelledby={labelId}\n onBlur={(e) => {\n if (interactive && !e.currentTarget.contains(e.relatedTarget as Node)) exitEdit();\n }}\n className={cn(\n \"relative inline-flex rounded-lg border bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\",\n colorClasses ? colorClasses.border : BORDER_DEFAULT,\n dirty && \"ring-2 ring-amber-400/50\",\n error && \"ring-2 ring-red-500/50\",\n disabled && \"opacity-50 cursor-not-allowed\",\n className,\n )}\n >\n {indicator && (\n <span\n data-react-fancy-multi-switch-thumb=\"\"\n data-color={selectedColor}\n className={\n colorClasses\n ? `absolute top-0 bottom-0 rounded-lg ${colorClasses.thumb} transition-all duration-200 ease-out`\n : \"absolute top-0 bottom-0 rounded-lg bg-blue-600 transition-all duration-200 ease-out\"\n }\n style={{ left: indicator.left, width: indicator.width }}\n />\n )}\n {resolvedOptions.map((option, index) => {\n const isSelected = option.value === value;\n return (\n <button\n key={String(option.value)}\n ref={(el) => { itemRefs.current[index] = el; }}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n disabled={disabled || option.disabled}\n autoFocus={interactive && (selectedIndex === -1 ? index === 0 : isSelected)}\n onClick={() => {\n if (linear) {\n const nextIndex = (selectedIndex + 1) % resolvedOptions.length;\n setValue(resolvedOptions[nextIndex].value as V);\n } else {\n setValue(option.value as V);\n }\n }}\n className={cn(\n \"relative z-10 font-medium transition-colors duration-200\",\n sizeClasses[size],\n isSelected\n ? (colorClasses?.text ?? \"text-white\")\n : \"text-[color:var(--fancy-text-subtle,var(--color-zinc-600))] hover:text-[color:var(--fancy-text,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-subtle-dark,var(--color-zinc-400))] dark:hover:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\",\n (disabled || option.disabled) && \"cursor-not-allowed\",\n )}\n >\n {option.label}\n </button>\n );\n })}\n {name && <input type=\"hidden\" name={name} value={String(value)} />}\n </div>\n );\n\n if (label || error || description) {\n return (\n <Field\n label={label}\n labelHidden={labelHidden}\n labelId={labelId}\n description={description}\n error={error}\n required={required}\n htmlFor={id}\n size={size}\n >\n {control}\n </Field>\n );\n }\n\n return control;\n}\n\nMultiSwitch.displayName = \"MultiSwitch\";\n"]}
@@ -9,6 +9,35 @@ import { cn } from './chunk-MMW2JGKZ.js';
9
9
  import { useId, useRef, useMemo, useState, useCallback, useEffect } from 'react';
10
10
  import { jsx, jsxs } from 'react/jsx-runtime';
11
11
 
12
+ // src/components/inputs/MultiSwitch/MultiSwitch.colors.ts
13
+ var multiSwitchColorClasses = {
14
+ // The host's colour, from CSS variables -- no dark: variant, because a
15
+ // host that themes per mode scopes the variables themselves.
16
+ brand: { thumb: "bg-brand", text: "text-brand-contrast", border: "border-brand" },
17
+ slate: { thumb: "bg-slate-600 dark:bg-slate-500", text: "text-white", border: "border-slate-500 dark:border-slate-400" },
18
+ gray: { thumb: "bg-gray-600 dark:bg-gray-500", text: "text-white", border: "border-gray-500 dark:border-gray-400" },
19
+ zinc: { thumb: "bg-zinc-600 dark:bg-zinc-500", text: "text-white", border: "border-zinc-500 dark:border-zinc-400" },
20
+ neutral: { thumb: "bg-neutral-600 dark:bg-neutral-500", text: "text-white", border: "border-neutral-500 dark:border-neutral-400" },
21
+ stone: { thumb: "bg-stone-600 dark:bg-stone-500", text: "text-white", border: "border-stone-500 dark:border-stone-400" },
22
+ red: { thumb: "bg-red-600 dark:bg-red-500", text: "text-white", border: "border-red-500 dark:border-red-400" },
23
+ orange: { thumb: "bg-orange-600 dark:bg-orange-500", text: "text-white", border: "border-orange-500 dark:border-orange-400" },
24
+ amber: { thumb: "bg-amber-400 dark:bg-amber-300", text: "text-amber-950", border: "border-amber-500 dark:border-amber-400" },
25
+ yellow: { thumb: "bg-yellow-400 dark:bg-yellow-300", text: "text-yellow-950", border: "border-yellow-500 dark:border-yellow-400" },
26
+ lime: { thumb: "bg-lime-400 dark:bg-lime-300", text: "text-lime-950", border: "border-lime-500 dark:border-lime-400" },
27
+ green: { thumb: "bg-green-600 dark:bg-green-500", text: "text-white", border: "border-green-500 dark:border-green-400" },
28
+ emerald: { thumb: "bg-emerald-600 dark:bg-emerald-500", text: "text-white", border: "border-emerald-500 dark:border-emerald-400" },
29
+ teal: { thumb: "bg-teal-600 dark:bg-teal-500", text: "text-white", border: "border-teal-500 dark:border-teal-400" },
30
+ cyan: { thumb: "bg-cyan-600 dark:bg-cyan-500", text: "text-white", border: "border-cyan-500 dark:border-cyan-400" },
31
+ sky: { thumb: "bg-sky-600 dark:bg-sky-500", text: "text-white", border: "border-sky-500 dark:border-sky-400" },
32
+ blue: { thumb: "bg-blue-600 dark:bg-blue-500", text: "text-white", border: "border-blue-500 dark:border-blue-400" },
33
+ indigo: { thumb: "bg-indigo-600 dark:bg-indigo-500", text: "text-white", border: "border-indigo-500 dark:border-indigo-400" },
34
+ violet: { thumb: "bg-violet-600 dark:bg-violet-500", text: "text-white", border: "border-violet-500 dark:border-violet-400" },
35
+ purple: { thumb: "bg-purple-600 dark:bg-purple-500", text: "text-white", border: "border-purple-500 dark:border-purple-400" },
36
+ fuchsia: { thumb: "bg-fuchsia-600 dark:bg-fuchsia-500", text: "text-white", border: "border-fuchsia-500 dark:border-fuchsia-400" },
37
+ pink: { thumb: "bg-pink-600 dark:bg-pink-500", text: "text-white", border: "border-pink-500 dark:border-pink-400" },
38
+ rose: { thumb: "bg-rose-600 dark:bg-rose-500", text: "text-white", border: "border-rose-500 dark:border-rose-400" }
39
+ };
40
+ var BORDER_DEFAULT = "border-[color:var(--fancy-border-strong,var(--color-zinc-300))] dark:border-[color:var(--fancy-border-strong-dark,var(--color-zinc-700))]";
12
41
  var sizeClasses = {
13
42
  xs: "px-2 py-1 text-xs",
14
43
  sm: "px-2.5 py-1.5 text-sm",
@@ -51,6 +80,8 @@ function MultiSwitch({
51
80
  const selectedIndex = resolvedOptions.findIndex(
52
81
  (o) => o.value === value
53
82
  );
83
+ const selectedColor = resolvedOptions[selectedIndex]?.color;
84
+ const colorClasses = selectedColor ? multiSwitchColorClasses[selectedColor] : void 0;
54
85
  const updateIndicator = useCallback(() => {
55
86
  const container = containerRef.current;
56
87
  const activeItem = itemRefs.current[selectedIndex];
@@ -81,7 +112,8 @@ function MultiSwitch({
81
112
  if (interactive && !e.currentTarget.contains(e.relatedTarget)) exitEdit();
82
113
  },
83
114
  className: cn(
84
- "relative inline-flex rounded-lg border border-[color:var(--fancy-border-strong,var(--color-zinc-300))] bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] dark:border-[color:var(--fancy-border-strong-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]",
115
+ "relative inline-flex rounded-lg border bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]",
116
+ colorClasses ? colorClasses.border : BORDER_DEFAULT,
85
117
  dirty && "ring-2 ring-amber-400/50",
86
118
  error && "ring-2 ring-red-500/50",
87
119
  disabled && "opacity-50 cursor-not-allowed",
@@ -91,7 +123,9 @@ function MultiSwitch({
91
123
  indicator && /* @__PURE__ */ jsx(
92
124
  "span",
93
125
  {
94
- className: "absolute top-0 bottom-0 rounded-lg bg-blue-600 transition-all duration-200 ease-out",
126
+ "data-react-fancy-multi-switch-thumb": "",
127
+ "data-color": selectedColor,
128
+ className: colorClasses ? `absolute top-0 bottom-0 rounded-lg ${colorClasses.thumb} transition-all duration-200 ease-out` : "absolute top-0 bottom-0 rounded-lg bg-blue-600 transition-all duration-200 ease-out",
95
129
  style: { left: indicator.left, width: indicator.width }
96
130
  }
97
131
  ),
@@ -119,7 +153,7 @@ function MultiSwitch({
119
153
  className: cn(
120
154
  "relative z-10 font-medium transition-colors duration-200",
121
155
  sizeClasses[size],
122
- isSelected ? "text-white" : "text-[color:var(--fancy-text-subtle,var(--color-zinc-600))] hover:text-[color:var(--fancy-text,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-subtle-dark,var(--color-zinc-400))] dark:hover:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]",
156
+ isSelected ? colorClasses?.text ?? "text-white" : "text-[color:var(--fancy-text-subtle,var(--color-zinc-600))] hover:text-[color:var(--fancy-text,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-subtle-dark,var(--color-zinc-400))] dark:hover:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]",
123
157
  (disabled || option.disabled) && "cursor-not-allowed"
124
158
  ),
125
159
  children: option.label
@@ -152,5 +186,5 @@ function MultiSwitch({
152
186
  MultiSwitch.displayName = "MultiSwitch";
153
187
 
154
188
  export { MultiSwitch };
155
- //# sourceMappingURL=chunk-KUJ5XRBD.js.map
156
- //# sourceMappingURL=chunk-KUJ5XRBD.js.map
189
+ //# sourceMappingURL=chunk-YUNOVQQJ.js.map
190
+ //# sourceMappingURL=chunk-YUNOVQQJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/inputs/MultiSwitch/MultiSwitch.colors.ts","../src/components/inputs/MultiSwitch/MultiSwitch.tsx"],"names":[],"mappings":"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","file":"chunk-YUNOVQQJ.js","sourcesContent":["// Literal Tailwind class strings for every color in the v4 palette so the\n// scanner can detect them in the published dist (template-built names are\n// invisible to Tailwind's JIT). Shades follow badgeSolid: 600 / dark 500 for\n// the thumb, with dark label text on the light hues (amber, yellow, lime).\nimport type { Color } from \"../../../utils/types\";\n\nexport type MultiSwitchColorClasses = {\n /** The selected thumb's fill. */\n thumb: string;\n /** The selected option's label, readable on the thumb. */\n text: string;\n /** The container border while this option is selected. */\n border: string;\n};\n\nexport const multiSwitchColorClasses: Record<Color, MultiSwitchColorClasses> = {\n // The host's colour, from CSS variables -- no dark: variant, because a\n // host that themes per mode scopes the variables themselves.\n brand: { thumb: \"bg-brand\", text: \"text-brand-contrast\", border: \"border-brand\" },\n slate: { thumb: \"bg-slate-600 dark:bg-slate-500\", text: \"text-white\", border: \"border-slate-500 dark:border-slate-400\" },\n gray: { thumb: \"bg-gray-600 dark:bg-gray-500\", text: \"text-white\", border: \"border-gray-500 dark:border-gray-400\" },\n zinc: { thumb: \"bg-zinc-600 dark:bg-zinc-500\", text: \"text-white\", border: \"border-zinc-500 dark:border-zinc-400\" },\n neutral: { thumb: \"bg-neutral-600 dark:bg-neutral-500\", text: \"text-white\", border: \"border-neutral-500 dark:border-neutral-400\" },\n stone: { thumb: \"bg-stone-600 dark:bg-stone-500\", text: \"text-white\", border: \"border-stone-500 dark:border-stone-400\" },\n red: { thumb: \"bg-red-600 dark:bg-red-500\", text: \"text-white\", border: \"border-red-500 dark:border-red-400\" },\n orange: { thumb: \"bg-orange-600 dark:bg-orange-500\", text: \"text-white\", border: \"border-orange-500 dark:border-orange-400\" },\n amber: { thumb: \"bg-amber-400 dark:bg-amber-300\", text: \"text-amber-950\", border: \"border-amber-500 dark:border-amber-400\" },\n yellow: { thumb: \"bg-yellow-400 dark:bg-yellow-300\", text: \"text-yellow-950\", border: \"border-yellow-500 dark:border-yellow-400\" },\n lime: { thumb: \"bg-lime-400 dark:bg-lime-300\", text: \"text-lime-950\", border: \"border-lime-500 dark:border-lime-400\" },\n green: { thumb: \"bg-green-600 dark:bg-green-500\", text: \"text-white\", border: \"border-green-500 dark:border-green-400\" },\n emerald: { thumb: \"bg-emerald-600 dark:bg-emerald-500\", text: \"text-white\", border: \"border-emerald-500 dark:border-emerald-400\" },\n teal: { thumb: \"bg-teal-600 dark:bg-teal-500\", text: \"text-white\", border: \"border-teal-500 dark:border-teal-400\" },\n cyan: { thumb: \"bg-cyan-600 dark:bg-cyan-500\", text: \"text-white\", border: \"border-cyan-500 dark:border-cyan-400\" },\n sky: { thumb: \"bg-sky-600 dark:bg-sky-500\", text: \"text-white\", border: \"border-sky-500 dark:border-sky-400\" },\n blue: { thumb: \"bg-blue-600 dark:bg-blue-500\", text: \"text-white\", border: \"border-blue-500 dark:border-blue-400\" },\n indigo: { thumb: \"bg-indigo-600 dark:bg-indigo-500\", text: \"text-white\", border: \"border-indigo-500 dark:border-indigo-400\" },\n violet: { thumb: \"bg-violet-600 dark:bg-violet-500\", text: \"text-white\", border: \"border-violet-500 dark:border-violet-400\" },\n purple: { thumb: \"bg-purple-600 dark:bg-purple-500\", text: \"text-white\", border: \"border-purple-500 dark:border-purple-400\" },\n fuchsia: { thumb: \"bg-fuchsia-600 dark:bg-fuchsia-500\", text: \"text-white\", border: \"border-fuchsia-500 dark:border-fuchsia-400\" },\n pink: { thumb: \"bg-pink-600 dark:bg-pink-500\", text: \"text-white\", border: \"border-pink-500 dark:border-pink-400\" },\n rose: { thumb: \"bg-rose-600 dark:bg-rose-500\", text: \"text-white\", border: \"border-rose-500 dark:border-rose-400\" },\n};\n","import { useRef, useState, useEffect, useCallback, useId, useMemo, type Ref } from \"react\";\nimport { cn } from \"../../../utils/cn\";\nimport { composeRefs } from \"../../../utils/compose-refs\";\nimport { useControllableState } from \"../../../hooks/use-controllable-state\";\nimport { Field } from \"../Field\";\nimport { useFieldMode } from \"../mode/FieldMode.context\";\nimport { DisplayValue } from \"../mode/DisplayValue\";\nimport { useInlineEdit } from \"../mode/useInlineEdit\";\nimport { resolveOption } from \"../inputs.utils\";\nimport type { Color, Size } from \"../../../utils/types\";\nimport type { MultiSwitchProps } from \"./MultiSwitch.types\";\nimport { multiSwitchColorClasses } from \"./MultiSwitch.colors\";\n\nconst BORDER_DEFAULT =\n \"border-[color:var(--fancy-border-strong,var(--color-zinc-300))] dark:border-[color:var(--fancy-border-strong-dark,var(--color-zinc-700))]\";\n\nconst sizeClasses: Record<Size, string> = {\n xs: \"px-2 py-1 text-xs\",\n sm: \"px-2.5 py-1.5 text-sm\",\n md: \"px-3 py-2 text-sm\",\n lg: \"px-4 py-2.5 text-base\",\n xl: \"px-5 py-3 text-lg\",\n};\n\nexport function MultiSwitch<V = string>({\n size = \"md\",\n dirty,\n error,\n label,\n labelHidden,\n description,\n required,\n disabled,\n className,\n id,\n name,\n list,\n value: controlledValue,\n defaultValue,\n onValueChange,\n linear,\n mode,\n ...rest\n}: MultiSwitchProps<V>) {\n const reactId = useId();\n // A `<label for>` cannot name a div[role=\"radiogroup\"], so the group points at\n // the label instead. Needs an id the label and the group both agree on.\n const labelId = label ? `${id ?? reactId}-label` : undefined;\n\n // resolveOption hands an object option back as-is, so `color` survives it.\n const resolvedOptions = list.map(resolveOption) as Array<\n ReturnType<typeof resolveOption<V>> & { color?: Color }\n >;\n const fallback = defaultValue ?? resolvedOptions[0]?.value;\n const resolvedMode = useFieldMode(mode);\n const { showControl, interactive, enterEdit, exitEdit } = useInlineEdit(resolvedMode, disabled);\n const [value, setValue] = useControllableState(controlledValue, fallback as V, onValueChange);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const externalRef = (rest as { ref?: Ref<HTMLDivElement> }).ref;\n const containerSetRef = useMemo(() => composeRefs(externalRef, containerRef), [externalRef]);\n const itemRefs = useRef<(HTMLButtonElement | null)[]>([]);\n const [indicator, setIndicator] = useState<{ left: number; width: number } | null>(null);\n\n const selectedIndex = resolvedOptions.findIndex(\n (o) => o.value === value,\n );\n const selectedColor = resolvedOptions[selectedIndex]?.color;\n const colorClasses = selectedColor ? multiSwitchColorClasses[selectedColor] : undefined;\n\n const updateIndicator = useCallback(() => {\n const container = containerRef.current;\n const activeItem = itemRefs.current[selectedIndex];\n if (!container || !activeItem) {\n setIndicator(null);\n return;\n }\n const containerRect = container.getBoundingClientRect();\n const itemRect = activeItem.getBoundingClientRect();\n setIndicator({\n left: itemRect.left - containerRect.left,\n width: itemRect.width,\n });\n }, [selectedIndex]);\n\n useEffect(() => {\n updateIndicator();\n }, [updateIndicator]);\n\n const control = !showControl ? (\n <DisplayValue size={size} interactive={interactive} onActivate={enterEdit}>\n {resolvedOptions.find((o) => o.value === value)?.label}\n </DisplayValue>\n ) : (\n <div\n {...rest}\n // React 19 passes `ref` to a function component as a plain prop, so a\n // caller's ref (Tooltip's anchor, or anyone's) arrives in `rest`. Spread\n // after `ref={containerRef}` it REPLACED the ref the thumb is measured\n // from, and the selected thumb never rendered. Feed both instead.\n ref={containerSetRef}\n data-react-fancy-multi-switch=\"\"\n role=\"radiogroup\"\n id={id}\n aria-labelledby={labelId}\n onBlur={(e) => {\n if (interactive && !e.currentTarget.contains(e.relatedTarget as Node)) exitEdit();\n }}\n className={cn(\n \"relative inline-flex rounded-lg border bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\",\n colorClasses ? colorClasses.border : BORDER_DEFAULT,\n dirty && \"ring-2 ring-amber-400/50\",\n error && \"ring-2 ring-red-500/50\",\n disabled && \"opacity-50 cursor-not-allowed\",\n className,\n )}\n >\n {indicator && (\n <span\n data-react-fancy-multi-switch-thumb=\"\"\n data-color={selectedColor}\n className={\n colorClasses\n ? `absolute top-0 bottom-0 rounded-lg ${colorClasses.thumb} transition-all duration-200 ease-out`\n : \"absolute top-0 bottom-0 rounded-lg bg-blue-600 transition-all duration-200 ease-out\"\n }\n style={{ left: indicator.left, width: indicator.width }}\n />\n )}\n {resolvedOptions.map((option, index) => {\n const isSelected = option.value === value;\n return (\n <button\n key={String(option.value)}\n ref={(el) => { itemRefs.current[index] = el; }}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n disabled={disabled || option.disabled}\n autoFocus={interactive && (selectedIndex === -1 ? index === 0 : isSelected)}\n onClick={() => {\n if (linear) {\n const nextIndex = (selectedIndex + 1) % resolvedOptions.length;\n setValue(resolvedOptions[nextIndex].value as V);\n } else {\n setValue(option.value as V);\n }\n }}\n className={cn(\n \"relative z-10 font-medium transition-colors duration-200\",\n sizeClasses[size],\n isSelected\n ? (colorClasses?.text ?? \"text-white\")\n : \"text-[color:var(--fancy-text-subtle,var(--color-zinc-600))] hover:text-[color:var(--fancy-text,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-subtle-dark,var(--color-zinc-400))] dark:hover:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\",\n (disabled || option.disabled) && \"cursor-not-allowed\",\n )}\n >\n {option.label}\n </button>\n );\n })}\n {name && <input type=\"hidden\" name={name} value={String(value)} />}\n </div>\n );\n\n if (label || error || description) {\n return (\n <Field\n label={label}\n labelHidden={labelHidden}\n labelId={labelId}\n description={description}\n error={error}\n required={required}\n htmlFor={id}\n size={size}\n >\n {control}\n </Field>\n );\n }\n\n return control;\n}\n\nMultiSwitch.displayName = \"MultiSwitch\";\n"]}
@@ -3,7 +3,7 @@ import { ReactNode, CSSProperties } from 'react';
3
3
  import { I as ImageViewerProps } from './ImageViewer.types-BDTxBYEN.js';
4
4
  import { V as VideoViewerProps } from './VideoViewer.types-_AwQ8DQr.js';
5
5
  import { A as AudioViewerProps } from './AudioViewer.types-CyhmQVQd.js';
6
- import { b as PdfViewerProps } from './PdfViewer.types-BEk2Jq6p.js';
6
+ import { c as PdfViewerProps } from './PdfViewer.types-sM52m3OI.js';
7
7
 
8
8
  /**
9
9
  * Resolve what kind of media a source is, from its MIME type (preferred) or its
@@ -3,7 +3,7 @@ import { ReactNode, CSSProperties } from 'react';
3
3
  import { I as ImageViewerProps } from './ImageViewer.types-CtqaA6KV.cjs';
4
4
  import { V as VideoViewerProps } from './VideoViewer.types-_AwQ8DQr.cjs';
5
5
  import { A as AudioViewerProps } from './AudioViewer.types-CyhmQVQd.cjs';
6
- import { b as PdfViewerProps } from './PdfViewer.types-DyoUBa2g.cjs';
6
+ import { c as PdfViewerProps } from './PdfViewer.types-BRtcZt-X.cjs';
7
7
 
8
8
  /**
9
9
  * Resolve what kind of media a source is, from its MIME type (preferred) or its
package/dist/index.cjs CHANGED
@@ -5,7 +5,7 @@ var chunkIR6JSQ4O_cjs = require('./chunk-IR6JSQ4O.cjs');
5
5
  require('./chunk-O5IO7TCO.cjs');
6
6
  var chunk6MDZQIMZ_cjs = require('./chunk-6MDZQIMZ.cjs');
7
7
  require('./chunk-QGPMVFZJ.cjs');
8
- var chunkWUG646R4_cjs = require('./chunk-WUG646R4.cjs');
8
+ var chunkIB673TEG_cjs = require('./chunk-IB673TEG.cjs');
9
9
  var chunkH7ELUIF6_cjs = require('./chunk-H7ELUIF6.cjs');
10
10
  require('./chunk-HXLSEBAL.cjs');
11
11
  var chunkZ4UXLQSK_cjs = require('./chunk-Z4UXLQSK.cjs');
@@ -60,9 +60,9 @@ var chunkP53432AK_cjs = require('./chunk-P53432AK.cjs');
60
60
  var chunkQF7CD4JH_cjs = require('./chunk-QF7CD4JH.cjs');
61
61
  require('./chunk-O3F6DYWR.cjs');
62
62
  var chunkZVDW2VX5_cjs = require('./chunk-ZVDW2VX5.cjs');
63
- var chunkSLCR7A6W_cjs = require('./chunk-SLCR7A6W.cjs');
63
+ var chunkAQ4DZT4Y_cjs = require('./chunk-AQ4DZT4Y.cjs');
64
64
  var chunkTH7VP4CL_cjs = require('./chunk-TH7VP4CL.cjs');
65
- var chunk7MDHCYEB_cjs = require('./chunk-7MDHCYEB.cjs');
65
+ var chunk5QKQXM5V_cjs = require('./chunk-5QKQXM5V.cjs');
66
66
  var chunkLIVC3WUU_cjs = require('./chunk-LIVC3WUU.cjs');
67
67
  var chunkG5DMYAWL_cjs = require('./chunk-G5DMYAWL.cjs');
68
68
  var chunk2GFM5WD4_cjs = require('./chunk-2GFM5WD4.cjs');
@@ -235,7 +235,7 @@ Object.defineProperty(exports, "FormProvider", {
235
235
  });
236
236
  Object.defineProperty(exports, "MultiSwitch", {
237
237
  enumerable: true,
238
- get: function () { return chunkWUG646R4_cjs.MultiSwitch; }
238
+ get: function () { return chunkIB673TEG_cjs.MultiSwitch; }
239
239
  });
240
240
  Object.defineProperty(exports, "RadioGroup", {
241
241
  enumerable: true,
@@ -539,11 +539,11 @@ Object.defineProperty(exports, "Marquee", {
539
539
  });
540
540
  Object.defineProperty(exports, "MediaViewer", {
541
541
  enumerable: true,
542
- get: function () { return chunkSLCR7A6W_cjs.MediaViewer; }
542
+ get: function () { return chunkAQ4DZT4Y_cjs.MediaViewer; }
543
543
  });
544
544
  Object.defineProperty(exports, "resolveMediaType", {
545
545
  enumerable: true,
546
- get: function () { return chunkSLCR7A6W_cjs.resolveMediaType; }
546
+ get: function () { return chunkAQ4DZT4Y_cjs.resolveMediaType; }
547
547
  });
548
548
  Object.defineProperty(exports, "VideoViewer", {
549
549
  enumerable: true,
@@ -551,7 +551,7 @@ Object.defineProperty(exports, "VideoViewer", {
551
551
  });
552
552
  Object.defineProperty(exports, "PdfViewer", {
553
553
  enumerable: true,
554
- get: function () { return chunk7MDHCYEB_cjs.PdfViewer; }
554
+ get: function () { return chunk5QKQXM5V_cjs.PdfViewer; }
555
555
  });
556
556
  Object.defineProperty(exports, "Eyebrow", {
557
557
  enumerable: true,
package/dist/index.d.cts CHANGED
@@ -9,7 +9,7 @@ export { CheckboxGroup, CheckboxGroupProps } from './checkbox-group.cjs';
9
9
  export { RadioGroup, RadioGroupProps } from './radio-group.cjs';
10
10
  export { Switch, SwitchProps } from './switch.cjs';
11
11
  export { Slider, SliderProps } from './slider.cjs';
12
- export { MultiSwitch, MultiSwitchProps } from './multi-switch.cjs';
12
+ export { MultiSwitch, MultiSwitchOption, MultiSwitchProps } from './multi-switch.cjs';
13
13
  export { DatePicker, DatePickerProps } from './date-picker.cjs';
14
14
  export { A as AffixPosition, F as FieldMode, I as InputAffixProps, a as InputBaseProps, b as InputOption, c as InputOptionGroup } from './inputs.types-duxPKadC.cjs';
15
15
  export { D as DisplayValue, a as DisplayValueProps, F as FieldModeContext, b as FieldModeContextValue, c as Form, d as FormProps, e as FormProvider, f as FormProviderProps, u as useFieldMode } from './FieldMode.context-CU5h1CyF.cjs';
@@ -82,7 +82,7 @@ export { MobileMenu, MobileMenuBottomBarProps, MobileMenuContextValue, MobileMen
82
82
  export { Kanban, KanbanCardMoveHandler, KanbanCardProps, KanbanColumnHandleProps, KanbanColumnMoveHandler, KanbanColumnProps, KanbanContextValue, KanbanProps, useKanban } from './kanban.cjs';
83
83
  export { DropPosition, TreeNav, TreeNavContextValue, TreeNavProps, TreeNodeData, TreeNodeProps, useTreeNav } from './tree-nav.cjs';
84
84
  export { FileBrowser, FileBrowserContextValue, FileBrowserNewFolder, FileBrowserNodeProps, FileBrowserPathBarProps, FileBrowserProps, FileBrowserProvider, FileBrowserRow, FileBrowserToolbarProps, FileBrowserTreeProps, FileEntry, FileKind, FileLoadStatus, FileSelectMode, FileSnapshotNode, FileSort, FileSortDirection, FileSortField, useFileBrowser, validateFolderName } from './file-browser.cjs';
85
- export { M as MediaKind, a as MediaViewer, b as MediaViewerProps, R as ResolveMediaTypeInput, r as resolveMediaType } from './index-Bd4br4sF.cjs';
85
+ export { M as MediaKind, a as MediaViewer, b as MediaViewerProps, R as ResolveMediaTypeInput, r as resolveMediaType } from './index-WG8UdfiE.cjs';
86
86
  export { F as FancyPlatform, P as PlatformHints, a as PromptAttachment, b as PromptCmd, c as PromptInput, d as PromptInputProps, e as PromptMention, f as browserPlatformHints, g as detectPlatform, m as modifierKeyLabel } from './index-BF5qsQur.cjs';
87
87
  import { P as Placement } from './types-DJI492iY.cjs';
88
88
  export { A as ActionColor, B as ButtonColor, C as Color, S as Size, V as Variant } from './types-DJI492iY.cjs';
@@ -99,7 +99,7 @@ export { V as VideoViewerProps } from './VideoViewer.types-_AwQ8DQr.cjs';
99
99
  export { AudioViewer } from './audio-viewer.cjs';
100
100
  export { A as AudioViewerProps } from './AudioViewer.types-CyhmQVQd.cjs';
101
101
  export { PdfViewer } from './pdf-viewer.cjs';
102
- export { P as PdfPageSource, a as PdfViewerPolicy, b as PdfViewerProps, c as PdfViewerWatermark } from './PdfViewer.types-DyoUBa2g.cjs';
102
+ export { P as PdfPageErrorContext, a as PdfPageSource, b as PdfViewerPolicy, c as PdfViewerProps, d as PdfViewerWatermark } from './PdfViewer.types-BRtcZt-X.cjs';
103
103
  export { J as JSON_FIELD_TYPES, a as JsonArray, b as JsonEditor, c as JsonEditorActivity, d as JsonEditorEdit, e as JsonEditorIssue, f as JsonEditorNode, g as JsonEditorPendingEdit, h as JsonEditorProps, i as JsonFieldType, j as JsonKeyMapEntry, k as JsonKeyRule, l as JsonObject, m as JsonPath, n as JsonPrimitive, o as JsonValue, P as ParsedKeyMap, p as applyJsonEdit, q as describeEdit, r as findJsonConflicts, s as getAtPath, t as inferType, u as parseKeyMap, v as parsePath, w as pathToString, x as resolveKeyRule, y as typeMatches } from './index-CEb-loCl.cjs';
104
104
 
105
105
  /**