@ecoma-io/loom 0.3.0 → 0.5.0

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 (587) hide show
  1. package/README.md +11 -9
  2. package/dist/a11y.js +2 -2
  3. package/dist/index.js +73 -6
  4. package/dist/node_modules/.pnpm/{@internationalized_date@3.12.3 → @internationalized_date@3.12.4}/node_modules/@internationalized/date/dist/private/CalendarDate.js +1 -1
  5. package/dist/node_modules/.pnpm/{@internationalized_date@3.12.3 → @internationalized_date@3.12.4}/node_modules/@internationalized/date/dist/private/CalendarDate.js.map +1 -1
  6. package/dist/node_modules/.pnpm/{@internationalized_date@3.12.3 → @internationalized_date@3.12.4}/node_modules/@internationalized/date/dist/private/calendars/GregorianCalendar.js +1 -1
  7. package/dist/node_modules/.pnpm/{@internationalized_date@3.12.3 → @internationalized_date@3.12.4}/node_modules/@internationalized/date/dist/private/calendars/GregorianCalendar.js.map +1 -1
  8. package/dist/node_modules/.pnpm/{@internationalized_date@3.12.3 → @internationalized_date@3.12.4}/node_modules/@internationalized/date/dist/private/conversion.js +1 -1
  9. package/dist/node_modules/.pnpm/{@internationalized_date@3.12.3 → @internationalized_date@3.12.4}/node_modules/@internationalized/date/dist/private/conversion.js.map +1 -1
  10. package/dist/node_modules/.pnpm/{@internationalized_date@3.12.3 → @internationalized_date@3.12.4}/node_modules/@internationalized/date/dist/private/manipulation.js +1 -1
  11. package/dist/node_modules/.pnpm/{@internationalized_date@3.12.3 → @internationalized_date@3.12.4}/node_modules/@internationalized/date/dist/private/manipulation.js.map +1 -1
  12. package/dist/node_modules/.pnpm/{@internationalized_date@3.12.3 → @internationalized_date@3.12.4}/node_modules/@internationalized/date/dist/private/queries.js +1 -1
  13. package/dist/node_modules/.pnpm/{@internationalized_date@3.12.3 → @internationalized_date@3.12.4}/node_modules/@internationalized/date/dist/private/queries.js.map +1 -1
  14. package/dist/node_modules/.pnpm/{@internationalized_date@3.12.3 → @internationalized_date@3.12.4}/node_modules/@internationalized/date/dist/private/string.js +1 -1
  15. package/dist/node_modules/.pnpm/{@internationalized_date@3.12.3 → @internationalized_date@3.12.4}/node_modules/@internationalized/date/dist/private/string.js.map +1 -1
  16. package/dist/node_modules/.pnpm/{@internationalized_date@3.12.3 → @internationalized_date@3.12.4}/node_modules/@internationalized/date/dist/private/utils.js +1 -1
  17. package/dist/node_modules/.pnpm/{@internationalized_date@3.12.3 → @internationalized_date@3.12.4}/node_modules/@internationalized/date/dist/private/utils.js.map +1 -1
  18. package/dist/packages/blocks/app-header/src/AppHeader.js.map +1 -1
  19. package/dist/packages/blocks/app-header/src/AppHeader.vue.d.ts.map +1 -1
  20. package/dist/packages/blocks/app-header/src/AppHeader.vue_vue_type_script_setup_true_lang.js +1 -0
  21. package/dist/packages/blocks/app-header/src/AppHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  22. package/dist/packages/blocks/desktop-app-shell/src/DesktopAppShell.vue.d.ts +3 -3
  23. package/dist/packages/blocks/empty-state/src/EmptyState.js.map +1 -1
  24. package/dist/packages/blocks/empty-state/src/EmptyState.vue.d.ts.map +1 -1
  25. package/dist/packages/blocks/empty-state/src/EmptyState.vue_vue_type_script_setup_true_lang.js +5 -6
  26. package/dist/packages/blocks/empty-state/src/EmptyState.vue_vue_type_script_setup_true_lang.js.map +1 -1
  27. package/dist/packages/blocks/error-summary/src/ErrorSummary.js +7 -0
  28. package/dist/packages/blocks/error-summary/src/ErrorSummary.js.map +1 -0
  29. package/dist/packages/blocks/error-summary/src/ErrorSummary.vue.d.ts +31 -0
  30. package/dist/packages/blocks/error-summary/src/ErrorSummary.vue_vue_type_script_setup_true_lang.js +90 -0
  31. package/dist/packages/blocks/error-summary/src/ErrorSummary.vue_vue_type_script_setup_true_lang.js.map +1 -0
  32. package/dist/packages/blocks/error-summary/src/index.d.ts +4 -0
  33. package/dist/packages/blocks/error-summary/src/index.js +3 -0
  34. package/dist/packages/blocks/metric-card/src/MetricCard.js.map +1 -1
  35. package/dist/packages/blocks/metric-card/src/MetricCard.vue.d.ts +22 -4
  36. package/dist/packages/blocks/metric-card/src/MetricCard.vue.d.ts.map +1 -1
  37. package/dist/packages/blocks/metric-card/src/MetricCard.vue_vue_type_script_setup_true_lang.js +38 -15
  38. package/dist/packages/blocks/metric-card/src/MetricCard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  39. package/dist/packages/blocks/title-bar/src/TitleBar.vue.d.ts +3 -3
  40. package/dist/packages/blocks/toast-stack/src/ToastStack.vue.d.ts +3 -3
  41. package/dist/packages/composition/scroll-reel/src/ScrollReel.js +2 -2
  42. package/dist/packages/composition/scroll-reel/src/ScrollReel.js.map +1 -1
  43. package/dist/packages/composition/scroll-reel/src/ScrollReel.vue.d.ts +26 -0
  44. package/dist/packages/composition/scroll-reel/src/ScrollReel.vue_vue_type_script_setup_true_lang.js +28 -7
  45. package/dist/packages/composition/scroll-reel/src/ScrollReel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  46. package/dist/packages/composition/scroll-reel/src/index.d.ts +2 -1
  47. package/dist/packages/composition/scroll-reel/src/index.js +2 -1
  48. package/dist/packages/composition/sidebar/src/Sidebar.js.map +1 -1
  49. package/dist/packages/composition/sidebar/src/Sidebar.vue.d.ts +4 -0
  50. package/dist/packages/composition/sidebar/src/Sidebar.vue.d.ts.map +1 -1
  51. package/dist/packages/composition/sidebar/src/Sidebar.vue_vue_type_script_setup_true_lang.js +13 -4
  52. package/dist/packages/composition/sidebar/src/Sidebar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  53. package/dist/packages/composition/split/src/Split.js.map +1 -1
  54. package/dist/packages/composition/split/src/Split.vue.d.ts +11 -12
  55. package/dist/packages/composition/split/src/Split.vue.d.ts.map +1 -1
  56. package/dist/packages/composition/split/src/Split.vue_vue_type_script_setup_true_lang.js +15 -5
  57. package/dist/packages/composition/split/src/Split.vue_vue_type_script_setup_true_lang.js.map +1 -1
  58. package/dist/packages/core/src/a11y-scope.d.ts +71 -5
  59. package/dist/packages/core/src/a11y-scope.d.ts.map +1 -1
  60. package/dist/packages/core/src/a11y-scope.js +126 -6
  61. package/dist/packages/core/src/a11y-scope.js.map +1 -1
  62. package/dist/packages/core/src/index.d.ts +2 -2
  63. package/dist/packages/core/src/index.d.ts.map +1 -1
  64. package/dist/packages/core/src/index.js +3 -3
  65. package/dist/packages/core/src/motion.d.ts +13 -0
  66. package/dist/packages/core/src/motion.d.ts.map +1 -1
  67. package/dist/packages/core/src/motion.js +20 -13
  68. package/dist/packages/core/src/motion.js.map +1 -1
  69. package/dist/packages/core/src/theme.d.ts +9 -0
  70. package/dist/packages/core/src/theme.d.ts.map +1 -1
  71. package/dist/packages/core/src/theme.js +36 -10
  72. package/dist/packages/core/src/theme.js.map +1 -1
  73. package/dist/packages/labels/src/ancestor-disabled.d.ts +5 -1
  74. package/dist/packages/labels/src/ancestor-disabled.d.ts.map +1 -1
  75. package/dist/packages/labels/src/ancestor-disabled.js +5 -1
  76. package/dist/packages/labels/src/ancestor-disabled.js.map +1 -1
  77. package/dist/packages/labels/src/component-shapes.d.ts +236 -1
  78. package/dist/packages/labels/src/component-shapes.d.ts.map +1 -1
  79. package/dist/packages/labels/src/date-labels.d.ts +86 -7
  80. package/dist/packages/labels/src/date-labels.d.ts.map +1 -1
  81. package/dist/packages/labels/src/date-labels.js +58 -9
  82. package/dist/packages/labels/src/date-labels.js.map +1 -1
  83. package/dist/packages/labels/src/field-context.d.ts +2 -2
  84. package/dist/packages/labels/src/field-context.js.map +1 -1
  85. package/dist/packages/labels/src/index.d.ts +3 -3
  86. package/dist/packages/labels/src/index.d.ts.map +1 -1
  87. package/dist/packages/labels/src/index.js +2 -2
  88. package/dist/packages/labels/src/label-registry.d.ts +15 -1
  89. package/dist/packages/labels/src/label-registry.d.ts.map +1 -1
  90. package/dist/packages/layouts/dashboard/src/Dashboard.js.map +1 -1
  91. package/dist/packages/layouts/dashboard/src/Dashboard.vue.d.ts +4 -4
  92. package/dist/packages/layouts/dashboard/src/Dashboard.vue.d.ts.map +1 -1
  93. package/dist/packages/layouts/dashboard/src/Dashboard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  94. package/dist/packages/layouts/reading/src/Reading.js.map +1 -1
  95. package/dist/packages/layouts/reading/src/Reading.vue.d.ts +16 -15
  96. package/dist/packages/layouts/reading/src/Reading.vue.d.ts.map +1 -1
  97. package/dist/packages/layouts/reading/src/Reading.vue_vue_type_script_setup_true_lang.js.map +1 -1
  98. package/dist/packages/layouts/reading/src/index.d.ts +1 -0
  99. package/dist/packages/layouts/reading/src/index.d.ts.map +1 -1
  100. package/dist/packages/layouts/settings/src/Settings.js.map +1 -1
  101. package/dist/packages/layouts/settings/src/Settings.vue.d.ts +3 -3
  102. package/dist/packages/layouts/settings/src/Settings.vue.d.ts.map +1 -1
  103. package/dist/packages/layouts/settings/src/Settings.vue_vue_type_script_setup_true_lang.js.map +1 -1
  104. package/dist/packages/layouts/split-layout/src/SplitLayout.js.map +1 -1
  105. package/dist/packages/layouts/split-layout/src/SplitLayout.vue.d.ts +4 -6
  106. package/dist/packages/layouts/split-layout/src/SplitLayout.vue.d.ts.map +1 -1
  107. package/dist/packages/layouts/split-layout/src/SplitLayout.vue_vue_type_script_setup_true_lang.js +20 -5
  108. package/dist/packages/layouts/split-layout/src/SplitLayout.vue_vue_type_script_setup_true_lang.js.map +1 -1
  109. package/dist/packages/layouts/split-layout/src/index.d.ts +1 -1
  110. package/dist/packages/layouts/split-layout/src/index.d.ts.map +1 -1
  111. package/dist/packages/loom/src/a11y.d.ts +1 -1
  112. package/dist/packages/loom/src/index.d.ts +217 -174
  113. package/dist/packages/loom/src/theme.d.ts +3 -0
  114. package/dist/packages/primitives/alert/src/Alert.js +7 -0
  115. package/dist/packages/primitives/alert/src/Alert.js.map +1 -0
  116. package/dist/packages/primitives/alert/src/Alert.vue.d.ts +91 -0
  117. package/dist/packages/primitives/alert/src/Alert.vue_vue_type_script_setup_true_lang.js +130 -0
  118. package/dist/packages/primitives/alert/src/Alert.vue_vue_type_script_setup_true_lang.js.map +1 -0
  119. package/dist/packages/primitives/alert/src/index.d.ts +4 -0
  120. package/dist/packages/primitives/alert/src/index.js +3 -0
  121. package/dist/packages/primitives/alert-dialog/src/AlertDialog.js.map +1 -1
  122. package/dist/packages/primitives/alert-dialog/src/AlertDialog.vue.d.ts +2 -2
  123. package/dist/packages/primitives/alert-dialog/src/AlertDialog.vue_vue_type_script_setup_true_lang.js +2 -2
  124. package/dist/packages/primitives/alert-dialog/src/AlertDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  125. package/dist/packages/primitives/alert-dialog/src/index.d.ts +1 -1
  126. package/dist/packages/primitives/avatar/src/Avatar.js.map +1 -1
  127. package/dist/packages/primitives/avatar/src/Avatar.vue.d.ts +2 -2
  128. package/dist/packages/primitives/avatar/src/Avatar.vue.d.ts.map +1 -1
  129. package/dist/packages/primitives/avatar/src/Avatar.vue_vue_type_script_setup_true_lang.js +1 -1
  130. package/dist/packages/primitives/avatar/src/Avatar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  131. package/dist/packages/primitives/avatar-group/src/AvatarGroup.vue.d.ts +3 -3
  132. package/dist/packages/primitives/avatar-group/src/index.d.ts +1 -1
  133. package/dist/packages/primitives/badge/src/Badge.js.map +1 -1
  134. package/dist/packages/primitives/badge/src/Badge.vue.d.ts.map +1 -1
  135. package/dist/packages/primitives/badge/src/Badge.vue_vue_type_script_setup_true_lang.js +1 -1
  136. package/dist/packages/primitives/badge/src/Badge.vue_vue_type_script_setup_true_lang.js.map +1 -1
  137. package/dist/packages/primitives/breadcrumb/src/Breadcrumb.js +2 -2
  138. package/dist/packages/primitives/breadcrumb/src/Breadcrumb.js.map +1 -1
  139. package/dist/packages/primitives/breadcrumb/src/Breadcrumb.vue.d.ts +28 -0
  140. package/dist/packages/primitives/breadcrumb/src/Breadcrumb.vue_vue_type_script_setup_true_lang.js +16 -5
  141. package/dist/packages/primitives/breadcrumb/src/Breadcrumb.vue_vue_type_script_setup_true_lang.js.map +1 -1
  142. package/dist/packages/primitives/breadcrumb/src/index.d.ts +2 -1
  143. package/dist/packages/primitives/breadcrumb/src/index.js +2 -1
  144. package/dist/packages/primitives/button/src/Button.js.map +1 -1
  145. package/dist/packages/primitives/button/src/Button.vue.d.ts.map +1 -1
  146. package/dist/packages/primitives/button/src/Button.vue_vue_type_script_setup_true_lang.js.map +1 -1
  147. package/dist/packages/primitives/button/src/index.js +2 -2
  148. package/dist/packages/primitives/calendar/src/Calendar.js +7 -0
  149. package/dist/packages/primitives/calendar/src/Calendar.js.map +1 -0
  150. package/dist/packages/primitives/calendar/src/Calendar.vue.d.ts +95 -0
  151. package/dist/packages/primitives/calendar/src/Calendar.vue_vue_type_script_setup_true_lang.js +204 -0
  152. package/dist/packages/primitives/calendar/src/Calendar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  153. package/dist/packages/primitives/calendar/src/index.d.ts +3 -0
  154. package/dist/packages/primitives/calendar/src/index.js +3 -0
  155. package/dist/packages/primitives/card/src/Card.js +7 -0
  156. package/dist/packages/primitives/card/src/Card.js.map +1 -0
  157. package/dist/packages/primitives/card/src/Card.vue.d.ts +72 -0
  158. package/dist/packages/primitives/card/src/Card.vue_vue_type_script_setup_true_lang.js +65 -0
  159. package/dist/packages/primitives/card/src/Card.vue_vue_type_script_setup_true_lang.js.map +1 -0
  160. package/dist/packages/primitives/card/src/index.d.ts +3 -0
  161. package/dist/packages/primitives/card/src/index.d.ts.map +1 -0
  162. package/dist/packages/primitives/card/src/index.js +2 -0
  163. package/dist/packages/primitives/carousel/src/Carousel.js +7 -0
  164. package/dist/packages/primitives/carousel/src/Carousel.js.map +1 -0
  165. package/dist/packages/primitives/carousel/src/Carousel.vue.d.ts +34 -0
  166. package/dist/packages/primitives/carousel/src/Carousel.vue_vue_type_script_setup_true_lang.js +175 -0
  167. package/dist/packages/primitives/carousel/src/Carousel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  168. package/dist/packages/primitives/carousel/src/index.d.ts +3 -0
  169. package/dist/packages/primitives/carousel/src/index.js +3 -0
  170. package/dist/packages/primitives/checkbox/src/Checkbox.js.map +1 -1
  171. package/dist/packages/primitives/checkbox/src/Checkbox.vue.d.ts +1 -1
  172. package/dist/packages/primitives/checkbox/src/Checkbox.vue.d.ts.map +1 -1
  173. package/dist/packages/primitives/checkbox/src/Checkbox.vue_vue_type_script_setup_true_lang.js +3 -3
  174. package/dist/packages/primitives/checkbox/src/Checkbox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  175. package/dist/packages/primitives/chip/src/Chip.js.map +1 -1
  176. package/dist/packages/primitives/chip/src/Chip.vue.d.ts.map +1 -1
  177. package/dist/packages/primitives/chip/src/Chip.vue_vue_type_script_setup_true_lang.js +1 -1
  178. package/dist/packages/primitives/chip/src/Chip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  179. package/dist/packages/primitives/collapse/src/Collapse.js +7 -0
  180. package/dist/packages/primitives/collapse/src/Collapse.js.map +1 -0
  181. package/dist/packages/primitives/collapse/src/Collapse.vue.d.ts +56 -0
  182. package/dist/packages/primitives/collapse/src/Collapse.vue.d.ts.map +1 -0
  183. package/dist/packages/primitives/collapse/src/Collapse.vue_vue_type_script_setup_true_lang.js +81 -0
  184. package/dist/packages/primitives/collapse/src/Collapse.vue_vue_type_script_setup_true_lang.js.map +1 -0
  185. package/dist/packages/primitives/collapse/src/index.d.ts +2 -0
  186. package/dist/packages/primitives/collapse/src/index.d.ts.map +1 -0
  187. package/dist/packages/primitives/collapse/src/index.js +2 -0
  188. package/dist/packages/primitives/color-picker/src/ColorPicker.js.map +1 -1
  189. package/dist/packages/primitives/color-picker/src/ColorPicker.vue.d.ts +4 -4
  190. package/dist/packages/primitives/color-picker/src/ColorPicker.vue_vue_type_script_setup_true_lang.js +2 -2
  191. package/dist/packages/primitives/color-picker/src/ColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  192. package/dist/packages/primitives/color-picker/src/index.d.ts +1 -1
  193. package/dist/packages/primitives/combobox/src/Combobox.js.map +1 -1
  194. package/dist/packages/primitives/combobox/src/Combobox.vue.d.ts +3 -3
  195. package/dist/packages/primitives/combobox/src/Combobox.vue_vue_type_script_setup_true_lang.js +2 -2
  196. package/dist/packages/primitives/combobox/src/Combobox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  197. package/dist/packages/primitives/combobox/src/index.d.ts +1 -1
  198. package/dist/packages/primitives/command/src/Command.js +7 -0
  199. package/dist/packages/primitives/command/src/Command.js.map +1 -0
  200. package/dist/packages/primitives/command/src/Command.vue.d.ts +77 -0
  201. package/dist/packages/primitives/command/src/Command.vue_vue_type_script_setup_true_lang.js +333 -0
  202. package/dist/packages/primitives/command/src/Command.vue_vue_type_script_setup_true_lang.js.map +1 -0
  203. package/dist/packages/primitives/command/src/index.d.ts +4 -0
  204. package/dist/packages/primitives/command/src/index.js +3 -0
  205. package/dist/packages/primitives/context-menu/src/ContextMenu.js.map +1 -1
  206. package/dist/packages/primitives/context-menu/src/ContextMenu.vue.d.ts +12 -0
  207. package/dist/packages/primitives/context-menu/src/ContextMenu.vue.d.ts.map +1 -1
  208. package/dist/packages/primitives/context-menu/src/ContextMenu.vue_vue_type_script_setup_true_lang.js +7 -3
  209. package/dist/packages/primitives/context-menu/src/ContextMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  210. package/dist/packages/primitives/copy-button/src/CopyButton.js +7 -0
  211. package/dist/packages/primitives/copy-button/src/CopyButton.js.map +1 -0
  212. package/dist/packages/primitives/copy-button/src/CopyButton.vue.d.ts +64 -0
  213. package/dist/packages/primitives/copy-button/src/CopyButton.vue_vue_type_script_setup_true_lang.js +113 -0
  214. package/dist/packages/primitives/copy-button/src/CopyButton.vue_vue_type_script_setup_true_lang.js.map +1 -0
  215. package/dist/packages/primitives/copy-button/src/index.d.ts +4 -0
  216. package/dist/packages/primitives/copy-button/src/index.js +3 -0
  217. package/dist/packages/primitives/data-grid/src/DataGrid.js +7 -0
  218. package/dist/packages/primitives/data-grid/src/DataGrid.js.map +1 -0
  219. package/dist/packages/primitives/data-grid/src/DataGrid.vue.d.ts +128 -0
  220. package/dist/packages/primitives/data-grid/src/DataGrid.vue_vue_type_script_setup_true_lang.js +347 -0
  221. package/dist/packages/primitives/data-grid/src/DataGrid.vue_vue_type_script_setup_true_lang.js.map +1 -0
  222. package/dist/packages/primitives/data-grid/src/index.d.ts +4 -0
  223. package/dist/packages/primitives/data-grid/src/index.js +3 -0
  224. package/dist/packages/primitives/date-picker/src/DatePicker.js.map +1 -1
  225. package/dist/packages/primitives/date-picker/src/DatePicker.vue.d.ts +2 -2
  226. package/dist/packages/primitives/date-picker/src/DatePicker.vue_vue_type_script_setup_true_lang.js +14 -14
  227. package/dist/packages/primitives/date-picker/src/DatePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  228. package/dist/packages/primitives/date-range-picker/src/DateRangePicker.js.map +1 -1
  229. package/dist/packages/primitives/date-range-picker/src/DateRangePicker.vue.d.ts +3 -3
  230. package/dist/packages/primitives/date-range-picker/src/DateRangePicker.vue_vue_type_script_setup_true_lang.js +22 -19
  231. package/dist/packages/primitives/date-range-picker/src/DateRangePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  232. package/dist/packages/primitives/date-range-picker/src/index.d.ts +1 -1
  233. package/dist/packages/primitives/date-time-picker/src/DateTimePicker.js.map +1 -1
  234. package/dist/packages/primitives/date-time-picker/src/DateTimePicker.vue.d.ts +2 -2
  235. package/dist/packages/primitives/date-time-picker/src/DateTimePicker.vue_vue_type_script_setup_true_lang.js +18 -17
  236. package/dist/packages/primitives/date-time-picker/src/DateTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  237. package/dist/packages/primitives/date-time-range-picker/src/DateTimeRangePicker.js.map +1 -1
  238. package/dist/packages/primitives/date-time-range-picker/src/DateTimeRangePicker.vue.d.ts +3 -3
  239. package/dist/packages/primitives/date-time-range-picker/src/DateTimeRangePicker.vue_vue_type_script_setup_true_lang.js +18 -17
  240. package/dist/packages/primitives/date-time-range-picker/src/DateTimeRangePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  241. package/dist/packages/primitives/date-time-range-picker/src/index.d.ts +1 -1
  242. package/dist/packages/primitives/dialog/src/Dialog.js.map +1 -1
  243. package/dist/packages/primitives/dialog/src/Dialog.vue.d.ts +27 -11
  244. package/dist/packages/primitives/dialog/src/Dialog.vue_vue_type_script_setup_true_lang.js +6 -4
  245. package/dist/packages/primitives/dialog/src/Dialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  246. package/dist/packages/primitives/dialog/src/index.d.ts +1 -1
  247. package/dist/packages/primitives/drawer/src/Drawer.js.map +1 -1
  248. package/dist/packages/primitives/drawer/src/Drawer.vue.d.ts +12 -4
  249. package/dist/packages/primitives/drawer/src/Drawer.vue_vue_type_script_setup_true_lang.js +13 -5
  250. package/dist/packages/primitives/drawer/src/Drawer.vue_vue_type_script_setup_true_lang.js.map +1 -1
  251. package/dist/packages/primitives/drawer/src/index.d.ts +1 -1
  252. package/dist/packages/primitives/dropdown-menu/src/DropdownMenu.js.map +1 -1
  253. package/dist/packages/primitives/dropdown-menu/src/DropdownMenu.vue.d.ts +26 -0
  254. package/dist/packages/primitives/dropdown-menu/src/DropdownMenu.vue.d.ts.map +1 -1
  255. package/dist/packages/primitives/dropdown-menu/src/DropdownMenu.vue_vue_type_script_setup_true_lang.js +10 -4
  256. package/dist/packages/primitives/dropdown-menu/src/DropdownMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  257. package/dist/packages/primitives/editable/src/Editable.js.map +1 -1
  258. package/dist/packages/primitives/editable/src/Editable.vue.d.ts +2 -2
  259. package/dist/packages/primitives/editable/src/Editable.vue_vue_type_script_setup_true_lang.js +1 -1
  260. package/dist/packages/primitives/editable/src/Editable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  261. package/dist/packages/primitives/editable/src/index.d.ts +1 -1
  262. package/dist/packages/primitives/file-upload/src/FileUpload.js.map +1 -1
  263. package/dist/packages/primitives/file-upload/src/FileUpload.vue.d.ts +2 -2
  264. package/dist/packages/primitives/file-upload/src/FileUpload.vue_vue_type_script_setup_true_lang.js +1 -1
  265. package/dist/packages/primitives/file-upload/src/FileUpload.vue_vue_type_script_setup_true_lang.js.map +1 -1
  266. package/dist/packages/primitives/file-upload/src/index.d.ts +1 -1
  267. package/dist/packages/primitives/hover-card/src/HoverCard.js.map +1 -1
  268. package/dist/packages/primitives/hover-card/src/HoverCard.vue.d.ts.map +1 -1
  269. package/dist/packages/primitives/hover-card/src/HoverCard.vue_vue_type_script_setup_true_lang.js +1 -1
  270. package/dist/packages/primitives/hover-card/src/HoverCard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  271. package/dist/packages/primitives/hover-card/src/index.d.ts.map +1 -1
  272. package/dist/packages/primitives/icon-button/src/IconButton.js.map +1 -1
  273. package/dist/packages/primitives/icon-button/src/IconButton.vue.d.ts +10 -4
  274. package/dist/packages/primitives/icon-button/src/IconButton.vue.d.ts.map +1 -1
  275. package/dist/packages/primitives/icon-button/src/IconButton.vue_vue_type_script_setup_true_lang.js +18 -6
  276. package/dist/packages/primitives/icon-button/src/IconButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  277. package/dist/packages/primitives/indicator/src/Indicator.vue.d.ts +2 -2
  278. package/dist/packages/primitives/indicator/src/index.d.ts +1 -1
  279. package/dist/packages/primitives/kbd/src/Kbd.js +7 -0
  280. package/dist/packages/primitives/kbd/src/Kbd.js.map +1 -0
  281. package/dist/packages/primitives/kbd/src/Kbd.vue.d.ts +30 -0
  282. package/dist/packages/primitives/kbd/src/Kbd.vue.d.ts.map +1 -0
  283. package/dist/packages/primitives/kbd/src/Kbd.vue_vue_type_script_setup_true_lang.js +29 -0
  284. package/dist/packages/primitives/kbd/src/Kbd.vue_vue_type_script_setup_true_lang.js.map +1 -0
  285. package/dist/packages/primitives/kbd/src/index.d.ts +3 -0
  286. package/dist/packages/primitives/kbd/src/index.d.ts.map +1 -0
  287. package/dist/packages/primitives/kbd/src/index.js +3 -0
  288. package/dist/packages/primitives/link/src/Link.js.map +1 -1
  289. package/dist/packages/primitives/link/src/Link.vue.d.ts.map +1 -1
  290. package/dist/packages/primitives/link/src/Link.vue_vue_type_script_setup_true_lang.js +3 -3
  291. package/dist/packages/primitives/link/src/Link.vue_vue_type_script_setup_true_lang.js.map +1 -1
  292. package/dist/packages/primitives/list/src/List.js +7 -0
  293. package/dist/packages/primitives/list/src/List.js.map +1 -0
  294. package/dist/packages/primitives/list/src/List.vue.d.ts +22 -0
  295. package/dist/packages/primitives/list/src/List.vue.d.ts.map +1 -0
  296. package/dist/packages/primitives/list/src/List.vue_vue_type_script_setup_true_lang.js +27 -0
  297. package/dist/packages/primitives/list/src/List.vue_vue_type_script_setup_true_lang.js.map +1 -0
  298. package/dist/packages/primitives/list/src/ListItem.js +7 -0
  299. package/dist/packages/primitives/list/src/ListItem.js.map +1 -0
  300. package/dist/packages/primitives/list/src/ListItem.vue.d.ts +75 -0
  301. package/dist/packages/primitives/list/src/ListItem.vue.d.ts.map +1 -0
  302. package/dist/packages/primitives/list/src/ListItem.vue_vue_type_script_setup_true_lang.js +101 -0
  303. package/dist/packages/primitives/list/src/ListItem.vue_vue_type_script_setup_true_lang.js.map +1 -0
  304. package/dist/packages/primitives/list/src/index.d.ts +4 -0
  305. package/dist/packages/primitives/list/src/index.d.ts.map +1 -0
  306. package/dist/packages/primitives/list/src/index.js +3 -0
  307. package/dist/packages/primitives/live-region/src/LiveRegion.js +7 -0
  308. package/dist/packages/primitives/live-region/src/LiveRegion.js.map +1 -0
  309. package/dist/packages/primitives/live-region/src/LiveRegion.vue.d.ts +36 -0
  310. package/dist/packages/primitives/live-region/src/LiveRegion.vue.d.ts.map +1 -0
  311. package/dist/packages/primitives/live-region/src/LiveRegion.vue_vue_type_script_setup_true_lang.js +59 -0
  312. package/dist/packages/primitives/live-region/src/LiveRegion.vue_vue_type_script_setup_true_lang.js.map +1 -0
  313. package/dist/packages/primitives/live-region/src/context.d.ts +40 -0
  314. package/dist/packages/primitives/live-region/src/context.d.ts.map +1 -0
  315. package/dist/packages/primitives/live-region/src/context.js +85 -0
  316. package/dist/packages/primitives/live-region/src/context.js.map +1 -0
  317. package/dist/packages/primitives/live-region/src/index.d.ts +4 -0
  318. package/dist/packages/primitives/live-region/src/index.d.ts.map +1 -0
  319. package/dist/packages/primitives/live-region/src/index.js +3 -0
  320. package/dist/packages/primitives/live-region/src/useAnnounce.d.ts +17 -0
  321. package/dist/packages/primitives/live-region/src/useAnnounce.d.ts.map +1 -0
  322. package/dist/packages/primitives/live-region/src/useAnnounce.js +25 -0
  323. package/dist/packages/primitives/live-region/src/useAnnounce.js.map +1 -0
  324. package/dist/packages/primitives/menubar/src/Menubar.js.map +1 -1
  325. package/dist/packages/primitives/menubar/src/Menubar.vue.d.ts +20 -6
  326. package/dist/packages/primitives/menubar/src/Menubar.vue.d.ts.map +1 -1
  327. package/dist/packages/primitives/menubar/src/Menubar.vue_vue_type_script_setup_true_lang.js +211 -64
  328. package/dist/packages/primitives/menubar/src/Menubar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  329. package/dist/packages/primitives/meter/src/Meter.js +7 -0
  330. package/dist/packages/primitives/meter/src/Meter.js.map +1 -0
  331. package/dist/packages/primitives/meter/src/Meter.vue.d.ts +87 -0
  332. package/dist/packages/primitives/meter/src/Meter.vue_vue_type_script_setup_true_lang.js +236 -0
  333. package/dist/packages/primitives/meter/src/Meter.vue_vue_type_script_setup_true_lang.js.map +1 -0
  334. package/dist/packages/primitives/meter/src/index.d.ts +4 -0
  335. package/dist/packages/primitives/meter/src/index.js +3 -0
  336. package/dist/packages/primitives/navigation-menu/src/NavigationMenu.js +7 -0
  337. package/dist/packages/primitives/navigation-menu/src/NavigationMenu.js.map +1 -0
  338. package/dist/packages/primitives/navigation-menu/src/NavigationMenu.vue.d.ts +69 -0
  339. package/dist/packages/primitives/navigation-menu/src/NavigationMenu.vue.d.ts.map +1 -0
  340. package/dist/packages/primitives/navigation-menu/src/NavigationMenu.vue_vue_type_script_setup_true_lang.js +118 -0
  341. package/dist/packages/primitives/navigation-menu/src/NavigationMenu.vue_vue_type_script_setup_true_lang.js.map +1 -0
  342. package/dist/packages/primitives/navigation-menu/src/index.d.ts +3 -0
  343. package/dist/packages/primitives/navigation-menu/src/index.d.ts.map +1 -0
  344. package/dist/packages/primitives/navigation-menu/src/index.js +2 -0
  345. package/dist/packages/primitives/number-field/src/NumberField.js.map +1 -1
  346. package/dist/packages/primitives/number-field/src/NumberField.vue.d.ts +2 -2
  347. package/dist/packages/primitives/number-field/src/NumberField.vue_vue_type_script_setup_true_lang.js +1 -0
  348. package/dist/packages/primitives/number-field/src/NumberField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  349. package/dist/packages/primitives/number-field/src/index.d.ts +1 -1
  350. package/dist/packages/primitives/otp-input/src/OtpInput.vue.d.ts +2 -2
  351. package/dist/packages/primitives/otp-input/src/index.d.ts +1 -1
  352. package/dist/packages/primitives/pagination/src/Pagination.js.map +1 -1
  353. package/dist/packages/primitives/pagination/src/Pagination.vue.d.ts +3 -3
  354. package/dist/packages/primitives/pagination/src/Pagination.vue_vue_type_script_setup_true_lang.js +1 -1
  355. package/dist/packages/primitives/pagination/src/Pagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
  356. package/dist/packages/primitives/pagination/src/index.d.ts +1 -1
  357. package/dist/packages/primitives/popover/src/Popover.js.map +1 -1
  358. package/dist/packages/primitives/popover/src/Popover.vue.d.ts.map +1 -1
  359. package/dist/packages/primitives/popover/src/Popover.vue_vue_type_script_setup_true_lang.js +1 -1
  360. package/dist/packages/primitives/popover/src/Popover.vue_vue_type_script_setup_true_lang.js.map +1 -1
  361. package/dist/packages/primitives/progress/src/Progress.vue.d.ts +2 -2
  362. package/dist/packages/primitives/progress/src/index.d.ts +1 -1
  363. package/dist/packages/primitives/radial-progress/src/RadialProgress.vue.d.ts +2 -2
  364. package/dist/packages/primitives/radial-progress/src/index.d.ts +1 -1
  365. package/dist/packages/primitives/radio-group/src/RadioGroup.js.map +1 -1
  366. package/dist/packages/primitives/radio-group/src/RadioGroup.vue.d.ts.map +1 -1
  367. package/dist/packages/primitives/radio-group/src/RadioGroup.vue_vue_type_script_setup_true_lang.js +1 -1
  368. package/dist/packages/primitives/radio-group/src/RadioGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  369. package/dist/packages/primitives/rating/src/Rating.vue.d.ts +2 -2
  370. package/dist/packages/primitives/rating/src/index.d.ts +1 -1
  371. package/dist/packages/primitives/segmented-control/src/SegmentedControl.js.map +1 -1
  372. package/dist/packages/primitives/segmented-control/src/SegmentedControl.vue.d.ts.map +1 -1
  373. package/dist/packages/primitives/segmented-control/src/SegmentedControl.vue_vue_type_script_setup_true_lang.js +2 -3
  374. package/dist/packages/primitives/segmented-control/src/SegmentedControl.vue_vue_type_script_setup_true_lang.js.map +1 -1
  375. package/dist/packages/primitives/select/src/Select.js.map +1 -1
  376. package/dist/packages/primitives/select/src/Select.vue.d.ts.map +1 -1
  377. package/dist/packages/primitives/select/src/Select.vue_vue_type_script_setup_true_lang.js +1 -1
  378. package/dist/packages/primitives/select/src/Select.vue_vue_type_script_setup_true_lang.js.map +1 -1
  379. package/dist/packages/primitives/skip-link/src/SkipLink.js +7 -0
  380. package/dist/packages/primitives/skip-link/src/SkipLink.js.map +1 -0
  381. package/dist/packages/primitives/skip-link/src/SkipLink.vue.d.ts +62 -0
  382. package/dist/packages/primitives/skip-link/src/SkipLink.vue_vue_type_script_setup_true_lang.js +64 -0
  383. package/dist/packages/primitives/skip-link/src/SkipLink.vue_vue_type_script_setup_true_lang.js.map +1 -0
  384. package/dist/packages/primitives/skip-link/src/index.d.ts +3 -0
  385. package/dist/packages/primitives/skip-link/src/index.js +3 -0
  386. package/dist/packages/primitives/slider/src/Slider.js.map +1 -1
  387. package/dist/packages/primitives/slider/src/Slider.vue.d.ts +6 -3
  388. package/dist/packages/primitives/slider/src/Slider.vue.d.ts.map +1 -1
  389. package/dist/packages/primitives/slider/src/Slider.vue_vue_type_script_setup_true_lang.js +15 -10
  390. package/dist/packages/primitives/slider/src/Slider.vue_vue_type_script_setup_true_lang.js.map +1 -1
  391. package/dist/packages/primitives/stepper/src/Stepper.js.map +1 -1
  392. package/dist/packages/primitives/stepper/src/Stepper.vue.d.ts +2 -2
  393. package/dist/packages/primitives/stepper/src/Stepper.vue_vue_type_script_setup_true_lang.js +7 -5
  394. package/dist/packages/primitives/stepper/src/Stepper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  395. package/dist/packages/primitives/stepper/src/index.d.ts +1 -1
  396. package/dist/packages/primitives/switch/src/Switch.js.map +1 -1
  397. package/dist/packages/primitives/switch/src/Switch.vue.d.ts +1 -1
  398. package/dist/packages/primitives/switch/src/Switch.vue.d.ts.map +1 -1
  399. package/dist/packages/primitives/switch/src/Switch.vue_vue_type_script_setup_true_lang.js +3 -3
  400. package/dist/packages/primitives/switch/src/Switch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  401. package/dist/packages/primitives/table/src/Table.js +7 -0
  402. package/dist/packages/primitives/table/src/Table.js.map +1 -0
  403. package/dist/packages/primitives/table/src/Table.vue.d.ts +45 -0
  404. package/dist/packages/primitives/table/src/Table.vue_vue_type_script_setup_true_lang.js +72 -0
  405. package/dist/packages/primitives/table/src/Table.vue_vue_type_script_setup_true_lang.js.map +1 -0
  406. package/dist/packages/primitives/table/src/TableCell.js +7 -0
  407. package/dist/packages/primitives/table/src/TableCell.js.map +1 -0
  408. package/dist/packages/primitives/table/src/TableCell.vue.d.ts +19 -0
  409. package/dist/packages/primitives/table/src/TableCell.vue.d.ts.map +1 -0
  410. package/dist/packages/primitives/table/src/TableCell.vue_vue_type_script_setup_true_lang.js +17 -0
  411. package/dist/packages/primitives/table/src/TableCell.vue_vue_type_script_setup_true_lang.js.map +1 -0
  412. package/dist/packages/primitives/table/src/TableHead.js +7 -0
  413. package/dist/packages/primitives/table/src/TableHead.js.map +1 -0
  414. package/dist/packages/primitives/table/src/TableHead.vue.d.ts +56 -0
  415. package/dist/packages/primitives/table/src/TableHead.vue_vue_type_script_setup_true_lang.js +79 -0
  416. package/dist/packages/primitives/table/src/TableHead.vue_vue_type_script_setup_true_lang.js.map +1 -0
  417. package/dist/packages/primitives/table/src/TableRow.js +7 -0
  418. package/dist/packages/primitives/table/src/TableRow.js.map +1 -0
  419. package/dist/packages/primitives/table/src/TableRow.vue.d.ts +39 -0
  420. package/dist/packages/primitives/table/src/TableRow.vue.d.ts.map +1 -0
  421. package/dist/packages/primitives/table/src/TableRow.vue_vue_type_script_setup_true_lang.js +61 -0
  422. package/dist/packages/primitives/table/src/TableRow.vue_vue_type_script_setup_true_lang.js.map +1 -0
  423. package/dist/packages/primitives/table/src/index.d.ts +10 -0
  424. package/dist/packages/primitives/table/src/index.js +8 -0
  425. package/dist/packages/primitives/tabs/src/Tabs.js.map +1 -1
  426. package/dist/packages/primitives/tabs/src/Tabs.vue.d.ts.map +1 -1
  427. package/dist/packages/primitives/tabs/src/Tabs.vue_vue_type_script_setup_true_lang.js +1 -1
  428. package/dist/packages/primitives/tabs/src/Tabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
  429. package/dist/packages/primitives/tags-input/src/TagsInput.js.map +1 -1
  430. package/dist/packages/primitives/tags-input/src/TagsInput.vue.d.ts +2 -2
  431. package/dist/packages/primitives/tags-input/src/TagsInput.vue_vue_type_script_setup_true_lang.js +1 -1
  432. package/dist/packages/primitives/tags-input/src/TagsInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  433. package/dist/packages/primitives/tags-input/src/index.d.ts +1 -1
  434. package/dist/packages/primitives/text-field/src/TextField.js.map +1 -1
  435. package/dist/packages/primitives/text-field/src/TextField.vue.d.ts +2 -2
  436. package/dist/packages/primitives/text-field/src/TextField.vue_vue_type_script_setup_true_lang.js +1 -1
  437. package/dist/packages/primitives/text-field/src/TextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  438. package/dist/packages/primitives/text-field/src/index.d.ts +1 -1
  439. package/dist/packages/primitives/text-field/src/index.js +2 -2
  440. package/dist/packages/primitives/textarea/src/Textarea.js.map +1 -1
  441. package/dist/packages/primitives/textarea/src/Textarea.vue.d.ts +2 -2
  442. package/dist/packages/primitives/textarea/src/Textarea.vue_vue_type_script_setup_true_lang.js +1 -1
  443. package/dist/packages/primitives/textarea/src/Textarea.vue_vue_type_script_setup_true_lang.js.map +1 -1
  444. package/dist/packages/primitives/textarea/src/index.d.ts +1 -1
  445. package/dist/packages/primitives/textarea/src/index.js +2 -2
  446. package/dist/packages/primitives/time-picker/src/TimePicker.js.map +1 -1
  447. package/dist/packages/primitives/time-picker/src/TimePicker.vue.d.ts +2 -2
  448. package/dist/packages/primitives/time-picker/src/TimePicker.vue_vue_type_script_setup_true_lang.js +10 -8
  449. package/dist/packages/primitives/time-picker/src/TimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  450. package/dist/packages/primitives/timeline/src/Timeline.js +7 -0
  451. package/dist/packages/primitives/timeline/src/Timeline.js.map +1 -0
  452. package/dist/packages/primitives/timeline/src/Timeline.vue.d.ts +37 -0
  453. package/dist/packages/primitives/timeline/src/Timeline.vue_vue_type_script_setup_true_lang.js +44 -0
  454. package/dist/packages/primitives/timeline/src/Timeline.vue_vue_type_script_setup_true_lang.js.map +1 -0
  455. package/dist/packages/primitives/timeline/src/TimelineItem.js +7 -0
  456. package/dist/packages/primitives/timeline/src/TimelineItem.js.map +1 -0
  457. package/dist/packages/primitives/timeline/src/TimelineItem.vue.d.ts +50 -0
  458. package/dist/packages/primitives/timeline/src/TimelineItem.vue_vue_type_script_setup_true_lang.js +96 -0
  459. package/dist/packages/primitives/timeline/src/TimelineItem.vue_vue_type_script_setup_true_lang.js.map +1 -0
  460. package/dist/packages/primitives/timeline/src/index.d.ts +5 -0
  461. package/dist/packages/primitives/timeline/src/index.js +5 -0
  462. package/dist/packages/primitives/toast/src/Toast.vue.d.ts +2 -2
  463. package/dist/packages/primitives/toast/src/ToastItem.js.map +1 -1
  464. package/dist/packages/primitives/toast/src/ToastItem.vue.d.ts +2 -2
  465. package/dist/packages/primitives/toast/src/ToastItem.vue_vue_type_script_setup_true_lang.js +5 -3
  466. package/dist/packages/primitives/toast/src/ToastItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  467. package/dist/packages/primitives/toast/src/index.d.ts +1 -1
  468. package/dist/packages/primitives/toggle-group/src/ToggleGroup.js +7 -0
  469. package/dist/packages/primitives/toggle-group/src/ToggleGroup.js.map +1 -0
  470. package/dist/packages/primitives/toggle-group/src/ToggleGroup.vue.d.ts +53 -0
  471. package/dist/packages/primitives/toggle-group/src/ToggleGroup.vue.d.ts.map +1 -0
  472. package/dist/packages/primitives/toggle-group/src/ToggleGroup.vue_vue_type_script_setup_true_lang.js +111 -0
  473. package/dist/packages/primitives/toggle-group/src/ToggleGroup.vue_vue_type_script_setup_true_lang.js.map +1 -0
  474. package/dist/packages/primitives/toggle-group/src/index.d.ts +3 -0
  475. package/dist/packages/primitives/toggle-group/src/index.d.ts.map +1 -0
  476. package/dist/packages/primitives/toggle-group/src/index.js +2 -0
  477. package/dist/packages/primitives/toolbar/src/Toolbar.js +7 -0
  478. package/dist/packages/primitives/toolbar/src/Toolbar.js.map +1 -0
  479. package/dist/packages/primitives/toolbar/src/Toolbar.vue.d.ts +31 -0
  480. package/dist/packages/primitives/toolbar/src/Toolbar.vue.d.ts.map +1 -0
  481. package/dist/packages/primitives/toolbar/src/Toolbar.vue_vue_type_script_setup_true_lang.js +149 -0
  482. package/dist/packages/primitives/toolbar/src/Toolbar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  483. package/dist/packages/primitives/toolbar/src/ToolbarSeparator.js +7 -0
  484. package/dist/packages/primitives/toolbar/src/ToolbarSeparator.js.map +1 -0
  485. package/dist/packages/primitives/toolbar/src/ToolbarSeparator.vue.d.ts +24 -0
  486. package/dist/packages/primitives/toolbar/src/ToolbarSeparator.vue.d.ts.map +1 -0
  487. package/dist/packages/primitives/toolbar/src/ToolbarSeparator.vue_vue_type_script_setup_true_lang.js +40 -0
  488. package/dist/packages/primitives/toolbar/src/ToolbarSeparator.vue_vue_type_script_setup_true_lang.js.map +1 -0
  489. package/dist/packages/primitives/toolbar/src/index.d.ts +4 -0
  490. package/dist/packages/primitives/toolbar/src/index.d.ts.map +1 -0
  491. package/dist/packages/primitives/toolbar/src/index.js +3 -0
  492. package/dist/packages/primitives/tooltip/src/Tooltip.js.map +1 -1
  493. package/dist/packages/primitives/tooltip/src/Tooltip.vue.d.ts.map +1 -1
  494. package/dist/packages/primitives/tooltip/src/Tooltip.vue_vue_type_script_setup_true_lang.js +1 -1
  495. package/dist/packages/primitives/tooltip/src/Tooltip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  496. package/dist/packages/primitives/tree-view/src/TreeView.js +7 -0
  497. package/dist/packages/primitives/tree-view/src/TreeView.js.map +1 -0
  498. package/dist/packages/primitives/tree-view/src/TreeView.vue.d.ts +99 -0
  499. package/dist/packages/primitives/tree-view/src/TreeView.vue_vue_type_script_setup_true_lang.js +310 -0
  500. package/dist/packages/primitives/tree-view/src/TreeView.vue_vue_type_script_setup_true_lang.js.map +1 -0
  501. package/dist/packages/primitives/tree-view/src/TreeViewNode.js +7 -0
  502. package/dist/packages/primitives/tree-view/src/TreeViewNode.js.map +1 -0
  503. package/dist/packages/primitives/tree-view/src/TreeViewNode.vue.d.ts +15 -0
  504. package/dist/packages/primitives/tree-view/src/TreeViewNode.vue.d.ts.map +1 -0
  505. package/dist/packages/primitives/tree-view/src/TreeViewNode.vue_vue_type_script_setup_true_lang.js +103 -0
  506. package/dist/packages/primitives/tree-view/src/TreeViewNode.vue_vue_type_script_setup_true_lang.js.map +1 -0
  507. package/dist/packages/primitives/tree-view/src/context.d.ts +39 -0
  508. package/dist/packages/primitives/tree-view/src/context.d.ts.map +1 -0
  509. package/dist/packages/primitives/tree-view/src/context.js +6 -0
  510. package/dist/packages/primitives/tree-view/src/context.js.map +1 -0
  511. package/dist/packages/primitives/tree-view/src/index.d.ts +4 -0
  512. package/dist/packages/primitives/tree-view/src/index.js +3 -0
  513. package/dist/packages/primitives/visually-hidden/src/VisuallyHidden.js +7 -0
  514. package/dist/packages/primitives/visually-hidden/src/VisuallyHidden.js.map +1 -0
  515. package/dist/packages/primitives/visually-hidden/src/VisuallyHidden.vue.d.ts +21 -0
  516. package/dist/packages/primitives/visually-hidden/src/VisuallyHidden.vue.d.ts.map +1 -0
  517. package/dist/packages/primitives/visually-hidden/src/VisuallyHidden.vue_vue_type_script_setup_true_lang.js +27 -0
  518. package/dist/packages/primitives/visually-hidden/src/VisuallyHidden.vue_vue_type_script_setup_true_lang.js.map +1 -0
  519. package/dist/packages/primitives/visually-hidden/src/index.d.ts +3 -0
  520. package/dist/packages/primitives/visually-hidden/src/index.d.ts.map +1 -0
  521. package/dist/packages/primitives/visually-hidden/src/index.js +2 -0
  522. package/dist/packages/primitives/window-controls/src/WindowControls.vue.d.ts +2 -2
  523. package/dist/packages/primitives/window-controls/src/index.d.ts +1 -1
  524. package/dist/styles/global.css +59 -0
  525. package/dist/styles/theme.css +13 -0
  526. package/dist/theme.js +3 -0
  527. package/package.json +37 -30
  528. package/dist/packages/blocks/desktop-app-shell/src/DesktopAppShell.vue.d.ts.map +0 -1
  529. package/dist/packages/blocks/title-bar/src/TitleBar.vue.d.ts.map +0 -1
  530. package/dist/packages/blocks/toast-stack/src/ToastStack.vue.d.ts.map +0 -1
  531. package/dist/packages/composition/scroll-reel/src/ScrollReel.vue.d.ts.map +0 -1
  532. package/dist/packages/composition/scroll-reel/src/index.d.ts.map +0 -1
  533. package/dist/packages/loom/src/a11y.d.ts.map +0 -1
  534. package/dist/packages/loom/src/index.d.ts.map +0 -1
  535. package/dist/packages/primitives/alert-dialog/src/AlertDialog.vue.d.ts.map +0 -1
  536. package/dist/packages/primitives/alert-dialog/src/index.d.ts.map +0 -1
  537. package/dist/packages/primitives/avatar-group/src/AvatarGroup.vue.d.ts.map +0 -1
  538. package/dist/packages/primitives/avatar-group/src/index.d.ts.map +0 -1
  539. package/dist/packages/primitives/breadcrumb/src/Breadcrumb.vue.d.ts.map +0 -1
  540. package/dist/packages/primitives/breadcrumb/src/index.d.ts.map +0 -1
  541. package/dist/packages/primitives/color-picker/src/ColorPicker.vue.d.ts.map +0 -1
  542. package/dist/packages/primitives/color-picker/src/index.d.ts.map +0 -1
  543. package/dist/packages/primitives/combobox/src/Combobox.vue.d.ts.map +0 -1
  544. package/dist/packages/primitives/combobox/src/index.d.ts.map +0 -1
  545. package/dist/packages/primitives/date-picker/src/DatePicker.vue.d.ts.map +0 -1
  546. package/dist/packages/primitives/date-range-picker/src/DateRangePicker.vue.d.ts.map +0 -1
  547. package/dist/packages/primitives/date-range-picker/src/index.d.ts.map +0 -1
  548. package/dist/packages/primitives/date-time-picker/src/DateTimePicker.vue.d.ts.map +0 -1
  549. package/dist/packages/primitives/date-time-range-picker/src/DateTimeRangePicker.vue.d.ts.map +0 -1
  550. package/dist/packages/primitives/date-time-range-picker/src/index.d.ts.map +0 -1
  551. package/dist/packages/primitives/dialog/src/Dialog.vue.d.ts.map +0 -1
  552. package/dist/packages/primitives/dialog/src/index.d.ts.map +0 -1
  553. package/dist/packages/primitives/drawer/src/Drawer.vue.d.ts.map +0 -1
  554. package/dist/packages/primitives/drawer/src/index.d.ts.map +0 -1
  555. package/dist/packages/primitives/editable/src/Editable.vue.d.ts.map +0 -1
  556. package/dist/packages/primitives/editable/src/index.d.ts.map +0 -1
  557. package/dist/packages/primitives/file-upload/src/FileUpload.vue.d.ts.map +0 -1
  558. package/dist/packages/primitives/file-upload/src/index.d.ts.map +0 -1
  559. package/dist/packages/primitives/indicator/src/Indicator.vue.d.ts.map +0 -1
  560. package/dist/packages/primitives/indicator/src/index.d.ts.map +0 -1
  561. package/dist/packages/primitives/number-field/src/NumberField.vue.d.ts.map +0 -1
  562. package/dist/packages/primitives/number-field/src/index.d.ts.map +0 -1
  563. package/dist/packages/primitives/otp-input/src/OtpInput.vue.d.ts.map +0 -1
  564. package/dist/packages/primitives/otp-input/src/index.d.ts.map +0 -1
  565. package/dist/packages/primitives/pagination/src/Pagination.vue.d.ts.map +0 -1
  566. package/dist/packages/primitives/pagination/src/index.d.ts.map +0 -1
  567. package/dist/packages/primitives/progress/src/Progress.vue.d.ts.map +0 -1
  568. package/dist/packages/primitives/progress/src/index.d.ts.map +0 -1
  569. package/dist/packages/primitives/radial-progress/src/RadialProgress.vue.d.ts.map +0 -1
  570. package/dist/packages/primitives/radial-progress/src/index.d.ts.map +0 -1
  571. package/dist/packages/primitives/rating/src/Rating.vue.d.ts.map +0 -1
  572. package/dist/packages/primitives/rating/src/index.d.ts.map +0 -1
  573. package/dist/packages/primitives/stepper/src/Stepper.vue.d.ts.map +0 -1
  574. package/dist/packages/primitives/stepper/src/index.d.ts.map +0 -1
  575. package/dist/packages/primitives/tags-input/src/TagsInput.vue.d.ts.map +0 -1
  576. package/dist/packages/primitives/tags-input/src/index.d.ts.map +0 -1
  577. package/dist/packages/primitives/text-field/src/TextField.vue.d.ts.map +0 -1
  578. package/dist/packages/primitives/text-field/src/index.d.ts.map +0 -1
  579. package/dist/packages/primitives/textarea/src/Textarea.vue.d.ts.map +0 -1
  580. package/dist/packages/primitives/textarea/src/index.d.ts.map +0 -1
  581. package/dist/packages/primitives/time-picker/src/TimePicker.vue.d.ts.map +0 -1
  582. package/dist/packages/primitives/toast/src/Toast.vue.d.ts.map +0 -1
  583. package/dist/packages/primitives/toast/src/ToastItem.vue.d.ts.map +0 -1
  584. package/dist/packages/primitives/toast/src/index.d.ts.map +0 -1
  585. package/dist/packages/primitives/window-controls/src/WindowControls.vue.d.ts.map +0 -1
  586. package/dist/packages/primitives/window-controls/src/index.d.ts.map +0 -1
  587. package/dist/styles/theme.contrast.test.ts +0 -460
