@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
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
const segmentedTheme = {
|
|
5
5
|
// Base styles for the segmented container
|
|
6
|
-
baseStyle: "relative flex w-fit rounded-[var(--segmented-radius)] bg-[var(--color-surface-sunken)] border border-[var(--color-border)] p-[var(--segmented-padding)] shadow-inner-real-
|
|
6
|
+
baseStyle: "relative flex w-fit gap-0.5 rounded-[var(--segmented-radius)] bg-[var(--color-surface-sunken)] border border-[var(--color-border)] p-[var(--segmented-padding)] shadow-inner-real-sm",
|
|
7
7
|
// Size variants using CSS variables
|
|
8
8
|
sizes: {
|
|
9
9
|
sm: "min-h-[var(--segmented-min-h-sm)]",
|
|
@@ -15,14 +15,14 @@ const segmentedTheme = {
|
|
|
15
15
|
// Disabled style
|
|
16
16
|
disabledStyle: "opacity-50 cursor-not-allowed pointer-events-none",
|
|
17
17
|
// Sliding background style with CSS variables
|
|
18
|
-
slidingBackgroundStyle: "absolute top-[0px] left-[0px] rounded-[var(--segmented-inner-radius)] transition-transform duration-
|
|
18
|
+
slidingBackgroundStyle: "absolute top-[0px] left-[0px] rounded-[var(--segmented-inner-radius)] transition-transform duration-[var(--motion-duration-base)] ease-out pointer-events-none z-0 bg-[var(--color-surface)] shadow-real-md",
|
|
19
19
|
};
|
|
20
20
|
/**
|
|
21
21
|
* Default theme for the SegmentedItem component
|
|
22
22
|
*/
|
|
23
23
|
const segmentedItemTheme = {
|
|
24
24
|
// Base styles for the segmented item
|
|
25
|
-
baseStyle: "relative flex min-w-fit flex-1 items-center justify-center whitespace-nowrap transition-all duration-
|
|
25
|
+
baseStyle: "relative flex min-w-fit flex-1 items-center justify-center whitespace-nowrap transition-all duration-[var(--motion-duration-base)] rounded-[var(--segmented-inner-radius)] font-medium cursor-pointer focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary-500)] focus-visible:ring-offset-1",
|
|
26
26
|
// Size variants using CSS variables. Type reads --segmented-text-size-*
|
|
27
27
|
// (which aliases the shared --form-text-size-* ramp) so lg steps up with its
|
|
28
28
|
// box — it was pinned at text-sm across all three sizes while Button/Input,
|
|
@@ -20,8 +20,11 @@ import { SidebarCard } from './SidebarCard.js';
|
|
|
20
20
|
|
|
21
21
|
// Subtle spring on the sidebar's width animation. Stiffness/damping picked so
|
|
22
22
|
// the effective duration sits in the same ~200ms window as the internal CSS
|
|
23
|
-
// transitions on padding/gap (
|
|
24
|
-
// organic settle instead of a linear cubic-bezier.
|
|
23
|
+
// transitions on padding/gap (`--motion-duration-base`), but with a soft
|
|
24
|
+
// organic settle instead of a linear cubic-bezier. NOTE: this spring is a JS
|
|
25
|
+
// motion/react value and does NOT read that token — a theme retuning
|
|
26
|
+
// --motion-duration-base will shift the CSS transitions but not this spring,
|
|
27
|
+
// so the two would need adjusting together. Damping ratio ≈ 0.9 — a
|
|
25
28
|
// hair under critical so there's a barely-perceptible easing-into-final
|
|
26
29
|
// rather than an overshoot/bounce.
|
|
27
30
|
const SIDEBAR_TRANSITION = {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
const sidebarTheme = {
|
|
2
|
-
baseStyle: 'group flex flex-col h-full bg-[var(--color-background)] overflow-visible transition-colors duration-
|
|
2
|
+
baseStyle: 'group flex flex-col h-full bg-[var(--color-background)] overflow-visible transition-colors duration-[var(--motion-duration-base)] relative',
|
|
3
3
|
variants: {
|
|
4
4
|
sidebar: 'relative',
|
|
5
5
|
floating: 'relative m-3 h-[calc(100%-1.5rem)] rounded-xl border border-[var(--color-border)] bg-[color-mix(in_oklab,var(--color-background)_85%,transparent)] backdrop-blur-md shadow-[0_8px_30px_rgba(0,0,0,0.03),inset_0_1px_0_rgba(255,255,255,0.05)]',
|
|
6
|
-
inset: 'relative m-3 h-[calc(100%-1.5rem)] rounded-xl bg-[var(--color-
|
|
6
|
+
inset: 'relative m-3 h-[calc(100%-1.5rem)] rounded-xl bg-[var(--color-surface)] border border-[var(--color-border)] shadow-sm',
|
|
7
7
|
},
|
|
8
8
|
sides: {
|
|
9
9
|
left: 'border-r border-[var(--color-border)]',
|
|
@@ -9,7 +9,7 @@ import '../ScrollArea/smooth/SmoothScrollEngine.js';
|
|
|
9
9
|
const SidebarContent = React__default.forwardRef(({ children, className, ...props }, ref) => {
|
|
10
10
|
const { isCollapsedView } = useSidebarCollapsed();
|
|
11
11
|
const density = useSidebarDensity();
|
|
12
|
-
return (jsx(ScrollArea, { ref: ref, type: "none", size: "thin", className: "flex-1 min-h-0", ...props, children: jsx("div", { className: cn("py-3 transition-[padding] duration-
|
|
12
|
+
return (jsx(ScrollArea, { ref: ref, type: "none", size: "thin", className: "flex-1 min-h-0", ...props, children: jsx("div", { className: cn("py-3 transition-[padding] duration-[var(--motion-duration-base)] ease-[cubic-bezier(0.4,0,0.2,1)]", density === "compact" && "py-2",
|
|
13
13
|
// Collapsed px-3 (12) on a 60px rail leaves a 36px interior — every
|
|
14
14
|
// child row (NavItem, Sidebar.Search) is exactly 36px wide, matching
|
|
15
15
|
// the 36×36 hit-area target.
|
|
@@ -14,7 +14,7 @@ const SidebarHeader = React__default.forwardRef(({ logo, showToggle = true, cust
|
|
|
14
14
|
if (children) {
|
|
15
15
|
return (jsx("div", { ref: ref, className: cn("flex-shrink-0 border-b border-[var(--color-border)]", className), ...props, children: children }));
|
|
16
16
|
}
|
|
17
|
-
return (jsxs("div", { ref: ref, className: cn("flex items-center flex-shrink-0 h-14 border-b border-[var(--color-border)] overflow-visible relative transition-[padding,background-color,border-color] duration-
|
|
17
|
+
return (jsxs("div", { ref: ref, className: cn("flex items-center flex-shrink-0 h-14 border-b border-[var(--color-border)] overflow-visible relative transition-[padding,background-color,border-color] duration-[var(--motion-duration-base)] ease-[cubic-bezier(0.4,0,0.2,1)]",
|
|
18
18
|
// Padding mirrors Sidebar.Content so the header logo sits on the
|
|
19
19
|
// same horizontal track as the NavItem rows below it. px-3 (12px)
|
|
20
20
|
// on the 60px collapsed rail leaves a 36px interior — a 32px logo
|
|
@@ -106,7 +106,7 @@ const SidebarSearch = React__default.forwardRef(({ value: controlledValue, defau
|
|
|
106
106
|
// width) and the input fading in/out via AnimatePresence. Adding
|
|
107
107
|
// a justify-* toggle here would snap the icon by 4px on frame 0
|
|
108
108
|
// of every transition.
|
|
109
|
-
"transition-[background-color,box-shadow] duration-
|
|
109
|
+
"transition-[background-color,box-shadow] duration-[var(--motion-duration-base)] ease-[cubic-bezier(0.4,0,0.2,1)]", "overflow-hidden", isCollapsedView ? shellCollapsed : shellExpanded, inputGroupClassName), children: [jsx("span", { className: cn("flex items-center justify-center flex-shrink-0 pl-2", "text-[var(--color-text-muted)] transition-colors duration-[var(--motion-duration-base)]"), "aria-hidden": !isCollapsedView || undefined, children: iconStart !== null && iconStart !== void 0 ? iconStart : jsx(MagnifyingGlass, { className: "size-5" }) }), jsx(AnimatePresence, { initial: false, children: !isCollapsedView && (jsx(motion.div, { initial: { opacity: 0, x: -4 }, animate: { opacity: 1, x: 0 }, exit: { opacity: 0, x: -4 }, transition: {
|
|
110
110
|
opacity: { duration: 0.15, ease: [0.4, 0, 0.2, 1] },
|
|
111
111
|
x: { duration: 0.2, ease: [0.4, 0, 0.2, 1] },
|
|
112
112
|
}, className: "flex-1 min-w-0 flex items-center overflow-hidden", children: jsx("input", { ref: setInputRef, type: "search", value: value, onChange: handleChange, placeholder: placeholder, "aria-label": collapsedLabel, className: cn(
|
|
@@ -123,7 +123,7 @@ const SidebarSearch = React__default.forwardRef(({ value: controlledValue, defau
|
|
|
123
123
|
jsx("div", { className: cn(
|
|
124
124
|
// py-1 keeps the search row in the same vertical rhythm as the
|
|
125
125
|
// NavGroup's `space-y-1` between nav rows.
|
|
126
|
-
"py-1 transition-[padding] duration-
|
|
126
|
+
"py-1 transition-[padding] duration-[var(--motion-duration-base)] ease-[cubic-bezier(0.4,0,0.2,1)]", isCollapsedView ? "px-3" : "px-2.5", className), ...props, children: isCollapsedView ? (
|
|
127
127
|
// `triggerClassName="block w-full"` makes the Tooltip's wrapping div
|
|
128
128
|
// a full-width block instead of its default `inline-block` — without
|
|
129
129
|
// this, the field collapses to icon-width and sits left-aligned,
|
|
@@ -26,7 +26,7 @@ const SidebarToggle = React__default.forwardRef(({ expandIcon, collapseIcon, cla
|
|
|
26
26
|
const positionClasses = side === "left"
|
|
27
27
|
? "absolute right-0 translate-x-1/2 top-4 z-50"
|
|
28
28
|
: "absolute left-0 -translate-x-1/2 top-4 z-50";
|
|
29
|
-
return (jsx(Button, { ref: ref, iconOnly: true, variant: "ghost", className: cn("size-6 p-0 rounded-full border border-[var(--color-border)] bg-[var(--color-background)]/50 backdrop-blur-sm text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)] hover:shadow-md hover:bg-[var(--color-surface-hover)] opacity-100 transition-all duration-
|
|
29
|
+
return (jsx(Button, { ref: ref, iconOnly: true, variant: "ghost", className: cn("size-6 p-0 rounded-full border border-[var(--color-border)] bg-[var(--color-background)]/50 backdrop-blur-sm text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)] hover:shadow-md hover:bg-[var(--color-surface-hover)] opacity-100 transition-all duration-[var(--motion-duration-slower)]", positionClasses, className), onClick: handleClick, "aria-label": collapsed ? "Expand sidebar" : "Collapse sidebar", title: collapsed ? "Expand sidebar" : "Collapse sidebar", ...buttonProps, children: (_b = (collapsed ? expandIcon : collapseIcon)) !== null && _b !== void 0 ? _b : (jsx(motion.div, { initial: false, animate: { rotate: collapsed ? 180 : 0 }, transition: { duration: 0.2, ease: [0.4, 0, 0.2, 1] }, className: "flex items-center justify-center", children: jsx(CaretLeft, { className: "size-3", weight: "bold" }) })) }));
|
|
30
30
|
});
|
|
31
31
|
SidebarToggle.displayName = "SidebarToggle";
|
|
32
32
|
|
|
@@ -21,7 +21,7 @@ const SidebarUserProfile = React__default.forwardRef(({ name, email, avatar, sta
|
|
|
21
21
|
// Strip drag/animation DOM handlers that collide with motion's prop types
|
|
22
22
|
const { onAnimationStart, onAnimationEnd, onDrag, onDragStart, onDragEnd, ...motionSafeProps } = props;
|
|
23
23
|
const avatarElement = (jsx(Avatar, { src: avatar, name: name, status: status !== null && status !== void 0 ? status : "none", className: "size-9" }));
|
|
24
|
-
const content = (jsxs(motion.div, { ref: ref, className: cn("flex w-full items-center rounded-[var(--radius-base)] cursor-pointer border border-transparent transition-[padding,gap,background-color,border-color,color,box-shadow] duration-
|
|
24
|
+
const content = (jsxs(motion.div, { ref: ref, className: cn("flex w-full items-center rounded-[var(--radius-base)] cursor-pointer border border-transparent transition-[padding,gap,background-color,border-color,color,box-shadow] duration-[var(--motion-duration-base)] ease-[cubic-bezier(0.4,0,0.2,1)] ", isCollapsedView ? "justify-center gap-0 px-1" : "gap-2 ", className), role: "button", tabIndex: 0, onClick: onClick, onKeyDown: (e) => {
|
|
25
25
|
if ((e.key === "Enter" || e.key === " ") && onClick) {
|
|
26
26
|
e.preventDefault();
|
|
27
27
|
e.currentTarget.click();
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { SlidingNumberProps } from "./SlidingNumber.types";
|
|
3
|
+
/**
|
|
4
|
+
* Every rendered character — an animated digit or a static one (`-`, `.`, `,`) —
|
|
5
|
+
* occupies exactly this many `em`s. Exported so a host can reserve an exact width
|
|
6
|
+
* for a given character count WITHOUT measuring the DOM: `InputCounter` sizes its
|
|
7
|
+
* value slot from it, which is what keeps the box identical whether the animated
|
|
8
|
+
* number or the click-to-edit field is mounted. Changing it changes that geometry.
|
|
9
|
+
*/
|
|
10
|
+
export declare const SLIDING_NUMBER_CHAR_WIDTH_EM = 0.6;
|
|
3
11
|
/**
|
|
4
12
|
* SlidingNumber component with odometer-style digit animation
|
|
5
13
|
*
|
|
@@ -4,11 +4,20 @@ import React__default, { useMemo } from 'react';
|
|
|
4
4
|
import { motion, useReducedMotion } from 'motion/react';
|
|
5
5
|
import { cn } from '../../../utils/cn.js';
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
/**
|
|
8
|
+
* Every rendered character — an animated digit or a static one (`-`, `.`, `,`) —
|
|
9
|
+
* occupies exactly this many `em`s. Exported so a host can reserve an exact width
|
|
10
|
+
* for a given character count WITHOUT measuring the DOM: `InputCounter` sizes its
|
|
11
|
+
* value slot from it, which is what keeps the box identical whether the animated
|
|
12
|
+
* number or the click-to-edit field is mounted. Changing it changes that geometry.
|
|
13
|
+
*/
|
|
14
|
+
const SLIDING_NUMBER_CHAR_WIDTH_EM = 0.6;
|
|
15
|
+
const CHAR_WIDTH = `${SLIDING_NUMBER_CHAR_WIDTH_EM}em`;
|
|
16
|
+
const DIGIT_CONTAINER_STYLE = { height: "1em", width: CHAR_WIDTH, lineHeight: "1em" };
|
|
8
17
|
const DIGIT_ITEM_STYLE = { height: "1em", lineHeight: "1em" };
|
|
9
18
|
const DIGITS = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
|
|
10
19
|
const DEFAULT_TRANSITION = { type: "spring", stiffness: 300, damping: 30, bounce: 0 };
|
|
11
|
-
const STATIC_CHAR_STYLE = { width:
|
|
20
|
+
const STATIC_CHAR_STYLE = { width: CHAR_WIDTH };
|
|
12
21
|
const ROOT_STYLE = { lineHeight: "1" };
|
|
13
22
|
/**
|
|
14
23
|
* Individual digit component that handles the sliding animation
|
|
@@ -72,4 +81,4 @@ const SlidingNumber = React__default.forwardRef(({ value, decimalPlaces = 0, pad
|
|
|
72
81
|
});
|
|
73
82
|
SlidingNumber.displayName = "SlidingNumber";
|
|
74
83
|
|
|
75
|
-
export { SlidingNumber };
|
|
84
|
+
export { SLIDING_NUMBER_CHAR_WIDTH_EM, SlidingNumber };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const sortableTheme = {
|
|
2
2
|
containerStyle: "relative list-none",
|
|
3
3
|
itemStyle: "relative cursor-move select-none relative focus-within:z-10 list-none",
|
|
4
|
-
dragHandleStyle: "cursor-grab active:cursor-grabbing p-1 text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)] flex items-center justify-center rounded transition-colors duration-
|
|
4
|
+
dragHandleStyle: "cursor-grab active:cursor-grabbing p-1 text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)] flex items-center justify-center rounded transition-colors duration-[var(--motion-duration-base)]",
|
|
5
5
|
};
|
|
6
6
|
|
|
7
7
|
export { sortableTheme };
|
|
@@ -7,7 +7,7 @@ const tabsTheme = {
|
|
|
7
7
|
// TabsList styles with proper design tokens
|
|
8
8
|
listStyle: "relative inline-flex items-center flex-row border-b border-[var(--color-border)] gap-6",
|
|
9
9
|
// TabsTrigger base styles - no individual borders, underline will be handled separately
|
|
10
|
-
triggerStyle: "relative inline-flex items-center justify-center whitespace-nowrap font-semibold transition-all duration-
|
|
10
|
+
triggerStyle: "relative inline-flex items-center justify-center whitespace-nowrap font-semibold transition-all duration-[var(--motion-duration-slow)] cursor-pointer focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary)] focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)] data-[state=active]:text-[var(--color-primary)]",
|
|
11
11
|
// TabsTrigger size variants using CSS variables where applicable
|
|
12
12
|
triggerSizes: {
|
|
13
13
|
sm: "px-0 py-1.5 text-sm",
|
|
@@ -25,7 +25,7 @@ const tagTheme = {
|
|
|
25
25
|
removeButtonStyle: "inline-flex items-center justify-center rounded-full p-0.5 -ml-1 " +
|
|
26
26
|
"hover:bg-[var(--color-surface-hover)] " +
|
|
27
27
|
"text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)] " +
|
|
28
|
-
"transition-all duration-
|
|
28
|
+
"transition-all duration-[var(--motion-duration-slow)] cursor-pointer focus:outline-none " +
|
|
29
29
|
"focus-visible:ring-2 focus-visible:ring-[var(--color-primary)]",
|
|
30
30
|
removeIconSizes: {
|
|
31
31
|
sm: "size-3",
|
|
@@ -93,7 +93,7 @@ const ToastProvider = ({ children, position = 'top-right', maxToasts = 5, defaul
|
|
|
93
93
|
removeAllToasts,
|
|
94
94
|
}), [toasts, addToast, removeToast, removeAllToasts]);
|
|
95
95
|
const portalTarget = isClient ? document.body : null;
|
|
96
|
-
return (jsxs(ToastContext.Provider, { value: contextValue, children: [children, portalTarget ? createPortal(jsx("div", { className: cn(toastTheme.containerStyle, positionStyles[position]), "aria-live": "polite", "aria-label": "Notifications", children: jsx("div", { className: "relative w-80", style: {
|
|
96
|
+
return (jsxs(ToastContext.Provider, { value: contextValue, children: [children, portalTarget ? createPortal(jsx("div", { "data-flikkui-portal": "", className: cn(toastTheme.containerStyle, positionStyles[position]), "aria-live": "polite", "aria-label": "Notifications", children: jsx("div", { className: "relative w-80", style: {
|
|
97
97
|
paddingBottom: !position.startsWith("bottom") && isHovered && toasts.length > 1 ? totalExpandedHeight : undefined,
|
|
98
98
|
paddingTop: position.startsWith("bottom") && isHovered && toasts.length > 1 ? totalExpandedHeight : undefined,
|
|
99
99
|
}, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, children: jsx(AnimatePresence, { mode: "popLayout", children: toasts.map((toast, index) => (jsx(Toast, { toast: toast, onDismiss: removeToast, index: index, isExpanded: isHovered, totalToasts: toasts.length, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, onHeightChange: handleToastHeight, expandedOffset: getExpandedOffset(index), darkMode: darkMode, position: position }, toast.id))) }) }) }), portalTarget) : null] }));
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const treeTheme = {
|
|
2
2
|
baseStyle: 'flex flex-col w-full',
|
|
3
|
-
nodeStyle: 'flex items-center py-1 pr-1 rounded-[calc(var(--radius-base)*0.75)] hover:bg-[var(--color-
|
|
3
|
+
nodeStyle: 'flex items-center py-1 pr-1 rounded-[calc(var(--radius-base)*0.75)] hover:bg-[var(--color-surface)] cursor-pointer transition-colors select-none gap-2',
|
|
4
4
|
labelStyle: 'flex-1 text-base text-[var(--color-text-primary)] truncate',
|
|
5
5
|
iconStyle: 'flex-shrink-0 text-[var(--color-text-muted)]',
|
|
6
6
|
expandIconStyle: 'flex-shrink-0 mr-1 text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)] transition-colors cursor-pointer size-4 flex items-center justify-center',
|
|
@@ -9,9 +9,7 @@ export * from "./Button";
|
|
|
9
9
|
export * from "./ButtonGroup";
|
|
10
10
|
export * from "./Calendar";
|
|
11
11
|
export * from "./Card";
|
|
12
|
-
export * from "./CardStack";
|
|
13
12
|
export * from "./HeroCard";
|
|
14
|
-
export * from "./Carousel";
|
|
15
13
|
export * from "./CommandPalette";
|
|
16
14
|
export * from "./Separator";
|
|
17
15
|
export * from "./Drawer";
|
|
@@ -7,7 +7,6 @@ export { Badge } from './Badge/Badge.js';
|
|
|
7
7
|
export { Breadcrumbs } from './Breadcrumbs/Breadcrumbs.js';
|
|
8
8
|
export { breadcrumbsTheme, breadcrumbsVariants, defaultSeparator } from './Breadcrumbs/Breadcrumbs.theme.js';
|
|
9
9
|
export { Button } from './Button/Button.js';
|
|
10
|
-
export { getRippleAnimation, getRippleColorClass, useRipple } from './Button/Button.ripple.js';
|
|
11
10
|
export { ButtonGroup } from './ButtonGroup/ButtonGroup.js';
|
|
12
11
|
export { ButtonGroupSeparator } from './ButtonGroup/ButtonGroupSeparator.js';
|
|
13
12
|
export { ButtonGroupText } from './ButtonGroup/ButtonGroupText.js';
|
|
@@ -16,11 +15,8 @@ export { calendarTheme } from './Calendar/Calendar.theme.js';
|
|
|
16
15
|
export { calendarAnimations } from './Calendar/Calendar.animations.js';
|
|
17
16
|
export { CalendarMini } from './Calendar/CalendarMini/CalendarMini.js';
|
|
18
17
|
export { Card } from './Card/Card.js';
|
|
19
|
-
export { CardStack } from './CardStack/CardStack.js';
|
|
20
18
|
export { HERO_CARD_DEFAULT_IMAGE, HeroCard } from './HeroCard/HeroCard.js';
|
|
21
19
|
export { heroCardTheme } from './HeroCard/HeroCard.theme.js';
|
|
22
|
-
export { Carousel } from './Carousel/Carousel.js';
|
|
23
|
-
export { CarouselBody } from './Carousel/CarouselBody.js';
|
|
24
20
|
export { CommandPalette } from './CommandPalette/CommandPalette.js';
|
|
25
21
|
export { commandPaletteTheme } from './CommandPalette/CommandPalette.theme.js';
|
|
26
22
|
export { Separator } from './Separator/Separator.js';
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Moved with ChartTooltip out of charts/utils/animation-utils.ts when the
|
|
2
|
+
// component was lifted to core/shared (it is consumed by data-display too).
|
|
3
|
+
// These transitions are ChartTooltip-only; chart-wide animation values stay
|
|
4
|
+
// in charts/utils/animation-utils.ts per CLAUDE.md §19.
|
|
5
|
+
/** Tooltip pop-in: springy position/scale with a quick opacity/scale settle. */
|
|
6
|
+
const TOOLTIP_ENTER_TRANSITION = {
|
|
7
|
+
type: "spring",
|
|
8
|
+
stiffness: 400,
|
|
9
|
+
damping: 30,
|
|
10
|
+
opacity: { duration: 0.15 },
|
|
11
|
+
scale: { duration: 0.15 },
|
|
12
|
+
};
|
|
13
|
+
const TOOLTIP_EXIT_TRANSITION = {
|
|
14
|
+
type: "spring",
|
|
15
|
+
stiffness: 300,
|
|
16
|
+
damping: 25,
|
|
17
|
+
duration: 0.15,
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export { TOOLTIP_ENTER_TRANSITION, TOOLTIP_EXIT_TRANSITION };
|
|
@@ -5,7 +5,7 @@ import { AnimatePresence, motion } from 'motion/react';
|
|
|
5
5
|
import { cn } from '../../../../utils/cn.js';
|
|
6
6
|
import { chartTooltipTheme } from './ChartTooltip.theme.js';
|
|
7
7
|
import { useIsClient } from '../../../../hooks/useIsClient.js';
|
|
8
|
-
import { TOOLTIP_EXIT_TRANSITION, TOOLTIP_ENTER_TRANSITION } from '
|
|
8
|
+
import { TOOLTIP_EXIT_TRANSITION, TOOLTIP_ENTER_TRANSITION } from './ChartTooltip.animations.js';
|
|
9
9
|
|
|
10
10
|
// Helper function to check if content is MultiSeriesData
|
|
11
11
|
const isMultiSeriesData = (content) => {
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export interface RippleProps {
|
|
3
|
+
/**
|
|
4
|
+
* Suppress ripples without unmounting. Only needed for hosts that signal
|
|
5
|
+
* disabled via `aria-disabled` — a natively `disabled` element does not
|
|
6
|
+
* dispatch pointer events at all, so it needs nothing here.
|
|
7
|
+
*/
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Tint override for the ripple circles. Defaults to `bg-current`, which
|
|
11
|
+
* resolves to the host's own text colour and therefore adapts to every
|
|
12
|
+
* variant, surface, theme, and colour scheme without configuration.
|
|
13
|
+
*/
|
|
14
|
+
className?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare const Ripple: React.FC<RippleProps>;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
import { useRef, useState, useEffect, useCallback } from 'react';
|
|
4
|
+
import { useReducedMotion, motion } from 'motion/react';
|
|
5
|
+
import { cn } from '../../../utils/cn.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Shared press ripple for interactive surfaces (Button, NavItem, MenuItem,
|
|
9
|
+
* Pill, SelectableCard). One source of truth so every pressable surface in the
|
|
10
|
+
* library ripples with the same character — the sibling of `createPressVariants`
|
|
11
|
+
* in `interaction.animations.ts`.
|
|
12
|
+
*
|
|
13
|
+
* Drop it in as the LAST child of a host that is `relative`:
|
|
14
|
+
*
|
|
15
|
+
* ```tsx
|
|
16
|
+
* <button className="relative">
|
|
17
|
+
* Save
|
|
18
|
+
* <Ripple />
|
|
19
|
+
* </button>
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* It wires itself: the layer reads its own `parentElement` and listens there,
|
|
23
|
+
* so the host never threads a handler or a ref. Clipping lives on the layer
|
|
24
|
+
* (`overflow-hidden rounded-[inherit]`), so the host does not need
|
|
25
|
+
* `overflow-hidden` of its own.
|
|
26
|
+
*/
|
|
27
|
+
/** Interactive elements that earn a ripple. See `isInteractive` below. */
|
|
28
|
+
const INTERACTIVE_SELECTOR = [
|
|
29
|
+
"button",
|
|
30
|
+
"a[href]",
|
|
31
|
+
'[role="button"]',
|
|
32
|
+
'[role="menuitem"]',
|
|
33
|
+
'[role="menuitemcheckbox"]',
|
|
34
|
+
'[role="menuitemradio"]',
|
|
35
|
+
'[role="option"]',
|
|
36
|
+
'[role="tab"]',
|
|
37
|
+
'[tabindex]:not([tabindex="-1"])',
|
|
38
|
+
].join(", ");
|
|
39
|
+
/**
|
|
40
|
+
* A ripple is a press affordance, so it must only appear on something a user
|
|
41
|
+
* can actually press — including by keyboard. A bare `<div onClick>` has no
|
|
42
|
+
* role and no tab stop, so advertising interactivity on it would be the exact
|
|
43
|
+
* pattern CLAUDE.md §8b describes when it explains why Badge's click path was
|
|
44
|
+
* removed. Gating on the DOM (rather than on the presence of a handler) keeps
|
|
45
|
+
* that guarantee self-correcting: a host becomes rippleable by becoming
|
|
46
|
+
* accessible, not by passing a prop.
|
|
47
|
+
*/
|
|
48
|
+
function isInteractive(element) {
|
|
49
|
+
return element.matches(INTERACTIVE_SELECTOR);
|
|
50
|
+
}
|
|
51
|
+
/** Duration scales with reach — a fixed value crosses a large surface far too fast. */
|
|
52
|
+
const MIN_DURATION = 0.35;
|
|
53
|
+
const MAX_DURATION = 0.7;
|
|
54
|
+
const DURATION_DIVISOR = 500;
|
|
55
|
+
function durationForRadius(radius) {
|
|
56
|
+
return Math.min(MAX_DURATION, Math.max(MIN_DURATION, radius / DURATION_DIVISOR));
|
|
57
|
+
}
|
|
58
|
+
const Ripple = ({ disabled = false, className }) => {
|
|
59
|
+
const layerRef = useRef(null);
|
|
60
|
+
const [ripples, setRipples] = useState([]);
|
|
61
|
+
const shouldReduceMotion = useReducedMotion();
|
|
62
|
+
// Monotonic ids. Date.now() collides when two presses land in the same
|
|
63
|
+
// millisecond, which produced duplicate React keys in the previous
|
|
64
|
+
// Button-only implementation.
|
|
65
|
+
const nextId = useRef(0);
|
|
66
|
+
// Read through refs inside the listener so the effect below subscribes once
|
|
67
|
+
// per host rather than re-subscribing whenever these flip.
|
|
68
|
+
const disabledRef = useRef(disabled);
|
|
69
|
+
disabledRef.current = disabled;
|
|
70
|
+
const reducedMotionRef = useRef(shouldReduceMotion);
|
|
71
|
+
reducedMotionRef.current = shouldReduceMotion;
|
|
72
|
+
// Dev warning fires at most once per host, not once per press.
|
|
73
|
+
const warnedRef = useRef(false);
|
|
74
|
+
useEffect(() => {
|
|
75
|
+
const layer = layerRef.current;
|
|
76
|
+
const host = layer === null || layer === void 0 ? void 0 : layer.parentElement;
|
|
77
|
+
if (!host)
|
|
78
|
+
return;
|
|
79
|
+
// NOTE: no runtime check that the host is positioned. jsdom does not
|
|
80
|
+
// process Tailwind, so `getComputedStyle(host).position` reads "static"
|
|
81
|
+
// for a `relative` host in every test — a warning there is pure noise for
|
|
82
|
+
// us and for consumers. The `relative` contract is documented above and
|
|
83
|
+
// enforced by review.
|
|
84
|
+
// `pointerdown` rather than `click` on purpose: it fires on press instead
|
|
85
|
+
// of release, and a keyboard Enter/Space never produces one — so ripples
|
|
86
|
+
// are pointer-only without any synthetic-click sniffing.
|
|
87
|
+
const handlePointerDown = (event) => {
|
|
88
|
+
if (disabledRef.current || reducedMotionRef.current)
|
|
89
|
+
return;
|
|
90
|
+
if (host.hasAttribute("disabled") || host.getAttribute("aria-disabled") === "true")
|
|
91
|
+
return;
|
|
92
|
+
// Checked per press, not once on mount: a host's interactivity is not
|
|
93
|
+
// static (SelectableCard drops to tabIndex={-1} while disabled), and a
|
|
94
|
+
// mount-time gate would leave the listener permanently detached for any
|
|
95
|
+
// host that starts non-interactive and later becomes pressable.
|
|
96
|
+
if (!isInteractive(host)) {
|
|
97
|
+
if (process.env.NODE_ENV !== "production" && !warnedRef.current) {
|
|
98
|
+
warnedRef.current = true;
|
|
99
|
+
// eslint-disable-next-line no-console
|
|
100
|
+
console.warn("[Ripple]: host is not an interactive element (needs a button/link role or a tab stop) — no ripple will render.");
|
|
101
|
+
}
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const rect = host.getBoundingClientRect();
|
|
105
|
+
const x = event.clientX - rect.left;
|
|
106
|
+
const y = event.clientY - rect.top;
|
|
107
|
+
// Reach the farthest corner, so the ripple always covers the host.
|
|
108
|
+
const dx = Math.max(x, rect.width - x);
|
|
109
|
+
const dy = Math.max(y, rect.height - y);
|
|
110
|
+
const radius = Math.hypot(dx, dy);
|
|
111
|
+
if (radius === 0)
|
|
112
|
+
return;
|
|
113
|
+
setRipples((prev) => [...prev, { id: nextId.current++, x, y, radius }]);
|
|
114
|
+
};
|
|
115
|
+
host.addEventListener("pointerdown", handlePointerDown);
|
|
116
|
+
return () => host.removeEventListener("pointerdown", handlePointerDown);
|
|
117
|
+
}, []);
|
|
118
|
+
const removeRipple = useCallback((id) => {
|
|
119
|
+
setRipples((prev) => prev.filter((ripple) => ripple.id !== id));
|
|
120
|
+
}, []);
|
|
121
|
+
// The layer always mounts, even under reduced motion — the listener bails on
|
|
122
|
+
// `reducedMotionRef` instead. Returning null here would leave the effect
|
|
123
|
+
// above bound against a null ref, so a user turning reduced motion off
|
|
124
|
+
// mid-session would get no ripple until the host remounted.
|
|
125
|
+
return (jsx("span", { ref: layerRef, "aria-hidden": "true", "data-flikkui-ripple": "", className: "absolute inset-0 overflow-hidden rounded-[inherit] pointer-events-none", children: ripples.map((ripple) => (jsx(motion.span, { "data-flikkui-ripple-circle": "", initial: { scale: 0, opacity: 0.2 }, animate: { scale: 1, opacity: 0 }, transition: {
|
|
126
|
+
duration: durationForRadius(ripple.radius),
|
|
127
|
+
ease: "easeOut",
|
|
128
|
+
}, onAnimationComplete: () => removeRipple(ripple.id),
|
|
129
|
+
// Geometry is per-press, so it goes through `style` — an
|
|
130
|
+
// interpolated class name would not exist in the shipped CSS
|
|
131
|
+
// (CLAUDE.md §3).
|
|
132
|
+
style: {
|
|
133
|
+
width: ripple.radius * 2,
|
|
134
|
+
height: ripple.radius * 2,
|
|
135
|
+
left: ripple.x - ripple.radius,
|
|
136
|
+
top: ripple.y - ripple.radius,
|
|
137
|
+
}, className: cn("absolute rounded-full bg-current", className) }, ripple.id))) }));
|
|
138
|
+
};
|
|
139
|
+
Ripple.displayName = "Ripple";
|
|
140
|
+
|
|
141
|
+
export { Ripple };
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
const ganttChartTheme = {
|
|
2
2
|
baseStyle: "flex flex-col w-full overflow-hidden rounded-[var(--gantt-chart-radius)] border border-[var(--color-border)] bg-[var(--color-background)] text-sm shadow-sm",
|
|
3
|
-
toolbarStyle: "flex flex-wrap items-center justify-between gap-2 px-3 py-2 border-b border-[var(--color-border)] bg-[var(--color-
|
|
3
|
+
toolbarStyle: "flex flex-wrap items-center justify-between gap-2 px-3 py-2 border-b border-[var(--color-border)] bg-[var(--color-surface)]/80",
|
|
4
4
|
tablePanelStyle: "flex flex-col shrink-0 overflow-hidden border-r border-[var(--color-border)] bg-[var(--color-background)]",
|
|
5
5
|
chartPanelStyle: "flex flex-col flex-1 min-w-0 overflow-hidden",
|
|
6
|
-
tableHeaderStyle: "flex items-center h-[56px] border-b border-[var(--color-border)] bg-[var(--color-
|
|
6
|
+
tableHeaderStyle: "flex items-center h-[56px] border-b border-[var(--color-border)] bg-[var(--color-surface)]/80",
|
|
7
7
|
tableHeaderCellStyle: "px-3 text-[11px] font-semibold uppercase tracking-wide text-[var(--color-text-muted)] truncate",
|
|
8
|
-
tableGroupRowStyle: "flex items-center cursor-pointer select-none border-b border-[var(--color-border)]/30 bg-[var(--color-
|
|
9
|
-
tableTaskRowStyle: "flex items-center border-b border-[var(--color-border)]/20 hover:bg-[var(--color-
|
|
8
|
+
tableGroupRowStyle: "flex items-center cursor-pointer select-none border-b border-[var(--color-border)]/30 bg-[var(--color-surface)]/35 hover:bg-[var(--color-surface)] transition-colors",
|
|
9
|
+
tableTaskRowStyle: "flex items-center border-b border-[var(--color-border)]/20 hover:bg-[var(--color-surface)]/70 transition-colors",
|
|
10
10
|
tableCellStyle: "px-3 truncate text-[var(--color-text-primary)]",
|
|
11
11
|
timelineHeaderStyle: "bg-[var(--color-background)] border-b border-[var(--color-border)] shadow-[0_1px_0_var(--color-border)]",
|
|
12
|
-
timelineMonthStyle: "text-[11px] font-semibold uppercase tracking-wide text-[var(--color-text-secondary)] px-2 border-b border-[var(--color-border)] flex items-center bg-[var(--color-
|
|
12
|
+
timelineMonthStyle: "text-[11px] font-semibold uppercase tracking-wide text-[var(--color-text-secondary)] px-2 border-b border-[var(--color-border)] flex items-center bg-[var(--color-surface)]/45",
|
|
13
13
|
timelineDayStyle: "text-[10px] text-[var(--color-text-muted)] flex items-center justify-center border-r border-[var(--color-border)]/20",
|
|
14
14
|
gridLineStyle: "border-r border-[var(--color-border)]/20",
|
|
15
|
-
weekendStyle: "bg-[var(--color-
|
|
15
|
+
weekendStyle: "bg-[var(--color-surface)]/35",
|
|
16
16
|
todayMarkerStyle: "bg-[var(--color-primary)] w-0.5",
|
|
17
17
|
todayColumnStyle: "bg-[var(--color-primary)]/10",
|
|
18
18
|
taskBarStyle: "absolute cursor-pointer flex items-center overflow-hidden shadow-sm ring-1 ring-black/10",
|
|
@@ -5,7 +5,7 @@ import { motion } from 'motion/react';
|
|
|
5
5
|
import { cn } from '../../../utils/cn.js';
|
|
6
6
|
import { useGanttContext, useGanttInteraction } from './GanttChartContext.js';
|
|
7
7
|
import { getDayOffset, calculateExpectedProgress, formatDateShort, formatDuration } from './GanttChart.utils.js';
|
|
8
|
-
import { ChartTooltip } from '../../
|
|
8
|
+
import { ChartTooltip } from '../../core/shared/ChartTooltip/ChartTooltip.js';
|
|
9
9
|
import { Avatar } from '../../core/Avatar/Avatar.js';
|
|
10
10
|
import { GanttTaskContextMenu } from './GanttTaskContextMenu.js';
|
|
11
11
|
import { taskBarVariants } from './GanttChart.animations.js';
|
|
@@ -61,7 +61,7 @@ const GanttTimelineHeader = ({ days, monthSpans, }) => {
|
|
|
61
61
|
return (jsxs("div", { className: cn(theme.timelineHeaderStyle), style: { width: totalWidth }, children: [jsx("div", { className: "flex", style: { height: 28 }, children: headerSpans.map((span) => (jsx("div", { className: cn(theme.timelineMonthStyle), style: { width: span.span * dayWidth }, children: span.label }, `${span.label}-${span.startIndex}`))) }), jsx("div", { className: "flex", style: { height: 28 }, children: days.map((day, i) => {
|
|
62
62
|
const isToday = isSameDay(day, today);
|
|
63
63
|
const weekend = isWeekend(day);
|
|
64
|
-
return (jsx("div", { className: cn(theme.timelineDayStyle, weekend && "bg-[var(--color-
|
|
64
|
+
return (jsx("div", { className: cn(theme.timelineDayStyle, weekend && "bg-[var(--color-surface)]/50", isToday && "font-semibold text-[var(--color-primary)]"), style: { width: dayWidth }, children: getDayLabel(day, zoom) }, i));
|
|
65
65
|
}) })] }));
|
|
66
66
|
};
|
|
67
67
|
|
|
@@ -5,7 +5,6 @@ import { cn } from '../../../utils/cn.js';
|
|
|
5
5
|
import { useGanttContext } from './GanttChartContext.js';
|
|
6
6
|
import { Segmented } from '../../core/Segmented/Segmented.js';
|
|
7
7
|
import { Button } from '../../core/Button/Button.js';
|
|
8
|
-
import 'react';
|
|
9
8
|
import { Checkbox } from '../../forms/Checkbox/Checkbox.js';
|
|
10
9
|
|
|
11
10
|
const ZOOM_OPTIONS = [
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
3
|
import React__default, { useMemo } from 'react';
|
|
4
|
-
import { motion } from 'motion/react';
|
|
5
4
|
import { ArrowUpRight, ArrowDownRight } from '@phosphor-icons/react';
|
|
6
5
|
import { cn } from '../../../utils/cn.js';
|
|
6
|
+
import { Progress } from '../../core/Progress/Progress.js';
|
|
7
7
|
import { kpiTheme } from './KPI.theme.js';
|
|
8
8
|
|
|
9
9
|
const KPI = React__default.forwardRef(({ value, label, trend, trendLabel, progress, barCount = 24, subtitle, icon, size = "md", color = "primary", className, theme: customTheme = {}, ...props }, ref) => {
|
|
@@ -32,28 +32,19 @@ const KPI = React__default.forwardRef(({ value, label, trend, trendLabel, progre
|
|
|
32
32
|
: trend < 0
|
|
33
33
|
? "down"
|
|
34
34
|
: "neutral";
|
|
35
|
-
//
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
const barSize = kpiTheme.barSizes[size];
|
|
35
|
+
// KPI owns its own bar geometry; hand it to Progress as segment sizing.
|
|
36
|
+
// (`width` predates the flex-1 cells and is unused.)
|
|
37
|
+
const segmentSizes = useMemo(() => Object.fromEntries(Object.entries(kpiTheme.barSizes).map(([key, { height, gap }]) => [
|
|
38
|
+
key,
|
|
39
|
+
{ height, gap },
|
|
40
|
+
])), []);
|
|
42
41
|
return (jsxs("div", { ref: ref, className: cn(theme.baseStyle, className), ...props, children: [jsxs("div", { className: "flex items-start justify-between", children: [jsxs("div", { className: "flex items-baseline gap-2", children: [jsx("span", { className: cn(theme.valueSizes[size]), children: value }), label &&
|
|
43
42
|
(typeof label === "string" ? (jsxs("span", { className: cn(theme.labelStyle, theme.labelSizes[size]), children: [icon && (jsx("span", { className: "inline-flex items-center mr-1", children: icon })), label] })) : (label))] }), formattedTrend &&
|
|
44
43
|
trendDirection &&
|
|
45
|
-
(typeof formattedTrend === "string" ? (jsxs("span", { className: cn("inline-flex items-center gap-0.5 font-medium", theme.trendSizes[size], trendDirection === "up" && theme.trendPositive, trendDirection === "down" && theme.trendNegative, trendDirection === "neutral" && theme.trendNeutral), children: [formattedTrend, trendDirection === "up" && (jsx(ArrowUpRight, { className: "size-4" })), trendDirection === "down" && (jsx(ArrowDownRight, { className: "size-4" }))] })) : (formattedTrend))] }), progress !== undefined && (jsx(
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
? 0.4 + (fadeDistance / 3) * 0.6
|
|
50
|
-
: 1;
|
|
51
|
-
return (jsx("div", { className: cn("relative rounded-sm flex-1", barSize.height, theme.barEmptyColor), children: isFilled && (jsx(motion.div, { className: cn("absolute inset-0 rounded-sm", theme.barFilledColors[color]), initial: { opacity: 0 }, animate: { opacity: fillOpacity }, transition: {
|
|
52
|
-
duration: 0.25,
|
|
53
|
-
ease: "easeOut",
|
|
54
|
-
delay: i * 0.03,
|
|
55
|
-
} })) }, i));
|
|
56
|
-
}) })), subtitle &&
|
|
44
|
+
(typeof formattedTrend === "string" ? (jsxs("span", { className: cn("inline-flex items-center gap-0.5 font-medium", theme.trendSizes[size], trendDirection === "up" && theme.trendPositive, trendDirection === "down" && theme.trendNegative, trendDirection === "neutral" && theme.trendNeutral), children: [formattedTrend, trendDirection === "up" && (jsx(ArrowUpRight, { className: "size-4" })), trendDirection === "down" && (jsx(ArrowDownRight, { className: "size-4" }))] })) : (formattedTrend))] }), progress !== undefined && (jsx(Progress, { value: progress, segments: barCount, segmentFade: true, size: size, className: theme.barFilledColors[color], "aria-label": `Progress: ${progress}%`, theme: {
|
|
45
|
+
segmentEmptyStyle: theme.barEmptyColor,
|
|
46
|
+
segmentSizes,
|
|
47
|
+
} })), subtitle &&
|
|
57
48
|
(typeof subtitle === "string" ? (jsx("span", { className: cn(theme.subtitleStyle), children: subtitle })) : (subtitle))] }));
|
|
58
49
|
});
|
|
59
50
|
KPI.displayName = "KPI";
|
|
@@ -3,9 +3,9 @@ import { semanticBgColors } from '../../../utils/colorUtils.js';
|
|
|
3
3
|
const kpiTheme = {
|
|
4
4
|
baseStyle: "flex flex-col gap-3",
|
|
5
5
|
valueSizes: {
|
|
6
|
-
sm: "text-[length:var(--kpi-value-size-sm)]
|
|
7
|
-
md: "text-[length:var(--kpi-value-size-md)]
|
|
8
|
-
lg: "text-[length:var(--kpi-value-size-lg)]
|
|
6
|
+
sm: "text-[length:var(--kpi-value-size-sm)]/[var(--kpi-value-line-height-sm)] font-bold text-[var(--color-text-primary)]",
|
|
7
|
+
md: "text-[length:var(--kpi-value-size-md)]/[var(--kpi-value-line-height-md)] font-bold text-[var(--color-text-primary)]",
|
|
8
|
+
lg: "text-[length:var(--kpi-value-size-lg)]/[var(--kpi-value-line-height-lg)] font-bold text-[var(--color-text-primary)]",
|
|
9
9
|
},
|
|
10
10
|
labelStyle: "text-[var(--color-text-primary)] font-medium",
|
|
11
11
|
labelSizes: {
|
|
@@ -23,7 +23,11 @@ const kpiTheme = {
|
|
|
23
23
|
},
|
|
24
24
|
barFilledColors: {
|
|
25
25
|
...semanticBgColors,
|
|
26
|
-
|
|
26
|
+
// The gray role, not a text token (§8: never paint a fill with --color-text-*).
|
|
27
|
+
// These bars carry no text, so they take the role's own weight rather than a
|
|
28
|
+
// -contrast pairing; --color-mono is the mono token that flips per mode
|
|
29
|
+
// (900 light / 200 dark), which a fixed ramp rung would not.
|
|
30
|
+
mono: "bg-[var(--color-mono)]",
|
|
27
31
|
},
|
|
28
32
|
barEmptyColor: "bg-[var(--color-surface-sunken)]",
|
|
29
33
|
barSizes: {
|