@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.
- package/README.md +82 -2
- package/dist/components/activity/ActivityContent.svelte +55 -0
- package/dist/components/activity/ActivityContent.svelte.d.ts +11 -0
- package/dist/components/activity/ActivityRoot.svelte +66 -0
- package/dist/components/activity/ActivityRoot.svelte.d.ts +17 -0
- package/dist/components/activity/ActivityStep.svelte +157 -0
- package/dist/components/activity/ActivityStep.svelte.d.ts +26 -0
- package/dist/components/activity/ActivityThought.svelte +60 -0
- package/dist/components/activity/ActivityThought.svelte.d.ts +10 -0
- package/dist/components/activity/ActivityTrigger.svelte +103 -0
- package/dist/components/activity/ActivityTrigger.svelte.d.ts +20 -0
- package/dist/components/activity/context.d.ts +7 -0
- package/dist/components/activity/context.js +11 -0
- package/dist/components/activity/index.d.ts +11 -0
- package/dist/components/activity/index.js +6 -0
- package/dist/components/announcer/Announcer.svelte +84 -0
- package/dist/components/announcer/Announcer.svelte.d.ts +13 -0
- package/dist/components/app-shell/AppShellHeader.svelte +54 -0
- package/dist/components/app-shell/AppShellHeader.svelte.d.ts +15 -0
- package/dist/components/app-shell/AppShellMain.svelte +49 -0
- package/dist/components/app-shell/AppShellMain.svelte.d.ts +11 -0
- package/dist/components/app-shell/AppShellPanel.svelte +107 -0
- package/dist/components/app-shell/AppShellPanel.svelte.d.ts +18 -0
- package/dist/components/app-shell/AppShellRoot.svelte +136 -0
- package/dist/components/app-shell/AppShellRoot.svelte.d.ts +28 -0
- package/dist/components/app-shell/AppShellSidebar.svelte +192 -0
- package/dist/components/app-shell/AppShellSidebar.svelte.d.ts +17 -0
- package/dist/components/app-shell/AppShellToggle.svelte +50 -0
- package/dist/components/app-shell/AppShellToggle.svelte.d.ts +10 -0
- package/dist/components/app-shell/context.d.ts +15 -0
- package/dist/components/app-shell/context.js +15 -0
- package/dist/components/app-shell/index.d.ts +15 -0
- package/dist/components/app-shell/index.js +8 -0
- package/dist/components/approval/Approval.svelte +213 -0
- package/dist/components/approval/Approval.svelte.d.ts +38 -0
- package/dist/components/avatar/AvatarFallback.svelte +73 -0
- package/dist/components/avatar/AvatarFallback.svelte.d.ts +11 -0
- package/dist/components/avatar/AvatarImage.svelte +75 -0
- package/dist/components/avatar/AvatarImage.svelte.d.ts +11 -0
- package/dist/components/avatar/AvatarRoot.svelte +108 -0
- package/dist/components/avatar/AvatarRoot.svelte.d.ts +19 -0
- package/dist/components/avatar/context.d.ts +11 -0
- package/dist/components/avatar/context.js +11 -0
- package/dist/components/avatar/index.d.ts +7 -0
- package/dist/components/avatar/index.js +6 -0
- package/dist/components/badge/Badge.svelte +78 -0
- package/dist/components/badge/Badge.svelte.d.ts +15 -0
- package/dist/components/button/Button.svelte +270 -0
- package/dist/components/button/Button.svelte.d.ts +22 -0
- package/dist/components/card/Card.svelte +65 -0
- package/dist/components/card/Card.svelte.d.ts +15 -0
- package/dist/components/change-stats/ChangeStats.svelte +52 -0
- package/dist/components/change-stats/ChangeStats.svelte.d.ts +14 -0
- package/dist/components/changes-summary/ChangesSummary.svelte +152 -0
- package/dist/components/changes-summary/ChangesSummary.svelte.d.ts +20 -0
- package/dist/components/checkbox/Checkbox.svelte +178 -0
- package/dist/components/checkbox/Checkbox.svelte.d.ts +19 -0
- package/dist/components/code/Code.svelte +33 -0
- package/dist/components/code/Code.svelte.d.ts +10 -0
- package/dist/components/command/CommandDialog.svelte +37 -0
- package/dist/components/command/CommandDialog.svelte.d.ts +12 -0
- package/dist/components/command/CommandEmpty.svelte +20 -0
- package/dist/components/command/CommandEmpty.svelte.d.ts +11 -0
- package/dist/components/command/CommandFooter.svelte +25 -0
- package/dist/components/command/CommandFooter.svelte.d.ts +11 -0
- package/dist/components/command/CommandGroup.svelte +25 -0
- package/dist/components/command/CommandGroup.svelte.d.ts +12 -0
- package/dist/components/command/CommandInput.svelte +33 -0
- package/dist/components/command/CommandInput.svelte.d.ts +8 -0
- package/dist/components/command/CommandItem.svelte +49 -0
- package/dist/components/command/CommandItem.svelte.d.ts +16 -0
- package/dist/components/command/CommandList.svelte +21 -0
- package/dist/components/command/CommandList.svelte.d.ts +10 -0
- package/dist/components/command/CommandRoot.svelte +20 -0
- package/dist/components/command/CommandRoot.svelte.d.ts +11 -0
- package/dist/components/command/index.d.ts +20 -0
- package/dist/components/command/index.js +12 -0
- package/dist/components/command/styles.d.ts +117 -0
- package/dist/components/command/styles.js +121 -0
- package/dist/components/composer/ComposerAttachButton.svelte +55 -0
- package/dist/components/composer/ComposerAttachButton.svelte.d.ts +14 -0
- package/dist/components/composer/ComposerAttachment.svelte +173 -0
- package/dist/components/composer/ComposerAttachment.svelte.d.ts +13 -0
- package/dist/components/composer/ComposerAttachments.svelte +63 -0
- package/dist/components/composer/ComposerAttachments.svelte.d.ts +13 -0
- package/dist/components/composer/ComposerModelPicker.svelte +475 -0
- package/dist/components/composer/ComposerModelPicker.svelte.d.ts +27 -0
- package/dist/components/composer/ComposerRoot.svelte +315 -0
- package/dist/components/composer/ComposerRoot.svelte.d.ts +42 -0
- package/dist/components/composer/ComposerSubmit.svelte +131 -0
- package/dist/components/composer/ComposerSubmit.svelte.d.ts +13 -0
- package/dist/components/composer/ComposerTextarea.svelte +109 -0
- package/dist/components/composer/ComposerTextarea.svelte.d.ts +9 -0
- package/dist/components/composer/ComposerToggle.svelte +106 -0
- package/dist/components/composer/ComposerToggle.svelte.d.ts +14 -0
- package/dist/components/composer/ComposerToolbar.svelte +29 -0
- package/dist/components/composer/ComposerToolbar.svelte.d.ts +11 -0
- package/dist/components/composer/context.d.ts +53 -0
- package/dist/components/composer/context.js +32 -0
- package/dist/components/composer/index.d.ts +21 -0
- package/dist/components/composer/index.js +13 -0
- package/dist/components/conversation/ConversationContent.svelte +94 -0
- package/dist/components/conversation/ConversationContent.svelte.d.ts +15 -0
- package/dist/components/conversation/ConversationEmpty.svelte +89 -0
- package/dist/components/conversation/ConversationEmpty.svelte.d.ts +16 -0
- package/dist/components/conversation/ConversationRoot.svelte +237 -0
- package/dist/components/conversation/ConversationRoot.svelte.d.ts +20 -0
- package/dist/components/conversation/ConversationScrollButton.svelte +114 -0
- package/dist/components/conversation/ConversationScrollButton.svelte.d.ts +14 -0
- package/dist/components/conversation/context.d.ts +28 -0
- package/dist/components/conversation/context.js +15 -0
- package/dist/components/conversation/index.d.ts +11 -0
- package/dist/components/conversation/index.js +8 -0
- package/dist/components/conversation/scrolling.d.ts +25 -0
- package/dist/components/conversation/scrolling.js +60 -0
- package/dist/components/dev-styles/DevStyles.svelte +21 -0
- package/dist/components/dev-styles/DevStyles.svelte.d.ts +3 -0
- package/dist/components/dialog/ConfirmDialog.svelte +157 -0
- package/dist/components/dialog/ConfirmDialog.svelte.d.ts +31 -0
- package/dist/components/dialog/DialogBody.svelte +19 -0
- package/dist/components/dialog/DialogBody.svelte.d.ts +10 -0
- package/dist/components/dialog/DialogContent.svelte +55 -0
- package/dist/components/dialog/DialogContent.svelte.d.ts +17 -0
- package/dist/components/dialog/DialogDescription.svelte +23 -0
- package/dist/components/dialog/DialogDescription.svelte.d.ts +10 -0
- package/dist/components/dialog/DialogFooter.svelte +19 -0
- package/dist/components/dialog/DialogFooter.svelte.d.ts +10 -0
- package/dist/components/dialog/DialogHeader.svelte +19 -0
- package/dist/components/dialog/DialogHeader.svelte.d.ts +10 -0
- package/dist/components/dialog/DialogTitle.svelte +20 -0
- package/dist/components/dialog/DialogTitle.svelte.d.ts +10 -0
- package/dist/components/dialog/index.d.ts +17 -0
- package/dist/components/dialog/index.js +12 -0
- package/dist/components/dialog/styles.d.ts +120 -0
- package/dist/components/dialog/styles.js +136 -0
- package/dist/components/divider/Divider.svelte +42 -0
- package/dist/components/divider/Divider.svelte.d.ts +11 -0
- package/dist/components/empty-state/EmptyState.svelte +82 -0
- package/dist/components/empty-state/EmptyState.svelte.d.ts +15 -0
- package/dist/components/field/Field.svelte +132 -0
- package/dist/components/field/Field.svelte.d.ts +23 -0
- package/dist/components/field/context.d.ts +12 -0
- package/dist/components/field/context.js +9 -0
- package/dist/components/frame/Frame.svelte +88 -0
- package/dist/components/frame/Frame.svelte.d.ts +19 -0
- package/dist/components/heading/Heading.svelte +82 -0
- package/dist/components/heading/Heading.svelte.d.ts +16 -0
- package/dist/components/input/Input.svelte +47 -0
- package/dist/components/input/Input.svelte.d.ts +14 -0
- package/dist/components/kbd/Kbd.svelte +40 -0
- package/dist/components/kbd/Kbd.svelte.d.ts +11 -0
- package/dist/components/link/Link.svelte +68 -0
- package/dist/components/link/Link.svelte.d.ts +16 -0
- package/dist/components/menu/ContextMenuContent.svelte +33 -0
- package/dist/components/menu/ContextMenuContent.svelte.d.ts +11 -0
- package/dist/components/menu/ContextMenuTrigger.svelte +44 -0
- package/dist/components/menu/ContextMenuTrigger.svelte.d.ts +11 -0
- package/dist/components/menu/MenuCheckboxItem.svelte +43 -0
- package/dist/components/menu/MenuCheckboxItem.svelte.d.ts +11 -0
- package/dist/components/menu/MenuContent.svelte +36 -0
- package/dist/components/menu/MenuContent.svelte.d.ts +10 -0
- package/dist/components/menu/MenuItem.svelte +41 -0
- package/dist/components/menu/MenuItem.svelte.d.ts +16 -0
- package/dist/components/menu/MenuLabel.svelte +24 -0
- package/dist/components/menu/MenuLabel.svelte.d.ts +10 -0
- package/dist/components/menu/MenuRadioItem.svelte +54 -0
- package/dist/components/menu/MenuRadioItem.svelte.d.ts +12 -0
- package/dist/components/menu/MenuSeparator.svelte +19 -0
- package/dist/components/menu/MenuSeparator.svelte.d.ts +8 -0
- package/dist/components/menu/MenuSubContent.svelte +34 -0
- package/dist/components/menu/MenuSubContent.svelte.d.ts +10 -0
- package/dist/components/menu/MenuSubTrigger.svelte +35 -0
- package/dist/components/menu/MenuSubTrigger.svelte.d.ts +11 -0
- package/dist/components/menu/context-menu.d.ts +11 -0
- package/dist/components/menu/context-menu.js +10 -0
- package/dist/components/menu/index.js +16 -0
- package/dist/components/message/MessageAction.svelte +62 -0
- package/dist/components/message/MessageAction.svelte.d.ts +16 -0
- package/dist/components/message/MessageActions.svelte +77 -0
- package/dist/components/message/MessageActions.svelte.d.ts +19 -0
- package/dist/components/message/MessageContent.svelte +68 -0
- package/dist/components/message/MessageContent.svelte.d.ts +12 -0
- package/dist/components/message/MessageCopy.svelte +106 -0
- package/dist/components/message/MessageCopy.svelte.d.ts +16 -0
- package/dist/components/message/MessageHeader.svelte +74 -0
- package/dist/components/message/MessageHeader.svelte.d.ts +15 -0
- package/dist/components/message/MessagePending.svelte +44 -0
- package/dist/components/message/MessagePending.svelte.d.ts +10 -0
- package/dist/components/message/MessageRoot.svelte +79 -0
- package/dist/components/message/MessageRoot.svelte.d.ts +20 -0
- package/dist/components/message/MessageTime.svelte +58 -0
- package/dist/components/message/MessageTime.svelte.d.ts +12 -0
- package/dist/components/message/context.d.ts +7 -0
- package/dist/components/message/context.js +11 -0
- package/dist/components/message/index.d.ts +18 -0
- package/dist/components/message/index.js +11 -0
- package/dist/components/notice/Notice.svelte +111 -0
- package/dist/components/notice/Notice.svelte.d.ts +26 -0
- package/dist/components/plan/Plan.svelte +198 -0
- package/dist/components/plan/Plan.svelte.d.ts +18 -0
- package/dist/components/popover/PopoverContent.svelte +42 -0
- package/dist/components/popover/PopoverContent.svelte.d.ts +10 -0
- package/dist/components/popover/index.d.ts +7 -0
- package/dist/components/popover/index.js +7 -0
- package/dist/components/progress/Progress.svelte +113 -0
- package/dist/components/progress/Progress.svelte.d.ts +11 -0
- package/dist/components/questionnaire/Questionnaire.svelte +315 -0
- package/dist/components/questionnaire/Questionnaire.svelte.d.ts +33 -0
- package/dist/components/queued-message/QueuedMessage.svelte +133 -0
- package/dist/components/queued-message/QueuedMessage.svelte.d.ts +23 -0
- package/dist/components/rail/RailItem.svelte +170 -0
- package/dist/components/rail/RailItem.svelte.d.ts +21 -0
- package/dist/components/rail/RailRoot.svelte +46 -0
- package/dist/components/rail/RailRoot.svelte.d.ts +13 -0
- package/dist/components/rail/RailSpacer.svelte +2 -0
- package/dist/components/rail/RailSpacer.svelte.d.ts +26 -0
- package/dist/components/rail/index.d.ts +6 -0
- package/dist/components/rail/index.js +4 -0
- package/dist/components/reasoning/ReasoningContent.svelte +56 -0
- package/dist/components/reasoning/ReasoningContent.svelte.d.ts +12 -0
- package/dist/components/reasoning/ReasoningRoot.svelte +102 -0
- package/dist/components/reasoning/ReasoningRoot.svelte.d.ts +25 -0
- package/dist/components/reasoning/ReasoningTrigger.svelte +106 -0
- package/dist/components/reasoning/ReasoningTrigger.svelte.d.ts +18 -0
- package/dist/components/reasoning/context.d.ts +8 -0
- package/dist/components/reasoning/context.js +11 -0
- package/dist/components/reasoning/index.d.ts +7 -0
- package/dist/components/reasoning/index.js +6 -0
- package/dist/components/resize-handle/ResizeHandle.svelte +177 -0
- package/dist/components/resize-handle/ResizeHandle.svelte.d.ts +29 -0
- package/dist/components/rolling-text/RollingText.svelte +51 -0
- package/dist/components/rolling-text/RollingText.svelte.d.ts +11 -0
- package/dist/components/segmented/SegmentedControl.svelte +171 -0
- package/dist/components/segmented/SegmentedControl.svelte.d.ts +20 -0
- package/dist/components/select/Select.svelte +146 -0
- package/dist/components/select/Select.svelte.d.ts +31 -0
- package/dist/components/separator/Separator.svelte +48 -0
- package/dist/components/separator/Separator.svelte.d.ts +11 -0
- package/dist/components/settings-row/SettingsRow.svelte +97 -0
- package/dist/components/settings-row/SettingsRow.svelte.d.ts +21 -0
- package/dist/components/shimmer/Shimmer.svelte +66 -0
- package/dist/components/shimmer/Shimmer.svelte.d.ts +12 -0
- package/dist/components/sidebar/SidebarContent.svelte +70 -0
- package/dist/components/sidebar/SidebarContent.svelte.d.ts +13 -0
- package/dist/components/sidebar/SidebarFooter.svelte +33 -0
- package/dist/components/sidebar/SidebarFooter.svelte.d.ts +10 -0
- package/dist/components/sidebar/SidebarGroup.svelte +123 -0
- package/dist/components/sidebar/SidebarGroup.svelte.d.ts +19 -0
- package/dist/components/sidebar/SidebarHeader.svelte +39 -0
- package/dist/components/sidebar/SidebarHeader.svelte.d.ts +12 -0
- package/dist/components/sidebar/SidebarItem.svelte +236 -0
- package/dist/components/sidebar/SidebarItem.svelte.d.ts +27 -0
- package/dist/components/sidebar/index.d.ts +11 -0
- package/dist/components/sidebar/index.js +6 -0
- package/dist/components/skeleton/Skeleton.svelte +61 -0
- package/dist/components/skeleton/Skeleton.svelte.d.ts +13 -0
- package/dist/components/spinner/Spinner.svelte +57 -0
- package/dist/components/spinner/Spinner.svelte.d.ts +12 -0
- package/dist/components/stack/Stack.svelte +99 -0
- package/dist/components/stack/Stack.svelte.d.ts +19 -0
- package/dist/components/status-indicator/StatusIndicator.svelte +97 -0
- package/dist/components/status-indicator/StatusIndicator.svelte.d.ts +14 -0
- package/dist/components/suggestions/SuggestionsItem.svelte +104 -0
- package/dist/components/suggestions/SuggestionsItem.svelte.d.ts +14 -0
- package/dist/components/suggestions/SuggestionsRoot.svelte +80 -0
- package/dist/components/suggestions/SuggestionsRoot.svelte.d.ts +20 -0
- package/dist/components/suggestions/context.d.ts +7 -0
- package/dist/components/suggestions/context.js +8 -0
- package/dist/components/suggestions/index.d.ts +5 -0
- package/dist/components/suggestions/index.js +5 -0
- package/dist/components/switch/Switch.svelte +175 -0
- package/dist/components/switch/Switch.svelte.d.ts +17 -0
- package/dist/components/tabs/Tabs.svelte +170 -0
- package/dist/components/tabs/Tabs.svelte.d.ts +22 -0
- package/dist/components/text/Text.svelte +88 -0
- package/dist/components/text/Text.svelte.d.ts +20 -0
- package/dist/components/textarea/Textarea.svelte +64 -0
- package/dist/components/textarea/Textarea.svelte.d.ts +13 -0
- package/dist/components/theme/Theme.svelte +49 -0
- package/dist/components/theme/Theme.svelte.d.ts +25 -0
- package/dist/components/toast/Toaster.svelte +223 -0
- package/dist/components/toast/Toaster.svelte.d.ts +9 -0
- package/dist/components/toast/toasts.svelte.d.ts +55 -0
- package/dist/components/toast/toasts.svelte.js +66 -0
- package/dist/components/tool/ToolContent.svelte +51 -0
- package/dist/components/tool/ToolContent.svelte.d.ts +11 -0
- package/dist/components/tool/ToolInput.svelte +21 -0
- package/dist/components/tool/ToolInput.svelte.d.ts +14 -0
- package/dist/components/tool/ToolOutput.svelte +33 -0
- package/dist/components/tool/ToolOutput.svelte.d.ts +16 -0
- package/dist/components/tool/ToolRoot.svelte +94 -0
- package/dist/components/tool/ToolRoot.svelte.d.ts +23 -0
- package/dist/components/tool/ToolSection.svelte +102 -0
- package/dist/components/tool/ToolSection.svelte.d.ts +16 -0
- package/dist/components/tool/ToolTrigger.svelte +191 -0
- package/dist/components/tool/ToolTrigger.svelte.d.ts +14 -0
- package/dist/components/tool/context.d.ts +18 -0
- package/dist/components/tool/context.js +11 -0
- package/dist/components/tool/index.d.ts +12 -0
- package/dist/components/tool/index.js +8 -0
- package/dist/components/tooltip/TooltipContent.svelte +76 -0
- package/dist/components/tooltip/TooltipContent.svelte.d.ts +12 -0
- package/dist/components/tooltip/TooltipRoot.svelte +37 -0
- package/dist/components/tooltip/TooltipRoot.svelte.d.ts +10 -0
- package/dist/components/tooltip/TooltipTrigger.svelte +25 -0
- package/dist/components/tooltip/TooltipTrigger.svelte.d.ts +5 -0
- package/dist/components/tooltip/index.d.ts +13 -0
- package/dist/components/tooltip/index.js +10 -0
- package/dist/components/tooltip/intent.d.ts +2 -0
- package/dist/components/tooltip/intent.js +29 -0
- package/dist/components/work-fold/WorkFold.svelte +100 -0
- package/dist/components/work-fold/WorkFold.svelte.d.ts +15 -0
- package/dist/index.d.ts +127 -0
- package/dist/index.js +93 -0
- package/dist/internal/Chevron.svelte +28 -0
- package/dist/internal/Chevron.svelte.d.ts +7 -0
- package/dist/internal/Code.svelte +70 -0
- package/dist/internal/Code.svelte.d.ts +10 -0
- package/dist/internal/Collapse.svelte +57 -0
- package/dist/internal/Collapse.svelte.d.ts +12 -0
- package/dist/internal/Glyph.svelte +89 -0
- package/dist/internal/Glyph.svelte.d.ts +37 -0
- package/dist/internal/Tile.svelte +86 -0
- package/dist/internal/Tile.svelte.d.ts +15 -0
- package/dist/internal/control.d.ts +58 -0
- package/dist/internal/control.js +74 -0
- package/dist/internal/disclosure.d.ts +7 -0
- package/dist/internal/disclosure.js +1 -0
- package/dist/internal/json.d.ts +13 -0
- package/dist/internal/json.js +51 -0
- package/dist/internal/kinds.d.ts +9 -0
- package/dist/internal/kinds.js +25 -0
- package/dist/internal/layer.d.ts +103 -0
- package/dist/internal/layer.js +129 -0
- package/dist/internal/loop.d.ts +35 -0
- package/dist/internal/loop.js +72 -0
- package/dist/internal/markers.stylex.d.ts +14 -0
- package/dist/internal/markers.stylex.js +10 -0
- package/dist/internal/roving.d.ts +17 -0
- package/dist/internal/roving.js +68 -0
- package/dist/internal/shared.d.ts +36 -0
- package/dist/internal/shared.js +44 -0
- package/dist/internal/sx.d.ts +14 -0
- package/dist/internal/sx.js +11 -0
- package/dist/preset.d.ts +102 -0
- package/dist/preset.js +334 -0
- package/dist/tokens.stylex.d.ts +104 -0
- package/dist/tokens.stylex.js +125 -0
- package/dist/vite.d.ts +16 -0
- package/dist/vite.js +58 -0
- package/package.json +123 -5
package/README.md
CHANGED
|
@@ -1,3 +1,83 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Narvi
|
|
2
2
|
|
|
3
|
-
|
|
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 };
|