@@ -1 +1 @@
1
- {"version":3,"file":"ToastItem.vue_vue_type_script_setup_true_lang.js","names":["$emit"],"sources":["../../../../../packages/primitives/toast/src/ToastItem.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { ToastLabels } from \"@ecoma-io/loom-labels\";\n\n/**\n\n/**\n * Loom's English, co-located with the component so it tree-shakes with it, and\n * exported so a host can build a partial vocabulary against the real thing.\n */\nexport const TOAST_LABELS: ToastLabels = {\n close: \"Close\",\n announce: \"Notification\",\n region: ({ hotkey }) => `Notifications (${hotkey})`,\n};\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { ToastRoot, ToastTitle, ToastDescription, ToastAction, ToastClose } from \"reka-ui\";\nimport { useLabels, type LabelOverrides } from \"@ecoma-io/loom-labels\";\nimport { Info, CircleCheck, TriangleAlert, CircleX, Sparkles, X } from \"@lucide/vue\";\nimport { cn } from \"@ecoma-io/loom-core\";\nimport { optional } from \"@ecoma-io/loom-core\";\nimport type { ToastVariant } from \"./Toast.vue\";\n\n/**\n * ToastItem — one toast card (ToastRoot + Loom treatment), INTERNAL to\n * the design system. It must live inside a `ToastProvider` whose\n * `ToastViewport` it teleports into: `Toast` bundles that pair for the\n * standalone case. Not exported from the barrel — hosts use `Toast`.\n */\nconst props = withDefaults(\n defineProps<{\n /** Controls visibility; pair with `v-model:open`. Omit to let the toast own its own open state. */\n open?: boolean | undefined;\n /** The toast's headline — always shown. */\n title: string;\n /** An optional second line of detail below the title. */\n description?: string;\n /** Selects the accent icon and colour. */\n variant?: ToastVariant;\n /** ms before auto-dismiss; the Reka default pauses on hover/focus. */\n duration?: number;\n /** Shows the ✕ close button. */\n closable?: boolean;\n /** Renders a single inline action button; emits `action` when pressed. */\n actionLabel?: string;\n /** Names for what the card says on its own account, as any subset of `ToastLabels`. */\n labels?: LabelOverrides<ToastLabels>;\n }>(),\n {\n // See Toast.vue: `undefined` is the uncontrolled state, and only an\n // explicit default keeps it reachable past Vue's Boolean casting.\n open: undefined,\n variant: \"info\",\n duration: 5000,\n closable: true,\n },\n);\n\ndefineEmits<{ \"update:open\": [value: boolean]; action: [] }>();\n\n// `text`, not `labels`: the prop of that name is one of the three sources this\n// resolves, and a template reading the raw prop would be reading the overrides\n// rather than the answer.\nconst text = useLabels(\"toast\", TOAST_LABELS, () => props.labels);\n\n// `satisfies` binds this map to ToastVariant so a variant added to the type\n// without a matching entry here fails at compile time (Button's own idiom).\nconst toastAccents = {\n info: { icon: Info, color: \"text-info-text\" },\n success: { icon: CircleCheck, color: \"text-success-text\" },\n warning: { icon: TriangleAlert, color: \"text-warning\" },\n destructive: { icon: CircleX, color: \"text-destructive-text\" },\n accent: { icon: Sparkles, color: \"text-primary-text\" },\n} satisfies Record<ToastVariant, { icon: typeof Info; color: string }>;\n\nconst accent = computed(() => toastAccents[props.variant]);\n</script>\n\n<template>\n <!-- The slide-in animation rides this inner card, never ToastRoot: Reka\n drives ToastRoot's own transform for the swipe-to-dismiss gesture, so a\n filled entrance transform there would freeze the swipe. ToastRoot itself\n carries no animation, so Reka Presence unmounts it immediately on close. -->\n <ToastRoot\n v-bind=\"optional({ open })\"\n :duration=\"duration\"\n class=\"outline-none\"\n @update:open=\"$emit('update:open', $event)\"\n >\n <div\n :class=\"\n cn(\n 'relative flex animate-toast-in items-start gap-3 rounded-md border border-border bg-popover p-3 pr-8 text-popover-foreground shadow-lg',\n // Accent variant: a highlighted border to draw attention to the\n // toast's distinctiveness from the standard variants.\n variant === 'accent' && 'border-primary/40',\n )\n \"\n >\n <component\n :is=\"accent.icon\"\n :class=\"cn('mt-0.5 h-4 w-4 shrink-0', accent.color)\"\n aria-hidden=\"true\"\n />\n <div class=\"min-w-0 flex-1\">\n <ToastTitle class=\"text-sm font-medium\">{{ title }}</ToastTitle>\n <ToastDescription v-if=\"description\" class=\"mt-0.5 text-xs text-muted-foreground\">\n {{ description }}\n </ToastDescription>\n </div>\n\n <ToastAction v-if=\"actionLabel\" :alt-text=\"actionLabel\" as-child @click=\"$emit('action')\">\n <button\n type=\"button\"\n class=\"shrink-0 rounded-sm px-2 py-1 text-xs font-medium text-primary-text transition-colors duration-fast ease-out hover:bg-subtle focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring\"\n >\n {{ actionLabel }}\n </button>\n </ToastAction>\n\n <ToastClose\n v-if=\"closable\"\n :aria-label=\"text.close\"\n class=\"absolute right-2 top-2 inline-flex h-6 w-6 items-center justify-center rounded-sm text-muted-foreground transition-colors duration-fast ease-out hover:bg-subtle hover:text-foreground focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring\"\n >\n <X class=\"h-3.5 w-3.5\" />\n </ToastClose>\n </div>\n </ToastRoot>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AASA,IAAa,eAA4B;CACvC,OAAO;CACP,UAAU;CACV,SAAS,EAAE,aAAa,kBAAkB,OAAO;AACnD;;;;;;;;;;;;;;;;;;;;;EAkBA,MAAM,QAAQ;EAkCd,MAAM,OAAO,UAAU,SAAS,oBAAoB,MAAM,MAAM;EAIhE,MAAM,eAAe;GACnB,MAAM;IAAE,MAAM;IAAM,OAAO;GAAiB;GAC5C,SAAS;IAAE,MAAM;IAAa,OAAO;GAAoB;GACzD,SAAS;IAAE,MAAM;IAAe,OAAO;GAAe;GACtD,aAAa;IAAE,MAAM;IAAS,OAAO;GAAwB;GAC7D,QAAQ;IAAE,MAAM;IAAU,OAAO;GAAoB;EACvD;EAEA,MAAM,SAAS,eAAe,aAAa,MAAM,QAAQ;;GAQvD,OAAA,UAAA,GAAA,YA6CY,MAAA,SAAA,GA7CZ,WACU,MA4CE,QAAA,CA5CM,CAAA,EAAA,MAAG,QAAA,KAAI,CAAA,GAAA;IACtB,UAAU,QAAA;IACX,OAAM;IACL,iBAAW,OAAA,OAAA,OAAA,MAAA,WAAEA,KAAAA,MAAK,eAAgB,MAAM;;IAEzC,SAAA,cAsCM,CAtCN,mBAsCM,OAAA,EArCH,OAAK,eAAW,MAAA,EAAA,CAAE,CAAA,0IAA4S,QAAA,YAAO,YAAA,mBAAA,CAAA,EAAA,GAAA;MAStU,UAAA,GAAA,YAIE,wBAHK,OAAA,MAAO,IAAI,GAAA;MACf,OAAK,eAAE,MAAA,EAAA,CAAE,CAAA,2BAA4B,OAAA,MAAO,KAAK,CAAA;MAClD,eAAY;;KAEd,mBAKM,OALN,YAKM,CAJJ,YAAgE,MAAA,UAAA,GAAA,EAApD,OAAM,sBAAqB,GAAA;MAAC,SAAA,cAAW,CAAR,gBAAA,gBAAA,QAAA,KAAK,GAAA,CAAA,CAAA,CAAA;;KACxB,CAAA,GAAA,QAAA,eAAxB,UAAA,GAAA,YAEmB,MAAA,gBAAA,GAAA;;MAFkB,OAAM;;MACzC,SAAA,cAAiB,CAAd,gBAAA,gBAAA,QAAA,WAAW,GAAA,CAAA,CAAA,CAAA;;;KAIC,QAAA,eAAnB,UAAA,GAAA,YAOc,MAAA,WAAA,GAAA;;MAPmB,YAAU,QAAA;MAAa,YAAA;MAAU,SAAK,OAAA,OAAA,OAAA,MAAA,WAAEA,KAAAA,MAAK,QAAA;;MAC5E,SAAA,cAKS,CALT,mBAKS,UALT,YAKS,gBADJ,QAAA,WAAW,GAAA,CAAA,CAAA,CAAA;;;KAKV,QAAA,YADR,UAAA,GAAA,YAMa,MAAA,UAAA,GAAA;;MAJV,cAAY,MAAA,IAAA,CAAI,CAAC;MAClB,OAAM;;MAEN,SAAA,cAAyB,CAAzB,YAAyB,MAAA,CAAA,GAAA,EAAtB,OAAM,cAAa,CAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"ToastItem.vue_vue_type_script_setup_true_lang.js","names":["$emit"],"sources":["../../../../../packages/primitives/toast/src/ToastItem.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { ToastLabels } from \"@ecoma-io/loom-labels\";\n\n/**\n\n/**\n * Loom's English, co-located with the component so it tree-shakes with it, and\n * exported so a host can build a partial vocabulary against the real thing.\n */\nexport const TOAST_LABELS: ToastLabels = {\n close: \"Close\",\n announce: \"Notification\",\n region: ({ hotkey }) => `Notifications (${hotkey})`,\n};\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { ToastRoot, ToastTitle, ToastDescription, ToastAction, ToastClose } from \"reka-ui\";\nimport { useLabels, type LabelOverrides } from \"@ecoma-io/loom-labels\";\nimport { Info, CircleCheck, TriangleAlert, CircleX, Sparkles, X } from \"@lucide/vue\";\nimport { cn } from \"@ecoma-io/loom-core\";\nimport { optional } from \"@ecoma-io/loom-core\";\nimport type { ToastVariant } from \"./Toast.vue\";\n\n/**\n * ToastItem — one toast card (ToastRoot + Loom treatment), INTERNAL to\n * the design system. It must live inside a `ToastProvider` whose\n * `ToastViewport` it teleports into: `Toast` bundles that pair for the\n * standalone case. Not exported from the barrel — hosts use `Toast`.\n */\nconst props = withDefaults(\n defineProps<{\n /** Controls visibility; pair with `v-model:open`. Omit to let the toast own its own open state. */\n open?: boolean | undefined;\n /** The toast's headline — always shown. */\n title: string;\n /** An optional second line of detail below the title. */\n description?: string;\n /** Selects the accent icon and colour. */\n variant?: ToastVariant;\n /** ms before auto-dismiss; the Reka default pauses on hover/focus. */\n duration?: number;\n /** Shows the ✕ close button. */\n closable?: boolean;\n /** Renders a single inline action button; emits `action` when pressed. */\n actionLabel?: string;\n /** Names for what the card says on its own account, as any subset of `ToastLabels`. */\n labels?: LabelOverrides<ToastLabels>;\n }>(),\n {\n // See Toast.vue: `undefined` is the uncontrolled state, and only an\n // explicit default keeps it reachable past Vue's Boolean casting.\n open: undefined,\n variant: \"info\",\n duration: 5000,\n closable: true,\n },\n);\n\ndefineEmits<{ \"update:open\": [value: boolean]; action: [] }>();\n\n// `text`, not `labels`: the prop of that name is one of the three sources this\n// resolves, and a template reading the raw prop would be reading the overrides\n// rather than the answer.\nconst text = useLabels(\"toast\", TOAST_LABELS, () => props.labels);\n\n// `satisfies` binds this map to ToastVariant so a variant added to the type\n// without a matching entry here fails at compile time (Button's own idiom).\nconst toastAccents = {\n info: { icon: Info, color: \"text-info-text\" },\n success: { icon: CircleCheck, color: \"text-success-text\" },\n // `-text` like its four siblings. The bare `warning` hue is a fill colour —\n // as text it fails on the dark theme, and the functional `-text` tokens are\n // the ones measured legible on every surface (theme.css carries the ratios).\n warning: { icon: TriangleAlert, color: \"text-warning-text\" },\n destructive: { icon: CircleX, color: \"text-destructive-text\" },\n accent: { icon: Sparkles, color: \"text-primary-text\" },\n} satisfies Record<ToastVariant, { icon: typeof Info; color: string }>;\n\nconst accent = computed(() => toastAccents[props.variant]);\n\n// Severity alone decides how the toast interrupts (issue #91): a destructive\n// report announced politely can be swallowed by whatever the screen reader is\n// already saying — exactly the messages that must not be missed. The knob is\n// Reka's own `type`: it hard-wires the hidden announce region's `role` to\n// `alert` and picks that region's politeness from this prop — `foreground`\n// announces `aria-live=\"assertive\"`, `background` politely. Destructive\n// routes foreground; every other severity stays polite, so an ordinary\n// notification never interrupts. Deliberately no prop of Loom's own: the\n// variant the card already carries *is* the severity, and a second way to set\n// it would only let the two disagree.\nconst announceType = computed<\"foreground\" | \"background\">(() =>\n props.variant === \"destructive\" ? \"foreground\" : \"background\",\n);\n</script>\n\n<template>\n <!-- Entrance and exit deliberately do not share an element, and the split is\n forced by Reka rather than taste. The swipe gesture marks ToastRoot\n itself (data-swipe plus --reka-toast-swipe-* custom properties), so the\n root's transform stays reserved and the entrance rides the inner card.\n The exit cannot ride along: Presence decides an element's fate by\n reading the computed animation-name of the node it mounted — never a\n descendant's and by waiting for an animationend whose target is that\n same node (usePresence.js). A toast-out confined to the inner card would\n leave the root's own name `none` and be unmounted before its first\n frame; on ToastRoot it genuinely plays. -->\n <ToastRoot\n v-bind=\"optional({ open })\"\n :type=\"announceType\"\n :duration=\"duration\"\n class=\"outline-none data-[state=closed]:animate-toast-out\"\n @update:open=\"$emit('update:open', $event)\"\n >\n <div\n :class=\"\n cn(\n 'relative flex animate-toast-in items-start gap-3 rounded-md border border-border bg-popover p-3 pr-8 text-popover-foreground shadow-lg',\n // Accent variant: a highlighted border to draw attention to the\n // toast's distinctiveness from the standard variants.\n variant === 'accent' && 'border-primary/40',\n )\n \"\n >\n <component\n :is=\"accent.icon\"\n :class=\"cn('mt-0.5 h-4 w-4 shrink-0', accent.color)\"\n aria-hidden=\"true\"\n />\n <div class=\"min-w-0 flex-1\">\n <ToastTitle class=\"text-sm font-medium\">{{ title }}</ToastTitle>\n <ToastDescription v-if=\"description\" class=\"mt-0.5 text-xs text-muted-foreground\">\n {{ description }}\n </ToastDescription>\n </div>\n\n <ToastAction v-if=\"actionLabel\" :alt-text=\"actionLabel\" as-child @click=\"$emit('action')\">\n <button\n type=\"button\"\n class=\"shrink-0 rounded-sm px-2 py-1 text-xs font-medium text-primary-text transition-colors duration-fast ease-out hover:bg-subtle focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring\"\n >\n {{ actionLabel }}\n </button>\n </ToastAction>\n\n <ToastClose\n v-if=\"closable\"\n :aria-label=\"text.close\"\n class=\"absolute right-2 top-2 inline-flex h-6 w-6 items-center justify-center rounded-sm text-muted-foreground transition-colors duration-fast ease-out hover:bg-subtle hover:text-foreground focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring\"\n >\n <X class=\"h-3.5 w-3.5\" />\n </ToastClose>\n </div>\n </ToastRoot>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AASA,IAAa,eAA4B;CACvC,OAAO;CACP,UAAU;CACV,SAAS,EAAE,aAAa,kBAAkB,OAAO;AACnD;;;;;;;;;;;;;;;;;;;;;EAkBA,MAAM,QAAQ;EAkCd,MAAM,OAAO,UAAU,SAAS,oBAAoB,MAAM,MAAM;EAIhE,MAAM,eAAe;GACnB,MAAM;IAAE,MAAM;IAAM,OAAO;GAAiB;GAC5C,SAAS;IAAE,MAAM;IAAa,OAAO;GAAoB;GAIzD,SAAS;IAAE,MAAM;IAAe,OAAO;GAAoB;GAC3D,aAAa;IAAE,MAAM;IAAS,OAAO;GAAwB;GAC7D,QAAQ;IAAE,MAAM;IAAU,OAAO;GAAoB;EACvD;EAEA,MAAM,SAAS,eAAe,aAAa,MAAM,QAAQ;EAYzD,MAAM,eAAe,eACnB,MAAM,YAAY,gBAAgB,eAAe,YACnD;;GAcE,OAAA,UAAA,GAAA,YA8CY,MAAA,SAAA,GA9CZ,WACU,MA6CE,QAAA,CA7CM,CAAA,EAAA,MAAG,QAAA,KAAI,CAAA,GAAA;IACtB,MAAM,aAAA;IACN,UAAU,QAAA;IACX,OAAM;IACL,iBAAW,OAAA,OAAA,OAAA,MAAA,WAAEA,KAAAA,MAAK,eAAgB,MAAM;;IAEzC,SAAA,cAsCM,CAtCN,mBAsCM,OAAA,EArCH,OAAK,eAAW,MAAA,EAAA,CAAE,CAAA,0IAA4S,QAAA,YAAO,YAAA,mBAAA,CAAA,EAAA,GAAA;MAStU,UAAA,GAAA,YAIE,wBAHK,OAAA,MAAO,IAAI,GAAA;MACf,OAAK,eAAE,MAAA,EAAA,CAAE,CAAA,2BAA4B,OAAA,MAAO,KAAK,CAAA;MAClD,eAAY;;KAEd,mBAKM,OALN,YAKM,CAJJ,YAAgE,MAAA,UAAA,GAAA,EAApD,OAAM,sBAAqB,GAAA;MAAC,SAAA,cAAW,CAAR,gBAAA,gBAAA,QAAA,KAAK,GAAA,CAAA,CAAA,CAAA;;KACxB,CAAA,GAAA,QAAA,eAAxB,UAAA,GAAA,YAEmB,MAAA,gBAAA,GAAA;;MAFkB,OAAM;;MACzC,SAAA,cAAiB,CAAd,gBAAA,gBAAA,QAAA,WAAW,GAAA,CAAA,CAAA,CAAA;;;KAIC,QAAA,eAAnB,UAAA,GAAA,YAOc,MAAA,WAAA,GAAA;;MAPmB,YAAU,QAAA;MAAa,YAAA;MAAU,SAAK,OAAA,OAAA,OAAA,MAAA,WAAEA,KAAAA,MAAK,QAAA;;MAC5E,SAAA,cAKS,CALT,mBAKS,UALT,YAKS,gBADJ,QAAA,WAAW,GAAA,CAAA,CAAA,CAAA;;;KAKV,QAAA,YADR,UAAA,GAAA,YAMa,MAAA,UAAA,GAAA;;MAJV,cAAY,MAAA,IAAA,CAAI,CAAC;MAClB,OAAM;;MAEN,SAAA,cAAyB,CAAzB,YAAyB,MAAA,CAAA,GAAA,EAAtB,OAAM,cAAa,CAAA,CAAA,CAAA"}
@@ -2,5 +2,5 @@ export { default, TOAST_LABELS } from "./Toast.vue";
2
2
  export { default as Toast } from "./Toast.vue";
3
3
  export type { ToastVariant } from "./Toast.vue";
4
4
  export { default as ToastItem } from "./ToastItem.vue";
5
- export type { ToastLabels } from "@ecoma-io/loom-labels";
5
+ export type { ToastLabels } from "../../../labels/src/index";
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,7 @@
1
+ import ToggleGroup_vue_vue_type_script_setup_true_lang_default from "./ToggleGroup.vue_vue_type_script_setup_true_lang.js";
2
+ //#region packages/primitives/toggle-group/src/ToggleGroup.vue
3
+ var ToggleGroup_default = ToggleGroup_vue_vue_type_script_setup_true_lang_default;
4
+ //#endregion
5
+ export { ToggleGroup_default as default };
6
+
7
+ //# sourceMappingURL=ToggleGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToggleGroup.js","names":[],"sources":["../../../../../packages/primitives/toggle-group/src/ToggleGroup.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { Component } from \"vue\";\n\n/** One toggle inside a {@link ToggleGroup}. */\nexport interface ToggleGroupItem {\n /** Matched against `modelValue`. */\n value: string;\n /** Visible label, rendered inside the button. */\n label: string;\n /** Optional glyph rendered before the label; hidden from the tree, the label is the name. */\n icon?: Component;\n /** Disables this button alone, leaving its neighbours toggleable. */\n disabled?: boolean;\n /** Forwarded to the button's DOM node — lets hosts keep stable test hooks. */\n testId?: string;\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, useTemplateRef } from \"vue\";\nimport { ToggleGroupRoot, ToggleGroupItem as RekaToggleGroupItem } from \"reka-ui\";\nimport type { AcceptableValue } from \"reka-ui\";\nimport { useAncestorDisabled, useFieldControl } from \"@ecoma-io/loom-labels\";\nimport { cn, optional, useSplitAttrs } from \"@ecoma-io/loom-core\";\n\n/**\n * ToggleGroup — a set of toggle actions or filters whose pressed state is the\n * value: bold/italic/underline, column filters, metric toggles. Each item is\n * a real `<button aria-pressed>` — deliberately **not** `aria-checked`/radio\n * semantics, which is the whole distinction from\n * [SegmentedControl](../../segmented-control): a segmented control is a value\n * picker where one option is always active, while here zero-or-more buttons\n * can be on at once and the group's `type` says which contract the model\n * follows — `\"single\"` holds one value or `null`, `\"multiple\"` a `string[]`.\n * Built on Reka UI's ToggleGroup: the group is one Tab stop (roving\n * tabindex), Arrow keys move focus between buttons skipping disabled ones —\n * they move *focus only* and never flip a toggle, unlike a radio group where\n * the arrows change the value. Styled with Loom tokens; a pressed button\n * fills with the primary token and takes weight, so the state is carried by\n * `aria-pressed` plus fill plus weight — never colour alone.\n *\n * Inside a [Field](../Field/Field.vue) the row's description, `required` and\n * `invalid` reach the group through `useFieldControl()`, and a\n * `<Fieldset disabled>` above it disables every button.\n *\n * **A row's label does not name this group.** `<label for>` names a labelable\n * element and this renders a `div[role=\"group\"]`, so the row's label resolves\n * to the element and names nobody. Name it with a\n * [Fieldset](../Fieldset/Fieldset.vue)'s real `<legend>`, or with an\n * `aria-label`/`aria-labelledby` of its own — which is what every example\n * already does, because the component carries no label text of its own and\n * therefore no labels prop: the item labels are the caller's content.\n *\n * There is no `readonly`: a toggle that displays a state but cannot change it\n * is a disabled one showing an answer, so a row's `readonly` arrives as\n * nothing at all rather than as that disguise.\n */\nconst props = withDefaults(\n defineProps<{\n /** The pressed value (`\"single\"`), the pressed values (`\"multiple\"`), or nothing pressed. */\n modelValue?: string | string[] | null;\n /** The buttons to render, in order. */\n items: ToggleGroupItem[];\n /** `\"single\"` models one value or `null`; `\"multiple\"` a `string[]`. */\n type?: \"single\" | \"multiple\";\n /** The track's resting look; a pressed button fills with the primary token in every variant. */\n variant?: \"secondary\" | \"outline\" | \"ghost\";\n /** `\"sm\"` is the compressed form for dense chrome — e.g. an editor toolbar. */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Disables every button at once, distinct from a single item's own `disabled`. Unset defers to a wrapping Field. */\n disabled?: boolean | undefined;\n }>(),\n {\n // Not `false`: absent has to stay tellable from `false` for a Field above\n // to disable the group and for `:disabled=\"false\"` to overrule one that\n // does. Vue casts an absent Boolean prop with no declared default to\n // `false`, which would leave the context wired and inert.\n disabled: undefined,\n type: \"single\",\n variant: \"secondary\",\n size: \"md\",\n },\n);\n\nconst emit = defineEmits<{ \"update:modelValue\": [value: string | null | string[]] }>();\n\ndefineOptions({ inheritAttrs: false });\nconst { attrs, rest: groupAttrs } = useSplitAttrs();\n\n/**\n * The buttons are real `<button>`s, so a `<fieldset disabled>` above this\n * group already makes each of them inert — but Reka's roving focus is what\n * decides where Tab lands, and it is driven by the group's own `disabled`,\n * which the fieldset never reaches. Its own `disabled` prop sets that to\n * `-1`, exactly as SegmentedControl does.\n *\n * Read off the DOM rather than taken from the Field context, which publishes\n * no `disabled` on purpose — see `../../lib/ancestor-disabled.ts`.\n */\nconst root = useTemplateRef<{ $el?: Element }>(\"root\");\nconst groupDisabled = useAncestorDisabled(() => root.value?.$el);\n\nconst field = useFieldControl(() => ({\n id: attrs.id as string | undefined,\n describedBy: attrs[\"aria-describedby\"] as string | undefined,\n // The fieldset beats the prop in both directions, exactly as it does for\n // the buttons themselves.\n disabled: groupDisabled.value ? true : props.disabled,\n}));\n\n/**\n * Reka's own model is `AcceptableValue` for `\"single\"` and `AcceptableValue[]`\n * for `\"multiple\"`, and its typing has no `undefined` rung under\n * `exactOptionalPropertyTypes`. The seam's contract adds `null` for \"nothing\n * pressed\" and keeps a `null`/absent model from reaching Reka as a stray\n * non-string: a single group with nothing pressed shows Reka `\"\"`, which is\n * no item's value — and `data-state=\"off\"` on every button — in both engines.\n */\nconst rootValue = computed<string | string[]>(() => {\n if (props.type === \"multiple\") {\n return Array.isArray(props.modelValue) ? props.modelValue : [];\n }\n return typeof props.modelValue === \"string\" ? props.modelValue : \"\";\n});\n\nfunction onUpdate(value: AcceptableValue | AcceptableValue[]) {\n if (props.type === \"multiple\") {\n // Every item's value is a caller-provided `string`, so the array Reka\n // hands back can only hold those strings.\n emit(\"update:modelValue\", Array.isArray(value) ? (value as string[]) : []);\n } else {\n // Reka hands back `undefined` when the pressed button is pressed again —\n // the seam publishes that as `null`, the model's spelling of \"nothing\".\n emit(\"update:modelValue\", typeof value === \"string\" && value !== \"\" ? value : null);\n }\n}\n\nconst iconClass = computed(() => (props.size === \"sm\" ? \"size-3.5\" : \"size-4\"));\n</script>\n\n<template>\n <ToggleGroupRoot\n ref=\"root\"\n :type=\"type\"\n :model-value=\"rootValue\"\n orientation=\"horizontal\"\n :disabled=\"field.disabled\"\n v-bind=\"{ ...groupAttrs, ...field.attrs }\"\n :class=\"\n cn(\n 'inline-flex items-center gap-0.5 rounded-md p-0.5',\n // The track has three resting looks. `secondary` is SegmentedControl's\n // own track — a muted well with a rim; `outline` keeps the rim but\n // sits on the page ground; `ghost` has neither rim nor well and leans\n // entirely on the buttons.\n variant === 'secondary' && 'border border-input bg-muted',\n variant === 'outline' && 'border border-input bg-background',\n variant === 'ghost' && 'bg-transparent',\n // The one thing the *track* has left to say when the whole group is\n // unavailable: the rim slackening from `input` to the lighter\n // `border` — the well is already spent. A ghost track has no rim to\n // slacken, so it says it through its buttons alone.\n field.disabled && variant !== 'ghost' && 'border-border cursor-not-allowed',\n attrs.class as string,\n )\n \"\n @update:model-value=\"onUpdate\"\n >\n <RekaToggleGroupItem\n v-for=\"opt in items\"\n :key=\"opt.value\"\n :value=\"opt.value\"\n :disabled=\"opt.disabled ?? false\"\n v-bind=\"optional({ 'data-testid': opt.testId })\"\n :class=\"\n cn(\n // Named, not the bare `group`: this control is dropped into\n // application chrome, and a bare `group-*` would also answer to any\n // ancestor a host happened to mark up as one.\n // `min-h-6`/`min-w-6` are the WCAG 2.5.8 target floors made\n // explicit in the sm form, whose one-character labels would\n // otherwise collapse under 24px.\n 'group/item relative inline-flex items-center justify-center gap-1.5 rounded-sm text-muted-foreground',\n size === 'sm' && 'min-h-6 min-w-6 px-1.5 py-px text-micro',\n size === 'md' && 'min-h-8 px-3 py-1 text-sm',\n size === 'lg' && 'min-h-10 px-4 py-1.5',\n 'data-[state=off]:hover:bg-subtle',\n // The pressed state is fill plus weight plus `aria-pressed` — never\n // colour alone.\n 'data-[state=on]:bg-primary data-[state=on]:font-medium data-[state=on]:text-primary-foreground data-[state=on]:shadow-sm',\n 'active:scale-press',\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring focus-visible:shadow-halo',\n // No `opacity` here either, for SegmentedControl's reason: the label\n // is most of the button, and a dim took it to 1.96:1. Unavailability\n // is a fill instead — the cell drains to the page ground — and the\n // mute lives on the span, where it beats whatever the button\n // resolved to.\n 'disabled:pointer-events-none data-[disabled]:bg-background',\n )\n \"\n >\n <component\n :is=\"opt.icon\"\n v-if=\"opt.icon\"\n aria-hidden=\"true\"\n :class=\"cn('shrink-0', iconClass)\"\n />\n <span class=\"group-data-[disabled]/item:text-muted-foreground\">{{ opt.label }}</span>\n </RekaToggleGroupItem>\n </ToggleGroupRoot>\n</template>\n"],"mappings":""}
@@ -0,0 +1,53 @@
1
+ import type { Component } from "vue";
2
+ /** One toggle inside a {@link ToggleGroup}. */
3
+ export interface ToggleGroupItem {
4
+ /** Matched against `modelValue`. */
5
+ value: string;
6
+ /** Visible label, rendered inside the button. */
7
+ label: string;
8
+ /** Optional glyph rendered before the label; hidden from the tree, the label is the name. */
9
+ icon?: Component;
10
+ /** Disables this button alone, leaving its neighbours toggleable. */
11
+ disabled?: boolean;
12
+ /** Forwarded to the button's DOM node — lets hosts keep stable test hooks. */
13
+ testId?: string;
14
+ }
15
+ declare const _default: typeof __VLS_export;
16
+ export default _default;
17
+ declare const __VLS_export: import("vue").DefineComponent<{
18
+ /** The pressed value (`"single"`), the pressed values (`"multiple"`), or nothing pressed. */
19
+ modelValue?: string | string[] | null;
20
+ /** The buttons to render, in order. */
21
+ items: ToggleGroupItem[];
22
+ /** `"single"` models one value or `null`; `"multiple"` a `string[]`. */
23
+ type?: "single" | "multiple";
24
+ /** The track's resting look; a pressed button fills with the primary token in every variant. */
25
+ variant?: "secondary" | "outline" | "ghost";
26
+ /** `"sm"` is the compressed form for dense chrome — e.g. an editor toolbar. */
27
+ size?: "sm" | "md" | "lg";
28
+ /** Disables every button at once, distinct from a single item's own `disabled`. Unset defers to a wrapping Field. */
29
+ disabled?: boolean | undefined;
30
+ }, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
31
+ "update:modelValue": (value: string | string[] | null) => any;
32
+ }, string, import("vue").PublicProps, Readonly<{
33
+ /** The pressed value (`"single"`), the pressed values (`"multiple"`), or nothing pressed. */
34
+ modelValue?: string | string[] | null;
35
+ /** The buttons to render, in order. */
36
+ items: ToggleGroupItem[];
37
+ /** `"single"` models one value or `null`; `"multiple"` a `string[]`. */
38
+ type?: "single" | "multiple";
39
+ /** The track's resting look; a pressed button fills with the primary token in every variant. */
40
+ variant?: "secondary" | "outline" | "ghost";
41
+ /** `"sm"` is the compressed form for dense chrome — e.g. an editor toolbar. */
42
+ size?: "sm" | "md" | "lg";
43
+ /** Disables every button at once, distinct from a single item's own `disabled`. Unset defers to a wrapping Field. */
44
+ disabled?: boolean | undefined;
45
+ }> & Readonly<{
46
+ "onUpdate:modelValue"?: (value: string | string[] | null) => any;
47
+ }>, {
48
+ size: "sm" | "md" | "lg";
49
+ type: "single" | "multiple";
50
+ disabled: boolean | undefined;
51
+ variant: "secondary" | "outline" | "ghost";
52
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
53
+ //# sourceMappingURL=ToggleGroup.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToggleGroup.vue.d.ts","sourceRoot":"","sources":["../../../../../packages/primitives/toggle-group/src/ToggleGroup.vue"],"names":[],"mappings":"AA6NA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAErC,+CAA+C;AAC/C,MAAM,WAAW,eAAe;IAC9B,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,6FAA6F;IAC7F,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;wBACoB,OAAO,YAAY;AAAxC,wBAAyC;AACzC,QAAA,MAAM,YAAY;IAkCd,6FAA6F;iBAChF,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IACrC,uCAAuC;WAChC,eAAe,EAAE;IACxB,wEAAwE;WACjE,QAAQ,GAAG,UAAU;IAC5B,gGAAgG;cACtF,WAAW,GAAG,SAAS,GAAG,OAAO;IAC3C,+EAA+E;WACxE,IAAI,GAAG,IAAI,GAAG,IAAI;IACzB,qHAAqH;eAC1G,OAAO,GAAG,SAAS;;;;IAX9B,6FAA6F;iBAChF,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IACrC,uCAAuC;WAChC,eAAe,EAAE;IACxB,wEAAwE;WACjE,QAAQ,GAAG,UAAU;IAC5B,gGAAgG;cACtF,WAAW,GAAG,SAAS,GAAG,OAAO;IAC3C,+EAA+E;WACxE,IAAI,GAAG,IAAI,GAAG,IAAI;IACzB,qHAAqH;eAC1G,OAAO,GAAG,SAAS;;;;UAFvB,IAAI,GAAG,IAAI,GAAG,IAAI;UAJlB,QAAQ,GAAG,UAAU;cAMjB,OAAO,GAAG,SAAS;aAJpB,WAAW,GAAG,SAAS,GAAG,OAAO;6EAiS3C,CAAC"}
@@ -0,0 +1,111 @@
1
+ import { cn } from "../../../core/src/cn.js";
2
+ import { optional } from "../../../core/src/props.js";
3
+ import { useSplitAttrs } from "../../../core/src/attrs.js";
4
+ import "../../../core/src/index.js";
5
+ import { useFieldControl } from "../../../labels/src/field-context.js";
6
+ import { useAncestorDisabled } from "../../../labels/src/ancestor-disabled.js";
7
+ import "../../../labels/src/index.js";
8
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, defineComponent, mergeProps, normalizeClass, openBlock, renderList, resolveDynamicComponent, toDisplayString, unref, useTemplateRef, withCtx } from "vue";
9
+ import { ToggleGroupItem, ToggleGroupRoot } from "reka-ui";
10
+ //#region packages/primitives/toggle-group/src/ToggleGroup.vue?vue&type=script&setup=true&lang.ts
11
+ var _hoisted_1 = { class: "group-data-[disabled]/item:text-muted-foreground" };
12
+ var ToggleGroup_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
13
+ inheritAttrs: false,
14
+ __name: "ToggleGroup",
15
+ props: {
16
+ modelValue: {},
17
+ items: {},
18
+ type: { default: "single" },
19
+ variant: { default: "secondary" },
20
+ size: { default: "md" },
21
+ disabled: {
22
+ type: Boolean,
23
+ default: void 0
24
+ }
25
+ },
26
+ emits: ["update:modelValue"],
27
+ setup(__props, { emit: __emit }) {
28
+ const props = __props;
29
+ const emit = __emit;
30
+ const { attrs, rest: groupAttrs } = useSplitAttrs();
31
+ /**
32
+ * The buttons are real `<button>`s, so a `<fieldset disabled>` above this
33
+ * group already makes each of them inert — but Reka's roving focus is what
34
+ * decides where Tab lands, and it is driven by the group's own `disabled`,
35
+ * which the fieldset never reaches. Its own `disabled` prop sets that to
36
+ * `-1`, exactly as SegmentedControl does.
37
+ *
38
+ * Read off the DOM rather than taken from the Field context, which publishes
39
+ * no `disabled` on purpose — see `../../lib/ancestor-disabled.ts`.
40
+ */
41
+ const root = useTemplateRef("root");
42
+ const groupDisabled = useAncestorDisabled(() => root.value?.$el);
43
+ const field = useFieldControl(() => ({
44
+ id: attrs.id,
45
+ describedBy: attrs["aria-describedby"],
46
+ disabled: groupDisabled.value ? true : props.disabled
47
+ }));
48
+ /**
49
+ * Reka's own model is `AcceptableValue` for `"single"` and `AcceptableValue[]`
50
+ * for `"multiple"`, and its typing has no `undefined` rung under
51
+ * `exactOptionalPropertyTypes`. The seam's contract adds `null` for "nothing
52
+ * pressed" and keeps a `null`/absent model from reaching Reka as a stray
53
+ * non-string: a single group with nothing pressed shows Reka `""`, which is
54
+ * no item's value — and `data-state="off"` on every button — in both engines.
55
+ */
56
+ const rootValue = computed(() => {
57
+ if (props.type === "multiple") return Array.isArray(props.modelValue) ? props.modelValue : [];
58
+ return typeof props.modelValue === "string" ? props.modelValue : "";
59
+ });
60
+ function onUpdate(value) {
61
+ if (props.type === "multiple") emit("update:modelValue", Array.isArray(value) ? value : []);
62
+ else emit("update:modelValue", typeof value === "string" && value !== "" ? value : null);
63
+ }
64
+ const iconClass = computed(() => props.size === "sm" ? "size-3.5" : "size-4");
65
+ return (_ctx, _cache) => {
66
+ return openBlock(), createBlock(unref(ToggleGroupRoot), mergeProps({
67
+ ref_key: "root",
68
+ ref: root,
69
+ type: __props.type,
70
+ "model-value": rootValue.value,
71
+ orientation: "horizontal",
72
+ disabled: unref(field).disabled
73
+ }, {
74
+ ...unref(groupAttrs),
75
+ ...unref(field).attrs
76
+ }, {
77
+ class: unref(cn)("inline-flex items-center gap-0.5 rounded-md p-0.5", __props.variant === "secondary" && "border border-input bg-muted", __props.variant === "outline" && "border border-input bg-background", __props.variant === "ghost" && "bg-transparent", unref(field).disabled && __props.variant !== "ghost" && "border-border cursor-not-allowed", unref(attrs).class),
78
+ "onUpdate:modelValue": onUpdate
79
+ }), {
80
+ default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (opt) => {
81
+ return openBlock(), createBlock(unref(ToggleGroupItem), mergeProps({
82
+ key: opt.value,
83
+ value: opt.value,
84
+ disabled: opt.disabled ?? false
85
+ }, { ref_for: true }, unref(optional)({ "data-testid": opt.testId }), { class: unref(cn)("group/item relative inline-flex items-center justify-center gap-1.5 rounded-sm text-muted-foreground", __props.size === "sm" && "min-h-6 min-w-6 px-1.5 py-px text-micro", __props.size === "md" && "min-h-8 px-3 py-1 text-sm", __props.size === "lg" && "min-h-10 px-4 py-1.5", "data-[state=off]:hover:bg-subtle", "data-[state=on]:bg-primary data-[state=on]:font-medium data-[state=on]:text-primary-foreground data-[state=on]:shadow-sm", "active:scale-press", "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring focus-visible:shadow-halo", "disabled:pointer-events-none data-[disabled]:bg-background") }), {
86
+ default: withCtx(() => [opt.icon ? (openBlock(), createBlock(resolveDynamicComponent(opt.icon), {
87
+ key: 0,
88
+ "aria-hidden": "true",
89
+ class: normalizeClass(unref(cn)("shrink-0", iconClass.value))
90
+ }, null, 8, ["class"])) : createCommentVNode("", true), createElementVNode("span", _hoisted_1, toDisplayString(opt.label), 1)]),
91
+ _: 2
92
+ }, 1040, [
93
+ "value",
94
+ "disabled",
95
+ "class"
96
+ ]);
97
+ }), 128))]),
98
+ _: 1
99
+ }, 16, [
100
+ "type",
101
+ "model-value",
102
+ "disabled",
103
+ "class"
104
+ ]);
105
+ };
106
+ }
107
+ });
108
+ //#endregion
109
+ export { ToggleGroup_vue_vue_type_script_setup_true_lang_default as default };
110
+
111
+ //# sourceMappingURL=ToggleGroup.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToggleGroup.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../../../packages/primitives/toggle-group/src/ToggleGroup.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { Component } from \"vue\";\n\n/** One toggle inside a {@link ToggleGroup}. */\nexport interface ToggleGroupItem {\n /** Matched against `modelValue`. */\n value: string;\n /** Visible label, rendered inside the button. */\n label: string;\n /** Optional glyph rendered before the label; hidden from the tree, the label is the name. */\n icon?: Component;\n /** Disables this button alone, leaving its neighbours toggleable. */\n disabled?: boolean;\n /** Forwarded to the button's DOM node — lets hosts keep stable test hooks. */\n testId?: string;\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, useTemplateRef } from \"vue\";\nimport { ToggleGroupRoot, ToggleGroupItem as RekaToggleGroupItem } from \"reka-ui\";\nimport type { AcceptableValue } from \"reka-ui\";\nimport { useAncestorDisabled, useFieldControl } from \"@ecoma-io/loom-labels\";\nimport { cn, optional, useSplitAttrs } from \"@ecoma-io/loom-core\";\n\n/**\n * ToggleGroup — a set of toggle actions or filters whose pressed state is the\n * value: bold/italic/underline, column filters, metric toggles. Each item is\n * a real `<button aria-pressed>` — deliberately **not** `aria-checked`/radio\n * semantics, which is the whole distinction from\n * [SegmentedControl](../../segmented-control): a segmented control is a value\n * picker where one option is always active, while here zero-or-more buttons\n * can be on at once and the group's `type` says which contract the model\n * follows — `\"single\"` holds one value or `null`, `\"multiple\"` a `string[]`.\n * Built on Reka UI's ToggleGroup: the group is one Tab stop (roving\n * tabindex), Arrow keys move focus between buttons skipping disabled ones —\n * they move *focus only* and never flip a toggle, unlike a radio group where\n * the arrows change the value. Styled with Loom tokens; a pressed button\n * fills with the primary token and takes weight, so the state is carried by\n * `aria-pressed` plus fill plus weight — never colour alone.\n *\n * Inside a [Field](../Field/Field.vue) the row's description, `required` and\n * `invalid` reach the group through `useFieldControl()`, and a\n * `<Fieldset disabled>` above it disables every button.\n *\n * **A row's label does not name this group.** `<label for>` names a labelable\n * element and this renders a `div[role=\"group\"]`, so the row's label resolves\n * to the element and names nobody. Name it with a\n * [Fieldset](../Fieldset/Fieldset.vue)'s real `<legend>`, or with an\n * `aria-label`/`aria-labelledby` of its own — which is what every example\n * already does, because the component carries no label text of its own and\n * therefore no labels prop: the item labels are the caller's content.\n *\n * There is no `readonly`: a toggle that displays a state but cannot change it\n * is a disabled one showing an answer, so a row's `readonly` arrives as\n * nothing at all rather than as that disguise.\n */\nconst props = withDefaults(\n defineProps<{\n /** The pressed value (`\"single\"`), the pressed values (`\"multiple\"`), or nothing pressed. */\n modelValue?: string | string[] | null;\n /** The buttons to render, in order. */\n items: ToggleGroupItem[];\n /** `\"single\"` models one value or `null`; `\"multiple\"` a `string[]`. */\n type?: \"single\" | \"multiple\";\n /** The track's resting look; a pressed button fills with the primary token in every variant. */\n variant?: \"secondary\" | \"outline\" | \"ghost\";\n /** `\"sm\"` is the compressed form for dense chrome — e.g. an editor toolbar. */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Disables every button at once, distinct from a single item's own `disabled`. Unset defers to a wrapping Field. */\n disabled?: boolean | undefined;\n }>(),\n {\n // Not `false`: absent has to stay tellable from `false` for a Field above\n // to disable the group and for `:disabled=\"false\"` to overrule one that\n // does. Vue casts an absent Boolean prop with no declared default to\n // `false`, which would leave the context wired and inert.\n disabled: undefined,\n type: \"single\",\n variant: \"secondary\",\n size: \"md\",\n },\n);\n\nconst emit = defineEmits<{ \"update:modelValue\": [value: string | null | string[]] }>();\n\ndefineOptions({ inheritAttrs: false });\nconst { attrs, rest: groupAttrs } = useSplitAttrs();\n\n/**\n * The buttons are real `<button>`s, so a `<fieldset disabled>` above this\n * group already makes each of them inert — but Reka's roving focus is what\n * decides where Tab lands, and it is driven by the group's own `disabled`,\n * which the fieldset never reaches. Its own `disabled` prop sets that to\n * `-1`, exactly as SegmentedControl does.\n *\n * Read off the DOM rather than taken from the Field context, which publishes\n * no `disabled` on purpose — see `../../lib/ancestor-disabled.ts`.\n */\nconst root = useTemplateRef<{ $el?: Element }>(\"root\");\nconst groupDisabled = useAncestorDisabled(() => root.value?.$el);\n\nconst field = useFieldControl(() => ({\n id: attrs.id as string | undefined,\n describedBy: attrs[\"aria-describedby\"] as string | undefined,\n // The fieldset beats the prop in both directions, exactly as it does for\n // the buttons themselves.\n disabled: groupDisabled.value ? true : props.disabled,\n}));\n\n/**\n * Reka's own model is `AcceptableValue` for `\"single\"` and `AcceptableValue[]`\n * for `\"multiple\"`, and its typing has no `undefined` rung under\n * `exactOptionalPropertyTypes`. The seam's contract adds `null` for \"nothing\n * pressed\" and keeps a `null`/absent model from reaching Reka as a stray\n * non-string: a single group with nothing pressed shows Reka `\"\"`, which is\n * no item's value — and `data-state=\"off\"` on every button — in both engines.\n */\nconst rootValue = computed<string | string[]>(() => {\n if (props.type === \"multiple\") {\n return Array.isArray(props.modelValue) ? props.modelValue : [];\n }\n return typeof props.modelValue === \"string\" ? props.modelValue : \"\";\n});\n\nfunction onUpdate(value: AcceptableValue | AcceptableValue[]) {\n if (props.type === \"multiple\") {\n // Every item's value is a caller-provided `string`, so the array Reka\n // hands back can only hold those strings.\n emit(\"update:modelValue\", Array.isArray(value) ? (value as string[]) : []);\n } else {\n // Reka hands back `undefined` when the pressed button is pressed again —\n // the seam publishes that as `null`, the model's spelling of \"nothing\".\n emit(\"update:modelValue\", typeof value === \"string\" && value !== \"\" ? value : null);\n }\n}\n\nconst iconClass = computed(() => (props.size === \"sm\" ? \"size-3.5\" : \"size-4\"));\n</script>\n\n<template>\n <ToggleGroupRoot\n ref=\"root\"\n :type=\"type\"\n :model-value=\"rootValue\"\n orientation=\"horizontal\"\n :disabled=\"field.disabled\"\n v-bind=\"{ ...groupAttrs, ...field.attrs }\"\n :class=\"\n cn(\n 'inline-flex items-center gap-0.5 rounded-md p-0.5',\n // The track has three resting looks. `secondary` is SegmentedControl's\n // own track — a muted well with a rim; `outline` keeps the rim but\n // sits on the page ground; `ghost` has neither rim nor well and leans\n // entirely on the buttons.\n variant === 'secondary' && 'border border-input bg-muted',\n variant === 'outline' && 'border border-input bg-background',\n variant === 'ghost' && 'bg-transparent',\n // The one thing the *track* has left to say when the whole group is\n // unavailable: the rim slackening from `input` to the lighter\n // `border` — the well is already spent. A ghost track has no rim to\n // slacken, so it says it through its buttons alone.\n field.disabled && variant !== 'ghost' && 'border-border cursor-not-allowed',\n attrs.class as string,\n )\n \"\n @update:model-value=\"onUpdate\"\n >\n <RekaToggleGroupItem\n v-for=\"opt in items\"\n :key=\"opt.value\"\n :value=\"opt.value\"\n :disabled=\"opt.disabled ?? false\"\n v-bind=\"optional({ 'data-testid': opt.testId })\"\n :class=\"\n cn(\n // Named, not the bare `group`: this control is dropped into\n // application chrome, and a bare `group-*` would also answer to any\n // ancestor a host happened to mark up as one.\n // `min-h-6`/`min-w-6` are the WCAG 2.5.8 target floors made\n // explicit in the sm form, whose one-character labels would\n // otherwise collapse under 24px.\n 'group/item relative inline-flex items-center justify-center gap-1.5 rounded-sm text-muted-foreground',\n size === 'sm' && 'min-h-6 min-w-6 px-1.5 py-px text-micro',\n size === 'md' && 'min-h-8 px-3 py-1 text-sm',\n size === 'lg' && 'min-h-10 px-4 py-1.5',\n 'data-[state=off]:hover:bg-subtle',\n // The pressed state is fill plus weight plus `aria-pressed` — never\n // colour alone.\n 'data-[state=on]:bg-primary data-[state=on]:font-medium data-[state=on]:text-primary-foreground data-[state=on]:shadow-sm',\n 'active:scale-press',\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring focus-visible:shadow-halo',\n // No `opacity` here either, for SegmentedControl's reason: the label\n // is most of the button, and a dim took it to 1.96:1. Unavailability\n // is a fill instead — the cell drains to the page ground — and the\n // mute lives on the span, where it beats whatever the button\n // resolved to.\n 'disabled:pointer-events-none data-[disabled]:bg-background',\n )\n \"\n >\n <component\n :is=\"opt.icon\"\n v-if=\"opt.icon\"\n aria-hidden=\"true\"\n :class=\"cn('shrink-0', iconClass)\"\n />\n <span class=\"group-data-[disabled]/item:text-muted-foreground\">{{ opt.label }}</span>\n </RekaToggleGroupItem>\n </ToggleGroupRoot>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;EAyDA,MAAM,QAAQ;EA2Bd,MAAM,OAAO;EAGb,MAAM,EAAE,OAAO,MAAM,eAAe,cAAc;;;;;;;;;;;EAYlD,MAAM,OAAO,eAAkC,MAAM;EACrD,MAAM,gBAAgB,0BAA0B,KAAK,OAAO,GAAG;EAE/D,MAAM,QAAQ,uBAAuB;GACnC,IAAI,MAAM;GACV,aAAa,MAAM;GAGnB,UAAU,cAAc,QAAQ,OAAO,MAAM;EAC/C,EAAE;;;;;;;;;EAUF,MAAM,YAAY,eAAkC;GAClD,IAAI,MAAM,SAAS,YACjB,OAAO,MAAM,QAAQ,MAAM,UAAU,IAAI,MAAM,aAAa,CAAC;GAE/D,OAAO,OAAO,MAAM,eAAe,WAAW,MAAM,aAAa;EACnE,CAAC;EAED,SAAS,SAAS,OAA4C;GAC5D,IAAI,MAAM,SAAS,YAGjB,KAAK,qBAAqB,MAAM,QAAQ,KAAK,IAAK,QAAqB,CAAC,CAAC;QAIzE,KAAK,qBAAqB,OAAO,UAAU,YAAY,UAAU,KAAK,QAAQ,IAAI;EAEtF;EAEA,MAAM,YAAY,eAAgB,MAAM,SAAS,OAAO,aAAa,QAAS;;GAI5E,OAAA,UAAA,GAAA,YAoEkB,MAAA,eAAA,GApElB,WAoEkB;IAnEZ,SAAA;IAAJ,KAAI;IACH,MAAM,QAAA;IACN,eAAa,UAAA;IACd,aAAY;IACX,UAAU,MAAA,KAAA,CAAK,CAAC;GACJ,GAAA;IAAA,GAAA,MAAA,UAAA;IAAU,GAAK,MAAA,KAAA,CAAK,CAAC;GAAK,GAAA;IACtC,OAAc,MAAA,EAAA,CAAE,CAAA,qDAAsV,QAAA,YAAO,eAAA,gCAA4D,QAAA,YAAO,aAAA,qCAA+D,QAAA,YAAO,WAAA,kBAAwU,MAAA,KAAA,CAAK,CAAC,YAAY,QAAA,YAAO,WAAA,oCAA4D,MAAA,KAAA,CAAK,CAAC,KAAA;IAkBz5B,uBAAoB;;IAGnB,SAAA,cAAoB,EADtB,UAAA,IAAA,GAAA,mBAwCsB,UAAA,MAAA,WAvCN,QAAA,QAAP,QAAG;KADZ,OAAA,UAAA,GAAA,YAwCsB,MAAA,eAAA,GAxCtB,WAwCsB;MAtCnB,KAAK,IAAI;MACT,OAAO,IAAI;MACX,UAAU,IAAI,YAAQ;KACf,GAAA,EAAA,SAAA,KAAA,GAAA,MAAA,QAAA,CAAQ,CAAA,EAAA,eAAkB,IAAI,OAAM,CAAA,GAAA,EAC3C,OAAgB,MAAA,EAAA,CAAE,CAAA,wGAAugB,QAAA,SAAI,QAAA,2CAAkE,QAAA,SAAI,QAAA,6BAAoD,QAAA,SAAI,QAAA,wBAAA,oCAAA,4HAAA,sBAAA,+GAAA,4DAAA,EAAA,CAAA,GAAA;MA2B5pB,SAAA,cAKE,CAHM,IAAI,QAFZ,UAAA,GAAA,YAKE,wBAJK,IAAI,IAAI,GAAA;;OAEb,eAAY;OACX,OAAK,eAAE,MAAA,EAAA,CAAE,CAAA,YAAa,UAAA,KAAS,CAAA;MAElC,GAAA,MAAA,GAAA,CAAA,OAAA,CAAA,KAAA,mBAAA,IAAA,IAAA,GAAA,mBAAqF,QAArF,YAAqF,gBAAnB,IAAI,KAAK,GAAA,CAAA,CAAA,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { default } from "./ToggleGroup.vue";
2
+ export type { ToggleGroupItem } from "./ToggleGroup.vue";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/primitives/toggle-group/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import ToggleGroup_default from "./ToggleGroup.js";
2
+ export { ToggleGroup_default as default };
@@ -0,0 +1,7 @@
1
+ import Toolbar_vue_vue_type_script_setup_true_lang_default, { TOOLBAR_CONTEXT } from "./Toolbar.vue_vue_type_script_setup_true_lang.js";
2
+ //#region packages/primitives/toolbar/src/Toolbar.vue
3
+ var Toolbar_default = Toolbar_vue_vue_type_script_setup_true_lang_default;
4
+ //#endregion
5
+ export { TOOLBAR_CONTEXT, Toolbar_default as default };
6
+
7
+ //# sourceMappingURL=Toolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toolbar.js","names":[],"sources":["../../../../../packages/primitives/toolbar/src/Toolbar.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { InjectionKey } from \"vue\";\n/** Which axis the controls run along. */\nexport type ToolbarOrientation = \"horizontal\" | \"vertical\";\n\n/** What the toolbar hands to its slotted children — only its axis. */\nexport interface ToolbarContext {\n orientation: ToolbarOrientation;\n}\n\nexport const TOOLBAR_CONTEXT: InjectionKey<ToolbarContext> = Symbol(\"loom-toolbar\");\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, provide, ref } from \"vue\";\nimport { cn, useSplitAttrs } from \"@ecoma-io/loom-core\";\n\n/**\n * WAI-ARIA APG toolbar pattern: Tab enters the toolbar and lands on its\n * active control, Tab again leaves it, and the arrow keys walk between the\n * controls inside. For a text-format strip, a view's zoom/filter row, a\n * table's bulk actions — anywhere seven individual Tab stops would stand\n * between a keyboard user and the rest of the page.\n *\n * **Participation needs no contract on the controls.** The toolbar does not\n * wrap its children in registration components and does not require them to\n * consume an injection: on mount, on every render, and on subtree mutations\n * it collects its own focusable descendants — `button`, `input`, `select`,\n * `textarea`, links with `href`, `summary`, and anything carrying a real\n * `tabindex` — and manages their `tabindex` itself. Any control, Loom or\n * native, participates by being slotted in; that is the point of the\n * pattern, and it is why the component ships no `items` prop.\n *\n * The roving index only lands on enabled, visible items: a control disabled\n * (`disabled` or `aria-disabled=\"true\"`) or hidden (`[hidden]`,\n * `aria-hidden=\"true\"`, `display: none`, `visibility: hidden`) is skipped by\n * the arrows but keeps its position, and focus never rests on it. Visibility\n * through `getComputedStyle` is exact in a real browser; under jsdom only\n * inline styles and attributes resolve, which the unit tests work within.\n *\n * Every walk key (both arrow pairs, Home, End) is left to the control when\n * focus rests inside an editable one (`input`, `select`, `textarea`,\n * `contenteditable`) — caret movement, native `select` value stepping and\n * text-field Home/End are not the toolbar's to hijack. Tab is the way out\n * of an editable stop, as it is everywhere else.\n *\n * Wrapping is ON: an arrow at either edge carries to the opposite end, the\n * way every editor's format strip behaves. Home/End jump to the first and\n * last enabled control. Both arrow pairs work in both orientations (each\n * key maps to one direction), so `orientation` is a layout and AT-announced\n * axis, not a key-availability switch.\n *\n * The accessible name is the consumer's to supply — `label` or a\n * pass-through `aria-label` — because a toolbar names its own purpose, and\n * the component owns no other string (separators carry no text). There is\n * deliberately no labels prop: zero localisable strings, nothing to seam.\n *\n * ```vue\n * <Toolbar label=\"Text formatting\">\n * <IconButton label=\"Bold\"><BoldIcon class=\"size-4\" /></IconButton>\n * <IconButton label=\"Italic\"><ItalicIcon class=\"size-4\" /></IconButton>\n * <ToolbarSeparator />\n * <Select :options=\"zoomLevels\" aria-label=\"Zoom\" />\n * </Toolbar>\n * ```\n */\nconst props = withDefaults(\n defineProps<{\n /** Layout and announced axis of the control run. */\n orientation?: ToolbarOrientation;\n /** The toolbar's accessible name, for when no better label sits in the DOM. */\n label?: string;\n }>(),\n { orientation: \"horizontal\" },\n);\n\ndefineOptions({ inheritAttrs: false });\nconst { attrs, rest } = useSplitAttrs();\n\n// The consumer's own `aria-label` beats the `label` prop — an explicitly\n// passed attribute is the more specific intent.\nconst ariaLabel = computed(() => (rest.value[\"aria-label\"] as string | undefined) ?? props.label);\n\nprovide(TOOLBAR_CONTEXT, {\n get orientation() {\n return props.orientation;\n },\n});\n\n// One selector for every kind of control a toolbar can hold. `:not([disabled])`\n// prunes natively disabled controls at query time; the property check in\n// `participating` covers the ones an attribute cannot see — a control inside a\n// disabled `<fieldset>` reports `.disabled === true` with no attribute of its\n// own. `[tabindex]` catches custom controls that are none of the above; the\n// root itself carries none, so it never collects itself.\nconst FOCUSABLE_SELECTOR = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"input:not([disabled]):not([type='hidden'])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n \"summary\",\n \"[tabindex]:not([tabindex='-1'])\",\n \"[contenteditable='true']\",\n \"[contenteditable='']\",\n].join(\",\");\n\nconst EDITABLE_SELECTOR = \"input, select, textarea, [contenteditable='true'], [contenteditable='']\";\n\nconst root = ref<HTMLElement | null>(null);\n/** The enabled, visible controls, in DOM order — disabled and hidden ones are not in it, which is exactly \"skipped but keeping their position\". */\nconst items = ref<HTMLElement[]>([]);\nconst activeIndex = ref(0);\n\nfunction participating(el: HTMLElement): boolean {\n const maybeDisableable = el as HTMLButtonElement;\n if (maybeDisableable.disabled || el.getAttribute(\"aria-disabled\") === \"true\") return false;\n if (el.hasAttribute(\"hidden\") || el.closest(\"[aria-hidden='true']\") !== null) return false;\n // Exact in a browser; under jsdom only inline styles resolve, so the unit\n // tests drive this path with attributes and inline styles.\n const style = window.getComputedStyle(el);\n return style.display !== \"none\" && style.visibility !== \"hidden\";\n}\n\n/** Re-collect the participating controls and re-apply the roving tab stops. */\nfunction collect(): void {\n const rootEl = root.value;\n if (!rootEl) return;\n const next = Array.from(rootEl.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)).filter(\n participating,\n );\n // Anything that just left the set — it went disabled or hidden while\n // holding the roving stop — must give the stop back: an `aria-disabled`\n // control is still natively focusable, and a stale `tabindex=\"0\"` would\n // leave it a standing Tab stop the walk can never land on.\n for (const el of items.value) {\n if (!next.includes(el)) el.removeAttribute(\"tabindex\");\n }\n if (activeIndex.value >= next.length) activeIndex.value = 0;\n next.forEach((el, i) => {\n el.tabIndex = i === activeIndex.value ? 0 : -1;\n });\n items.value = next;\n}\n\n// Only structural and state attributes are watched — not `tabindex`, which\n// `collect()` itself writes: an observer reacting to its own writes would\n// loop. CSS-driven visibility changes are also missed; that limit is named in\n// the docblock and covered by the real-browser e2e instead.\nlet observer: MutationObserver | undefined;\nlet scheduled = false;\nfunction schedule(): void {\n if (scheduled) return;\n scheduled = true;\n queueMicrotask(() => {\n scheduled = false;\n collect();\n });\n}\n\nonMounted(() => {\n collect();\n observer = new MutationObserver(schedule);\n observer.observe(root.value!, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: [\"hidden\", \"disabled\", \"aria-disabled\", \"aria-hidden\", \"href\", \"type\"],\n });\n});\n\nonBeforeUnmount(() => observer?.disconnect());\n\nfunction moveTo(index: number): void {\n if (!items.value.length) return;\n // Modulo makes both edges wrap: -1 lands on the last, `length` on the first.\n const next = items.value[(index + items.value.length) % items.value.length]!;\n activeIndex.value = items.value.indexOf(next);\n items.value.forEach((el, i) => {\n el.tabIndex = i === activeIndex.value ? 0 : -1;\n });\n next.focus();\n}\n\n/**\n * Pointer focus has to move the roving stop too — whoever actually holds\n * focus is the active control, whatever moved focus there.\n */\nfunction onFocusin(event: FocusEvent): void {\n const target = event.target as Element;\n const item =\n items.value.indexOf(target as HTMLElement) >= 0\n ? (target as HTMLElement)\n : (target.closest(FOCUSABLE_SELECTOR) as HTMLElement | null);\n if (item) {\n activeIndex.value = items.value.indexOf(item);\n items.value.forEach((el, i) => {\n el.tabIndex = i === activeIndex.value ? 0 : -1;\n });\n }\n}\n\nfunction onKeydown(event: KeyboardEvent): void {\n // Arrows inside a control that consumes them — caret movement, `select`\n // value stepping — belong to that control. Tab is the exit, as always.\n if ((event.target as Element).closest(EDITABLE_SELECTOR)) return;\n collect(); // fresh on every keystroke: cheap at toolbar scale, never stale\n if (!items.value.length) return;\n const current = items.value.indexOf(document.activeElement as HTMLElement);\n const from = current === -1 ? 0 : current;\n switch (event.key) {\n case \"ArrowLeft\":\n case \"ArrowUp\":\n moveTo(from - 1);\n break;\n case \"ArrowRight\":\n case \"ArrowDown\":\n moveTo(from + 1);\n break;\n case \"Home\":\n moveTo(0);\n break;\n case \"End\":\n moveTo(items.value.length - 1);\n break;\n default:\n return; // Space, Enter and every other key are the control's own\n }\n event.preventDefault();\n}\n</script>\n\n<template>\n <!-- `role=\"toolbar\"` is the pattern's name for this container — not\n redundant on a `div`, which carries no role to repeat — and the two\n delegated handlers are the pattern's plumbing: focus and keys are\n handled once here for every control slotted inside. The rule models\n neither. The comments lead the template, which makes the component\n multi-root; attrs are bound explicitly below, so nothing is lost to\n fallthrough. -->\n <!-- eslint-disable-next-line vuejs-accessibility/no-static-element-interactions, vuejs-accessibility/no-redundant-roles -->\n <div\n v-bind=\"rest\"\n ref=\"root\"\n role=\"toolbar\"\n :aria-label=\"ariaLabel\"\n :aria-orientation=\"orientation\"\n :class=\"\n cn(\n 'inline-flex items-center gap-1 rounded-lg border border-border bg-background p-1',\n // A vertical toolbar stacks, and its separators stretch across it.\n orientation === 'vertical' ? 'flex-col items-stretch' : 'max-w-full flex-row',\n attrs.class as string,\n )\n \"\n @focusin=\"onFocusin\"\n @keydown=\"onKeydown\"\n >\n <!-- @slot The controls — any focusable element participates, no wrapper required. -->\n <slot />\n </div>\n</template>\n"],"mappings":""}
@@ -0,0 +1,31 @@
1
+ import type { InjectionKey } from "vue";
2
+ /** Which axis the controls run along. */
3
+ export type ToolbarOrientation = "horizontal" | "vertical";
4
+ /** What the toolbar hands to its slotted children — only its axis. */
5
+ export interface ToolbarContext {
6
+ orientation: ToolbarOrientation;
7
+ }
8
+ export declare const TOOLBAR_CONTEXT: InjectionKey<ToolbarContext>;
9
+ declare const _default: typeof __VLS_export;
10
+ export default _default;
11
+ declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<{
12
+ /** Layout and announced axis of the control run. */
13
+ orientation?: ToolbarOrientation;
14
+ /** The toolbar's accessible name, for when no better label sits in the DOM. */
15
+ label?: string;
16
+ }, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{
17
+ /** Layout and announced axis of the control run. */
18
+ orientation?: ToolbarOrientation;
19
+ /** The toolbar's accessible name, for when no better label sits in the DOM. */
20
+ label?: string;
21
+ }> & Readonly<{}>, {
22
+ orientation: ToolbarOrientation;
23
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, {
24
+ default?: (props: {}) => any;
25
+ }>;
26
+ type __VLS_WithSlots<T, S> = T & {
27
+ new (): {
28
+ $slots: S;
29
+ };
30
+ };
31
+ //# sourceMappingURL=Toolbar.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toolbar.vue.d.ts","sourceRoot":"","sources":["../../../../../packages/primitives/toolbar/src/Toolbar.vue"],"names":[],"mappings":"AA6QA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,KAAK,CAAC;AACxC,yCAAyC;AACzC,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,UAAU,CAAC;AAE3D,sEAAsE;AACtE,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,kBAAkB,CAAC;CACjC;AAED,eAAO,MAAM,eAAe,EAAE,YAAY,CAAC,cAAc,CAA0B,CAAC;wBAC/D,OAAO,YAAY;AAAxC,wBAAyC;AACzC,QAAA,MAAM,YAAY;IAmDd,oDAAoD;kBACtC,kBAAkB;IAChC,+EAA+E;YACvE,MAAM;;IAHd,oDAAoD;kBACtC,kBAAkB;IAChC,+EAA+E;YACvE,MAAM;;iBAFA,kBAAkB;;cAiNtB,CAAC,KAAK,IAAgB,KAAK,GAAG;EAYxC,CAAC;AAWL,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
@@ -0,0 +1,149 @@
1
+ import { cn } from "../../../core/src/cn.js";
2
+ import { useSplitAttrs } from "../../../core/src/attrs.js";
3
+ import "../../../core/src/index.js";
4
+ import { computed, createElementBlock, defineComponent, mergeProps, onBeforeUnmount, onMounted, openBlock, provide, ref, renderSlot, unref } from "vue";
5
+ //#region packages/primitives/toolbar/src/Toolbar.vue?vue&type=script&setup=true&lang.ts
6
+ var _hoisted_1 = ["aria-label", "aria-orientation"];
7
+ var TOOLBAR_CONTEXT = Symbol("loom-toolbar");
8
+ var Toolbar_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
9
+ inheritAttrs: false,
10
+ __name: "Toolbar",
11
+ props: {
12
+ orientation: { default: "horizontal" },
13
+ label: {}
14
+ },
15
+ setup(__props) {
16
+ const props = __props;
17
+ const { attrs, rest } = useSplitAttrs();
18
+ const ariaLabel = computed(() => rest.value["aria-label"] ?? props.label);
19
+ provide(TOOLBAR_CONTEXT, { get orientation() {
20
+ return props.orientation;
21
+ } });
22
+ const FOCUSABLE_SELECTOR = [
23
+ "a[href]",
24
+ "button:not([disabled])",
25
+ "input:not([disabled]):not([type='hidden'])",
26
+ "select:not([disabled])",
27
+ "textarea:not([disabled])",
28
+ "summary",
29
+ "[tabindex]:not([tabindex='-1'])",
30
+ "[contenteditable='true']",
31
+ "[contenteditable='']"
32
+ ].join(",");
33
+ const EDITABLE_SELECTOR = "input, select, textarea, [contenteditable='true'], [contenteditable='']";
34
+ const root = ref(null);
35
+ /** The enabled, visible controls, in DOM order — disabled and hidden ones are not in it, which is exactly "skipped but keeping their position". */
36
+ const items = ref([]);
37
+ const activeIndex = ref(0);
38
+ function participating(el) {
39
+ if (el.disabled || el.getAttribute("aria-disabled") === "true") return false;
40
+ if (el.hasAttribute("hidden") || el.closest("[aria-hidden='true']") !== null) return false;
41
+ const style = window.getComputedStyle(el);
42
+ return style.display !== "none" && style.visibility !== "hidden";
43
+ }
44
+ /** Re-collect the participating controls and re-apply the roving tab stops. */
45
+ function collect() {
46
+ const rootEl = root.value;
47
+ if (!rootEl) return;
48
+ const next = Array.from(rootEl.querySelectorAll(FOCUSABLE_SELECTOR)).filter(participating);
49
+ for (const el of items.value) if (!next.includes(el)) el.removeAttribute("tabindex");
50
+ if (activeIndex.value >= next.length) activeIndex.value = 0;
51
+ next.forEach((el, i) => {
52
+ el.tabIndex = i === activeIndex.value ? 0 : -1;
53
+ });
54
+ items.value = next;
55
+ }
56
+ let observer;
57
+ let scheduled = false;
58
+ function schedule() {
59
+ if (scheduled) return;
60
+ scheduled = true;
61
+ queueMicrotask(() => {
62
+ scheduled = false;
63
+ collect();
64
+ });
65
+ }
66
+ onMounted(() => {
67
+ collect();
68
+ observer = new MutationObserver(schedule);
69
+ observer.observe(root.value, {
70
+ childList: true,
71
+ subtree: true,
72
+ attributes: true,
73
+ attributeFilter: [
74
+ "hidden",
75
+ "disabled",
76
+ "aria-disabled",
77
+ "aria-hidden",
78
+ "href",
79
+ "type"
80
+ ]
81
+ });
82
+ });
83
+ onBeforeUnmount(() => observer?.disconnect());
84
+ function moveTo(index) {
85
+ if (!items.value.length) return;
86
+ const next = items.value[(index + items.value.length) % items.value.length];
87
+ activeIndex.value = items.value.indexOf(next);
88
+ items.value.forEach((el, i) => {
89
+ el.tabIndex = i === activeIndex.value ? 0 : -1;
90
+ });
91
+ next.focus();
92
+ }
93
+ /**
94
+ * Pointer focus has to move the roving stop too — whoever actually holds
95
+ * focus is the active control, whatever moved focus there.
96
+ */
97
+ function onFocusin(event) {
98
+ const target = event.target;
99
+ const item = items.value.indexOf(target) >= 0 ? target : target.closest(FOCUSABLE_SELECTOR);
100
+ if (item) {
101
+ activeIndex.value = items.value.indexOf(item);
102
+ items.value.forEach((el, i) => {
103
+ el.tabIndex = i === activeIndex.value ? 0 : -1;
104
+ });
105
+ }
106
+ }
107
+ function onKeydown(event) {
108
+ if (event.target.closest(EDITABLE_SELECTOR)) return;
109
+ collect();
110
+ if (!items.value.length) return;
111
+ const current = items.value.indexOf(document.activeElement);
112
+ const from = current === -1 ? 0 : current;
113
+ switch (event.key) {
114
+ case "ArrowLeft":
115
+ case "ArrowUp":
116
+ moveTo(from - 1);
117
+ break;
118
+ case "ArrowRight":
119
+ case "ArrowDown":
120
+ moveTo(from + 1);
121
+ break;
122
+ case "Home":
123
+ moveTo(0);
124
+ break;
125
+ case "End":
126
+ moveTo(items.value.length - 1);
127
+ break;
128
+ default: return;
129
+ }
130
+ event.preventDefault();
131
+ }
132
+ return (_ctx, _cache) => {
133
+ return openBlock(), createElementBlock("div", mergeProps(unref(rest), {
134
+ ref_key: "root",
135
+ ref: root,
136
+ role: "toolbar",
137
+ "aria-label": ariaLabel.value,
138
+ "aria-orientation": __props.orientation,
139
+ class: unref(cn)("inline-flex items-center gap-1 rounded-lg border border-border bg-background p-1", __props.orientation === "vertical" ? "flex-col items-stretch" : "max-w-full flex-row", unref(attrs).class),
140
+ onFocusin,
141
+ onKeydown
142
+ }), [renderSlot(_ctx.$slots, "default")], 16, _hoisted_1);
143
+ };
144
+ }
145
+ });
146
+ //#endregion
147
+ export { TOOLBAR_CONTEXT, Toolbar_vue_vue_type_script_setup_true_lang_default as default };
148
+
149
+ //# sourceMappingURL=Toolbar.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toolbar.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../../../packages/primitives/toolbar/src/Toolbar.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { InjectionKey } from \"vue\";\n/** Which axis the controls run along. */\nexport type ToolbarOrientation = \"horizontal\" | \"vertical\";\n\n/** What the toolbar hands to its slotted children — only its axis. */\nexport interface ToolbarContext {\n orientation: ToolbarOrientation;\n}\n\nexport const TOOLBAR_CONTEXT: InjectionKey<ToolbarContext> = Symbol(\"loom-toolbar\");\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, provide, ref } from \"vue\";\nimport { cn, useSplitAttrs } from \"@ecoma-io/loom-core\";\n\n/**\n * WAI-ARIA APG toolbar pattern: Tab enters the toolbar and lands on its\n * active control, Tab again leaves it, and the arrow keys walk between the\n * controls inside. For a text-format strip, a view's zoom/filter row, a\n * table's bulk actions — anywhere seven individual Tab stops would stand\n * between a keyboard user and the rest of the page.\n *\n * **Participation needs no contract on the controls.** The toolbar does not\n * wrap its children in registration components and does not require them to\n * consume an injection: on mount, on every render, and on subtree mutations\n * it collects its own focusable descendants — `button`, `input`, `select`,\n * `textarea`, links with `href`, `summary`, and anything carrying a real\n * `tabindex` — and manages their `tabindex` itself. Any control, Loom or\n * native, participates by being slotted in; that is the point of the\n * pattern, and it is why the component ships no `items` prop.\n *\n * The roving index only lands on enabled, visible items: a control disabled\n * (`disabled` or `aria-disabled=\"true\"`) or hidden (`[hidden]`,\n * `aria-hidden=\"true\"`, `display: none`, `visibility: hidden`) is skipped by\n * the arrows but keeps its position, and focus never rests on it. Visibility\n * through `getComputedStyle` is exact in a real browser; under jsdom only\n * inline styles and attributes resolve, which the unit tests work within.\n *\n * Every walk key (both arrow pairs, Home, End) is left to the control when\n * focus rests inside an editable one (`input`, `select`, `textarea`,\n * `contenteditable`) — caret movement, native `select` value stepping and\n * text-field Home/End are not the toolbar's to hijack. Tab is the way out\n * of an editable stop, as it is everywhere else.\n *\n * Wrapping is ON: an arrow at either edge carries to the opposite end, the\n * way every editor's format strip behaves. Home/End jump to the first and\n * last enabled control. Both arrow pairs work in both orientations (each\n * key maps to one direction), so `orientation` is a layout and AT-announced\n * axis, not a key-availability switch.\n *\n * The accessible name is the consumer's to supply — `label` or a\n * pass-through `aria-label` — because a toolbar names its own purpose, and\n * the component owns no other string (separators carry no text). There is\n * deliberately no labels prop: zero localisable strings, nothing to seam.\n *\n * ```vue\n * <Toolbar label=\"Text formatting\">\n * <IconButton label=\"Bold\"><BoldIcon class=\"size-4\" /></IconButton>\n * <IconButton label=\"Italic\"><ItalicIcon class=\"size-4\" /></IconButton>\n * <ToolbarSeparator />\n * <Select :options=\"zoomLevels\" aria-label=\"Zoom\" />\n * </Toolbar>\n * ```\n */\nconst props = withDefaults(\n defineProps<{\n /** Layout and announced axis of the control run. */\n orientation?: ToolbarOrientation;\n /** The toolbar's accessible name, for when no better label sits in the DOM. */\n label?: string;\n }>(),\n { orientation: \"horizontal\" },\n);\n\ndefineOptions({ inheritAttrs: false });\nconst { attrs, rest } = useSplitAttrs();\n\n// The consumer's own `aria-label` beats the `label` prop — an explicitly\n// passed attribute is the more specific intent.\nconst ariaLabel = computed(() => (rest.value[\"aria-label\"] as string | undefined) ?? props.label);\n\nprovide(TOOLBAR_CONTEXT, {\n get orientation() {\n return props.orientation;\n },\n});\n\n// One selector for every kind of control a toolbar can hold. `:not([disabled])`\n// prunes natively disabled controls at query time; the property check in\n// `participating` covers the ones an attribute cannot see — a control inside a\n// disabled `<fieldset>` reports `.disabled === true` with no attribute of its\n// own. `[tabindex]` catches custom controls that are none of the above; the\n// root itself carries none, so it never collects itself.\nconst FOCUSABLE_SELECTOR = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"input:not([disabled]):not([type='hidden'])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n \"summary\",\n \"[tabindex]:not([tabindex='-1'])\",\n \"[contenteditable='true']\",\n \"[contenteditable='']\",\n].join(\",\");\n\nconst EDITABLE_SELECTOR = \"input, select, textarea, [contenteditable='true'], [contenteditable='']\";\n\nconst root = ref<HTMLElement | null>(null);\n/** The enabled, visible controls, in DOM order — disabled and hidden ones are not in it, which is exactly \"skipped but keeping their position\". */\nconst items = ref<HTMLElement[]>([]);\nconst activeIndex = ref(0);\n\nfunction participating(el: HTMLElement): boolean {\n const maybeDisableable = el as HTMLButtonElement;\n if (maybeDisableable.disabled || el.getAttribute(\"aria-disabled\") === \"true\") return false;\n if (el.hasAttribute(\"hidden\") || el.closest(\"[aria-hidden='true']\") !== null) return false;\n // Exact in a browser; under jsdom only inline styles resolve, so the unit\n // tests drive this path with attributes and inline styles.\n const style = window.getComputedStyle(el);\n return style.display !== \"none\" && style.visibility !== \"hidden\";\n}\n\n/** Re-collect the participating controls and re-apply the roving tab stops. */\nfunction collect(): void {\n const rootEl = root.value;\n if (!rootEl) return;\n const next = Array.from(rootEl.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)).filter(\n participating,\n );\n // Anything that just left the set — it went disabled or hidden while\n // holding the roving stop — must give the stop back: an `aria-disabled`\n // control is still natively focusable, and a stale `tabindex=\"0\"` would\n // leave it a standing Tab stop the walk can never land on.\n for (const el of items.value) {\n if (!next.includes(el)) el.removeAttribute(\"tabindex\");\n }\n if (activeIndex.value >= next.length) activeIndex.value = 0;\n next.forEach((el, i) => {\n el.tabIndex = i === activeIndex.value ? 0 : -1;\n });\n items.value = next;\n}\n\n// Only structural and state attributes are watched — not `tabindex`, which\n// `collect()` itself writes: an observer reacting to its own writes would\n// loop. CSS-driven visibility changes are also missed; that limit is named in\n// the docblock and covered by the real-browser e2e instead.\nlet observer: MutationObserver | undefined;\nlet scheduled = false;\nfunction schedule(): void {\n if (scheduled) return;\n scheduled = true;\n queueMicrotask(() => {\n scheduled = false;\n collect();\n });\n}\n\nonMounted(() => {\n collect();\n observer = new MutationObserver(schedule);\n observer.observe(root.value!, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: [\"hidden\", \"disabled\", \"aria-disabled\", \"aria-hidden\", \"href\", \"type\"],\n });\n});\n\nonBeforeUnmount(() => observer?.disconnect());\n\nfunction moveTo(index: number): void {\n if (!items.value.length) return;\n // Modulo makes both edges wrap: -1 lands on the last, `length` on the first.\n const next = items.value[(index + items.value.length) % items.value.length]!;\n activeIndex.value = items.value.indexOf(next);\n items.value.forEach((el, i) => {\n el.tabIndex = i === activeIndex.value ? 0 : -1;\n });\n next.focus();\n}\n\n/**\n * Pointer focus has to move the roving stop too — whoever actually holds\n * focus is the active control, whatever moved focus there.\n */\nfunction onFocusin(event: FocusEvent): void {\n const target = event.target as Element;\n const item =\n items.value.indexOf(target as HTMLElement) >= 0\n ? (target as HTMLElement)\n : (target.closest(FOCUSABLE_SELECTOR) as HTMLElement | null);\n if (item) {\n activeIndex.value = items.value.indexOf(item);\n items.value.forEach((el, i) => {\n el.tabIndex = i === activeIndex.value ? 0 : -1;\n });\n }\n}\n\nfunction onKeydown(event: KeyboardEvent): void {\n // Arrows inside a control that consumes them — caret movement, `select`\n // value stepping — belong to that control. Tab is the exit, as always.\n if ((event.target as Element).closest(EDITABLE_SELECTOR)) return;\n collect(); // fresh on every keystroke: cheap at toolbar scale, never stale\n if (!items.value.length) return;\n const current = items.value.indexOf(document.activeElement as HTMLElement);\n const from = current === -1 ? 0 : current;\n switch (event.key) {\n case \"ArrowLeft\":\n case \"ArrowUp\":\n moveTo(from - 1);\n break;\n case \"ArrowRight\":\n case \"ArrowDown\":\n moveTo(from + 1);\n break;\n case \"Home\":\n moveTo(0);\n break;\n case \"End\":\n moveTo(items.value.length - 1);\n break;\n default:\n return; // Space, Enter and every other key are the control's own\n }\n event.preventDefault();\n}\n</script>\n\n<template>\n <!-- `role=\"toolbar\"` is the pattern's name for this container — not\n redundant on a `div`, which carries no role to repeat — and the two\n delegated handlers are the pattern's plumbing: focus and keys are\n handled once here for every control slotted inside. The rule models\n neither. The comments lead the template, which makes the component\n multi-root; attrs are bound explicitly below, so nothing is lost to\n fallthrough. -->\n <!-- eslint-disable-next-line vuejs-accessibility/no-static-element-interactions, vuejs-accessibility/no-redundant-roles -->\n <div\n v-bind=\"rest\"\n ref=\"root\"\n role=\"toolbar\"\n :aria-label=\"ariaLabel\"\n :aria-orientation=\"orientation\"\n :class=\"\n cn(\n 'inline-flex items-center gap-1 rounded-lg border border-border bg-background p-1',\n // A vertical toolbar stacks, and its separators stretch across it.\n orientation === 'vertical' ? 'flex-col items-stretch' : 'max-w-full flex-row',\n attrs.class as string,\n )\n \"\n @focusin=\"onFocusin\"\n @keydown=\"onKeydown\"\n >\n <!-- @slot The controls — any focusable element participates, no wrapper required. -->\n <slot />\n </div>\n</template>\n"],"mappings":";;;;;;AAUA,IAAa,kBAAgD,OAAO,cAAc;;;;;;;;;EAwDlF,MAAM,QAAQ;EAWd,MAAM,EAAE,OAAO,SAAS,cAAc;EAItC,MAAM,YAAY,eAAgB,KAAK,MAAM,iBAAwC,MAAM,KAAK;EAEhG,QAAQ,iBAAiB,EACvB,IAAI,cAAc;GAChB,OAAO,MAAM;EACf,EACF,CAAC;EAQD,MAAM,qBAAqB;GACzB;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF,CAAC,CAAC,KAAK,GAAG;EAEV,MAAM,oBAAoB;EAE1B,MAAM,OAAO,IAAwB,IAAI;;EAEzC,MAAM,QAAQ,IAAmB,CAAC,CAAC;EACnC,MAAM,cAAc,IAAI,CAAC;EAEzB,SAAS,cAAc,IAA0B;GAE/C,IAAI,GAAiB,YAAY,GAAG,aAAa,eAAe,MAAM,QAAQ,OAAO;GACrF,IAAI,GAAG,aAAa,QAAQ,KAAK,GAAG,QAAQ,sBAAsB,MAAM,MAAM,OAAO;GAGrF,MAAM,QAAQ,OAAO,iBAAiB,EAAE;GACxC,OAAO,MAAM,YAAY,UAAU,MAAM,eAAe;EAC1D;;EAGA,SAAS,UAAgB;GACvB,MAAM,SAAS,KAAK;GACpB,IAAI,CAAC,QAAQ;GACb,MAAM,OAAO,MAAM,KAAK,OAAO,iBAA8B,kBAAkB,CAAC,CAAC,CAAC,OAChF,aACF;GAKA,KAAK,MAAM,MAAM,MAAM,OACrB,IAAI,CAAC,KAAK,SAAS,EAAE,GAAG,GAAG,gBAAgB,UAAU;GAEvD,IAAI,YAAY,SAAS,KAAK,QAAQ,YAAY,QAAQ;GAC1D,KAAK,SAAS,IAAI,MAAM;IACtB,GAAG,WAAW,MAAM,YAAY,QAAQ,IAAI;GAC9C,CAAC;GACD,MAAM,QAAQ;EAChB;EAMA,IAAI;EACJ,IAAI,YAAY;EAChB,SAAS,WAAiB;GACxB,IAAI,WAAW;GACf,YAAY;GACZ,qBAAqB;IACnB,YAAY;IACZ,QAAQ;GACV,CAAC;EACH;EAEA,gBAAgB;GACd,QAAQ;GACR,WAAW,IAAI,iBAAiB,QAAQ;GACxC,SAAS,QAAQ,KAAK,OAAQ;IAC5B,WAAW;IACX,SAAS;IACT,YAAY;IACZ,iBAAiB;KAAC;KAAU;KAAY;KAAiB;KAAe;KAAQ;IAAM;GACxF,CAAC;EACH,CAAC;EAED,sBAAsB,UAAU,WAAW,CAAC;EAE5C,SAAS,OAAO,OAAqB;GACnC,IAAI,CAAC,MAAM,MAAM,QAAQ;GAEzB,MAAM,OAAO,MAAM,OAAO,QAAQ,MAAM,MAAM,UAAU,MAAM,MAAM;GACpE,YAAY,QAAQ,MAAM,MAAM,QAAQ,IAAI;GAC5C,MAAM,MAAM,SAAS,IAAI,MAAM;IAC7B,GAAG,WAAW,MAAM,YAAY,QAAQ,IAAI;GAC9C,CAAC;GACD,KAAK,MAAM;EACb;;;;;EAMA,SAAS,UAAU,OAAyB;GAC1C,MAAM,SAAS,MAAM;GACrB,MAAM,OACJ,MAAM,MAAM,QAAQ,MAAqB,KAAK,IACzC,SACA,OAAO,QAAQ,kBAAkB;GACxC,IAAI,MAAM;IACR,YAAY,QAAQ,MAAM,MAAM,QAAQ,IAAI;IAC5C,MAAM,MAAM,SAAS,IAAI,MAAM;KAC7B,GAAG,WAAW,MAAM,YAAY,QAAQ,IAAI;IAC9C,CAAC;GACH;EACF;EAEA,SAAS,UAAU,OAA4B;GAG7C,IAAK,MAAM,OAAmB,QAAQ,iBAAiB,GAAG;GAC1D,QAAQ;GACR,IAAI,CAAC,MAAM,MAAM,QAAQ;GACzB,MAAM,UAAU,MAAM,MAAM,QAAQ,SAAS,aAA4B;GACzE,MAAM,OAAO,YAAY,KAAK,IAAI;GAClC,QAAQ,MAAM,KAAd;IACE,KAAK;IACL,KAAK;KACH,OAAO,OAAO,CAAC;KACf;IACF,KAAK;IACL,KAAK;KACH,OAAO,OAAO,CAAC;KACf;IACF,KAAK;KACH,OAAO,CAAC;KACR;IACF,KAAK;KACH,OAAO,MAAM,MAAM,SAAS,CAAC;KAC7B;IACF,SACE;GACJ;GACA,MAAM,eAAe;EACvB;;GAYE,OAAA,UAAA,GAAA,mBAmBM,OAnBN,WACU,MAkBJ,IAAA,GAlBQ;IACR,SAAA;IAAJ,KAAI;IACJ,MAAK;IACJ,cAAY,UAAA;IACZ,oBAAkB,QAAA;IAClB,OAAc,MAAA,EAAA,CAAE,CAAA,oFAAkL,QAAA,gBAAW,aAAA,2BAAA,uBAA4E,MAAA,KAAA,CAAK,CAAC,KAAA;IAQtR;IACA;GAGV,CAAA,GAAA,CAAA,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,IAAA,UAAA"}
@@ -0,0 +1,7 @@
1
+ import ToolbarSeparator_vue_vue_type_script_setup_true_lang_default from "./ToolbarSeparator.vue_vue_type_script_setup_true_lang.js";
2
+ //#region packages/primitives/toolbar/src/ToolbarSeparator.vue
3
+ var ToolbarSeparator_default = ToolbarSeparator_vue_vue_type_script_setup_true_lang_default;
4
+ //#endregion
5
+ export { ToolbarSeparator_default as default };
6
+
7
+ //# sourceMappingURL=ToolbarSeparator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolbarSeparator.js","names":[],"sources":["../../../../../packages/primitives/toolbar/src/ToolbarSeparator.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, inject } from \"vue\";\nimport type { ToolbarContext, ToolbarOrientation } from \"./Toolbar.vue\";\nimport { TOOLBAR_CONTEXT } from \"./Toolbar.vue\";\n\n/**\n * ToolbarSeparator — the divider between groups of controls inside a\n * Toolbar. It reads the toolbar's own orientation through the context the\n * toolbar provides and draws along the perpendicular axis, so a horizontal\n * toolbar gets vertical hairlines and a vertical one gets horizontal. Its\n * `role=\"separator\"` is the one an APG toolbar wants between its groups —\n * which is why `decorative` is not offered here: inside a toolbar the line\n * is never merely visual, it IS the group boundary.\n *\n * Composing the `Separator` primitive instead of drawing the hairline here\n * was considered and rejected: the primitive binds `h-full w-px` for its\n * vertical axis, and the short, centered divider a toolbar wants would fight\n * that on Tailwind's emitted order — a coin flip, not a decision. Four lines\n * of divider here beat a class-order lottery.\n */\nconst props = defineProps<{\n /** Only for standalone use — inside a Toolbar the axis is inherited. */\n orientation?: ToolbarOrientation;\n}>();\n\nconst inherited = inject<ToolbarContext | null>(TOOLBAR_CONTEXT, null);\nconst axis = computed(\n () => props.orientation ?? (inherited ? inherited.orientation : \"horizontal\"),\n);\n</script>\n\n<template>\n <div\n role=\"separator\"\n :aria-orientation=\"axis === 'vertical' ? 'horizontal' : 'vertical'\"\n :class=\"axis === 'vertical' ? 'mx-2 h-px w-4 self-center' : 'h-4 w-px self-center'\"\n class=\"shrink-0 bg-border\"\n />\n</template>\n"],"mappings":""}
@@ -0,0 +1,24 @@
1
+ import type { ToolbarOrientation } from "./Toolbar.vue";
2
+ /**
3
+ * ToolbarSeparator — the divider between groups of controls inside a
4
+ * Toolbar. It reads the toolbar's own orientation through the context the
5
+ * toolbar provides and draws along the perpendicular axis, so a horizontal
6
+ * toolbar gets vertical hairlines and a vertical one gets horizontal. Its
7
+ * `role="separator"` is the one an APG toolbar wants between its groups —
8
+ * which is why `decorative` is not offered here: inside a toolbar the line
9
+ * is never merely visual, it IS the group boundary.
10
+ *
11
+ * Composing the `Separator` primitive instead of drawing the hairline here
12
+ * was considered and rejected: the primitive binds `h-full w-px` for its
13
+ * vertical axis, and the short, centered divider a toolbar wants would fight
14
+ * that on Tailwind's emitted order — a coin flip, not a decision. Four lines
15
+ * of divider here beat a class-order lottery.
16
+ */
17
+ type __VLS_Props = {
18
+ /** Only for standalone use — inside a Toolbar the axis is inherited. */
19
+ orientation?: ToolbarOrientation;
20
+ };
21
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
22
+ declare const _default: typeof __VLS_export;
23
+ export default _default;
24
+ //# sourceMappingURL=ToolbarSeparator.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolbarSeparator.vue.d.ts","sourceRoot":"","sources":["../../../../../packages/primitives/toolbar/src/ToolbarSeparator.vue"],"names":[],"mappings":"AA2CA,OAAO,KAAK,EAAkB,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGxE;;;;;;;;;;;;;;GAcG;AACH,KAAK,WAAW,GAAG;IACjB,wEAAwE;IACxE,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC,CAAC;AAqCF,QAAA,MAAM,YAAY,kSAEhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}