@diegopluna/narvi 0.0.0-stage → 0.0.1

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 (351) hide show
  1. package/README.md +82 -2
  2. package/dist/components/activity/ActivityContent.svelte +55 -0
  3. package/dist/components/activity/ActivityContent.svelte.d.ts +11 -0
  4. package/dist/components/activity/ActivityRoot.svelte +66 -0
  5. package/dist/components/activity/ActivityRoot.svelte.d.ts +17 -0
  6. package/dist/components/activity/ActivityStep.svelte +157 -0
  7. package/dist/components/activity/ActivityStep.svelte.d.ts +26 -0
  8. package/dist/components/activity/ActivityThought.svelte +60 -0
  9. package/dist/components/activity/ActivityThought.svelte.d.ts +10 -0
  10. package/dist/components/activity/ActivityTrigger.svelte +103 -0
  11. package/dist/components/activity/ActivityTrigger.svelte.d.ts +20 -0
  12. package/dist/components/activity/context.d.ts +7 -0
  13. package/dist/components/activity/context.js +11 -0
  14. package/dist/components/activity/index.d.ts +11 -0
  15. package/dist/components/activity/index.js +6 -0
  16. package/dist/components/announcer/Announcer.svelte +84 -0
  17. package/dist/components/announcer/Announcer.svelte.d.ts +13 -0
  18. package/dist/components/app-shell/AppShellHeader.svelte +54 -0
  19. package/dist/components/app-shell/AppShellHeader.svelte.d.ts +15 -0
  20. package/dist/components/app-shell/AppShellMain.svelte +49 -0
  21. package/dist/components/app-shell/AppShellMain.svelte.d.ts +11 -0
  22. package/dist/components/app-shell/AppShellPanel.svelte +107 -0
  23. package/dist/components/app-shell/AppShellPanel.svelte.d.ts +18 -0
  24. package/dist/components/app-shell/AppShellRoot.svelte +136 -0
  25. package/dist/components/app-shell/AppShellRoot.svelte.d.ts +28 -0
  26. package/dist/components/app-shell/AppShellSidebar.svelte +192 -0
  27. package/dist/components/app-shell/AppShellSidebar.svelte.d.ts +17 -0
  28. package/dist/components/app-shell/AppShellToggle.svelte +50 -0
  29. package/dist/components/app-shell/AppShellToggle.svelte.d.ts +10 -0
  30. package/dist/components/app-shell/context.d.ts +15 -0
  31. package/dist/components/app-shell/context.js +15 -0
  32. package/dist/components/app-shell/index.d.ts +15 -0
  33. package/dist/components/app-shell/index.js +8 -0
  34. package/dist/components/approval/Approval.svelte +213 -0
  35. package/dist/components/approval/Approval.svelte.d.ts +38 -0
  36. package/dist/components/avatar/AvatarFallback.svelte +73 -0
  37. package/dist/components/avatar/AvatarFallback.svelte.d.ts +11 -0
  38. package/dist/components/avatar/AvatarImage.svelte +75 -0
  39. package/dist/components/avatar/AvatarImage.svelte.d.ts +11 -0
  40. package/dist/components/avatar/AvatarRoot.svelte +108 -0
  41. package/dist/components/avatar/AvatarRoot.svelte.d.ts +19 -0
  42. package/dist/components/avatar/context.d.ts +11 -0
  43. package/dist/components/avatar/context.js +11 -0
  44. package/dist/components/avatar/index.d.ts +7 -0
  45. package/dist/components/avatar/index.js +6 -0
  46. package/dist/components/badge/Badge.svelte +78 -0
  47. package/dist/components/badge/Badge.svelte.d.ts +15 -0
  48. package/dist/components/button/Button.svelte +270 -0
  49. package/dist/components/button/Button.svelte.d.ts +22 -0
  50. package/dist/components/card/Card.svelte +65 -0
  51. package/dist/components/card/Card.svelte.d.ts +15 -0
  52. package/dist/components/change-stats/ChangeStats.svelte +52 -0
  53. package/dist/components/change-stats/ChangeStats.svelte.d.ts +14 -0
  54. package/dist/components/changes-summary/ChangesSummary.svelte +152 -0
  55. package/dist/components/changes-summary/ChangesSummary.svelte.d.ts +20 -0
  56. package/dist/components/checkbox/Checkbox.svelte +178 -0
  57. package/dist/components/checkbox/Checkbox.svelte.d.ts +19 -0
  58. package/dist/components/code/Code.svelte +33 -0
  59. package/dist/components/code/Code.svelte.d.ts +10 -0
  60. package/dist/components/command/CommandDialog.svelte +37 -0
  61. package/dist/components/command/CommandDialog.svelte.d.ts +12 -0
  62. package/dist/components/command/CommandEmpty.svelte +20 -0
  63. package/dist/components/command/CommandEmpty.svelte.d.ts +11 -0
  64. package/dist/components/command/CommandFooter.svelte +25 -0
  65. package/dist/components/command/CommandFooter.svelte.d.ts +11 -0
  66. package/dist/components/command/CommandGroup.svelte +25 -0
  67. package/dist/components/command/CommandGroup.svelte.d.ts +12 -0
  68. package/dist/components/command/CommandInput.svelte +33 -0
  69. package/dist/components/command/CommandInput.svelte.d.ts +8 -0
  70. package/dist/components/command/CommandItem.svelte +49 -0
  71. package/dist/components/command/CommandItem.svelte.d.ts +16 -0
  72. package/dist/components/command/CommandList.svelte +21 -0
  73. package/dist/components/command/CommandList.svelte.d.ts +10 -0
  74. package/dist/components/command/CommandRoot.svelte +20 -0
  75. package/dist/components/command/CommandRoot.svelte.d.ts +11 -0
  76. package/dist/components/command/index.d.ts +20 -0
  77. package/dist/components/command/index.js +12 -0
  78. package/dist/components/command/styles.d.ts +117 -0
  79. package/dist/components/command/styles.js +121 -0
  80. package/dist/components/composer/ComposerAttachButton.svelte +55 -0
  81. package/dist/components/composer/ComposerAttachButton.svelte.d.ts +14 -0
  82. package/dist/components/composer/ComposerAttachment.svelte +173 -0
  83. package/dist/components/composer/ComposerAttachment.svelte.d.ts +13 -0
  84. package/dist/components/composer/ComposerAttachments.svelte +63 -0
  85. package/dist/components/composer/ComposerAttachments.svelte.d.ts +13 -0
  86. package/dist/components/composer/ComposerModelPicker.svelte +475 -0
  87. package/dist/components/composer/ComposerModelPicker.svelte.d.ts +27 -0
  88. package/dist/components/composer/ComposerRoot.svelte +315 -0
  89. package/dist/components/composer/ComposerRoot.svelte.d.ts +42 -0
  90. package/dist/components/composer/ComposerSubmit.svelte +131 -0
  91. package/dist/components/composer/ComposerSubmit.svelte.d.ts +13 -0
  92. package/dist/components/composer/ComposerTextarea.svelte +109 -0
  93. package/dist/components/composer/ComposerTextarea.svelte.d.ts +9 -0
  94. package/dist/components/composer/ComposerToggle.svelte +106 -0
  95. package/dist/components/composer/ComposerToggle.svelte.d.ts +14 -0
  96. package/dist/components/composer/ComposerToolbar.svelte +29 -0
  97. package/dist/components/composer/ComposerToolbar.svelte.d.ts +11 -0
  98. package/dist/components/composer/context.d.ts +53 -0
  99. package/dist/components/composer/context.js +32 -0
  100. package/dist/components/composer/index.d.ts +21 -0
  101. package/dist/components/composer/index.js +13 -0
  102. package/dist/components/conversation/ConversationContent.svelte +94 -0
  103. package/dist/components/conversation/ConversationContent.svelte.d.ts +15 -0
  104. package/dist/components/conversation/ConversationEmpty.svelte +89 -0
  105. package/dist/components/conversation/ConversationEmpty.svelte.d.ts +16 -0
  106. package/dist/components/conversation/ConversationRoot.svelte +237 -0
  107. package/dist/components/conversation/ConversationRoot.svelte.d.ts +20 -0
  108. package/dist/components/conversation/ConversationScrollButton.svelte +114 -0
  109. package/dist/components/conversation/ConversationScrollButton.svelte.d.ts +14 -0
  110. package/dist/components/conversation/context.d.ts +28 -0
  111. package/dist/components/conversation/context.js +15 -0
  112. package/dist/components/conversation/index.d.ts +11 -0
  113. package/dist/components/conversation/index.js +8 -0
  114. package/dist/components/conversation/scrolling.d.ts +25 -0
  115. package/dist/components/conversation/scrolling.js +60 -0
  116. package/dist/components/dev-styles/DevStyles.svelte +21 -0
  117. package/dist/components/dev-styles/DevStyles.svelte.d.ts +3 -0
  118. package/dist/components/dialog/ConfirmDialog.svelte +157 -0
  119. package/dist/components/dialog/ConfirmDialog.svelte.d.ts +31 -0
  120. package/dist/components/dialog/DialogBody.svelte +19 -0
  121. package/dist/components/dialog/DialogBody.svelte.d.ts +10 -0
  122. package/dist/components/dialog/DialogContent.svelte +55 -0
  123. package/dist/components/dialog/DialogContent.svelte.d.ts +17 -0
  124. package/dist/components/dialog/DialogDescription.svelte +23 -0
  125. package/dist/components/dialog/DialogDescription.svelte.d.ts +10 -0
  126. package/dist/components/dialog/DialogFooter.svelte +19 -0
  127. package/dist/components/dialog/DialogFooter.svelte.d.ts +10 -0
  128. package/dist/components/dialog/DialogHeader.svelte +19 -0
  129. package/dist/components/dialog/DialogHeader.svelte.d.ts +10 -0
  130. package/dist/components/dialog/DialogTitle.svelte +20 -0
  131. package/dist/components/dialog/DialogTitle.svelte.d.ts +10 -0
  132. package/dist/components/dialog/index.d.ts +17 -0
  133. package/dist/components/dialog/index.js +12 -0
  134. package/dist/components/dialog/styles.d.ts +120 -0
  135. package/dist/components/dialog/styles.js +136 -0
  136. package/dist/components/divider/Divider.svelte +42 -0
  137. package/dist/components/divider/Divider.svelte.d.ts +11 -0
  138. package/dist/components/empty-state/EmptyState.svelte +82 -0
  139. package/dist/components/empty-state/EmptyState.svelte.d.ts +15 -0
  140. package/dist/components/field/Field.svelte +132 -0
  141. package/dist/components/field/Field.svelte.d.ts +23 -0
  142. package/dist/components/field/context.d.ts +12 -0
  143. package/dist/components/field/context.js +9 -0
  144. package/dist/components/frame/Frame.svelte +88 -0
  145. package/dist/components/frame/Frame.svelte.d.ts +19 -0
  146. package/dist/components/heading/Heading.svelte +82 -0
  147. package/dist/components/heading/Heading.svelte.d.ts +16 -0
  148. package/dist/components/input/Input.svelte +47 -0
  149. package/dist/components/input/Input.svelte.d.ts +14 -0
  150. package/dist/components/kbd/Kbd.svelte +40 -0
  151. package/dist/components/kbd/Kbd.svelte.d.ts +11 -0
  152. package/dist/components/link/Link.svelte +68 -0
  153. package/dist/components/link/Link.svelte.d.ts +16 -0
  154. package/dist/components/menu/ContextMenuContent.svelte +33 -0
  155. package/dist/components/menu/ContextMenuContent.svelte.d.ts +11 -0
  156. package/dist/components/menu/ContextMenuTrigger.svelte +44 -0
  157. package/dist/components/menu/ContextMenuTrigger.svelte.d.ts +11 -0
  158. package/dist/components/menu/MenuCheckboxItem.svelte +43 -0
  159. package/dist/components/menu/MenuCheckboxItem.svelte.d.ts +11 -0
  160. package/dist/components/menu/MenuContent.svelte +36 -0
  161. package/dist/components/menu/MenuContent.svelte.d.ts +10 -0
  162. package/dist/components/menu/MenuItem.svelte +41 -0
  163. package/dist/components/menu/MenuItem.svelte.d.ts +16 -0
  164. package/dist/components/menu/MenuLabel.svelte +24 -0
  165. package/dist/components/menu/MenuLabel.svelte.d.ts +10 -0
  166. package/dist/components/menu/MenuRadioItem.svelte +54 -0
  167. package/dist/components/menu/MenuRadioItem.svelte.d.ts +12 -0
  168. package/dist/components/menu/MenuSeparator.svelte +19 -0
  169. package/dist/components/menu/MenuSeparator.svelte.d.ts +8 -0
  170. package/dist/components/menu/MenuSubContent.svelte +34 -0
  171. package/dist/components/menu/MenuSubContent.svelte.d.ts +10 -0
  172. package/dist/components/menu/MenuSubTrigger.svelte +35 -0
  173. package/dist/components/menu/MenuSubTrigger.svelte.d.ts +11 -0
  174. package/dist/components/menu/context-menu.d.ts +11 -0
  175. package/dist/components/menu/context-menu.js +10 -0
  176. package/dist/components/menu/index.js +16 -0
  177. package/dist/components/message/MessageAction.svelte +62 -0
  178. package/dist/components/message/MessageAction.svelte.d.ts +16 -0
  179. package/dist/components/message/MessageActions.svelte +77 -0
  180. package/dist/components/message/MessageActions.svelte.d.ts +19 -0
  181. package/dist/components/message/MessageContent.svelte +68 -0
  182. package/dist/components/message/MessageContent.svelte.d.ts +12 -0
  183. package/dist/components/message/MessageCopy.svelte +106 -0
  184. package/dist/components/message/MessageCopy.svelte.d.ts +16 -0
  185. package/dist/components/message/MessageHeader.svelte +74 -0
  186. package/dist/components/message/MessageHeader.svelte.d.ts +15 -0
  187. package/dist/components/message/MessagePending.svelte +44 -0
  188. package/dist/components/message/MessagePending.svelte.d.ts +10 -0
  189. package/dist/components/message/MessageRoot.svelte +79 -0
  190. package/dist/components/message/MessageRoot.svelte.d.ts +20 -0
  191. package/dist/components/message/MessageTime.svelte +58 -0
  192. package/dist/components/message/MessageTime.svelte.d.ts +12 -0
  193. package/dist/components/message/context.d.ts +7 -0
  194. package/dist/components/message/context.js +11 -0
  195. package/dist/components/message/index.d.ts +18 -0
  196. package/dist/components/message/index.js +11 -0
  197. package/dist/components/notice/Notice.svelte +111 -0
  198. package/dist/components/notice/Notice.svelte.d.ts +26 -0
  199. package/dist/components/plan/Plan.svelte +198 -0
  200. package/dist/components/plan/Plan.svelte.d.ts +18 -0
  201. package/dist/components/popover/PopoverContent.svelte +42 -0
  202. package/dist/components/popover/PopoverContent.svelte.d.ts +10 -0
  203. package/dist/components/popover/index.d.ts +7 -0
  204. package/dist/components/popover/index.js +7 -0
  205. package/dist/components/progress/Progress.svelte +113 -0
  206. package/dist/components/progress/Progress.svelte.d.ts +11 -0
  207. package/dist/components/questionnaire/Questionnaire.svelte +315 -0
  208. package/dist/components/questionnaire/Questionnaire.svelte.d.ts +33 -0
  209. package/dist/components/queued-message/QueuedMessage.svelte +133 -0
  210. package/dist/components/queued-message/QueuedMessage.svelte.d.ts +23 -0
  211. package/dist/components/rail/RailItem.svelte +170 -0
  212. package/dist/components/rail/RailItem.svelte.d.ts +21 -0
  213. package/dist/components/rail/RailRoot.svelte +46 -0
  214. package/dist/components/rail/RailRoot.svelte.d.ts +13 -0
  215. package/dist/components/rail/RailSpacer.svelte +2 -0
  216. package/dist/components/rail/RailSpacer.svelte.d.ts +26 -0
  217. package/dist/components/rail/index.d.ts +6 -0
  218. package/dist/components/rail/index.js +4 -0
  219. package/dist/components/reasoning/ReasoningContent.svelte +56 -0
  220. package/dist/components/reasoning/ReasoningContent.svelte.d.ts +12 -0
  221. package/dist/components/reasoning/ReasoningRoot.svelte +102 -0
  222. package/dist/components/reasoning/ReasoningRoot.svelte.d.ts +25 -0
  223. package/dist/components/reasoning/ReasoningTrigger.svelte +106 -0
  224. package/dist/components/reasoning/ReasoningTrigger.svelte.d.ts +18 -0
  225. package/dist/components/reasoning/context.d.ts +8 -0
  226. package/dist/components/reasoning/context.js +11 -0
  227. package/dist/components/reasoning/index.d.ts +7 -0
  228. package/dist/components/reasoning/index.js +6 -0
  229. package/dist/components/resize-handle/ResizeHandle.svelte +177 -0
  230. package/dist/components/resize-handle/ResizeHandle.svelte.d.ts +29 -0
  231. package/dist/components/rolling-text/RollingText.svelte +51 -0
  232. package/dist/components/rolling-text/RollingText.svelte.d.ts +11 -0
  233. package/dist/components/segmented/SegmentedControl.svelte +171 -0
  234. package/dist/components/segmented/SegmentedControl.svelte.d.ts +20 -0
  235. package/dist/components/select/Select.svelte +146 -0
  236. package/dist/components/select/Select.svelte.d.ts +31 -0
  237. package/dist/components/separator/Separator.svelte +48 -0
  238. package/dist/components/separator/Separator.svelte.d.ts +11 -0
  239. package/dist/components/settings-row/SettingsRow.svelte +97 -0
  240. package/dist/components/settings-row/SettingsRow.svelte.d.ts +21 -0
  241. package/dist/components/shimmer/Shimmer.svelte +66 -0
  242. package/dist/components/shimmer/Shimmer.svelte.d.ts +12 -0
  243. package/dist/components/sidebar/SidebarContent.svelte +70 -0
  244. package/dist/components/sidebar/SidebarContent.svelte.d.ts +13 -0
  245. package/dist/components/sidebar/SidebarFooter.svelte +33 -0
  246. package/dist/components/sidebar/SidebarFooter.svelte.d.ts +10 -0
  247. package/dist/components/sidebar/SidebarGroup.svelte +123 -0
  248. package/dist/components/sidebar/SidebarGroup.svelte.d.ts +19 -0
  249. package/dist/components/sidebar/SidebarHeader.svelte +39 -0
  250. package/dist/components/sidebar/SidebarHeader.svelte.d.ts +12 -0
  251. package/dist/components/sidebar/SidebarItem.svelte +236 -0
  252. package/dist/components/sidebar/SidebarItem.svelte.d.ts +27 -0
  253. package/dist/components/sidebar/index.d.ts +11 -0
  254. package/dist/components/sidebar/index.js +6 -0
  255. package/dist/components/skeleton/Skeleton.svelte +61 -0
  256. package/dist/components/skeleton/Skeleton.svelte.d.ts +13 -0
  257. package/dist/components/spinner/Spinner.svelte +57 -0
  258. package/dist/components/spinner/Spinner.svelte.d.ts +12 -0
  259. package/dist/components/stack/Stack.svelte +99 -0
  260. package/dist/components/stack/Stack.svelte.d.ts +19 -0
  261. package/dist/components/status-indicator/StatusIndicator.svelte +97 -0
  262. package/dist/components/status-indicator/StatusIndicator.svelte.d.ts +14 -0
  263. package/dist/components/suggestions/SuggestionsItem.svelte +104 -0
  264. package/dist/components/suggestions/SuggestionsItem.svelte.d.ts +14 -0
  265. package/dist/components/suggestions/SuggestionsRoot.svelte +80 -0
  266. package/dist/components/suggestions/SuggestionsRoot.svelte.d.ts +20 -0
  267. package/dist/components/suggestions/context.d.ts +7 -0
  268. package/dist/components/suggestions/context.js +8 -0
  269. package/dist/components/suggestions/index.d.ts +5 -0
  270. package/dist/components/suggestions/index.js +5 -0
  271. package/dist/components/switch/Switch.svelte +175 -0
  272. package/dist/components/switch/Switch.svelte.d.ts +17 -0
  273. package/dist/components/tabs/Tabs.svelte +170 -0
  274. package/dist/components/tabs/Tabs.svelte.d.ts +22 -0
  275. package/dist/components/text/Text.svelte +88 -0
  276. package/dist/components/text/Text.svelte.d.ts +20 -0
  277. package/dist/components/textarea/Textarea.svelte +64 -0
  278. package/dist/components/textarea/Textarea.svelte.d.ts +13 -0
  279. package/dist/components/theme/Theme.svelte +49 -0
  280. package/dist/components/theme/Theme.svelte.d.ts +25 -0
  281. package/dist/components/toast/Toaster.svelte +223 -0
  282. package/dist/components/toast/Toaster.svelte.d.ts +9 -0
  283. package/dist/components/toast/toasts.svelte.d.ts +55 -0
  284. package/dist/components/toast/toasts.svelte.js +66 -0
  285. package/dist/components/tool/ToolContent.svelte +51 -0
  286. package/dist/components/tool/ToolContent.svelte.d.ts +11 -0
  287. package/dist/components/tool/ToolInput.svelte +21 -0
  288. package/dist/components/tool/ToolInput.svelte.d.ts +14 -0
  289. package/dist/components/tool/ToolOutput.svelte +33 -0
  290. package/dist/components/tool/ToolOutput.svelte.d.ts +16 -0
  291. package/dist/components/tool/ToolRoot.svelte +94 -0
  292. package/dist/components/tool/ToolRoot.svelte.d.ts +23 -0
  293. package/dist/components/tool/ToolSection.svelte +102 -0
  294. package/dist/components/tool/ToolSection.svelte.d.ts +16 -0
  295. package/dist/components/tool/ToolTrigger.svelte +191 -0
  296. package/dist/components/tool/ToolTrigger.svelte.d.ts +14 -0
  297. package/dist/components/tool/context.d.ts +18 -0
  298. package/dist/components/tool/context.js +11 -0
  299. package/dist/components/tool/index.d.ts +12 -0
  300. package/dist/components/tool/index.js +8 -0
  301. package/dist/components/tooltip/TooltipContent.svelte +76 -0
  302. package/dist/components/tooltip/TooltipContent.svelte.d.ts +12 -0
  303. package/dist/components/tooltip/TooltipRoot.svelte +37 -0
  304. package/dist/components/tooltip/TooltipRoot.svelte.d.ts +10 -0
  305. package/dist/components/tooltip/TooltipTrigger.svelte +25 -0
  306. package/dist/components/tooltip/TooltipTrigger.svelte.d.ts +5 -0
  307. package/dist/components/tooltip/index.d.ts +13 -0
  308. package/dist/components/tooltip/index.js +10 -0
  309. package/dist/components/tooltip/intent.d.ts +2 -0
  310. package/dist/components/tooltip/intent.js +29 -0
  311. package/dist/components/work-fold/WorkFold.svelte +100 -0
  312. package/dist/components/work-fold/WorkFold.svelte.d.ts +15 -0
  313. package/dist/index.d.ts +127 -0
  314. package/dist/index.js +93 -0
  315. package/dist/internal/Chevron.svelte +28 -0
  316. package/dist/internal/Chevron.svelte.d.ts +7 -0
  317. package/dist/internal/Code.svelte +70 -0
  318. package/dist/internal/Code.svelte.d.ts +10 -0
  319. package/dist/internal/Collapse.svelte +57 -0
  320. package/dist/internal/Collapse.svelte.d.ts +12 -0
  321. package/dist/internal/Glyph.svelte +89 -0
  322. package/dist/internal/Glyph.svelte.d.ts +37 -0
  323. package/dist/internal/Tile.svelte +86 -0
  324. package/dist/internal/Tile.svelte.d.ts +15 -0
  325. package/dist/internal/control.d.ts +58 -0
  326. package/dist/internal/control.js +74 -0
  327. package/dist/internal/disclosure.d.ts +7 -0
  328. package/dist/internal/disclosure.js +1 -0
  329. package/dist/internal/json.d.ts +13 -0
  330. package/dist/internal/json.js +51 -0
  331. package/dist/internal/kinds.d.ts +9 -0
  332. package/dist/internal/kinds.js +25 -0
  333. package/dist/internal/layer.d.ts +103 -0
  334. package/dist/internal/layer.js +129 -0
  335. package/dist/internal/loop.d.ts +35 -0
  336. package/dist/internal/loop.js +72 -0
  337. package/dist/internal/markers.stylex.d.ts +14 -0
  338. package/dist/internal/markers.stylex.js +10 -0
  339. package/dist/internal/roving.d.ts +17 -0
  340. package/dist/internal/roving.js +68 -0
  341. package/dist/internal/shared.d.ts +36 -0
  342. package/dist/internal/shared.js +44 -0
  343. package/dist/internal/sx.d.ts +14 -0
  344. package/dist/internal/sx.js +11 -0
  345. package/dist/preset.d.ts +102 -0
  346. package/dist/preset.js +334 -0
  347. package/dist/tokens.stylex.d.ts +104 -0
  348. package/dist/tokens.stylex.js +125 -0
  349. package/dist/vite.d.ts +16 -0
  350. package/dist/vite.js +58 -0
  351. package/package.json +123 -5
