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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (407) hide show
  1. package/dist/FOCUS_STATE_CONTRACT.md +63 -0
  2. package/dist/FOCUS_STATE_REVIEW_TEMPLATE.md +70 -0
  3. package/dist/button/README.md +48 -0
  4. package/dist/button/TODO.md +13 -0
  5. package/dist/button/index.d.ts +5 -0
  6. package/dist/button/index.js +4 -0
  7. package/dist/button/index.parts.d.ts +1 -0
  8. package/dist/button/index.parts.js +1 -0
  9. package/dist/button/root/README.md +43 -0
  10. package/dist/button/root/button-root.svelte +393 -0
  11. package/dist/button/root/button-root.svelte.d.ts +21 -0
  12. package/dist/button/root/button-test.svelte +76 -0
  13. package/dist/button/root/button-test.svelte.d.ts +11 -0
  14. package/dist/calendar/README.md +2 -1
  15. package/dist/calendar/TODO.md +21 -107
  16. package/dist/calendar/body-cell/README.md +15 -0
  17. package/dist/calendar/body-cell/calendar-body-cell.svelte +116 -41
  18. package/dist/calendar/grid/README.md +13 -0
  19. package/dist/calendar/grid-body/README.md +13 -0
  20. package/dist/calendar/grid-header/README.md +13 -0
  21. package/dist/calendar/header-cell/README.md +14 -0
  22. package/dist/calendar/heading/README.md +13 -0
  23. package/dist/calendar/index.d.ts +3 -3
  24. package/dist/calendar/index.js +3 -3
  25. package/dist/calendar/root/README.md +24 -0
  26. package/dist/calendar/root/calendar-root-test.svelte +4 -0
  27. package/dist/calendar/root/calendar-root-test.svelte.d.ts +1 -0
  28. package/dist/calendar/root/calendar-root.svelte +3 -0
  29. package/dist/calendar/root/calendar-root.svelte.d.ts +1 -0
  30. package/dist/calendar/root/context.d.ts +4 -0
  31. package/dist/calendar/root/context.js +28 -25
  32. package/dist/calendar/root/date-utils.d.ts +1 -1
  33. package/dist/calendar/root/date-utils.js +16 -26
  34. package/dist/calendar/trigger-next/README.md +14 -0
  35. package/dist/calendar/trigger-next/calendar-trigger-next.svelte +9 -4
  36. package/dist/calendar/trigger-next/calendar-trigger-next.svelte.d.ts +2 -1
  37. package/dist/calendar/trigger-previous/README.md +14 -0
  38. package/dist/calendar/trigger-previous/calendar-trigger-previous.svelte +9 -4
  39. package/dist/calendar/trigger-previous/calendar-trigger-previous.svelte.d.ts +2 -1
  40. package/dist/checkbox/README.md +53 -0
  41. package/dist/checkbox/TODO.md +16 -0
  42. package/dist/checkbox/index.d.ts +6 -0
  43. package/dist/checkbox/index.js +6 -0
  44. package/dist/checkbox/index.parts.d.ts +2 -0
  45. package/dist/checkbox/index.parts.js +2 -0
  46. package/dist/checkbox/indicator/README.md +23 -0
  47. package/dist/checkbox/indicator/checkbox-indicator.svelte +43 -0
  48. package/dist/checkbox/indicator/checkbox-indicator.svelte.d.ts +10 -0
  49. package/dist/checkbox/root/README.md +47 -0
  50. package/dist/checkbox/root/checkbox-label-test.svelte +10 -0
  51. package/dist/checkbox/root/checkbox-label-test.svelte.d.ts +18 -0
  52. package/dist/checkbox/root/checkbox-root.svelte +386 -0
  53. package/dist/checkbox/root/checkbox-root.svelte.d.ts +29 -0
  54. package/dist/checkbox/root/checkbox-test.svelte +59 -0
  55. package/dist/checkbox/root/checkbox-test.svelte.d.ts +18 -0
  56. package/dist/checkbox/root/context.d.ts +21 -0
  57. package/dist/checkbox/root/context.js +15 -0
  58. package/dist/clock/README.md +75 -0
  59. package/dist/clock/axis/README.md +24 -0
  60. package/dist/clock/axis/clock-axis.svelte +37 -0
  61. package/dist/clock/axis/clock-axis.svelte.d.ts +8 -0
  62. package/dist/clock/hooks/use-wheel-scroll.svelte.d.ts +16 -0
  63. package/dist/clock/hooks/use-wheel-scroll.svelte.js +336 -0
  64. package/dist/clock/index.d.ts +10 -0
  65. package/dist/clock/index.js +10 -0
  66. package/dist/clock/index.parts.d.ts +4 -0
  67. package/dist/clock/index.parts.js +4 -0
  68. package/dist/clock/root/README.md +38 -0
  69. package/dist/clock/root/clock-root-test.svelte +62 -0
  70. package/dist/clock/root/clock-root-test.svelte.d.ts +14 -0
  71. package/dist/clock/root/clock-root.svelte +329 -0
  72. package/dist/clock/root/clock-root.svelte.d.ts +25 -0
  73. package/dist/clock/root/context.d.ts +22 -0
  74. package/dist/clock/root/context.js +15 -0
  75. package/dist/clock/root/resolve-visible-columns.d.ts +7 -0
  76. package/dist/clock/root/resolve-visible-columns.js +16 -0
  77. package/dist/clock/root/time-utils.d.ts +48 -0
  78. package/dist/clock/root/time-utils.js +314 -0
  79. package/dist/clock/root/wheel-options.d.ts +17 -0
  80. package/dist/clock/root/wheel-options.js +63 -0
  81. package/dist/clock/wheel-column/README.md +25 -0
  82. package/dist/clock/wheel-column/clock-wheel-column-bindable-test.svelte +16 -0
  83. package/dist/clock/wheel-column/clock-wheel-column-bindable-test.svelte.d.ts +3 -0
  84. package/dist/clock/wheel-column/clock-wheel-column-custom-snippet-test.svelte +29 -0
  85. package/dist/clock/wheel-column/clock-wheel-column-custom-snippet-test.svelte.d.ts +6 -0
  86. package/dist/clock/wheel-column/clock-wheel-column-default-height-test.svelte +11 -0
  87. package/dist/clock/wheel-column/clock-wheel-column-default-height-test.svelte.d.ts +3 -0
  88. package/dist/clock/wheel-column/clock-wheel-column-test.svelte +38 -0
  89. package/dist/clock/wheel-column/clock-wheel-column-test.svelte.d.ts +12 -0
  90. package/dist/clock/wheel-column/clock-wheel-column-tp-test.svelte +38 -0
  91. package/dist/clock/wheel-column/clock-wheel-column-tp-test.svelte.d.ts +12 -0
  92. package/dist/clock/wheel-column/clock-wheel-column-untagged-snippet-test.svelte +29 -0
  93. package/dist/clock/wheel-column/clock-wheel-column-untagged-snippet-test.svelte.d.ts +6 -0
  94. package/dist/clock/wheel-column/clock-wheel-column.svelte +499 -0
  95. package/dist/clock/wheel-column/clock-wheel-column.svelte.d.ts +17 -0
  96. package/dist/clock/wheel-item/README.md +17 -0
  97. package/dist/clock/wheel-item/clock-wheel-item.svelte +49 -0
  98. package/dist/clock/wheel-item/clock-wheel-item.svelte.d.ts +17 -0
  99. package/dist/combobox/README.md +8 -2
  100. package/dist/combobox/TODO.md +28 -175
  101. package/dist/combobox/button/README.md +8 -3
  102. package/dist/combobox/button/combobox-button-test.svelte +27 -0
  103. package/dist/combobox/button/combobox-button-test.svelte.d.ts +6 -0
  104. package/dist/combobox/button/combobox-button.svelte +10 -11
  105. package/dist/combobox/clear/README.md +21 -0
  106. package/dist/combobox/clear/combobox-clear-test.svelte +34 -0
  107. package/dist/combobox/clear/combobox-clear-test.svelte.d.ts +3 -0
  108. package/dist/combobox/clear/combobox-clear.svelte +61 -0
  109. package/dist/combobox/clear/combobox-clear.svelte.d.ts +9 -0
  110. package/dist/combobox/index.d.ts +5 -3
  111. package/dist/combobox/index.js +5 -3
  112. package/dist/combobox/index.parts.d.ts +2 -0
  113. package/dist/combobox/index.parts.js +2 -0
  114. package/dist/combobox/input/combobox-input.svelte +44 -12
  115. package/dist/combobox/item/combobox-item-implicit-text-test.svelte +1 -1
  116. package/dist/combobox/item/combobox-listboxitem.svelte +14 -11
  117. package/dist/combobox/item-indicator/combobox-item-indicator.svelte +4 -15
  118. package/dist/combobox/list/combobox-listbox.svelte +1 -0
  119. package/dist/combobox/list/combobox-listbox.svelte.d.ts +2 -1
  120. package/dist/combobox/popover/README.md +18 -4
  121. package/dist/combobox/popover/combobox-popover-props-test.svelte +38 -0
  122. package/dist/combobox/popover/combobox-popover-props-test.svelte.d.ts +11 -0
  123. package/dist/combobox/popover/combobox-popover.svelte +166 -23
  124. package/dist/combobox/popover/combobox-popover.svelte.d.ts +3 -3
  125. package/dist/combobox/popover/combobox-scrollable-list-test.svelte +23 -0
  126. package/dist/combobox/popover/combobox-scrollable-list-test.svelte.d.ts +18 -0
  127. package/dist/combobox/root/README.md +1 -0
  128. package/dist/combobox/root/combobox-multiselect-test.svelte +5 -3
  129. package/dist/combobox/root/combobox-multiselect-test.svelte.d.ts +1 -0
  130. package/dist/combobox/root/combobox-numeric-string-id-test.svelte +1 -1
  131. package/dist/combobox/root/combobox-test.svelte +23 -4
  132. package/dist/combobox/root/combobox-test.svelte.d.ts +2 -0
  133. package/dist/combobox/root/combobox.svelte +119 -13
  134. package/dist/combobox/root/combobox.svelte.d.ts +1 -0
  135. package/dist/combobox/root/context.d.ts +19 -1
  136. package/dist/combobox/tag-remove/combobox-tag-remove.svelte +3 -2
  137. package/dist/combobox/trigger/README.md +21 -0
  138. package/dist/combobox/trigger/combobox-trigger.svelte +56 -0
  139. package/dist/combobox/trigger/combobox-trigger.svelte.d.ts +9 -0
  140. package/dist/datepicker/README.md +100 -0
  141. package/dist/datepicker/TODO.md +28 -0
  142. package/dist/datepicker/calendar/README.md +19 -0
  143. package/dist/datepicker/calendar/date-picker-calendar-unsafe-props-test.svelte +60 -0
  144. package/dist/datepicker/calendar/date-picker-calendar-unsafe-props-test.svelte.d.ts +3 -0
  145. package/dist/datepicker/calendar/date-picker-calendar.svelte +65 -0
  146. package/dist/datepicker/calendar/date-picker-calendar.svelte.d.ts +10 -0
  147. package/dist/datepicker/index.d.ts +18 -0
  148. package/dist/datepicker/index.js +18 -0
  149. package/dist/datepicker/index.parts.d.ts +14 -0
  150. package/dist/datepicker/index.parts.js +14 -0
  151. package/dist/datepicker/input/README.md +15 -0
  152. package/dist/datepicker/input/date-picker-input.svelte +108 -0
  153. package/dist/datepicker/input/date-picker-input.svelte.d.ts +11 -0
  154. package/dist/datepicker/internal/strict-props.d.ts +2 -0
  155. package/dist/datepicker/internal/strict-props.js +28 -0
  156. package/dist/datepicker/popover/README.md +20 -0
  157. package/dist/datepicker/popover/date-picker-popover-handler-test.svelte +57 -0
  158. package/dist/datepicker/popover/date-picker-popover-handler-test.svelte.d.ts +3 -0
  159. package/dist/datepicker/popover/date-picker-popover-unsafe-props-test.svelte +45 -0
  160. package/dist/datepicker/popover/date-picker-popover-unsafe-props-test.svelte.d.ts +18 -0
  161. package/dist/datepicker/popover/date-picker-popover.svelte +87 -0
  162. package/dist/datepicker/popover/date-picker-popover.svelte.d.ts +7 -0
  163. package/dist/datepicker/root/README.md +38 -0
  164. package/dist/datepicker/root/context.d.ts +43 -0
  165. package/dist/datepicker/root/context.js +15 -0
  166. package/dist/datepicker/root/date-picker-bindable-empty-test.svelte +24 -0
  167. package/dist/datepicker/root/date-picker-bindable-empty-test.svelte.d.ts +3 -0
  168. package/dist/datepicker/root/date-picker-bindable-test.svelte +41 -0
  169. package/dist/datepicker/root/date-picker-bindable-test.svelte.d.ts +3 -0
  170. package/dist/datepicker/root/date-picker-empty-test.svelte +47 -0
  171. package/dist/datepicker/root/date-picker-empty-test.svelte.d.ts +3 -0
  172. package/dist/datepicker/root/date-picker-locale-typing-test.svelte +47 -0
  173. package/dist/datepicker/root/date-picker-locale-typing-test.svelte.d.ts +3 -0
  174. package/dist/datepicker/root/date-picker-open-cancel-test.svelte +54 -0
  175. package/dist/datepicker/root/date-picker-open-cancel-test.svelte.d.ts +8 -0
  176. package/dist/datepicker/root/date-picker-root.svelte +495 -0
  177. package/dist/datepicker/root/date-picker-root.svelte.d.ts +24 -0
  178. package/dist/datepicker/root/date-picker-test.svelte +86 -0
  179. package/dist/datepicker/root/date-picker-test.svelte.d.ts +13 -0
  180. package/dist/datepicker/root/date-utils.d.ts +17 -0
  181. package/dist/datepicker/root/date-utils.js +138 -0
  182. package/dist/datepicker/root/draft-evaluation.d.ts +13 -0
  183. package/dist/datepicker/root/draft-evaluation.js +56 -0
  184. package/dist/datepicker/root/focus-controller.d.ts +3 -0
  185. package/dist/datepicker/root/focus-controller.js +15 -0
  186. package/dist/datepicker/root/open-change.d.ts +5 -0
  187. package/dist/datepicker/root/open-change.js +13 -0
  188. package/dist/datepicker/root/open-controller.d.ts +7 -0
  189. package/dist/datepicker/root/open-controller.js +15 -0
  190. package/dist/datepicker/root/segment-controller.d.ts +8 -0
  191. package/dist/datepicker/root/segment-controller.js +53 -0
  192. package/dist/datepicker/root/segment-state.d.ts +18 -0
  193. package/dist/datepicker/root/segment-state.js +134 -0
  194. package/dist/datepicker/root/value-commit.d.ts +4 -0
  195. package/dist/datepicker/root/value-commit.js +8 -0
  196. package/dist/datepicker/segment/README.md +14 -0
  197. package/dist/datepicker/segment/date-picker-segment.svelte +319 -0
  198. package/dist/datepicker/segment/date-picker-segment.svelte.d.ts +9 -0
  199. package/dist/datepicker/trigger/README.md +14 -0
  200. package/dist/datepicker/trigger/date-picker-trigger.svelte +110 -0
  201. package/dist/datepicker/trigger/date-picker-trigger.svelte.d.ts +9 -0
  202. package/dist/dialog/content/dialog-content.svelte +6 -6
  203. package/dist/dialog/index.d.ts +3 -3
  204. package/dist/dialog/index.js +2 -2
  205. package/dist/dialog/root/context.d.ts +2 -1
  206. package/dist/dialog/root/dialog-root.svelte +9 -2
  207. package/dist/dialog/trigger/dialog-trigger.svelte +3 -0
  208. package/dist/hooks/use-virtual-focus.svelte.js +3 -1
  209. package/dist/index.d.ts +31 -17
  210. package/dist/index.js +31 -17
  211. package/dist/input/README.md +38 -0
  212. package/dist/input/TODO.md +12 -0
  213. package/dist/input/input-test.svelte +43 -0
  214. package/dist/input/input-test.svelte.d.ts +12 -0
  215. package/dist/input/input.svelte +151 -7
  216. package/dist/input/input.svelte.d.ts +8 -2
  217. package/dist/listbox/index.d.ts +3 -3
  218. package/dist/listbox/index.js +3 -3
  219. package/dist/listbox/item/README.md +2 -1
  220. package/dist/listbox/item/listbox-item.svelte +260 -6
  221. package/dist/listbox/item/listbox-item.svelte.d.ts +6 -0
  222. package/dist/listbox/root/context.d.ts +6 -0
  223. package/dist/listbox/root/context.js +23 -13
  224. package/dist/listbox/root/listbox-test.svelte +14 -2
  225. package/dist/listbox/root/listbox-test.svelte.d.ts +1 -0
  226. package/dist/listbox/root/listbox.svelte +49 -2
  227. package/dist/listbox/root/listbox.svelte.d.ts +4 -2
  228. package/dist/popover/README.md +10 -0
  229. package/dist/popover/content/README.md +11 -0
  230. package/dist/popover/content/popover-content-controlled-close-test.svelte +30 -0
  231. package/dist/popover/content/popover-content-controlled-close-test.svelte.d.ts +3 -0
  232. package/dist/popover/content/popover-content-standalone-test.svelte +28 -0
  233. package/dist/popover/content/popover-content-standalone-test.svelte.d.ts +6 -0
  234. package/dist/popover/content/popover-content-test.svelte +32 -2
  235. package/dist/popover/content/popover-content-test.svelte.d.ts +3 -1
  236. package/dist/popover/content/popover-content.svelte +315 -24
  237. package/dist/popover/content/popover-content.svelte.d.ts +5 -1
  238. package/dist/popover/index.d.ts +3 -3
  239. package/dist/popover/index.js +3 -5
  240. package/dist/popover/root/README.md +10 -15
  241. package/dist/popover/root/context.d.ts +16 -7
  242. package/dist/popover/root/context.js +0 -2
  243. package/dist/popover/root/focus-state.d.ts +4 -0
  244. package/dist/popover/root/focus-state.js +33 -0
  245. package/dist/popover/root/popover-root.svelte +90 -17
  246. package/dist/popover/root/popover-root.svelte.d.ts +2 -1
  247. package/dist/popover/root/popover-test.svelte +2 -1
  248. package/dist/popover/root/popover-test.svelte.d.ts +2 -1
  249. package/dist/popover/trigger/popover-trigger-button-root-test.svelte +17 -0
  250. package/dist/popover/trigger/popover-trigger-button-root-test.svelte.d.ts +18 -0
  251. package/dist/popover/trigger/popover-trigger-button.svelte +9 -7
  252. package/dist/popover/trigger/popover-trigger.svelte +17 -5
  253. package/dist/portal/portal.svelte +3 -1
  254. package/dist/primitives/click-outside.d.ts +1 -1
  255. package/dist/primitives/click-outside.js +1 -1
  256. package/dist/primitives/floating.js +12 -4
  257. package/dist/primitives/focus-trap.d.ts +7 -2
  258. package/dist/primitives/focus-trap.js +50 -17
  259. package/dist/primitives/index.d.ts +1 -0
  260. package/dist/primitives/index.js +1 -0
  261. package/dist/primitives/input-modality.d.ts +7 -0
  262. package/dist/primitives/input-modality.js +125 -0
  263. package/dist/primitives/keyboard-navigation.d.ts +1 -0
  264. package/dist/primitives/keyboard-navigation.js +17 -0
  265. package/dist/table/IMPLEMENTATION_NOTES.md +9 -0
  266. package/dist/table/PLAN-HIDDEN-COLUMNS.md +152 -0
  267. package/dist/table/PLAN.md +1336 -0
  268. package/dist/table/README.md +143 -0
  269. package/dist/table/SELECTION_CHECKBOX_PLAN.md +234 -0
  270. package/dist/table/TODO.md +138 -0
  271. package/dist/table/body/README.md +39 -0
  272. package/dist/table/body/table-body-items-test.svelte +45 -0
  273. package/dist/table/body/table-body-items-test.svelte.d.ts +18 -0
  274. package/dist/table/body/table-body.svelte +171 -0
  275. package/dist/table/body/table-body.svelte.d.ts +45 -0
  276. package/dist/table/cell/README.md +27 -0
  277. package/dist/table/cell/table-cell.svelte +253 -0
  278. package/dist/table/cell/table-cell.svelte.d.ts +4 -0
  279. package/dist/table/checkbox/README.md +40 -0
  280. package/dist/table/checkbox/table-checkbox-test.svelte +170 -0
  281. package/dist/table/checkbox/table-checkbox-test.svelte.d.ts +22 -0
  282. package/dist/table/checkbox/table-checkbox.svelte +235 -0
  283. package/dist/table/checkbox/table-checkbox.svelte.d.ts +4 -0
  284. package/dist/table/checkbox-indicator/README.md +31 -0
  285. package/dist/table/checkbox-indicator/table-checkbox-indicator.svelte +15 -0
  286. package/dist/table/checkbox-indicator/table-checkbox-indicator.svelte.d.ts +4 -0
  287. package/dist/table/column/README.md +36 -0
  288. package/dist/table/column/table-column.svelte +79 -0
  289. package/dist/table/column/table-column.svelte.d.ts +4 -0
  290. package/dist/table/column-header-cell/README.md +30 -0
  291. package/dist/table/column-header-cell/table-column-header-cell.svelte +271 -0
  292. package/dist/table/column-header-cell/table-column-header-cell.svelte.d.ts +4 -0
  293. package/dist/table/column-resizer/README.md +33 -0
  294. package/dist/table/column-resizer/table-column-resizer-fixed-width-test.svelte +57 -0
  295. package/dist/table/column-resizer/table-column-resizer-fixed-width-test.svelte.d.ts +3 -0
  296. package/dist/table/column-resizer/table-column-resizer-freeze-layout-test.svelte +52 -0
  297. package/dist/table/column-resizer/table-column-resizer-freeze-layout-test.svelte.d.ts +3 -0
  298. package/dist/table/column-resizer/table-column-resizer-narrow-min-width-test.svelte +76 -0
  299. package/dist/table/column-resizer/table-column-resizer-narrow-min-width-test.svelte.d.ts +3 -0
  300. package/dist/table/column-resizer/table-column-resizer-overflow-test.svelte +64 -0
  301. package/dist/table/column-resizer/table-column-resizer-overflow-test.svelte.d.ts +3 -0
  302. package/dist/table/column-resizer/table-column-resizer-padded-container-test.svelte +67 -0
  303. package/dist/table/column-resizer/table-column-resizer-padded-container-test.svelte.d.ts +3 -0
  304. package/dist/table/column-resizer/table-column-resizer-sandbox-overflow-test.svelte +87 -0
  305. package/dist/table/column-resizer/table-column-resizer-sandbox-overflow-test.svelte.d.ts +3 -0
  306. package/dist/table/column-resizer/table-column-resizer-selection-column-test.svelte +84 -0
  307. package/dist/table/column-resizer/table-column-resizer-selection-column-test.svelte.d.ts +3 -0
  308. package/dist/table/column-resizer/table-column-resizer-test.svelte +77 -0
  309. package/dist/table/column-resizer/table-column-resizer-test.svelte.d.ts +3 -0
  310. package/dist/table/column-resizer/table-column-resizer-three-column-relative-test.svelte +64 -0
  311. package/dist/table/column-resizer/table-column-resizer-three-column-relative-test.svelte.d.ts +3 -0
  312. package/dist/table/column-resizer/table-column-resizer.svelte +610 -0
  313. package/dist/table/column-resizer/table-column-resizer.svelte.d.ts +4 -0
  314. package/dist/table/empty-state/README.md +27 -0
  315. package/dist/table/empty-state/table-empty-state.svelte +33 -0
  316. package/dist/table/empty-state/table-empty-state.svelte.d.ts +4 -0
  317. package/dist/table/footer/README.md +26 -0
  318. package/dist/table/footer/table-footer.svelte +13 -0
  319. package/dist/table/footer/table-footer.svelte.d.ts +4 -0
  320. package/dist/table/header/README.md +26 -0
  321. package/dist/table/header/table-header.svelte +13 -0
  322. package/dist/table/header/table-header.svelte.d.ts +4 -0
  323. package/dist/table/index.d.ts +18 -0
  324. package/dist/table/index.js +17 -0
  325. package/dist/table/index.parts.d.ts +13 -0
  326. package/dist/table/index.parts.js +13 -0
  327. package/dist/table/root/README.md +66 -0
  328. package/dist/table/root/context.d.ts +233 -0
  329. package/dist/table/root/context.js +2153 -0
  330. package/dist/table/root/table-reorder-test.svelte +64 -0
  331. package/dist/table/root/table-reorder-test.svelte.d.ts +3 -0
  332. package/dist/table/root/table-root.svelte +561 -0
  333. package/dist/table/root/table-root.svelte.d.ts +4 -0
  334. package/dist/table/root/table-ssr-wrapper-column.svelte +48 -0
  335. package/dist/table/root/table-ssr-wrapper-column.svelte.d.ts +4 -0
  336. package/dist/table/root/table-ssr-wrapper-context.d.ts +11 -0
  337. package/dist/table/root/table-ssr-wrapper-context.js +13 -0
  338. package/dist/table/root/table-ssr-wrapper-test.svelte +57 -0
  339. package/dist/table/root/table-ssr-wrapper-test.svelte.d.ts +3 -0
  340. package/dist/table/root/table-test.svelte +206 -0
  341. package/dist/table/root/table-test.svelte.d.ts +29 -0
  342. package/dist/table/row/README.md +29 -0
  343. package/dist/table/row/table-row.svelte +244 -0
  344. package/dist/table/row/table-row.svelte.d.ts +4 -0
  345. package/dist/table/sort-trigger/README.md +45 -0
  346. package/dist/table/sort-trigger/table-sort-trigger.svelte +183 -0
  347. package/dist/table/sort-trigger/table-sort-trigger.svelte.d.ts +4 -0
  348. package/dist/table/types.d.ts +112 -0
  349. package/dist/table/types.js +1 -0
  350. package/dist/table/utils/handle-body-keydown.d.ts +13 -0
  351. package/dist/table/utils/handle-body-keydown.js +67 -0
  352. package/dist/table/utils/visually-hidden-style.d.ts +1 -0
  353. package/dist/table/utils/visually-hidden-style.js +1 -0
  354. package/dist/test-utils/focus-contract.d.ts +3 -0
  355. package/dist/test-utils/focus-contract.js +26 -0
  356. package/dist/timepicker/IMPLEMENTATION_PLAN.md +254 -0
  357. package/dist/timepicker/README.md +97 -0
  358. package/dist/timepicker/TODO.md +86 -0
  359. package/dist/timepicker/clock/README.md +14 -0
  360. package/dist/timepicker/clock/time-picker-clock-test.svelte +45 -0
  361. package/dist/timepicker/clock/time-picker-clock-test.svelte.d.ts +11 -0
  362. package/dist/timepicker/clock/time-picker-clock.svelte +65 -0
  363. package/dist/timepicker/clock/time-picker-clock.svelte.d.ts +10 -0
  364. package/dist/timepicker/index.d.ts +14 -0
  365. package/dist/timepicker/index.js +14 -0
  366. package/dist/timepicker/index.parts.d.ts +8 -0
  367. package/dist/timepicker/index.parts.js +8 -0
  368. package/dist/timepicker/input/README.md +15 -0
  369. package/dist/timepicker/input/time-picker-input-forwarding-test.svelte +40 -0
  370. package/dist/timepicker/input/time-picker-input-forwarding-test.svelte.d.ts +3 -0
  371. package/dist/timepicker/input/time-picker-input.svelte +109 -0
  372. package/dist/timepicker/input/time-picker-input.svelte.d.ts +11 -0
  373. package/dist/timepicker/internal/strict-props.d.ts +4 -0
  374. package/dist/timepicker/internal/strict-props.js +51 -0
  375. package/dist/timepicker/popover/README.md +20 -0
  376. package/dist/timepicker/popover/time-picker-popover-unsafe-props-test.svelte +22 -0
  377. package/dist/timepicker/popover/time-picker-popover-unsafe-props-test.svelte.d.ts +3 -0
  378. package/dist/timepicker/popover/time-picker-popover.svelte +89 -0
  379. package/dist/timepicker/popover/time-picker-popover.svelte.d.ts +7 -0
  380. package/dist/timepicker/root/README.md +42 -0
  381. package/dist/timepicker/root/context.d.ts +51 -0
  382. package/dist/timepicker/root/context.js +15 -0
  383. package/dist/timepicker/root/time-picker-12h-test.svelte +22 -0
  384. package/dist/timepicker/root/time-picker-12h-test.svelte.d.ts +3 -0
  385. package/dist/timepicker/root/time-picker-bindable-test.svelte +25 -0
  386. package/dist/timepicker/root/time-picker-bindable-test.svelte.d.ts +3 -0
  387. package/dist/timepicker/root/time-picker-empty-test.svelte +20 -0
  388. package/dist/timepicker/root/time-picker-empty-test.svelte.d.ts +3 -0
  389. package/dist/timepicker/root/time-picker-root.svelte +625 -0
  390. package/dist/timepicker/root/time-picker-root.svelte.d.ts +28 -0
  391. package/dist/timepicker/root/time-picker-test.svelte +72 -0
  392. package/dist/timepicker/root/time-picker-test.svelte.d.ts +15 -0
  393. package/dist/timepicker/root/time-utils.d.ts +1 -0
  394. package/dist/timepicker/root/time-utils.js +3 -0
  395. package/dist/timepicker/segment/README.md +14 -0
  396. package/dist/timepicker/segment/time-picker-segment.svelte +365 -0
  397. package/dist/timepicker/segment/time-picker-segment.svelte.d.ts +9 -0
  398. package/dist/timepicker/trigger/README.md +14 -0
  399. package/dist/timepicker/trigger/time-picker-trigger-forwarding-test.svelte +35 -0
  400. package/dist/timepicker/trigger/time-picker-trigger-forwarding-test.svelte.d.ts +3 -0
  401. package/dist/timepicker/trigger/time-picker-trigger.svelte +122 -0
  402. package/dist/timepicker/trigger/time-picker-trigger.svelte.d.ts +9 -0
  403. package/dist/utils/date-only.d.ts +11 -0
  404. package/dist/utils/date-only.js +53 -0
  405. package/dist/utils/index.d.ts +1 -0
  406. package/dist/utils/index.js +1 -0
  407. package/package.json +33 -2
