@canopy-iiif/app 0.9.0 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/build/mdx.js +124 -1
- package/lib/build/pages.js +6 -0
- package/package.json +1 -1
- package/ui/dist/server.mjs +369 -38
- package/ui/dist/server.mjs.map +4 -4
- package/ui/styles/components/_sub-navigation.scss +0 -1
- package/ui/styles/index.css +0 -1
package/lib/build/mdx.js
CHANGED
|
@@ -139,6 +139,50 @@ async function loadUiComponents() {
|
|
|
139
139
|
return UI_COMPONENTS;
|
|
140
140
|
}
|
|
141
141
|
|
|
142
|
+
function slugifyHeading(text) {
|
|
143
|
+
try {
|
|
144
|
+
return String(text || '')
|
|
145
|
+
.toLowerCase()
|
|
146
|
+
.trim()
|
|
147
|
+
.replace(/[^a-z0-9\s-]/g, '')
|
|
148
|
+
.replace(/\s+/g, '-');
|
|
149
|
+
} catch (_) {
|
|
150
|
+
return '';
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function extractHeadings(mdxSource) {
|
|
155
|
+
const { content } = parseFrontmatter(String(mdxSource || ''));
|
|
156
|
+
const cleaned = content.replace(/```[\s\S]*?```/g, '');
|
|
157
|
+
const headingRegex = /^ {0,3}(#{1,6})\s+(.+?)\s*$/gm;
|
|
158
|
+
const seen = new Map();
|
|
159
|
+
const headings = [];
|
|
160
|
+
let match;
|
|
161
|
+
while ((match = headingRegex.exec(cleaned))) {
|
|
162
|
+
const hashes = match[1] || '';
|
|
163
|
+
const depth = hashes.length;
|
|
164
|
+
let raw = match[2] || '';
|
|
165
|
+
let explicitId = null;
|
|
166
|
+
const idMatch = raw.match(/\s*\{#([A-Za-z0-9_-]+)\}\s*$/);
|
|
167
|
+
if (idMatch) {
|
|
168
|
+
explicitId = idMatch[1];
|
|
169
|
+
raw = raw.slice(0, raw.length - idMatch[0].length);
|
|
170
|
+
}
|
|
171
|
+
const title = raw.replace(/\<[^>]*\>/g, '').replace(/\[([^\]]+)\]\([^)]*\)/g, '$1').trim();
|
|
172
|
+
if (!title) continue;
|
|
173
|
+
const baseId = explicitId || slugifyHeading(title) || `section-${headings.length + 1}`;
|
|
174
|
+
const count = seen.get(baseId) || 0;
|
|
175
|
+
seen.set(baseId, count + 1);
|
|
176
|
+
const id = count === 0 ? baseId : `${baseId}-${count + 1}`;
|
|
177
|
+
headings.push({
|
|
178
|
+
id,
|
|
179
|
+
title,
|
|
180
|
+
depth,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
return headings;
|
|
184
|
+
}
|
|
185
|
+
|
|
142
186
|
function extractTitle(mdxSource) {
|
|
143
187
|
const { data, content } = parseFrontmatter(String(mdxSource || ""));
|
|
144
188
|
if (data && typeof data.title === "string" && data.title.trim()) {
|
|
@@ -271,6 +315,84 @@ async function compileMdxFile(filePath, outPath, Layout, extraProps = {}) {
|
|
|
271
315
|
const mod = await import(pathToFileURL(tmpFile).href + bust);
|
|
272
316
|
const MDXContent = mod.default || mod.MDXContent || mod;
|
|
273
317
|
const components = await loadUiComponents();
|
|
318
|
+
const rawHeadings = Array.isArray(extraProps && extraProps.page && extraProps.page.headings)
|
|
319
|
+
? extraProps.page.headings
|
|
320
|
+
.map((heading) => (heading ? { ...heading } : heading))
|
|
321
|
+
.filter(Boolean)
|
|
322
|
+
: [];
|
|
323
|
+
const headingQueue = rawHeadings.slice();
|
|
324
|
+
const headingIdCounts = new Map();
|
|
325
|
+
headingQueue.forEach((heading) => {
|
|
326
|
+
if (heading && heading.id) {
|
|
327
|
+
const key = String(heading.id);
|
|
328
|
+
headingIdCounts.set(key, (headingIdCounts.get(key) || 0) + 1);
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
function reserveHeadingId(base) {
|
|
333
|
+
const fallback = base || 'section';
|
|
334
|
+
let candidate = fallback;
|
|
335
|
+
let attempt = 1;
|
|
336
|
+
while (headingIdCounts.has(candidate)) {
|
|
337
|
+
attempt += 1;
|
|
338
|
+
candidate = `${fallback}-${attempt}`;
|
|
339
|
+
}
|
|
340
|
+
headingIdCounts.set(candidate, 1);
|
|
341
|
+
return candidate;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
function extractTextFromChildren(children) {
|
|
345
|
+
if (children == null) return '';
|
|
346
|
+
if (typeof children === 'string' || typeof children === 'number') return String(children);
|
|
347
|
+
if (Array.isArray(children)) return children.map((child) => extractTextFromChildren(child)).join('');
|
|
348
|
+
if (React.isValidElement(children)) return extractTextFromChildren(children.props && children.props.children);
|
|
349
|
+
return '';
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
function takeHeading(level, children) {
|
|
353
|
+
if (!headingQueue.length) return null;
|
|
354
|
+
const idx = headingQueue.findIndex((item) => {
|
|
355
|
+
if (!item || typeof item !== 'object') return false;
|
|
356
|
+
const depth = typeof item.depth === 'number' ? item.depth : item.level;
|
|
357
|
+
return depth === level;
|
|
358
|
+
});
|
|
359
|
+
if (idx === -1) return null;
|
|
360
|
+
const [heading] = headingQueue.splice(idx, 1);
|
|
361
|
+
if (!heading.id) {
|
|
362
|
+
const text = heading.title || extractTextFromChildren(children);
|
|
363
|
+
const baseId = slugifyHeading(text);
|
|
364
|
+
heading.id = reserveHeadingId(baseId);
|
|
365
|
+
}
|
|
366
|
+
if (!heading.title) {
|
|
367
|
+
heading.title = extractTextFromChildren(children);
|
|
368
|
+
}
|
|
369
|
+
return heading;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
function createHeadingComponent(level) {
|
|
373
|
+
const tag = `h${level}`;
|
|
374
|
+
const Base = components && components[tag] ? components[tag] : tag;
|
|
375
|
+
return function HeadingComponent(props) {
|
|
376
|
+
const heading = takeHeading(level, props && props.children);
|
|
377
|
+
const id = props && props.id ? props.id : heading && heading.id;
|
|
378
|
+
const finalProps = id ? { ...props, id } : props;
|
|
379
|
+
return React.createElement(Base, finalProps, props && props.children);
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
const levelsPresent = Array.from(
|
|
384
|
+
new Set(
|
|
385
|
+
headingQueue
|
|
386
|
+
.map((heading) => (heading ? heading.depth || heading.level : null))
|
|
387
|
+
.filter((level) => typeof level === 'number' && level >= 1 && level <= 6)
|
|
388
|
+
)
|
|
389
|
+
);
|
|
390
|
+
const headingComponents = levelsPresent.length
|
|
391
|
+
? levelsPresent.reduce((acc, level) => {
|
|
392
|
+
acc[`h${level}`] = createHeadingComponent(level);
|
|
393
|
+
return acc;
|
|
394
|
+
}, {})
|
|
395
|
+
: {};
|
|
274
396
|
const MDXProvider = await getMdxProvider();
|
|
275
397
|
// Base path support for anchors
|
|
276
398
|
const Anchor = function A(props) {
|
|
@@ -294,7 +416,7 @@ async function compileMdxFile(filePath, outPath, Layout, extraProps = {}) {
|
|
|
294
416
|
? React.createElement(PageContext.Provider, { value: contextValue }, withLayout)
|
|
295
417
|
: withLayout;
|
|
296
418
|
const withApp = React.createElement(app.App, null, withContext);
|
|
297
|
-
const compMap = { ...components, a: Anchor };
|
|
419
|
+
const compMap = { ...components, ...headingComponents, a: Anchor };
|
|
298
420
|
const page = MDXProvider
|
|
299
421
|
? React.createElement(MDXProvider, { components: compMap }, withApp)
|
|
300
422
|
: withApp;
|
|
@@ -811,6 +933,7 @@ async function ensureHeroRuntime() {
|
|
|
811
933
|
|
|
812
934
|
module.exports = {
|
|
813
935
|
extractTitle,
|
|
936
|
+
extractHeadings,
|
|
814
937
|
isReservedFile,
|
|
815
938
|
parseFrontmatter,
|
|
816
939
|
compileMdxFile,
|
package/lib/build/pages.js
CHANGED
|
@@ -50,6 +50,7 @@ async function renderContentMdxToHtml(filePath, outPath, extraProps = {}) {
|
|
|
50
50
|
const pageInfo = navigation.getPageInfo(normalizedRel);
|
|
51
51
|
const navData = navigation.buildNavigationForFile(normalizedRel);
|
|
52
52
|
const mergedProps = { ...(extraProps || {}) };
|
|
53
|
+
const headings = mdx.extractHeadings(source);
|
|
53
54
|
if (pageInfo) {
|
|
54
55
|
mergedProps.page = mergedProps.page
|
|
55
56
|
? { ...pageInfo, ...mergedProps.page }
|
|
@@ -58,6 +59,11 @@ async function renderContentMdxToHtml(filePath, outPath, extraProps = {}) {
|
|
|
58
59
|
if (navData && !mergedProps.navigation) {
|
|
59
60
|
mergedProps.navigation = navData;
|
|
60
61
|
}
|
|
62
|
+
if (headings && headings.length) {
|
|
63
|
+
mergedProps.page = mergedProps.page
|
|
64
|
+
? { ...mergedProps.page, headings }
|
|
65
|
+
: { headings };
|
|
66
|
+
}
|
|
61
67
|
const { body, head } = await mdx.compileMdxFile(filePath, outPath, null, mergedProps);
|
|
62
68
|
const needsHydrateViewer =
|
|
63
69
|
body.includes('data-canopy-viewer') || body.includes('data-canopy-scroll');
|
package/package.json
CHANGED
package/ui/dist/server.mjs
CHANGED
|
@@ -479,8 +479,338 @@ function SubNavigation({
|
|
|
479
479
|
return /* @__PURE__ */ React7.createElement("nav", { className: combinedClassName, style: inlineStyle, "aria-label": navLabel }, finalHeading ? /* @__PURE__ */ React7.createElement("div", { className: "canopy-sub-navigation__heading" }, finalHeading) : null, /* @__PURE__ */ React7.createElement("ul", { className: "canopy-sub-navigation__list", role: "list" }, renderNodes([rootNode], rootNode.slug || "root")));
|
|
480
480
|
}
|
|
481
481
|
|
|
482
|
-
// ui/src/
|
|
482
|
+
// ui/src/layout/Layout.jsx
|
|
483
|
+
import React9 from "react";
|
|
484
|
+
import navigationHelpers2 from "@canopy-iiif/app/lib/components/navigation.js";
|
|
485
|
+
|
|
486
|
+
// ui/src/layout/ContentNavigation.jsx
|
|
483
487
|
import React8 from "react";
|
|
488
|
+
var SCROLL_OFFSET_REM = 1.618;
|
|
489
|
+
function depthIndex(depth) {
|
|
490
|
+
return Math.max(0, Math.min(5, (depth || 1) - 1));
|
|
491
|
+
}
|
|
492
|
+
function ContentNavigation({
|
|
493
|
+
items = [],
|
|
494
|
+
className = "",
|
|
495
|
+
style = {},
|
|
496
|
+
heading,
|
|
497
|
+
headingId,
|
|
498
|
+
pageTitle,
|
|
499
|
+
ariaLabel
|
|
500
|
+
}) {
|
|
501
|
+
const isBrowser = typeof window !== "undefined" && typeof document !== "undefined";
|
|
502
|
+
const savedDepthsRef = React8.useRef(null);
|
|
503
|
+
if ((!items || !items.length) && !headingId) return null;
|
|
504
|
+
const combinedClassName = ["canopy-sub-navigation canopy-content-navigation", className].filter(Boolean).join(" ");
|
|
505
|
+
const effectiveHeading = heading || pageTitle || null;
|
|
506
|
+
const navLabel = ariaLabel || (effectiveHeading ? `${effectiveHeading} navigation` : "Section navigation");
|
|
507
|
+
const getSavedDepth = React8.useCallback(
|
|
508
|
+
(id, fallback) => {
|
|
509
|
+
if (!id) return fallback;
|
|
510
|
+
if (!savedDepthsRef.current) savedDepthsRef.current = /* @__PURE__ */ new Map();
|
|
511
|
+
const store = savedDepthsRef.current;
|
|
512
|
+
if (store.has(id)) return store.get(id);
|
|
513
|
+
store.set(id, fallback);
|
|
514
|
+
return fallback;
|
|
515
|
+
},
|
|
516
|
+
[]
|
|
517
|
+
);
|
|
518
|
+
const headingEntries = React8.useMemo(() => {
|
|
519
|
+
const entries = [];
|
|
520
|
+
const seen = /* @__PURE__ */ new Set();
|
|
521
|
+
if (headingId) {
|
|
522
|
+
const topId = String(headingId);
|
|
523
|
+
entries.push({ id: topId, depth: 1 });
|
|
524
|
+
seen.add(topId);
|
|
525
|
+
}
|
|
526
|
+
const pushNodes = (nodes) => {
|
|
527
|
+
if (!Array.isArray(nodes)) return;
|
|
528
|
+
nodes.forEach((node) => {
|
|
529
|
+
if (!node || !node.id) return;
|
|
530
|
+
const id = String(node.id);
|
|
531
|
+
if (seen.has(id)) return;
|
|
532
|
+
seen.add(id);
|
|
533
|
+
const depth = node.depth || node.level || getSavedDepth(id, 2);
|
|
534
|
+
entries.push({ id, depth });
|
|
535
|
+
if (node.children && node.children.length) pushNodes(node.children);
|
|
536
|
+
});
|
|
537
|
+
};
|
|
538
|
+
pushNodes(items);
|
|
539
|
+
return entries;
|
|
540
|
+
}, [headingId, items, getSavedDepth]);
|
|
541
|
+
const fallbackId = headingEntries.length ? headingEntries[0].id : headingId || null;
|
|
542
|
+
const [activeId, setActiveId] = React8.useState(fallbackId);
|
|
543
|
+
const activeIdRef = React8.useRef(activeId);
|
|
544
|
+
React8.useEffect(() => {
|
|
545
|
+
activeIdRef.current = activeId;
|
|
546
|
+
}, [activeId]);
|
|
547
|
+
React8.useEffect(() => {
|
|
548
|
+
if (!headingEntries.length) return;
|
|
549
|
+
if (!headingEntries.some((entry) => entry.id === activeIdRef.current)) {
|
|
550
|
+
const next = headingEntries[0].id;
|
|
551
|
+
activeIdRef.current = next;
|
|
552
|
+
setActiveId(next);
|
|
553
|
+
}
|
|
554
|
+
}, [headingEntries]);
|
|
555
|
+
const computeOffsetPx = React8.useCallback(() => {
|
|
556
|
+
if (!isBrowser) return 0;
|
|
557
|
+
try {
|
|
558
|
+
const root = document.documentElement;
|
|
559
|
+
const fontSize = root ? parseFloat(window.getComputedStyle(root).fontSize || "16") || 16 : 16;
|
|
560
|
+
return fontSize * SCROLL_OFFSET_REM;
|
|
561
|
+
} catch (_) {
|
|
562
|
+
return 0;
|
|
563
|
+
}
|
|
564
|
+
}, [isBrowser]);
|
|
565
|
+
const headingElementsRef = React8.useRef([]);
|
|
566
|
+
const updateActiveFromElements = React8.useCallback(
|
|
567
|
+
(elements) => {
|
|
568
|
+
if (!elements || !elements.length) return;
|
|
569
|
+
const offset = computeOffsetPx();
|
|
570
|
+
let nextId = elements[0].id;
|
|
571
|
+
for (const { id, element } of elements) {
|
|
572
|
+
const rect = element.getBoundingClientRect();
|
|
573
|
+
if (rect.top - offset <= 0) {
|
|
574
|
+
nextId = id;
|
|
575
|
+
} else {
|
|
576
|
+
break;
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
if (nextId && nextId !== activeIdRef.current) {
|
|
580
|
+
activeIdRef.current = nextId;
|
|
581
|
+
setActiveId(nextId);
|
|
582
|
+
}
|
|
583
|
+
},
|
|
584
|
+
[computeOffsetPx]
|
|
585
|
+
);
|
|
586
|
+
React8.useEffect(() => {
|
|
587
|
+
if (!isBrowser) return void 0;
|
|
588
|
+
const elements = headingEntries.map((entry) => {
|
|
589
|
+
const element = document.getElementById(entry.id);
|
|
590
|
+
return element ? { id: entry.id, element } : null;
|
|
591
|
+
}).filter(Boolean);
|
|
592
|
+
headingElementsRef.current = elements;
|
|
593
|
+
updateActiveFromElements(elements);
|
|
594
|
+
if (!elements.length) return void 0;
|
|
595
|
+
let ticking = false;
|
|
596
|
+
const handle = () => {
|
|
597
|
+
if (!ticking) {
|
|
598
|
+
ticking = true;
|
|
599
|
+
window.requestAnimationFrame(() => {
|
|
600
|
+
updateActiveFromElements(elements);
|
|
601
|
+
ticking = false;
|
|
602
|
+
});
|
|
603
|
+
}
|
|
604
|
+
};
|
|
605
|
+
window.addEventListener("scroll", handle, { passive: true });
|
|
606
|
+
window.addEventListener("resize", handle);
|
|
607
|
+
return () => {
|
|
608
|
+
window.removeEventListener("scroll", handle);
|
|
609
|
+
window.removeEventListener("resize", handle);
|
|
610
|
+
};
|
|
611
|
+
}, [headingEntries, isBrowser, updateActiveFromElements]);
|
|
612
|
+
const handleAnchorClick = React8.useCallback(
|
|
613
|
+
(event, targetId, options = {}) => {
|
|
614
|
+
var _a;
|
|
615
|
+
try {
|
|
616
|
+
if (event && typeof event.preventDefault === "function") event.preventDefault();
|
|
617
|
+
} catch (_) {
|
|
618
|
+
}
|
|
619
|
+
if (!isBrowser) return;
|
|
620
|
+
const offset = computeOffsetPx();
|
|
621
|
+
let top = 0;
|
|
622
|
+
if (targetId && targetId !== "top" && !options.scrollToTop) {
|
|
623
|
+
const el = document.getElementById(targetId);
|
|
624
|
+
if (el) {
|
|
625
|
+
const rect = el.getBoundingClientRect();
|
|
626
|
+
top = window.scrollY + rect.top - offset;
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
if (!Number.isFinite(top) || top < 0 || options.scrollToTop) top = 0;
|
|
630
|
+
const nextId = targetId && targetId !== "top" ? targetId : ((_a = headingEntries[0]) == null ? void 0 : _a.id) || headingId || null;
|
|
631
|
+
if (nextId) {
|
|
632
|
+
activeIdRef.current = nextId;
|
|
633
|
+
setActiveId(nextId);
|
|
634
|
+
}
|
|
635
|
+
try {
|
|
636
|
+
window.scrollTo({ top, behavior: "smooth" });
|
|
637
|
+
} catch (_) {
|
|
638
|
+
window.scrollTo(0, top);
|
|
639
|
+
}
|
|
640
|
+
},
|
|
641
|
+
[computeOffsetPx, headingEntries, headingId, isBrowser]
|
|
642
|
+
);
|
|
643
|
+
const renderNodes2 = React8.useCallback(
|
|
644
|
+
(nodes) => {
|
|
645
|
+
if (!nodes || !nodes.length) return null;
|
|
646
|
+
return nodes.map((node) => {
|
|
647
|
+
if (!node) return null;
|
|
648
|
+
const id = node.id ? String(node.id) : "";
|
|
649
|
+
const depth = node.depth || node.level || getSavedDepth(id, 2);
|
|
650
|
+
const idx = depthIndex(depth);
|
|
651
|
+
const isActive = id && activeId === id;
|
|
652
|
+
return /* @__PURE__ */ React8.createElement("li", { key: id || node.title, className: "canopy-sub-navigation__item", "data-depth": idx }, /* @__PURE__ */ React8.createElement(
|
|
653
|
+
"a",
|
|
654
|
+
{
|
|
655
|
+
className: `canopy-sub-navigation__link depth-${idx}${isActive ? " is-active" : ""}`,
|
|
656
|
+
href: id ? `#${id}` : "#",
|
|
657
|
+
onClick: (event) => handleAnchorClick(event, id || null),
|
|
658
|
+
"aria-current": isActive ? "location" : void 0
|
|
659
|
+
},
|
|
660
|
+
node.title
|
|
661
|
+
), node.children && node.children.length ? /* @__PURE__ */ React8.createElement(
|
|
662
|
+
"ul",
|
|
663
|
+
{
|
|
664
|
+
className: "canopy-sub-navigation__list canopy-sub-navigation__list--nested",
|
|
665
|
+
role: "list"
|
|
666
|
+
},
|
|
667
|
+
renderNodes2(node.children)
|
|
668
|
+
) : null);
|
|
669
|
+
});
|
|
670
|
+
},
|
|
671
|
+
[handleAnchorClick, activeId, getSavedDepth]
|
|
672
|
+
);
|
|
673
|
+
const nestedItems = renderNodes2(items);
|
|
674
|
+
const topLink = headingId ? /* @__PURE__ */ React8.createElement("li", { className: "canopy-sub-navigation__item", "data-depth": 0 }, /* @__PURE__ */ React8.createElement(
|
|
675
|
+
"a",
|
|
676
|
+
{
|
|
677
|
+
className: `canopy-sub-navigation__link depth-0${activeId === headingId ? " is-active" : ""}`,
|
|
678
|
+
href: `#${headingId}`,
|
|
679
|
+
onClick: (event) => handleAnchorClick(event, headingId, { scrollToTop: true }),
|
|
680
|
+
"aria-current": activeId === headingId ? "location" : void 0
|
|
681
|
+
},
|
|
682
|
+
effectiveHeading || pageTitle || headingId
|
|
683
|
+
), nestedItems ? /* @__PURE__ */ React8.createElement(
|
|
684
|
+
"ul",
|
|
685
|
+
{
|
|
686
|
+
className: "canopy-sub-navigation__list canopy-sub-navigation__list--nested",
|
|
687
|
+
role: "list"
|
|
688
|
+
},
|
|
689
|
+
nestedItems
|
|
690
|
+
) : null) : null;
|
|
691
|
+
return /* @__PURE__ */ React8.createElement("nav", { className: combinedClassName, style, "aria-label": navLabel }, /* @__PURE__ */ React8.createElement("ul", { className: "canopy-sub-navigation__list", role: "list" }, topLink || nestedItems));
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
// ui/src/layout/Layout.jsx
|
|
695
|
+
function buildHeadingTree(headings) {
|
|
696
|
+
if (!Array.isArray(headings) || !headings.length) return [];
|
|
697
|
+
const root = [];
|
|
698
|
+
const stack = [];
|
|
699
|
+
headings.forEach((heading) => {
|
|
700
|
+
if (!heading || typeof heading !== "object") return;
|
|
701
|
+
const depth = typeof heading.depth === "number" ? heading.depth : heading.level;
|
|
702
|
+
if (typeof depth !== "number" || depth < 2) return;
|
|
703
|
+
const entry = {
|
|
704
|
+
id: heading.id || heading.slug || heading.title,
|
|
705
|
+
title: heading.title || heading.text || heading.id,
|
|
706
|
+
depth,
|
|
707
|
+
children: []
|
|
708
|
+
};
|
|
709
|
+
while (stack.length && stack[stack.length - 1].depth >= entry.depth) {
|
|
710
|
+
stack.pop();
|
|
711
|
+
}
|
|
712
|
+
if (!stack.length) {
|
|
713
|
+
root.push(entry);
|
|
714
|
+
} else {
|
|
715
|
+
stack[stack.length - 1].children.push(entry);
|
|
716
|
+
}
|
|
717
|
+
stack.push(entry);
|
|
718
|
+
});
|
|
719
|
+
return root;
|
|
720
|
+
}
|
|
721
|
+
function buildNavigationAside(sidebar, className) {
|
|
722
|
+
if (!sidebar) {
|
|
723
|
+
return /* @__PURE__ */ React9.createElement(SubNavigation, { className });
|
|
724
|
+
}
|
|
725
|
+
if (typeof sidebar === "function") {
|
|
726
|
+
return React9.createElement(sidebar);
|
|
727
|
+
}
|
|
728
|
+
return sidebar;
|
|
729
|
+
}
|
|
730
|
+
function Layout({
|
|
731
|
+
children,
|
|
732
|
+
sidebar,
|
|
733
|
+
navigation = true,
|
|
734
|
+
fluid = false,
|
|
735
|
+
contentNavigation = true,
|
|
736
|
+
className = "",
|
|
737
|
+
contentClassName = "",
|
|
738
|
+
sidebarClassName = "",
|
|
739
|
+
contentNavigationClassName = "",
|
|
740
|
+
...rest
|
|
741
|
+
}) {
|
|
742
|
+
const PageContext = navigationHelpers2 && typeof navigationHelpers2.getPageContext === "function" ? navigationHelpers2.getPageContext() : null;
|
|
743
|
+
const context = PageContext ? React9.useContext(PageContext) : null;
|
|
744
|
+
const pageHeadings = React9.useMemo(() => {
|
|
745
|
+
const headings = context && context.page ? context.page.headings : null;
|
|
746
|
+
return Array.isArray(headings) ? headings : [];
|
|
747
|
+
}, [context]);
|
|
748
|
+
const contentHeading = React9.useMemo(() => {
|
|
749
|
+
const first = pageHeadings.find((heading) => {
|
|
750
|
+
const depth = heading && (heading.depth || heading.level);
|
|
751
|
+
return depth === 1;
|
|
752
|
+
});
|
|
753
|
+
return first && first.title ? first.title : null;
|
|
754
|
+
}, [pageHeadings]);
|
|
755
|
+
const headingAnchorId = React9.useMemo(() => {
|
|
756
|
+
const first = pageHeadings.find((heading) => {
|
|
757
|
+
const depth = heading && (heading.depth || heading.level);
|
|
758
|
+
return depth === 1;
|
|
759
|
+
});
|
|
760
|
+
return first && first.id ? first.id : null;
|
|
761
|
+
}, [pageHeadings]);
|
|
762
|
+
const headingTree = React9.useMemo(
|
|
763
|
+
() => buildHeadingTree(pageHeadings),
|
|
764
|
+
[pageHeadings]
|
|
765
|
+
);
|
|
766
|
+
const showLeftColumn = navigation !== false;
|
|
767
|
+
const hasContentNavigation = navigation !== false && contentNavigation !== false && headingTree.length > 0;
|
|
768
|
+
const gridClass = (() => {
|
|
769
|
+
if (showLeftColumn && hasContentNavigation) {
|
|
770
|
+
return "md:grid md:grid-cols-[17rem_minmax(0,1fr)_14rem] md:items-start md:gap-10";
|
|
771
|
+
}
|
|
772
|
+
if (showLeftColumn) {
|
|
773
|
+
return "md:grid md:grid-cols-[17rem_minmax(0,1fr)] md:items-start md:gap-10";
|
|
774
|
+
}
|
|
775
|
+
if (hasContentNavigation) {
|
|
776
|
+
return "md:grid md:grid-cols-[minmax(0,1fr)_14rem] md:items-start md:gap-10";
|
|
777
|
+
}
|
|
778
|
+
return "";
|
|
779
|
+
})();
|
|
780
|
+
const containerClassName = [
|
|
781
|
+
"w-full py-6 getting-started-layout",
|
|
782
|
+
gridClass,
|
|
783
|
+
fluid ? "px-4 md:px-8 lg:px-12" : "mx-auto max-w-content px-4",
|
|
784
|
+
className
|
|
785
|
+
].filter(Boolean).join(" ");
|
|
786
|
+
const leftAsideClassName = [
|
|
787
|
+
"mt-8 md:mt-0 md:order-1 md:sticky md:top-24 md:max-h-[calc(100vh-6rem)] md:overflow-y-auto text-sm text-slate-600",
|
|
788
|
+
sidebarClassName
|
|
789
|
+
].filter(Boolean).join(" ");
|
|
790
|
+
const contentOrderClass = showLeftColumn ? "md:order-2" : hasContentNavigation ? "md:order-1" : "";
|
|
791
|
+
const contentClassNames = [
|
|
792
|
+
"space-y-6",
|
|
793
|
+
contentOrderClass,
|
|
794
|
+
contentClassName
|
|
795
|
+
].filter(Boolean).join(" ");
|
|
796
|
+
const contentNavigationAsideClassName = [
|
|
797
|
+
"hidden md:block md:order-3 mt-8 md:mt-0 md:sticky md:top-24 md:max-h-[calc(100vh-6rem)] md:overflow-y-auto text-sm text-slate-600",
|
|
798
|
+
contentNavigationClassName
|
|
799
|
+
].filter(Boolean).join(" ");
|
|
800
|
+
const sidebarNode = showLeftColumn ? buildNavigationAside(sidebar, sidebarClassName) : null;
|
|
801
|
+
return /* @__PURE__ */ React9.createElement("div", { className: containerClassName, ...rest }, showLeftColumn ? /* @__PURE__ */ React9.createElement("aside", { className: leftAsideClassName }, sidebarNode) : null, /* @__PURE__ */ React9.createElement("div", { className: contentClassNames }, children), hasContentNavigation ? /* @__PURE__ */ React9.createElement("aside", { className: contentNavigationAsideClassName }, /* @__PURE__ */ React9.createElement(
|
|
802
|
+
ContentNavigation,
|
|
803
|
+
{
|
|
804
|
+
items: headingTree,
|
|
805
|
+
heading: contentHeading || void 0,
|
|
806
|
+
headingId: headingAnchorId || void 0,
|
|
807
|
+
pageTitle: context && context.page ? context.page.title : void 0
|
|
808
|
+
}
|
|
809
|
+
)) : null);
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
// ui/src/search/MdxSearchResults.jsx
|
|
813
|
+
import React10 from "react";
|
|
484
814
|
function MdxSearchResults(props) {
|
|
485
815
|
let json = "{}";
|
|
486
816
|
try {
|
|
@@ -488,11 +818,11 @@ function MdxSearchResults(props) {
|
|
|
488
818
|
} catch (_) {
|
|
489
819
|
json = "{}";
|
|
490
820
|
}
|
|
491
|
-
return /* @__PURE__ */
|
|
821
|
+
return /* @__PURE__ */ React10.createElement("div", { "data-canopy-search-results": "1" }, /* @__PURE__ */ React10.createElement("script", { type: "application/json", dangerouslySetInnerHTML: { __html: json } }));
|
|
492
822
|
}
|
|
493
823
|
|
|
494
824
|
// ui/src/search/SearchSummary.jsx
|
|
495
|
-
import
|
|
825
|
+
import React11 from "react";
|
|
496
826
|
function SearchSummary(props) {
|
|
497
827
|
let json = "{}";
|
|
498
828
|
try {
|
|
@@ -500,11 +830,11 @@ function SearchSummary(props) {
|
|
|
500
830
|
} catch (_) {
|
|
501
831
|
json = "{}";
|
|
502
832
|
}
|
|
503
|
-
return /* @__PURE__ */
|
|
833
|
+
return /* @__PURE__ */ React11.createElement("div", { "data-canopy-search-summary": "1" }, /* @__PURE__ */ React11.createElement("script", { type: "application/json", dangerouslySetInnerHTML: { __html: json } }));
|
|
504
834
|
}
|
|
505
835
|
|
|
506
836
|
// ui/src/search/MdxSearchTabs.jsx
|
|
507
|
-
import
|
|
837
|
+
import React12 from "react";
|
|
508
838
|
function MdxSearchTabs(props) {
|
|
509
839
|
let json = "{}";
|
|
510
840
|
try {
|
|
@@ -512,18 +842,18 @@ function MdxSearchTabs(props) {
|
|
|
512
842
|
} catch (_) {
|
|
513
843
|
json = "{}";
|
|
514
844
|
}
|
|
515
|
-
return /* @__PURE__ */
|
|
845
|
+
return /* @__PURE__ */ React12.createElement("div", { "data-canopy-search-tabs": "1" }, /* @__PURE__ */ React12.createElement("script", { type: "application/json", dangerouslySetInnerHTML: { __html: json } }));
|
|
516
846
|
}
|
|
517
847
|
|
|
518
848
|
// ui/src/search-form/MdxSearchFormModal.jsx
|
|
519
|
-
import
|
|
849
|
+
import React16 from "react";
|
|
520
850
|
|
|
521
851
|
// ui/src/Icons.jsx
|
|
522
|
-
import
|
|
523
|
-
var MagnifyingGlassIcon = (props) => /* @__PURE__ */
|
|
852
|
+
import React13 from "react";
|
|
853
|
+
var MagnifyingGlassIcon = (props) => /* @__PURE__ */ React13.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 512 512", ...props }, /* @__PURE__ */ React13.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" }));
|
|
524
854
|
|
|
525
855
|
// ui/src/search/SearchPanelForm.jsx
|
|
526
|
-
import
|
|
856
|
+
import React14 from "react";
|
|
527
857
|
function readBasePath() {
|
|
528
858
|
const normalize = (val) => {
|
|
529
859
|
const raw = typeof val === "string" ? val.trim() : "";
|
|
@@ -586,18 +916,18 @@ function SearchPanelForm(props = {}) {
|
|
|
586
916
|
clearLabel = "Clear search"
|
|
587
917
|
} = props || {};
|
|
588
918
|
const text = typeof label === "string" && label.trim() ? label.trim() : buttonLabel;
|
|
589
|
-
const action =
|
|
919
|
+
const action = React14.useMemo(
|
|
590
920
|
() => resolveSearchPath(searchPath),
|
|
591
921
|
[searchPath]
|
|
592
922
|
);
|
|
593
|
-
const autoId = typeof
|
|
594
|
-
const [fallbackId] =
|
|
923
|
+
const autoId = typeof React14.useId === "function" ? React14.useId() : void 0;
|
|
924
|
+
const [fallbackId] = React14.useState(
|
|
595
925
|
() => `canopy-search-form-${Math.random().toString(36).slice(2, 10)}`
|
|
596
926
|
);
|
|
597
927
|
const inputId = inputIdProp || autoId || fallbackId;
|
|
598
|
-
const inputRef =
|
|
599
|
-
const [hasValue, setHasValue] =
|
|
600
|
-
const focusInput =
|
|
928
|
+
const inputRef = React14.useRef(null);
|
|
929
|
+
const [hasValue, setHasValue] = React14.useState(false);
|
|
930
|
+
const focusInput = React14.useCallback(() => {
|
|
601
931
|
const el = inputRef.current;
|
|
602
932
|
if (!el) return;
|
|
603
933
|
if (document.activeElement === el) return;
|
|
@@ -610,7 +940,7 @@ function SearchPanelForm(props = {}) {
|
|
|
610
940
|
}
|
|
611
941
|
}
|
|
612
942
|
}, []);
|
|
613
|
-
const handlePointerDown =
|
|
943
|
+
const handlePointerDown = React14.useCallback(
|
|
614
944
|
(event) => {
|
|
615
945
|
const target = event.target;
|
|
616
946
|
if (target && typeof target.closest === "function") {
|
|
@@ -622,23 +952,23 @@ function SearchPanelForm(props = {}) {
|
|
|
622
952
|
},
|
|
623
953
|
[focusInput]
|
|
624
954
|
);
|
|
625
|
-
|
|
955
|
+
React14.useEffect(() => {
|
|
626
956
|
const el = inputRef.current;
|
|
627
957
|
if (!el) return;
|
|
628
958
|
if (el.value && el.value.trim()) {
|
|
629
959
|
setHasValue(true);
|
|
630
960
|
}
|
|
631
961
|
}, []);
|
|
632
|
-
const handleInputChange =
|
|
962
|
+
const handleInputChange = React14.useCallback((event) => {
|
|
633
963
|
var _a;
|
|
634
964
|
const nextHasValue = Boolean(
|
|
635
965
|
((_a = event == null ? void 0 : event.target) == null ? void 0 : _a.value) && event.target.value.trim()
|
|
636
966
|
);
|
|
637
967
|
setHasValue(nextHasValue);
|
|
638
968
|
}, []);
|
|
639
|
-
const handleClear =
|
|
969
|
+
const handleClear = React14.useCallback((event) => {
|
|
640
970
|
}, []);
|
|
641
|
-
const handleClearKey =
|
|
971
|
+
const handleClearKey = React14.useCallback(
|
|
642
972
|
(event) => {
|
|
643
973
|
if (event.key === "Enter" || event.key === " ") {
|
|
644
974
|
event.preventDefault();
|
|
@@ -647,7 +977,7 @@ function SearchPanelForm(props = {}) {
|
|
|
647
977
|
},
|
|
648
978
|
[handleClear]
|
|
649
979
|
);
|
|
650
|
-
return /* @__PURE__ */
|
|
980
|
+
return /* @__PURE__ */ React14.createElement(
|
|
651
981
|
"form",
|
|
652
982
|
{
|
|
653
983
|
action,
|
|
@@ -659,7 +989,7 @@ function SearchPanelForm(props = {}) {
|
|
|
659
989
|
onPointerDown: handlePointerDown,
|
|
660
990
|
"data-has-value": hasValue ? "1" : "0"
|
|
661
991
|
},
|
|
662
|
-
/* @__PURE__ */
|
|
992
|
+
/* @__PURE__ */ React14.createElement("label", { htmlFor: inputId, className: "canopy-search-form__label" }, /* @__PURE__ */ React14.createElement(MagnifyingGlassIcon, { className: "canopy-search-form__icon" }), /* @__PURE__ */ React14.createElement(
|
|
663
993
|
"input",
|
|
664
994
|
{
|
|
665
995
|
id: inputId,
|
|
@@ -675,7 +1005,7 @@ function SearchPanelForm(props = {}) {
|
|
|
675
1005
|
onInput: handleInputChange
|
|
676
1006
|
}
|
|
677
1007
|
)),
|
|
678
|
-
hasValue ? /* @__PURE__ */
|
|
1008
|
+
hasValue ? /* @__PURE__ */ React14.createElement(
|
|
679
1009
|
"button",
|
|
680
1010
|
{
|
|
681
1011
|
type: "button",
|
|
@@ -688,32 +1018,32 @@ function SearchPanelForm(props = {}) {
|
|
|
688
1018
|
},
|
|
689
1019
|
"\xD7"
|
|
690
1020
|
) : null,
|
|
691
|
-
/* @__PURE__ */
|
|
1021
|
+
/* @__PURE__ */ React14.createElement(
|
|
692
1022
|
"button",
|
|
693
1023
|
{
|
|
694
1024
|
type: "submit",
|
|
695
1025
|
"data-canopy-search-form-trigger": "submit",
|
|
696
1026
|
className: "canopy-search-form__submit"
|
|
697
1027
|
},
|
|
698
|
-
/* @__PURE__ */
|
|
699
|
-
/* @__PURE__ */
|
|
1028
|
+
/* @__PURE__ */ React14.createElement("span", null, text),
|
|
1029
|
+
/* @__PURE__ */ React14.createElement("span", { "aria-hidden": true, className: "canopy-search-form__shortcut" }, /* @__PURE__ */ React14.createElement("span", null, "\u2318"), /* @__PURE__ */ React14.createElement("span", null, "K"))
|
|
700
1030
|
)
|
|
701
1031
|
);
|
|
702
1032
|
}
|
|
703
1033
|
|
|
704
1034
|
// ui/src/search/SearchPanelTeaserResults.jsx
|
|
705
|
-
import
|
|
1035
|
+
import React15 from "react";
|
|
706
1036
|
function SearchPanelTeaserResults(props = {}) {
|
|
707
1037
|
const { style, className } = props || {};
|
|
708
1038
|
const classes = ["canopy-search-teaser", className].filter(Boolean).join(" ");
|
|
709
|
-
return /* @__PURE__ */
|
|
1039
|
+
return /* @__PURE__ */ React15.createElement(
|
|
710
1040
|
"div",
|
|
711
1041
|
{
|
|
712
1042
|
"data-canopy-search-form-panel": true,
|
|
713
1043
|
className: classes || void 0,
|
|
714
1044
|
style
|
|
715
1045
|
},
|
|
716
|
-
/* @__PURE__ */
|
|
1046
|
+
/* @__PURE__ */ React15.createElement("div", { id: "cplist" })
|
|
717
1047
|
);
|
|
718
1048
|
}
|
|
719
1049
|
|
|
@@ -733,11 +1063,11 @@ function MdxSearchFormModal(props = {}) {
|
|
|
733
1063
|
const text = typeof label === "string" && label.trim() ? label.trim() : buttonLabel;
|
|
734
1064
|
const resolvedSearchPath = resolveSearchPath(searchPath);
|
|
735
1065
|
const data = { placeholder, hotkey, maxResults, groupOrder, label: text, searchPath: resolvedSearchPath };
|
|
736
|
-
return /* @__PURE__ */
|
|
1066
|
+
return /* @__PURE__ */ React16.createElement("div", { "data-canopy-search-form": true, className: "flex-1 min-w-0" }, /* @__PURE__ */ React16.createElement("div", { className: "relative w-full" }, /* @__PURE__ */ React16.createElement(SearchPanelForm, { placeholder, buttonLabel, label, searchPath: resolvedSearchPath }), /* @__PURE__ */ React16.createElement(SearchPanelTeaserResults, null)), /* @__PURE__ */ React16.createElement("script", { type: "application/json", dangerouslySetInnerHTML: { __html: JSON.stringify(data) } }));
|
|
737
1067
|
}
|
|
738
1068
|
|
|
739
1069
|
// ui/src/search/SearchPanel.jsx
|
|
740
|
-
import
|
|
1070
|
+
import React17 from "react";
|
|
741
1071
|
function SearchPanel(props = {}) {
|
|
742
1072
|
const {
|
|
743
1073
|
placeholder = "Search\u2026",
|
|
@@ -754,11 +1084,11 @@ function SearchPanel(props = {}) {
|
|
|
754
1084
|
const text = typeof label === "string" && label.trim() ? label.trim() : buttonLabel;
|
|
755
1085
|
const resolvedSearchPath = resolveSearchPath(searchPath);
|
|
756
1086
|
const data = { placeholder, hotkey, maxResults, groupOrder, label: text, searchPath: resolvedSearchPath };
|
|
757
|
-
return /* @__PURE__ */
|
|
1087
|
+
return /* @__PURE__ */ React17.createElement("div", { "data-canopy-search-form": true, className: "flex-1 min-w-0" }, /* @__PURE__ */ React17.createElement("div", { className: "relative w-full" }, /* @__PURE__ */ React17.createElement(SearchPanelForm, { placeholder, buttonLabel, label, searchPath: resolvedSearchPath }), /* @__PURE__ */ React17.createElement(SearchPanelTeaserResults, null)), /* @__PURE__ */ React17.createElement("script", { type: "application/json", dangerouslySetInnerHTML: { __html: JSON.stringify(data) } }));
|
|
758
1088
|
}
|
|
759
1089
|
|
|
760
1090
|
// ui/src/iiif/ManifestPrimitives.jsx
|
|
761
|
-
import
|
|
1091
|
+
import React18 from "react";
|
|
762
1092
|
import {
|
|
763
1093
|
Label as CloverLabel,
|
|
764
1094
|
Metadata as CloverMetadata,
|
|
@@ -783,29 +1113,30 @@ function ensureMetadata(items) {
|
|
|
783
1113
|
function Label({ manifest, label, ...rest }) {
|
|
784
1114
|
const intl = label || manifest && manifest.label;
|
|
785
1115
|
if (!hasInternationalValue(intl)) return null;
|
|
786
|
-
return /* @__PURE__ */
|
|
1116
|
+
return /* @__PURE__ */ React18.createElement(CloverLabel, { label: intl, ...rest });
|
|
787
1117
|
}
|
|
788
1118
|
function Summary({ manifest, summary, ...rest }) {
|
|
789
1119
|
const intl = summary || manifest && manifest.summary;
|
|
790
1120
|
if (!hasInternationalValue(intl)) return null;
|
|
791
|
-
return /* @__PURE__ */
|
|
1121
|
+
return /* @__PURE__ */ React18.createElement(CloverSummary, { summary: intl, ...rest });
|
|
792
1122
|
}
|
|
793
1123
|
function Metadata({ manifest, metadata, ...rest }) {
|
|
794
1124
|
const items = ensureMetadata(metadata || manifest && manifest.metadata);
|
|
795
1125
|
if (!items.length) return null;
|
|
796
|
-
return /* @__PURE__ */
|
|
1126
|
+
return /* @__PURE__ */ React18.createElement(CloverMetadata, { metadata: items, ...rest });
|
|
797
1127
|
}
|
|
798
1128
|
function RequiredStatement({ manifest, requiredStatement, ...rest }) {
|
|
799
1129
|
const stmt = requiredStatement || manifest && manifest.requiredStatement;
|
|
800
1130
|
if (!stmt || !hasInternationalValue(stmt.label) || !hasInternationalValue(stmt.value)) {
|
|
801
1131
|
return null;
|
|
802
1132
|
}
|
|
803
|
-
return /* @__PURE__ */
|
|
1133
|
+
return /* @__PURE__ */ React18.createElement(CloverRequiredStatement, { requiredStatement: stmt, ...rest });
|
|
804
1134
|
}
|
|
805
1135
|
export {
|
|
806
1136
|
HelloWorld,
|
|
807
1137
|
interstitials_exports as Interstitials,
|
|
808
1138
|
Label,
|
|
1139
|
+
Layout,
|
|
809
1140
|
Metadata,
|
|
810
1141
|
MdxRelatedItems as RelatedItems,
|
|
811
1142
|
RequiredStatement,
|
package/ui/dist/server.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/HelloWorld.jsx", "../src/iiif/Viewer.jsx", "../src/iiif/Slider.jsx", "../src/iiif/Scroll.jsx", "../src/iiif/MdxRelatedItems.jsx", "../src/interstitials/index.js", "../src/interstitials/Hero.jsx", "../src/interstitials/hero-utils.js", "../src/layout/SubNavigation.jsx", "../src/search/MdxSearchResults.jsx", "../src/search/SearchSummary.jsx", "../src/search/MdxSearchTabs.jsx", "../src/search-form/MdxSearchFormModal.jsx", "../src/Icons.jsx", "../src/search/SearchPanelForm.jsx", "../src/search/SearchPanelTeaserResults.jsx", "../src/search/SearchPanel.jsx", "../src/iiif/ManifestPrimitives.jsx"],
|
|
4
|
-
"sourcesContent": ["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, { useEffect, useState } from \"react\";\n\n// SSR-safe wrapper around Clover's scroll component. The library touches the DOM\n// during import, so we only load it in the browser and render a placeholder on the\n// server for the hydration runtime to mount.\nexport const Scroll = (props) => {\n const [CloverScroll, setCloverScroll] = 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/scroll\")\n .then((mod) => {\n if (!mounted) return;\n const Comp = mod && (mod.default || mod.Scroll || mod);\n setCloverScroll(() => Comp);\n })\n .catch(() => {\n // Silently ignore load errors during SSR or when Clover is unavailable.\n });\n }\n return () => {\n mounted = false;\n };\n }, []);\n\n if (!CloverScroll) {\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-scroll=\"1\" className=\"not-prose\">\n <script\n type=\"application/json\"\n dangerouslySetInnerHTML={{ __html: json }}\n />\n </div>\n );\n }\n\n return <CloverScroll {...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", "export { default as Hero } from './Hero.jsx';\nexport { computeHeroHeightStyle } from './hero-utils.js';\n", "import React from \"react\";\nimport helpers from \"../../../lib/components/featured.js\";\nimport {computeHeroHeightStyle} from \"./hero-utils.js\";\n\nconst basePath = (() => {\n try {\n const raw =\n typeof process !== \"undefined\" && process && process.env\n ? String(process.env.CANOPY_BASE_PATH || \"\")\n : \"\";\n return raw.replace(/\\/$/, \"\");\n } catch (_) {\n return \"\";\n }\n})();\n\nfunction applyBasePath(href) {\n try {\n if (!href) return href;\n if (!basePath) return href;\n if (typeof href === \"string\" && href.startsWith(\"/\")) {\n return `${basePath}${href}`;\n }\n } catch (_) {}\n return href;\n}\n\nfunction resolveFeaturedItem({item, index, random}) {\n if (item) return item;\n const list =\n helpers && helpers.readFeaturedFromCacheSync\n ? helpers.readFeaturedFromCacheSync()\n : [];\n if (!list.length) return null;\n if (typeof index === \"number\") {\n const idx = Math.max(0, Math.min(list.length - 1, Math.floor(index)));\n return list[idx];\n }\n if (random === true || random === \"true\") {\n const idx = Math.floor(Math.random() * Math.max(1, list.length));\n return list[idx];\n }\n return list[0];\n}\n\nfunction normalizeLinks(links) {\n if (!Array.isArray(links)) return [];\n return links\n .map((link) => {\n if (!link) return null;\n const href = applyBasePath(link.href || \"\");\n const title = link.title ? String(link.title) : \"\";\n if (!href || !title) return null;\n const type = link.type === \"secondary\" ? \"secondary\" : \"primary\";\n return {href, title, type};\n })\n .filter(Boolean);\n}\n\nfunction sanitizeRest(rest) {\n const clone = {...rest};\n try {\n delete clone.random;\n delete clone.index;\n delete clone.item;\n delete clone.links;\n delete clone.overlay;\n delete clone.variant;\n delete clone.background;\n } catch (_) {}\n return clone;\n}\n\nfunction normalizeBackground(value) {\n try {\n const allowed = new Set([\"theme\", \"transparent\"]);\n const raw = value == null ? \"\" : String(value);\n const normalized = raw.trim().toLowerCase();\n return allowed.has(normalized) ? normalized : \"theme\";\n } catch (_) {\n return \"theme\";\n }\n}\n\nexport default function Hero({\n height = 520,\n item,\n index,\n random = true,\n headline,\n description,\n links = [],\n className = \"\",\n style = {},\n background = \"theme\",\n ...rest\n}) {\n const resolved = resolveFeaturedItem({item, index, random});\n const helpersList =\n helpers && helpers.readFeaturedFromCacheSync\n ? helpers.readFeaturedFromCacheSync()\n : [];\n\n const slides = [];\n const pushUnique = (entry) => {\n if (!entry) return;\n const key = String(entry.href || entry.id || entry.title || \"\");\n const hasKey = slides.some(\n (item) =>\n String(item && (item.href || item.id || item.title || \"\")) === key\n );\n if (!hasKey) {\n slides.push(entry);\n }\n };\n\n if (resolved) pushUnique(resolved);\n helpersList.forEach(pushUnique);\n\n if (!slides.length) return null;\n\n let orderedSlides = slides.slice();\n if (typeof index === \"number\" && orderedSlides.length > 1) {\n const clamp = Math.max(\n 0,\n Math.min(orderedSlides.length - 1, Math.floor(index))\n );\n if (clamp > 0) {\n orderedSlides = orderedSlides\n .slice(clamp)\n .concat(orderedSlides.slice(0, clamp));\n }\n } else if (random === true || random === \"true\") {\n const rand = Math.floor(Math.random() * orderedSlides.length);\n if (rand > 0) {\n orderedSlides = orderedSlides\n .slice(rand)\n .concat(orderedSlides.slice(0, rand));\n }\n }\n\n const heroHeight = computeHeroHeightStyle(height);\n const heroStyles = {...(style || {})};\n if (heroHeight && heroHeight.height) {\n heroStyles[\"--hero-height\"] = heroHeight.height;\n }\n\n const derivedDescription = description ? String(description) : \"\";\n const normalizedLinks = normalizeLinks(links);\n\n const primarySlide = orderedSlides[0] || null;\n const overlayTitle = headline || (primarySlide && primarySlide.title) || \"\";\n const defaultLinkHref = applyBasePath(\n primarySlide && primarySlide.href ? primarySlide.href : \"#\"\n );\n const overlayLinks = normalizedLinks.length\n ? normalizedLinks\n : [\n {\n href: defaultLinkHref,\n title: \"View work\",\n type: \"primary\",\n },\n ];\n\n const normalizedBackground = normalizeBackground(background);\n const backgroundClassName =\n normalizedBackground === \"transparent\"\n ? \"canopy-interstitial--bg-transparent\"\n : \"\";\n\n const containerClassName = [\n \"canopy-interstitial\",\n \"canopy-interstitial--hero\",\n backgroundClassName,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const renderSlide = (\n slide,\n idx,\n { showVeil = true, captionVariant = \"overlay\" } = {}\n ) => {\n const safeHref = applyBasePath(slide.href || \"#\");\n const isStaticCaption = captionVariant === \"static\";\n const paneClassName = [\n \"canopy-interstitial__pane\",\n showVeil ? \"\" : \"canopy-interstitial__pane--flat\",\n isStaticCaption ? \"canopy-interstitial__pane--static\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n if (isStaticCaption) {\n return (\n <div className=\"swiper-slide\" key={safeHref || idx}>\n <article className={paneClassName}>\n {slide.thumbnail ? (\n <div className=\"canopy-interstitial__media-frame\">\n <img\n src={slide.thumbnail}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"canopy-interstitial__media canopy-interstitial__media--static\"\n loading={idx === 0 ? \"eager\" : \"lazy\"}\n />\n </div>\n ) : null}\n {slide.title ? (\n <div className=\"canopy-interstitial__caption canopy-interstitial__caption--static\">\n <a href={safeHref} className=\"canopy-interstitial__caption-link\">\n {slide.title}\n </a>\n </div>\n ) : null}\n </article>\n </div>\n );\n }\n\n return (\n <div className=\"swiper-slide\" key={safeHref || idx}>\n <article className={paneClassName}>\n {slide.thumbnail ? (\n <img\n src={slide.thumbnail}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"canopy-interstitial__media\"\n loading={idx === 0 ? \"eager\" : \"lazy\"}\n />\n ) : null}\n {showVeil ? (\n <div className=\"canopy-interstitial__veil\" aria-hidden=\"true\" />\n ) : null}\n {slide.title ? (\n <div className=\"canopy-interstitial__caption\">\n <a href={safeHref} className=\"canopy-interstitial__caption-link\">\n {slide.title}\n </a>\n </div>\n ) : null}\n </article>\n </div>\n );\n };\n\n const renderSlider = (options = {}) => (\n <div className=\"canopy-interstitial__slider swiper\">\n <div className=\"swiper-wrapper\">\n {orderedSlides.map((slide, idx) => renderSlide(slide, idx, options))}\n </div>\n <div className=\"canopy-interstitial__nav\">\n <button\n type=\"button\"\n aria-label=\"Previous slide\"\n className=\"canopy-interstitial__nav-btn canopy-interstitial__nav-btn--prev swiper-button-prev\"\n />\n <button\n type=\"button\"\n aria-label=\"Next slide\"\n className=\"canopy-interstitial__nav-btn canopy-interstitial__nav-btn--next swiper-button-next\"\n />\n </div>\n <div className=\"canopy-interstitial__pagination swiper-pagination\" />\n </div>\n );\n\n const overlayContent = (\n <>\n {overlayTitle ? (\n <h1 className=\"canopy-interstitial__headline\">{overlayTitle}</h1>\n ) : null}\n {derivedDescription ? (\n <p className=\"canopy-interstitial__description\">\n {derivedDescription}\n </p>\n ) : null}\n {overlayLinks.length ? (\n <div className=\"canopy-interstitial__actions\">\n {overlayLinks.map((link) => (\n <a\n key={`${link.href}-${link.title}`}\n href={link.href}\n className={\n link.type === \"secondary\"\n ? \"canopy-button canopy-button--secondary\"\n : \"canopy-button canopy-button--primary\"\n }\n >\n {link.title}\n </a>\n ))}\n </div>\n ) : null}\n </>\n );\n\n const cleanedProps = sanitizeRest(rest);\n\n return (\n <section\n className={containerClassName}\n data-canopy-hero-slider=\"1\"\n style={heroStyles}\n {...cleanedProps}\n >\n <div className=\"canopy-interstitial__layout\">\n <div className=\"canopy-interstitial__panel\">\n <div className=\"canopy-interstitial__body\">{overlayContent}</div>\n </div>\n <div className=\"canopy-interstitial__media-group\">\n {renderSlider({ showVeil: false, captionVariant: \"static\" })}\n </div>\n </div>\n </section>\n );\n}\n", "function computeHeroHeightStyle(height) {\n const h = typeof height === 'number' ? `${height}px` : String(height || '').trim();\n const val = h || '360px';\n return { width: '100%', height: val };\n}\n\nexport { computeHeroHeightStyle };\nexport default computeHeroHeightStyle;\n", "import React from \"react\";\nimport navigationHelpers from \"../../../lib/components/navigation.js\";\n\nfunction resolveRelativeCandidate(page, current) {\n if (page && typeof page.relativePath === \"string\" && page.relativePath) return page.relativePath;\n if (page && typeof page.slug === \"string\" && page.slug) return page.slug;\n if (typeof current === \"string\" && current) return current;\n return \"\";\n}\n\nfunction renderNodes(nodes, parentKey = \"node\") {\n if (!Array.isArray(nodes) || !nodes.length) return null;\n return nodes.map((node, index) => {\n if (!node) return null;\n const key = node.slug || node.relativePath || `${parentKey}-${index}`;\n const hasChildren = Array.isArray(node.children) && node.children.length > 0;\n const showChildren = hasChildren && (node.isExpanded || node.depth === 0);\n const depth = typeof node.depth === \"number\" ? Math.max(0, node.depth) : 0;\n const depthClass = `depth-${Math.min(depth, 5)}`;\n const classes = [\n \"canopy-sub-navigation__link\",\n depthClass,\n ];\n if (!node.href) classes.push(\"is-label\");\n if (node.isActive) classes.push(\"is-active\");\n const linkClass = classes.join(\" \");\n const Tag = node.href ? \"a\" : \"span\";\n return (\n <li\n key={key}\n className=\"canopy-sub-navigation__item\"\n data-depth={depth}\n >\n <Tag\n className={linkClass}\n href={node.href || undefined}\n aria-current={node.isActive ? \"page\" : undefined}\n >\n {node.title || node.slug}\n </Tag>\n {showChildren ? (\n <ul className=\"canopy-sub-navigation__list canopy-sub-navigation__list--nested\" role=\"list\">\n {renderNodes(node.children, key)}\n </ul>\n ) : null}\n </li>\n );\n });\n}\n\nexport default function SubNavigation({\n navigation: navigationProp,\n page,\n current,\n className = \"\",\n style = {},\n heading,\n ariaLabel,\n}) {\n const PageContext = navigationHelpers && navigationHelpers.getPageContext\n ? navigationHelpers.getPageContext()\n : null;\n const context = PageContext ? React.useContext(PageContext) : null;\n const contextNavigation = context && context.navigation ? context.navigation : null;\n const contextPage = context && context.page ? context.page : null;\n const effectiveNavigation = navigationProp || contextNavigation;\n const effectivePage = page || contextPage;\n const resolvedNavigation = React.useMemo(() => {\n if (effectiveNavigation && effectiveNavigation.root) return effectiveNavigation;\n const candidate = resolveRelativeCandidate(effectivePage, current);\n if (!candidate) return effectiveNavigation || null;\n const helpers = navigationHelpers && navigationHelpers.buildNavigationForFile ? navigationHelpers : null;\n if (!helpers) return effectiveNavigation || null;\n try {\n const normalized = navigationHelpers.normalizeRelativePath\n ? navigationHelpers.normalizeRelativePath(candidate)\n : candidate;\n const built = helpers.buildNavigationForFile(normalized);\n if (built) return built;\n } catch (_) {\n // ignore helper errors and fall back to provided navigation\n }\n return effectiveNavigation || null;\n }, [effectiveNavigation, effectivePage, current]);\n\n if (!resolvedNavigation || !resolvedNavigation.root) return null;\n\n const rootNode = resolvedNavigation.root;\n const finalHeading = heading || null;\n const labelSource = finalHeading || resolvedNavigation.title;\n const navLabel = ariaLabel || (labelSource ? `${labelSource} navigation` : \"Section navigation\");\n const combinedClassName = [\"canopy-sub-navigation\", className].filter(Boolean).join(\" \");\n const inlineStyle = { ...style };\n if (!Object.prototype.hasOwnProperty.call(inlineStyle, \"--sub-nav-indent\")) {\n inlineStyle[\"--sub-nav-indent\"] = \"0.85rem\";\n }\n\n return (\n <nav className={combinedClassName} style={inlineStyle} aria-label={navLabel}>\n {finalHeading ? (\n <div className=\"canopy-sub-navigation__heading\">{finalHeading}</div>\n ) : null}\n <ul className=\"canopy-sub-navigation__list\" role=\"list\">\n {renderNodes([rootNode], rootNode.slug || \"root\")}\n </ul>\n </nav>\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 MdxSearchTabs(props) {\n let json = '{}';\n try { json = JSON.stringify(props || {}); } catch (_) { json = '{}'; }\n return (\n <div data-canopy-search-tabs=\"1\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n\n", "import React from 'react';\nimport SearchPanelForm, { resolveSearchPath } from '../search/SearchPanelForm.jsx';\nimport SearchPanelTeaserResults from '../search/SearchPanelTeaserResults.jsx';\n\n// SSR-safe placeholder for the search form modal, composed from SearchPanel parts.\n// This ensures a single JSX source of truth for form/panel markup.\nexport default function MdxSearchFormModal(props = {}) {\n const {\n placeholder = 'Search\u2026',\n hotkey = 'mod+k',\n maxResults = 8,\n groupOrder = ['work', 'page'],\n button = true, // kept for backward compat; ignored by teaser form\n buttonLabel = 'Search',\n label,\n searchPath = '/search',\n } = props || {};\n\n const text = typeof label === 'string' && label.trim() ? label.trim() : buttonLabel;\n const resolvedSearchPath = resolveSearchPath(searchPath);\n const data = { placeholder, hotkey, maxResults, groupOrder, label: text, searchPath: resolvedSearchPath };\n return (\n <div data-canopy-search-form className=\"flex-1 min-w-0\">\n <div className=\"relative w-full\">\n <SearchPanelForm placeholder={placeholder} buttonLabel={buttonLabel} label={label} searchPath={resolvedSearchPath} />\n <SearchPanelTeaserResults />\n </div>\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: JSON.stringify(data) }} />\n </div>\n );\n}\n", "import React from \"react\";\n\nexport const MagnifyingGlassIcon = (props) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\" {...props}>\n <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\" />\n </svg>\n);\n", "import {MagnifyingGlassIcon} from \"../Icons\";\nimport React from \"react\";\n\nfunction readBasePath() {\n const normalize = (val) => {\n const raw = typeof val === \"string\" ? val.trim() : \"\";\n if (!raw) return \"\";\n return raw.replace(/\\/+$/, \"\");\n };\n try {\n if (typeof window !== \"undefined\" && window.CANOPY_BASE_PATH != null) {\n const fromWindow = normalize(window.CANOPY_BASE_PATH);\n if (fromWindow) return fromWindow;\n }\n } catch (_) {}\n try {\n if (\n typeof globalThis !== \"undefined\" &&\n globalThis.CANOPY_BASE_PATH != null\n ) {\n const fromGlobal = normalize(globalThis.CANOPY_BASE_PATH);\n if (fromGlobal) return fromGlobal;\n }\n } catch (_) {}\n try {\n if (\n typeof process !== \"undefined\" &&\n process.env &&\n process.env.CANOPY_BASE_PATH\n ) {\n const fromEnv = normalize(process.env.CANOPY_BASE_PATH);\n if (fromEnv) return fromEnv;\n }\n } catch (_) {}\n return \"\";\n}\n\nfunction isAbsoluteUrl(href) {\n try {\n return /^https?:/i.test(String(href || \"\"));\n } catch (_) {\n return false;\n }\n}\n\nexport function resolveSearchPath(pathValue) {\n let raw = typeof pathValue === \"string\" ? pathValue.trim() : \"\";\n if (!raw) raw = \"/search\";\n if (isAbsoluteUrl(raw)) return raw;\n const normalizedPath = raw.startsWith(\"/\") ? raw : `/${raw}`;\n const base = readBasePath();\n if (!base) return normalizedPath;\n const baseWithLead = base.startsWith(\"/\") ? base : `/${base}`;\n const baseTrimmed = baseWithLead.replace(/\\/+$/, \"\");\n if (!baseTrimmed) return normalizedPath;\n if (\n normalizedPath === baseTrimmed ||\n normalizedPath.startsWith(`${baseTrimmed}/`)\n ) {\n return normalizedPath;\n }\n const pathTrimmed = normalizedPath.replace(/^\\/+/, \"\");\n return `${baseTrimmed}/${pathTrimmed}`;\n}\n\nexport default function SearchPanelForm(props = {}) {\n const {\n placeholder = \"Search\u2026\",\n buttonLabel = \"Search\",\n label,\n searchPath = \"/search\",\n inputId: inputIdProp,\n clearLabel = \"Clear search\",\n } = props || {};\n\n const text =\n typeof label === \"string\" && label.trim() ? label.trim() : buttonLabel;\n const action = React.useMemo(\n () => resolveSearchPath(searchPath),\n [searchPath]\n );\n const autoId = typeof React.useId === \"function\" ? React.useId() : undefined;\n const [fallbackId] = React.useState(\n () => `canopy-search-form-${Math.random().toString(36).slice(2, 10)}`\n );\n const inputId = inputIdProp || autoId || fallbackId;\n const inputRef = React.useRef(null);\n const [hasValue, setHasValue] = React.useState(false);\n\n const focusInput = React.useCallback(() => {\n const el = inputRef.current;\n if (!el) return;\n if (document.activeElement === el) return;\n try {\n el.focus({preventScroll: true});\n } catch (_) {\n try {\n el.focus();\n } catch (_) {}\n }\n }, []);\n\n const handlePointerDown = React.useCallback(\n (event) => {\n const target = event.target;\n if (target && typeof target.closest === \"function\") {\n if (target.closest(\"[data-canopy-search-form-trigger]\")) return;\n if (target.closest(\"[data-canopy-search-form-clear]\")) return;\n }\n event.preventDefault();\n focusInput();\n },\n [focusInput]\n );\n\n React.useEffect(() => {\n const el = inputRef.current;\n if (!el) return;\n if (el.value && el.value.trim()) {\n setHasValue(true);\n }\n }, []);\n\n const handleInputChange = React.useCallback((event) => {\n const nextHasValue = Boolean(\n event?.target?.value && event.target.value.trim()\n );\n setHasValue(nextHasValue);\n }, []);\n\n const handleClear = React.useCallback((event) => {}, []);\n\n const handleClearKey = React.useCallback(\n (event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n handleClear(event);\n }\n },\n [handleClear]\n );\n\n return (\n <form\n action={action}\n method=\"get\"\n role=\"search\"\n autoComplete=\"off\"\n spellCheck=\"false\"\n className=\"canopy-search-form canopy-search-form-shell\"\n onPointerDown={handlePointerDown}\n data-has-value={hasValue ? \"1\" : \"0\"}\n >\n <label htmlFor={inputId} className=\"canopy-search-form__label\">\n <MagnifyingGlassIcon className=\"canopy-search-form__icon\" />\n <input\n id={inputId}\n type=\"search\"\n name=\"q\"\n inputMode=\"search\"\n data-canopy-search-form-input\n placeholder={placeholder}\n className=\"canopy-search-form__input\"\n aria-label=\"Search\"\n ref={inputRef}\n onChange={handleInputChange}\n onInput={handleInputChange}\n />\n </label>\n {hasValue ? (\n <button\n type=\"button\"\n className=\"canopy-search-form__clear\"\n onClick={handleClear}\n onPointerDown={(event) => event.stopPropagation()}\n onKeyDown={handleClearKey}\n aria-label={clearLabel}\n data-canopy-search-form-clear\n >\n \u00D7\n </button>\n ) : null}\n <button\n type=\"submit\"\n data-canopy-search-form-trigger=\"submit\"\n className=\"canopy-search-form__submit\"\n >\n <span>{text}</span>\n <span aria-hidden className=\"canopy-search-form__shortcut\">\n <span>\u2318</span>\n <span>K</span>\n </span>\n </button>\n </form>\n );\n}\n", "import React from \"react\";\n\n// SSR placeholder for teaser results panel; the runtime controls visibility and content.\nexport default function SearchPanelTeaserResults(props = {}) {\n const { style, className } = props || {};\n const classes = [\"canopy-search-teaser\", className]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div\n data-canopy-search-form-panel\n className={classes || undefined}\n style={style}\n >\n <div id=\"cplist\" />\n </div>\n );\n}\n", "import React from 'react';\nimport SearchPanelForm, { resolveSearchPath } from './SearchPanelForm.jsx';\nimport SearchPanelTeaserResults from './SearchPanelTeaserResults.jsx';\n\n// High-level SearchPanel composed of a teaser form and teaser results panel.\n// Encodes configuration as JSON for the client runtime.\nexport default function SearchPanel(props = {}) {\n const {\n placeholder = 'Search\u2026',\n hotkey = 'mod+k',\n maxResults = 8,\n groupOrder = ['work', 'docs', 'page'],\n // Kept for backward compat; form always renders submit\n button = true, // eslint-disable-line no-unused-vars\n buttonLabel = 'Search',\n label,\n searchPath = '/search',\n } = props || {};\n\n const text = typeof label === 'string' && label.trim() ? label.trim() : buttonLabel;\n const resolvedSearchPath = resolveSearchPath(searchPath);\n const data = { placeholder, hotkey, maxResults, groupOrder, label: text, searchPath: resolvedSearchPath };\n\n return (\n <div data-canopy-search-form className=\"flex-1 min-w-0\">\n <div className=\"relative w-full\">\n <SearchPanelForm placeholder={placeholder} buttonLabel={buttonLabel} label={label} searchPath={resolvedSearchPath} />\n <SearchPanelTeaserResults />\n </div>\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: JSON.stringify(data) }} />\n </div>\n );\n}\n", "import React from \"react\";\nimport {\n Label as CloverLabel,\n Metadata as CloverMetadata,\n RequiredStatement as CloverRequiredStatement,\n Summary as CloverSummary,\n} from \"@samvera/clover-iiif/primitives\";\n\nfunction hasInternationalValue(value) {\n if (!value || typeof value !== \"object\") return false;\n return Object.keys(value).some((key) => {\n const entries = value[key];\n return (\n Array.isArray(entries) &&\n entries.some((entry) => String(entry || \"\").trim().length > 0)\n );\n });\n}\n\nfunction ensureMetadata(items) {\n if (!Array.isArray(items)) return [];\n return items.filter((item) => {\n if (!item || typeof item !== \"object\") return false;\n const { label, value } = item;\n return hasInternationalValue(label) && hasInternationalValue(value);\n });\n}\n\nexport function Label({ manifest, label, ...rest }) {\n const intl = label || (manifest && manifest.label);\n if (!hasInternationalValue(intl)) return null;\n return <CloverLabel label={intl} {...rest} />;\n}\n\nexport function Summary({ manifest, summary, ...rest }) {\n const intl = summary || (manifest && manifest.summary);\n if (!hasInternationalValue(intl)) return null;\n return <CloverSummary summary={intl} {...rest} />;\n}\n\nexport function Metadata({ manifest, metadata, ...rest }) {\n const items = ensureMetadata(metadata || (manifest && manifest.metadata));\n if (!items.length) return null;\n return <CloverMetadata metadata={items} {...rest} />;\n}\n\nexport function RequiredStatement({ manifest, requiredStatement, ...rest }) {\n const stmt = requiredStatement || (manifest && manifest.requiredStatement);\n if (\n !stmt ||\n !hasInternationalValue(stmt.label) ||\n !hasInternationalValue(stmt.value)\n ) {\n return null;\n }\n return <CloverRequiredStatement requiredStatement={stmt} {...rest} />;\n}\n\nexport const Primitives = {\n Label,\n Summary,\n Metadata,\n RequiredStatement,\n};\n\nexport default Primitives;\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["React", "React", "useEffect", "useState", "React", "useEffect", "useState", "React", "React", "item", "React", "React", "helpers", "React", "React", "React", "React", "React", "React", "_", "React", "React", "React", "React", "React"]
|
|
3
|
+
"sources": ["../src/HelloWorld.jsx", "../src/iiif/Viewer.jsx", "../src/iiif/Slider.jsx", "../src/iiif/Scroll.jsx", "../src/iiif/MdxRelatedItems.jsx", "../src/interstitials/index.js", "../src/interstitials/Hero.jsx", "../src/interstitials/hero-utils.js", "../src/layout/SubNavigation.jsx", "../src/layout/Layout.jsx", "../src/layout/ContentNavigation.jsx", "../src/search/MdxSearchResults.jsx", "../src/search/SearchSummary.jsx", "../src/search/MdxSearchTabs.jsx", "../src/search-form/MdxSearchFormModal.jsx", "../src/Icons.jsx", "../src/search/SearchPanelForm.jsx", "../src/search/SearchPanelTeaserResults.jsx", "../src/search/SearchPanel.jsx", "../src/iiif/ManifestPrimitives.jsx"],
|
|
4
|
+
"sourcesContent": ["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, { useEffect, useState } from \"react\";\n\n// SSR-safe wrapper around Clover's scroll component. The library touches the DOM\n// during import, so we only load it in the browser and render a placeholder on the\n// server for the hydration runtime to mount.\nexport const Scroll = (props) => {\n const [CloverScroll, setCloverScroll] = 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/scroll\")\n .then((mod) => {\n if (!mounted) return;\n const Comp = mod && (mod.default || mod.Scroll || mod);\n setCloverScroll(() => Comp);\n })\n .catch(() => {\n // Silently ignore load errors during SSR or when Clover is unavailable.\n });\n }\n return () => {\n mounted = false;\n };\n }, []);\n\n if (!CloverScroll) {\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-scroll=\"1\" className=\"not-prose\">\n <script\n type=\"application/json\"\n dangerouslySetInnerHTML={{ __html: json }}\n />\n </div>\n );\n }\n\n return <CloverScroll {...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", "export { default as Hero } from './Hero.jsx';\nexport { computeHeroHeightStyle } from './hero-utils.js';\n", "import React from \"react\";\nimport helpers from \"../../../lib/components/featured.js\";\nimport {computeHeroHeightStyle} from \"./hero-utils.js\";\n\nconst basePath = (() => {\n try {\n const raw =\n typeof process !== \"undefined\" && process && process.env\n ? String(process.env.CANOPY_BASE_PATH || \"\")\n : \"\";\n return raw.replace(/\\/$/, \"\");\n } catch (_) {\n return \"\";\n }\n})();\n\nfunction applyBasePath(href) {\n try {\n if (!href) return href;\n if (!basePath) return href;\n if (typeof href === \"string\" && href.startsWith(\"/\")) {\n return `${basePath}${href}`;\n }\n } catch (_) {}\n return href;\n}\n\nfunction resolveFeaturedItem({item, index, random}) {\n if (item) return item;\n const list =\n helpers && helpers.readFeaturedFromCacheSync\n ? helpers.readFeaturedFromCacheSync()\n : [];\n if (!list.length) return null;\n if (typeof index === \"number\") {\n const idx = Math.max(0, Math.min(list.length - 1, Math.floor(index)));\n return list[idx];\n }\n if (random === true || random === \"true\") {\n const idx = Math.floor(Math.random() * Math.max(1, list.length));\n return list[idx];\n }\n return list[0];\n}\n\nfunction normalizeLinks(links) {\n if (!Array.isArray(links)) return [];\n return links\n .map((link) => {\n if (!link) return null;\n const href = applyBasePath(link.href || \"\");\n const title = link.title ? String(link.title) : \"\";\n if (!href || !title) return null;\n const type = link.type === \"secondary\" ? \"secondary\" : \"primary\";\n return {href, title, type};\n })\n .filter(Boolean);\n}\n\nfunction sanitizeRest(rest) {\n const clone = {...rest};\n try {\n delete clone.random;\n delete clone.index;\n delete clone.item;\n delete clone.links;\n delete clone.overlay;\n delete clone.variant;\n delete clone.background;\n } catch (_) {}\n return clone;\n}\n\nfunction normalizeBackground(value) {\n try {\n const allowed = new Set([\"theme\", \"transparent\"]);\n const raw = value == null ? \"\" : String(value);\n const normalized = raw.trim().toLowerCase();\n return allowed.has(normalized) ? normalized : \"theme\";\n } catch (_) {\n return \"theme\";\n }\n}\n\nexport default function Hero({\n height = 520,\n item,\n index,\n random = true,\n headline,\n description,\n links = [],\n className = \"\",\n style = {},\n background = \"theme\",\n ...rest\n}) {\n const resolved = resolveFeaturedItem({item, index, random});\n const helpersList =\n helpers && helpers.readFeaturedFromCacheSync\n ? helpers.readFeaturedFromCacheSync()\n : [];\n\n const slides = [];\n const pushUnique = (entry) => {\n if (!entry) return;\n const key = String(entry.href || entry.id || entry.title || \"\");\n const hasKey = slides.some(\n (item) =>\n String(item && (item.href || item.id || item.title || \"\")) === key\n );\n if (!hasKey) {\n slides.push(entry);\n }\n };\n\n if (resolved) pushUnique(resolved);\n helpersList.forEach(pushUnique);\n\n if (!slides.length) return null;\n\n let orderedSlides = slides.slice();\n if (typeof index === \"number\" && orderedSlides.length > 1) {\n const clamp = Math.max(\n 0,\n Math.min(orderedSlides.length - 1, Math.floor(index))\n );\n if (clamp > 0) {\n orderedSlides = orderedSlides\n .slice(clamp)\n .concat(orderedSlides.slice(0, clamp));\n }\n } else if (random === true || random === \"true\") {\n const rand = Math.floor(Math.random() * orderedSlides.length);\n if (rand > 0) {\n orderedSlides = orderedSlides\n .slice(rand)\n .concat(orderedSlides.slice(0, rand));\n }\n }\n\n const heroHeight = computeHeroHeightStyle(height);\n const heroStyles = {...(style || {})};\n if (heroHeight && heroHeight.height) {\n heroStyles[\"--hero-height\"] = heroHeight.height;\n }\n\n const derivedDescription = description ? String(description) : \"\";\n const normalizedLinks = normalizeLinks(links);\n\n const primarySlide = orderedSlides[0] || null;\n const overlayTitle = headline || (primarySlide && primarySlide.title) || \"\";\n const defaultLinkHref = applyBasePath(\n primarySlide && primarySlide.href ? primarySlide.href : \"#\"\n );\n const overlayLinks = normalizedLinks.length\n ? normalizedLinks\n : [\n {\n href: defaultLinkHref,\n title: \"View work\",\n type: \"primary\",\n },\n ];\n\n const normalizedBackground = normalizeBackground(background);\n const backgroundClassName =\n normalizedBackground === \"transparent\"\n ? \"canopy-interstitial--bg-transparent\"\n : \"\";\n\n const containerClassName = [\n \"canopy-interstitial\",\n \"canopy-interstitial--hero\",\n backgroundClassName,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const renderSlide = (\n slide,\n idx,\n { showVeil = true, captionVariant = \"overlay\" } = {}\n ) => {\n const safeHref = applyBasePath(slide.href || \"#\");\n const isStaticCaption = captionVariant === \"static\";\n const paneClassName = [\n \"canopy-interstitial__pane\",\n showVeil ? \"\" : \"canopy-interstitial__pane--flat\",\n isStaticCaption ? \"canopy-interstitial__pane--static\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n if (isStaticCaption) {\n return (\n <div className=\"swiper-slide\" key={safeHref || idx}>\n <article className={paneClassName}>\n {slide.thumbnail ? (\n <div className=\"canopy-interstitial__media-frame\">\n <img\n src={slide.thumbnail}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"canopy-interstitial__media canopy-interstitial__media--static\"\n loading={idx === 0 ? \"eager\" : \"lazy\"}\n />\n </div>\n ) : null}\n {slide.title ? (\n <div className=\"canopy-interstitial__caption canopy-interstitial__caption--static\">\n <a href={safeHref} className=\"canopy-interstitial__caption-link\">\n {slide.title}\n </a>\n </div>\n ) : null}\n </article>\n </div>\n );\n }\n\n return (\n <div className=\"swiper-slide\" key={safeHref || idx}>\n <article className={paneClassName}>\n {slide.thumbnail ? (\n <img\n src={slide.thumbnail}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"canopy-interstitial__media\"\n loading={idx === 0 ? \"eager\" : \"lazy\"}\n />\n ) : null}\n {showVeil ? (\n <div className=\"canopy-interstitial__veil\" aria-hidden=\"true\" />\n ) : null}\n {slide.title ? (\n <div className=\"canopy-interstitial__caption\">\n <a href={safeHref} className=\"canopy-interstitial__caption-link\">\n {slide.title}\n </a>\n </div>\n ) : null}\n </article>\n </div>\n );\n };\n\n const renderSlider = (options = {}) => (\n <div className=\"canopy-interstitial__slider swiper\">\n <div className=\"swiper-wrapper\">\n {orderedSlides.map((slide, idx) => renderSlide(slide, idx, options))}\n </div>\n <div className=\"canopy-interstitial__nav\">\n <button\n type=\"button\"\n aria-label=\"Previous slide\"\n className=\"canopy-interstitial__nav-btn canopy-interstitial__nav-btn--prev swiper-button-prev\"\n />\n <button\n type=\"button\"\n aria-label=\"Next slide\"\n className=\"canopy-interstitial__nav-btn canopy-interstitial__nav-btn--next swiper-button-next\"\n />\n </div>\n <div className=\"canopy-interstitial__pagination swiper-pagination\" />\n </div>\n );\n\n const overlayContent = (\n <>\n {overlayTitle ? (\n <h1 className=\"canopy-interstitial__headline\">{overlayTitle}</h1>\n ) : null}\n {derivedDescription ? (\n <p className=\"canopy-interstitial__description\">\n {derivedDescription}\n </p>\n ) : null}\n {overlayLinks.length ? (\n <div className=\"canopy-interstitial__actions\">\n {overlayLinks.map((link) => (\n <a\n key={`${link.href}-${link.title}`}\n href={link.href}\n className={\n link.type === \"secondary\"\n ? \"canopy-button canopy-button--secondary\"\n : \"canopy-button canopy-button--primary\"\n }\n >\n {link.title}\n </a>\n ))}\n </div>\n ) : null}\n </>\n );\n\n const cleanedProps = sanitizeRest(rest);\n\n return (\n <section\n className={containerClassName}\n data-canopy-hero-slider=\"1\"\n style={heroStyles}\n {...cleanedProps}\n >\n <div className=\"canopy-interstitial__layout\">\n <div className=\"canopy-interstitial__panel\">\n <div className=\"canopy-interstitial__body\">{overlayContent}</div>\n </div>\n <div className=\"canopy-interstitial__media-group\">\n {renderSlider({ showVeil: false, captionVariant: \"static\" })}\n </div>\n </div>\n </section>\n );\n}\n", "function computeHeroHeightStyle(height) {\n const h = typeof height === 'number' ? `${height}px` : String(height || '').trim();\n const val = h || '360px';\n return { width: '100%', height: val };\n}\n\nexport { computeHeroHeightStyle };\nexport default computeHeroHeightStyle;\n", "import React from \"react\";\nimport navigationHelpers from \"../../../lib/components/navigation.js\";\n\nfunction resolveRelativeCandidate(page, current) {\n if (page && typeof page.relativePath === \"string\" && page.relativePath) return page.relativePath;\n if (page && typeof page.slug === \"string\" && page.slug) return page.slug;\n if (typeof current === \"string\" && current) return current;\n return \"\";\n}\n\nfunction renderNodes(nodes, parentKey = \"node\") {\n if (!Array.isArray(nodes) || !nodes.length) return null;\n return nodes.map((node, index) => {\n if (!node) return null;\n const key = node.slug || node.relativePath || `${parentKey}-${index}`;\n const hasChildren = Array.isArray(node.children) && node.children.length > 0;\n const showChildren = hasChildren && (node.isExpanded || node.depth === 0);\n const depth = typeof node.depth === \"number\" ? Math.max(0, node.depth) : 0;\n const depthClass = `depth-${Math.min(depth, 5)}`;\n const classes = [\n \"canopy-sub-navigation__link\",\n depthClass,\n ];\n if (!node.href) classes.push(\"is-label\");\n if (node.isActive) classes.push(\"is-active\");\n const linkClass = classes.join(\" \");\n const Tag = node.href ? \"a\" : \"span\";\n return (\n <li\n key={key}\n className=\"canopy-sub-navigation__item\"\n data-depth={depth}\n >\n <Tag\n className={linkClass}\n href={node.href || undefined}\n aria-current={node.isActive ? \"page\" : undefined}\n >\n {node.title || node.slug}\n </Tag>\n {showChildren ? (\n <ul className=\"canopy-sub-navigation__list canopy-sub-navigation__list--nested\" role=\"list\">\n {renderNodes(node.children, key)}\n </ul>\n ) : null}\n </li>\n );\n });\n}\n\nexport default function SubNavigation({\n navigation: navigationProp,\n page,\n current,\n className = \"\",\n style = {},\n heading,\n ariaLabel,\n}) {\n const PageContext = navigationHelpers && navigationHelpers.getPageContext\n ? navigationHelpers.getPageContext()\n : null;\n const context = PageContext ? React.useContext(PageContext) : null;\n const contextNavigation = context && context.navigation ? context.navigation : null;\n const contextPage = context && context.page ? context.page : null;\n const effectiveNavigation = navigationProp || contextNavigation;\n const effectivePage = page || contextPage;\n const resolvedNavigation = React.useMemo(() => {\n if (effectiveNavigation && effectiveNavigation.root) return effectiveNavigation;\n const candidate = resolveRelativeCandidate(effectivePage, current);\n if (!candidate) return effectiveNavigation || null;\n const helpers = navigationHelpers && navigationHelpers.buildNavigationForFile ? navigationHelpers : null;\n if (!helpers) return effectiveNavigation || null;\n try {\n const normalized = navigationHelpers.normalizeRelativePath\n ? navigationHelpers.normalizeRelativePath(candidate)\n : candidate;\n const built = helpers.buildNavigationForFile(normalized);\n if (built) return built;\n } catch (_) {\n // ignore helper errors and fall back to provided navigation\n }\n return effectiveNavigation || null;\n }, [effectiveNavigation, effectivePage, current]);\n\n if (!resolvedNavigation || !resolvedNavigation.root) return null;\n\n const rootNode = resolvedNavigation.root;\n const finalHeading = heading || null;\n const labelSource = finalHeading || resolvedNavigation.title;\n const navLabel = ariaLabel || (labelSource ? `${labelSource} navigation` : \"Section navigation\");\n const combinedClassName = [\"canopy-sub-navigation\", className].filter(Boolean).join(\" \");\n const inlineStyle = { ...style };\n if (!Object.prototype.hasOwnProperty.call(inlineStyle, \"--sub-nav-indent\")) {\n inlineStyle[\"--sub-nav-indent\"] = \"0.85rem\";\n }\n\n return (\n <nav className={combinedClassName} style={inlineStyle} aria-label={navLabel}>\n {finalHeading ? (\n <div className=\"canopy-sub-navigation__heading\">{finalHeading}</div>\n ) : null}\n <ul className=\"canopy-sub-navigation__list\" role=\"list\">\n {renderNodes([rootNode], rootNode.slug || \"root\")}\n </ul>\n </nav>\n );\n}\n", "import React from 'react';\nimport navigationHelpers from '../../../lib/components/navigation.js';\nimport SubNavigation from './SubNavigation.jsx';\nimport ContentNavigation from './ContentNavigation.jsx';\n\nfunction buildHeadingTree(headings) {\n if (!Array.isArray(headings) || !headings.length) return [];\n const root = [];\n const stack = [];\n headings.forEach((heading) => {\n if (!heading || typeof heading !== 'object') return;\n const depth = typeof heading.depth === 'number' ? heading.depth : heading.level;\n if (typeof depth !== 'number' || depth < 2) return;\n const entry = {\n id: heading.id || heading.slug || heading.title,\n title: heading.title || heading.text || heading.id,\n depth,\n children: [],\n };\n while (stack.length && stack[stack.length - 1].depth >= entry.depth) {\n stack.pop();\n }\n if (!stack.length) {\n root.push(entry);\n } else {\n stack[stack.length - 1].children.push(entry);\n }\n stack.push(entry);\n });\n return root;\n}\n\nfunction buildNavigationAside(sidebar, className) {\n if (!sidebar) {\n return <SubNavigation className={className} />;\n }\n if (typeof sidebar === 'function') {\n return React.createElement(sidebar);\n }\n return sidebar;\n}\n\nexport default function Layout({\n children,\n sidebar,\n navigation = true,\n fluid = false,\n contentNavigation = true,\n className = '',\n contentClassName = '',\n sidebarClassName = '',\n contentNavigationClassName = '',\n ...rest\n}) {\n const PageContext =\n navigationHelpers && typeof navigationHelpers.getPageContext === 'function'\n ? navigationHelpers.getPageContext()\n : null;\n const context = PageContext ? React.useContext(PageContext) : null;\n const pageHeadings = React.useMemo(() => {\n const headings = context && context.page ? context.page.headings : null;\n return Array.isArray(headings) ? headings : [];\n }, [context]);\n const contentHeading = React.useMemo(() => {\n const first = pageHeadings.find((heading) => {\n const depth = heading && (heading.depth || heading.level);\n return depth === 1;\n });\n return first && first.title ? first.title : null;\n }, [pageHeadings]);\n const headingAnchorId = React.useMemo(() => {\n const first = pageHeadings.find((heading) => {\n const depth = heading && (heading.depth || heading.level);\n return depth === 1;\n });\n return first && first.id ? first.id : null;\n }, [pageHeadings]);\n const headingTree = React.useMemo(\n () => buildHeadingTree(pageHeadings),\n [pageHeadings]\n );\n\n const showLeftColumn = navigation !== false;\n const hasContentNavigation =\n navigation !== false &&\n contentNavigation !== false &&\n headingTree.length > 0;\n\n const gridClass = (() => {\n if (showLeftColumn && hasContentNavigation) {\n return 'md:grid md:grid-cols-[17rem_minmax(0,1fr)_14rem] md:items-start md:gap-10';\n }\n if (showLeftColumn) {\n return 'md:grid md:grid-cols-[17rem_minmax(0,1fr)] md:items-start md:gap-10';\n }\n if (hasContentNavigation) {\n return 'md:grid md:grid-cols-[minmax(0,1fr)_14rem] md:items-start md:gap-10';\n }\n return '';\n })();\n\n const containerClassName = [\n 'w-full py-6 getting-started-layout',\n gridClass,\n fluid ? 'px-4 md:px-8 lg:px-12' : 'mx-auto max-w-content px-4',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const leftAsideClassName = [\n 'mt-8 md:mt-0 md:order-1 md:sticky md:top-24 md:max-h-[calc(100vh-6rem)] md:overflow-y-auto text-sm text-slate-600',\n sidebarClassName,\n ]\n .filter(Boolean)\n .join(' ');\n\n const contentOrderClass = showLeftColumn ? 'md:order-2' : hasContentNavigation ? 'md:order-1' : '';\n const contentClassNames = [\n 'space-y-6',\n contentOrderClass,\n contentClassName,\n ]\n .filter(Boolean)\n .join(' ');\n\n const contentNavigationAsideClassName = [\n 'hidden md:block md:order-3 mt-8 md:mt-0 md:sticky md:top-24 md:max-h-[calc(100vh-6rem)] md:overflow-y-auto text-sm text-slate-600',\n contentNavigationClassName,\n ]\n .filter(Boolean)\n .join(' ');\n\n const sidebarNode = showLeftColumn\n ? buildNavigationAside(sidebar, sidebarClassName)\n : null;\n\n return (\n <div className={containerClassName} {...rest}>\n {showLeftColumn ? (\n <aside className={leftAsideClassName}>{sidebarNode}</aside>\n ) : null}\n <div className={contentClassNames}>{children}</div>\n {hasContentNavigation ? (\n <aside className={contentNavigationAsideClassName}>\n <ContentNavigation\n items={headingTree}\n heading={contentHeading || undefined}\n headingId={headingAnchorId || undefined}\n pageTitle={context && context.page ? context.page.title : undefined}\n />\n </aside>\n ) : null}\n </div>\n );\n}\n", "import React from 'react';\n\nconst SCROLL_OFFSET_REM = 1.618;\n\nfunction depthIndex(depth) {\n return Math.max(0, Math.min(5, (depth || 1) - 1));\n}\n\nexport default function ContentNavigation({\n items = [],\n className = '',\n style = {},\n heading,\n headingId,\n pageTitle,\n ariaLabel,\n}) {\n const isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\n const savedDepthsRef = React.useRef(null);\n\n if ((!items || !items.length) && !headingId) return null;\n\n const combinedClassName = ['canopy-sub-navigation canopy-content-navigation', className]\n .filter(Boolean)\n .join(' ');\n\n const effectiveHeading = heading || pageTitle || null;\n const navLabel = ariaLabel || (effectiveHeading ? `${effectiveHeading} navigation` : 'Section navigation');\n\n const getSavedDepth = React.useCallback(\n (id, fallback) => {\n if (!id) return fallback;\n if (!savedDepthsRef.current) savedDepthsRef.current = new Map();\n const store = savedDepthsRef.current;\n if (store.has(id)) return store.get(id);\n store.set(id, fallback);\n return fallback;\n },\n []\n );\n\n const headingEntries = React.useMemo(() => {\n const entries = [];\n const seen = new Set();\n if (headingId) {\n const topId = String(headingId);\n entries.push({ id: topId, depth: 1 });\n seen.add(topId);\n }\n const pushNodes = (nodes) => {\n if (!Array.isArray(nodes)) return;\n nodes.forEach((node) => {\n if (!node || !node.id) return;\n const id = String(node.id);\n if (seen.has(id)) return;\n seen.add(id);\n const depth = node.depth || node.level || getSavedDepth(id, 2);\n entries.push({ id, depth });\n if (node.children && node.children.length) pushNodes(node.children);\n });\n };\n pushNodes(items);\n return entries;\n }, [headingId, items, getSavedDepth]);\n\n const fallbackId = headingEntries.length ? headingEntries[0].id : headingId || null;\n const [activeId, setActiveId] = React.useState(fallbackId);\n const activeIdRef = React.useRef(activeId);\n React.useEffect(() => {\n activeIdRef.current = activeId;\n }, [activeId]);\n\n React.useEffect(() => {\n if (!headingEntries.length) return;\n if (!headingEntries.some((entry) => entry.id === activeIdRef.current)) {\n const next = headingEntries[0].id;\n activeIdRef.current = next;\n setActiveId(next);\n }\n }, [headingEntries]);\n\n const computeOffsetPx = React.useCallback(() => {\n if (!isBrowser) return 0;\n try {\n const root = document.documentElement;\n const fontSize = root\n ? parseFloat(window.getComputedStyle(root).fontSize || '16') || 16\n : 16;\n return fontSize * SCROLL_OFFSET_REM;\n } catch (_) {\n return 0;\n }\n }, [isBrowser]);\n\n const headingElementsRef = React.useRef([]);\n\n const updateActiveFromElements = React.useCallback(\n (elements) => {\n if (!elements || !elements.length) return;\n const offset = computeOffsetPx();\n let nextId = elements[0].id;\n for (const { id, element } of elements) {\n const rect = element.getBoundingClientRect();\n if (rect.top - offset <= 0) {\n nextId = id;\n } else {\n break;\n }\n }\n if (nextId && nextId !== activeIdRef.current) {\n activeIdRef.current = nextId;\n setActiveId(nextId);\n }\n },\n [computeOffsetPx]\n );\n\n React.useEffect(() => {\n if (!isBrowser) return undefined;\n const elements = headingEntries\n .map((entry) => {\n const element = document.getElementById(entry.id);\n return element ? { id: entry.id, element } : null;\n })\n .filter(Boolean);\n headingElementsRef.current = elements;\n updateActiveFromElements(elements);\n if (!elements.length) return undefined;\n\n let ticking = false;\n const handle = () => {\n if (!ticking) {\n ticking = true;\n window.requestAnimationFrame(() => {\n updateActiveFromElements(elements);\n ticking = false;\n });\n }\n };\n window.addEventListener('scroll', handle, { passive: true });\n window.addEventListener('resize', handle);\n return () => {\n window.removeEventListener('scroll', handle);\n window.removeEventListener('resize', handle);\n };\n }, [headingEntries, isBrowser, updateActiveFromElements]);\n\n const handleAnchorClick = React.useCallback(\n (event, targetId, options = {}) => {\n try {\n if (event && typeof event.preventDefault === 'function') event.preventDefault();\n } catch (_) {}\n if (!isBrowser) return;\n const offset = computeOffsetPx();\n let top = 0;\n if (targetId && targetId !== 'top' && !options.scrollToTop) {\n const el = document.getElementById(targetId);\n if (el) {\n const rect = el.getBoundingClientRect();\n top = window.scrollY + rect.top - offset;\n }\n }\n if (!Number.isFinite(top) || top < 0 || options.scrollToTop) top = 0;\n const nextId = targetId && targetId !== 'top'\n ? targetId\n : headingEntries[0]?.id || headingId || null;\n if (nextId) {\n activeIdRef.current = nextId;\n setActiveId(nextId);\n }\n try {\n window.scrollTo({ top, behavior: 'smooth' });\n } catch (_) {\n window.scrollTo(0, top);\n }\n },\n [computeOffsetPx, headingEntries, headingId, isBrowser]\n );\n\n const renderNodes = React.useCallback(\n (nodes) => {\n if (!nodes || !nodes.length) return null;\n return nodes.map((node) => {\n if (!node) return null;\n const id = node.id ? String(node.id) : '';\n const depth = node.depth || node.level || getSavedDepth(id, 2);\n const idx = depthIndex(depth);\n const isActive = id && activeId === id;\n return (\n <li key={id || node.title} className=\"canopy-sub-navigation__item\" data-depth={idx}>\n <a\n className={`canopy-sub-navigation__link depth-${idx}${isActive ? ' is-active' : ''}`}\n href={id ? `#${id}` : '#'}\n onClick={(event) => handleAnchorClick(event, id || null)}\n aria-current={isActive ? 'location' : undefined}\n >\n {node.title}\n </a>\n {node.children && node.children.length ? (\n <ul\n className=\"canopy-sub-navigation__list canopy-sub-navigation__list--nested\"\n role=\"list\"\n >\n {renderNodes(node.children)}\n </ul>\n ) : null}\n </li>\n );\n });\n },\n [handleAnchorClick, activeId, getSavedDepth]\n );\n\n const nestedItems = renderNodes(items);\n const topLink = headingId\n ? (\n <li className=\"canopy-sub-navigation__item\" data-depth={0}>\n <a\n className={`canopy-sub-navigation__link depth-0${activeId === headingId ? ' is-active' : ''}`}\n href={`#${headingId}`}\n onClick={(event) => handleAnchorClick(event, headingId, { scrollToTop: true })}\n aria-current={activeId === headingId ? 'location' : undefined}\n >\n {effectiveHeading || pageTitle || headingId}\n </a>\n {nestedItems ? (\n <ul\n className=\"canopy-sub-navigation__list canopy-sub-navigation__list--nested\"\n role=\"list\"\n >\n {nestedItems}\n </ul>\n ) : null}\n </li>\n )\n : null;\n\n return (\n <nav className={combinedClassName} style={style} aria-label={navLabel}>\n <ul className=\"canopy-sub-navigation__list\" role=\"list\">\n {topLink || nestedItems}\n </ul>\n </nav>\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 MdxSearchTabs(props) {\n let json = '{}';\n try { json = JSON.stringify(props || {}); } catch (_) { json = '{}'; }\n return (\n <div data-canopy-search-tabs=\"1\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n\n", "import React from 'react';\nimport SearchPanelForm, { resolveSearchPath } from '../search/SearchPanelForm.jsx';\nimport SearchPanelTeaserResults from '../search/SearchPanelTeaserResults.jsx';\n\n// SSR-safe placeholder for the search form modal, composed from SearchPanel parts.\n// This ensures a single JSX source of truth for form/panel markup.\nexport default function MdxSearchFormModal(props = {}) {\n const {\n placeholder = 'Search\u2026',\n hotkey = 'mod+k',\n maxResults = 8,\n groupOrder = ['work', 'page'],\n button = true, // kept for backward compat; ignored by teaser form\n buttonLabel = 'Search',\n label,\n searchPath = '/search',\n } = props || {};\n\n const text = typeof label === 'string' && label.trim() ? label.trim() : buttonLabel;\n const resolvedSearchPath = resolveSearchPath(searchPath);\n const data = { placeholder, hotkey, maxResults, groupOrder, label: text, searchPath: resolvedSearchPath };\n return (\n <div data-canopy-search-form className=\"flex-1 min-w-0\">\n <div className=\"relative w-full\">\n <SearchPanelForm placeholder={placeholder} buttonLabel={buttonLabel} label={label} searchPath={resolvedSearchPath} />\n <SearchPanelTeaserResults />\n </div>\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: JSON.stringify(data) }} />\n </div>\n );\n}\n", "import React from \"react\";\n\nexport const MagnifyingGlassIcon = (props) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\" {...props}>\n <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\" />\n </svg>\n);\n", "import {MagnifyingGlassIcon} from \"../Icons\";\nimport React from \"react\";\n\nfunction readBasePath() {\n const normalize = (val) => {\n const raw = typeof val === \"string\" ? val.trim() : \"\";\n if (!raw) return \"\";\n return raw.replace(/\\/+$/, \"\");\n };\n try {\n if (typeof window !== \"undefined\" && window.CANOPY_BASE_PATH != null) {\n const fromWindow = normalize(window.CANOPY_BASE_PATH);\n if (fromWindow) return fromWindow;\n }\n } catch (_) {}\n try {\n if (\n typeof globalThis !== \"undefined\" &&\n globalThis.CANOPY_BASE_PATH != null\n ) {\n const fromGlobal = normalize(globalThis.CANOPY_BASE_PATH);\n if (fromGlobal) return fromGlobal;\n }\n } catch (_) {}\n try {\n if (\n typeof process !== \"undefined\" &&\n process.env &&\n process.env.CANOPY_BASE_PATH\n ) {\n const fromEnv = normalize(process.env.CANOPY_BASE_PATH);\n if (fromEnv) return fromEnv;\n }\n } catch (_) {}\n return \"\";\n}\n\nfunction isAbsoluteUrl(href) {\n try {\n return /^https?:/i.test(String(href || \"\"));\n } catch (_) {\n return false;\n }\n}\n\nexport function resolveSearchPath(pathValue) {\n let raw = typeof pathValue === \"string\" ? pathValue.trim() : \"\";\n if (!raw) raw = \"/search\";\n if (isAbsoluteUrl(raw)) return raw;\n const normalizedPath = raw.startsWith(\"/\") ? raw : `/${raw}`;\n const base = readBasePath();\n if (!base) return normalizedPath;\n const baseWithLead = base.startsWith(\"/\") ? base : `/${base}`;\n const baseTrimmed = baseWithLead.replace(/\\/+$/, \"\");\n if (!baseTrimmed) return normalizedPath;\n if (\n normalizedPath === baseTrimmed ||\n normalizedPath.startsWith(`${baseTrimmed}/`)\n ) {\n return normalizedPath;\n }\n const pathTrimmed = normalizedPath.replace(/^\\/+/, \"\");\n return `${baseTrimmed}/${pathTrimmed}`;\n}\n\nexport default function SearchPanelForm(props = {}) {\n const {\n placeholder = \"Search\u2026\",\n buttonLabel = \"Search\",\n label,\n searchPath = \"/search\",\n inputId: inputIdProp,\n clearLabel = \"Clear search\",\n } = props || {};\n\n const text =\n typeof label === \"string\" && label.trim() ? label.trim() : buttonLabel;\n const action = React.useMemo(\n () => resolveSearchPath(searchPath),\n [searchPath]\n );\n const autoId = typeof React.useId === \"function\" ? React.useId() : undefined;\n const [fallbackId] = React.useState(\n () => `canopy-search-form-${Math.random().toString(36).slice(2, 10)}`\n );\n const inputId = inputIdProp || autoId || fallbackId;\n const inputRef = React.useRef(null);\n const [hasValue, setHasValue] = React.useState(false);\n\n const focusInput = React.useCallback(() => {\n const el = inputRef.current;\n if (!el) return;\n if (document.activeElement === el) return;\n try {\n el.focus({preventScroll: true});\n } catch (_) {\n try {\n el.focus();\n } catch (_) {}\n }\n }, []);\n\n const handlePointerDown = React.useCallback(\n (event) => {\n const target = event.target;\n if (target && typeof target.closest === \"function\") {\n if (target.closest(\"[data-canopy-search-form-trigger]\")) return;\n if (target.closest(\"[data-canopy-search-form-clear]\")) return;\n }\n event.preventDefault();\n focusInput();\n },\n [focusInput]\n );\n\n React.useEffect(() => {\n const el = inputRef.current;\n if (!el) return;\n if (el.value && el.value.trim()) {\n setHasValue(true);\n }\n }, []);\n\n const handleInputChange = React.useCallback((event) => {\n const nextHasValue = Boolean(\n event?.target?.value && event.target.value.trim()\n );\n setHasValue(nextHasValue);\n }, []);\n\n const handleClear = React.useCallback((event) => {}, []);\n\n const handleClearKey = React.useCallback(\n (event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n handleClear(event);\n }\n },\n [handleClear]\n );\n\n return (\n <form\n action={action}\n method=\"get\"\n role=\"search\"\n autoComplete=\"off\"\n spellCheck=\"false\"\n className=\"canopy-search-form canopy-search-form-shell\"\n onPointerDown={handlePointerDown}\n data-has-value={hasValue ? \"1\" : \"0\"}\n >\n <label htmlFor={inputId} className=\"canopy-search-form__label\">\n <MagnifyingGlassIcon className=\"canopy-search-form__icon\" />\n <input\n id={inputId}\n type=\"search\"\n name=\"q\"\n inputMode=\"search\"\n data-canopy-search-form-input\n placeholder={placeholder}\n className=\"canopy-search-form__input\"\n aria-label=\"Search\"\n ref={inputRef}\n onChange={handleInputChange}\n onInput={handleInputChange}\n />\n </label>\n {hasValue ? (\n <button\n type=\"button\"\n className=\"canopy-search-form__clear\"\n onClick={handleClear}\n onPointerDown={(event) => event.stopPropagation()}\n onKeyDown={handleClearKey}\n aria-label={clearLabel}\n data-canopy-search-form-clear\n >\n \u00D7\n </button>\n ) : null}\n <button\n type=\"submit\"\n data-canopy-search-form-trigger=\"submit\"\n className=\"canopy-search-form__submit\"\n >\n <span>{text}</span>\n <span aria-hidden className=\"canopy-search-form__shortcut\">\n <span>\u2318</span>\n <span>K</span>\n </span>\n </button>\n </form>\n );\n}\n", "import React from \"react\";\n\n// SSR placeholder for teaser results panel; the runtime controls visibility and content.\nexport default function SearchPanelTeaserResults(props = {}) {\n const { style, className } = props || {};\n const classes = [\"canopy-search-teaser\", className]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div\n data-canopy-search-form-panel\n className={classes || undefined}\n style={style}\n >\n <div id=\"cplist\" />\n </div>\n );\n}\n", "import React from 'react';\nimport SearchPanelForm, { resolveSearchPath } from './SearchPanelForm.jsx';\nimport SearchPanelTeaserResults from './SearchPanelTeaserResults.jsx';\n\n// High-level SearchPanel composed of a teaser form and teaser results panel.\n// Encodes configuration as JSON for the client runtime.\nexport default function SearchPanel(props = {}) {\n const {\n placeholder = 'Search\u2026',\n hotkey = 'mod+k',\n maxResults = 8,\n groupOrder = ['work', 'docs', 'page'],\n // Kept for backward compat; form always renders submit\n button = true, // eslint-disable-line no-unused-vars\n buttonLabel = 'Search',\n label,\n searchPath = '/search',\n } = props || {};\n\n const text = typeof label === 'string' && label.trim() ? label.trim() : buttonLabel;\n const resolvedSearchPath = resolveSearchPath(searchPath);\n const data = { placeholder, hotkey, maxResults, groupOrder, label: text, searchPath: resolvedSearchPath };\n\n return (\n <div data-canopy-search-form className=\"flex-1 min-w-0\">\n <div className=\"relative w-full\">\n <SearchPanelForm placeholder={placeholder} buttonLabel={buttonLabel} label={label} searchPath={resolvedSearchPath} />\n <SearchPanelTeaserResults />\n </div>\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: JSON.stringify(data) }} />\n </div>\n );\n}\n", "import React from \"react\";\nimport {\n Label as CloverLabel,\n Metadata as CloverMetadata,\n RequiredStatement as CloverRequiredStatement,\n Summary as CloverSummary,\n} from \"@samvera/clover-iiif/primitives\";\n\nfunction hasInternationalValue(value) {\n if (!value || typeof value !== \"object\") return false;\n return Object.keys(value).some((key) => {\n const entries = value[key];\n return (\n Array.isArray(entries) &&\n entries.some((entry) => String(entry || \"\").trim().length > 0)\n );\n });\n}\n\nfunction ensureMetadata(items) {\n if (!Array.isArray(items)) return [];\n return items.filter((item) => {\n if (!item || typeof item !== \"object\") return false;\n const { label, value } = item;\n return hasInternationalValue(label) && hasInternationalValue(value);\n });\n}\n\nexport function Label({ manifest, label, ...rest }) {\n const intl = label || (manifest && manifest.label);\n if (!hasInternationalValue(intl)) return null;\n return <CloverLabel label={intl} {...rest} />;\n}\n\nexport function Summary({ manifest, summary, ...rest }) {\n const intl = summary || (manifest && manifest.summary);\n if (!hasInternationalValue(intl)) return null;\n return <CloverSummary summary={intl} {...rest} />;\n}\n\nexport function Metadata({ manifest, metadata, ...rest }) {\n const items = ensureMetadata(metadata || (manifest && manifest.metadata));\n if (!items.length) return null;\n return <CloverMetadata metadata={items} {...rest} />;\n}\n\nexport function RequiredStatement({ manifest, requiredStatement, ...rest }) {\n const stmt = requiredStatement || (manifest && manifest.requiredStatement);\n if (\n !stmt ||\n !hasInternationalValue(stmt.label) ||\n !hasInternationalValue(stmt.value)\n ) {\n return null;\n }\n return <CloverRequiredStatement requiredStatement={stmt} {...rest} />;\n}\n\nexport const Primitives = {\n Label,\n Summary,\n Metadata,\n RequiredStatement,\n};\n\nexport default Primitives;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["React", "React", "useEffect", "useState", "React", "useEffect", "useState", "React", "React", "item", "React", "React", "helpers", "React", "navigationHelpers", "React", "renderNodes", "React", "navigationHelpers", "React", "React", "React", "React", "React", "React", "_", "React", "React", "React", "React", "React"]
|
|
7
7
|
}
|