@canopy-iiif/app 0.8.3 → 0.8.5
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/build.js +2 -0
- package/lib/build/dev.js +38 -22
- package/lib/build/iiif.js +359 -83
- package/lib/build/mdx.js +12 -2
- package/lib/build/pages.js +15 -1
- package/lib/build/styles.js +53 -1
- package/lib/common.js +28 -6
- package/lib/components/navigation.js +308 -0
- package/lib/page-context.js +14 -0
- package/lib/search/search-app.jsx +177 -25
- package/lib/search/search-form-runtime.js +126 -19
- package/lib/search/search.js +130 -18
- package/package.json +4 -1
- package/ui/dist/index.mjs +204 -101
- package/ui/dist/index.mjs.map +4 -4
- package/ui/dist/server.mjs +167 -59
- package/ui/dist/server.mjs.map +4 -4
- package/ui/styles/_variables.scss +1 -0
- package/ui/styles/base/_common.scss +27 -5
- package/ui/styles/base/_heading.scss +2 -4
- package/ui/styles/base/index.scss +1 -0
- package/ui/styles/components/_card.scss +47 -4
- package/ui/styles/components/_sub-navigation.scss +76 -0
- package/ui/styles/components/header/_header.scss +1 -4
- package/ui/styles/components/header/_logo.scss +33 -10
- package/ui/styles/components/index.scss +1 -0
- package/ui/styles/components/search/_filters.scss +5 -7
- package/ui/styles/components/search/_form.scss +55 -17
- package/ui/styles/components/search/_results.scss +49 -14
- package/ui/styles/index.css +344 -56
- package/ui/styles/index.scss +2 -4
- package/ui/tailwind-canopy-iiif-plugin.js +10 -2
- package/ui/tailwind-canopy-iiif-preset.js +21 -19
- package/ui/theme.js +303 -0
- package/ui/styles/variables.emit.scss +0 -72
- package/ui/styles/variables.scss +0 -76
package/ui/dist/server.mjs
CHANGED
|
@@ -244,8 +244,96 @@ function FeaturedHero(props = {}) {
|
|
|
244
244
|
return /* @__PURE__ */ React6.createElement(Hero, { ...props });
|
|
245
245
|
}
|
|
246
246
|
|
|
247
|
-
// ui/src/
|
|
247
|
+
// ui/src/layout/SubNavigation.jsx
|
|
248
248
|
import React7 from "react";
|
|
249
|
+
import navigationHelpers from "@canopy-iiif/app/lib/components/navigation.js";
|
|
250
|
+
function resolveRelativeCandidate(page, current) {
|
|
251
|
+
if (page && typeof page.relativePath === "string" && page.relativePath) return page.relativePath;
|
|
252
|
+
if (page && typeof page.slug === "string" && page.slug) return page.slug;
|
|
253
|
+
if (typeof current === "string" && current) return current;
|
|
254
|
+
return "";
|
|
255
|
+
}
|
|
256
|
+
function renderNodes(nodes, parentKey = "node") {
|
|
257
|
+
if (!Array.isArray(nodes) || !nodes.length) return null;
|
|
258
|
+
return nodes.map((node, index) => {
|
|
259
|
+
if (!node) return null;
|
|
260
|
+
const key = node.slug || node.relativePath || `${parentKey}-${index}`;
|
|
261
|
+
const hasChildren = Array.isArray(node.children) && node.children.length > 0;
|
|
262
|
+
const showChildren = hasChildren && (node.isExpanded || node.depth === 0);
|
|
263
|
+
const depth = typeof node.depth === "number" ? Math.max(0, node.depth) : 0;
|
|
264
|
+
const depthClass = `depth-${Math.min(depth, 5)}`;
|
|
265
|
+
const classes = [
|
|
266
|
+
"canopy-sub-navigation__link",
|
|
267
|
+
depthClass
|
|
268
|
+
];
|
|
269
|
+
if (!node.href) classes.push("is-label");
|
|
270
|
+
if (node.isActive) classes.push("is-active");
|
|
271
|
+
const linkClass = classes.join(" ");
|
|
272
|
+
const Tag = node.href ? "a" : "span";
|
|
273
|
+
return /* @__PURE__ */ React7.createElement(
|
|
274
|
+
"li",
|
|
275
|
+
{
|
|
276
|
+
key,
|
|
277
|
+
className: "canopy-sub-navigation__item",
|
|
278
|
+
"data-depth": depth
|
|
279
|
+
},
|
|
280
|
+
/* @__PURE__ */ React7.createElement(
|
|
281
|
+
Tag,
|
|
282
|
+
{
|
|
283
|
+
className: linkClass,
|
|
284
|
+
href: node.href || void 0,
|
|
285
|
+
"aria-current": node.isActive ? "page" : void 0
|
|
286
|
+
},
|
|
287
|
+
node.title || node.slug
|
|
288
|
+
),
|
|
289
|
+
showChildren ? /* @__PURE__ */ React7.createElement("ul", { className: "canopy-sub-navigation__list canopy-sub-navigation__list--nested", role: "list" }, renderNodes(node.children, key)) : null
|
|
290
|
+
);
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
function SubNavigation({
|
|
294
|
+
navigation: navigationProp,
|
|
295
|
+
page,
|
|
296
|
+
current,
|
|
297
|
+
className = "",
|
|
298
|
+
style = {},
|
|
299
|
+
heading,
|
|
300
|
+
ariaLabel
|
|
301
|
+
}) {
|
|
302
|
+
const PageContext = navigationHelpers && navigationHelpers.getPageContext ? navigationHelpers.getPageContext() : null;
|
|
303
|
+
const context = PageContext ? React7.useContext(PageContext) : null;
|
|
304
|
+
const contextNavigation = context && context.navigation ? context.navigation : null;
|
|
305
|
+
const contextPage = context && context.page ? context.page : null;
|
|
306
|
+
const effectiveNavigation = navigationProp || contextNavigation;
|
|
307
|
+
const effectivePage = page || contextPage;
|
|
308
|
+
const resolvedNavigation = React7.useMemo(() => {
|
|
309
|
+
if (effectiveNavigation && effectiveNavigation.root) return effectiveNavigation;
|
|
310
|
+
const candidate = resolveRelativeCandidate(effectivePage, current);
|
|
311
|
+
if (!candidate) return effectiveNavigation || null;
|
|
312
|
+
const helpers2 = navigationHelpers && navigationHelpers.buildNavigationForFile ? navigationHelpers : null;
|
|
313
|
+
if (!helpers2) return effectiveNavigation || null;
|
|
314
|
+
try {
|
|
315
|
+
const normalized = navigationHelpers.normalizeRelativePath ? navigationHelpers.normalizeRelativePath(candidate) : candidate;
|
|
316
|
+
const built = helpers2.buildNavigationForFile(normalized);
|
|
317
|
+
if (built) return built;
|
|
318
|
+
} catch (_) {
|
|
319
|
+
}
|
|
320
|
+
return effectiveNavigation || null;
|
|
321
|
+
}, [effectiveNavigation, effectivePage, current]);
|
|
322
|
+
if (!resolvedNavigation || !resolvedNavigation.root) return null;
|
|
323
|
+
const rootNode = resolvedNavigation.root;
|
|
324
|
+
const finalHeading = heading || null;
|
|
325
|
+
const labelSource = finalHeading || resolvedNavigation.title;
|
|
326
|
+
const navLabel = ariaLabel || (labelSource ? `${labelSource} navigation` : "Section navigation");
|
|
327
|
+
const combinedClassName = ["canopy-sub-navigation", className].filter(Boolean).join(" ");
|
|
328
|
+
const inlineStyle = { ...style };
|
|
329
|
+
if (!Object.prototype.hasOwnProperty.call(inlineStyle, "--sub-nav-indent")) {
|
|
330
|
+
inlineStyle["--sub-nav-indent"] = "0.85rem";
|
|
331
|
+
}
|
|
332
|
+
return /* @__PURE__ */ React7.createElement("nav", { className: combinedClassName, style: inlineStyle, "aria-label": navLabel }, finalHeading ? /* @__PURE__ */ React7.createElement("div", { className: "canopy-sub-navigation__heading" }, finalHeading) : null, /* @__PURE__ */ React7.createElement("ul", { className: "canopy-sub-navigation__list", role: "list" }, renderNodes([rootNode], rootNode.slug || "root")));
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// ui/src/search/MdxSearchResults.jsx
|
|
336
|
+
import React8 from "react";
|
|
249
337
|
function MdxSearchResults(props) {
|
|
250
338
|
let json = "{}";
|
|
251
339
|
try {
|
|
@@ -253,11 +341,11 @@ function MdxSearchResults(props) {
|
|
|
253
341
|
} catch (_) {
|
|
254
342
|
json = "{}";
|
|
255
343
|
}
|
|
256
|
-
return /* @__PURE__ */
|
|
344
|
+
return /* @__PURE__ */ React8.createElement("div", { "data-canopy-search-results": "1" }, /* @__PURE__ */ React8.createElement("script", { type: "application/json", dangerouslySetInnerHTML: { __html: json } }));
|
|
257
345
|
}
|
|
258
346
|
|
|
259
347
|
// ui/src/search/SearchSummary.jsx
|
|
260
|
-
import
|
|
348
|
+
import React9 from "react";
|
|
261
349
|
function SearchSummary(props) {
|
|
262
350
|
let json = "{}";
|
|
263
351
|
try {
|
|
@@ -265,11 +353,11 @@ function SearchSummary(props) {
|
|
|
265
353
|
} catch (_) {
|
|
266
354
|
json = "{}";
|
|
267
355
|
}
|
|
268
|
-
return /* @__PURE__ */
|
|
356
|
+
return /* @__PURE__ */ React9.createElement("div", { "data-canopy-search-summary": "1" }, /* @__PURE__ */ React9.createElement("script", { type: "application/json", dangerouslySetInnerHTML: { __html: json } }));
|
|
269
357
|
}
|
|
270
358
|
|
|
271
359
|
// ui/src/search/MdxSearchTabs.jsx
|
|
272
|
-
import
|
|
360
|
+
import React10 from "react";
|
|
273
361
|
function MdxSearchTabs(props) {
|
|
274
362
|
let json = "{}";
|
|
275
363
|
try {
|
|
@@ -277,18 +365,18 @@ function MdxSearchTabs(props) {
|
|
|
277
365
|
} catch (_) {
|
|
278
366
|
json = "{}";
|
|
279
367
|
}
|
|
280
|
-
return /* @__PURE__ */
|
|
368
|
+
return /* @__PURE__ */ React10.createElement("div", { "data-canopy-search-tabs": "1" }, /* @__PURE__ */ React10.createElement("script", { type: "application/json", dangerouslySetInnerHTML: { __html: json } }));
|
|
281
369
|
}
|
|
282
370
|
|
|
283
371
|
// ui/src/search-form/MdxSearchFormModal.jsx
|
|
284
|
-
import
|
|
372
|
+
import React14 from "react";
|
|
285
373
|
|
|
286
374
|
// ui/src/Icons.jsx
|
|
287
|
-
import
|
|
288
|
-
var MagnifyingGlassIcon = (props) => /* @__PURE__ */
|
|
375
|
+
import React11 from "react";
|
|
376
|
+
var MagnifyingGlassIcon = (props) => /* @__PURE__ */ React11.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 512 512", ...props }, /* @__PURE__ */ React11.createElement("path", { d: "M456.69 421.39L362.6 327.3a173.81 173.81 0 0034.84-104.58C397.44 126.38 319.06 48 222.72 48S48 126.38 48 222.72s78.38 174.72 174.72 174.72A173.81 173.81 0 00327.3 362.6l94.09 94.09a25 25 0 0035.3-35.3zM97.92 222.72a124.8 124.8 0 11124.8 124.8 124.95 124.95 0 01-124.8-124.8z" }));
|
|
289
377
|
|
|
290
378
|
// ui/src/search/SearchPanelForm.jsx
|
|
291
|
-
import
|
|
379
|
+
import React12 from "react";
|
|
292
380
|
function readBasePath() {
|
|
293
381
|
const normalize = (val) => {
|
|
294
382
|
const raw = typeof val === "string" ? val.trim() : "";
|
|
@@ -347,21 +435,22 @@ function SearchPanelForm(props = {}) {
|
|
|
347
435
|
buttonLabel = "Search",
|
|
348
436
|
label,
|
|
349
437
|
searchPath = "/search",
|
|
350
|
-
inputId: inputIdProp
|
|
438
|
+
inputId: inputIdProp,
|
|
439
|
+
clearLabel = "Clear search"
|
|
351
440
|
} = props || {};
|
|
352
441
|
const text = typeof label === "string" && label.trim() ? label.trim() : buttonLabel;
|
|
353
|
-
const action =
|
|
442
|
+
const action = React12.useMemo(
|
|
354
443
|
() => resolveSearchPath(searchPath),
|
|
355
444
|
[searchPath]
|
|
356
445
|
);
|
|
357
|
-
const autoId = typeof
|
|
358
|
-
const [fallbackId] =
|
|
446
|
+
const autoId = typeof React12.useId === "function" ? React12.useId() : void 0;
|
|
447
|
+
const [fallbackId] = React12.useState(
|
|
359
448
|
() => `canopy-search-form-${Math.random().toString(36).slice(2, 10)}`
|
|
360
449
|
);
|
|
361
450
|
const inputId = inputIdProp || autoId || fallbackId;
|
|
362
|
-
const inputRef =
|
|
363
|
-
const [hasValue, setHasValue] =
|
|
364
|
-
const focusInput =
|
|
451
|
+
const inputRef = React12.useRef(null);
|
|
452
|
+
const [hasValue, setHasValue] = React12.useState(false);
|
|
453
|
+
const focusInput = React12.useCallback(() => {
|
|
365
454
|
const el = inputRef.current;
|
|
366
455
|
if (!el) return;
|
|
367
456
|
if (document.activeElement === el) return;
|
|
@@ -374,30 +463,44 @@ function SearchPanelForm(props = {}) {
|
|
|
374
463
|
}
|
|
375
464
|
}
|
|
376
465
|
}, []);
|
|
377
|
-
const handlePointerDown =
|
|
466
|
+
const handlePointerDown = React12.useCallback(
|
|
378
467
|
(event) => {
|
|
379
468
|
const target = event.target;
|
|
380
469
|
if (target && typeof target.closest === "function") {
|
|
381
470
|
if (target.closest("[data-canopy-search-form-trigger]")) return;
|
|
471
|
+
if (target.closest("[data-canopy-search-form-clear]")) return;
|
|
382
472
|
}
|
|
383
473
|
event.preventDefault();
|
|
384
474
|
focusInput();
|
|
385
475
|
},
|
|
386
476
|
[focusInput]
|
|
387
477
|
);
|
|
388
|
-
|
|
478
|
+
React12.useEffect(() => {
|
|
389
479
|
const el = inputRef.current;
|
|
390
480
|
if (!el) return;
|
|
391
481
|
if (el.value && el.value.trim()) {
|
|
392
482
|
setHasValue(true);
|
|
393
483
|
}
|
|
394
484
|
}, []);
|
|
395
|
-
const handleInputChange =
|
|
485
|
+
const handleInputChange = React12.useCallback((event) => {
|
|
396
486
|
var _a;
|
|
397
|
-
const nextHasValue = Boolean(
|
|
487
|
+
const nextHasValue = Boolean(
|
|
488
|
+
((_a = event == null ? void 0 : event.target) == null ? void 0 : _a.value) && event.target.value.trim()
|
|
489
|
+
);
|
|
398
490
|
setHasValue(nextHasValue);
|
|
399
491
|
}, []);
|
|
400
|
-
|
|
492
|
+
const handleClear = React12.useCallback((event) => {
|
|
493
|
+
}, []);
|
|
494
|
+
const handleClearKey = React12.useCallback(
|
|
495
|
+
(event) => {
|
|
496
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
497
|
+
event.preventDefault();
|
|
498
|
+
handleClear(event);
|
|
499
|
+
}
|
|
500
|
+
},
|
|
501
|
+
[handleClear]
|
|
502
|
+
);
|
|
503
|
+
return /* @__PURE__ */ React12.createElement(
|
|
401
504
|
"form",
|
|
402
505
|
{
|
|
403
506
|
action,
|
|
@@ -407,59 +510,63 @@ function SearchPanelForm(props = {}) {
|
|
|
407
510
|
spellCheck: "false",
|
|
408
511
|
className: "canopy-search-form canopy-search-form-shell",
|
|
409
512
|
onPointerDown: handlePointerDown,
|
|
410
|
-
"data-placeholder": placeholder || "",
|
|
411
513
|
"data-has-value": hasValue ? "1" : "0"
|
|
412
514
|
},
|
|
413
|
-
/* @__PURE__ */
|
|
414
|
-
"
|
|
515
|
+
/* @__PURE__ */ React12.createElement("label", { htmlFor: inputId, className: "canopy-search-form__label" }, /* @__PURE__ */ React12.createElement(MagnifyingGlassIcon, { className: "canopy-search-form__icon" }), /* @__PURE__ */ React12.createElement(
|
|
516
|
+
"input",
|
|
415
517
|
{
|
|
416
|
-
|
|
417
|
-
|
|
518
|
+
id: inputId,
|
|
519
|
+
type: "search",
|
|
520
|
+
name: "q",
|
|
521
|
+
inputMode: "search",
|
|
522
|
+
"data-canopy-search-form-input": true,
|
|
523
|
+
placeholder,
|
|
524
|
+
className: "canopy-search-form__input",
|
|
525
|
+
"aria-label": "Search",
|
|
526
|
+
ref: inputRef,
|
|
527
|
+
onChange: handleInputChange,
|
|
528
|
+
onInput: handleInputChange
|
|
529
|
+
}
|
|
530
|
+
)),
|
|
531
|
+
hasValue ? /* @__PURE__ */ React12.createElement(
|
|
532
|
+
"button",
|
|
533
|
+
{
|
|
534
|
+
type: "button",
|
|
535
|
+
className: "canopy-search-form__clear",
|
|
536
|
+
onClick: handleClear,
|
|
537
|
+
onPointerDown: (event) => event.stopPropagation(),
|
|
538
|
+
onKeyDown: handleClearKey,
|
|
539
|
+
"aria-label": clearLabel,
|
|
540
|
+
"data-canopy-search-form-clear": true
|
|
418
541
|
},
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
{
|
|
423
|
-
id: inputId,
|
|
424
|
-
type: "search",
|
|
425
|
-
name: "q",
|
|
426
|
-
inputMode: "search",
|
|
427
|
-
"data-canopy-search-form-input": true,
|
|
428
|
-
placeholder,
|
|
429
|
-
className: "canopy-search-form__input",
|
|
430
|
-
"aria-label": "Search",
|
|
431
|
-
ref: inputRef,
|
|
432
|
-
onChange: handleInputChange,
|
|
433
|
-
onInput: handleInputChange
|
|
434
|
-
}
|
|
435
|
-
)
|
|
436
|
-
),
|
|
437
|
-
/* @__PURE__ */ React11.createElement(
|
|
542
|
+
"\xD7"
|
|
543
|
+
) : null,
|
|
544
|
+
/* @__PURE__ */ React12.createElement(
|
|
438
545
|
"button",
|
|
439
546
|
{
|
|
440
547
|
type: "submit",
|
|
441
548
|
"data-canopy-search-form-trigger": "submit",
|
|
442
549
|
className: "canopy-search-form__submit"
|
|
443
550
|
},
|
|
444
|
-
/* @__PURE__ */
|
|
445
|
-
/* @__PURE__ */
|
|
551
|
+
/* @__PURE__ */ React12.createElement("span", null, text),
|
|
552
|
+
/* @__PURE__ */ React12.createElement("span", { "aria-hidden": true, className: "canopy-search-form__shortcut" }, /* @__PURE__ */ React12.createElement("span", null, "\u2318"), /* @__PURE__ */ React12.createElement("span", null, "K"))
|
|
446
553
|
)
|
|
447
554
|
);
|
|
448
555
|
}
|
|
449
556
|
|
|
450
557
|
// ui/src/search/SearchPanelTeaserResults.jsx
|
|
451
|
-
import
|
|
558
|
+
import React13 from "react";
|
|
452
559
|
function SearchPanelTeaserResults(props = {}) {
|
|
453
560
|
const { style, className } = props || {};
|
|
454
561
|
const classes = ["canopy-search-teaser", className].filter(Boolean).join(" ");
|
|
455
|
-
return /* @__PURE__ */
|
|
562
|
+
return /* @__PURE__ */ React13.createElement(
|
|
456
563
|
"div",
|
|
457
564
|
{
|
|
458
565
|
"data-canopy-search-form-panel": true,
|
|
459
566
|
className: classes || void 0,
|
|
460
567
|
style
|
|
461
568
|
},
|
|
462
|
-
/* @__PURE__ */
|
|
569
|
+
/* @__PURE__ */ React13.createElement("div", { id: "cplist" })
|
|
463
570
|
);
|
|
464
571
|
}
|
|
465
572
|
|
|
@@ -479,11 +586,11 @@ function MdxSearchFormModal(props = {}) {
|
|
|
479
586
|
const text = typeof label === "string" && label.trim() ? label.trim() : buttonLabel;
|
|
480
587
|
const resolvedSearchPath = resolveSearchPath(searchPath);
|
|
481
588
|
const data = { placeholder, hotkey, maxResults, groupOrder, label: text, searchPath: resolvedSearchPath };
|
|
482
|
-
return /* @__PURE__ */
|
|
589
|
+
return /* @__PURE__ */ React14.createElement("div", { "data-canopy-search-form": true, className: "flex-1 min-w-0" }, /* @__PURE__ */ React14.createElement("div", { className: "relative w-full" }, /* @__PURE__ */ React14.createElement(SearchPanelForm, { placeholder, buttonLabel, label, searchPath: resolvedSearchPath }), /* @__PURE__ */ React14.createElement(SearchPanelTeaserResults, null)), /* @__PURE__ */ React14.createElement("script", { type: "application/json", dangerouslySetInnerHTML: { __html: JSON.stringify(data) } }));
|
|
483
590
|
}
|
|
484
591
|
|
|
485
592
|
// ui/src/search/SearchPanel.jsx
|
|
486
|
-
import
|
|
593
|
+
import React15 from "react";
|
|
487
594
|
function SearchPanel(props = {}) {
|
|
488
595
|
const {
|
|
489
596
|
placeholder = "Search\u2026",
|
|
@@ -500,11 +607,11 @@ function SearchPanel(props = {}) {
|
|
|
500
607
|
const text = typeof label === "string" && label.trim() ? label.trim() : buttonLabel;
|
|
501
608
|
const resolvedSearchPath = resolveSearchPath(searchPath);
|
|
502
609
|
const data = { placeholder, hotkey, maxResults, groupOrder, label: text, searchPath: resolvedSearchPath };
|
|
503
|
-
return /* @__PURE__ */
|
|
610
|
+
return /* @__PURE__ */ React15.createElement("div", { "data-canopy-search-form": true, className: "flex-1 min-w-0" }, /* @__PURE__ */ React15.createElement("div", { className: "relative w-full" }, /* @__PURE__ */ React15.createElement(SearchPanelForm, { placeholder, buttonLabel, label, searchPath: resolvedSearchPath }), /* @__PURE__ */ React15.createElement(SearchPanelTeaserResults, null)), /* @__PURE__ */ React15.createElement("script", { type: "application/json", dangerouslySetInnerHTML: { __html: JSON.stringify(data) } }));
|
|
504
611
|
}
|
|
505
612
|
|
|
506
613
|
// ui/src/iiif/ManifestPrimitives.jsx
|
|
507
|
-
import
|
|
614
|
+
import React16 from "react";
|
|
508
615
|
import {
|
|
509
616
|
Label as CloverLabel,
|
|
510
617
|
Metadata as CloverMetadata,
|
|
@@ -529,24 +636,24 @@ function ensureMetadata(items) {
|
|
|
529
636
|
function Label({ manifest, label, ...rest }) {
|
|
530
637
|
const intl = label || manifest && manifest.label;
|
|
531
638
|
if (!hasInternationalValue(intl)) return null;
|
|
532
|
-
return /* @__PURE__ */
|
|
639
|
+
return /* @__PURE__ */ React16.createElement(CloverLabel, { label: intl, ...rest });
|
|
533
640
|
}
|
|
534
641
|
function Summary({ manifest, summary, ...rest }) {
|
|
535
642
|
const intl = summary || manifest && manifest.summary;
|
|
536
643
|
if (!hasInternationalValue(intl)) return null;
|
|
537
|
-
return /* @__PURE__ */
|
|
644
|
+
return /* @__PURE__ */ React16.createElement(CloverSummary, { summary: intl, ...rest });
|
|
538
645
|
}
|
|
539
646
|
function Metadata({ manifest, metadata, ...rest }) {
|
|
540
647
|
const items = ensureMetadata(metadata || manifest && manifest.metadata);
|
|
541
648
|
if (!items.length) return null;
|
|
542
|
-
return /* @__PURE__ */
|
|
649
|
+
return /* @__PURE__ */ React16.createElement(CloverMetadata, { metadata: items, ...rest });
|
|
543
650
|
}
|
|
544
651
|
function RequiredStatement({ manifest, requiredStatement, ...rest }) {
|
|
545
652
|
const stmt = requiredStatement || manifest && manifest.requiredStatement;
|
|
546
653
|
if (!stmt || !hasInternationalValue(stmt.label) || !hasInternationalValue(stmt.value)) {
|
|
547
654
|
return null;
|
|
548
655
|
}
|
|
549
|
-
return /* @__PURE__ */
|
|
656
|
+
return /* @__PURE__ */ React16.createElement(CloverRequiredStatement, { requiredStatement: stmt, ...rest });
|
|
550
657
|
}
|
|
551
658
|
export {
|
|
552
659
|
FeaturedHero,
|
|
@@ -564,6 +671,7 @@ export {
|
|
|
564
671
|
SearchSummary,
|
|
565
672
|
MdxSearchTabs as SearchTabs,
|
|
566
673
|
Slider,
|
|
674
|
+
SubNavigation,
|
|
567
675
|
Summary,
|
|
568
676
|
Viewer
|
|
569
677
|
};
|
package/ui/dist/server.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/iiif/hero-utils.js", "../src/HelloWorld.jsx", "../src/iiif/Viewer.jsx", "../src/iiif/Slider.jsx", "../src/iiif/MdxRelatedItems.jsx", "../src/iiif/Hero.jsx", "../src/iiif/FeaturedHero.jsx", "../src/search/MdxSearchResults.jsx", "../src/search/SearchSummary.jsx", "../src/search/MdxSearchTabs.jsx", "../src/search-form/MdxSearchFormModal.jsx", "../src/Icons.jsx", "../src/search/SearchPanelForm.jsx", "../src/search/SearchPanelTeaserResults.jsx", "../src/search/SearchPanel.jsx", "../src/iiif/ManifestPrimitives.jsx"],
|
|
4
|
-
"sourcesContent": ["function computeHeroHeightStyle(height) {\n const h = typeof height === 'number' ? `${height}px` : String(height || '').trim();\n const val = h || '360px';\n return { width: '100%', height: val };\n}\n\nmodule.exports = { computeHeroHeightStyle };\n\n", "import React from \"react\";\n\nexport const HelloWorld = () => {\n return <div>Hello, World!</div>;\n};\n", "import React, { useEffect, useState } from \"react\";\n\n// SSR-safe wrapper around Clover's viewer. Clover touches the DOM at import time,\n// so we dynamically import it only in the browser.\n\n// Default Clover viewer options; can be overridden per-usage via props.options\nconst DEFAULT_VIEWER_OPTIONS = {\n showDownload: false,\n showIIIFBadge: false,\n showTitle: false,\n informationPanel: {\n open: false,\n renderAbout: false,\n renderToggle: false,\n },\n};\n\nfunction isPlainObject(val) {\n return val && typeof val === \"object\" && !Array.isArray(val);\n}\n\nfunction deepMerge(base, override) {\n if (!isPlainObject(base)) return override;\n const out = { ...base };\n if (!isPlainObject(override)) return out;\n for (const key of Object.keys(override)) {\n const a = base[key];\n const b = override[key];\n if (isPlainObject(a) && isPlainObject(b)) out[key] = deepMerge(a, b);\n else out[key] = b;\n }\n return out;\n}\n\nexport const Viewer = (props) => {\n const [CloverViewer, setCloverViewer] = useState(null);\n const mergedOptions = deepMerge(\n DEFAULT_VIEWER_OPTIONS,\n props && props.options\n );\n\n useEffect(() => {\n let mounted = true;\n const canUseDom =\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\n if (canUseDom) {\n import(\"@samvera/clover-iiif/viewer\")\n .then((mod) => {\n if (!mounted) return;\n // Loaded Clover viewer dynamically in the browser\n const Comp = mod && (mod.default || mod.Viewer || mod);\n setCloverViewer(() => Comp);\n })\n .catch(() => {\n // Silently ignore load errors on the server or if Clover is unavailable\n });\n }\n return () => {\n mounted = false;\n };\n }, []);\n\n if (!CloverViewer) {\n // SSR placeholder for client hydration; props provided as JSON\n let json = \"{}\";\n try {\n const p = { ...(props || {}) };\n if (mergedOptions) p.options = mergedOptions;\n json = JSON.stringify(p);\n } catch (_) {\n json = \"{}\";\n }\n return (\n <div data-canopy-viewer=\"1\" className=\"not-prose\">\n <script\n type=\"application/json\"\n dangerouslySetInnerHTML={{ __html: json }}\n />\n </div>\n );\n }\n return <CloverViewer {...props} options={mergedOptions} />;\n};\n", "import React, { useEffect, useState } from \"react\";\n\n// SSR-safe wrapper around Clover's slider. Clover touches the DOM at import time,\n// so we dynamically import it only in the browser.\nexport const Slider = (props) => {\n const [CloverSlider, setCloverSlider] = useState(null);\n\n useEffect(() => {\n let mounted = true;\n const canUseDom =\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\n if (canUseDom) {\n import(\"@samvera/clover-iiif/slider\")\n .then((mod) => {\n if (!mounted) return;\n console.log(mod);\n const Comp = mod && (mod.default || mod.Slider || mod);\n setCloverSlider(() => Comp);\n })\n .catch(() => {\n // Silently ignore load errors on the server or if Clover is unavailable\n });\n }\n return () => {\n mounted = false;\n };\n }, []);\n\n if (!CloverSlider) {\n // SSR placeholder for client hydration; props provided as JSON\n let json = \"{}\";\n try {\n json = JSON.stringify(props || {});\n } catch (_) {\n json = \"{}\";\n }\n return (\n <div data-canopy-slider=\"1\" className=\"not-prose\">\n <script\n type=\"application/json\"\n dangerouslySetInnerHTML={{ __html: json }}\n />\n </div>\n );\n }\n return <CloverSlider {...props} />;\n};\n", "import React from 'react';\n\n// SSR-safe placeholder for RelatedItems. Hydrated by canopy-related-items.js + canopy-slider.js\nexport default function MdxRelatedItems(props) {\n let json = '{}';\n try {\n json = JSON.stringify(props || {});\n } catch (_) {\n json = '{}';\n }\n return (\n <div data-canopy-related-items=\"1\" className=\"not-prose\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n", "import React from \"react\";\n// SSR-only: pulls featured helpers from the library (Node APIs inside)\nimport helpers from \"../../../lib/components/featured.js\";\nimport { computeHeroHeightStyle } from './hero-utils.js';\n\nconst basePath = (() => {\n try {\n const raw =\n typeof process !== \"undefined\" && process && process.env\n ? String(process.env.CANOPY_BASE_PATH || \"\")\n : \"\";\n return raw.replace(/\\/$/, \"\");\n } catch (_) {\n return \"\";\n }\n})();\n\nfunction applyBasePath(href) {\n try {\n if (!href) return href;\n if (!basePath) return href;\n if (typeof href === \"string\" && href.startsWith(\"/\")) {\n return `${basePath}${href}`;\n }\n } catch (_) {}\n return href;\n}\n\n/**\n * Hero\n *\n * Full-width visual banner for a featured item.\n * - Fluid width (100% of container)\n * - Fixed height from `height` prop (no aspect ratio lock)\n * - Renders a background image from `item.thumbnail` with cover fit\n * - Title rendered as caption beneath the hero and linked to item.href\n *\n * Props:\n * - height: number | string \u2014 required; e.g., 360 or '420px'\n * - item: { title, href, thumbnail } \u2014 required\n * - className, style \u2014 optional container overrides\n */\nexport default function Hero({\n height = 360,\n item,\n index,\n random,\n className = \"\",\n style = {},\n ...rest\n}) {\n // Resolve item: prefer explicit prop, else pick from featured list.\n let resolved = item;\n if (!resolved) {\n const list =\n helpers && helpers.readFeaturedFromCacheSync\n ? helpers.readFeaturedFromCacheSync()\n : [];\n let idx = 0;\n if (typeof index === \"number\") {\n idx = Math.max(0, Math.min(list.length - 1, Math.floor(index)));\n } else if (random === true || random === \"true\") {\n idx = Math.floor(Math.random() * Math.max(1, list.length));\n }\n resolved = list[idx] || list[0] || null;\n }\n\n const hStyle = computeHeroHeightStyle(height);\n const title = (resolved && resolved.title) || \"\";\n const href = (resolved && resolved.href) || \"#\";\n const thumbnail = (resolved && resolved.thumbnail) || \"\";\n\n const mediaStyles = {\n position: \"relative\",\n ...hStyle,\n overflow: \"hidden\",\n backgroundColor: \"var(--color-gray-muted)\",\n };\n\n const imgStyles = {\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n objectPosition: \"center\",\n filter: \"none\",\n };\n\n const sanitizedRest = (() => {\n const r = { ...rest };\n try {\n delete r.random;\n delete r.index;\n } catch (_) {}\n return r;\n })();\n\n const figureClassName = [\"canopy-hero\", className].filter(Boolean).join(\" \");\n const figureStyles = { margin: 0, padding: 0, ...style };\n const safeHref = applyBasePath(href);\n\n return (\n <a href={safeHref} className=\"canopy-hero-link\">\n <figure className={figureClassName} style={figureStyles} {...sanitizedRest}>\n <div className=\"canopy-hero__media\" style={mediaStyles}>\n {thumbnail ? (\n <img src={thumbnail} alt=\"\" aria-hidden=\"true\" style={imgStyles} />\n ) : null}\n </div>\n {title ? <figcaption>{title}</figcaption> : null}\n </figure>\n </a>\n );\n}\n", "import React from \"react\";\nimport Hero from \"./Hero.jsx\";\n\n/**\n * FeaturedHero\n *\n * Thin wrapper around <Hero /> kept for backward compatibility and clarity in MDX.\n * Delegates selection logic to Hero (which reads the featured cache when no item is provided).\n */\nexport default function FeaturedHero(props = {}) {\n return <Hero {...props} />;\n}\n", "import React from 'react';\n\nexport default function MdxSearchResults(props) {\n let json = '{}';\n try { json = JSON.stringify(props || {}); } catch (_) { json = '{}'; }\n return (\n <div data-canopy-search-results=\"1\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n\n", "import React from 'react';\n\nexport default function SearchSummary(props) {\n let json = '{}';\n try { json = JSON.stringify(props || {}); } catch (_) { json = '{}'; }\n return (\n <div data-canopy-search-summary=\"1\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n\n", "import React from 'react';\n\nexport default function MdxSearchTabs(props) {\n let json = '{}';\n try { json = JSON.stringify(props || {}); } catch (_) { json = '{}'; }\n return (\n <div data-canopy-search-tabs=\"1\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n\n", "import React from 'react';\nimport SearchPanelForm, { resolveSearchPath } from '../search/SearchPanelForm.jsx';\nimport SearchPanelTeaserResults from '../search/SearchPanelTeaserResults.jsx';\n\n// SSR-safe placeholder for the search form modal, composed from SearchPanel parts.\n// This ensures a single JSX source of truth for form/panel markup.\nexport default function MdxSearchFormModal(props = {}) {\n const {\n placeholder = 'Search\u2026',\n hotkey = 'mod+k',\n maxResults = 8,\n groupOrder = ['work', 'page'],\n button = true, // kept for backward compat; ignored by teaser form\n buttonLabel = 'Search',\n label,\n searchPath = '/search',\n } = props || {};\n\n const text = typeof label === 'string' && label.trim() ? label.trim() : buttonLabel;\n const resolvedSearchPath = resolveSearchPath(searchPath);\n const data = { placeholder, hotkey, maxResults, groupOrder, label: text, searchPath: resolvedSearchPath };\n return (\n <div data-canopy-search-form className=\"flex-1 min-w-0\">\n <div className=\"relative w-full\">\n <SearchPanelForm placeholder={placeholder} buttonLabel={buttonLabel} label={label} searchPath={resolvedSearchPath} />\n <SearchPanelTeaserResults />\n </div>\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: JSON.stringify(data) }} />\n </div>\n );\n}\n", "import React from \"react\";\n\nexport const MagnifyingGlassIcon = (props) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\" {...props}>\n <path d=\"M456.69 421.39L362.6 327.3a173.81 173.81 0 0034.84-104.58C397.44 126.38 319.06 48 222.72 48S48 126.38 48 222.72s78.38 174.72 174.72 174.72A173.81 173.81 0 00327.3 362.6l94.09 94.09a25 25 0 0035.3-35.3zM97.92 222.72a124.8 124.8 0 11124.8 124.8 124.95 124.95 0 01-124.8-124.8z\" />\n </svg>\n);\n", "import {MagnifyingGlassIcon} from \"../Icons\";\nimport React from \"react\";\n\nfunction readBasePath() {\n const normalize = (val) => {\n const raw = typeof val === \"string\" ? val.trim() : \"\";\n if (!raw) return \"\";\n return raw.replace(/\\/+$/, \"\");\n };\n try {\n if (typeof window !== \"undefined\" && window.CANOPY_BASE_PATH != null) {\n const fromWindow = normalize(window.CANOPY_BASE_PATH);\n if (fromWindow) return fromWindow;\n }\n } catch (_) {}\n try {\n if (\n typeof globalThis !== \"undefined\" &&\n globalThis.CANOPY_BASE_PATH != null\n ) {\n const fromGlobal = normalize(globalThis.CANOPY_BASE_PATH);\n if (fromGlobal) return fromGlobal;\n }\n } catch (_) {}\n try {\n if (\n typeof process !== \"undefined\" &&\n process.env &&\n process.env.CANOPY_BASE_PATH\n ) {\n const fromEnv = normalize(process.env.CANOPY_BASE_PATH);\n if (fromEnv) return fromEnv;\n }\n } catch (_) {}\n return \"\";\n}\n\nfunction isAbsoluteUrl(href) {\n try {\n return /^https?:/i.test(String(href || \"\"));\n } catch (_) {\n return false;\n }\n}\n\nexport function resolveSearchPath(pathValue) {\n let raw = typeof pathValue === \"string\" ? pathValue.trim() : \"\";\n if (!raw) raw = \"/search\";\n if (isAbsoluteUrl(raw)) return raw;\n const normalizedPath = raw.startsWith(\"/\") ? raw : `/${raw}`;\n const base = readBasePath();\n if (!base) return normalizedPath;\n const baseWithLead = base.startsWith(\"/\") ? base : `/${base}`;\n const baseTrimmed = baseWithLead.replace(/\\/+$/, \"\");\n if (!baseTrimmed) return normalizedPath;\n if (\n normalizedPath === baseTrimmed ||\n normalizedPath.startsWith(`${baseTrimmed}/`)\n ) {\n return normalizedPath;\n }\n const pathTrimmed = normalizedPath.replace(/^\\/+/, \"\");\n return `${baseTrimmed}/${pathTrimmed}`;\n}\n\nexport default function SearchPanelForm(props = {}) {\n const {\n placeholder = \"Search\u2026\",\n buttonLabel = \"Search\",\n label,\n searchPath = \"/search\",\n inputId: inputIdProp,\n } = 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 }\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(event?.target?.value && event.target.value.trim());\n setHasValue(nextHasValue);\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-placeholder={placeholder || \"\"}\n data-has-value={hasValue ? \"1\" : \"0\"}\n >\n <label\n htmlFor={inputId}\n className=\"canopy-search-form__label\"\n >\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 <button\n type=\"submit\"\n data-canopy-search-form-trigger=\"submit\"\n className=\"canopy-search-form__submit\"\n >\n <span>{text}</span>\n <span aria-hidden className=\"canopy-search-form__shortcut\">\n <span>\u2318</span>\n <span>K</span>\n </span>\n </button>\n </form>\n );\n}\n", "import React from \"react\";\n\n// SSR placeholder for teaser results panel; the runtime controls visibility and content.\nexport default function SearchPanelTeaserResults(props = {}) {\n const { style, className } = props || {};\n const classes = [\"canopy-search-teaser\", className]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div\n data-canopy-search-form-panel\n className={classes || undefined}\n style={style}\n >\n <div id=\"cplist\" />\n </div>\n );\n}\n", "import React from 'react';\nimport SearchPanelForm, { resolveSearchPath } from './SearchPanelForm.jsx';\nimport SearchPanelTeaserResults from './SearchPanelTeaserResults.jsx';\n\n// High-level SearchPanel composed of a teaser form and teaser results panel.\n// Encodes configuration as JSON for the client runtime.\nexport default function SearchPanel(props = {}) {\n const {\n placeholder = 'Search\u2026',\n hotkey = 'mod+k',\n maxResults = 8,\n groupOrder = ['work', 'docs', 'page'],\n // Kept for backward compat; form always renders submit\n button = true, // eslint-disable-line no-unused-vars\n buttonLabel = 'Search',\n label,\n searchPath = '/search',\n } = props || {};\n\n const text = typeof label === 'string' && label.trim() ? label.trim() : buttonLabel;\n const resolvedSearchPath = resolveSearchPath(searchPath);\n const data = { placeholder, hotkey, maxResults, groupOrder, label: text, searchPath: resolvedSearchPath };\n\n return (\n <div data-canopy-search-form className=\"flex-1 min-w-0\">\n <div className=\"relative w-full\">\n <SearchPanelForm placeholder={placeholder} buttonLabel={buttonLabel} label={label} searchPath={resolvedSearchPath} />\n <SearchPanelTeaserResults />\n </div>\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: JSON.stringify(data) }} />\n </div>\n );\n}\n", "import React from \"react\";\nimport {\n Label as CloverLabel,\n Metadata as CloverMetadata,\n RequiredStatement as CloverRequiredStatement,\n Summary as CloverSummary,\n} from \"@samvera/clover-iiif/primitives\";\n\nfunction hasInternationalValue(value) {\n if (!value || typeof value !== \"object\") return false;\n return Object.keys(value).some((key) => {\n const entries = value[key];\n return (\n Array.isArray(entries) &&\n entries.some((entry) => String(entry || \"\").trim().length > 0)\n );\n });\n}\n\nfunction ensureMetadata(items) {\n if (!Array.isArray(items)) return [];\n return items.filter((item) => {\n if (!item || typeof item !== \"object\") return false;\n const { label, value } = item;\n return hasInternationalValue(label) && hasInternationalValue(value);\n });\n}\n\nexport function Label({ manifest, label, ...rest }) {\n const intl = label || (manifest && manifest.label);\n if (!hasInternationalValue(intl)) return null;\n return <CloverLabel label={intl} {...rest} />;\n}\n\nexport function Summary({ manifest, summary, ...rest }) {\n const intl = summary || (manifest && manifest.summary);\n if (!hasInternationalValue(intl)) return null;\n return <CloverSummary summary={intl} {...rest} />;\n}\n\nexport function Metadata({ manifest, metadata, ...rest }) {\n const items = ensureMetadata(metadata || (manifest && manifest.metadata));\n if (!items.length) return null;\n return <CloverMetadata metadata={items} {...rest} />;\n}\n\nexport function RequiredStatement({ manifest, requiredStatement, ...rest }) {\n const stmt = requiredStatement || (manifest && manifest.requiredStatement);\n if (\n !stmt ||\n !hasInternationalValue(stmt.label) ||\n !hasInternationalValue(stmt.value)\n ) {\n return null;\n }\n return <CloverRequiredStatement requiredStatement={stmt} {...rest} />;\n}\n\nexport const Primitives = {\n Label,\n Summary,\n Metadata,\n RequiredStatement,\n};\n\nexport default Primitives;\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["computeHeroHeightStyle", "React", "React", "useEffect", "useState", "React", "React", "React", "React", "React", "React", "React", "React", "React", "React", "_", "React", "React", "React", "React", "React"]
|
|
3
|
+
"sources": ["../src/iiif/hero-utils.js", "../src/HelloWorld.jsx", "../src/iiif/Viewer.jsx", "../src/iiif/Slider.jsx", "../src/iiif/MdxRelatedItems.jsx", "../src/iiif/Hero.jsx", "../src/iiif/FeaturedHero.jsx", "../src/layout/SubNavigation.jsx", "../src/search/MdxSearchResults.jsx", "../src/search/SearchSummary.jsx", "../src/search/MdxSearchTabs.jsx", "../src/search-form/MdxSearchFormModal.jsx", "../src/Icons.jsx", "../src/search/SearchPanelForm.jsx", "../src/search/SearchPanelTeaserResults.jsx", "../src/search/SearchPanel.jsx", "../src/iiif/ManifestPrimitives.jsx"],
|
|
4
|
+
"sourcesContent": ["function computeHeroHeightStyle(height) {\n const h = typeof height === 'number' ? `${height}px` : String(height || '').trim();\n const val = h || '360px';\n return { width: '100%', height: val };\n}\n\nmodule.exports = { computeHeroHeightStyle };\n\n", "import React from \"react\";\n\nexport const HelloWorld = () => {\n return <div>Hello, World!</div>;\n};\n", "import React, { useEffect, useState } from \"react\";\n\n// SSR-safe wrapper around Clover's viewer. Clover touches the DOM at import time,\n// so we dynamically import it only in the browser.\n\n// Default Clover viewer options; can be overridden per-usage via props.options\nconst DEFAULT_VIEWER_OPTIONS = {\n showDownload: false,\n showIIIFBadge: false,\n showTitle: false,\n informationPanel: {\n open: false,\n renderAbout: false,\n renderToggle: false,\n },\n};\n\nfunction isPlainObject(val) {\n return val && typeof val === \"object\" && !Array.isArray(val);\n}\n\nfunction deepMerge(base, override) {\n if (!isPlainObject(base)) return override;\n const out = { ...base };\n if (!isPlainObject(override)) return out;\n for (const key of Object.keys(override)) {\n const a = base[key];\n const b = override[key];\n if (isPlainObject(a) && isPlainObject(b)) out[key] = deepMerge(a, b);\n else out[key] = b;\n }\n return out;\n}\n\nexport const Viewer = (props) => {\n const [CloverViewer, setCloverViewer] = useState(null);\n const mergedOptions = deepMerge(\n DEFAULT_VIEWER_OPTIONS,\n props && props.options\n );\n\n useEffect(() => {\n let mounted = true;\n const canUseDom =\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\n if (canUseDom) {\n import(\"@samvera/clover-iiif/viewer\")\n .then((mod) => {\n if (!mounted) return;\n // Loaded Clover viewer dynamically in the browser\n const Comp = mod && (mod.default || mod.Viewer || mod);\n setCloverViewer(() => Comp);\n })\n .catch(() => {\n // Silently ignore load errors on the server or if Clover is unavailable\n });\n }\n return () => {\n mounted = false;\n };\n }, []);\n\n if (!CloverViewer) {\n // SSR placeholder for client hydration; props provided as JSON\n let json = \"{}\";\n try {\n const p = { ...(props || {}) };\n if (mergedOptions) p.options = mergedOptions;\n json = JSON.stringify(p);\n } catch (_) {\n json = \"{}\";\n }\n return (\n <div data-canopy-viewer=\"1\" className=\"not-prose\">\n <script\n type=\"application/json\"\n dangerouslySetInnerHTML={{ __html: json }}\n />\n </div>\n );\n }\n return <CloverViewer {...props} options={mergedOptions} />;\n};\n", "import React, { useEffect, useState } from \"react\";\n\n// SSR-safe wrapper around Clover's slider. Clover touches the DOM at import time,\n// so we dynamically import it only in the browser.\nexport const Slider = (props) => {\n const [CloverSlider, setCloverSlider] = useState(null);\n\n useEffect(() => {\n let mounted = true;\n const canUseDom =\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\n if (canUseDom) {\n import(\"@samvera/clover-iiif/slider\")\n .then((mod) => {\n if (!mounted) return;\n console.log(mod);\n const Comp = mod && (mod.default || mod.Slider || mod);\n setCloverSlider(() => Comp);\n })\n .catch(() => {\n // Silently ignore load errors on the server or if Clover is unavailable\n });\n }\n return () => {\n mounted = false;\n };\n }, []);\n\n if (!CloverSlider) {\n // SSR placeholder for client hydration; props provided as JSON\n let json = \"{}\";\n try {\n json = JSON.stringify(props || {});\n } catch (_) {\n json = \"{}\";\n }\n return (\n <div data-canopy-slider=\"1\" className=\"not-prose\">\n <script\n type=\"application/json\"\n dangerouslySetInnerHTML={{ __html: json }}\n />\n </div>\n );\n }\n return <CloverSlider {...props} />;\n};\n", "import React from 'react';\n\n// SSR-safe placeholder for RelatedItems. Hydrated by canopy-related-items.js + canopy-slider.js\nexport default function MdxRelatedItems(props) {\n let json = '{}';\n try {\n json = JSON.stringify(props || {});\n } catch (_) {\n json = '{}';\n }\n return (\n <div data-canopy-related-items=\"1\" className=\"not-prose\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n", "import React from \"react\";\n// SSR-only: pulls featured helpers from the library (Node APIs inside)\nimport helpers from \"../../../lib/components/featured.js\";\nimport { computeHeroHeightStyle } from './hero-utils.js';\n\nconst basePath = (() => {\n try {\n const raw =\n typeof process !== \"undefined\" && process && process.env\n ? String(process.env.CANOPY_BASE_PATH || \"\")\n : \"\";\n return raw.replace(/\\/$/, \"\");\n } catch (_) {\n return \"\";\n }\n})();\n\nfunction applyBasePath(href) {\n try {\n if (!href) return href;\n if (!basePath) return href;\n if (typeof href === \"string\" && href.startsWith(\"/\")) {\n return `${basePath}${href}`;\n }\n } catch (_) {}\n return href;\n}\n\n/**\n * Hero\n *\n * Full-width visual banner for a featured item.\n * - Fluid width (100% of container)\n * - Fixed height from `height` prop (no aspect ratio lock)\n * - Renders a background image from `item.thumbnail` with cover fit\n * - Title rendered as caption beneath the hero and linked to item.href\n *\n * Props:\n * - height: number | string \u2014 required; e.g., 360 or '420px'\n * - item: { title, href, thumbnail } \u2014 required\n * - className, style \u2014 optional container overrides\n */\nexport default function Hero({\n height = 360,\n item,\n index,\n random,\n className = \"\",\n style = {},\n ...rest\n}) {\n // Resolve item: prefer explicit prop, else pick from featured list.\n let resolved = item;\n if (!resolved) {\n const list =\n helpers && helpers.readFeaturedFromCacheSync\n ? helpers.readFeaturedFromCacheSync()\n : [];\n let idx = 0;\n if (typeof index === \"number\") {\n idx = Math.max(0, Math.min(list.length - 1, Math.floor(index)));\n } else if (random === true || random === \"true\") {\n idx = Math.floor(Math.random() * Math.max(1, list.length));\n }\n resolved = list[idx] || list[0] || null;\n }\n\n const hStyle = computeHeroHeightStyle(height);\n const title = (resolved && resolved.title) || \"\";\n const href = (resolved && resolved.href) || \"#\";\n const thumbnail = (resolved && resolved.thumbnail) || \"\";\n\n const mediaStyles = {\n position: \"relative\",\n ...hStyle,\n overflow: \"hidden\",\n backgroundColor: \"var(--color-gray-muted)\",\n };\n\n const imgStyles = {\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n objectPosition: \"center\",\n filter: \"none\",\n };\n\n const sanitizedRest = (() => {\n const r = { ...rest };\n try {\n delete r.random;\n delete r.index;\n } catch (_) {}\n return r;\n })();\n\n const figureClassName = [\"canopy-hero\", className].filter(Boolean).join(\" \");\n const figureStyles = { margin: 0, padding: 0, ...style };\n const safeHref = applyBasePath(href);\n\n return (\n <a href={safeHref} className=\"canopy-hero-link\">\n <figure className={figureClassName} style={figureStyles} {...sanitizedRest}>\n <div className=\"canopy-hero__media\" style={mediaStyles}>\n {thumbnail ? (\n <img src={thumbnail} alt=\"\" aria-hidden=\"true\" style={imgStyles} />\n ) : null}\n </div>\n {title ? <figcaption>{title}</figcaption> : null}\n </figure>\n </a>\n );\n}\n", "import React from \"react\";\nimport Hero from \"./Hero.jsx\";\n\n/**\n * FeaturedHero\n *\n * Thin wrapper around <Hero /> kept for backward compatibility and clarity in MDX.\n * Delegates selection logic to Hero (which reads the featured cache when no item is provided).\n */\nexport default function FeaturedHero(props = {}) {\n return <Hero {...props} />;\n}\n", "import React from \"react\";\nimport navigationHelpers from \"../../../lib/components/navigation.js\";\n\nfunction resolveRelativeCandidate(page, current) {\n if (page && typeof page.relativePath === \"string\" && page.relativePath) return page.relativePath;\n if (page && typeof page.slug === \"string\" && page.slug) return page.slug;\n if (typeof current === \"string\" && current) return current;\n return \"\";\n}\n\nfunction renderNodes(nodes, parentKey = \"node\") {\n if (!Array.isArray(nodes) || !nodes.length) return null;\n return nodes.map((node, index) => {\n if (!node) return null;\n const key = node.slug || node.relativePath || `${parentKey}-${index}`;\n const hasChildren = Array.isArray(node.children) && node.children.length > 0;\n const showChildren = hasChildren && (node.isExpanded || node.depth === 0);\n const depth = typeof node.depth === \"number\" ? Math.max(0, node.depth) : 0;\n const depthClass = `depth-${Math.min(depth, 5)}`;\n const classes = [\n \"canopy-sub-navigation__link\",\n depthClass,\n ];\n if (!node.href) classes.push(\"is-label\");\n if (node.isActive) classes.push(\"is-active\");\n const linkClass = classes.join(\" \");\n const Tag = node.href ? \"a\" : \"span\";\n return (\n <li\n key={key}\n className=\"canopy-sub-navigation__item\"\n data-depth={depth}\n >\n <Tag\n className={linkClass}\n href={node.href || undefined}\n aria-current={node.isActive ? \"page\" : undefined}\n >\n {node.title || node.slug}\n </Tag>\n {showChildren ? (\n <ul className=\"canopy-sub-navigation__list canopy-sub-navigation__list--nested\" role=\"list\">\n {renderNodes(node.children, key)}\n </ul>\n ) : null}\n </li>\n );\n });\n}\n\nexport default function SubNavigation({\n navigation: navigationProp,\n page,\n current,\n className = \"\",\n style = {},\n heading,\n ariaLabel,\n}) {\n const PageContext = navigationHelpers && navigationHelpers.getPageContext\n ? navigationHelpers.getPageContext()\n : null;\n const context = PageContext ? React.useContext(PageContext) : null;\n const contextNavigation = context && context.navigation ? context.navigation : null;\n const contextPage = context && context.page ? context.page : null;\n const effectiveNavigation = navigationProp || contextNavigation;\n const effectivePage = page || contextPage;\n const resolvedNavigation = React.useMemo(() => {\n if (effectiveNavigation && effectiveNavigation.root) return effectiveNavigation;\n const candidate = resolveRelativeCandidate(effectivePage, current);\n if (!candidate) return effectiveNavigation || null;\n const helpers = navigationHelpers && navigationHelpers.buildNavigationForFile ? navigationHelpers : null;\n if (!helpers) return effectiveNavigation || null;\n try {\n const normalized = navigationHelpers.normalizeRelativePath\n ? navigationHelpers.normalizeRelativePath(candidate)\n : candidate;\n const built = helpers.buildNavigationForFile(normalized);\n if (built) return built;\n } catch (_) {\n // ignore helper errors and fall back to provided navigation\n }\n return effectiveNavigation || null;\n }, [effectiveNavigation, effectivePage, current]);\n\n if (!resolvedNavigation || !resolvedNavigation.root) return null;\n\n const rootNode = resolvedNavigation.root;\n const finalHeading = heading || null;\n const labelSource = finalHeading || resolvedNavigation.title;\n const navLabel = ariaLabel || (labelSource ? `${labelSource} navigation` : \"Section navigation\");\n const combinedClassName = [\"canopy-sub-navigation\", className].filter(Boolean).join(\" \");\n const inlineStyle = { ...style };\n if (!Object.prototype.hasOwnProperty.call(inlineStyle, \"--sub-nav-indent\")) {\n inlineStyle[\"--sub-nav-indent\"] = \"0.85rem\";\n }\n\n return (\n <nav className={combinedClassName} style={inlineStyle} aria-label={navLabel}>\n {finalHeading ? (\n <div className=\"canopy-sub-navigation__heading\">{finalHeading}</div>\n ) : null}\n <ul className=\"canopy-sub-navigation__list\" role=\"list\">\n {renderNodes([rootNode], rootNode.slug || \"root\")}\n </ul>\n </nav>\n );\n}\n", "import React from 'react';\n\nexport default function MdxSearchResults(props) {\n let json = '{}';\n try { json = JSON.stringify(props || {}); } catch (_) { json = '{}'; }\n return (\n <div data-canopy-search-results=\"1\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n\n", "import React from 'react';\n\nexport default function SearchSummary(props) {\n let json = '{}';\n try { json = JSON.stringify(props || {}); } catch (_) { json = '{}'; }\n return (\n <div data-canopy-search-summary=\"1\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n\n", "import React from 'react';\n\nexport default function MdxSearchTabs(props) {\n let json = '{}';\n try { json = JSON.stringify(props || {}); } catch (_) { json = '{}'; }\n return (\n <div data-canopy-search-tabs=\"1\">\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: json }} />\n </div>\n );\n}\n\n", "import React from 'react';\nimport SearchPanelForm, { resolveSearchPath } from '../search/SearchPanelForm.jsx';\nimport SearchPanelTeaserResults from '../search/SearchPanelTeaserResults.jsx';\n\n// SSR-safe placeholder for the search form modal, composed from SearchPanel parts.\n// This ensures a single JSX source of truth for form/panel markup.\nexport default function MdxSearchFormModal(props = {}) {\n const {\n placeholder = 'Search\u2026',\n hotkey = 'mod+k',\n maxResults = 8,\n groupOrder = ['work', 'page'],\n button = true, // kept for backward compat; ignored by teaser form\n buttonLabel = 'Search',\n label,\n searchPath = '/search',\n } = props || {};\n\n const text = typeof label === 'string' && label.trim() ? label.trim() : buttonLabel;\n const resolvedSearchPath = resolveSearchPath(searchPath);\n const data = { placeholder, hotkey, maxResults, groupOrder, label: text, searchPath: resolvedSearchPath };\n return (\n <div data-canopy-search-form className=\"flex-1 min-w-0\">\n <div className=\"relative w-full\">\n <SearchPanelForm placeholder={placeholder} buttonLabel={buttonLabel} label={label} searchPath={resolvedSearchPath} />\n <SearchPanelTeaserResults />\n </div>\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: JSON.stringify(data) }} />\n </div>\n );\n}\n", "import React from \"react\";\n\nexport const MagnifyingGlassIcon = (props) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\" {...props}>\n <path d=\"M456.69 421.39L362.6 327.3a173.81 173.81 0 0034.84-104.58C397.44 126.38 319.06 48 222.72 48S48 126.38 48 222.72s78.38 174.72 174.72 174.72A173.81 173.81 0 00327.3 362.6l94.09 94.09a25 25 0 0035.3-35.3zM97.92 222.72a124.8 124.8 0 11124.8 124.8 124.95 124.95 0 01-124.8-124.8z\" />\n </svg>\n);\n", "import {MagnifyingGlassIcon} from \"../Icons\";\nimport React from \"react\";\n\nfunction readBasePath() {\n const normalize = (val) => {\n const raw = typeof val === \"string\" ? val.trim() : \"\";\n if (!raw) return \"\";\n return raw.replace(/\\/+$/, \"\");\n };\n try {\n if (typeof window !== \"undefined\" && window.CANOPY_BASE_PATH != null) {\n const fromWindow = normalize(window.CANOPY_BASE_PATH);\n if (fromWindow) return fromWindow;\n }\n } catch (_) {}\n try {\n if (\n typeof globalThis !== \"undefined\" &&\n globalThis.CANOPY_BASE_PATH != null\n ) {\n const fromGlobal = normalize(globalThis.CANOPY_BASE_PATH);\n if (fromGlobal) return fromGlobal;\n }\n } catch (_) {}\n try {\n if (\n typeof process !== \"undefined\" &&\n process.env &&\n process.env.CANOPY_BASE_PATH\n ) {\n const fromEnv = normalize(process.env.CANOPY_BASE_PATH);\n if (fromEnv) return fromEnv;\n }\n } catch (_) {}\n return \"\";\n}\n\nfunction isAbsoluteUrl(href) {\n try {\n return /^https?:/i.test(String(href || \"\"));\n } catch (_) {\n return false;\n }\n}\n\nexport function resolveSearchPath(pathValue) {\n let raw = typeof pathValue === \"string\" ? pathValue.trim() : \"\";\n if (!raw) raw = \"/search\";\n if (isAbsoluteUrl(raw)) return raw;\n const normalizedPath = raw.startsWith(\"/\") ? raw : `/${raw}`;\n const base = readBasePath();\n if (!base) return normalizedPath;\n const baseWithLead = base.startsWith(\"/\") ? base : `/${base}`;\n const baseTrimmed = baseWithLead.replace(/\\/+$/, \"\");\n if (!baseTrimmed) return normalizedPath;\n if (\n normalizedPath === baseTrimmed ||\n normalizedPath.startsWith(`${baseTrimmed}/`)\n ) {\n return normalizedPath;\n }\n const pathTrimmed = normalizedPath.replace(/^\\/+/, \"\");\n return `${baseTrimmed}/${pathTrimmed}`;\n}\n\nexport default function SearchPanelForm(props = {}) {\n const {\n placeholder = \"Search\u2026\",\n buttonLabel = \"Search\",\n label,\n searchPath = \"/search\",\n inputId: inputIdProp,\n clearLabel = \"Clear search\",\n } = props || {};\n\n const text =\n typeof label === \"string\" && label.trim() ? label.trim() : buttonLabel;\n const action = React.useMemo(\n () => resolveSearchPath(searchPath),\n [searchPath]\n );\n const autoId = typeof React.useId === \"function\" ? React.useId() : undefined;\n const [fallbackId] = React.useState(\n () => `canopy-search-form-${Math.random().toString(36).slice(2, 10)}`\n );\n const inputId = inputIdProp || autoId || fallbackId;\n const inputRef = React.useRef(null);\n const [hasValue, setHasValue] = React.useState(false);\n\n const focusInput = React.useCallback(() => {\n const el = inputRef.current;\n if (!el) return;\n if (document.activeElement === el) return;\n try {\n el.focus({preventScroll: true});\n } catch (_) {\n try {\n el.focus();\n } catch (_) {}\n }\n }, []);\n\n const handlePointerDown = React.useCallback(\n (event) => {\n const target = event.target;\n if (target && typeof target.closest === \"function\") {\n if (target.closest(\"[data-canopy-search-form-trigger]\")) return;\n if (target.closest(\"[data-canopy-search-form-clear]\")) return;\n }\n event.preventDefault();\n focusInput();\n },\n [focusInput]\n );\n\n React.useEffect(() => {\n const el = inputRef.current;\n if (!el) return;\n if (el.value && el.value.trim()) {\n setHasValue(true);\n }\n }, []);\n\n const handleInputChange = React.useCallback((event) => {\n const nextHasValue = Boolean(\n event?.target?.value && event.target.value.trim()\n );\n setHasValue(nextHasValue);\n }, []);\n\n const handleClear = React.useCallback((event) => {}, []);\n\n const handleClearKey = React.useCallback(\n (event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n handleClear(event);\n }\n },\n [handleClear]\n );\n\n return (\n <form\n action={action}\n method=\"get\"\n role=\"search\"\n autoComplete=\"off\"\n spellCheck=\"false\"\n className=\"canopy-search-form canopy-search-form-shell\"\n onPointerDown={handlePointerDown}\n data-has-value={hasValue ? \"1\" : \"0\"}\n >\n <label htmlFor={inputId} className=\"canopy-search-form__label\">\n <MagnifyingGlassIcon className=\"canopy-search-form__icon\" />\n <input\n id={inputId}\n type=\"search\"\n name=\"q\"\n inputMode=\"search\"\n data-canopy-search-form-input\n placeholder={placeholder}\n className=\"canopy-search-form__input\"\n aria-label=\"Search\"\n ref={inputRef}\n onChange={handleInputChange}\n onInput={handleInputChange}\n />\n </label>\n {hasValue ? (\n <button\n type=\"button\"\n className=\"canopy-search-form__clear\"\n onClick={handleClear}\n onPointerDown={(event) => event.stopPropagation()}\n onKeyDown={handleClearKey}\n aria-label={clearLabel}\n data-canopy-search-form-clear\n >\n \u00D7\n </button>\n ) : null}\n <button\n type=\"submit\"\n data-canopy-search-form-trigger=\"submit\"\n className=\"canopy-search-form__submit\"\n >\n <span>{text}</span>\n <span aria-hidden className=\"canopy-search-form__shortcut\">\n <span>\u2318</span>\n <span>K</span>\n </span>\n </button>\n </form>\n );\n}\n", "import React from \"react\";\n\n// SSR placeholder for teaser results panel; the runtime controls visibility and content.\nexport default function SearchPanelTeaserResults(props = {}) {\n const { style, className } = props || {};\n const classes = [\"canopy-search-teaser\", className]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div\n data-canopy-search-form-panel\n className={classes || undefined}\n style={style}\n >\n <div id=\"cplist\" />\n </div>\n );\n}\n", "import React from 'react';\nimport SearchPanelForm, { resolveSearchPath } from './SearchPanelForm.jsx';\nimport SearchPanelTeaserResults from './SearchPanelTeaserResults.jsx';\n\n// High-level SearchPanel composed of a teaser form and teaser results panel.\n// Encodes configuration as JSON for the client runtime.\nexport default function SearchPanel(props = {}) {\n const {\n placeholder = 'Search\u2026',\n hotkey = 'mod+k',\n maxResults = 8,\n groupOrder = ['work', 'docs', 'page'],\n // Kept for backward compat; form always renders submit\n button = true, // eslint-disable-line no-unused-vars\n buttonLabel = 'Search',\n label,\n searchPath = '/search',\n } = props || {};\n\n const text = typeof label === 'string' && label.trim() ? label.trim() : buttonLabel;\n const resolvedSearchPath = resolveSearchPath(searchPath);\n const data = { placeholder, hotkey, maxResults, groupOrder, label: text, searchPath: resolvedSearchPath };\n\n return (\n <div data-canopy-search-form className=\"flex-1 min-w-0\">\n <div className=\"relative w-full\">\n <SearchPanelForm placeholder={placeholder} buttonLabel={buttonLabel} label={label} searchPath={resolvedSearchPath} />\n <SearchPanelTeaserResults />\n </div>\n <script type=\"application/json\" dangerouslySetInnerHTML={{ __html: JSON.stringify(data) }} />\n </div>\n );\n}\n", "import React from \"react\";\nimport {\n Label as CloverLabel,\n Metadata as CloverMetadata,\n RequiredStatement as CloverRequiredStatement,\n Summary as CloverSummary,\n} from \"@samvera/clover-iiif/primitives\";\n\nfunction hasInternationalValue(value) {\n if (!value || typeof value !== \"object\") return false;\n return Object.keys(value).some((key) => {\n const entries = value[key];\n return (\n Array.isArray(entries) &&\n entries.some((entry) => String(entry || \"\").trim().length > 0)\n );\n });\n}\n\nfunction ensureMetadata(items) {\n if (!Array.isArray(items)) return [];\n return items.filter((item) => {\n if (!item || typeof item !== \"object\") return false;\n const { label, value } = item;\n return hasInternationalValue(label) && hasInternationalValue(value);\n });\n}\n\nexport function Label({ manifest, label, ...rest }) {\n const intl = label || (manifest && manifest.label);\n if (!hasInternationalValue(intl)) return null;\n return <CloverLabel label={intl} {...rest} />;\n}\n\nexport function Summary({ manifest, summary, ...rest }) {\n const intl = summary || (manifest && manifest.summary);\n if (!hasInternationalValue(intl)) return null;\n return <CloverSummary summary={intl} {...rest} />;\n}\n\nexport function Metadata({ manifest, metadata, ...rest }) {\n const items = ensureMetadata(metadata || (manifest && manifest.metadata));\n if (!items.length) return null;\n return <CloverMetadata metadata={items} {...rest} />;\n}\n\nexport function RequiredStatement({ manifest, requiredStatement, ...rest }) {\n const stmt = requiredStatement || (manifest && manifest.requiredStatement);\n if (\n !stmt ||\n !hasInternationalValue(stmt.label) ||\n !hasInternationalValue(stmt.value)\n ) {\n return null;\n }\n return <CloverRequiredStatement requiredStatement={stmt} {...rest} />;\n}\n\nexport const Primitives = {\n Label,\n Summary,\n Metadata,\n RequiredStatement,\n};\n\nexport default Primitives;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["computeHeroHeightStyle", "React", "React", "useEffect", "useState", "React", "React", "React", "React", "React", "helpers", "React", "React", "React", "React", "React", "React", "_", "React", "React", "React", "React", "React"]
|
|
7
7
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
$max-w-content: 1080px !default;
|
|
@@ -1,21 +1,43 @@
|
|
|
1
|
-
@use "../variables" as *;
|
|
2
|
-
|
|
3
1
|
html,
|
|
4
2
|
body {
|
|
5
3
|
margin: 0;
|
|
6
4
|
padding: 0;
|
|
7
|
-
|
|
5
|
+
background: var(--color-gray-50);
|
|
6
|
+
color: var(--color-gray-900);
|
|
8
7
|
}
|
|
9
8
|
|
|
10
9
|
main {
|
|
11
|
-
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
p {
|
|
13
|
+
line-height: 1.55;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
ol,
|
|
17
|
+
ul {
|
|
18
|
+
padding-left: 1.5rem;
|
|
19
|
+
|
|
20
|
+
li {
|
|
21
|
+
margin-bottom: 0.25rem;
|
|
22
|
+
}
|
|
12
23
|
}
|
|
13
24
|
|
|
14
25
|
a {
|
|
15
26
|
text-decoration: none;
|
|
16
|
-
color:
|
|
27
|
+
color: var(--color-brand-default);
|
|
17
28
|
|
|
18
29
|
&:hover {
|
|
19
30
|
text-decoration: underline;
|
|
20
31
|
}
|
|
21
32
|
}
|
|
33
|
+
|
|
34
|
+
input,
|
|
35
|
+
textarea,
|
|
36
|
+
select,
|
|
37
|
+
button {
|
|
38
|
+
font-family: inherit;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
::selection {
|
|
42
|
+
background-color: var(--color-brand-200);
|
|
43
|
+
}
|