@human-kit/svelte-components 1.0.0-alpha.2 → 1.0.0-alpha.21

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 (407) hide show
  1. package/dist/FOCUS_STATE_CONTRACT.md +63 -0
  2. package/dist/FOCUS_STATE_REVIEW_TEMPLATE.md +70 -0
  3. package/dist/button/README.md +48 -0
  4. package/dist/button/TODO.md +13 -0
  5. package/dist/button/index.d.ts +5 -0
  6. package/dist/button/index.js +4 -0
  7. package/dist/button/index.parts.d.ts +1 -0
  8. package/dist/button/index.parts.js +1 -0
  9. package/dist/button/root/README.md +43 -0
  10. package/dist/button/root/button-root.svelte +393 -0
  11. package/dist/button/root/button-root.svelte.d.ts +21 -0
  12. package/dist/button/root/button-test.svelte +76 -0
  13. package/dist/button/root/button-test.svelte.d.ts +11 -0
  14. package/dist/calendar/README.md +2 -1
  15. package/dist/calendar/TODO.md +21 -107
  16. package/dist/calendar/body-cell/README.md +15 -0
  17. package/dist/calendar/body-cell/calendar-body-cell.svelte +116 -41
  18. package/dist/calendar/grid/README.md +13 -0
  19. package/dist/calendar/grid-body/README.md +13 -0
  20. package/dist/calendar/grid-header/README.md +13 -0
  21. package/dist/calendar/header-cell/README.md +14 -0
  22. package/dist/calendar/heading/README.md +13 -0
  23. package/dist/calendar/index.d.ts +3 -3
  24. package/dist/calendar/index.js +3 -3
  25. package/dist/calendar/root/README.md +24 -0
  26. package/dist/calendar/root/calendar-root-test.svelte +4 -0
  27. package/dist/calendar/root/calendar-root-test.svelte.d.ts +1 -0
  28. package/dist/calendar/root/calendar-root.svelte +3 -0
  29. package/dist/calendar/root/calendar-root.svelte.d.ts +1 -0
  30. package/dist/calendar/root/context.d.ts +4 -0
  31. package/dist/calendar/root/context.js +28 -25
  32. package/dist/calendar/root/date-utils.d.ts +1 -1
  33. package/dist/calendar/root/date-utils.js +16 -26
  34. package/dist/calendar/trigger-next/README.md +14 -0
  35. package/dist/calendar/trigger-next/calendar-trigger-next.svelte +9 -4
  36. package/dist/calendar/trigger-next/calendar-trigger-next.svelte.d.ts +2 -1
  37. package/dist/calendar/trigger-previous/README.md +14 -0
  38. package/dist/calendar/trigger-previous/calendar-trigger-previous.svelte +9 -4
  39. package/dist/calendar/trigger-previous/calendar-trigger-previous.svelte.d.ts +2 -1
  40. package/dist/checkbox/README.md +53 -0
  41. package/dist/checkbox/TODO.md +16 -0
  42. package/dist/checkbox/index.d.ts +6 -0
  43. package/dist/checkbox/index.js +6 -0
  44. package/dist/checkbox/index.parts.d.ts +2 -0
  45. package/dist/checkbox/index.parts.js +2 -0
  46. package/dist/checkbox/indicator/README.md +23 -0
  47. package/dist/checkbox/indicator/checkbox-indicator.svelte +43 -0
  48. package/dist/checkbox/indicator/checkbox-indicator.svelte.d.ts +10 -0
  49. package/dist/checkbox/root/README.md +47 -0
  50. package/dist/checkbox/root/checkbox-label-test.svelte +10 -0
  51. package/dist/checkbox/root/checkbox-label-test.svelte.d.ts +18 -0
  52. package/dist/checkbox/root/checkbox-root.svelte +386 -0
  53. package/dist/checkbox/root/checkbox-root.svelte.d.ts +29 -0
  54. package/dist/checkbox/root/checkbox-test.svelte +59 -0
  55. package/dist/checkbox/root/checkbox-test.svelte.d.ts +18 -0
  56. package/dist/checkbox/root/context.d.ts +21 -0
  57. package/dist/checkbox/root/context.js +15 -0
  58. package/dist/clock/README.md +75 -0
  59. package/dist/clock/axis/README.md +24 -0
  60. package/dist/clock/axis/clock-axis.svelte +37 -0
  61. package/dist/clock/axis/clock-axis.svelte.d.ts +8 -0
  62. package/dist/clock/hooks/use-wheel-scroll.svelte.d.ts +16 -0
  63. package/dist/clock/hooks/use-wheel-scroll.svelte.js +336 -0
  64. package/dist/clock/index.d.ts +10 -0
  65. package/dist/clock/index.js +10 -0
  66. package/dist/clock/index.parts.d.ts +4 -0
  67. package/dist/clock/index.parts.js +4 -0
  68. package/dist/clock/root/README.md +38 -0
  69. package/dist/clock/root/clock-root-test.svelte +62 -0
  70. package/dist/clock/root/clock-root-test.svelte.d.ts +14 -0
  71. package/dist/clock/root/clock-root.svelte +329 -0
  72. package/dist/clock/root/clock-root.svelte.d.ts +25 -0
  73. package/dist/clock/root/context.d.ts +22 -0
  74. package/dist/clock/root/context.js +15 -0
  75. package/dist/clock/root/resolve-visible-columns.d.ts +7 -0
  76. package/dist/clock/root/resolve-visible-columns.js +16 -0
  77. package/dist/clock/root/time-utils.d.ts +48 -0
  78. package/dist/clock/root/time-utils.js +314 -0
  79. package/dist/clock/root/wheel-options.d.ts +17 -0
  80. package/dist/clock/root/wheel-options.js +63 -0
  81. package/dist/clock/wheel-column/README.md +25 -0
  82. package/dist/clock/wheel-column/clock-wheel-column-bindable-test.svelte +16 -0
  83. package/dist/clock/wheel-column/clock-wheel-column-bindable-test.svelte.d.ts +3 -0
  84. package/dist/clock/wheel-column/clock-wheel-column-custom-snippet-test.svelte +29 -0
  85. package/dist/clock/wheel-column/clock-wheel-column-custom-snippet-test.svelte.d.ts +6 -0
  86. package/dist/clock/wheel-column/clock-wheel-column-default-height-test.svelte +11 -0
  87. package/dist/clock/wheel-column/clock-wheel-column-default-height-test.svelte.d.ts +3 -0
  88. package/dist/clock/wheel-column/clock-wheel-column-test.svelte +38 -0
  89. package/dist/clock/wheel-column/clock-wheel-column-test.svelte.d.ts +12 -0
  90. package/dist/clock/wheel-column/clock-wheel-column-tp-test.svelte +38 -0
  91. package/dist/clock/wheel-column/clock-wheel-column-tp-test.svelte.d.ts +12 -0
  92. package/dist/clock/wheel-column/clock-wheel-column-untagged-snippet-test.svelte +29 -0
  93. package/dist/clock/wheel-column/clock-wheel-column-untagged-snippet-test.svelte.d.ts +6 -0
  94. package/dist/clock/wheel-column/clock-wheel-column.svelte +499 -0
  95. package/dist/clock/wheel-column/clock-wheel-column.svelte.d.ts +17 -0
  96. package/dist/clock/wheel-item/README.md +17 -0
  97. package/dist/clock/wheel-item/clock-wheel-item.svelte +49 -0
  98. package/dist/clock/wheel-item/clock-wheel-item.svelte.d.ts +17 -0
  99. package/dist/combobox/README.md +8 -2
  100. package/dist/combobox/TODO.md +28 -175
  101. package/dist/combobox/button/README.md +8 -3
  102. package/dist/combobox/button/combobox-button-test.svelte +27 -0
  103. package/dist/combobox/button/combobox-button-test.svelte.d.ts +6 -0
  104. package/dist/combobox/button/combobox-button.svelte +10 -11
  105. package/dist/combobox/clear/README.md +21 -0
  106. package/dist/combobox/clear/combobox-clear-test.svelte +34 -0
  107. package/dist/combobox/clear/combobox-clear-test.svelte.d.ts +3 -0
  108. package/dist/combobox/clear/combobox-clear.svelte +61 -0
  109. package/dist/combobox/clear/combobox-clear.svelte.d.ts +9 -0
  110. package/dist/combobox/index.d.ts +5 -3
  111. package/dist/combobox/index.js +5 -3
  112. package/dist/combobox/index.parts.d.ts +2 -0
  113. package/dist/combobox/index.parts.js +2 -0
  114. package/dist/combobox/input/combobox-input.svelte +44 -12
  115. package/dist/combobox/item/combobox-item-implicit-text-test.svelte +1 -1
  116. package/dist/combobox/item/combobox-listboxitem.svelte +14 -11
  117. package/dist/combobox/item-indicator/combobox-item-indicator.svelte +4 -15
  118. package/dist/combobox/list/combobox-listbox.svelte +1 -0
  119. package/dist/combobox/list/combobox-listbox.svelte.d.ts +2 -1
  120. package/dist/combobox/popover/README.md +18 -4
  121. package/dist/combobox/popover/combobox-popover-props-test.svelte +38 -0
  122. package/dist/combobox/popover/combobox-popover-props-test.svelte.d.ts +11 -0
  123. package/dist/combobox/popover/combobox-popover.svelte +166 -23
  124. package/dist/combobox/popover/combobox-popover.svelte.d.ts +3 -3
  125. package/dist/combobox/popover/combobox-scrollable-list-test.svelte +23 -0
  126. package/dist/combobox/popover/combobox-scrollable-list-test.svelte.d.ts +18 -0
  127. package/dist/combobox/root/README.md +1 -0
  128. package/dist/combobox/root/combobox-multiselect-test.svelte +5 -3
  129. package/dist/combobox/root/combobox-multiselect-test.svelte.d.ts +1 -0
  130. package/dist/combobox/root/combobox-numeric-string-id-test.svelte +1 -1
  131. package/dist/combobox/root/combobox-test.svelte +23 -4
  132. package/dist/combobox/root/combobox-test.svelte.d.ts +2 -0
  133. package/dist/combobox/root/combobox.svelte +119 -13
  134. package/dist/combobox/root/combobox.svelte.d.ts +1 -0
  135. package/dist/combobox/root/context.d.ts +19 -1
  136. package/dist/combobox/tag-remove/combobox-tag-remove.svelte +3 -2
  137. package/dist/combobox/trigger/README.md +21 -0
  138. package/dist/combobox/trigger/combobox-trigger.svelte +56 -0
  139. package/dist/combobox/trigger/combobox-trigger.svelte.d.ts +9 -0
  140. package/dist/datepicker/README.md +100 -0
  141. package/dist/datepicker/TODO.md +28 -0
  142. package/dist/datepicker/calendar/README.md +19 -0
  143. package/dist/datepicker/calendar/date-picker-calendar-unsafe-props-test.svelte +60 -0
  144. package/dist/datepicker/calendar/date-picker-calendar-unsafe-props-test.svelte.d.ts +3 -0
  145. package/dist/datepicker/calendar/date-picker-calendar.svelte +65 -0
  146. package/dist/datepicker/calendar/date-picker-calendar.svelte.d.ts +10 -0
  147. package/dist/datepicker/index.d.ts +18 -0
  148. package/dist/datepicker/index.js +18 -0
  149. package/dist/datepicker/index.parts.d.ts +14 -0
  150. package/dist/datepicker/index.parts.js +14 -0
  151. package/dist/datepicker/input/README.md +15 -0
  152. package/dist/datepicker/input/date-picker-input.svelte +108 -0
  153. package/dist/datepicker/input/date-picker-input.svelte.d.ts +11 -0
  154. package/dist/datepicker/internal/strict-props.d.ts +2 -0
  155. package/dist/datepicker/internal/strict-props.js +28 -0
  156. package/dist/datepicker/popover/README.md +20 -0
  157. package/dist/datepicker/popover/date-picker-popover-handler-test.svelte +57 -0
  158. package/dist/datepicker/popover/date-picker-popover-handler-test.svelte.d.ts +3 -0
  159. package/dist/datepicker/popover/date-picker-popover-unsafe-props-test.svelte +45 -0
  160. package/dist/datepicker/popover/date-picker-popover-unsafe-props-test.svelte.d.ts +18 -0
  161. package/dist/datepicker/popover/date-picker-popover.svelte +87 -0
  162. package/dist/datepicker/popover/date-picker-popover.svelte.d.ts +7 -0
  163. package/dist/datepicker/root/README.md +38 -0
  164. package/dist/datepicker/root/context.d.ts +43 -0
  165. package/dist/datepicker/root/context.js +15 -0
  166. package/dist/datepicker/root/date-picker-bindable-empty-test.svelte +24 -0
  167. package/dist/datepicker/root/date-picker-bindable-empty-test.svelte.d.ts +3 -0
  168. package/dist/datepicker/root/date-picker-bindable-test.svelte +41 -0
  169. package/dist/datepicker/root/date-picker-bindable-test.svelte.d.ts +3 -0
  170. package/dist/datepicker/root/date-picker-empty-test.svelte +47 -0
  171. package/dist/datepicker/root/date-picker-empty-test.svelte.d.ts +3 -0
  172. package/dist/datepicker/root/date-picker-locale-typing-test.svelte +47 -0
  173. package/dist/datepicker/root/date-picker-locale-typing-test.svelte.d.ts +3 -0
  174. package/dist/datepicker/root/date-picker-open-cancel-test.svelte +54 -0
  175. package/dist/datepicker/root/date-picker-open-cancel-test.svelte.d.ts +8 -0
  176. package/dist/datepicker/root/date-picker-root.svelte +495 -0
  177. package/dist/datepicker/root/date-picker-root.svelte.d.ts +24 -0
  178. package/dist/datepicker/root/date-picker-test.svelte +86 -0
  179. package/dist/datepicker/root/date-picker-test.svelte.d.ts +13 -0
  180. package/dist/datepicker/root/date-utils.d.ts +17 -0
  181. package/dist/datepicker/root/date-utils.js +138 -0
  182. package/dist/datepicker/root/draft-evaluation.d.ts +13 -0
  183. package/dist/datepicker/root/draft-evaluation.js +56 -0
  184. package/dist/datepicker/root/focus-controller.d.ts +3 -0
  185. package/dist/datepicker/root/focus-controller.js +15 -0
  186. package/dist/datepicker/root/open-change.d.ts +5 -0
  187. package/dist/datepicker/root/open-change.js +13 -0
  188. package/dist/datepicker/root/open-controller.d.ts +7 -0
  189. package/dist/datepicker/root/open-controller.js +15 -0
  190. package/dist/datepicker/root/segment-controller.d.ts +8 -0
  191. package/dist/datepicker/root/segment-controller.js +53 -0
  192. package/dist/datepicker/root/segment-state.d.ts +18 -0
  193. package/dist/datepicker/root/segment-state.js +134 -0
  194. package/dist/datepicker/root/value-commit.d.ts +4 -0
  195. package/dist/datepicker/root/value-commit.js +8 -0
  196. package/dist/datepicker/segment/README.md +14 -0
  197. package/dist/datepicker/segment/date-picker-segment.svelte +319 -0
  198. package/dist/datepicker/segment/date-picker-segment.svelte.d.ts +9 -0
  199. package/dist/datepicker/trigger/README.md +14 -0
  200. package/dist/datepicker/trigger/date-picker-trigger.svelte +110 -0
  201. package/dist/datepicker/trigger/date-picker-trigger.svelte.d.ts +9 -0
  202. package/dist/dialog/content/dialog-content.svelte +6 -6
  203. package/dist/dialog/index.d.ts +3 -3
  204. package/dist/dialog/index.js +2 -2
  205. package/dist/dialog/root/context.d.ts +2 -1
  206. package/dist/dialog/root/dialog-root.svelte +9 -2
  207. package/dist/dialog/trigger/dialog-trigger.svelte +3 -0
  208. package/dist/hooks/use-virtual-focus.svelte.js +3 -1
  209. package/dist/index.d.ts +31 -17
  210. package/dist/index.js +31 -17
  211. package/dist/input/README.md +38 -0
  212. package/dist/input/TODO.md +12 -0
  213. package/dist/input/input-test.svelte +43 -0
  214. package/dist/input/input-test.svelte.d.ts +12 -0
  215. package/dist/input/input.svelte +151 -7
  216. package/dist/input/input.svelte.d.ts +8 -2
  217. package/dist/listbox/index.d.ts +3 -3
  218. package/dist/listbox/index.js +3 -3
  219. package/dist/listbox/item/README.md +2 -1
  220. package/dist/listbox/item/listbox-item.svelte +260 -6
  221. package/dist/listbox/item/listbox-item.svelte.d.ts +6 -0
  222. package/dist/listbox/root/context.d.ts +6 -0
  223. package/dist/listbox/root/context.js +23 -13
  224. package/dist/listbox/root/listbox-test.svelte +14 -2
  225. package/dist/listbox/root/listbox-test.svelte.d.ts +1 -0
  226. package/dist/listbox/root/listbox.svelte +49 -2
  227. package/dist/listbox/root/listbox.svelte.d.ts +4 -2
  228. package/dist/popover/README.md +10 -0
  229. package/dist/popover/content/README.md +11 -0
  230. package/dist/popover/content/popover-content-controlled-close-test.svelte +30 -0
  231. package/dist/popover/content/popover-content-controlled-close-test.svelte.d.ts +3 -0
  232. package/dist/popover/content/popover-content-standalone-test.svelte +28 -0
  233. package/dist/popover/content/popover-content-standalone-test.svelte.d.ts +6 -0
  234. package/dist/popover/content/popover-content-test.svelte +32 -2
  235. package/dist/popover/content/popover-content-test.svelte.d.ts +3 -1
  236. package/dist/popover/content/popover-content.svelte +315 -24
  237. package/dist/popover/content/popover-content.svelte.d.ts +5 -1
  238. package/dist/popover/index.d.ts +3 -3
  239. package/dist/popover/index.js +3 -5
  240. package/dist/popover/root/README.md +10 -15
  241. package/dist/popover/root/context.d.ts +16 -7
  242. package/dist/popover/root/context.js +0 -2
  243. package/dist/popover/root/focus-state.d.ts +4 -0
  244. package/dist/popover/root/focus-state.js +33 -0
  245. package/dist/popover/root/popover-root.svelte +90 -17
  246. package/dist/popover/root/popover-root.svelte.d.ts +2 -1
  247. package/dist/popover/root/popover-test.svelte +2 -1
  248. package/dist/popover/root/popover-test.svelte.d.ts +2 -1
  249. package/dist/popover/trigger/popover-trigger-button-root-test.svelte +17 -0
  250. package/dist/popover/trigger/popover-trigger-button-root-test.svelte.d.ts +18 -0
  251. package/dist/popover/trigger/popover-trigger-button.svelte +9 -7
  252. package/dist/popover/trigger/popover-trigger.svelte +17 -5
  253. package/dist/portal/portal.svelte +3 -1
  254. package/dist/primitives/click-outside.d.ts +1 -1
  255. package/dist/primitives/click-outside.js +1 -1
  256. package/dist/primitives/floating.js +12 -4
  257. package/dist/primitives/focus-trap.d.ts +7 -2
  258. package/dist/primitives/focus-trap.js +50 -17
  259. package/dist/primitives/index.d.ts +1 -0
  260. package/dist/primitives/index.js +1 -0
  261. package/dist/primitives/input-modality.d.ts +7 -0
  262. package/dist/primitives/input-modality.js +125 -0
  263. package/dist/primitives/keyboard-navigation.d.ts +1 -0
  264. package/dist/primitives/keyboard-navigation.js +17 -0
  265. package/dist/table/IMPLEMENTATION_NOTES.md +9 -0
  266. package/dist/table/PLAN-HIDDEN-COLUMNS.md +152 -0
  267. package/dist/table/PLAN.md +1336 -0
  268. package/dist/table/README.md +143 -0
  269. package/dist/table/SELECTION_CHECKBOX_PLAN.md +234 -0
  270. package/dist/table/TODO.md +138 -0
  271. package/dist/table/body/README.md +39 -0
  272. package/dist/table/body/table-body-items-test.svelte +45 -0
  273. package/dist/table/body/table-body-items-test.svelte.d.ts +18 -0
  274. package/dist/table/body/table-body.svelte +171 -0
  275. package/dist/table/body/table-body.svelte.d.ts +45 -0
  276. package/dist/table/cell/README.md +27 -0
  277. package/dist/table/cell/table-cell.svelte +253 -0
  278. package/dist/table/cell/table-cell.svelte.d.ts +4 -0
  279. package/dist/table/checkbox/README.md +40 -0
  280. package/dist/table/checkbox/table-checkbox-test.svelte +170 -0
  281. package/dist/table/checkbox/table-checkbox-test.svelte.d.ts +22 -0
  282. package/dist/table/checkbox/table-checkbox.svelte +235 -0
  283. package/dist/table/checkbox/table-checkbox.svelte.d.ts +4 -0
  284. package/dist/table/checkbox-indicator/README.md +31 -0
  285. package/dist/table/checkbox-indicator/table-checkbox-indicator.svelte +15 -0
  286. package/dist/table/checkbox-indicator/table-checkbox-indicator.svelte.d.ts +4 -0
  287. package/dist/table/column/README.md +36 -0
  288. package/dist/table/column/table-column.svelte +79 -0
  289. package/dist/table/column/table-column.svelte.d.ts +4 -0
  290. package/dist/table/column-header-cell/README.md +30 -0
  291. package/dist/table/column-header-cell/table-column-header-cell.svelte +271 -0
  292. package/dist/table/column-header-cell/table-column-header-cell.svelte.d.ts +4 -0
  293. package/dist/table/column-resizer/README.md +33 -0
  294. package/dist/table/column-resizer/table-column-resizer-fixed-width-test.svelte +57 -0
  295. package/dist/table/column-resizer/table-column-resizer-fixed-width-test.svelte.d.ts +3 -0
  296. package/dist/table/column-resizer/table-column-resizer-freeze-layout-test.svelte +52 -0
  297. package/dist/table/column-resizer/table-column-resizer-freeze-layout-test.svelte.d.ts +3 -0
  298. package/dist/table/column-resizer/table-column-resizer-narrow-min-width-test.svelte +76 -0
  299. package/dist/table/column-resizer/table-column-resizer-narrow-min-width-test.svelte.d.ts +3 -0
  300. package/dist/table/column-resizer/table-column-resizer-overflow-test.svelte +64 -0
  301. package/dist/table/column-resizer/table-column-resizer-overflow-test.svelte.d.ts +3 -0
  302. package/dist/table/column-resizer/table-column-resizer-padded-container-test.svelte +67 -0
  303. package/dist/table/column-resizer/table-column-resizer-padded-container-test.svelte.d.ts +3 -0
  304. package/dist/table/column-resizer/table-column-resizer-sandbox-overflow-test.svelte +87 -0
  305. package/dist/table/column-resizer/table-column-resizer-sandbox-overflow-test.svelte.d.ts +3 -0
  306. package/dist/table/column-resizer/table-column-resizer-selection-column-test.svelte +84 -0
  307. package/dist/table/column-resizer/table-column-resizer-selection-column-test.svelte.d.ts +3 -0
  308. package/dist/table/column-resizer/table-column-resizer-test.svelte +77 -0
  309. package/dist/table/column-resizer/table-column-resizer-test.svelte.d.ts +3 -0
  310. package/dist/table/column-resizer/table-column-resizer-three-column-relative-test.svelte +64 -0
  311. package/dist/table/column-resizer/table-column-resizer-three-column-relative-test.svelte.d.ts +3 -0
  312. package/dist/table/column-resizer/table-column-resizer.svelte +610 -0
  313. package/dist/table/column-resizer/table-column-resizer.svelte.d.ts +4 -0
  314. package/dist/table/empty-state/README.md +27 -0
  315. package/dist/table/empty-state/table-empty-state.svelte +33 -0
  316. package/dist/table/empty-state/table-empty-state.svelte.d.ts +4 -0
  317. package/dist/table/footer/README.md +26 -0
  318. package/dist/table/footer/table-footer.svelte +13 -0
  319. package/dist/table/footer/table-footer.svelte.d.ts +4 -0
  320. package/dist/table/header/README.md +26 -0
  321. package/dist/table/header/table-header.svelte +13 -0
  322. package/dist/table/header/table-header.svelte.d.ts +4 -0
  323. package/dist/table/index.d.ts +18 -0
  324. package/dist/table/index.js +17 -0
  325. package/dist/table/index.parts.d.ts +13 -0
  326. package/dist/table/index.parts.js +13 -0
  327. package/dist/table/root/README.md +66 -0
  328. package/dist/table/root/context.d.ts +233 -0
  329. package/dist/table/root/context.js +2153 -0
  330. package/dist/table/root/table-reorder-test.svelte +64 -0
  331. package/dist/table/root/table-reorder-test.svelte.d.ts +3 -0
  332. package/dist/table/root/table-root.svelte +561 -0
  333. package/dist/table/root/table-root.svelte.d.ts +4 -0
  334. package/dist/table/root/table-ssr-wrapper-column.svelte +48 -0
  335. package/dist/table/root/table-ssr-wrapper-column.svelte.d.ts +4 -0
  336. package/dist/table/root/table-ssr-wrapper-context.d.ts +11 -0
  337. package/dist/table/root/table-ssr-wrapper-context.js +13 -0
  338. package/dist/table/root/table-ssr-wrapper-test.svelte +57 -0
  339. package/dist/table/root/table-ssr-wrapper-test.svelte.d.ts +3 -0
  340. package/dist/table/root/table-test.svelte +206 -0
  341. package/dist/table/root/table-test.svelte.d.ts +29 -0
  342. package/dist/table/row/README.md +29 -0
  343. package/dist/table/row/table-row.svelte +244 -0
  344. package/dist/table/row/table-row.svelte.d.ts +4 -0
  345. package/dist/table/sort-trigger/README.md +45 -0
  346. package/dist/table/sort-trigger/table-sort-trigger.svelte +183 -0
  347. package/dist/table/sort-trigger/table-sort-trigger.svelte.d.ts +4 -0
  348. package/dist/table/types.d.ts +112 -0
  349. package/dist/table/types.js +1 -0
  350. package/dist/table/utils/handle-body-keydown.d.ts +13 -0
  351. package/dist/table/utils/handle-body-keydown.js +67 -0
  352. package/dist/table/utils/visually-hidden-style.d.ts +1 -0
  353. package/dist/table/utils/visually-hidden-style.js +1 -0
  354. package/dist/test-utils/focus-contract.d.ts +3 -0
  355. package/dist/test-utils/focus-contract.js +26 -0
  356. package/dist/timepicker/IMPLEMENTATION_PLAN.md +254 -0
  357. package/dist/timepicker/README.md +97 -0
  358. package/dist/timepicker/TODO.md +86 -0
  359. package/dist/timepicker/clock/README.md +14 -0
  360. package/dist/timepicker/clock/time-picker-clock-test.svelte +45 -0
  361. package/dist/timepicker/clock/time-picker-clock-test.svelte.d.ts +11 -0
  362. package/dist/timepicker/clock/time-picker-clock.svelte +65 -0
  363. package/dist/timepicker/clock/time-picker-clock.svelte.d.ts +10 -0
  364. package/dist/timepicker/index.d.ts +14 -0
  365. package/dist/timepicker/index.js +14 -0
  366. package/dist/timepicker/index.parts.d.ts +8 -0
  367. package/dist/timepicker/index.parts.js +8 -0
  368. package/dist/timepicker/input/README.md +15 -0
  369. package/dist/timepicker/input/time-picker-input-forwarding-test.svelte +40 -0
  370. package/dist/timepicker/input/time-picker-input-forwarding-test.svelte.d.ts +3 -0
  371. package/dist/timepicker/input/time-picker-input.svelte +109 -0
  372. package/dist/timepicker/input/time-picker-input.svelte.d.ts +11 -0
  373. package/dist/timepicker/internal/strict-props.d.ts +4 -0
  374. package/dist/timepicker/internal/strict-props.js +51 -0
  375. package/dist/timepicker/popover/README.md +20 -0
  376. package/dist/timepicker/popover/time-picker-popover-unsafe-props-test.svelte +22 -0
  377. package/dist/timepicker/popover/time-picker-popover-unsafe-props-test.svelte.d.ts +3 -0
  378. package/dist/timepicker/popover/time-picker-popover.svelte +89 -0
  379. package/dist/timepicker/popover/time-picker-popover.svelte.d.ts +7 -0
  380. package/dist/timepicker/root/README.md +42 -0
  381. package/dist/timepicker/root/context.d.ts +51 -0
  382. package/dist/timepicker/root/context.js +15 -0
  383. package/dist/timepicker/root/time-picker-12h-test.svelte +22 -0
  384. package/dist/timepicker/root/time-picker-12h-test.svelte.d.ts +3 -0
  385. package/dist/timepicker/root/time-picker-bindable-test.svelte +25 -0
  386. package/dist/timepicker/root/time-picker-bindable-test.svelte.d.ts +3 -0
  387. package/dist/timepicker/root/time-picker-empty-test.svelte +20 -0
  388. package/dist/timepicker/root/time-picker-empty-test.svelte.d.ts +3 -0
  389. package/dist/timepicker/root/time-picker-root.svelte +625 -0
  390. package/dist/timepicker/root/time-picker-root.svelte.d.ts +28 -0
  391. package/dist/timepicker/root/time-picker-test.svelte +72 -0
  392. package/dist/timepicker/root/time-picker-test.svelte.d.ts +15 -0
  393. package/dist/timepicker/root/time-utils.d.ts +1 -0
  394. package/dist/timepicker/root/time-utils.js +3 -0
  395. package/dist/timepicker/segment/README.md +14 -0
  396. package/dist/timepicker/segment/time-picker-segment.svelte +365 -0
  397. package/dist/timepicker/segment/time-picker-segment.svelte.d.ts +9 -0
  398. package/dist/timepicker/trigger/README.md +14 -0
  399. package/dist/timepicker/trigger/time-picker-trigger-forwarding-test.svelte +35 -0
  400. package/dist/timepicker/trigger/time-picker-trigger-forwarding-test.svelte.d.ts +3 -0
  401. package/dist/timepicker/trigger/time-picker-trigger.svelte +122 -0
  402. package/dist/timepicker/trigger/time-picker-trigger.svelte.d.ts +9 -0
  403. package/dist/utils/date-only.d.ts +11 -0
  404. package/dist/utils/date-only.js +53 -0
  405. package/dist/utils/index.d.ts +1 -0
  406. package/dist/utils/index.js +1 -0
  407. package/package.json +33 -2
