feat: Implement RuntimeDefsModule for managing shared runtime definitions and update related components

This commit is contained in:
Azgaar 2026-03-13 12:18:27 +01:00
parent f928f9d101
commit 73d6d664fc
14 changed files with 126 additions and 43 deletions

View file

@ -1,6 +1,6 @@
# Story 1.6: Move Shared Defs Resources to the Dedicated Host
Status: ready-for-dev
Status: review
<!-- Note: Validation is optional. Run validate-create-story for quality check before dev-story. -->
@ -17,19 +17,19 @@ so that split surfaces can keep using stable IDs for filters, masks, symbols, ma
## Tasks / Subtasks
- [ ] Establish one runtime defs owner.
- [ ] Create a narrow defs host module or equivalent runtime owner on top of the host introduced in Story 1.1.
- [ ] Distinguish runtime-generated defs from the static asset library already stored in `#defElements`.
- [ ] Migrate the current runtime writers for shared defs-backed resources.
- [ ] Move feature paths and masks now written through `defs.select(...)` to the dedicated host.
- [ ] Move text path registration used by state labels to the dedicated host.
- [ ] Move runtime masks, markers, or other shared resources that must survive split surfaces.
- [ ] Preserve stable IDs and references.
- [ ] Keep existing IDs intact wherever possible so current `url(#id)` and `href="#id"` references continue to resolve.
- [ ] Avoid duplicating identical resources into per-layer surfaces.
- [ ] Keep export work out of scope for this story.
- [ ] Do not redesign the export assembler here.
- [ ] Only make the runtime defs placement compatible with later export assembly.
- [x] Establish one runtime defs owner.
- [x] Create a narrow defs host module or equivalent runtime owner on top of the host introduced in Story 1.1.
- [x] Distinguish runtime-generated defs from the static asset library already stored in `#defElements`.
- [x] Migrate the current runtime writers for shared defs-backed resources.
- [x] Move feature paths and masks now written through `defs.select(...)` to the dedicated host.
- [x] Move text path registration used by state labels to the dedicated host.
- [x] Move runtime masks, markers, or other shared resources that must survive split surfaces.
- [x] Preserve stable IDs and references.
- [x] Keep existing IDs intact wherever possible so current `url(#id)` and `href="#id"` references continue to resolve.
- [x] Avoid duplicating identical resources into per-layer surfaces.
- [x] Keep export work out of scope for this story.
- [x] Do not redesign the export assembler here.
- [x] Only make the runtime defs placement compatible with later export assembly.
- [ ] Perform manual smoke verification.
- [ ] Filters, masks, symbols, markers, patterns, and text-path-backed labels still render.
- [ ] Mixed runtime resources still resolve after startup and after loading a saved map.
@ -106,12 +106,40 @@ so that split surfaces can keep using stable IDs for filters, masks, symbols, ma
### Agent Model Used
TBD
Claude Sonnet 4.6
### Debug Log References
None.
### Completion Notes List
- Story context prepared on 2026-03-13.
- Created `src/modules/defs.ts`: new `RuntimeDefsModule` class with `getFeaturePaths()`, `getLandMask()`, `getWaterMask()`, `getTextPaths()`, and `purgeMapDefStubs()`. Instance assigned to `window.RuntimeDefs`.
- Removed `#featurePaths`, `#textPaths`, `#land`, `#water` from `#deftemp` in `src/index.html`; `#fog`, `#statePaths`, `#defs-emblems` remain in `#deftemp`.
- `purgeMapDefStubs()` is called in `load.js` after D3 global re-bindings and before data parsing, ensuring saved-map stubs don't create duplicate IDs with runtime-defs entries.
- `auto-update.js` v1.1 and v1.106 migration blocks updated to use `RuntimeDefs` instead of `defs.select` for the migrated elements.
- Three legacy UI editors (`coastline-editor.js`, `lakes-editor.js`) now use `d3.select("#featurePaths > ...")` (document-scoped); `heightmap-editor.js` uses `RuntimeDefs.get*()` directly. `tools.js` burg-label writer updated to `RuntimeDefs.getTextPaths()`.
- `#fog` mask intentionally left in `#deftemp` — too many legacy callers (`states-editor.js`, `provinces-editor.js`) depend on `defs.select("#fog ...")`.
- TypeScript: `tsc --noEmit` passes with zero errors.
### File List
- `src/modules/defs.ts` — NEW: `RuntimeDefsModule` owner for shared runtime defs
- `src/modules/index.ts` — added `import "./defs"` after `import "./scene"`
- `src/types/global.ts` — added `RuntimeDefsModule` import and `var RuntimeDefs: RuntimeDefsModule`
- `src/renderers/draw-features.ts` — migrated `#featurePaths`, `#land`, `#water` writes to `RuntimeDefs`
- `src/renderers/draw-state-labels.ts` — migrated `#textPaths` access to `RuntimeDefs.getTextPaths()`
- `src/index.html` — removed `<g id="featurePaths">`, `<g id="textPaths">`, `<mask id="land">`, `<mask id="water">` from `#deftemp`
- `public/modules/io/load.js` — added `RuntimeDefs.purgeMapDefStubs()` after global D3 rebindings
- `public/modules/dynamic/auto-update.js` — fixed v1.1 and v1.106 migration to use `RuntimeDefs`
- `public/modules/ui/coastline-editor.js``defs.select("#featurePaths > ...")``d3.select(...)`
- `public/modules/ui/lakes-editor.js``defs.select("#featurePaths > ...")``d3.select(...)`
- `public/modules/ui/heightmap-editor.js``defs.selectAll`/`defs.select``RuntimeDefs.get*()`
- `public/modules/ui/tools.js``defs.select("#textPaths")``RuntimeDefs.getTextPaths()`
### Change Log
| Date | Description |
| ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 2026-03-13 | Initial implementation of Story 1.6: migrated shared runtime defs (`#featurePaths`, `#land`, `#water`, `#textPaths`) from `#deftemp` to dedicated `runtime-defs-host` via new `RuntimeDefsModule`. |

View file

@ -41,12 +41,12 @@ story_location: /Users/azgaar/Fantasy-Map-Generator/_bmad-output/implementation-
development_status:
epic-1: in-progress
1-1-bootstrap-scene-container-and-defs-host: in-progress
1-2-add-scene-module-for-shared-camera-state: in-progress
1-3-add-layers-registry-as-the-ordering-source-of-truth: in-progress
1-4-add-layer-surface-lifecycle-ownership: done
1-5-add-compatibility-lookups-for-legacy-single-svg-callers: ready-for-dev
1-6-move-shared-defs-resources-to-the-dedicated-host: ready-for-dev
1-1-bootstrap-scene-container-and-defs-host: done
1-2-add-scene-module-for-shared-camera-state: review
1-3-add-layers-registry-as-the-ordering-source-of-truth: review
1-4-add-layer-surface-lifecycle-ownership: review
1-5-add-compatibility-lookups-for-legacy-single-svg-callers: review
1-6-move-shared-defs-resources-to-the-dedicated-host: review
epic-1-retrospective: optional
epic-2: backlog