@flikk/ui 1.0.0-beta.31 → 1.0.0-beta.33
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 +497 -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 +5 -5
- 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 +34 -18
- package/dist/components/core/Pill/Pill.theme.js +4 -2
- package/dist/components/core/Pill/Pill.types.d.ts +14 -1
- 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/SlidingNumber/SlidingNumber.d.ts +8 -0
- package/dist/components/core/SlidingNumber/SlidingNumber.js +12 -3
- 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/ColorPicker.js +45 -3
- package/dist/components/forms/ColorPicker/ColorPickerBody.js +8 -4
- 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 +10 -4
- package/dist/components/forms/Combobox/Combobox.theme.js +9 -0
- package/dist/components/forms/Combobox/Combobox.types.d.ts +13 -0
- package/dist/components/forms/DatePicker/DatePicker.js +19 -12
- package/dist/components/forms/DatePicker/DatePicker.theme.js +5 -0
- package/dist/components/forms/DatePicker/DatePicker.types.d.ts +8 -0
- package/dist/components/forms/DatePicker/DatePickerContext.d.ts +0 -1
- package/dist/components/forms/DatePicker/DatePickerTrigger.js +5 -3
- package/dist/components/forms/DateRangePicker/DateRangePicker.theme.js +6 -1
- package/dist/components/forms/DateRangePicker/DateRangePicker.types.d.ts +8 -0
- package/dist/components/forms/DateRangePicker/DateRangePickerContext.js +1 -0
- package/dist/components/forms/DateRangePicker/DateRangePickerTrigger.js +5 -3
- package/dist/components/forms/FileUpload/FileUpload.theme.js +2 -2
- package/dist/components/forms/FileUpload/FileUploadProgress.theme.js +1 -1
- package/dist/components/forms/Input/Input.js +17 -12
- package/dist/components/forms/Input/Input.theme.js +10 -0
- package/dist/components/forms/Input/Input.types.d.ts +14 -0
- package/dist/components/forms/InputAddress/InputAddress.js +5 -5
- package/dist/components/forms/InputAddress/InputAddress.types.d.ts +9 -2
- package/dist/components/forms/InputCounter/InputCounter.js +194 -17
- package/dist/components/forms/InputCounter/InputCounter.theme.d.ts +12 -0
- package/dist/components/forms/InputCounter/InputCounter.theme.js +92 -2
- package/dist/components/forms/InputCounter/InputCounter.types.d.ts +47 -4
- package/dist/components/forms/InputCreditCard/InputCreditCard.js +4 -4
- package/dist/components/forms/InputCreditCard/InputCreditCard.types.d.ts +7 -0
- package/dist/components/forms/Mention/Mention.js +13 -11
- 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 +174 -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 +19 -12
- package/dist/components/forms/Select/Select.theme.js +9 -1
- package/dist/components/forms/Select/Select.types.d.ts +86 -8
- 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/Textarea/Textarea.js +14 -25
- package/dist/components/forms/TimePicker/TimePicker.theme.js +10 -1
- package/dist/components/forms/TimePicker/TimePicker.types.d.ts +11 -0
- package/dist/components/forms/TimePicker/TimePickerTrigger.js +7 -5
- package/dist/components/forms/forms.theme.d.ts +57 -0
- package/dist/components/forms/forms.theme.js +102 -13
- 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 +11 -10
- package/dist/components/generative/schema.generated.js +199 -293
- 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 +199 -293
- package/dist/index.js +1 -4
- package/dist/registry.json +2765 -2450
- 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 +200 -295
- package/dist/utils/composeEventHandlers.d.ts +19 -0
- package/dist/utils/composeEventHandlers.js +26 -0
- package/dist/utils/composeEventHandlers.test.d.ts +1 -0
- package/dist/utils/index.d.ts +1 -1
- package/package.json +31 -1
- package/src/global.scss +21 -28
- package/src/styles/theme.css +157 -50
- 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
|
@@ -7,6 +7,12 @@ export interface CardTheme {
|
|
|
7
7
|
subtitleStyle: string;
|
|
8
8
|
bodyStyle: string;
|
|
9
9
|
footerStyle: string;
|
|
10
|
+
/** Applied on top of `baseStyle` when `inset` — sinks the frame to a tray. */
|
|
11
|
+
baseStyleInset: string;
|
|
12
|
+
/** Applied on top of `headerStyle` when `inset` — collapses the seam to the panel. */
|
|
13
|
+
headerStyleInset: string;
|
|
14
|
+
/** Replaces `bodyStyle` when `inset` — the floating panel. */
|
|
15
|
+
bodyStyleInset: string;
|
|
10
16
|
}
|
|
11
17
|
export interface CardThemeOverrides {
|
|
12
18
|
baseStyle?: string;
|
|
@@ -15,6 +21,9 @@ export interface CardThemeOverrides {
|
|
|
15
21
|
subtitleStyle?: string;
|
|
16
22
|
bodyStyle?: string;
|
|
17
23
|
footerStyle?: string;
|
|
24
|
+
baseStyleInset?: string;
|
|
25
|
+
headerStyleInset?: string;
|
|
26
|
+
bodyStyleInset?: string;
|
|
18
27
|
}
|
|
19
28
|
export interface CardProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
|
|
20
29
|
/**
|
|
@@ -53,6 +62,17 @@ export interface CardProps extends Omit<HTMLAttributes<HTMLDivElement>, "title">
|
|
|
53
62
|
elevation?: SurfaceElevation;
|
|
54
63
|
/** `false` opts out of the relative lift — paints at the card's base rung. */
|
|
55
64
|
lift?: boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Sink the card frame to a recessed tray and float the body as its own panel.
|
|
67
|
+
* Header and footer stay on the tray; body content remains flush with them.
|
|
68
|
+
*
|
|
69
|
+
* Works in both API modes — the root broadcasts it, so a compound
|
|
70
|
+
* `<Card.Body>` picks it up without being told twice. Has no effect on raw
|
|
71
|
+
* children (no slot-props and no `Card.Body`), since there is no body region
|
|
72
|
+
* to turn into a panel.
|
|
73
|
+
* @default false
|
|
74
|
+
*/
|
|
75
|
+
inset?: boolean;
|
|
56
76
|
/**
|
|
57
77
|
* Custom class name for the card
|
|
58
78
|
*/
|
|
@@ -1,10 +1,18 @@
|
|
|
1
|
+
"use client";
|
|
1
2
|
import { jsx } from 'react/jsx-runtime';
|
|
2
3
|
import React__default from 'react';
|
|
3
4
|
import { cn } from '../../../utils/cn.js';
|
|
4
5
|
import { cardTheme } from './Card.theme.js';
|
|
6
|
+
import { useCardContext } from './CardContext.js';
|
|
7
|
+
import { useSurfaceLevel, surfaceClasses } from '../../../theme/SurfaceContext.js';
|
|
5
8
|
|
|
6
9
|
const CardBody = React__default.forwardRef(({ children, className, ...props }, ref) => {
|
|
7
|
-
|
|
10
|
+
const { inset } = useCardContext();
|
|
11
|
+
// The rung the root already computed and re-provided. In inset mode the frame gives
|
|
12
|
+
// that rung up to sink to a tray, so the panel is what paints it — bg, hairline ring
|
|
13
|
+
// and --field-fill all land here instead of on the frame.
|
|
14
|
+
const surfaceLevel = useSurfaceLevel();
|
|
15
|
+
return (jsx("div", { ref: ref, "data-card-region": "", className: cn(inset && surfaceClasses(surfaceLevel), inset ? cardTheme.bodyStyleInset : cardTheme.bodyStyle, className), ...props, children: children }));
|
|
8
16
|
});
|
|
9
17
|
CardBody.displayName = 'Card.Body';
|
|
10
18
|
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface CardContextValue {
|
|
2
|
+
/** `true` when the root Card is in inset mode (sunken tray + floating body panel). */
|
|
3
|
+
inset: boolean;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Lives in its own module (not `Card.tsx`) so the sub-components can read it without
|
|
7
|
+
* importing the root — the zero-circular-dependency rule in CLAUDE.md §23.
|
|
8
|
+
*
|
|
9
|
+
* Defaults to `inset: false` so a bare `<Card.Body>` used outside a `<Card>` (which the
|
|
10
|
+
* existing API allows) keeps rendering exactly as it does today.
|
|
11
|
+
*/
|
|
12
|
+
export declare const CardContext: import("react").Context<CardContextValue>;
|
|
13
|
+
export declare const useCardContext: () => CardContextValue;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { createContext, useContext } from 'react';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Lives in its own module (not `Card.tsx`) so the sub-components can read it without
|
|
6
|
+
* importing the root — the zero-circular-dependency rule in CLAUDE.md §23.
|
|
7
|
+
*
|
|
8
|
+
* Defaults to `inset: false` so a bare `<Card.Body>` used outside a `<Card>` (which the
|
|
9
|
+
* existing API allows) keeps rendering exactly as it does today.
|
|
10
|
+
*/
|
|
11
|
+
const CardContext = createContext({ inset: false });
|
|
12
|
+
const useCardContext = () => useContext(CardContext);
|
|
13
|
+
|
|
14
|
+
export { CardContext, useCardContext };
|
|
@@ -1,10 +1,13 @@
|
|
|
1
|
+
"use client";
|
|
1
2
|
import { jsx } from 'react/jsx-runtime';
|
|
2
3
|
import React__default from 'react';
|
|
3
4
|
import { cn } from '../../../utils/cn.js';
|
|
4
5
|
import { cardTheme } from './Card.theme.js';
|
|
6
|
+
import { useCardContext } from './CardContext.js';
|
|
5
7
|
|
|
6
8
|
const CardHeader = React__default.forwardRef(({ children, className, ...props }, ref) => {
|
|
7
|
-
|
|
9
|
+
const { inset } = useCardContext();
|
|
10
|
+
return (jsx("div", { ref: ref, "data-card-region": "", className: cn(cardTheme.headerStyle, inset && cardTheme.headerStyleInset, className), ...props, children: children }));
|
|
8
11
|
});
|
|
9
12
|
CardHeader.displayName = 'CardHeader';
|
|
10
13
|
|
|
@@ -3,8 +3,9 @@ import { dropdownTheme } from '../Dropdown/Dropdown.theme.js';
|
|
|
3
3
|
const contextMenuTheme = {
|
|
4
4
|
// Inherit all Dropdown styles for consistency
|
|
5
5
|
...dropdownTheme,
|
|
6
|
-
// Content uses the same styling as Dropdown menu
|
|
7
|
-
|
|
6
|
+
// Content uses the same styling as Dropdown menu. The padding is the token, not a
|
|
7
|
+
// literal p-1 — it also feeds --dropdown-inner-radius (the first/last row's corner).
|
|
8
|
+
contentStyle: dropdownTheme.menuStyle.replace("flex", "flex-col p-[var(--dropdown-padding)]"),
|
|
8
9
|
// Items use exact same styling as Dropdown items.
|
|
9
10
|
itemStyle: dropdownTheme.itemBaseStyle,
|
|
10
11
|
// Checked tick — sits in the leading icon slot (same gutter as startContent icons),
|
|
@@ -17,7 +18,7 @@ const contextMenuTheme = {
|
|
|
17
18
|
// bg + shadow come from the relative-elevation engine (surfaceClasses) at
|
|
18
19
|
// runtime so the submenu lifts above its parent menu; keep blur + border here.
|
|
19
20
|
subContentStyle: "min-w-[180px] max-h-[400px] overflow-y-auto rounded-[var(--dropdown-radius)] border border-[var(--color-border)] ml-1 " +
|
|
20
|
-
"backdrop-blur-md flex flex-col p-
|
|
21
|
+
"backdrop-blur-md flex flex-col p-[var(--dropdown-padding)] focus:outline-none",
|
|
21
22
|
// Separator - horizontal divider (--color-border flips for dark on its own)
|
|
22
23
|
separatorStyle: "h-px bg-[var(--color-border)] my-1 -mx-1",
|
|
23
24
|
// Label - section header (matches Dropdown section title)
|
|
@@ -16,6 +16,14 @@ export interface SubMenuContextValue {
|
|
|
16
16
|
isOpen: boolean;
|
|
17
17
|
onOpenChange: (isOpen: boolean) => void;
|
|
18
18
|
triggerRef: React.RefObject<HTMLDivElement | null>;
|
|
19
|
+
/**
|
|
20
|
+
* Cancel a pending close. The trigger and the submenu body are separate DOM
|
|
21
|
+
* subtrees (the body portals to `document.body`), so hovering either one has to
|
|
22
|
+
* call this to survive the hand-off across the gap between them.
|
|
23
|
+
*/
|
|
24
|
+
cancelClose: () => void;
|
|
25
|
+
/** Start the short grace period before the submenu closes. */
|
|
26
|
+
scheduleClose: () => void;
|
|
19
27
|
}
|
|
20
28
|
export interface ContextMenuProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
21
29
|
children: ReactNode;
|
|
@@ -54,7 +62,6 @@ export interface ContextMenuItemProps extends Omit<React.HTMLAttributes<HTMLDivE
|
|
|
54
62
|
}
|
|
55
63
|
export interface ContextMenuSubProps {
|
|
56
64
|
children: ReactNode;
|
|
57
|
-
className?: string;
|
|
58
65
|
}
|
|
59
66
|
export interface ContextMenuSubTriggerProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
60
67
|
children: ReactNode;
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { ContextMenuSubProps } from "./ContextMenu.types";
|
|
3
3
|
/**
|
|
4
|
-
* ContextMenuSub - Wrapper for nested submenu with hover logic
|
|
4
|
+
* ContextMenuSub - Wrapper for nested submenu with hover logic.
|
|
5
|
+
*
|
|
6
|
+
* Renders NO element of its own: the sub-trigger has to stay a direct sibling of the
|
|
7
|
+
* surrounding ContextMenu.Item rows, because MenuItem expresses its corner radius with
|
|
8
|
+
* `first:`/`last:` variants and those resolve against DOM siblings. Wrapping the trigger
|
|
9
|
+
* made it both the first AND the last child of that wrapper, so a mid-list sub-trigger
|
|
10
|
+
* rounded all four corners at --radius-base instead of the flat 4px its neighbours use.
|
|
11
|
+
*
|
|
12
|
+
* Hover coordination therefore lives here instead of on a wrapper's mouse handlers: the
|
|
13
|
+
* trigger and the (portalled) submenu body each cancel a pending close on enter and
|
|
14
|
+
* schedule one on leave, so the pointer can cross the gap between them.
|
|
5
15
|
*/
|
|
6
16
|
export declare const ContextMenuSub: React.FC<ContextMenuSubProps>;
|
|
@@ -1,40 +1,53 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx } from 'react/jsx-runtime';
|
|
3
|
-
import { useState, useRef, useCallback, useMemo } from 'react';
|
|
3
|
+
import { useState, useRef, useCallback, useEffect, useMemo } from 'react';
|
|
4
4
|
import { SubMenuContext } from './ContextMenuContext.js';
|
|
5
5
|
|
|
6
|
+
/** Grace period before a hovered-away submenu closes, in ms. */
|
|
7
|
+
const CLOSE_DELAY = 150;
|
|
6
8
|
/**
|
|
7
|
-
* ContextMenuSub - Wrapper for nested submenu with hover logic
|
|
9
|
+
* ContextMenuSub - Wrapper for nested submenu with hover logic.
|
|
10
|
+
*
|
|
11
|
+
* Renders NO element of its own: the sub-trigger has to stay a direct sibling of the
|
|
12
|
+
* surrounding ContextMenu.Item rows, because MenuItem expresses its corner radius with
|
|
13
|
+
* `first:`/`last:` variants and those resolve against DOM siblings. Wrapping the trigger
|
|
14
|
+
* made it both the first AND the last child of that wrapper, so a mid-list sub-trigger
|
|
15
|
+
* rounded all four corners at --radius-base instead of the flat 4px its neighbours use.
|
|
16
|
+
*
|
|
17
|
+
* Hover coordination therefore lives here instead of on a wrapper's mouse handlers: the
|
|
18
|
+
* trigger and the (portalled) submenu body each cancel a pending close on enter and
|
|
19
|
+
* schedule one on leave, so the pointer can cross the gap between them.
|
|
8
20
|
*/
|
|
9
|
-
const ContextMenuSub = ({ children
|
|
21
|
+
const ContextMenuSub = ({ children }) => {
|
|
10
22
|
const [isOpen, setIsOpen] = useState(false);
|
|
11
23
|
const triggerRef = useRef(null);
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const handleMouseEnter = useCallback(() => {
|
|
18
|
-
if (hoverTimeoutRef.current) {
|
|
19
|
-
clearTimeout(hoverTimeoutRef.current);
|
|
20
|
-
hoverTimeoutRef.current = null;
|
|
24
|
+
const closeTimeoutRef = useRef(null);
|
|
25
|
+
const cancelClose = useCallback(() => {
|
|
26
|
+
if (closeTimeoutRef.current) {
|
|
27
|
+
clearTimeout(closeTimeoutRef.current);
|
|
28
|
+
closeTimeoutRef.current = null;
|
|
21
29
|
}
|
|
22
30
|
}, []);
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
hoverTimeoutRef.current = setTimeout(() => {
|
|
31
|
+
const scheduleClose = useCallback(() => {
|
|
32
|
+
cancelClose();
|
|
33
|
+
closeTimeoutRef.current = setTimeout(() => {
|
|
34
|
+
closeTimeoutRef.current = null;
|
|
29
35
|
setIsOpen(false);
|
|
30
|
-
},
|
|
31
|
-
}, []);
|
|
36
|
+
}, CLOSE_DELAY);
|
|
37
|
+
}, [cancelClose]);
|
|
38
|
+
const handleOpenChange = useCallback((value) => {
|
|
39
|
+
cancelClose();
|
|
40
|
+
setIsOpen(value);
|
|
41
|
+
}, [cancelClose]);
|
|
42
|
+
useEffect(() => cancelClose, [cancelClose]);
|
|
32
43
|
const contextValue = useMemo(() => ({
|
|
33
44
|
isOpen,
|
|
34
45
|
onOpenChange: handleOpenChange,
|
|
35
46
|
triggerRef,
|
|
36
|
-
|
|
37
|
-
|
|
47
|
+
cancelClose,
|
|
48
|
+
scheduleClose,
|
|
49
|
+
}), [isOpen, handleOpenChange, cancelClose, scheduleClose]);
|
|
50
|
+
return (jsx(SubMenuContext.Provider, { value: contextValue, children: children }));
|
|
38
51
|
};
|
|
39
52
|
ContextMenuSub.displayName = "ContextMenuSub";
|
|
40
53
|
|
|
@@ -15,7 +15,7 @@ const ContextMenuSubBody = React__default.forwardRef(({ children, className, ani
|
|
|
15
15
|
// Relative elevation: lift above the parent menu surface (overlay base = 5).
|
|
16
16
|
const surfaceLevel = useSurfaceElevation({ baseRung: 5, offset: 2, elevation, lift });
|
|
17
17
|
const { theme } = useContextMenuContext();
|
|
18
|
-
const { isOpen, triggerRef, onOpenChange } = useSubMenuContext();
|
|
18
|
+
const { isOpen, triggerRef, onOpenChange, cancelClose, scheduleClose } = useSubMenuContext();
|
|
19
19
|
const shouldReduceMotion = useReducedMotion();
|
|
20
20
|
const isClient = useIsClient();
|
|
21
21
|
const localRef = useRef(null);
|
|
@@ -88,7 +88,18 @@ const ContextMenuSubBody = React__default.forwardRef(({ children, className, ani
|
|
|
88
88
|
},
|
|
89
89
|
};
|
|
90
90
|
// Extract DOM props to avoid conflicts
|
|
91
|
-
const { onAnimationStart, onAnimationEnd, onDrag, onDragStart, onDragEnd, ...domProps } = props;
|
|
91
|
+
const { onAnimationStart, onAnimationEnd, onDrag, onDragStart, onDragEnd, onMouseEnter, onMouseLeave, ...domProps } = props;
|
|
92
|
+
// The body portals to <body>, so it is not a DOM descendant of the trigger: entering it
|
|
93
|
+
// has to cancel the close the trigger scheduled when the pointer left, and leaving it
|
|
94
|
+
// has to schedule one. Consumer handlers are composed, not replaced.
|
|
95
|
+
const handleMouseEnter = useCallback((e) => {
|
|
96
|
+
cancelClose();
|
|
97
|
+
onMouseEnter === null || onMouseEnter === void 0 ? void 0 : onMouseEnter(e);
|
|
98
|
+
}, [cancelClose, onMouseEnter]);
|
|
99
|
+
const handleMouseLeave = useCallback((e) => {
|
|
100
|
+
scheduleClose();
|
|
101
|
+
onMouseLeave === null || onMouseLeave === void 0 ? void 0 : onMouseLeave(e);
|
|
102
|
+
}, [scheduleClose, onMouseLeave]);
|
|
92
103
|
// Detect dark mode from document
|
|
93
104
|
const isDarkMode = typeof document !== "undefined" &&
|
|
94
105
|
(document.documentElement.classList.contains("dark") ||
|
|
@@ -103,7 +114,7 @@ const ContextMenuSubBody = React__default.forwardRef(({ children, className, ani
|
|
|
103
114
|
type: "spring",
|
|
104
115
|
stiffness: 500,
|
|
105
116
|
damping: 30,
|
|
106
|
-
}, "data-state": isOpen ? "open" : "closed", "data-flikkui-portal": "", ...domProps, children: jsx(SurfaceProvider, { level: surfaceLevel, children: children }) })) }));
|
|
117
|
+
}, "data-state": isOpen ? "open" : "closed", "data-flikkui-portal": "", onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, ...domProps, children: jsx(SurfaceProvider, { level: surfaceLevel, children: children }) })) }));
|
|
107
118
|
// Always use portal for submenus
|
|
108
119
|
const portalTarget = isClient ? document.body : null;
|
|
109
120
|
return portalTarget ? createPortal(submenuContent, portalTarget) : null;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
|
-
import React__default, { useRef, useCallback } from 'react';
|
|
3
|
+
import React__default, { useRef, useCallback, useEffect } from 'react';
|
|
4
4
|
import { CaretRight } from '@phosphor-icons/react';
|
|
5
5
|
import { cn } from '../../../utils/cn.js';
|
|
6
6
|
import { useContextMenuContext, useSubMenuContext } from './ContextMenuContext.js';
|
|
@@ -10,21 +10,34 @@ import { useContextMenuContext, useSubMenuContext } from './ContextMenuContext.j
|
|
|
10
10
|
*/
|
|
11
11
|
const ContextMenuSubTrigger = React__default.forwardRef(({ children, className, disabled = false, startContent, ...props }, ref) => {
|
|
12
12
|
const { theme } = useContextMenuContext();
|
|
13
|
-
const { isOpen, onOpenChange, triggerRef } = useSubMenuContext();
|
|
13
|
+
const { isOpen, onOpenChange, triggerRef, cancelClose, scheduleClose } = useSubMenuContext();
|
|
14
14
|
const hoverTimeoutRef = useRef(null);
|
|
15
|
+
const clearOpenTimeout = useCallback(() => {
|
|
16
|
+
if (hoverTimeoutRef.current) {
|
|
17
|
+
clearTimeout(hoverTimeoutRef.current);
|
|
18
|
+
hoverTimeoutRef.current = null;
|
|
19
|
+
}
|
|
20
|
+
}, []);
|
|
15
21
|
// Handle mouse enter - open submenu after short delay
|
|
16
22
|
const handleMouseEnter = useCallback(() => {
|
|
17
23
|
if (disabled)
|
|
18
24
|
return;
|
|
19
|
-
//
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
25
|
+
// Re-entering the trigger cancels a close scheduled by leaving the submenu body.
|
|
26
|
+
cancelClose();
|
|
27
|
+
clearOpenTimeout();
|
|
23
28
|
// Open submenu after short delay
|
|
24
29
|
hoverTimeoutRef.current = setTimeout(() => {
|
|
30
|
+
hoverTimeoutRef.current = null;
|
|
25
31
|
onOpenChange(true);
|
|
26
32
|
}, 150);
|
|
27
|
-
}, [disabled, onOpenChange]);
|
|
33
|
+
}, [disabled, onOpenChange, cancelClose, clearOpenTimeout]);
|
|
34
|
+
// Handle mouse leave - hand off to the submenu body, which cancels the close if the
|
|
35
|
+
// pointer lands there; otherwise the submenu closes after the grace period.
|
|
36
|
+
const handleMouseLeave = useCallback(() => {
|
|
37
|
+
clearOpenTimeout();
|
|
38
|
+
scheduleClose();
|
|
39
|
+
}, [clearOpenTimeout, scheduleClose]);
|
|
40
|
+
useEffect(() => clearOpenTimeout, [clearOpenTimeout]);
|
|
28
41
|
// Handle keyboard navigation
|
|
29
42
|
const handleKeyDown = useCallback((e) => {
|
|
30
43
|
if (disabled)
|
|
@@ -54,7 +67,7 @@ const ContextMenuSubTrigger = React__default.forwardRef(({ children, className,
|
|
|
54
67
|
ref.current = el;
|
|
55
68
|
}
|
|
56
69
|
}, [ref, triggerRef]);
|
|
57
|
-
return (jsxs("div", { ref: handleRef, role: "menuitem", "aria-haspopup": "true", "aria-expanded": isOpen, "aria-disabled": disabled, "data-state": isOpen ? "open" : "closed", "data-disabled": disabled, tabIndex: disabled ? undefined : -1, className: cn(theme.subTriggerStyle, theme.itemFocusStyle, className), onMouseEnter: handleMouseEnter, onKeyDown: handleKeyDown, ...props, children: [startContent && (jsx("div", { className: "flex items-center justify-center flex-shrink-0", children: startContent })), jsx("span", { className: "flex-1 truncate", children: children }), jsx(CaretRight, { className: "absolute right-2 top-1/2 -translate-y-1/2 size-3 text-[var(--color-text-secondary)]", "aria-hidden": "true", weight: "bold" })] }));
|
|
70
|
+
return (jsxs("div", { ref: handleRef, role: "menuitem", "aria-haspopup": "true", "aria-expanded": isOpen, "aria-disabled": disabled, "data-state": isOpen ? "open" : "closed", "data-disabled": disabled, tabIndex: disabled ? undefined : -1, className: cn(theme.subTriggerStyle, theme.itemFocusStyle, className), onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, onKeyDown: handleKeyDown, ...props, children: [startContent && (jsx("div", { className: "flex items-center justify-center flex-shrink-0", children: startContent })), jsx("span", { className: "flex-1 truncate", children: children }), jsx(CaretRight, { className: "absolute right-2 top-1/2 -translate-y-1/2 size-3 text-[var(--color-text-secondary)]", "aria-hidden": "true", weight: "bold" })] }));
|
|
58
71
|
});
|
|
59
72
|
ContextMenuSubTrigger.displayName = "ContextMenuSubTrigger";
|
|
60
73
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const dragDropTheme = {
|
|
2
|
-
draggableStyle: 'select-none rounded-[var(--radius-base)] transition-all duration-
|
|
3
|
-
droppableStyle: 'min-h-[120px] border-2 border-dashed border-[var(--color-border)] rounded-[var(--radius-base)] p-4 transition-all duration-
|
|
2
|
+
draggableStyle: 'select-none rounded-[var(--radius-base)] transition-all duration-[var(--motion-duration-base)]',
|
|
3
|
+
droppableStyle: 'min-h-[120px] border-2 border-dashed border-[var(--color-border)] rounded-[var(--radius-base)] p-4 transition-all duration-[var(--motion-duration-base)] bg-[var(--color-background)]',
|
|
4
4
|
dragOverStyle: 'border-[var(--color-primary)] bg-[var(--color-primary-50)]',
|
|
5
5
|
dragPreviewStyle: 'opacity-60',
|
|
6
6
|
};
|
|
@@ -10,7 +10,7 @@ const drawerTheme = {
|
|
|
10
10
|
inner: "h-full flex flex-col",
|
|
11
11
|
header: "flex items-start justify-between px-[var(--drawer-px)] py-[var(--drawer-py)] border-b border-[var(--color-border)] shrink-0 text-[var(--color-text-primary)] gap-4",
|
|
12
12
|
headerContent: "flex items-start gap-3 flex-1 min-w-0",
|
|
13
|
-
title: "text-[length:var(--drawer-title-size)] font-semibold
|
|
13
|
+
title: "text-[length:var(--drawer-title-size)]/[var(--drawer-title-line-height)] font-semibold text-[var(--color-text-primary)]",
|
|
14
14
|
subtitle: "text-sm text-[var(--color-text-secondary)] mt-0.5",
|
|
15
15
|
body: "flex-1 overflow-y-auto px-[var(--drawer-px)] py-[var(--drawer-py)]",
|
|
16
16
|
// Footer's vertical padding is deliberately lighter than header/body —
|
|
@@ -3,7 +3,6 @@ import { jsxs, jsx } from 'react/jsx-runtime';
|
|
|
3
3
|
import { cn } from '../../../utils/cn.js';
|
|
4
4
|
import { useDrawerContext } from './DrawerContext.js';
|
|
5
5
|
import { Button } from '../Button/Button.js';
|
|
6
|
-
import 'react';
|
|
7
6
|
import { X } from '@phosphor-icons/react';
|
|
8
7
|
|
|
9
8
|
const DrawerHeader = ({ children, icon, showCloseButton, className, ...props }) => {
|
|
@@ -141,12 +141,22 @@ const DropdownMenu = React__default.forwardRef(({ children, className, animation
|
|
|
141
141
|
((_a = triggerRef.current) === null || _a === void 0 ? void 0 : _a.contains(e.target))) {
|
|
142
142
|
return;
|
|
143
143
|
}
|
|
144
|
-
// Ignore clicks that land inside
|
|
145
|
-
// Select/Tooltip/Dropdown/Popover renders to document.body,
|
|
146
|
-
// menu's own DOM subtree — without this it would count as
|
|
147
|
-
// click and dismiss the menu). See the `data-flikkui-portal`
|
|
148
|
-
// (CLAUDE.md §11) — mirrors PopoverBody's bail.
|
|
149
|
-
|
|
144
|
+
// Ignore clicks that land inside a DESCENDANT FlikkUI overlay portal (a
|
|
145
|
+
// nested Select/Tooltip/Dropdown/Popover renders to document.body,
|
|
146
|
+
// outside our menu's own DOM subtree — without this it would count as
|
|
147
|
+
// an outside click and dismiss the menu). See the `data-flikkui-portal`
|
|
148
|
+
// convention (CLAUDE.md §11) — mirrors PopoverBody's bail.
|
|
149
|
+
//
|
|
150
|
+
// The bail only protects against a DESCENDANT portal, not an ANCESTOR
|
|
151
|
+
// one: when this menu's own trigger lives inside another overlay (e.g.
|
|
152
|
+
// a Dropdown opened from inside a Modal), a click on that host
|
|
153
|
+
// overlay's body content also matches `closest("[data-flikkui-portal]")`
|
|
154
|
+
// — it finds the Modal's portal wrapper, which contains our trigger.
|
|
155
|
+
// That's a real outside click and must still close the menu. Only bail
|
|
156
|
+
// when the matched portal does NOT contain our trigger — i.e. it's a
|
|
157
|
+
// portal we opened ourselves, not the one hosting us.
|
|
158
|
+
const portalEl = (_c = (_b = e.target) === null || _b === void 0 ? void 0 : _b.closest) === null || _c === void 0 ? void 0 : _c.call(_b, "[data-flikkui-portal]");
|
|
159
|
+
if (portalEl && !portalEl.contains(triggerRef.current)) {
|
|
150
160
|
return;
|
|
151
161
|
}
|
|
152
162
|
onOpenChange(false);
|
|
@@ -209,7 +219,12 @@ const DropdownMenu = React__default.forwardRef(({ children, className, animation
|
|
|
209
219
|
});
|
|
210
220
|
// Extract DOM props to avoid type conflicts with Framer Motion
|
|
211
221
|
const { onAnimationStart, onAnimationEnd, onDrag, onDragStart, onDragEnd, ...domProps } = props;
|
|
212
|
-
const menuContent = (jsx(AnimatePresence, { children: isOpen && (jsx(motion.div, { ref: handleRef, className: cn("fixed z-50", surfaceClasses(surfaceLevel, { translucent: true }), theme.menuStyle,
|
|
222
|
+
const menuContent = (jsx(AnimatePresence, { children: isOpen && (jsx(motion.div, { ref: handleRef, className: cn("fixed z-50", surfaceClasses(surfaceLevel, { translucent: true }), theme.menuStyle,
|
|
223
|
+
// --dropdown-padding (not a literal p-1): it also feeds
|
|
224
|
+
// --dropdown-inner-radius, which rounds the first/last row.
|
|
225
|
+
horizontal
|
|
226
|
+
? "flex-row p-[var(--dropdown-padding)]"
|
|
227
|
+
: "flex-col p-[var(--dropdown-padding)]", className), style: {
|
|
213
228
|
...cssVariables,
|
|
214
229
|
top: `${position.top}px`,
|
|
215
230
|
left: `${position.left}px`,
|
|
@@ -14,7 +14,7 @@ import { cn } from '../../../utils/cn.js';
|
|
|
14
14
|
// Resting link look (transparent; underline grows in on hover via the motion
|
|
15
15
|
// span below). Kept minimal and open.
|
|
16
16
|
const LINK_BASE = "relative inline-flex items-center justify-center gap-2 bg-transparent border-transparent cursor-pointer " +
|
|
17
|
-
"transition-colors duration-
|
|
17
|
+
"transition-colors duration-[var(--motion-duration-slow)] ease-in-out " +
|
|
18
18
|
"focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2";
|
|
19
19
|
// Animated underline — a bottom-anchored line that scales in from the left on
|
|
20
20
|
// hover/focus. `bg-current` inherits each color variant's text tint.
|
|
@@ -19,7 +19,7 @@ const masonryTheme = {
|
|
|
19
19
|
},
|
|
20
20
|
// Animation classes
|
|
21
21
|
animations: {
|
|
22
|
-
transition: "transition-[left,top,width,height] duration-
|
|
22
|
+
transition: "transition-[left,top,width,height] duration-[var(--motion-duration-slower)] ease-in-out",
|
|
23
23
|
enter: "opacity-0 scale-95",
|
|
24
24
|
exit: "opacity-100 scale-100",
|
|
25
25
|
},
|
|
@@ -3,6 +3,7 @@ import { jsxs, jsx } from 'react/jsx-runtime';
|
|
|
3
3
|
import React__default, { useState, useCallback } from 'react';
|
|
4
4
|
import { cn } from '../../../utils/cn.js';
|
|
5
5
|
import { menuItemTheme } from './MenuItem.theme.js';
|
|
6
|
+
import { Ripple } from '../shared/Ripple.js';
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* MenuItem - Shared base component for menu items used by Dropdown and ContextMenu.
|
|
@@ -47,7 +48,7 @@ const MenuItem = React__default.forwardRef(({ children, className, startContent,
|
|
|
47
48
|
// Focus fill composites over any state (incl. selected) — see focusedStyle note.
|
|
48
49
|
isFocused && !disabled && theme.focusedStyle, isDanger && theme.dangerStyle, theme.focusStyle, className), onClick: handleClick, onKeyDown: handleKeyDown, onFocus: () => setIsFocused(true), onBlur: () => setIsFocused(false), ...props, children: [startContent && (jsx("div", { className: "flex items-center justify-center flex-shrink-0", children: startContent })), jsxs("div", { className: "flex-1 min-w-0", children: [jsxs("div", { className: "flex items-center justify-between gap-2", children: [jsx("span", { className: "truncate", children: children }), shortcut && (jsx("span", { className: "ml-auto flex-shrink-0", children: shortcut }))] }), subtitle && (typeof subtitle === 'string'
|
|
49
50
|
? jsx("div", { className: theme.subtitleStyle, children: subtitle })
|
|
50
|
-
: subtitle)] }), endContent && (jsx("div", { className: "flex items-center justify-center ml-2", children: endContent }))] }));
|
|
51
|
+
: subtitle)] }), endContent && (jsx("div", { className: "flex items-center justify-center ml-2", children: endContent })), jsx(Ripple, { disabled: disabled })] }));
|
|
51
52
|
});
|
|
52
53
|
MenuItem.displayName = "MenuItem";
|
|
53
54
|
|
|
@@ -1,7 +1,19 @@
|
|
|
1
1
|
const menuItemTheme = {
|
|
2
2
|
// Structural base only — layout, spacing, radius, transition. No state colors:
|
|
3
3
|
// those are resolved in JS (see `states`) so a consumer `className` always wins.
|
|
4
|
-
|
|
4
|
+
//
|
|
5
|
+
// Radius: interior rows are a flat 4px; the first and last rows meet the panel's
|
|
6
|
+
// own corners, so they take --dropdown-inner-radius — the panel's radius minus its
|
|
7
|
+
// border and padding — which keeps their curve concentric with the panel's instead
|
|
8
|
+
// of bulging past it (same calc model as --segmented-inner-radius).
|
|
9
|
+
// 🔴 The first:/last: variants resolve against DOM SIBLINGS: any wrapper element
|
|
10
|
+
// around a row makes it both first and last of its own subtree and rounds all four
|
|
11
|
+
// corners (see ContextMenuSub, which renders no element for exactly this reason).
|
|
12
|
+
// 🔴 This assumes a --dropdown-radius panel. That holds for every host today —
|
|
13
|
+
// Mention's suggestion popover renders MenuItem rows too, and its panel's
|
|
14
|
+
// --form-dropdown-radius aliases --dropdown-radius for exactly that reason. A host
|
|
15
|
+
// that gives its panel a different radius has to re-derive this row radius with it.
|
|
16
|
+
baseStyle: "relative flex items-center gap-2 px-3 py-1.5 text-sm font-[500] cursor-pointer outline-none select-none first:rounded-t-[var(--dropdown-inner-radius)] last:rounded-b-[var(--dropdown-inner-radius)] rounded-[4px] transition-colors duration-[var(--motion-duration-slow)] mb-px last-of-type:mb-0",
|
|
5
17
|
// State styling resolved in JS to plain utility classes so `className` overrides
|
|
6
18
|
// win (data-[state] variants carry attribute-selector specificity and can't be
|
|
7
19
|
// overridden by a plain className — see Button.theme.ts / NavItem.theme.ts for
|
|
@@ -27,6 +27,8 @@ import { MessageDateDivider } from './MessageDateDivider.js';
|
|
|
27
27
|
|
|
28
28
|
const MessageFooter = ({ isStreaming, streamingIndicator, showTimestamp, timestamp, actions, timestampStyle, streamingIndicatorStyle, actionsContainerStyle, variant, }) => {
|
|
29
29
|
if (isStreaming) {
|
|
30
|
+
if (streamingIndicator === false)
|
|
31
|
+
return null;
|
|
30
32
|
return (jsx("div", { className: cn("flex flex-row items-center gap-3 mt-1", variant === "receiver" ? "ml-2" : "mr-3"), children: jsx("div", { className: cn(timestampStyle, streamingIndicatorStyle), children: streamingIndicator || (jsxs(Fragment, { children: [jsx("span", { children: "Typing" }), jsx(motion.span, { animate: { opacity: [0.4, 1, 0.4] }, transition: {
|
|
31
33
|
duration: 1.5,
|
|
32
34
|
repeat: Infinity,
|
|
@@ -46,13 +46,13 @@ const messageTheme = {
|
|
|
46
46
|
statusFailed: "text-[var(--color-danger)]",
|
|
47
47
|
// Attachment styles
|
|
48
48
|
attachmentContainerStyle: "flex flex-col gap-2 mt-2",
|
|
49
|
-
fileStyle: "flex items-center gap-3 rounded-lg border border-[var(--color-border)] bg-[var(--color-
|
|
49
|
+
fileStyle: "flex items-center gap-3 rounded-lg border border-[var(--color-border)] bg-[var(--color-surface)] px-3 py-2.5 text-xs",
|
|
50
50
|
imageStyle: "rounded-lg overflow-hidden max-w-xs",
|
|
51
|
-
audioStyle: "flex items-center gap-3 rounded-lg border border-[var(--color-border)] bg-[var(--color-
|
|
51
|
+
audioStyle: "flex items-center gap-3 rounded-lg border border-[var(--color-border)] bg-[var(--color-surface)] px-3 py-2.5 text-xs",
|
|
52
52
|
linkStyle: "flex flex-col rounded-lg border border-[var(--color-border)] overflow-hidden text-xs max-w-xs",
|
|
53
53
|
// Reactions styles
|
|
54
54
|
reactionsContainerStyle: "flex flex-wrap items-center gap-1.5 mt-1.5",
|
|
55
|
-
reactionPillStyle: "inline-flex items-center gap-1 rounded-full border border-[var(--color-border)] bg-[var(--color-
|
|
55
|
+
reactionPillStyle: "inline-flex items-center gap-1 rounded-full border border-[var(--color-border)] bg-[var(--color-surface)] px-2 py-0.5 text-xs cursor-pointer transition-colors hover:bg-[var(--color-surface-hover)]",
|
|
56
56
|
reactionPillActiveStyle: "border-[var(--color-primary-200)] bg-[var(--color-primary-50)] text-[var(--color-primary)]",
|
|
57
57
|
// Reply/quote styles
|
|
58
58
|
replyStyle: "border-l-2 border-[var(--color-border)] pl-2.5 mb-2 text-xs text-[var(--color-text-muted)]",
|
|
@@ -5,6 +5,6 @@ import { Variants } from 'motion/react';
|
|
|
5
5
|
export declare const modalOverlayAnimations: Variants;
|
|
6
6
|
/**
|
|
7
7
|
* Modal content animation variants
|
|
8
|
-
*
|
|
8
|
+
* Restrained scale + lift with a matched, responsive exit.
|
|
9
9
|
*/
|
|
10
10
|
export declare const modalContentAnimations: Variants;
|
|
@@ -1,21 +1,39 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import '../../../theme/ThemeContext.js';
|
|
3
3
|
import '../../../theme/SurfaceContext.js';
|
|
4
|
-
import {
|
|
4
|
+
import { easings, springs } from '../../../theme/animations.js';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Modal overlay animation variants
|
|
8
8
|
*/
|
|
9
|
-
const modalOverlayAnimations =
|
|
9
|
+
const modalOverlayAnimations = {
|
|
10
|
+
initial: { opacity: 0 },
|
|
11
|
+
animate: {
|
|
12
|
+
opacity: 1,
|
|
13
|
+
transition: {
|
|
14
|
+
duration: 0.28,
|
|
15
|
+
ease: easings.easeOut,
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
exit: {
|
|
19
|
+
opacity: 0,
|
|
20
|
+
transition: {
|
|
21
|
+
duration: 0.22,
|
|
22
|
+
delay: 0.05,
|
|
23
|
+
ease: easings.easeInOut,
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
};
|
|
10
27
|
/**
|
|
11
28
|
* Modal content animation variants
|
|
12
|
-
*
|
|
29
|
+
* Restrained scale + lift with a matched, responsive exit.
|
|
13
30
|
*/
|
|
14
31
|
const modalContentAnimations = {
|
|
15
32
|
initial: {
|
|
16
33
|
opacity: 0,
|
|
17
|
-
scale: 0.
|
|
18
|
-
y:
|
|
34
|
+
scale: 0.975,
|
|
35
|
+
y: 10,
|
|
36
|
+
transformOrigin: "50% 45%",
|
|
19
37
|
willChange: "transform, opacity",
|
|
20
38
|
},
|
|
21
39
|
animate: {
|
|
@@ -23,17 +41,38 @@ const modalContentAnimations = {
|
|
|
23
41
|
scale: 1,
|
|
24
42
|
y: 0,
|
|
25
43
|
transition: {
|
|
26
|
-
|
|
27
|
-
|
|
44
|
+
opacity: {
|
|
45
|
+
duration: 0.18,
|
|
46
|
+
delay: 0.07,
|
|
47
|
+
ease: easings.easeOut,
|
|
48
|
+
},
|
|
49
|
+
scale: {
|
|
50
|
+
...springs.premium,
|
|
51
|
+
delay: 0.07,
|
|
52
|
+
},
|
|
53
|
+
y: {
|
|
54
|
+
...springs.premium,
|
|
55
|
+
delay: 0.07,
|
|
56
|
+
},
|
|
28
57
|
},
|
|
29
58
|
},
|
|
30
59
|
exit: {
|
|
31
60
|
opacity: 0,
|
|
32
|
-
scale: 0.
|
|
33
|
-
y:
|
|
61
|
+
scale: 0.985,
|
|
62
|
+
y: 6,
|
|
34
63
|
transition: {
|
|
35
|
-
|
|
36
|
-
|
|
64
|
+
opacity: {
|
|
65
|
+
duration: 0.14,
|
|
66
|
+
ease: easings.easeIn,
|
|
67
|
+
},
|
|
68
|
+
scale: {
|
|
69
|
+
duration: 0.18,
|
|
70
|
+
ease: easings.easeInOut,
|
|
71
|
+
},
|
|
72
|
+
y: {
|
|
73
|
+
duration: 0.18,
|
|
74
|
+
ease: easings.easeInOut,
|
|
75
|
+
},
|
|
37
76
|
},
|
|
38
77
|
},
|
|
39
78
|
};
|
|
@@ -54,7 +54,11 @@ const ModalRoot = ({ isOpen, onClose, size = "md", closeOnOverlayClick = true, c
|
|
|
54
54
|
titleId,
|
|
55
55
|
subtitleId,
|
|
56
56
|
}), [isOpen, onClose, size, isSizeToken, closeOnOverlayClick, closeOnEsc, showCloseButton, theme, isBodyScrollable, setIsBodyScrollable, titleId, subtitleId]);
|
|
57
|
-
return (jsx(Overlay, { isOpen: isOpen, onClose: onClose, closeOnOverlayClick: closeOnOverlayClick, closeOnEsc: closeOnEsc, position: "center", role: role, ariaModal: true, ariaLabelledBy: titleId, ariaDescribedBy: subtitleId, contentClassName: cn(
|
|
57
|
+
return (jsx(Overlay, { isOpen: isOpen, onClose: onClose, closeOnOverlayClick: closeOnOverlayClick, closeOnEsc: closeOnEsc, position: "center", role: role, ariaModal: true, ariaLabelledBy: titleId, ariaDescribedBy: subtitleId, contentClassName: cn(
|
|
58
|
+
// Opaque: the panel sits behind Overlay's dimming scrim, and the blur lives on
|
|
59
|
+
// that scrim — not here. At /80 the scrim tinted the panel gray instead of
|
|
60
|
+
// frosting anything. Matches Drawer, the other backdrop-grounded dialog.
|
|
61
|
+
surfaceClasses(surfaceLevel, { translucent: false, shadow: false }), theme.container, isSizeToken ? modalSizeVariants[size] : size, darkMode && "dark", className), animations: {
|
|
58
62
|
overlay: modalOverlayAnimations,
|
|
59
63
|
content: modalContentAnimations,
|
|
60
64
|
}, ...props, children: jsx(ModalContext.Provider, { value: contextValue, children: jsx(SurfaceProvider, { level: surfaceLevel, children: children }) }) }));
|