@ecoma-io/loom 0.1.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 (259) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +180 -0
  3. package/dist/a11y.d.ts +2 -0
  4. package/dist/a11y.d.ts.map +1 -0
  5. package/dist/a11y.js +2 -0
  6. package/dist/blocks/AppHeader/AppHeader.js +7 -0
  7. package/dist/blocks/AppHeader/AppHeader.js.map +1 -0
  8. package/dist/blocks/AppHeader/AppHeader.vue.d.ts +83 -0
  9. package/dist/blocks/AppHeader/AppHeader.vue.d.ts.map +1 -0
  10. package/dist/blocks/AppHeader/AppHeader.vue_vue_type_script_setup_true_lang.js +96 -0
  11. package/dist/blocks/AppHeader/AppHeader.vue_vue_type_script_setup_true_lang.js.map +1 -0
  12. package/dist/blocks/DashboardGrid/DashboardGrid.js +7 -0
  13. package/dist/blocks/DashboardGrid/DashboardGrid.js.map +1 -0
  14. package/dist/blocks/DashboardGrid/DashboardGrid.vue.d.ts +42 -0
  15. package/dist/blocks/DashboardGrid/DashboardGrid.vue.d.ts.map +1 -0
  16. package/dist/blocks/DashboardGrid/DashboardGrid.vue_vue_type_script_setup_true_lang.js +45 -0
  17. package/dist/blocks/DashboardGrid/DashboardGrid.vue_vue_type_script_setup_true_lang.js.map +1 -0
  18. package/dist/blocks/EmptyState/EmptyState.js +7 -0
  19. package/dist/blocks/EmptyState/EmptyState.js.map +1 -0
  20. package/dist/blocks/EmptyState/EmptyState.vue.d.ts +50 -0
  21. package/dist/blocks/EmptyState/EmptyState.vue.d.ts.map +1 -0
  22. package/dist/blocks/EmptyState/EmptyState.vue_vue_type_script_setup_true_lang.js +71 -0
  23. package/dist/blocks/EmptyState/EmptyState.vue_vue_type_script_setup_true_lang.js.map +1 -0
  24. package/dist/blocks/PageHeader/PageHeader.js +7 -0
  25. package/dist/blocks/PageHeader/PageHeader.js.map +1 -0
  26. package/dist/blocks/PageHeader/PageHeader.vue.d.ts +54 -0
  27. package/dist/blocks/PageHeader/PageHeader.vue.d.ts.map +1 -0
  28. package/dist/blocks/PageHeader/PageHeader.vue_vue_type_script_setup_true_lang.js +68 -0
  29. package/dist/blocks/PageHeader/PageHeader.vue_vue_type_script_setup_true_lang.js.map +1 -0
  30. package/dist/blocks/RowActions/RowActions.js +7 -0
  31. package/dist/blocks/RowActions/RowActions.js.map +1 -0
  32. package/dist/blocks/RowActions/RowActions.vue.d.ts +14 -0
  33. package/dist/blocks/RowActions/RowActions.vue.d.ts.map +1 -0
  34. package/dist/blocks/RowActions/RowActions.vue_vue_type_script_setup_true_lang.js +47 -0
  35. package/dist/blocks/RowActions/RowActions.vue_vue_type_script_setup_true_lang.js.map +1 -0
  36. package/dist/blocks/SidebarNav/SidebarNav.js +7 -0
  37. package/dist/blocks/SidebarNav/SidebarNav.js.map +1 -0
  38. package/dist/blocks/SidebarNav/SidebarNav.vue.d.ts +40 -0
  39. package/dist/blocks/SidebarNav/SidebarNav.vue.d.ts.map +1 -0
  40. package/dist/blocks/SidebarNav/SidebarNav.vue_vue_type_script_setup_true_lang.js +125 -0
  41. package/dist/blocks/SidebarNav/SidebarNav.vue_vue_type_script_setup_true_lang.js.map +1 -0
  42. package/dist/blocks/TitleBar/TitleBar.js +7 -0
  43. package/dist/blocks/TitleBar/TitleBar.js.map +1 -0
  44. package/dist/blocks/TitleBar/TitleBar.vue.d.ts +49 -0
  45. package/dist/blocks/TitleBar/TitleBar.vue.d.ts.map +1 -0
  46. package/dist/blocks/TitleBar/TitleBar.vue_vue_type_script_setup_true_lang.js +66 -0
  47. package/dist/blocks/TitleBar/TitleBar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  48. package/dist/blocks/ToastStack/ToastStack.js +7 -0
  49. package/dist/blocks/ToastStack/ToastStack.js.map +1 -0
  50. package/dist/blocks/ToastStack/ToastStack.vue.d.ts +24 -0
  51. package/dist/blocks/ToastStack/ToastStack.vue.d.ts.map +1 -0
  52. package/dist/blocks/ToastStack/ToastStack.vue_vue_type_script_setup_true_lang.js +38 -0
  53. package/dist/blocks/ToastStack/ToastStack.vue_vue_type_script_setup_true_lang.js.map +1 -0
  54. package/dist/icons/BrandMark.d.ts +18 -0
  55. package/dist/icons/BrandMark.d.ts.map +1 -0
  56. package/dist/icons/BrandMark.js +47 -0
  57. package/dist/icons/BrandMark.js.map +1 -0
  58. package/dist/index.d.ts +75 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +46 -0
  61. package/dist/lib/a11y-scope.d.ts +19 -0
  62. package/dist/lib/a11y-scope.d.ts.map +1 -0
  63. package/dist/lib/a11y-scope.js +28 -0
  64. package/dist/lib/a11y-scope.js.map +1 -0
  65. package/dist/lib/attrs.d.ts +18 -0
  66. package/dist/lib/attrs.d.ts.map +1 -0
  67. package/dist/lib/attrs.js +28 -0
  68. package/dist/lib/attrs.js.map +1 -0
  69. package/dist/lib/cn.d.ts +9 -0
  70. package/dist/lib/cn.d.ts.map +1 -0
  71. package/dist/lib/cn.js +16 -0
  72. package/dist/lib/cn.js.map +1 -0
  73. package/dist/lib/icon-defaults.d.ts +22 -0
  74. package/dist/lib/icon-defaults.d.ts.map +1 -0
  75. package/dist/lib/icon-defaults.js +32 -0
  76. package/dist/lib/icon-defaults.js.map +1 -0
  77. package/dist/lib/motion.d.ts +14 -0
  78. package/dist/lib/motion.d.ts.map +1 -0
  79. package/dist/lib/motion.js +20 -0
  80. package/dist/lib/motion.js.map +1 -0
  81. package/dist/lib/props.d.ts +31 -0
  82. package/dist/lib/props.d.ts.map +1 -0
  83. package/dist/lib/props.js +37 -0
  84. package/dist/lib/props.js.map +1 -0
  85. package/dist/primitives/Avatar/Avatar.js +7 -0
  86. package/dist/primitives/Avatar/Avatar.js.map +1 -0
  87. package/dist/primitives/Avatar/Avatar.vue.d.ts +27 -0
  88. package/dist/primitives/Avatar/Avatar.vue.d.ts.map +1 -0
  89. package/dist/primitives/Avatar/Avatar.vue_vue_type_script_setup_true_lang.js +33 -0
  90. package/dist/primitives/Avatar/Avatar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  91. package/dist/primitives/Badge/Badge.js +7 -0
  92. package/dist/primitives/Badge/Badge.js.map +1 -0
  93. package/dist/primitives/Badge/Badge.vue.d.ts +27 -0
  94. package/dist/primitives/Badge/Badge.vue.d.ts.map +1 -0
  95. package/dist/primitives/Badge/Badge.vue_vue_type_script_setup_true_lang.js +30 -0
  96. package/dist/primitives/Badge/Badge.vue_vue_type_script_setup_true_lang.js.map +1 -0
  97. package/dist/primitives/Button/Button.js +7 -0
  98. package/dist/primitives/Button/Button.js.map +1 -0
  99. package/dist/primitives/Button/Button.vue.d.ts +70 -0
  100. package/dist/primitives/Button/Button.vue.d.ts.map +1 -0
  101. package/dist/primitives/Button/Button.vue_vue_type_script_setup_true_lang.js +122 -0
  102. package/dist/primitives/Button/Button.vue_vue_type_script_setup_true_lang.js.map +1 -0
  103. package/dist/primitives/Checkbox/Checkbox.js +7 -0
  104. package/dist/primitives/Checkbox/Checkbox.js.map +1 -0
  105. package/dist/primitives/Checkbox/Checkbox.vue.d.ts +34 -0
  106. package/dist/primitives/Checkbox/Checkbox.vue.d.ts.map +1 -0
  107. package/dist/primitives/Checkbox/Checkbox.vue_vue_type_script_setup_true_lang.js +94 -0
  108. package/dist/primitives/Checkbox/Checkbox.vue_vue_type_script_setup_true_lang.js.map +1 -0
  109. package/dist/primitives/Dialog/Dialog.js +7 -0
  110. package/dist/primitives/Dialog/Dialog.js.map +1 -0
  111. package/dist/primitives/Dialog/Dialog.vue.d.ts +58 -0
  112. package/dist/primitives/Dialog/Dialog.vue.d.ts.map +1 -0
  113. package/dist/primitives/Dialog/Dialog.vue_vue_type_script_setup_true_lang.js +88 -0
  114. package/dist/primitives/Dialog/Dialog.vue_vue_type_script_setup_true_lang.js.map +1 -0
  115. package/dist/primitives/DropdownMenu/DropdownMenu.js +7 -0
  116. package/dist/primitives/DropdownMenu/DropdownMenu.js.map +1 -0
  117. package/dist/primitives/DropdownMenu/DropdownMenu.vue.d.ts +55 -0
  118. package/dist/primitives/DropdownMenu/DropdownMenu.vue.d.ts.map +1 -0
  119. package/dist/primitives/DropdownMenu/DropdownMenu.vue_vue_type_script_setup_true_lang.js +82 -0
  120. package/dist/primitives/DropdownMenu/DropdownMenu.vue_vue_type_script_setup_true_lang.js.map +1 -0
  121. package/dist/primitives/Field/Field.js +7 -0
  122. package/dist/primitives/Field/Field.js.map +1 -0
  123. package/dist/primitives/Field/Field.vue.d.ts +53 -0
  124. package/dist/primitives/Field/Field.vue.d.ts.map +1 -0
  125. package/dist/primitives/Field/Field.vue_vue_type_script_setup_true_lang.js +84 -0
  126. package/dist/primitives/Field/Field.vue_vue_type_script_setup_true_lang.js.map +1 -0
  127. package/dist/primitives/InlineError/InlineError.js +7 -0
  128. package/dist/primitives/InlineError/InlineError.js.map +1 -0
  129. package/dist/primitives/InlineError/InlineError.vue.d.ts +32 -0
  130. package/dist/primitives/InlineError/InlineError.vue.d.ts.map +1 -0
  131. package/dist/primitives/InlineError/InlineError.vue_vue_type_script_setup_true_lang.js +44 -0
  132. package/dist/primitives/InlineError/InlineError.vue_vue_type_script_setup_true_lang.js.map +1 -0
  133. package/dist/primitives/Menubar/Menubar.js +7 -0
  134. package/dist/primitives/Menubar/Menubar.js.map +1 -0
  135. package/dist/primitives/Menubar/Menubar.vue.d.ts +41 -0
  136. package/dist/primitives/Menubar/Menubar.vue.d.ts.map +1 -0
  137. package/dist/primitives/Menubar/Menubar.vue_vue_type_script_setup_true_lang.js +184 -0
  138. package/dist/primitives/Menubar/Menubar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  139. package/dist/primitives/NumberField/NumberField.js +7 -0
  140. package/dist/primitives/NumberField/NumberField.js.map +1 -0
  141. package/dist/primitives/NumberField/NumberField.vue.d.ts +47 -0
  142. package/dist/primitives/NumberField/NumberField.vue.d.ts.map +1 -0
  143. package/dist/primitives/NumberField/NumberField.vue_vue_type_script_setup_true_lang.js +204 -0
  144. package/dist/primitives/NumberField/NumberField.vue_vue_type_script_setup_true_lang.js.map +1 -0
  145. package/dist/primitives/Popover/Popover.js +7 -0
  146. package/dist/primitives/Popover/Popover.js.map +1 -0
  147. package/dist/primitives/Popover/Popover.vue.d.ts +61 -0
  148. package/dist/primitives/Popover/Popover.vue.d.ts.map +1 -0
  149. package/dist/primitives/Popover/Popover.vue_vue_type_script_setup_true_lang.js +59 -0
  150. package/dist/primitives/Popover/Popover.vue_vue_type_script_setup_true_lang.js.map +1 -0
  151. package/dist/primitives/Progress/Progress.js +7 -0
  152. package/dist/primitives/Progress/Progress.js.map +1 -0
  153. package/dist/primitives/Progress/Progress.vue.d.ts +30 -0
  154. package/dist/primitives/Progress/Progress.vue.d.ts.map +1 -0
  155. package/dist/primitives/Progress/Progress.vue_vue_type_script_setup_true_lang.js +67 -0
  156. package/dist/primitives/Progress/Progress.vue_vue_type_script_setup_true_lang.js.map +1 -0
  157. package/dist/primitives/RadioGroup/RadioGroup.js +7 -0
  158. package/dist/primitives/RadioGroup/RadioGroup.js.map +1 -0
  159. package/dist/primitives/RadioGroup/RadioGroup.vue.d.ts +39 -0
  160. package/dist/primitives/RadioGroup/RadioGroup.vue.d.ts.map +1 -0
  161. package/dist/primitives/RadioGroup/RadioGroup.vue_vue_type_script_setup_true_lang.js +63 -0
  162. package/dist/primitives/RadioGroup/RadioGroup.vue_vue_type_script_setup_true_lang.js.map +1 -0
  163. package/dist/primitives/SegmentedControl/SegmentedControl.js +7 -0
  164. package/dist/primitives/SegmentedControl/SegmentedControl.js.map +1 -0
  165. package/dist/primitives/SegmentedControl/SegmentedControl.vue.d.ts +40 -0
  166. package/dist/primitives/SegmentedControl/SegmentedControl.vue.d.ts.map +1 -0
  167. package/dist/primitives/SegmentedControl/SegmentedControl.vue_vue_type_script_setup_true_lang.js +89 -0
  168. package/dist/primitives/SegmentedControl/SegmentedControl.vue_vue_type_script_setup_true_lang.js.map +1 -0
  169. package/dist/primitives/Select/Select.js +7 -0
  170. package/dist/primitives/Select/Select.js.map +1 -0
  171. package/dist/primitives/Select/Select.vue.d.ts +56 -0
  172. package/dist/primitives/Select/Select.vue.d.ts.map +1 -0
  173. package/dist/primitives/Select/Select.vue_vue_type_script_setup_true_lang.js +122 -0
  174. package/dist/primitives/Select/Select.vue_vue_type_script_setup_true_lang.js.map +1 -0
  175. package/dist/primitives/Separator/Separator.js +7 -0
  176. package/dist/primitives/Separator/Separator.js.map +1 -0
  177. package/dist/primitives/Separator/Separator.vue.d.ts +19 -0
  178. package/dist/primitives/Separator/Separator.vue.d.ts.map +1 -0
  179. package/dist/primitives/Separator/Separator.vue_vue_type_script_setup_true_lang.js +31 -0
  180. package/dist/primitives/Separator/Separator.vue_vue_type_script_setup_true_lang.js.map +1 -0
  181. package/dist/primitives/Skeleton/Skeleton.js +7 -0
  182. package/dist/primitives/Skeleton/Skeleton.js.map +1 -0
  183. package/dist/primitives/Skeleton/Skeleton.vue.d.ts +16 -0
  184. package/dist/primitives/Skeleton/Skeleton.vue.d.ts.map +1 -0
  185. package/dist/primitives/Skeleton/Skeleton.vue_vue_type_script_setup_true_lang.js +37 -0
  186. package/dist/primitives/Skeleton/Skeleton.vue_vue_type_script_setup_true_lang.js.map +1 -0
  187. package/dist/primitives/Slider/Slider.js +7 -0
  188. package/dist/primitives/Slider/Slider.js.map +1 -0
  189. package/dist/primitives/Slider/Slider.vue.d.ts +58 -0
  190. package/dist/primitives/Slider/Slider.vue.d.ts.map +1 -0
  191. package/dist/primitives/Slider/Slider.vue_vue_type_script_setup_true_lang.js +137 -0
  192. package/dist/primitives/Slider/Slider.vue_vue_type_script_setup_true_lang.js.map +1 -0
  193. package/dist/primitives/Spinner/Spinner.js +7 -0
  194. package/dist/primitives/Spinner/Spinner.js.map +1 -0
  195. package/dist/primitives/Spinner/Spinner.vue.d.ts +21 -0
  196. package/dist/primitives/Spinner/Spinner.vue.d.ts.map +1 -0
  197. package/dist/primitives/Spinner/Spinner.vue_vue_type_script_setup_true_lang.js +63 -0
  198. package/dist/primitives/Spinner/Spinner.vue_vue_type_script_setup_true_lang.js.map +1 -0
  199. package/dist/primitives/Surface/Surface.js +7 -0
  200. package/dist/primitives/Surface/Surface.js.map +1 -0
  201. package/dist/primitives/Surface/Surface.vue.d.ts +42 -0
  202. package/dist/primitives/Surface/Surface.vue.d.ts.map +1 -0
  203. package/dist/primitives/Surface/Surface.vue_vue_type_script_setup_true_lang.js +48 -0
  204. package/dist/primitives/Surface/Surface.vue_vue_type_script_setup_true_lang.js.map +1 -0
  205. package/dist/primitives/Switch/Switch.js +7 -0
  206. package/dist/primitives/Switch/Switch.js.map +1 -0
  207. package/dist/primitives/Switch/Switch.vue.d.ts +24 -0
  208. package/dist/primitives/Switch/Switch.vue.d.ts.map +1 -0
  209. package/dist/primitives/Switch/Switch.vue_vue_type_script_setup_true_lang.js +44 -0
  210. package/dist/primitives/Switch/Switch.vue_vue_type_script_setup_true_lang.js.map +1 -0
  211. package/dist/primitives/Tabs/Tabs.js +7 -0
  212. package/dist/primitives/Tabs/Tabs.js.map +1 -0
  213. package/dist/primitives/Tabs/Tabs.vue.d.ts +33 -0
  214. package/dist/primitives/Tabs/Tabs.vue.d.ts.map +1 -0
  215. package/dist/primitives/Tabs/Tabs.vue_vue_type_script_setup_true_lang.js +54 -0
  216. package/dist/primitives/Tabs/Tabs.vue_vue_type_script_setup_true_lang.js.map +1 -0
  217. package/dist/primitives/TextField/TextField.js +7 -0
  218. package/dist/primitives/TextField/TextField.js.map +1 -0
  219. package/dist/primitives/TextField/TextField.vue.d.ts +58 -0
  220. package/dist/primitives/TextField/TextField.vue.d.ts.map +1 -0
  221. package/dist/primitives/TextField/TextField.vue_vue_type_script_setup_true_lang.js +71 -0
  222. package/dist/primitives/TextField/TextField.vue_vue_type_script_setup_true_lang.js.map +1 -0
  223. package/dist/primitives/Textarea/Textarea.js +7 -0
  224. package/dist/primitives/Textarea/Textarea.js.map +1 -0
  225. package/dist/primitives/Textarea/Textarea.vue.d.ts +48 -0
  226. package/dist/primitives/Textarea/Textarea.vue.d.ts.map +1 -0
  227. package/dist/primitives/Textarea/Textarea.vue_vue_type_script_setup_true_lang.js +54 -0
  228. package/dist/primitives/Textarea/Textarea.vue_vue_type_script_setup_true_lang.js.map +1 -0
  229. package/dist/primitives/Toast/Toast.js +7 -0
  230. package/dist/primitives/Toast/Toast.js.map +1 -0
  231. package/dist/primitives/Toast/Toast.vue.d.ts +46 -0
  232. package/dist/primitives/Toast/Toast.vue.d.ts.map +1 -0
  233. package/dist/primitives/Toast/Toast.vue_vue_type_script_setup_true_lang.js +52 -0
  234. package/dist/primitives/Toast/Toast.vue_vue_type_script_setup_true_lang.js.map +1 -0
  235. package/dist/primitives/Toast/ToastItem.js +7 -0
  236. package/dist/primitives/Toast/ToastItem.js.map +1 -0
  237. package/dist/primitives/Toast/ToastItem.vue.d.ts +38 -0
  238. package/dist/primitives/Toast/ToastItem.vue.d.ts.map +1 -0
  239. package/dist/primitives/Toast/ToastItem.vue_vue_type_script_setup_true_lang.js +114 -0
  240. package/dist/primitives/Toast/ToastItem.vue_vue_type_script_setup_true_lang.js.map +1 -0
  241. package/dist/primitives/Tooltip/Tooltip.js +7 -0
  242. package/dist/primitives/Tooltip/Tooltip.js.map +1 -0
  243. package/dist/primitives/Tooltip/Tooltip.vue.d.ts +52 -0
  244. package/dist/primitives/Tooltip/Tooltip.vue.d.ts.map +1 -0
  245. package/dist/primitives/Tooltip/Tooltip.vue_vue_type_script_setup_true_lang.js +56 -0
  246. package/dist/primitives/Tooltip/Tooltip.vue_vue_type_script_setup_true_lang.js.map +1 -0
  247. package/dist/primitives/WindowControls/WindowControls.js +7 -0
  248. package/dist/primitives/WindowControls/WindowControls.js.map +1 -0
  249. package/dist/primitives/WindowControls/WindowControls.vue.d.ts +41 -0
  250. package/dist/primitives/WindowControls/WindowControls.vue.d.ts.map +1 -0
  251. package/dist/primitives/WindowControls/WindowControls.vue_vue_type_script_setup_true_lang.js +111 -0
  252. package/dist/primitives/WindowControls/WindowControls.vue_vue_type_script_setup_true_lang.js.map +1 -0
  253. package/dist/styles/fonts/Geist-Variable.woff2 +0 -0
  254. package/dist/styles/fonts/GeistMono-Variable.woff2 +0 -0
  255. package/dist/styles/fonts/OFL.txt +92 -0
  256. package/dist/styles/fonts.css +30 -0
  257. package/dist/styles/global.css +181 -0
  258. package/dist/styles/theme.css +212 -0
  259. package/package.json +123 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Popover.vue.d.ts","sourceRoot":"","sources":["../../../src/primitives/Popover/Popover.vue"],"names":[],"mappings":"AA4GA;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE9D,4CAA4C;AAC5C,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;wBACjC,OAAO,YAAY;AAAxC,wBAAyC;AACzC,QAAA,MAAM,YAAY;IAiBd,qGAAqG;WAC9F,OAAO,GAAG,SAAS;IAC1B,4EAA4E;WACrE,WAAW;IAClB,sGAAsG;YAC9F,YAAY;IACpB,uDAAuD;iBAC1C,MAAM;IACnB,kGAAkG;YAC1F,OAAO;;;;IATf,qGAAqG;WAC9F,OAAO,GAAG,SAAS;IAC1B,4EAA4E;WACrE,WAAW;IAClB,sGAAsG;YAC9F,YAAY;IACpB,uDAAuD;iBAC1C,MAAM;IACnB,kGAAkG;YAC1F,OAAO;;;;UARR,OAAO,GAAG,SAAS;UAEnB,WAAW;gBAIL,MAAM;WAFX,YAAY;WAIZ,OAAO;;cAqKL,CAAC,KAAK,IAAiB,KAAK,GAAG;;cAC/B,CAAC,KAAK,IAAiB,KAAK,GAAG;EAWzC,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,59 @@
