@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
@@ -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">
@@ -11,7 +11,6 @@
11
11
  import { untrack, onDestroy, setContext } from 'svelte';
12
12
  import ListBoxItem from '../../listbox/item/listbox-item.svelte';
13
13
  import { useComboBoxContext } from '../root/context';
14
- import { cn } from '../../utils/cn';
15
14
 
16
15
  /**
17
16
  * ComboBox.ListBoxItem wraps ListBox.Item and provides ComboBox-specific behavior:
@@ -33,7 +32,7 @@
33
32
  | 'isParentDisabled'
34
33
  >;
35
34
 
36
- let { id, class: className, ...props }: ComboBoxListBoxItemProps = $props();
35
+ let { id, ...props }: ComboBoxListBoxItemProps = $props();
37
36
 
38
37
  const ctx = useComboBoxContext();
39
38
 
@@ -67,6 +66,7 @@
67
66
 
68
67
  // Virtual focus from ComboBox context
69
68
  const isFocused = $derived(ctx.focusedItemId === id);
69
+ const isFocusVisible = $derived(isFocused && ctx.isFocusVisible);
70
70
 
71
71
  // Generate unique ID using instanceId
72
72
  const uniqueId = $derived(`combobox-item-${ctx.instanceId}-${id}`);
@@ -121,16 +121,10 @@
121
121
  customId={uniqueId}
122
122
  disableFocusHandling={true}
123
123
  isFocusedOverride={isFocused}
124
+ isFocusVisibleOverride={isFocusVisible}
124
125
  onItemSelect={handleSelect}
125
126
  onResolvedTextValue={handleResolvedTextValue}
126
127
  scrollOnFocus={true}
127
128
  isParentDisabled={ctx.isDisabled}
128
- class={cn(
129
- 'cursor-pointer px-3 py-2 transition-colors outline-none',
130
- 'data-focused:bg-accent data-hovered:bg-accent',
131
- 'data-selected:bg-primary/10 data-selected:font-medium',
132
- 'data-disabled:pointer-events-none data-disabled:opacity-50',
133
- className
134
- )}
135
129
  />
136
130
  {/if}
@@ -0,0 +1,15 @@
1
+ # ComboBox Item Indicator
2
+
3
+ ## API reference
4
+
5
+ ### ComboBox.ItemIndicator
6
+
7
+ Name: `ComboBox.ItemIndicator`
8
+ Description: Visual selection indicator rendered inside `ComboBox.Item`.
9
+
10
+ | Prop | Type | Default | Description |
11
+ | -------------- | --------------------------------- | ------------ | ---------------------------------------------------- |
12
+ | `children` | `Snippet` | `check icon` | Custom indicator content. |
13
+ | `forceMount` | `boolean` | `false` | Forces rendering even when the item is not selected. |
14
+ | `class` | `string` | `undefined` | CSS class names for the indicator wrapper. |
15
+ | `...restProps` | `HTMLAttributes<HTMLSpanElement>` | `-` | Additional attributes passed to the wrapper span. |
@@ -1,13 +1,12 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from 'svelte';
3
- import type { HTMLAttributes } from 'svelte/elements';
4
3
  import { getContext } from 'svelte';
5
- import { cn } from '../../utils/cn';
6
- import { useComboBoxContext } from '../root/context';
4
+ import type { HTMLAttributes } from 'svelte/elements';
7
5
  import {
8
6
  COMBOBOX_ITEM_CONTEXT_KEY,
9
7
  type ComboBoxItemContext
10
8
  } from '../item/combobox-listboxitem.svelte';
9
+ import { useComboBoxContext } from '../root/context';
11
10
 
12
11
  /**
13
12
  * ComboBox.ItemIndicator - Visual indicator shown when an item is selected.
@@ -22,12 +21,7 @@
22
21
  class?: string;
23
22
  } & Omit<HTMLAttributes<HTMLSpanElement>, 'class' | 'children'>;
24
23
 
25
- let {
26
- children,
27
- forceMount = false,
28
- class: className,
29
- ...restProps
30
- }: ComboBoxItemIndicatorProps = $props();
24
+ let { children, forceMount = false, ...restProps }: ComboBoxItemIndicatorProps = $props();
31
25
 
32
26
  const comboboxCtx = useComboBoxContext();
33
27
  const itemCtx = getContext<ComboBoxItemContext>(COMBOBOX_ITEM_CONTEXT_KEY);
@@ -37,12 +31,7 @@
37
31
  </script>
38
32
 
39
33
  {#if shouldRender}
40
- <span
41
- aria-hidden="true"
42
- data-state={isSelected ? 'checked' : 'unchecked'}
43
- class={cn('inline-flex items-center justify-center', className)}
44
- {...restProps}
45
- >
34
+ <span aria-hidden="true" data-state={isSelected ? 'checked' : 'unchecked'} {...restProps}>
46
35
  {#if children}
47
36
  {@render children()}
48
37
  {:else}
@@ -0,0 +1,27 @@
1
+ # ComboBox List
2
+
3
+ ## API reference
4
+
5
+ ### ComboBox.List
6
+
7
+ Name: `ComboBox.List`
8
+ Description: Listbox bridge for combobox options. It delegates selection state and mode to `ComboBox.Root`.
9
+
10
+ | Prop | Type | Default | Description |
11
+ | ----------------- | --------------------------------------------------- | ----------- | ------------------------------------------------------------------------------- |
12
+ | `aria-label` | `string` | `'Options'` | Accessible label for the internal listbox. |
13
+ | `items` | `Iterable<T>` | `ctx.items` | Dynamic data source. If omitted, uses items from root context. |
14
+ | `children` | `Snippet<[T]> \| Snippet` | `undefined` | Dynamic item renderer or static list content. |
15
+ | `...listBoxProps` | `Omit<ComponentProps<ListBoxRoot>, internal props>` | `-` | Additional listbox props such as `class`, `emptyPlaceholder`, or `disabledIds`. |
16
+
17
+ ### Internally controlled props
18
+
19
+ Name: Controlled by `ComboBox.Root`
20
+ Description: The following values are set by `ComboBox.List` and should not be overridden directly.
21
+
22
+ | Prop | Type | Default | Description |
23
+ | --------------- | ------------------------ | -------------------------------- | ----------------------------------------------------- |
24
+ | `selectionMode` | `'single' \| 'multiple'` | `ctx.selectionMode` | Selection mode inherited from root. |
25
+ | `value` | `Set<string \| number>` | `ctx.selectedValue` | Current combobox selection state. |
26
+ | `onChange` | `(selection) => void` | `internal handler` | Delegates selected item handling to combobox context. |
27
+ | `id` | `string` | `combobox-listbox-${instanceId}` | Auto-generated listbox id for ARIA wiring. |
@@ -17,7 +17,7 @@ declare function $$render<T extends object = object>(): {
17
17
  } & {
18
18
  context?: ListBoxContext;
19
19
  element?: HTMLElement;
20
- }, "selectionMode" | "selectionBehavior" | "id" | "value" | "defaultValue" | "onChange" | "items" | "children" | "context" | "element"> & {
20
+ }, "children" | "value" | "id" | "element" | "selectionMode" | "selectionBehavior" | "defaultValue" | "onChange" | "items" | "context"> & {
21
21
  /** Optional items for dynamic rendering - overrides items from ComboBox context */