@@ -1,175 +1,28 @@
1
- # ComboBox - Code Review & TODOs
2
-
3
- Comprehensive review based on: **Accessibility**, **Scalability**, **Performance**, **Svelte 5 Runes Best Practices**.
4
-
5
- ---
6
-
7
- ## Accessibility
8
-
9
- ### Completed (Accessibility)
10
-
11
- - [x] ARIA pattern: `aria-activedescendant` for virtual focus
12
- - [x] `aria-expanded`, `aria-haspopup`, `aria-controls` on input
13
- - [x] `aria-label` on ListBox
14
- - [x] `role="combobox"`, `role="listbox"`, `role="option"`
15
- - [x] `aria-selected` on selected items
16
- - [x] `aria-disabled` on disabled items/placeholder
17
- - [x] Input supports `aria-label` and `aria-labelledby` props
18
- - [x] ListBox has an ID so `aria-controls` works correctly
19
- - [x] Button has `aria-controls` pointing to the listbox
20
- - [x] Wrapper group supports `aria-label` and `aria-labelledby`
21
- - [x] Input supports `aria-describedby` for usage instructions
22
-
23
- ### Pending (Accessibility)
24
-
25
- - [ ] **Live regions for result count**
26
- - Add `<div aria-live="polite">` to announce "{N} results available" while filtering
27
- - Important for screen readers that cannot see visual updates
28
-
29
- - [ ] **Selection announcement**
30
- - Announce "Selected item: {label}" when an item is selected
31
- - Use `aria-live="assertive"` for important changes
32
-
33
- - [ ] **Support for groups (sections)**
34
- - Implement `role="group"` with `aria-labelledby` for sections
35
- - Add `ComboBox.Section` component
36
-
37
- ---
38
-
39
- ## Scalability
40
-
41
- ### Completed (Scalability)
42
-
43
- - [x] Reusable `useVirtualFocus` hook
44
- - [x] Controlled/uncontrolled mode
45
- - [x] Automatic item filtering
46
- - [x] Reactive `emptyPlaceholder`
47
-
48
- ### Pending (Scalability)
49
-
50
- - [ ] **Customizable `filterFn` prop**
51
- - Filtering is currently case-insensitive includes
52
- - Allow: fuzzy search, startsWith, exact match, async search
53
-
54
- - [ ] **`allowCreate` prop**
55
- - Allow creating new items when there is no match
56
- - Callback `onCreate?: (value: string) => void`
57
-
58
- - [x] **Multiple selection UI**
59
- - Chips/tags for selected items: `ComboBox.Tags`, `ComboBox.Tag`, `ComboBox.TagRemove`
60
- - Clear-all button (available via `clearSelection()` in context)
61
- - Selected-count indicator (available via `selectedValue.size`)
62
- - Keyboard tag navigation (ArrowLeft/Right, Delete/Backspace)
63
- - `ComboBox.ItemIndicator` to show checks for selected items
64
-
65
- - [ ] **Form integration**
66
- - `name` prop for native `<form>`
67
- - Hidden input with serialized value
68
- - Validation with `required`, `aria-invalid`
69
-
70
- - [ ] **Async data support**
71
- - Props: `isLoading`, `loadingPlaceholder`
72
- - Callback: `onLoadMore` for infinite scroll
73
- - Built-in debounce for async search
74
-
75
- - [ ] **Virtualization**
76
- - For large lists (>100 items)
77
- - Integrate with `@tanstack/virtual` or similar
78
-
79
- ---
80
-
81
- ## Performance
82
-
83
- ### Completed (Performance)
84
-
85
- - [x] DOM query cache with invalidation (`cachedItemOrder`)
86
- - [x] `untrack()` to avoid infinite effect loops
87
- - [x] Subscription pattern for reactive `itemCount`
88
- - [x] Scoped queries via `containerRef`
89
-
90
- ### Pending (Performance)
91
-
92
- - [ ] **`isVisible` memoization in ListBoxItem**
93
- - It is currently recomputed on each render
94
- - Consider more granular memoization with `$derived`
95
-
96
- - [ ] **Batch registration**
97
- - `registerItem` runs once per individual item
98
- - For large lists, consider batched notifications
99
-
100
- - [ ] **Lazy `itemLabels`**
101
- - The `itemLabels` map grows with each item
102
- - Cleanup on unmount is implemented, but consider `WeakMap`
103
-
104
- - [ ] **Effect cleanup optimizations**
105
- - Review effects that could be consolidated
106
- - `combobox-listboxitem.svelte` has 2 effects that might become 1
107
-
108
- ---
109
-
110
- ## Svelte 5 Runes Best Practices
111
-
112
- ### Completed (Runes)
113
-
114
- - [x] `$state` for reactive state
115
- - [x] `$derived` for computed values
116
- - [x] `$effect` with cleanup functions
117
- - [x] `$bindable` for two-way binding
118
- - [x] `$props()` for destructuring
119
- - [x] `untrack()` to avoid unnecessary re-runs
120
- - [x] `$derived(expression)` instead of `$derived(() => ...)` - simplified in `combobox-listboxitem.svelte`
121
- - [x] Consolidated effects - using 1 `$effect` + `onDestroy` instead of 2 effects
122
-
123
- ### Reviewed - No Changes Required
124
-
125
- - [x] **`$effect.pre`**: Reviewed - no race conditions requiring it
126
- - [x] **Context typing**: Single shared type is appropriate - tree-shaking does not apply to context objects
127
-
128
- ---
129
-
130
- ## Testing
131
-
132
- ### Completed (Testing)
133
-
134
- - [x] 291 passing unit tests
135
- - [x] Keyboard navigation tests
136
- - [x] Selection tests
137
- - [x] Filtering tests
138
- - [x] Empty placeholder tests
139
- - [x] ARIA accessibility tests (6 tests)
140
- - [x] Edge cases: rapid typing, whitespace, backspace
141
- - [x] Disabled/ReadOnly state tests
142
- - [x] Trigger modes (focus, input, manual)
143
- - [x] Selection behavior (Enter, click, Escape restoration)
144
- - [x] Multi-select tests (12 tests)
145
- - [x] Tags component tests (4 tests)
146
- - [x] Tag component tests (13 tests) - includes keyboard navigation
147
- - [x] TagRemove component tests (6 tests)
148
- - [x] ItemIndicator component tests (5 tests)
149
-
150
- ### Pending (Testing)
151
-
152
- - [ ] **Tests with many items (100+)** - performance tests
153
- - [ ] **Visual regression tests** - state screenshots
154
-
155
- ---
156
-
157
- ## Documentation
158
-
159
- - [ ] **Complete JSDoc**
160
- - Document all public props
161
- - Add usage examples in comments
162
-
163
- - [ ] **Storybook/Demo page**
164
- - Interactive examples for all use cases
165
- - States: loading, error, disabled, readonly
166
-
167
- ---
168
-
169
- ## Prioritized Next Steps
170
-
171
- 1. **Live regions** (accessibility - high impact)
172
- 2. **Form integration** (usability - common cases)
173
- 3. **Customizable `filterFn`** (scalability)
174
- 4. **Consolidate effects** (performance/best practices)
175
- 5. **Async data support** (scalability)
1
+ # Combobox TODO
2
+
3
+ ## Goal
4
+
5
+ Track Combobox work with a single mandatory TODO format.
6
+
7
+ ## Backlog
8
+
9
+ - [x] [M][P0][Area: Architecture][Owner: Unassigned][Target: Done] Build base component parts (`root`, `input`, `list`, `item`).
10
+ - [x] [M][P0][Area: State][Owner: Unassigned][Target: Done] Implement open/close state management on root.
11
+ - [x] [M][P0][Area: Filtering][Owner: Unassigned][Target: Done] Support filtering items by input value.
12
+ - [x] [M][P0][Area: Selection][Owner: Unassigned][Target: Done] Implement item selection and emit `onSelectionChange`.
13
+ - [x] [M][P0][Area: Accessibility][Owner: Unassigned][Target: Done] Add keyboard navigation and ARIA combobox/listbox semantics.
14
+ - [x] [M][P0][Area: Interaction][Owner: Unassigned][Target: Done] Handle outside click and blur to close list.
15
+ - [x] [M][P0][Area: States][Owner: Unassigned][Target: Done] Support disabled state for root and items.
16
+ - [x] [M][P0][Area: Testing][Owner: Unassigned][Target: Done] Add baseline browser tests for open/filter/select behavior.
17
+ - [x] [S][P1][Area: API][Owner: Unassigned][Target: Done] Support controlled/uncontrolled selected value.
18
+ - [x] [M][P0][Area: Selection][Owner: Unassigned][Target: Done] Implement `supportsMultiple` mode with chips and remove action.
19
+ - [x] [M][P0][Area: Data Model][Owner: Unassigned][Target: Done] Support rich object values and hidden input synchronization.
20
+ - [x] [M][P0][Area: UX][Owner: Unassigned][Target: Done] Support loading, empty, and custom-value flows.
21
+ - [x] [M][P0][Area: Focus][Owner: Unassigned][Target: Done] Align focus-visible behavior with shared input modality primitive.
22
+ - [ ] [S][P1][Area: Data Source][Owner: Unassigned][Target: TBD] Add async item provider API (debounced remote filtering).
23
+ - [ ] [S][P1][Area: Data Model][Owner: Unassigned][Target: TBD] Add grouped items with section headers.
24
+ - [ ] [S][P1][Area: Performance][Owner: Unassigned][Target: TBD] Add optional virtualization for large datasets.
25
+ - [ ] [S][P1][Area: Interaction][Owner: Unassigned][Target: TBD] Add option to commit free-text value on blur.
26
+ - [ ] [S][P1][Area: API][Owner: Unassigned][Target: TBD] Add imperative focus/open API for advanced integrations.
27
+ - [ ] [C][P2][Area: UX][Owner: Unassigned][Target: TBD] Add built-in highlighting helper for matched text.
28
+ - [ ] [C][P2][Area: Performance][Owner: Unassigned][Target: TBD] Add benchmark tests for filtering and keyboard navigation.
@@ -5,11 +5,16 @@
5
5
  ### ComboBox.Button
