@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
@@ -0,0 +1,865 @@
1
+ import { Host, h } from "@stencil/core";
2
+ /**
3
+ * @slot - Content containing seki-select-trigger and seki-select-content
4
+ */
5
+ export class SekiSelect {
6
+ constructor() {
7
+ /** Enable multi-select mode */
8
+ this.multiple = false;
9
+ /** Placeholder text shown when no selection */
10
+ this.placeholder = 'Select an option';
11
+ /** Disable all interactions */
12
+ this.disabled = false;
13
+ /** Mark as required for form validation */
14
+ this.required = false;
15
+ /** Initial dropdown open state (uncontrolled mode) */
16
+ this.defaultOpen = false;
17
+ /** Maximum visible pills in multi-select mode */
18
+ this.maxVisiblePills = 3;
19
+ /** Preferred dropdown placement */
20
+ this.placement = 'bottom';
21
+ /** Maximum dropdown height */
22
+ this.maxHeight = '12.5rem';
23
+ // ===========================
24
+ // State
25
+ // ===========================
26
+ this.internalValue = '';
27
+ this.isOpen = false;
28
+ this.focusedOptionValue = null;
29
+ this.registeredOptions = [];
30
+ this.hasBeenActivated = false;
31
+ this.searchBuffer = '';
32
+ this.searchActive = false;
33
+ this.contentId = `select-content-${Math.random().toString(36).substr(2, 9)}`;
34
+ this.triggerId = `select-trigger-${Math.random().toString(36).substr(2, 9)}`;
35
+ this.searchTimeoutId = null;
36
+ this.searchDebounce = 500;
37
+ this.handleClickOutside = (event) => {
38
+ // Only close if dropdown is open
39
+ if (!this.isOpen) {
40
+ return;
41
+ }
42
+ // Check if click is outside the select component
43
+ const target = event.target;
44
+ if (!this.el.contains(target)) {
45
+ this.handleOpenChange(false);
46
+ }
47
+ };
48
+ // ===========================
49
+ // Internal Handlers
50
+ // ===========================
51
+ this.handleValueChange = (newValue) => {
52
+ this.internalValue = newValue;
53
+ // Update controlled prop if it exists
54
+ if (this.value !== undefined) {
55
+ this.value = newValue;
56
+ }
57
+ // Emit change event
58
+ const selectedOptions = this.getSelectedOptions();
59
+ if (this.multiple && Array.isArray(newValue)) {
60
+ this.sekiChange.emit({
61
+ value: newValue,
62
+ options: selectedOptions,
63
+ });
64
+ }
65
+ else {
66
+ this.sekiChange.emit({
67
+ value: newValue,
68
+ option: selectedOptions[0],
69
+ });
70
+ }
71
+ // Close dropdown in single-select mode
72
+ if (!this.multiple) {
73
+ this.handleOpenChange(false);
74
+ }
75
+ };
76
+ this.handleOpenChange = (open) => {
77
+ this.isOpen = open;
78
+ // Update controlled prop if it exists
79
+ if (this.open !== undefined) {
80
+ this.open = open;
81
+ }
82
+ // Mark as activated when opened
83
+ if (open) {
84
+ this.hasBeenActivated = true;
85
+ }
86
+ // Emit event
87
+ this.sekiOpenChange.emit({ open });
88
+ // Validate on close if required
89
+ if (!open && this.required && this.hasBeenActivated) {
90
+ this.validateRequired();
91
+ }
92
+ };
93
+ this.handleOptionFocus = (value) => {
94
+ this.focusedOptionValue = value;
95
+ };
96
+ this.handleOptionSelect = (value) => {
97
+ if (this.multiple) {
98
+ const currentValue = Array.isArray(this.internalValue) ? this.internalValue : [];
99
+ if (currentValue.includes(value)) {
100
+ // Deselect
101
+ this.handleValueChange(currentValue.filter(v => v !== value));
102
+ }
103
+ else {
104
+ // Select
105
+ this.handleValueChange([...currentValue, value]);
106
+ }
107
+ }
108
+ else {
109
+ this.handleValueChange(value);
110
+ }
111
+ };
112
+ this.isValueSelected = (value) => {
113
+ if (this.multiple && Array.isArray(this.internalValue)) {
114
+ return this.internalValue.includes(value);
115
+ }
116
+ return this.internalValue === value;
117
+ };
118
+ this.getSelectedOptions = () => {
119
+ if (this.multiple && Array.isArray(this.internalValue)) {
120
+ return this.registeredOptions.filter(opt => this.internalValue.includes(opt.value));
121
+ }
122
+ return this.registeredOptions.filter(opt => opt.value === this.internalValue);
123
+ };
124
+ this.registerOption = (option) => {
125
+ this.registeredOptions = [...this.registeredOptions, option];
126
+ };
127
+ this.unregisterOption = (value) => {
128
+ this.registeredOptions = this.registeredOptions.filter(opt => opt.value !== value);
129
+ };
130
+ this.validateRequired = () => {
131
+ const isValid = this.multiple
132
+ ? Array.isArray(this.internalValue) && this.internalValue.length > 0
133
+ : Boolean(this.internalValue);
134
+ this.sekiValidate.emit({
135
+ valid: isValid,
136
+ errorMessage: isValid ? undefined : 'This field is required',
137
+ });
138
+ };
139
+ this.handleValidate = (valid, errorMessage) => {
140
+ this.sekiValidate.emit({ valid, errorMessage });
141
+ };
142
+ }
143
+ // ===========================
144
+ // Lifecycle
145
+ // ===========================
146
+ componentWillLoad() {
147
+ // Initialize internal state
148
+ if (this.value !== undefined) {
149
+ this.internalValue = this.value;
150
+ }
151
+ else if (this.defaultValue !== undefined) {
152
+ this.internalValue = this.defaultValue;
153
+ }
154
+ else {
155
+ this.internalValue = this.multiple ? [] : '';
156
+ }
157
+ if (this.open !== undefined) {
158
+ this.isOpen = this.open;
159
+ }
160
+ else if (this.defaultOpen) {
161
+ this.isOpen = this.defaultOpen;
162
+ }
163
+ // Expose context on the element for child components
164
+ this.el.selectContext = this.selectContext;
165
+ }
166
+ componentDidLoad() {
167
+ // Expose context on the element for child components
168
+ this.el.selectContext = this.selectContext;
169
+ // Add click-outside listener
170
+ this.clickOutsideListener = this.handleClickOutside.bind(this);
171
+ document.addEventListener('click', this.clickOutsideListener, true);
172
+ }
173
+ componentDidRender() {
174
+ // Update context reference after each render
175
+ this.el.selectContext = this.selectContext;
176
+ }
177
+ disconnectedCallback() {
178
+ // Clean up click-outside listener
179
+ if (this.clickOutsideListener) {
180
+ document.removeEventListener('click', this.clickOutsideListener, true);
181
+ }
182
+ }
183
+ handleValuePropChange(newValue) {
184
+ if (newValue !== undefined) {
185
+ this.internalValue = newValue;
186
+ }
187
+ this.updateContextOnElement();
188
+ }
189
+ handleOpenPropChange(newOpen) {
190
+ if (newOpen !== undefined) {
191
+ this.isOpen = newOpen;
192
+ }
193
+ this.updateContextOnElement();
194
+ }
195
+ handleIsOpenChange() {
196
+ this.updateContextOnElement();
197
+ }
198
+ handleInternalValueChange() {
199
+ this.updateContextOnElement();
200
+ }
201
+ updateContextOnElement() {
202
+ this.el.selectContext = this.selectContext;
203
+ }
204
+ // ===========================
205
+ // Methods
206
+ // ===========================
207
+ /** Programmatically open the dropdown */
208
+ async openDropdown() {
209
+ this.handleOpenChange(true);
210
+ }
211
+ /** Programmatically close the dropdown */
212
+ async closeDropdown() {
213
+ this.handleOpenChange(false);
214
+ }
215
+ /** Focus the trigger element */
216
+ async focusTrigger() {
217
+ // Implementation will focus the trigger
218
+ }
219
+ /** Clear all selections */
220
+ async clearSelection() {
221
+ this.handleValueChange(this.multiple ? [] : '');
222
+ }
223
+ /** Handle keyboard navigation (arrow keys, typeahead, etc.) */
224
+ async handleKeyboard(event) {
225
+ if (!this.isOpen) {
226
+ if (event.key === ' ' || event.key === 'Enter' || event.key === 'ArrowDown') {
227
+ event.preventDefault();
228
+ this.handleOpenChange(true);
229
+ }
230
+ return;
231
+ }
232
+ switch (event.key) {
233
+ case 'ArrowDown':
234
+ event.preventDefault();
235
+ this.focusNextOption();
236
+ break;
237
+ case 'ArrowUp':
238
+ event.preventDefault();
239
+ this.focusPreviousOption();
240
+ break;
241
+ case 'Enter':
242
+ event.preventDefault();
243
+ if (this.focusedOptionValue !== null) {
244
+ this.handleOptionSelect(this.focusedOptionValue);
245
+ }
246
+ break;
247
+ case 'Escape':
248
+ event.preventDefault();
249
+ this.handleOpenChange(false);
250
+ break;
251
+ case ' ':
252
+ // Typeahead search
253
+ event.preventDefault();
254
+ this.addToSearchBuffer(' ');
255
+ break;
256
+ default:
257
+ // Single character typeahead
258
+ if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {
259
+ event.preventDefault();
260
+ this.addToSearchBuffer(event.key);
261
+ }
262
+ break;
263
+ }
264
+ }
265
+ focusNextOption() {
266
+ if (this.registeredOptions.length === 0)
267
+ return;
268
+ let nextIndex = 0;
269
+ if (this.focusedOptionValue !== null) {
270
+ const currentIndex = this.registeredOptions.findIndex(opt => opt.value === this.focusedOptionValue);
271
+ nextIndex = currentIndex >= 0 ? Math.min(currentIndex + 1, this.registeredOptions.length - 1) : 0;
272
+ }
273
+ const nextOption = this.registeredOptions[nextIndex];
274
+ if (nextOption && !nextOption.disabled) {
275
+ this.handleOptionFocus(nextOption.value);
276
+ }
277
+ }
278
+ focusPreviousOption() {
279
+ if (this.registeredOptions.length === 0)
280
+ return;
281
+ let prevIndex = this.registeredOptions.length - 1;
282
+ if (this.focusedOptionValue !== null) {
283
+ const currentIndex = this.registeredOptions.findIndex(opt => opt.value === this.focusedOptionValue);
284
+ prevIndex = currentIndex > 0 ? currentIndex - 1 : this.registeredOptions.length - 1;
285
+ }
286
+ const prevOption = this.registeredOptions[prevIndex];
287
+ if (prevOption && !prevOption.disabled) {
288
+ this.handleOptionFocus(prevOption.value);
289
+ }
290
+ }
291
+ addToSearchBuffer(char) {
292
+ this.searchBuffer += char;
293
+ this.searchActive = true;
294
+ // Clear existing timeout
295
+ if (this.searchTimeoutId !== null) {
296
+ clearTimeout(this.searchTimeoutId);
297
+ }
298
+ // Find first option matching the buffer
299
+ const matchingOption = this.registeredOptions.find(opt => !opt.disabled && opt.label.toLowerCase().startsWith(this.searchBuffer.toLowerCase()));
300
+ if (matchingOption) {
301
+ this.handleOptionFocus(matchingOption.value);
302
+ }
303
+ // Reset buffer after debounce
304
+ this.searchTimeoutId = window.setTimeout(() => {
305
+ this.searchBuffer = '';
306
+ this.searchActive = false;
307
+ }, this.searchDebounce);
308
+ }
309
+ // Context to provide to children
310
+ get selectContext() {
311
+ return {
312
+ value: this.internalValue,
313
+ multiple: this.multiple,
314
+ open: this.isOpen,
315
+ disabled: this.disabled,
316
+ required: this.required,
317
+ focusedOptionValue: this.focusedOptionValue,
318
+ contentId: this.contentId,
319
+ triggerId: this.triggerId,
320
+ ariaLabel: this.ariaLabel,
321
+ ariaLabelledby: this.ariaLabelledby,
322
+ ariaDescribedby: this.ariaDescribedby,
323
+ onValueChange: this.handleValueChange,
324
+ onOpenChange: this.handleOpenChange,
325
+ onOptionFocus: this.handleOptionFocus,
326
+ onOptionSelect: this.handleOptionSelect,
327
+ isValueSelected: this.isValueSelected,
328
+ getSelectedOptions: this.getSelectedOptions,
329
+ registerOption: this.registerOption,
330
+ unregisterOption: this.unregisterOption,
331
+ };
332
+ }
333
+ // ===========================
334
+ // Render
335
+ // ===========================
336
+ render() {
337
+ return (h(Host, { key: '7b85ab6beecb3d69f522a2362e47905afb4c2cfa' }, h("slot", { key: 'dd239306507d718a70dd508c00e871914eecacec' }), this.name && this.renderHiddenNativeElement()));
338
+ }
339
+ renderHiddenNativeElement() {
340
+ if (this.multiple) {
341
+ return (h("select", { class: "select-native", name: this.name, multiple: true, required: this.required, disabled: this.disabled, "aria-hidden": "true", tabindex: -1 }, Array.isArray(this.internalValue) &&
342
+ this.internalValue.map(val => (h("option", { value: val, selected: true }, val)))));
343
+ }
344
+ else {
345
+ return (h("input", { type: "hidden", class: "select-native", name: this.name, value: this.internalValue, required: this.required, disabled: this.disabled }));
346
+ }
347
+ }
348
+ static get is() { return "seki-select"; }
349
+ static get encapsulation() { return "shadow"; }
350
+ static get originalStyleUrls() {
351
+ return {
352
+ "$": ["seki-select.css"]
353
+ };
354
+ }
355
+ static get styleUrls() {
356
+ return {
357
+ "$": ["seki-select.css"]
358
+ };
359
+ }
360
+ static get properties() {
361
+ return {
362
+ "value": {
363
+ "type": "any",
364
+ "mutable": true,
365
+ "complexType": {
366
+ "original": "SelectValue",
367
+ "resolved": "(string | number)[] | number | string | undefined",
368
+ "references": {
369
+ "SelectValue": {
370
+ "location": "import",
371
+ "path": "../../utils/select",
372
+ "id": "src/utils/select/index.ts::SelectValue"
373
+ }
374
+ }
375
+ },
376
+ "required": false,
377
+ "optional": true,
378
+ "docs": {
379
+ "tags": [],
380
+ "text": "Current selected value (controlled mode)"
381
+ },
382
+ "getter": false,
383
+ "setter": false,
384
+ "reflect": false,
385
+ "attribute": "value"
386
+ },
387
+ "defaultValue": {
388
+ "type": "any",
389
+ "mutable": false,
390
+ "complexType": {
391
+ "original": "SelectValue",
392
+ "resolved": "(string | number)[] | number | string | undefined",
393
+ "references": {
394
+ "SelectValue": {
395
+ "location": "import",
396
+ "path": "../../utils/select",
397
+ "id": "src/utils/select/index.ts::SelectValue"
398
+ }
399
+ }
400
+ },
401
+ "required": false,
402
+ "optional": true,
403
+ "docs": {
404
+ "tags": [],
405
+ "text": "Initial selected value (uncontrolled mode)"
406
+ },
407
+ "getter": false,
408
+ "setter": false,
409
+ "reflect": false,
410
+ "attribute": "default-value"
411
+ },
412
+ "multiple": {
413
+ "type": "boolean",
414
+ "mutable": false,
415
+ "complexType": {
416
+ "original": "boolean",
417
+ "resolved": "boolean",
418
+ "references": {}
419
+ },
420
+ "required": false,
421
+ "optional": false,
422
+ "docs": {
423
+ "tags": [],
424
+ "text": "Enable multi-select mode"
425
+ },
426
+ "getter": false,
427
+ "setter": false,
428
+ "reflect": false,
429
+ "attribute": "multiple",
430
+ "defaultValue": "false"
431
+ },
432
+ "placeholder": {
433
+ "type": "string",
434
+ "mutable": false,
435
+ "complexType": {
436
+ "original": "string",
437
+ "resolved": "string",
438
+ "references": {}
439
+ },
440
+ "required": false,
441
+ "optional": false,
442
+ "docs": {
443
+ "tags": [],
444
+ "text": "Placeholder text shown when no selection"
445
+ },
446
+ "getter": false,
447
+ "setter": false,
448
+ "reflect": false,
449
+ "attribute": "placeholder",
450
+ "defaultValue": "'Select an option'"
451
+ },
452
+ "disabled": {
453
+ "type": "boolean",
454
+ "mutable": false,
455
+ "complexType": {
456
+ "original": "boolean",
457
+ "resolved": "boolean",
458
+ "references": {}
459
+ },
460
+ "required": false,
461
+ "optional": false,
462
+ "docs": {
463
+ "tags": [],
464
+ "text": "Disable all interactions"
465
+ },
466
+ "getter": false,
467
+ "setter": false,
468
+ "reflect": false,
469
+ "attribute": "disabled",
470
+ "defaultValue": "false"
471
+ },
472
+ "required": {
473
+ "type": "boolean",
474
+ "mutable": false,
475
+ "complexType": {
476
+ "original": "boolean",
477
+ "resolved": "boolean",
478
+ "references": {}
479
+ },
480
+ "required": false,
481
+ "optional": false,
482
+ "docs": {
483
+ "tags": [],
484
+ "text": "Mark as required for form validation"
485
+ },
486
+ "getter": false,
487
+ "setter": false,
488
+ "reflect": false,
489
+ "attribute": "required",
490
+ "defaultValue": "false"
491
+ },
492
+ "open": {
493
+ "type": "boolean",
494
+ "mutable": true,
495
+ "complexType": {
496
+ "original": "boolean",
497
+ "resolved": "boolean | undefined",
498
+ "references": {}
499
+ },
500
+ "required": false,
501
+ "optional": true,
502
+ "docs": {
503
+ "tags": [],
504
+ "text": "Control dropdown open state (controlled mode)"
505
+ },
506
+ "getter": false,
507
+ "setter": false,
508
+ "reflect": false,
509
+ "attribute": "open"
510
+ },
511
+ "defaultOpen": {
512
+ "type": "boolean",
513
+ "mutable": false,
514
+ "complexType": {
515
+ "original": "boolean",
516
+ "resolved": "boolean",
517
+ "references": {}
518
+ },
519
+ "required": false,
520
+ "optional": false,
521
+ "docs": {
522
+ "tags": [],
523
+ "text": "Initial dropdown open state (uncontrolled mode)"
524
+ },
525
+ "getter": false,
526
+ "setter": false,
527
+ "reflect": false,
528
+ "attribute": "default-open",
529
+ "defaultValue": "false"
530
+ },
531
+ "name": {
532
+ "type": "string",
533
+ "mutable": false,
534
+ "complexType": {
535
+ "original": "string",
536
+ "resolved": "string | undefined",
537
+ "references": {}
538
+ },
539
+ "required": false,
540
+ "optional": true,
541
+ "docs": {
542
+ "tags": [],
543
+ "text": "Form field name for form submission"
544
+ },
545
+ "getter": false,
546
+ "setter": false,
547
+ "reflect": false,
548
+ "attribute": "name"
549
+ },
550
+ "maxVisiblePills": {
551
+ "type": "number",
552
+ "mutable": false,
553
+ "complexType": {
554
+ "original": "number",
555
+ "resolved": "number",
556
+ "references": {}
557
+ },
558
+ "required": false,
559
+ "optional": false,
560
+ "docs": {
561
+ "tags": [],
562
+ "text": "Maximum visible pills in multi-select mode"
563
+ },
564
+ "getter": false,
565
+ "setter": false,
566
+ "reflect": false,
567
+ "attribute": "max-visible-pills",
568
+ "defaultValue": "3"
569
+ },
570
+ "ariaLabel": {
571
+ "type": "string",
572
+ "mutable": false,
573
+ "complexType": {
574
+ "original": "string",
575
+ "resolved": "string | undefined",
576
+ "references": {}
577
+ },
578
+ "required": false,
579
+ "optional": true,
580
+ "docs": {
581
+ "tags": [],
582
+ "text": "Accessible label for screen readers"
583
+ },
584
+ "getter": false,
585
+ "setter": false,
586
+ "reflect": false,
587
+ "attribute": "aria-label"
588
+ },
589
+ "ariaLabelledby": {
590
+ "type": "string",
591
+ "mutable": false,
592
+ "complexType": {
593
+ "original": "string",
594
+ "resolved": "string | undefined",
595
+ "references": {}
596
+ },
597
+ "required": false,
598
+ "optional": true,
599
+ "docs": {
600
+ "tags": [],
601
+ "text": "ID of element that labels this select"
602
+ },
603
+ "getter": false,
604
+ "setter": false,
605
+ "reflect": false,
606
+ "attribute": "aria-labelledby"
607
+ },
608
+ "ariaDescribedby": {
609
+ "type": "string",
610
+ "mutable": false,
611
+ "complexType": {
612
+ "original": "string",
613
+ "resolved": "string | undefined",
614
+ "references": {}
615
+ },
616
+ "required": false,
617
+ "optional": true,
618
+ "docs": {
619
+ "tags": [],
620
+ "text": "ID of element that describes this select"
621
+ },
622
+ "getter": false,
623
+ "setter": false,
624
+ "reflect": false,
625
+ "attribute": "aria-describedby"
626
+ },
627
+ "placement": {
628
+ "type": "string",
629
+ "mutable": false,
630
+ "complexType": {
631
+ "original": "SelectPlacement",
632
+ "resolved": "\"bottom\" | \"left\" | \"right\" | \"top\"",
633
+ "references": {
634
+ "SelectPlacement": {
635
+ "location": "import",
636
+ "path": "../../utils/select",
637
+ "id": "src/utils/select/index.ts::SelectPlacement"
638
+ }
639
+ }
640
+ },
641
+ "required": false,
642
+ "optional": false,
643
+ "docs": {
644
+ "tags": [],
645
+ "text": "Preferred dropdown placement"
646
+ },
647
+ "getter": false,
648
+ "setter": false,
649
+ "reflect": false,
650
+ "attribute": "placement",
651
+ "defaultValue": "'bottom'"
652
+ },
653
+ "maxHeight": {
654
+ "type": "string",
655
+ "mutable": false,
656
+ "complexType": {
657
+ "original": "string",
658
+ "resolved": "string",
659
+ "references": {}
660
+ },
661
+ "required": false,
662
+ "optional": false,
663
+ "docs": {
664
+ "tags": [],
665
+ "text": "Maximum dropdown height"
666
+ },
667
+ "getter": false,
668
+ "setter": false,
669
+ "reflect": false,
670
+ "attribute": "max-height",
671
+ "defaultValue": "'12.5rem'"
672
+ }
673
+ };
674
+ }
675
+ static get states() {
676
+ return {
677
+ "internalValue": {},
678
+ "isOpen": {},
679
+ "focusedOptionValue": {},
680
+ "registeredOptions": {},
681
+ "hasBeenActivated": {},
682
+ "searchBuffer": {},
683
+ "searchActive": {}
684
+ };
685
+ }
686
+ static get events() {
687
+ return [{
688
+ "method": "sekiChange",
689
+ "name": "sekiChange",
690
+ "bubbles": true,
691
+ "cancelable": true,
692
+ "composed": true,
693
+ "docs": {
694
+ "tags": [],
695
+ "text": "Emitted when selected value changes"
696
+ },
697
+ "complexType": {
698
+ "original": "SelectChangeEventDetail",
699
+ "resolved": "SelectChangeEventDetail",
700
+ "references": {
701
+ "SelectChangeEventDetail": {
702
+ "location": "import",
703
+ "path": "../../utils/select",
704
+ "id": "src/utils/select/index.ts::SelectChangeEventDetail"
705
+ }
706
+ }
707
+ }
708
+ }, {
709
+ "method": "sekiOpenChange",
710
+ "name": "sekiOpenChange",
711
+ "bubbles": true,
712
+ "cancelable": true,
713
+ "composed": true,
714
+ "docs": {
715
+ "tags": [],
716
+ "text": "Emitted when dropdown open state changes"
717
+ },
718
+ "complexType": {
719
+ "original": "SelectOpenChangeEventDetail",
720
+ "resolved": "SelectOpenChangeEventDetail",
721
+ "references": {
722
+ "SelectOpenChangeEventDetail": {
723
+ "location": "import",
724
+ "path": "../../utils/select",
725
+ "id": "src/utils/select/index.ts::SelectOpenChangeEventDetail"
726
+ }
727
+ }
728
+ }
729
+ }, {
730
+ "method": "sekiValidate",
731
+ "name": "sekiValidate",
732
+ "bubbles": true,
733
+ "cancelable": true,
734
+ "composed": true,
735
+ "docs": {
736
+ "tags": [],
737
+ "text": "Emitted when validation state changes"
738
+ },
739
+ "complexType": {
740
+ "original": "SelectValidateEventDetail",
741
+ "resolved": "SelectValidateEventDetail",
742
+ "references": {
743
+ "SelectValidateEventDetail": {
744
+ "location": "import",
745
+ "path": "../../utils/select",
746
+ "id": "src/utils/select/index.ts::SelectValidateEventDetail"
747
+ }
748
+ }
749
+ }
750
+ }];
751
+ }
752
+ static get methods() {
753
+ return {
754
+ "openDropdown": {
755
+ "complexType": {
756
+ "signature": "() => Promise<void>",
757
+ "parameters": [],
758
+ "references": {
759
+ "Promise": {
760
+ "location": "global",
761
+ "id": "global::Promise"
762
+ }
763
+ },
764
+ "return": "Promise<void>"
765
+ },
766
+ "docs": {
767
+ "text": "Programmatically open the dropdown",
768
+ "tags": []
769
+ }
770
+ },
771
+ "closeDropdown": {
772
+ "complexType": {
773
+ "signature": "() => Promise<void>",
774
+ "parameters": [],
775
+ "references": {
776
+ "Promise": {
777
+ "location": "global",
778
+ "id": "global::Promise"
779
+ }
780
+ },
781
+ "return": "Promise<void>"
782
+ },
783
+ "docs": {
784
+ "text": "Programmatically close the dropdown",
785
+ "tags": []
786
+ }
787
+ },
788
+ "focusTrigger": {
789
+ "complexType": {
790
+ "signature": "() => Promise<void>",
791
+ "parameters": [],
792
+ "references": {
793
+ "Promise": {
794
+ "location": "global",
795
+ "id": "global::Promise"
796
+ }
797
+ },
798
+ "return": "Promise<void>"
799
+ },
800
+ "docs": {
801
+ "text": "Focus the trigger element",
802
+ "tags": []
803
+ }
804
+ },
805
+ "clearSelection": {
806
+ "complexType": {
807
+ "signature": "() => Promise<void>",
808
+ "parameters": [],
809
+ "references": {
810
+ "Promise": {
811
+ "location": "global",
812
+ "id": "global::Promise"
813
+ }
814
+ },
815
+ "return": "Promise<void>"
816
+ },
817
+ "docs": {
818
+ "text": "Clear all selections",
819
+ "tags": []
820
+ }
821
+ },
822
+ "handleKeyboard": {
823
+ "complexType": {
824
+ "signature": "(event: KeyboardEvent) => Promise<void>",
825
+ "parameters": [{
826
+ "name": "event",
827
+ "type": "KeyboardEvent",
828
+ "docs": ""
829
+ }],
830
+ "references": {
831
+ "Promise": {
832
+ "location": "global",
833
+ "id": "global::Promise"
834
+ },
835
+ "KeyboardEvent": {
836
+ "location": "global",
837
+ "id": "global::KeyboardEvent"
838
+ }
839
+ },
840
+ "return": "Promise<void>"
841
+ },
842
+ "docs": {
843
+ "text": "Handle keyboard navigation (arrow keys, typeahead, etc.)",
844
+ "tags": []
845
+ }
846
+ }
847
+ };
848
+ }
849
+ static get elementRef() { return "el"; }
850
+ static get watchers() {
851
+ return [{
852
+ "propName": "value",
853
+ "methodName": "handleValuePropChange"
854
+ }, {
855
+ "propName": "open",
856
+ "methodName": "handleOpenPropChange"
857
+ }, {
858
+ "propName": "isOpen",
859
+ "methodName": "handleIsOpenChange"
860
+ }, {
861
+ "propName": "internalValue",
862
+ "methodName": "handleInternalValueChange"
863
+ }];
864
+ }
865
+ }