@@ -7,24 +7,19 @@
7
7
  Name: `Popover.Root`
8
8
  Description: Root state container that controls open state, trigger ref, and toggle/open/close actions.
9
9
 
10
- | Prop | Type | Default | Description |
11
- | -------------- | ------------------------- | ----------- | ---------------------------------------------- |
12
- | `open` | `boolean` | `undefined` | Controlled open state. Supports `bind:open`. |
13
- | `defaultOpen` | `boolean` | `false` | Initial open state in uncontrolled mode. |
14
- | `onOpenChange` | `(open: boolean) => void` | `undefined` | Called whenever open state changes. |
15
- | `triggerRef` | `HTMLElement \| null` | `null` | Trigger reference. Supports `bind:triggerRef`. |
16
- | `children` | `Snippet` | `undefined` | Composed trigger and content parts. |
10
+ - `open`: `boolean` (default: `undefined`) — Controlled open state. Supports `bind:open`.
11
+ - `defaultOpen`: `boolean` (default: `false`) Initial open state in uncontrolled mode.
12
+ - `onOpenChange`: `(open: boolean, details) => void` (default: `undefined`) Called whenever open state changes. `details` includes `reason`, optional `event`, `cancel()`, and `isCanceled`.
13
+ - `triggerRef`: `HTMLElement | null` (default: `null`) Trigger reference. Supports `bind:triggerRef`.
14
+ - `children`: `Snippet` (default: `undefined`) Composed trigger and content parts.
17
15
 
