@gunkin/uiify 0.0.19-alpha → 0.0.22-alpha

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 (439) hide show
  1. package/agents/components.md +14 -1
  2. package/agents/index.md +32 -1
  3. package/agents/reference/components/alert.md +44 -0
  4. package/agents/reference/components/aspect-ratio.md +26 -0
  5. package/agents/reference/components/avatar.md +32 -0
  6. package/agents/reference/components/badge.md +31 -0
  7. package/agents/reference/components/breadcrumb.md +11 -1
  8. package/agents/reference/components/button.md +4 -4
  9. package/agents/reference/components/candle-chart.md +20 -1
  10. package/agents/reference/components/card.md +24 -0
  11. package/agents/reference/components/carousel.md +3 -2
  12. package/agents/reference/components/checkbox.md +2 -0
  13. package/agents/reference/components/combobox.md +2 -1
  14. package/agents/reference/components/date-picker.md +23 -0
  15. package/agents/reference/components/description-list.md +38 -0
  16. package/agents/reference/components/drawer.md +8 -1
  17. package/agents/reference/components/dropdown-menu.md +1 -1
  18. package/agents/reference/components/empty.md +45 -0
  19. package/agents/reference/components/fieldset.md +31 -0
  20. package/agents/reference/components/file-upload.md +12 -1
  21. package/agents/reference/components/form-error-summary.md +33 -0
  22. package/agents/reference/components/input-group.md +33 -0
  23. package/agents/reference/components/item.md +52 -0
  24. package/agents/reference/components/line-chart.md +1 -0
  25. package/agents/reference/components/modal.md +8 -1
  26. package/agents/reference/components/number-field.md +14 -3
  27. package/agents/reference/components/pagination.md +22 -1
  28. package/agents/reference/components/progress.md +16 -0
  29. package/agents/reference/components/slider.md +9 -1
  30. package/agents/reference/components/spinner.md +8 -1
  31. package/agents/reference/components/toast.md +14 -1
  32. package/dist/components/alert/Alert.d.ts +15 -0
  33. package/dist/components/alert/Alert.d.ts.map +1 -0
  34. package/dist/components/alert/Alert.js +61 -0
  35. package/dist/components/alert/Alert.js.map +1 -0
  36. package/dist/components/alert/index.d.ts +3 -0
  37. package/dist/components/alert/index.d.ts.map +1 -0
  38. package/dist/components/alert/index.js +7 -0
  39. package/dist/components/alert/index.js.map +1 -0
  40. package/dist/components/alert/types.d.ts +20 -0
  41. package/dist/components/alert/types.d.ts.map +1 -0
  42. package/dist/components/alert/types.js +1 -0
  43. package/dist/components/alert/types.js.map +1 -0
  44. package/dist/components/alert.d.ts +1 -0
  45. package/dist/components/alert.js +1 -0
  46. package/dist/components/aspect-ratio/AspectRatio.d.ts +7 -0
  47. package/dist/components/aspect-ratio/AspectRatio.d.ts.map +1 -0
  48. package/dist/components/aspect-ratio/AspectRatio.js +26 -0
  49. package/dist/components/aspect-ratio/AspectRatio.js.map +1 -0
  50. package/dist/components/aspect-ratio/index.d.ts +3 -0
  51. package/dist/components/aspect-ratio/index.d.ts.map +1 -0
  52. package/dist/components/aspect-ratio/index.js +5 -0
  53. package/dist/components/aspect-ratio/index.js.map +1 -0
  54. package/dist/components/aspect-ratio/types.d.ts +9 -0
  55. package/dist/components/aspect-ratio/types.d.ts.map +1 -0
  56. package/dist/components/aspect-ratio/types.js +1 -0
  57. package/dist/components/aspect-ratio/types.js.map +1 -0
  58. package/dist/components/aspect-ratio.d.ts +1 -0
  59. package/dist/components/aspect-ratio.js +1 -0
  60. package/dist/components/avatar/Avatar.d.ts +7 -0
  61. package/dist/components/avatar/Avatar.d.ts.map +1 -0
  62. package/dist/components/avatar/Avatar.js +24 -0
  63. package/dist/components/avatar/Avatar.js.map +1 -0
  64. package/dist/components/avatar/index.d.ts +3 -0
  65. package/dist/components/avatar/index.d.ts.map +1 -0
  66. package/dist/components/avatar/index.js +5 -0
  67. package/dist/components/avatar/index.js.map +1 -0
  68. package/dist/components/avatar/types.d.ts +12 -0
  69. package/dist/components/avatar/types.d.ts.map +1 -0
  70. package/dist/components/avatar/types.js +1 -0
  71. package/dist/components/avatar/types.js.map +1 -0
  72. package/dist/components/avatar.d.ts +1 -0
  73. package/dist/components/avatar.js +1 -0
  74. package/dist/components/badge/Badge.d.ts +7 -0
  75. package/dist/components/badge/Badge.d.ts.map +1 -0
  76. package/dist/components/badge/Badge.js +21 -0
  77. package/dist/components/badge/Badge.js.map +1 -0
  78. package/dist/components/badge/index.d.ts +3 -0
  79. package/dist/components/badge/index.d.ts.map +1 -0
  80. package/dist/components/badge/index.js +5 -0
  81. package/dist/components/badge/index.js.map +1 -0
  82. package/dist/components/badge/types.d.ts +11 -0
  83. package/dist/components/badge/types.d.ts.map +1 -0
  84. package/dist/components/badge/types.js +1 -0
  85. package/dist/components/badge/types.js.map +1 -0
  86. package/dist/components/badge.d.ts +1 -0
  87. package/dist/components/badge.js +1 -0
  88. package/dist/components/behavior.css +21 -9
  89. package/dist/components/behavior.css.map +1 -1
  90. package/dist/components/breadcrumb/Breadcrumb.d.ts.map +1 -1
  91. package/dist/components/breadcrumb/Breadcrumb.js +21 -4
  92. package/dist/components/breadcrumb/Breadcrumb.js.map +1 -1
  93. package/dist/components/breadcrumb/index.d.ts +1 -1
  94. package/dist/components/breadcrumb/index.d.ts.map +1 -1
  95. package/dist/components/breadcrumb/index.js.map +1 -1
  96. package/dist/components/breadcrumb/types.d.ts +7 -0
  97. package/dist/components/breadcrumb/types.d.ts.map +1 -1
  98. package/dist/components/button/types.d.ts +4 -0
  99. package/dist/components/button/types.d.ts.map +1 -1
  100. package/dist/components/candle-chart/CandleChart.d.ts +1 -1
  101. package/dist/components/candle-chart/CandleChart.d.ts.map +1 -1
  102. package/dist/components/candle-chart/CandleChart.js +81 -46
  103. package/dist/components/candle-chart/CandleChart.js.map +1 -1
  104. package/dist/components/candle-chart/client/CandleChartClient.d.ts.map +1 -1
  105. package/dist/components/candle-chart/client/CandleChartClient.js +5 -0
  106. package/dist/components/candle-chart/client/CandleChartClient.js.map +1 -1
  107. package/dist/components/candle-chart/index.d.ts +1 -1
  108. package/dist/components/candle-chart/index.d.ts.map +1 -1
  109. package/dist/components/candle-chart/index.js.map +1 -1
  110. package/dist/components/candle-chart/types.d.ts +17 -0
  111. package/dist/components/candle-chart/types.d.ts.map +1 -1
  112. package/dist/components/card/Card.d.ts +7 -0
  113. package/dist/components/card/Card.d.ts.map +1 -0
  114. package/dist/components/card/Card.js +16 -0
  115. package/dist/components/card/Card.js.map +1 -0
  116. package/dist/components/card/index.d.ts +3 -0
  117. package/dist/components/card/index.d.ts.map +1 -0
  118. package/dist/components/card/index.js +5 -0
  119. package/dist/components/card/index.js.map +1 -0
  120. package/dist/components/card/types.d.ts +7 -0
  121. package/dist/components/card/types.d.ts.map +1 -0
  122. package/dist/components/card/types.js +1 -0
  123. package/dist/components/card/types.js.map +1 -0
  124. package/dist/components/card.d.ts +1 -0
  125. package/dist/components/card.js +1 -0
  126. package/dist/components/carousel/CarouselMarkup.d.ts.map +1 -1
  127. package/dist/components/carousel/CarouselMarkup.js +20 -3
  128. package/dist/components/carousel/CarouselMarkup.js.map +1 -1
  129. package/dist/components/carousel/carousel-markup.js +2 -2
  130. package/dist/components/carousel/carousel-markup.js.map +1 -1
  131. package/dist/components/carousel/types.d.ts +3 -2
  132. package/dist/components/carousel/types.d.ts.map +1 -1
  133. package/dist/components/checkbox/types.d.ts +2 -0
  134. package/dist/components/checkbox/types.d.ts.map +1 -1
  135. package/dist/components/combobox/Combobox.d.ts.map +1 -1
  136. package/dist/components/combobox/Combobox.js +37 -23
  137. package/dist/components/combobox/Combobox.js.map +1 -1
  138. package/dist/components/combobox/combobox-store.d.ts.map +1 -1
  139. package/dist/components/combobox/combobox-store.js +5 -2
  140. package/dist/components/combobox/combobox-store.js.map +1 -1
  141. package/dist/components/combobox/types.d.ts +2 -3
  142. package/dist/components/combobox/types.d.ts.map +1 -1
  143. package/dist/components/context-menu/ContextMenu.d.ts.map +1 -1
  144. package/dist/components/context-menu/ContextMenu.js +25 -5
  145. package/dist/components/context-menu/ContextMenu.js.map +1 -1
  146. package/dist/components/date-picker/DatePicker.d.ts +7 -0
  147. package/dist/components/date-picker/DatePicker.d.ts.map +1 -0
  148. package/dist/components/date-picker/DatePicker.js +19 -0
  149. package/dist/components/date-picker/DatePicker.js.map +1 -0
  150. package/dist/components/date-picker/index.d.ts +3 -0
  151. package/dist/components/date-picker/index.d.ts.map +1 -0
  152. package/dist/components/date-picker/index.js +5 -0
  153. package/dist/components/date-picker/index.js.map +1 -0
  154. package/dist/components/date-picker/types.d.ts +5 -0
  155. package/dist/components/date-picker/types.d.ts.map +1 -0
  156. package/dist/components/date-picker/types.js +1 -0
  157. package/dist/components/date-picker/types.js.map +1 -0
  158. package/dist/components/date-picker.d.ts +1 -0
  159. package/dist/components/date-picker.js +1 -0
  160. package/dist/components/description-list/DescriptionList.d.ts +15 -0
  161. package/dist/components/description-list/DescriptionList.d.ts.map +1 -0
  162. package/dist/components/description-list/DescriptionList.js +48 -0
  163. package/dist/components/description-list/DescriptionList.js.map +1 -0
  164. package/dist/components/description-list/index.d.ts +3 -0
  165. package/dist/components/description-list/index.d.ts.map +1 -0
  166. package/dist/components/description-list/index.js +7 -0
  167. package/dist/components/description-list/index.js.map +1 -0
  168. package/dist/components/description-list/types.d.ts +15 -0
  169. package/dist/components/description-list/types.d.ts.map +1 -0
  170. package/dist/components/description-list/types.js +1 -0
  171. package/dist/components/description-list/types.js.map +1 -0
  172. package/dist/components/description-list.d.ts +1 -0
  173. package/dist/components/description-list.js +1 -0
  174. package/dist/components/drawer/DrawerNative.d.ts +1 -1
  175. package/dist/components/drawer/DrawerNative.d.ts.map +1 -1
  176. package/dist/components/drawer/DrawerNative.js +5 -2
  177. package/dist/components/drawer/DrawerNative.js.map +1 -1
  178. package/dist/components/drawer/index.d.ts +1 -1
  179. package/dist/components/drawer/index.d.ts.map +1 -1
  180. package/dist/components/drawer/index.js.map +1 -1
  181. package/dist/components/drawer/types.d.ts +4 -0
  182. package/dist/components/drawer/types.d.ts.map +1 -1
  183. package/dist/components/dropdown-menu/DropdownMenu.d.ts.map +1 -1
  184. package/dist/components/dropdown-menu/DropdownMenu.js +31 -15
  185. package/dist/components/dropdown-menu/DropdownMenu.js.map +1 -1
  186. package/dist/components/dropdown-menu/DropdownMenuBar.d.ts.map +1 -1
  187. package/dist/components/dropdown-menu/DropdownMenuBar.js +7 -5
  188. package/dist/components/dropdown-menu/DropdownMenuBar.js.map +1 -1
  189. package/dist/components/dropdown-menu/types.d.ts +1 -1
  190. package/dist/components/dropdown-menu/types.d.ts.map +1 -1
  191. package/dist/components/empty/Empty.d.ts +19 -0
  192. package/dist/components/empty/Empty.d.ts.map +1 -0
  193. package/dist/components/empty/Empty.js +56 -0
  194. package/dist/components/empty/Empty.js.map +1 -0
  195. package/dist/components/empty/index.d.ts +3 -0
  196. package/dist/components/empty/index.d.ts.map +1 -0
  197. package/dist/components/empty/index.js +8 -0
  198. package/dist/components/empty/index.js.map +1 -0
  199. package/dist/components/empty/types.d.ts +19 -0
  200. package/dist/components/empty/types.d.ts.map +1 -0
  201. package/dist/components/empty/types.js +1 -0
  202. package/dist/components/empty/types.js.map +1 -0
  203. package/dist/components/empty.d.ts +1 -0
  204. package/dist/components/empty.js +1 -0
  205. package/dist/components/fieldset/Fieldset.d.ts +11 -0
  206. package/dist/components/fieldset/Fieldset.d.ts.map +1 -0
  207. package/dist/components/fieldset/Fieldset.js +38 -0
  208. package/dist/components/fieldset/Fieldset.js.map +1 -0
  209. package/dist/components/fieldset/index.d.ts +3 -0
  210. package/dist/components/fieldset/index.d.ts.map +1 -0
  211. package/dist/components/fieldset/index.js +6 -0
  212. package/dist/components/fieldset/index.js.map +1 -0
  213. package/dist/components/fieldset/types.d.ts +11 -0
  214. package/dist/components/fieldset/types.d.ts.map +1 -0
  215. package/dist/components/fieldset/types.js +1 -0
  216. package/dist/components/fieldset/types.js.map +1 -0
  217. package/dist/components/fieldset.d.ts +1 -0
  218. package/dist/components/fieldset.js +1 -0
  219. package/dist/components/file-upload/FileUpload.d.ts.map +1 -1
  220. package/dist/components/file-upload/FileUpload.js +11 -4
  221. package/dist/components/file-upload/FileUpload.js.map +1 -1
  222. package/dist/components/file-upload/FileUploadRoot.d.ts +1 -1
  223. package/dist/components/file-upload/FileUploadRoot.d.ts.map +1 -1
  224. package/dist/components/file-upload/FileUploadRoot.js +9 -0
  225. package/dist/components/file-upload/FileUploadRoot.js.map +1 -1
  226. package/dist/components/file-upload/index.d.ts +1 -1
  227. package/dist/components/file-upload/index.d.ts.map +1 -1
  228. package/dist/components/file-upload/index.js.map +1 -1
  229. package/dist/components/file-upload/types.d.ts +8 -0
  230. package/dist/components/file-upload/types.d.ts.map +1 -1
  231. package/dist/components/form-error-summary/FormErrorSummary.d.ts +7 -0
  232. package/dist/components/form-error-summary/FormErrorSummary.d.ts.map +1 -0
  233. package/dist/components/form-error-summary/FormErrorSummary.js +25 -0
  234. package/dist/components/form-error-summary/FormErrorSummary.js.map +1 -0
  235. package/dist/components/form-error-summary/index.d.ts +3 -0
  236. package/dist/components/form-error-summary/index.d.ts.map +1 -0
  237. package/dist/components/form-error-summary/index.js +5 -0
  238. package/dist/components/form-error-summary/index.js.map +1 -0
  239. package/dist/components/form-error-summary/types.d.ts +12 -0
  240. package/dist/components/form-error-summary/types.d.ts.map +1 -0
  241. package/dist/components/form-error-summary/types.js +1 -0
  242. package/dist/components/form-error-summary/types.js.map +1 -0
  243. package/dist/components/form-error-summary.d.ts +1 -0
  244. package/dist/components/form-error-summary.js +1 -0
  245. package/dist/components/index.d.ts +13 -0
  246. package/dist/components/index.d.ts.map +1 -1
  247. package/dist/components/index.js +13 -0
  248. package/dist/components/index.js.map +1 -1
  249. package/dist/components/input-group/InputGroup.d.ts +5 -0
  250. package/dist/components/input-group/InputGroup.d.ts.map +1 -0
  251. package/dist/components/input-group/InputGroup.js +37 -0
  252. package/dist/components/input-group/InputGroup.js.map +1 -0
  253. package/dist/components/input-group/index.d.ts +3 -0
  254. package/dist/components/input-group/index.d.ts.map +1 -0
  255. package/dist/components/input-group/index.js +6 -0
  256. package/dist/components/input-group/index.js.map +1 -0
  257. package/dist/components/input-group/types.d.ts +12 -0
  258. package/dist/components/input-group/types.d.ts.map +1 -0
  259. package/dist/components/input-group/types.js +1 -0
  260. package/dist/components/input-group/types.js.map +1 -0
  261. package/dist/components/input-group.d.ts +1 -0
  262. package/dist/components/input-group.js +1 -0
  263. package/dist/components/internal/native-check-control/NativeCheckControl.d.ts.map +1 -1
  264. package/dist/components/internal/native-check-control/NativeCheckControl.js +4 -0
  265. package/dist/components/internal/native-check-control/NativeCheckControl.js.map +1 -1
  266. package/dist/components/internal/native-check-control/types.d.ts +2 -0
  267. package/dist/components/internal/native-check-control/types.d.ts.map +1 -1
  268. package/dist/components/item/Item.d.ts +23 -0
  269. package/dist/components/item/Item.d.ts.map +1 -0
  270. package/dist/components/item/Item.js +64 -0
  271. package/dist/components/item/Item.js.map +1 -0
  272. package/dist/components/item/index.d.ts +3 -0
  273. package/dist/components/item/index.d.ts.map +1 -0
  274. package/dist/components/item/index.js +9 -0
  275. package/dist/components/item/index.js.map +1 -0
  276. package/dist/components/item/types.d.ts +23 -0
  277. package/dist/components/item/types.d.ts.map +1 -0
  278. package/dist/components/item/types.js +1 -0
  279. package/dist/components/item/types.js.map +1 -0
  280. package/dist/components/item.d.ts +1 -0
  281. package/dist/components/item.js +1 -0
  282. package/dist/components/line-chart/LineChart.d.ts.map +1 -1
  283. package/dist/components/line-chart/LineChart.js +3 -2
  284. package/dist/components/line-chart/LineChart.js.map +1 -1
  285. package/dist/components/line-chart/line-chart-geometry.d.ts +2 -2
  286. package/dist/components/line-chart/line-chart-geometry.d.ts.map +1 -1
  287. package/dist/components/line-chart/line-chart-geometry.js +6 -6
  288. package/dist/components/line-chart/line-chart-geometry.js.map +1 -1
  289. package/dist/components/line-chart/types.d.ts +2 -0
  290. package/dist/components/line-chart/types.d.ts.map +1 -1
  291. package/dist/components/modal/Modal.d.ts +1 -1
  292. package/dist/components/modal/Modal.d.ts.map +1 -1
  293. package/dist/components/modal/Modal.js +5 -2
  294. package/dist/components/modal/Modal.js.map +1 -1
  295. package/dist/components/modal/index.d.ts +1 -1
  296. package/dist/components/modal/index.d.ts.map +1 -1
  297. package/dist/components/modal/index.js.map +1 -1
  298. package/dist/components/modal/types.d.ts +4 -0
  299. package/dist/components/modal/types.d.ts.map +1 -1
  300. package/dist/components/number-field/NumberField.d.ts +1 -1
  301. package/dist/components/number-field/NumberField.d.ts.map +1 -1
  302. package/dist/components/number-field/NumberField.js +25 -5
  303. package/dist/components/number-field/NumberField.js.map +1 -1
  304. package/dist/components/number-field/format.d.ts +1 -1
  305. package/dist/components/number-field/format.d.ts.map +1 -1
  306. package/dist/components/number-field/format.js +32 -7
  307. package/dist/components/number-field/format.js.map +1 -1
  308. package/dist/components/number-field/index.d.ts +1 -1
  309. package/dist/components/number-field/index.d.ts.map +1 -1
  310. package/dist/components/number-field/index.js.map +1 -1
  311. package/dist/components/number-field/types.d.ts +11 -2
  312. package/dist/components/number-field/types.d.ts.map +1 -1
  313. package/dist/components/otp-input/OtpInput.d.ts.map +1 -1
  314. package/dist/components/otp-input/OtpInput.js +2 -0
  315. package/dist/components/otp-input/OtpInput.js.map +1 -1
  316. package/dist/components/pagination/Pagination.d.ts.map +1 -1
  317. package/dist/components/pagination/Pagination.js +93 -29
  318. package/dist/components/pagination/Pagination.js.map +1 -1
  319. package/dist/components/pagination/PaginationShell.d.ts +2 -1
  320. package/dist/components/pagination/PaginationShell.d.ts.map +1 -1
  321. package/dist/components/pagination/PaginationShell.js +44 -9
  322. package/dist/components/pagination/PaginationShell.js.map +1 -1
  323. package/dist/components/pagination/index.d.ts +1 -1
  324. package/dist/components/pagination/index.d.ts.map +1 -1
  325. package/dist/components/pagination/index.js.map +1 -1
  326. package/dist/components/pagination/types.d.ts +18 -0
  327. package/dist/components/pagination/types.d.ts.map +1 -1
  328. package/dist/components/progress/Progress.d.ts +7 -0
  329. package/dist/components/progress/Progress.d.ts.map +1 -0
  330. package/dist/components/progress/Progress.js +9 -0
  331. package/dist/components/progress/Progress.js.map +1 -0
  332. package/dist/components/progress/index.d.ts +3 -0
  333. package/dist/components/progress/index.d.ts.map +1 -0
  334. package/dist/components/progress/index.js +5 -0
  335. package/dist/components/progress/index.js.map +1 -0
  336. package/dist/components/progress/types.d.ts +3 -0
  337. package/dist/components/progress/types.d.ts.map +1 -0
  338. package/dist/components/progress/types.js +1 -0
  339. package/dist/components/progress/types.js.map +1 -0
  340. package/dist/components/progress.d.ts +1 -0
  341. package/dist/components/progress.js +1 -0
  342. package/dist/components/slider/client/SliderClient.d.ts.map +1 -1
  343. package/dist/components/slider/client/SliderClient.js +11 -2
  344. package/dist/components/slider/client/SliderClient.js.map +1 -1
  345. package/dist/components/slider/index.d.ts +1 -1
  346. package/dist/components/slider/index.d.ts.map +1 -1
  347. package/dist/components/slider/index.js.map +1 -1
  348. package/dist/components/slider/types.d.ts +5 -0
  349. package/dist/components/slider/types.d.ts.map +1 -1
  350. package/dist/components/spinner/Spinner.d.ts.map +1 -1
  351. package/dist/components/spinner/Spinner.js +6 -3
  352. package/dist/components/spinner/Spinner.js.map +1 -1
  353. package/dist/components/spinner/index.d.ts +1 -1
  354. package/dist/components/spinner/index.d.ts.map +1 -1
  355. package/dist/components/spinner/index.js.map +1 -1
  356. package/dist/components/spinner/types.d.ts +4 -0
  357. package/dist/components/spinner/types.d.ts.map +1 -1
  358. package/dist/components/tags-input/TagsInput.d.ts.map +1 -1
  359. package/dist/components/tags-input/TagsInput.js +2 -0
  360. package/dist/components/tags-input/TagsInput.js.map +1 -1
  361. package/dist/components/toast/Toast.d.ts +1 -1
  362. package/dist/components/toast/Toast.d.ts.map +1 -1
  363. package/dist/components/toast/Toast.js +33 -29
  364. package/dist/components/toast/Toast.js.map +1 -1
  365. package/dist/components/toast/ToastElements.d.ts.map +1 -1
  366. package/dist/components/toast/ToastElements.js +24 -12
  367. package/dist/components/toast/ToastElements.js.map +1 -1
  368. package/dist/components/toast/index.d.ts +1 -1
  369. package/dist/components/toast/index.d.ts.map +1 -1
  370. package/dist/components/toast/index.js.map +1 -1
  371. package/dist/components/toast/types.d.ts +10 -0
  372. package/dist/components/toast/types.d.ts.map +1 -1
  373. package/dist/components/toolbar/Toolbar.d.ts +2 -2
  374. package/dist/components/toolbar/Toolbar.d.ts.map +1 -1
  375. package/dist/components/toolbar/Toolbar.js +8 -4
  376. package/dist/components/toolbar/Toolbar.js.map +1 -1
  377. package/dist/core/direction.d.ts +2 -0
  378. package/dist/core/direction.d.ts.map +1 -1
  379. package/dist/core/direction.js +8 -3
  380. package/dist/core/direction.js.map +1 -1
  381. package/dist/core/dismissable-layer-registry.d.ts.map +1 -1
  382. package/dist/core/dismissable-layer-registry.js +3 -1
  383. package/dist/core/dismissable-layer-registry.js.map +1 -1
  384. package/dist/core/format-label.d.ts +2 -0
  385. package/dist/core/format-label.d.ts.map +1 -0
  386. package/dist/core/format-label.js +13 -0
  387. package/dist/core/format-label.js.map +1 -0
  388. package/dist/core/ime.d.ts +16 -0
  389. package/dist/core/ime.d.ts.map +1 -0
  390. package/dist/core/ime.js +7 -0
  391. package/dist/core/ime.js.map +1 -0
  392. package/dist/core/index.d.ts +3 -0
  393. package/dist/core/index.d.ts.map +1 -1
  394. package/dist/core/index.js +3 -0
  395. package/dist/core/index.js.map +1 -1
  396. package/dist/core/roving-focus-store.d.ts +3 -2
  397. package/dist/core/roving-focus-store.d.ts.map +1 -1
  398. package/dist/core/roving-focus-store.js +5 -3
  399. package/dist/core/roving-focus-store.js.map +1 -1
  400. package/dist/core/roving-focus.d.ts.map +1 -1
  401. package/dist/core/roving-focus.js +10 -5
  402. package/dist/core/roving-focus.js.map +1 -1
  403. package/dist/core/text-direction.d.ts +7 -0
  404. package/dist/core/text-direction.d.ts.map +1 -0
  405. package/dist/core/text-direction.js +7 -0
  406. package/dist/core/text-direction.js.map +1 -0
  407. package/dist/styles/index.css +1 -1
  408. package/package.json +2 -1
  409. package/skills/uiify/SKILL.md +43 -34
  410. package/skills/uiify/references/elements/alert-modal.md +5 -5
  411. package/skills/uiify/references/elements/aspect-ratio.md +59 -0
  412. package/skills/uiify/references/elements/avatar.md +10 -19
  413. package/skills/uiify/references/elements/badge.md +11 -19
  414. package/skills/uiify/references/elements/button.md +5 -5
  415. package/skills/uiify/references/elements/candle-chart.md +2 -0
  416. package/skills/uiify/references/elements/card.md +10 -21
  417. package/skills/uiify/references/elements/carousel.md +2 -0
  418. package/skills/uiify/references/elements/checkbox.md +1 -1
  419. package/skills/uiify/references/elements/date-picker.md +11 -15
  420. package/skills/uiify/references/elements/description-list.md +38 -0
  421. package/skills/uiify/references/elements/empty-state.md +12 -23
  422. package/skills/uiify/references/elements/field.md +2 -2
  423. package/skills/uiify/references/elements/fieldset.md +39 -0
  424. package/skills/uiify/references/elements/form-error-summary.md +39 -0
  425. package/skills/uiify/references/elements/inline-alert.md +11 -19
  426. package/skills/uiify/references/elements/input-group.md +39 -0
  427. package/skills/uiify/references/elements/item.md +39 -0
  428. package/skills/uiify/references/elements/modal.md +1 -1
  429. package/skills/uiify/references/elements/number-field.md +2 -0
  430. package/skills/uiify/references/elements/pagination.md +2 -0
  431. package/skills/uiify/references/elements/progress-bar.md +11 -20
  432. package/skills/uiify/references/elements/select.md +1 -1
  433. package/skills/uiify/references/examples/alert-confirmation.md +21 -9
  434. package/skills/uiify/references/examples/field-validation.md +2 -2
  435. package/skills/uiify/references/examples/select-basic.md +1 -1
  436. package/skills/uiify/references/examples/table-controls.md +3 -2
  437. package/skills/uiify/references/guides/i18n.md +21 -0
  438. package/skills/uiify/references/guides/verification.md +9 -0
  439. package/skills/uiify/scripts/static.mjs +79 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/dismissable-layer-registry.ts"],"sourcesContent":["import type { OpenChangeReason } from \"./open-change-details.js\";\nimport { getEventPath, isEventInsideLayer } from \"./platform.js\";\n\nexport interface DismissableLayerRecord {\n readonly branches: Set<Element>;\n readonly element: Element;\n readonly onDismiss: (reason: OpenChangeReason, event: Event) => void;\n}\n\ninterface Registry {\n readonly controller: AbortController;\n readonly layers: DismissableLayerRecord[];\n}\n\nconst registries = new WeakMap<Document, Registry>();\n\nfunction dispatch(document: Document, reason: OpenChangeReason, event: Event): void {\n const record = registries.get(document)?.layers.at(-1);\n if (!record) return;\n if (\n reason !== \"escape-key\" &&\n isEventInsideLayer(getEventPath(event), record.element, record.branches)\n ) {\n return;\n }\n record.onDismiss(reason, event);\n}\n\nfunction createRegistry(document: Document): Registry {\n const AbortControllerConstructor = document.defaultView?.AbortController ?? AbortController;\n const controller = new AbortControllerConstructor();\n const options = { capture: true, signal: controller.signal };\n document.addEventListener(\n \"keydown\",\n (event) => {\n if (event.key === \"Escape\") dispatch(document, \"escape-key\", event);\n },\n options,\n );\n document.addEventListener(\n \"pointerdown\",\n (event) => dispatch(document, \"outside-press\", event),\n options,\n );\n document.addEventListener(\n \"focusin\",\n (event) => dispatch(document, \"focus-outside\", event),\n options,\n );\n return { controller, layers: [] };\n}\n\nexport function registerDismissableLayer(\n document: Document,\n record: DismissableLayerRecord,\n): () => void {\n const registry = registries.get(document) ?? createRegistry(document);\n registries.set(document, registry);\n registry.layers.push(record);\n\n return () => {\n const index = registry.layers.indexOf(record);\n if (index >= 0) registry.layers.splice(index, 1);\n if (registry.layers.length === 0) {\n registry.controller.abort();\n registries.delete(document);\n }\n };\n}\n"],"mappings":"AACA,SAAS,cAAc,0BAA0B;AAajD,MAAM,aAAa,oBAAI,QAA4B;AAEnD,SAAS,SAAS,UAAoB,QAA0B,OAAoB;AAClF,QAAM,SAAS,WAAW,IAAI,QAAQ,GAAG,OAAO,GAAG,EAAE;AACrD,MAAI,CAAC,OAAQ;AACb,MACE,WAAW,gBACX,mBAAmB,aAAa,KAAK,GAAG,OAAO,SAAS,OAAO,QAAQ,GACvE;AACA;AAAA,EACF;AACA,SAAO,UAAU,QAAQ,KAAK;AAChC;AAEA,SAAS,eAAe,UAA8B;AACpD,QAAM,6BAA6B,SAAS,aAAa,mBAAmB;AAC5E,QAAM,aAAa,IAAI,2BAA2B;AAClD,QAAM,UAAU,EAAE,SAAS,MAAM,QAAQ,WAAW,OAAO;AAC3D,WAAS;AAAA,IACP;AAAA,IACA,CAAC,UAAU;AACT,UAAI,MAAM,QAAQ,SAAU,UAAS,UAAU,cAAc,KAAK;AAAA,IACpE;AAAA,IACA;AAAA,EACF;AACA,WAAS;AAAA,IACP;AAAA,IACA,CAAC,UAAU,SAAS,UAAU,iBAAiB,KAAK;AAAA,IACpD;AAAA,EACF;AACA,WAAS;AAAA,IACP;AAAA,IACA,CAAC,UAAU,SAAS,UAAU,iBAAiB,KAAK;AAAA,IACpD;AAAA,EACF;AACA,SAAO,EAAE,YAAY,QAAQ,CAAC,EAAE;AAClC;AAEO,SAAS,yBACd,UACA,QACY;AACZ,QAAM,WAAW,WAAW,IAAI,QAAQ,KAAK,eAAe,QAAQ;AACpE,aAAW,IAAI,UAAU,QAAQ;AACjC,WAAS,OAAO,KAAK,MAAM;AAE3B,SAAO,MAAM;AACX,UAAM,QAAQ,SAAS,OAAO,QAAQ,MAAM;AAC5C,QAAI,SAAS,EAAG,UAAS,OAAO,OAAO,OAAO,CAAC;AAC/C,QAAI,SAAS,OAAO,WAAW,GAAG;AAChC,eAAS,WAAW,MAAM;AAC1B,iBAAW,OAAO,QAAQ;AAAA,IAC5B;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/core/dismissable-layer-registry.ts"],"sourcesContent":["import { isComposingKeyEvent } from \"./ime.js\";\nimport type { OpenChangeReason } from \"./open-change-details.js\";\nimport { getEventPath, isEventInsideLayer } from \"./platform.js\";\n\nexport interface DismissableLayerRecord {\n readonly branches: Set<Element>;\n readonly element: Element;\n readonly onDismiss: (reason: OpenChangeReason, event: Event) => void;\n}\n\ninterface Registry {\n readonly controller: AbortController;\n readonly layers: DismissableLayerRecord[];\n}\n\nconst registries = new WeakMap<Document, Registry>();\n\nfunction dispatch(document: Document, reason: OpenChangeReason, event: Event): void {\n const record = registries.get(document)?.layers.at(-1);\n if (!record) return;\n if (\n reason !== \"escape-key\" &&\n isEventInsideLayer(getEventPath(event), record.element, record.branches)\n ) {\n return;\n }\n record.onDismiss(reason, event);\n}\n\nfunction createRegistry(document: Document): Registry {\n const AbortControllerConstructor = document.defaultView?.AbortController ?? AbortController;\n const controller = new AbortControllerConstructor();\n const options = { capture: true, signal: controller.signal };\n document.addEventListener(\n \"keydown\",\n (event) => {\n if (event.key === \"Escape\" && !isComposingKeyEvent(event))\n dispatch(document, \"escape-key\", event);\n },\n options,\n );\n document.addEventListener(\n \"pointerdown\",\n (event) => dispatch(document, \"outside-press\", event),\n options,\n );\n document.addEventListener(\n \"focusin\",\n (event) => dispatch(document, \"focus-outside\", event),\n options,\n );\n return { controller, layers: [] };\n}\n\nexport function registerDismissableLayer(\n document: Document,\n record: DismissableLayerRecord,\n): () => void {\n const registry = registries.get(document) ?? createRegistry(document);\n registries.set(document, registry);\n registry.layers.push(record);\n\n return () => {\n const index = registry.layers.indexOf(record);\n if (index >= 0) registry.layers.splice(index, 1);\n if (registry.layers.length === 0) {\n registry.controller.abort();\n registries.delete(document);\n }\n };\n}\n"],"mappings":"AAAA,SAAS,2BAA2B;AAEpC,SAAS,cAAc,0BAA0B;AAajD,MAAM,aAAa,oBAAI,QAA4B;AAEnD,SAAS,SAAS,UAAoB,QAA0B,OAAoB;AAClF,QAAM,SAAS,WAAW,IAAI,QAAQ,GAAG,OAAO,GAAG,EAAE;AACrD,MAAI,CAAC,OAAQ;AACb,MACE,WAAW,gBACX,mBAAmB,aAAa,KAAK,GAAG,OAAO,SAAS,OAAO,QAAQ,GACvE;AACA;AAAA,EACF;AACA,SAAO,UAAU,QAAQ,KAAK;AAChC;AAEA,SAAS,eAAe,UAA8B;AACpD,QAAM,6BAA6B,SAAS,aAAa,mBAAmB;AAC5E,QAAM,aAAa,IAAI,2BAA2B;AAClD,QAAM,UAAU,EAAE,SAAS,MAAM,QAAQ,WAAW,OAAO;AAC3D,WAAS;AAAA,IACP;AAAA,IACA,CAAC,UAAU;AACT,UAAI,MAAM,QAAQ,YAAY,CAAC,oBAAoB,KAAK;AACtD,iBAAS,UAAU,cAAc,KAAK;AAAA,IAC1C;AAAA,IACA;AAAA,EACF;AACA,WAAS;AAAA,IACP;AAAA,IACA,CAAC,UAAU,SAAS,UAAU,iBAAiB,KAAK;AAAA,IACpD;AAAA,EACF;AACA,WAAS;AAAA,IACP;AAAA,IACA,CAAC,UAAU,SAAS,UAAU,iBAAiB,KAAK;AAAA,IACpD;AAAA,EACF;AACA,SAAO,EAAE,YAAY,QAAQ,CAAC,EAAE;AAClC;AAEO,SAAS,yBACd,UACA,QACY;AACZ,QAAM,WAAW,WAAW,IAAI,QAAQ,KAAK,eAAe,QAAQ;AACpE,aAAW,IAAI,UAAU,QAAQ;AACjC,WAAS,OAAO,KAAK,MAAM;AAE3B,SAAO,MAAM;AACX,UAAM,QAAQ,SAAS,OAAO,QAAQ,MAAM;AAC5C,QAAI,SAAS,EAAG,UAAS,OAAO,OAAO,OAAO,CAAC;AAC/C,QAAI,SAAS,OAAO,WAAW,GAAG;AAChC,eAAS,WAAW,MAAM;AAC1B,iBAAW,OAAO,QAAQ;AAAA,IAC5B;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,2 @@
