@ecoma-io/loom 0.1.1 → 0.2.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 (495) hide show
  1. package/README.md +54 -57
  2. package/dist/blocks/AppHeader/AppHeader.js.map +1 -1
  3. package/dist/blocks/AppHeader/AppHeader.vue.d.ts +5 -6
  4. package/dist/blocks/AppHeader/AppHeader.vue.d.ts.map +1 -1
  5. package/dist/blocks/AppHeader/AppHeader.vue_vue_type_script_setup_true_lang.js +6 -7
  6. package/dist/blocks/AppHeader/AppHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  7. package/dist/blocks/DashboardGrid/DashboardGrid.vue.d.ts +1 -1
  8. package/dist/blocks/DashboardGrid/DashboardGrid.vue.d.ts.map +1 -1
  9. package/dist/blocks/DesktopAppShell/DesktopAppShell.js +7 -0
  10. package/dist/blocks/DesktopAppShell/DesktopAppShell.js.map +1 -0
  11. package/dist/blocks/DesktopAppShell/DesktopAppShell.vue.d.ts +102 -0
  12. package/dist/blocks/DesktopAppShell/DesktopAppShell.vue.d.ts.map +1 -0
  13. package/dist/blocks/DesktopAppShell/DesktopAppShell.vue_vue_type_script_setup_true_lang.js +74 -0
  14. package/dist/blocks/DesktopAppShell/DesktopAppShell.vue_vue_type_script_setup_true_lang.js.map +1 -0
  15. package/dist/blocks/ErrorState/ErrorState.js +7 -0
  16. package/dist/blocks/ErrorState/ErrorState.js.map +1 -0
  17. package/dist/blocks/ErrorState/ErrorState.vue.d.ts +44 -0
  18. package/dist/blocks/ErrorState/ErrorState.vue.d.ts.map +1 -0
  19. package/dist/blocks/ErrorState/ErrorState.vue_vue_type_script_setup_true_lang.js +60 -0
  20. package/dist/blocks/ErrorState/ErrorState.vue_vue_type_script_setup_true_lang.js.map +1 -0
  21. package/dist/blocks/FormActions/FormActions.js +7 -0
  22. package/dist/blocks/FormActions/FormActions.js.map +1 -0
  23. package/dist/blocks/FormActions/FormActions.vue.d.ts +51 -0
  24. package/dist/blocks/FormActions/FormActions.vue.d.ts.map +1 -0
  25. package/dist/blocks/FormActions/FormActions.vue_vue_type_script_setup_true_lang.js +21 -0
  26. package/dist/blocks/FormActions/FormActions.vue_vue_type_script_setup_true_lang.js.map +1 -0
  27. package/dist/blocks/FormSection/FormSection.js +7 -0
  28. package/dist/blocks/FormSection/FormSection.js.map +1 -0
  29. package/dist/blocks/FormSection/FormSection.vue.d.ts +85 -0
  30. package/dist/blocks/FormSection/FormSection.vue.d.ts.map +1 -0
  31. package/dist/blocks/FormSection/FormSection.vue_vue_type_script_setup_true_lang.js +62 -0
  32. package/dist/blocks/FormSection/FormSection.vue_vue_type_script_setup_true_lang.js.map +1 -0
  33. package/dist/blocks/LoadingState/LoadingState.js +7 -0
  34. package/dist/blocks/LoadingState/LoadingState.js.map +1 -0
  35. package/dist/blocks/LoadingState/LoadingState.vue.d.ts +22 -0
  36. package/dist/blocks/LoadingState/LoadingState.vue.d.ts.map +1 -0
  37. package/dist/blocks/LoadingState/LoadingState.vue_vue_type_script_setup_true_lang.js +57 -0
  38. package/dist/blocks/LoadingState/LoadingState.vue_vue_type_script_setup_true_lang.js.map +1 -0
  39. package/dist/blocks/MetricCard/MetricCard.js +7 -0
  40. package/dist/blocks/MetricCard/MetricCard.js.map +1 -0
  41. package/dist/blocks/MetricCard/MetricCard.vue.d.ts +59 -0
  42. package/dist/blocks/MetricCard/MetricCard.vue.d.ts.map +1 -0
  43. package/dist/blocks/MetricCard/MetricCard.vue_vue_type_script_setup_true_lang.js +63 -0
  44. package/dist/blocks/MetricCard/MetricCard.vue_vue_type_script_setup_true_lang.js.map +1 -0
  45. package/dist/blocks/SidebarNav/SidebarNav.js.map +1 -1
  46. package/dist/blocks/SidebarNav/SidebarNav.vue_vue_type_script_setup_true_lang.js.map +1 -1
  47. package/dist/blocks/TitleBar/TitleBar.js.map +1 -1
  48. package/dist/blocks/TitleBar/TitleBar.vue.d.ts +37 -3
  49. package/dist/blocks/TitleBar/TitleBar.vue.d.ts.map +1 -1
  50. package/dist/blocks/TitleBar/TitleBar.vue_vue_type_script_setup_true_lang.js +14 -14
  51. package/dist/blocks/TitleBar/TitleBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  52. package/dist/blocks/ToastStack/ToastStack.js.map +1 -1
  53. package/dist/blocks/ToastStack/ToastStack.vue.d.ts +20 -0
  54. package/dist/blocks/ToastStack/ToastStack.vue.d.ts.map +1 -1
  55. package/dist/blocks/ToastStack/ToastStack.vue_vue_type_script_setup_true_lang.js +16 -5
  56. package/dist/blocks/ToastStack/ToastStack.vue_vue_type_script_setup_true_lang.js.map +1 -1
  57. package/dist/composition/Center/Center.js +7 -0
  58. package/dist/composition/Center/Center.js.map +1 -0
  59. package/dist/composition/Center/Center.vue.d.ts +40 -0
  60. package/dist/composition/Center/Center.vue.d.ts.map +1 -0
  61. package/dist/composition/Center/Center.vue_vue_type_script_setup_true_lang.js +29 -0
  62. package/dist/composition/Center/Center.vue_vue_type_script_setup_true_lang.js.map +1 -0
  63. package/dist/composition/Frame/Frame.js +7 -0
  64. package/dist/composition/Frame/Frame.js.map +1 -0
  65. package/dist/composition/Frame/Frame.vue.d.ts +35 -0
  66. package/dist/composition/Frame/Frame.vue.d.ts.map +1 -0
  67. package/dist/composition/Frame/Frame.vue_vue_type_script_setup_true_lang.js +29 -0
  68. package/dist/composition/Frame/Frame.vue_vue_type_script_setup_true_lang.js.map +1 -0
  69. package/dist/composition/Grid/Grid.js +7 -0
  70. package/dist/composition/Grid/Grid.js.map +1 -0
  71. package/dist/composition/Grid/Grid.vue.d.ts +41 -0
  72. package/dist/composition/Grid/Grid.vue.d.ts.map +1 -0
  73. package/dist/composition/Grid/Grid.vue_vue_type_script_setup_true_lang.js +27 -0
  74. package/dist/composition/Grid/Grid.vue_vue_type_script_setup_true_lang.js.map +1 -0
  75. package/dist/composition/Inline/Inline.js +7 -0
  76. package/dist/composition/Inline/Inline.js.map +1 -0
  77. package/dist/composition/Inline/Inline.vue.d.ts +46 -0
  78. package/dist/composition/Inline/Inline.vue.d.ts.map +1 -0
  79. package/dist/composition/Inline/Inline.vue_vue_type_script_setup_true_lang.js +35 -0
  80. package/dist/composition/Inline/Inline.vue_vue_type_script_setup_true_lang.js.map +1 -0
  81. package/dist/composition/ScrollReel/ScrollReel.js +7 -0
  82. package/dist/composition/ScrollReel/ScrollReel.js.map +1 -0
  83. package/dist/composition/ScrollReel/ScrollReel.vue.d.ts +42 -0
  84. package/dist/composition/ScrollReel/ScrollReel.vue.d.ts.map +1 -0
  85. package/dist/composition/ScrollReel/ScrollReel.vue_vue_type_script_setup_true_lang.js +79 -0
  86. package/dist/composition/ScrollReel/ScrollReel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  87. package/dist/composition/Sidebar/Sidebar.js +7 -0
  88. package/dist/composition/Sidebar/Sidebar.js.map +1 -0
  89. package/dist/composition/Sidebar/Sidebar.vue.d.ts +52 -0
  90. package/dist/composition/Sidebar/Sidebar.vue.d.ts.map +1 -0
  91. package/dist/composition/Sidebar/Sidebar.vue_vue_type_script_setup_true_lang.js +36 -0
  92. package/dist/composition/Sidebar/Sidebar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  93. package/dist/composition/Split/Split.js +7 -0
  94. package/dist/composition/Split/Split.js.map +1 -0
  95. package/dist/composition/Split/Split.vue.d.ts +58 -0
  96. package/dist/composition/Split/Split.vue.d.ts.map +1 -0
  97. package/dist/composition/Split/Split.vue_vue_type_script_setup_true_lang.js +40 -0
  98. package/dist/composition/Split/Split.vue_vue_type_script_setup_true_lang.js.map +1 -0
  99. package/dist/composition/Stack/Stack.js +7 -0
  100. package/dist/composition/Stack/Stack.js.map +1 -0
  101. package/dist/composition/Stack/Stack.vue.d.ts +43 -0
  102. package/dist/composition/Stack/Stack.vue.d.ts.map +1 -0
  103. package/dist/composition/Stack/Stack.vue_vue_type_script_setup_true_lang.js +30 -0
  104. package/dist/composition/Stack/Stack.vue_vue_type_script_setup_true_lang.js.map +1 -0
  105. package/dist/index.d.ts +119 -11
  106. package/dist/index.d.ts.map +1 -1
  107. package/dist/index.js +83 -5
  108. package/dist/layouts/AppShell/AppShell.js +7 -0
  109. package/dist/layouts/AppShell/AppShell.js.map +1 -0
  110. package/dist/layouts/AppShell/AppShell.vue.d.ts +51 -0
  111. package/dist/layouts/AppShell/AppShell.vue.d.ts.map +1 -0
  112. package/dist/layouts/AppShell/AppShell.vue_vue_type_script_setup_true_lang.js +47 -0
  113. package/dist/layouts/AppShell/AppShell.vue_vue_type_script_setup_true_lang.js.map +1 -0
  114. package/dist/layouts/Centered/Centered.js +7 -0
  115. package/dist/layouts/Centered/Centered.js.map +1 -0
  116. package/dist/layouts/Centered/Centered.vue.d.ts +48 -0
  117. package/dist/layouts/Centered/Centered.vue.d.ts.map +1 -0
  118. package/dist/layouts/Centered/Centered.vue_vue_type_script_setup_true_lang.js +35 -0
  119. package/dist/layouts/Centered/Centered.vue_vue_type_script_setup_true_lang.js.map +1 -0
  120. package/dist/layouts/Dashboard/Dashboard.js +7 -0
  121. package/dist/layouts/Dashboard/Dashboard.js.map +1 -0
  122. package/dist/layouts/Dashboard/Dashboard.vue.d.ts +60 -0
  123. package/dist/layouts/Dashboard/Dashboard.vue.d.ts.map +1 -0
  124. package/dist/layouts/Dashboard/Dashboard.vue_vue_type_script_setup_true_lang.js +64 -0
  125. package/dist/layouts/Dashboard/Dashboard.vue_vue_type_script_setup_true_lang.js.map +1 -0
  126. package/dist/layouts/FormLayout/FormLayout.js +7 -0
  127. package/dist/layouts/FormLayout/FormLayout.js.map +1 -0
  128. package/dist/layouts/FormLayout/FormLayout.vue.d.ts +46 -0
  129. package/dist/layouts/FormLayout/FormLayout.vue.d.ts.map +1 -0
  130. package/dist/layouts/FormLayout/FormLayout.vue_vue_type_script_setup_true_lang.js +28 -0
  131. package/dist/layouts/FormLayout/FormLayout.vue_vue_type_script_setup_true_lang.js.map +1 -0
  132. package/dist/layouts/MasterDetail/MasterDetail.js +7 -0
  133. package/dist/layouts/MasterDetail/MasterDetail.js.map +1 -0
  134. package/dist/layouts/MasterDetail/MasterDetail.vue.d.ts +49 -0
  135. package/dist/layouts/MasterDetail/MasterDetail.vue.d.ts.map +1 -0
  136. package/dist/layouts/MasterDetail/MasterDetail.vue_vue_type_script_setup_true_lang.js +42 -0
  137. package/dist/layouts/MasterDetail/MasterDetail.vue_vue_type_script_setup_true_lang.js.map +1 -0
  138. package/dist/layouts/Reading/Reading.js +7 -0
  139. package/dist/layouts/Reading/Reading.js.map +1 -0
  140. package/dist/layouts/Reading/Reading.vue.d.ts +24 -0
  141. package/dist/layouts/Reading/Reading.vue.d.ts.map +1 -0
  142. package/dist/layouts/Reading/Reading.vue_vue_type_script_setup_true_lang.js +29 -0
  143. package/dist/layouts/Reading/Reading.vue_vue_type_script_setup_true_lang.js.map +1 -0
  144. package/dist/layouts/Settings/Settings.js +7 -0
  145. package/dist/layouts/Settings/Settings.js.map +1 -0
  146. package/dist/layouts/Settings/Settings.vue.d.ts +39 -0
  147. package/dist/layouts/Settings/Settings.vue.d.ts.map +1 -0
  148. package/dist/layouts/Settings/Settings.vue_vue_type_script_setup_true_lang.js +35 -0
  149. package/dist/layouts/Settings/Settings.vue_vue_type_script_setup_true_lang.js.map +1 -0
  150. package/dist/layouts/SplitLayout/SplitLayout.js +7 -0
  151. package/dist/layouts/SplitLayout/SplitLayout.js.map +1 -0
  152. package/dist/layouts/SplitLayout/SplitLayout.vue.d.ts +63 -0
  153. package/dist/layouts/SplitLayout/SplitLayout.vue.d.ts.map +1 -0
  154. package/dist/layouts/SplitLayout/SplitLayout.vue_vue_type_script_setup_true_lang.js +46 -0
  155. package/dist/layouts/SplitLayout/SplitLayout.vue_vue_type_script_setup_true_lang.js.map +1 -0
  156. package/dist/lib/ancestor-disabled.d.ts +35 -0
  157. package/dist/lib/ancestor-disabled.d.ts.map +1 -0
  158. package/dist/lib/ancestor-disabled.js +86 -0
  159. package/dist/lib/ancestor-disabled.js.map +1 -0
  160. package/dist/lib/cn.d.ts.map +1 -1
  161. package/dist/lib/cn.js +46 -1
  162. package/dist/lib/cn.js.map +1 -1
  163. package/dist/lib/count-labels.d.ts +78 -0
  164. package/dist/lib/count-labels.d.ts.map +1 -0
  165. package/dist/lib/count-labels.js +29 -0
  166. package/dist/lib/count-labels.js.map +1 -0
  167. package/dist/lib/date-labels.d.ts +278 -0
  168. package/dist/lib/date-labels.d.ts.map +1 -0
  169. package/dist/lib/date-labels.js +157 -0
  170. package/dist/lib/date-labels.js.map +1 -0
  171. package/dist/lib/field-context.d.ts +178 -0
  172. package/dist/lib/field-context.d.ts.map +1 -0
  173. package/dist/lib/field-context.js +106 -0
  174. package/dist/lib/field-context.js.map +1 -0
  175. package/dist/lib/label-registry.d.ts +75 -0
  176. package/dist/lib/label-registry.d.ts.map +1 -0
  177. package/dist/lib/labels.d.ts +116 -0
  178. package/dist/lib/labels.d.ts.map +1 -0
  179. package/dist/lib/labels.js +84 -0
  180. package/dist/lib/labels.js.map +1 -0
  181. package/dist/lib/theme.d.ts +68 -0
  182. package/dist/lib/theme.d.ts.map +1 -0
  183. package/dist/node_modules/.pnpm/@internationalized_date@3.12.3/node_modules/@internationalized/date/dist/private/CalendarDate.js +236 -0
  184. package/dist/node_modules/.pnpm/@internationalized_date@3.12.3/node_modules/@internationalized/date/dist/private/CalendarDate.js.map +1 -0
  185. package/dist/node_modules/.pnpm/@internationalized_date@3.12.3/node_modules/@internationalized/date/dist/private/calendars/GregorianCalendar.js +117 -0
  186. package/dist/node_modules/.pnpm/@internationalized_date@3.12.3/node_modules/@internationalized/date/dist/private/calendars/GregorianCalendar.js.map +1 -0
  187. package/dist/node_modules/.pnpm/@internationalized_date@3.12.3/node_modules/@internationalized/date/dist/private/conversion.js +142 -0
  188. package/dist/node_modules/.pnpm/@internationalized_date@3.12.3/node_modules/@internationalized/date/dist/private/conversion.js.map +1 -0
  189. package/dist/node_modules/.pnpm/@internationalized_date@3.12.3/node_modules/@internationalized/date/dist/private/manipulation.js +280 -0
  190. package/dist/node_modules/.pnpm/@internationalized_date@3.12.3/node_modules/@internationalized/date/dist/private/manipulation.js.map +1 -0
  191. package/dist/node_modules/.pnpm/@internationalized_date@3.12.3/node_modules/@internationalized/date/dist/private/queries.js +40 -0
  192. package/dist/node_modules/.pnpm/@internationalized_date@3.12.3/node_modules/@internationalized/date/dist/private/queries.js.map +1 -0
  193. package/dist/node_modules/.pnpm/@internationalized_date@3.12.3/node_modules/@internationalized/date/dist/private/string.js +69 -0
  194. package/dist/node_modules/.pnpm/@internationalized_date@3.12.3/node_modules/@internationalized/date/dist/private/string.js.map +1 -0
  195. package/dist/node_modules/.pnpm/@internationalized_date@3.12.3/node_modules/@internationalized/date/dist/private/utils.js +8 -0
  196. package/dist/node_modules/.pnpm/@internationalized_date@3.12.3/node_modules/@internationalized/date/dist/private/utils.js.map +1 -0
  197. package/dist/primitives/Accordion/Accordion.js +7 -0
  198. package/dist/primitives/Accordion/Accordion.js.map +1 -0
  199. package/dist/primitives/Accordion/Accordion.vue.d.ts +68 -0
  200. package/dist/primitives/Accordion/Accordion.vue.d.ts.map +1 -0
  201. package/dist/primitives/Accordion/Accordion.vue_vue_type_script_setup_true_lang.js +67 -0
  202. package/dist/primitives/Accordion/Accordion.vue_vue_type_script_setup_true_lang.js.map +1 -0
  203. package/dist/primitives/AlertDialog/AlertDialog.js +7 -0
  204. package/dist/primitives/AlertDialog/AlertDialog.js.map +1 -0
  205. package/dist/primitives/AlertDialog/AlertDialog.vue.d.ts +94 -0
  206. package/dist/primitives/AlertDialog/AlertDialog.vue.d.ts.map +1 -0
  207. package/dist/primitives/AlertDialog/AlertDialog.vue_vue_type_script_setup_true_lang.js +99 -0
  208. package/dist/primitives/AlertDialog/AlertDialog.vue_vue_type_script_setup_true_lang.js.map +1 -0
  209. package/dist/primitives/Avatar/Avatar.js +2 -2
  210. package/dist/primitives/Avatar/Avatar.js.map +1 -1
  211. package/dist/primitives/Avatar/Avatar.vue.d.ts +30 -3
  212. package/dist/primitives/Avatar/Avatar.vue.d.ts.map +1 -1
  213. package/dist/primitives/Avatar/Avatar.vue_vue_type_script_setup_true_lang.js +95 -14
  214. package/dist/primitives/Avatar/Avatar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  215. package/dist/primitives/AvatarGroup/AvatarGroup.js +7 -0
  216. package/dist/primitives/AvatarGroup/AvatarGroup.js.map +1 -0
  217. package/dist/primitives/AvatarGroup/AvatarGroup.vue.d.ts +104 -0
  218. package/dist/primitives/AvatarGroup/AvatarGroup.vue.d.ts.map +1 -0
  219. package/dist/primitives/AvatarGroup/AvatarGroup.vue_vue_type_script_setup_true_lang.js +139 -0
  220. package/dist/primitives/AvatarGroup/AvatarGroup.vue_vue_type_script_setup_true_lang.js.map +1 -0
  221. package/dist/primitives/Badge/Badge.js.map +1 -1
  222. package/dist/primitives/Badge/Badge.vue.d.ts +6 -6
  223. package/dist/primitives/Badge/Badge.vue.d.ts.map +1 -1
  224. package/dist/primitives/Badge/Badge.vue_vue_type_script_setup_true_lang.js +1 -1
  225. package/dist/primitives/Badge/Badge.vue_vue_type_script_setup_true_lang.js.map +1 -1
  226. package/dist/primitives/Breadcrumb/Breadcrumb.js +7 -0
  227. package/dist/primitives/Breadcrumb/Breadcrumb.js.map +1 -0
  228. package/dist/primitives/Breadcrumb/Breadcrumb.vue.d.ts +25 -0
  229. package/dist/primitives/Breadcrumb/Breadcrumb.vue.d.ts.map +1 -0
  230. package/dist/primitives/Breadcrumb/Breadcrumb.vue_vue_type_script_setup_true_lang.js +48 -0
  231. package/dist/primitives/Breadcrumb/Breadcrumb.vue_vue_type_script_setup_true_lang.js.map +1 -0
  232. package/dist/primitives/Button/Button.js +2 -2
  233. package/dist/primitives/Button/Button.js.map +1 -1
  234. package/dist/primitives/Button/Button.vue.d.ts +31 -8
  235. package/dist/primitives/Button/Button.vue.d.ts.map +1 -1
  236. package/dist/primitives/Button/Button.vue_vue_type_script_setup_true_lang.js +32 -16
  237. package/dist/primitives/Button/Button.vue_vue_type_script_setup_true_lang.js.map +1 -1
  238. package/dist/primitives/Checkbox/Checkbox.js.map +1 -1
  239. package/dist/primitives/Checkbox/Checkbox.vue.d.ts +18 -3
  240. package/dist/primitives/Checkbox/Checkbox.vue.d.ts.map +1 -1
  241. package/dist/primitives/Checkbox/Checkbox.vue_vue_type_script_setup_true_lang.js +46 -7
  242. package/dist/primitives/Checkbox/Checkbox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  243. package/dist/primitives/Chip/Chip.js +7 -0
  244. package/dist/primitives/Chip/Chip.js.map +1 -0
  245. package/dist/primitives/Chip/Chip.vue.d.ts +79 -0
  246. package/dist/primitives/Chip/Chip.vue.d.ts.map +1 -0
  247. package/dist/primitives/Chip/Chip.vue_vue_type_script_setup_true_lang.js +139 -0
  248. package/dist/primitives/Chip/Chip.vue_vue_type_script_setup_true_lang.js.map +1 -0
  249. package/dist/primitives/ColorPicker/ColorPicker.js +7 -0
  250. package/dist/primitives/ColorPicker/ColorPicker.js.map +1 -0
  251. package/dist/primitives/ColorPicker/ColorPicker.vue.d.ts +125 -0
  252. package/dist/primitives/ColorPicker/ColorPicker.vue.d.ts.map +1 -0
  253. package/dist/primitives/ColorPicker/ColorPicker.vue_vue_type_script_setup_true_lang.js +301 -0
  254. package/dist/primitives/ColorPicker/ColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -0
  255. package/dist/primitives/Combobox/Combobox.js +7 -0
  256. package/dist/primitives/Combobox/Combobox.js.map +1 -0
  257. package/dist/primitives/Combobox/Combobox.vue.d.ts +205 -0
  258. package/dist/primitives/Combobox/Combobox.vue.d.ts.map +1 -0
  259. package/dist/primitives/Combobox/Combobox.vue_vue_type_script_setup_true_lang.js +345 -0
  260. package/dist/primitives/Combobox/Combobox.vue_vue_type_script_setup_true_lang.js.map +1 -0
  261. package/dist/primitives/ContextMenu/ContextMenu.js +7 -0
  262. package/dist/primitives/ContextMenu/ContextMenu.js.map +1 -0
  263. package/dist/primitives/ContextMenu/ContextMenu.vue.d.ts +55 -0
  264. package/dist/primitives/ContextMenu/ContextMenu.vue.d.ts.map +1 -0
  265. package/dist/primitives/ContextMenu/ContextMenu.vue_vue_type_script_setup_true_lang.js +82 -0
  266. package/dist/primitives/ContextMenu/ContextMenu.vue_vue_type_script_setup_true_lang.js.map +1 -0
  267. package/dist/primitives/DatePicker/DatePicker.js +7 -0
  268. package/dist/primitives/DatePicker/DatePicker.js.map +1 -0
  269. package/dist/primitives/DatePicker/DatePicker.vue.d.ts +102 -0
  270. package/dist/primitives/DatePicker/DatePicker.vue.d.ts.map +1 -0
  271. package/dist/primitives/DatePicker/DatePicker.vue_vue_type_script_setup_true_lang.js +292 -0
  272. package/dist/primitives/DatePicker/DatePicker.vue_vue_type_script_setup_true_lang.js.map +1 -0
  273. package/dist/primitives/DateRangePicker/DateRangePicker.js +7 -0
  274. package/dist/primitives/DateRangePicker/DateRangePicker.js.map +1 -0
  275. package/dist/primitives/DateRangePicker/DateRangePicker.vue.d.ts +173 -0
  276. package/dist/primitives/DateRangePicker/DateRangePicker.vue.d.ts.map +1 -0
  277. package/dist/primitives/DateRangePicker/DateRangePicker.vue_vue_type_script_setup_true_lang.js +412 -0
  278. package/dist/primitives/DateRangePicker/DateRangePicker.vue_vue_type_script_setup_true_lang.js.map +1 -0
  279. package/dist/primitives/DateTimePicker/DateTimePicker.js +7 -0
  280. package/dist/primitives/DateTimePicker/DateTimePicker.js.map +1 -0
  281. package/dist/primitives/DateTimePicker/DateTimePicker.vue.d.ts +113 -0
  282. package/dist/primitives/DateTimePicker/DateTimePicker.vue.d.ts.map +1 -0
  283. package/dist/primitives/DateTimePicker/DateTimePicker.vue_vue_type_script_setup_true_lang.js +358 -0
  284. package/dist/primitives/DateTimePicker/DateTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -0
  285. package/dist/primitives/DateTimeRangePicker/DateTimeRangePicker.js +7 -0
  286. package/dist/primitives/DateTimeRangePicker/DateTimeRangePicker.js.map +1 -0
  287. package/dist/primitives/DateTimeRangePicker/DateTimeRangePicker.vue.d.ts +181 -0
  288. package/dist/primitives/DateTimeRangePicker/DateTimeRangePicker.vue.d.ts.map +1 -0
  289. package/dist/primitives/DateTimeRangePicker/DateTimeRangePicker.vue_vue_type_script_setup_true_lang.js +562 -0
  290. package/dist/primitives/DateTimeRangePicker/DateTimeRangePicker.vue_vue_type_script_setup_true_lang.js.map +1 -0
  291. package/dist/primitives/Dialog/Dialog.js +2 -2
  292. package/dist/primitives/Dialog/Dialog.js.map +1 -1
  293. package/dist/primitives/Dialog/Dialog.vue.d.ts +39 -0
  294. package/dist/primitives/Dialog/Dialog.vue.d.ts.map +1 -1
  295. package/dist/primitives/Dialog/Dialog.vue_vue_type_script_setup_true_lang.js +14 -5
  296. package/dist/primitives/Dialog/Dialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  297. package/dist/primitives/Drawer/Drawer.js +7 -0
  298. package/dist/primitives/Drawer/Drawer.js.map +1 -0
  299. package/dist/primitives/Drawer/Drawer.vue.d.ts +110 -0
  300. package/dist/primitives/Drawer/Drawer.vue.d.ts.map +1 -0
  301. package/dist/primitives/Drawer/Drawer.vue_vue_type_script_setup_true_lang.js +223 -0
  302. package/dist/primitives/Drawer/Drawer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  303. package/dist/primitives/DropdownMenu/DropdownMenu.js.map +1 -1
  304. package/dist/primitives/DropdownMenu/DropdownMenu.vue.d.ts.map +1 -1
  305. package/dist/primitives/DropdownMenu/DropdownMenu.vue_vue_type_script_setup_true_lang.js +2 -2
  306. package/dist/primitives/DropdownMenu/DropdownMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  307. package/dist/primitives/Editable/Editable.js +7 -0
  308. package/dist/primitives/Editable/Editable.js.map +1 -0
  309. package/dist/primitives/Editable/Editable.vue.d.ts +200 -0
  310. package/dist/primitives/Editable/Editable.vue.d.ts.map +1 -0
  311. package/dist/primitives/Editable/Editable.vue_vue_type_script_setup_true_lang.js +275 -0
  312. package/dist/primitives/Editable/Editable.vue_vue_type_script_setup_true_lang.js.map +1 -0
  313. package/dist/primitives/Field/Field.js.map +1 -1
  314. package/dist/primitives/Field/Field.vue.d.ts +32 -17
  315. package/dist/primitives/Field/Field.vue.d.ts.map +1 -1
  316. package/dist/primitives/Field/Field.vue_vue_type_script_setup_true_lang.js +51 -18
  317. package/dist/primitives/Field/Field.vue_vue_type_script_setup_true_lang.js.map +1 -1
  318. package/dist/primitives/Fieldset/Fieldset.js +7 -0
  319. package/dist/primitives/Fieldset/Fieldset.js.map +1 -0
  320. package/dist/primitives/Fieldset/Fieldset.vue.d.ts +91 -0
  321. package/dist/primitives/Fieldset/Fieldset.vue.d.ts.map +1 -0
  322. package/dist/primitives/Fieldset/Fieldset.vue_vue_type_script_setup_true_lang.js +138 -0
  323. package/dist/primitives/Fieldset/Fieldset.vue_vue_type_script_setup_true_lang.js.map +1 -0
  324. package/dist/primitives/FileUpload/FileUpload.js +7 -0
  325. package/dist/primitives/FileUpload/FileUpload.js.map +1 -0
  326. package/dist/primitives/FileUpload/FileUpload.vue.d.ts +132 -0
  327. package/dist/primitives/FileUpload/FileUpload.vue.d.ts.map +1 -0
  328. package/dist/primitives/FileUpload/FileUpload.vue_vue_type_script_setup_true_lang.js +359 -0
  329. package/dist/primitives/FileUpload/FileUpload.vue_vue_type_script_setup_true_lang.js.map +1 -0
  330. package/dist/primitives/HoverCard/HoverCard.js +7 -0
  331. package/dist/primitives/HoverCard/HoverCard.js.map +1 -0
  332. package/dist/primitives/HoverCard/HoverCard.vue.d.ts +68 -0
  333. package/dist/primitives/HoverCard/HoverCard.vue.d.ts.map +1 -0
  334. package/dist/primitives/HoverCard/HoverCard.vue_vue_type_script_setup_true_lang.js +62 -0
  335. package/dist/primitives/HoverCard/HoverCard.vue_vue_type_script_setup_true_lang.js.map +1 -0
  336. package/dist/primitives/IconButton/IconButton.js +7 -0
  337. package/dist/primitives/IconButton/IconButton.js.map +1 -0
  338. package/dist/primitives/IconButton/IconButton.vue.d.ts +45 -0
  339. package/dist/primitives/IconButton/IconButton.vue.d.ts.map +1 -0
  340. package/dist/primitives/IconButton/IconButton.vue_vue_type_script_setup_true_lang.js +58 -0
  341. package/dist/primitives/IconButton/IconButton.vue_vue_type_script_setup_true_lang.js.map +1 -0
  342. package/dist/primitives/Indicator/Indicator.js +7 -0
  343. package/dist/primitives/Indicator/Indicator.js.map +1 -0
  344. package/dist/primitives/Indicator/Indicator.vue.d.ts +144 -0
  345. package/dist/primitives/Indicator/Indicator.vue.d.ts.map +1 -0
  346. package/dist/primitives/Indicator/Indicator.vue_vue_type_script_setup_true_lang.js +198 -0
  347. package/dist/primitives/Indicator/Indicator.vue_vue_type_script_setup_true_lang.js.map +1 -0
  348. package/dist/primitives/Link/Link.js +7 -0
  349. package/dist/primitives/Link/Link.js.map +1 -0
  350. package/dist/primitives/Link/Link.vue.d.ts +46 -0
  351. package/dist/primitives/Link/Link.vue.d.ts.map +1 -0
  352. package/dist/primitives/Link/Link.vue_vue_type_script_setup_true_lang.js +85 -0
  353. package/dist/primitives/Link/Link.vue_vue_type_script_setup_true_lang.js.map +1 -0
  354. package/dist/primitives/Menubar/Menubar.js.map +1 -1
  355. package/dist/primitives/Menubar/Menubar.vue.d.ts.map +1 -1
  356. package/dist/primitives/Menubar/Menubar.vue_vue_type_script_setup_true_lang.js +1 -1
  357. package/dist/primitives/Menubar/Menubar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  358. package/dist/primitives/NumberField/NumberField.js +2 -2
  359. package/dist/primitives/NumberField/NumberField.js.map +1 -1
  360. package/dist/primitives/NumberField/NumberField.vue.d.ts +86 -25
  361. package/dist/primitives/NumberField/NumberField.vue.d.ts.map +1 -1
  362. package/dist/primitives/NumberField/NumberField.vue_vue_type_script_setup_true_lang.js +83 -39
  363. package/dist/primitives/NumberField/NumberField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  364. package/dist/primitives/OtpInput/OtpInput.js +7 -0
  365. package/dist/primitives/OtpInput/OtpInput.js.map +1 -0
  366. package/dist/primitives/OtpInput/OtpInput.vue.d.ts +110 -0
  367. package/dist/primitives/OtpInput/OtpInput.vue.d.ts.map +1 -0
  368. package/dist/primitives/OtpInput/OtpInput.vue_vue_type_script_setup_true_lang.js +130 -0
  369. package/dist/primitives/OtpInput/OtpInput.vue_vue_type_script_setup_true_lang.js.map +1 -0
  370. package/dist/primitives/Pagination/Pagination.js +7 -0
  371. package/dist/primitives/Pagination/Pagination.js.map +1 -0
  372. package/dist/primitives/Pagination/Pagination.vue.d.ts +143 -0
  373. package/dist/primitives/Pagination/Pagination.vue.d.ts.map +1 -0
  374. package/dist/primitives/Pagination/Pagination.vue_vue_type_script_setup_true_lang.js +231 -0
  375. package/dist/primitives/Pagination/Pagination.vue_vue_type_script_setup_true_lang.js.map +1 -0
  376. package/dist/primitives/Progress/Progress.js +2 -2
  377. package/dist/primitives/Progress/Progress.js.map +1 -1
  378. package/dist/primitives/Progress/Progress.vue.d.ts +81 -15
  379. package/dist/primitives/Progress/Progress.vue.d.ts.map +1 -1
  380. package/dist/primitives/Progress/Progress.vue_vue_type_script_setup_true_lang.js +88 -22
  381. package/dist/primitives/Progress/Progress.vue_vue_type_script_setup_true_lang.js.map +1 -1
  382. package/dist/primitives/RadialProgress/RadialProgress.js +7 -0
  383. package/dist/primitives/RadialProgress/RadialProgress.js.map +1 -0
  384. package/dist/primitives/RadialProgress/RadialProgress.vue.d.ts +96 -0
  385. package/dist/primitives/RadialProgress/RadialProgress.vue.d.ts.map +1 -0
  386. package/dist/primitives/RadialProgress/RadialProgress.vue_vue_type_script_setup_true_lang.js +189 -0
  387. package/dist/primitives/RadialProgress/RadialProgress.vue_vue_type_script_setup_true_lang.js.map +1 -0
  388. package/dist/primitives/RadioGroup/RadioGroup.js.map +1 -1
  389. package/dist/primitives/RadioGroup/RadioGroup.vue.d.ts +7 -7
  390. package/dist/primitives/RadioGroup/RadioGroup.vue.d.ts.map +1 -1
  391. package/dist/primitives/RadioGroup/RadioGroup.vue_vue_type_script_setup_true_lang.js +26 -9
  392. package/dist/primitives/RadioGroup/RadioGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  393. package/dist/primitives/Rating/Rating.js +7 -0
  394. package/dist/primitives/Rating/Rating.js.map +1 -0
  395. package/dist/primitives/Rating/Rating.vue.d.ts +113 -0
  396. package/dist/primitives/Rating/Rating.vue.d.ts.map +1 -0
  397. package/dist/primitives/Rating/Rating.vue_vue_type_script_setup_true_lang.js +282 -0
  398. package/dist/primitives/Rating/Rating.vue_vue_type_script_setup_true_lang.js.map +1 -0
  399. package/dist/primitives/ScrollArea/ScrollArea.js +7 -0
  400. package/dist/primitives/ScrollArea/ScrollArea.js.map +1 -0
  401. package/dist/primitives/ScrollArea/ScrollArea.vue.d.ts +25 -0
  402. package/dist/primitives/ScrollArea/ScrollArea.vue.d.ts.map +1 -0
  403. package/dist/primitives/ScrollArea/ScrollArea.vue_vue_type_script_setup_true_lang.js +45 -0
  404. package/dist/primitives/ScrollArea/ScrollArea.vue_vue_type_script_setup_true_lang.js.map +1 -0
  405. package/dist/primitives/SegmentedControl/SegmentedControl.js.map +1 -1
  406. package/dist/primitives/SegmentedControl/SegmentedControl.vue.d.ts +5 -5
  407. package/dist/primitives/SegmentedControl/SegmentedControl.vue.d.ts.map +1 -1
  408. package/dist/primitives/SegmentedControl/SegmentedControl.vue_vue_type_script_setup_true_lang.js +51 -8
  409. package/dist/primitives/SegmentedControl/SegmentedControl.vue_vue_type_script_setup_true_lang.js.map +1 -1
  410. package/dist/primitives/Select/Select.js.map +1 -1
  411. package/dist/primitives/Select/Select.vue.d.ts +10 -10
  412. package/dist/primitives/Select/Select.vue.d.ts.map +1 -1
  413. package/dist/primitives/Select/Select.vue_vue_type_script_setup_true_lang.js +105 -52
  414. package/dist/primitives/Select/Select.vue_vue_type_script_setup_true_lang.js.map +1 -1
  415. package/dist/primitives/Skeleton/Skeleton.vue.d.ts +1 -1
  416. package/dist/primitives/Slider/Slider.js.map +1 -1
  417. package/dist/primitives/Slider/Slider.vue.d.ts +24 -4
  418. package/dist/primitives/Slider/Slider.vue.d.ts.map +1 -1
  419. package/dist/primitives/Slider/Slider.vue_vue_type_script_setup_true_lang.js +79 -9
  420. package/dist/primitives/Slider/Slider.vue_vue_type_script_setup_true_lang.js.map +1 -1
  421. package/dist/primitives/SpeedDial/SpeedDial.js +7 -0
  422. package/dist/primitives/SpeedDial/SpeedDial.js.map +1 -0
  423. package/dist/primitives/SpeedDial/SpeedDial.vue.d.ts +58 -0
  424. package/dist/primitives/SpeedDial/SpeedDial.vue.d.ts.map +1 -0
  425. package/dist/primitives/SpeedDial/SpeedDial.vue_vue_type_script_setup_true_lang.js +175 -0
  426. package/dist/primitives/SpeedDial/SpeedDial.vue_vue_type_script_setup_true_lang.js.map +1 -0
  427. package/dist/primitives/Stepper/Stepper.js +7 -0
  428. package/dist/primitives/Stepper/Stepper.js.map +1 -0
  429. package/dist/primitives/Stepper/Stepper.vue.d.ts +119 -0
  430. package/dist/primitives/Stepper/Stepper.vue.d.ts.map +1 -0
  431. package/dist/primitives/Stepper/Stepper.vue_vue_type_script_setup_true_lang.js +202 -0
  432. package/dist/primitives/Stepper/Stepper.vue_vue_type_script_setup_true_lang.js.map +1 -0
  433. package/dist/primitives/Switch/Switch.js.map +1 -1
  434. package/dist/primitives/Switch/Switch.vue.d.ts +13 -3
  435. package/dist/primitives/Switch/Switch.vue.d.ts.map +1 -1
  436. package/dist/primitives/Switch/Switch.vue_vue_type_script_setup_true_lang.js +34 -5
  437. package/dist/primitives/Switch/Switch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  438. package/dist/primitives/Tabs/Tabs.js.map +1 -1
  439. package/dist/primitives/Tabs/Tabs.vue.d.ts.map +1 -1
  440. package/dist/primitives/Tabs/Tabs.vue_vue_type_script_setup_true_lang.js +1 -1
  441. package/dist/primitives/Tabs/Tabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
  442. package/dist/primitives/TagsInput/TagsInput.js +7 -0
  443. package/dist/primitives/TagsInput/TagsInput.js.map +1 -0
  444. package/dist/primitives/TagsInput/TagsInput.vue.d.ts +156 -0
  445. package/dist/primitives/TagsInput/TagsInput.vue.d.ts.map +1 -0
  446. package/dist/primitives/TagsInput/TagsInput.vue_vue_type_script_setup_true_lang.js +387 -0
  447. package/dist/primitives/TagsInput/TagsInput.vue_vue_type_script_setup_true_lang.js.map +1 -0
  448. package/dist/primitives/TextField/TextField.js +2 -2
  449. package/dist/primitives/TextField/TextField.js.map +1 -1
  450. package/dist/primitives/TextField/TextField.vue.d.ts +119 -10
  451. package/dist/primitives/TextField/TextField.vue.d.ts.map +1 -1
  452. package/dist/primitives/TextField/TextField.vue_vue_type_script_setup_true_lang.js +270 -21
  453. package/dist/primitives/TextField/TextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  454. package/dist/primitives/Textarea/Textarea.js +2 -2
  455. package/dist/primitives/Textarea/Textarea.js.map +1 -1
  456. package/dist/primitives/Textarea/Textarea.vue.d.ts +114 -14
  457. package/dist/primitives/Textarea/Textarea.vue.d.ts.map +1 -1
  458. package/dist/primitives/Textarea/Textarea.vue_vue_type_script_setup_true_lang.js +216 -20
  459. package/dist/primitives/Textarea/Textarea.vue_vue_type_script_setup_true_lang.js.map +1 -1
  460. package/dist/primitives/TimePicker/TimePicker.js +7 -0
  461. package/dist/primitives/TimePicker/TimePicker.js.map +1 -0
  462. package/dist/primitives/TimePicker/TimePicker.vue.d.ts +111 -0
  463. package/dist/primitives/TimePicker/TimePicker.vue.d.ts.map +1 -0
  464. package/dist/primitives/TimePicker/TimePicker.vue_vue_type_script_setup_true_lang.js +185 -0
  465. package/dist/primitives/TimePicker/TimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -0
  466. package/dist/primitives/Toast/Toast.js +2 -1
  467. package/dist/primitives/Toast/Toast.js.map +1 -1
  468. package/dist/primitives/Toast/Toast.vue.d.ts +29 -3
  469. package/dist/primitives/Toast/Toast.vue.d.ts.map +1 -1
  470. package/dist/primitives/Toast/Toast.vue_vue_type_script_setup_true_lang.js +17 -7
  471. package/dist/primitives/Toast/Toast.vue_vue_type_script_setup_true_lang.js.map +1 -1
  472. package/dist/primitives/Toast/ToastItem.js +2 -2
  473. package/dist/primitives/Toast/ToastItem.js.map +1 -1
  474. package/dist/primitives/Toast/ToastItem.vue.d.ts +69 -12
  475. package/dist/primitives/Toast/ToastItem.vue.d.ts.map +1 -1
  476. package/dist/primitives/Toast/ToastItem.vue_vue_type_script_setup_true_lang.js +23 -23
  477. package/dist/primitives/Toast/ToastItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  478. package/dist/primitives/Tooltip/Tooltip.vue.d.ts +1 -1
  479. package/dist/primitives/Tooltip/Tooltip.vue.d.ts.map +1 -1
  480. package/dist/primitives/WindowControls/WindowControls.js +2 -2
  481. package/dist/primitives/WindowControls/WindowControls.js.map +1 -1
  482. package/dist/primitives/WindowControls/WindowControls.vue.d.ts +66 -10
  483. package/dist/primitives/WindowControls/WindowControls.vue.d.ts.map +1 -1
  484. package/dist/primitives/WindowControls/WindowControls.vue_vue_type_script_setup_true_lang.js +23 -13
  485. package/dist/primitives/WindowControls/WindowControls.vue_vue_type_script_setup_true_lang.js.map +1 -1
  486. package/dist/styles/global.css +116 -17
  487. package/dist/styles/theme.contrast.test.ts +460 -0
  488. package/dist/styles/theme.css +239 -41
  489. package/dist/theme.js +171 -0
  490. package/dist/theme.js.map +1 -0
  491. package/package.json +14 -4
  492. package/dist/icons/BrandMark.d.ts +0 -18
  493. package/dist/icons/BrandMark.d.ts.map +0 -1
  494. package/dist/icons/BrandMark.js +0 -47
  495. package/dist/icons/BrandMark.js.map +0 -1
