@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
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
4
|
+
import type { Sx } from '../../internal/sx.js';
|
|
5
|
+
import ToolSection from './ToolSection.svelte';
|
|
6
|
+
|
|
7
|
+
export type ToolInputProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
|
|
8
|
+
/** The arguments the model passed. Shown as indented JSON unless already a string. */
|
|
9
|
+
value?: unknown;
|
|
10
|
+
label?: string;
|
|
11
|
+
sx?: Sx;
|
|
12
|
+
/** Your own rendering of the arguments, in place of the JSON. */
|
|
13
|
+
children?: Snippet;
|
|
14
|
+
};
|
|
15
|
+
</script>
|
|
16
|
+
|
|
17
|
+
<script lang="ts">
|
|
18
|
+
let { label = 'Input', ...rest }: ToolInputProps = $props();
|
|
19
|
+
</script>
|
|
20
|
+
|
|
21
|
+
<ToolSection {label} layout="list" data-slot="tool-input" {...rest} />
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
+
import type { Sx } from '../../internal/sx.js';
|
|
4
|
+
export type ToolInputProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
|
|
5
|
+
/** The arguments the model passed. Shown as indented JSON unless already a string. */
|
|
6
|
+
value?: unknown;
|
|
7
|
+
label?: string;
|
|
8
|
+
sx?: Sx;
|
|
9
|
+
/** Your own rendering of the arguments, in place of the JSON. */
|
|
10
|
+
children?: Snippet;
|
|
11
|
+
};
|
|
12
|
+
declare const ToolInput: import("svelte").Component<ToolInputProps, {}, "">;
|
|
13
|
+
type ToolInput = ReturnType<typeof ToolInput>;
|
|
14
|
+
export default ToolInput;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
4
|
+
import type { Sx } from '../../internal/sx.js';
|
|
5
|
+
import { getToolContext } from './context.js';
|
|
6
|
+
import ToolSection from './ToolSection.svelte';
|
|
7
|
+
|
|
8
|
+
export type ToolOutputProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
|
|
9
|
+
/** What the tool returned. Shown as indented JSON unless already a string. */
|
|
10
|
+
value?: unknown;
|
|
11
|
+
/** Why the tool failed. Shown in place of the value, in red. */
|
|
12
|
+
error?: string;
|
|
13
|
+
label?: string;
|
|
14
|
+
sx?: Sx;
|
|
15
|
+
/** Your own rendering of the result, in place of the JSON. */
|
|
16
|
+
children?: Snippet;
|
|
17
|
+
};
|
|
18
|
+
</script>
|
|
19
|
+
|
|
20
|
+
<script lang="ts">
|
|
21
|
+
let { value, error, label, ...rest }: ToolOutputProps = $props();
|
|
22
|
+
|
|
23
|
+
const tool = getToolContext('Output');
|
|
24
|
+
const failed = $derived(error !== undefined || tool.state === 'error');
|
|
25
|
+
</script>
|
|
26
|
+
|
|
27
|
+
<ToolSection
|
|
28
|
+
label={label ?? (failed ? 'Error' : 'Output')}
|
|
29
|
+
value={error ?? value}
|
|
30
|
+
tone={failed ? 'danger' : 'default'}
|
|
31
|
+
data-slot="tool-output"
|
|
32
|
+
{...rest}
|
|
33
|
+
/>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
+
import type { Sx } from '../../internal/sx.js';
|
|
4
|
+
export type ToolOutputProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
|
|
5
|
+
/** What the tool returned. Shown as indented JSON unless already a string. */
|
|
6
|
+
value?: unknown;
|
|
7
|
+
/** Why the tool failed. Shown in place of the value, in red. */
|
|
8
|
+
error?: string;
|
|
9
|
+
label?: string;
|
|
10
|
+
sx?: Sx;
|
|
11
|
+
/** Your own rendering of the result, in place of the JSON. */
|
|
12
|
+
children?: Snippet;
|
|
13
|
+
};
|
|
14
|
+
declare const ToolOutput: import("svelte").Component<ToolOutputProps, {}, "">;
|
|
15
|
+
type ToolOutput = ReturnType<typeof ToolOutput>;
|
|
16
|
+
export default ToolOutput;
|
|
@@ -0,0 +1,94 @@
|
|
|
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 type { ActionKind } from '../../internal/kinds.js';
|
|
6
|
+
import { attrs, type Sx } from '../../internal/sx.js';
|
|
7
|
+
import { colors, font } from '../../tokens.stylex.js';
|
|
8
|
+
import { setToolContext, type ToolState } from './context.js';
|
|
9
|
+
|
|
10
|
+
export type ToolRootProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
|
|
11
|
+
/** The tool's name, such as `search_docs`. Shown in the trigger unless it has children. */
|
|
12
|
+
name: string;
|
|
13
|
+
/** What sort of tool it is, which picks its icon. */
|
|
14
|
+
kind?: ActionKind;
|
|
15
|
+
state?: ToolState;
|
|
16
|
+
/** Whether the input and output are showing. Bindable. */
|
|
17
|
+
open?: boolean;
|
|
18
|
+
/** Read out after the name, for each state. */
|
|
19
|
+
stateLabels?: Partial<Record<ToolState, string>>;
|
|
20
|
+
sx?: Sx;
|
|
21
|
+
ref?: HTMLDivElement | null;
|
|
22
|
+
/** A Tool.Trigger and a Tool.Content. */
|
|
23
|
+
children?: Snippet;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const LABELS: Record<ToolState, string> = {
|
|
27
|
+
pending: 'Preparing',
|
|
28
|
+
running: 'Running',
|
|
29
|
+
complete: 'Done',
|
|
30
|
+
error: 'Failed'
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const styles = stylex.create({
|
|
34
|
+
root: {
|
|
35
|
+
boxSizing: 'border-box',
|
|
36
|
+
display: 'flex',
|
|
37
|
+
flexDirection: 'column',
|
|
38
|
+
minWidth: 0,
|
|
39
|
+
color: colors.text,
|
|
40
|
+
fontFamily: font.body
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
</script>
|
|
44
|
+
|
|
45
|
+
<script lang="ts">
|
|
46
|
+
let {
|
|
47
|
+
name,
|
|
48
|
+
kind = 'tool',
|
|
49
|
+
state = 'running',
|
|
50
|
+
open = $bindable(false),
|
|
51
|
+
stateLabels,
|
|
52
|
+
sx,
|
|
53
|
+
class: className,
|
|
54
|
+
ref = $bindable(null),
|
|
55
|
+
children,
|
|
56
|
+
...rest
|
|
57
|
+
}: ToolRootProps = $props();
|
|
58
|
+
|
|
59
|
+
const uid = $props.id();
|
|
60
|
+
|
|
61
|
+
setToolContext({
|
|
62
|
+
get name() {
|
|
63
|
+
return name;
|
|
64
|
+
},
|
|
65
|
+
get kind() {
|
|
66
|
+
return kind;
|
|
67
|
+
},
|
|
68
|
+
get state() {
|
|
69
|
+
return state;
|
|
70
|
+
},
|
|
71
|
+
get stateLabel() {
|
|
72
|
+
return stateLabels?.[state] ?? LABELS[state];
|
|
73
|
+
},
|
|
74
|
+
get open() {
|
|
75
|
+
return open;
|
|
76
|
+
},
|
|
77
|
+
toggle() {
|
|
78
|
+
open = !open;
|
|
79
|
+
},
|
|
80
|
+
triggerId: `${uid}-trigger`,
|
|
81
|
+
contentId: `${uid}-content`
|
|
82
|
+
});
|
|
83
|
+
</script>
|
|
84
|
+
|
|
85
|
+
<div
|
|
86
|
+
bind:this={ref}
|
|
87
|
+
data-slot="tool"
|
|
88
|
+
data-state={state}
|
|
89
|
+
data-open={open || undefined}
|
|
90
|
+
{...rest}
|
|
91
|
+
{...attrs([styles.root, sx], className)}
|
|
92
|
+
>
|
|
93
|
+
{@render children?.()}
|
|
94
|
+
</div>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
+
import type { ActionKind } from '../../internal/kinds.js';
|
|
4
|
+
import { type Sx } from '../../internal/sx.js';
|
|
5
|
+
import { type ToolState } from './context.js';
|
|
6
|
+
export type ToolRootProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
|
|
7
|
+
/** The tool's name, such as `search_docs`. Shown in the trigger unless it has children. */
|
|
8
|
+
name: string;
|
|
9
|
+
/** What sort of tool it is, which picks its icon. */
|
|
10
|
+
kind?: ActionKind;
|
|
11
|
+
state?: ToolState;
|
|
12
|
+
/** Whether the input and output are showing. Bindable. */
|
|
13
|
+
open?: boolean;
|
|
14
|
+
/** Read out after the name, for each state. */
|
|
15
|
+
stateLabels?: Partial<Record<ToolState, string>>;
|
|
16
|
+
sx?: Sx;
|
|
17
|
+
ref?: HTMLDivElement | null;
|
|
18
|
+
/** A Tool.Trigger and a Tool.Content. */
|
|
19
|
+
children?: Snippet;
|
|
20
|
+
};
|
|
21
|
+
declare const ToolRoot: import("svelte").Component<ToolRootProps, {}, "ref" | "open">;
|
|
22
|
+
type ToolRoot = ReturnType<typeof ToolRoot>;
|
|
23
|
+
export default ToolRoot;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Shared by Tool.Input and Tool.Output: a small label over the value. Flat
|
|
3
|
+
arguments read as a list of names and values; anything else as coloured JSON.
|
|
4
|
+
-->
|
|
5
|
+
<script lang="ts" module>
|
|
6
|
+
import * as stylex from '@stylexjs/stylex';
|
|
7
|
+
import type { Snippet } from 'svelte';
|
|
8
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
9
|
+
import Code from '../../internal/Code.svelte';
|
|
10
|
+
import { flatEntries } from '../../internal/json.js';
|
|
11
|
+
import { shared } from '../../internal/shared.js';
|
|
12
|
+
import { attrs, type Sx } from '../../internal/sx.js';
|
|
13
|
+
import { colors, font, radius } from '../../tokens.stylex.js';
|
|
14
|
+
|
|
15
|
+
export type ToolSectionProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
|
|
16
|
+
label: string;
|
|
17
|
+
/** Shown as code. Strings as they are; anything else as indented JSON. */
|
|
18
|
+
value?: unknown;
|
|
19
|
+
/** `list` shows a flat object as names and values, when it is one. */
|
|
20
|
+
layout?: 'code' | 'list';
|
|
21
|
+
tone?: 'default' | 'danger';
|
|
22
|
+
sx?: Sx;
|
|
23
|
+
children?: Snippet;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const styles = stylex.create({
|
|
27
|
+
section: {
|
|
28
|
+
display: 'flex',
|
|
29
|
+
flexDirection: 'column',
|
|
30
|
+
gap: '0.4375rem',
|
|
31
|
+
minWidth: 0
|
|
32
|
+
},
|
|
33
|
+
dangerLabel: { color: colors.danger },
|
|
34
|
+
// Names on the left, values on the right, on one shared column line
|
|
35
|
+
list: {
|
|
36
|
+
display: 'grid',
|
|
37
|
+
gridTemplateColumns: 'max-content minmax(0, 1fr)',
|
|
38
|
+
columnGap: '1rem',
|
|
39
|
+
rowGap: '0.3125rem',
|
|
40
|
+
margin: 0,
|
|
41
|
+
paddingBlock: '0.5625rem',
|
|
42
|
+
paddingInline: '0.75rem',
|
|
43
|
+
borderRadius: radius.md,
|
|
44
|
+
backgroundColor: colors.well,
|
|
45
|
+
boxShadow: `inset 0 0 0 1px ${colors.line}`,
|
|
46
|
+
fontFamily: font.mono,
|
|
47
|
+
fontSize: font.sizeXs,
|
|
48
|
+
lineHeight: font.leadingSnug
|
|
49
|
+
},
|
|
50
|
+
key: { margin: 0, color: colors.textSubtle },
|
|
51
|
+
value: { margin: 0, minWidth: 0, color: colors.text, overflowWrap: 'anywhere' },
|
|
52
|
+
text: {},
|
|
53
|
+
number: { color: colors.codeNumber, fontVariantNumeric: 'tabular-nums' },
|
|
54
|
+
literal: { color: colors.codeLiteral },
|
|
55
|
+
custom: {
|
|
56
|
+
minWidth: 0,
|
|
57
|
+
fontSize: font.sizeSm,
|
|
58
|
+
lineHeight: font.leadingNormal
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
</script>
|
|
62
|
+
|
|
63
|
+
<script lang="ts">
|
|
64
|
+
let {
|
|
65
|
+
label,
|
|
66
|
+
value,
|
|
67
|
+
layout = 'code',
|
|
68
|
+
tone = 'default',
|
|
69
|
+
sx,
|
|
70
|
+
class: className,
|
|
71
|
+
children,
|
|
72
|
+
...rest
|
|
73
|
+
}: ToolSectionProps = $props();
|
|
74
|
+
|
|
75
|
+
const entries = $derived(
|
|
76
|
+
(layout === 'list' ? flatEntries(value) : undefined)?.map(([key, item]) => ({
|
|
77
|
+
key,
|
|
78
|
+
text: String(item),
|
|
79
|
+
kind: (typeof item === 'number'
|
|
80
|
+
? 'number'
|
|
81
|
+
: typeof item === 'string'
|
|
82
|
+
? 'text'
|
|
83
|
+
: 'literal') as 'number' | 'text' | 'literal'
|
|
84
|
+
}))
|
|
85
|
+
);
|
|
86
|
+
</script>
|
|
87
|
+
|
|
88
|
+
<div {...rest} {...attrs([styles.section, sx], className)}>
|
|
89
|
+
<p {...stylex.attrs(shared.eyebrow, tone === 'danger' && styles.dangerLabel)}>{label}</p>
|
|
90
|
+
{#if children}
|
|
91
|
+
<div {...stylex.attrs(styles.custom)}>{@render children()}</div>
|
|
92
|
+
{:else if entries}
|
|
93
|
+
<dl {...stylex.attrs(styles.list)}>
|
|
94
|
+
{#each entries as entry (entry.key)}
|
|
95
|
+
<dt {...stylex.attrs(styles.key)}>{entry.key}</dt>
|
|
96
|
+
<dd {...stylex.attrs(styles.value, styles[entry.kind])}>{entry.text}</dd>
|
|
97
|
+
{/each}
|
|
98
|
+
</dl>
|
|
99
|
+
{:else if value !== undefined}
|
|
100
|
+
<Code {value} {tone} />
|
|
101
|
+
{/if}
|
|
102
|
+
</div>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
+
import { type Sx } from '../../internal/sx.js';
|
|
4
|
+
export type ToolSectionProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
|
|
5
|
+
label: string;
|
|
6
|
+
/** Shown as code. Strings as they are; anything else as indented JSON. */
|
|
7
|
+
value?: unknown;
|
|
8
|
+
/** `list` shows a flat object as names and values, when it is one. */
|
|
9
|
+
layout?: 'code' | 'list';
|
|
10
|
+
tone?: 'default' | 'danger';
|
|
11
|
+
sx?: Sx;
|
|
12
|
+
children?: Snippet;
|
|
13
|
+
};
|
|
14
|
+
declare const ToolSection: import("svelte").Component<ToolSectionProps, {}, "">;
|
|
15
|
+
type ToolSection = ReturnType<typeof ToolSection>;
|
|
16
|
+
export default ToolSection;
|
|
@@ -0,0 +1,191 @@
|
|
|
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 Glyph from '../../internal/Glyph.svelte';
|
|
7
|
+
import { KIND_GLYPHS } from '../../internal/kinds.js';
|
|
8
|
+
import { attrs, type Sx } from '../../internal/sx.js';
|
|
9
|
+
import Tile, { type TileTone } from '../../internal/Tile.svelte';
|
|
10
|
+
import { colors, font, motion, radius } from '../../tokens.stylex.js';
|
|
11
|
+
import Shimmer from '../shimmer/Shimmer.svelte';
|
|
12
|
+
import { getToolContext, type ToolState } from './context.js';
|
|
13
|
+
|
|
14
|
+
export type ToolTriggerProps = Omit<HTMLButtonAttributes, 'children'> & {
|
|
15
|
+
/** Your own icon, in place of the one for the tool's kind. */
|
|
16
|
+
icon?: Snippet;
|
|
17
|
+
sx?: Sx;
|
|
18
|
+
ref?: HTMLButtonElement | null;
|
|
19
|
+
/** A friendlier title, such as "Searched the docs". The tool's name then follows it, as code. */
|
|
20
|
+
children?: Snippet;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const HOVER = '@media (hover: hover) and (pointer: fine)';
|
|
24
|
+
const MOTION = '@media (prefers-reduced-motion: no-preference)';
|
|
25
|
+
|
|
26
|
+
const TONES: Record<ToolState, TileTone> = {
|
|
27
|
+
pending: 'live',
|
|
28
|
+
running: 'live',
|
|
29
|
+
complete: 'neutral',
|
|
30
|
+
error: 'danger'
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const styles = stylex.create({
|
|
34
|
+
// A row on the turn's rail, like thinking and activity: a tile, then the words
|
|
35
|
+
trigger: {
|
|
36
|
+
display: 'flex',
|
|
37
|
+
alignItems: 'center',
|
|
38
|
+
alignSelf: 'flex-start',
|
|
39
|
+
gap: '0.625rem',
|
|
40
|
+
maxWidth: '100%',
|
|
41
|
+
minHeight: '1.75rem',
|
|
42
|
+
margin: 0,
|
|
43
|
+
padding: 0,
|
|
44
|
+
borderWidth: 0,
|
|
45
|
+
borderRadius: radius.xs,
|
|
46
|
+
backgroundColor: 'transparent',
|
|
47
|
+
color: { default: colors.textMuted, ':hover': { default: null, [HOVER]: colors.text } },
|
|
48
|
+
fontFamily: 'inherit',
|
|
49
|
+
fontSize: font.sizeMd,
|
|
50
|
+
lineHeight: font.leadingSnug,
|
|
51
|
+
textAlign: 'start',
|
|
52
|
+
cursor: 'pointer',
|
|
53
|
+
WebkitTapHighlightColor: 'transparent',
|
|
54
|
+
outlineStyle: 'solid',
|
|
55
|
+
outlineWidth: { default: 0, ':focus-visible': '2px' },
|
|
56
|
+
outlineColor: colors.focusRing,
|
|
57
|
+
outlineOffset: '2px',
|
|
58
|
+
transitionProperty: 'color',
|
|
59
|
+
transitionDuration: motion.fast,
|
|
60
|
+
transitionTimingFunction: 'ease'
|
|
61
|
+
},
|
|
62
|
+
heading: {
|
|
63
|
+
display: 'flex',
|
|
64
|
+
alignItems: 'baseline',
|
|
65
|
+
gap: '0.5rem',
|
|
66
|
+
minWidth: 0
|
|
67
|
+
},
|
|
68
|
+
// The title keeps its width, up to the whole row; the name takes what is left
|
|
69
|
+
title: {
|
|
70
|
+
flexShrink: 0,
|
|
71
|
+
maxWidth: '100%',
|
|
72
|
+
minWidth: 0,
|
|
73
|
+
overflow: 'hidden',
|
|
74
|
+
textOverflow: 'ellipsis',
|
|
75
|
+
whiteSpace: 'nowrap'
|
|
76
|
+
},
|
|
77
|
+
// The tool's own name is code, so it is set as code
|
|
78
|
+
// When the row is short of room, the name gives way before the title
|
|
79
|
+
name: {
|
|
80
|
+
flexShrink: 100,
|
|
81
|
+
minWidth: 0,
|
|
82
|
+
overflow: 'hidden',
|
|
83
|
+
textOverflow: 'ellipsis',
|
|
84
|
+
whiteSpace: 'nowrap',
|
|
85
|
+
color: colors.textSubtle,
|
|
86
|
+
fontFamily: font.mono,
|
|
87
|
+
fontSize: '0.75rem'
|
|
88
|
+
},
|
|
89
|
+
// A new state settles into place, so the change from spinner to tick is seen
|
|
90
|
+
status: {
|
|
91
|
+
display: 'inline-flex',
|
|
92
|
+
alignItems: 'center',
|
|
93
|
+
gap: '0.25rem',
|
|
94
|
+
flexShrink: 0,
|
|
95
|
+
fontSize: font.sizeXs,
|
|
96
|
+
fontWeight: font.weightMedium,
|
|
97
|
+
opacity: { default: 1, '@starting-style': 0 },
|
|
98
|
+
scale: { default: null, [MOTION]: { default: 1, '@starting-style': 0.6 } },
|
|
99
|
+
transitionProperty: { default: 'opacity', [MOTION]: 'opacity, scale' },
|
|
100
|
+
transitionDuration: motion.slow,
|
|
101
|
+
transitionTimingFunction: motion.easeOut
|
|
102
|
+
},
|
|
103
|
+
nameAsTitle: { color: 'inherit' },
|
|
104
|
+
running: { color: colors.ithil },
|
|
105
|
+
complete: { color: colors.success },
|
|
106
|
+
error: {
|
|
107
|
+
paddingBlock: '0.125rem',
|
|
108
|
+
paddingInline: '0.4375rem',
|
|
109
|
+
borderRadius: radius.lg,
|
|
110
|
+
backgroundColor: colors.dangerSoft,
|
|
111
|
+
color: colors.dangerInk
|
|
112
|
+
},
|
|
113
|
+
chevron: {
|
|
114
|
+
display: 'grid',
|
|
115
|
+
color: colors.textSubtle
|
|
116
|
+
},
|
|
117
|
+
hidden: {
|
|
118
|
+
position: 'absolute',
|
|
119
|
+
width: '1px',
|
|
120
|
+
height: '1px',
|
|
121
|
+
overflow: 'hidden',
|
|
122
|
+
clipPath: 'inset(50%)',
|
|
123
|
+
whiteSpace: 'nowrap'
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
</script>
|
|
127
|
+
|
|
128
|
+
<script lang="ts">
|
|
129
|
+
let {
|
|
130
|
+
icon,
|
|
131
|
+
sx,
|
|
132
|
+
class: className,
|
|
133
|
+
ref = $bindable(null),
|
|
134
|
+
children,
|
|
135
|
+
onclick,
|
|
136
|
+
...rest
|
|
137
|
+
}: ToolTriggerProps = $props();
|
|
138
|
+
|
|
139
|
+
const tool = getToolContext('Trigger');
|
|
140
|
+
const working = $derived(tool.state === 'pending' || tool.state === 'running');
|
|
141
|
+
</script>
|
|
142
|
+
|
|
143
|
+
<button
|
|
144
|
+
bind:this={ref}
|
|
145
|
+
type="button"
|
|
146
|
+
id={tool.triggerId}
|
|
147
|
+
aria-expanded={tool.open}
|
|
148
|
+
aria-controls={tool.contentId}
|
|
149
|
+
data-slot="tool-trigger"
|
|
150
|
+
{...rest}
|
|
151
|
+
{...attrs([styles.trigger, sx], className)}
|
|
152
|
+
onclick={(event) => {
|
|
153
|
+
onclick?.(event);
|
|
154
|
+
if (!event.defaultPrevented) tool.toggle();
|
|
155
|
+
}}
|
|
156
|
+
>
|
|
157
|
+
<Tile tone={TONES[tool.state]} glyph={icon ? undefined : KIND_GLYPHS[tool.kind]}>
|
|
158
|
+
{#if icon}{@render icon()}{/if}
|
|
159
|
+
</Tile>
|
|
160
|
+
<span {...stylex.attrs(styles.heading)}>
|
|
161
|
+
{#if children}
|
|
162
|
+
<span {...stylex.attrs(styles.title)}
|
|
163
|
+
><Shimmer active={working}>{@render children()}</Shimmer></span
|
|
164
|
+
>
|
|
165
|
+
<code {...stylex.attrs(styles.name)}>{tool.name}</code>
|
|
166
|
+
{:else}
|
|
167
|
+
<code {...stylex.attrs(styles.title, styles.name, styles.nameAsTitle)}
|
|
168
|
+
><Shimmer active={working}>{tool.name}</Shimmer></code
|
|
169
|
+
>
|
|
170
|
+
{/if}
|
|
171
|
+
<span {...stylex.attrs(styles.hidden)}>{` (${tool.stateLabel})`}</span>
|
|
172
|
+
</span>
|
|
173
|
+
{#key tool.state}
|
|
174
|
+
<span
|
|
175
|
+
aria-hidden="true"
|
|
176
|
+
{...stylex.attrs(
|
|
177
|
+
styles.status,
|
|
178
|
+
tool.state === 'running' && styles.running,
|
|
179
|
+
tool.state === 'complete' && styles.complete,
|
|
180
|
+
tool.state === 'error' && styles.error
|
|
181
|
+
)}
|
|
182
|
+
>
|
|
183
|
+
{#if tool.state === 'complete'}
|
|
184
|
+
<Glyph name="check" size={13} stroke={2} />
|
|
185
|
+
{:else if tool.state === 'error'}
|
|
186
|
+
{tool.stateLabel}
|
|
187
|
+
{/if}
|
|
188
|
+
</span>
|
|
189
|
+
{/key}
|
|
190
|
+
<span {...stylex.attrs(styles.chevron)}><Chevron open={tool.open} size={12} /></span>
|
|
191
|
+
</button>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { HTMLButtonAttributes } from 'svelte/elements';
|
|
3
|
+
import { type Sx } from '../../internal/sx.js';
|
|
4
|
+
export type ToolTriggerProps = Omit<HTMLButtonAttributes, 'children'> & {
|
|
5
|
+
/** Your own icon, in place of the one for the tool's kind. */
|
|
6
|
+
icon?: Snippet;
|
|
7
|
+
sx?: Sx;
|
|
8
|
+
ref?: HTMLButtonElement | null;
|
|
9
|
+
/** A friendlier title, such as "Searched the docs". The tool's name then follows it, as code. */
|
|
10
|
+
children?: Snippet;
|
|
11
|
+
};
|
|
12
|
+
declare const ToolTrigger: import("svelte").Component<ToolTriggerProps, {}, "ref">;
|
|
13
|
+
type ToolTrigger = ReturnType<typeof ToolTrigger>;
|
|
14
|
+
export default ToolTrigger;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { DisclosureContext } from '../../internal/disclosure.js';
|
|
2
|
+
import type { ActionKind } from '../../internal/kinds.js';
|
|
3
|
+
/**
|
|
4
|
+
* Where a tool call stands. In the AI SDK's terms:
|
|
5
|
+
* - `pending`: `input-streaming`, the arguments are still being written
|
|
6
|
+
* - `running`: `input-available`, the tool is at work
|
|
7
|
+
* - `complete`: `output-available`
|
|
8
|
+
* - `error`: `output-error`
|
|
9
|
+
*/
|
|
10
|
+
export type ToolState = 'pending' | 'running' | 'complete' | 'error';
|
|
11
|
+
export type ToolContext = DisclosureContext & {
|
|
12
|
+
readonly name: string;
|
|
13
|
+
readonly kind: ActionKind;
|
|
14
|
+
readonly state: ToolState;
|
|
15
|
+
readonly stateLabel: string;
|
|
16
|
+
};
|
|
17
|
+
export declare function setToolContext(context: ToolContext): void;
|
|
18
|
+
export declare function getToolContext(part: string): ToolContext;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { getContext, setContext } from 'svelte';
|
|
2
|
+
const KEY = Symbol('narvi.tool');
|
|
3
|
+
export function setToolContext(context) {
|
|
4
|
+
setContext(KEY, context);
|
|
5
|
+
}
|
|
6
|
+
export function getToolContext(part) {
|
|
7
|
+
const context = getContext(KEY);
|
|
8
|
+
if (!context)
|
|
9
|
+
throw new Error(`<Tool.${part}> must be placed inside <Tool.Root>.`);
|
|
10
|
+
return context;
|
|
11
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import Content from './ToolContent.svelte';
|
|
2
|
+
import Input from './ToolInput.svelte';
|
|
3
|
+
import Output from './ToolOutput.svelte';
|
|
4
|
+
import Root from './ToolRoot.svelte';
|
|
5
|
+
import Trigger from './ToolTrigger.svelte';
|
|
6
|
+
export { Root, Trigger, Content, Input, Output, Root as ToolRoot, Trigger as ToolTrigger, Content as ToolContent, Input as ToolInput, Output as ToolOutput };
|
|
7
|
+
export type { ToolState } from './context.js';
|
|
8
|
+
export type { ToolContentProps } from './ToolContent.svelte';
|
|
9
|
+
export type { ToolInputProps } from './ToolInput.svelte';
|
|
10
|
+
export type { ToolOutputProps } from './ToolOutput.svelte';
|
|
11
|
+
export type { ToolRootProps } from './ToolRoot.svelte';
|
|
12
|
+
export type { ToolTriggerProps } from './ToolTrigger.svelte';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import Content from './ToolContent.svelte';
|
|
2
|
+
import Input from './ToolInput.svelte';
|
|
3
|
+
import Output from './ToolOutput.svelte';
|
|
4
|
+
import Root from './ToolRoot.svelte';
|
|
5
|
+
import Trigger from './ToolTrigger.svelte';
|
|
6
|
+
export { Root, Trigger, Content, Input, Output,
|
|
7
|
+
//
|
|
8
|
+
Root as ToolRoot, Trigger as ToolTrigger, Content as ToolContent, Input as ToolInput, Output as ToolOutput };
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import { Tooltip } from 'bits-ui';
|
|
3
|
+
import * as stylex from '@stylexjs/stylex';
|
|
4
|
+
import type { Snippet } from 'svelte';
|
|
5
|
+
import { attrs, type Sx } from '../../internal/sx.js';
|
|
6
|
+
import { colors, font, motion, radius } from '../../tokens.stylex.js';
|
|
7
|
+
import Kbd from '../kbd/Kbd.svelte';
|
|
8
|
+
|
|
9
|
+
export type TooltipContentProps = Omit<Tooltip.ContentProps, 'children' | 'child'> & {
|
|
10
|
+
/** The keys that do the same, shown after the label: `['⌘', 'K']`. */
|
|
11
|
+
shortcut?: string[];
|
|
12
|
+
sx?: Sx;
|
|
13
|
+
children?: Snippet;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const MOTION = '@media (prefers-reduced-motion: no-preference)';
|
|
17
|
+
const CLOSED = ':is([data-state="closed"])';
|
|
18
|
+
const INSTANT = ':is([data-state="instant-open"])';
|
|
19
|
+
|
|
20
|
+
const styles = stylex.create({
|
|
21
|
+
content: {
|
|
22
|
+
zIndex: 60,
|
|
23
|
+
display: 'flex',
|
|
24
|
+
alignItems: 'center',
|
|
25
|
+
gap: '0.5rem',
|
|
26
|
+
maxWidth: '18rem',
|
|
27
|
+
paddingBlock: '0.3125rem',
|
|
28
|
+
paddingInline: '0.5rem',
|
|
29
|
+
borderRadius: radius.md,
|
|
30
|
+
backgroundColor: colors.bgRaised,
|
|
31
|
+
boxShadow: `inset 0 0 0 1px ${colors.lineStrong}, 0 4px 12px -4px ${colors.shade}`,
|
|
32
|
+
color: colors.text,
|
|
33
|
+
fontFamily: font.body,
|
|
34
|
+
fontSize: font.sizeXs,
|
|
35
|
+
lineHeight: font.leadingSnug,
|
|
36
|
+
transformOrigin: 'var(--bits-floating-transform-origin)',
|
|
37
|
+
opacity: { default: 1, '@starting-style': 0, [CLOSED]: 0 },
|
|
38
|
+
scale: { default: null, [MOTION]: { default: 1, '@starting-style': 0.97, [CLOSED]: 0.97 } },
|
|
39
|
+
transitionProperty: { default: 'opacity', [MOTION]: 'opacity, scale' },
|
|
40
|
+
transitionTimingFunction: motion.easeOut,
|
|
41
|
+
// Once one tooltip is open, the next opens at once: moving along a
|
|
42
|
+
// toolbar should feel quick, not like each button is thinking
|
|
43
|
+
transitionDuration: { default: '120ms', [CLOSED]: '80ms', [INSTANT]: '0ms' }
|
|
44
|
+
},
|
|
45
|
+
keys: { display: 'inline-flex', gap: '0.125rem' }
|
|
46
|
+
});
|
|
47
|
+
</script>
|
|
48
|
+
|
|
49
|
+
<script lang="ts">
|
|
50
|
+
let {
|
|
51
|
+
sideOffset = 6,
|
|
52
|
+
collisionPadding = 8,
|
|
53
|
+
shortcut,
|
|
54
|
+
sx,
|
|
55
|
+
class: className,
|
|
56
|
+
children,
|
|
57
|
+
...rest
|
|
58
|
+
}: TooltipContentProps = $props();
|
|
59
|
+
</script>
|
|
60
|
+
|
|
61
|
+
<Tooltip.Portal>
|
|
62
|
+
<Tooltip.Content
|
|
63
|
+
{sideOffset}
|
|
64
|
+
{collisionPadding}
|
|
65
|
+
data-slot="tooltip"
|
|
66
|
+
{...rest}
|
|
67
|
+
{...attrs([styles.content, sx], className)}
|
|
68
|
+
>
|
|
69
|
+
{@render children?.()}
|
|
70
|
+
{#if shortcut?.length}
|
|
71
|
+
<span {...stylex.attrs(styles.keys)}>
|
|
72
|
+
{#each shortcut as key, index (index)}<Kbd>{key}</Kbd>{/each}
|
|
73
|
+
</span>
|
|
74
|
+
{/if}
|
|
75
|
+
</Tooltip.Content>
|
|
76
|
+
</Tooltip.Portal>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Tooltip } from 'bits-ui';
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import { type Sx } from '../../internal/sx.js';
|
|
4
|
+
export type TooltipContentProps = Omit<Tooltip.ContentProps, 'children' | 'child'> & {
|
|
5
|
+
/** The keys that do the same, shown after the label: `['⌘', 'K']`. */
|
|
6
|
+
shortcut?: string[];
|
|
7
|
+
sx?: Sx;
|
|
8
|
+
children?: Snippet;
|
|
9
|
+
};
|
|
10
|
+
declare const TooltipContent: import("svelte").Component<TooltipContentProps, {}, "">;
|
|
11
|
+
type TooltipContent = ReturnType<typeof TooltipContent>;
|
|
12
|
+
export default TooltipContent;
|