@human-kit/svelte-components 1.0.0-alpha.1 → 1.0.0-alpha.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 (427) 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 +362 -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 +66 -0
  15. package/dist/calendar/TODO.md +23 -0
  16. package/dist/calendar/body-cell/README.md +15 -0
  17. package/dist/calendar/body-cell/calendar-body-cell.svelte +230 -0
  18. package/dist/calendar/body-cell/calendar-body-cell.svelte.d.ts +9 -0
  19. package/dist/calendar/grid/README.md +13 -0
  20. package/dist/calendar/grid/calendar-grid-month-scope.svelte +16 -0
  21. package/dist/calendar/grid/calendar-grid-month-scope.svelte.d.ts +8 -0
  22. package/dist/calendar/grid/calendar-grid.svelte +45 -0
  23. package/dist/calendar/grid/calendar-grid.svelte.d.ts +8 -0
  24. package/dist/calendar/grid/month-scope.d.ts +2 -0
  25. package/dist/calendar/grid/month-scope.js +8 -0
  26. package/dist/calendar/grid-body/README.md +13 -0
  27. package/dist/calendar/grid-body/calendar-grid-body-custom-test.svelte +13 -0
  28. package/dist/calendar/grid-body/calendar-grid-body-custom-test.svelte.d.ts +18 -0
  29. package/dist/calendar/grid-body/calendar-grid-body.svelte +36 -0
  30. package/dist/calendar/grid-body/calendar-grid-body.svelte.d.ts +8 -0
  31. package/dist/calendar/grid-header/README.md +13 -0
  32. package/dist/calendar/grid-header/calendar-grid-header-custom-test.svelte +13 -0
  33. package/dist/calendar/grid-header/calendar-grid-header-custom-test.svelte.d.ts +18 -0
  34. package/dist/calendar/grid-header/calendar-grid-header.svelte +31 -0
  35. package/dist/calendar/grid-header/calendar-grid-header.svelte.d.ts +8 -0
  36. package/dist/calendar/header-cell/README.md +14 -0
  37. package/dist/calendar/header-cell/calendar-header-cell-test.svelte +11 -0
  38. package/dist/calendar/header-cell/calendar-header-cell-test.svelte.d.ts +18 -0
  39. package/dist/calendar/header-cell/calendar-header-cell.svelte +16 -0
  40. package/dist/calendar/header-cell/calendar-header-cell.svelte.d.ts +8 -0
  41. package/dist/calendar/heading/README.md +13 -0
  42. package/dist/calendar/heading/calendar-heading.svelte +17 -0
  43. package/dist/calendar/heading/calendar-heading.svelte.d.ts +5 -0
  44. package/dist/calendar/index.d.ts +13 -0
  45. package/dist/calendar/index.js +13 -0
  46. package/dist/calendar/index.parts.d.ts +9 -0
  47. package/dist/calendar/index.parts.js +9 -0
  48. package/dist/calendar/root/README.md +24 -0
  49. package/dist/calendar/root/calendar-root-bind-value-test.svelte +14 -0
  50. package/dist/calendar/root/calendar-root-bind-value-test.svelte.d.ts +3 -0
  51. package/dist/calendar/root/calendar-root-controlled-clear-test.svelte +20 -0
  52. package/dist/calendar/root/calendar-root-controlled-clear-test.svelte.d.ts +3 -0
  53. package/dist/calendar/root/calendar-root-test.svelte +71 -0
  54. package/dist/calendar/root/calendar-root-test.svelte.d.ts +13 -0
  55. package/dist/calendar/root/calendar-root.svelte +143 -0
  56. package/dist/calendar/root/calendar-root.svelte.d.ts +31 -0
  57. package/dist/calendar/root/context.d.ts +66 -0
  58. package/dist/calendar/root/context.js +727 -0
  59. package/dist/calendar/root/date-utils.d.ts +17 -0
  60. package/dist/calendar/root/date-utils.js +94 -0
  61. package/dist/calendar/trigger-next/README.md +14 -0
  62. package/dist/calendar/trigger-next/calendar-trigger-next.svelte +43 -0
  63. package/dist/calendar/trigger-next/calendar-trigger-next.svelte.d.ts +9 -0
  64. package/dist/calendar/trigger-previous/README.md +14 -0
  65. package/dist/calendar/trigger-previous/calendar-trigger-previous.svelte +43 -0
  66. package/dist/calendar/trigger-previous/calendar-trigger-previous.svelte.d.ts +9 -0
  67. package/dist/checkbox/README.md +53 -0
  68. package/dist/checkbox/TODO.md +16 -0
  69. package/dist/checkbox/index.d.ts +6 -0
  70. package/dist/checkbox/index.js +6 -0
  71. package/dist/checkbox/index.parts.d.ts +2 -0
  72. package/dist/checkbox/index.parts.js +2 -0
  73. package/dist/checkbox/indicator/README.md +23 -0
  74. package/dist/checkbox/indicator/checkbox-indicator.svelte +43 -0
  75. package/dist/checkbox/indicator/checkbox-indicator.svelte.d.ts +10 -0
  76. package/dist/checkbox/root/README.md +47 -0
  77. package/dist/checkbox/root/checkbox-label-test.svelte +10 -0
  78. package/dist/checkbox/root/checkbox-label-test.svelte.d.ts +18 -0
  79. package/dist/checkbox/root/checkbox-root.svelte +361 -0
  80. package/dist/checkbox/root/checkbox-root.svelte.d.ts +23 -0
  81. package/dist/checkbox/root/checkbox-test.svelte +59 -0
  82. package/dist/checkbox/root/checkbox-test.svelte.d.ts +18 -0
  83. package/dist/checkbox/root/context.d.ts +21 -0
  84. package/dist/checkbox/root/context.js +15 -0
  85. package/dist/clock/README.md +75 -0
  86. package/dist/clock/axis/README.md +24 -0
  87. package/dist/clock/axis/clock-axis.svelte +37 -0
  88. package/dist/clock/axis/clock-axis.svelte.d.ts +8 -0
  89. package/dist/clock/hooks/use-wheel-scroll.svelte.d.ts +16 -0
  90. package/dist/clock/hooks/use-wheel-scroll.svelte.js +336 -0
  91. package/dist/clock/index.d.ts +10 -0
  92. package/dist/clock/index.js +10 -0
  93. package/dist/clock/index.parts.d.ts +4 -0
  94. package/dist/clock/index.parts.js +4 -0
  95. package/dist/clock/root/README.md +38 -0
  96. package/dist/clock/root/clock-root-test.svelte +62 -0
  97. package/dist/clock/root/clock-root-test.svelte.d.ts +14 -0
  98. package/dist/clock/root/clock-root.svelte +329 -0
  99. package/dist/clock/root/clock-root.svelte.d.ts +25 -0
  100. package/dist/clock/root/context.d.ts +22 -0
  101. package/dist/clock/root/context.js +15 -0
  102. package/dist/clock/root/resolve-visible-columns.d.ts +7 -0
  103. package/dist/clock/root/resolve-visible-columns.js +16 -0
  104. package/dist/clock/root/time-utils.d.ts +48 -0
  105. package/dist/clock/root/time-utils.js +314 -0
  106. package/dist/clock/root/wheel-options.d.ts +17 -0
  107. package/dist/clock/root/wheel-options.js +63 -0
  108. package/dist/clock/wheel-column/README.md +25 -0
  109. package/dist/clock/wheel-column/clock-wheel-column-bindable-test.svelte +16 -0
  110. package/dist/clock/wheel-column/clock-wheel-column-bindable-test.svelte.d.ts +3 -0
  111. package/dist/clock/wheel-column/clock-wheel-column-custom-snippet-test.svelte +29 -0
  112. package/dist/clock/wheel-column/clock-wheel-column-custom-snippet-test.svelte.d.ts +6 -0
  113. package/dist/clock/wheel-column/clock-wheel-column-default-height-test.svelte +11 -0
  114. package/dist/clock/wheel-column/clock-wheel-column-default-height-test.svelte.d.ts +3 -0
  115. package/dist/clock/wheel-column/clock-wheel-column-test.svelte +38 -0
  116. package/dist/clock/wheel-column/clock-wheel-column-test.svelte.d.ts +12 -0
  117. package/dist/clock/wheel-column/clock-wheel-column-tp-test.svelte +38 -0
  118. package/dist/clock/wheel-column/clock-wheel-column-tp-test.svelte.d.ts +12 -0
  119. package/dist/clock/wheel-column/clock-wheel-column-untagged-snippet-test.svelte +29 -0
  120. package/dist/clock/wheel-column/clock-wheel-column-untagged-snippet-test.svelte.d.ts +6 -0
  121. package/dist/clock/wheel-column/clock-wheel-column.svelte +499 -0
  122. package/dist/clock/wheel-column/clock-wheel-column.svelte.d.ts +17 -0
  123. package/dist/clock/wheel-item/README.md +17 -0
  124. package/dist/clock/wheel-item/clock-wheel-item.svelte +49 -0
  125. package/dist/clock/wheel-item/clock-wheel-item.svelte.d.ts +17 -0
  126. package/dist/combobox/README.md +46 -0
  127. package/dist/combobox/TODO.md +28 -175
  128. package/dist/combobox/button/README.md +20 -0
  129. package/dist/combobox/button/combobox-button-test.svelte +27 -0
  130. package/dist/combobox/button/combobox-button-test.svelte.d.ts +6 -0
  131. package/dist/combobox/button/combobox-button.svelte +10 -11
  132. package/dist/combobox/clear/README.md +21 -0
  133. package/dist/combobox/clear/combobox-clear-test.svelte +34 -0
  134. package/dist/combobox/clear/combobox-clear-test.svelte.d.ts +3 -0
  135. package/dist/combobox/clear/combobox-clear.svelte +61 -0
  136. package/dist/combobox/clear/combobox-clear.svelte.d.ts +9 -0
  137. package/dist/combobox/index.d.ts +5 -3
  138. package/dist/combobox/index.js +5 -3
  139. package/dist/combobox/index.parts.d.ts +2 -0
  140. package/dist/combobox/index.parts.js +2 -0
  141. package/dist/combobox/input/README.md +16 -0
  142. package/dist/combobox/input/combobox-input.svelte +43 -12
  143. package/dist/combobox/item/README.md +27 -0
  144. package/dist/combobox/item/combobox-item-implicit-text-test.svelte +1 -1
  145. package/dist/combobox/item/combobox-listboxitem.svelte +3 -9
  146. package/dist/combobox/item-indicator/README.md +15 -0
  147. package/dist/combobox/item-indicator/combobox-item-indicator.svelte +4 -15
  148. package/dist/combobox/list/README.md +27 -0
  149. package/dist/combobox/list/combobox-listbox.svelte.d.ts +1 -1
  150. package/dist/combobox/popover/README.md +27 -0
  151. package/dist/combobox/popover/combobox-popover-props-test.svelte +38 -0
  152. package/dist/combobox/popover/combobox-popover-props-test.svelte.d.ts +11 -0
  153. package/dist/combobox/popover/combobox-popover.svelte +166 -23
  154. package/dist/combobox/popover/combobox-popover.svelte.d.ts +3 -3
  155. package/dist/combobox/popover/combobox-scrollable-list-test.svelte +23 -0
  156. package/dist/combobox/popover/combobox-scrollable-list-test.svelte.d.ts +18 -0
  157. package/dist/combobox/root/README.md +45 -0
  158. package/dist/combobox/root/combobox-multiselect-test.svelte +1 -1
  159. package/dist/combobox/root/combobox-numeric-string-id-test.svelte +1 -1
  160. package/dist/combobox/root/combobox-test.svelte +16 -3
  161. package/dist/combobox/root/combobox-test.svelte.d.ts +1 -0
  162. package/dist/combobox/root/combobox.svelte +100 -4
  163. package/dist/combobox/root/combobox.svelte.d.ts +1 -0
  164. package/dist/combobox/root/context.d.ts +19 -1
  165. package/dist/combobox/tag/README.md +37 -0
  166. package/dist/combobox/tag-remove/README.md +14 -0
  167. package/dist/combobox/tag-remove/combobox-tag-remove.svelte +3 -2
  168. package/dist/combobox/tags/README.md +23 -0
  169. package/dist/combobox/trigger/README.md +21 -0
  170. package/dist/combobox/trigger/combobox-trigger.svelte +56 -0
  171. package/dist/combobox/trigger/combobox-trigger.svelte.d.ts +9 -0
  172. package/dist/datepicker/README.md +100 -0
  173. package/dist/datepicker/TODO.md +28 -0
  174. package/dist/datepicker/calendar/README.md +19 -0
  175. package/dist/datepicker/calendar/date-picker-calendar-unsafe-props-test.svelte +60 -0
  176. package/dist/datepicker/calendar/date-picker-calendar-unsafe-props-test.svelte.d.ts +3 -0
  177. package/dist/datepicker/calendar/date-picker-calendar.svelte +65 -0
  178. package/dist/datepicker/calendar/date-picker-calendar.svelte.d.ts +10 -0
  179. package/dist/datepicker/index.d.ts +18 -0
  180. package/dist/datepicker/index.js +18 -0
  181. package/dist/datepicker/index.parts.d.ts +14 -0
  182. package/dist/datepicker/index.parts.js +14 -0
  183. package/dist/datepicker/input/README.md +15 -0
  184. package/dist/datepicker/input/date-picker-input.svelte +108 -0
  185. package/dist/datepicker/input/date-picker-input.svelte.d.ts +11 -0
  186. package/dist/datepicker/internal/strict-props.d.ts +2 -0
  187. package/dist/datepicker/internal/strict-props.js +28 -0
  188. package/dist/datepicker/popover/README.md +20 -0
  189. package/dist/datepicker/popover/date-picker-popover-handler-test.svelte +57 -0
  190. package/dist/datepicker/popover/date-picker-popover-handler-test.svelte.d.ts +3 -0
  191. package/dist/datepicker/popover/date-picker-popover-unsafe-props-test.svelte +45 -0
  192. package/dist/datepicker/popover/date-picker-popover-unsafe-props-test.svelte.d.ts +18 -0
  193. package/dist/datepicker/popover/date-picker-popover.svelte +87 -0
  194. package/dist/datepicker/popover/date-picker-popover.svelte.d.ts +7 -0
  195. package/dist/datepicker/root/README.md +38 -0
  196. package/dist/datepicker/root/context.d.ts +43 -0
  197. package/dist/datepicker/root/context.js +15 -0
  198. package/dist/datepicker/root/date-picker-bindable-empty-test.svelte +24 -0
  199. package/dist/datepicker/root/date-picker-bindable-empty-test.svelte.d.ts +3 -0
  200. package/dist/datepicker/root/date-picker-bindable-test.svelte +41 -0
  201. package/dist/datepicker/root/date-picker-bindable-test.svelte.d.ts +3 -0
  202. package/dist/datepicker/root/date-picker-empty-test.svelte +47 -0
  203. package/dist/datepicker/root/date-picker-empty-test.svelte.d.ts +3 -0
  204. package/dist/datepicker/root/date-picker-locale-typing-test.svelte +47 -0
  205. package/dist/datepicker/root/date-picker-locale-typing-test.svelte.d.ts +3 -0
  206. package/dist/datepicker/root/date-picker-open-cancel-test.svelte +54 -0
  207. package/dist/datepicker/root/date-picker-open-cancel-test.svelte.d.ts +8 -0
  208. package/dist/datepicker/root/date-picker-root.svelte +495 -0
  209. package/dist/datepicker/root/date-picker-root.svelte.d.ts +24 -0
  210. package/dist/datepicker/root/date-picker-test.svelte +86 -0
  211. package/dist/datepicker/root/date-picker-test.svelte.d.ts +13 -0
  212. package/dist/datepicker/root/date-utils.d.ts +17 -0
  213. package/dist/datepicker/root/date-utils.js +138 -0
  214. package/dist/datepicker/root/draft-evaluation.d.ts +13 -0
  215. package/dist/datepicker/root/draft-evaluation.js +56 -0
  216. package/dist/datepicker/root/focus-controller.d.ts +3 -0
  217. package/dist/datepicker/root/focus-controller.js +15 -0
  218. package/dist/datepicker/root/open-change.d.ts +5 -0
  219. package/dist/datepicker/root/open-change.js +13 -0
  220. package/dist/datepicker/root/open-controller.d.ts +7 -0
  221. package/dist/datepicker/root/open-controller.js +15 -0
  222. package/dist/datepicker/root/segment-controller.d.ts +8 -0
  223. package/dist/datepicker/root/segment-controller.js +53 -0
  224. package/dist/datepicker/root/segment-state.d.ts +18 -0
  225. package/dist/datepicker/root/segment-state.js +134 -0
  226. package/dist/datepicker/root/value-commit.d.ts +4 -0
  227. package/dist/datepicker/root/value-commit.js +8 -0
  228. package/dist/datepicker/segment/README.md +14 -0
  229. package/dist/datepicker/segment/date-picker-segment.svelte +319 -0
  230. package/dist/datepicker/segment/date-picker-segment.svelte.d.ts +9 -0
  231. package/dist/datepicker/trigger/README.md +14 -0
  232. package/dist/datepicker/trigger/date-picker-trigger.svelte +110 -0
  233. package/dist/datepicker/trigger/date-picker-trigger.svelte.d.ts +9 -0
  234. package/dist/dialog/README.md +35 -0
  235. package/dist/dialog/content/README.md +16 -0
  236. package/dist/dialog/content/dialog-content.svelte +6 -6
  237. package/dist/dialog/index.d.ts +3 -3
  238. package/dist/dialog/index.js +2 -2
  239. package/dist/dialog/overlay/README.md +13 -0
  240. package/dist/dialog/portal/README.md +12 -0
  241. package/dist/dialog/root/README.md +53 -0
  242. package/dist/dialog/root/context.d.ts +2 -1
  243. package/dist/dialog/root/dialog-root.svelte +9 -2
  244. package/dist/dialog/trigger/README.md +12 -0
  245. package/dist/dialog/trigger/dialog-trigger-multi-button-test.svelte +19 -0
  246. package/dist/dialog/trigger/dialog-trigger-multi-button-test.svelte.d.ts +18 -0
  247. package/dist/dialog/trigger/dialog-trigger.svelte +18 -6
  248. package/dist/index.d.ts +31 -13
  249. package/dist/index.js +31 -13
  250. package/dist/input/README.md +38 -0
  251. package/dist/input/TODO.md +12 -0
  252. package/dist/input/input-test.svelte +43 -0
  253. package/dist/input/input-test.svelte.d.ts +12 -0
  254. package/dist/input/input.svelte +151 -7
  255. package/dist/input/input.svelte.d.ts +8 -2
  256. package/dist/listbox/README.md +26 -0
  257. package/dist/listbox/index.d.ts +3 -3
  258. package/dist/listbox/index.js +3 -3
  259. package/dist/listbox/item/README.md +25 -0
  260. package/dist/listbox/item/listbox-item.svelte +158 -2
  261. package/dist/listbox/item/listbox-item.svelte.d.ts +4 -0
  262. package/dist/listbox/root/README.md +40 -0
  263. package/dist/listbox/root/listbox-test.svelte +14 -2
  264. package/dist/listbox/root/listbox-test.svelte.d.ts +1 -0
  265. package/dist/listbox/root/listbox.svelte +44 -0
  266. package/dist/listbox/root/listbox.svelte.d.ts +2 -2
  267. package/dist/locale-provider/context.d.ts +8 -0
  268. package/dist/locale-provider/context.js +18 -0
  269. package/dist/locale-provider/index.d.ts +4 -0
  270. package/dist/locale-provider/index.js +4 -0
  271. package/dist/locale-provider/locale-provider-initial-value-test.svelte +15 -0
  272. package/dist/locale-provider/locale-provider-initial-value-test.svelte.d.ts +7 -0
  273. package/dist/locale-provider/locale-provider-test.svelte +20 -0
  274. package/dist/locale-provider/locale-provider-test.svelte.d.ts +6 -0
  275. package/dist/locale-provider/locale-provider-value-probe.svelte +22 -0
  276. package/dist/locale-provider/locale-provider-value-probe.svelte.d.ts +6 -0
  277. package/dist/locale-provider/locale-provider.svelte +23 -0
  278. package/dist/locale-provider/locale-provider.svelte.d.ts +8 -0
  279. package/dist/popover/README.md +42 -0
  280. package/dist/popover/content/README.md +36 -0
  281. package/dist/popover/content/popover-content-standalone-test.svelte +28 -0
  282. package/dist/popover/content/popover-content-standalone-test.svelte.d.ts +6 -0
  283. package/dist/popover/content/popover-content-test.svelte +32 -2
  284. package/dist/popover/content/popover-content-test.svelte.d.ts +3 -1
  285. package/dist/popover/content/popover-content.svelte +277 -24
  286. package/dist/popover/content/popover-content.svelte.d.ts +5 -1
  287. package/dist/popover/index.d.ts +3 -3
  288. package/dist/popover/index.js +3 -5
  289. package/dist/popover/root/README.md +25 -0
  290. package/dist/popover/root/context.d.ts +16 -7
  291. package/dist/popover/root/context.js +0 -2
  292. package/dist/popover/root/focus-state.d.ts +4 -0
  293. package/dist/popover/root/focus-state.js +33 -0
  294. package/dist/popover/root/popover-root.svelte +90 -17
  295. package/dist/popover/root/popover-root.svelte.d.ts +2 -1
  296. package/dist/popover/root/popover-test.svelte +2 -1
  297. package/dist/popover/root/popover-test.svelte.d.ts +2 -1
  298. package/dist/popover/trigger/README.md +23 -0
  299. package/dist/popover/trigger/popover-trigger-button.svelte +14 -10
  300. package/dist/popover/trigger/popover-trigger-button.svelte.d.ts +2 -3
  301. package/dist/popover/trigger/popover-trigger-multi-button-test.svelte +16 -0
  302. package/dist/popover/trigger/popover-trigger-multi-button-test.svelte.d.ts +18 -0
  303. package/dist/popover/trigger/popover-trigger.svelte +19 -7
  304. package/dist/portal/portal.svelte +3 -1
  305. package/dist/primitives/click-outside.d.ts +1 -1
  306. package/dist/primitives/click-outside.js +1 -1
  307. package/dist/primitives/floating.js +12 -4
  308. package/dist/primitives/focus-trap.d.ts +7 -2
  309. package/dist/primitives/focus-trap.js +50 -17
  310. package/dist/primitives/index.d.ts +1 -0
  311. package/dist/primitives/index.js +1 -0
  312. package/dist/primitives/input-modality.d.ts +7 -0
  313. package/dist/primitives/input-modality.js +125 -0
  314. package/dist/table/IMPLEMENTATION_NOTES.md +8 -0
  315. package/dist/table/PLAN-HIDDEN-COLUMNS.md +152 -0
  316. package/dist/table/PLAN.md +924 -0
  317. package/dist/table/README.md +116 -0
  318. package/dist/table/SELECTION_CHECKBOX_PLAN.md +234 -0
  319. package/dist/table/TODO.md +100 -0
  320. package/dist/table/body/README.md +24 -0
  321. package/dist/table/body/table-body.svelte +25 -0
  322. package/dist/table/body/table-body.svelte.d.ts +9 -0
  323. package/dist/table/cell/README.md +25 -0
  324. package/dist/table/cell/table-cell.svelte +247 -0
  325. package/dist/table/cell/table-cell.svelte.d.ts +9 -0
  326. package/dist/table/checkbox/README.md +38 -0
  327. package/dist/table/checkbox/table-checkbox-test.svelte +121 -0
  328. package/dist/table/checkbox/table-checkbox-test.svelte.d.ts +16 -0
  329. package/dist/table/checkbox/table-checkbox.svelte +274 -0
  330. package/dist/table/checkbox/table-checkbox.svelte.d.ts +13 -0
  331. package/dist/table/checkbox-indicator/README.md +29 -0
  332. package/dist/table/checkbox-indicator/table-checkbox-indicator.svelte +22 -0
  333. package/dist/table/checkbox-indicator/table-checkbox-indicator.svelte.d.ts +10 -0
  334. package/dist/table/column/README.md +32 -0
  335. package/dist/table/column/table-column.svelte +108 -0
  336. package/dist/table/column/table-column.svelte.d.ts +18 -0
  337. package/dist/table/column-header-cell/README.md +28 -0
  338. package/dist/table/column-header-cell/table-column-header-cell.svelte +281 -0
  339. package/dist/table/column-header-cell/table-column-header-cell.svelte.d.ts +9 -0
  340. package/dist/table/column-resizer/README.md +32 -0
  341. package/dist/table/column-resizer/table-column-resizer-freeze-layout-test.svelte +51 -0
  342. package/dist/table/column-resizer/table-column-resizer-freeze-layout-test.svelte.d.ts +3 -0
  343. package/dist/table/column-resizer/table-column-resizer-selection-column-test.svelte +83 -0
  344. package/dist/table/column-resizer/table-column-resizer-selection-column-test.svelte.d.ts +3 -0
  345. package/dist/table/column-resizer/table-column-resizer-test.svelte +75 -0
  346. package/dist/table/column-resizer/table-column-resizer-test.svelte.d.ts +3 -0
  347. package/dist/table/column-resizer/table-column-resizer.svelte +616 -0
  348. package/dist/table/column-resizer/table-column-resizer.svelte.d.ts +11 -0
  349. package/dist/table/empty-state/README.md +25 -0
  350. package/dist/table/empty-state/table-empty-state.svelte +38 -0
  351. package/dist/table/empty-state/table-empty-state.svelte.d.ts +8 -0
  352. package/dist/table/footer/README.md +24 -0
  353. package/dist/table/footer/table-footer.svelte +19 -0
  354. package/dist/table/footer/table-footer.svelte.d.ts +9 -0
  355. package/dist/table/header/README.md +24 -0
  356. package/dist/table/header/table-header.svelte +19 -0
  357. package/dist/table/header/table-header.svelte.d.ts +9 -0
  358. package/dist/table/index.d.ts +16 -0
  359. package/dist/table/index.js +16 -0
  360. package/dist/table/index.parts.d.ts +12 -0
  361. package/dist/table/index.parts.js +12 -0
  362. package/dist/table/root/README.md +56 -0
  363. package/dist/table/root/context.d.ts +198 -0
  364. package/dist/table/root/context.js +1426 -0
  365. package/dist/table/root/table-reorder-test.svelte +64 -0
  366. package/dist/table/root/table-reorder-test.svelte.d.ts +3 -0
  367. package/dist/table/root/table-root.svelte +410 -0
  368. package/dist/table/root/table-root.svelte.d.ts +29 -0
  369. package/dist/table/root/table-test.svelte +165 -0
  370. package/dist/table/root/table-test.svelte.d.ts +25 -0
  371. package/dist/table/row/README.md +27 -0
  372. package/dist/table/row/table-row.svelte +321 -0
  373. package/dist/table/row/table-row.svelte.d.ts +13 -0
  374. package/dist/test-utils/focus-contract.d.ts +3 -0
  375. package/dist/test-utils/focus-contract.js +26 -0
  376. package/dist/timepicker/IMPLEMENTATION_PLAN.md +254 -0
  377. package/dist/timepicker/README.md +97 -0
  378. package/dist/timepicker/TODO.md +86 -0
  379. package/dist/timepicker/clock/README.md +14 -0
  380. package/dist/timepicker/clock/time-picker-clock-test.svelte +45 -0
  381. package/dist/timepicker/clock/time-picker-clock-test.svelte.d.ts +11 -0
  382. package/dist/timepicker/clock/time-picker-clock.svelte +65 -0
  383. package/dist/timepicker/clock/time-picker-clock.svelte.d.ts +10 -0
  384. package/dist/timepicker/index.d.ts +14 -0
  385. package/dist/timepicker/index.js +14 -0
  386. package/dist/timepicker/index.parts.d.ts +8 -0
  387. package/dist/timepicker/index.parts.js +8 -0
  388. package/dist/timepicker/input/README.md +15 -0
  389. package/dist/timepicker/input/time-picker-input-forwarding-test.svelte +40 -0
  390. package/dist/timepicker/input/time-picker-input-forwarding-test.svelte.d.ts +3 -0
  391. package/dist/timepicker/input/time-picker-input.svelte +109 -0
  392. package/dist/timepicker/input/time-picker-input.svelte.d.ts +11 -0
  393. package/dist/timepicker/internal/strict-props.d.ts +4 -0
  394. package/dist/timepicker/internal/strict-props.js +51 -0
  395. package/dist/timepicker/popover/README.md +20 -0
  396. package/dist/timepicker/popover/time-picker-popover-unsafe-props-test.svelte +22 -0
  397. package/dist/timepicker/popover/time-picker-popover-unsafe-props-test.svelte.d.ts +3 -0
  398. package/dist/timepicker/popover/time-picker-popover.svelte +89 -0
  399. package/dist/timepicker/popover/time-picker-popover.svelte.d.ts +7 -0
  400. package/dist/timepicker/root/README.md +42 -0
  401. package/dist/timepicker/root/context.d.ts +51 -0
  402. package/dist/timepicker/root/context.js +15 -0
  403. package/dist/timepicker/root/time-picker-12h-test.svelte +22 -0
  404. package/dist/timepicker/root/time-picker-12h-test.svelte.d.ts +3 -0
  405. package/dist/timepicker/root/time-picker-bindable-test.svelte +25 -0
  406. package/dist/timepicker/root/time-picker-bindable-test.svelte.d.ts +3 -0
  407. package/dist/timepicker/root/time-picker-empty-test.svelte +20 -0
  408. package/dist/timepicker/root/time-picker-empty-test.svelte.d.ts +3 -0
  409. package/dist/timepicker/root/time-picker-root.svelte +625 -0
  410. package/dist/timepicker/root/time-picker-root.svelte.d.ts +28 -0
  411. package/dist/timepicker/root/time-picker-test.svelte +72 -0
  412. package/dist/timepicker/root/time-picker-test.svelte.d.ts +15 -0
  413. package/dist/timepicker/root/time-utils.d.ts +1 -0
  414. package/dist/timepicker/root/time-utils.js +3 -0
  415. package/dist/timepicker/segment/README.md +14 -0
  416. package/dist/timepicker/segment/time-picker-segment.svelte +365 -0
  417. package/dist/timepicker/segment/time-picker-segment.svelte.d.ts +9 -0
  418. package/dist/timepicker/trigger/README.md +14 -0
  419. package/dist/timepicker/trigger/time-picker-trigger-forwarding-test.svelte +35 -0
  420. package/dist/timepicker/trigger/time-picker-trigger-forwarding-test.svelte.d.ts +3 -0
  421. package/dist/timepicker/trigger/time-picker-trigger.svelte +122 -0
  422. package/dist/timepicker/trigger/time-picker-trigger.svelte.d.ts +9 -0
  423. package/dist/utils/date-only.d.ts +11 -0
  424. package/dist/utils/date-only.js +53 -0
  425. package/dist/utils/index.d.ts +1 -0
  426. package/dist/utils/index.js +1 -0
  427. package/package.json +41 -1
