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

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 (394) 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 +2 -1
  15. package/dist/calendar/TODO.md +21 -107
  16. package/dist/calendar/body-cell/README.md +15 -0
  17. package/dist/calendar/body-cell/calendar-body-cell.svelte +116 -41
  18. package/dist/calendar/grid/README.md +13 -0
  19. package/dist/calendar/grid-body/README.md +13 -0
  20. package/dist/calendar/grid-header/README.md +13 -0
  21. package/dist/calendar/header-cell/README.md +14 -0
  22. package/dist/calendar/heading/README.md +13 -0
  23. package/dist/calendar/index.d.ts +3 -3
  24. package/dist/calendar/index.js +3 -3
  25. package/dist/calendar/root/README.md +24 -0
  26. package/dist/calendar/root/calendar-root-test.svelte +4 -0
  27. package/dist/calendar/root/calendar-root-test.svelte.d.ts +1 -0
  28. package/dist/calendar/root/calendar-root.svelte +3 -0
  29. package/dist/calendar/root/calendar-root.svelte.d.ts +1 -0
  30. package/dist/calendar/root/context.d.ts +4 -0
  31. package/dist/calendar/root/context.js +28 -25
  32. package/dist/calendar/root/date-utils.d.ts +1 -1
  33. package/dist/calendar/root/date-utils.js +16 -26
  34. package/dist/calendar/trigger-next/README.md +14 -0
  35. package/dist/calendar/trigger-next/calendar-trigger-next.svelte +9 -4
  36. package/dist/calendar/trigger-next/calendar-trigger-next.svelte.d.ts +2 -1
  37. package/dist/calendar/trigger-previous/README.md +14 -0
  38. package/dist/calendar/trigger-previous/calendar-trigger-previous.svelte +9 -4
  39. package/dist/calendar/trigger-previous/calendar-trigger-previous.svelte.d.ts +2 -1
  40. package/dist/checkbox/README.md +53 -0
  41. package/dist/checkbox/TODO.md +16 -0
  42. package/dist/checkbox/index.d.ts +6 -0
  43. package/dist/checkbox/index.js +6 -0
  44. package/dist/checkbox/index.parts.d.ts +2 -0
  45. package/dist/checkbox/index.parts.js +2 -0
  46. package/dist/checkbox/indicator/README.md +23 -0
  47. package/dist/checkbox/indicator/checkbox-indicator.svelte +43 -0
  48. package/dist/checkbox/indicator/checkbox-indicator.svelte.d.ts +10 -0
  49. package/dist/checkbox/root/README.md +47 -0
  50. package/dist/checkbox/root/checkbox-label-test.svelte +10 -0
  51. package/dist/checkbox/root/checkbox-label-test.svelte.d.ts +18 -0
  52. package/dist/checkbox/root/checkbox-root.svelte +386 -0
  53. package/dist/checkbox/root/checkbox-root.svelte.d.ts +29 -0
  54. package/dist/checkbox/root/checkbox-test.svelte +59 -0
  55. package/dist/checkbox/root/checkbox-test.svelte.d.ts +18 -0
  56. package/dist/checkbox/root/context.d.ts +21 -0
  57. package/dist/checkbox/root/context.js +15 -0
  58. package/dist/clock/README.md +75 -0
  59. package/dist/clock/axis/README.md +24 -0
  60. package/dist/clock/axis/clock-axis.svelte +37 -0
  61. package/dist/clock/axis/clock-axis.svelte.d.ts +8 -0
  62. package/dist/clock/hooks/use-wheel-scroll.svelte.d.ts +16 -0
  63. package/dist/clock/hooks/use-wheel-scroll.svelte.js +336 -0
  64. package/dist/clock/index.d.ts +10 -0
  65. package/dist/clock/index.js +10 -0
  66. package/dist/clock/index.parts.d.ts +4 -0
  67. package/dist/clock/index.parts.js +4 -0
  68. package/dist/clock/root/README.md +38 -0
  69. package/dist/clock/root/clock-root-test.svelte +62 -0
  70. package/dist/clock/root/clock-root-test.svelte.d.ts +14 -0
  71. package/dist/clock/root/clock-root.svelte +329 -0
  72. package/dist/clock/root/clock-root.svelte.d.ts +25 -0
  73. package/dist/clock/root/context.d.ts +22 -0
  74. package/dist/clock/root/context.js +15 -0
  75. package/dist/clock/root/resolve-visible-columns.d.ts +7 -0
  76. package/dist/clock/root/resolve-visible-columns.js +16 -0
  77. package/dist/clock/root/time-utils.d.ts +48 -0
  78. package/dist/clock/root/time-utils.js +314 -0
  79. package/dist/clock/root/wheel-options.d.ts +17 -0
  80. package/dist/clock/root/wheel-options.js +63 -0
  81. package/dist/clock/wheel-column/README.md +25 -0
  82. package/dist/clock/wheel-column/clock-wheel-column-bindable-test.svelte +16 -0
  83. package/dist/clock/wheel-column/clock-wheel-column-bindable-test.svelte.d.ts +3 -0
  84. package/dist/clock/wheel-column/clock-wheel-column-custom-snippet-test.svelte +29 -0
  85. package/dist/clock/wheel-column/clock-wheel-column-custom-snippet-test.svelte.d.ts +6 -0
  86. package/dist/clock/wheel-column/clock-wheel-column-default-height-test.svelte +11 -0
  87. package/dist/clock/wheel-column/clock-wheel-column-default-height-test.svelte.d.ts +3 -0
  88. package/dist/clock/wheel-column/clock-wheel-column-test.svelte +38 -0
  89. package/dist/clock/wheel-column/clock-wheel-column-test.svelte.d.ts +12 -0
  90. package/dist/clock/wheel-column/clock-wheel-column-tp-test.svelte +38 -0
  91. package/dist/clock/wheel-column/clock-wheel-column-tp-test.svelte.d.ts +12 -0
  92. package/dist/clock/wheel-column/clock-wheel-column-untagged-snippet-test.svelte +29 -0
  93. package/dist/clock/wheel-column/clock-wheel-column-untagged-snippet-test.svelte.d.ts +6 -0
  94. package/dist/clock/wheel-column/clock-wheel-column.svelte +499 -0
  95. package/dist/clock/wheel-column/clock-wheel-column.svelte.d.ts +17 -0
  96. package/dist/clock/wheel-item/README.md +17 -0
  97. package/dist/clock/wheel-item/clock-wheel-item.svelte +49 -0
  98. package/dist/clock/wheel-item/clock-wheel-item.svelte.d.ts +17 -0
  99. package/dist/combobox/README.md +8 -2
  100. package/dist/combobox/TODO.md +28 -175
  101. package/dist/combobox/button/README.md +8 -3
  102. package/dist/combobox/button/combobox-button-test.svelte +27 -0
  103. package/dist/combobox/button/combobox-button-test.svelte.d.ts +6 -0
  104. package/dist/combobox/button/combobox-button.svelte +10 -11
  105. package/dist/combobox/clear/README.md +21 -0
  106. package/dist/combobox/clear/combobox-clear-test.svelte +34 -0
  107. package/dist/combobox/clear/combobox-clear-test.svelte.d.ts +3 -0
  108. package/dist/combobox/clear/combobox-clear.svelte +61 -0
  109. package/dist/combobox/clear/combobox-clear.svelte.d.ts +9 -0
  110. package/dist/combobox/index.d.ts +5 -3
  111. package/dist/combobox/index.js +5 -3
  112. package/dist/combobox/index.parts.d.ts +2 -0
  113. package/dist/combobox/index.parts.js +2 -0
  114. package/dist/combobox/input/combobox-input.svelte +44 -12
  115. package/dist/combobox/item/combobox-item-implicit-text-test.svelte +1 -1
  116. package/dist/combobox/item/combobox-listboxitem.svelte +14 -11
  117. package/dist/combobox/item-indicator/combobox-item-indicator.svelte +4 -15
  118. package/dist/combobox/list/combobox-listbox.svelte +1 -0
  119. package/dist/combobox/list/combobox-listbox.svelte.d.ts +2 -1
  120. package/dist/combobox/popover/README.md +18 -4
  121. package/dist/combobox/popover/combobox-popover-props-test.svelte +38 -0
  122. package/dist/combobox/popover/combobox-popover-props-test.svelte.d.ts +11 -0
  123. package/dist/combobox/popover/combobox-popover.svelte +166 -23
  124. package/dist/combobox/popover/combobox-popover.svelte.d.ts +3 -3
  125. package/dist/combobox/popover/combobox-scrollable-list-test.svelte +23 -0
  126. package/dist/combobox/popover/combobox-scrollable-list-test.svelte.d.ts +18 -0
  127. package/dist/combobox/root/README.md +1 -0
  128. package/dist/combobox/root/combobox-multiselect-test.svelte +5 -3
  129. package/dist/combobox/root/combobox-multiselect-test.svelte.d.ts +1 -0
  130. package/dist/combobox/root/combobox-numeric-string-id-test.svelte +1 -1
  131. package/dist/combobox/root/combobox-test.svelte +23 -4
  132. package/dist/combobox/root/combobox-test.svelte.d.ts +2 -0
  133. package/dist/combobox/root/combobox.svelte +119 -13
  134. package/dist/combobox/root/combobox.svelte.d.ts +1 -0
  135. package/dist/combobox/root/context.d.ts +19 -1
  136. package/dist/combobox/tag-remove/combobox-tag-remove.svelte +3 -2
  137. package/dist/combobox/trigger/README.md +21 -0
  138. package/dist/combobox/trigger/combobox-trigger.svelte +56 -0
  139. package/dist/combobox/trigger/combobox-trigger.svelte.d.ts +9 -0
  140. package/dist/datepicker/README.md +100 -0
  141. package/dist/datepicker/TODO.md +28 -0
  142. package/dist/datepicker/calendar/README.md +19 -0
  143. package/dist/datepicker/calendar/date-picker-calendar-unsafe-props-test.svelte +60 -0
  144. package/dist/datepicker/calendar/date-picker-calendar-unsafe-props-test.svelte.d.ts +3 -0
  145. package/dist/datepicker/calendar/date-picker-calendar.svelte +65 -0
  146. package/dist/datepicker/calendar/date-picker-calendar.svelte.d.ts +10 -0
  147. package/dist/datepicker/index.d.ts +18 -0
  148. package/dist/datepicker/index.js +18 -0
  149. package/dist/datepicker/index.parts.d.ts +14 -0
  150. package/dist/datepicker/index.parts.js +14 -0
  151. package/dist/datepicker/input/README.md +15 -0
  152. package/dist/datepicker/input/date-picker-input.svelte +108 -0
  153. package/dist/datepicker/input/date-picker-input.svelte.d.ts +11 -0
  154. package/dist/datepicker/internal/strict-props.d.ts +2 -0
  155. package/dist/datepicker/internal/strict-props.js +28 -0
  156. package/dist/datepicker/popover/README.md +20 -0
  157. package/dist/datepicker/popover/date-picker-popover-handler-test.svelte +57 -0
  158. package/dist/datepicker/popover/date-picker-popover-handler-test.svelte.d.ts +3 -0
  159. package/dist/datepicker/popover/date-picker-popover-unsafe-props-test.svelte +45 -0
  160. package/dist/datepicker/popover/date-picker-popover-unsafe-props-test.svelte.d.ts +18 -0
  161. package/dist/datepicker/popover/date-picker-popover.svelte +87 -0
  162. package/dist/datepicker/popover/date-picker-popover.svelte.d.ts +7 -0
  163. package/dist/datepicker/root/README.md +38 -0
  164. package/dist/datepicker/root/context.d.ts +43 -0
  165. package/dist/datepicker/root/context.js +15 -0
  166. package/dist/datepicker/root/date-picker-bindable-empty-test.svelte +24 -0
  167. package/dist/datepicker/root/date-picker-bindable-empty-test.svelte.d.ts +3 -0
  168. package/dist/datepicker/root/date-picker-bindable-test.svelte +41 -0
  169. package/dist/datepicker/root/date-picker-bindable-test.svelte.d.ts +3 -0
  170. package/dist/datepicker/root/date-picker-empty-test.svelte +47 -0
  171. package/dist/datepicker/root/date-picker-empty-test.svelte.d.ts +3 -0
  172. package/dist/datepicker/root/date-picker-locale-typing-test.svelte +47 -0
  173. package/dist/datepicker/root/date-picker-locale-typing-test.svelte.d.ts +3 -0
  174. package/dist/datepicker/root/date-picker-open-cancel-test.svelte +54 -0
  175. package/dist/datepicker/root/date-picker-open-cancel-test.svelte.d.ts +8 -0
  176. package/dist/datepicker/root/date-picker-root.svelte +495 -0
  177. package/dist/datepicker/root/date-picker-root.svelte.d.ts +24 -0
  178. package/dist/datepicker/root/date-picker-test.svelte +86 -0
  179. package/dist/datepicker/root/date-picker-test.svelte.d.ts +13 -0
  180. package/dist/datepicker/root/date-utils.d.ts +17 -0
  181. package/dist/datepicker/root/date-utils.js +138 -0
  182. package/dist/datepicker/root/draft-evaluation.d.ts +13 -0
  183. package/dist/datepicker/root/draft-evaluation.js +56 -0
  184. package/dist/datepicker/root/focus-controller.d.ts +3 -0
  185. package/dist/datepicker/root/focus-controller.js +15 -0
  186. package/dist/datepicker/root/open-change.d.ts +5 -0
  187. package/dist/datepicker/root/open-change.js +13 -0
  188. package/dist/datepicker/root/open-controller.d.ts +7 -0
  189. package/dist/datepicker/root/open-controller.js +15 -0
  190. package/dist/datepicker/root/segment-controller.d.ts +8 -0
  191. package/dist/datepicker/root/segment-controller.js +53 -0
  192. package/dist/datepicker/root/segment-state.d.ts +18 -0
  193. package/dist/datepicker/root/segment-state.js +134 -0
  194. package/dist/datepicker/root/value-commit.d.ts +4 -0
  195. package/dist/datepicker/root/value-commit.js +8 -0
  196. package/dist/datepicker/segment/README.md +14 -0
  197. package/dist/datepicker/segment/date-picker-segment.svelte +319 -0
  198. package/dist/datepicker/segment/date-picker-segment.svelte.d.ts +9 -0
  199. package/dist/datepicker/trigger/README.md +14 -0
  200. package/dist/datepicker/trigger/date-picker-trigger.svelte +110 -0
  201. package/dist/datepicker/trigger/date-picker-trigger.svelte.d.ts +9 -0
  202. package/dist/dialog/content/dialog-content.svelte +6 -6
  203. package/dist/dialog/index.d.ts +3 -3
  204. package/dist/dialog/index.js +2 -2
  205. package/dist/dialog/root/context.d.ts +2 -1
  206. package/dist/dialog/root/dialog-root.svelte +9 -2
  207. package/dist/hooks/use-virtual-focus.svelte.js +3 -1
  208. package/dist/index.d.ts +31 -17
  209. package/dist/index.js +31 -17
  210. package/dist/input/README.md +38 -0
  211. package/dist/input/TODO.md +12 -0
  212. package/dist/input/input-test.svelte +43 -0
  213. package/dist/input/input-test.svelte.d.ts +12 -0
  214. package/dist/input/input.svelte +151 -7
  215. package/dist/input/input.svelte.d.ts +8 -2
  216. package/dist/listbox/index.d.ts +3 -3
  217. package/dist/listbox/index.js +3 -3
  218. package/dist/listbox/item/README.md +2 -1
  219. package/dist/listbox/item/listbox-item.svelte +260 -6
  220. package/dist/listbox/item/listbox-item.svelte.d.ts +6 -0
  221. package/dist/listbox/root/context.d.ts +6 -0
  222. package/dist/listbox/root/context.js +23 -13
  223. package/dist/listbox/root/listbox-test.svelte +14 -2
  224. package/dist/listbox/root/listbox-test.svelte.d.ts +1 -0
  225. package/dist/listbox/root/listbox.svelte +49 -2
  226. package/dist/listbox/root/listbox.svelte.d.ts +4 -2
  227. package/dist/popover/README.md +10 -0
  228. package/dist/popover/content/README.md +11 -0
  229. package/dist/popover/content/popover-content-standalone-test.svelte +28 -0
  230. package/dist/popover/content/popover-content-standalone-test.svelte.d.ts +6 -0
  231. package/dist/popover/content/popover-content-test.svelte +32 -2
  232. package/dist/popover/content/popover-content-test.svelte.d.ts +3 -1
  233. package/dist/popover/content/popover-content.svelte +277 -24
  234. package/dist/popover/content/popover-content.svelte.d.ts +5 -1
  235. package/dist/popover/index.d.ts +3 -3
  236. package/dist/popover/index.js +3 -5
  237. package/dist/popover/root/README.md +10 -15
  238. package/dist/popover/root/context.d.ts +16 -7
  239. package/dist/popover/root/context.js +0 -2
  240. package/dist/popover/root/focus-state.d.ts +4 -0
  241. package/dist/popover/root/focus-state.js +33 -0
  242. package/dist/popover/root/popover-root.svelte +90 -17
  243. package/dist/popover/root/popover-root.svelte.d.ts +2 -1
  244. package/dist/popover/root/popover-test.svelte +2 -1
  245. package/dist/popover/root/popover-test.svelte.d.ts +2 -1
  246. package/dist/popover/trigger/popover-trigger-button.svelte +8 -7
  247. package/dist/popover/trigger/popover-trigger.svelte +14 -5
  248. package/dist/portal/portal.svelte +3 -1
  249. package/dist/primitives/click-outside.d.ts +1 -1
  250. package/dist/primitives/click-outside.js +1 -1
  251. package/dist/primitives/floating.js +12 -4
  252. package/dist/primitives/focus-trap.d.ts +7 -2
  253. package/dist/primitives/focus-trap.js +50 -17
  254. package/dist/primitives/index.d.ts +1 -0
  255. package/dist/primitives/index.js +1 -0
  256. package/dist/primitives/input-modality.d.ts +7 -0
  257. package/dist/primitives/input-modality.js +125 -0
  258. package/dist/primitives/keyboard-navigation.d.ts +1 -0
  259. package/dist/primitives/keyboard-navigation.js +17 -0
  260. package/dist/table/IMPLEMENTATION_NOTES.md +9 -0
  261. package/dist/table/PLAN-HIDDEN-COLUMNS.md +152 -0
  262. package/dist/table/PLAN.md +1336 -0
  263. package/dist/table/README.md +143 -0
  264. package/dist/table/SELECTION_CHECKBOX_PLAN.md +234 -0
  265. package/dist/table/TODO.md +138 -0
  266. package/dist/table/body/README.md +26 -0
  267. package/dist/table/body/table-body.svelte +24 -0
  268. package/dist/table/body/table-body.svelte.d.ts +4 -0
  269. package/dist/table/cell/README.md +27 -0
  270. package/dist/table/cell/table-cell.svelte +265 -0
  271. package/dist/table/cell/table-cell.svelte.d.ts +4 -0
  272. package/dist/table/checkbox/README.md +40 -0
  273. package/dist/table/checkbox/table-checkbox-test.svelte +128 -0
  274. package/dist/table/checkbox/table-checkbox-test.svelte.d.ts +18 -0
  275. package/dist/table/checkbox/table-checkbox.svelte +235 -0
  276. package/dist/table/checkbox/table-checkbox.svelte.d.ts +4 -0
  277. package/dist/table/checkbox-indicator/README.md +31 -0
  278. package/dist/table/checkbox-indicator/table-checkbox-indicator.svelte +15 -0
  279. package/dist/table/checkbox-indicator/table-checkbox-indicator.svelte.d.ts +4 -0
  280. package/dist/table/column/README.md +36 -0
  281. package/dist/table/column/table-column.svelte +79 -0
  282. package/dist/table/column/table-column.svelte.d.ts +4 -0
  283. package/dist/table/column-header-cell/README.md +30 -0
  284. package/dist/table/column-header-cell/table-column-header-cell.svelte +271 -0
  285. package/dist/table/column-header-cell/table-column-header-cell.svelte.d.ts +4 -0
  286. package/dist/table/column-resizer/README.md +33 -0
  287. package/dist/table/column-resizer/table-column-resizer-fixed-width-test.svelte +57 -0
  288. package/dist/table/column-resizer/table-column-resizer-fixed-width-test.svelte.d.ts +3 -0
  289. package/dist/table/column-resizer/table-column-resizer-freeze-layout-test.svelte +52 -0
  290. package/dist/table/column-resizer/table-column-resizer-freeze-layout-test.svelte.d.ts +3 -0
  291. package/dist/table/column-resizer/table-column-resizer-narrow-min-width-test.svelte +76 -0
  292. package/dist/table/column-resizer/table-column-resizer-narrow-min-width-test.svelte.d.ts +3 -0
  293. package/dist/table/column-resizer/table-column-resizer-overflow-test.svelte +64 -0
  294. package/dist/table/column-resizer/table-column-resizer-overflow-test.svelte.d.ts +3 -0
  295. package/dist/table/column-resizer/table-column-resizer-padded-container-test.svelte +67 -0
  296. package/dist/table/column-resizer/table-column-resizer-padded-container-test.svelte.d.ts +3 -0
  297. package/dist/table/column-resizer/table-column-resizer-sandbox-overflow-test.svelte +87 -0
  298. package/dist/table/column-resizer/table-column-resizer-sandbox-overflow-test.svelte.d.ts +3 -0
  299. package/dist/table/column-resizer/table-column-resizer-selection-column-test.svelte +84 -0
  300. package/dist/table/column-resizer/table-column-resizer-selection-column-test.svelte.d.ts +3 -0
  301. package/dist/table/column-resizer/table-column-resizer-test.svelte +77 -0
  302. package/dist/table/column-resizer/table-column-resizer-test.svelte.d.ts +3 -0
  303. package/dist/table/column-resizer/table-column-resizer-three-column-relative-test.svelte +64 -0
  304. package/dist/table/column-resizer/table-column-resizer-three-column-relative-test.svelte.d.ts +3 -0
  305. package/dist/table/column-resizer/table-column-resizer.svelte +610 -0
  306. package/dist/table/column-resizer/table-column-resizer.svelte.d.ts +4 -0
  307. package/dist/table/empty-state/README.md +27 -0
  308. package/dist/table/empty-state/table-empty-state.svelte +33 -0
  309. package/dist/table/empty-state/table-empty-state.svelte.d.ts +4 -0
  310. package/dist/table/footer/README.md +26 -0
  311. package/dist/table/footer/table-footer.svelte +13 -0
  312. package/dist/table/footer/table-footer.svelte.d.ts +4 -0
  313. package/dist/table/header/README.md +26 -0
  314. package/dist/table/header/table-header.svelte +13 -0
  315. package/dist/table/header/table-header.svelte.d.ts +4 -0
  316. package/dist/table/index.d.ts +18 -0
  317. package/dist/table/index.js +17 -0
  318. package/dist/table/index.parts.d.ts +13 -0
  319. package/dist/table/index.parts.js +13 -0
  320. package/dist/table/root/README.md +66 -0
  321. package/dist/table/root/context.d.ts +228 -0
  322. package/dist/table/root/context.js +2111 -0
  323. package/dist/table/root/table-reorder-test.svelte +64 -0
  324. package/dist/table/root/table-reorder-test.svelte.d.ts +3 -0
  325. package/dist/table/root/table-root.svelte +553 -0
  326. package/dist/table/root/table-root.svelte.d.ts +4 -0
  327. package/dist/table/root/table-test.svelte +206 -0
  328. package/dist/table/root/table-test.svelte.d.ts +29 -0
  329. package/dist/table/row/README.md +29 -0
  330. package/dist/table/row/table-row.svelte +244 -0
  331. package/dist/table/row/table-row.svelte.d.ts +4 -0
  332. package/dist/table/sort-trigger/README.md +45 -0
  333. package/dist/table/sort-trigger/table-sort-trigger.svelte +183 -0
  334. package/dist/table/sort-trigger/table-sort-trigger.svelte.d.ts +4 -0
  335. package/dist/table/types.d.ts +95 -0
  336. package/dist/table/types.js +1 -0
  337. package/dist/table/utils/handle-body-keydown.d.ts +13 -0
  338. package/dist/table/utils/handle-body-keydown.js +67 -0
  339. package/dist/table/utils/visually-hidden-style.d.ts +1 -0
  340. package/dist/table/utils/visually-hidden-style.js +1 -0
  341. package/dist/test-utils/focus-contract.d.ts +3 -0
  342. package/dist/test-utils/focus-contract.js +26 -0
  343. package/dist/timepicker/IMPLEMENTATION_PLAN.md +254 -0
  344. package/dist/timepicker/README.md +97 -0
  345. package/dist/timepicker/TODO.md +86 -0
  346. package/dist/timepicker/clock/README.md +14 -0
  347. package/dist/timepicker/clock/time-picker-clock-test.svelte +45 -0
  348. package/dist/timepicker/clock/time-picker-clock-test.svelte.d.ts +11 -0
  349. package/dist/timepicker/clock/time-picker-clock.svelte +65 -0
  350. package/dist/timepicker/clock/time-picker-clock.svelte.d.ts +10 -0
  351. package/dist/timepicker/index.d.ts +14 -0
  352. package/dist/timepicker/index.js +14 -0
  353. package/dist/timepicker/index.parts.d.ts +8 -0
  354. package/dist/timepicker/index.parts.js +8 -0
  355. package/dist/timepicker/input/README.md +15 -0
  356. package/dist/timepicker/input/time-picker-input-forwarding-test.svelte +40 -0
  357. package/dist/timepicker/input/time-picker-input-forwarding-test.svelte.d.ts +3 -0
  358. package/dist/timepicker/input/time-picker-input.svelte +109 -0
  359. package/dist/timepicker/input/time-picker-input.svelte.d.ts +11 -0
  360. package/dist/timepicker/internal/strict-props.d.ts +4 -0
  361. package/dist/timepicker/internal/strict-props.js +51 -0
  362. package/dist/timepicker/popover/README.md +20 -0
  363. package/dist/timepicker/popover/time-picker-popover-unsafe-props-test.svelte +22 -0
  364. package/dist/timepicker/popover/time-picker-popover-unsafe-props-test.svelte.d.ts +3 -0
  365. package/dist/timepicker/popover/time-picker-popover.svelte +89 -0
  366. package/dist/timepicker/popover/time-picker-popover.svelte.d.ts +7 -0
  367. package/dist/timepicker/root/README.md +42 -0
  368. package/dist/timepicker/root/context.d.ts +51 -0
  369. package/dist/timepicker/root/context.js +15 -0
  370. package/dist/timepicker/root/time-picker-12h-test.svelte +22 -0
  371. package/dist/timepicker/root/time-picker-12h-test.svelte.d.ts +3 -0
  372. package/dist/timepicker/root/time-picker-bindable-test.svelte +25 -0
  373. package/dist/timepicker/root/time-picker-bindable-test.svelte.d.ts +3 -0
  374. package/dist/timepicker/root/time-picker-empty-test.svelte +20 -0
  375. package/dist/timepicker/root/time-picker-empty-test.svelte.d.ts +3 -0
  376. package/dist/timepicker/root/time-picker-root.svelte +625 -0
  377. package/dist/timepicker/root/time-picker-root.svelte.d.ts +28 -0
  378. package/dist/timepicker/root/time-picker-test.svelte +72 -0
  379. package/dist/timepicker/root/time-picker-test.svelte.d.ts +15 -0
  380. package/dist/timepicker/root/time-utils.d.ts +1 -0
  381. package/dist/timepicker/root/time-utils.js +3 -0
  382. package/dist/timepicker/segment/README.md +14 -0
  383. package/dist/timepicker/segment/time-picker-segment.svelte +365 -0
  384. package/dist/timepicker/segment/time-picker-segment.svelte.d.ts +9 -0
  385. package/dist/timepicker/trigger/README.md +14 -0
  386. package/dist/timepicker/trigger/time-picker-trigger-forwarding-test.svelte +35 -0
  387. package/dist/timepicker/trigger/time-picker-trigger-forwarding-test.svelte.d.ts +3 -0
  388. package/dist/timepicker/trigger/time-picker-trigger.svelte +122 -0
  389. package/dist/timepicker/trigger/time-picker-trigger.svelte.d.ts +9 -0
  390. package/dist/utils/date-only.d.ts +11 -0
  391. package/dist/utils/date-only.js +53 -0
  392. package/dist/utils/index.d.ts +1 -0
  393. package/dist/utils/index.js +1 -0
  394. package/package.json +31 -1