@@ -0,0 +1,63 @@
1
+ import { cn } from "../../lib/cn.js";
2
+ import { createCommentVNode, createElementBlock, createElementVNode, defineComponent, normalizeClass, openBlock, renderSlot, toDisplayString, unref } from "vue";
3
+ //#region src/blocks/MetricCard/MetricCard.vue?vue&type=script&setup=true&lang.ts
4
+ var _hoisted_1 = {
5
+ key: 0,
6
+ "aria-hidden": "true",
7
+ class: "mb-2 text-muted-foreground [&_svg]:h-4 [&_svg]:w-4"
8
+ };
9
+ var _hoisted_2 = { class: "text-small text-muted-foreground" };
10
+ var _hoisted_3 = { class: "flex items-baseline gap-1.5" };
11
+ var _hoisted_4 = { class: "text-2xl font-semibold tracking-tight text-foreground" };
12
+ var _hoisted_5 = {
13
+ key: 0,
14
+ class: "inline h-3 w-3",
15
+ viewBox: "0 0 12 12",
16
+ fill: "none",
17
+ stroke: "currentColor",
18
+ "stroke-width": "2",
19
+ "aria-hidden": "true"
20
+ };
21
+ var _hoisted_6 = {
22
+ key: 1,
23
+ class: "inline h-3 w-3",
24
+ viewBox: "0 0 12 12",
25
+ fill: "none",
26
+ stroke: "currentColor",
27
+ "stroke-width": "2",
28
+ "aria-hidden": "true"
29
+ };
30
+ var _hoisted_7 = {
31
+ key: 2,
32
+ "aria-hidden": "true"
33
+ };
34
+ var _hoisted_8 = { key: 3 };
35
+ var MetricCard_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
36
+ __name: "MetricCard",
37
+ props: {
38
+ value: {},
39
+ label: {},
40
+ trend: {},
41
+ trendValue: {}
42
+ },
43
+ setup(__props) {
44
+ return (_ctx, _cache) => {
45
+ return openBlock(), createElementBlock("div", { class: normalizeClass(unref(cn)("rounded-lg border border-border bg-card p-4")) }, [
46
+ _ctx.$slots.icon ? (openBlock(), createElementBlock("div", _hoisted_1, [renderSlot(_ctx.$slots, "icon")])) : createCommentVNode("", true),
47
+ createElementVNode("p", _hoisted_2, toDisplayString(__props.label), 1),
48
+ createElementVNode("div", _hoisted_3, [createElementVNode("span", _hoisted_4, toDisplayString(__props.value), 1), __props.trend ? (openBlock(), createElementBlock("span", {
49
+ key: 0,
50
+ class: normalizeClass(unref(cn)("inline-flex items-center gap-0.5 text-small font-medium", {
51
+ "text-success": __props.trend === "up",
52
+ "text-destructive": __props.trend === "down",
53
+ "text-muted-foreground": __props.trend === "flat"
54
+ }))
55
+ }, [__props.trend === "up" ? (openBlock(), createElementBlock("svg", _hoisted_5, [..._cache[0] || (_cache[0] = [createElementVNode("path", { d: "M6 2v8M3 5l3-3 3 3" }, null, -1)])])) : __props.trend === "down" ? (openBlock(), createElementBlock("svg", _hoisted_6, [..._cache[1] || (_cache[1] = [createElementVNode("path", { d: "M6 10V2M3 7l3 3 3-3" }, null, -1)])])) : (openBlock(), createElementBlock("span", _hoisted_7, "—")), __props.trendValue ? (openBlock(), createElementBlock("span", _hoisted_8, toDisplayString(__props.trendValue), 1)) : createCommentVNode("", true)], 2)) : createCommentVNode("", true)])
56
+ ], 2);
57
+ };
58
+ }
59
+ });
60
+ //#endregion
61
+ export { MetricCard_vue_vue_type_script_setup_true_lang_default as default };
62
+
63
+ //# sourceMappingURL=MetricCard.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetricCard.vue_vue_type_script_setup_true_lang.js","names":["$slots"],"sources":["../../../src/blocks/MetricCard/MetricCard.vue"],"sourcesContent":["<script lang=\"ts\">\n/**\n * MetricCard — one KPI on a dashboard: a compact surface carrying a metric\n * value, its label, and an optional trend arrow. The shape is fixed (icon →\n * label → value + trend) because a hand-rolled metric row drifts from call\n * site to call site — the icon above the label here, the trend on a second\n * line there — and this block pins one layout so the row scans left-to-right.\n *\n * The trend is always inline with the value, never a separate line. A trend\n * on its own row reads as a second metric; sharing the value line reads as\n * context for that metric, which is what it is. The arrows are inline SVGs\n * (12px) rather than an icon-library dependency: a trend indicator is a\n * single directional glyph, and pulling in an icon package for three paths\n * is weight the host did not ask for.\n *\n * Colour encodes direction but is never the only signal: the arrow shape\n * distinguishes up from down even without hue, and \"flat\" is an em dash\n * rather than a horizontal arrow that could be mistaken for a minus sign or\n * a separator. `text-success` / `text-destructive` / `text-muted-foreground`\n * are the semantic tokens rather than fixed greens and reds, so the card\n * adapts to whatever the theme maps those to.\n */\nexport type MetricCardTrend = \"up\" | \"down\" | \"flat\";\n</script>\n\n<script setup lang=\"ts\">\nimport { cn } from \"../../lib/cn\";\n\ndefineProps<{\n /** The metric value — a formatted string or number the host has already\n * localised (e.g. \"1,234\", \"98.5%\", \"$42k\"). Raw numbers are not\n * formatted by the card; the host owns formatting so the same value\n * can be \"$42k\" in one place and \"42,000\" in another. */\n value: string | number;\n /** What the metric measures — always shown. */\n label: string;\n /** Direction of change. When absent, no trend indicator is rendered. */\n trend?: MetricCardTrend;\n /** The trend magnitude (e.g. \"+12.5%\", \"-3.2%\"). Shown only when `trend`\n * is also provided; a magnitude with no direction has no meaning. */\n trendValue?: string;\n}>();\n</script>\n\n<template>\n <div :class=\"cn('rounded-lg border border-border bg-card p-4')\">\n <!-- Decorative icon — hidden from assistive tech because the label and\n value already carry the metric's meaning. -->\n <div\n v-if=\"$slots.icon\"\n aria-hidden=\"true\"\n class=\"mb-2 text-muted-foreground [&_svg]:h-4 [&_svg]:w-4\"\n >\n <slot name=\"icon\" />\n </div>\n <p class=\"text-small text-muted-foreground\">{{ label }}</p>\n <div class=\"flex items-baseline gap-1.5\">\n <span class=\"text-2xl font-semibold tracking-tight text-foreground\">\n {{ value }}\n </span>\n <span\n v-if=\"trend\"\n :class=\"\n cn('inline-flex items-center gap-0.5 text-small font-medium', {\n 'text-success': trend === 'up',\n 'text-destructive': trend === 'down',\n 'text-muted-foreground': trend === 'flat',\n })\n \"\n >\n <!-- Up arrow: a single upward stroke with a chevron head. -->\n <svg\n v-if=\"trend === 'up'\"\n class=\"inline h-3 w-3\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 2v8M3 5l3-3 3 3\" />\n </svg>\n <!-- Down arrow: a single downward stroke with a chevron head. -->\n <svg\n v-else-if=\"trend === 'down'\"\n class=\"inline h-3 w-3\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 10V2M3 7l3 3 3-3\" />\n </svg>\n <!-- Flat: an em dash rather than a horizontal arrow — a horizontal\n arrow at this size reads as a minus sign or a separator. -->\n <span v-else aria-hidden=\"true\">&mdash;</span>\n <span v-if=\"trendValue\">{{ trendValue }}</span>\n </span>\n </div>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CE,OAAA,UAAA,GAAA,mBAuDM,OAAA,EAvDA,OAAK,eAAE,MAAA,EAAA,CAAE,CAAA,6CAAA,CAAA,EAAA,GAAA;IAILA,KAAAA,OAAO,QADf,UAAA,GAAA,mBAMM,OANN,YAMM,CADJ,WAAoB,KAAA,QAAA,MAAA,CAAA,CAAA,KAAA,mBAAA,IAAA,IAAA;IAEtB,mBAA2D,KAA3D,YAA2D,gBAAZ,QAAA,KAAK,GAAA,CAAA;IACpD,mBA2CM,OA3CN,YA2CM,CA1CJ,mBAEO,QAFP,YAEO,gBADF,QAAA,KAAK,GAAA,CAAA,GAGF,QAAA,SADR,UAAA,GAAA,mBAsCO,QAAA;;KApCJ,OAAK,eAAa,MAAA,EAAA,CAAE,CAAA,2DAAA;MAA0F,gBAAA,QAAA,UAAK;MAA2C,oBAAA,QAAA,UAAK;MAAkD,yBAAA,QAAA,UAAK;;IAUnN,GAAA,CAAA,QAAA,UAAK,QADb,UAAA,GAAA,mBAUM,OAVN,YAUM,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CADJ,mBAA+B,QAAA,EAAzB,GAAE,qBAAoB,GAAA,MAAA,EAAA,CAAA,EAAA,CAAA,KAIjB,QAAA,UAAK,UADlB,UAAA,GAAA,mBAUM,OAVN,YAUM,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CADJ,mBAAgC,QAAA,EAA1B,GAAE,sBAAqB,GAAA,MAAA,EAAA,CAAA,EAAA,CAAA,MAI/B,UAAA,GAAA,mBAA8C,QAA9C,YAAgC,GAAO,IAC3B,QAAA,cAAZ,UAAA,GAAA,mBAA+C,QAAA,YAAA,gBAApB,QAAA,UAAU,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"SidebarNav.js","names":[],"sources":["../../../src/blocks/SidebarNav/SidebarNav.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { Component } from \"vue\";\n\n/** One destination in the sidebar. */\nexport interface SidebarNavItem {\n /** A Lucide icon component (e.g. `Home` from `@lucide/vue`) — decorative; the label carries the meaning. */\n icon?: Component;\n label: string;\n /** Marks this as the current page — the sole `--primary` accent drawn in the list. */\n active?: boolean;\n /** Renders the item as a real `<a>` instead of a `<button>`. The host owns the router/navigation. */\n href?: string;\n /** Short count/status shown after the label. Hidden in collapsed mode — folded into its tooltip instead. */\n badge?: string | number;\n}\n\n/** A labeled group of items; `label` may be omitted for an unlabeled leading group. */\nexport interface SidebarNavSection {\n label?: string;\n items: SidebarNavItem[];\n}\n</script>\n\n<script setup lang=\"ts\">\nimport Tooltip from \"../../primitives/Tooltip/Tooltip.vue\";\nimport Badge from \"../../primitives/Badge/Badge.vue\";\nimport Separator from \"../../primitives/Separator/Separator.vue\";\nimport { cn } from \"../../lib/cn\";\n\n/**\n * SidebarNav — the primary NAVIGATION chrome: a `<nav>` landmark of sections\n * and destinations, pinned to the sunken plane (the recessed layer of the\n * shell — sunken < background < card, so work surfaces read as lifted and\n * navigation recedes).\n *\n * The active item carries a flat `--primary` fill and an inset accent bar —\n * a human decides which surface they are on, so this is the human/warp force\n * alone. It never mixes in `--agent`: this is navigation chrome, not a place\n * reporting automated work.\n *\n * Presentational only: the host owns routing (`href` renders a real anchor)\n * and which item is `active` — this component does not track a current\n * route itself.\n *\n * Collapsed mode drops to icon-only rows: each item still needs an\n * accessible name once its label text is hidden, so it moves to `aria-label`\n * (Tooltip's own contract is `aria-describedby`, never the *only* source of\n * a name) and its Tooltip doubles as the visible hint. Native `<a>`/`<button>`\n * elements are used throughout, so Enter/Space activation and tab order come\n * from the platform, not custom key handling.\n *\n * Collapsed rows are square (`h-9 w-9`) rather than full-width, so the nav\n * centers its own children in that mode. The host is what narrows the rail,\n * and it may narrow it late or not at all — without the centering, a collapsed\n * nav still sitting in an expanded-width container leaves a column of icons\n * hugging the left edge of a wide empty panel. Centering makes the mode read\n * correctly at every container width, and the host's width animation then only\n * has to tighten what already looks right.\n */\nwithDefaults(\n defineProps<{\n sections: SidebarNavSection[];\n /** Icon-only rail: section headings and item labels hide; each item's name moves into a Tooltip. */\n collapsed?: boolean;\n /** Accessible name for the `<nav>` landmark — the host owns wording (see `AppHeader`'s same prop). */\n ariaLabel?: string;\n }>(),\n { collapsed: false },\n);\n\nconst emit = defineEmits<{ select: [item: SidebarNavItem] }>();\n\nfunction tooltipContent(item: SidebarNavItem): string {\n return item.badge !== undefined && item.badge !== null\n ? `${item.label} · ${item.badge}`\n : item.label;\n}\n\nfunction itemClass(item: SidebarNavItem, collapsed: boolean): string {\n return cn(\n \"relative flex items-center gap-2 rounded-md text-left text-sm outline-none\",\n \"transition-colors duration-fast ease-out\",\n \"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring focus-visible:shadow-halo\",\n collapsed ? \"h-9 w-9 justify-center\" : \"h-9 w-full px-2.5\",\n item.active\n ? \"bg-primary/10 font-medium text-primary\"\n : // Hover lifts the row to the raised plane rather than tinting it with\n // `--subtle`. `--subtle` is the neutral hover fill for surfaces sitting\n // on `--background` (96% L), where it lands 2% darker and reads. This\n // nav sits on `--sunken` (93% L) and `--subtle` is 94% — one percent\n // apart, so the hover state was there in the markup and invisible on\n // screen. Lifting to `bg-card` is the elevation rhythm's own answer\n // (sunken < background < card): the row the pointer is on comes\n // forward.\n \"text-muted-foreground hover:bg-card hover:text-foreground\",\n );\n}\n</script>\n\n<template>\n <nav\n :aria-label=\"ariaLabel\"\n class=\"flex h-full w-full flex-col gap-1 overflow-y-auto overscroll-contain bg-sunken p-2\"\n :class=\"collapsed && 'items-center'\"\n >\n <template v-for=\"(section, sectionIndex) in sections\" :key=\"sectionIndex\">\n <Separator v-if=\"sectionIndex > 0\" class=\"my-1\" />\n <p\n v-if=\"section.label && !collapsed\"\n class=\"select-none px-2 pb-1 pt-2 text-micro font-medium uppercase tracking-wide text-muted-foreground\"\n >\n {{ section.label }}\n </p>\n <ul class=\"flex flex-col gap-0.5\">\n <li v-for=\"(item, itemIndex) in section.items\" :key=\"itemIndex\">\n <Tooltip v-if=\"collapsed\" :content=\"tooltipContent(item)\" side=\"right\">\n <template #trigger>\n <component\n :is=\"item.href ? 'a' : 'button'\"\n :type=\"item.href ? undefined : 'button'\"\n :href=\"item.href\"\n :aria-current=\"item.active ? 'page' : undefined\"\n :aria-label=\"item.label\"\n :class=\"itemClass(item, true)\"\n @click=\"emit('select', item)\"\n >\n <span\n v-if=\"item.active\"\n aria-hidden=\"true\"\n class=\"absolute inset-y-1.5 left-0 w-0.5 rounded-full bg-primary\"\n />\n <component :is=\"item.icon\" v-if=\"item.icon\" aria-hidden=\"true\" class=\"shrink-0\" />\n </component>\n </template>\n </Tooltip>\n\n <component\n :is=\"item.href ? 'a' : 'button'\"\n v-else\n :type=\"item.href ? undefined : 'button'\"\n :href=\"item.href\"\n :aria-current=\"item.active ? 'page' : undefined\"\n :class=\"itemClass(item, false)\"\n @click=\"emit('select', item)\"\n >\n <span\n v-if=\"item.active\"\n aria-hidden=\"true\"\n class=\"absolute inset-y-1.5 left-0 w-0.5 rounded-full bg-primary\"\n />\n <component :is=\"item.icon\" v-if=\"item.icon\" aria-hidden=\"true\" class=\"shrink-0\" />\n <span class=\"min-w-0 flex-1 truncate\">{{ item.label }}</span>\n <Badge v-if=\"item.badge !== undefined\" variant=\"neutral\" class=\"shrink-0\">\n {{ item.badge }}\n </Badge>\n </component>\n </li>\n </ul>\n </template>\n </nav>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"SidebarNav.js","names":[],"sources":["../../../src/blocks/SidebarNav/SidebarNav.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { Component } from \"vue\";\n\n/** One destination in the sidebar. */\nexport interface SidebarNavItem {\n /** A Lucide icon component (e.g. `Home` from `@lucide/vue`) — decorative; the label carries the meaning. */\n icon?: Component;\n label: string;\n /** Marks this as the current page — the sole `--primary` accent drawn in the list. */\n active?: boolean;\n /** Renders the item as a real `<a>` instead of a `<button>`. The host owns the router/navigation. */\n href?: string;\n /** Short count/status shown after the label. Hidden in collapsed mode — folded into its tooltip instead. */\n badge?: string | number;\n}\n\n/** A labeled group of items; `label` may be omitted for an unlabeled leading group. */\nexport interface SidebarNavSection {\n label?: string;\n items: SidebarNavItem[];\n}\n</script>\n\n<script setup lang=\"ts\">\nimport Tooltip from \"../../primitives/Tooltip/Tooltip.vue\";\nimport Badge from \"../../primitives/Badge/Badge.vue\";\nimport Separator from \"../../primitives/Separator/Separator.vue\";\nimport { cn } from \"../../lib/cn\";\n\n/**\n * SidebarNav — the primary NAVIGATION chrome: a `<nav>` landmark of sections\n * and destinations, pinned to the sunken plane (the recessed layer of the\n * shell — sunken < background < card, so work surfaces read as lifted and\n * navigation recedes).\n *\n * The active item carries a flat `--primary` fill and an inset accent bar —\n * a human decides which surface they are on, so this is the primary force\n * alone. It never mixes in `--accent`: this is navigation chrome, not a place\n * reporting a second semantic category.\n *\n * Presentational only: the host owns routing (`href` renders a real anchor)\n * and which item is `active` — this component does not track a current\n * route itself.\n *\n * Collapsed mode drops to icon-only rows: each item still needs an\n * accessible name once its label text is hidden, so it moves to `aria-label`\n * (Tooltip's own contract is `aria-describedby`, never the *only* source of\n * a name) and its Tooltip doubles as the visible hint. Native `<a>`/`<button>`\n * elements are used throughout, so Enter/Space activation and tab order come\n * from the platform, not custom key handling.\n *\n * Collapsed rows are square (`h-9 w-9`) rather than full-width, so the nav\n * centers its own children in that mode. The host is what narrows the rail,\n * and it may narrow it late or not at all — without the centering, a collapsed\n * nav still sitting in an expanded-width container leaves a column of icons\n * hugging the left edge of a wide empty panel. Centering makes the mode read\n * correctly at every container width, and the host's width animation then only\n * has to tighten what already looks right.\n */\nwithDefaults(\n defineProps<{\n sections: SidebarNavSection[];\n /** Icon-only rail: section headings and item labels hide; each item's name moves into a Tooltip. */\n collapsed?: boolean;\n /** Accessible name for the `<nav>` landmark — the host owns wording (see `AppHeader`'s same prop). */\n ariaLabel?: string;\n }>(),\n { collapsed: false },\n);\n\nconst emit = defineEmits<{ select: [item: SidebarNavItem] }>();\n\nfunction tooltipContent(item: SidebarNavItem): string {\n return item.badge !== undefined && item.badge !== null\n ? `${item.label} · ${item.badge}`\n : item.label;\n}\n\nfunction itemClass(item: SidebarNavItem, collapsed: boolean): string {\n return cn(\n \"relative flex items-center gap-2 rounded-md text-left text-sm outline-none\",\n \"transition-colors duration-fast ease-out\",\n \"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring focus-visible:shadow-halo\",\n collapsed ? \"h-9 w-9 justify-center\" : \"h-9 w-full px-2.5\",\n item.active\n ? \"bg-primary/10 font-medium text-primary\"\n : // Hover lifts the row to the raised plane rather than tinting it with\n // `--subtle`. `--subtle` is the neutral hover fill for surfaces sitting\n // on `--background` (96% L), where it lands 2% darker and reads. This\n // nav sits on `--sunken` (93% L) and `--subtle` is 94% — one percent\n // apart, so the hover state was there in the markup and invisible on\n // screen. Lifting to `bg-card` is the elevation rhythm's own answer\n // (sunken < background < card): the row the pointer is on comes\n // forward.\n \"text-muted-foreground hover:bg-card hover:text-foreground\",\n );\n}\n</script>\n\n<template>\n <nav\n :aria-label=\"ariaLabel\"\n class=\"flex h-full w-full flex-col gap-1 overflow-y-auto overscroll-contain bg-sunken p-2\"\n :class=\"collapsed && 'items-center'\"\n >\n <template v-for=\"(section, sectionIndex) in sections\" :key=\"sectionIndex\">\n <Separator v-if=\"sectionIndex > 0\" class=\"my-1\" />\n <p\n v-if=\"section.label && !collapsed\"\n class=\"select-none px-2 pb-1 pt-2 text-micro font-medium uppercase tracking-wide text-muted-foreground\"\n >\n {{ section.label }}\n </p>\n <ul class=\"flex flex-col gap-0.5\">\n <li v-for=\"(item, itemIndex) in section.items\" :key=\"itemIndex\">\n <Tooltip v-if=\"collapsed\" :content=\"tooltipContent(item)\" side=\"right\">\n <template #trigger>\n <component\n :is=\"item.href ? 'a' : 'button'\"\n :type=\"item.href ? undefined : 'button'\"\n :href=\"item.href\"\n :aria-current=\"item.active ? 'page' : undefined\"\n :aria-label=\"item.label\"\n :class=\"itemClass(item, true)\"\n @click=\"emit('select', item)\"\n >\n <span\n v-if=\"item.active\"\n aria-hidden=\"true\"\n class=\"absolute inset-y-1.5 left-0 w-0.5 rounded-full bg-primary\"\n />\n <component :is=\"item.icon\" v-if=\"item.icon\" aria-hidden=\"true\" class=\"shrink-0\" />\n </component>\n </template>\n </Tooltip>\n\n <component\n :is=\"item.href ? 'a' : 'button'\"\n v-else\n :type=\"item.href ? undefined : 'button'\"\n :href=\"item.href\"\n :aria-current=\"item.active ? 'page' : undefined\"\n :class=\"itemClass(item, false)\"\n @click=\"emit('select', item)\"\n >\n <span\n v-if=\"item.active\"\n aria-hidden=\"true\"\n class=\"absolute inset-y-1.5 left-0 w-0.5 rounded-full bg-primary\"\n />\n <component :is=\"item.icon\" v-if=\"item.icon\" aria-hidden=\"true\" class=\"shrink-0\" />\n <span class=\"min-w-0 flex-1 truncate\">{{ item.label }}</span>\n <Badge v-if=\"item.badge !== undefined\" variant=\"neutral\" class=\"shrink-0\">\n {{ item.badge }}\n </Badge>\n </component>\n </li>\n </ul>\n </template>\n </nav>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"SidebarNav.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/blocks/SidebarNav/SidebarNav.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { Component } from \"vue\";\n\n/** One destination in the sidebar. */\nexport interface SidebarNavItem {\n /** A Lucide icon component (e.g. `Home` from `@lucide/vue`) — decorative; the label carries the meaning. */\n icon?: Component;\n label: string;\n /** Marks this as the current page — the sole `--primary` accent drawn in the list. */\n active?: boolean;\n /** Renders the item as a real `<a>` instead of a `<button>`. The host owns the router/navigation. */\n href?: string;\n /** Short count/status shown after the label. Hidden in collapsed mode — folded into its tooltip instead. */\n badge?: string | number;\n}\n\n/** A labeled group of items; `label` may be omitted for an unlabeled leading group. */\nexport interface SidebarNavSection {\n label?: string;\n items: SidebarNavItem[];\n}\n</script>\n\n<script setup lang=\"ts\">\nimport Tooltip from \"../../primitives/Tooltip/Tooltip.vue\";\nimport Badge from \"../../primitives/Badge/Badge.vue\";\nimport Separator from \"../../primitives/Separator/Separator.vue\";\nimport { cn } from \"../../lib/cn\";\n\n/**\n * SidebarNav — the primary NAVIGATION chrome: a `<nav>` landmark of sections\n * and destinations, pinned to the sunken plane (the recessed layer of the\n * shell — sunken < background < card, so work surfaces read as lifted and\n * navigation recedes).\n *\n * The active item carries a flat `--primary` fill and an inset accent bar —\n * a human decides which surface they are on, so this is the human/warp force\n * alone. It never mixes in `--agent`: this is navigation chrome, not a place\n * reporting automated work.\n *\n * Presentational only: the host owns routing (`href` renders a real anchor)\n * and which item is `active` — this component does not track a current\n * route itself.\n *\n * Collapsed mode drops to icon-only rows: each item still needs an\n * accessible name once its label text is hidden, so it moves to `aria-label`\n * (Tooltip's own contract is `aria-describedby`, never the *only* source of\n * a name) and its Tooltip doubles as the visible hint. Native `<a>`/`<button>`\n * elements are used throughout, so Enter/Space activation and tab order come\n * from the platform, not custom key handling.\n *\n * Collapsed rows are square (`h-9 w-9`) rather than full-width, so the nav\n * centers its own children in that mode. The host is what narrows the rail,\n * and it may narrow it late or not at all — without the centering, a collapsed\n * nav still sitting in an expanded-width container leaves a column of icons\n * hugging the left edge of a wide empty panel. Centering makes the mode read\n * correctly at every container width, and the host's width animation then only\n * has to tighten what already looks right.\n */\nwithDefaults(\n defineProps<{\n sections: SidebarNavSection[];\n /** Icon-only rail: section headings and item labels hide; each item's name moves into a Tooltip. */\n collapsed?: boolean;\n /** Accessible name for the `<nav>` landmark — the host owns wording (see `AppHeader`'s same prop). */\n ariaLabel?: string;\n }>(),\n { collapsed: false },\n);\n\nconst emit = defineEmits<{ select: [item: SidebarNavItem] }>();\n\nfunction tooltipContent(item: SidebarNavItem): string {\n return item.badge !== undefined && item.badge !== null\n ? `${item.label} · ${item.badge}`\n : item.label;\n}\n\nfunction itemClass(item: SidebarNavItem, collapsed: boolean): string {\n return cn(\n \"relative flex items-center gap-2 rounded-md text-left text-sm outline-none\",\n \"transition-colors duration-fast ease-out\",\n \"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring focus-visible:shadow-halo\",\n collapsed ? \"h-9 w-9 justify-center\" : \"h-9 w-full px-2.5\",\n item.active\n ? \"bg-primary/10 font-medium text-primary\"\n : // Hover lifts the row to the raised plane rather than tinting it with\n // `--subtle`. `--subtle` is the neutral hover fill for surfaces sitting\n // on `--background` (96% L), where it lands 2% darker and reads. This\n // nav sits on `--sunken` (93% L) and `--subtle` is 94% — one percent\n // apart, so the hover state was there in the markup and invisible on\n // screen. Lifting to `bg-card` is the elevation rhythm's own answer\n // (sunken < background < card): the row the pointer is on comes\n // forward.\n \"text-muted-foreground hover:bg-card hover:text-foreground\",\n );\n}\n</script>\n\n<template>\n <nav\n :aria-label=\"ariaLabel\"\n class=\"flex h-full w-full flex-col gap-1 overflow-y-auto overscroll-contain bg-sunken p-2\"\n :class=\"collapsed && 'items-center'\"\n >\n <template v-for=\"(section, sectionIndex) in sections\" :key=\"sectionIndex\">\n <Separator v-if=\"sectionIndex > 0\" class=\"my-1\" />\n <p\n v-if=\"section.label && !collapsed\"\n class=\"select-none px-2 pb-1 pt-2 text-micro font-medium uppercase tracking-wide text-muted-foreground\"\n >\n {{ section.label }}\n </p>\n <ul class=\"flex flex-col gap-0.5\">\n <li v-for=\"(item, itemIndex) in section.items\" :key=\"itemIndex\">\n <Tooltip v-if=\"collapsed\" :content=\"tooltipContent(item)\" side=\"right\">\n <template #trigger>\n <component\n :is=\"item.href ? 'a' : 'button'\"\n :type=\"item.href ? undefined : 'button'\"\n :href=\"item.href\"\n :aria-current=\"item.active ? 'page' : undefined\"\n :aria-label=\"item.label\"\n :class=\"itemClass(item, true)\"\n @click=\"emit('select', item)\"\n >\n <span\n v-if=\"item.active\"\n aria-hidden=\"true\"\n class=\"absolute inset-y-1.5 left-0 w-0.5 rounded-full bg-primary\"\n />\n <component :is=\"item.icon\" v-if=\"item.icon\" aria-hidden=\"true\" class=\"shrink-0\" />\n </component>\n </template>\n </Tooltip>\n\n <component\n :is=\"item.href ? 'a' : 'button'\"\n v-else\n :type=\"item.href ? undefined : 'button'\"\n :href=\"item.href\"\n :aria-current=\"item.active ? 'page' : undefined\"\n :class=\"itemClass(item, false)\"\n @click=\"emit('select', item)\"\n >\n <span\n v-if=\"item.active\"\n aria-hidden=\"true\"\n class=\"absolute inset-y-1.5 left-0 w-0.5 rounded-full bg-primary\"\n />\n <component :is=\"item.icon\" v-if=\"item.icon\" aria-hidden=\"true\" class=\"shrink-0\" />\n <span class=\"min-w-0 flex-1 truncate\">{{ item.label }}</span>\n <Badge v-if=\"item.badge !== undefined\" variant=\"neutral\" class=\"shrink-0\">\n {{ item.badge }}\n </Badge>\n </component>\n </li>\n </ul>\n </template>\n </nav>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsEA,MAAM,OAAO;EAEb,SAAS,eAAe,MAA8B;GACpD,OAAO,KAAK,UAAU,KAAA,KAAa,KAAK,UAAU,OAC9C,GAAG,KAAK,MAAM,KAAK,KAAK,UACxB,KAAK;EACX;EAEA,SAAS,UAAU,MAAsB,WAA4B;GACnE,OAAO,GACL,8EACA,4CACA,+GACA,YAAY,2BAA2B,qBACvC,KAAK,SACD,2CASA,2DACN;EACF;;GAIE,OAAA,UAAA,GAAA,mBA2DM,OAAA;IA1DH,cAAY,QAAA;IACb,OAAK,eAAA,CAAC,sFACE,QAAA,aAAS,cAAA,CAAA;GAEjB,GAAA,EAAA,UAAA,IAAA,GAAA,mBAqDW,UAAA,MAAA,WArDiC,QAAA,WAA1B,SAAS,iBAAY;IAAqB,OAAA,UAAA,GAAA,mBAAA,UAAA,EAAA,KAAA,aAAY,GAAA;KACrD,eAAY,KAA7B,UAAA,GAAA,YAAkD,mBAAA;;MAAf,OAAM;;KAEjC,QAAQ,SAAK,CAAK,QAAA,aAD1B,UAAA,GAAA,mBAKI,KALJ,YAKI,gBADC,QAAQ,KAAK,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA;KAElB,mBA4CK,MA5CL,YA4CK,EA3CH,UAAA,IAAA,GAAA,mBA0CK,UAAA,MAAA,WA1C2B,QAAQ,QAA5B,MAAM,cAAS;MAA3B,OAAA,UAAA,GAAA,mBA0CK,MAAA,EA1C2C,KAAK,UAAS,GAAA,CAC7C,QAAA,aAAf,UAAA,GAAA,YAmBU,iBAAA;;OAnBiB,SAAS,eAAe,IAAI;OAAG,MAAK;;OAClD,SAAO,cAgBJ,EAfZ,UAAA,GAAA,YAeY,wBAdL,KAAK,OAAI,MAAA,QAAA,GAAA;QACb,MAAM,KAAK,OAAO,KAAA,IAAS;QAC3B,MAAM,KAAK;QACX,gBAAc,KAAK,SAAM,SAAY,KAAA;QACrC,cAAY,KAAK;QACjB,OAAK,eAAE,UAAU,MAAI,IAAA,CAAA;QACrB,UAAK,WAAE,KAAI,UAAW,IAAI;;QAE3B,SAAA,cAIE,CAHM,KAAK,UADb,UAAA,GAAA,mBAIE,QAJF,UAIE,KAAA,mBAAA,IAAA,IAAA,GAC+B,KAAK,QAAtC,UAAA,GAAA,YAAkF,wBAAlE,KAAK,IAAI,GAAA;;SAAmB,eAAY;SAAO,OAAM;;;;;;;;;;;;MAK3E,GAAA,MAAA,CAAA,SAAA,CAAA,MAAA,UAAA,GAAA,YAmBY,wBAlBL,KAAK,OAAI,MAAA,QAAA,GAAA;;OAEb,MAAM,KAAK,OAAO,KAAA,IAAS;OAC3B,MAAM,KAAK;OACX,gBAAc,KAAK,SAAM,SAAY,KAAA;OACrC,OAAK,eAAE,UAAU,MAAI,KAAA,CAAA;OACrB,UAAK,WAAE,KAAI,UAAW,IAAI;;OAE3B,SAAA,cAIE;QAHM,KAAK,UADb,UAAA,GAAA,mBAIE,QAJF,UAIE,KAAA,mBAAA,IAAA,IAAA;QAC+B,KAAK,QAAtC,UAAA,GAAA,YAAkF,wBAAlE,KAAK,IAAI,GAAA;;SAAmB,eAAY;SAAO,OAAM;;QACrE,mBAA6D,QAA7D,YAA6D,gBAApB,KAAK,KAAK,GAAA,CAAA;QACtC,KAAK,UAAU,KAAA,KAA5B,UAAA,GAAA,YAEQ,eAAA;;SAF+B,SAAQ;SAAU,OAAM;;SAC7D,SAAA,cAAgB,CAAb,gBAAA,gBAAA,KAAK,KAAK,GAAA,CAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"SidebarNav.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/blocks/SidebarNav/SidebarNav.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { Component } from \"vue\";\n\n/** One destination in the sidebar. */\nexport interface SidebarNavItem {\n /** A Lucide icon component (e.g. `Home` from `@lucide/vue`) — decorative; the label carries the meaning. */\n icon?: Component;\n label: string;\n /** Marks this as the current page — the sole `--primary` accent drawn in the list. */\n active?: boolean;\n /** Renders the item as a real `<a>` instead of a `<button>`. The host owns the router/navigation. */\n href?: string;\n /** Short count/status shown after the label. Hidden in collapsed mode — folded into its tooltip instead. */\n badge?: string | number;\n}\n\n/** A labeled group of items; `label` may be omitted for an unlabeled leading group. */\nexport interface SidebarNavSection {\n label?: string;\n items: SidebarNavItem[];\n}\n</script>\n\n<script setup lang=\"ts\">\nimport Tooltip from \"../../primitives/Tooltip/Tooltip.vue\";\nimport Badge from \"../../primitives/Badge/Badge.vue\";\nimport Separator from \"../../primitives/Separator/Separator.vue\";\nimport { cn } from \"../../lib/cn\";\n\n/**\n * SidebarNav — the primary NAVIGATION chrome: a `<nav>` landmark of sections\n * and destinations, pinned to the sunken plane (the recessed layer of the\n * shell — sunken < background < card, so work surfaces read as lifted and\n * navigation recedes).\n *\n * The active item carries a flat `--primary` fill and an inset accent bar —\n * a human decides which surface they are on, so this is the primary force\n * alone. It never mixes in `--accent`: this is navigation chrome, not a place\n * reporting a second semantic category.\n *\n * Presentational only: the host owns routing (`href` renders a real anchor)\n * and which item is `active` — this component does not track a current\n * route itself.\n *\n * Collapsed mode drops to icon-only rows: each item still needs an\n * accessible name once its label text is hidden, so it moves to `aria-label`\n * (Tooltip's own contract is `aria-describedby`, never the *only* source of\n * a name) and its Tooltip doubles as the visible hint. Native `<a>`/`<button>`\n * elements are used throughout, so Enter/Space activation and tab order come\n * from the platform, not custom key handling.\n *\n * Collapsed rows are square (`h-9 w-9`) rather than full-width, so the nav\n * centers its own children in that mode. The host is what narrows the rail,\n * and it may narrow it late or not at all — without the centering, a collapsed\n * nav still sitting in an expanded-width container leaves a column of icons\n * hugging the left edge of a wide empty panel. Centering makes the mode read\n * correctly at every container width, and the host's width animation then only\n * has to tighten what already looks right.\n */\nwithDefaults(\n defineProps<{\n sections: SidebarNavSection[];\n /** Icon-only rail: section headings and item labels hide; each item's name moves into a Tooltip. */\n collapsed?: boolean;\n /** Accessible name for the `<nav>` landmark — the host owns wording (see `AppHeader`'s same prop). */\n ariaLabel?: string;\n }>(),\n { collapsed: false },\n);\n\nconst emit = defineEmits<{ select: [item: SidebarNavItem] }>();\n\nfunction tooltipContent(item: SidebarNavItem): string {\n return item.badge !== undefined && item.badge !== null\n ? `${item.label} · ${item.badge}`\n : item.label;\n}\n\nfunction itemClass(item: SidebarNavItem, collapsed: boolean): string {\n return cn(\n \"relative flex items-center gap-2 rounded-md text-left text-sm outline-none\",\n \"transition-colors duration-fast ease-out\",\n \"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring focus-visible:shadow-halo\",\n collapsed ? \"h-9 w-9 justify-center\" : \"h-9 w-full px-2.5\",\n item.active\n ? \"bg-primary/10 font-medium text-primary\"\n : // Hover lifts the row to the raised plane rather than tinting it with\n // `--subtle`. `--subtle` is the neutral hover fill for surfaces sitting\n // on `--background` (96% L), where it lands 2% darker and reads. This\n // nav sits on `--sunken` (93% L) and `--subtle` is 94% — one percent\n // apart, so the hover state was there in the markup and invisible on\n // screen. Lifting to `bg-card` is the elevation rhythm's own answer\n // (sunken < background < card): the row the pointer is on comes\n // forward.\n \"text-muted-foreground hover:bg-card hover:text-foreground\",\n );\n}\n</script>\n\n<template>\n <nav\n :aria-label=\"ariaLabel\"\n class=\"flex h-full w-full flex-col gap-1 overflow-y-auto overscroll-contain bg-sunken p-2\"\n :class=\"collapsed && 'items-center'\"\n >\n <template v-for=\"(section, sectionIndex) in sections\" :key=\"sectionIndex\">\n <Separator v-if=\"sectionIndex > 0\" class=\"my-1\" />\n <p\n v-if=\"section.label && !collapsed\"\n class=\"select-none px-2 pb-1 pt-2 text-micro font-medium uppercase tracking-wide text-muted-foreground\"\n >\n {{ section.label }}\n </p>\n <ul class=\"flex flex-col gap-0.5\">\n <li v-for=\"(item, itemIndex) in section.items\" :key=\"itemIndex\">\n <Tooltip v-if=\"collapsed\" :content=\"tooltipContent(item)\" side=\"right\">\n <template #trigger>\n <component\n :is=\"item.href ? 'a' : 'button'\"\n :type=\"item.href ? undefined : 'button'\"\n :href=\"item.href\"\n :aria-current=\"item.active ? 'page' : undefined\"\n :aria-label=\"item.label\"\n :class=\"itemClass(item, true)\"\n @click=\"emit('select', item)\"\n >\n <span\n v-if=\"item.active\"\n aria-hidden=\"true\"\n class=\"absolute inset-y-1.5 left-0 w-0.5 rounded-full bg-primary\"\n />\n <component :is=\"item.icon\" v-if=\"item.icon\" aria-hidden=\"true\" class=\"shrink-0\" />\n </component>\n </template>\n </Tooltip>\n\n <component\n :is=\"item.href ? 'a' : 'button'\"\n v-else\n :type=\"item.href ? undefined : 'button'\"\n :href=\"item.href\"\n :aria-current=\"item.active ? 'page' : undefined\"\n :class=\"itemClass(item, false)\"\n @click=\"emit('select', item)\"\n >\n <span\n v-if=\"item.active\"\n aria-hidden=\"true\"\n class=\"absolute inset-y-1.5 left-0 w-0.5 rounded-full bg-primary\"\n />\n <component :is=\"item.icon\" v-if=\"item.icon\" aria-hidden=\"true\" class=\"shrink-0\" />\n <span class=\"min-w-0 flex-1 truncate\">{{ item.label }}</span>\n <Badge v-if=\"item.badge !== undefined\" variant=\"neutral\" class=\"shrink-0\">\n {{ item.badge }}\n </Badge>\n </component>\n </li>\n </ul>\n </template>\n </nav>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsEA,MAAM,OAAO;EAEb,SAAS,eAAe,MAA8B;GACpD,OAAO,KAAK,UAAU,KAAA,KAAa,KAAK,UAAU,OAC9C,GAAG,KAAK,MAAM,KAAK,KAAK,UACxB,KAAK;EACX;EAEA,SAAS,UAAU,MAAsB,WAA4B;GACnE,OAAO,GACL,8EACA,4CACA,+GACA,YAAY,2BAA2B,qBACvC,KAAK,SACD,2CASA,2DACN;EACF;;GAIE,OAAA,UAAA,GAAA,mBA2DM,OAAA;IA1DH,cAAY,QAAA;IACb,OAAK,eAAA,CAAC,sFACE,QAAA,aAAS,cAAA,CAAA;GAEjB,GAAA,EAAA,UAAA,IAAA,GAAA,mBAqDW,UAAA,MAAA,WArDiC,QAAA,WAA1B,SAAS,iBAAY;IAAqB,OAAA,UAAA,GAAA,mBAAA,UAAA,EAAA,KAAA,aAAY,GAAA;KACrD,eAAY,KAA7B,UAAA,GAAA,YAAkD,mBAAA;;MAAf,OAAM;;KAEjC,QAAQ,SAAK,CAAK,QAAA,aAD1B,UAAA,GAAA,mBAKI,KALJ,YAKI,gBADC,QAAQ,KAAK,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA;KAElB,mBA4CK,MA5CL,YA4CK,EA3CH,UAAA,IAAA,GAAA,mBA0CK,UAAA,MAAA,WA1C2B,QAAQ,QAA5B,MAAM,cAAS;MAA3B,OAAA,UAAA,GAAA,mBA0CK,MAAA,EA1C2C,KAAK,UAAS,GAAA,CAC7C,QAAA,aAAf,UAAA,GAAA,YAmBU,iBAAA;;OAnBiB,SAAS,eAAe,IAAI;OAAG,MAAK;;OAClD,SAAO,cAgBJ,EAfZ,UAAA,GAAA,YAeY,wBAdL,KAAK,OAAI,MAAA,QAAA,GAAA;QACb,MAAM,KAAK,OAAO,KAAA,IAAS;QAC3B,MAAM,KAAK;QACX,gBAAc,KAAK,SAAM,SAAY,KAAA;QACrC,cAAY,KAAK;QACjB,OAAK,eAAE,UAAU,MAAI,IAAA,CAAA;QACrB,UAAK,WAAE,KAAI,UAAW,IAAI;;QAE3B,SAAA,cAIE,CAHM,KAAK,UADb,UAAA,GAAA,mBAIE,QAJF,UAIE,KAAA,mBAAA,IAAA,IAAA,GAC+B,KAAK,QAAtC,UAAA,GAAA,YAAkF,wBAAlE,KAAK,IAAI,GAAA;;SAAmB,eAAY;SAAO,OAAM;;;;;;;;;;;;MAK3E,GAAA,MAAA,CAAA,SAAA,CAAA,MAAA,UAAA,GAAA,YAmBY,wBAlBL,KAAK,OAAI,MAAA,QAAA,GAAA;;OAEb,MAAM,KAAK,OAAO,KAAA,IAAS;OAC3B,MAAM,KAAK;OACX,gBAAc,KAAK,SAAM,SAAY,KAAA;OACrC,OAAK,eAAE,UAAU,MAAI,KAAA,CAAA;OACrB,UAAK,WAAE,KAAI,UAAW,IAAI;;OAE3B,SAAA,cAIE;QAHM,KAAK,UADb,UAAA,GAAA,mBAIE,QAJF,UAIE,KAAA,mBAAA,IAAA,IAAA;QAC+B,KAAK,QAAtC,UAAA,GAAA,YAAkF,wBAAlE,KAAK,IAAI,GAAA;;SAAmB,eAAY;SAAO,OAAM;;QACrE,mBAA6D,QAA7D,YAA6D,gBAApB,KAAK,KAAK,GAAA,CAAA;QACtC,KAAK,UAAU,KAAA,KAA5B,UAAA,GAAA,YAEQ,eAAA;;SAF+B,SAAQ;SAAU,OAAM;;SAC7D,SAAA,cAAgB,CAAb,gBAAA,gBAAA,KAAK,KAAK,GAAA,CAAA,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"TitleBar.js","names":[],"sources":["../../../src/blocks/TitleBar/TitleBar.vue"],"sourcesContent":["<script lang=\"ts\">\n/**\n * TitleBar — a desktop app's custom window chrome (a block: composed from\n * primitives, domain-aware, but still presentational). Layout:\n *\n * [ ⬡ brand ] [ File View Help ] ····· drag / title ····· [ – ▢ ✕ ]\n *\n * The whole bar is a drag region (`-webkit-app-region: drag`); the interactive\n * clusters (Menubar, WindowControls) opt back out. It owns NO app logic — it\n * re-emits `select` from the menu and the window intents, so the desktop host\n * wires the window bridge around it.\n */\nimport type { MenubarMenu } from \"../../primitives/Menubar/Menubar.vue\";\n</script>\n\n<script setup lang=\"ts\">\nimport Menubar from \"../../primitives/Menubar/Menubar.vue\";\nimport WindowControls, {\n type WindowControlsLabels,\n} from \"../../primitives/WindowControls/WindowControls.vue\";\nimport BrandMark from \"../../icons/BrandMark\";\nimport { optional } from \"../../lib/props\";\n\nwithDefaults(\n defineProps<{\n /** The host app's brand name — required: this block has no identity of its own. */\n appName: string;\n /** Centered subtitle — usually the open project / composition. */\n title?: string;\n menus?: MenubarMenu[];\n isMaximized?: boolean;\n /** Passed through to WindowControls (host-side i18n); omit for its English defaults. */\n windowControlsLabels?: WindowControlsLabels;\n }>(),\n {\n title: \"\",\n menus: () => [],\n isMaximized: false,\n },\n);\n\nconst emit = defineEmits<{\n (e: \"select\", command: string): void;\n (e: \"minimize\"): void;\n (e: \"maximize\"): void;\n (e: \"close\"): void;\n}>();\n</script>\n\n<template>\n <header\n class=\"flex h-9 select-none items-center border-b border-border bg-card text-foreground\"\n style=\"-webkit-app-region: drag\"\n >\n <!-- Brand. Deliberately NOT `no-drag`: nothing here is interactive, and the\n logo corner is the spot people reach for to move a window — opting it\n out of the drag region would take that away and give nothing back.\n Only the clusters that actually take clicks (Menubar, WindowControls)\n opt out. -->\n <div class=\"flex shrink-0 items-center gap-2 pl-3 pr-1.5\">\n <span\n class=\"grid h-4 w-4 place-items-center rounded-[5px] bg-primary text-primary-foreground shadow-sm\"\n aria-hidden=\"true\"\n >\n <!-- stroke bumped for optical balance at tiny size -->\n <BrandMark :size=\"10\" :stroke-width=\"2.5\" />\n </span>\n <span class=\"text-xs font-semibold tracking-tight\">{{ appName }}</span>\n </div>\n\n <!-- Menu bar -->\n <Menubar v-if=\"menus.length\" :menus=\"menus\" @select=\"emit('select', $event)\" />\n\n <!-- Draggable spacer + centered title -->\n <div class=\"flex min-w-0 flex-1 items-center justify-center overflow-hidden px-4\">\n <span v-if=\"title\" class=\"truncate text-xs text-muted-foreground\">{{ title }}</span>\n </div>\n\n <!-- Window controls -->\n <WindowControls\n :is-maximized=\"isMaximized\"\n v-bind=\"optional({ labels: windowControlsLabels })\"\n @minimize=\"emit('minimize')\"\n @maximize=\"emit('maximize')\"\n @close=\"emit('close')\"\n />\n </header>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"TitleBar.js","names":[],"sources":["../../../src/blocks/TitleBar/TitleBar.vue"],"sourcesContent":["<script lang=\"ts\">\n/**\n * TitleBar — a desktop app's custom window chrome (a block: composed from\n * primitives, domain-aware, but still presentational). Layout:\n *\n * Windows / Linux:\n * [ ⬡ brand ] [ File View Help ] ····· drag / title ····· [ – ▢ ✕ ]\n *\n * macOS (native traffic-lights on the left):\n * [ 🔴🟡🟢 ⬡ brand ] [ File View Help ] ····· drag / title ·····\n *\n * The whole bar is a drag region (`-webkit-app-region: drag`); the interactive\n * clusters (Menubar, WindowControls) opt back out. It owns NO app logic — it\n * re-emits `select` from the menu and the window intents, so the desktop host\n * wires the window bridge around it.\n *\n * `platform` is the host's declaration, not a runtime sniff: a Tauri/Electron\n * host already knows its OS, and a PWA has no native window controls. On macOS\n * the brand cluster shifts right to leave room for the native traffic-light\n * buttons, and WindowControls renders nothing (the OS owns those buttons).\n */\nimport type { MenubarMenu } from \"../../primitives/Menubar/Menubar.vue\";\nimport type { WindowPlatform } from \"../../primitives/WindowControls/WindowControls.vue\";\n</script>\n\n<script setup lang=\"ts\">\nimport Menubar from \"../../primitives/Menubar/Menubar.vue\";\nimport WindowControls, {\n type WindowControlsLabels,\n} from \"../../primitives/WindowControls/WindowControls.vue\";\nimport { optional } from \"../../lib/props\";\n\nwithDefaults(\n defineProps<{\n /** The host app's brand name — required: this block has no identity of its own. */\n appName: string;\n /** Centered subtitle — usually the open project / composition. */\n title?: string;\n menus?: MenubarMenu[];\n isMaximized?: boolean;\n /**\n * The desktop platform the window runs on. Controls whether WindowControls\n * renders (hidden on macOS) and how the brand cluster is spaced (shifted\n * right on macOS to avoid the native traffic-light buttons). The host\n * decides — Loom never sniffs the OS at runtime.\n */\n platform?: WindowPlatform;\n /** Passed through to WindowControls (host-side i18n); omit for its English defaults. */\n windowControlsLabels?: WindowControlsLabels;\n }>(),\n {\n title: \"\",\n menus: () => [],\n isMaximized: false,\n platform: \"windows\",\n },\n);\n\nconst emit = defineEmits<{\n (e: \"select\", command: string): void;\n (e: \"minimize\"): void;\n (e: \"maximize\"): void;\n (e: \"close\"): void;\n}>();\n</script>\n\n<template>\n <header\n data-loom-titlebar\n class=\"flex h-9 select-none items-center border-b border-border bg-card text-foreground\"\n style=\"-webkit-app-region: drag\"\n >\n <!-- Brand. Deliberately NOT `no-drag`: nothing here is interactive, and the\n logo corner is the spot people reach for to move a window — opting it\n out of the drag region would take that away and give nothing back.\n Only the clusters that actually take clicks (Menubar, WindowControls)\n opt out.\n\n On macOS the brand cluster shifts right to leave room for the native\n traffic-light buttons. The 4.5rem (72px) covers the three 12px\n buttons plus their 8px left margin and 4px inter-button gap, matching\n what macOS draws at the default window scale. -->\n <div\n class=\"flex shrink-0 items-center gap-2 pr-1.5\"\n :class=\"platform === 'macos' ? 'pl-[4.5rem]' : 'pl-3'\"\n >\n <!-- @slot Brand icon — the consumer provides their own mark. Rendered\n inside a 16px coloured tile, `aria-hidden` by the container. -->\n <slot name=\"brandIcon\">\n <span\n class=\"grid h-4 w-4 place-items-center rounded-[5px] bg-primary text-primary-foreground shadow-sm\"\n aria-hidden=\"true\"\n >\n <!-- stroke bumped for optical balance at tiny size -->\n <slot name=\"brandMark\" />\n </span>\n </slot>\n <span class=\"text-xs font-semibold tracking-tight\">{{ appName }}</span>\n </div>\n\n <!-- Menu bar -->\n <Menubar v-if=\"menus.length\" :menus=\"menus\" @select=\"emit('select', $event)\" />\n\n <!-- Draggable spacer + centered title -->\n <div class=\"flex min-w-0 flex-1 items-center justify-center overflow-hidden px-4\">\n <span v-if=\"title\" class=\"truncate text-xs text-muted-foreground\">{{ title }}</span>\n </div>\n\n <!-- Window controls (hidden on macOS — the OS draws its own) -->\n <WindowControls\n :platform=\"platform\"\n :is-maximized=\"isMaximized\"\n v-bind=\"optional({ labels: windowControlsLabels })\"\n @minimize=\"emit('minimize')\"\n @maximize=\"emit('maximize')\"\n @close=\"emit('close')\"\n />\n </header>\n</template>\n"],"mappings":""}
@@ -3,23 +3,40 @@ import { type WindowControlsLabels } from "../../primitives/WindowControls/Windo
3
3
  * TitleBar — a desktop app's custom window chrome (a block: composed from