@@ -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
- ## 🔊 Accesibilidad
8
-
9
- ### Completado
10
-
11
- - [x] ARIA pattern: `aria-activedescendant` para virtual focus
12
- - [x] `aria-expanded`, `aria-haspopup`, `aria-controls` en input
13
- - [x] `aria-label` en ListBox
14
- - [x] `role="combobox"`, `role="listbox"`, `role="option"`
15
- - [x] `aria-selected` en items seleccionados
16
- - [x] `aria-disabled` en items/placeholder deshabilitados
17
- - [x] Input soporta `aria-label` y `aria-labelledby` props
18
- - [x] ListBox tiene ID para que `aria-controls` funcione correctamente
19
- - [x] Button tiene `aria-controls` apuntando al listbox
20
- - [x] Wrapper group soporta `aria-label` y `aria-labelledby`
21
- - [x] Input soporta `aria-describedby` para instrucciones de uso
22
-
23
- ### Pendiente
24
-
25
- - [ ] **Live regions para conteo de resultados**
26
- - Agregar `<div aria-live="polite">` que anuncie "{N} resultados disponibles" al filtrar
27
- - Importante para screen readers que no ven el cambio visual
28
-
29
- - [ ] **Anuncio de selección**
30
- - Anunciar "Item seleccionado: {label}" cuando se selecciona
31
- - Usar `aria-live="assertive"` para cambios importantes
32
-
33
- - [ ] **Soporte para grupos (sections)**
34
- - Implementar `role="group"` con `aria-labelledby` para secciones
35
- - Agregar `ComboBox.Section` component
36
-
37
- ---
38
-
39
- ## 📈 Escalabilidad
40
-
41
- ### Completado ✅
42
-
43
- - [x] Hook `useVirtualFocus` reutilizable
44
- - [x] Controlled/uncontrolled mode
45
- - [x] Filtrado automático en items
46
- - [x] `emptyPlaceholder` reactivo
47
-
48
- ### Pendiente
49
-
50
- - [ ] **`filterFn` prop customizable**
51
- - Actualmente filtrado es case-insensitive includes
52
- - Permitir: fuzzy search, startsWith, exact match, async search
53
-
54
- - [ ] **`allowCreate` prop**
55
- - Permitir crear nuevos items cuando no hay match
56
- - Callback `onCreate?: (value: string) => void`
57
-
58
- - [x] **Multiple selection UI**
59
- - Chips/tags para items seleccionados ✅ `ComboBox.Tags`, `ComboBox.Tag`, `ComboBox.TagRemove`
60
- - Clear all button (disponible via `clearSelection()` en context)
61
- - Contador de seleccionados (disponible via `selectedValue.size`)
62
- - Navegación de tags con teclado (ArrowLeft/Right, Delete/Backspace)
63
- - `ComboBox.ItemIndicator` para mostrar checks en items seleccionados
64
-
65
- - [ ] **Form integration**
66
- - `name` prop para `<form>` nativo
67
- - Hidden input con valor serializado
68
- - Validación con `required`, `aria-invalid`
69
-
70
- - [ ] **Async data support**
71
- - Props: `isLoading`, `loadingPlaceholder`
72
- - Callback: `onLoadMore` para infinite scroll
73
- - Debounce integrado para búsqueda async
74
-
75
- - [ ] **Virtualization**
76
- - Para listas grandes (>100 items)
77
- - Integrar con `@tanstack/virtual` o similar
78
-
79
- ---
80
-
81
- ## ⚡ Performance
82
-
83
- ### Completado ✅
84
-
85
- - [x] Cache de DOM queries con invalidación (`cachedItemOrder`)
86
- - [x] `untrack()` para evitar loops infinitos en effects
87
- - [x] Subscription pattern para `itemCount` reactivo
88
- - [x] Scoped queries via `containerRef`
89
-
90
- ### Pendiente
91
-
92
- - [ ] **Memoización de `isVisible` en ListBoxItem**
93
- - Actualmente se recalcula en cada render
94
- - Considerar memoizar con `$derived` más granular
95
-
96
- - [ ] **Batch registration**
97
- - `registerItem` se llama por cada item individualmente
98
- - Para listas grandes, batch notifications
99
-
100
- - [ ] **Lazy itemLabels**
101
- - El Map `itemLabels` crece con cada item
102
- - Limpiar en unmount está implementado, pero considerar WeakMap
103
-
104
- - [ ] **Effect cleanup optimizations**
105
- - Revisar effects que podrían consolidarse
106
- - `combobox-listboxitem.svelte` tiene 2 effects que podrían ser 1
107
-
108
- ---
109
-
110
- ## 🔧 Svelte 5 Runes Best Practices
111
-
112
- ### Completado ✅
113
-
114
- - [x] `$state` para estado reactivo
115
- - [x] `$derived` para valores computados
116
- - [x] `$effect` con cleanup functions
117
- - [x] `$bindable` para two-way binding
118
- - [x] `$props()` para destructuring
119
- - [x] `untrack()` para evitar re-runs innecesarios
120
- - [x] `$derived(expression)` en vez de `$derived(() => ...)` - Simplificado en `combobox-listboxitem.svelte`
121
- - [x] Effects consolidados - Usando 1 `$effect` + `onDestroy` en vez de 2 effects
122
-
123
- ### Revisado - No requiere cambios
124
-
125
- - [x] **`$effect.pre`**: Revisado - no hay race conditions que lo requieran
126
- - [x] **Context typing**: El type único es apropiado - tree-shaking no aplica a context objects
127
-
128
- ---
129
-
130
- ## 🧪 Testing
131
-
132
- ### Completado ✅
133
-
134
- - [x] 291 tests unitarios pasando
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) - incluye navegación por teclado
147
- - [x] TagRemove component tests (6 tests)
148
- - [x] ItemIndicator component tests (5 tests)
149
-
150
- ### Pendiente
151
-
152
- - [ ] **Tests con muchos items (100+)** - performance tests
153
- - [ ] **Visual regression tests** - screenshots de estados
154
-
155
- ---
156
-
157
- ## 📝 Documentación
158
-
159
- - [ ] **JSDoc completo**
160
- - Documentar todas las props públicas
161
- - Ejemplos de uso en comments
162
-
163
- - [ ] **Storybook/Demo page**
164
- - Ejemplos interactivos de todos los casos de uso
165
- - Estados: loading, error, disabled, readonly
166
-
167
- ---
168
-
169
- ## 🎯 Próximos Pasos Priorizados
170
-
171
- 1. **Live regions** (accessibility - alto impacto)
172
- 2. **Form integration** (usabilidad - casos comunes)
173
- 3. **`filterFn` customizable** (escalabilidad)
174
- 4. **Consolidar effects** (performance/best practices)
175
- 5. **Async data support** (escalabilidad)
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.
@@ -0,0 +1,20 @@
1
+ # ComboBox Button
2
+
3
+ ## API reference
4
+
5
+ ### ComboBox.Button
6
+
7
+ Name: `ComboBox.Button`
8
+ Description: Compatibility alias for `ComboBox.Trigger`.
9
+
10
+ | Prop | Type | Default | Description |
11
+ | -------------- | ---------------------- | ----------- | --------------------------------------------------------------- |
12
+ | `class` | `string` | `undefined` | CSS class names for the trigger element. |
13
+ | `children` | `Snippet` | `undefined` | Custom trigger content. If omitted, a chevron icon is rendered. |
14
+ | `tabindex` | `number` | `-1` | Tab index applied to the trigger button. |
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';
@@ -0,0 +1,16 @@
1
+ # ComboBox Input
2
+
3
+ ## API reference
4
+
5
+ ### ComboBox.Input
6
+
7
+ Name: `ComboBox.Input`
8
+ Description: Text input with `role="combobox"` that syncs typed value, active descendant, and keyboard handling with `ComboBox.Root`.
9
+
10
+ | Prop | Type | Default | Description |
11
+ | ------------------ | --------------------- | ----------- | ----------------------------------------------- |
12
+ | `aria-label` | `string` | `undefined` | Accessible label applied directly to the input. |
13
+ | `aria-labelledby` | `string` | `undefined` | Element id that labels the input. |
14
+ | `aria-describedby` | `string` | `undefined` | Element id that describes the input behavior. |
15
+ | `class` | `string` | `undefined` | CSS class names for the input element. |
16
+ | `...restProps` | `HTMLInputAttributes` | `-` | Additional native input attributes. |
@@ -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"
@@ -83,13 +114,13 @@
83
114
  aria-labelledby={ariaLabelledby}
