@sekiui/elements 0.1.6 → 0.1.7

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 (213) hide show
  1. package/dist/cjs/accordion-ids-Cjq6aIVd.js +42 -0
  2. package/dist/cjs/direction-Dt-r6_ec.js +14 -0
  3. package/dist/cjs/host-id-C3XieWsk.js +32 -0
  4. package/dist/cjs/layout-DR0fTNAb.js +109 -0
  5. package/dist/cjs/loader.cjs.js +1 -1
  6. package/dist/cjs/seki-accordion-content.cjs.entry.js +27 -25
  7. package/dist/cjs/seki-accordion-item.cjs.entry.js +13 -29
  8. package/dist/cjs/seki-accordion-trigger.cjs.entry.js +36 -28
  9. package/dist/cjs/seki-accordion.cjs.entry.js +18 -12
  10. package/dist/cjs/seki-carousel-dots.cjs.entry.js +15 -7
  11. package/dist/cjs/seki-carousel-next.cjs.entry.js +1 -1
  12. package/dist/cjs/seki-carousel-previous.cjs.entry.js +1 -1
  13. package/dist/cjs/seki-carousel.cjs.entry.js +51 -6
  14. package/dist/cjs/seki-combobox.cjs.entry.js +80 -1
  15. package/dist/cjs/seki-context-menu-content.cjs.entry.js +13 -16
  16. package/dist/cjs/seki-context-menu.cjs.entry.js +14 -9
  17. package/dist/cjs/seki-dropdown-menu-content.cjs.entry.js +13 -16
  18. package/dist/cjs/seki-dropdown-menu-trigger.cjs.entry.js +7 -15
  19. package/dist/cjs/seki-dropdown-menu.cjs.entry.js +14 -9
  20. package/dist/cjs/seki-hover-card-content.cjs.entry.js +27 -33
  21. package/dist/cjs/seki-hover-card-trigger.cjs.entry.js +10 -25
  22. package/dist/cjs/seki-hover-card.cjs.entry.js +7 -6
  23. package/dist/cjs/seki-radio-group-item.cjs.entry.js +18 -1
  24. package/dist/cjs/seki-radio-group.cjs.entry.js +8 -1
  25. package/dist/cjs/seki-resizable-handle.cjs.entry.js +72 -15
  26. package/dist/cjs/seki-resizable-panel-group.cjs.entry.js +11 -107
  27. package/dist/cjs/seki-resizable-panel.cjs.entry.js +5 -3
  28. package/dist/cjs/seki-tabs-content.cjs.entry.js +21 -19
  29. package/dist/cjs/seki-tabs-list.cjs.entry.js +8 -24
  30. package/dist/cjs/seki-tabs-trigger.cjs.entry.js +23 -31
  31. package/dist/cjs/seki-tabs.cjs.entry.js +15 -18
  32. package/dist/cjs/sekiui.cjs.js +1 -1
  33. package/dist/cjs/{tab-ids-BzpIZnUS.js → tab-ids-BOdn1Fu2.js} +14 -0
  34. package/dist/collection/collection-manifest.json +2 -2
  35. package/dist/collection/components/accordion/accordion-ids.js +36 -0
  36. package/dist/collection/components/accordion/seki-accordion-content.js +27 -25
  37. package/dist/collection/components/accordion/seki-accordion-item.js +12 -29
  38. package/dist/collection/components/accordion/seki-accordion-trigger.css +6 -2
  39. package/dist/collection/components/accordion/seki-accordion-trigger.js +37 -28
  40. package/dist/collection/components/accordion/seki-accordion.js +40 -11
  41. package/dist/collection/components/carousel/seki-carousel-dots.js +15 -7
  42. package/dist/collection/components/carousel/seki-carousel-navigation.css +9 -4
  43. package/dist/collection/components/carousel/seki-carousel.js +51 -6
  44. package/dist/collection/components/combobox/seki-combobox.js +103 -1
  45. package/dist/collection/components/context-menu/seki-context-menu-content.js +13 -16
  46. package/dist/collection/components/context-menu/seki-context-menu.js +31 -9
  47. package/dist/collection/components/dropdown-menu/seki-dropdown-menu-content.js +13 -16
  48. package/dist/collection/components/dropdown-menu/seki-dropdown-menu-trigger.js +7 -15
  49. package/dist/collection/components/dropdown-menu/seki-dropdown-menu.js +31 -9
  50. package/dist/collection/components/hover-card/seki-hover-card-content.js +27 -33
  51. package/dist/collection/components/hover-card/seki-hover-card-trigger.js +10 -25
  52. package/dist/collection/components/hover-card/seki-hover-card.js +24 -6
  53. package/dist/collection/components/radio-group/seki-radio-group-item.js +18 -1
  54. package/dist/collection/components/radio-group/seki-radio-group.js +25 -1
  55. package/dist/collection/components/resizable/layout.js +2 -0
  56. package/dist/collection/components/resizable/seki-resizable-handle.css +6 -2
  57. package/dist/collection/components/resizable/seki-resizable-handle.js +71 -14
  58. package/dist/collection/components/resizable/seki-resizable-panel-group.js +5 -2
  59. package/dist/collection/components/resizable/seki-resizable-panel.js +5 -3
  60. package/dist/collection/components/tabs/seki-tabs-content.js +24 -19
  61. package/dist/collection/components/tabs/seki-tabs-list.js +8 -24
  62. package/dist/collection/components/tabs/seki-tabs-trigger.js +24 -19
  63. package/dist/collection/components/tabs/seki-tabs.js +34 -18
  64. package/dist/collection/components/tabs/tab-ids.js +13 -0
  65. package/dist/collection/utils/host-id.js +27 -0
  66. package/dist/components/p-BD28aG2U.js +12 -0
  67. package/dist/components/p-BuvZJ6_r.js +39 -0
  68. package/dist/components/p-DmN32Mrm.js +103 -0
  69. package/dist/components/{p-CmuSriLz.js → p-bxPJJ6k4.js} +14 -1
  70. package/dist/components/p-ppXRAghy.js +29 -0
  71. package/dist/components/seki-accordion-content.js +27 -25
  72. package/dist/components/seki-accordion-item.js +12 -29
  73. package/dist/components/seki-accordion-trigger.js +38 -29
  74. package/dist/components/seki-accordion.js +22 -13
  75. package/dist/components/seki-carousel-dots.js +15 -7
  76. package/dist/components/seki-carousel-next.js +1 -1
  77. package/dist/components/seki-carousel-previous.js +1 -1
  78. package/dist/components/seki-carousel.js +51 -6
  79. package/dist/components/seki-combobox.js +81 -2
  80. package/dist/components/seki-context-menu-content.js +13 -16
  81. package/dist/components/seki-context-menu.js +14 -9
  82. package/dist/components/seki-dropdown-menu-content.js +13 -16
  83. package/dist/components/seki-dropdown-menu-trigger.js +7 -15
  84. package/dist/components/seki-dropdown-menu.js +14 -9
  85. package/dist/components/seki-hover-card-content.js +27 -33
  86. package/dist/components/seki-hover-card-trigger.js +10 -25
  87. package/dist/components/seki-hover-card.js +7 -6
  88. package/dist/components/seki-radio-group-item.js +18 -1
  89. package/dist/components/seki-radio-group.js +8 -1
  90. package/dist/components/seki-resizable-handle.js +72 -15
  91. package/dist/components/seki-resizable-panel-group.js +6 -102
  92. package/dist/components/seki-resizable-panel.js +5 -3
  93. package/dist/components/seki-tabs-content.js +23 -19
  94. package/dist/components/seki-tabs-list.js +8 -24
  95. package/dist/components/seki-tabs-trigger.js +25 -31
  96. package/dist/components/seki-tabs.js +16 -18
  97. package/dist/esm/accordion-ids-D58tRFZv.js +39 -0
  98. package/dist/esm/direction-BD28aG2U.js +12 -0
  99. package/dist/esm/host-id-ppXRAghy.js +29 -0
  100. package/dist/esm/layout-DmN32Mrm.js +103 -0
  101. package/dist/esm/loader.js +1 -1
  102. package/dist/esm/seki-accordion-content.entry.js +27 -25
  103. package/dist/esm/seki-accordion-item.entry.js +13 -29
  104. package/dist/esm/seki-accordion-trigger.entry.js +36 -28
  105. package/dist/esm/seki-accordion.entry.js +18 -12
  106. package/dist/esm/seki-carousel-dots.entry.js +15 -7
  107. package/dist/esm/seki-carousel-next.entry.js +1 -1
  108. package/dist/esm/seki-carousel-previous.entry.js +1 -1
  109. package/dist/esm/seki-carousel.entry.js +51 -6
  110. package/dist/esm/seki-combobox.entry.js +80 -1
  111. package/dist/esm/seki-context-menu-content.entry.js +13 -16
  112. package/dist/esm/seki-context-menu.entry.js +14 -9
  113. package/dist/esm/seki-dropdown-menu-content.entry.js +13 -16
  114. package/dist/esm/seki-dropdown-menu-trigger.entry.js +7 -15
  115. package/dist/esm/seki-dropdown-menu.entry.js +14 -9
  116. package/dist/esm/seki-hover-card-content.entry.js +27 -33
  117. package/dist/esm/seki-hover-card-trigger.entry.js +10 -25
  118. package/dist/esm/seki-hover-card.entry.js +7 -6
  119. package/dist/esm/seki-radio-group-item.entry.js +18 -1
  120. package/dist/esm/seki-radio-group.entry.js +8 -1
  121. package/dist/esm/seki-resizable-handle.entry.js +72 -15
  122. package/dist/esm/seki-resizable-panel-group.entry.js +6 -102
  123. package/dist/esm/seki-resizable-panel.entry.js +5 -3
  124. package/dist/esm/seki-tabs-content.entry.js +21 -19
  125. package/dist/esm/seki-tabs-list.entry.js +8 -24
  126. package/dist/esm/seki-tabs-trigger.entry.js +22 -30
  127. package/dist/esm/seki-tabs.entry.js +15 -18
  128. package/dist/esm/sekiui.js +1 -1
  129. package/dist/esm/{tab-ids-CmuSriLz.js → tab-ids-bxPJJ6k4.js} +14 -1
  130. package/dist/sekiui/p-05646b3d.entry.js +1 -0
  131. package/dist/sekiui/p-06307251.entry.js +1 -0
  132. package/dist/sekiui/p-13206751.entry.js +1 -0
  133. package/dist/sekiui/p-2681547f.entry.js +1 -0
  134. package/dist/sekiui/p-34880473.entry.js +1 -0
  135. package/dist/sekiui/{p-3a950a93.entry.js → p-44c4e0ca.entry.js} +1 -1
  136. package/dist/sekiui/p-45d3e21b.entry.js +1 -0
  137. package/dist/sekiui/p-5a222bfa.entry.js +1 -0
  138. package/dist/sekiui/p-68d2ef55.entry.js +1 -0
  139. package/dist/sekiui/p-78df4dc1.entry.js +1 -0
  140. package/dist/sekiui/p-81e180e1.entry.js +1 -0
  141. package/dist/sekiui/{p-5cb2a9fc.entry.js → p-99aba093.entry.js} +1 -1
  142. package/dist/sekiui/p-BD28aG2U.js +1 -0
  143. package/dist/sekiui/p-BuvZJ6_r.js +1 -0
  144. package/dist/sekiui/p-DmN32Mrm.js +1 -0
  145. package/dist/sekiui/p-ad26ccd9.entry.js +1 -0
  146. package/dist/sekiui/p-b3260d62.entry.js +1 -0
  147. package/dist/sekiui/p-bxPJJ6k4.js +1 -0
  148. package/dist/sekiui/{p-d26b63d0.entry.js → p-c906ad1e.entry.js} +1 -1
  149. package/dist/sekiui/p-cb621f86.entry.js +1 -0
  150. package/dist/sekiui/p-d4863b02.entry.js +1 -0
  151. package/dist/sekiui/p-d81d442f.entry.js +1 -0
  152. package/dist/sekiui/p-d9a625f4.entry.js +1 -0
  153. package/dist/sekiui/p-db922f6f.entry.js +1 -0
  154. package/dist/sekiui/p-e1fbadc1.entry.js +1 -0
  155. package/dist/sekiui/p-e3dc7f49.entry.js +1 -0
  156. package/dist/sekiui/{p-8a96f54c.entry.js → p-ea8654dc.entry.js} +1 -1
  157. package/dist/sekiui/p-eb76021c.entry.js +1 -0
  158. package/dist/sekiui/p-f049f47a.entry.js +1 -0
  159. package/dist/sekiui/p-f0650660.entry.js +1 -0
  160. package/dist/sekiui/p-ppXRAghy.js +1 -0
  161. package/dist/sekiui/sekiui.esm.js +1 -1
  162. package/dist/types/components/accordion/accordion-ids.d.ts +17 -0
  163. package/dist/types/components/accordion/seki-accordion-content.d.ts +3 -3
  164. package/dist/types/components/accordion/seki-accordion-item.d.ts +2 -9
  165. package/dist/types/components/accordion/seki-accordion-trigger.d.ts +4 -4
  166. package/dist/types/components/accordion/seki-accordion.d.ts +7 -2
  167. package/dist/types/components/carousel/seki-carousel.d.ts +10 -0
  168. package/dist/types/components/combobox/seki-combobox.d.ts +13 -0
  169. package/dist/types/components/context-menu/seki-context-menu-content.d.ts +3 -3
  170. package/dist/types/components/context-menu/seki-context-menu.d.ts +6 -0
  171. package/dist/types/components/dropdown-menu/seki-dropdown-menu-content.d.ts +3 -3
  172. package/dist/types/components/dropdown-menu/seki-dropdown-menu-trigger.d.ts +2 -4
  173. package/dist/types/components/dropdown-menu/seki-dropdown-menu.d.ts +6 -0
  174. package/dist/types/components/hover-card/seki-hover-card-content.d.ts +3 -1
  175. package/dist/types/components/hover-card/seki-hover-card-trigger.d.ts +2 -2
  176. package/dist/types/components/hover-card/seki-hover-card.d.ts +5 -1
  177. package/dist/types/components/radio-group/seki-radio-group-item.d.ts +3 -0
  178. package/dist/types/components/radio-group/seki-radio-group.d.ts +14 -0
  179. package/dist/types/components/resizable/layout.d.ts +2 -0
  180. package/dist/types/components/resizable/seki-resizable-handle.d.ts +13 -0
  181. package/dist/types/components/resizable/seki-resizable-panel-group.d.ts +1 -0
  182. package/dist/types/components/resizable/types.d.ts +2 -0
  183. package/dist/types/components/tabs/seki-tabs-content.d.ts +3 -4
  184. package/dist/types/components/tabs/seki-tabs-list.d.ts +2 -5
  185. package/dist/types/components/tabs/seki-tabs-trigger.d.ts +3 -4
  186. package/dist/types/components/tabs/seki-tabs.d.ts +8 -2
  187. package/dist/types/components/tabs/tab-ids.d.ts +5 -0
  188. package/dist/types/components.d.ts +14 -0
  189. package/dist/types/utils/host-id.d.ts +7 -0
  190. package/package.json +1 -1
  191. package/dist/sekiui/p-00ed0a52.entry.js +0 -1
  192. package/dist/sekiui/p-02fe58f7.entry.js +0 -1
  193. package/dist/sekiui/p-044e875d.entry.js +0 -1
  194. package/dist/sekiui/p-1971d77d.entry.js +0 -1
  195. package/dist/sekiui/p-233a4393.entry.js +0 -1
  196. package/dist/sekiui/p-2622ca4c.entry.js +0 -1
  197. package/dist/sekiui/p-28c64e07.entry.js +0 -1
  198. package/dist/sekiui/p-2bd22398.entry.js +0 -1
  199. package/dist/sekiui/p-368d2d15.entry.js +0 -1
  200. package/dist/sekiui/p-49742de9.entry.js +0 -1
  201. package/dist/sekiui/p-5bfb96fd.entry.js +0 -1
  202. package/dist/sekiui/p-5e596590.entry.js +0 -1
  203. package/dist/sekiui/p-78c8c4bf.entry.js +0 -1
  204. package/dist/sekiui/p-88ba7051.entry.js +0 -1
  205. package/dist/sekiui/p-90387022.entry.js +0 -1
  206. package/dist/sekiui/p-CmuSriLz.js +0 -1
  207. package/dist/sekiui/p-af71afe5.entry.js +0 -1
  208. package/dist/sekiui/p-b26b3102.entry.js +0 -1
  209. package/dist/sekiui/p-b43f6733.entry.js +0 -1
  210. package/dist/sekiui/p-bf687983.entry.js +0 -1
  211. package/dist/sekiui/p-eafe8a84.entry.js +0 -1
  212. package/dist/sekiui/p-ec0d8978.entry.js +0 -1
  213. package/dist/sekiui/p-f418ba3a.entry.js +0 -1
