@human-kit/svelte-components 1.0.0-alpha.1 → 1.0.0-alpha.10

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 (424) hide show
  1. package/dist/FOCUS_STATE_CONTRACT.md +63 -0
  2. package/dist/FOCUS_STATE_REVIEW_TEMPLATE.md +70 -0
  3. package/dist/button/README.md +48 -0
  4. package/dist/button/TODO.md +13 -0
  5. package/dist/button/index.d.ts +5 -0
  6. package/dist/button/index.js +4 -0
  7. package/dist/button/index.parts.d.ts +1 -0
  8. package/dist/button/index.parts.js +1 -0
  9. package/dist/button/root/README.md +43 -0
  10. package/dist/button/root/button-root.svelte +362 -0
  11. package/dist/button/root/button-root.svelte.d.ts +21 -0
  12. package/dist/button/root/button-test.svelte +76 -0
  13. package/dist/button/root/button-test.svelte.d.ts +11 -0
  14. package/dist/calendar/README.md +66 -0
  15. package/dist/calendar/TODO.md +23 -0
  16. package/dist/calendar/body-cell/README.md +15 -0
  17. package/dist/calendar/body-cell/calendar-body-cell.svelte +230 -0
  18. package/dist/calendar/body-cell/calendar-body-cell.svelte.d.ts +9 -0
  19. package/dist/calendar/grid/README.md +13 -0
  20. package/dist/calendar/grid/calendar-grid-month-scope.svelte +16 -0
  21. package/dist/calendar/grid/calendar-grid-month-scope.svelte.d.ts +8 -0
  22. package/dist/calendar/grid/calendar-grid.svelte +45 -0
  23. package/dist/calendar/grid/calendar-grid.svelte.d.ts +8 -0
  24. package/dist/calendar/grid/month-scope.d.ts +2 -0
  25. package/dist/calendar/grid/month-scope.js +8 -0
  26. package/dist/calendar/grid-body/README.md +13 -0
  27. package/dist/calendar/grid-body/calendar-grid-body-custom-test.svelte +13 -0
  28. package/dist/calendar/grid-body/calendar-grid-body-custom-test.svelte.d.ts +18 -0
  29. package/dist/calendar/grid-body/calendar-grid-body.svelte +36 -0
  30. package/dist/calendar/grid-body/calendar-grid-body.svelte.d.ts +8 -0
  31. package/dist/calendar/grid-header/README.md +13 -0
  32. package/dist/calendar/grid-header/calendar-grid-header-custom-test.svelte +13 -0
  33. package/dist/calendar/grid-header/calendar-grid-header-custom-test.svelte.d.ts +18 -0
  34. package/dist/calendar/grid-header/calendar-grid-header.svelte +31 -0
  35. package/dist/calendar/grid-header/calendar-grid-header.svelte.d.ts +8 -0
  36. package/dist/calendar/header-cell/README.md +14 -0
  37. package/dist/calendar/header-cell/calendar-header-cell-test.svelte +11 -0
  38. package/dist/calendar/header-cell/calendar-header-cell-test.svelte.d.ts +18 -0
  39. package/dist/calendar/header-cell/calendar-header-cell.svelte +16 -0
  40. package/dist/calendar/header-cell/calendar-header-cell.svelte.d.ts +8 -0
  41. package/dist/calendar/heading/README.md +13 -0
  42. package/dist/calendar/heading/calendar-heading.svelte +17 -0
  43. package/dist/calendar/heading/calendar-heading.svelte.d.ts +5 -0
  44. package/dist/calendar/index.d.ts +13 -0
  45. package/dist/calendar/index.js +13 -0
  46. package/dist/calendar/index.parts.d.ts +9 -0
  47. package/dist/calendar/index.parts.js +9 -0
  48. package/dist/calendar/root/README.md +24 -0
  49. package/dist/calendar/root/calendar-root-bind-value-test.svelte +14 -0
  50. package/dist/calendar/root/calendar-root-bind-value-test.svelte.d.ts +3 -0
  51. package/dist/calendar/root/calendar-root-controlled-clear-test.svelte +20 -0
  52. package/dist/calendar/root/calendar-root-controlled-clear-test.svelte.d.ts +3 -0
  53. package/dist/calendar/root/calendar-root-test.svelte +71 -0
  54. package/dist/calendar/root/calendar-root-test.svelte.d.ts +13 -0
  55. package/dist/calendar/root/calendar-root.svelte +143 -0
  56. package/dist/calendar/root/calendar-root.svelte.d.ts +31 -0
  57. package/dist/calendar/root/context.d.ts +66 -0
  58. package/dist/calendar/root/context.js +727 -0
  59. package/dist/calendar/root/date-utils.d.ts +17 -0
  60. package/dist/calendar/root/date-utils.js +94 -0
  61. package/dist/calendar/trigger-next/README.md +14 -0
  62. package/dist/calendar/trigger-next/calendar-trigger-next.svelte +43 -0
  63. package/dist/calendar/trigger-next/calendar-trigger-next.svelte.d.ts +9 -0
  64. package/dist/calendar/trigger-previous/README.md +14 -0
  65. package/dist/calendar/trigger-previous/calendar-trigger-previous.svelte +43 -0
  66. package/dist/calendar/trigger-previous/calendar-trigger-previous.svelte.d.ts +9 -0
  67. package/dist/checkbox/README.md +53 -0
  68. package/dist/checkbox/TODO.md +16 -0
  69. package/dist/checkbox/index.d.ts +6 -0
  70. package/dist/checkbox/index.js +6 -0
  71. package/dist/checkbox/index.parts.d.ts +2 -0
  72. package/dist/checkbox/index.parts.js +2 -0
  73. package/dist/checkbox/indicator/README.md +23 -0
  74. package/dist/checkbox/indicator/checkbox-indicator.svelte +43 -0
  75. package/dist/checkbox/indicator/checkbox-indicator.svelte.d.ts +10 -0
  76. package/dist/checkbox/root/README.md +47 -0
  77. package/dist/checkbox/root/checkbox-label-test.svelte +10 -0
  78. package/dist/checkbox/root/checkbox-label-test.svelte.d.ts +18 -0
  79. package/dist/checkbox/root/checkbox-root.svelte +361 -0
  80. package/dist/checkbox/root/checkbox-root.svelte.d.ts +23 -0
  81. package/dist/checkbox/root/checkbox-test.svelte +59 -0
  82. package/dist/checkbox/root/checkbox-test.svelte.d.ts +18 -0
  83. package/dist/checkbox/root/context.d.ts +21 -0
  84. package/dist/checkbox/root/context.js +15 -0
  85. package/dist/clock/README.md +75 -0
  86. package/dist/clock/axis/README.md +24 -0
  87. package/dist/clock/axis/clock-axis.svelte +37 -0
  88. package/dist/clock/axis/clock-axis.svelte.d.ts +8 -0
  89. package/dist/clock/hooks/use-wheel-scroll.svelte.d.ts +16 -0
  90. package/dist/clock/hooks/use-wheel-scroll.svelte.js +336 -0
  91. package/dist/clock/index.d.ts +10 -0
  92. package/dist/clock/index.js +10 -0
  93. package/dist/clock/index.parts.d.ts +4 -0
  94. package/dist/clock/index.parts.js +4 -0
  95. package/dist/clock/root/README.md +38 -0
  96. package/dist/clock/root/clock-root-test.svelte +62 -0
  97. package/dist/clock/root/clock-root-test.svelte.d.ts +14 -0
  98. package/dist/clock/root/clock-root.svelte +329 -0
  99. package/dist/clock/root/clock-root.svelte.d.ts +25 -0
  100. package/dist/clock/root/context.d.ts +22 -0
  101. package/dist/clock/root/context.js +15 -0
  102. package/dist/clock/root/resolve-visible-columns.d.ts +7 -0
  103. package/dist/clock/root/resolve-visible-columns.js +16 -0
  104. package/dist/clock/root/time-utils.d.ts +48 -0
  105. package/dist/clock/root/time-utils.js +314 -0
  106. package/dist/clock/root/wheel-options.d.ts +17 -0
  107. package/dist/clock/root/wheel-options.js +63 -0
  108. package/dist/clock/wheel-column/README.md +25 -0
  109. package/dist/clock/wheel-column/clock-wheel-column-bindable-test.svelte +16 -0
  110. package/dist/clock/wheel-column/clock-wheel-column-bindable-test.svelte.d.ts +3 -0
  111. package/dist/clock/wheel-column/clock-wheel-column-custom-snippet-test.svelte +29 -0
  112. package/dist/clock/wheel-column/clock-wheel-column-custom-snippet-test.svelte.d.ts +6 -0
  113. package/dist/clock/wheel-column/clock-wheel-column-default-height-test.svelte +11 -0
  114. package/dist/clock/wheel-column/clock-wheel-column-default-height-test.svelte.d.ts +3 -0
  115. package/dist/clock/wheel-column/clock-wheel-column-test.svelte +38 -0
  116. package/dist/clock/wheel-column/clock-wheel-column-test.svelte.d.ts +12 -0
  117. package/dist/clock/wheel-column/clock-wheel-column-tp-test.svelte +38 -0
  118. package/dist/clock/wheel-column/clock-wheel-column-tp-test.svelte.d.ts +12 -0
  119. package/dist/clock/wheel-column/clock-wheel-column-untagged-snippet-test.svelte +29 -0
  120. package/dist/clock/wheel-column/clock-wheel-column-untagged-snippet-test.svelte.d.ts +6 -0
  121. package/dist/clock/wheel-column/clock-wheel-column.svelte +499 -0
  122. package/dist/clock/wheel-column/clock-wheel-column.svelte.d.ts +17 -0
  123. package/dist/clock/wheel-item/README.md +17 -0
  124. package/dist/clock/wheel-item/clock-wheel-item.svelte +49 -0
  125. package/dist/clock/wheel-item/clock-wheel-item.svelte.d.ts +17 -0
  126. package/dist/combobox/README.md +46 -0
  127. package/dist/combobox/TODO.md +28 -175
  128. package/dist/combobox/button/README.md +20 -0
  129. package/dist/combobox/button/combobox-button-test.svelte +27 -0
  130. package/dist/combobox/button/combobox-button-test.svelte.d.ts +6 -0
  131. package/dist/combobox/button/combobox-button.svelte +10 -11
  132. package/dist/combobox/clear/README.md +21 -0
  133. package/dist/combobox/clear/combobox-clear-test.svelte +34 -0
  134. package/dist/combobox/clear/combobox-clear-test.svelte.d.ts +3 -0
  135. package/dist/combobox/clear/combobox-clear.svelte +61 -0
  136. package/dist/combobox/clear/combobox-clear.svelte.d.ts +9 -0
  137. package/dist/combobox/index.d.ts +5 -3
  138. package/dist/combobox/index.js +5 -3
  139. package/dist/combobox/index.parts.d.ts +2 -0
  140. package/dist/combobox/index.parts.js +2 -0
  141. package/dist/combobox/input/README.md +16 -0
  142. package/dist/combobox/input/combobox-input.svelte +43 -12
  143. package/dist/combobox/item/README.md +27 -0
  144. package/dist/combobox/item/combobox-item-implicit-text-test.svelte +1 -1
  145. package/dist/combobox/item/combobox-listboxitem.svelte +1 -9
  146. package/dist/combobox/item-indicator/README.md +15 -0
  147. package/dist/combobox/item-indicator/combobox-item-indicator.svelte +4 -15
  148. package/dist/combobox/list/README.md +27 -0
  149. package/dist/combobox/list/combobox-listbox.svelte.d.ts +1 -1
  150. package/dist/combobox/popover/README.md +13 -0
  151. package/dist/combobox/popover/combobox-popover.svelte +133 -17
  152. package/dist/combobox/popover/combobox-scrollable-list-test.svelte +23 -0
  153. package/dist/combobox/popover/combobox-scrollable-list-test.svelte.d.ts +18 -0
  154. package/dist/combobox/root/README.md +45 -0
  155. package/dist/combobox/root/combobox-multiselect-test.svelte +1 -1
  156. package/dist/combobox/root/combobox-numeric-string-id-test.svelte +1 -1
  157. package/dist/combobox/root/combobox-test.svelte +16 -3
  158. package/dist/combobox/root/combobox-test.svelte.d.ts +1 -0
  159. package/dist/combobox/root/combobox.svelte +78 -2
  160. package/dist/combobox/root/combobox.svelte.d.ts +1 -0
  161. package/dist/combobox/root/context.d.ts +9 -1
  162. package/dist/combobox/tag/README.md +37 -0
  163. package/dist/combobox/tag-remove/README.md +14 -0
  164. package/dist/combobox/tag-remove/combobox-tag-remove.svelte +3 -2
  165. package/dist/combobox/tags/README.md +23 -0
  166. package/dist/combobox/trigger/README.md +21 -0
  167. package/dist/combobox/trigger/combobox-trigger.svelte +56 -0
  168. package/dist/combobox/trigger/combobox-trigger.svelte.d.ts +9 -0
  169. package/dist/datepicker/README.md +100 -0
  170. package/dist/datepicker/TODO.md +28 -0
  171. package/dist/datepicker/calendar/README.md +19 -0
  172. package/dist/datepicker/calendar/date-picker-calendar-unsafe-props-test.svelte +60 -0
  173. package/dist/datepicker/calendar/date-picker-calendar-unsafe-props-test.svelte.d.ts +3 -0
  174. package/dist/datepicker/calendar/date-picker-calendar.svelte +65 -0
  175. package/dist/datepicker/calendar/date-picker-calendar.svelte.d.ts +10 -0
  176. package/dist/datepicker/index.d.ts +18 -0
  177. package/dist/datepicker/index.js +18 -0
  178. package/dist/datepicker/index.parts.d.ts +14 -0
  179. package/dist/datepicker/index.parts.js +14 -0
  180. package/dist/datepicker/input/README.md +15 -0
  181. package/dist/datepicker/input/date-picker-input.svelte +108 -0
  182. package/dist/datepicker/input/date-picker-input.svelte.d.ts +11 -0
  183. package/dist/datepicker/internal/strict-props.d.ts +2 -0
  184. package/dist/datepicker/internal/strict-props.js +28 -0
  185. package/dist/datepicker/popover/README.md +20 -0
  186. package/dist/datepicker/popover/date-picker-popover-handler-test.svelte +57 -0
  187. package/dist/datepicker/popover/date-picker-popover-handler-test.svelte.d.ts +3 -0
  188. package/dist/datepicker/popover/date-picker-popover-unsafe-props-test.svelte +45 -0
  189. package/dist/datepicker/popover/date-picker-popover-unsafe-props-test.svelte.d.ts +18 -0
  190. package/dist/datepicker/popover/date-picker-popover.svelte +87 -0
  191. package/dist/datepicker/popover/date-picker-popover.svelte.d.ts +7 -0
  192. package/dist/datepicker/root/README.md +38 -0
  193. package/dist/datepicker/root/context.d.ts +43 -0
  194. package/dist/datepicker/root/context.js +15 -0
  195. package/dist/datepicker/root/date-picker-bindable-empty-test.svelte +24 -0
  196. package/dist/datepicker/root/date-picker-bindable-empty-test.svelte.d.ts +3 -0
  197. package/dist/datepicker/root/date-picker-bindable-test.svelte +41 -0
  198. package/dist/datepicker/root/date-picker-bindable-test.svelte.d.ts +3 -0
  199. package/dist/datepicker/root/date-picker-empty-test.svelte +47 -0
  200. package/dist/datepicker/root/date-picker-empty-test.svelte.d.ts +3 -0
  201. package/dist/datepicker/root/date-picker-locale-typing-test.svelte +47 -0
  202. package/dist/datepicker/root/date-picker-locale-typing-test.svelte.d.ts +3 -0
  203. package/dist/datepicker/root/date-picker-open-cancel-test.svelte +54 -0
  204. package/dist/datepicker/root/date-picker-open-cancel-test.svelte.d.ts +8 -0
  205. package/dist/datepicker/root/date-picker-root.svelte +495 -0
  206. package/dist/datepicker/root/date-picker-root.svelte.d.ts +24 -0
  207. package/dist/datepicker/root/date-picker-test.svelte +86 -0
  208. package/dist/datepicker/root/date-picker-test.svelte.d.ts +13 -0
  209. package/dist/datepicker/root/date-utils.d.ts +17 -0
  210. package/dist/datepicker/root/date-utils.js +138 -0
  211. package/dist/datepicker/root/draft-evaluation.d.ts +13 -0
  212. package/dist/datepicker/root/draft-evaluation.js +56 -0
  213. package/dist/datepicker/root/focus-controller.d.ts +3 -0
  214. package/dist/datepicker/root/focus-controller.js +15 -0
  215. package/dist/datepicker/root/open-change.d.ts +5 -0
  216. package/dist/datepicker/root/open-change.js +13 -0
  217. package/dist/datepicker/root/open-controller.d.ts +7 -0
  218. package/dist/datepicker/root/open-controller.js +15 -0
  219. package/dist/datepicker/root/segment-controller.d.ts +8 -0
  220. package/dist/datepicker/root/segment-controller.js +53 -0
  221. package/dist/datepicker/root/segment-state.d.ts +18 -0
  222. package/dist/datepicker/root/segment-state.js +134 -0
  223. package/dist/datepicker/root/value-commit.d.ts +4 -0
  224. package/dist/datepicker/root/value-commit.js +8 -0
  225. package/dist/datepicker/segment/README.md +14 -0
  226. package/dist/datepicker/segment/date-picker-segment.svelte +319 -0
  227. package/dist/datepicker/segment/date-picker-segment.svelte.d.ts +9 -0
  228. package/dist/datepicker/trigger/README.md +14 -0
  229. package/dist/datepicker/trigger/date-picker-trigger.svelte +110 -0
  230. package/dist/datepicker/trigger/date-picker-trigger.svelte.d.ts +9 -0
  231. package/dist/dialog/README.md +35 -0
  232. package/dist/dialog/content/README.md +16 -0
  233. package/dist/dialog/content/dialog-content.svelte +6 -6
  234. package/dist/dialog/index.d.ts +3 -3
  235. package/dist/dialog/index.js +2 -2
  236. package/dist/dialog/overlay/README.md +13 -0
  237. package/dist/dialog/portal/README.md +12 -0
  238. package/dist/dialog/root/README.md +53 -0
  239. package/dist/dialog/root/context.d.ts +2 -1
  240. package/dist/dialog/root/dialog-root.svelte +9 -2
  241. package/dist/dialog/trigger/README.md +12 -0
  242. package/dist/dialog/trigger/dialog-trigger-multi-button-test.svelte +19 -0
  243. package/dist/dialog/trigger/dialog-trigger-multi-button-test.svelte.d.ts +18 -0
  244. package/dist/dialog/trigger/dialog-trigger.svelte +18 -6
  245. package/dist/index.d.ts +31 -13
  246. package/dist/index.js +31 -13
  247. package/dist/input/README.md +38 -0
  248. package/dist/input/TODO.md +12 -0
  249. package/dist/input/input-test.svelte +43 -0
  250. package/dist/input/input-test.svelte.d.ts +12 -0
  251. package/dist/input/input.svelte +151 -7
  252. package/dist/input/input.svelte.d.ts +8 -2
  253. package/dist/listbox/README.md +26 -0
  254. package/dist/listbox/index.d.ts +3 -3
  255. package/dist/listbox/index.js +3 -3
  256. package/dist/listbox/item/README.md +25 -0
  257. package/dist/listbox/item/listbox-item.svelte +152 -2
  258. package/dist/listbox/item/listbox-item.svelte.d.ts +2 -0
  259. package/dist/listbox/root/README.md +40 -0
  260. package/dist/listbox/root/listbox-test.svelte +14 -2
  261. package/dist/listbox/root/listbox-test.svelte.d.ts +1 -0
  262. package/dist/listbox/root/listbox.svelte +44 -0
  263. package/dist/listbox/root/listbox.svelte.d.ts +2 -2
  264. package/dist/locale-provider/context.d.ts +8 -0
  265. package/dist/locale-provider/context.js +18 -0
  266. package/dist/locale-provider/index.d.ts +4 -0
  267. package/dist/locale-provider/index.js +4 -0
  268. package/dist/locale-provider/locale-provider-initial-value-test.svelte +15 -0
  269. package/dist/locale-provider/locale-provider-initial-value-test.svelte.d.ts +7 -0
  270. package/dist/locale-provider/locale-provider-test.svelte +20 -0
  271. package/dist/locale-provider/locale-provider-test.svelte.d.ts +6 -0
  272. package/dist/locale-provider/locale-provider-value-probe.svelte +22 -0
  273. package/dist/locale-provider/locale-provider-value-probe.svelte.d.ts +6 -0
  274. package/dist/locale-provider/locale-provider.svelte +23 -0
  275. package/dist/locale-provider/locale-provider.svelte.d.ts +8 -0
  276. package/dist/popover/README.md +42 -0
  277. package/dist/popover/content/README.md +36 -0
  278. package/dist/popover/content/popover-content-standalone-test.svelte +28 -0
  279. package/dist/popover/content/popover-content-standalone-test.svelte.d.ts +6 -0
  280. package/dist/popover/content/popover-content-test.svelte +32 -2
  281. package/dist/popover/content/popover-content-test.svelte.d.ts +3 -1
  282. package/dist/popover/content/popover-content.svelte +276 -23
  283. package/dist/popover/content/popover-content.svelte.d.ts +5 -1
  284. package/dist/popover/index.d.ts +3 -3
  285. package/dist/popover/index.js +3 -5
  286. package/dist/popover/root/README.md +25 -0
  287. package/dist/popover/root/context.d.ts +16 -7
  288. package/dist/popover/root/context.js +0 -2
  289. package/dist/popover/root/focus-state.d.ts +4 -0
  290. package/dist/popover/root/focus-state.js +33 -0
  291. package/dist/popover/root/popover-root.svelte +90 -17
  292. package/dist/popover/root/popover-root.svelte.d.ts +2 -1
  293. package/dist/popover/root/popover-test.svelte +2 -1
  294. package/dist/popover/root/popover-test.svelte.d.ts +2 -1
  295. package/dist/popover/trigger/README.md +23 -0
  296. package/dist/popover/trigger/popover-trigger-button.svelte +14 -10
  297. package/dist/popover/trigger/popover-trigger-button.svelte.d.ts +2 -3
  298. package/dist/popover/trigger/popover-trigger-multi-button-test.svelte +16 -0
  299. package/dist/popover/trigger/popover-trigger-multi-button-test.svelte.d.ts +18 -0
  300. package/dist/popover/trigger/popover-trigger.svelte +19 -7
  301. package/dist/portal/portal.svelte +3 -1
  302. package/dist/primitives/click-outside.d.ts +1 -1
  303. package/dist/primitives/click-outside.js +1 -1
  304. package/dist/primitives/floating.js +12 -4
  305. package/dist/primitives/focus-trap.d.ts +7 -2
  306. package/dist/primitives/focus-trap.js +50 -17
  307. package/dist/primitives/index.d.ts +1 -0
  308. package/dist/primitives/index.js +1 -0
  309. package/dist/primitives/input-modality.d.ts +7 -0
  310. package/dist/primitives/input-modality.js +125 -0
  311. package/dist/table/IMPLEMENTATION_NOTES.md +8 -0
  312. package/dist/table/PLAN-HIDDEN-COLUMNS.md +152 -0
  313. package/dist/table/PLAN.md +924 -0
  314. package/dist/table/README.md +116 -0
  315. package/dist/table/SELECTION_CHECKBOX_PLAN.md +234 -0
  316. package/dist/table/TODO.md +100 -0
  317. package/dist/table/body/README.md +24 -0
  318. package/dist/table/body/table-body.svelte +25 -0
  319. package/dist/table/body/table-body.svelte.d.ts +9 -0
  320. package/dist/table/cell/README.md +25 -0
  321. package/dist/table/cell/table-cell.svelte +247 -0
  322. package/dist/table/cell/table-cell.svelte.d.ts +9 -0
  323. package/dist/table/checkbox/README.md +38 -0
  324. package/dist/table/checkbox/table-checkbox-test.svelte +121 -0
  325. package/dist/table/checkbox/table-checkbox-test.svelte.d.ts +16 -0
  326. package/dist/table/checkbox/table-checkbox.svelte +274 -0
  327. package/dist/table/checkbox/table-checkbox.svelte.d.ts +13 -0
  328. package/dist/table/checkbox-indicator/README.md +29 -0
  329. package/dist/table/checkbox-indicator/table-checkbox-indicator.svelte +22 -0
  330. package/dist/table/checkbox-indicator/table-checkbox-indicator.svelte.d.ts +10 -0
  331. package/dist/table/column/README.md +32 -0
  332. package/dist/table/column/table-column.svelte +108 -0
  333. package/dist/table/column/table-column.svelte.d.ts +18 -0
  334. package/dist/table/column-header-cell/README.md +28 -0
  335. package/dist/table/column-header-cell/table-column-header-cell.svelte +281 -0
  336. package/dist/table/column-header-cell/table-column-header-cell.svelte.d.ts +9 -0
  337. package/dist/table/column-resizer/README.md +32 -0
  338. package/dist/table/column-resizer/table-column-resizer-freeze-layout-test.svelte +51 -0
  339. package/dist/table/column-resizer/table-column-resizer-freeze-layout-test.svelte.d.ts +3 -0
  340. package/dist/table/column-resizer/table-column-resizer-selection-column-test.svelte +83 -0
  341. package/dist/table/column-resizer/table-column-resizer-selection-column-test.svelte.d.ts +3 -0
  342. package/dist/table/column-resizer/table-column-resizer-test.svelte +75 -0
  343. package/dist/table/column-resizer/table-column-resizer-test.svelte.d.ts +3 -0
  344. package/dist/table/column-resizer/table-column-resizer.svelte +616 -0
  345. package/dist/table/column-resizer/table-column-resizer.svelte.d.ts +11 -0
  346. package/dist/table/empty-state/README.md +25 -0
  347. package/dist/table/empty-state/table-empty-state.svelte +38 -0
  348. package/dist/table/empty-state/table-empty-state.svelte.d.ts +8 -0
  349. package/dist/table/footer/README.md +24 -0
  350. package/dist/table/footer/table-footer.svelte +19 -0
  351. package/dist/table/footer/table-footer.svelte.d.ts +9 -0
  352. package/dist/table/header/README.md +24 -0
  353. package/dist/table/header/table-header.svelte +19 -0
  354. package/dist/table/header/table-header.svelte.d.ts +9 -0
  355. package/dist/table/index.d.ts +16 -0
  356. package/dist/table/index.js +16 -0
  357. package/dist/table/index.parts.d.ts +12 -0
  358. package/dist/table/index.parts.js +12 -0
  359. package/dist/table/root/README.md +56 -0
  360. package/dist/table/root/context.d.ts +198 -0
  361. package/dist/table/root/context.js +1426 -0
  362. package/dist/table/root/table-reorder-test.svelte +64 -0
  363. package/dist/table/root/table-reorder-test.svelte.d.ts +3 -0
  364. package/dist/table/root/table-root.svelte +410 -0
  365. package/dist/table/root/table-root.svelte.d.ts +29 -0
  366. package/dist/table/root/table-test.svelte +165 -0
  367. package/dist/table/root/table-test.svelte.d.ts +25 -0
  368. package/dist/table/row/README.md +27 -0
  369. package/dist/table/row/table-row.svelte +321 -0
  370. package/dist/table/row/table-row.svelte.d.ts +13 -0
  371. package/dist/test-utils/focus-contract.d.ts +3 -0
  372. package/dist/test-utils/focus-contract.js +26 -0
  373. package/dist/timepicker/IMPLEMENTATION_PLAN.md +254 -0
  374. package/dist/timepicker/README.md +97 -0
  375. package/dist/timepicker/TODO.md +86 -0
  376. package/dist/timepicker/clock/README.md +14 -0
  377. package/dist/timepicker/clock/time-picker-clock-test.svelte +45 -0
  378. package/dist/timepicker/clock/time-picker-clock-test.svelte.d.ts +11 -0
  379. package/dist/timepicker/clock/time-picker-clock.svelte +65 -0
  380. package/dist/timepicker/clock/time-picker-clock.svelte.d.ts +10 -0
  381. package/dist/timepicker/index.d.ts +14 -0
  382. package/dist/timepicker/index.js +14 -0
  383. package/dist/timepicker/index.parts.d.ts +8 -0
  384. package/dist/timepicker/index.parts.js +8 -0
  385. package/dist/timepicker/input/README.md +15 -0
  386. package/dist/timepicker/input/time-picker-input-forwarding-test.svelte +40 -0
  387. package/dist/timepicker/input/time-picker-input-forwarding-test.svelte.d.ts +3 -0
  388. package/dist/timepicker/input/time-picker-input.svelte +109 -0
  389. package/dist/timepicker/input/time-picker-input.svelte.d.ts +11 -0
  390. package/dist/timepicker/internal/strict-props.d.ts +4 -0
  391. package/dist/timepicker/internal/strict-props.js +51 -0
  392. package/dist/timepicker/popover/README.md +20 -0
  393. package/dist/timepicker/popover/time-picker-popover-unsafe-props-test.svelte +22 -0
  394. package/dist/timepicker/popover/time-picker-popover-unsafe-props-test.svelte.d.ts +3 -0
  395. package/dist/timepicker/popover/time-picker-popover.svelte +89 -0
  396. package/dist/timepicker/popover/time-picker-popover.svelte.d.ts +7 -0
  397. package/dist/timepicker/root/README.md +42 -0
  398. package/dist/timepicker/root/context.d.ts +51 -0
  399. package/dist/timepicker/root/context.js +15 -0
  400. package/dist/timepicker/root/time-picker-12h-test.svelte +22 -0
  401. package/dist/timepicker/root/time-picker-12h-test.svelte.d.ts +3 -0
  402. package/dist/timepicker/root/time-picker-bindable-test.svelte +25 -0
  403. package/dist/timepicker/root/time-picker-bindable-test.svelte.d.ts +3 -0
  404. package/dist/timepicker/root/time-picker-empty-test.svelte +20 -0
  405. package/dist/timepicker/root/time-picker-empty-test.svelte.d.ts +3 -0
  406. package/dist/timepicker/root/time-picker-root.svelte +625 -0
  407. package/dist/timepicker/root/time-picker-root.svelte.d.ts +28 -0
  408. package/dist/timepicker/root/time-picker-test.svelte +72 -0
  409. package/dist/timepicker/root/time-picker-test.svelte.d.ts +15 -0
  410. package/dist/timepicker/root/time-utils.d.ts +1 -0
  411. package/dist/timepicker/root/time-utils.js +3 -0
  412. package/dist/timepicker/segment/README.md +14 -0
  413. package/dist/timepicker/segment/time-picker-segment.svelte +365 -0
  414. package/dist/timepicker/segment/time-picker-segment.svelte.d.ts +9 -0
  415. package/dist/timepicker/trigger/README.md +14 -0
  416. package/dist/timepicker/trigger/time-picker-trigger-forwarding-test.svelte +35 -0
  417. package/dist/timepicker/trigger/time-picker-trigger-forwarding-test.svelte.d.ts +3 -0
  418. package/dist/timepicker/trigger/time-picker-trigger.svelte +122 -0
  419. package/dist/timepicker/trigger/time-picker-trigger.svelte.d.ts +9 -0
  420. package/dist/utils/date-only.d.ts +11 -0
  421. package/dist/utils/date-only.js +53 -0
  422. package/dist/utils/index.d.ts +1 -0
  423. package/dist/utils/index.js +1 -0
  424. package/package.json +41 -1
