countryPosters.stateNames x11, keyed by ISO 3166-2, for the India section's CARD labels (the wall, the print HUD, the
packet and list titles). The printed sheet stays English by recorded decision, like every country poster.
Generated, not typed: scripts/emit-india-state-names.mjs reads Wikidata labels by ISO 3166-2 (P300), dissolved items
excluded; Wikidata is CC0 (source, licence, query, date and every fallback in data/india-state-names.meta.json).
- Four codes ISO has renamed (IN-CT/OR/TG/UT -> CG/OD/TS/UK) are queried under the current code.
- English is the table's own name. Where the table is briefer than its item ("Delhi" vs "National Capital Territory
of Delhi"), the same-named item's labels win, so hi/ru match the English.
- Reviewed by eye (hi, ar, zh): two explicit overrides with their evidence (ar Odisha = the ar.wikipedia title,
not the pre-2011 label; zh Dadra and Nagar Haveli and Daman and Diu = Simplified, the only label being
Traditional). A zh name from a plain "zh" label with no reviewed override FAILS the generator (poisoned: it did).
The India section retries a failed table fetch at 5 s, 20 s and 60 s (bounded, cancelled on unmount), instead of
staying hidden until the filter changes.
check:country-sheet-one-path ARM D: every locale's stateNames == the table's 36 codes (a runtime-built key the i18n
call-site gates cannot see), English == the table, and the licence recorded; its two poisons join the self-test.
wall.bless-panels drew nothing. It now draws the ladder's 5 x 8 ft size
(60x96: three 60 x 36 in sheets, 6 in joins) through panelSheets'
planPanels and screenLayout, the same plan the Bless print uses: the
sheets pulled apart, each join a red glue band with a dashed edge, a
banner on the first sheet, a footer on the last, and rows of portrait
cards inside each sheet's content box, never crossing a join.
The cards are a layout (src/panelsSvg.js): the Bless wall draws its real
cards in its own plugin, which the gallery cannot import. The card is not
offered for printing here.
The Styles tab now draws the Bless wall panels from the shared panel
geometry, so missing.bless no longer says the gallery cannot draw them.
It says the sheets, the glue strips and the card rows come from the
shared geometry, and the cards are shown as a layout because the Bless
wall draws its cards in its own plugin.
The seven templates that showed 'preview unavailable' for the packet and
the cards now draw from the shared renderers with the Nepal sample:
- each card stock is the deck the wall prints (createCardRenderer with
that stock, buildDeck), its first card the thumbnail;
- each packet variant is the packet renderer's page 1, its map page,
built from the sample's map-only sheet as the wall's packet builds it.
src/pageThumb.js turns a document's first page into an image: it keeps
that page, re-serialises it as XHTML inside an SVG foreignObject and
returns it as an SVG image, which a plain <img> draws. Photos are inlined
only from the page's own origin; the people-group photo host sends no CORS
headers, so a card's photo frame stays empty in the thumbnail (the printed
deck still carries the photo), and no refused fetch reaches the console.
A card stock's print button prints its whole deck. A packet card is not
offered for printing here, since only its page 1 is built.
The Styles tab now draws the prayer packet's page 1 and every card stock,
so missing.packet and missing.cards are referenced nowhere. Only the notes
for the two templates still not drawn (the Bless panels, the map print)
remain.
Sizes reads the one shared ladder (POSTER_LADDER in POSTER_LADDER_ORDER)
and feeds each size's sheets straight into the library's PanelSheets, the
component the Wall uses for its 5 x 8 ft preview: multi-sheet sizes show
their sheets pulled apart with the red glue strip. A lineup draws every
size at one scale on one baseline, its scale fitted to the row's width so
a phone keeps every size in view. Each card also states the sheets, the
glued overlap, whether photos fit beside names, and how it prints.
The sheets carry the 3 x 3 ft country poster's layout at that size
(src/layoutSvg.js: header, map, names, table, scripture footer, no words),
labelled as a layout, since the renderer does not draw the large sizes
yet. Every size is sized from panelSheets' own screenLayout, so the fit
computed here is the box PanelSheets renders.
The composite header's Share button takes the header form
(shape="rounded-square"), as Big Picture's top bar does.
The Sizes tab now draws every ladder size, so it needs its own words: the
intro, the to-scale lineup, the paper names (Letter / A4), the dimension
patterns in feet and inches, the per-size rows (sheets, each sheet, glued
overlap, photos beside names, how it prints) and the note that the sheets
show the 3 x 3 layout. The placeholder sentence that said the tab was
waiting for the size table is removed. Only the posterDesign area changes.
Fills VerticalTabsLayout's #phone-end and #rail-end slots with the shared
ShellLanguageMenu. A pick first asks the host (doxa-language-request); only an
uncancelled pick reaches setLocale, which keeps the pick with the host language
value it was made over and saves it. The pick wins only while that value is
unchanged; a new value from the host takes over and drops the pick. The saved
choice is never read as a source, since it falls back to the browser's
language and would override the host page.
The gallery fills the tab layout's two new slots (the end of the phone bar, and the bottom of the desktop
rail) with the shared ShellLanguageMenu, showing the language in effect. The menu first asks the host with a
cancelable doxa-language-request. A host that takes it changes the language itself and sets `language`.
Otherwise the gallery switches on its own, and that pick holds over a `language` the host never updates, until
the host changes it. A saved choice never outranks the host page's own language. EMBED.md shows the listener.