@warp-ds/elements 2.10.0-next.1 → 2.10.0-next.11

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 (254) hide show
  1. package/README.md +4 -0
  2. package/dist/api.js +1 -1
  3. package/dist/api.js.map +1 -1
  4. package/dist/custom-elements.json +233 -87
  5. package/dist/docs/affix/affix.md +2 -2
  6. package/dist/docs/affix/styling.md +1 -0
  7. package/dist/docs/alert/alert.md +2 -2
  8. package/dist/docs/alert/styling.md +1 -0
  9. package/dist/docs/attention/attention.md +2 -0
  10. package/dist/docs/attention/styling.md +1 -0
  11. package/dist/docs/badge/badge.md +2 -0
  12. package/dist/docs/badge/styling.md +1 -0
  13. package/dist/docs/box/box.md +22 -40
  14. package/dist/docs/box/examples.md +20 -38
  15. package/dist/docs/box/styling.md +1 -0
  16. package/dist/docs/breadcrumbs/breadcrumbs.md +8 -2
  17. package/dist/docs/breadcrumbs/examples.md +7 -1
  18. package/dist/docs/breadcrumbs/styling.md +1 -0
  19. package/dist/docs/button/button.md +73 -2
  20. package/dist/docs/button/styling.md +72 -0
  21. package/dist/docs/card/accessibility.md +74 -0
  22. package/dist/docs/card/api.md +9 -3
  23. package/dist/docs/card/card.md +236 -5
  24. package/dist/docs/card/examples.md +75 -0
  25. package/dist/docs/card/styling.md +1 -0
  26. package/dist/docs/card/usage.md +76 -0
  27. package/dist/docs/checkbox/api.md +128 -0
  28. package/dist/docs/checkbox/checkbox.md +134 -0
  29. package/dist/docs/checkbox-group/accessibility.md +71 -0
  30. package/dist/docs/checkbox-group/api.md +79 -0
  31. package/dist/docs/checkbox-group/checkbox-group.md +492 -0
  32. package/dist/docs/checkbox-group/examples.md +105 -0
  33. package/dist/docs/checkbox-group/styling.md +132 -0
  34. package/dist/docs/checkbox-group/usage.md +95 -0
  35. package/dist/docs/combobox/accessibility.md +71 -0
  36. package/dist/docs/combobox/api.md +60 -30
  37. package/dist/docs/combobox/combobox.md +205 -32
  38. package/dist/docs/combobox/examples.md +44 -0
  39. package/dist/docs/combobox/styling.md +1 -0
  40. package/dist/docs/combobox/usage.md +28 -0
  41. package/dist/docs/datepicker/accessibility.md +25 -0
  42. package/dist/docs/datepicker/api.md +22 -14
  43. package/dist/docs/datepicker/datepicker.md +208 -16
  44. package/dist/docs/datepicker/examples.md +75 -0
  45. package/dist/docs/datepicker/styling.md +1 -0
  46. package/dist/docs/datepicker/usage.md +84 -0
  47. package/dist/docs/expandable/api.md +20 -32
  48. package/dist/docs/expandable/examples.md +54 -0
  49. package/dist/docs/expandable/expandable.md +74 -32
  50. package/dist/docs/expandable/styling.md +1 -0
  51. package/dist/docs/icon/accessibility.md +5 -0
  52. package/dist/docs/icon/api.md +43 -0
  53. package/dist/docs/icon/examples.md +45 -0
  54. package/dist/docs/icon/icon.md +115 -0
  55. package/dist/docs/icon/styling.md +1 -0
  56. package/dist/docs/icon/usage.md +11 -0
  57. package/dist/docs/index.md +46 -0
  58. package/dist/docs/link/api.md +18 -22
  59. package/dist/docs/link/examples.md +75 -0
  60. package/dist/docs/link/link.md +113 -24
  61. package/dist/docs/link/styling.md +1 -0
  62. package/dist/docs/link/usage.md +18 -0
  63. package/dist/docs/modal/modal.md +2 -0
  64. package/dist/docs/modal/styling.md +1 -0
  65. package/dist/docs/modal-footer/modal-footer.md +0 -6
  66. package/dist/docs/modal-header/modal-header.md +0 -6
  67. package/dist/docs/page-indicator/page-indicator.md +2 -0
  68. package/dist/docs/page-indicator/styling.md +1 -0
  69. package/dist/docs/pagination/pagination.md +2 -0
  70. package/dist/docs/pagination/styling.md +1 -0
  71. package/dist/docs/pill/pill.md +2 -0
  72. package/dist/docs/pill/styling.md +1 -0
  73. package/dist/docs/radio/radio.md +1 -7
  74. package/dist/docs/select/select.md +2 -0
  75. package/dist/docs/select/styling.md +1 -0
  76. package/dist/docs/slider/slider.md +2 -0
  77. package/dist/docs/slider/styling.md +1 -0
  78. package/dist/docs/slider-thumb/slider-thumb.md +2 -0
  79. package/dist/docs/slider-thumb/styling.md +1 -0
  80. package/dist/docs/step-indicator/step-indicator.md +2 -0
  81. package/dist/docs/step-indicator/styling.md +1 -0
  82. package/dist/docs/switch/styling.md +1 -0
  83. package/dist/docs/switch/switch.md +2 -0
  84. package/dist/docs/tabs/styling.md +1 -0
  85. package/dist/docs/tabs/tabs.md +2 -0
  86. package/dist/docs/textarea/styling.md +1 -0
  87. package/dist/docs/textarea/textarea.md +2 -0
  88. package/dist/docs/textfield/styling.md +1 -0
  89. package/dist/docs/textfield/textfield.md +2 -0
  90. package/dist/index.d.ts +932 -341
  91. package/dist/packages/affix/affix.hydration.test.js +1 -1
  92. package/dist/packages/affix/affix.js +4 -4
  93. package/dist/packages/affix/affix.js.map +4 -4
  94. package/dist/packages/alert/alert.hydration.test.js +1 -1
  95. package/dist/packages/alert/alert.js +3 -3
  96. package/dist/packages/alert/alert.js.map +3 -3
  97. package/dist/packages/attention/attention.hydration.test.js +1 -1
  98. package/dist/packages/attention/attention.js +397 -446
  99. package/dist/packages/attention/attention.js.map +4 -4
  100. package/dist/packages/attention/attention.test.js +1 -1
  101. package/dist/packages/badge/badge.hydration.test.js +1 -1
  102. package/dist/packages/box/box.hydration.test.js +1 -1
  103. package/dist/packages/box/box.js +1 -1
  104. package/dist/packages/box/box.js.map +1 -1
  105. package/dist/packages/breadcrumbs/breadcrumbs.hydration.test.js +3 -2
  106. package/dist/packages/breadcrumbs/breadcrumbs.js +4 -4
  107. package/dist/packages/breadcrumbs/breadcrumbs.js.map +3 -3
  108. package/dist/packages/button/button.hydration.test.js +1 -1
  109. package/dist/packages/button/button.js +387 -436
  110. package/dist/packages/button/button.js.map +4 -4
  111. package/dist/packages/button/button.stories.d.ts +29 -0
  112. package/dist/packages/button/button.stories.js +176 -2
  113. package/dist/packages/button/styles.d.ts +22 -1
  114. package/dist/packages/button/styles.js +390 -1
  115. package/dist/packages/card/card.d.ts +9 -6
  116. package/dist/packages/card/card.hydration.test.js +1 -1
  117. package/dist/packages/card/card.js +3 -3
  118. package/dist/packages/card/card.js.map +4 -4
  119. package/dist/packages/checkbox/checkbox.d.ts +45 -14
  120. package/dist/packages/checkbox/checkbox.hydration.test.js +1 -1
  121. package/dist/packages/checkbox/checkbox.js +3 -3
  122. package/dist/packages/checkbox/checkbox.js.map +3 -3
  123. package/dist/packages/checkbox/checkbox.react.stories.d.ts +1 -1
  124. package/dist/packages/checkbox/checkbox.stories.d.ts +2 -2
  125. package/dist/packages/checkbox/checkbox.test.js +1 -1
  126. package/dist/packages/checkbox/react.d.ts +2 -2
  127. package/dist/packages/checkbox-group/checkbox-group.a11y.test.js +1 -1
  128. package/dist/packages/checkbox-group/checkbox-group.d.ts +35 -8
  129. package/dist/packages/checkbox-group/checkbox-group.hydration.test.js +1 -1
  130. package/dist/packages/checkbox-group/checkbox-group.js +6 -6
  131. package/dist/packages/checkbox-group/checkbox-group.js.map +4 -4
  132. package/dist/packages/checkbox-group/react.d.ts +3 -3
  133. package/dist/packages/combobox/combobox.a11y.test.js +24 -0
  134. package/dist/packages/combobox/combobox.d.ts +65 -45
  135. package/dist/packages/combobox/combobox.hydration.test.js +39 -1
  136. package/dist/packages/combobox/combobox.js +21 -21
  137. package/dist/packages/combobox/combobox.js.map +4 -4
  138. package/dist/packages/combobox/combobox.stories.js +28 -15
  139. package/dist/packages/combobox/combobox.test.js +110 -0
  140. package/dist/packages/datepicker/DatePicker.test.js +1 -1
  141. package/dist/packages/datepicker/datepicker.d.ts +22 -30
  142. package/dist/packages/datepicker/datepicker.hydration.test.js +1 -1
  143. package/dist/packages/datepicker/datepicker.js +49 -49
  144. package/dist/packages/datepicker/datepicker.js.map +4 -4
  145. package/dist/packages/datepicker/datepicker.test.js +1 -1
  146. package/dist/packages/expandable/expandable.d.ts +11 -32
  147. package/dist/packages/expandable/expandable.hydration.test.js +1 -1
  148. package/dist/packages/expandable/expandable.js +11 -11
  149. package/dist/packages/expandable/expandable.js.map +3 -3
  150. package/dist/packages/expandable/expandable.react.stories.d.ts +2 -2
  151. package/dist/packages/expandable/react.d.ts +1 -1
  152. package/dist/packages/icon/icon.d.ts +16 -4
  153. package/dist/packages/icon/icon.hydration.test.js +1 -1
  154. package/dist/packages/icon/icon.js +2 -2
  155. package/dist/packages/icon/icon.js.map +3 -3
  156. package/dist/packages/icon/icon.react.stories.d.ts +1 -1
  157. package/dist/packages/icon/react.d.ts +2 -2
  158. package/dist/packages/link/link.d.ts +15 -16
  159. package/dist/packages/link/link.hydration.test.js +1 -1
  160. package/dist/packages/link/link.js +420 -190
  161. package/dist/packages/link/link.js.map +4 -4
  162. package/dist/packages/link/link.test.js +1 -1
  163. package/dist/packages/link/styles.d.ts +5 -0
  164. package/dist/packages/link/styles.js +80 -0
  165. package/dist/packages/modal/modal.d.ts +1 -0
  166. package/dist/packages/modal/modal.hydration.test.js +1 -1
  167. package/dist/packages/modal/modal.js +4 -4
  168. package/dist/packages/modal/modal.js.map +3 -3
  169. package/dist/packages/modal/modal.react.stories.d.ts +4 -4
  170. package/dist/packages/modal/modal.react.stories.js +9 -1
  171. package/dist/packages/modal/react.d.ts +34 -4
  172. package/dist/packages/modal/react.js +30 -0
  173. package/dist/packages/modal-header/modal-header.js +11 -9
  174. package/dist/packages/modal-header/modal-header.js.map +4 -4
  175. package/dist/packages/page-indicator/page-indicator.hydration.test.js +1 -1
  176. package/dist/packages/page-indicator/page-indicator.js +5 -5
  177. package/dist/packages/page-indicator/page-indicator.js.map +3 -3
  178. package/dist/packages/pagination/pagination.hydration.test.js +1 -1
  179. package/dist/packages/pagination/pagination.js +4 -4
  180. package/dist/packages/pagination/pagination.js.map +4 -4
  181. package/dist/packages/pagination/pagination.test.js +1 -1
  182. package/dist/packages/pill/pill.hydration.test.js +1 -1
  183. package/dist/packages/pill/pill.js +3 -3
  184. package/dist/packages/pill/pill.js.map +4 -4
  185. package/dist/packages/radio/radio.hydration.test.js +1 -1
  186. package/dist/packages/radio/radio.js +3 -3
  187. package/dist/packages/radio/radio.js.map +3 -3
  188. package/dist/packages/radio/radio.test.js +1 -1
  189. package/dist/packages/radio-group/radio-group.a11y.test.js +7 -3
  190. package/dist/packages/radio-group/radio-group.hydration.test.js +6 -2
  191. package/dist/packages/radio-group/radio-group.js +11 -11
  192. package/dist/packages/radio-group/radio-group.js.map +4 -4
  193. package/dist/packages/select/select.a11y.test.js +6 -2
  194. package/dist/packages/select/select.hydration.test.js +1 -1
  195. package/dist/packages/select/select.js +7 -7
  196. package/dist/packages/select/select.js.map +4 -4
  197. package/dist/packages/select/select.test.js +4 -2
  198. package/dist/packages/slider/slider.hydration.test.js +7 -2
  199. package/dist/packages/slider/slider.js +5 -5
  200. package/dist/packages/slider/slider.js.map +4 -4
  201. package/dist/packages/slider/slider.react.stories.js +2 -2
  202. package/dist/packages/slider/slider.test.js +1 -1
  203. package/dist/packages/slider-thumb/slider-thumb.hydration.test.js +1 -1
  204. package/dist/packages/slider-thumb/slider-thumb.js +20 -20
  205. package/dist/packages/slider-thumb/slider-thumb.js.map +4 -4
  206. package/dist/packages/step/step.hydration.test.js +1 -1
  207. package/dist/packages/step/step.js +8 -8
  208. package/dist/packages/step/step.js.map +4 -4
  209. package/dist/packages/step-indicator/step-indicator.hydration.test.js +1 -1
  210. package/dist/packages/switch/switch.a11y.test.js +1 -1
  211. package/dist/packages/switch/switch.hydration.test.js +1 -1
  212. package/dist/packages/switch/switch.js +1 -1
  213. package/dist/packages/switch/switch.js.map +1 -1
  214. package/dist/packages/tab/tab.hydration.test.js +1 -1
  215. package/dist/packages/tab/tab.js +10 -10
  216. package/dist/packages/tab/tab.js.map +2 -2
  217. package/dist/packages/tab-panel/tab-panel.hydration.test.js +1 -1
  218. package/dist/packages/tab-panel/tab-panel.js +3 -3
  219. package/dist/packages/tab-panel/tab-panel.js.map +2 -2
  220. package/dist/packages/tabs/tabs.a11y.test.js +2 -2
  221. package/dist/packages/tabs/tabs.hydration.test.js +1 -1
  222. package/dist/packages/tabs/tabs.js +1 -1
  223. package/dist/packages/tabs/tabs.js.map +2 -2
  224. package/dist/packages/tabs/tabs.test.js +4 -4
  225. package/dist/packages/textarea/textarea.hydration.test.js +1 -1
  226. package/dist/packages/textarea/textarea.js +4 -4
  227. package/dist/packages/textarea/textarea.js.map +3 -3
  228. package/dist/packages/textarea/textarea.test.js +1 -1
  229. package/dist/packages/textfield/textfield.hydration.test.js +1 -1
  230. package/dist/packages/textfield/textfield.js +1 -1
  231. package/dist/packages/textfield/textfield.js.map +1 -1
  232. package/dist/packages/textfield/textfield.test.js +1 -1
  233. package/dist/packages/toast/toast.js +6 -6
  234. package/dist/packages/toast/toast.js.map +4 -4
  235. package/dist/packages/toast/toast.stories.d.ts +1 -5
  236. package/dist/packages/toast/toast.stories.js +0 -17
  237. package/dist/packages/toast-container/toast-container.js +2 -2
  238. package/dist/packages/toast-container/toast-container.js.map +2 -2
  239. package/dist/web-types.json +238 -103
  240. package/eik/index.js +2536 -0
  241. package/package.json +15 -9
  242. package/dist/docs/modal-footer/accessibility.md +0 -1
  243. package/dist/docs/modal-footer/examples.md +0 -1
  244. package/dist/docs/modal-footer/usage.md +0 -1
  245. package/dist/docs/modal-header/accessibility.md +0 -1
  246. package/dist/docs/modal-header/examples.md +0 -1
  247. package/dist/docs/modal-header/usage.md +0 -1
  248. package/dist/docs/radio/accessibility.md +0 -1
  249. package/dist/docs/radio/examples.md +0 -1
  250. package/dist/docs/radio/usage.md +0 -1
  251. package/dist/packages/button/styles/w-button.styles.d.ts +0 -1
  252. package/dist/packages/button/styles/w-button.styles.js +0 -282
  253. package/dist/packages/link/styles/w-link.styles.d.ts +0 -1
  254. package/dist/packages/link/styles/w-link.styles.js +0 -213
