@museumwnf/viewer-layout 3.3.0 → 3.4.0

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/README.md CHANGED
@@ -138,23 +138,25 @@ section — the mark in the header, the active view — not for rebuilding the
138
138
  section. A website that needs something no prop expresses adds the prop
139
139
  here, so the next website has it too.
140
140
 
141
- Sections render top to bottom in this fixed order. Every section is optional: it renders nothing unless its slot or driving props are set. The default slot (→ `AppContent`) is where the router-view goes.
141
+ Sections render top to bottom in this fixed order, except that `navigation-placement="before-banner"` puts the navigation above the banner. Every section is optional: it renders nothing unless its slot or driving props are set. The default slot (→ `AppContent`) is where the router-view goes.
142
142
 
143
143
  | Section | Slot | Props (on PageShell) | Events |
144
144
  |---|---|---|---|
145
- | `AppHeader` | `#header`, `#header-brand` | `header-home`, `header-brand`, `header-eyebrow`, `header-title`, `header-title-href`, `header-subtitle`, `header-logos`, `header-logos-title`, `header-links`, `search`, `languages`, `language`, `language-placement`, `language-style` | `search`, `update:language` |
145
+ | `AppHeader` | `#header`, `#header-brand` | `header-home`, `header-brand`, `header-brand-logo`, `header-eyebrow`, `header-title`, `header-title-href`, `header-subtitle`, `header-logos`, `header-logos-title`, `header-links`, `search`, `languages`, `language`, `language-placement`, `language-style` | `search`, `update:language` |
146
146
  | `AppBanner` | `#banner` | `banner-variant`, `banner-image`, `banner-image-alt`, `banner-text`, `banner-caption`, `banner-caption-label`, `banner-eyebrow`, `banner-title`, `banner-title-href`, `banner-subtitle`, `banner-headline`, `banner-enter`, `banner-strapline` | — |
147
- | `AppNavigation` | `#navigation` | `nav-links`, `notice`, `languages`, `language` | `update:language` |
147
+ | `AppNavigation` | `#navigation` | `nav-links`, `notice`, `languages`, `language`, `navigation-placement` | `update:language` |
148
148
  | `AppContent` | default | — | — |
149
149
  | `AppHyperlinks` | `#hyperlinks` | `hyperlinks-variant`, `hyperlinks-title`, `hyperlinks-title-href`, `hyperlinks-subtitle`, `hyperlinks` | — |
150
150
  | `AppSponsors` | `#sponsors` | `sponsors-title`, `sponsors`, `sponsor-groups` | — |
151
- | `AppFooter` | `#footer` | `footer-text`, `footer-links`, `footer-attribution-label`, `footer-attribution-text`, `footer-terms-href`, `footer-terms-label` | — |
151
+ | `AppFooter` | `#footer` | `footer-text`, `footer-links`, `footer-social`, `footer-attribution-label`, `footer-attribution-text`, `footer-terms-href`, `footer-terms-label` | — |
152
152
 
153
153
  ### The language switcher
154
154
 
155
155
  `languages` is `['en']` or `[{ code, label }]`, `language` the active code.
156
156
  `language-placement` says where the switcher renders: `navigation` (the
157
- default, a select at the end of the navigation bar) or `header`;
157
+ default, a select at the end of the navigation bar), `header`, or `none` (no
158
+ site-language switcher at all: legacy's galleries had only the record's own
159
+ bar);
158
160
  `language-style` says how, `select` or `buttons`. Whichever renders emits
159
161
  `update:language` with the code chosen.
160
162
 
@@ -241,13 +243,122 @@ renders before the routed content, `#after-content` after it (a dismissible
241
243
  sponsor notice next to the router-view, say); `#header`, `#navigation`,
242
244
  `#hyperlinks`, `#sponsors`, `#footer` pass straight through to `PageShell`.
243
245
 
244
- Once the loaded package's `manifest.rights` names a holder (`useSiteRights()`),
245
- the footer also renders the attribution sentence — `rights.attribution`, or
246
+ The footer is legacy's unless the site says otherwise: MWNF's five portal
247
+ links and "© Museum With No Frontiers (MWNF) 2004–<year>" (since 3.4.0). With
248
+ `config.footer.rightsHolder: true`, and once the loaded package's
249
+ `manifest.rights` names a holder (`useSiteRights()`), it also renders the
250
+ attribution sentence — `rights.attribution`, or
246
251
  the holder's name when the package carries no separate attribution text —
247
252
  labelled `record.source.rightsHolder`, with a link labelled