4
4
  * primitives, domain-aware, but still presentational). Layout:
5
5
  *
6
+ * Windows / Linux:
6
7
  * [ ⬡ brand ] [ File View Help ] ····· drag / title ····· [ – ▢ ✕ ]
7
8
  *
9
+ * macOS (native traffic-lights on the left):
10
+ * [ 🔴🟡🟢 ⬡ brand ] [ File View Help ] ····· drag / title ·····
11
+ *
8
12
  * The whole bar is a drag region (`-webkit-app-region: drag`); the interactive
9
13
  * clusters (Menubar, WindowControls) opt back out. It owns NO app logic — it
10
14
  * re-emits `select` from the menu and the window intents, so the desktop host
11
15
  * wires the window bridge around it.
16
+ *
17
+ * `platform` is the host's declaration, not a runtime sniff: a Tauri/Electron
18
+ * host already knows its OS, and a PWA has no native window controls. On macOS
19
+ * the brand cluster shifts right to leave room for the native traffic-light
20
+ * buttons, and WindowControls renders nothing (the OS owns those buttons).
12
21
  */
13
22
  import type { MenubarMenu } from "../../primitives/Menubar/Menubar.vue";
23
+ import type { WindowPlatform } from "../../primitives/WindowControls/WindowControls.vue";
14
24
  declare const _default: typeof __VLS_export;