18
16
  ### Context utilities
19
17
 
20
18
  Name: `context.ts` helpers
21
19
  Description: Context APIs used by trigger and content parts.
22
20
 
23
- | Prop | Type | Default | Description |
24
- | -------------------------- | ----------------------------------- | ------------------- | ---------------------------------------- |
25
- | `setPopoverContext` | `(ctx: PopoverContext) => void` | `-` | Registers popover context. |
26
- | `getPopoverContext` | `() => PopoverContext \| undefined` | `-` | Returns popover context when available. |
27
- | `PopoverContext` | `type` | `-` | Context contract with state and actions. |
28
- | `PopoverTriggerContext` | `type alias` | `PopoverContext` | Backward-compatible alias. |
29
- | `setPopoverTriggerContext` | `alias` | `setPopoverContext` | Backward-compatible alias. |
30
- | `getPopoverTriggerContext` | `alias` | `getPopoverContext` | Backward-compatible alias. |
21
+ | Prop | Type | Default | Description |
22
+ | ------------------- | ----------------------------------- | ------- | ---------------------------------------- |
23
+ | `setPopoverContext` | `(ctx: PopoverContext) => void` | `-` | Registers popover context. |
24
+ | `getPopoverContext` | `() => PopoverContext \| undefined` | `-` | Returns popover context when available. |
25
+ | `PopoverContext` | `type` | `-` | Context contract with state and actions. |
@@ -1,7 +1,19 @@
1
+ export type PopoverCanonicalCloseReason = 'escape-key' | 'outside-press' | 'focus-out' | 'close-press' | 'imperative-action' | 'none';
2
+ export type PopoverCloseReason = PopoverCanonicalCloseReason;
3
+ export type PopoverOpenReason = 'trigger-press' | 'imperative-action' | 'none';
4
+ export type PopoverChangeReason = PopoverOpenReason | PopoverCloseReason;
5
+ export type PopoverOpenChangeDetails = {
6
+ reason: PopoverChangeReason;
7
+ event?: Event;
8
+ cancel: () => void;
9
+ isCanceled: boolean;
10
+ };
1
11
  /**
2
12
  * Context shared between Popover components (Root, Trigger, Content).
3
13
  */