248
- `record.source.termsOfUse` to `rights.termsUrl`. A package built before the
249
- `rights` block existed carries no holder, so the footer renders exactly as
250
- it did before: `footer-text` alone.
253
+ `record.source.termsOfUse` to `rights.termsUrl`. Legacy printed no such line,
254
+ so it is off by default.
255
+
256
+ ### Site chrome: the logo, the chrome pictures, the social links
257
+
258
+ Since 3.4.0 a site supplies its own chrome files (decision D7 of
259
+ inventory-app#2233: logos, banners, tiles and backgrounds belong to their
260
+ website, not to the inventory nor to `images.museumwnf.org`). It keeps them
261
+ in its repository under `theme/assets/` and hands the layout one map of
262
+ them, built by Vite so every file is fingerprinted with the build:
263
+
264
+ ```js
265
+ // src/dataset.config.js
266
+ const chrome = import.meta.glob('../theme/assets/**/*.{jpg,jpeg,png,gif,svg}', {
267
+ eager: true, query: '?url', import: 'default',
268
+ })
269
+
270
+ export default { /* … */ chrome, brand: { logo: 'logo.png', alt: 'MWNF Logo' } }
271
+ // a DXA site: galleryConfig({ …, chrome }) / exhibitionConfig({ …, chrome })
272
+ ```
273
+
274
+ The map's keys are normalised to the path after `theme/assets/`, so
275
+ `'../theme/assets/chrome/thematic_gallery/thg_galleries/9/banner.jpg'` is
276
+ `chrome/thematic_gallery/thg_galleries/9/banner.jpg`. Two kinds of key:
277
+
278
+ | Key | What reads it |
279
+ | --- | --- |
280
+ | a file name at the root (`logo.png`, `dia.jpg`, …) | the part of the layout that names it (`brand.logo`, the DXA keys below) |
281
+ | `chrome/<path>` | an image the data package names by its legacy path (`banner_image_path`, `image_path`, `homepage_image_path`, a sibling gallery's `image_path`): the file is the package's path under `theme/assets/chrome/`. One file per path, whatever size the layout asks for |
282
+
283
+ A key a site doesn't supply falls back to what the layout drew before:
284
+ the package path on `config.media.legacyHost`, the "MWNF" text mark for the
285
+ logo, nothing for a background. So a site that supplies nothing renders as
286
+ it did on 3.3.
287
+
288
+ | Config | Shape | Notes |
289
+ | --- | --- | --- |
290
+ | `config.chrome` | `{ [path]: url }` | the map above |
291
+ | `config.brand` | `{ logo, alt }` | `logo` a key of `chrome` (or a URL), drawn in the header's brand cell; `alt` an entry name or text. The DXA configs set it (below) |
292
+ | `config.navigation.placement` | `'after-banner'` (default) \| `'before-banner'` \| `({ section }) => …` | where the menu goes: PageShell's `navigation-placement` |
293
+ | `config.navigation.socialLinks` | `[{ label, href, icon }]` | the footer's social-network icons, opt-in for any site; `mwnfSocialLinks` (package root) is legacy's six. `icon` is one of `youtube`, `x`, `facebook`, `instagram`, `weibo`, `linkedin` |
294
+ | `config.footer` | `{ rightsHolder }` | the footer is legacy's by default on every site: MWNF's five portal links (`config.navigation.footerLinks` replaces them) and "© Museum With No Frontiers (MWNF) 2004–<year>" (a `footer-text` the caller passes replaces it). `rightsHolder: true` adds the package's rights-holder attribution, which legacy never printed |
295
+
296
+ `SocialLinks` (package root, prop `links`) draws the icon links on their own,
297
+ for a site that writes its own `#footer`:
298
+ `<SocialLinks :links="mwnfSocialLinks" />`.
299
+
300
+ The favicon is not the layout's: every site ships `public/favicon.ico` and
301
+ declares it in its own `index.html` (`<link rel="icon" href="%BASE_URL%favicon.ico">`).
302
+
303
+ **DXA families.** `galleryConfig` sets `brand.logo` to `logo.png` (legacy
304
+ dxa-client's white mark), `exhibitionConfig` to `logo_black.png`. Besides
305
+ the logo, the family reads:
306
+
307
+ | Key | Family | Where | Legacy source |
308
+ | --- | --- | --- | --- |
309
+ | `logo.png` | gallery (and the hub) | the header | `dxa-client/src/assets/logo.png` |
310
+ | `logo_black.png` | exhibition | the header | `exhibitions-client/src/assets/logo_black.png` |
311
+ | `dia.jpg`, `dba.jpg`, `sh.jpg` | gallery | the home's Other Virtual Museums banners (flat colour blocks without them) | `dxa-client/src/assets/` |
312
+ | `world.png` | gallery | the glossary entry's header on the item sheet | `dxa-client/src/sites/<site>/world.png` (one per gallery) |
313
+ | `chrome/<gallery.banner_image_path>` | gallery | the banner, every page | `images.museumwnf.org/hi_res/<path>` |
314
+ | `chrome/<sibling_galleries[].image_path>` | gallery | the "Visit MWNF Galleries" tiles | `images.museumwnf.org/zoom/<path>` (legacy's tile size) |
315
+ | `chrome/<exhibition.banner_image_path>` | exhibition | the banner on inner pages | `images.museumwnf.org/hi_res/<path>` |
316
+ | `chrome/<exhibition.homepage_image_path>` | exhibition | the home banner (`home_image.jpg`) | `images.museumwnf.org/full/<path>` |
317
+ | `chrome/<exhibition.logos[].legacy_path>` | exhibition | the sponsors' logos (header and footer strip), unless `sponsorLogos` lists the site's own | `images.museumwnf.org/full/<path>` |
318
+ | `chrome/<homeLogos[].image>` | gallery (Glass) | the home's "Set up on the occasion of" logos | `images.museumwnf.org/gallery_logo/<path>` |
319
+
320
+ **Exhibition sponsors.** The sponsors' logos are the site's, not the
321
+ inventory's. `exhibitionConfig({ sponsorLogos })` takes the site's own list,
322
+ `[{ image, href, alt, category_id, display_order }]` (`image` a chrome key or a
323
+ URL, `alt` an entry name or text), in place of the package's. Without it each
324
+ entry of `exhibition.json`'s `logos` draws `chrome/<legacy_path>`, else legacy's
325
+ media host at that path; never the inventory's `image_url`. A picture in the
326
+ popup notice whose legacy address the site keeps a copy of
327
+ (`chrome/<the path after legacy's size segment>`, e.g. `chrome/upload/toronto.jpg`
328
+ for `…/full/upload/toronto.jpg`) is drawn from that copy.
329
+
330
+ Glass's home logo slot is the one gallery-specific block, declared by the
331
+ site because no package carries it:
332
+
333
+ ```js
334
+ galleryConfig({
335
+ // …
336
+ homeLogos: [
337
+ { image: 'thematic_gallery/thg_logos/dga/1.jpg', href: 'https://iyog2022.org/', alt: 'glass.home.iyogLogo' },
338
+ ],
339
+ })
340
+ ```
341
+
342
+ `image` is a `chrome/` path (the file at
343
+ `theme/assets/chrome/thematic_gallery/thg_logos/dga/1.jpg`), `alt` an entry
344
+ name in the site's own locales; the strip's heading is viewer-i18n's
345
+ `gallery.home.logosLabel` ("Set up on the occasion of").
346
+
347
+ A gallery shell for a site without a gallery package (the galleries hub,
348
+ legacy's gallery 45) takes its chrome from `config.galleryShell` instead,
349
+ each field optional and each winning over the package:
350
+
351
+ | `config.galleryShell` field | Shape |
352
+ | --- | --- |
353
+ | `headerEyebrow`, `headerTitle` | entry name or text: the header's title cell on inner pages |
354
+ | `bannerEyebrow`, `bannerTitle` | entry name or text: the line over the home banner's title ("Welcome to") and the title ("MWNF Galleries") |
355
+ | `bannerImage` | a `chrome` key or a URL |
356
+ | `bannerCaption` | `{ name, partner, location, country }` or a string, after "Detail from" |
357
+ | `notice` | `false` drops the menu's tip about the search bar (a site with no search) |
358
+
359
+ An empty string is "no line" (`bannerEyebrow: ''` drops "Discover MWNF
360
+ Galleries"); a field left out keeps the gallery's own. The header fields
361
+ apply on inner pages only, as the home page's header has no title.
251
362
 
252
363
  ## Sections (standalone use)
253
364
 
@@ -0,0 +1,298 @@
1
+ import { t as e } from "./chrome-DPuPeWzV.js";
2
+ import { n as t, o as n } from "./TimelineEventList-COjkXEzS.js";
3
+ import { i as r, n as i, o as a, r as o, t as s } from "./OnDisplayIn-Dv8i7uvH.js";
4
+ import { s as c } from "./TimelineResultsView-ChkBn27W.js";
5
+ import { Fragment as l, computed as u, createBlock as d, createCommentVNode as f, createElementBlock as p, createElementVNode as m, createSlots as ee, createTextVNode as h, createVNode as g, guardReactiveProps as _, normalizeClass as v, normalizeProps as y, normalizeStyle as te, openBlock as b, renderList as x, renderSlot as S, toDisplayString as C, unref as w, useSlots as ne, withCtx as T } from "vue";
6
+ import { NotFoundView as re, byId as E, loadEntities as ie, mdInline as D, mdStrip as ae, mwnfLinks as O, partnerView as oe, useDataPackage as se, useI18n as ce, useProjects as le, useSiteConfig as ue } from "@museumwnf/viewer-core";
7
+ //#region src/dxa/ItemDetailView.vue
8
+ var k = {
9
+ key: 0,
10
+ class: "mwnf-sheet-source"
11
+ }, A = {
12
+ key: 0,
13
+ class: "mwnf-sheet-source__line"
14
+ }, j = {
15
+ key: 1,
16
+ class: "mwnf-sheet-source__collection"
17
+ }, M = ["href"], N = {
18
+ key: 1,
19
+ class: "mwnf-sheet-notice"
20
+ }, P = {
21
+ key: "museum",
22
+ class: "mwnf-sheet-museum"
23
+ }, F = ["innerHTML"], I = {
24
+ key: 0,
25
+ class: "mwnf-sheet-related"
26
+ }, L = {
27
+ key: 0,
28
+ class: "mwnf-sheet-related__heading mwnf-sheet-related__heading--caps"
29
+ }, R = {
30
+ key: 1,
31
+ class: "mwnf-sheet-related__description"
32
+ }, z = {
33
+ key: 0,
34
+ class: "mwnf-sheet-related__references"
35
+ }, B = {
36
+ key: 2,
37
+ class: "mwnf-sheet-related__unresolved"
38
+ }, V = {
39
+ key: 3,
40
+ class: "mwnf-sheet-related__line"
41
+ }, H = ["href"], U = { key: 7 }, de = { class: "mwnf-sheet-related__heading" }, fe = { key: 8 }, pe = { class: "mwnf-sheet-related__heading" }, me = { class: "mwnf-sheet-related__line" }, he = ["href"], ge = { key: 9 }, _e = { class: "mwnf-sheet-related__heading" }, ve = { class: "mwnf-sheet-related__line" }, ye = ["href"], be = { key: 10 }, xe = { class: "mwnf-sheet-related__heading" }, Se = "sheet.field.", W = {
42
+ __name: "ItemDetailView",
43
+ props: {
44
+ spec: {
45
+ type: Object,
46
+ required: !0
47
+ },
48
+ id: {
49
+ type: String,
50
+ required: !0
51
+ },
52
+ entity: {
53
+ type: String,
54
+ default: ""
55
+ },
56
+ dataGetter: {
57
+ type: Function,
58
+ default: null
59
+ }
60
+ },
61
+ setup(W) {
62
+ let G = W, Ce = ne(), we = /* @__PURE__ */ new Set([
63
+ "before-sheet",
64
+ "museum",
65
+ "related",
66
+ "aside"
67
+ ]), Te = u(() => Object.keys(Ce).filter((e) => !we.has(e))), Ee = u(() => !G.dataGetter || G.dataGetter(G.id) != null), { t: K } = ce();
68
+ function De(e) {
69
+ if (typeof e != "string" || !e.startsWith(Se)) return e;
70
+ let t = `sheet.dxa.${e.slice(12)}`;
71
+ return K(t) === t ? e : t;
72
+ }
73
+ let q = u(() => Array.isArray(G.spec.fields) ? {
74
+ ...G.spec,
75
+ fields: G.spec.fields.map((e) => ({
76
+ ...e,
77
+ label: De(e.label)
78
+ }))
79
+ } : G.spec), J = le(), Y = (e, t) => (e.name ?? "").localeCompare(t.name ?? ""), Oe = (e) => (e.gallery_references ?? []).filter((e) => e.kind === "gallery").sort(Y), X = (e) => (e.gallery_references ?? []).filter((e) => e.kind === "exhibition").sort(Y), Z = (e) => J.links(e.project_id)?.artisticIntroductionUrl ?? null, Q = (e) => J.links(e.project_id)?.relatedDatabaseUrl ?? null;
80
+ function ke(e, t) {
81
+ if (!e) return null;
82
+ let n = q.value.sourceDatabase === !1 ? null : q.value.sourceDatabase ?? null, r = null;
83
+ if (n) {
84
+ let i = n.chipClass ? n.chipClass(e, t) : null, a = J.label(e.project_id);
85
+ (i || a) && (r = {
86
+ chipClass: i,
87
+ name: a,
88
+ label: K(n.label ?? "record.sheet.sourceDatabase")
89
+ });
90
+ }
91
+ let i = n && n.addToCollection !== !1 ? K(n.addToCollection?.label ?? "record.action.addToCollection") : null, a = q.value.notice === !1 ? null : q.value.notice ?? null, o = a && a.show(e, t) ? K(a.label) : null;
92
+ return {
93
+ source: r,
94
+ addToCollectionLabel: i,
95
+ notice: o
96
+ };
97
+ }
98
+ let $ = se(), Ae = E("partners"), je = E("countries");
99
+ ie(["partners", "countries"]), $.loadTranslations("countries", "en");
100
+ function Me(e, t) {
101
+ let n = $.tr("countries", e, t, "en");
102
+ return ae(n.name ?? je.value?.get(e)?.internal_name ?? "");
103
+ }
104
+ function Ne(e) {
105
+ let t = e.text?.holder ? D(String(e.text.holder)) : "", n = q.value.museum === !1 ? null : q.value.museum ?? null, r = n ? Ae.value?.get(e.record?.partner_id) : null;
106
+ return {
107
+ holder: t,
108
+ view: r ? oe(r, $.tr("partners", r.id, e.language, "en"), {
109
+ countryLabel: (t) => Me(t, e.language),
110
+ route: (t) => n.route ? n.route(t.id, e) : null
111
+ }) : null
112
+ };
113
+ }
114
+ function Pe(e, t) {
115
+ if (!e) return null;
116
+ let n = q.value.related ?? {}, r = t.records ?? [], i = t.outside ?? [], a = G.dataGetter ? r.filter((e) => G.dataGetter(e.id) != null) : r, o = G.dataGetter ? r.filter((e) => G.dataGetter(e.id) == null).map((t) => (e.related_items ?? []).find((e) => e.id === t.id)).filter(Boolean) : [], s = [...i, ...o].map((e) => ({
117
+ ...e,
118
+ name: e.project_id ? J.label(e.project_id) : null,
119
+ chipClass: n.outsideChip ? n.outsideChip(e, t) : null
120
+ })), c = (e) => ({
121
+ id: e.id,
122
+ label: D(e.name ?? ""),
123
+ href: e.legacy_host || "",
124
+ external: !!e.legacy_host
125
+ }), l = n.onDisplayIn && n.onDisplayIn !== !1 ? {
126
+ pendingLabel: n.onDisplayIn.linkPendingLabel ?? "",
127
+ groups: [{
128
+ heading: "record.related.exhibitions",
129
+ links: X(e).map(c)
130
+ }, {
131
+ heading: "record.related.galleries",
132
+ links: Oe(e).map(c)
133
+ }].filter((e) => e.links.length)
134
+ } : null, u = n.databaseLabel && Q(e) ? {
135
+ url: Q(e),
136
+ label: K(n.databaseLabel),
137
+ name: J.label(e.project_id)
138
+ } : null, d = n.overallDatabase && n.overallDatabase !== !1 ? {
139
+ label: K(n.overallDatabase.label),
140
+ linkLabel: K(n.overallDatabase.linkLabel)
141
+ } : null;
142
+ return {
143
+ title: n.title ? K(n.title) : "",
144
+ description: n.description ? K(n.description) : "",
145
+ heading: K(n.heading ?? "record.related.items"),
146
+ variant: n.variant ?? "grid",
147
+ actionLabel: n.actionLabel ? K(n.actionLabel) : "",
148
+ inPackage: a,
149
+ references: s,
150
+ notInPackageLabel: n.notInPackageLabel ? K(n.notInPackageLabel) : "",
151
+ artisticIntroduction: n.artisticIntroductionLabel && Z(e) ? {
152
+ url: Z(e),
153
+ label: K(n.artisticIntroductionLabel)
154
+ } : null,
155
+ timeline: n.timeline ? n.timeline(e, t) : null,
156
+ glossary: n.glossary !== !1,
157
+ dynasties: n.dynasties ? n.dynasties(e, t.language, t) : null,
158
+ media: n.media === !1 ? [] : e.media ?? [],
159
+ onDisplayIn: l,
160
+ database: u,
161
+ overallDatabase: d,
162
+ download: n.download === !1 ? null : {
163
+ label: K("record.action.download"),
164
+ pdfLabel: K("record.action.downloadPdf")
165
+ }
166
+ };
167
+ }
168
+ let Fe = ue(), Ie = u(() => {
169
+ let t = e(Fe.chrome, "world.png");
170
+ return t ? { "--mwnf-dxa-glossary-image": `url("${t}")` } : null;
171
+ });
172
+ function Le() {
173
+ window.print();
174
+ }
175
+ return (e, u) => Ee.value ? (b(), d(c, {
176
+ key: 0,
177
+ spec: q.value,
178
+ id: W.id,
179
+ entity: W.entity,
180
+ style: te(Ie.value)
181
+ }, ee({
182
+ "before-sheet": T((t) => [S(e.$slots, "before-sheet", y(_(t)), () => [(b(!0), p(l, null, x([ke(t.record, t)], (e) => (b(), p(l, { key: "before-sheet" }, [e?.source || e?.addToCollectionLabel ? (b(), p("div", k, [e.source ? (b(), p("p", A, [e.source.chipClass ? (b(), p("span", {
183
+ key: 0,
184
+ class: v(["mwnf-chip", e.source.chipClass]),
185
+ "aria-hidden": "true"
186
+ }, null, 2)) : f("", !0), e.source.name ? (b(), p(l, { key: 1 }, [h(C(e.source.label) + ": " + C(e.source.name), 1)], 64)) : f("", !0)])) : f("", !0), e.addToCollectionLabel ? (b(), p("p", j, [m("a", {
187
+ href: w(O).myCollection,
188
+ target: "_blank",
189
+ rel: "noopener"
190
+ }, "↗ " + C(e.addToCollectionLabel), 9, M)])) : f("", !0)])) : f("", !0), e?.notice ? (b(), p("div", N, [h(C(e.notice) + " ", 1), m("strong", null, [m("em", null, C(t.languages.map((e) => e.label).join(", ")), 1)])])) : f("", !0)], 64))), 128))])]),
191
+ museum: T((n) => [S(e.$slots, "museum", y(_(n)), () => [(b(!0), p(l, null, x([Ne(n)], (e) => (b(), p("div", P, [e.holder ? (b(), p("p", {
192
+ key: 0,
193
+ class: "mwnf-sheet-museum__holder",
194
+ innerHTML: e.holder
195
+ }, null, 8, F)) : f("", !0), e.view ? (b(), d(t, {
196
+ key: 1,
197
+ variant: "summary",
198
+ partner: e.view,
199
+ label: "partner.info.about",
200
+ dir: n.dir
201
+ }, null, 8, ["partner", "dir"])) : f("", !0)]))), 128))])]),
202
+ related: T(() => []),
203
+ aside: T((t) => [S(e.$slots, "related", y(_(t)), () => [(b(!0), p(l, null, x([Pe(t.record, t)], (e) => (b(), p(l, { key: t.record?.id ?? "related" }, [e ? (b(), p("div", I, [
204
+ e.title ? (b(), p("p", L, C(e.title), 1)) : f("", !0),
205
+ e.description ? (b(), p("p", R, C(e.description), 1)) : f("", !0),
206
+ e.inPackage.length || e.references.length ? (b(), d(n, {
207
+ key: 2,
208
+ heading: e.heading,
209
+ records: e.inPackage,
210
+ variant: e.variant,
211
+ "action-label": e.actionLabel
212
+ }, {
213
+ default: T(() => [e.references.length ? (b(), p("ul", z, [(b(!0), p(l, null, x(e.references, (t) => (b(), p("li", { key: t.id }, [
214
+ t.chipClass ? (b(), p("span", {
215
+ key: 0,
216
+ class: v(["mwnf-chip", t.chipClass]),
217
+ "aria-hidden": "true"
218
+ }, null, 2)) : f("", !0),
219
+ t.name ? (b(), p(l, { key: 1 }, [h(C(t.name), 1)], 64)) : f("", !0),
220
+ e.notInPackageLabel ? (b(), p("span", B, C(e.notInPackageLabel), 1)) : f("", !0)
221
+ ]))), 128))])) : f("", !0)]),
222
+ _: 2
223
+ }, 1032, [
224
+ "heading",
225
+ "records",
226
+ "variant",
227
+ "action-label"
228
+ ])) : f("", !0),
229
+ e.artisticIntroduction ? (b(), p("p", V, [m("a", {
230
+ href: e.artisticIntroduction.url,
231
+ target: "_blank",
232
+ rel: "noopener"
233
+ }, "↗ " + C(e.artisticIntroduction.label), 9, H)])) : f("", !0),
234
+ e.timeline ? (b(), d(o, {
235
+ key: t.record.id,
236
+ info: e.timeline
237
+ }, null, 8, ["info"])) : f("", !0),
238
+ e.glossary ? (b(), d(a, {
239
+ key: 5,
240
+ language: t.language,
241
+ dir: t.dir
242
+ }, null, 8, ["language", "dir"])) : f("", !0),
243
+ e.dynasties?.records?.length ? (b(), d(r, {
244
+ key: 6,
245
+ heading: w(K)("record.dynasty.list"),
246
+ dynasties: e.dynasties.records,
247
+ tr: e.dynasties.tr,
248
+ dir: t.dir
249
+ }, null, 8, [
250
+ "heading",
251
+ "dynasties",
252
+ "tr",
253
+ "dir"
254
+ ])) : f("", !0),
255
+ g(i, {
256
+ media: e.media,
257
+ descriptions: !1,
258
+ dir: t.dir
259
+ }, null, 8, ["media", "dir"]),
260
+ e.onDisplayIn?.groups.length ? (b(), p("div", U, [m("p", de, C(w(K)("record.related.onDisplayIn")), 1), g(s, {
261
+ heading: "",
262
+ groups: e.onDisplayIn.groups,
263
+ "pending-label": e.onDisplayIn.pendingLabel,
264
+ dir: t.dir
265
+ }, null, 8, [
266
+ "groups",
267
+ "pending-label",
268
+ "dir"
269
+ ])])) : f("", !0),
270
+ e.database ? (b(), p("div", fe, [m("p", pe, C(e.database.label), 1), m("p", me, [m("a", {
271
+ href: e.database.url,
272
+ target: "_blank",
273
+ rel: "noopener"
274
+ }, "↗ " + C(e.database.name), 9, he)])])) : f("", !0),
275
+ e.overallDatabase ? (b(), p("div", ge, [m("p", _e, C(e.overallDatabase.label), 1), m("p", ve, [m("a", {
276
+ href: w(O).overallDatabase,
277
+ target: "_blank",
278
+ rel: "noopener"
279
+ }, "↗ " + C(e.overallDatabase.linkLabel), 9, ye)])])) : f("", !0),
280
+ e.download ? (b(), p("div", be, [m("p", xe, C(e.download.label), 1), m("p", {
281
+ class: "mwnf-sheet-related__line mwnf-sheet-related__line--action",
282
+ onClick: Le
283
+ }, "➤ " + C(e.download.pdfLabel), 1)])) : f("", !0)
284
+ ])) : f("", !0)], 64))), 128))])]),
285
+ _: 2
286
+ }, [x(Te.value, (t) => ({
287
+ name: t,
288
+ fn: T((n) => [S(e.$slots, t, y(_(n)))])
289
+ }))]), 1032, [
290
+ "spec",
291
+ "id",
292
+ "entity",
293
+ "style"
294
+ ])) : (b(), d(w(re), { key: 1 }));
295
+ }
296
+ };
297
+ //#endregion
298
+ export { W as t };
@@ -0,0 +1,192 @@
1
+ import { a as e, r as t } from "./chrome-DPuPeWzV.js";
2
+ import { computed as n, createBlock as r, createSlots as i, mergeProps as a, openBlock as o, renderSlot as s, useAttrs as c, withCtx as l } from "vue";
3
+ import { mwnfLinks as u, useI18n as d, useSection as f, useSiteConfig as p, useSiteRights as m } from "@museumwnf/viewer-core";
4
+ import { useRouter as h } from "vue-router";
5
+ //#region src/components/SiteShell.vue
6
+ var g = /*@__PURE__*/ Object.assign({ inheritAttrs: !1 }, {
7
+ __name: "SiteShell",
8
+ props: {
9
+ config: {
10
+ type: Object,
11
+ default: null
12
+ },
13
+ logos: {
14
+ type: Array,
15
+ default: () => []
16
+ }
17
+ },
18
+ setup(g) {
19
+ let _ = g, { t: v, locale: y } = d(), b = h(), x = f(), S = p(), C = n(() => ({
20
+ ...S,
21
+ ..._.config ?? {}
22
+ })), w = n(() => C.value.navigation ?? {}), T = n(() => C.value.logos ?? null), E = n(() => C.value.banner ?? null), D = c(), O = [
23
+ {
24
+ label: "core.footer.aboutMwnf",
25
+ href: u.about,
26
+ external: !0
27
+ },
28
+ {
29
+ label: "core.footer.contact",
30
+ href: u.contact,
31
+ external: !0
32
+ },
33
+ {
34
+ label: "core.footer.legalNotice",
35
+ href: u.legalNotice,
36
+ external: !0
37
+ },
38
+ {
39
+ label: "core.footer.credits",
40
+ href: u.credits,
41
+ external: !0
42
+ },
43
+ {
44
+ label: "core.footer.cookies",
45
+ href: u.cookies,
46
+ external: !0
47
+ }
48
+ ], k = (/* @__PURE__ */ new Date()).getFullYear(), A = n(() => D.footerText === void 0 && D["footer-text"] === void 0 ? `${v("core.footer.copyright")} 2004–${k}` : null), j = m(), M = n(() => C.value.footer?.rightsHolder !== !0 || !j.holder ? null : {
49
+ label: v("record.source.rightsHolder"),
50
+ text: j.attribution ?? j.holder,
51
+ termsHref: j.termsUrl,
52
+ termsLabel: v("record.source.termsOfUse")
53
+ });
54
+ function N(e) {
55
+ return e.href ? e.href : e.to ? b.resolve(e.to).href : "";
56
+ }
57
+ function P(e) {
58
+ return typeof e.when != "function" || !!e.when({
59
+ section: x.value,
60
+ locale: y.value
61
+ });
62
+ }
63
+ function F(e, { active: t = !1 } = {}) {
64
+ let n = {
65
+ label: v(e.label),
66
+ href: N(e),
67
+ external: !!e.external
68
+ };
69
+ return t && (n.active = e.section === x.value), n;
70
+ }
71
+ let I = n(() => Array.isArray(w.value.links) ? w.value.links.filter(P).map((e) => F(e, { active: !0 })) : null), L = n(() => Array.isArray(w.value.headerLinks) ? w.value.headerLinks.map((e) => F(e)) : null), R = n(() => (Array.isArray(w.value.footerLinks) ? w.value.footerLinks : O).map((e) => F(e))), z = n(() => {
72
+ let e = w.value.search;
73
+ return e ? {
74
+ placeholder: e.placeholder ? v(e.placeholder) : "",
75
+ submitLabel: e.submitLabel ? v(e.submitLabel) : ""
76
+ } : null;
77
+ });
78
+ function B(e) {
79
+ let t = w.value.search;
80
+ t?.route && b.push({
81
+ name: t.route,
82
+ query: { [t.key ?? "q"]: e || t.empty || "" }
83
+ });
84
+ }
85
+ function V(e) {
86
+ return typeof e == "function" ? e({
87
+ section: x.value,
88
+ locale: y.value,
89
+ t: v
90
+ }) : typeof e == "string" ? v(e) : e;
91
+ }
92
+ let H = n(() => {
93
+ let e = E.value ? V(E.value.title) : "";
94
+ if (e) return e;
95
+ let t = w.value.sectionTitles?.[x.value];
96
+ return t ? v(t) : "";
97
+ }), U = [
98
+ "variant",
99
+ "image",
100
+ "imageAlt",
101
+ "caption",
102
+ "captionLabel",
103
+ "subtitle",
104
+ "headline",
105
+ "enter",
106
+ "strapline"
107
+ ], W = n(() => {
108
+ let e = {};
109
+ H.value && (e.bannerTitle = H.value);
110
+ for (let t of U) {
111
+ let n = E.value ? V(E.value[t]) : "";
112
+ n && (e[`banner${t[0].toUpperCase()}${t.slice(1)}`] = n);
113
+ }
114
+ return e;
115
+ }), G = n(() => {
116
+ let e = C.value.brand, n = e ? t(C.value.chrome, e.logo) : null;
117
+ return n ? {
118
+ src: n,
119
+ alt: e.alt ? v(e.alt) : ""
120
+ } : null;
121
+ }), K = n(() => {
122
+ let e = w.value.placement;
123
+ return typeof e == "function" ? e({
124
+ section: x.value,
125
+ locale: y.value
126
+ }) : e;
127
+ }), q = n(() => Array.isArray(w.value.socialLinks) ? w.value.socialLinks : null), J = n(() => {
128
+ let e = T.value?.header;
129
+ return typeof e == "function" ? _.logos.filter(e) : null;
130
+ }), Y = n(() => {
131
+ let e = T.value?.headerTitle;
132
+ return e && J.value?.length ? v(e) : "";
133
+ }), X = n(() => {
134
+ let e = T.value?.sponsorGroups;
135
+ return typeof e == "function" ? e(_.logos, v) : null;
136
+ }), Z = n(() => {
137
+ let e = { ...W.value };
138
+ return Array.isArray(w.value.languages) && (e.languages = w.value.languages), I.value && (e.navLinks = I.value), L.value && (e.headerLinks = L.value), R.value && (e.footerLinks = R.value), A.value && (e.footerText = A.value), z.value && (e.search = z.value), J.value && (e.headerLogos = J.value, Y.value && (e.headerLogosTitle = Y.value)), X.value && (e.sponsorGroups = X.value), G.value && (e.headerBrandLogo = G.value), K.value && (e.navigationPlacement = K.value), q.value && (e.footerSocial = q.value), M.value && (e.footerAttributionLabel = M.value.label, e.footerAttributionText = M.value.text, e.footerTermsHref = M.value.termsHref, e.footerTermsLabel = M.value.termsLabel), e;
139
+ });
140
+ return (t, n) => (o(), r(e, a({
141
+ ...t.$attrs,
142
+ ...Z.value
143
+ }, { onSearch: B }), i({ _: 2 }, [
144
+ t.$slots.header ? {
145
+ name: "header",
146
+ fn: l(() => [s(t.$slots, "header")]),
147
+ key: "0"
148
+ } : void 0,
149
+ t.$slots.brand ? {
150
+ name: "header-brand",
151
+ fn: l(() => [s(t.$slots, "brand")]),
152
+ key: "1"
153
+ } : void 0,
154
+ t.$slots.banner ? {
155
+ name: "banner",
156
+ fn: l(() => [s(t.$slots, "banner")]),
157
+ key: "2"
158
+ } : void 0,
159
+ t.$slots.navigation ? {
160
+ name: "navigation",
161
+ fn: l(() => [s(t.$slots, "navigation")]),
162
+ key: "3"
163
+ } : void 0,
164
+ t.$slots.default || t.$slots.notice || t.$slots["after-content"] ? {
165
+ name: "default",
166
+ fn: l(() => [
167
+ s(t.$slots, "notice"),
168
+ s(t.$slots, "default"),
169
+ s(t.$slots, "after-content")
170
+ ]),
171
+ key: "4"
172
+ } : void 0,
173
+ t.$slots.hyperlinks ? {
174
+ name: "hyperlinks",
175
+ fn: l(() => [s(t.$slots, "hyperlinks")]),
176
+ key: "5"
177
+ } : void 0,
178
+ t.$slots.sponsors ? {
179
+ name: "sponsors",
180
+ fn: l(() => [s(t.$slots, "sponsors")]),
181
+ key: "6"
182
+ } : void 0,
183
+ t.$slots.footer ? {
184
+ name: "footer",
185
+ fn: l(() => [s(t.$slots, "footer")]),
186
+ key: "7"
187
+ } : void 0
188
+ ]), 1040));
189
+ }
190
+ });
191
+ //#endregion
192
+ export { g as t };
@@ -1,7 +1,7 @@
1
1
  import { s as e, y as t } from "./TimelineEventList-COjkXEzS.js";
2
- import { o as n } from "./TimelineResultsView-CmHomvV_.js";
3
- import { A as r, F as i, h as a, m as o } from "./data-BfyYB8ff.js";
4
- import { n as s, r as c, t as l } from "./themeSpecs-C_uGarTs.js";
2
+ import { o as n } from "./TimelineResultsView-ChkBn27W.js";
3
+ import { A as r, F as i, h as a, m as o } from "./data-CJlLA-Mf.js";
4
+ import { n as s, r as c, t as l } from "./themeSpecs-B885l456.js";
5
5
  import { Fragment as u, computed as d, createBlock as f, createCommentVNode as p, createElementBlock as m, createElementVNode as h, createTextVNode as g, createVNode as _, normalizeClass as v, onMounted as ee, openBlock as y, ref as b, renderList as x, toDisplayString as S, unref as C, vModelCheckbox as w, watch as T, withCtx as E, withDirectives as D } from "vue";
6
6
  import { renderBlock as O, useI18n as k } from "@museumwnf/viewer-core";
7
7
  import { RouterLink as A, useRoute as te, useRouter as ne } from "vue-router";
@@ -448,7 +448,11 @@ var Ne = {
448
448
  "variant",
449
449
  "action-label"
450
450
  ])) : v("", !0)])
451
- ]), e.$slots.aside ? (k(), y("aside", Xe, [N(e.$slots, "aside", O(w(Q.value)))])) : v("", !0)]),
451
+ ]), e.$slots.aside ? (k(), y("aside", Xe, [N(e.$slots, "aside", O(w({
452
+ ...Q.value,
453
+ records: Pe.value,
454
+ outside: I(Ne).outside
455
+ })))])) : v("", !0)]),
452
456
  N(e.$slots, "after", O(w(Q.value))),
453
457
  C(s, {
454
458
  term: I(J),