@@ -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
 
@@ -57,6 +56,7 @@
57
56
 
58
57
  // Normalized input for filtering comparison
59
58
  const normalizedInput = $derived(ctx.inputValue.trim().toLowerCase());
59
+ const isDisabled = $derived(Boolean(props.disabled) || ctx.isDisabled);
60
60
 
61
61
  // Automatic filtering: if text is not resolved yet, keep item visible until mount resolves it.
62
62
  const isVisible = $derived(
@@ -67,6 +67,7 @@
67
67
 
68
68
  // Virtual focus from ComboBox context
69
69
  const isFocused = $derived(ctx.focusedItemId === id);
70
+ const isFocusVisible = $derived(isFocused && ctx.isFocusVisible);
70
71
 
71
72
  // Generate unique ID using instanceId
72
73
  const uniqueId = $derived(`combobox-item-${ctx.instanceId}-${id}`);
@@ -77,14 +78,15 @@
77
78
  // Reactive registration: register when visible, unregister when hidden
78
79
  $effect(() => {
79
80
  const visible = isVisible;
81
+ const disabled = isDisabled;
80
82
  const label = effectiveTextValue || String(id);
81
83
  const itemId = id;
82
84
 
83
85
  untrack(() => {
84
- if (visible && !isRegistered) {
86
+ if (visible && !disabled && !isRegistered) {
85
87
  ctx.registerItem(itemId, label);
86
88
  isRegistered = true;
87
- } else if (!visible && isRegistered) {
89
+ } else if ((!visible || disabled) && isRegistered) {
88
90
  ctx.unregisterItem(itemId);
89
91
  isRegistered = false;
90
92
  }
@@ -109,8 +111,14 @@
109
111
 
110
112
  // Custom select handler that uses ComboBox context
111
113
  function handleSelect(itemId: string | number, label: string) {
114
+ ctx.setFocusedItemId(itemId);
112
115
  ctx.select(itemId, label);
113
116
  }
117
+
118
+ function handleHoverStart(itemId: string | number) {
119
+ ctx.setFocusVisible(false);
120
+ ctx.setFocusedItemId(itemId);
121
+ }
114
122
  </script>
115
123
 
116
124
  {#if isVisible}
@@ -121,16 +129,11 @@
121
129
  customId={uniqueId}
122
130
  disableFocusHandling={true}
123
131
  isFocusedOverride={isFocused}
132
+ isFocusVisibleOverride={isFocusVisible}
124
133
  onItemSelect={handleSelect}
125
134
  onResolvedTextValue={handleResolvedTextValue}
135
+ onItemHoverStart={handleHoverStart}
126
136
  scrollOnFocus={true}
127
137
  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
138
  />
136
139
  {/if}
@@ -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}
@@ -73,4 +73,5 @@
73
73
  value={ctx.selectedValue}
74
74
  onChange={handleSelectionChange}
75
75
  aria-label={ariaLabel}
76
+ disableFocusHandling={true}
76
77
  />
@@ -14,10 +14,11 @@ declare function $$render<T extends object = object>(): {
14
14
  id?: string;
15
15
  'aria-label'?: string;
16
16
  onChange?: ((value: Set<string | number>) => void) | undefined;
17
+ disableFocusHandling?: boolean;
17
18
  } & {
18
19
  context?: ListBoxContext;
19
20
  element?: HTMLElement;
20
- }, "selectionMode" | "selectionBehavior" | "id" | "value" | "defaultValue" | "onChange" | "items" | "children" | "context" | "element"> & {
21
+ }, "children" | "value" | "id" | "element" | "selectionMode" | "selectionBehavior" | "defaultValue" | "onChange" | "items" | "context"> & {
21
22
  /** Optional items for dynamic rendering - overrides items from ComboBox context */
22
23
  items?: Iterable<T>;
23
24
  /** Content of the listbox. Receives item in dynamic mode. */
@@ -7,7 +7,21 @@
7
7
  Name: `ComboBox.Popover`
8
8
  Description: Floating container for combobox options. Internally composes `Popover.Root` and `Popover.Content` in non-modal mode.
9
9
 
10
- | Prop | Type | Default | Description |
11
- | ---------- | --------- | ----------- | ------------------------------------------- |
12
- | `class` | `string` | `''` | CSS class names for the floating panel. |
13
- | `children` | `Snippet` | `undefined` | Popover content, typically `ComboBox.List`. |
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;
@@ -11,6 +11,7 @@ Description: State container for combobox behavior, including open state, input
11
11
  | ------------------- | ------------------------------------------ | -------------------------------- | ----------------------------------------------------------- |
12
12
  | `id` | `string` | `$props.id()` | Stable id used to derive internal ARIA ids. |
13
13
  | `isDisabled` | `boolean` | `false` | Disables all user interaction. |
14
+ | `isPending` | `boolean` | `false` | Exposes busy async state on the root via `data-pending`. |
14
15
  | `isReadOnly` | `boolean` | `false` | Keeps the component interactive but prevents value changes. |
15
16
  | `value` | `string \| number \| (string \| number)[]` | `undefined` | Controlled selection value. Supports `bind:value`. |
16
17
  | `defaultValue` | `string \| number \| (string \| number)[]` | `undefined` | Initial selection value in uncontrolled mode. |
@@ -7,6 +7,7 @@
7
7
  onValueChange?: (value: (string | number)[]) => void;
8
8
  trigger?: 'focus' | 'input' | 'press';
9
9
  closeOnSelect?: boolean;
10
+ disabledIds?: string[];
10
11
  }
11
12
 
12
13
  let {
@@ -20,7 +21,8 @@
20
21
  value = $bindable([]),
21
22
  onValueChange,
22
23
  trigger = 'press',
23
- closeOnSelect = false
24
+ closeOnSelect = false,
25
+ disabledIds = []
24
26
  }: Props = $props();
25
27
 
26
28
  function handleChange(newValue: string | number | (string | number)[] | undefined) {
@@ -47,13 +49,13 @@
47
49
  {/snippet}
48
50
  </ComboBox.Tags>
49
51
  <ComboBox.Input placeholder="Search fruits..." />
50
- <ComboBox.Button>▼</ComboBox.Button>
52
+ <ComboBox.Trigger>▼</ComboBox.Trigger>
51
53
  </div>
52
54
 
53
55
  <ComboBox.Popover>
54
56
  <ComboBox.List>
55
57
  {#each items as item (item.id)}
56
- <ComboBox.Item id={item.id} textValue={item.name}>
58
+ <ComboBox.Item id={item.id} textValue={item.name} disabled={disabledIds.includes(item.id)}>
57
59
  {item.name}
58
60
  <ComboBox.ItemIndicator />
59
61
  </ComboBox.Item>
@@ -7,6 +7,7 @@ interface Props {
7
7
  onValueChange?: (value: (string | number)[]) => void;
8
8
  trigger?: 'focus' | 'input' | 'press';
9
9
  closeOnSelect?: boolean;
10
+ disabledIds?: string[];
10
11
  }
11
12
  declare const ComboboxMultiselectTest: import("svelte").Component<Props, {}, "value">;
12
13
  type ComboboxMultiselectTest = ReturnType<typeof ComboboxMultiselectTest>;
@@ -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,22 @@
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';
10
+ disabledIds?: string[];
9
11
  };
10
12
 
11
- let { id, isDisabled = false, isReadOnly = false, trigger = 'press' }: Props = $props();
13
+ let {
14
+ id,
15
+ isDisabled = false,
16
+ isPending = false,
17
+ isReadOnly = false,
18
+ trigger = 'press',
19
+ disabledIds = []
20
+ }: Props = $props();
21
+
22
+ let selectedValue = $state<string | number | undefined>();
12
23
 
13
24
  const countries = [
14
25
  { id: 'ar', name: 'Argentina' },
@@ -24,14 +35,18 @@
24
35
  ];
25
36
  </script>
26
37
 
27
- <ComboBox.Root {id} {isDisabled} {isReadOnly} {trigger}>
38
+ <ComboBox.Root {id} {isDisabled} {isPending} {isReadOnly} {trigger} bind:value={selectedValue}>
28
39
  <ComboBox.Input placeholder="Search countries..." />
29
- <ComboBox.Button />
40
+ <ComboBox.Trigger />
30
41
 
31
42
  <ComboBox.Popover>
32
43
  <ComboBox.List emptyPlaceholder="No countries found">
33
44
  {#each countries as country (country.id)}
34
- <ComboBox.Item id={country.id} textValue={country.name}>
45
+ <ComboBox.Item
46
+ id={country.id}
47
+ textValue={country.name}
48
+ disabled={disabledIds.includes(country.id)}
49
+ >
35
50
  {country.name}
36
51
  </ComboBox.Item>
37
52
  {/each}
@@ -39,5 +54,9 @@
39
54
  </ComboBox.Popover>
40
55
  </ComboBox.Root>
41
56
 
57
+ <output data-selected-value
58
+ >{selectedValue === undefined ? 'undefined' : String(selectedValue)}</output
59
+ >
60
+
42
61
  <!-- Button outside the combobox for testing blur behavior -->
43
62
  <button type="button" data-testid="outside-button">Outside</button>
@@ -1,8 +1,10 @@
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';
7
+ disabledIds?: string[];
6
8
  };
7
9
  declare const ComboboxTest: import("svelte").Component<Props, {}, "">;
8
10
  type ComboboxTest = ReturnType<typeof ComboboxTest>;