diff --git a/_contprompts/millos_place_led_beautification_20261010.md b/_contprompts/millos_place_led_beautification_20261010.md index 96ef0a48..1387d4cf 100644 --- a/_contprompts/millos_place_led_beautification_20261010.md +++ b/_contprompts/millos_place_led_beautification_20261010.md @@ -5780,3 +5780,35 @@ BR concrete gate repairs: pinned dependency install initially failed only in Pup BR package repair preserves every model, texture, shadow, light and18tracks: highest-quality VBR q0 delivery versions of Fuzzball Parade and The Builder only, from original Git masters, same channels/sample rate/complete duration, credits/licence comments retained, new Xing padding metadata, silent decode proof. These are lossy delivery encodes, not a claim of bit-identical samples or listening approval. Space Jazz and Cloud Dancer trials are larger, discarded; originals untouched. All8MillOS originals and manifests are byte-exact. Saving3885578bytes. Lossless civic-depth PNG zlib9/adaptive encoding saves938130more bytes; every decoded RGBA byte and colour-management chunk is exact, rawSHA19f3befe0ab8ea23af5e24805ae2a8034a84b813868bd183189d012da5111fdb. Update only encoded atlasSHA and paired PNG/JSON cache version; source geometry/bake/ray samples unchanged. Total4823708bytes saved, projected169.22MiB without a budget waiver. BR outgoing preflight:156polish/source commits scanned,2131generic-key findings reviewed as1990stable shader/program identities and141SHA256pins; integration adds2stable shader cache keys. No unclassified credential finding; largest blob27362309bytes, no blob above100000000bytes, ordinary Git/no LFS. No live key or unrelated private file discovered. Runtime-only dependency audit has two inherited warnings(fflate malformed ZIP64 and source-map-js indexed source-map DoS); no blanket security-clean claim or unrelated dependency-upgrade campaign. Primary dirty work remains excluded. Normal GitHub PR31 and hosted CI are the established delivery path. + +## BS. Village and market illustrated raster identities, 2026-10-18 + +Nell requests proper branded raster signs for Village Inn, Blacksmith, School, Farm Harvest, Bread & Rolls, Greengrocer and the remaining signs. Nine separately generated raster originals cover Flour & Barrel fascia and two-sided hanging board, Blacksmith, Village School, Town Hall, and all four existing market trades including Cheesemonger. The existing Riverside Bakers, Fieldgate Butchers, Canalside Provisions and four service identities remain intact. Preserve their distinct identities rather than rebranding them. + +Starting checkout: owned finishing-recovery worktree, exact base 80bb4e2d5d9a4291121e6d8428c87a0a6f9a7f6d, tracked clean, ten unrelated PNGs retained. Primary dirty checkout is untouched. Allowed surfaces: HeritageSignage, VillageSignage, VillageArea, AuthoredPropTrim, existing HeritageSignage/VillageArea tests, source artwork/prompts and public signage provenance. No world/model/light/layout, game-clock, readiness, interface or quality-budget change. + +Finite task list and acceptance: +1. Reconcile live checkout ownership and record affected baseline (53 passed, zero failures). +2. Inventory actual unbranded physical seats and four real market stock dressings. +3. Generate nine separate illustrated raster images with exact existing names, unique emblems and readable lettering. +4. Inspect every generated original; retain sources and exact prompts under assets/source/graphics/village-signs. +5. Mechanically trim only blank padding and create compact aspect-preserving opaque WebPs; no vector substitution, stretch or repaint. +6. Retain exact image/crop/hash provenance, source masters and source-to-runtime mappings. +7. Add the eight identities to the existing typed business registry; preserve existing transport-company bindings. +8. Fit complete artwork into the retained inn/civic/forge frames with no duplicated live text or keylines through the print. +9. Preserve both hanging faces and the existing static batching; inspect the actual two-instance batch after source planes are optimised away. +10. Replace the four market tray labels with their correct stock-linked rasters at the existing one-millimetre stand-off, inside measured tray bounds. +11. Keep new paint lit and non-emissive, using original physical lamps and dusk dimmer. +12. Update existing contracts for names, provenance, opacity, aspect and physical placement; final focused result 55 passed, zero failures. +13. Run required typecheck/lint/format/depth/shader/build/reachability/community gates, unchanged budgets. +14. Inspect exact-build muted native day/dusk/night and Low views of all new faces, both inn sides, existing shops and village context. +15. Retain raw diagnostics, images, failures and receipts. Keep pacing OPEN separately and player/device checks DEFERRED. +16. Selectively commit only this pass after actual acceptance, then use the established PR/CI/Pages path for the newly authorised delivery. +17. Verify served code, nine artwork hashes and preserved v0.10/v0.20/v0.30 archives before reporting live. +18. Once these are live, continue the programme with core cooperative-learning gameplay, as Nell now requests. + +Delivery authority update: Nell explicitly says, "Get these live please when finished, and then proceed again with the refinements process. This time, focus more on the core cooperative learning game elements please." This releases the LOCAL-only hold for this sign set and its established NellInc/MillOS PR/Pages delivery to https://www.millos.net/v0.40/. It does not authorise bypassing CI/readiness/quality safeguards or publishing future unrelated gameplay changes automatically. The repeating goal stays ACTIVE; subsequent gameplay work remains local and muted unless separately released. + +Evidence currently complete: all nine originals and exact names inspected. Runtime artwork 652978 bytes total; full build431files178110247bytes, Vite27.23s, unchanged170MiB bundle gate passes at169.86MiB. Focused tests55/55, typecheck/lint/format/depth/shader/reachability/community pass. Day Medium, dusk Medium and day Low each have14 clean native views, original strict readiness, normal1x clock after admission, sandboxed out-of-process Metal, all nine actual public assets hash-matched. All new signs have zero emission, both hanging faces are in the real two-instance batch. Night review is the remaining local art checkpoint. Helper failures are retained separately: mismatched preview base rejected before browser launch, then a source-metadata-only query missed the intentionally batched two-sided sign. Correct the helper to actual base and instance transforms; neither required a game change or a weakened check. + +BS local acceptance complete: night Medium also passes,14 additional exact-build native views,56 total personally inspected. Both actual inn instance faces, civic/forge sign seats, four actual stock-linked tray prints, existing shops and village context are intact. World/people/texture/page/request/audio guards clean; no new sign emission, source drift, quality downgrade or readiness override. Night paint follows the original physical lamps; school/forge remain naturally darker where no fascia light existed. Programme pacing remains separately OPEN. Authoring and aesthetic review were by this root, not an independent reviewer. Art receipt/gallery/raw captures under test-results/village-raster-signs-20261018. Approved next delivery is normal selective PR, full CI and preserved-archive Pages with served-byte verification, not a direct production bypass. diff --git a/assets/source/graphics/village-signs/blacksmith-v1.png b/assets/source/graphics/village-signs/blacksmith-v1.png new file mode 100644 index 00000000..4c9a42cd Binary files /dev/null and b/assets/source/graphics/village-signs/blacksmith-v1.png differ diff --git a/assets/source/graphics/village-signs/breadRolls-v1.png b/assets/source/graphics/village-signs/breadRolls-v1.png new file mode 100644 index 00000000..91250bcc Binary files /dev/null and b/assets/source/graphics/village-signs/breadRolls-v1.png differ diff --git a/assets/source/graphics/village-signs/cheesemonger-v1.png b/assets/source/graphics/village-signs/cheesemonger-v1.png new file mode 100644 index 00000000..29e0c59f Binary files /dev/null and b/assets/source/graphics/village-signs/cheesemonger-v1.png differ diff --git a/assets/source/graphics/village-signs/greengrocer-v1.png b/assets/source/graphics/village-signs/greengrocer-v1.png new file mode 100644 index 00000000..49ae355e Binary files /dev/null and b/assets/source/graphics/village-signs/greengrocer-v1.png differ diff --git a/assets/source/graphics/village-signs/harvest-v1.png b/assets/source/graphics/village-signs/harvest-v1.png new file mode 100644 index 00000000..2f282910 Binary files /dev/null and b/assets/source/graphics/village-signs/harvest-v1.png differ diff --git a/assets/source/graphics/village-signs/innFascia-v1.png b/assets/source/graphics/village-signs/innFascia-v1.png new file mode 100644 index 00000000..7acbbd49 Binary files /dev/null and b/assets/source/graphics/village-signs/innFascia-v1.png differ diff --git a/assets/source/graphics/village-signs/innHanging-v1.png b/assets/source/graphics/village-signs/innHanging-v1.png new file mode 100644 index 00000000..9cb95d95 Binary files /dev/null and b/assets/source/graphics/village-signs/innHanging-v1.png differ diff --git a/assets/source/graphics/village-signs/prompts.json b/assets/source/graphics/village-signs/prompts.json new file mode 100644 index 00000000..3314da06 --- /dev/null +++ b/assets/source/graphics/village-signs/prompts.json @@ -0,0 +1,25 @@ +{ + "method": "Nine individual built-in image_gen raster generations; inn hanging uses generated fascia as style reference", + "prompts": { + "innFascia": "Use case: logo-brand. Asset type: finished illustrated RASTER fascia texture for the existing Flour & Barrel village inn, a charming British/Dutch miniature village. Single front-facing horizontal sign, actual sign ratio 5.2:1. The complete artwork is one band centred vertically with blank pure white padding above and below if needed. Full width band, no scenery, no mockup, no perspective, no cast shadow outside sign. Rich bottle-green painted enamel, aged brass border and warm ivory signwriter typography, restrained wear. Distinctive beautiful brand illustration of a wooden beer barrel paired with a wheat sheaf, clear small silhouette at one end. Exact large title 'Flour & Barrel', exact smaller caption 'VILLAGE INN'. All lettering fully inside border, large easy-to-read traditional pub lettering, title dominant. Real painterly raster texture and brush detail, refined and cosy, not an SVG-looking symbol or plain text label. Do not add years, prices, extra words, corporate logos, beer glasses or people. Preserve straight edges and generous safe margins. Design belongs to the village's crafted painted service-sign family while owning its pub identity.", + "blacksmith": "Use case: logo-brand. A single finished gorgeous RASTER sign texture, painted/enamel craft for a charming British/Dutch miniature village game. Front-facing flat artwork, no scene or mounted mockup, no perspective. The sign is an EXTREMELY NARROW horizontal rectangle, actual ratio 8:1. Centre the complete 8:1 art band vertically across the entire canvas width, with blank pure-white padding above and below. Nothing outside this band. Fit every letter and tiny emblem within the complete border with safe margins. At game scale this is a building fascia: very large readable title, distinctive small emblem, NO small subtitle, NO dates, prices or additional words. Beautiful textured brush detail, moderate restrained patina, crisp hierarchy, professionally crafted, not a plain SVG label. Exact text 'BLACKSMITH'. Warm ivory confident slightly slabbed artisan lettering on charcoal/blue-black enamel. Distinctive compact emblem of a steel anvil and copper horseshoe, a restrained ember-orange flourish. Thin worn bronze rule. Keep anvil recognisable, wheat and barrels absent. Title occupies most width.", + "school": "Use case: logo-brand. A single finished gorgeous RASTER sign texture, painted/enamel craft for a charming British/Dutch miniature village game. Front-facing flat artwork, no scene or mounted mockup, no perspective. The sign is an EXTREMELY NARROW horizontal rectangle, actual ratio 8:1. Centre the complete 8:1 art band vertically across the entire canvas width, with blank pure-white padding above and below. Nothing outside this band. Fit every letter and tiny emblem within the complete border with safe margins. At game scale this is a building fascia: very large readable title, distinctive small emblem, NO small subtitle, NO dates, prices or additional words. Beautiful textured brush detail, moderate restrained patina, crisp hierarchy, professionally crafted, not a plain SVG label. Exact text 'VILLAGE SCHOOL'. Warm ivory friendly scholarly serif lettering on deep slate-blue enamel. A small beautiful open-book and oak-leaf crest in old gold with a muted sky-blue accent. Welcoming, clear, refined civic craft, not a heraldic royal crest. No motto, alphabet, tiny secondary words or other text.", + "townHall": "Use case: logo-brand. A single finished gorgeous RASTER sign texture, painted/enamel craft for a charming British/Dutch miniature village game. Front-facing flat artwork, no scene or mounted mockup, no perspective. The sign is an EXTREMELY NARROW horizontal rectangle, actual ratio 8:1. Centre the complete 8:1 art band vertically across the entire canvas width, with blank pure-white padding above and below. Nothing outside this band. Fit every letter and tiny emblem within the complete border with safe margins. At game scale this is a building fascia: very large readable title, distinctive small emblem, NO small subtitle, NO dates, prices or additional words. Beautiful textured brush detail, moderate restrained patina, crisp hierarchy, professionally crafted, not a plain SVG label. Exact text 'TOWN HALL'. Elegant large ivory civic Roman-capital signwriting on deep teal/slate enamel. Distinctive small village civic emblem, a tiny stone arch and golden wheat fan, beautiful but restrained copper and gold detailing. Balanced formal spacing, refined low-relief painted/engraved texture. No coats of arms from real places, no dates or motto.", + "innHanging": "Use case: logo-brand. Supporting style/reference image: the already approved Flour & Barrel fascia. Create its matching hanging pub-board raster variant. A single FLAT opaque horizontal 2.1:1 board with pure white padding around if needed, no hardware, scene, perspective or mockup. Keep the same bottle-green brush-painted enamel, worn fine brass border, ivory signwriter letterforms, wooden barrel and wheat-sheaf brand. Recompose rather than squeeze: compact lovely barrel/wheat crest centred above, main lettering 'Flour & Barrel' on two generously readable lines if needed, small caption 'VILLAGE INN' below. All typography safe inside border. Exact words only, no date or extra slogan. Gorgeous handmade raster richness, warm and charming. Full sign rectangular silhouette.", + "greengrocer": "Use case: logo-brand. A finished gorgeous RASTER identity sign for the existing village market's Greengrocer stall. A single flat front-facing painted market board, actual aspect 4:1, no scene, no hardware or mockup. Complete 4:1 band centred vertically across entire image width, pure white padding above/below. Exact main text 'GREENGROCER' in very readable ivory hand-lettered serif, dominant across centre. Rich leaf-green enamel, fine old-gold pinline, lovely compact painted apple, carrot and cabbage illustration toward the ends. Distinct colourful produce identity, polished British/Dutch miniature village charm, painterly texture, restrained wear, no tiny caption or prices. All letters and art contained inside thin border with safe margins. No extra text. No SVG or flat text substitute.", + "cheesemonger": "Use case: logo-brand. A finished gorgeous RASTER identity sign for the existing village market's Cheesemonger stall. A single flat front-facing painted market board, actual aspect 4:1, no scene, no hardware or mockup. Complete 4:1 band centred vertically across entire image width, pure white padding above/below. Exact main text 'CHEESEMONGER' in very readable warm ivory hand-lettered serif, dominant across centre. Rich midnight-blue enamel, fine old-gold pinline. Beautiful compact illustrated golden cheese wheel and wedge with cream rind toward one end; small meadow blossom accent toward the other. Distinct dairy identity, refined British/Dutch miniature village charm, painterly texture, restrained wear, no tiny caption or prices. All letters/art inside border with safe margins. No extra words, SVG or flat text substitute.", + "breadRolls": "Use case: logo-brand. Finished gorgeous RASTER identity sign for the existing village market stall 'Bread & Rolls', linked to the village's Riverside Bakers. One flat front-facing rectangular painted board, actual 4:1 aspect, full sign centred vertically across entire width, blank pure-white padding above and below. NO scene, perspective, mounting or mockup. Exact large title 'BREAD & ROLLS', no other text. Rich plum/burgundy enamel, warm ivory signwriter serif lettering with elegant ampersand, fine gold pinline. Beautiful compact painterly crusty loaf and golden bread-roll illustration, subtle wheat accents, title dominant and fully readable at miniature game scale. Rich tactile painted detail, moderate restrained patina, charming British/Dutch bakery craft. All letters and image inside complete border with safe margins. No prices, years, small slogans, SVG look or flat plain label.", + "harvest": "Use case: logo-brand. Finished gorgeous RASTER identity sign for the existing 'Farm Harvest' village market stall, whose produce includes pumpkins, grain jars and honey. One flat front-facing rectangular painted board, actual 4:1 aspect, full sign centred vertically across entire width, blank pure-white padding above and below. NO scene, perspective, mounting or mockup. Exact large title 'FARM HARVEST', no other text. Warm ochre/russet painted enamel, deep forest-green confident signwriter serif lettering edged subtly in ivory, fine warm cream/gold pinline. Lovely compact painterly pumpkin and wheat sheaf emblem at one end, tiny honey jar accent at the other. Strong legibility, distinctive sunny harvest identity and rich tactile raster brush detail, charming British/Dutch miniature village, restrained patina. All letters/image fully inside border with safe margins. No prices, years, slogan, SVG style or flat plain label." + }, + "sources": { + "innFascia": "/Users/nellwatson/.codex/generated_images/01a07e49-5424-7223-b6d0-d31c4a53b6b2/exec-46be95d6-ea66-43cb-9103-52e4bb167526.png", + "innHanging": "/Users/nellwatson/.codex/generated_images/01a07e49-5424-7223-b6d0-d31c4a53b6b2/exec-6dc20970-66e8-4d53-b32c-06003ee3c0f3.png", + "blacksmith": "/Users/nellwatson/.codex/generated_images/01a07e49-5424-7223-b6d0-d31c4a53b6b2/exec-daf01d32-908b-4518-853f-ae6dd4d00aea.png", + "school": "/Users/nellwatson/.codex/generated_images/01a07e49-5424-7223-b6d0-d31c4a53b6b2/exec-333c765b-0efc-464b-855f-33bc6015e854.png", + "townHall": "/Users/nellwatson/.codex/generated_images/01a07e49-5424-7223-b6d0-d31c4a53b6b2/exec-afac782d-2ce0-4ab5-a978-af28bc733637.png", + "greengrocer": "/Users/nellwatson/.codex/generated_images/01a07e49-5424-7223-b6d0-d31c4a53b6b2/exec-9cddbb6c-0c9c-40c9-967a-1c52a80f4132.png", + "cheesemonger": "/Users/nellwatson/.codex/generated_images/01a07e49-5424-7223-b6d0-d31c4a53b6b2/exec-e7ca48f9-8b81-4025-b919-1fac64eb095a.png", + "breadRolls": "/Users/nellwatson/.codex/generated_images/01a07e49-5424-7223-b6d0-d31c4a53b6b2/exec-70c58583-9ba1-4fa3-b371-457ac98f2818.png", + "harvest": "/Users/nellwatson/.codex/generated_images/01a07e49-5424-7223-b6d0-d31c4a53b6b2/exec-94db67c8-cdeb-4b3f-9088-94ea4e381daf.png" + } +} diff --git a/assets/source/graphics/village-signs/school-v1.png b/assets/source/graphics/village-signs/school-v1.png new file mode 100644 index 00000000..6ee25892 Binary files /dev/null and b/assets/source/graphics/village-signs/school-v1.png differ diff --git a/assets/source/graphics/village-signs/townHall-v1.png b/assets/source/graphics/village-signs/townHall-v1.png new file mode 100644 index 00000000..962eb528 Binary files /dev/null and b/assets/source/graphics/village-signs/townHall-v1.png differ diff --git a/public/textures/signage/PROVENANCE.json b/public/textures/signage/PROVENANCE.json index bf055c09..44f246c8 100644 --- a/public/textures/signage/PROVENANCE.json +++ b/public/textures/signage/PROVENANCE.json @@ -731,5 +731,200 @@ "textReview": "Exact lettering and full sign inspected on generated original; raster/runtime fit checked separately." } ] + }, + "villageBuildingAndMarketBrands": { + "date": "2026-10-18", + "method": "Nine separately generated illustrated raster sign faces; existing names and physical boards retained", + "assets": [ + { + "id": "innFascia", + "file": "brand-inn-fascia-v1.webp", + "source": "assets/source/graphics/village-signs/innFascia-v1.png", + "prompt": "Use case: logo-brand. Asset type: finished illustrated RASTER fascia texture for the existing Flour & Barrel village inn, a charming British/Dutch miniature village. Single front-facing horizontal sign, actual sign ratio 5.2:1. The complete artwork is one band centred vertically with blank pure white padding above and below if needed. Full width band, no scenery, no mockup, no perspective, no cast shadow outside sign. Rich bottle-green painted enamel, aged brass border and warm ivory signwriter typography, restrained wear. Distinctive beautiful brand illustration of a wooden beer barrel paired with a wheat sheaf, clear small silhouette at one end. Exact large title 'Flour & Barrel', exact smaller caption 'VILLAGE INN'. All lettering fully inside border, large easy-to-read traditional pub lettering, title dominant. Real painterly raster texture and brush detail, refined and cosy, not an SVG-looking symbol or plain text label. Do not add years, prices, extra words, corporate logos, beer glasses or people. Preserve straight edges and generous safe margins. Design belongs to the village's crafted painted service-sign family while owning its pub identity.", + "sourceWidth": 2022, + "sourceHeight": 778, + "crop": { + "left": 0, + "top": 161, + "width": 2022, + "height": 455 + }, + "width": 1280, + "height": 288, + "bytes": 92944, + "sha256": "2f2f04a557f1e89042ca7bd129e85a522545ebbde46b2ec177a97bebbb917bb9", + "sourceSha256": "9c837c7157ce9f5b38a8b8b29ff5f2fbfa7970e7b7097aa2874d6c3ffeca8ef3", + "method": "Built-in image_gen; mechanical blank vertical padding trim and aspect-preserving WebP preparation with installed sharp. No vector substitution or repainting.", + "textReview": "Exact existing title inspected on generated original; complete print contains no invented prices, dates or claims." + }, + { + "id": "innHanging", + "file": "brand-inn-v1.webp", + "source": "assets/source/graphics/village-signs/innHanging-v1.png", + "prompt": "Use case: logo-brand. Supporting style/reference image: the already approved Flour & Barrel fascia. Create its matching hanging pub-board raster variant. A single FLAT opaque horizontal 2.1:1 board with pure white padding around if needed, no hardware, scene, perspective or mockup. Keep the same bottle-green brush-painted enamel, worn fine brass border, ivory signwriter letterforms, wooden barrel and wheat-sheaf brand. Recompose rather than squeeze: compact lovely barrel/wheat crest centred above, main lettering 'Flour & Barrel' on two generously readable lines if needed, small caption 'VILLAGE INN' below. All typography safe inside border. Exact words only, no date or extra slogan. Gorgeous handmade raster richness, warm and charming. Full sign rectangular silhouette.", + "sourceWidth": 1815, + "sourceHeight": 866, + "crop": { + "left": 0, + "top": 31, + "width": 1815, + "height": 807 + }, + "width": 1024, + "height": 455, + "bytes": 128684, + "sha256": "28625e290b287a5589252a5117ec9adac71e0d19417ab4a253b49badcee271ac", + "sourceSha256": "cbfd889aea3d4c5d4db7d7f5d842d79f00d52be1260d714dbba3a2a741199738", + "method": "Built-in image_gen; mechanical blank vertical padding trim and aspect-preserving WebP preparation with installed sharp. No vector substitution or repainting.", + "textReview": "Exact existing title inspected on generated original; complete print contains no invented prices, dates or claims." + }, + { + "id": "blacksmith", + "file": "brand-blacksmith-v1.webp", + "source": "assets/source/graphics/village-signs/blacksmith-v1.png", + "prompt": "Use case: logo-brand. A single finished gorgeous RASTER sign texture, painted/enamel craft for a charming British/Dutch miniature village game. Front-facing flat artwork, no scene or mounted mockup, no perspective. The sign is an EXTREMELY NARROW horizontal rectangle, actual ratio 8:1. Centre the complete 8:1 art band vertically across the entire canvas width, with blank pure-white padding above and below. Nothing outside this band. Fit every letter and tiny emblem within the complete border with safe margins. At game scale this is a building fascia: very large readable title, distinctive small emblem, NO small subtitle, NO dates, prices or additional words. Beautiful textured brush detail, moderate restrained patina, crisp hierarchy, professionally crafted, not a plain SVG label. Exact text 'BLACKSMITH'. Warm ivory confident slightly slabbed artisan lettering on charcoal/blue-black enamel. Distinctive compact emblem of a steel anvil and copper horseshoe, a restrained ember-orange flourish. Thin worn bronze rule. Keep anvil recognisable, wheat and barrels absent. Title occupies most width.", + "sourceWidth": 2172, + "sourceHeight": 724, + "crop": { + "left": 0, + "top": 223, + "width": 2172, + "height": 278 + }, + "width": 1280, + "height": 164, + "bytes": 55966, + "sha256": "0987d8a17b522decba2d1176e40ceadee5f24620511e5a015e31c5b58980e6fb", + "sourceSha256": "e9864b3b5c4a328df405fe71f8c5b8eff7a5d05653e4e98646083d4d45544048", + "method": "Built-in image_gen; mechanical blank vertical padding trim and aspect-preserving WebP preparation with installed sharp. No vector substitution or repainting.", + "textReview": "Exact existing title inspected on generated original; complete print contains no invented prices, dates or claims." + }, + { + "id": "school", + "file": "brand-school-v1.webp", + "source": "assets/source/graphics/village-signs/school-v1.png", + "prompt": "Use case: logo-brand. A single finished gorgeous RASTER sign texture, painted/enamel craft for a charming British/Dutch miniature village game. Front-facing flat artwork, no scene or mounted mockup, no perspective. The sign is an EXTREMELY NARROW horizontal rectangle, actual ratio 8:1. Centre the complete 8:1 art band vertically across the entire canvas width, with blank pure-white padding above and below. Nothing outside this band. Fit every letter and tiny emblem within the complete border with safe margins. At game scale this is a building fascia: very large readable title, distinctive small emblem, NO small subtitle, NO dates, prices or additional words. Beautiful textured brush detail, moderate restrained patina, crisp hierarchy, professionally crafted, not a plain SVG label. Exact text 'VILLAGE SCHOOL'. Warm ivory friendly scholarly serif lettering on deep slate-blue enamel. A small beautiful open-book and oak-leaf crest in old gold with a muted sky-blue accent. Welcoming, clear, refined civic craft, not a heraldic royal crest. No motto, alphabet, tiny secondary words or other text.", + "sourceWidth": 2172, + "sourceHeight": 724, + "crop": { + "left": 0, + "top": 221, + "width": 2172, + "height": 277 + }, + "width": 1280, + "height": 163, + "bytes": 61654, + "sha256": "ec450a497d7625a2cd5f0ac6f3c3a15972764622b458ccc6f671b26a12f75d29", + "sourceSha256": "2c63d7a1c2630df491f653173787eed1a0c4607889ee9007b980d34c5600d1b8", + "method": "Built-in image_gen; mechanical blank vertical padding trim and aspect-preserving WebP preparation with installed sharp. No vector substitution or repainting.", + "textReview": "Exact existing title inspected on generated original; complete print contains no invented prices, dates or claims." + }, + { + "id": "townHall", + "file": "brand-town-hall-v1.webp", + "source": "assets/source/graphics/village-signs/townHall-v1.png", + "prompt": "Use case: logo-brand. A single finished gorgeous RASTER sign texture, painted/enamel craft for a charming British/Dutch miniature village game. Front-facing flat artwork, no scene or mounted mockup, no perspective. The sign is an EXTREMELY NARROW horizontal rectangle, actual ratio 8:1. Centre the complete 8:1 art band vertically across the entire canvas width, with blank pure-white padding above and below. Nothing outside this band. Fit every letter and tiny emblem within the complete border with safe margins. At game scale this is a building fascia: very large readable title, distinctive small emblem, NO small subtitle, NO dates, prices or additional words. Beautiful textured brush detail, moderate restrained patina, crisp hierarchy, professionally crafted, not a plain SVG label. Exact text 'TOWN HALL'. Elegant large ivory civic Roman-capital signwriting on deep teal/slate enamel. Distinctive small village civic emblem, a tiny stone arch and golden wheat fan, beautiful but restrained copper and gold detailing. Balanced formal spacing, refined low-relief painted/engraved texture. No coats of arms from real places, no dates or motto.", + "sourceWidth": 2172, + "sourceHeight": 724, + "crop": { + "left": 0, + "top": 217, + "width": 2172, + "height": 283 + }, + "width": 1280, + "height": 167, + "bytes": 80006, + "sha256": "5b5971c6a5c4e78f859cf6f26da6ef55643d86199d70345a014c5f22227834ac", + "sourceSha256": "1b14286b8fa416f960b347546068d9341ed4e2ecb4695aaaa65bcfc5662489e9", + "method": "Built-in image_gen; mechanical blank vertical padding trim and aspect-preserving WebP preparation with installed sharp. No vector substitution or repainting.", + "textReview": "Exact existing title inspected on generated original; complete print contains no invented prices, dates or claims." + }, + { + "id": "greengrocer", + "file": "brand-market-greengrocer-v1.webp", + "source": "assets/source/graphics/village-signs/greengrocer-v1.png", + "prompt": "Use case: logo-brand. A finished gorgeous RASTER identity sign for the existing village market's Greengrocer stall. A single flat front-facing painted market board, actual aspect 4:1, no scene, no hardware or mockup. Complete 4:1 band centred vertically across entire image width, pure white padding above/below. Exact main text 'GREENGROCER' in very readable ivory hand-lettered serif, dominant across centre. Rich leaf-green enamel, fine old-gold pinline, lovely compact painted apple, carrot and cabbage illustration toward the ends. Distinct colourful produce identity, polished British/Dutch miniature village charm, painterly texture, restrained wear, no tiny caption or prices. All letters and art contained inside thin border with safe margins. No extra text. No SVG or flat text substitute.", + "sourceWidth": 2172, + "sourceHeight": 724, + "crop": { + "left": 0, + "top": 164, + "width": 2172, + "height": 391 + }, + "width": 1024, + "height": 184, + "bytes": 52892, + "sha256": "682ac30ccc73da2cb94282cccb4491d2d67eeee3027dbd2025a2c0d0e7be5794", + "sourceSha256": "ab1a3a832ef784f1d2ca1f240faf957d5990db569bcd70d2558e4b946947c9cc", + "method": "Built-in image_gen; mechanical blank vertical padding trim and aspect-preserving WebP preparation with installed sharp. No vector substitution or repainting.", + "textReview": "Exact existing title inspected on generated original; complete print contains no invented prices, dates or claims." + }, + { + "id": "cheesemonger", + "file": "brand-market-cheesemonger-v1.webp", + "source": "assets/source/graphics/village-signs/cheesemonger-v1.png", + "prompt": "Use case: logo-brand. A finished gorgeous RASTER identity sign for the existing village market's Cheesemonger stall. A single flat front-facing painted market board, actual aspect 4:1, no scene, no hardware or mockup. Complete 4:1 band centred vertically across entire image width, pure white padding above/below. Exact main text 'CHEESEMONGER' in very readable warm ivory hand-lettered serif, dominant across centre. Rich midnight-blue enamel, fine old-gold pinline. Beautiful compact illustrated golden cheese wheel and wedge with cream rind toward one end; small meadow blossom accent toward the other. Distinct dairy identity, refined British/Dutch miniature village charm, painterly texture, restrained wear, no tiny caption or prices. All letters/art inside border with safe margins. No extra words, SVG or flat text substitute.", + "sourceWidth": 2172, + "sourceHeight": 724, + "crop": { + "left": 0, + "top": 169, + "width": 2172, + "height": 364 + }, + "width": 1024, + "height": 172, + "bytes": 50956, + "sha256": "9e8ded93428b2d1ee650d52426abada1491b50f597c02bcad8d0ec67f5f6eb03", + "sourceSha256": "f37f78645bdae004ac453f025cc755f85a86a8dea61691ce00a8d6ec32b31511", + "method": "Built-in image_gen; mechanical blank vertical padding trim and aspect-preserving WebP preparation with installed sharp. No vector substitution or repainting.", + "textReview": "Exact existing title inspected on generated original; complete print contains no invented prices, dates or claims." + }, + { + "id": "breadRolls", + "file": "brand-market-bread-rolls-v1.webp", + "source": "assets/source/graphics/village-signs/breadRolls-v1.png", + "prompt": "Use case: logo-brand. Finished gorgeous RASTER identity sign for the existing village market stall 'Bread & Rolls', linked to the village's Riverside Bakers. One flat front-facing rectangular painted board, actual 4:1 aspect, full sign centred vertically across entire width, blank pure-white padding above and below. NO scene, perspective, mounting or mockup. Exact large title 'BREAD & ROLLS', no other text. Rich plum/burgundy enamel, warm ivory signwriter serif lettering with elegant ampersand, fine gold pinline. Beautiful compact painterly crusty loaf and golden bread-roll illustration, subtle wheat accents, title dominant and fully readable at miniature game scale. Rich tactile painted detail, moderate restrained patina, charming British/Dutch bakery craft. All letters and image inside complete border with safe margins. No prices, years, small slogans, SVG look or flat plain label.", + "sourceWidth": 2172, + "sourceHeight": 724, + "crop": { + "left": 0, + "top": 130, + "width": 2172, + "height": 466 + }, + "width": 1024, + "height": 220, + "bytes": 65254, + "sha256": "68dd9fda4010ae7fb0b508b19ae485123c5a190853490b834a1f38ea9d0c4a72", + "sourceSha256": "12115d9ff4c36cc2f6a77d69818da95d18e004fca6cffa3ab4498b6862ee4fdd", + "method": "Built-in image_gen; mechanical blank vertical padding trim and aspect-preserving WebP preparation with installed sharp. No vector substitution or repainting.", + "textReview": "Exact existing title inspected on generated original; complete print contains no invented prices, dates or claims." + }, + { + "id": "harvest", + "file": "brand-market-harvest-v1.webp", + "source": "assets/source/graphics/village-signs/harvest-v1.png", + "prompt": "Use case: logo-brand. Finished gorgeous RASTER identity sign for the existing 'Farm Harvest' village market stall, whose produce includes pumpkins, grain jars and honey. One flat front-facing rectangular painted board, actual 4:1 aspect, full sign centred vertically across entire width, blank pure-white padding above and below. NO scene, perspective, mounting or mockup. Exact large title 'FARM HARVEST', no other text. Warm ochre/russet painted enamel, deep forest-green confident signwriter serif lettering edged subtly in ivory, fine warm cream/gold pinline. Lovely compact painterly pumpkin and wheat sheaf emblem at one end, tiny honey jar accent at the other. Strong legibility, distinctive sunny harvest identity and rich tactile raster brush detail, charming British/Dutch miniature village, restrained patina. All letters/image fully inside border with safe margins. No prices, years, slogan, SVG style or flat plain label.", + "sourceWidth": 2172, + "sourceHeight": 724, + "crop": { + "left": 0, + "top": 138, + "width": 2172, + "height": 448 + }, + "width": 1024, + "height": 211, + "bytes": 64622, + "sha256": "70ff8c0265f88ab39f4736f5f1374237e392a0042360e1c0a316709be2b43a79", + "sourceSha256": "1458f71d3c5281a315a7bc2298838acd1250eb51803d9fa28d82d3ed63f8555e", + "method": "Built-in image_gen; mechanical blank vertical padding trim and aspect-preserving WebP preparation with installed sharp. No vector substitution or repainting.", + "textReview": "Exact existing title inspected on generated original; complete print contains no invented prices, dates or claims." + } + ] } } diff --git a/public/textures/signage/brand-blacksmith-v1.webp b/public/textures/signage/brand-blacksmith-v1.webp new file mode 100644 index 00000000..0ceeb0ac Binary files /dev/null and b/public/textures/signage/brand-blacksmith-v1.webp differ diff --git a/public/textures/signage/brand-inn-fascia-v1.webp b/public/textures/signage/brand-inn-fascia-v1.webp new file mode 100644 index 00000000..9f94c6ff Binary files /dev/null and b/public/textures/signage/brand-inn-fascia-v1.webp differ diff --git a/public/textures/signage/brand-inn-v1.webp b/public/textures/signage/brand-inn-v1.webp new file mode 100644 index 00000000..56b8115c Binary files /dev/null and b/public/textures/signage/brand-inn-v1.webp differ diff --git a/public/textures/signage/brand-market-bread-rolls-v1.webp b/public/textures/signage/brand-market-bread-rolls-v1.webp new file mode 100644 index 00000000..569d9075 Binary files /dev/null and b/public/textures/signage/brand-market-bread-rolls-v1.webp differ diff --git a/public/textures/signage/brand-market-cheesemonger-v1.webp b/public/textures/signage/brand-market-cheesemonger-v1.webp new file mode 100644 index 00000000..21356755 Binary files /dev/null and b/public/textures/signage/brand-market-cheesemonger-v1.webp differ diff --git a/public/textures/signage/brand-market-greengrocer-v1.webp b/public/textures/signage/brand-market-greengrocer-v1.webp new file mode 100644 index 00000000..309f4673 Binary files /dev/null and b/public/textures/signage/brand-market-greengrocer-v1.webp differ diff --git a/public/textures/signage/brand-market-harvest-v1.webp b/public/textures/signage/brand-market-harvest-v1.webp new file mode 100644 index 00000000..c5fd4e20 Binary files /dev/null and b/public/textures/signage/brand-market-harvest-v1.webp differ diff --git a/public/textures/signage/brand-school-v1.webp b/public/textures/signage/brand-school-v1.webp new file mode 100644 index 00000000..cc82e32c Binary files /dev/null and b/public/textures/signage/brand-school-v1.webp differ diff --git a/public/textures/signage/brand-town-hall-v1.webp b/public/textures/signage/brand-town-hall-v1.webp new file mode 100644 index 00000000..a6511af4 Binary files /dev/null and b/public/textures/signage/brand-town-hall-v1.webp differ diff --git a/src/components/VillageArea.test.ts b/src/components/VillageArea.test.ts index cd6ea29f..2c4c2e92 100644 --- a/src/components/VillageArea.test.ts +++ b/src/components/VillageArea.test.ts @@ -12,6 +12,7 @@ import { AUTHORED_MARKET_TRIM_VARIANTS, MARKET_CANVAS_COLOURS, MARKET_TRADE_NAMES, + MARKET_TRADE_BRANDS, MARKET_TRADE_PAINT, createMarketCanopyGeometry, MARKET_TRAY_FLOOR, @@ -46,6 +47,7 @@ import { TOWN_HALL_LENS_GEOMETRY, } from './VillageArea'; import { SITE_LAYOUT, landmarkLocalToWorld } from '../constants/siteLayout'; +import { BUSINESS_BRANDS } from './scenery/HeritageSignage'; import { CIVIC_LAMPS, CIVIC_LIGHT_COLOR } from '../constants/civicSquareLighting'; vi.mock('../utils/critterAudio', () => ({ playCritterSound: vi.fn() })); @@ -326,9 +328,13 @@ describe('measured village and farm construction trim', () => { source.indexOf('const MarketStall ='), source.indexOf('MarketStall.displayName =') ); - expect(stall).toContain('surface="painted"'); - expect(stall).toContain('castShadow={false}'); - expect(stall).toContain('MARKET_TRADE_NAMES[dressing]'); + expect(MARKET_TRADE_BRANDS.map((id) => BUSINESS_BRANDS[id].name)).toEqual(MARKET_TRADE_NAMES); + expect(MARKET_TRADE_PAINT.height).toBeLessThan(1.104 - 0.9297); + expect(stall).toContain('brand={MARKET_TRADE_BRANDS[dressing]}'); + expect(stall).toContain('position={MARKET_TRADE_PAINT.position}'); + expect(stall).toContain('rotation={MARKET_TRADE_PAINT.rotation}'); + expect(stall).toContain('backlit={false}'); + expect(stall).not.toContain(' - + } /> - + @@ -1315,7 +1330,14 @@ const School = React.memo<{ } /> - + )); @@ -1948,17 +1970,20 @@ const MarketStall = React.memo<{ }> - - {MARKET_TRADE_NAMES[dressing] ?? 'Market'} - + {MARKET_TRADE_BRANDS[dressing] && ( + + + + )} {/* INSIDE the yawed group, so the goods turn with the counter they stand on. Outside it they would slide off the table by up to 0.1 m at the @@ -3092,7 +3117,14 @@ const Forge = React.memo<{ position: [number, number, number]; rotation?: number } /> - + diff --git a/src/components/scenery/AuthoredPropTrim.tsx b/src/components/scenery/AuthoredPropTrim.tsx index b1e88b16..8afb26ad 100644 --- a/src/components/scenery/AuthoredPropTrim.tsx +++ b/src/components/scenery/AuthoredPropTrim.tsx @@ -563,6 +563,13 @@ AuthoredPropTrim.displayName = 'AuthoredPropTrim'; * earned inventory. Working if each actual pitch keeps its own trade name. */ export const MARKET_TRADE_NAMES = ['Greengrocer', 'Cheesemonger', 'Bread & Rolls', 'Farm Harvest']; +// Working if the raster identity follows the actual stock dressing, one to one. +export const MARKET_TRADE_BRANDS = [ + 'greengrocer', + 'cheesemonger', + 'breadRolls', + 'harvest', +] as const; // Measured delivered central tray, front +X: x=.5134, y=.9297..1.104, z=+/- .322. // One millimetre of paint stand-off and clear margins retain the source board. export const MARKET_TRADE_PAINT = { @@ -570,6 +577,7 @@ export const MARKET_TRADE_PAINT = { rotation: [0, Math.PI / 2, 0] as [number, number, number], fontSize: 0.061, maxWidth: 0.59, + height: 0.15, color: '#243e37', outlineWidth: 0.0012, }; diff --git a/src/components/scenery/HeritageSignage.test.ts b/src/components/scenery/HeritageSignage.test.ts index bb8be20c..9cc5caa4 100644 --- a/src/components/scenery/HeritageSignage.test.ts +++ b/src/components/scenery/HeritageSignage.test.ts @@ -410,8 +410,16 @@ describe('distinct world business brands', () => { 'Electrical', 'Security', 'GRAIN CO', + 'Flour & Barrel', + 'Blacksmith', + 'Village School', + 'Town Hall', + 'Greengrocer', + 'Cheesemonger', + 'Bread & Rolls', + 'Farm Harvest', ]); - expect(new Set(Object.values(BUSINESS_BRANDS).map((brand) => brand.primary)).size).toBe(11); + expect(new Set(Object.values(BUSINESS_BRANDS).map((brand) => brand.primary)).size).toBe(19); expect(transportBrandForCompany('FLOUR EXPRESS')).toBe('flourExpress'); expect(transportBrandForCompany('GRAIN CO')).toBe('grainCo'); for (const name of ['', 'OTHER CARRIER', 'MillOS', 'Grain Co']) @@ -425,6 +433,7 @@ describe('distinct world business brands', () => { ...assets, ...provenance.stationPosterAndAppBrand.assets, ...provenance.serviceBuildingBrands.assets, + ...provenance.villageBuildingAndMarketBrands.assets, ]; expect(assets).toHaveLength(13); let total = 0; @@ -593,3 +602,66 @@ describe('illustrated service building rasters', () => { expect(exterior).not.toMatch(/>\s*(?:CAFE|SECURITY)\s*<\//); }); }); + +describe('illustrated village and market identities', () => { + it('ships nine compact opaque rasters with retained originals and verified provenance', async () => { + const assets = JSON.parse(readFileSync('public/textures/signage/PROVENANCE.json', 'utf8')) + .villageBuildingAndMarketBrands.assets; + expect(assets.map((a: { id: string }) => a.id)).toEqual([ + 'innFascia', + 'innHanging', + 'blacksmith', + 'school', + 'townHall', + 'greengrocer', + 'cheesemonger', + 'breadRolls', + 'harvest', + ]); + let total = 0; + for (const a of assets) { + const bytes = readFileSync(`public/textures/signage/${a.file}`); + expect(createHash('sha256').update(bytes).digest('hex')).toBe(a.sha256); + expect(createHash('sha256').update(readFileSync(a.source)).digest('hex')).toBe( + a.sourceSha256 + ); + const image = await sharp(bytes).metadata(); + expect([image.width, image.height]).toEqual([a.width, a.height]); + expect(image.hasAlpha).toBe(false); + expect(image.width).toBeLessThanOrEqual(1280); + expect(bytes.length).toBeLessThan(145000); + total += bytes.length; + } + expect(total).toBeLessThan(750000); + }); + + it('fits complete illustrated faces in the retained boards without duplicating their captions', () => { + const signs = readFileSync('src/components/scenery/VillageSignage.tsx', 'utf8'); + const village = readFileSync('src/components/VillageArea.tsx', 'utf8'); + expect(signs).toContain('caption && !brandFace'); + expect(signs).toContain("variant={brandFace ?? 'fascia'}"); + expect(signs).toContain('backlit={illuminated}'); + expect(signs).toContain('brandFace="primary"'); + for (const brand of ['inn', 'blacksmith', 'school', 'townHall']) + expect(village).toMatch( + new RegExp(`]*brand="${brand}"[^>]*brandFace="fascia"`) + ); + const assets = JSON.parse(readFileSync('public/textures/signage/PROVENANCE.json', 'utf8')) + .villageBuildingAndMarketBrands.assets; + const seats: Record = { + innFascia: [3.26, 0.62], + innHanging: [1.62, 0.77], + blacksmith: [3.18, 0.35], + school: [4.24, 0.54], + townHall: [4.74, 0.52], + }; + for (const a of assets) { + const [w, h] = seats[a.id] ?? [0.59, 0.15]; + const [pw, ph] = heritagePrintSize(w, h, a.width, a.height); + expect(pw / ph).toBeCloseTo(a.width / a.height, 8); + expect(pw).toBeLessThanOrEqual(w); + expect(ph).toBeLessThanOrEqual(h + 1e-12); + expect(pw).toBeGreaterThan(w * 0.8); + } + }); +}); diff --git a/src/components/scenery/HeritageSignage.tsx b/src/components/scenery/HeritageSignage.tsx index f438daf7..a5315735 100644 --- a/src/components/scenery/HeritageSignage.tsx +++ b/src/components/scenery/HeritageSignage.tsx @@ -58,7 +58,7 @@ export const HERITAGE_PRINT_ART = { export type HeritagePrintKind = keyof typeof HERITAGE_PRINT_ART; /** Each world business owns its name, symbol and application field. - * Working if all seven names keep distinct raster identities on their old seats. + * Working if each name keeps its distinct raster identity on the existing sign seat. */ export const BUSINESS_BRANDS = { dino: { @@ -128,6 +128,54 @@ export const BUSINESS_BRANDS = { primary: `${import.meta.env.BASE_URL}textures/signage/brand-grain-co-v1.webp`, fascia: `${import.meta.env.BASE_URL}textures/signage/brand-grain-co-v1.webp`, }, + inn: { + name: 'Flour & Barrel', + field: '#143c2b', + primary: `${import.meta.env.BASE_URL}textures/signage/brand-inn-v1.webp`, + fascia: `${import.meta.env.BASE_URL}textures/signage/brand-inn-fascia-v1.webp`, + }, + blacksmith: { + name: 'Blacksmith', + field: '#25343c', + primary: `${import.meta.env.BASE_URL}textures/signage/brand-blacksmith-v1.webp`, + fascia: `${import.meta.env.BASE_URL}textures/signage/brand-blacksmith-v1.webp`, + }, + school: { + name: 'Village School', + field: '#263f55', + primary: `${import.meta.env.BASE_URL}textures/signage/brand-school-v1.webp`, + fascia: `${import.meta.env.BASE_URL}textures/signage/brand-school-v1.webp`, + }, + townHall: { + name: 'Town Hall', + field: '#173c45', + primary: `${import.meta.env.BASE_URL}textures/signage/brand-town-hall-v1.webp`, + fascia: `${import.meta.env.BASE_URL}textures/signage/brand-town-hall-v1.webp`, + }, + greengrocer: { + name: 'Greengrocer', + field: '#285136', + primary: `${import.meta.env.BASE_URL}textures/signage/brand-market-greengrocer-v1.webp`, + fascia: `${import.meta.env.BASE_URL}textures/signage/brand-market-greengrocer-v1.webp`, + }, + cheesemonger: { + name: 'Cheesemonger', + field: '#1d344d', + primary: `${import.meta.env.BASE_URL}textures/signage/brand-market-cheesemonger-v1.webp`, + fascia: `${import.meta.env.BASE_URL}textures/signage/brand-market-cheesemonger-v1.webp`, + }, + breadRolls: { + name: 'Bread & Rolls', + field: '#602b32', + primary: `${import.meta.env.BASE_URL}textures/signage/brand-market-bread-rolls-v1.webp`, + fascia: `${import.meta.env.BASE_URL}textures/signage/brand-market-bread-rolls-v1.webp`, + }, + harvest: { + name: 'Farm Harvest', + field: '#c99031', + primary: `${import.meta.env.BASE_URL}textures/signage/brand-market-harvest-v1.webp`, + fascia: `${import.meta.env.BASE_URL}textures/signage/brand-market-harvest-v1.webp`, + }, } as const; export type BusinessBrandKind = keyof typeof BUSINESS_BRANDS; diff --git a/src/components/scenery/VillageSignage.tsx b/src/components/scenery/VillageSignage.tsx index fce623ce..a897650b 100644 --- a/src/components/scenery/VillageSignage.tsx +++ b/src/components/scenery/VillageSignage.tsx @@ -30,6 +30,7 @@ export function VillageNameboard({ illuminated = false, art, brand, + brandFace, }: { title: string; caption?: string; @@ -40,6 +41,8 @@ export function VillageNameboard({ illuminated?: boolean; art?: HeritagePrintKind; brand?: BusinessBrandKind; + /** Complete illustrated sign replaces lettering/caption within the existing frame. */ + brandFace?: 'primary' | 'fascia'; }) { const textWidth = width - (crest ? height * 1.5 : 0.42); const textX = crest ? height * 0.45 : 0; @@ -67,24 +70,26 @@ export function VillageNameboard({ - - - - + {!brandFace && ( + + + + + )} ))} {brand ? ( <> - {caption && ( + {caption && !brandFace && (