@mcp-b/geo-support 0.2.19 → 0.3.1

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 (48) hide show
  1. package/dist/base/control-placement.d.ts +6 -0
  2. package/dist/base/control-placement.d.ts.map +1 -0
  3. package/dist/base/control-placement.js +84 -0
  4. package/dist/base/control-placement.js.map +1 -0
  5. package/dist/base/find-map-element.d.ts +17 -0
  6. package/dist/base/find-map-element.d.ts.map +1 -0
  7. package/dist/base/find-map-element.js +34 -0
  8. package/dist/base/find-map-element.js.map +1 -0
  9. package/dist/base/geo-map-element.d.ts +17 -3
  10. package/dist/base/geo-map-element.d.ts.map +1 -1
  11. package/dist/base/geo-map-element.js +42 -1
  12. package/dist/base/geo-map-element.js.map +1 -1
  13. package/dist/base/popup-content.d.ts +9 -0
  14. package/dist/base/popup-content.d.ts.map +1 -0
  15. package/dist/base/popup-content.js +13 -0
  16. package/dist/base/popup-content.js.map +1 -0
  17. package/dist/classification/algorithms.d.ts +2 -1
  18. package/dist/classification/algorithms.d.ts.map +1 -1
  19. package/dist/classification/algorithms.js +14 -3
  20. package/dist/classification/algorithms.js.map +1 -1
  21. package/dist/components/classify-panel/classify-panel.d.ts.map +1 -1
  22. package/dist/components/classify-panel/classify-panel.js +30 -19
  23. package/dist/components/classify-panel/classify-panel.js.map +1 -1
  24. package/dist/components/classify-panel/classify-panel.styles.d.ts.map +1 -1
  25. package/dist/components/classify-panel/classify-panel.styles.js +39 -27
  26. package/dist/components/classify-panel/classify-panel.styles.js.map +1 -1
  27. package/dist/components/legend/legend.d.ts +2 -0
  28. package/dist/components/legend/legend.d.ts.map +1 -1
  29. package/dist/components/legend/legend.js +25 -10
  30. package/dist/components/legend/legend.js.map +1 -1
  31. package/dist/components/legend/legend.styles.d.ts.map +1 -1
  32. package/dist/components/legend/legend.styles.js +34 -15
  33. package/dist/components/legend/legend.styles.js.map +1 -1
  34. package/dist/docs/custom-elements.json +170 -5
  35. package/dist/styles/control.styles.d.ts +4 -0
  36. package/dist/styles/control.styles.d.ts.map +1 -0
  37. package/dist/styles/control.styles.js +14 -0
  38. package/dist/styles/control.styles.js.map +1 -0
  39. package/dist/styles/map-child.styles.d.ts +8 -0
  40. package/dist/styles/map-child.styles.d.ts.map +1 -0
  41. package/dist/styles/map-child.styles.js +12 -0
  42. package/dist/styles/map-child.styles.js.map +1 -0
  43. package/dist/styles/map-host.styles.d.ts.map +1 -1
  44. package/dist/styles/map-host.styles.js +5 -0
  45. package/dist/styles/map-host.styles.js.map +1 -1
  46. package/dist/types/map.d.ts +2 -0
  47. package/dist/types/map.d.ts.map +1 -1
  48. package/package.json +2 -2