1
+ export declare function formatLabel(template: string, values: Readonly<Record<string, string | number>>, locale?: string): string;
2
+ //# sourceMappingURL=format-label.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-label.d.ts","sourceRoot":"","sources":["../../src/core/format-label.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,EACjD,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAWR"}
@@ -0,0 +1,13 @@
1
+ function formatLabel(template, values, locale) {
2
+ const numberFormat = new Intl.NumberFormat(locale ?? "en-US");
3
+ return template.replace(/\{(\w+)\}/g, (placeholder, key) => {
4
+ if (!Object.hasOwn(values, key)) return placeholder;
5
+ const value = values[key];
6
+ if (value === void 0) return placeholder;
7
+ return typeof value === "number" ? numberFormat.format(value) : value;
8
+ });
9
+ }
10
+ export {
11
+ formatLabel
12
+ };
13
+ //# sourceMappingURL=format-label.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/format-label.ts"],"sourcesContent":["export function formatLabel(\n template: string,\n values: Readonly<Record<string, string | number>>,\n locale?: string,\n): string {\n const numberFormat = new Intl.NumberFormat(locale ?? \"en-US\");\n\n return template.replace(/\\{(\\w+)\\}/g, (placeholder, key: string) => {\n if (!Object.hasOwn(values, key)) return placeholder;\n\n const value = values[key];\n if (value === undefined) return placeholder;\n\n return typeof value === \"number\" ? numberFormat.format(value) : value;\n });\n}\n"],"mappings":"AAAO,SAAS,YACd,UACA,QACA,QACQ;AACR,QAAM,eAAe,IAAI,KAAK,aAAa,UAAU,OAAO;AAE5D,SAAO,SAAS,QAAQ,cAAc,CAAC,aAAa,QAAgB;AAClE,QAAI,CAAC,OAAO,OAAO,QAAQ,GAAG,EAAG,QAAO;AAExC,UAAM,QAAQ,OAAO,GAAG;AACxB,QAAI,UAAU,OAAW,QAAO;AAEhC,WAAO,OAAO,UAAU,WAAW,aAAa,OAAO,KAAK,IAAI;AAAA,EAClE,CAAC;AACH;","names":[]}
@@ -0,0 +1,16 @@
1
+ interface ComposingKeyEventLike {
2
+ readonly isComposing?: boolean;
3
+ readonly keyCode?: number;
4
+ readonly nativeEvent?: {
5
+ readonly isComposing?: boolean;
6
+ readonly keyCode?: number;
7
+ };
8
+ }
9
+ /**
10
+ * True while an IME composition owns the key. Safari fires the final keydown after
11
+ * `compositionend` with `isComposing === false` and `keyCode === 229`, so both signals
12
+ * are checked. React synthetic events expose `isComposing` only on `nativeEvent`.
13
+ */
14
+ declare function isComposingKeyEvent(event: ComposingKeyEventLike): boolean;
15
+ export { isComposingKeyEvent };
16
+ //# sourceMappingURL=ime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ime.d.ts","sourceRoot":"","sources":["../../src/core/ime.ts"],"names":[],"mappings":"AAAA,UAAU,qBAAqB;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE;QAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACtF;AAED;;;;GAIG;AACH,iBAAS,mBAAmB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAOlE;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,7 @@
1
+ function isComposingKeyEvent(event) {
2
+ return event.isComposing === true || event.nativeEvent?.isComposing === true || event.keyCode === 229 || event.nativeEvent?.keyCode === 229;
3
+ }
4
+ export {
5
+ isComposingKeyEvent
6
+ };
7
+ //# sourceMappingURL=ime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/ime.ts"],"sourcesContent":["interface ComposingKeyEventLike {\n readonly isComposing?: boolean;\n readonly keyCode?: number;\n readonly nativeEvent?: { readonly isComposing?: boolean; readonly keyCode?: number };\n}\n\n/**\n * True while an IME composition owns the key. Safari fires the final keydown after\n * `compositionend` with `isComposing === false` and `keyCode === 229`, so both signals\n * are checked. React synthetic events expose `isComposing` only on `nativeEvent`.\n */\nfunction isComposingKeyEvent(event: ComposingKeyEventLike): boolean {\n return (\n event.isComposing === true ||\n event.nativeEvent?.isComposing === true ||\n event.keyCode === 229 ||\n event.nativeEvent?.keyCode === 229\n );\n}\n\nexport { isComposingKeyEvent };\n"],"mappings":"AAWA,SAAS,oBAAoB,OAAuC;AAClE,SACE,MAAM,gBAAgB,QACtB,MAAM,aAAa,gBAAgB,QACnC,MAAM,YAAY,OAClB,MAAM,aAAa,YAAY;AAEnC;","names":[]}
@@ -6,8 +6,10 @@ export * from "./dialog.js";
6
6
  export * from "./direction.js";
