@sekiui/elements 0.0.49 → 0.0.51

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 (141) hide show
  1. package/dist/cdn/index.js +3 -3
  2. package/dist/cdn/{p-BLeUUc2-.js → p-bMBhrs0a.js} +29 -4
  3. package/dist/cdn/seki-button.js +2 -2
  4. package/dist/cdn/seki-field-description.js +2 -2
  5. package/dist/cdn/seki-field-error.js +2 -2
  6. package/dist/cdn/seki-field-group.js +2 -2
  7. package/dist/cdn/seki-field-label.js +2 -2
  8. package/dist/cdn/seki-field-legend.js +2 -2
  9. package/dist/cdn/seki-field.js +2 -2
  10. package/dist/cdn/seki-fieldset.js +2 -2
  11. package/dist/cdn/seki-input.js +2 -2
  12. package/dist/cdn/seki-select-content.d.ts +11 -0
  13. package/dist/cdn/seki-select-content.js +94 -0
  14. package/dist/cdn/seki-select-group.d.ts +11 -0
  15. package/dist/cdn/seki-select-group.js +42 -0
  16. package/dist/cdn/seki-select-option.d.ts +11 -0
  17. package/dist/cdn/seki-select-option.js +111 -0
  18. package/dist/cdn/seki-select-trigger.d.ts +11 -0
  19. package/dist/cdn/seki-select-trigger.js +149 -0
  20. package/dist/cdn/seki-select.d.ts +11 -0
  21. package/dist/cdn/seki-select.js +416 -0
  22. package/dist/cdn/seki-skeleton.js +3 -3
  23. package/dist/cjs/{index-BxD7Xe36.js → index-Dd6_-KaR.js} +29 -4
  24. package/dist/cjs/index.cjs.js +2 -2
  25. package/dist/cjs/loader.cjs.js +2 -2
  26. package/dist/cjs/seki-button.cjs.entry.js +2 -2
  27. package/dist/cjs/seki-field-description.cjs.entry.js +2 -2
  28. package/dist/cjs/seki-field-error.cjs.entry.js +2 -2
  29. package/dist/cjs/seki-field-group.cjs.entry.js +2 -2
  30. package/dist/cjs/seki-field-label.cjs.entry.js +2 -2
  31. package/dist/cjs/seki-field-legend.cjs.entry.js +2 -2
  32. package/dist/cjs/seki-field.cjs.entry.js +2 -2
  33. package/dist/cjs/seki-fieldset.cjs.entry.js +2 -2
  34. package/dist/cjs/seki-input.cjs.entry.js +2 -2
  35. package/dist/cjs/seki-select-content.cjs.entry.js +72 -0
  36. package/dist/cjs/seki-select-group.cjs.entry.js +21 -0
  37. package/dist/cjs/seki-select-option.cjs.entry.js +88 -0
  38. package/dist/cjs/seki-select-trigger.cjs.entry.js +128 -0
  39. package/dist/cjs/seki-select.cjs.entry.js +364 -0
  40. package/dist/cjs/seki-skeleton.cjs.entry.js +3 -3
  41. package/dist/cjs/seki-switch.cjs.entry.js +1 -1
  42. package/dist/cjs/sekiui.cjs.js +2 -2
  43. package/dist/collection/collection-manifest.json +5 -0
  44. package/dist/collection/components/button/seki-button.css +31 -0
  45. package/dist/collection/components/field/seki-field.css +31 -0
  46. package/dist/collection/components/field-description/seki-field-description.css +36 -3
  47. package/dist/collection/components/field-error/seki-field-error.css +36 -4
  48. package/dist/collection/components/field-group/seki-field-group.css +31 -0
  49. package/dist/collection/components/field-label/seki-field-label.css +36 -4
  50. package/dist/collection/components/field-legend/seki-field-legend.css +36 -4
  51. package/dist/collection/components/fieldset/seki-fieldset.css +31 -0
  52. package/dist/collection/components/input/seki-input.css +37 -3
  53. package/dist/collection/components/select/seki-select.css +441 -0
  54. package/dist/collection/components/select/seki-select.js +865 -0
  55. package/dist/collection/components/select-content/seki-select-content.css +434 -0
  56. package/dist/collection/components/select-content/seki-select-content.js +112 -0
  57. package/dist/collection/components/select-group/seki-select-group.css +428 -0
  58. package/dist/collection/components/select-group/seki-select-group.js +51 -0
  59. package/dist/collection/components/select-option/seki-select-option.css +458 -0
  60. package/dist/collection/components/select-option/seki-select-option.js +188 -0
  61. package/dist/collection/components/select-trigger/seki-select-trigger.css +514 -0
  62. package/dist/collection/components/select-trigger/seki-select-trigger.js +140 -0
  63. package/dist/collection/components/skeleton/seki-skeleton.css +31 -0
  64. package/dist/collection/components/skeleton/seki-skeleton.js +1 -1
  65. package/dist/collection/components/switch/seki-switch.css +31 -0
  66. package/dist/collection/utils/select/index.js +6 -0
  67. package/dist/collection/utils/select/select-context.js +38 -0
  68. package/dist/collection/utils/select/types.js +1 -0
  69. package/dist/components/index.js +3 -3
  70. package/dist/components/{p-BFmmBW7R.js → p-QhPshhKB.js} +29 -4
  71. package/dist/components/seki-button.js +2 -2
  72. package/dist/components/seki-field-description.js +2 -2
  73. package/dist/components/seki-field-error.js +2 -2
  74. package/dist/components/seki-field-group.js +2 -2
  75. package/dist/components/seki-field-label.js +2 -2
  76. package/dist/components/seki-field-legend.js +2 -2
  77. package/dist/components/seki-field.js +2 -2
  78. package/dist/components/seki-fieldset.js +2 -2
  79. package/dist/components/seki-input.js +2 -2
  80. package/dist/components/seki-select-content.d.ts +11 -0
  81. package/dist/components/seki-select-content.js +94 -0
  82. package/dist/components/seki-select-group.d.ts +11 -0
  83. package/dist/components/seki-select-group.js +42 -0
  84. package/dist/components/seki-select-option.d.ts +11 -0
  85. package/dist/components/seki-select-option.js +111 -0
  86. package/dist/components/seki-select-trigger.d.ts +11 -0
  87. package/dist/components/seki-select-trigger.js +149 -0
  88. package/dist/components/seki-select.d.ts +11 -0
  89. package/dist/components/seki-select.js +416 -0
  90. package/dist/components/seki-skeleton.js +3 -3
  91. package/dist/esm/{index-ByHohxc0.js → index-CuXbV_yz.js} +29 -4
  92. package/dist/esm/index.js +2 -2
  93. package/dist/esm/loader.js +3 -3
  94. package/dist/esm/seki-button.entry.js +2 -2
  95. package/dist/esm/seki-field-description.entry.js +2 -2
  96. package/dist/esm/seki-field-error.entry.js +2 -2
  97. package/dist/esm/seki-field-group.entry.js +2 -2
  98. package/dist/esm/seki-field-label.entry.js +2 -2
  99. package/dist/esm/seki-field-legend.entry.js +2 -2
  100. package/dist/esm/seki-field.entry.js +2 -2
  101. package/dist/esm/seki-fieldset.entry.js +2 -2
  102. package/dist/esm/seki-input.entry.js +2 -2
  103. package/dist/esm/seki-select-content.entry.js +70 -0
  104. package/dist/esm/seki-select-group.entry.js +19 -0
  105. package/dist/esm/seki-select-option.entry.js +86 -0
  106. package/dist/esm/seki-select-trigger.entry.js +126 -0
  107. package/dist/esm/seki-select.entry.js +362 -0
  108. package/dist/esm/seki-skeleton.entry.js +3 -3
  109. package/dist/esm/seki-switch.entry.js +1 -1
  110. package/dist/esm/sekiui.js +3 -3
  111. package/dist/sekiui/index.esm.js +1 -1
  112. package/dist/sekiui/{p-bc921daa.entry.js → p-0e89720a.entry.js} +1 -1
  113. package/dist/sekiui/{p-1b1a5e38.entry.js → p-0f64a7dd.entry.js} +1 -1
  114. package/dist/sekiui/p-20eb85c9.entry.js +1 -0
  115. package/dist/sekiui/{p-128cfe90.entry.js → p-23a61342.entry.js} +1 -1
  116. package/dist/sekiui/{p-459bb637.entry.js → p-4eef5a47.entry.js} +1 -1
  117. package/dist/sekiui/{p-d034b071.entry.js → p-5852ad8e.entry.js} +1 -1
  118. package/dist/sekiui/{p-1c923d08.entry.js → p-62236175.entry.js} +1 -1
  119. package/dist/sekiui/p-6e238adf.entry.js +1 -0
  120. package/dist/sekiui/{p-2ecf7587.entry.js → p-93d70750.entry.js} +1 -1
  121. package/dist/sekiui/{p-70281e83.entry.js → p-9fe07f6e.entry.js} +1 -1
  122. package/dist/sekiui/p-CuXbV_yz.js +2 -0
  123. package/dist/sekiui/{p-51f2af94.entry.js → p-aad78e67.entry.js} +1 -1
  124. package/dist/sekiui/{p-281803dd.entry.js → p-c878de6d.entry.js} +1 -1
  125. package/dist/sekiui/p-c93edddc.entry.js +1 -0
  126. package/dist/sekiui/p-d7492f49.entry.js +1 -0
  127. package/dist/sekiui/{p-3b2d3e96.entry.js → p-eb19f073.entry.js} +1 -1
  128. package/dist/sekiui/p-eefbc037.entry.js +1 -0
  129. package/dist/sekiui/sekiui.css +1 -1
  130. package/dist/sekiui/sekiui.esm.js +1 -1
  131. package/dist/types/components/select/seki-select.d.ts +92 -0
  132. package/dist/types/components/select-content/seki-select-content.d.ts +15 -0
  133. package/dist/types/components/select-group/seki-select-group.d.ts +10 -0
  134. package/dist/types/components/select-option/seki-select-option.d.ts +30 -0
  135. package/dist/types/components/select-trigger/seki-select-trigger.d.ts +21 -0
  136. package/dist/types/components.d.ts +314 -0
  137. package/dist/types/utils/select/index.d.ts +6 -0
  138. package/dist/types/utils/select/select-context.d.ts +19 -0
  139. package/dist/types/utils/select/types.d.ts +109 -0
  140. package/package.json +4 -1
  141. package/dist/sekiui/p-ByHohxc0.js +0 -2
