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,175 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export interface ThreadPanelThreadAction {
|
|
3
|
+
/** Stable identifier reported through `onThreadAction`. */
|
|
4
|
+
id: string;
|
|
5
|
+
/** Menu row text. */
|
|
6
|
+
label: string;
|
|
7
|
+
/** Leading icon on the menu row — Material Symbol name (string) or custom element (ReactNode). */
|
|
8
|
+
icon?: string | React.ReactNode;
|
|
9
|
+
/** Destructive styling (the error text colour) for delete-like actions. */
|
|
10
|
+
destructive?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface ThreadPanelThread {
|
|
13
|
+
/** Stable identifier: `activeThreadId` matches against it and `onThreadSelect` reports it. */
|
|
14
|
+
id: string;
|
|
15
|
+
/** The thread's one-line title. Overflow fades out under a trailing mask rather than clipping; the full text stays readable in the row's native tooltip. */
|
|
16
|
+
title: string;
|
|
17
|
+
/** Optional href — the row renders as an `<a>` for real navigation instead of a `<button>`. */
|
|
18
|
+
href?: string;
|
|
19
|
+
/** Small trailing annotation in the caption face, e.g. a relative timestamp. */
|
|
20
|
+
meta?: string;
|
|
21
|
+
/** The title is still being generated: the row shows a shimmer bar in the title's place and hides its menu, keeping `title` (e.g. "New chat") as the accessible name. */
|
|
22
|
+
pending?: boolean;
|
|
23
|
+
/** This thread's own menu actions, overriding the panel-wide `threadActions`. */
|
|
24
|
+
actions?: ThreadPanelThreadAction[];
|
|
25
|
+
/** Quiet second line under the title in the caption face — a repo, an environment, a one-line summary. Overflows under the same trailing mask as the title. */
|
|
26
|
+
description?: string;
|
|
27
|
+
/** The thread holds unseen activity: a small status dot leads the row. The dot is decorative — put the state in `meta` or `description` when it must be read aloud. */
|
|
28
|
+
unread?: boolean;
|
|
29
|
+
/** Trailing icon before the meta — Material Symbol name (string) or custom element (ReactNode), e.g. `cloud` for a session that lives remotely. */
|
|
30
|
+
icon?: string | React.ReactNode;
|
|
31
|
+
/** Marks the thread pinned with a trailing pin glyph. A marker only: the host groups pinned threads (typically a leading group) and offers pin/unpin through the row menu. */
|
|
32
|
+
pinned?: boolean;
|
|
33
|
+
}
|
|
34
|
+
export interface ThreadPanelGroup {
|
|
35
|
+
/** Group heading in the overline face, e.g. a project or repo name. Omit for an unlabelled run of threads. */
|
|
36
|
+
label?: string;
|
|
37
|
+
/** The group's threads, in display order. */
|
|
38
|
+
threads: ThreadPanelThread[];
|
|
39
|
+
}
|
|
40
|
+
export interface ThreadPanelControl {
|
|
41
|
+
/** Stable identifier reported through `onControlSelect`. */
|
|
42
|
+
id: string;
|
|
43
|
+
/** Leading icon on the row — Material Symbol name (string) or custom element (ReactNode). */
|
|
44
|
+
icon: string | React.ReactNode;
|
|
45
|
+
/** Row text. */
|
|
46
|
+
label: string;
|
|
47
|
+
/** Optional href — the row renders as an `<a>` instead of a `<button>`. */
|
|
48
|
+
href?: string;
|
|
49
|
+
}
|
|
50
|
+
export interface ThreadPanelProject {
|
|
51
|
+
/** Stable identifier: `activeProjectId` matches against it and `onProjectSelect` reports it. */
|
|
52
|
+
id: string;
|
|
53
|
+
/** The project's name. */
|
|
54
|
+
label: string;
|
|
55
|
+
/** Leading icon on the row — Material Symbol name (string) or custom element (ReactNode). Defaults to `folder`. */
|
|
56
|
+
icon?: string | React.ReactNode;
|
|
57
|
+
/** Small trailing annotation in the caption face, e.g. how recently the project was touched. */
|
|
58
|
+
meta?: string;
|
|
59
|
+
/** Optional href — the row renders as an `<a>` instead of a `<button>`. */
|
|
60
|
+
href?: string;
|
|
61
|
+
}
|
|
62
|
+
export interface ThreadPanelProfile {
|
|
63
|
+
/** The signed-in person's display name; also seeds the Avatar's initials. */
|
|
64
|
+
name: string;
|
|
65
|
+
/** Quiet caption beside the name, e.g. the plan or workspace. */
|
|
66
|
+
meta?: string;
|
|
67
|
+
/** Replace the initials Avatar with a custom element, e.g. an `<Avatar src>`. */
|
|
68
|
+
avatar?: React.ReactNode;
|
|
69
|
+
}
|
|
70
|
+
/** Props owned by ThreadPanel itself — everything else falls through to the root `<div>`. */
|
|
71
|
+
type ThreadPanelOwnProps = {
|
|
72
|
+
/** The history, in display order. A flat list is one group with no label. */
|
|
73
|
+
groups: ThreadPanelGroup[];
|
|
74
|
+
/** Id of the thread on stage. Its row renders filled and carries `aria-current`. */
|
|
75
|
+
activeThreadId?: string;
|
|
76
|
+
/** Fires with the clicked thread's id. Rows with an `href` navigate as well. */
|
|
77
|
+
onThreadSelect?: (id: string) => void;
|
|
78
|
+
/** Shared menu actions for every thread row, behind a hover-revealed trailing trigger; a thread's own `actions` overrides the set. The menu renders only when `onThreadAction` is also given, and never on a `pending` row. */
|
|
79
|
+
threadActions?: ThreadPanelThreadAction[];
|
|
80
|
+
/** Fires with the thread's id and the chosen action's id. */
|
|
81
|
+
onThreadAction?: (threadId: string, actionId: string) => void;
|
|
82
|
+
/** Accessible name for a row's menu trigger; the thread's title is appended after it. */
|
|
83
|
+
threadMenuLabel?: string;
|
|
84
|
+
/** Id of the thread being renamed: its row swaps to an inline text field, prefilled with the title and selected. The host owns the state, like everything else. */
|
|
85
|
+
renamingThreadId?: string;
|
|
86
|
+
/** Fires with the thread's id and the trimmed new title when a rename commits (Enter, or focus leaving the field). An empty or unchanged value fires `onRenameCancel` instead. */
|
|
87
|
+
onThreadRename?: (threadId: string, title: string) => void;
|
|
88
|
+
/** Fires when a rename ends without a change: Escape, an empty value, or an unchanged title. */
|
|
89
|
+
onRenameCancel?: () => void;
|
|
90
|
+
/** Accessible name for the inline rename field. */
|
|
91
|
+
renameLabel?: string;
|
|
92
|
+
/** Brand mark slot at the top, e.g. a logo `<img>`. While collapsed it doubles as the expand button, AppSidebar's contract. */
|
|
93
|
+
logo?: React.ReactNode;
|
|
94
|
+
/** Brand name beside the logo. The header row renders only when `logo`, `logoText`, or `onExpandedChange` is given. */
|
|
95
|
+
logoText?: string;
|
|
96
|
+
/** Text for the new-thread row. The row renders when this, `onNewThread`, or `newThreadHref` is given. */
|
|
97
|
+
newThreadLabel?: string;
|
|
98
|
+
/** Icon for the new-thread row — Material Symbol name (string) or custom element (ReactNode). Defaults to the pen-in-a-box `edit_square`, the same glyph chat headers use for New chat. */
|
|
99
|
+
newThreadIcon?: string | React.ReactNode;
|
|
100
|
+
/** Keyboard hint rendered as compact Kbds at the row's trailing edge, e.g. `["Ctrl", "N"]`. Decorative — the host owns the actual binding. */
|
|
101
|
+
newThreadShortcut?: string[];
|
|
102
|
+
/** Fires when the new-thread row is clicked. */
|
|
103
|
+
onNewThread?: () => void;
|
|
104
|
+
/** Optional href — the new-thread row renders as an `<a>`. */
|
|
105
|
+
newThreadHref?: string;
|
|
106
|
+
/** Standing rows between the new-thread action and the history, e.g. Automations or Settings. */
|
|
107
|
+
controls?: ThreadPanelControl[];
|
|
108
|
+
/** Fires with the clicked control's id. Rows with an `href` navigate as well. */
|
|
109
|
+
onControlSelect?: (id: string) => void;
|
|
110
|
+
/** Project rows between the standing controls and the history, under their own overline header. The section renders only when non-empty; collapsed, the rows fold to icon circles like the controls. */
|
|
111
|
+
projects?: ThreadPanelProject[];
|
|
112
|
+
/** The projects section's overline header text. */
|
|
113
|
+
projectsLabel?: string;
|
|
114
|
+
/** Id of the open project. Its row renders filled and carries `aria-current`. */
|
|
115
|
+
activeProjectId?: string;
|
|
116
|
+
/** Fires with the clicked project's id. Rows with an `href` navigate as well. */
|
|
117
|
+
onProjectSelect?: (id: string) => void;
|
|
118
|
+
/** Fires when the header's trailing new-project button is pressed. The button renders only when this is given. */
|
|
119
|
+
onProjectCreate?: () => void;
|
|
120
|
+
/** Accessible name for the new-project button. */
|
|
121
|
+
newProjectLabel?: string;
|
|
122
|
+
/** Text for the quiet trailing row that reveals older threads, e.g. "Show 20 more". Renders only when given. */
|
|
123
|
+
moreLabel?: string;
|
|
124
|
+
/** Fires when the more row is clicked. */
|
|
125
|
+
onShowMore?: () => void;
|
|
126
|
+
/** Accessible name for the scrollable history region. */
|
|
127
|
+
historyLabel?: string;
|
|
128
|
+
/** Whether the panel is expanded (280px, labels and history showing). Collapsed it is AppSidebar's 64px icon rail: circular icon rows, the history faded out, the avatar alone in the footer. */
|
|
129
|
+
expanded?: boolean;
|
|
130
|
+
/** Fires with the next state when the toggle (or, collapsed, the logo) is pressed. The toggle renders only when this is given; the panel is controlled, so the host owns the state. */
|
|
131
|
+
onExpandedChange?: (expanded: boolean) => void;
|
|
132
|
+
/** Accessible name for the header toggle while expanded. */
|
|
133
|
+
collapseLabel?: string;
|
|
134
|
+
/** Accessible name for the expand affordance while collapsed. */
|
|
135
|
+
expandLabel?: string;
|
|
136
|
+
/** The signed-in person, rendered as the footer's Avatar row. */
|
|
137
|
+
profile?: ThreadPanelProfile;
|
|
138
|
+
/** Rendered in the footer above the profile row — a theme toggle, a storage meter. Fades out while collapsed, AppSidebar's contract. */
|
|
139
|
+
footerSlot?: React.ReactNode;
|
|
140
|
+
/** Additional CSS classes */
|
|
141
|
+
className?: string;
|
|
142
|
+
};
|
|
143
|
+
export interface ThreadPanelProps extends ThreadPanelOwnProps, Omit<React.ComponentPropsWithoutRef<'div'>, keyof ThreadPanelOwnProps> {
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* ThreadPanel is the session-history rail of a chat or agent product: brand
|
|
147
|
+
* header, a new-thread action with an optional shortcut hint, standing
|
|
148
|
+
* control rows, an optional projects section with its own new-project
|
|
149
|
+
* button, the grouped thread history (the one region that scrolls), and a
|
|
150
|
+
* footer for the profile row and host furniture like a theme toggle.
|
|
151
|
+
* Thread rows scale from a bare title to the full detail anatomy: an
|
|
152
|
+
* unread dot, a quiet description line, a trailing glyph, a pin marker,
|
|
153
|
+
* and the meta caption.
|
|
154
|
+
*
|
|
155
|
+
* Fully controlled and stateless: the host owns the active thread, the
|
|
156
|
+
* navigation, the expanded state, and what selecting a row means. Every
|
|
157
|
+
* section is optional, so the panel scales from a bare thread list to the
|
|
158
|
+
* full anatomy. Thread rows carry the lifecycle affordances of a real chat
|
|
159
|
+
* history: a `pending` thread shows a shimmer in its title's place while
|
|
160
|
+
* the host generates a name, `threadActions` puts a hover-revealed overflow
|
|
161
|
+
* menu (DropdownMenu, compact) on every row for rename and delete, and
|
|
162
|
+
* `renamingThreadId` swaps a row to an inline rename field — all still
|
|
163
|
+
* controlled from outside. Expand and collapse follow AppSidebar's
|
|
164
|
+
* choreography: the panel owns its width (280px expanded, a 64px icon rail
|
|
165
|
+
* collapsed), the sweeping clip and the labels' opacity fades carry the
|
|
166
|
+
* transition, rows collapse to circular icon buttons, and while collapsed
|
|
167
|
+
* the logo doubles as the expand button. Carries no `'use client'`
|
|
168
|
+
* directive — rendered without callbacks (href navigation only) it works
|
|
169
|
+
* from a React Server Component; the menu and rename affordances need
|
|
170
|
+
* callbacks, so they belong to client hosts by nature.
|
|
171
|
+
*
|
|
172
|
+
* Forwards a ref to the root `<div>` and spreads unrecognised props onto it.
|
|
173
|
+
*/
|
|
174
|
+
export declare const ThreadPanel: React.ForwardRefExoticComponent<ThreadPanelProps & React.RefAttributes<HTMLDivElement>>;
|
|
175
|
+
export {};
|
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { Avatar } from "../Avatar/Avatar.js";
|
|
4
|
+
import { DropdownMenu } from "../DropdownMenu/DropdownMenu.js";
|
|
5
|
+
import { Kbd } from "../Kbd/Kbd.js";
|
|
6
|
+
import "./ThreadPanel.css";
|
|
7
|
+
import "../../fonts/material-symbols.css";
|
|
8
|
+
const baseClass = "ds-thread-panel";
|
|
9
|
+
function ActionRow({
|
|
10
|
+
className,
|
|
11
|
+
href,
|
|
12
|
+
onClick,
|
|
13
|
+
ariaCurrent,
|
|
14
|
+
title,
|
|
15
|
+
children
|
|
16
|
+
}) {
|
|
17
|
+
if (href) {
|
|
18
|
+
return /* @__PURE__ */ jsx(
|
|
19
|
+
"a",
|
|
20
|
+
{
|
|
21
|
+
className,
|
|
22
|
+
href,
|
|
23
|
+
onClick,
|
|
24
|
+
"aria-current": ariaCurrent === "true" ? "page" : ariaCurrent,
|
|
25
|
+
title,
|
|
26
|
+
children
|
|
27
|
+
}
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
return /* @__PURE__ */ jsx(
|
|
31
|
+
"button",
|
|
32
|
+
{
|
|
33
|
+
type: "button",
|
|
34
|
+
className,
|
|
35
|
+
onClick,
|
|
36
|
+
"aria-current": ariaCurrent,
|
|
37
|
+
title,
|
|
38
|
+
children
|
|
39
|
+
}
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
function RenameField({
|
|
43
|
+
baseClass: baseClass2,
|
|
44
|
+
defaultValue,
|
|
45
|
+
label,
|
|
46
|
+
onSubmit,
|
|
47
|
+
onCancel
|
|
48
|
+
}) {
|
|
49
|
+
const commit = (el) => {
|
|
50
|
+
const value = el.value.trim();
|
|
51
|
+
if (value && value !== defaultValue) onSubmit(value);
|
|
52
|
+
else onCancel?.();
|
|
53
|
+
};
|
|
54
|
+
const refocusRow = (el) => {
|
|
55
|
+
const row = el.closest("li");
|
|
56
|
+
const tryFocus = (attempt) => {
|
|
57
|
+
const target = row?.querySelector("button, a");
|
|
58
|
+
if (target) target.focus();
|
|
59
|
+
else if (attempt < 3) requestAnimationFrame(() => tryFocus(attempt + 1));
|
|
60
|
+
};
|
|
61
|
+
requestAnimationFrame(() => tryFocus(0));
|
|
62
|
+
};
|
|
63
|
+
return /* @__PURE__ */ jsx(
|
|
64
|
+
"input",
|
|
65
|
+
{
|
|
66
|
+
className: `${baseClass2}__rename`,
|
|
67
|
+
type: "text",
|
|
68
|
+
defaultValue,
|
|
69
|
+
"aria-label": label,
|
|
70
|
+
ref: (el) => {
|
|
71
|
+
if (el && document.activeElement !== el) {
|
|
72
|
+
el.focus();
|
|
73
|
+
el.select();
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
onKeyDown: (e) => {
|
|
77
|
+
if (e.key === "Enter") {
|
|
78
|
+
e.preventDefault();
|
|
79
|
+
e.stopPropagation();
|
|
80
|
+
refocusRow(e.currentTarget);
|
|
81
|
+
commit(e.currentTarget);
|
|
82
|
+
} else if (e.key === "Escape") {
|
|
83
|
+
e.stopPropagation();
|
|
84
|
+
refocusRow(e.currentTarget);
|
|
85
|
+
onCancel?.();
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
onBlur: (e) => commit(e.currentTarget)
|
|
89
|
+
}
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
const ThreadPanel = React.forwardRef(
|
|
93
|
+
({
|
|
94
|
+
groups,
|
|
95
|
+
activeThreadId,
|
|
96
|
+
onThreadSelect,
|
|
97
|
+
threadActions,
|
|
98
|
+
onThreadAction,
|
|
99
|
+
threadMenuLabel = "Thread options",
|
|
100
|
+
renamingThreadId,
|
|
101
|
+
onThreadRename,
|
|
102
|
+
onRenameCancel,
|
|
103
|
+
renameLabel = "Rename thread",
|
|
104
|
+
logo,
|
|
105
|
+
logoText,
|
|
106
|
+
newThreadLabel,
|
|
107
|
+
newThreadIcon = "edit_square",
|
|
108
|
+
newThreadShortcut,
|
|
109
|
+
onNewThread,
|
|
110
|
+
newThreadHref,
|
|
111
|
+
controls,
|
|
112
|
+
onControlSelect,
|
|
113
|
+
projects,
|
|
114
|
+
projectsLabel = "Projects",
|
|
115
|
+
activeProjectId,
|
|
116
|
+
onProjectSelect,
|
|
117
|
+
onProjectCreate,
|
|
118
|
+
newProjectLabel = "New project",
|
|
119
|
+
moreLabel,
|
|
120
|
+
onShowMore,
|
|
121
|
+
historyLabel = "Thread history",
|
|
122
|
+
expanded = true,
|
|
123
|
+
onExpandedChange,
|
|
124
|
+
collapseLabel = "Collapse the panel",
|
|
125
|
+
expandLabel = "Expand the panel",
|
|
126
|
+
profile,
|
|
127
|
+
footerSlot,
|
|
128
|
+
className = "",
|
|
129
|
+
...rest
|
|
130
|
+
}, ref) => {
|
|
131
|
+
const classes = [
|
|
132
|
+
baseClass,
|
|
133
|
+
expanded && `${baseClass}--expanded`,
|
|
134
|
+
className
|
|
135
|
+
].filter(Boolean).join(" ");
|
|
136
|
+
const iconClass = "material-symbols-rounded";
|
|
137
|
+
const showHeader = Boolean(logo || logoText || onExpandedChange);
|
|
138
|
+
const showNew = Boolean(newThreadLabel || onNewThread || newThreadHref);
|
|
139
|
+
const showFooter = Boolean(footerSlot || profile);
|
|
140
|
+
const logoExpands = Boolean(logo && !expanded && onExpandedChange);
|
|
141
|
+
const toggle = onExpandedChange && /* @__PURE__ */ jsx(
|
|
142
|
+
"button",
|
|
143
|
+
{
|
|
144
|
+
type: "button",
|
|
145
|
+
className: [
|
|
146
|
+
`${baseClass}__toggle`,
|
|
147
|
+
!logo && `${baseClass}__toggle--standalone`
|
|
148
|
+
].filter(Boolean).join(" "),
|
|
149
|
+
"aria-label": expanded ? collapseLabel : expandLabel,
|
|
150
|
+
"aria-expanded": expanded,
|
|
151
|
+
onClick: () => onExpandedChange(!expanded),
|
|
152
|
+
children: /* @__PURE__ */ jsx("span", { className: iconClass, "aria-hidden": "true", children: expanded ? "left_panel_close" : "left_panel_open" })
|
|
153
|
+
}
|
|
154
|
+
);
|
|
155
|
+
const expandOnClick = !expanded && onExpandedChange ? (e) => {
|
|
156
|
+
rest.onClick?.(e);
|
|
157
|
+
const target = e.target;
|
|
158
|
+
if (target.closest("button, a, [role='button']")) return;
|
|
159
|
+
onExpandedChange(true);
|
|
160
|
+
} : void 0;
|
|
161
|
+
return /* @__PURE__ */ jsxs(
|
|
162
|
+
"div",
|
|
163
|
+
{
|
|
164
|
+
...rest,
|
|
165
|
+
ref,
|
|
166
|
+
className: classes,
|
|
167
|
+
onClick: expandOnClick ?? rest.onClick,
|
|
168
|
+
children: [
|
|
169
|
+
showHeader && /* @__PURE__ */ jsxs(
|
|
170
|
+
"div",
|
|
171
|
+
{
|
|
172
|
+
className: [
|
|
173
|
+
`${baseClass}__header`,
|
|
174
|
+
!logo && `${baseClass}__header--bare`
|
|
175
|
+
].filter(Boolean).join(" "),
|
|
176
|
+
children: [
|
|
177
|
+
/* @__PURE__ */ jsxs(
|
|
178
|
+
"div",
|
|
179
|
+
{
|
|
180
|
+
className: `${baseClass}__header-inner`,
|
|
181
|
+
onClick: logoExpands ? () => onExpandedChange?.(true) : void 0,
|
|
182
|
+
role: logoExpands ? "button" : void 0,
|
|
183
|
+
tabIndex: logoExpands ? 0 : void 0,
|
|
184
|
+
"aria-label": logoExpands ? expandLabel : void 0,
|
|
185
|
+
onKeyDown: logoExpands ? (e) => {
|
|
186
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
187
|
+
e.preventDefault();
|
|
188
|
+
onExpandedChange?.(true);
|
|
189
|
+
}
|
|
190
|
+
} : void 0,
|
|
191
|
+
children: [
|
|
192
|
+
logo && /* @__PURE__ */ jsx("span", { className: `${baseClass}__logo`, "aria-hidden": "true", children: logo }),
|
|
193
|
+
logoText && /* @__PURE__ */ jsx("span", { className: `${baseClass}__brand`, children: logoText })
|
|
194
|
+
]
|
|
195
|
+
}
|
|
196
|
+
),
|
|
197
|
+
toggle
|
|
198
|
+
]
|
|
199
|
+
}
|
|
200
|
+
),
|
|
201
|
+
showNew && /* @__PURE__ */ jsxs(
|
|
202
|
+
ActionRow,
|
|
203
|
+
{
|
|
204
|
+
className: `${baseClass}__new`,
|
|
205
|
+
href: newThreadHref,
|
|
206
|
+
onClick: onNewThread,
|
|
207
|
+
children: [
|
|
208
|
+
/* @__PURE__ */ jsx(
|
|
209
|
+
"span",
|
|
210
|
+
{
|
|
211
|
+
className: `${baseClass}__new-icon${typeof newThreadIcon === "string" ? ` ${iconClass}` : ""}`,
|
|
212
|
+
"aria-hidden": "true",
|
|
213
|
+
children: newThreadIcon
|
|
214
|
+
}
|
|
215
|
+
),
|
|
216
|
+
/* @__PURE__ */ jsx("span", { className: `${baseClass}__new-label`, children: newThreadLabel ?? "New thread" }),
|
|
217
|
+
newThreadShortcut && newThreadShortcut.length > 0 && /* @__PURE__ */ jsx("span", { className: `${baseClass}__new-kbd`, "aria-hidden": "true", children: newThreadShortcut.map((key) => /* @__PURE__ */ jsx(Kbd, { size: "compact", children: key }, key)) })
|
|
218
|
+
]
|
|
219
|
+
}
|
|
220
|
+
),
|
|
221
|
+
controls && controls.length > 0 && /* @__PURE__ */ jsx("div", { className: `${baseClass}__controls`, children: controls.map((control) => /* @__PURE__ */ jsxs(
|
|
222
|
+
ActionRow,
|
|
223
|
+
{
|
|
224
|
+
className: `${baseClass}__control`,
|
|
225
|
+
href: control.href,
|
|
226
|
+
onClick: onControlSelect ? () => onControlSelect(control.id) : void 0,
|
|
227
|
+
children: [
|
|
228
|
+
/* @__PURE__ */ jsx(
|
|
229
|
+
"span",
|
|
230
|
+
{
|
|
231
|
+
className: `${baseClass}__control-icon${typeof control.icon === "string" ? ` ${iconClass}` : ""}`,
|
|
232
|
+
"aria-hidden": "true",
|
|
233
|
+
children: control.icon
|
|
234
|
+
}
|
|
235
|
+
),
|
|
236
|
+
/* @__PURE__ */ jsx("span", { className: `${baseClass}__control-label`, children: control.label })
|
|
237
|
+
]
|
|
238
|
+
},
|
|
239
|
+
control.id
|
|
240
|
+
)) }),
|
|
241
|
+
projects && projects.length > 0 && /* @__PURE__ */ jsxs("div", { className: `${baseClass}__projects`, children: [
|
|
242
|
+
/* @__PURE__ */ jsxs("div", { className: `${baseClass}__projects-header`, children: [
|
|
243
|
+
/* @__PURE__ */ jsx("span", { className: `${baseClass}__projects-label`, children: projectsLabel }),
|
|
244
|
+
onProjectCreate && /* @__PURE__ */ jsx(
|
|
245
|
+
"button",
|
|
246
|
+
{
|
|
247
|
+
type: "button",
|
|
248
|
+
className: `${baseClass}__projects-add`,
|
|
249
|
+
"aria-label": newProjectLabel,
|
|
250
|
+
onClick: onProjectCreate,
|
|
251
|
+
children: /* @__PURE__ */ jsx("span", { className: iconClass, "aria-hidden": "true", children: "add" })
|
|
252
|
+
}
|
|
253
|
+
)
|
|
254
|
+
] }),
|
|
255
|
+
/* @__PURE__ */ jsx("ul", { className: `${baseClass}__list`, "aria-label": projectsLabel, children: projects.map((project) => {
|
|
256
|
+
const active = project.id === activeProjectId;
|
|
257
|
+
return /* @__PURE__ */ jsx("li", { className: `${baseClass}__row`, children: /* @__PURE__ */ jsxs(
|
|
258
|
+
ActionRow,
|
|
259
|
+
{
|
|
260
|
+
className: [
|
|
261
|
+
`${baseClass}__project`,
|
|
262
|
+
active && `${baseClass}__project--active`
|
|
263
|
+
].filter(Boolean).join(" "),
|
|
264
|
+
href: project.href,
|
|
265
|
+
onClick: onProjectSelect ? () => onProjectSelect(project.id) : void 0,
|
|
266
|
+
ariaCurrent: active ? project.href ? "page" : "true" : void 0,
|
|
267
|
+
title: project.label,
|
|
268
|
+
children: [
|
|
269
|
+
/* @__PURE__ */ jsx(
|
|
270
|
+
"span",
|
|
271
|
+
{
|
|
272
|
+
className: `${baseClass}__project-icon${typeof project.icon === "string" || project.icon == null ? ` ${iconClass}` : ""}`,
|
|
273
|
+
"aria-hidden": "true",
|
|
274
|
+
children: project.icon ?? "folder"
|
|
275
|
+
}
|
|
276
|
+
),
|
|
277
|
+
/* @__PURE__ */ jsx("span", { className: `${baseClass}__project-label`, children: project.label }),
|
|
278
|
+
project.meta && /* @__PURE__ */ jsx("span", { className: `${baseClass}__meta`, children: project.meta })
|
|
279
|
+
]
|
|
280
|
+
}
|
|
281
|
+
) }, project.id);
|
|
282
|
+
}) })
|
|
283
|
+
] }),
|
|
284
|
+
/* @__PURE__ */ jsxs("nav", { className: `${baseClass}__history`, "aria-label": historyLabel, children: [
|
|
285
|
+
groups.map(
|
|
286
|
+
(group, index) => group.threads.length > 0 && /* @__PURE__ */ jsxs(
|
|
287
|
+
"div",
|
|
288
|
+
{
|
|
289
|
+
className: `${baseClass}__group`,
|
|
290
|
+
children: [
|
|
291
|
+
group.label && /* @__PURE__ */ jsx("span", { className: `${baseClass}__group-label`, children: group.label }),
|
|
292
|
+
/* @__PURE__ */ jsx(
|
|
293
|
+
"ul",
|
|
294
|
+
{
|
|
295
|
+
className: `${baseClass}__list`,
|
|
296
|
+
"aria-label": group.label,
|
|
297
|
+
children: group.threads.map((thread) => {
|
|
298
|
+
const active = thread.id === activeThreadId;
|
|
299
|
+
const actions = thread.actions ?? threadActions;
|
|
300
|
+
const showMenu = Boolean(
|
|
301
|
+
actions && actions.length > 0 && onThreadAction && !thread.pending
|
|
302
|
+
);
|
|
303
|
+
const renaming = Boolean(
|
|
304
|
+
thread.id === renamingThreadId && onThreadRename
|
|
305
|
+
);
|
|
306
|
+
return /* @__PURE__ */ jsx(
|
|
307
|
+
"li",
|
|
308
|
+
{
|
|
309
|
+
className: [
|
|
310
|
+
`${baseClass}__row`,
|
|
311
|
+
showMenu && `${baseClass}__row--with-menu`
|
|
312
|
+
].filter(Boolean).join(" "),
|
|
313
|
+
children: renaming ? /* @__PURE__ */ jsx(
|
|
314
|
+
RenameField,
|
|
315
|
+
{
|
|
316
|
+
baseClass,
|
|
317
|
+
defaultValue: thread.title,
|
|
318
|
+
label: renameLabel,
|
|
319
|
+
onSubmit: (value) => onThreadRename?.(thread.id, value),
|
|
320
|
+
onCancel: onRenameCancel
|
|
321
|
+
}
|
|
322
|
+
) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
323
|
+
/* @__PURE__ */ jsxs(
|
|
324
|
+
ActionRow,
|
|
325
|
+
{
|
|
326
|
+
className: [
|
|
327
|
+
`${baseClass}__thread`,
|
|
328
|
+
active && `${baseClass}__thread--active`,
|
|
329
|
+
thread.description && !thread.pending && `${baseClass}__thread--detailed`,
|
|
330
|
+
thread.unread && `${baseClass}__thread--unread`
|
|
331
|
+
].filter(Boolean).join(" "),
|
|
332
|
+
href: thread.href,
|
|
333
|
+
onClick: onThreadSelect ? () => onThreadSelect(thread.id) : void 0,
|
|
334
|
+
ariaCurrent: active ? thread.href ? "page" : "true" : void 0,
|
|
335
|
+
title: thread.title,
|
|
336
|
+
children: [
|
|
337
|
+
thread.unread && !thread.pending && /* @__PURE__ */ jsx(
|
|
338
|
+
"span",
|
|
339
|
+
{
|
|
340
|
+
className: `${baseClass}__unread`,
|
|
341
|
+
"aria-hidden": "true"
|
|
342
|
+
}
|
|
343
|
+
),
|
|
344
|
+
thread.pending ? (
|
|
345
|
+
/* The naming state: the shimmer holds the
|
|
346
|
+
title's place; the row's accessible name
|
|
347
|
+
comes from its tooltip. */
|
|
348
|
+
/* @__PURE__ */ jsx(
|
|
349
|
+
"span",
|
|
350
|
+
{
|
|
351
|
+
className: `${baseClass}__title ${baseClass}__title--pending`,
|
|
352
|
+
children: /* @__PURE__ */ jsx(
|
|
353
|
+
"span",
|
|
354
|
+
{
|
|
355
|
+
className: `${baseClass}__title-shimmer`,
|
|
356
|
+
"aria-hidden": "true"
|
|
357
|
+
}
|
|
358
|
+
)
|
|
359
|
+
}
|
|
360
|
+
)
|
|
361
|
+
) : /* @__PURE__ */ jsx("span", { className: `${baseClass}__title`, children: thread.title }),
|
|
362
|
+
!thread.pending && (thread.icon || thread.pinned || thread.meta) && /* @__PURE__ */ jsxs("span", { className: `${baseClass}__trail`, children: [
|
|
363
|
+
thread.icon && /* @__PURE__ */ jsx(
|
|
364
|
+
"span",
|
|
365
|
+
{
|
|
366
|
+
className: `${baseClass}__thread-icon${typeof thread.icon === "string" ? ` ${iconClass}` : ""}`,
|
|
367
|
+
"aria-hidden": "true",
|
|
368
|
+
children: thread.icon
|
|
369
|
+
}
|
|
370
|
+
),
|
|
371
|
+
thread.pinned && /* @__PURE__ */ jsx(
|
|
372
|
+
"span",
|
|
373
|
+
{
|
|
374
|
+
className: `${baseClass}__pin ${iconClass}`,
|
|
375
|
+
"aria-hidden": "true",
|
|
376
|
+
children: "keep"
|
|
377
|
+
}
|
|
378
|
+
),
|
|
379
|
+
thread.meta && /* @__PURE__ */ jsx("span", { className: `${baseClass}__meta`, children: thread.meta })
|
|
380
|
+
] }),
|
|
381
|
+
thread.description && !thread.pending && /* @__PURE__ */ jsx(
|
|
382
|
+
"span",
|
|
383
|
+
{
|
|
384
|
+
className: `${baseClass}__description`,
|
|
385
|
+
children: thread.description
|
|
386
|
+
}
|
|
387
|
+
)
|
|
388
|
+
]
|
|
389
|
+
}
|
|
390
|
+
),
|
|
391
|
+
showMenu && actions && /* @__PURE__ */ jsx(
|
|
392
|
+
DropdownMenu,
|
|
393
|
+
{
|
|
394
|
+
className: `${baseClass}__menu`,
|
|
395
|
+
align: "end",
|
|
396
|
+
size: "compact",
|
|
397
|
+
items: actions.map((action) => ({
|
|
398
|
+
label: action.label,
|
|
399
|
+
icon: action.icon,
|
|
400
|
+
destructive: action.destructive,
|
|
401
|
+
onClick: () => onThreadAction?.(thread.id, action.id)
|
|
402
|
+
})),
|
|
403
|
+
trigger: /* @__PURE__ */ jsx(
|
|
404
|
+
"button",
|
|
405
|
+
{
|
|
406
|
+
type: "button",
|
|
407
|
+
className: `${baseClass}__menu-trigger`,
|
|
408
|
+
"aria-label": `${threadMenuLabel}: ${thread.title}`,
|
|
409
|
+
children: /* @__PURE__ */ jsx(
|
|
410
|
+
"span",
|
|
411
|
+
{
|
|
412
|
+
className: iconClass,
|
|
413
|
+
"aria-hidden": "true",
|
|
414
|
+
children: "more_horiz"
|
|
415
|
+
}
|
|
416
|
+
)
|
|
417
|
+
}
|
|
418
|
+
)
|
|
419
|
+
}
|
|
420
|
+
)
|
|
421
|
+
] })
|
|
422
|
+
},
|
|
423
|
+
thread.id
|
|
424
|
+
);
|
|
425
|
+
})
|
|
426
|
+
}
|
|
427
|
+
)
|
|
428
|
+
]
|
|
429
|
+
},
|
|
430
|
+
group.label ?? index
|
|
431
|
+
)
|
|
432
|
+
),
|
|
433
|
+
moreLabel && /* @__PURE__ */ jsx(
|
|
434
|
+
"button",
|
|
435
|
+
{
|
|
436
|
+
type: "button",
|
|
437
|
+
className: `${baseClass}__more`,
|
|
438
|
+
onClick: onShowMore,
|
|
439
|
+
children: moreLabel
|
|
440
|
+
}
|
|
441
|
+
)
|
|
442
|
+
] }),
|
|
443
|
+
showFooter && /* @__PURE__ */ jsxs("div", { className: `${baseClass}__footer`, children: [
|
|
444
|
+
footerSlot && /* @__PURE__ */ jsx("div", { className: `${baseClass}__footer-slot`, children: footerSlot }),
|
|
445
|
+
profile && /* @__PURE__ */ jsxs(
|
|
446
|
+
"div",
|
|
447
|
+
{
|
|
448
|
+
className: `${baseClass}__profile`,
|
|
449
|
+
title: expanded ? void 0 : profile.name,
|
|
450
|
+
children: [
|
|
451
|
+
profile.avatar ?? /* @__PURE__ */ jsx(Avatar, { name: profile.name, size: "sm" }),
|
|
452
|
+
/* @__PURE__ */ jsx("span", { className: `${baseClass}__profile-name`, children: profile.name }),
|
|
453
|
+
profile.meta && /* @__PURE__ */ jsx("span", { className: `${baseClass}__profile-meta`, children: profile.meta })
|
|
454
|
+
]
|
|
455
|
+
}
|
|
456
|
+
)
|
|
457
|
+
] })
|
|
458
|
+
]
|
|
459
|
+
}
|
|
460
|
+
);
|
|
461
|
+
}
|
|
462
|
+
);
|
|
463
|
+
ThreadPanel.displayName = "ThreadPanel";
|
|
464
|
+
export {
|
|
465
|
+
ThreadPanel
|
|
466
|
+
};
|