7
7
  export * from "./dismissable-layer.js";
8
8
  export * from "./focus-scope.js";
9
+ export * from "./format-label.js";
9
10
  export * from "./hover-intent-store.js";
10
11
  export * from "./hover-overlay.js";
12
+ export * from "./ime.js";
11
13
  export * from "./open-change-details.js";
12
14
  export * from "./platform.js";
13
15
  export * from "./popover.js";
@@ -16,6 +18,7 @@ export * from "./presence.js";
16
18
  export * from "./render.js";
17
19
  export * from "./roving-focus.js";
18
20
  export * from "./split-ref.js";
21
+ export * from "./text-direction.js";
19
22
  export * from "./tabbable.js";
20
23
  export * from "./visually-hidden.js";
21
24
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,UAAU,CAAC;AACzB,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC"}
@@ -6,8 +6,10 @@ export * from "./dialog.js";
6
6
  export * from "./direction.js";
7
7
  export * from "./dismissable-layer.js";
8
8
  export * from "./focus-scope.js";
9
+ export * from "./format-label.js";
9
10
  export * from "./hover-intent-store.js";
10
11
  export * from "./hover-overlay.js";
12
+ export * from "./ime.js";
11
13
  export * from "./open-change-details.js";
12
14
  export * from "./platform.js";
