@aceshooting/lyra-ui 8.2.2 → 8.2.3

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 (61) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +2 -4
  3. package/custom-elements.json +1 -1
  4. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.styles.js +1 -1
  5. package/dist/components/agent-tools/agent-trace/agent-trace.styles.js +1 -0
  6. package/dist/components/agent-tools/approval-queue/approval-queue.styles.js +1 -0
  7. package/dist/components/agent-tools/browser-frame/browser-frame.styles.js +1 -0
  8. package/dist/components/agent-tools/compare-panel/compare-panel.styles.js +1 -0
  9. package/dist/components/agent-tools/eval-result/eval-result.styles.js +1 -0
  10. package/dist/components/agent-tools/mcp-app/mcp-app.styles.js +1 -0
  11. package/dist/components/agent-tools/prompt-studio/prompt-studio.styles.js +1 -1
  12. package/dist/components/agent-tools/schema-viewer/schema-viewer.styles.js +1 -1
  13. package/dist/components/agent-tools/span-waterfall/span-waterfall.styles.js +1 -0
  14. package/dist/components/agent-tools/subagent-panel/subagent-panel.styles.js +1 -1
  15. package/dist/components/agent-tools/trace-tree/trace-tree.styles.js +1 -0
  16. package/dist/components/charts/chart/chart.styles.js +1 -0
  17. package/dist/components/conversation/agent-workspace/agent-workspace.styles.js +1 -0
  18. package/dist/components/conversation/chat-viewport/chat-viewport.styles.js +1 -0
  19. package/dist/components/conversation/code-block/code-block.styles.js +7 -0
  20. package/dist/components/conversation/message-parts/message-parts.styles.js +1 -0
  21. package/dist/components/conversation/prompt-input/prompt-input.styles.js +1 -0
  22. package/dist/components/conversation/prompt-queue/prompt-queue.styles.js +1 -0
  23. package/dist/components/conversation/realtime-session/realtime-session.styles.js +1 -1
  24. package/dist/components/data/calendar/calendar.styles.js +1 -0
  25. package/dist/components/data/data-grid/data-grid.styles.js +1 -0
  26. package/dist/components/data/pagination/pagination.styles.js +1 -0
  27. package/dist/components/data/query-builder/query-builder.styles.js +1 -0
  28. package/dist/components/data/table/table.styles.js +1 -0
  29. package/dist/components/forms/input/time-input.styles.js +1 -0
  30. package/dist/components/layout/button-group/button-group.styles.js +4 -9
  31. package/dist/components/layout/card/card.styles.js +4 -0
  32. package/dist/components/layout/carousel/carousel.styles.js +1 -0
  33. package/dist/components/layout/control-group/control-group.styles.js +1 -0
  34. package/dist/components/layout/dashboard-grid/dashboard-grid.styles.js +1 -0
  35. package/dist/components/layout/page/page.styles.js +1 -0
  36. package/dist/components/media/lightbox/lightbox.styles.js +1 -0
  37. package/dist/components/media/map/map-loader.d.ts +3 -3
  38. package/dist/components/media/map/map-loader.js +1 -1
  39. package/dist/components/media/map/map.class.d.ts +3 -2
  40. package/dist/components/media/map/map.styles.js +207 -9
  41. package/dist/components/media/video/video.styles.js +1 -0
  42. package/dist/components/media/video-playlist/video-playlist.styles.js +1 -0
  43. package/dist/components/media/zoomable-frame/zoomable-frame.styles.js +1 -0
  44. package/dist/components/retrieval/claim-evidence/claim-evidence.styles.js +1 -0
  45. package/dist/components/retrieval/embedding-explorer/embedding-explorer.styles.js +1 -0
  46. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.styles.js +1 -0
  47. package/dist/components/retrieval/rag-answer/rag-answer.styles.js +1 -1
  48. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.styles.js +1 -0
  49. package/dist/components/retrieval/retrieval-compare/retrieval-compare.styles.js +1 -0
  50. package/dist/components/retrieval/retrieval-trace/retrieval-trace.styles.js +1 -0
  51. package/dist/components/utility/diff-view/diff-view.styles.js +5 -0
  52. package/dist/components/viewers/document-compare/document-compare.styles.js +1 -0
  53. package/dist/components/viewers/notebook-viewer/notebook-viewer.styles.js +1 -0
  54. package/dist/internal/package-metadata.d.ts +1 -1
  55. package/dist/internal/package-metadata.js +1 -1
  56. package/llms/components/lr-map.md +6 -6
  57. package/llms/peers.md +1 -1
  58. package/llms-full.txt +6 -6
  59. package/package.json +4 -4
  60. package/vscode-html-data.json +1 -1
  61. package/web-types.json +2 -2
