@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,79 @@
|
|
|
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 { messageMarker } from '../../internal/markers.stylex.js';
|
|
6
|
+
import { attrs, type Sx } from '../../internal/sx.js';
|
|
7
|
+
import { colors, font } from '../../tokens.stylex.js';
|
|
8
|
+
import { setMessageContext, type MessageFrom } from './context.js';
|
|
9
|
+
|
|
10
|
+
export type MessageRootProps = Omit<HTMLAttributes<HTMLElement>, 'children'> & {
|
|
11
|
+
/** Who wrote it. The person's messages sit at the end of the line, in a bubble. */
|
|
12
|
+
from?: MessageFrom;
|
|
13
|
+
/**
|
|
14
|
+
* Set while the reply is still arriving. The message is marked busy, so
|
|
15
|
+
* assistive technology reads it once, when it is complete.
|
|
16
|
+
*/
|
|
17
|
+
streaming?: boolean;
|
|
18
|
+
sx?: Sx;
|
|
19
|
+
ref?: HTMLElement | null;
|
|
20
|
+
/** A Message.Content, and optionally Message.Actions. */
|
|
21
|
+
children?: Snippet;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const FINE = '@media (hover: hover) and (pointer: fine)';
|
|
25
|
+
|
|
26
|
+
const styles = stylex.create({
|
|
27
|
+
root: {
|
|
28
|
+
display: 'flex',
|
|
29
|
+
flexDirection: 'column',
|
|
30
|
+
gap: '0.375rem',
|
|
31
|
+
minWidth: 0,
|
|
32
|
+
color: colors.text,
|
|
33
|
+
fontFamily: font.body
|
|
34
|
+
},
|
|
35
|
+
// The person's message opens a new exchange, so it stands further from the
|
|
36
|
+
// reply before it than a reply stands from its question. With a mouse, its
|
|
37
|
+
// actions sit beside the bubble, at its foot, so they take no height.
|
|
38
|
+
user: {
|
|
39
|
+
alignItems: 'flex-end',
|
|
40
|
+
flexDirection: { default: 'column', [FINE]: 'row-reverse' },
|
|
41
|
+
gap: { default: '0.375rem', [FINE]: '0.25rem' },
|
|
42
|
+
marginBlockStart: { default: '1.5rem', ':first-child': 0 }
|
|
43
|
+
},
|
|
44
|
+
assistant: { alignItems: 'stretch' }
|
|
45
|
+
});
|
|
46
|
+
</script>
|
|
47
|
+
|
|
48
|
+
<script lang="ts">
|
|
49
|
+
let {
|
|
50
|
+
from = 'assistant',
|
|
51
|
+
streaming = false,
|
|
52
|
+
sx,
|
|
53
|
+
class: className,
|
|
54
|
+
ref = $bindable(null),
|
|
55
|
+
children,
|
|
56
|
+
...rest
|
|
57
|
+
}: MessageRootProps = $props();
|
|
58
|
+
|
|
59
|
+
setMessageContext({
|
|
60
|
+
get from() {
|
|
61
|
+
return from;
|
|
62
|
+
},
|
|
63
|
+
get streaming() {
|
|
64
|
+
return streaming;
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
</script>
|
|
68
|
+
|
|
69
|
+
<article
|
|
70
|
+
bind:this={ref}
|
|
71
|
+
aria-busy={streaming || undefined}
|
|
72
|
+
data-slot="message"
|
|
73
|
+
data-from={from}
|
|
74
|
+
data-streaming={streaming || undefined}
|
|
75
|
+
{...rest}
|
|
76
|
+
{...attrs([styles.root, styles[from], messageMarker, sx], className)}
|
|
77
|
+
>
|
|
78
|
+
{@render children?.()}
|
|
79
|
+
</article>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
+
import { type Sx } from '../../internal/sx.js';
|
|
4
|
+
import { type MessageFrom } from './context.js';
|
|
5
|
+
export type MessageRootProps = Omit<HTMLAttributes<HTMLElement>, 'children'> & {
|
|
6
|
+
/** Who wrote it. The person's messages sit at the end of the line, in a bubble. */
|
|
7
|
+
from?: MessageFrom;
|
|
8
|
+
/**
|
|
9
|
+
* Set while the reply is still arriving. The message is marked busy, so
|
|
10
|
+
* assistive technology reads it once, when it is complete.
|
|
11
|
+
*/
|
|
12
|
+
streaming?: boolean;
|
|
13
|
+
sx?: Sx;
|
|
14
|
+
ref?: HTMLElement | null;
|
|
15
|
+
/** A Message.Content, and optionally Message.Actions. */
|
|
16
|
+
children?: Snippet;
|
|
17
|
+
};
|
|
18
|
+
declare const MessageRoot: import("svelte").Component<MessageRootProps, {}, "ref">;
|
|
19
|
+
type MessageRoot = ReturnType<typeof MessageRoot>;
|
|
20
|
+
export default MessageRoot;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
When a message was sent. Revealed with the message's actions on hover or
|
|
3
|
+
focus, in space they already hold, so it moves nothing.
|
|
4
|
+
-->
|
|
5
|
+
<script lang="ts" module>
|
|
6
|
+
import * as stylex from '@stylexjs/stylex';
|
|
7
|
+
import { messageMarker } from '../../internal/markers.stylex.js';
|
|
8
|
+
import { attrs, type Sx } from '../../internal/sx.js';
|
|
9
|
+
import { colors, font, motion } from '../../tokens.stylex.js';
|
|
10
|
+
|
|
11
|
+
export type MessageTimeProps = {
|
|
12
|
+
/** When it was sent. */
|
|
13
|
+
date: Date;
|
|
14
|
+
/** How it is shown; by default the time of day, in the person's locale. */
|
|
15
|
+
format?: (date: Date) => string;
|
|
16
|
+
sx?: Sx;
|
|
17
|
+
class?: string;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const FINE = '@media (hover: hover) and (pointer: fine)';
|
|
21
|
+
|
|
22
|
+
const styles = stylex.create({
|
|
23
|
+
time: {
|
|
24
|
+
paddingInline: '0.375rem',
|
|
25
|
+
color: colors.textSubtle,
|
|
26
|
+
fontSize: font.sizeXs,
|
|
27
|
+
fontVariantNumeric: 'tabular-nums',
|
|
28
|
+
whiteSpace: 'nowrap',
|
|
29
|
+
opacity: {
|
|
30
|
+
default: 1,
|
|
31
|
+
[FINE]: {
|
|
32
|
+
default: 0,
|
|
33
|
+
[stylex.when.ancestor(':hover', messageMarker)]: 1,
|
|
34
|
+
[stylex.when.ancestor(':focus-within', messageMarker)]: 1
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
transitionProperty: 'opacity',
|
|
38
|
+
transitionDuration: motion.base,
|
|
39
|
+
transitionTimingFunction: 'ease'
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
const timeOfDay = (date: Date) =>
|
|
44
|
+
date.toLocaleTimeString(undefined, { hour: 'numeric', minute: '2-digit' });
|
|
45
|
+
</script>
|
|
46
|
+
|
|
47
|
+
<script lang="ts">
|
|
48
|
+
let { date, format = timeOfDay, sx, class: className }: MessageTimeProps = $props();
|
|
49
|
+
</script>
|
|
50
|
+
|
|
51
|
+
<time
|
|
52
|
+
datetime={date.toISOString()}
|
|
53
|
+
title={date.toLocaleString()}
|
|
54
|
+
data-slot="message-time"
|
|
55
|
+
{...attrs([styles.time, sx], className)}
|
|
56
|
+
>
|
|
57
|
+
{format(date)}
|
|
58
|
+
</time>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type Sx } from '../../internal/sx.js';
|
|
2
|
+
export type MessageTimeProps = {
|
|
3
|
+
/** When it was sent. */
|
|
4
|
+
date: Date;
|
|
5
|
+
/** How it is shown; by default the time of day, in the person's locale. */
|
|
6
|
+
format?: (date: Date) => string;
|
|
7
|
+
sx?: Sx;
|
|
8
|
+
class?: string;
|
|
9
|
+
};
|
|
10
|
+
declare const MessageTime: import("svelte").Component<MessageTimeProps, {}, "">;
|
|
11
|
+
type MessageTime = ReturnType<typeof MessageTime>;
|
|
12
|
+
export default MessageTime;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type MessageFrom = 'user' | 'assistant';
|
|
2
|
+
export type MessageContext = {
|
|
3
|
+
readonly from: MessageFrom;
|
|
4
|
+
readonly streaming: boolean;
|
|
5
|
+
};
|
|
6
|
+
export declare function setMessageContext(context: MessageContext): void;
|
|
7
|
+
export declare function getMessageContext(part: string): MessageContext;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { getContext, setContext } from 'svelte';
|
|
2
|
+
const KEY = Symbol('narvi.message');
|
|
3
|
+
export function setMessageContext(context) {
|
|
4
|
+
setContext(KEY, context);
|
|
5
|
+
}
|
|
6
|
+
export function getMessageContext(part) {
|
|
7
|
+
const context = getContext(KEY);
|
|
8
|
+
if (!context)
|
|
9
|
+
throw new Error(`<Message.${part}> must be placed inside <Message.Root>.`);
|
|
10
|
+
return context;
|
|
11
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import Action from './MessageAction.svelte';
|
|
2
|
+
import Actions from './MessageActions.svelte';
|
|
3
|
+
import Content from './MessageContent.svelte';
|
|
4
|
+
import Copy from './MessageCopy.svelte';
|
|
5
|
+
import Header from './MessageHeader.svelte';
|
|
6
|
+
import Pending from './MessagePending.svelte';
|
|
7
|
+
import Root from './MessageRoot.svelte';
|
|
8
|
+
import Time from './MessageTime.svelte';
|
|
9
|
+
export { Root, Header, Pending, Content, Actions, Action, Copy, Time, Root as MessageRoot, Header as MessageHeader, Pending as MessagePending, Content as MessageContent, Actions as MessageActions, Action as MessageAction, Copy as MessageCopy, Time as MessageTime };
|
|
10
|
+
export type { MessageFrom } from './context.js';
|
|
11
|
+
export type { MessageActionProps } from './MessageAction.svelte';
|
|
12
|
+
export type { MessageActionsProps } from './MessageActions.svelte';
|
|
13
|
+
export type { MessageContentProps } from './MessageContent.svelte';
|
|
14
|
+
export type { MessageCopyProps } from './MessageCopy.svelte';
|
|
15
|
+
export type { MessageHeaderProps } from './MessageHeader.svelte';
|
|
16
|
+
export type { MessagePendingProps } from './MessagePending.svelte';
|
|
17
|
+
export type { MessageRootProps } from './MessageRoot.svelte';
|
|
18
|
+
export type { MessageTimeProps } from './MessageTime.svelte';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import Action from './MessageAction.svelte';
|
|
2
|
+
import Actions from './MessageActions.svelte';
|
|
3
|
+
import Content from './MessageContent.svelte';
|
|
4
|
+
import Copy from './MessageCopy.svelte';
|
|
5
|
+
import Header from './MessageHeader.svelte';
|
|
6
|
+
import Pending from './MessagePending.svelte';
|
|
7
|
+
import Root from './MessageRoot.svelte';
|
|
8
|
+
import Time from './MessageTime.svelte';
|
|
9
|
+
export { Root, Header, Pending, Content, Actions, Action, Copy, Time,
|
|
10
|
+
//
|
|
11
|
+
Root as MessageRoot, Header as MessageHeader, Pending as MessagePending, Content as MessageContent, Actions as MessageActions, Action as MessageAction, Copy as MessageCopy, Time as MessageTime };
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
A note in place: what is happening, or went wrong, and what to do about it.
|
|
3
|
+
The detail is always on show, never kept in a tooltip.
|
|
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 Glyph from '../../internal/Glyph.svelte';
|
|
10
|
+
import { attrs, type Sx } from '../../internal/sx.js';
|
|
11
|
+
import { colors, font, radius } from '../../tokens.stylex.js';
|
|
12
|
+
import Spinner from '../spinner/Spinner.svelte';
|
|
13
|
+
|
|
14
|
+
export type NoticeTone = 'neutral' | 'info' | 'success' | 'warning' | 'danger';
|
|
15
|
+
|
|
16
|
+
export type NoticeProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
|
|
17
|
+
tone?: NoticeTone;
|
|
18
|
+
/** A second line, such as the cause or the next step. Always visible. */
|
|
19
|
+
detail?: string;
|
|
20
|
+
/** Shows a spinner in place of the icon, for work under way. */
|
|
21
|
+
busy?: boolean;
|
|
22
|
+
/** An icon of your own, in place of the tone's. */
|
|
23
|
+
icon?: Snippet;
|
|
24
|
+
/** Buttons at the end, such as Retry. */
|
|
25
|
+
actions?: Snippet;
|
|
26
|
+
/**
|
|
27
|
+
* Announces the notice as it appears: at once for danger, politely for
|
|
28
|
+
* the rest. Leave it off for notes that are there from the start.
|
|
29
|
+
*/
|
|
30
|
+
live?: boolean;
|
|
31
|
+
sx?: Sx;
|
|
32
|
+
/** What the notice says. */
|
|
33
|
+
children?: Snippet;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const styles = stylex.create({
|
|
37
|
+
notice: {
|
|
38
|
+
display: 'grid',
|
|
39
|
+
gridTemplateColumns: 'auto minmax(0, 1fr) auto',
|
|
40
|
+
alignItems: 'start',
|
|
41
|
+
columnGap: '0.625rem',
|
|
42
|
+
paddingBlock: '0.625rem',
|
|
43
|
+
paddingInline: '0.75rem',
|
|
44
|
+
borderRadius: radius.lg,
|
|
45
|
+
fontSize: font.sizeMd,
|
|
46
|
+
lineHeight: font.leadingSnug
|
|
47
|
+
},
|
|
48
|
+
neutral: {
|
|
49
|
+
backgroundColor: colors.well,
|
|
50
|
+
boxShadow: `inset 0 0 0 1px ${colors.line}`,
|
|
51
|
+
color: colors.text
|
|
52
|
+
},
|
|
53
|
+
info: { backgroundColor: colors.ithilSoft, color: colors.text },
|
|
54
|
+
success: { backgroundColor: colors.successSoft, color: colors.successInk },
|
|
55
|
+
warning: { backgroundColor: colors.warningSoft, color: colors.warningInk },
|
|
56
|
+
danger: { backgroundColor: colors.dangerSoft, color: colors.dangerInk },
|
|
57
|
+
icon: { display: 'grid', placeItems: 'center', width: '1rem', height: '1lh' },
|
|
58
|
+
iconNeutral: { color: colors.textMuted },
|
|
59
|
+
iconInfo: { color: colors.ithil },
|
|
60
|
+
text: { display: 'flex', flexDirection: 'column', gap: '0.125rem', minWidth: 0 },
|
|
61
|
+
title: { fontWeight: font.weightMedium },
|
|
62
|
+
detail: { opacity: 0.85, fontSize: font.sizeSm, userSelect: 'text', overflowWrap: 'anywhere' },
|
|
63
|
+
actions: { display: 'flex', alignItems: 'center', gap: '0.25rem', marginBlock: '-0.25rem' }
|
|
64
|
+
});
|
|
65
|
+
</script>
|
|
66
|
+
|
|
67
|
+
<script lang="ts">
|
|
68
|
+
let {
|
|
69
|
+
tone = 'neutral',
|
|
70
|
+
detail,
|
|
71
|
+
busy = false,
|
|
72
|
+
icon,
|
|
73
|
+
actions,
|
|
74
|
+
live = false,
|
|
75
|
+
sx,
|
|
76
|
+
class: className,
|
|
77
|
+
children,
|
|
78
|
+
...rest
|
|
79
|
+
}: NoticeProps = $props();
|
|
80
|
+
</script>
|
|
81
|
+
|
|
82
|
+
<div
|
|
83
|
+
role={live ? (tone === 'danger' ? 'alert' : 'status') : undefined}
|
|
84
|
+
data-slot="notice"
|
|
85
|
+
data-tone={tone}
|
|
86
|
+
{...rest}
|
|
87
|
+
{...attrs([styles.notice, styles[tone], sx], className)}
|
|
88
|
+
>
|
|
89
|
+
<span
|
|
90
|
+
{...stylex.attrs(
|
|
91
|
+
styles.icon,
|
|
92
|
+
tone === 'neutral' && styles.iconNeutral,
|
|
93
|
+
tone === 'info' && styles.iconInfo
|
|
94
|
+
)}
|
|
95
|
+
>
|
|
96
|
+
{#if busy}
|
|
97
|
+
<Spinner size={14} label={null} />
|
|
98
|
+
{:else if icon}
|
|
99
|
+
{@render icon()}
|
|
100
|
+
{:else if tone === 'success'}
|
|
101
|
+
<Glyph name="check" stroke={1.75} />
|
|
102
|
+
{:else}
|
|
103
|
+
<Glyph name="alert" />
|
|
104
|
+
{/if}
|
|
105
|
+
</span>
|
|
106
|
+
<span {...stylex.attrs(styles.text)}>
|
|
107
|
+
<span {...stylex.attrs(styles.title)}>{@render children?.()}</span>
|
|
108
|
+
{#if detail}<span {...stylex.attrs(styles.detail)}>{detail}</span>{/if}
|
|
109
|
+
</span>
|
|
110
|
+
{#if actions}<span {...stylex.attrs(styles.actions)}>{@render actions()}</span>{/if}
|
|
111
|
+
</div>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
+
import { type Sx } from '../../internal/sx.js';
|
|
4
|
+
export type NoticeTone = 'neutral' | 'info' | 'success' | 'warning' | 'danger';
|
|
5
|
+
export type NoticeProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
|
|
6
|
+
tone?: NoticeTone;
|
|
7
|
+
/** A second line, such as the cause or the next step. Always visible. */
|
|
8
|
+
detail?: string;
|
|
9
|
+
/** Shows a spinner in place of the icon, for work under way. */
|
|
10
|
+
busy?: boolean;
|
|
11
|
+
/** An icon of your own, in place of the tone's. */
|
|
12
|
+
icon?: Snippet;
|
|
13
|
+
/** Buttons at the end, such as Retry. */
|
|
14
|
+
actions?: Snippet;
|
|
15
|
+
/**
|
|
16
|
+
* Announces the notice as it appears: at once for danger, politely for
|
|
17
|
+
* the rest. Leave it off for notes that are there from the start.
|
|
18
|
+
*/
|
|
19
|
+
live?: boolean;
|
|
20
|
+
sx?: Sx;
|
|
21
|
+
/** What the notice says. */
|
|
22
|
+
children?: Snippet;
|
|
23
|
+
};
|
|
24
|
+
declare const Notice: import("svelte").Component<NoticeProps, {}, "">;
|
|
25
|
+
type Notice = ReturnType<typeof Notice>;
|
|
26
|
+
export default Notice;
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
<!-- What the agent means to do, ticked off as it goes. Only the latest plan is shown. -->
|
|
2
|
+
<script lang="ts" module>
|
|
3
|
+
import * as stylex from '@stylexjs/stylex';
|
|
4
|
+
import Glyph from '../../internal/Glyph.svelte';
|
|
5
|
+
import { shared } from '../../internal/shared.js';
|
|
6
|
+
import { attrs, type Sx } from '../../internal/sx.js';
|
|
7
|
+
import { colors, font, motion, radius } from '../../tokens.stylex.js';
|
|
8
|
+
import Spinner from '../spinner/Spinner.svelte';
|
|
9
|
+
|
|
10
|
+
export type PlanStepStatus = 'pending' | 'active' | 'done' | 'skipped';
|
|
11
|
+
export type PlanStep = { label: string; status: PlanStepStatus };
|
|
12
|
+
|
|
13
|
+
export type PlanProps = {
|
|
14
|
+
steps: PlanStep[];
|
|
15
|
+
title?: string;
|
|
16
|
+
/** How the progress is said: "2 of 4". */
|
|
17
|
+
progressLabel?: (done: number, total: number) => string;
|
|
18
|
+
skippedLabel?: string;
|
|
19
|
+
sx?: Sx;
|
|
20
|
+
class?: string;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const MOTION = '@media (prefers-reduced-motion: no-preference)';
|
|
24
|
+
|
|
25
|
+
const styles = stylex.create({
|
|
26
|
+
plan: {
|
|
27
|
+
display: 'flex',
|
|
28
|
+
flexDirection: 'column',
|
|
29
|
+
gap: '0.625rem',
|
|
30
|
+
paddingTop: '0.75rem',
|
|
31
|
+
paddingBottom: '0.5rem',
|
|
32
|
+
paddingInline: '0.5rem',
|
|
33
|
+
borderRadius: radius.lg,
|
|
34
|
+
backgroundColor: colors.surface,
|
|
35
|
+
boxShadow: `inset 0 0 0 1px ${colors.line}, inset 0 1px 0 ${colors.highlight}, 0 1px 2px ${colors.shade}`
|
|
36
|
+
},
|
|
37
|
+
head: {
|
|
38
|
+
display: 'flex',
|
|
39
|
+
alignItems: 'baseline',
|
|
40
|
+
justifyContent: 'space-between',
|
|
41
|
+
gap: '0.75rem',
|
|
42
|
+
margin: 0,
|
|
43
|
+
paddingInline: '0.375rem'
|
|
44
|
+
},
|
|
45
|
+
title: {
|
|
46
|
+
color: colors.text,
|
|
47
|
+
fontSize: font.sizeSm,
|
|
48
|
+
fontWeight: font.weightSemibold
|
|
49
|
+
},
|
|
50
|
+
// One segment per step: lit as each is done, half-lit while one is under way
|
|
51
|
+
track: {
|
|
52
|
+
display: 'flex',
|
|
53
|
+
gap: '0.1875rem',
|
|
54
|
+
paddingInline: '0.375rem'
|
|
55
|
+
},
|
|
56
|
+
segment: {
|
|
57
|
+
flexGrow: 1,
|
|
58
|
+
height: '0.1875rem',
|
|
59
|
+
borderRadius: radius.full,
|
|
60
|
+
backgroundColor: colors.line,
|
|
61
|
+
transitionProperty: 'background-color, box-shadow',
|
|
62
|
+
transitionDuration: motion.slow,
|
|
63
|
+
transitionTimingFunction: 'ease'
|
|
64
|
+
},
|
|
65
|
+
segmentDone: { backgroundColor: colors.ithil, boxShadow: `0 0 6px ${colors.glow}` },
|
|
66
|
+
segmentActive: { backgroundColor: `color-mix(in oklab, ${colors.ithil} 40%, transparent)` },
|
|
67
|
+
steps: {
|
|
68
|
+
display: 'flex',
|
|
69
|
+
flexDirection: 'column',
|
|
70
|
+
gap: '0.0625rem',
|
|
71
|
+
margin: 0,
|
|
72
|
+
padding: 0,
|
|
73
|
+
listStyleType: 'none'
|
|
74
|
+
},
|
|
75
|
+
step: {
|
|
76
|
+
display: 'flex',
|
|
77
|
+
alignItems: 'center',
|
|
78
|
+
gap: '0.625rem',
|
|
79
|
+
minHeight: '1.875rem',
|
|
80
|
+
paddingInline: '0.375rem',
|
|
81
|
+
borderRadius: radius.md,
|
|
82
|
+
color: colors.textMuted,
|
|
83
|
+
fontSize: font.sizeMd,
|
|
84
|
+
lineHeight: font.leadingSnug,
|
|
85
|
+
transitionProperty: 'color, background-color',
|
|
86
|
+
transitionDuration: motion.base,
|
|
87
|
+
transitionTimingFunction: 'ease'
|
|
88
|
+
},
|
|
89
|
+
// The step under way sits in a band of moonlight
|
|
90
|
+
active: {
|
|
91
|
+
backgroundColor: colors.ithilSoft,
|
|
92
|
+
color: colors.text,
|
|
93
|
+
fontWeight: font.weightMedium
|
|
94
|
+
},
|
|
95
|
+
done: { color: colors.textSubtle },
|
|
96
|
+
// A step's new state settles into place, so the change is noticed
|
|
97
|
+
icon: {
|
|
98
|
+
display: 'grid',
|
|
99
|
+
placeItems: 'center',
|
|
100
|
+
flexShrink: 0,
|
|
101
|
+
boxSizing: 'border-box',
|
|
102
|
+
width: '1rem',
|
|
103
|
+
height: '1rem',
|
|
104
|
+
borderRadius: radius.full,
|
|
105
|
+
color: colors.textSubtle,
|
|
106
|
+
opacity: { default: 1, '@starting-style': 0 },
|
|
107
|
+
scale: { default: null, [MOTION]: { default: 1, '@starting-style': 0.6 } },
|
|
108
|
+
transitionProperty: { default: 'opacity', [MOTION]: 'opacity, scale' },
|
|
109
|
+
transitionDuration: motion.slow,
|
|
110
|
+
transitionTimingFunction: motion.easeOut
|
|
111
|
+
},
|
|
112
|
+
iconActive: { color: colors.ithil },
|
|
113
|
+
// Done: a solid green seal with the tick cut out of it
|
|
114
|
+
iconDone: { backgroundColor: colors.success, color: colors.bgRaised },
|
|
115
|
+
iconSkipped: { boxShadow: `inset 0 0 0 1px ${colors.lineStrong}` },
|
|
116
|
+
skipped: { color: colors.textSubtle, fontSize: font.sizeSm, fontWeight: font.weightRegular },
|
|
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
|
+
steps,
|
|
131
|
+
title = 'Plan',
|
|
132
|
+
progressLabel = (done, total) => `${done} of ${total}`,
|
|
133
|
+
skippedLabel = 'skipped',
|
|
134
|
+
sx,
|
|
135
|
+
class: className
|
|
136
|
+
}: PlanProps = $props();
|
|
137
|
+
|
|
138
|
+
const uid = $props.id();
|
|
139
|
+
const done = $derived(steps.filter((step) => step.status === 'done').length);
|
|
140
|
+
</script>
|
|
141
|
+
|
|
142
|
+
<section aria-labelledby="{uid}-title" data-slot="plan" {...attrs([styles.plan, sx], className)}>
|
|
143
|
+
<p {...stylex.attrs(styles.head)}>
|
|
144
|
+
<span id="{uid}-title" {...stylex.attrs(styles.title)}>{title}</span>
|
|
145
|
+
<span {...stylex.attrs(shared.eyebrow)}>{progressLabel(done, steps.length)}</span>
|
|
146
|
+
</p>
|
|
147
|
+
<div aria-hidden="true" {...stylex.attrs(styles.track)}>
|
|
148
|
+
{#each steps as step, index (index)}
|
|
149
|
+
<span
|
|
150
|
+
{...stylex.attrs(
|
|
151
|
+
styles.segment,
|
|
152
|
+
step.status === 'done' && styles.segmentDone,
|
|
153
|
+
step.status === 'active' && styles.segmentActive
|
|
154
|
+
)}
|
|
155
|
+
></span>
|
|
156
|
+
{/each}
|
|
157
|
+
</div>
|
|
158
|
+
<ol {...stylex.attrs(styles.steps)}>
|
|
159
|
+
{#each steps as step, index (index)}
|
|
160
|
+
<li
|
|
161
|
+
aria-current={step.status === 'active' ? 'step' : undefined}
|
|
162
|
+
{...stylex.attrs(
|
|
163
|
+
styles.step,
|
|
164
|
+
step.status === 'active' && styles.active,
|
|
165
|
+
step.status === 'done' && styles.done
|
|
166
|
+
)}
|
|
167
|
+
>
|
|
168
|
+
{#key step.status}
|
|
169
|
+
<span
|
|
170
|
+
{...stylex.attrs(
|
|
171
|
+
styles.icon,
|
|
172
|
+
step.status === 'active' && styles.iconActive,
|
|
173
|
+
step.status === 'done' && styles.iconDone,
|
|
174
|
+
step.status === 'skipped' && styles.iconSkipped
|
|
175
|
+
)}
|
|
176
|
+
>
|
|
177
|
+
{#if step.status === 'active'}
|
|
178
|
+
<Spinner size={14} label={null} />
|
|
179
|
+
{:else if step.status === 'done'}
|
|
180
|
+
<Glyph name="check" size={11} stroke={2.25} />
|
|
181
|
+
{:else if step.status === 'skipped'}
|
|
182
|
+
<Glyph name="minus" size={10} stroke={1.75} />
|
|
183
|
+
{:else}
|
|
184
|
+
<Glyph name="dashed" size={16} stroke={1.25} />
|
|
185
|
+
{/if}
|
|
186
|
+
</span>
|
|
187
|
+
{/key}
|
|
188
|
+
<span>
|
|
189
|
+
{step.label}{#if step.status === 'skipped'}<span {...stylex.attrs(styles.skipped)}>
|
|
190
|
+
· {skippedLabel}</span
|
|
191
|
+
>{:else if step.status === 'done'}<span {...stylex.attrs(styles.hidden)}>
|
|
192
|
+
(done)</span
|
|
193
|
+
>{/if}
|
|
194
|
+
</span>
|
|
195
|
+
</li>
|
|
196
|
+
{/each}
|
|
197
|
+
</ol>
|
|
198
|
+
</section>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type Sx } from '../../internal/sx.js';
|
|
2
|
+
export type PlanStepStatus = 'pending' | 'active' | 'done' | 'skipped';
|
|
3
|
+
export type PlanStep = {
|
|
4
|
+
label: string;
|
|
5
|
+
status: PlanStepStatus;
|
|
6
|
+
};
|
|
7
|
+
export type PlanProps = {
|
|
8
|
+
steps: PlanStep[];
|
|
9
|
+
title?: string;
|
|
10
|
+
/** How the progress is said: "2 of 4". */
|
|
11
|
+
progressLabel?: (done: number, total: number) => string;
|
|
12
|
+
skippedLabel?: string;
|
|
13
|
+
sx?: Sx;
|
|
14
|
+
class?: string;
|
|
15
|
+
};
|
|
16
|
+
declare const Plan: import("svelte").Component<PlanProps, {}, "">;
|
|
17
|
+
type Plan = ReturnType<typeof Plan>;
|
|
18
|
+
export default Plan;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import { Popover } from 'bits-ui';
|
|
3
|
+
import * as stylex from '@stylexjs/stylex';
|
|
4
|
+
import type { Snippet } from 'svelte';
|
|
5
|
+
import { layer } from '../../internal/layer.js';
|
|
6
|
+
import { attrs, type Sx } from '../../internal/sx.js';
|
|
7
|
+
|
|
8
|
+
export type PopoverContentProps = Omit<Popover.ContentProps, 'children' | 'child'> & {
|
|
9
|
+
sx?: Sx;
|
|
10
|
+
children?: Snippet;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const styles = stylex.create({
|
|
14
|
+
// Room for content of its own, rather than a list of items
|
|
15
|
+
padded: { padding: '0.75rem', minWidth: 'max(16rem, var(--bits-floating-anchor-width, 0px))' }
|
|
16
|
+
});
|
|
17
|
+
</script>
|
|
18
|
+
|
|
19
|
+
<script lang="ts">
|
|
20
|
+
let {
|
|
21
|
+
sideOffset = 6,
|
|
22
|
+
collisionPadding = 8,
|
|
23
|
+
align = 'start',
|
|
24
|
+
sx,
|
|
25
|
+
class: className,
|
|
26
|
+
children,
|
|
27
|
+
...rest
|
|
28
|
+
}: PopoverContentProps = $props();
|
|
29
|
+
</script>
|
|
30
|
+
|
|
31
|
+
<Popover.Portal>
|
|
32
|
+
<Popover.Content
|
|
33
|
+
{sideOffset}
|
|
34
|
+
{collisionPadding}
|
|
35
|
+
{align}
|
|
36
|
+
data-slot="popover-content"
|
|
37
|
+
{...rest}
|
|
38
|
+
{...attrs([layer.surface, styles.padded, sx], className)}
|
|
39
|
+
>
|
|
40
|
+
{@render children?.()}
|
|
41
|
+
</Popover.Content>
|
|
42
|
+
</Popover.Portal>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Popover } from 'bits-ui';
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import { type Sx } from '../../internal/sx.js';
|
|
4
|
+
export type PopoverContentProps = Omit<Popover.ContentProps, 'children' | 'child'> & {
|
|
5
|
+
sx?: Sx;
|
|
6
|
+
children?: Snippet;
|
|
7
|
+
};
|
|
8
|
+
declare const PopoverContent: import("svelte").Component<PopoverContentProps, {}, "">;
|
|
9
|
+
type PopoverContent = ReturnType<typeof PopoverContent>;
|
|
10
|
+
export default PopoverContent;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Popover } from 'bits-ui';
|
|
2
|
+
import Content from './PopoverContent.svelte';
|
|
3
|
+
declare const Root: import("svelte").Component<import("bits-ui").PopoverRootPropsWithoutHTML, {}, "open">;
|
|
4
|
+
declare const Trigger: import("svelte").Component<Popover.TriggerProps, {}, "ref">;
|
|
5
|
+
declare const Close: import("svelte").Component<Popover.CloseProps, {}, "ref">;
|
|
6
|
+
export { Root, Trigger, Content, Close };
|
|
7
|
+
export type { PopoverContentProps } from './PopoverContent.svelte';
|