@canopy-iiif/app 0.9.13 → 0.9.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/ui/dist/index.mjs CHANGED
@@ -226,18 +226,67 @@ function Grid({
226
226
  ));
227
227
  }
228
228
 
229
+ // ui/src/layout/Container.jsx
230
+ import React5 from "react";
231
+ function Container({ className = "", children, ...rest }) {
232
+ const classes = ["mx-auto", "max-w-content", "w-full", "px-6", className].filter(Boolean).join(" ");
233
+ return /* @__PURE__ */ React5.createElement("div", { className: classes, ...rest }, children);
234
+ }
235
+
236
+ // ui/src/layout/Button.jsx
237
+ import React6 from "react";
238
+ var VARIANTS = /* @__PURE__ */ new Set(["primary", "secondary"]);
239
+ function Button({
240
+ label,
241
+ href = "#",
242
+ target,
243
+ rel,
244
+ variant = "primary",
245
+ className = "",
246
+ children,
247
+ ...rest
248
+ }) {
249
+ const resolvedVariant = VARIANTS.has(variant) ? variant : "primary";
250
+ const computedRel = target === "_blank" && !rel ? "noopener noreferrer" : rel;
251
+ const content = children != null ? children : label;
252
+ if (!content) return null;
253
+ const classes = [
254
+ "canopy-button",
255
+ `canopy-button--${resolvedVariant}`,
256
+ className
257
+ ].filter(Boolean).join(" ");
258
+ return /* @__PURE__ */ React6.createElement(
259
+ "a",
260
+ {
261
+ href,
262
+ className: classes,
263
+ target,
264
+ rel: computedRel,
265
+ ...rest
266
+ },
267
+ content
268
+ );
269
+ }
270
+
271
+ // ui/src/layout/ButtonWrapper.jsx
272
+ import React7 from "react";
273
+ function ButtonWrapper({ className = "", children, ...rest }) {
274
+ const classes = ["canopy-button-group", className].filter(Boolean).join(" ");
275
+ return /* @__PURE__ */ React7.createElement("div", { className: classes, ...rest }, children);
276
+ }
277
+
229
278
  // ui/src/layout/CanopyHeader.jsx
230
- import React11 from "react";
279
+ import React14 from "react";
231
280
 
232
281
  // ui/src/search/SearchPanel.jsx
233
- import React8 from "react";
282
+ import React11 from "react";
234
283
 
235
284
  // ui/src/Icons.jsx
236
- import React5 from "react";
237
- var MagnifyingGlassIcon = (props) => /* @__PURE__ */ React5.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 512 512", ...props }, /* @__PURE__ */ React5.createElement("path", { d: "M456.69 421.39L362.6 327.3a173.81 173.81 0 0034.84-104.58C397.44 126.38 319.06 48 222.72 48S48 126.38 48 222.72s78.38 174.72 174.72 174.72A173.81 173.81 0 00327.3 362.6l94.09 94.09a25 25 0 0035.3-35.3zM97.92 222.72a124.8 124.8 0 11124.8 124.8 124.95 124.95 0 01-124.8-124.8z" }));
285
+ import React8 from "react";
286
+ var MagnifyingGlassIcon = (props) => /* @__PURE__ */ React8.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 512 512", ...props }, /* @__PURE__ */ React8.createElement("path", { d: "M456.69 421.39L362.6 327.3a173.81 173.81 0 0034.84-104.58C397.44 126.38 319.06 48 222.72 48S48 126.38 48 222.72s78.38 174.72 174.72 174.72A173.81 173.81 0 00327.3 362.6l94.09 94.09a25 25 0 0035.3-35.3zM97.92 222.72a124.8 124.8 0 11124.8 124.8 124.95 124.95 0 01-124.8-124.8z" }));
238
287
 
239
288
  // ui/src/search/SearchPanelForm.jsx