@@ -1,5 +1,5 @@
1
1
  import{css}from"lit";const styles=css`
2
- :host { display: block; container-type: inline-size; }
2
+ :host { display: block; container-type: inline-size; contain-intrinsic-inline-size: var(--lr-size-20rem); }
3
3
  [part='base'] { display: flex; flex-direction: column; gap: var(--lr-space-m); }
4
4
  [part='heading'], [part='runs-heading'] { margin: 0; font-size: var(--lr-font-size-lg); font-weight: var(--lr-font-weight-semibold); }
5
5
  [part='metrics'] { display: grid; grid-template-columns: repeat(auto-fit, minmax(var(--lr-size-10rem), 1fr)); gap: var(--lr-space-s); }
@@ -2,6 +2,7 @@ import{css}from"lit";const styles=css`
2
2
  :host {
3
3
  display: block;
4
4
  container-type: inline-size;
5
+ contain-intrinsic-inline-size: var(--lr-size-20rem);
5
6
  }
6
7
 
7
8
  [part='base'] {
@@ -2,6 +2,7 @@ import{css}from"lit";const styles=css`
2
2
  :host {
3
3
  display: block;
4
4
  container-type: inline-size;
5
+ contain-intrinsic-inline-size: var(--lr-size-20rem);
5
6
  }
6
7
 
7
8
  [part='base'] {
@@ -4,6 +4,7 @@ import{css}from"lit";const styles=css`
4
4
  /* Makes the host a query container so the @container rule below reacts to the frame's own
5
5
  allocated width (a sidebar, a split pane, a dialog) instead of the viewport's. */
6
6
  container-type: inline-size;
7
+ contain-intrinsic-inline-size: var(--lr-size-20rem);
7
8
  }