@@ -7,31 +7,39 @@ export default css `
7
7
  color: var(--sigvelo-color-text, #1a1a1a);
8
8
  }
9
9
 
10
- .panel {
10
+ .sigvelo-geo-panel {
11
11
  background: var(--sigvelo-color-surface, #fff);
12
12
  border: 1px solid var(--sigvelo-color-neutral-border-muted, #ddd);
13
13
  border-radius: var(--sigvelo-radius-md, 6px);
14
- padding: 0.75rem;
14
+ padding: var(--sigvelo-spacing-3);
15
15
  box-shadow: var(--sigvelo-elevation-floating, 0 2px 8px rgb(0 0 0 / 0.12));
16
16
  width: 240px;
17
17
  }
18
18
 
19
- .panel__header {
19
+ .sigvelo-geo-panel__header {
20
20
  display: flex;
21
+ width: 100%;
22
+ min-height: var(--sigvelo-control-height-xs);
23
+ padding: 0;
24
+ border: 0;
25
+ background: transparent;
26
+ color: inherit;
27
+ font: inherit;
28
+ text-align: start;
21
29
  justify-content: space-between;
22
30
  align-items: center;
23
31
  cursor: pointer;
24
- gap: 0.5rem;
32
+ gap: var(--sigvelo-spacing-2);
25
33
  user-select: none;
26
- margin-bottom: 0.5rem;
34
+ margin-bottom: var(--sigvelo-spacing-2);
27
35
  }
28
36
 
29
- .panel__title {
30
- font-weight: 600;
37
+ .sigvelo-geo-panel__title {
38
+ font-weight: var(--sigvelo-font-weight-semibold);
31
39
  white-space: nowrap;
32
40
  }
33
41
 
34
- .panel__chevron {
42
+ .sigvelo-geo-panel__chevron {
35
43
  width: 16px;
36
44
  height: 16px;
37
45
  flex-shrink: 0;
@@ -39,57 +47,61 @@ export default css `
39
47
  fill: currentColor;
40
48
  }
41
49
 