240
- import React6 from "react";
289
+ import React9 from "react";
241
290
  function readBasePath() {
242
291
  const normalize = (val) => {
243
292
  const raw = typeof val === "string" ? val.trim() : "";
@@ -300,18 +349,18 @@ function SearchPanelForm(props = {}) {
300
349
  clearLabel = "Clear search"
301
350
  } = props || {};
302
351
  const text = typeof label === "string" && label.trim() ? label.trim() : buttonLabel;
303
- const action = React6.useMemo(
352
+ const action = React9.useMemo(
304
353
  () => resolveSearchPath(searchPath),
305
354
  [searchPath]
306
355
  );
307
- const autoId = typeof React6.useId === "function" ? React6.useId() : void 0;
308
- const [fallbackId] = React6.useState(
356
+ const autoId = typeof React9.useId === "function" ? React9.useId() : void 0;
357
+ const [fallbackId] = React9.useState(
309
358
  () => `canopy-search-form-${Math.random().toString(36).slice(2, 10)}`
310
359
  );
311
360
  const inputId = inputIdProp || autoId || fallbackId;
312
- const inputRef = React6.useRef(null);
313
- const [hasValue, setHasValue] = React6.useState(false);
314
- const focusInput = React6.useCallback(() => {
361
+ const inputRef = React9.useRef(null);
362
+ const [hasValue, setHasValue] = React9.useState(false);
363
+ const focusInput = React9.useCallback(() => {
315
364
  const el = inputRef.current;
316
365
  if (!el) return;
317
366
  if (document.activeElement === el) return;
@@ -324,7 +373,7 @@ function SearchPanelForm(props = {}) {
324
373
  }
325
374
  }
326
375
  }, []);
327
- const handlePointerDown = React6.useCallback(
376
+ const handlePointerDown = React9.useCallback(
328
377
  (event) => {
329
378
  const target = event.target;
330
379
  if (target && typeof target.closest === "function") {
@@ -336,23 +385,23 @@ function SearchPanelForm(props = {}) {
336
385
  },
337
386
  [focusInput]
338
387
  );
339
- React6.useEffect(() => {
388
+ React9.useEffect(() => {
340
389
  const el = inputRef.current;
341
390
  if (!el) return;
342
391
  if (el.value && el.value.trim()) {
343
392
  setHasValue(true);
344
393
  }
345
394
  }, []);
346
- const handleInputChange = React6.useCallback((event) => {
395
+ const handleInputChange = React9.useCallback((event) => {
347
396
  var _a;
348
397
  const nextHasValue = Boolean(
349
398
  ((_a = event == null ? void 0 : event.target) == null ? void 0 : _a.value) && event.target.value.trim()
350
399
  );
351
400
  setHasValue(nextHasValue);
352
401
  }, []);
353
- const handleClear = React6.useCallback((event) => {
402
+ const handleClear = React9.useCallback((event) => {
354
403
  }, []);
355
- const handleClearKey = React6.useCallback(
404
+ const handleClearKey = React9.useCallback(
356
405
  (event) => {
357
406
  if (event.key === "Enter" || event.key === " ") {
358
407
  event.preventDefault();
@@ -361,7 +410,7 @@ function SearchPanelForm(props = {}) {
361
410
  },
362
411
  [handleClear]
363
412
  );
364
- return /* @__PURE__ */ React6.createElement(
413
+ return /* @__PURE__ */ React9.createElement(
365
414
  "form",
366
415
  {
367
416
  action,
@@ -373,7 +422,7 @@ function SearchPanelForm(props = {}) {
373
422
  onPointerDown: handlePointerDown,
374
423
  "data-has-value": hasValue ? "1" : "0"
375
424
  },
376
- /* @__PURE__ */ React6.createElement("label", { htmlFor: inputId, className: "canopy-search-form__label" }, /* @__PURE__ */ React6.createElement(MagnifyingGlassIcon, { className: "canopy-search-form__icon" }), /* @__PURE__ */ React6.createElement(
425
+ /* @__PURE__ */ React9.createElement("label", { htmlFor: inputId, className: "canopy-search-form__label" }, /* @__PURE__ */ React9.createElement(MagnifyingGlassIcon, { className: "canopy-search-form__icon" }), /* @__PURE__ */ React9.createElement(
377
426
  "input",
378
427
  {
379
428
  id: inputId,
@@ -389,7 +438,7 @@ function SearchPanelForm(props = {}) {
389
438
  onInput: handleInputChange
390
439
  }
391
440
  )),
392
- hasValue ? /* @__PURE__ */ React6.createElement(
441
+ hasValue ? /* @__PURE__ */ React9.createElement(
393
442
  "button",
394
443
  {
395
444
  type: "button",
@@ -402,32 +451,32 @@ function SearchPanelForm(props = {}) {
402
451
  },
403
452
  "\xD7"
404
453
  ) : null,
405
- /* @__PURE__ */ React6.createElement(
454
+ /* @__PURE__ */ React9.createElement(
406
455
  "button",
407
456
  {
408
457
  type: "submit",
409
458
  "data-canopy-search-form-trigger": "submit",
410
459
  className: "canopy-search-form__submit"
411
460
  },
412
- /* @__PURE__ */ React6.createElement("span", null, text),
413
- /* @__PURE__ */ React6.createElement("span", { "aria-hidden": true, className: "canopy-search-form__shortcut" }, /* @__PURE__ */ React6.createElement("span", null, "\u2318"), /* @__PURE__ */ React6.createElement("span", null, "K"))
461
+ /* @__PURE__ */ React9.createElement("span", null, text),
462
+ /* @__PURE__ */ React9.createElement("span", { "aria-hidden": true, className: "canopy-search-form__shortcut" }, /* @__PURE__ */ React9.createElement("span", null, "\u2318"), /* @__PURE__ */ React9.createElement("span", null, "K"))
414
463
  )
415
464
  );
416
465
  }
417
466
 
418
467
  // ui/src/search/SearchPanelTeaserResults.jsx
419
- import React7 from "react";
468
+ import React10 from "react";
420
469
  function SearchPanelTeaserResults(props = {}) {
421
470
  const { style, className } = props || {};
422
471
  const classes = ["canopy-search-teaser", className].filter(Boolean).join(" ");
423
- return /* @__PURE__ */ React7.createElement(
472
+ return /* @__PURE__ */ React10.createElement(
424
473
  "div",
425
474
  {
426
475
  "data-canopy-search-form-panel": true,
427
476
  className: classes || void 0,
428
477
  style
429
478
  },
430
- /* @__PURE__ */ React7.createElement("div", { id: "cplist" })
479
+ /* @__PURE__ */ React10.createElement("div", { id: "cplist" })
431
480
  );
432
481
  }
433
482
 
@@ -448,11 +497,11 @@ function SearchPanel(props = {}) {
448
497
  const text = typeof label === "string" && label.trim() ? label.trim() : buttonLabel;
449
498
  const resolvedSearchPath = resolveSearchPath(searchPath);
450
499
  const data = { placeholder, hotkey, maxResults, groupOrder, label: text, searchPath: resolvedSearchPath };
451
- return /* @__PURE__ */ React8.createElement("div", { "data-canopy-search-form": true, className: "flex-1 min-w-0" }, /* @__PURE__ */ React8.createElement("div", { className: "relative w-full" }, /* @__PURE__ */ React8.createElement(SearchPanelForm, { placeholder, buttonLabel, label, searchPath: resolvedSearchPath }), /* @__PURE__ */ React8.createElement(SearchPanelTeaserResults, null)), /* @__PURE__ */ React8.createElement("script", { type: "application/json", dangerouslySetInnerHTML: { __html: JSON.stringify(data) } }));
500
+ return /* @__PURE__ */ React11.createElement("div", { "data-canopy-search-form": true, className: "flex-1 min-w-0" }, /* @__PURE__ */ React11.createElement("div", { className: "relative w-full" }, /* @__PURE__ */ React11.createElement(SearchPanelForm, { placeholder, buttonLabel, label, searchPath: resolvedSearchPath }), /* @__PURE__ */ React11.createElement(SearchPanelTeaserResults, null)), /* @__PURE__ */ React11.createElement("script", { type: "application/json", dangerouslySetInnerHTML: { __html: JSON.stringify(data) } }));
452
501
  }
453
502
 
454
503
  // ui/src/layout/CanopyBrand.jsx
455
- import React9 from "react";
504
+ import React12 from "react";
456
505
  function CanopyBrand(props = {}) {
457
506
  const {
458
507
  labelId,
@@ -463,11 +512,11 @@ function CanopyBrand(props = {}) {
463
512
  } = props || {};
464
513
  const spanProps = labelId ? { id: labelId } : {};
465
514
  const classes = ["canopy-logo", className].filter(Boolean).join(" ");
466
- return /* @__PURE__ */ React9.createElement("a", { href, className: classes }, typeof Logo === "function" ? /* @__PURE__ */ React9.createElement(Logo, null) : null, /* @__PURE__ */ React9.createElement("span", { ...spanProps }, label));
515
+ return /* @__PURE__ */ React12.createElement("a", { href, className: classes }, typeof Logo === "function" ? /* @__PURE__ */ React12.createElement(Logo, null) : null, /* @__PURE__ */ React12.createElement("span", { ...spanProps }, label));
467
516
  }
468
517
 
469
518
  // ui/src/layout/CanopyModal.jsx
470
- import React10 from "react";
519
+ import React13 from "react";
471
520
  function CanopyModal(props = {}) {
472
521
  const {
473
522
  id,
@@ -518,7 +567,7 @@ function CanopyModal(props = {}) {
518
567
  if (padded) bodyClasses.push("canopy-modal__body--padded");
519
568
  if (bodyClassName) bodyClasses.push(bodyClassName);
520
569
  const bodyClassNameValue = bodyClasses.join(" ");
521
- return /* @__PURE__ */ React10.createElement("div", { ...modalProps }, /* @__PURE__ */ React10.createElement("div", { className: "canopy-modal__panel" }, /* @__PURE__ */ React10.createElement("button", { ...closeButtonProps }, /* @__PURE__ */ React10.createElement(
570
+ return /* @__PURE__ */ React13.createElement("div", { ...modalProps }, /* @__PURE__ */ React13.createElement("div", { className: "canopy-modal__panel" }, /* @__PURE__ */ React13.createElement("button", { ...closeButtonProps }, /* @__PURE__ */ React13.createElement(
522
571
  "svg",
523
572
  {
524
573
  xmlns: "http://www.w3.org/2000/svg",
@@ -528,8 +577,8 @@ function CanopyModal(props = {}) {
528
577
  strokeWidth: "1.5",
529
578
  className: "canopy-modal__close-icon"
530
579
  },
531
- /* @__PURE__ */ React10.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 6l12 12M6 18L18 6" })
532
- ), /* @__PURE__ */ React10.createElement("span", { className: "sr-only" }, closeLabel)), /* @__PURE__ */ React10.createElement("div", { className: bodyClassNameValue }, label ? /* @__PURE__ */ React10.createElement("div", { className: "canopy-modal__brand" }, /* @__PURE__ */ React10.createElement(
580
+ /* @__PURE__ */ React13.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 6l12 12M6 18L18 6" })
581
+ ), /* @__PURE__ */ React13.createElement("span", { className: "sr-only" }, closeLabel)), /* @__PURE__ */ React13.createElement("div", { className: bodyClassNameValue }, label ? /* @__PURE__ */ React13.createElement("div", { className: "canopy-modal__brand" }, /* @__PURE__ */ React13.createElement(
533
582
  CanopyBrand,
534
583
  {
535
584
  labelId: resolvedLabelId,
@@ -733,7 +782,7 @@ function HeaderScript() {
733
782
  });
734
783
  })();
735
784
  `;
736
- return /* @__PURE__ */ React11.createElement(
785
+ return /* @__PURE__ */ React14.createElement(
737
786
  "script",
738
787
  {
739
788
  dangerouslySetInnerHTML: {
@@ -757,7 +806,7 @@ function CanopyHeader(props = {}) {
757
806
  logo: SiteLogo
758
807
  } = props;
759
808
  const navLinks = ensureArray(navLinksProp);
760
- return /* @__PURE__ */ React11.createElement(React11.Fragment, null, /* @__PURE__ */ React11.createElement("header", { className: "canopy-header", "data-mobile-nav": "closed", "data-mobile-search": "closed" }, /* @__PURE__ */ React11.createElement("div", { className: "canopy-header__brand" }, /* @__PURE__ */ React11.createElement(
809
+ return /* @__PURE__ */ React14.createElement(React14.Fragment, null, /* @__PURE__ */ React14.createElement("header", { className: "canopy-header", "data-mobile-nav": "closed", "data-mobile-search": "closed" }, /* @__PURE__ */ React14.createElement("div", { className: "canopy-header__brand" }, /* @__PURE__ */ React14.createElement(
761
810
  CanopyBrand,
762
811
  {
763
812
  label: title,
@@ -765,7 +814,7 @@ function CanopyHeader(props = {}) {
765
814
  className: "canopy-header__brand-link",
766
815
  Logo: SiteLogo
767
816
  }
768
- )), /* @__PURE__ */ React11.createElement("div", { className: "canopy-header__desktop-search" }, /* @__PURE__ */ React11.createElement(SearchPanel, { label: searchLabel, hotkey: searchHotkey, placeholder: searchPlaceholder })), /* @__PURE__ */ React11.createElement("nav", { className: "canopy-nav-links canopy-header__desktop-nav", "aria-label": "Primary navigation" }, navLinks.map((link) => /* @__PURE__ */ React11.createElement("a", { key: link.href, href: link.href }, link.label || link.href))), /* @__PURE__ */ React11.createElement("div", { className: "canopy-header__actions" }, /* @__PURE__ */ React11.createElement(
817
+ )), /* @__PURE__ */ React14.createElement("div", { className: "canopy-header__desktop-search" }, /* @__PURE__ */ React14.createElement(SearchPanel, { label: searchLabel, hotkey: searchHotkey, placeholder: searchPlaceholder })), /* @__PURE__ */ React14.createElement("nav", { className: "canopy-nav-links canopy-header__desktop-nav", "aria-label": "Primary navigation" }, navLinks.map((link) => /* @__PURE__ */ React14.createElement("a", { key: link.href, href: link.href }, link.label || link.href))), /* @__PURE__ */ React14.createElement("div", { className: "canopy-header__actions" }, /* @__PURE__ */ React14.createElement(
769
818
  "button",
770
819
  {
771
820
  type: "button",
@@ -775,7 +824,7 @@ function CanopyHeader(props = {}) {
775
824
  "aria-expanded": "false",
776
825
  "data-canopy-header-toggle": "search"
777
826
  },
778
- /* @__PURE__ */ React11.createElement(
827
+ /* @__PURE__ */ React14.createElement(
779
828
  "svg",
780
829
  {
781
830
  xmlns: "http://www.w3.org/2000/svg",
@@ -785,9 +834,9 @@ function CanopyHeader(props = {}) {
785
834
  strokeWidth: "1.5",
786
835
  className: "canopy-header__search-icon"
787
836
  },
788
- /* @__PURE__ */ React11.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "m21 21-3.8-3.8M10.5 18a7.5 7.5 0 1 1 0-15 7.5 7.5 0 0 1 0 15Z" })
837
+ /* @__PURE__ */ React14.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "m21 21-3.8-3.8M10.5 18a7.5 7.5 0 1 1 0-15 7.5 7.5 0 0 1 0 15Z" })
789
838
  )
790
- ), /* @__PURE__ */ React11.createElement(
839
+ ), /* @__PURE__ */ React14.createElement(
791
840
  "button",
792
841
  {
793
842
  type: "button",
@@ -797,7 +846,7 @@ function CanopyHeader(props = {}) {
797
846
  "aria-expanded": "false",
798
847
  "data-canopy-header-toggle": "nav"
799
848
  },
800
- /* @__PURE__ */ React11.createElement(
849
+ /* @__PURE__ */ React14.createElement(
801
850
  "svg",
802
851
  {
803
852
  xmlns: "http://www.w3.org/2000/svg",
@@ -807,9 +856,9 @@ function CanopyHeader(props = {}) {
807
856
  stroke: "currentColor",
808
857
  className: "canopy-header__menu-icon"
809
858
  },
810
- /* @__PURE__ */ React11.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5" })
859
+ /* @__PURE__ */ React14.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5" })
811
860
  )
812
- ))), /* @__PURE__ */ React11.createElement(
861
+ ))), /* @__PURE__ */ React14.createElement(
813
862
  CanopyModal,
814
863
  {
815
864
  id: "canopy-modal-nav",
@@ -821,8 +870,8 @@ function CanopyHeader(props = {}) {
821
870
  closeLabel: "Close navigation",
822
871
  closeDataAttr: "nav"
823
872
  },
824
- /* @__PURE__ */ React11.createElement("nav", { className: "canopy-nav-links canopy-modal__nav", "aria-label": "Primary navigation" }, navLinks.map((link) => /* @__PURE__ */ React11.createElement("a", { key: link.href, href: link.href }, link.label || link.href)))
825
- ), /* @__PURE__ */ React11.createElement(
873
+ /* @__PURE__ */ React14.createElement("nav", { className: "canopy-nav-links canopy-modal__nav", "aria-label": "Primary navigation" }, navLinks.map((link) => /* @__PURE__ */ React14.createElement("a", { key: link.href, href: link.href }, link.label || link.href)))
874
+ ), /* @__PURE__ */ React14.createElement(
826
875
  CanopyModal,
827
876
  {
828
877
  id: "canopy-modal-search",
@@ -835,19 +884,19 @@ function CanopyHeader(props = {}) {
835
884
  closeDataAttr: "search",
836
885
  bodyClassName: "canopy-modal__body--search"
837
886
  },
838
- /* @__PURE__ */ React11.createElement(SearchPanel, { label: searchLabel, hotkey: searchHotkey, placeholder: searchPlaceholder })
839
- ), /* @__PURE__ */ React11.createElement(HeaderScript, null));
887
+ /* @__PURE__ */ React14.createElement(SearchPanel, { label: searchLabel, hotkey: searchHotkey, placeholder: searchPlaceholder })
888
+ ), /* @__PURE__ */ React14.createElement(HeaderScript, null));
840
889
  }
841
890
 
842
891
  // ui/src/layout/CanopyFooter.jsx
843
- import React12 from "react";
892
+ import React15 from "react";
844
893
  function CanopyFooter({ className = "", children }) {
845
894
  const footerClassName = ["canopy-footer", className].filter(Boolean).join(" ");
846
- return /* @__PURE__ */ React12.createElement("footer", { className: footerClassName }, /* @__PURE__ */ React12.createElement("div", { className: "canopy-footer__inner" }, children));
895
+ return /* @__PURE__ */ React15.createElement("footer", { className: footerClassName }, /* @__PURE__ */ React15.createElement("div", { className: "canopy-footer__inner" }, children));
847
896
  }
848
897
 
849
898
  // ui/src/iiif/Viewer.jsx
850
- import React13, { useEffect as useEffect2, useState as useState2 } from "react";
899
+ import React16, { useEffect as useEffect2, useState as useState2 } from "react";
851
900
  var DEFAULT_VIEWER_OPTIONS = {
852
901
  showDownload: false,
853
902
  showIIIFBadge: false,
@@ -903,7 +952,7 @@ var Viewer = (props) => {
903
952
  } catch (_) {
904
953
  json = "{}";
905
954
  }
906
- return /* @__PURE__ */ React13.createElement("div", { "data-canopy-viewer": "1", className: "not-prose" }, /* @__PURE__ */ React13.createElement(
955
+ return /* @__PURE__ */ React16.createElement("div", { "data-canopy-viewer": "1", className: "not-prose" }, /* @__PURE__ */ React16.createElement(
907
956
  "script",
908
957
  {
909
958
  type: "application/json",
@@ -911,11 +960,11 @@ var Viewer = (props) => {
911
960
  }
912
961
  ));
913
962
  }
914
- return /* @__PURE__ */ React13.createElement(CloverViewer, { ...props, options: mergedOptions });
963
+ return /* @__PURE__ */ React16.createElement(CloverViewer, { ...props, options: mergedOptions });
915
964
  };
916
965
 
917
966
  // ui/src/iiif/Slider.jsx
918
- import React14, { useEffect as useEffect3, useState as useState3 } from "react";
967
+ import React17, { useEffect as useEffect3, useState as useState3 } from "react";
919
968
  var Slider = (props) => {
920
969
  const [CloverSlider, setCloverSlider] = useState3(null);
921
970
  useEffect3(() => {
@@ -941,7 +990,7 @@ var Slider = (props) => {
941
990
  } catch (_) {
942
991
  json = "{}";
943
992
  }
944
- return /* @__PURE__ */ React14.createElement("div", { "data-canopy-slider": "1", className: "not-prose" }, /* @__PURE__ */ React14.createElement(
993
+ return /* @__PURE__ */ React17.createElement("div", { "data-canopy-slider": "1", className: "not-prose" }, /* @__PURE__ */ React17.createElement(
945
994
  "script",
946
995
  {
947
996
  type: "application/json",
@@ -949,11 +998,11 @@ var Slider = (props) => {
949
998
  }
950
999
  ));
951
1000
  }
952
- return /* @__PURE__ */ React14.createElement(CloverSlider, { ...props });
1001
+ return /* @__PURE__ */ React17.createElement(CloverSlider, { ...props });
953
1002
  };
954
1003
 
955
1004
  // ui/src/iiif/Scroll.jsx
956
- import React15, { useEffect as useEffect4, useState as useState4 } from "react";
1005
+ import React18, { useEffect as useEffect4, useState as useState4 } from "react";
957
1006
  var Scroll = (props) => {
958
1007
  const [CloverScroll, setCloverScroll] = useState4(null);
959
1008
  useEffect4(() => {
@@ -978,7 +1027,7 @@ var Scroll = (props) => {
978
1027
  } catch (_) {
979
1028
  json = "{}";
980
1029
  }
981
- return /* @__PURE__ */ React15.createElement("div", { "data-canopy-scroll": "1", className: "not-prose" }, /* @__PURE__ */ React15.createElement(
1030
+ return /* @__PURE__ */ React18.createElement("div", { "data-canopy-scroll": "1", className: "not-prose" }, /* @__PURE__ */ React18.createElement(
982
1031
  "script",
983
1032
  {
984
1033
  type: "application/json",
@@ -986,11 +1035,11 @@ var Scroll = (props) => {
986
1035
  }
987
1036
  ));
988
1037
  }
989
- return /* @__PURE__ */ React15.createElement(CloverScroll, { ...props });
1038
+ return /* @__PURE__ */ React18.createElement(CloverScroll, { ...props });
990
1039
  };
991
1040
 
992
1041
  // ui/src/iiif/MdxRelatedItems.jsx
993
- import React16 from "react";
1042
+ import React19 from "react";
994
1043
  function MdxRelatedItems(props) {
995
1044
  let json = "{}";
996
1045
  try {
@@ -998,11 +1047,11 @@ function MdxRelatedItems(props) {
998
1047
  } catch (_) {
999
1048
  json = "{}";
1000
1049
  }
1001
- return /* @__PURE__ */ React16.createElement("div", { "data-canopy-related-items": "1", className: "not-prose" }, /* @__PURE__ */ React16.createElement("script", { type: "application/json", dangerouslySetInnerHTML: { __html: json } }));
1050
+ return /* @__PURE__ */ React19.createElement("div", { "data-canopy-related-items": "1", className: "not-prose" }, /* @__PURE__ */ React19.createElement("script", { type: "application/json", dangerouslySetInnerHTML: { __html: json } }));
1002
1051
  }
1003
1052
 
1004
1053
  // ui/src/search/MdxSearchResults.jsx
1005
- import React17 from "react";
1054
+ import React20 from "react";
1006
1055
  function MdxSearchResults(props) {
1007
1056
  let json = "{}";
1008
1057
  try {
@@ -1010,11 +1059,11 @@ function MdxSearchResults(props) {
1010
1059
  } catch (_) {
1011
1060
  json = "{}";
1012
1061
  }
1013
- return /* @__PURE__ */ React17.createElement("div", { "data-canopy-search-results": "1" }, /* @__PURE__ */ React17.createElement("script", { type: "application/json", dangerouslySetInnerHTML: { __html: json } }));
1062
+ return /* @__PURE__ */ React20.createElement("div", { "data-canopy-search-results": "1" }, /* @__PURE__ */ React20.createElement("script", { type: "application/json", dangerouslySetInnerHTML: { __html: json } }));
1014
1063
  }
1015
1064
 
1016
1065
  // ui/src/search/SearchSummary.jsx
1017
- import React18 from "react";
1066
+ import React21 from "react";
1018
1067
  function SearchSummary(props) {
1019
1068
  let json = "{}";
1020
1069
  try {
@@ -1022,11 +1071,11 @@ function SearchSummary(props) {
1022
1071
  } catch (_) {
1023
1072
  json = "{}";
1024
1073
  }
1025
- return /* @__PURE__ */ React18.createElement("div", { "data-canopy-search-summary": "1" }, /* @__PURE__ */ React18.createElement("script", { type: "application/json", dangerouslySetInnerHTML: { __html: json } }));
1074
+ return /* @__PURE__ */ React21.createElement("div", { "data-canopy-search-summary": "1" }, /* @__PURE__ */ React21.createElement("script", { type: "application/json", dangerouslySetInnerHTML: { __html: json } }));
1026
1075
  }
1027
1076
 
1028
1077
  // ui/src/search/MdxSearchTabs.jsx
1029
- import React19 from "react";
1078
+ import React22 from "react";
1030
1079
  function MdxSearchTabs(props) {
1031
1080
  let json = "{}";
1032
1081
  try {
@@ -1034,11 +1083,11 @@ function MdxSearchTabs(props) {
1034
1083
  } catch (_) {
1035
1084
  json = "{}";
1036
1085
  }
1037
- return /* @__PURE__ */ React19.createElement("div", { "data-canopy-search-tabs": "1" }, /* @__PURE__ */ React19.createElement("script", { type: "application/json", dangerouslySetInnerHTML: { __html: json } }));
1086
+ return /* @__PURE__ */ React22.createElement("div", { "data-canopy-search-tabs": "1" }, /* @__PURE__ */ React22.createElement("script", { type: "application/json", dangerouslySetInnerHTML: { __html: json } }));
1038
1087
  }
1039
1088
 
1040
1089
  // ui/src/search/SearchResults.jsx
1041
- import React20 from "react";
1090
+ import React23 from "react";
1042
1091
  function SearchResults({
1043
1092
  results = [],
1044
1093
  type = "all",
@@ -1046,19 +1095,19 @@ function SearchResults({
1046
1095
  query = ""
1047
1096
  }) {
1048
1097
  if (!results.length) {
1049
- return /* @__PURE__ */ React20.createElement("div", { className: "text-slate-600" }, /* @__PURE__ */ React20.createElement("em", null, "No results"));
1098
+ return /* @__PURE__ */ React23.createElement("div", { className: "text-slate-600" }, /* @__PURE__ */ React23.createElement("em", null, "No results"));
1050
1099
  }
1051
1100
  const normalizedType = String(type || "all").toLowerCase();
1052
1101
  const isAnnotationView = normalizedType === "annotation";
1053
1102
  if (isAnnotationView) {
1054
- return /* @__PURE__ */ React20.createElement("div", { id: "search-results", className: "space-y-4" }, results.map((r, i) => {
1103
+ return /* @__PURE__ */ React23.createElement("div", { id: "search-results", className: "space-y-4" }, results.map((r, i) => {
1055
1104
  if (!r) return null;
1056
1105
  return renderTextCard(r, r.id || i);
1057
1106
  }));
1058
1107
  }
1059
1108
  const renderTextCard = (record, key) => {
1060
1109
  if (!record) return null;
1061
- return /* @__PURE__ */ React20.createElement(
1110
+ return /* @__PURE__ */ React23.createElement(
1062
1111
  TextCard,
1063
1112
  {
1064
1113
  key,
@@ -1074,20 +1123,20 @@ function SearchResults({
1074
1123
  const isWorkRecord = (record) => String(record && record.type).toLowerCase() === "work";
1075
1124
  const shouldRenderAsTextCard = (record) => !isWorkRecord(record) || normalizedType !== "work";
1076
1125
  if (layout === "list") {
1077
- return /* @__PURE__ */ React20.createElement("ul", { id: "search-results", className: "space-y-3" }, results.map((r, i) => {
1126
+ return /* @__PURE__ */ React23.createElement("ul", { id: "search-results", className: "space-y-3" }, results.map((r, i) => {
1078
1127
  if (shouldRenderAsTextCard(r)) {
1079
- return /* @__PURE__ */ React20.createElement("li", { key: i, className: `search-result ${r && r.type}` }, renderTextCard(r, i));
1128
+ return /* @__PURE__ */ React23.createElement("li", { key: i, className: `search-result ${r && r.type}` }, renderTextCard(r, i));
1080
1129
  }
1081
1130
  const hasDims = Number.isFinite(Number(r.thumbnailWidth)) && Number(r.thumbnailWidth) > 0 && Number.isFinite(Number(r.thumbnailHeight)) && Number(r.thumbnailHeight) > 0;
1082
1131
  const aspect = hasDims ? Number(r.thumbnailWidth) / Number(r.thumbnailHeight) : void 0;
1083
- return /* @__PURE__ */ React20.createElement(
1132
+ return /* @__PURE__ */ React23.createElement(
1084
1133
  "li",
1085
1134
  {
1086
1135
  key: i,
1087
1136
  className: `search-result ${r.type}`,
1088
1137
  "data-thumbnail-aspect-ratio": aspect
1089
1138
  },
1090
- /* @__PURE__ */ React20.createElement(
1139
+ /* @__PURE__ */ React23.createElement(
1091
1140
  Card,
1092
1141
  {
1093
1142
  href: r.href,
@@ -1101,20 +1150,20 @@ function SearchResults({
1101
1150
  );
1102
1151
  }));
1103
1152
  }
1104
- return /* @__PURE__ */ React20.createElement("div", { id: "search-results" }, /* @__PURE__ */ React20.createElement(Grid, null, results.map((r, i) => {
1153
+ return /* @__PURE__ */ React23.createElement("div", { id: "search-results" }, /* @__PURE__ */ React23.createElement(Grid, null, results.map((r, i) => {
1105
1154
  if (shouldRenderAsTextCard(r)) {
1106
- return /* @__PURE__ */ React20.createElement(GridItem, { key: i, className: `search-result ${r && r.type}` }, renderTextCard(r, i));
1155
+ return /* @__PURE__ */ React23.createElement(GridItem, { key: i, className: `search-result ${r && r.type}` }, renderTextCard(r, i));
1107
1156
  }
1108
1157
  const hasDims = Number.isFinite(Number(r.thumbnailWidth)) && Number(r.thumbnailWidth) > 0 && Number.isFinite(Number(r.thumbnailHeight)) && Number(r.thumbnailHeight) > 0;
1109
1158
  const aspect = hasDims ? Number(r.thumbnailWidth) / Number(r.thumbnailHeight) : void 0;
1110
- return /* @__PURE__ */ React20.createElement(
1159
+ return /* @__PURE__ */ React23.createElement(
1111
1160
  GridItem,
1112
1161
  {
1113
1162
  key: i,
1114
1163
  className: `search-result ${r.type}`,
1115
1164
  "data-thumbnail-aspect-ratio": aspect
1116
1165
  },
1117
- /* @__PURE__ */ React20.createElement(
1166
+ /* @__PURE__ */ React23.createElement(
1118
1167
  Card,
1119
1168
  {
1120
1169
  href: r.href,
@@ -1130,7 +1179,7 @@ function SearchResults({
1130
1179
  }
1131
1180
 
1132
1181
  // ui/src/search/SearchTabs.jsx
1133
- import React21 from "react";
1182
+ import React24 from "react";
1134
1183
  function SearchTabs({
1135
1184
  type = "all",
1136
1185
  onTypeChange,
@@ -1145,7 +1194,7 @@ function SearchTabs({
1145
1194
  const toLabel = (t) => t && t.length ? t.charAt(0).toUpperCase() + t.slice(1) : "";
1146
1195
  const hasFilters = typeof onOpenFilters === "function";
1147
1196
  const filterBadge = activeFilterCount > 0 ? ` (${activeFilterCount})` : "";
1148
- return /* @__PURE__ */ React21.createElement("div", { className: "canopy-search-tabs-wrapper" }, /* @__PURE__ */ React21.createElement(
1197
+ return /* @__PURE__ */ React24.createElement("div", { className: "canopy-search-tabs-wrapper" }, /* @__PURE__ */ React24.createElement(
1149
1198
  "div",
1150
1199
  {
1151
1200
  role: "tablist",
@@ -1156,7 +1205,7 @@ function SearchTabs({
1156
1205
  const active = String(type).toLowerCase() === String(t).toLowerCase();
1157
1206
  const cRaw = counts && Object.prototype.hasOwnProperty.call(counts, t) ? counts[t] : void 0;
1158
1207
  const c = Number.isFinite(Number(cRaw)) ? Number(cRaw) : 0;
1159
- return /* @__PURE__ */ React21.createElement(
1208
+ return /* @__PURE__ */ React24.createElement(
1160
1209
  "button",
1161
1210
  {
1162
1211
  key: t,
@@ -1171,7 +1220,7 @@ function SearchTabs({
1171
1220
  ")"
1172
1221
  );
1173
1222
  })
1174
- ), hasFilters ? /* @__PURE__ */ React21.createElement(
1223
+ ), hasFilters ? /* @__PURE__ */ React24.createElement(
1175
1224
  "button",
1176
1225
  {
1177
1226
  type: "button",
@@ -1179,12 +1228,12 @@ function SearchTabs({
1179
1228
  "aria-expanded": filtersOpen ? "true" : "false",
1180
1229
  className: "inline-flex items-center gap-2 rounded-md border border-slate-200 bg-white px-3 py-1.5 text-sm font-medium text-slate-700 shadow-sm transition hover:border-brand-200 hover:bg-brand-50 hover:text-brand-700"
1181
1230
  },
1182
- /* @__PURE__ */ React21.createElement("span", null, filtersLabel, filterBadge)
1231
+ /* @__PURE__ */ React24.createElement("span", null, filtersLabel, filterBadge)
1183
1232
  ) : null);
1184
1233
  }
1185
1234
 
1186
1235
  // ui/src/search/SearchFiltersDialog.jsx
1187
- import React22 from "react";
1236
+ import React25 from "react";
1188
1237
  function toArray(input) {
1189
1238
  if (!input) return [];
1190
1239
  if (Array.isArray(input)) return input;
@@ -1223,20 +1272,20 @@ function FacetSection({ facet, selected, onToggle }) {
1223
1272
  const selectedValues = selected.get(String(slug)) || /* @__PURE__ */ new Set();
1224
1273
  const checkboxId = (valueSlug) => `filter-${slug}-${valueSlug}`;
1225
1274
  const hasSelection = selectedValues.size > 0;
1226
- const [quickQuery, setQuickQuery] = React22.useState("");
1275
+ const [quickQuery, setQuickQuery] = React25.useState("");
1227
1276
  const hasQuery = quickQuery.trim().length > 0;
1228
- const filteredValues = React22.useMemo(
1277
+ const filteredValues = React25.useMemo(
1229
1278
  () => facetMatches(values, quickQuery),
1230
1279
  [values, quickQuery]
1231
1280
  );
1232
- return /* @__PURE__ */ React22.createElement(
1281
+ return /* @__PURE__ */ React25.createElement(
1233
1282
  "details",
1234
1283
  {
1235
1284
  className: "canopy-search-filters__facet",
1236
1285
  open: hasSelection
1237
1286
  },
1238
- /* @__PURE__ */ React22.createElement("summary", { className: "canopy-search-filters__facet-summary" }, /* @__PURE__ */ React22.createElement("span", null, label), /* @__PURE__ */ React22.createElement("span", { className: "canopy-search-filters__facet-count" }, values.length)),
1239
- /* @__PURE__ */ React22.createElement("div", { className: "canopy-search-filters__facet-content" }, /* @__PURE__ */ React22.createElement("div", { className: "canopy-search-filters__quick" }, /* @__PURE__ */ React22.createElement(
1287
+ /* @__PURE__ */ React25.createElement("summary", { className: "canopy-search-filters__facet-summary" }, /* @__PURE__ */ React25.createElement("span", null, label), /* @__PURE__ */ React25.createElement("span", { className: "canopy-search-filters__facet-count" }, values.length)),
1288
+ /* @__PURE__ */ React25.createElement("div", { className: "canopy-search-filters__facet-content" }, /* @__PURE__ */ React25.createElement("div", { className: "canopy-search-filters__quick" }, /* @__PURE__ */ React25.createElement(
1240
1289
  "input",
1241
1290
  {
1242
1291
  type: "search",
@@ -1246,7 +1295,7 @@ function FacetSection({ facet, selected, onToggle }) {
1246
1295
  className: "canopy-search-filters__quick-input",
1247
1296
  "aria-label": `Filter ${label} values`
1248
1297
  }
1249
- ), quickQuery ? /* @__PURE__ */ React22.createElement(
1298
+ ), quickQuery ? /* @__PURE__ */ React25.createElement(
1250
1299
  "button",
1251
1300
  {
1252
1301
  type: "button",
@@ -1254,11 +1303,11 @@ function FacetSection({ facet, selected, onToggle }) {
1254
1303
  className: "canopy-search-filters__quick-clear"
1255
1304
  },
1256
1305
  "Clear"
1257
- ) : null), hasQuery && !filteredValues.length ? /* @__PURE__ */ React22.createElement("p", { className: "canopy-search-filters__facet-notice" }, "No matches found.") : null, /* @__PURE__ */ React22.createElement("ul", { className: "canopy-search-filters__facet-list" }, filteredValues.map((entry) => {
1306
+ ) : null), hasQuery && !filteredValues.length ? /* @__PURE__ */ React25.createElement("p", { className: "canopy-search-filters__facet-notice" }, "No matches found.") : null, /* @__PURE__ */ React25.createElement("ul", { className: "canopy-search-filters__facet-list" }, filteredValues.map((entry) => {
1258
1307
  const valueSlug = String(entry.slug || entry.value || "");
1259
1308
  const isChecked = selectedValues.has(valueSlug);
1260
1309
  const inputId = checkboxId(valueSlug);
1261
- return /* @__PURE__ */ React22.createElement("li", { key: valueSlug, className: "canopy-search-filters__facet-item" }, /* @__PURE__ */ React22.createElement(
1310
+ return /* @__PURE__ */ React25.createElement("li", { key: valueSlug, className: "canopy-search-filters__facet-item" }, /* @__PURE__ */ React25.createElement(
1262
1311
  "input",
1263
1312
  {
1264
1313
  id: inputId,
@@ -1270,15 +1319,15 @@ function FacetSection({ facet, selected, onToggle }) {
1270
1319
  if (onToggle) onToggle(slug, valueSlug, nextChecked);
1271
1320
  }
1272
1321
  }
1273
- ), /* @__PURE__ */ React22.createElement(
1322
+ ), /* @__PURE__ */ React25.createElement(
1274
1323
  "label",
1275
1324
  {
1276
1325
  htmlFor: inputId,
1277
1326
  className: "canopy-search-filters__facet-label"
1278
1327
  },
1279
- /* @__PURE__ */ React22.createElement("span", null, entry.value, " ", Number.isFinite(entry.doc_count) ? /* @__PURE__ */ React22.createElement("span", { className: "canopy-search-filters__facet-count" }, "(", entry.doc_count, ")") : null)
1328
+ /* @__PURE__ */ React25.createElement("span", null, entry.value, " ", Number.isFinite(entry.doc_count) ? /* @__PURE__ */ React25.createElement("span", { className: "canopy-search-filters__facet-count" }, "(", entry.doc_count, ")") : null)
1280
1329
  ));
1281
- }), !filteredValues.length && !hasQuery ? /* @__PURE__ */ React22.createElement("li", { className: "canopy-search-filters__facet-empty" }, "No values available.") : null))
1330
+ }), !filteredValues.length && !hasQuery ? /* @__PURE__ */ React25.createElement("li", { className: "canopy-search-filters__facet-empty" }, "No values available.") : null))
1282
1331
  );
1283
1332
  }
1284
1333
  function SearchFiltersDialog(props = {}) {
@@ -1300,7 +1349,7 @@ function SearchFiltersDialog(props = {}) {
1300
1349
  (total, set) => total + set.size,
1301
1350
  0
1302
1351
  );
1303
- React22.useEffect(() => {
1352
+ React25.useEffect(() => {
1304
1353
  if (!open) return void 0;
1305
1354
  if (typeof document === "undefined") return void 0;
1306
1355
  const body = document.body;
@@ -1317,7 +1366,7 @@ function SearchFiltersDialog(props = {}) {
1317
1366
  if (!open) return null;
1318
1367
  const brandId = "canopy-modal-filters-label";
1319
1368
  const subtitleText = subtitle != null ? subtitle : title;
1320
- return /* @__PURE__ */ React22.createElement(
1369
+ return /* @__PURE__ */ React25.createElement(
1321
1370
  CanopyModal,
1322
1371
  {
1323
1372
  id: "canopy-modal-filters",
@@ -1332,8 +1381,8 @@ function SearchFiltersDialog(props = {}) {
1332
1381
  onBackgroundClick: () => onOpenChange && onOpenChange(false),
1333
1382
  bodyClassName: "canopy-modal__body--filters"
1334
1383
  },
1335
- subtitleText ? /* @__PURE__ */ React22.createElement("p", { className: "canopy-search-filters__subtitle" }, subtitleText) : null,
1336
- /* @__PURE__ */ React22.createElement("div", { className: "canopy-search-filters__body" }, Array.isArray(facets) && facets.length ? /* @__PURE__ */ React22.createElement("div", { className: "canopy-search-filters__facets" }, facets.map((facet) => /* @__PURE__ */ React22.createElement(
1384
+ subtitleText ? /* @__PURE__ */ React25.createElement("p", { className: "canopy-search-filters__subtitle" }, subtitleText) : null,
1385
+ /* @__PURE__ */ React25.createElement("div", { className: "canopy-search-filters__body" }, Array.isArray(facets) && facets.length ? /* @__PURE__ */ React25.createElement("div", { className: "canopy-search-filters__facets" }, facets.map((facet) => /* @__PURE__ */ React25.createElement(
1337
1386
  FacetSection,
1338
1387
  {
1339
1388
  key: facet.slug || facet.label,
@@ -1341,8 +1390,8 @@ function SearchFiltersDialog(props = {}) {
1341
1390
  selected: selectedMap,
1342
1391
  onToggle
1343
1392
  }
1344
- ))) : /* @__PURE__ */ React22.createElement("p", { className: "canopy-search-filters__empty" }, "No filters are available for this collection.")),
1345
- /* @__PURE__ */ React22.createElement("footer", { className: "canopy-search-filters__footer" }, /* @__PURE__ */ React22.createElement("div", null, activeCount ? `${activeCount} filter${activeCount === 1 ? "" : "s"} applied` : "No filters applied"), /* @__PURE__ */ React22.createElement("div", { className: "canopy-search-filters__footer-actions" }, /* @__PURE__ */ React22.createElement(
1393
+ ))) : /* @__PURE__ */ React25.createElement("p", { className: "canopy-search-filters__empty" }, "No filters are available for this collection.")),
1394
+ /* @__PURE__ */ React25.createElement("footer", { className: "canopy-search-filters__footer" }, /* @__PURE__ */ React25.createElement("div", null, activeCount ? `${activeCount} filter${activeCount === 1 ? "" : "s"} applied` : "No filters applied"), /* @__PURE__ */ React25.createElement("div", { className: "canopy-search-filters__footer-actions" }, /* @__PURE__ */ React25.createElement(
1346
1395
  "button",
1347
1396
  {
1348
1397
  type: "button",
@@ -1353,7 +1402,7 @@ function SearchFiltersDialog(props = {}) {
1353
1402
  className: "canopy-search-filters__button canopy-search-filters__button--secondary"
1354
1403
  },
1355
1404
  "Clear all"
1356
- ), /* @__PURE__ */ React22.createElement(
1405
+ ), /* @__PURE__ */ React25.createElement(
1357
1406
  "button",
1358
1407
  {
1359
1408
  type: "button",
@@ -1366,7 +1415,7 @@ function SearchFiltersDialog(props = {}) {
1366
1415
  }
1367
1416
 
1368
1417
  // ui/src/search-form/MdxSearchFormModal.jsx
1369
- import React23 from "react";
1418
+ import React26 from "react";
1370
1419
  function MdxSearchFormModal(props = {}) {
1371
1420
  const {
1372
1421
  placeholder = "Search\u2026",
@@ -1382,14 +1431,25 @@ function MdxSearchFormModal(props = {}) {
1382
1431
  const text = typeof label === "string" && label.trim() ? label.trim() : buttonLabel;
1383
1432
  const resolvedSearchPath = resolveSearchPath(searchPath);
1384
1433
  const data = { placeholder, hotkey, maxResults, groupOrder, label: text, searchPath: resolvedSearchPath };
1385
- return /* @__PURE__ */ React23.createElement("div", { "data-canopy-search-form": true, className: "flex-1 min-w-0" }, /* @__PURE__ */ React23.createElement("div", { className: "relative w-full" }, /* @__PURE__ */ React23.createElement(SearchPanelForm, { placeholder, buttonLabel, label, searchPath: resolvedSearchPath }), /* @__PURE__ */ React23.createElement(SearchPanelTeaserResults, null)), /* @__PURE__ */ React23.createElement("script", { type: "application/json", dangerouslySetInnerHTML: { __html: JSON.stringify(data) } }));
1434
+ return /* @__PURE__ */ React26.createElement("div", { "data-canopy-search-form": true, className: "flex-1 min-w-0" }, /* @__PURE__ */ React26.createElement("div", { className: "relative w-full" }, /* @__PURE__ */ React26.createElement(SearchPanelForm, { placeholder, buttonLabel, label, searchPath: resolvedSearchPath }), /* @__PURE__ */ React26.createElement(SearchPanelTeaserResults, null)), /* @__PURE__ */ React26.createElement("script", { type: "application/json", dangerouslySetInnerHTML: { __html: JSON.stringify(data) } }));
1435
+ }
1436
+
1437
+ // ui/src/docs/MarkdownTable.jsx
1438
+ import React27 from "react";
1439
+ function MarkdownTable({ className = "", ...rest }) {
1440
+ const merged = ["markdown-table", className].filter(Boolean).join(" ");
1441
+ return /* @__PURE__ */ React27.createElement("div", { className: "markdown-table__frame" }, /* @__PURE__ */ React27.createElement("table", { className: merged, ...rest }));
1386
1442
  }
1387
1443
  export {
1444
+ Button,
1445
+ ButtonWrapper,
1388
1446
  CanopyBrand,
1389
1447
  CanopyFooter,
1390
1448
  CanopyHeader,
1391
1449
  CanopyModal,
1392
1450
  Card,
1451
+ Container,
1452
+ MarkdownTable as DocsMarkdownTable,
1393
1453
  Grid,
1394
1454
  GridItem,
1395
1455
  HelloWorld,