8
9
  [part='base'] {
9
10
  display: flex;
@@ -2,6 +2,7 @@ import{css}from"lit";const styles=css`
2
2
  :host {
3
3
  display: block;
4
4
  container-type: inline-size;
5
+ contain-intrinsic-inline-size: var(--lr-size-20rem);
5
6
  --lr-compare-panel-max-height: var(--lr-size-24rem);
6
7
  }
7
8
 
@@ -2,6 +2,7 @@ import{css}from"lit";const styles=css`
2
2
  :host {
3
3
  display: block;
4
4
  container-type: inline-size;
5
+ contain-intrinsic-inline-size: var(--lr-size-20rem);
5
6
  }
6
7
 
7
8
  [part='base'] {
@@ -2,6 +2,7 @@ import{css}from"lit";const styles=css`
2
2
  :host {
3
3
  display: block;
4
4
  container-type: inline-size;
5
+ contain-intrinsic-inline-size: var(--lr-size-20rem);
5
6
  }
6
7
 
7
8
  [part='base'] {
@@ -1,5 +1,5 @@
1
1
  import{css}from"lit";const styles=css`
2
- :host { display: block; container-type: inline-size; }
2
+ :host { display: block; container-type: inline-size; contain-intrinsic-inline-size: var(--lr-size-20rem); }
3
3
  [part='base'] { display: flex; flex-direction: column; gap: var(--lr-space-m); }
4
4
  [part='toolbar'] { display: flex; flex-wrap: wrap; gap: var(--lr-space-s); align-items: center; }
5
5
  [part='toolbar'] h2 { min-inline-size: 0; flex: 1; margin: 0; font-size: var(--lr-font-size-lg); }
@@ -1,5 +1,5 @@
1
1
  import{css}from"lit";const styles=css`
2
- :host { display: block; container-type: inline-size; }
2
+ :host { display: block; container-type: inline-size; contain-intrinsic-inline-size: var(--lr-size-20rem); }
3
3
  ul { display: flex; flex-direction: column; gap: var(--lr-space-xs); margin: 0; padding-inline-start: var(--lr-space-l); list-style: none; }
4
4
  [part='tree'] { padding-inline-start: 0; }
5
5
  [part~='node'] { min-inline-size: 0; border-inline-start: var(--lr-border-width-thin) solid var(--lr-color-border); padding-inline-start: var(--lr-space-s); }
@@ -2,6 +2,7 @@ import{css}from"lit";const styles=css`
2
2
  :host {
3
3
  display: block;
4
4
  container-type: inline-size;
5
+ contain-intrinsic-inline-size: var(--lr-size-20rem);
5
6
  --lr-span-waterfall-name-width: var(--lr-size-8rem);
6
7
  }
7
8
 
@@ -1,5 +1,5 @@
1
1
  import{css}from"lit";const styles=css`
2
- :host { display: block; container-type: inline-size; }
2
+ :host { display: block; container-type: inline-size; contain-intrinsic-inline-size: var(--lr-size-20rem); }
3
3
  [part='list'] { display: flex; flex-direction: column; gap: var(--lr-space-xs); margin: 0; padding: 0; list-style: none; }
4
4
  [part~='run'] { margin-inline-start: calc(var(--lr-subagent-depth, 0) * var(--lr-space-l)); border: var(--lr-border-width-thin) solid var(--lr-color-border); border-radius: var(--lr-radius); overflow: hidden; }
5
5
  [part~='run-selected'] {
@@ -2,6 +2,7 @@ import{css}from"lit";const styles=css`
2
2
  :host {
3
3
  display: block;
4
4
  container-type: inline-size;
5
+ contain-intrinsic-inline-size: var(--lr-size-20rem);
5
6
  --_lr-trace-tree-bar-column: var(--lr-size-6rem);
6
7
  --_lr-trace-tree-tokens-in-column: 0;
7
8
  --_lr-trace-tree-tokens-out-column: 0;
@@ -7,6 +7,7 @@ import{css}from"lit";const styles=css`
7
7
  min-block-size: var(--lr-chart-height, var(--lr-size-280px));
8
8
  block-size: auto;
9
9
  container-type: inline-size;
10
+ contain-intrinsic-inline-size: var(--lr-size-20rem);
10
11
  /* Chart.js renders to canvas, not the DOM, so it can't consume CSS
11
12
  var() directly — chart.ts's themeColors() resolves these once per
12
13
  draw() via getComputedStyle, same pattern as heatmap.ts's scale-lo/-hi.
@@ -5,6 +5,7 @@ import{css}from"lit";const styles=css`
5
5
  min-block-size: 0;
6
6
  block-size: 100%;
7
7
  container-type: inline-size;
8
+ contain-intrinsic-inline-size: var(--lr-size-20rem);
8
9
  }
9
10
  [part='base'] {
10
11
  display: grid;
@@ -6,6 +6,7 @@ import{css}from"lit";const styles=css`
6
6
  min-block-size: 0;
7
7
  position: relative;
8
8
  container-type: inline-size;
9
+ contain-intrinsic-inline-size: var(--lr-size-20rem);
9
10
  }
10
11
  [part='base'] {
11
12
  display: flex;
@@ -167,6 +167,13 @@ import{css}from"lit";const styles=css`
167
167
  [part='pre'] {
168
168
  margin: 0;
169
169
  padding: var(--lr-space-s) var(--lr-space-m);
170
+ /* The body owns scrolling, so this descendant's painted box must grow to the longest
171
+ unwrapped line instead of stopping at the body's initially visible width. The 100%
172
+ minimum keeps short code filling the scrollport; max-content extends the background and
173
+ line-state painting through the full horizontal overflow range. */
174
+ box-sizing: border-box;
175
+ inline-size: max-content;
176
+ min-inline-size: 100%;
170
177
  /* Source code is read left-to-right regardless of the surrounding document
171
178
  direction -- like every code surface (VS Code, GitHub, devtools). Without
172
179
  this, an ancestor dir="rtl" bidi-reorders each line (a trailing ';' jumps
@@ -2,6 +2,7 @@ import{css}from"lit";const styles=css`
2
2
  :host {
3
3
  display: block;
4
4
  container-type: inline-size;
5
+ contain-intrinsic-inline-size: var(--lr-size-20rem);
5
6
  }
6
7
 
7
8
  [part='base'] {
@@ -2,6 +2,7 @@ import{css}from"lit";const styles=css`
2
2
  :host {
3
3
  display: block;
4
4
  container-type: inline-size;
5
+ contain-intrinsic-inline-size: var(--lr-size-20rem);
5
6
  }
6
7
 
7
8
  [part='base'] {
@@ -2,6 +2,7 @@ import{css}from"lit";const styles=css`
2
2
  :host {
3
3
  display: block;
4
4
  container-type: inline-size;
5
+ contain-intrinsic-inline-size: var(--lr-size-20rem);
5
6
  }
6
7
 
7
8
  [part='base'] {
@@ -1,5 +1,5 @@
1
1
  import{css}from"lit";const styles=css`
2
- :host { display: block; container-type: inline-size; }
2
+ :host { display: block; container-type: inline-size; contain-intrinsic-inline-size: var(--lr-size-20rem); }
3
3
  [part='base'] { display: flex; flex-direction: column; gap: var(--lr-space-m); }
4
4
  [part='header'] { display: grid; grid-template-columns: auto minmax(var(--lr-size-8rem), 1fr) auto; gap: var(--lr-space-s); align-items: center; }
5
5
  [part='activity'] { min-inline-size: 0; }
@@ -7,6 +7,7 @@ import{css}from"lit";const styles=css`
7
7
  declare container-type on some ancestor whose box crosses the same threshold, making it
8
8
  effectively dead code out of the box. */
9
9
  container-type: inline-size;
10
+ contain-intrinsic-inline-size: var(--lr-size-20rem);
10
11
  --lr-calendar-day-min-block-size: var(--lr-size-6rem);
11
12
  /* Component-scoped indirection over the shared --lr-color-brand-quiet token, so a consumer
12
13
  can retint the persistent selected-day highlight without also recoloring
@@ -27,6 +27,7 @@ import{css}from"lit";const styles=css`
27
27
  position: relative;
28
28
  isolation: isolate;
29
29
  container-type: inline-size;
30
+ contain-intrinsic-inline-size: var(--lr-size-20rem);
30
31
  overflow: hidden;
31
32
  border: var(--border-width) solid var(--border-color);
32
33
  border-radius: var(--border-radius);
@@ -3,6 +3,7 @@ import{css}from"lit";const styles=css`
3
3
  display: block;
4
4
  min-inline-size: 0;
5
5
  container-type: inline-size;
6
+ contain-intrinsic-inline-size: var(--lr-size-20rem);
6
7
  /* Both knobs read the shared control ladder, which owns every tier and matches both the s/m/l
7
8
  and small/medium/large spellings in one selector list. Keeping the public
8
9
  --lr-pagination-* names in front lets a consumer retune this component alone, while the
@@ -6,6 +6,7 @@ import{css}from"lit";const styles=css`
6
6
  component's own allocated width (a sidebar, a split pane, a dialog) rather than the
7
7
  viewport. */
8
8
  container-type: inline-size;
9
+ contain-intrinsic-inline-size: var(--lr-size-20rem);
9
10
  }
10
11
 
11
12
  [part='base'] {
@@ -15,6 +15,7 @@ import{css}from"lit";const styles=css`
15
15
  /* Makes [part='base'] a query container so the @container rules below can
16
16
  react to the table's own available width instead of the viewport's. */
17
17
  container-type: inline-size;
18
+ contain-intrinsic-inline-size: var(--lr-size-20rem);
18
19
  }
19
20
  [part='filter-label'] {
20
21
  display: flex;
@@ -2,6 +2,7 @@ import{css}from"lit";import{formControlRequiredMarker}from"../../../internal/for
2
2
  :host {
3
3
  display: block;
4
4
  container-type: inline-size;
5
+ contain-intrinsic-inline-size: var(--lr-size-12rem);
5
6
  }
6
7
 
7
8
  [part~='form-control-label'] {
@@ -5,15 +5,10 @@ import{css}from"lit";const styles=css`
5
5
  group's own allocated width (a sidebar, a split pane, a dialog) instead of the
6
6
  viewport's — a group can be narrow on a wide screen and vice versa. */
7
7
  container-type: inline-size;
8
- /* Floors the host so a shrink-to-fit flex/grid parent (which gives inline-flex children a 0
9
- basis, not their content size, absent an explicit width) can't collapse it to ~0 -- a group
10
- with no explicit width must still render its buttons. NOTE: this can't be a content-based
11
- keyword (fit-content/max-content/auto) -- container-type implies inline-size containment on
12
- *this* box, and per the CSS Containment spec a size-contained box's content-dependent sizing
13
- resolves as if it had no content at all (verified in Chromium: fit-content collapsed to the
14
- same 0 this rule exists to prevent). Only a length/token floor survives containment, so this
15
- reuses the hit-area floor already used as a "smallest a control should ever be" minimum
16
- throughout the library instead of inventing a group-specific magic number. */
8
+ /* Size containment removes content-based intrinsic sizing. This compact fallback keeps an
9
+ unallocated group wide enough to lay out ordinary actions and lets its narrow query wrap
10
+ longer sets; the hit-area minimum remains the hard lower bound under tighter allocation. */
11
+ contain-intrinsic-inline-size: var(--lr-size-12rem);
17
12
  min-inline-size: var(--lr-icon-button-size);
18
13
  max-inline-size: 100%;
19
14
  vertical-align: middle;
@@ -3,6 +3,10 @@ import{css}from"lit";const styles=css`
3
3
  display: block;
4
4
  min-inline-size: 0;
5
5
  container-type: inline-size;
6
+ /* Inline-size containment deliberately removes content-based intrinsic sizing. Supply the
7
+ centered/shrink-to-fit fallback that lets a standalone card remain visible while definite
8
+ allocations (grid tracks, percentages, explicit inline-size) continue to win normally. */
9
+ contain-intrinsic-inline-size: var(--lr-size-20rem);
6
10
  }
7
11
  [part="base"] {
8
12
  position: relative;
@@ -3,6 +3,7 @@ import{css}from"lit";const styles=css`
3
3
  display: block;
4
4
  min-inline-size: 0;
5
5
  container-type: inline-size;
6
+ contain-intrinsic-inline-size: var(--lr-size-20rem);
6
7
  }
7
8
 
8
9
  [part~="base"] {
@@ -12,6 +12,7 @@ import{css}from"lit";const styles=css`
12
12
  responsive property. */
13
13
  :host([responsive]) {
14
14
  container-type: inline-size;
15
+ contain-intrinsic-inline-size: var(--lr-size-12rem);
15
16
  }
16
17
 
17
18
  [part='base'] {
@@ -5,6 +5,7 @@ import{css}from"lit";const styles=css`
5
5
  size (a dashboard-grid is commonly embedded in a panel of varying width, not the viewport)
6
6
  -- same convention as lr-button-group/lr-control-group's own container-query approach. */
7
7
  container-type: inline-size;
8
+ contain-intrinsic-inline-size: var(--lr-size-20rem);
8
9
  min-inline-size: 0;
9
10
  }
10
11
 
@@ -10,6 +10,7 @@ import{css}from"lit";const styles=css`
10
10
  min-inline-size: 0;
11
11
  color: var(--lr-color-text);
12
12
  container-type: inline-size;
13
+ contain-intrinsic-inline-size: var(--lr-size-20rem);
13
14
  }
14
15
 
15
16
  [part~='page'] {
@@ -13,6 +13,7 @@ import{css}from"lit";const styles=css`
13
13
  inset: 0;
14
14
  z-index: var(--lr-overlay-stack-index, var(--lr-layer-modal));
15
15
  container-type: inline-size;
16
+ contain-intrinsic-inline-size: var(--lr-size-20rem);
16
17
  padding-block-start: max(var(--lr-space-l), var(--lr-safe-area-top));
17
18
  padding-block-end: max(var(--lr-space-l), var(--lr-safe-area-bottom));
18
19
  padding-inline-start: max(var(--lr-space-l), var(--lr-safe-area-inline-start));
@@ -64,8 +64,8 @@ export interface MaplibreModule {
64
64
  /**
65
65
  * Lazily loads the optional peer dependency `maplibre-gl` once per page.
66
66
  * Resolves to `null` (with a one-time warning) if it isn't installed —
67
- * mirrors `<lr-flag>`'s peer-dependency pattern. Consumers must separately
68
- * import `maplibre-gl/dist/maplibre-gl.css`. MapLibre v6 consumers also configure its module-worker
69
- * URL for their bundler once they install the peer; v5's standard build includes its worker.
67
+ * mirrors `<lr-flag>`'s peer-dependency pattern. `<lr-map>` supplies the styles for MapLibre's
68
+ * generated DOM inside its shadow root. MapLibre v6 consumers also configure its module-worker URL
69
+ * for their bundler once they install the peer; v5's standard build includes its worker.
70
70
  */
71
71
  export declare function loadMaplibre(): Promise<MaplibreModule | null>;
@@ -1 +1 @@
1
- import{resolveOptionalPeerCapability,unwrapOptionalPeerDefault}from"../../../internal/optional-peer-capabilities.js";const MAP_METHODS=["getCenter","getZoom","setCenter","setZoom","resize","remove","on","once","setStyle","getSource","addSource","removeSource","getLayer","addLayer","removeLayer","setPaintProperty","queryRenderedFeatures"];const MARKER_METHODS=["setLngLat","setPopup","getPopup","addTo","remove"];const POPUP_METHODS=["setHTML","setText"];function isObjectLike(value){return(typeof value==="object"||typeof value==="function")&&value!==null}function isConstructor(value){if(typeof value!=="function")return false;try{Reflect.construct(Object,[],value);return true}catch{return false}}function missingConstructorCapability(module,name,methods){const Constructor=module[name];if(!isConstructor(Constructor))return name;const prototype=Constructor.prototype;if(!isObjectLike(prototype))return`${name}.prototype`;for(const method of methods){if(typeof prototype[method]!=="function")return`${name}.prototype.${method}`}return void 0}function missingMaplibreCapability(candidate){if(!isObjectLike(candidate))return"module namespace";return missingConstructorCapability(candidate,"Map",MAP_METHODS)??missingConstructorCapability(candidate,"Marker",MARKER_METHODS)??missingConstructorCapability(candidate,"Popup",POPUP_METHODS)}function isMaplibreModule(candidate){return missingMaplibreCapability(candidate)===void 0}function resolveMaplibreModule(value){const module=resolveOptionalPeerCapability(value,isMaplibreModule);if(module)return module;const candidate=unwrapOptionalPeerDefault(value);const missing=missingMaplibreCapability(candidate)??"module namespace";throw new Error(`Invalid optional peer \`maplibre-gl\`: missing or invalid \`${missing}\` capability.`)}let maplibre;async function loadMaplibreModule(importer=()=>import("maplibre-gl")){try{return resolveMaplibreModule(await importer())}catch(error){console.warn("<lr-map> needs the optional peer dependency `maplibre-gl` \u2014 install it with `pnpm add maplibre-gl` and import `maplibre-gl/dist/maplibre-gl.css` once in your app.",error);return null}}function loadMaplibre(){if(!maplibre){maplibre=loadMaplibreModule()}return maplibre}export{loadMaplibre,loadMaplibreModule};
1
+ import{resolveOptionalPeerCapability,unwrapOptionalPeerDefault}from"../../../internal/optional-peer-capabilities.js";const MAP_METHODS=["getCenter","getZoom","setCenter","setZoom","resize","remove","on","once","setStyle","getSource","addSource","removeSource","getLayer","addLayer","removeLayer","setPaintProperty","queryRenderedFeatures"];const MARKER_METHODS=["setLngLat","setPopup","getPopup","addTo","remove"];const POPUP_METHODS=["setHTML","setText"];function isObjectLike(value){return(typeof value==="object"||typeof value==="function")&&value!==null}function isConstructor(value){if(typeof value!=="function")return false;try{Reflect.construct(Object,[],value);return true}catch{return false}}function missingConstructorCapability(module,name,methods){const Constructor=module[name];if(!isConstructor(Constructor))return name;const prototype=Constructor.prototype;if(!isObjectLike(prototype))return`${name}.prototype`;for(const method of methods){if(typeof prototype[method]!=="function")return`${name}.prototype.${method}`}return void 0}function missingMaplibreCapability(candidate){if(!isObjectLike(candidate))return"module namespace";return missingConstructorCapability(candidate,"Map",MAP_METHODS)??missingConstructorCapability(candidate,"Marker",MARKER_METHODS)??missingConstructorCapability(candidate,"Popup",POPUP_METHODS)}function isMaplibreModule(candidate){return missingMaplibreCapability(candidate)===void 0}function resolveMaplibreModule(value){const module=resolveOptionalPeerCapability(value,isMaplibreModule);if(module)return module;const candidate=unwrapOptionalPeerDefault(value);const missing=missingMaplibreCapability(candidate)??"module namespace";throw new Error(`Invalid optional peer \`maplibre-gl\`: missing or invalid \`${missing}\` capability.`)}let maplibre;async function loadMaplibreModule(importer=()=>import("maplibre-gl")){try{return resolveMaplibreModule(await importer())}catch(error){console.warn("<lr-map> needs the optional peer dependency `maplibre-gl` \u2014 install it with `pnpm add maplibre-gl`.",error);return null}}function loadMaplibre(){if(!maplibre){maplibre=loadMaplibreModule()}return maplibre}export{loadMaplibre,loadMaplibreModule};
@@ -88,8 +88,9 @@ export interface LyraMapEventMap {
88
88
  * independent of `choropleth`'s field/stops color-interpolation), plus a peer-neutral
89
89
  * `map` getter for common imperative operations. Its runtime value is the underlying MapLibre
90
90
  * map, while its declaration stays independent of the optional peer. Requires `maplibre-gl`
91
- * v5 or v6 (consumers also import its CSS). MapLibre v6 is ESM-only, requires WebGL2, and needs
92
- * its module-worker URL configured once; v5's standard build includes its worker.
91
+ * v5 or v6; the component styles MapLibre's generated canvas, marker, popup, and control DOM
92
+ * inside its shadow root. MapLibre v6 is ESM-only, requires WebGL2, and needs its module-worker
93
+ * URL configured once; v5's standard build includes its worker.
93
94
  *
94
95
  * The underlying `maplibregl.Map` — and the WebGL context it opens — isn't
95
96
  * constructed until this element is first visible in the viewport (tracked
@@ -22,6 +22,173 @@ import{css}from"lit";const styles=css`
22
22
  [part='container'] {
23
23
  position: absolute;
24
24
  inset: 0;
25
+ inline-size: 100%;
26
+ block-size: 100%;
27
+ overflow: hidden;
28
+ }
29
+ /* MapLibre creates these nodes inside the container above, hence inside this component's
30
+ shadow root. Page-level peer CSS cannot reach them; the wrapper owns the layout and
31
+ interaction rules for the MapLibre capabilities it exposes. */
32
+ .maplibregl-canvas-container {
33
+ inline-size: 100%;
34
+ block-size: 100%;
35
+ }
36
+ .maplibregl-canvas {
37
+ position: absolute;
38
+ inset-block-start: 0;
39
+ inset-inline-start: 0;
40
+ }
41
+ .maplibregl-canvas-container.maplibregl-interactive {
42
+ cursor: grab;
43
+ user-select: none;
44
+ }
45
+ .maplibregl-canvas-container.maplibregl-interactive:active {
46
+ cursor: grabbing;
47
+ }
48
+ .maplibregl-canvas-container.maplibregl-touch-zoom-rotate,
49
+ .maplibregl-canvas-container.maplibregl-touch-zoom-rotate .maplibregl-canvas {
50
+ touch-action: pan-x pan-y;
51
+ }
52
+ .maplibregl-canvas-container.maplibregl-touch-drag-pan,
53
+ .maplibregl-canvas-container.maplibregl-touch-drag-pan .maplibregl-canvas {
54
+ touch-action: pinch-zoom;
55
+ }
56
+ .maplibregl-canvas-container.maplibregl-touch-zoom-rotate.maplibregl-touch-drag-pan,
57
+ .maplibregl-canvas-container.maplibregl-touch-zoom-rotate.maplibregl-touch-drag-pan .maplibregl-canvas {
58
+ touch-action: none;
59
+ }
60
+ .maplibregl-marker {
61
+ position: absolute;
62
+ inset-block-start: 0;
63
+ inset-inline-start: 0;
64
+ inline-size: max-content;
65
+ will-change: transform;
66
+ }
67
+ .maplibregl-popup {
68
+ position: absolute;
69
+ inset-block-start: 0;
70
+ inset-inline-start: 0;
71
+ z-index: var(--lr-layer-content);
72
+ display: flex;
73
+ will-change: transform;
74
+ pointer-events: none;
75
+ color: var(--lr-color-text);
76
+ font-family: var(--lr-font);
77
+ font-size: var(--lr-font-size-sm);
78
+ line-height: var(--lr-line-height-normal);
79
+ }
80
+ .maplibregl-popup-anchor-top,
81
+ .maplibregl-popup-anchor-top-left,
82
+ .maplibregl-popup-anchor-top-right {
83
+ flex-direction: column;
84
+ }
85
+ .maplibregl-popup-anchor-bottom,
86
+ .maplibregl-popup-anchor-bottom-left,
87
+ .maplibregl-popup-anchor-bottom-right {
88
+ flex-direction: column-reverse;
89
+ }
90
+ .maplibregl-popup-anchor-left {
91
+ flex-direction: row;
92
+ }
93
+ .maplibregl-popup-anchor-right {
94
+ flex-direction: row-reverse;
95
+ }
96
+ :host(:dir(rtl)) .maplibregl-popup-anchor-left {
97
+ flex-direction: row-reverse;
98
+ }
99
+ :host(:dir(rtl)) .maplibregl-popup-anchor-right {
100
+ flex-direction: row;
101
+ }
102
+ .maplibregl-popup-tip {
103
+ inline-size: 0;
104
+ block-size: 0;
105
+ border: var(--lr-size-0-625rem) solid transparent;
106
+ z-index: var(--lr-layer-content);
107
+ }
108
+ .maplibregl-popup-anchor-top .maplibregl-popup-tip {
109
+ align-self: center;
110
+ border-block-start: none;
111
+ border-block-end-color: var(--lr-color-surface-overlay);
112
+ }
113
+ .maplibregl-popup-anchor-top-left .maplibregl-popup-tip {
114
+ align-self: flex-start;
115
+ border-block-start: none;
116
+ border-inline-start: none;
117
+ border-block-end-color: var(--lr-color-surface-overlay);
118
+ }
119
+ .maplibregl-popup-anchor-top-right .maplibregl-popup-tip {
120
+ align-self: flex-end;
121
+ border-block-start: none;
122
+ border-inline-end: none;
123
+ border-block-end-color: var(--lr-color-surface-overlay);
124
+ }
125
+ .maplibregl-popup-anchor-bottom .maplibregl-popup-tip {
126
+ align-self: center;
127
+ border-block-end: none;
128
+ border-block-start-color: var(--lr-color-surface-overlay);
129
+ }
130
+ .maplibregl-popup-anchor-bottom-left .maplibregl-popup-tip {
131
+ align-self: flex-start;
132
+ border-block-end: none;
133
+ border-inline-start: none;
134
+ border-block-start-color: var(--lr-color-surface-overlay);
135
+ }
136
+ .maplibregl-popup-anchor-bottom-right .maplibregl-popup-tip {
137
+ align-self: flex-end;
138
+ border-block-end: none;
139
+ border-inline-end: none;
140
+ border-block-start-color: var(--lr-color-surface-overlay);
141
+ }
142
+ .maplibregl-popup-anchor-left .maplibregl-popup-tip {
143
+ align-self: center;
144
+ border-inline-start: none;
145
+ border-inline-end-color: var(--lr-color-surface-overlay);
146
+ }
147
+ .maplibregl-popup-anchor-right .maplibregl-popup-tip {
148
+ align-self: center;
149
+ border-inline-end: none;
150
+ border-inline-start-color: var(--lr-color-surface-overlay);
151
+ }
152
+ .maplibregl-popup-content {
153
+ position: relative;
154
+ min-inline-size: var(--lr-icon-button-size);
155
+ padding: var(--lr-space-m);
156
+ padding-inline-end: calc(var(--lr-icon-button-size) + var(--lr-space-xs));
157
+ border: var(--lr-border-width-thin) solid var(--lr-color-border);
158
+ border-radius: var(--lr-radius);
159
+ background: var(--lr-color-surface-overlay);
160
+ box-shadow: var(--lr-shadow-m);
161
+ pointer-events: auto;
162
+ overflow-wrap: anywhere;
163
+ }
164
+ .maplibregl-popup-close-button {
165
+ position: absolute;
166
+ inset-block-start: 0;
167
+ inset-inline-end: 0;
168
+ display: inline-flex;
169
+ align-items: center;
170
+ justify-content: center;
171
+ min-inline-size: var(--lr-icon-button-size);
172
+ min-block-size: var(--lr-icon-button-size);
173
+ padding: 0;
174
+ border: 0;
175
+ border-radius: var(--lr-radius);
176
+ background: transparent;
177
+ color: var(--lr-color-text-quiet);
178
+ font: inherit;
179
+ cursor: pointer;
180
+ }
181
+ .maplibregl-popup-close-button:hover {
182
+ background: var(--lr-color-brand-quiet);
183
+ color: var(--lr-color-brand);
184
+ }
185
+ .maplibregl-popup-close-button:active {
186
+ background: color-mix(in oklab, var(--lr-color-brand-quiet), var(--lr-color-mix-partner) var(--lr-color-mix-active));
187
+ color: var(--lr-color-brand);
188
+ }
189
+ .maplibregl-popup-close-button:focus-visible {
190
+ outline: var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);
191
+ outline-offset: calc(-1 * var(--lr-focus-ring-offset));
25
192
  }
26
193
  /* Mirrors docx-viewer.styles.ts's identical [part='error'] treatment for the same "optional
27
194
  peer dependency missing" failure shape. */
@@ -69,15 +236,8 @@ import{css}from"lit";const styles=css`
69
236
  flex: 0 0 auto;
70
237
  }
71
238
 
72
- /* maplibre-gl injects its attribution/logo controls INTO [part='container'], i.e. into this
73
- shadow root -- which the consumer's document-level \`maplibre-gl.css\` (the import map-loader.ts
74
- tells them to add) can never reach across the shadow boundary. Without it the attribution
75
- control is an unstyled <details>/<summary>: the corner anchors have no positioning so the
76
- attribution flows in-line BELOW the canvas, and the <summary> shows the browser's default
77
- disclosure triangle (a stray "▼"). Porting the essential positioning + summary reset here --
78
- the same approach pdf-viewer.styles.ts uses for pdf.js's textLayer CSS -- anchors the
79
- attribution to the map corner as an overlay and removes the marker. Only the attribution/
80
- container rules are ported (this wrapper exposes no zoom/geolocate/etc. controls). */
239
+ /* MapLibre's attribution control is generated in the same shadow-local container. Keep it
240
+ anchored over the map and use Lyra's own surface, typography, and interaction tokens. */
81
241
  .maplibregl-ctrl-top-left,
82
242
  .maplibregl-ctrl-top-right,
83
243
  .maplibregl-ctrl-bottom-left,
@@ -105,6 +265,7 @@ import{css}from"lit";const styles=css`
105
265
  .maplibregl-ctrl {
106
266
  margin: var(--lr-space-xs);
107
267
  pointer-events: auto;
268
+ transform: translate(0);
108
269
  }
109
270
  .maplibregl-ctrl-attrib {
110
271
  padding: 0 var(--lr-space-xs);
@@ -120,6 +281,43 @@ import{css}from"lit";const styles=css`
120
281
  .maplibregl-ctrl-attrib a:hover {
121
282
  text-decoration: underline;
122
283
  }
284
+ .maplibregl-ctrl-attrib-inner {
285
+ overflow-wrap: anywhere;
286
+ }
287
+ .maplibregl-ctrl-attrib-button {
288
+ display: none;
289
+ position: absolute;
290
+ inset-block-start: 0;
291
+ inset-inline-end: 0;
292
+ inline-size: var(--lr-icon-button-size);
293
+ block-size: var(--lr-icon-button-size);
294
+ padding: 0;
295
+ border: 0;
296
+ border-radius: var(--lr-radius-pill);
297
+ background: transparent;
298
+ color: var(--lr-color-text);
299
+ cursor: pointer;
300
+ }
301
+ .maplibregl-ctrl-attrib.maplibregl-compact {
302
+ position: relative;
303
+ min-block-size: var(--lr-icon-button-size);
304
+ padding-inline-end: var(--lr-icon-button-size);
305
+ }
306
+ .maplibregl-ctrl-attrib.maplibregl-compact .maplibregl-ctrl-attrib-inner {
307
+ display: none;
308
+ }
309
+ .maplibregl-ctrl-attrib.maplibregl-compact .maplibregl-ctrl-attrib-button,
310
+ .maplibregl-ctrl-attrib.maplibregl-compact-show .maplibregl-ctrl-attrib-inner {
311
+ display: block;
312
+ }
313
+ .maplibregl-ctrl-attrib-button:hover,
314
+ .maplibregl-ctrl-attrib-button:active {
315
+ background: var(--lr-color-brand-quiet);
316
+ }
317
+ .maplibregl-ctrl-attrib-button:focus-visible {
318
+ outline: var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);
319
+ outline-offset: calc(-1 * var(--lr-focus-ring-offset));
320
+ }
123
321
  /* Remove the native <summary> disclosure marker (the stray "▼") on the compact-toggle button. */
124
322
  .maplibregl-ctrl-attrib summary {
125
323
  list-style: none;
@@ -3,6 +3,7 @@ import{css}from"lit";const styles=css`
3
3
  display: block;
4
4
  color: var(--controls-color, var(--lr-color-text));
5
5
  container-type: inline-size;
6
+ contain-intrinsic-inline-size: var(--lr-size-20rem);
6
7
  }
7
8
 
8
9
  :host([hidden]) {
@@ -2,6 +2,7 @@ import{css}from"lit";const styles=css`
2
2
  :host {
3
3
  display: block;
4
4
  container-type: inline-size;
5
+ contain-intrinsic-inline-size: var(--lr-size-20rem);
5
6
  color: var(--lr-color-text);
6
7
  }
7
8
 
@@ -10,6 +10,7 @@ import{css}from"lit";const styles=css`
10
10
  border-radius: var(--lr-radius);
11
11
  background: var(--lr-color-surface-raised);
12
12
  container-type: inline-size;
13
+ contain-intrinsic-inline-size: var(--lr-size-20rem);
13
14
  }
14
15
 
15
16
  [part='iframe'] {
@@ -2,6 +2,7 @@ import{css}from"lit";const styles=css`
2
2
  :host {
3
3
  display: block;
4
4
  container-type: inline-size;
5
+ contain-intrinsic-inline-size: var(--lr-size-20rem);
5
6
  }
6
7
  [part='list'] {
7
8
  display: flex;