@canopy-iiif/app 1.2.4 → 1.2.6

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/iiif.js CHANGED
@@ -1160,6 +1160,23 @@ async function buildIiifCollectionPages(CONFIG) {
1160
1160
  .map((label) => normalizeMetadataLabel(String(label || "")))
1161
1161
  .filter(Boolean)
1162
1162
  );
1163
+ const metadataFacetLabels = (() => {
1164
+ if (!Array.isArray(metadataLabelsRaw) || !metadataLabelsRaw.length)
1165
+ return [];
1166
+ const seen = new Set();
1167
+ const entries = [];
1168
+ for (const label of metadataLabelsRaw) {
1169
+ const raw = typeof label === "string" ? label.trim() : String(label || "");
1170
+ if (!raw) continue;
1171
+ const normalized = normalizeMetadataLabel(raw);
1172
+ if (!normalized || seen.has(normalized)) continue;
1173
+ const slug = slugify(raw, {lower: true, strict: true, trim: true});
1174
+ if (!slug) continue;
1175
+ seen.add(normalized);
1176
+ entries.push({label: raw, slug, normalized});
1177
+ }
1178
+ return entries;
1179
+ })();
1163
1180
  const metadataOptions = {
1164
1181
  enabled:
1165
1182
  metadataEnabled &&
@@ -1479,6 +1496,18 @@ async function buildIiifCollectionPages(CONFIG) {
1479
1496
  pageDetails.meta.ogImage = ogImageForPage;
1480
1497
  }
1481
1498
  const pageContextValue = { navigation: null, page: pageDetails };
1499
+ if (metadataFacetLabels.length && manifest && typeof manifest === "object") {
1500
+ try {
1501
+ Object.defineProperty(manifest, "__canopyMetadataFacets", {
1502
+ configurable: true,
1503
+ enumerable: false,
1504
+ writable: true,
1505
+ value: metadataFacetLabels,
1506
+ });
1507
+ } catch (_) {
1508
+ manifest.__canopyMetadataFacets = metadataFacetLabels;
1509
+ }
1510
+ }
1482
1511
  const mdxContent = React.createElement(WorksLayoutComp, {
1483
1512
  manifest,
1484
1513
  references,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@canopy-iiif/app",
3
- "version": "1.2.4",
3
+ "version": "1.2.6",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "author": "Mat Jordan <mat@northwestern.edu>",
@@ -1,8 +1,82 @@
1
+ var __create = Object.create;
1
2
  var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __commonJS = (cb, mod) => function __require() {
8
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
9
+ };
2
10
  var __export = (target, all) => {
3
11
  for (var name in all)
4
12
  __defProp(target, name, { get: all[name], enumerable: true });
5
13
  };
14
+ var __copyProps = (to, from, except, desc) => {
15
+ if (from && typeof from === "object" || typeof from === "function") {
16
+ for (let key of __getOwnPropNames(from))
17
+ if (!__hasOwnProp.call(to, key) && key !== except)
18
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
19
+ }
20
+ return to;
21
+ };
22
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
23
+ // If the importer is in node compatibility mode or this is not an ESM
24
+ // file that has been converted to a CommonJS file using a Babel-
25
+ // compatible transform (i.e. "__esModule" has not been set), then set
26
+ // "default" to the CommonJS "module.exports" for node compatibility.
27
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
28
+ mod
29
+ ));
30
+
31
+ // ../../node_modules/slugify/slugify.js
32
+ var require_slugify = __commonJS({
33
+ "../../node_modules/slugify/slugify.js"(exports, module) {
34
+ (function(name, root, factory) {
35
+ if (typeof exports === "object") {
36
+ module.exports = factory();
37
+ module.exports["default"] = factory();
38
+ } else if (typeof define === "function" && define.amd) {
39
+ define(factory);
40
+ } else {
41
+ root[name] = factory();
42
+ }
43
+ })("slugify", exports, function() {
44
+ var charMap = JSON.parse(`{"$":"dollar","%":"percent","&":"and","<":"less",">":"greater","|":"or","\xA2":"cent","\xA3":"pound","\xA4":"currency","\xA5":"yen","\xA9":"(c)","\xAA":"a","\xAE":"(r)","\xBA":"o","\xC0":"A","\xC1":"A","\xC2":"A","\xC3":"A","\xC4":"A","\xC5":"A","\xC6":"AE","\xC7":"C","\xC8":"E","\xC9":"E","\xCA":"E","\xCB":"E","\xCC":"I","\xCD":"I","\xCE":"I","\xCF":"I","\xD0":"D","\xD1":"N","\xD2":"O","\xD3":"O","\xD4":"O","\xD5":"O","\xD6":"O","\xD8":"O","\xD9":"U","\xDA":"U","\xDB":"U","\xDC":"U","\xDD":"Y","\xDE":"TH","\xDF":"ss","\xE0":"a","\xE1":"a","\xE2":"a","\xE3":"a","\xE4":"a","\xE5":"a","\xE6":"ae","\xE7":"c","\xE8":"e","\xE9":"e","\xEA":"e","\xEB":"e","\xEC":"i","\xED":"i","\xEE":"i","\xEF":"i","\xF0":"d","\xF1":"n","\xF2":"o","\xF3":"o","\xF4":"o","\xF5":"o","\xF6":"o","\xF8":"o","\xF9":"u","\xFA":"u","\xFB":"u","\xFC":"u","\xFD":"y","\xFE":"th","\xFF":"y","\u0100":"A","\u0101":"a","\u0102":"A","\u0103":"a","\u0104":"A","\u0105":"a","\u0106":"C","\u0107":"c","\u010C":"C","\u010D":"c","\u010E":"D","\u010F":"d","\u0110":"DJ","\u0111":"dj","\u0112":"E","\u0113":"e","\u0116":"E","\u0117":"e","\u0118":"e","\u0119":"e","\u011A":"E","\u011B":"e","\u011E":"G","\u011F":"g","\u0122":"G","\u0123":"g","\u0128":"I","\u0129":"i","\u012A":"i","\u012B":"i","\u012E":"I","\u012F":"i","\u0130":"I","\u0131":"i","\u0136":"k","\u0137":"k","\u013B":"L","\u013C":"l","\u013D":"L","\u013E":"l","\u0141":"L","\u0142":"l","\u0143":"N","\u0144":"n","\u0145":"N","\u0146":"n","\u0147":"N","\u0148":"n","\u014C":"O","\u014D":"o","\u0150":"O","\u0151":"o","\u0152":"OE","\u0153":"oe","\u0154":"R","\u0155":"r","\u0158":"R","\u0159":"r","\u015A":"S","\u015B":"s","\u015E":"S","\u015F":"s","\u0160":"S","\u0161":"s","\u0162":"T","\u0163":"t","\u0164":"T","\u0165":"t","\u0168":"U","\u0169":"u","\u016A":"u","\u016B":"u","\u016E":"U","\u016F":"u","\u0170":"U","\u0171":"u","\u0172":"U","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017A":"z","\u017B":"Z","\u017C":"z","\u017D":"Z","\u017E":"z","\u018F":"E","\u0192":"f","\u01A0":"O","\u01A1":"o","\u01AF":"U","\u01B0":"u","\u01C8":"LJ","\u01C9":"lj","\u01CB":"NJ","\u01CC":"nj","\u0218":"S","\u0219":"s","\u021A":"T","\u021B":"t","\u0259":"e","\u02DA":"o","\u0386":"A","\u0388":"E","\u0389":"H","\u038A":"I","\u038C":"O","\u038E":"Y","\u038F":"W","\u0390":"i","\u0391":"A","\u0392":"B","\u0393":"G","\u0394":"D","\u0395":"E","\u0396":"Z","\u0397":"H","\u0398":"8","\u0399":"I","\u039A":"K","\u039B":"L","\u039C":"M","\u039D":"N","\u039E":"3","\u039F":"O","\u03A0":"P","\u03A1":"R","\u03A3":"S","\u03A4":"T","\u03A5":"Y","\u03A6":"F","\u03A7":"X","\u03A8":"PS","\u03A9":"W","\u03AA":"I","\u03AB":"Y","\u03AC":"a","\u03AD":"e","\u03AE":"h","\u03AF":"i","\u03B0":"y","\u03B1":"a","\u03B2":"b","\u03B3":"g","\u03B4":"d","\u03B5":"e","\u03B6":"z","\u03B7":"h","\u03B8":"8","\u03B9":"i","\u03BA":"k","\u03BB":"l","\u03BC":"m","\u03BD":"n","\u03BE":"3","\u03BF":"o","\u03C0":"p","\u03C1":"r","\u03C2":"s","\u03C3":"s","\u03C4":"t","\u03C5":"y","\u03C6":"f","\u03C7":"x","\u03C8":"ps","\u03C9":"w","\u03CA":"i","\u03CB":"y","\u03CC":"o","\u03CD":"y","\u03CE":"w","\u0401":"Yo","\u0402":"DJ","\u0404":"Ye","\u0406":"I","\u0407":"Yi","\u0408":"J","\u0409":"LJ","\u040A":"NJ","\u040B":"C","\u040F":"DZ","\u0410":"A","\u0411":"B","\u0412":"V","\u0413":"G","\u0414":"D","\u0415":"E","\u0416":"Zh","\u0417":"Z","\u0418":"I","\u0419":"J","\u041A":"K","\u041B":"L","\u041C":"M","\u041D":"N","\u041E":"O","\u041F":"P","\u0420":"R","\u0421":"S","\u0422":"T","\u0423":"U","\u0424":"F","\u0425":"H","\u0426":"C","\u0427":"Ch","\u0428":"Sh","\u0429":"Sh","\u042A":"U","\u042B":"Y","\u042C":"","\u042D":"E","\u042E":"Yu","\u042F":"Ya","\u0430":"a","\u0431":"b","\u0432":"v","\u0433":"g","\u0434":"d","\u0435":"e","\u0436":"zh","\u0437":"z","\u0438":"i","\u0439":"j","\u043A":"k","\u043B":"l","\u043C":"m","\u043D":"n","\u043E":"o","\u043F":"p","\u0440":"r","\u0441":"s","\u0442":"t","\u0443":"u","\u0444":"f","\u0445":"h","\u0446":"c","\u0447":"ch","\u0448":"sh","\u0449":"sh","\u044A":"u","\u044B":"y","\u044C":"","\u044D":"e","\u044E":"yu","\u044F":"ya","\u0451":"yo","\u0452":"dj","\u0454":"ye","\u0456":"i","\u0457":"yi","\u0458":"j","\u0459":"lj","\u045A":"nj","\u045B":"c","\u045D":"u","\u045F":"dz","\u0490":"G","\u0491":"g","\u0492":"GH","\u0493":"gh","\u049A":"KH","\u049B":"kh","\u04A2":"NG","\u04A3":"ng","\u04AE":"UE","\u04AF":"ue","\u04B0":"U","\u04B1":"u","\u04BA":"H","\u04BB":"h","\u04D8":"AE","\u04D9":"ae","\u04E8":"OE","\u04E9":"oe","\u0531":"A","\u0532":"B","\u0533":"G","\u0534":"D","\u0535":"E","\u0536":"Z","\u0537":"E'","\u0538":"Y'","\u0539":"T'","\u053A":"JH","\u053B":"I","\u053C":"L","\u053D":"X","\u053E":"C'","\u053F":"K","\u0540":"H","\u0541":"D'","\u0542":"GH","\u0543":"TW","\u0544":"M","\u0545":"Y","\u0546":"N","\u0547":"SH","\u0549":"CH","\u054A":"P","\u054B":"J","\u054C":"R'","\u054D":"S","\u054E":"V","\u054F":"T","\u0550":"R","\u0551":"C","\u0553":"P'","\u0554":"Q'","\u0555":"O''","\u0556":"F","\u0587":"EV","\u0621":"a","\u0622":"aa","\u0623":"a","\u0624":"u","\u0625":"i","\u0626":"e","\u0627":"a","\u0628":"b","\u0629":"h","\u062A":"t","\u062B":"th","\u062C":"j","\u062D":"h","\u062E":"kh","\u062F":"d","\u0630":"th","\u0631":"r","\u0632":"z","\u0633":"s","\u0634":"sh","\u0635":"s","\u0636":"dh","\u0637":"t","\u0638":"z","\u0639":"a","\u063A":"gh","\u0641":"f","\u0642":"q","\u0643":"k","\u0644":"l","\u0645":"m","\u0646":"n","\u0647":"h","\u0648":"w","\u0649":"a","\u064A":"y","\u064B":"an","\u064C":"on","\u064D":"en","\u064E":"a","\u064F":"u","\u0650":"e","\u0652":"","\u0660":"0","\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u067E":"p","\u0686":"ch","\u0698":"zh","\u06A9":"k","\u06AF":"g","\u06CC":"y","\u06F0":"0","\u06F1":"1","\u06F2":"2","\u06F3":"3","\u06F4":"4","\u06F5":"5","\u06F6":"6","\u06F7":"7","\u06F8":"8","\u06F9":"9","\u0E3F":"baht","\u10D0":"a","\u10D1":"b","\u10D2":"g","\u10D3":"d","\u10D4":"e","\u10D5":"v","\u10D6":"z","\u10D7":"t","\u10D8":"i","\u10D9":"k","\u10DA":"l","\u10DB":"m","\u10DC":"n","\u10DD":"o","\u10DE":"p","\u10DF":"zh","\u10E0":"r","\u10E1":"s","\u10E2":"t","\u10E3":"u","\u10E4":"f","\u10E5":"k","\u10E6":"gh","\u10E7":"q","\u10E8":"sh","\u10E9":"ch","\u10EA":"ts","\u10EB":"dz","\u10EC":"ts","\u10ED":"ch","\u10EE":"kh","\u10EF":"j","\u10F0":"h","\u1E62":"S","\u1E63":"s","\u1E80":"W","\u1E81":"w","\u1E82":"W","\u1E83":"w","\u1E84":"W","\u1E85":"w","\u1E9E":"SS","\u1EA0":"A","\u1EA1":"a","\u1EA2":"A","\u1EA3":"a","\u1EA4":"A","\u1EA5":"a","\u1EA6":"A","\u1EA7":"a","\u1EA8":"A","\u1EA9":"a","\u1EAA":"A","\u1EAB":"a","\u1EAC":"A","\u1EAD":"a","\u1EAE":"A","\u1EAF":"a","\u1EB0":"A","\u1EB1":"a","\u1EB2":"A","\u1EB3":"a","\u1EB4":"A","\u1EB5":"a","\u1EB6":"A","\u1EB7":"a","\u1EB8":"E","\u1EB9":"e","\u1EBA":"E","\u1EBB":"e","\u1EBC":"E","\u1EBD":"e","\u1EBE":"E","\u1EBF":"e","\u1EC0":"E","\u1EC1":"e","\u1EC2":"E","\u1EC3":"e","\u1EC4":"E","\u1EC5":"e","\u1EC6":"E","\u1EC7":"e","\u1EC8":"I","\u1EC9":"i","\u1ECA":"I","\u1ECB":"i","\u1ECC":"O","\u1ECD":"o","\u1ECE":"O","\u1ECF":"o","\u1ED0":"O","\u1ED1":"o","\u1ED2":"O","\u1ED3":"o","\u1ED4":"O","\u1ED5":"o","\u1ED6":"O","\u1ED7":"o","\u1ED8":"O","\u1ED9":"o","\u1EDA":"O","\u1EDB":"o","\u1EDC":"O","\u1EDD":"o","\u1EDE":"O","\u1EDF":"o","\u1EE0":"O","\u1EE1":"o","\u1EE2":"O","\u1EE3":"o","\u1EE4":"U","\u1EE5":"u","\u1EE6":"U","\u1EE7":"u","\u1EE8":"U","\u1EE9":"u","\u1EEA":"U","\u1EEB":"u","\u1EEC":"U","\u1EED":"u","\u1EEE":"U","\u1EEF":"u","\u1EF0":"U","\u1EF1":"u","\u1EF2":"Y","\u1EF3":"y","\u1EF4":"Y","\u1EF5":"y","\u1EF6":"Y","\u1EF7":"y","\u1EF8":"Y","\u1EF9":"y","\u2013":"-","\u2018":"'","\u2019":"'","\u201C":"\\"","\u201D":"\\"","\u201E":"\\"","\u2020":"+","\u2022":"*","\u2026":"...","\u20A0":"ecu","\u20A2":"cruzeiro","\u20A3":"french franc","\u20A4":"lira","\u20A5":"mill","\u20A6":"naira","\u20A7":"peseta","\u20A8":"rupee","\u20A9":"won","\u20AA":"new shequel","\u20AB":"dong","\u20AC":"euro","\u20AD":"kip","\u20AE":"tugrik","\u20AF":"drachma","\u20B0":"penny","\u20B1":"peso","\u20B2":"guarani","\u20B3":"austral","\u20B4":"hryvnia","\u20B5":"cedi","\u20B8":"kazakhstani tenge","\u20B9":"indian rupee","\u20BA":"turkish lira","\u20BD":"russian ruble","\u20BF":"bitcoin","\u2120":"sm","\u2122":"tm","\u2202":"d","\u2206":"delta","\u2211":"sum","\u221E":"infinity","\u2665":"love","\u5143":"yuan","\u5186":"yen","\uFDFC":"rial","\uFEF5":"laa","\uFEF7":"laa","\uFEF9":"lai","\uFEFB":"la"}`);
45
+ var locales = JSON.parse('{"bg":{"\u0419":"Y","\u0426":"Ts","\u0429":"Sht","\u042A":"A","\u042C":"Y","\u0439":"y","\u0446":"ts","\u0449":"sht","\u044A":"a","\u044C":"y"},"de":{"\xC4":"AE","\xE4":"ae","\xD6":"OE","\xF6":"oe","\xDC":"UE","\xFC":"ue","\xDF":"ss","%":"prozent","&":"und","|":"oder","\u2211":"summe","\u221E":"unendlich","\u2665":"liebe"},"es":{"%":"por ciento","&":"y","<":"menor que",">":"mayor que","|":"o","\xA2":"centavos","\xA3":"libras","\xA4":"moneda","\u20A3":"francos","\u2211":"suma","\u221E":"infinito","\u2665":"amor"},"fr":{"%":"pourcent","&":"et","<":"plus petit",">":"plus grand","|":"ou","\xA2":"centime","\xA3":"livre","\xA4":"devise","\u20A3":"franc","\u2211":"somme","\u221E":"infini","\u2665":"amour"},"pt":{"%":"porcento","&":"e","<":"menor",">":"maior","|":"ou","\xA2":"centavo","\u2211":"soma","\xA3":"libra","\u221E":"infinito","\u2665":"amor"},"uk":{"\u0418":"Y","\u0438":"y","\u0419":"Y","\u0439":"y","\u0426":"Ts","\u0446":"ts","\u0425":"Kh","\u0445":"kh","\u0429":"Shch","\u0449":"shch","\u0413":"H","\u0433":"h"},"vi":{"\u0110":"D","\u0111":"d"},"da":{"\xD8":"OE","\xF8":"oe","\xC5":"AA","\xE5":"aa","%":"procent","&":"og","|":"eller","$":"dollar","<":"mindre end",">":"st\xF8rre end"},"nb":{"&":"og","\xC5":"AA","\xC6":"AE","\xD8":"OE","\xE5":"aa","\xE6":"ae","\xF8":"oe"},"it":{"&":"e"},"nl":{"&":"en"},"sv":{"&":"och","\xC5":"AA","\xC4":"AE","\xD6":"OE","\xE5":"aa","\xE4":"ae","\xF6":"oe"}}');
46
+ function replace(string, options) {
47
+ if (typeof string !== "string") {
48
+ throw new Error("slugify: string argument expected");
49
+ }
50
+ options = typeof options === "string" ? { replacement: options } : options || {};
51
+ var locale = locales[options.locale] || {};
52
+ var replacement = options.replacement === void 0 ? "-" : options.replacement;
53
+ var trim = options.trim === void 0 ? true : options.trim;
54
+ var slug = string.normalize().split("").reduce(function(result, ch) {
55
+ var appendChar = locale[ch];
56
+ if (appendChar === void 0) appendChar = charMap[ch];
57
+ if (appendChar === void 0) appendChar = ch;
58
+ if (appendChar === replacement) appendChar = " ";
59
+ return result + appendChar.replace(options.remove || /[^\w\s$*_+~.()'"!\-:@]+/g, "");
60
+ }, "");
61
+ if (options.strict) {
62
+ slug = slug.replace(/[^A-Za-z0-9\s]/g, "");
63
+ }
64
+ if (trim) {
65
+ slug = slug.trim();
66
+ }
67
+ slug = slug.replace(/\s+/g, replacement);
68
+ if (options.lower) {
69
+ slug = slug.toLowerCase();
70
+ }
71
+ return slug;
72
+ }
73
+ replace.extend = function(customMap) {
74
+ Object.assign(charMap, customMap);
75
+ };
76
+ return replace;
77
+ });
78
+ }
79
+ });
6
80
 
7
81
  // ui/src/HelloWorld.jsx
8
82
  import React from "react";
@@ -3217,6 +3291,7 @@ function MdxSearchFormModal(props = {}) {
3217
3291
  }
3218
3292
 
3219
3293
  // ui/src/iiif/ManifestPrimitives.jsx
3294
+ var import_slugify = __toESM(require_slugify());
3220
3295
  import React34 from "react";
3221
3296
  import {
3222
3297
  Label as CloverLabel,
@@ -3239,6 +3314,180 @@ function ensureMetadata(items) {
3239
3314
  return hasInternationalValue(label) && hasInternationalValue(value);
3240
3315
  });
3241
3316
  }
3317
+ function getFirstIntlValue(value) {
3318
+ if (!value) return "";
3319
+ if (typeof value === "string") return value;
3320
+ try {
3321
+ const keys = Object.keys(value || {});
3322
+ for (const key of keys) {
3323
+ const arr = Array.isArray(value[key]) ? value[key] : [];
3324
+ for (const entry of arr) {
3325
+ if (entry == null) continue;
3326
+ const str = typeof entry === "string" ? entry : String(entry);
3327
+ if (str) return str;
3328
+ }
3329
+ }
3330
+ } catch (_) {
3331
+ }
3332
+ return "";
3333
+ }
3334
+ function normalizeMetadataLabelText(label) {
3335
+ if (!label) return "";
3336
+ return label.trim().replace(/[:\s]+$/g, "").toLowerCase();
3337
+ }
3338
+ function normalizeMetadataLabelValue(value) {
3339
+ const raw = getFirstIntlValue(value);
3340
+ if (!raw) return "";
3341
+ return normalizeMetadataLabelText(String(raw));
3342
+ }
3343
+ function buildFacetLabelMap(manifest) {
3344
+ const source = manifest && Array.isArray(manifest.__canopyMetadataFacets) ? manifest.__canopyMetadataFacets : null;
3345
+ if (!source || !source.length) return null;
3346
+ const map = /* @__PURE__ */ new Map();
3347
+ for (const entry of source) {
3348
+ if (!entry || !entry.normalized) continue;
3349
+ map.set(entry.normalized, entry);
3350
+ }
3351
+ return map.size ? map : null;
3352
+ }
3353
+ var SLUG_OPTIONS = { lower: true, strict: true, trim: true };
3354
+ function toValueSlug(value) {
3355
+ if (value == null) return "";
3356
+ try {
3357
+ const raw = typeof value === "string" ? value : String(value);
3358
+ return (0, import_slugify.default)(raw, SLUG_OPTIONS);
3359
+ } catch (_) {
3360
+ return "";
3361
+ }
3362
+ }
3363
+ function normalizeBasePath(value) {
3364
+ if (value == null) return "";
3365
+ const raw = String(value).trim();
3366
+ if (!raw) return "";
3367
+ const prefixed = raw.startsWith("/") ? raw : `/${raw}`;
3368
+ const cleaned = prefixed.replace(/\/+$/, "");
3369
+ return cleaned === "/" ? "" : cleaned;
3370
+ }
3371
+ var cachedBasePath = null;
3372
+ function readBasePath2() {
3373
+ if (cachedBasePath !== null) return cachedBasePath;
3374
+ const candidates = [];
3375
+ try {
3376
+ if (typeof window !== "undefined" && window.CANOPY_BASE_PATH != null) {
3377
+ candidates.push(window.CANOPY_BASE_PATH);
3378
+ }
3379
+ } catch (_) {
3380
+ }
3381
+ try {
3382
+ if (typeof globalThis !== "undefined" && globalThis.CANOPY_BASE_PATH != null) {
3383
+ candidates.push(globalThis.CANOPY_BASE_PATH);
3384
+ }
3385
+ } catch (_) {
3386
+ }
3387
+ try {
3388
+ if (typeof process !== "undefined" && process.env) {
3389
+ candidates.push(process.env.CANOPY_BASE_PATH);
3390
+ }
3391
+ } catch (_) {
3392
+ }
3393
+ for (const candidate of candidates) {
3394
+ const normalized = normalizeBasePath(candidate);
3395
+ if (normalized) {
3396
+ cachedBasePath = normalized;
3397
+ return cachedBasePath;
3398
+ }
3399
+ }
3400
+ cachedBasePath = "";
3401
+ return cachedBasePath;
3402
+ }
3403
+ function withBasePath(href) {
3404
+ try {
3405
+ const raw = typeof href === "string" ? href.trim() : "";
3406
+ if (!raw) return href;
3407
+ if (/^(?:[a-z][a-z0-9+.-]*:|\/\/|#)/i.test(raw)) return raw;
3408
+ if (!raw.startsWith("/")) return raw;
3409
+ const base = readBasePath2();
3410
+ if (!base) return raw;
3411
+ if (raw === base || raw.startsWith(`${base}/`)) return raw;
3412
+ return `${base}${raw}`;
3413
+ } catch (_) {
3414
+ return href;
3415
+ }
3416
+ }
3417
+ function buildFacetSearchHref(labelSlug, valueSlug) {
3418
+ if (!labelSlug || !valueSlug) return "";
3419
+ try {
3420
+ const params = new URLSearchParams();
3421
+ params.set("type", "work");
3422
+ params.set(labelSlug, valueSlug);
3423
+ const path = `/search?${params.toString()}`;
3424
+ return withBasePath(path);
3425
+ } catch (_) {
3426
+ return "";
3427
+ }
3428
+ }
3429
+ function MetadataFacetLink(props) {
3430
+ const { value, facetSlug } = props;
3431
+ const text = value == null ? "" : String(value);
3432
+ if (!text) return null;
3433
+ const valueSlug = facetSlug ? toValueSlug(text) : "";
3434
+ const href = facetSlug && valueSlug ? buildFacetSearchHref(facetSlug, valueSlug) : "";
3435
+ if (!href) return text;
3436
+ return /* @__PURE__ */ React34.createElement(
3437
+ "a",
3438
+ {
3439
+ href,
3440
+ "data-canopy-facet-link": "",
3441
+ "data-facet-label": facetSlug,
3442
+ "data-facet-value": valueSlug
3443
+ },
3444
+ text
3445
+ );
3446
+ }
3447
+ function buildFacetCustomValueContent(items, manifest) {
3448
+ if (!Array.isArray(items) || !items.length || !manifest) return [];
3449
+ const facetMap = buildFacetLabelMap(manifest);
3450
+ if (!facetMap) return [];
3451
+ const seen = /* @__PURE__ */ new Set();
3452
+ const custom = [];
3453
+ for (const item of items) {
3454
+ if (!item || !item.label) continue;
3455
+ const normalized = normalizeMetadataLabelValue(item.label);
3456
+ if (!normalized || seen.has(normalized)) continue;
3457
+ if (!facetMap.has(normalized)) continue;
3458
+ const facet = facetMap.get(normalized);
3459
+ seen.add(normalized);
3460
+ custom.push({
3461
+ matchingLabel: item.label,
3462
+ Content: /* @__PURE__ */ React34.createElement(MetadataFacetLink, { facetSlug: facet.slug })
3463
+ });
3464
+ }
3465
+ return custom;
3466
+ }
3467
+ function normalizeMatchingLabel(label) {
3468
+ if (!label) return "";
3469
+ return normalizeMetadataLabelValue(label);
3470
+ }
3471
+ function mergeCustomValueContent(userContent, autoContent) {
3472
+ const merged = [];
3473
+ const seen = /* @__PURE__ */ new Set();
3474
+ const addEntry = (entry, track = false) => {
3475
+ if (!entry || !entry.matchingLabel || !entry.Content) return;
3476
+ merged.push(entry);
3477
+ if (!track) return;
3478
+ const normalized = normalizeMatchingLabel(entry.matchingLabel);
3479
+ if (normalized) seen.add(normalized);
3480
+ };
3481
+ const userList = Array.isArray(userContent) ? userContent : [];
3482
+ userList.forEach((entry) => addEntry(entry, true));
3483
+ const autoList = Array.isArray(autoContent) ? autoContent : [];
3484
+ autoList.forEach((entry) => {
3485
+ const normalized = normalizeMatchingLabel(entry.matchingLabel);
3486
+ if (normalized && seen.has(normalized)) return;
3487
+ addEntry(entry, false);
3488
+ });
3489
+ return merged.length ? merged : void 0;
3490
+ }
3242
3491
  function Label({ manifest, label, ...rest }) {
3243
3492
  const intl = label || manifest && manifest.label;
3244
3493
  if (!hasInternationalValue(intl)) return null;
@@ -3249,10 +3498,22 @@ function Summary({ manifest, summary, ...rest }) {
3249
3498
  if (!hasInternationalValue(intl)) return null;
3250
3499
  return /* @__PURE__ */ React34.createElement(CloverSummary, { summary: intl, ...rest });
3251
3500
  }
3252
- function Metadata({ manifest, metadata, ...rest }) {
3501
+ function Metadata({ manifest, metadata, customValueContent, ...rest }) {
3253
3502
  const items = ensureMetadata(metadata || manifest && manifest.metadata);
3254
3503
  if (!items.length) return null;
3255
- return /* @__PURE__ */ React34.createElement(CloverMetadata, { metadata: items, ...rest });
3504
+ const autoCustomContent = buildFacetCustomValueContent(items, manifest);
3505
+ const mergedCustomContent = mergeCustomValueContent(
3506
+ customValueContent,
3507
+ autoCustomContent
3508
+ );
3509
+ return /* @__PURE__ */ React34.createElement(
3510
+ CloverMetadata,
3511
+ {
3512
+ metadata: items,
3513
+ customValueContent: mergedCustomContent,
3514
+ ...rest
3515
+ }
3516
+ );
3256
3517
  }
3257
3518
  function RequiredStatement({ manifest, requiredStatement, ...rest }) {
3258
3519
  const stmt = requiredStatement || manifest && manifest.requiredStatement;