@sekiui/elements 0.0.88 → 0.1.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 (211) hide show
  1. package/dist/cdn/p-C9-yH6MD.js +33 -0
  2. package/dist/cdn/p-CQQRfw1L.js +18 -0
  3. package/dist/cdn/seki-carousel-dots.js +7 -3
  4. package/dist/cdn/seki-carousel-next.js +8 -6
  5. package/dist/cdn/seki-carousel-previous.js +8 -6
  6. package/dist/cdn/seki-carousel.js +15 -1
  7. package/dist/cdn/seki-date-picker.js +71 -36
  8. package/dist/cdn/seki-drawer.js +76 -32
  9. package/dist/cdn/seki-hover-card-content.js +2 -2
  10. package/dist/cdn/seki-hover-card-trigger.js +3 -3
  11. package/dist/cdn/seki-hover-card.js +59 -4
  12. package/dist/cdn/seki-resizable-handle.js +11 -2
  13. package/dist/cdn/seki-resizable-panel-group.js +9 -3
  14. package/dist/cdn/seki-resizable-panel.js +42 -20
  15. package/dist/cdn/seki-select-content.js +21 -13
  16. package/dist/cdn/seki-select-group.js +3 -4
  17. package/dist/cdn/seki-select-option.js +33 -15
  18. package/dist/cdn/seki-select-trigger.js +6 -4
  19. package/dist/cdn/seki-select.js +2 -2
  20. package/dist/cdn/seki-sheet.js +71 -30
  21. package/dist/cdn/seki-sidebar-footer.js +3 -1
  22. package/dist/cdn/seki-sidebar-header.js +3 -1
  23. package/dist/cdn/seki-sidebar-menu-button.js +3 -1
  24. package/dist/cdn/seki-sidebar-rail.js +3 -1
  25. package/dist/cdn/seki-sidebar-trigger.js +6 -1
  26. package/dist/cdn/seki-sidebar.js +5 -2
  27. package/dist/cdn/seki-tooltip.js +47 -2
  28. package/dist/cjs/loader.cjs.js +1 -1
  29. package/dist/cjs/option-id-wIa73qWK.js +20 -0
  30. package/dist/cjs/seki-carousel-dots.cjs.entry.js +7 -3
  31. package/dist/cjs/seki-carousel-next.cjs.entry.js +8 -6
  32. package/dist/cjs/seki-carousel-previous.cjs.entry.js +8 -6
  33. package/dist/cjs/seki-carousel.cjs.entry.js +15 -1
  34. package/dist/cjs/seki-date-picker.cjs.entry.js +64 -32
  35. package/dist/cjs/seki-drawer.cjs.entry.js +67 -27
  36. package/dist/cjs/seki-hover-card-content.cjs.entry.js +2 -2
  37. package/dist/cjs/seki-hover-card-trigger.cjs.entry.js +3 -3
  38. package/dist/cjs/seki-hover-card.cjs.entry.js +53 -3
  39. package/dist/cjs/seki-resizable-handle.cjs.entry.js +11 -2
  40. package/dist/cjs/seki-resizable-panel-group.cjs.entry.js +9 -3
  41. package/dist/cjs/seki-resizable-panel.cjs.entry.js +42 -20
  42. package/dist/cjs/seki-select-content.cjs.entry.js +20 -11
  43. package/dist/cjs/seki-select-group.cjs.entry.js +2 -2
  44. package/dist/cjs/seki-select-option.cjs.entry.js +32 -13
  45. package/dist/cjs/seki-select-trigger.cjs.entry.js +5 -2
  46. package/dist/cjs/seki-select.cjs.entry.js +2 -2
  47. package/dist/cjs/seki-sheet.cjs.entry.js +62 -25
  48. package/dist/cjs/seki-sidebar-footer.cjs.entry.js +3 -1
  49. package/dist/cjs/seki-sidebar-header.cjs.entry.js +3 -1
  50. package/dist/cjs/seki-sidebar-menu-button.cjs.entry.js +3 -1
  51. package/dist/cjs/seki-sidebar-rail.cjs.entry.js +3 -1
  52. package/dist/cjs/seki-sidebar-trigger.cjs.entry.js +6 -1
  53. package/dist/cjs/seki-sidebar.cjs.entry.js +5 -2
  54. package/dist/cjs/seki-tooltip.cjs.entry.js +43 -2
  55. package/dist/cjs/sekiui.cjs.js +1 -1
  56. package/dist/cjs/when-defined-B2Lkz6uR.js +36 -0
  57. package/dist/collection/components/carousel/seki-carousel-dots.js +7 -3
  58. package/dist/collection/components/carousel/seki-carousel-next.js +8 -6
  59. package/dist/collection/components/carousel/seki-carousel-previous.js +8 -6
  60. package/dist/collection/components/carousel/seki-carousel.js +15 -1
  61. package/dist/collection/components/date-picker/seki-date-picker.js +124 -36
  62. package/dist/collection/components/drawer/seki-drawer.js +132 -31
  63. package/dist/collection/components/hover-card/seki-hover-card-content.js +2 -2
  64. package/dist/collection/components/hover-card/seki-hover-card-trigger.js +3 -3
  65. package/dist/collection/components/hover-card/seki-hover-card.js +142 -6
  66. package/dist/collection/components/resizable/seki-resizable-handle.js +11 -2
  67. package/dist/collection/components/resizable/seki-resizable-panel-group.js +23 -3
  68. package/dist/collection/components/resizable/seki-resizable-panel.js +42 -20
  69. package/dist/collection/components/select/seki-select.js +6 -12
  70. package/dist/collection/components/select-content/seki-select-content.css +8 -0
  71. package/dist/collection/components/select-content/seki-select-content.js +20 -11
  72. package/dist/collection/components/select-group/seki-select-group.js +2 -2
  73. package/dist/collection/components/select-option/seki-select-option.js +32 -13
  74. package/dist/collection/components/select-trigger/seki-select-trigger.js +5 -2
  75. package/dist/collection/components/sheet/seki-sheet.js +127 -29
  76. package/dist/collection/components/sidebar/seki-sidebar-footer.js +3 -1
  77. package/dist/collection/components/sidebar/seki-sidebar-header.js +3 -1
  78. package/dist/collection/components/sidebar/seki-sidebar-menu-button.js +3 -1
  79. package/dist/collection/components/sidebar/seki-sidebar-rail.js +3 -1
  80. package/dist/collection/components/sidebar/seki-sidebar-trigger.js +6 -1
  81. package/dist/collection/components/sidebar/seki-sidebar.js +5 -2
  82. package/dist/collection/components/tooltip/seki-tooltip.js +92 -2
  83. package/dist/collection/utils/select/index.js +1 -0
  84. package/dist/collection/utils/select/option-id.js +16 -0
  85. package/dist/collection/utils/when-defined.js +31 -0
  86. package/dist/components/p-C9-yH6MD.js +33 -0
  87. package/dist/components/p-CQQRfw1L.js +18 -0
  88. package/dist/components/seki-carousel-dots.js +7 -3
  89. package/dist/components/seki-carousel-next.js +8 -6
  90. package/dist/components/seki-carousel-previous.js +8 -6
  91. package/dist/components/seki-carousel.js +15 -1
  92. package/dist/components/seki-date-picker.js +71 -36
  93. package/dist/components/seki-drawer.js +76 -32
  94. package/dist/components/seki-hover-card-content.js +2 -2
  95. package/dist/components/seki-hover-card-trigger.js +3 -3
  96. package/dist/components/seki-hover-card.js +59 -4
  97. package/dist/components/seki-resizable-handle.js +11 -2
  98. package/dist/components/seki-resizable-panel-group.js +9 -3
  99. package/dist/components/seki-resizable-panel.js +42 -20
  100. package/dist/components/seki-select-content.js +21 -13
  101. package/dist/components/seki-select-group.js +3 -4
  102. package/dist/components/seki-select-option.js +33 -15
  103. package/dist/components/seki-select-trigger.js +6 -4
  104. package/dist/components/seki-select.js +2 -2
  105. package/dist/components/seki-sheet.js +71 -30
  106. package/dist/components/seki-sidebar-footer.js +3 -1
  107. package/dist/components/seki-sidebar-header.js +3 -1
  108. package/dist/components/seki-sidebar-menu-button.js +3 -1
  109. package/dist/components/seki-sidebar-rail.js +3 -1
  110. package/dist/components/seki-sidebar-trigger.js +6 -1
  111. package/dist/components/seki-sidebar.js +5 -2
  112. package/dist/components/seki-tooltip.js +47 -2
  113. package/dist/esm/loader.js +1 -1
  114. package/dist/esm/option-id-CQQRfw1L.js +18 -0
  115. package/dist/esm/seki-carousel-dots.entry.js +7 -3
  116. package/dist/esm/seki-carousel-next.entry.js +8 -6
  117. package/dist/esm/seki-carousel-previous.entry.js +8 -6
  118. package/dist/esm/seki-carousel.entry.js +15 -1
  119. package/dist/esm/seki-date-picker.entry.js +64 -32
  120. package/dist/esm/seki-drawer.entry.js +67 -27
  121. package/dist/esm/seki-hover-card-content.entry.js +2 -2
  122. package/dist/esm/seki-hover-card-trigger.entry.js +3 -3
  123. package/dist/esm/seki-hover-card.entry.js +53 -3
  124. package/dist/esm/seki-resizable-handle.entry.js +11 -2
  125. package/dist/esm/seki-resizable-panel-group.entry.js +9 -3
  126. package/dist/esm/seki-resizable-panel.entry.js +42 -20
  127. package/dist/esm/seki-select-content.entry.js +20 -11
  128. package/dist/esm/seki-select-group.entry.js +2 -2
  129. package/dist/esm/seki-select-option.entry.js +32 -13
  130. package/dist/esm/seki-select-trigger.entry.js +5 -2
  131. package/dist/esm/seki-select.entry.js +2 -2
  132. package/dist/esm/seki-sheet.entry.js +62 -25
  133. package/dist/esm/seki-sidebar-footer.entry.js +3 -1
  134. package/dist/esm/seki-sidebar-header.entry.js +3 -1
  135. package/dist/esm/seki-sidebar-menu-button.entry.js +3 -1
  136. package/dist/esm/seki-sidebar-rail.entry.js +3 -1
  137. package/dist/esm/seki-sidebar-trigger.entry.js +6 -1
  138. package/dist/esm/seki-sidebar.entry.js +5 -2
  139. package/dist/esm/seki-tooltip.entry.js +43 -2
  140. package/dist/esm/sekiui.js +1 -1
  141. package/dist/esm/when-defined-C9-yH6MD.js +33 -0
  142. package/dist/sekiui/p-02f1728e.entry.js +1 -0
  143. package/dist/sekiui/p-05b33a61.entry.js +1 -0
  144. package/dist/sekiui/p-12e36a4f.entry.js +1 -0
  145. package/dist/sekiui/p-1cd6b3e6.entry.js +1 -0
  146. package/dist/sekiui/p-1e24698b.entry.js +1 -0
  147. package/dist/sekiui/p-26bb17cb.entry.js +1 -0
  148. package/dist/sekiui/p-26d433ff.entry.js +1 -0
  149. package/dist/sekiui/p-26f96e2d.entry.js +1 -0
  150. package/dist/sekiui/p-29b22c0f.entry.js +1 -0
  151. package/dist/sekiui/p-30fafcc6.entry.js +1 -0
  152. package/dist/sekiui/p-3de5878b.entry.js +1 -0
  153. package/dist/sekiui/p-649dbdf0.entry.js +1 -0
  154. package/dist/sekiui/p-71656184.entry.js +1 -0
  155. package/dist/sekiui/p-7926c04a.entry.js +1 -0
  156. package/dist/sekiui/p-9f4149b9.entry.js +1 -0
  157. package/dist/sekiui/p-C9-yH6MD.js +1 -0
  158. package/dist/sekiui/p-CQQRfw1L.js +1 -0
  159. package/dist/sekiui/p-ae87ca35.entry.js +1 -0
  160. package/dist/sekiui/p-b82c2267.entry.js +1 -0
  161. package/dist/sekiui/p-bf151423.entry.js +1 -0
  162. package/dist/sekiui/{p-219c8350.entry.js → p-c0f21b6a.entry.js} +1 -1
  163. package/dist/sekiui/p-c3ef507f.entry.js +1 -0
  164. package/dist/sekiui/p-d10a186d.entry.js +1 -0
  165. package/dist/sekiui/p-d1c72c91.entry.js +1 -0
  166. package/dist/sekiui/p-d1d3ae40.entry.js +1 -0
  167. package/dist/sekiui/p-fba3fa73.entry.js +1 -0
  168. package/dist/sekiui/p-fe3e661d.entry.js +1 -0
  169. package/dist/sekiui/sekiui.esm.js +1 -1
  170. package/dist/types/components/carousel/seki-carousel.d.ts +1 -0
  171. package/dist/types/components/date-picker/seki-date-picker.d.ts +21 -5
  172. package/dist/types/components/drawer/seki-drawer.d.ts +22 -6
  173. package/dist/types/components/hover-card/seki-hover-card.d.ts +24 -4
  174. package/dist/types/components/resizable/seki-resizable-handle.d.ts +1 -0
  175. package/dist/types/components/resizable/seki-resizable-panel-group.d.ts +6 -0
  176. package/dist/types/components/resizable/seki-resizable-panel.d.ts +9 -0
  177. package/dist/types/components/select/seki-select.d.ts +3 -3
  178. package/dist/types/components/select-content/seki-select-content.d.ts +8 -5
  179. package/dist/types/components/select-option/seki-select-option.d.ts +6 -4
  180. package/dist/types/components/sheet/seki-sheet.d.ts +22 -6
  181. package/dist/types/components/tooltip/seki-tooltip.d.ts +13 -0
  182. package/dist/types/components.d.ts +145 -17
  183. package/dist/types/utils/select/index.d.ts +1 -0
  184. package/dist/types/utils/select/option-id.d.ts +14 -0
  185. package/dist/types/utils/select/types.d.ts +0 -7
  186. package/dist/types/utils/when-defined.d.ts +19 -0
  187. package/package.json +3 -1
  188. package/dist/sekiui/p-01f26bec.entry.js +0 -1
  189. package/dist/sekiui/p-117b6f5a.entry.js +0 -1
  190. package/dist/sekiui/p-1250cad1.entry.js +0 -1
  191. package/dist/sekiui/p-1866201e.entry.js +0 -1
  192. package/dist/sekiui/p-2e18933c.entry.js +0 -1
  193. package/dist/sekiui/p-2e2e7d0b.entry.js +0 -1
  194. package/dist/sekiui/p-346cc18f.entry.js +0 -1
  195. package/dist/sekiui/p-6311a4d8.entry.js +0 -1
  196. package/dist/sekiui/p-69843ed8.entry.js +0 -1
  197. package/dist/sekiui/p-779764c0.entry.js +0 -1
  198. package/dist/sekiui/p-786c153b.entry.js +0 -1
  199. package/dist/sekiui/p-87bcbb66.entry.js +0 -1
  200. package/dist/sekiui/p-88dd3e1f.entry.js +0 -1
  201. package/dist/sekiui/p-944c70a1.entry.js +0 -1
  202. package/dist/sekiui/p-9820cd16.entry.js +0 -1
  203. package/dist/sekiui/p-9abfa3a5.entry.js +0 -1
  204. package/dist/sekiui/p-ac7bd611.entry.js +0 -1
  205. package/dist/sekiui/p-b45e11d8.entry.js +0 -1
  206. package/dist/sekiui/p-c62c4ad7.entry.js +0 -1
  207. package/dist/sekiui/p-caa51bdf.entry.js +0 -1
  208. package/dist/sekiui/p-ce986fde.entry.js +0 -1
  209. package/dist/sekiui/p-e45e6992.entry.js +0 -1
  210. package/dist/sekiui/p-ede4bb0c.entry.js +0 -1
  211. package/dist/sekiui/p-f4abd9a2.entry.js +0 -1
