rift-ds 1.0.0
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/LICENSE +21 -0
- package/README.md +107 -0
- package/behaviors/focusable.d.ts +26 -0
- package/behaviors/focusable.js +18 -0
- package/behaviors/useFocusScope.d.ts +38 -0
- package/behaviors/useFocusScope.js +82 -0
- package/behaviors/useLayer.d.ts +43 -0
- package/behaviors/useLayer.js +55 -0
- package/behaviors/useMounted.d.ts +7 -0
- package/behaviors/useMounted.js +14 -0
- package/behaviors/useScrollLock.d.ts +55 -0
- package/behaviors/useScrollLock.js +59 -0
- package/bin/rift-ds.mjs +82 -0
- package/charts.d.ts +16 -0
- package/charts.js +24 -0
- package/components/Accordion/Accordion.css +119 -0
- package/components/Accordion/Accordion.d.ts +24 -0
- package/components/Accordion/Accordion.js +76 -0
- package/components/AgentPlan/AgentPlan.css +251 -0
- package/components/AgentPlan/AgentPlan.d.ts +41 -0
- package/components/AgentPlan/AgentPlan.js +100 -0
- package/components/AgentRail/AgentRail.css +282 -0
- package/components/AgentRail/AgentRail.d.ts +72 -0
- package/components/AgentRail/AgentRail.js +101 -0
- package/components/AgentStatus/AgentStatus.css +511 -0
- package/components/AgentStatus/AgentStatus.d.ts +41 -0
- package/components/AgentStatus/AgentStatus.js +86 -0
- package/components/AgentStatus/AgentStatusPatterns.d.ts +17 -0
- package/components/AgentStatus/AgentStatusPatterns.js +20 -0
- package/components/AiButton/AiButton.css +559 -0
- package/components/AiButton/AiButton.d.ts +79 -0
- package/components/AiButton/AiButton.js +183 -0
- package/components/Alert/Alert.css +261 -0
- package/components/Alert/Alert.d.ts +25 -0
- package/components/Alert/Alert.js +53 -0
- package/components/AlertDialog/AlertDialog.css +133 -0
- package/components/AlertDialog/AlertDialog.d.ts +29 -0
- package/components/AlertDialog/AlertDialog.js +98 -0
- package/components/AnchorNav/AnchorNav.css +137 -0
- package/components/AnchorNav/AnchorNav.d.ts +40 -0
- package/components/AnchorNav/AnchorNav.js +135 -0
- package/components/AnimatedNumber/AnimatedNumber.css +31 -0
- package/components/AnimatedNumber/AnimatedNumber.d.ts +36 -0
- package/components/AnimatedNumber/AnimatedNumber.js +55 -0
- package/components/AppLayout/AppLayout.css +52 -0
- package/components/AppLayout/AppLayout.d.ts +33 -0
- package/components/AppLayout/AppLayout.js +47 -0
- package/components/AppSidebar/AppSidebar.css +592 -0
- package/components/AppSidebar/AppSidebar.d.ts +90 -0
- package/components/AppSidebar/AppSidebar.js +295 -0
- package/components/Avatar/Avatar.css +133 -0
- package/components/Avatar/Avatar.d.ts +20 -0
- package/components/Avatar/Avatar.js +58 -0
- package/components/Avatar/demoAvatars.d.ts +18 -0
- package/components/Avatar/demoAvatars.js +16 -0
- package/components/AvatarGroup/AvatarGroup.css +61 -0
- package/components/AvatarGroup/AvatarGroup.d.ts +32 -0
- package/components/AvatarGroup/AvatarGroup.js +31 -0
- package/components/Badge/Badge.css +67 -0
- package/components/Badge/Badge.d.ts +13 -0
- package/components/Badge/Badge.js +15 -0
- package/components/Banner/Banner.css +110 -0
- package/components/Banner/Banner.d.ts +36 -0
- package/components/Banner/Banner.js +59 -0
- package/components/Breadcrumb/Breadcrumb.css +100 -0
- package/components/Breadcrumb/Breadcrumb.d.ts +25 -0
- package/components/Breadcrumb/Breadcrumb.js +40 -0
- package/components/Button/Button.css +473 -0
- package/components/Button/Button.d.ts +73 -0
- package/components/Button/Button.js +91 -0
- package/components/ButtonGroup/ButtonGroup.css +39 -0
- package/components/ButtonGroup/ButtonGroup.d.ts +13 -0
- package/components/ButtonGroup/ButtonGroup.js +30 -0
- package/components/Card/Card.css +190 -0
- package/components/Card/Card.d.ts +48 -0
- package/components/Card/Card.js +113 -0
- package/components/CardStack/CardStack.css +106 -0
- package/components/CardStack/CardStack.d.ts +44 -0
- package/components/CardStack/CardStack.js +140 -0
- package/components/Carousel/Carousel.css +121 -0
- package/components/Carousel/Carousel.d.ts +25 -0
- package/components/Carousel/Carousel.js +160 -0
- package/components/Chart/AreaChart.d.ts +40 -0
- package/components/Chart/AreaChart.js +101 -0
- package/components/Chart/BarChart.d.ts +36 -0
- package/components/Chart/BarChart.js +107 -0
- package/components/Chart/Chart.css +224 -0
- package/components/Chart/ComboChart.d.ts +40 -0
- package/components/Chart/ComboChart.js +142 -0
- package/components/Chart/LineChart.d.ts +36 -0
- package/components/Chart/LineChart.js +91 -0
- package/components/Chart/PieChart.d.ts +36 -0
- package/components/Chart/PieChart.js +93 -0
- package/components/Chart/RadarChart.d.ts +36 -0
- package/components/Chart/RadarChart.js +92 -0
- package/components/Chart/RadialChart.d.ts +43 -0
- package/components/Chart/RadialChart.js +114 -0
- package/components/Chart/ScatterChart.d.ts +38 -0
- package/components/Chart/ScatterChart.js +99 -0
- package/components/Chart/StackedBarChart.d.ts +36 -0
- package/components/Chart/StackedBarChart.js +98 -0
- package/components/Chart/Treemap.d.ts +35 -0
- package/components/Chart/Treemap.js +95 -0
- package/components/Chart/palette.d.ts +1 -0
- package/components/Chart/palette.js +17 -0
- package/components/ChatHeader/ChatHeader.css +35 -0
- package/components/ChatHeader/ChatHeader.d.ts +30 -0
- package/components/ChatHeader/ChatHeader.js +17 -0
- package/components/ChatMarker/ChatMarker.css +61 -0
- package/components/ChatMarker/ChatMarker.d.ts +22 -0
- package/components/ChatMarker/ChatMarker.js +18 -0
- package/components/ChatMessage/ChatMessage.css +326 -0
- package/components/ChatMessage/ChatMessage.d.ts +74 -0
- package/components/ChatMessage/ChatMessage.js +71 -0
- package/components/ChatThread/ChatThread.css +171 -0
- package/components/ChatThread/ChatThread.d.ts +41 -0
- package/components/ChatThread/ChatThread.js +175 -0
- package/components/Checkbox/Checkbox.css +183 -0
- package/components/Checkbox/Checkbox.d.ts +81 -0
- package/components/Checkbox/Checkbox.js +176 -0
- package/components/Chip/Chip.css +231 -0
- package/components/Chip/Chip.d.ts +27 -0
- package/components/Chip/Chip.js +80 -0
- package/components/CircularButton/CircularButton.css +263 -0
- package/components/CircularButton/CircularButton.d.ts +68 -0
- package/components/CircularButton/CircularButton.js +72 -0
- package/components/CodeBlock/CodeBlock.css +189 -0
- package/components/CodeBlock/CodeBlock.d.ts +23 -0
- package/components/CodeBlock/CodeBlock.js +96 -0
- package/components/CodeDiff/CodeDiff.css +175 -0
- package/components/CodeDiff/CodeDiff.d.ts +58 -0
- package/components/CodeDiff/CodeDiff.js +114 -0
- package/components/ColorPicker/ColorPicker.css +278 -0
- package/components/ColorPicker/ColorPicker.d.ts +50 -0
- package/components/ColorPicker/ColorPicker.js +349 -0
- package/components/ColourSwatch/ColourSwatch.css +88 -0
- package/components/ColourSwatch/ColourSwatch.d.ts +34 -0
- package/components/ColourSwatch/ColourSwatch.js +42 -0
- package/components/Combobox/Combobox.css +384 -0
- package/components/Combobox/Combobox.d.ts +93 -0
- package/components/Combobox/Combobox.js +331 -0
- package/components/CommandPalette/CommandPalette.css +342 -0
- package/components/CommandPalette/CommandPalette.d.ts +62 -0
- package/components/CommandPalette/CommandPalette.js +247 -0
- package/components/Composer/Composer.css +427 -0
- package/components/Composer/Composer.d.ts +97 -0
- package/components/Composer/Composer.js +146 -0
- package/components/ContactCard/ContactCard.css +132 -0
- package/components/ContactCard/ContactCard.d.ts +24 -0
- package/components/ContactCard/ContactCard.js +79 -0
- package/components/ContextMenu/ContextMenu.css +258 -0
- package/components/ContextMenu/ContextMenu.d.ts +26 -0
- package/components/ContextMenu/ContextMenu.js +387 -0
- package/components/ContributionGraph/ContributionGraph.css +169 -0
- package/components/ContributionGraph/ContributionGraph.d.ts +34 -0
- package/components/ContributionGraph/ContributionGraph.js +149 -0
- package/components/DataTable/DataTable.css +109 -0
- package/components/DataTable/DataTable.d.ts +81 -0
- package/components/DataTable/DataTable.js +236 -0
- package/components/DateInput/DateInput.css +127 -0
- package/components/DateInput/DateInput.d.ts +44 -0
- package/components/DateInput/DateInput.js +82 -0
- package/components/DatePicker/DatePicker.css +198 -0
- package/components/DatePicker/DatePicker.d.ts +29 -0
- package/components/DatePicker/DatePicker.js +196 -0
- package/components/Dialog/Dialog.css +178 -0
- package/components/Dialog/Dialog.d.ts +39 -0
- package/components/Dialog/Dialog.js +99 -0
- package/components/Divider/Divider.css +100 -0
- package/components/Divider/Divider.d.ts +18 -0
- package/components/Divider/Divider.js +31 -0
- package/components/DocumentChip/DocumentChip.css +190 -0
- package/components/DocumentChip/DocumentChip.d.ts +41 -0
- package/components/DocumentChip/DocumentChip.js +78 -0
- package/components/Drawer/Drawer.css +262 -0
- package/components/Drawer/Drawer.d.ts +41 -0
- package/components/Drawer/Drawer.js +101 -0
- package/components/Dropdown/Dropdown.css +288 -0
- package/components/Dropdown/Dropdown.d.ts +85 -0
- package/components/Dropdown/Dropdown.js +308 -0
- package/components/DropdownMenu/DropdownMenu.css +301 -0
- package/components/DropdownMenu/DropdownMenu.d.ts +42 -0
- package/components/DropdownMenu/DropdownMenu.js +371 -0
- package/components/EmptyState/EmptyState.css +136 -0
- package/components/EmptyState/EmptyState.d.ts +27 -0
- package/components/EmptyState/EmptyState.js +32 -0
- package/components/EntityCard/EntityCard.css +69 -0
- package/components/EntityCard/EntityCard.d.ts +19 -0
- package/components/EntityCard/EntityCard.js +26 -0
- package/components/EventCalendar/EventCalendar.css +363 -0
- package/components/EventCalendar/EventCalendar.d.ts +59 -0
- package/components/EventCalendar/EventCalendar.js +230 -0
- package/components/Field/Field.css +80 -0
- package/components/Field/Field.d.ts +57 -0
- package/components/Field/Field.js +70 -0
- package/components/Field/FieldContext.d.ts +42 -0
- package/components/Field/FieldContext.js +8 -0
- package/components/Figure/Figure.css +71 -0
- package/components/Figure/Figure.d.ts +17 -0
- package/components/Figure/Figure.js +26 -0
- package/components/FileInput/FileInput.css +281 -0
- package/components/FileInput/FileInput.d.ts +54 -0
- package/components/FileInput/FileInput.js +205 -0
- package/components/FilterBar/FilterBar.css +202 -0
- package/components/FilterBar/FilterBar.d.ts +55 -0
- package/components/FilterBar/FilterBar.js +249 -0
- package/components/FunnelChart/FunnelChart.css +17 -0
- package/components/FunnelChart/FunnelChart.d.ts +51 -0
- package/components/FunnelChart/FunnelChart.js +96 -0
- package/components/GanttChart/GanttChart.css +326 -0
- package/components/GanttChart/GanttChart.d.ts +82 -0
- package/components/GanttChart/GanttChart.js +202 -0
- package/components/Gauge/Gauge.css +120 -0
- package/components/Gauge/Gauge.d.ts +64 -0
- package/components/Gauge/Gauge.js +111 -0
- package/components/Globe/Globe.css +155 -0
- package/components/Globe/Globe.d.ts +103 -0
- package/components/Globe/Globe.js +416 -0
- package/components/HoverCard/HoverCard.css +125 -0
- package/components/HoverCard/HoverCard.d.ts +29 -0
- package/components/HoverCard/HoverCard.js +83 -0
- package/components/ImageCompare/ImageCompare.css +112 -0
- package/components/ImageCompare/ImageCompare.d.ts +40 -0
- package/components/ImageCompare/ImageCompare.js +134 -0
- package/components/Input/Input.css +150 -0
- package/components/Input/Input.d.ts +45 -0
- package/components/Input/Input.js +99 -0
- package/components/Instructions/Instructions.css +216 -0
- package/components/Instructions/Instructions.d.ts +29 -0
- package/components/Instructions/Instructions.js +32 -0
- package/components/InterruptCard/InterruptCard.css +164 -0
- package/components/InterruptCard/InterruptCard.d.ts +54 -0
- package/components/InterruptCard/InterruptCard.js +57 -0
- package/components/Kbd/Kbd.css +28 -0
- package/components/Kbd/Kbd.d.ts +19 -0
- package/components/Kbd/Kbd.js +14 -0
- package/components/LegendTile/LegendTile.css +60 -0
- package/components/LegendTile/LegendTile.d.ts +30 -0
- package/components/LegendTile/LegendTile.js +21 -0
- package/components/Lightbox/Lightbox.css +210 -0
- package/components/Lightbox/Lightbox.d.ts +45 -0
- package/components/Lightbox/Lightbox.js +109 -0
- package/components/LinkList/LinkList.css +71 -0
- package/components/LinkList/LinkList.d.ts +24 -0
- package/components/LinkList/LinkList.js +42 -0
- package/components/MapCallout/MapCallout.css +46 -0
- package/components/MapCallout/MapCallout.d.ts +29 -0
- package/components/MapCallout/MapCallout.js +17 -0
- package/components/MapLegend/MapLegend.css +88 -0
- package/components/MapLegend/MapLegend.d.ts +40 -0
- package/components/MapLegend/MapLegend.js +68 -0
- package/components/MessageActions/MessageActions.css +85 -0
- package/components/MessageActions/MessageActions.d.ts +38 -0
- package/components/MessageActions/MessageActions.js +40 -0
- package/components/MessageCard/MessageCard.css +163 -0
- package/components/MessageCard/MessageCard.d.ts +35 -0
- package/components/MessageCard/MessageCard.js +30 -0
- package/components/Meter/Meter.css +98 -0
- package/components/Meter/Meter.d.ts +36 -0
- package/components/Meter/Meter.js +48 -0
- package/components/ModelPicker/ModelPicker.css +243 -0
- package/components/ModelPicker/ModelPicker.d.ts +60 -0
- package/components/ModelPicker/ModelPicker.js +261 -0
- package/components/MotionSwatch/MotionSwatch.css +176 -0
- package/components/MotionSwatch/MotionSwatch.d.ts +25 -0
- package/components/MotionSwatch/MotionSwatch.js +74 -0
- package/components/Nav/Nav.css +51 -0
- package/components/Nav/Nav.d.ts +19 -0
- package/components/Nav/Nav.js +26 -0
- package/components/NavList/NavList.css +155 -0
- package/components/NavList/NavList.d.ts +56 -0
- package/components/NavList/NavList.js +100 -0
- package/components/NotificationCenter/NotificationCenter.css +279 -0
- package/components/NotificationCenter/NotificationCenter.d.ts +72 -0
- package/components/NotificationCenter/NotificationCenter.js +145 -0
- package/components/NumberInput/NumberInput.css +163 -0
- package/components/NumberInput/NumberInput.d.ts +44 -0
- package/components/NumberInput/NumberInput.js +147 -0
- package/components/Pagination/Pagination.css +126 -0
- package/components/Pagination/Pagination.d.ts +22 -0
- package/components/Pagination/Pagination.js +84 -0
- package/components/Panel/Panel.css +26 -0
- package/components/Panel/Panel.d.ts +22 -0
- package/components/Panel/Panel.js +19 -0
- package/components/PinInput/PinInput.css +92 -0
- package/components/PinInput/PinInput.d.ts +46 -0
- package/components/PinInput/PinInput.js +161 -0
- package/components/Popover/Popover.css +118 -0
- package/components/Popover/Popover.d.ts +22 -0
- package/components/Popover/Popover.js +113 -0
- package/components/ProgressBar/ProgressBar.css +60 -0
- package/components/ProgressBar/ProgressBar.d.ts +16 -0
- package/components/ProgressBar/ProgressBar.js +27 -0
- package/components/PromptSuggestions/PromptSuggestions.css +264 -0
- package/components/PromptSuggestions/PromptSuggestions.d.ts +68 -0
- package/components/PromptSuggestions/PromptSuggestions.js +87 -0
- package/components/Prose/Prose.css +269 -0
- package/components/Prose/Prose.d.ts +21 -0
- package/components/Prose/Prose.js +14 -0
- package/components/Quote/Quote.css +78 -0
- package/components/Quote/Quote.d.ts +18 -0
- package/components/Quote/Quote.js +26 -0
- package/components/RadioButton/RadioButton.css +151 -0
- package/components/RadioButton/RadioButton.d.ts +90 -0
- package/components/RadioButton/RadioButton.js +138 -0
- package/components/Rating/Rating.css +74 -0
- package/components/Rating/Rating.d.ts +41 -0
- package/components/Rating/Rating.js +124 -0
- package/components/Reasoning/Reasoning.css +291 -0
- package/components/Reasoning/Reasoning.d.ts +55 -0
- package/components/Reasoning/Reasoning.js +99 -0
- package/components/RichDropdown/RichDropdown.css +239 -0
- package/components/RichDropdown/RichDropdown.d.ts +78 -0
- package/components/RichDropdown/RichDropdown.js +227 -0
- package/components/SectionTitle/SectionTitle.css +45 -0
- package/components/SectionTitle/SectionTitle.d.ts +12 -0
- package/components/SectionTitle/SectionTitle.js +22 -0
- package/components/SegmentedControl/SegmentedControl.css +231 -0
- package/components/SegmentedControl/SegmentedControl.d.ts +44 -0
- package/components/SegmentedControl/SegmentedControl.js +240 -0
- package/components/SelectionCard/SelectionCard.css +255 -0
- package/components/SelectionCard/SelectionCard.d.ts +36 -0
- package/components/SelectionCard/SelectionCard.js +102 -0
- package/components/ShaderField/ShaderField.css +24 -0
- package/components/ShaderField/ShaderField.d.ts +68 -0
- package/components/ShaderField/ShaderField.js +55 -0
- package/components/ShaderField/field.glsl.d.ts +39 -0
- package/components/ShaderField/field.glsl.js +178 -0
- package/components/ShaderField/useShaderField.d.ts +103 -0
- package/components/ShaderField/useShaderField.js +410 -0
- package/components/Skeleton/Skeleton.css +81 -0
- package/components/Skeleton/Skeleton.d.ts +16 -0
- package/components/Skeleton/Skeleton.js +30 -0
- package/components/Slider/Slider.css +104 -0
- package/components/Slider/Slider.d.ts +48 -0
- package/components/Slider/Slider.js +86 -0
- package/components/SourceChip/SourceChip.css +111 -0
- package/components/SourceChip/SourceChip.d.ts +32 -0
- package/components/SourceChip/SourceChip.js +31 -0
- package/components/SourceTrail/SourceTrail.css +209 -0
- package/components/SourceTrail/SourceTrail.d.ts +49 -0
- package/components/SourceTrail/SourceTrail.js +108 -0
- package/components/SpacingSwatch/SpacingSwatch.css +108 -0
- package/components/SpacingSwatch/SpacingSwatch.d.ts +20 -0
- package/components/SpacingSwatch/SpacingSwatch.js +50 -0
- package/components/Sparkline/Sparkline.css +76 -0
- package/components/Sparkline/Sparkline.d.ts +51 -0
- package/components/Sparkline/Sparkline.js +116 -0
- package/components/Spinner/Spinner.css +84 -0
- package/components/Spinner/Spinner.d.ts +14 -0
- package/components/Spinner/Spinner.js +42 -0
- package/components/SplitButton/SplitButton.css +93 -0
- package/components/SplitButton/SplitButton.d.ts +43 -0
- package/components/SplitButton/SplitButton.js +67 -0
- package/components/SplitPane/SplitPane.css +106 -0
- package/components/SplitPane/SplitPane.d.ts +36 -0
- package/components/SplitPane/SplitPane.js +130 -0
- package/components/Stat/Stat.css +121 -0
- package/components/Stat/Stat.d.ts +22 -0
- package/components/Stat/Stat.js +36 -0
- package/components/StatusDot/StatusDot.css +104 -0
- package/components/StatusDot/StatusDot.d.ts +34 -0
- package/components/StatusDot/StatusDot.js +23 -0
- package/components/Stepper/Stepper.css +216 -0
- package/components/Stepper/Stepper.d.ts +41 -0
- package/components/Stepper/Stepper.js +61 -0
- package/components/StreamingText/StreamingText.css +40 -0
- package/components/StreamingText/StreamingText.d.ts +62 -0
- package/components/StreamingText/StreamingText.js +49 -0
- package/components/StreamingText/useStreamReveal.d.ts +70 -0
- package/components/StreamingText/useStreamReveal.js +121 -0
- package/components/Swatch/Swatch.css +52 -0
- package/components/Swatch/Swatch.d.ts +34 -0
- package/components/Swatch/Swatch.js +44 -0
- package/components/Table/Table.css +223 -0
- package/components/Table/Table.d.ts +53 -0
- package/components/Table/Table.js +65 -0
- package/components/Tabs/Tabs.css +140 -0
- package/components/Tabs/Tabs.d.ts +28 -0
- package/components/Tabs/Tabs.js +78 -0
- package/components/TagInput/TagInput.css +169 -0
- package/components/TagInput/TagInput.d.ts +43 -0
- package/components/TagInput/TagInput.js +137 -0
- package/components/Textarea/Textarea.css +109 -0
- package/components/Textarea/Textarea.d.ts +43 -0
- package/components/Textarea/Textarea.js +86 -0
- package/components/ThreadPanel/ThreadPanel.css +862 -0
- package/components/ThreadPanel/ThreadPanel.d.ts +175 -0
- package/components/ThreadPanel/ThreadPanel.js +466 -0
- package/components/ThreadTabs/ThreadTabs.css +252 -0
- package/components/ThreadTabs/ThreadTabs.d.ts +54 -0
- package/components/ThreadTabs/ThreadTabs.js +201 -0
- package/components/TimePicker/TimePicker.css +230 -0
- package/components/TimePicker/TimePicker.d.ts +46 -0
- package/components/TimePicker/TimePicker.js +250 -0
- package/components/Timeline/Timeline.css +366 -0
- package/components/Timeline/Timeline.d.ts +67 -0
- package/components/Timeline/Timeline.js +73 -0
- package/components/Toast/Toast.css +363 -0
- package/components/Toast/Toast.d.ts +63 -0
- package/components/Toast/Toast.js +215 -0
- package/components/ToggleGroup/ToggleGroup.css +110 -0
- package/components/ToggleGroup/ToggleGroup.d.ts +50 -0
- package/components/ToggleGroup/ToggleGroup.js +73 -0
- package/components/ToggleSwitch/ToggleSwitch.css +172 -0
- package/components/ToggleSwitch/ToggleSwitch.d.ts +43 -0
- package/components/ToggleSwitch/ToggleSwitch.js +76 -0
- package/components/ToolCall/ToolCall.css +234 -0
- package/components/ToolCall/ToolCall.d.ts +43 -0
- package/components/ToolCall/ToolCall.js +90 -0
- package/components/Toolbar/Toolbar.css +56 -0
- package/components/Toolbar/Toolbar.d.ts +35 -0
- package/components/Toolbar/Toolbar.js +62 -0
- package/components/Tooltip/Tooltip.css +175 -0
- package/components/Tooltip/Tooltip.d.ts +22 -0
- package/components/Tooltip/Tooltip.js +74 -0
- package/components/TreeView/TreeView.css +119 -0
- package/components/TreeView/TreeView.d.ts +45 -0
- package/components/TreeView/TreeView.js +232 -0
- package/components/TypographySwatch/TypographySwatch.css +81 -0
- package/components/TypographySwatch/TypographySwatch.d.ts +24 -0
- package/components/TypographySwatch/TypographySwatch.js +40 -0
- package/components/UsageCard/UsageCard.css +30 -0
- package/components/UsageCard/UsageCard.d.ts +48 -0
- package/components/UsageCard/UsageCard.js +54 -0
- package/components/Waveform/Waveform.css +97 -0
- package/components/Waveform/Waveform.d.ts +44 -0
- package/components/Waveform/Waveform.js +46 -0
- package/components/WorldMap/WorldMap.css +234 -0
- package/components/WorldMap/WorldMap.d.ts +113 -0
- package/components/WorldMap/WorldMap.js +427 -0
- package/components/WorldMap/land.d.ts +14 -0
- package/components/WorldMap/land.js +4 -0
- package/components/registry.d.ts +79 -0
- package/components/registry.js +13 -0
- package/components/registry.json +1153 -0
- package/components/registry.json.d.ts +1156 -0
- package/components/registry.json.js +11 -0
- package/fonts/MaterialSymbolsRounded-VariableFont_FILL,GRAD,opsz,wght.woff2 +0 -0
- package/fonts/material-symbols.css +94 -0
- package/fonts/presets/dm-sans-300-700-latin-ext.woff2 +0 -0
- package/fonts/presets/dm-sans-300-700-latin.woff2 +0 -0
- package/fonts/presets/fraunces-300-700-latin-ext.woff2 +0 -0
- package/fonts/presets/fraunces-300-700-latin.woff2 +0 -0
- package/fonts/presets/ibm-plex-mono-300-latin-ext.woff2 +0 -0
- package/fonts/presets/ibm-plex-mono-300-latin.woff2 +0 -0
- package/fonts/presets/ibm-plex-mono-400-latin-ext.woff2 +0 -0
- package/fonts/presets/ibm-plex-mono-400-latin.woff2 +0 -0
- package/fonts/presets/ibm-plex-mono-500-latin-ext.woff2 +0 -0
- package/fonts/presets/ibm-plex-mono-500-latin.woff2 +0 -0
- package/fonts/presets/ibm-plex-mono-600-latin-ext.woff2 +0 -0
- package/fonts/presets/ibm-plex-mono-600-latin.woff2 +0 -0
- package/fonts/presets/ibm-plex-mono-700-latin-ext.woff2 +0 -0
- package/fonts/presets/ibm-plex-mono-700-latin.woff2 +0 -0
- package/fonts/presets/ibm-plex-sans-300-700-latin-ext.woff2 +0 -0
- package/fonts/presets/ibm-plex-sans-300-700-latin.woff2 +0 -0
- package/fonts/presets/inter-300-700-latin-ext.woff2 +0 -0
- package/fonts/presets/inter-300-700-latin.woff2 +0 -0
- package/fonts/presets/inter-tight-300-900-latin-ext.woff2 +0 -0
- package/fonts/presets/inter-tight-300-900-latin.woff2 +0 -0
- package/fonts/presets/lora-400-700-latin-ext.woff2 +0 -0
- package/fonts/presets/lora-400-700-latin.woff2 +0 -0
- package/fonts/presets/montserrat-300-700-latin-ext.woff2 +0 -0
- package/fonts/presets/montserrat-300-700-latin.woff2 +0 -0
- package/fonts/presets/poppins-300-latin-ext.woff2 +0 -0
- package/fonts/presets/poppins-300-latin.woff2 +0 -0
- package/fonts/presets/poppins-400-latin-ext.woff2 +0 -0
- package/fonts/presets/poppins-400-latin.woff2 +0 -0
- package/fonts/presets/poppins-500-latin-ext.woff2 +0 -0
- package/fonts/presets/poppins-500-latin.woff2 +0 -0
- package/fonts/presets/poppins-600-latin-ext.woff2 +0 -0
- package/fonts/presets/poppins-600-latin.woff2 +0 -0
- package/fonts/presets/poppins-700-latin-ext.woff2 +0 -0
- package/fonts/presets/poppins-700-latin.woff2 +0 -0
- package/fonts/presets/source-sans-3-300-700-latin-ext.woff2 +0 -0
- package/fonts/presets/source-sans-3-300-700-latin.woff2 +0 -0
- package/fonts/presets/space-grotesk-300-700-latin-ext.woff2 +0 -0
- package/fonts/presets/space-grotesk-300-700-latin.woff2 +0 -0
- package/fonts/presets/work-sans-300-700-latin-ext.woff2 +0 -0
- package/fonts/presets/work-sans-300-700-latin.woff2 +0 -0
- package/index.d.ts +132 -0
- package/index.js +277 -0
- package/package.json +87 -0
- package/tokens/motion.d.ts +44 -0
- package/tokens/motion.js +32 -0
- package/tokens/presets/contrast.css +316 -0
- package/tokens/presets/coral.css +356 -0
- package/tokens/presets/forest.css +334 -0
- package/tokens/presets/gold.css +303 -0
- package/tokens/presets/mono.css +286 -0
- package/tokens/presets/pink.css +349 -0
- package/tokens/presets/presets.css +17 -0
- package/tokens/presets/terminal.css +378 -0
- package/tokens/presets/violet.css +314 -0
- package/tokens/presets/warm.css +320 -0
- package/tokens/presets/zest.css +359 -0
- package/tokens/registry.d.ts +22 -0
- package/tokens/registry.js +14 -0
- package/tokens/registry.json +276 -0
- package/tokens/registry.json.d.ts +279 -0
- package/tokens/registry.json.js +8 -0
- package/tokens/tokens-dark.css +186 -0
- package/tokens/tokens-light.css +276 -0
- package/tokens/tokens-motion.css +72 -0
- package/tokens/tokens-primitives.css +213 -0
- package/tokens/tokens-typography.css +210 -0
- package/tokens/tokens.css +11 -0
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
/* ============================================
|
|
2
|
+
COMPOSER COMPONENT
|
|
3
|
+
The chat input shell: attachments, auto-growing textarea, send/stop
|
|
4
|
+
============================================ */
|
|
5
|
+
|
|
6
|
+
/* The focus treatment animates a registered custom property, exactly as
|
|
7
|
+
AiButton does: a conic gradient's angle cannot tween otherwise. Browsers
|
|
8
|
+
without @property render the ring at its initial angle, static — a
|
|
9
|
+
correct, quieter fallback. Registered under its own name so Composer
|
|
10
|
+
never depends on AiButton's stylesheet being loaded. */
|
|
11
|
+
@property --ds-composer-glow-angle {
|
|
12
|
+
syntax: '<angle>';
|
|
13
|
+
initial-value: 0deg;
|
|
14
|
+
inherits: false;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.ds-composer {
|
|
18
|
+
/* Anchors the focus ring and glow pseudo-elements */
|
|
19
|
+
position: relative;
|
|
20
|
+
display: flex;
|
|
21
|
+
flex-direction: column;
|
|
22
|
+
width: 100%;
|
|
23
|
+
/* The send button's diameter — CircularButton's default size, which is
|
|
24
|
+
a raw value in CircularButton.css too (icon-button sizes are not on
|
|
25
|
+
a token scale). Everything concentric derives from it. */
|
|
26
|
+
--ds-composer-send-size: 40px;
|
|
27
|
+
/* The shell's concentric corner, derived rather than frozen: the send
|
|
28
|
+
button's EFFECTIVE radius (its --radius-pill capped at half its own
|
|
29
|
+
size — 999px never renders rounder than a circle), plus the action
|
|
30
|
+
bar's padding-200 ring, plus the border width (border-radius applies
|
|
31
|
+
to the border's outer edge). Shipped theme: min(999, 20) + 8 + 1 =
|
|
32
|
+
the historical 29px. A theme that squares the pill (radiusOverrides'
|
|
33
|
+
pill branch, the crisp presets) flows straight through, so the shell
|
|
34
|
+
always sits concentric with whatever button it wraps. Component-local
|
|
35
|
+
by design — one component's geometry, not a step on the global radius
|
|
36
|
+
scale (design.md's Composer section owns the contract). */
|
|
37
|
+
--ds-composer-radius: calc(
|
|
38
|
+
min(var(--radius-pill), var(--ds-composer-send-size) / 2) +
|
|
39
|
+
var(--padding-200) + var(--border-025)
|
|
40
|
+
);
|
|
41
|
+
background-color: var(--color-input-bg-primary);
|
|
42
|
+
border: var(--border-025) solid var(--color-input-border-primary);
|
|
43
|
+
border-radius: var(--ds-composer-radius);
|
|
44
|
+
box-shadow: var(--shadow-floating);
|
|
45
|
+
transition: border-color var(--motion-duration-fast) var(--motion-ease-standard);
|
|
46
|
+
/* The whole shell is the input affordance — clicking anywhere that is
|
|
47
|
+
not a control focuses the textarea, and the cursor says so. The
|
|
48
|
+
action bar below opts back out. */
|
|
49
|
+
cursor: text;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/* The shell carries the input focus/hover treatment — the textarea inside
|
|
53
|
+
is borderless, so the whole surface reads as one control */
|
|
54
|
+
.ds-composer:hover:not(:focus-within) {
|
|
55
|
+
border-color: var(--color-input-border-hover);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.ds-composer:focus-within {
|
|
59
|
+
border-color: var(--color-input-border-selected);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* ============================================
|
|
63
|
+
AI GLOW — opt-in via the `aiGlow` prop
|
|
64
|
+
While focused, the plain selected border stands down and the AI gradient
|
|
65
|
+
ring takes its place — the same "a model answers here" signal AiButton
|
|
66
|
+
carries, for composers whose messages are answered by a model.
|
|
67
|
+
============================================ */
|
|
68
|
+
|
|
69
|
+
.ds-composer--ai-glow:focus-within {
|
|
70
|
+
border-color: transparent;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/* The gradient ring: AiButton's treatment on the composer shell — a conic
|
|
74
|
+
gradient painted across the whole box, masked to the border band (two
|
|
75
|
+
fills, exclude-composited, inset by the border width). The gradient
|
|
76
|
+
repeats back to its start colour so the seam at 360° is invisible while
|
|
77
|
+
it turns. Negative inset lays the pseudo over the shell's own border
|
|
78
|
+
box, so the ring replaces the border exactly. */
|
|
79
|
+
.ds-composer--ai-glow::before {
|
|
80
|
+
content: '';
|
|
81
|
+
position: absolute;
|
|
82
|
+
inset: calc(-1 * var(--border-025));
|
|
83
|
+
border-radius: inherit;
|
|
84
|
+
/* One step up from the shell's --border-025 border: the outer edge stays on
|
|
85
|
+
the border box and the extra pixel grows inward, so the thicker band
|
|
86
|
+
reads clearly on low-density screens without changing the geometry. */
|
|
87
|
+
padding: var(--border-050);
|
|
88
|
+
background: conic-gradient(
|
|
89
|
+
from var(--ds-composer-glow-angle),
|
|
90
|
+
var(--color-ai-gradient-start),
|
|
91
|
+
var(--color-ai-gradient-mid),
|
|
92
|
+
var(--color-ai-gradient-end),
|
|
93
|
+
var(--color-ai-gradient-mid),
|
|
94
|
+
var(--color-ai-gradient-start)
|
|
95
|
+
);
|
|
96
|
+
/* Standard properties only — the build pipeline prefixes per its browser
|
|
97
|
+
targets, and hand-written -webkit- duplicates confuse its merging. */
|
|
98
|
+
/* ds-allow(color): mask luminance keying — the #fff paints alpha coverage
|
|
99
|
+
for mask-composite, not a theme colour */
|
|
100
|
+
mask:
|
|
101
|
+
linear-gradient(#fff 0 0) content-box,
|
|
102
|
+
linear-gradient(#fff 0 0);
|
|
103
|
+
mask-composite: exclude;
|
|
104
|
+
pointer-events: none;
|
|
105
|
+
opacity: 0;
|
|
106
|
+
transition: opacity var(--motion-duration-base) var(--motion-ease-standard);
|
|
107
|
+
/* ds-allow(motion): ambient signature rotation, matched to AiButton's —
|
|
108
|
+
deliberately far slower than the interaction-scale motion tokens; the
|
|
109
|
+
21s loop is AiButton's three-uneven-turns cadence */
|
|
110
|
+
animation: ds-composer-glow-turn 21s var(--motion-ease-emphasized) infinite paused;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/* The glow: the same gradient, blurred behind the opaque shell at low
|
|
114
|
+
opacity, so it reads as a halo around the border. A colour effect, not
|
|
115
|
+
an elevation shadow — depth stays token-owned. */
|
|
116
|
+
.ds-composer--ai-glow::after {
|
|
117
|
+
content: '';
|
|
118
|
+
position: absolute;
|
|
119
|
+
inset: calc(-1 * var(--border-025));
|
|
120
|
+
border-radius: inherit;
|
|
121
|
+
background: conic-gradient(
|
|
122
|
+
from var(--ds-composer-glow-angle),
|
|
123
|
+
var(--color-ai-gradient-start),
|
|
124
|
+
var(--color-ai-gradient-mid),
|
|
125
|
+
var(--color-ai-gradient-end),
|
|
126
|
+
var(--color-ai-gradient-mid),
|
|
127
|
+
var(--color-ai-gradient-start)
|
|
128
|
+
);
|
|
129
|
+
/* The glow's spread; a length with no token family, matched to AiButton. */
|
|
130
|
+
--ds-composer-glow: 14px;
|
|
131
|
+
filter: blur(var(--ds-composer-glow));
|
|
132
|
+
opacity: 0;
|
|
133
|
+
/* Resting, the glow waits collapsed at the send-button corner (fractions
|
|
134
|
+
chosen by eye, matching AiButton's entry) — waking is a bloom out of
|
|
135
|
+
that corner, not a flat fade. This rest-state transition is the way
|
|
136
|
+
back: losing focus collapses the halo quickly on the base pace. */
|
|
137
|
+
transform-origin: 95% 85%;
|
|
138
|
+
transform: scale(0.35);
|
|
139
|
+
z-index: -1;
|
|
140
|
+
pointer-events: none;
|
|
141
|
+
transition:
|
|
142
|
+
opacity var(--motion-duration-base) var(--motion-ease-standard),
|
|
143
|
+
transform var(--motion-duration-base) var(--motion-ease-standard);
|
|
144
|
+
/* ds-allow(motion): same ambient rotation as the ring, kept in phase */
|
|
145
|
+
animation: ds-composer-glow-turn 21s var(--motion-ease-emphasized) infinite paused;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/* Waking: the entry. The glow blooms out of the send-button corner over
|
|
149
|
+
the entrance pace and the ring fades up a --motion-duration-fast beat
|
|
150
|
+
behind it — the transition here (the destination state's) governs the
|
|
151
|
+
way in; the resting rules above govern the quick way back. */
|
|
152
|
+
.ds-composer--ai-glow:focus-within::before {
|
|
153
|
+
opacity: 1;
|
|
154
|
+
transition: opacity var(--motion-duration-slower) var(--motion-ease-entrance) var(--motion-duration-fast);
|
|
155
|
+
animation-play-state: running;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
.ds-composer--ai-glow:focus-within::after {
|
|
159
|
+
opacity: 0.3;
|
|
160
|
+
transform: none;
|
|
161
|
+
transition:
|
|
162
|
+
opacity var(--motion-duration-slower) var(--motion-ease-entrance),
|
|
163
|
+
transform var(--motion-duration-slower) var(--motion-ease-entrance);
|
|
164
|
+
animation-play-state: running;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/* AiButton's cadence, restated on the Composer-scoped angle: three uneven
|
|
168
|
+
turns eased per segment, ending on a whole turn so the wrap is seamless
|
|
169
|
+
and the average pace stays one turn per 7s. */
|
|
170
|
+
@keyframes ds-composer-glow-turn {
|
|
171
|
+
0% {
|
|
172
|
+
--ds-composer-glow-angle: 0deg;
|
|
173
|
+
}
|
|
174
|
+
14% {
|
|
175
|
+
--ds-composer-glow-angle: 168deg;
|
|
176
|
+
}
|
|
177
|
+
31% {
|
|
178
|
+
--ds-composer-glow-angle: 306deg;
|
|
179
|
+
}
|
|
180
|
+
46% {
|
|
181
|
+
--ds-composer-glow-angle: 570deg;
|
|
182
|
+
}
|
|
183
|
+
62% {
|
|
184
|
+
--ds-composer-glow-angle: 690deg;
|
|
185
|
+
}
|
|
186
|
+
79% {
|
|
187
|
+
--ds-composer-glow-angle: 936deg;
|
|
188
|
+
}
|
|
189
|
+
100% {
|
|
190
|
+
--ds-composer-glow-angle: 1080deg;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/* Working: while a response streams, the ring stays lit and keeps turning
|
|
195
|
+
whether or not the field holds focus — the visible half of the `streaming`
|
|
196
|
+
contract for glowing composers. The pairing is defined in design.md's
|
|
197
|
+
Composer section; streaming without aiGlow changes nothing. */
|
|
198
|
+
.ds-composer--ai-glow.ds-composer--streaming {
|
|
199
|
+
border-color: transparent;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.ds-composer--ai-glow.ds-composer--streaming::before {
|
|
203
|
+
opacity: 1;
|
|
204
|
+
transition: opacity var(--motion-duration-slower) var(--motion-ease-entrance) var(--motion-duration-fast);
|
|
205
|
+
animation-play-state: running;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
.ds-composer--ai-glow.ds-composer--streaming::after {
|
|
209
|
+
opacity: 0.3;
|
|
210
|
+
transform: none;
|
|
211
|
+
transition:
|
|
212
|
+
opacity var(--motion-duration-slower) var(--motion-ease-entrance),
|
|
213
|
+
transform var(--motion-duration-slower) var(--motion-ease-entrance);
|
|
214
|
+
animation-play-state: running;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/* Reduced motion: the ring and glow stay, the turning stops. */
|
|
218
|
+
@media (prefers-reduced-motion: reduce) {
|
|
219
|
+
.ds-composer--ai-glow::before,
|
|
220
|
+
.ds-composer--ai-glow::after {
|
|
221
|
+
animation: none;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/* ============================================
|
|
226
|
+
CONTEXT CHIP
|
|
227
|
+
A full-width, non-interactive note at the very top of the shell — what
|
|
228
|
+
the model is currently looking at. Composer owns the chrome; the caller
|
|
229
|
+
passes the text.
|
|
230
|
+
============================================ */
|
|
231
|
+
|
|
232
|
+
.ds-composer__context {
|
|
233
|
+
box-sizing: border-box;
|
|
234
|
+
display: flex;
|
|
235
|
+
align-items: center;
|
|
236
|
+
gap: var(--gap-100);
|
|
237
|
+
/* The action bar's tight --padding-200 ring, open toward the text below */
|
|
238
|
+
margin: var(--padding-200) var(--padding-200) 0;
|
|
239
|
+
/* ModelPicker's trigger geometry — the send button's height with the same
|
|
240
|
+
0/padding-md inset — so the chip and the bar's pills read as one family */
|
|
241
|
+
height: var(--ds-composer-send-size);
|
|
242
|
+
padding: 0 var(--padding-400);
|
|
243
|
+
background-color: var(--color-chat-context-bg);
|
|
244
|
+
/* A full pill, matching the suggestion chips around the composer */
|
|
245
|
+
border-radius: var(--radius-pill);
|
|
246
|
+
font-family: var(--font-paragraph-sm-family);
|
|
247
|
+
font-size: var(--font-paragraph-sm-size);
|
|
248
|
+
font-weight: var(--font-paragraph-sm-weight);
|
|
249
|
+
line-height: var(--font-paragraph-sm-line-height);
|
|
250
|
+
letter-spacing: var(--font-paragraph-sm-letter-spacing);
|
|
251
|
+
/* Tertiary, like DocumentChip's metadata line — the note is ambient
|
|
252
|
+
context, quieter than anything a person typed. The icon inherits it:
|
|
253
|
+
one tone for the whole note. */
|
|
254
|
+
color: var(--color-text-tertiary);
|
|
255
|
+
/* Not editable, not a control — but a click still falls through the shell
|
|
256
|
+
handler and focuses the textarea */
|
|
257
|
+
cursor: default;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
.ds-composer__context-icon {
|
|
261
|
+
display: inline-flex;
|
|
262
|
+
align-items: center;
|
|
263
|
+
flex-shrink: 0;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
.ds-composer__context-icon .material-symbols-rounded {
|
|
267
|
+
--icon-size: var(--icon-size-500);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/* The text owns the truncation: one line, ellipsized only when the note
|
|
271
|
+
actually outgrows the shell — an ellipsis is a truncation mark, not
|
|
272
|
+
punctuation. The icon beside it never shrinks. */
|
|
273
|
+
.ds-composer__context-text {
|
|
274
|
+
overflow: hidden;
|
|
275
|
+
text-overflow: ellipsis;
|
|
276
|
+
white-space: nowrap;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/* ============================================
|
|
280
|
+
ATTACHMENTS ROW
|
|
281
|
+
============================================ */
|
|
282
|
+
|
|
283
|
+
.ds-composer__attachments {
|
|
284
|
+
display: flex;
|
|
285
|
+
flex-wrap: wrap;
|
|
286
|
+
align-items: flex-end;
|
|
287
|
+
gap: var(--gap-100);
|
|
288
|
+
/* Top ring only — the text zone below keeps its own full padding-md,
|
|
289
|
+
so chips sit a clear padding-md above the first text line */
|
|
290
|
+
padding: var(--padding-400) var(--padding-500) 0;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/* ============================================
|
|
294
|
+
CONTENT ZONE
|
|
295
|
+
The text zone breathes more than the action bar: generous top and
|
|
296
|
+
inline padding, tighter toward the bar below it.
|
|
297
|
+
============================================ */
|
|
298
|
+
|
|
299
|
+
.ds-composer__content {
|
|
300
|
+
display: flex;
|
|
301
|
+
/* The textarea keeps its own natural height rather than stretching to the
|
|
302
|
+
zone's — the measurement below reads it, so a stretched textarea would
|
|
303
|
+
feed its own height back in and the zone could never shrink. */
|
|
304
|
+
align-items: flex-start;
|
|
305
|
+
box-sizing: border-box;
|
|
306
|
+
width: 100%;
|
|
307
|
+
padding: var(--padding-400) var(--padding-500) var(--padding-200);
|
|
308
|
+
/* Growing and shrinking is animated, which needs two pixel heights to run
|
|
309
|
+
between — `auto` has nothing to interpolate. So the zone states its own
|
|
310
|
+
height: the measured textarea (published as --ds-composer-text-height on
|
|
311
|
+
every resize) plus the block padding it owns. The fallback is a single
|
|
312
|
+
row, which is what the shell renders before the first measurement. */
|
|
313
|
+
height: calc(
|
|
314
|
+
var(--ds-composer-text-height, var(--font-paragraph-line-height)) + var(--padding-400) +
|
|
315
|
+
var(--padding-200)
|
|
316
|
+
);
|
|
317
|
+
/* Mid-transition the textarea is already at its new height, so the extra
|
|
318
|
+
line is clipped on the way in and released on the way out. */
|
|
319
|
+
overflow: hidden;
|
|
320
|
+
transition: height var(--motion-duration-instant) var(--motion-ease-emphasized);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
.ds-composer__textarea {
|
|
324
|
+
width: 100%;
|
|
325
|
+
padding: 0;
|
|
326
|
+
border: none;
|
|
327
|
+
outline: none;
|
|
328
|
+
background-color: transparent;
|
|
329
|
+
resize: none;
|
|
330
|
+
font-family: var(--font-paragraph-family);
|
|
331
|
+
font-size: var(--font-paragraph-size);
|
|
332
|
+
font-weight: var(--font-paragraph-weight);
|
|
333
|
+
line-height: var(--font-paragraph-line-height);
|
|
334
|
+
letter-spacing: var(--font-paragraph-letter-spacing);
|
|
335
|
+
color: var(--color-input-text-primary);
|
|
336
|
+
/* Growth cap: the shell owns the block padding, so the cap is rows × line-height.
|
|
337
|
+
--ds-composer-max-rows is set inline from the maxRows prop. */
|
|
338
|
+
max-height: calc(var(--ds-composer-max-rows, 8) * var(--font-paragraph-line-height));
|
|
339
|
+
overflow-y: auto;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
.ds-composer__textarea::placeholder {
|
|
343
|
+
color: var(--color-input-text-placeholder);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/* Overflow scrollbar — thin, trackless, and quiet instead of the bulky
|
|
347
|
+
platform default. scrollbar-* covers Firefox and modern Chromium;
|
|
348
|
+
the -webkit rules cover Safari. */
|
|
349
|
+
.ds-composer__textarea {
|
|
350
|
+
scrollbar-width: thin;
|
|
351
|
+
scrollbar-color: var(--color-bg-container-secondary) transparent;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
.ds-composer__textarea::-webkit-scrollbar {
|
|
355
|
+
width: 6px;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
.ds-composer__textarea::-webkit-scrollbar-track {
|
|
359
|
+
background: transparent;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
.ds-composer__textarea::-webkit-scrollbar-thumb {
|
|
363
|
+
background-color: var(--color-bg-container-secondary);
|
|
364
|
+
border-radius: var(--radius-pill);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/* Native auto-grow where supported; the JS measurement path stands down
|
|
368
|
+
(it checks the same capability) */
|
|
369
|
+
@supports (field-sizing: content) {
|
|
370
|
+
.ds-composer__textarea {
|
|
371
|
+
field-sizing: content;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/* ============================================
|
|
376
|
+
FOOTER ROW
|
|
377
|
+
============================================ */
|
|
378
|
+
|
|
379
|
+
.ds-composer__footer {
|
|
380
|
+
display: flex;
|
|
381
|
+
align-items: center;
|
|
382
|
+
gap: var(--gap-100);
|
|
383
|
+
/* The tight uniform ring the concentric corner is computed from */
|
|
384
|
+
padding: var(--padding-200);
|
|
385
|
+
/* Empty bar space still focuses the textarea on click, but the bar is
|
|
386
|
+
control territory, so it keeps the default cursor. */
|
|
387
|
+
cursor: default;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
.ds-composer__actions {
|
|
391
|
+
display: flex;
|
|
392
|
+
align-items: center;
|
|
393
|
+
gap: var(--gap-100);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
.ds-composer__trailing {
|
|
397
|
+
display: flex;
|
|
398
|
+
align-items: center;
|
|
399
|
+
gap: var(--gap-100);
|
|
400
|
+
margin-left: auto;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/* ============================================
|
|
404
|
+
DISABLED
|
|
405
|
+
============================================ */
|
|
406
|
+
|
|
407
|
+
.ds-composer--disabled {
|
|
408
|
+
opacity: 0.4;
|
|
409
|
+
cursor: not-allowed;
|
|
410
|
+
background-color: var(--color-input-bg-disabled);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
.ds-composer--disabled:hover:not(:focus-within),
|
|
414
|
+
.ds-composer--disabled:focus-within {
|
|
415
|
+
border-color: var(--color-input-border-disabled);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
.ds-composer--disabled:focus-within::before,
|
|
419
|
+
.ds-composer--disabled:focus-within::after {
|
|
420
|
+
opacity: 0;
|
|
421
|
+
animation-play-state: paused;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
.ds-composer--disabled .ds-composer__textarea {
|
|
425
|
+
cursor: not-allowed;
|
|
426
|
+
color: var(--color-input-text-disabled);
|
|
427
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
/** Props owned by Composer itself — everything else falls through to the <textarea>. */
|
|
3
|
+
type ComposerOwnProps = {
|
|
4
|
+
/** Current value for controlled use. Pair with `onValueChange`. */
|
|
5
|
+
value?: string;
|
|
6
|
+
/** Initial value for uncontrolled use. */
|
|
7
|
+
defaultValue?: string;
|
|
8
|
+
/**
|
|
9
|
+
* Convenience callback receiving the value directly.
|
|
10
|
+
* Fires alongside `onChange`, which keeps the standard React event signature
|
|
11
|
+
* so form libraries work unmodified.
|
|
12
|
+
*/
|
|
13
|
+
onValueChange?: (value: string) => void;
|
|
14
|
+
/**
|
|
15
|
+
* Fires with the current value on Enter (without Shift) and on the send
|
|
16
|
+
* button — never while `streaming`, and never when the trimmed value is
|
|
17
|
+
* empty. Composer does not clear the value: the consumer owns it and clears
|
|
18
|
+
* it after a successful submit. Shadows the native `onSubmit` attribute,
|
|
19
|
+
* which never fires on a textarea anyway.
|
|
20
|
+
*/
|
|
21
|
+
onSubmit?: (value: string) => void;
|
|
22
|
+
/**
|
|
23
|
+
* A response is streaming: the send button becomes a stop button, submit
|
|
24
|
+
* is blocked, and Enter is inert. On a glowing composer (`aiGlow`) the
|
|
25
|
+
* gradient ring also stays lit and keeps turning while this is true.
|
|
26
|
+
*/
|
|
27
|
+
streaming?: boolean;
|
|
28
|
+
/** Fires when the stop button is pressed while `streaming`. */
|
|
29
|
+
onStop?: () => void;
|
|
30
|
+
/** Growth cap in text rows before the textarea scrolls internally. */
|
|
31
|
+
maxRows?: number;
|
|
32
|
+
/**
|
|
33
|
+
* While focused, the shell wears AiButton's slowly rotating gradient ring
|
|
34
|
+
* and glow in place of the plain selected border — the system's "a model
|
|
35
|
+
* answers here" signal, for composers whose messages are answered by one.
|
|
36
|
+
* While `streaming`, the ring stays lit and turning whether or not the
|
|
37
|
+
* field holds focus. Off by default.
|
|
38
|
+
*/
|
|
39
|
+
aiGlow?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Contextual note rendered as a full-width, non-interactive chip at the
|
|
42
|
+
* very top of the shell, above any attachments — the "what the model is
|
|
43
|
+
* looking at" line a chat host pins over the message ("Looking at
|
|
44
|
+
* “Page name”"). One line: a note too long for the shell truncates with
|
|
45
|
+
* an ellipsis. Composer owns the chip's chrome; the caller passes the
|
|
46
|
+
* text.
|
|
47
|
+
*/
|
|
48
|
+
context?: React.ReactNode;
|
|
49
|
+
/**
|
|
50
|
+
* Icon at the left of the context chip — Material Symbol name (string,
|
|
51
|
+
* e.g. `visibility`, `article`) or custom element (ReactNode). Decorative
|
|
52
|
+
* and hidden from assistive technology — the chip's text carries the
|
|
53
|
+
* meaning. None by default, matching the ai set's icon-free-unless-asked
|
|
54
|
+
* convention.
|
|
55
|
+
*/
|
|
56
|
+
contextIcon?: string | React.ReactNode;
|
|
57
|
+
/**
|
|
58
|
+
* Attachment row rendered above the textarea (DocumentChips). Fully
|
|
59
|
+
* controlled by the caller — Composer never owns the list.
|
|
60
|
+
*/
|
|
61
|
+
attachments?: React.ReactNode;
|
|
62
|
+
/** Leading actions on the left of the action bar (attach button, model picker). */
|
|
63
|
+
actions?: React.ReactNode;
|
|
64
|
+
/**
|
|
65
|
+
* Trailing actions on the right of the action bar, just before the send
|
|
66
|
+
* button (dictation, voice mode).
|
|
67
|
+
*/
|
|
68
|
+
trailingActions?: React.ReactNode;
|
|
69
|
+
/** Accessible label for the send button. */
|
|
70
|
+
sendLabel?: string;
|
|
71
|
+
/** Accessible label for the stop button. */
|
|
72
|
+
stopLabel?: string;
|
|
73
|
+
/** Additional CSS classes — applied to the shell, not the <textarea>. */
|
|
74
|
+
className?: string;
|
|
75
|
+
};
|
|
76
|
+
export interface ComposerProps extends ComposerOwnProps, Omit<React.ComponentPropsWithoutRef<'textarea'>, keyof ComposerOwnProps> {
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Composer is the chat input shell: an optional context note ("Looking at
|
|
80
|
+
* “Page name”"), an attachments row, an auto-growing textarea, a leading
|
|
81
|
+
* actions slot, and a trailing send button — the one sanctioned
|
|
82
|
+
* primary-action teal in the chat set, because sending a message is a
|
|
83
|
+
* genuine primary CTA. While `streaming`, send becomes stop and Enter
|
|
84
|
+
* is inert.
|
|
85
|
+
*
|
|
86
|
+
* The textarea grows with its content up to `maxRows`, then scrolls
|
|
87
|
+
* internally. Where the browser supports `field-sizing: content` the sizing
|
|
88
|
+
* is fully native; elsewhere a measurement effect keeps the height in step.
|
|
89
|
+
* Either way the text zone glides between the two heights rather than
|
|
90
|
+
* snapping — 75ms, short enough to soften the step without reading as an
|
|
91
|
+
* animation. The action bar's buttons never move relative to the bar.
|
|
92
|
+
*
|
|
93
|
+
* Forwards a ref to the underlying `<textarea>` and spreads unrecognised
|
|
94
|
+
* props onto it; `className` lands on the shell.
|
|
95
|
+
*/
|
|
96
|
+
export declare const Composer: React.ForwardRefExoticComponent<ComposerProps & React.RefAttributes<HTMLTextAreaElement>>;
|
|
97
|
+
export {};
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
3
|
+
import React, { useRef, useState, useLayoutEffect } from "react";
|
|
4
|
+
import { CircularButton } from "../CircularButton/CircularButton.js";
|
|
5
|
+
import "../../fonts/material-symbols.css";
|
|
6
|
+
import "./Composer.css";
|
|
7
|
+
const Composer = React.forwardRef(
|
|
8
|
+
({
|
|
9
|
+
value,
|
|
10
|
+
defaultValue,
|
|
11
|
+
onValueChange,
|
|
12
|
+
onSubmit,
|
|
13
|
+
streaming = false,
|
|
14
|
+
onStop,
|
|
15
|
+
maxRows = 8,
|
|
16
|
+
aiGlow = false,
|
|
17
|
+
context,
|
|
18
|
+
contextIcon,
|
|
19
|
+
attachments,
|
|
20
|
+
actions,
|
|
21
|
+
trailingActions,
|
|
22
|
+
sendLabel = "Send message",
|
|
23
|
+
stopLabel = "Stop generating",
|
|
24
|
+
className = "",
|
|
25
|
+
onChange,
|
|
26
|
+
onKeyDown,
|
|
27
|
+
...rest
|
|
28
|
+
}, ref) => {
|
|
29
|
+
const baseClass = "ds-composer";
|
|
30
|
+
const textareaRef = useRef(null);
|
|
31
|
+
const contentRef = useRef(null);
|
|
32
|
+
const isControlled = value !== void 0;
|
|
33
|
+
const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue ?? "");
|
|
34
|
+
const currentValue = isControlled ? value : uncontrolledValue;
|
|
35
|
+
const disabled = Boolean(rest.disabled);
|
|
36
|
+
const canSend = !disabled && currentValue.trim() !== "";
|
|
37
|
+
const setTextareaRef = (node) => {
|
|
38
|
+
textareaRef.current = node;
|
|
39
|
+
if (typeof ref === "function") ref(node);
|
|
40
|
+
else if (ref) ref.current = node;
|
|
41
|
+
};
|
|
42
|
+
useLayoutEffect(() => {
|
|
43
|
+
const node = textareaRef.current;
|
|
44
|
+
if (!node) return;
|
|
45
|
+
if (typeof CSS !== "undefined" && CSS.supports("field-sizing", "content")) return;
|
|
46
|
+
node.style.height = "auto";
|
|
47
|
+
node.style.height = `${node.scrollHeight}px`;
|
|
48
|
+
}, [currentValue]);
|
|
49
|
+
useLayoutEffect(() => {
|
|
50
|
+
const node = textareaRef.current;
|
|
51
|
+
const content = contentRef.current;
|
|
52
|
+
if (!node || !content) return;
|
|
53
|
+
const observer = new ResizeObserver(() => {
|
|
54
|
+
content.style.setProperty("--ds-composer-text-height", `${node.offsetHeight}px`);
|
|
55
|
+
});
|
|
56
|
+
observer.observe(node);
|
|
57
|
+
return () => observer.disconnect();
|
|
58
|
+
}, []);
|
|
59
|
+
const submit = () => {
|
|
60
|
+
if (streaming || !canSend) return;
|
|
61
|
+
onSubmit?.(currentValue);
|
|
62
|
+
};
|
|
63
|
+
const handleChange = (e) => {
|
|
64
|
+
if (!isControlled) setUncontrolledValue(e.target.value);
|
|
65
|
+
onChange?.(e);
|
|
66
|
+
onValueChange?.(e.target.value);
|
|
67
|
+
};
|
|
68
|
+
const handleKeyDown = (e) => {
|
|
69
|
+
onKeyDown?.(e);
|
|
70
|
+
if (e.key === "Enter" && !e.shiftKey) {
|
|
71
|
+
e.preventDefault();
|
|
72
|
+
submit();
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
const handleShellClick = (e) => {
|
|
76
|
+
const target = e.target;
|
|
77
|
+
if (target.closest('button, a, textarea, input, select, [role="button"]')) return;
|
|
78
|
+
textareaRef.current?.focus();
|
|
79
|
+
};
|
|
80
|
+
const classes = [
|
|
81
|
+
baseClass,
|
|
82
|
+
aiGlow ? `${baseClass}--ai-glow` : "",
|
|
83
|
+
streaming ? `${baseClass}--streaming` : "",
|
|
84
|
+
disabled ? `${baseClass}--disabled` : "",
|
|
85
|
+
className
|
|
86
|
+
].filter(Boolean).join(" ");
|
|
87
|
+
const ariaLabel = rest["aria-label"] ?? (rest["aria-labelledby"] !== void 0 ? void 0 : "Message");
|
|
88
|
+
return /* @__PURE__ */ jsxs(
|
|
89
|
+
"div",
|
|
90
|
+
{
|
|
91
|
+
className: classes,
|
|
92
|
+
style: { "--ds-composer-max-rows": maxRows },
|
|
93
|
+
onClick: handleShellClick,
|
|
94
|
+
children: [
|
|
95
|
+
context && /* @__PURE__ */ jsxs("div", { className: `${baseClass}__context`, children: [
|
|
96
|
+
contextIcon && /* @__PURE__ */ jsx("span", { className: `${baseClass}__context-icon`, "aria-hidden": "true", children: typeof contextIcon === "string" ? /* @__PURE__ */ jsx("span", { className: "material-symbols-rounded", children: contextIcon }) : contextIcon }),
|
|
97
|
+
/* @__PURE__ */ jsx("span", { className: `${baseClass}__context-text`, children: context })
|
|
98
|
+
] }),
|
|
99
|
+
attachments && /* @__PURE__ */ jsx("div", { className: `${baseClass}__attachments`, children: attachments }),
|
|
100
|
+
/* @__PURE__ */ jsx("div", { className: `${baseClass}__content`, ref: contentRef, children: /* @__PURE__ */ jsx(
|
|
101
|
+
"textarea",
|
|
102
|
+
{
|
|
103
|
+
...rest,
|
|
104
|
+
ref: setTextareaRef,
|
|
105
|
+
className: `${baseClass}__textarea`,
|
|
106
|
+
rows: 1,
|
|
107
|
+
value: currentValue,
|
|
108
|
+
"aria-label": ariaLabel,
|
|
109
|
+
onChange: handleChange,
|
|
110
|
+
onKeyDown: handleKeyDown
|
|
111
|
+
}
|
|
112
|
+
) }),
|
|
113
|
+
/* @__PURE__ */ jsxs("div", { className: `${baseClass}__footer`, children: [
|
|
114
|
+
actions && /* @__PURE__ */ jsx("div", { className: `${baseClass}__actions`, children: actions }),
|
|
115
|
+
/* @__PURE__ */ jsxs("div", { className: `${baseClass}__trailing`, children: [
|
|
116
|
+
trailingActions,
|
|
117
|
+
streaming ? /* @__PURE__ */ jsx(
|
|
118
|
+
CircularButton,
|
|
119
|
+
{
|
|
120
|
+
icon: "stop",
|
|
121
|
+
variant: "primary",
|
|
122
|
+
ariaLabel: stopLabel,
|
|
123
|
+
disabled,
|
|
124
|
+
onClick: onStop
|
|
125
|
+
}
|
|
126
|
+
) : /* @__PURE__ */ jsx(
|
|
127
|
+
CircularButton,
|
|
128
|
+
{
|
|
129
|
+
icon: "arrow_upward",
|
|
130
|
+
variant: "primary",
|
|
131
|
+
ariaLabel: sendLabel,
|
|
132
|
+
disabled: !canSend,
|
|
133
|
+
onClick: submit
|
|
134
|
+
}
|
|
135
|
+
)
|
|
136
|
+
] })
|
|
137
|
+
] })
|
|
138
|
+
]
|
|
139
|
+
}
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
);
|
|
143
|
+
Composer.displayName = "Composer";
|
|
144
|
+
export {
|
|
145
|
+
Composer
|
|
146
|
+
};
|