6
6
 
7
7
  Name: `ComboBox.Button`
8
- Description: Optional trigger button that toggles the combobox popover without stealing focus from the input.
8
+ Description: Compatibility alias for `ComboBox.Trigger`.
9
9
 
10
10
  | Prop | Type | Default | Description |
11
11
  | -------------- | ---------------------- | ----------- | --------------------------------------------------------------- |
12
- | `class` | `string` | `undefined` | CSS class names for the button element. |
12
+ | `class` | `string` | `undefined` | CSS class names for the trigger element. |
13
13
  | `children` | `Snippet` | `undefined` | Custom trigger content. If omitted, a chevron icon is rendered. |
14
- | `tabindex` | `number` | `-1` | Tab index applied to the button. |
14
+ | `tabindex` | `number` | `-1` | Tab index applied to the trigger button. |
15
15
  | `...restProps` | `HTMLButtonAttributes` | `-` | Additional native button attributes. |
16
+
17
+ ## Notes
18
+
19
+ - Prefer `ComboBox.Trigger` in new code.
20
+ - `ComboBox.Button` forwards all props and behavior to `ComboBox.Trigger`.
@@ -0,0 +1,27 @@
1
+ <script lang="ts">
2
+ import ComboBox from '../index.js';
3
+
4
+ type Props = {
5
+ isPending?: boolean;
6
+ };
7
+
8
+ let { isPending = false }: Props = $props();
9
+
10
+ const countries = [
11
+ { id: 'ar', name: 'Argentina' },
12
+ { id: 'br', name: 'Brazil' }
13
+ ];
14
+ </script>
15
+
16
+ <ComboBox.Root {isPending}>
17
+ <ComboBox.Input placeholder="Search countries..." />
18
+ <ComboBox.Button />
19
+
20
+ <ComboBox.Popover>
21
+ <ComboBox.List emptyPlaceholder="No countries found">
22
+ {#each countries as country (country.id)}
23
+ <ComboBox.Item id={country.id} textValue={country.name}>{country.name}</ComboBox.Item>
24
+ {/each}
25
+ </ComboBox.List>
26
+ </ComboBox.Popover>
27
+ </ComboBox.Root>
@@ -0,0 +1,6 @@
1
+ type Props = {
2
+ isPending?: boolean;
3
+ };
4
+ declare const ComboboxButtonTest: import("svelte").Component<Props, {}, "">;
5
+ type ComboboxButtonTest = ReturnType<typeof ComboboxButtonTest>;
6
+ export default ComboboxButtonTest;
@@ -1,6 +1,7 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from 'svelte';
3
3
  import type { HTMLButtonAttributes } from 'svelte/elements';
4
+ import { ButtonRoot } from '../../button/index.js';
4
5
  import { useComboBoxContext } from '../root/context';
5
6
 
6
7
  type ComboBoxButtonProps = HTMLButtonAttributes & {
@@ -11,27 +12,25 @@
11
12
  let { class: className, children, tabindex = -1, ...restProps }: ComboBoxButtonProps = $props();
12
13
 
13
14
  const ctx = useComboBoxContext();
15
+ const isButtonDisabled = $derived(ctx.isDisabled || ctx.isReadOnly || ctx.isPending);
14
16
 
15
- // Use onmousedown with preventDefault to prevent blur from firing
16
- // before the toggle. This prevents the race condition where:
17
- // 1. Click button -> blur fires -> popover closes
18
- // 2. Then onclick fires -> popover opens again
19
- function handleMouseDown(e: MouseEvent) {
20
- e.preventDefault();
21
- if (!ctx.isDisabled && !ctx.isReadOnly) {
17
+ function handleMouseDown(event: MouseEvent) {
18
+ event.preventDefault();
19
+ if (!isButtonDisabled) {
22
20
  ctx.toggle();
23
21
  }
24
22
  }
25
23
  </script>
26
24
 
27
- <button
25
+ <ButtonRoot
28
26
  type="button"
29
27
  {tabindex}
30
28
  aria-label={ctx.isOpen ? 'Close menu' : 'Open menu'}
31
29
  aria-expanded={ctx.isOpen}
32
30
  aria-controls={`combobox-listbox-${ctx.instanceId}`}
33
- disabled={ctx.isDisabled}
34
- data-pressed={ctx.isOpen}
31
+ isDisabled={ctx.isDisabled || ctx.isReadOnly}
32
+ isPending={ctx.isPending}
33
+ pressed={ctx.isOpen}
35
34
  onmousedown={handleMouseDown}
36
35
  class={className}
37
36
  {...restProps}
@@ -54,4 +53,4 @@
54
53
  <path d="m6 9 6 6 6-6" />
55
54
  </svg>
56
55
  {/if}
57
- </button>
56
+ </ButtonRoot>
@@ -0,0 +1,21 @@
1
+ # ComboBox Clear
2
+
3
+ ## API reference
4
+
5
+ ### ComboBox.Clear
6
+
7
+ Name: `ComboBox.Clear`
8
+ Description: Optional clear button that resets the input value and clears the current selection without stealing focus from the input.
9
+
10
+ | Prop | Type | Default | Description |
11
+ | -------------- | ---------------------- | ----------- | ---------------------------------------------------------- |
12
+ | `class` | `string` | `undefined` | CSS class names for the clear element. |
13
+ | `children` | `Snippet` | `undefined` | Custom clear content. If omitted, an “x” icon is rendered. |
14
+ | `tabindex` | `number` | `-1` | Tab index applied to the clear button. |
15
+ | `...restProps` | `HTMLButtonAttributes` | `-` | Additional native button attributes. |
16
+
17
+ ## Notes
18
+
19
+ - `ComboBox.Clear` clears both the visible input text and the selected value(s).
20
+ - The clear button is disabled when there is nothing to clear, or when the combobox is disabled, read-only, or pending.
21
+ - Clicking the clear button keeps focus on the combobox input.
@@ -0,0 +1,34 @@
1
+ <script lang="ts">
2
+ import ComboBox from '../index.js';
3
+
4
+ let value = $state<string | number | undefined>('ar');
5
+ let inputValue = $state('Argentina');
6
+ let isPending = $state(false);
7
+
8
+ const countries = [
9
+ { id: 'ar', name: 'Argentina' },
10
+ { id: 'br', name: 'Brazil' },
11
+ { id: 'ca', name: 'Canada' }
12
+ ];
13
+ </script>
14
+
15
+ <ComboBox.Root bind:value bind:inputValue {isPending}>
16
+ <div class="flex gap-1">
17
+ <ComboBox.Input placeholder="Search countries..." />
18
+ <ComboBox.Clear />
19
+ <ComboBox.Trigger />
20
+ </div>
21
+
22
+ <ComboBox.Popover>
23
+ <ComboBox.List emptyPlaceholder="No countries found">
24
+ {#each countries as country (country.id)}
25
+ <ComboBox.Item id={country.id} textValue={country.name}>{country.name}</ComboBox.Item>
26
+ {/each}
27
+ </ComboBox.List>
28
+ </ComboBox.Popover>
29
+ </ComboBox.Root>
30
+
31
+ <button type="button" data-set-pending onclick={() => (isPending = true)}>Set pending</button>
32
+ <button type="button" data-clear-pending onclick={() => (isPending = false)}>Clear pending</button>
33
+ <output data-selected-value>{value === undefined ? 'undefined' : String(value)}</output>
34
+ <output data-input-value>{inputValue}</output>
@@ -0,0 +1,3 @@
1
+ declare const ComboboxClearTest: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type ComboboxClearTest = ReturnType<typeof ComboboxClearTest>;
3
+ export default ComboboxClearTest;
@@ -0,0 +1,61 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import type { HTMLButtonAttributes } from 'svelte/elements';
4
+ import { ButtonRoot } from '../../button/index.js';
5
+ import { useComboBoxContext } from '../root/context';
6
+
7
+ type ComboBoxClearProps = HTMLButtonAttributes & {
8
+ class?: string;
9
+ children?: Snippet;
10
+ };
11
+
12
+ let { class: className, children, tabindex = -1, ...restProps }: ComboBoxClearProps = $props();
13
+
14
+ const ctx = useComboBoxContext();
15
+ const hasContent = $derived(ctx.displayValue.trim().length > 0 || ctx.selectedValue.size > 0);
16
+ const isClearDisabled = $derived(
17
+ ctx.isDisabled || ctx.isReadOnly || ctx.isPending || !hasContent
18
+ );
19
+ const ariaLabel = $derived(ctx.selectedValue.size > 0 ? 'Clear selection' : 'Clear input');
20
+
21
+ function handleMouseDown(event: MouseEvent) {
22
+ event.preventDefault();
23
+ }
24
+
25
+ function handleClick() {
26
+ if (isClearDisabled) return;
27
+ ctx.clearSelection();
28
+ ctx.inputRef?.focus();
29
+ }
30
+ </script>
31
+
32
+ <ButtonRoot
33
+ type="button"
34
+ {tabindex}
35
+ aria-label={ariaLabel}
36
+ isDisabled={ctx.isDisabled || ctx.isReadOnly || !hasContent}
37
+ isPending={ctx.isPending}
38
+ onmousedown={handleMouseDown}
39
+ onclick={handleClick}
40
+ class={className}
41
+ {...restProps}
42
+ >
43
+ {#if children}
44
+ {@render children()}
45
+ {:else}
46
+ <svg
47
+ xmlns="http://www.w3.org/2000/svg"
48
+ width="16"
49
+ height="16"
50
+ viewBox="0 0 24 24"
51
+ fill="none"
52
+ stroke="currentColor"
53
+ stroke-width="2"
54
+ stroke-linecap="round"
55
+ stroke-linejoin="round"
56
+ >
57
+ <path d="M18 6 6 18" />
58
+ <path d="m6 6 12 12" />
59
+ </svg>
60
+ {/if}
61
+ </ButtonRoot>
@@ -0,0 +1,9 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { HTMLButtonAttributes } from 'svelte/elements';
3
+ type ComboBoxClearProps = HTMLButtonAttributes & {
4
+ class?: string;
5
+ children?: Snippet;
6
+ };
7
+ declare const ComboboxClear: import("svelte").Component<ComboBoxClearProps, {}, "">;
8
+ type ComboboxClear = ReturnType<typeof ComboboxClear>;
9
+ export default ComboboxClear;
@@ -1,7 +1,9 @@
1
- export * as ComboBox from './index.parts.ts';
1
+ export * as ComboBox from './index.parts.js';
2
2
  export { default as ComboBoxRoot } from './root/combobox.svelte';
3
3
  export { default as ComboBoxInput } from './input/combobox-input.svelte';
4
+ export { default as ComboBoxTrigger } from './trigger/combobox-trigger.svelte';
4
5
  export { default as ComboBoxButton } from './button/combobox-button.svelte';
6
+ export { default as ComboBoxClear } from './clear/combobox-clear.svelte';
5
7
  export { default as ComboBoxPopover } from './popover/combobox-popover.svelte';
6
8
  export { default as ComboBoxList } from './list/combobox-listbox.svelte';
7
9
  export { default as ComboBoxItem } from './item/combobox-listboxitem.svelte';
@@ -9,6 +11,6 @@ export { default as ComboBoxItemIndicator } from './item-indicator/combobox-item
9
11
  export { default as ComboBoxTags } from './tags/combobox-tags.svelte';
10
12
  export { default as ComboBoxTag } from './tag/combobox-tag.svelte';
11
13
  export { default as ComboBoxTagRemove } from './tag-remove/combobox-tag-remove.svelte';
12
- export { getComboBoxContext, setComboBoxContext, useComboBoxContext, type ComboBoxContext } from './root/context.ts';
13
- import * as ComboBoxParts from './index.parts.ts';
14
+ export { getComboBoxContext, setComboBoxContext, useComboBoxContext, type ComboBoxContext } from './root/context.js';
15
+ import * as ComboBoxParts from './index.parts.js';
14
16
  export default ComboBoxParts;
@@ -1,9 +1,11 @@
1
1
  // Namespace export for component composition: <ComboBox.Root>, <ComboBox.Input>, etc.
2
- export * as ComboBox from './index.parts.ts';
2
+ export * as ComboBox from './index.parts.js';
3
3
  // Direct named exports for individual imports
4
4
  export { default as ComboBoxRoot } from './root/combobox.svelte';
5
5
  export { default as ComboBoxInput } from './input/combobox-input.svelte';
6
+ export { default as ComboBoxTrigger } from './trigger/combobox-trigger.svelte';
6
7
  export { default as ComboBoxButton } from './button/combobox-button.svelte';
8
+ export { default as ComboBoxClear } from './clear/combobox-clear.svelte';
7
9
  export { default as ComboBoxPopover } from './popover/combobox-popover.svelte';
8
10
  export { default as ComboBoxList } from './list/combobox-listbox.svelte';
9
11
  export { default as ComboBoxItem } from './item/combobox-listboxitem.svelte';
@@ -12,7 +14,7 @@ export { default as ComboBoxTags } from './tags/combobox-tags.svelte';
12
14
  export { default as ComboBoxTag } from './tag/combobox-tag.svelte';
13
15
  export { default as ComboBoxTagRemove } from './tag-remove/combobox-tag-remove.svelte';
14
16
  // Context and types
15
- export { getComboBoxContext, setComboBoxContext, useComboBoxContext } from './root/context.ts';
17
+ export { getComboBoxContext, setComboBoxContext, useComboBoxContext } from './root/context.js';
16
18
  // Default export as namespace object
17
- import * as ComboBoxParts from './index.parts.ts';
19
+ import * as ComboBoxParts from './index.parts.js';
18
20
  export default ComboBoxParts;
@@ -1,6 +1,8 @@
1
1
  export { default as Root } from './root/combobox.svelte';
2
2
  export { default as Input } from './input/combobox-input.svelte';
3
+ export { default as Trigger } from './trigger/combobox-trigger.svelte';
3
4
  export { default as Button } from './button/combobox-button.svelte';
5
+ export { default as Clear } from './clear/combobox-clear.svelte';
4
6
  export { default as Popover } from './popover/combobox-popover.svelte';
5
7
  export { default as List } from './list/combobox-listbox.svelte';
6
8
  export { default as Item } from './item/combobox-listboxitem.svelte';
@@ -1,7 +1,9 @@
1
1
  // Short alias exports for namespace usage: ComboBox.Root, ComboBox.Input, etc.
2
2
  export { default as Root } from './root/combobox.svelte';
3
3
  export { default as Input } from './input/combobox-input.svelte';
4
+ export { default as Trigger } from './trigger/combobox-trigger.svelte';
4
5
  export { default as Button } from './button/combobox-button.svelte';
6
+ export { default as Clear } from './clear/combobox-clear.svelte';
5
7
  export { default as Popover } from './popover/combobox-popover.svelte';
6
8
  export { default as List } from './list/combobox-listbox.svelte';
7
9
  export { default as Item } from './item/combobox-listboxitem.svelte';
@@ -1,6 +1,11 @@
1
1
  <script lang="ts">
2
2
  import type { HTMLInputAttributes } from 'svelte/elements';
3
+ import { Input } from '../../input';
3
4
  import { useComboBoxContext } from '../root/context';
5
+ import {
6
+ shouldShowFocusVisible,
7
+ trackInteractionModality
8
+ } from '../../primitives/input-modality';
4
9
  import { cn } from '../../utils/cn';
5
10
 
6
11
  type ComboBoxInputProps = HTMLInputAttributes & {
@@ -13,11 +18,26 @@
13
18
  class?: string;
14
19
  };
15
20
 
21
+ function composeEventHandlers<TEvent extends Event>(
22
+ internalHandler: ((event: TEvent) => void) | undefined,
23
+ externalHandler: ((event: TEvent) => void) | undefined
24
+ ): (event: TEvent) => void {
25
+ return (event: TEvent) => {
26
+ internalHandler?.(event);
27
+ externalHandler?.(event);
28
+ };
29
+ }
30
+
16
31
  let {
17
32
  'aria-label': ariaLabel,
18
33
  'aria-labelledby': ariaLabelledby,
19
34
  'aria-describedby': ariaDescribedby,
20
35
  class: className,
36
+ oninput: onInputExternal,
37
+ onfocus: onFocusExternal,
38
+ onmousedown: onMouseDownExternal,
39
+ onblur: onBlurExternal,
40
+ onkeydown: onKeyDownExternal,
21
41
  ...restProps
22
42
  }: ComboBoxInputProps = $props();
23
43
 
@@ -42,6 +62,8 @@
42
62
  }
43
63
 
44
64
  function handleFocus() {
65
+ ctx.setFocusVisible(shouldShowFocusVisible(inputRef));
66
+
45
67
  // Open on focus if trigger is 'focus'
46
68
  // Use a small delay to avoid opening immediately on programmatic focus
47
69
  // (e.g., from a focus trap). This gives time for refs to be set up.
@@ -54,7 +76,9 @@
54
76
  }
55
77
  }
56
78
 
57
- function handleMouseDown() {
79
+ function handleMouseDown(event: MouseEvent) {
80
+ trackInteractionModality(event, inputRef);
81
+ ctx.setFocusVisible(false);
58
82
  ctx.setFocusedTagId(null);
59
83
  // Open on press if trigger is 'press'
60
84
  if (ctx.trigger === 'press' && !ctx.isOpen && !ctx.isDisabled && !ctx.isReadOnly) {
@@ -62,14 +86,21 @@
62
86
  }
63
87
  }
64
88
 
65
- function handleBlur() {
89
+ function handleKeyDown(event: KeyboardEvent) {
90
+ trackInteractionModality(event, inputRef);
91
+ ctx.setFocusVisible(shouldShowFocusVisible(inputRef));
92
+ ctx.handleKeydown(event);
93
+ }
94
+
95
+ function handleBlur(event: FocusEvent) {
96
+ ctx.setFocusVisible(false);
66
97
  // Restore selection label or deselect if empty
67
- ctx.handleInputBlur();
98
+ ctx.handleInputBlur(event);
68
99
  }
69
100
  </script>
70
101
 
71
- <input
72
- bind:this={inputRef}
102
+ <Input
103
+ bind:element={inputRef}
73
104
  type="text"
74
105
  role="combobox"
75
106
  aria-autocomplete="list"
@@ -82,14 +113,15 @@
82
113
  aria-label={ariaLabel}
83
114
  aria-labelledby={ariaLabelledby}
84
115
  aria-describedby={ariaDescribedby}
116
+ autocomplete="off"
85
117
  value={ctx.displayValue}
86
- disabled={ctx.isDisabled}
87
- readonly={ctx.isReadOnly}
88
- oninput={handleInput}
89
- onfocus={handleFocus}
90
- onmousedown={handleMouseDown}
91
- onblur={handleBlur}
92
- onkeydown={ctx.handleKeydown}
118
+ isDisabled={ctx.isDisabled}
119
+ isReadOnly={ctx.isReadOnly}
120
+ oninput={composeEventHandlers(handleInput, onInputExternal ?? undefined)}
121
+ onfocus={composeEventHandlers(handleFocus, onFocusExternal ?? undefined)}
122
+ onmousedown={composeEventHandlers(handleMouseDown, onMouseDownExternal ?? undefined)}
123
+ onblur={composeEventHandlers(handleBlur, onBlurExternal ?? undefined)}
124
+ onkeydown={composeEventHandlers(handleKeyDown, onKeyDownExternal ?? undefined)}
93
125
  class={cn(
94
126
  'bg-depth-2 sunken placeholder:text-muted-foreground hover:bg-depth-1 focus:ring-border h-8 w-full rounded-xs border px-2 text-sm shadow-xs transition-all ease-out outline-none focus:ring focus:ring-offset-1 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50',
95
127
  className
@@ -6,7 +6,7 @@
6
6
 
7
7
  <ComboBox.Root bind:value={selected}>
8
8
  <ComboBox.Input placeholder="Search countries..." />
9
- <ComboBox.Button />
9
+ <ComboBox.Trigger />
10
10
 
11
11
  <ComboBox.Popover>
12
12
  <ComboBox.List emptyPlaceholder="No countries found">