@canopy-iiif/app 0.10.20 → 0.10.21

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 CHANGED
@@ -247,6 +247,21 @@ function extractPlainText(mdxSource) {
247
247
  return content;
248
248
  }
249
249
 
250
+ function extractMarkdownSummary(mdxSource) {
251
+ let { content } = parseFrontmatter(String(mdxSource || ''));
252
+ if (!content) return '';
253
+ content = content.replace(/^import[^\n]+$/gm, ' ');
254
+ content = content.replace(/^export[^\n]+$/gm, ' ');
255
+ content = content.replace(/```[\s\S]*?```/g, ' ');
256
+ content = content.replace(/<[A-Za-z][^>]*?>[\s\S]*?<\/[A-Za-z][^>]*?>/g, ' ');
257
+ content = content.replace(/<[A-Za-z][^>]*?\/>/g, ' ');
258
+ content = content.replace(/\{\/[A-Za-z0-9_.-]+\}/g, ' ');
259
+ content = content.replace(/\{[^{}]*\}/g, ' ');
260
+ content = content.replace(/^#{1,6}\s+.*$/gm, ' ');
261
+ content = content.replace(/\s+/g, ' ').trim();
262
+ return content;
263
+ }
264
+
250
265
  function extractTitle(mdxSource) {
251
266
  const { data, content } = parseFrontmatter(String(mdxSource || ""));
252
267
  if (data && typeof data.title === "string" && data.title.trim()) {
@@ -1006,6 +1021,7 @@ module.exports = {
1006
1021
  extractTitle,
1007
1022
  extractHeadings,
1008
1023
  extractPlainText,
1024
+ extractMarkdownSummary,
1009
1025
  isReservedFile,
1010
1026
  parseFrontmatter,
1011
1027
  compileMdxFile,
@@ -8,12 +8,17 @@ function pagesToRecords(pageRecords) {
8
8
  .filter((p) => p && p.href && p.searchInclude)
9
9
  .map((p) => {
10
10
  const summary = typeof p.searchSummary === 'string' ? p.searchSummary.trim() : '';
11
+ const summaryMarkdown =
12
+ typeof p.searchSummaryMarkdown === 'string'
13
+ ? p.searchSummaryMarkdown.trim()
14
+ : '';
11
15
  const record = {
12
16
  title: p.title || p.href,
13
17
  href: rootRelativeHref(p.href),
14
18
  type: p.searchType || 'page',
15
19
  };
16
20
  if (summary) record.summaryValue = summary;
21
+ if (summaryMarkdown) record.summaryMarkdown = summaryMarkdown;
17
22
  return record;
18
23
  });
19
24
  }
@@ -210,6 +210,7 @@ async function collectMdxPageRecords() {
210
210
  if (base !== 'sitemap.mdx') {
211
211
  const href = rootRelativeHref(rel.split(path.sep).join('/'));
212
212
  const plainText = mdx.extractPlainText(src);
213
+ const markdownSummary = mdx.extractMarkdownSummary(src);
213
214
  const summary = plainText || '';
214
215
  const underSearch = /^search\//i.test(href) || href.toLowerCase() === 'search.html';
215
216
  let include = !underSearch;
@@ -234,6 +235,7 @@ async function collectMdxPageRecords() {
234
235
  searchInclude: include && !!trimmedType,
235
236
  searchType: trimmedType || undefined,
236
237
  searchSummary: summary,
238
+ searchSummaryMarkdown: markdownSummary,
237
239
  });
238
240
  }
239
241
  }
@@ -354,6 +354,15 @@ function sanitizeRecordForDisplay(r) {
354
354
  const out = { ...base };
355
355
  if (out.metadata) delete out.metadata;
356
356
  if (out.summary) out.summary = toSafeString(out.summary, '');
357
+ const summaryMarkdown = toSafeString(
358
+ (r && r.summaryMarkdown) ||
359
+ (r && r.searchSummaryMarkdown) ||
360
+ (r && r.search && r.search.summaryMarkdown),
361
+ ''
362
+ ).trim();
363
+ if (summaryMarkdown) {
364
+ out.summaryMarkdown = summaryMarkdown;
365
+ }
357
366
  const hrefRaw = toSafeString(r && r.href, '');
358
367
  out.href = rootRelativeHref(hrefRaw);
359
368
  const thumbnail = toSafeString(r && r.thumbnail, '');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@canopy-iiif/app",
3
- "version": "0.10.20",
3
+ "version": "0.10.21",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "author": "Mat Jordan <mat@northwestern.edu>",
package/ui/dist/index.mjs CHANGED
@@ -111,37 +111,149 @@ import React3, { useMemo } from "react";
111
111
  function escapeRegExp(str = "") {
112
112
  return String(str).replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&");
113
113
  }
114
- function buildSnippet({ text = "", query = "", maxLength = 240 }) {
114
+ function buildSnippet({ text = "", query = "", maxLength = 360 }) {
115
115
  const clean = String(text || "").replace(/\s+/g, " ").trim();
116
116
  if (!clean) return "";
117
+ const safeMax = Math.max(60, Number(maxLength) || 360);
117
118
  const term = String(query || "").trim();
118
119
  if (!term)
119
- return clean.length > maxLength ? clean.slice(0, maxLength) + "\u2026" : clean;
120
+ return clean.length > safeMax ? clean.slice(0, safeMax).trimEnd() + "\u2026" : clean;
120
121
  const lower = clean.toLowerCase();
121
122
  const termLower = term.toLowerCase();
122
123
  const idx = lower.indexOf(termLower);
123
- if (idx === -1) {
124
- return clean.length > maxLength ? clean.slice(0, maxLength) + "\u2026" : clean;
124
+ if (idx === -1)
125
+ return clean.length > safeMax ? clean.slice(0, safeMax).trimEnd() + "\u2026" : clean;
126
+ const padding = Math.max(0, Math.floor((safeMax - term.length) / 2));
127
+ let start = Math.max(0, idx - padding);
128
+ let end = start + safeMax;
129
+ if (end > clean.length) {
130
+ end = clean.length;
131
+ start = Math.max(0, end - safeMax);
125
132
  }
126
- const context = Math.max(0, maxLength / 2);
127
- const start = Math.max(0, idx - context);
128
- const end = Math.min(clean.length, idx + term.length + context);
129
- let snippet = clean.slice(start, end);
133
+ let snippet = clean.slice(start, end).trim();
130
134
  if (start > 0) snippet = "\u2026" + snippet;
131
135
  if (end < clean.length) snippet = snippet + "\u2026";
132
136
  return snippet;
133
137
  }
134
- function highlightSnippet(snippet, query) {
135
- if (!query) return snippet;
138
+ function highlightTextNode(text, query, keyPrefix = "") {
139
+ if (!query) return text;
136
140
  const term = String(query).trim();
137
- if (!term) return snippet;
138
- const parts = String(snippet).split(
139
- new RegExp(`(${escapeRegExp(term)})`, "gi")
140
- );
141
+ if (!term) return text;
142
+ const regex = new RegExp(`(${escapeRegExp(term)})`, "gi");
143
+ const parts = String(text).split(regex);
141
144
  const termLower = term.toLowerCase();
142
- return parts.map(
143
- (part, idx) => part.toLowerCase() === termLower ? /* @__PURE__ */ React3.createElement("mark", { key: idx }, part) : /* @__PURE__ */ React3.createElement(React3.Fragment, { key: idx }, part)
144
- );
145
+ return parts.map((part, idx) => {
146
+ if (!part) return null;
147
+ if (part.toLowerCase() === termLower) {
148
+ return /* @__PURE__ */ React3.createElement("mark", { key: `${keyPrefix}-${idx}` }, part);
149
+ }
150
+ return /* @__PURE__ */ React3.createElement(React3.Fragment, { key: `${keyPrefix}-${idx}` }, part);
151
+ });
152
+ }
153
+ function tokenizeInlineMarkdown(input = "") {
154
+ const tokens = [];
155
+ let text = input;
156
+ while (text.length) {
157
+ if (text.startsWith("\n")) {
158
+ tokens.push({ type: "break" });
159
+ text = text.slice(1);
160
+ continue;
161
+ }
162
+ if (text.startsWith("**")) {
163
+ const closing = text.indexOf("**", 2);
164
+ if (closing !== -1) {
165
+ const inner = text.slice(2, closing);
166
+ tokens.push({ type: "strong", children: tokenizeInlineMarkdown(inner) });
167
+ text = text.slice(closing + 2);
168
+ continue;
169
+ }
170
+ }
171
+ if (text.startsWith("__")) {
172
+ const closing = text.indexOf("__", 2);
173
+ if (closing !== -1) {
174
+ const inner = text.slice(2, closing);
175
+ tokens.push({ type: "strong", children: tokenizeInlineMarkdown(inner) });
176
+ text = text.slice(closing + 2);
177
+ continue;
178
+ }
179
+ }
180
+ if (text.startsWith("*")) {
181
+ if (!text.startsWith("**")) {
182
+ const closing = text.indexOf("*", 1);
183
+ if (closing !== -1) {
184
+ const inner = text.slice(1, closing);
185
+ tokens.push({ type: "em", children: tokenizeInlineMarkdown(inner) });
186
+ text = text.slice(closing + 1);
187
+ continue;
188
+ }
189
+ }
190
+ }
191
+ if (text.startsWith("_")) {
192
+ if (!text.startsWith("__")) {
193
+ const closing = text.indexOf("_", 1);
194
+ if (closing !== -1) {
195
+ const inner = text.slice(1, closing);
196
+ tokens.push({ type: "em", children: tokenizeInlineMarkdown(inner) });
197
+ text = text.slice(closing + 1);
198
+ continue;
199
+ }
200
+ }
201
+ }
202
+ if (text.startsWith("`")) {
203
+ const closing = text.indexOf("`", 1);
204
+ if (closing !== -1) {
205
+ const inner = text.slice(1, closing);
206
+ tokens.push({ type: "code", value: inner });
207
+ text = text.slice(closing + 1);
208
+ continue;
209
+ }
210
+ }
211
+ if (text.startsWith("[")) {
212
+ const endLabel = text.indexOf("]");
213
+ const startHref = endLabel !== -1 ? text.indexOf("(", endLabel) : -1;
214
+ const endHref = startHref !== -1 ? text.indexOf(")", startHref) : -1;
215
+ if (endLabel !== -1 && startHref === endLabel + 1 && endHref !== -1) {
216
+ const label = text.slice(1, endLabel);
217
+ const href = text.slice(startHref + 1, endHref);
218
+ tokens.push({
219
+ type: "link",
220
+ href,
221
+ children: tokenizeInlineMarkdown(label)
222
+ });
223
+ text = text.slice(endHref + 1);
224
+ continue;
225
+ }
226
+ }
227
+ const specials = ["**", "__", "*", "_", "`", "[", "\n"];
228
+ const nextIndex = specials.map((needle) => needle === "\n" ? text.indexOf("\n") : text.indexOf(needle)).filter((idx) => idx > 0).reduce((min, idx) => min === -1 || idx < min ? idx : min, -1);
229
+ if (nextIndex === -1) {
230
+ tokens.push({ type: "text", value: text });
231
+ break;
232
+ }
233
+ tokens.push({ type: "text", value: text.slice(0, nextIndex) });
234
+ text = text.slice(nextIndex);
235
+ }
236
+ return tokens;
237
+ }
238
+ function renderMarkdownTokens(tokens, query, keyPrefix = "token") {
239
+ return tokens.map((token, idx) => {
240
+ const key = `${keyPrefix}-${idx}`;
241
+ switch (token.type) {
242
+ case "strong":
243
+ return /* @__PURE__ */ React3.createElement("strong", { key }, renderMarkdownTokens(token.children || [], query, key));
244
+ case "em":
245
+ return /* @__PURE__ */ React3.createElement("em", { key }, renderMarkdownTokens(token.children || [], query, key));
246
+ case "code":
247
+ return /* @__PURE__ */ React3.createElement("code", { key }, token.value);
248
+ case "link":
249
+ return /* @__PURE__ */ React3.createElement("a", { key, href: token.href, target: "_blank", rel: "noreferrer" }, renderMarkdownTokens(token.children || [], query, key));
250
+ case "break":
251
+ return /* @__PURE__ */ React3.createElement("br", { key });
252
+ case "text":
253
+ default:
254
+ return /* @__PURE__ */ React3.createElement(React3.Fragment, { key }, highlightTextNode(token.value || "", query, key));
255
+ }
256
+ });
145
257
  }
146
258
  function formatDisplayUrl(href = "") {
147
259
  try {
@@ -158,21 +270,22 @@ function ArticleCard({
158
270
  title = "Untitled",
159
271
  annotation = "",
160
272
  summary = "",
273
+ summaryMarkdown = "",
161
274
  metadata = [],
162
275
  query = ""
163
276
  }) {
164
- const snippetSource = annotation || summary;
277
+ const snippetSource = summaryMarkdown || annotation || summary;
165
278
  const snippet = useMemo(
166
279
  () => buildSnippet({ text: snippetSource, query }),
167
280
  [snippetSource, query]
168
281
  );
169
- const highlighted = useMemo(
170
- () => highlightSnippet(snippet, query),
171
- [snippet, query]
282
+ const snippetTokens = useMemo(
283
+ () => tokenizeInlineMarkdown(snippet),
284
+ [snippet]
172
285
  );
173
286
  const metaList = Array.isArray(metadata) ? metadata.map((m) => String(m || "")).filter(Boolean) : [];
174
287
  const displayUrl = useMemo(() => formatDisplayUrl(href), [href]);
175
- return /* @__PURE__ */ React3.createElement("a", { href, className: "canopy-article-card" }, /* @__PURE__ */ React3.createElement("article", null, displayUrl ? /* @__PURE__ */ React3.createElement("p", { className: "canopy-article-card__url" }, displayUrl) : null, /* @__PURE__ */ React3.createElement("h3", null, title), snippet ? /* @__PURE__ */ React3.createElement("p", { className: "canopy-article-card__snippet" }, highlighted) : null, metaList.length ? /* @__PURE__ */ React3.createElement("ul", { className: "canopy-article-card__meta" }, metaList.slice(0, 3).map((item, idx) => /* @__PURE__ */ React3.createElement("li", { key: `${item}-${idx}` }, item))) : null));
288
+ return /* @__PURE__ */ React3.createElement("a", { href, className: "canopy-article-card" }, /* @__PURE__ */ React3.createElement("article", null, displayUrl ? /* @__PURE__ */ React3.createElement("p", { className: "canopy-article-card__url" }, displayUrl) : null, /* @__PURE__ */ React3.createElement("h3", null, title), snippet ? /* @__PURE__ */ React3.createElement("p", { className: "canopy-article-card__snippet" }, renderMarkdownTokens(snippetTokens, query)) : null, metaList.length ? /* @__PURE__ */ React3.createElement("ul", { className: "canopy-article-card__meta" }, metaList.slice(0, 3).map((item, idx) => /* @__PURE__ */ React3.createElement("li", { key: `${item}-${idx}` }, item))) : null));
176
289
  }
177
290
 
178
291
  // ui/src/layout/Grid.jsx
@@ -1235,6 +1348,7 @@ function DefaultArticleTemplate({ record, query }) {
1235
1348
  title: record.title || record.href || "Untitled",
1236
1349
  annotation: record.annotation,
1237
1350
  summary: record.summary || record.summaryValue || "",
1351
+ summaryMarkdown: record.summaryMarkdown || record.summary || record.summaryValue || "",
1238
1352
  metadata,
1239
1353
  query
1240
1354
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/HelloWorld.jsx", "../src/layout/Card.jsx", "../src/layout/ArticleCard.jsx", "../src/layout/Grid.jsx", "../src/layout/Container.jsx", "../src/layout/Button.jsx", "../src/layout/ButtonWrapper.jsx", "../src/layout/CanopyHeader.jsx", "../src/search/SearchPanel.jsx", "../src/Icons.jsx", "../src/search/SearchPanelForm.jsx", "../src/search/SearchPanelTeaserResults.jsx", "../src/layout/CanopyBrand.jsx", "../src/layout/CanopyModal.jsx", "../src/layout/CanopyFooter.jsx", "../src/iiif/Viewer.jsx", "../src/iiif/Slider.jsx", "../src/iiif/Scroll.jsx", "../src/iiif/Image.jsx", "../src/iiif/MdxRelatedItems.jsx", "../src/search/MdxSearchResults.jsx", "../src/search/SearchSummary.jsx", "../src/search/MdxSearchTabs.jsx", "../src/search/SearchResults.jsx", "../src/search/SearchTabs.jsx", "../src/search/SearchFiltersDialog.jsx", "../src/search-form/MdxSearchFormModal.jsx", "../src/docs/MarkdownTable.jsx"],
4
- "sourcesContent": ["import React from \"react\";\n\nexport const HelloWorld = () => {\n return <div>Hello, World!</div>;\n};\n", "import React, { useEffect, useRef, useState } from \"react\";\n\n/**\n * Card\n *\n * Renders an anchor wrapping a figure with an image and caption.\n * Minimal styling; consumers can override via className/style.\n *\n * Props:\n * - href: string (required) \u2014 link target\n * - src: string (optional) \u2014 image source\n * - alt: string (optional) \u2014 image alt text (falls back to title)\n * - title: string (optional) \u2014 primary caption text\n * - subtitle: string (optional) \u2014 secondary caption text\n * - className: string (optional)\n * - style: object (optional)\n * - children: ReactNode (optional) \u2014 appended inside figcaption\n */\nexport default function Card({\n href,\n src,\n alt,\n title,\n subtitle,\n // Optional intrinsic dimensions or aspect ratio to compute a responsive height\n imgWidth,\n imgHeight,\n aspectRatio,\n className,\n style,\n children,\n lazy = true,\n ...rest\n}) {\n const containerRef = useRef(null);\n const [inView, setInView] = useState(!lazy);\n const [imageLoaded, setImageLoaded] = useState(!lazy);\n\n /**\n * Use IntersectionObserver to detect when the card enters the viewport.\n * When in view, setInView(true) to trigger image loading.\n * If IntersectionObserver is not supported, default to inView=true.\n */\n useEffect(() => {\n if (!lazy) return;\n if (!containerRef.current) return;\n if (typeof IntersectionObserver !== \"function\") {\n setInView(true);\n return;\n }\n const el = containerRef.current;\n const obs = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n setInView(true);\n try {\n obs.unobserve(el);\n } catch (_) {}\n break;\n }\n }\n },\n { root: null, rootMargin: \"100px\", threshold: 0.1 }\n );\n try {\n obs.observe(el);\n } catch (_) {}\n return () => {\n try {\n obs.disconnect();\n } catch (_) {}\n };\n }, [lazy]);\n\n /**\n * Calculate aspect ratio and padding percent for responsive image container.\n */\n const w = Number(imgWidth);\n const h = Number(imgHeight);\n const ratio =\n Number.isFinite(Number(aspectRatio)) && Number(aspectRatio) > 0\n ? Number(aspectRatio)\n : Number.isFinite(w) && w > 0 && Number.isFinite(h) && h > 0\n ? w / h\n : undefined;\n const paddingPercent = ratio ? 100 / ratio : 100;\n\n /**\n * Caption element (figcaption), rendered if title, subtitle, or children are provided.\n */\n const caption = (\n <figcaption>\n {title && <span>{title}</span>}\n {subtitle && <span>{subtitle}</span>}\n {children}\n </figcaption>\n );\n\n return (\n <a\n href={href}\n className={[\"canopy-card\", className].filter(Boolean).join(\" \")}\n style={style}\n ref={containerRef}\n data-aspect-ratio={ratio}\n data-in-view={inView ? \"true\" : \"false\"}\n data-image-loaded={imageLoaded ? \"true\" : \"false\"}\n {...rest}\n >\n <figure>\n {src ? (\n ratio ? (\n <div\n className=\"canopy-card-media\"\n style={{ \"--canopy-card-padding\": `${paddingPercent}%` }}\n >\n {inView ? (\n <img\n src={src}\n alt={alt || title || \"\"}\n loading=\"lazy\"\n onLoad={() => setImageLoaded(true)}\n onError={() => setImageLoaded(true)}\n />\n ) : null}\n </div>\n ) : (\n <img\n src={src}\n alt={alt || title || \"\"}\n loading=\"lazy\"\n onLoad={() => setImageLoaded(true)}\n onError={() => setImageLoaded(true)}\n className=\"canopy-card-image\"\n />\n )\n ) : null}\n {caption}\n </figure>\n </a>\n );\n}\n", "import React, {useMemo} from \"react\";\n\nfunction escapeRegExp(str = \"\") {\n return String(str).replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n}\n\nfunction buildSnippet({text = \"\", query = \"\", maxLength = 240}) {\n const clean = String(text || \"\")\n .replace(/\\s+/g, \" \")\n .trim();\n if (!clean) return \"\";\n const term = String(query || \"\").trim();\n if (!term)\n return clean.length > maxLength ? clean.slice(0, maxLength) + \"\u2026\" : clean;\n const lower = clean.toLowerCase();\n const termLower = term.toLowerCase();\n const idx = lower.indexOf(termLower);\n if (idx === -1) {\n return clean.length > maxLength ? clean.slice(0, maxLength) + \"\u2026\" : clean;\n }\n const context = Math.max(0, maxLength / 2);\n const start = Math.max(0, idx - context);\n const end = Math.min(clean.length, idx + term.length + context);\n let snippet = clean.slice(start, end);\n if (start > 0) snippet = \"\u2026\" + snippet;\n if (end < clean.length) snippet = snippet + \"\u2026\";\n return snippet;\n}\n\nfunction highlightSnippet(snippet, query) {\n if (!query) return snippet;\n const term = String(query).trim();\n if (!term) return snippet;\n const parts = String(snippet).split(\n new RegExp(`(${escapeRegExp(term)})`, \"gi\")\n );\n const termLower = term.toLowerCase();\n return parts.map((part, idx) =>\n part.toLowerCase() === termLower ? (\n <mark key={idx}>{part}</mark>\n ) : (\n <React.Fragment key={idx}>{part}</React.Fragment>\n )\n );\n}\n\nfunction formatDisplayUrl(href = \"\") {\n try {\n const url = new URL(href, href.startsWith(\"http\") ? undefined : \"http://example.com\");\n if (!href.startsWith(\"http\")) return href;\n const displayPath = url.pathname.replace(/\\/$/, \"\");\n return `${url.host}${displayPath}${url.search}`.replace(/\\/$/, \"\");\n } catch (_) {\n return href;\n }\n}\n\nexport default function ArticleCard({\n href = \"#\",\n title = \"Untitled\",\n annotation = \"\",\n summary = \"\",\n metadata = [],\n query = \"\",\n}) {\n const snippetSource = annotation || summary;\n const snippet = useMemo(\n () => buildSnippet({text: snippetSource, query}),\n [snippetSource, query]\n );\n const highlighted = useMemo(\n () => highlightSnippet(snippet, query),\n [snippet, query]\n );\n const metaList = Array.isArray(metadata)\n ? metadata.map((m) => String(m || \"\")).filter(Boolean)\n : [];\n const displayUrl = useMemo(() => formatDisplayUrl(href), [href]);\n\n return (\n <a href={href} className=\"canopy-article-card\">\n <article>\n {displayUrl ? (\n <p className=\"canopy-article-card__url\">{displayUrl}</p>\n ) : null}\n <h3>{title}</h3>\n {snippet ? (\n <p className=\"canopy-article-card__snippet\">{highlighted}</p>\n ) : null}\n {metaList.length ? (\n <ul className=\"canopy-article-card__meta\">\n {metaList.slice(0, 3).map((item, idx) => (\n <li key={`${item}-${idx}`}>{item}</li>\n ))}\n </ul>\n ) : null}\n </article>\n </a>\n );\n}\n", "import Masonry from \"react-masonry-css\";\nimport React from \"react\";\n\n// Simple item wrapper to provide consistent spacing between items.\nexport function GridItem({children, className = \"\", style = {}, ...rest}) {\n return (\n <div\n className={`canopy-grid-item ${className}`.trim()}\n style={style}\n {...rest}\n >\n {children}\n </div>\n );\n}\n\n/**\n * Grid (Masonry)\n *\n * Lightweight wrapper around `react-masonry-css` with sensible defaults\n * and inline styles so it works without a global CSS pipeline.\n *\n * Props:\n * - breakpointCols: number | object \u2014 columns per breakpoint (react-masonry-css prop)\n * - gap: CSS length string \u2014 spacing between items/columns (default '1rem')\n * - paddingY: CSS length string \u2014 vertical padding for the grid (default '0')\n * - className, style \u2014 forwarded to container\n * - columnClassName \u2014 forwarded to Masonry (defaults to 'canopy-grid-column')\n * - children \u2014 usually a list of <GridItem> elements\n */\nexport default function Grid({\n breakpointCols,\n gap = \"1.618rem\",\n paddingY = \"0\",\n className = \"\",\n style = {},\n columnClassName = \"canopy-grid-column\",\n children,\n ...rest\n}) {\n const cols = breakpointCols || {\n default: 6,\n 1280: 5,\n 1024: 4,\n 768: 3,\n 640: 2,\n };\n const vars = {\"--grid-gap\": gap, \"--grid-padding-y\": paddingY};\n\n return (\n <div className=\"canopy-grid-wrap\">\n {/* Scoped styles so the component works standalone */}\n <style\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{\n __html: `\n .canopy-grid { display: flex; width: auto; position: relative; padding: var(--grid-padding-y, 0) 0; z-index: 1; }\n .canopy-grid .${columnClassName} { margin-left: var(--grid-gap, 1rem); }\n .canopy-grid .${columnClassName}:first-child { margin-left: 0; }\n .canopy-grid-item { margin-bottom: var(--grid-gap, 1rem); }\n `,\n }}\n />\n <Masonry\n breakpointCols={cols}\n className={`canopy-grid ${className}`.trim()}\n columnClassName={columnClassName}\n style={{...vars, ...style}}\n {...rest}\n >\n {children}\n </Masonry>\n </div>\n );\n}\n", "import React from \"react\";\n\nexport default function Container({\n className = \"\",\n variant = \"content\",\n children,\n ...rest\n}) {\n const variantClass = variant === \"wide\" ? \"max-w-wide\" : \"max-w-content\";\n const classes = [\"mx-auto\", variantClass, \"w-full\", className]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div\n className={classes}\n {...rest}\n style={{...rest.style, padding: \"1.618rem\"}}\n >\n {children}\n </div>\n );\n}\n", "import React from 'react';\n\nconst VARIANTS = new Set(['primary', 'secondary']);\n\nexport default function Button({\n label,\n href = '#',\n target,\n rel,\n variant = 'primary',\n className = '',\n children,\n ...rest\n}) {\n const resolvedVariant = VARIANTS.has(variant) ? variant : 'primary';\n const computedRel =\n target === '_blank' && !rel ? 'noopener noreferrer' : rel;\n const content = children != null ? children : label;\n\n if (!content) return null;\n\n const classes = [\n 'canopy-button',\n `canopy-button--${resolvedVariant}`,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <a\n href={href}\n className={classes}\n target={target}\n rel={computedRel}\n {...rest}\n >\n {content}\n </a>\n );\n}\n", "import React from 'react';\n\nexport default function ButtonWrapper({\n className = '',\n children,\n text = '',\n variant = 'default',\n ...rest\n}) {\n const variantClass =\n variant && variant !== 'default'\n ? `canopy-button-group--${variant}`\n : '';\n const classes = ['canopy-button-group', variantClass, className]\n .filter(Boolean)\n .join(' ');\n return (\n <div className={classes} {...rest}>\n {text && <span className=\"canopy-button-group__text\">{text}</span>}\n <div className=\"canopy-button-group__actions\">{children}</div>\n </div>\n );\n}\n", "import React from \"react\";\nimport SearchPanel from \"../search/SearchPanel.jsx\";\nimport CanopyBrand from \"./CanopyBrand.jsx\";\nimport CanopyModal from \"./CanopyModal.jsx\";\n\nfunction HeaderScript() {\n const code = `\n(function () {\n if (typeof window === 'undefined') return;\n\n var doc = document;\n var body = doc.body;\n var root = doc.documentElement;\n\n function ready(fn) {\n if (doc.readyState === 'loading') {\n doc.addEventListener('DOMContentLoaded', fn, { once: true });\n } else {\n fn();\n }\n }\n\n ready(function () {\n var header = doc.querySelector('.canopy-header');\n if (!header) return;\n\n var NAV_ATTR = 'data-mobile-nav';\n var SEARCH_ATTR = 'data-mobile-search';\n\n function modalFor(type) {\n return doc.querySelector('[data-canopy-modal=\"' + type + '\"]');\n }\n\n function each(list, fn) {\n if (!list || typeof fn !== 'function') return;\n Array.prototype.forEach.call(list, fn);\n }\n\n function setExpanded(type, expanded) {\n var toggles = header.querySelectorAll('[data-canopy-header-toggle=\"' + type + '\"]');\n each(toggles, function (btn) {\n btn.setAttribute('aria-expanded', expanded ? 'true' : 'false');\n });\n var modal = modalFor(type);\n if (modal) {\n modal.setAttribute('data-open', expanded ? 'true' : 'false');\n modal.setAttribute('aria-hidden', expanded ? 'false' : 'true');\n }\n }\n\n function lockScroll(shouldLock) {\n if (!body) return;\n if (shouldLock) {\n if (!body.dataset.canopyScrollLock) {\n body.dataset.canopyScrollPrevOverflow = body.style.overflow || '';\n if (root && root.dataset) {\n root.dataset.canopyScrollPrevOverflow = root.style.overflow || '';\n }\n }\n body.dataset.canopyScrollLock = '1';\n body.style.overflow = 'hidden';\n if (root) root.style.overflow = 'hidden';\n } else {\n if (body.dataset.canopyScrollLock) {\n delete body.dataset.canopyScrollLock;\n body.style.overflow = body.dataset.canopyScrollPrevOverflow || '';\n delete body.dataset.canopyScrollPrevOverflow;\n }\n if (root && root.dataset) {\n root.style.overflow = root.dataset.canopyScrollPrevOverflow || '';\n delete root.dataset.canopyScrollPrevOverflow;\n }\n }\n }\n\n function stateFor(type) {\n if (type === 'nav') return header.getAttribute(NAV_ATTR);\n if (type === 'search') return header.getAttribute(SEARCH_ATTR);\n return 'closed';\n }\n\n function focusSearchForm() {\n var input = header.querySelector('[data-canopy-search-form-input]');\n if (!input) return;\n var raf = typeof window !== 'undefined' && window.requestAnimationFrame;\n (raf || function (fn) { return setTimeout(fn, 16); })(function () {\n try {\n input.focus({ preventScroll: true });\n } catch (_) {\n try { input.focus(); } catch (_) {}\n }\n });\n }\n\n function focusNavMenu() {\n var modal = modalFor('nav');\n if (!modal) return;\n var target = modal.querySelector('button, a, input, [tabindex]:not([tabindex=\"-1\"])');\n if (!target) return;\n var raf = typeof window !== 'undefined' && window.requestAnimationFrame;\n (raf || function (fn) { return setTimeout(fn, 16); })(function () {\n try {\n target.focus({ preventScroll: true });\n } catch (_) {\n try { target.focus(); } catch (_) {}\n }\n });\n }\n\n function setState(type, next) {\n if (type === 'nav') header.setAttribute(NAV_ATTR, next);\n if (type === 'search') header.setAttribute(SEARCH_ATTR, next);\n setExpanded(type, next === 'open');\n var navOpen = header.getAttribute(NAV_ATTR) === 'open';\n var searchOpen = header.getAttribute(SEARCH_ATTR) === 'open';\n lockScroll(navOpen || searchOpen);\n }\n\n function toggle(type, force) {\n var current = stateFor(type) === 'open';\n var shouldOpen = typeof force === 'boolean' ? force : !current;\n if (shouldOpen && type === 'nav') setState('search', 'closed');\n if (shouldOpen && type === 'search') setState('nav', 'closed');\n setState(type, shouldOpen ? 'open' : 'closed');\n if (type === 'search' && shouldOpen) focusSearchForm();\n if (type === 'nav' && shouldOpen) focusNavMenu();\n }\n\n each(header.querySelectorAll('[data-canopy-header-toggle]'), function (btn) {\n btn.addEventListener('click', function (event) {\n event.preventDefault();\n var type = btn.getAttribute('data-canopy-header-toggle');\n if (!type) return;\n toggle(type);\n });\n });\n\n each(doc.querySelectorAll('[data-canopy-header-close]'), function (btn) {\n btn.addEventListener('click', function () {\n var type = btn.getAttribute('data-canopy-header-close');\n if (!type) return;\n toggle(type, false);\n });\n });\n\n var navModal = modalFor('nav');\n if (navModal) {\n navModal.addEventListener('click', function (event) {\n if (event.target === navModal) {\n toggle('nav', false);\n return;\n }\n var target = event.target && event.target.closest && event.target.closest('a');\n if (!target) return;\n toggle('nav', false);\n });\n }\n\n var searchModal = modalFor('search');\n if (searchModal) {\n searchModal.addEventListener('click', function (event) {\n if (event.target === searchModal) toggle('search', false);\n });\n }\n\n doc.addEventListener('keydown', function (event) {\n if (event.key !== 'Escape') return;\n var navOpen = header.getAttribute(NAV_ATTR) === 'open';\n var searchOpen = header.getAttribute(SEARCH_ATTR) === 'open';\n if (!navOpen && !searchOpen) return;\n event.preventDefault();\n toggle('nav', false);\n toggle('search', false);\n });\n\n var mq = window.matchMedia('(min-width: 48rem)');\n function syncDesktopState() {\n if (mq.matches) {\n setState('nav', 'closed');\n setState('search', 'closed');\n setExpanded('nav', false);\n setExpanded('search', false);\n lockScroll(false);\n }\n }\n\n try {\n mq.addEventListener('change', syncDesktopState);\n } catch (_) {\n mq.addListener(syncDesktopState);\n }\n\n syncDesktopState();\n });\n})();\n `;\n\n return (\n <script\n dangerouslySetInnerHTML={{\n __html: code,\n }}\n />\n );\n}\n\nfunction ensureArray(navLinks) {\n if (!Array.isArray(navLinks)) return [];\n return navLinks.filter(\n (link) => link && typeof link === \"object\" && typeof link.href === \"string\"\n );\n}\n\nexport default function CanopyHeader(props = {}) {\n const {\n navigation: navLinksProp,\n searchLabel = \"Search\",\n searchHotkey = \"mod+k\",\n searchPlaceholder = \"Search\u2026\",\n brandHref = \"/\",\n title = \"Canopy IIIF\",\n logo: SiteLogo,\n } = props;\n\n const navLinks = ensureArray(navLinksProp);\n\n return (\n <>\n <header\n className=\"canopy-header\"\n data-mobile-nav=\"closed\"\n data-mobile-search=\"closed\"\n >\n <div className=\"canopy-header__brand\">\n <CanopyBrand\n label={title}\n href={brandHref}\n className=\"canopy-header__brand-link\"\n Logo={SiteLogo}\n />\n </div>\n\n <div className=\"canopy-header__desktop-search\">\n <SearchPanel\n label={searchLabel}\n hotkey={searchHotkey}\n placeholder={searchPlaceholder}\n />\n </div>\n\n <nav\n className=\"canopy-nav-links canopy-header__desktop-nav\"\n aria-label=\"Primary navigation\"\n >\n {navLinks.map((link) => (\n <a key={link.href} href={link.href}>\n {link.label || link.href}\n </a>\n ))}\n </nav>\n\n <div className=\"canopy-header__actions\">\n <button\n type=\"button\"\n className=\"canopy-header__icon-button canopy-header__search-trigger\"\n aria-label=\"Open search\"\n aria-controls=\"canopy-modal-search\"\n aria-expanded=\"false\"\n data-canopy-header-toggle=\"search\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n className=\"canopy-header__search-icon\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m21 21-3.8-3.8M10.5 18a7.5 7.5 0 1 1 0-15 7.5 7.5 0 0 1 0 15Z\"\n />\n </svg>\n </button>\n <button\n type=\"button\"\n className=\"canopy-header__icon-button canopy-header__menu\"\n aria-label=\"Open navigation\"\n aria-controls=\"canopy-modal-nav\"\n aria-expanded=\"false\"\n data-canopy-header-toggle=\"nav\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"1.5\"\n stroke=\"currentColor\"\n className=\"canopy-header__menu-icon\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5\"\n />\n </svg>\n </button>\n </div>\n </header>\n\n <CanopyModal\n id=\"canopy-modal-nav\"\n variant=\"nav\"\n labelledBy=\"canopy-modal-nav-label\"\n label={title}\n logo={SiteLogo}\n href={brandHref}\n closeLabel=\"Close navigation\"\n closeDataAttr=\"nav\"\n >\n <nav\n className=\"canopy-nav-links canopy-modal__nav\"\n aria-label=\"Primary navigation\"\n >\n {navLinks.map((link) => (\n <a key={link.href} href={link.href}>\n {link.label || link.href}\n </a>\n ))}\n </nav>\n </CanopyModal>\n\n <CanopyModal\n id=\"canopy-modal-search\"\n variant=\"search\"\n labelledBy=\"canopy-modal-search-label\"\n label={title}\n logo={SiteLogo}\n href={brandHref}\n closeLabel=\"Close search\"\n closeDataAttr=\"search\"\n bodyClassName=\"canopy-modal__body--search\"\n >\n <SearchPanel\n label={searchLabel}\n hotkey={searchHotkey}\n placeholder={searchPlaceholder}\n />\n </CanopyModal>\n\n <HeaderScript />\n </>\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\";\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 {text}\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';\n\nexport default function CanopyBrand(props = {}) {\n const {\n labelId,\n label = 'Canopy IIIF',\n href = '/',\n className,\n Logo,\n } = props || {};\n const spanProps = labelId ? {id: labelId} : {};\n const classes = ['canopy-logo', className].filter(Boolean).join(' ');\n\n return (\n <a href={href} className={classes}>\n {typeof Logo === 'function' ? <Logo /> : null}\n <span {...spanProps}>{label}</span>\n </a>\n );\n}\n", "import React from 'react';\nimport CanopyBrand from './CanopyBrand.jsx';\n\nexport default function CanopyModal(props = {}) {\n const {\n id,\n variant,\n open = false,\n labelledBy,\n label,\n logo: Logo,\n href = '/',\n closeLabel = 'Close',\n closeDataAttr,\n onClose,\n onBackgroundClick,\n bodyClassName,\n padded = true,\n className,\n children,\n } = props;\n\n const rootClassName = ['canopy-modal', variant ? `canopy-modal--${variant}` : null, className]\n .filter(Boolean)\n .join(' ');\n\n const modalProps = {\n id,\n className: rootClassName,\n role: 'dialog',\n 'aria-modal': 'true',\n 'aria-hidden': open ? 'false' : 'true',\n 'data-open': open ? 'true' : 'false',\n };\n\n if (variant) modalProps['data-canopy-modal'] = variant;\n\n const resolvedLabelId = labelledBy || (label ? `${variant || 'modal'}-label` : undefined);\n if (resolvedLabelId) modalProps['aria-labelledby'] = resolvedLabelId;\n\n if (typeof onBackgroundClick === 'function') {\n modalProps.onClick = (event) => {\n if (event.target === event.currentTarget) onBackgroundClick(event);\n };\n }\n\n const closeButtonProps = {\n type: 'button',\n className: 'canopy-modal__close',\n 'aria-label': closeLabel,\n };\n\n if (typeof closeDataAttr === 'string' && closeDataAttr) {\n closeButtonProps['data-canopy-header-close'] = closeDataAttr;\n }\n\n if (typeof onClose === 'function') {\n closeButtonProps.onClick = onClose;\n }\n\n const bodyClasses = ['canopy-modal__body'];\n if (padded) bodyClasses.push('canopy-modal__body--padded');\n if (bodyClassName) bodyClasses.push(bodyClassName);\n const bodyClassNameValue = bodyClasses.join(' ');\n\n return (\n <div {...modalProps}>\n <div className=\"canopy-modal__panel\">\n <button {...closeButtonProps}>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n className=\"canopy-modal__close-icon\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 6l12 12M6 18L18 6\" />\n </svg>\n <span className=\"sr-only\">{closeLabel}</span>\n </button>\n <div className={bodyClassNameValue}>\n {label ? (\n <div className=\"canopy-modal__brand\">\n <CanopyBrand\n labelId={resolvedLabelId}\n label={label}\n href={href}\n Logo={Logo}\n className=\"canopy-modal__brand-link\"\n />\n </div>\n ) : null}\n {children}\n </div>\n </div>\n </div>\n );\n}\n", "import React from 'react';\n\nexport default function CanopyFooter({ className = '', children }) {\n const footerClassName = ['canopy-footer', className].filter(Boolean).join(' ');\n\n return (\n <footer className={footerClassName}>\n <div className=\"canopy-footer__inner\">{children}</div>\n </footer>\n );\n}\n", "import React, { useEffect, useState } from \"react\";\n\n// SSR-safe wrapper around Clover's viewer. Clover touches the DOM at import time,\n// so we dynamically import it only in the browser.\n\n// Default Clover viewer options; can be overridden per-usage via props.options\nconst DEFAULT_VIEWER_OPTIONS = {\n showDownload: false,\n showIIIFBadge: false,\n showTitle: false,\n informationPanel: {\n open: false,\n renderAbout: false,\n renderToggle: false,\n },\n};\n\nfunction isPlainObject(val) {\n return val && typeof val === \"object\" && !Array.isArray(val);\n}\n\nfunction deepMerge(base, override) {\n if (!isPlainObject(base)) return override;\n const out = { ...base };\n if (!isPlainObject(override)) return out;\n for (const key of Object.keys(override)) {\n const a = base[key];\n const b = override[key];\n if (isPlainObject(a) && isPlainObject(b)) out[key] = deepMerge(a, b);\n else out[key] = b;\n }\n return out;\n}\n\nexport const Viewer = (props) => {\n const [CloverViewer, setCloverViewer] = useState(null);\n const mergedOptions = deepMerge(\n DEFAULT_VIEWER_OPTIONS,\n props && props.options\n );\n\n useEffect(() => {\n let mounted = true;\n const canUseDom =\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\n if (canUseDom) {\n import(\"@samvera/clover-iiif/viewer\")\n .then((mod) => {\n if (!mounted) return;\n // Loaded Clover viewer dynamically in the browser\n const Comp = mod && (mod.default || mod.Viewer || mod);\n setCloverViewer(() => Comp);\n })\n .catch(() => {\n // Silently ignore load errors on the server or if Clover is unavailable\n });\n }\n return () => {\n mounted = false;\n };\n }, []);\n\n if (!CloverViewer) {\n // SSR placeholder for client hydration; props provided as JSON\n let json = \"{}\";\n try {\n const p = { ...(props || {}) };\n if (mergedOptions) p.options = mergedOptions;\n json = JSON.stringify(p);\n } catch (_) {\n json = \"{}\";\n }\n return (\n <div data-canopy-viewer=\"1\" className=\"not-prose\">\n <script\n type=\"application/json\"\n dangerouslySetInnerHTML={{ __html: json }}\n />\n </div>\n );\n }\n return <CloverViewer {...props} options={mergedOptions} />;\n};\n", "import React, { useEffect, useState } from \"react\";\n\n// SSR-safe wrapper around Clover's slider. Clover touches the DOM at import time,\n// so we dynamically import it only in the browser.\nexport const Slider = (props) => {\n const [CloverSlider, setCloverSlider] = useState(null);\n\n useEffect(() => {\n let mounted = true;\n const canUseDom =\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\n if (canUseDom) {\n import(\"@samvera/clover-iiif/slider\")\n .then((mod) => {\n if (!mounted) return;\n console.log(mod);\n const Comp = mod && (mod.default || mod.Slider || mod);\n setCloverSlider(() => Comp);\n })\n .catch(() => {\n // Silently ignore load errors on the server or if Clover is unavailable\n });\n }\n return () => {\n mounted = false;\n };\n }, []);\n\n if (!CloverSlider) {\n // SSR placeholder for client hydration; props provided as JSON\n let json = \"{}\";\n try {\n json = JSON.stringify(props || {});\n } catch (_) {\n json = \"{}\";\n }\n return (\n <div data-canopy-slider=\"1\" className=\"not-prose\">\n <script\n type=\"application/json\"\n dangerouslySetInnerHTML={{ __html: json }}\n />\n </div>\n );\n }\n return <CloverSlider {...props} />;\n};\n", "import React, { 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, {useEffect, useState} from \"react\";\n\n// SSR-safe wrapper around Clover's image component. The module relies on the DOM\n// during import, so we lazy-load it in the browser and render a placeholder on the\n// server for the hydration runtime.\nexport const Image = (props = {}) => {\n const [CloverImage, setCloverImage] = useState(null);\n const baseClass = \"canopy-iiif-image\";\n const {\n height = `600px`,\n backgroundColor = `var(--color-gray-200)`,\n caption,\n className: userClassName,\n } = props || {};\n const rootClassName = [userClassName, baseClass].filter(Boolean).join(\" \");\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/image\")\n .then((mod) => {\n if (!mounted) return;\n const Comp = mod && (mod.default || mod.Image || mod);\n setCloverImage(() => Comp);\n })\n .catch(() => {\n // Suppress errors during SSR or when the Clover bundle is unavailable.\n });\n }\n return () => {\n mounted = false;\n };\n }, []);\n\n if (!CloverImage) {\n let json = \"{}\";\n try {\n json = JSON.stringify(props || {});\n } catch (_) {\n json = \"{}\";\n }\n\n return (\n <figure className={rootClassName}>\n <div\n className={`${baseClass}__placeholder`}\n data-canopy-image=\"1\"\n style={{\n \"--canopy-iiif-image-height\": height,\n \"--canopy-iiif-image-bg\": backgroundColor,\n }}\n >\n <script\n type=\"application/json\"\n dangerouslySetInnerHTML={{__html: json}}\n />\n </div>\n {caption && (\n <figcaption className={`${baseClass}__caption`}>\n {caption}\n </figcaption>\n )}\n </figure>\n );\n }\n\n return <CloverImage {...props} className={rootClassName} />;\n};\n", "import React from 'react';\n\n// SSR-safe placeholder for RelatedItems. Hydrated by canopy-related-items.js + canopy-slider.js\nexport default function MdxRelatedItems(props) {\n let json = '{}';\n try {\n json = JSON.stringify(props || {});\n } catch (_) {\n json = '{}';\n }\n return (\n <div data-canopy-related-items=\"1\" className=\"not-prose\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n", "import React from 'react';\n\nexport default function 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 Grid, { GridItem } from \"../layout/Grid.jsx\";\nimport ArticleCard from \"../layout/ArticleCard.jsx\";\nimport Card from \"../layout/Card.jsx\";\nimport React from \"react\";\n\nfunction DefaultArticleTemplate({ record, query }) {\n if (!record) return null;\n const metadata = Array.isArray(record.metadata) ? record.metadata : [];\n return (\n <ArticleCard\n href={record.href}\n title={record.title || record.href || 'Untitled'}\n annotation={record.annotation}\n summary={record.summary || record.summaryValue || ''}\n metadata={metadata}\n query={query}\n />\n );\n}\n\nfunction DefaultFigureTemplate({ record, thumbnailAspectRatio }) {\n if (!record) return null;\n const hasDims =\n Number.isFinite(Number(record.thumbnailWidth)) &&\n Number(record.thumbnailWidth) > 0 &&\n Number.isFinite(Number(record.thumbnailHeight)) &&\n Number(record.thumbnailHeight) > 0;\n const aspect = Number.isFinite(Number(thumbnailAspectRatio)) && Number(thumbnailAspectRatio) > 0\n ? Number(thumbnailAspectRatio)\n : hasDims\n ? Number(record.thumbnailWidth) / Number(record.thumbnailHeight)\n : undefined;\n return (\n <Card\n href={record.href}\n title={record.title || record.href}\n src={record.type === 'work' ? record.thumbnail : undefined}\n imgWidth={record.thumbnailWidth}\n imgHeight={record.thumbnailHeight}\n aspectRatio={aspect}\n />\n );\n}\n\nexport default function SearchResults({\n results = [],\n type = \"all\",\n layout = \"grid\",\n query = \"\",\n templates = {},\n variant = \"auto\",\n}) {\n if (!results.length) {\n return (\n <div className=\"text-slate-600\">\n <em>No results</em>\n </div>\n );\n }\n\n const normalizedType = String(type || 'all').toLowerCase();\n const normalizedVariant =\n variant === 'figure' || variant === 'article' ? variant : 'auto';\n const isAnnotationView = normalizedType === \"annotation\";\n const FigureTemplate = templates && templates.figure ? templates.figure : DefaultFigureTemplate;\n const ArticleTemplate = templates && templates.article ? templates.article : DefaultArticleTemplate;\n\n if (isAnnotationView) {\n return (\n <div id=\"search-results\" className=\"space-y-4\">\n {results.map((r, i) => {\n if (!r) return null;\n return (\n <ArticleTemplate\n key={r.id || i}\n record={r}\n query={query}\n layout={layout}\n />\n );\n })}\n </div>\n );\n }\n\n const isWorkRecord = (record) => String(record && record.type).toLowerCase() === 'work';\n\n const shouldRenderAsArticle = (record) => {\n if (normalizedVariant === 'article') return true;\n if (normalizedVariant === 'figure') return false;\n return !isWorkRecord(record) || normalizedType !== 'work';\n };\n\n if (layout === \"list\") {\n return (\n <div id=\"search-results\" className=\"space-y-6\">\n {results.map((r, i) => {\n if (shouldRenderAsArticle(r)) {\n return (\n <div key={i} className={`search-result ${r && r.type}`}>\n <ArticleTemplate record={r} query={query} layout={layout} />\n </div>\n );\n }\n const hasDims =\n Number.isFinite(Number(r.thumbnailWidth)) &&\n Number(r.thumbnailWidth) > 0 &&\n Number.isFinite(Number(r.thumbnailHeight)) &&\n Number(r.thumbnailHeight) > 0;\n const aspect = hasDims\n ? Number(r.thumbnailWidth) / Number(r.thumbnailHeight)\n : undefined;\n return (\n <div\n key={i}\n className={`search-result ${r.type}`}\n data-thumbnail-aspect-ratio={aspect}\n >\n <FigureTemplate\n record={r}\n query={query}\n layout={layout}\n thumbnailAspectRatio={aspect}\n />\n </div>\n );\n })}\n </div>\n );\n }\n\n // Default: grid (masonry)\n return (\n <div id=\"search-results\">\n <Grid>\n {results.map((r, i) => {\n if (shouldRenderAsArticle(r)) {\n return (\n <GridItem key={i} className={`search-result ${r && r.type}`}>\n <ArticleTemplate record={r} query={query} layout={layout} />\n </GridItem>\n );\n }\n const hasDims =\n Number.isFinite(Number(r.thumbnailWidth)) &&\n Number(r.thumbnailWidth) > 0 &&\n Number.isFinite(Number(r.thumbnailHeight)) &&\n Number(r.thumbnailHeight) > 0;\n const aspect = hasDims\n ? Number(r.thumbnailWidth) / Number(r.thumbnailHeight)\n : undefined;\n return (\n <GridItem\n key={i}\n className={`search-result ${r.type}`}\n data-thumbnail-aspect-ratio={aspect}\n >\n <FigureTemplate\n record={r}\n query={query}\n layout={layout}\n thumbnailAspectRatio={aspect}\n />\n </GridItem>\n );\n })}\n </Grid>\n </div>\n );\n}\n", "import React from \"react\";\n\nexport default function SearchTabs({\n type = \"all\",\n onTypeChange,\n types = [],\n counts = {},\n onOpenFilters,\n activeFilterCount = 0,\n filtersLabel = \"Filters\",\n filtersOpen = false,\n}) {\n const orderedTypes = Array.isArray(types) ? types : [];\n const toLabel = (t) =>\n t && t.length ? t.charAt(0).toUpperCase() + t.slice(1) : \"\";\n const hasFilters = typeof onOpenFilters === \"function\";\n const filterBadge = activeFilterCount > 0 ? ` (${activeFilterCount})` : \"\";\n return (\n <div className=\"canopy-search-tabs-wrapper\">\n <div\n role=\"tablist\"\n aria-label=\"Search types\"\n className=\"canopy-search-tabs\"\n >\n {orderedTypes.map((t) => {\n const active = String(type).toLowerCase() === String(t).toLowerCase();\n const cRaw =\n counts && Object.prototype.hasOwnProperty.call(counts, t)\n ? counts[t]\n : undefined;\n const c = Number.isFinite(Number(cRaw)) ? Number(cRaw) : 0;\n return (\n <button\n key={t}\n role=\"tab\"\n aria-selected={active}\n type=\"button\"\n onClick={() => onTypeChange && onTypeChange(t)}\n >\n {toLabel(t)} ({c})\n </button>\n );\n })}\n </div>\n {hasFilters ? (\n <button\n type=\"button\"\n onClick={() => onOpenFilters && onOpenFilters()}\n aria-expanded={filtersOpen ? \"true\" : \"false\"}\n className=\"inline-flex items-center gap-2 rounded-md border border-slate-200 bg-white px-3 py-1.5 text-sm font-medium text-slate-700 shadow-sm transition hover:border-brand-200 hover:bg-brand-50 hover:text-brand-700\"\n >\n <span>\n {filtersLabel}\n {filterBadge}\n </span>\n </button>\n ) : null}\n </div>\n );\n}\n", "import React from \"react\";\nimport CanopyModal from \"../layout/CanopyModal.jsx\";\n\nfunction toArray(input) {\n if (!input) return [];\n if (Array.isArray(input)) return input;\n return [input];\n}\n\nfunction normalizeSelected(selected = {}) {\n const map = new Map();\n if (selected && typeof selected === \"object\") {\n Object.keys(selected).forEach((key) => {\n const vals = new Set(toArray(selected[key]).map((v) => String(v)));\n if (vals.size) map.set(String(key), vals);\n });\n }\n return map;\n}\n\nfunction facetMatches(values = [], query) {\n const q = String(query || \"\")\n .trim()\n .toLowerCase();\n if (!q) return values;\n const starts = [];\n const contains = [];\n values.forEach((entry) => {\n if (!entry || !entry.value) return;\n const value = String(entry.value);\n const slug = String(entry.slug || entry.value || \"\");\n const match = value.toLowerCase();\n if (match.startsWith(q))\n starts.push({value, slug, doc_count: entry.doc_count});\n else if (match.includes(q))\n contains.push({value, slug, doc_count: entry.doc_count});\n });\n return [...starts, ...contains].slice(0, 10);\n}\n\nfunction FacetSection({facet, selected, onToggle}) {\n if (!facet || !facet.label || !Array.isArray(facet.values)) return null;\n const {label, slug, values} = facet;\n const selectedValues = selected.get(String(slug)) || new Set();\n const checkboxId = (valueSlug) => `filter-${slug}-${valueSlug}`;\n const hasSelection = selectedValues.size > 0;\n const [quickQuery, setQuickQuery] = React.useState(\"\");\n const hasQuery = quickQuery.trim().length > 0;\n const filteredValues = React.useMemo(\n () => facetMatches(values, quickQuery),\n [values, quickQuery]\n );\n\n return (\n <details\n className=\"canopy-search-filters__facet\"\n open={hasSelection}\n >\n <summary className=\"canopy-search-filters__facet-summary\">\n <span>{label}</span>\n <span className=\"canopy-search-filters__facet-count\">\n {values.length}\n </span>\n </summary>\n <div className=\"canopy-search-filters__facet-content\">\n <div className=\"canopy-search-filters__quick\">\n <input\n type=\"search\"\n value={quickQuery}\n onChange={(event) => setQuickQuery(event.target.value)}\n placeholder=\"Search values\"\n className=\"canopy-search-filters__quick-input\"\n aria-label={`Filter ${label} values`}\n />\n {quickQuery ? (\n <button\n type=\"button\"\n onClick={() => setQuickQuery(\"\")}\n className=\"canopy-search-filters__quick-clear\"\n >\n Clear\n </button>\n ) : null}\n </div>\n {hasQuery && !filteredValues.length ? (\n <p className=\"canopy-search-filters__facet-notice\">No matches found.</p>\n ) : null}\n <ul className=\"canopy-search-filters__facet-list\">\n {filteredValues.map((entry) => {\n const valueSlug = String(entry.slug || entry.value || \"\");\n const isChecked = selectedValues.has(valueSlug);\n const inputId = checkboxId(valueSlug);\n return (\n <li key={valueSlug} className=\"canopy-search-filters__facet-item\">\n <input\n id={inputId}\n type=\"checkbox\"\n className=\"canopy-search-filters__facet-checkbox\"\n checked={isChecked}\n onChange={(event) => {\n const nextChecked = !!event.target.checked;\n if (onToggle) onToggle(slug, valueSlug, nextChecked);\n }}\n />\n <label\n htmlFor={inputId}\n className=\"canopy-search-filters__facet-label\"\n >\n <span>\n {entry.value}{\" \"}\n {Number.isFinite(entry.doc_count) ? (\n <span className=\"canopy-search-filters__facet-count\">\n ({entry.doc_count})\n </span>\n ) : null}\n </span>\n </label>\n </li>\n );\n })}\n {!filteredValues.length && !hasQuery ? (\n <li className=\"canopy-search-filters__facet-empty\">No values available.</li>\n ) : null}\n </ul>\n </div>\n </details>\n );\n}\n\nexport default function SearchFiltersDialog(props = {}) {\n const {\n open = false,\n onOpenChange,\n facets = [],\n selected = {},\n onToggle,\n onClear,\n title,\n subtitle = \"Refine results by metadata\",\n brandLabel = \"Canopy IIIF\",\n brandHref = \"/\",\n logo: SiteLogo,\n } = props;\n\n const selectedMap = normalizeSelected(selected);\n const activeCount = Array.from(selectedMap.values()).reduce(\n (total, set) => total + set.size,\n 0\n );\n\n React.useEffect(() => {\n if (!open) return undefined;\n if (typeof document === \"undefined\") return undefined;\n const body = document.body;\n const root = document.documentElement;\n const prevBody = body ? body.style.overflow : \"\";\n const prevRoot = root ? root.style.overflow : \"\";\n if (body) body.style.overflow = \"hidden\";\n if (root) root.style.overflow = \"hidden\";\n return () => {\n if (body) body.style.overflow = prevBody;\n if (root) root.style.overflow = prevRoot;\n };\n }, [open]);\n\n if (!open) return null;\n\n const brandId = \"canopy-modal-filters-label\";\n const subtitleText = subtitle != null ? subtitle : title;\n\n return (\n <CanopyModal\n id=\"canopy-modal-filters\"\n variant=\"filters\"\n open\n labelledBy={brandId}\n label={brandLabel}\n logo={SiteLogo}\n href={brandHref}\n closeLabel=\"Close filters\"\n onClose={() => onOpenChange && onOpenChange(false)}\n onBackgroundClick={() => onOpenChange && onOpenChange(false)}\n bodyClassName=\"canopy-modal__body--filters\"\n >\n {subtitleText ? (\n <p className=\"canopy-search-filters__subtitle\">{subtitleText}</p>\n ) : null}\n <div className=\"canopy-search-filters__body\">\n {Array.isArray(facets) && facets.length ? (\n <div className=\"canopy-search-filters__facets\">\n {facets.map((facet) => (\n <FacetSection\n key={facet.slug || facet.label}\n facet={facet}\n selected={selectedMap}\n onToggle={onToggle}\n />\n ))}\n </div>\n ) : (\n <p className=\"canopy-search-filters__empty\">\n No filters are available for this collection.\n </p>\n )}\n </div>\n <footer className=\"canopy-search-filters__footer\">\n <div>\n {activeCount\n ? `${activeCount} filter${activeCount === 1 ? '' : 's'} applied`\n : 'No filters applied'}\n </div>\n <div className=\"canopy-search-filters__footer-actions\">\n <button\n type=\"button\"\n onClick={() => {\n if (onClear) onClear();\n }}\n disabled={!activeCount}\n className=\"canopy-search-filters__button canopy-search-filters__button--secondary\"\n >\n Clear all\n </button>\n <button\n type=\"button\"\n onClick={() => onOpenChange && onOpenChange(false)}\n className=\"canopy-search-filters__button canopy-search-filters__button--primary\"\n >\n Done\n </button>\n </div>\n </footer>\n </CanopyModal>\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 default function MarkdownTable({ className = '', ...rest }) {\n const merged = ['markdown-table', className].filter(Boolean).join(' ');\n return (\n <div className=\"markdown-table__frame\">\n <table className={merged} {...rest} />\n </div>\n );\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import React from \"react\";\n\nexport const HelloWorld = () => {\n return <div>Hello, World!</div>;\n};\n", "import React, { useEffect, useRef, useState } from \"react\";\n\n/**\n * Card\n *\n * Renders an anchor wrapping a figure with an image and caption.\n * Minimal styling; consumers can override via className/style.\n *\n * Props:\n * - href: string (required) \u2014 link target\n * - src: string (optional) \u2014 image source\n * - alt: string (optional) \u2014 image alt text (falls back to title)\n * - title: string (optional) \u2014 primary caption text\n * - subtitle: string (optional) \u2014 secondary caption text\n * - className: string (optional)\n * - style: object (optional)\n * - children: ReactNode (optional) \u2014 appended inside figcaption\n */\nexport default function Card({\n href,\n src,\n alt,\n title,\n subtitle,\n // Optional intrinsic dimensions or aspect ratio to compute a responsive height\n imgWidth,\n imgHeight,\n aspectRatio,\n className,\n style,\n children,\n lazy = true,\n ...rest\n}) {\n const containerRef = useRef(null);\n const [inView, setInView] = useState(!lazy);\n const [imageLoaded, setImageLoaded] = useState(!lazy);\n\n /**\n * Use IntersectionObserver to detect when the card enters the viewport.\n * When in view, setInView(true) to trigger image loading.\n * If IntersectionObserver is not supported, default to inView=true.\n */\n useEffect(() => {\n if (!lazy) return;\n if (!containerRef.current) return;\n if (typeof IntersectionObserver !== \"function\") {\n setInView(true);\n return;\n }\n const el = containerRef.current;\n const obs = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n setInView(true);\n try {\n obs.unobserve(el);\n } catch (_) {}\n break;\n }\n }\n },\n { root: null, rootMargin: \"100px\", threshold: 0.1 }\n );\n try {\n obs.observe(el);\n } catch (_) {}\n return () => {\n try {\n obs.disconnect();\n } catch (_) {}\n };\n }, [lazy]);\n\n /**\n * Calculate aspect ratio and padding percent for responsive image container.\n */\n const w = Number(imgWidth);\n const h = Number(imgHeight);\n const ratio =\n Number.isFinite(Number(aspectRatio)) && Number(aspectRatio) > 0\n ? Number(aspectRatio)\n : Number.isFinite(w) && w > 0 && Number.isFinite(h) && h > 0\n ? w / h\n : undefined;\n const paddingPercent = ratio ? 100 / ratio : 100;\n\n /**\n * Caption element (figcaption), rendered if title, subtitle, or children are provided.\n */\n const caption = (\n <figcaption>\n {title && <span>{title}</span>}\n {subtitle && <span>{subtitle}</span>}\n {children}\n </figcaption>\n );\n\n return (\n <a\n href={href}\n className={[\"canopy-card\", className].filter(Boolean).join(\" \")}\n style={style}\n ref={containerRef}\n data-aspect-ratio={ratio}\n data-in-view={inView ? \"true\" : \"false\"}\n data-image-loaded={imageLoaded ? \"true\" : \"false\"}\n {...rest}\n >\n <figure>\n {src ? (\n ratio ? (\n <div\n className=\"canopy-card-media\"\n style={{ \"--canopy-card-padding\": `${paddingPercent}%` }}\n >\n {inView ? (\n <img\n src={src}\n alt={alt || title || \"\"}\n loading=\"lazy\"\n onLoad={() => setImageLoaded(true)}\n onError={() => setImageLoaded(true)}\n />\n ) : null}\n </div>\n ) : (\n <img\n src={src}\n alt={alt || title || \"\"}\n loading=\"lazy\"\n onLoad={() => setImageLoaded(true)}\n onError={() => setImageLoaded(true)}\n className=\"canopy-card-image\"\n />\n )\n ) : null}\n {caption}\n </figure>\n </a>\n );\n}\n", "import React, {useMemo} from \"react\";\n\nfunction escapeRegExp(str = \"\") {\n return String(str).replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n}\n\nfunction buildSnippet({text = \"\", query = \"\", maxLength = 360}) {\n const clean = String(text || \"\")\n .replace(/\\s+/g, \" \")\n .trim();\n if (!clean) return \"\";\n const safeMax = Math.max(60, Number(maxLength) || 360);\n const term = String(query || \"\").trim();\n if (!term)\n return clean.length > safeMax ? clean.slice(0, safeMax).trimEnd() + \"\u2026\" : clean;\n const lower = clean.toLowerCase();\n const termLower = term.toLowerCase();\n const idx = lower.indexOf(termLower);\n if (idx === -1)\n return clean.length > safeMax ? clean.slice(0, safeMax).trimEnd() + \"\u2026\" : clean;\n const padding = Math.max(0, Math.floor((safeMax - term.length) / 2));\n let start = Math.max(0, idx - padding);\n let end = start + safeMax;\n if (end > clean.length) {\n end = clean.length;\n start = Math.max(0, end - safeMax);\n }\n let snippet = clean.slice(start, end).trim();\n if (start > 0) snippet = \"\u2026\" + snippet;\n if (end < clean.length) snippet = snippet + \"\u2026\";\n return snippet;\n}\n\nfunction highlightTextNode(text, query, keyPrefix = \"\") {\n if (!query) return text;\n const term = String(query).trim();\n if (!term) return text;\n const regex = new RegExp(`(${escapeRegExp(term)})`, \"gi\");\n const parts = String(text).split(regex);\n const termLower = term.toLowerCase();\n return parts.map((part, idx) => {\n if (!part) return null;\n if (part.toLowerCase() === termLower) {\n return (\n <mark key={`${keyPrefix}-${idx}`}>\n {part}\n </mark>\n );\n }\n return (\n <React.Fragment key={`${keyPrefix}-${idx}`}>\n {part}\n </React.Fragment>\n );\n });\n}\n\nfunction tokenizeInlineMarkdown(input = \"\") {\n const tokens = [];\n let text = input;\n while (text.length) {\n if (text.startsWith(\"\\n\")) {\n tokens.push({type: \"break\"});\n text = text.slice(1);\n continue;\n }\n if (text.startsWith(\"**\")) {\n const closing = text.indexOf(\"**\", 2);\n if (closing !== -1) {\n const inner = text.slice(2, closing);\n tokens.push({type: \"strong\", children: tokenizeInlineMarkdown(inner)});\n text = text.slice(closing + 2);\n continue;\n }\n }\n if (text.startsWith(\"__\")) {\n const closing = text.indexOf(\"__\", 2);\n if (closing !== -1) {\n const inner = text.slice(2, closing);\n tokens.push({type: \"strong\", children: tokenizeInlineMarkdown(inner)});\n text = text.slice(closing + 2);\n continue;\n }\n }\n if (text.startsWith(\"*\")) {\n if (!text.startsWith(\"**\")) {\n const closing = text.indexOf(\"*\", 1);\n if (closing !== -1) {\n const inner = text.slice(1, closing);\n tokens.push({type: \"em\", children: tokenizeInlineMarkdown(inner)});\n text = text.slice(closing + 1);\n continue;\n }\n }\n }\n if (text.startsWith(\"_\")) {\n if (!text.startsWith(\"__\")) {\n const closing = text.indexOf(\"_\", 1);\n if (closing !== -1) {\n const inner = text.slice(1, closing);\n tokens.push({type: \"em\", children: tokenizeInlineMarkdown(inner)});\n text = text.slice(closing + 1);\n continue;\n }\n }\n }\n if (text.startsWith(\"`\")) {\n const closing = text.indexOf(\"`\", 1);\n if (closing !== -1) {\n const inner = text.slice(1, closing);\n tokens.push({type: \"code\", value: inner});\n text = text.slice(closing + 1);\n continue;\n }\n }\n if (text.startsWith(\"[\")) {\n const endLabel = text.indexOf(\"]\");\n const startHref = endLabel !== -1 ? text.indexOf(\"(\", endLabel) : -1;\n const endHref = startHref !== -1 ? text.indexOf(\")\", startHref) : -1;\n if (endLabel !== -1 && startHref === endLabel + 1 && endHref !== -1) {\n const label = text.slice(1, endLabel);\n const href = text.slice(startHref + 1, endHref);\n tokens.push({\n type: \"link\",\n href,\n children: tokenizeInlineMarkdown(label),\n });\n text = text.slice(endHref + 1);\n continue;\n }\n }\n const specials = [\"**\", \"__\", \"*\", \"_\", \"`\", \"[\", \"\\n\"];\n const nextIndex = specials\n .map((needle) => (needle === \"\\n\" ? text.indexOf(\"\\n\") : text.indexOf(needle)))\n .filter((idx) => idx > 0)\n .reduce((min, idx) => (min === -1 || idx < min ? idx : min), -1);\n if (nextIndex === -1) {\n tokens.push({type: \"text\", value: text});\n break;\n }\n tokens.push({type: \"text\", value: text.slice(0, nextIndex)});\n text = text.slice(nextIndex);\n }\n return tokens;\n}\n\nfunction renderMarkdownTokens(tokens, query, keyPrefix = \"token\") {\n return tokens.map((token, idx) => {\n const key = `${keyPrefix}-${idx}`;\n switch (token.type) {\n case \"strong\":\n return (\n <strong key={key}>{renderMarkdownTokens(token.children || [], query, key)}</strong>\n );\n case \"em\":\n return (\n <em key={key}>{renderMarkdownTokens(token.children || [], query, key)}</em>\n );\n case \"code\":\n return (\n <code key={key}>{token.value}</code>\n );\n case \"link\":\n return (\n <a key={key} href={token.href} target=\"_blank\" rel=\"noreferrer\">\n {renderMarkdownTokens(token.children || [], query, key)}\n </a>\n );\n case \"break\":\n return <br key={key} />;\n case \"text\":\n default:\n return (\n <React.Fragment key={key}>\n {highlightTextNode(token.value || \"\", query, key)}\n </React.Fragment>\n );\n }\n });\n}\n\nfunction formatDisplayUrl(href = \"\") {\n try {\n const url = new URL(href, href.startsWith(\"http\") ? undefined : \"http://example.com\");\n if (!href.startsWith(\"http\")) return href;\n const displayPath = url.pathname.replace(/\\/$/, \"\");\n return `${url.host}${displayPath}${url.search}`.replace(/\\/$/, \"\");\n } catch (_) {\n return href;\n }\n}\n\nexport default function ArticleCard({\n href = \"#\",\n title = \"Untitled\",\n annotation = \"\",\n summary = \"\",\n summaryMarkdown = \"\",\n metadata = [],\n query = \"\",\n}) {\n const snippetSource = summaryMarkdown || annotation || summary;\n const snippet = useMemo(\n () => buildSnippet({text: snippetSource, query}),\n [snippetSource, query]\n );\n const snippetTokens = useMemo(\n () => tokenizeInlineMarkdown(snippet),\n [snippet]\n );\n const metaList = Array.isArray(metadata)\n ? metadata.map((m) => String(m || \"\")).filter(Boolean)\n : [];\n const displayUrl = useMemo(() => formatDisplayUrl(href), [href]);\n\n return (\n <a href={href} className=\"canopy-article-card\">\n <article>\n {displayUrl ? (\n <p className=\"canopy-article-card__url\">{displayUrl}</p>\n ) : null}\n <h3>{title}</h3>\n {snippet ? (\n <p className=\"canopy-article-card__snippet\">\n {renderMarkdownTokens(snippetTokens, query)}\n </p>\n ) : null}\n {metaList.length ? (\n <ul className=\"canopy-article-card__meta\">\n {metaList.slice(0, 3).map((item, idx) => (\n <li key={`${item}-${idx}`}>{item}</li>\n ))}\n </ul>\n ) : null}\n </article>\n </a>\n );\n}\n", "import Masonry from \"react-masonry-css\";\nimport React from \"react\";\n\n// Simple item wrapper to provide consistent spacing between items.\nexport function GridItem({children, className = \"\", style = {}, ...rest}) {\n return (\n <div\n className={`canopy-grid-item ${className}`.trim()}\n style={style}\n {...rest}\n >\n {children}\n </div>\n );\n}\n\n/**\n * Grid (Masonry)\n *\n * Lightweight wrapper around `react-masonry-css` with sensible defaults\n * and inline styles so it works without a global CSS pipeline.\n *\n * Props:\n * - breakpointCols: number | object \u2014 columns per breakpoint (react-masonry-css prop)\n * - gap: CSS length string \u2014 spacing between items/columns (default '1rem')\n * - paddingY: CSS length string \u2014 vertical padding for the grid (default '0')\n * - className, style \u2014 forwarded to container\n * - columnClassName \u2014 forwarded to Masonry (defaults to 'canopy-grid-column')\n * - children \u2014 usually a list of <GridItem> elements\n */\nexport default function Grid({\n breakpointCols,\n gap = \"1.618rem\",\n paddingY = \"0\",\n className = \"\",\n style = {},\n columnClassName = \"canopy-grid-column\",\n children,\n ...rest\n}) {\n const cols = breakpointCols || {\n default: 6,\n 1280: 5,\n 1024: 4,\n 768: 3,\n 640: 2,\n };\n const vars = {\"--grid-gap\": gap, \"--grid-padding-y\": paddingY};\n\n return (\n <div className=\"canopy-grid-wrap\">\n {/* Scoped styles so the component works standalone */}\n <style\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{\n __html: `\n .canopy-grid { display: flex; width: auto; position: relative; padding: var(--grid-padding-y, 0) 0; z-index: 1; }\n .canopy-grid .${columnClassName} { margin-left: var(--grid-gap, 1rem); }\n .canopy-grid .${columnClassName}:first-child { margin-left: 0; }\n .canopy-grid-item { margin-bottom: var(--grid-gap, 1rem); }\n `,\n }}\n />\n <Masonry\n breakpointCols={cols}\n className={`canopy-grid ${className}`.trim()}\n columnClassName={columnClassName}\n style={{...vars, ...style}}\n {...rest}\n >\n {children}\n </Masonry>\n </div>\n );\n}\n", "import React from \"react\";\n\nexport default function Container({\n className = \"\",\n variant = \"content\",\n children,\n ...rest\n}) {\n const variantClass = variant === \"wide\" ? \"max-w-wide\" : \"max-w-content\";\n const classes = [\"mx-auto\", variantClass, \"w-full\", className]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div\n className={classes}\n {...rest}\n style={{...rest.style, padding: \"1.618rem\"}}\n >\n {children}\n </div>\n );\n}\n", "import React from 'react';\n\nconst VARIANTS = new Set(['primary', 'secondary']);\n\nexport default function Button({\n label,\n href = '#',\n target,\n rel,\n variant = 'primary',\n className = '',\n children,\n ...rest\n}) {\n const resolvedVariant = VARIANTS.has(variant) ? variant : 'primary';\n const computedRel =\n target === '_blank' && !rel ? 'noopener noreferrer' : rel;\n const content = children != null ? children : label;\n\n if (!content) return null;\n\n const classes = [\n 'canopy-button',\n `canopy-button--${resolvedVariant}`,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <a\n href={href}\n className={classes}\n target={target}\n rel={computedRel}\n {...rest}\n >\n {content}\n </a>\n );\n}\n", "import React from 'react';\n\nexport default function ButtonWrapper({\n className = '',\n children,\n text = '',\n variant = 'default',\n ...rest\n}) {\n const variantClass =\n variant && variant !== 'default'\n ? `canopy-button-group--${variant}`\n : '';\n const classes = ['canopy-button-group', variantClass, className]\n .filter(Boolean)\n .join(' ');\n return (\n <div className={classes} {...rest}>\n {text && <span className=\"canopy-button-group__text\">{text}</span>}\n <div className=\"canopy-button-group__actions\">{children}</div>\n </div>\n );\n}\n", "import React from \"react\";\nimport SearchPanel from \"../search/SearchPanel.jsx\";\nimport CanopyBrand from \"./CanopyBrand.jsx\";\nimport CanopyModal from \"./CanopyModal.jsx\";\n\nfunction HeaderScript() {\n const code = `\n(function () {\n if (typeof window === 'undefined') return;\n\n var doc = document;\n var body = doc.body;\n var root = doc.documentElement;\n\n function ready(fn) {\n if (doc.readyState === 'loading') {\n doc.addEventListener('DOMContentLoaded', fn, { once: true });\n } else {\n fn();\n }\n }\n\n ready(function () {\n var header = doc.querySelector('.canopy-header');\n if (!header) return;\n\n var NAV_ATTR = 'data-mobile-nav';\n var SEARCH_ATTR = 'data-mobile-search';\n\n function modalFor(type) {\n return doc.querySelector('[data-canopy-modal=\"' + type + '\"]');\n }\n\n function each(list, fn) {\n if (!list || typeof fn !== 'function') return;\n Array.prototype.forEach.call(list, fn);\n }\n\n function setExpanded(type, expanded) {\n var toggles = header.querySelectorAll('[data-canopy-header-toggle=\"' + type + '\"]');\n each(toggles, function (btn) {\n btn.setAttribute('aria-expanded', expanded ? 'true' : 'false');\n });\n var modal = modalFor(type);\n if (modal) {\n modal.setAttribute('data-open', expanded ? 'true' : 'false');\n modal.setAttribute('aria-hidden', expanded ? 'false' : 'true');\n }\n }\n\n function lockScroll(shouldLock) {\n if (!body) return;\n if (shouldLock) {\n if (!body.dataset.canopyScrollLock) {\n body.dataset.canopyScrollPrevOverflow = body.style.overflow || '';\n if (root && root.dataset) {\n root.dataset.canopyScrollPrevOverflow = root.style.overflow || '';\n }\n }\n body.dataset.canopyScrollLock = '1';\n body.style.overflow = 'hidden';\n if (root) root.style.overflow = 'hidden';\n } else {\n if (body.dataset.canopyScrollLock) {\n delete body.dataset.canopyScrollLock;\n body.style.overflow = body.dataset.canopyScrollPrevOverflow || '';\n delete body.dataset.canopyScrollPrevOverflow;\n }\n if (root && root.dataset) {\n root.style.overflow = root.dataset.canopyScrollPrevOverflow || '';\n delete root.dataset.canopyScrollPrevOverflow;\n }\n }\n }\n\n function stateFor(type) {\n if (type === 'nav') return header.getAttribute(NAV_ATTR);\n if (type === 'search') return header.getAttribute(SEARCH_ATTR);\n return 'closed';\n }\n\n function focusSearchForm() {\n var input = header.querySelector('[data-canopy-search-form-input]');\n if (!input) return;\n var raf = typeof window !== 'undefined' && window.requestAnimationFrame;\n (raf || function (fn) { return setTimeout(fn, 16); })(function () {\n try {\n input.focus({ preventScroll: true });\n } catch (_) {\n try { input.focus(); } catch (_) {}\n }\n });\n }\n\n function focusNavMenu() {\n var modal = modalFor('nav');\n if (!modal) return;\n var target = modal.querySelector('button, a, input, [tabindex]:not([tabindex=\"-1\"])');\n if (!target) return;\n var raf = typeof window !== 'undefined' && window.requestAnimationFrame;\n (raf || function (fn) { return setTimeout(fn, 16); })(function () {\n try {\n target.focus({ preventScroll: true });\n } catch (_) {\n try { target.focus(); } catch (_) {}\n }\n });\n }\n\n function setState(type, next) {\n if (type === 'nav') header.setAttribute(NAV_ATTR, next);\n if (type === 'search') header.setAttribute(SEARCH_ATTR, next);\n setExpanded(type, next === 'open');\n var navOpen = header.getAttribute(NAV_ATTR) === 'open';\n var searchOpen = header.getAttribute(SEARCH_ATTR) === 'open';\n lockScroll(navOpen || searchOpen);\n }\n\n function toggle(type, force) {\n var current = stateFor(type) === 'open';\n var shouldOpen = typeof force === 'boolean' ? force : !current;\n if (shouldOpen && type === 'nav') setState('search', 'closed');\n if (shouldOpen && type === 'search') setState('nav', 'closed');\n setState(type, shouldOpen ? 'open' : 'closed');\n if (type === 'search' && shouldOpen) focusSearchForm();\n if (type === 'nav' && shouldOpen) focusNavMenu();\n }\n\n each(header.querySelectorAll('[data-canopy-header-toggle]'), function (btn) {\n btn.addEventListener('click', function (event) {\n event.preventDefault();\n var type = btn.getAttribute('data-canopy-header-toggle');\n if (!type) return;\n toggle(type);\n });\n });\n\n each(doc.querySelectorAll('[data-canopy-header-close]'), function (btn) {\n btn.addEventListener('click', function () {\n var type = btn.getAttribute('data-canopy-header-close');\n if (!type) return;\n toggle(type, false);\n });\n });\n\n var navModal = modalFor('nav');\n if (navModal) {\n navModal.addEventListener('click', function (event) {\n if (event.target === navModal) {\n toggle('nav', false);\n return;\n }\n var target = event.target && event.target.closest && event.target.closest('a');\n if (!target) return;\n toggle('nav', false);\n });\n }\n\n var searchModal = modalFor('search');\n if (searchModal) {\n searchModal.addEventListener('click', function (event) {\n if (event.target === searchModal) toggle('search', false);\n });\n }\n\n doc.addEventListener('keydown', function (event) {\n if (event.key !== 'Escape') return;\n var navOpen = header.getAttribute(NAV_ATTR) === 'open';\n var searchOpen = header.getAttribute(SEARCH_ATTR) === 'open';\n if (!navOpen && !searchOpen) return;\n event.preventDefault();\n toggle('nav', false);\n toggle('search', false);\n });\n\n var mq = window.matchMedia('(min-width: 48rem)');\n function syncDesktopState() {\n if (mq.matches) {\n setState('nav', 'closed');\n setState('search', 'closed');\n setExpanded('nav', false);\n setExpanded('search', false);\n lockScroll(false);\n }\n }\n\n try {\n mq.addEventListener('change', syncDesktopState);\n } catch (_) {\n mq.addListener(syncDesktopState);\n }\n\n syncDesktopState();\n });\n})();\n `;\n\n return (\n <script\n dangerouslySetInnerHTML={{\n __html: code,\n }}\n />\n );\n}\n\nfunction ensureArray(navLinks) {\n if (!Array.isArray(navLinks)) return [];\n return navLinks.filter(\n (link) => link && typeof link === \"object\" && typeof link.href === \"string\"\n );\n}\n\nexport default function CanopyHeader(props = {}) {\n const {\n navigation: navLinksProp,\n searchLabel = \"Search\",\n searchHotkey = \"mod+k\",\n searchPlaceholder = \"Search\u2026\",\n brandHref = \"/\",\n title = \"Canopy IIIF\",\n logo: SiteLogo,\n } = props;\n\n const navLinks = ensureArray(navLinksProp);\n\n return (\n <>\n <header\n className=\"canopy-header\"\n data-mobile-nav=\"closed\"\n data-mobile-search=\"closed\"\n >\n <div className=\"canopy-header__brand\">\n <CanopyBrand\n label={title}\n href={brandHref}\n className=\"canopy-header__brand-link\"\n Logo={SiteLogo}\n />\n </div>\n\n <div className=\"canopy-header__desktop-search\">\n <SearchPanel\n label={searchLabel}\n hotkey={searchHotkey}\n placeholder={searchPlaceholder}\n />\n </div>\n\n <nav\n className=\"canopy-nav-links canopy-header__desktop-nav\"\n aria-label=\"Primary navigation\"\n >\n {navLinks.map((link) => (\n <a key={link.href} href={link.href}>\n {link.label || link.href}\n </a>\n ))}\n </nav>\n\n <div className=\"canopy-header__actions\">\n <button\n type=\"button\"\n className=\"canopy-header__icon-button canopy-header__search-trigger\"\n aria-label=\"Open search\"\n aria-controls=\"canopy-modal-search\"\n aria-expanded=\"false\"\n data-canopy-header-toggle=\"search\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n className=\"canopy-header__search-icon\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m21 21-3.8-3.8M10.5 18a7.5 7.5 0 1 1 0-15 7.5 7.5 0 0 1 0 15Z\"\n />\n </svg>\n </button>\n <button\n type=\"button\"\n className=\"canopy-header__icon-button canopy-header__menu\"\n aria-label=\"Open navigation\"\n aria-controls=\"canopy-modal-nav\"\n aria-expanded=\"false\"\n data-canopy-header-toggle=\"nav\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"1.5\"\n stroke=\"currentColor\"\n className=\"canopy-header__menu-icon\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5\"\n />\n </svg>\n </button>\n </div>\n </header>\n\n <CanopyModal\n id=\"canopy-modal-nav\"\n variant=\"nav\"\n labelledBy=\"canopy-modal-nav-label\"\n label={title}\n logo={SiteLogo}\n href={brandHref}\n closeLabel=\"Close navigation\"\n closeDataAttr=\"nav\"\n >\n <nav\n className=\"canopy-nav-links canopy-modal__nav\"\n aria-label=\"Primary navigation\"\n >\n {navLinks.map((link) => (\n <a key={link.href} href={link.href}>\n {link.label || link.href}\n </a>\n ))}\n </nav>\n </CanopyModal>\n\n <CanopyModal\n id=\"canopy-modal-search\"\n variant=\"search\"\n labelledBy=\"canopy-modal-search-label\"\n label={title}\n logo={SiteLogo}\n href={brandHref}\n closeLabel=\"Close search\"\n closeDataAttr=\"search\"\n bodyClassName=\"canopy-modal__body--search\"\n >\n <SearchPanel\n label={searchLabel}\n hotkey={searchHotkey}\n placeholder={searchPlaceholder}\n />\n </CanopyModal>\n\n <HeaderScript />\n </>\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\";\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 {text}\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';\n\nexport default function CanopyBrand(props = {}) {\n const {\n labelId,\n label = 'Canopy IIIF',\n href = '/',\n className,\n Logo,\n } = props || {};\n const spanProps = labelId ? {id: labelId} : {};\n const classes = ['canopy-logo', className].filter(Boolean).join(' ');\n\n return (\n <a href={href} className={classes}>\n {typeof Logo === 'function' ? <Logo /> : null}\n <span {...spanProps}>{label}</span>\n </a>\n );\n}\n", "import React from 'react';\nimport CanopyBrand from './CanopyBrand.jsx';\n\nexport default function CanopyModal(props = {}) {\n const {\n id,\n variant,\n open = false,\n labelledBy,\n label,\n logo: Logo,\n href = '/',\n closeLabel = 'Close',\n closeDataAttr,\n onClose,\n onBackgroundClick,\n bodyClassName,\n padded = true,\n className,\n children,\n } = props;\n\n const rootClassName = ['canopy-modal', variant ? `canopy-modal--${variant}` : null, className]\n .filter(Boolean)\n .join(' ');\n\n const modalProps = {\n id,\n className: rootClassName,\n role: 'dialog',\n 'aria-modal': 'true',\n 'aria-hidden': open ? 'false' : 'true',\n 'data-open': open ? 'true' : 'false',\n };\n\n if (variant) modalProps['data-canopy-modal'] = variant;\n\n const resolvedLabelId = labelledBy || (label ? `${variant || 'modal'}-label` : undefined);\n if (resolvedLabelId) modalProps['aria-labelledby'] = resolvedLabelId;\n\n if (typeof onBackgroundClick === 'function') {\n modalProps.onClick = (event) => {\n if (event.target === event.currentTarget) onBackgroundClick(event);\n };\n }\n\n const closeButtonProps = {\n type: 'button',\n className: 'canopy-modal__close',\n 'aria-label': closeLabel,\n };\n\n if (typeof closeDataAttr === 'string' && closeDataAttr) {\n closeButtonProps['data-canopy-header-close'] = closeDataAttr;\n }\n\n if (typeof onClose === 'function') {\n closeButtonProps.onClick = onClose;\n }\n\n const bodyClasses = ['canopy-modal__body'];\n if (padded) bodyClasses.push('canopy-modal__body--padded');\n if (bodyClassName) bodyClasses.push(bodyClassName);\n const bodyClassNameValue = bodyClasses.join(' ');\n\n return (\n <div {...modalProps}>\n <div className=\"canopy-modal__panel\">\n <button {...closeButtonProps}>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n className=\"canopy-modal__close-icon\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 6l12 12M6 18L18 6\" />\n </svg>\n <span className=\"sr-only\">{closeLabel}</span>\n </button>\n <div className={bodyClassNameValue}>\n {label ? (\n <div className=\"canopy-modal__brand\">\n <CanopyBrand\n labelId={resolvedLabelId}\n label={label}\n href={href}\n Logo={Logo}\n className=\"canopy-modal__brand-link\"\n />\n </div>\n ) : null}\n {children}\n </div>\n </div>\n </div>\n );\n}\n", "import React from 'react';\n\nexport default function CanopyFooter({ className = '', children }) {\n const footerClassName = ['canopy-footer', className].filter(Boolean).join(' ');\n\n return (\n <footer className={footerClassName}>\n <div className=\"canopy-footer__inner\">{children}</div>\n </footer>\n );\n}\n", "import React, { useEffect, useState } from \"react\";\n\n// SSR-safe wrapper around Clover's viewer. Clover touches the DOM at import time,\n// so we dynamically import it only in the browser.\n\n// Default Clover viewer options; can be overridden per-usage via props.options\nconst DEFAULT_VIEWER_OPTIONS = {\n showDownload: false,\n showIIIFBadge: false,\n showTitle: false,\n informationPanel: {\n open: false,\n renderAbout: false,\n renderToggle: false,\n },\n};\n\nfunction isPlainObject(val) {\n return val && typeof val === \"object\" && !Array.isArray(val);\n}\n\nfunction deepMerge(base, override) {\n if (!isPlainObject(base)) return override;\n const out = { ...base };\n if (!isPlainObject(override)) return out;\n for (const key of Object.keys(override)) {\n const a = base[key];\n const b = override[key];\n if (isPlainObject(a) && isPlainObject(b)) out[key] = deepMerge(a, b);\n else out[key] = b;\n }\n return out;\n}\n\nexport const Viewer = (props) => {\n const [CloverViewer, setCloverViewer] = useState(null);\n const mergedOptions = deepMerge(\n DEFAULT_VIEWER_OPTIONS,\n props && props.options\n );\n\n useEffect(() => {\n let mounted = true;\n const canUseDom =\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\n if (canUseDom) {\n import(\"@samvera/clover-iiif/viewer\")\n .then((mod) => {\n if (!mounted) return;\n // Loaded Clover viewer dynamically in the browser\n const Comp = mod && (mod.default || mod.Viewer || mod);\n setCloverViewer(() => Comp);\n })\n .catch(() => {\n // Silently ignore load errors on the server or if Clover is unavailable\n });\n }\n return () => {\n mounted = false;\n };\n }, []);\n\n if (!CloverViewer) {\n // SSR placeholder for client hydration; props provided as JSON\n let json = \"{}\";\n try {\n const p = { ...(props || {}) };\n if (mergedOptions) p.options = mergedOptions;\n json = JSON.stringify(p);\n } catch (_) {\n json = \"{}\";\n }\n return (\n <div data-canopy-viewer=\"1\" className=\"not-prose\">\n <script\n type=\"application/json\"\n dangerouslySetInnerHTML={{ __html: json }}\n />\n </div>\n );\n }\n return <CloverViewer {...props} options={mergedOptions} />;\n};\n", "import React, { useEffect, useState } from \"react\";\n\n// SSR-safe wrapper around Clover's slider. Clover touches the DOM at import time,\n// so we dynamically import it only in the browser.\nexport const Slider = (props) => {\n const [CloverSlider, setCloverSlider] = useState(null);\n\n useEffect(() => {\n let mounted = true;\n const canUseDom =\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\n if (canUseDom) {\n import(\"@samvera/clover-iiif/slider\")\n .then((mod) => {\n if (!mounted) return;\n console.log(mod);\n const Comp = mod && (mod.default || mod.Slider || mod);\n setCloverSlider(() => Comp);\n })\n .catch(() => {\n // Silently ignore load errors on the server or if Clover is unavailable\n });\n }\n return () => {\n mounted = false;\n };\n }, []);\n\n if (!CloverSlider) {\n // SSR placeholder for client hydration; props provided as JSON\n let json = \"{}\";\n try {\n json = JSON.stringify(props || {});\n } catch (_) {\n json = \"{}\";\n }\n return (\n <div data-canopy-slider=\"1\" className=\"not-prose\">\n <script\n type=\"application/json\"\n dangerouslySetInnerHTML={{ __html: json }}\n />\n </div>\n );\n }\n return <CloverSlider {...props} />;\n};\n", "import React, { 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, {useEffect, useState} from \"react\";\n\n// SSR-safe wrapper around Clover's image component. The module relies on the DOM\n// during import, so we lazy-load it in the browser and render a placeholder on the\n// server for the hydration runtime.\nexport const Image = (props = {}) => {\n const [CloverImage, setCloverImage] = useState(null);\n const baseClass = \"canopy-iiif-image\";\n const {\n height = `600px`,\n backgroundColor = `var(--color-gray-200)`,\n caption,\n className: userClassName,\n } = props || {};\n const rootClassName = [userClassName, baseClass].filter(Boolean).join(\" \");\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/image\")\n .then((mod) => {\n if (!mounted) return;\n const Comp = mod && (mod.default || mod.Image || mod);\n setCloverImage(() => Comp);\n })\n .catch(() => {\n // Suppress errors during SSR or when the Clover bundle is unavailable.\n });\n }\n return () => {\n mounted = false;\n };\n }, []);\n\n if (!CloverImage) {\n let json = \"{}\";\n try {\n json = JSON.stringify(props || {});\n } catch (_) {\n json = \"{}\";\n }\n\n return (\n <figure className={rootClassName}>\n <div\n className={`${baseClass}__placeholder`}\n data-canopy-image=\"1\"\n style={{\n \"--canopy-iiif-image-height\": height,\n \"--canopy-iiif-image-bg\": backgroundColor,\n }}\n >\n <script\n type=\"application/json\"\n dangerouslySetInnerHTML={{__html: json}}\n />\n </div>\n {caption && (\n <figcaption className={`${baseClass}__caption`}>\n {caption}\n </figcaption>\n )}\n </figure>\n );\n }\n\n return <CloverImage {...props} className={rootClassName} />;\n};\n", "import React from 'react';\n\n// SSR-safe placeholder for RelatedItems. Hydrated by canopy-related-items.js + canopy-slider.js\nexport default function MdxRelatedItems(props) {\n let json = '{}';\n try {\n json = JSON.stringify(props || {});\n } catch (_) {\n json = '{}';\n }\n return (\n <div data-canopy-related-items=\"1\" className=\"not-prose\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n", "import React from 'react';\n\nexport default function 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 Grid, { GridItem } from \"../layout/Grid.jsx\";\nimport ArticleCard from \"../layout/ArticleCard.jsx\";\nimport Card from \"../layout/Card.jsx\";\nimport React from \"react\";\n\nfunction DefaultArticleTemplate({ record, query }) {\n if (!record) return null;\n const metadata = Array.isArray(record.metadata) ? record.metadata : [];\n return (\n <ArticleCard\n href={record.href}\n title={record.title || record.href || 'Untitled'}\n annotation={record.annotation}\n summary={record.summary || record.summaryValue || ''}\n summaryMarkdown={record.summaryMarkdown || record.summary || record.summaryValue || ''}\n metadata={metadata}\n query={query}\n />\n );\n}\n\nfunction DefaultFigureTemplate({ record, thumbnailAspectRatio }) {\n if (!record) return null;\n const hasDims =\n Number.isFinite(Number(record.thumbnailWidth)) &&\n Number(record.thumbnailWidth) > 0 &&\n Number.isFinite(Number(record.thumbnailHeight)) &&\n Number(record.thumbnailHeight) > 0;\n const aspect = Number.isFinite(Number(thumbnailAspectRatio)) && Number(thumbnailAspectRatio) > 0\n ? Number(thumbnailAspectRatio)\n : hasDims\n ? Number(record.thumbnailWidth) / Number(record.thumbnailHeight)\n : undefined;\n return (\n <Card\n href={record.href}\n title={record.title || record.href}\n src={record.type === 'work' ? record.thumbnail : undefined}\n imgWidth={record.thumbnailWidth}\n imgHeight={record.thumbnailHeight}\n aspectRatio={aspect}\n />\n );\n}\n\nexport default function SearchResults({\n results = [],\n type = \"all\",\n layout = \"grid\",\n query = \"\",\n templates = {},\n variant = \"auto\",\n}) {\n if (!results.length) {\n return (\n <div className=\"text-slate-600\">\n <em>No results</em>\n </div>\n );\n }\n\n const normalizedType = String(type || 'all').toLowerCase();\n const normalizedVariant =\n variant === 'figure' || variant === 'article' ? variant : 'auto';\n const isAnnotationView = normalizedType === \"annotation\";\n const FigureTemplate = templates && templates.figure ? templates.figure : DefaultFigureTemplate;\n const ArticleTemplate = templates && templates.article ? templates.article : DefaultArticleTemplate;\n\n if (isAnnotationView) {\n return (\n <div id=\"search-results\" className=\"space-y-4\">\n {results.map((r, i) => {\n if (!r) return null;\n return (\n <ArticleTemplate\n key={r.id || i}\n record={r}\n query={query}\n layout={layout}\n />\n );\n })}\n </div>\n );\n }\n\n const isWorkRecord = (record) => String(record && record.type).toLowerCase() === 'work';\n\n const shouldRenderAsArticle = (record) => {\n if (normalizedVariant === 'article') return true;\n if (normalizedVariant === 'figure') return false;\n return !isWorkRecord(record) || normalizedType !== 'work';\n };\n\n if (layout === \"list\") {\n return (\n <div id=\"search-results\" className=\"space-y-6\">\n {results.map((r, i) => {\n if (shouldRenderAsArticle(r)) {\n return (\n <div key={i} className={`search-result ${r && r.type}`}>\n <ArticleTemplate record={r} query={query} layout={layout} />\n </div>\n );\n }\n const hasDims =\n Number.isFinite(Number(r.thumbnailWidth)) &&\n Number(r.thumbnailWidth) > 0 &&\n Number.isFinite(Number(r.thumbnailHeight)) &&\n Number(r.thumbnailHeight) > 0;\n const aspect = hasDims\n ? Number(r.thumbnailWidth) / Number(r.thumbnailHeight)\n : undefined;\n return (\n <div\n key={i}\n className={`search-result ${r.type}`}\n data-thumbnail-aspect-ratio={aspect}\n >\n <FigureTemplate\n record={r}\n query={query}\n layout={layout}\n thumbnailAspectRatio={aspect}\n />\n </div>\n );\n })}\n </div>\n );\n }\n\n // Default: grid (masonry)\n return (\n <div id=\"search-results\">\n <Grid>\n {results.map((r, i) => {\n if (shouldRenderAsArticle(r)) {\n return (\n <GridItem key={i} className={`search-result ${r && r.type}`}>\n <ArticleTemplate record={r} query={query} layout={layout} />\n </GridItem>\n );\n }\n const hasDims =\n Number.isFinite(Number(r.thumbnailWidth)) &&\n Number(r.thumbnailWidth) > 0 &&\n Number.isFinite(Number(r.thumbnailHeight)) &&\n Number(r.thumbnailHeight) > 0;\n const aspect = hasDims\n ? Number(r.thumbnailWidth) / Number(r.thumbnailHeight)\n : undefined;\n return (\n <GridItem\n key={i}\n className={`search-result ${r.type}`}\n data-thumbnail-aspect-ratio={aspect}\n >\n <FigureTemplate\n record={r}\n query={query}\n layout={layout}\n thumbnailAspectRatio={aspect}\n />\n </GridItem>\n );\n })}\n </Grid>\n </div>\n );\n}\n", "import React from \"react\";\n\nexport default function SearchTabs({\n type = \"all\",\n onTypeChange,\n types = [],\n counts = {},\n onOpenFilters,\n activeFilterCount = 0,\n filtersLabel = \"Filters\",\n filtersOpen = false,\n}) {\n const orderedTypes = Array.isArray(types) ? types : [];\n const toLabel = (t) =>\n t && t.length ? t.charAt(0).toUpperCase() + t.slice(1) : \"\";\n const hasFilters = typeof onOpenFilters === \"function\";\n const filterBadge = activeFilterCount > 0 ? ` (${activeFilterCount})` : \"\";\n return (\n <div className=\"canopy-search-tabs-wrapper\">\n <div\n role=\"tablist\"\n aria-label=\"Search types\"\n className=\"canopy-search-tabs\"\n >\n {orderedTypes.map((t) => {\n const active = String(type).toLowerCase() === String(t).toLowerCase();\n const cRaw =\n counts && Object.prototype.hasOwnProperty.call(counts, t)\n ? counts[t]\n : undefined;\n const c = Number.isFinite(Number(cRaw)) ? Number(cRaw) : 0;\n return (\n <button\n key={t}\n role=\"tab\"\n aria-selected={active}\n type=\"button\"\n onClick={() => onTypeChange && onTypeChange(t)}\n >\n {toLabel(t)} ({c})\n </button>\n );\n })}\n </div>\n {hasFilters ? (\n <button\n type=\"button\"\n onClick={() => onOpenFilters && onOpenFilters()}\n aria-expanded={filtersOpen ? \"true\" : \"false\"}\n className=\"inline-flex items-center gap-2 rounded-md border border-slate-200 bg-white px-3 py-1.5 text-sm font-medium text-slate-700 shadow-sm transition hover:border-brand-200 hover:bg-brand-50 hover:text-brand-700\"\n >\n <span>\n {filtersLabel}\n {filterBadge}\n </span>\n </button>\n ) : null}\n </div>\n );\n}\n", "import React from \"react\";\nimport CanopyModal from \"../layout/CanopyModal.jsx\";\n\nfunction toArray(input) {\n if (!input) return [];\n if (Array.isArray(input)) return input;\n return [input];\n}\n\nfunction normalizeSelected(selected = {}) {\n const map = new Map();\n if (selected && typeof selected === \"object\") {\n Object.keys(selected).forEach((key) => {\n const vals = new Set(toArray(selected[key]).map((v) => String(v)));\n if (vals.size) map.set(String(key), vals);\n });\n }\n return map;\n}\n\nfunction facetMatches(values = [], query) {\n const q = String(query || \"\")\n .trim()\n .toLowerCase();\n if (!q) return values;\n const starts = [];\n const contains = [];\n values.forEach((entry) => {\n if (!entry || !entry.value) return;\n const value = String(entry.value);\n const slug = String(entry.slug || entry.value || \"\");\n const match = value.toLowerCase();\n if (match.startsWith(q))\n starts.push({value, slug, doc_count: entry.doc_count});\n else if (match.includes(q))\n contains.push({value, slug, doc_count: entry.doc_count});\n });\n return [...starts, ...contains].slice(0, 10);\n}\n\nfunction FacetSection({facet, selected, onToggle}) {\n if (!facet || !facet.label || !Array.isArray(facet.values)) return null;\n const {label, slug, values} = facet;\n const selectedValues = selected.get(String(slug)) || new Set();\n const checkboxId = (valueSlug) => `filter-${slug}-${valueSlug}`;\n const hasSelection = selectedValues.size > 0;\n const [quickQuery, setQuickQuery] = React.useState(\"\");\n const hasQuery = quickQuery.trim().length > 0;\n const filteredValues = React.useMemo(\n () => facetMatches(values, quickQuery),\n [values, quickQuery]\n );\n\n return (\n <details\n className=\"canopy-search-filters__facet\"\n open={hasSelection}\n >\n <summary className=\"canopy-search-filters__facet-summary\">\n <span>{label}</span>\n <span className=\"canopy-search-filters__facet-count\">\n {values.length}\n </span>\n </summary>\n <div className=\"canopy-search-filters__facet-content\">\n <div className=\"canopy-search-filters__quick\">\n <input\n type=\"search\"\n value={quickQuery}\n onChange={(event) => setQuickQuery(event.target.value)}\n placeholder=\"Search values\"\n className=\"canopy-search-filters__quick-input\"\n aria-label={`Filter ${label} values`}\n />\n {quickQuery ? (\n <button\n type=\"button\"\n onClick={() => setQuickQuery(\"\")}\n className=\"canopy-search-filters__quick-clear\"\n >\n Clear\n </button>\n ) : null}\n </div>\n {hasQuery && !filteredValues.length ? (\n <p className=\"canopy-search-filters__facet-notice\">No matches found.</p>\n ) : null}\n <ul className=\"canopy-search-filters__facet-list\">\n {filteredValues.map((entry) => {\n const valueSlug = String(entry.slug || entry.value || \"\");\n const isChecked = selectedValues.has(valueSlug);\n const inputId = checkboxId(valueSlug);\n return (\n <li key={valueSlug} className=\"canopy-search-filters__facet-item\">\n <input\n id={inputId}\n type=\"checkbox\"\n className=\"canopy-search-filters__facet-checkbox\"\n checked={isChecked}\n onChange={(event) => {\n const nextChecked = !!event.target.checked;\n if (onToggle) onToggle(slug, valueSlug, nextChecked);\n }}\n />\n <label\n htmlFor={inputId}\n className=\"canopy-search-filters__facet-label\"\n >\n <span>\n {entry.value}{\" \"}\n {Number.isFinite(entry.doc_count) ? (\n <span className=\"canopy-search-filters__facet-count\">\n ({entry.doc_count})\n </span>\n ) : null}\n </span>\n </label>\n </li>\n );\n })}\n {!filteredValues.length && !hasQuery ? (\n <li className=\"canopy-search-filters__facet-empty\">No values available.</li>\n ) : null}\n </ul>\n </div>\n </details>\n );\n}\n\nexport default function SearchFiltersDialog(props = {}) {\n const {\n open = false,\n onOpenChange,\n facets = [],\n selected = {},\n onToggle,\n onClear,\n title,\n subtitle = \"Refine results by metadata\",\n brandLabel = \"Canopy IIIF\",\n brandHref = \"/\",\n logo: SiteLogo,\n } = props;\n\n const selectedMap = normalizeSelected(selected);\n const activeCount = Array.from(selectedMap.values()).reduce(\n (total, set) => total + set.size,\n 0\n );\n\n React.useEffect(() => {\n if (!open) return undefined;\n if (typeof document === \"undefined\") return undefined;\n const body = document.body;\n const root = document.documentElement;\n const prevBody = body ? body.style.overflow : \"\";\n const prevRoot = root ? root.style.overflow : \"\";\n if (body) body.style.overflow = \"hidden\";\n if (root) root.style.overflow = \"hidden\";\n return () => {\n if (body) body.style.overflow = prevBody;\n if (root) root.style.overflow = prevRoot;\n };\n }, [open]);\n\n if (!open) return null;\n\n const brandId = \"canopy-modal-filters-label\";\n const subtitleText = subtitle != null ? subtitle : title;\n\n return (\n <CanopyModal\n id=\"canopy-modal-filters\"\n variant=\"filters\"\n open\n labelledBy={brandId}\n label={brandLabel}\n logo={SiteLogo}\n href={brandHref}\n closeLabel=\"Close filters\"\n onClose={() => onOpenChange && onOpenChange(false)}\n onBackgroundClick={() => onOpenChange && onOpenChange(false)}\n bodyClassName=\"canopy-modal__body--filters\"\n >\n {subtitleText ? (\n <p className=\"canopy-search-filters__subtitle\">{subtitleText}</p>\n ) : null}\n <div className=\"canopy-search-filters__body\">\n {Array.isArray(facets) && facets.length ? (\n <div className=\"canopy-search-filters__facets\">\n {facets.map((facet) => (\n <FacetSection\n key={facet.slug || facet.label}\n facet={facet}\n selected={selectedMap}\n onToggle={onToggle}\n />\n ))}\n </div>\n ) : (\n <p className=\"canopy-search-filters__empty\">\n No filters are available for this collection.\n </p>\n )}\n </div>\n <footer className=\"canopy-search-filters__footer\">\n <div>\n {activeCount\n ? `${activeCount} filter${activeCount === 1 ? '' : 's'} applied`\n : 'No filters applied'}\n </div>\n <div className=\"canopy-search-filters__footer-actions\">\n <button\n type=\"button\"\n onClick={() => {\n if (onClear) onClear();\n }}\n disabled={!activeCount}\n className=\"canopy-search-filters__button canopy-search-filters__button--secondary\"\n >\n Clear all\n </button>\n <button\n type=\"button\"\n onClick={() => onOpenChange && onOpenChange(false)}\n className=\"canopy-search-filters__button canopy-search-filters__button--primary\"\n >\n Done\n </button>\n </div>\n </footer>\n </CanopyModal>\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 default function MarkdownTable({ className = '', ...rest }) {\n const merged = ['markdown-table', className].filter(Boolean).join(' ');\n return (\n <div className=\"markdown-table__frame\">\n <table className={merged} {...rest} />\n </div>\n );\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["React", "React", "React", "React", "React", "React", "React", "React", "React", "React", "_", "React", "React", "React", "React", "React", "React", "React", "React", "useEffect", "useState", "React", "useEffect", "useState", "React", "useEffect", "useState", "React", "useEffect", "useState", "React", "React", "React", "React", "React", "React", "React", "React", "React", "React", "React"]
7
7
  }