@flikk/ui 1.0.0-beta.31 → 1.0.0-beta.32
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/CHANGELOG.md +295 -22
- package/dist/components/ai/AgentRequest/AgentRequest.animations.d.ts +25 -0
- package/dist/components/ai/AgentRequest/AgentRequest.animations.js +81 -0
- package/dist/components/ai/AgentRequest/AgentRequest.d.ts +3 -0
- package/dist/components/ai/AgentRequest/AgentRequest.js +435 -0
- package/dist/components/ai/AgentRequest/AgentRequest.theme.d.ts +2 -0
- package/dist/components/ai/AgentRequest/AgentRequest.theme.js +106 -0
- package/dist/components/ai/AgentRequest/AgentRequest.types.d.ts +241 -0
- package/dist/components/ai/AgentRequest/index.d.ts +3 -0
- package/dist/components/ai/CodeBlock/CodeBlock.theme.js +1 -1
- package/dist/components/ai/PromptInput/PromptInput.js +2 -2
- package/dist/components/ai/PromptInput/PromptInput.theme.js +2 -2
- package/dist/components/ai/PromptSuggestion/PromptSuggestion.theme.js +2 -2
- package/dist/components/ai/Reasoning/Reasoning.js +27 -3
- package/dist/components/ai/Reasoning/Reasoning.theme.d.ts +6 -0
- package/dist/components/ai/Reasoning/Reasoning.theme.js +36 -0
- package/dist/components/ai/Reasoning/Reasoning.types.d.ts +58 -5
- package/dist/components/ai/Reasoning/ReasoningTrace.d.ts +11 -0
- package/dist/components/ai/Reasoning/ReasoningTrace.js +84 -0
- package/dist/components/ai/Reasoning/index.d.ts +2 -1
- package/dist/components/ai/StreamingResponse/AnimatedText.d.ts +7 -0
- package/dist/components/ai/StreamingResponse/AnimatedText.js +8 -7
- package/dist/components/ai/StreamingResponse/MarkdownRenderer.d.ts +5 -0
- package/dist/components/ai/StreamingResponse/MarkdownRenderer.js +4 -4
- package/dist/components/ai/StreamingResponse/StreamingCursor.d.ts +2 -2
- package/dist/components/ai/StreamingResponse/StreamingCursor.js +10 -7
- package/dist/components/ai/StreamingResponse/StreamingResponse.animations.d.ts +10 -0
- package/dist/components/ai/StreamingResponse/StreamingResponse.animations.js +59 -33
- package/dist/components/ai/StreamingResponse/StreamingResponse.js +13 -7
- package/dist/components/ai/StreamingResponse/StreamingResponse.types.d.ts +33 -2
- package/dist/components/ai/StreamingResponse/StreamingSurface.d.ts +13 -0
- package/dist/components/ai/StreamingResponse/StreamingSurface.js +38 -0
- package/dist/components/ai/StreamingResponse/WordAnimationContext.d.ts +5 -0
- package/dist/components/ai/StreamingResponse/WordAnimationContext.js +5 -4
- package/dist/components/ai/StreamingResponse/index.d.ts +4 -2
- package/dist/components/ai/TokenCounter/TokenCounter.theme.js +1 -1
- package/dist/components/ai/index.d.ts +3 -2
- package/dist/components/ai/index.js +4 -0
- package/dist/components/canvas/BaseNode.js +1 -1
- package/dist/components/canvas/CanvasToolbar.js +0 -1
- package/dist/components/canvas/Edge.js +2 -2
- package/dist/components/canvas/NodeControls.js +0 -1
- package/dist/components/canvas/NodeRenderer.js +2 -2
- package/dist/components/charts/ActivityRings/ActivityRings.js +2 -2
- package/dist/components/charts/ActivityRings/ActivityRings.theme.js +1 -1
- package/dist/components/charts/AreaChart/AreaChart.js +3 -3
- package/dist/components/charts/AreaChart/AreaChart.theme.js +3 -3
- package/dist/components/charts/BarChart/BarChart.js +4 -4
- package/dist/components/charts/ComboChart/BarRenderer.js +2 -2
- package/dist/components/charts/ComboChart/BarRenderer.types.d.ts +1 -1
- package/dist/components/charts/ComboChart/ComboChartCanvas.js +1 -1
- package/dist/components/charts/ComboChart/LineRenderer.js +1 -1
- package/dist/components/charts/ComboChart/LineRenderer.types.d.ts +1 -1
- package/dist/components/charts/DonutChart/DonutChart.theme.js +4 -4
- package/dist/components/charts/DonutChart/MultiSegmentDonutChart.theme.js +1 -1
- package/dist/components/charts/Heatmap/Heatmap.js +49 -42
- package/dist/components/charts/Heatmap/Heatmap.theme.d.ts +6 -2
- package/dist/components/charts/Heatmap/Heatmap.theme.js +20 -8
- package/dist/components/charts/Heatmap/Heatmap.types.d.ts +49 -82
- package/dist/components/charts/Heatmap/HeatmapCell.js +30 -81
- package/dist/components/charts/Heatmap/HeatmapLegend.d.ts +7 -6
- package/dist/components/charts/Heatmap/HeatmapLegend.js +6 -6
- package/dist/components/charts/Heatmap/index.d.ts +1 -1
- package/dist/components/charts/Heatmap/utils/heatmapUtils.d.ts +7 -12
- package/dist/components/charts/Heatmap/utils/heatmapUtils.js +16 -61
- package/dist/components/charts/Heatmap/utils/heatmapUtils.test.d.ts +1 -0
- package/dist/components/charts/HorizontalBarChart/HorizontalBarChart.js +1 -1
- package/dist/components/charts/LineChart/LineChart.js +2 -2
- package/dist/components/charts/LollipopChart/LollipopChart.js +1 -1
- package/dist/components/charts/RadarChart/RadarChart.js +1 -1
- package/dist/components/charts/StackedBarChart/StackedBarChart.js +3 -3
- package/dist/components/charts/hooks/useChartAccessibility.js +9 -6
- package/dist/components/charts/index.d.ts +4 -8
- package/dist/components/charts/index.js +2 -4
- package/dist/components/charts/shared/ChartText/ChartText.theme.js +1 -1
- package/dist/components/charts/shared/index.d.ts +1 -1
- package/dist/components/charts/theme/chart.theme.js +3 -3
- package/dist/components/charts/utils/animation-utils.d.ts +12 -7
- package/dist/components/charts/utils/animation-utils.js +19 -19
- package/dist/components/core/Accordion/Accordion.theme.js +1 -1
- package/dist/components/core/Alert/Alert.animations.d.ts +11 -4
- package/dist/components/core/Alert/Alert.animations.js +11 -4
- package/dist/components/core/Alert/Alert.js +16 -2
- package/dist/components/core/Alert/Alert.theme.js +1 -1
- package/dist/components/core/Alert/Alert.types.d.ts +4 -2
- package/dist/components/core/AlertDialog/AlertDialog.js +2 -2
- package/dist/components/core/Avatar/Avatar.theme.js +1 -1
- package/dist/components/core/Badge/Badge.animations.d.ts +0 -5
- package/dist/components/core/Badge/Badge.animations.js +5 -84
- package/dist/components/core/Badge/Badge.d.ts +7 -4
- package/dist/components/core/Badge/Badge.js +27 -64
- package/dist/components/core/Badge/Badge.theme.js +8 -12
- package/dist/components/core/Badge/Badge.types.d.ts +18 -34
- package/dist/components/core/Breadcrumbs/Breadcrumbs.theme.js +4 -4
- package/dist/components/core/Button/Button.js +7 -43
- package/dist/components/core/Button/Button.theme.js +2 -2
- package/dist/components/core/Button/Button.types.d.ts +8 -12
- package/dist/components/core/Button/index.d.ts +0 -2
- package/dist/components/core/Calendar/Calendar.theme.js +1 -1
- package/dist/components/core/Calendar/CalendarMini/CalendarMini.theme.js +2 -2
- package/dist/components/core/Card/Card.js +7 -2
- package/dist/components/core/Card/Card.theme.js +29 -1
- package/dist/components/core/Card/Card.types.d.ts +20 -0
- package/dist/components/core/Card/CardBody.js +9 -1
- package/dist/components/core/Card/CardContext.d.ts +13 -0
- package/dist/components/core/Card/CardContext.js +14 -0
- package/dist/components/core/Card/CardHeader.js +4 -1
- package/dist/components/core/ContextMenu/ContextMenu.theme.js +4 -3
- package/dist/components/core/ContextMenu/ContextMenu.types.d.ts +8 -1
- package/dist/components/core/ContextMenu/ContextMenuSub.d.ts +11 -1
- package/dist/components/core/ContextMenu/ContextMenuSub.js +35 -22
- package/dist/components/core/ContextMenu/ContextMenuSubBody.js +14 -3
- package/dist/components/core/ContextMenu/ContextMenuSubTrigger.js +21 -8
- package/dist/components/core/DragDrop/DragDrop.theme.js +2 -2
- package/dist/components/core/Drawer/Drawer.theme.js +1 -1
- package/dist/components/core/Drawer/DrawerHeader.js +0 -1
- package/dist/components/core/Dropdown/DropdownMenu.js +22 -7
- package/dist/components/core/Link/Link.js +1 -1
- package/dist/components/core/Masonry/Masonry.theme.js +1 -1
- package/dist/components/core/MenuItem/MenuItem.js +2 -1
- package/dist/components/core/MenuItem/MenuItem.theme.js +13 -1
- package/dist/components/core/Message/Message.js +2 -0
- package/dist/components/core/Message/Message.theme.js +3 -3
- package/dist/components/core/Modal/Modal.animations.d.ts +1 -1
- package/dist/components/core/Modal/Modal.animations.js +50 -11
- package/dist/components/core/Modal/Modal.js +5 -1
- package/dist/components/core/Modal/Modal.theme.js +1 -1
- package/dist/components/core/Modal/ModalHeader.js +0 -1
- package/dist/components/core/ModalStack/ModalStackModal.js +3 -1
- package/dist/components/core/NavItem/NavItem.js +3 -2
- package/dist/components/core/NavItem/NavItem.theme.js +1 -1
- package/dist/components/core/OfflineIndicator/OfflineIndicator.theme.js +4 -2
- package/dist/components/core/PageHeading/PageHeading.theme.js +1 -1
- package/dist/components/core/Pagination/Pagination.theme.js +2 -2
- package/dist/components/core/Pill/Pill.js +2 -1
- package/dist/components/core/Pill/Pill.theme.js +4 -2
- package/dist/components/core/Popover/PopoverBody.js +16 -5
- package/dist/components/core/Progress/Progress.d.ts +0 -25
- package/dist/components/core/Progress/Progress.js +79 -11
- package/dist/components/core/Progress/Progress.theme.js +17 -0
- package/dist/components/core/Progress/Progress.types.d.ts +47 -1
- package/dist/components/core/Rating/Rating.theme.js +1 -1
- package/dist/components/core/Rating/Rating.types.d.ts +3 -2
- package/dist/components/core/ScrollArea/ScrollArea.js +1 -1
- package/dist/components/core/ScrollArea/ScrollArea.theme.js +1 -1
- package/dist/components/core/Segmented/Segmented.theme.js +3 -3
- package/dist/components/core/Segmented/SegmentedContext.js +1 -0
- package/dist/components/core/Sidebar/Sidebar.js +5 -2
- package/dist/components/core/Sidebar/Sidebar.theme.js +2 -2
- package/dist/components/core/Sidebar/SidebarContent.js +1 -1
- package/dist/components/core/Sidebar/SidebarHeader.js +1 -1
- package/dist/components/core/Sidebar/SidebarSearch.js +2 -2
- package/dist/components/core/Sidebar/SidebarToggle.js +1 -1
- package/dist/components/core/Sidebar/SidebarUserProfile.js +1 -1
- package/dist/components/core/Sortable/Sortable.theme.js +1 -1
- package/dist/components/core/Tabs/Tabs.theme.js +1 -1
- package/dist/components/core/Tag/Tag.theme.js +1 -1
- package/dist/components/core/Toast/ToastProvider.js +1 -1
- package/dist/components/core/Tree/Tree.theme.js +1 -1
- package/dist/components/core/index.d.ts +0 -2
- package/dist/components/core/index.js +0 -4
- package/dist/components/core/shared/ChartTooltip/ChartTooltip.animations.d.ts +4 -0
- package/dist/components/core/shared/ChartTooltip/ChartTooltip.animations.js +20 -0
- package/dist/components/{charts → core}/shared/ChartTooltip/ChartTooltip.js +1 -1
- package/dist/components/core/shared/Ripple.d.ts +16 -0
- package/dist/components/core/shared/Ripple.js +141 -0
- package/dist/components/data-display/GanttChart/GanttChart.theme.js +6 -6
- package/dist/components/data-display/GanttChart/GanttTaskBar.js +1 -1
- package/dist/components/data-display/GanttChart/GanttTimelineHeader.js +1 -1
- package/dist/components/data-display/GanttChart/GanttToolbar.js +0 -1
- package/dist/components/data-display/KPI/KPI.js +11 -20
- package/dist/components/data-display/KPI/KPI.theme.js +8 -4
- package/dist/components/data-display/Metric/Metric.theme.js +4 -4
- package/dist/components/data-display/Table/Table.theme.js +2 -2
- package/dist/components/data-display/Table/TableColumnManager.js +1 -2
- package/dist/components/data-display/Table/TableContext.js +1 -0
- package/dist/components/data-display/Table/TableFilter.js +9 -2
- package/dist/components/data-display/Table/TableSelectionHeader.js +1 -1
- package/dist/components/data-display/Timeline/Timeline.theme.js +1 -1
- package/dist/components/effects/CustomCursor/CustomCursor.d.ts +1 -1
- package/dist/components/effects/CustomCursor/CustomCursor.js +1 -1
- package/dist/components/effects/CustomCursor/CustomCursor.theme.js +4 -4
- package/dist/components/effects/Neumorphic/InsetCircleButton.js +1 -1
- package/dist/components/effects/Overlay/Overlay.js +7 -3
- package/dist/components/effects/index.d.ts +0 -32
- package/dist/components/effects/index.js +0 -16
- package/dist/components/effects/shared/ShaderCanvas/ShaderCanvas.d.ts +0 -2
- package/dist/components/effects/shared/ShaderCanvas/ShaderCanvas.js +1 -93
- package/dist/components/effects/shared/ShaderCanvas/ShaderCanvas.types.d.ts +0 -10
- package/dist/components/effects/shared/ShaderCanvas/index.d.ts +1 -1
- package/dist/components/effects/shared/index.d.ts +1 -3
- package/dist/components/effects/shared/shaderNoise.glsl.d.ts +1 -1
- package/dist/components/effects/shared/shaderNoise.glsl.js +2 -11
- package/dist/components/forms/Checkbox/Checkbox.theme.js +1 -1
- package/dist/components/forms/ColorPicker/ColorPickerHeader.js +1 -1
- package/dist/components/forms/ColorPicker/ColorPickerImage.js +1 -1
- package/dist/components/forms/Combobox/Combobox.js +2 -0
- package/dist/components/forms/DateRangePicker/DateRangePicker.theme.js +1 -1
- package/dist/components/forms/DateRangePicker/DateRangePickerContext.js +1 -0
- package/dist/components/forms/FileUpload/FileUpload.theme.js +2 -2
- package/dist/components/forms/FileUpload/FileUploadProgress.theme.js +1 -1
- package/dist/components/forms/InputAddress/InputAddress.types.d.ts +2 -2
- package/dist/components/forms/Radio/Radio.theme.js +1 -1
- package/dist/components/forms/RichTextEditor/RichTextEditor.d.ts +12 -16
- package/dist/components/forms/RichTextEditor/RichTextEditor.js +165 -1680
- package/dist/components/forms/RichTextEditor/RichTextEditor.theme.d.ts +12 -56
- package/dist/components/forms/RichTextEditor/RichTextEditor.theme.js +60 -118
- package/dist/components/forms/RichTextEditor/RichTextEditor.types.d.ts +62 -126
- package/dist/components/forms/RichTextEditor/RichTextLinkField.d.ts +18 -0
- package/dist/components/forms/RichTextEditor/RichTextLinkField.js +46 -0
- package/dist/components/forms/RichTextEditor/RichTextToolbar.d.ts +15 -0
- package/dist/components/forms/RichTextEditor/RichTextToolbar.js +93 -0
- package/dist/components/forms/RichTextEditor/editorCommands.d.ts +50 -0
- package/dist/components/forms/RichTextEditor/editorCommands.js +58 -0
- package/dist/components/forms/RichTextEditor/editorState.d.ts +19 -0
- package/dist/components/forms/RichTextEditor/editorState.js +103 -0
- package/dist/components/forms/RichTextEditor/index.d.ts +5 -3
- package/dist/components/forms/RichTextEditor/sanitizeHtml.d.ts +38 -0
- package/dist/components/forms/RichTextEditor/sanitizeHtml.js +179 -0
- package/dist/components/forms/RichTextEditor/sanitizeHtml.test.d.ts +1 -0
- package/dist/components/forms/Select/Select.js +4 -4
- package/dist/components/forms/Select/Select.types.d.ts +70 -7
- package/dist/components/forms/Select/useSelectState.d.ts +9 -3
- package/dist/components/forms/Select/useSelectState.js +4 -1
- package/dist/components/forms/SelectableCard/SelectableCard.js +2 -1
- package/dist/components/forms/SelectableCard/SelectableCard.theme.js +1 -1
- package/dist/components/forms/Switch/Switch.theme.js +2 -2
- package/dist/components/forms/TimePicker/TimePicker.theme.js +1 -1
- package/dist/components/forms/TimePicker/TimePickerTrigger.js +1 -1
- package/dist/components/forms/forms.theme.js +19 -5
- package/dist/components/forms/index.js +1 -0
- package/dist/components/generative/FormShell.d.ts +22 -0
- package/dist/components/generative/FormShell.js +102 -0
- package/dist/components/generative/GenerativeView.d.ts +52 -1
- package/dist/components/generative/GenerativeView.js +203 -11
- package/dist/components/generative/actions.d.ts +5 -0
- package/dist/components/generative/ai-sdk/index.d.ts +1 -0
- package/dist/components/generative/ai-sdk/index.js +1 -0
- package/dist/components/generative/ai-sdk/useGenerativeChat.d.ts +52 -0
- package/dist/components/generative/ai-sdk/useGenerativeChat.js +73 -0
- package/dist/components/generative/ai-sdk/useGenerativeChat.test.d.ts +1 -0
- package/dist/components/generative/fieldBinding.d.ts +31 -0
- package/dist/components/generative/fieldBinding.js +33 -0
- package/dist/components/generative/fieldBinding.test.d.ts +1 -0
- package/dist/components/generative/formScope.d.ts +71 -0
- package/dist/components/generative/formScope.js +135 -0
- package/dist/components/generative/index.d.ts +4 -0
- package/dist/components/generative/index.js +4 -0
- package/dist/components/generative/registry.d.ts +2 -0
- package/dist/components/generative/registry.js +10 -10
- package/dist/components/generative/schema.generated.js +178 -292
- package/dist/components/generative/toToolResult.d.ts +21 -0
- package/dist/components/generative/toToolResult.js +15 -0
- package/dist/components/generative/toToolResult.test.d.ts +1 -0
- package/dist/components/generative/validate.d.ts +10 -1
- package/dist/components/generative/validate.js +126 -11
- package/dist/components/layout/Grid/Grid.js +1 -0
- package/dist/components/layout/Section/Section.theme.js +1 -1
- package/dist/components/layout/Stack/Stack.js +1 -0
- package/dist/generative.schema.json +178 -292
- package/dist/index.js +1 -4
- package/dist/registry.json +2599 -2375
- package/dist/shadcn-compat.css +5 -5
- package/dist/styles/theme.test.d.ts +1 -0
- package/dist/styles.css +1 -1
- package/dist/test/render.d.ts +17 -0
- package/dist/themes/precision.css +232 -0
- package/dist/tools.json +179 -294
- package/dist/utils/index.d.ts +0 -1
- package/package.json +31 -1
- package/src/global.scss +21 -28
- package/src/styles/theme.css +124 -41
- package/src/styles/theme.test.ts +119 -0
- package/tailwind.preset.cjs +30 -20
- package/dist/components/charts/FunnelChart/FunnelChart.animations.d.ts +0 -35
- package/dist/components/charts/FunnelChart/FunnelChart.animations.js +0 -59
- package/dist/components/charts/FunnelChart/FunnelChart.d.ts +0 -8
- package/dist/components/charts/FunnelChart/FunnelChart.js +0 -410
- package/dist/components/charts/FunnelChart/FunnelChart.theme.d.ts +0 -2
- package/dist/components/charts/FunnelChart/FunnelChart.theme.js +0 -12
- package/dist/components/charts/FunnelChart/FunnelChart.types.d.ts +0 -105
- package/dist/components/charts/FunnelChart/index.d.ts +0 -4
- package/dist/components/charts/ScatterPlot/ScatterPlot.d.ts +0 -9
- package/dist/components/charts/ScatterPlot/ScatterPlot.js +0 -208
- package/dist/components/charts/ScatterPlot/ScatterPlot.theme.d.ts +0 -18
- package/dist/components/charts/ScatterPlot/ScatterPlot.theme.js +0 -42
- package/dist/components/charts/ScatterPlot/ScatterPlot.types.d.ts +0 -60
- package/dist/components/charts/ScatterPlot/ScatterPlot.types.js +0 -19
- package/dist/components/charts/ScatterPlot/index.d.ts +0 -3
- package/dist/components/core/Button/Button.ripple.d.ts +0 -71
- package/dist/components/core/Button/Button.ripple.js +0 -236
- package/dist/components/core/Calendar/CalendarEvent/CalendarEvent.d.ts +0 -4
- package/dist/components/core/Calendar/CalendarEvent/CalendarEvent.theme.d.ts +0 -12
- package/dist/components/core/Calendar/CalendarEvent/CalendarEvent.types.d.ts +0 -23
- package/dist/components/core/Calendar/CalendarEvent/index.d.ts +0 -2
- package/dist/components/core/CardStack/CardStack.animations.d.ts +0 -47
- package/dist/components/core/CardStack/CardStack.d.ts +0 -3
- package/dist/components/core/CardStack/CardStack.js +0 -187
- package/dist/components/core/CardStack/CardStack.theme.d.ts +0 -6
- package/dist/components/core/CardStack/CardStack.theme.js +0 -33
- package/dist/components/core/CardStack/CardStack.types.d.ts +0 -139
- package/dist/components/core/CardStack/index.d.ts +0 -7
- package/dist/components/core/Carousel/Carousel.d.ts +0 -3
- package/dist/components/core/Carousel/Carousel.js +0 -83
- package/dist/components/core/Carousel/Carousel.theme.d.ts +0 -10
- package/dist/components/core/Carousel/Carousel.theme.js +0 -20
- package/dist/components/core/Carousel/Carousel.types.d.ts +0 -113
- package/dist/components/core/Carousel/CarouselBody.d.ts +0 -4
- package/dist/components/core/Carousel/CarouselBody.js +0 -59
- package/dist/components/core/Carousel/CarouselContext.d.ts +0 -3
- package/dist/components/core/Carousel/CarouselContext.js +0 -13
- package/dist/components/core/Carousel/CarouselItem.d.ts +0 -4
- package/dist/components/core/Carousel/CarouselItem.js +0 -11
- package/dist/components/core/Carousel/CarouselNext.d.ts +0 -4
- package/dist/components/core/Carousel/CarouselNext.js +0 -16
- package/dist/components/core/Carousel/CarouselPrevious.d.ts +0 -4
- package/dist/components/core/Carousel/CarouselPrevious.js +0 -16
- package/dist/components/core/Carousel/index.d.ts +0 -3
- package/dist/components/effects/ColorPanels/ColorPanels.d.ts +0 -8
- package/dist/components/effects/ColorPanels/ColorPanels.js +0 -66
- package/dist/components/effects/ColorPanels/ColorPanels.shaders.d.ts +0 -12
- package/dist/components/effects/ColorPanels/ColorPanels.shaders.js +0 -218
- package/dist/components/effects/ColorPanels/ColorPanels.types.d.ts +0 -29
- package/dist/components/effects/ColorPanels/ColorPanels.types.js +0 -3
- package/dist/components/effects/ColorPanels/index.d.ts +0 -2
- package/dist/components/effects/FlutedGlass/FlutedGlass.d.ts +0 -9
- package/dist/components/effects/FlutedGlass/FlutedGlass.js +0 -80
- package/dist/components/effects/FlutedGlass/FlutedGlass.shaders.d.ts +0 -12
- package/dist/components/effects/FlutedGlass/FlutedGlass.shaders.js +0 -335
- package/dist/components/effects/FlutedGlass/FlutedGlass.types.d.ts +0 -61
- package/dist/components/effects/FlutedGlass/FlutedGlass.types.js +0 -16
- package/dist/components/effects/FlutedGlass/index.d.ts +0 -3
- package/dist/components/effects/GlassEffect/GlassEffect.d.ts +0 -15
- package/dist/components/effects/GlassEffect/GlassEffect.js +0 -38
- package/dist/components/effects/GlassEffect/GlassEffect.types.d.ts +0 -19
- package/dist/components/effects/GlassEffect/index.d.ts +0 -2
- package/dist/components/effects/GlassSurface/GlassSurface.d.ts +0 -8
- package/dist/components/effects/GlassSurface/GlassSurface.js +0 -250
- package/dist/components/effects/GlassSurface/GlassSurface.types.d.ts +0 -66
- package/dist/components/effects/GlassSurface/index.d.ts +0 -2
- package/dist/components/effects/GodRays/GodRays.d.ts +0 -8
- package/dist/components/effects/GodRays/GodRays.js +0 -68
- package/dist/components/effects/GodRays/GodRays.shaders.d.ts +0 -10
- package/dist/components/effects/GodRays/GodRays.shaders.js +0 -128
- package/dist/components/effects/GodRays/GodRays.types.d.ts +0 -25
- package/dist/components/effects/GodRays/GodRays.types.js +0 -3
- package/dist/components/effects/GodRays/index.d.ts +0 -2
- package/dist/components/effects/GridPattern/GridPattern.d.ts +0 -18
- package/dist/components/effects/GridPattern/GridPattern.js +0 -65
- package/dist/components/effects/GridPattern/GridPattern.types.d.ts +0 -47
- package/dist/components/effects/GridPattern/index.d.ts +0 -2
- package/dist/components/effects/HalftoneCmyk/HalftoneCmyk.d.ts +0 -10
- package/dist/components/effects/HalftoneCmyk/HalftoneCmyk.js +0 -78
- package/dist/components/effects/HalftoneCmyk/HalftoneCmyk.shaders.d.ts +0 -22
- package/dist/components/effects/HalftoneCmyk/HalftoneCmyk.shaders.js +0 -239
- package/dist/components/effects/HalftoneCmyk/HalftoneCmyk.types.d.ts +0 -52
- package/dist/components/effects/HalftoneCmyk/index.d.ts +0 -2
- package/dist/components/effects/HalftoneDots/HalftoneDots.d.ts +0 -9
- package/dist/components/effects/HalftoneDots/HalftoneDots.js +0 -68
- package/dist/components/effects/HalftoneDots/HalftoneDots.shaders.d.ts +0 -13
- package/dist/components/effects/HalftoneDots/HalftoneDots.shaders.js +0 -296
- package/dist/components/effects/HalftoneDots/HalftoneDots.types.d.ts +0 -43
- package/dist/components/effects/HalftoneDots/HalftoneDots.types.js +0 -12
- package/dist/components/effects/HalftoneDots/index.d.ts +0 -3
- package/dist/components/effects/ImageDithering/ImageDithering.d.ts +0 -9
- package/dist/components/effects/ImageDithering/ImageDithering.js +0 -68
- package/dist/components/effects/ImageDithering/ImageDithering.shaders.d.ts +0 -12
- package/dist/components/effects/ImageDithering/ImageDithering.shaders.js +0 -117
- package/dist/components/effects/ImageDithering/ImageDithering.types.d.ts +0 -30
- package/dist/components/effects/ImageDithering/ImageDithering.types.js +0 -8
- package/dist/components/effects/ImageDithering/index.d.ts +0 -3
- package/dist/components/effects/MagneticElement/MagneticElement.d.ts +0 -30
- package/dist/components/effects/MagneticElement/MagneticElement.js +0 -111
- package/dist/components/effects/MagneticElement/MagneticElement.types.d.ts +0 -44
- package/dist/components/effects/MagneticElement/index.d.ts +0 -2
- package/dist/components/effects/Metaballs/Metaballs.d.ts +0 -8
- package/dist/components/effects/Metaballs/Metaballs.js +0 -59
- package/dist/components/effects/Metaballs/Metaballs.shaders.d.ts +0 -10
- package/dist/components/effects/Metaballs/Metaballs.shaders.js +0 -102
- package/dist/components/effects/Metaballs/Metaballs.types.d.ts +0 -16
- package/dist/components/effects/Metaballs/Metaballs.types.js +0 -3
- package/dist/components/effects/Metaballs/index.d.ts +0 -2
- package/dist/components/effects/PaperTexture/PaperTexture.d.ts +0 -9
- package/dist/components/effects/PaperTexture/PaperTexture.js +0 -61
- package/dist/components/effects/PaperTexture/PaperTexture.shaders.d.ts +0 -22
- package/dist/components/effects/PaperTexture/PaperTexture.shaders.js +0 -145
- package/dist/components/effects/PaperTexture/PaperTexture.types.d.ts +0 -19
- package/dist/components/effects/PaperTexture/index.d.ts +0 -2
- package/dist/components/effects/PulsingBorder/PulsingBorder.d.ts +0 -27
- package/dist/components/effects/PulsingBorder/PulsingBorder.js +0 -174
- package/dist/components/effects/PulsingBorder/PulsingBorder.shaders.d.ts +0 -14
- package/dist/components/effects/PulsingBorder/PulsingBorder.shaders.js +0 -258
- package/dist/components/effects/PulsingBorder/PulsingBorder.types.d.ts +0 -75
- package/dist/components/effects/PulsingBorder/PulsingBorder.types.js +0 -3
- package/dist/components/effects/PulsingBorder/index.d.ts +0 -2
- package/dist/components/effects/SmokeRing/SmokeRing.d.ts +0 -8
- package/dist/components/effects/SmokeRing/SmokeRing.js +0 -62
- package/dist/components/effects/SmokeRing/SmokeRing.shaders.d.ts +0 -14
- package/dist/components/effects/SmokeRing/SmokeRing.shaders.js +0 -130
- package/dist/components/effects/SmokeRing/SmokeRing.types.d.ts +0 -22
- package/dist/components/effects/SmokeRing/SmokeRing.types.js +0 -3
- package/dist/components/effects/SmokeRing/index.d.ts +0 -2
- package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.d.ts +0 -9
- package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.js +0 -59
- package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.shaders.d.ts +0 -14
- package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.shaders.js +0 -129
- package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.types.d.ts +0 -23
- package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.types.js +0 -3
- package/dist/components/effects/StaticGradientMesh/index.d.ts +0 -2
- package/dist/components/effects/Water/Water.d.ts +0 -9
- package/dist/components/effects/Water/Water.js +0 -65
- package/dist/components/effects/Water/Water.shaders.d.ts +0 -11
- package/dist/components/effects/Water/Water.shaders.js +0 -123
- package/dist/components/effects/Water/Water.types.d.ts +0 -25
- package/dist/components/effects/Water/index.d.ts +0 -2
- package/dist/components/effects/shared/bayerMatrices.glsl.d.ts +0 -10
- package/dist/components/effects/shared/bayerMatrices.glsl.js +0 -44
- package/dist/components/effects/shared/imageUV.glsl.d.ts +0 -12
- package/dist/components/effects/shared/imageUV.glsl.js +0 -26
- package/dist/components/forms/RichTextEditor/RichTextEditor.animations.d.ts +0 -7
- package/dist/components/forms/RichTextEditor/RichTextEditor.animations.js +0 -32
- package/dist/utils/calendarUtils.d.ts +0 -60
- /package/dist/components/{charts → core}/shared/ChartTooltip/ChartTooltip.d.ts +0 -0
- /package/dist/components/{charts → core}/shared/ChartTooltip/ChartTooltip.theme.d.ts +0 -0
- /package/dist/components/{charts → core}/shared/ChartTooltip/ChartTooltip.theme.js +0 -0
- /package/dist/components/{charts → core}/shared/ChartTooltip/ChartTooltip.types.d.ts +0 -0
- /package/dist/components/{charts → core}/shared/ChartTooltip/ChartTooltipContent.d.ts +0 -0
- /package/dist/components/{charts → core}/shared/ChartTooltip/index.d.ts +0 -0
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
/**
|
|
3
|
+
* What the agent is asking for.
|
|
4
|
+
*
|
|
5
|
+
* - `approval` — a permission gate. Approve / Deny (+ optional "always allow").
|
|
6
|
+
* - `choice` — pick one of `options`.
|
|
7
|
+
* - `input` — free text.
|
|
8
|
+
*/
|
|
9
|
+
export type AgentRequestKind = "approval" | "choice" | "input";
|
|
10
|
+
/**
|
|
11
|
+
* How consequential the action is.
|
|
12
|
+
*
|
|
13
|
+
* The library paints NOTHING for this by default: a destructive question
|
|
14
|
+
* already reads as destructive through its `meta` line and the danger-outlined
|
|
15
|
+
* Deny action, and a coloured accent on top of those was noise. `destructive`
|
|
16
|
+
* lands on the row as `data-risk="destructive"` so a consumer can style it.
|
|
17
|
+
*/
|
|
18
|
+
export type AgentRequestRisk = "normal" | "destructive";
|
|
19
|
+
/**
|
|
20
|
+
* How a question was settled.
|
|
21
|
+
*
|
|
22
|
+
* `deferred` is the escape hatch: the user declined to answer here (Skip). It
|
|
23
|
+
* is a first-class outcome, not a cancel — a composer takeover that cannot be
|
|
24
|
+
* escaped traps a user whose real answer isn't one of the offered options,
|
|
25
|
+
* which is also why a choice question can carry `allowOther`.
|
|
26
|
+
*/
|
|
27
|
+
export type AgentRequestOutcome = "resolved" | "rejected" | "deferred";
|
|
28
|
+
export interface AgentRequestOption {
|
|
29
|
+
/** Serializable value handed back to `onAnswer`. */
|
|
30
|
+
value: string;
|
|
31
|
+
label: React.ReactNode;
|
|
32
|
+
/** Secondary line under the label — the trade-off, cost, or consequence. */
|
|
33
|
+
description?: React.ReactNode;
|
|
34
|
+
}
|
|
35
|
+
/** Fields every question kind shares. */
|
|
36
|
+
export interface AgentRequestQuestionBase {
|
|
37
|
+
/** Stable identity. Required — answers are keyed by it, not by index. */
|
|
38
|
+
id: string;
|
|
39
|
+
/**
|
|
40
|
+
* Short summary shown in the collapsed row once answered, and in the
|
|
41
|
+
* dimmed row while pending. Keep it to a few words.
|
|
42
|
+
*/
|
|
43
|
+
label: React.ReactNode;
|
|
44
|
+
/** The full question. Falls back to `label` when omitted. */
|
|
45
|
+
question?: React.ReactNode;
|
|
46
|
+
/** Secondary context line under the question. */
|
|
47
|
+
meta?: React.ReactNode;
|
|
48
|
+
/** @default "normal" */
|
|
49
|
+
risk?: AgentRequestRisk;
|
|
50
|
+
/**
|
|
51
|
+
* What is actually being approved — a command, a diff, a params list.
|
|
52
|
+
* Rendered in a monospace well. `ReactNode` on purpose: this is the one slot
|
|
53
|
+
* where a consumer legitimately needs to render their own component
|
|
54
|
+
* (a diff view, a table), so it is NOT part of the serializable schema.
|
|
55
|
+
*/
|
|
56
|
+
payload?: React.ReactNode;
|
|
57
|
+
}
|
|
58
|
+
export interface AgentRequestApprovalQuestion extends AgentRequestQuestionBase {
|
|
59
|
+
/** @default "approval" */
|
|
60
|
+
kind?: "approval";
|
|
61
|
+
/** Overrides for the built-in action labels (i18n — §6: never trap strings). */
|
|
62
|
+
approveLabel?: string;
|
|
63
|
+
denyLabel?: string;
|
|
64
|
+
alwaysAllowLabel?: string;
|
|
65
|
+
/** Show the "always allow" action. @default false */
|
|
66
|
+
allowAlways?: boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Renders a Skip action, recorded as `deferred`. @default false
|
|
69
|
+
*
|
|
70
|
+
* An approval has no free-text row to fall back on — Approve and Deny are
|
|
71
|
+
* both real answers — so this is its ONLY escape hatch, and a permission gate
|
|
72
|
+
* the user can neither approve, deny, nor step away from is the trap the
|
|
73
|
+
* `deferred` outcome exists to prevent.
|
|
74
|
+
*/
|
|
75
|
+
optional?: boolean;
|
|
76
|
+
skipLabel?: string;
|
|
77
|
+
}
|
|
78
|
+
/** Fields shared by both choice shapes. */
|
|
79
|
+
export interface AgentRequestChoiceBase extends AgentRequestQuestionBase {
|
|
80
|
+
kind: "choice";
|
|
81
|
+
options: AgentRequestOption[];
|
|
82
|
+
/**
|
|
83
|
+
* Append a free-text "something else" row to the bottom of the option list.
|
|
84
|
+
* Opt-in per question, NOT on by default: a closed question ("before or
|
|
85
|
+
* during the rollout?") is closed on purpose, and only the author of the
|
|
86
|
+
* question knows whether an answer off the list is meaningful. The typed
|
|
87
|
+
* answer is recorded as `resolved` with the text as its value.
|
|
88
|
+
* @default false
|
|
89
|
+
*/
|
|
90
|
+
allowOther?: boolean;
|
|
91
|
+
/** Placeholder for the "something else" row. @default "Something else" */
|
|
92
|
+
otherPlaceholder?: string;
|
|
93
|
+
/** Label for the action that submits the "something else" text. @default "Send" */
|
|
94
|
+
otherSubmitLabel?: string;
|
|
95
|
+
/** Renders a Skip action. @default false */
|
|
96
|
+
optional?: boolean;
|
|
97
|
+
skipLabel?: string;
|
|
98
|
+
}
|
|
99
|
+
/** Pick exactly one — answers on selection. */
|
|
100
|
+
export interface AgentRequestSingleChoiceQuestion extends AgentRequestChoiceBase {
|
|
101
|
+
multiple?: false;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Pick any number.
|
|
105
|
+
*
|
|
106
|
+
* Unlike single-choice this CANNOT auto-advance on click (the user isn't done
|
|
107
|
+
* until they say so), so it always renders an explicit confirm action.
|
|
108
|
+
*/
|
|
109
|
+
export interface AgentRequestMultiChoiceQuestion extends AgentRequestChoiceBase {
|
|
110
|
+
multiple: true;
|
|
111
|
+
/** Minimum selections before confirm enables. @default 0 */
|
|
112
|
+
minSelected?: number;
|
|
113
|
+
/** Maximum selections; further boxes disable once reached. */
|
|
114
|
+
maxSelected?: number;
|
|
115
|
+
confirmLabel?: string;
|
|
116
|
+
}
|
|
117
|
+
export interface AgentRequestInputQuestion extends AgentRequestQuestionBase {
|
|
118
|
+
kind: "input";
|
|
119
|
+
placeholder?: string;
|
|
120
|
+
/** Renders a Skip action. @default false */
|
|
121
|
+
optional?: boolean;
|
|
122
|
+
submitLabel?: string;
|
|
123
|
+
skipLabel?: string;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* 🔴 A discriminated union, not one widened interface — `multiple` genuinely
|
|
127
|
+
* changes the shape of the ANSWER (`string` vs `string[]`), which §9 requires
|
|
128
|
+
* be modelled as a union rather than widened-and-cast. It also means `options`
|
|
129
|
+
* is required on a choice and meaningless on an approval, enforced by the
|
|
130
|
+
* compiler instead of by convention.
|
|
131
|
+
*/
|
|
132
|
+
export type AgentRequestQuestion = AgentRequestApprovalQuestion | AgentRequestSingleChoiceQuestion | AgentRequestMultiChoiceQuestion | AgentRequestInputQuestion;
|
|
133
|
+
export interface AgentRequestAnswer {
|
|
134
|
+
/** The `id` of the question this answers. */
|
|
135
|
+
id: string;
|
|
136
|
+
/**
|
|
137
|
+
* Serializable answer value. `string[]` for a multi-choice question, `string`
|
|
138
|
+
* for every other kind — narrow with `Array.isArray`.
|
|
139
|
+
*/
|
|
140
|
+
value: string | string[];
|
|
141
|
+
/** Human-readable answer, shown in the collapsed row. */
|
|
142
|
+
label: string;
|
|
143
|
+
outcome: AgentRequestOutcome;
|
|
144
|
+
}
|
|
145
|
+
export interface AgentRequestTheme {
|
|
146
|
+
baseStyle: string;
|
|
147
|
+
/**
|
|
148
|
+
* Geometry only. The panel's surface paint (rung background, elevation
|
|
149
|
+
* shadow, `--field-fill` for the controls inside) comes from `Card` and the
|
|
150
|
+
* relative-elevation engine, not from here.
|
|
151
|
+
*/
|
|
152
|
+
panelStyle: string;
|
|
153
|
+
navStyle: string;
|
|
154
|
+
navButtonStyle: string;
|
|
155
|
+
navCountStyle: string;
|
|
156
|
+
/** The question-as-heading block. */
|
|
157
|
+
headerStyle: string;
|
|
158
|
+
/** Horizontal inset + bottom inset for the swapping question. */
|
|
159
|
+
contentStyle: string;
|
|
160
|
+
questionStyle: string;
|
|
161
|
+
metaStyle: string;
|
|
162
|
+
bodyStyle: string;
|
|
163
|
+
scrollAreaStyle: string;
|
|
164
|
+
fadeStyle: string;
|
|
165
|
+
fadeTopStyle: string;
|
|
166
|
+
fadeBottomStyle: string;
|
|
167
|
+
bodyInnerStyle: string;
|
|
168
|
+
answeredChipStyle: string;
|
|
169
|
+
badgeStyle: string;
|
|
170
|
+
/**
|
|
171
|
+
* Keyed by OUTCOME only. There are no `pending`/`active` badges any more —
|
|
172
|
+
* one question is on screen at a time, so there is no list of other
|
|
173
|
+
* questions to mark up.
|
|
174
|
+
*/
|
|
175
|
+
badgeStates: Record<AgentRequestOutcome, string>;
|
|
176
|
+
answerStyle: string;
|
|
177
|
+
payloadStyle: string;
|
|
178
|
+
actionsStyle: string;
|
|
179
|
+
/** Left-anchored group inside the actions row (Skip). */
|
|
180
|
+
actionsStartStyle: string;
|
|
181
|
+
optionListStyle: string;
|
|
182
|
+
optionStyle: string;
|
|
183
|
+
otherInputStyle: string;
|
|
184
|
+
inputStyle: string;
|
|
185
|
+
}
|
|
186
|
+
export type AgentRequestThemeOverrides = Omit<Partial<AgentRequestTheme>, "badgeStates"> & {
|
|
187
|
+
badgeStates?: Partial<AgentRequestTheme["badgeStates"]>;
|
|
188
|
+
};
|
|
189
|
+
export interface AgentRequestProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange" | "children" | "value" | "defaultValue" | "title"> {
|
|
190
|
+
/**
|
|
191
|
+
* The questions to ask, in order. Data-driven and serializable (except
|
|
192
|
+
* `payload`), so an LLM can emit a whole sequence as JSON.
|
|
193
|
+
*/
|
|
194
|
+
questions?: AgentRequestQuestion[];
|
|
195
|
+
/**
|
|
196
|
+
* Escape hatch for a bespoke single-question body. Ignored when `questions`
|
|
197
|
+
* is provided (dev-warns if both).
|
|
198
|
+
*/
|
|
199
|
+
children?: React.ReactNode;
|
|
200
|
+
/**
|
|
201
|
+
* The panel's accessible name, and only that — it is never painted. The
|
|
202
|
+
* QUESTION is the visible heading, so a second title line would be a heading
|
|
203
|
+
* competing with a heading. Pass a string; this is the i18n override for the
|
|
204
|
+
* default "Agent needs {n} decisions".
|
|
205
|
+
*/
|
|
206
|
+
title?: React.ReactNode;
|
|
207
|
+
/** Controlled answers. */
|
|
208
|
+
value?: AgentRequestAnswer[];
|
|
209
|
+
/** Uncontrolled initial answers. @default [] */
|
|
210
|
+
defaultValue?: AgentRequestAnswer[];
|
|
211
|
+
/** Fires with the full answer list on every change. */
|
|
212
|
+
onValueChange?: (answers: AgentRequestAnswer[]) => void;
|
|
213
|
+
/** Fires once per answered question. */
|
|
214
|
+
onAnswer?: (answer: AgentRequestAnswer) => void;
|
|
215
|
+
/** Fires when the last question is answered. */
|
|
216
|
+
onComplete?: (answers: AgentRequestAnswer[]) => void;
|
|
217
|
+
/**
|
|
218
|
+
* Optional ceiling on the answering controls, as any CSS length. Unset by
|
|
219
|
+
* default: one question is on screen at a time, so the panel simply grows
|
|
220
|
+
* and shrinks to fit it. Set this when a question can be long enough to bury
|
|
221
|
+
* the conversation behind the composer (many options, a large `payload`) —
|
|
222
|
+
* beyond it the options scroll instead of growing, while the question itself
|
|
223
|
+
* stays put above them.
|
|
224
|
+
*/
|
|
225
|
+
maxHeight?: string;
|
|
226
|
+
/** Accessible name for the back arrow. @default "Previous question" */
|
|
227
|
+
previousLabel?: string;
|
|
228
|
+
/** Accessible name for the forward arrow. @default "Next question" */
|
|
229
|
+
nextLabel?: string;
|
|
230
|
+
/**
|
|
231
|
+
* The progress line in the footer. A function rather than a string because it
|
|
232
|
+
* interpolates two numbers, and every visible string in the library has to be
|
|
233
|
+
* overridable for i18n. Whatever it returns is measured, and the actions row
|
|
234
|
+
* insets itself to clear it — a longer label is a layout choice, not a
|
|
235
|
+
* collision.
|
|
236
|
+
* @default "{current} of {total}"
|
|
237
|
+
*/
|
|
238
|
+
progressLabel?: (current: number, total: number) => React.ReactNode;
|
|
239
|
+
className?: string;
|
|
240
|
+
theme?: AgentRequestThemeOverrides;
|
|
241
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { AgentRequest } from "./AgentRequest";
|
|
2
|
+
export { agentRequestTheme } from "./AgentRequest.theme";
|
|
3
|
+
export type { AgentRequestProps, AgentRequestKind, AgentRequestRisk, AgentRequestOutcome, AgentRequestOption, AgentRequestQuestion, AgentRequestAnswer, AgentRequestTheme, AgentRequestThemeOverrides, } from "./AgentRequest.types";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const codeBlockTheme = {
|
|
2
2
|
baseStyle: "relative rounded-[var(--codeblock-radius)] border border-[var(--color-border)] overflow-hidden bg-[var(--color-surface-sunken)] shadow-inner-real-sm",
|
|
3
|
-
header: "flex items-center justify-between px-3 py-1.5 bg-[var(--color-
|
|
3
|
+
header: "flex items-center justify-between px-3 py-1.5 bg-[var(--color-surface)] border-b border-[var(--color-border)]",
|
|
4
4
|
headerLeft: "flex items-center gap-2 min-w-0 flex-1 ",
|
|
5
5
|
headerRight: "flex items-center gap-2 flex-shrink-0",
|
|
6
6
|
filename: "text-sm font-medium text-[var(--color-text-secondary)] truncate",
|
|
@@ -527,7 +527,7 @@ className, textareaClassName, footerClassName, theme = {},
|
|
|
527
527
|
Link,
|
|
528
528
|
].map((Icon, i) => (jsx(motion.div, { variants: dropzoneActionIconVariants, className: "size-8 rounded-full bg-white/30 dark:bg-white/10 flex items-center justify-center", children: jsx(Icon, { className: "size-4 text-[var(--color-primary)]" }) }, i))) }))] })) }), currentAttachments.length > 0 && (jsx("div", { className: "flex flex-wrap gap-2 py-2 px-1", children: currentAttachments.map((attachment) => {
|
|
529
529
|
var _a;
|
|
530
|
-
return (jsxs("div", { className: "relative group rounded-lg border border-[var(--color-border)] bg-white", children: [attachment.type === "image" ? (attachment.isCompressing ? (jsx("div", { className: "size-12 flex items-center justify-center bg-gray-100 rounded-lg", children: jsx("div", { className: "w-4 h-4 border-2 border-gray-300 border-t-[var(--color-primary)] rounded-full animate-spin" }) })) : (jsx("img", { src: attachment.previewUrl, alt: attachment.file.name, className: "size-12 object-cover rounded-lg" }))) : (jsxs("div", { className: "size-12 flex flex-col items-center justify-center text-center p-1 rounded-lg", children: [jsx(File$1, { className: "w-5 h-5 text-[var(--color-text-muted)]" }), jsx("span", { className: "text-[10px] text-[var(--color-text-secondary)] truncate w-full", children: (_a = attachment.file.name.split(".").pop()) === null || _a === void 0 ? void 0 : _a.toUpperCase() })] })), jsx("button", { onClick: () => removeAttachment(attachment.id), className: "absolute -top-1.5 -right-1.5 size-5 rounded-full bg-[var(--color-danger)] text-[var(--color-danger-contrast)] flex items-center justify-center opacity-0 translate-y-1 group-hover:translate-y-0 group-hover:opacity-100 transition-all duration-
|
|
530
|
+
return (jsxs("div", { className: "relative group rounded-lg border border-[var(--color-border)] bg-white", children: [attachment.type === "image" ? (attachment.isCompressing ? (jsx("div", { className: "size-12 flex items-center justify-center bg-gray-100 rounded-lg", children: jsx("div", { className: "w-4 h-4 border-2 border-gray-300 border-t-[var(--color-primary)] rounded-full animate-spin" }) })) : (jsx("img", { src: attachment.previewUrl, alt: attachment.file.name, className: "size-12 object-cover rounded-lg" }))) : (jsxs("div", { className: "size-12 flex flex-col items-center justify-center text-center p-1 rounded-lg", children: [jsx(File$1, { className: "w-5 h-5 text-[var(--color-text-muted)]" }), jsx("span", { className: "text-[10px] text-[var(--color-text-secondary)] truncate w-full", children: (_a = attachment.file.name.split(".").pop()) === null || _a === void 0 ? void 0 : _a.toUpperCase() })] })), jsx("button", { onClick: () => removeAttachment(attachment.id), className: "absolute -top-1.5 -right-1.5 size-5 rounded-full bg-[var(--color-danger)] text-[var(--color-danger-contrast)] flex items-center justify-center opacity-0 translate-y-1 group-hover:translate-y-0 group-hover:opacity-100 transition-all duration-[var(--motion-duration-slow)] ease-in-out cursor-pointer shadow-md", "aria-label": `Remove ${attachment.file.name}`, children: jsx(X, { className: "size-3", weight: "bold" }) })] }, attachment.id));
|
|
531
531
|
}) })), jsxs("div", { className: cn("flex gap-2", variant === "simple" ? "items-end" : "items-start"), children: [jsx(AnimatePresence, { mode: "wait", initial: false, children: isRecording && enableVoiceRecording ? (jsx(motion.div, { variants: textareaSwapVariants, initial: "initial", animate: "animate", exit: "exit", className: "flex-1 min-w-0", children: jsx("p", { className: "text-center text-sm text-[var(--color-text-placeholder)]", children: placeholder }) }, "voice-recorder")) : (jsx(motion.div, { variants: textareaSwapVariants, initial: "initial", animate: "animate", exit: "exit", className: cn("flex-1 min-w-0", variant === "simple" && "flex items-end"), children: jsx(Textarea, { ref: textareaRef, id: id, unstyled: true, value: currentValue, onChange: handleChange, onKeyDown: handleKeyDown, onPaste: handlePaste, placeholder: placeholder, disabled: isDisabled, maxLength: maxLength, rows: rows, "aria-label": ariaLabel || "Prompt input", "aria-describedby": helperTextId, "aria-invalid": isInvalid, "aria-disabled": isDisabled, className: cn(mergedTheme.textareaStyle, variant === "simple" &&
|
|
532
532
|
"!w-auto flex-1 min-w-0 justify-center", textareaClassName), style: {
|
|
533
533
|
minHeight,
|
|
@@ -557,7 +557,7 @@ className, textareaClassName, footerClassName, theme = {},
|
|
|
557
557
|
: internalModel, onSelectionChange: handleModelChange, children: [jsx(Dropdown.Trigger, { children: jsxs(Button, { variant: "outline", color: "mono", size: "sm",
|
|
558
558
|
// Hover + open active state now come from Dropdown.Trigger
|
|
559
559
|
// (unified surface-hover tint). `group` stays for the chevron flip.
|
|
560
|
-
className: "group bg-transparent rounded-full border-0 font-medium text-[var(--color-text-secondary)]", "aria-label": "Select AI model", disabled: isDisabled, children: [modelMap[currentModel] || "Select Model", jsx(CaretDown, { className: "size-3 opacity-80 transition-transform duration-
|
|
560
|
+
className: "group bg-transparent rounded-full border-0 font-medium text-[var(--color-text-secondary)]", "aria-label": "Select AI model", disabled: isDisabled, children: [modelMap[currentModel] || "Select Model", jsx(CaretDown, { className: "size-3 opacity-80 transition-transform duration-[var(--motion-duration-base)] group-aria-[expanded=true]:rotate-180", weight: "bold" })] }) }), jsx(Dropdown.Menu, { children: models.map((model) => (jsx(Dropdown.Item, { itemKey: model.key, startContent: model.icon, children: model.label }, model.key))) })] }))] }), jsx("div", { children: renderSubmitButton("sm", "outline", "mono") })] }, "footer-controls")) }) }))] }), displayHelperText && (jsx("div", { id: helperTextId, className: cn("mt-1 text-sm", isInvalid
|
|
561
561
|
? "text-[var(--color-danger)]"
|
|
562
562
|
: "text-[var(--color-text-muted)]"), role: isInvalid ? "alert" : undefined, "aria-live": isInvalid ? "polite" : undefined, children: displayHelperText }))] }));
|
|
563
563
|
});
|
|
@@ -4,14 +4,14 @@ const promptInputTheme = {
|
|
|
4
4
|
// self-contained here rather than importing the shared forms theme. Border is an inset
|
|
5
5
|
// box-shadow (not `border`/`outline`) so it's clip-safe and reflow-free, like the inputs.
|
|
6
6
|
baseStyle: "relative flex flex-col gap-2 p-4 rounded-[var(--card-radius)] " +
|
|
7
|
-
"bg-white dark:bg-[var(--color-
|
|
7
|
+
"bg-white dark:bg-[var(--color-surface)] transition-all " +
|
|
8
8
|
"outline-none shadow-[inset_0_0_0_1px_var(--color-border)] " +
|
|
9
9
|
"focus-within:shadow-[inset_0_0_0_1px_var(--color-primary-600)] " +
|
|
10
10
|
"focus-within:ring-4 focus-within:ring-[var(--color-primary)]/10 " +
|
|
11
11
|
"not-focus-within:hover:shadow-[inset_0_0_0_1px_var(--color-border-secondary)] " +
|
|
12
12
|
"dark:focus-within:shadow-[inset_0_0_0_1px_var(--color-primary-500)] " +
|
|
13
13
|
"dark:focus-within:ring-[var(--color-primary-500)]/20",
|
|
14
|
-
textareaStyle: "w-full bg-transparent text-sm text-[var(--color-text-primary)] placeholder:text-[var(--color-text-placeholder)] focus:outline-none resize-none overflow-y-auto transition-[height] duration-
|
|
14
|
+
textareaStyle: "w-full bg-transparent text-sm text-[var(--color-text-primary)] placeholder:text-[var(--color-text-placeholder)] focus:outline-none resize-none overflow-y-auto transition-[height] duration-[var(--motion-duration-base)] ease-in-out",
|
|
15
15
|
footerStyle: "flex justify-between items-end",
|
|
16
16
|
actionsStyle: "flex gap-1",
|
|
17
17
|
submitButtonStyle: "rounded-full",
|
|
@@ -3,8 +3,8 @@ const promptSuggestionTheme = {
|
|
|
3
3
|
"bg-[var(--color-surface)] " +
|
|
4
4
|
"border border-[var(--color-border)] " +
|
|
5
5
|
"text-sm text-[var(--color-text-primary)] " +
|
|
6
|
-
"cursor-pointer transition-all duration-
|
|
7
|
-
"hover:bg-[var(--color-
|
|
6
|
+
"cursor-pointer transition-all duration-[var(--motion-duration-slow)] " +
|
|
7
|
+
"hover:bg-[var(--color-surface)] " +
|
|
8
8
|
"focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary)]",
|
|
9
9
|
iconStyle: "size-4 flex-shrink-0",
|
|
10
10
|
};
|
|
@@ -1,10 +1,34 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx } from 'react/jsx-runtime';
|
|
3
|
-
import React__default from 'react';
|
|
3
|
+
import React__default, { useMemo } from 'react';
|
|
4
|
+
import { Sparkle } from '@phosphor-icons/react';
|
|
4
5
|
import { AgentStatus } from '../AgentStatus/AgentStatus.js';
|
|
6
|
+
import { reasoningTheme } from './Reasoning.theme.js';
|
|
7
|
+
import { ReasoningTrace } from './ReasoningTrace.js';
|
|
5
8
|
|
|
6
|
-
// Reasoning
|
|
7
|
-
|
|
9
|
+
// Reasoning keeps AgentStatus's disclosure, timer, live-region, and reduced-motion
|
|
10
|
+
// behavior, then adds a richer trace body for steps, prose, search, and coding.
|
|
11
|
+
const ReasoningRoot = React__default.forwardRef(({ variant = "steps", steps, query, remainingCount, status = "active", icon, indicator, divider = false, children, theme: themeOverrides, ...rest }, ref) => {
|
|
12
|
+
const disclosureTheme = useMemo(() => {
|
|
13
|
+
const overrides = { ...themeOverrides };
|
|
14
|
+
delete overrides.trace;
|
|
15
|
+
return {
|
|
16
|
+
...reasoningTheme.disclosure,
|
|
17
|
+
...overrides,
|
|
18
|
+
stateStyles: {
|
|
19
|
+
...reasoningTheme.disclosure.stateStyles,
|
|
20
|
+
...overrides.stateStyles,
|
|
21
|
+
},
|
|
22
|
+
indicatorStyles: {
|
|
23
|
+
...reasoningTheme.disclosure.indicatorStyles,
|
|
24
|
+
...overrides.indicatorStyles,
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}, [themeOverrides]);
|
|
28
|
+
const traceTheme = useMemo(() => ({ ...reasoningTheme.trace, ...themeOverrides === null || themeOverrides === void 0 ? void 0 : themeOverrides.trace }), [themeOverrides]);
|
|
29
|
+
const body = steps ? (jsx(ReasoningTrace, { variant: variant, steps: steps, query: query, remainingCount: remainingCount, theme: traceTheme })) : (children);
|
|
30
|
+
return (jsx(AgentStatus, { ref: ref, mode: "reasoning", status: status, icon: icon !== null && icon !== void 0 ? icon : (jsx(Sparkle, { "data-reasoning-summary-icon": "", className: "size-3.5", weight: status === "active" ? "fill" : "regular" })), indicator: indicator !== null && indicator !== void 0 ? indicator : true, divider: divider, theme: disclosureTheme, ...rest, children: body }));
|
|
31
|
+
});
|
|
8
32
|
ReasoningRoot.displayName = "Reasoning";
|
|
9
33
|
// A step is just a status row; children carry its text.
|
|
10
34
|
const ReasoningStep = React__default.forwardRef(({ children, status = "complete", ...rest }, ref) => (jsx(AgentStatus, { ref: ref, mode: "status", status: status, label: children, wrap: true, live: "off", ...rest })));
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const reasoningTheme = {
|
|
2
|
+
disclosure: {
|
|
3
|
+
reasoningRootStyle: "w-full min-w-0",
|
|
4
|
+
triggerStyle: "-mx-1.5 flex w-fit max-w-full items-center rounded-[var(--form-radius)] px-1.5 py-1 text-left " +
|
|
5
|
+
"transition-colors duration-[var(--motion-duration-fast)] ease-out hover:bg-[var(--color-surface-hover)] " +
|
|
6
|
+
"focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary)]",
|
|
7
|
+
triggerContentStyle: "inline-flex min-w-0 items-center gap-1.5",
|
|
8
|
+
chevronStyle: "inline-flex size-3.5 shrink-0 items-center justify-center text-[var(--color-text-muted)]",
|
|
9
|
+
dividerStyle: "hidden",
|
|
10
|
+
contentStyle: "w-full min-w-0 overflow-hidden",
|
|
11
|
+
contentInnerStyle: "w-full min-w-0 pt-1",
|
|
12
|
+
proseStyle: "flex flex-col gap-2 pl-5 text-sm leading-relaxed text-[var(--color-text-secondary)] [&_p]:m-0",
|
|
13
|
+
},
|
|
14
|
+
trace: {
|
|
15
|
+
traceStyle: "relative min-w-0 py-1",
|
|
16
|
+
guideStyle: "pointer-events-none absolute bottom-3 left-[13px] top-3 w-px bg-[var(--color-border)]",
|
|
17
|
+
listStyle: "relative flex min-w-0 flex-col gap-0.5",
|
|
18
|
+
itemStyle: "relative flex min-h-7 min-w-0 items-start gap-2 rounded-[calc(var(--radius-base)*0.75)] px-1.5 py-1 text-left",
|
|
19
|
+
interactiveItemStyle: "transition-colors duration-[var(--motion-duration-fast)] ease-out hover:bg-[var(--color-surface-hover)] " +
|
|
20
|
+
"focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-[var(--color-primary)]",
|
|
21
|
+
indicatorStyle: "relative z-10 mt-0.5 flex size-3.5 shrink-0 items-center justify-center",
|
|
22
|
+
indicatorSurfaceStyle: "rounded-full bg-[var(--color-surface)] ring-2 ring-[var(--color-surface)]",
|
|
23
|
+
primaryStyle: "min-w-0 flex-1 text-sm font-medium leading-5 text-[var(--color-text-primary)]",
|
|
24
|
+
reasoningPrimaryStyle: "min-w-0 flex-1 text-sm font-normal leading-relaxed text-[var(--color-text-secondary)]",
|
|
25
|
+
secondaryStyle: "shrink-0 text-xs leading-5 text-[var(--color-text-muted)]",
|
|
26
|
+
queryStyle: "mb-0.5 flex min-h-7 min-w-0 items-center gap-2 rounded-[calc(var(--radius-base)*0.75)] px-1.5 py-1",
|
|
27
|
+
queryIconStyle: "ml-px flex size-3.5 shrink-0 items-center justify-center text-[var(--color-text-muted)]",
|
|
28
|
+
queryTextStyle: "min-w-0 truncate text-sm leading-5 text-[var(--color-text-secondary)]",
|
|
29
|
+
diffStyle: "shrink-0 font-mono text-xs leading-5 tabular-nums",
|
|
30
|
+
additionsStyle: "text-[var(--color-success)]",
|
|
31
|
+
deletionsStyle: "text-[var(--color-danger)]",
|
|
32
|
+
remainingStyle: "ml-5 px-1.5 py-1 text-xs text-[var(--color-text-muted)]",
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export { reasoningTheme };
|
|
@@ -1,14 +1,67 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import type { AgentStatusProps, AgentStatusState,
|
|
2
|
+
import type { AgentStatusProps, AgentStatusState, AgentStatusThemeOverrides } from "../AgentStatus";
|
|
3
|
+
export type ReasoningVariant = "steps" | "reasoning" | "search" | "coding";
|
|
4
|
+
export type ReasoningStepKind = "step" | "source" | "read" | "edit" | "command";
|
|
5
|
+
export interface ReasoningTraceTheme {
|
|
6
|
+
traceStyle: string;
|
|
7
|
+
guideStyle: string;
|
|
8
|
+
listStyle: string;
|
|
9
|
+
itemStyle: string;
|
|
10
|
+
interactiveItemStyle: string;
|
|
11
|
+
indicatorStyle: string;
|
|
12
|
+
indicatorSurfaceStyle: string;
|
|
13
|
+
primaryStyle: string;
|
|
14
|
+
reasoningPrimaryStyle: string;
|
|
15
|
+
secondaryStyle: string;
|
|
16
|
+
queryStyle: string;
|
|
17
|
+
queryIconStyle: string;
|
|
18
|
+
queryTextStyle: string;
|
|
19
|
+
diffStyle: string;
|
|
20
|
+
additionsStyle: string;
|
|
21
|
+
deletionsStyle: string;
|
|
22
|
+
remainingStyle: string;
|
|
23
|
+
}
|
|
3
24
|
/**
|
|
4
25
|
* Reasoning is a preset of AgentStatus fixed to `mode="reasoning"` — the
|
|
5
26
|
* collapsible "show the AI's thinking" disclosure. Every AgentStatus prop
|
|
6
27
|
* except `mode` applies.
|
|
7
28
|
*/
|
|
8
|
-
export
|
|
9
|
-
/**
|
|
10
|
-
|
|
11
|
-
|
|
29
|
+
export interface ReasoningProps extends Omit<AgentStatusProps, "mode" | "steps" | "theme"> {
|
|
30
|
+
/** Trace presentation. @default "steps" */
|
|
31
|
+
variant?: ReasoningVariant;
|
|
32
|
+
/** Structured trace rows. Existing `{ label, status, duration }` rows remain valid. */
|
|
33
|
+
steps?: ReasoningStepData[];
|
|
34
|
+
/** Search query shown before source rows when `variant="search"`. */
|
|
35
|
+
query?: React.ReactNode;
|
|
36
|
+
/** Additional undisclosed results, rendered as “+N more”. */
|
|
37
|
+
remainingCount?: number;
|
|
38
|
+
theme?: ReasoningThemeOverrides;
|
|
39
|
+
}
|
|
40
|
+
/** A structured reasoning, search-source, or coding-tool trace row. */
|
|
41
|
+
export interface ReasoningStepData {
|
|
42
|
+
id?: React.Key;
|
|
43
|
+
label: React.ReactNode;
|
|
44
|
+
status?: AgentStatusState;
|
|
45
|
+
/** Elapsed or final step duration in seconds. */
|
|
46
|
+
duration?: number;
|
|
47
|
+
/** Secondary metadata such as a domain, file path, result count, or command. */
|
|
48
|
+
description?: React.ReactNode;
|
|
49
|
+
/** Optional destination. Rows with an href render as links. */
|
|
50
|
+
href?: string;
|
|
51
|
+
target?: React.HTMLAttributeAnchorTarget;
|
|
52
|
+
rel?: string;
|
|
53
|
+
/** Uses the code font for secondary metadata. */
|
|
54
|
+
mono?: boolean;
|
|
55
|
+
/** Optional row glyph; inferred from `variant`/`kind` when omitted. */
|
|
56
|
+
icon?: React.ReactNode;
|
|
57
|
+
/** Tool/source semantics used to select a default glyph. */
|
|
58
|
+
kind?: ReasoningStepKind;
|
|
59
|
+
additions?: number;
|
|
60
|
+
deletions?: number;
|
|
61
|
+
}
|
|
62
|
+
export interface ReasoningThemeOverrides extends AgentStatusThemeOverrides {
|
|
63
|
+
trace?: Partial<ReasoningTraceTheme>;
|
|
64
|
+
}
|
|
12
65
|
export interface ReasoningStepProps {
|
|
13
66
|
/** Step state — drives the indicator glyph. @default "complete" */
|
|
14
67
|
status?: AgentStatusState;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { ReasoningStepData, ReasoningTraceTheme, ReasoningVariant } from "./Reasoning.types";
|
|
3
|
+
interface ReasoningTraceProps {
|
|
4
|
+
variant: ReasoningVariant;
|
|
5
|
+
steps: ReasoningStepData[];
|
|
6
|
+
query?: React.ReactNode;
|
|
7
|
+
remainingCount?: number;
|
|
8
|
+
theme: ReasoningTraceTheme;
|
|
9
|
+
}
|
|
10
|
+
export declare const ReasoningTrace: React.FC<ReasoningTraceProps>;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
3
|
+
import { MagnifyingGlass, GlobeSimple, FileText, TerminalWindow, PencilSimple, WarningCircle, Clock, Check, CircleNotch } from '@phosphor-icons/react';
|
|
4
|
+
import { useReducedMotion, motion } from 'motion/react';
|
|
5
|
+
import { cn } from '../../../utils/cn.js';
|
|
6
|
+
|
|
7
|
+
const formatDuration = (duration) => {
|
|
8
|
+
const safe = Math.max(0, duration);
|
|
9
|
+
const rounded = safe < 60 ? Math.round(safe * 10) / 10 : Math.round(safe);
|
|
10
|
+
if (rounded < 60) {
|
|
11
|
+
return `${rounded.toFixed(Number.isInteger(rounded) ? 0 : 1)}s`;
|
|
12
|
+
}
|
|
13
|
+
return `${Math.floor(rounded / 60)}m ${rounded % 60}s`;
|
|
14
|
+
};
|
|
15
|
+
const statusTone = (status) => {
|
|
16
|
+
switch (status) {
|
|
17
|
+
case "active":
|
|
18
|
+
return "text-[var(--color-primary)]";
|
|
19
|
+
case "complete":
|
|
20
|
+
return "text-[var(--color-success)]";
|
|
21
|
+
case "pending":
|
|
22
|
+
return "text-[var(--color-text-placeholder)]";
|
|
23
|
+
case "error":
|
|
24
|
+
return "text-[var(--color-danger)]";
|
|
25
|
+
default:
|
|
26
|
+
return "text-[var(--color-text-muted)]";
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
const stateGlyph = (step) => {
|
|
30
|
+
var _a;
|
|
31
|
+
if (step.icon)
|
|
32
|
+
return step.icon;
|
|
33
|
+
switch ((_a = step.status) !== null && _a !== void 0 ? _a : "complete") {
|
|
34
|
+
case "active":
|
|
35
|
+
return jsx(CircleNotch, { className: "size-3.5 animate-spin" });
|
|
36
|
+
case "complete":
|
|
37
|
+
return jsx(Check, { className: "size-3.5", weight: "bold" });
|
|
38
|
+
case "pending":
|
|
39
|
+
return jsx(Clock, { className: "size-3.5" });
|
|
40
|
+
case "error":
|
|
41
|
+
return jsx(WarningCircle, { className: "size-3.5", weight: "fill" });
|
|
42
|
+
default:
|
|
43
|
+
return jsx("span", { className: "size-1.5 rounded-full bg-current" });
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
const traceGlyph = (variant, step) => {
|
|
47
|
+
if (step.icon)
|
|
48
|
+
return step.icon;
|
|
49
|
+
if (variant === "steps")
|
|
50
|
+
return stateGlyph(step);
|
|
51
|
+
if (variant === "search" || step.kind === "source") {
|
|
52
|
+
return jsx(GlobeSimple, { className: "size-3.5" });
|
|
53
|
+
}
|
|
54
|
+
if (variant === "coding") {
|
|
55
|
+
switch (step.kind) {
|
|
56
|
+
case "edit":
|
|
57
|
+
return jsx(PencilSimple, { className: "size-3.5" });
|
|
58
|
+
case "command":
|
|
59
|
+
return jsx(TerminalWindow, { className: "size-3.5" });
|
|
60
|
+
default:
|
|
61
|
+
return jsx(FileText, { className: "size-3.5" });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return jsx("span", { className: "size-1.5 rounded-full bg-current" });
|
|
65
|
+
};
|
|
66
|
+
const ReasoningTrace = ({ variant, steps, query, remainingCount = 0, theme, }) => {
|
|
67
|
+
const shouldReduceMotion = useReducedMotion();
|
|
68
|
+
return (jsxs("div", { className: theme.traceStyle, "data-reasoning-variant": variant, children: [steps.length > 1 && (jsx("span", { className: theme.guideStyle, "data-reasoning-trace-guide": "", "aria-hidden": "true" })), query !== undefined && (jsxs(motion.div, { className: theme.queryStyle, initial: shouldReduceMotion ? false : { opacity: 0, y: -3 }, animate: { opacity: 1, y: 0 }, transition: { duration: shouldReduceMotion ? 0 : 0.18 }, children: [jsx("span", { className: theme.queryIconStyle, "aria-hidden": "true", children: jsx(MagnifyingGlass, { className: "size-full" }) }), jsx("span", { className: theme.queryTextStyle, children: query })] })), jsx("ol", { className: theme.listStyle, children: steps.map((step, index) => {
|
|
69
|
+
var _a, _b, _c, _d;
|
|
70
|
+
const status = (_a = step.status) !== null && _a !== void 0 ? _a : "complete";
|
|
71
|
+
const metadata = (_b = step.description) !== null && _b !== void 0 ? _b : (step.duration !== undefined ? formatDuration(step.duration) : undefined);
|
|
72
|
+
const rowClassName = cn(theme.itemStyle, step.href && theme.interactiveItemStyle);
|
|
73
|
+
const content = (jsxs(Fragment, { children: [jsx("span", { className: cn(theme.indicatorStyle, theme.indicatorSurfaceStyle, statusTone(variant === "steps" ? status : undefined)), "aria-hidden": "true", children: traceGlyph(variant, step) }), jsx("span", { className: variant === "reasoning"
|
|
74
|
+
? theme.reasoningPrimaryStyle
|
|
75
|
+
: theme.primaryStyle, children: step.label }), metadata !== undefined && (jsx("span", { className: cn(theme.secondaryStyle, step.mono && "font-mono"), children: metadata })), (step.additions !== undefined || step.deletions !== undefined) && (jsxs("span", { className: theme.diffStyle, "aria-label": "Code changes", children: [step.additions !== undefined && (jsxs("span", { className: theme.additionsStyle, children: ["+", step.additions] })), step.additions !== undefined && step.deletions !== undefined && " ", step.deletions !== undefined && (jsxs("span", { className: theme.deletionsStyle, children: ["\u2212", step.deletions] }))] }))] }));
|
|
76
|
+
return (jsx(motion.li, { initial: shouldReduceMotion ? false : { opacity: 0, y: -3 }, animate: { opacity: 1, y: 0 }, transition: {
|
|
77
|
+
duration: shouldReduceMotion ? 0 : 0.2,
|
|
78
|
+
delay: shouldReduceMotion ? 0 : index * 0.045,
|
|
79
|
+
ease: [0.23, 1, 0.32, 1],
|
|
80
|
+
}, className: "min-w-0", children: step.href ? (jsx("a", { href: step.href, target: step.target, rel: (_c = step.rel) !== null && _c !== void 0 ? _c : (step.target === "_blank" ? "noreferrer" : undefined), className: rowClassName, children: content })) : (jsx("div", { className: rowClassName, children: content })) }, (_d = step.id) !== null && _d !== void 0 ? _d : index));
|
|
81
|
+
}) }), remainingCount > 0 && (jsxs(motion.div, { className: theme.remainingStyle, initial: shouldReduceMotion ? false : { opacity: 0 }, animate: { opacity: 1 }, transition: { duration: shouldReduceMotion ? 0 : 0.2 }, children: ["+", remainingCount, " more"] }))] }));
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
export { ReasoningTrace };
|
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
export { Reasoning } from "./Reasoning";
|
|
2
|
-
export
|
|
2
|
+
export { reasoningTheme } from "./Reasoning.theme";
|
|
3
|
+
export type { ReasoningProps, ReasoningStepProps, ReasoningStepData, ReasoningStepKind, ReasoningTraceTheme, ReasoningVariant, ReasoningThemeOverrides, } from "./Reasoning.types";
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Only animates the most recent tokens for performance
|
|
5
5
|
*/
|
|
6
6
|
import React from 'react';
|
|
7
|
+
import type { StreamingTokenEffect } from './StreamingResponse.types';
|
|
7
8
|
export interface AnimatedTextProps {
|
|
8
9
|
/** The full accumulated text */
|
|
9
10
|
text: string;
|
|
@@ -15,6 +16,12 @@ export interface AnimatedTextProps {
|
|
|
15
16
|
enabled?: boolean;
|
|
16
17
|
/** Additional CSS classes */
|
|
17
18
|
className?: string;
|
|
19
|
+
/** Optional inline indicator rendered immediately after the text */
|
|
20
|
+
cursor?: React.ReactNode;
|
|
21
|
+
/** Visual treatment for newly arrived words */
|
|
22
|
+
tokenEffect?: StreamingTokenEffect;
|
|
23
|
+
/** New-word transition duration in seconds */
|
|
24
|
+
tokenDuration?: number;
|
|
18
25
|
}
|
|
19
26
|
/**
|
|
20
27
|
* AnimatedText renders streaming text with smooth per-token fade-in.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
|
+
import { useMemo, useRef } from 'react';
|
|
4
4
|
import { useReducedMotion, motion } from 'motion/react';
|
|
5
|
-
import {
|
|
5
|
+
import { getTokenFadeIn } from './StreamingResponse.animations.js';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Splits text into tokens (words) preserving whitespace
|
|
@@ -18,9 +18,10 @@ const tokenize = (text) => {
|
|
|
18
18
|
* For performance, only the last N tokens are animated with motion.span,
|
|
19
19
|
* while older tokens are rendered as static text.
|
|
20
20
|
*/
|
|
21
|
-
const AnimatedText = ({ text, isStreaming, animateLastN = 12, enabled = true, className, }) => {
|
|
21
|
+
const AnimatedText = ({ text, isStreaming, animateLastN = 12, enabled = true, className, cursor, tokenEffect = 'fade', tokenDuration = 0.12, }) => {
|
|
22
22
|
const shouldReduceMotion = useReducedMotion();
|
|
23
|
-
const animate = enabled && !shouldReduceMotion;
|
|
23
|
+
const animate = enabled && tokenEffect !== 'none' && !shouldReduceMotion;
|
|
24
|
+
const tokenVariants = useMemo(() => getTokenFadeIn(tokenEffect), [tokenEffect]);
|
|
24
25
|
// Track which tokens have already been seen/animated
|
|
25
26
|
const settledCountRef = useRef(0);
|
|
26
27
|
const tokens = useMemo(() => tokenize(text), [text]);
|
|
@@ -38,9 +39,9 @@ const AnimatedText = ({ text, isStreaming, animateLastN = 12, enabled = true, cl
|
|
|
38
39
|
const animatedTokens = tokens.slice(settledCount);
|
|
39
40
|
if (!animate || !isStreaming) {
|
|
40
41
|
// No animation: render plain text
|
|
41
|
-
return (
|
|
42
|
+
return (jsxs("p", { className: className || 'whitespace-pre-wrap wrap-break-word', children: [text, cursor] }));
|
|
42
43
|
}
|
|
43
|
-
return (jsxs("p", { className: className || 'whitespace-pre-wrap wrap-break-word', children: [settledText, animatedTokens.map((token, i) => (jsx(motion.span, { variants:
|
|
44
|
+
return (jsxs("p", { className: className || 'whitespace-pre-wrap wrap-break-word', children: [settledText, animatedTokens.map((token, i) => (jsx(motion.span, { variants: tokenVariants, initial: "hidden", animate: "visible", transition: { duration: tokenDuration, ease: [0, 0, 0.2, 1] }, style: { display: 'inline' }, children: token }, `${settledCount + i}-${token}`))), cursor] }));
|
|
44
45
|
};
|
|
45
46
|
AnimatedText.displayName = 'AnimatedText';
|
|
46
47
|
|