@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,88 @@
|
|
|
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 { attrs, type Sx } from '../../internal/sx.js';
|
|
6
|
+
import { colors, font } from '../../tokens.stylex.js';
|
|
7
|
+
|
|
8
|
+
export type TextSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
9
|
+
export type TextTone = 'default' | 'muted' | 'subtle' | 'accent' | 'danger' | 'success';
|
|
10
|
+
export type TextWeight = 'regular' | 'medium' | 'semibold';
|
|
11
|
+
|
|
12
|
+
export type TextProps = Omit<HTMLAttributes<HTMLElement>, 'children'> & {
|
|
13
|
+
/** Element to render. */
|
|
14
|
+
as?: 'p' | 'span' | 'div' | 'label' | 'strong' | 'em' | 'small';
|
|
15
|
+
size?: TextSize;
|
|
16
|
+
tone?: TextTone;
|
|
17
|
+
weight?: TextWeight;
|
|
18
|
+
/** Cuts the text off with an ellipsis on one line. */
|
|
19
|
+
truncate?: boolean;
|
|
20
|
+
sx?: Sx;
|
|
21
|
+
children?: Snippet;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const styles = stylex.create({
|
|
25
|
+
base: {
|
|
26
|
+
margin: 0,
|
|
27
|
+
fontFamily: font.body,
|
|
28
|
+
fontStyle: 'normal',
|
|
29
|
+
lineHeight: font.leadingNormal,
|
|
30
|
+
textWrap: 'pretty'
|
|
31
|
+
},
|
|
32
|
+
truncate: {
|
|
33
|
+
display: 'block',
|
|
34
|
+
minWidth: 0,
|
|
35
|
+
overflow: 'hidden',
|
|
36
|
+
textOverflow: 'ellipsis',
|
|
37
|
+
whiteSpace: 'nowrap'
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
const sizes = stylex.create({
|
|
42
|
+
xs: { fontSize: font.sizeXs },
|
|
43
|
+
sm: { fontSize: font.sizeSm },
|
|
44
|
+
md: { fontSize: font.sizeMd },
|
|
45
|
+
lg: { fontSize: font.sizeLg },
|
|
46
|
+
xl: { fontSize: font.sizeXl }
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
const tones = stylex.create({
|
|
50
|
+
default: { color: colors.text },
|
|
51
|
+
muted: { color: colors.textMuted },
|
|
52
|
+
subtle: { color: colors.textSubtle },
|
|
53
|
+
accent: { color: colors.ithil },
|
|
54
|
+
danger: { color: colors.danger },
|
|
55
|
+
success: { color: colors.success }
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
const weights = stylex.create({
|
|
59
|
+
regular: { fontWeight: font.weightRegular },
|
|
60
|
+
medium: { fontWeight: font.weightMedium },
|
|
61
|
+
semibold: { fontWeight: font.weightSemibold }
|
|
62
|
+
});
|
|
63
|
+
</script>
|
|
64
|
+
|
|
65
|
+
<script lang="ts">
|
|
66
|
+
let {
|
|
67
|
+
as = 'p',
|
|
68
|
+
size = 'md',
|
|
69
|
+
tone = 'default',
|
|
70
|
+
weight = 'regular',
|
|
71
|
+
truncate = false,
|
|
72
|
+
sx,
|
|
73
|
+
class: className,
|
|
74
|
+
children,
|
|
75
|
+
...rest
|
|
76
|
+
}: TextProps = $props();
|
|
77
|
+
</script>
|
|
78
|
+
|
|
79
|
+
<svelte:element
|
|
80
|
+
this={as}
|
|
81
|
+
{...rest}
|
|
82
|
+
{...attrs(
|
|
83
|
+
[styles.base, sizes[size], tones[tone], weights[weight], truncate && styles.truncate, sx],
|
|
84
|
+
className
|
|
85
|
+
)}
|
|
86
|
+
>
|
|
87
|
+
{@render children?.()}
|
|
88
|
+
</svelte:element>
|
|
@@ -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
|
+
export type TextSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
5
|
+
export type TextTone = 'default' | 'muted' | 'subtle' | 'accent' | 'danger' | 'success';
|
|
6
|
+
export type TextWeight = 'regular' | 'medium' | 'semibold';
|
|
7
|
+
export type TextProps = Omit<HTMLAttributes<HTMLElement>, 'children'> & {
|
|
8
|
+
/** Element to render. */
|
|
9
|
+
as?: 'p' | 'span' | 'div' | 'label' | 'strong' | 'em' | 'small';
|
|
10
|
+
size?: TextSize;
|
|
11
|
+
tone?: TextTone;
|
|
12
|
+
weight?: TextWeight;
|
|
13
|
+
/** Cuts the text off with an ellipsis on one line. */
|
|
14
|
+
truncate?: boolean;
|
|
15
|
+
sx?: Sx;
|
|
16
|
+
children?: Snippet;
|
|
17
|
+
};
|
|
18
|
+
declare const Text: import("svelte").Component<TextProps, {}, "">;
|
|
19
|
+
type Text = ReturnType<typeof Text>;
|
|
20
|
+
export default Text;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import * as stylex from '@stylexjs/stylex';
|
|
3
|
+
import type { HTMLTextareaAttributes } from 'svelte/elements';
|
|
4
|
+
import { control } from '../../internal/control.js';
|
|
5
|
+
import { attrs, type Sx } from '../../internal/sx.js';
|
|
6
|
+
import { getFieldContext } from '../field/context.js';
|
|
7
|
+
|
|
8
|
+
export type TextareaProps = HTMLTextareaAttributes & {
|
|
9
|
+
/** Marks the textarea as invalid. Inherited from a surrounding Field with an `error`. */
|
|
10
|
+
invalid?: boolean;
|
|
11
|
+
/** Grows with its content instead of scrolling, in browsers that support `field-sizing`. */
|
|
12
|
+
autosize?: boolean;
|
|
13
|
+
sx?: Sx;
|
|
14
|
+
ref?: HTMLTextAreaElement | null;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const styles = stylex.create({
|
|
18
|
+
base: {
|
|
19
|
+
minHeight: '5rem',
|
|
20
|
+
paddingBlock: '0.5rem',
|
|
21
|
+
paddingInline: '0.625rem',
|
|
22
|
+
resize: 'vertical'
|
|
23
|
+
},
|
|
24
|
+
autosize: {
|
|
25
|
+
fieldSizing: 'content',
|
|
26
|
+
resize: 'none'
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
</script>
|
|
30
|
+
|
|
31
|
+
<script lang="ts">
|
|
32
|
+
let {
|
|
33
|
+
value = $bindable(),
|
|
34
|
+
invalid,
|
|
35
|
+
autosize = false,
|
|
36
|
+
disabled,
|
|
37
|
+
required,
|
|
38
|
+
id,
|
|
39
|
+
rows = 3,
|
|
40
|
+
'aria-describedby': describedBy,
|
|
41
|
+
sx,
|
|
42
|
+
class: className,
|
|
43
|
+
ref = $bindable(null),
|
|
44
|
+
...rest
|
|
45
|
+
}: TextareaProps = $props();
|
|
46
|
+
|
|
47
|
+
const field = getFieldContext();
|
|
48
|
+
const isInvalid = $derived(invalid ?? field?.invalid ?? false);
|
|
49
|
+
</script>
|
|
50
|
+
|
|
51
|
+
<textarea
|
|
52
|
+
bind:this={ref}
|
|
53
|
+
bind:value
|
|
54
|
+
{rows}
|
|
55
|
+
id={id ?? field?.id}
|
|
56
|
+
disabled={disabled ?? field?.disabled}
|
|
57
|
+
required={required ?? field?.required}
|
|
58
|
+
aria-invalid={isInvalid ? true : undefined}
|
|
59
|
+
aria-describedby={describedBy ?? field?.describedBy}
|
|
60
|
+
{...rest}
|
|
61
|
+
{...attrs(
|
|
62
|
+
[control.base, styles.base, autosize && styles.autosize, isInvalid && control.invalid, sx],
|
|
63
|
+
className
|
|
64
|
+
)}></textarea>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { HTMLTextareaAttributes } from 'svelte/elements';
|
|
2
|
+
import { type Sx } from '../../internal/sx.js';
|
|
3
|
+
export type TextareaProps = HTMLTextareaAttributes & {
|
|
4
|
+
/** Marks the textarea as invalid. Inherited from a surrounding Field with an `error`. */
|
|
5
|
+
invalid?: boolean;
|
|
6
|
+
/** Grows with its content instead of scrolling, in browsers that support `field-sizing`. */
|
|
7
|
+
autosize?: boolean;
|
|
8
|
+
sx?: Sx;
|
|
9
|
+
ref?: HTMLTextAreaElement | null;
|
|
10
|
+
};
|
|
11
|
+
declare const Textarea: import("svelte").Component<TextareaProps, {}, "value" | "ref">;
|
|
12
|
+
type Textarea = ReturnType<typeof Textarea>;
|
|
13
|
+
export default Textarea;
|
|
@@ -0,0 +1,49 @@
|
|
|
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 { attrs, type Sx } from '../../internal/sx.js';
|
|
6
|
+
import { colors } from '../../tokens.stylex.js';
|
|
7
|
+
|
|
8
|
+
export type ThemeScheme = 'light' | 'dark' | 'system';
|
|
9
|
+
|
|
10
|
+
/** The result of `stylex.createTheme`, for any token group. */
|
|
11
|
+
export type ThemeOverrides = Readonly<{ theme: string }>;
|
|
12
|
+
|
|
13
|
+
export type ThemeProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
|
|
14
|
+
/**
|
|
15
|
+
* Colour scheme for everything inside. `system` follows the user's OS setting.
|
|
16
|
+
* Leave it out to keep whatever scheme the surrounding page uses.
|
|
17
|
+
*/
|
|
18
|
+
scheme?: ThemeScheme;
|
|
19
|
+
/**
|
|
20
|
+
* One or more themes from `stylex.createTheme`. Their token overrides apply
|
|
21
|
+
* to everything inside.
|
|
22
|
+
*/
|
|
23
|
+
theme?: ThemeOverrides | ReadonlyArray<ThemeOverrides>;
|
|
24
|
+
sx?: Sx;
|
|
25
|
+
children?: Snippet;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const styles = stylex.create({
|
|
29
|
+
// `display: contents` keeps the wrapper out of layout, while the inherited
|
|
30
|
+
// `color-scheme` and `color` still reach its children.
|
|
31
|
+
base: {
|
|
32
|
+
display: 'contents',
|
|
33
|
+
color: colors.text
|
|
34
|
+
},
|
|
35
|
+
light: { colorScheme: 'light' },
|
|
36
|
+
dark: { colorScheme: 'dark' },
|
|
37
|
+
system: { colorScheme: 'light dark' }
|
|
38
|
+
});
|
|
39
|
+
</script>
|
|
40
|
+
|
|
41
|
+
<script lang="ts">
|
|
42
|
+
let { scheme, theme, sx, class: className, children, ...rest }: ThemeProps = $props();
|
|
43
|
+
|
|
44
|
+
const themes = $derived(theme === undefined ? [] : Array.isArray(theme) ? theme : [theme]);
|
|
45
|
+
</script>
|
|
46
|
+
|
|
47
|
+
<div {...rest} {...attrs([styles.base, scheme && styles[scheme], ...themes, sx], className)}>
|
|
48
|
+
{@render children?.()}
|
|
49
|
+
</div>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
+
import { type Sx } from '../../internal/sx.js';
|
|
4
|
+
export type ThemeScheme = 'light' | 'dark' | 'system';
|
|
5
|
+
/** The result of `stylex.createTheme`, for any token group. */
|
|
6
|
+
export type ThemeOverrides = Readonly<{
|
|
7
|
+
theme: string;
|
|
8
|
+
}>;
|
|
9
|
+
export type ThemeProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
|
|
10
|
+
/**
|
|
11
|
+
* Colour scheme for everything inside. `system` follows the user's OS setting.
|
|
12
|
+
* Leave it out to keep whatever scheme the surrounding page uses.
|
|
13
|
+
*/
|
|
14
|
+
scheme?: ThemeScheme;
|
|
15
|
+
/**
|
|
16
|
+
* One or more themes from `stylex.createTheme`. Their token overrides apply
|
|
17
|
+
* to everything inside.
|
|
18
|
+
*/
|
|
19
|
+
theme?: ThemeOverrides | ReadonlyArray<ThemeOverrides>;
|
|
20
|
+
sx?: Sx;
|
|
21
|
+
children?: Snippet;
|
|
22
|
+
};
|
|
23
|
+
declare const Theme: import("svelte").Component<ThemeProps, {}, "">;
|
|
24
|
+
type Theme = ReturnType<typeof Theme>;
|
|
25
|
+
export default Theme;
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Where toasts appear. Place one near the root of the app.
|
|
3
|
+
|
|
4
|
+
It sits in the top layer, so toasts stay above dialogs and can still be
|
|
5
|
+
clicked while one is open. Each toast waits while the pointer or focus is on
|
|
6
|
+
the stack, and while the window is hidden, so none goes unread.
|
|
7
|
+
-->
|
|
8
|
+
<script lang="ts" module>
|
|
9
|
+
import * as stylex from '@stylexjs/stylex';
|
|
10
|
+
import { colors, font, motion, radius, space } from '../../tokens.stylex.js';
|
|
11
|
+
import Glyph from '../../internal/Glyph.svelte';
|
|
12
|
+
import Button from '../button/Button.svelte';
|
|
13
|
+
import Spinner from '../spinner/Spinner.svelte';
|
|
14
|
+
import { toast, toasts, type ToastEntry } from './toasts.svelte.js';
|
|
15
|
+
|
|
16
|
+
export type ToasterProps = {
|
|
17
|
+
/** Distance from the top of the window, to clear an app's own header. */
|
|
18
|
+
offset?: string;
|
|
19
|
+
/** Accessible name of the region. */
|
|
20
|
+
label?: string;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const MOTION = '@media (prefers-reduced-motion: no-preference)';
|
|
24
|
+
|
|
25
|
+
const styles = stylex.create({
|
|
26
|
+
// The top layer brings the browser's popover styles; these undo them
|
|
27
|
+
region: {
|
|
28
|
+
position: 'fixed',
|
|
29
|
+
inset: 'auto',
|
|
30
|
+
top: 'var(--narvi-toaster-offset)',
|
|
31
|
+
insetInlineEnd: space.x4,
|
|
32
|
+
display: 'flex',
|
|
33
|
+
flexDirection: 'column',
|
|
34
|
+
gap: space.x2,
|
|
35
|
+
width: 'min(22rem, calc(100vw - 2rem))',
|
|
36
|
+
height: 'auto',
|
|
37
|
+
margin: 0,
|
|
38
|
+
padding: 0,
|
|
39
|
+
overflow: 'visible',
|
|
40
|
+
borderWidth: 0,
|
|
41
|
+
backgroundColor: 'transparent',
|
|
42
|
+
pointerEvents: 'none'
|
|
43
|
+
},
|
|
44
|
+
toast: {
|
|
45
|
+
display: 'grid',
|
|
46
|
+
gridTemplateColumns: 'auto minmax(0, 1fr) auto',
|
|
47
|
+
alignItems: 'start',
|
|
48
|
+
gap: '0.625rem',
|
|
49
|
+
paddingBlock: '0.75rem',
|
|
50
|
+
paddingInlineStart: '0.875rem',
|
|
51
|
+
paddingInlineEnd: '0.5rem',
|
|
52
|
+
borderRadius: radius.xl,
|
|
53
|
+
backgroundColor: colors.bgRaised,
|
|
54
|
+
boxShadow: `inset 0 0 0 1px ${colors.lineStrong}, inset 0 1px 0 ${colors.highlight}, 0 2px 4px ${colors.shade}, 0 16px 40px -12px ${colors.shade}`,
|
|
55
|
+
color: colors.text,
|
|
56
|
+
fontFamily: font.body,
|
|
57
|
+
fontSize: font.sizeMd,
|
|
58
|
+
lineHeight: font.leadingSnug,
|
|
59
|
+
pointerEvents: 'auto',
|
|
60
|
+
opacity: { default: 1, '@starting-style': 0 },
|
|
61
|
+
translate: { default: null, [MOTION]: { default: '0 0', '@starting-style': '0 -0.5rem' } },
|
|
62
|
+
transitionProperty: { default: 'opacity', [MOTION]: 'opacity, translate' },
|
|
63
|
+
transitionDuration: motion.slow,
|
|
64
|
+
transitionTimingFunction: motion.easeOut
|
|
65
|
+
},
|
|
66
|
+
leaving: {
|
|
67
|
+
opacity: 0,
|
|
68
|
+
translate: { default: null, [MOTION]: '0.5rem 0' },
|
|
69
|
+
transitionDuration: motion.fast
|
|
70
|
+
},
|
|
71
|
+
icon: { display: 'grid', placeItems: 'center', width: '1rem', height: '1.25rem' },
|
|
72
|
+
dot: {
|
|
73
|
+
width: '0.375rem',
|
|
74
|
+
height: '0.375rem',
|
|
75
|
+
borderRadius: '9999px',
|
|
76
|
+
backgroundColor: colors.ithil
|
|
77
|
+
},
|
|
78
|
+
success: { color: colors.success },
|
|
79
|
+
error: { color: colors.danger },
|
|
80
|
+
muted: { color: colors.textMuted },
|
|
81
|
+
text: {
|
|
82
|
+
display: 'flex',
|
|
83
|
+
flexDirection: 'column',
|
|
84
|
+
gap: '0.125rem',
|
|
85
|
+
minWidth: 0,
|
|
86
|
+
paddingTop: '1px'
|
|
87
|
+
},
|
|
88
|
+
title: { fontWeight: font.weightMedium },
|
|
89
|
+
// What went wrong can be selected and copied
|
|
90
|
+
description: {
|
|
91
|
+
color: colors.textMuted,
|
|
92
|
+
fontSize: font.sizeSm,
|
|
93
|
+
userSelect: 'text',
|
|
94
|
+
overflowWrap: 'anywhere'
|
|
95
|
+
},
|
|
96
|
+
actions: { display: 'flex', alignItems: 'center', gap: '0.25rem', marginTop: '-0.25rem' }
|
|
97
|
+
});
|
|
98
|
+
</script>
|
|
99
|
+
|
|
100
|
+
<script lang="ts">
|
|
101
|
+
let { offset = '1rem', label = 'Notifications' }: ToasterProps = $props();
|
|
102
|
+
|
|
103
|
+
let region = $state<HTMLElement | null>(null);
|
|
104
|
+
let held = $state(false);
|
|
105
|
+
let hidden = $state(false);
|
|
106
|
+
// Toasts on their way out, kept a moment so they can fade
|
|
107
|
+
let leaving = $state<number[]>([]);
|
|
108
|
+
|
|
109
|
+
$effect(() => {
|
|
110
|
+
region?.showPopover?.();
|
|
111
|
+
const visibility = () => (hidden = document.hidden);
|
|
112
|
+
document.addEventListener('visibilitychange', visibility);
|
|
113
|
+
return () => document.removeEventListener('visibilitychange', visibility);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
function close(entry: ToastEntry) {
|
|
117
|
+
if (leaving.includes(entry.id)) return;
|
|
118
|
+
leaving = [...leaving, entry.id];
|
|
119
|
+
setTimeout(() => {
|
|
120
|
+
toast.dismiss(entry.id);
|
|
121
|
+
leaving = leaving.filter((id) => id !== entry.id);
|
|
122
|
+
}, 140);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Each toast's own timer, which runs only while nothing holds the stack
|
|
126
|
+
function timed(element: HTMLElement, entry: ToastEntry) {
|
|
127
|
+
let remaining = entry.duration ?? Infinity;
|
|
128
|
+
let started = 0;
|
|
129
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
130
|
+
const run = () => {
|
|
131
|
+
if (!Number.isFinite(remaining)) return;
|
|
132
|
+
started = performance.now();
|
|
133
|
+
timer = setTimeout(() => close(entry), remaining);
|
|
134
|
+
};
|
|
135
|
+
const pause = () => {
|
|
136
|
+
if (timer === undefined) return;
|
|
137
|
+
clearTimeout(timer);
|
|
138
|
+
timer = undefined;
|
|
139
|
+
remaining -= performance.now() - started;
|
|
140
|
+
};
|
|
141
|
+
return { run, pause, stop: () => clearTimeout(timer), element };
|
|
142
|
+
}
|
|
143
|
+
</script>
|
|
144
|
+
|
|
145
|
+
<section
|
|
146
|
+
bind:this={region}
|
|
147
|
+
popover="manual"
|
|
148
|
+
aria-label={label}
|
|
149
|
+
data-slot="toaster"
|
|
150
|
+
style:--narvi-toaster-offset={offset}
|
|
151
|
+
{...stylex.attrs(styles.region)}
|
|
152
|
+
onpointerenter={() => (held = true)}
|
|
153
|
+
onpointerleave={() => (held = false)}
|
|
154
|
+
onfocusin={() => (held = true)}
|
|
155
|
+
onfocusout={(event) => {
|
|
156
|
+
if (!region?.contains(event.relatedTarget as Node | null)) held = false;
|
|
157
|
+
}}
|
|
158
|
+
>
|
|
159
|
+
{#each toasts.list as entry (entry.id)}
|
|
160
|
+
{@const clock = timed(region!, entry)}
|
|
161
|
+
<div
|
|
162
|
+
role={entry.tone === 'error' ? 'alert' : 'status'}
|
|
163
|
+
data-tone={entry.tone}
|
|
164
|
+
{...stylex.attrs(styles.toast, leaving.includes(entry.id) && styles.leaving)}
|
|
165
|
+
{@attach () => {
|
|
166
|
+
// Restarts when the toast changes, as a loading toast turns into a result
|
|
167
|
+
void entry.duration;
|
|
168
|
+
if (!held && !hidden) clock.run();
|
|
169
|
+
return () => clock.pause();
|
|
170
|
+
}}
|
|
171
|
+
>
|
|
172
|
+
<span
|
|
173
|
+
{...stylex.attrs(
|
|
174
|
+
styles.icon,
|
|
175
|
+
entry.tone === 'success' && styles.success,
|
|
176
|
+
entry.tone === 'error' && styles.error,
|
|
177
|
+
(entry.tone === 'default' || entry.tone === 'loading') && styles.muted
|
|
178
|
+
)}
|
|
179
|
+
>
|
|
180
|
+
{#if entry.tone === 'loading'}
|
|
181
|
+
<Spinner size={14} label={null} />
|
|
182
|
+
{:else if entry.tone === 'success'}
|
|
183
|
+
<Glyph name="check" stroke={1.75} />
|
|
184
|
+
{:else if entry.tone === 'error'}
|
|
185
|
+
<Glyph name="alert" />
|
|
186
|
+
{:else}
|
|
187
|
+
<span {...stylex.attrs(styles.dot)}></span>
|
|
188
|
+
{/if}
|
|
189
|
+
</span>
|
|
190
|
+
<span {...stylex.attrs(styles.text)}>
|
|
191
|
+
<span {...stylex.attrs(styles.title)}>{entry.title}</span>
|
|
192
|
+
{#if entry.description}
|
|
193
|
+
<span {...stylex.attrs(styles.description)}>{entry.description}</span>
|
|
194
|
+
{/if}
|
|
195
|
+
</span>
|
|
196
|
+
<span {...stylex.attrs(styles.actions)}>
|
|
197
|
+
{#if entry.action}
|
|
198
|
+
<Button
|
|
199
|
+
size="sm"
|
|
200
|
+
variant="secondary"
|
|
201
|
+
onclick={() => {
|
|
202
|
+
entry.action?.onclick();
|
|
203
|
+
close(entry);
|
|
204
|
+
}}
|
|
205
|
+
>
|
|
206
|
+
{entry.action.label}
|
|
207
|
+
</Button>
|
|
208
|
+
{/if}
|
|
209
|
+
{#if entry.tone !== 'loading'}
|
|
210
|
+
<Button
|
|
211
|
+
size="sm"
|
|
212
|
+
variant="ghost"
|
|
213
|
+
iconOnly
|
|
214
|
+
aria-label="Dismiss"
|
|
215
|
+
onclick={() => close(entry)}
|
|
216
|
+
>
|
|
217
|
+
<Glyph name="close" size={14} />
|
|
218
|
+
</Button>
|
|
219
|
+
{/if}
|
|
220
|
+
</span>
|
|
221
|
+
</div>
|
|
222
|
+
{/each}
|
|
223
|
+
</section>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type ToasterProps = {
|
|
2
|
+
/** Distance from the top of the window, to clear an app's own header. */
|
|
3
|
+
offset?: string;
|
|
4
|
+
/** Accessible name of the region. */
|
|
5
|
+
label?: string;
|
|
6
|
+
};
|
|
7
|
+
declare const Toaster: import("svelte").Component<ToasterProps, {}, "">;
|
|
8
|
+
type Toaster = ReturnType<typeof Toaster>;
|
|
9
|
+
export default Toaster;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Toasts: short notes about something that happened away from where the person
|
|
3
|
+
* is looking. Call `toast()` from anywhere; one <Toaster /> shows them.
|
|
4
|
+
*/
|
|
5
|
+
export type ToastTone = 'default' | 'success' | 'error' | 'loading';
|
|
6
|
+
export type ToastAction = {
|
|
7
|
+
label: string;
|
|
8
|
+
onclick: () => void;
|
|
9
|
+
};
|
|
10
|
+
export type ToastOptions = {
|
|
11
|
+
description?: string;
|
|
12
|
+
tone?: ToastTone;
|
|
13
|
+
/** A button in the toast, such as Undo or Retry. */
|
|
14
|
+
action?: ToastAction;
|
|
15
|
+
/** Milliseconds before it goes. `null` keeps it until dismissed. */
|
|
16
|
+
duration?: number | null;
|
|
17
|
+
};
|
|
18
|
+
export type ToastEntry = Required<Pick<ToastOptions, 'tone'>> & Omit<ToastOptions, 'tone'> & {
|
|
19
|
+
id: number;
|
|
20
|
+
title: string;
|
|
21
|
+
duration: number | null;
|
|
22
|
+
};
|
|
23
|
+
declare class Toasts {
|
|
24
|
+
list: ToastEntry[];
|
|
25
|
+
}
|
|
26
|
+
export declare const toasts: Toasts;
|
|
27
|
+
declare function show(title: string, options?: ToastOptions): number;
|
|
28
|
+
declare function update(id: number, patch: ToastOptions & {
|
|
29
|
+
title?: string;
|
|
30
|
+
}): void;
|
|
31
|
+
declare function dismiss(id?: number): void;
|
|
32
|
+
type Message<T> = string | ((value: T) => string);
|
|
33
|
+
/**
|
|
34
|
+
* Shows a toast and returns its id.
|
|
35
|
+
*
|
|
36
|
+
* ```ts
|
|
37
|
+
* toast('Copied');
|
|
38
|
+
* toast.error("Couldn't push the branch", { description: reason, action: { label: 'Retry', onclick: push } });
|
|
39
|
+
* toast.promise(save(), { loading: 'Saving…', success: 'Saved', error: (e) => `Couldn't save: ${e}` });
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare const toast: typeof show & {
|
|
43
|
+
success: (title: string, options?: Omit<ToastOptions, "tone">) => number;
|
|
44
|
+
error: (title: string, options?: Omit<ToastOptions, "tone">) => number;
|
|
45
|
+
loading: (title: string, options?: Omit<ToastOptions, "tone">) => number;
|
|
46
|
+
/** One toast that says the work is under way, then how it went. */
|
|
47
|
+
promise<T>(promise: Promise<T>, messages: {
|
|
48
|
+
loading: string;
|
|
49
|
+
success: Message<T>;
|
|
50
|
+
error: Message<unknown>;
|
|
51
|
+
}): Promise<T>;
|
|
52
|
+
update: typeof update;
|
|
53
|
+
dismiss: typeof dismiss;
|
|
54
|
+
};
|
|
55
|
+
export {};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Toasts: short notes about something that happened away from where the person
|
|
3
|
+
* is looking. Call `toast()` from anywhere; one <Toaster /> shows them.
|
|
4
|
+
*/
|
|
5
|
+
const DURATION = 5000;
|
|
6
|
+
let next = 1;
|
|
7
|
+
class Toasts {
|
|
8
|
+
list = $state([]);
|
|
9
|
+
}
|
|
10
|
+
export const toasts = new Toasts();
|
|
11
|
+
function show(title, options = {}) {
|
|
12
|
+
const tone = options.tone ?? 'default';
|
|
13
|
+
const entry = {
|
|
14
|
+
id: next++,
|
|
15
|
+
title,
|
|
16
|
+
...options,
|
|
17
|
+
tone,
|
|
18
|
+
// Errors and work in progress stay until they are dealt with
|
|
19
|
+
duration: options.duration !== undefined
|
|
20
|
+
? options.duration
|
|
21
|
+
: tone === 'error' || tone === 'loading'
|
|
22
|
+
? null
|
|
23
|
+
: DURATION
|
|
24
|
+
};
|
|
25
|
+
toasts.list = [...toasts.list, entry];
|
|
26
|
+
return entry.id;
|
|
27
|
+
}
|
|
28
|
+
function update(id, patch) {
|
|
29
|
+
toasts.list = toasts.list.map((entry) => {
|
|
30
|
+
if (entry.id !== id)
|
|
31
|
+
return entry;
|
|
32
|
+
const tone = patch.tone ?? entry.tone;
|
|
33
|
+
const duration = patch.duration !== undefined
|
|
34
|
+
? patch.duration
|
|
35
|
+
: tone === 'error' || tone === 'loading'
|
|
36
|
+
? null
|
|
37
|
+
: DURATION;
|
|
38
|
+
return { ...entry, ...patch, tone, duration };
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
function dismiss(id) {
|
|
42
|
+
toasts.list = id === undefined ? [] : toasts.list.filter((entry) => entry.id !== id);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Shows a toast and returns its id.
|
|
46
|
+
*
|
|
47
|
+
* ```ts
|
|
48
|
+
* toast('Copied');
|
|
49
|
+
* toast.error("Couldn't push the branch", { description: reason, action: { label: 'Retry', onclick: push } });
|
|
50
|
+
* toast.promise(save(), { loading: 'Saving…', success: 'Saved', error: (e) => `Couldn't save: ${e}` });
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export const toast = Object.assign(show, {
|
|
54
|
+
success: (title, options) => show(title, { ...options, tone: 'success' }),
|
|
55
|
+
error: (title, options) => show(title, { ...options, tone: 'error' }),
|
|
56
|
+
loading: (title, options) => show(title, { ...options, tone: 'loading' }),
|
|
57
|
+
/** One toast that says the work is under way, then how it went. */
|
|
58
|
+
promise(promise, messages) {
|
|
59
|
+
const id = show(messages.loading, { tone: 'loading' });
|
|
60
|
+
const say = (message, value) => typeof message === 'function' ? message(value) : message;
|
|
61
|
+
promise.then((value) => update(id, { title: say(messages.success, value), tone: 'success' }), (error) => update(id, { title: say(messages.error, error), tone: 'error' }));
|
|
62
|
+
return promise;
|
|
63
|
+
},
|
|
64
|
+
update,
|
|
65
|
+
dismiss
|
|
66
|
+
});
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import * as stylex from '@stylexjs/stylex';
|
|
3
|
+
import type { Snippet } from 'svelte';
|
|
4
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
5
|
+
import Collapse from '../../internal/Collapse.svelte';
|
|
6
|
+
import type { Sx } from '../../internal/sx.js';
|
|
7
|
+
import { colors } from '../../tokens.stylex.js';
|
|
8
|
+
import { getToolContext } from './context.js';
|
|
9
|
+
|
|
10
|
+
export type ToolContentProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
|
|
11
|
+
sx?: Sx;
|
|
12
|
+
/** A Tool.Input and a Tool.Output, or anything else the tool produced. */
|
|
13
|
+
children?: Snippet;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const styles = stylex.create({
|
|
17
|
+
// Input and output hang from a rail under the tile, in line with the title
|
|
18
|
+
body: {
|
|
19
|
+
display: 'flex',
|
|
20
|
+
flexDirection: 'column',
|
|
21
|
+
gap: '0.75rem',
|
|
22
|
+
marginTop: '0.5rem',
|
|
23
|
+
marginBottom: '0.25rem',
|
|
24
|
+
marginInlineStart: 'calc(0.75rem - 0.5px)',
|
|
25
|
+
paddingInlineStart: 'calc(1.375rem - 0.5px)',
|
|
26
|
+
paddingBlock: '0.125rem',
|
|
27
|
+
borderInlineStartWidth: '1px',
|
|
28
|
+
borderInlineStartStyle: 'solid',
|
|
29
|
+
borderInlineStartColor: colors.line
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
</script>
|
|
33
|
+
|
|
34
|
+
<script lang="ts">
|
|
35
|
+
let { sx, class: className, children, ...rest }: ToolContentProps = $props();
|
|
36
|
+
|
|
37
|
+
const tool = getToolContext('Content');
|
|
38
|
+
</script>
|
|
39
|
+
|
|
40
|
+
<Collapse
|
|
41
|
+
open={tool.open}
|
|
42
|
+
id={tool.contentId}
|
|
43
|
+
role="region"
|
|
44
|
+
aria-labelledby={tool.triggerId}
|
|
45
|
+
data-slot="tool-content"
|
|
46
|
+
class={className}
|
|
47
|
+
innerSx={[styles.body, sx]}
|
|
48
|
+
{...rest}
|
|
49
|
+
>
|
|
50
|
+
{@render children?.()}
|
|
51
|
+
</Collapse>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
+
import type { Sx } from '../../internal/sx.js';
|
|
4
|
+
export type ToolContentProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
|
|
5
|
+
sx?: Sx;
|
|
6
|
+
/** A Tool.Input and a Tool.Output, or anything else the tool produced. */
|
|
7
|
+
children?: Snippet;
|
|
8
|
+
};
|
|
9
|
+
declare const ToolContent: import("svelte").Component<ToolContentProps, {}, "">;
|
|
10
|
+
type ToolContent = ReturnType<typeof ToolContent>;
|
|
11
|
+
export default ToolContent;
|