15
25
  export default _default;
16
- declare const __VLS_export: import("vue").DefineComponent<{
26
+ declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<{
17
27
  /** The host app's brand name — required: this block has no identity of its own. */
18
28
  appName: string;
19
29
  /** Centered subtitle — usually the open project / composition. */
20
30
  title?: string;
21
31
  menus?: MenubarMenu[];
22
32
  isMaximized?: boolean;
33
+ /**
34
+ * The desktop platform the window runs on. Controls whether WindowControls
35
+ * renders (hidden on macOS) and how the brand cluster is spaced (shifted
36
+ * right on macOS to avoid the native traffic-light buttons). The host
37
+ * decides — Loom never sniffs the OS at runtime.
38
+ */
39
+ platform?: WindowPlatform;
23
40
  /** Passed through to WindowControls (host-side i18n); omit for its English defaults. */
24
41
  windowControlsLabels?: WindowControlsLabels;
25
42
  }, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
@@ -34,6 +51,13 @@ declare const __VLS_export: import("vue").DefineComponent<{
34
51
  title?: string;
35
52
  menus?: MenubarMenu[];
36
53
  isMaximized?: boolean;
54
+ /**
55
+ * The desktop platform the window runs on. Controls whether WindowControls
56
+ * renders (hidden on macOS) and how the brand cluster is spaced (shifted
57
+ * right on macOS to avoid the native traffic-light buttons). The host
58
+ * decides — Loom never sniffs the OS at runtime.
59
+ */
60
+ platform?: WindowPlatform;
37
61
  /** Passed through to WindowControls (host-side i18n); omit for its English defaults. */
38
62
  windowControlsLabels?: WindowControlsLabels;
39
63
  }> & Readonly<{
@@ -43,7 +67,17 @@ declare const __VLS_export: import("vue").DefineComponent<{
43
67
  onMaximize?: () => any;
44
68
  }>, {
45
69
  title: string;
46
- menus: MenubarMenu[];
70
+ platform: WindowPlatform;
47
71
  isMaximized: boolean;
48
- }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
72
+ menus: MenubarMenu[];
73
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, {
74
+ brandIcon?: (props: {}) => any;
75
+ } & {
76
+ brandMark?: (props: {}) => any;
77
+ }>;
78
+ type __VLS_WithSlots<T, S> = T & {
79
+ new (): {
80
+ $slots: S;
81
+ };
82
+ };
49
83
  //# sourceMappingURL=TitleBar.vue.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TitleBar.vue.d.ts","sourceRoot":"","sources":["../../../src/blocks/TitleBar/TitleBar.vue"],"names":[],"mappings":"AA4FA,OAAuB,EACrB,KAAK,oBAAoB,EAC1B,MAAM,oDAAoD,CAAC;AAK5D;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;wBACnD,OAAO,YAAY;AAAxC,wBAAyC;AACzC,QAAA,MAAM,YAAY;IAEd,mFAAmF;aAC1E,MAAM;IACf,kEAAkE;YAC1D,MAAM;YACN,WAAW,EAAE;kBACP,OAAO;IACrB,wFAAwF;2BACjE,oBAAoB;;;;;;;IAP3C,mFAAmF;aAC1E,MAAM;IACf,kEAAkE;YAC1D,MAAM;YACN,WAAW,EAAE;kBACP,OAAO;IACrB,wFAAwF;2BACjE,oBAAoB;;;;;;;WAJnC,MAAM;WACN,WAAW,EAAE;iBACP,OAAO;6EAkMrB,CAAC"}
1
+ {"version":3,"file":"TitleBar.vue.d.ts","sourceRoot":"","sources":["../../../src/blocks/TitleBar/TitleBar.vue"],"names":[],"mappings":"AA2HA,OAAuB,EACrB,KAAK,oBAAoB,EAC1B,MAAM,oDAAoD,CAAC;AAI5D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oDAAoD,CAAC;wBACpE,OAAO,YAAY;AAAxC,wBAAyC;AACzC,QAAA,MAAM,YAAY;IAEd,mFAAmF;aAC1E,MAAM;IACf,kEAAkE;YAC1D,MAAM;YACN,WAAW,EAAE;kBACP,OAAO;IACrB;;;;;OAKG;eACQ,cAAc;IACzB,wFAAwF;2BACjE,oBAAoB;;;;;;;IAd3C,mFAAmF;aAC1E,MAAM;IACf,kEAAkE;YAC1D,MAAM;YACN,WAAW,EAAE;kBACP,OAAO;IACrB;;;;;OAKG;eACQ,cAAc;IACzB,wFAAwF;2BACjE,oBAAoB;;;;;;;WAXnC,MAAM;cASH,cAAc;iBAPX,OAAO;WADb,WAAW,EAAE;;gBAgMT,CAAC,KAAK,IAAgB,KAAK,GAAG;;gBAC9B,CAAC,KAAK,IAAgB,KAAK,GAAG;EAW1C,CAAC;AAWL,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
@@ -1,21 +1,20 @@
1
1
  import { optional } from "../../lib/props.js";
2
2
  import Menubar_default from "../../primitives/Menubar/Menubar.js";
3
3
  import WindowControls_default from "../../primitives/WindowControls/WindowControls.js";
4
- import BrandMark from "../../icons/BrandMark.js";
5
- import { createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, mergeProps, openBlock, toDisplayString, unref } from "vue";
4
+ import { createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, mergeProps, normalizeClass, openBlock, renderSlot, toDisplayString, unref } from "vue";
6
5
  //#region src/blocks/TitleBar/TitleBar.vue?vue&type=script&setup=true&lang.ts
7
6
  var _hoisted_1 = {
7
+ "data-loom-titlebar": "",
8
8
  class: "flex h-9 select-none items-center border-b border-border bg-card text-foreground",
9
9
  style: { "-webkit-app-region": "drag" }
10
10
  };
11
- var _hoisted_2 = { class: "flex shrink-0 items-center gap-2 pl-3 pr-1.5" };
12
- var _hoisted_3 = {
11
+ var _hoisted_2 = {
13
12
  class: "grid h-4 w-4 place-items-center rounded-[5px] bg-primary text-primary-foreground shadow-sm",
14
13
  "aria-hidden": "true"
15
14
  };
16
- var _hoisted_4 = { class: "text-xs font-semibold tracking-tight" };
17
- var _hoisted_5 = { class: "flex min-w-0 flex-1 items-center justify-center overflow-hidden px-4" };
18
- var _hoisted_6 = {
15
+ var _hoisted_3 = { class: "text-xs font-semibold tracking-tight" };
16
+ var _hoisted_4 = { class: "flex min-w-0 flex-1 items-center justify-center overflow-hidden px-4" };
17
+ var _hoisted_5 = {
19
18
  key: 0,
20
19
  class: "truncate text-xs text-muted-foreground"
21
20
  };
@@ -29,6 +28,7 @@ var TitleBar_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
29
28
  type: Boolean,
30
29
  default: false
31
30
  },
31
+ platform: { default: "windows" },
32
32
  windowControlsLabels: {}
33
33
  },
34
34
  emits: [
@@ -41,21 +41,21 @@ var TitleBar_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
41
41
  const emit = __emit;
42
42
  return (_ctx, _cache) => {
43
43
  return openBlock(), createElementBlock("header", _hoisted_1, [
44
- createElementVNode("div", _hoisted_2, [createElementVNode("span", _hoisted_3, [createVNode(unref(BrandMark), {
45
- size: 10,
46
- "stroke-width": 2.5
47
- })]), createElementVNode("span", _hoisted_4, toDisplayString(__props.appName), 1)]),
44
+ createElementVNode("div", { class: normalizeClass(["flex shrink-0 items-center gap-2 pr-1.5", __props.platform === "macos" ? "pl-[4.5rem]" : "pl-3"]) }, [renderSlot(_ctx.$slots, "brandIcon", {}, () => [createElementVNode("span", _hoisted_2, [renderSlot(_ctx.$slots, "brandMark")])]), createElementVNode("span", _hoisted_3, toDisplayString(__props.appName), 1)], 2),
48
45
  __props.menus.length ? (openBlock(), createBlock(Menubar_default, {
49
46
  key: 0,
50
47
  menus: __props.menus,
51
48
  onSelect: _cache[0] || (_cache[0] = ($event) => emit("select", $event))
52
49
  }, null, 8, ["menus"])) : createCommentVNode("", true),
53
- createElementVNode("div", _hoisted_5, [__props.title ? (openBlock(), createElementBlock("span", _hoisted_6, toDisplayString(__props.title), 1)) : createCommentVNode("", true)]),
54
- createVNode(WindowControls_default, mergeProps({ "is-maximized": __props.isMaximized }, unref(optional)({ labels: __props.windowControlsLabels }), {
50
+ createElementVNode("div", _hoisted_4, [__props.title ? (openBlock(), createElementBlock("span", _hoisted_5, toDisplayString(__props.title), 1)) : createCommentVNode("", true)]),
51
+ createVNode(WindowControls_default, mergeProps({
52
+ platform: __props.platform,
53
+ "is-maximized": __props.isMaximized
54
+ }, unref(optional)({ labels: __props.windowControlsLabels }), {
55
55
  onMinimize: _cache[1] || (_cache[1] = ($event) => emit("minimize")),
56
56
  onMaximize: _cache[2] || (_cache[2] = ($event) => emit("maximize")),
57
57
  onClose: _cache[3] || (_cache[3] = ($event) => emit("close"))
58
- }), null, 16, ["is-maximized"])
58
+ }), null, 16, ["platform", "is-maximized"])
59
59
  ]);
60
60
  };
61
61
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TitleBar.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/blocks/TitleBar/TitleBar.vue"],"sourcesContent":["<script lang=\"ts\">\n/**\n * TitleBar — a desktop app's custom window chrome (a block: composed from\n * primitives, domain-aware, but still presentational). Layout:\n *\n * [ ⬡ brand ] [ File View Help ] ····· drag / title ····· [ – ▢ ✕ ]\n *\n * The whole bar is a drag region (`-webkit-app-region: drag`); the interactive\n * clusters (Menubar, WindowControls) opt back out. It owns NO app logic — it\n * re-emits `select` from the menu and the window intents, so the desktop host\n * wires the window bridge around it.\n */\nimport type { MenubarMenu } from \"../../primitives/Menubar/Menubar.vue\";\n</script>\n\n<script setup lang=\"ts\">\nimport Menubar from \"../../primitives/Menubar/Menubar.vue\";\nimport WindowControls, {\n type WindowControlsLabels,\n} from \"../../primitives/WindowControls/WindowControls.vue\";\nimport BrandMark from \"../../icons/BrandMark\";\nimport { optional } from \"../../lib/props\";\n\nwithDefaults(\n defineProps<{\n /** The host app's brand name — required: this block has no identity of its own. */\n appName: string;\n /** Centered subtitle — usually the open project / composition. */\n title?: string;\n menus?: MenubarMenu[];\n isMaximized?: boolean;\n /** Passed through to WindowControls (host-side i18n); omit for its English defaults. */\n windowControlsLabels?: WindowControlsLabels;\n }>(),\n {\n title: \"\",\n menus: () => [],\n isMaximized: false,\n },\n);\n\nconst emit = defineEmits<{\n (e: \"select\", command: string): void;\n (e: \"minimize\"): void;\n (e: \"maximize\"): void;\n (e: \"close\"): void;\n}>();\n</script>\n\n<template>\n <header\n class=\"flex h-9 select-none items-center border-b border-border bg-card text-foreground\"\n style=\"-webkit-app-region: drag\"\n >\n <!-- Brand. Deliberately NOT `no-drag`: nothing here is interactive, and the\n logo corner is the spot people reach for to move a window — opting it\n out of the drag region would take that away and give nothing back.\n Only the clusters that actually take clicks (Menubar, WindowControls)\n opt out. -->\n <div class=\"flex shrink-0 items-center gap-2 pl-3 pr-1.5\">\n <span\n class=\"grid h-4 w-4 place-items-center rounded-[5px] bg-primary text-primary-foreground shadow-sm\"\n aria-hidden=\"true\"\n >\n <!-- stroke bumped for optical balance at tiny size -->\n <BrandMark :size=\"10\" :stroke-width=\"2.5\" />\n </span>\n <span class=\"text-xs font-semibold tracking-tight\">{{ appName }}</span>\n </div>\n\n <!-- Menu bar -->\n <Menubar v-if=\"menus.length\" :menus=\"menus\" @select=\"emit('select', $event)\" />\n\n <!-- Draggable spacer + centered title -->\n <div class=\"flex min-w-0 flex-1 items-center justify-center overflow-hidden px-4\">\n <span v-if=\"title\" class=\"truncate text-xs text-muted-foreground\">{{ title }}</span>\n </div>\n\n <!-- Window controls -->\n <WindowControls\n :is-maximized=\"isMaximized\"\n v-bind=\"optional({ labels: windowControlsLabels })\"\n @minimize=\"emit('minimize')\"\n @maximize=\"emit('maximize')\"\n @close=\"emit('close')\"\n />\n </header>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyCA,MAAM,OAAO;;GASX,OAAA,UAAA,GAAA,mBAoCS,UApCT,YAoCS;IA3BP,mBASM,OATN,YASM,CARJ,mBAMO,QANP,YAMO,CADL,YAA4C,MAAA,SAAA,GAAA;KAAhC,MAAM;KAAK,gBAAc;IAEvC,CAAA,CAAA,CAAA,GAAA,mBAAuE,QAAvE,YAAuE,gBAAjB,QAAA,OAAO,GAAA,CAAA,CAAA,CAAA;IAIhD,QAAA,MAAM,UAArB,UAAA,GAAA,YAA+E,iBAAA;;KAAjD,OAAO,QAAA;KAAQ,UAAM,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,UAAW,MAAM;;IAG1E,mBAEM,OAFN,YAEM,CADQ,QAAA,SAAZ,UAAA,GAAA,mBAAoF,QAApF,YAAoF,gBAAf,QAAA,KAAK,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA,CAAA,CAAA;IAI5E,YAME,wBANF,WAME,EALC,gBAAc,QAAA,YAAW,GAClB,MAAA,QAAA,CAAQ,CAAA,EAAA,QAAW,QAAA,qBAAoB,CAAA,GAAA;KAC9C,YAAQ,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,UAAA;KACd,YAAQ,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,UAAA;KACd,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,OAAA"}
1
+ {"version":3,"file":"TitleBar.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/blocks/TitleBar/TitleBar.vue"],"sourcesContent":["<script lang=\"ts\">\n/**\n * TitleBar — a desktop app's custom window chrome (a block: composed from\n * primitives, domain-aware, but still presentational). Layout:\n *\n * Windows / Linux:\n * [ ⬡ brand ] [ File View Help ] ····· drag / title ····· [ – ▢ ✕ ]\n *\n * macOS (native traffic-lights on the left):\n * [ 🔴🟡🟢 ⬡ brand ] [ File View Help ] ····· drag / title ·····\n *\n * The whole bar is a drag region (`-webkit-app-region: drag`); the interactive\n * clusters (Menubar, WindowControls) opt back out. It owns NO app logic — it\n * re-emits `select` from the menu and the window intents, so the desktop host\n * wires the window bridge around it.\n *\n * `platform` is the host's declaration, not a runtime sniff: a Tauri/Electron\n * host already knows its OS, and a PWA has no native window controls. On macOS\n * the brand cluster shifts right to leave room for the native traffic-light\n * buttons, and WindowControls renders nothing (the OS owns those buttons).\n */\nimport type { MenubarMenu } from \"../../primitives/Menubar/Menubar.vue\";\nimport type { WindowPlatform } from \"../../primitives/WindowControls/WindowControls.vue\";\n</script>\n\n<script setup lang=\"ts\">\nimport Menubar from \"../../primitives/Menubar/Menubar.vue\";\nimport WindowControls, {\n type WindowControlsLabels,\n} from \"../../primitives/WindowControls/WindowControls.vue\";\nimport { optional } from \"../../lib/props\";\n\nwithDefaults(\n defineProps<{\n /** The host app's brand name — required: this block has no identity of its own. */\n appName: string;\n /** Centered subtitle — usually the open project / composition. */\n title?: string;\n menus?: MenubarMenu[];\n isMaximized?: boolean;\n /**\n * The desktop platform the window runs on. Controls whether WindowControls\n * renders (hidden on macOS) and how the brand cluster is spaced (shifted\n * right on macOS to avoid the native traffic-light buttons). The host\n * decides — Loom never sniffs the OS at runtime.\n */\n platform?: WindowPlatform;\n /** Passed through to WindowControls (host-side i18n); omit for its English defaults. */\n windowControlsLabels?: WindowControlsLabels;\n }>(),\n {\n title: \"\",\n menus: () => [],\n isMaximized: false,\n platform: \"windows\",\n },\n);\n\nconst emit = defineEmits<{\n (e: \"select\", command: string): void;\n (e: \"minimize\"): void;\n (e: \"maximize\"): void;\n (e: \"close\"): void;\n}>();\n</script>\n\n<template>\n <header\n data-loom-titlebar\n class=\"flex h-9 select-none items-center border-b border-border bg-card text-foreground\"\n style=\"-webkit-app-region: drag\"\n >\n <!-- Brand. Deliberately NOT `no-drag`: nothing here is interactive, and the\n logo corner is the spot people reach for to move a window — opting it\n out of the drag region would take that away and give nothing back.\n Only the clusters that actually take clicks (Menubar, WindowControls)\n opt out.\n\n On macOS the brand cluster shifts right to leave room for the native\n traffic-light buttons. The 4.5rem (72px) covers the three 12px\n buttons plus their 8px left margin and 4px inter-button gap, matching\n what macOS draws at the default window scale. -->\n <div\n class=\"flex shrink-0 items-center gap-2 pr-1.5\"\n :class=\"platform === 'macos' ? 'pl-[4.5rem]' : 'pl-3'\"\n >\n <!-- @slot Brand icon — the consumer provides their own mark. Rendered\n inside a 16px coloured tile, `aria-hidden` by the container. -->\n <slot name=\"brandIcon\">\n <span\n class=\"grid h-4 w-4 place-items-center rounded-[5px] bg-primary text-primary-foreground shadow-sm\"\n aria-hidden=\"true\"\n >\n <!-- stroke bumped for optical balance at tiny size -->\n <slot name=\"brandMark\" />\n </span>\n </slot>\n <span class=\"text-xs font-semibold tracking-tight\">{{ appName }}</span>\n </div>\n\n <!-- Menu bar -->\n <Menubar v-if=\"menus.length\" :menus=\"menus\" @select=\"emit('select', $event)\" />\n\n <!-- Draggable spacer + centered title -->\n <div class=\"flex min-w-0 flex-1 items-center justify-center overflow-hidden px-4\">\n <span v-if=\"title\" class=\"truncate text-xs text-muted-foreground\">{{ title }}</span>\n </div>\n\n <!-- Window controls (hidden on macOS — the OS draws its own) -->\n <WindowControls\n :platform=\"platform\"\n :is-maximized=\"isMaximized\"\n v-bind=\"optional({ labels: windowControlsLabels })\"\n @minimize=\"emit('minimize')\"\n @maximize=\"emit('maximize')\"\n @close=\"emit('close')\"\n />\n </header>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0DA,MAAM,OAAO;;GASX,OAAA,UAAA,GAAA,mBAkDS,UAlDT,YAkDS;IAnCP,mBAgBM,OAAA,EAfJ,OAAK,eAAA,CAAC,2CACE,QAAA,aAAQ,UAAA,gBAAA,MAAA,CAAA,EAAA,GAAA,CAIhB,WAQO,KAAA,QAAA,aAAA,CAAA,SAAA,CAPL,mBAMO,QANP,YAMO,CADL,WAAyB,KAAA,QAAA,WAAA,CAAA,CAAA,CAAA,CAAA,GAG7B,mBAAuE,QAAvE,YAAuE,gBAAjB,QAAA,OAAO,GAAA,CAAA,CAAA,GAAA,CAAA;IAIhD,QAAA,MAAM,UAArB,UAAA,GAAA,YAA+E,iBAAA;;KAAjD,OAAO,QAAA;KAAQ,UAAM,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,UAAW,MAAM;;IAG1E,mBAEM,OAFN,YAEM,CADQ,QAAA,SAAZ,UAAA,GAAA,mBAAoF,QAApF,YAAoF,gBAAf,QAAA,KAAK,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA,CAAA,CAAA;IAI5E,YAOE,wBAPF,WAOE;KANC,UAAU,QAAA;KACV,gBAAc,QAAA;IACP,GAAA,MAAA,QAAA,CAAQ,CAAA,EAAA,QAAW,QAAA,qBAAoB,CAAA,GAAA;KAC9C,YAAQ,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,UAAA;KACd,YAAQ,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,UAAA;KACd,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,OAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"ToastStack.js","names":[],"sources":["../../../src/blocks/ToastStack/ToastStack.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { ToastVariant } from \"../../primitives/Toast/Toast.vue\";\n\n/** One entry of a host-owned toast queue, rendered by `ToastStack`. */\nexport interface ToastStackItem {\n readonly id: string | number;\n readonly title: string;\n readonly description?: string;\n readonly variant?: ToastVariant;\n /** ms before auto-dismiss (default 4000 — a stack turns over faster than a lone toast). */\n readonly duration?: number;\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { ToastProvider, ToastViewport } from \"reka-ui\";\nimport { optional } from \"../../lib/props\";\nimport ToastItem from \"../../primitives/Toast/ToastItem.vue\";\n\n/**\n * ToastStack — renders a host-owned toast queue through ONE shared\n * provider/viewport, so simultaneous toasts stack vertically with a gap\n * instead of piling onto the same fixed corner (which is what N standalone\n * `Toast`s produce — each bundles its own viewport at the same coordinates).\n *\n * The queue stays the host's: the host passes the visible entries and\n * removes an entry when `dismiss` fires — on close, swipe, Esc, or\n * auto-dismiss alike. This block owns only the shared-viewport treatment.\n * Every rendered item is driven with `open` fixed to `true` — `ToastStack`\n * decides an entry is visible by including it in `items`, never by an\n * item's own open state, so there is no per-item boolean left unset for\n * Vue's absent-prop casting to catch.\n *\n * The viewport's geometry is written for the two ends of the range it\n * actually lands in. Width is `min(92vw, 24rem)`, so a phone gets a\n * near-full-bleed card and a desktop a bounded one. The bottom inset\n * resolves through `env(safe-area-inset-bottom)` — on a device with a home\n * indicator a flat `p-4` puts the newest toast, and its dismiss control,\n * under the system gesture bar. And the stack is height-bounded\n * (`max-h-dvh` + `overflow-hidden`) so a host that hands over more entries\n * than fit pushes the oldest off the top rather than growing a column\n * taller than the screen. `dvh`, not `vh`: mobile browser chrome collapses\n * the visual viewport and `vh` does not follow.\n */\ndefineProps<{\n /** The host's visible toast queue, oldest first. */\n items: readonly ToastStackItem[];\n}>();\n\ndefineEmits<{ dismiss: [id: string | number] }>();\n</script>\n\n<template>\n <ToastProvider>\n <ToastItem\n v-for=\"item in items\"\n :key=\"item.id\"\n :open=\"true\"\n :title=\"item.title\"\n v-bind=\"optional({ description: item.description, variant: item.variant })\"\n :duration=\"item.duration ?? 4000\"\n @update:open=\"(open) => !open && $emit('dismiss', item.id)\"\n />\n\n <ToastViewport\n class=\"fixed bottom-0 right-0 z-[100] flex max-h-dvh w-[min(92vw,24rem)] flex-col gap-2 overflow-hidden p-4 pb-[max(1rem,env(safe-area-inset-bottom))] outline-none\"\n />\n </ToastProvider>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"ToastStack.js","names":[],"sources":["../../../src/blocks/ToastStack/ToastStack.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { ToastVariant } from \"../../primitives/Toast/Toast.vue\";\n\n/** One entry of a host-owned toast queue, rendered by `ToastStack`. */\nexport interface ToastStackItem {\n readonly id: string | number;\n readonly title: string;\n readonly description?: string;\n readonly variant?: ToastVariant;\n /** ms before auto-dismiss (default 4000 — a stack turns over faster than a lone toast). */\n readonly duration?: number;\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { ToastProvider, ToastViewport } from \"reka-ui\";\nimport { optional } from \"../../lib/props\";\nimport { useLabels, type LabelOverrides } from \"../../lib/labels\";\nimport ToastItem, { TOAST_LABELS, type ToastLabels } from \"../../primitives/Toast/ToastItem.vue\";\n\n/**\n * ToastStack — renders a host-owned toast queue through ONE shared\n * provider/viewport, so simultaneous toasts stack vertically with a gap\n * instead of piling onto the same fixed corner (which is what N standalone\n * `Toast`s produce — each bundles its own viewport at the same coordinates).\n *\n * The queue stays the host's: the host passes the visible entries and\n * removes an entry when `dismiss` fires — on close, swipe, Esc, or\n * auto-dismiss alike. This block owns only the shared-viewport treatment.\n * Every rendered item is driven with `open` fixed to `true` — `ToastStack`\n * decides an entry is visible by including it in `items`, never by an\n * item's own open state, so there is no per-item boolean left unset for\n * Vue's absent-prop casting to catch.\n *\n * The viewport's geometry is written for the two ends of the range it\n * actually lands in. Width is `min(92vw, 24rem)`, so a phone gets a\n * near-full-bleed card and a desktop a bounded one. The bottom inset\n * resolves through `env(safe-area-inset-bottom)` — on a device with a home\n * indicator a flat `p-4` puts the newest toast, and its dismiss control,\n * under the system gesture bar. And the stack is height-bounded\n * (`max-h-dvh` + `overflow-hidden`) so a host that hands over more entries\n * than fit pushes the oldest off the top rather than growing a column\n * taller than the screen. `dvh`, not `vh`: mobile browser chrome collapses\n * the visual viewport and `vh` does not follow.\n */\nconst props = defineProps<{\n /** The host's visible toast queue, oldest first. */\n items: readonly ToastStackItem[];\n /**\n * Names for the two things the shared region says out loud, as any subset of\n * `ToastLabels` — the rest stay as the host's `provideLoomLabels` vocabulary\n * left them, and then as Loom's English.\n *\n * It resolves the same `toast` slot each `ToastItem` does, so a host that has\n * localised toasts anywhere has localised this too and needs nothing here.\n */\n labels?: LabelOverrides<ToastLabels>;\n}>();\n\ndefineEmits<{ dismiss: [id: string | number] }>();\n\n// This block owns a provider and a viewport of its own rather than borrowing\n// `Toast`'s, which is the whole point of it — and that means it owns their two\n// names as well. Left unset they are not unnamed: Reka defaults them to\n// \"Notification\" and \"Notifications ({hotkey})\", English a host has no prop to\n// reach, in the one live region a screen reader is sent to by a hotkey.\nconst text = useLabels(\"toast\", TOAST_LABELS, () => props.labels);\n\n// The function form rather than Reka's `{hotkey}` template, for the reason\n// `Toast.vue` gives: the hole would be Loom deciding where the key sits in the\n// phrase, and that is a property of the language.\nconst regionLabel = computed(() => (hotkey: string) => text.value.region({ hotkey }));\n</script>\n\n<template>\n <ToastProvider :label=\"text.announce\">\n <ToastItem\n v-for=\"item in items\"\n :key=\"item.id\"\n :open=\"true\"\n :title=\"item.title\"\n v-bind=\"optional({ description: item.description, variant: item.variant })\"\n :duration=\"item.duration ?? 4000\"\n @update:open=\"(open) => !open && $emit('dismiss', item.id)\"\n />\n\n <ToastViewport\n :label=\"regionLabel\"\n class=\"fixed bottom-0 right-0 z-toast flex max-h-dvh w-[min(92vw,24rem)] flex-col gap-2 overflow-hidden p-4 pb-[max(1rem,env(safe-area-inset-bottom))] outline-none\"\n />\n </ToastProvider>\n</template>\n"],"mappings":""}
@@ -1,3 +1,5 @@
1
+ import { type LabelOverrides } from "../../lib/labels";
2
+ import { type ToastLabels } from "../../primitives/Toast/ToastItem.vue";
1
3
  import type { ToastVariant } from "../../primitives/Toast/Toast.vue";
2
4
  /** One entry of a host-owned toast queue, rendered by `ToastStack`. */
3
5
  export interface ToastStackItem {
@@ -13,11 +15,29 @@ export default _default;
13
15
  declare const __VLS_export: import("vue").DefineComponent<{
14
16
  /** The host's visible toast queue, oldest first. */
15
17
  items: readonly ToastStackItem[];
18
+ /**
19
+ * Names for the two things the shared region says out loud, as any subset of
20
+ * `ToastLabels` — the rest stay as the host's `provideLoomLabels` vocabulary
21
+ * left them, and then as Loom's English.
22
+ *
23
+ * It resolves the same `toast` slot each `ToastItem` does, so a host that has
24
+ * localised toasts anywhere has localised this too and needs nothing here.
25
+ */
26
+ labels?: LabelOverrides<ToastLabels>;
16
27
  }, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
17
28
  dismiss: (id: string | number) => any;
18
29
  }, string, import("vue").PublicProps, Readonly<{
19
30
  /** The host's visible toast queue, oldest first. */
20
31
  items: readonly ToastStackItem[];
32
+ /**
33
+ * Names for the two things the shared region says out loud, as any subset of
34
+ * `ToastLabels` — the rest stay as the host's `provideLoomLabels` vocabulary
35
+ * left them, and then as Loom's English.
36
+ *
37
+ * It resolves the same `toast` slot each `ToastItem` does, so a host that has
38
+ * localised toasts anywhere has localised this too and needs nothing here.
39
+ */
40
+ labels?: LabelOverrides<ToastLabels>;
21
41
  }> & Readonly<{
22
42
  onDismiss?: (id: string | number) => any;
23
43
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
@@ -1 +1 @@
1
- {"version":3,"file":"ToastStack.vue.d.ts","sourceRoot":"","sources":["../../../src/blocks/ToastStack/ToastStack.vue"],"names":[],"mappings":"AA6EA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAErE,uEAAuE;AACvE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC;IAChC,2FAA2F;IAC3F,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;wBACoB,OAAO,YAAY;AAAxC,wBAAyC;AACzC,QAAA,MAAM,YAAY;IA2BhB,oDAAoD;WAC7C,SAAS,cAAc,EAAE;;;;IADhC,oDAAoD;WAC7C,SAAS,cAAc,EAAE;;;kFAqG9B,CAAC"}
1
+ {"version":3,"file":"ToastStack.vue.d.ts","sourceRoot":"","sources":["../../../src/blocks/ToastStack/ToastStack.vue"],"names":[],"mappings":"AAmGA,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAkB,EAAgB,KAAK,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAGjG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAErE,uEAAuE;AACvE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC;IAChC,2FAA2F;IAC3F,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;wBACoB,OAAO,YAAY;AAAxC,wBAAyC;AACzC,QAAA,MAAM,YAAY;IA2BhB,oDAAoD;WAC7C,SAAS,cAAc,EAAE;IAChC;;;;;;;OAOG;aACM,cAAc,CAAC,WAAW,CAAC;;;;IAVpC,oDAAoD;WAC7C,SAAS,cAAc,EAAE;IAChC;;;;;;;OAOG;aACM,cAAc,CAAC,WAAW,CAAC;;;kFAuHlC,CAAC"}
@@ -1,15 +1,23 @@
1
1
  import { optional } from "../../lib/props.js";
2
+ import { useLabels } from "../../lib/labels.js";
3
+ import { TOAST_LABELS } from "../../primitives/Toast/ToastItem.vue_vue_type_script_setup_true_lang.js";
2
4
  import ToastItem_default from "../../primitives/Toast/ToastItem.js";
3
- import { Fragment, createBlock, createElementBlock, createVNode, defineComponent, mergeProps, openBlock, renderList, unref, withCtx } from "vue";
5
+ import { Fragment, computed, createBlock, createElementBlock, createVNode, defineComponent, mergeProps, openBlock, renderList, unref, withCtx } from "vue";
4
6
  import { ToastProvider, ToastViewport } from "reka-ui";
5
7
  //#region src/blocks/ToastStack/ToastStack.vue?vue&type=script&setup=true&lang.ts
6
8
  var ToastStack_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
7
9
  __name: "ToastStack",
8
- props: { items: {} },
10
+ props: {
11
+ items: {},
12
+ labels: {}
13
+ },
9
14
  emits: ["dismiss"],
10
15
  setup(__props) {
16
+ const props = __props;
17
+ const text = useLabels("toast", TOAST_LABELS, () => props.labels);
18
+ const regionLabel = computed(() => (hotkey) => text.value.region({ hotkey }));
11
19
  return (_ctx, _cache) => {
12
- return openBlock(), createBlock(unref(ToastProvider), null, {
20
+ return openBlock(), createBlock(unref(ToastProvider), { label: unref(text).announce }, {
13
21
  default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item) => {
14
22
  return openBlock(), createBlock(ToastItem_default, mergeProps({
15
23
  key: item.id,
@@ -26,9 +34,12 @@ var ToastStack_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
26
34
  "duration",
27
35
  "onUpdate:open"
28
36
  ]);
29
- }), 128)), createVNode(unref(ToastViewport), { class: "fixed bottom-0 right-0 z-[100] flex max-h-dvh w-[min(92vw,24rem)] flex-col gap-2 overflow-hidden p-4 pb-[max(1rem,env(safe-area-inset-bottom))] outline-none" })]),
37
+ }), 128)), createVNode(unref(ToastViewport), {
38
+ label: regionLabel.value,
39
+ class: "fixed bottom-0 right-0 z-toast flex max-h-dvh w-[min(92vw,24rem)] flex-col gap-2 overflow-hidden p-4 pb-[max(1rem,env(safe-area-inset-bottom))] outline-none"
40
+ }, null, 8, ["label"])]),
30
41
  _: 1
