@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
@@ -23,3 +23,14 @@ Description: Floating panel rendered in a portal. Supports context mode (`Popove
23
23
  | `triggerRef` | `HTMLElement \| null` | `null` | Trigger reference in standalone mode. |
24
24
  | `onOpenChange` | `(open: boolean) => void` | `undefined` | Open-state callback in standalone mode. |
25
25
  | `...restProps` | `HTMLAttributes<HTMLDivElement>` | `-` | Additional panel attributes. |
26
+
27
+ ## Styling state
28
+
29
+ `Popover.Content` exposes RAC-style data attributes that can drive CSS or Tailwind animation utilities:
30
+
31
+ - `data-state="open" | "closed"`
32
+ - `data-entering`
33
+ - `data-exiting`
34
+ - `data-placement="top" | "right" | "bottom" | "left"`
35
+
36
+ Exit animations keep the panel mounted until the element's own CSS transition or animation finishes. If no motion is defined, the panel unmounts immediately.
@@ -0,0 +1,30 @@
1
+ <script lang="ts">
2
+ import { Popover } from '../index';
3
+
4
+ let open = $state(false);
5
+ </script>
6
+
7
+ <Popover.Root bind:open>
8
+ <Popover.Trigger>
9
+ <button type="button">Open Popover</button>
10
+ </Popover.Trigger>
11
+
12
+ <Popover.Content class="popover-content presence-animation">
13
+ <div class="popover-body">
14
+ <h3>Popover Title</h3>
15
+ <p>Popover content goes here.</p>
16
+ <button type="button" class="apply-btn" onclick={() => (open = false)}>Apply</button>
17
+ </div>
18
+ </Popover.Content>
19
+ </Popover.Root>
20
+
21
+ <style>
22
+ :global(.presence-animation) {
23
+ opacity: 1;
24
+ transition: opacity 0.2s linear;
25
+ }
26
+
27
+ :global(.presence-animation[data-exiting]) {
28
+ opacity: 0;
29
+ }
30
+ </style>
@@ -0,0 +1,3 @@
1
+ declare const PopoverContentControlledCloseTest: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type PopoverContentControlledCloseTest = ReturnType<typeof PopoverContentControlledCloseTest>;
3
+ export default PopoverContentControlledCloseTest;
@@ -0,0 +1,28 @@
1
+ <script lang="ts">
2
+ import { Popover } from '../index';
3
+ import type { PopoverOpenChangeDetails } from '../root/context';
4
+
5
+ type Props = {
6
+ preventClose?: boolean;
7
+ };
8
+
9
+ let { preventClose = true }: Props = $props();
10
+
11
+ let open = $state(true);
12
+ let triggerRef = $state<HTMLElement | null>(null);
13
+
14
+ function handleOpenChange(nextOpen: boolean, details: PopoverOpenChangeDetails) {
15
+ if (!nextOpen && preventClose) {
16
+ details.cancel();
17
+ }
18
+ if (!details.isCanceled) {
19
+ open = nextOpen;
20
+ }
21
+ }
22
+ </script>
23
+
24
+ <button bind:this={triggerRef} type="button">Standalone Trigger</button>
25
+
26
+ <Popover.Content {open} {triggerRef} onOpenChange={handleOpenChange}>
27
+ <div>Standalone content</div>
28
+ </Popover.Content>
@@ -0,0 +1,6 @@
1
+ type Props = {
2
+ preventClose?: boolean;
3
+ };
4
+ declare const PopoverContentStandaloneTest: import("svelte").Component<Props, {}, "">;
5
+ type PopoverContentStandaloneTest = ReturnType<typeof PopoverContentStandaloneTest>;
6
+ export default PopoverContentStandaloneTest;
@@ -1,5 +1,6 @@
1
1
  <script lang="ts">
2
2
  import { Popover } from '../index';
3
+ import type { PopoverOpenChangeDetails } from '../root/context';
3
4
 
4
5
  type Props = {
5
6
  open?: boolean;
@@ -8,7 +9,8 @@
8
9
  shouldCloseOnInteractOutside?: boolean;
9
10
  shouldCloseOnEscape?: boolean;
10
11
  shouldCloseOnBlur?: boolean;
11
- onOpenChange?: (open: boolean) => void;
12
+ class?: string;
13
+ onOpenChange?: (open: boolean, details: PopoverOpenChangeDetails) => void;
12
14
  };
13
15
 
14
16
  let {
@@ -18,6 +20,7 @@
18
20
  shouldCloseOnInteractOutside = true,
19
21
  shouldCloseOnEscape = true,
20
22
  shouldCloseOnBlur,
23
+ class: className = '',
21
24
  onOpenChange
22
25
  }: Props = $props();
23
26
  </script>
@@ -28,7 +31,7 @@
28
31
  </Popover.Trigger>
29
32
 
30
33
  <Popover.Content
31
- class="popover-content"
34
+ class={`popover-content ${className}`.trim()}
32
35
  {isNonModal}
33
36
  {shouldCloseOnInteractOutside}
34
37
  {shouldCloseOnEscape}
@@ -41,3 +44,30 @@
41
44
  </div>
42
45
  </Popover.Content>
43
46
  </Popover.Root>
47
+
48
+ <style>
49
+ :global(.presence-animation) {
50
+ opacity: 1;
51
+ transition: opacity 0.2s linear;
52
+ }
53
+
54
+ :global(.presence-animation[data-entering]) {
55
+ animation: popover-enter 0.2s linear;
56
+ }
57
+
58
+ :global(.presence-animation[data-exiting]) {
59
+ opacity: 0;
60
+ }
61
+
62
+ @keyframes popover-enter {
63
+ from {
64
+ opacity: 0;
65
+ transform: scale(0.96);
66
+ }
67
+
68
+ to {
69
+ opacity: 1;
70
+ transform: scale(1);
71
+ }
72
+ }
73
+ </style>
@@ -1,3 +1,4 @@
1
+ import type { PopoverOpenChangeDetails } from '../root/context';
1
2
  type Props = {
2
3
  open?: boolean;
3
4
  defaultOpen?: boolean;
@@ -5,7 +6,8 @@ type Props = {
5
6
  shouldCloseOnInteractOutside?: boolean;
6
7
  shouldCloseOnEscape?: boolean;
7
8
  shouldCloseOnBlur?: boolean;
8
- onOpenChange?: (open: boolean) => void;
9
+ class?: string;
10
+ onOpenChange?: (open: boolean, details: PopoverOpenChangeDetails) => void;
9
11
  };
10
12
  declare const PopoverContentTest: import("svelte").Component<Props, {}, "">;
11
13
  type PopoverContentTest = ReturnType<typeof PopoverContentTest>;
@@ -4,12 +4,21 @@
4
4
  import { onMount, onDestroy } from 'svelte';
5
5
  import { browser } from '$app/environment';
6
6
  import { floating, type ExtendedPlacement } from '../../primitives/floating';
7
- import { focusTrap } from '../../primitives/focus-trap';
7
+ import { focusTrap, type FocusTrapOptions } from '../../primitives/focus-trap';
8
8
  import { scrollLock } from '../../primitives/scroll-lock';
9
9
  import { clickOutside } from '../../primitives/click-outside';
10
10
  import { ariaHideOutside } from '../../primitives/aria-hide-outside';
11
11
  import { Portal } from '../../portal';
12
- import { getPopoverContext } from '../root/context';
12
+ import {
13
+ getPopoverContext,
14
+ type PopoverOpenChangeDetails,
15
+ type PopoverCloseReason
16
+ } from '../root/context';
17
+ import {
18
+ addTriggerBlurCleanup,
19
+ applyTriggerCloseFocusState,
20
+ clearTriggerFocusState
21
+ } from '../root/focus-state';
13
22
 
14
23
  /**
15
24
  * Popover.Content - The floating content panel.
@@ -36,17 +45,19 @@
36
45
  shouldCloseOnEscape?: boolean;
37
46
  /** Whether losing focus (blur) should close the popover. Defaults to true for non-modal popovers. */
38
47
  shouldCloseOnBlur?: boolean;
48
+ /** Element or selector to focus first when modal trap activates. */
49
+ initialFocus?: FocusTrapOptions['initialFocus'];
39
50
  // Standalone mode props (used when not inside Popover.Root)
40
51
  /** Controlled open state (standalone mode). */
41
52
  open?: boolean;
42
53
  /** Reference to the trigger element (standalone mode). */
43
54
  triggerRef?: HTMLElement | null;
44
55
  /** Callback when open state changes (standalone mode). */
45
- onOpenChange?: (open: boolean) => void;
56
+ onOpenChange?: (open: boolean, details: PopoverOpenChangeDetails) => void;
46
57
  } & Omit<HTMLAttributes<HTMLDivElement>, 'class' | 'children'>;
47
58
 
48
59
  let {
49
- offset = 8,
60
+ offset = 4,
50
61
  placement = 'bottom',
51
62
  shouldFlip = true,
52
63
  boundaryElement = null,
@@ -56,6 +67,7 @@
56
67
  shouldCloseOnInteractOutside = true,
57
68
  shouldCloseOnEscape = true,
58
69
  shouldCloseOnBlur,
70
+ initialFocus,
59
71
  // Standalone mode props
60
72
  open: openProp,
61
73
  triggerRef: triggerRefProp = null,
@@ -73,28 +85,204 @@
73
85
  const shouldCloseOnBlurResolved = $derived(shouldCloseOnBlur ?? isNonModal);
74
86
 
75
87
  let popoverRef: HTMLElement | undefined = $state();
88
+ let cleanupStandaloneTriggerBlurListener: (() => void) | undefined;
89
+ let pendingStandaloneTriggerCloseFocusFrame: number | undefined;
90
+ let trackedStandaloneTrigger: HTMLElement | null = null;
91
+ let isMounted = $state(false);
92
+ let isEntering = $state(false);
93
+ let isExiting = $state(false);
94
+ let resolvedPlacement = $state<'top' | 'right' | 'bottom' | 'left'>('bottom');
95
+ let motionTimeout: number | undefined;
96
+ let pendingMotionFrame: number | undefined;
97
+ let cleanupMotionListeners: (() => void) | undefined;
98
+ let motionId = 0;
99
+ let previousOpen = $state(false);
100
+ let closeHandledInternally = false;
76
101
 
77
- function close() {
78
- if (isStandalone) {
79
- onOpenChangeProp?.(false);
80
- triggerRefProp?.focus();
81
- } else {
82
- ctx!.close();
102
+ function parseTimeList(value: string) {
103
+ return value
104
+ .split(',')
105
+ .map((entry) => entry.trim())
106
+ .filter(Boolean)
107
+ .map((entry) => {
108
+ if (entry.endsWith('ms')) return Number.parseFloat(entry);
109
+ if (entry.endsWith('s')) return Number.parseFloat(entry) * 1000;
110
+ return Number.parseFloat(entry) || 0;
111
+ });
112
+ }
113
+
114
+ function getMaxTime(duration: string, delay: string) {
115
+ const durations = parseTimeList(duration);
116
+ const delays = parseTimeList(delay);
117
+ const length = Math.max(durations.length, delays.length);
118
+
119
+ let maxTime = 0;
120
+ for (let index = 0; index < length; index += 1) {
121
+ const total =
122
+ (durations[index] ?? durations[durations.length - 1] ?? 0) +
123
+ (delays[index] ?? delays[delays.length - 1] ?? 0);
124
+ maxTime = Math.max(maxTime, total);
83
125
  }
126
+
127
+ return maxTime;
128
+ }
129
+
130
+ function getMotionTime(element: HTMLElement) {
131
+ const styles = getComputedStyle(element);
132
+ const transitionTime = getMaxTime(styles.transitionDuration, styles.transitionDelay);
133
+ const animationTime = getMaxTime(styles.animationDuration, styles.animationDelay);
134
+ return Math.max(transitionTime, animationTime);
135
+ }
136
+
137
+ function resolvePlacementSide(value: string) {
138
+ const side = value.split(/[-\s]/)[0];
139
+ return side === 'top' || side === 'right' || side === 'left' ? side : 'bottom';
84
140
  }
85
141
 
86
- function handleOpenChange(value: boolean) {
142
+ function clearMotionTracking() {
143
+ if (pendingMotionFrame !== undefined) {
144
+ cancelAnimationFrame(pendingMotionFrame);
145
+ pendingMotionFrame = undefined;
146
+ }
147
+
148
+ if (motionTimeout !== undefined) {
149
+ clearTimeout(motionTimeout);
150
+ motionTimeout = undefined;
151
+ }
152
+
153
+ cleanupMotionListeners?.();
154
+ cleanupMotionListeners = undefined;
155
+ }
156
+
157
+ function finishEnter(id: number) {
158
+ if (id !== motionId) return;
159
+ clearMotionTracking();
160
+ isEntering = false;
161
+ }
162
+
163
+ function finishExit(id: number) {
164
+ if (id !== motionId) return;
165
+ clearMotionTracking();
166
+ isExiting = false;
167
+ isMounted = false;
168
+ }
169
+
170
+ function trackMotion(phase: 'enter' | 'exit', element: HTMLElement) {
171
+ clearMotionTracking();
172
+ const id = ++motionId;
173
+
174
+ pendingMotionFrame = requestAnimationFrame(() => {
175
+ pendingMotionFrame = undefined;
176
+ if (id !== motionId || !element.isConnected) return;
177
+
178
+ const totalMotionTime = getMotionTime(element);
179
+ const complete = phase === 'enter' ? () => finishEnter(id) : () => finishExit(id);
180
+
181
+ if (totalMotionTime <= 0) {
182
+ complete();
183
+ return;
184
+ }
185
+
186
+ const handleMotionEnd = (event: Event) => {
187
+ if (event.target !== element) return;
188
+ complete();
189
+ };
190
+
191
+ element.addEventListener('animationend', handleMotionEnd);
192
+ element.addEventListener('transitionend', handleMotionEnd);
193
+ cleanupMotionListeners = () => {
194
+ element.removeEventListener('animationend', handleMotionEnd);
195
+ element.removeEventListener('transitionend', handleMotionEnd);
196
+ };
197
+
198
+ motionTimeout = window.setTimeout(() => {
199
+ complete();
200
+ }, totalMotionTime + 50);
201
+ });
202
+ }
203
+
204
+ function clearPendingStandaloneTriggerCloseFocus() {
205
+ if (pendingStandaloneTriggerCloseFocusFrame === undefined) return;
206
+ cancelAnimationFrame(pendingStandaloneTriggerCloseFocusFrame);
207
+ pendingStandaloneTriggerCloseFocusFrame = undefined;
208
+ }
209
+
210
+ function clearStandaloneTriggerTracking() {
211
+ clearPendingStandaloneTriggerCloseFocus();
212
+ cleanupStandaloneTriggerBlurListener?.();
213
+ cleanupStandaloneTriggerBlurListener = undefined;
214
+ }
215
+
216
+ function applyStandaloneTriggerCloseState(
217
+ trigger: HTMLElement,
218
+ reason: PopoverCloseReason,
219
+ event?: Event
220
+ ) {
221
+ clearStandaloneTriggerTracking();
222
+ pendingStandaloneTriggerCloseFocusFrame = requestAnimationFrame(() => {
223
+ pendingStandaloneTriggerCloseFocusFrame = undefined;
224
+ if (!trigger.isConnected) return;
225
+ applyTriggerCloseFocusState(trigger, reason, event);
226
+
227
+ const cleanupTriggerBlur = addTriggerBlurCleanup(trigger, true);
228
+ const handleDocumentFocusIn = (focusEvent: FocusEvent) => {
229
+ const target = focusEvent.target;
230
+ if (target === trigger) return;
231
+ if (target instanceof Node && trigger.contains(target)) return;
232
+ clearTriggerFocusState(trigger);
233
+ document.removeEventListener('focusin', handleDocumentFocusIn);
234
+ };
235
+
236
+ document.addEventListener('focusin', handleDocumentFocusIn);
237
+ cleanupStandaloneTriggerBlurListener = () => {
238
+ cleanupTriggerBlur();
239
+ document.removeEventListener('focusin', handleDocumentFocusIn);
240
+ };
241
+ });
242
+ }
243
+
244
+ function releaseFocusedDescendantBeforeHide() {
245
+ if (!browser || !popoverRef || !triggerRef) return;
246
+
247
+ const activeElement = document.activeElement;
248
+ if (!(activeElement instanceof HTMLElement)) return;
249
+ if (activeElement === triggerRef || triggerRef.contains(activeElement)) return;
250
+ if (activeElement !== popoverRef && !popoverRef.contains(activeElement)) return;
251
+
252
+ activeElement.blur();
253
+ }
254
+
255
+ function close(reason: PopoverCloseReason = 'imperative-action', event?: Event) {
256
+ closeHandledInternally = true;
257
+ releaseFocusedDescendantBeforeHide();
258
+
87
259
  if (isStandalone) {
88
- onOpenChangeProp?.(value);
260
+ let canceled = false;
261
+ const details: PopoverOpenChangeDetails = {
262
+ reason,
263
+ event,
264
+ cancel: () => {
265
+ canceled = true;
266
+ },
267
+ get isCanceled() {
268
+ return canceled;
269
+ }
270
+ };
271
+
272
+ onOpenChangeProp?.(false, details);
273
+ if (details.isCanceled) return;
274
+ if (triggerRefProp) {
275
+ applyStandaloneTriggerCloseState(triggerRefProp, reason, event);
276
+ }
89
277
  } else {
90
- ctx!.onOpenChange(value);
278
+ ctx!.close(reason, event);
91
279
  }
92
280
  }
93
281
 
94
282
  function handleKeydown(event: KeyboardEvent) {
95
283
  if (event.key === 'Escape' && isOpen && shouldCloseOnEscape) {
96
284
  event.preventDefault();
97
- close();
285
+ close('escape-key', event);
98
286
  }
99
287
  }
100
288
 
@@ -107,7 +295,7 @@
107
295
  const focusInTrigger = triggerRef?.contains(target) || target === triggerRef;
108
296
 
109
297
  if (!focusInPopover && !focusInTrigger) {
110
- handleOpenChange(false);
298
+ close('focus-out', event);
111
299
  }
112
300
  }
113
301
 
@@ -121,10 +309,28 @@
121
309
 
122
310
  // Only close on external scroll
123
311
  if (!isInsidePopover && !isInsideTrigger) {
124
- close();
312
+ close('outside-press', event);
125
313
  }
126
314
  }
127
315
 
316
+ $effect(() => {
317
+ if (!isStandalone) {
318
+ if (trackedStandaloneTrigger) {
319
+ clearTriggerFocusState(trackedStandaloneTrigger);
320
+ }
321
+ trackedStandaloneTrigger = null;
322
+ clearStandaloneTriggerTracking();
323
+ return;
324
+ }
325
+
326
+ if (trackedStandaloneTrigger && trackedStandaloneTrigger !== triggerRefProp) {
327
+ clearTriggerFocusState(trackedStandaloneTrigger);
328
+ clearStandaloneTriggerTracking();
329
+ }
330
+
331
+ trackedStandaloneTrigger = triggerRefProp;
332
+ });
333
+
128
334
  onMount(() => {
129
335
  if (!browser) return;
130
336
  document.addEventListener('keydown', handleKeydown);
@@ -134,28 +340,113 @@
134
340
 
135
341
  onDestroy(() => {
136
342
  if (!browser) return;
343
+ if (trackedStandaloneTrigger) {
344
+ clearTriggerFocusState(trackedStandaloneTrigger);
345
+ }
346
+ clearMotionTracking();
347
+ clearStandaloneTriggerTracking();
137
348
  document.removeEventListener('keydown', handleKeydown);
138
349
  document.removeEventListener('focusin', handleDocumentFocusIn);
139
350
  document.removeEventListener('scroll', handleScroll, true);
140
351
  });
352
+
353
+ $effect(() => {
354
+ const wasOpen = previousOpen;
355
+ previousOpen = isOpen;
356
+
357
+ if (isOpen) {
358
+ closeHandledInternally = false;
359
+ return;
360
+ }
361
+
362
+ if (!wasOpen) {
363
+ closeHandledInternally = false;
364
+ return;
365
+ }
366
+
367
+ if (closeHandledInternally) {
368
+ closeHandledInternally = false;
369
+ return;
370
+ }
371
+
372
+ releaseFocusedDescendantBeforeHide();
373
+ });
374
+
375
+ $effect(() => {
376
+ if (isOpen) {
377
+ const shouldAnimateIn = !isMounted || isExiting;
378
+ isMounted = true;
379
+ isExiting = false;
380
+ if (shouldAnimateIn) {
381
+ isEntering = true;
382
+ }
383
+ return;
384
+ }
385
+
386
+ if (!isMounted) {
387
+ isEntering = false;
388
+ isExiting = false;
389
+ return;
390
+ }
391
+
392
+ isEntering = false;
393
+ isExiting = true;
394
+ });
395
+
396
+ $effect(() => {
397
+ if (!isMounted || !popoverRef) {
398
+ clearMotionTracking();
399
+ return;
400
+ }
401
+
402
+ if (isEntering) {
403
+ trackMotion('enter', popoverRef);
404
+ return;
405
+ }
406
+
407
+ if (isExiting) {
408
+ trackMotion('exit', popoverRef);
409
+ return;
410
+ }
411
+
412
+ clearMotionTracking();
413
+ });
141
414
  </script>
142
415
 
143
- {#if isOpen}
416
+ {#if isMounted}
144
417
  <Portal>
145
418
  <div
146
419
  bind:this={popoverRef}
147
420
  class={className}
148
421
  role="dialog"
149
- aria-modal={isModal}
150
- use:floating={{ anchor: triggerRef, offset, placement, shouldFlip, boundaryElement }}
422
+ aria-modal={isOpen ? isModal : undefined}
423
+ aria-hidden={isOpen ? undefined : 'true'}
424
+ inert={!isOpen}
425
+ data-state={isOpen ? 'open' : 'closed'}
426
+ data-entering={isEntering || undefined}
427
+ data-exiting={isExiting || undefined}
428
+ data-placement={resolvedPlacement}
429
+ use:floating={{
430
+ anchor: triggerRef,
431
+ offset,
432
+ placement,
433
+ shouldFlip,
434
+ boundaryElement,
435
+ onPositionUpdate: (_, __, finalPlacement) => {
436
+ resolvedPlacement = resolvePlacementSide(finalPlacement);
437
+ }
438
+ }}
151
439
  use:clickOutside={{
152
- handler: close,
153
- enabled: shouldCloseOnInteractOutside,
440
+ handler: (event) => {
441
+ event.preventDefault();
442
+ close('outside-press', event);
443
+ },
444
+ enabled: isOpen && shouldCloseOnInteractOutside,
154
445
  ignore: [triggerRef]
155
446
  }}
156
- use:focusTrap={isModal}
157
- use:scrollLock={isModal}
158
- use:ariaHideOutside={isModal}
447
+ use:focusTrap={{ enabled: isOpen && isModal, restoreFocus: false, initialFocus }}
448
+ use:scrollLock={isOpen && isModal}
449
+ use:ariaHideOutside={isOpen && isModal}
159
450
  style="position: fixed; z-index: 9999;"
160
451
  {...restProps}
161
452
  >
@@ -1,6 +1,8 @@
1
1
  import type { Snippet } from 'svelte';
2
2
  import type { HTMLAttributes } from 'svelte/elements';
3
3
  import { type ExtendedPlacement } from '../../primitives/floating';
4
+ import { type FocusTrapOptions } from '../../primitives/focus-trap';
5
+ import { type PopoverOpenChangeDetails } from '../root/context';
4
6
  /**
5
7
  * Popover.Content - The floating content panel.
6
8
  * Can be used inside Popover.Root (reads context) or standalone (props required).
@@ -26,12 +28,14 @@ type PopoverContentProps = {
26
28
  shouldCloseOnEscape?: boolean;
27
29
  /** Whether losing focus (blur) should close the popover. Defaults to true for non-modal popovers. */
28
30
  shouldCloseOnBlur?: boolean;
31
+ /** Element or selector to focus first when modal trap activates. */
32
+ initialFocus?: FocusTrapOptions['initialFocus'];
29
33
  /** Controlled open state (standalone mode). */
30
34
  open?: boolean;
31
35
  /** Reference to the trigger element (standalone mode). */
32
36
  triggerRef?: HTMLElement | null;
33
37
  /** Callback when open state changes (standalone mode). */
34
- onOpenChange?: (open: boolean) => void;
38
+ onOpenChange?: (open: boolean, details: PopoverOpenChangeDetails) => void;
35
39
  } & Omit<HTMLAttributes<HTMLDivElement>, 'class' | 'children'>;
36
40
  declare const PopoverContent: import("svelte").Component<PopoverContentProps, {}, "">;
37
41
  type PopoverContent = ReturnType<typeof PopoverContent>;
@@ -1,8 +1,8 @@
1
- export * as Popover from './index.parts.ts';
1
+ export * as Popover from './index.parts.js';
2
2
  export { default as PopoverRoot } from './root/popover-root.svelte';
3
3
  export { default as PopoverContent } from './content/popover-content.svelte';
4
4
  export { default as PopoverTrigger } from './trigger/popover-trigger.svelte';
5
5
  export { default as PopoverTriggerButton } from './trigger/popover-trigger-button.svelte';
6
- export { getPopoverContext, setPopoverContext, type PopoverContext, getPopoverTriggerContext, setPopoverTriggerContext, type PopoverTriggerContext } from './root/context.ts';
7
- import * as PopoverParts from './index.parts.ts';
6
+ export { getPopoverContext, setPopoverContext, type PopoverContext, type PopoverCanonicalCloseReason, type PopoverCloseReason, type PopoverOpenReason, type PopoverChangeReason, type PopoverOpenChangeDetails } from './root/context.js';
7
+ import * as PopoverParts from './index.parts.js';
8
8
  export default PopoverParts;
@@ -1,14 +1,12 @@
1
1
  // Namespace export for component composition: <Popover.Root>, <Popover.Trigger>, etc.
2
- export * as Popover from './index.parts.ts';
2
+ export * as Popover from './index.parts.js';
3
3
  // Direct named exports for individual imports
4
4
  export { default as PopoverRoot } from './root/popover-root.svelte';
5
5
  export { default as PopoverContent } from './content/popover-content.svelte';
6
6
  export { default as PopoverTrigger } from './trigger/popover-trigger.svelte';
7
7
  export { default as PopoverTriggerButton } from './trigger/popover-trigger-button.svelte';
8
8
  // Context and types
9
- export { getPopoverContext, setPopoverContext,
10
- // Legacy aliases
11
- getPopoverTriggerContext, setPopoverTriggerContext } from './root/context.ts';
9
+ export { getPopoverContext, setPopoverContext } from './root/context.js';
12
10
  // Default export as namespace object
13
- import * as PopoverParts from './index.parts.ts';
11
+ import * as PopoverParts from './index.parts.js';
14
12
  export default PopoverParts;