Compare commits

...

3 commits

Author SHA1 Message Date
Doxa Maps
a465e44c58 Rebuild posterverse for the home link, and regenerate the tree
BUNDLE=posterverse vite build, then bun run tree and fix:sri. Only the
posterverse entry changes in the manifest (its integrity).
2026-09-30 23:26:59 +00:00
Doxa Maps
9d1337f74f Posterverse: the home link's fallback label in the reader's language
With home-href but no home-label, VerticalTabsLayout falls back to labels.home,
which Posterverse did not pass, so every locale read the English default. The
shell now passes labels.home from its own strings in all 11 locales, the same
words the Research Gallery uses. A host's own home-label still wins.
2026-09-30 23:25:58 +00:00
Doxa Maps
8d4a574673 Posterverse: pass the host's homeHref / homeLabel to the layout
VerticalTabsLayout draws a host's "Back to homepage" link directly above
Collapse (the top of the drawer on a phone); the Research Gallery already
forwards it. Posterverse now accepts the same two props (or profile-config
homeHref / homeLabel). Both default to '', which draws no link, so every
existing embed is unchanged.
2026-09-30 23:25:28 +00:00
8 changed files with 26 additions and 9 deletions

View file

@ -26,6 +26,8 @@
:title="headingText"
:nav-label="tr('sec.posters')"
:header="false"
:home-href="homeHref || cfg.homeHref || ''"
:home-label="homeLabel || cfg.homeLabel || ''"
:groups="navGroups"
:active="activeKey"
@update:active="onSelect">
@ -106,6 +108,10 @@ export default defineComponent({
provider: { type: String, default: '' },
// Which tab opens first, by row id (src/tabs.js). Also ?tab= on the page URL.
tab: { type: String, default: '' },
// The host's "Back to homepage" link, drawn by VerticalTabsLayout directly above Collapse (the top of
// the drawer on a phone). Also accepted as profile-config.homeHref / homeLabel. No URL, no link.
homeHref: { type: String, default: '' },
homeLabel: { type: String, default: '' },
},
emits: ['tab-change'],
setup() {
@ -156,7 +162,7 @@ export default defineComponent({
uiDir() { return this.uiLocale === 'ar' ? 'rtl' : 'ltr' },
layoutLabels() {
const out = {}
for (const k of ['toggleList', 'openViews', 'expandList', 'collapseList', 'collapse']) out[k] = this.tr(k)
for (const k of ['toggleList', 'openViews', 'expandList', 'collapseList', 'collapse', 'home']) out[k] = this.tr(k)
return out
},
effectiveProvider() {

View file

@ -86,7 +86,7 @@ export function checkShelf({ SECTIONS, TABS, NEVER, resolveTabs, manifest, meta,
// E. strings
const en = STRINGS.en || {}
const used = ['lab', 'experimentalSub', 'loading', 'loadFailed', 'manifestHint', 'backToTop',
'toggleList', 'openViews', 'expandList', 'collapseList', 'collapse',
'toggleList', 'openViews', 'expandList', 'collapseList', 'collapse', 'home',
...SECTIONS.map((s) => s.i18n), ...TABS.map((t) => 'tab.' + t.id),
...TABS.filter((t) => t.section !== 'experimental').map((t) => 'sub.' + t.id)]
for (const k of used) if (!(k in en)) errs.push(`E: the shell reads "${k}", which English does not define`)

View file

@ -24,6 +24,7 @@ export const STRINGS = {
loading: 'Loading {label}…', loadFailed: 'Could not load {label}.',
manifestHint: 'This tab is composed from manifest.json — build the tree, or serve the built tree, to load it.',
backToTop: 'Back to top',
home: 'Back to homepage',
toggleList: 'Toggle list', openViews: 'Open the list of views', expandList: 'Expand list', collapseList: 'Collapse list', collapse: 'Collapse',
},
es: {
@ -37,6 +38,7 @@ export const STRINGS = {
loading: 'Cargando {label}…', loadFailed: 'No se pudo cargar {label}.',
manifestHint: 'Esta pestaña se compone a partir de manifest.json: compila el árbol o sirve el árbol compilado para cargarla.',
backToTop: 'Volver arriba',
home: 'Volver a la página de inicio',
toggleList: 'Mostrar u ocultar la lista', openViews: 'Abrir la lista de vistas', expandList: 'Expandir la lista', collapseList: 'Contraer la lista', collapse: 'Contraer',
},
fr: {
@ -50,6 +52,7 @@ export const STRINGS = {
loading: 'Chargement de {label}…', loadFailed: 'Impossible de charger {label}.',
manifestHint: "Cet onglet est composé à partir de manifest.json : construisez l'arborescence ou servez l'arborescence construite pour le charger.",
backToTop: 'Retour en haut',
home: 'Retour à l’accueil',
toggleList: 'Afficher ou masquer la liste', openViews: 'Ouvrir la liste des vues', expandList: 'Déplier la liste', collapseList: 'Replier la liste', collapse: 'Replier',
},
de: {
@ -63,6 +66,7 @@ export const STRINGS = {
loading: '{label} wird geladen…', loadFailed: '{label} konnte nicht geladen werden.',
manifestHint: 'Dieser Tab wird aus manifest.json zusammengesetzt – bauen Sie den Baum oder stellen Sie den gebauten Baum bereit, um ihn zu laden.',
backToTop: 'Nach oben',
home: 'Zurück zur Startseite',
toggleList: 'Liste ein-/ausblenden', openViews: 'Ansichtsliste öffnen', expandList: 'Liste ausklappen', collapseList: 'Liste einklappen', collapse: 'Einklappen',
},
pt: {
@ -76,6 +80,7 @@ export const STRINGS = {
loading: 'Carregando {label}…', loadFailed: 'Não foi possível carregar {label}.',
manifestHint: 'Esta aba é composta a partir do manifest.json — compile a árvore ou sirva a árvore compilada para carregá-la.',
backToTop: 'Voltar ao topo',
home: 'Voltar à página inicial',
toggleList: 'Mostrar ou ocultar a lista', openViews: 'Abrir a lista de visualizações', expandList: 'Expandir a lista', collapseList: 'Recolher a lista', collapse: 'Recolher',
},
it: {
@ -89,6 +94,7 @@ export const STRINGS = {
loading: 'Caricamento di {label}…', loadFailed: 'Impossibile caricare {label}.',
manifestHint: "Questa scheda è composta da manifest.json: compila l'albero o pubblica l'albero compilato per caricarla.",
backToTop: 'Torna su',
home: 'Torna alla home page',
toggleList: 'Mostra o nascondi l’elenco', openViews: 'Apri l’elenco delle viste', expandList: 'Espandi l’elenco', collapseList: 'Comprimi l’elenco', collapse: 'Comprimi',
},
ro: {
@ -102,6 +108,7 @@ export const STRINGS = {
loading: 'Se încarcă {label}…', loadFailed: '{label} nu a putut fi încărcat.',
manifestHint: 'Această filă este compusă din manifest.json — construiți arborele sau serviți arborele construit pentru a o încărca.',
backToTop: 'Sus',
home: 'Înapoi la pagina principală',
toggleList: 'Afișează sau ascunde lista', openViews: 'Deschide lista de vizualizări', expandList: 'Extinde lista', collapseList: 'Restrânge lista', collapse: 'Restrânge',
},
ru: {
@ -115,6 +122,7 @@ export const STRINGS = {
loading: 'Загрузка: {label}…', loadFailed: 'Не удалось загрузить: {label}.',
manifestHint: 'Эта вкладка собирается из manifest.json — соберите дерево или разместите собранное дерево, чтобы загрузить её.',
backToTop: 'Наверх',
home: 'На главную страницу',
toggleList: 'Показать или скрыть список', openViews: 'Открыть список представлений', expandList: 'Развернуть список', collapseList: 'Свернуть список', collapse: 'Свернуть',
},
ar: {
@ -128,6 +136,7 @@ export const STRINGS = {
loading: 'جارٍ تحميل {label}…', loadFailed: 'تعذّر تحميل {label}.',
manifestHint: 'تُبنى علامة التبويب هذه من manifest.json — ابنِ الشجرة أو قدّم الشجرة المبنية لتحميلها.',
backToTop: 'إلى الأعلى',
home: 'العودة إلى الصفحة الرئيسية',
toggleList: 'إظهار القائمة أو إخفاؤها', openViews: 'فتح قائمة العروض', expandList: 'توسيع القائمة', collapseList: 'طي القائمة', collapse: 'طي',
},
hi: {
@ -141,6 +150,7 @@ export const STRINGS = {
loading: '{label} लोड हो रहा है…', loadFailed: '{label} लोड नहीं हो सका।',
manifestHint: 'यह टैब manifest.json से बनता है — इसे लोड करने के लिए ट्री बनाएँ या बना हुआ ट्री सर्व करें।',
backToTop: 'ऊपर जाएँ',
home: 'होमपेज पर वापस जाएँ',
toggleList: 'सूची दिखाएँ या छिपाएँ', openViews: 'दृश्यों की सूची खोलें', expandList: 'सूची फैलाएँ', collapseList: 'सूची संक्षिप्त करें', collapse: 'संक्षिप्त करें',
},
zh: {
@ -154,6 +164,7 @@ export const STRINGS = {
loading: '正在加载{label}…', loadFailed: '无法加载{label}。',
manifestHint: '此标签页由 manifest.json 组成——请构建目录树或提供已构建的目录树以加载它。',
backToTop: '回到顶部',
home: '返回首页',
toggleList: '显示或隐藏列表', openViews: '打开视图列表', expandList: '展开列表', collapseList: '折叠列表', collapse: '折叠',
},
}

View file

@ -1069,7 +1069,7 @@
"bundle": "posterverse",
"scriptUrl": "./posterverse/posterverse.js",
"output": "dx-maps/posterverse/posterverse.js",
"integrity": "sha384-brdiKg/0LXeaLF4WmTdeiia1QKk9Qy2qn6MHrKnPM2HXAKMPxTfY98MuxGQWIwIS",
"integrity": "sha384-O+OD1utYwNTk8lJ6NB2aTOjWpu9/6QtqW2wUu5Mw49cs0/z+fpCq8RVd8Bqav0j8",
"elements": [
"posterverse-app"
],
@ -1093,7 +1093,7 @@
"scriptUrl": "./posterverse/posterverse.js",
"embed": {
"iframe": "<iframe src=\"./posterverse/posterverse/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./posterverse/posterverse.js\" integrity=\"sha384-brdiKg/0LXeaLF4WmTdeiia1QKk9Qy2qn6MHrKnPM2HXAKMPxTfY98MuxGQWIwIS\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<posterverse-app profile-config='{\"profile\":\"posterverse\",\"provider\":\"maplibre\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></posterverse-app>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./posterverse/posterverse.js\" integrity=\"sha384-O+OD1utYwNTk8lJ6NB2aTOjWpu9/6QtqW2wUu5Mw49cs0/z+fpCq8RVd8Bqav0j8\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<posterverse-app profile-config='{\"profile\":\"posterverse\",\"provider\":\"maplibre\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></posterverse-app>"
},
"instances": [
{

View file

@ -1069,7 +1069,7 @@
"bundle": "posterverse",
"scriptUrl": "./posterverse/posterverse.js",
"output": "dx-maps/posterverse/posterverse.js",
"integrity": "sha384-brdiKg/0LXeaLF4WmTdeiia1QKk9Qy2qn6MHrKnPM2HXAKMPxTfY98MuxGQWIwIS",
"integrity": "sha384-O+OD1utYwNTk8lJ6NB2aTOjWpu9/6QtqW2wUu5Mw49cs0/z+fpCq8RVd8Bqav0j8",
"elements": [
"posterverse-app"
],
@ -1093,7 +1093,7 @@
"scriptUrl": "./posterverse/posterverse.js",
"embed": {
"iframe": "<iframe src=\"./posterverse/posterverse/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./posterverse/posterverse.js\" integrity=\"sha384-brdiKg/0LXeaLF4WmTdeiia1QKk9Qy2qn6MHrKnPM2HXAKMPxTfY98MuxGQWIwIS\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<posterverse-app profile-config='{\"profile\":\"posterverse\",\"provider\":\"maplibre\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></posterverse-app>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./posterverse/posterverse.js\" integrity=\"sha384-O+OD1utYwNTk8lJ6NB2aTOjWpu9/6QtqW2wUu5Mw49cs0/z+fpCq8RVd8Bqav0j8\" crossorigin=\"anonymous\"></script>\n<!-- provider: \"maplibre\" is the default; change it to \"mapbox\" and fill tk to use Mapbox. -->\n<posterverse-app profile-config='{\"profile\":\"posterverse\",\"provider\":\"maplibre\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></posterverse-app>"
},
"instances": [
{

File diff suppressed because one or more lines are too long

View file

@ -67,7 +67,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <posterverse-app> custom element. -->
<script src="../../posterverse.js" integrity="sha384-brdiKg/0LXeaLF4WmTdeiia1QKk9Qy2qn6MHrKnPM2HXAKMPxTfY98MuxGQWIwIS" crossorigin="anonymous"></script>
<script src="../../posterverse.js" integrity="sha384-O+OD1utYwNTk8lJ6NB2aTOjWpu9/6QtqW2wUu5Mw49cs0/z+fpCq8RVd8Bqav0j8" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -67,7 +67,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <posterverse-app> custom element. -->
<script src="../posterverse.js" integrity="sha384-brdiKg/0LXeaLF4WmTdeiia1QKk9Qy2qn6MHrKnPM2HXAKMPxTfY98MuxGQWIwIS" crossorigin="anonymous"></script>
<script src="../posterverse.js" integrity="sha384-O+OD1utYwNTk8lJ6NB2aTOjWpu9/6QtqW2wUu5Mw49cs0/z+fpCq8RVd8Bqav0j8" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order: