@canopy-iiif/app 1.2.5 → 1.2.7

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/lib/build/mdx.js CHANGED
@@ -1148,8 +1148,13 @@ function createReactShimPlugin() {
1148
1148
  const ReactDOM = (typeof window !== 'undefined' && window.ReactDOM) || {};
1149
1149
  export default ReactDOM;
1150
1150
  export const render = ReactDOM.render;
1151
- export const unmountComponentAtNode = ReactDOM.unmountComponentAtNode;
1151
+ export const hydrate = ReactDOM.hydrate;
1152
1152
  export const findDOMNode = ReactDOM.findDOMNode;
1153
+ export const unmountComponentAtNode = ReactDOM.unmountComponentAtNode;
1154
+ export const createPortal = ReactDOM.createPortal;
1155
+ export const flushSync = ReactDOM.flushSync;
1156
+ export const unstable_batchedUpdates = ReactDOM.unstable_batchedUpdates;
1157
+ export const unstable_renderSubtreeIntoContainer = ReactDOM.unstable_renderSubtreeIntoContainer;
1153
1158
  `;
1154
1159
  const rdomClientShim = `
1155
1160
  const RDC = (typeof window !== 'undefined' && window.ReactDOMClient) || {};
@@ -1682,6 +1687,18 @@ async function ensureTimelineRuntime() {
1682
1687
  export const useReducer = React.useReducer;
1683
1688
  export const useId = React.useId;
1684
1689
  `;
1690
+ const rdomShim = `
1691
+ const ReactDOM = (typeof window !== 'undefined' && window.ReactDOM) || {};
1692
+ export default ReactDOM;
1693
+ export const render = ReactDOM.render;
1694
+ export const hydrate = ReactDOM.hydrate;
1695
+ export const findDOMNode = ReactDOM.findDOMNode;
1696
+ export const unmountComponentAtNode = ReactDOM.unmountComponentAtNode;
1697
+ export const createPortal = ReactDOM.createPortal;
1698
+ export const flushSync = ReactDOM.flushSync;
1699
+ export const unstable_batchedUpdates = ReactDOM.unstable_batchedUpdates;
1700
+ export const unstable_renderSubtreeIntoContainer = ReactDOM.unstable_renderSubtreeIntoContainer;
1701
+ `;
1685
1702
  const rdomClientShim = `
1686
1703
  const RDC = (typeof window !== 'undefined' && window.ReactDOMClient) || {};
1687
1704
  export const createRoot = RDC.createRoot;
@@ -1702,7 +1719,7 @@ async function ensureTimelineRuntime() {
1702
1719
  loader: "js",
1703
1720
  }));
1704
1721
  build.onLoad({filter: /^react-dom$/, namespace: ns}, () => ({
1705
- contents: "export default (typeof window !== 'undefined' && window.ReactDOM) || {};",
1722
+ contents: rdomShim,
1706
1723
  loader: "js",
1707
1724
  }));
1708
1725
  build.onLoad({filter: /^react-dom-client$/, namespace: ns}, () => ({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@canopy-iiif/app",
3
- "version": "1.2.5",
3
+ "version": "1.2.7",
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;
@@ -3356,7 +3617,7 @@ function DocsCodeBlock(props = {}) {
3356
3617
  margin: "1.5rem 0",
3357
3618
  background: "var(--color-accent-100)",
3358
3619
  fontFamily: "var(--font-mono)",
3359
- fontSize: "0.85rem"
3620
+ fontSize: "0.8333rem"
3360
3621
  };
3361
3622
  const headerStyle = {
3362
3623
  display: "flex",
@@ -3371,7 +3632,7 @@ function DocsCodeBlock(props = {}) {
3371
3632
  const preStyle = {
3372
3633
  margin: 0,
3373
3634
  background: "var(--color-accent-100)",
3374
- color: "var(--color-accent-800)",
3635
+ color: "var(--color-accent-700)",
3375
3636
  lineHeight: 1.55,
3376
3637
  padding: "1rem 0",
3377
3638
  overflowX: "auto"