42
- :host([collapsed]) .panel__chevron {
50
+ @media (prefers-reduced-motion: reduce) {
51
+ .sigvelo-geo-panel__chevron {
52
+ transition: none;
53
+ }
54
+ }
55
+
56
+ :host([collapsed]) .sigvelo-geo-panel__chevron {
43
57
  transform: rotate(-90deg);
44
58
  }
45
59
 
46
- .panel__fields {
60
+ .sigvelo-geo-panel__fields {
47
61
  display: flex;
48
62
  flex-direction: column;
49
- gap: 0.625rem;
63
+ gap: var(--sigvelo-spacing-2-5);
50
64
  }
51
65
 
52
- .panel__field {
66
+ .sigvelo-geo-panel__field {
53
67
  display: flex;
54
68
  flex-direction: column;
55
- gap: 0.125rem;
69
+ gap: var(--sigvelo-spacing-0-5);
56
70
  }
57
71
 
58
- .panel__label {
59
- font-weight: 500;
60
- font-size: 0.75rem;
72
+ .sigvelo-geo-panel__label {
73
+ font-weight: var(--sigvelo-font-weight-semibold);
74
+ font-size: var(--sigvelo-control-text-xs);
61
75
  color: var(--sigvelo-color-text-muted, #666);
62
76
  }
63
77
 
64
78
  select {
65
- appearance: none;
66
79
  background: var(--sigvelo-color-surface, #fff);
67
80
  border: 1px solid var(--sigvelo-color-neutral-border-muted, #ddd);
68
81
  border-radius: var(--sigvelo-radius-sm, 4px);
69
- padding: 0.25rem 1.5rem 0.25rem 0.5rem;
82
+ padding: var(--sigvelo-spacing-1) var(--sigvelo-spacing-2);
83
+ min-height: var(--sigvelo-control-height-xs);
70
84
  font: inherit;
71
85
  color: inherit;
72
86
  cursor: pointer;
73
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath d='M3 4.5L6 7.5L9 4.5' fill='none' stroke='%23666' stroke-width='1.5' stroke-linecap='round'/%3E%3C/svg%3E");
74
- background-repeat: no-repeat;
75
- background-position: right 0.375rem center;
76
87
  }
77
88
 
78
- select:focus-visible {
79
- outline: var(--sigvelo-border-style, solid) 2px var(--sigvelo-color-focus, #4a97f4);
80
- outline-offset: 1px;
89
+ select:focus-visible,
90
+ button:focus-visible {
91
+ outline: var(--sigvelo-focus-ring);
92
+ outline-offset: var(--sigvelo-focus-offset);
81
93
  }
82
94
 
83
- .panel__color-bar {
95
+ .sigvelo-geo-panel__color-bar {
84
96
  display: flex;
85
97
  gap: 1px;
86
- margin-top: 0.25rem;
98
+ margin-top: var(--sigvelo-spacing-1);
87
99
  height: 12px;
88
100
  border-radius: var(--sigvelo-radius-xs, 2px);
89
101
  overflow: hidden;
90
102
  }
91
103
 
92
- .panel__color-bar-segment {
104
+ .sigvelo-geo-panel__color-bar-segment {
93
105
  flex: 1;
94
106
  }
95
107
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"classify-panel.styles.js","sourceRoot":"","sources":["../../../src/components/classify-panel/classify-panel.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,eAAe,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6FjB,CAAC"}
1
+ {"version":3,"file":"classify-panel.styles.js","sourceRoot":"","sources":["../../../src/components/classify-panel/classify-panel.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,eAAe,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyGjB,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { type PropertyValues } from "lit";
1
2
  import { SigveloElement } from "@mcp-b/wc-support/base/sigvelo-element";
2
3
  /**
3
4
  * Displays a color-coded legend for classified/choropleth maps.
@@ -35,6 +36,7 @@ export declare class SigveloGeoLegend extends SigveloElement {
35
36
  private _unsubscribe;
36
37
  connectedCallback(): void;
37
38
  disconnectedCallback(): void;
39
+ protected updated(changed: PropertyValues): void;
38
40
  /** @internal */
39
41
  private _subscribeChannel;
40
42
  private _formatNumber;
@@ -1 +1 @@
1
- {"version":3,"file":"legend.d.ts","sourceRoot":"","sources":["../../../src/components/legend/legend.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AAaxE;;;;;;;;;;;;;;;;GAgBG;AACH,qBACa,gBAAiB,SAAQ,cAAc;IAClD,MAAM,CAAC,MAAM,4BAAwB;IAErC;;;OAGG;IACS,OAAO,SAAM;IAEzB,oFAAoF;IACpD,MAAM,EAAE,MAAM,EAAE,CAAM;IAEtD,iDAAiD;IACjB,MAAM,EAAE,MAAM,EAAE,CAAM;IAEtD,+DAA+D;IACnD,KAAK,SAAM;IAEvB,uEAAuE;IAC3B,SAAS,UAAS;IAE9D,gBAAgB;IAChB,OAAO,CAAC,YAAY,CAA6B;IAEjD,iBAAiB;IAKjB,oBAAoB;IAMpB,gBAAgB;IAChB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,gBAAgB;IAIxB,MAAM;CA8BP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,oBAAoB,EAAE,gBAAgB,CAAC;KACxC;CACF"}
1
+ {"version":3,"file":"legend.d.ts","sourceRoot":"","sources":["../../../src/components/legend/legend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAEzD,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AAaxE;;;;;;;;;;;;;;;;GAgBG;AACH,qBACa,gBAAiB,SAAQ,cAAc;IAClD,MAAM,CAAC,MAAM,4BAAwB;IAErC;;;OAGG;IACS,OAAO,SAAM;IAEzB,oFAAoF;IACpD,MAAM,EAAE,MAAM,EAAE,CAAM;IAEtD,iDAAiD;IACjB,MAAM,EAAE,MAAM,EAAE,CAAM;IAEtD,+DAA+D;IACnD,KAAK,SAAM;IAEvB,uEAAuE;IAC3B,SAAS,UAAS;IAE9D,gBAAgB;IAChB,OAAO,CAAC,YAAY,CAA6B;IAEjD,iBAAiB;IAKjB,oBAAoB;IAMpB,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc;IAIzC,gBAAgB;IAChB,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,gBAAgB;IAIxB,MAAM;CAwCP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,oBAAoB,EAAE,gBAAgB,CAAC;KACxC;CACF"}
@@ -11,7 +11,7 @@ import hostStyles from "@mcp-b/wc-support/styles/host.styles";
11
11
  import { subscribeClassify } from "../../classification/channel.js";
12
12
  import styles from "./legend.styles.js";
13
13
  const chevronSvg = html `
14
- <svg class="legend__chevron" viewBox="0 0 16 16" aria-hidden="true">
14
+ <svg class="sigvelo-geo-legend__chevron" viewBox="0 0 16 16" aria-hidden="true">
15
15
  <path
16
16
  d="M4.94 2.94a1.5 1.5 0 0 1 2.12 0L12 7.88a.17.17 0 0 1 0 .24l-4.94 4.94a1.5 1.5 0 0 1-2.12-2.12L8.88 7l-.94-.94L4.94 5.06a1.5 1.5 0 0 1 0-2.12Z"
17
17
  />
@@ -62,10 +62,15 @@ let SigveloGeoLegend = class SigveloGeoLegend extends SigveloElement {
62
62
  this._unsubscribe?.();
63
63
  this._unsubscribe = null;
64
64
  }
65
+ updated(changed) {
66
+ if (changed.has("channel"))
67
+ this._subscribeChannel();
68
+ }
65
69
  /** @internal */
66
70
  _subscribeChannel() {
67
71
  this._unsubscribe?.();
68
- if (!this.channel)
72
+ this._unsubscribe = null;
73
+ if (!this.isConnected || !this.channel)
69
74
  return;
70
75
  this._unsubscribe = subscribeClassify(this.channel, (detail) => {
71
76
  this.breaks = detail.breaks;
@@ -82,11 +87,15 @@ let SigveloGeoLegend = class SigveloGeoLegend extends SigveloElement {
82
87
  render() {
83
88
  const items = !this.collapsed && this.colors.length > 0 && this.breaks.length > this.colors.length
84
89
  ? html `
85
- <div class="legend__items">
90
+ <div class="sigvelo-geo-legend__items">
86
91
  ${this.colors.map((color, i) => html `
87
- <div class="legend__item" part="item">
88
- <span class="legend__swatch" part="swatch" style="background:${color}"></span>
89
- <span class="legend__label" part="label">
92
+ <div class="sigvelo-geo-legend__item" part="item">
93
+ <span
94
+ class="sigvelo-geo-legend__swatch"
95
+ part="swatch"
96
+ style="background:${color}"
97
+ ></span>
98
+ <span class="sigvelo-geo-legend__label" part="label">
90
99
  ${this._formatNumber(this.breaks[i])} &ndash;
91
100
  ${this._formatNumber(this.breaks[i + 1])}
92
101
  </span>
@@ -96,11 +105,17 @@ let SigveloGeoLegend = class SigveloGeoLegend extends SigveloElement {
96
105
  `
97
106
  : nothing;
98
107
  return html `
99
- <div class="legend" part="container">
100
- <div class="legend__header" part="title" @click=${this._toggleCollapsed}>
101
- <span class="legend__title">${this.title || "Legend"}</span>
108
+ <div class="sigvelo-geo-legend" part="container">
109
+ <button
110
+ type="button"
111
+ class="sigvelo-geo-legend__header"
112
+ part="title"
113
+ aria-expanded=${!this.collapsed}
114
+ @click=${this._toggleCollapsed}
115
+ >
116
+ <span class="sigvelo-geo-legend__title">${this.title || "Legend"}</span>
102
117
  ${chevronSvg}
103
- </div>
118
+ </button>
104
119
  ${items}
105
120
  </div>
106
121
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"legend.js","sourceRoot":"","sources":["../../../src/components/legend/legend.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"legend.js","sourceRoot":"","sources":["../../../src/components/legend/legend.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"legend.styles.d.ts","sourceRoot":"","sources":["../../../src/components/legend/legend.styles.ts"],"names":[],"mappings":";AAEA,wBAyEE"}
1
+ {"version":3,"file":"legend.styles.d.ts","sourceRoot":"","sources":["../../../src/components/legend/legend.styles.ts"],"names":[],"mappings":";AAEA,wBA4FE"}
@@ -7,33 +7,46 @@ export default css `
7
7
  color: var(--sigvelo-color-text, #1a1a1a);
8
8
  }
9
9
 
10
- .legend {
10
+ .sigvelo-geo-legend {
11
11
  background: var(--sigvelo-color-surface, #fff);
12
12
  border: 1px solid var(--sigvelo-color-neutral-border-muted, #ddd);
13
13
  border-radius: var(--sigvelo-radius-md, 6px);
14
- padding: 0.5rem 0.75rem;
14
+ padding: var(--sigvelo-spacing-2) var(--sigvelo-spacing-3);
15
15
  box-shadow: var(--sigvelo-elevation-floating, 0 2px 8px rgb(0 0 0 / 0.12));
16
16
  min-width: 140px;
17
17
  max-width: 220px;
18
18
  }
19
19
 
20
- .legend__header {
20
+ .sigvelo-geo-legend__header {
21
21
  display: flex;
22
+ width: 100%;
23
+ min-height: var(--sigvelo-control-height-xs);
24
+ padding: 0;
25
+ border: 0;
26
+ background: transparent;
27
+ color: inherit;
28
+ font: inherit;
29
+ text-align: start;
22
30
  justify-content: space-between;
23
31
  align-items: center;
24
32
  cursor: pointer;
25
- gap: 0.5rem;
33
+ gap: var(--sigvelo-spacing-2);
26
34
  user-select: none;
27
35
  }
28
36
 
29
- .legend__title {
30
- font-weight: 600;
37
+ button:focus-visible {
38
+ outline: var(--sigvelo-focus-ring);
39
+ outline-offset: var(--sigvelo-focus-offset);
40
+ }
41
+
42
+ .sigvelo-geo-legend__title {
43
+ font-weight: var(--sigvelo-font-weight-semibold);
31
44
  white-space: nowrap;
32
45
  overflow: hidden;
33
46
  text-overflow: ellipsis;
34
47
  }
35
48
 
36
- .legend__chevron {
49
+ .sigvelo-geo-legend__chevron {
37
50
  width: 16px;
38
51
  height: 16px;
39
52
  flex-shrink: 0;
@@ -41,25 +54,31 @@ export default css `
41
54
  fill: currentColor;
42
55
  }
43
56
 
44
- :host([collapsed]) .legend__chevron {
57
+ @media (prefers-reduced-motion: reduce) {
58
+ .sigvelo-geo-legend__chevron {
59
+ transition: none;
60
+ }
61
+ }
62
+
63
+ :host([collapsed]) .sigvelo-geo-legend__chevron {
45
64
  transform: rotate(-90deg);
46
65
  }
47
66
 
48
- .legend__items {
49
- margin-top: 0.375rem;
67
+ .sigvelo-geo-legend__items {
68
+ margin-top: var(--sigvelo-spacing-1-5);
50
69
  display: flex;
51
70
  flex-direction: column;
52
- gap: 0.125rem;
71
+ gap: var(--sigvelo-spacing-0-5);
53
72
  }
54
73
 
55
- .legend__item {
74
+ .sigvelo-geo-legend__item {
56
75
  display: flex;
57
76
  align-items: center;
58
- gap: 0.5rem;
77
+ gap: var(--sigvelo-spacing-2);
59
78
  padding: 0.0625rem 0;
60
79
  }
61
80
 
62
- .legend__swatch {
81
+ .sigvelo-geo-legend__swatch {
63
82
  width: 18px;
64
83
  height: 18px;
65
84
  border-radius: var(--sigvelo-radius-xs, 2px);
@@ -67,7 +86,7 @@ export default css `
67
86
  border: 1px solid var(--sigvelo-color-neutral-border-subtle, #e5e5e5);
68
87
  }
69
88
 
70
- .legend__label {
89
+ .sigvelo-geo-legend__label {
71
90
  white-space: nowrap;
72
91
  overflow: hidden;
73
92
  text-overflow: ellipsis;
@@ -1 +1 @@
1
- {"version":3,"file":"legend.styles.js","sourceRoot":"","sources":["../../../src/components/legend/legend.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,eAAe,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyEjB,CAAC"}
1
+ {"version":3,"file":"legend.styles.js","sourceRoot":"","sources":["../../../src/components/legend/legend.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,eAAe,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4FjB,CAAC"}
@@ -2,6 +2,92 @@
2
2
  "schemaVersion": "1.0.0",
3
3
  "readme": "",
4
4
  "modules": [
5
+ {
6
+ "kind": "javascript-module",
7
+ "path": "src/base/control-placement.ts",
8
+ "declarations": [
9
+ {
10
+ "kind": "function",
11
+ "name": "placeControl",
12
+ "return": {
13
+ "type": {
14
+ "text": "() => void"
15
+ }
16
+ },
17
+ "parameters": [
18
+ {
19
+ "name": "control",
20
+ "type": {
21
+ "text": "HTMLElement"
22
+ }
23
+ },
24
+ {
25
+ "name": "placeholder",
26
+ "type": {
27
+ "text": "HTMLElement"
28
+ }
29
+ },
30
+ {
31
+ "name": "map",
32
+ "type": {
33
+ "text": "HTMLElement"
34
+ }
35
+ }
36
+ ],
37
+ "description": "Keep slotted content in its owning control while the engine lays out an empty\nplaceholder. This also works for controls inside a composition's shadow root."
38
+ }
39
+ ],
40
+ "exports": [
41
+ {
42
+ "kind": "js",
43
+ "name": "placeControl",
44
+ "declaration": {
45
+ "name": "placeControl",
46
+ "module": "src/base/control-placement.ts"
47
+ }
48
+ }
49
+ ]
50
+ },
51
+ {
52
+ "kind": "javascript-module",
53
+ "path": "src/base/find-map-element.ts",
54
+ "declarations": [
55
+ {
56
+ "kind": "function",
57
+ "name": "findMapElement",
58
+ "return": {
59
+ "type": {
60
+ "text": "HTMLElementTagNameMap[K] | null"
61
+ }
62
+ },
63
+ "parameters": [
64
+ {
65
+ "name": "element",
66
+ "type": {
67
+ "text": "Element"
68
+ }
69
+ },
70
+ {
71
+ "name": "tagName",
72
+ "type": {
73
+ "text": "K"
74
+ }
75
+ }
76
+ ],
77
+ "description": "Find the map element enclosing a declarative map child, across shadow roots.\n\n`Element.closest()` stops at the shadow boundary, so a child silently\nno-ops whenever a host application composes these elements inside its own\ncomponent. This walks the shadow-including ancestors instead — up\n`parentNode`, and from a shadow root on to its host — so the nearest\nenclosing map wins exactly as it does within a single tree. Nesting is\ntherefore still resolved innermost-first: an outer map is only reached\nafter every closer ancestor has been rejected.\n\nThe walk follows nesting, not slot assignment. A child a host application\nslots into a map from outside the map's own tree is not found: slotting is\nnot resolved yet at the moment a child connects and looks its map up."
78
+ }
79
+ ],
80
+ "exports": [
81
+ {
82
+ "kind": "js",
83
+ "name": "findMapElement",
84
+ "declaration": {
85
+ "name": "findMapElement",
86
+ "module": "src/base/find-map-element.ts"
87
+ }
88
+ }
89
+ ]
90
+ },
5
91
  {
6
92
  "kind": "javascript-module",
7
93
  "path": "src/base/geo-map-element.ts",
@@ -11,6 +97,20 @@
11
97
  "description": "Abstract base class for all geo map components. Provides shared reactive\nproperties, ResizeObserver lifecycle, and abstract hooks for library-specific\nmap creation and updates.\n\nSubclasses must implement `createMap`, `destroyMap`, `updateView`, and\n`invalidateSize`.",
12
98
  "name": "GeoMapElement",
13
99
  "members": [
100
+ {
101
+ "kind": "method",
102
+ "name": "_initializeMap",
103
+ "privacy": "private"
104
+ },
105
+ {
106
+ "kind": "field",
107
+ "name": "_mapReady",
108
+ "type": {
109
+ "text": "Promise<void>"
110
+ },
111
+ "privacy": "private",
112
+ "default": "new Promise<void>((resolve) => { this._resolveMapReady = resolve; })"
113
+ },
14
114
  {
15
115
  "kind": "field",
16
116
  "name": "_resizeObserver",
@@ -165,9 +265,8 @@
165
265
  "text": "Promise<void>"
166
266
  },
167
267
  "privacy": "public",
168
- "readonly": true,
169
- "description": "Resolved when the underlying map instance is ready. Child components\n(markers, layers, controls) should await this before registering.",
170
- "default": "new Promise<void>((resolve) => { this._resolveMapReady = resolve; })"
268
+ "description": "Resolved when the current map instance is ready. A new promise is created\nafter disconnect, so awaiting this alone says nothing about which instance\nis current once it settles — children attach through whenMapReady,\nwhich resolves that question for them.",
269
+ "readonly": true
171
270
  },
172
271
  {
173
272
  "kind": "field",
@@ -189,6 +288,13 @@
189
288
  "description": "Minimum allowed zoom level.",
190
289
  "attribute": "min-zoom"
191
290
  },
291
+ {
292
+ "kind": "field",
293
+ "name": "pendingChildren",
294
+ "privacy": "private",
295
+ "static": true,
296
+ "default": "new WeakMap<Element, symbol>()"
297
+ },
192
298
  {
193
299
  "kind": "field",
194
300
  "name": "pitch",
@@ -218,6 +324,31 @@
218
324
  ],
219
325
  "description": "Update the map view when reactive properties change."
220
326
  },
327
+ {
328
+ "kind": "method",
329
+ "name": "whenMapReady",
330
+ "privacy": "public",
331
+ "return": {
332
+ "type": {
333
+ "text": "Promise<void>"
334
+ }
335
+ },
336
+ "parameters": [
337
+ {
338
+ "name": "child",
339
+ "type": {
340
+ "text": "Element"
341
+ }
342
+ },
343
+ {
344
+ "name": "attach",
345
+ "type": {
346
+ "text": "() => void"
347
+ }
348
+ }
349
+ ],
350
+ "description": "Attach `child` when the current map is ready, if its connection is still\ncurrent. Map disconnect replaces `mapReady`; a newer child connection\nsupersedes its previous wait, even when it reconnects to the same map.\nRun `attach` synchronously with these checks: returning a boolean would\nleave a microtask gap before registration where either could become stale."
351
+ },
221
352
  {
222
353
  "kind": "field",
223
354
  "name": "zoom",
@@ -311,6 +442,40 @@
311
442
  }
312
443
  ]
313
444
  },
445
+ {
446
+ "kind": "javascript-module",
447
+ "path": "src/base/popup-content.ts",
448
+ "declarations": [
449
+ {
450
+ "kind": "function",
451
+ "name": "clonePopupContent",
452
+ "return": {
453
+ "type": {
454
+ "text": "HTMLDivElement"
455
+ }
456
+ },
457
+ "parameters": [
458
+ {
459
+ "name": "popup",
460
+ "type": {
461
+ "text": "Element"
462
+ }
463
+ }
464
+ ],
465
+ "description": "Snapshot a `<sigvelo-*-popup>` child's content into a detached container the\nmap engine can own. Every engine takes a popup as a DOM element it inserts,\nmoves, and destroys on its own schedule, so it must not be handed the popup\nelement's live children — a deep clone leaves the declared markup intact for\nthe next render."
466
+ }
467
+ ],
468
+ "exports": [
469
+ {
470
+ "kind": "js",
471
+ "name": "clonePopupContent",
472
+ "declaration": {
473
+ "name": "clonePopupContent",
474
+ "module": "src/base/popup-content.ts"
475
+ }
476
+ }
477
+ ]
478
+ },
314
479
  {
315
480
  "kind": "javascript-module",
316
481
  "path": "src/classification/algorithms.ts",
@@ -337,7 +502,7 @@
337
502
  }
338
503
  }
339
504
  ],
340
- "description": "Returns the class index (0-based) for a value given a breaks array.\nThe breaks array has `numClasses + 1` entries: [min, break1, ..., max].\nReturns -1 for NaN/null/undefined values."
505
+ "description": "Returns the class index (0-based) for a value given a breaks array.\nThe breaks array has `numClasses + 1` entries: [min, break1, ..., max].\nReturns -1 when the value cannot be classified, including against an empty\nbreaks array — which is what the break functions return for no input."
341
506
  },
342
507
  {
343
508
  "kind": "function",
@@ -1792,7 +1957,7 @@
1792
1957
  "package": {
1793
1958
  "name": "@mcp-b/geo-support",
1794
1959
  "description": "Shared base classes, events, types, and styles for Sigvelo geo component libraries.",
1795
- "version": "0.2.19",
1960
+ "version": "0.3.1",
1796
1961
  "license": "MIT"
1797
1962
  }
1798
1963
  }
@@ -0,0 +1,4 @@
1
+ /** Controls retain their native slots; engine placeholders determine placement. */
2
+ declare const _default: import("lit").CSSResult;
3
+ export default _default;
4
+ //# sourceMappingURL=control.styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control.styles.d.ts","sourceRoot":"","sources":["../../src/styles/control.styles.ts"],"names":[],"mappings":"AAEA,mFAAmF;;AACnF,wBAUE"}
@@ -0,0 +1,14 @@
1
+ import { css } from "lit";
2
+ /** Controls retain their native slots; engine placeholders determine placement. */
3
+ export default css `
4
+ :host {
5
+ display: block;
6
+ position: absolute;
7
+ top: 0;
8
+ left: 0;
9
+ width: max-content;
10
+ z-index: 1;
11
+ pointer-events: auto;
12
+ }
13
+ `;
14
+ //# sourceMappingURL=control.styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control.styles.js","sourceRoot":"","sources":["../../src/styles/control.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,mFAAmF;AACnF,eAAe,GAAG,CAAA;;;;;;;;;;CAUjB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Shared styles for the declarative children of a map — markers, layers,
3
+ * shapes, popups, and overlays. They exist to configure the map engine, which
4
+ * owns every pixel they produce, so the elements themselves never render.
5
+ */
6
+ declare const _default: import("lit").CSSResult;
7
+ export default _default;
8
+ //# sourceMappingURL=map-child.styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-child.styles.d.ts","sourceRoot":"","sources":["../../src/styles/map-child.styles.ts"],"names":[],"mappings":"AAEA;;;;GAIG;;AACH,wBAIE"}
@@ -0,0 +1,12 @@
1
+ import { css } from "lit";
2
+ /**
3
+ * Shared styles for the declarative children of a map — markers, layers,
4
+ * shapes, popups, and overlays. They exist to configure the map engine, which
5
+ * owns every pixel they produce, so the elements themselves never render.
6
+ */
7
+ export default css `
8
+ :host {
9
+ display: none;
10
+ }
11
+ `;
12
+ //# sourceMappingURL=map-child.styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-child.styles.js","sourceRoot":"","sources":["../../src/styles/map-child.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B;;;;GAIG;AACH,eAAe,GAAG,CAAA;;;;CAIjB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"map-host.styles.d.ts","sourceRoot":"","sources":["../../src/styles/map-host.styles.ts"],"names":[],"mappings":"AAEA,sDAAsD;;AACtD,wBAaE"}
1
+ {"version":3,"file":"map-host.styles.d.ts","sourceRoot":"","sources":["../../src/styles/map-host.styles.ts"],"names":[],"mappings":"AAEA,sDAAsD;;AACtD,wBAkBE"}
@@ -5,9 +5,14 @@ export default css `
5
5
  display: block;
6
6
  position: relative;
7
7
  min-height: 300px;
8
+ overflow: hidden;
9
+ border: 1px solid var(--sigvelo-color-neutral-border-muted);
10
+ border-radius: var(--sigvelo-radius-md);
11
+ background: var(--sigvelo-color-surface-sunken);
8
12
  }
9
13
 
10
14
  .map-host {
15
+ isolation: isolate;
11
16
  width: 100%;
12
17
  height: 100%;
13
18
  position: absolute;
@@ -1 +1 @@
1
- {"version":3,"file":"map-host.styles.js","sourceRoot":"","sources":["../../src/styles/map-host.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,sDAAsD;AACtD,eAAe,GAAG,CAAA;;;;;;;;;;;;;CAajB,CAAC"}
1
+ {"version":3,"file":"map-host.styles.js","sourceRoot":"","sources":["../../src/styles/map-host.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,sDAAsD;AACtD,eAAe,GAAG,CAAA;;;;;;;;;;;;;;;;;;CAkBjB,CAAC"}