@@ -9,7 +9,11 @@ const meta = {
9
9
  title: 'Forms/Combobox',
10
10
  component: 'w-combobox',
11
11
  render(args) {
12
- return html ` <w-combobox ${spread(prespread(args))} .options="${sampleOptions}"></w-combobox> `;
12
+ return html `
13
+ <w-combobox ${spread(prespread(args))}>
14
+ ${sampleOptionElements}
15
+ </w-combobox>
16
+ `;
13
17
  },
14
18
  parameters: {
15
19
  docs: {
@@ -34,21 +38,32 @@ const sampleOptions = [
34
38
  { value: 'pineapple', label: 'Pineapple' },
35
39
  { value: 'mango', label: 'Mango' },
36
40
  ];
41
+ const sampleOptionElements = html `
42
+ <option value="apple">Apple</option>
43
+ <option value="banana">Banana</option>
44
+ <option value="orange">Orange</option>
45
+ <option value="grape">Grape</option>
46
+ <option value="strawberry">Strawberry</option>
47
+ <option value="pineapple">Pineapple</option>
48
+ <option value="mango">Mango</option>
49
+ `;
37
50
  export const Default = {
38
51
  args: {},
39
- render: () => html ` <w-combobox label="Select a fruit" placeholder="Type to search..." .options="${sampleOptions}"></w-combobox> `,
52
+ render: () => html `
53
+ <w-combobox label="Select a fruit" placeholder="Type to search...">
54
+ ${sampleOptionElements}
55
+ </w-combobox>
56
+ `,
40
57
  };
41
58
  export const WithValue = {
42
59
  args: {
43
- options: sampleOptions,
44
60
  label: 'Select a fruit',
45
61
  placeholder: 'Type to search...',
46
- value: 'Apple',
62
+ value: 'apple',
47
63
  },
48
64
  };
49
65
  export const OpenOnFocus = {
50
66
  args: {
51
- options: sampleOptions,
52
67
  label: 'Select a fruit',
53
68
  placeholder: 'Type to search...',
54
69
  openOnFocus: true,
@@ -56,7 +71,6 @@ export const OpenOnFocus = {
56
71
  };
57
72
  export const WithTextMatching = {
58
73
  args: {
59
- options: sampleOptions,
60
74
  label: 'Select a fruit',
61
75
  placeholder: 'Type to search...',
62
76
  matchTextSegments: true,
@@ -64,7 +78,6 @@ export const WithTextMatching = {
64
78
  };
65
79
  export const Invalid = {
66
80
  args: {
67
- options: sampleOptions,
68
81
  label: 'Select a fruit',
69
82
  placeholder: 'Type to search...',
70
83
  value: 'Invalid fruit',
@@ -74,16 +87,14 @@ export const Invalid = {
74
87
  };
75
88
  export const Disabled = {
76
89
  args: {
77
- options: sampleOptions,
78
90
  label: 'Select a fruit',
79
91
  placeholder: 'Type to search...',
80
- value: 'Apple',
92
+ value: 'apple',
81
93
  disabled: true,
82
94
  },
83
95
  };
84
96
  export const Optional = {
85
97
  args: {
86
- options: sampleOptions,
87
98
  label: 'Select a fruit',
88
99
  placeholder: 'Type to search...',
89
100
  optional: true,
@@ -125,17 +136,19 @@ export const FormSubmission = {
125
136
  name="warp-combo-1"
126
137
  label="Select a fruit (dynamic)"
127
138
  placeholder="Type to search..."
128
- .options="${sampleOptions}"
129
- ></w-combobox>
139
+ >
140
+ ${sampleOptionElements}
141
+ </w-combobox>
130
142
  <br>
131
143
  <w-combobox
132
144
  id="form-submission"
133
145
  name="warp-combo-2"
134
146
  label="Select a fruit (dynamic)"
135
- value="Banana"
147
+ value="banana"
136
148
  placeholder="Type to search..."
137
- .options="${sampleOptions}"
138
- ></w-combobox>
149
+ >
150
+ ${sampleOptionElements}
151
+ </w-combobox>
139
152
  <button type="reset">Reset</button>
140
153
  <button type="submit">Submit</button>
141
154
  </form>
@@ -134,3 +134,113 @@ test('announces suggestion count when opened on focus with empty input', async (
134
134
  const statusText = el.shadowRoot?.querySelector('[role="status"]')?.textContent?.trim();
135
135
  expect(statusText).toBe('3 suggestions');
136
136
  });
137
+ test('renders light-DOM option children in the generated popup', async () => {
138
+ const component = html `
139
+ <w-combobox data-testid="combobox" open-on-focus>
140
+ <option value="no">Norway</option>
141
+ <option value="se">Sweden</option>
142
+ <option value="dk">Denmark</option>
143
+ </w-combobox>
144
+ `;
145
+ const page = render(component);
146
+ const locator = page.getByTestId('combobox');
147
+ await expect.element(locator).toBeVisible();
148
+ const el = (await locator.element());
149
+ const input = el.shadowRoot?.querySelector('w-textfield')?.shadowRoot?.querySelector('input');
150
+ input?.focus();
151
+ await new Promise((resolve) => setTimeout(resolve, 100));
152
+ const visibleOptions = el.shadowRoot?.querySelectorAll('[role="listbox"] [role="option"]');
153
+ const optionTexts = Array.from(visibleOptions || []).map((opt) => opt.textContent?.trim());
154
+ expect(optionTexts).toEqual(['Norway', 'Sweden', 'Denmark']);
155
+ });
156
+ test('filters light-DOM options by label attribute and stores option value on select', async () => {
157
+ const component = html `
158
+ <w-combobox data-testid="combobox" open-on-focus>
159
+ <option value="us" label="United States">US</option>
160
+ <option value="uk" label="United Kingdom">UK</option>
161
+ <option value="no">Norway</option>
162
+ </w-combobox>
163
+ `;
164
+ const page = render(component);
165
+ const locator = page.getByTestId('combobox');
166
+ await expect.element(locator).toBeVisible();
167
+ const el = (await locator.element());
168
+ const input = el.shadowRoot?.querySelector('w-textfield')?.shadowRoot?.querySelector('input');
169
+ const selectEvents = [];
170
+ el.addEventListener('select', (event) => selectEvents.push(event));
171
+ input.focus();
172
+ input.value = 'United';
173
+ input.dispatchEvent(new InputEvent('input', { bubbles: true, composed: true }));
174
+ await new Promise((resolve) => setTimeout(resolve, 100));
175
+ const visibleOptions = el.shadowRoot?.querySelectorAll('[role="listbox"] [role="option"]');
176
+ const optionTexts = Array.from(visibleOptions || []).map((opt) => opt.textContent?.trim());
177
+ expect(optionTexts).toEqual(['United States', 'United Kingdom']);
178
+ visibleOptions?.[1]?.dispatchEvent(new MouseEvent('mousedown', { bubbles: true }));
179
+ await new Promise((resolve) => setTimeout(resolve, 100));
180
+ expect(input.value).toBe('United Kingdom');
181
+ expect(el.value).toBe('uk');
182
+ expect(selectEvents.at(-1)?.detail).toEqual({ value: 'uk' });
183
+ });
184
+ test('uses light-DOM options to display an initial value label', async () => {
185
+ const component = html `
186
+ <w-combobox data-testid="combobox" value="no">
187
+ <option value="se">Sweden</option>
188
+ <option value="no">Norway</option>
189
+ </w-combobox>
190
+ `;
191
+ const page = render(component);
192
+ const locator = page.getByTestId('combobox');
193
+ await expect.element(locator).toBeVisible();
194
+ const el = (await locator.element());
195
+ const input = el.shadowRoot?.querySelector('w-textfield')?.shadowRoot?.querySelector('input');
196
+ expect(input.value).toBe('Norway');
197
+ expect(el.value).toBe('no');
198
+ });
199
+ test('syncs dynamic light-DOM option child changes', async () => {
200
+ const component = html `
201
+ <w-combobox data-testid="combobox" open-on-focus>
202
+ <option value="no">Norway</option>
203
+ <option value="se">Sweden</option>
204
+ </w-combobox>
205
+ `;
206
+ const page = render(component);
207
+ const locator = page.getByTestId('combobox');
208
+ await expect.element(locator).toBeVisible();
209
+ const el = (await locator.element());
210
+ const input = el.shadowRoot?.querySelector('w-textfield')?.shadowRoot?.querySelector('input');
211
+ const denmark = document.createElement('option');
212
+ denmark.value = 'dk';
213
+ denmark.textContent = 'Denmark';
214
+ el.appendChild(denmark);
215
+ const sweden = el.querySelector('option[value="se"]');
216
+ sweden?.remove();
217
+ const norway = el.querySelector('option[value="no"]');
218
+ norway?.setAttribute('value', 'nor');
219
+ if (norway) {
220
+ norway.textContent = 'Norge';
221
+ }
222
+ await new Promise((resolve) => setTimeout(resolve, 100));
223
+ input.focus();
224
+ await new Promise((resolve) => setTimeout(resolve, 100));
225
+ const visibleOptions = el.shadowRoot?.querySelectorAll('[role="listbox"] [role="option"]');
226
+ const optionTexts = Array.from(visibleOptions || []).map((opt) => opt.textContent?.trim());
227
+ expect(optionTexts).toEqual(['Norge', 'Denmark']);
228
+ });
229
+ test('non-empty options property takes precedence over light-DOM option children', async () => {
230
+ const options = [{ value: 'apple', label: 'Apple' }];
231
+ const component = html `
232
+ <w-combobox data-testid="combobox" open-on-focus .options="${options}">
233
+ <option value="banana">Banana</option>
234
+ </w-combobox>
235
+ `;
236
+ const page = render(component);
237
+ const locator = page.getByTestId('combobox');
238
+ await expect.element(locator).toBeVisible();
239
+ const el = (await locator.element());
240
+ const input = el.shadowRoot?.querySelector('w-textfield')?.shadowRoot?.querySelector('input');
241
+ input.focus();
242
+ await new Promise((resolve) => setTimeout(resolve, 100));
243
+ const visibleOptions = el.shadowRoot?.querySelectorAll('[role="listbox"] [role="option"]');
244
+ const optionTexts = Array.from(visibleOptions || []).map((opt) => opt.textContent?.trim());
245
+ expect(optionTexts).toEqual(['Apple']);
246
+ });
@@ -1,4 +1,4 @@
1
- import { server, userEvent } from '@vitest/browser/context';
1
+ import { server, userEvent } from 'vitest/browser';
2
2
  import React, { useState } from 'react';
3
3
  import { expect, test, vi } from 'vitest';
4
4
  import { render } from 'vitest-browser-react';
@@ -21,47 +21,45 @@ declare class WarpDatepicker extends WarpDatepicker_base {
21
21
  };
22
22
  static styles: import("lit").CSSResult[];
23
23
  /**
24
- * @summary
25
- * @description
24
+ * The label displayed above the date input.
25
+ *
26
+ * Use this to give the datepicker a visible and accessible name.
26
27
  */
27
28
  label: string;
28
- /** Takes precedence over the `<html>` lang attribute.
29
- * @summary
30
- * @description
29
+ /**
30
+ * The locale used for calendar labels and date formatting.
31
+ *
32
+ * This takes precedence over the `<html>` `lang` attribute. Supported built-in locales are `en`, `nb`, `sv`, `da`, and `fi`.
31
33
  */
32
34
  lang: string;
33
35
  /**
34
- * @summary
35
- * @description
36
+ * The name submitted with the date value.
37
+ *
38
+ * Use this when the datepicker belongs to a form and its value should be included in form data.
36
39
  */
37
40
  name: string;
38
41
  /**
39
- * @summary
40
- * @description
42
+ * The selected date value.
43
+ *
44
+ * Use an ISO date string in `YYYY-MM-DD` format. The value is submitted with the form and is reset to its initial value when the form resets.
41
45
  */
42
46
  value: string;
43
47
  /**
44
- * Decides the format of the date as shown in the calendar header.
48
+ * The date format used in the calendar header.
45
49
  *
46
50
  * The syntax is defined by [date-fns/format](https://date-fns.org/v4.1.0/docs/format).
47
-
48
- * @summary
49
- * @description
50
- */
51
+ */
51
52
  headerFormat: string;
52
53
  /**
53
- * Decides the format of the weekday as shown above the grid of dates in the calendar.
54
+ * The weekday format shown above the calendar grid.
54
55
  *
55
56
  * The syntax is defined by [date-fns/format](https://date-fns.org/v4.1.0/docs/format).
56
-
57
- * @summary
58
- * @description
59
- */
57
+ */
60
58
  weekdayFormat: string;
61
59
  /**
62
- * Lets you control if a date in the calendar should be disabled.
60
+ * Function used to disable dates in the calendar.
63
61
  *
64
- * This needs to be set on the element instance in JavaScript, not as an HTML attribute.
62
+ * Set this on the element instance in JavaScript, not as an HTML attribute. Disabled dates cannot be selected from the calendar.
65
63
  *
66
64
  * @example
67
65
  * ```ts
@@ -72,19 +70,13 @@ declare class WarpDatepicker extends WarpDatepicker_base {
72
70
  * const datePicker = document.querySelector('w-datepicker') as WarpDatepicker;
73
71
  * datePicker.isDayDisabled = (day: Date) => isBefore(startOfDay(day), today);
74
72
  * ```
75
-
76
- * @summary
77
- * @description
78
- */
73
+ */
79
74
  isDayDisabled: (day: Date) => boolean;
80
75
  /**
81
- * Decides the format of the day in the calendar as read to screen readers.
76
+ * The date format used for calendar day accessible names.
82
77
  *
83
78
  * The syntax is defined by [date-fns/format](https://date-fns.org/v4.1.0/docs/format).
84
-
85
- * @summary
86
- * @description
87
- */
79
+ */
88
80
  dayFormat: string;
89
81
  isCalendarOpen: boolean;
90
82
  navigationDate: Date;
@@ -1,4 +1,4 @@
1
- import { describe, expect, test, beforeEach, afterEach } from 'vitest';
1
+ import { afterEach, beforeEach, describe, expect, test } from 'vitest';
2
2
  import { setupHydrationWarningCapture, testHydration } from '../../tests/react-hydration';
3
3
  import './datepicker.js';
4
4
  describe('w-datepicker React SSR hydration', () => {