@@ -6,7 +6,9 @@
6
6
  */
7
7
  import { HTMLStencilElement, JSXBase } from "./stencil-public-runtime";
8
8
  import { Event } from "./stencil-public-runtime";
9
+ import { SelectChangeEventDetail, SelectOpenChangeEventDetail, SelectPlacement, SelectValidateEventDetail, SelectValue } from "./utils/select";
9
10
  export { Event } from "./stencil-public-runtime";
11
+ export { SelectChangeEventDetail, SelectOpenChangeEventDetail, SelectPlacement, SelectValidateEventDetail, SelectValue } from "./utils/select";
10
12
  export namespace Components {
11
13
  interface SekiButton {
12
14
  /**
@@ -183,6 +185,125 @@ export namespace Components {
183
185
  */
184
186
  "value"?: string;
185
187
  }
188
+ interface SekiSelect {
189
+ /**
190
+ * ID of element that describes this select
191
+ */
192
+ "ariaDescribedby"?: string;
193
+ /**
194
+ * Accessible label for screen readers
195
+ */
196
+ "ariaLabel"?: string;
197
+ /**
198
+ * ID of element that labels this select
199
+ */
200
+ "ariaLabelledby"?: string;
201
+ /**
202
+ * Clear all selections
203
+ */
204
+ "clearSelection": () => Promise<void>;
205
+ /**
206
+ * Programmatically close the dropdown
207
+ */
208
+ "closeDropdown": () => Promise<void>;
209
+ /**
210
+ * Initial dropdown open state (uncontrolled mode)
211
+ * @default false
212
+ */
213
+ "defaultOpen": boolean;
214
+ /**
215
+ * Initial selected value (uncontrolled mode)
216
+ */
217
+ "defaultValue"?: SelectValue;
218
+ /**
219
+ * Disable all interactions
220
+ * @default false
221
+ */
222
+ "disabled": boolean;
223
+ /**
224
+ * Focus the trigger element
225
+ */
226
+ "focusTrigger": () => Promise<void>;
227
+ /**
228
+ * Handle keyboard navigation (arrow keys, typeahead, etc.)
229
+ */
230
+ "handleKeyboard": (event: KeyboardEvent) => Promise<void>;
231
+ /**
232
+ * Maximum dropdown height
233
+ * @default '12.5rem'
234
+ */
235
+ "maxHeight": string;
236
+ /**
237
+ * Maximum visible pills in multi-select mode
238
+ * @default 3
239
+ */
240
+ "maxVisiblePills": number;
241
+ /**
242
+ * Enable multi-select mode
243
+ * @default false
244
+ */
245
+ "multiple": boolean;
246
+ /**
247
+ * Form field name for form submission
248
+ */
249
+ "name"?: string;
250
+ /**
251
+ * Control dropdown open state (controlled mode)
252
+ */
253
+ "open"?: boolean;
254
+ /**
255
+ * Programmatically open the dropdown
256
+ */
257
+ "openDropdown": () => Promise<void>;
258
+ /**
259
+ * Placeholder text shown when no selection
260
+ * @default 'Select an option'
261
+ */
262
+ "placeholder": string;
263
+ /**
264
+ * Preferred dropdown placement
265
+ * @default 'bottom'
266
+ */
267
+ "placement": SelectPlacement;
268
+ /**
269
+ * Mark as required for form validation
270
+ * @default false
271
+ */
272
+ "required": boolean;
273
+ /**
274
+ * Current selected value (controlled mode)
275
+ */
276
+ "value"?: SelectValue;
277
+ }
278
+ interface SekiSelectContent {
279
+ /**
280
+ * Scroll to make an option visible
281
+ */
282
+ "scrollToOption": (optionId: string) => Promise<void>;
283
+ }
284
+ interface SekiSelectGroup {
285
+ /**
286
+ * Group label text (required)
287
+ */
288
+ "label": string;
289
+ }
290
+ interface SekiSelectOption {
291
+ /**
292
+ * Whether the option is disabled
293
+ * @default false
294
+ */
295
+ "disabled": boolean;
296
+ /**
297
+ * Display text for the option
298
+ */
299
+ "label"?: string;
300
+ /**
301
+ * Unique identifier for the option (required)
302
+ */
303
+ "value": string | number;
304
+ }
305
+ interface SekiSelectTrigger {
306
+ }
186
307
  /**
187
308
  * @component seki-skeleton
188
309
  * @description A loading placeholder component that displays an animated skeleton while content is loading
@@ -242,6 +363,14 @@ export interface SekiInputCustomEvent<T> extends CustomEvent<T> {
242
363
  detail: T;
243
364
  target: HTMLSekiInputElement;
244
365
  }
366
+ export interface SekiSelectCustomEvent<T> extends CustomEvent<T> {
367
+ detail: T;
368
+ target: HTMLSekiSelectElement;
369
+ }
370
+ export interface SekiSelectOptionCustomEvent<T> extends CustomEvent<T> {
371
+ detail: T;
372
+ target: HTMLSekiSelectOptionElement;
373
+ }
245
374
  export interface SekiSwitchCustomEvent<T> extends CustomEvent<T> {
246
375
  detail: T;
247
376
  target: HTMLSekiSwitchElement;
@@ -315,6 +444,61 @@ declare global {
315
444
  prototype: HTMLSekiInputElement;
316
445
  new (): HTMLSekiInputElement;
317
446
  };
447
+ interface HTMLSekiSelectElementEventMap {
448
+ "sekiChange": SelectChangeEventDetail;
449
+ "sekiOpenChange": SelectOpenChangeEventDetail;
450
+ "sekiValidate": SelectValidateEventDetail;
451
+ }
452
+ interface HTMLSekiSelectElement extends Components.SekiSelect, HTMLStencilElement {
453
+ addEventListener<K extends keyof HTMLSekiSelectElementEventMap>(type: K, listener: (this: HTMLSekiSelectElement, ev: SekiSelectCustomEvent<HTMLSekiSelectElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
454
+ addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
455
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
456
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
457
+ removeEventListener<K extends keyof HTMLSekiSelectElementEventMap>(type: K, listener: (this: HTMLSekiSelectElement, ev: SekiSelectCustomEvent<HTMLSekiSelectElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
458
+ removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
459
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
460
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
461
+ }
462
+ var HTMLSekiSelectElement: {
463
+ prototype: HTMLSekiSelectElement;
464
+ new (): HTMLSekiSelectElement;
465
+ };
466
+ interface HTMLSekiSelectContentElement extends Components.SekiSelectContent, HTMLStencilElement {
467
+ }
468
+ var HTMLSekiSelectContentElement: {
469
+ prototype: HTMLSekiSelectContentElement;
470
+ new (): HTMLSekiSelectContentElement;
471
+ };
472
+ interface HTMLSekiSelectGroupElement extends Components.SekiSelectGroup, HTMLStencilElement {
473
+ }
474
+ var HTMLSekiSelectGroupElement: {
475
+ prototype: HTMLSekiSelectGroupElement;
476
+ new (): HTMLSekiSelectGroupElement;
477
+ };
478
+ interface HTMLSekiSelectOptionElementEventMap {
479
+ "sekiOptionSelect": { value: string | number };
480
+ "sekiOptionFocus": { value: string | number };
481
+ }
482
+ interface HTMLSekiSelectOptionElement extends Components.SekiSelectOption, HTMLStencilElement {
483
+ addEventListener<K extends keyof HTMLSekiSelectOptionElementEventMap>(type: K, listener: (this: HTMLSekiSelectOptionElement, ev: SekiSelectOptionCustomEvent<HTMLSekiSelectOptionElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
484
+ addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
485
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
486
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
487
+ removeEventListener<K extends keyof HTMLSekiSelectOptionElementEventMap>(type: K, listener: (this: HTMLSekiSelectOptionElement, ev: SekiSelectOptionCustomEvent<HTMLSekiSelectOptionElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
488
+ removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
489
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
490
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
491
+ }
492
+ var HTMLSekiSelectOptionElement: {
493
+ prototype: HTMLSekiSelectOptionElement;
494
+ new (): HTMLSekiSelectOptionElement;
495
+ };
496
+ interface HTMLSekiSelectTriggerElement extends Components.SekiSelectTrigger, HTMLStencilElement {
497
+ }
498
+ var HTMLSekiSelectTriggerElement: {
499
+ prototype: HTMLSekiSelectTriggerElement;
500
+ new (): HTMLSekiSelectTriggerElement;
501
+ };
318
502
  /**
319
503
  * @component seki-skeleton
320
504
  * @description A loading placeholder component that displays an animated skeleton while content is loading
@@ -361,6 +545,11 @@ declare global {
361
545
  "seki-field-legend": HTMLSekiFieldLegendElement;
362
546
  "seki-fieldset": HTMLSekiFieldsetElement;
363
547
  "seki-input": HTMLSekiInputElement;
548
+ "seki-select": HTMLSekiSelectElement;
549
+ "seki-select-content": HTMLSekiSelectContentElement;
550
+ "seki-select-group": HTMLSekiSelectGroupElement;
551
+ "seki-select-option": HTMLSekiSelectOptionElement;
552
+ "seki-select-trigger": HTMLSekiSelectTriggerElement;
364
553
  "seki-skeleton": HTMLSekiSkeletonElement;
365
554
  "seki-switch": HTMLSekiSwitchElement;
366
555
  }
@@ -545,6 +734,121 @@ declare namespace LocalJSX {
545
734
  */
546
735
  "value"?: string;
547
736
  }