13
15
  export * from "./popover.js";
@@ -16,6 +18,7 @@ export * from "./presence.js";
16
18
  export * from "./render.js";
17
19
  export * from "./roving-focus.js";
18
20
  export * from "./split-ref.js";
21
+ export * from "./text-direction.js";
19
22
  export * from "./tabbable.js";
20
23
  export * from "./visually-hidden.js";
21
24
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/index.ts"],"sourcesContent":["export * from \"./anchor-position.js\";\nexport * from \"./collection.js\";\nexport * from \"./compose-event-handlers.js\";\nexport * from \"./create-part-context.js\";\nexport * from \"./dialog.js\";\nexport * from \"./direction.js\";\nexport * from \"./dismissable-layer.js\";\nexport * from \"./focus-scope.js\";\nexport * from \"./hover-intent-store.js\";\nexport * from \"./hover-overlay.js\";\nexport * from \"./open-change-details.js\";\nexport * from \"./platform.js\";\nexport * from \"./popover.js\";\nexport * from \"./portal.js\";\nexport * from \"./presence.js\";\nexport * from \"./render.js\";\nexport * from \"./roving-focus.js\";\nexport * from \"./split-ref.js\";\nexport * from \"./tabbable.js\";\nexport * from \"./visually-hidden.js\";\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
1
+ {"version":3,"sources":["../../src/core/index.ts"],"sourcesContent":["export * from \"./anchor-position.js\";\nexport * from \"./collection.js\";\nexport * from \"./compose-event-handlers.js\";\nexport * from \"./create-part-context.js\";\nexport * from \"./dialog.js\";\nexport * from \"./direction.js\";\nexport * from \"./dismissable-layer.js\";\nexport * from \"./focus-scope.js\";\nexport * from \"./format-label.js\";\nexport * from \"./hover-intent-store.js\";\nexport * from \"./hover-overlay.js\";\nexport * from \"./ime.js\";\nexport * from \"./open-change-details.js\";\nexport * from \"./platform.js\";\nexport * from \"./popover.js\";\nexport * from \"./portal.js\";\nexport * from \"./presence.js\";\nexport * from \"./render.js\";\nexport * from \"./roving-focus.js\";\nexport * from \"./split-ref.js\";\nexport * from \"./text-direction.js\";\nexport * from \"./tabbable.js\";\nexport * from \"./visually-hidden.js\";\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
@@ -7,15 +7,16 @@ export interface RovingFocusItemRecord {
7
7
  readonly textValue: string;
8
8
  }
9
9
  export interface RovingFocusConfig {
10
- readonly direction: Direction;
10
+ readonly direction?: Direction | undefined;
11
11
  readonly loop: boolean;
12
12
  readonly orientation: RovingFocusOrientation;
13
13
  }
14
14
  export interface RovingFocusStore {
15
15
  focus(id: string): void;
16
16
  getCurrentId(): string | null;
17
+ getDirection(): Direction | undefined;
17
18
  getItems(): readonly RovingFocusItemRecord[];
18
- move(fromId: string, key: string): boolean;
19
+ move(fromId: string, key: string, direction?: Direction): boolean;
19
20
  register(item: RovingFocusItemRecord): () => void;
20
21
  search(character: string): void;
21
22
  setCurrentId(id: string): void;
@@ -1 +1 @@
1
- {"version":3,"file":"roving-focus-store.d.ts","sourceRoot":"","sources":["../../src/core/roving-focus-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,MAAM,MAAM,sBAAsB,GAAG,YAAY,GAAG,UAAU,GAAG,MAAM,CAAC;AAExE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,sBAAsB,CAAC;CAC9C;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,IAAI,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,IAAI,SAAS,qBAAqB,EAAE,CAAC;IAC7C,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3C,QAAQ,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,IAAI,CAAC;IAClD,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1D,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAC5C,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAC5D,YAAY,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC9C,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,qBAAqB,CAAC,GAAG,IAAI,CAAC;CACpE;AAMD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,iBAAiB,GAAG,gBAAgB,CAsHnF"}
1
+ {"version":3,"file":"roving-focus-store.d.ts","sourceRoot":"","sources":["../../src/core/roving-focus-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,MAAM,MAAM,sBAAsB,GAAG,YAAY,GAAG,UAAU,GAAG,MAAM,CAAC;AAExE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,sBAAsB,CAAC;CAC9C;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,IAAI,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,IAAI,SAAS,GAAG,SAAS,CAAC;IACtC,QAAQ,IAAI,SAAS,qBAAqB,EAAE,CAAC;IAC7C,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IAClE,QAAQ,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,IAAI,CAAC;IAClD,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1D,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAC5C,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAC5D,YAAY,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC9C,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,qBAAqB,CAAC,GAAG,IAAI,CAAC;CACpE;AAMD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,iBAAiB,GAAG,gBAAgB,CAwHnF"}
@@ -34,8 +34,10 @@ function createRovingFocusStore(initial) {
34
34
  item.element?.focus({ preventScroll: true });
35
35
  },
36
36
  getCurrentId: () => currentId,
37
+ getDirection: () => config.direction,
37
38
  getItems: () => orderedItems(items),
38
- move(fromId, key) {
39
+ move(fromId, key, direction) {
40
+ const effectiveDirection = direction ?? config.direction ?? "ltr";
39
41
  const enabled = getEnabled();
40
42
  if (enabled.length === 0) return false;
41
43
  const currentIndex = Math.max(
@@ -48,10 +50,10 @@ function createRovingFocusStore(initial) {
48
50
  if (vertical && key === "ArrowDown") offset = 1;
49
51
  if (vertical && key === "ArrowUp") offset = -1;
50
52
  if (horizontal && key === "ArrowRight") {
51
- offset = config.direction === "rtl" ? -1 : 1;
53
+ offset = effectiveDirection === "rtl" ? -1 : 1;
52
54
  }
53
55
  if (horizontal && key === "ArrowLeft") {
54
- offset = config.direction === "rtl" ? 1 : -1;
56
+ offset = effectiveDirection === "rtl" ? 1 : -1;
55
57
  }
56
58
  if (offset === 0 && key !== "Home" && key !== "End") return false;
57
59
  let nextIndex = key === "Home" ? 0 : key === "End" ? enabled.length - 1 : currentIndex + offset;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/roving-focus-store.ts"],"sourcesContent":["import type { Direction } from \"./direction.js\";\nimport { sortByDocumentOrder } from \"./dom-order.js\";\n\nexport type RovingFocusOrientation = \"horizontal\" | \"vertical\" | \"both\";\n\nexport interface RovingFocusItemRecord {\n readonly disabled: boolean;\n readonly element: HTMLElement | null;\n readonly id: string;\n readonly textValue: string;\n}\n\nexport interface RovingFocusConfig {\n readonly direction: Direction;\n readonly loop: boolean;\n readonly orientation: RovingFocusOrientation;\n}\n\nexport interface RovingFocusStore {\n focus(id: string): void;\n getCurrentId(): string | null;\n getItems(): readonly RovingFocusItemRecord[];\n move(fromId: string, key: string): boolean;\n register(item: RovingFocusItemRecord): () => void;\n search(character: string): void;\n setCurrentId(id: string): void;\n setElement(id: string, element: HTMLElement | null): void;\n subscribe(listener: () => void): () => void;\n subscribeItem(id: string, listener: () => void): () => void;\n updateConfig(config: RovingFocusConfig): void;\n updateItem(id: string, item: Partial<RovingFocusItemRecord>): void;\n}\n\nfunction orderedItems(items: Map<string, RovingFocusItemRecord>) {\n return sortByDocumentOrder(items.values(), (item) => item.element);\n}\n\nexport function createRovingFocusStore(initial: RovingFocusConfig): RovingFocusStore {\n const items = new Map<string, RovingFocusItemRecord>();\n const listeners = new Set<() => void>();\n const itemListeners = new Map<string, Set<() => void>>();\n let config = initial;\n let currentId: string | null = null;\n let search = \"\";\n let searchTimer: ReturnType<typeof setTimeout> | undefined;\n const emit = () => {\n for (const listener of listeners) listener();\n };\n const emitItem = (id: string | null) => {\n if (!id) return;\n for (const listener of itemListeners.get(id) ?? []) listener();\n };\n const commitCurrentId = (id: string | null) => {\n if (currentId === id) return;\n const previous = currentId;\n currentId = id;\n emit();\n emitItem(previous);\n emitItem(id);\n };\n const getEnabled = () => orderedItems(items).filter((item) => !item.disabled);\n\n const store: RovingFocusStore = {\n focus(id) {\n const item = items.get(id);\n if (!item || item.disabled) return;\n store.setCurrentId(id);\n item.element?.focus({ preventScroll: true });\n },\n getCurrentId: () => currentId,\n getItems: () => orderedItems(items),\n move(fromId, key) {\n const enabled = getEnabled();\n if (enabled.length === 0) return false;\n const currentIndex = Math.max(\n 0,\n enabled.findIndex((item) => item.id === fromId),\n );\n const horizontal = config.orientation !== \"vertical\";\n const vertical = config.orientation !== \"horizontal\";\n let offset = 0;\n if (vertical && key === \"ArrowDown\") offset = 1;\n if (vertical && key === \"ArrowUp\") offset = -1;\n if (horizontal && key === \"ArrowRight\") {\n offset = config.direction === \"rtl\" ? -1 : 1;\n }\n if (horizontal && key === \"ArrowLeft\") {\n offset = config.direction === \"rtl\" ? 1 : -1;\n }\n if (offset === 0 && key !== \"Home\" && key !== \"End\") return false;\n let nextIndex =\n key === \"Home\" ? 0 : key === \"End\" ? enabled.length - 1 : currentIndex + offset;\n if (config.loop) nextIndex = (nextIndex + enabled.length) % enabled.length;\n const next = enabled[nextIndex];\n if (!next) return false;\n store.focus(next.id);\n return true;\n },\n register(item) {\n items.set(item.id, item);\n if (currentId === null && !item.disabled) commitCurrentId(item.id);\n return () => {\n const wasCurrent = currentId === item.id;\n if (!items.delete(item.id)) return;\n if (wasCurrent) commitCurrentId(getEnabled()[0]?.id ?? null);\n else emit();\n };\n },\n search(character) {\n clearTimeout(searchTimer);\n const repeated = search.length > 0 && [...search].every((value) => value === character);\n search = repeated ? character : search + character;\n const query = search.toLocaleLowerCase();\n const enabled = getEnabled();\n const start = Math.max(0, enabled.findIndex((item) => item.id === currentId) + 1);\n const rotated = [...enabled.slice(start), ...enabled.slice(0, start)];\n const match = rotated.find((item) => item.textValue.toLocaleLowerCase().startsWith(query));\n if (match) store.focus(match.id);\n searchTimer = setTimeout(() => {\n search = \"\";\n }, 500);\n },\n setCurrentId(id) {\n commitCurrentId(id);\n },\n setElement(id, element) {\n store.updateItem(id, { element });\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n subscribeItem(id, listener) {\n const set = itemListeners.get(id) ?? new Set<() => void>();\n set.add(listener);\n itemListeners.set(id, set);\n return () => {\n set.delete(listener);\n if (set.size === 0) itemListeners.delete(id);\n };\n },\n updateConfig(next) {\n config = next;\n },\n updateItem(id, update) {\n const item = items.get(id);\n if (!item) return;\n const next = { ...item, ...update };\n items.set(id, next);\n if (id === currentId && next.disabled) {\n commitCurrentId(getEnabled()[0]?.id ?? null);\n }\n },\n };\n return store;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/core/roving-focus-store.ts"],"sourcesContent":["import type { Direction } from \"./direction.js\";\nimport { sortByDocumentOrder } from \"./dom-order.js\";\n\nexport type RovingFocusOrientation = \"horizontal\" | \"vertical\" | \"both\";\n\nexport interface RovingFocusItemRecord {\n readonly disabled: boolean;\n readonly element: HTMLElement | null;\n readonly id: string;\n readonly textValue: string;\n}\n\nexport interface RovingFocusConfig {\n readonly direction?: Direction | undefined;\n readonly loop: boolean;\n readonly orientation: RovingFocusOrientation;\n}\n\nexport interface RovingFocusStore {\n focus(id: string): void;\n getCurrentId(): string | null;\n getDirection(): Direction | undefined;\n getItems(): readonly RovingFocusItemRecord[];\n move(fromId: string, key: string, direction?: Direction): boolean;\n register(item: RovingFocusItemRecord): () => void;\n search(character: string): void;\n setCurrentId(id: string): void;\n setElement(id: string, element: HTMLElement | null): void;\n subscribe(listener: () => void): () => void;\n subscribeItem(id: string, listener: () => void): () => void;\n updateConfig(config: RovingFocusConfig): void;\n updateItem(id: string, item: Partial<RovingFocusItemRecord>): void;\n}\n\nfunction orderedItems(items: Map<string, RovingFocusItemRecord>) {\n return sortByDocumentOrder(items.values(), (item) => item.element);\n}\n\nexport function createRovingFocusStore(initial: RovingFocusConfig): RovingFocusStore {\n const items = new Map<string, RovingFocusItemRecord>();\n const listeners = new Set<() => void>();\n const itemListeners = new Map<string, Set<() => void>>();\n let config = initial;\n let currentId: string | null = null;\n let search = \"\";\n let searchTimer: ReturnType<typeof setTimeout> | undefined;\n const emit = () => {\n for (const listener of listeners) listener();\n };\n const emitItem = (id: string | null) => {\n if (!id) return;\n for (const listener of itemListeners.get(id) ?? []) listener();\n };\n const commitCurrentId = (id: string | null) => {\n if (currentId === id) return;\n const previous = currentId;\n currentId = id;\n emit();\n emitItem(previous);\n emitItem(id);\n };\n const getEnabled = () => orderedItems(items).filter((item) => !item.disabled);\n\n const store: RovingFocusStore = {\n focus(id) {\n const item = items.get(id);\n if (!item || item.disabled) return;\n store.setCurrentId(id);\n item.element?.focus({ preventScroll: true });\n },\n getCurrentId: () => currentId,\n getDirection: () => config.direction,\n getItems: () => orderedItems(items),\n move(fromId, key, direction) {\n const effectiveDirection = direction ?? config.direction ?? \"ltr\";\n const enabled = getEnabled();\n if (enabled.length === 0) return false;\n const currentIndex = Math.max(\n 0,\n enabled.findIndex((item) => item.id === fromId),\n );\n const horizontal = config.orientation !== \"vertical\";\n const vertical = config.orientation !== \"horizontal\";\n let offset = 0;\n if (vertical && key === \"ArrowDown\") offset = 1;\n if (vertical && key === \"ArrowUp\") offset = -1;\n if (horizontal && key === \"ArrowRight\") {\n offset = effectiveDirection === \"rtl\" ? -1 : 1;\n }\n if (horizontal && key === \"ArrowLeft\") {\n offset = effectiveDirection === \"rtl\" ? 1 : -1;\n }\n if (offset === 0 && key !== \"Home\" && key !== \"End\") return false;\n let nextIndex =\n key === \"Home\" ? 0 : key === \"End\" ? enabled.length - 1 : currentIndex + offset;\n if (config.loop) nextIndex = (nextIndex + enabled.length) % enabled.length;\n const next = enabled[nextIndex];\n if (!next) return false;\n store.focus(next.id);\n return true;\n },\n register(item) {\n items.set(item.id, item);\n if (currentId === null && !item.disabled) commitCurrentId(item.id);\n return () => {\n const wasCurrent = currentId === item.id;\n if (!items.delete(item.id)) return;\n if (wasCurrent) commitCurrentId(getEnabled()[0]?.id ?? null);\n else emit();\n };\n },\n search(character) {\n clearTimeout(searchTimer);\n const repeated = search.length > 0 && [...search].every((value) => value === character);\n search = repeated ? character : search + character;\n const query = search.toLocaleLowerCase();\n const enabled = getEnabled();\n const start = Math.max(0, enabled.findIndex((item) => item.id === currentId) + 1);\n const rotated = [...enabled.slice(start), ...enabled.slice(0, start)];\n const match = rotated.find((item) => item.textValue.toLocaleLowerCase().startsWith(query));\n if (match) store.focus(match.id);\n searchTimer = setTimeout(() => {\n search = \"\";\n }, 500);\n },\n setCurrentId(id) {\n commitCurrentId(id);\n },\n setElement(id, element) {\n store.updateItem(id, { element });\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n subscribeItem(id, listener) {\n const set = itemListeners.get(id) ?? new Set<() => void>();\n set.add(listener);\n itemListeners.set(id, set);\n return () => {\n set.delete(listener);\n if (set.size === 0) itemListeners.delete(id);\n };\n },\n updateConfig(next) {\n config = next;\n },\n updateItem(id, update) {\n const item = items.get(id);\n if (!item) return;\n const next = { ...item, ...update };\n items.set(id, next);\n if (id === currentId && next.disabled) {\n commitCurrentId(getEnabled()[0]?.id ?? null);\n }\n },\n };\n return store;\n}\n"],"mappings":"AACA,SAAS,2BAA2B;AAiCpC,SAAS,aAAa,OAA2C;AAC/D,SAAO,oBAAoB,MAAM,OAAO,GAAG,CAAC,SAAS,KAAK,OAAO;AACnE;AAEO,SAAS,uBAAuB,SAA8C;AACnF,QAAM,QAAQ,oBAAI,IAAmC;AACrD,QAAM,YAAY,oBAAI,IAAgB;AACtC,QAAM,gBAAgB,oBAAI,IAA6B;AACvD,MAAI,SAAS;AACb,MAAI,YAA2B;AAC/B,MAAI,SAAS;AACb,MAAI;AACJ,QAAM,OAAO,MAAM;AACjB,eAAW,YAAY,UAAW,UAAS;AAAA,EAC7C;AACA,QAAM,WAAW,CAAC,OAAsB;AACtC,QAAI,CAAC,GAAI;AACT,eAAW,YAAY,cAAc,IAAI,EAAE,KAAK,CAAC,EAAG,UAAS;AAAA,EAC/D;AACA,QAAM,kBAAkB,CAAC,OAAsB;AAC7C,QAAI,cAAc,GAAI;AACtB,UAAM,WAAW;AACjB,gBAAY;AACZ,SAAK;AACL,aAAS,QAAQ;AACjB,aAAS,EAAE;AAAA,EACb;AACA,QAAM,aAAa,MAAM,aAAa,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,QAAQ;AAE5E,QAAM,QAA0B;AAAA,IAC9B,MAAM,IAAI;AACR,YAAM,OAAO,MAAM,IAAI,EAAE;AACzB,UAAI,CAAC,QAAQ,KAAK,SAAU;AAC5B,YAAM,aAAa,EAAE;AACrB,WAAK,SAAS,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,IAC7C;AAAA,IACA,cAAc,MAAM;AAAA,IACpB,cAAc,MAAM,OAAO;AAAA,IAC3B,UAAU,MAAM,aAAa,KAAK;AAAA,IAClC,KAAK,QAAQ,KAAK,WAAW;AAC3B,YAAM,qBAAqB,aAAa,OAAO,aAAa;AAC5D,YAAM,UAAU,WAAW;AAC3B,UAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,YAAM,eAAe,KAAK;AAAA,QACxB;AAAA,QACA,QAAQ,UAAU,CAAC,SAAS,KAAK,OAAO,MAAM;AAAA,MAChD;AACA,YAAM,aAAa,OAAO,gBAAgB;AAC1C,YAAM,WAAW,OAAO,gBAAgB;AACxC,UAAI,SAAS;AACb,UAAI,YAAY,QAAQ,YAAa,UAAS;AAC9C,UAAI,YAAY,QAAQ,UAAW,UAAS;AAC5C,UAAI,cAAc,QAAQ,cAAc;AACtC,iBAAS,uBAAuB,QAAQ,KAAK;AAAA,MAC/C;AACA,UAAI,cAAc,QAAQ,aAAa;AACrC,iBAAS,uBAAuB,QAAQ,IAAI;AAAA,MAC9C;AACA,UAAI,WAAW,KAAK,QAAQ,UAAU,QAAQ,MAAO,QAAO;AAC5D,UAAI,YACF,QAAQ,SAAS,IAAI,QAAQ,QAAQ,QAAQ,SAAS,IAAI,eAAe;AAC3E,UAAI,OAAO,KAAM,cAAa,YAAY,QAAQ,UAAU,QAAQ;AACpE,YAAM,OAAO,QAAQ,SAAS;AAC9B,UAAI,CAAC,KAAM,QAAO;AAClB,YAAM,MAAM,KAAK,EAAE;AACnB,aAAO;AAAA,IACT;AAAA,IACA,SAAS,MAAM;AACb,YAAM,IAAI,KAAK,IAAI,IAAI;AACvB,UAAI,cAAc,QAAQ,CAAC,KAAK,SAAU,iBAAgB,KAAK,EAAE;AACjE,aAAO,MAAM;AACX,cAAM,aAAa,cAAc,KAAK;AACtC,YAAI,CAAC,MAAM,OAAO,KAAK,EAAE,EAAG;AAC5B,YAAI,WAAY,iBAAgB,WAAW,EAAE,CAAC,GAAG,MAAM,IAAI;AAAA,YACtD,MAAK;AAAA,MACZ;AAAA,IACF;AAAA,IACA,OAAO,WAAW;AAChB,mBAAa,WAAW;AACxB,YAAM,WAAW,OAAO,SAAS,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,CAAC,UAAU,UAAU,SAAS;AACtF,eAAS,WAAW,YAAY,SAAS;AACzC,YAAM,QAAQ,OAAO,kBAAkB;AACvC,YAAM,UAAU,WAAW;AAC3B,YAAM,QAAQ,KAAK,IAAI,GAAG,QAAQ,UAAU,CAAC,SAAS,KAAK,OAAO,SAAS,IAAI,CAAC;AAChF,YAAM,UAAU,CAAC,GAAG,QAAQ,MAAM,KAAK,GAAG,GAAG,QAAQ,MAAM,GAAG,KAAK,CAAC;AACpE,YAAM,QAAQ,QAAQ,KAAK,CAAC,SAAS,KAAK,UAAU,kBAAkB,EAAE,WAAW,KAAK,CAAC;AACzF,UAAI,MAAO,OAAM,MAAM,MAAM,EAAE;AAC/B,oBAAc,WAAW,MAAM;AAC7B,iBAAS;AAAA,MACX,GAAG,GAAG;AAAA,IACR;AAAA,IACA,aAAa,IAAI;AACf,sBAAgB,EAAE;AAAA,IACpB;AAAA,IACA,WAAW,IAAI,SAAS;AACtB,YAAM,WAAW,IAAI,EAAE,QAAQ,CAAC;AAAA,IAClC;AAAA,IACA,UAAU,UAAU;AAClB,gBAAU,IAAI,QAAQ;AACtB,aAAO,MAAM,UAAU,OAAO,QAAQ;AAAA,IACxC;AAAA,IACA,cAAc,IAAI,UAAU;AAC1B,YAAM,MAAM,cAAc,IAAI,EAAE,KAAK,oBAAI,IAAgB;AACzD,UAAI,IAAI,QAAQ;AAChB,oBAAc,IAAI,IAAI,GAAG;AACzB,aAAO,MAAM;AACX,YAAI,OAAO,QAAQ;AACnB,YAAI,IAAI,SAAS,EAAG,eAAc,OAAO,EAAE;AAAA,MAC7C;AAAA,IACF;AAAA,IACA,aAAa,MAAM;AACjB,eAAS;AAAA,IACX;AAAA,IACA,WAAW,IAAI,QAAQ;AACrB,YAAM,OAAO,MAAM,IAAI,EAAE;AACzB,UAAI,CAAC,KAAM;AACX,YAAM,OAAO,EAAE,GAAG,MAAM,GAAG,OAAO;AAClC,YAAM,IAAI,IAAI,IAAI;AAClB,UAAI,OAAO,aAAa,KAAK,UAAU;AACrC,wBAAgB,WAAW,EAAE,CAAC,GAAG,MAAM,IAAI;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"roving-focus.d.ts","sourceRoot":"","sources":["../../src/core/roving-focus.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,WAAW,EAGX,YAAY,EACZ,GAAG,EACJ,MAAM,OAAO,CAAC;AAEf,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EACL,sBAAsB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACtB,MAAM,yBAAyB,CAAC;AAKjC,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,sBAAsB,CAAC;CAC/C;AAED,MAAM,MAAM,oBAAoB,CAAC,GAAG,SAAS,WAAW,GAAG,KAAK,IAAI,eAAe,CACjF,GAAG,EACH,uBAAuB,EACvB;IAAE,WAAW,EAAE,sBAAsB,CAAA;CAAE,EACvC,WAAW,CACZ,CAAC;AAEF,wBAAgB,eAAe,CAAC,GAAG,SAAS,WAAW,GAAG,KAAK,EAC7D,KAAK,EAAE,oBAAoB,CAAC,GAAG,CAAC,GAC/B,YAAY,GAAG,IAAI,CA0BrB;yBA5Be,eAAe;;;AA+B/B,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,oBAAoB,CAAC,GAAG,SAAS,WAAW,GAAG,KAAK,IAAI,eAAe,CACjF,GAAG,EACH,uBAAuB,EACvB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,EACvC,WAAW,CACZ,CAAC;AAEF,wBAAgB,eAAe,CAAC,GAAG,SAAS,WAAW,GAAG,KAAK,EAC7D,KAAK,EAAE,oBAAoB,CAAC,GAAG,CAAC,GAC/B,YAAY,GAAG,IAAI,CA+ErB;AAED,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAClC,YAAY,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"roving-focus.d.ts","sourceRoot":"","sources":["../../src/core/roving-focus.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,WAAW,EAGX,YAAY,EACZ,GAAG,EACJ,MAAM,OAAO,CAAC;AAEf,OAAO,EAAwB,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EACL,sBAAsB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACtB,MAAM,yBAAyB,CAAC;AAMjC,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,sBAAsB,CAAC;CAC/C;AAED,MAAM,MAAM,oBAAoB,CAAC,GAAG,SAAS,WAAW,GAAG,KAAK,IAAI,eAAe,CACjF,GAAG,EACH,uBAAuB,EACvB;IAAE,WAAW,EAAE,sBAAsB,CAAA;CAAE,EACvC,WAAW,CACZ,CAAC;AAEF,wBAAgB,eAAe,CAAC,GAAG,SAAS,WAAW,GAAG,KAAK,EAC7D,KAAK,EAAE,oBAAoB,CAAC,GAAG,CAAC,GAC/B,YAAY,GAAG,IAAI,CA0BrB;yBA5Be,eAAe;;;AA+B/B,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,oBAAoB,CAAC,GAAG,SAAS,WAAW,GAAG,KAAK,IAAI,eAAe,CACjF,GAAG,EACH,uBAAuB,EACvB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,EACvC,WAAW,CACZ,CAAC;AAEF,wBAAgB,eAAe,CAAC,GAAG,SAAS,WAAW,GAAG,KAAK,EAC7D,KAAK,EAAE,oBAAoB,CAAC,GAAG,CAAC,GAC/B,YAAY,GAAG,IAAI,CAkFrB;AAED,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAClC,YAAY,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,CAAC"}
@@ -3,10 +3,12 @@ import { jsx } from "react/jsx-runtime";
3
3
  import { createContext, useCallback, useContext, useRef, useSyncExternalStore } from "react";
4
4
  import { useId, useIsomorphicLayoutEffect, useMergedRefs } from "@gunkin/uiify/hooks";
5
5
  import { composeEventHandlers } from "./compose-event-handlers.js";
6
- import { useDirection } from "./direction.js";
6
+ import { useDirectionOverride } from "./direction.js";
7
+ import { isComposingKeyEvent } from "./ime.js";
7
8
  import {
8
9
  createRovingFocusStore
9
10
  } from "./roving-focus-store.js";
11
+ import { resolveDirection } from "./text-direction.js";
10
12
  import { useRenderElement } from "./use-render-element.js";
11
13
  const RovingFocusContext = createContext(null);
12
14
  function RovingFocusRoot(props) {
@@ -18,7 +20,7 @@ function RovingFocusRoot(props) {
18
20
  render,
19
21
  ...consumerProps
20
22
  } = props;
21
- const direction = useDirection(localDirection);
23
+ const direction = useDirectionOverride(localDirection);
22
24
  const storeRef = useRef(null);
23
25
  storeRef.current ??= createRovingFocusStore({ direction, loop, orientation });
24
26
  storeRef.current.updateConfig({ direction, loop, orientation });
@@ -27,8 +29,8 @@ function RovingFocusRoot(props) {
27
29
  defaultTag: "div",
28
30
  props: {
29
31
  ...consumerProps,
30
- "data-orientation": orientation,
31
- dir: direction
32
+ ...direction ? { dir: direction } : {},
33
+ "data-orientation": orientation
32
34
  },
33
35
  render,
34
36
  state: { orientation }
@@ -82,8 +84,11 @@ function RovingFocusItem(props) {
82
84
  if (!disabled) store.setCurrentId(id);
83
85
  };
84
86
  const handleKeyDown = (event) => {
87
+ if (isComposingKeyEvent(event)) return;
85
88
  if (event.key === "Home" || event.key === "End" || event.key.startsWith("Arrow")) {
86
- if (store.move(id, event.key)) event.preventDefault();
89
+ if (store.move(id, event.key, resolveDirection(event.currentTarget, store.getDirection()))) {
90
+ event.preventDefault();
91
+ }
87
92
  } else if (event.key.length === 1 && !event.altKey && !event.ctrlKey && !event.metaKey) {
88
93
  store.search(event.key);
89
94
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/roving-focus.tsx"],"sourcesContent":["\"use client\";\n\nimport { createContext, useCallback, useContext, useRef, useSyncExternalStore } from \"react\";\nimport { useId, useIsomorphicLayoutEffect, useMergedRefs } from \"@gunkin/uiify/hooks\";\nimport type {\n ElementType,\n FocusEvent as ReactFocusEvent,\n KeyboardEvent as ReactKeyboardEvent,\n ReactElement,\n Ref,\n} from \"react\";\nimport { composeEventHandlers } from \"./compose-event-handlers.js\";\nimport { useDirection, type Direction } from \"./direction.js\";\nimport type { RenderableProps } from \"./polymorphic.js\";\nimport {\n createRovingFocusStore,\n type RovingFocusOrientation,\n type RovingFocusStore,\n} from \"./roving-focus-store.js\";\nimport { useRenderElement } from \"./use-render-element.js\";\n\nconst RovingFocusContext = createContext<RovingFocusStore | null>(null);\n\nexport interface RovingFocusRootOwnProps {\n readonly direction?: Direction;\n readonly loop?: boolean;\n readonly orientation?: RovingFocusOrientation;\n}\n\nexport type RovingFocusRootProps<TAs extends ElementType = \"div\"> = RenderableProps<\n TAs,\n RovingFocusRootOwnProps,\n { orientation: RovingFocusOrientation },\n HTMLElement\n>;\n\nexport function RovingFocusRoot<TAs extends ElementType = \"div\">(\n props: RovingFocusRootProps<TAs>,\n): ReactElement | null {\n const {\n as,\n direction: localDirection,\n loop = true,\n orientation = \"both\",\n render,\n ...consumerProps\n } = props as RovingFocusRootProps<ElementType>;\n const direction = useDirection(localDirection);\n const storeRef = useRef<RovingFocusStore | null>(null);\n storeRef.current ??= createRovingFocusStore({ direction, loop, orientation });\n storeRef.current.updateConfig({ direction, loop, orientation });\n\n const element = useRenderElement({\n as,\n defaultTag: \"div\",\n props: {\n ...consumerProps,\n \"data-orientation\": orientation,\n dir: direction,\n },\n render,\n state: { orientation },\n });\n return <RovingFocusContext value={storeRef.current}>{element}</RovingFocusContext>;\n}\nRovingFocusRoot.displayName = \"RovingFocusRoot\";\n\nexport interface RovingFocusItemOwnProps {\n readonly ref?: Ref<HTMLElement>;\n readonly disabled?: boolean;\n readonly id?: string;\n readonly textValue?: string;\n}\n\nexport type RovingFocusItemProps<TAs extends ElementType = \"div\"> = RenderableProps<\n TAs,\n RovingFocusItemOwnProps,\n { current: boolean; disabled: boolean },\n HTMLElement\n>;\n\nexport function RovingFocusItem<TAs extends ElementType = \"div\">(\n props: RovingFocusItemProps<TAs>,\n): ReactElement | null {\n const {\n as,\n disabled = false,\n id: providedId,\n ref: consumerRef,\n render,\n textValue = \"\",\n ...consumerProps\n } = props as RovingFocusItemProps<ElementType> & { ref?: Ref<HTMLElement> };\n const { onFocus: consumerOnFocus, onKeyDown: consumerOnKeyDown } = consumerProps as {\n onFocus?: (event: ReactFocusEvent<HTMLElement>) => void;\n onKeyDown?: (event: ReactKeyboardEvent<HTMLElement>) => void;\n };\n const generatedId = useId();\n const id = providedId ?? generatedId;\n const store = useContext(RovingFocusContext);\n if (!store) throw new Error(\"RovingFocusItem must be used inside RovingFocusRoot\");\n const elementRef = useRef<HTMLElement | null>(null);\n const current = useSyncExternalStore(\n (listener) => store.subscribeItem(id, listener),\n () => store.getCurrentId() === id,\n () => false,\n );\n const setElement = useCallback(\n (element: HTMLElement | null) => store.setElement(id, element),\n [id, store],\n );\n const mergedRef = useMergedRefs(elementRef, consumerRef, setElement);\n\n useIsomorphicLayoutEffect(\n () =>\n store.register({\n disabled,\n element: elementRef.current,\n id,\n textValue: textValue || elementRef.current?.textContent?.trim() || \"\",\n }),\n [id, store],\n );\n useIsomorphicLayoutEffect(() => {\n store.updateItem(id, {\n disabled,\n textValue: textValue || elementRef.current?.textContent?.trim() || \"\",\n });\n }, [disabled, id, store, textValue]);\n\n const nativeButton = as === \"button\";\n\n const handleFocus = () => {\n if (!disabled) store.setCurrentId(id);\n };\n\n const handleKeyDown = (event: ReactKeyboardEvent<HTMLElement>) => {\n if (event.key === \"Home\" || event.key === \"End\" || event.key.startsWith(\"Arrow\")) {\n if (store.move(id, event.key)) event.preventDefault();\n } else if (event.key.length === 1 && !event.altKey && !event.ctrlKey && !event.metaKey) {\n store.search(event.key);\n }\n };\n\n return useRenderElement({\n as,\n defaultTag: \"div\",\n props: {\n ...consumerProps,\n id,\n \"aria-disabled\": disabled || undefined,\n \"data-current\": current ? \"\" : undefined,\n \"data-disabled\": disabled ? \"\" : undefined,\n ...(nativeButton ? { disabled: disabled || undefined } : {}),\n onFocus: composeEventHandlers(consumerOnFocus, handleFocus),\n onKeyDown: composeEventHandlers(consumerOnKeyDown, handleKeyDown),\n ref: mergedRef,\n tabIndex: current && !disabled ? 0 : -1,\n },\n render,\n state: { current, disabled },\n });\n}\n\nexport { createRovingFocusStore };\nexport type { RovingFocusOrientation, RovingFocusStore };\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/core/roving-focus.tsx"],"sourcesContent":["\"use client\";\n\nimport { createContext, useCallback, useContext, useRef, useSyncExternalStore } from \"react\";\nimport { useId, useIsomorphicLayoutEffect, useMergedRefs } from \"@gunkin/uiify/hooks\";\nimport type {\n ElementType,\n FocusEvent as ReactFocusEvent,\n KeyboardEvent as ReactKeyboardEvent,\n ReactElement,\n Ref,\n} from \"react\";\nimport { composeEventHandlers } from \"./compose-event-handlers.js\";\nimport { useDirectionOverride, type Direction } from \"./direction.js\";\nimport { isComposingKeyEvent } from \"./ime.js\";\nimport type { RenderableProps } from \"./polymorphic.js\";\nimport {\n createRovingFocusStore,\n type RovingFocusOrientation,\n type RovingFocusStore,\n} from \"./roving-focus-store.js\";\nimport { resolveDirection } from \"./text-direction.js\";\nimport { useRenderElement } from \"./use-render-element.js\";\n\nconst RovingFocusContext = createContext<RovingFocusStore | null>(null);\n\nexport interface RovingFocusRootOwnProps {\n readonly direction?: Direction;\n readonly loop?: boolean;\n readonly orientation?: RovingFocusOrientation;\n}\n\nexport type RovingFocusRootProps<TAs extends ElementType = \"div\"> = RenderableProps<\n TAs,\n RovingFocusRootOwnProps,\n { orientation: RovingFocusOrientation },\n HTMLElement\n>;\n\nexport function RovingFocusRoot<TAs extends ElementType = \"div\">(\n props: RovingFocusRootProps<TAs>,\n): ReactElement | null {\n const {\n as,\n direction: localDirection,\n loop = true,\n orientation = \"both\",\n render,\n ...consumerProps\n } = props as RovingFocusRootProps<ElementType>;\n const direction = useDirectionOverride(localDirection);\n const storeRef = useRef<RovingFocusStore | null>(null);\n storeRef.current ??= createRovingFocusStore({ direction, loop, orientation });\n storeRef.current.updateConfig({ direction, loop, orientation });\n\n const element = useRenderElement({\n as,\n defaultTag: \"div\",\n props: {\n ...consumerProps,\n ...(direction ? { dir: direction } : {}),\n \"data-orientation\": orientation,\n },\n render,\n state: { orientation },\n });\n return <RovingFocusContext value={storeRef.current}>{element}</RovingFocusContext>;\n}\nRovingFocusRoot.displayName = \"RovingFocusRoot\";\n\nexport interface RovingFocusItemOwnProps {\n readonly ref?: Ref<HTMLElement>;\n readonly disabled?: boolean;\n readonly id?: string;\n readonly textValue?: string;\n}\n\nexport type RovingFocusItemProps<TAs extends ElementType = \"div\"> = RenderableProps<\n TAs,\n RovingFocusItemOwnProps,\n { current: boolean; disabled: boolean },\n HTMLElement\n>;\n\nexport function RovingFocusItem<TAs extends ElementType = \"div\">(\n props: RovingFocusItemProps<TAs>,\n): ReactElement | null {\n const {\n as,\n disabled = false,\n id: providedId,\n ref: consumerRef,\n render,\n textValue = \"\",\n ...consumerProps\n } = props as RovingFocusItemProps<ElementType> & { ref?: Ref<HTMLElement> };\n const { onFocus: consumerOnFocus, onKeyDown: consumerOnKeyDown } = consumerProps as {\n onFocus?: (event: ReactFocusEvent<HTMLElement>) => void;\n onKeyDown?: (event: ReactKeyboardEvent<HTMLElement>) => void;\n };\n const generatedId = useId();\n const id = providedId ?? generatedId;\n const store = useContext(RovingFocusContext);\n if (!store) throw new Error(\"RovingFocusItem must be used inside RovingFocusRoot\");\n const elementRef = useRef<HTMLElement | null>(null);\n const current = useSyncExternalStore(\n (listener) => store.subscribeItem(id, listener),\n () => store.getCurrentId() === id,\n () => false,\n );\n const setElement = useCallback(\n (element: HTMLElement | null) => store.setElement(id, element),\n [id, store],\n );\n const mergedRef = useMergedRefs(elementRef, consumerRef, setElement);\n\n useIsomorphicLayoutEffect(\n () =>\n store.register({\n disabled,\n element: elementRef.current,\n id,\n textValue: textValue || elementRef.current?.textContent?.trim() || \"\",\n }),\n [id, store],\n );\n useIsomorphicLayoutEffect(() => {\n store.updateItem(id, {\n disabled,\n textValue: textValue || elementRef.current?.textContent?.trim() || \"\",\n });\n }, [disabled, id, store, textValue]);\n\n const nativeButton = as === \"button\";\n\n const handleFocus = () => {\n if (!disabled) store.setCurrentId(id);\n };\n\n const handleKeyDown = (event: ReactKeyboardEvent<HTMLElement>) => {\n if (isComposingKeyEvent(event)) return;\n if (event.key === \"Home\" || event.key === \"End\" || event.key.startsWith(\"Arrow\")) {\n if (store.move(id, event.key, resolveDirection(event.currentTarget, store.getDirection()))) {\n event.preventDefault();\n }\n } else if (event.key.length === 1 && !event.altKey && !event.ctrlKey && !event.metaKey) {\n store.search(event.key);\n }\n };\n\n return useRenderElement({\n as,\n defaultTag: \"div\",\n props: {\n ...consumerProps,\n id,\n \"aria-disabled\": disabled || undefined,\n \"data-current\": current ? \"\" : undefined,\n \"data-disabled\": disabled ? \"\" : undefined,\n ...(nativeButton ? { disabled: disabled || undefined } : {}),\n onFocus: composeEventHandlers(consumerOnFocus, handleFocus),\n onKeyDown: composeEventHandlers(consumerOnKeyDown, handleKeyDown),\n ref: mergedRef,\n tabIndex: current && !disabled ? 0 : -1,\n },\n render,\n state: { current, disabled },\n });\n}\n\nexport { createRovingFocusStore };\nexport type { RovingFocusOrientation, RovingFocusStore };\n"],"mappings":"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","names":[]}
@@ -0,0 +1,7 @@
1
+ import type { Direction } from "./direction.js";
2
+ /**
3
+ * Resolves the effective text direction at event time with a selector match
4
+ * (no layout read). An explicit `override` wins over the DOM.
5
+ */
6
+ export declare function resolveDirection(element: Element | null | undefined, override?: Direction): Direction;
7
+ //# sourceMappingURL=text-direction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-direction.d.ts","sourceRoot":"","sources":["../../src/core/text-direction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,EACnC,QAAQ,CAAC,EAAE,SAAS,GACnB,SAAS,CAEX"}
@@ -0,0 +1,7 @@
1
+ function resolveDirection(element, override) {
2
+ return override ?? (element?.matches(":dir(rtl)") ? "rtl" : "ltr");
3
+ }
4
+ export {
5
+ resolveDirection
6
+ };
7
+ //# sourceMappingURL=text-direction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/text-direction.ts"],"sourcesContent":["import type { Direction } from \"./direction.js\";\n\n/**\n * Resolves the effective text direction at event time with a selector match\n * (no layout read). An explicit `override` wins over the DOM.\n */\nexport function resolveDirection(\n element: Element | null | undefined,\n override?: Direction,\n): Direction {\n return override ?? (element?.matches(\":dir(rtl)\") ? \"rtl\" : \"ltr\");\n}\n"],"mappings":"AAMO,SAAS,iBACd,SACA,UACW;AACX,SAAO,aAAa,SAAS,QAAQ,WAAW,IAAI,QAAQ;AAC9D;","names":[]}