@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,177 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
The edge between two areas, which the person can drag to resize one of them.
|
|
3
|
+
|
|
4
|
+
While dragging, the size is written straight onto the target as a custom
|
|
5
|
+
property, so nothing re-renders on every pointer move; the bound value
|
|
6
|
+
changes once, when the drag ends. The keyboard moves it in steps, Home and
|
|
7
|
+
End go to the limits, and a double-click puts it back. (Eregion's ResizableEdge.)
|
|
8
|
+
-->
|
|
9
|
+
<script lang="ts" module>
|
|
10
|
+
import * as stylex from '@stylexjs/stylex';
|
|
11
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
12
|
+
import { attrs, type Sx } from '../../internal/sx.js';
|
|
13
|
+
import { colors, motion } from '../../tokens.stylex.js';
|
|
14
|
+
|
|
15
|
+
export type ResizeHandleProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
|
|
16
|
+
/** The size, in pixels. Bindable. */
|
|
17
|
+
value?: number;
|
|
18
|
+
min?: number;
|
|
19
|
+
/** The largest size, or a function that works it out when a drag starts. */
|
|
20
|
+
max?: number | (() => number);
|
|
21
|
+
/** Where a double-click puts it back. */
|
|
22
|
+
defaultValue?: number;
|
|
23
|
+
/** How far an arrow key moves it, in pixels. */
|
|
24
|
+
step?: number;
|
|
25
|
+
/**
|
|
26
|
+
* Which edge of the target this handle sits on. `start` grows the target
|
|
27
|
+
* as it moves toward the start: a panel on the end side of the window.
|
|
28
|
+
*/
|
|
29
|
+
edge?: 'start' | 'end';
|
|
30
|
+
/** `vertical` resizes widths; `horizontal` resizes heights, as for a drawer below. */
|
|
31
|
+
orientation?: 'vertical' | 'horizontal';
|
|
32
|
+
/** The element being resized, and the custom property its size is read from. */
|
|
33
|
+
target?: HTMLElement | null;
|
|
34
|
+
property?: string;
|
|
35
|
+
/** Names the handle, for assistive technology: "Resize the panel". */
|
|
36
|
+
label: string;
|
|
37
|
+
sx?: Sx;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const HOVER = '@media (hover: hover) and (pointer: fine)';
|
|
41
|
+
const FORCED = '@media (forced-colors: active)';
|
|
42
|
+
|
|
43
|
+
const styles = stylex.create({
|
|
44
|
+
// An 8px target with a 1px line in the middle, lit when it is reached
|
|
45
|
+
handle: {
|
|
46
|
+
position: 'relative',
|
|
47
|
+
flexShrink: 0,
|
|
48
|
+
zIndex: 2,
|
|
49
|
+
touchAction: 'none',
|
|
50
|
+
WebkitAppRegion: 'no-drag',
|
|
51
|
+
outlineStyle: 'none',
|
|
52
|
+
'::after': {
|
|
53
|
+
content: '""',
|
|
54
|
+
position: 'absolute',
|
|
55
|
+
backgroundColor: {
|
|
56
|
+
default: 'transparent',
|
|
57
|
+
':hover': { default: null, [HOVER]: colors.ithil },
|
|
58
|
+
':focus-visible': colors.focusRing,
|
|
59
|
+
[FORCED]: 'CanvasText'
|
|
60
|
+
},
|
|
61
|
+
boxShadow: { default: null, ':hover': `0 0 8px ${colors.glow}` },
|
|
62
|
+
transitionProperty: 'background-color',
|
|
63
|
+
transitionDuration: motion.base,
|
|
64
|
+
transitionTimingFunction: 'ease',
|
|
65
|
+
transitionDelay: { default: '0ms', ':hover': '150ms' }
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
vertical: {
|
|
69
|
+
width: '0.5rem',
|
|
70
|
+
marginInline: '-0.25rem',
|
|
71
|
+
cursor: 'col-resize',
|
|
72
|
+
'::after': { insetBlock: 0, insetInlineStart: 'calc(50% - 1px)', width: '2px' }
|
|
73
|
+
},
|
|
74
|
+
horizontal: {
|
|
75
|
+
height: '0.5rem',
|
|
76
|
+
marginBlock: '-0.25rem',
|
|
77
|
+
cursor: 'row-resize',
|
|
78
|
+
'::after': { insetInline: 0, top: 'calc(50% - 1px)', height: '2px' }
|
|
79
|
+
},
|
|
80
|
+
dragging: {
|
|
81
|
+
'::after': { backgroundColor: colors.ithil, transitionDelay: '0ms' }
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
</script>
|
|
85
|
+
|
|
86
|
+
<script lang="ts">
|
|
87
|
+
let {
|
|
88
|
+
value = $bindable(320),
|
|
89
|
+
min = 160,
|
|
90
|
+
max = Infinity,
|
|
91
|
+
defaultValue,
|
|
92
|
+
step = 32,
|
|
93
|
+
edge = 'start',
|
|
94
|
+
orientation = 'vertical',
|
|
95
|
+
target,
|
|
96
|
+
property = '--narvi-size',
|
|
97
|
+
label,
|
|
98
|
+
sx,
|
|
99
|
+
class: className,
|
|
100
|
+
...rest
|
|
101
|
+
}: ResizeHandleProps = $props();
|
|
102
|
+
|
|
103
|
+
let dragging = $state(false);
|
|
104
|
+
const limit = () => (typeof max === 'function' ? max() : max);
|
|
105
|
+
const clamp = (size: number, upper = limit()) =>
|
|
106
|
+
Math.round(Math.min(Math.max(size, min), Math.max(min, upper)));
|
|
107
|
+
|
|
108
|
+
function onpointerdown(event: PointerEvent & { currentTarget: HTMLDivElement }) {
|
|
109
|
+
if (event.button !== 0) return;
|
|
110
|
+
event.preventDefault();
|
|
111
|
+
const handle = event.currentTarget;
|
|
112
|
+
handle.setPointerCapture(event.pointerId);
|
|
113
|
+
dragging = true;
|
|
114
|
+
const start = orientation === 'vertical' ? event.clientX : event.clientY;
|
|
115
|
+
const from = value;
|
|
116
|
+
const upper = limit();
|
|
117
|
+
const rtl = getComputedStyle(handle).direction === 'rtl';
|
|
118
|
+
// Moving toward the start grows a target whose start edge this is
|
|
119
|
+
let sign = edge === 'start' ? -1 : 1;
|
|
120
|
+
if (orientation === 'vertical' && rtl) sign = -sign;
|
|
121
|
+
let size = from;
|
|
122
|
+
|
|
123
|
+
const move = (moving: PointerEvent) => {
|
|
124
|
+
const now = orientation === 'vertical' ? moving.clientX : moving.clientY;
|
|
125
|
+
size = clamp(from + (now - start) * sign, upper);
|
|
126
|
+
target?.style.setProperty(property, `${size}px`);
|
|
127
|
+
};
|
|
128
|
+
const up = () => {
|
|
129
|
+
dragging = false;
|
|
130
|
+
handle.removeEventListener('pointermove', move);
|
|
131
|
+
handle.removeEventListener('pointerup', up);
|
|
132
|
+
handle.removeEventListener('pointercancel', up);
|
|
133
|
+
value = size;
|
|
134
|
+
};
|
|
135
|
+
handle.addEventListener('pointermove', move);
|
|
136
|
+
handle.addEventListener('pointerup', up);
|
|
137
|
+
handle.addEventListener('pointercancel', up);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function onkeydown(event: KeyboardEvent & { currentTarget: HTMLDivElement }) {
|
|
141
|
+
const rtl = getComputedStyle(event.currentTarget).direction === 'rtl';
|
|
142
|
+
const grow = edge === 'start' ? -1 : 1;
|
|
143
|
+
let delta = 0;
|
|
144
|
+
if (orientation === 'vertical') {
|
|
145
|
+
if (event.key === 'ArrowLeft') delta = -step * grow * (rtl ? -1 : 1);
|
|
146
|
+
else if (event.key === 'ArrowRight') delta = step * grow * (rtl ? -1 : 1);
|
|
147
|
+
} else if (event.key === 'ArrowUp') delta = -step * grow;
|
|
148
|
+
else if (event.key === 'ArrowDown') delta = step * grow;
|
|
149
|
+
if (event.key === 'Home') value = min;
|
|
150
|
+
else if (event.key === 'End') value = clamp(Infinity);
|
|
151
|
+
else if (event.key === 'Enter' && defaultValue !== undefined) value = clamp(defaultValue);
|
|
152
|
+
else if (delta) value = clamp(value + delta);
|
|
153
|
+
else return;
|
|
154
|
+
event.preventDefault();
|
|
155
|
+
}
|
|
156
|
+
</script>
|
|
157
|
+
|
|
158
|
+
<!-- A separator that can take focus is a widget in ARIA: the keyboard moves it -->
|
|
159
|
+
<!-- svelte-ignore a11y_no_noninteractive_tabindex -->
|
|
160
|
+
<div
|
|
161
|
+
role="separator"
|
|
162
|
+
tabindex="0"
|
|
163
|
+
aria-label={label}
|
|
164
|
+
aria-orientation={orientation}
|
|
165
|
+
aria-valuenow={value}
|
|
166
|
+
aria-valuemin={min}
|
|
167
|
+
aria-valuemax={Number.isFinite(limit()) ? limit() : undefined}
|
|
168
|
+
data-slot="resize-handle"
|
|
169
|
+
data-dragging={dragging || undefined}
|
|
170
|
+
{...rest}
|
|
171
|
+
{...attrs([styles.handle, styles[orientation], dragging && styles.dragging, sx], className)}
|
|
172
|
+
{onpointerdown}
|
|
173
|
+
{onkeydown}
|
|
174
|
+
ondblclick={() => {
|
|
175
|
+
if (defaultValue !== undefined) value = clamp(defaultValue);
|
|
176
|
+
}}
|
|
177
|
+
></div>
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
2
|
+
import { type Sx } from '../../internal/sx.js';
|
|
3
|
+
export type ResizeHandleProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
|
|
4
|
+
/** The size, in pixels. Bindable. */
|
|
5
|
+
value?: number;
|
|
6
|
+
min?: number;
|
|
7
|
+
/** The largest size, or a function that works it out when a drag starts. */
|
|
8
|
+
max?: number | (() => number);
|
|
9
|
+
/** Where a double-click puts it back. */
|
|
10
|
+
defaultValue?: number;
|
|
11
|
+
/** How far an arrow key moves it, in pixels. */
|
|
12
|
+
step?: number;
|
|
13
|
+
/**
|
|
14
|
+
* Which edge of the target this handle sits on. `start` grows the target
|
|
15
|
+
* as it moves toward the start: a panel on the end side of the window.
|
|
16
|
+
*/
|
|
17
|
+
edge?: 'start' | 'end';
|
|
18
|
+
/** `vertical` resizes widths; `horizontal` resizes heights, as for a drawer below. */
|
|
19
|
+
orientation?: 'vertical' | 'horizontal';
|
|
20
|
+
/** The element being resized, and the custom property its size is read from. */
|
|
21
|
+
target?: HTMLElement | null;
|
|
22
|
+
property?: string;
|
|
23
|
+
/** Names the handle, for assistive technology: "Resize the panel". */
|
|
24
|
+
label: string;
|
|
25
|
+
sx?: Sx;
|
|
26
|
+
};
|
|
27
|
+
declare const ResizeHandle: import("svelte").Component<ResizeHandleProps, {}, "value">;
|
|
28
|
+
type ResizeHandle = ReturnType<typeof ResizeHandle>;
|
|
29
|
+
export default ResizeHandle;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Text that rolls to its next value: the old line lifts away as the new one
|
|
3
|
+
rises in. For a phrase that follows an agent from action to action,
|
|
4
|
+
"Reading agent-run.tsx", then "Running pnpm check".
|
|
5
|
+
-->
|
|
6
|
+
<script lang="ts" module>
|
|
7
|
+
import * as stylex from '@stylexjs/stylex';
|
|
8
|
+
import { cubicOut } from 'svelte/easing';
|
|
9
|
+
import { fly } from 'svelte/transition';
|
|
10
|
+
import { attrs, type Sx } from '../../internal/sx.js';
|
|
11
|
+
import Shimmer from '../shimmer/Shimmer.svelte';
|
|
12
|
+
|
|
13
|
+
export type RollingTextProps = {
|
|
14
|
+
text: string;
|
|
15
|
+
/** Lights the text with the moving glint, while the work goes on. */
|
|
16
|
+
shimmer?: boolean;
|
|
17
|
+
sx?: Sx;
|
|
18
|
+
class?: string;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const styles = stylex.create({
|
|
22
|
+
// Both lines share one cell while they pass each other
|
|
23
|
+
root: { display: 'inline-grid', minWidth: 0, overflow: 'hidden', verticalAlign: 'bottom' },
|
|
24
|
+
line: {
|
|
25
|
+
gridArea: '1 / 1',
|
|
26
|
+
minWidth: 0,
|
|
27
|
+
overflow: 'hidden',
|
|
28
|
+
textOverflow: 'ellipsis',
|
|
29
|
+
whiteSpace: 'nowrap'
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
const calm = () =>
|
|
34
|
+
typeof matchMedia !== 'undefined' && matchMedia('(prefers-reduced-motion: reduce)').matches;
|
|
35
|
+
</script>
|
|
36
|
+
|
|
37
|
+
<script lang="ts">
|
|
38
|
+
let { text, shimmer = false, sx, class: className }: RollingTextProps = $props();
|
|
39
|
+
</script>
|
|
40
|
+
|
|
41
|
+
<span data-slot="rolling-text" {...attrs([styles.root, sx], className)}>
|
|
42
|
+
{#key text}
|
|
43
|
+
<span
|
|
44
|
+
{...stylex.attrs(styles.line)}
|
|
45
|
+
in:fly={{ y: '0.6em', duration: calm() ? 0 : 220, easing: cubicOut, opacity: 0 }}
|
|
46
|
+
out:fly={{ y: '-0.6em', duration: calm() ? 0 : 160, easing: cubicOut, opacity: 0 }}
|
|
47
|
+
>
|
|
48
|
+
<Shimmer active={shimmer}>{text}</Shimmer>
|
|
49
|
+
</span>
|
|
50
|
+
{/key}
|
|
51
|
+
</span>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Sx } from '../../internal/sx.js';
|
|
2
|
+
export type RollingTextProps = {
|
|
3
|
+
text: string;
|
|
4
|
+
/** Lights the text with the moving glint, while the work goes on. */
|
|
5
|
+
shimmer?: boolean;
|
|
6
|
+
sx?: Sx;
|
|
7
|
+
class?: string;
|
|
8
|
+
};
|
|
9
|
+
declare const RollingText: import("svelte").Component<RollingTextProps, {}, "">;
|
|
10
|
+
type RollingText = ReturnType<typeof RollingText>;
|
|
11
|
+
export default RollingText;
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import * as stylex from '@stylexjs/stylex';
|
|
3
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
4
|
+
import { attrs, type Sx } from '../../internal/sx.js';
|
|
5
|
+
import { colors, font, motion, radius } from '../../tokens.stylex.js';
|
|
6
|
+
|
|
7
|
+
export type SegmentedOption = { value: string; label: string; disabled?: boolean };
|
|
8
|
+
|
|
9
|
+
export type SegmentedControlProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
|
|
10
|
+
/** The choices, in order. Two to five read best. */
|
|
11
|
+
options: SegmentedOption[];
|
|
12
|
+
/** The selected option's value. Bindable. */
|
|
13
|
+
value?: string;
|
|
14
|
+
/** Form field name. Generated when omitted. */
|
|
15
|
+
name?: string;
|
|
16
|
+
disabled?: boolean;
|
|
17
|
+
sx?: Sx;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// StyleX needs these in the same file to evaluate them at build time
|
|
21
|
+
const HOVER = '@media (hover: hover) and (pointer: fine)';
|
|
22
|
+
const MOTION = '@media (prefers-reduced-motion: no-preference)';
|
|
23
|
+
const FORCED = '@media (forced-colors: active)';
|
|
24
|
+
|
|
25
|
+
const styles = stylex.create({
|
|
26
|
+
root: {
|
|
27
|
+
WebkitAppRegion: 'no-drag',
|
|
28
|
+
position: 'relative',
|
|
29
|
+
display: 'inline-grid',
|
|
30
|
+
gridAutoFlow: 'column',
|
|
31
|
+
gridAutoColumns: '1fr',
|
|
32
|
+
boxSizing: 'border-box',
|
|
33
|
+
padding: '0.1875rem',
|
|
34
|
+
borderRadius: `calc(${radius.sm} + 0.1875rem)`,
|
|
35
|
+
backgroundColor: colors.well,
|
|
36
|
+
boxShadow: `inset 0 0 0 1px ${colors.line}, inset 0 1px 2px ${colors.shade}`,
|
|
37
|
+
fontFamily: font.body,
|
|
38
|
+
outlineStyle: 'solid',
|
|
39
|
+
outlineWidth: '1px',
|
|
40
|
+
outlineColor: 'transparent',
|
|
41
|
+
outlineOffset: '-1px'
|
|
42
|
+
},
|
|
43
|
+
// The thumb slides under the labels. Its position is logical, so it mirrors in RTL.
|
|
44
|
+
thumb: {
|
|
45
|
+
position: 'absolute',
|
|
46
|
+
top: '0.1875rem',
|
|
47
|
+
bottom: '0.1875rem',
|
|
48
|
+
insetInlineStart: '0.1875rem',
|
|
49
|
+
width: 'calc((100% - 6px) / var(--narvi-seg-count))',
|
|
50
|
+
// Moved with a transform. A percentage is of the thumb's own width, so one
|
|
51
|
+
// step is exactly 100%, whatever the labels measure.
|
|
52
|
+
translate: {
|
|
53
|
+
default: 'calc(var(--narvi-seg-index) * 100%) 0',
|
|
54
|
+
':dir(rtl)': 'calc(var(--narvi-seg-index) * -100%) 0'
|
|
55
|
+
},
|
|
56
|
+
borderRadius: radius.sm,
|
|
57
|
+
backgroundColor: { default: colors.surfaceRaised, [FORCED]: 'Canvas' },
|
|
58
|
+
boxShadow: `inset 0 0 0 1px ${colors.lineStrong}, inset 0 1px 0 ${colors.highlight}, 0 1px 3px ${colors.shade}`,
|
|
59
|
+
outlineStyle: 'solid',
|
|
60
|
+
outlineWidth: '2px',
|
|
61
|
+
outlineOffset: '-2px',
|
|
62
|
+
outlineColor: { default: 'transparent', [FORCED]: 'Highlight' },
|
|
63
|
+
forcedColorAdjust: 'none'
|
|
64
|
+
},
|
|
65
|
+
thumbSlides: {
|
|
66
|
+
transitionProperty: { default: 'none', [MOTION]: 'translate' },
|
|
67
|
+
transitionDuration: motion.slow,
|
|
68
|
+
transitionTimingFunction: motion.easeInOut
|
|
69
|
+
},
|
|
70
|
+
thumbHidden: { opacity: 0 },
|
|
71
|
+
option: {
|
|
72
|
+
position: 'relative',
|
|
73
|
+
zIndex: 1,
|
|
74
|
+
display: 'grid',
|
|
75
|
+
cursor: 'pointer',
|
|
76
|
+
WebkitTapHighlightColor: 'transparent'
|
|
77
|
+
},
|
|
78
|
+
optionDisabled: { cursor: 'not-allowed', opacity: 0.5 },
|
|
79
|
+
// The radio itself is invisible and covers its option, so it takes the click and the focus
|
|
80
|
+
input: {
|
|
81
|
+
position: 'absolute',
|
|
82
|
+
inset: 0,
|
|
83
|
+
width: '100%',
|
|
84
|
+
height: '100%',
|
|
85
|
+
margin: 0,
|
|
86
|
+
opacity: 0,
|
|
87
|
+
appearance: 'none',
|
|
88
|
+
cursor: 'inherit'
|
|
89
|
+
},
|
|
90
|
+
text: {
|
|
91
|
+
display: 'grid',
|
|
92
|
+
placeItems: 'center',
|
|
93
|
+
minHeight: '1.75rem',
|
|
94
|
+
paddingInline: '0.75rem',
|
|
95
|
+
borderRadius: radius.sm,
|
|
96
|
+
color: {
|
|
97
|
+
default: colors.textMuted,
|
|
98
|
+
':hover': { default: null, [HOVER]: colors.text },
|
|
99
|
+
[stylex.when.siblingBefore(':checked')]: colors.text
|
|
100
|
+
},
|
|
101
|
+
fontSize: font.sizeMd,
|
|
102
|
+
fontWeight: {
|
|
103
|
+
default: font.weightMedium,
|
|
104
|
+
[stylex.when.siblingBefore(':checked')]: font.weightSemibold
|
|
105
|
+
},
|
|
106
|
+
lineHeight: 1,
|
|
107
|
+
whiteSpace: 'nowrap',
|
|
108
|
+
outlineStyle: 'solid',
|
|
109
|
+
outlineWidth: '2px',
|
|
110
|
+
outlineOffset: '1px',
|
|
111
|
+
outlineColor: {
|
|
112
|
+
default: 'transparent',
|
|
113
|
+
[stylex.when.siblingBefore(':focus-visible')]: colors.focusRing
|
|
114
|
+
},
|
|
115
|
+
transitionProperty: 'color',
|
|
116
|
+
transitionDuration: motion.base,
|
|
117
|
+
transitionTimingFunction: 'ease'
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
</script>
|
|
121
|
+
|
|
122
|
+
<script lang="ts">
|
|
123
|
+
let {
|
|
124
|
+
options,
|
|
125
|
+
value = $bindable(),
|
|
126
|
+
name,
|
|
127
|
+
disabled = false,
|
|
128
|
+
sx,
|
|
129
|
+
class: className,
|
|
130
|
+
...rest
|
|
131
|
+
}: SegmentedControlProps = $props();
|
|
132
|
+
|
|
133
|
+
const uid = $props.id();
|
|
134
|
+
const index = $derived(options.findIndex((option) => option.value === value));
|
|
135
|
+
|
|
136
|
+
// The thumb slides only for a choice made with a pointer. Arrow keys move the
|
|
137
|
+
// selection as fast as they repeat, and a thumb trailing behind the focus ring
|
|
138
|
+
// makes the control feel slow. It also stays put when there was nothing
|
|
139
|
+
// selected to slide from.
|
|
140
|
+
let slides = $state(false);
|
|
141
|
+
</script>
|
|
142
|
+
|
|
143
|
+
<div
|
|
144
|
+
role="radiogroup"
|
|
145
|
+
{...rest}
|
|
146
|
+
{...attrs([styles.root, sx], className)}
|
|
147
|
+
style:--narvi-seg-count={options.length}
|
|
148
|
+
onpointerdowncapture={() => (slides = index >= 0)}
|
|
149
|
+
onkeydowncapture={() => (slides = false)}
|
|
150
|
+
>
|
|
151
|
+
<!-- The index is set on the thumb itself, so a change restyles one element, not the group -->
|
|
152
|
+
<span
|
|
153
|
+
aria-hidden="true"
|
|
154
|
+
{...stylex.attrs(styles.thumb, slides && styles.thumbSlides, index < 0 && styles.thumbHidden)}
|
|
155
|
+
style:--narvi-seg-index={Math.max(index, 0)}
|
|
156
|
+
></span>
|
|
157
|
+
{#each options as option (option.value)}
|
|
158
|
+
{@const off = disabled || option.disabled}
|
|
159
|
+
<label {...stylex.attrs(styles.option, off && styles.optionDisabled)}>
|
|
160
|
+
<input
|
|
161
|
+
type="radio"
|
|
162
|
+
name={name ?? uid}
|
|
163
|
+
value={option.value}
|
|
164
|
+
bind:group={value}
|
|
165
|
+
disabled={off}
|
|
166
|
+
{...stylex.attrs(styles.input, stylex.defaultMarker())}
|
|
167
|
+
/>
|
|
168
|
+
<span {...stylex.attrs(styles.text)}>{option.label}</span>
|
|
169
|
+
</label>
|
|
170
|
+
{/each}
|
|
171
|
+
</div>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
2
|
+
import { type Sx } from '../../internal/sx.js';
|
|
3
|
+
export type SegmentedOption = {
|
|
4
|
+
value: string;
|
|
5
|
+
label: string;
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
};
|
|
8
|
+
export type SegmentedControlProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
|
|
9
|
+
/** The choices, in order. Two to five read best. */
|
|
10
|
+
options: SegmentedOption[];
|
|
11
|
+
/** The selected option's value. Bindable. */
|
|
12
|
+
value?: string;
|
|
13
|
+
/** Form field name. Generated when omitted. */
|
|
14
|
+
name?: string;
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
sx?: Sx;
|
|
17
|
+
};
|
|
18
|
+
declare const SegmentedControl: import("svelte").Component<SegmentedControlProps, {}, "value">;
|
|
19
|
+
type SegmentedControl = ReturnType<typeof SegmentedControl>;
|
|
20
|
+
export default SegmentedControl;
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
One choice from a short list. For a list long enough to search, or choices
|
|
3
|
+
with more to them, use a Popover with your own content.
|
|
4
|
+
-->
|
|
5
|
+
<script lang="ts" module>
|
|
6
|
+
import { Select } from 'bits-ui';
|
|
7
|
+
import * as stylex from '@stylexjs/stylex';
|
|
8
|
+
import Glyph from '../../internal/Glyph.svelte';
|
|
9
|
+
import { control, type ControlSize } from '../../internal/control.js';
|
|
10
|
+
import { layer } from '../../internal/layer.js';
|
|
11
|
+
import { attrs, type Sx } from '../../internal/sx.js';
|
|
12
|
+
import { colors } from '../../tokens.stylex.js';
|
|
13
|
+
import { getFieldContext } from '../field/context.js';
|
|
14
|
+
|
|
15
|
+
export type SelectOption = {
|
|
16
|
+
value: string;
|
|
17
|
+
label: string;
|
|
18
|
+
/** Options with the same group are listed together under its name. */
|
|
19
|
+
group?: string;
|
|
20
|
+
disabled?: boolean;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export type SelectProps = {
|
|
24
|
+
options: SelectOption[];
|
|
25
|
+
/** The chosen value. Bindable. */
|
|
26
|
+
value?: string;
|
|
27
|
+
/** Shown while nothing is chosen. */
|
|
28
|
+
placeholder?: string;
|
|
29
|
+
size?: ControlSize;
|
|
30
|
+
disabled?: boolean;
|
|
31
|
+
/** For a form: the name the value is sent under. */
|
|
32
|
+
name?: string;
|
|
33
|
+
/** Called when the person picks an option. */
|
|
34
|
+
onchange?: (value: string) => void;
|
|
35
|
+
'aria-label'?: string;
|
|
36
|
+
'aria-describedby'?: string;
|
|
37
|
+
id?: string;
|
|
38
|
+
sx?: Sx;
|
|
39
|
+
class?: string;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const styles = stylex.create({
|
|
43
|
+
trigger: {
|
|
44
|
+
display: 'flex',
|
|
45
|
+
alignItems: 'center',
|
|
46
|
+
gap: '0.5rem',
|
|
47
|
+
textAlign: 'start',
|
|
48
|
+
cursor: { default: 'pointer', ':disabled': 'not-allowed' }
|
|
49
|
+
},
|
|
50
|
+
value: {
|
|
51
|
+
flexGrow: 1,
|
|
52
|
+
minWidth: 0,
|
|
53
|
+
overflow: 'hidden',
|
|
54
|
+
textOverflow: 'ellipsis',
|
|
55
|
+
whiteSpace: 'nowrap'
|
|
56
|
+
},
|
|
57
|
+
placeholder: { color: colors.textSubtle },
|
|
58
|
+
selector: { display: 'grid', flexShrink: 0, color: colors.textSubtle },
|
|
59
|
+
check: { display: 'grid', marginInlineStart: 'auto', color: colors.ithil }
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
type Group = { name: string | undefined; options: SelectOption[] };
|
|
63
|
+
function grouped(options: SelectOption[]): Group[] {
|
|
64
|
+
const groups: Group[] = [];
|
|
65
|
+
for (const option of options) {
|
|
66
|
+
const last = groups.at(-1);
|
|
67
|
+
if (last && last.name === option.group) last.options.push(option);
|
|
68
|
+
else groups.push({ name: option.group, options: [option] });
|
|
69
|
+
}
|
|
70
|
+
return groups;
|
|
71
|
+
}
|
|
72
|
+
</script>
|
|
73
|
+
|
|
74
|
+
<script lang="ts">
|
|
75
|
+
let {
|
|
76
|
+
options,
|
|
77
|
+
value = $bindable(),
|
|
78
|
+
placeholder = 'Choose…',
|
|
79
|
+
size = 'md',
|
|
80
|
+
disabled,
|
|
81
|
+
name,
|
|
82
|
+
onchange,
|
|
83
|
+
'aria-label': label,
|
|
84
|
+
'aria-describedby': describedBy,
|
|
85
|
+
id,
|
|
86
|
+
sx,
|
|
87
|
+
class: className
|
|
88
|
+
}: SelectProps = $props();
|
|
89
|
+
|
|
90
|
+
const field = getFieldContext();
|
|
91
|
+
const selected = $derived(options.find((option) => option.value === value));
|
|
92
|
+
const groups = $derived(grouped(options));
|
|
93
|
+
</script>
|
|
94
|
+
|
|
95
|
+
<Select.Root
|
|
96
|
+
type="single"
|
|
97
|
+
bind:value={() => value ?? '', (next) => (value = next || undefined)}
|
|
98
|
+
onValueChange={(next) => onchange?.(next)}
|
|
99
|
+
items={options}
|
|
100
|
+
{name}
|
|
101
|
+
disabled={disabled ?? field?.disabled}
|
|
102
|
+
>
|
|
103
|
+
<Select.Trigger
|
|
104
|
+
id={id ?? field?.id}
|
|
105
|
+
aria-label={label}
|
|
106
|
+
aria-describedby={describedBy ?? field?.describedBy}
|
|
107
|
+
data-slot="select"
|
|
108
|
+
{...attrs([control.base, control[size], styles.trigger, sx], className)}
|
|
109
|
+
>
|
|
110
|
+
<span {...stylex.attrs(styles.value, !selected && styles.placeholder)}>
|
|
111
|
+
{selected?.label ?? placeholder}
|
|
112
|
+
</span>
|
|
113
|
+
<span {...stylex.attrs(styles.selector)}><Glyph name="selector" size={14} /></span>
|
|
114
|
+
</Select.Trigger>
|
|
115
|
+
<Select.Portal>
|
|
116
|
+
<Select.Content sideOffset={6} collisionPadding={8} {...stylex.attrs(layer.surface)}>
|
|
117
|
+
<Select.Viewport>
|
|
118
|
+
{#each groups as group, index (index)}
|
|
119
|
+
<Select.Group>
|
|
120
|
+
{#if group.name}
|
|
121
|
+
<Select.GroupHeading {...stylex.attrs(layer.heading)}
|
|
122
|
+
>{group.name}</Select.GroupHeading
|
|
123
|
+
>
|
|
124
|
+
{/if}
|
|
125
|
+
{#each group.options as option (option.value)}
|
|
126
|
+
<Select.Item
|
|
127
|
+
value={option.value}
|
|
128
|
+
label={option.label}
|
|
129
|
+
disabled={option.disabled}
|
|
130
|
+
{...stylex.attrs(layer.item)}
|
|
131
|
+
>
|
|
132
|
+
{#snippet children({ selected })}
|
|
133
|
+
<span {...stylex.attrs(layer.label)}>{option.label}</span>
|
|
134
|
+
{#if selected}
|
|
135
|
+
<span {...stylex.attrs(styles.check)}><Glyph name="check" stroke={1.75} /></span
|
|
136
|
+
>
|
|
137
|
+
{/if}
|
|
138
|
+
{/snippet}
|
|
139
|
+
</Select.Item>
|
|
140
|
+
{/each}
|
|
141
|
+
</Select.Group>
|
|
142
|
+
{/each}
|
|
143
|
+
</Select.Viewport>
|
|
144
|
+
</Select.Content>
|
|
145
|
+
</Select.Portal>
|
|
146
|
+
</Select.Root>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Select } from 'bits-ui';
|
|
2
|
+
import { type ControlSize } from '../../internal/control.js';
|
|
3
|
+
import { type Sx } from '../../internal/sx.js';
|
|
4
|
+
export type SelectOption = {
|
|
5
|
+
value: string;
|
|
6
|
+
label: string;
|
|
7
|
+
/** Options with the same group are listed together under its name. */
|
|
8
|
+
group?: string;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
};
|
|
11
|
+
export type SelectProps = {
|
|
12
|
+
options: SelectOption[];
|
|
13
|
+
/** The chosen value. Bindable. */
|
|
14
|
+
value?: string;
|
|
15
|
+
/** Shown while nothing is chosen. */
|
|
16
|
+
placeholder?: string;
|
|
17
|
+
size?: ControlSize;
|
|
18
|
+
disabled?: boolean;
|
|
19
|
+
/** For a form: the name the value is sent under. */
|
|
20
|
+
name?: string;
|
|
21
|
+
/** Called when the person picks an option. */
|
|
22
|
+
onchange?: (value: string) => void;
|
|
23
|
+
'aria-label'?: string;
|
|
24
|
+
'aria-describedby'?: string;
|
|
25
|
+
id?: string;
|
|
26
|
+
sx?: Sx;
|
|
27
|
+
class?: string;
|
|
28
|
+
};
|
|
29
|
+
declare const Select: import("svelte").Component<SelectProps, {}, "value">;
|
|
30
|
+
type Select = ReturnType<typeof Select>;
|
|
31
|
+
export default Select;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import * as stylex from '@stylexjs/stylex';
|
|
3
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
4
|
+
import { attrs, type Sx } from '../../internal/sx.js';
|
|
5
|
+
import { colors } from '../../tokens.stylex.js';
|
|
6
|
+
|
|
7
|
+
export type SeparatorProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
|
|
8
|
+
orientation?: 'horizontal' | 'vertical';
|
|
9
|
+
/** Hides the separator from assistive technology when it is purely visual. */
|
|
10
|
+
decorative?: boolean;
|
|
11
|
+
sx?: Sx;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const styles = stylex.create({
|
|
15
|
+
base: {
|
|
16
|
+
flexShrink: 0,
|
|
17
|
+
margin: 0,
|
|
18
|
+
borderWidth: 0,
|
|
19
|
+
backgroundColor: colors.line
|
|
20
|
+
},
|
|
21
|
+
horizontal: {
|
|
22
|
+
width: '100%',
|
|
23
|
+
height: '1px'
|
|
24
|
+
},
|
|
25
|
+
vertical: {
|
|
26
|
+
alignSelf: 'stretch',
|
|
27
|
+
width: '1px',
|
|
28
|
+
minHeight: '1em'
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
</script>
|
|
32
|
+
|
|
33
|
+
<script lang="ts">
|
|
34
|
+
let {
|
|
35
|
+
orientation = 'horizontal',
|
|
36
|
+
decorative = false,
|
|
37
|
+
sx,
|
|
38
|
+
class: className,
|
|
39
|
+
...rest
|
|
40
|
+
}: SeparatorProps = $props();
|
|
41
|
+
</script>
|
|
42
|
+
|
|
43
|
+
<div
|
|
44
|
+
role={decorative ? 'none' : 'separator'}
|
|
45
|
+
aria-orientation={decorative || orientation === 'horizontal' ? undefined : 'vertical'}
|
|
46
|
+
{...rest}
|
|
47
|
+
{...attrs([styles.base, styles[orientation], sx], className)}
|
|
48
|
+
></div>
|