@@ -1,6 +1,7 @@
1
1
  import { h, Host } from "@stencil/core";
2
2
  import { composedContains, getDeepActiveElement } from "../../utils/menu-navigation";
3
3
  import { OverlayLayer } from "../../utils/overlay";
4
+ import { publishContext } from "../../utils/context-bridge";
4
5
  /**
5
6
  * Context Menu component - right-click context menu with items
6
7
  *
@@ -42,6 +43,9 @@ export class SekiContextMenu {
42
43
  }
43
44
  componentWillLoad() {
44
45
  this._isOpen = this.open;
46
+ // Parts already upgraded hear this; parts that upgrade later read it when
47
+ // they connect (#384).
48
+ this.publish();
45
49
  }
46
50
  openChanged(newValue) {
47
51
  this._isOpen = newValue;
@@ -55,6 +59,7 @@ export class SekiContextMenu {
55
59
  }
56
60
  // Programmatic `menuEl.open = x` must notify already-mounted children the
57
61
  // same way openMenu()/closeMenu() do (found during the #261 audit).
62
+ this.publish();
58
63
  this.sekiOpenChange.emit(newValue);
59
64
  }
60
65
  /**
@@ -71,8 +76,7 @@ export class SekiContextMenu {
71
76
  // Context must be refreshed BEFORE `this.open = true` below — same
72
77
  // ordering reason as seki-dropdown-menu.tsx's openMenu() (found during
73
78
  // #268; see that file's comment for the full explanation).
74
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
75
- this.el._contextMenuContext = this.getContext();
79
+ this.publish();
76
80
  this.open = true;
77
81
  this.setupClickOutside();
78
82
  }
@@ -84,8 +88,7 @@ export class SekiContextMenu {
84
88
  return;
85
89
  this._isOpen = false;
86
90
  // Same reordering as openMenu() above, same reason.
87
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
88
- this.el._contextMenuContext = this.getContext();
91
+ this.publish();
89
92
  this.open = false;
90
93
  this.removeClickOutside();
91
94
  }
@@ -145,6 +148,9 @@ export class SekiContextMenu {
145
148
  this.clickOutsideHandler = undefined;
146
149
  }
147
150
  }
151
+ publish() {
152
+ publishContext(this.el, '_contextMenuContext', this.getContext(), this.contextChange);
153
+ }
148
154
  getContext() {
149
155
  return {
150
156
  isOpen: this._isOpen,
@@ -155,15 +161,13 @@ export class SekiContextMenu {
155
161
  };
156
162
  }
157
163
  componentDidLoad() {
158
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
159
- this.el._contextMenuContext = this.getContext();
164
+ this.publish();
160
165
  if (this._isOpen) {
161
166
  this.setupClickOutside();
162
167
  }
163
168
  }
164
169
  componentDidUpdate() {
165
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
166
- this.el._contextMenuContext = this.getContext();
170
+ this.publish();
167
171
  }
168
172
  componentDidRender() {
169
173
  this.layer.setActive(this._isOpen);
@@ -173,7 +177,7 @@ export class SekiContextMenu {
173
177
  this.layer.setActive(false);
174
178
  }
175
179
  render() {
176
- return (h(Host, { key: '3b5bcf8bddbf856566437a16af2b78d667d6b9aa', "data-state": this._isOpen ? 'open' : 'closed' }, h("div", { key: 'cfb47dcf5c79696cf6fbe2746e2be3c59d79cb81', part: "context-menu", class: "context-menu" }, h("slot", { key: 'b4f31ddb24fb5ca635f9e1f503c70201a81b1d5a' }))));
180
+ return (h(Host, { key: '98e6c7a6214ca112d2f81bf3a9e09fc62eacdd14', "data-state": this._isOpen ? 'open' : 'closed' }, h("div", { key: '2a9b0153bc1bff0950b67c5ef0b0c13ffe75ee35', part: "context-menu", class: "context-menu" }, h("slot", { key: '5d7589d88883ba9d02d9d9489635f6a65d9b3a8e' }))));
177
181
  }
178
182
  static get is() { return "seki-context-menu"; }
179
183
  static get encapsulation() { return "shadow"; }
@@ -249,6 +253,24 @@ export class SekiContextMenu {
249
253
  "resolved": "string",
250
254
  "references": {}
251
255
  }
256
+ }, {
257
+ "method": "contextChange",
258
+ "name": "sekiContextChange",
259
+ "bubbles": true,
260
+ "cancelable": true,
261
+ "composed": true,
262
+ "docs": {
263
+ "tags": [{
264
+ "name": "internal",
265
+ "text": undefined
266
+ }],
267
+ "text": "Internal: notifies the context menu parts that the published context changed."
268
+ },
269
+ "complexType": {
270
+ "original": "void",
271
+ "resolved": "void",
272
+ "references": {}
273
+ }
252
274
  }];
253
275
  }
254
276
  static get methods() {
@@ -1,6 +1,7 @@
1
1
  import { h, Host } from "@stencil/core";
2
2
  import { computeAnchoredPosition } from "../../utils/positioning";
3
3
  import { clearTypeahead, focusFirstMenuItem, handleMenuKeyDown } from "../../utils/menu-navigation";
4
+ import { ContextConsumer } from "../../utils/context-bridge";
4
5
  const NAV_CONFIG = {
5
6
  itemSelector: 'seki-dropdown-menu-item, seki-dropdown-menu-checkbox, seki-dropdown-menu-radio, seki-dropdown-menu-sub',
6
7
  subContentSelector: 'seki-dropdown-menu-sub [slot="content"]',
@@ -15,17 +16,20 @@ const NAV_CONFIG = {
15
16
  export class SekiDropdownMenuContent {
16
17
  constructor() {
17
18
  this.typeahead = { buffer: '' };
18
- this.onMenuOpenChange = () => {
19
+ this.hasLoaded = false;
20
+ this.menu = new ContextConsumer('seki-dropdown-menu', '_dropdownMenuContext', (context) => {
19
21
  var _a;
20
- const context = this.getContext();
22
+ const wasOpen = this._isOpen;
21
23
  this._isOpen = (_a = context === null || context === void 0 ? void 0 : context.isOpen) !== null && _a !== void 0 ? _a : false;
22
- if (this._isOpen) {
24
+ // Focus the first item when the menu opens after mount; an initially open
25
+ // menu keeps focus where it is, as before.
26
+ if (this.hasLoaded && this._isOpen && !wasOpen) {
23
27
  requestAnimationFrame(() => {
24
28
  this.updatePosition();
25
29
  void focusFirstMenuItem(this.el, NAV_CONFIG);
26
30
  });
27
31
  }
28
- };
32
+ });
29
33
  /**
30
34
  * Offset from trigger
31
35
  */
