@aceshooting/lyra-ui 28.1.6 → 29.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/CHANGELOG.md +10 -180
  2. package/README.md +10 -2
  3. package/dist/components/charts/chart/chart.class.js +2 -2
  4. package/dist/components/data/data-grid/data-grid.class.js +1 -1
  5. package/dist/components/data/table/table.class.js +2 -2
  6. package/dist/components/forms/combobox/option.class.js +1 -1
  7. package/dist/components/forms/select/select.class.js +1 -1
  8. package/dist/components/media/map/map-loader.d.ts +9 -1
  9. package/dist/components/media/map/map-loader.js +1 -1
  10. package/dist/components/media/map/map.class.d.ts +20 -11
  11. package/dist/components/media/map/map.class.js +4 -4
  12. package/dist/components/retrieval/graph/graph-model.d.ts +10 -1
  13. package/dist/components/retrieval/graph/graph-spatial-controller.js +30 -0
  14. package/dist/components/retrieval/graph/graph-spatial.js +1 -0
  15. package/dist/components/retrieval/graph/graph.class.d.ts +45 -6
  16. package/dist/components/retrieval/graph/graph.class.js +2 -2
  17. package/dist/components/retrieval/graph/graph.styles.js +1 -1
  18. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts +22 -5
  19. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js +6 -2
  20. package/dist/events.d.ts +10 -5
  21. package/dist/framework-types.d.ts +1 -1
  22. package/dist/internal/accessible-text-controller.js +1 -1
  23. package/dist/internal/autoloader-manifest.js +1 -1
  24. package/dist/internal/collection-source-tracker.js +1 -0
  25. package/dist/internal/default-strings/media.generated.js +1 -1
  26. package/dist/internal/default-strings/retrieval.generated.js +1 -1
  27. package/dist/internal/localization-types.d.ts +1 -1
  28. package/dist/internal/localization.js +1 -1
  29. package/dist/internal/package-metadata.js +1 -1
  30. package/dist/internal/positioner.js +1 -1
  31. package/dist/lyra.d.ts +1 -1
  32. package/llms/components/lr-geojson-viewer.md +1 -1
  33. package/llms/components/lr-graph.md +78 -8
  34. package/llms/components/lr-knowledge-graph-explorer.md +15 -2
  35. package/llms/components/lr-map.md +60 -25
  36. package/llms/index.md +1 -1
  37. package/llms/peers.md +4 -3
  38. package/llms/shared/ai-and-peers.md +4 -3
  39. package/llms/shared/imports-and-registration.md +1 -1
  40. package/llms/shared.md +5 -4
  41. package/locales.json +138 -138
  42. package/package.json +12 -6
  43. package/registrations.json +1 -1
  44. package/skills/lyra-ui/SKILL.md +8 -3
@@ -8,7 +8,7 @@
8
8
  - **Status** `stable` since `4.0.0` — see the maturity and deprecation policy in `llms/shared.md`