@@ -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,13 +45,15 @@
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 {
@@ -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,188 @@
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;
76
99
 
77
- function close() {
78
- if (isStandalone) {
79
- onOpenChangeProp?.(false);
80
- triggerRefProp?.focus();
81
- } else {
82
- ctx!.close();
100
+ function parseTimeList(value: string) {
101
+ return value
102
+ .split(',')
103
+ .map((entry) => entry.trim())
104
+ .filter(Boolean)
105
+ .map((entry) => {
106
+ if (entry.endsWith('ms')) return Number.parseFloat(entry);
107
+ if (entry.endsWith('s')) return Number.parseFloat(entry) * 1000;
108
+ return Number.parseFloat(entry) || 0;
109
+ });
110
+ }
111
+
112
+ function getMaxTime(duration: string, delay: string) {
113
+ const durations = parseTimeList(duration);
114
+ const delays = parseTimeList(delay);
115
+ const length = Math.max(durations.length, delays.length);
116
+
117
+ let maxTime = 0;
118
+ for (let index = 0; index < length; index += 1) {
119
+ const total =
120
+ (durations[index] ?? durations[durations.length - 1] ?? 0) +
121
+ (delays[index] ?? delays[delays.length - 1] ?? 0);
122
+ maxTime = Math.max(maxTime, total);
123
+ }
124
+
125
+ return maxTime;
126
+ }
127
+
128
+ function getMotionTime(element: HTMLElement) {
129
+ const styles = getComputedStyle(element);
130
+ const transitionTime = getMaxTime(styles.transitionDuration, styles.transitionDelay);
131
+ const animationTime = getMaxTime(styles.animationDuration, styles.animationDelay);
132
+ return Math.max(transitionTime, animationTime);
133
+ }
134
+
135
+ function resolvePlacementSide(value: string) {
136
+ const side = value.split(/[-\s]/)[0];
137
+ return side === 'top' || side === 'right' || side === 'left' ? side : 'bottom';
138
+ }
139
+
140
+ function clearMotionTracking() {
141
+ if (pendingMotionFrame !== undefined) {
142
+ cancelAnimationFrame(pendingMotionFrame);
143
+ pendingMotionFrame = undefined;
144
+ }
145
+
146
+ if (motionTimeout !== undefined) {
147
+ clearTimeout(motionTimeout);
148
+ motionTimeout = undefined;
83
149
  }
150
+
151
+ cleanupMotionListeners?.();
152
+ cleanupMotionListeners = undefined;
153
+ }
154
+
155
+ function finishEnter(id: number) {
156
+ if (id !== motionId) return;
157
+ clearMotionTracking();
158
+ isEntering = false;
159
+ }
160
+
161
+ function finishExit(id: number) {
162
+ if (id !== motionId) return;
163
+ clearMotionTracking();
164
+ isExiting = false;
165
+ isMounted = false;
166
+ }
167
+
168
+ function trackMotion(phase: 'enter' | 'exit', element: HTMLElement) {
169
+ clearMotionTracking();
170
+ const id = ++motionId;
171
+
172
+ pendingMotionFrame = requestAnimationFrame(() => {
173
+ pendingMotionFrame = undefined;
174
+ if (id !== motionId || !element.isConnected) return;
175
+
176
+ const totalMotionTime = getMotionTime(element);
177
+ const complete = phase === 'enter' ? () => finishEnter(id) : () => finishExit(id);
178
+
179
+ if (totalMotionTime <= 0) {
180
+ complete();
181
+ return;
182
+ }
183
+
184
+ const handleMotionEnd = (event: Event) => {
185
+ if (event.target !== element) return;
186
+ complete();
187
+ };
188
+
189
+ element.addEventListener('animationend', handleMotionEnd);
190
+ element.addEventListener('transitionend', handleMotionEnd);
191
+ cleanupMotionListeners = () => {
192
+ element.removeEventListener('animationend', handleMotionEnd);
193
+ element.removeEventListener('transitionend', handleMotionEnd);
194
+ };
195
+
196
+ motionTimeout = window.setTimeout(() => {
197
+ complete();
198
+ }, totalMotionTime + 50);
199
+ });
200
+ }
201
+
202
+ function clearPendingStandaloneTriggerCloseFocus() {
203
+ if (pendingStandaloneTriggerCloseFocusFrame === undefined) return;
204
+ cancelAnimationFrame(pendingStandaloneTriggerCloseFocusFrame);
205
+ pendingStandaloneTriggerCloseFocusFrame = undefined;
84
206
  }
85
207
 
86
- function handleOpenChange(value: boolean) {
208
+ function clearStandaloneTriggerTracking() {
209
+ clearPendingStandaloneTriggerCloseFocus();
210
+ cleanupStandaloneTriggerBlurListener?.();
211
+ cleanupStandaloneTriggerBlurListener = undefined;
212
+ }
213
+
214
+ function applyStandaloneTriggerCloseState(
215
+ trigger: HTMLElement,
216
+ reason: PopoverCloseReason,
217
+ event?: Event
218
+ ) {
219
+ clearStandaloneTriggerTracking();
220
+ pendingStandaloneTriggerCloseFocusFrame = requestAnimationFrame(() => {
221
+ pendingStandaloneTriggerCloseFocusFrame = undefined;
222
+ if (!trigger.isConnected) return;
223
+ applyTriggerCloseFocusState(trigger, reason, event);
224
+
225
+ const cleanupTriggerBlur = addTriggerBlurCleanup(trigger, true);
226
+ const handleDocumentFocusIn = (focusEvent: FocusEvent) => {
227
+ const target = focusEvent.target;
228
+ if (target === trigger) return;
229
+ if (target instanceof Node && trigger.contains(target)) return;
230
+ clearTriggerFocusState(trigger);
231
+ document.removeEventListener('focusin', handleDocumentFocusIn);
232
+ };
233
+
234
+ document.addEventListener('focusin', handleDocumentFocusIn);
235
+ cleanupStandaloneTriggerBlurListener = () => {
236
+ cleanupTriggerBlur();
237
+ document.removeEventListener('focusin', handleDocumentFocusIn);
238
+ };
239
+ });
240
+ }
241
+
242
+ function close(reason: PopoverCloseReason = 'imperative-action', event?: Event) {
87
243
  if (isStandalone) {
88
- onOpenChangeProp?.(value);
244
+ let canceled = false;
245
+ const details: PopoverOpenChangeDetails = {
246
+ reason,
247
+ event,
248
+ cancel: () => {
249
+ canceled = true;
250
+ },
251
+ get isCanceled() {
252
+ return canceled;
253
+ }
254
+ };
255
+
256
+ onOpenChangeProp?.(false, details);
257
+ if (details.isCanceled) return;
258
+ if (triggerRefProp) {
259
+ applyStandaloneTriggerCloseState(triggerRefProp, reason, event);
260
+ }
89
261
  } else {
90
- ctx!.onOpenChange(value);
262
+ ctx!.close(reason, event);
91
263
  }
92
264
  }
93
265
 
94
266
  function handleKeydown(event: KeyboardEvent) {
95
267
  if (event.key === 'Escape' && isOpen && shouldCloseOnEscape) {
96
268
  event.preventDefault();
97
- close();
269
+ close('escape-key', event);
98
270
  }
99
271
  }
100
272
 
@@ -107,7 +279,7 @@
107
279
  const focusInTrigger = triggerRef?.contains(target) || target === triggerRef;
108
280
 
109
281
  if (!focusInPopover && !focusInTrigger) {
110
- handleOpenChange(false);
282
+ close('focus-out', event);
111
283
  }
112
284
  }
113
285
 
@@ -121,10 +293,28 @@
121
293
 
122
294
  // Only close on external scroll
123
295
  if (!isInsidePopover && !isInsideTrigger) {
124
- close();
296
+ close('outside-press', event);
125
297
  }
126
298
  }
127
299
 
300
+ $effect(() => {
301
+ if (!isStandalone) {
302
+ if (trackedStandaloneTrigger) {
303
+ clearTriggerFocusState(trackedStandaloneTrigger);
304
+ }
305
+ trackedStandaloneTrigger = null;
306
+ clearStandaloneTriggerTracking();
307
+ return;
308
+ }
309
+
310
+ if (trackedStandaloneTrigger && trackedStandaloneTrigger !== triggerRefProp) {
311
+ clearTriggerFocusState(trackedStandaloneTrigger);
312
+ clearStandaloneTriggerTracking();
313
+ }
314
+
315
+ trackedStandaloneTrigger = triggerRefProp;
316
+ });
317
+
128
318
  onMount(() => {
129
319
  if (!browser) return;
130
320
  document.addEventListener('keydown', handleKeydown);
@@ -134,28 +324,91 @@
134
324
 
135
325
  onDestroy(() => {
136
326
  if (!browser) return;
327
+ if (trackedStandaloneTrigger) {
328
+ clearTriggerFocusState(trackedStandaloneTrigger);
329
+ }
330
+ clearMotionTracking();
331
+ clearStandaloneTriggerTracking();
137
332
  document.removeEventListener('keydown', handleKeydown);
138
333
  document.removeEventListener('focusin', handleDocumentFocusIn);
139
334
  document.removeEventListener('scroll', handleScroll, true);
140
335
  });
336
+
337
+ $effect(() => {
338
+ if (isOpen) {
339
+ const shouldAnimateIn = !isMounted || isExiting;
340
+ isMounted = true;
341
+ isExiting = false;
342
+ if (shouldAnimateIn) {
343
+ isEntering = true;
344
+ }
345
+ return;
346
+ }
347
+
348
+ if (!isMounted) {
349
+ isEntering = false;
350
+ isExiting = false;
351
+ return;
352
+ }
353
+
354
+ isEntering = false;
355
+ isExiting = true;
356
+ });
357
+
358
+ $effect(() => {
359
+ if (!isMounted || !popoverRef) {
360
+ clearMotionTracking();
361
+ return;
362
+ }
363
+
364
+ if (isEntering) {
365
+ trackMotion('enter', popoverRef);
366
+ return;
367
+ }
368
+
369
+ if (isExiting) {
370
+ trackMotion('exit', popoverRef);
371
+ return;
372
+ }
373
+
374
+ clearMotionTracking();
375
+ });
141
376
  </script>
142
377
 
143
- {#if isOpen}
378
+ {#if isMounted}
144
379
  <Portal>
145
380
  <div
146
381
  bind:this={popoverRef}
147
382
  class={className}
148
383
  role="dialog"
149
- aria-modal={isModal}
150
- use:floating={{ anchor: triggerRef, offset, placement, shouldFlip, boundaryElement }}
384
+ aria-modal={isOpen ? isModal : undefined}
385
+ aria-hidden={isOpen ? undefined : 'true'}
386
+ inert={!isOpen}
387
+ data-state={isOpen ? 'open' : 'closed'}
388
+ data-entering={isEntering || undefined}
389
+ data-exiting={isExiting || undefined}
390
+ data-placement={resolvedPlacement}
391
+ use:floating={{
392
+ anchor: triggerRef,
393
+ offset,
394
+ placement,
395
+ shouldFlip,
396
+ boundaryElement,
397
+ onPositionUpdate: (_, __, finalPlacement) => {
398
+ resolvedPlacement = resolvePlacementSide(finalPlacement);
399
+ }
400
+ }}
151
401
  use:clickOutside={{
152
- handler: close,
153
- enabled: shouldCloseOnInteractOutside,
402
+ handler: (event) => {
403
+ event.preventDefault();
404
+ close('outside-press', event);
405
+ },
406
+ enabled: isOpen && shouldCloseOnInteractOutside,
154
407
  ignore: [triggerRef]
155
408
  }}
156
- use:focusTrap={isModal}
157
- use:scrollLock={isModal}
158
- use:ariaHideOutside={isModal}
409
+ use:focusTrap={{ enabled: isOpen && isModal, restoreFocus: false, initialFocus }}
410
+ use:scrollLock={isOpen && isModal}
411
+ use:ariaHideOutside={isOpen && isModal}
159
412
  style="position: fixed; z-index: 9999;"
160
413
  {...restProps}
161
414
  >
@@ -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;
@@ -0,0 +1,25 @@
1
+ # Popover Root
2
+
3
+ ## API reference
4
+
5
+ ### Popover.Root
6
+
7
+ Name: `Popover.Root`
8
+ Description: Root state container that controls open state, trigger ref, and toggle/open/close actions.
9
+
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.
15
+
16
+ ### Context utilities
17
+
18
+ Name: `context.ts` helpers
19
+ Description: Context APIs used by trigger and content parts.
20
+
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
+ }