31
- });
42
+ }, 8, ["label"]);
32
43
  };
33
44
  }
34
45
  });
@@ -1 +1 @@
1
- {"version":3,"file":"ToastStack.vue_vue_type_script_setup_true_lang.js","names":["$emit"],"sources":["../../../src/blocks/ToastStack/ToastStack.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { ToastVariant } from \"../../primitives/Toast/Toast.vue\";\n\n/** One entry of a host-owned toast queue, rendered by `ToastStack`. */\nexport interface ToastStackItem {\n readonly id: string | number;\n readonly title: string;\n readonly description?: string;\n readonly variant?: ToastVariant;\n /** ms before auto-dismiss (default 4000 — a stack turns over faster than a lone toast). */\n readonly duration?: number;\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { ToastProvider, ToastViewport } from \"reka-ui\";\nimport { optional } from \"../../lib/props\";\nimport ToastItem from \"../../primitives/Toast/ToastItem.vue\";\n\n/**\n * ToastStack — renders a host-owned toast queue through ONE shared\n * provider/viewport, so simultaneous toasts stack vertically with a gap\n * instead of piling onto the same fixed corner (which is what N standalone\n * `Toast`s produce — each bundles its own viewport at the same coordinates).\n *\n * The queue stays the host's: the host passes the visible entries and\n * removes an entry when `dismiss` fires — on close, swipe, Esc, or\n * auto-dismiss alike. This block owns only the shared-viewport treatment.\n * Every rendered item is driven with `open` fixed to `true` — `ToastStack`\n * decides an entry is visible by including it in `items`, never by an\n * item's own open state, so there is no per-item boolean left unset for\n * Vue's absent-prop casting to catch.\n *\n * The viewport's geometry is written for the two ends of the range it\n * actually lands in. Width is `min(92vw, 24rem)`, so a phone gets a\n * near-full-bleed card and a desktop a bounded one. The bottom inset\n * resolves through `env(safe-area-inset-bottom)` — on a device with a home\n * indicator a flat `p-4` puts the newest toast, and its dismiss control,\n * under the system gesture bar. And the stack is height-bounded\n * (`max-h-dvh` + `overflow-hidden`) so a host that hands over more entries\n * than fit pushes the oldest off the top rather than growing a column\n * taller than the screen. `dvh`, not `vh`: mobile browser chrome collapses\n * the visual viewport and `vh` does not follow.\n */\ndefineProps<{\n /** The host's visible toast queue, oldest first. */\n items: readonly ToastStackItem[];\n}>();\n\ndefineEmits<{ dismiss: [id: string | number] }>();\n</script>\n\n<template>\n <ToastProvider>\n <ToastItem\n v-for=\"item in items\"\n :key=\"item.id\"\n :open=\"true\"\n :title=\"item.title\"\n v-bind=\"optional({ description: item.description, variant: item.variant })\"\n :duration=\"item.duration ?? 4000\"\n @update:open=\"(open) => !open && $emit('dismiss', item.id)\"\n />\n\n <ToastViewport\n class=\"fixed bottom-0 right-0 z-[100] flex max-h-dvh w-[min(92vw,24rem)] flex-col gap-2 overflow-hidden p-4 pb-[max(1rem,env(safe-area-inset-bottom))] outline-none\"\n />\n </ToastProvider>\n</template>\n"],"mappings":";;;;;;;;;;;GAqDE,OAAA,UAAA,GAAA,YAcgB,MAAA,aAAA,GAAA,MAAA;IAZZ,SAAA,cAAqB,EADvB,UAAA,IAAA,GAAA,mBAQE,UAAA,MAAA,WAPe,QAAA,QAAR,SAAI;KADb,OAAA,UAAA,GAAA,YAQE,mBARF,WAQE;MANC,KAAK,KAAK;MACV,MAAM;MACN,OAAO,KAAK;KACL,GAAA,EAAA,SAAA,KAAA,GAAA,MAAA,QAAA,CAAQ,CAAA;MAAA,aAAgB,KAAK;MAAW,SAAW,KAAK;KAAO,CAAA,GAAA;MACtE,UAAU,KAAK,YAAQ;MACvB,kBAAc,SAAI,CAAM,QAAQA,KAAAA,MAAK,WAAY,KAAK,EAAE;;;;;;IAG3D,CAAA,GAAA,GAAA,IAAA,YAEE,MAAA,aAAA,GAAA,EADA,OAAM,+JAA8J,CAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"ToastStack.vue_vue_type_script_setup_true_lang.js","names":["$emit"],"sources":["../../../src/blocks/ToastStack/ToastStack.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { ToastVariant } from \"../../primitives/Toast/Toast.vue\";\n\n/** One entry of a host-owned toast queue, rendered by `ToastStack`. */\nexport interface ToastStackItem {\n readonly id: string | number;\n readonly title: string;\n readonly description?: string;\n readonly variant?: ToastVariant;\n /** ms before auto-dismiss (default 4000 — a stack turns over faster than a lone toast). */\n readonly duration?: number;\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { ToastProvider, ToastViewport } from \"reka-ui\";\nimport { optional } from \"../../lib/props\";\nimport { useLabels, type LabelOverrides } from \"../../lib/labels\";\nimport ToastItem, { TOAST_LABELS, type ToastLabels } from \"../../primitives/Toast/ToastItem.vue\";\n\n/**\n * ToastStack — renders a host-owned toast queue through ONE shared\n * provider/viewport, so simultaneous toasts stack vertically with a gap\n * instead of piling onto the same fixed corner (which is what N standalone\n * `Toast`s produce — each bundles its own viewport at the same coordinates).\n *\n * The queue stays the host's: the host passes the visible entries and\n * removes an entry when `dismiss` fires — on close, swipe, Esc, or\n * auto-dismiss alike. This block owns only the shared-viewport treatment.\n * Every rendered item is driven with `open` fixed to `true` — `ToastStack`\n * decides an entry is visible by including it in `items`, never by an\n * item's own open state, so there is no per-item boolean left unset for\n * Vue's absent-prop casting to catch.\n *\n * The viewport's geometry is written for the two ends of the range it\n * actually lands in. Width is `min(92vw, 24rem)`, so a phone gets a\n * near-full-bleed card and a desktop a bounded one. The bottom inset\n * resolves through `env(safe-area-inset-bottom)` — on a device with a home\n * indicator a flat `p-4` puts the newest toast, and its dismiss control,\n * under the system gesture bar. And the stack is height-bounded\n * (`max-h-dvh` + `overflow-hidden`) so a host that hands over more entries\n * than fit pushes the oldest off the top rather than growing a column\n * taller than the screen. `dvh`, not `vh`: mobile browser chrome collapses\n * the visual viewport and `vh` does not follow.\n */\nconst props = defineProps<{\n /** The host's visible toast queue, oldest first. */\n items: readonly ToastStackItem[];\n /**\n * Names for the two things the shared region says out loud, as any subset of\n * `ToastLabels` — the rest stay as the host's `provideLoomLabels` vocabulary\n * left them, and then as Loom's English.\n *\n * It resolves the same `toast` slot each `ToastItem` does, so a host that has\n * localised toasts anywhere has localised this too and needs nothing here.\n */\n labels?: LabelOverrides<ToastLabels>;\n}>();\n\ndefineEmits<{ dismiss: [id: string | number] }>();\n\n// This block owns a provider and a viewport of its own rather than borrowing\n// `Toast`'s, which is the whole point of it — and that means it owns their two\n// names as well. Left unset they are not unnamed: Reka defaults them to\n// \"Notification\" and \"Notifications ({hotkey})\", English a host has no prop to\n// reach, in the one live region a screen reader is sent to by a hotkey.\nconst text = useLabels(\"toast\", TOAST_LABELS, () => props.labels);\n\n// The function form rather than Reka's `{hotkey}` template, for the reason\n// `Toast.vue` gives: the hole would be Loom deciding where the key sits in the\n// phrase, and that is a property of the language.\nconst regionLabel = computed(() => (hotkey: string) => text.value.region({ hotkey }));\n</script>\n\n<template>\n <ToastProvider :label=\"text.announce\">\n <ToastItem\n v-for=\"item in items\"\n :key=\"item.id\"\n :open=\"true\"\n :title=\"item.title\"\n v-bind=\"optional({ description: item.description, variant: item.variant })\"\n :duration=\"item.duration ?? 4000\"\n @update:open=\"(open) => !open && $emit('dismiss', item.id)\"\n />\n\n <ToastViewport\n :label=\"regionLabel\"\n class=\"fixed bottom-0 right-0 z-toast flex max-h-dvh w-[min(92vw,24rem)] flex-col gap-2 overflow-hidden p-4 pb-[max(1rem,env(safe-area-inset-bottom))] outline-none\"\n />\n </ToastProvider>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;EA8CA,MAAM,QAAQ;EAqBd,MAAM,OAAO,UAAU,SAAS,oBAAoB,MAAM,MAAM;EAKhE,MAAM,cAAc,gBAAgB,WAAmB,KAAK,MAAM,OAAO,EAAE,OAAO,CAAC,CAAC;;GAIlF,OAAA,UAAA,GAAA,YAegB,MAAA,aAAA,GAAA,EAfA,OAAO,MAAA,IAAA,CAAI,CAAC,SAAA,GAAA;IAExB,SAAA,cAAqB,EADvB,UAAA,IAAA,GAAA,mBAQE,UAAA,MAAA,WAPe,QAAA,QAAR,SAAI;KADb,OAAA,UAAA,GAAA,YAQE,mBARF,WAQE;MANC,KAAK,KAAK;MACV,MAAM;MACN,OAAO,KAAK;KACL,GAAA,EAAA,SAAA,KAAA,GAAA,MAAA,QAAA,CAAQ,CAAA;MAAA,aAAgB,KAAK;MAAW,SAAW,KAAK;KAAO,CAAA,GAAA;MACtE,UAAU,KAAK,YAAQ;MACvB,kBAAc,SAAI,CAAM,QAAQA,KAAAA,MAAK,WAAY,KAAK,EAAE;;;;;;IAG3D,CAAA,GAAA,GAAA,IAAA,YAGE,MAAA,aAAA,GAAA;KAFC,OAAO,YAAA;KACR,OAAM"}
@@ -0,0 +1,7 @@
1
+ import Center_vue_vue_type_script_setup_true_lang_default, { maxWidthClass } from "./Center.vue_vue_type_script_setup_true_lang.js";
2
+ //#region src/composition/Center/Center.vue
3
+ var Center_default = Center_vue_vue_type_script_setup_true_lang_default;
4
+ //#endregion
5
+ export { Center_default as default, maxWidthClass };
6
+
7
+ //# sourceMappingURL=Center.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Center.js","names":[],"sources":["../../../src/composition/Center/Center.vue"],"sourcesContent":["<script lang=\"ts\">\n/**\n * Center — centered content with a max-width constraint.\n *\n * A horizontally centered block that caps its own width and widens its\n * gutters at wider breakpoints. Critical for ultra-wide viewports, where\n * content that stretches to infinity is unreadable: the extra viewport goes\n * to intentional whitespace, never to stretching lines of text or card grids.\n *\n * A Center is a component, not `mx-auto max-w-3xl px-4`, because the\n * gutters step up at breakpoints (the component's job, not every call\n * site's) and the `maxWidth` prop names readable intent rather than a\n * Tailwind size.\n */\nexport type CenterMaxWidth = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"prose\";\n\nconst maxWidthClass: Record<CenterMaxWidth, string> = {\n sm: \"max-w-sm\",\n md: \"max-w-md\",\n lg: \"max-w-lg\",\n xl: \"max-w-xl\",\n prose: \"max-w-prose\",\n} as const;\n\nexport { maxWidthClass };\n</script>\n\n<script setup lang=\"ts\">\nimport { cn } from \"../../lib/cn\";\n\nwithDefaults(\n defineProps<{\n /** Maximum content width — names intent rather than a pixel value. */\n maxWidth?: CenterMaxWidth;\n /** Whether to add horizontal gutters that widen at wider breakpoints. */\n gutter?: boolean;\n }>(),\n { maxWidth: \"lg\", gutter: true },\n);\n</script>\n\n<template>\n <!--\n Gutters step up at `sm` and `3xl`: narrow viewports need less margin\n because the viewport itself is margin, and ultra-wide viewports need more\n so the gap between content and screen edge stays proportional.\n -->\n <div\n :class=\"cn(maxWidthClass[maxWidth], 'mx-auto', gutter ? 'px-4 sm:px-6 3xl:px-8' : undefined)\"\n >\n <slot />\n </div>\n</template>\n"],"mappings":""}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Center — centered content with a max-width constraint.
3
+ *
4
+ * A horizontally centered block that caps its own width and widens its
5
+ * gutters at wider breakpoints. Critical for ultra-wide viewports, where
6
+ * content that stretches to infinity is unreadable: the extra viewport goes
7
+ * to intentional whitespace, never to stretching lines of text or card grids.
8
+ *
9
+ * A Center is a component, not `mx-auto max-w-3xl px-4`, because the
10
+ * gutters step up at breakpoints (the component's job, not every call
11
+ * site's) and the `maxWidth` prop names readable intent rather than a
12
+ * Tailwind size.
13
+ */
14
+ export type CenterMaxWidth = "sm" | "md" | "lg" | "xl" | "prose";
15
+ declare const maxWidthClass: Record<CenterMaxWidth, string>;
16
+ export { maxWidthClass };
17
+ declare const _default: typeof __VLS_export;
18
+ export default _default;
19
+ declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<{
20
+ /** Maximum content width — names intent rather than a pixel value. */
21
+ maxWidth?: CenterMaxWidth;
22
+ /** Whether to add horizontal gutters that widen at wider breakpoints. */
23
+ gutter?: boolean;
24
+ }, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{
25
+ /** Maximum content width — names intent rather than a pixel value. */
26
+ maxWidth?: CenterMaxWidth;
27
+ /** Whether to add horizontal gutters that widen at wider breakpoints. */
28
+ gutter?: boolean;
29
+ }> & Readonly<{}>, {
30
+ maxWidth: CenterMaxWidth;
31
+ gutter: boolean;
32
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, {
33
+ default?: (props: {}) => any;
34
+ }>;
35
+ type __VLS_WithSlots<T, S> = T & {
36
+ new (): {
37
+ $slots: S;
38
+ };
39
+ };
40
+ //# sourceMappingURL=Center.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Center.vue.d.ts","sourceRoot":"","sources":["../../../src/composition/Center/Center.vue"],"names":[],"mappings":"AA2DA;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC;AAEjE,QAAA,MAAM,aAAa,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAMxC,CAAC;AAEX,OAAO,EAAE,aAAa,EAAE,CAAC;wBACJ,OAAO,YAAY;AAAxC,wBAAyC;AACzC,QAAA,MAAM,YAAY;IAEd,sEAAsE;eAC3D,cAAc;IACzB,yEAAyE;aAChE,OAAO;;IAHhB,sEAAsE;eAC3D,cAAc;IACzB,yEAAyE;aAChE,OAAO;;cAFL,cAAc;YAEhB,OAAO;;cAkCN,CAAC,KAAK,IAAgB,KAAK,GAAG;EAUxC,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,29 @@
1
+ import { cn } from "../../lib/cn.js";
2
+ import { createElementBlock, defineComponent, normalizeClass, openBlock, renderSlot, unref } from "vue";
3
+ //#region src/composition/Center/Center.vue?vue&type=script&setup=true&lang.ts
4
+ var maxWidthClass = {
5
+ sm: "max-w-sm",
6
+ md: "max-w-md",
7
+ lg: "max-w-lg",
8
+ xl: "max-w-xl",
9
+ prose: "max-w-prose"
10
+ };
11
+ var Center_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
12
+ __name: "Center",
13
+ props: {
14
+ maxWidth: { default: "lg" },
15
+ gutter: {
16
+ type: Boolean,
17
+ default: true
18
+ }
19
+ },
20
+ setup(__props) {
21
+ return (_ctx, _cache) => {
22
+ return openBlock(), createElementBlock("div", { class: normalizeClass(unref(cn)(maxWidthClass[__props.maxWidth], "mx-auto", __props.gutter ? "px-4 sm:px-6 3xl:px-8" : void 0)) }, [renderSlot(_ctx.$slots, "default")], 2);
23
+ };
24
+ }
25
+ });
26
+ //#endregion
27
+ export { Center_vue_vue_type_script_setup_true_lang_default as default, maxWidthClass };
28
+
29
+ //# sourceMappingURL=Center.vue_vue_type_script_setup_true_lang.js.map