22
22
  items?: Iterable<T>;
23
23
  /** Content of the listbox. Receives item in dynamic mode. */
@@ -0,0 +1,27 @@
1
+ # ComboBox Popover
2
+
3
+ ## API reference
4
+
5
+ ### ComboBox.Popover
6
+
7
+ Name: `ComboBox.Popover`
8
+ Description: Floating container for combobox options. Internally composes `Popover.Root` and `Popover.Content` in non-modal mode.
9
+
10
+ | Prop | Type | Default | Description |
11
+ | ------------------------------ | ---------------------------------- | ---------------- | -------------------------------------------------------------------------- |
12
+ | `offset` | `number` | `8` | Main-axis offset from the combobox trigger. |
13
+ | `placement` | `ExtendedPlacement` | `'bottom-start'` | Preferred floating placement. |
14
+ | `shouldFlip` | `boolean` | `true` | Enables automatic fallback placement when space is limited. |
15
+ | `boundaryElement` | `Element \| null` | `null` | Optional boundary element for positioning constraints. |
16
+ | `class` | `string` | `''` | CSS class names for the floating panel. |
17
+ | `children` | `Snippet` | `undefined` | Popover content, typically `ComboBox.List`. |
18
+ | `isNonModal` | `boolean` | `true` | Controls whether the popover behaves as a non-modal overlay. |
19
+ | `shouldCloseOnInteractOutside` | `boolean` | `true` | Closes when interacting outside the panel. |
20
+ | `shouldCloseOnEscape` | `boolean` | `true` | Closes on Escape key press. |
21
+ | `shouldCloseOnBlur` | `boolean` | `true` | Closes on focus leaving trigger/content in the combobox interaction model. |
22
+ | `initialFocus` | `FocusTrapOptions['initialFocus']` | `undefined` | Initial focus target when modal focus trapping is enabled. |
23
+
24
+ ## Notes
25
+
26
+ - `ComboBox.Popover` forwards all `Popover.Content` configuration props except the controlled open-state wiring (`open`, `triggerRef`, and `onOpenChange`).
27
+ - The default placement is `bottom-start` to match the combobox input.
@@ -0,0 +1,38 @@
1
+ <script lang="ts">
2
+ import type { ComponentProps } from 'svelte';
3
+ import ComboBox from '../index';
4
+ import type { PopoverContent } from '../../popover';
5
+
6
+ type Props = {
7
+ offset?: number;
8
+ placement?: ComponentProps<typeof PopoverContent>['placement'];
9
+ shouldFlip?: boolean;
10
+ shouldCloseOnEscape?: boolean;
11
+ };
12
+
13
+ let {
14
+ offset = 8,
15
+ placement = 'bottom-start',
16
+ shouldFlip = true,
17
+ shouldCloseOnEscape = true
18
+ }: Props = $props();
19
+
20
+ const countries = [
21
+ { id: 'ar', name: 'Argentina' },
22
+ { id: 'br', name: 'Brazil' },
23
+ { id: 'ca', name: 'Canada' }
24
+ ];
25
+ </script>
26
+
27
+ <ComboBox.Root trigger="press">
28
+ <ComboBox.Input placeholder="Search countries..." />
29
+ <ComboBox.Trigger />
30
+
31
+ <ComboBox.Popover {offset} {placement} {shouldFlip} {shouldCloseOnEscape}>
32
+ <ComboBox.List emptyPlaceholder="No countries found">
33
+ {#each countries as country (country.id)}
34
+ <ComboBox.Item id={country.id} textValue={country.name}>{country.name}</ComboBox.Item>
35
+ {/each}
36
+ </ComboBox.List>
37
+ </ComboBox.Popover>
38
+ </ComboBox.Root>
@@ -0,0 +1,11 @@
1
+ import type { ComponentProps } from 'svelte';
2
+ import type { PopoverContent } from '../../popover';
3
+ type Props = {
4
+ offset?: number;
5
+ placement?: ComponentProps<typeof PopoverContent>['placement'];
6
+ shouldFlip?: boolean;
7
+ shouldCloseOnEscape?: boolean;
8
+ };
9
+ declare const ComboboxPopoverPropsTest: import("svelte").Component<Props, {}, "">;
10
+ type ComboboxPopoverPropsTest = ReturnType<typeof ComboboxPopoverPropsTest>;
11
+ export default ComboboxPopoverPropsTest;
@@ -1,66 +1,209 @@
1
1
  <script lang="ts">
2
- import type { Snippet } from 'svelte';
2
+ import type { ComponentProps, Snippet } from 'svelte';
3
3
  import { useComboBoxContext } from '../root/context';
4
4
  import { Popover } from '../../popover';
5
+ import { focusWithModality, type InputModality } from '../../primitives/input-modality';
6
+ import type { PopoverOpenChangeDetails } from '../../popover/root/context';
5
7
 
6
8
  /**
7
9
  * ComboBox.Popover - Just the floating container wrapper.
8
10
  * Should contain ComboBox.ListBox as a child.
9
11
  */
10
- type ComboBoxPopoverProps = {
11
- class?: string;
12
+ type ComboBoxPopoverProps = Omit<
13
+ ComponentProps<typeof Popover.Content>,
14
+ 'open' | 'triggerRef' | 'onOpenChange' | 'children'
15
+ > & {
12
16
  children?: Snippet;
13
17
  };
14
18
 
15
- let { class: className = '', children }: ComboBoxPopoverProps = $props();
19
+ let {
20
+ class: className = '',
21
+ children,
22
+ placement = 'bottom-start',
23
+ isNonModal = true,
24
+ shouldCloseOnEscape = true,
25
+ shouldCloseOnBlur = true,
26
+ ...contentProps
27
+ }: ComboBoxPopoverProps = $props();
16
28
 
17
29
  const ctx = useComboBoxContext();
30
+ let restoreListboxMaxHeight: (() => void) | undefined;
31
+
32
+ function resolveFocusTarget(details?: PopoverOpenChangeDetails): HTMLElement | null {
33
+ const rawTarget = details?.event?.target;
34
+ if (!(rawTarget instanceof Node)) return null;
35
+ if (ctx.inputRef?.contains(rawTarget)) return null;
36
+ return rawTarget instanceof HTMLElement ? rawTarget : rawTarget.parentElement;
37
+ }
38
+
39
+ function handleOpenChange(open: boolean, details?: PopoverOpenChangeDetails) {
40
+ if (!open) {
41
+ // Cancel Popover.Root's close to prevent scheduleTriggerCloseFocus from
42
+ // setting stale data-focused on the trigger. The combobox passes triggerRef
43
+ // via prop (not Popover.Trigger), so Popover.Root never registers a
44
+ // blur-cleanup listener and any data-focused it sets persists forever.
45
+ //
46
+ // IMPORTANT: the actual state change is deferred to a microtask so that
47
+ // when Popover.Root's closePopover re-reads `isOpen` after the callback,
48
+ // the derived value is still `true` and the guard succeeds. A synchronous
49
+ // ctx.onOpenChange(false) would update the upstream signal immediately,
50
+ // making the derived `false` and bypassing the guard despite the cancel.
51
+ details?.cancel();
52
+
53
+ if (details?.reason === 'outside-press') {
54
+ const target = resolveFocusTarget(details);
55
+ queueMicrotask(() => {
56
+ ctx.onOpenChange(false);
57
+
58
+ if (target) {
59
+ focusWithModality(target, 'pointer' satisfies InputModality);
60
+ }
61
+
62
+ // If focus is still on the input (non-focusable target), blur it
63
+ // so focusWithin becomes false.
64
+ if (document.activeElement === ctx.inputRef) {
65
+ ctx.inputRef?.blur();
66
+ }
67
+ });
68
+ return;
69
+ }
70
+
71
+ queueMicrotask(() => {
72
+ ctx.onOpenChange(false);
73
+ });
74
+ return;
75
+ }
18
76
 
19
- function handleOpenChange(open: boolean) {
20
77
  ctx.onOpenChange(open);
21
78
  }
22
79
 
80
+ function handleMouseDown() {
81
+ ctx.markPopoverPointerDown();
82
+ }
83
+
84
+ function applyListboxViewportConstraint() {
85
+ const listbox = ctx.listboxRef;
86
+ if (!listbox) return;
87
+
88
+ const previousInlineMaxHeight = listbox.style.maxHeight;
89
+ const computedMaxHeight = getComputedStyle(listbox).maxHeight;
90
+
91
+ listbox.style.maxHeight =
92
+ computedMaxHeight && computedMaxHeight !== 'none'
93
+ ? `min(${computedMaxHeight}, var(--available-height))`
94
+ : 'var(--available-height)';
95
+
96
+ restoreListboxMaxHeight = () => {
97
+ listbox.style.maxHeight = previousInlineMaxHeight;
98
+ };
99
+ }
100
+
101
+ function canElementScrollInDirection(element: HTMLElement, deltaY: number) {
102
+ const isScrollingDown = deltaY > 0;
103
+ const isScrollingUp = deltaY < 0;
104
+ const canScrollDown = element.scrollTop < element.scrollHeight - element.clientHeight;
105
+ const canScrollUp = element.scrollTop > 0;
106
+
107
+ return (isScrollingDown && canScrollDown) || (isScrollingUp && canScrollUp);
108
+ }
109
+
110
+ function isScrollableElement(element: HTMLElement) {
111
+ const { overflowY } = getComputedStyle(element);
112
+ return (
113
+ ['auto', 'scroll', 'overlay'].includes(overflowY) &&
114
+ element.scrollHeight > element.clientHeight
115
+ );
116
+ }
117
+
118
+ function hasScrollableDescendantForWheel(
119
+ boundary: HTMLElement,
120
+ target: EventTarget | null,
121
+ deltaY: number
122
+ ) {
123
+ let current =
124
+ target instanceof HTMLElement ? target : target instanceof Node ? target.parentElement : null;
125
+
126
+ while (current) {
127
+ if (isScrollableElement(current) && canElementScrollInDirection(current, deltaY)) {
128
+ return true;
129
+ }
130
+
131
+ if (current === boundary) {
132
+ break;
133
+ }
134
+
135
+ current = current.parentElement;
136
+ }
137
+
138
+ return false;
139
+ }
140
+
23
141
  /**
24
142
  * Prevent wheel/scroll events from propagating to the page
25
143
  * This keeps the page from scrolling when scrolling over the popover
26
- * But allows internal scrolling when the popover has overflow
144
+ * But allows internal scrolling when either the popover or a descendant owns overflow
27
145
  */
28
146
  function handleWheel(event: WheelEvent) {
29
147
  const element = event.currentTarget as HTMLElement;
30
148
  if (!element) return;
31
149
 
32
- const { scrollTop, scrollHeight, clientHeight } = element;
33
- const isScrollingDown = event.deltaY > 0;
34
- const isScrollingUp = event.deltaY < 0;
35
-
36
- // Check if we can scroll in the direction of the wheel
37
- const canScrollDown = scrollTop < scrollHeight - clientHeight;
38
- const canScrollUp = scrollTop > 0;
39
-
40
- // If we can scroll internally in this direction, allow it
41
- if ((isScrollingDown && canScrollDown) || (isScrollingUp && canScrollUp)) {
42
- // Allow internal scroll, but stop propagation to page
43
- event.stopPropagation();
44
- } else {
45
- // Can't scroll internally, prevent both default and propagation
46
- event.preventDefault();
150
+ if (
151
+ hasScrollableDescendantForWheel(element, event.target, event.deltaY) ||
152
+ (isScrollableElement(element) && canElementScrollInDirection(element, event.deltaY))
153
+ ) {
47
154
  event.stopPropagation();
155
+ return;
48
156
  }
157
+
158
+ event.preventDefault();
159
+ event.stopPropagation();
49
160
  }
50
161
 
162
+ $effect(() => {
163
+ restoreListboxMaxHeight?.();
164
+ restoreListboxMaxHeight = undefined;
165
+
166
+ if (ctx.isOpen && ctx.listboxRef) {
167
+ applyListboxViewportConstraint();
168
+ }
169
+
170
+ return () => {
171
+ restoreListboxMaxHeight?.();
172
+ restoreListboxMaxHeight = undefined;
173
+ };
174
+ });
175
+
51
176
  $effect(() => {
52
177
  if (ctx.isOpen) {
53
178
  ctx.inputRef?.focus();
54
179
  }
55
180
  });
181
+
182
+ $effect(() => {
183
+ ctx.setShouldCloseOnEscape(shouldCloseOnEscape);
184
+ return () => {
185
+ ctx.setShouldCloseOnEscape(true);
186
+ };
187
+ });
188
+
189
+ $effect(() => {
190
+ ctx.setShouldCloseOnBlur(shouldCloseOnBlur);
191
+ return () => {
192
+ ctx.setShouldCloseOnBlur(true);
193
+ };
194
+ });
56
195
  </script>
57
196
 
58
197
  <Popover.Root open={ctx.isOpen} triggerRef={ctx.triggerRef} onOpenChange={handleOpenChange}>
59
198
  <Popover.Content
60
- isNonModal={true}
61
- placement="bottom-start"
199
+ {isNonModal}
200
+ {placement}
201
+ {shouldCloseOnEscape}
202
+ {shouldCloseOnBlur}
62
203
  class={className}
204
+ onmousedown={handleMouseDown}
63
205
  onwheel={handleWheel}
206
+ {...contentProps}
64
207
  >
65
208
  {#if children}
66
209
  {@render children()}
@@ -1,10 +1,10 @@
1
- import type { Snippet } from 'svelte';
1
+ import type { ComponentProps, Snippet } from 'svelte';
2
+ import { Popover } from '../../popover';
2
3
  /**
3
4
  * ComboBox.Popover - Just the floating container wrapper.
4
5
  * Should contain ComboBox.ListBox as a child.
5
6
  */
6
- type ComboBoxPopoverProps = {
7
- class?: string;
7
+ type ComboBoxPopoverProps = Omit<ComponentProps<typeof Popover.Content>, 'open' | 'triggerRef' | 'onOpenChange' | 'children'> & {
8
8
  children?: Snippet;
9
9
  };
10
10
  declare const ComboboxPopover: import("svelte").Component<ComboBoxPopoverProps, {}, "">;
@@ -0,0 +1,23 @@
1
+ <script lang="ts">
2
+ import ComboBox from '../index';
3
+
4
+ const items = Array.from({ length: 12 }, (_, index) => ({
5
+ id: `item-${index + 1}`,
6
+ name: `Item ${index + 1}`
7
+ }));
8
+ </script>
9
+
10
+ <ComboBox.Root trigger="press">
11
+ <ComboBox.Input placeholder="Search items..." />
12
+ <ComboBox.Trigger />
13
+
14
+ <ComboBox.Popover>
15
+ <ComboBox.List class="combobox-test-scroll-list" emptyPlaceholder="No items found">
16
+ {#each items as item (item.id)}
17
+ <ComboBox.Item id={item.id} textValue={item.name}>
18
+ {item.name}
19
+ </ComboBox.Item>
20
+ {/each}
21
+ </ComboBox.List>
22
+ </ComboBox.Popover>
23
+ </ComboBox.Root>
@@ -0,0 +1,18 @@
1
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
+ $$bindings?: Bindings;
4
+ } & Exports;
5
+ (internal: unknown, props: {
6
+ $$events?: Events;
7
+ $$slots?: Slots;
8
+ }): Exports & {
9
+ $set?: any;
10
+ $on?: any;
11
+ };
12
+ z_$$bindings?: Bindings;
13
+ }
14
+ declare const ComboboxScrollableListTest: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
15
+ [evt: string]: CustomEvent<any>;
16
+ }, {}, {}, string>;
17
+ type ComboboxScrollableListTest = InstanceType<typeof ComboboxScrollableListTest>;
18
+ export default ComboboxScrollableListTest;
@@ -0,0 +1,45 @@
1
+ # ComboBox Root
2
+
3
+ ## API reference
4
+
5
+ ### ComboBox.Root
6
+
7
+ Name: `ComboBox.Root`
8
+ Description: State container for combobox behavior, including open state, input value, selection logic, filtering, and keyboard interaction.
9
+
10
+ | Prop | Type | Default | Description |
11
+ | ------------------- | ------------------------------------------ | -------------------------------- | ----------------------------------------------------------- |
12
+ | `id` | `string` | `$props.id()` | Stable id used to derive internal ARIA ids. |
13
+ | `isDisabled` | `boolean` | `false` | Disables all user interaction. |
14
+ | `isPending` | `boolean` | `false` | Exposes busy async state on the root via `data-pending`. |
15
+ | `isReadOnly` | `boolean` | `false` | Keeps the component interactive but prevents value changes. |
16
+ | `value` | `string \| number \| (string \| number)[]` | `undefined` | Controlled selection value. Supports `bind:value`. |
17
+ | `defaultValue` | `string \| number \| (string \| number)[]` | `undefined` | Initial selection value in uncontrolled mode. |
18
+ | `inputValue` | `string` | `undefined` | Controlled input value. Supports `bind:inputValue`. |
19
+ | `defaultInputValue` | `string` | `''` | Initial input value in uncontrolled mode. |
20
+ | `selectionBehavior` | `'toggle' \| 'replace'` | `'toggle'` | Selection behavior when selecting an option. |
21
+ | `selectionMode` | `'single' \| 'multiple'` | `'single'` | Single-select or multi-select mode. |
22
+ | `closeOnSelect` | `boolean` | `single: true / multiple: false` | Controls whether the popover closes after selection. |
23
+ | `isOpen` | `boolean` | `undefined` | Controlled open state. Supports `bind:isOpen`. |
24
+ | `trigger` | `'focus' \| 'input' \| 'press'` | `'press'` | Opening strategy for the popover. |
25
+ | `onInputChange` | `(value: string) => void` | `undefined` | Called when the input value changes. |
26
+ | `onOpenChange` | `(open: boolean) => void` | `undefined` | Called when open state changes. |
27
+ | `onChange` | `(value) => void` | `undefined` | Called when selection changes. |
28
+ | `items` | `T[]` | `undefined` | Optional item collection for dynamic rendering. |
29
+ | `renderItem` | `Snippet<[T]>` | `undefined` | Optional item renderer for dynamic mode. |
30
+ | `children` | `Snippet` | `undefined` | Composed combobox parts. |
31
+ | `class` | `string` | `''` | CSS class names for the root group element. |
32
+ | `aria-label` | `string` | `undefined` | Accessible label for the combobox group. |
33
+ | `aria-labelledby` | `string` | `undefined` | Id of an external labeling element. |
34
+
35
+ ### Context utilities
36
+
37
+ Name: `context.ts` helpers
38
+ Description: Internal and advanced APIs for publishing and consuming combobox state.
39
+
40
+ | Prop | Type | Default | Description |
41
+ | -------------------- | ------------------------------------ | ------- | --------------------------------------------------- |
42
+ | `setComboBoxContext` | `(ctx: ComboBoxContext) => void` | `-` | Registers combobox context in root. |
43
+ | `getComboBoxContext` | `() => ComboBoxContext \| undefined` | `-` | Returns context if available. |
44
+ | `useComboBoxContext` | `() => ComboBoxContext` | `-` | Returns context and throws outside `ComboBox.Root`. |
45
+ | `ComboBoxContext` | `type` | `-` | Full context contract for state and actions. |
@@ -47,7 +47,7 @@
47
47
  {/snippet}
48
48
  </ComboBox.Tags>
49
49
  <ComboBox.Input placeholder="Search fruits..." />
50
- <ComboBox.Button>▼</ComboBox.Button>
50
+ <ComboBox.Trigger>▼</ComboBox.Trigger>
51
51
  </div>
52
52
 
53
53
  <ComboBox.Popover>
@@ -6,7 +6,7 @@
6
6
 
7
7
  <ComboBox.Root bind:value={selected}>
8
8
  <ComboBox.Input placeholder="Search codes..." />
9
- <ComboBox.Button />
9
+ <ComboBox.Trigger />
10
10
 
11
11
  <ComboBox.Popover>
12
12
  <ComboBox.List emptyPlaceholder="No codes found">
@@ -4,11 +4,20 @@
4
4
  type Props = {
5
5
  id?: string;
6
6
  isDisabled?: boolean;
7
+ isPending?: boolean;
7
8
  isReadOnly?: boolean;
8
9
  trigger?: 'focus' | 'input' | 'press';
9
10
  };
10
11
 
11
- let { id, isDisabled = false, isReadOnly = false, trigger = 'press' }: Props = $props();
12
+ let {
13
+ id,
14
+ isDisabled = false,
15
+ isPending = false,
16
+ isReadOnly = false,
17
+ trigger = 'press'
18
+ }: Props = $props();
19
+
20
+ let selectedValue = $state<string | number | undefined>();
12
21
 
13
22
  const countries = [
14
23
  { id: 'ar', name: 'Argentina' },
@@ -24,9 +33,9 @@
24
33
  ];
25
34
  </script>
26
35
 
27
- <ComboBox.Root {id} {isDisabled} {isReadOnly} {trigger}>
36
+ <ComboBox.Root {id} {isDisabled} {isPending} {isReadOnly} {trigger} bind:value={selectedValue}>
28
37
  <ComboBox.Input placeholder="Search countries..." />
29
- <ComboBox.Button />
38
+ <ComboBox.Trigger />
30
39
 
31
40
  <ComboBox.Popover>
32
41
  <ComboBox.List emptyPlaceholder="No countries found">
@@ -39,5 +48,9 @@
39
48
  </ComboBox.Popover>
40
49
  </ComboBox.Root>
41
50
 
51
+ <output data-selected-value
52
+ >{selectedValue === undefined ? 'undefined' : String(selectedValue)}</output
53
+ >
54
+
42
55
  <!-- Button outside the combobox for testing blur behavior -->
43
56
  <button type="button" data-testid="outside-button">Outside</button>
@@ -1,6 +1,7 @@
1
1
  type Props = {
2
2
  id?: string;
3
3
  isDisabled?: boolean;
4
+ isPending?: boolean;
4
5
  isReadOnly?: boolean;
5
6
  trigger?: 'focus' | 'input' | 'press';
6
7
  };