@@ -34,19 +38,13 @@ export class SekiDropdownMenuContent {
34
38
  this._position = { top: '0', left: '0' };
35
39
  }
36
40
  getContext() {
37
- const menu = this.el.closest('seki-dropdown-menu');
38
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
39
- return menu ? menu._dropdownMenuContext : null;
41
+ return this.menu.context;
40
42
  }
41
- componentWillRender() {
42
- var _a;
43
- const context = this.getContext();
44
- this._isOpen = (_a = context === null || context === void 0 ? void 0 : context.isOpen) !== null && _a !== void 0 ? _a : false;
43
+ connectedCallback() {
44
+ this.menu.connect(this.el);
45
45
  }
46
46
  componentDidLoad() {
47
- var _a, _b;
48
- this.menuEl = (_a = this.el.closest('seki-dropdown-menu')) !== null && _a !== void 0 ? _a : undefined;
49
- (_b = this.menuEl) === null || _b === void 0 ? void 0 : _b.addEventListener('sekiOpenChange', this.onMenuOpenChange);
47
+ this.hasLoaded = true;
50
48
  }
51
49
  componentDidRender() {
52
50
  if (this._isOpen) {
@@ -89,9 +87,8 @@ export class SekiDropdownMenuContent {
89
87
  this._position = next;
90
88
  }
91
89
  disconnectedCallback() {
92
- var _a;
93
90
  clearTypeahead(this.typeahead);
94
- (_a = this.menuEl) === null || _a === void 0 ? void 0 : _a.removeEventListener('sekiOpenChange', this.onMenuOpenChange);
91
+ this.menu.disconnect();
95
92
  }
96
93
  render() {
97
94
  if (!this._isOpen) {
@@ -1,4 +1,5 @@
1
1
  import { h, Host } from "@stencil/core";
2
+ import { ContextConsumer } from "../../utils/context-bridge";
2
3
  /**
3
4
  * Dropdown Menu trigger button
4
5
  *
@@ -9,32 +10,23 @@ import { h, Host } from "@stencil/core";
9
10
  export class SekiDropdownMenuTrigger {
10
11
  constructor() {
11
12
  this._isOpen = false;
12
- this.onMenuOpenChange = () => {
13
+ this.menu = new ContextConsumer('seki-dropdown-menu', '_dropdownMenuContext', (context) => {
13
14
  var _a;
14
- const context = this.getContext();
15
15
  this._isOpen = (_a = context === null || context === void 0 ? void 0 : context.isOpen) !== null && _a !== void 0 ? _a : false;
16
- };
17
- }
18
- getContext() {
19
- const menu = this.el.closest('seki-dropdown-menu');
20
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
- return menu ? menu._dropdownMenuContext : null;
16
+ });
22
17
  }
23
- componentDidLoad() {
24
- var _a, _b;
25
- this.menuEl = (_a = this.el.closest('seki-dropdown-menu')) !== null && _a !== void 0 ? _a : undefined;
26
- (_b = this.menuEl) === null || _b === void 0 ? void 0 : _b.addEventListener('sekiOpenChange', this.onMenuOpenChange);
18
+ connectedCallback() {
19
+ this.menu.connect(this.el);
27
20
  }
28
21
  handleClick(event) {
29
22
  event.stopPropagation();
30
23
  this.triggerClick.emit();
31
24
  }
32
25
  disconnectedCallback() {
33
- var _a;
34
- (_a = this.menuEl) === null || _a === void 0 ? void 0 : _a.removeEventListener('sekiOpenChange', this.onMenuOpenChange);
26
+ this.menu.disconnect();
35
27
  }
36
28
  render() {
37
- return (h(Host, { key: '041b282d798f5eb9c79bca05058680187068e64a', "data-state": this._isOpen ? 'open' : 'closed' }, h("span", { key: '1d6e9fadfb4ef2ccfc5ec2ac1ba29cc9940c1f23', part: "trigger", class: "dropdown-menu-trigger", "aria-haspopup": "menu", "aria-expanded": this._isOpen ? 'true' : 'false' }, h("slot", { key: '14ffb1dae82ed4f10583e73306212d3089f07d06' }))));
29
+ return (h(Host, { key: '62faab5af2d089c1bae1b6a56187b81f8799444d', "data-state": this._isOpen ? 'open' : 'closed' }, h("span", { key: '0164812df07f1ed2f7d423852a1daf3bf972c43d', part: "trigger", class: "dropdown-menu-trigger", "aria-haspopup": "menu", "aria-expanded": this._isOpen ? 'true' : 'false' }, h("slot", { key: 'c04d209c3aea27373c2fcd09e0d99f9dfd6e0692' }))));
38
30
  }
39
31
  static get is() { return "seki-dropdown-menu-trigger"; }
40
32
  static get encapsulation() { return "shadow"; }
@@ -1,6 +1,7 @@
1
1
  import { h, Host } from "@stencil/core";
2
2
  import { composedContains, getDeepActiveElement } from "../../utils/menu-navigation";
3
3
  import { OverlayLayer } from "../../utils/overlay";
4
+ import { publishContext } from "../../utils/context-bridge";
4
5
  /**
5
6
  * Dropdown Menu component - context menu with items
6
7
  *
@@ -50,6 +51,9 @@ export class SekiDropdownMenu {
50
51
  }
51
52
  componentWillLoad() {
52
53
  this._isOpen = this.open || this.defaultOpen;
54
+ // Parts already upgraded hear this; parts that upgrade later read it when
55
+ // they connect (#384).
56
+ this.publish();
53
57
  }
54
58
  openChanged(newValue) {
55
59
  this._isOpen = newValue;
@@ -63,6 +67,7 @@ export class SekiDropdownMenu {
63
67
  }
64
68
  // Programmatic `menuEl.open = x` must notify already-mounted children the
65
69
  // same way openMenu()/closeMenu() do (found during the #261 audit).
70
+ this.publish();
66
71
  this.sekiOpenChange.emit(newValue);
67
72
  }
68
73
  /**
@@ -80,8 +85,7 @@ export class SekiDropdownMenu {
80
85
  // #268 — the previous double-emit accidentally masked this ordering gap,
81
86
  // since the second, later emit always ran after a second, redundant
82
87
  // refresh).
83
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
84
- this.el._dropdownMenuContext = this.getContext();
88
+ this.publish();
85
89
  this.open = true;
86
90
  this.setupClickOutside();
87
91
  }
@@ -93,8 +97,7 @@ export class SekiDropdownMenu {
93
97
  return;
94
98
  this._isOpen = false;
95
99
  // Same reordering as openMenu() above, same reason.
96
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
97
- this.el._dropdownMenuContext = this.getContext();
100
+ this.publish();
98
101
  this.open = false;
99
102
  this.removeClickOutside();
100
103
  }
@@ -155,6 +158,9 @@ export class SekiDropdownMenu {
155
158
  this.clickOutsideHandler = undefined;
156
159
  }
157
160
  }
161
+ publish() {
162
+ publishContext(this.el, '_dropdownMenuContext', this.getContext(), this.contextChange);
163
+ }
158
164
  getContext() {
159
165
  return {
160
166
  isOpen: this._isOpen,
@@ -169,15 +175,13 @@ export class SekiDropdownMenu {
169
175
  };
170
176
  }
171
177
  componentDidLoad() {
172
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
173
- this.el._dropdownMenuContext = this.getContext();
178
+ this.publish();
174
179
  if (this._isOpen) {
175
180
  this.setupClickOutside();
176
181
  }
177
182
  }
178
183
  componentDidUpdate() {
179
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
180
- this.el._dropdownMenuContext = this.getContext();
184
+ this.publish();
181
185
  }
182
186
  componentDidRender() {
183
187
  this.layer.setActive(this._isOpen);
@@ -187,7 +191,7 @@ export class SekiDropdownMenu {
187
191
  this.layer.setActive(false);
188
192
  }
189
193
  render() {
190
- return (h(Host, { key: '6ff61abf4391bf30cbda771351eec17c6e4849bc', "data-state": this._isOpen ? 'open' : 'closed' }, h("div", { key: 'a27b1fe18d83d7a34bed20c4fda6c3e0de6f25e2', part: "dropdown-menu", class: "dropdown-menu" }, h("slot", { key: '30eb41187d2deaec7c6b4d92d83d94ce3c0f4fd2' }))));
194
+ return (h(Host, { key: 'e9cee0f28a94987325d2d07001bd9f841f84f241', "data-state": this._isOpen ? 'open' : 'closed' }, h("div", { key: '556d58f58bd0cbe07fccf2def100db11c5e43e9d', part: "dropdown-menu", class: "dropdown-menu" }, h("slot", { key: '0befc30be19c45fb3975bc31cc7565716f183171' }))));
191
195
  }
192
196
  static get is() { return "seki-dropdown-menu"; }
193
197
  static get encapsulation() { return "shadow"; }
@@ -353,6 +357,24 @@ export class SekiDropdownMenu {
353
357
  "resolved": "string",
354
358
  "references": {}
355
359
  }
360
+ }, {
361
+ "method": "contextChange",
362
+ "name": "sekiContextChange",
363
+ "bubbles": true,
364
+ "cancelable": true,
365
+ "composed": true,
366
+ "docs": {
367
+ "tags": [{
368
+ "name": "internal",
369
+ "text": undefined
370
+ }],
371
+ "text": "Internal: notifies the dropdown menu parts that the published context changed."
372
+ },
373
+ "complexType": {
374
+ "original": "void",
375
+ "resolved": "void",
376
+ "references": {}
377
+ }
356
378
  }];
357
379
  }
358
380
  static get methods() {
@@ -1,4 +1,5 @@
1
1
  import { h, Host } from "@stencil/core";
2
+ import { ContextConsumer } from "../../utils/context-bridge";
2
3
  /**
3
4
  * Hover Card Content Component
4
5
  *
@@ -42,6 +43,26 @@ export class SekiHoverCardContent {
42
43
  * The actual side after collision detection (string primitive — safe as @State, no infinite loop)
43
44
  */
44
45
  this._actualSide = 'bottom';
46
+ this.hasLoaded = false;
47
+ this.hoverCard = new ContextConsumer('seki-hover-card', '_hoverCardContext', (context) => {
48
+ var _a;
49
+ const wasOpen = this._isOpen;
50
+ this._isOpen = (_a = context === null || context === void 0 ? void 0 : context.isOpen) !== null && _a !== void 0 ? _a : false;
51
+ // Before the first render only the state is taken over (an initially open
52
+ // card needs no listeners set up by a transition).
53
+ if (!this.hasLoaded || this._isOpen === wasOpen)
54
+ return;
55
+ if (this._isOpen) {
56
+ requestAnimationFrame(() => this.updatePosition());
57
+ // Setup click-outside listener for touch devices
58
+ if (this.isTouchDevice()) {
59
+ this.setupClickOutsideListener();
60
+ }
61
+ }
62
+ else {
63
+ this.removeClickOutsideListener();
64
+ }
65
+ });
45
66
  /**
46
67
  * Handle mouse enter - cancel any pending close
47
68
  */
@@ -91,33 +112,13 @@ export class SekiHoverCardContent {
91
112
  * Get the hover card context from the parent container
92
113
  */
93
114
  getContext() {
94
- const parent = this.el.closest('seki-hover-card');
95
- if (parent) {
96
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
97
- return parent._hoverCardContext || null;
98
- }
99
- return null;
115
+ return this.hoverCard.context;
116
+ }
117
+ connectedCallback() {
118
+ this.hoverCard.connect(this.el);
100
119
  }
101
120
  componentDidLoad() {
102
- // Listen for open changes from parent (events bubble up, not down, so @Listen won't work)
103
- const hoverCard = this.el.closest('seki-hover-card');
104
- if (hoverCard) {
105
- this.openChangeHandler = (e) => {
106
- const open = e.detail;
107
- this._isOpen = open;
108
- if (this._isOpen) {
109
- requestAnimationFrame(() => this.updatePosition());
110
- // Setup click-outside listener for touch devices
111
- if (this.isTouchDevice()) {
112
- this.setupClickOutsideListener();
113
- }
114
- }
115
- else {
116
- this.removeClickOutsideListener();
117
- }
118
- };
119
- hoverCard.addEventListener('sekiOpenChange', this.openChangeHandler);
120
- }
121
+ this.hasLoaded = true;
121
122
  }
122
123
  componentDidRender() {
123
124
  if (this._isOpen && this.contentRef) {
@@ -126,14 +127,7 @@ export class SekiHoverCardContent {
126
127
  }
127
128
  disconnectedCallback() {
128
129
  this.removeClickOutsideListener();
129
- // Clean up parent event listener
130
- if (this.openChangeHandler) {
131
- const hoverCard = this.el.closest('seki-hover-card');
132
- if (hoverCard) {
133
- hoverCard.removeEventListener('sekiOpenChange', this.openChangeHandler);
134
- }
135
- this.openChangeHandler = undefined;
136
- }
130
+ this.hoverCard.disconnect();
137
131
  }
138
132
  /**
139
133
  * Setup click-outside listener for touch devices to close on tap outside
@@ -1,4 +1,5 @@
1
1
  import { h, Host } from "@stencil/core";
2
+ import { ContextConsumer } from "../../utils/context-bridge";
2
3
  /**
3
4
  * Hover Card Trigger Component
4
5
  *
@@ -22,6 +23,10 @@ export class SekiHoverCardTrigger {
22
23
  * Internal state tracking whether the hover card is open (for aria-expanded)
23
24
  */
24
25
  this.isOpen = false;
26
+ this.hoverCard = new ContextConsumer('seki-hover-card', '_hoverCardContext', (context) => {
27
+ var _a;
28
+ this.isOpen = (_a = context === null || context === void 0 ? void 0 : context.isOpen) !== null && _a !== void 0 ? _a : false;
29
+ });
25
30
  /**
26
31
  * Handle mouse enter - request open (non-touch devices only)
27
32
  */
@@ -95,36 +100,16 @@ export class SekiHoverCardTrigger {
95
100
  * Get the hover card context from the parent container
96
101
  */
97
102
  getContext() {
98
- const parent = this.el.closest('seki-hover-card');
99
- if (parent) {
100
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
101
- return parent._hoverCardContext || null;
102
- }
103
- return null;
103
+ return this.hoverCard.context;
104
104
  }
105
- componentDidLoad() {
106
- // Listen for open state changes from parent (events bubble up, not down, so @Listen won't work)
107
- const hoverCard = this.el.closest('seki-hover-card');
108
- if (hoverCard) {
109
- this.openChangeHandler = (e) => {
110
- const open = e.detail;
111
- this.isOpen = open;
112
- };
113
- hoverCard.addEventListener('sekiOpenChange', this.openChangeHandler);
114
- }
105
+ connectedCallback() {
106
+ this.hoverCard.connect(this.el);
115
107
  }
116
108
  disconnectedCallback() {
117
- // Clean up parent event listener
118
- if (this.openChangeHandler) {
119
- const hoverCard = this.el.closest('seki-hover-card');
120
- if (hoverCard) {
121
- hoverCard.removeEventListener('sekiOpenChange', this.openChangeHandler);
122
- }
123
- this.openChangeHandler = undefined;
124
- }
109
+ this.hoverCard.disconnect();
125
110
  }
126
111
  render() {
127
- return (h(Host, { key: '32dae264e134487c7a81bcbc4cf2c4e02fbd2c3c' }, h("span", { key: 'b46dda7c7a42086d4f0abd1dced54b4160c55a21', part: "trigger", class: "hover-card-trigger", "aria-haspopup": "dialog", "aria-expanded": this.isOpen ? 'true' : 'false', onMouseEnter: this.handleMouseEnter, onMouseLeave: this.handleMouseLeave, onFocus: this.handleFocus, onBlur: this.handleBlur, onClick: this.handleClick }, h("slot", { key: '0d7667574dbb5aebe2bd824b5e68c79e477c9ad1' }))));
112
+ return (h(Host, { key: '5e2612d5b7f94f66413bd2c8cc64e1f24de2621e' }, h("span", { key: 'fa875d7a1a941eeffa38f681d6f4c5ee2aaff267', part: "trigger", class: "hover-card-trigger", "aria-haspopup": "dialog", "aria-expanded": this.isOpen ? 'true' : 'false', onMouseEnter: this.handleMouseEnter, onMouseLeave: this.handleMouseLeave, onFocus: this.handleFocus, onBlur: this.handleBlur, onClick: this.handleClick }, h("slot", { key: '01856b11d54bdf534b1d3cc8db1d99314e84fc14' }))));
128
113
  }
129
114
  static get is() { return "seki-hover-card-trigger"; }
130
115
  static get encapsulation() { return "shadow"; }
@@ -1,5 +1,6 @@
1
1
  import { h, Host } from "@stencil/core";
2
2
  import { OverlayLayer } from "../../utils/overlay";
3
+ import { publishContext } from "../../utils/context-bridge";
3
4
  /**
4
5
  * Hover Card Container Component
5
6
  *
@@ -142,6 +143,9 @@ export class SekiHoverCard {
142
143
  // `disabled` wins over a requested initial open state.
143
144
  this._isOpen = (this.open || this.defaultOpen) && !this.disabled;
144
145
  this.open = this._isOpen;
146
+ // Parts already upgraded hear this; parts that upgrade later read it when
147
+ // they connect (#384).
148
+ this.updateContext();
145
149
  }
146
150
  openChanged(newValue) {
147
151
  // An outside assignment (`card.open = true`) has to win after first render;
@@ -255,8 +259,7 @@ export class SekiHoverCard {
255
259
  * Update the context on the element for child components to access
256
260
  */
257
261
  updateContext() {
258
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
259
- this.el._hoverCardContext = this.getContext();
262
+ publishContext(this.el, '_hoverCardContext', this.getContext(), this.contextChange);
260
263
  }
261
264
  // Listen for custom events from child components
262
265
  handleRequestOpen() {
@@ -274,9 +277,6 @@ export class SekiHoverCard {
274
277
  componentDidRender() {
275
278
  this.layer.setActive(this._isOpen);
276
279
  }
277
- componentDidLoad() {
278
- this.updateContext();
279
- }
280
280
  componentDidUpdate() {
281
281
  this.updateContext();
282
282
  }
@@ -289,7 +289,7 @@ export class SekiHoverCard {
289
289
  this.layer.setActive(false);
290
290
  }
291
291
  render() {
292
- return (h(Host, { key: '2c9f5dd4788bc39af9881cc5a4d4f4e400347e10', "data-state": this._isOpen ? 'open' : 'closed' }, h("div", { key: '0f8f5ed75e8049fd30df5a312e474cbf40d44e69', class: "hover-card" }, h("slot", { key: 'c5d4bf92063b24e49679e49837d11cc96a969f2f' }))));
292
+ return (h(Host, { key: 'ed09850d3514e29311629a54d02056b27e817e5a', "data-state": this._isOpen ? 'open' : 'closed' }, h("div", { key: '6cbccba00a0fd2fca3816b25898d672618d74b62', class: "hover-card" }, h("slot", { key: 'adea6048e83def42318c736a9def3efe418a92de' }))));
293
293
  }
294
294
  static get is() { return "seki-hover-card"; }
295
295
  static get encapsulation() { return "shadow"; }
@@ -501,6 +501,24 @@ export class SekiHoverCard {
501
501
  "resolved": "boolean",
502
502
  "references": {}
503
503
  }
504
+ }, {
505
+ "method": "contextChange",
506
+ "name": "sekiContextChange",
507
+ "bubbles": true,
508
+ "cancelable": true,
509
+ "composed": true,
510
+ "docs": {
511
+ "tags": [{
512
+ "name": "internal",
513
+ "text": undefined
514
+ }],
515
+ "text": "Internal: notifies the hover card parts that the published context changed."
516
+ },
517
+ "complexType": {
518
+ "original": "void",
519
+ "resolved": "void",
520
+ "references": {}
521
+ }
504
522
  }];
505
523
  }
506
524
  static get methods() {
@@ -1,4 +1,5 @@
1
1
  import { h, Host } from "@stencil/core";
2
+ import { ContextConsumer } from "../../utils/context-bridge";
2
3
  /**
3
4
  * @component seki-radio-group-item
4
5
  * @description An individual radio button item within a seki-radio-group.
@@ -7,6 +8,16 @@ import { h, Host } from "@stencil/core";
7
8
  */
8
9
  export class SekiRadioGroupItem {
9
10
  constructor() {
11
+ // Pull the group's state: the group pushes `checked` onto items it can see,
12
+ // but an item that upgrades after the group (one-module-per-tag loading) was
13
+ // not an upgraded element yet, so it must read the group's state itself.
14
+ this.group = new ContextConsumer('seki-radio-group', '_radioGroupItemsContext', (context) => {
15
+ if (!context)
16
+ return;
17
+ this.checked = context.value !== undefined && context.value === this.value;
18
+ if (context.disabled)
19
+ this.disabled = true;
20
+ });
10
21
  /**
11
22
  * Whether this item is checked. Managed by parent radio group.
12
23
  */
@@ -38,6 +49,12 @@ export class SekiRadioGroupItem {
38
49
  }
39
50
  };
40
51
  }
52
+ connectedCallback() {
53
+ this.group.connect(this.el);
54
+ }
55
+ disconnectedCallback() {
56
+ this.group.disconnect();
57
+ }
41
58
  /**
42
59
  * Focus this radio item.
43
60
  */
@@ -47,7 +64,7 @@ export class SekiRadioGroupItem {
47
64
  }
48
65
  render() {
49
66
  const dataState = this.checked ? 'checked' : 'unchecked';
50
- return (h(Host, { key: 'd1a1c231c0125135ff2d5b994136549a017f50a1', "data-state": dataState, "data-disabled": this.disabled ? '' : null }, h("button", { key: 'bc514d9ff7aec4d8024f4c617dedcb92f7b9f3de', type: "button", role: "radio", class: "radio", part: "radio", ref: el => this.buttonEl = el, "aria-checked": this.checked ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : undefined, "aria-label": this.ariaLabel || undefined, "aria-describedby": this.ariaDescribedby || undefined, tabindex: this.checked ? 0 : -1, disabled: this.disabled, onClick: this.handleClick, onKeyDown: this.handleKeyDown }, this.checked && (h("span", { key: 'b01d0d5652684152de16e1dfd88d65aa44976a0d', class: "indicator", part: "indicator" })))));
67
+ return (h(Host, { key: 'ce2f71b19a5e58670e4f2a8ecd50f38480027b6e', "data-state": dataState, "data-disabled": this.disabled ? '' : null }, h("button", { key: 'b4216874c9102c333091b888bcc5285e2f038223', type: "button", role: "radio", class: "radio", part: "radio", ref: el => this.buttonEl = el, "aria-checked": this.checked ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : undefined, "aria-label": this.ariaLabel || undefined, "aria-describedby": this.ariaDescribedby || undefined, tabindex: this.checked ? 0 : -1, disabled: this.disabled, onClick: this.handleClick, onKeyDown: this.handleKeyDown }, this.checked && (h("span", { key: '09cb9ea7c3ae16bbe103ea59313ab253fe31bcbf', class: "indicator", part: "indicator" })))));
51
68
  }
52
69
  static get is() { return "seki-radio-group-item"; }
53
70
  static get encapsulation() { return "shadow"; }
@@ -1,5 +1,6 @@
1
1
  import { h, Host } from "@stencil/core";
2
2
  import { FormControl } from "../../utils/form-control";
3
+ import { publishContext } from "../../utils/context-bridge";
3
4
  /**
4
5
  * @component seki-radio-group
5
6
  * @description A set of radio buttons where only one can be selected at a time.
@@ -51,6 +52,7 @@ export class SekiRadioGroup {
51
52
  });
52
53
  this.formControl.captureInitial(this.internalValue);
53
54
  this.formControl.sync();
55
+ this.publish();
54
56
  }
55
57
  handleFormStateChange() {
56
58
  var _a;
@@ -163,7 +165,11 @@ export class SekiRadioGroup {
163
165
  /**
164
166
  * Update child items with current selection state
165
167
  */
168
+ publish() {
169
+ publishContext(this.el, '_radioGroupItemsContext', { value: this.selectedValue, disabled: this.disabled }, this.contextChange);
170
+ }
166
171
  updateChildItems() {
172
+ this.publish();
167
173
  const selectedValue = this.selectedValue;
168
174
  const items = this.getRadioItems();
169
175
  items.forEach(item => {
@@ -180,7 +186,7 @@ export class SekiRadioGroup {
180
186
  this.updateChildItems();
181
187
  }
182
188
  render() {
183
- return (h(Host, { key: 'd0bc24b9a623cd6ef420fcf1665e23d9d8952680', role: "radiogroup", "aria-label": this.ariaLabel, "aria-required": this.required ? 'true' : undefined, "aria-disabled": this.disabled ? 'true' : undefined, "aria-orientation": this.orientation, "data-orientation": this.orientation, "data-disabled": this.disabled ? '' : null }, h("slot", { key: '8ea91aeda0738ed3a9b9232ddd28e6f924714a7e' })));
189
+ return (h(Host, { key: 'c4210abc0444bb3fcefc3c0e3f6fa6fd7e218543', role: "radiogroup", "aria-label": this.ariaLabel, "aria-required": this.required ? 'true' : undefined, "aria-disabled": this.disabled ? 'true' : undefined, "aria-orientation": this.orientation, "data-orientation": this.orientation, "data-disabled": this.disabled ? '' : null }, h("slot", { key: 'd3d1603e53818cc9015b2ede0a44fa495c7f08be' })));
184
190
  }
185
191
  static get is() { return "seki-radio-group"; }
186
192
  static get encapsulation() { return "shadow"; }
@@ -356,6 +362,24 @@ export class SekiRadioGroup {
356
362
  "resolved": "{ value: string; }",
357
363
  "references": {}
358
364
  }
365
+ }, {
366
+ "method": "contextChange",
367
+ "name": "sekiContextChange",
368
+ "bubbles": true,
369
+ "cancelable": true,
370
+ "composed": true,
371
+ "docs": {
372
+ "tags": [{
373
+ "name": "internal",
374
+ "text": undefined
375
+ }],
376
+ "text": "Internal: notifies items that the published group state changed."
377
+ },
378
+ "complexType": {
379
+ "original": "void",
380
+ "resolved": "void",
381
+ "references": {}
382
+ }
359
383
  }];
360
384
  }
361
385
  static get elementRef() { return "el"; }
@@ -97,3 +97,5 @@ export function computeHandleRange(before, after) {
97
97
  const max = Math.min(before.constraints.maxSize, total - lowerBound(after));
98
98
  return { now: before.size, min: Math.min(min, before.size), max: Math.max(max, before.size) };
99
99
  }
100
+ /** Generated host id for a panel; the handle derives the same id for `aria-controls`. */
101
+ export const panelHostId = (panelId) => `seki-resizable-${panelId}`;