737
+ interface SekiSelect {
738
+ /**
739
+ * ID of element that describes this select
740
+ */
741
+ "ariaDescribedby"?: string;
742
+ /**
743
+ * Accessible label for screen readers
744
+ */
745
+ "ariaLabel"?: string;
746
+ /**
747
+ * ID of element that labels this select
748
+ */
749
+ "ariaLabelledby"?: string;
750
+ /**
751
+ * Initial dropdown open state (uncontrolled mode)
752
+ * @default false
753
+ */
754
+ "defaultOpen"?: boolean;
755
+ /**
756
+ * Initial selected value (uncontrolled mode)
757
+ */
758
+ "defaultValue"?: SelectValue;
759
+ /**
760
+ * Disable all interactions
761
+ * @default false
762
+ */
763
+ "disabled"?: boolean;
764
+ /**
765
+ * Maximum dropdown height
766
+ * @default '12.5rem'
767
+ */
768
+ "maxHeight"?: string;
769
+ /**
770
+ * Maximum visible pills in multi-select mode
771
+ * @default 3
772
+ */
773
+ "maxVisiblePills"?: number;
774
+ /**
775
+ * Enable multi-select mode
776
+ * @default false
777
+ */
778
+ "multiple"?: boolean;
779
+ /**
780
+ * Form field name for form submission
781
+ */
782
+ "name"?: string;
783
+ /**
784
+ * Emitted when selected value changes
785
+ */
786
+ "onSekiChange"?: (event: SekiSelectCustomEvent<SelectChangeEventDetail>) => void;
787
+ /**
788
+ * Emitted when dropdown open state changes
789
+ */
790
+ "onSekiOpenChange"?: (event: SekiSelectCustomEvent<SelectOpenChangeEventDetail>) => void;
791
+ /**
792
+ * Emitted when validation state changes
793
+ */
794
+ "onSekiValidate"?: (event: SekiSelectCustomEvent<SelectValidateEventDetail>) => void;
795
+ /**
796
+ * Control dropdown open state (controlled mode)
797
+ */
798
+ "open"?: boolean;
799
+ /**
800
+ * Placeholder text shown when no selection
801
+ * @default 'Select an option'
802
+ */
803
+ "placeholder"?: string;
804
+ /**
805
+ * Preferred dropdown placement
806
+ * @default 'bottom'
807
+ */
808
+ "placement"?: SelectPlacement;
809
+ /**
810
+ * Mark as required for form validation
811
+ * @default false
812
+ */
813
+ "required"?: boolean;
814
+ /**
815
+ * Current selected value (controlled mode)
816
+ */
817
+ "value"?: SelectValue;
818
+ }
819
+ interface SekiSelectContent {
820
+ }
821
+ interface SekiSelectGroup {
822
+ /**
823
+ * Group label text (required)
824
+ */
825
+ "label": string;
826
+ }
827
+ interface SekiSelectOption {
828
+ /**
829
+ * Whether the option is disabled
830
+ * @default false
831
+ */
832
+ "disabled"?: boolean;
833
+ /**
834
+ * Display text for the option
835
+ */
836
+ "label"?: string;
837
+ /**
838
+ * Emitted when option receives focus
839
+ */
840
+ "onSekiOptionFocus"?: (event: SekiSelectOptionCustomEvent<{ value: string | number }>) => void;
841
+ /**
842
+ * Emitted when option is selected
843
+ */
844
+ "onSekiOptionSelect"?: (event: SekiSelectOptionCustomEvent<{ value: string | number }>) => void;
845
+ /**
846
+ * Unique identifier for the option (required)
847
+ */
848
+ "value": string | number;
849
+ }
850
+ interface SekiSelectTrigger {
851
+ }
548
852
  /**
549
853
  * @component seki-skeleton
550
854
  * @description A loading placeholder component that displays an animated skeleton while content is loading
@@ -613,6 +917,11 @@ declare namespace LocalJSX {
613
917
  "seki-field-legend": SekiFieldLegend;
614
918
  "seki-fieldset": SekiFieldset;
615
919
  "seki-input": SekiInput;
920
+ "seki-select": SekiSelect;
921
+ "seki-select-content": SekiSelectContent;
922
+ "seki-select-group": SekiSelectGroup;
923
+ "seki-select-option": SekiSelectOption;
924
+ "seki-select-trigger": SekiSelectTrigger;
616
925
  "seki-skeleton": SekiSkeleton;
617
926
  "seki-switch": SekiSwitch;
618
927
  }
@@ -630,6 +939,11 @@ declare module "@stencil/core" {
630
939
  "seki-field-legend": LocalJSX.SekiFieldLegend & JSXBase.HTMLAttributes<HTMLSekiFieldLegendElement>;
631
940
  "seki-fieldset": LocalJSX.SekiFieldset & JSXBase.HTMLAttributes<HTMLSekiFieldsetElement>;
632
941
  "seki-input": LocalJSX.SekiInput & JSXBase.HTMLAttributes<HTMLSekiInputElement>;
942
+ "seki-select": LocalJSX.SekiSelect & JSXBase.HTMLAttributes<HTMLSekiSelectElement>;
943
+ "seki-select-content": LocalJSX.SekiSelectContent & JSXBase.HTMLAttributes<HTMLSekiSelectContentElement>;
944
+ "seki-select-group": LocalJSX.SekiSelectGroup & JSXBase.HTMLAttributes<HTMLSekiSelectGroupElement>;
945
+ "seki-select-option": LocalJSX.SekiSelectOption & JSXBase.HTMLAttributes<HTMLSekiSelectOptionElement>;
946
+ "seki-select-trigger": LocalJSX.SekiSelectTrigger & JSXBase.HTMLAttributes<HTMLSekiSelectTriggerElement>;
633
947
  /**
634
948
  * @component seki-skeleton
635
949
  * @description A loading placeholder component that displays an animated skeleton while content is loading
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Select Utilities
3
+ * Shared utilities, types, and context for select components
4
+ */
5
+ export * from './types';
6
+ export * from './select-context';
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Select Context
3
+ * Context for sharing state between select components
4
+ */
5
+ import type { SelectContext } from './types';
6
+ /**
7
+ * Default context value
8
+ * Used as placeholder before provider initializes
9
+ */
10
+ export declare const defaultSelectContext: SelectContext;
11
+ /**
12
+ * Context for select component family
13
+ *
14
+ * Note: Since Stencil doesn't provide built-in context API,
15
+ * we use direct parent-child communication via element references.
16
+ *
17
+ * The parent seki-select component exposes a `selectContext` property
18
+ * that children can access via `this.el.closest('seki-select').selectContext`
19
+ */
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Select Component Type Definitions
3
+ * Shared types used across all select components
4
+ */
5
+ /**
6
+ * Value type for select component
7
+ * - Single-select: string | number
8
+ * - Multi-select: (string | number)[]
9
+ */
10
+ export type SelectValue = string | number | (string | number)[];
11
+ /**
12
+ * Option data structure
13
+ */
14
+ export interface SelectOption {
15
+ /** Unique identifier for the option */
16
+ value: string | number;
17
+ /** Display text for the option */
18
+ label: string;
19
+ /** Whether the option is disabled */
20
+ disabled?: boolean;
21
+ /** Whether the option is selected */
22
+ selected?: boolean;
23
+ }
24
+ /**
25
+ * Event detail for selection change
26
+ */
27
+ export interface SelectChangeEventDetail {
28
+ /** Current value (single or array) */
29
+ value: SelectValue;
30
+ /** Selected option (single-select only) */
31
+ option?: SelectOption;
32
+ /** Selected options (multi-select only) */
33
+ options?: SelectOption[];
34
+ }
35
+ /**
36
+ * Event detail for open state change
37
+ */
38
+ export interface SelectOpenChangeEventDetail {
39
+ /** Whether dropdown is open */
40
+ open: boolean;
41
+ }
42
+ /**
43
+ * Event detail for validation state
44
+ */
45
+ export interface SelectValidateEventDetail {
46
+ /** Whether the value is valid */
47
+ valid: boolean;
48
+ /** Error message if invalid */
49
+ errorMessage?: string;
50
+ }
51
+ /**
52
+ * Dropdown placement options
53
+ */
54
+ export type SelectPlacement = 'top' | 'bottom' | 'left' | 'right';
55
+ /**
56
+ * Context shared between select components
57
+ * Provided by seki-select, consumed by child components
58
+ */
59
+ export interface SelectContext {
60
+ /** Current selected value(s) */
61
+ value: SelectValue;
62
+ /** Whether multi-select mode is enabled */
63
+ multiple: boolean;
64
+ /** Whether dropdown is open */
65
+ open: boolean;
66
+ /** Whether select is disabled */
67
+ disabled: boolean;
68
+ /** Whether select is required */
69
+ required: boolean;
70
+ /** Currently focused option value */
71
+ focusedOptionValue: string | number | null;
72
+ /** Unique ID for the content element (for aria-controls) */
73
+ contentId: string;
74
+ /** Unique ID for the trigger element */
75
+ triggerId: string;
76
+ /** Accessible label for screen readers */
77
+ ariaLabel?: string;
78
+ /** ID of element that labels this select */
79
+ ariaLabelledby?: string;
80
+ /** ID of element that describes this select */
81
+ ariaDescribedby?: string;
82
+ /** Handler for value changes */
83
+ onValueChange: (value: SelectValue) => void;
84
+ /** Handler for open state changes */
85
+ onOpenChange: (open: boolean) => void;
86
+ /** Handler for option focus changes */
87
+ onOptionFocus: (value: string | number) => void;
88
+ /** Handler for option selection */
89
+ onOptionSelect: (value: string | number) => void;
90
+ /** Check if a value is selected */
91
+ isValueSelected: (value: string | number) => boolean;
92
+ /** Get all selected options */
93
+ getSelectedOptions: () => SelectOption[];
94
+ /** Register an option with the context */
95
+ registerOption: (option: SelectOption) => void;
96
+ /** Unregister an option from the context */
97
+ unregisterOption: (value: string | number) => void;
98
+ }
99
+ /**
100
+ * Type-ahead search state
101
+ */
102
+ export interface TypeAheadState {
103
+ /** Accumulated search string */
104
+ buffer: string;
105
+ /** Timeout ID for buffer reset */
106
+ timeoutId: number | null;
107
+ /** Debounce duration in milliseconds */
108
+ debounce: number;
109
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sekiui/elements",
3
- "version": "0.0.49",
3
+ "version": "0.0.51",
4
4
  "description": "Modern, accessible Web Components with shadcn/ui-inspired design",
5
5
  "main": "dist/index.cjs.js",
6
6
  "module": "dist/index.js",
@@ -55,5 +55,8 @@
55
55
  "lit": "^3.3.1",
56
56
  "prettier": "^3.6.2",
57
57
  "storybook": "^9.1.10"
58
+ },
59
+ "dependencies": {
60
+ "@floating-ui/dom": "^1.7.4"
58
61
  }