1
+ import { cn } from "../../lib/cn.js";
2
+ import { optional } from "../../lib/props.js";
3
+ import { createBlock, createCommentVNode, createVNode, defineComponent, mergeProps, normalizeClass, openBlock, renderSlot, unref, withCtx } from "vue";
4
+ import { PopoverArrow, PopoverContent, PopoverPortal, PopoverRoot, PopoverTrigger } from "reka-ui";
5
+ //#region src/primitives/Popover/Popover.vue?vue&type=script&setup=true&lang.ts
6
+ var Popover_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
7
+ __name: "Popover",
8
+ props: {
9
+ open: {
10
+ type: Boolean,
11
+ default: void 0
12
+ },
13
+ side: { default: "bottom" },
14
+ align: { default: "center" },
15
+ sideOffset: { default: 6 },
16
+ arrow: {
17
+ type: Boolean,
18
+ default: true
19
+ }
20
+ },
21
+ emits: ["update:open"],
22
+ setup(__props) {
23
+ return (_ctx, _cache) => {
24
+ return openBlock(), createBlock(unref(PopoverRoot), mergeProps(unref(optional)({ open: __props.open }), { "onUpdate:open": _cache[0] || (_cache[0] = ($event) => _ctx.$emit("update:open", $event)) }), {
25
+ default: withCtx(() => [createVNode(unref(PopoverTrigger), { "as-child": "" }, {
26
+ default: withCtx(() => [renderSlot(_ctx.$slots, "trigger")]),
27
+ _: 3
28
+ }), createVNode(unref(PopoverPortal), null, {
29
+ default: withCtx(() => [createVNode(unref(PopoverContent), {
30
+ side: __props.side,
31
+ align: __props.align,
32
+ "side-offset": __props.sideOffset,
33
+ class: normalizeClass(unref(cn)("z-50 min-w-[12rem] max-w-[min(90vw,22rem)] rounded-md border border-border bg-popover p-3 text-sm text-popover-foreground shadow-md outline-none", "data-[state=open]:animate-scale-in")),
34
+ style: { "transform-origin": "var(--reka-popper-transform-origin)" }
35
+ }, {
36
+ default: withCtx(() => [renderSlot(_ctx.$slots, "default"), __props.arrow ? (openBlock(), createBlock(unref(PopoverArrow), {
37
+ key: 0,
38
+ class: "fill-popover",
39
+ width: 12,
40
+ height: 6
41
+ })) : createCommentVNode("", true)]),
42
+ _: 3
43
+ }, 8, [
44
+ "side",
45
+ "align",
46
+ "side-offset",
47
+ "class"
48
+ ])]),
49
+ _: 3
50
+ })]),
51
+ _: 3
52
+ }, 16);
53
+ };
54
+ }
55
+ });
56
+ //#endregion
57
+ export { Popover_vue_vue_type_script_setup_true_lang_default as default };
58
+
59
+ //# sourceMappingURL=Popover.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Popover.vue_vue_type_script_setup_true_lang.js","names":["$emit"],"sources":["../../../src/primitives/Popover/Popover.vue"],"sourcesContent":["<script lang=\"ts\">\n/**\n * Which edge of the trigger the panel prefers. It is a preference and not a\n * guarantee: Reka flips the panel to the opposite edge when it would collide\n * with the viewport, which is why a caller sets the side it *wants* rather\n * than the side it will get.\n *\n * The members mirror Reka's own `Side`. Nothing enforces that in this\n * declaration — the template binding does: give this union a member Reka does\n * not accept and `:side=\"side\"` stops type-checking. Declaring it here rather\n * than aliasing `PopoverContentProps[\"side\"]` is what puts the four values in\n * the generated props table, because the documentation reads syntax and an\n * indexed access type has none to read.\n */\nexport type PopoverSide = \"top\" | \"right\" | \"bottom\" | \"left\";\n\n/** Where the panel sits along that edge. */\nexport type PopoverAlign = \"start\" | \"center\" | \"end\";\n</script>\n\n<script setup lang=\"ts\">\nimport { PopoverRoot, PopoverTrigger, PopoverPortal, PopoverContent, PopoverArrow } from \"reka-ui\";\nimport { cn } from \"../../lib/cn\";\nimport { optional } from \"../../lib/props\";\n\n/**\n * Popover — a floating panel anchored to a trigger, carrying secondary content\n * the user opts into: a filter set, a colour picker, a details card.\n *\n * The escape contract, which is the whole reason to reach for an overlay\n * primitive rather than an absolutely positioned div: opening moves focus into\n * the panel, Esc and an outside click both close it, closing returns focus to\n * the trigger, and the page behind keeps scrolling because a popover is not\n * modal. Focus is *not* trapped — Tab leaves the panel, which is correct for\n * content the user can walk past. `Dialog` is the one that traps.\n *\n * Reach for `DropdownMenu` when the panel is a list of commands, `Tooltip` for\n * a hint that must not take focus at all, and `Dialog` when the task has to\n * block the rest of the UI.\n */\nwithDefaults(\n defineProps<{\n /** Drive the panel from the host with `v-model:open`; omit it and the popover owns its own state. */\n open?: boolean | undefined;\n /** The edge of the trigger to anchor against, before collision flipping. */\n side?: PopoverSide;\n /** Where the panel sits along that edge — `start` keeps its leading edge flush with the trigger's. */\n align?: PopoverAlign;\n /** Gap in pixels between the trigger and the panel. */\n sideOffset?: number;\n /** Draw the pointer notch. Turn it off where the panel reads better flush against its trigger. */\n arrow?: boolean;\n }>(),\n // `open: undefined` is load-bearing, not a redundant default — it is what\n // keeps the uncontrolled third state reachable past Vue's absent-Boolean\n // casting. `optional()` in the template is the other half; its docblock\n // carries the reasoning for both.\n { open: undefined, side: \"bottom\", align: \"center\", sideOffset: 6, arrow: true },\n);\n\ndefineEmits<{ \"update:open\": [value: boolean] }>();\n</script>\n\n<template>\n <PopoverRoot v-bind=\"optional({ open })\" @update:open=\"$emit('update:open', $event)\">\n <!-- @slot The control that opens the panel. Rendered `as-child`, so the\n caller's own element *is* the trigger and no wrapper swallows its\n accessible name. -->\n <PopoverTrigger as-child>\n <slot name=\"trigger\" />\n </PopoverTrigger>\n\n <PopoverPortal>\n <PopoverContent\n :side=\"side\"\n :align=\"align\"\n :side-offset=\"sideOffset\"\n :class=\"\n cn(\n 'z-50 min-w-[12rem] max-w-[min(90vw,22rem)] rounded-md border border-border bg-popover p-3 text-sm text-popover-foreground shadow-md outline-none',\n // Scoped to the open state, never unconditional. Reka's Presence\n // keeps closed content mounted until an animationend arrives, and a\n // mount-only animation never fires a second one — so an\n // unconditional animation class strands an invisible panel over the\n // page, swallowing clicks. Scoped, the closed element computes\n // `animation-name: none` and Presence takes its immediate-unmount\n // branch instead. The origin below is what makes that scale grow\n // out of the trigger rather than out of the panel's own centre.\n 'data-[state=open]:animate-scale-in',\n )\n \"\n style=\"transform-origin: var(--reka-popper-transform-origin)\"\n >\n <!-- @slot The panel body. -->\n <slot />\n <PopoverArrow v-if=\"arrow\" class=\"fill-popover\" :width=\"12\" :height=\"6\" />\n </PopoverContent>\n </PopoverPortal>\n </PopoverRoot>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;GAgEE,OAAA,UAAA,GAAA,YAkCc,MAAA,WAAA,GAlCd,WAAqB,MAkCP,QAAA,CAlCe,CAAA,EAAA,MAAG,QAAA,KAAI,CAAA,GAAA,EAAM,iBAAW,OAAA,OAAA,OAAA,MAAA,WAAEA,KAAAA,MAAK,eAAgB,MAAM,GAAA,CAAA,GAAA;IAIhF,SAAA,cAEiB,CAFjB,YAEiB,MAAA,cAAA,GAAA,EAFD,YAAA,GAAQ,GAAA;KACtB,SAAA,cAAuB,CAAvB,WAAuB,KAAA,QAAA,SAAA,CAAA,CAAA;;IAGzB,CAAA,GAAA,YAyBgB,MAAA,aAAA,GAAA,MAAA;KAxBd,SAAA,cAuBiB,CAvBjB,YAuBiB,MAAA,cAAA,GAAA;MAtBd,MAAM,QAAA;MACN,OAAO,QAAA;MACP,eAAa,QAAA;MACb,OAAK,eAAa,MAAA,EAAA,CAAE,CAAA,oJAAA,oCAAA,CAAA;MAcrB,OAAA,EAAA,oBAAA,sCAAA;;MAGA,SAAA,cAAQ,CAAR,WAAQ,KAAA,QAAA,SAAA,GACY,QAAA,SAApB,UAAA,GAAA,YAA0E,MAAA,YAAA,GAAA;;OAA/C,OAAM;OAAgB,OAAO;OAAK,QAAQ"}
@@ -0,0 +1,7 @@
1
+ import Progress_vue_vue_type_script_setup_true_lang_default from "./Progress.vue_vue_type_script_setup_true_lang.js";
2
+ //#region src/primitives/Progress/Progress.vue
3
+ var Progress_default = Progress_vue_vue_type_script_setup_true_lang_default;
4
+ //#endregion
5
+ export { Progress_default as default };
6
+
7
+ //# sourceMappingURL=Progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Progress.js","names":[],"sources":["../../../src/primitives/Progress/Progress.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { ProgressRoot, ProgressIndicator } from \"reka-ui\";\nimport { cn } from \"../../lib/cn\";\n\n/**\n * Progress — determinate progress bar for a task whose extent as a percentage\n * is known (upload %, step 3 of 5). `modelValue` null/undefined renders the\n * *indeterminate* state — an empty track, since there is no percentage yet to\n * paint. For a wait of unknown duration with no percentage at all, use\n * Spinner instead of guessing a Progress value.\n *\n * Built on Reka UI's Progress: role=\"progressbar\" + aria-valuenow/min/max set\n * on the root automatically. `ariaLabel`/`ariaLabelledby` are bound onto\n * ProgressRoot (fallthrough overrides Reka's own generated \"`NN%`\" label) so\n * the accessible name describes *what* is loading, not just how much.\n */\nconst props = withDefaults(\n defineProps<{\n /** The completed amount, 0–`max`; `null`/omitted renders indeterminate. */\n modelValue?: number | null;\n /** The value that reads as 100% complete. */\n max?: number;\n /** Accessible name describing the task, overriding Reka's default `NN%` label. */\n ariaLabel?: string;\n /** Accessible name sourced from another element's id, in place of `ariaLabel`. */\n ariaLabelledby?: string;\n }>(),\n {\n max: 100,\n },\n);\n\n/**\n * The value the bar itself is given, clamped into [0, max]; null while\n * indeterminate. The clamp has to happen here rather than only on the way to\n * the transform below: `aria-valuenow` is generated from whatever ProgressRoot\n * receives, so handing it the raw prop announces a number outside the range\n * `aria-valuemin`/`aria-valuemax` declare — \"150 percent\" read out over a bar\n * painted at 100.\n */\nconst value = computed<number | null>(() =>\n props.modelValue === null || props.modelValue === undefined\n ? null\n : Math.min(Math.max(props.modelValue, 0), props.max),\n);\n\n/** Percentage 0–100, derived from the clamped value; null while indeterminate. */\nconst pct = computed<number | null>(() =>\n value.value === null ? null : (value.value / props.max) * 100,\n);\n\ndefineExpose({ pct });\n</script>\n\n<template>\n <ProgressRoot\n :model-value=\"value\"\n :max=\"max\"\n :aria-label=\"ariaLabel\"\n :aria-labelledby=\"ariaLabelledby\"\n class=\"relative h-2 w-full overflow-hidden rounded-full bg-muted\"\n >\n <!-- Determinate: a full-width bar slid left by the remaining percentage\n (transform eased over --duration-slow). Indeterminate: a short segment\n sweeping the track on a loop, since there is no percentage to paint.\n Completion beat: at 100% the fill turns success (Loom dual-force\n law — a finished piece of work reads as done at a glance), eased in\n over the same --duration-slow lane via the background transition. -->\n <ProgressIndicator\n :class=\"\n cn(\n 'h-full',\n pct === 100 ? 'bg-success' : 'bg-primary',\n pct === null && 'w-1/3 animate-progress-indeterminate rounded-full',\n )\n \"\n :style=\"\n pct === null\n ? undefined\n : {\n transition:\n 'transform var(--duration-slow) var(--ease-out), background-color var(--duration-slow) var(--ease-out)',\n transform: `translateX(-${100 - pct}%)`,\n }\n \"\n />\n </ProgressRoot>\n</template>\n"],"mappings":""}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Progress — determinate progress bar for a task whose extent as a percentage
3
+ * is known (upload %, step 3 of 5). `modelValue` null/undefined renders the
4
+ * *indeterminate* state — an empty track, since there is no percentage yet to
5
+ * paint. For a wait of unknown duration with no percentage at all, use
6
+ * Spinner instead of guessing a Progress value.
7
+ *
8
+ * Built on Reka UI's Progress: role="progressbar" + aria-valuenow/min/max set
9
+ * on the root automatically. `ariaLabel`/`ariaLabelledby` are bound onto
10
+ * ProgressRoot (fallthrough overrides Reka's own generated "`NN%`" label) so
11
+ * the accessible name describes *what* is loading, not just how much.
12
+ */
13
+ type __VLS_Props = {
14
+ /** The completed amount, 0–`max`; `null`/omitted renders indeterminate. */
15
+ modelValue?: number | null;
16
+ /** The value that reads as 100% complete. */
17
+ max?: number;
18
+ /** Accessible name describing the task, overriding Reka's default `NN%` label. */
19
+ ariaLabel?: string;
20
+ /** Accessible name sourced from another element's id, in place of `ariaLabel`. */
21
+ ariaLabelledby?: string;
22
+ };
23
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {
24
+ pct: import("vue").ComputedRef<number | null>;
25
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
26
+ max: number;
27
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
28
+ declare const _default: typeof __VLS_export;
29
+ export default _default;
30
+ //# sourceMappingURL=Progress.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Progress.vue.d.ts","sourceRoot":"","sources":["../../../src/primitives/Progress/Progress.vue"],"names":[],"mappings":"AAgGA;;;;;;;;;;;GAWG;AACH,KAAK,WAAW,GAAG;IACf,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,6CAA6C;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AA+HJ,QAAA,MAAM,YAAY;;;SApIR,MAAM;6EAwId,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -0,0 +1,67 @@
1
+ import { cn } from "../../lib/cn.js";
2
+ import { computed, createBlock, createVNode, defineComponent, normalizeClass, normalizeStyle, openBlock, unref, withCtx } from "vue";
3
+ import { ProgressIndicator, ProgressRoot } from "reka-ui";
4
+ //#region src/primitives/Progress/Progress.vue?vue&type=script&setup=true&lang.ts
5
+ /**
6
+ * Progress — determinate progress bar for a task whose extent as a percentage
7
+ * is known (upload %, step 3 of 5). `modelValue` null/undefined renders the
8
+ * *indeterminate* state — an empty track, since there is no percentage yet to
9
+ * paint. For a wait of unknown duration with no percentage at all, use
10
+ * Spinner instead of guessing a Progress value.
11
+ *
12
+ * Built on Reka UI's Progress: role="progressbar" + aria-valuenow/min/max set
13
+ * on the root automatically. `ariaLabel`/`ariaLabelledby` are bound onto
14
+ * ProgressRoot (fallthrough overrides Reka's own generated "`NN%`" label) so
15
+ * the accessible name describes *what* is loading, not just how much.
16
+ */
17
+ var Progress_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
18
+ __name: "Progress",
19
+ props: {
20
+ modelValue: {},
21
+ max: { default: 100 },
22
+ ariaLabel: {},
23
+ ariaLabelledby: {}
24
+ },
25
+ setup(__props, { expose: __expose }) {
26
+ const props = __props;
27
+ /**
28
+ * The value the bar itself is given, clamped into [0, max]; null while
29
+ * indeterminate. The clamp has to happen here rather than only on the way to
30
+ * the transform below: `aria-valuenow` is generated from whatever ProgressRoot
31
+ * receives, so handing it the raw prop announces a number outside the range
32
+ * `aria-valuemin`/`aria-valuemax` declare — "150 percent" read out over a bar
33
+ * painted at 100.
34
+ */
35
+ const value = computed(() => props.modelValue === null || props.modelValue === void 0 ? null : Math.min(Math.max(props.modelValue, 0), props.max));
36
+ /** Percentage 0–100, derived from the clamped value; null while indeterminate. */
37
+ const pct = computed(() => value.value === null ? null : value.value / props.max * 100);
38
+ __expose({ pct });
39
+ return (_ctx, _cache) => {
40
+ return openBlock(), createBlock(unref(ProgressRoot), {
41
+ "model-value": value.value,
42
+ max: __props.max,
43
+ "aria-label": __props.ariaLabel,
44
+ "aria-labelledby": __props.ariaLabelledby,
45
+ class: "relative h-2 w-full overflow-hidden rounded-full bg-muted"
46
+ }, {
47
+ default: withCtx(() => [createVNode(unref(ProgressIndicator), {
48
+ class: normalizeClass(unref(cn)("h-full", pct.value === 100 ? "bg-success" : "bg-primary", pct.value === null && "w-1/3 animate-progress-indeterminate rounded-full")),
49
+ style: normalizeStyle(pct.value === null ? void 0 : {
50
+ transition: "transform var(--duration-slow) var(--ease-out), background-color var(--duration-slow) var(--ease-out)",
51
+ transform: `translateX(-${100 - pct.value}%)`
52
+ })
53
+ }, null, 8, ["class", "style"])]),
54
+ _: 1
55
+ }, 8, [
56
+ "model-value",
57
+ "max",
58
+ "aria-label",
59
+ "aria-labelledby"
60
+ ]);
61
+ };
62
+ }
63
+ });
64
+ //#endregion
65
+ export { Progress_vue_vue_type_script_setup_true_lang_default as default };
66
+
67
+ //# sourceMappingURL=Progress.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Progress.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/primitives/Progress/Progress.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { ProgressRoot, ProgressIndicator } from \"reka-ui\";\nimport { cn } from \"../../lib/cn\";\n\n/**\n * Progress — determinate progress bar for a task whose extent as a percentage\n * is known (upload %, step 3 of 5). `modelValue` null/undefined renders the\n * *indeterminate* state — an empty track, since there is no percentage yet to\n * paint. For a wait of unknown duration with no percentage at all, use\n * Spinner instead of guessing a Progress value.\n *\n * Built on Reka UI's Progress: role=\"progressbar\" + aria-valuenow/min/max set\n * on the root automatically. `ariaLabel`/`ariaLabelledby` are bound onto\n * ProgressRoot (fallthrough overrides Reka's own generated \"`NN%`\" label) so\n * the accessible name describes *what* is loading, not just how much.\n */\nconst props = withDefaults(\n defineProps<{\n /** The completed amount, 0–`max`; `null`/omitted renders indeterminate. */\n modelValue?: number | null;\n /** The value that reads as 100% complete. */\n max?: number;\n /** Accessible name describing the task, overriding Reka's default `NN%` label. */\n ariaLabel?: string;\n /** Accessible name sourced from another element's id, in place of `ariaLabel`. */\n ariaLabelledby?: string;\n }>(),\n {\n max: 100,\n },\n);\n\n/**\n * The value the bar itself is given, clamped into [0, max]; null while\n * indeterminate. The clamp has to happen here rather than only on the way to\n * the transform below: `aria-valuenow` is generated from whatever ProgressRoot\n * receives, so handing it the raw prop announces a number outside the range\n * `aria-valuemin`/`aria-valuemax` declare — \"150 percent\" read out over a bar\n * painted at 100.\n */\nconst value = computed<number | null>(() =>\n props.modelValue === null || props.modelValue === undefined\n ? null\n : Math.min(Math.max(props.modelValue, 0), props.max),\n);\n\n/** Percentage 0–100, derived from the clamped value; null while indeterminate. */\nconst pct = computed<number | null>(() =>\n value.value === null ? null : (value.value / props.max) * 100,\n);\n\ndefineExpose({ pct });\n</script>\n\n<template>\n <ProgressRoot\n :model-value=\"value\"\n :max=\"max\"\n :aria-label=\"ariaLabel\"\n :aria-labelledby=\"ariaLabelledby\"\n class=\"relative h-2 w-full overflow-hidden rounded-full bg-muted\"\n >\n <!-- Determinate: a full-width bar slid left by the remaining percentage\n (transform eased over --duration-slow). Indeterminate: a short segment\n sweeping the track on a loop, since there is no percentage to paint.\n Completion beat: at 100% the fill turns success (Loom dual-force\n law — a finished piece of work reads as done at a glance), eased in\n over the same --duration-slow lane via the background transition. -->\n <ProgressIndicator\n :class=\"\n cn(\n 'h-full',\n pct === 100 ? 'bg-success' : 'bg-primary',\n pct === null && 'w-1/3 animate-progress-indeterminate rounded-full',\n )\n \"\n :style=\"\n pct === null\n ? undefined\n : {\n transition:\n 'transform var(--duration-slow) var(--ease-out), background-color var(--duration-slow) var(--ease-out)',\n transform: `translateX(-${100 - pct}%)`,\n }\n \"\n />\n </ProgressRoot>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;EAiBA,MAAM,QAAQ;;;;;;;;;EAwBd,MAAM,QAAQ,eACZ,MAAM,eAAe,QAAQ,MAAM,eAAe,KAAA,IAC9C,OACA,KAAK,IAAI,KAAK,IAAI,MAAM,YAAY,CAAC,GAAG,MAAM,GAAG,CACvD;;EAGA,MAAM,MAAM,eACV,MAAM,UAAU,OAAO,OAAQ,MAAM,QAAQ,MAAM,MAAO,GAC5D;EAEA,SAAa,EAAE,IAAI,CAAC;;GAIlB,OAAA,UAAA,GAAA,YA+Be,MAAA,YAAA,GAAA;IA9BZ,eAAa,MAAA;IACb,KAAK,QAAA;IACL,cAAY,QAAA;IACZ,mBAAiB,QAAA;IAClB,OAAM;;IAQN,SAAA,cAiBE,CAjBF,YAiBE,MAAA,iBAAA,GAAA;KAhBC,OAAK,eAAW,MAAA,EAAA,CAAE,CAAA,UAAgC,IAAA,UAAG,MAAA,eAAA,cAAkD,IAAA,UAAG,QAAA,mDAAA,CAAA;KAO1G,OAAK,eAAW,IAAA,UAAG,OAAsB,KAAA,IAAA;;MAAyN,WAAA,eAAA,MAAA,IAAA,MAAG"}
@@ -0,0 +1,7 @@
1
+ import RadioGroup_vue_vue_type_script_setup_true_lang_default from "./RadioGroup.vue_vue_type_script_setup_true_lang.js";
2
+ //#region src/primitives/RadioGroup/RadioGroup.vue
3
+ var RadioGroup_default = RadioGroup_vue_vue_type_script_setup_true_lang_default;
4
+ //#endregion
5
+ export { RadioGroup_default as default };
6
+
7
+ //# sourceMappingURL=RadioGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RadioGroup.js","names":[],"sources":["../../../src/primitives/RadioGroup/RadioGroup.vue"],"sourcesContent":["<script lang=\"ts\">\n/** One selectable row in a {@link RadioGroup}. */\nexport interface RadioOption {\n /** Matched against `modelValue`. */\n value: string;\n /** Visible label, rendered beside the control. */\n label: string;\n /** Secondary text, rendered small under the label. */\n description?: string;\n /** Disables this row alone, leaving its siblings pickable. */\n disabled?: boolean;\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { RadioGroupIndicator, RadioGroupItem, RadioGroupRoot } from \"reka-ui\";\nimport { cn } from \"../../lib/cn\";\nimport { optional } from \"../../lib/props\";\n\n/**\n * RadioGroup — a vertical list of mutually exclusive options, each with a\n * visible (and optionally described) label — for longer or explained\n * choices and settings lists. For a compact horizontal toggle among 2-5\n * short options that are all visible at once, reach for SegmentedControl\n * instead. Built on Reka UI's RadioGroup: roving tabindex (the group is one\n * Tab stop, not N) with arrow-key navigation between items.\n */\nwithDefaults(\n defineProps<{\n /** The selected option's `value`. */\n modelValue?: string;\n /** The rows to render, in order. */\n options: RadioOption[];\n /** Disables every row at once, distinct from a single option's own `disabled`. */\n disabled?: boolean;\n /** Set when this group posts inside a real `<form>` — becomes the submitted field name. */\n name?: string;\n }>(),\n { disabled: false },\n);\n\ndefineEmits<{ \"update:modelValue\": [value: string] }>();\n</script>\n\n<template>\n <RadioGroupRoot\n v-bind=\"optional({ modelValue, name })\"\n :disabled=\"disabled\"\n orientation=\"vertical\"\n class=\"flex flex-col gap-3\"\n @update:model-value=\"$emit('update:modelValue', String($event))\"\n >\n <!-- RadioGroupItem is a labelable <button role=\"radio\">, so wrapping it in\n <label> names it exactly like a native control; the rule's\n nesting/id heuristic just doesn't recognize reka-ui's custom element\n as a \"control\". -->\n <!-- eslint-disable-next-line vuejs-accessibility/label-has-for -->\n <label\n v-for=\"opt in options\"\n :key=\"opt.value\"\n :class=\"\n cn(\n 'flex items-start gap-2 text-sm text-foreground',\n // Disabled text stays readable (AA on the light ground) — only the\n // control glyph dims; quiet, not illegible.\n disabled || opt.disabled ? 'cursor-not-allowed text-muted-foreground' : 'cursor-pointer',\n )\n \"\n >\n <RadioGroupItem\n :value=\"opt.value\"\n :class=\"\n cn(\n 'mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded-full border border-input bg-background',\n // Springy transform (press squish), steady color — the transform\n // rides --ease-spring while border stays instant --ease-out (style\n // below), same press language as Button/Switch/Checkbox.\n 'active:scale-90',\n // Selected = a human decision (Loom law): the ring turns warp.\n 'data-[state=checked]:border-primary',\n // Focus draws the weave tight: the brand ring blooms.\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring focus-visible:shadow-halo',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n )\n \"\n :disabled=\"opt.disabled ?? false\"\n style=\"\n transition:\n transform var(--duration-fast) var(--ease-spring),\n border-color var(--duration-instant) var(--ease-out),\n box-shadow var(--duration-fast) var(--ease-out);\n \"\n >\n <!-- The dot pops in with scale-in — a small causal \"it's selected now\". -->\n <RadioGroupIndicator class=\"flex animate-scale-in items-center justify-center\">\n <span class=\"h-2 w-2 rounded-full bg-primary\" />\n </RadioGroupIndicator>\n </RadioGroupItem>\n <span class=\"flex flex-col gap-0.5\">\n <span>{{ opt.label }}</span>\n <span v-if=\"opt.description\" class=\"text-xs text-muted-foreground\">{{\n opt.description\n }}</span>\n </span>\n </label>\n </RadioGroupRoot>\n</template>\n"],"mappings":""}
@@ -0,0 +1,39 @@
1
+ /** One selectable row in a {@link RadioGroup}. */
2
+ export interface RadioOption {
3
+ /** Matched against `modelValue`. */
4
+ value: string;
5
+ /** Visible label, rendered beside the control. */
6
+ label: string;
7
+ /** Secondary text, rendered small under the label. */
8
+ description?: string;
9
+ /** Disables this row alone, leaving its siblings pickable. */
10
+ disabled?: boolean;
11
+ }
12
+ declare const _default: typeof __VLS_export;
13
+ export default _default;
14
+ declare const __VLS_export: import("vue").DefineComponent<{
15
+ /** The selected option's `value`. */
16
+ modelValue?: string;
17
+ /** The rows to render, in order. */
18
+ options: RadioOption[];
19
+ /** Disables every row at once, distinct from a single option's own `disabled`. */
20
+ disabled?: boolean;
21
+ /** Set when this group posts inside a real `<form>` — becomes the submitted field name. */
22
+ name?: string;
23
+ }, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
24
+ "update:modelValue": (value: string) => any;
25
+ }, string, import("vue").PublicProps, Readonly<{
26
+ /** The selected option's `value`. */
27
+ modelValue?: string;
28
+ /** The rows to render, in order. */
29
+ options: RadioOption[];
30
+ /** Disables every row at once, distinct from a single option's own `disabled`. */
31
+ disabled?: boolean;
32
+ /** Set when this group posts inside a real `<form>` — becomes the submitted field name. */
33
+ name?: string;
34
+ }> & Readonly<{
35
+ "onUpdate:modelValue"?: (value: string) => any;
36
+ }>, {
37
+ disabled: boolean;
38
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
39
+ //# sourceMappingURL=RadioGroup.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RadioGroup.vue.d.ts","sourceRoot":"","sources":["../../../src/primitives/RadioGroup/RadioGroup.vue"],"names":[],"mappings":"AAmHA,kDAAkD;AAClD,MAAM,WAAW,WAAW;IAC1B,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;wBACoB,OAAO,YAAY;AAAxC,wBAAyC;AACzC,QAAA,MAAM,YAAY;IAUd,qCAAqC;iBACxB,MAAM;IACnB,oCAAoC;aAC3B,WAAW,EAAE;IACtB,kFAAkF;eACvE,OAAO;IAClB,2FAA2F;WACpF,MAAM;;;;IAPb,qCAAqC;iBACxB,MAAM;IACnB,oCAAoC;aAC3B,WAAW,EAAE;IACtB,kFAAkF;eACvE,OAAO;IAClB,2FAA2F;WACpF,MAAM;;;;cAFF,OAAO;6EA0LlB,CAAC"}
@@ -0,0 +1,63 @@
1
+ import { cn } from "../../lib/cn.js";
2
+ import { optional } from "../../lib/props.js";
3
+ import { Fragment, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, mergeProps, normalizeClass, openBlock, renderList, toDisplayString, unref, withCtx } from "vue";
4
+ import { RadioGroupIndicator, RadioGroupItem, RadioGroupRoot } from "reka-ui";
5
+ //#region src/primitives/RadioGroup/RadioGroup.vue?vue&type=script&setup=true&lang.ts
6
+ var _hoisted_1 = { class: "flex flex-col gap-0.5" };
7
+ var _hoisted_2 = {
8
+ key: 0,
9
+ class: "text-xs text-muted-foreground"
10
+ };
11
+ var RadioGroup_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
12
+ __name: "RadioGroup",
13
+ props: {
14
+ modelValue: {},
15
+ options: {},
16
+ disabled: {
17
+ type: Boolean,
18
+ default: false
19
+ },
20
+ name: {}
21
+ },
22
+ emits: ["update:modelValue"],
23
+ setup(__props) {
24
+ return (_ctx, _cache) => {
25
+ return openBlock(), createBlock(unref(RadioGroupRoot), mergeProps(unref(optional)({
26
+ modelValue: __props.modelValue,
27
+ name: __props.name
28
+ }), {
29
+ disabled: __props.disabled,
30
+ orientation: "vertical",
31
+ class: "flex flex-col gap-3",
32
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.$emit("update:modelValue", String($event)))
33
+ }), {
34
+ default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.options, (opt) => {
35
+ return openBlock(), createElementBlock("label", {
36
+ key: opt.value,
37
+ class: normalizeClass(unref(cn)("flex items-start gap-2 text-sm text-foreground", __props.disabled || opt.disabled ? "cursor-not-allowed text-muted-foreground" : "cursor-pointer"))
38
+ }, [createVNode(unref(RadioGroupItem), {
39
+ value: opt.value,
40
+ class: normalizeClass(unref(cn)("mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded-full border border-input bg-background", "active:scale-90", "data-[state=checked]:border-primary", "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring focus-visible:shadow-halo", "disabled:cursor-not-allowed disabled:opacity-50")),
41
+ disabled: opt.disabled ?? false,
42
+ style: { "transition": "transform var(--duration-fast) var(--ease-spring),\n border-color var(--duration-instant) var(--ease-out),\n box-shadow var(--duration-fast) var(--ease-out)" }
43
+ }, {
44
+ default: withCtx(() => [createVNode(unref(RadioGroupIndicator), { class: "flex animate-scale-in items-center justify-center" }, {
45
+ default: withCtx(() => [..._cache[1] || (_cache[1] = [createElementVNode("span", { class: "h-2 w-2 rounded-full bg-primary" }, null, -1)])]),
46
+ _: 1
47
+ })]),
48
+ _: 1
49
+ }, 8, [
50
+ "value",
51
+ "class",
52
+ "disabled"
53
+ ]), createElementVNode("span", _hoisted_1, [createElementVNode("span", null, toDisplayString(opt.label), 1), opt.description ? (openBlock(), createElementBlock("span", _hoisted_2, toDisplayString(opt.description), 1)) : createCommentVNode("", true)])], 2);
54
+ }), 128))]),
55
+ _: 1
56
+ }, 16, ["disabled"]);
57
+ };
58
+ }
59
+ });
60
+ //#endregion
61
+ export { RadioGroup_vue_vue_type_script_setup_true_lang_default as default };
62
+
63
+ //# sourceMappingURL=RadioGroup.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RadioGroup.vue_vue_type_script_setup_true_lang.js","names":["$emit"],"sources":["../../../src/primitives/RadioGroup/RadioGroup.vue"],"sourcesContent":["<script lang=\"ts\">\n/** One selectable row in a {@link RadioGroup}. */\nexport interface RadioOption {\n /** Matched against `modelValue`. */\n value: string;\n /** Visible label, rendered beside the control. */\n label: string;\n /** Secondary text, rendered small under the label. */\n description?: string;\n /** Disables this row alone, leaving its siblings pickable. */\n disabled?: boolean;\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { RadioGroupIndicator, RadioGroupItem, RadioGroupRoot } from \"reka-ui\";\nimport { cn } from \"../../lib/cn\";\nimport { optional } from \"../../lib/props\";\n\n/**\n * RadioGroup — a vertical list of mutually exclusive options, each with a\n * visible (and optionally described) label — for longer or explained\n * choices and settings lists. For a compact horizontal toggle among 2-5\n * short options that are all visible at once, reach for SegmentedControl\n * instead. Built on Reka UI's RadioGroup: roving tabindex (the group is one\n * Tab stop, not N) with arrow-key navigation between items.\n */\nwithDefaults(\n defineProps<{\n /** The selected option's `value`. */\n modelValue?: string;\n /** The rows to render, in order. */\n options: RadioOption[];\n /** Disables every row at once, distinct from a single option's own `disabled`. */\n disabled?: boolean;\n /** Set when this group posts inside a real `<form>` — becomes the submitted field name. */\n name?: string;\n }>(),\n { disabled: false },\n);\n\ndefineEmits<{ \"update:modelValue\": [value: string] }>();\n</script>\n\n<template>\n <RadioGroupRoot\n v-bind=\"optional({ modelValue, name })\"\n :disabled=\"disabled\"\n orientation=\"vertical\"\n class=\"flex flex-col gap-3\"\n @update:model-value=\"$emit('update:modelValue', String($event))\"\n >\n <!-- RadioGroupItem is a labelable <button role=\"radio\">, so wrapping it in\n <label> names it exactly like a native control; the rule's\n nesting/id heuristic just doesn't recognize reka-ui's custom element\n as a \"control\". -->\n <!-- eslint-disable-next-line vuejs-accessibility/label-has-for -->\n <label\n v-for=\"opt in options\"\n :key=\"opt.value\"\n :class=\"\n cn(\n 'flex items-start gap-2 text-sm text-foreground',\n // Disabled text stays readable (AA on the light ground) — only the\n // control glyph dims; quiet, not illegible.\n disabled || opt.disabled ? 'cursor-not-allowed text-muted-foreground' : 'cursor-pointer',\n )\n \"\n >\n <RadioGroupItem\n :value=\"opt.value\"\n :class=\"\n cn(\n 'mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded-full border border-input bg-background',\n // Springy transform (press squish), steady color — the transform\n // rides --ease-spring while border stays instant --ease-out (style\n // below), same press language as Button/Switch/Checkbox.\n 'active:scale-90',\n // Selected = a human decision (Loom law): the ring turns warp.\n 'data-[state=checked]:border-primary',\n // Focus draws the weave tight: the brand ring blooms.\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring focus-visible:shadow-halo',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n )\n \"\n :disabled=\"opt.disabled ?? false\"\n style=\"\n transition:\n transform var(--duration-fast) var(--ease-spring),\n border-color var(--duration-instant) var(--ease-out),\n box-shadow var(--duration-fast) var(--ease-out);\n \"\n >\n <!-- The dot pops in with scale-in — a small causal \"it's selected now\". -->\n <RadioGroupIndicator class=\"flex animate-scale-in items-center justify-center\">\n <span class=\"h-2 w-2 rounded-full bg-primary\" />\n </RadioGroupIndicator>\n </RadioGroupItem>\n <span class=\"flex flex-col gap-0.5\">\n <span>{{ opt.label }}</span>\n <span v-if=\"opt.description\" class=\"text-xs text-muted-foreground\">{{\n opt.description\n }}</span>\n </span>\n </label>\n </RadioGroupRoot>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;GA6CE,OAAA,UAAA,GAAA,YA4DiB,MAAA,cAAA,GA5DjB,WACU,MA2DO,QAAA,CA3DC,CAAA;IAAA,YAAG,QAAA;IAAU,MAAE,QAAA;GAAI,CAAA,GAAA;IAClC,UAAU,QAAA;IACX,aAAY;IACZ,OAAM;IACL,uBAAkB,OAAA,OAAA,OAAA,MAAA,WAAEA,KAAAA,MAAK,qBAAsB,OAAO,MAAM,CAAA;;IAQ3D,SAAA,cAAsB,EADxB,UAAA,IAAA,GAAA,mBA+CQ,UAAA,MAAA,WA9CQ,QAAA,UAAP,QAAG;KADZ,OAAA,UAAA,GAAA,mBA+CQ,SAAA;MA7CL,KAAK,IAAI;MACT,OAAK,eAAW,MAAA,EAAA,CAAE,CAAA,kDAA6M,QAAA,YAAY,IAAI,WAAQ,6CAAA,gBAAA,CAAA;KASxP,GAAA,CAAA,YA4BiB,MAAA,cAAA,GAAA;MA3Bd,OAAO,IAAI;MACX,OAAK,eAAa,MAAA,EAAA,CAAE,CAAA,2GAAA,mBAAA,uCAAA,+GAAA,iDAAA,CAAA;MAcpB,UAAU,IAAI,YAAQ;MACvB,OAAA,EAAA,cAAA,qLAAA;;MAQA,SAAA,cAEsB,CAFtB,YAEsB,MAAA,mBAAA,GAAA,EAFD,OAAM,oDAAmD,GAAA;OAC5E,SAAA,cAAgD,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAhD,mBAAgD,QAAA,EAA1C,OAAM,kCAAiC,GAAA,MAAA,EAAA,CAAA,EAAA,CAAA;;;;;;;;KAGjD,CAAA,GAAA,mBAKO,QALP,YAKO,CAJL,mBAA4B,QAAA,MAAA,gBAAnB,IAAI,KAAK,GAAA,CAAA,GACN,IAAI,eAAhB,UAAA,GAAA,mBAES,QAFT,YAES,gBADP,IAAI,WAAW,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA,CAAA,CAAA,CAAA,GAAA,CAAA"}
@@ -0,0 +1,7 @@
1
+ import SegmentedControl_vue_vue_type_script_setup_true_lang_default from "./SegmentedControl.vue_vue_type_script_setup_true_lang.js";
2
+ //#region src/primitives/SegmentedControl/SegmentedControl.vue
3
+ var SegmentedControl_default = SegmentedControl_vue_vue_type_script_setup_true_lang_default;
4
+ //#endregion
5
+ export { SegmentedControl_default as default };
6
+
7
+ //# sourceMappingURL=SegmentedControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SegmentedControl.js","names":[],"sources":["../../../src/primitives/SegmentedControl/SegmentedControl.vue"],"sourcesContent":["<script lang=\"ts\">\n/** One segment in a {@link SegmentedControl}. */\nexport interface SegmentedControlOption {\n /** Matched against `modelValue`. */\n value: string;\n /** Visible label, rendered inside the segment. */\n label: string;\n /** Disables this segment alone, leaving its neighbours pickable. */\n disabled?: boolean;\n /** Forwarded to the segment's DOM node — lets hosts keep stable test hooks. */\n testId?: string;\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { nextTick, onMounted, onUnmounted, reactive, ref, watch } from \"vue\";\nimport { RadioGroupRoot, RadioGroupItem } from \"reka-ui\";\nimport { cn } from \"../../lib/cn\";\nimport { optional } from \"../../lib/props\";\n\n/**\n * SegmentedControl — pick one of 2-5 mutually exclusive options, all visible\n * at once; one is always active. Built on Reka UI's RadioGroup (single\n * choice, roving tabindex — the group is one Tab stop, not N — with\n * arrow-key navigation). Styled with Loom tokens.\n */\nconst props = withDefaults(\n defineProps<{\n /** The selected option's `value`. */\n modelValue?: string;\n /** The segments to render, in order. */\n options: SegmentedControlOption[];\n /** Disables every segment at once, distinct from a single option's own `disabled`. */\n disabled?: boolean;\n /** `\"sm\"` is the compressed form for dense chrome — e.g. a status bar density level. */\n size?: \"default\" | \"sm\";\n }>(),\n { disabled: false, size: \"default\" },\n);\n\ndefineEmits<{ \"update:modelValue\": [value: string] }>();\n\n// Shared sliding indicator behind the checked segment. Measured off the live\n// DOM (offsetLeft/offsetWidth of the [data-state=checked] item), not derived\n// from index/width math, so \"sm\"/\"default\" sizing and variable-width labels\n// stay correct without per-size indicator code.\nconst indicatorEl = ref<HTMLElement | null>(null);\nconst indicatorStyle = reactive({ left: \"0px\", width: \"0px\", opacity: \"0\" });\n\nlet resizeObserver: ResizeObserver | undefined;\n\n// Re-targets onto the checked item itself (not the container) so a late\n// width settle on exactly that element — e.g. the `font-medium` weight swap\n// on data-[state=checked] reflowing after this function's own read — is\n// caught by the observer and re-measured, instead of going unnoticed because\n// the container's total box happened not to change.\nfunction updateIndicator() {\n const container = indicatorEl.value?.parentElement;\n const active = container?.querySelector<HTMLElement>('[role=\"radio\"][data-state=\"checked\"]');\n if (!active) {\n indicatorStyle.opacity = \"0\";\n resizeObserver?.disconnect();\n return;\n }\n indicatorStyle.left = `${active.offsetLeft}px`;\n indicatorStyle.width = `${active.offsetWidth}px`;\n indicatorStyle.opacity = \"1\";\n resizeObserver?.disconnect();\n resizeObserver?.observe(active);\n}\n\nonMounted(() => {\n resizeObserver = new ResizeObserver(updateIndicator);\n updateIndicator();\n});\nonUnmounted(() => resizeObserver?.disconnect());\n\nwatch(\n () => props.modelValue,\n () => nextTick(updateIndicator),\n);\nwatch(\n () => props.options,\n () => nextTick(updateIndicator),\n { deep: true },\n);\n</script>\n\n<template>\n <RadioGroupRoot\n v-bind=\"optional({ modelValue })\"\n :disabled=\"disabled\"\n orientation=\"horizontal\"\n class=\"relative inline-flex items-center gap-0.5 rounded-md border border-input bg-muted p-0.5\"\n @update:model-value=\"$emit('update:modelValue', String($event))\"\n >\n <span\n ref=\"indicatorEl\"\n aria-hidden=\"true\"\n class=\"pointer-events-none absolute inset-y-0.5 rounded-sm bg-card shadow-sm\"\n style=\"\n transition:\n left var(--duration-fast) var(--ease-spring),\n width var(--duration-fast) var(--ease-spring);\n \"\n :style=\"{\n left: indicatorStyle.left,\n width: indicatorStyle.width,\n opacity: indicatorStyle.opacity,\n }\"\n />\n <RadioGroupItem\n v-for=\"opt in options\"\n :key=\"opt.value\"\n :value=\"opt.value\"\n :disabled=\"opt.disabled ?? false\"\n v-bind=\"optional({ 'data-testid': opt.testId })\"\n style=\"\n transition:\n transform var(--duration-fast) var(--ease-spring),\n color var(--duration-fast) var(--ease-out);\n \"\n :class=\"\n cn(\n 'relative z-10 inline-flex items-center justify-center rounded-sm text-muted-foreground',\n size === 'sm' ? 'px-1.5 py-px text-[11px]' : 'px-3 py-1 text-sm',\n 'data-[state=checked]:font-medium data-[state=checked]:text-foreground',\n 'data-[state=unchecked]:hover:bg-subtle',\n 'active:scale-[0.97]',\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring focus-visible:shadow-halo',\n 'disabled:pointer-events-none disabled:opacity-50',\n )\n \"\n >\n {{ opt.label }}\n </RadioGroupItem>\n </RadioGroupRoot>\n</template>\n"],"mappings":""}
@@ -0,0 +1,40 @@
1
+ /** One segment in a {@link SegmentedControl}. */
2
+ export interface SegmentedControlOption {
3
+ /** Matched against `modelValue`. */
4
+ value: string;
5
+ /** Visible label, rendered inside the segment. */
6
+ label: string;
7
+ /** Disables this segment alone, leaving its neighbours pickable. */
8
+ disabled?: boolean;
9
+ /** Forwarded to the segment's DOM node — lets hosts keep stable test hooks. */
10
+ testId?: string;
11
+ }
12
+ declare const _default: typeof __VLS_export;
13
+ export default _default;
14
+ declare const __VLS_export: import("vue").DefineComponent<{
15
+ /** The selected option's `value`. */
16
+ modelValue?: string;
17
+ /** The segments to render, in order. */
18
+ options: SegmentedControlOption[];
19
+ /** Disables every segment at once, distinct from a single option's own `disabled`. */
20
+ disabled?: boolean;
21
+ /** `"sm"` is the compressed form for dense chrome — e.g. a status bar density level. */
22
+ size?: "default" | "sm";
23
+ }, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
24
+ "update:modelValue": (value: string) => any;
25
+ }, string, import("vue").PublicProps, Readonly<{
26
+ /** The selected option's `value`. */
27
+ modelValue?: string;
28
+ /** The segments to render, in order. */
29
+ options: SegmentedControlOption[];
30
+ /** Disables every segment at once, distinct from a single option's own `disabled`. */
31
+ disabled?: boolean;
32
+ /** `"sm"` is the compressed form for dense chrome — e.g. a status bar density level. */
33
+ size?: "default" | "sm";
34
+ }> & Readonly<{
35
+ "onUpdate:modelValue"?: (value: string) => any;
36
+ }>, {
37
+ size: "default" | "sm";
38
+ disabled: boolean;
39
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
40
+ //# sourceMappingURL=SegmentedControl.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SegmentedControl.vue.d.ts","sourceRoot":"","sources":["../../../src/primitives/SegmentedControl/SegmentedControl.vue"],"names":[],"mappings":"AAmJA,iDAAiD;AACjD,MAAM,WAAW,sBAAsB;IACrC,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;wBACoB,OAAO,YAAY;AAAxC,wBAAyC;AACzC,QAAA,MAAM,YAAY;IAQd,qCAAqC;iBACxB,MAAM;IACnB,wCAAwC;aAC/B,sBAAsB,EAAE;IACjC,sFAAsF;eAC3E,OAAO;IAClB,wFAAwF;WACjF,SAAS,GAAG,IAAI;;;;IAPvB,qCAAqC;iBACxB,MAAM;IACnB,wCAAwC;aAC/B,sBAAsB,EAAE;IACjC,sFAAsF;eAC3E,OAAO;IAClB,wFAAwF;WACjF,SAAS,GAAG,IAAI;;;;UAAhB,SAAS,GAAG,IAAI;cAFZ,OAAO;6EAwMlB,CAAC"}
@@ -0,0 +1,89 @@
1
+ import { cn } from "../../lib/cn.js";
2
+ import { optional } from "../../lib/props.js";
3
+ import { Fragment, createBlock, createElementBlock, createElementVNode, createTextVNode, defineComponent, mergeProps, nextTick, normalizeStyle, onMounted, onUnmounted, openBlock, reactive, ref, renderList, toDisplayString, unref, watch, withCtx } from "vue";
4
+ import { RadioGroupItem, RadioGroupRoot } from "reka-ui";
5
+ //#region src/primitives/SegmentedControl/SegmentedControl.vue?vue&type=script&setup=true&lang.ts
6
+ var SegmentedControl_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
7
+ __name: "SegmentedControl",
8
+ props: {
9
+ modelValue: {},
10
+ options: {},
11
+ disabled: {
12
+ type: Boolean,
13
+ default: false
14
+ },
15
+ size: { default: "default" }
16
+ },
17
+ emits: ["update:modelValue"],
18
+ setup(__props) {
19
+ const props = __props;
20
+ const indicatorEl = ref(null);
21
+ const indicatorStyle = reactive({
22
+ left: "0px",
23
+ width: "0px",
24
+ opacity: "0"
25
+ });
26
+ let resizeObserver;
27
+ function updateIndicator() {
28
+ const active = (indicatorEl.value?.parentElement)?.querySelector("[role=\"radio\"][data-state=\"checked\"]");
29
+ if (!active) {
30
+ indicatorStyle.opacity = "0";
31
+ resizeObserver?.disconnect();
32
+ return;
33
+ }
34
+ indicatorStyle.left = `${active.offsetLeft}px`;
35
+ indicatorStyle.width = `${active.offsetWidth}px`;
36
+ indicatorStyle.opacity = "1";
37
+ resizeObserver?.disconnect();
38
+ resizeObserver?.observe(active);
39
+ }
40
+ onMounted(() => {
41
+ resizeObserver = new ResizeObserver(updateIndicator);
42
+ updateIndicator();
43
+ });
44
+ onUnmounted(() => resizeObserver?.disconnect());
45
+ watch(() => props.modelValue, () => nextTick(updateIndicator));
46
+ watch(() => props.options, () => nextTick(updateIndicator), { deep: true });
47
+ return (_ctx, _cache) => {
48
+ return openBlock(), createBlock(unref(RadioGroupRoot), mergeProps(unref(optional)({ modelValue: __props.modelValue }), {
49
+ disabled: __props.disabled,
50
+ orientation: "horizontal",
51
+ class: "relative inline-flex items-center gap-0.5 rounded-md border border-input bg-muted p-0.5",
52
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.$emit("update:modelValue", String($event)))
53
+ }), {
54
+ default: withCtx(() => [createElementVNode("span", {
55
+ ref_key: "indicatorEl",
56
+ ref: indicatorEl,
57
+ "aria-hidden": "true",
58
+ class: "pointer-events-none absolute inset-y-0.5 rounded-sm bg-card shadow-sm",
59
+ style: normalizeStyle([{ "transition": "left var(--duration-fast) var(--ease-spring),\n width var(--duration-fast) var(--ease-spring)" }, {
60
+ left: indicatorStyle.left,
61
+ width: indicatorStyle.width,
62
+ opacity: indicatorStyle.opacity
63
+ }])
64
+ }, null, 4), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.options, (opt) => {
65
+ return openBlock(), createBlock(unref(RadioGroupItem), mergeProps({
66
+ key: opt.value,
67
+ value: opt.value,
68
+ disabled: opt.disabled ?? false
69
+ }, { ref_for: true }, unref(optional)({ "data-testid": opt.testId }), {
70
+ style: { "transition": "transform var(--duration-fast) var(--ease-spring),\n color var(--duration-fast) var(--ease-out)" },
71
+ class: unref(cn)("relative z-10 inline-flex items-center justify-center rounded-sm text-muted-foreground", __props.size === "sm" ? "px-1.5 py-px text-[11px]" : "px-3 py-1 text-sm", "data-[state=checked]:font-medium data-[state=checked]:text-foreground", "data-[state=unchecked]:hover:bg-subtle", "active:scale-[0.97]", "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring focus-visible:shadow-halo", "disabled:pointer-events-none disabled:opacity-50")
72
+ }), {
73
+ default: withCtx(() => [createTextVNode(toDisplayString(opt.label), 1)]),
74
+ _: 2
75
+ }, 1040, [
76
+ "value",
77
+ "disabled",
78
+ "class"
79
+ ]);
80
+ }), 128))]),
81
+ _: 1
82
+ }, 16, ["disabled"]);
83
+ };
84
+ }
85
+ });
86
+ //#endregion
87
+ export { SegmentedControl_vue_vue_type_script_setup_true_lang_default as default };
88
+
89
+ //# sourceMappingURL=SegmentedControl.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SegmentedControl.vue_vue_type_script_setup_true_lang.js","names":["$emit"],"sources":["../../../src/primitives/SegmentedControl/SegmentedControl.vue"],"sourcesContent":["<script lang=\"ts\">\n/** One segment in a {@link SegmentedControl}. */\nexport interface SegmentedControlOption {\n /** Matched against `modelValue`. */\n value: string;\n /** Visible label, rendered inside the segment. */\n label: string;\n /** Disables this segment alone, leaving its neighbours pickable. */\n disabled?: boolean;\n /** Forwarded to the segment's DOM node — lets hosts keep stable test hooks. */\n testId?: string;\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { nextTick, onMounted, onUnmounted, reactive, ref, watch } from \"vue\";\nimport { RadioGroupRoot, RadioGroupItem } from \"reka-ui\";\nimport { cn } from \"../../lib/cn\";\nimport { optional } from \"../../lib/props\";\n\n/**\n * SegmentedControl — pick one of 2-5 mutually exclusive options, all visible\n * at once; one is always active. Built on Reka UI's RadioGroup (single\n * choice, roving tabindex — the group is one Tab stop, not N — with\n * arrow-key navigation). Styled with Loom tokens.\n */\nconst props = withDefaults(\n defineProps<{\n /** The selected option's `value`. */\n modelValue?: string;\n /** The segments to render, in order. */\n options: SegmentedControlOption[];\n /** Disables every segment at once, distinct from a single option's own `disabled`. */\n disabled?: boolean;\n /** `\"sm\"` is the compressed form for dense chrome — e.g. a status bar density level. */\n size?: \"default\" | \"sm\";\n }>(),\n { disabled: false, size: \"default\" },\n);\n\ndefineEmits<{ \"update:modelValue\": [value: string] }>();\n\n// Shared sliding indicator behind the checked segment. Measured off the live\n// DOM (offsetLeft/offsetWidth of the [data-state=checked] item), not derived\n// from index/width math, so \"sm\"/\"default\" sizing and variable-width labels\n// stay correct without per-size indicator code.\nconst indicatorEl = ref<HTMLElement | null>(null);\nconst indicatorStyle = reactive({ left: \"0px\", width: \"0px\", opacity: \"0\" });\n\nlet resizeObserver: ResizeObserver | undefined;\n\n// Re-targets onto the checked item itself (not the container) so a late\n// width settle on exactly that element — e.g. the `font-medium` weight swap\n// on data-[state=checked] reflowing after this function's own read — is\n// caught by the observer and re-measured, instead of going unnoticed because\n// the container's total box happened not to change.\nfunction updateIndicator() {\n const container = indicatorEl.value?.parentElement;\n const active = container?.querySelector<HTMLElement>('[role=\"radio\"][data-state=\"checked\"]');\n if (!active) {\n indicatorStyle.opacity = \"0\";\n resizeObserver?.disconnect();\n return;\n }\n indicatorStyle.left = `${active.offsetLeft}px`;\n indicatorStyle.width = `${active.offsetWidth}px`;\n indicatorStyle.opacity = \"1\";\n resizeObserver?.disconnect();\n resizeObserver?.observe(active);\n}\n\nonMounted(() => {\n resizeObserver = new ResizeObserver(updateIndicator);\n updateIndicator();\n});\nonUnmounted(() => resizeObserver?.disconnect());\n\nwatch(\n () => props.modelValue,\n () => nextTick(updateIndicator),\n);\nwatch(\n () => props.options,\n () => nextTick(updateIndicator),\n { deep: true },\n);\n</script>\n\n<template>\n <RadioGroupRoot\n v-bind=\"optional({ modelValue })\"\n :disabled=\"disabled\"\n orientation=\"horizontal\"\n class=\"relative inline-flex items-center gap-0.5 rounded-md border border-input bg-muted p-0.5\"\n @update:model-value=\"$emit('update:modelValue', String($event))\"\n >\n <span\n ref=\"indicatorEl\"\n aria-hidden=\"true\"\n class=\"pointer-events-none absolute inset-y-0.5 rounded-sm bg-card shadow-sm\"\n style=\"\n transition:\n left var(--duration-fast) var(--ease-spring),\n width var(--duration-fast) var(--ease-spring);\n \"\n :style=\"{\n left: indicatorStyle.left,\n width: indicatorStyle.width,\n opacity: indicatorStyle.opacity,\n }\"\n />\n <RadioGroupItem\n v-for=\"opt in options\"\n :key=\"opt.value\"\n :value=\"opt.value\"\n :disabled=\"opt.disabled ?? false\"\n v-bind=\"optional({ 'data-testid': opt.testId })\"\n style=\"\n transition:\n transform var(--duration-fast) var(--ease-spring),\n color var(--duration-fast) var(--ease-out);\n \"\n :class=\"\n cn(\n 'relative z-10 inline-flex items-center justify-center rounded-sm text-muted-foreground',\n size === 'sm' ? 'px-1.5 py-px text-[11px]' : 'px-3 py-1 text-sm',\n 'data-[state=checked]:font-medium data-[state=checked]:text-foreground',\n 'data-[state=unchecked]:hover:bg-subtle',\n 'active:scale-[0.97]',\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring focus-visible:shadow-halo',\n 'disabled:pointer-events-none disabled:opacity-50',\n )\n \"\n >\n {{ opt.label }}\n </RadioGroupItem>\n </RadioGroupRoot>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;EA0BA,MAAM,QAAQ;EAoBd,MAAM,cAAc,IAAwB,IAAI;EAChD,MAAM,iBAAiB,SAAS;GAAE,MAAM;GAAO,OAAO;GAAO,SAAS;EAAI,CAAC;EAE3E,IAAI;EAOJ,SAAS,kBAAkB;GAEzB,MAAM,UADY,YAAY,OAAO,cAAA,EACX,cAA2B,0CAAsC;GAC3F,IAAI,CAAC,QAAQ;IACX,eAAe,UAAU;IACzB,gBAAgB,WAAW;IAC3B;GACF;GACA,eAAe,OAAO,GAAG,OAAO,WAAW;GAC3C,eAAe,QAAQ,GAAG,OAAO,YAAY;GAC7C,eAAe,UAAU;GACzB,gBAAgB,WAAW;GAC3B,gBAAgB,QAAQ,MAAM;EAChC;EAEA,gBAAgB;GACd,iBAAiB,IAAI,eAAe,eAAe;GACnD,gBAAgB;EAClB,CAAC;EACD,kBAAkB,gBAAgB,WAAW,CAAC;EAE9C,YACQ,MAAM,kBACN,SAAS,eAAe,CAChC;EACA,YACQ,MAAM,eACN,SAAS,eAAe,GAC9B,EAAE,MAAM,KAAK,CACf;;GAIE,OAAA,UAAA,GAAA,YA+CiB,MAAA,cAAA,GA/CjB,WACU,MA8CO,QAAA,CA9CC,CAAA,EAAA,YAAG,QAAA,WAAU,CAAA,GAAA;IAC5B,UAAU,QAAA;IACX,aAAY;IACZ,OAAM;IACL,uBAAkB,OAAA,OAAA,OAAA,MAAA,WAAEA,KAAAA,MAAK,qBAAsB,OAAO,MAAM,CAAA;;IAE7D,SAAA,cAcE,CAdF,mBAcE,QAAA;KAbI,SAAA;KAAJ,KAAI;KACJ,eAAY;KACZ,OAAM;KACN,OAIC,eAAA,CAJD,EAAA,cAAA,yGAAA,GAIC;MACuB,MAAA,eAAe;MAAqB,OAAA,eAAe;MAAwB,SAAA,eAAe;;IAMpH,GAAA,MAAA,CAAA,IAAA,UAAA,IAAA,GAAA,mBAwBiB,UAAA,MAAA,WAvBD,QAAA,UAAP,QAAG;KADZ,OAAA,UAAA,GAAA,YAwBiB,MAAA,cAAA,GAxBjB,WAwBiB;MAtBd,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;MAC5C,OAAA,EAAA,cAAA,2GAAA;MAKC,OAAgB,MAAA,EAAA,CAAE,CAAA,0FAAgH,QAAA,SAAI,OAAA,6BAAA,qBAAA,yEAAA,0CAAA,uBAAA,+GAAA,kDAAA;;MAYvI,SAAA,cAAe,CAAZ,gBAAA,gBAAA,IAAI,KAAK,GAAA,CAAA,CAAA,CAAA"}
@@ -0,0 +1,7 @@
1
+ import Select_vue_vue_type_script_setup_true_lang_default, { selectVariants } from "./Select.vue_vue_type_script_setup_true_lang.js";
2
+ //#region src/primitives/Select/Select.vue
3
+ var Select_default = Select_vue_vue_type_script_setup_true_lang_default;
4
+ //#endregion
5
+ export { Select_default as default, selectVariants };
6
+
7
+ //# sourceMappingURL=Select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Select.js","names":[],"sources":["../../../src/primitives/Select/Select.vue"],"sourcesContent":["<script lang=\"ts\">\nimport { cva } from \"class-variance-authority\";\n\n/** One row of the list. `value` is what the model carries; `label` is what a reader sees. */\nexport interface SelectOption {\n /** The value bound to `v-model` when this row is chosen. Unique within the list. */\n value: string;\n /** The text shown on the row, and on the trigger once it is chosen. */\n label: string;\n /** Present but unchoosable — visible, skipped by the keyboard, unclickable. */\n disabled?: boolean;\n}\n\n/**\n * The trigger's height scale. It matches the text input scale exactly, so a\n * form row mixing a Select beside a text field never comes out uneven — which\n * is why reaching past `size` for an `h-*` class is always the wrong fix.\n */\nexport type SelectSize = \"sm\" | \"md\" | \"lg\";\n\nexport const selectVariants = cva(\n [\n \"group inline-flex w-full items-center justify-between gap-2 rounded-md border border-input bg-background text-foreground\",\n \"transition-[color,background-color,box-shadow] duration-fast ease-out hover:bg-subtle\",\n // Rim-lit at rest; the ring blooms on focus.\n \"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring\",\n \"disabled:cursor-not-allowed disabled:opacity-50 data-[placeholder]:text-muted-foreground\",\n ],\n {\n // `satisfies` keeps the two halves honest: the union above is the name a\n // consumer imports and the documentation prints, the map below is the\n // classes. Adding a member to one and not the other stops compiling.\n variants: {\n size: {\n sm: \"h-8 px-2.5 text-xs\",\n md: \"h-9 px-3 text-sm\",\n lg: \"h-11 px-4 text-base\",\n } satisfies Record<SelectSize, string>,\n },\n defaultVariants: { size: \"md\" },\n },\n);\n</script>\n\n<script setup lang=\"ts\">\nimport {\n SelectRoot,\n SelectTrigger,\n SelectValue,\n SelectIcon,\n SelectPortal,\n SelectContent,\n SelectViewport,\n SelectItem,\n SelectItemText,\n SelectItemIndicator,\n} from \"reka-ui\";\nimport { Check, ChevronDown } from \"@lucide/vue\";\nimport { cn } from \"../../lib/cn\";\nimport { listStaggerDelay } from \"../../lib/motion\";\nimport { useSplitAttrs } from \"../../lib/attrs\";\n\n/**\n * Select — pick one value out of a closed list, through a compact trigger and\n * a popover listbox. It suits roughly three to fifteen rows where one value is\n * always chosen: a language, a resolution, a quality preset.\n *\n * Below that, two to five options a reader should see all of at once are\n * better shown than hidden. Above it, a list long enough to need searching\n * wants a combobox, which is a different control rather than a longer version\n * of this one.\n *\n * Built on Reka UI's Select, which supplies the listbox semantics: arrow-key\n * navigation, first-character typeahead, Escape and outside-click to close, and\n * the `role=\"combobox\"` trigger wired to the listbox by `aria-expanded` and\n * `aria-controls`. The active row is tracked by moving real focus onto it, not\n * by `aria-activedescendant`.\n */\nwithDefaults(\n defineProps<{\n /** The chosen option's `value`. Leave it unset to show the placeholder. */\n modelValue?: string;\n /** The rows, in the order they are shown. */\n options: SelectOption[];\n /** Shown on the trigger while nothing is chosen. It is not an option. */\n placeholder?: string;\n /** Unavailable: dims the trigger and refuses to open. */\n disabled?: boolean;\n /** Error state: paints the destructive border and ring, and sets `aria-invalid`. */\n invalid?: boolean;\n /** Trigger height. It shares the text input scale so mixed form rows stay aligned. */\n size?: SelectSize;\n }>(),\n { disabled: false, invalid: false, size: \"md\" },\n);\n\ndefineEmits<{\n /** The chosen option's `value`. Fires once per choice; the list closes with it. */\n \"update:modelValue\": [value: string];\n}>();\n\n// The root renders no DOM node at all, so fallthrough attributes would be\n// dropped on the floor rather than landing anywhere. They go to the trigger,\n// which is the interactive element they describe.\n//\n// `class` is pulled out of that spread and merged through `cn()` instead.\n// Spreading it alongside the trigger's own `:class` only concatenates the two\n// lists — Vue's merge is generic, not Tailwind-aware — so a caller's `w-28`\n// silently loses to the trigger's own `w-full` depending on which utility\n// Tailwind happened to emit last.\ndefineOptions({ inheritAttrs: false });\nconst { attrs, rest: triggerAttrs } = useSplitAttrs();\n</script>\n\n<template>\n <SelectRoot\n :model-value=\"modelValue ?? ''\"\n :disabled=\"disabled\"\n @update:model-value=\"$emit('update:modelValue', String($event))\"\n >\n <SelectTrigger\n v-bind=\"triggerAttrs\"\n :aria-invalid=\"invalid || undefined\"\n :data-invalid=\"invalid || undefined\"\n :class=\"\n cn(\n selectVariants({ size }),\n !invalid && 'focus-visible:shadow-halo',\n invalid && 'border-destructive focus-visible:outline-destructive',\n attrs.class as string,\n )\n \"\n >\n <SelectValue :placeholder=\"placeholder ?? ''\" />\n <SelectIcon class=\"shrink-0 text-muted-foreground\">\n <ChevronDown\n class=\"h-4 w-4 transition-transform duration-fast ease-out group-data-[state=open]:rotate-180\"\n />\n </SelectIcon>\n </SelectTrigger>\n\n <SelectPortal>\n <SelectContent\n position=\"popper\"\n :side-offset=\"6\"\n :class=\"\n cn(\n 'z-50 min-w-[var(--reka-select-trigger-width)] overflow-hidden rounded-md border border-border bg-popover text-popover-foreground shadow-md',\n // Scoped to the open state, never unconditional. Reka keeps the\n // closed content mounted while it waits for an animationend that a\n // mount-only animation never fires again — an invisible overlay\n // eating clicks. Scoping it makes the closed element compute\n // `animation-name: none`, which is the immediate-unmount branch.\n 'data-[state=open]:animate-fade-rise',\n )\n \"\n >\n <SelectViewport class=\"p-1\">\n <!-- The rows reveal one step after another, from the shared stagger\n vocabulary rather than a per-template delay of its own. -->\n <SelectItem\n v-for=\"(option, index) in options\"\n :key=\"option.value\"\n :value=\"option.value\"\n :disabled=\"option.disabled ?? false\"\n :style=\"{ animationDelay: listStaggerDelay(index) }\"\n :class=\"\n cn(\n 'relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-3 py-1.5 pr-8 text-sm text-foreground outline-none',\n 'transition-colors duration-fast ease-out',\n 'animate-fade-rise',\n 'data-[highlighted]:bg-subtle',\n 'data-[state=checked]:bg-primary-muted data-[state=checked]:text-primary',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n )\n \"\n >\n <SelectItemText>{{ option.label }}</SelectItemText>\n <SelectItemIndicator class=\"absolute right-2 inline-flex items-center\">\n <Check class=\"h-4 w-4\" />\n </SelectItemIndicator>\n </SelectItem>\n </SelectViewport>\n </SelectContent>\n </SelectPortal>\n </SelectRoot>\n</template>\n"],"mappings":""}