doxa-maps/library/elements/posterSectionConfig.js
Doxa Maps 21e2200029 Poster sections: one type registry per page; the element takes a columns attribute
- ONE REGISTRY PER PAGE. Every bundle inlines its own copy of posterTypes.js, and <dxm-poster-section> is
  defined by whichever bundle loads first, so with a module-level Map that element saw only its own bundle's
  types: type="upg100-list" rendered "none" when the country-posters bundle had defined it. The registry now
  lives on the page (globalThis.__DXM_POSTER_TYPES__, created once): every copy registers into it and reads
  from it; a name registered twice keeps the first (a dev warning; the built-in country is silent); every
  registration is announced on window (dxm-poster-type-registered), and PosterSectionView looks again when
  its type arrives after it asked.
- COLUMNS (carried from the Poster Sections plugin PR so the element's library lands once): columns="1".."5"
  maps to profile-config.columns and to PosterWall's existing columns prop; absent or out of range is
  today's default, and a reader's saved per-row choice still wins.
- check:poster-type-registry (gates:pre; self-test in gates:post): two independent copies of the module side
  by side, as two bundles on one page; a type registered through one is found through the other; first wins;
  announced. The self-test's per-bundle registry fails.
2026-10-02 08:29:16 +00:00

17 lines
1 KiB
JavaScript

// <dxm-poster-section>'s attributes → its profile-config. Pure (no Vue), so it is testable on its own.
export const ATTRS = ['type', 'scope', 'collapsible', 'collapsed', 'locale', 'assets-base', 'api-base-url', 'is-dark', 'columns']
export const TAG = 'dxm-poster-section'
export function posterSectionConfig(el) {
const a = (n) => el.getAttribute(n)
const flag = (n, dflt) => (el.hasAttribute(n) ? a(n) !== 'false' : dflt)
const cfg = { type: a('type') || 'country', scope: a('scope') || '', collapsible: flag('collapsible', true), collapsed: flag('collapsed', false), isDark: flag('is-dark', false) }
if (a('locale')) cfg.locale = a('locale')
if (a('assets-base')) cfg.assetsBase = a('assets-base')
if (a('api-base-url')) cfg.apiBaseUrl = a('api-base-url')
// posters per row (1-5); absent = the wall's own default. A reader's saved choice still wins (PosterWall).
const cols = Number(a('columns'))
if (el.hasAttribute('columns') && Number.isInteger(cols) && cols >= 1 && cols <= 5) cfg.columns = cols
return cfg
}