59
62
  }
@@ -1,2 +0,0 @@
1
- const e=()=>{};var t=Object.defineProperty,s=e=>{if(e.__stencil__getHostRef)return e.__stencil__getHostRef()},i=(e,t)=>{t&&(e.__stencil__getHostRef=()=>t,t.t=e)},n=(e,t)=>t in e,r=(e,t)=>(0,console.error)(e,t),o=new Map,l=new Map,a="slot-fb{display:contents}slot-fb[hidden]{display:none}",u="http://www.w3.org/1999/xlink",c=["formAssociatedCallback","formResetCallback","formDisabledCallback","formStateRestoreCallback"],k="undefined"!=typeof window?window:{},d={i:0,o:"",jmp:e=>e(),raf:e=>requestAnimationFrame(e),ael:(e,t,s,i)=>e.addEventListener(t,s,i),rel:(e,t,s,i)=>e.removeEventListener(t,s,i),ce:(e,t)=>new CustomEvent(e,t)},p=e=>Promise.resolve(e),h=(()=>{try{return new CSSStyleSheet,"function"==typeof(new CSSStyleSheet).replaceSync}catch(e){}return!1})(),f=!!h&&(()=>!!k.document&&Object.getOwnPropertyDescriptor(k.document.adoptedStyleSheets,"length").writable)(),m=!1,b=[],v=[],g=(e,t)=>s=>{e.push(s),m||(m=!0,t&&4&d.i?w(x):d.raf(x))},y=e=>{for(let t=0;t<e.length;t++)try{e[t](performance.now())}catch(e){r(e)}e.length=0},x=()=>{y(b),y(v),(m=b.length>0)&&d.raf(x)},w=e=>p().then(e),$=g(v,!0),S=e=>"object"==(e=typeof e)||"function"===e;function j(e){var t,s,i;return null!=(i=null==(s=null==(t=e.head)?void 0:t.querySelector('meta[name="csp-nonce"]'))?void 0:s.getAttribute("content"))?i:void 0}((e,s)=>{for(var i in s)t(e,i,{get:s[i],enumerable:!0})})({},{err:()=>C,map:()=>M,ok:()=>O,unwrap:()=>R,unwrapErr:()=>z});var O=e=>({isOk:!0,isErr:!1,value:e}),C=e=>({isOk:!1,isErr:!0,value:e});function M(e,t){if(e.isOk){const s=t(e.value);return s instanceof Promise?s.then((e=>O(e))):O(s)}if(e.isErr)return C(e.value);throw"should never get here"}var E,R=e=>{if(e.isOk)return e.value;throw e.value},z=e=>{if(e.isErr)return e.value;throw e.value};function P(){var e;const t=this.attachShadow({mode:"open"});void 0===E&&(E=null!=(e=function(){if(!h)return;const e=new CSSStyleSheet;return e.replaceSync(":host{--seki-neutral-50:hsl(0, 0%, 98%);--seki-neutral-100:hsl(0, 0%, 96.1%);--seki-neutral-200:hsl(0, 0%, 89.8%);--seki-neutral-300:hsl(0, 0%, 83.1%);--seki-neutral-400:hsl(0, 0%, 63.9%);--seki-neutral-500:hsl(0, 0%, 45.1%);--seki-neutral-600:hsl(0, 0%, 32.2%);--seki-neutral-700:hsl(0, 0%, 25.1%);--seki-neutral-800:hsl(0, 0%, 14.9%);--seki-neutral-900:hsl(0, 0%, 9%);--seki-neutral-950:hsl(0, 0%, 3.9%);--seki-primary-50:hsl(210, 100%, 97%);--seki-primary-100:hsl(210, 95%, 93%);--seki-primary-200:hsl(210, 95%, 85%);--seki-primary-300:hsl(210, 90%, 73%);--seki-primary-400:hsl(210, 85%, 58%);--seki-primary-500:hsl(210, 80%, 48%);--seki-primary-600:hsl(210, 75%, 40%);--seki-primary-700:hsl(210, 70%, 32%);--seki-primary-800:hsl(210, 65%, 25%);--seki-primary-900:hsl(210, 60%, 18%);--seki-primary-950:hsl(210, 55%, 10%);--seki-success-500:hsl(142, 71%, 45%);--seki-success-600:hsl(142, 71%, 35%);--seki-warning-500:hsl(38, 92%, 50%);--seki-warning-600:hsl(38, 92%, 40%);--seki-destructive-500:hsl(0, 84.2%, 60.2%);--seki-destructive-600:hsl(0, 72%, 41%)}:host{--seki-background:hsl(0, 0%, 100%);--seki-foreground:hsl(0, 0%, 3.9%);--seki-muted:hsl(0, 0%, 96.1%);--seki-muted-foreground:hsl(0, 0%, 45.1%);--seki-card:hsl(0, 0%, 100%);--seki-card-foreground:hsl(0, 0%, 3.9%);--seki-popover:hsl(0, 0%, 100%);--seki-popover-foreground:hsl(0, 0%, 3.9%);--seki-border:hsl(0, 0%, 89.8%);--seki-input:hsl(0, 0%, 89.8%);--seki-primary:hsl(0, 0%, 9%);--seki-primary-foreground:hsl(0, 0%, 98%);--seki-secondary:hsl(0, 0%, 96.1%);--seki-secondary-foreground:hsl(0, 0%, 9%);--seki-accent:hsl(0, 0%, 96.1%);--seki-accent-foreground:hsl(0, 0%, 9%);--seki-destructive:hsl(0, 84.2%, 60.2%);--seki-destructive-foreground:hsl(0, 0%, 98%);--seki-ring:hsl(0, 0%, 3.9%);--seki-bg-primary:var(--seki-background);--seki-bg-secondary:var(--seki-muted);--seki-bg-tertiary:var(--seki-accent);--seki-text-primary:var(--seki-foreground);--seki-text-secondary:var(--seki-muted-foreground);--seki-text-tertiary:var(--seki-neutral-400);--seki-border-default:var(--seki-border);--seki-border-emphasis:var(--seki-neutral-300)}:host([data-theme='dark']){--seki-background:hsl(0, 0%, 3.9%);--seki-foreground:hsl(0, 0%, 98%);--seki-muted:hsl(0, 0%, 14.9%);--seki-muted-foreground:hsl(0, 0%, 63.9%);--seki-card:hsl(0, 0%, 3.9%);--seki-card-foreground:hsl(0, 0%, 98%);--seki-popover:hsl(0, 0%, 3.9%);--seki-popover-foreground:hsl(0, 0%, 98%);--seki-border:hsl(0, 0%, 14.9%);--seki-input:hsl(0, 0%, 14.9%);--seki-primary:hsl(0, 0%, 98%);--seki-primary-foreground:hsl(0, 0%, 9%);--seki-secondary:hsl(0, 0%, 14.9%);--seki-secondary-foreground:hsl(0, 0%, 98%);--seki-accent:hsl(0, 0%, 14.9%);--seki-accent-foreground:hsl(0, 0%, 98%);--seki-destructive:hsl(0, 62.8%, 30.6%);--seki-destructive-foreground:hsl(0, 0%, 98%);--seki-ring:hsl(0, 0%, 83.1%);--seki-bg-primary:var(--seki-background);--seki-bg-secondary:var(--seki-muted);--seki-bg-tertiary:var(--seki-accent);--seki-text-primary:var(--seki-foreground);--seki-text-secondary:var(--seki-muted-foreground);--seki-text-tertiary:var(--seki-neutral-600);--seki-border-default:var(--seki-border);--seki-border-emphasis:var(--seki-neutral-700);--seki-button-primary-hover-bg:hsl(0, 0%, 98%, 0.9);--seki-button-secondary-hover-bg:hsl(0, 0%, 14.9%, 0.8)}:host{--seki-button-primary-bg:var(--seki-primary);--seki-button-primary-text:var(--seki-primary-foreground);--seki-button-primary-border:transparent;--seki-button-primary-hover-bg:hsl(0, 0%, 9%, 0.9);--seki-button-primary-hover-text:var(--seki-primary-foreground);--seki-button-primary-hover-border:transparent;--seki-button-secondary-bg:var(--seki-secondary);--seki-button-secondary-text:var(--seki-secondary-foreground);--seki-button-secondary-border:transparent;--seki-button-secondary-hover-bg:hsl(0, 0%, 96.1%, 0.8);--seki-button-secondary-hover-text:var(--seki-secondary-foreground);--seki-button-secondary-hover-border:transparent;--seki-button-outline-bg:transparent;--seki-button-outline-text:var(--seki-foreground);--seki-button-outline-border:var(--seki-input);--seki-button-outline-hover-bg:var(--seki-accent);--seki-button-outline-hover-text:var(--seki-accent-foreground);--seki-button-outline-hover-border:var(--seki-input);--seki-button-ghost-bg:transparent;--seki-button-ghost-text:var(--seki-foreground);--seki-button-ghost-border:transparent;--seki-button-ghost-hover-bg:var(--seki-accent);--seki-button-ghost-hover-text:var(--seki-accent-foreground);--seki-button-ghost-hover-border:transparent;--seki-button-destructive-bg:var(--seki-destructive);--seki-button-destructive-text:var(--seki-destructive-foreground);--seki-button-destructive-border:transparent;--seki-button-destructive-hover-bg:hsl(0, 84.2%, 60.2%, 0.9);--seki-button-destructive-hover-border:transparent;--seki-button-sm-padding-x:var(--seki-spacing-3, 0.75rem);--seki-button-sm-padding-y:0.375rem;--seki-button-sm-font-size:var(--seki-text-sm, 0.875rem);--seki-button-sm-height:2.25rem;--seki-button-md-padding-x:var(--seki-spacing-4, 1rem);--seki-button-md-padding-y:var(--seki-spacing-2, 0.5rem);--seki-button-md-font-size:var(--seki-text-base, 1rem);--seki-button-md-height:2.5rem;--seki-button-lg-padding-x:2rem;--seki-button-lg-padding-y:0.5rem;--seki-button-lg-font-size:1rem;--seki-button-lg-height:2.75rem;--seki-button-icon-sm-size:2rem;--seki-button-icon-size:2.5rem;--seki-button-icon-lg-size:3rem;--seki-button-icon-gap:0.5rem;--seki-button-link-bg:transparent;--seki-button-link-text:var(--seki-primary);--seki-button-link-border:transparent;--seki-button-link-hover-bg:transparent;--seki-button-link-hover-text:var(--seki-primary);--seki-button-link-hover-border:transparent;--seki-button-radius:var(--seki-radius-md, 0.375rem);--seki-button-font-weight:var(--seki-font-medium, 500);--seki-button-transition-duration:150ms;--seki-button-transition-timing:ease-in-out;--seki-button-shadow:var(--seki-shadow-sm, 0 1px 2px 0 rgb(0 0 0 / 0.05));--seki-button-shadow-hover:var(--seki-shadow-md, 0 4px 6px -1px rgb(0 0 0 / 0.1));--seki-button-disabled-opacity:0.5;--seki-input-bg:var(--seki-background);--seki-input-border:var(--seki-border);--seki-input-text:var(--seki-foreground);--seki-input-placeholder:var(--seki-muted-foreground);--seki-input-ring:var(--seki-ring);--seki-input-invalid-border:var(--seki-destructive);--seki-input-invalid-ring:var(--seki-destructive);--seki-input-disabled-opacity:0.5;--seki-input-radius:var(--seki-radius-md)}:host{--seki-spacing-0:0;--seki-spacing-0-5:0.125rem;--seki-spacing-1:0.25rem;--seki-spacing-1-5:0.375rem;--seki-spacing-2:0.5rem;--seki-spacing-2-5:0.625rem;--seki-spacing-3:0.75rem;--seki-spacing-3-5:0.875rem;--seki-spacing-4:1rem;--seki-spacing-5:1.25rem;--seki-spacing-6:1.5rem;--seki-spacing-8:2rem;--seki-spacing-10:2.5rem;--seki-spacing-12:3rem;--seki-spacing-16:4rem;--seki-spacing-20:5rem;--seki-spacing-24:6rem;--seki-input-height-sm:2rem;--seki-input-height-md:2.5rem;--seki-input-height-lg:3rem;--seki-input-padding-x:0.75rem;--seki-input-padding-y:0.5rem;--seki-input-font-size:0.875rem;--seki-input-ring-offset:2px}:host{--seki-shadow-sm:0 1px 2px 0 rgb(0 0 0 / 0.05);--seki-shadow-md:0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);--seki-shadow-lg:0 10px 15px -3px rgb(0 0 0 / 0.15), 0 4px 6px -4px rgb(0 0 0 / 0.1)}:host{--seki-font-sans:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue',\n Arial, sans-serif;--seki-font-mono:ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace;--seki-text-xs:0.75rem;--seki-text-sm:0.875rem;--seki-text-base:1rem;--seki-text-lg:1.125rem;--seki-text-xl:1.25rem;--seki-text-2xl:1.5rem;--seki-text-3xl:1.875rem;--seki-text-4xl:2.25rem;--seki-font-normal:400;--seki-font-medium:500;--seki-font-semibold:600;--seki-font-bold:700;--seki-leading-tight:1.25;--seki-leading-normal:1.5;--seki-leading-relaxed:1.75}:host{--seki-radius-sm:0.25rem;--seki-radius-md:0.375rem;--seki-radius-lg:0.5rem;--seki-radius-xl:1rem;}"),e}())?e:null),E&&(f?t.adoptedStyleSheets.push(E):t.adoptedStyleSheets=[...t.adoptedStyleSheets,E])}var N=new WeakMap,A=e=>"sc-"+e.l,D=(e,t,...s)=>{let i=null,n=null,r=!1,o=!1;const l=[],a=t=>{for(let s=0;s<t.length;s++)i=t[s],Array.isArray(i)?a(i):null!=i&&"boolean"!=typeof i&&((r="function"!=typeof e&&!S(i))&&(i+=""),r&&o?l[l.length-1].u+=i:l.push(r?U(null,i):i),o=r)};if(a(s),t){t.key&&(n=t.key);{const e=t.className||t.class;e&&(t.class="object"!=typeof e?e:Object.keys(e).filter((t=>e[t])).join(" "))}}const u=U(e,null);return u.k=t,l.length>0&&(u.p=l),u.h=n,u},U=(e,t)=>({i:0,m:e,u:t,v:null,p:null,k:null,h:null}),F={},W=e=>{const t=(e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"))(e);return RegExp(`(^|[^@]|@(?!supports\\s+selector\\s*\\([^{]*?${t}))(${t}\\b)`,"g")};W("::slotted"),W(":host"),W(":host-context");var H,L=(e,t,s)=>null==e||S(e)?e:4&t?(s&&"string"==typeof e||"false"!==e)&&(""===e||!!e):2&t?"string"==typeof e?parseFloat(e):"number"==typeof e?e:NaN:1&t?e+"":e,T=e=>{var t;return null==(t=s(e))?void 0:t.$hostElement$},V=(e,t)=>{const s=T(e);return{emit:e=>q(s,t,{bubbles:!0,composed:!0,cancelable:!0,detail:e})}},q=(e,t,s)=>{const i=d.ce(t,s);return e.dispatchEvent(i),i},I=(e,t,s,i,r,o)=>{if(s===i)return;let l=n(e,t),a=t.toLowerCase();if("class"===t){const t=e.classList,n=G(s);let r=G(i);t.remove(...n.filter((e=>e&&!r.includes(e)))),t.add(...r.filter((e=>e&&!n.includes(e))))}else if("style"===t){for(const t in s)i&&null!=i[t]||(t.includes("-")?e.style.removeProperty(t):e.style[t]="");for(const t in i)s&&i[t]===s[t]||(t.includes("-")?e.style.setProperty(t,i[t]):e.style[t]=i[t])}else if("key"===t);else if("ref"===t)i&&i(e);else if(l||"o"!==t[0]||"n"!==t[1]){const n=S(i);if(l||n&&null!==i)try{if(e.tagName.includes("-"))e[t]!==i&&(e[t]=i);else{const n=null==i?"":i;"list"===t?l=!1:null!=s&&e[t]==n||("function"==typeof e.__lookupSetter__(t)?e[t]=n:e.setAttribute(t,n))}}catch(e){}let c=!1;a!==(a=a.replace(/^xlink\:?/,""))&&(t=a,c=!0),null==i||!1===i?!1===i&&""!==e.getAttribute(t)||(c?e.removeAttributeNS(u,t):e.removeAttribute(t)):(!l||4&o||r)&&!n&&1===e.nodeType&&(i=!0===i?"":i,c?e.setAttributeNS(u,t,i):e.setAttribute(t,i))}else if(t="-"===t[2]?t.slice(3):n(k,a)?a.slice(2):a[2]+t.slice(3),s||i){const n=t.endsWith(Y);t=t.replace(_,""),s&&d.rel(e,t,s,n),i&&d.ael(e,t,i,n)}},B=/\s/,G=e=>("object"==typeof e&&e&&"baseVal"in e&&(e=e.baseVal),e&&"string"==typeof e?e.split(B):[]),Y="Capture",_=RegExp(Y+"$"),J=(e,t,s)=>{const i=11===t.v.nodeType&&t.v.host?t.v.host:t.v,n=e&&e.k||{},r=t.k||{};for(const e of K(Object.keys(n)))e in r||I(i,e,n[e],void 0,s,t.i);for(const e of K(Object.keys(r)))I(i,e,n[e],r[e],s,t.i)};function K(e){return e.includes("ref")?[...e.filter((e=>"ref"!==e)),"ref"]:e}var Q=!1,X=(e,t,s)=>{const i=t.p[s];let n,r,o=0;if(null!==i.u)n=i.v=k.document.createTextNode(i.u);else{if(!k.document)throw Error("You are trying to render a Stencil component in an environment that doesn't support the DOM. Make sure to populate the [`window`](https://developer.mozilla.org/en-US/docs/Web/API/Window/window) object before rendering a component.");if(n=i.v=k.document.createElement(i.m),J(null,i,Q),i.p)for(o=0;o<i.p.length;++o)r=X(e,i,o),r&&n.appendChild(r)}return n["s-hn"]=H,n},Z=(e,t,s,i,n,r)=>{let o,l=e;for(l.shadowRoot&&l.tagName===H&&(l=l.shadowRoot);n<=r;++n)i[n]&&(o=X(null,s,n),o&&(i[n].v=o,ne(l,o,t)))},ee=(e,t,s)=>{for(let i=t;i<=s;++i){const t=e[i];if(t){const e=t.v;ie(t),e&&e.remove()}}},te=(e,t,s=!1)=>e.m===t.m&&(s?(s&&!e.h&&t.h&&(e.h=t.h),!0):e.h===t.h),se=(e,t,s=!1)=>{const i=t.v=e.v,n=e.p,r=t.p,o=t.u;null===o?(J(e,t,Q),null!==n&&null!==r?((e,t,s,i,n=!1)=>{let r,o,l=0,a=0,u=0,c=0,k=t.length-1,d=t[0],p=t[k],h=i.length-1,f=i[0],m=i[h];for(;l<=k&&a<=h;)if(null==d)d=t[++l];else if(null==p)p=t[--k];else if(null==f)f=i[++a];else if(null==m)m=i[--h];else if(te(d,f,n))se(d,f,n),d=t[++l],f=i[++a];else if(te(p,m,n))se(p,m,n),p=t[--k],m=i[--h];else if(te(d,m,n))se(d,m,n),ne(e,d.v,p.v.nextSibling),d=t[++l],m=i[--h];else if(te(p,f,n))se(p,f,n),ne(e,p.v,d.v),p=t[--k],f=i[++a];else{for(u=-1,c=l;c<=k;++c)if(t[c]&&null!==t[c].h&&t[c].h===f.h){u=c;break}u>=0?(o=t[u],o.m!==f.m?r=X(t&&t[a],s,u):(se(o,f,n),t[u]=void 0,r=o.v),f=i[++a]):(r=X(t&&t[a],s,a),f=i[++a]),r&&ne(d.v.parentNode,r,d.v)}l>k?Z(e,null==i[h+1]?null:i[h+1].v,s,i,a,h):a>h&&ee(t,l,k)})(i,n,t,r,s):null!==r?(null!==e.u&&(i.textContent=""),Z(i,null,t,r,0,r.length-1)):!s&&null!==n&&ee(n,0,n.length-1)):e.u!==o&&(i.data=o)},ie=e=>{e.k&&e.k.ref&&e.k.ref(null),e.p&&e.p.map(ie)},ne=(e,t,s)=>null==e?void 0:e.insertBefore(t,s),re=(e,t)=>{if(t&&!e.$&&t["s-p"]){const s=t["s-p"].push(new Promise((i=>e.$=()=>{t["s-p"].splice(s-1,1),i()})))}},oe=(e,t)=>{if(e.i|=16,4&e.i)return void(e.i|=512);re(e,e.S);const s=()=>le(e,t);if(!t)return $(s);queueMicrotask((()=>{s()}))},le=(e,t)=>{const s=e.$hostElement$,i=e.t;if(!i)throw Error(`Can't render component <${s.tagName.toLowerCase()} /> with invalid Stencil runtime! Make sure this imported component is compiled with a \`externalRuntime: true\` flag. For more information, please refer to https://stenciljs.com/docs/custom-elements#externalruntime`);let n;return t?(e.i|=256,e.j&&(e.j.map((([e,t])=>he(i,e,t,s))),e.j=void 0),e.O.length&&e.O.forEach((e=>e(s))),n=he(i,"componentWillLoad",void 0,s)):n=he(i,"componentWillUpdate",void 0,s),n=ae(n,(()=>he(i,"componentWillRender",void 0,s))),ae(n,(()=>ce(e,i,t)))},ae=(e,t)=>ue(e)?e.then(t).catch((e=>{console.error(e),t()})):t(),ue=e=>e instanceof Promise||e&&e.then&&"function"==typeof e.then,ce=async(e,t,s)=>{var i;const n=e.$hostElement$,r=n["s-rc"];s&&(e=>{const t=e.C,s=e.$hostElement$,i=t.i,n=((e,t)=>{var s;const i=A(t),n=l.get(i);if(!k.document)return i;if(e=11===e.nodeType?e:k.document,n)if("string"==typeof n){let r,o=N.get(e=e.head||e);if(o||N.set(e,o=new Set),!o.has(i)){{r=k.document.createElement("style"),r.innerHTML=n;const i=null!=(s=d.M)?s:j(k.document);if(null!=i&&r.setAttribute("nonce",i),!(1&t.i))if("HEAD"===e.nodeName){const t=e.querySelectorAll("link[rel=preconnect]"),s=t.length>0?t[t.length-1].nextSibling:e.querySelector("style");e.insertBefore(r,(null==s?void 0:s.parentNode)===e?s:null)}else if("host"in e)if(h){const t=new CSSStyleSheet;t.replaceSync(n),f?e.adoptedStyleSheets.unshift(t):e.adoptedStyleSheets=[t,...e.adoptedStyleSheets]}else{const t=e.querySelector("style");t?t.innerHTML=n+t.innerHTML:e.prepend(r)}else e.append(r);1&t.i&&e.insertBefore(r,null)}4&t.i&&(r.innerHTML+=a),o&&o.add(i)}}else e.adoptedStyleSheets.includes(n)||(f?e.adoptedStyleSheets.push(n):e.adoptedStyleSheets=[...e.adoptedStyleSheets,n]);return i})(s.shadowRoot?s.shadowRoot:s.getRootNode(),t);10&i&&(s["s-sc"]=n,s.classList.add(n+"-h"))})(e);ke(e,t,n,s),r&&(r.map((e=>e())),n["s-rc"]=void 0);{const t=null!=(i=n["s-p"])?i:[],s=()=>de(e);0===t.length?s():(Promise.all(t).then(s),e.i|=4,t.length=0)}},ke=(e,t,s,i)=>{try{t=t.render(),e.i&=-17,e.i|=2,((e,t,s=!1)=>{const i=e.$hostElement$,n=e.C,r=e.R||U(null,null),o=(e=>e&&e.m===F)(t)?t:D(null,null,t);if(H=i.tagName,n.P&&(o.k=o.k||{},n.P.forEach((([e,t])=>{o.k[t]=i[e]}))),s&&o.k)for(const e of Object.keys(o.k))i.hasAttribute(e)&&!["key","ref","style","class"].includes(e)&&(o.k[e]=i[e]);o.m=null,o.i|=4,e.R=o,o.v=r.v=i.shadowRoot||i,se(r,o,s)})(e,t,i)}catch(t){r(t,e.$hostElement$)}return null},de=e=>{const t=e.$hostElement$,s=e.t,i=e.S;he(s,"componentDidRender",void 0,t),64&e.i?he(s,"componentDidUpdate",void 0,t):(e.i|=64,fe(t),he(s,"componentDidLoad",void 0,t),e.N(t),i||pe()),e.A(t),e.$&&(e.$(),e.$=void 0),512&e.i&&w((()=>oe(e,!1))),e.i&=-517},pe=()=>{w((()=>q(k,"appload",{detail:{namespace:"sekiui"}})))},he=(e,t,s,i)=>{if(e&&e[t])try{return e[t](s)}catch(e){r(e,i)}},fe=e=>e.classList.add("hydrated"),me=(e,t,i,n)=>{const o=s(e);if(!o)return;if(!o)throw Error(`Couldn't find host element for "${n.l}" as it is unknown to this Stencil runtime. This usually happens when integrating a 3rd party Stencil component with another Stencil component or application. Please reach out to the maintainers of the 3rd party Stencil component or report this on the Stencil Discord server (https://chat.stenciljs.com) or comment on this similar [GitHub issue](https://github.com/stenciljs/core/issues/5457).`);const l=o.$hostElement$,a=o.D.get(t),u=o.i,c=o.t;if(i=L(i,n.U[t][0],!!(64&n.i)),(!(8&u)||void 0===a)&&i!==a&&(!Number.isNaN(a)||!Number.isNaN(i))&&(o.D.set(t,i),c)){if(n.F&&128&u){const e=n.F[t];e&&e.map((e=>{try{c[e](i,a,t)}catch(e){r(e,l)}}))}if(2==(18&u)){if(c.componentShouldUpdate&&!1===c.componentShouldUpdate(i,a,t))return;oe(o,!1)}}},be=(e,t,i)=>{var n,r;const o=e.prototype;64&t.i&&1&i&&c.forEach((e=>{Object.defineProperty(o,e,{value(...t){var i;const n=s(this),r=null==n?void 0:n.t;if(r){const s=r[e];"function"==typeof s&&s.call(r,...t)}else null==(i=null==n?void 0:n.W)||i.then((s=>{const i=s[e];"function"==typeof i&&i.call(s,...t)}))}})}));{e.watchers&&!t.F&&(t.F=e.watchers),e.deserializers&&!t.H&&(t.H=e.deserializers),e.serializers&&!t.L&&(t.L=e.serializers);const l=Object.entries(null!=(n=t.U)?n:{});if(l.map((([e,[n]])=>{if(31&n||2&i&&32&n){const{get:r,set:l}=Object.getOwnPropertyDescriptor(o,e)||{};r&&(t.U[e][0]|=2048),l&&(t.U[e][0]|=4096),(1&i||!r)&&Object.defineProperty(o,e,{get(){{if(!(2048&t.U[e][0]))return((e,t)=>s(this).D.get(t))(0,e);const i=s(this),n=i?i.t:o;if(!n)return;return n[e]}},configurable:!0,enumerable:!0}),Object.defineProperty(o,e,{set(r){const o=s(this);if(o){if(l)return void 0===(32&n?this[e]:o.$hostElement$[e])&&o.D.get(e)&&(r=o.D.get(e)),l.call(this,L(r,n,!!(64&t.i))),void me(this,e,r=32&n?this[e]:o.$hostElement$[e],t);{if(!(1&i&&4096&t.U[e][0]))return me(this,e,r,t),void(1&i&&!o.t&&o.O.push((()=>{4096&t.U[e][0]&&o.t[e]!==o.D.get(e)&&(o.t[e]=r)})));const s=()=>{const s=o.t[e];!o.D.get(e)&&s&&o.D.set(e,s),o.t[e]=L(r,n,!!(64&t.i)),me(this,e,o.t[e],t)};o.t?s():o.O.push((()=>{s()}))}}}})}else 1&i&&64&n&&Object.defineProperty(o,e,{value(...t){var i;const n=s(this);return null==(i=null==n?void 0:n.T)?void 0:i.then((()=>{var s;return null==(s=n.t)?void 0:s[e](...t)}))}})})),1&i){const i=new Map;o.attributeChangedCallback=function(e,n,r){d.jmp((()=>{var l;const a=i.get(e),u=s(this);if(this.hasOwnProperty(a)&&(r=this[a],delete this[a]),o.hasOwnProperty(a)&&"number"==typeof this[a]&&this[a]==r)return;if(null==a){const s=null==u?void 0:u.i;if(u&&s&&!(8&s)&&128&s&&r!==n){const s=u.t,i=null==(l=t.F)?void 0:l[e];null==i||i.forEach((t=>{null!=s[t]&&s[t].call(s,r,n,e)}))}return}const c=Object.getOwnPropertyDescriptor(o,a);(r=(null!==r||"boolean"!=typeof this[a])&&r)==this[a]||c.get&&!c.set||(this[a]=r)}))},e.observedAttributes=Array.from(new Set([...Object.keys(null!=(r=t.F)?r:{}),...l.filter((([e,t])=>31&t[0])).map((([e,s])=>{var n;const r=s[1]||e;return i.set(r,e),512&s[0]&&(null==(n=t.P)||n.push([e,r])),r}))]))}}return e},ve=(e,t)=>{he(e,"connectedCallback",void 0,t)},ge=(e,t)=>{he(e,"disconnectedCallback",void 0,t||e)},ye=(e,t={})=>{var i;if(!k.document)return void console.warn("Stencil: No document found. Skipping bootstrapping lazy components.");const n=[],u=t.exclude||[],c=k.customElements,p=k.document.head,f=p.querySelector("meta[charset]"),m=k.document.createElement("style"),b=[];let v,g=!0;Object.assign(d,t),d.o=new URL(t.resourcesUrl||"./",k.document.baseURI).href;let y=!1;if(e.map((e=>{e[1].map((t=>{var i,a,k;const p={i:t[0],l:t[1],U:t[2],V:t[3]};4&p.i&&(y=!0),p.U=t[2],p.V=t[3],p.P=[],p.F=null!=(i=t[4])?i:{},p.L=null!=(a=t[5])?a:{},p.H=null!=(k=t[6])?k:{};const f=p.l,m=class extends HTMLElement{constructor(e){if(super(e),this.hasRegisteredEventListeners=!1,((e,t)=>{const s={i:0,$hostElement$:e,C:t,D:new Map,q:new Map};s.T=new Promise((e=>s.A=e)),s.W=new Promise((e=>s.N=e)),e["s-p"]=[],e["s-rc"]=[],s.O=[];const i=s;e.__stencil__getHostRef=()=>i})(e=this,p),1&p.i)if(e.shadowRoot){if("open"!==e.shadowRoot.mode)throw Error(`Unable to re-use existing shadow root for ${p.l}! Mode is set to ${e.shadowRoot.mode} but Stencil only supports open shadow roots.`)}else P.call(e,p)}connectedCallback(){const e=s(this);e&&(this.hasRegisteredEventListeners||(this.hasRegisteredEventListeners=!0,xe(this,e,p.V)),v&&(clearTimeout(v),v=null),g?b.push(this):d.jmp((()=>(e=>{if(!(1&d.i)){const t=s(e);if(!t)return;const i=t.C,n=()=>{};if(1&t.i)xe(e,t,i.V),(null==t?void 0:t.t)?ve(t.t,e):(null==t?void 0:t.W)&&t.W.then((()=>ve(t.t,e)));else{t.i|=1;{let s=e;for(;s=s.parentNode||s.host;)if(s["s-p"]){re(t,t.S=s);break}}i.U&&Object.entries(i.U).map((([t,[s]])=>{if(31&s&&t in e&&e[t]!==Object.prototype[t]){const s=e[t];delete e[t],e[t]=s}})),(async(e,t,s)=>{let i;if(!(32&t.i)){if(t.i|=32,s.I){const n=((e,t)=>{const s=e.l.replace(/-/g,"_"),i=e.I;if(!i)return;const n=o.get(i);return n?n[s]:import(`./${i}.entry.js`).then((e=>(o.set(i,e),e[s])),(e=>{r(e,t.$hostElement$)}))
2
- /*!__STENCIL_STATIC_IMPORT_SWITCH__*/})(s,t);if(n&&"then"in n){const e=()=>{};i=await n,e()}else i=n;if(!i)throw Error(`Constructor for "${s.l}#${t.B}" was not found`);i.isProxied||(s.F=i.watchers,s.L=i.serializers,s.H=i.deserializers,be(i,s,2),i.isProxied=!0);const l=()=>{};t.i|=8;try{new i(t)}catch(t){r(t,e)}t.i&=-9,t.i|=128,l(),ve(t.t,e)}else i=e.constructor,customElements.whenDefined(e.localName).then((()=>t.i|=128));if(i&&i.style){let e;"string"==typeof i.style&&(e=i.style);const t=A(s);if(!l.has(t)){const i=()=>{};((e,t,s)=>{let i=l.get(e);h&&s?(i=i||new CSSStyleSheet,"string"==typeof i?i=t:i.replaceSync(t)):i=t,l.set(e,i)})(t,e,!!(1&s.i)),i()}}}const n=t.S,a=()=>oe(t,!0);n&&n["s-rc"]?n["s-rc"].push(a):a()})(e,t,i)}n()}})(this))))}disconnectedCallback(){d.jmp((()=>(async e=>{if(!(1&d.i)){const t=s(e);(null==t?void 0:t.G)&&(t.G.map((e=>e())),t.G=void 0),(null==t?void 0:t.t)?ge(t.t,e):(null==t?void 0:t.W)&&t.W.then((()=>ge(t.t,e)))}N.has(e)&&N.delete(e),e.shadowRoot&&N.has(e.shadowRoot)&&N.delete(e.shadowRoot)})(this))),d.raf((()=>{var e;const t=s(this);if(!t)return;const i=b.findIndex((e=>e===this));i>-1&&b.splice(i,1),(null==(e=null==t?void 0:t.R)?void 0:e.v)instanceof Node&&!t.R.v.isConnected&&delete t.R.v}))}componentOnReady(){var e;return null==(e=s(this))?void 0:e.W}};64&p.i&&(m.formAssociated=!0),p.I=e[0],u.includes(f)||c.get(f)||(n.push(f),c.define(f,be(m,p,1)))}))})),n.length>0&&(y&&(m.textContent+=a),m.textContent+=n.sort()+"{visibility:hidden}.hydrated{visibility:inherit}",m.innerHTML.length)){m.setAttribute("data-styles","");const e=null!=(i=d.M)?i:j(k.document);null!=e&&m.setAttribute("nonce",e),p.insertBefore(m,f?f.nextSibling:p.firstChild)}g=!1,b.length?b.map((e=>e.connectedCallback())):d.jmp((()=>v=setTimeout(pe,30)))},xe=(e,t,s)=>{s&&k.document&&s.map((([s,i,n])=>{const r=e,o=we(t,n),l=$e(s);d.ael(r,i,o,l),(t.G=t.G||[]).push((()=>d.rel(r,i,o,l)))}))},we=(e,t)=>s=>{var i;try{256&e.i?null==(i=e.t)||i[t](s):(e.j=e.j||[]).push([t,s])}catch(t){r(t,e.$hostElement$)}},$e=e=>({passive:!!(1&e),capture:!!(2&e)}),Se=e=>d.M=e;export{F as H,T as a,ye as b,V as c,e as g,D as h,p,i as r,Se as s}