@orvui/vue 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3212) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE +32 -0
  3. package/README.md +50 -2
  4. package/dist/ActionSwapIcon-BWUn5TzV.js +31 -0
  5. package/dist/ActionSwapIcon-BWUn5TzV.js.map +1 -0
  6. package/dist/ActionSwapText-GBQfNPxd.js +78 -0
  7. package/dist/ActionSwapText-GBQfNPxd.js.map +1 -0
  8. package/dist/AgentCode-DaATZ4-i.js +115 -0
  9. package/dist/AgentCode-DaATZ4-i.js.map +1 -0
  10. package/dist/AgentDisclosure-BaLK1NwF.js +55 -0
  11. package/dist/AgentDisclosure-BaLK1NwF.js.map +1 -0
  12. package/dist/ChartTooltip-BY8iAlEo.js +154 -0
  13. package/dist/ChartTooltip-BY8iAlEo.js.map +1 -0
  14. package/dist/Checkbox-yoCQLa6d.js +138 -0
  15. package/dist/Checkbox-yoCQLa6d.js.map +1 -0
  16. package/dist/Magnetic-DM3g9bY1.js +43 -0
  17. package/dist/Magnetic-DM3g9bY1.js.map +1 -0
  18. package/dist/RenderContent-CwtJ7hLl.js +14 -0
  19. package/dist/RenderContent-CwtJ7hLl.js.map +1 -0
  20. package/dist/SearchOption-y97v-iri.js +403 -0
  21. package/dist/SearchOption-y97v-iri.js.map +1 -0
  22. package/dist/_plugin-vue_export-helper-Djzt4Yr7.js +7 -0
  23. package/dist/action-swap-CIPNHnoQ.js +321 -0
  24. package/dist/action-swap-CIPNHnoQ.js.map +1 -0
  25. package/dist/adaptive-stepper-DIq2i37A.js +397 -0
  26. package/dist/adaptive-stepper-DIq2i37A.js.map +1 -0
  27. package/dist/agent-activity-D9xZPtc3.js +426 -0
  28. package/dist/agent-activity-D9xZPtc3.js.map +1 -0
  29. package/dist/agents/AgentDisclosure.vue.d.ts +23 -0
  30. package/dist/agents/AgentDisclosure.vue.d.ts.map +1 -0
  31. package/dist/agents/agent-activity/index.d.ts +3 -0
  32. package/dist/agents/agent-activity/index.d.ts.map +1 -0
  33. package/dist/agents/agent-activity/src/ActivityRow.vue.d.ts +8 -0
  34. package/dist/agents/agent-activity/src/ActivityRow.vue.d.ts.map +1 -0
  35. package/dist/agents/agent-activity/src/AgentActivity.vue.d.ts +65 -0
  36. package/dist/agents/agent-activity/src/AgentActivity.vue.d.ts.map +1 -0
  37. package/dist/agents/agent-activity/src/summary.d.ts +5 -0
  38. package/dist/agents/agent-activity/src/summary.d.ts.map +1 -0
  39. package/dist/agents/agent-activity/src/types.d.ts +51 -0
  40. package/dist/agents/agent-activity/src/types.d.ts.map +1 -0
  41. package/dist/agents/agent-activity.d.ts +1 -0
  42. package/dist/agents/agent-activity.js +1 -0
  43. package/dist/agents/ai-sidebar/index.d.ts +4 -0
  44. package/dist/agents/ai-sidebar/index.d.ts.map +1 -0
  45. package/dist/agents/ai-sidebar/src/AISidebar.vue.d.ts +55 -0
  46. package/dist/agents/ai-sidebar/src/AISidebar.vue.d.ts.map +1 -0
  47. package/dist/agents/ai-sidebar/src/MarqueeLabel.vue.d.ts +8 -0
  48. package/dist/agents/ai-sidebar/src/MarqueeLabel.vue.d.ts.map +1 -0
  49. package/dist/agents/ai-sidebar/src/ResourceRow.vue.d.ts +67 -0
  50. package/dist/agents/ai-sidebar/src/ResourceRow.vue.d.ts.map +1 -0
  51. package/dist/agents/ai-sidebar/src/api-types.d.ts +2 -0
  52. package/dist/agents/ai-sidebar/src/api-types.d.ts.map +1 -0
  53. package/dist/agents/ai-sidebar/src/tree.d.ts +45 -0
  54. package/dist/agents/ai-sidebar/src/tree.d.ts.map +1 -0
  55. package/dist/agents/ai-sidebar/src/useTouchCapable.d.ts +2 -0
  56. package/dist/agents/ai-sidebar/src/useTouchCapable.d.ts.map +1 -0
  57. package/dist/agents/ai-sidebar.d.ts +1 -0
  58. package/dist/agents/ai-sidebar.js +1 -0
  59. package/dist/agents/approval-card/index.d.ts +3 -0
  60. package/dist/agents/approval-card/index.d.ts.map +1 -0
  61. package/dist/agents/approval-card/src/ApprovalCard.vue.d.ts +86 -0
  62. package/dist/agents/approval-card/src/ApprovalCard.vue.d.ts.map +1 -0
  63. package/dist/agents/approval-card/src/QuestionOptions.vue.d.ts +16 -0
  64. package/dist/agents/approval-card/src/QuestionOptions.vue.d.ts.map +1 -0
  65. package/dist/agents/approval-card/src/types.d.ts +27 -0
  66. package/dist/agents/approval-card/src/types.d.ts.map +1 -0
  67. package/dist/agents/approval-card.d.ts +1 -0
  68. package/dist/agents/approval-card.js +1 -0
  69. package/dist/agents/chat-app/index.d.ts +18 -0
  70. package/dist/agents/chat-app/index.d.ts.map +1 -0
  71. package/dist/agents/chat-app/src/ChatApp.vue.d.ts +47 -0
  72. package/dist/agents/chat-app/src/ChatApp.vue.d.ts.map +1 -0
  73. package/dist/agents/chat-app/src/ShellFit.vue.d.ts +9 -0
  74. package/dist/agents/chat-app/src/ShellFit.vue.d.ts.map +1 -0
  75. package/dist/agents/chat-app/src/api-types.d.ts +2 -0
  76. package/dist/agents/chat-app/src/api-types.d.ts.map +1 -0
  77. package/dist/agents/chat-app.d.ts +1 -0
  78. package/dist/agents/chat-app.js +18 -0
  79. package/dist/agents/citations/index.d.ts +8 -0
  80. package/dist/agents/citations/index.d.ts.map +1 -0
  81. package/dist/agents/citations/src/Citation.vue.d.ts +10 -0
  82. package/dist/agents/citations/src/Citation.vue.d.ts.map +1 -0
  83. package/dist/agents/citations/src/CitationFavicon.vue.d.ts +9 -0
  84. package/dist/agents/citations/src/CitationFavicon.vue.d.ts.map +1 -0
  85. package/dist/agents/citations/src/CitationList.vue.d.ts +9 -0
  86. package/dist/agents/citations/src/CitationList.vue.d.ts.map +1 -0
  87. package/dist/agents/citations/src/CitationStack.vue.d.ts +11 -0
  88. package/dist/agents/citations/src/CitationStack.vue.d.ts.map +1 -0
  89. package/dist/agents/citations/src/Citations.vue.d.ts +30 -0
  90. package/dist/agents/citations/src/Citations.vue.d.ts.map +1 -0
  91. package/dist/agents/citations/src/api-types.d.ts +5 -0
  92. package/dist/agents/citations/src/api-types.d.ts.map +1 -0
  93. package/dist/agents/citations/src/types.d.ts +9 -0
  94. package/dist/agents/citations/src/types.d.ts.map +1 -0
  95. package/dist/agents/citations.d.ts +1 -0
  96. package/dist/agents/citations.js +1 -0
  97. package/dist/agents/code-block/index.d.ts +8 -0
  98. package/dist/agents/code-block/index.d.ts.map +1 -0
  99. package/dist/agents/code-block/src/AgentCode.vue.d.ts +17 -0
  100. package/dist/agents/code-block/src/AgentCode.vue.d.ts.map +1 -0
  101. package/dist/agents/code-block/src/AgentCodeLine.vue.d.ts +9 -0
  102. package/dist/agents/code-block/src/AgentCodeLine.vue.d.ts.map +1 -0
  103. package/dist/agents/code-block/src/CodeBlock.vue.d.ts +26 -0
  104. package/dist/agents/code-block/src/CodeBlock.vue.d.ts.map +1 -0
  105. package/dist/agents/code-block/src/api-types.d.ts +2 -0
  106. package/dist/agents/code-block/src/api-types.d.ts.map +1 -0
  107. package/dist/agents/code-block/src/tokens.d.ts +11 -0
  108. package/dist/agents/code-block/src/tokens.d.ts.map +1 -0
  109. package/dist/agents/code-block.d.ts +1 -0
  110. package/dist/agents/code-block.js +3 -0
  111. package/dist/agents/file-diff/index.d.ts +4 -0
  112. package/dist/agents/file-diff/index.d.ts.map +1 -0
  113. package/dist/agents/file-diff/src/FileDiff.vue.d.ts +32 -0
  114. package/dist/agents/file-diff/src/FileDiff.vue.d.ts.map +1 -0
  115. package/dist/agents/file-diff/src/api-types.d.ts +2 -0
  116. package/dist/agents/file-diff/src/api-types.d.ts.map +1 -0
  117. package/dist/agents/file-diff/src/types.d.ts +10 -0
  118. package/dist/agents/file-diff/src/types.d.ts.map +1 -0
  119. package/dist/agents/file-diff.d.ts +1 -0
  120. package/dist/agents/file-diff.js +1 -0
  121. package/dist/agents/image-generation/index.d.ts +4 -0
  122. package/dist/agents/image-generation/index.d.ts.map +1 -0
  123. package/dist/agents/image-generation/src/DitherField.vue.d.ts +10 -0
  124. package/dist/agents/image-generation/src/DitherField.vue.d.ts.map +1 -0
  125. package/dist/agents/image-generation/src/ImageGeneration.vue.d.ts +39 -0
  126. package/dist/agents/image-generation/src/ImageGeneration.vue.d.ts.map +1 -0
  127. package/dist/agents/image-generation/src/api-types.d.ts +2 -0
  128. package/dist/agents/image-generation/src/api-types.d.ts.map +1 -0
  129. package/dist/agents/image-generation/src/dither.d.ts +3 -0
  130. package/dist/agents/image-generation/src/dither.d.ts.map +1 -0
  131. package/dist/agents/image-generation.d.ts +1 -0
  132. package/dist/agents/image-generation.js +1 -0
  133. package/dist/agents/index.d.ts +19 -0
  134. package/dist/agents/index.d.ts.map +1 -0
  135. package/dist/agents/loading-states/index.d.ts +7 -0
  136. package/dist/agents/loading-states/index.d.ts.map +1 -0
  137. package/dist/agents/loading-states/src/AgentProgress.vue.d.ts +14 -0
  138. package/dist/agents/loading-states/src/AgentProgress.vue.d.ts.map +1 -0
  139. package/dist/agents/loading-states/src/CascadePhrase.vue.d.ts +8 -0
  140. package/dist/agents/loading-states/src/CascadePhrase.vue.d.ts.map +1 -0
  141. package/dist/agents/loading-states/src/LoadingStates.vue.d.ts +4 -0
  142. package/dist/agents/loading-states/src/LoadingStates.vue.d.ts.map +1 -0
  143. package/dist/agents/loading-states/src/ReasoningText.vue.d.ts +36 -0
  144. package/dist/agents/loading-states/src/ReasoningText.vue.d.ts.map +1 -0
  145. package/dist/agents/loading-states/src/ThinkingShimmer.vue.d.ts +19 -0
  146. package/dist/agents/loading-states/src/ThinkingShimmer.vue.d.ts.map +1 -0
  147. package/dist/agents/loading-states/src/api-types.d.ts +4 -0
  148. package/dist/agents/loading-states/src/api-types.d.ts.map +1 -0
  149. package/dist/agents/loading-states.d.ts +1 -0
  150. package/dist/agents/loading-states.js +1 -0
  151. package/dist/agents/message/index.d.ts +13 -0
  152. package/dist/agents/message/index.d.ts.map +1 -0
  153. package/dist/agents/message/src/Message.vue.d.ts +21 -0
  154. package/dist/agents/message/src/Message.vue.d.ts.map +1 -0
  155. package/dist/agents/message/src/MessageAvatar.vue.d.ts +18 -0
  156. package/dist/agents/message/src/MessageAvatar.vue.d.ts.map +1 -0
  157. package/dist/agents/message/src/MessageContent.vue.d.ts +14 -0
  158. package/dist/agents/message/src/MessageContent.vue.d.ts.map +1 -0
  159. package/dist/agents/message/src/MessageFooter.vue.d.ts +14 -0
  160. package/dist/agents/message/src/MessageFooter.vue.d.ts.map +1 -0
  161. package/dist/agents/message/src/MessageGroup.vue.d.ts +18 -0
  162. package/dist/agents/message/src/MessageGroup.vue.d.ts.map +1 -0
  163. package/dist/agents/message/src/MessageHeader.vue.d.ts +14 -0
  164. package/dist/agents/message/src/MessageHeader.vue.d.ts.map +1 -0
  165. package/dist/agents/message/src/MessageMarker.vue.d.ts +14 -0
  166. package/dist/agents/message/src/MessageMarker.vue.d.ts.map +1 -0
  167. package/dist/agents/message/src/MessageTyping.vue.d.ts +9 -0
  168. package/dist/agents/message/src/MessageTyping.vue.d.ts.map +1 -0
  169. package/dist/agents/message/src/alignment.d.ts +2 -0
  170. package/dist/agents/message/src/alignment.d.ts.map +1 -0
  171. package/dist/agents/message/src/api-types.d.ts +9 -0
  172. package/dist/agents/message/src/api-types.d.ts.map +1 -0
  173. package/dist/agents/message/src/context.d.ts +4 -0
  174. package/dist/agents/message/src/context.d.ts.map +1 -0
  175. package/dist/agents/message-bubble/index.d.ts +7 -0
  176. package/dist/agents/message-bubble/index.d.ts.map +1 -0
  177. package/dist/agents/message-bubble/src/MessageBubble.vue.d.ts +23 -0
  178. package/dist/agents/message-bubble/src/MessageBubble.vue.d.ts.map +1 -0
  179. package/dist/agents/message-bubble/src/MessageBubbleCollapsible.vue.d.ts +50 -0
  180. package/dist/agents/message-bubble/src/MessageBubbleCollapsible.vue.d.ts.map +1 -0
  181. package/dist/agents/message-bubble/src/MessageBubbleContent.vue.d.ts +20 -0
  182. package/dist/agents/message-bubble/src/MessageBubbleContent.vue.d.ts.map +1 -0
  183. package/dist/agents/message-bubble/src/MessageBubbleGroup.vue.d.ts +18 -0
  184. package/dist/agents/message-bubble/src/MessageBubbleGroup.vue.d.ts.map +1 -0
  185. package/dist/agents/message-bubble/src/api-types.d.ts +5 -0
  186. package/dist/agents/message-bubble/src/api-types.d.ts.map +1 -0
  187. package/dist/agents/message-bubble/src/context.d.ts +12 -0
  188. package/dist/agents/message-bubble/src/context.d.ts.map +1 -0
  189. package/dist/agents/message-bubble.d.ts +1 -0
  190. package/dist/agents/message-bubble.js +1 -0
  191. package/dist/agents/message-scroller/index.d.ts +3 -0
  192. package/dist/agents/message-scroller/index.d.ts.map +1 -0
  193. package/dist/agents/message-scroller/src/MessageScroller.vue.d.ts +34 -0
  194. package/dist/agents/message-scroller/src/MessageScroller.vue.d.ts.map +1 -0
  195. package/dist/agents/message-scroller/src/api-types.d.ts +2 -0
  196. package/dist/agents/message-scroller/src/api-types.d.ts.map +1 -0
  197. package/dist/agents/message-scroller.d.ts +1 -0
  198. package/dist/agents/message-scroller.js +1 -0
  199. package/dist/agents/message.d.ts +1 -0
  200. package/dist/agents/message.js +4 -0
  201. package/dist/agents/prompt-input/index.d.ts +4 -0
  202. package/dist/agents/prompt-input/index.d.ts.map +1 -0
  203. package/dist/agents/prompt-input/src/PromptInput.vue.d.ts +65 -0
  204. package/dist/agents/prompt-input/src/PromptInput.vue.d.ts.map +1 -0
  205. package/dist/agents/prompt-input/src/api-types.d.ts +2 -0
  206. package/dist/agents/prompt-input/src/api-types.d.ts.map +1 -0
  207. package/dist/agents/prompt-input.d.ts +1 -0
  208. package/dist/agents/prompt-input.js +1 -0
  209. package/dist/agents/shared.d.ts +6 -0
  210. package/dist/agents/shared.d.ts.map +1 -0
  211. package/dist/agents/stream-follow.d.ts +4 -0
  212. package/dist/agents/stream-follow.d.ts.map +1 -0
  213. package/dist/agents/streaming-response/index.d.ts +4 -0
  214. package/dist/agents/streaming-response/index.d.ts.map +1 -0
  215. package/dist/agents/streaming-response/src/ResponseAction.vue.d.ts +20 -0
  216. package/dist/agents/streaming-response/src/ResponseAction.vue.d.ts.map +1 -0
  217. package/dist/agents/streaming-response/src/StreamingResponse.vue.d.ts +52 -0
  218. package/dist/agents/streaming-response/src/StreamingResponse.vue.d.ts.map +1 -0
  219. package/dist/agents/streaming-response/src/api-types.d.ts +2 -0
  220. package/dist/agents/streaming-response/src/api-types.d.ts.map +1 -0
  221. package/dist/agents/streaming-response.d.ts +1 -0
  222. package/dist/agents/streaming-response.js +1 -0
  223. package/dist/agents/todo-list/index.d.ts +4 -0
  224. package/dist/agents/todo-list/index.d.ts.map +1 -0
  225. package/dist/agents/todo-list/src/TodoHeaderIcon.vue.d.ts +7 -0
  226. package/dist/agents/todo-list/src/TodoHeaderIcon.vue.d.ts.map +1 -0
  227. package/dist/agents/todo-list/src/TodoList.vue.d.ts +40 -0
  228. package/dist/agents/todo-list/src/TodoList.vue.d.ts.map +1 -0
  229. package/dist/agents/todo-list/src/TodoStatusIcon.vue.d.ts +9 -0
  230. package/dist/agents/todo-list/src/TodoStatusIcon.vue.d.ts.map +1 -0
  231. package/dist/agents/todo-list/src/api-types.d.ts +2 -0
  232. package/dist/agents/todo-list/src/api-types.d.ts.map +1 -0
  233. package/dist/agents/todo-list.d.ts +1 -0
  234. package/dist/agents/todo-list.js +1 -0
  235. package/dist/agents/tool-approval/index.d.ts +5 -0
  236. package/dist/agents/tool-approval/index.d.ts.map +1 -0
  237. package/dist/agents/tool-approval/src/ToolApproval.vue.d.ts +55 -0
  238. package/dist/agents/tool-approval/src/ToolApproval.vue.d.ts.map +1 -0
  239. package/dist/agents/tool-approval/src/ToolApprovalCode.vue.d.ts +11 -0
  240. package/dist/agents/tool-approval/src/ToolApprovalCode.vue.d.ts.map +1 -0
  241. package/dist/agents/tool-approval/src/api-types.d.ts +3 -0
  242. package/dist/agents/tool-approval/src/api-types.d.ts.map +1 -0
  243. package/dist/agents/tool-approval.d.ts +1 -0
  244. package/dist/agents/tool-approval.js +1 -0
  245. package/dist/agents/tool-result/index.d.ts +5 -0
  246. package/dist/agents/tool-result/index.d.ts.map +1 -0
  247. package/dist/agents/tool-result/src/ToolResult.vue.d.ts +47 -0
  248. package/dist/agents/tool-result/src/ToolResult.vue.d.ts.map +1 -0
  249. package/dist/agents/tool-result/src/ToolResultOutput.vue.d.ts +11 -0
  250. package/dist/agents/tool-result/src/ToolResultOutput.vue.d.ts.map +1 -0
  251. package/dist/agents/tool-result/src/api-types.d.ts +3 -0
  252. package/dist/agents/tool-result/src/api-types.d.ts.map +1 -0
  253. package/dist/agents/tool-result.d.ts +1 -0
  254. package/dist/agents/tool-result.js +1 -0
  255. package/dist/agents/voice-orb/index.d.ts +3 -0
  256. package/dist/agents/voice-orb/index.d.ts.map +1 -0
  257. package/dist/agents/voice-orb/src/VoiceOrb.vue.d.ts +33 -0
  258. package/dist/agents/voice-orb/src/VoiceOrb.vue.d.ts.map +1 -0
  259. package/dist/agents/voice-orb/src/api-types.d.ts +2 -0
  260. package/dist/agents/voice-orb/src/api-types.d.ts.map +1 -0
  261. package/dist/agents/voice-orb/src/renderer.d.ts +12 -0
  262. package/dist/agents/voice-orb/src/renderer.d.ts.map +1 -0
  263. package/dist/agents/voice-orb.d.ts +1 -0
  264. package/dist/agents/voice-orb.js +1 -0
  265. package/dist/agents.d.ts +1 -0
  266. package/dist/agents.js +20 -0
  267. package/dist/ai-sidebar-BNFCPSUH.js +599 -0
  268. package/dist/ai-sidebar-BNFCPSUH.js.map +1 -0
  269. package/dist/alert-xHnxczdv.js +281 -0
  270. package/dist/alert-xHnxczdv.js.map +1 -0
  271. package/dist/animated-badge-CB8NfT1E.js +196 -0
  272. package/dist/animated-badge-CB8NfT1E.js.map +1 -0
  273. package/dist/animated-sidebar-DgCcjTf5.js +660 -0
  274. package/dist/animated-sidebar-DgCcjTf5.js.map +1 -0
  275. package/dist/animated-toast-stack-CuBYmZTK.js +334 -0
  276. package/dist/animated-toast-stack-CuBYmZTK.js.map +1 -0
  277. package/dist/approval-card-BUm2vZie.js +417 -0
  278. package/dist/approval-card-BUm2vZie.js.map +1 -0
  279. package/dist/arc-picker-tku5aL9W.js +348 -0
  280. package/dist/arc-picker-tku5aL9W.js.map +1 -0
  281. package/dist/aspect-ratio-DZ6sjFRG.js +83 -0
  282. package/dist/aspect-ratio-DZ6sjFRG.js.map +1 -0
  283. package/dist/availability-scheduler-C2JQ2FwY.js +524 -0
  284. package/dist/availability-scheduler-C2JQ2FwY.js.map +1 -0
  285. package/dist/blocks/availability-scheduler/index.d.ts +4 -0
  286. package/dist/blocks/availability-scheduler/index.d.ts.map +1 -0
  287. package/dist/blocks/availability-scheduler/src/AvailabilityScheduler.vue.d.ts +19 -0
  288. package/dist/blocks/availability-scheduler/src/AvailabilityScheduler.vue.d.ts.map +1 -0
  289. package/dist/blocks/availability-scheduler/src/CopyMenu.vue.d.ts +14 -0
  290. package/dist/blocks/availability-scheduler/src/CopyMenu.vue.d.ts.map +1 -0
  291. package/dist/blocks/availability-scheduler/src/TimeSelect.vue.d.ts +18 -0
  292. package/dist/blocks/availability-scheduler/src/TimeSelect.vue.d.ts.map +1 -0
  293. package/dist/blocks/availability-scheduler/src/api-types.d.ts +2 -0
  294. package/dist/blocks/availability-scheduler/src/api-types.d.ts.map +1 -0
  295. package/dist/blocks/availability-scheduler/src/types.d.ts +32 -0
  296. package/dist/blocks/availability-scheduler/src/types.d.ts.map +1 -0
  297. package/dist/blocks/availability-scheduler/src/use-schedule.d.ts +19 -0
  298. package/dist/blocks/availability-scheduler/src/use-schedule.d.ts.map +1 -0
  299. package/dist/blocks/availability-scheduler.d.ts +1 -0
  300. package/dist/blocks/availability-scheduler.js +1 -0
  301. package/dist/blocks/bloom-menu/index.d.ts +4 -0
  302. package/dist/blocks/bloom-menu/index.d.ts.map +1 -0
  303. package/dist/blocks/bloom-menu/src/BloomMenu.vue.d.ts +19 -0
  304. package/dist/blocks/bloom-menu/src/BloomMenu.vue.d.ts.map +1 -0
  305. package/dist/blocks/bloom-menu/src/api-types.d.ts +2 -0
  306. package/dist/blocks/bloom-menu/src/api-types.d.ts.map +1 -0
  307. package/dist/blocks/bloom-menu/src/use-bloom.d.ts +28 -0
  308. package/dist/blocks/bloom-menu/src/use-bloom.d.ts.map +1 -0
  309. package/dist/blocks/bloom-menu.d.ts +1 -0
  310. package/dist/blocks/bloom-menu.js +1 -0
  311. package/dist/blocks/card-folder/index.d.ts +3 -0
  312. package/dist/blocks/card-folder/index.d.ts.map +1 -0
  313. package/dist/blocks/card-folder/src/CardFolder.vue.d.ts +49 -0
  314. package/dist/blocks/card-folder/src/CardFolder.vue.d.ts.map +1 -0
  315. package/dist/blocks/card-folder/src/api-types.d.ts +2 -0
  316. package/dist/blocks/card-folder/src/api-types.d.ts.map +1 -0
  317. package/dist/blocks/card-folder/src/purse-shape.d.ts +2 -0
  318. package/dist/blocks/card-folder/src/purse-shape.d.ts.map +1 -0
  319. package/dist/blocks/card-folder/src/use-card-folder.d.ts +28 -0
  320. package/dist/blocks/card-folder/src/use-card-folder.d.ts.map +1 -0
  321. package/dist/blocks/card-folder.d.ts +1 -0
  322. package/dist/blocks/card-folder.js +1 -0
  323. package/dist/blocks/command-palette/index.d.ts +4 -0
  324. package/dist/blocks/command-palette/index.d.ts.map +1 -0
  325. package/dist/blocks/command-palette/src/CommandPalette.vue.d.ts +50 -0
  326. package/dist/blocks/command-palette/src/CommandPalette.vue.d.ts.map +1 -0
  327. package/dist/blocks/command-palette/src/api-types.d.ts +2 -0
  328. package/dist/blocks/command-palette/src/api-types.d.ts.map +1 -0
  329. package/dist/blocks/command-palette/src/search.d.ts +7 -0
  330. package/dist/blocks/command-palette/src/search.d.ts.map +1 -0
  331. package/dist/blocks/command-palette/src/use-commands.d.ts +19 -0
  332. package/dist/blocks/command-palette/src/use-commands.d.ts.map +1 -0
  333. package/dist/blocks/command-palette.d.ts +1 -0
  334. package/dist/blocks/command-palette.js +1 -0
  335. package/dist/blocks/dismiss.d.ts +7 -0
  336. package/dist/blocks/dismiss.d.ts.map +1 -0
  337. package/dist/blocks/dynamic-island/index.d.ts +5 -0
  338. package/dist/blocks/dynamic-island/index.d.ts.map +1 -0
  339. package/dist/blocks/dynamic-island/src/DynamicIsland.vue.d.ts +21 -0
  340. package/dist/blocks/dynamic-island/src/DynamicIsland.vue.d.ts.map +1 -0
  341. package/dist/blocks/dynamic-island/src/DynamicIslandView.vue.d.ts +17 -0
  342. package/dist/blocks/dynamic-island/src/DynamicIslandView.vue.d.ts.map +1 -0
  343. package/dist/blocks/dynamic-island/src/IslandSlot.vue.d.ts +14 -0
  344. package/dist/blocks/dynamic-island/src/IslandSlot.vue.d.ts.map +1 -0
  345. package/dist/blocks/dynamic-island/src/api-types.d.ts +3 -0
  346. package/dist/blocks/dynamic-island/src/api-types.d.ts.map +1 -0
  347. package/dist/blocks/dynamic-island/src/context.d.ts +3 -0
  348. package/dist/blocks/dynamic-island/src/context.d.ts.map +1 -0
  349. package/dist/blocks/dynamic-island/src/use-island-size.d.ts +9 -0
  350. package/dist/blocks/dynamic-island/src/use-island-size.d.ts.map +1 -0
  351. package/dist/blocks/dynamic-island.d.ts +1 -0
  352. package/dist/blocks/dynamic-island.js +1 -0
  353. package/dist/blocks/expandable-action-bar/index.d.ts +14 -0
  354. package/dist/blocks/expandable-action-bar/index.d.ts.map +1 -0
  355. package/dist/blocks/expandable-action-bar/src/ExpandableActionBar.vue.d.ts +56 -0
  356. package/dist/blocks/expandable-action-bar/src/ExpandableActionBar.vue.d.ts.map +1 -0
  357. package/dist/blocks/expandable-action-bar/src/api-types.d.ts +2 -0
  358. package/dist/blocks/expandable-action-bar/src/api-types.d.ts.map +1 -0
  359. package/dist/blocks/expandable-action-bar/src/source-types.d.ts +12 -0
  360. package/dist/blocks/expandable-action-bar/src/source-types.d.ts.map +1 -0
  361. package/dist/blocks/expandable-action-bar/src/use-action-bar.d.ts +23 -0
  362. package/dist/blocks/expandable-action-bar/src/use-action-bar.d.ts.map +1 -0
  363. package/dist/blocks/expandable-action-bar.d.ts +1 -0
  364. package/dist/blocks/expandable-action-bar.js +1 -0
  365. package/dist/blocks/expandable-tabs/index.d.ts +5 -0
  366. package/dist/blocks/expandable-tabs/index.d.ts.map +1 -0
  367. package/dist/blocks/expandable-tabs/src/ExpandableTabs.vue.d.ts +42 -0
  368. package/dist/blocks/expandable-tabs/src/ExpandableTabs.vue.d.ts.map +1 -0
  369. package/dist/blocks/expandable-tabs/src/api-types.d.ts +2 -0
  370. package/dist/blocks/expandable-tabs/src/api-types.d.ts.map +1 -0
  371. package/dist/blocks/expandable-tabs/src/source-types.d.ts +11 -0
  372. package/dist/blocks/expandable-tabs/src/source-types.d.ts.map +1 -0
  373. package/dist/blocks/expandable-tabs/src/use-tab-measurements.d.ts +18 -0
  374. package/dist/blocks/expandable-tabs/src/use-tab-measurements.d.ts.map +1 -0
  375. package/dist/blocks/expandable-tabs.d.ts +1 -0
  376. package/dist/blocks/expandable-tabs.js +1 -0
  377. package/dist/blocks/feedback-widget/index.d.ts +4 -0
  378. package/dist/blocks/feedback-widget/index.d.ts.map +1 -0
  379. package/dist/blocks/feedback-widget/src/FeedbackWidget.vue.d.ts +33 -0
  380. package/dist/blocks/feedback-widget/src/FeedbackWidget.vue.d.ts.map +1 -0
  381. package/dist/blocks/feedback-widget/src/api-types.d.ts +2 -0
  382. package/dist/blocks/feedback-widget/src/api-types.d.ts.map +1 -0
  383. package/dist/blocks/feedback-widget/src/use-feedback.d.ts +23 -0
  384. package/dist/blocks/feedback-widget/src/use-feedback.d.ts.map +1 -0
  385. package/dist/blocks/feedback-widget.d.ts +1 -0
  386. package/dist/blocks/feedback-widget.js +1 -0
  387. package/dist/blocks/file-upload/index.d.ts +7 -0
  388. package/dist/blocks/file-upload/index.d.ts.map +1 -0
  389. package/dist/blocks/file-upload/src/AttachmentAction.vue.d.ts +14 -0
  390. package/dist/blocks/file-upload/src/AttachmentAction.vue.d.ts.map +1 -0
  391. package/dist/blocks/file-upload/src/AttachmentPreview.vue.d.ts +14 -0
  392. package/dist/blocks/file-upload/src/AttachmentPreview.vue.d.ts.map +1 -0
  393. package/dist/blocks/file-upload/src/AttachmentRow.vue.d.ts +28 -0
  394. package/dist/blocks/file-upload/src/AttachmentRow.vue.d.ts.map +1 -0
  395. package/dist/blocks/file-upload/src/AttachmentUpload.vue.d.ts +47 -0
  396. package/dist/blocks/file-upload/src/AttachmentUpload.vue.d.ts.map +1 -0
  397. package/dist/blocks/file-upload/src/FileUpload.vue.d.ts +43 -0
  398. package/dist/blocks/file-upload/src/FileUpload.vue.d.ts.map +1 -0
  399. package/dist/blocks/file-upload/src/FileUploadRow.vue.d.ts +16 -0
  400. package/dist/blocks/file-upload/src/FileUploadRow.vue.d.ts.map +1 -0
  401. package/dist/blocks/file-upload/src/api-types.d.ts +3 -0
  402. package/dist/blocks/file-upload/src/api-types.d.ts.map +1 -0
  403. package/dist/blocks/file-upload/src/attachment-geometry.d.ts +3 -0
  404. package/dist/blocks/file-upload/src/attachment-geometry.d.ts.map +1 -0
  405. package/dist/blocks/file-upload/src/attachment-types.d.ts +17 -0
  406. package/dist/blocks/file-upload/src/attachment-types.d.ts.map +1 -0
  407. package/dist/blocks/file-upload/src/file-utils.d.ts +18 -0
  408. package/dist/blocks/file-upload/src/file-utils.d.ts.map +1 -0
  409. package/dist/blocks/file-upload/src/queue-state.d.ts +11 -0
  410. package/dist/blocks/file-upload/src/queue-state.d.ts.map +1 -0
  411. package/dist/blocks/file-upload/src/source-types.d.ts +18 -0
  412. package/dist/blocks/file-upload/src/source-types.d.ts.map +1 -0
  413. package/dist/blocks/file-upload/src/types.d.ts +14 -0
  414. package/dist/blocks/file-upload/src/types.d.ts.map +1 -0
  415. package/dist/blocks/file-upload/src/use-attachment-queue.d.ts +71 -0
  416. package/dist/blocks/file-upload/src/use-attachment-queue.d.ts.map +1 -0
  417. package/dist/blocks/file-upload/src/use-file-queue.d.ts +21 -0
  418. package/dist/blocks/file-upload/src/use-file-queue.d.ts.map +1 -0
  419. package/dist/blocks/file-upload.d.ts +1 -0
  420. package/dist/blocks/file-upload.js +1 -0
  421. package/dist/blocks/index.d.ts +24 -0
  422. package/dist/blocks/index.d.ts.map +1 -0
  423. package/dist/blocks/infinite-masonry/index.d.ts +4 -0
  424. package/dist/blocks/infinite-masonry/index.d.ts.map +1 -0
  425. package/dist/blocks/infinite-masonry/src/InfiniteMasonry.vue.d.ts +54 -0
  426. package/dist/blocks/infinite-masonry/src/InfiniteMasonry.vue.d.ts.map +1 -0
  427. package/dist/blocks/infinite-masonry/src/MasonryItemReveal.vue.d.ts +20 -0
  428. package/dist/blocks/infinite-masonry/src/MasonryItemReveal.vue.d.ts.map +1 -0
  429. package/dist/blocks/infinite-masonry/src/api-types.d.ts +2 -0
  430. package/dist/blocks/infinite-masonry/src/api-types.d.ts.map +1 -0
  431. package/dist/blocks/infinite-masonry/src/use-masonry.d.ts +29 -0
  432. package/dist/blocks/infinite-masonry/src/use-masonry.d.ts.map +1 -0
  433. package/dist/blocks/infinite-masonry.d.ts +1 -0
  434. package/dist/blocks/infinite-masonry.js +1 -0
  435. package/dist/blocks/knockout-bracket/index.d.ts +7 -0
  436. package/dist/blocks/knockout-bracket/index.d.ts.map +1 -0
  437. package/dist/blocks/knockout-bracket/src/KnockoutBracket.vue.d.ts +14 -0
  438. package/dist/blocks/knockout-bracket/src/KnockoutBracket.vue.d.ts.map +1 -0
  439. package/dist/blocks/knockout-bracket/src/KnockoutWheel.vue.d.ts +11 -0
  440. package/dist/blocks/knockout-bracket/src/KnockoutWheel.vue.d.ts.map +1 -0
  441. package/dist/blocks/knockout-bracket/src/MatchCard.vue.d.ts +8 -0
  442. package/dist/blocks/knockout-bracket/src/MatchCard.vue.d.ts.map +1 -0
  443. package/dist/blocks/knockout-bracket/src/TeamCrest.vue.d.ts +8 -0
  444. package/dist/blocks/knockout-bracket/src/TeamCrest.vue.d.ts.map +1 -0
  445. package/dist/blocks/knockout-bracket/src/WheelMark.vue.d.ts +14 -0
  446. package/dist/blocks/knockout-bracket/src/WheelMark.vue.d.ts.map +1 -0
  447. package/dist/blocks/knockout-bracket/src/api-types.d.ts +3 -0
  448. package/dist/blocks/knockout-bracket/src/api-types.d.ts.map +1 -0
  449. package/dist/blocks/knockout-bracket/src/bracket-model.d.ts +15 -0
  450. package/dist/blocks/knockout-bracket/src/bracket-model.d.ts.map +1 -0
  451. package/dist/blocks/knockout-bracket/src/data.d.ts +7 -0
  452. package/dist/blocks/knockout-bracket/src/data.d.ts.map +1 -0
  453. package/dist/blocks/knockout-bracket/src/fixture-builder.d.ts +17 -0
  454. package/dist/blocks/knockout-bracket/src/fixture-builder.d.ts.map +1 -0
  455. package/dist/blocks/knockout-bracket/src/types.d.ts +25 -0
  456. package/dist/blocks/knockout-bracket/src/types.d.ts.map +1 -0
  457. package/dist/blocks/knockout-bracket/src/use-wheel.d.ts +30 -0
  458. package/dist/blocks/knockout-bracket/src/use-wheel.d.ts.map +1 -0
  459. package/dist/blocks/knockout-bracket/src/wheel-data.d.ts +6 -0
  460. package/dist/blocks/knockout-bracket/src/wheel-data.d.ts.map +1 -0
  461. package/dist/blocks/knockout-bracket/src/wheel-model.d.ts +44 -0
  462. package/dist/blocks/knockout-bracket/src/wheel-model.d.ts.map +1 -0
  463. package/dist/blocks/knockout-bracket.d.ts +1 -0
  464. package/dist/blocks/knockout-bracket.js +1 -0
  465. package/dist/blocks/morphing-search/index.d.ts +5 -0
  466. package/dist/blocks/morphing-search/index.d.ts.map +1 -0
  467. package/dist/blocks/morphing-search/src/Highlight.vue.d.ts +8 -0
  468. package/dist/blocks/morphing-search/src/Highlight.vue.d.ts.map +1 -0
  469. package/dist/blocks/morphing-search/src/MorphingSearch.vue.d.ts +38 -0
  470. package/dist/blocks/morphing-search/src/MorphingSearch.vue.d.ts.map +1 -0
  471. package/dist/blocks/morphing-search/src/MorphingSearchChips.vue.d.ts +89 -0
  472. package/dist/blocks/morphing-search/src/MorphingSearchChips.vue.d.ts.map +1 -0
  473. package/dist/blocks/morphing-search/src/api-types.d.ts +3 -0
  474. package/dist/blocks/morphing-search/src/api-types.d.ts.map +1 -0
  475. package/dist/blocks/morphing-search/src/use-search-chips.d.ts +90 -0
  476. package/dist/blocks/morphing-search/src/use-search-chips.d.ts.map +1 -0
  477. package/dist/blocks/morphing-search/src/use-search-overlay.d.ts +76 -0
  478. package/dist/blocks/morphing-search/src/use-search-overlay.d.ts.map +1 -0
  479. package/dist/blocks/morphing-search.d.ts +1 -0
  480. package/dist/blocks/morphing-search.js +1 -0
  481. package/dist/blocks/morphing-tabs/index.d.ts +5 -0
  482. package/dist/blocks/morphing-tabs/index.d.ts.map +1 -0
  483. package/dist/blocks/morphing-tabs/src/LiquidSurface.vue.d.ts +10 -0
  484. package/dist/blocks/morphing-tabs/src/LiquidSurface.vue.d.ts.map +1 -0
  485. package/dist/blocks/morphing-tabs/src/MorphingTabs.vue.d.ts +45 -0
  486. package/dist/blocks/morphing-tabs/src/MorphingTabs.vue.d.ts.map +1 -0
  487. package/dist/blocks/morphing-tabs/src/SpringTab.vue.d.ts +34 -0
  488. package/dist/blocks/morphing-tabs/src/SpringTab.vue.d.ts.map +1 -0
  489. package/dist/blocks/morphing-tabs/src/api-types.d.ts +2 -0
  490. package/dist/blocks/morphing-tabs/src/api-types.d.ts.map +1 -0
  491. package/dist/blocks/morphing-tabs/src/model.d.ts +19 -0
  492. package/dist/blocks/morphing-tabs/src/model.d.ts.map +1 -0
  493. package/dist/blocks/morphing-tabs/src/source-types.d.ts +11 -0
  494. package/dist/blocks/morphing-tabs/src/source-types.d.ts.map +1 -0
  495. package/dist/blocks/morphing-tabs/src/use-morphing-tabs.d.ts +44 -0
  496. package/dist/blocks/morphing-tabs/src/use-morphing-tabs.d.ts.map +1 -0
  497. package/dist/blocks/morphing-tabs.d.ts +1 -0
  498. package/dist/blocks/morphing-tabs.js +1 -0
  499. package/dist/blocks/not-found/index.d.ts +10 -0
  500. package/dist/blocks/not-found/index.d.ts.map +1 -0
  501. package/dist/blocks/not-found/src/NotFound.vue.d.ts +5 -0
  502. package/dist/blocks/not-found/src/NotFound.vue.d.ts.map +1 -0
  503. package/dist/blocks/not-found/src/NotFoundActions.vue.d.ts +11 -0
  504. package/dist/blocks/not-found/src/NotFoundActions.vue.d.ts.map +1 -0
  505. package/dist/blocks/not-found/src/NotFoundCopy.vue.d.ts +8 -0
  506. package/dist/blocks/not-found/src/NotFoundCopy.vue.d.ts.map +1 -0
  507. package/dist/blocks/not-found/src/NotFoundGlitch.vue.d.ts +13 -0
  508. package/dist/blocks/not-found/src/NotFoundGlitch.vue.d.ts.map +1 -0
  509. package/dist/blocks/not-found/src/NotFoundMagnetic.vue.d.ts +13 -0
  510. package/dist/blocks/not-found/src/NotFoundMagnetic.vue.d.ts.map +1 -0
  511. package/dist/blocks/not-found/src/NotFoundScramble.vue.d.ts +7 -0
  512. package/dist/blocks/not-found/src/NotFoundScramble.vue.d.ts.map +1 -0
  513. package/dist/blocks/not-found/src/NotFoundSpotlight.vue.d.ts +13 -0
  514. package/dist/blocks/not-found/src/NotFoundSpotlight.vue.d.ts.map +1 -0
  515. package/dist/blocks/not-found/src/NotFoundStacked.vue.d.ts +13 -0
  516. package/dist/blocks/not-found/src/NotFoundStacked.vue.d.ts.map +1 -0
  517. package/dist/blocks/not-found/src/NotFoundStage.vue.d.ts +13 -0
  518. package/dist/blocks/not-found/src/NotFoundStage.vue.d.ts.map +1 -0
  519. package/dist/blocks/not-found/src/NotFoundTerminal.vue.d.ts +13 -0
  520. package/dist/blocks/not-found/src/NotFoundTerminal.vue.d.ts.map +1 -0
  521. package/dist/blocks/not-found/src/types.d.ts +19 -0
  522. package/dist/blocks/not-found/src/types.d.ts.map +1 -0
  523. package/dist/blocks/not-found/src/use-not-found-scene.d.ts +13 -0
  524. package/dist/blocks/not-found/src/use-not-found-scene.d.ts.map +1 -0
  525. package/dist/blocks/not-found.d.ts +1 -0
  526. package/dist/blocks/not-found.js +1 -0
  527. package/dist/blocks/notification-stack/index.d.ts +5 -0
  528. package/dist/blocks/notification-stack/index.d.ts.map +1 -0
  529. package/dist/blocks/notification-stack/src/NotificationContent.vue.d.ts +21 -0
  530. package/dist/blocks/notification-stack/src/NotificationContent.vue.d.ts.map +1 -0
  531. package/dist/blocks/notification-stack/src/NotificationStack.vue.d.ts +37 -0
  532. package/dist/blocks/notification-stack/src/NotificationStack.vue.d.ts.map +1 -0
  533. package/dist/blocks/notification-stack/src/api-types.d.ts +2 -0
  534. package/dist/blocks/notification-stack/src/api-types.d.ts.map +1 -0
  535. package/dist/blocks/notification-stack/src/source-types.d.ts +11 -0
  536. package/dist/blocks/notification-stack/src/source-types.d.ts.map +1 -0
  537. package/dist/blocks/notification-stack/src/use-stack-interaction.d.ts +12 -0
  538. package/dist/blocks/notification-stack/src/use-stack-interaction.d.ts.map +1 -0
  539. package/dist/blocks/notification-stack.d.ts +1 -0
  540. package/dist/blocks/notification-stack.js +1 -0
  541. package/dist/blocks/otp-input/index.d.ts +4 -0
  542. package/dist/blocks/otp-input/index.d.ts.map +1 -0
  543. package/dist/blocks/otp-input/src/OTPInput.vue.d.ts +37 -0
  544. package/dist/blocks/otp-input/src/OTPInput.vue.d.ts.map +1 -0
  545. package/dist/blocks/otp-input/src/api-types.d.ts +2 -0
  546. package/dist/blocks/otp-input/src/api-types.d.ts.map +1 -0
  547. package/dist/blocks/otp-input/src/use-otp-fields.d.ts +20 -0
  548. package/dist/blocks/otp-input/src/use-otp-fields.d.ts.map +1 -0
  549. package/dist/blocks/otp-input.d.ts +1 -0
  550. package/dist/blocks/otp-input.js +1 -0
  551. package/dist/blocks/overflow-actions/index.d.ts +5 -0
  552. package/dist/blocks/overflow-actions/index.d.ts.map +1 -0
  553. package/dist/blocks/overflow-actions/src/ActionButton.vue.d.ts +19 -0
  554. package/dist/blocks/overflow-actions/src/ActionButton.vue.d.ts.map +1 -0
  555. package/dist/blocks/overflow-actions/src/OverflowActions.vue.d.ts +40 -0
  556. package/dist/blocks/overflow-actions/src/OverflowActions.vue.d.ts.map +1 -0
  557. package/dist/blocks/overflow-actions/src/api-types.d.ts +2 -0
  558. package/dist/blocks/overflow-actions/src/api-types.d.ts.map +1 -0
  559. package/dist/blocks/overflow-actions/src/source-types.d.ts +12 -0
  560. package/dist/blocks/overflow-actions/src/source-types.d.ts.map +1 -0
  561. package/dist/blocks/overflow-actions.d.ts +1 -0
  562. package/dist/blocks/overflow-actions.js +1 -0
  563. package/dist/blocks/prediction-market/index.d.ts +7 -0
  564. package/dist/blocks/prediction-market/index.d.ts.map +1 -0
  565. package/dist/blocks/prediction-market/src/AnimatedAmountInput.vue.d.ts +16 -0
  566. package/dist/blocks/prediction-market/src/AnimatedAmountInput.vue.d.ts.map +1 -0
  567. package/dist/blocks/prediction-market/src/MarketOddsButton.vue.d.ts +9 -0
  568. package/dist/blocks/prediction-market/src/MarketOddsButton.vue.d.ts.map +1 -0
  569. package/dist/blocks/prediction-market/src/PredictionMarket.vue.d.ts +37 -0
  570. package/dist/blocks/prediction-market/src/PredictionMarket.vue.d.ts.map +1 -0
  571. package/dist/blocks/prediction-market/src/PredictionMarketCard.vue.d.ts +41 -0
  572. package/dist/blocks/prediction-market/src/PredictionMarketCard.vue.d.ts.map +1 -0
  573. package/dist/blocks/prediction-market/src/api-types.d.ts +3 -0
  574. package/dist/blocks/prediction-market/src/api-types.d.ts.map +1 -0
  575. package/dist/blocks/prediction-market/src/source-types.d.ts +11 -0
  576. package/dist/blocks/prediction-market/src/source-types.d.ts.map +1 -0
  577. package/dist/blocks/prediction-market/src/types.d.ts +20 -0
  578. package/dist/blocks/prediction-market/src/types.d.ts.map +1 -0
  579. package/dist/blocks/prediction-market/src/use-market-order.d.ts +37 -0
  580. package/dist/blocks/prediction-market/src/use-market-order.d.ts.map +1 -0
  581. package/dist/blocks/prediction-market/src/utils.d.ts +22 -0
  582. package/dist/blocks/prediction-market/src/utils.d.ts.map +1 -0
  583. package/dist/blocks/prediction-market.d.ts +1 -0
  584. package/dist/blocks/prediction-market.js +1 -0
  585. package/dist/blocks/project-folder/index.d.ts +4 -0
  586. package/dist/blocks/project-folder/index.d.ts.map +1 -0
  587. package/dist/blocks/project-folder/src/ProjectFolder.vue.d.ts +58 -0
  588. package/dist/blocks/project-folder/src/ProjectFolder.vue.d.ts.map +1 -0
  589. package/dist/blocks/project-folder/src/api-types.d.ts +2 -0
  590. package/dist/blocks/project-folder/src/api-types.d.ts.map +1 -0
  591. package/dist/blocks/project-folder/src/use-project-folder.d.ts +50 -0
  592. package/dist/blocks/project-folder/src/use-project-folder.d.ts.map +1 -0
  593. package/dist/blocks/project-folder.d.ts +1 -0
  594. package/dist/blocks/project-folder.js +1 -0
  595. package/dist/blocks/search-cursor.d.ts +9 -0
  596. package/dist/blocks/search-cursor.d.ts.map +1 -0
  597. package/dist/blocks/shared.d.ts +13 -0
  598. package/dist/blocks/shared.d.ts.map +1 -0
  599. package/dist/blocks/signup-form/index.d.ts +5 -0
  600. package/dist/blocks/signup-form/index.d.ts.map +1 -0
  601. package/dist/blocks/signup-form/src/SignUpForm.vue.d.ts +62 -0
  602. package/dist/blocks/signup-form/src/SignUpForm.vue.d.ts.map +1 -0
  603. package/dist/blocks/signup-form/src/api-types.d.ts +2 -0
  604. package/dist/blocks/signup-form/src/api-types.d.ts.map +1 -0
  605. package/dist/blocks/signup-form/src/source-types.d.ts +12 -0
  606. package/dist/blocks/signup-form/src/source-types.d.ts.map +1 -0
  607. package/dist/blocks/signup-form/src/types.d.ts +12 -0
  608. package/dist/blocks/signup-form/src/types.d.ts.map +1 -0
  609. package/dist/blocks/signup-form/src/use-signup.d.ts +34 -0
  610. package/dist/blocks/signup-form/src/use-signup.d.ts.map +1 -0
  611. package/dist/blocks/signup-form.d.ts +1 -0
  612. package/dist/blocks/signup-form.js +1 -0
  613. package/dist/blocks/swap/index.d.ts +7 -0
  614. package/dist/blocks/swap/index.d.ts.map +1 -0
  615. package/dist/blocks/swap/src/ChainChip.vue.d.ts +10 -0
  616. package/dist/blocks/swap/src/ChainChip.vue.d.ts.map +1 -0
  617. package/dist/blocks/swap/src/DestinationRow.vue.d.ts +15 -0
  618. package/dist/blocks/swap/src/DestinationRow.vue.d.ts.map +1 -0
  619. package/dist/blocks/swap/src/Field.vue.d.ts +19 -0
  620. package/dist/blocks/swap/src/Field.vue.d.ts.map +1 -0
  621. package/dist/blocks/swap/src/MultiChainSwap.vue.d.ts +23 -0
  622. package/dist/blocks/swap/src/MultiChainSwap.vue.d.ts.map +1 -0
  623. package/dist/blocks/swap/src/TokenDot.vue.d.ts +12 -0
  624. package/dist/blocks/swap/src/TokenDot.vue.d.ts.map +1 -0
  625. package/dist/blocks/swap/src/TokenPicker.vue.d.ts +19 -0
  626. package/dist/blocks/swap/src/TokenPicker.vue.d.ts.map +1 -0
  627. package/dist/blocks/swap/src/api-types.d.ts +2 -0
  628. package/dist/blocks/swap/src/api-types.d.ts.map +1 -0
  629. package/dist/blocks/swap/src/constants.d.ts +2 -0
  630. package/dist/blocks/swap/src/constants.d.ts.map +1 -0
  631. package/dist/blocks/swap/src/data.d.ts +4 -0
  632. package/dist/blocks/swap/src/data.d.ts.map +1 -0
  633. package/dist/blocks/swap/src/types.d.ts +19 -0
  634. package/dist/blocks/swap/src/types.d.ts.map +1 -0
  635. package/dist/blocks/swap/src/use-swap.d.ts +37 -0
  636. package/dist/blocks/swap/src/use-swap.d.ts.map +1 -0
  637. package/dist/blocks/swap/src/utils.d.ts +5 -0
  638. package/dist/blocks/swap/src/utils.d.ts.map +1 -0
  639. package/dist/blocks/swap.d.ts +1 -0
  640. package/dist/blocks/swap.js +3 -0
  641. package/dist/blocks/swipeable-list/index.d.ts +5 -0
  642. package/dist/blocks/swipeable-list/index.d.ts.map +1 -0
  643. package/dist/blocks/swipeable-list/src/SwipeableList.vue.d.ts +73 -0
  644. package/dist/blocks/swipeable-list/src/SwipeableList.vue.d.ts.map +1 -0
  645. package/dist/blocks/swipeable-list/src/SwipeableRow.vue.d.ts +40 -0
  646. package/dist/blocks/swipeable-list/src/SwipeableRow.vue.d.ts.map +1 -0
  647. package/dist/blocks/swipeable-list/src/api-types.d.ts +2 -0
  648. package/dist/blocks/swipeable-list/src/api-types.d.ts.map +1 -0
  649. package/dist/blocks/swipeable-list/src/gesture.d.ts +3 -0
  650. package/dist/blocks/swipeable-list/src/gesture.d.ts.map +1 -0
  651. package/dist/blocks/swipeable-list/src/source-types.d.ts +13 -0
  652. package/dist/blocks/swipeable-list/src/source-types.d.ts.map +1 -0
  653. package/dist/blocks/swipeable-list/src/use-swipe-row.d.ts +32 -0
  654. package/dist/blocks/swipeable-list/src/use-swipe-row.d.ts.map +1 -0
  655. package/dist/blocks/swipeable-list.d.ts +1 -0
  656. package/dist/blocks/swipeable-list.js +1 -0
  657. package/dist/blocks/wallet-card/index.d.ts +4 -0
  658. package/dist/blocks/wallet-card/index.d.ts.map +1 -0
  659. package/dist/blocks/wallet-card/src/AccountAvatar.vue.d.ts +8 -0
  660. package/dist/blocks/wallet-card/src/AccountAvatar.vue.d.ts.map +1 -0
  661. package/dist/blocks/wallet-card/src/AccountSwitcher.vue.d.ts +13 -0
  662. package/dist/blocks/wallet-card/src/AccountSwitcher.vue.d.ts.map +1 -0
  663. package/dist/blocks/wallet-card/src/CopyButton.vue.d.ts +7 -0
  664. package/dist/blocks/wallet-card/src/CopyButton.vue.d.ts.map +1 -0
  665. package/dist/blocks/wallet-card/src/SearchBar.vue.d.ts +17 -0
  666. package/dist/blocks/wallet-card/src/SearchBar.vue.d.ts.map +1 -0
  667. package/dist/blocks/wallet-card/src/WalletCard.vue.d.ts +48 -0
  668. package/dist/blocks/wallet-card/src/WalletCard.vue.d.ts.map +1 -0
  669. package/dist/blocks/wallet-card/src/api-types.d.ts +2 -0
  670. package/dist/blocks/wallet-card/src/api-types.d.ts.map +1 -0
  671. package/dist/blocks/wallet-card/src/constants.d.ts +28 -0
  672. package/dist/blocks/wallet-card/src/constants.d.ts.map +1 -0
  673. package/dist/blocks/wallet-card/src/use-wallet-panel.d.ts +16 -0
  674. package/dist/blocks/wallet-card/src/use-wallet-panel.d.ts.map +1 -0
  675. package/dist/blocks/wallet-card/src/use-wallet.d.ts +33 -0
  676. package/dist/blocks/wallet-card/src/use-wallet.d.ts.map +1 -0
  677. package/dist/blocks/wallet-card/src/utils.d.ts +3 -0
  678. package/dist/blocks/wallet-card/src/utils.d.ts.map +1 -0
  679. package/dist/blocks/wallet-card.d.ts +1 -0
  680. package/dist/blocks/wallet-card.js +1 -0
  681. package/dist/blocks.d.ts +1 -0
  682. package/dist/blocks.js +25 -0
  683. package/dist/bloom-menu-D6Sm51VK.js +251 -0
  684. package/dist/bloom-menu-D6Sm51VK.js.map +1 -0
  685. package/dist/bottom-sheet-B5n2HmzT.js +138 -0
  686. package/dist/bottom-sheet-B5n2HmzT.js.map +1 -0
  687. package/dist/bounce-sidebar-BgZi66Pj.js +134 -0
  688. package/dist/bounce-sidebar-BgZi66Pj.js.map +1 -0
  689. package/dist/bouncy-accordion-BzPQWPqf.js +235 -0
  690. package/dist/bouncy-accordion-BzPQWPqf.js.map +1 -0
  691. package/dist/breadcrumb-qC9jss43.js +261 -0
  692. package/dist/breadcrumb-qC9jss43.js.map +1 -0
  693. package/dist/bump-chart-DJi7epYl.js +544 -0
  694. package/dist/bump-chart-DJi7epYl.js.map +1 -0
  695. package/dist/button-CDD333Yn.js +536 -0
  696. package/dist/button-CDD333Yn.js.map +1 -0
  697. package/dist/candlestick-chart-tyW2V3M4.js +355 -0
  698. package/dist/candlestick-chart-tyW2V3M4.js.map +1 -0
  699. package/dist/card-87yBBx09.js +132 -0
  700. package/dist/card-87yBBx09.js.map +1 -0
  701. package/dist/card-folder-Gs7jcpki.js +478 -0
  702. package/dist/card-folder-Gs7jcpki.js.map +1 -0
  703. package/dist/center-morph-modal-BbMgqBgo.js +221 -0
  704. package/dist/center-morph-modal-BbMgqBgo.js.map +1 -0
  705. package/dist/charts/ChartTooltip.vue.d.ts +36 -0
  706. package/dist/charts/ChartTooltip.vue.d.ts.map +1 -0
  707. package/dist/charts/bump-chart/index.d.ts +9 -0
  708. package/dist/charts/bump-chart/index.d.ts.map +1 -0
  709. package/dist/charts/bump-chart/src/BumpChart.vue.d.ts +21 -0
  710. package/dist/charts/bump-chart/src/BumpChart.vue.d.ts.map +1 -0
  711. package/dist/charts/bump-chart/src/BumpChartLegend.vue.d.ts +7 -0
  712. package/dist/charts/bump-chart/src/BumpChartLegend.vue.d.ts.map +1 -0
  713. package/dist/charts/bump-chart/src/BumpChartPlot.vue.d.ts +7 -0
  714. package/dist/charts/bump-chart/src/BumpChartPlot.vue.d.ts.map +1 -0
  715. package/dist/charts/bump-chart/src/BumpChartPoint.vue.d.ts +11 -0
  716. package/dist/charts/bump-chart/src/BumpChartPoint.vue.d.ts.map +1 -0
  717. package/dist/charts/bump-chart/src/BumpChartSeriesPath.vue.d.ts +11 -0
  718. package/dist/charts/bump-chart/src/BumpChartSeriesPath.vue.d.ts.map +1 -0
  719. package/dist/charts/bump-chart/src/context.d.ts +132 -0
  720. package/dist/charts/bump-chart/src/context.d.ts.map +1 -0
  721. package/dist/charts/bump-chart/src/model.d.ts +28 -0
  722. package/dist/charts/bump-chart/src/model.d.ts.map +1 -0
  723. package/dist/charts/bump-chart/src/use-geometry.d.ts +14 -0
  724. package/dist/charts/bump-chart/src/use-geometry.d.ts.map +1 -0
  725. package/dist/charts/bump-chart.d.ts +1 -0
  726. package/dist/charts/bump-chart.js +1 -0
  727. package/dist/charts/candlestick-chart/index.d.ts +8 -0
  728. package/dist/charts/candlestick-chart/index.d.ts.map +1 -0
  729. package/dist/charts/candlestick-chart/src/CandlestickChart.vue.d.ts +21 -0
  730. package/dist/charts/candlestick-chart/src/CandlestickChart.vue.d.ts.map +1 -0
  731. package/dist/charts/candlestick-chart/src/CandlestickChartLegend.vue.d.ts +17 -0
  732. package/dist/charts/candlestick-chart/src/CandlestickChartLegend.vue.d.ts.map +1 -0
  733. package/dist/charts/candlestick-chart/src/CandlestickChartPlot.vue.d.ts +9 -0
  734. package/dist/charts/candlestick-chart/src/CandlestickChartPlot.vue.d.ts.map +1 -0
  735. package/dist/charts/candlestick-chart/src/context.d.ts +82 -0
  736. package/dist/charts/candlestick-chart/src/context.d.ts.map +1 -0
  737. package/dist/charts/candlestick-chart/src/geometry.d.ts +26 -0
  738. package/dist/charts/candlestick-chart/src/geometry.d.ts.map +1 -0
  739. package/dist/charts/candlestick-chart.d.ts +1 -0
  740. package/dist/charts/candlestick-chart.js +1 -0
  741. package/dist/charts/composition-chart/index.d.ts +11 -0
  742. package/dist/charts/composition-chart/index.d.ts.map +1 -0
  743. package/dist/charts/composition-chart/src/CompositionChart.vue.d.ts +21 -0
  744. package/dist/charts/composition-chart/src/CompositionChart.vue.d.ts.map +1 -0
  745. package/dist/charts/composition-chart/src/CompositionChartLegend.vue.d.ts +4 -0
  746. package/dist/charts/composition-chart/src/CompositionChartLegend.vue.d.ts.map +1 -0
  747. package/dist/charts/composition-chart/src/CompositionChartPlot.vue.d.ts +4 -0
  748. package/dist/charts/composition-chart/src/CompositionChartPlot.vue.d.ts.map +1 -0
  749. package/dist/charts/composition-chart/src/CompositionTooltipContent.vue.d.ts +4 -0
  750. package/dist/charts/composition-chart/src/CompositionTooltipContent.vue.d.ts.map +1 -0
  751. package/dist/charts/composition-chart/src/context.d.ts +146 -0
  752. package/dist/charts/composition-chart/src/context.d.ts.map +1 -0
  753. package/dist/charts/composition-chart/src/model.d.ts +20 -0
  754. package/dist/charts/composition-chart/src/model.d.ts.map +1 -0
  755. package/dist/charts/composition-chart.d.ts +1 -0
  756. package/dist/charts/composition-chart.js +1 -0
  757. package/dist/charts/donut-chart/index.d.ts +11 -0
  758. package/dist/charts/donut-chart/index.d.ts.map +1 -0
  759. package/dist/charts/donut-chart/src/DonutChart.vue.d.ts +23 -0
  760. package/dist/charts/donut-chart/src/DonutChart.vue.d.ts.map +1 -0
  761. package/dist/charts/donut-chart/src/DonutChartCenter.vue.d.ts +22 -0
  762. package/dist/charts/donut-chart/src/DonutChartCenter.vue.d.ts.map +1 -0
  763. package/dist/charts/donut-chart/src/DonutChartLegend.vue.d.ts +20 -0
  764. package/dist/charts/donut-chart/src/DonutChartLegend.vue.d.ts.map +1 -0
  765. package/dist/charts/donut-chart/src/DonutChartPlot.vue.d.ts +14 -0
  766. package/dist/charts/donut-chart/src/DonutChartPlot.vue.d.ts.map +1 -0
  767. package/dist/charts/donut-chart/src/context.d.ts +71 -0
  768. package/dist/charts/donut-chart/src/context.d.ts.map +1 -0
  769. package/dist/charts/donut-chart/src/model.d.ts +22 -0
  770. package/dist/charts/donut-chart/src/model.d.ts.map +1 -0
  771. package/dist/charts/donut-chart.d.ts +1 -0
  772. package/dist/charts/donut-chart.js +1 -0
  773. package/dist/charts/funnel-chart/index.d.ts +9 -0
  774. package/dist/charts/funnel-chart/index.d.ts.map +1 -0
  775. package/dist/charts/funnel-chart/src/FunnelChart.vue.d.ts +15 -0
  776. package/dist/charts/funnel-chart/src/FunnelChart.vue.d.ts.map +1 -0
  777. package/dist/charts/funnel-chart/src/FunnelChartPlot.vue.d.ts +4 -0
  778. package/dist/charts/funnel-chart/src/FunnelChartPlot.vue.d.ts.map +1 -0
  779. package/dist/charts/funnel-chart/src/FunnelChartSummary.vue.d.ts +4 -0
  780. package/dist/charts/funnel-chart/src/FunnelChartSummary.vue.d.ts.map +1 -0
  781. package/dist/charts/funnel-chart/src/context.d.ts +153 -0
  782. package/dist/charts/funnel-chart/src/context.d.ts.map +1 -0
  783. package/dist/charts/funnel-chart/src/model.d.ts +23 -0
  784. package/dist/charts/funnel-chart/src/model.d.ts.map +1 -0
  785. package/dist/charts/funnel-chart.d.ts +1 -0
  786. package/dist/charts/funnel-chart.js +1 -0
  787. package/dist/charts/heat-calendar/index.d.ts +10 -0
  788. package/dist/charts/heat-calendar/index.d.ts.map +1 -0
  789. package/dist/charts/heat-calendar/src/HeatCalendar.vue.d.ts +21 -0
  790. package/dist/charts/heat-calendar/src/HeatCalendar.vue.d.ts.map +1 -0
  791. package/dist/charts/heat-calendar/src/HeatCalendarGrid.vue.d.ts +14 -0
  792. package/dist/charts/heat-calendar/src/HeatCalendarGrid.vue.d.ts.map +1 -0
  793. package/dist/charts/heat-calendar/src/HeatCalendarLegend.vue.d.ts +4 -0
  794. package/dist/charts/heat-calendar/src/HeatCalendarLegend.vue.d.ts.map +1 -0
  795. package/dist/charts/heat-calendar/src/HeatCalendarTooltip.vue.d.ts +23 -0
  796. package/dist/charts/heat-calendar/src/HeatCalendarTooltip.vue.d.ts.map +1 -0
  797. package/dist/charts/heat-calendar/src/context.d.ts +200 -0
  798. package/dist/charts/heat-calendar/src/context.d.ts.map +1 -0
  799. package/dist/charts/heat-calendar/src/model.d.ts +44 -0
  800. package/dist/charts/heat-calendar/src/model.d.ts.map +1 -0
  801. package/dist/charts/heat-calendar/src/types.d.ts +28 -0
  802. package/dist/charts/heat-calendar/src/types.d.ts.map +1 -0
  803. package/dist/charts/heat-calendar/src/utils.d.ts +15 -0
  804. package/dist/charts/heat-calendar/src/utils.d.ts.map +1 -0
  805. package/dist/charts/heat-calendar.d.ts +1 -0
  806. package/dist/charts/heat-calendar.js +1 -0
  807. package/dist/charts/index.d.ts +15 -0
  808. package/dist/charts/index.d.ts.map +1 -0
  809. package/dist/charts/liquidity-heatmap/index.d.ts +9 -0
  810. package/dist/charts/liquidity-heatmap/index.d.ts.map +1 -0
  811. package/dist/charts/liquidity-heatmap/src/LiquidityHeatmap.vue.d.ts +15 -0
  812. package/dist/charts/liquidity-heatmap/src/LiquidityHeatmap.vue.d.ts.map +1 -0
  813. package/dist/charts/liquidity-heatmap/src/LiquidityHeatmapLegend.vue.d.ts +4 -0
  814. package/dist/charts/liquidity-heatmap/src/LiquidityHeatmapLegend.vue.d.ts.map +1 -0
  815. package/dist/charts/liquidity-heatmap/src/LiquidityHeatmapPlot.vue.d.ts +4 -0
  816. package/dist/charts/liquidity-heatmap/src/LiquidityHeatmapPlot.vue.d.ts.map +1 -0
  817. package/dist/charts/liquidity-heatmap/src/context.d.ts +75 -0
  818. package/dist/charts/liquidity-heatmap/src/context.d.ts.map +1 -0
  819. package/dist/charts/liquidity-heatmap/src/model.d.ts +21 -0
  820. package/dist/charts/liquidity-heatmap/src/model.d.ts.map +1 -0
  821. package/dist/charts/liquidity-heatmap.d.ts +1 -0
  822. package/dist/charts/liquidity-heatmap.js +1 -0
  823. package/dist/charts/order-book/index.d.ts +17 -0
  824. package/dist/charts/order-book/index.d.ts.map +1 -0
  825. package/dist/charts/order-book/src/OrderBook.vue.d.ts +23 -0
  826. package/dist/charts/order-book/src/OrderBook.vue.d.ts.map +1 -0
  827. package/dist/charts/order-book/src/OrderBookBalance.vue.d.ts +4 -0
  828. package/dist/charts/order-book/src/OrderBookBalance.vue.d.ts.map +1 -0
  829. package/dist/charts/order-book/src/OrderBookDepthRow.vue.d.ts +12 -0
  830. package/dist/charts/order-book/src/OrderBookDepthRow.vue.d.ts.map +1 -0
  831. package/dist/charts/order-book/src/OrderBookDepthSummary.vue.d.ts +21 -0
  832. package/dist/charts/order-book/src/OrderBookDepthSummary.vue.d.ts.map +1 -0
  833. package/dist/charts/order-book/src/OrderBookHeader.vue.d.ts +4 -0
  834. package/dist/charts/order-book/src/OrderBookHeader.vue.d.ts.map +1 -0
  835. package/dist/charts/order-book/src/OrderBookSide.vue.d.ts +7 -0
  836. package/dist/charts/order-book/src/OrderBookSide.vue.d.ts.map +1 -0
  837. package/dist/charts/order-book/src/OrderBookSpread.vue.d.ts +4 -0
  838. package/dist/charts/order-book/src/OrderBookSpread.vue.d.ts.map +1 -0
  839. package/dist/charts/order-book/src/context.d.ts +158 -0
  840. package/dist/charts/order-book/src/context.d.ts.map +1 -0
  841. package/dist/charts/order-book/src/model.d.ts +28 -0
  842. package/dist/charts/order-book/src/model.d.ts.map +1 -0
  843. package/dist/charts/order-book.d.ts +1 -0
  844. package/dist/charts/order-book.js +1 -0
  845. package/dist/charts/price-target-fan/index.d.ts +22 -0
  846. package/dist/charts/price-target-fan/index.d.ts.map +1 -0
  847. package/dist/charts/price-target-fan/src/PriceTargetFan.vue.d.ts +21 -0
  848. package/dist/charts/price-target-fan/src/PriceTargetFan.vue.d.ts.map +1 -0
  849. package/dist/charts/price-target-fan/src/PriceTargetFanAxes.vue.d.ts +4 -0
  850. package/dist/charts/price-target-fan/src/PriceTargetFanAxes.vue.d.ts.map +1 -0
  851. package/dist/charts/price-target-fan/src/PriceTargetFanCursor.vue.d.ts +4 -0
  852. package/dist/charts/price-target-fan/src/PriceTargetFanCursor.vue.d.ts.map +1 -0
  853. package/dist/charts/price-target-fan/src/PriceTargetFanHeader.vue.d.ts +14 -0
  854. package/dist/charts/price-target-fan/src/PriceTargetFanHeader.vue.d.ts.map +1 -0
  855. package/dist/charts/price-target-fan/src/PriceTargetFanHistory.vue.d.ts +4 -0
  856. package/dist/charts/price-target-fan/src/PriceTargetFanHistory.vue.d.ts.map +1 -0
  857. package/dist/charts/price-target-fan/src/PriceTargetFanNow.vue.d.ts +4 -0
  858. package/dist/charts/price-target-fan/src/PriceTargetFanNow.vue.d.ts.map +1 -0
  859. package/dist/charts/price-target-fan/src/PriceTargetFanPlot.vue.d.ts +13 -0
  860. package/dist/charts/price-target-fan/src/PriceTargetFanPlot.vue.d.ts.map +1 -0
  861. package/dist/charts/price-target-fan/src/PriceTargetFanSvg.vue.d.ts +14 -0
  862. package/dist/charts/price-target-fan/src/PriceTargetFanSvg.vue.d.ts.map +1 -0
  863. package/dist/charts/price-target-fan/src/PriceTargetFanTargets.vue.d.ts +4 -0
  864. package/dist/charts/price-target-fan/src/PriceTargetFanTargets.vue.d.ts.map +1 -0
  865. package/dist/charts/price-target-fan/src/PriceTargetFanTooltip.vue.d.ts +29 -0
  866. package/dist/charts/price-target-fan/src/PriceTargetFanTooltip.vue.d.ts.map +1 -0
  867. package/dist/charts/price-target-fan/src/context.d.ts +316 -0
  868. package/dist/charts/price-target-fan/src/context.d.ts.map +1 -0
  869. package/dist/charts/price-target-fan/src/geometry.d.ts +38 -0
  870. package/dist/charts/price-target-fan/src/geometry.d.ts.map +1 -0
  871. package/dist/charts/price-target-fan/src/types.d.ts +39 -0
  872. package/dist/charts/price-target-fan/src/types.d.ts.map +1 -0
  873. package/dist/charts/price-target-fan/src/utils.d.ts +13 -0
  874. package/dist/charts/price-target-fan/src/utils.d.ts.map +1 -0
  875. package/dist/charts/price-target-fan.d.ts +1 -0
  876. package/dist/charts/price-target-fan.js +1 -0
  877. package/dist/charts/returns-calendar/index.d.ts +8 -0
  878. package/dist/charts/returns-calendar/index.d.ts.map +1 -0
  879. package/dist/charts/returns-calendar/src/ReturnsCalendar.vue.d.ts +21 -0
  880. package/dist/charts/returns-calendar/src/ReturnsCalendar.vue.d.ts.map +1 -0
  881. package/dist/charts/returns-calendar/src/ReturnsCalendarGrid.vue.d.ts +14 -0
  882. package/dist/charts/returns-calendar/src/ReturnsCalendarGrid.vue.d.ts.map +1 -0
  883. package/dist/charts/returns-calendar/src/ReturnsCalendarTooltip.vue.d.ts +18 -0
  884. package/dist/charts/returns-calendar/src/ReturnsCalendarTooltip.vue.d.ts.map +1 -0
  885. package/dist/charts/returns-calendar/src/context.d.ts +128 -0
  886. package/dist/charts/returns-calendar/src/context.d.ts.map +1 -0
  887. package/dist/charts/returns-calendar/src/model.d.ts +28 -0
  888. package/dist/charts/returns-calendar/src/model.d.ts.map +1 -0
  889. package/dist/charts/returns-calendar/src/types.d.ts +25 -0
  890. package/dist/charts/returns-calendar/src/types.d.ts.map +1 -0
  891. package/dist/charts/returns-calendar/src/utils.d.ts +16 -0
  892. package/dist/charts/returns-calendar/src/utils.d.ts.map +1 -0
  893. package/dist/charts/returns-calendar.d.ts +1 -0
  894. package/dist/charts/returns-calendar.js +1 -0
  895. package/dist/charts/sankey-chart/index.d.ts +9 -0
  896. package/dist/charts/sankey-chart/index.d.ts.map +1 -0
  897. package/dist/charts/sankey-chart/src/SankeyChart.vue.d.ts +21 -0
  898. package/dist/charts/sankey-chart/src/SankeyChart.vue.d.ts.map +1 -0
  899. package/dist/charts/sankey-chart/src/SankeyChartPlot.vue.d.ts +9 -0
  900. package/dist/charts/sankey-chart/src/SankeyChartPlot.vue.d.ts.map +1 -0
  901. package/dist/charts/sankey-chart/src/SankeyChartTooltip.vue.d.ts +21 -0
  902. package/dist/charts/sankey-chart/src/SankeyChartTooltip.vue.d.ts.map +1 -0
  903. package/dist/charts/sankey-chart/src/context.d.ts +115 -0
  904. package/dist/charts/sankey-chart/src/context.d.ts.map +1 -0
  905. package/dist/charts/sankey-chart/src/model.d.ts +62 -0
  906. package/dist/charts/sankey-chart/src/model.d.ts.map +1 -0
  907. package/dist/charts/sankey-chart.d.ts +1 -0
  908. package/dist/charts/sankey-chart.js +1 -0
  909. package/dist/charts/shared.d.ts +25 -0
  910. package/dist/charts/shared.d.ts.map +1 -0
  911. package/dist/charts/status-bar/index.d.ts +15 -0
  912. package/dist/charts/status-bar/index.d.ts.map +1 -0
  913. package/dist/charts/status-bar/src/StatusBar.vue.d.ts +21 -0
  914. package/dist/charts/status-bar/src/StatusBar.vue.d.ts.map +1 -0
  915. package/dist/charts/status-bar/src/StatusBarLegend.vue.d.ts +19 -0
  916. package/dist/charts/status-bar/src/StatusBarLegend.vue.d.ts.map +1 -0
  917. package/dist/charts/status-bar/src/StatusBarPlot.vue.d.ts +20 -0
  918. package/dist/charts/status-bar/src/StatusBarPlot.vue.d.ts.map +1 -0
  919. package/dist/charts/status-bar/src/StatusBarTooltip.vue.d.ts +22 -0
  920. package/dist/charts/status-bar/src/StatusBarTooltip.vue.d.ts.map +1 -0
  921. package/dist/charts/status-bar/src/context.d.ts +103 -0
  922. package/dist/charts/status-bar/src/context.d.ts.map +1 -0
  923. package/dist/charts/status-bar.d.ts +1 -0
  924. package/dist/charts/status-bar.js +1 -0
  925. package/dist/charts/treemap/index.d.ts +13 -0
  926. package/dist/charts/treemap/index.d.ts.map +1 -0
  927. package/dist/charts/treemap/src/Treemap.vue.d.ts +21 -0
  928. package/dist/charts/treemap/src/Treemap.vue.d.ts.map +1 -0
  929. package/dist/charts/treemap/src/TreemapCell.vue.d.ts +20 -0
  930. package/dist/charts/treemap/src/TreemapCell.vue.d.ts.map +1 -0
  931. package/dist/charts/treemap/src/TreemapLegend.vue.d.ts +9 -0
  932. package/dist/charts/treemap/src/TreemapLegend.vue.d.ts.map +1 -0
  933. package/dist/charts/treemap/src/TreemapPlot.vue.d.ts +20 -0
  934. package/dist/charts/treemap/src/TreemapPlot.vue.d.ts.map +1 -0
  935. package/dist/charts/treemap/src/TreemapTooltip.vue.d.ts +21 -0
  936. package/dist/charts/treemap/src/TreemapTooltip.vue.d.ts.map +1 -0
  937. package/dist/charts/treemap/src/context.d.ts +94 -0
  938. package/dist/charts/treemap/src/context.d.ts.map +1 -0
  939. package/dist/charts/treemap/src/model.d.ts +43 -0
  940. package/dist/charts/treemap/src/model.d.ts.map +1 -0
  941. package/dist/charts/treemap.d.ts +1 -0
  942. package/dist/charts/treemap.js +1 -0
  943. package/dist/charts/volume-profile/index.d.ts +11 -0
  944. package/dist/charts/volume-profile/index.d.ts.map +1 -0
  945. package/dist/charts/volume-profile/src/VolumeProfile.vue.d.ts +23 -0
  946. package/dist/charts/volume-profile/src/VolumeProfile.vue.d.ts.map +1 -0
  947. package/dist/charts/volume-profile/src/VolumeProfilePlot.vue.d.ts +20 -0
  948. package/dist/charts/volume-profile/src/VolumeProfilePlot.vue.d.ts.map +1 -0
  949. package/dist/charts/volume-profile/src/VolumeProfileSummary.vue.d.ts +4 -0
  950. package/dist/charts/volume-profile/src/VolumeProfileSummary.vue.d.ts.map +1 -0
  951. package/dist/charts/volume-profile/src/VolumeProfileTooltip.vue.d.ts +34 -0
  952. package/dist/charts/volume-profile/src/VolumeProfileTooltip.vue.d.ts.map +1 -0
  953. package/dist/charts/volume-profile/src/context.d.ts +453 -0
  954. package/dist/charts/volume-profile/src/context.d.ts.map +1 -0
  955. package/dist/charts/volume-profile/src/model.d.ts +49 -0
  956. package/dist/charts/volume-profile/src/model.d.ts.map +1 -0
  957. package/dist/charts/volume-profile.d.ts +1 -0
  958. package/dist/charts/volume-profile.js +1 -0
  959. package/dist/charts.d.ts +1 -0
  960. package/dist/charts.js +15 -0
  961. package/dist/chat-app-UQc_9SV-.js +118 -0
  962. package/dist/chat-app-UQc_9SV-.js.map +1 -0
  963. package/dist/citations-DTgV7SYB.js +256 -0
  964. package/dist/citations-DTgV7SYB.js.map +1 -0
  965. package/dist/code-block-BfgCXsAh.js +130 -0
  966. package/dist/code-block-BfgCXsAh.js.map +1 -0
  967. package/dist/collapsible-Czuu4mj9.js +206 -0
  968. package/dist/collapsible-Czuu4mj9.js.map +1 -0
  969. package/dist/color-picker-oBOAYuFD.js +1120 -0
  970. package/dist/color-picker-oBOAYuFD.js.map +1 -0
  971. package/dist/color-selector-BUCIKQKf.js +221 -0
  972. package/dist/color-selector-BUCIKQKf.js.map +1 -0
  973. package/dist/combobox-Bm4DKATI.js +237 -0
  974. package/dist/combobox-Bm4DKATI.js.map +1 -0
  975. package/dist/command-palette-BHNS6FfB.js +274 -0
  976. package/dist/command-palette-BHNS6FfB.js.map +1 -0
  977. package/dist/composables-BJ1sih_H.js +192 -0
  978. package/dist/composables-BJ1sih_H.js.map +1 -0
  979. package/dist/composition-chart-DFroPUqu.js +328 -0
  980. package/dist/composition-chart-DFroPUqu.js.map +1 -0
  981. package/dist/context-menu-B7g-ul4e.js +520 -0
  982. package/dist/context-menu-B7g-ul4e.js.map +1 -0
  983. package/dist/cylinder-carousel-Dnt34HR2.js +187 -0
  984. package/dist/cylinder-carousel-Dnt34HR2.js.map +1 -0
  985. package/dist/date-range-picker---vmv_cC.js +941 -0
  986. package/dist/date-range-picker---vmv_cC.js.map +1 -0
  987. package/dist/declaration-audit.json +6 -0
  988. package/dist/dismiss-Db0RZCUY.js +47 -0
  989. package/dist/dismiss-Db0RZCUY.js.map +1 -0
  990. package/dist/dock-Dlm41wbN.js +67 -0
  991. package/dist/dock-Dlm41wbN.js.map +1 -0
  992. package/dist/donut-chart-D3aserbJ.js +323 -0
  993. package/dist/donut-chart-D3aserbJ.js.map +1 -0
  994. package/dist/drawer-DLtDIIpa.js +79 -0
  995. package/dist/drawer-DLtDIIpa.js.map +1 -0
  996. package/dist/dynamic-island-D_wBlujh.js +169 -0
  997. package/dist/dynamic-island-D_wBlujh.js.map +1 -0
  998. package/dist/ease-rIvCM4O3.js +53 -0
  999. package/dist/ease-rIvCM4O3.js.map +1 -0
  1000. package/dist/expandable-action-bar-Cs8jgCn-.js +247 -0
  1001. package/dist/expandable-action-bar-Cs8jgCn-.js.map +1 -0
  1002. package/dist/expandable-control-jWQR_WG5.js +210 -0
  1003. package/dist/expandable-control-jWQR_WG5.js.map +1 -0
  1004. package/dist/expandable-tabs-D9b-6Mxy.js +290 -0
  1005. package/dist/expandable-tabs-D9b-6Mxy.js.map +1 -0
  1006. package/dist/expanding-arrow-button-CM0UMPHe.js +485 -0
  1007. package/dist/expanding-arrow-button-CM0UMPHe.js.map +1 -0
  1008. package/dist/feedback-widget-WnodYTUe.js +430 -0
  1009. package/dist/feedback-widget-WnodYTUe.js.map +1 -0
  1010. package/dist/file-diff-DNZKcjPv.js +167 -0
  1011. package/dist/file-diff-DNZKcjPv.js.map +1 -0
  1012. package/dist/file-tree-BX_U6uD4.js +320 -0
  1013. package/dist/file-tree-BX_U6uD4.js.map +1 -0
  1014. package/dist/file-upload-BePH_y0O.js +1116 -0
  1015. package/dist/file-upload-BePH_y0O.js.map +1 -0
  1016. package/dist/funnel-chart-Da8ybNYU.js +194 -0
  1017. package/dist/funnel-chart-Da8ybNYU.js.map +1 -0
  1018. package/dist/heat-calendar-ClxgUT8q.js +403 -0
  1019. package/dist/heat-calendar-ClxgUT8q.js.map +1 -0
  1020. package/dist/image-generation-YoIRryNH.js +297 -0
  1021. package/dist/image-generation-YoIRryNH.js.map +1 -0
  1022. package/dist/image-viewer-CkykIxp4.js +891 -0
  1023. package/dist/image-viewer-CkykIxp4.js.map +1 -0
  1024. package/dist/index.d.ts +9 -0
  1025. package/dist/index.d.ts.map +1 -0
  1026. package/dist/index.js +121 -0
  1027. package/dist/infinite-masonry-8d1lfqNh.js +245 -0
  1028. package/dist/infinite-masonry-8d1lfqNh.js.map +1 -0
  1029. package/dist/input-B17D4VP0.js +164 -0
  1030. package/dist/input-B17D4VP0.js.map +1 -0
  1031. package/dist/interactivity-fV41y350.js +23 -0
  1032. package/dist/interactivity-fV41y350.js.map +1 -0
  1033. package/dist/knockout-bracket-Dj5UsAKA.js +1799 -0
  1034. package/dist/knockout-bracket-Dj5UsAKA.js.map +1 -0
  1035. package/dist/lib/RenderContent.d.ts +7 -0
  1036. package/dist/lib/RenderContent.d.ts.map +1 -0
  1037. package/dist/lib/composables.d.ts +20 -0
  1038. package/dist/lib/composables.d.ts.map +1 -0
  1039. package/dist/lib/ease.d.ts +45 -0
  1040. package/dist/lib/ease.d.ts.map +1 -0
  1041. package/dist/lib/layers.d.ts +21 -0
  1042. package/dist/lib/layers.d.ts.map +1 -0
  1043. package/dist/lib/utils.d.ts +3 -0
  1044. package/dist/lib/utils.d.ts.map +1 -0
  1045. package/dist/liquidity-heatmap-CzTHCHEm.js +271 -0
  1046. package/dist/liquidity-heatmap-CzTHCHEm.js.map +1 -0
  1047. package/dist/loader-CktgL9IB.js +506 -0
  1048. package/dist/loader-CktgL9IB.js.map +1 -0
  1049. package/dist/loading-states-C6-sLyVo.js +279 -0
  1050. package/dist/loading-states-C6-sLyVo.js.map +1 -0
  1051. package/dist/marquee-C1FQEE-x.js +54 -0
  1052. package/dist/marquee-C1FQEE-x.js.map +1 -0
  1053. package/dist/message-CwBzZlNb.js +173 -0
  1054. package/dist/message-CwBzZlNb.js.map +1 -0
  1055. package/dist/message-bubble-BWfWrrcc.js +207 -0
  1056. package/dist/message-bubble-BWfWrrcc.js.map +1 -0
  1057. package/dist/message-scroller-D3DUIH1X.js +189 -0
  1058. package/dist/message-scroller-D3DUIH1X.js.map +1 -0
  1059. package/dist/morphing-modal-Ct3pv5pK.js +168 -0
  1060. package/dist/morphing-modal-Ct3pv5pK.js.map +1 -0
  1061. package/dist/morphing-search-DbDedimq.js +1022 -0
  1062. package/dist/morphing-search-DbDedimq.js.map +1 -0
  1063. package/dist/morphing-tabs-YtGm3iRJ.js +528 -0
  1064. package/dist/morphing-tabs-YtGm3iRJ.js.map +1 -0
  1065. package/dist/motion/_combobox/SearchSurface.vue.d.ts +27 -0
  1066. package/dist/motion/_combobox/SearchSurface.vue.d.ts.map +1 -0
  1067. package/dist/motion/_combobox/controller.d.ts +113 -0
  1068. package/dist/motion/_combobox/controller.d.ts.map +1 -0
  1069. package/dist/motion/_overlay/DialogSurface.vue.d.ts +32 -0
  1070. package/dist/motion/_overlay/DialogSurface.vue.d.ts.map +1 -0
  1071. package/dist/motion/_overlay/FloatingSurface.vue.d.ts +31 -0
  1072. package/dist/motion/_overlay/FloatingSurface.vue.d.ts.map +1 -0
  1073. package/dist/motion/_overlay/index.d.ts +3 -0
  1074. package/dist/motion/_overlay/index.d.ts.map +1 -0
  1075. package/dist/motion/_overlay/interactivity.d.ts +4 -0
  1076. package/dist/motion/_overlay/interactivity.d.ts.map +1 -0
  1077. package/dist/motion/_overlay.d.ts +1 -0
  1078. package/dist/motion/_overlay.js +214 -0
  1079. package/dist/motion/_overlay.js.map +1 -0
  1080. package/dist/motion/action-swap/index.d.ts +15 -0
  1081. package/dist/motion/action-swap/index.d.ts.map +1 -0
  1082. package/dist/motion/action-swap/src/ActionSwapBlurButton.vue.d.ts +56 -0
  1083. package/dist/motion/action-swap/src/ActionSwapBlurButton.vue.d.ts.map +1 -0
  1084. package/dist/motion/action-swap/src/ActionSwapBlurIcon.vue.d.ts +16 -0
  1085. package/dist/motion/action-swap/src/ActionSwapBlurIcon.vue.d.ts.map +1 -0
  1086. package/dist/motion/action-swap/src/ActionSwapBlurText.vue.d.ts +16 -0
  1087. package/dist/motion/action-swap/src/ActionSwapBlurText.vue.d.ts.map +1 -0
  1088. package/dist/motion/action-swap/src/ActionSwapButton.vue.d.ts +66 -0
  1089. package/dist/motion/action-swap/src/ActionSwapButton.vue.d.ts.map +1 -0
  1090. package/dist/motion/action-swap/src/ActionSwapCascadeButton.vue.d.ts +56 -0
  1091. package/dist/motion/action-swap/src/ActionSwapCascadeButton.vue.d.ts.map +1 -0
  1092. package/dist/motion/action-swap/src/ActionSwapCascadeIcon.vue.d.ts +16 -0
  1093. package/dist/motion/action-swap/src/ActionSwapCascadeIcon.vue.d.ts.map +1 -0
  1094. package/dist/motion/action-swap/src/ActionSwapCascadeText.vue.d.ts +16 -0
  1095. package/dist/motion/action-swap/src/ActionSwapCascadeText.vue.d.ts.map +1 -0
  1096. package/dist/motion/action-swap/src/ActionSwapIcon.vue.d.ts +20 -0
  1097. package/dist/motion/action-swap/src/ActionSwapIcon.vue.d.ts.map +1 -0
  1098. package/dist/motion/action-swap/src/ActionSwapRollButton.vue.d.ts +56 -0
  1099. package/dist/motion/action-swap/src/ActionSwapRollButton.vue.d.ts.map +1 -0
  1100. package/dist/motion/action-swap/src/ActionSwapRollIcon.vue.d.ts +16 -0
  1101. package/dist/motion/action-swap/src/ActionSwapRollIcon.vue.d.ts.map +1 -0
  1102. package/dist/motion/action-swap/src/ActionSwapRollText.vue.d.ts +16 -0
  1103. package/dist/motion/action-swap/src/ActionSwapRollText.vue.d.ts.map +1 -0
  1104. package/dist/motion/action-swap/src/ActionSwapText.vue.d.ts +22 -0
  1105. package/dist/motion/action-swap/src/ActionSwapText.vue.d.ts.map +1 -0
  1106. package/dist/motion/action-swap/src/api-types.d.ts +13 -0
  1107. package/dist/motion/action-swap/src/api-types.d.ts.map +1 -0
  1108. package/dist/motion/action-swap/src/poses.d.ts +77 -0
  1109. package/dist/motion/action-swap/src/poses.d.ts.map +1 -0
  1110. package/dist/motion/action-swap/src/public-types.d.ts +6 -0
  1111. package/dist/motion/action-swap/src/public-types.d.ts.map +1 -0
  1112. package/dist/motion/action-swap.d.ts +1 -0
  1113. package/dist/motion/action-swap.js +4 -0
  1114. package/dist/motion/adaptive-stepper/index.d.ts +7 -0
  1115. package/dist/motion/adaptive-stepper/index.d.ts.map +1 -0
  1116. package/dist/motion/adaptive-stepper/src/AdaptiveStepper.vue.d.ts +37 -0
  1117. package/dist/motion/adaptive-stepper/src/AdaptiveStepper.vue.d.ts.map +1 -0
  1118. package/dist/motion/adaptive-stepper/src/AdaptiveStepperDecrement.vue.d.ts +14 -0
  1119. package/dist/motion/adaptive-stepper/src/AdaptiveStepperDecrement.vue.d.ts.map +1 -0
  1120. package/dist/motion/adaptive-stepper/src/AdaptiveStepperIncrement.vue.d.ts +14 -0
  1121. package/dist/motion/adaptive-stepper/src/AdaptiveStepperIncrement.vue.d.ts.map +1 -0
  1122. package/dist/motion/adaptive-stepper/src/AdaptiveStepperValue.vue.d.ts +16 -0
  1123. package/dist/motion/adaptive-stepper/src/AdaptiveStepperValue.vue.d.ts.map +1 -0
  1124. package/dist/motion/adaptive-stepper/src/Liquid.vue.d.ts +14 -0
  1125. package/dist/motion/adaptive-stepper/src/Liquid.vue.d.ts.map +1 -0
  1126. package/dist/motion/adaptive-stepper/src/LiquidItem.vue.d.ts +25 -0
  1127. package/dist/motion/adaptive-stepper/src/LiquidItem.vue.d.ts.map +1 -0
  1128. package/dist/motion/adaptive-stepper/src/StepperAction.vue.d.ts +17 -0
  1129. package/dist/motion/adaptive-stepper/src/StepperAction.vue.d.ts.map +1 -0
  1130. package/dist/motion/adaptive-stepper/src/api-types.d.ts +3 -0
  1131. package/dist/motion/adaptive-stepper/src/api-types.d.ts.map +1 -0
  1132. package/dist/motion/adaptive-stepper/src/context.d.ts +15 -0
  1133. package/dist/motion/adaptive-stepper/src/context.d.ts.map +1 -0
  1134. package/dist/motion/adaptive-stepper/src/filter.d.ts +4 -0
  1135. package/dist/motion/adaptive-stepper/src/filter.d.ts.map +1 -0
  1136. package/dist/motion/adaptive-stepper/src/liquid-context.d.ts +8 -0
  1137. package/dist/motion/adaptive-stepper/src/liquid-context.d.ts.map +1 -0
  1138. package/dist/motion/adaptive-stepper/src/public-types.d.ts +3 -0
  1139. package/dist/motion/adaptive-stepper/src/public-types.d.ts.map +1 -0
  1140. package/dist/motion/adaptive-stepper.d.ts +1 -0
  1141. package/dist/motion/adaptive-stepper.js +1 -0
  1142. package/dist/motion/alert/index.d.ts +11 -0
  1143. package/dist/motion/alert/index.d.ts.map +1 -0
  1144. package/dist/motion/alert/src/Alert.vue.d.ts +34 -0
  1145. package/dist/motion/alert/src/Alert.vue.d.ts.map +1 -0
  1146. package/dist/motion/alert/src/AlertAction.vue.d.ts +13 -0
  1147. package/dist/motion/alert/src/AlertAction.vue.d.ts.map +1 -0
  1148. package/dist/motion/alert/src/AlertClose.vue.d.ts +14 -0
  1149. package/dist/motion/alert/src/AlertClose.vue.d.ts.map +1 -0
  1150. package/dist/motion/alert/src/AlertContent.vue.d.ts +13 -0
  1151. package/dist/motion/alert/src/AlertContent.vue.d.ts.map +1 -0
  1152. package/dist/motion/alert/src/AlertDescription.vue.d.ts +13 -0
  1153. package/dist/motion/alert/src/AlertDescription.vue.d.ts.map +1 -0
  1154. package/dist/motion/alert/src/AlertIcon.vue.d.ts +14 -0
  1155. package/dist/motion/alert/src/AlertIcon.vue.d.ts.map +1 -0
  1156. package/dist/motion/alert/src/AlertTitle.vue.d.ts +13 -0
  1157. package/dist/motion/alert/src/AlertTitle.vue.d.ts.map +1 -0
  1158. package/dist/motion/alert/src/api-types.d.ts +8 -0
  1159. package/dist/motion/alert/src/api-types.d.ts.map +1 -0
  1160. package/dist/motion/alert/src/context.d.ts +10 -0
  1161. package/dist/motion/alert/src/context.d.ts.map +1 -0
  1162. package/dist/motion/alert/src/public-types.d.ts +10 -0
  1163. package/dist/motion/alert/src/public-types.d.ts.map +1 -0
  1164. package/dist/motion/alert/src/useAlert.d.ts +3 -0
  1165. package/dist/motion/alert/src/useAlert.d.ts.map +1 -0
  1166. package/dist/motion/alert.d.ts +1 -0
  1167. package/dist/motion/alert.js +1 -0
  1168. package/dist/motion/animated-badge/index.d.ts +4 -0
  1169. package/dist/motion/animated-badge/index.d.ts.map +1 -0
  1170. package/dist/motion/animated-badge/src/AnimatedBadge.vue.d.ts +29 -0
  1171. package/dist/motion/animated-badge/src/AnimatedBadge.vue.d.ts.map +1 -0
  1172. package/dist/motion/animated-badge/src/api-types.d.ts +2 -0
  1173. package/dist/motion/animated-badge/src/api-types.d.ts.map +1 -0
  1174. package/dist/motion/animated-badge/src/public-types.d.ts +4 -0
  1175. package/dist/motion/animated-badge/src/public-types.d.ts.map +1 -0
  1176. package/dist/motion/animated-badge.d.ts +1 -0
  1177. package/dist/motion/animated-badge.js +1 -0
  1178. package/dist/motion/animated-sidebar/index.d.ts +21 -0
  1179. package/dist/motion/animated-sidebar/index.d.ts.map +1 -0
  1180. package/dist/motion/animated-sidebar/src/AnimatedSidebar.vue.d.ts +28 -0
  1181. package/dist/motion/animated-sidebar/src/AnimatedSidebar.vue.d.ts.map +1 -0
  1182. package/dist/motion/animated-sidebar/src/AnimatedSidebarClose.vue.d.ts +14 -0
  1183. package/dist/motion/animated-sidebar/src/AnimatedSidebarClose.vue.d.ts.map +1 -0
  1184. package/dist/motion/animated-sidebar/src/AnimatedSidebarContent.vue.d.ts +14 -0
  1185. package/dist/motion/animated-sidebar/src/AnimatedSidebarContent.vue.d.ts.map +1 -0
  1186. package/dist/motion/animated-sidebar/src/AnimatedSidebarFooter.vue.d.ts +14 -0
  1187. package/dist/motion/animated-sidebar/src/AnimatedSidebarFooter.vue.d.ts.map +1 -0
  1188. package/dist/motion/animated-sidebar/src/AnimatedSidebarGroup.vue.d.ts +14 -0
  1189. package/dist/motion/animated-sidebar/src/AnimatedSidebarGroup.vue.d.ts.map +1 -0
  1190. package/dist/motion/animated-sidebar/src/AnimatedSidebarGroupContent.vue.d.ts +14 -0
  1191. package/dist/motion/animated-sidebar/src/AnimatedSidebarGroupContent.vue.d.ts.map +1 -0
  1192. package/dist/motion/animated-sidebar/src/AnimatedSidebarGroupLabel.vue.d.ts +14 -0
  1193. package/dist/motion/animated-sidebar/src/AnimatedSidebarGroupLabel.vue.d.ts.map +1 -0
  1194. package/dist/motion/animated-sidebar/src/AnimatedSidebarHeader.vue.d.ts +14 -0
  1195. package/dist/motion/animated-sidebar/src/AnimatedSidebarHeader.vue.d.ts.map +1 -0
  1196. package/dist/motion/animated-sidebar/src/AnimatedSidebarInset.vue.d.ts +14 -0
  1197. package/dist/motion/animated-sidebar/src/AnimatedSidebarInset.vue.d.ts.map +1 -0
  1198. package/dist/motion/animated-sidebar/src/AnimatedSidebarMenu.vue.d.ts +14 -0
  1199. package/dist/motion/animated-sidebar/src/AnimatedSidebarMenu.vue.d.ts.map +1 -0
  1200. package/dist/motion/animated-sidebar/src/AnimatedSidebarMenuButton.vue.d.ts +34 -0
  1201. package/dist/motion/animated-sidebar/src/AnimatedSidebarMenuButton.vue.d.ts.map +1 -0
  1202. package/dist/motion/animated-sidebar/src/AnimatedSidebarMenuItem.vue.d.ts +14 -0
  1203. package/dist/motion/animated-sidebar/src/AnimatedSidebarMenuItem.vue.d.ts.map +1 -0
  1204. package/dist/motion/animated-sidebar/src/AnimatedSidebarMenuSub.vue.d.ts +17 -0
  1205. package/dist/motion/animated-sidebar/src/AnimatedSidebarMenuSub.vue.d.ts.map +1 -0
  1206. package/dist/motion/animated-sidebar/src/AnimatedSidebarMenuSubButton.vue.d.ts +31 -0
  1207. package/dist/motion/animated-sidebar/src/AnimatedSidebarMenuSubButton.vue.d.ts.map +1 -0
  1208. package/dist/motion/animated-sidebar/src/AnimatedSidebarMenuSubItem.vue.d.ts +14 -0
  1209. package/dist/motion/animated-sidebar/src/AnimatedSidebarMenuSubItem.vue.d.ts.map +1 -0
  1210. package/dist/motion/animated-sidebar/src/AnimatedSidebarProvider.vue.d.ts +50 -0
  1211. package/dist/motion/animated-sidebar/src/AnimatedSidebarProvider.vue.d.ts.map +1 -0
  1212. package/dist/motion/animated-sidebar/src/AnimatedSidebarRail.vue.d.ts +4 -0
  1213. package/dist/motion/animated-sidebar/src/AnimatedSidebarRail.vue.d.ts.map +1 -0
  1214. package/dist/motion/animated-sidebar/src/AnimatedSidebarTrigger.vue.d.ts +14 -0
  1215. package/dist/motion/animated-sidebar/src/AnimatedSidebarTrigger.vue.d.ts.map +1 -0
  1216. package/dist/motion/animated-sidebar/src/MobileSidebar.vue.d.ts +21 -0
  1217. package/dist/motion/animated-sidebar/src/MobileSidebar.vue.d.ts.map +1 -0
  1218. package/dist/motion/animated-sidebar/src/api-types.d.ts +10 -0
  1219. package/dist/motion/animated-sidebar/src/api-types.d.ts.map +1 -0
  1220. package/dist/motion/animated-sidebar/src/context.d.ts +21 -0
  1221. package/dist/motion/animated-sidebar/src/context.d.ts.map +1 -0
  1222. package/dist/motion/animated-sidebar/src/transitions.d.ts +39 -0
  1223. package/dist/motion/animated-sidebar/src/transitions.d.ts.map +1 -0
  1224. package/dist/motion/animated-sidebar/src/use-sidebar-state.d.ts +12 -0
  1225. package/dist/motion/animated-sidebar/src/use-sidebar-state.d.ts.map +1 -0
  1226. package/dist/motion/animated-sidebar/src/useAnimatedSidebar.d.ts +2 -0
  1227. package/dist/motion/animated-sidebar/src/useAnimatedSidebar.d.ts.map +1 -0
  1228. package/dist/motion/animated-sidebar.d.ts +1 -0
  1229. package/dist/motion/animated-sidebar.js +1 -0
  1230. package/dist/motion/animated-toast-stack/index.d.ts +4 -0
  1231. package/dist/motion/animated-toast-stack/index.d.ts.map +1 -0
  1232. package/dist/motion/animated-toast-stack/src/AnimatedToastStack.vue.d.ts +39 -0
  1233. package/dist/motion/animated-toast-stack/src/AnimatedToastStack.vue.d.ts.map +1 -0
  1234. package/dist/motion/animated-toast-stack/src/ToastItem.vue.d.ts +28 -0
  1235. package/dist/motion/animated-toast-stack/src/ToastItem.vue.d.ts.map +1 -0
  1236. package/dist/motion/animated-toast-stack/src/api-types.d.ts +2 -0
  1237. package/dist/motion/animated-toast-stack/src/api-types.d.ts.map +1 -0
  1238. package/dist/motion/animated-toast-stack/src/useAnimatedToastStack.d.ts +42 -0
  1239. package/dist/motion/animated-toast-stack/src/useAnimatedToastStack.d.ts.map +1 -0
  1240. package/dist/motion/animated-toast-stack.d.ts +1 -0
  1241. package/dist/motion/animated-toast-stack.js +1 -0
  1242. package/dist/motion/arc-picker/index.d.ts +4 -0
  1243. package/dist/motion/arc-picker/index.d.ts.map +1 -0
  1244. package/dist/motion/arc-picker/src/ArcPicker.vue.d.ts +35 -0
  1245. package/dist/motion/arc-picker/src/ArcPicker.vue.d.ts.map +1 -0
  1246. package/dist/motion/arc-picker/src/api-types.d.ts +2 -0
  1247. package/dist/motion/arc-picker/src/api-types.d.ts.map +1 -0
  1248. package/dist/motion/arc-picker/src/arc-control.d.ts +49 -0
  1249. package/dist/motion/arc-picker/src/arc-control.d.ts.map +1 -0
  1250. package/dist/motion/arc-picker/src/arc-layout.d.ts +38 -0
  1251. package/dist/motion/arc-picker/src/arc-layout.d.ts.map +1 -0
  1252. package/dist/motion/arc-picker.d.ts +1 -0
  1253. package/dist/motion/arc-picker.js +1 -0
  1254. package/dist/motion/aspect-ratio/index.d.ts +4 -0
  1255. package/dist/motion/aspect-ratio/index.d.ts.map +1 -0
  1256. package/dist/motion/aspect-ratio/src/AspectRatio.vue.d.ts +22 -0
  1257. package/dist/motion/aspect-ratio/src/AspectRatio.vue.d.ts.map +1 -0
  1258. package/dist/motion/aspect-ratio/src/AspectRatioImage.vue.d.ts +11 -0
  1259. package/dist/motion/aspect-ratio/src/AspectRatioImage.vue.d.ts.map +1 -0
  1260. package/dist/motion/aspect-ratio/src/api-types.d.ts +3 -0
  1261. package/dist/motion/aspect-ratio/src/api-types.d.ts.map +1 -0
  1262. package/dist/motion/aspect-ratio.d.ts +1 -0
  1263. package/dist/motion/aspect-ratio.js +1 -0
  1264. package/dist/motion/bottom-sheet/index.d.ts +3 -0
  1265. package/dist/motion/bottom-sheet/index.d.ts.map +1 -0
  1266. package/dist/motion/bottom-sheet/src/BottomSheet.vue.d.ts +41 -0
  1267. package/dist/motion/bottom-sheet/src/BottomSheet.vue.d.ts.map +1 -0
  1268. package/dist/motion/bottom-sheet/src/api-types.d.ts +2 -0
  1269. package/dist/motion/bottom-sheet/src/api-types.d.ts.map +1 -0
  1270. package/dist/motion/bottom-sheet/src/snap.d.ts +3 -0
  1271. package/dist/motion/bottom-sheet/src/snap.d.ts.map +1 -0
  1272. package/dist/motion/bottom-sheet.d.ts +1 -0
  1273. package/dist/motion/bottom-sheet.js +1 -0
  1274. package/dist/motion/bounce-sidebar/index.d.ts +4 -0
  1275. package/dist/motion/bounce-sidebar/index.d.ts.map +1 -0
  1276. package/dist/motion/bounce-sidebar/src/BounceSidebar.vue.d.ts +43 -0
  1277. package/dist/motion/bounce-sidebar/src/BounceSidebar.vue.d.ts.map +1 -0
  1278. package/dist/motion/bounce-sidebar/src/api-types.d.ts +2 -0
  1279. package/dist/motion/bounce-sidebar/src/api-types.d.ts.map +1 -0
  1280. package/dist/motion/bounce-sidebar/src/trajectory.d.ts +16 -0
  1281. package/dist/motion/bounce-sidebar/src/trajectory.d.ts.map +1 -0
  1282. package/dist/motion/bounce-sidebar.d.ts +1 -0
  1283. package/dist/motion/bounce-sidebar.js +1 -0
  1284. package/dist/motion/bouncy-accordion/index.d.ts +4 -0
  1285. package/dist/motion/bouncy-accordion/index.d.ts.map +1 -0
  1286. package/dist/motion/bouncy-accordion/src/BouncyAccordion.vue.d.ts +54 -0
  1287. package/dist/motion/bouncy-accordion/src/BouncyAccordion.vue.d.ts.map +1 -0
  1288. package/dist/motion/bouncy-accordion/src/BouncyAccordionRow.vue.d.ts +55 -0
  1289. package/dist/motion/bouncy-accordion/src/BouncyAccordionRow.vue.d.ts.map +1 -0
  1290. package/dist/motion/bouncy-accordion/src/api-types.d.ts +2 -0
  1291. package/dist/motion/bouncy-accordion/src/api-types.d.ts.map +1 -0
  1292. package/dist/motion/bouncy-accordion/src/public-types.d.ts +4 -0
  1293. package/dist/motion/bouncy-accordion/src/public-types.d.ts.map +1 -0
  1294. package/dist/motion/bouncy-accordion.d.ts +1 -0
  1295. package/dist/motion/bouncy-accordion.js +1 -0
  1296. package/dist/motion/breadcrumb/index.d.ts +9 -0
  1297. package/dist/motion/breadcrumb/index.d.ts.map +1 -0
  1298. package/dist/motion/breadcrumb/src/Breadcrumb.vue.d.ts +19 -0
  1299. package/dist/motion/breadcrumb/src/Breadcrumb.vue.d.ts.map +1 -0
  1300. package/dist/motion/breadcrumb/src/BreadcrumbEllipsis.vue.d.ts +19 -0
  1301. package/dist/motion/breadcrumb/src/BreadcrumbEllipsis.vue.d.ts.map +1 -0
  1302. package/dist/motion/breadcrumb/src/BreadcrumbItem.vue.d.ts +14 -0
  1303. package/dist/motion/breadcrumb/src/BreadcrumbItem.vue.d.ts.map +1 -0
  1304. package/dist/motion/breadcrumb/src/BreadcrumbLink.vue.d.ts +18 -0
  1305. package/dist/motion/breadcrumb/src/BreadcrumbLink.vue.d.ts.map +1 -0
  1306. package/dist/motion/breadcrumb/src/BreadcrumbList.vue.d.ts +28 -0
  1307. package/dist/motion/breadcrumb/src/BreadcrumbList.vue.d.ts.map +1 -0
  1308. package/dist/motion/breadcrumb/src/BreadcrumbPage.vue.d.ts +13 -0
  1309. package/dist/motion/breadcrumb/src/BreadcrumbPage.vue.d.ts.map +1 -0
  1310. package/dist/motion/breadcrumb/src/BreadcrumbSeparator.vue.d.ts +14 -0
  1311. package/dist/motion/breadcrumb/src/BreadcrumbSeparator.vue.d.ts.map +1 -0
  1312. package/dist/motion/breadcrumb/src/api-types.d.ts +8 -0
  1313. package/dist/motion/breadcrumb/src/api-types.d.ts.map +1 -0
  1314. package/dist/motion/breadcrumb.d.ts +1 -0
  1315. package/dist/motion/breadcrumb.js +1 -0
  1316. package/dist/motion/button/index.d.ts +9 -0
  1317. package/dist/motion/button/index.d.ts.map +1 -0
  1318. package/dist/motion/button/src/Button.vue.d.ts +27 -0
  1319. package/dist/motion/button/src/Button.vue.d.ts.map +1 -0
  1320. package/dist/motion/button/src/ButtonLink.vue.d.ts +24 -0
  1321. package/dist/motion/button/src/ButtonLink.vue.d.ts.map +1 -0
  1322. package/dist/motion/button/src/Magnetic.vue.d.ts +22 -0
  1323. package/dist/motion/button/src/Magnetic.vue.d.ts.map +1 -0
  1324. package/dist/motion/button/src/MagneticButton.vue.d.ts +24 -0
  1325. package/dist/motion/button/src/MagneticButton.vue.d.ts.map +1 -0
  1326. package/dist/motion/button/src/MetallicButton.vue.d.ts +22 -0
  1327. package/dist/motion/button/src/MetallicButton.vue.d.ts.map +1 -0
  1328. package/dist/motion/button/src/StatefulButton.vue.d.ts +50 -0
  1329. package/dist/motion/button/src/StatefulButton.vue.d.ts.map +1 -0
  1330. package/dist/motion/button/src/StatefulText.vue.d.ts +9 -0
  1331. package/dist/motion/button/src/StatefulText.vue.d.ts.map +1 -0
  1332. package/dist/motion/button/src/api-types.d.ts +6 -0
  1333. package/dist/motion/button/src/api-types.d.ts.map +1 -0
  1334. package/dist/motion/button/src/public-types.d.ts +4 -0
  1335. package/dist/motion/button/src/public-types.d.ts.map +1 -0
  1336. package/dist/motion/button.d.ts +1 -0
  1337. package/dist/motion/button.js +1 -0
  1338. package/dist/motion/card/index.d.ts +12 -0
  1339. package/dist/motion/card/index.d.ts.map +1 -0
  1340. package/dist/motion/card/src/Card.vue.d.ts +23 -0
  1341. package/dist/motion/card/src/Card.vue.d.ts.map +1 -0
  1342. package/dist/motion/card/src/CardAction.vue.d.ts +13 -0
  1343. package/dist/motion/card/src/CardAction.vue.d.ts.map +1 -0
  1344. package/dist/motion/card/src/CardContent.vue.d.ts +13 -0
  1345. package/dist/motion/card/src/CardContent.vue.d.ts.map +1 -0
  1346. package/dist/motion/card/src/CardDescription.vue.d.ts +13 -0
  1347. package/dist/motion/card/src/CardDescription.vue.d.ts.map +1 -0
  1348. package/dist/motion/card/src/CardFooter.vue.d.ts +13 -0
  1349. package/dist/motion/card/src/CardFooter.vue.d.ts.map +1 -0
  1350. package/dist/motion/card/src/CardHeader.vue.d.ts +13 -0
  1351. package/dist/motion/card/src/CardHeader.vue.d.ts.map +1 -0
  1352. package/dist/motion/card/src/CardTitle.vue.d.ts +19 -0
  1353. package/dist/motion/card/src/CardTitle.vue.d.ts.map +1 -0
  1354. package/dist/motion/card/src/api-types.d.ts +8 -0
  1355. package/dist/motion/card/src/api-types.d.ts.map +1 -0
  1356. package/dist/motion/card/src/parts.d.ts +5 -0
  1357. package/dist/motion/card/src/parts.d.ts.map +1 -0
  1358. package/dist/motion/card.d.ts +1 -0
  1359. package/dist/motion/card.js +1 -0
  1360. package/dist/motion/center-morph-modal/index.d.ts +6 -0
  1361. package/dist/motion/center-morph-modal/index.d.ts.map +1 -0
  1362. package/dist/motion/center-morph-modal/src/CenterMorphModal.vue.d.ts +27 -0
  1363. package/dist/motion/center-morph-modal/src/CenterMorphModal.vue.d.ts.map +1 -0
  1364. package/dist/motion/center-morph-modal/src/CenterMorphModalClose.vue.d.ts +6 -0
  1365. package/dist/motion/center-morph-modal/src/CenterMorphModalClose.vue.d.ts.map +1 -0
  1366. package/dist/motion/center-morph-modal/src/CenterMorphModalContent.vue.d.ts +26 -0
  1367. package/dist/motion/center-morph-modal/src/CenterMorphModalContent.vue.d.ts.map +1 -0
  1368. package/dist/motion/center-morph-modal/src/CenterMorphModalTrigger.vue.d.ts +6 -0
  1369. package/dist/motion/center-morph-modal/src/CenterMorphModalTrigger.vue.d.ts.map +1 -0
  1370. package/dist/motion/center-morph-modal/src/api-types.d.ts +5 -0
  1371. package/dist/motion/center-morph-modal/src/api-types.d.ts.map +1 -0
  1372. package/dist/motion/center-morph-modal/src/context.d.ts +7 -0
  1373. package/dist/motion/center-morph-modal/src/context.d.ts.map +1 -0
  1374. package/dist/motion/center-morph-modal/src/control.d.ts +5 -0
  1375. package/dist/motion/center-morph-modal/src/control.d.ts.map +1 -0
  1376. package/dist/motion/center-morph-modal.d.ts +1 -0
  1377. package/dist/motion/center-morph-modal.js +1 -0
  1378. package/dist/motion/checkbox/index.d.ts +3 -0
  1379. package/dist/motion/checkbox/index.d.ts.map +1 -0
  1380. package/dist/motion/checkbox/src/Checkbox.vue.d.ts +24 -0
  1381. package/dist/motion/checkbox/src/Checkbox.vue.d.ts.map +1 -0
  1382. package/dist/motion/checkbox/src/api-types.d.ts +2 -0
  1383. package/dist/motion/checkbox/src/api-types.d.ts.map +1 -0
  1384. package/dist/motion/checkbox.d.ts +1 -0
  1385. package/dist/motion/checkbox.js +1 -0
  1386. package/dist/motion/collapsible/index.d.ts +8 -0
  1387. package/dist/motion/collapsible/index.d.ts.map +1 -0
  1388. package/dist/motion/collapsible/src/Collapsible.vue.d.ts +31 -0
  1389. package/dist/motion/collapsible/src/Collapsible.vue.d.ts.map +1 -0
  1390. package/dist/motion/collapsible/src/CollapsibleContent.vue.d.ts +17 -0
  1391. package/dist/motion/collapsible/src/CollapsibleContent.vue.d.ts.map +1 -0
  1392. package/dist/motion/collapsible/src/CollapsibleIndicator.vue.d.ts +14 -0
  1393. package/dist/motion/collapsible/src/CollapsibleIndicator.vue.d.ts.map +1 -0
  1394. package/dist/motion/collapsible/src/CollapsibleTrigger.vue.d.ts +15 -0
  1395. package/dist/motion/collapsible/src/CollapsibleTrigger.vue.d.ts.map +1 -0
  1396. package/dist/motion/collapsible/src/api-types.d.ts +5 -0
  1397. package/dist/motion/collapsible/src/api-types.d.ts.map +1 -0
  1398. package/dist/motion/collapsible/src/context.d.ts +11 -0
  1399. package/dist/motion/collapsible/src/context.d.ts.map +1 -0
  1400. package/dist/motion/collapsible/src/public-types.d.ts +8 -0
  1401. package/dist/motion/collapsible/src/public-types.d.ts.map +1 -0
  1402. package/dist/motion/collapsible/src/useCollapsible.d.ts +3 -0
  1403. package/dist/motion/collapsible/src/useCollapsible.d.ts.map +1 -0
  1404. package/dist/motion/collapsible.d.ts +1 -0
  1405. package/dist/motion/collapsible.js +1 -0
  1406. package/dist/motion/color-picker/index.d.ts +16 -0
  1407. package/dist/motion/color-picker/index.d.ts.map +1 -0
  1408. package/dist/motion/color-picker/src/ChannelSlider.vue.d.ts +16 -0
  1409. package/dist/motion/color-picker/src/ChannelSlider.vue.d.ts.map +1 -0
  1410. package/dist/motion/color-picker/src/ColorPicker.vue.d.ts +54 -0
  1411. package/dist/motion/color-picker/src/ColorPicker.vue.d.ts.map +1 -0
  1412. package/dist/motion/color-picker/src/ColorPickerAlpha.vue.d.ts +9 -0
  1413. package/dist/motion/color-picker/src/ColorPickerAlpha.vue.d.ts.map +1 -0
  1414. package/dist/motion/color-picker/src/ColorPickerArea.vue.d.ts +9 -0
  1415. package/dist/motion/color-picker/src/ColorPickerArea.vue.d.ts.map +1 -0
  1416. package/dist/motion/color-picker/src/ColorPickerChannels.vue.d.ts +9 -0
  1417. package/dist/motion/color-picker/src/ColorPickerChannels.vue.d.ts.map +1 -0
  1418. package/dist/motion/color-picker/src/ColorPickerContent.vue.d.ts +19 -0
  1419. package/dist/motion/color-picker/src/ColorPickerContent.vue.d.ts.map +1 -0
  1420. package/dist/motion/color-picker/src/ColorPickerEyeDropper.vue.d.ts +14 -0
  1421. package/dist/motion/color-picker/src/ColorPickerEyeDropper.vue.d.ts.map +1 -0
  1422. package/dist/motion/color-picker/src/ColorPickerHexInput.vue.d.ts +4 -0
  1423. package/dist/motion/color-picker/src/ColorPickerHexInput.vue.d.ts.map +1 -0
  1424. package/dist/motion/color-picker/src/ColorPickerHue.vue.d.ts +9 -0
  1425. package/dist/motion/color-picker/src/ColorPickerHue.vue.d.ts.map +1 -0
  1426. package/dist/motion/color-picker/src/ColorPickerPreset.vue.d.ts +8 -0
  1427. package/dist/motion/color-picker/src/ColorPickerPreset.vue.d.ts.map +1 -0
  1428. package/dist/motion/color-picker/src/ColorPickerPresets.vue.d.ts +14 -0
  1429. package/dist/motion/color-picker/src/ColorPickerPresets.vue.d.ts.map +1 -0
  1430. package/dist/motion/color-picker/src/ColorPickerSwatch.vue.d.ts +4 -0
  1431. package/dist/motion/color-picker/src/ColorPickerSwatch.vue.d.ts.map +1 -0
  1432. package/dist/motion/color-picker/src/ColorPickerTrigger.vue.d.ts +14 -0
  1433. package/dist/motion/color-picker/src/ColorPickerTrigger.vue.d.ts.map +1 -0
  1434. package/dist/motion/color-picker/src/ColorThumb.vue.d.ts +13 -0
  1435. package/dist/motion/color-picker/src/ColorThumb.vue.d.ts.map +1 -0
  1436. package/dist/motion/color-picker/src/api-types.d.ts +13 -0
  1437. package/dist/motion/color-picker/src/api-types.d.ts.map +1 -0
  1438. package/dist/motion/color-picker/src/color.d.ts +26 -0
  1439. package/dist/motion/color-picker/src/color.d.ts.map +1 -0
  1440. package/dist/motion/color-picker/src/context.d.ts +39 -0
  1441. package/dist/motion/color-picker/src/context.d.ts.map +1 -0
  1442. package/dist/motion/color-picker/src/preset-motion.d.ts +8 -0
  1443. package/dist/motion/color-picker/src/preset-motion.d.ts.map +1 -0
  1444. package/dist/motion/color-picker/src/useColorPicker.d.ts +3 -0
  1445. package/dist/motion/color-picker/src/useColorPicker.d.ts.map +1 -0
  1446. package/dist/motion/color-picker.d.ts +1 -0
  1447. package/dist/motion/color-picker.js +1 -0
  1448. package/dist/motion/color-selector/index.d.ts +6 -0
  1449. package/dist/motion/color-selector/index.d.ts.map +1 -0
  1450. package/dist/motion/color-selector/src/ColorSelector.vue.d.ts +30 -0
  1451. package/dist/motion/color-selector/src/ColorSelector.vue.d.ts.map +1 -0
  1452. package/dist/motion/color-selector/src/ColorSelectorItem.vue.d.ts +10 -0
  1453. package/dist/motion/color-selector/src/ColorSelectorItem.vue.d.ts.map +1 -0
  1454. package/dist/motion/color-selector/src/ColorSelectorLabel.vue.d.ts +13 -0
  1455. package/dist/motion/color-selector/src/ColorSelectorLabel.vue.d.ts.map +1 -0
  1456. package/dist/motion/color-selector/src/ColorSelectorList.vue.d.ts +13 -0
  1457. package/dist/motion/color-selector/src/ColorSelectorList.vue.d.ts.map +1 -0
  1458. package/dist/motion/color-selector/src/api-types.d.ts +5 -0
  1459. package/dist/motion/color-selector/src/api-types.d.ts.map +1 -0
  1460. package/dist/motion/color-selector/src/context.d.ts +16 -0
  1461. package/dist/motion/color-selector/src/context.d.ts.map +1 -0
  1462. package/dist/motion/color-selector.d.ts +1 -0
  1463. package/dist/motion/color-selector.js +1 -0
  1464. package/dist/motion/combobox/index.d.ts +14 -0
  1465. package/dist/motion/combobox/index.d.ts.map +1 -0
  1466. package/dist/motion/combobox/src/Combobox.vue.d.ts +42 -0
  1467. package/dist/motion/combobox/src/Combobox.vue.d.ts.map +1 -0
  1468. package/dist/motion/combobox/src/ComboboxContent.vue.d.ts +25 -0
  1469. package/dist/motion/combobox/src/ComboboxContent.vue.d.ts.map +1 -0
  1470. package/dist/motion/combobox/src/ComboboxEmpty.vue.d.ts +14 -0
  1471. package/dist/motion/combobox/src/ComboboxEmpty.vue.d.ts.map +1 -0
  1472. package/dist/motion/combobox/src/ComboboxGroup.vue.d.ts +14 -0
  1473. package/dist/motion/combobox/src/ComboboxGroup.vue.d.ts.map +1 -0
  1474. package/dist/motion/combobox/src/ComboboxInput.vue.d.ts +12 -0
  1475. package/dist/motion/combobox/src/ComboboxInput.vue.d.ts.map +1 -0
  1476. package/dist/motion/combobox/src/ComboboxItem.vue.d.ts +27 -0
  1477. package/dist/motion/combobox/src/ComboboxItem.vue.d.ts.map +1 -0
  1478. package/dist/motion/combobox/src/ComboboxLabel.vue.d.ts +16 -0
  1479. package/dist/motion/combobox/src/ComboboxLabel.vue.d.ts.map +1 -0
  1480. package/dist/motion/combobox/src/ComboboxList.vue.d.ts +19 -0
  1481. package/dist/motion/combobox/src/ComboboxList.vue.d.ts.map +1 -0
  1482. package/dist/motion/combobox/src/ComboboxSeparator.vue.d.ts +4 -0
  1483. package/dist/motion/combobox/src/ComboboxSeparator.vue.d.ts.map +1 -0
  1484. package/dist/motion/combobox/src/ComboboxTrigger.vue.d.ts +14 -0
  1485. package/dist/motion/combobox/src/ComboboxTrigger.vue.d.ts.map +1 -0
  1486. package/dist/motion/combobox/src/ComboboxValue.vue.d.ts +21 -0
  1487. package/dist/motion/combobox/src/ComboboxValue.vue.d.ts.map +1 -0
  1488. package/dist/motion/combobox/src/SearchOption.vue.d.ts +28 -0
  1489. package/dist/motion/combobox/src/SearchOption.vue.d.ts.map +1 -0
  1490. package/dist/motion/combobox/src/api-types.d.ts +12 -0
  1491. package/dist/motion/combobox/src/api-types.d.ts.map +1 -0
  1492. package/dist/motion/combobox/src/public-types.d.ts +3 -0
  1493. package/dist/motion/combobox/src/public-types.d.ts.map +1 -0
  1494. package/dist/motion/combobox.d.ts +1 -0
  1495. package/dist/motion/combobox.js +1 -0
  1496. package/dist/motion/context-menu/index.d.ts +12 -0
  1497. package/dist/motion/context-menu/index.d.ts.map +1 -0
  1498. package/dist/motion/context-menu/src/ContextMenu.vue.d.ts +24 -0
  1499. package/dist/motion/context-menu/src/ContextMenu.vue.d.ts.map +1 -0
  1500. package/dist/motion/context-menu/src/ContextMenuCheckboxItem.vue.d.ts +34 -0
  1501. package/dist/motion/context-menu/src/ContextMenuCheckboxItem.vue.d.ts.map +1 -0
  1502. package/dist/motion/context-menu/src/ContextMenuContent.vue.d.ts +18 -0
  1503. package/dist/motion/context-menu/src/ContextMenuContent.vue.d.ts.map +1 -0
  1504. package/dist/motion/context-menu/src/ContextMenuItem.vue.d.ts +26 -0
  1505. package/dist/motion/context-menu/src/ContextMenuItem.vue.d.ts.map +1 -0
  1506. package/dist/motion/context-menu/src/ContextMenuItemBase.vue.d.ts +30 -0
  1507. package/dist/motion/context-menu/src/ContextMenuItemBase.vue.d.ts.map +1 -0
  1508. package/dist/motion/context-menu/src/ContextMenuLabel.vue.d.ts +16 -0
  1509. package/dist/motion/context-menu/src/ContextMenuLabel.vue.d.ts.map +1 -0
  1510. package/dist/motion/context-menu/src/ContextMenuRadioGroup.vue.d.ts +25 -0
  1511. package/dist/motion/context-menu/src/ContextMenuRadioGroup.vue.d.ts.map +1 -0
  1512. package/dist/motion/context-menu/src/ContextMenuRadioItem.vue.d.ts +23 -0
  1513. package/dist/motion/context-menu/src/ContextMenuRadioItem.vue.d.ts.map +1 -0
  1514. package/dist/motion/context-menu/src/ContextMenuSeparator.vue.d.ts +4 -0
  1515. package/dist/motion/context-menu/src/ContextMenuSeparator.vue.d.ts.map +1 -0
  1516. package/dist/motion/context-menu/src/ContextMenuShortcut.vue.d.ts +13 -0
  1517. package/dist/motion/context-menu/src/ContextMenuShortcut.vue.d.ts.map +1 -0
  1518. package/dist/motion/context-menu/src/ContextMenuTrigger.vue.d.ts +16 -0
  1519. package/dist/motion/context-menu/src/ContextMenuTrigger.vue.d.ts.map +1 -0
  1520. package/dist/motion/context-menu/src/api-types.d.ts +11 -0
  1521. package/dist/motion/context-menu/src/api-types.d.ts.map +1 -0
  1522. package/dist/motion/context-menu/src/menu-state.d.ts +60 -0
  1523. package/dist/motion/context-menu/src/menu-state.d.ts.map +1 -0
  1524. package/dist/motion/context-menu/src/menu-surface.d.ts +19 -0
  1525. package/dist/motion/context-menu/src/menu-surface.d.ts.map +1 -0
  1526. package/dist/motion/context-menu/src/menu-trigger.d.ts +10 -0
  1527. package/dist/motion/context-menu/src/menu-trigger.d.ts.map +1 -0
  1528. package/dist/motion/context-menu.d.ts +1 -0
  1529. package/dist/motion/context-menu.js +1 -0
  1530. package/dist/motion/cylinder-carousel/index.d.ts +3 -0
  1531. package/dist/motion/cylinder-carousel/index.d.ts.map +1 -0
  1532. package/dist/motion/cylinder-carousel/src/CylinderCarousel.vue.d.ts +31 -0
  1533. package/dist/motion/cylinder-carousel/src/CylinderCarousel.vue.d.ts.map +1 -0
  1534. package/dist/motion/cylinder-carousel/src/api-types.d.ts +2 -0
  1535. package/dist/motion/cylinder-carousel/src/api-types.d.ts.map +1 -0
  1536. package/dist/motion/cylinder-carousel/src/projection.d.ts +16 -0
  1537. package/dist/motion/cylinder-carousel/src/projection.d.ts.map +1 -0
  1538. package/dist/motion/cylinder-carousel.d.ts +1 -0
  1539. package/dist/motion/cylinder-carousel.js +1 -0
  1540. package/dist/motion/date-range-picker/index.d.ts +17 -0
  1541. package/dist/motion/date-range-picker/index.d.ts.map +1 -0
  1542. package/dist/motion/date-range-picker/src/CalendarChoices.vue.d.ts +22 -0
  1543. package/dist/motion/date-range-picker/src/CalendarChoices.vue.d.ts.map +1 -0
  1544. package/dist/motion/date-range-picker/src/CalendarPresence.vue.d.ts +14 -0
  1545. package/dist/motion/date-range-picker/src/CalendarPresence.vue.d.ts.map +1 -0
  1546. package/dist/motion/date-range-picker/src/DateRangePicker.vue.d.ts +39 -0
  1547. package/dist/motion/date-range-picker/src/DateRangePicker.vue.d.ts.map +1 -0
  1548. package/dist/motion/date-range-picker/src/DateRangePickerCalendar.vue.d.ts +19 -0
  1549. package/dist/motion/date-range-picker/src/DateRangePickerCalendar.vue.d.ts.map +1 -0
  1550. package/dist/motion/date-range-picker/src/DateRangePickerClear.vue.d.ts +17 -0
  1551. package/dist/motion/date-range-picker/src/DateRangePickerClear.vue.d.ts.map +1 -0
  1552. package/dist/motion/date-range-picker/src/DateRangePickerContent.vue.d.ts +20 -0
  1553. package/dist/motion/date-range-picker/src/DateRangePickerContent.vue.d.ts.map +1 -0
  1554. package/dist/motion/date-range-picker/src/DateRangePickerDropdown.vue.d.ts +26 -0
  1555. package/dist/motion/date-range-picker/src/DateRangePickerDropdown.vue.d.ts.map +1 -0
  1556. package/dist/motion/date-range-picker/src/DateRangePickerFooter.vue.d.ts +13 -0
  1557. package/dist/motion/date-range-picker/src/DateRangePickerFooter.vue.d.ts.map +1 -0
  1558. package/dist/motion/date-range-picker/src/DateRangePickerGrid.vue.d.ts +4 -0
  1559. package/dist/motion/date-range-picker/src/DateRangePickerGrid.vue.d.ts.map +1 -0
  1560. package/dist/motion/date-range-picker/src/DateRangePickerHeader.vue.d.ts +4 -0
  1561. package/dist/motion/date-range-picker/src/DateRangePickerHeader.vue.d.ts.map +1 -0
  1562. package/dist/motion/date-range-picker/src/DateRangePickerPreset.vue.d.ts +20 -0
  1563. package/dist/motion/date-range-picker/src/DateRangePickerPreset.vue.d.ts.map +1 -0
  1564. package/dist/motion/date-range-picker/src/DateRangePickerPresets.vue.d.ts +14 -0
  1565. package/dist/motion/date-range-picker/src/DateRangePickerPresets.vue.d.ts.map +1 -0
  1566. package/dist/motion/date-range-picker/src/DateRangePickerSelection.vue.d.ts +16 -0
  1567. package/dist/motion/date-range-picker/src/DateRangePickerSelection.vue.d.ts.map +1 -0
  1568. package/dist/motion/date-range-picker/src/DateRangePickerSummary.vue.d.ts +4 -0
  1569. package/dist/motion/date-range-picker/src/DateRangePickerSummary.vue.d.ts.map +1 -0
  1570. package/dist/motion/date-range-picker/src/DateRangePickerTrigger.vue.d.ts +20 -0
  1571. package/dist/motion/date-range-picker/src/DateRangePickerTrigger.vue.d.ts.map +1 -0
  1572. package/dist/motion/date-range-picker/src/api-types.d.ts +14 -0
  1573. package/dist/motion/date-range-picker/src/api-types.d.ts.map +1 -0
  1574. package/dist/motion/date-range-picker/src/controller.d.ts +78 -0
  1575. package/dist/motion/date-range-picker/src/controller.d.ts.map +1 -0
  1576. package/dist/motion/date-range-picker/src/date-utils.d.ts +8 -0
  1577. package/dist/motion/date-range-picker/src/date-utils.d.ts.map +1 -0
  1578. package/dist/motion/date-range-picker/src/types.d.ts +9 -0
  1579. package/dist/motion/date-range-picker/src/types.d.ts.map +1 -0
  1580. package/dist/motion/date-range-picker/src/useDateRangePicker.d.ts +62 -0
  1581. package/dist/motion/date-range-picker/src/useDateRangePicker.d.ts.map +1 -0
  1582. package/dist/motion/date-range-picker.d.ts +1 -0
  1583. package/dist/motion/date-range-picker.js +1 -0
  1584. package/dist/motion/dock/index.d.ts +5 -0
  1585. package/dist/motion/dock/index.d.ts.map +1 -0
  1586. package/dist/motion/dock/src/Dock.vue.d.ts +19 -0
  1587. package/dist/motion/dock/src/Dock.vue.d.ts.map +1 -0
  1588. package/dist/motion/dock/src/DockItem.vue.d.ts +23 -0
  1589. package/dist/motion/dock/src/DockItem.vue.d.ts.map +1 -0
  1590. package/dist/motion/dock/src/DockSeparator.vue.d.ts +14 -0
  1591. package/dist/motion/dock/src/DockSeparator.vue.d.ts.map +1 -0
  1592. package/dist/motion/dock/src/api-types.d.ts +3 -0
  1593. package/dist/motion/dock/src/api-types.d.ts.map +1 -0
  1594. package/dist/motion/dock/src/context.d.ts +6 -0
  1595. package/dist/motion/dock/src/context.d.ts.map +1 -0
  1596. package/dist/motion/dock.d.ts +1 -0
  1597. package/dist/motion/dock.js +1 -0
  1598. package/dist/motion/drawer/index.d.ts +3 -0
  1599. package/dist/motion/drawer/index.d.ts.map +1 -0
  1600. package/dist/motion/drawer/src/Drawer.vue.d.ts +28 -0
  1601. package/dist/motion/drawer/src/Drawer.vue.d.ts.map +1 -0
  1602. package/dist/motion/drawer/src/api-types.d.ts +2 -0
  1603. package/dist/motion/drawer/src/api-types.d.ts.map +1 -0
  1604. package/dist/motion/drawer.d.ts +1 -0
  1605. package/dist/motion/drawer.js +1 -0
  1606. package/dist/motion/expandable-control/index.d.ts +4 -0
  1607. package/dist/motion/expandable-control/index.d.ts.map +1 -0
  1608. package/dist/motion/expandable-control/src/ExpandableButton.vue.d.ts +33 -0
  1609. package/dist/motion/expandable-control/src/ExpandableButton.vue.d.ts.map +1 -0
  1610. package/dist/motion/expandable-control/src/ExpandableChip.vue.d.ts +36 -0
  1611. package/dist/motion/expandable-control/src/ExpandableChip.vue.d.ts.map +1 -0
  1612. package/dist/motion/expandable-control/src/api-types.d.ts +3 -0
  1613. package/dist/motion/expandable-control/src/api-types.d.ts.map +1 -0
  1614. package/dist/motion/expandable-control/src/transition.d.ts +7 -0
  1615. package/dist/motion/expandable-control/src/transition.d.ts.map +1 -0
  1616. package/dist/motion/expandable-control.d.ts +1 -0
  1617. package/dist/motion/expandable-control.js +1 -0
  1618. package/dist/motion/expanding-arrow-button/index.d.ts +5 -0
  1619. package/dist/motion/expanding-arrow-button/index.d.ts.map +1 -0
  1620. package/dist/motion/expanding-arrow-button/src/DottedChevron.vue.d.ts +4 -0
  1621. package/dist/motion/expanding-arrow-button/src/DottedChevron.vue.d.ts.map +1 -0
  1622. package/dist/motion/expanding-arrow-button/src/ExpandingArrowButton.vue.d.ts +19 -0
  1623. package/dist/motion/expanding-arrow-button/src/ExpandingArrowButton.vue.d.ts.map +1 -0
  1624. package/dist/motion/expanding-arrow-button/src/HoldActionButton.vue.d.ts +51 -0
  1625. package/dist/motion/expanding-arrow-button/src/HoldActionButton.vue.d.ts.map +1 -0
  1626. package/dist/motion/expanding-arrow-button/src/SlideActionButton.vue.d.ts +40 -0
  1627. package/dist/motion/expanding-arrow-button/src/SlideActionButton.vue.d.ts.map +1 -0
  1628. package/dist/motion/expanding-arrow-button/src/api-types.d.ts +4 -0
  1629. package/dist/motion/expanding-arrow-button/src/api-types.d.ts.map +1 -0
  1630. package/dist/motion/expanding-arrow-button.d.ts +1 -0
  1631. package/dist/motion/expanding-arrow-button.js +1 -0
  1632. package/dist/motion/file-tree/index.d.ts +6 -0
  1633. package/dist/motion/file-tree/index.d.ts.map +1 -0
  1634. package/dist/motion/file-tree/src/FileTree.vue.d.ts +34 -0
  1635. package/dist/motion/file-tree/src/FileTree.vue.d.ts.map +1 -0
  1636. package/dist/motion/file-tree/src/FileTreeFile.vue.d.ts +10 -0
  1637. package/dist/motion/file-tree/src/FileTreeFile.vue.d.ts.map +1 -0
  1638. package/dist/motion/file-tree/src/FileTreeFolder.vue.d.ts +10 -0
  1639. package/dist/motion/file-tree/src/FileTreeFolder.vue.d.ts.map +1 -0
  1640. package/dist/motion/file-tree/src/api-types.d.ts +4 -0
  1641. package/dist/motion/file-tree/src/api-types.d.ts.map +1 -0
  1642. package/dist/motion/file-tree/src/tree-model.d.ts +20 -0
  1643. package/dist/motion/file-tree/src/tree-model.d.ts.map +1 -0
  1644. package/dist/motion/file-tree.d.ts +1 -0
  1645. package/dist/motion/file-tree.js +1 -0
  1646. package/dist/motion/image-viewer/index.d.ts +14 -0
  1647. package/dist/motion/image-viewer/index.d.ts.map +1 -0
  1648. package/dist/motion/image-viewer/src/ImageViewer.vue.d.ts +40 -0
  1649. package/dist/motion/image-viewer/src/ImageViewer.vue.d.ts.map +1 -0
  1650. package/dist/motion/image-viewer/src/ImageViewerCaption.vue.d.ts +16 -0
  1651. package/dist/motion/image-viewer/src/ImageViewerCaption.vue.d.ts.map +1 -0
  1652. package/dist/motion/image-viewer/src/ImageViewerClose.vue.d.ts +21 -0
  1653. package/dist/motion/image-viewer/src/ImageViewerClose.vue.d.ts.map +1 -0
  1654. package/dist/motion/image-viewer/src/ImageViewerContent.vue.d.ts +16 -0
  1655. package/dist/motion/image-viewer/src/ImageViewerContent.vue.d.ts.map +1 -0
  1656. package/dist/motion/image-viewer/src/ImageViewerCounter.vue.d.ts +4 -0
  1657. package/dist/motion/image-viewer/src/ImageViewerCounter.vue.d.ts.map +1 -0
  1658. package/dist/motion/image-viewer/src/ImageViewerFrame.vue.d.ts +10 -0
  1659. package/dist/motion/image-viewer/src/ImageViewerFrame.vue.d.ts.map +1 -0
  1660. package/dist/motion/image-viewer/src/ImageViewerGallery.vue.d.ts +14 -0
  1661. package/dist/motion/image-viewer/src/ImageViewerGallery.vue.d.ts.map +1 -0
  1662. package/dist/motion/image-viewer/src/ImageViewerNext.vue.d.ts +21 -0
  1663. package/dist/motion/image-viewer/src/ImageViewerNext.vue.d.ts.map +1 -0
  1664. package/dist/motion/image-viewer/src/ImageViewerPrevious.vue.d.ts +21 -0
  1665. package/dist/motion/image-viewer/src/ImageViewerPrevious.vue.d.ts.map +1 -0
  1666. package/dist/motion/image-viewer/src/ImageViewerSlide.vue.d.ts +24 -0
  1667. package/dist/motion/image-viewer/src/ImageViewerSlide.vue.d.ts.map +1 -0
  1668. package/dist/motion/image-viewer/src/ImageViewerSurface.vue.d.ts +22 -0
  1669. package/dist/motion/image-viewer/src/ImageViewerSurface.vue.d.ts.map +1 -0
  1670. package/dist/motion/image-viewer/src/ImageViewerThumbnail.vue.d.ts +25 -0
  1671. package/dist/motion/image-viewer/src/ImageViewerThumbnail.vue.d.ts.map +1 -0
  1672. package/dist/motion/image-viewer/src/api-types.d.ts +5 -0
  1673. package/dist/motion/image-viewer/src/api-types.d.ts.map +1 -0
  1674. package/dist/motion/image-viewer/src/context.d.ts +19 -0
  1675. package/dist/motion/image-viewer/src/context.d.ts.map +1 -0
  1676. package/dist/motion/image-viewer/src/geometry.d.ts +13 -0
  1677. package/dist/motion/image-viewer/src/geometry.d.ts.map +1 -0
  1678. package/dist/motion/image-viewer/src/opening-motion.d.ts +10 -0
  1679. package/dist/motion/image-viewer/src/opening-motion.d.ts.map +1 -0
  1680. package/dist/motion/image-viewer/src/types.d.ts +10 -0
  1681. package/dist/motion/image-viewer/src/types.d.ts.map +1 -0
  1682. package/dist/motion/image-viewer/src/useImageViewer.d.ts +13 -0
  1683. package/dist/motion/image-viewer/src/useImageViewer.d.ts.map +1 -0
  1684. package/dist/motion/image-viewer/src/viewer-state.d.ts +17 -0
  1685. package/dist/motion/image-viewer/src/viewer-state.d.ts.map +1 -0
  1686. package/dist/motion/image-viewer.d.ts +1 -0
  1687. package/dist/motion/image-viewer.js +1 -0
  1688. package/dist/motion/index.d.ts +55 -0
  1689. package/dist/motion/index.d.ts.map +1 -0
  1690. package/dist/motion/input/index.d.ts +4 -0
  1691. package/dist/motion/input/index.d.ts.map +1 -0
  1692. package/dist/motion/input/src/Input.vue.d.ts +46 -0
  1693. package/dist/motion/input/src/Input.vue.d.ts.map +1 -0
  1694. package/dist/motion/input/src/api-types.d.ts +2 -0
  1695. package/dist/motion/input/src/api-types.d.ts.map +1 -0
  1696. package/dist/motion/input/src/public-types.d.ts +2 -0
  1697. package/dist/motion/input/src/public-types.d.ts.map +1 -0
  1698. package/dist/motion/input.d.ts +1 -0
  1699. package/dist/motion/input.js +1 -0
  1700. package/dist/motion/loader/index.d.ts +4 -0
  1701. package/dist/motion/loader/index.d.ts.map +1 -0
  1702. package/dist/motion/loader/src/Loader.vue.d.ts +16 -0
  1703. package/dist/motion/loader/src/Loader.vue.d.ts.map +1 -0
  1704. package/dist/motion/loader/src/LoaderSvg.vue.d.ts +19 -0
  1705. package/dist/motion/loader/src/LoaderSvg.vue.d.ts.map +1 -0
  1706. package/dist/motion/loader/src/api-types.d.ts +2 -0
  1707. package/dist/motion/loader/src/api-types.d.ts.map +1 -0
  1708. package/dist/motion/loader/src/clock.d.ts +11 -0
  1709. package/dist/motion/loader/src/clock.d.ts.map +1 -0
  1710. package/dist/motion/loader/src/model.d.ts +7 -0
  1711. package/dist/motion/loader/src/model.d.ts.map +1 -0
  1712. package/dist/motion/loader/src/visuals.d.ts +15 -0
  1713. package/dist/motion/loader/src/visuals.d.ts.map +1 -0
  1714. package/dist/motion/loader.d.ts +1 -0
  1715. package/dist/motion/loader.js +1 -0
  1716. package/dist/motion/marquee/index.d.ts +3 -0
  1717. package/dist/motion/marquee/index.d.ts.map +1 -0
  1718. package/dist/motion/marquee/src/Marquee.vue.d.ts +17 -0
  1719. package/dist/motion/marquee/src/Marquee.vue.d.ts.map +1 -0
  1720. package/dist/motion/marquee/src/api-types.d.ts +2 -0
  1721. package/dist/motion/marquee/src/api-types.d.ts.map +1 -0
  1722. package/dist/motion/marquee.d.ts +1 -0
  1723. package/dist/motion/marquee.js +1 -0
  1724. package/dist/motion/morphing-modal/index.d.ts +3 -0
  1725. package/dist/motion/morphing-modal/index.d.ts.map +1 -0
  1726. package/dist/motion/morphing-modal/src/MorphingModal.vue.d.ts +27 -0
  1727. package/dist/motion/morphing-modal/src/MorphingModal.vue.d.ts.map +1 -0
  1728. package/dist/motion/morphing-modal/src/api-types.d.ts +2 -0
  1729. package/dist/motion/morphing-modal/src/api-types.d.ts.map +1 -0
  1730. package/dist/motion/morphing-modal.d.ts +1 -0
  1731. package/dist/motion/morphing-modal.js +1 -0
  1732. package/dist/motion/multi-select/index.d.ts +15 -0
  1733. package/dist/motion/multi-select/index.d.ts.map +1 -0
  1734. package/dist/motion/multi-select/src/MultiSelect.vue.d.ts +42 -0
  1735. package/dist/motion/multi-select/src/MultiSelect.vue.d.ts.map +1 -0
  1736. package/dist/motion/multi-select/src/MultiSelectContent.vue.d.ts +25 -0
  1737. package/dist/motion/multi-select/src/MultiSelectContent.vue.d.ts.map +1 -0
  1738. package/dist/motion/multi-select/src/MultiSelectEmpty.vue.d.ts +14 -0
  1739. package/dist/motion/multi-select/src/MultiSelectEmpty.vue.d.ts.map +1 -0
  1740. package/dist/motion/multi-select/src/MultiSelectGroup.vue.d.ts +14 -0
  1741. package/dist/motion/multi-select/src/MultiSelectGroup.vue.d.ts.map +1 -0
  1742. package/dist/motion/multi-select/src/MultiSelectInput.vue.d.ts +12 -0
  1743. package/dist/motion/multi-select/src/MultiSelectInput.vue.d.ts.map +1 -0
  1744. package/dist/motion/multi-select/src/MultiSelectItem.vue.d.ts +27 -0
  1745. package/dist/motion/multi-select/src/MultiSelectItem.vue.d.ts.map +1 -0
  1746. package/dist/motion/multi-select/src/MultiSelectLabel.vue.d.ts +16 -0
  1747. package/dist/motion/multi-select/src/MultiSelectLabel.vue.d.ts.map +1 -0
  1748. package/dist/motion/multi-select/src/MultiSelectList.vue.d.ts +19 -0
  1749. package/dist/motion/multi-select/src/MultiSelectList.vue.d.ts.map +1 -0
  1750. package/dist/motion/multi-select/src/MultiSelectSeparator.vue.d.ts +4 -0
  1751. package/dist/motion/multi-select/src/MultiSelectSeparator.vue.d.ts.map +1 -0
  1752. package/dist/motion/multi-select/src/MultiSelectTrigger.vue.d.ts +14 -0
  1753. package/dist/motion/multi-select/src/MultiSelectTrigger.vue.d.ts.map +1 -0
  1754. package/dist/motion/multi-select/src/MultiSelectValue.vue.d.ts +23 -0
  1755. package/dist/motion/multi-select/src/MultiSelectValue.vue.d.ts.map +1 -0
  1756. package/dist/motion/multi-select/src/api-types.d.ts +12 -0
  1757. package/dist/motion/multi-select/src/api-types.d.ts.map +1 -0
  1758. package/dist/motion/multi-select/src/public-types.d.ts +4 -0
  1759. package/dist/motion/multi-select/src/public-types.d.ts.map +1 -0
  1760. package/dist/motion/multi-select.d.ts +1 -0
  1761. package/dist/motion/multi-select.js +3 -0
  1762. package/dist/motion/number/index.d.ts +5 -0
  1763. package/dist/motion/number/index.d.ts.map +1 -0
  1764. package/dist/motion/number/src/AnimatedNumber.vue.d.ts +8 -0
  1765. package/dist/motion/number/src/AnimatedNumber.vue.d.ts.map +1 -0
  1766. package/dist/motion/number/src/DigitSwap.vue.d.ts +10 -0
  1767. package/dist/motion/number/src/DigitSwap.vue.d.ts.map +1 -0
  1768. package/dist/motion/number/src/NumberTicker.vue.d.ts +11 -0
  1769. package/dist/motion/number/src/NumberTicker.vue.d.ts.map +1 -0
  1770. package/dist/motion/number/src/NumberTickerDigit.vue.d.ts +11 -0
  1771. package/dist/motion/number/src/NumberTickerDigit.vue.d.ts.map +1 -0
  1772. package/dist/motion/number/src/types.d.ts +40 -0
  1773. package/dist/motion/number/src/types.d.ts.map +1 -0
  1774. package/dist/motion/number/src/view-gate.d.ts +4 -0
  1775. package/dist/motion/number/src/view-gate.d.ts.map +1 -0
  1776. package/dist/motion/number.d.ts +1 -0
  1777. package/dist/motion/number.js +1 -0
  1778. package/dist/motion/popover/index.d.ts +8 -0
  1779. package/dist/motion/popover/index.d.ts.map +1 -0
  1780. package/dist/motion/popover/src/MorphPopover.vue.d.ts +29 -0
  1781. package/dist/motion/popover/src/MorphPopover.vue.d.ts.map +1 -0
  1782. package/dist/motion/popover/src/MorphPopoverContent.vue.d.ts +31 -0
  1783. package/dist/motion/popover/src/MorphPopoverContent.vue.d.ts.map +1 -0
  1784. package/dist/motion/popover/src/MorphPopoverTrigger.vue.d.ts +6 -0
  1785. package/dist/motion/popover/src/MorphPopoverTrigger.vue.d.ts.map +1 -0
  1786. package/dist/motion/popover/src/Popover.vue.d.ts +32 -0
  1787. package/dist/motion/popover/src/Popover.vue.d.ts.map +1 -0
  1788. package/dist/motion/popover/src/PopoverContent.vue.d.ts +17 -0
  1789. package/dist/motion/popover/src/PopoverContent.vue.d.ts.map +1 -0
  1790. package/dist/motion/popover/src/PopoverTrigger.vue.d.ts +7 -0
  1791. package/dist/motion/popover/src/PopoverTrigger.vue.d.ts.map +1 -0
  1792. package/dist/motion/popover/src/api-types.d.ts +7 -0
  1793. package/dist/motion/popover/src/api-types.d.ts.map +1 -0
  1794. package/dist/motion/popover/src/context.d.ts +109 -0
  1795. package/dist/motion/popover/src/context.d.ts.map +1 -0
  1796. package/dist/motion/popover/src/geometry.d.ts +27 -0
  1797. package/dist/motion/popover/src/geometry.d.ts.map +1 -0
  1798. package/dist/motion/popover/src/morph-focus.d.ts +11 -0
  1799. package/dist/motion/popover/src/morph-focus.d.ts.map +1 -0
  1800. package/dist/motion/popover.d.ts +1 -0
  1801. package/dist/motion/popover.js +1 -0
  1802. package/dist/motion/preview-rail/index.d.ts +4 -0
  1803. package/dist/motion/preview-rail/index.d.ts.map +1 -0
  1804. package/dist/motion/preview-rail/src/PreviewRail.vue.d.ts +50 -0
  1805. package/dist/motion/preview-rail/src/PreviewRail.vue.d.ts.map +1 -0
  1806. package/dist/motion/preview-rail/src/api-types.d.ts +2 -0
  1807. package/dist/motion/preview-rail/src/api-types.d.ts.map +1 -0
  1808. package/dist/motion/preview-rail/src/public-types.d.ts +3 -0
  1809. package/dist/motion/preview-rail/src/public-types.d.ts.map +1 -0
  1810. package/dist/motion/preview-rail/src/rail-state.d.ts +31 -0
  1811. package/dist/motion/preview-rail/src/rail-state.d.ts.map +1 -0
  1812. package/dist/motion/preview-rail.d.ts +1 -0
  1813. package/dist/motion/preview-rail.js +1 -0
  1814. package/dist/motion/pull-to-refresh/index.d.ts +4 -0
  1815. package/dist/motion/pull-to-refresh/index.d.ts.map +1 -0
  1816. package/dist/motion/pull-to-refresh/src/PullToRefresh.vue.d.ts +65 -0
  1817. package/dist/motion/pull-to-refresh/src/PullToRefresh.vue.d.ts.map +1 -0
  1818. package/dist/motion/pull-to-refresh/src/RefreshBuddy.vue.d.ts +10 -0
  1819. package/dist/motion/pull-to-refresh/src/RefreshBuddy.vue.d.ts.map +1 -0
  1820. package/dist/motion/pull-to-refresh/src/api-types.d.ts +2 -0
  1821. package/dist/motion/pull-to-refresh/src/api-types.d.ts.map +1 -0
  1822. package/dist/motion/pull-to-refresh/src/public-types.d.ts +2 -0
  1823. package/dist/motion/pull-to-refresh/src/public-types.d.ts.map +1 -0
  1824. package/dist/motion/pull-to-refresh/src/pull-state.d.ts +24 -0
  1825. package/dist/motion/pull-to-refresh/src/pull-state.d.ts.map +1 -0
  1826. package/dist/motion/pull-to-refresh.d.ts +1 -0
  1827. package/dist/motion/pull-to-refresh.js +1 -0
  1828. package/dist/motion/radio/index.d.ts +4 -0
  1829. package/dist/motion/radio/index.d.ts.map +1 -0
  1830. package/dist/motion/radio/src/RadioGroup.vue.d.ts +29 -0
  1831. package/dist/motion/radio/src/RadioGroup.vue.d.ts.map +1 -0
  1832. package/dist/motion/radio/src/RadioGroupItem.vue.d.ts +11 -0
  1833. package/dist/motion/radio/src/RadioGroupItem.vue.d.ts.map +1 -0
  1834. package/dist/motion/radio/src/api-types.d.ts +3 -0
  1835. package/dist/motion/radio/src/api-types.d.ts.map +1 -0
  1836. package/dist/motion/radio/src/context.d.ts +11 -0
  1837. package/dist/motion/radio/src/context.d.ts.map +1 -0
  1838. package/dist/motion/radio.d.ts +1 -0
  1839. package/dist/motion/radio.js +1 -0
  1840. package/dist/motion/range-slider/index.d.ts +8 -0
  1841. package/dist/motion/range-slider/index.d.ts.map +1 -0
  1842. package/dist/motion/range-slider/src/BubbleSlider.vue.d.ts +16 -0
  1843. package/dist/motion/range-slider/src/BubbleSlider.vue.d.ts.map +1 -0
  1844. package/dist/motion/range-slider/src/FluidSlider.vue.d.ts +19 -0
  1845. package/dist/motion/range-slider/src/FluidSlider.vue.d.ts.map +1 -0
  1846. package/dist/motion/range-slider/src/InlineSlider.vue.d.ts +21 -0
  1847. package/dist/motion/range-slider/src/InlineSlider.vue.d.ts.map +1 -0
  1848. package/dist/motion/range-slider/src/RangeSlider.vue.d.ts +19 -0
  1849. package/dist/motion/range-slider/src/RangeSlider.vue.d.ts.map +1 -0
  1850. package/dist/motion/range-slider/src/RulerSlider.vue.d.ts +21 -0
  1851. package/dist/motion/range-slider/src/RulerSlider.vue.d.ts.map +1 -0
  1852. package/dist/motion/range-slider/src/WaveSlider.vue.d.ts +18 -0
  1853. package/dist/motion/range-slider/src/WaveSlider.vue.d.ts.map +1 -0
  1854. package/dist/motion/range-slider/src/api-types.d.ts +7 -0
  1855. package/dist/motion/range-slider/src/api-types.d.ts.map +1 -0
  1856. package/dist/motion/range-slider/src/inline-state.d.ts +47 -0
  1857. package/dist/motion/range-slider/src/inline-state.d.ts.map +1 -0
  1858. package/dist/motion/range-slider/src/useSlider.d.ts +43 -0
  1859. package/dist/motion/range-slider/src/useSlider.d.ts.map +1 -0
  1860. package/dist/motion/range-slider/src/visual-state.d.ts +8 -0
  1861. package/dist/motion/range-slider/src/visual-state.d.ts.map +1 -0
  1862. package/dist/motion/range-slider.d.ts +1 -0
  1863. package/dist/motion/range-slider.js +1 -0
  1864. package/dist/motion/scroll-animation/index.d.ts +9 -0
  1865. package/dist/motion/scroll-animation/index.d.ts.map +1 -0
  1866. package/dist/motion/scroll-animation/src/Parallax.vue.d.ts +25 -0
  1867. package/dist/motion/scroll-animation/src/Parallax.vue.d.ts.map +1 -0
  1868. package/dist/motion/scroll-animation/src/ScrollProgress.vue.d.ts +23 -0
  1869. package/dist/motion/scroll-animation/src/ScrollProgress.vue.d.ts.map +1 -0
  1870. package/dist/motion/scroll-animation/src/ScrollReveal.vue.d.ts +31 -0
  1871. package/dist/motion/scroll-animation/src/ScrollReveal.vue.d.ts.map +1 -0
  1872. package/dist/motion/scroll-animation/src/ScrollTo.vue.d.ts +22 -0
  1873. package/dist/motion/scroll-animation/src/ScrollTo.vue.d.ts.map +1 -0
  1874. package/dist/motion/scroll-animation/src/SmoothScroll.vue.d.ts +25 -0
  1875. package/dist/motion/scroll-animation/src/SmoothScroll.vue.d.ts.map +1 -0
  1876. package/dist/motion/scroll-animation/src/api-types.d.ts +6 -0
  1877. package/dist/motion/scroll-animation/src/api-types.d.ts.map +1 -0
  1878. package/dist/motion/scroll-animation/src/public-types.d.ts +4 -0
  1879. package/dist/motion/scroll-animation/src/public-types.d.ts.map +1 -0
  1880. package/dist/motion/scroll-animation/src/useSmoothScroll.d.ts +29 -0
  1881. package/dist/motion/scroll-animation/src/useSmoothScroll.d.ts.map +1 -0
  1882. package/dist/motion/scroll-animation.d.ts +1 -0
  1883. package/dist/motion/scroll-animation.js +1 -0
  1884. package/dist/motion/select/index.d.ts +12 -0
  1885. package/dist/motion/select/index.d.ts.map +1 -0
  1886. package/dist/motion/select/src/MorphSelect.vue.d.ts +32 -0
  1887. package/dist/motion/select/src/MorphSelect.vue.d.ts.map +1 -0
  1888. package/dist/motion/select/src/MorphSelectContent.vue.d.ts +19 -0
  1889. package/dist/motion/select/src/MorphSelectContent.vue.d.ts.map +1 -0
  1890. package/dist/motion/select/src/MorphSelectItem.vue.d.ts +20 -0
  1891. package/dist/motion/select/src/MorphSelectItem.vue.d.ts.map +1 -0
  1892. package/dist/motion/select/src/MorphSelectTrigger.vue.d.ts +19 -0
  1893. package/dist/motion/select/src/MorphSelectTrigger.vue.d.ts.map +1 -0
  1894. package/dist/motion/select/src/MorphSelectValue.vue.d.ts +8 -0
  1895. package/dist/motion/select/src/MorphSelectValue.vue.d.ts.map +1 -0
  1896. package/dist/motion/select/src/Select.vue.d.ts +32 -0
  1897. package/dist/motion/select/src/Select.vue.d.ts.map +1 -0
  1898. package/dist/motion/select/src/SelectContent.vue.d.ts +17 -0
  1899. package/dist/motion/select/src/SelectContent.vue.d.ts.map +1 -0
  1900. package/dist/motion/select/src/SelectItem.vue.d.ts +24 -0
  1901. package/dist/motion/select/src/SelectItem.vue.d.ts.map +1 -0
  1902. package/dist/motion/select/src/SelectRegistrar.vue.d.ts +13 -0
  1903. package/dist/motion/select/src/SelectRegistrar.vue.d.ts.map +1 -0
  1904. package/dist/motion/select/src/SelectTrigger.vue.d.ts +17 -0
  1905. package/dist/motion/select/src/SelectTrigger.vue.d.ts.map +1 -0
  1906. package/dist/motion/select/src/SelectValue.vue.d.ts +10 -0
  1907. package/dist/motion/select/src/SelectValue.vue.d.ts.map +1 -0
  1908. package/dist/motion/select/src/api-types.d.ts +11 -0
  1909. package/dist/motion/select/src/api-types.d.ts.map +1 -0
  1910. package/dist/motion/select/src/context.d.ts +130 -0
  1911. package/dist/motion/select/src/context.d.ts.map +1 -0
  1912. package/dist/motion/select/src/unfold.d.ts +7 -0
  1913. package/dist/motion/select/src/unfold.d.ts.map +1 -0
  1914. package/dist/motion/select.d.ts +1 -0
  1915. package/dist/motion/select.js +1 -0
  1916. package/dist/motion/shader-background/index.d.ts +5 -0
  1917. package/dist/motion/shader-background/index.d.ts.map +1 -0
  1918. package/dist/motion/shader-background/src/ShaderBackground.vue.d.ts +27 -0
  1919. package/dist/motion/shader-background/src/ShaderBackground.vue.d.ts.map +1 -0
  1920. package/dist/motion/shader-background/src/api-types.d.ts +37 -0
  1921. package/dist/motion/shader-background/src/api-types.d.ts.map +1 -0
  1922. package/dist/motion/shader-background/src/presets.d.ts +425 -0
  1923. package/dist/motion/shader-background/src/presets.d.ts.map +1 -0
  1924. package/dist/motion/shader-background/src/shader-session.d.ts +18 -0
  1925. package/dist/motion/shader-background/src/shader-session.d.ts.map +1 -0
  1926. package/dist/motion/shader-background.d.ts +1 -0
  1927. package/dist/motion/shader-background.js +1 -0
  1928. package/dist/motion/shared-layout-bg/index.d.ts +3 -0
  1929. package/dist/motion/shared-layout-bg/index.d.ts.map +1 -0
  1930. package/dist/motion/shared-layout-bg/src/SharedLayoutBg.vue.d.ts +38 -0
  1931. package/dist/motion/shared-layout-bg/src/SharedLayoutBg.vue.d.ts.map +1 -0
  1932. package/dist/motion/shared-layout-bg/src/api-types.d.ts +2 -0
  1933. package/dist/motion/shared-layout-bg/src/api-types.d.ts.map +1 -0
  1934. package/dist/motion/shared-layout-bg.d.ts +1 -0
  1935. package/dist/motion/shared-layout-bg.js +1 -0
  1936. package/dist/motion/sortable-stack/index.d.ts +10 -0
  1937. package/dist/motion/sortable-stack/index.d.ts.map +1 -0
  1938. package/dist/motion/sortable-stack/src/SortableList.vue.d.ts +50 -0
  1939. package/dist/motion/sortable-stack/src/SortableList.vue.d.ts.map +1 -0
  1940. package/dist/motion/sortable-stack/src/SortableListGroup.vue.d.ts +14 -0
  1941. package/dist/motion/sortable-stack/src/SortableListGroup.vue.d.ts.map +1 -0
  1942. package/dist/motion/sortable-stack/src/SortableListHandle.vue.d.ts +17 -0
  1943. package/dist/motion/sortable-stack/src/SortableListHandle.vue.d.ts.map +1 -0
  1944. package/dist/motion/sortable-stack/src/SortableListItem.vue.d.ts +18 -0
  1945. package/dist/motion/sortable-stack/src/SortableListItem.vue.d.ts.map +1 -0
  1946. package/dist/motion/sortable-stack/src/SortableListItemContent.vue.d.ts +14 -0
  1947. package/dist/motion/sortable-stack/src/SortableListItemContent.vue.d.ts.map +1 -0
  1948. package/dist/motion/sortable-stack/src/SortableListUndo.vue.d.ts +17 -0
  1949. package/dist/motion/sortable-stack/src/SortableListUndo.vue.d.ts.map +1 -0
  1950. package/dist/motion/sortable-stack/src/api-types.d.ts +8 -0
  1951. package/dist/motion/sortable-stack/src/api-types.d.ts.map +1 -0
  1952. package/dist/motion/sortable-stack/src/context.d.ts +27 -0
  1953. package/dist/motion/sortable-stack/src/context.d.ts.map +1 -0
  1954. package/dist/motion/sortable-stack/src/useSortableList.d.ts +8 -0
  1955. package/dist/motion/sortable-stack/src/useSortableList.d.ts.map +1 -0
  1956. package/dist/motion/sortable-stack.d.ts +1 -0
  1957. package/dist/motion/sortable-stack.js +1 -0
  1958. package/dist/motion/state.d.ts +6 -0
  1959. package/dist/motion/state.d.ts.map +1 -0
  1960. package/dist/motion/switch/index.d.ts +3 -0
  1961. package/dist/motion/switch/index.d.ts.map +1 -0
  1962. package/dist/motion/switch/src/Switch.vue.d.ts +20 -0
  1963. package/dist/motion/switch/src/Switch.vue.d.ts.map +1 -0
  1964. package/dist/motion/switch/src/api-types.d.ts +2 -0
  1965. package/dist/motion/switch/src/api-types.d.ts.map +1 -0
  1966. package/dist/motion/switch.d.ts +1 -0
  1967. package/dist/motion/switch.js +1 -0
  1968. package/dist/motion/table/index.d.ts +3 -0
  1969. package/dist/motion/table/index.d.ts.map +1 -0
  1970. package/dist/motion/table/src/EditableCell.vue.d.ts +12 -0
  1971. package/dist/motion/table/src/EditableCell.vue.d.ts.map +1 -0
  1972. package/dist/motion/table/src/SkeletonRows.vue.d.ts +11 -0
  1973. package/dist/motion/table/src/SkeletonRows.vue.d.ts.map +1 -0
  1974. package/dist/motion/table/src/Table.vue.d.ts +65 -0
  1975. package/dist/motion/table/src/Table.vue.d.ts.map +1 -0
  1976. package/dist/motion/table/src/TableHandle.vue.d.ts +17 -0
  1977. package/dist/motion/table/src/TableHandle.vue.d.ts.map +1 -0
  1978. package/dist/motion/table/src/TableHeader.vue.d.ts +33 -0
  1979. package/dist/motion/table/src/TableHeader.vue.d.ts.map +1 -0
  1980. package/dist/motion/table/src/TableMenu.vue.d.ts +29 -0
  1981. package/dist/motion/table/src/TableMenu.vue.d.ts.map +1 -0
  1982. package/dist/motion/table/src/types.d.ts +83 -0
  1983. package/dist/motion/table/src/types.d.ts.map +1 -0
  1984. package/dist/motion/table/src/use-table-menu.d.ts +20 -0
  1985. package/dist/motion/table/src/use-table-menu.d.ts.map +1 -0
  1986. package/dist/motion/table/src/use-table.d.ts +88 -0
  1987. package/dist/motion/table/src/use-table.d.ts.map +1 -0
  1988. package/dist/motion/table/src/useTableColumns.d.ts +19 -0
  1989. package/dist/motion/table/src/useTableColumns.d.ts.map +1 -0
  1990. package/dist/motion/table.d.ts +1 -0
  1991. package/dist/motion/table.js +1 -0
  1992. package/dist/motion/tabs/index.d.ts +5 -0
  1993. package/dist/motion/tabs/index.d.ts.map +1 -0
  1994. package/dist/motion/tabs/src/Tabs.vue.d.ts +30 -0
  1995. package/dist/motion/tabs/src/Tabs.vue.d.ts.map +1 -0
  1996. package/dist/motion/tabs/src/TabsContent.vue.d.ts +18 -0
  1997. package/dist/motion/tabs/src/TabsContent.vue.d.ts.map +1 -0
  1998. package/dist/motion/tabs/src/TabsList.vue.d.ts +17 -0
  1999. package/dist/motion/tabs/src/TabsList.vue.d.ts.map +1 -0
  2000. package/dist/motion/tabs/src/TabsTrigger.vue.d.ts +30 -0
  2001. package/dist/motion/tabs/src/TabsTrigger.vue.d.ts.map +1 -0
  2002. package/dist/motion/tabs/src/TriggerContent.vue.d.ts +22 -0
  2003. package/dist/motion/tabs/src/TriggerContent.vue.d.ts.map +1 -0
  2004. package/dist/motion/tabs/src/context.d.ts +28 -0
  2005. package/dist/motion/tabs/src/context.d.ts.map +1 -0
  2006. package/dist/motion/tabs/src/list-state.d.ts +22 -0
  2007. package/dist/motion/tabs/src/list-state.d.ts.map +1 -0
  2008. package/dist/motion/tabs.d.ts +1 -0
  2009. package/dist/motion/tabs.js +1 -0
  2010. package/dist/motion/text-animation/index.d.ts +7 -0
  2011. package/dist/motion/text-animation/index.d.ts.map +1 -0
  2012. package/dist/motion/text-animation/src/ChromaticTextReveal.vue.d.ts +26 -0
  2013. package/dist/motion/text-animation/src/ChromaticTextReveal.vue.d.ts.map +1 -0
  2014. package/dist/motion/text-animation/src/TextCascade.vue.d.ts +7 -0
  2015. package/dist/motion/text-animation/src/TextCascade.vue.d.ts.map +1 -0
  2016. package/dist/motion/text-animation/src/TextReveal.vue.d.ts +39 -0
  2017. package/dist/motion/text-animation/src/TextReveal.vue.d.ts.map +1 -0
  2018. package/dist/motion/text-animation/src/TextScramble.vue.d.ts +12 -0
  2019. package/dist/motion/text-animation/src/TextScramble.vue.d.ts.map +1 -0
  2020. package/dist/motion/text-animation/src/TextShimmer.vue.d.ts +23 -0
  2021. package/dist/motion/text-animation/src/TextShimmer.vue.d.ts.map +1 -0
  2022. package/dist/motion/text-animation/src/api-types.d.ts +6 -0
  2023. package/dist/motion/text-animation/src/api-types.d.ts.map +1 -0
  2024. package/dist/motion/text-animation/src/reveal-sequence.d.ts +7 -0
  2025. package/dist/motion/text-animation/src/reveal-sequence.d.ts.map +1 -0
  2026. package/dist/motion/text-animation.d.ts +1 -0
  2027. package/dist/motion/text-animation.js +1 -0
  2028. package/dist/motion/theme-toggle/index.d.ts +5 -0
  2029. package/dist/motion/theme-toggle/index.d.ts.map +1 -0
  2030. package/dist/motion/theme-toggle/src/ThemeToggle.vue.d.ts +20 -0
  2031. package/dist/motion/theme-toggle/src/ThemeToggle.vue.d.ts.map +1 -0
  2032. package/dist/motion/theme-toggle/src/api-types.d.ts +2 -0
  2033. package/dist/motion/theme-toggle/src/api-types.d.ts.map +1 -0
  2034. package/dist/motion/theme-toggle/src/useThemeToggle.d.ts +13 -0
  2035. package/dist/motion/theme-toggle/src/useThemeToggle.d.ts.map +1 -0
  2036. package/dist/motion/theme-toggle.d.ts +1 -0
  2037. package/dist/motion/theme-toggle.js +1 -0
  2038. package/dist/motion/tilt-card/index.d.ts +3 -0
  2039. package/dist/motion/tilt-card/index.d.ts.map +1 -0
  2040. package/dist/motion/tilt-card/src/TiltCard.vue.d.ts +21 -0
  2041. package/dist/motion/tilt-card/src/TiltCard.vue.d.ts.map +1 -0
  2042. package/dist/motion/tilt-card/src/api-types.d.ts +2 -0
  2043. package/dist/motion/tilt-card/src/api-types.d.ts.map +1 -0
  2044. package/dist/motion/tilt-card.d.ts +1 -0
  2045. package/dist/motion/tilt-card.js +1 -0
  2046. package/dist/motion/timeline/index.d.ts +4 -0
  2047. package/dist/motion/timeline/index.d.ts.map +1 -0
  2048. package/dist/motion/timeline/src/Timeline.vue.d.ts +55 -0
  2049. package/dist/motion/timeline/src/Timeline.vue.d.ts.map +1 -0
  2050. package/dist/motion/timeline/src/api-types.d.ts +2 -0
  2051. package/dist/motion/timeline/src/api-types.d.ts.map +1 -0
  2052. package/dist/motion/timeline/src/track.d.ts +38 -0
  2053. package/dist/motion/timeline/src/track.d.ts.map +1 -0
  2054. package/dist/motion/timeline.d.ts +1 -0
  2055. package/dist/motion/timeline.js +1 -0
  2056. package/dist/motion/tooltip/index.d.ts +8 -0
  2057. package/dist/motion/tooltip/index.d.ts.map +1 -0
  2058. package/dist/motion/tooltip/src/Tooltip.vue.d.ts +33 -0
  2059. package/dist/motion/tooltip/src/Tooltip.vue.d.ts.map +1 -0
  2060. package/dist/motion/tooltip/src/TooltipContent.vue.d.ts +21 -0
  2061. package/dist/motion/tooltip/src/TooltipContent.vue.d.ts.map +1 -0
  2062. package/dist/motion/tooltip/src/TooltipProvider.vue.d.ts +20 -0
  2063. package/dist/motion/tooltip/src/TooltipProvider.vue.d.ts.map +1 -0
  2064. package/dist/motion/tooltip/src/TooltipTrigger.vue.d.ts +15 -0
  2065. package/dist/motion/tooltip/src/TooltipTrigger.vue.d.ts.map +1 -0
  2066. package/dist/motion/tooltip/src/api-types.d.ts +3 -0
  2067. package/dist/motion/tooltip/src/api-types.d.ts.map +1 -0
  2068. package/dist/motion/tooltip/src/context.d.ts +51 -0
  2069. package/dist/motion/tooltip/src/context.d.ts.map +1 -0
  2070. package/dist/motion/tooltip/src/grace.d.ts +16 -0
  2071. package/dist/motion/tooltip/src/grace.d.ts.map +1 -0
  2072. package/dist/motion/tooltip/src/position.d.ts +30 -0
  2073. package/dist/motion/tooltip/src/position.d.ts.map +1 -0
  2074. package/dist/motion/tooltip.d.ts +1 -0
  2075. package/dist/motion/tooltip.js +1 -0
  2076. package/dist/motion/wheel-picker/index.d.ts +4 -0
  2077. package/dist/motion/wheel-picker/index.d.ts.map +1 -0
  2078. package/dist/motion/wheel-picker/src/WheelPicker.vue.d.ts +27 -0
  2079. package/dist/motion/wheel-picker/src/WheelPicker.vue.d.ts.map +1 -0
  2080. package/dist/motion/wheel-picker/src/api-types.d.ts +2 -0
  2081. package/dist/motion/wheel-picker/src/api-types.d.ts.map +1 -0
  2082. package/dist/motion/wheel-picker/src/drum-state.d.ts +35 -0
  2083. package/dist/motion/wheel-picker/src/drum-state.d.ts.map +1 -0
  2084. package/dist/motion/wheel-picker/src/tick-sound.d.ts +8 -0
  2085. package/dist/motion/wheel-picker/src/tick-sound.d.ts.map +1 -0
  2086. package/dist/motion/wheel-picker.d.ts +1 -0
  2087. package/dist/motion/wheel-picker.js +1 -0
  2088. package/dist/motion.d.ts +1 -0
  2089. package/dist/motion.js +58 -0
  2090. package/dist/multi-select-DquETzls.js +312 -0
  2091. package/dist/multi-select-DquETzls.js.map +1 -0
  2092. package/dist/not-found-BA28FNf-.js +400 -0
  2093. package/dist/not-found-BA28FNf-.js.map +1 -0
  2094. package/dist/notification-stack-DsRk7N8m.js +209 -0
  2095. package/dist/notification-stack-DsRk7N8m.js.map +1 -0
  2096. package/dist/number-Dz4iLJiS.js +279 -0
  2097. package/dist/number-Dz4iLJiS.js.map +1 -0
  2098. package/dist/order-book-MV2c9L-j.js +320 -0
  2099. package/dist/order-book-MV2c9L-j.js.map +1 -0
  2100. package/dist/otp-input-CHNtAMa9.js +324 -0
  2101. package/dist/otp-input-CHNtAMa9.js.map +1 -0
  2102. package/dist/overflow-actions-D4746kdz.js +282 -0
  2103. package/dist/overflow-actions-D4746kdz.js.map +1 -0
  2104. package/dist/popover-BOA56MM6.js +684 -0
  2105. package/dist/popover-BOA56MM6.js.map +1 -0
  2106. package/dist/poses-BY_jc8mF.js +72 -0
  2107. package/dist/poses-BY_jc8mF.js.map +1 -0
  2108. package/dist/prediction-market-C9jhwhq3.js +630 -0
  2109. package/dist/prediction-market-C9jhwhq3.js.map +1 -0
  2110. package/dist/preview-rail-C7Rbzlxy.js +240 -0
  2111. package/dist/preview-rail-C7Rbzlxy.js.map +1 -0
  2112. package/dist/price-target-fan-C5Q3RE-I.js +741 -0
  2113. package/dist/price-target-fan-C5Q3RE-I.js.map +1 -0
  2114. package/dist/project-folder-BtSBMR2F.js +310 -0
  2115. package/dist/project-folder-BtSBMR2F.js.map +1 -0
  2116. package/dist/prompt-input-DMCSZC52.js +246 -0
  2117. package/dist/prompt-input-DMCSZC52.js.map +1 -0
  2118. package/dist/pull-to-refresh-DFVih6NS.js +384 -0
  2119. package/dist/pull-to-refresh-DFVih6NS.js.map +1 -0
  2120. package/dist/radio-pBV2VkJS.js +161 -0
  2121. package/dist/radio-pBV2VkJS.js.map +1 -0
  2122. package/dist/range-slider-DNGMNvLt.js +780 -0
  2123. package/dist/range-slider-DNGMNvLt.js.map +1 -0
  2124. package/dist/returns-calendar-CRHEOO6m.js +377 -0
  2125. package/dist/returns-calendar-CRHEOO6m.js.map +1 -0
  2126. package/dist/sankey-chart-BBWohlgh.js +600 -0
  2127. package/dist/sankey-chart-BBWohlgh.js.map +1 -0
  2128. package/dist/scroll-animation-DfXlBBPZ.js +362 -0
  2129. package/dist/scroll-animation-DfXlBBPZ.js.map +1 -0
  2130. package/dist/search-cursor-DEEZMunN.js +35 -0
  2131. package/dist/search-cursor-DEEZMunN.js.map +1 -0
  2132. package/dist/select-CpzmgBi9.js +646 -0
  2133. package/dist/select-CpzmgBi9.js.map +1 -0
  2134. package/dist/shader-background-DOJlkTYV.js +607 -0
  2135. package/dist/shader-background-DOJlkTYV.js.map +1 -0
  2136. package/dist/shared-BY_cwEzO.js +88 -0
  2137. package/dist/shared-BY_cwEzO.js.map +1 -0
  2138. package/dist/shared-ByEZ4bm_.js +26 -0
  2139. package/dist/shared-ByEZ4bm_.js.map +1 -0
  2140. package/dist/shared-DAEawhBJ.js +66 -0
  2141. package/dist/shared-DAEawhBJ.js.map +1 -0
  2142. package/dist/shared-layout-bg-QIKkMnLV.js +96 -0
  2143. package/dist/shared-layout-bg-QIKkMnLV.js.map +1 -0
  2144. package/dist/signup-form-CWYewGba.js +407 -0
  2145. package/dist/signup-form-CWYewGba.js.map +1 -0
  2146. package/dist/sortable-stack-LPwgEXh_.js +283 -0
  2147. package/dist/sortable-stack-LPwgEXh_.js.map +1 -0
  2148. package/dist/state-DWNDjqAL.js +32 -0
  2149. package/dist/state-DWNDjqAL.js.map +1 -0
  2150. package/dist/status-bar-DbSKiZ3y.js +332 -0
  2151. package/dist/status-bar-DbSKiZ3y.js.map +1 -0
  2152. package/dist/stream-follow-D51R7eNh.js +28 -0
  2153. package/dist/stream-follow-D51R7eNh.js.map +1 -0
  2154. package/dist/streaming-response-BzqBjbJ3.js +191 -0
  2155. package/dist/streaming-response-BzqBjbJ3.js.map +1 -0
  2156. package/dist/style.css +2 -0
  2157. package/dist/swap-BSeVL8dB.js +878 -0
  2158. package/dist/swap-BSeVL8dB.js.map +1 -0
  2159. package/dist/swipeable-list-AlQhrq07.js +249 -0
  2160. package/dist/swipeable-list-AlQhrq07.js.map +1 -0
  2161. package/dist/switch-D40EEBbb.js +104 -0
  2162. package/dist/switch-D40EEBbb.js.map +1 -0
  2163. package/dist/table-BObEN15h.js +921 -0
  2164. package/dist/table-BObEN15h.js.map +1 -0
  2165. package/dist/tabs-DJq2UGVp.js +509 -0
  2166. package/dist/tabs-DJq2UGVp.js.map +1 -0
  2167. package/dist/text-animation-BVFTj50V.js +329 -0
  2168. package/dist/text-animation-BVFTj50V.js.map +1 -0
  2169. package/dist/theme/palettes.d.ts +17 -0
  2170. package/dist/theme/palettes.d.ts.map +1 -0
  2171. package/dist/theme/stylesheet.d.ts +2 -0
  2172. package/dist/theme/stylesheet.d.ts.map +1 -0
  2173. package/dist/theme-toggle-Bmv1gxgq.js +122 -0
  2174. package/dist/theme-toggle-Bmv1gxgq.js.map +1 -0
  2175. package/dist/tilt-card-nKtgNoGB.js +50 -0
  2176. package/dist/tilt-card-nKtgNoGB.js.map +1 -0
  2177. package/dist/timeline-DNs6vEXj.js +360 -0
  2178. package/dist/timeline-DNs6vEXj.js.map +1 -0
  2179. package/dist/todo-list-BIQAOmls.js +366 -0
  2180. package/dist/todo-list-BIQAOmls.js.map +1 -0
  2181. package/dist/tool-approval-DCIGwm0_.js +202 -0
  2182. package/dist/tool-approval-DCIGwm0_.js.map +1 -0
  2183. package/dist/tool-result-DDQUYu2p.js +246 -0
  2184. package/dist/tool-result-DDQUYu2p.js.map +1 -0
  2185. package/dist/tooltip-DWqJD6DG.js +561 -0
  2186. package/dist/tooltip-DWqJD6DG.js.map +1 -0
  2187. package/dist/treemap-BvZ9giIP.js +443 -0
  2188. package/dist/treemap-BvZ9giIP.js.map +1 -0
  2189. package/dist/utils-DIrLOK2M.js +10 -0
  2190. package/dist/utils-DIrLOK2M.js.map +1 -0
  2191. package/dist/voice-orb-BOMRQOnB.js +200 -0
  2192. package/dist/voice-orb-BOMRQOnB.js.map +1 -0
  2193. package/dist/volume-profile-GTHNUYya.js +422 -0
  2194. package/dist/volume-profile-GTHNUYya.js.map +1 -0
  2195. package/dist/wallet-card-DOa9Q4pg.js +580 -0
  2196. package/dist/wallet-card-DOa9Q4pg.js.map +1 -0
  2197. package/dist/wheel-picker-GAAJPpFm.js +372 -0
  2198. package/dist/wheel-picker-GAAJPpFm.js.map +1 -0
  2199. package/package.json +58 -3
  2200. package/registry/action-swap-blur.json +178 -0
  2201. package/registry/action-swap-cascade.json +178 -0
  2202. package/registry/action-swap-roll.json +178 -0
  2203. package/registry/action-swap.json +178 -0
  2204. package/registry/adaptive-stepper.json +155 -0
  2205. package/registry/agent-activity.json +275 -0
  2206. package/registry/agent-progress.json +232 -0
  2207. package/registry/ai-sidebar.json +197 -0
  2208. package/registry/alert.json +149 -0
  2209. package/registry/animated-badge.json +95 -0
  2210. package/registry/animated-number.json +112 -0
  2211. package/registry/animated-sidebar.json +245 -0
  2212. package/registry/animated-toast-stack.json +107 -0
  2213. package/registry/approval-card.json +359 -0
  2214. package/registry/arc-picker.json +106 -0
  2215. package/registry/aspect-ratio.json +94 -0
  2216. package/registry/attachment-upload.json +222 -0
  2217. package/registry/availability-scheduler.json +378 -0
  2218. package/registry/bloom-menu.json +107 -0
  2219. package/registry/bottom-sheet.json +100 -0
  2220. package/registry/bounce-sidebar.json +94 -0
  2221. package/registry/bouncy-accordion.json +113 -0
  2222. package/registry/breadcrumb.json +191 -0
  2223. package/registry/bump-chart.json +137 -0
  2224. package/registry/button-base.json +137 -0
  2225. package/registry/button-magnetic.json +137 -0
  2226. package/registry/button-metallic.json +137 -0
  2227. package/registry/button-stateful.json +137 -0
  2228. package/registry/button.json +137 -0
  2229. package/registry/candlestick-chart.json +104 -0
  2230. package/registry/card-folder.json +155 -0
  2231. package/registry/card.json +130 -0
  2232. package/registry/center-morph-modal.json +131 -0
  2233. package/registry/chat-app.json +1344 -0
  2234. package/registry/checkbox.json +94 -0
  2235. package/registry/chromatic-text-reveal.json +122 -0
  2236. package/registry/citations.json +135 -0
  2237. package/registry/code-block.json +126 -0
  2238. package/registry/collapsible.json +131 -0
  2239. package/registry/color-picker.json +191 -0
  2240. package/registry/color-selector.json +118 -0
  2241. package/registry/combobox.json +179 -0
  2242. package/registry/command-palette.json +119 -0
  2243. package/registry/composition-chart.json +110 -0
  2244. package/registry/context-menu.json +173 -0
  2245. package/registry/cylinder-carousel.json +80 -0
  2246. package/registry/date-range-picker.json +263 -0
  2247. package/registry/digit-swap.json +112 -0
  2248. package/registry/dock.json +112 -0
  2249. package/registry/donut-chart.json +160 -0
  2250. package/registry/drawer.json +94 -0
  2251. package/registry/dynamic-island.json +116 -0
  2252. package/registry/expandable-action-bar.json +106 -0
  2253. package/registry/expandable-control.json +101 -0
  2254. package/registry/expandable-tabs.json +112 -0
  2255. package/registry/expanding-arrow-button.json +112 -0
  2256. package/registry/feedback-widget.json +173 -0
  2257. package/registry/file-diff.json +162 -0
  2258. package/registry/file-tree.json +137 -0
  2259. package/registry/file-upload.json +222 -0
  2260. package/registry/funnel-chart.json +154 -0
  2261. package/registry/heat-calendar.json +122 -0
  2262. package/registry/hold-action-button.json +112 -0
  2263. package/registry/image-generation.json +119 -0
  2264. package/registry/image-viewer.json +197 -0
  2265. package/registry/infinite-masonry.json +114 -0
  2266. package/registry/input.json +100 -0
  2267. package/registry/knockout-bracket.json +222 -0
  2268. package/registry/knockout-wheel.json +222 -0
  2269. package/registry/liquidity-heatmap.json +161 -0
  2270. package/registry/loader.json +104 -0
  2271. package/registry/loading-states.json +232 -0
  2272. package/registry/marquee.json +81 -0
  2273. package/registry/message-bubble.json +137 -0
  2274. package/registry/message-scroller.json +124 -0
  2275. package/registry/message.json +257 -0
  2276. package/registry/morphing-lightbox.json +197 -0
  2277. package/registry/morphing-modal.json +94 -0
  2278. package/registry/morphing-search-chips.json +131 -0
  2279. package/registry/morphing-search.json +131 -0
  2280. package/registry/morphing-tabs.json +131 -0
  2281. package/registry/multi-select.json +179 -0
  2282. package/registry/not-found-glitch.json +206 -0
  2283. package/registry/not-found-magnetic.json +206 -0
  2284. package/registry/not-found-spotlight.json +206 -0
  2285. package/registry/not-found-stacked.json +206 -0
  2286. package/registry/not-found-terminal.json +206 -0
  2287. package/registry/not-found.json +206 -0
  2288. package/registry/notification-stack.json +227 -0
  2289. package/registry/number-ticker.json +112 -0
  2290. package/registry/number.json +112 -0
  2291. package/registry/order-book.json +128 -0
  2292. package/registry/orvui-theme.json +41 -0
  2293. package/registry/otp-input.json +94 -0
  2294. package/registry/overflow-actions.json +113 -0
  2295. package/registry/parallax.json +125 -0
  2296. package/registry/popover-morph.json +136 -0
  2297. package/registry/popover.json +136 -0
  2298. package/registry/prediction-market-card.json +456 -0
  2299. package/registry/prediction-market.json +456 -0
  2300. package/registry/preview-rail.json +106 -0
  2301. package/registry/price-target-fan.json +208 -0
  2302. package/registry/project-folder.json +107 -0
  2303. package/registry/prompt-input.json +329 -0
  2304. package/registry/pull-to-refresh.json +112 -0
  2305. package/registry/radio.json +106 -0
  2306. package/registry/range-slider-bubble.json +142 -0
  2307. package/registry/range-slider-fluid.json +142 -0
  2308. package/registry/range-slider-inline.json +142 -0
  2309. package/registry/range-slider-ruler.json +142 -0
  2310. package/registry/range-slider-wave.json +142 -0
  2311. package/registry/range-slider.json +142 -0
  2312. package/registry/reasoning-text.json +232 -0
  2313. package/registry/registry.json +930 -0
  2314. package/registry/returns-calendar.json +116 -0
  2315. package/registry/sankey-chart.json +161 -0
  2316. package/registry/scroll-animation.json +125 -0
  2317. package/registry/scroll-progress.json +125 -0
  2318. package/registry/scroll-reveal.json +125 -0
  2319. package/registry/scroll-to.json +125 -0
  2320. package/registry/select-morph.json +153 -0
  2321. package/registry/select.json +153 -0
  2322. package/registry/shader-background.json +100 -0
  2323. package/registry/shared-layout-bg.json +88 -0
  2324. package/registry/signup-form.json +233 -0
  2325. package/registry/slide-action-button.json +112 -0
  2326. package/registry/smooth-scroll.json +125 -0
  2327. package/registry/sortable-stack.json +137 -0
  2328. package/registry/status-bar.json +111 -0
  2329. package/registry/streaming-response.json +167 -0
  2330. package/registry/swap.json +149 -0
  2331. package/registry/swipeable-list.json +119 -0
  2332. package/registry/switch.json +88 -0
  2333. package/registry/table-async.json +156 -0
  2334. package/registry/table-editable.json +156 -0
  2335. package/registry/table.json +156 -0
  2336. package/registry/tabs.json +125 -0
  2337. package/registry/text-animation.json +122 -0
  2338. package/registry/text-cascade.json +122 -0
  2339. package/registry/text-reveal.json +122 -0
  2340. package/registry/text-scramble.json +122 -0
  2341. package/registry/text-shimmer.json +122 -0
  2342. package/registry/theme-toggle.json +113 -0
  2343. package/registry/thinking-shimmer.json +232 -0
  2344. package/registry/tilt-card.json +80 -0
  2345. package/registry/timeline.json +92 -0
  2346. package/registry/todo-list.json +239 -0
  2347. package/registry/tool-approval.json +156 -0
  2348. package/registry/tool-result.json +252 -0
  2349. package/registry/tooltip.json +125 -0
  2350. package/registry/treemap.json +173 -0
  2351. package/registry/voice-orb.json +104 -0
  2352. package/registry/volume-profile.json +167 -0
  2353. package/registry/wallet-card.json +317 -0
  2354. package/registry/wheel-picker.json +99 -0
  2355. package/src/agents/AgentDisclosure.vue +55 -0
  2356. package/src/agents/agent-activity/LICENSE.simple-icons +30 -0
  2357. package/src/agents/agent-activity/index.ts +2 -0
  2358. package/src/agents/agent-activity/src/ActivityRow.vue +201 -0
  2359. package/src/agents/agent-activity/src/AgentActivity.vue +237 -0
  2360. package/src/agents/agent-activity/src/summary.ts +46 -0
  2361. package/src/agents/agent-activity/src/types.ts +69 -0
  2362. package/src/agents/ai-sidebar/index.ts +4 -0
  2363. package/src/agents/ai-sidebar/src/AISidebar.vue +413 -0
  2364. package/src/agents/ai-sidebar/src/MarqueeLabel.vue +67 -0
  2365. package/src/agents/ai-sidebar/src/ResourceRow.vue +312 -0
  2366. package/src/agents/ai-sidebar/src/api-types.ts +4 -0
  2367. package/src/agents/ai-sidebar/src/tree.ts +170 -0
  2368. package/src/agents/ai-sidebar/src/useTouchCapable.ts +15 -0
  2369. package/src/agents/approval-card/index.ts +2 -0
  2370. package/src/agents/approval-card/src/ApprovalCard.vue +375 -0
  2371. package/src/agents/approval-card/src/QuestionOptions.vue +77 -0
  2372. package/src/agents/approval-card/src/types.ts +40 -0
  2373. package/src/agents/chat-app/index.ts +19 -0
  2374. package/src/agents/chat-app/src/ChatApp.vue +72 -0
  2375. package/src/agents/chat-app/src/ShellFit.vue +38 -0
  2376. package/src/agents/chat-app/src/api-types.ts +4 -0
  2377. package/src/agents/citations/index.ts +8 -0
  2378. package/src/agents/citations/src/Citation.vue +45 -0
  2379. package/src/agents/citations/src/CitationFavicon.vue +67 -0
  2380. package/src/agents/citations/src/CitationList.vue +73 -0
  2381. package/src/agents/citations/src/CitationStack.vue +20 -0
  2382. package/src/agents/citations/src/Citations.vue +67 -0
  2383. package/src/agents/citations/src/api-types.ts +13 -0
  2384. package/src/agents/citations/src/types.ts +8 -0
  2385. package/src/agents/code-block/index.ts +11 -0
  2386. package/src/agents/code-block/src/AgentCode.vue +47 -0
  2387. package/src/agents/code-block/src/AgentCodeLine.vue +20 -0
  2388. package/src/agents/code-block/src/CodeBlock.vue +152 -0
  2389. package/src/agents/code-block/src/api-types.ts +4 -0
  2390. package/src/agents/code-block/src/tokens.ts +102 -0
  2391. package/src/agents/file-diff/index.ts +4 -0
  2392. package/src/agents/file-diff/src/FileDiff.vue +235 -0
  2393. package/src/agents/file-diff/src/api-types.ts +4 -0
  2394. package/src/agents/file-diff/src/types.ts +9 -0
  2395. package/src/agents/image-generation/index.ts +4 -0
  2396. package/src/agents/image-generation/src/DitherField.vue +57 -0
  2397. package/src/agents/image-generation/src/ImageGeneration.vue +190 -0
  2398. package/src/agents/image-generation/src/api-types.ts +4 -0
  2399. package/src/agents/image-generation/src/dither.ts +112 -0
  2400. package/src/agents/index.ts +18 -0
  2401. package/src/agents/loading-states/index.ts +7 -0
  2402. package/src/agents/loading-states/src/AgentProgress.vue +91 -0
  2403. package/src/agents/loading-states/src/CascadePhrase.vue +47 -0
  2404. package/src/agents/loading-states/src/LoadingStates.vue +5 -0
  2405. package/src/agents/loading-states/src/ReasoningText.vue +142 -0
  2406. package/src/agents/loading-states/src/ThinkingShimmer.vue +37 -0
  2407. package/src/agents/loading-states/src/api-types.ts +10 -0
  2408. package/src/agents/message/index.ts +14 -0
  2409. package/src/agents/message/src/Message.vue +40 -0
  2410. package/src/agents/message/src/MessageAvatar.vue +28 -0
  2411. package/src/agents/message/src/MessageContent.vue +21 -0
  2412. package/src/agents/message/src/MessageFooter.vue +21 -0
  2413. package/src/agents/message/src/MessageGroup.vue +26 -0
  2414. package/src/agents/message/src/MessageHeader.vue +21 -0
  2415. package/src/agents/message/src/MessageMarker.vue +18 -0
  2416. package/src/agents/message/src/MessageTyping.vue +37 -0
  2417. package/src/agents/message/src/alignment.ts +9 -0
  2418. package/src/agents/message/src/api-types.ts +25 -0
  2419. package/src/agents/message/src/context.ts +5 -0
  2420. package/src/agents/message-bubble/index.ts +7 -0
  2421. package/src/agents/message-bubble/src/MessageBubble.vue +51 -0
  2422. package/src/agents/message-bubble/src/MessageBubbleCollapsible.vue +96 -0
  2423. package/src/agents/message-bubble/src/MessageBubbleContent.vue +102 -0
  2424. package/src/agents/message-bubble/src/MessageBubbleGroup.vue +26 -0
  2425. package/src/agents/message-bubble/src/api-types.ts +13 -0
  2426. package/src/agents/message-bubble/src/context.ts +15 -0
  2427. package/src/agents/message-scroller/index.ts +3 -0
  2428. package/src/agents/message-scroller/src/MessageScroller.vue +362 -0
  2429. package/src/agents/message-scroller/src/api-types.ts +4 -0
  2430. package/src/agents/prompt-input/index.ts +4 -0
  2431. package/src/agents/prompt-input/src/PromptInput.vue +301 -0
  2432. package/src/agents/prompt-input/src/api-types.ts +4 -0
  2433. package/src/agents/shared.ts +41 -0
  2434. package/src/agents/stream-follow.ts +53 -0
  2435. package/src/agents/streaming-response/index.ts +7 -0
  2436. package/src/agents/streaming-response/src/ResponseAction.vue +31 -0
  2437. package/src/agents/streaming-response/src/StreamingResponse.vue +180 -0
  2438. package/src/agents/streaming-response/src/api-types.ts +4 -0
  2439. package/src/agents/todo-list/index.ts +4 -0
  2440. package/src/agents/todo-list/src/TodoHeaderIcon.vue +57 -0
  2441. package/src/agents/todo-list/src/TodoList.vue +200 -0
  2442. package/src/agents/todo-list/src/TodoStatusIcon.vue +119 -0
  2443. package/src/agents/todo-list/src/api-types.ts +4 -0
  2444. package/src/agents/tool-approval/index.ts +8 -0
  2445. package/src/agents/tool-approval/src/ToolApproval.vue +231 -0
  2446. package/src/agents/tool-approval/src/ToolApprovalCode.vue +14 -0
  2447. package/src/agents/tool-approval/src/api-types.ts +7 -0
  2448. package/src/agents/tool-result/index.ts +5 -0
  2449. package/src/agents/tool-result/src/ToolResult.vue +249 -0
  2450. package/src/agents/tool-result/src/ToolResultOutput.vue +25 -0
  2451. package/src/agents/tool-result/src/api-types.ts +7 -0
  2452. package/src/agents/voice-orb/index.ts +3 -0
  2453. package/src/agents/voice-orb/src/VoiceOrb.vue +129 -0
  2454. package/src/agents/voice-orb/src/api-types.ts +4 -0
  2455. package/src/agents/voice-orb/src/renderer.ts +283 -0
  2456. package/src/blocks/availability-scheduler/index.ts +4 -0
  2457. package/src/blocks/availability-scheduler/src/AvailabilityScheduler.vue +160 -0
  2458. package/src/blocks/availability-scheduler/src/CopyMenu.vue +102 -0
  2459. package/src/blocks/availability-scheduler/src/TimeSelect.vue +44 -0
  2460. package/src/blocks/availability-scheduler/src/api-types.ts +4 -0
  2461. package/src/blocks/availability-scheduler/src/types.ts +120 -0
  2462. package/src/blocks/availability-scheduler/src/use-schedule.ts +137 -0
  2463. package/src/blocks/bloom-menu/index.ts +4 -0
  2464. package/src/blocks/bloom-menu/src/BloomMenu.vue +178 -0
  2465. package/src/blocks/bloom-menu/src/api-types.ts +4 -0
  2466. package/src/blocks/bloom-menu/src/use-bloom.ts +122 -0
  2467. package/src/blocks/card-folder/index.ts +3 -0
  2468. package/src/blocks/card-folder/src/CardFolder.vue +228 -0
  2469. package/src/blocks/card-folder/src/api-types.ts +4 -0
  2470. package/src/blocks/card-folder/src/purse-shape.ts +41 -0
  2471. package/src/blocks/card-folder/src/use-card-folder.ts +106 -0
  2472. package/src/blocks/command-palette/index.ts +4 -0
  2473. package/src/blocks/command-palette/src/CommandPalette.vue +216 -0
  2474. package/src/blocks/command-palette/src/api-types.ts +4 -0
  2475. package/src/blocks/command-palette/src/search.ts +70 -0
  2476. package/src/blocks/command-palette/src/use-commands.ts +96 -0
  2477. package/src/blocks/dismiss.ts +83 -0
  2478. package/src/blocks/dynamic-island/index.ts +5 -0
  2479. package/src/blocks/dynamic-island/src/DynamicIsland.vue +44 -0
  2480. package/src/blocks/dynamic-island/src/DynamicIslandView.vue +18 -0
  2481. package/src/blocks/dynamic-island/src/IslandSlot.vue +43 -0
  2482. package/src/blocks/dynamic-island/src/api-types.ts +7 -0
  2483. package/src/blocks/dynamic-island/src/context.ts +2 -0
  2484. package/src/blocks/dynamic-island/src/use-island-size.ts +40 -0
  2485. package/src/blocks/expandable-action-bar/index.ts +24 -0
  2486. package/src/blocks/expandable-action-bar/src/ExpandableActionBar.vue +209 -0
  2487. package/src/blocks/expandable-action-bar/src/api-types.ts +4 -0
  2488. package/src/blocks/expandable-action-bar/src/source-types.ts +11 -0
  2489. package/src/blocks/expandable-action-bar/src/use-action-bar.ts +135 -0
  2490. package/src/blocks/expandable-tabs/index.ts +6 -0
  2491. package/src/blocks/expandable-tabs/src/ExpandableTabs.vue +293 -0
  2492. package/src/blocks/expandable-tabs/src/api-types.ts +4 -0
  2493. package/src/blocks/expandable-tabs/src/source-types.ts +10 -0
  2494. package/src/blocks/expandable-tabs/src/use-tab-measurements.ts +93 -0
  2495. package/src/blocks/feedback-widget/index.ts +4 -0
  2496. package/src/blocks/feedback-widget/src/FeedbackWidget.vue +346 -0
  2497. package/src/blocks/feedback-widget/src/api-types.ts +4 -0
  2498. package/src/blocks/feedback-widget/src/use-feedback.ts +84 -0
  2499. package/src/blocks/file-upload/index.ts +8 -0
  2500. package/src/blocks/file-upload/src/AttachmentAction.vue +83 -0
  2501. package/src/blocks/file-upload/src/AttachmentPreview.vue +72 -0
  2502. package/src/blocks/file-upload/src/AttachmentRow.vue +247 -0
  2503. package/src/blocks/file-upload/src/AttachmentUpload.vue +182 -0
  2504. package/src/blocks/file-upload/src/FileUpload.vue +157 -0
  2505. package/src/blocks/file-upload/src/FileUploadRow.vue +182 -0
  2506. package/src/blocks/file-upload/src/api-types.ts +7 -0
  2507. package/src/blocks/file-upload/src/attachment-geometry.ts +8 -0
  2508. package/src/blocks/file-upload/src/attachment-types.ts +17 -0
  2509. package/src/blocks/file-upload/src/file-utils.ts +90 -0
  2510. package/src/blocks/file-upload/src/queue-state.ts +59 -0
  2511. package/src/blocks/file-upload/src/source-types.ts +18 -0
  2512. package/src/blocks/file-upload/src/types.ts +24 -0
  2513. package/src/blocks/file-upload/src/use-attachment-queue.ts +143 -0
  2514. package/src/blocks/file-upload/src/use-file-queue.ts +77 -0
  2515. package/src/blocks/index.ts +23 -0
  2516. package/src/blocks/infinite-masonry/index.ts +5 -0
  2517. package/src/blocks/infinite-masonry/src/InfiniteMasonry.vue +157 -0
  2518. package/src/blocks/infinite-masonry/src/MasonryItemReveal.vue +26 -0
  2519. package/src/blocks/infinite-masonry/src/api-types.ts +4 -0
  2520. package/src/blocks/infinite-masonry/src/use-masonry.ts +156 -0
  2521. package/src/blocks/knockout-bracket/index.ts +7 -0
  2522. package/src/blocks/knockout-bracket/src/KnockoutBracket.vue +170 -0
  2523. package/src/blocks/knockout-bracket/src/KnockoutWheel.vue +169 -0
  2524. package/src/blocks/knockout-bracket/src/MatchCard.vue +75 -0
  2525. package/src/blocks/knockout-bracket/src/TeamCrest.vue +36 -0
  2526. package/src/blocks/knockout-bracket/src/WheelMark.vue +100 -0
  2527. package/src/blocks/knockout-bracket/src/api-types.ts +7 -0
  2528. package/src/blocks/knockout-bracket/src/bracket-model.ts +72 -0
  2529. package/src/blocks/knockout-bracket/src/data.ts +412 -0
  2530. package/src/blocks/knockout-bracket/src/fixture-builder.ts +56 -0
  2531. package/src/blocks/knockout-bracket/src/types.ts +24 -0
  2532. package/src/blocks/knockout-bracket/src/use-wheel.ts +159 -0
  2533. package/src/blocks/knockout-bracket/src/wheel-data.ts +412 -0
  2534. package/src/blocks/knockout-bracket/src/wheel-model.ts +184 -0
  2535. package/src/blocks/morphing-search/index.ts +5 -0
  2536. package/src/blocks/morphing-search/src/Highlight.vue +21 -0
  2537. package/src/blocks/morphing-search/src/MorphingSearch.vue +287 -0
  2538. package/src/blocks/morphing-search/src/MorphingSearchChips.vue +414 -0
  2539. package/src/blocks/morphing-search/src/api-types.ts +7 -0
  2540. package/src/blocks/morphing-search/src/use-search-chips.ts +413 -0
  2541. package/src/blocks/morphing-search/src/use-search-overlay.ts +254 -0
  2542. package/src/blocks/morphing-tabs/index.ts +6 -0
  2543. package/src/blocks/morphing-tabs/src/LiquidSurface.vue +22 -0
  2544. package/src/blocks/morphing-tabs/src/MorphingTabs.vue +257 -0
  2545. package/src/blocks/morphing-tabs/src/SpringTab.vue +88 -0
  2546. package/src/blocks/morphing-tabs/src/api-types.ts +4 -0
  2547. package/src/blocks/morphing-tabs/src/model.ts +97 -0
  2548. package/src/blocks/morphing-tabs/src/source-types.ts +10 -0
  2549. package/src/blocks/morphing-tabs/src/use-morphing-tabs.ts +361 -0
  2550. package/src/blocks/not-found/index.ts +9 -0
  2551. package/src/blocks/not-found/src/NotFound.vue +6 -0
  2552. package/src/blocks/not-found/src/NotFoundActions.vue +24 -0
  2553. package/src/blocks/not-found/src/NotFoundCopy.vue +9 -0
  2554. package/src/blocks/not-found/src/NotFoundGlitch.vue +22 -0
  2555. package/src/blocks/not-found/src/NotFoundMagnetic.vue +19 -0
  2556. package/src/blocks/not-found/src/NotFoundScramble.vue +6 -0
  2557. package/src/blocks/not-found/src/NotFoundSpotlight.vue +22 -0
  2558. package/src/blocks/not-found/src/NotFoundStacked.vue +28 -0
  2559. package/src/blocks/not-found/src/NotFoundStage.vue +6 -0
  2560. package/src/blocks/not-found/src/NotFoundTerminal.vue +33 -0
  2561. package/src/blocks/not-found/src/types.ts +19 -0
  2562. package/src/blocks/not-found/src/use-not-found-scene.ts +59 -0
  2563. package/src/blocks/notification-stack/index.ts +6 -0
  2564. package/src/blocks/notification-stack/src/NotificationContent.vue +53 -0
  2565. package/src/blocks/notification-stack/src/NotificationStack.vue +177 -0
  2566. package/src/blocks/notification-stack/src/api-types.ts +4 -0
  2567. package/src/blocks/notification-stack/src/source-types.ts +10 -0
  2568. package/src/blocks/notification-stack/src/use-stack-interaction.ts +77 -0
  2569. package/src/blocks/otp-input/index.ts +4 -0
  2570. package/src/blocks/otp-input/src/OTPInput.vue +292 -0
  2571. package/src/blocks/otp-input/src/api-types.ts +4 -0
  2572. package/src/blocks/otp-input/src/use-otp-fields.ts +116 -0
  2573. package/src/blocks/overflow-actions/index.ts +6 -0
  2574. package/src/blocks/overflow-actions/src/ActionButton.vue +80 -0
  2575. package/src/blocks/overflow-actions/src/OverflowActions.vue +203 -0
  2576. package/src/blocks/overflow-actions/src/api-types.ts +4 -0
  2577. package/src/blocks/overflow-actions/src/source-types.ts +11 -0
  2578. package/src/blocks/prediction-market/index.ts +16 -0
  2579. package/src/blocks/prediction-market/src/AnimatedAmountInput.vue +93 -0
  2580. package/src/blocks/prediction-market/src/MarketOddsButton.vue +49 -0
  2581. package/src/blocks/prediction-market/src/PredictionMarket.vue +277 -0
  2582. package/src/blocks/prediction-market/src/PredictionMarketCard.vue +212 -0
  2583. package/src/blocks/prediction-market/src/api-types.ts +7 -0
  2584. package/src/blocks/prediction-market/src/source-types.ts +10 -0
  2585. package/src/blocks/prediction-market/src/types.ts +22 -0
  2586. package/src/blocks/prediction-market/src/use-market-order.ts +129 -0
  2587. package/src/blocks/prediction-market/src/utils.ts +126 -0
  2588. package/src/blocks/project-folder/index.ts +4 -0
  2589. package/src/blocks/project-folder/src/ProjectFolder.vue +229 -0
  2590. package/src/blocks/project-folder/src/api-types.ts +4 -0
  2591. package/src/blocks/project-folder/src/use-project-folder.ts +167 -0
  2592. package/src/blocks/search-cursor.ts +45 -0
  2593. package/src/blocks/shared.ts +120 -0
  2594. package/src/blocks/signup-form/index.ts +6 -0
  2595. package/src/blocks/signup-form/src/SignUpForm.vue +272 -0
  2596. package/src/blocks/signup-form/src/api-types.ts +4 -0
  2597. package/src/blocks/signup-form/src/source-types.ts +11 -0
  2598. package/src/blocks/signup-form/src/types.ts +36 -0
  2599. package/src/blocks/signup-form/src/use-signup.ts +97 -0
  2600. package/src/blocks/swap/index.ts +7 -0
  2601. package/src/blocks/swap/src/ChainChip.vue +33 -0
  2602. package/src/blocks/swap/src/DestinationRow.vue +108 -0
  2603. package/src/blocks/swap/src/Field.vue +102 -0
  2604. package/src/blocks/swap/src/MultiChainSwap.vue +168 -0
  2605. package/src/blocks/swap/src/TokenDot.vue +30 -0
  2606. package/src/blocks/swap/src/TokenPicker.vue +194 -0
  2607. package/src/blocks/swap/src/api-types.ts +4 -0
  2608. package/src/blocks/swap/src/constants.ts +5 -0
  2609. package/src/blocks/swap/src/data.ts +52 -0
  2610. package/src/blocks/swap/src/types.ts +13 -0
  2611. package/src/blocks/swap/src/use-swap.ts +132 -0
  2612. package/src/blocks/swap/src/utils.ts +30 -0
  2613. package/src/blocks/swipeable-list/index.ts +12 -0
  2614. package/src/blocks/swipeable-list/src/SwipeableList.vue +82 -0
  2615. package/src/blocks/swipeable-list/src/SwipeableRow.vue +207 -0
  2616. package/src/blocks/swipeable-list/src/api-types.ts +4 -0
  2617. package/src/blocks/swipeable-list/src/gesture.ts +29 -0
  2618. package/src/blocks/swipeable-list/src/source-types.ts +12 -0
  2619. package/src/blocks/swipeable-list/src/use-swipe-row.ts +177 -0
  2620. package/src/blocks/wallet-card/index.ts +4 -0
  2621. package/src/blocks/wallet-card/src/AccountAvatar.vue +20 -0
  2622. package/src/blocks/wallet-card/src/AccountSwitcher.vue +131 -0
  2623. package/src/blocks/wallet-card/src/CopyButton.vue +41 -0
  2624. package/src/blocks/wallet-card/src/SearchBar.vue +141 -0
  2625. package/src/blocks/wallet-card/src/WalletCard.vue +187 -0
  2626. package/src/blocks/wallet-card/src/api-types.ts +4 -0
  2627. package/src/blocks/wallet-card/src/constants.ts +10 -0
  2628. package/src/blocks/wallet-card/src/use-wallet-panel.ts +54 -0
  2629. package/src/blocks/wallet-card/src/use-wallet.ts +53 -0
  2630. package/src/blocks/wallet-card/src/utils.ts +11 -0
  2631. package/src/charts/ChartTooltip.vue +184 -0
  2632. package/src/charts/bump-chart/index.ts +12 -0
  2633. package/src/charts/bump-chart/src/BumpChart.vue +19 -0
  2634. package/src/charts/bump-chart/src/BumpChartLegend.vue +71 -0
  2635. package/src/charts/bump-chart/src/BumpChartPlot.vue +168 -0
  2636. package/src/charts/bump-chart/src/BumpChartPoint.vue +152 -0
  2637. package/src/charts/bump-chart/src/BumpChartSeriesPath.vue +110 -0
  2638. package/src/charts/bump-chart/src/context.ts +64 -0
  2639. package/src/charts/bump-chart/src/model.ts +106 -0
  2640. package/src/charts/bump-chart/src/use-geometry.ts +70 -0
  2641. package/src/charts/candlestick-chart/index.ts +11 -0
  2642. package/src/charts/candlestick-chart/src/CandlestickChart.vue +52 -0
  2643. package/src/charts/candlestick-chart/src/CandlestickChartLegend.vue +46 -0
  2644. package/src/charts/candlestick-chart/src/CandlestickChartPlot.vue +209 -0
  2645. package/src/charts/candlestick-chart/src/context.ts +84 -0
  2646. package/src/charts/candlestick-chart/src/geometry.ts +38 -0
  2647. package/src/charts/composition-chart/index.ts +16 -0
  2648. package/src/charts/composition-chart/src/CompositionChart.vue +22 -0
  2649. package/src/charts/composition-chart/src/CompositionChartLegend.vue +54 -0
  2650. package/src/charts/composition-chart/src/CompositionChartPlot.vue +201 -0
  2651. package/src/charts/composition-chart/src/CompositionTooltipContent.vue +27 -0
  2652. package/src/charts/composition-chart/src/context.ts +71 -0
  2653. package/src/charts/composition-chart/src/model.ts +95 -0
  2654. package/src/charts/donut-chart/index.ts +19 -0
  2655. package/src/charts/donut-chart/src/DonutChart.vue +26 -0
  2656. package/src/charts/donut-chart/src/DonutChartCenter.vue +70 -0
  2657. package/src/charts/donut-chart/src/DonutChartLegend.vue +72 -0
  2658. package/src/charts/donut-chart/src/DonutChartPlot.vue +91 -0
  2659. package/src/charts/donut-chart/src/context.ts +58 -0
  2660. package/src/charts/donut-chart/src/model.ts +59 -0
  2661. package/src/charts/funnel-chart/index.ts +12 -0
  2662. package/src/charts/funnel-chart/src/FunnelChart.vue +22 -0
  2663. package/src/charts/funnel-chart/src/FunnelChartPlot.vue +138 -0
  2664. package/src/charts/funnel-chart/src/FunnelChartSummary.vue +22 -0
  2665. package/src/charts/funnel-chart/src/context.ts +38 -0
  2666. package/src/charts/funnel-chart/src/model.ts +67 -0
  2667. package/src/charts/heat-calendar/index.ts +19 -0
  2668. package/src/charts/heat-calendar/src/HeatCalendar.vue +23 -0
  2669. package/src/charts/heat-calendar/src/HeatCalendarGrid.vue +178 -0
  2670. package/src/charts/heat-calendar/src/HeatCalendarLegend.vue +40 -0
  2671. package/src/charts/heat-calendar/src/HeatCalendarTooltip.vue +42 -0
  2672. package/src/charts/heat-calendar/src/context.ts +84 -0
  2673. package/src/charts/heat-calendar/src/model.ts +136 -0
  2674. package/src/charts/heat-calendar/src/types.ts +26 -0
  2675. package/src/charts/heat-calendar/src/utils.ts +38 -0
  2676. package/src/charts/index.ts +14 -0
  2677. package/src/charts/liquidity-heatmap/index.ts +12 -0
  2678. package/src/charts/liquidity-heatmap/src/LiquidityHeatmap.vue +21 -0
  2679. package/src/charts/liquidity-heatmap/src/LiquidityHeatmapLegend.vue +21 -0
  2680. package/src/charts/liquidity-heatmap/src/LiquidityHeatmapPlot.vue +252 -0
  2681. package/src/charts/liquidity-heatmap/src/context.ts +50 -0
  2682. package/src/charts/liquidity-heatmap/src/model.ts +58 -0
  2683. package/src/charts/order-book/index.ts +35 -0
  2684. package/src/charts/order-book/src/OrderBook.vue +35 -0
  2685. package/src/charts/order-book/src/OrderBookBalance.vue +32 -0
  2686. package/src/charts/order-book/src/OrderBookDepthRow.vue +122 -0
  2687. package/src/charts/order-book/src/OrderBookDepthSummary.vue +29 -0
  2688. package/src/charts/order-book/src/OrderBookHeader.vue +16 -0
  2689. package/src/charts/order-book/src/OrderBookSide.vue +50 -0
  2690. package/src/charts/order-book/src/OrderBookSpread.vue +22 -0
  2691. package/src/charts/order-book/src/context.ts +94 -0
  2692. package/src/charts/order-book/src/model.ts +80 -0
  2693. package/src/charts/price-target-fan/index.ts +44 -0
  2694. package/src/charts/price-target-fan/src/PriceTargetFan.vue +56 -0
  2695. package/src/charts/price-target-fan/src/PriceTargetFanAxes.vue +73 -0
  2696. package/src/charts/price-target-fan/src/PriceTargetFanCursor.vue +37 -0
  2697. package/src/charts/price-target-fan/src/PriceTargetFanHeader.vue +34 -0
  2698. package/src/charts/price-target-fan/src/PriceTargetFanHistory.vue +55 -0
  2699. package/src/charts/price-target-fan/src/PriceTargetFanNow.vue +42 -0
  2700. package/src/charts/price-target-fan/src/PriceTargetFanPlot.vue +16 -0
  2701. package/src/charts/price-target-fan/src/PriceTargetFanSvg.vue +67 -0
  2702. package/src/charts/price-target-fan/src/PriceTargetFanTargets.vue +96 -0
  2703. package/src/charts/price-target-fan/src/PriceTargetFanTooltip.vue +52 -0
  2704. package/src/charts/price-target-fan/src/context.ts +150 -0
  2705. package/src/charts/price-target-fan/src/geometry.ts +127 -0
  2706. package/src/charts/price-target-fan/src/types.ts +32 -0
  2707. package/src/charts/price-target-fan/src/utils.ts +22 -0
  2708. package/src/charts/returns-calendar/index.ts +16 -0
  2709. package/src/charts/returns-calendar/src/ReturnsCalendar.vue +47 -0
  2710. package/src/charts/returns-calendar/src/ReturnsCalendarGrid.vue +226 -0
  2711. package/src/charts/returns-calendar/src/ReturnsCalendarTooltip.vue +46 -0
  2712. package/src/charts/returns-calendar/src/context.ts +71 -0
  2713. package/src/charts/returns-calendar/src/model.ts +101 -0
  2714. package/src/charts/returns-calendar/src/types.ts +24 -0
  2715. package/src/charts/returns-calendar/src/utils.ts +33 -0
  2716. package/src/charts/sankey-chart/index.ts +17 -0
  2717. package/src/charts/sankey-chart/src/SankeyChart.vue +47 -0
  2718. package/src/charts/sankey-chart/src/SankeyChartPlot.vue +330 -0
  2719. package/src/charts/sankey-chart/src/SankeyChartTooltip.vue +72 -0
  2720. package/src/charts/sankey-chart/src/context.ts +105 -0
  2721. package/src/charts/sankey-chart/src/model.ts +337 -0
  2722. package/src/charts/shared.ts +149 -0
  2723. package/src/charts/status-bar/index.ts +24 -0
  2724. package/src/charts/status-bar/src/StatusBar.vue +48 -0
  2725. package/src/charts/status-bar/src/StatusBarLegend.vue +38 -0
  2726. package/src/charts/status-bar/src/StatusBarPlot.vue +185 -0
  2727. package/src/charts/status-bar/src/StatusBarTooltip.vue +46 -0
  2728. package/src/charts/status-bar/src/context.ts +86 -0
  2729. package/src/charts/treemap/index.ts +26 -0
  2730. package/src/charts/treemap/src/Treemap.vue +48 -0
  2731. package/src/charts/treemap/src/TreemapCell.vue +93 -0
  2732. package/src/charts/treemap/src/TreemapLegend.vue +27 -0
  2733. package/src/charts/treemap/src/TreemapPlot.vue +130 -0
  2734. package/src/charts/treemap/src/TreemapTooltip.vue +45 -0
  2735. package/src/charts/treemap/src/context.ts +72 -0
  2736. package/src/charts/treemap/src/model.ts +214 -0
  2737. package/src/charts/volume-profile/index.ts +16 -0
  2738. package/src/charts/volume-profile/src/VolumeProfile.vue +58 -0
  2739. package/src/charts/volume-profile/src/VolumeProfilePlot.vue +225 -0
  2740. package/src/charts/volume-profile/src/VolumeProfileSummary.vue +45 -0
  2741. package/src/charts/volume-profile/src/VolumeProfileTooltip.vue +42 -0
  2742. package/src/charts/volume-profile/src/context.ts +66 -0
  2743. package/src/charts/volume-profile/src/model.ts +127 -0
  2744. package/src/index.ts +8 -0
  2745. package/src/lib/RenderContent.ts +13 -0
  2746. package/src/lib/composables.ts +153 -0
  2747. package/src/lib/ease.ts +36 -0
  2748. package/src/lib/layers.ts +64 -0
  2749. package/src/lib/utils.ts +11 -0
  2750. package/src/motion/_combobox/SearchSurface.vue +120 -0
  2751. package/src/motion/_combobox/controller.ts +231 -0
  2752. package/src/motion/_overlay/DialogSurface.vue +69 -0
  2753. package/src/motion/_overlay/FloatingSurface.vue +87 -0
  2754. package/src/motion/_overlay/index.ts +2 -0
  2755. package/src/motion/_overlay/interactivity.ts +20 -0
  2756. package/src/motion/action-swap/index.ts +17 -0
  2757. package/src/motion/action-swap/src/ActionSwapBlurButton.vue +15 -0
  2758. package/src/motion/action-swap/src/ActionSwapBlurIcon.vue +6 -0
  2759. package/src/motion/action-swap/src/ActionSwapBlurText.vue +6 -0
  2760. package/src/motion/action-swap/src/ActionSwapButton.vue +47 -0
  2761. package/src/motion/action-swap/src/ActionSwapCascadeButton.vue +15 -0
  2762. package/src/motion/action-swap/src/ActionSwapCascadeIcon.vue +6 -0
  2763. package/src/motion/action-swap/src/ActionSwapCascadeText.vue +6 -0
  2764. package/src/motion/action-swap/src/ActionSwapIcon.vue +12 -0
  2765. package/src/motion/action-swap/src/ActionSwapRollButton.vue +15 -0
  2766. package/src/motion/action-swap/src/ActionSwapRollIcon.vue +6 -0
  2767. package/src/motion/action-swap/src/ActionSwapRollText.vue +6 -0
  2768. package/src/motion/action-swap/src/ActionSwapText.vue +36 -0
  2769. package/src/motion/action-swap/src/api-types.ts +37 -0
  2770. package/src/motion/action-swap/src/poses.ts +14 -0
  2771. package/src/motion/action-swap/src/public-types.ts +9 -0
  2772. package/src/motion/adaptive-stepper/index.ts +8 -0
  2773. package/src/motion/adaptive-stepper/src/AdaptiveStepper.vue +49 -0
  2774. package/src/motion/adaptive-stepper/src/AdaptiveStepperDecrement.vue +4 -0
  2775. package/src/motion/adaptive-stepper/src/AdaptiveStepperIncrement.vue +4 -0
  2776. package/src/motion/adaptive-stepper/src/AdaptiveStepperValue.vue +25 -0
  2777. package/src/motion/adaptive-stepper/src/Liquid.vue +17 -0
  2778. package/src/motion/adaptive-stepper/src/LiquidItem.vue +43 -0
  2779. package/src/motion/adaptive-stepper/src/StepperAction.vue +30 -0
  2780. package/src/motion/adaptive-stepper/src/api-types.ts +7 -0
  2781. package/src/motion/adaptive-stepper/src/context.ts +7 -0
  2782. package/src/motion/adaptive-stepper/src/filter.ts +15 -0
  2783. package/src/motion/adaptive-stepper/src/liquid-context.ts +3 -0
  2784. package/src/motion/adaptive-stepper/src/public-types.ts +6 -0
  2785. package/src/motion/alert/index.ts +12 -0
  2786. package/src/motion/alert/src/Alert.vue +68 -0
  2787. package/src/motion/alert/src/AlertAction.vue +8 -0
  2788. package/src/motion/alert/src/AlertClose.vue +18 -0
  2789. package/src/motion/alert/src/AlertContent.vue +8 -0
  2790. package/src/motion/alert/src/AlertDescription.vue +8 -0
  2791. package/src/motion/alert/src/AlertIcon.vue +21 -0
  2792. package/src/motion/alert/src/AlertTitle.vue +8 -0
  2793. package/src/motion/alert/src/api-types.ts +22 -0
  2794. package/src/motion/alert/src/context.ts +9 -0
  2795. package/src/motion/alert/src/public-types.ts +9 -0
  2796. package/src/motion/alert/src/useAlert.ts +7 -0
  2797. package/src/motion/animated-badge/index.ts +5 -0
  2798. package/src/motion/animated-badge/src/AnimatedBadge.vue +66 -0
  2799. package/src/motion/animated-badge/src/api-types.ts +4 -0
  2800. package/src/motion/animated-badge/src/public-types.ts +3 -0
  2801. package/src/motion/animated-sidebar/index.ts +21 -0
  2802. package/src/motion/animated-sidebar/src/AnimatedSidebar.vue +101 -0
  2803. package/src/motion/animated-sidebar/src/AnimatedSidebarClose.vue +25 -0
  2804. package/src/motion/animated-sidebar/src/AnimatedSidebarContent.vue +10 -0
  2805. package/src/motion/animated-sidebar/src/AnimatedSidebarFooter.vue +8 -0
  2806. package/src/motion/animated-sidebar/src/AnimatedSidebarGroup.vue +7 -0
  2807. package/src/motion/animated-sidebar/src/AnimatedSidebarGroupContent.vue +9 -0
  2808. package/src/motion/animated-sidebar/src/AnimatedSidebarGroupLabel.vue +22 -0
  2809. package/src/motion/animated-sidebar/src/AnimatedSidebarHeader.vue +7 -0
  2810. package/src/motion/animated-sidebar/src/AnimatedSidebarInset.vue +11 -0
  2811. package/src/motion/animated-sidebar/src/AnimatedSidebarMenu.vue +16 -0
  2812. package/src/motion/animated-sidebar/src/AnimatedSidebarMenuButton.vue +126 -0
  2813. package/src/motion/animated-sidebar/src/AnimatedSidebarMenuItem.vue +15 -0
  2814. package/src/motion/animated-sidebar/src/AnimatedSidebarMenuSub.vue +42 -0
  2815. package/src/motion/animated-sidebar/src/AnimatedSidebarMenuSubButton.vue +63 -0
  2816. package/src/motion/animated-sidebar/src/AnimatedSidebarMenuSubItem.vue +14 -0
  2817. package/src/motion/animated-sidebar/src/AnimatedSidebarProvider.vue +54 -0
  2818. package/src/motion/animated-sidebar/src/AnimatedSidebarRail.vue +19 -0
  2819. package/src/motion/animated-sidebar/src/AnimatedSidebarTrigger.vue +33 -0
  2820. package/src/motion/animated-sidebar/src/MobileSidebar.vue +91 -0
  2821. package/src/motion/animated-sidebar/src/api-types.ts +28 -0
  2822. package/src/motion/animated-sidebar/src/context.ts +37 -0
  2823. package/src/motion/animated-sidebar/src/transitions.ts +34 -0
  2824. package/src/motion/animated-sidebar/src/use-sidebar-state.ts +81 -0
  2825. package/src/motion/animated-sidebar/src/useAnimatedSidebar.ts +1 -0
  2826. package/src/motion/animated-toast-stack/index.ts +4 -0
  2827. package/src/motion/animated-toast-stack/src/AnimatedToastStack.vue +91 -0
  2828. package/src/motion/animated-toast-stack/src/ToastItem.vue +221 -0
  2829. package/src/motion/animated-toast-stack/src/api-types.ts +4 -0
  2830. package/src/motion/animated-toast-stack/src/useAnimatedToastStack.ts +115 -0
  2831. package/src/motion/arc-picker/index.ts +5 -0
  2832. package/src/motion/arc-picker/src/ArcPicker.vue +43 -0
  2833. package/src/motion/arc-picker/src/api-types.ts +4 -0
  2834. package/src/motion/arc-picker/src/arc-control.ts +59 -0
  2835. package/src/motion/arc-picker/src/arc-layout.ts +28 -0
  2836. package/src/motion/aspect-ratio/index.ts +4 -0
  2837. package/src/motion/aspect-ratio/src/AspectRatio.vue +23 -0
  2838. package/src/motion/aspect-ratio/src/AspectRatioImage.vue +25 -0
  2839. package/src/motion/aspect-ratio/src/api-types.ts +7 -0
  2840. package/src/motion/bottom-sheet/index.ts +3 -0
  2841. package/src/motion/bottom-sheet/src/BottomSheet.vue +41 -0
  2842. package/src/motion/bottom-sheet/src/api-types.ts +4 -0
  2843. package/src/motion/bottom-sheet/src/snap.ts +11 -0
  2844. package/src/motion/bounce-sidebar/index.ts +5 -0
  2845. package/src/motion/bounce-sidebar/src/BounceSidebar.vue +62 -0
  2846. package/src/motion/bounce-sidebar/src/api-types.ts +4 -0
  2847. package/src/motion/bounce-sidebar/src/trajectory.ts +9 -0
  2848. package/src/motion/bouncy-accordion/index.ts +5 -0
  2849. package/src/motion/bouncy-accordion/src/BouncyAccordion.vue +30 -0
  2850. package/src/motion/bouncy-accordion/src/BouncyAccordionRow.vue +39 -0
  2851. package/src/motion/bouncy-accordion/src/api-types.ts +4 -0
  2852. package/src/motion/bouncy-accordion/src/public-types.ts +15 -0
  2853. package/src/motion/breadcrumb/index.ts +9 -0
  2854. package/src/motion/breadcrumb/src/Breadcrumb.vue +7 -0
  2855. package/src/motion/breadcrumb/src/BreadcrumbEllipsis.vue +70 -0
  2856. package/src/motion/breadcrumb/src/BreadcrumbItem.vue +26 -0
  2857. package/src/motion/breadcrumb/src/BreadcrumbLink.vue +8 -0
  2858. package/src/motion/breadcrumb/src/BreadcrumbList.vue +30 -0
  2859. package/src/motion/breadcrumb/src/BreadcrumbPage.vue +8 -0
  2860. package/src/motion/breadcrumb/src/BreadcrumbSeparator.vue +1 -0
  2861. package/src/motion/breadcrumb/src/api-types.ts +22 -0
  2862. package/src/motion/button/index.ts +11 -0
  2863. package/src/motion/button/src/Button.vue +55 -0
  2864. package/src/motion/button/src/ButtonLink.vue +15 -0
  2865. package/src/motion/button/src/Magnetic.vue +24 -0
  2866. package/src/motion/button/src/MagneticButton.vue +12 -0
  2867. package/src/motion/button/src/MetallicButton.vue +23 -0
  2868. package/src/motion/button/src/StatefulButton.vue +49 -0
  2869. package/src/motion/button/src/StatefulText.vue +49 -0
  2870. package/src/motion/button/src/api-types.ts +16 -0
  2871. package/src/motion/button/src/public-types.ts +3 -0
  2872. package/src/motion/card/index.ts +12 -0
  2873. package/src/motion/card/src/Card.vue +58 -0
  2874. package/src/motion/card/src/CardAction.vue +6 -0
  2875. package/src/motion/card/src/CardContent.vue +6 -0
  2876. package/src/motion/card/src/CardDescription.vue +6 -0
  2877. package/src/motion/card/src/CardFooter.vue +6 -0
  2878. package/src/motion/card/src/CardHeader.vue +6 -0
  2879. package/src/motion/card/src/CardTitle.vue +6 -0
  2880. package/src/motion/card/src/api-types.ts +22 -0
  2881. package/src/motion/card/src/parts.ts +11 -0
  2882. package/src/motion/center-morph-modal/index.ts +6 -0
  2883. package/src/motion/center-morph-modal/src/CenterMorphModal.vue +11 -0
  2884. package/src/motion/center-morph-modal/src/CenterMorphModalClose.vue +10 -0
  2885. package/src/motion/center-morph-modal/src/CenterMorphModalContent.vue +39 -0
  2886. package/src/motion/center-morph-modal/src/CenterMorphModalTrigger.vue +13 -0
  2887. package/src/motion/center-morph-modal/src/api-types.ts +13 -0
  2888. package/src/motion/center-morph-modal/src/context.ts +2 -0
  2889. package/src/motion/center-morph-modal/src/control.ts +9 -0
  2890. package/src/motion/checkbox/index.ts +3 -0
  2891. package/src/motion/checkbox/src/Checkbox.vue +55 -0
  2892. package/src/motion/checkbox/src/api-types.ts +4 -0
  2893. package/src/motion/collapsible/index.ts +9 -0
  2894. package/src/motion/collapsible/src/Collapsible.vue +24 -0
  2895. package/src/motion/collapsible/src/CollapsibleContent.vue +38 -0
  2896. package/src/motion/collapsible/src/CollapsibleIndicator.vue +14 -0
  2897. package/src/motion/collapsible/src/CollapsibleTrigger.vue +43 -0
  2898. package/src/motion/collapsible/src/api-types.ts +13 -0
  2899. package/src/motion/collapsible/src/context.ts +10 -0
  2900. package/src/motion/collapsible/src/public-types.ts +7 -0
  2901. package/src/motion/collapsible/src/useCollapsible.ts +7 -0
  2902. package/src/motion/color-picker/index.ts +16 -0
  2903. package/src/motion/color-picker/src/ChannelSlider.vue +73 -0
  2904. package/src/motion/color-picker/src/ColorPicker.vue +136 -0
  2905. package/src/motion/color-picker/src/ColorPickerAlpha.vue +25 -0
  2906. package/src/motion/color-picker/src/ColorPickerArea.vue +102 -0
  2907. package/src/motion/color-picker/src/ColorPickerChannels.vue +126 -0
  2908. package/src/motion/color-picker/src/ColorPickerContent.vue +174 -0
  2909. package/src/motion/color-picker/src/ColorPickerEyeDropper.vue +56 -0
  2910. package/src/motion/color-picker/src/ColorPickerHexInput.vue +61 -0
  2911. package/src/motion/color-picker/src/ColorPickerHue.vue +20 -0
  2912. package/src/motion/color-picker/src/ColorPickerPreset.vue +56 -0
  2913. package/src/motion/color-picker/src/ColorPickerPresets.vue +107 -0
  2914. package/src/motion/color-picker/src/ColorPickerSwatch.vue +14 -0
  2915. package/src/motion/color-picker/src/ColorPickerTrigger.vue +89 -0
  2916. package/src/motion/color-picker/src/ColorThumb.vue +85 -0
  2917. package/src/motion/color-picker/src/api-types.ts +37 -0
  2918. package/src/motion/color-picker/src/color.ts +70 -0
  2919. package/src/motion/color-picker/src/context.ts +134 -0
  2920. package/src/motion/color-picker/src/preset-motion.ts +28 -0
  2921. package/src/motion/color-picker/src/useColorPicker.ts +3 -0
  2922. package/src/motion/color-selector/index.ts +6 -0
  2923. package/src/motion/color-selector/src/ColorSelector.vue +78 -0
  2924. package/src/motion/color-selector/src/ColorSelectorItem.vue +33 -0
  2925. package/src/motion/color-selector/src/ColorSelectorLabel.vue +8 -0
  2926. package/src/motion/color-selector/src/ColorSelectorList.vue +8 -0
  2927. package/src/motion/color-selector/src/api-types.ts +13 -0
  2928. package/src/motion/color-selector/src/context.ts +8 -0
  2929. package/src/motion/combobox/index.ts +15 -0
  2930. package/src/motion/combobox/src/Combobox.vue +37 -0
  2931. package/src/motion/combobox/src/ComboboxContent.vue +19 -0
  2932. package/src/motion/combobox/src/ComboboxEmpty.vue +15 -0
  2933. package/src/motion/combobox/src/ComboboxGroup.vue +16 -0
  2934. package/src/motion/combobox/src/ComboboxInput.vue +81 -0
  2935. package/src/motion/combobox/src/ComboboxItem.vue +26 -0
  2936. package/src/motion/combobox/src/ComboboxLabel.vue +19 -0
  2937. package/src/motion/combobox/src/ComboboxList.vue +17 -0
  2938. package/src/motion/combobox/src/ComboboxSeparator.vue +3 -0
  2939. package/src/motion/combobox/src/ComboboxTrigger.vue +39 -0
  2940. package/src/motion/combobox/src/ComboboxValue.vue +25 -0
  2941. package/src/motion/combobox/src/SearchOption.vue +132 -0
  2942. package/src/motion/combobox/src/api-types.ts +34 -0
  2943. package/src/motion/combobox/src/public-types.ts +2 -0
  2944. package/src/motion/context-menu/index.ts +12 -0
  2945. package/src/motion/context-menu/src/ContextMenu.vue +10 -0
  2946. package/src/motion/context-menu/src/ContextMenuCheckboxItem.vue +24 -0
  2947. package/src/motion/context-menu/src/ContextMenuContent.vue +63 -0
  2948. package/src/motion/context-menu/src/ContextMenuItem.vue +11 -0
  2949. package/src/motion/context-menu/src/ContextMenuItemBase.vue +61 -0
  2950. package/src/motion/context-menu/src/ContextMenuLabel.vue +18 -0
  2951. package/src/motion/context-menu/src/ContextMenuRadioGroup.vue +12 -0
  2952. package/src/motion/context-menu/src/ContextMenuRadioItem.vue +22 -0
  2953. package/src/motion/context-menu/src/ContextMenuSeparator.vue +10 -0
  2954. package/src/motion/context-menu/src/ContextMenuShortcut.vue +16 -0
  2955. package/src/motion/context-menu/src/ContextMenuTrigger.vue +22 -0
  2956. package/src/motion/context-menu/src/api-types.ts +31 -0
  2957. package/src/motion/context-menu/src/menu-state.ts +38 -0
  2958. package/src/motion/context-menu/src/menu-surface.ts +65 -0
  2959. package/src/motion/context-menu/src/menu-trigger.ts +35 -0
  2960. package/src/motion/cylinder-carousel/index.ts +3 -0
  2961. package/src/motion/cylinder-carousel/src/CylinderCarousel.vue +53 -0
  2962. package/src/motion/cylinder-carousel/src/api-types.ts +4 -0
  2963. package/src/motion/cylinder-carousel/src/projection.ts +28 -0
  2964. package/src/motion/date-range-picker/index.ts +17 -0
  2965. package/src/motion/date-range-picker/src/CalendarChoices.vue +113 -0
  2966. package/src/motion/date-range-picker/src/CalendarPresence.vue +16 -0
  2967. package/src/motion/date-range-picker/src/DateRangePicker.vue +36 -0
  2968. package/src/motion/date-range-picker/src/DateRangePickerCalendar.vue +36 -0
  2969. package/src/motion/date-range-picker/src/DateRangePickerClear.vue +24 -0
  2970. package/src/motion/date-range-picker/src/DateRangePickerContent.vue +54 -0
  2971. package/src/motion/date-range-picker/src/DateRangePickerDropdown.vue +43 -0
  2972. package/src/motion/date-range-picker/src/DateRangePickerFooter.vue +25 -0
  2973. package/src/motion/date-range-picker/src/DateRangePickerGrid.vue +234 -0
  2974. package/src/motion/date-range-picker/src/DateRangePickerHeader.vue +90 -0
  2975. package/src/motion/date-range-picker/src/DateRangePickerPreset.vue +46 -0
  2976. package/src/motion/date-range-picker/src/DateRangePickerPresets.vue +23 -0
  2977. package/src/motion/date-range-picker/src/DateRangePickerSelection.vue +18 -0
  2978. package/src/motion/date-range-picker/src/DateRangePickerSummary.vue +48 -0
  2979. package/src/motion/date-range-picker/src/DateRangePickerTrigger.vue +73 -0
  2980. package/src/motion/date-range-picker/src/api-types.ts +40 -0
  2981. package/src/motion/date-range-picker/src/controller.ts +523 -0
  2982. package/src/motion/date-range-picker/src/date-utils.ts +45 -0
  2983. package/src/motion/date-range-picker/src/types.ts +8 -0
  2984. package/src/motion/date-range-picker/src/useDateRangePicker.ts +13 -0
  2985. package/src/motion/dock/LICENSE.simple-icons +30 -0
  2986. package/src/motion/dock/index.ts +5 -0
  2987. package/src/motion/dock/src/Dock.vue +8 -0
  2988. package/src/motion/dock/src/DockItem.vue +21 -0
  2989. package/src/motion/dock/src/DockSeparator.vue +4 -0
  2990. package/src/motion/dock/src/api-types.ts +7 -0
  2991. package/src/motion/dock/src/context.ts +2 -0
  2992. package/src/motion/drawer/index.ts +3 -0
  2993. package/src/motion/drawer/src/Drawer.vue +25 -0
  2994. package/src/motion/drawer/src/api-types.ts +4 -0
  2995. package/src/motion/expandable-control/index.ts +4 -0
  2996. package/src/motion/expandable-control/src/ExpandableButton.vue +31 -0
  2997. package/src/motion/expandable-control/src/ExpandableChip.vue +41 -0
  2998. package/src/motion/expandable-control/src/api-types.ts +7 -0
  2999. package/src/motion/expandable-control/src/transition.ts +1 -0
  3000. package/src/motion/expanding-arrow-button/index.ts +5 -0
  3001. package/src/motion/expanding-arrow-button/src/DottedChevron.vue +6 -0
  3002. package/src/motion/expanding-arrow-button/src/ExpandingArrowButton.vue +29 -0
  3003. package/src/motion/expanding-arrow-button/src/HoldActionButton.vue +43 -0
  3004. package/src/motion/expanding-arrow-button/src/SlideActionButton.vue +42 -0
  3005. package/src/motion/expanding-arrow-button/src/api-types.ts +10 -0
  3006. package/src/motion/file-tree/index.ts +7 -0
  3007. package/src/motion/file-tree/src/FileTree.vue +69 -0
  3008. package/src/motion/file-tree/src/FileTreeFile.vue +4 -0
  3009. package/src/motion/file-tree/src/FileTreeFolder.vue +4 -0
  3010. package/src/motion/file-tree/src/api-types.ts +10 -0
  3011. package/src/motion/file-tree/src/tree-model.ts +26 -0
  3012. package/src/motion/image-viewer/index.ts +14 -0
  3013. package/src/motion/image-viewer/src/ImageViewer.vue +21 -0
  3014. package/src/motion/image-viewer/src/ImageViewerCaption.vue +8 -0
  3015. package/src/motion/image-viewer/src/ImageViewerClose.vue +11 -0
  3016. package/src/motion/image-viewer/src/ImageViewerContent.vue +35 -0
  3017. package/src/motion/image-viewer/src/ImageViewerCounter.vue +7 -0
  3018. package/src/motion/image-viewer/src/ImageViewerFrame.vue +94 -0
  3019. package/src/motion/image-viewer/src/ImageViewerGallery.vue +10 -0
  3020. package/src/motion/image-viewer/src/ImageViewerNext.vue +11 -0
  3021. package/src/motion/image-viewer/src/ImageViewerPrevious.vue +11 -0
  3022. package/src/motion/image-viewer/src/ImageViewerSlide.vue +20 -0
  3023. package/src/motion/image-viewer/src/ImageViewerSurface.vue +21 -0
  3024. package/src/motion/image-viewer/src/ImageViewerThumbnail.vue +25 -0
  3025. package/src/motion/image-viewer/src/api-types.ts +13 -0
  3026. package/src/motion/image-viewer/src/context.ts +43 -0
  3027. package/src/motion/image-viewer/src/geometry.ts +10 -0
  3028. package/src/motion/image-viewer/src/opening-motion.ts +17 -0
  3029. package/src/motion/image-viewer/src/types.ts +9 -0
  3030. package/src/motion/image-viewer/src/useImageViewer.ts +9 -0
  3031. package/src/motion/image-viewer/src/viewer-state.ts +14 -0
  3032. package/src/motion/index.ts +54 -0
  3033. package/src/motion/input/index.ts +5 -0
  3034. package/src/motion/input/src/Input.vue +58 -0
  3035. package/src/motion/input/src/api-types.ts +4 -0
  3036. package/src/motion/input/src/public-types.ts +13 -0
  3037. package/src/motion/loader/index.ts +5 -0
  3038. package/src/motion/loader/src/Loader.vue +12 -0
  3039. package/src/motion/loader/src/LoaderSvg.vue +64 -0
  3040. package/src/motion/loader/src/api-types.ts +4 -0
  3041. package/src/motion/loader/src/clock.ts +39 -0
  3042. package/src/motion/loader/src/model.ts +29 -0
  3043. package/src/motion/loader/src/visuals.ts +88 -0
  3044. package/src/motion/marquee/index.ts +3 -0
  3045. package/src/motion/marquee/src/Marquee.vue +37 -0
  3046. package/src/motion/marquee/src/api-types.ts +4 -0
  3047. package/src/motion/morphing-modal/index.ts +3 -0
  3048. package/src/motion/morphing-modal/src/MorphingModal.vue +60 -0
  3049. package/src/motion/morphing-modal/src/api-types.ts +4 -0
  3050. package/src/motion/multi-select/index.ts +21 -0
  3051. package/src/motion/multi-select/src/MultiSelect.vue +37 -0
  3052. package/src/motion/multi-select/src/MultiSelectContent.vue +19 -0
  3053. package/src/motion/multi-select/src/MultiSelectEmpty.vue +15 -0
  3054. package/src/motion/multi-select/src/MultiSelectGroup.vue +16 -0
  3055. package/src/motion/multi-select/src/MultiSelectInput.vue +77 -0
  3056. package/src/motion/multi-select/src/MultiSelectItem.vue +26 -0
  3057. package/src/motion/multi-select/src/MultiSelectLabel.vue +19 -0
  3058. package/src/motion/multi-select/src/MultiSelectList.vue +18 -0
  3059. package/src/motion/multi-select/src/MultiSelectSeparator.vue +3 -0
  3060. package/src/motion/multi-select/src/MultiSelectTrigger.vue +41 -0
  3061. package/src/motion/multi-select/src/MultiSelectValue.vue +84 -0
  3062. package/src/motion/multi-select/src/api-types.ts +34 -0
  3063. package/src/motion/multi-select/src/public-types.ts +6 -0
  3064. package/src/motion/number/index.ts +9 -0
  3065. package/src/motion/number/src/AnimatedNumber.vue +22 -0
  3066. package/src/motion/number/src/DigitSwap.vue +39 -0
  3067. package/src/motion/number/src/NumberTicker.vue +40 -0
  3068. package/src/motion/number/src/NumberTickerDigit.vue +26 -0
  3069. package/src/motion/number/src/types.ts +39 -0
  3070. package/src/motion/number/src/view-gate.ts +20 -0
  3071. package/src/motion/popover/index.ts +8 -0
  3072. package/src/motion/popover/src/MorphPopover.vue +34 -0
  3073. package/src/motion/popover/src/MorphPopoverContent.vue +210 -0
  3074. package/src/motion/popover/src/MorphPopoverTrigger.vue +4 -0
  3075. package/src/motion/popover/src/Popover.vue +40 -0
  3076. package/src/motion/popover/src/PopoverContent.vue +189 -0
  3077. package/src/motion/popover/src/PopoverTrigger.vue +112 -0
  3078. package/src/motion/popover/src/api-types.ts +19 -0
  3079. package/src/motion/popover/src/context.ts +295 -0
  3080. package/src/motion/popover/src/geometry.ts +72 -0
  3081. package/src/motion/popover/src/morph-focus.ts +84 -0
  3082. package/src/motion/preview-rail/index.ts +5 -0
  3083. package/src/motion/preview-rail/src/PreviewRail.vue +35 -0
  3084. package/src/motion/preview-rail/src/api-types.ts +4 -0
  3085. package/src/motion/preview-rail/src/public-types.ts +2 -0
  3086. package/src/motion/preview-rail/src/rail-state.ts +26 -0
  3087. package/src/motion/pull-to-refresh/index.ts +5 -0
  3088. package/src/motion/pull-to-refresh/src/PullToRefresh.vue +22 -0
  3089. package/src/motion/pull-to-refresh/src/RefreshBuddy.vue +23 -0
  3090. package/src/motion/pull-to-refresh/src/api-types.ts +4 -0
  3091. package/src/motion/pull-to-refresh/src/public-types.ts +1 -0
  3092. package/src/motion/pull-to-refresh/src/pull-state.ts +41 -0
  3093. package/src/motion/radio/index.ts +4 -0
  3094. package/src/motion/radio/src/RadioGroup.vue +60 -0
  3095. package/src/motion/radio/src/RadioGroupItem.vue +45 -0
  3096. package/src/motion/radio/src/api-types.ts +7 -0
  3097. package/src/motion/radio/src/context.ts +10 -0
  3098. package/src/motion/range-slider/index.ts +9 -0
  3099. package/src/motion/range-slider/src/BubbleSlider.vue +20 -0
  3100. package/src/motion/range-slider/src/FluidSlider.vue +15 -0
  3101. package/src/motion/range-slider/src/InlineSlider.vue +12 -0
  3102. package/src/motion/range-slider/src/RangeSlider.vue +19 -0
  3103. package/src/motion/range-slider/src/RulerSlider.vue +30 -0
  3104. package/src/motion/range-slider/src/WaveSlider.vue +13 -0
  3105. package/src/motion/range-slider/src/api-types.ts +19 -0
  3106. package/src/motion/range-slider/src/inline-state.ts +44 -0
  3107. package/src/motion/range-slider/src/useSlider.ts +104 -0
  3108. package/src/motion/range-slider/src/visual-state.ts +18 -0
  3109. package/src/motion/scroll-animation/index.ts +10 -0
  3110. package/src/motion/scroll-animation/src/Parallax.vue +48 -0
  3111. package/src/motion/scroll-animation/src/ScrollProgress.vue +39 -0
  3112. package/src/motion/scroll-animation/src/ScrollReveal.vue +38 -0
  3113. package/src/motion/scroll-animation/src/ScrollTo.vue +10 -0
  3114. package/src/motion/scroll-animation/src/SmoothScroll.vue +14 -0
  3115. package/src/motion/scroll-animation/src/api-types.ts +16 -0
  3116. package/src/motion/scroll-animation/src/public-types.ts +9 -0
  3117. package/src/motion/scroll-animation/src/useSmoothScroll.ts +125 -0
  3118. package/src/motion/select/index.ts +13 -0
  3119. package/src/motion/select/src/MorphSelect.vue +20 -0
  3120. package/src/motion/select/src/MorphSelectContent.vue +74 -0
  3121. package/src/motion/select/src/MorphSelectItem.vue +12 -0
  3122. package/src/motion/select/src/MorphSelectTrigger.vue +54 -0
  3123. package/src/motion/select/src/MorphSelectValue.vue +20 -0
  3124. package/src/motion/select/src/Select.vue +20 -0
  3125. package/src/motion/select/src/SelectContent.vue +106 -0
  3126. package/src/motion/select/src/SelectItem.vue +78 -0
  3127. package/src/motion/select/src/SelectRegistrar.vue +12 -0
  3128. package/src/motion/select/src/SelectTrigger.vue +71 -0
  3129. package/src/motion/select/src/SelectValue.vue +16 -0
  3130. package/src/motion/select/src/api-types.ts +31 -0
  3131. package/src/motion/select/src/context.ts +308 -0
  3132. package/src/motion/select/src/unfold.ts +25 -0
  3133. package/src/motion/shader-background/LICENSE.paper-design +164 -0
  3134. package/src/motion/shader-background/index.ts +5 -0
  3135. package/src/motion/shader-background/src/ShaderBackground.vue +54 -0
  3136. package/src/motion/shader-background/src/api-types.ts +60 -0
  3137. package/src/motion/shader-background/src/presets.ts +66 -0
  3138. package/src/motion/shader-background/src/shader-session.ts +65 -0
  3139. package/src/motion/shared-layout-bg/index.ts +3 -0
  3140. package/src/motion/shared-layout-bg/src/SharedLayoutBg.vue +55 -0
  3141. package/src/motion/shared-layout-bg/src/api-types.ts +4 -0
  3142. package/src/motion/sortable-stack/index.ts +10 -0
  3143. package/src/motion/sortable-stack/src/SortableList.vue +40 -0
  3144. package/src/motion/sortable-stack/src/SortableListGroup.vue +6 -0
  3145. package/src/motion/sortable-stack/src/SortableListHandle.vue +16 -0
  3146. package/src/motion/sortable-stack/src/SortableListItem.vue +18 -0
  3147. package/src/motion/sortable-stack/src/SortableListItemContent.vue +4 -0
  3148. package/src/motion/sortable-stack/src/SortableListUndo.vue +12 -0
  3149. package/src/motion/sortable-stack/src/api-types.ts +22 -0
  3150. package/src/motion/sortable-stack/src/context.ts +6 -0
  3151. package/src/motion/sortable-stack/src/useSortableList.ts +6 -0
  3152. package/src/motion/state.ts +41 -0
  3153. package/src/motion/switch/index.ts +3 -0
  3154. package/src/motion/switch/src/Switch.vue +48 -0
  3155. package/src/motion/switch/src/api-types.ts +4 -0
  3156. package/src/motion/table/index.ts +2 -0
  3157. package/src/motion/table/src/EditableCell.vue +16 -0
  3158. package/src/motion/table/src/SkeletonRows.vue +39 -0
  3159. package/src/motion/table/src/Table.vue +262 -0
  3160. package/src/motion/table/src/TableHandle.vue +63 -0
  3161. package/src/motion/table/src/TableHeader.vue +206 -0
  3162. package/src/motion/table/src/TableMenu.vue +73 -0
  3163. package/src/motion/table/src/types.ts +86 -0
  3164. package/src/motion/table/src/use-table-menu.ts +97 -0
  3165. package/src/motion/table/src/use-table.ts +309 -0
  3166. package/src/motion/table/src/useTableColumns.ts +176 -0
  3167. package/src/motion/tabs/index.ts +4 -0
  3168. package/src/motion/tabs/src/Tabs.vue +22 -0
  3169. package/src/motion/tabs/src/TabsContent.vue +15 -0
  3170. package/src/motion/tabs/src/TabsList.vue +23 -0
  3171. package/src/motion/tabs/src/TabsTrigger.vue +28 -0
  3172. package/src/motion/tabs/src/TriggerContent.vue +12 -0
  3173. package/src/motion/tabs/src/context.ts +6 -0
  3174. package/src/motion/tabs/src/list-state.ts +50 -0
  3175. package/src/motion/text-animation/index.ts +7 -0
  3176. package/src/motion/text-animation/src/ChromaticTextReveal.vue +31 -0
  3177. package/src/motion/text-animation/src/TextCascade.vue +7 -0
  3178. package/src/motion/text-animation/src/TextReveal.vue +15 -0
  3179. package/src/motion/text-animation/src/TextScramble.vue +31 -0
  3180. package/src/motion/text-animation/src/TextShimmer.vue +13 -0
  3181. package/src/motion/text-animation/src/api-types.ts +16 -0
  3182. package/src/motion/text-animation/src/reveal-sequence.ts +13 -0
  3183. package/src/motion/theme-toggle/index.ts +6 -0
  3184. package/src/motion/theme-toggle/src/ThemeToggle.vue +31 -0
  3185. package/src/motion/theme-toggle/src/api-types.ts +4 -0
  3186. package/src/motion/theme-toggle/src/useThemeToggle.ts +72 -0
  3187. package/src/motion/theme-toggle/styles/theme.css +33 -0
  3188. package/src/motion/tilt-card/index.ts +3 -0
  3189. package/src/motion/tilt-card/src/TiltCard.vue +38 -0
  3190. package/src/motion/tilt-card/src/api-types.ts +4 -0
  3191. package/src/motion/timeline/index.ts +5 -0
  3192. package/src/motion/timeline/src/Timeline.vue +267 -0
  3193. package/src/motion/timeline/src/api-types.ts +4 -0
  3194. package/src/motion/timeline/src/track.ts +392 -0
  3195. package/src/motion/tooltip/index.ts +15 -0
  3196. package/src/motion/tooltip/src/Tooltip.vue +53 -0
  3197. package/src/motion/tooltip/src/TooltipContent.vue +83 -0
  3198. package/src/motion/tooltip/src/TooltipProvider.vue +24 -0
  3199. package/src/motion/tooltip/src/TooltipTrigger.vue +61 -0
  3200. package/src/motion/tooltip/src/api-types.ts +7 -0
  3201. package/src/motion/tooltip/src/context.ts +411 -0
  3202. package/src/motion/tooltip/src/grace.ts +64 -0
  3203. package/src/motion/tooltip/src/position.ts +206 -0
  3204. package/src/motion/wheel-picker/index.ts +5 -0
  3205. package/src/motion/wheel-picker/src/WheelPicker.vue +30 -0
  3206. package/src/motion/wheel-picker/src/api-types.ts +4 -0
  3207. package/src/motion/wheel-picker/src/drum-state.ts +57 -0
  3208. package/src/motion/wheel-picker/src/tick-sound.ts +49 -0
  3209. package/src/styles.css +113 -0
  3210. package/src/theme/palettes.ts +810 -0
  3211. package/src/theme/stylesheet.ts +14 -0
  3212. package/src/tokens.css +772 -0
@@ -0,0 +1,1344 @@
1
+ {
2
+ "$schema": "https://shadcn-vue.com/schema/registry-item.json",
3
+ "name": "chat-app",
4
+ "type": "registry:component",
5
+ "title": "Chat App",
6
+ "description": "Compose navigation, conversation content and a prompt area into an assistant workspace.",
7
+ "files": [
8
+ {
9
+ "path": "registry/orvui/agents/agent-activity/index.ts",
10
+ "target": "~/src/components/orvui/agents/agent-activity/index.ts",
11
+ "type": "registry:lib",
12
+ "content": "export { default as AgentActivity } from \"./src/AgentActivity.vue\";\nexport * from \"./src/types\";\n"
13
+ },
14
+ {
15
+ "path": "registry/orvui/agents/agent-activity/src/ActivityRow.vue",
16
+ "target": "~/src/components/orvui/agents/agent-activity/src/ActivityRow.vue",
17
+ "type": "registry:component",
18
+ "content": "<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { AnimatePresence, motion } from \"motion-v\";\nimport {\n Check,\n Circle,\n FileText,\n Globe2,\n ImageIcon,\n MessageSquare,\n PencilLine,\n Search,\n Sparkles,\n SquareTerminal,\n Wrench,\n} from \"lucide-vue-next\";\nimport { EASE_OUT, SPRING_LAYOUT } from \"../../../lib/ease\";\nimport { cn } from \"../../../lib/utils\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nimport { RenderNode } from \"../../shared\";\nimport type { AgentActivityItem } from \"./types\";\nconst props = defineProps<{ item: AgentActivityItem }>();\nconst reduced = useReducedMotion();\nconst transition = computed(() =>\n reduced.value\n ? { duration: 0 }\n : {\n opacity: { duration: 0.18, ease: EASE_OUT },\n y: SPRING_LAYOUT,\n layout: SPRING_LAYOUT,\n },\n);\nconst toolIcons = {\n read: FileText,\n edit: PencilLine,\n write: PencilLine,\n run: SquareTerminal,\n};\nconst traceIcons = {\n thinking: Sparkles,\n message: MessageSquare,\n write: PencilLine,\n run: SquareTerminal,\n read: ImageIcon,\n};\nconst icon = computed(() =>\n props.item.type === \"tool\"\n ? (toolIcons[props.item.action as keyof typeof toolIcons] ?? Wrench)\n : props.item.type === \"trace\"\n ? (traceIcons[props.item.kind as keyof typeof traceIcons] ?? Wrench)\n : Wrench,\n);\n</script>\n<template>\n <div\n v-if=\"item.type === 'step'\"\n class=\"flex min-h-7 items-start gap-2.5 rounded-md px-1.5 py-1\"\n >\n <span\n aria-hidden=\"true\"\n class=\"mt-0.5 grid size-4 shrink-0 place-items-center text-muted-foreground/70\"\n ><Check\n v-if=\"!item.status || item.status === 'complete'\"\n class=\"size-4\"\n :stroke-width=\"1.8\" /><span\n v-else-if=\"item.status === 'active'\"\n class=\"relative grid size-3 place-items-center\"\n ><motion.span\n class=\"absolute inset-0 rounded-full bg-foreground/10\"\n :animate=\"\n reduced ? { opacity: 0.55 } : { opacity: [0.35, 0.8, 0.35] }\n \"\n :transition=\"\n reduced ? { duration: 0 } : { duration: 1.5, repeat: Infinity }\n \" /><span class=\"size-1.5 rounded-full bg-foreground/60\" /></span\n ><Circle v-else class=\"size-3\" :stroke-width=\"1.5\" /></span\n ><span\n :class=\"\n cn(\n 'min-w-0 flex-1 leading-5',\n item.status === 'pending'\n ? 'text-muted-foreground/55'\n : 'text-foreground/90',\n )\n \"\n ><RenderNode :node=\"item.label\" /></span\n ><span v-if=\"item.meta\" class=\"shrink-0 leading-5 text-muted-foreground/55\"\n ><RenderNode :node=\"item.meta\"\n /></span>\n </div>\n <div\n v-else-if=\"item.type === 'text'\"\n class=\"rounded-md px-1.5 py-1 leading-5 text-muted-foreground\"\n >\n <RenderNode :node=\"item.content\" />\n </div>\n <div v-else-if=\"item.type === 'search'\" class=\"space-y-0.5\">\n <div\n class=\"flex min-h-7 items-center gap-2.5 rounded-md px-1.5 py-1 text-muted-foreground\"\n >\n <Search\n aria-hidden=\"true\"\n class=\"size-4 shrink-0\"\n :stroke-width=\"1.7\"\n /><span class=\"min-w-0 truncate\"><RenderNode :node=\"item.query\" /></span>\n </div>\n <div v-if=\"item.results?.length\" class=\"space-y-0.5 pl-4\">\n <AnimatePresence mode=\"popLayout\"\n ><motion.div\n v-for=\"result in item.results\"\n :key=\"result.id\"\n layout=\"position\"\n :initial=\"reduced ? { opacity: 1 } : { opacity: 0, y: 6 }\"\n :animate=\"{ opacity: 1, y: 0 }\"\n :exit=\"reduced ? { opacity: 0 } : { opacity: 0, y: -3 }\"\n :transition=\"transition\"\n >\n <component\n :is=\"result.url ? 'a' : 'div'\"\n :href=\"result.url\"\n :class=\"\n cn(\n 'flex min-h-7 items-center gap-2 rounded-md px-1.5 py-1 text-left outline-none transition-colors',\n result.url && 'focus-visible:ring-2 focus-visible:ring-ring',\n )\n \"\n ><span\n aria-hidden=\"true\"\n class=\"grid size-5 shrink-0 place-items-center text-muted-foreground\"\n ><RenderNode v-if=\"result.icon\" :node=\"result.icon\" /><Globe2\n v-else\n class=\"size-3\"\n :stroke-width=\"2\" /></span\n ><span class=\"min-w-0 truncate font-medium text-foreground/90\"\n ><RenderNode :node=\"result.title\" /></span\n ><span\n v-if=\"result.domain\"\n class=\"min-w-0 truncate text-muted-foreground/55\"\n ><RenderNode :node=\"result.domain\" /></span\n ></component> </motion.div\n ></AnimatePresence>\n </div>\n <AnimatePresence as=\"div\" class=\"contents\"\n ><motion.div\n v-if=\"item.moreCount\"\n key=\"more-results\"\n class=\"px-1.5 py-1 pl-8 text-muted-foreground/55\"\n :initial=\"reduced ? { opacity: 1 } : { opacity: 0, y: 6 }\"\n :animate=\"{ opacity: 1, y: 0 }\"\n :exit=\"reduced ? { opacity: 0 } : { opacity: 0, y: -3 }\"\n :transition=\"transition\"\n >+{{ item.moreCount }} more</motion.div\n ></AnimatePresence\n >\n </div>\n <div\n v-else-if=\"item.type === 'tool'\"\n class=\"flex min-h-8 min-w-0 items-center gap-2.5 rounded-md px-1.5 py-0.5 leading-5\"\n >\n <span\n aria-hidden=\"true\"\n class=\"grid size-4 shrink-0 place-items-center text-muted-foreground/70\"\n ><component :is=\"icon\" class=\"size-4\" /></span\n ><span class=\"shrink-0 font-medium text-foreground/90\">{{\n item.action[0].toUpperCase() + item.action.slice(1)\n }}</span\n ><span\n class=\"min-w-0 flex-1 truncate rounded-lg bg-muted/80 px-2.5 py-1 font-mono text-xs text-muted-foreground/70\"\n ><RenderNode :node=\"item.target\" /></span\n ><span\n v-if=\"\n typeof item.additions === 'number' || typeof item.deletions === 'number'\n \"\n class=\"flex shrink-0 items-center gap-2 font-mono tabular-nums\"\n ><span v-if=\"typeof item.additions === 'number'\" class=\"text-emerald-500\"\n >+{{ item.additions }}</span\n ><span v-if=\"typeof item.deletions === 'number'\" class=\"text-rose-500\"\n >−{{ item.deletions }}</span\n ></span\n >\n </div>\n <div\n v-else\n class=\"grid min-h-8 grid-cols-[1rem_auto_minmax(0,1fr)] items-center gap-2.5 rounded-md px-1.5 py-0.5\"\n >\n <span\n aria-hidden=\"true\"\n class=\"grid size-4 place-items-center text-muted-foreground/70\"\n ><RenderNode v-if=\"item.icon\" :node=\"item.icon\" /><component\n v-else\n :is=\"icon\"\n class=\"size-4\" /></span\n ><span class=\"font-medium text-foreground/90\"\n ><RenderNode :node=\"item.label\" /></span\n ><span\n v-if=\"item.detail\"\n class=\"min-w-0 truncate rounded-lg bg-muted/80 px-2.5 py-1 font-mono text-xs text-muted-foreground/70\"\n ><RenderNode :node=\"item.detail\" /></span\n ><span v-else />\n </div>\n</template>\n"
19
+ },
20
+ {
21
+ "path": "registry/orvui/agents/agent-activity/src/AgentActivity.vue",
22
+ "target": "~/src/components/orvui/agents/agent-activity/src/AgentActivity.vue",
23
+ "type": "registry:component",
24
+ "content": "<script setup lang=\"ts\">\nimport {\n computed,\n onBeforeUnmount,\n onMounted,\n ref,\n useId,\n watch,\n type VNodeChild,\n} from \"vue\";\nimport { AnimatePresence, motion } from \"motion-v\";\nimport { ChevronDown } from \"lucide-vue-next\";\nimport { resolveElement, useReducedMotion } from \"../../../lib/composables\";\nimport { EASE_OUT, SPRING_LAYOUT, SPRING_SWAP } from \"../../../lib/ease\";\nimport { cn } from \"../../../lib/utils\";\nimport { RenderNode, useControllable, type Content } from \"../../shared\";\nimport { ThinkingShimmer } from \"../../loading-states\";\nimport AgentDisclosure from \"../../AgentDisclosure.vue\";\nimport ActivityRow from \"./ActivityRow.vue\";\nimport { activityKind, activitySummary } from \"./summary\";\nimport type {\n AgentActivityContentType,\n AgentActivityItem,\n AgentActivityStatus,\n} from \"./types\";\ndefineSlots<{\n \"working-status\"?: (context: {\n label: Content;\n duration: number;\n }) => VNodeChild;\n \"completed-status\"?: (context: {\n summary: Content;\n duration: number;\n }) => VNodeChild;\n}>();\nconst props = withDefaults(\n defineProps<{\n items: AgentActivityItem[];\n contentType?: AgentActivityContentType;\n status?: AgentActivityStatus;\n duration?: number;\n open?: boolean;\n defaultOpen?: boolean;\n collapseOnComplete?: boolean;\n activeLabel?: Content;\n summary?: Content;\n maxHeight?: number;\n contentClassName?: string;\n }>(),\n {\n open: undefined,\n activeLabel: undefined,\n summary: undefined,\n status: \"working\",\n duration: 0,\n defaultOpen: false,\n collapseOnComplete: true,\n maxHeight: 208,\n },\n);\nconst emit = defineEmits<{\n \"update:open\": [open: boolean];\n openChange: [open: boolean];\n}>();\nconst disclosure = useControllable(\n () => props.open,\n props.defaultOpen,\n (value) => {\n emit(\"update:open\", value);\n emit(\"openChange\", value);\n },\n);\nconst working = computed(() => props.status === \"working\");\nconst expanded = computed(() => working.value || disclosure.value);\nconst kind = computed(() => activityKind(props.items, props.contentType));\nconst label = computed(\n () =>\n props.activeLabel ??\n {\n search: \"Searching the web…\",\n tool: \"Running tools…\",\n trace: \"Working through the run…\",\n mixed: \"Working through it…\",\n step: \"Thinking…\",\n text: \"Thinking…\",\n }[kind.value],\n);\nconst summary = computed(\n () =>\n props.summary ?? activitySummary(props.items, kind.value, props.duration),\n);\nconst reduced = useReducedMotion();\nconst identity = useId();\nconst content = ref<unknown>();\nconst viewport = ref<HTMLElement>();\nconst measuredHeight = ref(0);\nconst height = computed(() =>\n working.value\n ? Math.max(0, props.maxHeight)\n : Math.min(Math.max(0, props.maxHeight), measuredHeight.value),\n);\nconst capped = computed(() => measuredHeight.value > props.maxHeight);\nconst offset = computed(() =>\n working.value ? Math.min(0, height.value - measuredHeight.value) : 0,\n);\nconst mask = computed(() =>\n !capped.value\n ? undefined\n : working.value\n ? \"linear-gradient(to bottom, transparent, black 12px)\"\n : \"linear-gradient(to bottom, transparent, black 12px, black calc(100% - 12px), transparent)\",\n);\nlet observer: ResizeObserver | undefined;\nlet queued: number | undefined;\nwatch(\n () => props.status,\n (status, previous) => {\n if (previous === \"working\" && status === \"complete\")\n disclosure.value = !props.collapseOnComplete;\n },\n);\nfunction toggle() {\n disclosure.value = !disclosure.value;\n if (queued !== undefined) cancelAnimationFrame(queued);\n if (disclosure.value)\n queued = requestAnimationFrame(() => {\n queued = undefined;\n viewport.value?.scrollTo?.({ top: 0 });\n });\n}\nonMounted(() => {\n const element = resolveElement<HTMLElement>(content.value);\n if (!element) return;\n const measure = () => {\n measuredHeight.value = element.offsetHeight;\n };\n measure();\n if (typeof ResizeObserver !== \"undefined\") {\n observer = new ResizeObserver(measure);\n observer.observe(element);\n }\n});\nonBeforeUnmount(() => {\n observer?.disconnect();\n if (queued !== undefined) cancelAnimationFrame(queued);\n});\n</script>\n<template>\n <div\n :data-state=\"working ? 'working' : expanded ? 'open' : 'closed'\"\n :data-content=\"kind\"\n :aria-busy=\"working\"\n class=\"w-full text-sm\"\n >\n <div\n v-if=\"working\"\n :id=\"`${identity}-trigger`\"\n role=\"status\"\n class=\"flex h-7 min-w-0 items-center text-muted-foreground\"\n >\n <slot name=\"working-status\" :label=\"label\" :duration=\"duration\"\n ><ThinkingShimmer><RenderNode :node=\"label\" /></ThinkingShimmer\n ></slot>\n </div>\n <button\n v-else\n :id=\"`${identity}-trigger`\"\n type=\"button\"\n :aria-expanded=\"expanded\"\n :aria-controls=\"`${identity}-content`\"\n @click=\"toggle\"\n class=\"group flex h-7 min-w-0 items-center gap-1.5 rounded-md text-left font-medium text-muted-foreground outline-none transition-colors hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n >\n <span class=\"truncate\"\n ><slot name=\"completed-status\" :summary=\"summary\" :duration=\"duration\"\n ><RenderNode :node=\"summary\" /></slot></span\n ><motion.span\n aria-hidden=\"true\"\n class=\"inline-flex shrink-0 text-muted-foreground/70 group-hover:text-foreground\"\n :animate=\"{ rotate: expanded ? 180 : 0 }\"\n :transition=\"reduced ? { duration: 0 } : SPRING_SWAP\"\n ><ChevronDown class=\"size-3.5\"\n /></motion.span>\n </button>\n <AgentDisclosure\n :id=\"`${identity}-content`\"\n role=\"region\"\n :aria-labelledby=\"`${identity}-trigger`\"\n :open=\"expanded\"\n :open-height=\"height\"\n ><div\n ref=\"viewport\"\n :class=\"\n cn(\n 'scrollbar-hide pr-1',\n capped && expanded && !working\n ? 'overflow-y-auto'\n : 'overflow-y-hidden',\n )\n \"\n :style=\"{\n height: `${height}px`,\n maskImage: mask,\n WebkitMaskImage: mask,\n }\"\n >\n <motion.div\n ref=\"content\"\n role=\"list\"\n :initial=\"false\"\n :animate=\"{ y: offset }\"\n :transition=\"reduced ? { duration: 0 } : SPRING_LAYOUT\"\n :class=\"cn('space-y-0.5 py-2', contentClassName)\"\n ><AnimatePresence mode=\"popLayout\" as=\"div\" class=\"contents\">\n <motion.div\n v-for=\"item in items\"\n :key=\"item.id\"\n layout=\"position\"\n role=\"listitem\"\n :initial=\"reduced ? { opacity: 1 } : { opacity: 0, y: 6 }\"\n :animate=\"{ opacity: 1, y: 0 }\"\n :exit=\"reduced ? { opacity: 0 } : { opacity: 0, y: -3 }\"\n :transition=\"\n reduced\n ? { duration: 0 }\n : {\n opacity: { duration: 0.18, ease: EASE_OUT },\n y: SPRING_LAYOUT,\n layout: SPRING_LAYOUT,\n }\n \"\n ><ActivityRow :item=\"item\"\n /></motion.div> </AnimatePresence\n ></motion.div></div\n ></AgentDisclosure>\n </div>\n</template>\n"
25
+ },
26
+ {
27
+ "path": "registry/orvui/agents/agent-activity/src/summary.ts",
28
+ "target": "~/src/components/orvui/agents/agent-activity/src/summary.ts",
29
+ "type": "registry:lib",
30
+ "content": "import type { Content } from \"../../shared\";\nimport type { AgentActivityContentType, AgentActivityItem } from \"./types\";\nexport function activityKind(\n items: AgentActivityItem[],\n empty: AgentActivityContentType = \"mixed\",\n): AgentActivityContentType {\n if (!items.length) return empty;\n const first = items[0].type;\n return items.some((item) => item.type !== first) ? \"mixed\" : first;\n}\nexport function activitySummary(\n items: AgentActivityItem[],\n kind: AgentActivityContentType,\n duration: number,\n): Content {\n switch (kind) {\n case \"text\":\n case \"step\": {\n const seconds = Math.max(0, Math.round(duration));\n const parts =\n seconds < 60\n ? `${seconds}s`\n : `${Math.floor(seconds / 60)}m${seconds % 60 ? ` ${seconds % 60}s` : \"\"}`;\n return `Thought for ${parts}`;\n }\n case \"search\":\n return \"Searched the web\";\n case \"tool\":\n return `Ran ${items.length} ${items.length === 1 ? \"tool\" : \"tools\"}`;\n case \"trace\": {\n const messages = items.reduce(\n (count, item) =>\n count +\n Number(\n item.type === \"trace\" &&\n [\"thinking\", \"message\"].includes(item.kind),\n ),\n 0,\n );\n const calls = items.length - messages;\n return `${calls} ${calls === 1 ? \"tool call\" : \"tool calls\"}, ${messages} ${messages === 1 ? \"message\" : \"messages\"}`;\n }\n default:\n return `Completed ${items.length} ${items.length === 1 ? \"step\" : \"steps\"}`;\n }\n}\n"
31
+ },
32
+ {
33
+ "path": "registry/orvui/agents/agent-activity/src/types.ts",
34
+ "target": "~/src/components/orvui/agents/agent-activity/src/types.ts",
35
+ "type": "registry:lib",
36
+ "content": "import type { Content } from \"../../shared\";\n\nexport type AgentActivityStatus = \"working\" | \"complete\";\nexport type AgentStepStatus = \"pending\" | \"active\" | \"complete\";\n\nexport interface AgentActivityStep {\n id: string;\n type: \"step\";\n label: Content;\n status?: AgentStepStatus;\n meta?: Content;\n}\n\nexport interface AgentActivityText {\n id: string;\n type: \"text\";\n content: Content;\n}\n\nexport interface AgentSearchResult {\n id: string;\n title: Content;\n domain?: Content;\n url?: string;\n icon?: Content;\n}\n\nexport interface AgentActivitySearch {\n id: string;\n type: \"search\";\n query: Content;\n results?: AgentSearchResult[];\n moreCount?: number;\n}\n\nexport interface AgentActivityTool {\n id: string;\n type: \"tool\";\n action: \"read\" | \"edit\" | \"run\" | (string & {});\n target: Content;\n additions?: number;\n deletions?: number;\n}\n\nexport type AgentTraceKind =\n \"thinking\" | \"message\" | \"write\" | \"run\" | \"read\" | (string & {});\n\nexport interface AgentActivityTrace {\n id: string;\n type: \"trace\";\n kind: AgentTraceKind;\n label: Content;\n detail?: Content;\n icon?: Content;\n}\n\nexport type AgentActivityItem =\n | AgentActivityStep\n | AgentActivityText\n | AgentActivitySearch\n | AgentActivityTool\n | AgentActivityTrace;\n\nexport type AgentActivityContentType = AgentActivityItem[\"type\"] | \"mixed\";\n\n/** Vue props; working-status/completed-status content is passed through scoped slots. */\nexport type AgentActivityProps = InstanceType<\n (typeof import(\"./AgentActivity.vue\"))[\"default\"]\n>[\"$props\"];\n"
37
+ },
38
+ {
39
+ "path": "registry/orvui/agents/AgentDisclosure.vue",
40
+ "target": "~/src/components/orvui/agents/AgentDisclosure.vue",
41
+ "type": "registry:component",
42
+ "content": "<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { motion } from \"motion-v\";\nimport { EASE_OUT } from \"../lib/ease\";\nimport { useReduced } from \"./shared\";\nconst props = withDefaults(\n defineProps<{\n open: boolean;\n maxHeight?: number;\n openHeight?: string | number;\n }>(),\n { openHeight: \"auto\" },\n);\nconst reduce = useReduced();\nconst height = computed(() =>\n !props.open\n ? \"0px\"\n : typeof props.openHeight === \"number\"\n ? `${props.openHeight}px`\n : props.openHeight,\n);\nconst animation = computed(() => {\n const opacity = Number(props.open);\n if (reduce.value) return { opacity };\n return {\n opacity,\n y: props.open ? 0 : -4,\n clipPath: `inset(0 0 ${props.open ? 0 : 100}% 0)`,\n };\n});\n</script>\n<template>\n <motion.div\n class=\"overflow-hidden\"\n :initial=\"false\"\n :animate=\"animation\"\n :aria-hidden=\"!open\"\n :inert=\"!open || undefined\"\n :transition=\"{ ease: EASE_OUT, duration: reduce ? 0 : open ? 0.22 : 0.14 }\"\n :style=\"{\n height,\n pointerEvents: open ? undefined : 'none',\n transformOrigin: 'top',\n }\"\n >\n <div\n v-if=\"maxHeight\"\n class=\"overflow-auto\"\n :style=\"{ maxHeight: `${maxHeight}px` }\"\n >\n <slot />\n </div>\n <slot v-else />\n </motion.div>\n</template>\n"
43
+ },
44
+ {
45
+ "path": "registry/orvui/agents/ai-sidebar/index.ts",
46
+ "target": "~/src/components/orvui/agents/ai-sidebar/index.ts",
47
+ "type": "registry:lib",
48
+ "content": "export { default as AISidebar } from \"./src/AISidebar.vue\";\nexport * from \"./src/tree\";\n\nexport type * from \"./src/api-types\";\n"
49
+ },
50
+ {
51
+ "path": "registry/orvui/agents/ai-sidebar/src/AISidebar.vue",
52
+ "target": "~/src/components/orvui/agents/ai-sidebar/src/AISidebar.vue",
53
+ "type": "registry:component",
54
+ "content": "<script setup lang=\"ts\">\nimport {\n computed,\n nextTick,\n onBeforeUnmount,\n ref,\n watch,\n type VNodeChild,\n} from \"vue\";\nimport { AnimatePresence } from \"motion-v\";\nimport { cn } from \"../../../lib/utils\";\nimport { RenderNode } from \"../../shared\";\nimport {\n canContain,\n containsResource,\n findResource,\n flattenResources,\n moveResource,\n renameResource,\n type FlatResource,\n type SidebarResource,\n type SidebarResourceDropPosition,\n type SidebarResourceMenuControls,\n type SidebarResourceMove,\n type SidebarResourceMoveCommands,\n} from \"./tree\";\nimport ResourceRow from \"./ResourceRow.vue\";\ndefineOptions({ inheritAttrs: false });\nconst props = withDefaults(\n defineProps<{\n items?: SidebarResource[];\n defaultItems?: SidebarResource[];\n activeId?: string | null;\n defaultActiveId?: string | null;\n defaultExpandedIds?: string[];\n ariaLabel?: string;\n className?: string;\n onMove?: (move: SidebarResourceMove) => void | Promise<void>;\n onRename?: (item: SidebarResource, label: string) => void | Promise<void>;\n renderIcon?: (item: SidebarResource) => VNodeChild;\n renderMenu?: (\n item: SidebarResource,\n controls: SidebarResourceMenuControls,\n ) => VNodeChild;\n }>(),\n {\n defaultItems: () => [],\n defaultActiveId: null,\n defaultExpandedIds: () => [],\n ariaLabel: \"Resources\",\n },\n);\nconst emit = defineEmits<{\n \"update:items\": [items: SidebarResource[]];\n itemsChange: [items: SidebarResource[]];\n \"update:activeId\": [id: string | null];\n activeChange: [id: string];\n moveError: [error: unknown, move: SidebarResourceMove];\n renameError: [error: unknown, item: SidebarResource];\n}>();\nconst forest = ref(props.items ?? props.defaultItems);\nconst localSelection = ref(props.defaultActiveId);\nconst selection = computed(() =>\n props.activeId === undefined ? localSelection.value : props.activeId,\n);\nconst expanded = ref(new Set(props.defaultExpandedIds));\nconst rows = computed(() => flattenResources(forest.value, expanded.value));\nconst focusId = ref(props.activeId ?? props.defaultActiveId);\nconst roving = computed(() =>\n rows.value.some((row) => row.item.id === focusId.value)\n ? focusId.value\n : (rows.value[0]?.item.id ?? null),\n);\nconst dragging = ref<string | null>(null),\n menuId = ref<string | null>(null),\n editing = ref<string | null>(null),\n announcement = ref(\"\");\nconst destination = ref<{\n id: string | null;\n position: SidebarResourceDropPosition;\n} | null>(null);\nconst handles = new Map<string, { focus: () => void }>();\nlet busy = false,\n alive = true;\nlet focusFrame: number | undefined, menuFrame: number | undefined;\nwatch(\n () => props.items,\n (items) => {\n if (items) forest.value = items;\n },\n);\nwatch(\n roving,\n (id) => {\n focusId.value = id;\n },\n { flush: \"sync\" },\n);\nwatch(menuId, async (id) => {\n if (menuFrame !== undefined) cancelAnimationFrame(menuFrame);\n if (!id) return;\n await nextTick();\n if (!alive || menuId.value !== id) return;\n menuFrame = requestAnimationFrame(() =>\n Array.from(\n document.querySelectorAll<HTMLElement>(\"[data-sidebar-resource-menu]\"),\n )\n .find((node) => node.dataset.sidebarResourceMenu === id)\n ?.querySelector<HTMLElement>(\"button,a[href]\")\n ?.focus(),\n );\n});\nonBeforeUnmount(() => {\n alive = false;\n if (focusFrame !== undefined) cancelAnimationFrame(focusFrame);\n if (menuFrame !== undefined) cancelAnimationFrame(menuFrame);\n handles.clear();\n});\nfunction update(items: SidebarResource[]) {\n forest.value = items;\n emit(\"update:items\", items);\n emit(\"itemsChange\", items);\n}\nfunction focus(id: string) {\n focusId.value = id;\n if (focusFrame !== undefined) cancelAnimationFrame(focusFrame);\n focusFrame = requestAnimationFrame(() => {\n if (alive) handles.get(id)?.focus();\n });\n}\nfunction select(id: string) {\n if (props.activeId === undefined) localSelection.value = id;\n emit(\"update:activeId\", id);\n emit(\"activeChange\", id);\n}\nfunction toggle(id: string) {\n const next = new Set(expanded.value);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n expanded.value = next;\n}\nasync function move(change: SidebarResourceMove) {\n if (busy) {\n announcement.value = \"Wait for the current move to finish.\";\n return;\n }\n const before = forest.value,\n next = moveResource(before, change);\n if (!next || next === before) return;\n busy = true;\n update(next);\n dragging.value = null;\n destination.value = null;\n const source = findResource(before, change.itemId),\n target = change.targetId\n ? findResource(before, change.targetId)\n : undefined;\n announcement.value = target\n ? `Moved ${source?.label ?? \"item\"} ${change.position} ${target.label}.`\n : `Moved ${source?.label ?? \"item\"} to the top level.`;\n try {\n await props.onMove?.(change);\n } catch (error) {\n if (alive) {\n update(before);\n announcement.value = `Move failed. ${source?.label ?? \"Item\"} was restored.`;\n emit(\"moveError\", error, change);\n }\n } finally {\n busy = false;\n }\n}\nfunction commands(row: FlatResource): SidebarResourceMoveCommands {\n if (row.item.disabled) return {};\n const index = rows.value.findIndex((item) => item.item.id === row.item.id),\n previous = rows.value[index - 1],\n next = rows.value[index + 1];\n const result: SidebarResourceMoveCommands = {};\n const relocate =\n (targetId: string, position: SidebarResourceDropPosition) => () => {\n void move({ itemId: row.item.id, targetId, position });\n };\n if (previous) result.up = relocate(previous.item.id, \"before\");\n if (next) result.down = relocate(next.item.id, \"after\");\n if (\n previous &&\n canContain(previous.item) &&\n previous.item.id !== row.parentId\n )\n result.into = {\n label: previous.item.label,\n run: () => {\n expanded.value = new Set(expanded.value).add(previous.item.id);\n relocate(previous.item.id, \"inside\")();\n },\n };\n if (row.parentId) result.out = relocate(row.parentId, \"after\");\n return result;\n}\nfunction keydown(event: KeyboardEvent, row: FlatResource) {\n const index = rows.value.findIndex((item) => item.item.id === row.item.id),\n previous = rows.value[index - 1],\n next = rows.value[index + 1];\n const key = event.key,\n moving = event.altKey && event.shiftKey;\n if (!moving && (key === \"ArrowUp\" || key === \"ArrowDown\")) {\n const target = key === \"ArrowUp\" ? previous : next;\n if (target) {\n event.preventDefault();\n focus(target.item.id);\n }\n return;\n }\n if ((key === \"Home\" || key === \"End\") && rows.value.length) {\n event.preventDefault();\n focus(\n (key === \"Home\" ? rows.value[0] : rows.value[rows.value.length - 1]).item\n .id,\n );\n return;\n }\n if (row.item.disabled) {\n if (key === \"ArrowLeft\" && row.parentId) {\n event.preventDefault();\n focus(row.parentId);\n } else if (\n moving ||\n [\"ArrowRight\", \"Enter\", \" \", \"F2\", \"ContextMenu\"].includes(key) ||\n (event.shiftKey && key === \"F10\")\n )\n event.preventDefault();\n return;\n }\n if (moving) {\n const action = commands(row);\n const run =\n key === \"ArrowUp\"\n ? action.up\n : key === \"ArrowDown\"\n ? action.down\n : key === \"ArrowLeft\"\n ? action.out\n : key === \"ArrowRight\"\n ? action.into?.run\n : undefined;\n if (run) {\n event.preventDefault();\n run();\n return;\n }\n }\n if (key === \"ArrowRight\" && canContain(row.item)) {\n event.preventDefault();\n if (!expanded.value.has(row.item.id)) toggle(row.item.id);\n else if (next?.parentId === row.item.id) focus(next.item.id);\n } else if (key === \"ArrowLeft\") {\n event.preventDefault();\n if (expanded.value.has(row.item.id)) toggle(row.item.id);\n else if (row.parentId) focus(row.parentId);\n } else if (key === \"Enter\" || key === \" \") {\n event.preventDefault();\n if (canContain(row.item)) toggle(row.item.id);\n else select(row.item.id);\n } else if (key === \"F2\") {\n event.preventDefault();\n editing.value = row.item.id;\n } else if (key === \"ContextMenu\" || (event.shiftKey && key === \"F10\")) {\n event.preventDefault();\n menuId.value = row.item.id;\n }\n}\nasync function rename(item: SidebarResource, text: string) {\n editing.value = null;\n const label = text.trim();\n if (!label || label === item.label) return;\n const before = forest.value;\n update(renameResource(before, item.id, label));\n try {\n await props.onRename?.(item, label);\n } catch (error) {\n if (alive) {\n update(before);\n announcement.value = `Rename failed. ${item.label} was restored.`;\n emit(\"renameError\", error, item);\n }\n }\n}\nfunction dragStart(event: DragEvent, id: string) {\n dragging.value = id;\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = \"move\";\n event.dataTransfer.setData(\"text/plain\", id);\n }\n}\nfunction dragOver(event: DragEvent, row: FlatResource) {\n if (!dragging.value || dragging.value === row.item.id) return;\n const source = findResource(forest.value, dragging.value);\n if (source && containsResource(source, row.item.id)) return;\n event.preventDefault();\n event.stopPropagation();\n const box = (event.currentTarget as HTMLElement).getBoundingClientRect(),\n fraction = (event.clientY - box.top) / Math.max(1, box.height);\n const position: SidebarResourceDropPosition =\n !row.item.disabled &&\n canContain(row.item) &&\n fraction >= 0.25 &&\n fraction <= 0.75\n ? \"inside\"\n : fraction < 0.5\n ? \"before\"\n : \"after\";\n destination.value = { id: row.item.id, position };\n}\nfunction drop(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n if (dragging.value && destination.value)\n void move({\n itemId: dragging.value,\n targetId: destination.value.id,\n position: destination.value.position,\n });\n}\nfunction menu(open: boolean, id: string) {\n menuId.value = open ? id : null;\n if (!open) focus(id);\n}\nfunction clearDrag() {\n dragging.value = null;\n destination.value = null;\n}\nfunction outsideOver(event: DragEvent) {\n if (dragging.value && event.target === event.currentTarget) {\n event.preventDefault();\n destination.value = { id: null, position: \"after\" };\n }\n}\n</script>\n<template>\n <div\n v-bind=\"$attrs\"\n role=\"tree\"\n :aria-label=\"ariaLabel\"\n aria-multiselectable=\"false\"\n :class=\"\n cn(\n 'relative flex min-w-0 flex-col gap-0.5 [overflow-anchor:none] group-data-[state=collapsed]/sidebar:hidden',\n dragging && 'select-none pb-9',\n className,\n $attrs.class,\n )\n \"\n @dragover=\"outsideOver\"\n @drop=\"drop\"\n >\n <AnimatePresence :initial=\"false\"\n ><ResourceRow\n v-for=\"row in rows\"\n :key=\"row.item.id\"\n :ref=\"\n (node) => {\n if (node)\n handles.set(\n row.item.id,\n node as unknown as { focus: () => void },\n );\n else handles.delete(row.item.id);\n }\n \"\n :row=\"row\"\n :active=\"selection === row.item.id\"\n :expanded=\"expanded.has(row.item.id)\"\n :focused=\"roving === row.item.id\"\n :dragging-id=\"dragging\"\n :drop-target=\"destination\"\n :menu-open=\"menuId === row.item.id\"\n :moves=\"commands(row)\"\n :renaming=\"editing === row.item.id\"\n :render-icon=\"renderIcon\"\n :render-menu=\"renderMenu\"\n @focus=\"focusId = row.item.id\"\n @select=\"select(row.item.id)\"\n @toggle=\"toggle(row.item.id)\"\n @key=\"keydown($event, row)\"\n @rename-start=\"editing = row.item.id\"\n @rename-cancel=\"editing = null\"\n @rename-commit=\"rename(row.item, $event)\"\n @menu=\"menu($event, row.item.id)\"\n @drag-start=\"dragStart\"\n @drag-end=\"clearDrag\"\n @drag-over=\"dragOver\"\n @drop=\"drop\"\n >\n <template v-if=\"$slots.icon\" #icon=\"scope\"\n ><slot name=\"icon\" v-bind=\"scope\"\n ><RenderNode :node=\"renderIcon?.(scope.item)\" /></slot></template\n ><template v-if=\"$slots.menu\" #menu=\"scope\"\n ><slot name=\"menu\" v-bind=\"scope\"\n ><RenderNode\n :node=\"renderMenu?.(scope.item, scope.controls)\" /></slot\n ></template> </ResourceRow\n ></AnimatePresence>\n <div\n v-if=\"dragging\"\n aria-hidden=\"true\"\n :data-active=\"destination?.id === null || undefined\"\n class=\"absolute inset-x-1 bottom-0 flex h-8 items-center justify-center rounded-lg border border-dashed border-border text-[10px] text-muted-foreground data-[active=true]:border-primary/50 data-[active=true]:bg-muted data-[active=true]:text-foreground\"\n >\n Move to top level\n </div>\n </div>\n <span class=\"sr-only\" aria-live=\"polite\">{{ announcement }}</span>\n</template>\n"
55
+ },
56
+ {
57
+ "path": "registry/orvui/agents/ai-sidebar/src/api-types.ts",
58
+ "target": "~/src/components/orvui/agents/ai-sidebar/src/api-types.ts",
59
+ "type": "registry:lib",
60
+ "content": "// Vue public prop types, derived from the actual components.\nexport type AISidebarProps = InstanceType<\n (typeof import(\"./AISidebar.vue\"))[\"default\"]\n>[\"$props\"];\n"
61
+ },
62
+ {
63
+ "path": "registry/orvui/agents/ai-sidebar/src/MarqueeLabel.vue",
64
+ "target": "~/src/components/orvui/agents/ai-sidebar/src/MarqueeLabel.vue",
65
+ "type": "registry:component",
66
+ "content": "<script setup lang=\"ts\">\nimport {\n computed,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n watch,\n} from \"vue\";\nimport { motion } from \"motion-v\";\nimport { EASE_OUT } from \"../../../lib/ease\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nconst props = defineProps<{ active: boolean; label: string }>();\nconst viewport = ref<HTMLElement>();\nconst text = ref<HTMLElement>();\nconst travel = ref(0);\nconst reduced = useReducedMotion();\nconst running = computed(\n () => props.active && travel.value > 0 && !reduced.value,\n);\nlet observer: ResizeObserver | undefined;\nlet alive = false;\nfunction measure() {\n if (alive && viewport.value && text.value)\n travel.value =\n text.value.scrollWidth > viewport.value.clientWidth\n ? text.value.scrollWidth + 24\n : 0;\n}\nwatch(\n () => props.label,\n () => nextTick(measure),\n);\nonMounted(() => {\n alive = true;\n measure();\n if (typeof ResizeObserver !== \"undefined\") {\n observer = new ResizeObserver(measure);\n if (viewport.value) observer.observe(viewport.value);\n if (text.value) observer.observe(text.value);\n }\n});\nonBeforeUnmount(() => {\n alive = false;\n observer?.disconnect();\n});\n</script>\n<template>\n <span ref=\"viewport\" class=\"block min-w-0 flex-1 overflow-hidden\"\n ><motion.span\n class=\"flex w-max items-center gap-6 whitespace-nowrap\"\n :animate=\"{ x: running ? [0, -travel] : 0 }\"\n :transition=\"\n running\n ? {\n duration: Math.max(2.4, travel / 34),\n ease: 'linear',\n repeat: Infinity,\n repeatDelay: 2,\n }\n : { duration: 0.16, ease: EASE_OUT }\n \"\n ><span ref=\"text\">{{ label }}</span\n ><span v-if=\"running\" aria-hidden=\"true\">{{ label }}</span></motion.span\n ></span\n >\n</template>\n"
67
+ },
68
+ {
69
+ "path": "registry/orvui/agents/ai-sidebar/src/ResourceRow.vue",
70
+ "target": "~/src/components/orvui/agents/ai-sidebar/src/ResourceRow.vue",
71
+ "type": "registry:component",
72
+ "content": "<script setup lang=\"ts\">\nimport {\n computed,\n nextTick,\n onBeforeUnmount,\n ref,\n watch,\n type VNodeChild,\n} from \"vue\";\nimport { motion } from \"motion-v\";\nimport {\n ArrowDown,\n ArrowUp,\n Bookmark,\n FileText,\n Folder,\n FolderInput,\n FolderOpen,\n MoreHorizontal,\n Pencil,\n Undo2,\n} from \"lucide-vue-next\";\nimport {\n MorphPopover,\n MorphPopoverContent,\n MorphPopoverTrigger,\n} from \"../../../motion/popover\";\nimport { resolveElement, useReducedMotion } from \"../../../lib/composables\";\nimport { SPRING_LAYOUT } from \"../../../lib/ease\";\nimport { cn } from \"../../../lib/utils\";\nimport { RenderNode } from \"../../shared\";\nimport {\n canContain,\n type FlatResource,\n type SidebarResourceDropPosition,\n type SidebarResourceMenuControls,\n type SidebarResourceMoveCommands,\n} from \"./tree\";\nimport MarqueeLabel from \"./MarqueeLabel.vue\";\nimport { useTouchCapable } from \"./useTouchCapable\";\nconst props = defineProps<{\n row: FlatResource;\n active: boolean;\n expanded: boolean;\n focused: boolean;\n draggingId: string | null;\n dropTarget: {\n id: string | null;\n position: SidebarResourceDropPosition;\n } | null;\n menuOpen: boolean;\n moves: SidebarResourceMoveCommands;\n renaming: boolean;\n renderIcon?: (item: FlatResource[\"item\"]) => VNodeChild;\n renderMenu?: (\n item: FlatResource[\"item\"],\n controls: SidebarResourceMenuControls,\n ) => VNodeChild;\n}>();\nconst emit = defineEmits<{\n focus: [];\n key: [e: KeyboardEvent];\n menu: [open: boolean];\n renameStart: [];\n renameCancel: [];\n renameCommit: [label: string];\n select: [];\n toggle: [];\n dragStart: [e: DragEvent, id: string];\n dragEnd: [];\n dragOver: [e: DragEvent, row: FlatResource];\n drop: [e: DragEvent];\n}>();\nconst reduced = useReducedMotion(),\n touch = useTouchCapable();\nconst element = ref<unknown>(),\n input = ref<HTMLInputElement>(),\n hovered = ref(false),\n draft = ref(props.row.item.label);\nconst container = computed(() => canContain(props.row.item));\nconst placement = computed(() =>\n props.dropTarget?.id === props.row.item.id\n ? props.dropTarget.position\n : undefined,\n);\nconst icon = computed(() =>\n container.value\n ? props.expanded\n ? FolderOpen\n : Folder\n : props.row.item.kind === \"bookmark\"\n ? Bookmark\n : FileText,\n);\nconst customIcon = computed(() => props.renderIcon?.(props.row.item));\nconst controls = computed<SidebarResourceMenuControls>(() => ({\n close: () => emit(\"menu\", false),\n rename: () => run(() => emit(\"renameStart\")),\n moves: props.moves,\n}));\nconst customMenu = computed(() =>\n props.renderMenu?.(props.row.item, controls.value),\n);\nconst actions = computed(() => {\n const result = [\n { label: \"Rename\", icon: Pencil, run: () => emit(\"renameStart\") },\n ];\n if (props.moves.up)\n result.push({ label: \"Move up\", icon: ArrowUp, run: props.moves.up });\n if (props.moves.down)\n result.push({ label: \"Move down\", icon: ArrowDown, run: props.moves.down });\n if (props.moves.into)\n result.push({\n label: `Move into ${props.moves.into.label}`,\n icon: FolderInput,\n run: props.moves.into.run,\n });\n if (props.moves.out)\n result.push({ label: \"Move out\", icon: Undo2, run: props.moves.out });\n return result;\n});\nlet blurHandled = false,\n dragged = false;\nlet renameFrame: number | undefined, dragFrame: number | undefined;\nconst seen = new WeakSet<MouseEvent>();\nwatch(\n () => [props.renaming, props.row.item.label] as const,\n async ([renaming]) => {\n if (!renaming) return;\n blurHandled = false;\n draft.value = props.row.item.label;\n await nextTick();\n if (renameFrame !== undefined) cancelAnimationFrame(renameFrame);\n renameFrame = requestAnimationFrame(() => {\n input.value?.focus();\n input.value?.select();\n });\n },\n);\nfunction activate(event: MouseEvent) {\n if (\n seen.has(event) ||\n event.defaultPrevented ||\n dragged ||\n props.renaming ||\n props.row.item.disabled\n )\n return;\n seen.add(event);\n if (container.value) emit(\"toggle\");\n else emit(\"select\");\n}\nfunction run(action: () => void, event?: MouseEvent) {\n if (event) activate(event);\n emit(\"menu\", false);\n action();\n}\nfunction renameKey(event: KeyboardEvent) {\n event.stopPropagation();\n if (event.key === \"Enter\" || event.key === \"Escape\") {\n blurHandled = true;\n if (event.key === \"Enter\") emit(\"renameCommit\", draft.value);\n else emit(\"renameCancel\");\n }\n}\nfunction doubleClick(event: MouseEvent) {\n if (!container.value && !props.row.item.disabled) {\n event.preventDefault();\n emit(\"renameStart\");\n }\n}\nfunction dragStart(event: DragEvent) {\n dragged = true;\n emit(\"dragStart\", event, props.row.item.id);\n}\nfunction dragEnd() {\n emit(\"dragEnd\");\n dragFrame = requestAnimationFrame(() => {\n dragged = false;\n });\n}\nonBeforeUnmount(() => {\n if (renameFrame !== undefined) cancelAnimationFrame(renameFrame);\n if (dragFrame !== undefined) cancelAnimationFrame(dragFrame);\n});\ndefineExpose({\n focus: () => resolveElement<HTMLElement>(element.value)?.focus(),\n});\n</script>\n<template>\n <motion.div\n ref=\"element\"\n layout=\"position\"\n :transition=\"reduced ? { duration: 0 } : SPRING_LAYOUT\"\n role=\"treeitem\"\n :aria-level=\"row.depth + 1\"\n :aria-selected=\"container ? undefined : active\"\n :aria-expanded=\"container ? expanded : undefined\"\n :aria-disabled=\"row.item.disabled || undefined\"\n :tabindex=\"focused ? 0 : -1\"\n :draggable=\"!row.item.disabled && !renaming\"\n :data-resource-id=\"row.item.id\"\n :data-menu-open=\"menuOpen || undefined\"\n :data-drop=\"placement\"\n :data-dragging=\"draggingId === row.item.id || undefined\"\n @focus=\"emit('focus')\"\n @keydown=\"emit('key', $event)\"\n @click=\"activate\"\n @dblclick=\"doubleClick\"\n @mouseenter=\"hovered = true\"\n @mouseleave=\"hovered = false\"\n @dragstart.capture=\"dragStart\"\n @dragend.capture=\"dragEnd\"\n @dragover=\"emit('dragOver', $event, row)\"\n @drop=\"emit('drop', $event)\"\n :class=\"\n cn(\n 'group/resource relative flex min-h-9 min-w-0 cursor-pointer items-center gap-2.5 rounded-xl pr-3 text-sm outline-none',\n 'text-muted-foreground transition-colors hover:bg-muted hover:text-foreground',\n 'focus-visible:bg-muted/70 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset',\n 'data-[menu-open=true]:bg-muted data-[menu-open=true]:text-foreground',\n 'data-[dragging=true]:opacity-40',\n 'data-[drop=inside]:bg-muted data-[drop=inside]:ring-1 data-[drop=inside]:ring-primary/45',\n 'data-[drop=before]:before:absolute data-[drop=before]:before:-top-0.5 data-[drop=before]:before:right-2 data-[drop=before]:before:left-2 data-[drop=before]:before:h-0.5 data-[drop=before]:before:rounded-full data-[drop=before]:before:bg-primary',\n 'data-[drop=after]:after:absolute data-[drop=after]:after:-bottom-0.5 data-[drop=after]:after:right-2 data-[drop=after]:after:left-2 data-[drop=after]:after:h-0.5 data-[drop=after]:after:rounded-full data-[drop=after]:after:bg-primary',\n !container && active && 'bg-muted text-foreground',\n row.item.disabled && 'cursor-not-allowed opacity-45',\n )\n \"\n :style=\"{ paddingLeft: `${12 + row.depth * 16}px` }\"\n >\n <span aria-hidden=\"true\" class=\"grid size-5 shrink-0 place-items-center\"\n ><slot name=\"icon\" :item=\"row.item\"\n ><RenderNode v-if=\"customIcon != null\" :node=\"customIcon\" /><component\n v-else\n :is=\"icon\"\n class=\"size-4\" /></slot\n ></span>\n <input\n v-if=\"renaming\"\n ref=\"input\"\n v-model=\"draft\"\n :aria-label=\"`Rename ${row.item.label}`\"\n :draggable=\"false\"\n @click.stop\n @dblclick.stop\n @blur=\"!blurHandled && emit('renameCommit', draft)\"\n @keydown=\"renameKey\"\n class=\"mx-1 h-7 min-w-0 flex-1 rounded-md border border-border bg-background px-2 text-sm text-foreground outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n <MarqueeLabel\n v-else\n :active=\"hovered || menuOpen\"\n :label=\"row.item.label\"\n />\n <MorphPopover\n v-if=\"!renaming && !row.item.disabled\"\n :open=\"menuOpen\"\n @update:open=\"emit('menu', $event)\"\n ><MorphPopoverTrigger\n ><button\n type=\"button\"\n :draggable=\"false\"\n :tabindex=\"-1\"\n :aria-label=\"`Actions for ${row.item.label}`\"\n @click.stop\n :class=\"\n cn(\n 'grid size-7 shrink-0 place-items-center rounded-lg outline-none transition-opacity hover:bg-foreground/5 focus-visible:opacity-100 focus-visible:ring-2 focus-visible:ring-ring group-hover/resource:opacity-100 group-focus-visible/resource:opacity-100 group-data-[menu-open=true]/resource:opacity-100',\n touch ? 'opacity-100' : 'opacity-0',\n )\n \"\n >\n <MoreHorizontal aria-hidden=\"true\" class=\"size-4\" /></button\n ></MorphPopoverTrigger>\n <MorphPopoverContent\n side=\"bottom\"\n align=\"end\"\n :side-offset=\"8\"\n :radius=\"12\"\n class=\"w-40 p-1.5\"\n ><div :data-sidebar-resource-menu=\"row.item.id\" @click=\"activate\">\n <slot name=\"menu\" :item=\"row.item\" :controls=\"controls\"\n ><RenderNode\n v-if=\"customMenu != null\"\n :node=\"customMenu\"\n /><template\n v-for=\"(action, index) in customMenu != null ? [] : actions\"\n :key=\"action.label\"\n ><div\n v-if=\"index === 1\"\n aria-hidden=\"true\"\n class=\"my-1 h-px bg-border\"\n />\n <button\n type=\"button\"\n @click=\"run(action.run, $event)\"\n class=\"flex h-8 w-full items-center gap-2 rounded-lg px-2.5 text-left text-xs text-foreground outline-none transition-colors hover:bg-muted focus-visible:bg-muted focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <component\n :is=\"action.icon\"\n aria-hidden=\"true\"\n class=\"size-3.5 shrink-0\"\n /><span class=\"min-w-0 truncate\">{{ action.label }}</span>\n </button></template\n ></slot\n >\n </div></MorphPopoverContent\n >\n </MorphPopover>\n </motion.div>\n</template>\n"
73
+ },
74
+ {
75
+ "path": "registry/orvui/agents/ai-sidebar/src/tree.ts",
76
+ "target": "~/src/components/orvui/agents/ai-sidebar/src/tree.ts",
77
+ "type": "registry:lib",
78
+ "content": "export type SidebarResourceKind = \"folder\" | \"project\" | \"file\" | \"bookmark\";\nexport interface SidebarResource {\n id: string;\n label: string;\n kind: SidebarResourceKind;\n children?: SidebarResource[];\n disabled?: boolean;\n}\nexport type SidebarResourceDropPosition = \"before\" | \"inside\" | \"after\";\nexport interface SidebarResourceMove {\n itemId: string;\n targetId: string | null;\n position: SidebarResourceDropPosition;\n}\nexport interface SidebarResourceMoveCommands {\n up?: () => void;\n down?: () => void;\n into?: { label: string; run: () => void };\n out?: () => void;\n}\nexport interface SidebarResourceMenuControls {\n close: () => void;\n rename: () => void;\n moves: SidebarResourceMoveCommands;\n}\nexport interface FlatResource {\n item: SidebarResource;\n depth: number;\n parentId: string | null;\n}\n\nexport function canContain(item: SidebarResource) {\n return [\"folder\", \"project\"].includes(item.kind);\n}\n\nfunction pathTo(forest: SidebarResource[], id: string): number[] | undefined {\n const pending = forest\n .map((item, index) => ({ item, path: [index] }))\n .reverse();\n while (pending.length) {\n const cursor = pending.pop()!;\n if (cursor.item.id === id) return cursor.path;\n const children = cursor.item.children ?? [];\n for (let index = children.length - 1; index >= 0; index--)\n pending.push({ item: children[index], path: [...cursor.path, index] });\n }\n}\nfunction at(forest: SidebarResource[], path: number[]): SidebarResource {\n let nodes = forest;\n let node = nodes[path[0]];\n path.forEach((index, level) => {\n node = nodes[index];\n if (level < path.length - 1) nodes = node.children ?? [];\n });\n return node;\n}\nfunction editSiblings(\n forest: SidebarResource[],\n parentPath: number[],\n edit: (siblings: SidebarResource[]) => SidebarResource[],\n): SidebarResource[] {\n if (!parentPath.length) return edit(forest);\n const [head, ...tail] = parentPath;\n const result = forest.slice();\n result[head] = {\n ...forest[head],\n children: editSiblings(forest[head].children ?? [], tail, edit),\n };\n return result;\n}\nexport function flattenResources(\n items: SidebarResource[],\n expanded: Set<string>,\n depth = 0,\n parentId: string | null = null,\n): FlatResource[] {\n const result: FlatResource[] = [];\n const pending = items.map((item) => ({ item, depth, parentId })).reverse();\n while (pending.length) {\n const row = pending.pop()!;\n result.push(row);\n if (!expanded.has(row.item.id)) continue;\n const children = row.item.children ?? [];\n for (let index = children.length - 1; index >= 0; index--)\n pending.push({\n item: children[index],\n parentId: row.item.id,\n depth: row.depth + 1,\n });\n }\n return result;\n}\nexport function findResource(\n items: SidebarResource[],\n id: string,\n): SidebarResource | undefined {\n const path = pathTo(items, id);\n return path ? at(items, path) : undefined;\n}\nexport function containsResource(item: SidebarResource, id: string): boolean {\n return pathTo([item], id) !== undefined;\n}\nexport function removeResource(\n items: SidebarResource[],\n id: string,\n): { items: SidebarResource[]; removed?: SidebarResource } {\n const path = pathTo(items, id);\n if (!path) return { items: items.slice() };\n const removed = at(items, path);\n const index = path[path.length - 1];\n return {\n removed,\n items: editSiblings(items, path.slice(0, -1), (siblings) =>\n siblings.filter((_, cursor) => cursor !== index),\n ),\n };\n}\nexport function insertResource(\n items: SidebarResource[],\n resource: SidebarResource,\n targetId: string | null,\n position: SidebarResourceDropPosition,\n): SidebarResource[] {\n if (targetId === null) return items.concat(resource);\n const path = pathTo(items, targetId);\n if (!path) return items.slice();\n if (position === \"inside\")\n return editSiblings(items, path, (children) => children.concat(resource));\n const index = path[path.length - 1] + Number(position === \"after\");\n return editSiblings(items, path.slice(0, -1), (siblings) => [\n ...siblings.slice(0, index),\n resource,\n ...siblings.slice(index),\n ]);\n}\nexport function moveResource(\n items: SidebarResource[],\n move: SidebarResourceMove,\n): SidebarResource[] | null {\n const source = findResource(items, move.itemId);\n if (!source || source.disabled) return null;\n const target =\n move.targetId === null ? undefined : findResource(items, move.targetId);\n if (\n move.targetId !== null &&\n (!target || containsResource(source, move.targetId))\n )\n return null;\n if (\n move.position === \"inside\" &&\n (!target || target.disabled || !canContain(target))\n )\n return null;\n const detached = removeResource(items, move.itemId);\n return insertResource(detached.items, source, move.targetId, move.position);\n}\nexport function renameResource(\n items: SidebarResource[],\n id: string,\n label: string,\n): SidebarResource[] {\n const path = pathTo(items, id);\n if (!path) return items.slice();\n const index = path[path.length - 1];\n return editSiblings(items, path.slice(0, -1), (siblings) =>\n siblings.map((item, cursor) =>\n cursor === index ? { ...item, label } : item,\n ),\n );\n}\n"
79
+ },
80
+ {
81
+ "path": "registry/orvui/agents/ai-sidebar/src/useTouchCapable.ts",
82
+ "target": "~/src/components/orvui/agents/ai-sidebar/src/useTouchCapable.ts",
83
+ "type": "registry:lib",
84
+ "content": "import { onBeforeUnmount, onMounted, ref } from \"vue\";\nexport function useTouchCapable() {\n const capable = ref(false);\n let media: MediaQueryList | undefined;\n const refresh = () => {\n capable.value = !!media?.matches || navigator.maxTouchPoints > 0;\n };\n onMounted(() => {\n media = window.matchMedia?.(\"(any-pointer: coarse)\");\n refresh();\n media?.addEventListener?.(\"change\", refresh);\n });\n onBeforeUnmount(() => media?.removeEventListener?.(\"change\", refresh));\n return capable;\n}\n"
85
+ },
86
+ {
87
+ "path": "registry/orvui/agents/approval-card/index.ts",
88
+ "target": "~/src/components/orvui/agents/approval-card/index.ts",
89
+ "type": "registry:lib",
90
+ "content": "export { default as ApprovalCard } from \"./src/ApprovalCard.vue\";\nexport * from \"./src/types\";\n"
91
+ },
92
+ {
93
+ "path": "registry/orvui/agents/approval-card/src/ApprovalCard.vue",
94
+ "target": "~/src/components/orvui/agents/approval-card/src/ApprovalCard.vue",
95
+ "type": "registry:component",
96
+ "content": "<script setup lang=\"ts\">\nimport {\n computed,\n getCurrentInstance,\n onBeforeUnmount,\n watch,\n type VNodeChild,\n} from \"vue\";\nimport { AnimatePresence, motion } from \"motion-v\";\nimport {\n ArrowLeft,\n ArrowRight,\n Check,\n CircleHelp,\n LoaderCircle,\n MessageSquareText,\n X,\n} from \"lucide-vue-next\";\nimport { Button } from \"../../../motion/button\";\nimport { ActionSwapRollText } from \"../../../motion/action-swap\";\nimport { EASE_OUT, SPRING_SWAP } from \"../../../lib/ease\";\nimport { cn } from \"../../../lib/utils\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nimport { RenderNode, useControllable, type Content } from \"../../shared\";\nimport AgentDisclosure from \"../../AgentDisclosure.vue\";\nimport QuestionOptions from \"./QuestionOptions.vue\";\nimport type {\n ApprovalCardAnswer,\n ApprovalCardAnswers,\n ApprovalCardQuestion,\n ApprovalCardStatus,\n} from \"./types\";\ndefineSlots<{ default?: () => VNodeChild }>();\nconst props = withDefaults(\n defineProps<{\n title?: Content;\n description?: Content;\n questions?: ApprovalCardQuestion[];\n status?: ApprovalCardStatus;\n answers?: ApprovalCardAnswers;\n defaultAnswers?: ApprovalCardAnswers;\n step?: number;\n defaultStep?: number;\n approveLabel?: Content;\n submitLabel?: Content;\n result?: Content;\n }>(),\n {\n title: \"Approval required\",\n questions: () => [],\n status: \"pending\",\n defaultAnswers: () => ({}),\n defaultStep: 0,\n approveLabel: \"Approve\",\n submitLabel: \"Submit response\",\n result: undefined,\n },\n);\nconst emit = defineEmits<{\n \"update:answers\": [answers: ApprovalCardAnswers];\n answersChange: [answers: ApprovalCardAnswers];\n \"update:step\": [step: number];\n stepChange: [step: number];\n submit: [answers: ApprovalCardAnswers];\n approve: [];\n reject: [];\n requestChanges: [];\n dismiss: [];\n}>();\nconst responses = useControllable(\n () => props.answers,\n props.defaultAnswers,\n (value) => {\n emit(\"update:answers\", value);\n emit(\"answersChange\", value);\n },\n);\nconst position = useControllable(\n () => props.step,\n props.defaultStep,\n (value) => {\n emit(\"update:step\", value);\n emit(\"stepChange\", value);\n },\n);\nconst cursor = computed(() =>\n Math.max(0, Math.min(position.value, props.questions.length - 1)),\n);\nconst currentQuestion = computed(() => props.questions[cursor.value]);\nconst currentAnswer = computed<ApprovalCardAnswer>(() =>\n currentQuestion.value\n ? (responses.value[currentQuestion.value.id] ?? {\n selected: [],\n custom: \"\",\n })\n : { selected: [], custom: \"\" },\n);\nconst busy = computed(() => props.status === \"submitting\");\nconst interactive = computed(() =>\n [\"pending\", \"submitting\"].includes(props.status),\n);\nconst valid = computed(\n () =>\n currentAnswer.value.selected.length > 0 ||\n !!currentAnswer.value.custom?.trim(),\n);\nconst reduced = useReducedMotion();\nconst instance = getCurrentInstance();\nconst has = (event: string) => !!instance?.vnode.props?.[event];\nconst label = computed(\n () =>\n ({\n pending: \"Input required\",\n submitting: \"Submitting\",\n approved: \"Approved\",\n rejected: \"Rejected\",\n \"changes-requested\": \"Changes requested\",\n answered: \"Response submitted\",\n })[props.status],\n);\nconst successful = computed(() =>\n [\"approved\", \"answered\"].includes(props.status),\n);\nconst tone = computed(() =>\n successful.value\n ? \"emerald\"\n : props.status === \"rejected\"\n ? \"rose\"\n : props.status === \"changes-requested\"\n ? \"amber\"\n : \"muted\",\n);\nconst tones = {\n emerald: \"text-emerald-600 dark:text-emerald-400\",\n rose: \"text-rose-600 dark:text-rose-400\",\n amber: \"text-amber-600 dark:text-amber-400\",\n muted: \"text-muted-foreground\",\n};\nconst badges = {\n amber:\n \"border-amber-500/30 bg-amber-500/10 text-amber-600 dark:text-amber-400\",\n blue: \"border-blue-500/30 bg-blue-500/10 text-blue-600 dark:text-blue-400\",\n emerald:\n \"border-emerald-500/30 bg-emerald-500/10 text-emerald-600 dark:text-emerald-400\",\n rose: \"border-rose-500/30 bg-rose-500/10 text-rose-600 dark:text-rose-400\",\n};\nconst badge = computed(\n () =>\n badges[\n props.status === \"pending\" || props.status === \"changes-requested\"\n ? \"amber\"\n : busy.value\n ? \"blue\"\n : successful.value\n ? \"emerald\"\n : \"rose\"\n ],\n);\nlet pending: ReturnType<typeof setTimeout> | undefined;\nfunction cancelAdvance() {\n if (pending !== undefined) clearTimeout(pending);\n pending = undefined;\n}\nfunction go(value: number) {\n cancelAdvance();\n position.value = value;\n}\nfunction answer(value: ApprovalCardAnswer) {\n if (currentQuestion.value)\n responses.value = { ...responses.value, [currentQuestion.value.id]: value };\n}\nfunction advance() {\n if (!valid.value || busy.value) return;\n if (cursor.value + 1 < props.questions.length) go(cursor.value + 1);\n else emit(\"submit\", responses.value);\n}\nfunction automatic() {\n cancelAdvance();\n const question = currentQuestion.value,\n starting = cursor.value;\n if (\n !question ||\n question.multiple ||\n question.autoAdvance === false ||\n starting + 1 >= props.questions.length ||\n busy.value\n )\n return;\n pending = setTimeout(() => {\n pending = undefined;\n if (\n props.status === \"pending\" &&\n cursor.value === starting &&\n currentQuestion.value?.id === question.id\n )\n go(starting + 1);\n }, 240);\n}\nwatch(\n () => props.status,\n () => {\n if (props.status !== \"pending\") cancelAdvance();\n },\n);\nonBeforeUnmount(cancelAdvance);\n</script>\n<template>\n <div\n :data-state=\"status\"\n :aria-busy=\"busy\"\n class=\"w-full overflow-hidden rounded-2xl bg-muted p-4 text-sm\"\n >\n <div class=\"flex items-start gap-3\">\n <span\n aria-hidden=\"true\"\n :class=\"\n cn(\n 'grid size-5 shrink-0 place-items-center text-muted-foreground',\n tones[tone],\n )\n \"\n ><LoaderCircle\n v-if=\"busy\"\n :class=\"cn('size-4', !reduced && 'animate-spin')\" /><CircleHelp\n v-else-if=\"interactive && questions.length\"\n class=\"size-4\" /><MessageSquareText\n v-else-if=\"interactive\"\n class=\"size-4\" /><X\n v-else-if=\"status === 'rejected'\"\n class=\"size-4\" /><Check v-else class=\"size-4\"\n /></span>\n <div class=\"min-w-0 flex-1\">\n <div class=\"flex min-w-0 items-start gap-3\">\n <h3\n class=\"min-w-0 flex-1 text-base font-medium leading-5 text-foreground\"\n >\n <ActionSwapRollText :value=\"currentQuestion?.id ?? String(status)\"\n ><RenderNode :node=\"currentQuestion?.title ?? title\"\n /></ActionSwapRollText>\n </h3>\n <template v-if=\"questions.length && interactive\"\n ><span\n v-if=\"questions.length > 1\"\n class=\"shrink-0 text-xs tabular-nums text-muted-foreground/65\"\n >{{ cursor + 1 }}/{{ questions.length }}</span\n ></template\n ><span\n v-else\n :class=\"\n cn(\n 'shrink-0 rounded-full border px-2 py-0.5 text-[11px] font-medium transition-colors',\n badge,\n )\n \"\n >{{ label }}</span\n >\n <button\n v-if=\"has('onDismiss')\"\n type=\"button\"\n aria-label=\"Dismiss\"\n @click=\"emit('dismiss')\"\n class=\"grid size-5 shrink-0 place-items-center rounded-full text-muted-foreground outline-none transition-colors hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <X class=\"size-4\" />\n </button>\n </div>\n <AgentDisclosure :open=\"interactive\"\n ><AnimatePresence v-if=\"currentQuestion\" :initial=\"false\" mode=\"wait\"\n ><motion.div\n :key=\"currentQuestion.id\"\n :initial=\"reduced ? { opacity: 1 } : { opacity: 0, x: 8 }\"\n :animate=\"{ opacity: 1, x: 0 }\"\n :exit=\"reduced ? { opacity: 0 } : { opacity: 0, x: -6 }\"\n :transition=\"{ duration: reduced ? 0 : 0.2, ease: EASE_OUT }\"\n >\n <p\n v-if=\"currentQuestion.description\"\n class=\"mt-1 leading-5 text-muted-foreground\"\n >\n <RenderNode :node=\"currentQuestion.description\" />\n </p>\n <QuestionOptions\n :question=\"currentQuestion\"\n :answer=\"currentAnswer\"\n :disabled=\"busy\"\n @change=\"answer\"\n @single-select=\"automatic\"\n /> </motion.div\n ></AnimatePresence>\n <div v-else>\n <p v-if=\"description\" class=\"mt-1 leading-5 text-muted-foreground\">\n <RenderNode :node=\"description\" />\n </p>\n <div v-if=\"$slots.default\" class=\"mt-3\"><slot /></div>\n </div>\n <div v-if=\"questions.length\" class=\"mt-4 flex items-center gap-3\">\n <template v-if=\"questions.length > 1\"\n ><Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Previous question\"\n :disabled=\"busy || cursor === 0\"\n @click=\"go(cursor - 1)\"\n class=\"rounded-full\"\n ><ArrowLeft class=\"size-4\" /></Button\n ><span class=\"flex gap-1.5\"\n ><span class=\"sr-only\"\n >Question {{ cursor + 1 }} of {{ questions.length }}</span\n ><motion.span\n v-for=\"(item, index) in questions\"\n :key=\"item.id\"\n aria-hidden=\"true\"\n :initial=\"{\n scale: index === cursor ? 1 : 0.75,\n opacity: index <= cursor ? 1 : 0.35,\n }\"\n :animate=\"{\n scale: index === cursor ? 1 : 0.75,\n opacity: index <= cursor ? 1 : 0.35,\n }\"\n :transition=\"reduced ? { duration: 0 } : SPRING_SWAP\"\n class=\"size-1.5 rounded-full bg-foreground\" /></span\n ></template>\n <Button\n :size=\"cursor === questions.length - 1 ? 'sm' : 'icon'\"\n :aria-label=\"\n cursor === questions.length - 1\n ? 'Submit response'\n : 'Next question'\n \"\n :disabled=\"busy || !valid\"\n @click=\"advance\"\n class=\"ml-auto rounded-full\"\n ><LoaderCircle\n v-if=\"busy\"\n :class=\"cn('size-4', !reduced && 'animate-spin')\" /><template\n v-else-if=\"cursor === questions.length - 1\"\n ><RenderNode :node=\"submitLabel\" /><ArrowRight\n class=\"size-3.5\" /></template\n ><ArrowRight v-else class=\"size-4\"\n /></Button>\n </div>\n <div v-else class=\"mt-4 flex flex-wrap items-center gap-2\">\n <Button\n size=\"sm\"\n :disabled=\"busy\"\n @click=\"emit('approve')\"\n class=\"rounded-full\"\n ><RenderNode :node=\"approveLabel\" /></Button\n ><Button\n v-if=\"has('onRequestChanges')\"\n variant=\"secondary\"\n size=\"sm\"\n :disabled=\"busy\"\n @click=\"emit('requestChanges')\"\n class=\"rounded-full\"\n >Request changes</Button\n ><Button\n v-if=\"has('onReject')\"\n variant=\"ghost\"\n size=\"sm\"\n :disabled=\"busy\"\n @click=\"emit('reject')\"\n class=\"rounded-full text-muted-foreground hover:text-rose-600 dark:hover:text-rose-400\"\n >Reject</Button\n >\n </div>\n </AgentDisclosure>\n <p v-if=\"!interactive\" class=\"mt-1 text-sm text-muted-foreground\">\n <RenderNode :node=\"result ?? label\" />\n </p>\n </div>\n </div>\n </div>\n</template>\n"
97
+ },
98
+ {
99
+ "path": "registry/orvui/agents/approval-card/src/QuestionOptions.vue",
100
+ "target": "~/src/components/orvui/agents/approval-card/src/QuestionOptions.vue",
101
+ "type": "registry:component",
102
+ "content": "<script setup lang=\"ts\">\nimport { Checkbox } from \"../../../motion/checkbox\";\nimport { RadioGroup, RadioGroupItem } from \"../../../motion/radio\";\nimport { Input } from \"../../../motion/input\";\nimport { cn } from \"../../../lib/utils\";\nimport type { ApprovalCardAnswer, ApprovalCardQuestion } from \"./types\";\nconst props = defineProps<{\n question: ApprovalCardQuestion;\n answer: ApprovalCardAnswer;\n disabled: boolean;\n}>();\nconst emit = defineEmits<{\n change: [answer: ApprovalCardAnswer];\n singleSelect: [];\n}>();\nfunction multiple(value: string, checked: boolean) {\n const values = new Set(props.answer.selected);\n if (checked) values.add(value);\n else values.delete(value);\n emit(\"change\", { ...props.answer, selected: [...values] });\n}\nfunction single(value: string) {\n emit(\"change\", { selected: [value], custom: \"\" });\n emit(\"singleSelect\");\n}\nfunction custom(value: string) {\n emit(\"change\", {\n selected: props.question.multiple ? props.answer.selected : [],\n custom: value,\n });\n}\n</script>\n<template>\n <div class=\"mt-3\">\n <template v-if=\"question.options?.length\">\n <div v-if=\"question.multiple\" class=\"grid gap-0.5\">\n <Checkbox\n v-for=\"option in question.options\"\n :key=\"option.value\"\n :model-value=\"answer.selected.includes(option.value)\"\n :disabled=\"disabled || option.disabled\"\n :label=\"option.label\"\n :description=\"option.description\"\n @update:model-value=\"multiple(option.value, $event)\"\n class=\"min-h-9 rounded-lg px-1.5 py-1\"\n />\n </div>\n <RadioGroup\n v-else\n :model-value=\"answer.selected[0] ?? ''\"\n @update:model-value=\"single\"\n class=\"gap-0.5\"\n ><RadioGroupItem\n v-for=\"option in question.options\"\n :key=\"option.value\"\n :value=\"option.value\"\n :label=\"option.label\"\n :description=\"option.description\"\n :disabled=\"disabled || option.disabled\"\n class=\"min-h-9 rounded-lg px-1.5 py-1\"\n /></RadioGroup> </template\n ><Input\n v-if=\"question.allowCustom\"\n :model-value=\"answer.custom ?? ''\"\n :disabled=\"disabled\"\n :placeholder=\"question.customPlaceholder ?? 'Add another response…'\"\n aria-label=\"Custom answer\"\n @update:model-value=\"custom\"\n :class=\"cn('p-0.5', question.options?.length && 'mt-1.5')\"\n :class-names=\"{\n field:\n 'h-10 rounded-xl border-0 bg-background/70 focus-within:bg-background',\n input: 'px-3 text-sm',\n }\"\n />\n </div>\n</template>\n"
103
+ },
104
+ {
105
+ "path": "registry/orvui/agents/approval-card/src/types.ts",
106
+ "target": "~/src/components/orvui/agents/approval-card/src/types.ts",
107
+ "type": "registry:lib",
108
+ "content": "import type { Content } from \"../../shared\";\n\nexport type ApprovalCardStatus =\n | \"pending\"\n | \"submitting\"\n | \"approved\"\n | \"rejected\"\n | \"changes-requested\"\n | \"answered\";\n\nexport interface ApprovalCardOption {\n value: string;\n label: string;\n /** Plain supporting text rendered under the label. */\n description?: string;\n disabled?: boolean;\n}\n\nexport interface ApprovalCardQuestion {\n id: string;\n title: Content;\n description?: Content;\n options?: ApprovalCardOption[];\n multiple?: boolean;\n autoAdvance?: boolean;\n allowCustom?: boolean;\n customPlaceholder?: string;\n}\n\nexport interface ApprovalCardAnswer {\n selected: string[];\n custom?: string;\n}\n\nexport type ApprovalCardAnswers = Record<string, ApprovalCardAnswer>;\n\n/** Vue props, including the typed model and business-event listeners. Content is passed through slots. */\nexport type ApprovalCardProps = InstanceType<\n (typeof import(\"./ApprovalCard.vue\"))[\"default\"]\n>[\"$props\"];\n"
109
+ },
110
+ {
111
+ "path": "registry/orvui/agents/chat-app/index.ts",
112
+ "target": "~/src/components/orvui/agents/chat-app/index.ts",
113
+ "type": "registry:lib",
114
+ "content": "export { default as ChatApp } from \"./src/ChatApp.vue\";\n\nexport type * from \"./src/api-types\";\n\nexport * from \"../ai-sidebar\";\nexport * from \"../agent-activity\";\nexport * from \"../approval-card\";\nexport * from \"../code-block\";\nexport * from \"../file-diff\";\nexport * from \"../image-generation\";\nexport * from \"../message\";\nexport * from \"../message-bubble\";\nexport * from \"../message-scroller\";\nexport * from \"../prompt-input\";\nexport * from \"../streaming-response\";\nexport * from \"../loading-states\";\nexport * from \"../todo-list\";\nexport * from \"../tool-approval\";\nexport * from \"../tool-result\";\n"
115
+ },
116
+ {
117
+ "path": "registry/orvui/agents/chat-app/src/api-types.ts",
118
+ "target": "~/src/components/orvui/agents/chat-app/src/api-types.ts",
119
+ "type": "registry:lib",
120
+ "content": "// Vue public prop types, derived from the actual components.\nexport type ChatAppProps = InstanceType<\n (typeof import(\"./ChatApp.vue\"))[\"default\"]\n>[\"$props\"];\n"
121
+ },
122
+ {
123
+ "path": "registry/orvui/agents/chat-app/src/ChatApp.vue",
124
+ "target": "~/src/components/orvui/agents/chat-app/src/ChatApp.vue",
125
+ "type": "registry:component",
126
+ "content": "<script setup lang=\"ts\">\nimport { AnimatedSidebarProvider } from \"../../../motion/animated-sidebar\";\nimport { cn } from \"../../../lib/utils\";\nimport ShellFit from \"./ShellFit.vue\";\ndefineOptions({ inheritAttrs: false });\nwithDefaults(\n defineProps<{\n open?: boolean;\n defaultOpen?: boolean;\n openMobile?: boolean;\n defaultOpenMobile?: boolean;\n mobileOpen?: boolean;\n defaultMobileOpen?: boolean;\n sidebarWidth?: string;\n collapseSidebarBelow?: number;\n shortcut?: boolean;\n }>(),\n {\n open: undefined,\n openMobile: undefined,\n mobileOpen: undefined,\n defaultOpen: true,\n defaultOpenMobile: undefined,\n defaultMobileOpen: false,\n sidebarWidth: \"17rem\",\n collapseSidebarBelow: 600,\n shortcut: true,\n },\n);\nconst emit = defineEmits<{\n \"update:open\": [open: boolean];\n openChange: [open: boolean];\n \"update:openMobile\": [open: boolean];\n openMobileChange: [open: boolean];\n \"update:mobileOpen\": [open: boolean];\n}>();\nfunction desktop(value: boolean) {\n emit(\"update:open\", value);\n emit(\"openChange\", value);\n}\nfunction mobile(value: boolean) {\n emit(\"update:openMobile\", value);\n emit(\"openMobileChange\", value);\n}\n</script>\n<template>\n <AnimatedSidebarProvider\n v-bind=\"$attrs\"\n :open=\"open\"\n :default-open=\"defaultOpen\"\n :open-mobile=\"openMobile\"\n :default-open-mobile=\"defaultOpenMobile\"\n :mobile-open=\"mobileOpen\"\n :default-mobile-open=\"defaultMobileOpen\"\n :shortcut=\"shortcut\"\n :class=\"\n cn(\n 'min-h-0 w-full overflow-hidden rounded-2xl border border-border bg-background',\n $attrs.class,\n )\n \"\n :style=\"[$attrs.style as any, { '--sidebar-width': sidebarWidth }]\"\n @update:open=\"desktop\"\n @update:open-mobile=\"mobile\"\n @update:mobile-open=\"emit('update:mobileOpen', $event)\"\n >\n <ShellFit\n v-if=\"open === undefined\"\n :min-width=\"collapseSidebarBelow\"\n /><slot />\n </AnimatedSidebarProvider>\n</template>\n"
127
+ },
128
+ {
129
+ "path": "registry/orvui/agents/chat-app/src/ShellFit.vue",
130
+ "target": "~/src/components/orvui/agents/chat-app/src/ShellFit.vue",
131
+ "type": "registry:component",
132
+ "content": "<script setup lang=\"ts\">\nimport { onBeforeUnmount, onMounted, ref, watch } from \"vue\";\nimport { useAnimatedSidebar } from \"../../../motion/animated-sidebar\";\nconst props = withDefaults(defineProps<{ minWidth?: number }>(), {\n minWidth: 600,\n});\nconst anchor = ref<HTMLElement>();\nconst sidebar = useAnimatedSidebar();\nlet observer: ResizeObserver | undefined;\nlet alive = false;\nfunction subscribe() {\n observer?.disconnect();\n const shell = anchor.value?.parentElement;\n if (!alive || !shell || typeof ResizeObserver === \"undefined\") return;\n let previous: boolean | undefined;\n observer = new ResizeObserver((entries) => {\n const width = entries[0]?.contentRect.width;\n if (width === undefined) return;\n const compact = width < props.minWidth;\n if (compact === previous) return;\n const initial = previous === undefined;\n previous = compact;\n if (initial && !compact) return;\n if (sidebar.open.value === compact) sidebar.open.value = !compact;\n });\n observer.observe(shell);\n}\nwatch(() => props.minWidth, subscribe);\nonMounted(() => {\n alive = true;\n subscribe();\n});\nonBeforeUnmount(() => {\n alive = false;\n observer?.disconnect();\n});\n</script>\n<template><div ref=\"anchor\" class=\"hidden\" /></template>\n"
133
+ },
134
+ {
135
+ "path": "registry/orvui/agents/citations/index.ts",
136
+ "target": "~/src/components/orvui/agents/citations/index.ts",
137
+ "type": "registry:lib",
138
+ "content": "export { default as Citations } from \"./src/Citations.vue\";\nexport { default as Citation } from \"./src/Citation.vue\";\nexport { default as CitationFavicon } from \"./src/CitationFavicon.vue\";\nexport { default as CitationStack } from \"./src/CitationStack.vue\";\nexport { default as CitationList } from \"./src/CitationList.vue\";\nexport * from \"./src/types\";\n\nexport type * from \"./src/api-types\";\n"
139
+ },
140
+ {
141
+ "path": "registry/orvui/agents/citations/src/api-types.ts",
142
+ "target": "~/src/components/orvui/agents/citations/src/api-types.ts",
143
+ "type": "registry:lib",
144
+ "content": "// Vue public prop types, derived from the actual components.\nexport type CitationListProps = InstanceType<\n (typeof import(\"./CitationList.vue\"))[\"default\"]\n>[\"$props\"];\nexport type CitationProps = InstanceType<\n (typeof import(\"./Citation.vue\"))[\"default\"]\n>[\"$props\"];\nexport type CitationStackProps = InstanceType<\n (typeof import(\"./CitationStack.vue\"))[\"default\"]\n>[\"$props\"];\nexport type CitationsProps = InstanceType<\n (typeof import(\"./Citations.vue\"))[\"default\"]\n>[\"$props\"];\n"
145
+ },
146
+ {
147
+ "path": "registry/orvui/agents/citations/src/Citation.vue",
148
+ "target": "~/src/components/orvui/agents/citations/src/Citation.vue",
149
+ "type": "registry:component",
150
+ "content": "<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount } from \"vue\";\nconst props = defineProps<{\n citationId: string;\n index: number;\n idPrefix: string;\n label?: string;\n}>();\nconst targetId = computed(\n () => `${props.idPrefix}-${props.citationId.replace(/[^a-zA-Z0-9_-]/g, \"-\")}`,\n);\nlet pending: ReturnType<typeof setTimeout> | undefined;\nfunction reveal(event: MouseEvent) {\n const row = document.getElementById(targetId.value);\n if (!row) return;\n event.preventDefault();\n row\n .closest(\"[data-citations]\")\n ?.querySelector<HTMLButtonElement>('button[aria-expanded=\"false\"]')\n ?.click();\n if (pending !== undefined) clearTimeout(pending);\n pending = setTimeout(() => {\n if (!row.isConnected) return;\n row.scrollIntoView?.({\n behavior: matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n ? \"instant\"\n : \"smooth\",\n block: \"nearest\",\n });\n row.focus({ preventScroll: true });\n }, 50);\n}\nonBeforeUnmount(() => {\n if (pending !== undefined) clearTimeout(pending);\n});\n</script>\n<template>\n <a\n :href=\"`#${targetId}`\"\n :aria-label=\"label || `View citation ${index}`\"\n @click=\"reveal\"\n class=\"mx-0.5 inline-flex min-w-4 -translate-y-0.5 items-center justify-center rounded-md bg-muted/60 px-1 py-0.5 text-[10px] font-semibold leading-none text-muted-foreground no-underline outline-none transition-colors hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring\"\n >{{ index }}</a\n >\n</template>\n"
151
+ },
152
+ {
153
+ "path": "registry/orvui/agents/citations/src/CitationFavicon.vue",
154
+ "target": "~/src/components/orvui/agents/citations/src/CitationFavicon.vue",
155
+ "type": "registry:component",
156
+ "content": "<script setup lang=\"ts\">\nimport {\n computed,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n watch,\n} from \"vue\";\nimport { Globe2 } from \"lucide-vue-next\";\nimport { RenderNode, type Content } from \"../../shared\";\nconst props = defineProps<{ url?: string; icon?: Content }>();\nconst image = ref<HTMLImageElement>();\nconst failed = ref<string>();\nconst address = computed(() => {\n if (props.icon || !props.url) return undefined;\n try {\n return new URL(\"/favicon.ico\", props.url).href;\n } catch {\n return undefined;\n }\n});\nlet alive = false,\n revision = 0;\nasync function verify() {\n const request = ++revision;\n const url = address.value;\n if (!alive || !url) return;\n await nextTick();\n const candidate = image.value;\n if (!candidate || typeof candidate.decode !== \"function\") return;\n try {\n await candidate.decode();\n } catch {\n if (alive && request === revision) failed.value = url;\n }\n}\nwatch(address, verify, { flush: \"post\" });\nonMounted(() => {\n alive = true;\n verify();\n});\nonBeforeUnmount(() => {\n alive = false;\n revision++;\n});\n</script>\n<template>\n <span\n aria-hidden=\"true\"\n class=\"grid size-5 shrink-0 place-items-center text-muted-foreground [&>svg]:size-3.5\"\n >\n <RenderNode v-if=\"icon\" :node=\"icon\" />\n <img\n v-else-if=\"address && failed !== address\"\n ref=\"image\"\n :src=\"address\"\n alt=\"\"\n width=\"16\"\n height=\"16\"\n referrerpolicy=\"no-referrer\"\n class=\"size-4 rounded-sm object-contain\"\n @error=\"failed = address\"\n />\n <Globe2 v-else class=\"size-3.5\" />\n </span>\n</template>\n"
157
+ },
158
+ {
159
+ "path": "registry/orvui/agents/citations/src/CitationList.vue",
160
+ "target": "~/src/components/orvui/agents/citations/src/CitationList.vue",
161
+ "type": "registry:component",
162
+ "content": "<script setup lang=\"ts\">\nimport { useId } from \"vue\";\nimport { AnimatePresence, motion } from \"motion-v\";\nimport { ExternalLink } from \"lucide-vue-next\";\nimport { EASE_OUT, SPRING_LAYOUT } from \"../../../lib/ease\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nimport { RenderNode } from \"../../shared\";\nimport CitationFavicon from \"./CitationFavicon.vue\";\nimport type { CitationItem } from \"./types\";\nconst props = defineProps<{ citations: CitationItem[]; idPrefix?: string }>();\nconst instanceId = useId();\nconst reduced = useReducedMotion();\nconst rowId = (id: string) =>\n `${props.idPrefix ?? `citation-list-${instanceId.replace(/:/g, \"\")}`}-${id.replace(/[^a-zA-Z0-9_-]/g, \"-\")}`;\n</script>\n<template>\n <div class=\"grid gap-0.5\">\n <AnimatePresence mode=\"popLayout\" as=\"div\" class=\"contents\">\n <motion.div\n v-for=\"(item, index) in citations\"\n :key=\"item.id\"\n layout=\"position\"\n :initial=\"reduced ? { opacity: 1 } : { opacity: 0, y: 6 }\"\n :animate=\"{ opacity: 1, y: 0 }\"\n :exit=\"reduced ? { opacity: 0 } : { opacity: 0, y: -3 }\"\n :transition=\"\n reduced\n ? { duration: 0 }\n : {\n opacity: { duration: 0.18, ease: EASE_OUT },\n y: SPRING_LAYOUT,\n layout: SPRING_LAYOUT,\n }\n \"\n >\n <component\n :is=\"item.url ? 'a' : 'div'\"\n :id=\"rowId(item.id)\"\n :href=\"item.url\"\n :target=\"item.url ? '_blank' : undefined\"\n :rel=\"item.url ? 'noreferrer noopener' : undefined\"\n :tabindex=\"item.url ? undefined : -1\"\n class=\"group/citation flex items-center gap-2 rounded-md px-1.5 py-1 outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <CitationFavicon :url=\"item.url\" :icon=\"item.icon\" />\n <span\n class=\"flex min-w-0 flex-1 flex-wrap items-baseline gap-x-2 gap-y-0.5\"\n >\n <span\n class=\"truncate text-sm font-medium text-foreground/80 transition-colors group-hover/citation:text-foreground\"\n ><RenderNode :node=\"item.title\"\n /></span>\n <span\n v-if=\"item.domain\"\n class=\"min-w-0 truncate text-xs text-muted-foreground/60\"\n ><RenderNode :node=\"item.domain\"\n /></span>\n </span>\n <span class=\"flex shrink-0 items-center gap-1.5\"\n ><span\n class=\"grid size-5 place-items-center rounded-md bg-foreground/[0.05] text-[10px] font-semibold tabular-nums text-muted-foreground\"\n >{{ index + 1 }}</span\n >\n <ExternalLink\n v-if=\"item.url\"\n class=\"size-3.5 text-muted-foreground/65 transition-colors group-hover/citation:text-muted-foreground group-focus-visible/citation:text-muted-foreground\"\n />\n </span>\n </component>\n </motion.div>\n </AnimatePresence>\n </div>\n</template>\n"
163
+ },
164
+ {
165
+ "path": "registry/orvui/agents/citations/src/Citations.vue",
166
+ "target": "~/src/components/orvui/agents/citations/src/Citations.vue",
167
+ "type": "registry:component",
168
+ "content": "<script setup lang=\"ts\">\nimport { useId } from \"vue\";\nimport { motion } from \"motion-v\";\nimport { BookOpenText, ChevronDown } from \"lucide-vue-next\";\nimport { SPRING_SWAP } from \"../../../lib/ease\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nimport { RenderNode, useControllable, type Content } from \"../../shared\";\nimport AgentDisclosure from \"../../AgentDisclosure.vue\";\nimport CitationList from \"./CitationList.vue\";\nimport type { CitationItem } from \"./types\";\nconst props = withDefaults(\n defineProps<{\n citations: CitationItem[];\n title?: Content;\n open?: boolean;\n defaultOpen?: boolean;\n idPrefix?: string;\n }>(),\n { title: \"Sources\", open: undefined, defaultOpen: false },\n);\nconst emit = defineEmits<{\n \"update:open\": [open: boolean];\n openChange: [open: boolean];\n}>();\nconst disclosure = useControllable(\n () => props.open,\n props.defaultOpen,\n (value) => {\n emit(\"update:open\", value);\n emit(\"openChange\", value);\n },\n);\nconst identity = useId();\nconst reduced = useReducedMotion();\n</script>\n<template>\n <div data-citations class=\"w-full text-sm\">\n <button\n type=\"button\"\n :aria-expanded=\"disclosure\"\n :aria-controls=\"`${identity}-content`\"\n @click=\"disclosure = !disclosure\"\n class=\"group -ml-1 flex min-h-8 items-center gap-2 rounded-lg px-1 text-left text-muted-foreground outline-none transition-colors hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <BookOpenText class=\"size-4\" /><span class=\"font-medium\"\n ><RenderNode :node=\"title\"\n /></span>\n <span\n class=\"rounded-full bg-muted px-1.5 py-0.5 text-[10px] font-semibold tabular-nums\"\n >{{ citations.length }}</span\n >\n <motion.span\n aria-hidden=\"true\"\n class=\"text-muted-foreground/60\"\n :animate=\"{ rotate: disclosure ? 180 : 0 }\"\n :transition=\"reduced ? { duration: 0 } : SPRING_SWAP\"\n ><ChevronDown class=\"size-3.5\"\n /></motion.span>\n </button>\n <AgentDisclosure :id=\"`${identity}-content`\" :open=\"disclosure\"\n ><CitationList\n class=\"mt-1\"\n :citations=\"citations\"\n :id-prefix=\"idPrefix ?? `citation-${identity.replace(/:/g, '')}`\"\n /></AgentDisclosure>\n </div>\n</template>\n"
169
+ },
170
+ {
171
+ "path": "registry/orvui/agents/citations/src/CitationStack.vue",
172
+ "target": "~/src/components/orvui/agents/citations/src/CitationStack.vue",
173
+ "type": "registry:component",
174
+ "content": "<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport CitationFavicon from \"./CitationFavicon.vue\";\nimport type { CitationItem } from \"./types\";\nconst props = withDefaults(\n defineProps<{ citations: CitationItem[]; limit?: number }>(),\n { limit: 3 },\n);\nconst visible = computed(() => props.citations.slice(0, props.limit));\n</script>\n<template>\n <span aria-hidden=\"true\" class=\"flex -space-x-1.5\"\n ><CitationFavicon\n v-for=\"item in visible\"\n :key=\"item.id\"\n :url=\"item.url\"\n :icon=\"item.icon\"\n class=\"size-6 rounded-full bg-background ring-2 ring-background\"\n /></span>\n</template>\n"
175
+ },
176
+ {
177
+ "path": "registry/orvui/agents/citations/src/types.ts",
178
+ "target": "~/src/components/orvui/agents/citations/src/types.ts",
179
+ "type": "registry:lib",
180
+ "content": "import type { Content } from \"../../shared\";\nexport interface CitationItem {\n id: string;\n title: Content;\n domain?: Content;\n url?: string;\n icon?: Content;\n}\n"
181
+ },
182
+ {
183
+ "path": "registry/orvui/agents/code-block/index.ts",
184
+ "target": "~/src/components/orvui/agents/code-block/index.ts",
185
+ "type": "registry:lib",
186
+ "content": "export { default as CodeBlock } from \"./src/CodeBlock.vue\";\nexport { default as AgentCode } from \"./src/AgentCode.vue\";\nexport { default as AgentCodeLine } from \"./src/AgentCodeLine.vue\";\nexport * from \"./src/tokens\";\nexport type { AgentCodeLanguage } from \"./src/AgentCode.vue\";\n\nexport type * from \"./src/api-types\";\n\nexport type CodeBlockStatus = NonNullable<\n import(\"./src/api-types\").CodeBlockProps[\"status\"]\n>;\n"
187
+ },
188
+ {
189
+ "path": "registry/orvui/agents/code-block/src/AgentCode.vue",
190
+ "target": "~/src/components/orvui/agents/code-block/src/AgentCode.vue",
191
+ "type": "registry:component",
192
+ "content": "<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { cn } from \"../../../lib/utils\";\nimport AgentCodeLine from \"./AgentCodeLine.vue\";\nimport { useAgentCodeTokens } from \"./tokens\";\nexport type AgentCodeLanguage =\n | \"bash\"\n | \"diff\"\n | \"json\"\n | \"text\"\n | \"tsx\"\n | \"typescript\"\n | \"javascript\"\n | \"vue\"\n | \"css\"\n | \"html\";\nconst props = withDefaults(\n defineProps<{\n code: string;\n language?: AgentCodeLanguage;\n showLineNumbers?: boolean;\n highlightLines?: number[];\n wrap?: boolean;\n }>(),\n {\n language: \"bash\",\n showLineNumbers: false,\n highlightLines: () => [],\n wrap: false,\n },\n);\nconst content = computed(() => props.code.split(\"\\n\"));\nconst tokens = useAgentCodeTokens(\n () => props.code,\n () => props.language,\n);\n</script>\n<template>\n <pre\n :class=\"\n cn(\n 'm-0 overflow-x-auto whitespace-pre font-mono text-xs leading-5 text-foreground/85',\n wrap && 'whitespace-pre-wrap break-words',\n )\n \"\n ><code><template v-for=\"(line, index) in content\" :key=\"index\"><span v-if=\"showLineNumbers\" aria-hidden=\"true\" class=\"inline-block w-11 select-none pr-3 text-right tabular-nums text-muted-foreground/55\">{{ index + 1 }}</span><AgentCodeLine :code=\"line\" :tokens=\"tokens?.[index]\" :class=\"highlightLines.includes(index + 1) ? 'bg-blue-500/[0.07]' : undefined\" />{{ index + 1 < content.length ? '\\n' : '' }}</template></code></pre>\n</template>\n"
193
+ },
194
+ {
195
+ "path": "registry/orvui/agents/code-block/src/AgentCodeLine.vue",
196
+ "target": "~/src/components/orvui/agents/code-block/src/AgentCodeLine.vue",
197
+ "type": "registry:component",
198
+ "content": "<script setup lang=\"ts\">\nimport type { AgentCodeToken } from \"./tokens\";\ndefineProps<{ code: string; tokens?: AgentCodeToken[] }>();\n</script>\n<template>\n <span\n ><template v-if=\"tokens\"\n ><span\n v-for=\"(token, index) in tokens\"\n :key=\"`${token.offset}-${index}`\"\n class=\"text-[var(--agent-code-light)] dark:text-[var(--agent-code-dark)]\"\n :style=\"{\n '--agent-code-light': token.light || 'currentColor',\n '--agent-code-dark': token.dark || token.light || 'currentColor',\n }\"\n >{{ token.content }}</span\n ></template\n ><template v-else>{{ code }}</template></span\n >\n</template>\n"
199
+ },
200
+ {
201
+ "path": "registry/orvui/agents/code-block/src/api-types.ts",
202
+ "target": "~/src/components/orvui/agents/code-block/src/api-types.ts",
203
+ "type": "registry:lib",
204
+ "content": "// Vue public prop types, derived from the actual components.\nexport type CodeBlockProps = InstanceType<\n (typeof import(\"./CodeBlock.vue\"))[\"default\"]\n>[\"$props\"];\n"
205
+ },
206
+ {
207
+ "path": "registry/orvui/agents/code-block/src/CodeBlock.vue",
208
+ "target": "~/src/components/orvui/agents/code-block/src/CodeBlock.vue",
209
+ "type": "registry:component",
210
+ "content": "<script setup lang=\"ts\">\nimport {\n computed,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n watch,\n} from \"vue\";\nimport { Check, Copy, FileCode2, LoaderCircle } from \"lucide-vue-next\";\nimport { motion } from \"motion-v\";\nimport { cn } from \"../../../lib/utils\";\nimport { SPRING_PRESS } from \"../../../lib/ease\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nimport { RenderNode, useClipboard, type Content } from \"../../shared\";\nimport AgentCodeLine from \"./AgentCodeLine.vue\";\nimport type { AgentCodeLanguage } from \"./AgentCode.vue\";\nimport { useAgentCodeTokens } from \"./tokens\";\nconst props = withDefaults(\n defineProps<{\n code: string;\n language?: AgentCodeLanguage;\n filename?: Content;\n status?: \"streaming\" | \"complete\";\n showLineNumbers?: boolean;\n highlightLines?: number[];\n maxHeight?: number;\n wrap?: boolean;\n copyable?: boolean;\n onCopy?: () => void | Promise<void>;\n }>(),\n {\n language: \"typescript\",\n status: \"complete\",\n showLineNumbers: true,\n highlightLines: () => [],\n maxHeight: 280,\n wrap: false,\n copyable: true,\n },\n);\nconst reduced = useReducedMotion();\nconst { copy, copied } = useClipboard(\n () => props.code,\n () =>\n props.onCopy ? props.onCopy() : navigator.clipboard.writeText(props.code),\n);\nconst viewport = ref<HTMLElement>();\nconst working = computed(() => props.status === \"streaming\");\nconst rows = computed(() => props.code.split(\"\\n\"));\nconst tokens = useAgentCodeTokens(\n () => props.code,\n () => props.language,\n);\nlet mounted = false,\n queued: number | undefined,\n version = 0;\nasync function follow() {\n const request = ++version;\n if (queued !== undefined) cancelAnimationFrame(queued);\n if (!mounted || !working.value) return;\n await nextTick();\n if (!mounted || request !== version) return;\n queued = requestAnimationFrame(() => {\n queued = undefined;\n const element = viewport.value;\n if (\n !element ||\n !working.value ||\n element.scrollHeight <= element.clientHeight\n )\n return;\n if (typeof element.scrollTo === \"function\")\n element.scrollTo({\n top: element.scrollHeight,\n behavior: reduced.value ? \"auto\" : \"smooth\",\n });\n else element.scrollTop = element.scrollHeight;\n });\n}\nwatch([() => props.code, working], follow, { flush: \"post\" });\nonMounted(() => {\n mounted = true;\n follow();\n});\nonBeforeUnmount(() => {\n mounted = false;\n version++;\n if (queued !== undefined) cancelAnimationFrame(queued);\n});\n</script>\n<template>\n <div\n :data-state=\"status\"\n :aria-busy=\"working\"\n class=\"w-full overflow-hidden rounded-2xl bg-muted/80 text-sm\"\n >\n <div class=\"flex h-10 items-center gap-2.5 px-3\">\n <FileCode2\n aria-hidden=\"true\"\n class=\"size-3.5 shrink-0 text-muted-foreground/70\"\n />\n <span\n v-if=\"filename\"\n class=\"min-w-0 truncate font-mono text-xs text-foreground/80\"\n ><RenderNode :node=\"filename\"\n /></span>\n <span\n class=\"text-[10px] font-medium uppercase tracking-wide text-muted-foreground/55\"\n >{{ language }}</span\n >\n <span\n :class=\"\n cn(\n 'ml-auto inline-flex shrink-0 items-center gap-1 text-[10px] font-medium',\n working\n ? 'text-blue-600 dark:text-blue-400'\n : 'text-emerald-600 dark:text-emerald-400',\n )\n \"\n >\n <LoaderCircle\n v-if=\"working\"\n :class=\"cn('size-3', !reduced && 'animate-spin')\"\n /><Check v-else class=\"size-3\" />{{ working ? \"Writing\" : \"Ready\" }}\n </span>\n <motion.button\n v-if=\"copyable || onCopy\"\n type=\"button\"\n :aria-label=\"copied ? 'Copied' : 'Copy code'\"\n :title=\"copied ? 'Copied' : 'Copy code'\"\n @click=\"copy\"\n :while-press=\"reduced ? undefined : { scale: 0.9 }\"\n :transition=\"SPRING_PRESS\"\n class=\"grid size-7 shrink-0 place-items-center rounded-full text-muted-foreground outline-none transition-colors hover:bg-background/70 hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Check v-if=\"copied\" class=\"size-3.5\" /><Copy v-else class=\"size-3.5\" />\n </motion.button>\n </div>\n <div\n ref=\"viewport\"\n :role=\"working ? 'log' : undefined\"\n :aria-live=\"working ? 'polite' : undefined\"\n class=\"scrollbar-hide overflow-auto border-t border-foreground/[0.06] py-2\"\n :style=\"{ maxHeight: `${maxHeight}px` }\"\n >\n <pre\n class=\"m-0 min-w-max font-mono text-xs leading-5 text-foreground/85\"\n ><code><span v-for=\"(line, index) in rows\" :key=\"index\" :class=\"cn('grid min-h-5', showLineNumbers ? 'grid-cols-[2.75rem_minmax(0,1fr)]' : 'grid-cols-1', highlightLines.includes(index + 1) && 'bg-blue-500/[0.07]')\"><span v-if=\"showLineNumbers\" class=\"select-none pr-3 text-right tabular-nums text-muted-foreground/55\">{{ index + 1 }}</span><AgentCodeLine :code=\"line\" :tokens=\"tokens?.[index]\" :class=\"cn('pr-4', showLineNumbers ? 'pl-1' : 'pl-4', wrap ? 'whitespace-pre-wrap break-words' : 'whitespace-pre')\" /></span></code></pre>\n </div>\n </div>\n</template>\n"
211
+ },
212
+ {
213
+ "path": "registry/orvui/agents/code-block/src/tokens.ts",
214
+ "target": "~/src/components/orvui/agents/code-block/src/tokens.ts",
215
+ "type": "registry:lib",
216
+ "content": "import {\n computed,\n onBeforeUnmount,\n onMounted,\n shallowRef,\n toValue,\n watch,\n type MaybeRefOrGetter,\n} from \"vue\";\nimport type { Highlighter } from \"shiki\";\nimport type { AgentCodeLanguage } from \"./AgentCode.vue\";\nexport interface AgentCodeToken {\n content: string;\n offset: number;\n light?: string;\n dark?: string;\n}\nexport type AgentCodeTokenLines = AgentCodeToken[][];\nconst results = new Map<string, AgentCodeTokenLines>();\nlet engine: Promise<Highlighter> | undefined;\nconst obtainEngine = () =>\n (engine ??= import(\"shiki\").then((module) =>\n module.createHighlighter({\n themes: [\"github-light-high-contrast\", \"github-dark-high-contrast\"],\n langs: [\n \"bash\",\n \"diff\",\n \"json\",\n \"tsx\",\n \"typescript\",\n \"javascript\",\n \"vue\",\n \"css\",\n \"html\",\n ],\n }),\n ));\nexport function useAgentCodeTokens(\n code: MaybeRefOrGetter<string>,\n language: MaybeRefOrGetter<AgentCodeLanguage>,\n) {\n const snapshot = shallowRef<{\n code: string;\n language: AgentCodeLanguage;\n lines: AgentCodeTokenLines;\n }>();\n let active = false,\n request = 0;\n async function refresh() {\n const revision = ++request;\n if (!active) return;\n const text = toValue(code),\n grammar = toValue(language),\n key = JSON.stringify([grammar, text]);\n try {\n let lines = results.get(key);\n if (!lines) {\n const highlighter = await obtainEngine();\n if (!active || revision !== request) return;\n lines = highlighter\n .codeToTokensWithThemes(text, {\n lang: grammar,\n themes: {\n light: \"github-light-high-contrast\",\n dark: \"github-dark-high-contrast\",\n },\n })\n .map((line) =>\n line.map((token) => ({\n content: token.content,\n offset: token.offset,\n light: token.variants.light?.color,\n dark: token.variants.dark?.color,\n })),\n );\n // Bound the shared memo so long-running streaming sessions can release old text.\n if (results.size >= 48) results.delete(results.keys().next().value!);\n results.set(key, lines);\n }\n if (active && revision === request)\n snapshot.value = { code: text, language: grammar, lines };\n } catch {\n if (active && revision === request) snapshot.value = undefined;\n }\n }\n watch([() => toValue(code), () => toValue(language)], refresh);\n onMounted(() => {\n active = true;\n refresh();\n });\n onBeforeUnmount(() => {\n active = false;\n request++;\n });\n return computed(() => {\n const current = snapshot.value;\n return current?.language === toValue(language) &&\n toValue(code).startsWith(current.code)\n ? current.lines\n : null;\n });\n}\n"
217
+ },
218
+ {
219
+ "path": "registry/orvui/agents/file-diff/index.ts",
220
+ "target": "~/src/components/orvui/agents/file-diff/index.ts",
221
+ "type": "registry:lib",
222
+ "content": "export { default as FileDiff } from \"./src/FileDiff.vue\";\nexport * from \"./src/types\";\n\nexport type * from \"./src/api-types\";\n"
223
+ },
224
+ {
225
+ "path": "registry/orvui/agents/file-diff/src/api-types.ts",
226
+ "target": "~/src/components/orvui/agents/file-diff/src/api-types.ts",
227
+ "type": "registry:lib",
228
+ "content": "// Vue public prop types, derived from the actual components.\nexport type FileDiffProps = InstanceType<\n (typeof import(\"./FileDiff.vue\"))[\"default\"]\n>[\"$props\"];\n"
229
+ },
230
+ {
231
+ "path": "registry/orvui/agents/file-diff/src/FileDiff.vue",
232
+ "target": "~/src/components/orvui/agents/file-diff/src/FileDiff.vue",
233
+ "type": "registry:component",
234
+ "content": "<script setup lang=\"ts\">\nimport { computed, ref, useId, watch } from \"vue\";\nimport { motion } from \"motion-v\";\nimport {\n Check,\n ChevronDown,\n Copy,\n FileCode2,\n LoaderCircle,\n} from \"lucide-vue-next\";\nimport { cn } from \"../../../lib/utils\";\nimport { SPRING_PRESS, SPRING_SWAP } from \"../../../lib/ease\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nimport {\n AgentCodeLine,\n useAgentCodeTokens,\n type AgentCodeLanguage,\n} from \"../../code-block\";\nimport {\n RenderNode,\n useClipboard,\n useControllable,\n type Content,\n} from \"../../shared\";\nimport { useStreamFollow } from \"../../stream-follow\";\nimport AgentDisclosure from \"../../AgentDisclosure.vue\";\nimport type { FileDiffLine, FileDiffStatus } from \"./types\";\nconst props = withDefaults(\n defineProps<{\n file: Content;\n lines: FileDiffLine[];\n status?: FileDiffStatus;\n open?: boolean;\n defaultOpen?: boolean;\n collapseOnComplete?: boolean;\n maxHeight?: number;\n language?: AgentCodeLanguage;\n copyText?: string;\n onCopy?: () => void | Promise<void>;\n }>(),\n {\n status: \"streaming\",\n open: undefined,\n defaultOpen: true,\n collapseOnComplete: true,\n maxHeight: 220,\n language: \"typescript\",\n },\n);\nconst emit = defineEmits<{\n \"update:open\": [open: boolean];\n openChange: [open: boolean];\n}>();\nconst expanded = useControllable(\n () => props.open,\n props.defaultOpen,\n (value) => {\n emit(\"update:open\", value);\n emit(\"openChange\", value);\n },\n);\nconst identity = useId();\nconst reduced = useReducedMotion();\nconst viewport = ref<HTMLElement>();\nconst counts = computed(() =>\n props.lines.reduce(\n (total, line) => {\n if (line.type === \"added\") total.added++;\n if (line.type === \"removed\") total.removed++;\n return total;\n },\n { added: 0, removed: 0 },\n ),\n);\nconst tokens = useAgentCodeTokens(\n () => props.lines.map((line) => line.content).join(\"\\n\"),\n () => props.language,\n);\nconst { copy, copied } = useClipboard(\n () => props.copyText ?? \"\",\n () =>\n props.onCopy\n ? props.onCopy()\n : navigator.clipboard.writeText(props.copyText ?? \"\"),\n);\nwatch(\n () => props.status,\n (status, previous) => {\n if (status === \"streaming\" && previous !== status) expanded.value = true;\n else if (\n previous === \"streaming\" &&\n status === \"complete\" &&\n props.collapseOnComplete\n )\n expanded.value = false;\n },\n);\nuseStreamFollow(\n viewport,\n () => expanded.value && props.status === \"streaming\",\n reduced,\n [() => props.lines, () => props.status, expanded],\n);\nconst sign = (line: FileDiffLine) =>\n line.type === \"added\" ? \"+\" : line.type === \"removed\" ? \"−\" : \"\";\nconst color = (line: FileDiffLine) =>\n line.type === \"added\"\n ? \"text-emerald-600 dark:text-emerald-400\"\n : line.type === \"removed\"\n ? \"text-rose-600 dark:text-rose-400\"\n : \"\";\n</script>\n<template>\n <div\n :data-state=\"status\"\n :aria-busy=\"status === 'streaming'\"\n class=\"w-full text-sm\"\n >\n <button\n :id=\"`${identity}-trigger`\"\n type=\"button\"\n :aria-expanded=\"expanded\"\n :aria-controls=\"`${identity}-content`\"\n @click=\"expanded = !expanded\"\n class=\"group flex min-h-9 w-full items-center gap-2 rounded-md py-1 text-left outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n >\n <FileCode2\n aria-hidden=\"true\"\n class=\"size-4 shrink-0 text-muted-foreground\"\n />\n <span class=\"min-w-0 flex-1 truncate font-mono text-xs text-foreground/80\"\n ><RenderNode :node=\"file\"\n /></span>\n <span class=\"flex shrink-0 items-center gap-2\"\n ><span\n v-if=\"counts.added\"\n class=\"font-mono text-xs tabular-nums text-emerald-600 dark:text-emerald-400\"\n >+{{ counts.added }}</span\n ><span\n v-if=\"counts.removed\"\n class=\"font-mono text-xs tabular-nums text-rose-600 dark:text-rose-400\"\n >−{{ counts.removed }}</span\n ></span\n >\n <span\n class=\"grid size-4 shrink-0 place-items-center text-muted-foreground/60\"\n ><LoaderCircle\n v-if=\"status === 'streaming'\"\n aria-label=\"Applying changes\"\n :class=\"cn('size-3.5', !reduced && 'animate-spin')\" /><Check\n v-else\n aria-label=\"Changes applied\"\n class=\"size-3.5\"\n /></span>\n <motion.span\n aria-hidden=\"true\"\n class=\"shrink-0 text-muted-foreground/45 transition-colors group-hover:text-muted-foreground\"\n :animate=\"{ rotate: expanded ? 180 : 0 }\"\n :transition=\"reduced ? { duration: 0 } : SPRING_SWAP\"\n ><ChevronDown class=\"size-3.5\"\n /></motion.span>\n </button>\n <AgentDisclosure\n :id=\"`${identity}-content`\"\n role=\"region\"\n :aria-labelledby=\"`${identity}-trigger`\"\n :open=\"expanded\"\n >\n <div class=\"pl-6 pt-1.5\">\n <div class=\"overflow-hidden rounded-xl bg-muted/80\">\n <div\n ref=\"viewport\"\n data-slot=\"file-diff-viewport\"\n aria-live=\"polite\"\n class=\"scrollbar-hide overflow-auto\"\n :style=\"{ maxHeight: `${maxHeight}px` }\"\n >\n <div class=\"font-mono text-xs leading-5\">\n <span class=\"sr-only\">File changes</span>\n <div\n v-for=\"(line, index) in lines\"\n :key=\"line.id\"\n :class=\"\n cn(\n 'grid grid-cols-[2.25rem_2.25rem_1rem_minmax(0,1fr)]',\n line.type === 'added' && 'bg-emerald-500/[0.07]',\n line.type === 'removed' && 'bg-rose-500/[0.07]',\n )\n \"\n >\n <span\n class=\"select-none pr-2 text-right tabular-nums text-muted-foreground/55\"\n >{{ line.oldLine }}</span\n ><span\n class=\"select-none pr-2 text-right tabular-nums text-muted-foreground/55\"\n >{{ line.newLine }}</span\n >\n <span\n :class=\"\n cn(\n 'select-none text-center text-muted-foreground/45',\n color(line),\n )\n \"\n >{{ sign(line) }}</span\n ><AgentCodeLine\n :code=\"line.content\"\n :tokens=\"tokens?.[index]\"\n class=\"min-w-0 whitespace-pre px-1.5\"\n />\n </div>\n </div>\n </div>\n <div\n v-if=\"copyText || onCopy\"\n class=\"flex justify-end px-2 pb-1.5 pt-1\"\n >\n <motion.button\n type=\"button\"\n :aria-label=\"copied ? 'Copied' : 'Copy diff'\"\n :title=\"copied ? 'Copied' : 'Copy diff'\"\n @click=\"copy\"\n :while-press=\"reduced ? undefined : { scale: 0.9 }\"\n :transition=\"SPRING_PRESS\"\n class=\"grid size-7 place-items-center rounded-md text-muted-foreground outline-none transition-colors hover:bg-background/70 hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring\"\n ><Check v-if=\"copied\" class=\"size-3.5\" /><Copy\n v-else\n class=\"size-3.5\"\n /></motion.button>\n </div>\n </div>\n </div>\n </AgentDisclosure>\n </div>\n</template>\n"
235
+ },
236
+ {
237
+ "path": "registry/orvui/agents/file-diff/src/types.ts",
238
+ "target": "~/src/components/orvui/agents/file-diff/src/types.ts",
239
+ "type": "registry:lib",
240
+ "content": "export type FileDiffStatus = \"streaming\" | \"complete\";\nexport type FileDiffLineType = \"added\" | \"removed\" | \"context\";\nexport interface FileDiffLine {\n id: string;\n type?: FileDiffLineType;\n oldLine?: number;\n newLine?: number;\n content: string;\n}\n"
241
+ },
242
+ {
243
+ "path": "registry/orvui/agents/image-generation/index.ts",
244
+ "target": "~/src/components/orvui/agents/image-generation/index.ts",
245
+ "type": "registry:lib",
246
+ "content": "export { default as ImageGeneration } from \"./src/ImageGeneration.vue\";\nexport type { ImageGenerationStatus } from \"./src/ImageGeneration.vue\";\n\nexport type * from \"./src/api-types\";\n"
247
+ },
248
+ {
249
+ "path": "registry/orvui/agents/image-generation/src/api-types.ts",
250
+ "target": "~/src/components/orvui/agents/image-generation/src/api-types.ts",
251
+ "type": "registry:lib",
252
+ "content": "// Vue public prop types, derived from the actual components.\nexport type ImageGenerationProps = InstanceType<\n (typeof import(\"./ImageGeneration.vue\"))[\"default\"]\n>[\"$props\"];\n"
253
+ },
254
+ {
255
+ "path": "registry/orvui/agents/image-generation/src/dither.ts",
256
+ "target": "~/src/components/orvui/agents/image-generation/src/dither.ts",
257
+ "type": "registry:lib",
258
+ "content": "interface Dot {\n x: number;\n y: number;\n}\n\n/** Creates a responsive lattice and owns its animation and pointer subscriptions. */\nexport function createDitherField(\n canvas: HTMLCanvasElement,\n interactive: boolean,\n reduce: boolean,\n canHover: boolean,\n) {\n const brush = canvas.getContext(\"2d\");\n if (!brush) return () => {};\n let disposed = false;\n let width = 208,\n height = 208,\n color = \"currentColor\";\n let dots: Dot[] = [];\n let pointer: Dot | null = null;\n let focus: Dot = { x: width / 2, y: height / 2 };\n let frame: number | undefined;\n let last: number | undefined;\n const followsPointer = interactive && canHover && !reduce;\n\n const render = (time: number) => {\n frame = undefined;\n if (disposed) return;\n const elapsed =\n last === undefined ? 1000 / 60 : Math.min(100, Math.max(0, time - last));\n last = time;\n const goal = pointer ?? {\n x: width * (0.5 + (reduce ? 0 : 0.12 * Math.sin(time / 1700))),\n y: height * (0.5 + (reduce ? 0 : 0.1 * Math.cos(time / 2100))),\n };\n const response = reduce\n ? 1\n : 1 - Math.pow(pointer ? 0.84 : 0.955, elapsed * 0.06);\n focus.x += (goal.x - focus.x) * response;\n focus.y += (goal.y - focus.y) * response;\n const reach = Math.min(width, height) * 0.38;\n brush.clearRect(0, 0, width, height);\n brush.fillStyle = color;\n for (const dot of dots) {\n const dx = dot.x - focus.x,\n dy = dot.y - focus.y;\n const distance = Math.hypot(dx, dy);\n const phase = Math.min(1, distance / reach);\n const intensity = 0.5 + 0.5 * Math.cos(phase * Math.PI);\n const offset = intensity * intensity * 9;\n const ratio = distance > 0 ? offset / distance : 0;\n brush.globalAlpha = 0.17 + intensity * 0.72;\n brush.beginPath();\n brush.arc(\n dot.x + dx * ratio,\n dot.y + dy * ratio,\n 0.65 + intensity * 0.85,\n 0,\n Math.PI * 2,\n );\n brush.fill();\n }\n brush.globalAlpha = 1;\n if (!reduce) frame = requestAnimationFrame(render);\n };\n const resize = () => {\n if (disposed) return;\n const bounds = canvas.getBoundingClientRect();\n width = bounds.width || canvas.clientWidth || 208;\n height = bounds.height || canvas.clientHeight || 208;\n const pixelRatio = Math.min(2, window.devicePixelRatio || 1);\n canvas.width = Math.round(width * pixelRatio);\n canvas.height = Math.round(height * pixelRatio);\n brush.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n color = getComputedStyle(canvas).color;\n const columns = Math.ceil(width / 10),\n rows = Math.ceil(height / 10);\n const left = (width - columns * 10) / 2,\n top = (height - rows * 10) / 2;\n dots = Array.from({ length: (columns + 1) * (rows + 1) }, (_, index) => ({\n x: left + (index % (columns + 1)) * 10,\n y: top + Math.floor(index / (columns + 1)) * 10,\n }));\n focus = { x: width / 2, y: height / 2 };\n if (frame !== undefined) cancelAnimationFrame(frame);\n last = undefined;\n render(0);\n };\n const move = (event: PointerEvent) => {\n if (!followsPointer) return;\n const box = canvas.getBoundingClientRect();\n pointer = { x: event.clientX - box.left, y: event.clientY - box.top };\n };\n const leave = () => {\n pointer = null;\n };\n const observer =\n typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(resize);\n canvas.addEventListener(\"pointermove\", move, { passive: true });\n canvas.addEventListener(\"pointerleave\", leave);\n observer?.observe(canvas);\n resize();\n return () => {\n if (disposed) return;\n disposed = true;\n if (frame !== undefined) cancelAnimationFrame(frame);\n observer?.disconnect();\n canvas.removeEventListener(\"pointermove\", move);\n canvas.removeEventListener(\"pointerleave\", leave);\n dots = [];\n };\n}\n"
259
+ },
260
+ {
261
+ "path": "registry/orvui/agents/image-generation/src/DitherField.vue",
262
+ "target": "~/src/components/orvui/agents/image-generation/src/DitherField.vue",
263
+ "type": "registry:component",
264
+ "content": "<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from \"vue\";\nimport { motion } from \"motion-v\";\nimport { EASE_OUT } from \"../../../lib/ease\";\nimport { createDitherField } from \"./dither\";\nimport type { ImageGenerationStatus } from \"./ImageGeneration.vue\";\nconst props = defineProps<{\n status: ImageGenerationStatus;\n interactive: boolean;\n reduce: boolean;\n}>();\nconst canvas = ref<HTMLCanvasElement>();\nconst opacity = computed(() =>\n props.status === \"refining\"\n ? 0.48\n : props.status === \"queued\" || props.status === \"generating\"\n ? 1\n : 0,\n);\nlet release: (() => void) | undefined;\nlet capabilities: MediaQueryList | undefined;\nlet ready = false;\nfunction refresh() {\n release?.();\n release = undefined;\n if (ready && canvas.value)\n release = createDitherField(\n canvas.value,\n props.interactive,\n props.reduce,\n capabilities?.matches ?? false,\n );\n}\nwatch([() => props.interactive, () => props.reduce], refresh);\nonMounted(() => {\n ready = true;\n capabilities = matchMedia(\"(hover: hover) and (pointer: fine)\");\n capabilities.addEventListener(\"change\", refresh);\n refresh();\n});\nonBeforeUnmount(() => {\n ready = false;\n release?.();\n capabilities?.removeEventListener(\"change\", refresh);\n});\n</script>\n<template>\n <motion.div\n aria-hidden=\"true\"\n class=\"absolute inset-0 overflow-hidden bg-muted\"\n :initial=\"false\"\n :animate=\"{ opacity }\"\n :transition=\"{ duration: reduce ? 0 : 0.4, ease: EASE_OUT }\"\n >\n <canvas ref=\"canvas\" class=\"absolute inset-0 size-full text-foreground\" />\n </motion.div>\n</template>\n"
265
+ },
266
+ {
267
+ "path": "registry/orvui/agents/image-generation/src/ImageGeneration.vue",
268
+ "target": "~/src/components/orvui/agents/image-generation/src/ImageGeneration.vue",
269
+ "type": "registry:component",
270
+ "content": "<script setup lang=\"ts\">\nimport { computed, getCurrentInstance, useSlots } from \"vue\";\nimport { AnimatePresence, motion } from \"motion-v\";\nimport { Check, CircleAlert, RotateCcw } from \"lucide-vue-next\";\nimport { EASE_IN_OUT, EASE_OUT, SPRING_PRESS } from \"../../../lib/ease\";\nimport { cn } from \"../../../lib/utils\";\nimport { useReduced } from \"../../shared\";\nimport DitherField from \"./DitherField.vue\";\nexport type ImageGenerationStatus =\n \"queued\" | \"generating\" | \"refining\" | \"complete\" | \"error\";\nconst props = withDefaults(\n defineProps<{\n status?: ImageGenerationStatus;\n label?: string;\n prompt?: string;\n resolution?: string;\n aspectRatio?: string | number;\n size?: \"compact\" | \"fluid\";\n interactive?: boolean;\n statusText?: string;\n showStatus?: boolean;\n mediaClassName?: string;\n statusClassName?: string;\n }>(),\n {\n status: \"generating\",\n resolution: \"1024 × 1024\",\n aspectRatio: \"1 / 1\",\n size: \"compact\",\n interactive: true,\n showStatus: true,\n },\n);\nconst emit = defineEmits<{ retry: [] }>();\nconst instance = getCurrentInstance();\nconst slots = useSlots();\nconst reduce = useReduced();\nconst pending = computed(() => ![\"complete\", \"error\"].includes(props.status));\nconst message = computed(\n () =>\n props.statusText ??\n {\n queued: \"Waiting to generate\",\n generating: \"Generating image\",\n refining: \"Refining details\",\n complete: \"Image ready\",\n error: \"Generation failed\",\n }[props.status],\n);\nconst description = computed(\n () =>\n props.label ??\n (props.prompt ? `${message.value}: ${props.prompt}` : message.value),\n);\nconst image = computed(() => {\n const values =\n props.status === \"complete\"\n ? [0, 1, 1, 1]\n : props.status === \"refining\"\n ? [1.5, 0.95, 0.62, 1.005]\n : props.status === \"error\"\n ? [2, 0.5, 0.28, 1]\n : props.status === \"queued\"\n ? [4, 0.75, 0, 1.02]\n : [3, 0.85, 0, 1.015];\n return {\n filter: `blur(${values[0]}px) saturate(${values[1]})`,\n opacity: values[2],\n scale: values[3],\n };\n});\nconst retryable = () => typeof instance?.vnode.props?.onRetry === \"function\";\n</script>\n<template>\n <div\n data-slot=\"image-generation\"\n :data-state=\"status\"\n :aria-busy=\"pending\"\n class=\"w-full\"\n >\n <div :class=\"cn('w-full', size === 'compact' && 'mx-auto max-w-52')\">\n <div\n role=\"img\"\n :aria-label=\"description\"\n :style=\"{ aspectRatio }\"\n class=\"relative isolate w-full overflow-hidden rounded-xl bg-muted\"\n >\n <motion.div\n :aria-hidden=\"slots.default ? undefined : true\"\n :initial=\"false\"\n :animate=\"reduce ? { opacity: image.opacity } : image\"\n :transition=\"{ duration: reduce ? 0 : 0.4, ease: EASE_OUT }\"\n :class=\"\n cn(\n 'absolute inset-0 [&>*]:size-full [&>*]:object-cover [&_img]:size-full [&_img]:object-cover',\n mediaClassName,\n )\n \"\n ><slot\n /></motion.div>\n <AnimatePresence :initial=\"false\"\n ><motion.div\n v-if=\"pending\"\n key=\"dither-field\"\n class=\"absolute inset-0\"\n :initial=\"{ opacity: 0 }\"\n :animate=\"{ opacity: 1 }\"\n :exit=\"{ opacity: 0 }\"\n :transition=\"{ duration: reduce ? 0 : 0.25, ease: EASE_OUT }\"\n >\n <DitherField\n :status=\"status\"\n :interactive=\"interactive\"\n :reduce=\"reduce\"\n /> </motion.div\n ></AnimatePresence>\n <span\n v-if=\"resolution\"\n class=\"absolute right-2 top-2 z-10 rounded-full bg-background/75 px-2 py-0.5 font-mono text-[10px] tabular-nums text-foreground/80\"\n >{{ resolution }}</span\n >\n </div>\n <div v-if=\"showStatus || prompt\" class=\"mt-3 text-left\">\n <div\n v-if=\"showStatus\"\n aria-live=\"polite\"\n :class=\"\n cn(\n 'flex min-h-5 items-center gap-2 text-sm font-medium text-foreground',\n status === 'error' && 'text-destructive',\n statusClassName,\n )\n \"\n >\n <Check\n v-if=\"status === 'complete'\"\n aria-hidden=\"true\"\n class=\"size-3.5\"\n />\n <CircleAlert\n v-else-if=\"status === 'error'\"\n aria-hidden=\"true\"\n class=\"size-3.5\"\n />\n <motion.span\n v-else\n aria-hidden=\"true\"\n class=\"grid size-3.5 grid-cols-2 place-items-center gap-0.5\"\n :animate=\"reduce ? undefined : { rotate: 360 }\"\n :transition=\"{ duration: 2.4, ease: EASE_IN_OUT, repeat: Infinity }\"\n >\n <span\n v-for=\"index in 4\"\n :key=\"index\"\n :class=\"\n cn(\n 'size-1 rounded-[1px] bg-current',\n [2, 3].includes(index) && 'opacity-55',\n )\n \"\n />\n </motion.span>\n <AnimatePresence :initial=\"false\" mode=\"popLayout\"\n ><motion.span\n :key=\"message\"\n :initial=\"reduce ? false : { opacity: 0, y: 4 }\"\n :animate=\"{ opacity: 1, y: 0 }\"\n :exit=\"reduce ? undefined : { opacity: 0, y: -4 }\"\n :transition=\"{ duration: reduce ? 0 : 0.15, ease: EASE_OUT }\"\n >{{ message }}</motion.span\n ></AnimatePresence\n >\n </div>\n <p v-if=\"prompt\" class=\"mt-0.5 truncate text-xs text-muted-foreground\">\n “{{ prompt }}”\n </p>\n </div>\n <motion.button\n v-if=\"status === 'error' && retryable()\"\n type=\"button\"\n @click=\"emit('retry')\"\n :while-press=\"reduce ? undefined : { scale: 0.96 }\"\n :transition=\"SPRING_PRESS\"\n class=\"mt-3 inline-flex min-h-10 items-center gap-2 rounded-full px-3 text-sm font-medium outline-none transition-colors hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <RotateCcw class=\"size-4\" />Try again\n </motion.button>\n </div>\n </div>\n</template>\n"
271
+ },
272
+ {
273
+ "path": "registry/orvui/agents/loading-states/index.ts",
274
+ "target": "~/src/components/orvui/agents/loading-states/index.ts",
275
+ "type": "registry:lib",
276
+ "content": "export { default as LoadingStates } from \"./src/LoadingStates.vue\";\nexport { default as ThinkingShimmer } from \"./src/ThinkingShimmer.vue\";\nexport { default as ReasoningText } from \"./src/ReasoningText.vue\";\nexport { default as AgentProgress } from \"./src/AgentProgress.vue\";\nexport type { ReasoningTextVariant } from \"./src/ReasoningText.vue\";\n\nexport type * from \"./src/api-types\";\n"
277
+ },
278
+ {
279
+ "path": "registry/orvui/agents/loading-states/src/AgentProgress.vue",
280
+ "target": "~/src/components/orvui/agents/loading-states/src/AgentProgress.vue",
281
+ "type": "registry:component",
282
+ "content": "<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from \"vue\";\nimport { motion } from \"motion-v\";\nimport { cn } from \"../../../lib/utils\";\nimport { EASE_IN_OUT } from \"../../../lib/ease\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nconst props = withDefaults(\n defineProps<{\n label?: string;\n elapsedSeconds?: number;\n initialSeconds?: number;\n running?: boolean;\n }>(),\n { label: \"Churning\", initialSeconds: 0, running: true },\n);\nconst reduced = useReducedMotion();\nconst internal = ref(props.initialSeconds);\nconst elapsed = computed(() =>\n Math.max(0, props.elapsedSeconds ?? internal.value),\n);\nconst readout = computed(() => {\n const seconds = elapsed.value;\n const remainder = (seconds % 60).toFixed(1);\n return seconds < 60\n ? `${seconds.toFixed(1)}s`\n : `${Math.floor(seconds / 60)}m ${remainder}s`;\n});\nlet clock: ReturnType<typeof setInterval> | undefined;\nlet mounted = false;\nfunction synchronize() {\n if (clock !== undefined) clearInterval(clock);\n clock = undefined;\n if (!mounted || !props.running || props.elapsedSeconds !== undefined) return;\n const origin = performance.now();\n const start = props.initialSeconds;\n clock = setInterval(() => {\n internal.value = start + (performance.now() - origin) / 1000;\n }, 100);\n}\nwatch(\n [() => props.running, () => props.elapsedSeconds, () => props.initialSeconds],\n synchronize,\n);\nonMounted(() => {\n mounted = true;\n synchronize();\n});\nonBeforeUnmount(() => {\n mounted = false;\n if (clock !== undefined) clearInterval(clock);\n});\n</script>\n<template>\n <span\n role=\"status\"\n :aria-label=\"`${label}, in progress`\"\n :class=\"\n cn(\n 'inline-flex items-center gap-3 font-mono text-sm text-muted-foreground',\n $attrs.class,\n )\n \"\n >\n <span aria-hidden=\"true\" class=\"grid size-5 shrink-0 grid-cols-3 gap-[2px]\">\n <motion.span\n v-for=\"cell in 9\"\n :key=\"cell\"\n class=\"rounded-[1px] bg-current\"\n :animate=\"\n reduced\n ? { opacity: 0.55 }\n : { opacity: [0.28, 1, 0.28], scale: [0.72, 1, 0.72] }\n \"\n :transition=\"\n reduced\n ? { duration: 0 }\n : {\n duration: 1.55,\n ease: EASE_IN_OUT,\n repeat: Infinity,\n delay: (cell - 1) * 0.14,\n }\n \"\n />\n </span>\n <span class=\"font-sans font-medium\">{{ label }}</span\n ><span aria-hidden=\"true\" class=\"tabular-nums text-muted-foreground/70\">{{\n readout\n }}</span>\n </span>\n</template>\n"
283
+ },
284
+ {
285
+ "path": "registry/orvui/agents/loading-states/src/api-types.ts",
286
+ "target": "~/src/components/orvui/agents/loading-states/src/api-types.ts",
287
+ "type": "registry:lib",
288
+ "content": "// Vue public prop types, derived from the actual components.\nexport type AgentProgressProps = InstanceType<\n (typeof import(\"./AgentProgress.vue\"))[\"default\"]\n>[\"$props\"];\nexport type ReasoningTextProps = InstanceType<\n (typeof import(\"./ReasoningText.vue\"))[\"default\"]\n>[\"$props\"];\nexport type ThinkingShimmerProps = InstanceType<\n (typeof import(\"./ThinkingShimmer.vue\"))[\"default\"]\n>[\"$props\"];\n"
289
+ },
290
+ {
291
+ "path": "registry/orvui/agents/loading-states/src/CascadePhrase.vue",
292
+ "target": "~/src/components/orvui/agents/loading-states/src/CascadePhrase.vue",
293
+ "type": "registry:component",
294
+ "content": "<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { motion } from \"motion-v\";\nimport { EASE_OUT, SPRING_SWAP } from \"../../../lib/ease\";\nconst props = defineProps<{ phrase: string; duration: number }>();\nconst glyphs = computed(() => Array.from(`${props.phrase}…`));\nconst choreography = {\n enter: { opacity: 0, y: \"100%\" },\n shown: (order: unknown) => ({\n opacity: 1,\n y: \"0%\",\n transition: { ...SPRING_SWAP, delay: Number(order) * 0.025 },\n }),\n leave: (order: unknown) => ({\n opacity: 0,\n y: \"-100%\",\n transition: {\n duration: 0.14,\n ease: EASE_OUT,\n delay: Number(order) * 0.01125,\n },\n }),\n};\n</script>\n<template>\n <motion.span\n class=\"col-start-1 row-start-1 inline-block justify-self-start whitespace-pre\"\n initial=\"enter\"\n animate=\"shown\"\n exit=\"leave\"\n >\n <motion.span\n v-for=\"(glyph, index) in glyphs\"\n :key=\"index\"\n :custom=\"index\"\n :variants=\"choreography\"\n initial=\"enter\"\n animate=\"shown\"\n exit=\"leave\"\n class=\"orvui-agent-text-shimmer inline-block whitespace-pre will-change-[opacity,transform]\"\n :style=\"{\n animation: `orvui-agent-text-shimmer ${duration}s linear infinite`,\n }\"\n >{{ glyph }}</motion.span\n >\n </motion.span>\n</template>\n"
295
+ },
296
+ {
297
+ "path": "registry/orvui/agents/loading-states/src/LoadingStates.vue",
298
+ "target": "~/src/components/orvui/agents/loading-states/src/LoadingStates.vue",
299
+ "type": "registry:component",
300
+ "content": "<script setup lang=\"ts\">\nimport ReasoningText from \"./ReasoningText.vue\";\ndefineOptions({ inheritAttrs: false });\n</script>\n<template><ReasoningText v-bind=\"$attrs\" /></template>\n"
301
+ },
302
+ {
303
+ "path": "registry/orvui/agents/loading-states/src/ReasoningText.vue",
304
+ "target": "~/src/components/orvui/agents/loading-states/src/ReasoningText.vue",
305
+ "type": "registry:component",
306
+ "content": "<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref, useId, watch } from \"vue\";\nimport { AnimatePresence, motion } from \"motion-v\";\nimport { Loader } from \"../../../motion/loader\";\nimport { TextScramble } from \"../../../motion/text-animation\";\nimport { EASE_OUT } from \"../../../lib/ease\";\nimport { cn } from \"../../../lib/utils\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nimport { RenderNode, type Content } from \"../../shared\";\nimport CascadePhrase from \"./CascadePhrase.vue\";\nimport ThinkingShimmer from \"./ThinkingShimmer.vue\";\nexport type ReasoningTextVariant = \"cascade\" | \"swap\" | \"scramble\";\nconst fallback = () => [\n \"Thinking\",\n \"Reading the context\",\n \"Connecting the details\",\n \"Forming a response\",\n];\nconst props = withDefaults(\n defineProps<{\n phrases?: string[];\n variant?: ReasoningTextVariant;\n interval?: number;\n shimmerDuration?: number;\n indicator?: Content;\n }>(),\n {\n phrases: () => [\n \"Thinking\",\n \"Reading the context\",\n \"Connecting the details\",\n \"Forming a response\",\n ],\n variant: \"cascade\",\n interval: 1800,\n shimmerDuration: 2.2,\n indicator: undefined,\n },\n);\nconst reduced = useReducedMotion();\nconst identity = useId();\nconst cursor = ref(0);\nconst choices = computed(() =>\n props.phrases.length ? props.phrases : fallback(),\n);\nconst selected = computed(\n () => choices.value[cursor.value % choices.value.length],\n);\nconst measure = computed(() =>\n choices.value.reduce(\n (previous, candidate) =>\n candidate.length > previous.length ? candidate : previous,\n \"\",\n ),\n);\nlet active = false;\nlet clock: ReturnType<typeof setInterval> | undefined;\nfunction cycle() {\n if (clock !== undefined) clearInterval(clock);\n clock = undefined;\n if (!active || choices.value.length < 2) return;\n clock = setInterval(\n () => {\n cursor.value = (cursor.value + 1) % choices.value.length;\n },\n Math.max(600, props.interval),\n );\n}\nwatch([() => props.interval, () => choices.value.length], cycle);\nonMounted(() => {\n active = true;\n cycle();\n});\nonBeforeUnmount(() => {\n active = false;\n if (clock !== undefined) clearInterval(clock);\n});\n</script>\n<template>\n <span\n role=\"status\"\n aria-live=\"polite\"\n :aria-labelledby=\"identity\"\n :class=\"\n cn(\n 'inline-flex items-center gap-2 text-sm font-medium text-muted-foreground',\n $attrs.class,\n )\n \"\n >\n <span\n aria-hidden=\"true\"\n class=\"inline-flex size-3 shrink-0 items-center justify-center\"\n ><slot name=\"indicator\"\n ><RenderNode v-if=\"indicator != null\" :node=\"indicator\" /><Loader\n v-else\n variant=\"ascii-line\"\n :size=\"14\"\n :speed=\"0.8\"\n label=\"Reasoning\" /></slot\n ></span>\n <span aria-hidden=\"true\" class=\"grid overflow-hidden text-left\">\n <span class=\"invisible col-start-1 row-start-1 whitespace-nowrap\"\n >{{ measure }}…</span\n >\n <ThinkingShimmer\n v-if=\"variant === 'cascade' && reduced\"\n :duration=\"shimmerDuration\"\n class=\"col-start-1 row-start-1 inline-block justify-self-start whitespace-pre\"\n >{{ selected }}…</ThinkingShimmer\n >\n <AnimatePresence v-else-if=\"variant === 'cascade'\" :initial=\"false\"\n ><CascadePhrase\n :key=\"selected\"\n :phrase=\"selected\"\n :duration=\"shimmerDuration\"\n /></AnimatePresence>\n <TextScramble\n v-else-if=\"variant === 'scramble'\"\n :text=\"`${selected}…`\"\n class=\"orvui-agent-text-shimmer col-start-1 row-start-1 justify-self-start tabular-nums\"\n :style=\"{\n animation: `orvui-agent-text-shimmer ${shimmerDuration}s linear infinite`,\n }\"\n />\n <AnimatePresence v-else :initial=\"false\"\n ><motion.span\n :key=\"selected\"\n class=\"orvui-agent-text-shimmer col-start-1 row-start-1 inline-block justify-self-start whitespace-nowrap will-change-[opacity,transform]\"\n :style=\"{\n animation: `orvui-agent-text-shimmer ${shimmerDuration}s linear infinite`,\n }\"\n :initial=\"reduced ? { opacity: 0 } : { opacity: 0, y: 3 }\"\n :animate=\"reduced ? { opacity: 1 } : { opacity: 1, y: 0 }\"\n :exit=\"reduced ? { opacity: 0 } : { opacity: 0, y: -3 }\"\n :transition=\"{ duration: reduced ? 0.12 : 0.2, ease: EASE_OUT }\"\n >{{ selected }}…</motion.span\n ></AnimatePresence\n > </span\n ><span :id=\"identity\" class=\"sr-only\">{{ selected }}</span>\n </span>\n</template>\n"
307
+ },
308
+ {
309
+ "path": "registry/orvui/agents/loading-states/src/ThinkingShimmer.vue",
310
+ "target": "~/src/components/orvui/agents/loading-states/src/ThinkingShimmer.vue",
311
+ "type": "registry:component",
312
+ "content": "<script setup lang=\"ts\">\nimport { TextShimmer } from \"../../../motion/text-animation\";\nconst props = withDefaults(defineProps<{ duration?: number }>(), {\n duration: 1.8,\n});\n</script>\n<template>\n <TextShimmer as=\"span\" class=\"font-medium\" :duration=\"props.duration\"\n ><slot>Thinking…</slot></TextShimmer\n >\n</template>\n<style>\n.orvui-agent-text-shimmer {\n color: transparent;\n background-clip: text;\n background-size: 200% 100%;\n background-image: linear-gradient(\n 110deg,\n var(--muted-foreground) 30%,\n var(--foreground) 50%,\n var(--muted-foreground) 70%\n );\n}\n@keyframes orvui-agent-text-shimmer {\n 0% {\n background-position: 200% 0;\n }\n 100% {\n background-position: -200% 0;\n }\n}\n@media (prefers-reduced-motion: reduce) {\n .orvui-agent-text-shimmer {\n animation: none !important;\n }\n}\n</style>\n"
313
+ },
314
+ {
315
+ "path": "registry/orvui/agents/message-bubble/index.ts",
316
+ "target": "~/src/components/orvui/agents/message-bubble/index.ts",
317
+ "type": "registry:lib",
318
+ "content": "export { default as MessageBubble } from \"./src/MessageBubble.vue\";\nexport { default as MessageBubbleContent } from \"./src/MessageBubbleContent.vue\";\nexport { default as MessageBubbleGroup } from \"./src/MessageBubbleGroup.vue\";\nexport { default as MessageBubbleCollapsible } from \"./src/MessageBubbleCollapsible.vue\";\nexport * from \"./src/context\";\n\nexport type * from \"./src/api-types\";\n"
319
+ },
320
+ {
321
+ "path": "registry/orvui/agents/message-bubble/src/api-types.ts",
322
+ "target": "~/src/components/orvui/agents/message-bubble/src/api-types.ts",
323
+ "type": "registry:lib",
324
+ "content": "// Vue public prop types, derived from the actual components.\nexport type MessageBubbleCollapsibleProps = InstanceType<\n (typeof import(\"./MessageBubbleCollapsible.vue\"))[\"default\"]\n>[\"$props\"];\nexport type MessageBubbleContentProps = InstanceType<\n (typeof import(\"./MessageBubbleContent.vue\"))[\"default\"]\n>[\"$props\"];\nexport type MessageBubbleGroupProps = InstanceType<\n (typeof import(\"./MessageBubbleGroup.vue\"))[\"default\"]\n>[\"$props\"];\nexport type MessageBubbleProps = InstanceType<\n (typeof import(\"./MessageBubble.vue\"))[\"default\"]\n>[\"$props\"];\n"
325
+ },
326
+ {
327
+ "path": "registry/orvui/agents/message-bubble/src/context.ts",
328
+ "target": "~/src/components/orvui/agents/message-bubble/src/context.ts",
329
+ "type": "registry:lib",
330
+ "content": "import type { ComputedRef, InjectionKey } from \"vue\";\nexport type MessageBubbleVariant =\n \"solid\" | \"soft\" | \"tint\" | \"outline\" | \"ghost\" | \"danger\";\nexport type MessageBubbleAlign = \"start\" | \"end\";\ninterface BubbleContext {\n align: MessageBubbleAlign;\n variant: MessageBubbleVariant;\n animateIn: boolean;\n}\nexport const bubbleKey = Symbol(\"orvui-bubble\") as InjectionKey<\n ComputedRef<BubbleContext>\n>;\nexport const bubbleLayoutKey = Symbol(\"orvui-bubble-layout\") as InjectionKey<\n () => void\n>;\n"
331
+ },
332
+ {
333
+ "path": "registry/orvui/agents/message-bubble/src/MessageBubble.vue",
334
+ "target": "~/src/components/orvui/agents/message-bubble/src/MessageBubble.vue",
335
+ "type": "registry:component",
336
+ "content": "<script setup lang=\"ts\">\nimport { computed, inject, provide } from \"vue\";\nimport { motion } from \"motion-v\";\nimport { SPRING_LAYOUT } from \"../../../lib/ease\";\nimport { cn } from \"../../../lib/utils\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nimport { messageKey } from \"../../message/src/context\";\nimport {\n bubbleKey,\n type MessageBubbleAlign,\n type MessageBubbleVariant,\n} from \"./context\";\nconst props = withDefaults(\n defineProps<{\n variant?: MessageBubbleVariant;\n align?: MessageBubbleAlign;\n animateIn?: boolean;\n }>(),\n { variant: \"soft\", animateIn: false },\n);\nconst parent = inject(\n messageKey,\n computed(() => \"assistant\" as const),\n);\nconst alignment = computed(\n () => props.align ?? (parent.value === \"user\" ? \"end\" : \"start\"),\n);\nconst context = computed(() => ({\n align: alignment.value,\n variant: props.variant,\n animateIn: props.animateIn,\n}));\nprovide(bubbleKey, context);\nconst reduced = useReducedMotion();\n</script>\n<template>\n <motion.div\n data-slot=\"message-bubble\"\n :data-align=\"alignment\"\n :data-variant=\"variant\"\n :class=\"\n cn(\n 'group/bubble flex w-full flex-col',\n alignment === 'end' ? 'items-end' : 'items-start',\n )\n \"\n :exit=\"{ opacity: 0, y: -3, scale: 0.99 }\"\n :transition=\"reduced ? { duration: 0 } : SPRING_LAYOUT\"\n ><slot\n /></motion.div>\n</template>\n"
337
+ },
338
+ {
339
+ "path": "registry/orvui/agents/message-bubble/src/MessageBubbleCollapsible.vue",
340
+ "target": "~/src/components/orvui/agents/message-bubble/src/MessageBubbleCollapsible.vue",
341
+ "type": "registry:component",
342
+ "content": "<script setup lang=\"ts\">\nimport { computed, inject, useId } from \"vue\";\nimport { motion } from \"motion-v\";\nimport { ChevronDown } from \"lucide-vue-next\";\nimport { cn } from \"../../../lib/utils\";\nimport { SPRING_SWAP } from \"../../../lib/ease\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nimport { RenderNode, useControllable, type Content } from \"../../shared\";\nimport { bubbleLayoutKey } from \"./context\";\nconst props = withDefaults(\n defineProps<{\n open?: boolean;\n defaultOpen?: boolean;\n collapsedLines?: 2 | 3 | 4 | 5 | 6;\n moreLabel?: Content;\n lessLabel?: Content;\n contentClassName?: string;\n triggerClassName?: string;\n }>(),\n {\n open: undefined,\n defaultOpen: false,\n collapsedLines: 4,\n moreLabel: \"Show more\",\n lessLabel: \"Show less\",\n },\n);\nconst emit = defineEmits<{\n \"update:open\": [open: boolean];\n openChange: [open: boolean];\n}>();\nconst invalidate = inject(bubbleLayoutKey, () => {});\nconst expanded = useControllable(\n () => props.open,\n props.defaultOpen,\n (value) => {\n invalidate();\n emit(\"update:open\", value);\n emit(\"openChange\", value);\n },\n);\nconst identity = useId();\nconst reduced = useReducedMotion();\nconst clamp = computed(\n () =>\n ({\n 2: \"line-clamp-2\",\n 3: \"line-clamp-3\",\n 4: \"line-clamp-4\",\n 5: \"line-clamp-5\",\n 6: \"line-clamp-6\",\n })[props.collapsedLines],\n);\n</script>\n<template>\n <div\n data-slot=\"message-bubble-collapsible\"\n :data-state=\"expanded ? 'open' : 'closed'\"\n class=\"w-full\"\n >\n <div\n :id=\"identity\"\n :class=\"\n cn(\n 'transition-[mask-image] duration-200',\n !expanded && clamp,\n !expanded &&\n '[mask-image:linear-gradient(to_bottom,#000_68%,transparent_100%)]',\n contentClassName,\n )\n \"\n >\n <slot />\n </div>\n <button\n type=\"button\"\n :aria-expanded=\"expanded\"\n :aria-controls=\"identity\"\n @click=\"expanded = !expanded\"\n :class=\"\n cn(\n 'mt-2 inline-flex h-7 items-center gap-1 rounded-full px-2 text-xs font-medium text-muted-foreground outline-none transition-colors hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n triggerClassName,\n )\n \"\n >\n <span><RenderNode :node=\"expanded ? lessLabel : moreLabel\" /></span\n ><motion.span\n aria-hidden=\"true\"\n :animate=\"{ rotate: expanded ? 180 : 0 }\"\n :transition=\"reduced ? { duration: 0 } : SPRING_SWAP\"\n ><ChevronDown class=\"size-3.5\"\n /></motion.span>\n </button>\n </div>\n</template>\n"
343
+ },
344
+ {
345
+ "path": "registry/orvui/agents/message-bubble/src/MessageBubbleContent.vue",
346
+ "target": "~/src/components/orvui/agents/message-bubble/src/MessageBubbleContent.vue",
347
+ "type": "registry:component",
348
+ "content": "<script setup lang=\"ts\">\nimport { computed, inject, provide, ref, type Component } from \"vue\";\nimport { motion } from \"motion-v\";\nimport { cn } from \"../../../lib/utils\";\nimport { EASE_OUT, SPRING_LAYOUT } from \"../../../lib/ease\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nimport { bubbleKey, bubbleLayoutKey } from \"./context\";\ndefineOptions({ inheritAttrs: false });\nconst props = withDefaults(defineProps<{ as?: string | Component }>(), {\n as: \"div\",\n});\nconst context = inject(\n bubbleKey,\n computed(() => ({\n align: \"start\" as const,\n variant: \"soft\" as const,\n animateIn: false,\n })),\n);\nconst reduced = useReducedMotion();\nconst revision = ref(0);\nprovide(bubbleLayoutKey, () => {\n revision.value++;\n});\nconst variants = {\n solid: \"bg-foreground\",\n soft: \"bg-muted\",\n tint: \"bg-muted\",\n outline: \"border border-border/70 bg-background\",\n ghost: \"\",\n danger: \"bg-destructive/10\",\n};\nconst classes = computed(() =>\n cn(\n context.value.variant === \"solid\" && \"text-background\",\n context.value.variant === \"danger\" && \"text-destructive\",\n context.value.variant === \"ghost\" &&\n \"w-full max-w-none rounded-none px-0 py-0\",\n [\"button\", \"a\"].includes(props.as as string) &&\n \"cursor-pointer text-left outline-none transition-[background-color,color,transform] duration-150 hover:brightness-[0.98] focus-visible:ring-2 focus-visible:ring-ring active:scale-[0.99]\",\n ),\n);\n</script>\n<template>\n <component\n :is=\"as\"\n data-slot=\"message-bubble-content\"\n v-bind=\"$attrs\"\n :class=\"\n cn(\n 'relative z-0 min-w-9 max-w-[82%] rounded-2xl px-3.5 py-2.5 text-sm leading-6 text-foreground [&_a]:font-medium [&_a]:underline [&_a]:underline-offset-4 [&_code]:rounded [&_code]:bg-background/60 [&_code]:px-1 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[0.9em] [&_ol]:my-2 [&_ol]:list-decimal [&_ol]:pl-5 [&_p+p]:mt-2 [&_pre]:my-2 [&_pre]:overflow-x-auto [&_pre]:rounded-xl [&_pre]:bg-background/60 [&_pre]:p-3 [&_ul]:my-2 [&_ul]:list-disc [&_ul]:pl-5',\n classes,\n $attrs.class,\n )\n \"\n >\n <motion.span\n v-if=\"context.variant !== 'ghost'\"\n aria-hidden=\"true\"\n :layout=\"reduced ? false : 'size'\"\n :layout-dependency=\"revision\"\n :initial=\"\n context.animateIn && !reduced ? { opacity: 0, scale: 0.92 } : false\n \"\n :animate=\"{ opacity: 1, scale: 1 }\"\n :transition=\"\n reduced\n ? { duration: 0 }\n : {\n opacity: { duration: 0.12, ease: EASE_OUT },\n scale: {\n type: 'spring',\n stiffness: 520,\n damping: 27,\n mass: 0.52,\n },\n layout: SPRING_LAYOUT,\n }\n \"\n :class=\"\n cn(\n 'pointer-events-none absolute inset-0 -z-10 rounded-[inherit]',\n context.align === 'end'\n ? 'origin-bottom-right'\n : 'origin-bottom-left',\n variants[context.variant],\n )\n \"\n />\n <motion.div\n class=\"relative\"\n :initial=\"context.animateIn ? { opacity: 0 } : false\"\n :animate=\"{ opacity: 1 }\"\n :transition=\"{\n duration: 0.12,\n ease: EASE_OUT,\n delay: reduced ? 0 : 0.04,\n }\"\n ><slot\n /></motion.div>\n </component>\n</template>\n"
349
+ },
350
+ {
351
+ "path": "registry/orvui/agents/message-bubble/src/MessageBubbleGroup.vue",
352
+ "target": "~/src/components/orvui/agents/message-bubble/src/MessageBubbleGroup.vue",
353
+ "type": "registry:component",
354
+ "content": "<script setup lang=\"ts\">\nimport { h, renderSlot, useAttrs } from \"vue\";\nimport { cn } from \"../../../lib/utils\";\ndefineOptions({ inheritAttrs: false });\nconst props = withDefaults(defineProps<{ spacing?: \"compact\" | \"default\" }>(), {\n spacing: \"compact\",\n});\nconst slots = defineSlots<{ default?(props: {}): any }>();\nconst attrs = useAttrs();\nconst gaps = { compact: \"gap-1.5\", default: \"gap-3\" } as const;\nconst RenderFrame = () =>\n h(\n \"div\",\n {\n \"data-slot\": \"message-bubble-group\",\n ...attrs,\n class: cn(\n \"flex w-full flex-col\",\n gaps[props.spacing === \"compact\" ? \"compact\" : \"default\"],\n attrs.class,\n ),\n },\n [renderSlot(slots, \"default\")],\n );\n</script>\n<template><RenderFrame /></template>\n"
355
+ },
356
+ {
357
+ "path": "registry/orvui/agents/message-scroller/index.ts",
358
+ "target": "~/src/components/orvui/agents/message-scroller/index.ts",
359
+ "type": "registry:lib",
360
+ "content": "export { default as MessageScroller } from \"./src/MessageScroller.vue\";\n\nexport type * from \"./src/api-types\";\n"
361
+ },
362
+ {
363
+ "path": "registry/orvui/agents/message-scroller/src/api-types.ts",
364
+ "target": "~/src/components/orvui/agents/message-scroller/src/api-types.ts",
365
+ "type": "registry:lib",
366
+ "content": "// Vue public prop types, derived from the actual components.\nexport type MessageScrollerProps = InstanceType<\n (typeof import(\"./MessageScroller.vue\"))[\"default\"]\n>[\"$props\"];\n"
367
+ },
368
+ {
369
+ "path": "registry/orvui/agents/message-scroller/src/MessageScroller.vue",
370
+ "target": "~/src/components/orvui/agents/message-scroller/src/MessageScroller.vue",
371
+ "type": "registry:component",
372
+ "content": "<script setup lang=\"ts\">\nimport {\n computed,\n h,\n isRef,\n onBeforeUnmount,\n onMounted,\n ref,\n useId,\n useSlots,\n watch,\n type ComponentPublicInstance,\n type HTMLAttributes,\n type Ref,\n} from \"vue\";\nimport { PreviewRail, type PreviewRailItem } from \"../../../motion/preview-rail\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nimport { cn } from \"../../../lib/utils\";\ndefineOptions({ inheritAttrs: false });\nconst props = withDefaults(\n defineProps<{\n followOutput?: boolean;\n followThreshold?: number;\n smooth?: boolean;\n label?: string;\n busy?: boolean;\n navigation?: \"rail\";\n navigationLabel?: string;\n viewportClassName?: string;\n contentClassName?: string;\n railClassName?: string;\n viewportRef?:\n Ref<HTMLElement | null> | ((element: HTMLElement | null) => void);\n viewportProps?: HTMLAttributes;\n contentProps?: HTMLAttributes;\n }>(),\n {\n followOutput: true,\n followThreshold: 56,\n smooth: true,\n label: \"Conversation\",\n navigationLabel: \"Message navigation\",\n },\n);\nconst emit = defineEmits<{ followChange: [following: boolean] }>();\nconst slots = useSlots();\nconst reduced = useReducedMotion();\nconst identity = useId();\nconst viewport = ref<HTMLElement | null>(null);\nconst transcript = ref<HTMLElement | null>(null);\nconst links = ref<PreviewRailItem[]>([]);\nconst selected = ref(\"\");\nconst overflowing = ref(false);\nconst identities = new WeakMap<HTMLElement, string>();\nconst destinations = new Map<string, HTMLElement>();\nlet sequence = 0,\n live = props.followOutput,\n programmatic = false,\n mounted = false;\nlet releaseProgrammatic: ReturnType<typeof setTimeout> | undefined;\nlet scheduled: number | undefined;\nlet initialScroll: number | undefined;\nlet sizeObserver: ResizeObserver | undefined,\n changes: MutationObserver | undefined;\nconst scrollBehavior = (): ScrollBehavior =>\n reduced.value || !props.smooth ? \"auto\" : \"smooth\";\nfunction setFollowing(value: boolean) {\n if (live !== value) {\n live = value;\n emit(\"followChange\", value);\n }\n}\nfunction attach(node: Element | ComponentPublicInstance | null) {\n viewport.value = node as HTMLElement | null;\n if (typeof props.viewportRef === \"function\")\n props.viewportRef(viewport.value);\n else if (isRef(props.viewportRef)) props.viewportRef.value = viewport.value;\n}\nfunction contents(node: HTMLElement) {\n return (\n (\n node.querySelector(\n '[data-slot=\"message-bubble-content\"], [data-slot=\"message-content\"]',\n ) ?? node\n ).textContent ?? \"\"\n )\n .replace(/\\s+/g, \" \")\n .trim();\n}\nfunction excerpt(text: string, limit: number): string {\n if (text.length <= limit) return text;\n const space = text.lastIndexOf(\" \", limit);\n return text.slice(0, space > limit * 0.65 ? space : limit).trimEnd() + \"…\";\n}\nfunction refreshSelection() {\n const element = viewport.value;\n const entries = [...destinations];\n if (props.navigation !== \"rail\" || !element || !entries.length) return;\n if (element.scrollTop <= props.followThreshold) {\n selected.value = entries[0][0];\n return;\n }\n if (\n element.scrollHeight - element.clientHeight - element.scrollTop <=\n props.followThreshold\n ) {\n selected.value = entries[entries.length - 1][0];\n return;\n }\n const boundary = element.getBoundingClientRect();\n const middle = boundary.top + boundary.height / 2;\n let closest = entries[0][0],\n distance = Infinity;\n entries.forEach(([id, node]) => {\n const rect = node.getBoundingClientRect(),\n nextDistance = Math.abs(rect.top + rect.height / 2 - middle);\n if (nextDistance < distance) {\n distance = nextDistance;\n closest = id;\n }\n });\n selected.value = closest;\n}\nfunction rebuildRail() {\n destinations.clear();\n if (props.navigation !== \"rail\" || !transcript.value || !viewport.value) {\n links.value = [];\n overflowing.value = false;\n return;\n }\n const messages = Array.from(\n transcript.value.querySelectorAll<HTMLElement>('[data-slot=\"message\"]'),\n );\n const next = messages.map((message, index) => {\n let id = identities.get(message);\n if (!id) {\n id = `${identity}-message-${++sequence}`;\n identities.set(message, id);\n }\n destinations.set(id, message);\n const text = contents(message);\n const sender = message.dataset.from ?? \"conversation\";\n const reply =\n sender === \"user\"\n ? messages\n .slice(index + 1)\n .find((candidate) => candidate.dataset.from === \"assistant\")\n : undefined;\n const label = excerpt(text, 56) || \"Message\";\n const tailStart = label.endsWith(\"…\") ? label.length - 1 : text.length;\n const description =\n excerpt(reply ? contents(reply) : text.slice(tailStart).trim(), 88) ||\n undefined;\n return {\n id,\n label,\n description,\n ariaLabel: `Go to ${sender} message ${index + 1} of ${messages.length}`,\n };\n });\n if (JSON.stringify(next) !== JSON.stringify(links.value)) links.value = next;\n overflowing.value =\n messages.length > 1 &&\n viewport.value.scrollHeight > viewport.value.clientHeight + 1;\n refreshSelection();\n}\nfunction queueRail() {\n if (!mounted || props.navigation !== \"rail\") return;\n if (scheduled !== undefined) cancelAnimationFrame(scheduled);\n scheduled = requestAnimationFrame(() => {\n scheduled = undefined;\n if (mounted) rebuildRail();\n });\n}\nfunction scroll(top: number, behavior: ScrollBehavior) {\n if (!viewport.value) return;\n programmatic = true;\n if (typeof viewport.value.scrollTo === \"function\")\n viewport.value.scrollTo({ top, behavior });\n else viewport.value.scrollTop = top;\n if (releaseProgrammatic !== undefined) clearTimeout(releaseProgrammatic);\n releaseProgrammatic = setTimeout(\n () => {\n programmatic = false;\n refreshSelection();\n },\n behavior === \"smooth\" ? 320 : 0,\n );\n}\nfunction scrollToEnd(behavior: ScrollBehavior = scrollBehavior()) {\n if (viewport.value) scroll(viewport.value.scrollHeight, behavior);\n}\nfunction userScroll() {\n const element = viewport.value;\n if (!element || programmatic) return;\n setFollowing(\n element.scrollHeight - element.clientHeight - element.scrollTop <=\n props.followThreshold,\n );\n refreshSelection();\n}\nfunction interruptScroll() {\n programmatic = false;\n}\nfunction select(item: PreviewRailItem) {\n const node = destinations.get(item.id),\n element = viewport.value;\n if (!node || !element) return;\n selected.value = item.id;\n if (links.value[links.value.length - 1]?.id === item.id) {\n setFollowing(true);\n scrollToEnd();\n return;\n }\n setFollowing(false);\n const box = node.getBoundingClientRect(),\n boundary = element.getBoundingClientRect();\n scroll(\n element.scrollTop +\n box.top -\n boundary.top -\n (element.clientHeight - box.height) / 2,\n scrollBehavior(),\n );\n}\nfunction observe() {\n sizeObserver?.disconnect();\n changes?.disconnect();\n if (!mounted) return;\n if (typeof ResizeObserver !== \"undefined\") {\n sizeObserver = new ResizeObserver((entries) => {\n queueRail();\n if (\n entries.some((entry) => entry.target === transcript.value) &&\n props.followOutput &&\n live\n )\n scrollToEnd();\n });\n if (transcript.value) sizeObserver.observe(transcript.value);\n if (viewport.value) sizeObserver.observe(viewport.value);\n }\n if (\n props.navigation === \"rail\" &&\n transcript.value &&\n typeof MutationObserver !== \"undefined\"\n ) {\n changes = new MutationObserver(queueRail);\n changes.observe(transcript.value, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n }\n if (props.navigation === \"rail\") queueRail();\n else rebuildRail();\n}\nwatch(() => props.navigation, observe, { flush: \"post\" });\nwatch(\n () => props.followOutput,\n (value) => {\n live = value;\n if (mounted && value) {\n if (initialScroll !== undefined) cancelAnimationFrame(initialScroll);\n initialScroll = requestAnimationFrame(() => scrollToEnd(\"auto\"));\n }\n },\n);\nonMounted(() => {\n mounted = true;\n if (props.followOutput)\n initialScroll = requestAnimationFrame(() => scrollToEnd(\"auto\"));\n observe();\n});\nonBeforeUnmount(() => {\n mounted = false;\n sizeObserver?.disconnect();\n changes?.disconnect();\n if (releaseProgrammatic !== undefined) clearTimeout(releaseProgrammatic);\n if (scheduled !== undefined) cancelAnimationFrame(scheduled);\n if (initialScroll !== undefined) cancelAnimationFrame(initialScroll);\n attach(null);\n});\nconst viewportClasses = computed(() =>\n cn(\n \"h-full overflow-y-auto overscroll-contain outline-none [overflow-anchor:none] focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\",\n props.navigation === \"rail\"\n ? \"[-ms-overflow-style:none] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\"\n : \"[scrollbar-gutter:stable]\",\n props.viewportClassName,\n props.navigation === \"rail\" && overflowing.value && \"pr-10\",\n ),\n);\nfunction Viewport() {\n const { onScroll, onWheel, onTouchstart, onKeydown, ...attributes } =\n props.viewportProps ?? {};\n return h(\n \"section\",\n {\n ...attributes,\n ref: attach,\n \"aria-label\": props.label,\n class: viewportClasses.value,\n onScroll: [userScroll, onScroll],\n onWheel: [interruptScroll, onWheel],\n onTouchstart: [interruptScroll, onTouchstart],\n onKeydown: [\n (event: KeyboardEvent) => {\n if ([\"ArrowUp\", \"PageUp\", \"Home\"].includes(event.key))\n interruptScroll();\n },\n onKeydown,\n ],\n },\n h(\n \"div\",\n {\n role: \"log\",\n \"aria-live\": \"polite\",\n \"aria-relevant\": \"additions text\",\n \"aria-busy\": props.busy,\n class: props.contentClassName,\n ...props.contentProps,\n ref: transcript,\n },\n slots.default?.(),\n ),\n );\n}\ndefineExpose({ scrollToEnd, viewport });\n</script>\n<template>\n <div\n data-slot=\"message-scroller\"\n v-bind=\"$attrs\"\n :class=\"cn('min-h-0', $attrs.class)\"\n >\n <PreviewRail\n v-if=\"navigation === 'rail'\"\n :items=\"overflowing ? links : []\"\n :label=\"navigationLabel\"\n :active-id=\"selected\"\n @item-select=\"select\"\n preview-side=\"before\"\n highlight-active\n :item-size=\"14\"\n class=\"h-full min-h-0 overflow-hidden\"\n preview-container-class-name=\"right-8 left-3\"\n preview-class-name=\"mr-1 w-64 max-w-full [&_[data-slot=preview-rail-card]]:h-20 [&_[data-slot=preview-rail-card]]:overflow-hidden [&_[data-slot=preview-rail-card]]:p-3 [&_[data-slot=preview-rail-title]]:line-clamp-1 [&_[data-slot=preview-rail-title]]:text-xs [&_[data-slot=preview-rail-title]]:leading-4 [&_[data-slot=preview-rail-description]]:line-clamp-2 [&_[data-slot=preview-rail-description]]:text-xs [&_[data-slot=preview-rail-description]]:leading-4\"\n :rail-class-name=\"\n cn(\n 'absolute inset-y-3 right-1 w-7 content-center py-1 [&_[data-slot=preview-rail-item]]:w-7 [&_[data-slot=preview-rail-item]]:justify-end [&_[data-slot=preview-rail-tick]]:h-px [&_[data-slot=preview-rail-tick]]:w-4 [&_[data-slot=preview-rail-tick]]:origin-right',\n overflowing\n ? 'pointer-events-auto opacity-100'\n : 'pointer-events-none opacity-0',\n railClassName,\n )\n \"\n ><Viewport /></PreviewRail\n ><Viewport v-else />\n </div>\n</template>\n"
373
+ },
374
+ {
375
+ "path": "registry/orvui/agents/message/index.ts",
376
+ "target": "~/src/components/orvui/agents/message/index.ts",
377
+ "type": "registry:lib",
378
+ "content": "export { default as Message } from \"./src/Message.vue\";\nexport { default as MessageGroup } from \"./src/MessageGroup.vue\";\nexport { default as MessageAvatar } from \"./src/MessageAvatar.vue\";\nexport { default as MessageContent } from \"./src/MessageContent.vue\";\nexport { default as MessageHeader } from \"./src/MessageHeader.vue\";\nexport { default as MessageFooter } from \"./src/MessageFooter.vue\";\nexport { default as MessageMarker } from \"./src/MessageMarker.vue\";\nexport { default as MessageTyping } from \"./src/MessageTyping.vue\";\nexport * from \"./src/context\";\n\nexport type * from \"./src/api-types\";\n\nexport * from \"../message-bubble\";\nexport * from \"../message-scroller\";\n"
379
+ },
380
+ {
381
+ "path": "registry/orvui/agents/message/src/alignment.ts",
382
+ "target": "~/src/components/orvui/agents/message/src/alignment.ts",
383
+ "type": "registry:lib",
384
+ "content": "import { computed, inject } from \"vue\";\nimport { messageKey, type MessageFrom } from \"./context\";\nexport function useMessageAlignment() {\n const inherited = inject(\n messageKey,\n computed<MessageFrom>(() => \"assistant\"),\n );\n return computed(() => inherited.value === \"user\");\n}\n"
385
+ },
386
+ {
387
+ "path": "registry/orvui/agents/message/src/api-types.ts",
388
+ "target": "~/src/components/orvui/agents/message/src/api-types.ts",
389
+ "type": "registry:lib",
390
+ "content": "// Vue public prop types, derived from the actual components.\nexport type MessageAvatarProps = InstanceType<\n (typeof import(\"./MessageAvatar.vue\"))[\"default\"]\n>[\"$props\"];\nexport type MessageContentProps = InstanceType<\n (typeof import(\"./MessageContent.vue\"))[\"default\"]\n>[\"$props\"];\nexport type MessageFooterProps = InstanceType<\n (typeof import(\"./MessageFooter.vue\"))[\"default\"]\n>[\"$props\"];\nexport type MessageGroupProps = InstanceType<\n (typeof import(\"./MessageGroup.vue\"))[\"default\"]\n>[\"$props\"];\nexport type MessageHeaderProps = InstanceType<\n (typeof import(\"./MessageHeader.vue\"))[\"default\"]\n>[\"$props\"];\nexport type MessageMarkerProps = InstanceType<\n (typeof import(\"./MessageMarker.vue\"))[\"default\"]\n>[\"$props\"];\nexport type MessageProps = InstanceType<\n (typeof import(\"./Message.vue\"))[\"default\"]\n>[\"$props\"];\nexport type MessageTypingProps = InstanceType<\n (typeof import(\"./MessageTyping.vue\"))[\"default\"]\n>[\"$props\"];\n"
391
+ },
392
+ {
393
+ "path": "registry/orvui/agents/message/src/context.ts",
394
+ "target": "~/src/components/orvui/agents/message/src/context.ts",
395
+ "type": "registry:lib",
396
+ "content": "import type { ComputedRef, InjectionKey } from \"vue\";\nexport type MessageFrom = \"user\" | \"assistant\";\nexport const messageKey = Symbol(\"orvui-message\") as InjectionKey<\n ComputedRef<MessageFrom>\n>;\n"
397
+ },
398
+ {
399
+ "path": "registry/orvui/agents/message/src/Message.vue",
400
+ "target": "~/src/components/orvui/agents/message/src/Message.vue",
401
+ "type": "registry:component",
402
+ "content": "<script setup lang=\"ts\">\nimport { computed, provide } from \"vue\";\nimport { motion } from \"motion-v\";\nimport { cn } from \"../../../lib/utils\";\nimport { useReduced } from \"../../shared\";\nimport { messageKey, type MessageFrom } from \"./context\";\nconst props = withDefaults(\n defineProps<{ from: MessageFrom; animateIn?: boolean }>(),\n { animateIn: false },\n);\nconst side = computed(() => props.from);\nprovide(messageKey, side);\nconst reduced = useReduced();\nconst initial = computed(() =>\n props.animateIn && !reduced.value ? { opacity: 0, y: 8, scale: 0.95 } : false,\n);\n</script>\n<template>\n <motion.article\n data-slot=\"message\"\n :data-from=\"from\"\n :aria-label=\"`${from} message`\"\n :class=\"\n cn(\n 'group/message flex w-full items-start gap-2',\n from === 'user' ? 'flex-row-reverse' : 'flex-row',\n )\n \"\n :style=\"{ transformOrigin: from === 'user' ? '100% 100%' : '0% 100%' }\"\n :initial=\"initial\"\n :animate=\"{ opacity: 1, y: 0, scale: 1 }\"\n :exit=\"reduced ? { opacity: 0 } : { opacity: 0, y: -3, scale: 0.99 }\"\n :transition=\"\n reduced\n ? { duration: 0.12 }\n : { type: 'spring', stiffness: 480, damping: 32, mass: 0.62 }\n \"\n ><slot\n /></motion.article>\n</template>\n"
403
+ },
404
+ {
405
+ "path": "registry/orvui/agents/message/src/MessageAvatar.vue",
406
+ "target": "~/src/components/orvui/agents/message/src/MessageAvatar.vue",
407
+ "type": "registry:component",
408
+ "content": "<script setup lang=\"ts\">\nimport { h, renderSlot, useAttrs } from \"vue\";\nimport { cn } from \"../../../lib/utils\";\ndefineOptions({ inheritAttrs: false });\nconst props = withDefaults(defineProps<{ placeholder?: boolean }>(), {\n placeholder: false,\n});\nconst slots = defineSlots<{ default?(props: {}): any }>();\nconst attrs = useAttrs();\nconst frame =\n \"grid size-7 shrink-0 place-items-center overflow-hidden rounded-full bg-muted text-xs font-medium text-muted-foreground [&_img]:size-full [&_img]:object-cover [&_svg]:size-3.5\";\nconst RenderFrame = () => {\n const presentation = props.placeholder\n ? { class: \"invisible\", hidden: true }\n : { class: undefined, hidden: undefined };\n return h(\n \"div\",\n {\n \"data-slot\": \"message-avatar\",\n ...attrs,\n \"aria-hidden\": presentation.hidden,\n class: cn(frame, presentation.class, attrs.class),\n },\n [renderSlot(slots, \"default\")],\n );\n};\n</script>\n<template><RenderFrame /></template>\n"
409
+ },
410
+ {
411
+ "path": "registry/orvui/agents/message/src/MessageContent.vue",
412
+ "target": "~/src/components/orvui/agents/message/src/MessageContent.vue",
413
+ "type": "registry:component",
414
+ "content": "<script setup lang=\"ts\">\nimport { cn } from \"../../../lib/utils\";\nimport { useMessageAlignment } from \"./alignment\";\ndefineOptions({ inheritAttrs: false });\nconst end = useMessageAlignment();\n</script>\n<template>\n <div\n data-slot=\"message-content\"\n v-bind=\"$attrs\"\n :class=\"\n cn(\n 'flex min-w-0 flex-1 flex-col gap-1.5',\n end ? 'items-end' : 'items-start',\n $attrs.class,\n )\n \"\n >\n <slot />\n </div>\n</template>\n"
415
+ },
416
+ {
417
+ "path": "registry/orvui/agents/message/src/MessageFooter.vue",
418
+ "target": "~/src/components/orvui/agents/message/src/MessageFooter.vue",
419
+ "type": "registry:component",
420
+ "content": "<script setup lang=\"ts\">\nimport { cn } from \"../../../lib/utils\";\nimport { useMessageAlignment } from \"./alignment\";\ndefineOptions({ inheritAttrs: false });\nconst end = useMessageAlignment();\n</script>\n<template>\n <div\n data-slot=\"message-footer\"\n v-bind=\"$attrs\"\n :class=\"\n cn(\n 'flex min-h-5 items-center gap-1 px-1 text-[11px] text-muted-foreground',\n end ? 'justify-end' : 'justify-start',\n $attrs.class,\n )\n \"\n >\n <slot />\n </div>\n</template>\n"
421
+ },
422
+ {
423
+ "path": "registry/orvui/agents/message/src/MessageGroup.vue",
424
+ "target": "~/src/components/orvui/agents/message/src/MessageGroup.vue",
425
+ "type": "registry:component",
426
+ "content": "<script setup lang=\"ts\">\nimport { h, renderSlot, useAttrs } from \"vue\";\nimport { cn } from \"../../../lib/utils\";\ndefineOptions({ inheritAttrs: false });\nconst props = withDefaults(defineProps<{ spacing?: \"compact\" | \"default\" }>(), {\n spacing: \"compact\",\n});\nconst slots = defineSlots<{ default?(props: {}): any }>();\nconst attrs = useAttrs();\nconst gaps = { compact: \"gap-1.5\", default: \"gap-4\" } as const;\nconst RenderFrame = () =>\n h(\n \"div\",\n {\n \"data-slot\": \"message-group\",\n ...attrs,\n class: cn(\n \"flex w-full flex-col\",\n gaps[props.spacing === \"compact\" ? \"compact\" : \"default\"],\n attrs.class,\n ),\n },\n [renderSlot(slots, \"default\")],\n );\n</script>\n<template><RenderFrame /></template>\n"
427
+ },
428
+ {
429
+ "path": "registry/orvui/agents/message/src/MessageHeader.vue",
430
+ "target": "~/src/components/orvui/agents/message/src/MessageHeader.vue",
431
+ "type": "registry:component",
432
+ "content": "<script setup lang=\"ts\">\nimport { cn } from \"../../../lib/utils\";\nimport { useMessageAlignment } from \"./alignment\";\ndefineOptions({ inheritAttrs: false });\nconst end = useMessageAlignment();\n</script>\n<template>\n <div\n data-slot=\"message-header\"\n v-bind=\"$attrs\"\n :class=\"\n cn(\n 'flex items-center gap-1.5 px-1 text-[11px] leading-none text-muted-foreground',\n end ? 'justify-end' : 'justify-start',\n $attrs.class,\n )\n \"\n >\n <slot />\n </div>\n</template>\n"
433
+ },
434
+ {
435
+ "path": "registry/orvui/agents/message/src/MessageMarker.vue",
436
+ "target": "~/src/components/orvui/agents/message/src/MessageMarker.vue",
437
+ "type": "registry:component",
438
+ "content": "<script setup lang=\"ts\">\nimport { cn } from \"../../../lib/utils\";\ndefineOptions({ inheritAttrs: false });\n</script>\n<template>\n <div\n data-slot=\"message-marker\"\n v-bind=\"$attrs\"\n :class=\"\n cn(\n 'mx-auto flex w-fit max-w-[88%] items-center gap-1.5 rounded-full bg-muted/70 px-2.5 py-1 text-center text-xs text-muted-foreground',\n $attrs.class,\n )\n \"\n >\n <slot />\n </div>\n</template>\n"
439
+ },
440
+ {
441
+ "path": "registry/orvui/agents/message/src/MessageTyping.vue",
442
+ "target": "~/src/components/orvui/agents/message/src/MessageTyping.vue",
443
+ "type": "registry:component",
444
+ "content": "<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { motion } from \"motion-v\";\nimport { cn } from \"../../../lib/utils\";\nimport { EASE_OUT } from \"../../../lib/ease\";\nimport { useReducedMotion } from \"../../../lib/composables\";\ndefineOptions({ inheritAttrs: false });\nwithDefaults(defineProps<{ label?: string }>(), { label: \"Responding\" });\nconst reduced = useReducedMotion();\nconst phases = computed(() =>\n [0, 0.14, 0.28].map((delay) => ({\n delay,\n duration: 1.05,\n ease: EASE_OUT,\n repeat: Infinity,\n })),\n);\n</script>\n<template>\n <span\n data-slot=\"message-typing\"\n v-bind=\"$attrs\"\n :class=\"cn('inline-flex h-5 items-center gap-1', $attrs.class)\"\n ><span class=\"sr-only\">{{ label }}</span\n ><motion.span\n v-for=\"(phase, index) in phases\"\n :key=\"index\"\n aria-hidden=\"true\"\n class=\"size-1 rounded-full bg-current\"\n :animate=\"\n reduced\n ? { opacity: 0.45 }\n : { opacity: [0.28, 0.85, 0.28], y: [0, -2, 0] }\n \"\n :transition=\"reduced ? { duration: 0 } : phase\"\n /></span>\n</template>\n"
445
+ },
446
+ {
447
+ "path": "registry/orvui/agents/prompt-input/index.ts",
448
+ "target": "~/src/components/orvui/agents/prompt-input/index.ts",
449
+ "type": "registry:lib",
450
+ "content": "export { default as PromptInput } from \"./src/PromptInput.vue\";\nexport type { PromptModel, PromptAction } from \"./src/PromptInput.vue\";\n\nexport type * from \"./src/api-types\";\n"
451
+ },
452
+ {
453
+ "path": "registry/orvui/agents/prompt-input/src/api-types.ts",
454
+ "target": "~/src/components/orvui/agents/prompt-input/src/api-types.ts",
455
+ "type": "registry:lib",
456
+ "content": "// Vue public prop types, derived from the actual components.\nexport type PromptInputProps = InstanceType<\n (typeof import(\"./PromptInput.vue\"))[\"default\"]\n>[\"$props\"];\n"
457
+ },
458
+ {
459
+ "path": "registry/orvui/agents/prompt-input/src/PromptInput.vue",
460
+ "target": "~/src/components/orvui/agents/prompt-input/src/PromptInput.vue",
461
+ "type": "registry:component",
462
+ "content": "<script setup lang=\"ts\">\nimport {\n computed,\n getCurrentInstance,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n useAttrs,\n watch,\n} from \"vue\";\nimport { AnimatePresence, motion } from \"motion-v\";\nimport { ArrowUp, Plus, Square } from \"lucide-vue-next\";\nimport { Button } from \"../../../motion/button\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n} from \"../../../motion/select\";\nimport {\n MorphPopover,\n MorphPopoverContent,\n MorphPopoverTrigger,\n} from \"../../../motion/popover\";\nimport { SPRING_SWAP } from \"../../../lib/ease\";\nimport { cn } from \"../../../lib/utils\";\nimport {\n RenderNode,\n useControllable,\n useReduced,\n type Content,\n} from \"../../shared\";\nexport interface PromptModel {\n value: string;\n label: Content;\n icon?: Content;\n disabled?: boolean;\n}\nexport interface PromptAction {\n value: string;\n label: Content;\n description?: Content;\n icon?: Content;\n disabled?: boolean;\n}\ndefineOptions({ inheritAttrs: false });\nconst props = withDefaults(\n defineProps<{\n modelValue?: string;\n defaultValue?: string;\n models?: PromptModel[];\n model?: string;\n defaultModel?: string;\n actions?: PromptAction[];\n loading?: boolean;\n minRows?: number;\n maxRows?: number;\n disabled?: boolean;\n placeholder?: string;\n }>(),\n {\n defaultValue: \"\",\n models: () => [],\n actions: () => [],\n loading: false,\n minRows: 2,\n maxRows: 8,\n placeholder: \"Ask the agent to do something…\",\n },\n);\nconst emit = defineEmits<{\n \"update:modelValue\": [value: string];\n valueChange: [value: string];\n \"update:model\": [value: string];\n modelChange: [value: string];\n action: [action: string];\n submit: [value: string, model?: string];\n stop: [];\n}>();\nconst value = useControllable(\n () => props.modelValue,\n props.defaultValue,\n (next) => {\n emit(\"update:modelValue\", next);\n emit(\"valueChange\", next);\n },\n);\nconst selected = useControllable(\n () => props.model,\n props.defaultModel ?? props.models[0]?.value,\n (next) => {\n if (next !== undefined) {\n emit(\"update:model\", next);\n emit(\"modelChange\", next);\n }\n },\n);\nconst selectedModel = computed(() =>\n props.models.find((item) => item.value === selected.value),\n);\nconst ready = computed(\n () => value.value.trim().length > 0 && !props.disabled && !props.loading,\n);\nconst textarea = ref<HTMLTextAreaElement>();\nconst measurement = ref<HTMLElement>();\nconst menu = ref(false);\nconst reduced = useReduced();\nconst attrs = useAttrs();\nconst instance = getCurrentInstance();\nconst stoppable = () => !!instance?.vnode.props?.onStop;\nconst inputAttributes = () =>\n Object.fromEntries(\n Object.entries(attrs).filter(([key]) => key !== \"class\" && key !== \"style\"),\n );\nlet observer: ResizeObserver | undefined,\n alive = false;\nfunction fit() {\n if (!alive || !textarea.value || !measurement.value) return;\n const height = Math.min(\n props.maxRows * 24,\n Math.max(props.minRows * 24, measurement.value.scrollHeight),\n );\n textarea.value.style.height = `${height}px`;\n}\nfunction input(event: Event) {\n const element = event.target as HTMLTextAreaElement;\n value.value = element.value;\n nextTick(() => {\n if (!alive) return;\n if (props.modelValue !== undefined) element.value = props.modelValue;\n fit();\n });\n}\nfunction submit() {\n if (!ready.value) return;\n emit(\"submit\", value.value.trim(), selected.value);\n if (props.modelValue === undefined) value.value = \"\";\n textarea.value?.focus({ preventScroll: true });\n}\nfunction keydown(event: KeyboardEvent) {\n if (event.key !== \"Enter\" || event.shiftKey || event.isComposing) return;\n event.preventDefault();\n submit();\n}\nfunction choose(action: PromptAction) {\n if (!action.disabled) {\n emit(\"action\", action.value);\n menu.value = false;\n }\n}\nwatch([value, () => props.minRows, () => props.maxRows], () => nextTick(fit));\nonMounted(() => {\n alive = true;\n fit();\n if (textarea.value && typeof ResizeObserver !== \"undefined\") {\n observer = new ResizeObserver(fit);\n observer.observe(textarea.value);\n }\n});\nonBeforeUnmount(() => {\n alive = false;\n observer?.disconnect();\n});\n</script>\n<template>\n <form\n :class=\"\n cn(\n 'relative w-full rounded-2xl border border-border/80 bg-background p-2 transition-colors focus-within:border-foreground/40',\n disabled && 'opacity-60',\n $attrs.class,\n )\n \"\n :style=\"$attrs.style as any\"\n @submit.prevent=\"submit\"\n >\n <div\n ref=\"measurement\"\n aria-hidden=\"true\"\n class=\"pointer-events-none invisible absolute inset-x-2 top-0 whitespace-pre-wrap px-2 text-sm leading-6 [overflow-wrap:break-word]\"\n >\n {{ value + \"​\" }}\n </div>\n <textarea\n ref=\"textarea\"\n v-bind=\"inputAttributes()\"\n :value=\"value\"\n :rows=\"minRows\"\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n :aria-label=\"($attrs['aria-label'] as string) || 'Prompt'\"\n class=\"scrollbar-hide block w-full resize-none overflow-y-auto bg-transparent px-2 pt-1.5 text-sm leading-6 text-foreground outline-none placeholder:text-muted-foreground/55\"\n @input=\"input\"\n @keydown=\"keydown\"\n />\n <div class=\"mt-1 flex min-h-8 items-center gap-1\">\n <MorphPopover v-if=\"actions.length\" v-model:open=\"menu\"\n ><MorphPopoverTrigger\n ><Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n :disabled=\"disabled || loading\"\n aria-label=\"Add to prompt\"\n class=\"size-8 rounded-full\"\n ><motion.span\n aria-hidden=\"true\"\n :animate=\"{ rotate: menu ? 45 : 0 }\"\n :transition=\"reduced ? { duration: 0 } : SPRING_SWAP\"\n ><Plus class=\"size-4\" /></motion.span></Button\n ></MorphPopoverTrigger>\n <MorphPopoverContent\n side=\"top\"\n align=\"start\"\n :side-offset=\"8\"\n :radius=\"12\"\n class=\"w-56 p-1.5\"\n >\n <button\n v-for=\"action in actions\"\n :key=\"action.value\"\n type=\"button\"\n :disabled=\"action.disabled\"\n @click=\"choose(action)\"\n class=\"flex w-full items-start gap-2.5 rounded-lg px-2.5 py-2 text-left outline-none transition-colors hover:bg-muted focus-visible:bg-muted disabled:pointer-events-none disabled:opacity-50\"\n >\n <span\n v-if=\"action.icon\"\n class=\"mt-0.5 grid size-5 shrink-0 place-items-center text-muted-foreground [&_svg]:size-4\"\n ><RenderNode :node=\"action.icon\" /></span\n ><span class=\"min-w-0\"\n ><span class=\"block text-sm\"\n ><RenderNode :node=\"action.label\" /></span\n ><span\n v-if=\"action.description\"\n class=\"mt-0.5 block text-xs leading-4 text-muted-foreground\"\n ><RenderNode :node=\"action.description\" /></span\n ></span>\n </button>\n </MorphPopoverContent>\n </MorphPopover>\n <slot name=\"leading-action\" />\n <Select\n v-if=\"models.length\"\n :model-value=\"selected\"\n :disabled=\"disabled || loading\"\n class=\"min-w-0\"\n @update:model-value=\"selected = $event\"\n ><SelectTrigger\n aria-label=\"AI model\"\n class=\"h-8 w-auto max-w-52 rounded-xl border-0 bg-transparent px-2 py-0 text-xs hover:bg-muted focus-visible:ring-2\"\n ><span class=\"flex min-w-0 items-center gap-1.5\"\n ><span\n v-if=\"selectedModel?.icon\"\n class=\"grid size-4 shrink-0 place-items-center text-muted-foreground [&_svg]:size-3.5\"\n ><RenderNode :node=\"selectedModel.icon\" /></span\n ><span class=\"truncate text-muted-foreground\"\n ><RenderNode\n :node=\"selectedModel?.label ?? 'Choose model'\" /></span></span\n ></SelectTrigger>\n <SelectContent class=\"right-auto w-52 shadow-none\"\n ><SelectItem\n v-for=\"option in models\"\n :key=\"option.value\"\n :value=\"option.value\"\n :disabled=\"option.disabled\"\n class=\"py-2\"\n ><span class=\"flex min-w-0 items-center gap-2\"\n ><span\n v-if=\"option.icon\"\n class=\"grid size-5 shrink-0 place-items-center text-muted-foreground [&_svg]:size-4\"\n ><RenderNode :node=\"option.icon\" /></span\n ><span class=\"min-w-0 truncate text-sm\"\n ><RenderNode :node=\"option.label\" /></span></span></SelectItem\n ></SelectContent>\n </Select>\n <Button\n :type=\"loading ? 'button' : 'submit'\"\n size=\"icon\"\n :disabled=\"loading ? !stoppable() : !ready\"\n :aria-label=\"loading ? 'Stop generating' : 'Send prompt'\"\n class=\"ml-auto size-8 rounded-full\"\n @click=\"loading && emit('stop')\"\n ><AnimatePresence :initial=\"false\" mode=\"popLayout\"\n ><motion.span\n :key=\"loading ? 'stop' : 'send'\"\n class=\"grid place-items-center\"\n :initial=\"\n reduced ? { opacity: 1 } : { opacity: 0, y: 3, scale: 0.8 }\n \"\n :animate=\"{ opacity: 1, y: 0, scale: 1 }\"\n :exit=\"reduced ? { opacity: 0 } : { opacity: 0, y: -3, scale: 0.8 }\"\n :transition=\"reduced ? { duration: 0 } : SPRING_SWAP\"\n ><Square v-if=\"loading\" class=\"size-3 fill-current\" /><ArrowUp\n v-else\n class=\"size-4\" /></motion.span></AnimatePresence\n ></Button>\n </div>\n </form>\n</template>\n"
463
+ },
464
+ {
465
+ "path": "registry/orvui/agents/shared.ts",
466
+ "target": "~/src/components/orvui/agents/shared.ts",
467
+ "type": "registry:lib",
468
+ "content": "export {\n RenderNode,\n useControllable,\n useOutside,\n useReduced,\n rove,\n type Content,\n} from \"../blocks/shared\";\nimport { onBeforeUnmount, ref } from \"vue\";\n\nexport function useClipboard(\n read: () => string,\n callback?: () => void | Promise<void>,\n) {\n const copied = ref(false);\n let reset: ReturnType<typeof setTimeout> | undefined;\n let generation = 0;\n let alive = true;\n async function copy() {\n const request = ++generation;\n if (reset !== undefined) clearTimeout(reset);\n copied.value = false;\n try {\n if (callback) await callback();\n else await navigator.clipboard.writeText(read());\n if (!alive || request !== generation) return;\n copied.value = true;\n reset = setTimeout(() => {\n if (alive) copied.value = false;\n }, 1600);\n } catch {\n if (alive && request === generation) copied.value = false;\n }\n }\n onBeforeUnmount(() => {\n alive = false;\n generation++;\n if (reset !== undefined) clearTimeout(reset);\n });\n return { copied, copy };\n}\n"
469
+ },
470
+ {
471
+ "path": "registry/orvui/agents/stream-follow.ts",
472
+ "target": "~/src/components/orvui/agents/stream-follow.ts",
473
+ "type": "registry:lib",
474
+ "content": "import {\n onBeforeUnmount,\n onMounted,\n watch,\n type Ref,\n type WatchSource,\n} from \"vue\";\n\n/** Follow a caller-owned stream only after mount; one queued scroll owns each frame. */\nexport function useStreamFollow(\n element: Ref<HTMLElement | undefined>,\n enabled: () => boolean,\n reduced: Ref<boolean>,\n changes: WatchSource[],\n) {\n let mounted = false;\n let pending: number | undefined;\n const clear = () => {\n if (pending !== undefined) cancelAnimationFrame(pending);\n pending = undefined;\n };\n function schedule() {\n clear();\n if (!mounted || !enabled()) return;\n pending = requestAnimationFrame(() => {\n pending = undefined;\n const viewport = element.value;\n if (\n !mounted ||\n !enabled() ||\n !viewport ||\n viewport.scrollHeight <= viewport.clientHeight\n )\n return;\n if (typeof viewport.scrollTo === \"function\")\n viewport.scrollTo({\n top: viewport.scrollHeight,\n behavior: reduced.value ? \"auto\" : \"smooth\",\n });\n else viewport.scrollTop = viewport.scrollHeight;\n });\n }\n watch(changes, schedule, { deep: true, flush: \"post\" });\n onMounted(() => {\n mounted = true;\n schedule();\n });\n onBeforeUnmount(() => {\n mounted = false;\n clear();\n });\n return schedule;\n}\n"
475
+ },
476
+ {
477
+ "path": "registry/orvui/agents/streaming-response/index.ts",
478
+ "target": "~/src/components/orvui/agents/streaming-response/index.ts",
479
+ "type": "registry:lib",
480
+ "content": "export { default as StreamingResponse } from \"./src/StreamingResponse.vue\";\nexport type {\n StreamingResponseStatus,\n StreamingResponseFeedback,\n} from \"./src/StreamingResponse.vue\";\n\nexport type * from \"./src/api-types\";\n"
481
+ },
482
+ {
483
+ "path": "registry/orvui/agents/streaming-response/src/api-types.ts",
484
+ "target": "~/src/components/orvui/agents/streaming-response/src/api-types.ts",
485
+ "type": "registry:lib",
486
+ "content": "// Vue public prop types, derived from the actual components.\nexport type StreamingResponseProps = InstanceType<\n (typeof import(\"./StreamingResponse.vue\"))[\"default\"]\n>[\"$props\"];\n"
487
+ },
488
+ {
489
+ "path": "registry/orvui/agents/streaming-response/src/ResponseAction.vue",
490
+ "target": "~/src/components/orvui/agents/streaming-response/src/ResponseAction.vue",
491
+ "type": "registry:component",
492
+ "content": "<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { motion } from \"motion-v\";\nimport { cn } from \"../../../lib/utils\";\nimport { SPRING_PRESS } from \"../../../lib/ease\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nconst props = withDefaults(defineProps<{ label: string; active?: boolean }>(), {\n active: false,\n});\nconst reduced = useReducedMotion();\nconst pressed = computed(() =>\n [\"Helpful\", \"Not helpful\"].includes(props.label) ? props.active : undefined,\n);\n</script>\n<template>\n <motion.button\n type=\"button\"\n :aria-label=\"label\"\n :title=\"label\"\n :aria-pressed=\"pressed\"\n :while-press=\"reduced ? undefined : { scale: 0.9 }\"\n :transition=\"SPRING_PRESS\"\n :class=\"\n cn(\n 'grid size-7 place-items-center rounded-md text-muted-foreground outline-none transition-colors hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring',\n active && 'bg-muted text-foreground',\n )\n \"\n ><slot\n /></motion.button>\n</template>\n"
493
+ },
494
+ {
495
+ "path": "registry/orvui/agents/streaming-response/src/StreamingResponse.vue",
496
+ "target": "~/src/components/orvui/agents/streaming-response/src/StreamingResponse.vue",
497
+ "type": "registry:component",
498
+ "content": "<script setup lang=\"ts\">\nimport { computed, getCurrentInstance, useId } from \"vue\";\nimport { AnimatePresence, motion } from \"motion-v\";\nimport {\n Check,\n ChevronDown,\n Copy,\n RotateCcw,\n ThumbsDown,\n ThumbsUp,\n} from \"lucide-vue-next\";\nimport { EASE_OUT, SPRING_SWAP } from \"../../../lib/ease\";\nimport { cn } from \"../../../lib/utils\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nimport { CitationList, CitationStack, type CitationItem } from \"../../citations\";\nimport { useClipboard, useControllable } from \"../../shared\";\nimport AgentDisclosure from \"../../AgentDisclosure.vue\";\nimport ResponseAction from \"./ResponseAction.vue\";\nexport type StreamingResponseStatus = \"streaming\" | \"complete\" | \"error\";\nexport type StreamingResponseFeedback = \"up\" | \"down\" | null;\nconst props = withDefaults(\n defineProps<{\n status?: StreamingResponseStatus;\n copyText?: string;\n onCopy?: () => void | Promise<void>;\n sources?: CitationItem[];\n sourcesOpen?: boolean;\n defaultSourcesOpen?: boolean;\n sourceIdPrefix?: string;\n feedback?: StreamingResponseFeedback;\n defaultFeedback?: StreamingResponseFeedback;\n announce?: boolean;\n showActions?: boolean;\n contentClassName?: string;\n actionsClassName?: string;\n }>(),\n {\n status: \"streaming\",\n sources: () => [],\n sourcesOpen: undefined,\n defaultSourcesOpen: false,\n defaultFeedback: null,\n announce: true,\n showActions: true,\n },\n);\nconst emit = defineEmits<{\n retry: [];\n \"update:sourcesOpen\": [open: boolean];\n sourcesOpenChange: [open: boolean];\n \"update:feedback\": [feedback: StreamingResponseFeedback];\n feedbackChange: [feedback: StreamingResponseFeedback];\n}>();\nconst feedbackValue = useControllable(\n () => props.feedback,\n props.defaultFeedback,\n (value) => {\n emit(\"update:feedback\", value);\n emit(\"feedbackChange\", value);\n },\n);\nconst expanded = useControllable(\n () => props.sourcesOpen,\n props.defaultSourcesOpen,\n (value) => {\n emit(\"update:sourcesOpen\", value);\n emit(\"sourcesOpenChange\", value);\n },\n);\nconst { copy, copied } = useClipboard(\n () => props.copyText ?? \"\",\n () =>\n props.onCopy\n ? props.onCopy()\n : navigator.clipboard.writeText(props.copyText ?? \"\"),\n);\nconst reduced = useReducedMotion();\nconst identity = useId();\nconst instance = getCurrentInstance();\nconst hasRetry = () => !!instance?.vnode.props?.onRetry;\nconst visible = computed(\n () =>\n props.showActions &&\n props.status !== \"streaming\" &&\n !!(\n props.copyText ||\n props.onCopy ||\n hasRetry() ||\n props.status === \"complete\" ||\n props.sources.length\n ),\n);\nfunction toggleFeedback(value: \"up\" | \"down\") {\n feedbackValue.value = feedbackValue.value === value ? null : value;\n}\n</script>\n<template>\n <div :data-state=\"status\" :aria-busy=\"status === 'streaming'\" class=\"w-full\">\n <div\n :aria-live=\"announce ? 'polite' : 'off'\"\n :class=\"\n cn(\n 'text-sm leading-6 text-foreground/90 [&_a]:font-medium [&_a]:underline [&_a]:underline-offset-4 [&_code]:rounded [&_code]:bg-muted [&_code]:px-1 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[0.9em] [&_ol]:my-3 [&_ol]:list-decimal [&_ol]:space-y-1 [&_ol]:pl-5 [&_p+p]:mt-3 [&_pre]:my-3 [&_pre]:overflow-x-auto [&_pre]:rounded-xl [&_pre]:border [&_pre]:border-border [&_pre]:bg-muted/45 [&_pre]:p-3 [&_pre_code]:bg-transparent [&_pre_code]:p-0 [&_ul]:my-3 [&_ul]:list-disc [&_ul]:space-y-1 [&_ul]:pl-5',\n contentClassName,\n )\n \"\n >\n <slot />\n </div>\n <AnimatePresence :initial=\"false\"\n ><motion.div\n v-if=\"visible\"\n class=\"mt-3\"\n :initial=\"reduced ? { opacity: 0 } : { opacity: 0, y: 4 }\"\n :animate=\"{ opacity: 1, y: 0 }\"\n :exit=\"{ opacity: 0 }\"\n :transition=\"{ duration: reduced ? 0.12 : 0.22, ease: EASE_OUT }\"\n >\n <div :class=\"cn('flex items-center gap-0.5', actionsClassName)\">\n <ResponseAction\n v-if=\"copyText || onCopy\"\n :label=\"copied ? 'Copied' : 'Copy response'\"\n @click=\"copy\"\n ><Check v-if=\"copied\" class=\"size-3.5\" /><Copy\n v-else\n class=\"size-3.5\"\n /></ResponseAction>\n <ResponseAction\n v-if=\"hasRetry()\"\n label=\"Retry response\"\n @click=\"emit('retry')\"\n ><RotateCcw class=\"size-3.5\"\n /></ResponseAction>\n <template v-if=\"status === 'complete'\"\n ><ResponseAction\n label=\"Helpful\"\n :active=\"feedbackValue === 'up'\"\n @click=\"toggleFeedback('up')\"\n ><ThumbsUp class=\"size-3.5\" /></ResponseAction\n ><ResponseAction\n label=\"Not helpful\"\n :active=\"feedbackValue === 'down'\"\n @click=\"toggleFeedback('down')\"\n ><ThumbsDown class=\"size-3.5\" /></ResponseAction\n ></template>\n <button\n v-if=\"sources.length\"\n type=\"button\"\n :aria-expanded=\"expanded\"\n :aria-controls=\"`${identity}-sources`\"\n @click=\"expanded = !expanded\"\n class=\"group ml-1 inline-flex min-h-7 items-center gap-2 rounded-md px-1.5 text-xs text-muted-foreground outline-none transition-colors hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <CitationStack :citations=\"sources\" /><span class=\"tabular-nums\"\n >{{ sources.length }}\n {{ sources.length === 1 ? \"source\" : \"sources\" }}</span\n >\n <motion.span\n aria-hidden=\"true\"\n class=\"text-muted-foreground/70 group-hover:text-muted-foreground\"\n :animate=\"{ rotate: expanded ? 180 : 0 }\"\n :transition=\"reduced ? { duration: 0 } : SPRING_SWAP\"\n ><ChevronDown class=\"size-3\"\n /></motion.span>\n </button>\n </div>\n <AgentDisclosure\n v-if=\"sources.length\"\n :id=\"`${identity}-sources`\"\n :open=\"expanded\"\n ><CitationList\n :citations=\"sources\"\n :id-prefix=\"\n sourceIdPrefix ?? `response-source-${identity.replace(/:/g, '')}`\n \"\n class=\"mt-2 rounded-xl bg-muted p-2\"\n /></AgentDisclosure> </motion.div\n ></AnimatePresence>\n </div>\n</template>\n"
499
+ },
500
+ {
501
+ "path": "registry/orvui/agents/todo-list/index.ts",
502
+ "target": "~/src/components/orvui/agents/todo-list/index.ts",
503
+ "type": "registry:lib",
504
+ "content": "export { default as TodoList } from \"./src/TodoList.vue\";\nexport type { TodoItemStatus, TodoItem } from \"./src/TodoList.vue\";\n\nexport type * from \"./src/api-types\";\n"
505
+ },
506
+ {
507
+ "path": "registry/orvui/agents/todo-list/src/api-types.ts",
508
+ "target": "~/src/components/orvui/agents/todo-list/src/api-types.ts",
509
+ "type": "registry:lib",
510
+ "content": "// Vue public prop types, derived from the actual components.\nexport type TodoListProps = InstanceType<\n (typeof import(\"./TodoList.vue\"))[\"default\"]\n>[\"$props\"];\n"
511
+ },
512
+ {
513
+ "path": "registry/orvui/agents/todo-list/src/TodoHeaderIcon.vue",
514
+ "target": "~/src/components/orvui/agents/todo-list/src/TodoHeaderIcon.vue",
515
+ "type": "registry:component",
516
+ "content": "<script setup lang=\"ts\">\nimport { AnimatePresence, motion } from \"motion-v\";\nimport { ListTodo } from \"lucide-vue-next\";\nimport { EASE_OUT, SPRING_SWAP } from \"../../../lib/ease\";\nimport { useReducedMotion } from \"../../../lib/composables\";\ndefineProps<{ complete: boolean }>();\nconst reduced = useReducedMotion();\n// Own normalized three-point mark; the path renderer retains the draw animation.\nconst check = [\n [7.8, 12],\n [10.7, 15],\n [16.4, 9.3],\n]\n .map(([x, y], index) => `${index ? \"L\" : \"M\"}${x} ${y}`)\n .join(\"\");\n</script>\n<template>\n <span\n aria-hidden=\"true\"\n class=\"relative grid size-6 shrink-0 place-items-center\"\n ><AnimatePresence :initial=\"false\" mode=\"popLayout\">\n <motion.svg\n v-if=\"complete\"\n key=\"complete\"\n viewBox=\"0 0 24 24\"\n class=\"absolute size-5.5 overflow-visible text-emerald-500\"\n :initial=\"reduced ? { opacity: 1 } : { opacity: 0, scale: 0.72 }\"\n :animate=\"{ opacity: 1, scale: 1 }\"\n :exit=\"{ opacity: 0 }\"\n :transition=\"reduced ? { duration: 0 } : SPRING_SWAP\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"9\" fill=\"currentColor\" /><motion.path\n :d=\"check\"\n fill=\"none\"\n stroke=\"white\"\n :stroke-width=\"2.25\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n :initial=\"{ pathLength: reduced ? 1 : 0 }\"\n :animate=\"{ pathLength: 1 }\"\n :transition=\"\n reduced ? { duration: 0 } : { duration: 0.24, ease: EASE_OUT }\n \"\n />\n </motion.svg>\n <motion.span\n v-else\n key=\"todo\"\n class=\"absolute grid place-items-center text-muted-foreground\"\n :initial=\"reduced ? { opacity: 1 } : { opacity: 0, scale: 0.8 }\"\n :animate=\"{ opacity: 1, scale: 1 }\"\n :exit=\"reduced ? { opacity: 0 } : { opacity: 0, scale: 0.72 }\"\n :transition=\"reduced ? { duration: 0 } : SPRING_SWAP\"\n ><ListTodo class=\"size-4\"\n /></motion.span> </AnimatePresence\n ></span>\n</template>\n"
517
+ },
518
+ {
519
+ "path": "registry/orvui/agents/todo-list/src/TodoList.vue",
520
+ "target": "~/src/components/orvui/agents/todo-list/src/TodoList.vue",
521
+ "type": "registry:component",
522
+ "content": "<script setup lang=\"ts\">\nimport { computed, ref, useId, watch } from \"vue\";\nimport { AnimatePresence, motion } from \"motion-v\";\nimport { ChevronDown } from \"lucide-vue-next\";\nimport { ActionSwapRollText } from \"../../../motion/action-swap\";\nimport { EASE_OUT, SPRING_LAYOUT, SPRING_SWAP } from \"../../../lib/ease\";\nimport { cn } from \"../../../lib/utils\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nimport { RenderNode, useControllable, type Content } from \"../../shared\";\nimport { useStreamFollow } from \"../../stream-follow\";\nimport AgentDisclosure from \"../../AgentDisclosure.vue\";\nimport TodoHeaderIcon from \"./TodoHeaderIcon.vue\";\nimport TodoStatusIcon from \"./TodoStatusIcon.vue\";\nexport type TodoItemStatus =\n \"pending\" | \"in-progress\" | \"completed\" | \"cancelled\";\nexport interface TodoItem {\n id: string;\n title: Content;\n status?: TodoItemStatus;\n progress?: number;\n detail?: Content;\n}\nconst props = withDefaults(\n defineProps<{\n items: TodoItem[];\n title?: Content;\n open?: boolean;\n defaultOpen?: boolean;\n collapseOnComplete?: boolean;\n maxHeight?: number;\n }>(),\n {\n open: undefined,\n title: \"To-dos\",\n defaultOpen: true,\n collapseOnComplete: true,\n maxHeight: 248,\n },\n);\nconst emit = defineEmits<{\n \"update:open\": [open: boolean];\n openChange: [open: boolean];\n}>();\nconst expanded = useControllable(\n () => props.open,\n props.defaultOpen,\n (value) => {\n emit(\"update:open\", value);\n emit(\"openChange\", value);\n },\n);\nconst reduced = useReducedMotion();\nconst identity = useId();\nconst viewport = ref<HTMLElement>();\nconst completed = computed(() =>\n props.items.reduce(\n (count, item) => count + Number(item.status === \"completed\"),\n 0,\n ),\n);\nconst finished = computed(\n () => props.items.length > 0 && completed.value === props.items.length,\n);\nwatch(finished, (value, previous) => {\n if (previous && !value) expanded.value = true;\n if (value && !previous && props.collapseOnComplete) expanded.value = false;\n});\nuseStreamFollow(viewport, () => props.items.length > 0, reduced, [\n () => props.items.length,\n]);\nconst descriptions: Record<TodoItemStatus, string> = {\n pending: \"Pending\",\n \"in-progress\": \"In progress\",\n completed: \"Completed\",\n cancelled: \"Cancelled\",\n};\nconst tones: Record<TodoItemStatus, string> = {\n pending: \"text-muted-foreground/65\",\n \"in-progress\": \"text-foreground\",\n completed: \"text-muted-foreground/60\",\n cancelled: \"text-muted-foreground/55\",\n};\n</script>\n<template>\n <section\n aria-label=\"Agent task list\"\n class=\"w-full overflow-hidden rounded-2xl border border-border/70\"\n >\n <button\n :id=\"`${identity}-trigger`\"\n type=\"button\"\n :aria-expanded=\"expanded\"\n :aria-controls=\"`${identity}-content`\"\n @click=\"expanded = !expanded\"\n class=\"group flex h-11 w-full items-center gap-2.5 rounded-2xl px-3.5 text-left outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <TodoHeaderIcon :complete=\"finished\" />\n <h3\n class=\"min-w-0 flex-1 truncate text-sm font-medium text-foreground/90\"\n >\n <RenderNode :node=\"title\" />\n </h3>\n <span\n :class=\"\n cn(\n 'shrink-0 text-xs font-medium tabular-nums text-muted-foreground',\n finished && 'text-emerald-600 dark:text-emerald-400',\n )\n \"\n ><span class=\"sr-only\"\n >{{ completed }} of {{ items.length }} tasks completed</span\n ><span aria-hidden=\"true\" class=\"inline-flex\"\n ><ActionSwapRollText :value=\"String(completed)\">{{\n completed\n }}</ActionSwapRollText\n ><span>/</span><span>{{ items.length }}</span></span\n ></span\n >\n <motion.span\n aria-hidden=\"true\"\n class=\"text-muted-foreground/70 transition-colors group-hover:text-muted-foreground\"\n :animate=\"{ rotate: expanded ? 180 : 0 }\"\n :transition=\"reduced ? { duration: 0 } : SPRING_SWAP\"\n ><ChevronDown class=\"size-3.5\"\n /></motion.span>\n </button>\n <AgentDisclosure\n :id=\"`${identity}-content`\"\n role=\"region\"\n :aria-labelledby=\"`${identity}-trigger`\"\n :open=\"expanded\"\n >\n <div\n ref=\"viewport\"\n class=\"scrollbar-hide overflow-y-auto px-2 pb-2\"\n :style=\"{ maxHeight: `${maxHeight}px` }\"\n >\n <ol v-if=\"items.length\" aria-live=\"polite\" class=\"space-y-0\">\n <AnimatePresence :initial=\"false\" mode=\"popLayout\">\n <motion.li\n v-for=\"item in items\"\n :key=\"item.id\"\n layout=\"position\"\n :initial=\"reduced ? { opacity: 1 } : { opacity: 0, y: 6 }\"\n :animate=\"{ opacity: 1, y: 0 }\"\n :exit=\"reduced ? { opacity: 0 } : { opacity: 0, y: -3 }\"\n :transition=\"\n reduced\n ? { duration: 0 }\n : {\n opacity: { duration: 0.18, ease: EASE_OUT },\n y: SPRING_LAYOUT,\n layout: SPRING_LAYOUT,\n }\n \"\n class=\"flex min-h-9 items-center gap-2.5 rounded-xl px-1.5 py-1\"\n >\n <TodoStatusIcon\n :status=\"item.status ?? 'pending'\"\n :progress=\"item.progress\"\n /><span class=\"sr-only\"\n >{{ descriptions[item.status ?? \"pending\"] }}:\n </span>\n <span\n :class=\"\n cn(\n 'min-w-0 flex-1 truncate text-sm leading-5',\n tones[item.status ?? 'pending'],\n )\n \"\n ><span class=\"relative inline-block max-w-full\"\n ><RenderNode :node=\"item.title\" /><motion.span\n aria-hidden=\"true\"\n :initial=\"false\"\n :animate=\"{\n scaleX: item.status === 'completed' ? 1 : 0,\n opacity: item.status === 'completed' ? 1 : 0,\n }\"\n :transition=\"\n reduced\n ? { duration: 0 }\n : { duration: 0.28, ease: EASE_OUT, delay: 0.06 }\n \"\n class=\"absolute inset-x-0 top-1/2 h-px origin-left bg-current\" /></span\n ></span>\n <span\n v-if=\"item.detail\"\n class=\"shrink-0 text-sm text-muted-foreground/55\"\n ><RenderNode :node=\"item.detail\"\n /></span>\n </motion.li>\n </AnimatePresence>\n </ol>\n <p v-else class=\"px-1.5 py-2 text-sm text-muted-foreground\">\n No tasks yet\n </p>\n </div>\n </AgentDisclosure>\n </section>\n</template>\n"
523
+ },
524
+ {
525
+ "path": "registry/orvui/agents/todo-list/src/TodoStatusIcon.vue",
526
+ "target": "~/src/components/orvui/agents/todo-list/src/TodoStatusIcon.vue",
527
+ "type": "registry:component",
528
+ "content": "<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { motion } from \"motion-v\";\nimport { cn } from \"../../../lib/utils\";\nimport { EASE_OUT, SPRING_LAYOUT } from \"../../../lib/ease\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nimport type { TodoItemStatus } from \"./TodoList.vue\";\nconst props = defineProps<{ status: TodoItemStatus; progress?: number }>();\nconst reduced = useReducedMotion();\nconst advancing = computed(() => props.status === \"in-progress\");\nconst indeterminate = computed(\n () => advancing.value && props.progress === undefined && !reduced.value,\n);\nconst fraction = computed(() =>\n props.progress === undefined\n ? 0.68\n : Math.max(0, Math.min(100, props.progress)) / 100,\n);\nconst strokeThrough = (points: readonly (readonly [number, number])[]) =>\n points.map(([x, y], index) => `${index ? \"L\" : \"M\"}${x} ${y}`).join(\"\");\n// Own normalized status marks, independent of the earlier copied path strings.\nconst marks = [\n {\n state: \"completed\",\n path: strokeThrough([\n [7.8, 12],\n [10.7, 15],\n [16.4, 9.3],\n ]),\n duration: 0.24,\n },\n {\n state: \"cancelled\",\n path:\n strokeThrough([\n [8.8, 8.8],\n [15.2, 15.2],\n ]) +\n strokeThrough([\n [15.2, 8.8],\n [8.8, 15.2],\n ]),\n duration: 0.2,\n },\n];\n</script>\n<template>\n <motion.svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n :initial=\"false\"\n :class=\"\n cn(\n 'mx-0.5 size-5 shrink-0 overflow-visible text-muted-foreground',\n advancing && 'text-foreground',\n status === 'cancelled' && 'text-rose-600 dark:text-rose-400',\n )\n \"\n >\n <motion.circle\n cx=\"12\"\n cy=\"12\"\n r=\"9\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n :stroke-width=\"1.5\"\n :stroke-dasharray=\"status === 'pending' ? '2 3' : undefined\"\n stroke-linecap=\"round\"\n :initial=\"false\"\n :animate=\"{ fillOpacity: status === 'completed' ? 0.06 : 0 }\"\n :transition=\"\n reduced ? { duration: 0 } : { duration: 0.18, ease: EASE_OUT }\n \"\n :class=\"advancing && 'opacity-20'\"\n />\n <motion.circle\n cx=\"12\"\n cy=\"12\"\n r=\"9\"\n pathLength=\"1\"\n fill=\"none\"\n stroke=\"currentColor\"\n :stroke-width=\"2\"\n stroke-linecap=\"round\"\n :initial=\"false\"\n :animate=\"{\n pathLength: advancing ? fraction : 0,\n opacity: Number(advancing),\n rotate: indeterminate ? 360 : -90,\n }\"\n :transition=\"\n indeterminate\n ? { rotate: { duration: 1.1, repeat: Infinity, ease: 'linear' } }\n : reduced\n ? { duration: 0 }\n : SPRING_LAYOUT\n \"\n :style=\"{ transformOrigin: '12px 12px' }\"\n />\n <motion.path\n v-for=\"mark in marks\"\n :key=\"mark.state\"\n :d=\"mark.path\"\n fill=\"none\"\n stroke=\"currentColor\"\n :stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n :initial=\"false\"\n :animate=\"{\n pathLength: Number(status === mark.state),\n opacity: Number(status === mark.state),\n }\"\n :transition=\"\n reduced ? { duration: 0 } : { duration: mark.duration, ease: EASE_OUT }\n \"\n />\n </motion.svg>\n</template>\n"
529
+ },
530
+ {
531
+ "path": "registry/orvui/agents/tool-approval/index.ts",
532
+ "target": "~/src/components/orvui/agents/tool-approval/index.ts",
533
+ "type": "registry:lib",
534
+ "content": "export { default as ToolApproval } from \"./src/ToolApproval.vue\";\nexport { default as ToolApprovalCode } from \"./src/ToolApprovalCode.vue\";\nexport type {\n ToolApprovalStatus,\n ToolApprovalParameter,\n} from \"./src/ToolApproval.vue\";\n\nexport type * from \"./src/api-types\";\n"
535
+ },
536
+ {
537
+ "path": "registry/orvui/agents/tool-approval/src/api-types.ts",
538
+ "target": "~/src/components/orvui/agents/tool-approval/src/api-types.ts",
539
+ "type": "registry:lib",
540
+ "content": "// Vue public prop types, derived from the actual components.\nexport type ToolApprovalCodeProps = InstanceType<\n (typeof import(\"./ToolApprovalCode.vue\"))[\"default\"]\n>[\"$props\"];\nexport type ToolApprovalProps = InstanceType<\n (typeof import(\"./ToolApproval.vue\"))[\"default\"]\n>[\"$props\"];\n"
541
+ },
542
+ {
543
+ "path": "registry/orvui/agents/tool-approval/src/ToolApproval.vue",
544
+ "target": "~/src/components/orvui/agents/tool-approval/src/ToolApproval.vue",
545
+ "type": "registry:component",
546
+ "content": "<script setup lang=\"ts\">\nimport { computed, getCurrentInstance, useId, watch } from \"vue\";\nimport { AnimatePresence, motion } from \"motion-v\";\nimport {\n Check,\n ChevronDown,\n CircleAlert,\n LoaderCircle,\n ShieldCheck,\n X,\n} from \"lucide-vue-next\";\nimport { cn } from \"../../../lib/utils\";\nimport { EASE_OUT, SPRING_PRESS, SPRING_SWAP } from \"../../../lib/ease\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nimport { RenderNode, useControllable, type Content } from \"../../shared\";\nimport AgentDisclosure from \"../../AgentDisclosure.vue\";\nexport type ToolApprovalStatus =\n | \"pending\"\n | \"approving\"\n | \"approved\"\n | \"denied\"\n | \"running\"\n | \"complete\"\n | \"error\";\nexport interface ToolApprovalParameter {\n id: string;\n label: Content;\n value: Content;\n}\nconst props = withDefaults(\n defineProps<{\n tool: Content;\n title?: Content;\n description?: Content;\n parameters?: ToolApprovalParameter[];\n status?: ToolApprovalStatus;\n open?: boolean;\n defaultOpen?: boolean;\n }>(),\n {\n open: undefined,\n title: \"Allow this tool to run?\",\n parameters: () => [],\n status: \"pending\",\n defaultOpen: false,\n },\n);\nconst emit = defineEmits<{\n \"update:open\": [open: boolean];\n openChange: [open: boolean];\n approve: [];\n alwaysAllow: [];\n deny: [];\n}>();\nconst expanded = useControllable(\n () => props.open,\n props.defaultOpen,\n (value) => {\n emit(\"update:open\", value);\n emit(\"openChange\", value);\n },\n);\nconst identity = useId();\nconst instance = getCurrentInstance();\nconst reduced = useReducedMotion();\nconst busy = computed(() => [\"approving\", \"running\"].includes(props.status));\nconst successful = computed(() =>\n [\"approved\", \"complete\"].includes(props.status),\n);\nconst label = computed(\n () =>\n ({\n pending: \"Approval required\",\n approving: \"Approving\",\n approved: \"Approved\",\n denied: \"Denied\",\n running: \"Running\",\n complete: \"Completed\",\n error: \"Failed\",\n })[props.status],\n);\nconst tone = computed(() =>\n props.status === \"pending\"\n ? \"amber\"\n : busy.value\n ? \"blue\"\n : successful.value\n ? \"emerald\"\n : \"rose\",\n);\nconst badgeClasses = {\n amber:\n \"border-amber-500/30 bg-amber-500/10 text-amber-600 dark:text-amber-400\",\n blue: \"border-blue-500/30 bg-blue-500/10 text-blue-600 dark:text-blue-400\",\n emerald:\n \"border-emerald-500/30 bg-emerald-500/10 text-emerald-600 dark:text-emerald-400\",\n rose: \"border-rose-500/30 bg-rose-500/10 text-rose-600 dark:text-rose-400\",\n};\nconst hasAlways = () => !!instance?.vnode.props?.onAlwaysAllow;\nwatch(\n () => props.status,\n (value, previous) => {\n if (previous === \"pending\" && value !== previous) expanded.value = false;\n },\n);\n</script>\n<template>\n <div\n :data-state=\"status\"\n :aria-busy=\"busy\"\n class=\"w-full overflow-hidden rounded-2xl border border-border/80 bg-muted/20 text-sm\"\n >\n <div class=\"flex items-start gap-3 p-4\">\n <span\n aria-hidden=\"true\"\n :class=\"\n cn(\n 'mt-0.5 grid size-8 shrink-0 place-items-center rounded-xl border border-border/60 bg-background text-muted-foreground',\n status === 'error' && 'text-destructive',\n )\n \"\n >\n <LoaderCircle\n v-if=\"busy\"\n :class=\"cn('size-4', !reduced && 'animate-spin')\"\n /><CircleAlert v-else-if=\"status === 'error'\" class=\"size-4\" /><X\n v-else-if=\"status === 'denied'\"\n class=\"size-4\"\n /><Check v-else-if=\"successful\" class=\"size-4\" /><ShieldCheck\n v-else\n class=\"size-4\"\n />\n </span>\n <div class=\"min-w-0 flex-1\">\n <div class=\"flex min-w-0 items-start justify-between gap-3\">\n <div class=\"min-w-0\">\n <div class=\"font-medium text-foreground\">\n <RenderNode :node=\"title\" />\n </div>\n <div\n class=\"mt-0.5 truncate font-mono text-xs text-muted-foreground\"\n >\n <RenderNode :node=\"tool\" />\n </div>\n </div>\n <span\n :class=\"\n cn(\n 'shrink-0 rounded-full border px-2 py-0.5 text-[11px] font-medium transition-colors',\n badgeClasses[tone],\n )\n \"\n >{{ label }}</span\n >\n </div>\n <p v-if=\"description\" class=\"mt-2 leading-5 text-muted-foreground\">\n <RenderNode :node=\"description\" />\n </p>\n <button\n v-if=\"parameters.length\"\n type=\"button\"\n :aria-expanded=\"expanded\"\n :aria-controls=\"`${identity}-details`\"\n @click=\"expanded = !expanded\"\n class=\"mt-2 inline-flex items-center gap-1 rounded-md text-xs font-medium text-muted-foreground outline-none transition-colors hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring\"\n >\n View details<motion.span\n aria-hidden=\"true\"\n :animate=\"{ rotate: expanded ? 180 : 0 }\"\n :transition=\"reduced ? { duration: 0 } : SPRING_SWAP\"\n ><ChevronDown class=\"size-3.5\"\n /></motion.span>\n </button>\n </div>\n </div>\n <AgentDisclosure :id=\"`${identity}-details`\" :open=\"expanded\"\n ><dl\n class=\"mx-4 mb-4 grid gap-2 rounded-xl border border-border/50 bg-background/70 p-3\"\n >\n <div\n v-for=\"parameter in parameters\"\n :key=\"parameter.id\"\n class=\"grid grid-cols-[minmax(0,7rem)_minmax(0,1fr)] items-center gap-3 text-xs\"\n >\n <dt class=\"text-muted-foreground\">\n <RenderNode :node=\"parameter.label\" />\n </dt>\n <dd class=\"min-w-0 break-words font-mono text-foreground/85\">\n <RenderNode :node=\"parameter.value\" />\n </dd>\n </div>\n </dl>\n <slot\n /></AgentDisclosure>\n <AnimatePresence :initial=\"false\"\n ><motion.div\n v-if=\"status === 'pending'\"\n :initial=\"reduced ? { opacity: 0 } : { opacity: 0, y: 4 }\"\n :animate=\"{ opacity: 1, y: 0 }\"\n :exit=\"{ opacity: 0 }\"\n :transition=\"{ duration: reduced ? 0.12 : 0.22, ease: EASE_OUT }\"\n class=\"flex flex-wrap items-center gap-2 border-t border-border/60 px-4 py-3\"\n >\n <motion.button\n type=\"button\"\n @click=\"emit('approve')\"\n :while-press=\"reduced ? undefined : { scale: 0.97 }\"\n :transition=\"SPRING_PRESS\"\n class=\"rounded-xl bg-foreground px-3 py-1.5 text-xs font-medium text-background outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n >Allow once</motion.button\n >\n <motion.button\n v-if=\"hasAlways()\"\n type=\"button\"\n @click=\"emit('alwaysAllow')\"\n :while-press=\"reduced ? undefined : { scale: 0.97 }\"\n :transition=\"SPRING_PRESS\"\n class=\"rounded-xl border border-border/60 bg-background px-3 py-1.5 text-xs font-medium text-foreground outline-none transition-colors hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring\"\n >Always allow</motion.button\n >\n <button\n type=\"button\"\n @click=\"emit('deny')\"\n class=\"rounded-xl px-3 py-1.5 text-xs font-medium text-muted-foreground outline-none transition-colors hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring\"\n >\n Deny\n </button>\n </motion.div></AnimatePresence\n >\n </div>\n</template>\n"
547
+ },
548
+ {
549
+ "path": "registry/orvui/agents/tool-approval/src/ToolApprovalCode.vue",
550
+ "target": "~/src/components/orvui/agents/tool-approval/src/ToolApprovalCode.vue",
551
+ "type": "registry:component",
552
+ "content": "<script setup lang=\"ts\">\nimport { AgentCode, type AgentCodeLanguage } from \"../../code-block\";\nconst props = withDefaults(\n defineProps<{ code: string; language?: AgentCodeLanguage }>(),\n { language: \"bash\" },\n);\n</script>\n<template>\n <AgentCode\n :code=\"props.code\"\n :language=\"props.language\"\n class=\"whitespace-pre-wrap break-words rounded-lg border border-border/50 bg-muted/30 px-2.5 py-2\"\n />\n</template>\n"
553
+ },
554
+ {
555
+ "path": "registry/orvui/agents/tool-result/index.ts",
556
+ "target": "~/src/components/orvui/agents/tool-result/index.ts",
557
+ "type": "registry:lib",
558
+ "content": "export { default as ToolResult } from \"./src/ToolResult.vue\";\nexport { default as ToolResultOutput } from \"./src/ToolResultOutput.vue\";\nexport type { ToolResultStatus, ToolResultKind } from \"./src/ToolResult.vue\";\n\nexport type * from \"./src/api-types\";\n"
559
+ },
560
+ {
561
+ "path": "registry/orvui/agents/tool-result/src/api-types.ts",
562
+ "target": "~/src/components/orvui/agents/tool-result/src/api-types.ts",
563
+ "type": "registry:lib",
564
+ "content": "// Vue public prop types, derived from the actual components.\nexport type ToolResultOutputProps = InstanceType<\n (typeof import(\"./ToolResultOutput.vue\"))[\"default\"]\n>[\"$props\"];\nexport type ToolResultProps = InstanceType<\n (typeof import(\"./ToolResult.vue\"))[\"default\"]\n>[\"$props\"];\n"
565
+ },
566
+ {
567
+ "path": "registry/orvui/agents/tool-result/src/ToolResult.vue",
568
+ "target": "~/src/components/orvui/agents/tool-result/src/ToolResult.vue",
569
+ "type": "registry:component",
570
+ "content": "<script setup lang=\"ts\">\nimport {\n computed,\n getCurrentInstance,\n onUpdated,\n ref,\n useId,\n watch,\n} from \"vue\";\nimport { motion } from \"motion-v\";\nimport {\n Ban,\n Braces,\n Check,\n ChevronDown,\n CircleCheck,\n CircleX,\n Copy,\n LoaderCircle,\n RotateCcw,\n SquareTerminal,\n Wrench,\n} from \"lucide-vue-next\";\nimport { cn } from \"../../../lib/utils\";\nimport { SPRING_PRESS, SPRING_SWAP } from \"../../../lib/ease\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nimport { ActionSwapRollText } from \"../../../motion/action-swap\";\nimport {\n RenderNode,\n useClipboard,\n useControllable,\n type Content,\n} from \"../../shared\";\nimport { useStreamFollow } from \"../../stream-follow\";\nimport AgentDisclosure from \"../../AgentDisclosure.vue\";\nexport type ToolResultStatus = \"running\" | \"success\" | \"error\" | \"cancelled\";\nexport type ToolResultKind = \"terminal\" | \"request\" | \"custom\";\nconst props = withDefaults(\n defineProps<{\n tool: Content;\n title: Content;\n status?: ToolResultStatus;\n kind?: ToolResultKind;\n meta?: Content;\n icon?: Content;\n open?: boolean;\n defaultOpen?: boolean;\n collapseOnComplete?: boolean;\n maxHeight?: number;\n copyText?: string;\n onCopy?: () => void | Promise<void>;\n contentClassName?: string;\n }>(),\n {\n open: undefined,\n status: \"running\",\n kind: \"custom\",\n defaultOpen: true,\n collapseOnComplete: true,\n maxHeight: 220,\n },\n);\nconst emit = defineEmits<{\n \"update:open\": [open: boolean];\n openChange: [open: boolean];\n retry: [];\n}>();\nconst expanded = useControllable(\n () => props.open,\n props.defaultOpen,\n (value) => {\n emit(\"update:open\", value);\n emit(\"openChange\", value);\n },\n);\nconst { copy, copied } = useClipboard(\n () => props.copyText ?? \"\",\n () =>\n props.onCopy\n ? props.onCopy()\n : navigator.clipboard.writeText(props.copyText ?? \"\"),\n);\nconst reduced = useReducedMotion();\nconst identity = useId();\nconst instance = getCurrentInstance();\nconst viewport = ref<HTMLElement>();\nconst hasRetry = () => !!instance?.vnode.props?.onRetry;\nconst state = computed(\n () =>\n ({\n running: {\n label: \"Running\",\n classes: \"text-blue-600 dark:text-blue-400\",\n icon: LoaderCircle,\n },\n success: {\n label: \"Completed\",\n classes: \"text-emerald-600 dark:text-emerald-400\",\n icon: CircleCheck,\n },\n error: {\n label: \"Failed\",\n classes: \"text-rose-600 dark:text-rose-400\",\n icon: CircleX,\n },\n cancelled: {\n label: \"Cancelled\",\n classes: \"text-muted-foreground\",\n icon: Ban,\n },\n })[props.status],\n);\nconst kindIcon = computed(\n () =>\n ({ terminal: SquareTerminal, request: Braces, custom: Wrench })[props.kind],\n);\nconst valueKey = (value: Content, suffix: string) =>\n typeof value === \"string\" || typeof value === \"number\"\n ? String(value)\n : props.status + suffix;\nwatch(\n () => props.status,\n (value, previous) => {\n if (value === \"running\" && previous !== value) expanded.value = true;\n else if (previous === \"running\" && props.collapseOnComplete)\n expanded.value = false;\n },\n);\nconst follow = useStreamFollow(\n viewport,\n () => expanded.value && props.status === \"running\",\n reduced,\n [expanded, () => props.status],\n);\nonUpdated(follow);\n</script>\n<template>\n <div\n :data-state=\"status\"\n :aria-busy=\"status === 'running'\"\n class=\"w-full text-sm\"\n >\n <button\n :id=\"`${identity}-trigger`\"\n type=\"button\"\n :aria-expanded=\"expanded\"\n :aria-controls=\"`${identity}-content`\"\n @click=\"expanded = !expanded\"\n class=\"group flex min-h-9 w-full items-center gap-2 rounded-md py-1 text-left outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n >\n <span\n aria-hidden=\"true\"\n class=\"grid size-4 shrink-0 place-items-center text-muted-foreground\"\n ><RenderNode v-if=\"icon\" :node=\"icon\" /><component\n v-else\n :is=\"kindIcon\"\n class=\"size-4\"\n /></span>\n <span class=\"flex min-w-0 flex-1 items-baseline gap-2\"\n ><span class=\"min-w-0 truncate font-medium text-foreground/90\"\n ><ActionSwapRollText :value=\"valueKey(title, '')\"\n ><RenderNode :node=\"title\" /></ActionSwapRollText></span\n ><span v-if=\"meta\" class=\"shrink-0 text-xs text-muted-foreground/60\"\n ><ActionSwapRollText :value=\"valueKey(meta, '-meta')\"\n ><RenderNode :node=\"meta\" /></ActionSwapRollText></span\n ><span\n class=\"min-w-0 truncate font-mono text-[11px] text-muted-foreground/55\"\n ><ActionSwapRollText :value=\"valueKey(tool, '-tool')\"\n ><RenderNode :node=\"tool\" /></ActionSwapRollText></span\n ></span>\n <span\n :class=\"\n cn(\n 'inline-flex shrink-0 items-center gap-1 text-[11px] font-medium',\n state.classes,\n )\n \"\n ><component\n :is=\"state.icon\"\n :class=\"\n cn('size-3', status === 'running' && !reduced && 'animate-spin')\n \"\n /><ActionSwapRollText :value=\"status\">{{\n state.label\n }}</ActionSwapRollText></span\n >\n <motion.span\n aria-hidden=\"true\"\n class=\"shrink-0 text-muted-foreground/70 transition-colors group-hover:text-muted-foreground\"\n :animate=\"{ rotate: expanded ? 180 : 0 }\"\n :transition=\"reduced ? { duration: 0 } : SPRING_SWAP\"\n ><ChevronDown class=\"size-3.5\"\n /></motion.span>\n </button>\n <AgentDisclosure\n :id=\"`${identity}-content`\"\n role=\"region\"\n :aria-labelledby=\"`${identity}-trigger`\"\n :open=\"expanded\"\n ><div class=\"pl-6 pt-1.5\">\n <div class=\"overflow-hidden rounded-xl bg-muted/80\">\n <div\n ref=\"viewport\"\n role=\"log\"\n aria-live=\"polite\"\n class=\"scrollbar-hide overflow-y-auto\"\n :style=\"{ maxHeight: `${maxHeight}px` }\"\n >\n <div :class=\"cn('p-3', contentClassName)\"><slot /></div>\n </div>\n <div\n v-if=\"copyText || onCopy || hasRetry()\"\n class=\"flex items-center gap-0.5 px-2 pb-1.5\"\n >\n <motion.button\n v-if=\"copyText || onCopy\"\n type=\"button\"\n :aria-label=\"copied ? 'Copied' : 'Copy result'\"\n :title=\"copied ? 'Copied' : 'Copy result'\"\n @click=\"copy\"\n :while-press=\"reduced ? undefined : { scale: 0.9 }\"\n :transition=\"SPRING_PRESS\"\n class=\"grid size-7 place-items-center rounded-md text-muted-foreground outline-none transition-colors hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring\"\n ><Check v-if=\"copied\" class=\"size-3.5\" /><Copy\n v-else\n class=\"size-3.5\"\n /></motion.button>\n <motion.button\n v-if=\"hasRetry()\"\n type=\"button\"\n aria-label=\"Run again\"\n title=\"Run again\"\n @click=\"emit('retry')\"\n :while-press=\"reduced ? undefined : { scale: 0.9 }\"\n :transition=\"SPRING_PRESS\"\n class=\"grid size-7 place-items-center rounded-md text-muted-foreground outline-none transition-colors hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring\"\n ><RotateCcw class=\"size-3.5\"\n /></motion.button>\n <span class=\"ml-auto text-[11px] text-muted-foreground/55\"\n ><ActionSwapRollText :value=\"status\">{{\n state.label\n }}</ActionSwapRollText></span\n >\n </div>\n </div>\n </div></AgentDisclosure\n >\n </div>\n</template>\n"
571
+ },
572
+ {
573
+ "path": "registry/orvui/agents/tool-result/src/ToolResultOutput.vue",
574
+ "target": "~/src/components/orvui/agents/tool-result/src/ToolResultOutput.vue",
575
+ "type": "registry:component",
576
+ "content": "<script setup lang=\"ts\">\nimport { computed, useSlots } from \"vue\";\nimport AgentCode, { type AgentCodeLanguage } from \"../../code-block/src/AgentCode.vue\";\nconst props = withDefaults(\n defineProps<{ code?: string; language?: AgentCodeLanguage }>(),\n { language: \"bash\" },\n);\nconst slots = useSlots();\nconst value = computed(\n () =>\n props.code ??\n (slots.default?.() ?? []).reduce(\n (text, node) =>\n text + (typeof node.children === \"string\" ? node.children : \"\"),\n \"\",\n ),\n);\n</script>\n<template>\n <AgentCode\n :code=\"value\"\n :language=\"language\"\n class=\"whitespace-pre-wrap break-words text-foreground/80\"\n />\n</template>\n"
577
+ },
578
+ {
579
+ "path": "registry/orvui/blocks/dismiss.ts",
580
+ "target": "~/src/components/orvui/blocks/dismiss.ts",
581
+ "type": "registry:lib",
582
+ "content": "import { onMounted, onUnmounted, watch, type Ref } from \"vue\";\nimport { resolveElement, useFloatingLayer } from \"../lib/composables\";\n\ntype HitTest = (target: Element) => boolean;\nconst openScopes = new Set<HitTest>();\n\nexport function useBlockDismiss(\n open: Ref<boolean>,\n root: Ref<unknown>,\n close: () => void,\n consume = false,\n) {\n const layer = useFloatingLayer(open, root);\n const pendingClicks = new Set<() => void>();\n let stopWatching: (() => void) | undefined;\n function interceptActivation(source: Event) {\n const release = () => {\n window.removeEventListener(\"click\", click, true);\n window.removeEventListener(\"pointerdown\", replacement, true);\n window.removeEventListener(\"pointercancel\", replacement, true);\n window.removeEventListener(\"keydown\", release, true);\n pendingClicks.delete(release);\n };\n function click(event: MouseEvent) {\n event.preventDefault();\n event.stopPropagation();\n release();\n }\n function replacement(event: Event) {\n if (event !== source) release();\n }\n pendingClicks.add(release);\n window.addEventListener(\"click\", click, true);\n window.addEventListener(\"pointerdown\", replacement, true);\n window.addEventListener(\"pointercancel\", replacement, true);\n window.addEventListener(\"keydown\", release, true);\n }\n onMounted(() => {\n stopWatching = watch(\n open,\n (visible, _, cleanup) => {\n if (!visible) return;\n const contains: HitTest = (target) =>\n resolveElement<HTMLElement>(root.value)?.contains(target) ?? false;\n const keydown = (event: KeyboardEvent) => {\n if (layer.claimEscape(event)) close();\n };\n const pointerdown = (event: PointerEvent) => {\n const target = event.target;\n if (\n !(target instanceof Element) ||\n contains(target) ||\n layer.containsHigher(target)\n )\n return;\n let anotherScope = false;\n if (consume)\n for (const hit of openScopes)\n if (hit !== contains && hit(target)) {\n anotherScope = true;\n break;\n }\n if (consume && !anotherScope) interceptActivation(event);\n close();\n };\n openScopes.add(contains);\n window.addEventListener(\"keydown\", keydown);\n window.addEventListener(\"pointerdown\", pointerdown, true);\n cleanup(() => {\n openScopes.delete(contains);\n window.removeEventListener(\"keydown\", keydown);\n window.removeEventListener(\"pointerdown\", pointerdown, true);\n });\n },\n { immediate: true },\n );\n });\n onUnmounted(() => {\n stopWatching?.();\n for (const release of pendingClicks) release();\n });\n return layer;\n}\n"
583
+ },
584
+ {
585
+ "path": "registry/orvui/blocks/shared.ts",
586
+ "target": "~/src/components/orvui/blocks/shared.ts",
587
+ "type": "registry:lib",
588
+ "content": "import { useBlockDismiss } from \"./dismiss\";\nimport { resolveElement, useOverlay } from \"../lib/composables\";\nimport {\n computed,\n defineComponent,\n h,\n isVNode,\n onMounted,\n onUnmounted,\n ref,\n type Component,\n type Ref,\n type VNodeChild,\n} from \"vue\";\n\nexport type Content = VNodeChild | Component;\nexport const RenderNode = defineComponent({\n props: [\"node\"],\n setup(props) {\n return () => {\n const node = props.node;\n if (isVNode(node) || node === null || node === undefined) return node;\n if (typeof node === \"function\" || typeof node === \"object\")\n return h(node as Component);\n return node;\n };\n },\n});\n\nexport function useControllable<T>(\n get: () => T | undefined,\n initial: T,\n emit: (value: T) => void,\n) {\n const saved = ref(initial) as Ref<T>;\n return computed<T>({\n get() {\n const value = get();\n return value === undefined ? saved.value : value;\n },\n set(value) {\n if (get() === undefined) saved.value = value;\n emit(value);\n },\n });\n}\n\nexport function useOutside(\n root: Ref<HTMLElement | undefined>,\n close: () => void,\n open: Ref<boolean>,\n) {\n useBlockDismiss(open, root, close);\n}\n\nexport function useReduced() {\n const reduced = ref(false);\n let detach: (() => void) | undefined;\n onMounted(() => {\n if (typeof matchMedia !== \"function\") return;\n const query = matchMedia(\"(prefers-reduced-motion: reduce)\");\n const read = () => {\n reduced.value = query.matches;\n };\n read();\n query.addEventListener(\"change\", read);\n detach = () => query.removeEventListener(\"change\", read);\n });\n onUnmounted(() => detach?.());\n return reduced;\n}\n\nexport function rove(\n event: KeyboardEvent,\n root: HTMLElement,\n selector = \"button:not(:disabled)\",\n) {\n const items = [...root.querySelectorAll<HTMLElement>(selector)];\n if (!items.length) return;\n const current = items.indexOf(\n root.ownerDocument.activeElement as HTMLElement,\n );\n let destination: number;\n switch (event.key) {\n case \"ArrowRight\":\n case \"ArrowDown\":\n destination = (current + 1) % items.length;\n break;\n case \"ArrowLeft\":\n case \"ArrowUp\":\n destination = (current - 1 + items.length) % items.length;\n break;\n case \"Home\":\n destination = 0;\n break;\n case \"End\":\n destination = items.length - 1;\n break;\n default:\n return;\n }\n event.preventDefault();\n items[destination]?.focus();\n}\n\nexport function useDialog(\n open: Ref<boolean>,\n root: Ref<HTMLElement | undefined>,\n initial?: () => HTMLElement | undefined,\n) {\n const element = computed(() => resolveElement<HTMLElement>(root.value));\n useOverlay(\n open,\n element,\n () => {\n open.value = false;\n },\n initial,\n );\n}\n"
589
+ },
590
+ {
591
+ "path": "registry/orvui/lib/composables.ts",
592
+ "target": "~/src/components/orvui/lib/composables.ts",
593
+ "type": "registry:lib",
594
+ "content": "import { computed, getCurrentInstance, nextTick, onBeforeUnmount, onMounted, ref, watch, type Ref } from \"vue\";\nimport { layerManager, type Layer } from \"./layers\";\n\nexport function useControllable<T>(props: Record<string, any>, key: string, emit: (...args: any[]) => void, fallback: T) {\n const local = ref<T>(fallback) as Ref<T>;\n const read = () => props[key] as T | undefined;\n return computed<T>({\n get() { const supplied = read(); return supplied === undefined ? local.value : supplied; },\n set(value) { if (read() === undefined) local.value = value; emit(`update:${key}`, value); },\n });\n}\n\nexport function useMediaQuery(query: string) {\n const matches = ref(false);\n let disconnect: (() => void) | undefined;\n onMounted(() => {\n if (typeof window.matchMedia !== \"function\") return;\n const media = window.matchMedia(query);\n const update = () => { matches.value = media.matches; };\n update();\n media.addEventListener?.(\"change\", update);\n disconnect = () => media.removeEventListener?.(\"change\", update);\n });\n onBeforeUnmount(() => disconnect?.());\n return matches;\n}\nexport function useReducedMotion() { return useMediaQuery(\"(prefers-reduced-motion: reduce)\"); }\n\nconst lockedProperties = [\"overflow\", \"position\", \"top\", \"left\", \"right\", \"width\"] as const;\nlet scrollOwners = 0;\nlet unlockPage: (() => void) | undefined;\nfunction acquirePage() {\n if (scrollOwners++ === 0) {\n const body = document.body.style;\n const saved = lockedProperties.map(name => ({ name, value: body.getPropertyValue(name), priority: body.getPropertyPriority(name) }));\n const x = window.scrollX, y = window.scrollY;\n body.setProperty(\"overflow\", \"hidden\");\n body.setProperty(\"position\", \"fixed\");\n body.setProperty(\"left\", `${-x}px`);\n body.setProperty(\"top\", `${-y}px`);\n body.setProperty(\"right\", \"0px\");\n body.setProperty(\"width\", \"100%\");\n unlockPage = () => {\n for (const entry of saved) {\n if (entry.value) body.setProperty(entry.name, entry.value, entry.priority);\n else body.removeProperty(entry.name);\n }\n const root = document.documentElement.style;\n const behavior = root.getPropertyValue(\"scroll-behavior\");\n const priority = root.getPropertyPriority(\"scroll-behavior\");\n root.setProperty(\"scroll-behavior\", \"auto\");\n window.scrollTo(x, y);\n if (behavior) root.setProperty(\"scroll-behavior\", behavior, priority);\n else root.removeProperty(\"scroll-behavior\");\n };\n }\n let released = false;\n return () => {\n if (released) return;\n released = true;\n if (--scrollOwners === 0) { unlockPage?.(); unlockPage = undefined; }\n };\n}\nexport function useScrollLock(locked: Ref<boolean>) {\n let mounted = false;\n let release: (() => void) | undefined;\n const update = (value: boolean) => {\n if (!mounted) return;\n if (value && !release) release = acquirePage();\n if (!value && release) { release(); release = undefined; }\n };\n onMounted(() => { mounted = true; update(locked.value); });\n watch(locked, update);\n onBeforeUnmount(() => { release?.(); release = undefined; mounted = false; });\n}\n\nexport function resolveElement<T extends Element = HTMLElement>(value: unknown): T | null {\n if (!value) return null;\n const unwrapped = (value as { $el?: unknown }).$el ?? value;\n return typeof (unwrapped as Element).nodeType === \"number\" && (unwrapped as Element).nodeType === 1 ? unwrapped as T : null;\n}\nconst focusable = 'a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])';\nfunction createLayer(modal: boolean, panel?: { readonly value: unknown }): Layer {\n return { key: Symbol(\"orvui-layer\"), modal, owner: getCurrentInstance(), surface: () => resolveElement(panel?.value), returnTo: null };\n}\nexport function useOverlay(open: Ref<boolean>, panel: Ref<HTMLElement | null>, close: () => void, initialFocus?: () => HTMLElement | undefined) {\n const layer = createLayer(true, panel);\n let mounted = false;\n let revision = 0;\n const sync = async (value: boolean) => {\n const current = ++revision;\n if (!mounted) return;\n if (!value) { layerManager.detach(layer, true); return; }\n if (!layerManager.attach(layer)) return;\n await nextTick();\n if (!mounted || current !== revision || !open.value || !layerManager.top(layer)) return;\n (initialFocus?.() ?? layer.surface()?.querySelector<HTMLElement>(focusable) ?? layer.surface())?.focus({ preventScroll: true });\n };\n const onKey = (event: KeyboardEvent) => {\n if (event.defaultPrevented || !open.value) return;\n if (event.key === \"Escape\" && layerManager.top(layer)) {\n event.preventDefault(); event.stopPropagation(); close(); return;\n }\n if (event.key !== \"Tab\" || !layerManager.modal(layer)) return;\n const candidates = new Set<HTMLElement>();\n for (const surface of layerManager.scopes(layer)) {\n for (const node of surface.querySelectorAll<HTMLElement>(focusable)) {\n if (node.getClientRects().length > 0 && !node.closest(\"[inert]\")) candidates.add(node);\n }\n }\n event.preventDefault();\n const nodes = [...candidates];\n if (!nodes.length) { layer.surface()?.focus(); return; }\n const position = nodes.indexOf(document.activeElement as HTMLElement);\n const next = position < 0 ? (event.shiftKey ? nodes.length - 1 : 0) : (position + (event.shiftKey ? -1 : 1) + nodes.length) % nodes.length;\n nodes[next].focus();\n };\n useScrollLock(open);\n onMounted(() => { mounted = true; document.addEventListener(\"keydown\", onKey); void sync(open.value); });\n watch(open, value => void sync(value));\n onBeforeUnmount(() => { mounted = false; revision++; document.removeEventListener(\"keydown\", onKey); layerManager.detach(layer, true); });\n return {\n isTop: () => open.value && layerManager.top(layer),\n containsHigher: (target: EventTarget | null) => layerManager.higher(layer, target),\n containsOwnedPortal: (target: HTMLElement) => layerManager.containsPortal(layer.owner, target),\n };\n}\nexport function useFloatingLayer(open: Ref<boolean>, panel?: { readonly value: unknown }) {\n const layer = createLayer(false, panel);\n let mounted = false;\n let unregister: (() => void) | undefined;\n const sync = (value: boolean) => {\n if (!mounted) return;\n if (value) layerManager.attach(layer); else layerManager.detach(layer, false);\n };\n onMounted(() => { mounted = true; unregister = layerManager.portal(layer.owner, layer.surface); sync(open.value); });\n watch(open, sync, { flush: \"sync\" });\n onBeforeUnmount(() => { mounted = false; unregister?.(); layerManager.detach(layer, false); });\n const isTop = () => open.value && layerManager.top(layer);\n return {\n isTop,\n claimEscape(event: KeyboardEvent) {\n if (event.key !== \"Escape\" || event.defaultPrevented || !isTop()) return false;\n event.preventDefault(); event.stopImmediatePropagation(); return true;\n },\n containsHigher: (target: EventTarget | null) => layerManager.higher(layer, target),\n };\n}\nexport function useEventListener(target: () => EventTarget | null | undefined, event: string, handler: EventListener, options?: AddEventListenerOptions) {\n let remove: (() => void) | undefined;\n onMounted(() => { const element = target(); element?.addEventListener(event, handler, options); remove = () => element?.removeEventListener(event, handler, options); });\n onBeforeUnmount(() => remove?.());\n}\n"
595
+ },
596
+ {
597
+ "path": "registry/orvui/lib/ease.ts",
598
+ "target": "~/src/components/orvui/lib/ease.ts",
599
+ "type": "registry:lib",
600
+ "content": "export const EASE_OUT = [0.16, 1, 0.3, 1] as const;\nexport const EASE_IN_OUT = [0.77, 0, 0.175, 1] as const;\nexport const EASE_DRAWER = [0.32, 0.72, 0, 1] as const;\nexport const EASE_OUT_CSS = \"cubic-bezier(0.16,1,0.3,1)\";\nexport const SPRING_PRESS = {\n type: \"spring\",\n stiffness: 500,\n damping: 30,\n mass: 0.6,\n} as const;\nexport const SPRING_SWAP = {\n type: \"spring\",\n stiffness: 460,\n damping: 30,\n mass: 0.55,\n} as const;\nexport const SPRING_PANEL = {\n type: \"spring\",\n stiffness: 420,\n damping: 40,\n mass: 0.5,\n} as const;\nexport const SPRING_LAYOUT = {\n type: \"spring\",\n stiffness: 360,\n damping: 32,\n mass: 0.6,\n} as const;\nexport const SPRING_MOUSE = { stiffness: 200, damping: 15, mass: 0.3 } as const;\nexport const SPRING_GLIDE = { stiffness: 700, damping: 50, mass: 0.5 } as const;\nexport const SPRING_TIMELINE = {\n type: \"spring\",\n stiffness: 120,\n damping: 24,\n mass: 1,\n} as const;\n"
601
+ },
602
+ {
603
+ "path": "registry/orvui/lib/layers.ts",
604
+ "target": "~/src/components/orvui/lib/layers.ts",
605
+ "type": "registry:lib",
606
+ "content": "import type { ComponentInternalInstance } from \"vue\";\n\ntype Surface = () => HTMLElement | null;\nexport interface Layer {\n key: symbol;\n modal: boolean;\n owner: ComponentInternalInstance | null;\n surface: Surface;\n returnTo: HTMLElement | null;\n}\nconst active: Layer[] = [];\nconst portals = new Set<{ owner: ComponentInternalInstance | null; surface: Surface }>();\n\nfunction belongsTo(child: ComponentInternalInstance | null, parent: ComponentInternalInstance | null) {\n if (!parent) return false;\n for (let node = child; node; node = node.parent) if (node === parent) return true;\n return false;\n}\nfunction later(layer: Layer) {\n const index = active.indexOf(layer);\n return index < 0 ? [] : active.slice(index + 1);\n}\nexport const layerManager = {\n attach(layer: Layer) {\n if (active.includes(layer)) return false;\n layer.returnTo = document.activeElement as HTMLElement | null;\n const before = active.findIndex(entry => entry.owner !== layer.owner && belongsTo(entry.owner, layer.owner));\n active.splice(before < 0 ? active.length : before, 0, layer);\n return true;\n },\n detach(layer: Layer, restore: boolean) {\n const index = active.indexOf(layer);\n if (index < 0) return;\n const wasLast = index === active.length - 1;\n const surface = layer.surface();\n for (const successor of later(layer)) {\n if (successor.returnTo && surface?.contains(successor.returnTo)) successor.returnTo = layer.returnTo;\n }\n active.splice(index, 1);\n if (restore && wasLast && layer.returnTo?.isConnected) layer.returnTo.focus({ preventScroll: true });\n },\n top(layer: Layer) { return active.at(-1) === layer; },\n modal(layer: Layer) { return active.slice().reverse().find(entry => entry.modal) === layer; },\n higher(layer: Layer, target: EventTarget | null) {\n return !!target && typeof (target as Node).nodeType === \"number\" && later(layer).some(entry => entry.surface()?.contains(target as Node));\n },\n scopes(layer: Layer) {\n const result = [layer.surface()];\n for (const entry of later(layer)) if (!entry.modal && belongsTo(entry.owner, layer.owner)) result.push(entry.surface());\n return result.filter((surface): surface is HTMLElement => surface !== null);\n },\n portal(owner: ComponentInternalInstance | null, surface: Surface) {\n const portal = { owner, surface };\n portals.add(portal);\n return () => portals.delete(portal);\n },\n containsPortal(owner: ComponentInternalInstance | null, target: HTMLElement) {\n for (const portal of portals) {\n const node = portal.surface();\n if (node && belongsTo(portal.owner, owner) && target.contains(node)) return true;\n }\n return false;\n },\n};\n"
607
+ },
608
+ {
609
+ "path": "registry/orvui/lib/RenderContent.ts",
610
+ "target": "~/src/components/orvui/lib/RenderContent.ts",
611
+ "type": "registry:lib",
612
+ "content": "import { defineComponent, h, isVNode } from \"vue\";\n\nexport default defineComponent({\n props: [\"node\"],\n setup(props) {\n return () => {\n const content = props.node;\n if (typeof content === \"function\") return h(content);\n if (content === null || typeof content !== \"object\" || Array.isArray(content) || isVNode(content)) return content;\n return h(content);\n };\n },\n});\n"
613
+ },
614
+ {
615
+ "path": "registry/orvui/lib/utils.ts",
616
+ "target": "~/src/components/orvui/lib/utils.ts",
617
+ "type": "registry:lib",
618
+ "content": "import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: unknown[]) {\n const combined = clsx(...inputs as ClassValue[]);\n return twMerge(combined);\n}\nexport function clamp(value: number, min: number, max: number) {\n const aboveFloor = Math.max(min, value);\n return Math.min(aboveFloor, max);\n}\n"
619
+ },
620
+ {
621
+ "path": "registry/orvui/motion/action-swap/index.ts",
622
+ "target": "~/src/components/orvui/motion/action-swap/index.ts",
623
+ "type": "registry:lib",
624
+ "content": "export { default as ActionSwapText } from \"./src/ActionSwapText.vue\";\nexport { default as ActionSwapIcon } from \"./src/ActionSwapIcon.vue\";\nexport { default as ActionSwapButton } from \"./src/ActionSwapButton.vue\";\n\nexport { default as ActionSwapCascadeButton } from \"./src/ActionSwapCascadeButton.vue\";\nexport { default as ActionSwapCascadeText } from \"./src/ActionSwapCascadeText.vue\";\nexport { default as ActionSwapCascadeIcon } from \"./src/ActionSwapCascadeIcon.vue\";\nexport { default as ActionSwapBlurButton } from \"./src/ActionSwapBlurButton.vue\";\nexport { default as ActionSwapBlurText } from \"./src/ActionSwapBlurText.vue\";\nexport { default as ActionSwapBlurIcon } from \"./src/ActionSwapBlurIcon.vue\";\nexport { default as ActionSwapRollButton } from \"./src/ActionSwapRollButton.vue\";\nexport { default as ActionSwapRollText } from \"./src/ActionSwapRollText.vue\";\nexport { default as ActionSwapRollIcon } from \"./src/ActionSwapRollIcon.vue\";\n\nexport type * from \"./src/api-types\";\n\nexport type * from \"./src/public-types\";\n"
625
+ },
626
+ {
627
+ "path": "registry/orvui/motion/action-swap/src/ActionSwapBlurButton.vue",
628
+ "target": "~/src/components/orvui/motion/action-swap/src/ActionSwapBlurButton.vue",
629
+ "type": "registry:component",
630
+ "content": "<script setup lang=\"ts\">\nimport type { Component, VNodeChild } from \"vue\";\nimport ActionSwapButton from \"./ActionSwapButton.vue\";\nconst props = withDefaults(defineProps<{\n items: { id: string; label: VNodeChild | Component; icon?: VNodeChild | Component; ariaLabel?: string }[];\n modelValue?: string; value?: string; defaultValue?: string; cycle?: boolean; disabled?: boolean;\n variant?: \"primary\" | \"secondary\" | \"outline\" | \"ghost\"; size?: \"sm\" | \"md\" | \"lg\" | \"icon\";\n}>(), { cycle: undefined });\nconst emit = defineEmits([\"update:modelValue\", \"update:value\", \"valueChange\"]);\nfunction changed(value: string, item: typeof props.items[number]) { emit(\"valueChange\", value, item); }\n</script>\n<template><ActionSwapButton v-bind=\"props\" animation=\"blur\" @update:model-value=\"emit('update:modelValue', $event)\" @update:value=\"emit('update:value', $event)\" @value-change=\"changed\">\n <template v-if=\"$slots.default\" #default=\"slotProps\"><slot v-bind=\"slotProps\" /></template>\n <template v-if=\"$slots.icon\" #icon=\"slotProps\"><slot name=\"icon\" v-bind=\"slotProps\" /></template>\n</ActionSwapButton></template>\n"
631
+ },
632
+ {
633
+ "path": "registry/orvui/motion/action-swap/src/ActionSwapBlurIcon.vue",
634
+ "target": "~/src/components/orvui/motion/action-swap/src/ActionSwapBlurIcon.vue",
635
+ "type": "registry:component",
636
+ "content": "<script setup lang=\"ts\">\nimport ActionSwapIcon from \"./ActionSwapIcon.vue\";\nconst props = defineProps<{ value: string | number }>();\ndefineSlots<{ default?: () => any }>();\n</script>\n<template><ActionSwapIcon :value=\"props.value\" animation=\"blur\"><slot /></ActionSwapIcon></template>\n"
637
+ },
638
+ {
639
+ "path": "registry/orvui/motion/action-swap/src/ActionSwapBlurText.vue",
640
+ "target": "~/src/components/orvui/motion/action-swap/src/ActionSwapBlurText.vue",
641
+ "type": "registry:component",
642
+ "content": "<script setup lang=\"ts\">\nimport ActionSwapText from \"./ActionSwapText.vue\";\nconst props = defineProps<{ value: string | number }>();\ndefineSlots<{ default?: () => any }>();\n</script>\n<template><ActionSwapText :value=\"props.value\" animation=\"blur\"><slot /></ActionSwapText></template>\n"
643
+ },
644
+ {
645
+ "path": "registry/orvui/motion/action-swap/src/ActionSwapButton.vue",
646
+ "target": "~/src/components/orvui/motion/action-swap/src/ActionSwapButton.vue",
647
+ "type": "registry:component",
648
+ "content": "<script setup lang=\"ts\">\nimport { computed, type Component, type VNodeChild } from \"vue\";\nimport { motion } from \"motion-v\";\nimport { cn } from \"../../../lib/utils\";\nimport { SPRING_LAYOUT, SPRING_PRESS } from \"../../../lib/ease\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nimport RenderContent from \"../../../lib/RenderContent\";\nimport { useMotionState } from \"../../state\";\nimport ActionSwapIcon from \"./ActionSwapIcon.vue\";\nimport ActionSwapText from \"./ActionSwapText.vue\";\nconst props = withDefaults(defineProps<{\n items: { id: string; label: VNodeChild | Component; icon?: VNodeChild | Component; ariaLabel?: string }[];\n modelValue?: string; value?: string; defaultValue?: string; animation?: \"cascade\" | \"blur\" | \"roll\";\n variant?: \"primary\" | \"secondary\" | \"outline\" | \"ghost\"; size?: \"sm\" | \"md\" | \"lg\" | \"icon\";\n iconOnly?: boolean; cycle?: boolean; disabled?: boolean;\n}>(), { animation: \"blur\", variant: \"secondary\", size: \"md\", cycle: true, iconOnly: undefined });\nconst emit = defineEmits([\"update:modelValue\", \"change\", \"update:value\", \"valueChange\", \"click\"]);\nconst value = useMotionState(props, emit, \"modelValue\", props.defaultValue ?? props.items[0]?.id ?? \"\");\nconst index = computed(() => Math.max(0, props.items.findIndex(item => item.id === (props.value ?? value.value))));\nconst selected = computed(() => props.items[index.value] ?? props.items[0]);\nconst iconOnly = computed(() => props.iconOnly ?? props.size === \"icon\");\nconst hasIcons = computed(() => props.items.some(item => !!item.icon));\nconst reduced = useReducedMotion();\nconst color = computed(() => ({ primary: \"bg-primary text-primary-foreground hover:bg-primary/90\", secondary: \"border border-border bg-card text-foreground hover:border-border\", outline: \"border border-border bg-transparent text-foreground hover:bg-muted/60\", ghost: \"text-muted-foreground hover:bg-muted/60 hover:text-foreground\" })[props.variant]);\nconst geometry = computed(() => ({ sm: \"h-8 gap-1.5 rounded-full px-3 text-xs\", md: \"h-10 gap-2 rounded-full px-4 text-sm\", lg: \"h-12 gap-2.5 rounded-full px-5 text-base\", icon: \"h-10 w-10 rounded-full\" })[props.size]);\nconst accessibleName = computed(() => selected.value?.ariaLabel ?? (iconOnly.value && [\"string\", \"number\"].includes(typeof selected.value?.label) ? String(selected.value!.label) : undefined));\nfunction advance(event: MouseEvent) {\n emit(\"click\", event);\n if (event.defaultPrevented || props.disabled || !props.cycle || !props.items.length) return;\n const next = props.items[(index.value + 1) % props.items.length]!;\n value.value = next.id;\n emit(\"update:value\", next.id);\n emit(\"valueChange\", next.id, next);\n}\n</script>\n<template>\n <motion.button v-if=\"selected\" type=\"button\" :disabled=\"disabled\" layout :layout-dependency=\"selected.id\" :aria-label=\"accessibleName\"\n :while-press=\"reduced || disabled ? undefined : { scale: 0.97 }\" :transition=\"{ ...SPRING_PRESS, layout: reduced ? { duration: 0 } : SPRING_LAYOUT }\"\n :style=\"{ borderRadius: '9999px' }\" :class=\"cn('inline-flex items-center justify-center overflow-hidden font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50', color, geometry, $attrs.class)\" @click=\"advance\">\n <motion.span v-if=\"hasIcons || $slots.icon\" layout=\"position\" :layout-dependency=\"selected.id\" :transition=\"reduced ? { duration: 0 } : SPRING_LAYOUT\" class=\"inline-flex shrink-0\">\n <ActionSwapIcon :value=\"selected.id\" :animation=\"animation\" class=\"h-4 w-4\"><slot name=\"icon\" :item=\"selected\"><RenderContent v-if=\"selected.icon\" :node=\"selected.icon\" class=\"size-4\" /></slot></ActionSwapIcon>\n </motion.span>\n <motion.span v-if=\"!iconOnly\" layout=\"position\" :layout-dependency=\"selected.id\" :transition=\"reduced ? { duration: 0 } : SPRING_LAYOUT\" class=\"inline-flex min-w-0 max-w-full\">\n <ActionSwapText :value=\"selected.id\" :animation=\"animation\"><slot :item=\"selected\"><template v-if=\"typeof selected.label === 'string' || typeof selected.label === 'number'\">{{ selected.label }}</template><RenderContent v-else :node=\"selected.label\" /></slot></ActionSwapText>\n </motion.span>\n </motion.button>\n</template>\n"
649
+ },
650
+ {
651
+ "path": "registry/orvui/motion/action-swap/src/ActionSwapCascadeButton.vue",
652
+ "target": "~/src/components/orvui/motion/action-swap/src/ActionSwapCascadeButton.vue",
653
+ "type": "registry:component",
654
+ "content": "<script setup lang=\"ts\">\nimport type { Component, VNodeChild } from \"vue\";\nimport ActionSwapButton from \"./ActionSwapButton.vue\";\nconst props = withDefaults(defineProps<{\n items: { id: string; label: VNodeChild | Component; icon?: VNodeChild | Component; ariaLabel?: string }[];\n modelValue?: string; value?: string; defaultValue?: string; cycle?: boolean; disabled?: boolean;\n variant?: \"primary\" | \"secondary\" | \"outline\" | \"ghost\"; size?: \"sm\" | \"md\" | \"lg\" | \"icon\";\n}>(), { cycle: undefined });\nconst emit = defineEmits([\"update:modelValue\", \"update:value\", \"valueChange\"]);\nfunction changed(value: string, item: typeof props.items[number]) { emit(\"valueChange\", value, item); }\n</script>\n<template><ActionSwapButton v-bind=\"props\" animation=\"cascade\" @update:model-value=\"emit('update:modelValue', $event)\" @update:value=\"emit('update:value', $event)\" @value-change=\"changed\">\n <template v-if=\"$slots.default\" #default=\"slotProps\"><slot v-bind=\"slotProps\" /></template>\n <template v-if=\"$slots.icon\" #icon=\"slotProps\"><slot name=\"icon\" v-bind=\"slotProps\" /></template>\n</ActionSwapButton></template>\n"
655
+ },
656
+ {
657
+ "path": "registry/orvui/motion/action-swap/src/ActionSwapCascadeIcon.vue",
658
+ "target": "~/src/components/orvui/motion/action-swap/src/ActionSwapCascadeIcon.vue",
659
+ "type": "registry:component",
660
+ "content": "<script setup lang=\"ts\">\nimport ActionSwapIcon from \"./ActionSwapIcon.vue\";\nconst props = defineProps<{ value: string | number }>();\ndefineSlots<{ default?: () => any }>();\n</script>\n<template><ActionSwapIcon :value=\"props.value\" animation=\"cascade\"><slot /></ActionSwapIcon></template>\n"
661
+ },
662
+ {
663
+ "path": "registry/orvui/motion/action-swap/src/ActionSwapCascadeText.vue",
664
+ "target": "~/src/components/orvui/motion/action-swap/src/ActionSwapCascadeText.vue",
665
+ "type": "registry:component",
666
+ "content": "<script setup lang=\"ts\">\nimport ActionSwapText from \"./ActionSwapText.vue\";\nconst props = defineProps<{ value: string | number }>();\ndefineSlots<{ default?: () => any }>();\n</script>\n<template><ActionSwapText :value=\"props.value\" animation=\"cascade\"><slot /></ActionSwapText></template>\n"
667
+ },
668
+ {
669
+ "path": "registry/orvui/motion/action-swap/src/ActionSwapIcon.vue",
670
+ "target": "~/src/components/orvui/motion/action-swap/src/ActionSwapIcon.vue",
671
+ "type": "registry:component",
672
+ "content": "<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { AnimatePresence, motion } from \"motion-v\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nimport { swapPose } from \"./poses\";\nconst props = withDefaults(defineProps<{ value: string | number; animation?: \"cascade\" | \"blur\" | \"roll\" }>(), { animation: \"blur\" });\nconst reduced = useReducedMotion();\nconst pose = computed(() => swapPose(props.animation, \"icon\", reduced.value));\n</script>\n<template><span class=\"relative inline-grid shrink-0 place-items-center overflow-hidden\"><AnimatePresence mode=\"popLayout\" :initial=\"false\">\n <motion.span :key=\"`${animation}-${value}`\" aria-hidden=\"true\" v-bind=\"pose\" class=\"col-start-1 row-start-1 inline-flex items-center justify-center will-change-[opacity,filter,transform]\"><slot /></motion.span>\n</AnimatePresence></span></template>\n"
673
+ },
674
+ {
675
+ "path": "registry/orvui/motion/action-swap/src/ActionSwapRollButton.vue",
676
+ "target": "~/src/components/orvui/motion/action-swap/src/ActionSwapRollButton.vue",
677
+ "type": "registry:component",
678
+ "content": "<script setup lang=\"ts\">\nimport type { Component, VNodeChild } from \"vue\";\nimport ActionSwapButton from \"./ActionSwapButton.vue\";\nconst props = withDefaults(defineProps<{\n items: { id: string; label: VNodeChild | Component; icon?: VNodeChild | Component; ariaLabel?: string }[];\n modelValue?: string; value?: string; defaultValue?: string; cycle?: boolean; disabled?: boolean;\n variant?: \"primary\" | \"secondary\" | \"outline\" | \"ghost\"; size?: \"sm\" | \"md\" | \"lg\" | \"icon\";\n}>(), { cycle: undefined });\nconst emit = defineEmits([\"update:modelValue\", \"update:value\", \"valueChange\"]);\nfunction changed(value: string, item: typeof props.items[number]) { emit(\"valueChange\", value, item); }\n</script>\n<template><ActionSwapButton v-bind=\"props\" animation=\"roll\" @update:model-value=\"emit('update:modelValue', $event)\" @update:value=\"emit('update:value', $event)\" @value-change=\"changed\">\n <template v-if=\"$slots.default\" #default=\"slotProps\"><slot v-bind=\"slotProps\" /></template>\n <template v-if=\"$slots.icon\" #icon=\"slotProps\"><slot name=\"icon\" v-bind=\"slotProps\" /></template>\n</ActionSwapButton></template>\n"
679
+ },
680
+ {
681
+ "path": "registry/orvui/motion/action-swap/src/ActionSwapRollIcon.vue",
682
+ "target": "~/src/components/orvui/motion/action-swap/src/ActionSwapRollIcon.vue",
683
+ "type": "registry:component",
684
+ "content": "<script setup lang=\"ts\">\nimport ActionSwapIcon from \"./ActionSwapIcon.vue\";\nconst props = defineProps<{ value: string | number }>();\ndefineSlots<{ default?: () => any }>();\n</script>\n<template><ActionSwapIcon :value=\"props.value\" animation=\"roll\"><slot /></ActionSwapIcon></template>\n"
685
+ },
686
+ {
687
+ "path": "registry/orvui/motion/action-swap/src/ActionSwapRollText.vue",
688
+ "target": "~/src/components/orvui/motion/action-swap/src/ActionSwapRollText.vue",
689
+ "type": "registry:component",
690
+ "content": "<script setup lang=\"ts\">\nimport ActionSwapText from \"./ActionSwapText.vue\";\nconst props = defineProps<{ value: string | number }>();\ndefineSlots<{ default?: () => any }>();\n</script>\n<template><ActionSwapText :value=\"props.value\" animation=\"roll\"><slot /></ActionSwapText></template>\n"
691
+ },
692
+ {
693
+ "path": "registry/orvui/motion/action-swap/src/ActionSwapText.vue",
694
+ "target": "~/src/components/orvui/motion/action-swap/src/ActionSwapText.vue",
695
+ "type": "registry:component",
696
+ "content": "<script setup lang=\"ts\">\nimport { Comment, computed, Fragment, isVNode, Text, useSlots, type VNode } from \"vue\";\nimport { AnimatePresence, motion } from \"motion-v\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nimport { cascadePoses, swapPose } from \"./poses\";\nconst props = withDefaults(defineProps<{ value: string | number; animation?: \"cascade\" | \"blur\" | \"roll\" }>(), { animation: \"blur\" });\nconst slots = useSlots(), reduced = useReducedMotion();\nfunction textContent(nodes: VNode[]): string | null {\n let result = \"\";\n for (const node of nodes) {\n if (node.type === Comment) continue;\n if (node.type === Text && typeof node.children === \"string\") result += node.children;\n else if (node.type === Fragment && Array.isArray(node.children)) {\n if (!node.children.every(isVNode)) return null;\n const nested = textContent(node.children as VNode[]);\n if (nested === null) return null;\n result += nested;\n } else return null;\n }\n return result;\n}\nconst label = computed(() => { void props.value; return textContent(slots.default?.() ?? []); });\nconst cascade = computed(() => props.animation === \"cascade\" && label.value !== null && !reduced.value);\nconst pose = computed(() => swapPose(props.animation, \"text\", reduced.value));\n</script>\n<template>\n <span class=\"relative -my-[0.08em] inline-block max-w-full whitespace-nowrap py-[0.08em] align-bottom\" style=\"clip-path: inset(0 -999px); -webkit-clip-path: inset(0 -999px)\">\n <span aria-hidden=\"true\" class=\"invisible inline-block whitespace-nowrap\"><template v-if=\"cascade\"><span v-for=\"(character, index) in label?.split('')\" :key=\"index\" class=\"inline-block whitespace-pre\">{{ character }}</span></template><slot v-else /></span>\n <template v-if=\"cascade\"><span class=\"sr-only\">{{ label }}</span><AnimatePresence :initial=\"false\">\n <motion.span :key=\"`cascade-${value}`\" aria-hidden=\"true\" initial=\"initial\" animate=\"animate\" exit=\"exit\" class=\"absolute left-0 top-[0.08em] inline-block whitespace-pre\">\n <motion.span v-for=\"(character, index) in label?.split('')\" :key=\"index\" :custom=\"index * 0.025\" :variants=\"cascadePoses\" initial=\"initial\" animate=\"animate\" exit=\"exit\" class=\"inline-block whitespace-pre will-change-[opacity,filter,transform]\">{{ character }}</motion.span>\n </motion.span>\n </AnimatePresence></template>\n <AnimatePresence v-else :initial=\"false\"><motion.span :key=\"`${animation}-${value}`\" v-bind=\"pose\" class=\"absolute left-0 top-[0.08em] inline-block max-w-full truncate will-change-[opacity,filter,transform]\"><slot /></motion.span></AnimatePresence>\n </span>\n</template>\n"
697
+ },
698
+ {
699
+ "path": "registry/orvui/motion/action-swap/src/api-types.ts",
700
+ "target": "~/src/components/orvui/motion/action-swap/src/api-types.ts",
701
+ "type": "registry:lib",
702
+ "content": "// Vue public prop types, derived from the actual components.\nexport type ActionSwapBlurButtonProps = InstanceType<\n (typeof import(\"./ActionSwapBlurButton.vue\"))[\"default\"]\n>[\"$props\"];\nexport type ActionSwapBlurIconProps = InstanceType<\n (typeof import(\"./ActionSwapBlurIcon.vue\"))[\"default\"]\n>[\"$props\"];\nexport type ActionSwapBlurTextProps = InstanceType<\n (typeof import(\"./ActionSwapBlurText.vue\"))[\"default\"]\n>[\"$props\"];\nexport type ActionSwapButtonProps = InstanceType<\n (typeof import(\"./ActionSwapButton.vue\"))[\"default\"]\n>[\"$props\"];\nexport type ActionSwapCascadeButtonProps = InstanceType<\n (typeof import(\"./ActionSwapCascadeButton.vue\"))[\"default\"]\n>[\"$props\"];\nexport type ActionSwapCascadeIconProps = InstanceType<\n (typeof import(\"./ActionSwapCascadeIcon.vue\"))[\"default\"]\n>[\"$props\"];\nexport type ActionSwapCascadeTextProps = InstanceType<\n (typeof import(\"./ActionSwapCascadeText.vue\"))[\"default\"]\n>[\"$props\"];\nexport type ActionSwapIconProps = InstanceType<\n (typeof import(\"./ActionSwapIcon.vue\"))[\"default\"]\n>[\"$props\"];\nexport type ActionSwapRollButtonProps = InstanceType<\n (typeof import(\"./ActionSwapRollButton.vue\"))[\"default\"]\n>[\"$props\"];\nexport type ActionSwapRollIconProps = InstanceType<\n (typeof import(\"./ActionSwapRollIcon.vue\"))[\"default\"]\n>[\"$props\"];\nexport type ActionSwapRollTextProps = InstanceType<\n (typeof import(\"./ActionSwapRollText.vue\"))[\"default\"]\n>[\"$props\"];\nexport type ActionSwapTextProps = InstanceType<\n (typeof import(\"./ActionSwapText.vue\"))[\"default\"]\n>[\"$props\"];\n"
703
+ },
704
+ {
705
+ "path": "registry/orvui/motion/action-swap/src/poses.ts",
706
+ "target": "~/src/components/orvui/motion/action-swap/src/poses.ts",
707
+ "type": "registry:lib",
708
+ "content": "import { EASE_OUT, SPRING_SWAP } from \"../../../lib/ease\";\nexport function swapPose(animation: \"cascade\" | \"blur\" | \"roll\", kind: \"icon\" | \"text\", quiet: boolean) {\n const rolling = animation !== \"blur\";\n const initial = rolling ? { opacity: 0, y: kind === \"icon\" ? 12 : \"90%\", filter: \"blur(6px)\" }\n : { opacity: 0, scale: kind === \"icon\" ? 0.25 : 0.96, filter: \"blur(6px)\" };\n const exit = rolling ? { opacity: 0, y: kind === \"icon\" ? -12 : \"-90%\", filter: \"blur(6px)\", transition: { duration: 0.14, ease: EASE_OUT } }\n : { opacity: 0, scale: kind === \"icon\" ? 0.25 : 0.96, filter: \"blur(6px)\", transition: { duration: 0.12, ease: EASE_OUT } };\n return { initial: quiet ? false as const : initial, animate: { opacity: 1, y: 0, scale: 1, filter: \"blur(0px)\" }, exit: quiet ? undefined : exit, transition: rolling ? SPRING_SWAP : { duration: 0.18, ease: EASE_OUT } };\n}\nexport const cascadePoses = {\n initial: { opacity: 0, y: \"105%\", filter: \"blur(6px)\" },\n animate: (offset: unknown = 0) => ({ opacity: 1, y: \"0%\", filter: \"blur(0px)\", transition: { ...SPRING_SWAP, delay: Number(offset) } }),\n exit: (offset: unknown = 0) => ({ opacity: 0, y: \"-105%\", filter: \"blur(6px)\", transition: { duration: 0.16, ease: EASE_OUT, delay: Number(offset) / 2 } }),\n};\n"
709
+ },
710
+ {
711
+ "path": "registry/orvui/motion/action-swap/src/public-types.ts",
712
+ "target": "~/src/components/orvui/motion/action-swap/src/public-types.ts",
713
+ "type": "registry:lib",
714
+ "content": "import type { ActionSwapButtonProps } from \"./api-types\";\nexport type ActionSwapAnimation = NonNullable<\n ActionSwapButtonProps[\"animation\"]\n>;\nexport type ActionSwapButtonSize = NonNullable<ActionSwapButtonProps[\"size\"]>;\nexport type ActionSwapButtonVariant = NonNullable<\n ActionSwapButtonProps[\"variant\"]\n>;\nexport type ActionSwapItem = ActionSwapButtonProps[\"items\"][number];\n"
715
+ },
716
+ {
717
+ "path": "registry/orvui/motion/animated-sidebar/index.ts",
718
+ "target": "~/src/components/orvui/motion/animated-sidebar/index.ts",
719
+ "type": "registry:lib",
720
+ "content": "export { default as AnimatedSidebarProvider } from \"./src/AnimatedSidebarProvider.vue\";\nexport { default as AnimatedSidebar } from \"./src/AnimatedSidebar.vue\";\nexport { default as AnimatedSidebarTrigger } from \"./src/AnimatedSidebarTrigger.vue\";\nexport { default as AnimatedSidebarClose } from \"./src/AnimatedSidebarClose.vue\";\nexport { default as AnimatedSidebarRail } from \"./src/AnimatedSidebarRail.vue\";\nexport { default as AnimatedSidebarInset } from \"./src/AnimatedSidebarInset.vue\";\nexport { default as AnimatedSidebarHeader } from \"./src/AnimatedSidebarHeader.vue\";\nexport { default as AnimatedSidebarContent } from \"./src/AnimatedSidebarContent.vue\";\nexport { default as AnimatedSidebarFooter } from \"./src/AnimatedSidebarFooter.vue\";\nexport { default as AnimatedSidebarGroup } from \"./src/AnimatedSidebarGroup.vue\";\nexport { default as AnimatedSidebarGroupContent } from \"./src/AnimatedSidebarGroupContent.vue\";\nexport { default as AnimatedSidebarMenu } from \"./src/AnimatedSidebarMenu.vue\";\nexport { default as AnimatedSidebarMenuItem } from \"./src/AnimatedSidebarMenuItem.vue\";\nexport { default as AnimatedSidebarMenuSub } from \"./src/AnimatedSidebarMenuSub.vue\";\nexport { default as AnimatedSidebarMenuSubItem } from \"./src/AnimatedSidebarMenuSubItem.vue\";\nexport { default as AnimatedSidebarGroupLabel } from \"./src/AnimatedSidebarGroupLabel.vue\";\nexport { default as AnimatedSidebarMenuButton } from \"./src/AnimatedSidebarMenuButton.vue\";\nexport { default as AnimatedSidebarMenuSubButton } from \"./src/AnimatedSidebarMenuSubButton.vue\";\nexport * from \"./src/useAnimatedSidebar\";\n\nexport type * from \"./src/api-types\";\n"
721
+ },
722
+ {
723
+ "path": "registry/orvui/motion/animated-sidebar/src/AnimatedSidebar.vue",
724
+ "target": "~/src/components/orvui/motion/animated-sidebar/src/AnimatedSidebar.vue",
725
+ "type": "registry:component",
726
+ "content": "<script setup lang=\"ts\">\nimport { computed, provide } from \"vue\";\nimport { motion } from \"motion-v\";\nimport { EASE_DRAWER } from \"../../../lib/ease\";\nimport { cn } from \"../../../lib/utils\";\nimport { useSidebar } from \"./context\";\nimport MobileSidebar from \"./MobileSidebar.vue\";\ndefineOptions({ inheritAttrs: false });\nconst props = withDefaults(\n defineProps<{\n side?: \"left\" | \"right\";\n variant?: \"sidebar\" | \"floating\" | \"inset\";\n collapsible?: \"icon\" | \"offcanvas\" | \"none\";\n ariaLabel?: string;\n panelClassName?: string;\n }>(),\n {\n side: \"left\",\n variant: \"sidebar\",\n collapsible: \"icon\",\n ariaLabel: \"Sidebar\",\n },\n);\nconst ctx = useSidebar(),\n collapsed = computed(\n () => !ctx.mobile.value && props.collapsible !== \"none\" && !ctx.open.value,\n ),\n offcanvas = computed(\n () => collapsed.value && props.collapsible === \"offcanvas\",\n );\nprovide(\"orvui-sidebar-panel\", {\n collapsed,\n side: computed(() => props.side),\n collapsible: computed(() => props.collapsible),\n});\nconst width = computed(() =>\n offcanvas.value\n ? \"0px\"\n : collapsed.value\n ? \"var(--sidebar-width-icon)\"\n : \"var(--sidebar-width)\",\n);\n</script>\n<template>\n <MobileSidebar\n v-if=\"ctx.mobile.value\"\n v-bind=\"$attrs\"\n :side=\"side\"\n :aria-label=\"ariaLabel\"\n ><slot /></MobileSidebar\n ><motion.aside\n v-else\n v-bind=\"$attrs\"\n :initial=\"false\"\n :aria-label=\"ariaLabel\"\n data-slot=\"sidebar\"\n :data-state=\"collapsed ? 'collapsed' : 'expanded'\"\n :data-collapsible=\"collapsible\"\n :data-variant=\"variant\"\n :data-side=\"side\"\n :animate=\"{ width }\"\n :transition=\"\n ctx.reduce.value\n ? { duration: 0 }\n : { type: 'spring', stiffness: 380, damping: 35, mass: 0.75 }\n \"\n :class=\"\n cn(\n 'group/sidebar peer relative hidden h-auto shrink-0 md:block will-change-[width]',\n side === 'right' && 'order-last',\n $attrs.class,\n )\n \"\n ><motion.div\n :initial=\"false\"\n :animate=\"{\n opacity: offcanvas ? 0 : 1,\n x: offcanvas ? (side === 'left' ? '-100%' : '100%') : '0%',\n }\"\n :transition=\"{\n duration: ctx.reduce.value ? 0.16 : 0.36,\n ease: EASE_DRAWER,\n }\"\n :inert=\"offcanvas || undefined\"\n :class=\"\n cn(\n 'sticky top-0 flex h-svh w-full flex-col overflow-hidden bg-background',\n collapsible === 'offcanvas' && 'w-[var(--sidebar-width)]',\n variant === 'sidebar' &&\n (side === 'left'\n ? 'border-border border-r'\n : 'border-border border-l'),\n variant === 'floating' &&\n 'm-2 h-[calc(100svh-1rem)] rounded-2xl border border-border shadow-sm',\n variant === 'inset' && 'm-2 h-[calc(100svh-1rem)] rounded-2xl',\n panelClassName,\n )\n \"\n ><slot /></motion.div\n ></motion.aside>\n</template>\n"
727
+ },
728
+ {
729
+ "path": "registry/orvui/motion/animated-sidebar/src/AnimatedSidebarClose.vue",
730
+ "target": "~/src/components/orvui/motion/animated-sidebar/src/AnimatedSidebarClose.vue",
731
+ "type": "registry:component",
732
+ "content": "<script setup lang=\"ts\">\nimport { X } from \"lucide-vue-next\";\nimport { cn } from \"../../../lib/utils\";\nimport { useSidebar } from \"./context\";\nconst ctx = useSidebar();\nfunction close(event: MouseEvent) {\n if (!event.defaultPrevented)\n (ctx.mobile.value ? ctx.setOpenMobile : ctx.setOpen)(false);\n}\n</script>\n<template>\n <button\n type=\"button\"\n aria-label=\"Close sidebar\"\n :class=\"\n cn(\n 'inline-flex size-10 shrink-0 items-center justify-center rounded-xl outline-none focus-visible:ring-2 focus-visible:ring-ring',\n $attrs.class,\n )\n \"\n @click=\"close\"\n >\n <slot><X class=\"size-4\" /></slot>\n </button>\n</template>\n"
733
+ },
734
+ {
735
+ "path": "registry/orvui/motion/animated-sidebar/src/AnimatedSidebarContent.vue",
736
+ "target": "~/src/components/orvui/motion/animated-sidebar/src/AnimatedSidebarContent.vue",
737
+ "type": "registry:component",
738
+ "content": "<script setup lang=\"ts\">\nimport { cn } from \"../../../lib/utils\";\nconst base =\n \"flex min-h-0 flex-1 flex-col gap-2 overflow-y-auto overflow-x-hidden overscroll-contain px-2 py-2\";\n</script>\n<template>\n <div data-slot=\"sidebar-content\" :class=\"cn(base, $attrs.class)\">\n <slot />\n </div>\n</template>\n"
739
+ },
740
+ {
741
+ "path": "registry/orvui/motion/animated-sidebar/src/AnimatedSidebarFooter.vue",
742
+ "target": "~/src/components/orvui/motion/animated-sidebar/src/AnimatedSidebarFooter.vue",
743
+ "type": "registry:component",
744
+ "content": "<script setup lang=\"ts\">\nimport { cn } from \"../../../lib/utils\";\nconst base =\n \"flex shrink-0 flex-col gap-2 border-border border-t p-3 pb-[max(0.75rem,env(safe-area-inset-bottom))]\";\n</script>\n<template>\n <div data-slot=\"sidebar-footer\" :class=\"cn(base, $attrs.class)\"><slot /></div>\n</template>\n"
745
+ },
746
+ {
747
+ "path": "registry/orvui/motion/animated-sidebar/src/AnimatedSidebarGroup.vue",
748
+ "target": "~/src/components/orvui/motion/animated-sidebar/src/AnimatedSidebarGroup.vue",
749
+ "type": "registry:component",
750
+ "content": "<script setup lang=\"ts\">\nimport { cn } from \"../../../lib/utils\";\nconst base = \"flex w-full min-w-0 flex-col px-1 py-1.5\";\n</script>\n<template>\n <div data-slot=\"sidebar-group\" :class=\"cn(base, $attrs.class)\"><slot /></div>\n</template>\n"
751
+ },
752
+ {
753
+ "path": "registry/orvui/motion/animated-sidebar/src/AnimatedSidebarGroupContent.vue",
754
+ "target": "~/src/components/orvui/motion/animated-sidebar/src/AnimatedSidebarGroupContent.vue",
755
+ "type": "registry:component",
756
+ "content": "<script setup lang=\"ts\">\nimport { cn } from \"../../../lib/utils\";\nconst base = \"w-full min-w-0\";\n</script>\n<template>\n <div data-slot=\"sidebar-group-content\" :class=\"cn(base, $attrs.class)\">\n <slot />\n </div>\n</template>\n"
757
+ },
758
+ {
759
+ "path": "registry/orvui/motion/animated-sidebar/src/AnimatedSidebarGroupLabel.vue",
760
+ "target": "~/src/components/orvui/motion/animated-sidebar/src/AnimatedSidebarGroupLabel.vue",
761
+ "type": "registry:component",
762
+ "content": "<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { cn } from \"../../../lib/utils\";\nimport { useSidebarPanel } from \"./context\";\nconst panel = useSidebarPanel(),\n hidden = computed(() => panel.collapsed.value);\n</script>\n<template>\n <div\n :aria-hidden=\"hidden\"\n data-slot=\"sidebar-group-label\"\n :class=\"\n cn(\n 'mb-1 h-7 overflow-hidden px-2 text-[10px] font-medium uppercase tracking-[0.14em] text-muted-foreground transition-opacity',\n hidden ? 'opacity-0' : 'opacity-100',\n $attrs.class,\n )\n \"\n >\n <slot />\n </div>\n</template>\n"
763
+ },
764
+ {
765
+ "path": "registry/orvui/motion/animated-sidebar/src/AnimatedSidebarHeader.vue",
766
+ "target": "~/src/components/orvui/motion/animated-sidebar/src/AnimatedSidebarHeader.vue",
767
+ "type": "registry:component",
768
+ "content": "<script setup lang=\"ts\">\nimport { cn } from \"../../../lib/utils\";\nconst base = \"flex shrink-0 flex-col gap-2 p-3\";\n</script>\n<template>\n <div data-slot=\"sidebar-header\" :class=\"cn(base, $attrs.class)\"><slot /></div>\n</template>\n"
769
+ },
770
+ {
771
+ "path": "registry/orvui/motion/animated-sidebar/src/AnimatedSidebarInset.vue",
772
+ "target": "~/src/components/orvui/motion/animated-sidebar/src/AnimatedSidebarInset.vue",
773
+ "type": "registry:component",
774
+ "content": "<script setup lang=\"ts\">\nimport { motion } from \"motion-v\";\nimport { cn } from \"../../../lib/utils\";\nconst layout =\n \"relative flex min-h-svh min-w-0 flex-1 flex-col bg-background md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-2xl md:peer-data-[variant=inset]:shadow-sm\";\n</script>\n<template>\n <motion.main data-slot=\"sidebar-inset\" :class=\"cn(layout, $attrs.class)\"\n ><slot\n /></motion.main>\n</template>\n"
775
+ },
776
+ {
777
+ "path": "registry/orvui/motion/animated-sidebar/src/AnimatedSidebarMenu.vue",
778
+ "target": "~/src/components/orvui/motion/animated-sidebar/src/AnimatedSidebarMenu.vue",
779
+ "type": "registry:component",
780
+ "content": "<script setup lang=\"ts\">\nimport { SharedLayoutBg } from \"../../shared-layout-bg\";\nimport { cn } from \"../../../lib/utils\";\nconst list = \"flex w-full min-w-0 list-none flex-col gap-0.5\";\n</script>\n<template>\n <SharedLayoutBg\n as=\"ul\"\n :inset=\"0\"\n pill-class-name=\"rounded-xl bg-muted/70\"\n pill-container-class-name=\"inset-y-auto top-0 h-9\"\n data-slot=\"sidebar-menu\"\n :class=\"cn(list, $attrs.class)\"\n ><slot\n /></SharedLayoutBg>\n</template>\n"
781
+ },
782
+ {
783
+ "path": "registry/orvui/motion/animated-sidebar/src/AnimatedSidebarMenuButton.vue",
784
+ "target": "~/src/components/orvui/motion/animated-sidebar/src/AnimatedSidebarMenuButton.vue",
785
+ "type": "registry:component",
786
+ "content": "<script setup lang=\"ts\">\nimport { computed, useSlots } from \"vue\";\nimport { motion } from \"motion-v\";\nimport { ChevronRight } from \"lucide-vue-next\";\nimport { cn } from \"../../../lib/utils\";\nimport { SPRING_LAYOUT, SPRING_PRESS, EASE_OUT } from \"../../../lib/ease\";\nimport RenderContent from \"../../../lib/RenderContent\";\nimport { useSidebar, useSidebarPanel } from \"./context\";\ndefineOptions({ inheritAttrs: false });\nconst props = withDefaults(\n defineProps<{\n href?: string;\n isActive?: boolean;\n ariaExpanded?: boolean;\n disabled?: boolean;\n closeOnSelect?: boolean;\n icon?: any;\n badge?: any;\n target?: string;\n rel?: string;\n }>(),\n { ariaExpanded: undefined, closeOnSelect: undefined },\n);\nconst emit = defineEmits([\"select\"]),\n ctx = useSidebar(),\n panel = useSidebarPanel(),\n slots = useSlots();\nconst textLabel = computed(() =>\n slots\n .default?.()\n .flatMap((node) =>\n typeof node.children === \"string\" ? [node.children] : [],\n )\n .join(\"\"),\n);\nconst textTransition = computed(() => ({\n duration: ctx.reduce.value ? 0.16 : panel.collapsed.value ? 0.12 : 0.2,\n delay: !ctx.reduce.value && !panel.collapsed.value ? 0.08 : 0,\n ease: EASE_OUT,\n}));\nfunction select(event: MouseEvent) {\n const blocked = props.disabled;\n if (blocked) event.preventDefault();\n if (blocked || event.defaultPrevented) return;\n emit(\"select\");\n if (ctx.mobile.value) {\n const closeAfterSelection =\n props.closeOnSelect === undefined\n ? props.ariaExpanded === undefined\n : props.closeOnSelect;\n if (closeAfterSelection) ctx.setOpenMobile(false);\n return;\n }\n if (props.ariaExpanded !== undefined && panel.collapsed.value) {\n ctx.setOpen(true);\n }\n}\n</script>\n<template>\n <component\n :is=\"href ? motion.a : motion.button\"\n v-bind=\"$attrs\"\n :type=\"href ? undefined : 'button'\"\n :href=\"href\"\n :target=\"target\"\n :rel=\"rel ?? (target === '_blank' ? 'noreferrer noopener' : undefined)\"\n :disabled=\"href ? undefined : disabled\"\n :aria-current=\"isActive ? 'page' : undefined\"\n :aria-expanded=\"ariaExpanded\"\n :aria-disabled=\"disabled || undefined\"\n :aria-label=\"panel.collapsed.value ? textLabel : undefined\"\n :title=\"panel.collapsed.value ? textLabel : undefined\"\n :tabindex=\"href && disabled ? -1 : undefined\"\n :while-press=\"ctx.reduce.value || disabled ? undefined : { scale: 0.98 }\"\n :transition=\"SPRING_PRESS\"\n :class=\"\n cn(\n 'relative flex min-h-9 w-full min-w-0 items-center gap-2.5 overflow-hidden rounded-xl px-3 text-left text-sm font-medium outline-none text-muted-foreground transition-colors hover:text-foreground focus-visible:bg-muted/70 focus-visible:ring-2 focus-visible:ring-ring',\n isActive && 'text-foreground',\n disabled && 'cursor-not-allowed opacity-40',\n $attrs.class,\n )\n \"\n @click=\"select\"\n ><motion.span\n v-if=\"isActive\"\n :layout-id=\"ctx.id + '-active'\"\n :transition=\"ctx.reduce.value ? { duration: 0 } : SPRING_LAYOUT\"\n class=\"absolute inset-0 rounded-xl bg-muted\" /><span\n v-if=\"icon || slots.icon\"\n aria-hidden=\"true\"\n class=\"relative z-10 grid size-5 shrink-0 place-items-center\"\n ><slot name=\"icon\"><RenderContent :node=\"icon\" /></slot></span\n ><motion.span\n :initial=\"false\"\n :animate=\"{\n opacity: panel.collapsed.value ? 0 : 1,\n x: panel.collapsed.value ? -4 : 0,\n }\"\n :transition=\"textTransition\"\n :aria-hidden=\"panel.collapsed.value\"\n :class=\"\n cn(\n 'relative z-10 min-w-0 flex-1 truncate',\n panel.collapsed.value && 'pointer-events-none',\n )\n \"\n ><slot /></motion.span\n ><span\n v-if=\"badge && !panel.collapsed.value\"\n class=\"relative z-10 shrink-0 text-xs text-muted-foreground\"\n ><RenderContent :node=\"badge\" /></span\n ><motion.span\n v-if=\"ariaExpanded !== undefined\"\n aria-hidden=\"true\"\n :initial=\"false\"\n :animate=\"{\n opacity: panel.collapsed.value ? 0 : 1,\n rotate: ariaExpanded ? 90 : 0,\n x: panel.collapsed.value ? 4 : 0,\n }\"\n :transition=\"ctx.reduce.value ? { duration: 0 } : SPRING_LAYOUT\"\n class=\"relative z-10 grid size-4 shrink-0 place-items-center text-muted-foreground\"\n ><ChevronRight class=\"size-3.5\" /></motion.span\n ></component>\n</template>\n"
787
+ },
788
+ {
789
+ "path": "registry/orvui/motion/animated-sidebar/src/AnimatedSidebarMenuItem.vue",
790
+ "target": "~/src/components/orvui/motion/animated-sidebar/src/AnimatedSidebarMenuItem.vue",
791
+ "type": "registry:component",
792
+ "content": "<script setup lang=\"ts\">\nimport { motion } from \"motion-v\";\nimport { SPRING_LAYOUT } from \"../../../lib/ease\";\nimport { cn } from \"../../../lib/utils\";\nconst layout = \"position\" as const;\n</script>\n<template>\n <motion.li\n :layout=\"layout\"\n :transition=\"SPRING_LAYOUT\"\n data-slot=\"sidebar-menu-item\"\n :class=\"cn('relative', $attrs.class)\"\n ><slot\n /></motion.li>\n</template>\n"
793
+ },
794
+ {
795
+ "path": "registry/orvui/motion/animated-sidebar/src/AnimatedSidebarMenuSub.vue",
796
+ "target": "~/src/components/orvui/motion/animated-sidebar/src/AnimatedSidebarMenuSub.vue",
797
+ "type": "registry:component",
798
+ "content": "<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { motion, AnimatePresence } from \"motion-v\";\nimport { cn } from \"../../../lib/utils\";\nimport { useSidebar, useSidebarPanel } from \"./context\";\nimport { submenuVariants } from \"./transitions\";\nconst props = defineProps<{ open: boolean }>(),\n ctx = useSidebar(),\n panel = useSidebarPanel();\nconst present = computed(() => props.open && !panel.collapsed.value);\nconst movement = computed(() =>\n ctx.reduce.value\n ? {\n initial: false as const,\n animate: { opacity: 1 },\n exit: { opacity: 0 },\n transition: { duration: 0.12 },\n }\n : {\n variants: submenuVariants,\n initial: \"closed\",\n animate: \"open\",\n exit: \"closed\",\n },\n);\n</script>\n<template>\n <AnimatePresence :initial=\"false\" mode=\"popLayout\"\n ><motion.ul\n v-if=\"present\"\n key=\"sidebar-submenu\"\n v-bind=\"movement\"\n data-slot=\"sidebar-menu-sub\"\n :class=\"\n cn(\n 'relative mt-1 ml-5 flex min-w-0 flex-col gap-0.5 border-border border-l pl-3',\n $attrs.class,\n )\n \"\n ><slot /></motion.ul\n ></AnimatePresence>\n</template>\n"
799
+ },
800
+ {
801
+ "path": "registry/orvui/motion/animated-sidebar/src/AnimatedSidebarMenuSubButton.vue",
802
+ "target": "~/src/components/orvui/motion/animated-sidebar/src/AnimatedSidebarMenuSubButton.vue",
803
+ "type": "registry:component",
804
+ "content": "<script setup lang=\"ts\">\nimport { motion } from \"motion-v\";\nimport { cn } from \"../../../lib/utils\";\nimport { SPRING_PRESS } from \"../../../lib/ease\";\nimport RenderContent from \"../../../lib/RenderContent\";\nimport { useSidebar } from \"./context\";\ndefineOptions({ inheritAttrs: false });\nconst props = withDefaults(\n defineProps<{\n href?: string;\n isActive?: boolean;\n disabled?: boolean;\n closeOnSelect?: boolean;\n icon?: any;\n target?: string;\n rel?: string;\n }>(),\n { closeOnSelect: true },\n);\nconst emit = defineEmits([\"select\"]),\n ctx = useSidebar();\nfunction select(event: MouseEvent) {\n const blocked = props.disabled;\n if (blocked) event.preventDefault();\n const accepted = !blocked && !event.defaultPrevented;\n if (accepted) {\n emit(\"select\");\n const dismissMobile = ctx.mobile.value && props.closeOnSelect;\n if (dismissMobile) ctx.setOpenMobile(false);\n }\n}\n</script>\n<template>\n <component\n :is=\"href ? motion.a : motion.button\"\n v-bind=\"$attrs\"\n :href=\"href\"\n :type=\"href ? undefined : 'button'\"\n :target=\"target\"\n :rel=\"rel ?? (target === '_blank' ? 'noreferrer noopener' : undefined)\"\n :disabled=\"href ? undefined : disabled\"\n :aria-current=\"isActive ? 'page' : undefined\"\n :aria-disabled=\"disabled || undefined\"\n :tabindex=\"href && disabled ? -1 : undefined\"\n :while-press=\"ctx.reduce.value || disabled ? undefined : { scale: 0.98 }\"\n :transition=\"SPRING_PRESS\"\n :class=\"\n cn(\n 'flex min-h-8 w-full min-w-0 items-center gap-2 rounded-lg px-2 text-left text-xs outline-none text-muted-foreground transition-colors hover:bg-muted/60 hover:text-foreground focus-visible:bg-muted/70 focus-visible:ring-2 focus-visible:ring-ring',\n isActive && 'bg-muted/70 text-foreground',\n disabled && 'cursor-not-allowed opacity-40',\n $attrs.class,\n )\n \"\n @click=\"select\"\n ><span aria-hidden=\"true\" class=\"grid size-4 shrink-0 place-items-center\"\n ><slot name=\"icon\"\n ><RenderContent v-if=\"icon\" :node=\"icon\" /><span\n v-else\n class=\"size-1 rounded-full bg-current\" /></slot></span\n ><span class=\"min-w-0 flex-1 truncate\"><slot /></span\n ></component>\n</template>\n"
805
+ },
806
+ {
807
+ "path": "registry/orvui/motion/animated-sidebar/src/AnimatedSidebarMenuSubItem.vue",
808
+ "target": "~/src/components/orvui/motion/animated-sidebar/src/AnimatedSidebarMenuSubItem.vue",
809
+ "type": "registry:component",
810
+ "content": "<script setup lang=\"ts\">\nimport { motion } from \"motion-v\";\nimport { cn } from \"../../../lib/utils\";\nimport { submenuItemVariants } from \"./transitions\";\nconst base = \"relative min-w-0\";\n</script>\n<template>\n <motion.li\n :variants=\"submenuItemVariants\"\n data-slot=\"sidebar-menu-sub-item\"\n :class=\"cn(base, $attrs.class)\"\n ><slot\n /></motion.li>\n</template>\n"
811
+ },
812
+ {
813
+ "path": "registry/orvui/motion/animated-sidebar/src/AnimatedSidebarProvider.vue",
814
+ "target": "~/src/components/orvui/motion/animated-sidebar/src/AnimatedSidebarProvider.vue",
815
+ "type": "registry:component",
816
+ "content": "<script setup lang=\"ts\">\nimport { cn } from \"../../../lib/utils\";\nimport { provideSidebar } from \"./use-sidebar-state\";\nconst props = withDefaults(\n defineProps<{\n open?: boolean;\n defaultOpen?: boolean;\n openMobile?: boolean;\n defaultOpenMobile?: boolean;\n mobileOpen?: boolean;\n defaultMobileOpen?: boolean;\n shortcut?: boolean;\n expandedWidth?: number;\n collapsedWidth?: number;\n }>(),\n {\n open: undefined,\n openMobile: undefined,\n mobileOpen: undefined,\n defaultOpen: true,\n defaultOpenMobile: undefined,\n defaultMobileOpen: false,\n shortcut: true,\n expandedWidth: 256,\n collapsedWidth: 68,\n },\n);\nconst emit = defineEmits([\n \"update:open\",\n \"openChange\",\n \"update:openMobile\",\n \"openMobileChange\",\n \"update:mobileOpen\",\n]);\nconst { open, toggle } = provideSidebar(props, (event, value) =>\n emit(event as \"update:open\", value),\n);\n</script>\n<template>\n <div\n data-slot=\"sidebar-wrapper\"\n :data-state=\"open ? 'expanded' : 'collapsed'\"\n :style=\"{\n '--sidebar-width': expandedWidth + 'px',\n '--sidebar-width-icon': collapsedWidth + 'px',\n '--sidebar-width-mobile': '18rem',\n }\"\n :class=\"\n cn('group/sidebar-wrapper flex min-h-svh w-full min-w-0', $attrs.class)\n \"\n >\n <slot :open=\"open\" :toggle=\"toggle\" />\n </div>\n</template>\n"
817
+ },
818
+ {
819
+ "path": "registry/orvui/motion/animated-sidebar/src/AnimatedSidebarRail.vue",
820
+ "target": "~/src/components/orvui/motion/animated-sidebar/src/AnimatedSidebarRail.vue",
821
+ "type": "registry:component",
822
+ "content": "<script setup lang=\"ts\">\nimport { cn } from \"../../../lib/utils\";\nimport { useSidebar, useSidebarPanel } from \"./context\";\nconst ctx = useSidebar(),\n panel = useSidebarPanel();\nconst rail =\n \"absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 outline-none md:block after:absolute after:inset-y-0 after:left-1/2 after:w-px after:bg-transparent after:transition-colors hover:after:bg-border data-[side=right]:right-0 data-[side=right]:translate-x-1/2 data-[side=left]:left-full\";\n</script>\n<template>\n <button\n type=\"button\"\n :data-side=\"panel.side.value\"\n tabindex=\"-1\"\n aria-label=\"Toggle sidebar\"\n title=\"Toggle sidebar\"\n :class=\"cn(rail, $attrs.class)\"\n @click=\"!$event.defaultPrevented && ctx.toggle()\"\n />\n</template>\n"
823
+ },
824
+ {
825
+ "path": "registry/orvui/motion/animated-sidebar/src/AnimatedSidebarTrigger.vue",
826
+ "target": "~/src/components/orvui/motion/animated-sidebar/src/AnimatedSidebarTrigger.vue",
827
+ "type": "registry:component",
828
+ "content": "<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { PanelLeft } from \"lucide-vue-next\";\nimport { cn } from \"../../../lib/utils\";\nimport { useSidebar } from \"./context\";\nconst ctx = useSidebar(),\n trigger = ctx.triggerRef,\n expanded = computed(() =>\n ctx.mobile.value ? ctx.mobileOpen.value : ctx.open.value,\n );\nfunction click(event: MouseEvent) {\n if (!event.defaultPrevented) ctx.toggle();\n}\n</script>\n<template>\n <button\n ref=\"trigger\"\n type=\"button\"\n aria-label=\"Toggle sidebar\"\n :aria-expanded=\"expanded\"\n data-slot=\"sidebar-trigger\"\n :data-state=\"expanded ? 'expanded' : 'collapsed'\"\n :class=\"\n cn(\n 'inline-flex size-10 shrink-0 items-center justify-center rounded-xl outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n $attrs.class,\n )\n \"\n @click=\"click\"\n >\n <slot><PanelLeft class=\"size-4\" /></slot>\n </button>\n</template>\n"
829
+ },
830
+ {
831
+ "path": "registry/orvui/motion/animated-sidebar/src/api-types.ts",
832
+ "target": "~/src/components/orvui/motion/animated-sidebar/src/api-types.ts",
833
+ "type": "registry:lib",
834
+ "content": "// Vue public prop types, derived from the actual components.\nexport type AnimatedSidebarCloseProps = InstanceType<\n (typeof import(\"./AnimatedSidebarClose.vue\"))[\"default\"]\n>[\"$props\"];\nexport type AnimatedSidebarInsetProps = InstanceType<\n (typeof import(\"./AnimatedSidebarInset.vue\"))[\"default\"]\n>[\"$props\"];\nexport type AnimatedSidebarMenuButtonProps = InstanceType<\n (typeof import(\"./AnimatedSidebarMenuButton.vue\"))[\"default\"]\n>[\"$props\"];\nexport type AnimatedSidebarMenuSubButtonProps = InstanceType<\n (typeof import(\"./AnimatedSidebarMenuSubButton.vue\"))[\"default\"]\n>[\"$props\"];\nexport type AnimatedSidebarMenuSubProps = InstanceType<\n (typeof import(\"./AnimatedSidebarMenuSub.vue\"))[\"default\"]\n>[\"$props\"];\nexport type AnimatedSidebarProps = InstanceType<\n (typeof import(\"./AnimatedSidebar.vue\"))[\"default\"]\n>[\"$props\"];\nexport type AnimatedSidebarProviderProps = InstanceType<\n (typeof import(\"./AnimatedSidebarProvider.vue\"))[\"default\"]\n>[\"$props\"];\nexport type AnimatedSidebarRailProps = InstanceType<\n (typeof import(\"./AnimatedSidebarRail.vue\"))[\"default\"]\n>[\"$props\"];\nexport type AnimatedSidebarTriggerProps = InstanceType<\n (typeof import(\"./AnimatedSidebarTrigger.vue\"))[\"default\"]\n>[\"$props\"];\n"
835
+ },
836
+ {
837
+ "path": "registry/orvui/motion/animated-sidebar/src/context.ts",
838
+ "target": "~/src/components/orvui/motion/animated-sidebar/src/context.ts",
839
+ "type": "registry:lib",
840
+ "content": "import {\n inject,\n type Ref,\n type ComputedRef,\n type WritableComputedRef,\n} from \"vue\";\nexport interface SidebarContext {\n open: WritableComputedRef<boolean>;\n mobileOpen: WritableComputedRef<boolean>;\n mobile: Ref<boolean>;\n reduce: Ref<boolean>;\n id: string;\n triggerRef: Ref<HTMLButtonElement | null>;\n toggle: () => void;\n setOpen: (value: boolean) => void;\n setOpenMobile: (value: boolean) => void;\n state: ComputedRef<\"expanded\" | \"collapsed\">;\n}\nexport interface SidebarPanel {\n collapsed: ComputedRef<boolean>;\n side: ComputedRef<\"left\" | \"right\">;\n collapsible: ComputedRef<\"offcanvas\" | \"icon\" | \"none\">;\n}\nexport function useSidebar() {\n const state = inject<SidebarContext>(\"orvui-sidebar\");\n if (state) return state;\n throw new Error(\n \"useAnimatedSidebar must be used inside AnimatedSidebarProvider.\",\n );\n}\nexport function useSidebarPanel() {\n const panel = inject<SidebarPanel>(\"orvui-sidebar-panel\");\n if (panel) return panel;\n throw new Error(\n \"Animated Sidebar parts must be used inside AnimatedSidebar.\",\n );\n}\n"
841
+ },
842
+ {
843
+ "path": "registry/orvui/motion/animated-sidebar/src/MobileSidebar.vue",
844
+ "target": "~/src/components/orvui/motion/animated-sidebar/src/MobileSidebar.vue",
845
+ "type": "registry:component",
846
+ "content": "<script setup lang=\"ts\">\nimport { computed, ref, watch } from \"vue\";\nimport { motion } from \"motion-v\";\nimport { useOverlay } from \"../../../lib/composables\";\nimport { EASE_DRAWER } from \"../../../lib/ease\";\nimport { cn } from \"../../../lib/utils\";\nimport { useSidebar } from \"./context\";\ndefineOptions({ inheritAttrs: false });\nconst props = withDefaults(\n defineProps<{ side?: \"left\" | \"right\"; ariaLabel?: string }>(),\n { side: \"left\", ariaLabel: \"Sidebar\" },\n);\nconst ctx = useSidebar(),\n panel = ref<HTMLElement | null>(null),\n hidden = ref(!ctx.mobileOpen.value);\nwatch(\n ctx.mobileOpen,\n (value) => {\n if (value) hidden.value = false;\n },\n { flush: \"sync\" },\n);\nuseOverlay(ctx.mobileOpen, panel, () => {\n ctx.mobileOpen.value = false;\n});\nconst destination = computed(() => ({\n opacity: ctx.reduce.value ? (ctx.mobileOpen.value ? 1 : 0) : 1,\n x: ctx.reduce.value\n ? 0\n : ctx.mobileOpen.value\n ? \"0%\"\n : props.side === \"left\"\n ? \"-100%\"\n : \"100%\",\n}));\nconst transition = computed(() => ({\n duration: ctx.reduce.value ? 0.16 : 0.36,\n ease: EASE_DRAWER,\n}));\nfunction complete() {\n if (!ctx.mobileOpen.value) hidden.value = true;\n}\n</script>\n<template>\n <Teleport to=\"body\"\n ><div\n :class=\"[\n 'pointer-events-none fixed left-0 top-0 z-50 size-0 md:hidden',\n hidden && !ctx.mobileOpen.value ? 'invisible' : 'visible',\n ]\"\n >\n <motion.button\n type=\"button\"\n aria-label=\"Close sidebar\"\n :tabindex=\"ctx.mobileOpen.value ? 0 : -1\"\n :initial=\"false\"\n :animate=\"{ opacity: ctx.mobileOpen.value ? 1 : 0 }\"\n :transition=\"transition\"\n :class=\"[\n 'fixed inset-0 bg-black/40',\n ctx.mobileOpen.value ? 'pointer-events-auto' : 'pointer-events-none',\n ]\"\n @click=\"ctx.mobileOpen.value = false\"\n /><motion.div\n ref=\"panel\"\n v-bind=\"$attrs\"\n role=\"dialog\"\n aria-modal=\"true\"\n :aria-label=\"ariaLabel\"\n :aria-hidden=\"!ctx.mobileOpen.value\"\n :inert=\"!ctx.mobileOpen.value || undefined\"\n tabindex=\"-1\"\n data-mobile=\"true\"\n :data-state=\"ctx.mobileOpen.value ? 'expanded' : 'collapsed'\"\n :data-side=\"side\"\n :initial=\"false\"\n :animate=\"destination\"\n :transition=\"transition\"\n :class=\"\n cn(\n 'pointer-events-auto fixed inset-y-0 flex h-dvh w-(--sidebar-width-mobile) max-w-[88vw] flex-col overflow-hidden border-border bg-background shadow-2xl will-change-transform',\n side === 'left' ? 'left-0 border-r' : 'right-0 border-l',\n !ctx.mobileOpen.value && 'pointer-events-none',\n $attrs.class,\n )\n \"\n @animation-complete=\"complete\"\n ><slot\n /></motion.div></div\n ></Teleport>\n</template>\n"
847
+ },
848
+ {
849
+ "path": "registry/orvui/motion/animated-sidebar/src/transitions.ts",
850
+ "target": "~/src/components/orvui/motion/animated-sidebar/src/transitions.ts",
851
+ "type": "registry:lib",
852
+ "content": "import { EASE_OUT } from \"../../../lib/ease\";\nconst closedClip = \"inset(0 0 100% 0 round 8px)\",\n openClip = \"inset(0 0 0% 0 round 8px)\";\nexport const submenuVariants = {\n closed: {\n opacity: 0,\n clipPath: closedClip,\n transition: {\n duration: 0.14,\n ease: EASE_OUT,\n staggerChildren: 0.025,\n staggerDirection: -1,\n },\n },\n open: {\n opacity: 1,\n clipPath: openClip,\n transition: {\n duration: 0.2,\n delayChildren: 0.035,\n ease: EASE_OUT,\n staggerChildren: 0.045,\n },\n },\n};\nexport const submenuItemVariants = {\n closed: { opacity: 0, y: -6, filter: \"blur(3px)\" },\n open: {\n opacity: 1,\n y: 0,\n filter: \"blur(0px)\",\n transition: { duration: 0.18, ease: EASE_OUT },\n },\n};\n"
853
+ },
854
+ {
855
+ "path": "registry/orvui/motion/animated-sidebar/src/use-sidebar-state.ts",
856
+ "target": "~/src/components/orvui/motion/animated-sidebar/src/use-sidebar-state.ts",
857
+ "type": "registry:lib",
858
+ "content": "import { computed, onBeforeUnmount, onMounted, provide, ref, useId } from \"vue\";\nimport { useMediaQuery, useReducedMotion } from \"../../../lib/composables\";\nimport type { SidebarContext } from \"./context\";\nexport interface SidebarOptions {\n open?: boolean;\n defaultOpen: boolean;\n openMobile?: boolean;\n mobileOpen?: boolean;\n defaultOpenMobile?: boolean;\n defaultMobileOpen: boolean;\n shortcut: boolean;\n}\nexport function provideSidebar(\n props: SidebarOptions,\n emit: (name: string, value: boolean) => void,\n) {\n const local = ref(props.defaultOpen),\n localMobile = ref(props.defaultOpenMobile ?? props.defaultMobileOpen);\n const open = computed({\n get: () => props.open ?? local.value,\n set(value: boolean) {\n if (props.open === undefined) local.value = value;\n emit(\"update:open\", value);\n emit(\"openChange\", value);\n },\n });\n const mobileOpen = computed({\n get: () => props.openMobile ?? props.mobileOpen ?? localMobile.value,\n set(value: boolean) {\n if (props.openMobile === undefined && props.mobileOpen === undefined)\n localMobile.value = value;\n for (const event of [\n \"update:openMobile\",\n \"update:mobileOpen\",\n \"openMobileChange\",\n ])\n emit(event, value);\n },\n });\n const mobile = useMediaQuery(\"(max-width: 767px)\"),\n reduce = useReducedMotion(),\n id = useId(),\n triggerRef = ref<HTMLButtonElement | null>(null);\n function toggle() {\n if (mobile.value) mobileOpen.value = !mobileOpen.value;\n else open.value = !open.value;\n }\n const state = computed((): \"expanded\" | \"collapsed\" =>\n open.value ? \"expanded\" : \"collapsed\",\n );\n const context: SidebarContext = {\n open,\n mobileOpen,\n mobile,\n reduce,\n id,\n triggerRef,\n toggle,\n setOpen(value) {\n open.value = value;\n },\n setOpenMobile(value) {\n mobileOpen.value = value;\n },\n state,\n };\n provide(\"orvui-sidebar\", context);\n function shortcut(event: KeyboardEvent) {\n if (\n !props.shortcut ||\n !(event.ctrlKey || event.metaKey) ||\n event.key.toLowerCase() !== \"b\"\n )\n return;\n event.preventDefault();\n toggle();\n }\n onMounted(() => window.addEventListener(\"keydown\", shortcut));\n onBeforeUnmount(() => window.removeEventListener(\"keydown\", shortcut));\n return context;\n}\n"
859
+ },
860
+ {
861
+ "path": "registry/orvui/motion/animated-sidebar/src/useAnimatedSidebar.ts",
862
+ "target": "~/src/components/orvui/motion/animated-sidebar/src/useAnimatedSidebar.ts",
863
+ "type": "registry:lib",
864
+ "content": "export { useSidebar as useAnimatedSidebar } from \"./context\";\n"
865
+ },
866
+ {
867
+ "path": "registry/orvui/motion/button/index.ts",
868
+ "target": "~/src/components/orvui/motion/button/index.ts",
869
+ "type": "registry:lib",
870
+ "content": "export { default as Button } from \"./src/Button.vue\";\nexport { default as ButtonLink } from \"./src/ButtonLink.vue\";\nexport { default as MagneticButton } from \"./src/MagneticButton.vue\";\nexport { default as MetallicButton } from \"./src/MetallicButton.vue\";\nexport { default as StatefulButton } from \"./src/StatefulButton.vue\";\n\nexport type * from \"./src/api-types\";\n\nexport type { ButtonState } from \"./src/StatefulButton.vue\";\n\nexport type * from \"./src/public-types\";\n"
871
+ },
872
+ {
873
+ "path": "registry/orvui/motion/button/src/api-types.ts",
874
+ "target": "~/src/components/orvui/motion/button/src/api-types.ts",
875
+ "type": "registry:lib",
876
+ "content": "// Vue public prop types, derived from the actual components.\nexport type ButtonLinkProps = InstanceType<\n (typeof import(\"./ButtonLink.vue\"))[\"default\"]\n>[\"$props\"];\nexport type ButtonProps = InstanceType<\n (typeof import(\"./Button.vue\"))[\"default\"]\n>[\"$props\"];\nexport type MagneticButtonProps = InstanceType<\n (typeof import(\"./MagneticButton.vue\"))[\"default\"]\n>[\"$props\"];\nexport type MetallicButtonProps = InstanceType<\n (typeof import(\"./MetallicButton.vue\"))[\"default\"]\n>[\"$props\"];\nexport type StatefulButtonProps = InstanceType<\n (typeof import(\"./StatefulButton.vue\"))[\"default\"]\n>[\"$props\"];\n"
877
+ },
878
+ {
879
+ "path": "registry/orvui/motion/button/src/Button.vue",
880
+ "target": "~/src/components/orvui/motion/button/src/Button.vue",
881
+ "type": "registry:component",
882
+ "content": "<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, ref } from \"vue\";\nimport { motion } from \"motion-v\";\nimport { cn } from \"../../../lib/utils\";\nimport { EASE_OUT, SPRING_PRESS } from \"../../../lib/ease\";\nimport { useReducedMotion } from \"../../../lib/composables\";\n\nexport interface ButtonProps {\n variant?: \"primary\" | \"secondary\" | \"ghost\" | \"outline\";\n size?: \"sm\" | \"md\" | \"lg\" | \"icon\";\n pressScale?: number;\n ripple?: boolean;\n disabled?: boolean;\n type?: \"button\" | \"submit\" | \"reset\";\n}\nconst props = withDefaults(defineProps<ButtonProps>(), { variant: \"primary\", size: \"md\", pressScale: 0.93, type: \"button\" });\nconst reduced = useReducedMotion();\nconst waves = ref<{ key: number; left: number; top: number; diameter: number }[]>([]);\nlet sequence = 0;\nconst appearance = computed(() => ({\n primary: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n secondary: \"border border-border bg-card text-foreground\",\n ghost: \"text-muted-foreground hover:text-foreground hover:bg-muted/60\",\n outline: \"border border-border bg-transparent text-foreground hover:bg-muted/60\",\n})[props.variant]);\nconst geometry = computed(() => ({\n sm: \"h-8 px-3 text-xs gap-1.5 rounded-full\", md: \"h-10 px-5 text-sm gap-2 rounded-full\",\n lg: \"h-12 px-6 text-base gap-2 rounded-full\", icon: \"h-8 w-8 rounded-lg\",\n})[props.size]);\nfunction startWave(event: PointerEvent) {\n if (!props.ripple || props.disabled || reduced.value) return;\n const bounds = (event.currentTarget as HTMLElement).getBoundingClientRect();\n waves.value = [...waves.value, {\n key: sequence++, left: event.clientX - bounds.left, top: event.clientY - bounds.top,\n diameter: 2 * Math.max(bounds.width, bounds.height),\n }];\n}\nfunction finishWave(key: number) { waves.value = waves.value.filter(wave => wave.key !== key); }\nonBeforeUnmount(() => { waves.value = []; });\n</script>\n\n<template>\n <motion.button :type=\"type\" :disabled=\"disabled\" :transition=\"SPRING_PRESS\" @pointerdown=\"startWave\"\n :while-press=\"reduced || disabled ? undefined : { scale: pressScale }\"\n :while-hover=\"reduced || disabled ? undefined : { scale: 1.02 }\"\n :class=\"cn('relative inline-flex items-center justify-center font-medium select-none transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50', ripple && 'overflow-hidden', appearance, geometry, $attrs.class)\">\n <span v-if=\"ripple\" class=\"pointer-events-none absolute inset-0 overflow-hidden rounded-[inherit]\">\n <motion.span v-for=\"wave in waves\" :key=\"wave.key\" class=\"absolute rounded-full bg-current\"\n :style=\"{ left: `${wave.left}px`, top: `${wave.top}px`, width: `${wave.diameter}px`, height: `${wave.diameter}px`, x: '-50%', y: '-50%' }\"\n :initial=\"{ scale: 0.05, opacity: 0.3 }\" :animate=\"{ scale: 1, opacity: 0 }\"\n :transition=\"{ duration: 1.6, ease: EASE_OUT }\" @animation-complete=\"finishWave(wave.key)\" />\n </span>\n <slot />\n </motion.button>\n</template>\n"
883
+ },
884
+ {
885
+ "path": "registry/orvui/motion/button/src/ButtonLink.vue",
886
+ "target": "~/src/components/orvui/motion/button/src/ButtonLink.vue",
887
+ "type": "registry:component",
888
+ "content": "<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { motion } from \"motion-v\";\nimport { cn } from \"../../../lib/utils\";\nimport { SPRING_PRESS } from \"../../../lib/ease\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nconst props = withDefaults(defineProps<{ href?: string; variant?: \"primary\" | \"secondary\" | \"ghost\" | \"outline\"; size?: \"sm\" | \"md\" | \"lg\" | \"icon\"; pressScale?: number }>(), { variant: \"primary\", size: \"md\", pressScale: 0.93 });\nconst reduced = useReducedMotion();\nconst color = computed(() => ({ primary: \"bg-primary text-primary-foreground hover:bg-primary/90\", secondary: \"border border-border bg-card text-foreground hover:border-border\", ghost: \"text-muted-foreground hover:text-foreground hover:bg-muted/60\", outline: \"border border-border bg-transparent text-foreground hover:bg-muted/60\" })[props.variant]);\nconst geometry = computed(() => ({ sm: \"h-8 px-3 text-xs gap-1.5 rounded-full\", md: \"h-10 px-5 text-sm gap-2 rounded-full\", lg: \"h-12 px-6 text-base gap-2 rounded-full\", icon: \"h-8 w-8 rounded-lg\" })[props.size]);\n</script>\n<template>\n <motion.a :href=\"href\" :while-press=\"reduced ? undefined : { scale: pressScale }\" :while-hover=\"reduced ? undefined : { scale: 1.02 }\"\n :transition=\"SPRING_PRESS\" :class=\"cn('inline-flex items-center justify-center font-medium select-none transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2', color, geometry, $attrs.class)\"><slot /></motion.a>\n</template>\n"
889
+ },
890
+ {
891
+ "path": "registry/orvui/motion/button/src/Magnetic.vue",
892
+ "target": "~/src/components/orvui/motion/button/src/Magnetic.vue",
893
+ "type": "registry:component",
894
+ "content": "<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, ref, watch } from \"vue\";\nimport { motion, useMotionValue, useSpring } from \"motion-v\";\nimport { SPRING_MOUSE } from \"../../../lib/ease\";\nimport { resolveElement, useMediaQuery, useReducedMotion } from \"../../../lib/composables\";\nconst props = withDefaults(defineProps<{ strength?: number }>(), { strength: 0.35 });\nconst element = ref<HTMLElement | null>(null), reduced = useReducedMotion();\nconst hover = useMediaQuery(\"(hover: hover) and (pointer: fine)\");\nconst enabled = computed(() => hover.value && !reduced.value);\nconst x = useMotionValue(0), y = useMotionValue(0);\nconst springX = useSpring(x, SPRING_MOUSE), springY = useSpring(y, SPRING_MOUSE);\nfunction reset() { x.set(0); y.set(0); }\nfunction track(event: MouseEvent) {\n if (!enabled.value || !element.value) return;\n const bounds = element.value.getBoundingClientRect();\n x.set(props.strength * (event.clientX - bounds.left - bounds.width / 2));\n y.set(props.strength * (event.clientY - bounds.top - bounds.height / 2));\n}\nwatch(enabled, active => { if (!active) { reset(); springX.jump(0); springY.jump(0); } });\nonBeforeUnmount(() => { x.destroy(); y.destroy(); });\ndefineExpose({ x, y });\n</script>\n<template><motion.div :ref=\"node => element = resolveElement<HTMLElement>(node)\" @mousemove=\"track\" @mouseleave=\"reset\"\n :style=\"{ x: springX, y: springY }\" class=\"inline-block\"><slot /></motion.div></template>\n"
895
+ },
896
+ {
897
+ "path": "registry/orvui/motion/button/src/MagneticButton.vue",
898
+ "target": "~/src/components/orvui/motion/button/src/MagneticButton.vue",
899
+ "type": "registry:component",
900
+ "content": "<script setup lang=\"ts\">\ndefineOptions({ inheritAttrs: false });\nimport { ref } from \"vue\";\nimport { resolveElement } from \"../../../lib/composables\";\nimport Button from \"./Button.vue\";\nimport Magnetic from \"./Magnetic.vue\";\nwithDefaults(defineProps<{ strength?: number; disabled?: boolean; magneticClassName?: string }>(), { strength: 0.25 });\nconst button = ref<unknown>();\nfunction focus() { resolveElement<HTMLButtonElement>(button.value)?.focus(); }\ndefineExpose({ focus });\n</script>\n<template><Magnetic :strength=\"strength\" :class=\"magneticClassName\"><Button ref=\"button\" v-bind=\"$attrs\" :disabled=\"disabled\"><slot /></Button></Magnetic></template>\n"
901
+ },
902
+ {
903
+ "path": "registry/orvui/motion/button/src/MetallicButton.vue",
904
+ "target": "~/src/components/orvui/motion/button/src/MetallicButton.vue",
905
+ "type": "registry:component",
906
+ "content": "<script setup lang=\"ts\">\nimport { computed, ref } from \"vue\";\nimport { motion } from \"motion-v\";\nimport { cn } from \"../../../lib/utils\";\nimport { EASE_IN_OUT } from \"../../../lib/ease\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nimport Button from \"./Button.vue\";\nconst props = withDefaults(defineProps<{ size?: \"sm\" | \"md\" | \"lg\" | \"icon\"; paused?: boolean; disabled?: boolean }>(), { size: \"md\", paused: false });\nconst reduced = useReducedMotion(), hovered = ref(false);\nconst animated = computed(() => !props.paused && !reduced.value);\n</script>\n<template>\n <Button variant=\"ghost\" :size=\"size\" :disabled=\"disabled\" @hover-start=\"hovered = true\" @hover-end=\"hovered = false\"\n :class=\"cn('group relative isolate overflow-hidden border-0 bg-transparent text-foreground hover:bg-transparent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 shadow-[0_8px_22px_rgba(0,0,0,0.16)]', size === 'icon' && 'rounded-full', $attrs.class)\">\n <motion.span aria-hidden=\"true\" class=\"pointer-events-none absolute inset-y-0 left-[-18%] z-0 w-[136%] rounded-[inherit] bg-[linear-gradient(105deg,#111_0%,#737373_14%,#fafafa_26%,#525252_38%,#0a0a0a_50%,#a3a3a3_64%,#fff_75%,#404040_87%,#111_100%)]\"\n :animate=\"animated ? { x: ['0%', '13%', '0%'] } : undefined\" :transition=\"animated ? { duration: 8, ease: EASE_IN_OUT, repeat: Infinity } : undefined\" />\n <motion.span aria-hidden=\"true\" class=\"pointer-events-none absolute inset-y-0 left-[-58%] z-[1] w-[52%] -skew-x-12 bg-[linear-gradient(90deg,transparent,rgba(255,255,255,0.5)_48%,transparent)] opacity-50 blur-[3px] mix-blend-screen\"\n :animate=\"animated ? { x: hovered ? '310%' : '0%' } : undefined\" :transition=\"animated ? { duration: 2.4, ease: EASE_IN_OUT } : undefined\" />\n <span aria-hidden=\"true\" class=\"pointer-events-none absolute inset-[2px] z-[2] rounded-[inherit] bg-background transition-colors group-hover:bg-muted/40\" />\n <span aria-hidden=\"true\" class=\"pointer-events-none absolute inset-[2px] z-[3] rounded-[inherit] shadow-[inset_0_1px_0_rgba(255,255,255,0.28),inset_0_-1px_0_rgba(0,0,0,0.16)]\" />\n <span class=\"relative z-10 inline-flex items-center justify-center gap-2\"><slot /></span>\n </Button>\n</template>\n"
907
+ },
908
+ {
909
+ "path": "registry/orvui/motion/button/src/public-types.ts",
910
+ "target": "~/src/components/orvui/motion/button/src/public-types.ts",
911
+ "type": "registry:lib",
912
+ "content": "import type { ButtonProps } from \"./api-types\";\nexport type ButtonSize = NonNullable<ButtonProps[\"size\"]>;\nexport type ButtonVariant = NonNullable<ButtonProps[\"variant\"]>;\n"
913
+ },
914
+ {
915
+ "path": "registry/orvui/motion/button/src/StatefulButton.vue",
916
+ "target": "~/src/components/orvui/motion/button/src/StatefulButton.vue",
917
+ "type": "registry:component",
918
+ "content": "<script setup lang=\"ts\">\ndefineOptions({ inheritAttrs: false });\nimport { computed, useSlots, type Component, type VNodeChild } from \"vue\";\nimport { AnimatePresence, motion } from \"motion-v\";\nimport { Check, Loader2, X } from \"lucide-vue-next\";\nimport { EASE_OUT, SPRING_SWAP } from \"../../../lib/ease\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nimport RenderContent from \"../../../lib/RenderContent\";\nimport Button, { type ButtonProps } from \"./Button.vue\";\nimport StatefulText from \"./StatefulText.vue\";\nexport type ButtonState = \"idle\" | \"loading\" | \"success\" | \"error\";\ninterface Props extends ButtonProps {\n state?: ButtonState; loadingText?: VNodeChild | Component; successText?: VNodeChild | Component;\n errorText?: VNodeChild | Component; icon?: VNodeChild | Component;\n}\nconst props = withDefaults(defineProps<Props>(), { state: \"idle\", loadingText: \"Loading\", successText: \"Done\", errorText: \"Try again\" });\nconst slots = useSlots(), reduced = useReducedMotion();\nconst statusIcon = computed(() => ({ loading: Loader2, success: Check, error: X })[props.state === \"idle\" ? \"loading\" : props.state]);\nfunction content(): VNodeChild | Component {\n if (props.state === \"idle\") return slots.default?.();\n const overrides = { loading: props.loadingText, success: props.successText, error: props.errorText };\n return slots[props.state]?.() ?? overrides[props.state];\n}\nconst iconPoses = {\n initial: { opacity: 0, width: 0, scale: 0.7, filter: \"blur(6px)\" },\n animate: { opacity: 1, width: \"1.5rem\", scale: 1, filter: \"blur(0px)\", transition: SPRING_SWAP },\n exit: { opacity: 0, width: 0, scale: 0.7, filter: \"blur(6px)\", transition: { duration: 0.16, ease: EASE_OUT } },\n};\n</script>\n<template>\n <Button v-bind=\"$attrs\" :variant=\"variant\" :size=\"size\" :press-scale=\"pressScale\" :ripple=\"ripple\" :type=\"type\"\n :disabled=\"disabled || state === 'loading'\" :aria-busy=\"state === 'loading'\" :while-hover=\"undefined\">\n <span aria-live=\"polite\" class=\"relative inline-flex items-center justify-center overflow-hidden\">\n <AnimatePresence :initial=\"false\" as=\"span\" class=\"contents\">\n <motion.span v-if=\"state !== 'idle'\" :key=\"`${state}-icon`\" :variants=\"iconPoses\"\n :initial=\"reduced ? { opacity: 0 } : 'initial'\" :animate=\"reduced ? { opacity: 1 } : 'animate'\" :exit=\"reduced ? { opacity: 0 } : 'exit'\"\n :transition=\"reduced ? { duration: 0.15 } : undefined\" class=\"inline-grid shrink-0 place-items-center overflow-hidden\">\n <component :is=\"statusIcon\" :class=\"['h-4 w-4', state === 'loading' && !reduced && 'animate-spin']\" />\n </motion.span>\n </AnimatePresence>\n <StatefulText :value=\"state\" :nodes=\"content()\" />\n <AnimatePresence :initial=\"false\" as=\"span\" class=\"contents\">\n <motion.span v-if=\"state === 'idle' && (icon || slots.icon)\" key=\"idle-icon\" :variants=\"iconPoses\"\n :initial=\"reduced ? { opacity: 0 } : 'initial'\" :animate=\"reduced ? { opacity: 1 } : 'animate'\" :exit=\"reduced ? { opacity: 0 } : 'exit'\"\n :transition=\"reduced ? { duration: 0.15 } : undefined\" class=\"inline-grid shrink-0 place-items-center overflow-hidden\"><slot name=\"icon\"><RenderContent :node=\"icon\" /></slot></motion.span>\n </AnimatePresence>\n </span>\n </Button>\n</template>\n"
919
+ },
920
+ {
921
+ "path": "registry/orvui/motion/button/src/StatefulText.vue",
922
+ "target": "~/src/components/orvui/motion/button/src/StatefulText.vue",
923
+ "type": "registry:component",
924
+ "content": "<script setup lang=\"ts\">\nimport { computed, isVNode, onBeforeUnmount, onMounted, onUpdated, ref, Text, type Component, type VNodeChild } from \"vue\";\nimport { AnimatePresence, motion } from \"motion-v\";\nimport { EASE_OUT, SPRING_SWAP } from \"../../../lib/ease\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nimport RenderContent from \"../../../lib/RenderContent\";\nconst props = defineProps<{ value: string; nodes: VNodeChild | Component }>();\nconst reduced = useReducedMotion(), measureElement = ref<HTMLSpanElement>(), width = ref<number>();\nfunction plainText(node: VNodeChild | Component): string | null {\n if (typeof node === \"string\") return node;\n if (Array.isArray(node)) return node.length === 1 ? plainText(node[0]) : null;\n return isVNode(node) && node.type === Text && typeof node.children === \"string\" ? node.children : null;\n}\nconst label = computed(() => plainText(props.nodes));\nconst cascade = computed(() => label.value !== null && !reduced.value);\nconst identity = computed(() => label.value === null ? props.value : `${props.value}-${label.value}`);\nfunction delay(custom: unknown) { return typeof custom === \"number\" ? custom : 0; }\nconst poses = {\n initial: { opacity: 0, y: \"105%\", filter: \"blur(6px)\" },\n animate: (custom: unknown) => ({ opacity: 1, y: \"0%\", filter: \"blur(0px)\", transition: { ...SPRING_SWAP, delay: delay(custom) } }),\n exit: (custom: unknown) => ({ opacity: 0, y: \"-105%\", filter: \"blur(6px)\", transition: { duration: 0.16, ease: EASE_OUT, delay: delay(custom) / 2 } }),\n};\nfunction measure() { const measured = measureElement.value?.offsetWidth; if (measured && measured !== width.value) width.value = measured; }\nlet observer: ResizeObserver | undefined;\nonMounted(() => { measure(); if (measureElement.value && typeof ResizeObserver !== \"undefined\") { observer = new ResizeObserver(measure); observer.observe(measureElement.value); } });\nonUpdated(measure);\nonBeforeUnmount(() => observer?.disconnect());\n</script>\n<template>\n <motion.span :initial=\"false\" :animate=\"{ width: width === undefined ? undefined : `${width}px` }\" :transition=\"reduced ? { duration: 0 } : SPRING_SWAP\" class=\"relative inline-block overflow-hidden whitespace-nowrap align-bottom\">\n <span ref=\"measureElement\" aria-hidden=\"true\" class=\"invisible inline-block whitespace-nowrap\">\n <template v-if=\"cascade\"><span v-for=\"(character, index) in label!.split('')\" :key=\"index\" class=\"inline-block whitespace-pre\">{{ character }}</span></template>\n <RenderContent v-else :node=\"nodes\" />\n </span>\n <template v-if=\"cascade\">\n <span class=\"sr-only\">{{ label }}</span>\n <AnimatePresence :initial=\"false\" as=\"span\" class=\"contents\">\n <motion.span :key=\"`cascade-${identity}`\" aria-hidden=\"true\" initial=\"initial\" animate=\"animate\" exit=\"exit\" class=\"absolute left-0 top-0 inline-block whitespace-pre\">\n <motion.span v-for=\"(character, index) in label!.split('')\" :key=\"index\" :custom=\"index * 0.025\" :variants=\"poses\" initial=\"initial\" animate=\"animate\" exit=\"exit\" class=\"inline-block whitespace-pre will-change-[opacity,filter,transform]\">{{ character }}</motion.span>\n </motion.span>\n </AnimatePresence>\n </template>\n <AnimatePresence v-else :initial=\"false\" as=\"span\" class=\"contents\">\n <motion.span :key=\"`text-${identity}`\" :initial=\"reduced ? { opacity: 0 } : { opacity: 0, y: 14, filter: 'blur(6px)' }\"\n :animate=\"reduced ? { opacity: 1 } : { opacity: 1, y: 0, filter: 'blur(0px)' }\" :exit=\"reduced ? { opacity: 0 } : { opacity: 0, y: -14, filter: 'blur(6px)' }\"\n :transition=\"reduced ? { duration: 0.15 } : SPRING_SWAP\" class=\"absolute left-0 top-0 inline-block will-change-[opacity,filter,transform]\"><RenderContent :node=\"nodes\" /></motion.span>\n </AnimatePresence>\n </motion.span>\n</template>\n"
925
+ },
926
+ {
927
+ "path": "registry/orvui/motion/checkbox/index.ts",
928
+ "target": "~/src/components/orvui/motion/checkbox/index.ts",
929
+ "type": "registry:lib",
930
+ "content": "export { default as Checkbox } from \"./src/Checkbox.vue\";\n\nexport type * from \"./src/api-types\";\n"
931
+ },
932
+ {
933
+ "path": "registry/orvui/motion/checkbox/src/api-types.ts",
934
+ "target": "~/src/components/orvui/motion/checkbox/src/api-types.ts",
935
+ "type": "registry:lib",
936
+ "content": "// Vue public prop types, derived from the actual components.\nexport type CheckboxProps = InstanceType<\n (typeof import(\"./Checkbox.vue\"))[\"default\"]\n>[\"$props\"];\n"
937
+ },
938
+ {
939
+ "path": "registry/orvui/motion/checkbox/src/Checkbox.vue",
940
+ "target": "~/src/components/orvui/motion/checkbox/src/Checkbox.vue",
941
+ "type": "registry:component",
942
+ "content": "<script setup lang=\"ts\">\ndefineOptions({ inheritAttrs: false });\nimport { computed, useAttrs, useId } from \"vue\";\nimport { AnimatePresence, motion } from \"motion-v\";\nimport { cn } from \"../../../lib/utils\";\nimport { EASE_OUT, SPRING_PRESS } from \"../../../lib/ease\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nimport { useMotionState } from \"../../state\";\n\nconst props = withDefaults(defineProps<{\n modelValue?: boolean; defaultValue?: boolean; disabled?: boolean; indeterminate?: boolean;\n label?: string; description?: string; id?: string; ariaLabel?: string; ariaDescribedBy?: string;\n}>(), { modelValue: undefined, defaultValue: false });\nconst emit = defineEmits([\"update:modelValue\", \"change\"]);\nconst checked = useMotionState(props, emit, \"modelValue\", props.defaultValue);\nconst generatedId = useId(), attrs = useAttrs(), reduced = useReducedMotion();\nconst controlId = computed(() => props.id ?? generatedId);\nconst accessibleName = computed(() => props.ariaLabel ?? attrs[\"aria-label\"] as string | undefined);\nconst labelId = computed(() => props.description && props.label && !accessibleName.value ? `${controlId.value}-label` : undefined);\nconst descriptionIds = computed(() => [props.ariaDescribedBy ?? attrs[\"aria-describedby\"], props.description ? `${controlId.value}-description` : undefined].filter(Boolean).join(\" \") || undefined);\nconst hasMark = computed(() => checked.value || props.indeterminate);\nconst state = computed(() => checked.value ? \"checked\" : props.indeterminate ? \"indeterminate\" : \"unchecked\");\nconst mark = computed(() => props.indeterminate ? \"M6 12h12\" : \"M5 13l4 4L19 7\");\nfunction toggle(event: MouseEvent) { if (!props.disabled && !event.defaultPrevented) checked.value = !checked.value; }\n</script>\n\n<template>\n <label :for=\"controlId\" :style=\"$attrs.style as any\"\n :class=\"cn('inline-flex gap-3', description ? 'items-start' : 'items-center', disabled ? 'cursor-not-allowed' : 'cursor-pointer', $attrs.class as string)\">\n <motion.button v-bind=\"{ ...$attrs, class: undefined, style: undefined }\" :id=\"controlId\"\n type=\"button\" role=\"checkbox\" :aria-checked=\"indeterminate ? 'mixed' : checked\"\n :aria-label=\"accessibleName\" :aria-labelledby=\"labelId\" :aria-describedby=\"descriptionIds\"\n :disabled=\"disabled\" :data-state=\"state\" @click=\"toggle\"\n :while-press=\"reduced || disabled ? undefined : { scale: 0.92 }\" :transition=\"SPRING_PRESS\"\n :class=\"cn('inline-flex h-5 w-5 shrink-0 items-center justify-center rounded-md border-2 outline-none transition-colors duration-200 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-60', hasMark ? 'border-primary bg-primary text-primary-foreground' : 'border-muted-foreground/65 bg-background hover:border-muted-foreground')\">\n <AnimatePresence :initial=\"false\">\n <motion.svg v-if=\"hasMark\" :key=\"indeterminate ? 'indeterminate' : 'checked'\"\n width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" :stroke-width=\"3\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\n :initial=\"reduced ? { opacity: 1 } : { opacity: 0, scale: 0.5 }\"\n :animate=\"reduced ? { opacity: 1 } : { opacity: 1, scale: 1 }\"\n :exit=\"reduced ? { opacity: 0 } : { opacity: 0, scale: 0.5, filter: 'blur(4px)' }\"\n :transition=\"reduced ? { duration: 0 } : { duration: 0.16, ease: EASE_OUT }\">\n <title>{{ indeterminate ? 'Partially selected' : 'Selected' }}</title>\n <motion.path :d=\"mark\" :initial=\"{ pathLength: reduced ? 1 : 0 }\" :animate=\"{ pathLength: 1 }\"\n :transition=\"reduced ? { duration: 0 } : { duration: indeterminate ? 0.2 : 0.3, ease: EASE_OUT, delay: 0.04 }\" />\n </motion.svg>\n </AnimatePresence>\n </motion.button>\n <span v-if=\"label || description\" :class=\"cn('flex min-w-0 flex-col gap-0.5 select-none', disabled && 'opacity-60')\">\n <span v-if=\"label\" :id=\"labelId\" :class=\"cn('text-sm text-foreground', description && 'leading-4')\">{{ label }}</span>\n <span v-if=\"description\" :id=\"controlId + '-description'\" class=\"text-xs text-muted-foreground\">{{ description }}</span>\n </span>\n </label>\n</template>\n"
943
+ },
944
+ {
945
+ "path": "registry/orvui/motion/input/index.ts",
946
+ "target": "~/src/components/orvui/motion/input/index.ts",
947
+ "type": "registry:lib",
948
+ "content": "export { default as Input } from \"./src/Input.vue\";\n\nexport type * from \"./src/api-types\";\n\nexport type * from \"./src/public-types\";\n"
949
+ },
950
+ {
951
+ "path": "registry/orvui/motion/input/src/api-types.ts",
952
+ "target": "~/src/components/orvui/motion/input/src/api-types.ts",
953
+ "type": "registry:lib",
954
+ "content": "// Vue public prop types, derived from the actual components.\nexport type InputProps = InstanceType<\n (typeof import(\"./Input.vue\"))[\"default\"]\n>[\"$props\"];\n"
955
+ },
956
+ {
957
+ "path": "registry/orvui/motion/input/src/Input.vue",
958
+ "target": "~/src/components/orvui/motion/input/src/Input.vue",
959
+ "type": "registry:component",
960
+ "content": "<script setup lang=\"ts\">\ndefineOptions({ inheritAttrs: false });\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, useAttrs, useId } from \"vue\";\nimport { AnimatePresence, animate, motion } from \"motion-v\";\nimport { cn } from \"../../../lib/utils\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nimport RenderContent from \"../../../lib/RenderContent\";\nimport { useMotionState } from \"../../state\";\nimport { watch } from \"vue\";\nexport interface InputProps {\n modelValue?: string; defaultValue?: string; label?: string; error?: string | boolean; reserveErrorLine?: boolean;\n success?: boolean; disabled?: boolean; type?: string; id?: string; leftIcon?: any; rightIcon?: any; classNames?: Record<string, string>;\n}\nconst props = withDefaults(defineProps<InputProps>(), { defaultValue: \"\", type: \"text\" });\nconst emit = defineEmits([\"update:modelValue\", \"change\", \"focus\", \"blur\"]);\nconst value = useMotionState(props, emit, \"modelValue\", props.defaultValue);\nconst generatedId = useId(), attrs = useAttrs(), reduced = useReducedMotion();\nconst controlId = computed(() => props.id ?? generatedId);\nconst focused = ref(false), field = ref<HTMLElement | null>(null), input = ref<HTMLInputElement | null>(null);\nconst state = computed(() => props.error ? \"error\" : props.success ? \"success\" : focused.value ? \"focused\" : \"idle\");\nconst descriptionIds = computed(() => [attrs[\"aria-describedby\"], typeof props.error === \"string\" ? `${controlId.value}-error` : undefined].filter(Boolean).join(\" \") || undefined);\nlet feedback: ReturnType<typeof animate> | undefined, disposed = false;\nfunction errorFeedback() {\n feedback?.stop();\n if (props.error && field.value && !reduced.value) feedback = animate(field.value, { x: [0, -6, 6, -4, 4, -2, 0] }, { duration: 0.45 });\n}\nfunction edit(event: Event) {\n if (event.defaultPrevented || props.disabled) return;\n value.value = (event.target as HTMLInputElement).value;\n void nextTick(() => { if (!disposed && input.value && input.value.value !== value.value) input.value.value = value.value; });\n}\nfunction focus(event: FocusEvent) { focused.value = true; emit(\"focus\", event); }\nfunction blur(event: FocusEvent) { focused.value = false; emit(\"blur\", event); }\nwatch([() => !!props.error, reduced], errorFeedback);\nonMounted(errorFeedback);\nonBeforeUnmount(() => { disposed = true; feedback?.stop(); });\ndefineExpose({ focus: () => input.value?.focus(), input });\n</script>\n<template>\n <div :class=\"cn('flex flex-col gap-1.5', $attrs.class, classNames?.root)\">\n <label v-if=\"label\" :for=\"controlId\" :class=\"cn('px-1 text-sm font-medium text-foreground', classNames?.label)\">{{ label }}</label>\n <div ref=\"field\" :data-state=\"state\" :class=\"cn('relative h-11 overflow-hidden rounded-full border transition-colors duration-200 border-border', focused && !error && 'border-foreground/40 ring-2 ring-ring/40', error && 'border-destructive ring-2 ring-destructive/25', disabled && 'opacity-60', classNames?.field)\">\n <span v-if=\"$slots.leftIcon || leftIcon\" :class=\"cn('pointer-events-none absolute left-3 top-1/2 flex -translate-y-1/2 items-center text-muted-foreground [&_svg]:h-4 [&_svg]:w-4', classNames?.leftIcon)\"><slot name=\"leftIcon\"><RenderContent :node=\"leftIcon\" /></slot></span>\n <input ref=\"input\" v-bind=\"{ ...$attrs, class: undefined }\" :id=\"controlId\" :type=\"type\" :value=\"value\" :disabled=\"disabled\" :aria-invalid=\"!!error || undefined\" :aria-describedby=\"descriptionIds\"\n @input=\"edit\" @focus=\"focus\" @blur=\"blur\" :class=\"cn('peer h-full w-full bg-transparent text-base leading-6 text-foreground caret-foreground outline-none placeholder:text-muted-foreground/75', $slots.leftIcon || leftIcon ? 'pl-10' : 'pl-3.5', $slots.rightIcon || rightIcon || success ? 'pr-10' : 'pr-3.5', disabled && 'cursor-not-allowed', classNames?.input)\" />\n <motion.svg v-if=\"success\" viewBox=\"0 0 24 24\" fill=\"none\" :class=\"cn('absolute right-3.5 top-1/2 h-5 w-5 -translate-y-1/2 text-(--color-success)', classNames?.successIcon)\">\n <motion.path d=\"M5 12.5l4.5 4.5L19 7.5\" stroke=\"currentColor\" :stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n :initial=\"{ pathLength: reduced ? 1 : 0 }\" :animate=\"{ pathLength: 1 }\" :transition=\"{ duration: reduced ? 0 : 0.35, ease: 'easeOut' }\" />\n </motion.svg>\n <span v-else-if=\"$slots.rightIcon || rightIcon\" :class=\"cn('absolute right-0 top-0 flex h-full items-center text-muted-foreground [&_button]:grid [&_button]:size-11 [&_button]:place-items-center [&_svg]:h-4 [&_svg]:w-4', classNames?.rightIcon)\"><slot name=\"rightIcon\"><RenderContent :node=\"rightIcon\" /></slot></span>\n </div>\n <div :class=\"reserveErrorLine ? 'min-h-4' : 'contents'\"><AnimatePresence :initial=\"false\">\n <motion.p v-if=\"typeof error === 'string' && error\" :id=\"`${controlId}-error`\" role=\"alert\"\n :initial=\"reduced ? { opacity: 0 } : { opacity: 0, y: -4, filter: 'blur(4px)' }\" :animate=\"{ opacity: 1, y: 0, filter: 'blur(0px)' }\"\n :exit=\"reduced ? { opacity: 0 } : { opacity: 0, y: -4, filter: 'blur(4px)' }\" :transition=\"{ duration: 0.2 }\" :class=\"cn('px-1 text-xs text-destructive', classNames?.errorMessage)\">{{ error }}</motion.p>\n </AnimatePresence></div>\n </div>\n</template>\n"
961
+ },
962
+ {
963
+ "path": "registry/orvui/motion/input/src/public-types.ts",
964
+ "target": "~/src/components/orvui/motion/input/src/public-types.ts",
965
+ "type": "registry:lib",
966
+ "content": "export type InputClassNames = Partial<\n Record<\n | \"root\"\n | \"label\"\n | \"field\"\n | \"input\"\n | \"leftIcon\"\n | \"rightIcon\"\n | \"successIcon\"\n | \"errorMessage\",\n string\n >\n>;\n"
967
+ },
968
+ {
969
+ "path": "registry/orvui/motion/loader/index.ts",
970
+ "target": "~/src/components/orvui/motion/loader/index.ts",
971
+ "type": "registry:lib",
972
+ "content": "export { default as Loader } from \"./src/Loader.vue\";\n\nexport type * from \"./src/api-types\";\n\nexport type { LoaderVariant } from \"./src/Loader.vue\";\n"
973
+ },
974
+ {
975
+ "path": "registry/orvui/motion/loader/src/api-types.ts",
976
+ "target": "~/src/components/orvui/motion/loader/src/api-types.ts",
977
+ "type": "registry:lib",
978
+ "content": "// Vue public prop types, derived from the actual components.\nexport type LoaderProps = InstanceType<\n (typeof import(\"./Loader.vue\"))[\"default\"]\n>[\"$props\"];\n"
979
+ },
980
+ {
981
+ "path": "registry/orvui/motion/loader/src/clock.ts",
982
+ "target": "~/src/components/orvui/motion/loader/src/clock.ts",
983
+ "type": "registry:lib",
984
+ "content": "import { computed, onBeforeUnmount, onMounted, ref, watch, type Ref } from \"vue\";\nexport const asciiFrames: Record<string, string[]> = {\n ascii: Array.from(\"⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏\"), \"ascii-line\": [\"|\", \"/\", \"-\", \"\\\\\"],\n \"ascii-braille\": Array.from(\"⣾⣽⣻⢿⡿⣟⣯⣷\"),\n \"ascii-blocks\": Array.from(\"▁▂▃▄▅▆▇█▇▆▅▄▃▂\"), \"ascii-bounce\": Array.from(\"⠁⠂⠄⡀⢀⠠⠐⠈\"),\n};\nexport function useLoaderClock(props: { variant: string; speed: number }, reduced: Ref<boolean>) {\n const frame = ref(0), text = ref(\"LOADING\"), percent = ref(0);\n const frames = computed(() => asciiFrames[props.variant]);\n let mounted = false, interval: ReturnType<typeof setInterval> | undefined;\n function restart() {\n clearInterval(interval);\n frame.value = 0; text.value = \"LOADING\"; percent.value = 0;\n if (!mounted) return;\n if (frames.value) {\n const count = frames.value.length;\n interval = setInterval(() => { frame.value = (frame.value + 1) % count; }, 1000 * props.speed * (reduced.value ? 2.5 : 1) / count);\n } else if (props.variant === \"scramble\" && !reduced.value) {\n const symbols = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789<>/*#@\";\n let iteration = 0;\n interval = setInterval(() => {\n const revealed = iteration++ % 11;\n text.value = Array.from(\"LOADING\", (letter, index) => index < revealed ? letter : symbols[Math.floor(Math.random() * symbols.length)]).join(\"\");\n }, 1000 * props.speed * 0.55 / 7);\n } else if (props.variant === \"percent\") {\n let elapsed = 0;\n const duration = 1000 * props.speed * (reduced.value ? 2 : 1);\n interval = setInterval(() => {\n elapsed += 40;\n percent.value = Math.min(100, Math.round(100 * elapsed / duration));\n if (percent.value >= 100) elapsed = 0;\n }, 40);\n }\n }\n watch([() => props.variant, () => props.speed, reduced], restart);\n onMounted(() => { mounted = true; restart(); });\n onBeforeUnmount(() => { mounted = false; clearInterval(interval); });\n return { frame, text, percent };\n}\n"
985
+ },
986
+ {
987
+ "path": "registry/orvui/motion/loader/src/Loader.vue",
988
+ "target": "~/src/components/orvui/motion/loader/src/Loader.vue",
989
+ "type": "registry:component",
990
+ "content": "<script setup lang=\"ts\">\nimport { useId } from \"vue\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nimport { useLoaderClock } from \"./clock\";\nimport { renderLoader } from \"./visuals\";\nexport type LoaderVariant = \"spinner\" | \"dots\" | \"bars\" | \"dot-matrix\" | \"dither\" | \"ascii\" | \"ascii-line\" | \"ascii-braille\" | \"ascii-blocks\" | \"ascii-bounce\" | \"morph\" | \"comet\" | \"scramble\" | \"metaballs\" | \"newton\" | \"helix\" | \"percent\";\nconst props = withDefaults(defineProps<{ variant?: LoaderVariant; size?: number; speed?: number; label?: string }>(), { variant: \"spinner\", size: 32, speed: 1, label: \"Loading\" });\nconst reduced = useReducedMotion(), clock = useLoaderClock(props, reduced);\nconst filterId = `loader-${useId().replaceAll(\":\", \"\")}`;\nconst Visual = () => renderLoader(props, reduced.value, { frame: clock.frame.value, text: clock.text.value, percent: clock.percent.value, id: filterId });\n</script>\n<template><span role=\"status\" :aria-label=\"label\" class=\"inline-flex items-center justify-center text-foreground\"><Visual /><span class=\"sr-only\">{{ label }}</span></span></template>\n"
991
+ },
992
+ {
993
+ "path": "registry/orvui/motion/loader/src/LoaderSvg.vue",
994
+ "target": "~/src/components/orvui/motion/loader/src/LoaderSvg.vue",
995
+ "type": "registry:component",
996
+ "content": "<script setup lang=\"ts\">\nimport {\n onBeforeUnmount,\n onMounted,\n shallowReactive,\n useAttrs,\n watch,\n} from \"vue\";\nimport { animate, motion, motionValue, type MotionValue } from \"motion-v\";\n\ndefineOptions({ inheritAttrs: false });\nconst props = defineProps<{\n as: \"svg\" | \"path\" | \"circle\";\n target?: Record<string, any>;\n transition?: Record<string, any>;\n}>();\nconst attrs = useAttrs();\nconst values = shallowReactive<Record<string, MotionValue<any>>>({});\nlet mounted = false;\nlet controls: Array<{ stop(): void }> = [];\n\n// SVG attributes must always contain a single frame. Passing an array through\n// motion-v's declarative SVG target serializes the entire array on rerenders.\nfunction synchronize() {\n controls.forEach((control) => control.stop());\n controls = [];\n for (const key of Object.keys(values)) {\n if (props.target?.[key] === undefined) {\n values[key].destroy();\n delete values[key];\n }\n }\n for (const [key, target] of Object.entries(props.target ?? {})) {\n const first = Array.isArray(target)\n ? target[0]\n : key === \"rotate\"\n ? 0\n : target;\n if (!values[key]) values[key] = motionValue(first);\n else values[key].jump(first);\n if (mounted) controls.push(animate(values[key], target, props.transition));\n }\n}\nwatch(() => [props.target, props.transition], synchronize, { immediate: true });\nonMounted(() => {\n mounted = true;\n synchronize();\n});\nonBeforeUnmount(() => {\n mounted = false;\n controls.forEach((control) => control.stop());\n Object.values(values).forEach((value) => value.destroy());\n});\n</script>\n\n<template>\n <component\n :is=\"motion[as]\"\n v-bind=\"attrs\"\n :style=\"{ ...(attrs.style as any), ...values }\"\n >\n <slot />\n </component>\n</template>\n"
997
+ },
998
+ {
999
+ "path": "registry/orvui/motion/loader/src/model.ts",
1000
+ "target": "~/src/components/orvui/motion/loader/src/model.ts",
1001
+ "type": "registry:lib",
1002
+ "content": "export const MORPH_POINTS = 24;\nconst fullTurn = 2 * Math.PI;\nfunction polygonRadius(angle: number, sides: number, orientation = 0) {\n const repeated = sides * (angle - orientation - Math.PI / sides);\n const local = Math.atan2(Math.sin(repeated), Math.cos(repeated)) / sides;\n return Math.cos(Math.PI / sides) / Math.cos(local);\n}\nfunction sample(radius: (angle: number) => number) {\n return Array.from({ length: MORPH_POINTS }, (_, index) => {\n const angle = index * fullTurn / MORPH_POINTS - Math.PI / 2;\n const distance = 46 * Math.min(1.05, radius(angle));\n const x = (50 + distance * Math.cos(angle)).toFixed(2);\n const y = (50 + distance * Math.sin(angle)).toFixed(2);\n return `${index === 0 ? \"M\" : \"L\"}${x} ${y}`;\n }).join(\" \") + \" Z\";\n}\nexport const MORPH_PATHS = [\n sample(() => 1), sample(angle => polygonRadius(angle, 4, Math.PI / 4)),\n sample(angle => polygonRadius(angle, 3)), sample(angle => polygonRadius(angle, 6)),\n sample(angle => polygonRadius(angle, 4)),\n];\nexport const MORPH_SEQ = Array.from({ length: 11 }, (_, index) => MORPH_PATHS[Math.floor(index / 2) % 5]!);\nexport const MORPH_ROT = Array.from({ length: 11 }, (_, index) => Math.floor(index / 2) * 72);\nexport const MORPH_SCALE = Array.from({ length: 11 }, (_, index) => index < 10 && Math.floor(index / 2) % 2 ? 0.88 : 1);\nconst quadrants = [[0, 2], [3, 1]];\nexport const BAYER_4 = Array.from({ length: 16 }, (_, index) => {\n const x = index % 4, y = Math.floor(index / 4);\n return 4 * quadrants[y % 2]![x % 2]! + quadrants[Math.floor(y / 2)]![Math.floor(x / 2)]!;\n});\n"
1003
+ },
1004
+ {
1005
+ "path": "registry/orvui/motion/loader/src/visuals.ts",
1006
+ "target": "~/src/components/orvui/motion/loader/src/visuals.ts",
1007
+ "type": "registry:lib",
1008
+ "content": "import { h, type VNode, type VNodeChild } from \"vue\";\nimport { motion } from \"motion-v\";\nimport { EASE_IN_OUT } from \"../../../lib/ease\";\nimport { BAYER_4, MORPH_PATHS, MORPH_ROT, MORPH_SCALE, MORPH_SEQ } from \"./model\";\nimport { asciiFrames } from \"./clock\";\nimport LoaderSvg from \"./LoaderSvg.vue\";\ninterface LoaderVisualProps { variant: string; size: number; speed: number }\ninterface LoaderVisualState { frame: number; text: string; percent: number; id: string }\nconst px = (length: number) => `${length}px`;\nconst indexes = (count: number) => Array.from({ length: count }, (_, index) => index);\nfunction moving(tag: string, props: Record<string, unknown>, children?: VNodeChild) {\n if (tag === \"svg\" || tag === \"circle\" || tag === \"path\") {\n const { animate: target, transition, ...attrs } = props;\n return h(LoaderSvg, { ...attrs, as: tag, target, transition } as any, children === undefined ? undefined : { default: () => children });\n }\n const component = (motion as any)[tag];\n return children === undefined ? h(component, props) : h(component, props, { default: () => children });\n}\nconst span = (props: Record<string, unknown>, children?: VNodeChild) => h(\"span\", props, children ?? undefined);\nconst circleClass = \"rounded-full bg-current\";\nexport function renderLoader(props: LoaderVisualProps, quiet: boolean, state: LoaderVisualState): VNode {\n const { size, speed, variant } = props;\n const loop = { duration: speed, ease: EASE_IN_OUT, repeat: Infinity };\n const pulse = { opacity: [1, 0.4, 1] };\n const pulseLoop = { duration: 1.4, ease: EASE_IN_OUT, repeat: Infinity };\n const frames = asciiFrames[variant];\n if (frames) return span({ \"aria-hidden\": true, class: \"font-mono leading-none tabular-nums\", style: { fontSize: px(size), lineHeight: 1 } }, frames[state.frame % frames.length]);\n if (variant === \"scramble\") return span({ \"aria-hidden\": true, class: \"font-mono font-medium tracking-[.2em] tabular-nums\", style: { fontSize: px(size * 0.42) } }, state.text);\n if (variant === \"percent\") return span({ \"aria-hidden\": true, class: \"flex flex-col items-center\", style: { gap: px(size * 0.14), width: px(size * 1.4) } }, [\n span({ class: \"font-mono font-medium tabular-nums\", style: { fontSize: px(size * 0.42), lineHeight: 1 } }, `${state.percent}%`),\n span({ class: \"w-full overflow-hidden rounded-full bg-current/15\", style: { height: px(Math.max(3, size * 0.1)) } }, span({ class: \"block h-full rounded-full bg-current\", style: { width: `${state.percent}%` } })),\n ]);\n if (variant === \"dots\") return span({ \"aria-hidden\": true, class: \"flex items-center\", style: { gap: px(size * 0.14) } }, indexes(3).map(index => moving(\"span\", {\n key: index, class: circleClass, style: { width: px(size * 0.24), height: px(size * 0.24) },\n animate: quiet ? { opacity: [0.4, 1, 0.4] } : { y: [0, -size * 0.3, 0], opacity: [0.5, 1, 0.5] }, transition: { ...loop, delay: index * speed * 0.16 },\n })));\n if (variant === \"bars\") return span({ \"aria-hidden\": true, class: \"flex items-center\", style: { gap: px(size * 0.1), height: px(size) } }, indexes(4).map(index => moving(\"span\", {\n key: index, class: circleClass, style: { width: px(size * 0.16), height: px(size), transformOrigin: \"bottom\" },\n animate: quiet ? { opacity: [0.4, 1, 0.4] } : { scaleY: [0.3, 1, 0.3] }, transition: { ...loop, delay: index * speed * 0.12 },\n })));\n if (variant === \"dot-matrix\" || variant === \"dither\") {\n const matrix = variant === \"dot-matrix\", count = matrix ? 3 : 4;\n const gap = matrix ? size * 0.14 : Math.max(1, size * 0.05);\n const cell = (size - gap * (count - 1)) / count;\n const values = matrix ? indexes(9) : BAYER_4;\n return span({ \"aria-hidden\": true, class: \"grid\", style: { gap: px(gap), gridTemplateColumns: `repeat(${count},${cell}px)` } }, values.map((order, index) => moving(\"span\", {\n key: index, class: matrix ? circleClass : \"bg-current\", style: { width: px(cell), height: px(cell) },\n animate: quiet ? { opacity: [0.3, 1, 0.3] } : matrix ? { opacity: [0.2, 1, 0.2], scale: [0.7, 1, 0.7] } : { opacity: [0.1, 1, 0.1] },\n transition: { ...loop, delay: speed * (matrix ? ((index % 3) + Math.floor(index / 3)) / 4 : order / 16) },\n })));\n }\n if (variant === \"morph\") return moving(\"svg\", { width: size, height: size, viewBox: \"0 0 100 100\", \"aria-hidden\": true,\n animate: quiet ? pulse : { rotate: MORPH_ROT, scale: MORPH_SCALE }, transition: quiet ? pulseLoop : { ...loop, duration: speed * 5 },\n }, moving(\"path\", { fill: \"currentColor\", d: MORPH_PATHS[0], animate: quiet ? undefined : { d: MORPH_SEQ }, transition: quiet ? undefined : { ...loop, duration: speed * 5 } }));\n if (variant === \"comet\") return span({ \"aria-hidden\": true, class: \"relative\", style: { width: px(size), height: px(size) } }, moving(\"span\", {\n class: \"absolute inset-0\", animate: quiet ? pulse : { rotate: 360 }, transition: quiet ? pulseLoop : { duration: speed, ease: \"linear\", repeat: Infinity },\n }, indexes(6).map(index => {\n const diameter = size * 0.2 * (1 - index * 0.13);\n return span({ key: index, class: \"absolute left-1/2 top-1/2 rounded-full bg-current\", style: {\n width: px(diameter), height: px(diameter), marginLeft: px(-diameter / 2), marginTop: px(-diameter / 2),\n opacity: 1 - index * 0.16, transform: `rotate(${-15 * index}deg) translateY(${-size * 0.4}px)`,\n } });\n })));\n if (variant === \"metaballs\") return h(\"svg\", { width: size, height: size, viewBox: \"0 0 100 100\", \"aria-hidden\": true }, [\n h(\"defs\", [h(\"filter\", { id: state.id }, [h(\"feGaussianBlur\", { in: \"SourceGraphic\", stdDeviation: \"5\", result: \"b\" }), h(\"feColorMatrix\", { in: \"b\", values: \"1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 20 -8\" })])]),\n h(\"g\", { filter: `url(#${state.id})`, fill: \"currentColor\" }, [0, 1].map(side => moving(\"circle\", {\n key: side, cy: \"50\", r: \"15\", cx: quiet ? 40 + 20 * side : 30 + 40 * side,\n animate: quiet ? { opacity: [0.4, 1, 0.4] } : { cx: side ? [70, 30, 70] : [30, 70, 30] }, transition: { ...loop, duration: speed * 1.6 },\n }))),\n ]);\n if (variant === \"newton\") return span({ \"aria-hidden\": true, class: \"flex items-center justify-center\", style: { height: px(size * 0.2) } }, indexes(5).map(index => moving(\"span\", {\n key: index, class: circleClass, style: { width: px(size * 0.2), height: px(size * 0.2) },\n animate: quiet ? undefined : index === 0 ? { x: [0, -size * 0.22, 0, 0] } : index === 4 ? { x: [0, 0, size * 0.22, 0] } : undefined,\n transition: quiet || (index !== 0 && index !== 4) ? undefined : { duration: speed * 1.5, ease: EASE_IN_OUT, repeat: Infinity, times: index === 0 ? [0, 0.28, 0.5, 1] : [0, 0.5, 0.78, 1] },\n })));\n if (variant === \"helix\") return span({ \"aria-hidden\": true, class: \"relative\", style: { width: px(size), height: px(size) } }, indexes(7).map(row => span({ key: row }, [0, 1].map(side => moving(\"span\", {\n key: side, class: \"absolute rounded-full bg-current\", style: { width: px(size * 0.14), height: px(size * 0.14), left: px(size * 0.43), top: px(row / 6 * (size - size * 0.14)) },\n animate: quiet ? { opacity: [0.4, 1, 0.4] } : {\n x: side ? [-size * 0.32, size * 0.32, -size * 0.32] : [size * 0.32, -size * 0.32, size * 0.32],\n scale: side ? [0.5, 1, 0.5] : [1, 0.5, 1], opacity: side ? [0.45, 1, 0.45] : [1, 0.45, 1],\n }, transition: { ...loop, delay: row * speed / 7 },\n })))));\n const stroke = Math.max(2, size * 0.09), radius = (size - stroke) / 2;\n return moving(\"svg\", { width: size, height: size, viewBox: `0 0 ${size} ${size}`, \"aria-hidden\": true,\n animate: quiet ? pulse : { rotate: 360 }, transition: quiet ? pulseLoop : { duration: speed, ease: \"linear\", repeat: Infinity },\n }, [h(\"circle\", { cx: size / 2, cy: size / 2, r: radius, fill: \"none\", stroke: \"currentColor\", \"stroke-opacity\": \".2\", \"stroke-width\": stroke }),\n h(\"path\", { d: `M ${size / 2} ${size / 2 - radius} A ${radius} ${radius} 0 0 1 ${size / 2 + radius} ${size / 2}`, fill: \"none\", stroke: \"currentColor\", \"stroke-width\": stroke, \"stroke-linecap\": \"round\" })]);\n}\n"
1009
+ },
1010
+ {
1011
+ "path": "registry/orvui/motion/popover/index.ts",
1012
+ "target": "~/src/components/orvui/motion/popover/index.ts",
1013
+ "type": "registry:lib",
1014
+ "content": "export { default as Popover } from \"./src/Popover.vue\";\nexport { default as PopoverTrigger } from \"./src/PopoverTrigger.vue\";\nexport { default as PopoverContent } from \"./src/PopoverContent.vue\";\nexport { default as MorphPopover } from \"./src/MorphPopover.vue\";\nexport { default as MorphPopoverContent } from \"./src/MorphPopoverContent.vue\";\nexport { default as MorphPopoverTrigger } from \"./src/MorphPopoverTrigger.vue\";\n\nexport type * from \"./src/api-types\";\n"
1015
+ },
1016
+ {
1017
+ "path": "registry/orvui/motion/popover/src/api-types.ts",
1018
+ "target": "~/src/components/orvui/motion/popover/src/api-types.ts",
1019
+ "type": "registry:lib",
1020
+ "content": "// Vue public prop types, derived from the actual components.\nexport type MorphPopoverContentProps = InstanceType<\n (typeof import(\"./MorphPopoverContent.vue\"))[\"default\"]\n>[\"$props\"];\nexport type MorphPopoverProps = InstanceType<\n (typeof import(\"./MorphPopover.vue\"))[\"default\"]\n>[\"$props\"];\nexport type MorphPopoverTriggerProps = InstanceType<\n (typeof import(\"./MorphPopoverTrigger.vue\"))[\"default\"]\n>[\"$props\"];\nexport type PopoverContentProps = InstanceType<\n (typeof import(\"./PopoverContent.vue\"))[\"default\"]\n>[\"$props\"];\nexport type PopoverProps = InstanceType<\n (typeof import(\"./Popover.vue\"))[\"default\"]\n>[\"$props\"];\nexport type PopoverTriggerProps = InstanceType<\n (typeof import(\"./PopoverTrigger.vue\"))[\"default\"]\n>[\"$props\"];\n"
1021
+ },
1022
+ {
1023
+ "path": "registry/orvui/motion/popover/src/context.ts",
1024
+ "target": "~/src/components/orvui/motion/popover/src/context.ts",
1025
+ "type": "registry:lib",
1026
+ "content": "import {\n computed,\n inject,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n shallowRef,\n useId,\n watch,\n type InjectionKey,\n type Ref,\n} from \"vue\";\nimport { animate, motionValue } from \"motion-v\";\nimport {\n resolveElement,\n useFloatingLayer,\n useReducedMotion,\n} from \"../../../lib/composables\";\nimport type { Side, Align } from \"./geometry\";\nexport interface PopoverProps {\n open?: boolean;\n defaultOpen?: boolean;\n trigger?: \"click\" | \"hover\";\n side?: Side;\n align?: Align;\n sideOffset?: number;\n panelRadius?: number;\n gooStrength?: number;\n className?: string;\n}\nexport const GOO_OPEN_SPRING = {\n type: \"spring\",\n visualDuration: 0.3,\n bounce: 0.15,\n} as const;\nexport const GOO_CLOSE_SPRING = {\n type: \"spring\",\n visualDuration: 0.21,\n bounce: 0.15,\n} as const;\n/** A dragged contact is never interpreted as a hovering pointer departure. */\nexport function hoverGesture() {\n const dragging = new Map<number, boolean>();\n return {\n enter(event: PointerEvent) {\n const hover = event.pointerType !== \"touch\" && event.buttons === 0;\n dragging.set(event.pointerId, !hover);\n return hover;\n },\n leave(event: PointerEvent) {\n const dragged = dragging.get(event.pointerId);\n dragging.delete(event.pointerId);\n return event.pointerType !== \"touch\" && !dragged;\n },\n };\n}\nexport function createPopover(\n props: PopoverProps,\n emit: (event: any, ...args: any[]) => void,\n kind: \"goo\" | \"morph\" = \"goo\",\n) {\n const id = useId().replace(/[^\\w-]/g, \"\");\n const root = ref<HTMLElement | null>(null);\n const trigger = shallowRef<HTMLElement | null>(null);\n const content = shallowRef<HTMLElement | null>(null);\n const memory = ref(props.defaultOpen ?? false);\n const open = computed({\n get: () => props.open ?? memory.value,\n set: (next: boolean) => {\n if (props.open === undefined) memory.value = next;\n emit(\"update:open\", next);\n emit(\"openChange\", next);\n },\n });\n const anchor = computed(() => trigger.value ?? root.value);\n const reduce = useReducedMotion();\n const progress = motionValue(open.value ? 1 : 0);\n const layer = useFloatingLayer(open, content);\n let mounted = false;\n let disposed = false;\n let closeTimer: ReturnType<typeof setTimeout> | undefined;\n let timerRevision = 0;\n let animation: ReturnType<typeof animate> | undefined;\n let focusIntent = false;\n let clearIntent: (() => void) | undefined;\n const cancelClose = () => {\n ++timerRevision;\n clearTimeout(closeTimer);\n closeTimer = undefined;\n };\n const setOpen = (next: boolean) => {\n open.value = next;\n };\n const toggle = () => {\n open.value = !open.value;\n };\n const openHover = () => {\n cancelClose();\n open.value = true;\n };\n function scheduleClose() {\n cancelClose();\n const version = timerRevision;\n closeTimer = setTimeout(() => {\n if (!disposed && version === timerRevision) open.value = false;\n }, 120);\n }\n function close() {\n cancelClose();\n const current = content.value?.ownerDocument.activeElement;\n const restore = current && content.value?.contains(current);\n open.value = false;\n if (restore)\n (\n trigger.value ??\n (root.value && root.value.tabIndex >= 0 ? root.value : null)\n )?.focus();\n }\n function armFocusOnOpen(armed: boolean) {\n clearIntent?.();\n clearIntent = undefined;\n focusIntent = armed;\n if (!armed || typeof document === \"undefined\") return;\n const documentScope = anchor.value?.ownerDocument ?? document;\n const cancel = () => {\n focusIntent = false;\n clearIntent?.();\n clearIntent = undefined;\n };\n documentScope.addEventListener(\"keydown\", cancel, true);\n documentScope.addEventListener(\"pointerdown\", cancel, true);\n clearIntent = () => {\n documentScope.removeEventListener(\"keydown\", cancel, true);\n documentScope.removeEventListener(\"pointerdown\", cancel, true);\n };\n }\n function takeFocusOnOpen() {\n const intended = focusIntent;\n armFocusOnOpen(false);\n return intended;\n }\n function animateState() {\n animation?.stop();\n if (!mounted || kind === \"morph\") return;\n animation = animate(\n progress,\n open.value ? 1 : 0,\n reduce.value\n ? { duration: 0 }\n : open.value\n ? GOO_OPEN_SPRING\n : GOO_CLOSE_SPRING,\n );\n }\n watch([open, reduce], animateState, { flush: \"post\" });\n const outside = (event: PointerEvent) => {\n if (\n open.value &&\n event.target instanceof Node &&\n !layer.containsHigher(event.target) &&\n !root.value?.contains(event.target) &&\n !content.value?.contains(event.target)\n )\n close();\n };\n const escape = (event: KeyboardEvent) => {\n if (layer.claimEscape(event)) close();\n };\n onMounted(() => {\n mounted = true;\n animateState();\n window.addEventListener(\"pointerdown\", outside, true);\n window.addEventListener(\"keydown\", escape);\n });\n onBeforeUnmount(() => {\n disposed = true;\n mounted = false;\n cancelClose();\n clearIntent?.();\n animation?.stop();\n progress.destroy();\n window.removeEventListener(\"pointerdown\", outside, true);\n window.removeEventListener(\"keydown\", escape);\n });\n return {\n kind,\n p: props,\n root,\n trigger,\n content,\n anchor,\n open,\n progress,\n reduce,\n setOpen,\n toggle,\n close,\n openHover,\n scheduleClose,\n cancelClose,\n armFocusOnOpen,\n takeFocusOnOpen,\n gooId: `${id}-goo`,\n triggerId: `${id}-trigger`,\n contentId: `${id}-content`,\n };\n}\nexport const popoverKey: InjectionKey<ReturnType<typeof createPopover>> =\n Symbol(\"popover\");\nexport function usePopover() {\n const state = inject(popoverKey);\n if (!state)\n throw Error(\"Popover parts must be inside Popover or MorphPopover.\");\n return state;\n}\nexport type PortalLayout = {\n trigger: { left: number; top: number; width: number; height: number };\n content: { width: number; height: number };\n};\nexport function usePortalPosition(\n anchor: Ref<HTMLElement | null>,\n content: Ref<HTMLElement | null>,\n active: Ref<boolean>,\n) {\n const layout = ref<PortalLayout | null>(null);\n let mounted = false;\n let revision = 0;\n let observer: ResizeObserver | undefined;\n let attached = false;\n function update() {\n const source = anchor.value;\n const target = content.value;\n if (!mounted || !source || !target) return;\n const box = source.getBoundingClientRect();\n const next = {\n trigger: {\n left: box.left,\n top: box.top,\n width: box.width,\n height: box.height,\n },\n content: { width: target.offsetWidth, height: target.offsetHeight },\n };\n const previous = layout.value;\n if (\n !previous ||\n Object.keys(next.trigger).some(\n (key) =>\n next.trigger[key as keyof typeof next.trigger] !==\n previous.trigger[key as keyof typeof previous.trigger],\n ) ||\n next.content.width !== previous.content.width ||\n next.content.height !== previous.content.height\n )\n layout.value = next;\n }\n function detach() {\n observer?.disconnect();\n observer = undefined;\n if (attached) {\n window.removeEventListener(\"scroll\", update, true);\n window.removeEventListener(\"resize\", update);\n attached = false;\n }\n }\n async function bind() {\n const version = ++revision;\n detach();\n if (!mounted) return;\n await nextTick();\n if (!mounted || version !== revision) return;\n update();\n if (!active.value) return;\n if (typeof ResizeObserver !== \"undefined\") {\n observer = new ResizeObserver(update);\n if (anchor.value) observer.observe(anchor.value);\n if (content.value) observer.observe(content.value);\n }\n window.addEventListener(\"scroll\", update, true);\n window.addEventListener(\"resize\", update);\n attached = true;\n }\n watch([active, anchor, content], bind, { flush: \"post\" });\n onMounted(() => {\n mounted = true;\n void bind();\n });\n onBeforeUnmount(() => {\n mounted = false;\n ++revision;\n detach();\n });\n return layout;\n}\n"
1027
+ },
1028
+ {
1029
+ "path": "registry/orvui/motion/popover/src/geometry.ts",
1030
+ "target": "~/src/components/orvui/motion/popover/src/geometry.ts",
1031
+ "type": "registry:lib",
1032
+ "content": "export type Side = \"top\" | \"bottom\";\nexport type Align = \"start\" | \"center\" | \"end\";\nexport interface Rect { x: number; y: number; w: number; h: number; r: number }\nexport interface Geo {\n layerW: number; layerH: number; left: number; top: number;\n trigger: Rect; panel: Rect;\n}\n\n/** Place both surfaces in the bounding box of their union. */\nexport function buildGeo(tW: number, tH: number, cW: number, cH: number, side: Side, align: Align, gap: number, panelRadius: number): Geo {\n const horizontal = { start: 0, center: (tW - cW) / 2, end: tW - cW }[align];\n const vertical = side === \"top\" ? -cH - gap : tH + gap;\n const left = Math.min(0, horizontal), top = Math.min(0, vertical);\n const layerW = Math.max(tW, horizontal + cW) - left;\n const layerH = Math.max(tH, vertical + cH) - top;\n return {\n layerW, layerH, left, top,\n trigger: { x: -left, y: -top, w: tW, h: tH, r: Math.min(tH / 2, panelRadius) },\n panel: { x: horizontal - left, y: vertical - top, w: cW, h: cH, r: panelRadius },\n };\n}\nexport function rectAtProgress(geo: Geo, progress: number): Rect {\n const interpolate = (key: keyof Rect) => geo.trigger[key] * (1 - progress) + geo.panel[key] * progress;\n return { x: interpolate(\"x\"), y: interpolate(\"y\"), w: interpolate(\"w\"), h: interpolate(\"h\"), r: interpolate(\"r\") };\n}\nexport function insetFor(rect: Rect, layerW: number, layerH: number) {\n const edges = [rect.y, layerW - rect.x - rect.w, layerH - rect.y - rect.h, rect.x];\n return `inset(${edges.map(edge => `${edge}px`).join(\" \")} round ${rect.r}px)`;\n}\nfunction outline(rect: Rect) {\n const radius = Math.max(0, Math.min(rect.r, rect.w / 2, rect.h / 2));\n const left = rect.x, top = rect.y, right = rect.x + rect.w, bottom = rect.y + rect.h;\n const handles = radius * 0.5523;\n return {\n radius, start: [left + radius, top],\n corners: [\n { line: [right - radius, top], end: [right, top + radius], a: [right - radius + handles, top], b: [right, top + radius - handles] },\n { line: [right, bottom - radius], end: [right - radius, bottom], a: [right, bottom - radius + handles], b: [right - radius + handles, bottom] },\n { line: [left + radius, bottom], end: [left, bottom - radius], a: [left + radius - handles, bottom], b: [left, bottom - radius + handles] },\n { line: [left, top + radius], end: [left + radius, top], a: [left, top + radius - handles], b: [left + radius - handles, top] },\n ],\n };\n}\nexport function roundedRectShape(rect: Rect) {\n const shape = outline(rect);\n const point = (coordinates: number[]) => coordinates.map(coordinate => `${coordinate.toFixed(3)}px`).join(\" \");\n const commands = shape.corners.flatMap(corner => [\n `line to ${point(corner.line)}`,\n `curve to ${point(corner.end)} with ${point(corner.a)} / ${point(corner.b)}`,\n ]);\n return `shape(from ${point(shape.start)}, ${commands.join(\", \")}, close)`;\n}\nexport function clipForProgress(geo: Geo, progress: number, supportsShape: boolean) {\n const surface = rectAtProgress(geo, progress);\n return supportsShape ? roundedRectShape(surface) : insetFor(surface, geo.layerW, geo.layerH);\n}\nexport function roundedRectPath(rect: Rect) {\n const shape = outline(rect);\n const point = (coordinates: number[]) => coordinates.map(coordinate => coordinate.toFixed(3)).join(\" \");\n const arc = `A${shape.radius.toFixed(3)} ${shape.radius.toFixed(3)} 0 0 1`;\n let path = `M${point(shape.start)}`;\n shape.corners.forEach((corner, index) => {\n const axis = index % 2 === 0 ? 0 : 1;\n path += `${axis === 0 ? \"H\" : \"V\"}${corner.line[axis]!.toFixed(3)}${arc} ${point(corner.end)}`;\n });\n return path + \"Z\";\n}\n/** An even-odd path leaves the real trigger visible through the goo surface. */\nexport function triggerCutout(geo: Geo) {\n const bounds: Rect = { x: 0, y: 0, w: geo.layerW, h: geo.layerH, r: 0 };\n return `path(evenodd, \"${roundedRectPath(bounds)} ${roundedRectPath(geo.trigger)}\")`;\n}\n"
1033
+ },
1034
+ {
1035
+ "path": "registry/orvui/motion/popover/src/morph-focus.ts",
1036
+ "target": "~/src/components/orvui/motion/popover/src/morph-focus.ts",
1037
+ "type": "registry:lib",
1038
+ "content": "import { isRef, nextTick, onBeforeUnmount, type Ref } from \"vue\";\nimport { resolveElement } from \"../../../lib/composables\";\ntype Options = {\n initialFocus?: HTMLElement | Ref<HTMLElement | null> | null;\n onOpenAutoFocus?: (content: HTMLDivElement) => void;\n};\nexport function createMorphFocus(\n options: Options,\n allowed: () => boolean,\n takeIntent: () => boolean,\n) {\n let epoch = 0;\n let used = false;\n let detach: (() => void) | undefined;\n let disposed = false;\n function reset() {\n ++epoch;\n used = false;\n detach?.();\n detach = undefined;\n }\n async function focus(panel: HTMLElement | null) {\n if (used || !panel || !allowed()) return;\n used = true;\n if (options.onOpenAutoFocus) {\n options.onOpenAutoFocus(panel as HTMLDivElement);\n takeIntent();\n return;\n }\n if (!takeIntent()) return;\n const version = epoch;\n await nextTick();\n if (disposed || version !== epoch || !allowed()) return;\n const document = panel.ownerDocument;\n const previous = document.activeElement;\n const untouched = () =>\n document.activeElement === previous || document.activeElement === panel;\n const first = () => {\n const initial = resolveElement<HTMLElement>(\n isRef(options.initialFocus)\n ? options.initialFocus.value\n : options.initialFocus,\n );\n const candidates = [\n initial,\n ...panel.querySelectorAll<HTMLElement>(\n 'a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])',\n ),\n ];\n for (const candidate of candidates) {\n candidate?.focus({ preventScroll: true });\n if (!untouched()) {\n candidate?.scrollIntoView?.({ block: \"nearest\" });\n return true;\n }\n }\n panel.focus({ preventScroll: true });\n return false;\n };\n if (first()) return;\n const wrapper = panel.parentElement;\n const cancel = () => {\n detach?.();\n detach = undefined;\n };\n const retry = (event: TransitionEvent) => {\n if (event.propertyName === \"visibility\" && (!untouched() || first()))\n cancel();\n };\n wrapper?.addEventListener(\"transitionend\", retry);\n document.addEventListener(\"keydown\", cancel, true);\n document.addEventListener(\"pointerdown\", cancel, true);\n detach = () => {\n wrapper?.removeEventListener(\"transitionend\", retry);\n document.removeEventListener(\"keydown\", cancel, true);\n document.removeEventListener(\"pointerdown\", cancel, true);\n };\n }\n onBeforeUnmount(() => {\n disposed = true;\n reset();\n });\n return { focus, reset };\n}\n"
1039
+ },
1040
+ {
1041
+ "path": "registry/orvui/motion/popover/src/MorphPopover.vue",
1042
+ "target": "~/src/components/orvui/motion/popover/src/MorphPopover.vue",
1043
+ "type": "registry:component",
1044
+ "content": "<script setup lang=\"ts\">\nimport { provide } from \"vue\";\nimport {\n createPopover,\n popoverKey,\n hoverGesture,\n type PopoverProps,\n} from \"./context\";\nconst props = withDefaults(\n defineProps<{ open?: boolean; defaultOpen?: boolean; className?: string }>(),\n { open: undefined },\n);\nconst emit = defineEmits([\"update:open\", \"openChange\"]);\nconst state = createPopover(props, emit, \"morph\");\nconst root = state.root;\nconst hover = hoverGesture();\nprovide(popoverKey, state);\nfunction enter(event: PointerEvent) {\n if (false && hover.enter(event)) state.openHover();\n}\nfunction leave(event: PointerEvent) {\n if (false && hover.leave(event)) state.scheduleClose();\n}\n</script>\n<template>\n <div\n ref=\"root\"\n :class=\"['relative inline-flex', className]\"\n @pointerenter=\"enter\"\n @pointerleave=\"leave\"\n >\n <slot :open=\"state.open.value\" />\n </div>\n</template>\n"
1045
+ },
1046
+ {
1047
+ "path": "registry/orvui/motion/popover/src/MorphPopoverContent.vue",
1048
+ "target": "~/src/components/orvui/motion/popover/src/MorphPopoverContent.vue",
1049
+ "type": "registry:component",
1050
+ "content": "<script setup lang=\"ts\">\ndefineOptions({ inheritAttrs: false });\nimport {\n computed,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n watch,\n type Ref,\n} from \"vue\";\nimport { animate, motion, motionValue, useTransform } from \"motion-v\";\nimport { EASE_OUT } from \"../../../lib/ease\";\nimport { cn } from \"../../../lib/utils\";\nimport { resolveElement } from \"../../../lib/composables\";\nimport { usePopover, usePortalPosition } from \"./context\";\nimport { createMorphFocus } from \"./morph-focus\";\nconst props = withDefaults(\n defineProps<{\n side?: \"top\" | \"bottom\";\n align?: \"start\" | \"end\";\n sideOffset?: number;\n radius?: number;\n shadow?: boolean;\n initialFocus?: HTMLElement | Ref<HTMLElement | null> | null;\n onOpenAutoFocus?: (content: HTMLDivElement) => void;\n className?: string;\n }>(),\n { side: \"bottom\", align: \"end\", sideOffset: 8, radius: 16, shadow: true },\n);\nconst state = usePopover();\nconst mounted = ref(false);\nconst present = ref(state.open.value);\nconst panel = ref<unknown>(null);\nconst measured = computed({\n get: () => resolveElement<HTMLElement>(panel.value),\n set: (value) => {\n panel.value = value;\n },\n});\nconst layout = usePortalPosition(\n state.anchor,\n measured,\n computed(() => mounted.value && state.open.value),\n);\nconst progress = motionValue(0);\nconst fade = motionValue(state.reduce.value ? 0 : 1);\nconst focus = createMorphFocus(\n props,\n () => state.open.value && !!layout.value,\n state.takeFocusOnOpen,\n);\nwatch(\n panel,\n (value) => {\n state.content.value = resolveElement<HTMLElement>(value);\n },\n { flush: \"post\" },\n);\nconst placement = computed(() => {\n const box = layout.value;\n if (!box) return { left: 0, top: 0, side: props.side, available: 0 };\n const gutter = 12;\n const free = {\n bottom: Math.max(\n 0,\n window.innerHeight -\n box.trigger.top -\n box.trigger.height -\n props.sideOffset -\n gutter,\n ),\n top: Math.max(0, box.trigger.top - props.sideOffset - gutter),\n };\n const alternative = props.side === \"top\" ? \"bottom\" : \"top\";\n const side =\n box.content.height > free[props.side] &&\n free[alternative] > free[props.side]\n ? alternative\n : props.side;\n const preferred =\n box.trigger.left +\n (props.align === \"end\" ? box.trigger.width - box.content.width : 0);\n return {\n left: Math.max(\n gutter,\n Math.min(preferred, window.innerWidth - box.content.width - gutter),\n ),\n top:\n side === \"bottom\"\n ? box.trigger.top + box.trigger.height + props.sideOffset\n : Math.max(\n gutter,\n box.trigger.top - box.content.height - props.sideOffset,\n ),\n side,\n available: free[side],\n };\n});\nconst clipPath = useTransform(() => {\n const inset = 92 * (1 - progress.get());\n return `inset(${placement.value.side === \"top\" ? inset : 0}% ${props.align === \"start\" ? inset : 0}% ${placement.value.side === \"bottom\" ? inset : 0}% ${props.align === \"end\" ? inset : 0}% round ${props.radius}px)`;\n});\nconst opacity = useTransform(progress, [0, 0.15], [0, 1]);\nlet animation: ReturnType<typeof animate> | undefined;\nlet revision = 0;\nlet disposed = false;\nfunction run() {\n animation?.stop();\n if (!mounted.value || !layout.value || disposed) return;\n const version = ++revision;\n const opened = state.open.value;\n const done = () => {\n if (!disposed && version === revision && !opened && !state.open.value)\n present.value = false;\n };\n if (state.reduce.value) {\n progress.jump(1);\n animation = animate(fade, opened ? 1 : 0, {\n duration: 0.12,\n onComplete: done,\n });\n } else\n animation = animate(progress, opened ? 1 : 0, {\n ...(opened\n ? { type: \"spring\", duration: 0.26, bounce: 0 }\n : { duration: 0.2, ease: EASE_OUT }),\n onComplete: done,\n });\n void focus.focus(state.content.value);\n}\nwatch(\n state.open,\n async (opened) => {\n focus.reset();\n ++revision;\n if (opened) {\n layout.value = null;\n progress.jump(0);\n fade.jump(state.reduce.value ? 0 : 1);\n present.value = true;\n await nextTick();\n }\n run();\n },\n { flush: \"post\" },\n);\nwatch(\n () => !!layout.value,\n (ready) => {\n if (ready) run();\n },\n { flush: \"post\" },\n);\nonMounted(() => {\n mounted.value = true;\n present.value = state.open.value;\n});\nonBeforeUnmount(() => {\n disposed = true;\n ++revision;\n animation?.stop();\n progress.destroy();\n fade.destroy();\n state.content.value = null;\n});\n</script>\n<template>\n <Teleport v-if=\"mounted\" to=\"body\"\n ><motion.div\n v-if=\"present\"\n data-morph-popover-portal=\"\"\n :inert=\"!state.open.value\"\n :style=\"{\n left: placement.left + 'px',\n top: placement.top + 'px',\n opacity: state.reduce.value ? fade : opacity,\n pointerEvents: state.open.value ? 'auto' : 'none',\n visibility: layout ? 'visible' : 'hidden',\n }\"\n :class=\"[\n 'fixed z-[9999]',\n shadow\n ? '[filter:drop-shadow(0_10px_18px_rgba(0,0,0,0.14))]'\n : undefined,\n ]\"\n ><motion.div\n ref=\"panel\"\n v-bind=\"$attrs\"\n :id=\"state.contentId\"\n role=\"dialog\"\n :aria-labelledby=\"state.triggerId\"\n tabindex=\"-1\"\n :style=\"{\n clipPath: state.reduce.value ? undefined : clipPath,\n borderRadius: props.radius + 'px',\n maxHeight: layout ? placement.available + 'px' : undefined,\n overflowX: 'hidden',\n overflowY: 'auto',\n }\"\n :class=\"\n cn(\n 'overflow-hidden border border-border bg-background outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring',\n $attrs.class as string,\n className,\n )\n \"\n ><slot /></motion.div></motion.div\n ></Teleport>\n</template>\n"
1051
+ },
1052
+ {
1053
+ "path": "registry/orvui/motion/popover/src/MorphPopoverTrigger.vue",
1054
+ "target": "~/src/components/orvui/motion/popover/src/MorphPopoverTrigger.vue",
1055
+ "type": "registry:component",
1056
+ "content": "<script lang=\"ts\">\nimport PopoverTrigger from \"./PopoverTrigger.vue\";\nexport default PopoverTrigger;\n</script>\n"
1057
+ },
1058
+ {
1059
+ "path": "registry/orvui/motion/popover/src/Popover.vue",
1060
+ "target": "~/src/components/orvui/motion/popover/src/Popover.vue",
1061
+ "type": "registry:component",
1062
+ "content": "<script setup lang=\"ts\">\nimport { provide } from \"vue\";\nimport {\n createPopover,\n popoverKey,\n hoverGesture,\n type PopoverProps,\n} from \"./context\";\nconst props = withDefaults(defineProps<PopoverProps>(), {\n open: undefined,\n defaultOpen: false,\n trigger: \"click\",\n side: \"bottom\",\n align: \"center\",\n sideOffset: 14,\n panelRadius: 16,\n gooStrength: 8,\n});\nconst emit = defineEmits([\"update:open\", \"openChange\"]);\nconst state = createPopover(props, emit, \"goo\");\nconst root = state.root;\nconst hover = hoverGesture();\nprovide(popoverKey, state);\nfunction enter(event: PointerEvent) {\n if (props.trigger === \"hover\" && hover.enter(event)) state.openHover();\n}\nfunction leave(event: PointerEvent) {\n if (props.trigger === \"hover\" && hover.leave(event)) state.scheduleClose();\n}\n</script>\n<template>\n <div\n ref=\"root\"\n :class=\"['relative inline-flex isolate', className]\"\n @pointerenter=\"enter\"\n @pointerleave=\"leave\"\n >\n <slot :open=\"state.open.value\" />\n </div>\n</template>\n"
1063
+ },
1064
+ {
1065
+ "path": "registry/orvui/motion/popover/src/PopoverContent.vue",
1066
+ "target": "~/src/components/orvui/motion/popover/src/PopoverContent.vue",
1067
+ "type": "registry:component",
1068
+ "content": "<script setup lang=\"ts\">\ndefineOptions({ inheritAttrs: false });\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from \"vue\";\nimport { cn } from \"../../../lib/utils\";\nimport { usePopover, usePortalPosition, hoverGesture } from \"./context\";\nimport { buildGeo, clipForProgress, triggerCutout } from \"./geometry\";\ndefineProps<{ className?: string }>();\nconst state = usePopover();\nconst mounted = ref(false);\nconst measure = state.content;\nconst layout = usePortalPosition(state.anchor, measure, mounted);\nconst blob = ref<HTMLElement | null>(null);\nconst clip = ref<HTMLElement | null>(null);\nconst resting = ref(!state.open.value && state.progress.get() === 0);\nconst shape = ref(false);\nconst contentHover = hoverGesture();\nconst corridorHover = hoverGesture();\nconst geometry = computed(() => {\n const size = layout.value;\n return buildGeo(\n size?.trigger.width ?? 0,\n size?.trigger.height ?? 0,\n size?.content.width ?? 0,\n size?.content.height ?? 0,\n state.p.side ?? \"bottom\",\n state.p.align ?? \"center\",\n state.p.sideOffset ?? 14,\n state.p.panelRadius ?? 16,\n );\n});\nconst bounds = computed(() => ({\n left: geometry.value.left + \"px\",\n top: geometry.value.top + \"px\",\n width: geometry.value.layerW + \"px\",\n height: geometry.value.layerH + \"px\",\n}));\nconst triggerRect = computed(() => {\n const box = geometry.value.trigger;\n return {\n left: box.x + \"px\",\n top: box.y + \"px\",\n width: box.w + \"px\",\n height: box.h + \"px\",\n borderRadius: box.r + \"px\",\n };\n});\nlet stopChange: (() => void) | undefined;\nlet stopComplete: (() => void) | undefined;\nfunction paint() {\n if (!geometry.value.layerW) return;\n const path = clipForProgress(\n geometry.value,\n state.progress.get(),\n shape.value,\n );\n for (const element of [blob.value, clip.value])\n if (element) element.style.clipPath = path;\n}\nfunction enter(event: PointerEvent, surface: \"content\" | \"clip\") {\n if (\n state.p.trigger !== \"hover\" ||\n !(surface === \"content\" ? contentHover : corridorHover).enter(event)\n )\n return;\n surface === \"content\" ? state.openHover() : state.cancelClose();\n}\nfunction leave(event: PointerEvent, surface: \"content\" | \"clip\") {\n if (\n state.p.trigger === \"hover\" &&\n (surface === \"content\" ? contentHover : corridorHover).leave(event)\n )\n state.scheduleClose();\n}\nwatch(state.open, (open) => {\n if (open) resting.value = false;\n});\nwatch([geometry, blob, clip], paint, { flush: \"post\" });\nonMounted(() => {\n mounted.value = true;\n shape.value =\n typeof CSS !== \"undefined\" &&\n typeof CSS.supports === \"function\" &&\n CSS.supports(\"clip-path\", \"shape(from 0px 0px, line to 1px 1px, close)\");\n stopChange = state.progress.on(\"change\", paint);\n stopComplete = state.progress.on(\"animationComplete\", () => {\n if (!state.open.value && state.progress.get() === 0) resting.value = true;\n });\n});\nonBeforeUnmount(() => {\n stopChange?.();\n stopComplete?.();\n measure.value = null;\n});\n</script>\n<template>\n <Teleport v-if=\"mounted\" to=\"body\"\n ><div\n data-popover-portal=\"\"\n class=\"pointer-events-none fixed top-0 left-0 z-[9999] isolate size-0\"\n :style=\"{\n visibility: layout && !resting ? 'visible' : 'hidden',\n transform: `translate3d(${layout?.trigger.left ?? 0}px,${layout?.trigger.top ?? 0}px,0)`,\n }\"\n >\n <svg aria-hidden=\"true\" width=\"0\" height=\"0\" class=\"absolute\">\n <title>Popover visual effects</title>\n <defs>\n <filter\n :id=\"state.gooId\"\n x=\"-50%\"\n y=\"-50%\"\n width=\"200%\"\n height=\"200%\"\n >\n <feGaussianBlur\n in=\"SourceGraphic\"\n :stdDeviation=\"state.p.gooStrength ?? 8\"\n result=\"blur\"\n />\n <feColorMatrix\n in=\"blur\"\n mode=\"matrix\"\n values=\"1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 22 -10\"\n result=\"goo\"\n />\n <feComposite in=\"SourceGraphic\" in2=\"goo\" operator=\"atop\" />\n </filter>\n </defs>\n </svg>\n <div\n aria-hidden=\"true\"\n class=\"pointer-events-none absolute z-[-1]\"\n :style=\"{\n ...bounds,\n filter: state.reduce.value ? undefined : `url(#${state.gooId})`,\n clipPath: triggerCutout(geometry),\n }\"\n >\n <div class=\"absolute bg-popover\" :style=\"triggerRect\" />\n <div\n ref=\"blob\"\n class=\"absolute inset-0 bg-popover\"\n :style=\"{\n clipPath: clipForProgress(geometry, state.progress.get(), false),\n }\"\n />\n </div>\n <div class=\"pointer-events-none absolute z-10\" :style=\"bounds\">\n <div\n ref=\"clip\"\n :inert=\"!state.open.value\"\n data-popover-interactive-clip=\"\"\n @pointerenter=\"enter($event, 'clip')\"\n @pointerleave=\"leave($event, 'clip')\"\n class=\"absolute inset-0\"\n :style=\"{\n clipPath: clipForProgress(geometry, state.progress.get(), false),\n pointerEvents: state.open.value ? 'auto' : 'none',\n }\"\n >\n <div\n ref=\"measure\"\n v-bind=\"$attrs\"\n :id=\"state.contentId\"\n role=\"dialog\"\n :aria-labelledby=\"state.triggerId\"\n :aria-hidden=\"!state.open.value\"\n @pointerenter=\"enter($event, 'content')\"\n @pointerleave=\"leave($event, 'content')\"\n :style=\"{\n position: 'absolute',\n left: geometry.panel.x + 'px',\n top: geometry.panel.y + 'px',\n transformOrigin: `${state.p.align === 'start' ? 'left' : state.p.align === 'end' ? 'right' : 'center'} ${state.p.side === 'top' ? 'bottom' : 'top'}`,\n }\"\n :class=\"\n cn(\n 'w-max max-w-[min(92vw,20rem)] p-4 text-popover-foreground outline-none',\n $attrs.class as string,\n className,\n )\n \"\n >\n <slot />\n </div>\n </div>\n </div></div\n ></Teleport>\n</template>\n"
1069
+ },
1070
+ {
1071
+ "path": "registry/orvui/motion/popover/src/PopoverTrigger.vue",
1072
+ "target": "~/src/components/orvui/motion/popover/src/PopoverTrigger.vue",
1073
+ "type": "registry:component",
1074
+ "content": "<script lang=\"ts\">\nimport {\n Comment,\n Fragment,\n Text,\n cloneVNode,\n defineComponent,\n h,\n onBeforeUnmount,\n type VNode,\n} from \"vue\";\nimport { resolveElement } from \"../../../lib/composables\";\nimport { usePopover } from \"./context\";\nfunction flatten(nodes: VNode[]): VNode[] {\n return nodes.flatMap((node) =>\n node.type === Fragment\n ? flatten(node.children as VNode[])\n : node.type === Comment\n ? []\n : [node],\n );\n}\nexport default defineComponent({\n name: \"PopoverTrigger\",\n inheritAttrs: false,\n setup(_, { attrs, slots }) {\n const state = usePopover();\n let keyboard = false;\n let contact: { kind: string; opened: boolean } | undefined;\n onBeforeUnmount(() => {\n state.trigger.value = null;\n });\n const click = (event: MouseEvent) => {\n if (event.defaultPrevented) return;\n if (state.kind === \"morph\") {\n state.armFocusOnOpen(\n !state.open.value && keyboard && event.detail === 0,\n );\n keyboard = false;\n state.toggle();\n } else if (state.p.trigger !== \"hover\") state.toggle();\n else {\n const gesture = contact;\n contact = undefined;\n if (gesture && gesture.kind !== \"mouse\") state.setOpen(!gesture.opened);\n }\n };\n return () => {\n const nodes = flatten(slots.default?.() ?? []);\n const child =\n nodes.length === 1 && nodes[0]!.type !== Text\n ? nodes[0]!\n : h(\n \"button\",\n {\n type: \"button\",\n class:\n \"inline-flex items-center rounded-full border border-border bg-background px-4 py-2 text-sm\",\n },\n nodes,\n );\n return cloneVNode(\n child,\n {\n ...attrs,\n ref: (node: unknown) => {\n state.trigger.value = resolveElement<HTMLElement>(node);\n },\n id: state.triggerId,\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": state.open.value,\n \"aria-controls\": state.open.value ? state.contentId : undefined,\n \"data-state\": state.open.value ? \"open\" : \"closed\",\n class: [\n attrs.class,\n state.kind === \"goo\" ? \"relative z-0\" : undefined,\n ],\n onPointerdown: (event: PointerEvent) => {\n keyboard = false;\n contact = { kind: event.pointerType, opened: state.open.value };\n },\n onPointercancel: () => {\n contact = undefined;\n },\n onKeydown: (event: KeyboardEvent) => {\n contact = undefined;\n keyboard = event.key === \"Enter\" || event.key === \" \";\n },\n onFocus: (event: FocusEvent) => {\n if (\n !event.defaultPrevented &&\n state.kind === \"goo\" &&\n state.p.trigger === \"hover\"\n )\n state.openHover();\n },\n onBlur: (event: FocusEvent) => {\n if (\n !event.defaultPrevented &&\n state.kind === \"goo\" &&\n state.p.trigger === \"hover\"\n )\n state.scheduleClose();\n },\n onClick: click,\n },\n true,\n );\n };\n },\n});\n</script>\n"
1075
+ },
1076
+ {
1077
+ "path": "registry/orvui/motion/preview-rail/index.ts",
1078
+ "target": "~/src/components/orvui/motion/preview-rail/index.ts",
1079
+ "type": "registry:lib",
1080
+ "content": "export { default as PreviewRail } from \"./src/PreviewRail.vue\";\n\nexport type * from \"./src/api-types\";\n\nexport type * from \"./src/public-types\";\n"
1081
+ },
1082
+ {
1083
+ "path": "registry/orvui/motion/preview-rail/src/api-types.ts",
1084
+ "target": "~/src/components/orvui/motion/preview-rail/src/api-types.ts",
1085
+ "type": "registry:lib",
1086
+ "content": "// Vue public prop types, derived from the actual components.\nexport type PreviewRailProps = InstanceType<\n (typeof import(\"./PreviewRail.vue\"))[\"default\"]\n>[\"$props\"];\n"
1087
+ },
1088
+ {
1089
+ "path": "registry/orvui/motion/preview-rail/src/PreviewRail.vue",
1090
+ "target": "~/src/components/orvui/motion/preview-rail/src/PreviewRail.vue",
1091
+ "type": "registry:component",
1092
+ "content": "<script setup lang=\"ts\">\nimport { computed, ref, useId } from \"vue\";\nimport { AnimatePresence, motion } from \"motion-v\";\nimport { cn } from \"../../../lib/utils\";\nimport { EASE_OUT, SPRING_LAYOUT } from \"../../../lib/ease\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nimport { useMotionState } from \"../../state\";\nimport { useRailState, type RailEntry } from \"./rail-state\";\ninterface RailItem extends RailEntry {}\nconst props = withDefaults(defineProps<{ items: RailItem[]; label?: string; orientation?: \"vertical\" | \"horizontal\"; activeId?: string; defaultActiveId?: string; showPreview?: boolean; previewSide?: \"before\" | \"after\"; highlightActive?: boolean; itemSize?: number; railClassName?: string; previewContainerClassName?: string; previewClassName?: string }>(), { label: \"Section navigation\", orientation: \"vertical\", showPreview: true, previewSide: \"after\", highlightActive: false, itemSize: 24 });\nconst emit = defineEmits<{ \"update:activeId\": [id: string]; activeChange: [id: string]; itemSelect: [item: RailItem] }>();\nconst root = ref<HTMLElement | null>(null);\nconst active = useMotionState(props, emit, \"activeId\", props.defaultActiveId ?? props.items[0]?.id ?? \"\");\nconst state = useRailState(root, props, active, emit);\nconst reduced = useReducedMotion();\nconst id = useId();\nconst horizontal = computed(() => props.orientation === \"horizontal\");\nconst grid = computed(() => { const tracks = props.items.length ? `repeat(${props.items.length}, ${props.itemSize}px)` : undefined; return horizontal.value ? { gridTemplateColumns: tracks } : { gridTemplateRows: tracks }; });\nconst dimension = computed(() => horizontal.value ? { width: `${props.itemSize}px` } : { height: `${props.itemSize}px` });\n</script>\n<template>\n <div ref=\"root\" @focusout=\"state.blur\" :class=\"cn('isolate relative flex w-full overflow-visible', horizontal ? 'min-h-64 flex-col items-center justify-center' : 'min-h-80')\">\n <nav :aria-label=\"label\" @pointerleave=\"state.leave\" :style=\"grid\" :class=\"cn('relative z-10 grid shrink-0', horizontal ? 'h-12 w-fit max-w-full self-center justify-center' : 'w-12 content-center', railClassName)\">\n <component :is=\"item.href ? 'a' : 'button'\" v-for=\"(item, index) in items\" :key=\"item.id\" data-slot=\"preview-rail-item\" :type=\"item.href ? undefined : 'button'\" :href=\"item.href\" :target=\"item.target\" :rel=\"item.rel ?? (item.target === '_blank' ? 'noreferrer noopener' : undefined)\" :aria-label=\"item.ariaLabel ?? item.label\" :aria-current=\"state.selected.value === item.id ? item.href ? 'page' : 'location' : undefined\" @pointerenter=\"state.enter($event, item)\" @pointerdown=\"state.down($event, item)\" @pointermove=\"state.move\" @pointercancel=\"state.cancel\" @keydown=\"state.cancel\" @focus=\"state.focus($event, item)\" @click=\"state.select($event, item)\" :style=\"dimension\" :class=\"cn('relative flex text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background', horizontal ? 'h-12 w-6 items-end justify-center' : 'h-6 w-12 items-center')\">\n <motion.span data-slot=\"preview-rail-tick\" aria-hidden=\"true\" :animate=\"horizontal ? { scaleY: state.scale(index) } : { scaleX: state.scale(index) }\" :transition=\"reduced ? { duration: 0 } : SPRING_LAYOUT\" :class=\"cn('block bg-current', horizontal ? 'h-12 w-0.5 origin-bottom' : 'h-0.5 w-12 origin-left', state.highlighted.value === item.id && 'text-foreground')\" />\n </component>\n </nav>\n <div v-if=\"showPreview\" aria-hidden=\"true\" :style=\"grid\" :class=\"cn('pointer-events-none absolute z-50 grid', horizontal ? 'top-1/2 left-1/2 h-5 w-fit max-w-full -translate-x-1/2 -translate-y-1/2 justify-center' : previewSide === 'before' ? 'inset-y-0 right-16 left-4 content-center' : 'inset-y-0 right-4 left-16 content-center', previewContainerClassName)\">\n <div v-for=\"item in items\" :key=\"item.id\" :style=\"dimension\" :class=\"cn('relative flex items-center', horizontal && 'justify-center')\"><div v-if=\"item.id === state.preview.value\" :class=\"cn(horizontal ? 'absolute bottom-12 left-1/2 w-72 -translate-x-1/2' : cn('w-full max-w-sm', previewSide === 'before' && 'ml-auto'), previewClassName)\">\n <motion.div :layout-id=\"`preview-rail-card-${id}`\" :transition=\"reduced ? { duration: 0 } : SPRING_LAYOUT\"><AnimatePresence mode=\"wait\" :initial=\"false\"><motion.div :key=\"item.id\" :initial=\"reduced ? { opacity: 0 } : { opacity: 0, y: 4, filter: 'blur(6px)' }\" :animate=\"reduced ? { opacity: 1 } : { opacity: 1, y: 0, filter: 'blur(0px)' }\" :exit=\"reduced ? { opacity: 0 } : { opacity: 0, y: -2, filter: 'blur(4px)', transition: { duration: .12, ease: EASE_OUT } }\" :transition=\"{ duration: reduced ? 0 : .18, ease: EASE_OUT }\"><slot name=\"preview\" :item=\"item\"><div data-slot=\"preview-rail-card\" class=\"rounded-2xl border border-border bg-card p-4 shadow-sm\"><p data-slot=\"preview-rail-title\" class=\"font-medium text-card-foreground\">{{ item.label }}</p><div v-if=\"item.description\" data-slot=\"preview-rail-description\" class=\"mt-1 text-sm leading-6 text-muted-foreground\">{{ item.description }}</div></div></slot></motion.div></AnimatePresence></motion.div>\n </div></div>\n </div>\n <div v-if=\"$slots.default\" class=\"min-h-0 min-w-0 flex-1\"><slot /></div>\n </div>\n</template>\n"
1093
+ },
1094
+ {
1095
+ "path": "registry/orvui/motion/preview-rail/src/public-types.ts",
1096
+ "target": "~/src/components/orvui/motion/preview-rail/src/public-types.ts",
1097
+ "type": "registry:lib",
1098
+ "content": "import type { PreviewRailProps } from \"./api-types\";\nexport type PreviewRailItem = PreviewRailProps[\"items\"][number];\n"
1099
+ },
1100
+ {
1101
+ "path": "registry/orvui/motion/preview-rail/src/rail-state.ts",
1102
+ "target": "~/src/components/orvui/motion/preview-rail/src/rail-state.ts",
1103
+ "type": "registry:lib",
1104
+ "content": "import { computed, onBeforeUnmount, onMounted, ref, type Ref } from \"vue\";\nexport interface RailEntry { id: string; label: string; description?: string; href?: string; ariaLabel?: string; target?: \"_blank\" | \"_self\" | \"_parent\" | \"_top\"; rel?: string }\nexport function useRailState(root: Ref<HTMLElement | null>, props: { items: RailEntry[]; highlightActive: boolean }, active: Ref<string>, emit: { (event: \"activeChange\", value: string): void; (event: \"itemSelect\", value: RailEntry): void }) {\n const hovered = ref<string | null>(null);\n const pinned = ref<string | null>(null);\n const focused = ref<string | null>(null);\n const selected = computed(() => props.items.some(item => item.id === active.value) ? active.value : props.items[0]?.id ?? \"\");\n const preview = computed(() => hovered.value ?? pinned.value ?? focused.value ?? \"\");\n const highlighted = computed(() => preview.value || (props.highlightActive ? selected.value : \"\"));\n const index = computed(() => props.items.findIndex(item => item.id === highlighted.value));\n let pointer: { id: number; kind: string; x: number; y: number; pinned: boolean } | undefined;\n function down(event: PointerEvent, item: RailEntry) { pointer = { id: event.pointerId, kind: event.pointerType, x: event.clientX, y: event.clientY, pinned: pinned.value === item.id }; focused.value = null; }\n function move(event: PointerEvent) { if (pointer && Math.hypot(event.clientX - pointer.x, event.clientY - pointer.y) > 10) pointer = undefined; }\n function cancel() { pointer = undefined; }\n function focus(event: FocusEvent, item: RailEntry) { if ((event.currentTarget as HTMLElement).matches(\":focus-visible\")) focused.value = item.id; }\n function select(event: MouseEvent, item: RailEntry) { const gesture = pointer; cancel(); if (gesture && gesture.kind !== \"mouse\") { pinned.value = item.id; if (item.href && !gesture.pinned) { event.preventDefault(); return; } } active.value = item.id; emit(\"activeChange\", item.id); emit(\"itemSelect\", item); }\n function enter(event: PointerEvent, item: RailEntry) { if (event.pointerType !== \"touch\") hovered.value = item.id; }\n function leave(event: PointerEvent) { if (event.pointerType !== \"touch\") hovered.value = null; }\n function outside(event: PointerEvent) { if (!root.value?.contains(event.target as Node)) pinned.value = null; }\n function blur(event: FocusEvent) { if (!root.value?.contains(event.relatedTarget as Node)) { focused.value = null; pinned.value = null; } }\n function scale(at: number) { const distance = index.value < 0 ? Infinity : Math.abs(at - index.value); return [1, .68, .44][distance] ?? .25; }\n let owner: Document | undefined;\n onMounted(() => { owner = root.value?.ownerDocument ?? document; owner.addEventListener(\"pointerdown\", outside); });\n onBeforeUnmount(() => { owner?.removeEventListener(\"pointerdown\", outside); cancel(); });\n return { selected, preview, highlighted, down, move, cancel, focus, select, enter, leave, blur, scale };\n}\n"
1105
+ },
1106
+ {
1107
+ "path": "registry/orvui/motion/radio/index.ts",
1108
+ "target": "~/src/components/orvui/motion/radio/index.ts",
1109
+ "type": "registry:lib",
1110
+ "content": "export { default as RadioGroup } from \"./src/RadioGroup.vue\";\nexport { default as RadioGroupItem } from \"./src/RadioGroupItem.vue\";\n\nexport type * from \"./src/api-types\";\n"
1111
+ },
1112
+ {
1113
+ "path": "registry/orvui/motion/radio/src/api-types.ts",
1114
+ "target": "~/src/components/orvui/motion/radio/src/api-types.ts",
1115
+ "type": "registry:lib",
1116
+ "content": "// Vue public prop types, derived from the actual components.\nexport type RadioGroupItemProps = InstanceType<\n (typeof import(\"./RadioGroupItem.vue\"))[\"default\"]\n>[\"$props\"];\nexport type RadioGroupProps = InstanceType<\n (typeof import(\"./RadioGroup.vue\"))[\"default\"]\n>[\"$props\"];\n"
1117
+ },
1118
+ {
1119
+ "path": "registry/orvui/motion/radio/src/context.ts",
1120
+ "target": "~/src/components/orvui/motion/radio/src/context.ts",
1121
+ "type": "registry:lib",
1122
+ "content": "import type { ComputedRef, WritableComputedRef } from \"vue\";\nexport interface RadioContext {\n value: WritableComputedRef<string>;\n id: string;\n name: ComputedRef<string>;\n tabStop: ComputedRef<string | null>;\n register(value: string, disabled: boolean): void;\n unregister(value: string): void;\n setValue(value: string): void;\n}\n"
1123
+ },
1124
+ {
1125
+ "path": "registry/orvui/motion/radio/src/RadioGroup.vue",
1126
+ "target": "~/src/components/orvui/motion/radio/src/RadioGroup.vue",
1127
+ "type": "registry:component",
1128
+ "content": "<script setup lang=\"ts\">\nimport { computed, provide, shallowRef, useId } from \"vue\";\nimport { cn } from \"../../../lib/utils\";\nimport { useMotionState } from \"../../state\";\nimport type { RadioContext } from \"./context\";\n\nconst props = withDefaults(defineProps<{\n modelValue?: string; defaultValue?: string; orientation?: \"vertical\" | \"horizontal\"; name?: string;\n}>(), { defaultValue: \"\", orientation: \"vertical\" });\nconst emit = defineEmits([\"update:modelValue\", \"change\"]);\nconst selected = useMotionState(props, emit, \"modelValue\", props.defaultValue);\nconst instanceId = useId();\nconst registry = shallowRef(new Map<string, boolean>());\nconst tabStop = computed(() => {\n const enabled = [...registry.value].filter(([, disabled]) => !disabled).map(([key]) => key);\n if (!registry.value.size) return null;\n return enabled.includes(selected.value) ? selected.value : enabled[0] ?? \"\";\n});\nconst context: RadioContext = {\n value: selected, id: instanceId, name: computed(() => props.name ?? instanceId), tabStop,\n register(key, disabled) {\n if (registry.value.has(key) && registry.value.get(key) === disabled) return;\n registry.value = new Map([...registry.value, [key, disabled]]);\n },\n unregister(key) {\n const remaining = new Map(registry.value);\n remaining.delete(key);\n registry.value = remaining;\n },\n setValue(next) { selected.value = next; },\n};\nprovide(\"orvui-radio\", context);\nfunction navigate(event: KeyboardEvent) {\n if (event.defaultPrevented) return;\n const root = event.currentTarget as HTMLElement;\n const controls = [...root.querySelectorAll<HTMLButtonElement>('[role=\"radio\"]')]\n .filter(control => !control.disabled && control.closest('[role=\"radiogroup\"]') === root);\n const active = event.target === root ? root.ownerDocument.activeElement : event.target;\n const index = controls.indexOf(active as HTMLButtonElement);\n if (index < 0 || !controls.length) return;\n let destination: number;\n switch (event.key) {\n case \"Home\": destination = 0; break;\n case \"End\": destination = controls.length - 1; break;\n case \"ArrowRight\": case \"ArrowDown\": destination = (index + 1) % controls.length; break;\n case \"ArrowLeft\": case \"ArrowUp\": destination = (index + controls.length - 1) % controls.length; break;\n default: return;\n }\n event.preventDefault();\n controls[destination]!.focus();\n controls[destination]!.click();\n}\n</script>\n\n<template>\n <div role=\"radiogroup\" :aria-orientation=\"orientation\" @keydown=\"navigate\"\n :class=\"cn('flex gap-3', orientation === 'vertical' ? 'flex-col' : 'flex-row flex-wrap', $attrs.class)\">\n <slot />\n </div>\n</template>\n"
1129
+ },
1130
+ {
1131
+ "path": "registry/orvui/motion/radio/src/RadioGroupItem.vue",
1132
+ "target": "~/src/components/orvui/motion/radio/src/RadioGroupItem.vue",
1133
+ "type": "registry:component",
1134
+ "content": "<script setup lang=\"ts\">\ndefineOptions({ inheritAttrs: false });\nimport { computed, inject, onBeforeUnmount, onMounted, useId, watch } from \"vue\";\nimport { motion } from \"motion-v\";\nimport { cn } from \"../../../lib/utils\";\nimport { SPRING_LAYOUT, SPRING_PRESS } from \"../../../lib/ease\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nimport type { RadioContext } from \"./context\";\n\nconst props = defineProps<{ value: string; label?: string; description?: string; disabled?: boolean; id?: string }>();\nconst group = inject<RadioContext>(\"orvui-radio\");\nif (!group) throw new Error(\"RadioGroupItem must be inside RadioGroup\");\nconst generatedId = useId(), reduced = useReducedMotion();\nconst controlId = computed(() => props.id ?? generatedId);\nconst selected = computed(() => props.value === group.value.value);\nconst labelId = computed(() => props.description && props.label ? `${controlId.value}-label` : undefined);\nconst isTabStop = computed(() => !props.disabled && (group.tabStop.value === null || group.tabStop.value === props.value));\nfunction select(event: MouseEvent) { if (!props.disabled && !event.defaultPrevented) group!.setValue(props.value); }\nonMounted(() => group.register(props.value, !!props.disabled));\nwatch(() => [props.value, props.disabled] as const, ([value, disabled], [previous]) => {\n if (value !== previous) group.unregister(previous);\n group.register(value, !!disabled);\n});\nonBeforeUnmount(() => group.unregister(props.value));\n</script>\n\n<template>\n <label :for=\"controlId\" :style=\"$attrs.style as any\"\n :class=\"cn('inline-flex gap-3', description ? 'items-start' : 'items-center', disabled ? 'cursor-not-allowed' : 'cursor-pointer', $attrs.class as string)\">\n <motion.button v-bind=\"{ ...$attrs, class: undefined, style: undefined }\" :id=\"controlId\"\n type=\"button\" role=\"radio\" :aria-checked=\"selected\" :aria-labelledby=\"labelId\"\n :aria-describedby=\"[$attrs['aria-describedby'] as string, description ? `${controlId}-description` : undefined].filter(Boolean).join(' ') || undefined\"\n :disabled=\"disabled\" :tabindex=\"isTabStop ? 0 : -1\" :data-state=\"selected ? 'checked' : 'unchecked'\" @click=\"select\"\n :while-press=\"reduced || disabled ? undefined : { scale: 0.92 }\" :transition=\"SPRING_PRESS\"\n :class=\"cn('relative inline-flex h-5 w-5 shrink-0 items-center justify-center rounded-full border-2 outline-none transition-colors duration-200 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-60', selected ? 'border-primary' : 'border-muted-foreground/65 hover:border-muted-foreground')\">\n <motion.span v-if=\"selected\" :layout-id=\"group.id\" :transition=\"reduced ? { duration: 0 } : SPRING_LAYOUT\"\n class=\"absolute inset-1 rounded-full bg-primary\" />\n </motion.button>\n <input type=\"radio\" :name=\"group.name.value\" :value=\"value\" :checked=\"selected\" :disabled=\"disabled\" hidden />\n <span v-if=\"label || description\" :class=\"cn('flex min-w-0 flex-col gap-0.5 select-none', disabled && 'opacity-60')\">\n <span v-if=\"label\" :id=\"labelId\" :class=\"cn('text-sm text-foreground', description && 'leading-4')\">{{ label }}</span>\n <span v-if=\"description\" :id=\"controlId + '-description'\" class=\"text-xs text-muted-foreground\">{{ description }}</span>\n </span>\n </label>\n</template>\n"
1135
+ },
1136
+ {
1137
+ "path": "registry/orvui/motion/select/index.ts",
1138
+ "target": "~/src/components/orvui/motion/select/index.ts",
1139
+ "type": "registry:lib",
1140
+ "content": "export { default as Select } from \"./src/Select.vue\";\nexport { default as SelectTrigger } from \"./src/SelectTrigger.vue\";\nexport { default as SelectValue } from \"./src/SelectValue.vue\";\nexport { default as SelectContent } from \"./src/SelectContent.vue\";\nexport { default as SelectItem } from \"./src/SelectItem.vue\";\n\nexport { default as MorphSelect } from \"./src/MorphSelect.vue\";\nexport { default as MorphSelectTrigger } from \"./src/MorphSelectTrigger.vue\";\nexport { default as MorphSelectValue } from \"./src/MorphSelectValue.vue\";\nexport { default as MorphSelectContent } from \"./src/MorphSelectContent.vue\";\nexport { default as MorphSelectItem } from \"./src/MorphSelectItem.vue\";\n\nexport type * from \"./src/api-types\";\n"
1141
+ },
1142
+ {
1143
+ "path": "registry/orvui/motion/select/src/api-types.ts",
1144
+ "target": "~/src/components/orvui/motion/select/src/api-types.ts",
1145
+ "type": "registry:lib",
1146
+ "content": "// Vue public prop types, derived from the actual components.\nexport type MorphSelectContentProps = InstanceType<\n (typeof import(\"./MorphSelectContent.vue\"))[\"default\"]\n>[\"$props\"];\nexport type MorphSelectItemProps = InstanceType<\n (typeof import(\"./MorphSelectItem.vue\"))[\"default\"]\n>[\"$props\"];\nexport type MorphSelectProps = InstanceType<\n (typeof import(\"./MorphSelect.vue\"))[\"default\"]\n>[\"$props\"];\nexport type MorphSelectTriggerProps = InstanceType<\n (typeof import(\"./MorphSelectTrigger.vue\"))[\"default\"]\n>[\"$props\"];\nexport type MorphSelectValueProps = InstanceType<\n (typeof import(\"./MorphSelectValue.vue\"))[\"default\"]\n>[\"$props\"];\nexport type SelectContentProps = InstanceType<\n (typeof import(\"./SelectContent.vue\"))[\"default\"]\n>[\"$props\"];\nexport type SelectItemProps = InstanceType<\n (typeof import(\"./SelectItem.vue\"))[\"default\"]\n>[\"$props\"];\nexport type SelectProps = InstanceType<\n (typeof import(\"./Select.vue\"))[\"default\"]\n>[\"$props\"];\nexport type SelectTriggerProps = InstanceType<\n (typeof import(\"./SelectTrigger.vue\"))[\"default\"]\n>[\"$props\"];\nexport type SelectValueProps = InstanceType<\n (typeof import(\"./SelectValue.vue\"))[\"default\"]\n>[\"$props\"];\n"
1147
+ },
1148
+ {
1149
+ "path": "registry/orvui/motion/select/src/context.ts",
1150
+ "target": "~/src/components/orvui/motion/select/src/context.ts",
1151
+ "type": "registry:lib",
1152
+ "content": "import {\n computed,\n inject,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n shallowRef,\n useId,\n watch,\n type InjectionKey,\n} from \"vue\";\nimport { animate, motionValue } from \"motion-v\";\nimport { EASE_OUT } from \"../../../lib/ease\";\nimport {\n resolveElement,\n useFloatingLayer,\n useReducedMotion,\n} from \"../../../lib/composables\";\nexport interface SelectProps {\n modelValue?: string;\n value?: string;\n defaultValue?: string;\n open?: boolean;\n defaultOpen?: boolean;\n disabled?: boolean;\n className?: string;\n}\n// These visual endpoints and timings are part of the frozen interaction contract.\nexport const UNFOLD_SPRING = {\n type: \"spring\",\n visualDuration: 0.2,\n bounce: 0.12,\n} as const;\nexport const UNFOLD_EXIT = { duration: 0.2, ease: EASE_OUT } as const;\nexport const MORPH = { type: \"spring\", duration: 0.5, bounce: 0.22 } as const;\nexport const ROW =\n \"flex w-full items-center justify-between gap-2 px-3.5 py-2.5 text-sm\";\nexport const ITEM_VARIANTS = {\n hidden: { opacity: 0, y: -4, transition: { duration: 0.08, ease: EASE_OUT } },\n show: { opacity: 1, y: 0, transition: { duration: 0.12, ease: EASE_OUT } },\n};\nexport const MORPH_ITEM = {\n hidden: { opacity: 0, y: -6, filter: \"blur(3px)\" },\n show: { opacity: 1, y: 0, filter: \"blur(0px)\" },\n};\ntype Registration = { label: string; disabled: boolean };\nexport function createSelect(\n props: SelectProps,\n emit: (event: any, ...args: any[]) => void,\n morph = false,\n) {\n const instance = useId();\n const root = ref<HTMLElement | null>(null);\n const trigger = shallowRef<unknown>(null);\n const list = shallowRef<unknown>(null);\n const memory = ref(props.defaultValue);\n const expanded = ref(!!props.defaultOpen);\n const reduce = useReducedMotion();\n const placeholder = ref(\"Select\");\n const placement = ref<\"top\" | \"bottom\">(\"bottom\");\n const active = ref<string | null>(null);\n const registry = shallowRef(new Map<string, Map<symbol, Registration>>());\n const value = computed({\n get: () => props.modelValue ?? props.value ?? memory.value,\n set: (next: string | undefined) => {\n if (props.modelValue === undefined && props.value === undefined)\n memory.value = next;\n for (const event of [\"update:modelValue\", \"valueChange\", \"change\"])\n emit(event, next);\n },\n });\n const open = computed({\n get: () => props.open ?? expanded.value,\n set: (next: boolean) => {\n if (props.open === undefined) expanded.value = next;\n emit(\"update:open\", next);\n emit(\"openChange\", next);\n },\n });\n const disabled = computed(() => !!props.disabled);\n const progress = motionValue(open.value ? 1 : 0);\n const rows = computed(() =>\n [...registry.value].map(([id, tokens]) => ({\n id,\n ...[...tokens.values()].at(-1)!,\n })),\n );\n const enabled = computed(() => rows.value.filter((row) => !row.disabled));\n const activeId = computed(\n () =>\n enabled.value.find((row) => row.id === active.value)?.id ??\n enabled.value[0]?.id,\n );\n const layer = useFloatingLayer(open, list);\n let mounted = false;\n let disposed = false;\n let initialOpening = open.value;\n let focusRevision = 0;\n let animation: ReturnType<typeof animate> | undefined;\n let typed = { text: \"\", timestamp: 0 };\n function register(\n id: string,\n label: string,\n disabled: boolean,\n token: symbol,\n ) {\n const entry = registry.value.get(id)?.get(token);\n if (entry?.label === label && entry.disabled === disabled) return;\n const tokens = new Map(registry.value.get(id));\n tokens.set(token, { label, disabled });\n registry.value = new Map([...registry.value, [id, tokens]]);\n }\n function unregister(id: string, token: symbol) {\n const tokens = new Map(registry.value.get(id));\n if (!tokens.delete(token)) return;\n const next = new Map(registry.value);\n if (tokens.size) next.set(id, tokens);\n else next.delete(id);\n registry.value = next;\n }\n async function focusActive() {\n const revision = ++focusRevision;\n await nextTick();\n if (disposed || !open.value || revision !== focusRevision) return;\n const surface = resolveElement<HTMLElement>(list.value);\n const option = [\n ...(surface?.querySelectorAll<HTMLElement>(\"[data-listbox-id]\") ?? []),\n ].find((element) => element.dataset.listboxId === activeId.value);\n option?.focus({ preventScroll: false });\n }\n function close() {\n const source = root.value?.ownerDocument.activeElement;\n const restore =\n source &&\n root.value?.contains(source) &&\n source !== resolveElement(trigger.value);\n ++focusRevision;\n open.value = false;\n if (!restore) return;\n if (!morph) resolveElement<HTMLElement>(trigger.value)?.focus();\n else\n void nextTick(() => {\n if (!disposed && !open.value)\n resolveElement<HTMLElement>(trigger.value)?.focus();\n });\n }\n function select(id: string) {\n if (disabled.value || !enabled.value.some((row) => row.id === id)) return;\n value.value = id;\n close();\n }\n function keydown(event: KeyboardEvent) {\n if (\n event.defaultPrevented ||\n event.isComposing ||\n disabled.value ||\n !enabled.value.length\n )\n return;\n const choices = enabled.value;\n const current = Math.max(\n 0,\n choices.findIndex((row) => row.id === activeId.value),\n );\n const delta =\n event.key === \"ArrowDown\" ? 1 : event.key === \"ArrowUp\" ? -1 : 0;\n if (delta || event.key === \"Home\" || event.key === \"End\") {\n event.preventDefault();\n const next =\n event.key === \"Home\"\n ? 0\n : event.key === \"End\"\n ? choices.length - 1\n : (current + delta + choices.length) % choices.length;\n active.value = choices[next]!.id;\n return;\n }\n if (\n event.key.length !== 1 ||\n event.key === \" \" ||\n event.metaKey ||\n event.ctrlKey ||\n event.altKey\n )\n return;\n const timestamp = Date.now();\n const text =\n timestamp - typed.timestamp < 500\n ? typed.text + event.key.toLocaleLowerCase()\n : event.key.toLocaleLowerCase();\n typed = { timestamp, text };\n const start = text.length === 1 ? current + 1 : current;\n const found = Array.from(\n { length: choices.length },\n (_, offset) => choices[(start + offset) % choices.length]!,\n ).find((row) => row.label.toLocaleLowerCase().startsWith(text));\n if (found) active.value = found.id;\n }\n function animateToState() {\n animation?.stop();\n if (mounted)\n animation = animate(\n progress,\n open.value ? 1 : 0,\n reduce.value\n ? { duration: 0.12 }\n : open.value\n ? UNFOLD_SPRING\n : UNFOLD_EXIT,\n );\n }\n watch(\n open,\n (next, previous) => {\n if (!next) {\n initialOpening = false;\n ++focusRevision;\n return;\n }\n if (!previous)\n active.value =\n enabled.value.find((row) => row.id === value.value)?.id ?? null;\n if (!initialOpening) void focusActive();\n },\n { flush: \"post\" },\n );\n watch(\n activeId,\n () => {\n const surface = resolveElement<HTMLElement>(list.value);\n if (\n open.value &&\n (!initialOpening ||\n surface?.contains(surface.ownerDocument.activeElement))\n )\n void focusActive();\n },\n { flush: \"post\" },\n );\n watch([open, reduce], animateToState, { flush: \"post\" });\n const outside = (event: PointerEvent) => {\n if (\n open.value &&\n !layer.containsHigher(event.target) &&\n event.target instanceof Node &&\n !root.value?.contains(event.target)\n )\n open.value = false;\n };\n const escape = (event: KeyboardEvent) => {\n if (layer.claimEscape(event)) close();\n };\n onMounted(() => {\n mounted = true;\n animateToState();\n window.addEventListener(\"pointerdown\", outside);\n window.addEventListener(\"keydown\", escape);\n });\n onBeforeUnmount(() => {\n disposed = true;\n mounted = false;\n ++focusRevision;\n animation?.stop();\n progress.destroy();\n window.removeEventListener(\"pointerdown\", outside);\n window.removeEventListener(\"keydown\", escape);\n });\n return {\n root,\n trigger,\n list,\n value,\n open,\n progress,\n reduce,\n rows,\n enabled,\n activeId,\n active,\n register,\n unregister,\n close,\n select,\n keydown,\n focusActive,\n placeholder,\n placement,\n morph,\n disabled,\n labelFor: (id: string | undefined) =>\n rows.value.find((row) => row.id === id)?.label,\n triggerId: `${instance}-trigger`,\n listId: `${instance}-list`,\n headerId: `${instance}-header`,\n layoutId: `${instance}-surface`,\n };\n}\nexport const selectKey: InjectionKey<ReturnType<typeof createSelect>> =\n Symbol(\"orvui-select\");\nexport const registrarKey: InjectionKey<boolean> = Symbol(\n \"orvui-select-registrar\",\n);\nexport function useSelect() {\n const state = inject(selectKey);\n if (!state) throw Error(\"Select parts must be inside Select or MorphSelect.\");\n return state;\n}\n"
1153
+ },
1154
+ {
1155
+ "path": "registry/orvui/motion/select/src/MorphSelect.vue",
1156
+ "target": "~/src/components/orvui/motion/select/src/MorphSelect.vue",
1157
+ "type": "registry:component",
1158
+ "content": "<script setup lang=\"ts\">\nimport { provide } from \"vue\";\nimport { createSelect, selectKey, type SelectProps } from \"./context\";\nconst props = withDefaults(defineProps<SelectProps>(), { open: undefined });\nconst emit = defineEmits([\n \"update:modelValue\",\n \"valueChange\",\n \"change\",\n \"update:open\",\n \"openChange\",\n]);\nconst state = createSelect(props, emit, true);\nprovide(selectKey, state);\nconst root = state.root;\n</script>\n<template>\n <div ref=\"root\" :class=\"['relative', className]\">\n <slot :value=\"state.value.value\" :open=\"state.open.value\" />\n </div>\n</template>\n"
1159
+ },
1160
+ {
1161
+ "path": "registry/orvui/motion/select/src/MorphSelectContent.vue",
1162
+ "target": "~/src/components/orvui/motion/select/src/MorphSelectContent.vue",
1163
+ "type": "registry:component",
1164
+ "content": "<script setup lang=\"ts\">\ndefineOptions({ inheritAttrs: false });\nimport { computed } from \"vue\";\nimport { motion, AnimatePresence } from \"motion-v\";\nimport { ChevronDown } from \"lucide-vue-next\";\nimport { MORPH, ROW, useSelect } from \"./context\";\nimport SelectRegistrar from \"./SelectRegistrar.vue\";\ndefineProps<{ className?: string }>();\nconst state = useSelect();\nconst list = state.list;\nconst label = computed(() => state.labelFor(state.value.value));\nconst variants = computed(() =>\n state.reduce.value\n ? undefined\n : {\n hidden: {},\n show: { transition: { staggerChildren: 0.035, delayChildren: 0.08 } },\n },\n);\nfunction key(event: KeyboardEvent) {\n if (event.key === \"Tab\") {\n event.preventDefault();\n state.close();\n } else state.keydown(event);\n}\n</script>\n<template>\n <SelectRegistrar><slot /></SelectRegistrar\n ><AnimatePresence :initial=\"false\" mode=\"popLayout\"\n ><motion.div\n v-if=\"state.open.value\"\n key=\"panel\"\n v-bind=\"$attrs\"\n :layout-id=\"state.layoutId\"\n :transition=\"state.reduce.value ? { duration: 0 } : MORPH\"\n :style=\"{ borderRadius: '12px' }\"\n :class=\"[\n 'absolute inset-x-0 top-0 z-30 overflow-hidden border border-border bg-background shadow-lg',\n className,\n ]\"\n ><motion.button\n type=\"button\"\n :id=\"state.headerId\"\n layout=\"position\"\n aria-haspopup=\"listbox\"\n aria-expanded=\"true\"\n :aria-controls=\"state.listId\"\n @click=\"state.close\"\n :class=\"[ROW, 'outline-none']\"\n ><span\n class=\"min-w-0 truncate\"\n :class=\"label ? 'text-foreground' : 'text-muted-foreground'\"\n >{{ label ?? state.placeholder.value }}</span\n ><motion.span\n aria-hidden=\"true\"\n :animate=\"{ rotate: 180 }\"\n :transition=\"state.reduce.value ? { duration: 0 } : MORPH\"\n class=\"text-muted-foreground\"\n ><ChevronDown class=\"h-4 w-4\" /></motion.span\n ></motion.button>\n <div class=\"h-px bg-border\" />\n <motion.ul\n ref=\"list\"\n :id=\"state.listId\"\n role=\"listbox\"\n :aria-labelledby=\"state.headerId\"\n initial=\"hidden\"\n animate=\"show\"\n :variants=\"variants\"\n @keydown=\"key\"\n class=\"p-1\"\n ><slot /></motion.ul></motion.div\n ></AnimatePresence>\n</template>\n"
1165
+ },
1166
+ {
1167
+ "path": "registry/orvui/motion/select/src/MorphSelectItem.vue",
1168
+ "target": "~/src/components/orvui/motion/select/src/MorphSelectItem.vue",
1169
+ "type": "registry:component",
1170
+ "content": "<script setup lang=\"ts\">\nimport SelectItem from \"./SelectItem.vue\";\nconst props = defineProps<{\n value: string;\n disabled?: boolean;\n label?: string;\n className?: string;\n}>();\n</script>\n<template>\n <SelectItem v-bind=\"props\"><slot /></SelectItem>\n</template>\n"
1171
+ },
1172
+ {
1173
+ "path": "registry/orvui/motion/select/src/MorphSelectTrigger.vue",
1174
+ "target": "~/src/components/orvui/motion/select/src/MorphSelectTrigger.vue",
1175
+ "type": "registry:component",
1176
+ "content": "<script setup lang=\"ts\">\ndefineOptions({ inheritAttrs: false });\nimport { motion, AnimatePresence } from \"motion-v\";\nimport { ChevronDown } from \"lucide-vue-next\";\nimport { MORPH, ROW, useSelect } from \"./context\";\ndefineProps<{ className?: string }>();\nconst state = useSelect();\nconst trigger = state.trigger;\nfunction open() {\n if (!state.disabled.value) state.open.value = true;\n}\nfunction key(event: KeyboardEvent) {\n if (!event.defaultPrevented && [\"ArrowDown\", \"ArrowUp\"].includes(event.key)) {\n event.preventDefault();\n open();\n }\n}\n</script>\n<template>\n <div\n aria-hidden=\"true\"\n inert\n :class=\"[ROW, 'invisible rounded-xl border border-border']\"\n >\n <slot /><ChevronDown class=\"h-4 w-4\" />\n </div>\n <AnimatePresence :initial=\"false\" mode=\"popLayout\"\n ><motion.button\n v-if=\"!state.open.value\"\n key=\"trigger\"\n ref=\"trigger\"\n v-bind=\"$attrs\"\n :layout-id=\"state.layoutId\"\n type=\"button\"\n :id=\"state.triggerId\"\n :disabled=\"state.disabled.value\"\n aria-haspopup=\"listbox\"\n :aria-expanded=\"state.open.value\"\n :aria-controls=\"state.listId\"\n @click=\"open\"\n @keydown=\"key\"\n :transition=\"state.reduce.value ? { duration: 0 } : MORPH\"\n :style=\"{ borderRadius: '12px' }\"\n :class=\"[\n ROW,\n 'absolute inset-x-0 top-0 z-10 border border-border bg-background text-foreground outline-none transition-colors hover:border-(--color-border-strong) focus-visible:ring-2 focus-visible:ring-foreground/20 disabled:pointer-events-none disabled:opacity-50',\n className,\n ]\"\n ><motion.span layout=\"position\" class=\"min-w-0 truncate\"\n ><slot /></motion.span\n ><motion.span layout=\"position\" class=\"text-muted-foreground\"\n ><ChevronDown class=\"h-4 w-4\" /></motion.span></motion.button\n ></AnimatePresence>\n</template>\n"
1177
+ },
1178
+ {
1179
+ "path": "registry/orvui/motion/select/src/MorphSelectValue.vue",
1180
+ "target": "~/src/components/orvui/motion/select/src/MorphSelectValue.vue",
1181
+ "type": "registry:component",
1182
+ "content": "<script setup lang=\"ts\">\nimport { computed, watch } from \"vue\";\nimport { useSelect } from \"./context\";\nconst props = defineProps<{ placeholder?: string; className?: string }>();\nconst state = useSelect();\nconst label = computed(() => state.labelFor(state.value.value));\nwatch(\n () => props.placeholder,\n (value) => {\n if (value) state.placeholder.value = value;\n },\n { immediate: true },\n);\n</script>\n<template>\n <span\n :class=\"[label ? 'text-foreground' : 'text-muted-foreground', className]\"\n >{{ label ?? placeholder ?? \"Select\" }}</span\n >\n</template>\n"
1183
+ },
1184
+ {
1185
+ "path": "registry/orvui/motion/select/src/Select.vue",
1186
+ "target": "~/src/components/orvui/motion/select/src/Select.vue",
1187
+ "type": "registry:component",
1188
+ "content": "<script setup lang=\"ts\">\nimport { provide } from \"vue\";\nimport { createSelect, selectKey, type SelectProps } from \"./context\";\nconst props = withDefaults(defineProps<SelectProps>(), { open: undefined });\nconst emit = defineEmits([\n \"update:modelValue\",\n \"valueChange\",\n \"change\",\n \"update:open\",\n \"openChange\",\n]);\nconst state = createSelect(props, emit, false);\nprovide(selectKey, state);\nconst root = state.root;\n</script>\n<template>\n <div ref=\"root\" :class=\"['relative', className]\">\n <slot :value=\"state.value.value\" :open=\"state.open.value\" />\n </div>\n</template>\n"
1189
+ },
1190
+ {
1191
+ "path": "registry/orvui/motion/select/src/SelectContent.vue",
1192
+ "target": "~/src/components/orvui/motion/select/src/SelectContent.vue",
1193
+ "type": "registry:component",
1194
+ "content": "<script setup lang=\"ts\">\nimport { nextTick, onBeforeUnmount, onMounted, ref, watch } from \"vue\";\nimport { motion, useTransform } from \"motion-v\";\nimport { resolveElement } from \"../../../lib/composables\";\nimport { useSelect } from \"./context\";\nimport { unfoldGeometry } from \"./unfold\";\ndefineProps<{ className?: string }>();\nconst state = useSelect();\nconst panel = state.list;\nconst height = ref(0);\nconst exiting = ref(false);\nlet disposed = false;\nlet measureRevision = 0;\nlet observer: ResizeObserver | undefined;\nlet unsubscribe: (() => void) | undefined;\nasync function measure() {\n const revision = ++measureRevision;\n await nextTick();\n if (disposed || revision !== measureRevision) return;\n const element = resolveElement<HTMLElement>(panel.value);\n if (!element) return;\n height.value = element.offsetHeight;\n const trigger = resolveElement<HTMLElement>(state.trigger.value);\n if (state.open.value && trigger) {\n const rect = trigger.getBoundingClientRect();\n const room = window.innerHeight - rect.bottom;\n state.placement.value =\n room < height.value + 16 && rect.top > room ? \"top\" : \"bottom\";\n }\n}\nwatch(\n state.open,\n (open, previous) => {\n if (!open && previous) exiting.value = true;\n if (open) void measure();\n },\n { flush: \"post\" },\n);\nonMounted(() => {\n void measure();\n const node = resolveElement<HTMLElement>(panel.value);\n if (node && typeof ResizeObserver !== \"undefined\") {\n observer = new ResizeObserver(() => void measure());\n observer.observe(node);\n }\n unsubscribe = state.progress.on(\"animationComplete\", () => {\n if (state.progress.get() === 0) exiting.value = false;\n });\n window.addEventListener(\"resize\", measure);\n});\nonBeforeUnmount(() => {\n disposed = true;\n ++measureRevision;\n observer?.disconnect();\n unsubscribe?.();\n window.removeEventListener(\"resize\", measure);\n});\nconst geometry = () =>\n unfoldGeometry(\n state.progress.get(),\n height.value,\n state.placement.value === \"top\",\n state.reduce.value,\n );\nconst y = useTransform(() => geometry().y);\nconst borderRadius = useTransform(() => geometry().radius);\nconst clipPath = useTransform(() => geometry().clip);\nconst opacity = useTransform(() => geometry().opacity);\nfunction keydown(event: KeyboardEvent) {\n if (event.key === \"Tab\") state.close();\n else state.keydown(event);\n}\n</script>\n<template>\n <motion.div\n ref=\"panel\"\n :id=\"state.listId\"\n role=\"listbox\"\n :aria-labelledby=\"state.triggerId\"\n :aria-hidden=\"!state.open.value\"\n :inert=\"!state.open.value\"\n @keydown=\"keydown\"\n :style=\"{\n visibility: state.open.value || exiting ? 'visible' : 'hidden',\n maxHeight: state.open.value || exiting ? undefined : 0,\n borderWidth: state.open.value || exiting ? undefined : 0,\n y,\n clipPath,\n borderRadius,\n opacity,\n pointerEvents: state.open.value ? 'auto' : 'none',\n marginTop: state.placement.value === 'top' ? '0px' : '8px',\n marginBottom: state.placement.value === 'top' ? '8px' : '0px',\n }\"\n :class=\"[\n 'absolute inset-x-0 z-20 overflow-hidden border border-border bg-background shadow-lg',\n state.placement.value === 'top' ? 'bottom-full' : 'top-full',\n className,\n ]\"\n ><motion.div\n :initial=\"false\"\n :animate=\"state.open.value ? 'show' : 'hidden'\"\n class=\"p-1\"\n ><slot /></motion.div\n ></motion.div>\n</template>\n"
1195
+ },
1196
+ {
1197
+ "path": "registry/orvui/motion/select/src/SelectItem.vue",
1198
+ "target": "~/src/components/orvui/motion/select/src/SelectItem.vue",
1199
+ "type": "registry:component",
1200
+ "content": "<script setup lang=\"ts\">\ndefineOptions({ inheritAttrs: false });\nimport {\n computed,\n inject,\n onBeforeUnmount,\n onMounted,\n onUpdated,\n ref,\n} from \"vue\";\nimport { motion } from \"motion-v\";\nimport { Check } from \"lucide-vue-next\";\nimport { useSelect, registrarKey, ITEM_VARIANTS, MORPH_ITEM } from \"./context\";\nconst props = withDefaults(\n defineProps<{\n value: string;\n disabled?: boolean;\n label?: string;\n className?: string;\n }>(),\n { disabled: false },\n);\nconst state = useSelect();\nconst hidden = inject(registrarKey, false);\nconst element = ref<HTMLElement | null>(null);\nconst token = Symbol(\"select-option-instance\");\nlet registered: string | undefined;\nfunction synchronize() {\n if (registered !== undefined && registered !== props.value)\n state.unregister(registered, token);\n state.register(\n props.value,\n props.label ?? element.value?.textContent?.trim() ?? props.value,\n props.disabled,\n token,\n );\n registered = props.value;\n}\nonMounted(synchronize);\nonUpdated(synchronize);\nonBeforeUnmount(() => {\n if (registered !== undefined) state.unregister(registered, token);\n});\nconst selected = computed(() => state.value.value === props.value);\nconst variants = computed(() =>\n state.reduce.value ? undefined : state.morph ? MORPH_ITEM : ITEM_VARIANTS,\n);\n</script>\n<template>\n <span v-if=\"hidden\" ref=\"element\" hidden\n ><slot>{{ label ?? value }}</slot></span\n ><motion.div\n v-else\n :role=\"state.morph ? 'none' : undefined\"\n :variants=\"variants\"\n ><button\n ref=\"element\"\n v-bind=\"$attrs\"\n type=\"button\"\n role=\"option\"\n :aria-selected=\"selected\"\n :disabled=\"disabled\"\n :tabindex=\"state.activeId.value === value ? 0 : -1\"\n :data-listbox-id=\"value\"\n @click=\"state.select(value)\"\n :class=\"[\n 'flex w-full items-center justify-between gap-2 rounded-lg px-2.5 py-1.5 text-left text-sm outline-none transition-colors',\n selected\n ? 'bg-muted text-foreground'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:bg-muted',\n 'disabled:pointer-events-none disabled:opacity-50',\n className,\n ]\"\n >\n <slot>{{ label ?? value }}</slot\n ><Check v-if=\"selected\" class=\"h-3.5 w-3.5 shrink-0\" :stroke-width=\"2.5\" /></button\n ></motion.div>\n</template>\n"
1201
+ },
1202
+ {
1203
+ "path": "registry/orvui/motion/select/src/SelectRegistrar.vue",
1204
+ "target": "~/src/components/orvui/motion/select/src/SelectRegistrar.vue",
1205
+ "type": "registry:component",
1206
+ "content": "<script setup lang=\"ts\">\nimport { h, mergeProps, provide, renderSlot, useAttrs } from \"vue\";\nimport { registrarKey } from \"./context\";\ndefineOptions({ inheritAttrs: false });\nconst slots = defineSlots<{ default?(props: {}): any }>();\nconst attrs = useAttrs();\nprovide(registrarKey, true);\n// Registration descendants stay mounted inside this injection boundary.\nconst RenderFrame = () =>\n h(\"div\", mergeProps({ hidden: true }, attrs), [renderSlot(slots, \"default\")]);\n</script>\n<template><RenderFrame /></template>\n"
1207
+ },
1208
+ {
1209
+ "path": "registry/orvui/motion/select/src/SelectTrigger.vue",
1210
+ "target": "~/src/components/orvui/motion/select/src/SelectTrigger.vue",
1211
+ "type": "registry:component",
1212
+ "content": "<script setup lang=\"ts\">\nimport { motion, useTransform } from \"motion-v\";\nimport { ChevronDown } from \"lucide-vue-next\";\nimport { useSelect } from \"./context\";\ndefineProps<{ className?: string }>();\nconst state = useSelect();\nconst trigger = state.trigger;\nconst nearRadius = useTransform(\n state.progress,\n [0, 0.2, 0.4, 1],\n [\"12px\", \"0px\", \"0px\", \"12px\"],\n);\nconst rotate = useTransform(\n () =>\n (state.reduce.value\n ? Number(state.open.value)\n : Math.max(0, Math.min(1, state.progress.get()))) * 180,\n);\nfunction openWithArrow(event: KeyboardEvent) {\n if (\n event.defaultPrevented ||\n state.disabled.value ||\n state.open.value ||\n ![\"ArrowDown\", \"ArrowUp\"].includes(event.key)\n )\n return;\n event.preventDefault();\n state.open.value = true;\n}\n</script>\n<template>\n <motion.button\n ref=\"trigger\"\n type=\"button\"\n data-trigger\n :id=\"state.triggerId\"\n :disabled=\"state.disabled.value\"\n aria-haspopup=\"listbox\"\n :aria-expanded=\"state.open.value\"\n :aria-controls=\"state.listId\"\n @click=\"!state.disabled.value && (state.open.value = !state.open.value)\"\n @keydown=\"openWithArrow\"\n :style=\"{\n borderTopLeftRadius:\n state.reduce.value || state.placement.value !== 'top'\n ? '12px'\n : nearRadius,\n borderTopRightRadius:\n state.reduce.value || state.placement.value !== 'top'\n ? '12px'\n : nearRadius,\n borderBottomLeftRadius:\n state.reduce.value || state.placement.value === 'top'\n ? '12px'\n : nearRadius,\n borderBottomRightRadius:\n state.reduce.value || state.placement.value === 'top'\n ? '12px'\n : nearRadius,\n }\"\n :class=\"[\n 'relative z-10 flex w-full items-center justify-between gap-2 border border-border bg-background px-3 py-2 text-sm text-foreground outline-none transition-colors hover:border-(--color-border-strong) focus-visible:ring-2 focus-visible:ring-foreground/20 disabled:pointer-events-none disabled:opacity-50',\n className,\n ]\"\n ><slot /><motion.span\n aria-hidden=\"true\"\n :style=\"{ rotate }\"\n class=\"text-muted-foreground\"\n ><ChevronDown class=\"h-4 w-4\" /></motion.span\n ></motion.button>\n</template>\n"
1213
+ },
1214
+ {
1215
+ "path": "registry/orvui/motion/select/src/SelectValue.vue",
1216
+ "target": "~/src/components/orvui/motion/select/src/SelectValue.vue",
1217
+ "type": "registry:component",
1218
+ "content": "<script setup lang=\"ts\">\nimport { computed, watch } from \"vue\";\nimport { useSelect } from \"./context\";\nconst props = withDefaults(\n defineProps<{ placeholder?: string; className?: string }>(),\n { placeholder: \"Select\" },\n);\nconst state = useSelect();\nconst label = computed(() => state.labelFor(state.value.value));\n</script>\n<template>\n <span\n :class=\"[label ? 'text-foreground' : 'text-muted-foreground', className]\"\n >{{ label ?? placeholder }}</span\n >\n</template>\n"
1219
+ },
1220
+ {
1221
+ "path": "registry/orvui/motion/select/src/unfold.ts",
1222
+ "target": "~/src/components/orvui/motion/select/src/unfold.ts",
1223
+ "type": "registry:lib",
1224
+ "content": "export function unfoldGeometry(\n progress: number,\n height: number,\n top: boolean,\n reduced: boolean,\n) {\n const bounded = (value: number) => Math.min(1, Math.max(0, value));\n const phase = bounded(progress);\n const separation = bounded((phase - 0.4) / 0.6);\n const moving = height > 0 && !reduced;\n const near = moving ? 12 * separation : 12;\n const radius = top\n ? `12px 12px ${near}px ${near}px`\n : `${near}px ${near}px 12px 12px`;\n const hidden = Math.max(0, (height - 8) * (1 - phase));\n return {\n y: moving ? (top ? 8 : -8) * (1 - separation) : 0,\n radius,\n clip:\n !moving || phase === 1\n ? \"none\"\n : `inset(${top ? `${hidden}px 0 0 0` : `0 0 ${hidden}px 0`} round ${radius})`,\n opacity: bounded(progress / (reduced ? 1 : 0.12)),\n };\n}\n"
1225
+ },
1226
+ {
1227
+ "path": "registry/orvui/motion/shared-layout-bg/index.ts",
1228
+ "target": "~/src/components/orvui/motion/shared-layout-bg/index.ts",
1229
+ "type": "registry:lib",
1230
+ "content": "export { default as SharedLayoutBg } from \"./src/SharedLayoutBg.vue\";\n\nexport type * from \"./src/api-types\";\n"
1231
+ },
1232
+ {
1233
+ "path": "registry/orvui/motion/shared-layout-bg/src/api-types.ts",
1234
+ "target": "~/src/components/orvui/motion/shared-layout-bg/src/api-types.ts",
1235
+ "type": "registry:lib",
1236
+ "content": "// Vue public prop types, derived from the actual components.\nexport type SharedLayoutBgProps = InstanceType<\n (typeof import(\"./SharedLayoutBg.vue\"))[\"default\"]\n>[\"$props\"];\n"
1237
+ },
1238
+ {
1239
+ "path": "registry/orvui/motion/shared-layout-bg/src/SharedLayoutBg.vue",
1240
+ "target": "~/src/components/orvui/motion/shared-layout-bg/src/SharedLayoutBg.vue",
1241
+ "type": "registry:component",
1242
+ "content": "<script lang=\"ts\">\nimport { Comment, Fragment, cloneVNode, defineComponent, h, isVNode, mergeProps, ref, useId, type PropType, type VNode, type VNodeChild } from \"vue\";\nimport { AnimatePresence, motion } from \"motion-v\";\nimport { cn } from \"../../../lib/utils\";\nimport { SPRING_LAYOUT } from \"../../../lib/ease\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nexport interface SharedLayoutBgProps { as?: \"div\" | \"ul\"; pillClassName?: string; inset?: number; pillContainerClassName?: string }\nfunction children(nodes: unknown[]): VNode[] {\n return nodes.flatMap(node => !isVNode(node) || node.type === Comment ? [] : node.type === Fragment && Array.isArray(node.children) ? children(node.children) : typeof node.type === \"symbol\" ? [] : [node]);\n}\nfunction replaceContents(child: VNode, additions: Record<string, unknown>, contents: VNode[]) {\n const result = cloneVNode(child, additions, true);\n const component = (child.shapeFlag & 6) !== 0;\n result.children = component ? { ...(child.children && typeof child.children === \"object\" && !Array.isArray(child.children) ? child.children : {}), default: () => contents } : contents;\n result.shapeFlag = (result.shapeFlag & ~(8 | 16 | 32)) | (component ? 32 : 16);\n result.patchFlag = -2;\n return result;\n}\nexport default defineComponent({\n name: \"SharedLayoutBg\", inheritAttrs: false,\n props: { as: { type: String as PropType<\"div\" | \"ul\">, default: \"div\" }, pillClassName: String, inset: { type: Number, default: 20 }, pillContainerClassName: String },\n setup(props, { attrs, slots }) {\n const active = ref<string | null>(null), id = useId(), reduced = useReducedMotion();\n let pointerInside = false;\n function leave(event: MouseEvent) {\n pointerInside = false;\n const root = event.currentTarget as HTMLElement;\n if (!root.contains(root.ownerDocument.activeElement)) active.value = null;\n }\n function blur(event: FocusEvent) {\n if (!pointerInside && !(event.currentTarget as HTMLElement).contains(event.relatedTarget as Node | null)) active.value = null;\n }\n function presence() {\n const rest = reduced.value ? { opacity: 1 } : { opacity: 1, filter: \"blur(0px)\" };\n const hidden = reduced.value ? { opacity: 0 } : { opacity: 0, filter: \"blur(6px)\" };\n return { initial: hidden, animate: rest, exit: (another: unknown) => another ? {} : hidden };\n }\n function row(child: VNode, index: number) {\n const key = child.key == null ? `item-${index}` : String(child.key);\n const slots = child.children && typeof child.children === \"object\" && !Array.isArray(child.children) ? child.children as { default?: () => VNodeChild } : undefined;\n const body = slots ? slots.default?.() : child.children;\n const pill = h(AnimatePresence, { custom: active.value !== null ? 1 : 0 }, () => active.value === null ? null : h(motion.div, {\n key: \"pill-wrapper\", variants: presence(), initial: \"initial\", animate: \"animate\", exit: \"exit\", custom: active.value !== null ? 1 : 0,\n class: cn(\"pointer-events-none absolute inset-y-0\", props.pillContainerClassName), style: { left: `${-props.inset}px`, right: `${-props.inset}px` },\n }, () => active.value !== key ? null : h(motion.div, { layoutId: `shared-bg-${id}`, transition: reduced.value ? { duration: 0 } : SPRING_LAYOUT, class: cn(\"pointer-events-none h-full w-full rounded-2xl bg-muted/80\", props.pillClassName) })));\n return replaceContents(child, {\n key, class: cn(\"relative\", child.props?.class), onMouseenter() { pointerInside = true; active.value = key; }, onFocusin() { active.value = key; },\n }, [pill, h(\"div\", { class: \"relative z-10\" }, body as any)]);\n }\n return () => h(props.as === \"ul\" ? motion.ul : motion.div,\n mergeProps(attrs, { layoutRoot: true, class: cn(\"flex w-full flex-col\", attrs.class), onMouseleave: leave, onFocusout: blur }),\n () => children(slots.default?.() ?? []).map(row));\n },\n});\n</script>\n"
1243
+ },
1244
+ {
1245
+ "path": "registry/orvui/motion/state.ts",
1246
+ "target": "~/src/components/orvui/motion/state.ts",
1247
+ "type": "registry:lib",
1248
+ "content": "import { computed, ref, type Ref, type WritableComputedRef } from \"vue\";\n\n/** A value may move between parent control and local ownership during its life. */\nexport function useMotionState<T>(\n props: Record<string, any>,\n emit: (...args: any[]) => void,\n key: string,\n fallback: T,\n): WritableComputedRef<T> {\n const memory = ref(fallback) as Ref<T>;\n return computed({\n get(): T {\n const supplied = props[key];\n return supplied === undefined ? memory.value : supplied;\n },\n set(requested: T) {\n memory.value = requested;\n emit(`update:${key}`, requested);\n if (key === \"modelValue\") emit(\"change\", requested);\n },\n });\n}\n\n/** Rove focus within the event surface, using its own document. */\nexport function focusList(event: KeyboardEvent, selector = \"button:not(:disabled)\") {\n const direction = new Map<string, number>([\n [\"ArrowDown\", 1], [\"ArrowRight\", 1], [\"ArrowUp\", -1], [\"ArrowLeft\", -1],\n ]).get(event.key);\n if (direction === undefined && event.key !== \"Home\" && event.key !== \"End\") return;\n const surface = event.currentTarget as HTMLElement | null;\n if (!surface) return;\n const candidates = [...surface.querySelectorAll<HTMLElement>(selector)];\n if (!candidates.length) return;\n const current = candidates.indexOf(surface.ownerDocument.activeElement as HTMLElement);\n const index = event.key === \"Home\" ? 0\n : event.key === \"End\" ? candidates.length - 1\n : current === -1 ? (direction === -1 ? candidates.length - 1 : 0)\n : (current + direction! + candidates.length) % candidates.length;\n event.preventDefault();\n candidates[index]?.focus();\n}\n"
1249
+ },
1250
+ {
1251
+ "path": "registry/orvui/motion/text-animation/index.ts",
1252
+ "target": "~/src/components/orvui/motion/text-animation/index.ts",
1253
+ "type": "registry:lib",
1254
+ "content": "export { default as TextReveal } from \"./src/TextReveal.vue\";\nexport { default as TextScramble } from \"./src/TextScramble.vue\";\nexport { default as TextShimmer } from \"./src/TextShimmer.vue\";\nexport { default as TextCascade } from \"./src/TextCascade.vue\";\nexport { default as ChromaticTextReveal } from \"./src/ChromaticTextReveal.vue\";\n\nexport type * from \"./src/api-types\";\n"
1255
+ },
1256
+ {
1257
+ "path": "registry/orvui/motion/text-animation/src/api-types.ts",
1258
+ "target": "~/src/components/orvui/motion/text-animation/src/api-types.ts",
1259
+ "type": "registry:lib",
1260
+ "content": "// Vue public prop types, derived from the actual components.\nexport type ChromaticTextRevealProps = InstanceType<\n (typeof import(\"./ChromaticTextReveal.vue\"))[\"default\"]\n>[\"$props\"];\nexport type TextCascadeProps = InstanceType<\n (typeof import(\"./TextCascade.vue\"))[\"default\"]\n>[\"$props\"];\nexport type TextRevealProps = InstanceType<\n (typeof import(\"./TextReveal.vue\"))[\"default\"]\n>[\"$props\"];\nexport type TextScrambleProps = InstanceType<\n (typeof import(\"./TextScramble.vue\"))[\"default\"]\n>[\"$props\"];\nexport type TextShimmerProps = InstanceType<\n (typeof import(\"./TextShimmer.vue\"))[\"default\"]\n>[\"$props\"];\n"
1261
+ },
1262
+ {
1263
+ "path": "registry/orvui/motion/text-animation/src/ChromaticTextReveal.vue",
1264
+ "target": "~/src/components/orvui/motion/text-animation/src/ChromaticTextReveal.vue",
1265
+ "type": "registry:component",
1266
+ "content": "<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref, watch, type CSSProperties } from \"vue\";\nimport { motion } from \"motion-v\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nimport { EASE_IN_OUT, EASE_OUT } from \"../../../lib/ease\";\nimport { chromaticGradient } from \"./reveal-sequence\";\nconst props = withDefaults(defineProps<{ prefix: string; words: string[]; colors?: string[]; foregroundColor?: string; duration?: number; delay?: number; pauseDuration?: number; loop?: boolean; startOnView?: boolean; once?: boolean; inViewMargin?: string }>(), { colors: () => [\"#60a5fa\", \"#818cf8\", \"#c084fc\", \"#fb7185\", \"#fbbf24\"], foregroundColor: \"var(--foreground)\", duration: 1.2, delay: 0, pauseDuration: .8, loop: true, startOnView: true, once: true });\nconst root = ref<HTMLElement | null>(null);\nconst cycle = ref(0);\nconst intersecting = ref(false);\nconst reduced = useReducedMotion();\nconst index = computed(() => props.words.length ? cycle.value % props.words.length : 0);\nconst word = computed(() => props.words[index.value] ?? \"\");\nconst widths = computed(() => Array.from(new Set(props.words)));\nconst visible = computed(() => !props.startOnView || intersecting.value || reduced.value);\nconst gradient = computed(() => chromaticGradient(props.colors, props.foregroundColor));\nconst timing = computed(() => ({ \"--chromatic-sweep\": reduced.value ? { duration: 0 } : { duration: props.duration, delay: props.delay, ease: EASE_IN_OUT }, opacity: { duration: reduced.value ? 0 : .28, ease: EASE_OUT }, filter: { duration: reduced.value ? 0 : .36, ease: EASE_OUT }, transform: { duration: reduced.value ? 0 : .36, ease: EASE_OUT } }));\nlet mounted = false;\nlet timer: ReturnType<typeof setTimeout> | undefined;\nlet observer: IntersectionObserver | undefined;\nfunction clear() { clearTimeout(timer); timer = undefined; }\nfunction next() { clear(); if (!mounted || reduced.value || !visible.value || props.words.length < 2 || !props.loop && index.value === props.words.length - 1) return; timer = setTimeout(() => { cycle.value = (cycle.value + 1) % props.words.length; }, props.pauseDuration * 1000); }\nfunction observe() { observer?.disconnect(); if (!mounted || !root.value || !props.startOnView) return; if (typeof IntersectionObserver === \"undefined\") { intersecting.value = true; return; } observer = new IntersectionObserver(entries => { intersecting.value = !!entries[0]?.isIntersecting; if (intersecting.value && props.once) observer?.disconnect(); }, { threshold: .4, rootMargin: props.inViewMargin }); observer.observe(root.value); }\nwatch([() => props.words, () => props.loop, () => props.pauseDuration, reduced], clear);\nwatch([() => props.startOnView, () => props.once, () => props.inViewMargin], observe);\nonMounted(() => { mounted = true; observe(); });\nonBeforeUnmount(() => { mounted = false; clear(); observer?.disconnect(); });\n</script>\n<template>\n <span ref=\"root\" class=\"inline-flex items-baseline\"><span class=\"whitespace-nowrap\">{{ prefix }}{{ words.length ? '\\u00a0' : '' }}</span><span v-if=\"words.length\" class=\"relative inline-grid\"><span v-for=\"sizing in widths\" :key=\"sizing\" aria-hidden=\"true\" class=\"invisible col-start-1 row-start-1 whitespace-nowrap\">{{ sizing }}</span><motion.span :key=\"`${word}-${index}`\" aria-hidden=\"true\" :initial=\"reduced ? false : { opacity: .56, filter: 'blur(6px)', transform: 'translateY(5px)' }\" :animate=\"{ '--chromatic-sweep': visible ? '114%' : '-14%', opacity: 1, filter: 'blur(0px)', transform: 'translateY(0px)' }\" :transition=\"timing\" @animation-complete=\"next\" class=\"absolute start-0 top-0 whitespace-nowrap bg-clip-text text-transparent [background-image:var(--chromatic-gradient)] [contain:paint]\" :style=\"{ '--chromatic-sweep': reduced ? '114%' : '-14%', '--chromatic-gradient': gradient, backgroundSize: '100% 100%', backgroundRepeat: 'no-repeat' } as CSSProperties\">{{ word }}</motion.span><span class=\"sr-only\">{{ word }}</span></span></span>\n</template>\n"
1267
+ },
1268
+ {
1269
+ "path": "registry/orvui/motion/text-animation/src/reveal-sequence.ts",
1270
+ "target": "~/src/components/orvui/motion/text-animation/src/reveal-sequence.ts",
1271
+ "type": "registry:lib",
1272
+ "content": "export interface RevealUnit { text: string; index: number }\nexport function revealSequence(input: string | string[], mode: \"word\" | \"char\"): RevealUnit[][][] {\n let ordinal = 0;\n return (typeof input === \"string\" ? [input] : input).map(line => {\n const chunks = line.match(/\\S+\\s*|\\s+/g) ?? [];\n return chunks.map(chunk => (mode === \"word\" ? [chunk] : Array.from(chunk)).map(text => ({ text, index: ordinal++ })));\n });\n}\nexport function chromaticGradient(colors: string[], foreground: string) {\n const palette = colors.length ? colors : [\"#60a5fa\", \"#818cf8\", \"#c084fc\", \"#fb7185\", \"#fbbf24\"];\n const stops = palette.map((color, index) => { const offset = palette.length === 1 ? 0 : 28 * index / (palette.length - 1) - 14; return `${color} calc(var(--chromatic-sweep) ${offset < 0 ? \"-\" : \"+\"} ${Number(Math.abs(offset).toFixed(2))}%)`; });\n return `linear-gradient(90deg,${foreground} 0%,${foreground} calc(var(--chromatic-sweep) - 14%),${stops.join(\",\")},transparent calc(var(--chromatic-sweep) + 14%),transparent 100%)`;\n}\n"
1273
+ },
1274
+ {
1275
+ "path": "registry/orvui/motion/text-animation/src/TextCascade.vue",
1276
+ "target": "~/src/components/orvui/motion/text-animation/src/TextCascade.vue",
1277
+ "type": "registry:component",
1278
+ "content": "<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport ActionSwapText from \"../../action-swap/src/ActionSwapText.vue\";\nconst props = defineProps<{ text: string }>();\nconst current = computed(() => props.text);\n</script>\n<template><ActionSwapText :value=\"current\" animation=\"cascade\">{{ current }}</ActionSwapText></template>\n"
1279
+ },
1280
+ {
1281
+ "path": "registry/orvui/motion/text-animation/src/TextReveal.vue",
1282
+ "target": "~/src/components/orvui/motion/text-animation/src/TextReveal.vue",
1283
+ "type": "registry:component",
1284
+ "content": "<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { motion } from \"motion-v\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nimport { EASE_OUT } from \"../../../lib/ease\";\nimport { revealSequence } from \"./reveal-sequence\";\nconst props = withDefaults(defineProps<{ text: string | string[]; as?: string; split?: \"word\" | \"char\"; stagger?: number; delay?: number; blur?: number; yOffset?: string | number; spring?: { stiffness?: number; damping?: number; mass?: number }; once?: boolean; whileInView?: boolean }>(), { as: \"span\", split: \"word\", stagger: .09, delay: 0, blur: 12, yOffset: \"40%\", once: true, whileInView: false });\nconst reduced = useReducedMotion();\nconst sequence = computed(() => revealSequence(props.text, props.split));\nconst concealed = computed(() => reduced.value ? { opacity: 0 } : { y: props.yOffset, opacity: 0, filter: `blur(${props.blur}px)` });\nconst revealed = computed(() => reduced.value ? { opacity: 1 } : { y: 0, opacity: 1, filter: \"blur(0px)\" });\nfunction timing(index: number) { const delay = props.delay + index * props.stagger; return reduced.value ? { opacity: { duration: .25, ease: EASE_OUT, delay: delay * .3 } } : { y: { type: \"spring\" as const, stiffness: props.spring?.stiffness ?? 140, damping: props.spring?.damping ?? 26, mass: props.spring?.mass ?? 1.2, delay }, opacity: { duration: .7, ease: EASE_OUT, delay }, filter: { duration: .9, ease: EASE_OUT, delay } }; }\nfunction animation(index: number) { return { initial: concealed.value, animate: props.whileInView ? undefined : revealed.value, whileInView: props.whileInView ? revealed.value : undefined, inViewOptions: { once: props.once, amount: .4 }, transition: timing(index) }; }\n</script>\n<template><component :is=\"as\" class=\"block\"><span v-for=\"(line, lineIndex) in sequence\" :key=\"lineIndex\" class=\"block\"><template v-for=\"(word, wordIndex) in line\" :key=\"wordIndex\"><span v-if=\"split === 'char'\" class=\"inline-block whitespace-pre\"><motion.span v-for=\"unit in word\" :key=\"unit.index\" v-bind=\"animation(unit.index)\" class=\"inline-block whitespace-pre will-change-transform\">{{ unit.text }}</motion.span></span><motion.span v-else v-bind=\"animation(word[0].index)\" class=\"inline-block whitespace-pre will-change-transform\">{{ word[0].text }}</motion.span></template></span><slot /></component></template>\n"
1285
+ },
1286
+ {
1287
+ "path": "registry/orvui/motion/text-animation/src/TextScramble.vue",
1288
+ "target": "~/src/components/orvui/motion/text-animation/src/TextScramble.vue",
1289
+ "type": "registry:component",
1290
+ "content": "<script setup lang=\"ts\">\nimport { onBeforeUnmount, onMounted, ref, watch } from \"vue\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nconst props = withDefaults(defineProps<{ text: string; duration?: number; glyphs?: string; trigger?: string | number }>(), { glyphs: \"ABCDEFGHJKLMNPQRSTUVWXYZ0123456789#%&@$?/\" });\nconst display = ref(props.text);\nconst reduced = useReducedMotion();\nlet frame = 0;\nlet mounted = false;\nlet revision = 0;\nfunction cancel() { ++revision; cancelAnimationFrame(frame); frame = 0; }\nfunction scramble() {\n cancel();\n const target = props.text;\n if (!mounted || reduced.value || !props.glyphs.length) { display.value = target; return; }\n const run = revision;\n const duration = props.duration ?? Math.min(760, Math.max(420, target.length * 32));\n const started = performance.now();\n let painted = 0;\n function tick(now: number) {\n if (!mounted || run !== revision) return;\n if (now - started >= duration) { display.value = target; frame = 0; return; }\n if (now - painted >= 40) { painted = now; const locked = Math.floor((now - started) / duration * target.length); let text = \"\"; for (let index = 0; index < target.length; index++) text += index < locked || target[index] === \" \" ? target[index] : props.glyphs[Math.floor(Math.random() * props.glyphs.length)]; display.value = text; }\n frame = requestAnimationFrame(tick);\n }\n frame = requestAnimationFrame(tick);\n}\nwatch([() => props.text, () => props.duration, () => props.glyphs, () => props.trigger, reduced], scramble);\nonMounted(() => { mounted = true; });\nonBeforeUnmount(() => { mounted = false; cancel(); });\n</script>\n<template><span class=\"inline-block whitespace-pre\"><span class=\"sr-only\">{{ text }}</span><span aria-hidden=\"true\">{{ reduced ? text : display }}</span></span></template>\n"
1291
+ },
1292
+ {
1293
+ "path": "registry/orvui/motion/text-animation/src/TextShimmer.vue",
1294
+ "target": "~/src/components/orvui/motion/text-animation/src/TextShimmer.vue",
1295
+ "type": "registry:component",
1296
+ "content": "<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { useReducedMotion } from \"../../../lib/composables\";\nconst props = withDefaults(defineProps<{ as?: string; duration?: number; spread?: number }>(), { as: \"span\", duration: 2, spread: 2 });\nconst reduced = useReducedMotion();\nconst style = computed(() => ({ animationDuration: `${props.duration}s`, animation: reduced.value ? \"none\" : `orvui-shimmer ${props.duration}s linear infinite` }));\n</script>\n<template><component :is=\"as\" class=\"orvui-text-shimmer\" :style=\"style\"><slot /></component></template>\n<style scoped>\n.orvui-text-shimmer { background-image: linear-gradient(110deg, var(--muted-foreground) 30%, var(--foreground) 50%, var(--muted-foreground) 70%); background-size: 200% 100%; background-clip: text; color: transparent; animation: orvui-shimmer 2s linear infinite; }\n@keyframes orvui-shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }\n@media (prefers-reduced-motion: reduce) { .orvui-text-shimmer { animation: none !important; } }\n</style>\n"
1297
+ },
1298
+ {
1299
+ "path": "registry/orvui/styles.css.txt",
1300
+ "target": "~/src/components/orvui/styles.css",
1301
+ "type": "registry:file",
1302
+ "content": "@import \"tailwindcss\";\n@import \"./tokens.css\";\n@source \"./**/*.{vue,ts}\";\n@source not \"./**/tests/**\";\n@custom-variant dark (&:where(.dark, .dark *));\n\n:root { --announcement-h: 2.5rem; }\n\n@theme {\n --background-image-brand-bg: var(--gradient-bg);\n --background-image-brand-accent: var(--gradient-accent);\n --animate-marquee: marquee 30s linear infinite;\n --animate-marquee-vertical: marquee-vertical 30s linear infinite;\n --animate-rainbow-border: rainbow-border 3s linear infinite;\n --animate-shimmer: shimmer 2.5s linear infinite;\n --animate-action-send: action-send 520ms var(--ease-out) both;\n --animate-action-copy: action-copy 520ms var(--ease-out) both;\n --animate-action-download: action-download 540ms var(--ease-out) both;\n --animate-action-archive: action-archive 520ms var(--ease-out) both;\n --animate-action-bell: action-bell 680ms var(--ease-out) both;\n --animate-action-settings: action-settings 720ms var(--ease-out) both;\n}\n\n/* Named motion tracks are part of the public styling contract. */\n@keyframes marquee { to { transform: translateX(calc(-100% - var(--gap, 1rem))); } }\n@keyframes marquee-vertical { to { transform: translateY(calc(-100% - var(--gap, 1rem))); } }\n@keyframes rainbow-border {\n from { background-position: 0% 50%; }\n to { background-position: 100% 50%; }\n}\n@keyframes shimmer {\n from { background-position: 200% 0; }\n to { background-position: -200% 0; }\n}\n@keyframes action-send {\n 0%, 100% { transform: translate(0, 0); }\n 45% { transform: translate(2px, -2px); }\n}\n@keyframes action-copy {\n 0%, 100% { transform: translate(0, 0); }\n 40% { transform: translate(1.5px, -1.5px); }\n 70% { transform: translate(-1px, 1px); }\n}\n@keyframes action-download {\n 0%, 100% { transform: translateY(0); }\n 42% { transform: translateY(2.5px); }\n}\n@keyframes action-archive {\n 0%, 100% { transform: scale(1); }\n 45% { transform: scale(0.9); }\n}\n@keyframes action-bell {\n 0%, 100% { transform: rotate(0deg); }\n 18% { transform: rotate(14deg); }\n 36% { transform: rotate(-12deg); }\n 54% { transform: rotate(8deg); }\n 72% { transform: rotate(-5deg); }\n}\n@keyframes action-settings {\n from { transform: rotate(0deg); }\n to { transform: rotate(90deg); }\n}\n\n@layer base {\n html, body { overflow-x: clip; }\n html { color-scheme: light dark; }\n body {\n font-family: var(--font-sans);\n color: var(--foreground);\n background: var(--background);\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n }\n a, button:not(:disabled), [role=\"button\"]:not(:disabled) { cursor: pointer; }\n ::selection {\n color: var(--foreground);\n background: color-mix(in oklch, var(--accent) 30%, transparent);\n }\n .shiki, .shiki span { color: var(--shiki-light); }\n .dark .shiki, .dark .shiki span { color: var(--shiki-dark); }\n}\n\n@layer utilities {\n .text-balance { text-wrap: balance; }\n .text-pretty { text-wrap: pretty; }\n .scrollbar-hide { scrollbar-width: none; }\n .scrollbar-hide::-webkit-scrollbar { display: none; }\n .mask-b-fade { mask-image: linear-gradient(to bottom, black 60%, transparent); }\n .mask-radial-fade { mask-image: radial-gradient(ellipse at center, black 40%, transparent 75%); }\n .grid-noise {\n background-size: 32px 32px;\n background-image: linear-gradient(to right, color-mix(in oklch, var(--foreground) 6%, transparent) 1px, transparent 1px), linear-gradient(to bottom, color-mix(in oklch, var(--foreground) 6%, transparent) 1px, transparent 1px);\n }\n .glass {\n background: var(--glass-bg);\n border: 1px solid var(--glass-border);\n backdrop-filter: blur(20px) saturate(160%);\n box-shadow: inset 0 1px 0 0 rgb(255 255 255 / 0.06), 0 24px 60px -24px rgb(0 0 0 / 0.45);\n }\n .glass-strong { background: var(--glass-strong-bg); backdrop-filter: blur(16px); }\n .glass-thin { background: var(--glass-thin-bg); backdrop-filter: blur(12px); border: 1px solid var(--glass-border); }\n .press { transition: transform 120ms var(--ease-out); }\n .press:active { transform: scale(0.97); }\n}\n\n@media (prefers-reduced-motion: reduce) {\n *, *::before, *::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n scroll-behavior: auto !important;\n }\n}\n"
1303
+ },
1304
+ {
1305
+ "path": "registry/orvui/tokens.css.txt",
1306
+ "target": "~/src/components/orvui/tokens.css",
1307
+ "type": "registry:file",
1308
+ "content": "/* Generated from the orvui theme compatibility contract. */\n\n:root {\n --border-strong: oklch(15% 0 0 / 0.12);\n --accent-fg: oklch(15% 0 0);\n --neon: oklch(80% 0.22 145);\n --violet: oklch(68% 0.22 295);\n --danger: oklch(62% 0.22 25);\n --success: oklch(70% 0.18 155);\n --warning: oklch(78% 0.18 75);\n --glass-bg: oklch(99% 0 0 / 0.55);\n --glass-border: oklch(15% 0 0 / 0.08);\n --glass-strong-bg: rgb(255 255 255 / 0.7);\n --glass-thin-bg: rgb(255 255 255 / 0.45);\n --gradient-bg: linear-gradient(135deg, oklch(99% 0 0) 0%, oklch(96% 0.008 210) 100%);\n --gradient-accent: linear-gradient(to right, oklch(72% 0.18 195) 0%, oklch(68% 0.22 295) 100%);\n --background: oklch(99% 0 0);\n --foreground: oklch(15% 0 0);\n --card: oklch(97% 0 0);\n --card-foreground: var(--foreground);\n --popover: var(--card);\n --popover-foreground: var(--foreground);\n --primary: #0285f7;\n --primary-foreground: #ffffff;\n --secondary: var(--card);\n --secondary-foreground: var(--foreground);\n --muted: var(--card);\n --muted-foreground: oklch(50% 0 0);\n --accent: oklch(72% 0.18 195);\n --accent-foreground: var(--accent-fg);\n --destructive: var(--danger);\n --border: oklch(15% 0 0 / 0.06);\n --input: var(--border);\n --ring: var(--border-strong);\n}\n\n.dark {\n --border-strong: rgb(255 255 255 / 0.1);\n --accent-fg: #151515;\n --neon: oklch(80% 0.22 145);\n --violet: oklch(68% 0.22 295);\n --danger: oklch(62% 0.22 25);\n --success: oklch(70% 0.18 155);\n --warning: oklch(78% 0.18 75);\n --glass-bg: rgb(28 28 28 / 0.55);\n --glass-border: rgb(255 255 255 / 0.08);\n --glass-strong-bg: rgb(28 28 28 / 0.6);\n --glass-thin-bg: rgb(21 21 21 / 0.45);\n --gradient-bg: linear-gradient(135deg, oklch(19% 0 0) 0%, oklch(22% 0.008 210) 100%);\n --gradient-accent: linear-gradient(to right, oklch(80% 0.18 195) 0%, oklch(72% 0.18 295) 100%);\n --background: #151515;\n --foreground: oklch(96% 0 0);\n --card: #1c1c1c;\n --card-foreground: var(--foreground);\n --popover: var(--card);\n --popover-foreground: var(--foreground);\n --primary: #0285f7;\n --primary-foreground: #ffffff;\n --secondary: var(--card);\n --secondary-foreground: var(--foreground);\n --muted: var(--card);\n --muted-foreground: oklch(62% 0 0);\n --accent: oklch(80% 0.18 195);\n --accent-foreground: var(--accent-fg);\n --destructive: var(--danger);\n --border: rgb(255 255 255 / 0.05);\n --input: var(--border);\n --ring: var(--border-strong);\n}\n\n[data-theme=\"violet\"] {\n --border-strong: oklch(15% 0 0 / 0.12);\n --accent-fg: oklch(15% 0 0);\n --neon: oklch(80% 0.22 145);\n --violet: oklch(68% 0.22 295);\n --danger: oklch(62% 0.22 25);\n --success: oklch(70% 0.18 155);\n --warning: oklch(78% 0.18 75);\n --glass-bg: oklch(99% 0 0 / 0.55);\n --glass-border: oklch(15% 0 0 / 0.08);\n --glass-strong-bg: rgb(255 255 255 / 0.7);\n --glass-thin-bg: rgb(255 255 255 / 0.45);\n --gradient-bg: linear-gradient(135deg, oklch(99% 0 0) 0%, oklch(96% 0.008 210) 100%);\n --gradient-accent: linear-gradient(to right, oklch(72% 0.18 195) 0%, oklch(68% 0.22 295) 100%);\n --background: oklch(99% 0 0);\n --foreground: oklch(15% 0 0);\n --card: oklch(97% 0 0);\n --card-foreground: var(--foreground);\n --popover: var(--card);\n --popover-foreground: var(--foreground);\n --primary: oklch(55% 0.2 290);\n --primary-foreground: oklch(99% 0 0);\n --secondary: var(--card);\n --secondary-foreground: var(--foreground);\n --muted: var(--card);\n --muted-foreground: oklch(50% 0 0);\n --accent: oklch(55% 0.2 290);\n --accent-foreground: oklch(99% 0 0);\n --destructive: var(--danger);\n --border: oklch(15% 0 0 / 0.06);\n --input: var(--border);\n --ring: oklch(55% 0.2 290 / 0.5);\n}\n.dark[data-theme=\"violet\"] {\n --border-strong: rgb(255 255 255 / 0.1);\n --accent-fg: #151515;\n --neon: oklch(80% 0.22 145);\n --violet: oklch(68% 0.22 295);\n --danger: oklch(62% 0.22 25);\n --success: oklch(70% 0.18 155);\n --warning: oklch(78% 0.18 75);\n --glass-bg: rgb(28 28 28 / 0.55);\n --glass-border: rgb(255 255 255 / 0.08);\n --glass-strong-bg: rgb(28 28 28 / 0.6);\n --glass-thin-bg: rgb(21 21 21 / 0.45);\n --gradient-bg: linear-gradient(135deg, oklch(19% 0 0) 0%, oklch(22% 0.008 210) 100%);\n --gradient-accent: linear-gradient(to right, oklch(80% 0.18 195) 0%, oklch(72% 0.18 295) 100%);\n --background: #151515;\n --foreground: oklch(96% 0 0);\n --card: #1c1c1c;\n --card-foreground: var(--foreground);\n --popover: var(--card);\n --popover-foreground: var(--foreground);\n --primary: oklch(72% 0.16 290);\n --primary-foreground: oklch(15% 0 0);\n --secondary: var(--card);\n --secondary-foreground: var(--foreground);\n --muted: var(--card);\n --muted-foreground: oklch(62% 0 0);\n --accent: oklch(72% 0.16 290);\n --accent-foreground: oklch(15% 0 0);\n --destructive: var(--danger);\n --border: rgb(255 255 255 / 0.05);\n --input: var(--border);\n --ring: oklch(72% 0.16 290 / 0.55);\n}\n\n[data-theme=\"blue\"] {\n --border-strong: oklch(15% 0 0 / 0.12);\n --accent-fg: oklch(15% 0 0);\n --neon: oklch(80% 0.22 145);\n --violet: oklch(68% 0.22 295);\n --danger: oklch(62% 0.22 25);\n --success: oklch(70% 0.18 155);\n --warning: oklch(78% 0.18 75);\n --glass-bg: oklch(99% 0 0 / 0.55);\n --glass-border: oklch(15% 0 0 / 0.08);\n --glass-strong-bg: rgb(255 255 255 / 0.7);\n --glass-thin-bg: rgb(255 255 255 / 0.45);\n --gradient-bg: linear-gradient(135deg, oklch(99% 0 0) 0%, oklch(96% 0.008 210) 100%);\n --gradient-accent: linear-gradient(to right, oklch(72% 0.18 195) 0%, oklch(68% 0.22 295) 100%);\n --background: oklch(99% 0 0);\n --foreground: oklch(15% 0 0);\n --card: oklch(97% 0 0);\n --card-foreground: var(--foreground);\n --popover: var(--card);\n --popover-foreground: var(--foreground);\n --primary: oklch(55% 0.18 255);\n --primary-foreground: oklch(99% 0 0);\n --secondary: var(--card);\n --secondary-foreground: var(--foreground);\n --muted: var(--card);\n --muted-foreground: oklch(50% 0 0);\n --accent: oklch(55% 0.18 255);\n --accent-foreground: oklch(99% 0 0);\n --destructive: var(--danger);\n --border: oklch(15% 0 0 / 0.06);\n --input: var(--border);\n --ring: oklch(55% 0.18 255 / 0.5);\n}\n.dark[data-theme=\"blue\"] {\n --border-strong: rgb(255 255 255 / 0.1);\n --accent-fg: #151515;\n --neon: oklch(80% 0.22 145);\n --violet: oklch(68% 0.22 295);\n --danger: oklch(62% 0.22 25);\n --success: oklch(70% 0.18 155);\n --warning: oklch(78% 0.18 75);\n --glass-bg: rgb(28 28 28 / 0.55);\n --glass-border: rgb(255 255 255 / 0.08);\n --glass-strong-bg: rgb(28 28 28 / 0.6);\n --glass-thin-bg: rgb(21 21 21 / 0.45);\n --gradient-bg: linear-gradient(135deg, oklch(19% 0 0) 0%, oklch(22% 0.008 210) 100%);\n --gradient-accent: linear-gradient(to right, oklch(80% 0.18 195) 0%, oklch(72% 0.18 295) 100%);\n --background: #151515;\n --foreground: oklch(96% 0 0);\n --card: #1c1c1c;\n --card-foreground: var(--foreground);\n --popover: var(--card);\n --popover-foreground: var(--foreground);\n --primary: oklch(70% 0.15 255);\n --primary-foreground: oklch(15% 0 0);\n --secondary: var(--card);\n --secondary-foreground: var(--foreground);\n --muted: var(--card);\n --muted-foreground: oklch(62% 0 0);\n --accent: oklch(70% 0.15 255);\n --accent-foreground: oklch(15% 0 0);\n --destructive: var(--danger);\n --border: rgb(255 255 255 / 0.05);\n --input: var(--border);\n --ring: oklch(70% 0.15 255 / 0.55);\n}\n\n[data-theme=\"green\"] {\n --border-strong: oklch(15% 0 0 / 0.12);\n --accent-fg: oklch(15% 0 0);\n --neon: oklch(80% 0.22 145);\n --violet: oklch(68% 0.22 295);\n --danger: oklch(62% 0.22 25);\n --success: oklch(70% 0.18 155);\n --warning: oklch(78% 0.18 75);\n --glass-bg: oklch(99% 0 0 / 0.55);\n --glass-border: oklch(15% 0 0 / 0.08);\n --glass-strong-bg: rgb(255 255 255 / 0.7);\n --glass-thin-bg: rgb(255 255 255 / 0.45);\n --gradient-bg: linear-gradient(135deg, oklch(99% 0 0) 0%, oklch(96% 0.008 210) 100%);\n --gradient-accent: linear-gradient(to right, oklch(72% 0.18 195) 0%, oklch(68% 0.22 295) 100%);\n --background: oklch(99% 0 0);\n --foreground: oklch(15% 0 0);\n --card: oklch(97% 0 0);\n --card-foreground: var(--foreground);\n --popover: var(--card);\n --popover-foreground: var(--foreground);\n --primary: oklch(56% 0.14 150);\n --primary-foreground: oklch(99% 0 0);\n --secondary: var(--card);\n --secondary-foreground: var(--foreground);\n --muted: var(--card);\n --muted-foreground: oklch(50% 0 0);\n --accent: oklch(56% 0.14 150);\n --accent-foreground: oklch(99% 0 0);\n --destructive: var(--danger);\n --border: oklch(15% 0 0 / 0.06);\n --input: var(--border);\n --ring: oklch(56% 0.14 150 / 0.5);\n}\n.dark[data-theme=\"green\"] {\n --border-strong: rgb(255 255 255 / 0.1);\n --accent-fg: #151515;\n --neon: oklch(80% 0.22 145);\n --violet: oklch(68% 0.22 295);\n --danger: oklch(62% 0.22 25);\n --success: oklch(70% 0.18 155);\n --warning: oklch(78% 0.18 75);\n --glass-bg: rgb(28 28 28 / 0.55);\n --glass-border: rgb(255 255 255 / 0.08);\n --glass-strong-bg: rgb(28 28 28 / 0.6);\n --glass-thin-bg: rgb(21 21 21 / 0.45);\n --gradient-bg: linear-gradient(135deg, oklch(19% 0 0) 0%, oklch(22% 0.008 210) 100%);\n --gradient-accent: linear-gradient(to right, oklch(80% 0.18 195) 0%, oklch(72% 0.18 295) 100%);\n --background: #151515;\n --foreground: oklch(96% 0 0);\n --card: #1c1c1c;\n --card-foreground: var(--foreground);\n --popover: var(--card);\n --popover-foreground: var(--foreground);\n --primary: oklch(72% 0.15 150);\n --primary-foreground: oklch(15% 0 0);\n --secondary: var(--card);\n --secondary-foreground: var(--foreground);\n --muted: var(--card);\n --muted-foreground: oklch(62% 0 0);\n --accent: oklch(72% 0.15 150);\n --accent-foreground: oklch(15% 0 0);\n --destructive: var(--danger);\n --border: rgb(255 255 255 / 0.05);\n --input: var(--border);\n --ring: oklch(72% 0.15 150 / 0.55);\n}\n\n[data-theme=\"amber\"] {\n --border-strong: oklch(15% 0 0 / 0.12);\n --accent-fg: oklch(15% 0 0);\n --neon: oklch(80% 0.22 145);\n --violet: oklch(68% 0.22 295);\n --danger: oklch(62% 0.22 25);\n --success: oklch(70% 0.18 155);\n --warning: oklch(78% 0.18 75);\n --glass-bg: oklch(99% 0 0 / 0.55);\n --glass-border: oklch(15% 0 0 / 0.08);\n --glass-strong-bg: rgb(255 255 255 / 0.7);\n --glass-thin-bg: rgb(255 255 255 / 0.45);\n --gradient-bg: linear-gradient(135deg, oklch(99% 0 0) 0%, oklch(96% 0.008 210) 100%);\n --gradient-accent: linear-gradient(to right, oklch(72% 0.18 195) 0%, oklch(68% 0.22 295) 100%);\n --background: oklch(99% 0 0);\n --foreground: oklch(15% 0 0);\n --card: oklch(97% 0 0);\n --card-foreground: var(--foreground);\n --popover: var(--card);\n --popover-foreground: var(--foreground);\n --primary: oklch(74% 0.15 70);\n --primary-foreground: oklch(20% 0.02 70);\n --secondary: var(--card);\n --secondary-foreground: var(--foreground);\n --muted: var(--card);\n --muted-foreground: oklch(50% 0 0);\n --accent: oklch(74% 0.15 70);\n --accent-foreground: oklch(20% 0.02 70);\n --destructive: var(--danger);\n --border: oklch(15% 0 0 / 0.06);\n --input: var(--border);\n --ring: oklch(74% 0.15 70 / 0.5);\n}\n.dark[data-theme=\"amber\"] {\n --border-strong: rgb(255 255 255 / 0.1);\n --accent-fg: #151515;\n --neon: oklch(80% 0.22 145);\n --violet: oklch(68% 0.22 295);\n --danger: oklch(62% 0.22 25);\n --success: oklch(70% 0.18 155);\n --warning: oklch(78% 0.18 75);\n --glass-bg: rgb(28 28 28 / 0.55);\n --glass-border: rgb(255 255 255 / 0.08);\n --glass-strong-bg: rgb(28 28 28 / 0.6);\n --glass-thin-bg: rgb(21 21 21 / 0.45);\n --gradient-bg: linear-gradient(135deg, oklch(19% 0 0) 0%, oklch(22% 0.008 210) 100%);\n --gradient-accent: linear-gradient(to right, oklch(80% 0.18 195) 0%, oklch(72% 0.18 295) 100%);\n --background: #151515;\n --foreground: oklch(96% 0 0);\n --card: #1c1c1c;\n --card-foreground: var(--foreground);\n --popover: var(--card);\n --popover-foreground: var(--foreground);\n --primary: oklch(80% 0.15 75);\n --primary-foreground: oklch(18% 0.02 75);\n --secondary: var(--card);\n --secondary-foreground: var(--foreground);\n --muted: var(--card);\n --muted-foreground: oklch(62% 0 0);\n --accent: oklch(80% 0.15 75);\n --accent-foreground: oklch(18% 0.02 75);\n --destructive: var(--danger);\n --border: rgb(255 255 255 / 0.05);\n --input: var(--border);\n --ring: oklch(80% 0.15 75 / 0.55);\n}\n\n[data-theme=\"blood-orange\"] {\n --border-strong: oklch(15% 0 0 / 0.12);\n --accent-fg: oklch(15% 0 0);\n --neon: oklch(80% 0.22 145);\n --violet: oklch(68% 0.22 295);\n --danger: oklch(62% 0.22 25);\n --success: oklch(70% 0.18 155);\n --warning: oklch(78% 0.18 75);\n --glass-bg: oklch(99% 0 0 / 0.55);\n --glass-border: oklch(15% 0 0 / 0.08);\n --glass-strong-bg: rgb(255 255 255 / 0.7);\n --glass-thin-bg: rgb(255 255 255 / 0.45);\n --gradient-bg: linear-gradient(135deg, oklch(99% 0 0) 0%, oklch(96% 0.008 210) 100%);\n --gradient-accent: linear-gradient(to right, oklch(72% 0.18 195) 0%, oklch(68% 0.22 295) 100%);\n --background: oklch(99% 0 0);\n --foreground: oklch(15% 0 0);\n --card: oklch(97% 0 0);\n --card-foreground: var(--foreground);\n --popover: var(--card);\n --popover-foreground: var(--foreground);\n --primary: oklch(60% 0.19 40);\n --primary-foreground: oklch(99% 0 0);\n --secondary: var(--card);\n --secondary-foreground: var(--foreground);\n --muted: var(--card);\n --muted-foreground: oklch(50% 0 0);\n --accent: oklch(60% 0.19 40);\n --accent-foreground: oklch(99% 0 0);\n --destructive: var(--danger);\n --border: oklch(15% 0 0 / 0.06);\n --input: var(--border);\n --ring: oklch(60% 0.19 40 / 0.5);\n}\n.dark[data-theme=\"blood-orange\"] {\n --border-strong: rgb(255 255 255 / 0.1);\n --accent-fg: #151515;\n --neon: oklch(80% 0.22 145);\n --violet: oklch(68% 0.22 295);\n --danger: oklch(62% 0.22 25);\n --success: oklch(70% 0.18 155);\n --warning: oklch(78% 0.18 75);\n --glass-bg: rgb(28 28 28 / 0.55);\n --glass-border: rgb(255 255 255 / 0.08);\n --glass-strong-bg: rgb(28 28 28 / 0.6);\n --glass-thin-bg: rgb(21 21 21 / 0.45);\n --gradient-bg: linear-gradient(135deg, oklch(19% 0 0) 0%, oklch(22% 0.008 210) 100%);\n --gradient-accent: linear-gradient(to right, oklch(80% 0.18 195) 0%, oklch(72% 0.18 295) 100%);\n --background: #151515;\n --foreground: oklch(96% 0 0);\n --card: #1c1c1c;\n --card-foreground: var(--foreground);\n --popover: var(--card);\n --popover-foreground: var(--foreground);\n --primary: oklch(72% 0.17 42);\n --primary-foreground: oklch(15% 0 0);\n --secondary: var(--card);\n --secondary-foreground: var(--foreground);\n --muted: var(--card);\n --muted-foreground: oklch(62% 0 0);\n --accent: oklch(72% 0.17 42);\n --accent-foreground: oklch(15% 0 0);\n --destructive: var(--danger);\n --border: rgb(255 255 255 / 0.05);\n --input: var(--border);\n --ring: oklch(72% 0.17 42 / 0.55);\n}\n\n[data-theme=\"rose\"] {\n --border-strong: oklch(15% 0 0 / 0.12);\n --accent-fg: oklch(15% 0 0);\n --neon: oklch(80% 0.22 145);\n --violet: oklch(68% 0.22 295);\n --danger: oklch(62% 0.22 25);\n --success: oklch(70% 0.18 155);\n --warning: oklch(78% 0.18 75);\n --glass-bg: oklch(99% 0 0 / 0.55);\n --glass-border: oklch(15% 0 0 / 0.08);\n --glass-strong-bg: rgb(255 255 255 / 0.7);\n --glass-thin-bg: rgb(255 255 255 / 0.45);\n --gradient-bg: linear-gradient(135deg, oklch(99% 0 0) 0%, oklch(96% 0.008 210) 100%);\n --gradient-accent: linear-gradient(to right, oklch(72% 0.18 195) 0%, oklch(68% 0.22 295) 100%);\n --background: oklch(99% 0 0);\n --foreground: oklch(15% 0 0);\n --card: oklch(97% 0 0);\n --card-foreground: var(--foreground);\n --popover: var(--card);\n --popover-foreground: var(--foreground);\n --primary: oklch(58% 0.2 12);\n --primary-foreground: oklch(99% 0 0);\n --secondary: var(--card);\n --secondary-foreground: var(--foreground);\n --muted: var(--card);\n --muted-foreground: oklch(50% 0 0);\n --accent: oklch(58% 0.2 12);\n --accent-foreground: oklch(99% 0 0);\n --destructive: var(--danger);\n --border: oklch(15% 0 0 / 0.06);\n --input: var(--border);\n --ring: oklch(58% 0.2 12 / 0.5);\n}\n.dark[data-theme=\"rose\"] {\n --border-strong: rgb(255 255 255 / 0.1);\n --accent-fg: #151515;\n --neon: oklch(80% 0.22 145);\n --violet: oklch(68% 0.22 295);\n --danger: oklch(62% 0.22 25);\n --success: oklch(70% 0.18 155);\n --warning: oklch(78% 0.18 75);\n --glass-bg: rgb(28 28 28 / 0.55);\n --glass-border: rgb(255 255 255 / 0.08);\n --glass-strong-bg: rgb(28 28 28 / 0.6);\n --glass-thin-bg: rgb(21 21 21 / 0.45);\n --gradient-bg: linear-gradient(135deg, oklch(19% 0 0) 0%, oklch(22% 0.008 210) 100%);\n --gradient-accent: linear-gradient(to right, oklch(80% 0.18 195) 0%, oklch(72% 0.18 295) 100%);\n --background: #151515;\n --foreground: oklch(96% 0 0);\n --card: #1c1c1c;\n --card-foreground: var(--foreground);\n --popover: var(--card);\n --popover-foreground: var(--foreground);\n --primary: oklch(70% 0.17 12);\n --primary-foreground: oklch(15% 0 0);\n --secondary: var(--card);\n --secondary-foreground: var(--foreground);\n --muted: var(--card);\n --muted-foreground: oklch(62% 0 0);\n --accent: oklch(70% 0.17 12);\n --accent-foreground: oklch(15% 0 0);\n --destructive: var(--danger);\n --border: rgb(255 255 255 / 0.05);\n --input: var(--border);\n --ring: oklch(70% 0.17 12 / 0.55);\n}\n\n[data-theme=\"red\"] {\n --border-strong: oklch(15% 0 0 / 0.12);\n --accent-fg: oklch(15% 0 0);\n --neon: oklch(80% 0.22 145);\n --violet: oklch(68% 0.22 295);\n --danger: oklch(62% 0.22 25);\n --success: oklch(70% 0.18 155);\n --warning: oklch(78% 0.18 75);\n --glass-bg: oklch(99% 0 0 / 0.55);\n --glass-border: oklch(15% 0 0 / 0.08);\n --glass-strong-bg: rgb(255 255 255 / 0.7);\n --glass-thin-bg: rgb(255 255 255 / 0.45);\n --gradient-bg: linear-gradient(135deg, oklch(99% 0 0) 0%, oklch(96% 0.008 210) 100%);\n --gradient-accent: linear-gradient(to right, oklch(72% 0.18 195) 0%, oklch(68% 0.22 295) 100%);\n --background: oklch(99% 0 0);\n --foreground: oklch(15% 0 0);\n --card: oklch(97% 0 0);\n --card-foreground: var(--foreground);\n --popover: var(--card);\n --popover-foreground: var(--foreground);\n --primary: oklch(55% 0.22 25);\n --primary-foreground: oklch(99% 0 0);\n --secondary: var(--card);\n --secondary-foreground: var(--foreground);\n --muted: var(--card);\n --muted-foreground: oklch(50% 0 0);\n --accent: oklch(55% 0.22 25);\n --accent-foreground: oklch(99% 0 0);\n --destructive: var(--danger);\n --border: oklch(15% 0 0 / 0.06);\n --input: var(--border);\n --ring: oklch(55% 0.22 25 / 0.5);\n}\n.dark[data-theme=\"red\"] {\n --border-strong: rgb(255 255 255 / 0.1);\n --accent-fg: #151515;\n --neon: oklch(80% 0.22 145);\n --violet: oklch(68% 0.22 295);\n --danger: oklch(62% 0.22 25);\n --success: oklch(70% 0.18 155);\n --warning: oklch(78% 0.18 75);\n --glass-bg: rgb(28 28 28 / 0.55);\n --glass-border: rgb(255 255 255 / 0.08);\n --glass-strong-bg: rgb(28 28 28 / 0.6);\n --glass-thin-bg: rgb(21 21 21 / 0.45);\n --gradient-bg: linear-gradient(135deg, oklch(19% 0 0) 0%, oklch(22% 0.008 210) 100%);\n --gradient-accent: linear-gradient(to right, oklch(80% 0.18 195) 0%, oklch(72% 0.18 295) 100%);\n --background: #151515;\n --foreground: oklch(96% 0 0);\n --card: #1c1c1c;\n --card-foreground: var(--foreground);\n --popover: var(--card);\n --popover-foreground: var(--foreground);\n --primary: oklch(68% 0.19 25);\n --primary-foreground: oklch(15% 0 0);\n --secondary: var(--card);\n --secondary-foreground: var(--foreground);\n --muted: var(--card);\n --muted-foreground: oklch(62% 0 0);\n --accent: oklch(68% 0.19 25);\n --accent-foreground: oklch(15% 0 0);\n --destructive: var(--danger);\n --border: rgb(255 255 255 / 0.05);\n --input: var(--border);\n --ring: oklch(68% 0.19 25 / 0.55);\n}\n\n[data-theme=\"teal\"] {\n --border-strong: oklch(15% 0 0 / 0.12);\n --accent-fg: oklch(15% 0 0);\n --neon: oklch(80% 0.22 145);\n --violet: oklch(68% 0.22 295);\n --danger: oklch(62% 0.22 25);\n --success: oklch(70% 0.18 155);\n --warning: oklch(78% 0.18 75);\n --glass-bg: oklch(99% 0 0 / 0.55);\n --glass-border: oklch(15% 0 0 / 0.08);\n --glass-strong-bg: rgb(255 255 255 / 0.7);\n --glass-thin-bg: rgb(255 255 255 / 0.45);\n --gradient-bg: linear-gradient(135deg, oklch(99% 0 0) 0%, oklch(96% 0.008 210) 100%);\n --gradient-accent: linear-gradient(to right, oklch(72% 0.18 195) 0%, oklch(68% 0.22 295) 100%);\n --background: oklch(99% 0 0);\n --foreground: oklch(15% 0 0);\n --card: oklch(97% 0 0);\n --card-foreground: var(--foreground);\n --popover: var(--card);\n --popover-foreground: var(--foreground);\n --primary: oklch(55% 0.12 185);\n --primary-foreground: oklch(99% 0 0);\n --secondary: var(--card);\n --secondary-foreground: var(--foreground);\n --muted: var(--card);\n --muted-foreground: oklch(50% 0 0);\n --accent: oklch(55% 0.12 185);\n --accent-foreground: oklch(99% 0 0);\n --destructive: var(--danger);\n --border: oklch(15% 0 0 / 0.06);\n --input: var(--border);\n --ring: oklch(55% 0.12 185 / 0.5);\n}\n.dark[data-theme=\"teal\"] {\n --border-strong: rgb(255 255 255 / 0.1);\n --accent-fg: #151515;\n --neon: oklch(80% 0.22 145);\n --violet: oklch(68% 0.22 295);\n --danger: oklch(62% 0.22 25);\n --success: oklch(70% 0.18 155);\n --warning: oklch(78% 0.18 75);\n --glass-bg: rgb(28 28 28 / 0.55);\n --glass-border: rgb(255 255 255 / 0.08);\n --glass-strong-bg: rgb(28 28 28 / 0.6);\n --glass-thin-bg: rgb(21 21 21 / 0.45);\n --gradient-bg: linear-gradient(135deg, oklch(19% 0 0) 0%, oklch(22% 0.008 210) 100%);\n --gradient-accent: linear-gradient(to right, oklch(80% 0.18 195) 0%, oklch(72% 0.18 295) 100%);\n --background: #151515;\n --foreground: oklch(96% 0 0);\n --card: #1c1c1c;\n --card-foreground: var(--foreground);\n --popover: var(--card);\n --popover-foreground: var(--foreground);\n --primary: oklch(72% 0.13 185);\n --primary-foreground: oklch(15% 0 0);\n --secondary: var(--card);\n --secondary-foreground: var(--foreground);\n --muted: var(--card);\n --muted-foreground: oklch(62% 0 0);\n --accent: oklch(72% 0.13 185);\n --accent-foreground: oklch(15% 0 0);\n --destructive: var(--danger);\n --border: rgb(255 255 255 / 0.05);\n --input: var(--border);\n --ring: oklch(72% 0.13 185 / 0.55);\n}\n\n[data-theme=\"indigo\"] {\n --border-strong: oklch(15% 0 0 / 0.12);\n --accent-fg: oklch(15% 0 0);\n --neon: oklch(80% 0.22 145);\n --violet: oklch(68% 0.22 295);\n --danger: oklch(62% 0.22 25);\n --success: oklch(70% 0.18 155);\n --warning: oklch(78% 0.18 75);\n --glass-bg: oklch(99% 0 0 / 0.55);\n --glass-border: oklch(15% 0 0 / 0.08);\n --glass-strong-bg: rgb(255 255 255 / 0.7);\n --glass-thin-bg: rgb(255 255 255 / 0.45);\n --gradient-bg: linear-gradient(135deg, oklch(99% 0 0) 0%, oklch(96% 0.008 210) 100%);\n --gradient-accent: linear-gradient(to right, oklch(72% 0.18 195) 0%, oklch(68% 0.22 295) 100%);\n --background: oklch(99% 0 0);\n --foreground: oklch(15% 0 0);\n --card: oklch(97% 0 0);\n --card-foreground: var(--foreground);\n --popover: var(--card);\n --popover-foreground: var(--foreground);\n --primary: oklch(50% 0.2 275);\n --primary-foreground: oklch(99% 0 0);\n --secondary: var(--card);\n --secondary-foreground: var(--foreground);\n --muted: var(--card);\n --muted-foreground: oklch(50% 0 0);\n --accent: oklch(50% 0.2 275);\n --accent-foreground: oklch(99% 0 0);\n --destructive: var(--danger);\n --border: oklch(15% 0 0 / 0.06);\n --input: var(--border);\n --ring: oklch(50% 0.2 275 / 0.5);\n}\n.dark[data-theme=\"indigo\"] {\n --border-strong: rgb(255 255 255 / 0.1);\n --accent-fg: #151515;\n --neon: oklch(80% 0.22 145);\n --violet: oklch(68% 0.22 295);\n --danger: oklch(62% 0.22 25);\n --success: oklch(70% 0.18 155);\n --warning: oklch(78% 0.18 75);\n --glass-bg: rgb(28 28 28 / 0.55);\n --glass-border: rgb(255 255 255 / 0.08);\n --glass-strong-bg: rgb(28 28 28 / 0.6);\n --glass-thin-bg: rgb(21 21 21 / 0.45);\n --gradient-bg: linear-gradient(135deg, oklch(19% 0 0) 0%, oklch(22% 0.008 210) 100%);\n --gradient-accent: linear-gradient(to right, oklch(80% 0.18 195) 0%, oklch(72% 0.18 295) 100%);\n --background: #151515;\n --foreground: oklch(96% 0 0);\n --card: #1c1c1c;\n --card-foreground: var(--foreground);\n --popover: var(--card);\n --popover-foreground: var(--foreground);\n --primary: oklch(70% 0.16 275);\n --primary-foreground: oklch(15% 0 0);\n --secondary: var(--card);\n --secondary-foreground: var(--foreground);\n --muted: var(--card);\n --muted-foreground: oklch(62% 0 0);\n --accent: oklch(70% 0.16 275);\n --accent-foreground: oklch(15% 0 0);\n --destructive: var(--danger);\n --border: rgb(255 255 255 / 0.05);\n --input: var(--border);\n --ring: oklch(70% 0.16 275 / 0.55);\n}\n\n[data-theme=\"lime\"] {\n --border-strong: oklch(15% 0 0 / 0.12);\n --accent-fg: oklch(15% 0 0);\n --neon: oklch(80% 0.22 145);\n --violet: oklch(68% 0.22 295);\n --danger: oklch(62% 0.22 25);\n --success: oklch(70% 0.18 155);\n --warning: oklch(78% 0.18 75);\n --glass-bg: oklch(99% 0 0 / 0.55);\n --glass-border: oklch(15% 0 0 / 0.08);\n --glass-strong-bg: rgb(255 255 255 / 0.7);\n --glass-thin-bg: rgb(255 255 255 / 0.45);\n --gradient-bg: linear-gradient(135deg, oklch(99% 0 0) 0%, oklch(96% 0.008 210) 100%);\n --gradient-accent: linear-gradient(to right, oklch(72% 0.18 195) 0%, oklch(68% 0.22 295) 100%);\n --background: oklch(99% 0 0);\n --foreground: oklch(15% 0 0);\n --card: oklch(97% 0 0);\n --card-foreground: var(--foreground);\n --popover: var(--card);\n --popover-foreground: var(--foreground);\n --primary: oklch(72% 0.18 130);\n --primary-foreground: oklch(20% 0.04 130);\n --secondary: var(--card);\n --secondary-foreground: var(--foreground);\n --muted: var(--card);\n --muted-foreground: oklch(50% 0 0);\n --accent: oklch(72% 0.18 130);\n --accent-foreground: oklch(20% 0.04 130);\n --destructive: var(--danger);\n --border: oklch(15% 0 0 / 0.06);\n --input: var(--border);\n --ring: oklch(72% 0.18 130 / 0.5);\n}\n.dark[data-theme=\"lime\"] {\n --border-strong: rgb(255 255 255 / 0.1);\n --accent-fg: #151515;\n --neon: oklch(80% 0.22 145);\n --violet: oklch(68% 0.22 295);\n --danger: oklch(62% 0.22 25);\n --success: oklch(70% 0.18 155);\n --warning: oklch(78% 0.18 75);\n --glass-bg: rgb(28 28 28 / 0.55);\n --glass-border: rgb(255 255 255 / 0.08);\n --glass-strong-bg: rgb(28 28 28 / 0.6);\n --glass-thin-bg: rgb(21 21 21 / 0.45);\n --gradient-bg: linear-gradient(135deg, oklch(19% 0 0) 0%, oklch(22% 0.008 210) 100%);\n --gradient-accent: linear-gradient(to right, oklch(80% 0.18 195) 0%, oklch(72% 0.18 295) 100%);\n --background: #151515;\n --foreground: oklch(96% 0 0);\n --card: #1c1c1c;\n --card-foreground: var(--foreground);\n --popover: var(--card);\n --popover-foreground: var(--foreground);\n --primary: oklch(80% 0.18 130);\n --primary-foreground: oklch(18% 0.04 130);\n --secondary: var(--card);\n --secondary-foreground: var(--foreground);\n --muted: var(--card);\n --muted-foreground: oklch(62% 0 0);\n --accent: oklch(80% 0.18 130);\n --accent-foreground: oklch(18% 0.04 130);\n --destructive: var(--danger);\n --border: rgb(255 255 255 / 0.05);\n --input: var(--border);\n --ring: oklch(80% 0.18 130 / 0.55);\n}\n\n@theme inline {\n --ease-out: cubic-bezier(0.16, 1, 0.3, 1);\n --ease-in-out: cubic-bezier(0.77, 0, 0.175, 1);\n --ease-drawer: cubic-bezier(0.32, 0.72, 0, 1);\n --color-border: var(--border);\n --color-border-strong: var(--border-strong);\n --color-neon: var(--neon);\n --color-violet: var(--violet);\n --color-success: var(--success);\n --color-warning: var(--warning);\n --color-background: var(--background);\n --color-foreground: var(--foreground);\n --color-card: var(--card);\n --color-card-foreground: var(--card-foreground);\n --color-popover: var(--popover);\n --color-popover-foreground: var(--popover-foreground);\n --color-primary: var(--primary);\n --color-primary-foreground: var(--primary-foreground);\n --color-secondary: var(--secondary);\n --color-secondary-foreground: var(--secondary-foreground);\n --color-muted: var(--muted);\n --color-muted-foreground: var(--muted-foreground);\n --color-accent: var(--accent);\n --color-accent-foreground: var(--accent-foreground);\n --color-destructive: var(--destructive);\n --color-input: var(--input);\n --color-ring: var(--ring);\n --font-sans: var(--font-geist-sans, Geist), ui-sans-serif, system-ui, sans-serif;\n --font-mono: var(--font-geist-mono, \"Geist Mono\"), ui-monospace, monospace;\n --font-display: var(--font-geist-sans, Geist), ui-sans-serif, system-ui, sans-serif;\n}\n\n"
1309
+ },
1310
+ {
1311
+ "path": "registry/orvui/agents/agent-activity/LICENSE.simple-icons.txt",
1312
+ "target": "~/src/components/orvui/agents/agent-activity/LICENSE.simple-icons.txt",
1313
+ "type": "registry:file",
1314
+ "content": "# CC0 1.0 Universal\n\n## Statement of Purpose\n\nThe laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an “owner”) of an original work of authorship and/or a database (each, a “Work”).\n\nCertain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works (“Commons”) that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others.\n\nFor these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the “Affirmer”), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights.\n\n1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights (“Copyright and Related Rights”). Copyright and Related Rights include, but are not limited to, the following:\n 1. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work;\n 2. moral rights retained by the original author(s) and/or performer(s);\n 3. publicity and privacy rights pertaining to a person’s image or likeness depicted in a Work;\n 4. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(i), below;\n 5. rights protecting the extraction, dissemination, use and reuse of data in a Work;\n 6. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and\n 7. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof.\n\n2. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer’s Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the “Waiver”). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer’s heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer’s express Statement of Purpose.\n\n3. Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer’s express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer’s Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the “License”). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer’s express Statement of Purpose.\n\n4. Limitations and Disclaimers.\n 1. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document.\n 2. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law.\n 3. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person’s Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work.\n 4. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work.\n\nFor more information, please see <https://creativecommons.org/publicdomain/zero/1.0>.\n"
1315
+ },
1316
+ {
1317
+ "path": "registry/orvui/LICENSE.txt",
1318
+ "target": "~/src/components/orvui/LICENSE.txt",
1319
+ "type": "registry:file",
1320
+ "content": "MIT License\n\nCopyright (c) 2026 everfu\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
1321
+ },
1322
+ {
1323
+ "path": "registry/orvui/NOTICE.txt",
1324
+ "target": "~/src/components/orvui/NOTICE.txt",
1325
+ "type": "registry:file",
1326
+ "content": "orvui component library\n\nCopyright (c) 2026 everfu. orvui source is distributed under MIT.\nPublic signatures, numeric palette values and visual compatibility inputs are\nmaintained as the product contract. Third-party material remains separately\nlicensed; the orvui MIT license does not replace the terms below.\n\nThe documentation hero uses the framework-neutral border-beam 1.4.1 generator,\nCopyright (c) 2026 Jakub Antalik, MIT licensed. Its license is retained at\napps/docs/public/licenses/border-beam-MIT.txt.\n\nPaper Design GPU programs and @paper-design/shaders remain under PolyForm\nShield 1.0.0. See src/motion/shader-background/LICENSE.paper-design in the\npackage and /licenses/paper-design-PolyForm-Shield.txt in the documentation.\n\nGeist and Geist Mono come from installed Fontsource packages. Their SIL Open\nFont License texts are retained in the documentation licenses directory.\nLucide icons retain their ISC license. Simple Icons brand assets come from\n@iconify-json/simple-icons 1.2.100 and retain CC0 1.0 Universal; see the\nadjacent LICENSE.simple-icons files and /licenses/simple-icons-CC0.txt.\n\nDemo photography is separate third-party material served by Unsplash and\nLorem Picsum, under the provider's terms: https://unsplash.com/license .\nDiceBear Glass avatars are CC0: https://www.dicebear.com/styles/glass/ .\nCountry flag images come from Flagpedia's documented CDN service:\nhttps://flagpedia.net/download/api . These media are not relicensed as orvui code.\nConsumer-level source records are in tools/catalog/media-provenance.json;\nthe documentation serves a copy at /media-provenance.json.\n\nSynthetic club badges, terrain illustrations and demonstration copy authored\nin this implementation use the orvui MIT license. No institutional or sports\nteam marks are bundled with the synthetic market-card example.\n"
1327
+ }
1328
+ ],
1329
+ "dependencies": [
1330
+ "clsx@^2.1.1",
1331
+ "lucide-vue-next@^0.468.0",
1332
+ "motion-v@^1.10.0",
1333
+ "shiki@^3.0.0",
1334
+ "tailwind-merge@^3.0.0",
1335
+ "tailwindcss@^4.0.0"
1336
+ ],
1337
+ "meta": {
1338
+ "product": "orvui",
1339
+ "version": "0.1.0",
1340
+ "package": "@orvui/vue",
1341
+ "category": "agents",
1342
+ "registry": "https://orvui.efu.me/r/chat-app.json"
1343
+ }
1344
+ }