9
9
  - **Release history** [CHANGELOG.md](../../CHANGELOG.md); family-wide breaking-change summaries: [media](https://github.com/aceshooting/lyra-ui/blob/main/packages/lyra-ui/llms/media.md)
10
10
  - **Deprecations** none
11
- - **Optional peers** `maplibre-gl` — see `llms/peers.md`
11
+ - **Optional peers** `@aceshooting/lyra-map`, `maplibre-gl` — see `llms/peers.md`
12
12
  - **Themeable via** 26 parts, 8 custom properties — see this component's own `@csspart`/`@cssprop` list below
13
13
  - **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
14
14
 
@@ -16,7 +16,8 @@
16
16
 
17
17
  ## `lr-map`
18
18
 
19
- A `maplibre-gl` wrapper with a declarative legend, a single choropleth GeoJSON fill layer, markers,
19
+ A MapLibre-compatible wrapper using the optional `@aceshooting/lyra-map` modular engine by default,
20
+ with a declarative legend, a single choropleth GeoJSON fill layer, markers,
20
21
  and additive `dataLayers` — plain GeoJSON, natively clustered points, or a heatmap density surface —
21
22
  plus a peer-neutral `map` getter for common imperative operations. Its runtime value is the
22
23
  underlying MapLibre map. The component observes its own map-container allocation and calls the
@@ -32,6 +33,11 @@ modes use the same expression semantics at initial render and after a theme chan
32
33
 
33
34
  **Properties:**
34
35
 
36
+ - `engine: LyraMapEngine = 'modular'` — selects the optional `@aceshooting/lyra-map` companion.
37
+ Set `engine="maplibre"` before connecting to explicitly use the full canonical `maplibre-gl`
38
+ peer. A missing selected engine shows a localized fallback; it never selects another engine.
39
+ Later changes take effect after disconnect/reconnect. Native compatibility includes the full
40
+ engine payload and is a separate opt-in from the modular default.
35
41
  - `center: [number, number] = [0, 0]`
36
42
  - `zoom: number = 2` — `center` and `zoom` are the declarative camera. Assigning either moves the
37
43
  map without emitting anything. When the camera settles after a user gesture or `fitBounds()`, the
@@ -457,18 +463,33 @@ payload beside the map.
457
463
  `LyraMapPointRadiusInterpolation`, `LyraMapPointIcon`, `LyraMapPointIconMode`,
458
464
  `LyraMapPointIconLineCap`, `LyraMapPointIconLineJoin`, `LyraMapMarker`, `LyraMapMarkerActivationDetail`,
459
465
  `LyraMapMarkerActivationSource`, `LyraMapLegendToggleDetail`, `LyraMapLegendPanelToggleDetail`,
460
- `LyraMapStyleSpecification`, and `LyraMapInstance`.
466
+ `LyraMapStyleSpecification`, `LyraMapEngine`, `LyraMapFeatureRequirements`, and `LyraMapInstance`.
461
467
 
462
468
  **Getters:** `map: LyraMapInstance | undefined` → the underlying runtime `maplibregl.Map`, exposed
463
469
  through the peer-neutral `getCanvas()`, `getCenter()`, `getZoom()`, `setCenter()`, `setZoom()`, and
464
470
  `resize()` subset so merely importing Lyra does not require `maplibre-gl` declarations. A consumer
465
471
  that installed the optional peer and needs its full imperative API can explicitly narrow the runtime
466
- value to `maplibregl.Map`.
467
-
468
- **Methods:** `LyraMap.preload(): Promise<boolean>` is a static optional-peer warm-up that starts the
469
- shared `maplibre-gl` import without constructing a map or allocating a WebGL context. It resolves to
470
- `false` when the peer is unavailable, allowing an application to choose a fallback before connecting
471
- an element.
472
+ value to the selected engine's `Map` type. `LyraMapInstance.prepareFeatures?()` is present on the
473
+ modular engine and absent on canonical MapLibre, so guard it or narrow to the companion `Map`
474
+ before calling. Identity is preserved: `.map` is the engine instance, not a proxy.
475
+
476
+ The modular engine automatically prepares initial and replacement style requirements, including
477
+ projection and terrain. `<lr-map>` additionally awaits per-map main-thread and worker readiness
478
+ before adding generated choropleth or `dataLayers` sources and layers. New heatmap, clustering, and
479
+ symbol requirements are prepared when introduced. Failed or superseded preparations never apply
480
+ stale overlays, and disconnect aborts outstanding preparation.
481
+
482
+ For direct imperative mutations, call `await map.prepareFeatures(requirements, { signal })` with
483
+ actual `sources`, `layers`, `projection`, and `terrain` descriptors before introducing new families
484
+ through synchronous `addSource`, `addLayer`, `setProjection`, or `setTerrain` calls. Requirements use
485
+ `LyraMapFeatureRequirements`; `signal` is optional. A map constructed with `style: null` is initialized
486
+ by this per-map method before those mutations. Global `prepareStyle()` warms main modules only;
487
+ it does not replace per-map worker readiness. Same-family updates remain synchronous after readiness.
488
+
489
+ **Methods:** `LyraMap.preload(engine: LyraMapEngine = 'modular'): Promise<boolean>` starts the selected
490
+ optional-peer import without constructing a map or allocating a WebGL context. Pass `'maplibre'`
491
+ for an explicitly native element. It resolves to `false` when the selected peer is unavailable,
492
+ allowing an application to choose a fallback before connecting an element.
472
493
 
473
494
  `fitBounds(bounds: LyraMapBounds, options?: LyraMapFitBoundsOptions): boolean` frames a box
474
495
  `[[west, south], [east, north]]` in the viewport: the way to show every current marker, or a
@@ -616,7 +637,7 @@ A swatch rendering an entry's `icon` carries `data-icon="true"`, paints the glyp
616
637
  own colour through `currentColor`, and drops the colour block, its border and the `pattern`
617
638
  overlay — all three would sit on top of the shape they identify. The glyph stays decorative: the row's
618
639
  visible label carries its meaning. That association is advertised only while it is true — while
619
- the optional `maplibre-gl` peer is still loading, and after any failure, there is no map
640
+ the selected optional map peer is still loading, and after any failure, there is no map
620
641
  container in the tree, so `legend` withholds `aria-controls` rather than leaving a dangling
621
642
  idref.
622
643
  Under `legendInteractive`, a row carrying a `value` wraps its swatch and label in a
@@ -663,8 +684,9 @@ peer unavailable, owner-realm WebGL2 unavailable, or initialization failed. A po
663
684
  appended to the document's pre-mounted `[data-lr-live-region="assertive"]` sink rather than making
664
685
  shadow chrome live; raw caught errors are never exposed.
665
686
 
666
- **Standard peer controls:** after `lr-map-load`, narrow `.map` to the installed MapLibre peer
667
- and use `addControl(new NavigationControl(), 'bottom-right')` and
687
+ **Standard peer controls:** after `lr-map-load`, narrow `.map` to the selected engine's `Map`.
688
+ For the default engine, import `NavigationControl` from `@aceshooting/lyra-map/controls/navigation`
689
+ and `ScaleControl` from `@aceshooting/lyra-map/controls/scale`, then use `addControl(new NavigationControl(), 'bottom-right')` and
668
690
  `addControl(new ScaleControl({ unit: 'metric' }), 'bottom-left')`. No document-level peer CSS or
669
691
  shadow-root modification is needed: navigation buttons, compass glyph, scale bar and control
670
692
  corners are styled with Lyra tokens. The corners follow inline start/end under RTL. The legend
@@ -712,20 +734,32 @@ var(--lr-color-brand-quiet), var(--lr-color-mix-partner) var(--lr-color-mix-acti
712
734
  control group), `--lr-color-border-subtle` (popup, legend and legend-limit rule edges),
713
735
  `--lr-shadow`, `--lr-radius`.
714
736
 
715
- **Optional peer deps:** `maplibre-gl` `>=5 <7` (lazy-loaded). `<lr-map>` styles MapLibre's
716
- generated canvas, marker, popup, and control DOM inside its shadow root; a page-level MapLibre
717
- stylesheet is neither required nor able to reach those nodes. MapLibre v5's standard build includes
718
- its worker. MapLibre v6 is ESM-only, requires WebGL2, and additionally needs its module-worker URL
719
- configured for the bundler once — the component cannot choose a bundler-specific worker URL. For
720
- Vite with v6:
737
+ **Optional peer deps:** the default is `@aceshooting/lyra-map` `^1.0.0` (lazy-loaded). Install and
738
+ configure the companion's Vite plugin so the engine and module worker share the same emitted
739
+ feature graph:
740
+
741
+ ```ts
742
+ // vite.config.ts
743
+ import { defineConfig } from 'vite';
744
+ import { lyraMapWorkerPlugin } from '@aceshooting/lyra-map/vite';
745
+ export default defineConfig({ plugins: [lyraMapWorkerPlugin()] });
746
+ ```
747
+
748
+ The plugin disables document module-preload helpers for chunks also imported by workers. See the
749
+ companion README for Rollup/Rolldown integration or the explicit `setWorkerUrl()` override. Missing
750
+ worker configuration fails visibly. Importing the companion during SSR is safe; worker creation
751
+ occurs in the browser.
752
+
753
+ `<lr-map>` styles the generated canvas, marker, popup, and control DOM inside its shadow root;
754
+ a page-level map stylesheet is neither required nor able to reach those nodes. The explicit
755
+ `engine="maplibre"` choice uses the separate optional `maplibre-gl` `>=5 <7` peer. Canonical v6 needs
756
+ its own bundler-specific module-worker URL; v5's standard build includes its worker.
757
+
758
+ With the default companion configured:
721
759
 
722
760
  ```html
723
761
  <lr-map center="[2.35, 48.85]" zoom="10"></lr-map>
724
762
  <script type="module">
725
- import { setWorkerUrl } from "maplibre-gl";
726
- import workerUrl from "maplibre-gl/dist/maplibre-gl-worker.mjs?worker&url";
727
- setWorkerUrl(workerUrl);
728
-
729
763
  const m = document.querySelector("lr-map");
730
764
  m.mapStyle = { version: 8, sources: {}, layers: [] }; // explicit, network-silent baseline
731
765
  m.choropleth = {
@@ -752,8 +786,9 @@ Vite with v6:
752
786
  </script>
753
787
  ```
754
788
 
755
- Webpack, esbuild, Rollup, and direct-browser ESM use different worker URL forms; use MapLibre's ESM
756
- installation guide for the matching setup:
789
+ For the explicit canonical engine, configure its worker before connecting the element. For example,
790
+ Vite with MapLibre v6 uses `setWorkerUrl` from `maplibre-gl` with a URL imported from
791
+ `maplibre-gl/dist/maplibre-gl-worker.mjs?worker&url`. Other bundlers use different forms; see
757
792
  https://maplibre.org/maplibre-gl-js/docs/#esm.
758
793
 
759
794
  **Known gotchas:**
@@ -798,7 +833,7 @@ undefined`, or changing `choropleth.sourceId` to a different value, now calls `r
798
833
  (notably `url(...)`, which `background` also accepts and would otherwise fetch as soon as the
799
834
  swatch renders). The required `pattern` remains distinct in forced colors through solid, dashed,
800
835
  dotted, and double border/shape encodings.
801
- - while the `maplibre-gl` peer is resolving, the host/base expose `aria-busy="true"` and show a
836
+ - while the selected map peer is resolving, the host/base expose `aria-busy="true"` and show a
802
837
  decorative `<lr-skeleton shape="rect" announce="false">` in place of the map container.
803
838
  Ordinary sr-only text preserves the localized `loading` label without creating a shadow live
804
839
  region.
package/llms/index.md CHANGED
@@ -193,7 +193,7 @@ Optional peers: `llms/peers.md`. Safe `wa-*`/`sl-*` migration: `llms/migration.m
193
193
 
194
194
  - `lr-flag` · lr-flag.js · `stable` since `4.0.0` — a country/language flag.
195
195
  - `lr-sequence-playback` · lr-sequence-playback.js · `stable` since `9.0.0` — steps a current index through `[0, itemCount)` on a fixed interval (play/pause), the common building block behind ad-hoc play-timers in t...
196
- - `lr-map` · lr-map.js · `stable` since `4.0.0` — a maplibre-gl wrapper with a declarative legend, choropleth GeoJSON layer, markers, and additive `dataLayers` GeoJSON overlays (arbitrary...
196
+ - `lr-map` · lr-map.js · `stable` since `4.0.0` — a modular MapLibre-compatible wrapper with a declarative legend, choropleth GeoJSON layer, markers, and additive `dataLayers` GeoJSON ove...
197
197
  - `lr-drop-zone` · lr-drop-zone.js · `experimental` since `16.0.0` — - a drag-and-drop region wrapper with no file input of its own.
198
198
  - `lr-file-input` · lr-file-input.js · `stable` since `4.0.0` — a drag-drop + click-to-browse file dropzone.
199
199
  - `lr-image-comparer` · lr-image-comparer.js · `stable` since `4.0.0` — compares two slotted surfaces with a keyboard- accessible range divider.
package/llms/peers.md CHANGED
@@ -2,14 +2,14 @@
2
2
 
3
3
  # Optional peer dependencies
4
4
 
5
- All 30 peers are **optional**: nothing here is needed to install or use the library,
5
+ All 31 peers are **optional**: nothing here is needed to install or use the library,
6
6
  but they have two deliberately different roles.
7
7
 
8
8
  **Framework declaration peers (3).** React, Svelte, and Vue are compile-time peers
9
9
  only when a project imports their matching opt-in declaration entry. Those entry points emit empty
10
10
  JavaScript, no component imports these frameworks, and Lyra ships no runtime wrapper.
11
11
 
12
- **Component-loaded peers (27).** No component imports one eagerly. Install a
12
+ **Component-loaded peers (28).** No component imports one eagerly. Install a
13
13
  peer only when you use a component that needs it.
14
14
 
15
15
  **How they load.** Most component-loaded peers resolve through a dynamic `import()` on first use.
@@ -38,7 +38,8 @@ for the page.
38
38
  | Peer | Range | Needed by |
39
39
  |---|---|---|
40
40
  | `@aceshooting/lyra-flags` | `^2.3.0` | _(loaded by a shared internal module)_ |
41
- | `@aceshooting/lyra-translations` | `^28.1.6` | _(not referenced by any component)_ |
41
+ | `@aceshooting/lyra-map` | `^1.0.0` | `lr-geojson-viewer`, `lr-map` |
42
+ | `@aceshooting/lyra-translations` | `^29.0.0` | _(not referenced by any component)_ |
42
43
  | `@aiden0z/pptx-renderer` | `^1.3.0` | `lr-pptx-viewer` |
43
44
  | `@sgratzl/chartjs-chart-boxplot` | `^4.0.0` | `lr-box-plot` |
44
45
  | `chart.js` | `^4.0.1` | `lr-bar-chart`, `lr-box-plot`, `lr-bubble-chart`, `lr-chart`, `lr-doughnut-chart`, `lr-histogram`, `lr-line-chart`, `lr-pie-chart`, `lr-polar-area-chart`, `lr-radar-chart`, `lr-scatter-chart` |
@@ -118,7 +118,7 @@ preferred in production.
118
118
 
119
119
  ## Optional peer dependencies
120
120
 
121
- All 30 peers are optional, in two groups. The 27 component-facing peers remain outside the default
121
+ All 31 peers are optional, in two groups. The 28 component-facing peers remain outside the default
122
122
  install; components load them on demand where applicable. React, Svelte, and Vue are
123
123
  compile-time-only peers for their matching
124
124
  opt-in declaration entries (`custom-elements-jsx`, `svelte`, and `vue`): those entries emit empty
@@ -134,7 +134,7 @@ adapter (`loadLibphonenumberAdapter()`) rather than importing `libphonenumber-js
134
134
  ### Experimental DOCX editing companion
135
135
 
136
136
  Use `@aceshooting/lyra-docs` for editing; `lr-docx-viewer` remains a viewer in Lyra UI.
137
- The companion uses optional `@docx-editor.dev/core@2.27.0`. Its installed README owns
137
+ The companion bundles a lazily loaded document engine. Its installed README owns
138
138
  installation, admission limits, lifecycle, exact supported structures and save receipts.
139
139
 
140
140
  ```ts
@@ -149,7 +149,8 @@ replace-and-advance, Outline, Checks and Review panels, table formatting and loc
149
149
  image tools. `createDocxSession({ mount })` supports a host-owned toolbar; it requires a
150
150
  connected empty light-DOM mount. Both routes expose `can()`/`execute()`, `find()`/
151
151
  `selectMatch()`/`replaceMatch()`, `outline()`/`selectOutlineItem()`, `inspectDocument()`/
152
- `selectDiagnostic()`, and `review()`/`selectReviewItem()`. Query rows are copied, bounded
152
+ `selectDiagnostic()`, and `review()`/`selectReviewItem()`. Await `execute()` before inspecting its
153
+ result or issuing a dependent command; it includes any required feature preparation. Query rows are copied, bounded
153
154
  and revision-scoped; refresh after edits and pass the returned `expectedRevision` when
154
155
  navigating. Queries do not save or fetch. Inspection covers body metadata only; capability
155
156
  fields `preserved`, `renderable` and `editable` remain `unverified`, and the report is not
@@ -164,7 +164,7 @@ The entry points, then:
164
164
  `lr-scatter-chart`), `lr-box-plot`, `lr-histogram`, `lr-map`, `lr-graph`,
165
165
  `lr-knowledge-graph-explorer` and `lr-geojson-viewer`. Those always need their own subpath import,
166
166
  from `all.js` exactly as from the root — the entry deliberately preserves the optional-peer
167
- isolation contract rather than putting `chart.js`, `maplibre-gl`, or the `d3-*` set on the
167
+ isolation contract rather than putting `chart.js`, `@aceshooting/lyra-map`, `maplibre-gl`, or the `d3-*` set on the
168
168
  critical path of every install. It is the one import that defeats tree-shaking.
169
169
  (Server-side, `@aceshooting/lyra-ui/ssr/all.js` is the counterpart that _does_ register the
170
170
  complete inventory, optional-peer families included; see "SSR and declarative shadow DOM".)
package/llms/shared.md CHANGED
@@ -163,7 +163,7 @@ The entry points, then:
163
163
  `lr-scatter-chart`), `lr-box-plot`, `lr-histogram`, `lr-map`, `lr-graph`,
164
164
  `lr-knowledge-graph-explorer` and `lr-geojson-viewer`. Those always need their own subpath import,
165
165
  from `all.js` exactly as from the root — the entry deliberately preserves the optional-peer
166
- isolation contract rather than putting `chart.js`, `maplibre-gl`, or the `d3-*` set on the
166
+ isolation contract rather than putting `chart.js`, `@aceshooting/lyra-map`, `maplibre-gl`, or the `d3-*` set on the
167
167
  critical path of every install. It is the one import that defeats tree-shaking.
168
168
  (Server-side, `@aceshooting/lyra-ui/ssr/all.js` is the counterpart that _does_ register the
169
169
  complete inventory, optional-peer families included; see "SSR and declarative shadow DOM".)
@@ -2706,7 +2706,7 @@ preferred in production.
2706
2706
 
2707
2707
  ## Optional peer dependencies
2708
2708
 
2709
- All 30 peers are optional, in two groups. The 27 component-facing peers remain outside the default
2709
+ All 31 peers are optional, in two groups. The 28 component-facing peers remain outside the default
2710
2710
  install; components load them on demand where applicable. React, Svelte, and Vue are
2711
2711
  compile-time-only peers for their matching
2712
2712
  opt-in declaration entries (`custom-elements-jsx`, `svelte`, and `vue`): those entries emit empty
@@ -2722,7 +2722,7 @@ adapter (`loadLibphonenumberAdapter()`) rather than importing `libphonenumber-js
2722
2722
  ### Experimental DOCX editing companion
2723
2723
 
2724
2724
  Use `@aceshooting/lyra-docs` for editing; `lr-docx-viewer` remains a viewer in Lyra UI.
2725
- The companion uses optional `@docx-editor.dev/core@2.27.0`. Its installed README owns
2725
+ The companion bundles a lazily loaded document engine. Its installed README owns
2726
2726
  installation, admission limits, lifecycle, exact supported structures and save receipts.
2727
2727
 
2728
2728
  ```ts
@@ -2737,7 +2737,8 @@ replace-and-advance, Outline, Checks and Review panels, table formatting and loc
2737
2737
  image tools. `createDocxSession({ mount })` supports a host-owned toolbar; it requires a
2738
2738
  connected empty light-DOM mount. Both routes expose `can()`/`execute()`, `find()`/
2739
2739
  `selectMatch()`/`replaceMatch()`, `outline()`/`selectOutlineItem()`, `inspectDocument()`/
2740
- `selectDiagnostic()`, and `review()`/`selectReviewItem()`. Query rows are copied, bounded
2740
+ `selectDiagnostic()`, and `review()`/`selectReviewItem()`. Await `execute()` before inspecting its
2741
+ result or issuing a dependent command; it includes any required feature preparation. Query rows are copied, bounded
2741
2742
  and revision-scoped; refresh after edits and pass the returned `expectedRevision` when
2742
2743
  navigating. Queries do not save or fetch. Inspection covers body metadata only; capability
2743
2744
  fields `preserved`, `renderable` and `editable` remain `unverified`, and the report is not