84
115
  aria-describedby={ariaDescribedby}
85
116
  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}
117
+ isDisabled={ctx.isDisabled}
118
+ isReadOnly={ctx.isReadOnly}
119
+ oninput={composeEventHandlers(handleInput, onInputExternal ?? undefined)}
120
+ onfocus={composeEventHandlers(handleFocus, onFocusExternal ?? undefined)}
121
+ onmousedown={composeEventHandlers(handleMouseDown, onMouseDownExternal ?? undefined)}
122
+ onblur={composeEventHandlers(handleBlur, onBlurExternal ?? undefined)}
123
+ onkeydown={composeEventHandlers(handleKeyDown, onKeyDownExternal ?? undefined)}
93
124
  class={cn(
94
125
  '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
126
  className
@@ -0,0 +1,27 @@
1
+ # ComboBox Item
2
+
3
+ ## API reference
4
+
5
+ ### ComboBox.Item
6
+
7
+ Name: `ComboBox.Item`
8
+ Description: Selectable option item with combobox-specific filtering, virtual focus, and registration logic.
9
+
10
+ | Prop | Type | Default | Description |
11
+ | -------------- | -------------------------------- | -------------- | -------------------------------------------------------------- |
12
+ | `id` | `string \| number` | `required` | Unique item id used for selection and ARIA relationships. |
13
+ | `textValue` | `string` | `content text` | Text used for filtering and fallback label resolution. |
14
+ | `disabled` | `boolean` | `false` | Marks the item as disabled and non-selectable. |
15
+ | `class` | `string` | `undefined` | CSS class names for the item. |
16
+ | `children` | `Snippet` | `undefined` | Rendered item content. |
17
+ | `...restProps` | `HTMLAttributes<HTMLDivElement>` | `-` | Additional attributes passed to the underlying option element. |
18
+
19
+ ### Item context utility
20
+
21
+ Name: `COMBOBOX_ITEM_CONTEXT_KEY` / `ComboBoxItemContext`
22
+ Description: Internal context consumed by `ComboBox.ItemIndicator` to read the parent item id.
23
+
24
+ | Prop | Type | Default | Description |
25
+ | --------------------------- | ------------------ | ----------------------------- | ----------------------------------------- |
26
+ | `COMBOBOX_ITEM_CONTEXT_KEY` | `symbol` | `Symbol.for('combobox-item')` | Context key shared by item and indicator. |
27
+ | `id` | `string \| number` | `required` | Current item id exposed through context. |