@@ -34,27 +34,25 @@ export class SekiDatePicker {
34
34
  */
35
35
  this.required = false;
36
36
  /**
37
- * Whether the popover is open
37
+ * Controlled open state of the popover. Also readable/writable as the `open`
38
+ * attribute, so `<seki-date-picker open>` renders open with no script involved.
38
39
  */
39
- this.isOpen = false;
40
+ this.open = false;
41
+ /**
42
+ * Initial open state for uncontrolled usage
43
+ */
44
+ this.defaultOpen = false;
45
+ /**
46
+ * Internal state for whether the popover is open
47
+ */
48
+ this._isOpen = false;
40
49
  this.handleTriggerClick = () => {
41
- if (this.disabled)
42
- return;
43
- this.isOpen = !this.isOpen;
44
- if (this.isOpen) {
45
- this.sekiOpen.emit();
46
- requestAnimationFrame(() => {
47
- this.positionPopover();
48
- });
49
- }
50
- else {
51
- this.sekiClose.emit();
52
- }
50
+ this.toggleDatePicker();
53
51
  };
54
52
  this.handleDateSelect = (e) => {
55
53
  this.value = e.detail;
56
54
  this.sekiChange.emit(e.detail);
57
- this.close();
55
+ this.closeDatePicker();
58
56
  };
59
57
  this.handleRangeSelect = (e) => {
60
58
  var _a, _b;
@@ -62,16 +60,37 @@ export class SekiDatePicker {
62
60
  this.rangeTo = (_b = e.detail.to) !== null && _b !== void 0 ? _b : undefined;
63
61
  if (e.detail.from && e.detail.to) {
64
62
  this.sekiChange.emit(e.detail);
65
- this.close();
63
+ this.closeDatePicker();
66
64
  }
67
65
  };
68
66
  }
69
67
  componentWillLoad() {
68
+ this._isOpen = (this.open || this.defaultOpen) && !this.disabled;
69
+ this.open = this._isOpen;
70
70
  if ('attachInternals' in HTMLElement.prototype) {
71
71
  this.internals = this.el.attachInternals();
72
72
  }
73
73
  this.updateFormValue();
74
74
  }
75
+ componentDidLoad() {
76
+ if (this._isOpen) {
77
+ requestAnimationFrame(() => {
78
+ this.positionPopover();
79
+ });
80
+ }
81
+ }
82
+ handleOpenPropChange(newValue) {
83
+ // An outside assignment (`picker.open = true`) has to win after first render;
84
+ // `open` is only read once in componentWillLoad otherwise.
85
+ if (newValue === this._isOpen)
86
+ return;
87
+ if (newValue) {
88
+ this.openDatePicker();
89
+ }
90
+ else {
91
+ this.closeDatePicker();
92
+ }
93
+ }
75
94
  updateFormValue() {
76
95
  if (this.internals && typeof this.internals.setFormValue === 'function') {
77
96
  const value = this.parseDate(this.value);
@@ -136,28 +155,35 @@ export class SekiDatePicker {
136
155
  }
137
156
  handleKeyDown(event) {
138
157
  var _a;
139
- if (event.key === 'Escape' && this.isOpen) {
158
+ if (event.key === 'Escape' && this._isOpen) {
140
159
  event.preventDefault();
141
- this.close();
160
+ this.closeDatePicker();
142
161
  (_a = this.triggerRef) === null || _a === void 0 ? void 0 : _a.focus();
143
162
  }
144
163
  }
145
164
  handleDocumentClick(event) {
146
- if (!this.isOpen)
165
+ if (!this._isOpen)
147
166
  return;
148
167
  const target = event.target;
149
168
  if (!this.el.contains(target)) {
150
- this.close();
169
+ this.closeDatePicker();
151
170
  }
152
171
  }
153
172
  /**
154
173
  * Open the date picker popover
155
174
  */
156
- async open() {
157
- if (this.disabled)
175
+ async openDatePicker() {
176
+ if (this.disabled) {
177
+ // Keep the reflected prop honest when an open request is refused.
178
+ this.open = false;
179
+ return;
180
+ }
181
+ if (this._isOpen)
158
182
  return;
159
- this.isOpen = true;
183
+ this._isOpen = true;
184
+ this.open = true;
160
185
  this.sekiOpen.emit();
186
+ this.sekiOpenChange.emit(true);
161
187
  requestAnimationFrame(() => {
162
188
  this.positionPopover();
163
189
  });
@@ -165,19 +191,23 @@ export class SekiDatePicker {
165
191
  /**
166
192
  * Close the date picker popover
167
193
  */
168
- async close() {
169
- this.isOpen = false;
194
+ async closeDatePicker() {
195
+ if (!this._isOpen)
196
+ return;
197
+ this._isOpen = false;
198
+ this.open = false;
170
199
  this.sekiClose.emit();
200
+ this.sekiOpenChange.emit(false);
171
201
  }
172
202
  /**
173
203
  * Toggle the date picker popover
174
204
  */
175
- async toggle() {
176
- if (this.isOpen) {
177
- await this.close();
205
+ async toggleDatePicker() {
206
+ if (this._isOpen) {
207
+ await this.closeDatePicker();
178
208
  }
179
209
  else {
180
- await this.open();
210
+ await this.openDatePicker();
181
211
  }
182
212
  }
183
213
  connectedCallback() {
@@ -189,12 +219,12 @@ export class SekiDatePicker {
189
219
  const selectedDate = this.parseDate(this.value);
190
220
  const rangeFrom = this.parseDate(this.rangeFrom);
191
221
  const rangeTo = this.parseDate(this.rangeTo);
192
- return (h("div", { key: 'a3d95b5462a9acf744d73e4572b42ad0d64372a0', class: "seki-date-picker" }, h("button", { key: '75df88046597e51a5c1126d2c2a24575fb94bd80', type: "button", ref: el => (this.triggerRef = el), class: {
222
+ return (h("div", { key: '79b9eec6c71d77d2af7f006ee03f6a836f5405df', class: "seki-date-picker" }, h("button", { key: '54460e6603c806d24eb0c36baa1b5dbdd7aeb90d', type: "button", ref: el => (this.triggerRef = el), class: {
193
223
  'seki-date-picker__trigger': true,
194
- 'seki-date-picker__trigger--open': this.isOpen,
224
+ 'seki-date-picker__trigger--open': this._isOpen,
195
225
  'seki-date-picker__trigger--disabled': this.disabled,
196
226
  'seki-date-picker__trigger--has-value': hasValue,
197
- }, disabled: this.disabled, "aria-haspopup": "dialog", "aria-expanded": this.isOpen ? 'true' : 'false', "aria-label": this.ariaLabel || this.placeholder, onClick: this.handleTriggerClick }, h("svg", { key: '51d3e52e4ff4fe0ff6607f1accddb3b2307e3ad9', class: "seki-date-picker__icon", xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round" }, h("rect", { key: 'a0682b1fe6eb713698f34f0af5faff55e2f53191', x: "3", y: "4", width: "18", height: "18", rx: "2", ry: "2" }), h("line", { key: 'f18a51a0b1f98743dab69923ee12e6565716e141', x1: "16", y1: "2", x2: "16", y2: "6" }), h("line", { key: 'd3488713bec1c91106d9a5987788cc1d49548275', x1: "8", y1: "2", x2: "8", y2: "6" }), h("line", { key: 'e6275d8fd1a8fd664771f908735b62d8a8278ca9', x1: "3", y1: "10", x2: "21", y2: "10" })), h("span", { key: 'b7f5ddea3a0332f29aac7cfe9fcb6a895a3e1226', class: "seki-date-picker__value" }, hasValue ? displayValue : this.placeholder)), this.isOpen && (h("div", { key: 'eded3f27883fd65ac76e860d23e3009693fea06f', ref: el => (this.popoverRef = el), class: "seki-date-picker__popover", role: "dialog", "aria-modal": "true", "aria-label": "Choose date" }, h("seki-calendar", { key: '5013ae98d89933c8051d3699981a38817fc0e49e', mode: this.mode, selected: selectedDate === null || selectedDate === void 0 ? void 0 : selectedDate.toISOString(), "range-from": rangeFrom === null || rangeFrom === void 0 ? void 0 : rangeFrom.toISOString(), "range-to": rangeTo === null || rangeTo === void 0 ? void 0 : rangeTo.toISOString(), "min-date": this.minDate, "max-date": this.maxDate, onSekiSelect: this.handleDateSelect, onSekiRangeSelect: this.handleRangeSelect })))));
227
+ }, disabled: this.disabled, "aria-haspopup": "dialog", "aria-expanded": this._isOpen ? 'true' : 'false', "aria-label": this.ariaLabel || this.placeholder, onClick: this.handleTriggerClick }, h("svg", { key: 'b65b7e82e5ad5485f5f2dd5934fb00fe7a2df0e4', class: "seki-date-picker__icon", xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round" }, h("rect", { key: 'be93574c133eb04d61d765fa0d4d893dfd18de5b', x: "3", y: "4", width: "18", height: "18", rx: "2", ry: "2" }), h("line", { key: 'f60deabd7d2c3061b08b8245650935a85068937a', x1: "16", y1: "2", x2: "16", y2: "6" }), h("line", { key: 'e6dba2b6b7501a6e2de21a29edcafe1927f1ad4d', x1: "8", y1: "2", x2: "8", y2: "6" }), h("line", { key: '4ca41a9af0155298fcaf2f1273f3833ba1df379a', x1: "3", y1: "10", x2: "21", y2: "10" })), h("span", { key: 'f9ef3166165413282928920a7a1b726b1edc4d54', class: "seki-date-picker__value" }, hasValue ? displayValue : this.placeholder)), this._isOpen && (h("div", { key: '561b160f14e86b0a7c043a30ed6e315465d6160b', ref: el => (this.popoverRef = el), class: "seki-date-picker__popover", role: "dialog", "aria-modal": "true", "aria-label": "Choose date" }, h("seki-calendar", { key: '96688e161b3a3814ed27135905de95df437c8bbc', mode: this.mode, selected: selectedDate === null || selectedDate === void 0 ? void 0 : selectedDate.toISOString(), "range-from": rangeFrom === null || rangeFrom === void 0 ? void 0 : rangeFrom.toISOString(), "range-to": rangeTo === null || rangeTo === void 0 ? void 0 : rangeTo.toISOString(), "min-date": this.minDate, "max-date": this.maxDate, onSekiSelect: this.handleDateSelect, onSekiRangeSelect: this.handleRangeSelect })))));
198
228
  }
199
229
  static get is() { return "seki-date-picker"; }
200
230
  static get encapsulation() { return "shadow"; }
@@ -480,12 +510,52 @@ export class SekiDatePicker {
480
510
  "setter": false,
481
511
  "reflect": false,
482
512
  "attribute": "aria-label"
513
+ },
514
+ "open": {
515
+ "type": "boolean",
516
+ "mutable": true,
517
+ "complexType": {
518
+ "original": "boolean",
519
+ "resolved": "boolean",
520
+ "references": {}
521
+ },
522
+ "required": false,
523
+ "optional": false,
524
+ "docs": {
525
+ "tags": [],
526
+ "text": "Controlled open state of the popover. Also readable/writable as the `open`\nattribute, so `<seki-date-picker open>` renders open with no script involved."
527
+ },
528
+ "getter": false,
529
+ "setter": false,
530
+ "reflect": true,
531
+ "attribute": "open",
532
+ "defaultValue": "false"
533
+ },
534
+ "defaultOpen": {
535
+ "type": "boolean",
536
+ "mutable": false,
537
+ "complexType": {
538
+ "original": "boolean",
539
+ "resolved": "boolean",
540
+ "references": {}
541
+ },
542
+ "required": false,
543
+ "optional": false,
544
+ "docs": {
545
+ "tags": [],
546
+ "text": "Initial open state for uncontrolled usage"
547
+ },
548
+ "getter": false,
549
+ "setter": false,
550
+ "reflect": false,
551
+ "attribute": "default-open",
552
+ "defaultValue": "false"
483
553
  }
484
554
  };
485
555
  }
486
556
  static get states() {
487
557
  return {
488
- "isOpen": {}
558
+ "_isOpen": {}
489
559
  };
490
560
  }
491
561
  static get events() {
@@ -544,11 +614,26 @@ export class SekiDatePicker {
544
614
  "resolved": "void",
545
615
  "references": {}
546
616
  }
617
+ }, {
618
+ "method": "sekiOpenChange",
619
+ "name": "sekiOpenChange",
620
+ "bubbles": true,
621
+ "cancelable": true,
622
+ "composed": true,
623
+ "docs": {
624
+ "tags": [],
625
+ "text": "Emitted whenever the open state changes. Matches the dialog/popover/collapsible\nevent shape so a consumer can listen to one event name across every overlay."
626
+ },
627
+ "complexType": {
628
+ "original": "boolean",
629
+ "resolved": "boolean",
630
+ "references": {}
631
+ }
547
632
  }];
548
633
  }
549
634
  static get methods() {
550
635
  return {
551
- "open": {
636
+ "openDatePicker": {
552
637
  "complexType": {
553
638
  "signature": "() => Promise<void>",
554
639
  "parameters": [],
@@ -565,7 +650,7 @@ export class SekiDatePicker {
565
650
  "tags": []
566
651
  }
567
652
  },
568
- "close": {
653
+ "closeDatePicker": {
569
654
  "complexType": {
570
655
  "signature": "() => Promise<void>",
571
656
  "parameters": [],
@@ -582,7 +667,7 @@ export class SekiDatePicker {
582
667
  "tags": []
583
668
  }
584
669
  },
585
- "toggle": {
670
+ "toggleDatePicker": {
586
671
  "complexType": {
587
672
  "signature": "() => Promise<void>",
588
673
  "parameters": [],
@@ -604,6 +689,9 @@ export class SekiDatePicker {
604
689
  static get elementRef() { return "el"; }
605
690
  static get watchers() {
606
691
  return [{
692
+ "propName": "open",
693
+ "methodName": "handleOpenPropChange"
694
+ }, {
607
695
  "propName": "value",
608
696
  "methodName": "updateFormValue"
609
697
  }, {
@@ -19,51 +19,75 @@ import { syncTheme } from "../../utils/theme-sync";
19
19
  */
20
20
  export class SekiDrawer {
21
21
  constructor() {
22
+ /**
23
+ * Controlled open state. Also readable/writable as the `open` attribute, so
24
+ * `<seki-drawer open>` renders open with no script involved.
25
+ */
26
+ this.open = false;
27
+ /**
28
+ * Initial open state for uncontrolled usage
29
+ */
30
+ this.defaultOpen = false;
22
31
  /**
23
32
  * Internal state for drawer open/closed
24
33
  */
25
- this.isOpen = false;
34
+ this._isOpen = false;
26
35
  /**
27
36
  * Current snap point (0-1)
28
37
  */
29
38
  this.currentSnapPoint = 1;
30
39
  }
40
+ componentWillLoad() {
41
+ this._isOpen = this.open || this.defaultOpen;
42
+ this.open = this._isOpen;
43
+ this.currentSnapPoint = this._isOpen ? 1 : 0;
44
+ }
45
+ componentDidLoad() {
46
+ this.updateContext();
47
+ }
48
+ handleOpenPropChange(newValue) {
49
+ // An outside assignment (`drawer.open = true`) has to win after first render;
50
+ // `open` is only read once in componentWillLoad otherwise.
51
+ if (newValue === this._isOpen)
52
+ return;
53
+ if (newValue) {
54
+ this.openDrawer();
55
+ }
56
+ else {
57
+ this.closeDrawer();
58
+ }
59
+ }
31
60
  /**
32
61
  * Opens the drawer
33
62
  */
34
- async open() {
35
- this.isOpen = true;
63
+ async openDrawer() {
64
+ this._isOpen = true;
65
+ this.open = true;
36
66
  this.currentSnapPoint = 1;
37
67
  this.updateContext();
38
68
  this.drawerOpen.emit();
69
+ this.sekiOpenChange.emit(true);
39
70
  }
40
71
  /**
41
72
  * Closes the drawer
42
73
  */
43
- async close() {
44
- this.isOpen = false;
74
+ async closeDrawer() {
75
+ this._isOpen = false;
76
+ this.open = false;
45
77
  this.currentSnapPoint = 0;
46
78
  this.updateContext();
47
79
  this.drawerClose.emit();
48
- }
49
- updateContext() {
50
- // seki-drawer-content has no other way to know this drawer's open state —
51
- // it reads this off the host element via closest('seki-drawer').
52
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
53
- this.el._drawerContext = { isOpen: this.isOpen };
54
- }
55
- componentDidLoad() {
56
- this.updateContext();
80
+ this.sekiOpenChange.emit(false);
57
81
  }
58
82
  /**
59
83
  * Toggles the drawer
60
84
  */
61
- async toggle() {
62
- if (this.isOpen) {
63
- await this.close();
85
+ async toggleDrawer() {
86
+ if (this._isOpen) {
87
+ await this.closeDrawer();
64
88
  }
65
89
  else {
66
- await this.open();
90
+ await this.openDrawer();
67
91
  }
68
92
  }
69
93
  /**
@@ -71,37 +95,49 @@ export class SekiDrawer {
71
95
  */
72
96
  async snapTo(point) {
73
97
  if (point <= 0) {
74
- await this.close();
98
+ await this.closeDrawer();
75
99
  }
76
100
  else {
77
101
  this.currentSnapPoint = point;
78
- this.isOpen = true;
102
+ const wasOpen = this._isOpen;
103
+ this._isOpen = true;
104
+ this.open = true;
79
105
  this.updateContext();
106
+ if (!wasOpen) {
107
+ this.drawerOpen.emit();
108
+ this.sekiOpenChange.emit(true);
109
+ }
80
110
  this.drawerSnap.emit({ point });
81
111
  }
82
112
  }
113
+ updateContext() {
114
+ // seki-drawer-content has no other way to know this drawer's open state —
115
+ // it reads this off the host element via closest('seki-drawer').
116
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
117
+ this.el._drawerContext = { isOpen: this._isOpen };
118
+ }
83
119
  handleTriggerClick() {
84
- this.toggle();
120
+ this.toggleDrawer();
85
121
  }
86
122
  handleRequestClose() {
87
- this.close();
123
+ this.closeDrawer();
88
124
  }
89
125
  handleRequestSnap(event) {
90
126
  this.snapTo(event.detail.point);
91
127
  }
92
128
  handleKeydown(ev) {
93
- if (this.isOpen && ev.key === 'Escape') {
94
- this.close();
129
+ if (this._isOpen && ev.key === 'Escape') {
130
+ this.closeDrawer();
95
131
  }
96
132
  }
97
133
  connectedCallback() {
98
134
  syncTheme(this.el);
99
135
  }
100
136
  render() {
101
- return (h("div", { key: '7ae3c36bf05c4e2d9957083912da105b559a47e6', class: {
137
+ return (h("div", { key: '824d218c42cd41a0a79bef604e940f6c95a64470', class: {
102
138
  'seki-drawer': true,
103
- 'seki-drawer--open': this.isOpen,
104
- }, "data-snap-point": this.currentSnapPoint, part: "drawer" }, h("slot", { key: '6ef97e42496716b572d85d460dc25b63fdb8ff56' }), this.isOpen && (h("div", { key: 'fd17a0aa91fbd193a47ac1449eb85e6b972fe586', class: "seki-drawer-overlay", part: "overlay", onClick: () => this.close() }))));
139
+ 'seki-drawer--open': this._isOpen,
140
+ }, "data-snap-point": this.currentSnapPoint, part: "drawer" }, h("slot", { key: '26982c14006c01915390898306d79fa665e30463' }), this._isOpen && (h("div", { key: 'a0f90520c0deaa5c320bbc027ca5b6a4edc4d9ff', class: "seki-drawer-overlay", part: "overlay", onClick: () => this.closeDrawer() }))));
105
141
  }
106
142
  static get is() { return "seki-drawer"; }
107
143
  static get encapsulation() { return "shadow"; }
@@ -115,9 +151,53 @@ export class SekiDrawer {
115
151
  "$": ["seki-drawer.css"]
116
152
  };
117
153
  }
154
+ static get properties() {
155
+ return {
156
+ "open": {
157
+ "type": "boolean",
158
+ "mutable": true,
159
+ "complexType": {
160
+ "original": "boolean",
161
+ "resolved": "boolean",
162
+ "references": {}
163
+ },
164
+ "required": false,
165
+ "optional": false,
166
+ "docs": {
167
+ "tags": [],
168
+ "text": "Controlled open state. Also readable/writable as the `open` attribute, so\n`<seki-drawer open>` renders open with no script involved."
169
+ },
170
+ "getter": false,
171
+ "setter": false,
172
+ "reflect": true,
173
+ "attribute": "open",
174
+ "defaultValue": "false"
175
+ },
176
+ "defaultOpen": {
177
+ "type": "boolean",
178
+ "mutable": false,
179
+ "complexType": {
180
+ "original": "boolean",
181
+ "resolved": "boolean",
182
+ "references": {}
183
+ },
184
+ "required": false,
185
+ "optional": false,
186
+ "docs": {
187
+ "tags": [],
188
+ "text": "Initial open state for uncontrolled usage"
189
+ },
190
+ "getter": false,
191
+ "setter": false,
192
+ "reflect": false,
193
+ "attribute": "default-open",
194
+ "defaultValue": "false"
195
+ }
196
+ };
197
+ }
118
198
  static get states() {
119
199
  return {
120
- "isOpen": {},
200
+ "_isOpen": {},
121
201
  "currentSnapPoint": {}
122
202
  };
123
203
  }
@@ -167,11 +247,26 @@ export class SekiDrawer {
167
247
  "resolved": "{ point: number; }",
168
248
  "references": {}
169
249
  }
250
+ }, {
251
+ "method": "sekiOpenChange",
252
+ "name": "sekiOpenChange",
253
+ "bubbles": true,
254
+ "cancelable": true,
255
+ "composed": true,
256
+ "docs": {
257
+ "tags": [],
258
+ "text": "Emitted whenever the open state changes. Matches the dialog/popover/collapsible\nevent shape so a consumer can listen to one event name across every overlay."
259
+ },
260
+ "complexType": {
261
+ "original": "boolean",
262
+ "resolved": "boolean",
263
+ "references": {}
264
+ }
170
265
  }];
171
266
  }
172
267
  static get methods() {
173
268
  return {
174
- "open": {
269
+ "openDrawer": {
175
270
  "complexType": {
176
271
  "signature": "() => Promise<void>",
177
272
  "parameters": [],
@@ -188,7 +283,7 @@ export class SekiDrawer {
188
283
  "tags": []
189
284
  }
190
285
  },
191
- "close": {
286
+ "closeDrawer": {
192
287
  "complexType": {
193
288
  "signature": "() => Promise<void>",
194
289
  "parameters": [],
@@ -205,7 +300,7 @@ export class SekiDrawer {
205
300
  "tags": []
206
301
  }
207
302
  },
208
- "toggle": {
303
+ "toggleDrawer": {
209
304
  "complexType": {
210
305
  "signature": "() => Promise<void>",
211
306
  "parameters": [],
@@ -246,6 +341,12 @@ export class SekiDrawer {
246
341
  };
247
342
  }
248
343
  static get elementRef() { return "el"; }
344
+ static get watchers() {
345
+ return [{
346
+ "propName": "open",
347
+ "methodName": "handleOpenPropChange"
348
+ }];
349
+ }
249
350
  static get listeners() {
250
351
  return [{
251
352
  "name": "triggerClick",
@@ -104,8 +104,8 @@ export class SekiHoverCardContent {
104
104
  const hoverCard = this.el.closest('seki-hover-card');
105
105
  if (hoverCard) {
106
106
  this.openChangeHandler = (e) => {
107
- const detail = e.detail;
108
- this._isOpen = detail.open;
107
+ const open = e.detail;
108
+ this._isOpen = open;
109
109
  if (this._isOpen) {
110
110
  requestAnimationFrame(() => this.updatePosition());
111
111
  // Setup click-outside listener for touch devices
@@ -108,8 +108,8 @@ export class SekiHoverCardTrigger {
108
108
  const hoverCard = this.el.closest('seki-hover-card');
109
109
  if (hoverCard) {
110
110
  this.openChangeHandler = (e) => {
111
- const detail = e.detail;
112
- this.isOpen = detail.open;
111
+ const open = e.detail;
112
+ this.isOpen = open;
113
113
  };
114
114
  hoverCard.addEventListener('sekiOpenChange', this.openChangeHandler);
115
115
  }
@@ -128,7 +128,7 @@ export class SekiHoverCardTrigger {
128
128
  }
129
129
  }
130
130
  render() {
131
- return (h(Host, { key: '6dc1ea9ef0cdcfa026c5596a5fa11436c02381fd' }, h("span", { key: '18cc4b8b6eaddd5b62e2a8b1913b330ae8eaf418', 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: '75567a11e77bb2fae4b37a23f07b0fd26992f3ec' }))));
131
+ return (h(Host, { key: '8a9157aafd7dfc90a83570479ee34079892cb14c' }, h("span", { key: '7fbf401f8f560ca4b8f88f477964d2464f85c001', 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: 'ebedc058cb447bd2c5be2b8588b779d04d7f7778' }))));
132
132
  }
133
133
  static get is() { return "seki-hover-card-trigger"; }
134
134
  static get encapsulation() { return "shadow"; }