@canopy-iiif/app 0.7.7 → 0.7.9
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/package.json +1 -2
- package/ui/dist/index.mjs +0 -121
- package/ui/dist/index.mjs.map +4 -4
- package/ui/dist/server.mjs +0 -121
- package/ui/dist/server.mjs.map +4 -4
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@canopy-iiif/app",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.9",
|
|
4
4
|
"private": false,
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Mat Jordan <mat@northwestern.edu>",
|
|
@@ -30,7 +30,6 @@
|
|
|
30
30
|
"@mdx-js/mdx": "^3.1.0",
|
|
31
31
|
"@mdx-js/react": "^3.1.0",
|
|
32
32
|
"charm": "^1.0.2",
|
|
33
|
-
"cmdk": "^1.1.1",
|
|
34
33
|
"js-yaml": "^4.1.0",
|
|
35
34
|
"react-masonry-css": "^1.0.16",
|
|
36
35
|
"sass": "^1.77.0",
|
package/ui/dist/index.mjs
CHANGED
|
@@ -549,130 +549,9 @@ function MdxCommandPalette(props = {}) {
|
|
|
549
549
|
/* @__PURE__ */ React15.createElement("span", { className: "sr-only" }, buttonLabel)
|
|
550
550
|
), /* @__PURE__ */ React15.createElement("script", { type: "application/json", dangerouslySetInnerHTML: { __html: JSON.stringify(data) } }));
|
|
551
551
|
}
|
|
552
|
-
|
|
553
|
-
// ui/src/command/CommandApp.jsx
|
|
554
|
-
import React16, { useEffect as useEffect5, useMemo as useMemo2, useState as useState5 } from "react";
|
|
555
|
-
import { Command } from "cmdk";
|
|
556
|
-
function normalize(s) {
|
|
557
|
-
try {
|
|
558
|
-
return String(s || "").toLowerCase();
|
|
559
|
-
} catch (e) {
|
|
560
|
-
return "";
|
|
561
|
-
}
|
|
562
|
-
}
|
|
563
|
-
function groupLabel(t) {
|
|
564
|
-
const type = String(t || "").toLowerCase();
|
|
565
|
-
if (type === "work") return "Works";
|
|
566
|
-
if (type === "page") return "Pages";
|
|
567
|
-
return type.charAt(0).toUpperCase() + type.slice(1);
|
|
568
|
-
}
|
|
569
|
-
function CommandPaletteApp(props) {
|
|
570
|
-
const {
|
|
571
|
-
records = [],
|
|
572
|
-
loading = false,
|
|
573
|
-
open: controlledOpen,
|
|
574
|
-
onOpenChange,
|
|
575
|
-
onSelect = () => {
|
|
576
|
-
},
|
|
577
|
-
config = {}
|
|
578
|
-
} = props || {};
|
|
579
|
-
const {
|
|
580
|
-
placeholder = "Search\u2026",
|
|
581
|
-
hotkey = "mod+k",
|
|
582
|
-
maxResults = 8,
|
|
583
|
-
groupOrder = ["work", "page"],
|
|
584
|
-
button = true,
|
|
585
|
-
buttonLabel = "Search"
|
|
586
|
-
} = config || {};
|
|
587
|
-
const [open, setOpen] = useState5(!!controlledOpen);
|
|
588
|
-
useEffect5(() => {
|
|
589
|
-
if (typeof controlledOpen === "boolean") setOpen(controlledOpen);
|
|
590
|
-
}, [controlledOpen]);
|
|
591
|
-
const setOpenBoth = (v) => {
|
|
592
|
-
setOpen(!!v);
|
|
593
|
-
if (onOpenChange) onOpenChange(!!v);
|
|
594
|
-
};
|
|
595
|
-
const [q, setQ] = useState5("");
|
|
596
|
-
useEffect5(() => {
|
|
597
|
-
function handler(e) {
|
|
598
|
-
try {
|
|
599
|
-
const hk = String(hotkey || "mod+k").toLowerCase();
|
|
600
|
-
const isMod = hk.includes("mod+");
|
|
601
|
-
const key = hk.split("+").pop();
|
|
602
|
-
if ((isMod ? e.metaKey || e.ctrlKey : true) && e.key.toLowerCase() === String(key || "k")) {
|
|
603
|
-
e.preventDefault();
|
|
604
|
-
setOpenBoth(true);
|
|
605
|
-
}
|
|
606
|
-
} catch (e2) {
|
|
607
|
-
}
|
|
608
|
-
}
|
|
609
|
-
document.addEventListener("keydown", handler);
|
|
610
|
-
return () => document.removeEventListener("keydown", handler);
|
|
611
|
-
}, [hotkey]);
|
|
612
|
-
useEffect5(() => {
|
|
613
|
-
function onKey(e) {
|
|
614
|
-
if (e.key === "Escape") setOpenBoth(false);
|
|
615
|
-
}
|
|
616
|
-
document.addEventListener("keydown", onKey);
|
|
617
|
-
return () => document.removeEventListener("keydown", onKey);
|
|
618
|
-
}, []);
|
|
619
|
-
const results = useMemo2(() => {
|
|
620
|
-
if (!q) return [];
|
|
621
|
-
const qq = normalize(q);
|
|
622
|
-
const out = [];
|
|
623
|
-
for (const r of records || []) {
|
|
624
|
-
const title = String(r && r.title || "");
|
|
625
|
-
if (!title) continue;
|
|
626
|
-
if (normalize(title).includes(qq)) out.push(r);
|
|
627
|
-
if (out.length >= Math.max(1, Number(maxResults) || 8)) break;
|
|
628
|
-
}
|
|
629
|
-
return out;
|
|
630
|
-
}, [q, records, maxResults]);
|
|
631
|
-
const grouped = useMemo2(() => {
|
|
632
|
-
const map = /* @__PURE__ */ new Map();
|
|
633
|
-
for (const r of results) {
|
|
634
|
-
const t = String(r && r.type || "page");
|
|
635
|
-
if (!map.has(t)) map.set(t, []);
|
|
636
|
-
map.get(t).push(r);
|
|
637
|
-
}
|
|
638
|
-
return map;
|
|
639
|
-
}, [results]);
|
|
640
|
-
const onOverlayMouseDown = (e) => {
|
|
641
|
-
if (e.target === e.currentTarget) setOpenBoth(false);
|
|
642
|
-
};
|
|
643
|
-
const onItemSelect = (href) => {
|
|
644
|
-
try {
|
|
645
|
-
onSelect(String(href || ""));
|
|
646
|
-
setOpenBoth(false);
|
|
647
|
-
} catch (e) {
|
|
648
|
-
}
|
|
649
|
-
};
|
|
650
|
-
return /* @__PURE__ */ React16.createElement("div", { className: "canopy-cmdk" }, button && /* @__PURE__ */ React16.createElement(
|
|
651
|
-
"button",
|
|
652
|
-
{
|
|
653
|
-
type: "button",
|
|
654
|
-
className: "canopy-cmdk__trigger",
|
|
655
|
-
onClick: () => setOpenBoth(true),
|
|
656
|
-
"aria-label": "Open search",
|
|
657
|
-
"data-canopy-command-trigger": true
|
|
658
|
-
},
|
|
659
|
-
/* @__PURE__ */ React16.createElement("span", { "aria-hidden": true }, "\u2318K"),
|
|
660
|
-
/* @__PURE__ */ React16.createElement("span", { className: "sr-only" }, buttonLabel)
|
|
661
|
-
), /* @__PURE__ */ React16.createElement(
|
|
662
|
-
"div",
|
|
663
|
-
{
|
|
664
|
-
className: "canopy-cmdk__overlay",
|
|
665
|
-
"data-open": open ? "1" : "0",
|
|
666
|
-
onMouseDown: onOverlayMouseDown,
|
|
667
|
-
style: { display: open ? "flex" : "none" }
|
|
668
|
-
},
|
|
669
|
-
/* @__PURE__ */ React16.createElement("div", { className: "canopy-cmdk__panel" }, /* @__PURE__ */ React16.createElement("button", { className: "canopy-cmdk__close", "aria-label": "Close", onClick: () => setOpenBoth(false) }, "\xD7"), /* @__PURE__ */ React16.createElement("div", { className: "canopy-cmdk__inputWrap" }, /* @__PURE__ */ React16.createElement(Command, null, /* @__PURE__ */ React16.createElement(Command.Input, { autoFocus: true, value: q, onValueChange: setQ, placeholder, className: "canopy-cmdk__input" }), /* @__PURE__ */ React16.createElement(Command.List, { className: "canopy-cmdk__list" }, loading && /* @__PURE__ */ React16.createElement(Command.Loading, null, "Hang on\u2026"), /* @__PURE__ */ React16.createElement(Command.Empty, null, "No results found."), (Array.isArray(groupOrder) ? groupOrder : []).map((t) => grouped.has(t) ? /* @__PURE__ */ React16.createElement(Command.Group, { key: t, heading: groupLabel(t) }, grouped.get(t).map((r, i) => /* @__PURE__ */ React16.createElement(Command.Item, { key: t + "-" + i, onSelect: () => onItemSelect(r.href) }, /* @__PURE__ */ React16.createElement("div", { className: "canopy-cmdk__item" }, String(r.type || "") === "work" && r.thumbnail ? /* @__PURE__ */ React16.createElement("img", { className: "canopy-cmdk__thumb", src: r.thumbnail, alt: "" }) : null, /* @__PURE__ */ React16.createElement("span", { className: "canopy-cmdk__title" }, r.title))))) : null), Array.from(grouped.keys()).filter((t) => !(groupOrder || []).includes(t)).map((t) => /* @__PURE__ */ React16.createElement(Command.Group, { key: t, heading: groupLabel(t) }, grouped.get(t).map((r, i) => /* @__PURE__ */ React16.createElement(Command.Item, { key: t + "-x-" + i, onSelect: () => onItemSelect(r.href) }, /* @__PURE__ */ React16.createElement("div", { className: "canopy-cmdk__item" }, String(r.type || "") === "work" && r.thumbnail ? /* @__PURE__ */ React16.createElement("img", { className: "canopy-cmdk__thumb", src: r.thumbnail, alt: "" }) : null, /* @__PURE__ */ React16.createElement("span", { className: "canopy-cmdk__title" }, r.title))))))))))
|
|
670
|
-
));
|
|
671
|
-
}
|
|
672
552
|
export {
|
|
673
553
|
Card,
|
|
674
554
|
MdxCommandPalette as CommandPalette,
|
|
675
|
-
CommandPaletteApp,
|
|
676
555
|
Fallback,
|
|
677
556
|
Grid,
|
|
678
557
|
GridItem,
|
package/ui/dist/index.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/Fallback.jsx", "../src/HelloWorld.jsx", "../src/layout/Card.jsx", "../src/layout/Grid.jsx", "../src/iiif/Viewer.jsx", "../src/iiif/Slider.jsx", "../src/iiif/MdxRelatedItems.jsx", "../src/search/MdxSearchForm.jsx", "../src/search/MdxSearchResults.jsx", "../src/search/SearchSummary.jsx", "../src/search/SearchTotal.jsx", "../src/search/SearchForm.jsx", "../src/search/SearchResults.jsx", "../src/search/useSearch.js", "../src/search/Search.jsx", "../src/command/MdxCommandPalette.jsx"
|
|
4
|
-
"sourcesContent": ["import React from 'react';\n\nexport function Fallback({ name, ...props }) {\n const style = {\n padding: '0.75rem 1rem',\n border: '1px dashed #d1d5db',\n color: '#6b7280',\n borderRadius: 6,\n background: '#f9fafb',\n fontSize: 14,\n };\n return (\n <div style={style} data-fallback-component={name || 'Unknown'}>\n <strong>{name || 'Unknown component'}</strong> not available in UI.\n </div>\n );\n}\n\n", "import React from \"react\";\n\nexport const HelloWorld = () => {\n return <div>Hello, World!</div>;\n};\n", "import React, { useEffect, useRef, useState } from \"react\";\n\n/**\n * Card\n *\n * Renders an anchor wrapping a figure with an image and caption.\n * Minimal styling; consumers can override via className/style.\n *\n * Props:\n * - href: string (required) \u2014 link target\n * - src: string (optional) \u2014 image source\n * - alt: string (optional) \u2014 image alt text (falls back to title)\n * - title: string (optional) \u2014 primary caption text\n * - subtitle: string (optional) \u2014 secondary caption text\n * - className: string (optional)\n * - style: object (optional)\n * - children: ReactNode (optional) \u2014 appended inside figcaption\n */\nexport default function Card({\n href,\n src,\n alt,\n title,\n subtitle,\n // Optional intrinsic dimensions or aspect ratio to compute a responsive height\n imgWidth,\n imgHeight,\n aspectRatio,\n className,\n style,\n children,\n ...rest\n}) {\n const containerRef = useRef(null);\n const [inView, setInView] = useState(false);\n const [imageLoaded, setImageLoaded] = useState(false);\n\n /**\n * Use IntersectionObserver to detect when the card enters the viewport.\n * When in view, setInView(true) to trigger image loading.\n * If IntersectionObserver is not supported, default to inView=true.\n */\n useEffect(() => {\n if (!containerRef.current) return;\n if (typeof IntersectionObserver !== \"function\") {\n setInView(true);\n return;\n }\n const el = containerRef.current;\n const obs = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n setInView(true);\n try {\n obs.unobserve(el);\n } catch (_) {}\n break;\n }\n }\n },\n { root: null, rootMargin: \"100px\", threshold: 0.1 }\n );\n try {\n obs.observe(el);\n } catch (_) {}\n return () => {\n try {\n obs.disconnect();\n } catch (_) {}\n };\n }, []);\n\n /**\n * Calculate aspect ratio and padding percent for responsive image container.\n */\n const w = Number(imgWidth);\n const h = Number(imgHeight);\n const ratio =\n Number.isFinite(Number(aspectRatio)) && Number(aspectRatio) > 0\n ? Number(aspectRatio)\n : Number.isFinite(w) && w > 0 && Number.isFinite(h) && h > 0\n ? w / h\n : undefined;\n const paddingPercent = ratio ? 100 / ratio : 100;\n\n /**\n * Caption element (figcaption), rendered if title, subtitle, or children are provided.\n */\n const caption = (\n <figcaption>\n {title && <span>{title}</span>}\n {subtitle && <span>{subtitle}</span>}\n {children}\n </figcaption>\n );\n\n return (\n <a\n href={href}\n className={[\"canopy-card\", className].filter(Boolean).join(\" \")}\n style={style}\n ref={containerRef}\n data-aspect-ratio={ratio}\n data-in-view={inView ? \"true\" : \"false\"}\n data-image-loaded={imageLoaded ? \"true\" : \"false\"}\n {...rest}\n >\n <figure>\n {src ? (\n ratio ? (\n <div\n className=\"canopy-card-media\"\n style={{ \"--canopy-card-padding\": `${paddingPercent}%` }}\n >\n {inView ? (\n <img\n src={src}\n alt={alt || title || \"\"}\n loading=\"lazy\"\n onLoad={() => setImageLoaded(true)}\n onError={() => setImageLoaded(true)}\n />\n ) : null}\n </div>\n ) : (\n <img\n src={src}\n alt={alt || title || \"\"}\n loading=\"lazy\"\n onLoad={() => setImageLoaded(true)}\n onError={() => setImageLoaded(true)}\n className=\"canopy-card-image\"\n />\n )\n ) : null}\n {caption}\n </figure>\n </a>\n );\n}\n", "import Masonry from \"react-masonry-css\";\nimport React from \"react\";\n\n// Simple item wrapper to provide consistent spacing between items.\nexport function GridItem({ children, className = \"\", style = {}, ...rest }) {\n return (\n <div\n className={`canopy-grid-item ${className}`.trim()}\n style={style}\n {...rest}\n >\n {children}\n </div>\n );\n}\n\n/**\n * Grid (Masonry)\n *\n * Lightweight wrapper around `react-masonry-css` with sensible defaults\n * and inline styles so it works without a global CSS pipeline.\n *\n * Props:\n * - breakpointCols: number | object \u2014 columns per breakpoint (react-masonry-css prop)\n * - gap: CSS length string \u2014 spacing between items/columns (default '1rem')\n * - paddingY: CSS length string \u2014 vertical padding for the grid (default '0')\n * - className, style \u2014 forwarded to container\n * - columnClassName \u2014 forwarded to Masonry (defaults to 'canopy-grid-column')\n * - children \u2014 usually a list of <GridItem> elements\n */\nexport default function Grid({\n breakpointCols,\n gap = \"2rem\",\n paddingY = \"0\",\n className = \"\",\n style = {},\n columnClassName = \"canopy-grid-column\",\n children,\n ...rest\n}) {\n const cols = breakpointCols || {\n default: 6,\n 1280: 5,\n 1024: 4,\n 768: 3,\n 640: 2,\n };\n const vars = { \"--grid-gap\": gap, \"--grid-padding-y\": paddingY };\n\n return (\n <div className=\"canopy-grid-wrap\">\n {/* Scoped styles so the component works standalone */}\n <style\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{\n __html: `\n .canopy-grid { display: flex; width: auto; position: relative; padding: var(--grid-padding-y, 0) 0; z-index: 1; }\n .canopy-grid .${columnClassName} { margin-left: var(--grid-gap, 1rem); }\n .canopy-grid .${columnClassName}:first-child { margin-left: 0; }\n .canopy-grid-item { margin-bottom: var(--grid-gap, 1rem); }\n `,\n }}\n />\n <Masonry\n breakpointCols={cols}\n className={`canopy-grid ${className}`.trim()}\n columnClassName={columnClassName}\n style={{ ...vars, ...style }}\n {...rest}\n >\n {children}\n </Masonry>\n </div>\n );\n}\n", "import React, { useEffect, useState } from \"react\";\n\n// SSR-safe wrapper around Clover's viewer. Clover touches the DOM at import time,\n// so we dynamically import it only in the browser.\n\n// Default Clover viewer options; can be overridden per-usage via props.options\nconst DEFAULT_VIEWER_OPTIONS = {\n showDownload: false,\n showIIIFBadge: false,\n showTitle: false,\n informationPanel: {\n open: false,\n renderAbout: false,\n renderToggle: false,\n },\n};\n\nfunction isPlainObject(val) {\n return val && typeof val === \"object\" && !Array.isArray(val);\n}\n\nfunction deepMerge(base, override) {\n if (!isPlainObject(base)) return override;\n const out = { ...base };\n if (!isPlainObject(override)) return out;\n for (const key of Object.keys(override)) {\n const a = base[key];\n const b = override[key];\n if (isPlainObject(a) && isPlainObject(b)) out[key] = deepMerge(a, b);\n else out[key] = b;\n }\n return out;\n}\n\nexport const Viewer = (props) => {\n const [CloverViewer, setCloverViewer] = useState(null);\n const mergedOptions = deepMerge(\n DEFAULT_VIEWER_OPTIONS,\n props && props.options\n );\n\n useEffect(() => {\n let mounted = true;\n const canUseDom =\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\n if (canUseDom) {\n import(\"@samvera/clover-iiif/viewer\")\n .then((mod) => {\n if (!mounted) return;\n // Loaded Clover viewer dynamically in the browser\n const Comp = mod && (mod.default || mod.Viewer || mod);\n setCloverViewer(() => Comp);\n })\n .catch(() => {\n // Silently ignore load errors on the server or if Clover is unavailable\n });\n }\n return () => {\n mounted = false;\n };\n }, []);\n\n if (!CloverViewer) {\n // SSR placeholder for client hydration; props provided as JSON\n let json = \"{}\";\n try {\n const p = { ...(props || {}) };\n if (mergedOptions) p.options = mergedOptions;\n json = JSON.stringify(p);\n } catch (_) {\n json = \"{}\";\n }\n return (\n <div data-canopy-viewer=\"1\" className=\"not-prose\">\n <script\n type=\"application/json\"\n dangerouslySetInnerHTML={{ __html: json }}\n />\n </div>\n );\n }\n return <CloverViewer {...props} options={mergedOptions} />;\n};\n", "import React, { useEffect, useState } from \"react\";\n\n// SSR-safe wrapper around Clover's slider. Clover touches the DOM at import time,\n// so we dynamically import it only in the browser.\nexport const Slider = (props) => {\n const [CloverSlider, setCloverSlider] = useState(null);\n\n useEffect(() => {\n let mounted = true;\n const canUseDom =\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\n if (canUseDom) {\n import(\"@samvera/clover-iiif/slider\")\n .then((mod) => {\n if (!mounted) return;\n console.log(mod);\n const Comp = mod && (mod.default || mod.Slider || mod);\n setCloverSlider(() => Comp);\n })\n .catch(() => {\n // Silently ignore load errors on the server or if Clover is unavailable\n });\n }\n return () => {\n mounted = false;\n };\n }, []);\n\n if (!CloverSlider) {\n // SSR placeholder for client hydration; props provided as JSON\n let json = \"{}\";\n try {\n json = JSON.stringify(props || {});\n } catch (_) {\n json = \"{}\";\n }\n return (\n <div data-canopy-slider=\"1\" className=\"not-prose\">\n <script\n type=\"application/json\"\n dangerouslySetInnerHTML={{ __html: json }}\n />\n </div>\n );\n }\n return <CloverSlider {...props} />;\n};\n", "import React from 'react';\n\n// SSR-safe placeholder for RelatedItems. Hydrated by canopy-related-items.js + canopy-slider.js\nexport default function MdxRelatedItems(props) {\n let json = '{}';\n try {\n json = JSON.stringify(props || {});\n } catch (_) {\n json = '{}';\n }\n return (\n <div data-canopy-related-items=\"1\" className=\"not-prose\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n", "import React from 'react';\n\nexport default function MdxSearchForm(props) {\n let json = '{}';\n try { json = JSON.stringify(props || {}); } catch (_) { json = '{}'; }\n return (\n <div data-canopy-search-form=\"1\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n\n", "import React from 'react';\n\nexport default function MdxSearchResults(props) {\n let json = '{}';\n try { json = JSON.stringify(props || {}); } catch (_) { json = '{}'; }\n return (\n <div data-canopy-search-results=\"1\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n\n", "import React from 'react';\n\nexport default function SearchSummary(props) {\n let json = '{}';\n try { json = JSON.stringify(props || {}); } catch (_) { json = '{}'; }\n return (\n <div data-canopy-search-summary=\"1\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n\n", "import React from 'react';\n\nexport default function SearchTotal(props) {\n let json = '{}';\n try { json = JSON.stringify(props || {}); } catch (_) { json = '{}'; }\n return (\n <div data-canopy-search-total=\"1\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n\n", "import React from 'react';\n\nexport default function SearchForm({ query, onQueryChange, type = 'all', onTypeChange, types = [], counts = {} }) {\n const orderedTypes = Array.isArray(types) ? types : [];\n const toLabel = (t) => (t && t.length ? t.charAt(0).toUpperCase() + t.slice(1) : '');\n return (\n <form onSubmit={(e) => e.preventDefault()} className=\"space-y-3\">\n <input\n id=\"search-input\"\n type=\"search\"\n value={query}\n placeholder=\"Type to search\u2026\"\n onChange={(e) => onQueryChange && onQueryChange(e.target.value)}\n className=\"w-full px-3 py-2 border border-slate-300 rounded-md focus:outline-none focus:ring-2 focus:ring-brand-500 focus:border-brand-500\"\n />\n <div role=\"tablist\" aria-label=\"Search types\" className=\"flex items-center gap-2 border-b border-slate-200\">\n {orderedTypes.map((t) => {\n const active = String(type).toLowerCase() === String(t).toLowerCase();\n const cRaw = (counts && Object.prototype.hasOwnProperty.call(counts, t)) ? counts[t] : undefined;\n const c = Number.isFinite(Number(cRaw)) ? Number(cRaw) : 0;\n return (\n <button\n key={t}\n role=\"tab\"\n aria-selected={active}\n type=\"button\"\n onClick={() => onTypeChange && onTypeChange(t)}\n className={\n 'px-3 py-1.5 text-sm rounded-t-md border-b-2 -mb-px transition-colors ' +\n (active\n ? 'border-brand-600 text-brand-700'\n : 'border-transparent text-slate-600 hover:text-slate-900 hover:border-slate-300')\n }\n >\n {toLabel(t)} ({c})\n </button>\n );\n })}\n </div>\n </form>\n );\n}\n", "import Grid, { GridItem } from \"../layout/Grid.jsx\";\n\nimport Card from \"../layout/Card.jsx\";\nimport React from \"react\";\n\nexport default function SearchResults({\n results = [],\n type = \"all\",\n layout = \"grid\",\n}) {\n if (!results.length) {\n return (\n <div className=\"text-slate-600\">\n <em>No results</em>\n </div>\n );\n }\n\n if (layout === \"list\") {\n return (\n <ul id=\"search-results\" className=\"space-y-3\">\n {results.map((r, i) => {\n const hasDims =\n Number.isFinite(Number(r.thumbnailWidth)) &&\n Number(r.thumbnailWidth) > 0 &&\n Number.isFinite(Number(r.thumbnailHeight)) &&\n Number(r.thumbnailHeight) > 0;\n const aspect = hasDims\n ? Number(r.thumbnailWidth) / Number(r.thumbnailHeight)\n : undefined;\n return (\n <li\n key={i}\n className={`search-result ${r.type}`}\n data-thumbnail-aspect-ratio={aspect}\n >\n <Card\n href={r.href}\n title={r.title || r.href}\n src={r.type === \"work\" ? r.thumbnail : undefined}\n imgWidth={r.thumbnailWidth}\n imgHeight={r.thumbnailHeight}\n aspectRatio={aspect}\n />\n </li>\n );\n })}\n </ul>\n );\n }\n\n // Default: grid (masonry)\n return (\n <div id=\"search-results\">\n <Grid>\n {results.map((r, i) => {\n const hasDims =\n Number.isFinite(Number(r.thumbnailWidth)) &&\n Number(r.thumbnailWidth) > 0 &&\n Number.isFinite(Number(r.thumbnailHeight)) &&\n Number(r.thumbnailHeight) > 0;\n const aspect = hasDims\n ? Number(r.thumbnailWidth) / Number(r.thumbnailHeight)\n : undefined;\n return (\n <GridItem\n key={i}\n className={`search-result ${r.type}`}\n data-thumbnail-aspect-ratio={aspect}\n >\n <Card\n href={r.href}\n title={r.title || r.href}\n src={r.type === \"work\" ? r.thumbnail : undefined}\n imgWidth={r.thumbnailWidth}\n imgHeight={r.thumbnailHeight}\n aspectRatio={aspect}\n />\n </GridItem>\n );\n })}\n </Grid>\n </div>\n );\n}\n", "import { useEffect, useMemo, useRef, useState } from 'react';\n\n// Minimal search hook using FlexSearch to index titles and filter by type.\n// Usage: const { results, total, loading, types } = useSearch(query, type);\n// - query: string\n// - type: string ('all' | 'work' | 'page' | 'docs' | ...)\n// Returns:\n// - results: array of records { title, href, type, thumbnail? }\n// - total: total records in index\n// - loading: boolean\n// - types: array of available types (sorted)\nexport function useSearch(query, type) {\n const [records, setRecords] = useState([]);\n const [loading, setLoading] = useState(true);\n const indexRef = useRef(null);\n const idToRecRef = useRef([]);\n const [types, setTypes] = useState([]);\n\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n import('flexsearch').then((mod) => {\n const FlexSearch = mod.default || mod;\n return fetch('./search-index.json')\n .then((r) => (r.ok ? r.json() : []))\n .catch(() => [])\n .then((data) => {\n if (cancelled) return;\n const idx = new FlexSearch.Index({ tokenize: 'forward' });\n const idToRec = [];\n data.forEach((rec, i) => {\n try {\n idx.add(i, rec && rec.title ? String(rec.title) : '');\n } catch (_) {}\n idToRec[i] = rec || {};\n });\n const ts = Array.from(\n new Set(data.map((r) => String((r && r.type) || 'page')))\n );\n const order = ['work', 'docs', 'page'];\n ts.sort((a, b) => {\n const ia = order.indexOf(a);\n const ib = order.indexOf(b);\n return (ia < 0 ? 99 : ia) - (ib < 0 ? 99 : ib) || a.localeCompare(b);\n });\n indexRef.current = idx;\n idToRecRef.current = idToRec;\n setRecords(data);\n setTypes(ts);\n setLoading(false);\n });\n });\n return () => {\n cancelled = true;\n };\n }, []);\n\n const results = useMemo(() => {\n const all = idToRecRef.current;\n if (!all || !all.length) return [];\n const t = String(type || 'all').toLowerCase();\n if (!query) {\n return all.filter((r) => (t === 'all' ? true : String(r.type).toLowerCase() === t));\n }\n let ids = [];\n try {\n ids = (indexRef.current && indexRef.current.search(query, { limit: 200 })) || [];\n } catch (_) {\n ids = [];\n }\n const out = [];\n for (const id of Array.isArray(ids) ? ids : []) {\n const rec = all[id];\n if (!rec) continue;\n if (t !== 'all' && String(rec.type).toLowerCase() !== t) continue;\n out.push(rec);\n }\n return out;\n }, [query, type, records]);\n\n return { results, total: records.length || 0, loading, types };\n}\n\n", "import React from \"react\";\n\n// SSR-friendly placeholder for the React Search app.\n// The actual app mounts from site/search.js into this element.\nexport default function Search(props) {\n let json = \"{}\";\n try {\n json = JSON.stringify(props || {});\n } catch (_) {\n json = \"{}\";\n }\n return (\n <div data-canopy-search=\"1\" className=\"not-prose\">\n <script\n type=\"application/json\"\n dangerouslySetInnerHTML={{ __html: json }}\n />\n </div>\n );\n}\n", "import React from 'react';\n\n// SSR-safe placeholder for the command palette. The real UI mounts client-side.\nexport default function MdxCommandPalette(props = {}) {\n const {\n placeholder = 'Search\u2026',\n hotkey = 'mod+k',\n maxResults = 8,\n groupOrder = ['work', 'page'],\n button = true,\n buttonLabel = 'Search',\n } = props || {};\n\n const data = { placeholder, hotkey, maxResults, groupOrder };\n return (\n <div data-canopy-command>\n {/* Optional trigger button shown in the header layout */}\n {button && (\n <button\n type=\"button\"\n data-canopy-command-trigger\n className=\"inline-flex items-center gap-1 px-2 py-1 rounded border border-slate-300 text-slate-700 hover:bg-slate-50\"\n aria-label=\"Open search\"\n >\n <span aria-hidden>\u2318K</span>\n <span className=\"sr-only\">{buttonLabel}</span>\n </button>\n )}\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: JSON.stringify(data) }} />\n </div>\n );\n}\n\n", "import React, { useEffect, useMemo, useState } from 'react';\nimport { Command } from 'cmdk';\n\nfunction normalize(s) {\n try { return String(s || '').toLowerCase(); } catch { return ''; }\n}\n\nfunction groupLabel(t) {\n const type = String(t || '').toLowerCase();\n if (type === 'work') return 'Works';\n if (type === 'page') return 'Pages';\n return type.charAt(0).toUpperCase() + type.slice(1);\n}\n\nexport default function CommandPaletteApp(props) {\n const {\n records = [],\n loading = false,\n open: controlledOpen,\n onOpenChange,\n onSelect = () => {},\n config = {},\n } = props || {};\n const {\n placeholder = 'Search\u2026',\n hotkey = 'mod+k',\n maxResults = 8,\n groupOrder = ['work', 'page'],\n button = true,\n buttonLabel = 'Search',\n } = config || {};\n\n const [open, setOpen] = useState(!!controlledOpen);\n useEffect(() => { if (typeof controlledOpen === 'boolean') setOpen(controlledOpen); }, [controlledOpen]);\n const setOpenBoth = (v) => { setOpen(!!v); if (onOpenChange) onOpenChange(!!v); };\n\n const [q, setQ] = useState('');\n // Hotkey open\n useEffect(() => {\n function handler(e) {\n try {\n const hk = String(hotkey || 'mod+k').toLowerCase();\n const isMod = hk.includes('mod+');\n const key = hk.split('+').pop();\n if ((isMod ? (e.metaKey || e.ctrlKey) : true) && e.key.toLowerCase() === String(key || 'k')) {\n e.preventDefault();\n setOpenBoth(true);\n }\n } catch {}\n }\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [hotkey]);\n // Esc close\n useEffect(() => {\n function onKey(e) { if (e.key === 'Escape') setOpenBoth(false); }\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, []);\n\n const results = useMemo(() => {\n if (!q) return [];\n const qq = normalize(q);\n const out = [];\n for (const r of (records || [])) {\n const title = String(r && r.title || '');\n if (!title) continue;\n if (normalize(title).includes(qq)) out.push(r);\n if (out.length >= Math.max(1, Number(maxResults) || 8)) break;\n }\n return out;\n }, [q, records, maxResults]);\n\n const grouped = useMemo(() => {\n const map = new Map();\n for (const r of results) { const t = String(r && r.type || 'page'); if (!map.has(t)) map.set(t, []); map.get(t).push(r); }\n return map;\n }, [results]);\n\n const onOverlayMouseDown = (e) => { if (e.target === e.currentTarget) setOpenBoth(false); };\n const onItemSelect = (href) => { try { onSelect(String(href || '')); setOpenBoth(false); } catch {} };\n\n return (\n <div className=\"canopy-cmdk\">\n {button && (\n <button\n type=\"button\"\n className=\"canopy-cmdk__trigger\"\n onClick={() => setOpenBoth(true)}\n aria-label=\"Open search\"\n data-canopy-command-trigger\n >\n <span aria-hidden>\u2318K</span>\n <span className=\"sr-only\">{buttonLabel}</span>\n </button>\n )}\n\n <div\n className=\"canopy-cmdk__overlay\"\n data-open={open ? '1' : '0'}\n onMouseDown={onOverlayMouseDown}\n style={{ display: open ? 'flex' : 'none' }}\n >\n <div className=\"canopy-cmdk__panel\">\n <button className=\"canopy-cmdk__close\" aria-label=\"Close\" onClick={() => setOpenBoth(false)}>×</button>\n <div className=\"canopy-cmdk__inputWrap\">\n <Command>\n <Command.Input autoFocus value={q} onValueChange={setQ} placeholder={placeholder} className=\"canopy-cmdk__input\" />\n <Command.List className=\"canopy-cmdk__list\">\n {loading && <Command.Loading>Hang on\u2026</Command.Loading>}\n <Command.Empty>No results found.</Command.Empty>\n {(Array.isArray(groupOrder) ? groupOrder : []).map((t) => (\n grouped.has(t) ? (\n <Command.Group key={t} heading={groupLabel(t)}>\n {grouped.get(t).map((r, i) => (\n <Command.Item key={t + '-' + i} onSelect={() => onItemSelect(r.href)}>\n <div className=\"canopy-cmdk__item\">\n {String(r.type || '') === 'work' && r.thumbnail ? (\n <img className=\"canopy-cmdk__thumb\" src={r.thumbnail} alt=\"\" />\n ) : null}\n <span className=\"canopy-cmdk__title\">{r.title}</span>\n </div>\n </Command.Item>\n ))}\n </Command.Group>\n ) : null\n ))}\n {Array.from(grouped.keys())\n .filter((t) => !(groupOrder || []).includes(t))\n .map((t) => (\n <Command.Group key={t} heading={groupLabel(t)}>\n {grouped.get(t).map((r, i) => (\n <Command.Item key={t + '-x-' + i} onSelect={() => onItemSelect(r.href)}>\n <div className=\"canopy-cmdk__item\">\n {String(r.type || '') === 'work' && r.thumbnail ? (\n <img className=\"canopy-cmdk__thumb\" src={r.thumbnail} alt=\"\" />\n ) : null}\n <span className=\"canopy-cmdk__title\">{r.title}</span>\n </div>\n </Command.Item>\n ))}\n </Command.Group>\n ))}\n </Command.List>\n </Command>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["React", "React", "React", "React", "useEffect", "useState", "React", "useEffect", "useState", "React", "React", "React", "React", "React", "React", "React", "useEffect", "useRef", "useState", "React", "React"
|
|
3
|
+
"sources": ["../src/Fallback.jsx", "../src/HelloWorld.jsx", "../src/layout/Card.jsx", "../src/layout/Grid.jsx", "../src/iiif/Viewer.jsx", "../src/iiif/Slider.jsx", "../src/iiif/MdxRelatedItems.jsx", "../src/search/MdxSearchForm.jsx", "../src/search/MdxSearchResults.jsx", "../src/search/SearchSummary.jsx", "../src/search/SearchTotal.jsx", "../src/search/SearchForm.jsx", "../src/search/SearchResults.jsx", "../src/search/useSearch.js", "../src/search/Search.jsx", "../src/command/MdxCommandPalette.jsx"],
|
|
4
|
+
"sourcesContent": ["import React from 'react';\n\nexport function Fallback({ name, ...props }) {\n const style = {\n padding: '0.75rem 1rem',\n border: '1px dashed #d1d5db',\n color: '#6b7280',\n borderRadius: 6,\n background: '#f9fafb',\n fontSize: 14,\n };\n return (\n <div style={style} data-fallback-component={name || 'Unknown'}>\n <strong>{name || 'Unknown component'}</strong> not available in UI.\n </div>\n );\n}\n\n", "import React from \"react\";\n\nexport const HelloWorld = () => {\n return <div>Hello, World!</div>;\n};\n", "import React, { useEffect, useRef, useState } from \"react\";\n\n/**\n * Card\n *\n * Renders an anchor wrapping a figure with an image and caption.\n * Minimal styling; consumers can override via className/style.\n *\n * Props:\n * - href: string (required) \u2014 link target\n * - src: string (optional) \u2014 image source\n * - alt: string (optional) \u2014 image alt text (falls back to title)\n * - title: string (optional) \u2014 primary caption text\n * - subtitle: string (optional) \u2014 secondary caption text\n * - className: string (optional)\n * - style: object (optional)\n * - children: ReactNode (optional) \u2014 appended inside figcaption\n */\nexport default function Card({\n href,\n src,\n alt,\n title,\n subtitle,\n // Optional intrinsic dimensions or aspect ratio to compute a responsive height\n imgWidth,\n imgHeight,\n aspectRatio,\n className,\n style,\n children,\n ...rest\n}) {\n const containerRef = useRef(null);\n const [inView, setInView] = useState(false);\n const [imageLoaded, setImageLoaded] = useState(false);\n\n /**\n * Use IntersectionObserver to detect when the card enters the viewport.\n * When in view, setInView(true) to trigger image loading.\n * If IntersectionObserver is not supported, default to inView=true.\n */\n useEffect(() => {\n if (!containerRef.current) return;\n if (typeof IntersectionObserver !== \"function\") {\n setInView(true);\n return;\n }\n const el = containerRef.current;\n const obs = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n setInView(true);\n try {\n obs.unobserve(el);\n } catch (_) {}\n break;\n }\n }\n },\n { root: null, rootMargin: \"100px\", threshold: 0.1 }\n );\n try {\n obs.observe(el);\n } catch (_) {}\n return () => {\n try {\n obs.disconnect();\n } catch (_) {}\n };\n }, []);\n\n /**\n * Calculate aspect ratio and padding percent for responsive image container.\n */\n const w = Number(imgWidth);\n const h = Number(imgHeight);\n const ratio =\n Number.isFinite(Number(aspectRatio)) && Number(aspectRatio) > 0\n ? Number(aspectRatio)\n : Number.isFinite(w) && w > 0 && Number.isFinite(h) && h > 0\n ? w / h\n : undefined;\n const paddingPercent = ratio ? 100 / ratio : 100;\n\n /**\n * Caption element (figcaption), rendered if title, subtitle, or children are provided.\n */\n const caption = (\n <figcaption>\n {title && <span>{title}</span>}\n {subtitle && <span>{subtitle}</span>}\n {children}\n </figcaption>\n );\n\n return (\n <a\n href={href}\n className={[\"canopy-card\", className].filter(Boolean).join(\" \")}\n style={style}\n ref={containerRef}\n data-aspect-ratio={ratio}\n data-in-view={inView ? \"true\" : \"false\"}\n data-image-loaded={imageLoaded ? \"true\" : \"false\"}\n {...rest}\n >\n <figure>\n {src ? (\n ratio ? (\n <div\n className=\"canopy-card-media\"\n style={{ \"--canopy-card-padding\": `${paddingPercent}%` }}\n >\n {inView ? (\n <img\n src={src}\n alt={alt || title || \"\"}\n loading=\"lazy\"\n onLoad={() => setImageLoaded(true)}\n onError={() => setImageLoaded(true)}\n />\n ) : null}\n </div>\n ) : (\n <img\n src={src}\n alt={alt || title || \"\"}\n loading=\"lazy\"\n onLoad={() => setImageLoaded(true)}\n onError={() => setImageLoaded(true)}\n className=\"canopy-card-image\"\n />\n )\n ) : null}\n {caption}\n </figure>\n </a>\n );\n}\n", "import Masonry from \"react-masonry-css\";\nimport React from \"react\";\n\n// Simple item wrapper to provide consistent spacing between items.\nexport function GridItem({ children, className = \"\", style = {}, ...rest }) {\n return (\n <div\n className={`canopy-grid-item ${className}`.trim()}\n style={style}\n {...rest}\n >\n {children}\n </div>\n );\n}\n\n/**\n * Grid (Masonry)\n *\n * Lightweight wrapper around `react-masonry-css` with sensible defaults\n * and inline styles so it works without a global CSS pipeline.\n *\n * Props:\n * - breakpointCols: number | object \u2014 columns per breakpoint (react-masonry-css prop)\n * - gap: CSS length string \u2014 spacing between items/columns (default '1rem')\n * - paddingY: CSS length string \u2014 vertical padding for the grid (default '0')\n * - className, style \u2014 forwarded to container\n * - columnClassName \u2014 forwarded to Masonry (defaults to 'canopy-grid-column')\n * - children \u2014 usually a list of <GridItem> elements\n */\nexport default function Grid({\n breakpointCols,\n gap = \"2rem\",\n paddingY = \"0\",\n className = \"\",\n style = {},\n columnClassName = \"canopy-grid-column\",\n children,\n ...rest\n}) {\n const cols = breakpointCols || {\n default: 6,\n 1280: 5,\n 1024: 4,\n 768: 3,\n 640: 2,\n };\n const vars = { \"--grid-gap\": gap, \"--grid-padding-y\": paddingY };\n\n return (\n <div className=\"canopy-grid-wrap\">\n {/* Scoped styles so the component works standalone */}\n <style\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{\n __html: `\n .canopy-grid { display: flex; width: auto; position: relative; padding: var(--grid-padding-y, 0) 0; z-index: 1; }\n .canopy-grid .${columnClassName} { margin-left: var(--grid-gap, 1rem); }\n .canopy-grid .${columnClassName}:first-child { margin-left: 0; }\n .canopy-grid-item { margin-bottom: var(--grid-gap, 1rem); }\n `,\n }}\n />\n <Masonry\n breakpointCols={cols}\n className={`canopy-grid ${className}`.trim()}\n columnClassName={columnClassName}\n style={{ ...vars, ...style }}\n {...rest}\n >\n {children}\n </Masonry>\n </div>\n );\n}\n", "import React, { useEffect, useState } from \"react\";\n\n// SSR-safe wrapper around Clover's viewer. Clover touches the DOM at import time,\n// so we dynamically import it only in the browser.\n\n// Default Clover viewer options; can be overridden per-usage via props.options\nconst DEFAULT_VIEWER_OPTIONS = {\n showDownload: false,\n showIIIFBadge: false,\n showTitle: false,\n informationPanel: {\n open: false,\n renderAbout: false,\n renderToggle: false,\n },\n};\n\nfunction isPlainObject(val) {\n return val && typeof val === \"object\" && !Array.isArray(val);\n}\n\nfunction deepMerge(base, override) {\n if (!isPlainObject(base)) return override;\n const out = { ...base };\n if (!isPlainObject(override)) return out;\n for (const key of Object.keys(override)) {\n const a = base[key];\n const b = override[key];\n if (isPlainObject(a) && isPlainObject(b)) out[key] = deepMerge(a, b);\n else out[key] = b;\n }\n return out;\n}\n\nexport const Viewer = (props) => {\n const [CloverViewer, setCloverViewer] = useState(null);\n const mergedOptions = deepMerge(\n DEFAULT_VIEWER_OPTIONS,\n props && props.options\n );\n\n useEffect(() => {\n let mounted = true;\n const canUseDom =\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\n if (canUseDom) {\n import(\"@samvera/clover-iiif/viewer\")\n .then((mod) => {\n if (!mounted) return;\n // Loaded Clover viewer dynamically in the browser\n const Comp = mod && (mod.default || mod.Viewer || mod);\n setCloverViewer(() => Comp);\n })\n .catch(() => {\n // Silently ignore load errors on the server or if Clover is unavailable\n });\n }\n return () => {\n mounted = false;\n };\n }, []);\n\n if (!CloverViewer) {\n // SSR placeholder for client hydration; props provided as JSON\n let json = \"{}\";\n try {\n const p = { ...(props || {}) };\n if (mergedOptions) p.options = mergedOptions;\n json = JSON.stringify(p);\n } catch (_) {\n json = \"{}\";\n }\n return (\n <div data-canopy-viewer=\"1\" className=\"not-prose\">\n <script\n type=\"application/json\"\n dangerouslySetInnerHTML={{ __html: json }}\n />\n </div>\n );\n }\n return <CloverViewer {...props} options={mergedOptions} />;\n};\n", "import React, { useEffect, useState } from \"react\";\n\n// SSR-safe wrapper around Clover's slider. Clover touches the DOM at import time,\n// so we dynamically import it only in the browser.\nexport const Slider = (props) => {\n const [CloverSlider, setCloverSlider] = useState(null);\n\n useEffect(() => {\n let mounted = true;\n const canUseDom =\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\n if (canUseDom) {\n import(\"@samvera/clover-iiif/slider\")\n .then((mod) => {\n if (!mounted) return;\n console.log(mod);\n const Comp = mod && (mod.default || mod.Slider || mod);\n setCloverSlider(() => Comp);\n })\n .catch(() => {\n // Silently ignore load errors on the server or if Clover is unavailable\n });\n }\n return () => {\n mounted = false;\n };\n }, []);\n\n if (!CloverSlider) {\n // SSR placeholder for client hydration; props provided as JSON\n let json = \"{}\";\n try {\n json = JSON.stringify(props || {});\n } catch (_) {\n json = \"{}\";\n }\n return (\n <div data-canopy-slider=\"1\" className=\"not-prose\">\n <script\n type=\"application/json\"\n dangerouslySetInnerHTML={{ __html: json }}\n />\n </div>\n );\n }\n return <CloverSlider {...props} />;\n};\n", "import React from 'react';\n\n// SSR-safe placeholder for RelatedItems. Hydrated by canopy-related-items.js + canopy-slider.js\nexport default function MdxRelatedItems(props) {\n let json = '{}';\n try {\n json = JSON.stringify(props || {});\n } catch (_) {\n json = '{}';\n }\n return (\n <div data-canopy-related-items=\"1\" className=\"not-prose\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n", "import React from 'react';\n\nexport default function MdxSearchForm(props) {\n let json = '{}';\n try { json = JSON.stringify(props || {}); } catch (_) { json = '{}'; }\n return (\n <div data-canopy-search-form=\"1\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n\n", "import React from 'react';\n\nexport default function MdxSearchResults(props) {\n let json = '{}';\n try { json = JSON.stringify(props || {}); } catch (_) { json = '{}'; }\n return (\n <div data-canopy-search-results=\"1\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n\n", "import React from 'react';\n\nexport default function SearchSummary(props) {\n let json = '{}';\n try { json = JSON.stringify(props || {}); } catch (_) { json = '{}'; }\n return (\n <div data-canopy-search-summary=\"1\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n\n", "import React from 'react';\n\nexport default function SearchTotal(props) {\n let json = '{}';\n try { json = JSON.stringify(props || {}); } catch (_) { json = '{}'; }\n return (\n <div data-canopy-search-total=\"1\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n\n", "import React from 'react';\n\nexport default function SearchForm({ query, onQueryChange, type = 'all', onTypeChange, types = [], counts = {} }) {\n const orderedTypes = Array.isArray(types) ? types : [];\n const toLabel = (t) => (t && t.length ? t.charAt(0).toUpperCase() + t.slice(1) : '');\n return (\n <form onSubmit={(e) => e.preventDefault()} className=\"space-y-3\">\n <input\n id=\"search-input\"\n type=\"search\"\n value={query}\n placeholder=\"Type to search\u2026\"\n onChange={(e) => onQueryChange && onQueryChange(e.target.value)}\n className=\"w-full px-3 py-2 border border-slate-300 rounded-md focus:outline-none focus:ring-2 focus:ring-brand-500 focus:border-brand-500\"\n />\n <div role=\"tablist\" aria-label=\"Search types\" className=\"flex items-center gap-2 border-b border-slate-200\">\n {orderedTypes.map((t) => {\n const active = String(type).toLowerCase() === String(t).toLowerCase();\n const cRaw = (counts && Object.prototype.hasOwnProperty.call(counts, t)) ? counts[t] : undefined;\n const c = Number.isFinite(Number(cRaw)) ? Number(cRaw) : 0;\n return (\n <button\n key={t}\n role=\"tab\"\n aria-selected={active}\n type=\"button\"\n onClick={() => onTypeChange && onTypeChange(t)}\n className={\n 'px-3 py-1.5 text-sm rounded-t-md border-b-2 -mb-px transition-colors ' +\n (active\n ? 'border-brand-600 text-brand-700'\n : 'border-transparent text-slate-600 hover:text-slate-900 hover:border-slate-300')\n }\n >\n {toLabel(t)} ({c})\n </button>\n );\n })}\n </div>\n </form>\n );\n}\n", "import Grid, { GridItem } from \"../layout/Grid.jsx\";\n\nimport Card from \"../layout/Card.jsx\";\nimport React from \"react\";\n\nexport default function SearchResults({\n results = [],\n type = \"all\",\n layout = \"grid\",\n}) {\n if (!results.length) {\n return (\n <div className=\"text-slate-600\">\n <em>No results</em>\n </div>\n );\n }\n\n if (layout === \"list\") {\n return (\n <ul id=\"search-results\" className=\"space-y-3\">\n {results.map((r, i) => {\n const hasDims =\n Number.isFinite(Number(r.thumbnailWidth)) &&\n Number(r.thumbnailWidth) > 0 &&\n Number.isFinite(Number(r.thumbnailHeight)) &&\n Number(r.thumbnailHeight) > 0;\n const aspect = hasDims\n ? Number(r.thumbnailWidth) / Number(r.thumbnailHeight)\n : undefined;\n return (\n <li\n key={i}\n className={`search-result ${r.type}`}\n data-thumbnail-aspect-ratio={aspect}\n >\n <Card\n href={r.href}\n title={r.title || r.href}\n src={r.type === \"work\" ? r.thumbnail : undefined}\n imgWidth={r.thumbnailWidth}\n imgHeight={r.thumbnailHeight}\n aspectRatio={aspect}\n />\n </li>\n );\n })}\n </ul>\n );\n }\n\n // Default: grid (masonry)\n return (\n <div id=\"search-results\">\n <Grid>\n {results.map((r, i) => {\n const hasDims =\n Number.isFinite(Number(r.thumbnailWidth)) &&\n Number(r.thumbnailWidth) > 0 &&\n Number.isFinite(Number(r.thumbnailHeight)) &&\n Number(r.thumbnailHeight) > 0;\n const aspect = hasDims\n ? Number(r.thumbnailWidth) / Number(r.thumbnailHeight)\n : undefined;\n return (\n <GridItem\n key={i}\n className={`search-result ${r.type}`}\n data-thumbnail-aspect-ratio={aspect}\n >\n <Card\n href={r.href}\n title={r.title || r.href}\n src={r.type === \"work\" ? r.thumbnail : undefined}\n imgWidth={r.thumbnailWidth}\n imgHeight={r.thumbnailHeight}\n aspectRatio={aspect}\n />\n </GridItem>\n );\n })}\n </Grid>\n </div>\n );\n}\n", "import { useEffect, useMemo, useRef, useState } from 'react';\n\n// Minimal search hook using FlexSearch to index titles and filter by type.\n// Usage: const { results, total, loading, types } = useSearch(query, type);\n// - query: string\n// - type: string ('all' | 'work' | 'page' | 'docs' | ...)\n// Returns:\n// - results: array of records { title, href, type, thumbnail? }\n// - total: total records in index\n// - loading: boolean\n// - types: array of available types (sorted)\nexport function useSearch(query, type) {\n const [records, setRecords] = useState([]);\n const [loading, setLoading] = useState(true);\n const indexRef = useRef(null);\n const idToRecRef = useRef([]);\n const [types, setTypes] = useState([]);\n\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n import('flexsearch').then((mod) => {\n const FlexSearch = mod.default || mod;\n return fetch('./search-index.json')\n .then((r) => (r.ok ? r.json() : []))\n .catch(() => [])\n .then((data) => {\n if (cancelled) return;\n const idx = new FlexSearch.Index({ tokenize: 'forward' });\n const idToRec = [];\n data.forEach((rec, i) => {\n try {\n idx.add(i, rec && rec.title ? String(rec.title) : '');\n } catch (_) {}\n idToRec[i] = rec || {};\n });\n const ts = Array.from(\n new Set(data.map((r) => String((r && r.type) || 'page')))\n );\n const order = ['work', 'docs', 'page'];\n ts.sort((a, b) => {\n const ia = order.indexOf(a);\n const ib = order.indexOf(b);\n return (ia < 0 ? 99 : ia) - (ib < 0 ? 99 : ib) || a.localeCompare(b);\n });\n indexRef.current = idx;\n idToRecRef.current = idToRec;\n setRecords(data);\n setTypes(ts);\n setLoading(false);\n });\n });\n return () => {\n cancelled = true;\n };\n }, []);\n\n const results = useMemo(() => {\n const all = idToRecRef.current;\n if (!all || !all.length) return [];\n const t = String(type || 'all').toLowerCase();\n if (!query) {\n return all.filter((r) => (t === 'all' ? true : String(r.type).toLowerCase() === t));\n }\n let ids = [];\n try {\n ids = (indexRef.current && indexRef.current.search(query, { limit: 200 })) || [];\n } catch (_) {\n ids = [];\n }\n const out = [];\n for (const id of Array.isArray(ids) ? ids : []) {\n const rec = all[id];\n if (!rec) continue;\n if (t !== 'all' && String(rec.type).toLowerCase() !== t) continue;\n out.push(rec);\n }\n return out;\n }, [query, type, records]);\n\n return { results, total: records.length || 0, loading, types };\n}\n\n", "import React from \"react\";\n\n// SSR-friendly placeholder for the React Search app.\n// The actual app mounts from site/search.js into this element.\nexport default function Search(props) {\n let json = \"{}\";\n try {\n json = JSON.stringify(props || {});\n } catch (_) {\n json = \"{}\";\n }\n return (\n <div data-canopy-search=\"1\" className=\"not-prose\">\n <script\n type=\"application/json\"\n dangerouslySetInnerHTML={{ __html: json }}\n />\n </div>\n );\n}\n", "import React from 'react';\n\n// SSR-safe placeholder for the command palette. The real UI mounts client-side.\nexport default function MdxCommandPalette(props = {}) {\n const {\n placeholder = 'Search\u2026',\n hotkey = 'mod+k',\n maxResults = 8,\n groupOrder = ['work', 'page'],\n button = true,\n buttonLabel = 'Search',\n } = props || {};\n\n const data = { placeholder, hotkey, maxResults, groupOrder };\n return (\n <div data-canopy-command>\n {/* Optional trigger button shown in the header layout */}\n {button && (\n <button\n type=\"button\"\n data-canopy-command-trigger\n className=\"inline-flex items-center gap-1 px-2 py-1 rounded border border-slate-300 text-slate-700 hover:bg-slate-50\"\n aria-label=\"Open search\"\n >\n <span aria-hidden>\u2318K</span>\n <span className=\"sr-only\">{buttonLabel}</span>\n </button>\n )}\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: JSON.stringify(data) }} />\n </div>\n );\n}\n\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["React", "React", "React", "React", "useEffect", "useState", "React", "useEffect", "useState", "React", "React", "React", "React", "React", "React", "React", "useEffect", "useRef", "useState", "React", "React"]
|
|
7
7
|
}
|
package/ui/dist/server.mjs
CHANGED
|
@@ -208,129 +208,8 @@ function MdxCommandPalette(props = {}) {
|
|
|
208
208
|
/* @__PURE__ */ React10.createElement("span", { className: "sr-only" }, buttonLabel)
|
|
209
209
|
), /* @__PURE__ */ React10.createElement("script", { type: "application/json", dangerouslySetInnerHTML: { __html: JSON.stringify(data) } }));
|
|
210
210
|
}
|
|
211
|
-
|
|
212
|
-
// ui/src/command/CommandApp.jsx
|
|
213
|
-
import React11, { useEffect as useEffect3, useMemo, useState as useState3 } from "react";
|
|
214
|
-
import { Command } from "cmdk";
|
|
215
|
-
function normalize(s) {
|
|
216
|
-
try {
|
|
217
|
-
return String(s || "").toLowerCase();
|
|
218
|
-
} catch (e) {
|
|
219
|
-
return "";
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
function groupLabel(t) {
|
|
223
|
-
const type = String(t || "").toLowerCase();
|
|
224
|
-
if (type === "work") return "Works";
|
|
225
|
-
if (type === "page") return "Pages";
|
|
226
|
-
return type.charAt(0).toUpperCase() + type.slice(1);
|
|
227
|
-
}
|
|
228
|
-
function CommandPaletteApp(props) {
|
|
229
|
-
const {
|
|
230
|
-
records = [],
|
|
231
|
-
loading = false,
|
|
232
|
-
open: controlledOpen,
|
|
233
|
-
onOpenChange,
|
|
234
|
-
onSelect = () => {
|
|
235
|
-
},
|
|
236
|
-
config = {}
|
|
237
|
-
} = props || {};
|
|
238
|
-
const {
|
|
239
|
-
placeholder = "Search\u2026",
|
|
240
|
-
hotkey = "mod+k",
|
|
241
|
-
maxResults = 8,
|
|
242
|
-
groupOrder = ["work", "page"],
|
|
243
|
-
button = true,
|
|
244
|
-
buttonLabel = "Search"
|
|
245
|
-
} = config || {};
|
|
246
|
-
const [open, setOpen] = useState3(!!controlledOpen);
|
|
247
|
-
useEffect3(() => {
|
|
248
|
-
if (typeof controlledOpen === "boolean") setOpen(controlledOpen);
|
|
249
|
-
}, [controlledOpen]);
|
|
250
|
-
const setOpenBoth = (v) => {
|
|
251
|
-
setOpen(!!v);
|
|
252
|
-
if (onOpenChange) onOpenChange(!!v);
|
|
253
|
-
};
|
|
254
|
-
const [q, setQ] = useState3("");
|
|
255
|
-
useEffect3(() => {
|
|
256
|
-
function handler(e) {
|
|
257
|
-
try {
|
|
258
|
-
const hk = String(hotkey || "mod+k").toLowerCase();
|
|
259
|
-
const isMod = hk.includes("mod+");
|
|
260
|
-
const key = hk.split("+").pop();
|
|
261
|
-
if ((isMod ? e.metaKey || e.ctrlKey : true) && e.key.toLowerCase() === String(key || "k")) {
|
|
262
|
-
e.preventDefault();
|
|
263
|
-
setOpenBoth(true);
|
|
264
|
-
}
|
|
265
|
-
} catch (e2) {
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
document.addEventListener("keydown", handler);
|
|
269
|
-
return () => document.removeEventListener("keydown", handler);
|
|
270
|
-
}, [hotkey]);
|
|
271
|
-
useEffect3(() => {
|
|
272
|
-
function onKey(e) {
|
|
273
|
-
if (e.key === "Escape") setOpenBoth(false);
|
|
274
|
-
}
|
|
275
|
-
document.addEventListener("keydown", onKey);
|
|
276
|
-
return () => document.removeEventListener("keydown", onKey);
|
|
277
|
-
}, []);
|
|
278
|
-
const results = useMemo(() => {
|
|
279
|
-
if (!q) return [];
|
|
280
|
-
const qq = normalize(q);
|
|
281
|
-
const out = [];
|
|
282
|
-
for (const r of records || []) {
|
|
283
|
-
const title = String(r && r.title || "");
|
|
284
|
-
if (!title) continue;
|
|
285
|
-
if (normalize(title).includes(qq)) out.push(r);
|
|
286
|
-
if (out.length >= Math.max(1, Number(maxResults) || 8)) break;
|
|
287
|
-
}
|
|
288
|
-
return out;
|
|
289
|
-
}, [q, records, maxResults]);
|
|
290
|
-
const grouped = useMemo(() => {
|
|
291
|
-
const map = /* @__PURE__ */ new Map();
|
|
292
|
-
for (const r of results) {
|
|
293
|
-
const t = String(r && r.type || "page");
|
|
294
|
-
if (!map.has(t)) map.set(t, []);
|
|
295
|
-
map.get(t).push(r);
|
|
296
|
-
}
|
|
297
|
-
return map;
|
|
298
|
-
}, [results]);
|
|
299
|
-
const onOverlayMouseDown = (e) => {
|
|
300
|
-
if (e.target === e.currentTarget) setOpenBoth(false);
|
|
301
|
-
};
|
|
302
|
-
const onItemSelect = (href) => {
|
|
303
|
-
try {
|
|
304
|
-
onSelect(String(href || ""));
|
|
305
|
-
setOpenBoth(false);
|
|
306
|
-
} catch (e) {
|
|
307
|
-
}
|
|
308
|
-
};
|
|
309
|
-
return /* @__PURE__ */ React11.createElement("div", { className: "canopy-cmdk" }, button && /* @__PURE__ */ React11.createElement(
|
|
310
|
-
"button",
|
|
311
|
-
{
|
|
312
|
-
type: "button",
|
|
313
|
-
className: "canopy-cmdk__trigger",
|
|
314
|
-
onClick: () => setOpenBoth(true),
|
|
315
|
-
"aria-label": "Open search",
|
|
316
|
-
"data-canopy-command-trigger": true
|
|
317
|
-
},
|
|
318
|
-
/* @__PURE__ */ React11.createElement("span", { "aria-hidden": true }, "\u2318K"),
|
|
319
|
-
/* @__PURE__ */ React11.createElement("span", { className: "sr-only" }, buttonLabel)
|
|
320
|
-
), /* @__PURE__ */ React11.createElement(
|
|
321
|
-
"div",
|
|
322
|
-
{
|
|
323
|
-
className: "canopy-cmdk__overlay",
|
|
324
|
-
"data-open": open ? "1" : "0",
|
|
325
|
-
onMouseDown: onOverlayMouseDown,
|
|
326
|
-
style: { display: open ? "flex" : "none" }
|
|
327
|
-
},
|
|
328
|
-
/* @__PURE__ */ React11.createElement("div", { className: "canopy-cmdk__panel" }, /* @__PURE__ */ React11.createElement("button", { className: "canopy-cmdk__close", "aria-label": "Close", onClick: () => setOpenBoth(false) }, "\xD7"), /* @__PURE__ */ React11.createElement("div", { className: "canopy-cmdk__inputWrap" }, /* @__PURE__ */ React11.createElement(Command, null, /* @__PURE__ */ React11.createElement(Command.Input, { autoFocus: true, value: q, onValueChange: setQ, placeholder, className: "canopy-cmdk__input" }), /* @__PURE__ */ React11.createElement(Command.List, { className: "canopy-cmdk__list" }, loading && /* @__PURE__ */ React11.createElement(Command.Loading, null, "Hang on\u2026"), /* @__PURE__ */ React11.createElement(Command.Empty, null, "No results found."), (Array.isArray(groupOrder) ? groupOrder : []).map((t) => grouped.has(t) ? /* @__PURE__ */ React11.createElement(Command.Group, { key: t, heading: groupLabel(t) }, grouped.get(t).map((r, i) => /* @__PURE__ */ React11.createElement(Command.Item, { key: t + "-" + i, onSelect: () => onItemSelect(r.href) }, /* @__PURE__ */ React11.createElement("div", { className: "canopy-cmdk__item" }, String(r.type || "") === "work" && r.thumbnail ? /* @__PURE__ */ React11.createElement("img", { className: "canopy-cmdk__thumb", src: r.thumbnail, alt: "" }) : null, /* @__PURE__ */ React11.createElement("span", { className: "canopy-cmdk__title" }, r.title))))) : null), Array.from(grouped.keys()).filter((t) => !(groupOrder || []).includes(t)).map((t) => /* @__PURE__ */ React11.createElement(Command.Group, { key: t, heading: groupLabel(t) }, grouped.get(t).map((r, i) => /* @__PURE__ */ React11.createElement(Command.Item, { key: t + "-x-" + i, onSelect: () => onItemSelect(r.href) }, /* @__PURE__ */ React11.createElement("div", { className: "canopy-cmdk__item" }, String(r.type || "") === "work" && r.thumbnail ? /* @__PURE__ */ React11.createElement("img", { className: "canopy-cmdk__thumb", src: r.thumbnail, alt: "" }) : null, /* @__PURE__ */ React11.createElement("span", { className: "canopy-cmdk__title" }, r.title))))))))))
|
|
329
|
-
));
|
|
330
|
-
}
|
|
331
211
|
export {
|
|
332
212
|
MdxCommandPalette as CommandPalette,
|
|
333
|
-
CommandPaletteApp,
|
|
334
213
|
Fallback,
|
|
335
214
|
HelloWorld,
|
|
336
215
|
MdxRelatedItems as RelatedItems,
|
package/ui/dist/server.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/Fallback.jsx", "../src/HelloWorld.jsx", "../src/iiif/Viewer.jsx", "../src/iiif/Slider.jsx", "../src/iiif/MdxRelatedItems.jsx", "../src/search/MdxSearchForm.jsx", "../src/search/MdxSearchResults.jsx", "../src/search/SearchSummary.jsx", "../src/search/SearchTotal.jsx", "../src/command/MdxCommandPalette.jsx"
|
|
4
|
-
"sourcesContent": ["import React from 'react';\n\nexport function Fallback({ name, ...props }) {\n const style = {\n padding: '0.75rem 1rem',\n border: '1px dashed #d1d5db',\n color: '#6b7280',\n borderRadius: 6,\n background: '#f9fafb',\n fontSize: 14,\n };\n return (\n <div style={style} data-fallback-component={name || 'Unknown'}>\n <strong>{name || 'Unknown component'}</strong> not available in UI.\n </div>\n );\n}\n\n", "import React from \"react\";\n\nexport const HelloWorld = () => {\n return <div>Hello, World!</div>;\n};\n", "import React, { useEffect, useState } from \"react\";\n\n// SSR-safe wrapper around Clover's viewer. Clover touches the DOM at import time,\n// so we dynamically import it only in the browser.\n\n// Default Clover viewer options; can be overridden per-usage via props.options\nconst DEFAULT_VIEWER_OPTIONS = {\n showDownload: false,\n showIIIFBadge: false,\n showTitle: false,\n informationPanel: {\n open: false,\n renderAbout: false,\n renderToggle: false,\n },\n};\n\nfunction isPlainObject(val) {\n return val && typeof val === \"object\" && !Array.isArray(val);\n}\n\nfunction deepMerge(base, override) {\n if (!isPlainObject(base)) return override;\n const out = { ...base };\n if (!isPlainObject(override)) return out;\n for (const key of Object.keys(override)) {\n const a = base[key];\n const b = override[key];\n if (isPlainObject(a) && isPlainObject(b)) out[key] = deepMerge(a, b);\n else out[key] = b;\n }\n return out;\n}\n\nexport const Viewer = (props) => {\n const [CloverViewer, setCloverViewer] = useState(null);\n const mergedOptions = deepMerge(\n DEFAULT_VIEWER_OPTIONS,\n props && props.options\n );\n\n useEffect(() => {\n let mounted = true;\n const canUseDom =\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\n if (canUseDom) {\n import(\"@samvera/clover-iiif/viewer\")\n .then((mod) => {\n if (!mounted) return;\n // Loaded Clover viewer dynamically in the browser\n const Comp = mod && (mod.default || mod.Viewer || mod);\n setCloverViewer(() => Comp);\n })\n .catch(() => {\n // Silently ignore load errors on the server or if Clover is unavailable\n });\n }\n return () => {\n mounted = false;\n };\n }, []);\n\n if (!CloverViewer) {\n // SSR placeholder for client hydration; props provided as JSON\n let json = \"{}\";\n try {\n const p = { ...(props || {}) };\n if (mergedOptions) p.options = mergedOptions;\n json = JSON.stringify(p);\n } catch (_) {\n json = \"{}\";\n }\n return (\n <div data-canopy-viewer=\"1\" className=\"not-prose\">\n <script\n type=\"application/json\"\n dangerouslySetInnerHTML={{ __html: json }}\n />\n </div>\n );\n }\n return <CloverViewer {...props} options={mergedOptions} />;\n};\n", "import React, { useEffect, useState } from \"react\";\n\n// SSR-safe wrapper around Clover's slider. Clover touches the DOM at import time,\n// so we dynamically import it only in the browser.\nexport const Slider = (props) => {\n const [CloverSlider, setCloverSlider] = useState(null);\n\n useEffect(() => {\n let mounted = true;\n const canUseDom =\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\n if (canUseDom) {\n import(\"@samvera/clover-iiif/slider\")\n .then((mod) => {\n if (!mounted) return;\n console.log(mod);\n const Comp = mod && (mod.default || mod.Slider || mod);\n setCloverSlider(() => Comp);\n })\n .catch(() => {\n // Silently ignore load errors on the server or if Clover is unavailable\n });\n }\n return () => {\n mounted = false;\n };\n }, []);\n\n if (!CloverSlider) {\n // SSR placeholder for client hydration; props provided as JSON\n let json = \"{}\";\n try {\n json = JSON.stringify(props || {});\n } catch (_) {\n json = \"{}\";\n }\n return (\n <div data-canopy-slider=\"1\" className=\"not-prose\">\n <script\n type=\"application/json\"\n dangerouslySetInnerHTML={{ __html: json }}\n />\n </div>\n );\n }\n return <CloverSlider {...props} />;\n};\n", "import React from 'react';\n\n// SSR-safe placeholder for RelatedItems. Hydrated by canopy-related-items.js + canopy-slider.js\nexport default function MdxRelatedItems(props) {\n let json = '{}';\n try {\n json = JSON.stringify(props || {});\n } catch (_) {\n json = '{}';\n }\n return (\n <div data-canopy-related-items=\"1\" className=\"not-prose\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n", "import React from 'react';\n\nexport default function MdxSearchForm(props) {\n let json = '{}';\n try { json = JSON.stringify(props || {}); } catch (_) { json = '{}'; }\n return (\n <div data-canopy-search-form=\"1\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n\n", "import React from 'react';\n\nexport default function MdxSearchResults(props) {\n let json = '{}';\n try { json = JSON.stringify(props || {}); } catch (_) { json = '{}'; }\n return (\n <div data-canopy-search-results=\"1\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n\n", "import React from 'react';\n\nexport default function SearchSummary(props) {\n let json = '{}';\n try { json = JSON.stringify(props || {}); } catch (_) { json = '{}'; }\n return (\n <div data-canopy-search-summary=\"1\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n\n", "import React from 'react';\n\nexport default function SearchTotal(props) {\n let json = '{}';\n try { json = JSON.stringify(props || {}); } catch (_) { json = '{}'; }\n return (\n <div data-canopy-search-total=\"1\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n\n", "import React from 'react';\n\n// SSR-safe placeholder for the command palette. The real UI mounts client-side.\nexport default function MdxCommandPalette(props = {}) {\n const {\n placeholder = 'Search\u2026',\n hotkey = 'mod+k',\n maxResults = 8,\n groupOrder = ['work', 'page'],\n button = true,\n buttonLabel = 'Search',\n } = props || {};\n\n const data = { placeholder, hotkey, maxResults, groupOrder };\n return (\n <div data-canopy-command>\n {/* Optional trigger button shown in the header layout */}\n {button && (\n <button\n type=\"button\"\n data-canopy-command-trigger\n className=\"inline-flex items-center gap-1 px-2 py-1 rounded border border-slate-300 text-slate-700 hover:bg-slate-50\"\n aria-label=\"Open search\"\n >\n <span aria-hidden>\u2318K</span>\n <span className=\"sr-only\">{buttonLabel}</span>\n </button>\n )}\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: JSON.stringify(data) }} />\n </div>\n );\n}\n\n", "import React, { useEffect, useMemo, useState } from 'react';\nimport { Command } from 'cmdk';\n\nfunction normalize(s) {\n try { return String(s || '').toLowerCase(); } catch { return ''; }\n}\n\nfunction groupLabel(t) {\n const type = String(t || '').toLowerCase();\n if (type === 'work') return 'Works';\n if (type === 'page') return 'Pages';\n return type.charAt(0).toUpperCase() + type.slice(1);\n}\n\nexport default function CommandPaletteApp(props) {\n const {\n records = [],\n loading = false,\n open: controlledOpen,\n onOpenChange,\n onSelect = () => {},\n config = {},\n } = props || {};\n const {\n placeholder = 'Search\u2026',\n hotkey = 'mod+k',\n maxResults = 8,\n groupOrder = ['work', 'page'],\n button = true,\n buttonLabel = 'Search',\n } = config || {};\n\n const [open, setOpen] = useState(!!controlledOpen);\n useEffect(() => { if (typeof controlledOpen === 'boolean') setOpen(controlledOpen); }, [controlledOpen]);\n const setOpenBoth = (v) => { setOpen(!!v); if (onOpenChange) onOpenChange(!!v); };\n\n const [q, setQ] = useState('');\n // Hotkey open\n useEffect(() => {\n function handler(e) {\n try {\n const hk = String(hotkey || 'mod+k').toLowerCase();\n const isMod = hk.includes('mod+');\n const key = hk.split('+').pop();\n if ((isMod ? (e.metaKey || e.ctrlKey) : true) && e.key.toLowerCase() === String(key || 'k')) {\n e.preventDefault();\n setOpenBoth(true);\n }\n } catch {}\n }\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [hotkey]);\n // Esc close\n useEffect(() => {\n function onKey(e) { if (e.key === 'Escape') setOpenBoth(false); }\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, []);\n\n const results = useMemo(() => {\n if (!q) return [];\n const qq = normalize(q);\n const out = [];\n for (const r of (records || [])) {\n const title = String(r && r.title || '');\n if (!title) continue;\n if (normalize(title).includes(qq)) out.push(r);\n if (out.length >= Math.max(1, Number(maxResults) || 8)) break;\n }\n return out;\n }, [q, records, maxResults]);\n\n const grouped = useMemo(() => {\n const map = new Map();\n for (const r of results) { const t = String(r && r.type || 'page'); if (!map.has(t)) map.set(t, []); map.get(t).push(r); }\n return map;\n }, [results]);\n\n const onOverlayMouseDown = (e) => { if (e.target === e.currentTarget) setOpenBoth(false); };\n const onItemSelect = (href) => { try { onSelect(String(href || '')); setOpenBoth(false); } catch {} };\n\n return (\n <div className=\"canopy-cmdk\">\n {button && (\n <button\n type=\"button\"\n className=\"canopy-cmdk__trigger\"\n onClick={() => setOpenBoth(true)}\n aria-label=\"Open search\"\n data-canopy-command-trigger\n >\n <span aria-hidden>\u2318K</span>\n <span className=\"sr-only\">{buttonLabel}</span>\n </button>\n )}\n\n <div\n className=\"canopy-cmdk__overlay\"\n data-open={open ? '1' : '0'}\n onMouseDown={onOverlayMouseDown}\n style={{ display: open ? 'flex' : 'none' }}\n >\n <div className=\"canopy-cmdk__panel\">\n <button className=\"canopy-cmdk__close\" aria-label=\"Close\" onClick={() => setOpenBoth(false)}>×</button>\n <div className=\"canopy-cmdk__inputWrap\">\n <Command>\n <Command.Input autoFocus value={q} onValueChange={setQ} placeholder={placeholder} className=\"canopy-cmdk__input\" />\n <Command.List className=\"canopy-cmdk__list\">\n {loading && <Command.Loading>Hang on\u2026</Command.Loading>}\n <Command.Empty>No results found.</Command.Empty>\n {(Array.isArray(groupOrder) ? groupOrder : []).map((t) => (\n grouped.has(t) ? (\n <Command.Group key={t} heading={groupLabel(t)}>\n {grouped.get(t).map((r, i) => (\n <Command.Item key={t + '-' + i} onSelect={() => onItemSelect(r.href)}>\n <div className=\"canopy-cmdk__item\">\n {String(r.type || '') === 'work' && r.thumbnail ? (\n <img className=\"canopy-cmdk__thumb\" src={r.thumbnail} alt=\"\" />\n ) : null}\n <span className=\"canopy-cmdk__title\">{r.title}</span>\n </div>\n </Command.Item>\n ))}\n </Command.Group>\n ) : null\n ))}\n {Array.from(grouped.keys())\n .filter((t) => !(groupOrder || []).includes(t))\n .map((t) => (\n <Command.Group key={t} heading={groupLabel(t)}>\n {grouped.get(t).map((r, i) => (\n <Command.Item key={t + '-x-' + i} onSelect={() => onItemSelect(r.href)}>\n <div className=\"canopy-cmdk__item\">\n {String(r.type || '') === 'work' && r.thumbnail ? (\n <img className=\"canopy-cmdk__thumb\" src={r.thumbnail} alt=\"\" />\n ) : null}\n <span className=\"canopy-cmdk__title\">{r.title}</span>\n </div>\n </Command.Item>\n ))}\n </Command.Group>\n ))}\n </Command.List>\n </Command>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n"],
|
|
5
|
-
"mappings": "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
|
|
6
|
-
"names": ["React", "React", "React", "useEffect", "useState", "React", "React", "React", "React", "React", "React"
|
|
3
|
+
"sources": ["../src/Fallback.jsx", "../src/HelloWorld.jsx", "../src/iiif/Viewer.jsx", "../src/iiif/Slider.jsx", "../src/iiif/MdxRelatedItems.jsx", "../src/search/MdxSearchForm.jsx", "../src/search/MdxSearchResults.jsx", "../src/search/SearchSummary.jsx", "../src/search/SearchTotal.jsx", "../src/command/MdxCommandPalette.jsx"],
|
|
4
|
+
"sourcesContent": ["import React from 'react';\n\nexport function Fallback({ name, ...props }) {\n const style = {\n padding: '0.75rem 1rem',\n border: '1px dashed #d1d5db',\n color: '#6b7280',\n borderRadius: 6,\n background: '#f9fafb',\n fontSize: 14,\n };\n return (\n <div style={style} data-fallback-component={name || 'Unknown'}>\n <strong>{name || 'Unknown component'}</strong> not available in UI.\n </div>\n );\n}\n\n", "import React from \"react\";\n\nexport const HelloWorld = () => {\n return <div>Hello, World!</div>;\n};\n", "import React, { useEffect, useState } from \"react\";\n\n// SSR-safe wrapper around Clover's viewer. Clover touches the DOM at import time,\n// so we dynamically import it only in the browser.\n\n// Default Clover viewer options; can be overridden per-usage via props.options\nconst DEFAULT_VIEWER_OPTIONS = {\n showDownload: false,\n showIIIFBadge: false,\n showTitle: false,\n informationPanel: {\n open: false,\n renderAbout: false,\n renderToggle: false,\n },\n};\n\nfunction isPlainObject(val) {\n return val && typeof val === \"object\" && !Array.isArray(val);\n}\n\nfunction deepMerge(base, override) {\n if (!isPlainObject(base)) return override;\n const out = { ...base };\n if (!isPlainObject(override)) return out;\n for (const key of Object.keys(override)) {\n const a = base[key];\n const b = override[key];\n if (isPlainObject(a) && isPlainObject(b)) out[key] = deepMerge(a, b);\n else out[key] = b;\n }\n return out;\n}\n\nexport const Viewer = (props) => {\n const [CloverViewer, setCloverViewer] = useState(null);\n const mergedOptions = deepMerge(\n DEFAULT_VIEWER_OPTIONS,\n props && props.options\n );\n\n useEffect(() => {\n let mounted = true;\n const canUseDom =\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\n if (canUseDom) {\n import(\"@samvera/clover-iiif/viewer\")\n .then((mod) => {\n if (!mounted) return;\n // Loaded Clover viewer dynamically in the browser\n const Comp = mod && (mod.default || mod.Viewer || mod);\n setCloverViewer(() => Comp);\n })\n .catch(() => {\n // Silently ignore load errors on the server or if Clover is unavailable\n });\n }\n return () => {\n mounted = false;\n };\n }, []);\n\n if (!CloverViewer) {\n // SSR placeholder for client hydration; props provided as JSON\n let json = \"{}\";\n try {\n const p = { ...(props || {}) };\n if (mergedOptions) p.options = mergedOptions;\n json = JSON.stringify(p);\n } catch (_) {\n json = \"{}\";\n }\n return (\n <div data-canopy-viewer=\"1\" className=\"not-prose\">\n <script\n type=\"application/json\"\n dangerouslySetInnerHTML={{ __html: json }}\n />\n </div>\n );\n }\n return <CloverViewer {...props} options={mergedOptions} />;\n};\n", "import React, { useEffect, useState } from \"react\";\n\n// SSR-safe wrapper around Clover's slider. Clover touches the DOM at import time,\n// so we dynamically import it only in the browser.\nexport const Slider = (props) => {\n const [CloverSlider, setCloverSlider] = useState(null);\n\n useEffect(() => {\n let mounted = true;\n const canUseDom =\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\n if (canUseDom) {\n import(\"@samvera/clover-iiif/slider\")\n .then((mod) => {\n if (!mounted) return;\n console.log(mod);\n const Comp = mod && (mod.default || mod.Slider || mod);\n setCloverSlider(() => Comp);\n })\n .catch(() => {\n // Silently ignore load errors on the server or if Clover is unavailable\n });\n }\n return () => {\n mounted = false;\n };\n }, []);\n\n if (!CloverSlider) {\n // SSR placeholder for client hydration; props provided as JSON\n let json = \"{}\";\n try {\n json = JSON.stringify(props || {});\n } catch (_) {\n json = \"{}\";\n }\n return (\n <div data-canopy-slider=\"1\" className=\"not-prose\">\n <script\n type=\"application/json\"\n dangerouslySetInnerHTML={{ __html: json }}\n />\n </div>\n );\n }\n return <CloverSlider {...props} />;\n};\n", "import React from 'react';\n\n// SSR-safe placeholder for RelatedItems. Hydrated by canopy-related-items.js + canopy-slider.js\nexport default function MdxRelatedItems(props) {\n let json = '{}';\n try {\n json = JSON.stringify(props || {});\n } catch (_) {\n json = '{}';\n }\n return (\n <div data-canopy-related-items=\"1\" className=\"not-prose\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n", "import React from 'react';\n\nexport default function MdxSearchForm(props) {\n let json = '{}';\n try { json = JSON.stringify(props || {}); } catch (_) { json = '{}'; }\n return (\n <div data-canopy-search-form=\"1\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n\n", "import React from 'react';\n\nexport default function MdxSearchResults(props) {\n let json = '{}';\n try { json = JSON.stringify(props || {}); } catch (_) { json = '{}'; }\n return (\n <div data-canopy-search-results=\"1\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n\n", "import React from 'react';\n\nexport default function SearchSummary(props) {\n let json = '{}';\n try { json = JSON.stringify(props || {}); } catch (_) { json = '{}'; }\n return (\n <div data-canopy-search-summary=\"1\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n\n", "import React from 'react';\n\nexport default function SearchTotal(props) {\n let json = '{}';\n try { json = JSON.stringify(props || {}); } catch (_) { json = '{}'; }\n return (\n <div data-canopy-search-total=\"1\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n\n", "import React from 'react';\n\n// SSR-safe placeholder for the command palette. The real UI mounts client-side.\nexport default function MdxCommandPalette(props = {}) {\n const {\n placeholder = 'Search\u2026',\n hotkey = 'mod+k',\n maxResults = 8,\n groupOrder = ['work', 'page'],\n button = true,\n buttonLabel = 'Search',\n } = props || {};\n\n const data = { placeholder, hotkey, maxResults, groupOrder };\n return (\n <div data-canopy-command>\n {/* Optional trigger button shown in the header layout */}\n {button && (\n <button\n type=\"button\"\n data-canopy-command-trigger\n className=\"inline-flex items-center gap-1 px-2 py-1 rounded border border-slate-300 text-slate-700 hover:bg-slate-50\"\n aria-label=\"Open search\"\n >\n <span aria-hidden>\u2318K</span>\n <span className=\"sr-only\">{buttonLabel}</span>\n </button>\n )}\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: JSON.stringify(data) }} />\n </div>\n );\n}\n\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["React", "React", "React", "useEffect", "useState", "React", "React", "React", "React", "React", "React"]
|
|
7
7
|
}
|