package/README.md CHANGED
@@ -1,3 +1,83 @@
1
- # Temporary Holding Version
1
+ # Narvi
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ A component library for Svelte 5, styled with [StyleX](https://stylexjs.com). Styles are compiled
4
+ to atomic CSS at build time, so no styling code runs in the browser.
5
+
6
+ This repository holds two things:
7
+
8
+ - the library, in `src/lib`, packaged with `svelte-package`
9
+ - the docs site, in `src/routes` and `src/docs`, a prerendered SvelteKit app that uses the library
10
+
11
+ ## Develop
12
+
13
+ ```sh
14
+ pnpm install
15
+ pnpm dev # docs site with live examples, at http://localhost:5173
16
+ ```
17
+
18
+ | Command | What it does |
19
+ | ----------------- | ------------------------------------------------------ |
20
+ | `pnpm check` | Type-checks the library and the docs |
21
+ | `pnpm lint` | Prettier and ESLint |
22
+ | `pnpm test` | Component tests, in headless Chromium |
23
+ | `pnpm build:lib` | Packages the library into `dist` and lints the package |
24
+ | `pnpm build:docs` | Builds the static docs site into `build` |
25
+ | `pnpm build` | Both of the above |
26
+
27
+ The tests need a browser once: `pnpm exec playwright install chromium-headless-shell`.
28
+
29
+ ## Use it in an app
30
+
31
+ Narvi is not on npm yet. To try it elsewhere, run `pnpm build:lib && pnpm pack` and install the
32
+ tarball. Then add the plugin after `sveltekit()`:
33
+
34
+ ```ts
35
+ // vite.config.ts
36
+ import { sveltekit } from '@sveltejs/kit/vite';
37
+ import { narvi } from '@diegopluna/narvi/vite';
38
+ import { defineConfig } from 'vite';
39
+
40
+ export default defineConfig({
41
+ plugins: [sveltekit(), narvi()]
42
+ });
43
+ ```
44
+
45
+ Mount `<DevStyles />` in the root layout, import a stylesheet that sets
46
+ `:root { color-scheme: light dark; }`, and import components from `@diegopluna/narvi`. The docs site covers
47
+ this in full under Installation.
48
+
49
+ ## How it is put together
50
+
51
+ - **Tokens** live in `src/lib/tokens.stylex.ts`. Colours hold a light and a dark value in one
52
+ `light-dark()` declaration, so the theme follows `color-scheme`. The palette is stone and
53
+ moonlight: near-black and warm paper for surfaces, a pale metal ("mithril") for the solid button,
54
+ and one silver-blue ("ithildin") that is kept for state: focus, selection and progress.
55
+ - **Components** live in `src/lib/components/<name>/<Name>.svelte`. Styles are created in the
56
+ `<script module>` block and applied with the `attrs` helper from `src/lib/internal/sx.ts`, which
57
+ also merges the consumer's `sx` and `class`. Interface text inherits the page's font; only large
58
+ headings bring their own, a serif.
59
+ - **Edges are shadows.** Hairlines and top highlights are drawn with `box-shadow`, so
60
+ `src/lib/internal/shared.ts` adds a transparent outline that becomes the edge in forced-colours
61
+ mode. Control boundaries (`colors.edge`) hold 3:1 against their surface.
62
+ - **The Vite plugin** in `src/lib/vite.ts` is a preset over `@stylexjs/unplugin`.
63
+
64
+ The look started as a study in `Frame` + `Card`: a tray around an inset panel, whose radius is the
65
+ panel's radius plus the gap between them. Hover styles sit behind `@media (hover: hover) and (pointer: fine)` and
66
+ movement behind `prefers-reduced-motion: no-preference`.
67
+
68
+ ### Adding a component
69
+
70
+ 1. Create `src/lib/components/<name>/<Name>.svelte`. Export its props type from the module script,
71
+ accept `sx` and `class`, and spread the remaining props onto the root element.
72
+ 2. Export the component and its types from `src/lib/index.ts`.
73
+ 3. Add a docs page in `src/routes/components/<name>/`: example files next to a `+page.svelte`.
74
+ Importing an example with `?example` gives the page both the live component and its
75
+ highlighted source, so the code shown is always the code that runs.
76
+ Readers can press Edit to change the example and see it re-render as they type: the
77
+ compiler and editor (`src/docs/live/`) load only then. Examples that define their own
78
+ StyleX styles stay read-only, because StyleX compiles at build time.
79
+ 4. Add the page to `src/docs/nav.ts`.
80
+
81
+ Two StyleX rules to keep in mind: values inside `stylex.create` must be known at build time, so a
82
+ constant such as a media query has to be defined in the same file, and tokens must be imported
83
+ straight from `tokens.stylex.js`.
@@ -0,0 +1,55 @@
1
+ <script lang="ts" module>
2
+ import * as stylex from '@stylexjs/stylex';
3
+ import type { Snippet } from 'svelte';
4
+ import type { HTMLAttributes } from 'svelte/elements';
5
+ import Collapse from '../../internal/Collapse.svelte';
6
+ import type { Sx } from '../../internal/sx.js';
7
+ import { colors } from '../../tokens.stylex.js';
8
+ import { getActivityContext } from './context.js';
9
+
10
+ export type ActivityContentProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
11
+ sx?: Sx;
12
+ /** Activity.Step and Activity.Thought, in the order they happened. */
13
+ children?: Snippet;
14
+ };
15
+
16
+ const styles = stylex.create({
17
+ // The steps hang from a rail that runs down through the middle of their tiles
18
+ steps: {
19
+ position: 'relative',
20
+ display: 'flex',
21
+ flexDirection: 'column',
22
+ gap: '0.625rem',
23
+ paddingTop: '0.625rem',
24
+ paddingBottom: '0.25rem',
25
+ '::before': {
26
+ content: '""',
27
+ position: 'absolute',
28
+ top: 0,
29
+ bottom: '0.875rem',
30
+ insetInlineStart: 'calc(0.75rem - 0.5px)',
31
+ width: '1px',
32
+ backgroundImage: `linear-gradient(to bottom, ${colors.lineStrong}, ${colors.line})`
33
+ }
34
+ }
35
+ });
36
+ </script>
37
+
38
+ <script lang="ts">
39
+ let { sx, class: className, children, ...rest }: ActivityContentProps = $props();
40
+
41
+ const activity = getActivityContext('Content');
42
+ </script>
43
+
44
+ <Collapse
45
+ open={activity.open}
46
+ id={activity.contentId}
47
+ role="region"
48
+ aria-labelledby={activity.triggerId}
49
+ data-slot="activity-content"
50
+ class={className}
51
+ innerSx={[styles.steps, sx]}
52
+ {...rest}
53
+ >
54
+ {@render children?.()}
55
+ </Collapse>
@@ -0,0 +1,11 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ import type { Sx } from '../../internal/sx.js';
4
+ export type ActivityContentProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
5
+ sx?: Sx;
6
+ /** Activity.Step and Activity.Thought, in the order they happened. */
7
+ children?: Snippet;
8
+ };
9
+ declare const ActivityContent: import("svelte").Component<ActivityContentProps, {}, "">;
10
+ type ActivityContent = ReturnType<typeof ActivityContent>;
11
+ export default ActivityContent;
@@ -0,0 +1,66 @@
1
+ <!--
2
+ One row for a stretch of an agent's work: the tool calls it made and the
3
+ thinking between them. While it runs, the row says what the agent is doing
4
+ now; once it settles, what it did. Open, it lists every step.
5
+ -->
6
+ <script lang="ts" module>
7
+ import * as stylex from '@stylexjs/stylex';
8
+ import type { Snippet } from 'svelte';
9
+ import type { HTMLAttributes } from 'svelte/elements';
10
+ import { attrs, type Sx } from '../../internal/sx.js';
11
+ import { setActivityContext } from './context.js';
12
+
13
+ export type ActivityRootProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
14
+ /** Set while the agent is still at work in this stretch. */
15
+ active?: boolean;
16
+ /** How many steps failed. They are named on the closed row, so they are not missed. */
17
+ failures?: number;
18
+ /** Whether the steps show. Bindable. */
19
+ open?: boolean;
20
+ sx?: Sx;
21
+ /** An Activity.Trigger and an Activity.Content. */
22
+ children?: Snippet;
23
+ };
24
+
25
+ const styles = stylex.create({ root: { display: 'flex', flexDirection: 'column', minWidth: 0 } });
26
+ </script>
27
+
28
+ <script lang="ts">
29
+ let {
30
+ active = false,
31
+ failures = 0,
32
+ open = $bindable(false),
33
+ sx,
34
+ class: className,
35
+ children,
36
+ ...rest
37
+ }: ActivityRootProps = $props();
38
+
39
+ const uid = $props.id();
40
+
41
+ setActivityContext({
42
+ get open() {
43
+ return open;
44
+ },
45
+ toggle() {
46
+ open = !open;
47
+ },
48
+ get active() {
49
+ return active;
50
+ },
51
+ get failures() {
52
+ return failures;
53
+ },
54
+ triggerId: `${uid}-trigger`,
55
+ contentId: `${uid}-content`
56
+ });
57
+ </script>
58
+
59
+ <div
60
+ data-slot="activity"
61
+ data-active={active || undefined}
62
+ {...rest}
63
+ {...attrs([styles.root, sx], className)}
64
+ >
65
+ {@render children?.()}
66
+ </div>
@@ -0,0 +1,17 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ import { type Sx } from '../../internal/sx.js';
4
+ export type ActivityRootProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
5
+ /** Set while the agent is still at work in this stretch. */
6
+ active?: boolean;
7
+ /** How many steps failed. They are named on the closed row, so they are not missed. */
8
+ failures?: number;
9
+ /** Whether the steps show. Bindable. */
10
+ open?: boolean;
11
+ sx?: Sx;
12
+ /** An Activity.Trigger and an Activity.Content. */
13
+ children?: Snippet;
14
+ };
15
+ declare const ActivityRoot: import("svelte").Component<ActivityRootProps, {}, "open">;
16
+ type ActivityRoot = ReturnType<typeof ActivityRoot>;
17
+ export default ActivityRoot;
@@ -0,0 +1,157 @@
1
+ <!--
2
+ One thing the agent did: a command, an edit, a read, a search. Its label is
3
+ the thing itself, as code; a step that did not go through says so.
4
+ -->
5
+ <script lang="ts" module>
6
+ import * as stylex from '@stylexjs/stylex';
7
+ import type { Snippet } from 'svelte';
8
+ import { emphasis, KIND_GLYPHS, type ActionKind } from '../../internal/kinds.js';
9
+ import { attrs, type Sx } from '../../internal/sx.js';
10
+ import Tile from '../../internal/Tile.svelte';
11
+ import { colors, font, radius } from '../../tokens.stylex.js';
12
+ import Spinner from '../spinner/Spinner.svelte';
13
+
14
+ export type ActivityStepKind = ActionKind;
15
+ export type ActivityStepStatus = 'running' | 'done' | 'failed' | 'declined' | 'blocked';
16
+
17
+ export type ActivityStepProps = {
18
+ kind?: ActivityStepKind;
19
+ /** The command, the path, the query: shown as code. */
20
+ label: string;
21
+ status?: ActivityStepStatus;
22
+ /** Why it went the way it did, such as why it was blocked. */
23
+ reason?: string;
24
+ /** What it printed. Only the end is kept when it is long. */
25
+ output?: string;
26
+ /** How much of the output to keep, from the end, in characters. */
27
+ tail?: number;
28
+ /** Words for the statuses that need them. */
29
+ statusLabels?: Partial<Record<'failed' | 'declined' | 'blocked', string>>;
30
+ /** Anything else: images, a diff. */
31
+ children?: Snippet;
32
+ sx?: Sx;
33
+ class?: string;
34
+ };
35
+
36
+ const LABELS = { failed: 'Failed', declined: 'Declined', blocked: 'Blocked' };
37
+
38
+ const styles = stylex.create({
39
+ // The tile sits on the rail, in a column as wide as the row's own tile above
40
+ step: {
41
+ display: 'grid',
42
+ gridTemplateColumns: '1.5rem minmax(0, 1fr)',
43
+ columnGap: '0.625rem',
44
+ rowGap: '0.375rem',
45
+ minWidth: 0
46
+ },
47
+ icon: { display: 'grid', placeItems: 'center' },
48
+ line: {
49
+ display: 'flex',
50
+ alignItems: 'center',
51
+ gap: '0.5rem',
52
+ minWidth: 0,
53
+ minHeight: '1.25rem'
54
+ },
55
+ label: {
56
+ minWidth: 0,
57
+ overflow: 'hidden',
58
+ textOverflow: 'ellipsis',
59
+ whiteSpace: 'nowrap',
60
+ color: colors.textSubtle,
61
+ fontFamily: font.mono,
62
+ fontSize: font.sizeXs
63
+ },
64
+ // The file of a path, the program of a command: the part to read first
65
+ main: { color: colors.text },
66
+ badge: {
67
+ flexShrink: 0,
68
+ paddingBlock: '0.0625rem',
69
+ paddingInline: '0.375rem',
70
+ borderRadius: radius.lg,
71
+ backgroundColor: colors.dangerSoft,
72
+ color: colors.dangerInk,
73
+ fontSize: '0.6875rem',
74
+ fontWeight: font.weightMedium
75
+ },
76
+ body: {
77
+ gridColumn: '2',
78
+ display: 'flex',
79
+ flexDirection: 'column',
80
+ gap: '0.375rem',
81
+ minWidth: 0
82
+ },
83
+ reason: { margin: 0, color: colors.textMuted, fontSize: font.sizeSm },
84
+ output: {
85
+ margin: 0,
86
+ maxHeight: '10rem',
87
+ overflow: 'auto',
88
+ paddingBlock: '0.5rem',
89
+ paddingInline: '0.625rem',
90
+ borderRadius: radius.md,
91
+ backgroundColor: colors.well,
92
+ boxShadow: `inset 0 0 0 1px ${colors.line}`,
93
+ color: colors.textMuted,
94
+ fontFamily: font.mono,
95
+ fontSize: font.sizeXs,
96
+ lineHeight: font.leadingNormal,
97
+ whiteSpace: 'pre-wrap',
98
+ overflowWrap: 'anywhere',
99
+ scrollbarWidth: 'thin'
100
+ }
101
+ });
102
+ </script>
103
+
104
+ <script lang="ts">
105
+ let {
106
+ kind = 'tool',
107
+ label,
108
+ status = 'done',
109
+ reason,
110
+ output,
111
+ tail = 4000,
112
+ statusLabels,
113
+ children,
114
+ sx,
115
+ class: className
116
+ }: ActivityStepProps = $props();
117
+
118
+ const shown = $derived(output && output.length > tail ? `…${output.slice(-tail)}` : output);
119
+ const parts = $derived(emphasis(kind, label));
120
+ const bad = $derived(status === 'failed' || status === 'declined' || status === 'blocked');
121
+
122
+ // Long output opens at its end, where the result is
123
+ function toEnd(element: HTMLElement) {
124
+ element.scrollTop = element.scrollHeight;
125
+ }
126
+ </script>
127
+
128
+ <div data-slot="activity-step" data-status={status} {...attrs([styles.step, sx], className)}>
129
+ <span {...stylex.attrs(styles.icon)}>
130
+ <Tile
131
+ size="sm"
132
+ tone={status === 'running' ? 'live' : bad ? 'danger' : 'neutral'}
133
+ glyph={status === 'running' ? undefined : KIND_GLYPHS[kind]}
134
+ >{#if status === 'running'}<Spinner size={11} label={null} />{/if}</Tile
135
+ >
136
+ </span>
137
+ <span {...stylex.attrs(styles.line)}>
138
+ <code {...stylex.attrs(styles.label)}
139
+ >{parts[0]}<span {...stylex.attrs(styles.main)}>{parts[1]}</span>{parts[2]}</code
140
+ >
141
+ {#if bad}
142
+ <span {...stylex.attrs(styles.badge)}
143
+ >{statusLabels?.[status as 'failed'] ?? LABELS[status as 'failed']}</span
144
+ >
145
+ {/if}
146
+ </span>
147
+ {#if reason || shown || children}
148
+ <div {...stylex.attrs(styles.body)}>
149
+ {#if reason}<p {...stylex.attrs(styles.reason)}>{reason}</p>{/if}
150
+ {#if shown}
151
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
152
+ <pre tabindex="0" {...stylex.attrs(styles.output)} {@attach toEnd}>{shown}</pre>
153
+ {/if}
154
+ {@render children?.()}
155
+ </div>
156
+ {/if}
157
+ </div>
@@ -0,0 +1,26 @@
1
+ import type { Snippet } from 'svelte';
2
+ import { type ActionKind } from '../../internal/kinds.js';
3
+ import { type Sx } from '../../internal/sx.js';
4
+ export type ActivityStepKind = ActionKind;
5
+ export type ActivityStepStatus = 'running' | 'done' | 'failed' | 'declined' | 'blocked';
6
+ export type ActivityStepProps = {
7
+ kind?: ActivityStepKind;
8
+ /** The command, the path, the query: shown as code. */
9
+ label: string;
10
+ status?: ActivityStepStatus;
11
+ /** Why it went the way it did, such as why it was blocked. */
12
+ reason?: string;
13
+ /** What it printed. Only the end is kept when it is long. */
14
+ output?: string;
15
+ /** How much of the output to keep, from the end, in characters. */
16
+ tail?: number;
17
+ /** Words for the statuses that need them. */
18
+ statusLabels?: Partial<Record<'failed' | 'declined' | 'blocked', string>>;
19
+ /** Anything else: images, a diff. */
20
+ children?: Snippet;
21
+ sx?: Sx;
22
+ class?: string;
23
+ };
24
+ declare const ActivityStep: import("svelte").Component<ActivityStepProps, {}, "">;
25
+ type ActivityStep = ReturnType<typeof ActivityStep>;
26
+ export default ActivityStep;
@@ -0,0 +1,60 @@
1
+ <!-- The agent's thinking between steps, on the rail with the steps, set apart in italics. -->
2
+ <script lang="ts" module>
3
+ import * as stylex from '@stylexjs/stylex';
4
+ import Tile from '../../internal/Tile.svelte';
5
+ import { colors, font } from '../../tokens.stylex.js';
6
+ import Shimmer from '../shimmer/Shimmer.svelte';
7
+
8
+ export type ActivityThoughtProps = {
9
+ text: string;
10
+ /** Set while the thought is still arriving. */
11
+ active?: boolean;
12
+ label?: string;
13
+ activeLabel?: string;
14
+ };
15
+
16
+ const styles = stylex.create({
17
+ thought: {
18
+ display: 'grid',
19
+ gridTemplateColumns: '1.5rem minmax(0, 1fr)',
20
+ columnGap: '0.625rem',
21
+ minWidth: 0
22
+ },
23
+ icon: { display: 'grid', placeItems: 'center', height: '1.25rem' },
24
+ body: { display: 'flex', flexDirection: 'column', gap: '0.125rem', minWidth: 0 },
25
+ label: {
26
+ color: colors.textSubtle,
27
+ fontSize: font.sizeXs,
28
+ fontWeight: font.weightMedium,
29
+ lineHeight: '1.25rem'
30
+ },
31
+ text: {
32
+ margin: 0,
33
+ color: colors.textMuted,
34
+ fontSize: font.sizeSm,
35
+ fontStyle: 'italic',
36
+ lineHeight: font.leadingNormal
37
+ }
38
+ });
39
+ </script>
40
+
41
+ <script lang="ts">
42
+ let {
43
+ text,
44
+ active = false,
45
+ label = 'Thought',
46
+ activeLabel = 'Thinking'
47
+ }: ActivityThoughtProps = $props();
48
+ </script>
49
+
50
+ <div data-slot="activity-thought" {...stylex.attrs(styles.thought)}>
51
+ <span {...stylex.attrs(styles.icon)}>
52
+ <Tile size="sm" glyph="bulb" tone={active ? 'live' : 'neutral'} />
53
+ </span>
54
+ <div {...stylex.attrs(styles.body)}>
55
+ <span {...stylex.attrs(styles.label)}
56
+ ><Shimmer {active}>{active ? activeLabel : label}</Shimmer></span
57
+ >
58
+ <p {...stylex.attrs(styles.text)}>{text}</p>
59
+ </div>
60
+ </div>
@@ -0,0 +1,10 @@
1
+ export type ActivityThoughtProps = {
2
+ text: string;
3
+ /** Set while the thought is still arriving. */
4
+ active?: boolean;
5
+ label?: string;
6
+ activeLabel?: string;
7
+ };
8
+ declare const ActivityThought: import("svelte").Component<ActivityThoughtProps, {}, "">;
9
+ type ActivityThought = ReturnType<typeof ActivityThought>;
10
+ export default ActivityThought;
@@ -0,0 +1,103 @@
1
+ <script lang="ts" module>
2
+ import * as stylex from '@stylexjs/stylex';
3
+ import type { Snippet } from 'svelte';
4
+ import type { HTMLButtonAttributes } from 'svelte/elements';
5
+ import Chevron from '../../internal/Chevron.svelte';
6
+ import { KIND_GLYPHS, type ActionKind } from '../../internal/kinds.js';
7
+ import { attrs, type Sx } from '../../internal/sx.js';
8
+ import Tile from '../../internal/Tile.svelte';
9
+ import { colors, font, motion, radius } from '../../tokens.stylex.js';
10
+ import RollingText from '../rolling-text/RollingText.svelte';
11
+ import { getActivityContext } from './context.js';
12
+
13
+ export type ActivityTriggerProps = Omit<HTMLButtonAttributes, 'children'> & {
14
+ /** What the agent is doing now, in the present tense: "Running pnpm check". */
15
+ phrase?: string;
16
+ /** What it did, once settled, in the past tense: "Read 4 files and ran 2 commands". */
17
+ summary: string;
18
+ /** The kind of the current action, or of the whole stretch, which picks the icon. */
19
+ kind?: ActionKind;
20
+ /** An icon of your own. Without it or a kind, stacked steps. */
21
+ icon?: Snippet;
22
+ /** How a failure count is said: "2 failed". */
23
+ failedLabel?: (count: number) => string;
24
+ sx?: Sx;
25
+ };
26
+
27
+ const HOVER = '@media (hover: hover) and (pointer: fine)';
28
+
29
+ const styles = stylex.create({
30
+ trigger: {
31
+ display: 'flex',
32
+ alignItems: 'center',
33
+ alignSelf: 'flex-start',
34
+ gap: '0.625rem',
35
+ maxWidth: '100%',
36
+ minHeight: '1.75rem',
37
+ margin: 0,
38
+ padding: 0,
39
+ borderWidth: 0,
40
+ borderRadius: radius.xs,
41
+ backgroundColor: 'transparent',
42
+ color: { default: colors.textMuted, ':hover': { default: null, [HOVER]: colors.text } },
43
+ fontFamily: 'inherit',
44
+ fontSize: font.sizeMd,
45
+ lineHeight: font.leadingSnug,
46
+ textAlign: 'start',
47
+ cursor: 'pointer',
48
+ outlineStyle: 'solid',
49
+ outlineWidth: { default: 0, ':focus-visible': '2px' },
50
+ outlineColor: colors.focusRing,
51
+ outlineOffset: '2px',
52
+ transitionProperty: 'color',
53
+ transitionDuration: motion.fast,
54
+ transitionTimingFunction: 'ease'
55
+ },
56
+ chevron: { display: 'grid', color: colors.textSubtle },
57
+ text: { display: 'inline-flex', minWidth: 0, gap: '0.375rem' },
58
+ failed: { flexShrink: 0, color: colors.danger }
59
+ });
60
+ </script>
61
+
62
+ <script lang="ts">
63
+ let {
64
+ phrase,
65
+ summary,
66
+ kind,
67
+ icon,
68
+ failedLabel = (count) => `${count} failed`,
69
+ sx,
70
+ class: className,
71
+ onclick,
72
+ ...rest
73
+ }: ActivityTriggerProps = $props();
74
+
75
+ const activity = getActivityContext('Trigger');
76
+ const text = $derived(activity.active && phrase ? phrase : summary);
77
+ </script>
78
+
79
+ <button
80
+ type="button"
81
+ id={activity.triggerId}
82
+ aria-expanded={activity.open}
83
+ aria-controls={activity.contentId}
84
+ data-slot="activity-trigger"
85
+ {...rest}
86
+ {...attrs([styles.trigger, sx], className)}
87
+ onclick={(event) => {
88
+ onclick?.(event);
89
+ if (!event.defaultPrevented) activity.toggle();
90
+ }}
91
+ >
92
+ <Tile
93
+ tone={activity.active ? 'live' : activity.failures > 0 ? 'danger' : 'neutral'}
94
+ glyph={icon ? undefined : kind ? KIND_GLYPHS[kind] : 'layers'}>{@render icon?.()}</Tile
95
+ >
96
+ <span {...stylex.attrs(styles.text)}>
97
+ <RollingText {text} shimmer={activity.active} />
98
+ {#if activity.failures > 0}
99
+ <span {...stylex.attrs(styles.failed)}>· {failedLabel(activity.failures)}</span>
100
+ {/if}
101
+ </span>
102
+ <span {...stylex.attrs(styles.chevron)}><Chevron open={activity.open} size={12} /></span>
103
+ </button>
@@ -0,0 +1,20 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { HTMLButtonAttributes } from 'svelte/elements';
3
+ import { type ActionKind } from '../../internal/kinds.js';
4
+ import { type Sx } from '../../internal/sx.js';
5
+ export type ActivityTriggerProps = Omit<HTMLButtonAttributes, 'children'> & {
6
+ /** What the agent is doing now, in the present tense: "Running pnpm check". */
7
+ phrase?: string;
8
+ /** What it did, once settled, in the past tense: "Read 4 files and ran 2 commands". */
9
+ summary: string;
10
+ /** The kind of the current action, or of the whole stretch, which picks the icon. */
11
+ kind?: ActionKind;
12
+ /** An icon of your own. Without it or a kind, stacked steps. */
13
+ icon?: Snippet;
14
+ /** How a failure count is said: "2 failed". */
15
+ failedLabel?: (count: number) => string;
16
+ sx?: Sx;
17
+ };
18
+ declare const ActivityTrigger: import("svelte").Component<ActivityTriggerProps, {}, "">;
19
+ type ActivityTrigger = ReturnType<typeof ActivityTrigger>;
20
+ export default ActivityTrigger;
@@ -0,0 +1,7 @@
1
+ import type { DisclosureContext } from '../../internal/disclosure.js';
2
+ export type ActivityContext = DisclosureContext & {
3
+ readonly active: boolean;
4
+ readonly failures: number;
5
+ };
6
+ export declare function setActivityContext(context: ActivityContext): void;
7
+ export declare function getActivityContext(part: string): ActivityContext;
@@ -0,0 +1,11 @@
1
+ import { getContext, setContext } from 'svelte';
2
+ const KEY = Symbol('narvi.activity');
3
+ export function setActivityContext(context) {
4
+ setContext(KEY, context);
5
+ }
6
+ export function getActivityContext(part) {
7
+ const context = getContext(KEY);
8
+ if (!context)
9
+ throw new Error(`<Activity.${part}> must be placed inside <Activity.Root>.`);
10
+ return context;
11
+ }
@@ -0,0 +1,11 @@
1
+ import Content from './ActivityContent.svelte';
2
+ import Root from './ActivityRoot.svelte';
3
+ import Step from './ActivityStep.svelte';
4
+ import Thought from './ActivityThought.svelte';
5
+ import Trigger from './ActivityTrigger.svelte';
6
+ export { Root, Trigger, Content, Step, Thought };
7
+ export type { ActivityContentProps } from './ActivityContent.svelte';
8
+ export type { ActivityRootProps } from './ActivityRoot.svelte';
9
+ export type { ActivityStepKind, ActivityStepProps, ActivityStepStatus } from './ActivityStep.svelte';
10
+ export type { ActivityThoughtProps } from './ActivityThought.svelte';
11
+ export type { ActivityTriggerProps } from './ActivityTrigger.svelte';
@@ -0,0 +1,6 @@
1
+ import Content from './ActivityContent.svelte';
2
+ import Root from './ActivityRoot.svelte';
3
+ import Step from './ActivityStep.svelte';
4
+ import Thought from './ActivityThought.svelte';
5
+ import Trigger from './ActivityTrigger.svelte';
6
+ export { Root, Trigger, Content, Step, Thought };