4
14
  export type PopoverContext = {
15
+ /** Reason why popover is closing */
16
+ closeReason: PopoverCanonicalCloseReason;
5
17
  /** Whether the popover is open */
6
18
  isOpen: boolean;
7
19
  /** Reference to the trigger element */
@@ -9,16 +21,13 @@ export type PopoverContext = {
9
21
  /** Set the trigger ref (used by Trigger component) */
10
22
  setTriggerRef: (el: HTMLElement | null) => void;
11
23
  /** Toggle popover open state */
12
- toggle: () => void;
24
+ toggle: (reason?: PopoverOpenReason, event?: Event) => void;
13
25
  /** Open the popover */
14
- open: () => void;
26
+ open: (reason?: PopoverOpenReason, event?: Event) => void;
15
27
  /** Close the popover and return focus to trigger */
16
- close: () => void;
28
+ close: (reason?: PopoverCloseReason, event?: Event) => void;
17
29
  /** Called when popover open state changes */
18
- onOpenChange: (open: boolean) => void;
30
+ onOpenChange: (open: boolean, details: PopoverOpenChangeDetails) => void;
19
31
  };
20
32
  export declare function setPopoverContext(ctx: PopoverContext): void;
21
33
  export declare function getPopoverContext(): PopoverContext | undefined;
22
- export type PopoverTriggerContext = PopoverContext;
23
- export declare const setPopoverTriggerContext: typeof setPopoverContext;
24
- export declare const getPopoverTriggerContext: typeof getPopoverContext;
@@ -6,5 +6,3 @@ export function setPopoverContext(ctx) {
6
6
  export function getPopoverContext() {
7
7
  return getContext(POPOVER_CONTEXT_KEY);
8
8
  }
9
- export const setPopoverTriggerContext = setPopoverContext;
10
- export const getPopoverTriggerContext = getPopoverContext;
@@ -0,0 +1,4 @@
1
+ import type { PopoverCloseReason } from './context';
2
+ export declare function clearTriggerFocusState(trigger: HTMLElement): void;
3
+ export declare function applyTriggerCloseFocusState(trigger: HTMLElement, reason: PopoverCloseReason, event?: Event): void;
4
+ export declare function addTriggerBlurCleanup(trigger: HTMLElement, once?: boolean): () => void;
@@ -0,0 +1,33 @@
1
+ import { focusWithModality, resolveCloseInteractionModality } from '../../primitives/input-modality';
2
+ export function clearTriggerFocusState(trigger) {
3
+ delete trigger.dataset.focused;
4
+ delete trigger.dataset.focusVisible;
5
+ }
6
+ export function applyTriggerCloseFocusState(trigger, reason, event) {
7
+ const closeModality = resolveCloseInteractionModality(reason, event);
8
+ focusWithModality(trigger, closeModality);
9
+ if (reason === 'outside-press' || reason === 'escape-key') {
10
+ trigger.dataset.focused = 'true';
11
+ }
12
+ else {
13
+ delete trigger.dataset.focused;
14
+ }
15
+ if (closeModality === 'keyboard') {
16
+ trigger.dataset.focusVisible = 'true';
17
+ }
18
+ else {
19
+ delete trigger.dataset.focusVisible;
20
+ }
21
+ }
22
+ export function addTriggerBlurCleanup(trigger, once = false) {
23
+ const handleBlur = () => {
24
+ clearTriggerFocusState(trigger);
25
+ if (once) {
26
+ trigger.removeEventListener('blur', handleBlur);
27
+ }
28
+ };
29
+ trigger.addEventListener('blur', handleBlur);
30
+ return () => {
31
+ trigger.removeEventListener('blur', handleBlur);
32
+ };
33
+ }
@@ -1,6 +1,20 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from 'svelte';
3
- import { setPopoverContext, type PopoverContext } from './context';
3
+ import { onDestroy } from 'svelte';
4
+ import {
5
+ setPopoverContext,
6
+ type PopoverCanonicalCloseReason,
7
+ type PopoverChangeReason,
8
+ type PopoverCloseReason,
9
+ type PopoverOpenChangeDetails,
10
+ type PopoverOpenReason,
11
+ type PopoverContext
12
+ } from './context';
13
+ import {
14
+ addTriggerBlurCleanup,
15
+ applyTriggerCloseFocusState,
16
+ clearTriggerFocusState
17
+ } from './focus-state';
4
18
 
5
19
  /**
6
20
  * Popover.Root - State management wrapper for Popover components.
@@ -12,7 +26,7 @@
12
26
  /** Initial open state for uncontrolled mode. */
13
27
  defaultOpen?: boolean;
14
28
  /** Callback when open state changes. */
15
- onOpenChange?: (open: boolean) => void;
29
+ onOpenChange?: (open: boolean, details: PopoverOpenChangeDetails) => void;
16
30
  /** Reference to the trigger element. Can be set manually or via Popover.Trigger. */
17
31
  triggerRef?: HTMLElement | null;
18
32
  /** Children (Trigger and Content) */
@@ -26,6 +40,9 @@
26
40
  triggerRef = $bindable<HTMLElement | null>(null),
27
41
  children
28
42
  }: PopoverRootProps = $props();
43
+ let closeReason: PopoverCanonicalCloseReason = $state('none');
44
+ let cleanupTriggerBlurListener: (() => void) | undefined;
45
+ let pendingTriggerCloseFocusFrame: number | undefined;
29
46
 
30
47
  // Use function to capture initial value only (not reactive)
31
48
  let isOpenInternal = $state((() => defaultOpen)());
@@ -33,39 +50,90 @@
33
50
  const isControlled = $derived(open !== undefined);
34
51
  const isOpen = $derived(isControlled ? open! : isOpenInternal);
35
52
 
36
- function setOpen(value: boolean) {
37
- if (isControlled) {
38
- onOpenChange?.(value);
39
- } else {
53
+ function setOpenWithDetails(
54
+ value: boolean,
55
+ incomingDetails: { reason: PopoverChangeReason; event?: Event }
56
+ ) {
57
+ let canceled = false;
58
+ const details: PopoverOpenChangeDetails = {
59
+ reason: incomingDetails.reason,
60
+ event: incomingDetails.event,
61
+ cancel: () => {
62
+ canceled = true;
63
+ },
64
+ get isCanceled() {
65
+ return canceled;
66
+ }
67
+ };
68
+
69
+ onOpenChange?.(value, details);
70
+ if (details.isCanceled) return;
71
+
72
+ if (!isControlled) {
40
73
  isOpenInternal = value;
41
- onOpenChange?.(value);
42
74
  }
43
- // Sync bindable prop
75
+
44
76
  open = value;
45
77
  }
46
78
 
47
- function toggle() {
48
- setOpen(!isOpen);
79
+ function toggle(reason: PopoverOpenReason = 'trigger-press', event?: Event) {
80
+ setOpenWithDetails(!isOpen, { reason, event });
81
+ }
82
+
83
+ function openPopover(reason: PopoverOpenReason = 'imperative-action', event?: Event) {
84
+ closeReason = 'none';
85
+ setOpenWithDetails(true, { reason, event });
49
86
  }
50
87
 
51
- function openPopover() {
52
- setOpen(true);
88
+ function clearPendingTriggerCloseFocus() {
89
+ if (pendingTriggerCloseFocusFrame === undefined) return;
90
+ cancelAnimationFrame(pendingTriggerCloseFocusFrame);
91
+ pendingTriggerCloseFocusFrame = undefined;
53
92
  }
54
93
 
55
- function closePopover() {
56
- setOpen(false);
57
- triggerRef?.focus();
94
+ function scheduleTriggerCloseFocus(
95
+ trigger: HTMLElement,
96
+ reason: PopoverCanonicalCloseReason,
97
+ event?: Event
98
+ ) {
99
+ clearPendingTriggerCloseFocus();
100
+ pendingTriggerCloseFocusFrame = requestAnimationFrame(() => {
101
+ pendingTriggerCloseFocusFrame = undefined;
102
+ if (!trigger.isConnected) return;
103
+ applyTriggerCloseFocusState(trigger, reason, event);
104
+ });
105
+ }
106
+
107
+ function closePopover(reason: PopoverCloseReason = 'imperative-action', event?: Event) {
108
+ closeReason = reason;
109
+ const wasOpen = isOpen;
110
+ setOpenWithDetails(false, { reason, event });
111
+ if (!wasOpen || isOpen) return;
112
+ if (!triggerRef) return;
113
+ scheduleTriggerCloseFocus(triggerRef, reason, event);
58
114
  }
59
115
 
60
116
  function setTriggerRef(el: HTMLElement | null) {
117
+ clearPendingTriggerCloseFocus();
118
+ cleanupTriggerBlurListener?.();
119
+ cleanupTriggerBlurListener = undefined;
120
+ if (triggerRef && triggerRef !== el) {
121
+ clearTriggerFocusState(triggerRef);
122
+ }
61
123
  triggerRef = el;
124
+ if (!triggerRef) return;
125
+ const currentTrigger = triggerRef;
126
+ cleanupTriggerBlurListener = addTriggerBlurCleanup(currentTrigger);
62
127
  }
63
128
 
64
- function handleOpenChange(newOpen: boolean) {
65
- setOpen(newOpen);
129
+ function handleOpenChange(newOpen: boolean, details: PopoverOpenChangeDetails) {
130
+ setOpenWithDetails(newOpen, { reason: details.reason, event: details.event });
66
131
  }
67
132
 
68
133
  const ctx: PopoverContext = {
134
+ get closeReason() {
135
+ return closeReason;
136
+ },
69
137
  get isOpen() {
70
138
  return isOpen;
71
139
  },
@@ -80,6 +148,11 @@
80
148
  };
81
149
 
82
150
  setPopoverContext(ctx);
151
+
152
+ onDestroy(() => {
153
+ clearPendingTriggerCloseFocus();
154
+ cleanupTriggerBlurListener?.();
155
+ });
83
156
  </script>
84
157
 
85
158
  {#if children}
@@ -1,4 +1,5 @@
1
1
  import type { Snippet } from 'svelte';
2
+ import { type PopoverOpenChangeDetails } from './context';
2
3
  /**
3
4
  * Popover.Root - State management wrapper for Popover components.
4
5
  * Provides context for Trigger and Content children.
@@ -9,7 +10,7 @@ type PopoverRootProps = {
9
10
  /** Initial open state for uncontrolled mode. */
10
11
  defaultOpen?: boolean;
11
12
  /** Callback when open state changes. */
12
- onOpenChange?: (open: boolean) => void;
13
+ onOpenChange?: (open: boolean, details: PopoverOpenChangeDetails) => void;
13
14
  /** Reference to the trigger element. Can be set manually or via Popover.Trigger. */
14
15
  triggerRef?: HTMLElement | null;
15
16
  /** Children (Trigger and Content) */
@@ -1,5 +1,6 @@
1
1
  <script lang="ts">
2
2
  import { Popover } from '../index';
3
+ import type { PopoverOpenChangeDetails } from './context';
3
4
 
4
5
  type Props = {
5
6
  open?: boolean;
@@ -7,7 +8,7 @@
7
8
  isNonModal?: boolean;
8
9
  shouldCloseOnInteractOutside?: boolean;
9
10
  shouldCloseOnEscape?: boolean;
10
- onOpenChange?: (open: boolean) => void;
11
+ onOpenChange?: (open: boolean, details: PopoverOpenChangeDetails) => void;
11
12
  };
12
13
 
13
14
  let {
@@ -1,10 +1,11 @@
1
+ import type { PopoverOpenChangeDetails } from './context';
1
2
  type Props = {
2
3
  open?: boolean;
3
4
  defaultOpen?: boolean;
4
5
  isNonModal?: boolean;
5
6
  shouldCloseOnInteractOutside?: boolean;
6
7
  shouldCloseOnEscape?: boolean;
7
- onOpenChange?: (open: boolean) => void;
8
+ onOpenChange?: (open: boolean, details: PopoverOpenChangeDetails) => void;
8
9
  };
9
10
  declare const PopoverTest: import("svelte").Component<Props, {}, "">;
10
11
  type PopoverTest = ReturnType<typeof PopoverTest>;
@@ -0,0 +1,17 @@
1
+ <script lang="ts">
2
+ import { Button } from '../../button';
3
+ import { Popover } from '../index';
4
+ </script>
5
+
6
+ <Popover.Root>
7
+ <Popover.Trigger>
8
+ <Button.Root>Open Button Root Popover</Button.Root>
9
+ </Popover.Trigger>
10
+
11
+ <Popover.Content class="popover-content">
12
+ <div class="popover-body">
13
+ <h3>Popover Title</h3>
14
+ <p>Popover content goes here.</p>
15
+ </div>
16
+ </Popover.Content>
17
+ </Popover.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 PopoverTriggerButtonRootTest: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
15
+ [evt: string]: CustomEvent<any>;
16
+ }, {}, {}, string>;
17
+ type PopoverTriggerButtonRootTest = InstanceType<typeof PopoverTriggerButtonRootTest>;
18
+ export default PopoverTriggerButtonRootTest;
@@ -1,7 +1,8 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from 'svelte';
3
3
  import type { HTMLButtonAttributes } from 'svelte/elements';
4
- import { getPopoverTriggerContext } from '../root/context';
4
+ import { ButtonRoot } from '../../button/index.js';
5
+ import { getPopoverContext } from '../root/context';
5
6
 
6
7
  type PopoverTriggerButtonProps = Omit<
7
8
  HTMLButtonAttributes,
@@ -17,7 +18,7 @@
17
18
  let { children, class: className = '', ...restProps }: PopoverTriggerButtonProps = $props();
18
19
 
19
20
  let buttonRef: HTMLButtonElement | null = $state(null);
20
- const ctx = getPopoverTriggerContext();
21
+ const ctx = getPopoverContext();
21
22
 
22
23
  $effect(() => {
23
24
  if (buttonRef && ctx) {
@@ -25,15 +26,16 @@
25
26
  }
26
27
  });
27
28
 
28
- function handleClick() {
29
- ctx?.toggle();
29
+ function handleClick(event: MouseEvent) {
30
+ ctx?.toggle('trigger-press', event);
30
31
  }
31
32
  </script>
32
33
 
33
- <button
34
- bind:this={buttonRef}
34
+ <ButtonRoot
35
+ bind:element={buttonRef}
35
36
  class={className}
36
37
  type="button"
38
+ pressed={ctx?.isOpen ?? false}
37
39
  aria-expanded={ctx?.isOpen ?? false}
38
40
  aria-haspopup="dialog"
39
41
  onclick={handleClick}
@@ -42,4 +44,4 @@
42
44
  {#if children}
43
45
  {@render children()}
44
46
  {/if}
45
- </button>
47
+ </ButtonRoot>
@@ -26,15 +26,28 @@
26
26
  let wrapperRef: HTMLElement | null = $state(null);
27
27
  let activeTrigger: HTMLElement | null = null;
28
28
 
29
+ function syncTriggerState(button: HTMLElement) {
30
+ button.setAttribute('aria-haspopup', 'dialog');
31
+ button.setAttribute('aria-expanded', String(popoverCtx.isOpen));
32
+ if (popoverCtx.isOpen) {
33
+ button.dataset.pressedWhenExpanded = 'true';
34
+ button.dataset.pressed = 'true';
35
+ } else {
36
+ delete button.dataset.pressedWhenExpanded;
37
+ delete button.dataset.pressed;
38
+ }
39
+ }
40
+
29
41
  function setActiveTrigger(button: HTMLElement) {
30
42
  if (activeTrigger && activeTrigger !== button) {
31
43
  activeTrigger.setAttribute('aria-expanded', 'false');
44
+ delete activeTrigger.dataset.pressed;
45
+ delete activeTrigger.dataset.pressedWhenExpanded;
32
46
  }
33
47
 
34
48
  activeTrigger = button;
35
49
  popoverCtx.setTriggerRef(button);
36
- button.setAttribute('aria-haspopup', 'dialog');
37
- button.setAttribute('aria-expanded', String(popoverCtx.isOpen));
50
+ syncTriggerState(button);
38
51
  }
39
52
 
40
53
  function handleClick(event: MouseEvent) {
@@ -43,7 +56,7 @@
43
56
 
44
57
  if (button && wrapperRef?.contains(button)) {
45
58
  setActiveTrigger(button);
46
- popoverCtx.toggle();
59
+ popoverCtx.toggle('trigger-press', event);
47
60
  }
48
61
  }
49
62
 
@@ -70,8 +83,7 @@
70
83
  if (activeTrigger !== popoverCtx.triggerRef) {
71
84
  activeTrigger = popoverCtx.triggerRef;
72
85
  }
73
- popoverCtx.triggerRef.setAttribute('aria-haspopup', 'dialog');
74
- popoverCtx.triggerRef.setAttribute('aria-expanded', String(popoverCtx.isOpen));
86
+ syncTriggerState(popoverCtx.triggerRef);
75
87
  }
76
88
  });
77
89
  </script>
@@ -18,6 +18,8 @@
18
18
  if (!browser || !wrapper) return;
19
19
 
20
20
  await tick();
21
+ const wrapperNode = wrapper;
22
+ if (!wrapperNode) return;
21
23
 
22
24
  const targetEl = document.querySelector(target);
23
25
  if (!targetEl) {
@@ -25,7 +27,7 @@
25
27
  return;
26
28
  }
27
29
 
28
- targetEl.appendChild(wrapper);
30
+ targetEl.appendChild(wrapperNode);
29
31
  });
30
32
 
31
33
  onDestroy(() => {
@@ -4,7 +4,7 @@
4
4
  */
5
5
  export type ClickOutsideOptions = {
6
6
  /** Callback when clicking outside. */
7
- handler: () => void;
7
+ handler: (event: MouseEvent) => void;
8
8
  /** Whether the listener is enabled. */
9
9
  enabled?: boolean;
10
10
  /** Elements to ignore (clicks on these won't trigger). */
@@ -41,7 +41,7 @@ export function clickOutside(node, options) {
41
41
  // This prevents closing when clicking on nested popovers/dialogs
42
42
  if (isInTopLayer(target))
43
43
  return;
44
- handler();
44
+ handler(event);
45
45
  }
46
46
  if (enabled) {
47
47
  document.addEventListener('mousedown', handleClick, true);
@@ -84,11 +84,15 @@ export function createFloating(anchorElement, options = {}) {
84
84
  size({
85
85
  apply({ rects, availableWidth, availableHeight, elements, placement }) {
86
86
  const floatingEl = elements.floating;
87
+ const clampedAvailableWidth = Math.max(0, availableWidth);
88
+ const clampedAvailableHeight = Math.max(0, availableHeight);
87
89
  floatingEl.style.setProperty('--trigger-width', `${rects.reference.width}px`);
88
90
  floatingEl.style.setProperty('--trigger-height', `${rects.reference.height}px`);
89
- floatingEl.style.setProperty('--available-width', `${availableWidth}px`);
90
- floatingEl.style.setProperty('--available-height', `${availableHeight}px`);
91
+ floatingEl.style.setProperty('--available-width', `${clampedAvailableWidth}px`);
92
+ floatingEl.style.setProperty('--available-height', `${clampedAvailableHeight}px`);
91
93
  floatingEl.style.setProperty('--transform-origin', getTransformOrigin(placement));
94
+ floatingEl.style.maxWidth = `${clampedAvailableWidth}px`;
95
+ floatingEl.style.maxHeight = `${clampedAvailableHeight}px`;
92
96
  }
93
97
  })
94
98
  ];
@@ -141,11 +145,15 @@ export function floating(floatingElement, options) {
141
145
  size({
142
146
  apply({ rects, availableWidth, availableHeight, elements, placement }) {
143
147
  const floatingEl = elements.floating;
148
+ const clampedAvailableWidth = Math.max(0, availableWidth);
149
+ const clampedAvailableHeight = Math.max(0, availableHeight);
144
150
  floatingEl.style.setProperty('--trigger-width', `${rects.reference.width}px`);
145
151
  floatingEl.style.setProperty('--trigger-height', `${rects.reference.height}px`);
146
- floatingEl.style.setProperty('--available-width', `${availableWidth}px`);
147
- floatingEl.style.setProperty('--available-height', `${availableHeight}px`);
152
+ floatingEl.style.setProperty('--available-width', `${clampedAvailableWidth}px`);
153
+ floatingEl.style.setProperty('--available-height', `${clampedAvailableHeight}px`);
148
154
  floatingEl.style.setProperty('--transform-origin', getTransformOrigin(placement));
155
+ floatingEl.style.maxWidth = `${clampedAvailableWidth}px`;
156
+ floatingEl.style.maxHeight = `${clampedAvailableHeight}px`;
149
157
  }
150
158
  })
151
159
  ];
@@ -2,6 +2,11 @@
2
2
  * Focus trap primitive.
3
3
  * Traps keyboard focus within a container element.
4
4
  */
5
+ export type FocusTrapOptions = {
6
+ enabled?: boolean;
7
+ restoreFocus?: boolean;
8
+ initialFocus?: HTMLElement | string | (() => HTMLElement | null | undefined);
9
+ };
5
10
  /**
6
11
  * Svelte action that traps focus within an element.
7
12
  *
@@ -13,7 +18,7 @@
13
18
  * </div>
14
19
  * ```
15
20
  */
16
- export declare function focusTrap(node: HTMLElement, enabled?: boolean): {
17
- update(newEnabled: boolean): void;
21
+ export declare function focusTrap(node: HTMLElement, options?: boolean | FocusTrapOptions): {
22
+ update(newOptions: boolean | FocusTrapOptions): void;
18
23
  destroy(): void;
19
24
  };