@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
|
@@ -6,7 +6,7 @@ const modalTheme = {
|
|
|
6
6
|
container: "relative w-full max-h-[calc(100vh-2rem)] rounded-[var(--modal-radius)] shadow-2xl shadow-black/30 flex flex-col my-4 min-h-0 overflow-hidden ring-6 !ring-white/10 border border-[var(--color-border)]",
|
|
7
7
|
header: "flex items-start justify-between px-[var(--modal-px)] pt-[var(--modal-py)] pb-0 shrink-0 border-b border-transparent gap-6 relative",
|
|
8
8
|
headerContent: "flex flex-col items-start gap-2 flex-1",
|
|
9
|
-
title: "text-[length:var(--modal-title-size)]
|
|
9
|
+
title: "text-[length:var(--modal-title-size)]/[var(--modal-title-line-height)] font-semibold text-[var(--color-text-primary)]",
|
|
10
10
|
subtitle: "text-sm text-[var(--color-text-secondary)] mt-0.5",
|
|
11
11
|
// pb-[...*0.75] is the gap before the footer — proportional to --modal-py
|
|
12
12
|
// (today's ratio, 12/16) so a themed --modal-py increase widens it too.
|
|
@@ -3,7 +3,6 @@ import { jsxs, jsx } from 'react/jsx-runtime';
|
|
|
3
3
|
import { cn } from '../../../utils/cn.js';
|
|
4
4
|
import { useModalContext } from './ModalContext.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 ModalHeader = ({ children, icon, showCloseButton, className, ...props }) => {
|
|
@@ -47,7 +47,9 @@ const ModalStackModal = ({ size = "md", showCloseButton = true, showBackButton =
|
|
|
47
47
|
titleId,
|
|
48
48
|
subtitleId,
|
|
49
49
|
}), [closeHandler, size, isSizeToken, showCloseButton, theme, isBodyScrollable, setIsBodyScrollable, titleId, subtitleId]);
|
|
50
|
-
return (jsx(ModalContext.Provider, { value: contextValue, children: jsx("div", { className: cn(
|
|
50
|
+
return (jsx(ModalContext.Provider, { value: contextValue, children: jsx("div", { className: cn(
|
|
51
|
+
// Opaque — same reason as Modal: behind the shared scrim, no blur on the panel.
|
|
52
|
+
surfaceClasses(surfaceLevel, { translucent: false, shadow: false }), theme.container, modalSizeVariants[size], className), role: "dialog", "aria-modal": "true", "aria-labelledby": titleId, "aria-describedby": subtitleId, children: jsxs(SurfaceProvider, { level: surfaceLevel, children: [showBackButton && (jsx("div", { className: cn(modalStackTheme.backButton), children: jsxs(Link, { onClick: backHandler, "aria-label": "Go back", size: "sm", children: [jsx(ArrowLeft, { className: "size-4" }), "Back"] }) })), children] }) }) }));
|
|
51
53
|
};
|
|
52
54
|
ModalStackModal.displayName = "ModalStack.Modal";
|
|
53
55
|
|
|
@@ -15,6 +15,7 @@ import { Tooltip } from '../Tooltip/Tooltip.js';
|
|
|
15
15
|
import '../Tooltip/Tooltip.animations.js';
|
|
16
16
|
import { Badge } from '../Badge/Badge.js';
|
|
17
17
|
import { CaretDown } from '@phosphor-icons/react';
|
|
18
|
+
import { Ripple } from '../shared/Ripple.js';
|
|
18
19
|
import { AnimatePresence, motion } from 'motion/react';
|
|
19
20
|
|
|
20
21
|
const NavItem = React__default.forwardRef(({ children, startContent, endContent, notification, description, shortcut, href, onClick, active = false, isDisabled = false, hasSubmenu: propHasSubmenu = false, expanded: controlledExpanded, onToggleExpanded, items, defaultExpanded = false, level = 0, showTooltipWhenCollapsed = true, className, theme: customTheme = {}, ...props }, ref) => {
|
|
@@ -186,7 +187,7 @@ const NavItem = React__default.forwardRef(({ children, startContent, endContent,
|
|
|
186
187
|
const iconClasses = cn(theme.icon, getIconStateClasses(), hasSubmenu && isExpanded && !isActive && "opacity-100", isCollapsedView && ((_b = theme.collapsed) === null || _b === void 0 ? void 0 : _b.icon), isHoveredOrDropdownOpen && "opacity-100");
|
|
187
188
|
const textClasses = cn(theme.text);
|
|
188
189
|
// Chevron for submenu
|
|
189
|
-
const chevron = hasSubmenu && !isCollapsedView ? (jsx(CaretDown, { weight: "bold", className: cn("size-4 transition-transform duration-
|
|
190
|
+
const chevron = hasSubmenu && !isCollapsedView ? (jsx(CaretDown, { weight: "bold", className: cn("size-4 transition-transform duration-[var(--motion-duration-base)] text-[var(--color-text-muted)]", isExpanded && "text-[var(--color-text-primary)]", isExpanded && "rotate-180") })) : null;
|
|
190
191
|
// Strip drag/animation DOM handlers that collide with motion's prop types.
|
|
191
192
|
// `onSubmit`/`onSubmitCapture` are stripped too: NavItem renders as either
|
|
192
193
|
// `motion.a` or `motion.button`, but `NavItemProps extends HTMLAttributes<HTMLElement>`
|
|
@@ -230,7 +231,7 @@ const NavItem = React__default.forwardRef(({ children, startContent, endContent,
|
|
|
230
231
|
? ` (${notification} unread)`
|
|
231
232
|
: notification === true
|
|
232
233
|
? " (unread)"
|
|
233
|
-
: null] }))] }));
|
|
234
|
+
: null] })), jsx(Ripple, { disabled: isDisabled })] }));
|
|
234
235
|
// Content component
|
|
235
236
|
const content = href && !hasSubmenu ? (jsx(motion.a, { ref: ref, href: isDisabled ? undefined : href, tabIndex: isDisabled ? -1 : undefined, ...interactionProps, children: innerContent })) : (jsx(motion.button, { ref: ref, type: "button", disabled: isDisabled, ...interactionProps, children: innerContent }));
|
|
236
237
|
// Self-contained submenu
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const navItemTheme = {
|
|
2
|
-
baseStyle: "group relative flex items-center gap-3 px-2.5 py-2 text-sm font-medium cursor-pointer select-none w-full rounded-[var(--nav-item-radius)] outline-none overflow-hidden transition-[padding,gap,height,background-color,border-color,color,box-shadow] duration-
|
|
2
|
+
baseStyle: "group relative flex items-center gap-3 px-2.5 py-2 text-sm font-medium cursor-pointer select-none w-full rounded-[var(--nav-item-radius)] outline-none overflow-hidden transition-[padding,gap,height,background-color,border-color,color,box-shadow] duration-[var(--motion-duration-base)] ease-[cubic-bezier(0.4,0,0.2,1)] text-left",
|
|
3
3
|
icon: "size-5",
|
|
4
4
|
text: "flex-1 min-w-0 truncate",
|
|
5
5
|
// State styling resolved in JS to plain utility classes so `className` overrides win
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const offlineIndicatorTheme = {
|
|
2
|
-
base: "fixed z-50 flex items-center gap-1.5 transition-colors duration-
|
|
2
|
+
base: "fixed z-50 flex items-center gap-1.5 transition-colors duration-[var(--motion-duration-slow)] select-none",
|
|
3
3
|
positions: {
|
|
4
4
|
top: "top-4 left-1/2 -translate-x-1/2",
|
|
5
5
|
bottom: "bottom-4 left-1/2 -translate-x-1/2",
|
|
@@ -34,7 +34,9 @@ const offlineIndicatorTheme = {
|
|
|
34
34
|
// (near-black in light, near-white in dark) — a fixed Link color can't.
|
|
35
35
|
action: "text-xs font-semibold text-inherit",
|
|
36
36
|
icon: "size-3.5 flex-shrink-0",
|
|
37
|
-
|
|
37
|
+
// tracking-tight IS -0.025em — byte-identical to the arbitrary value it
|
|
38
|
+
// replaces, but routed through --tracking-tight so a theme can retune it.
|
|
39
|
+
message: "text-xs font-medium tracking-tight",
|
|
38
40
|
queueCount: "text-xs opacity-80 ml-1",
|
|
39
41
|
};
|
|
40
42
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const pageHeadingTheme = {
|
|
2
2
|
baseStyle: "flex flex-col pb-6 mb-6",
|
|
3
3
|
headerStyle: "flex flex-col items-start sm:flex-row sm:items-center gap-4",
|
|
4
|
-
titleStyle: "text-[length:var(--page-heading-title-size)]
|
|
4
|
+
titleStyle: "text-[length:var(--page-heading-title-size)]/[var(--page-heading-title-line-height)] font-bold text-[var(--color-text-primary)]",
|
|
5
5
|
subtitleStyle: "text-sm text-[var(--color-text-secondary)] mt-1",
|
|
6
6
|
actionsStyle: "sm:ml-auto flex items-center gap-2 shrink-0",
|
|
7
7
|
iconStyle: "flex items-center justify-center shrink-0 text-[var(--color-text-muted)]",
|
|
@@ -7,7 +7,7 @@ const paginationTheme = {
|
|
|
7
7
|
// Unified item styles for all pagination elements (pages, navigation, etc.)
|
|
8
8
|
// Light mode: white background, muted text, neutral borders
|
|
9
9
|
// Dark mode: neutral-800 background, lighter text, neutral-600 borders
|
|
10
|
-
itemStyle: "inline-flex items-center justify-center font-medium rounded-[var(--form-radius)] transition-all duration-
|
|
10
|
+
itemStyle: "inline-flex items-center justify-center font-medium rounded-[var(--form-radius)] transition-all duration-[var(--motion-duration-base)] ease-in-out " +
|
|
11
11
|
// Focus styles
|
|
12
12
|
"focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary)] focus-visible:ring-offset-2 dark:focus-visible:ring-offset-[var(--color-mono-900)] " +
|
|
13
13
|
// Base state - light
|
|
@@ -15,7 +15,7 @@ const paginationTheme = {
|
|
|
15
15
|
// Base state - dark
|
|
16
16
|
"dark:bg-transparent dark:text-[var(--color-text-secondary)] dark:border-transparent " +
|
|
17
17
|
// Hover state - light
|
|
18
|
-
"hover:text-[var(--color-text-primary)] hover:bg-[var(--color-
|
|
18
|
+
"hover:text-[var(--color-text-primary)] hover:bg-[var(--color-surface)] hover:border-[var(--color-border)] " +
|
|
19
19
|
// Hover state - dark
|
|
20
20
|
"dark:hover:bg-[var(--color-surface-hover)] dark:hover:text-[var(--color-text-primary)] dark:hover:border-[var(--color-border)]/0 " +
|
|
21
21
|
// Active state - light
|
|
@@ -4,7 +4,9 @@ import React__default, { useState, useEffect, useCallback } from 'react';
|
|
|
4
4
|
import { useReducedMotion, motion } from 'motion/react';
|
|
5
5
|
import { pillTheme } from './Pill.theme.js';
|
|
6
6
|
import { createPressVariants } from '../shared/interaction.animations.js';
|
|
7
|
+
import { Ripple } from '../shared/Ripple.js';
|
|
7
8
|
import { cn } from '../../../utils/cn.js';
|
|
9
|
+
import { composeEventHandlers } from '../../../utils/composeEventHandlers.js';
|
|
8
10
|
|
|
9
11
|
// Shared press physics + subtle hover lift (module-level constant)
|
|
10
12
|
const PILL_PRESS_VARIANTS = createPressVariants(0.97, 1.02);
|
|
@@ -45,19 +47,21 @@ const PILL_PRESS_VARIANTS = createPressVariants(0.97, 1.02);
|
|
|
45
47
|
*/
|
|
46
48
|
const Pill = React__default.forwardRef((props, ref) => {
|
|
47
49
|
var _a, _b;
|
|
48
|
-
const { children, size = "md", iconStart, selected = false, onSelect, readOnly = false, className, theme = {}, onClick, ...restProps } = props;
|
|
50
|
+
const { children, size = "md", iconStart, selected, defaultSelected = false, onSelect, readOnly = false, className, theme = {}, onClick, onKeyDown, ...restProps } = props;
|
|
49
51
|
// Detect whether the consumer *explicitly* passed `selected` (even
|
|
50
|
-
// `selected={undefined}` counts as not-passed)
|
|
51
|
-
//
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
// "set".
|
|
55
|
-
const hasExplicitSelected = "selected" in props && props.selected !== undefined;
|
|
52
|
+
// `selected={undefined}` counts as not-passed), so a plain `<Pill>` with no
|
|
53
|
+
// `selected` prop never trips the dev-warning below.
|
|
54
|
+
const hasExplicitSelected = selected !== undefined;
|
|
55
|
+
const hasExplicitDefaultSelected = "defaultSelected" in props && props.defaultSelected !== undefined;
|
|
56
56
|
// ========== State Management ==========
|
|
57
|
-
|
|
58
|
-
useEffect(
|
|
59
|
-
|
|
60
|
-
|
|
57
|
+
// 🔴 §9: mode is DERIVED per render, never stored. `selected` used to be
|
|
58
|
+
// mirrored into state and re-synced from a `useEffect(…, [selected])`. A
|
|
59
|
+
// single-choice group that rejects a deselect leaves the prop identical, so
|
|
60
|
+
// the effect never fired and the chip reported `aria-pressed="false"` while
|
|
61
|
+
// still being the option in force — the control lying about its own state.
|
|
62
|
+
const isControlled = hasExplicitSelected;
|
|
63
|
+
const [uncontrolledSelected, setUncontrolledSelected] = useState(defaultSelected);
|
|
64
|
+
const isSelected = isControlled ? selected : uncontrolledSelected;
|
|
61
65
|
const shouldReduceMotion = useReducedMotion();
|
|
62
66
|
// ========== Derived State ==========
|
|
63
67
|
const isSelectable = Boolean(onSelect);
|
|
@@ -70,8 +74,12 @@ const Pill = React__default.forwardRef((props, ref) => {
|
|
|
70
74
|
// eslint-disable-next-line no-console
|
|
71
75
|
console.warn('[Pill] Component has "selected" prop but missing "onSelect" handler. The pill will not be interactive.');
|
|
72
76
|
}
|
|
77
|
+
if (hasExplicitSelected && hasExplicitDefaultSelected) {
|
|
78
|
+
// eslint-disable-next-line no-console
|
|
79
|
+
console.warn("[Pill] Received both `selected` and `defaultSelected`. `selected` wins and the pill is controlled; drop `defaultSelected`.");
|
|
80
|
+
}
|
|
73
81
|
}
|
|
74
|
-
}, [hasExplicitSelected, onSelect]);
|
|
82
|
+
}, [hasExplicitSelected, hasExplicitDefaultSelected, onSelect]);
|
|
75
83
|
// ========== Event Handlers ==========
|
|
76
84
|
const handleClick = useCallback((e) => {
|
|
77
85
|
if (readOnly) {
|
|
@@ -80,21 +88,29 @@ const Pill = React__default.forwardRef((props, ref) => {
|
|
|
80
88
|
}
|
|
81
89
|
if (onSelect) {
|
|
82
90
|
const newSelected = !isSelected;
|
|
83
|
-
|
|
91
|
+
// Controlled: the parent owns the value — it may accept, reject or
|
|
92
|
+
// normalize this. Writing a local copy is what desynced the chip.
|
|
93
|
+
if (!isControlled)
|
|
94
|
+
setUncontrolledSelected(newSelected);
|
|
84
95
|
onSelect(newSelected);
|
|
85
96
|
}
|
|
86
97
|
onClick === null || onClick === void 0 ? void 0 : onClick(e);
|
|
87
|
-
}, [readOnly, onSelect, isSelected, onClick]);
|
|
98
|
+
}, [readOnly, onSelect, isSelected, isControlled, onClick]);
|
|
88
99
|
const handleKeyDown = useCallback((e) => {
|
|
89
100
|
if (readOnly || !isSelectable)
|
|
90
101
|
return;
|
|
91
102
|
if (e.key === "Enter" || e.key === " ") {
|
|
92
103
|
e.preventDefault();
|
|
93
104
|
const newSelected = !isSelected;
|
|
94
|
-
|
|
105
|
+
if (!isControlled)
|
|
106
|
+
setUncontrolledSelected(newSelected);
|
|
95
107
|
onSelect === null || onSelect === void 0 ? void 0 : onSelect(newSelected);
|
|
96
108
|
}
|
|
97
|
-
}, [readOnly, isSelectable, isSelected, onSelect]);
|
|
109
|
+
}, [readOnly, isSelectable, isSelected, isControlled, onSelect]);
|
|
110
|
+
// 🔴 §9: `{...restProps}` spreads AFTER this element's own attributes, so a
|
|
111
|
+
// consumer's onKeyDown used to REPLACE ours and silently kill Enter/Space
|
|
112
|
+
// selection. Compose instead — ours first, then theirs.
|
|
113
|
+
const composedKeyDown = composeEventHandlers(handleKeyDown, onKeyDown);
|
|
98
114
|
// ========== Theme Merging ==========
|
|
99
115
|
const mergedTheme = {
|
|
100
116
|
baseStyle: theme.baseStyle || pillTheme.baseStyle,
|
|
@@ -118,11 +134,11 @@ const Pill = React__default.forwardRef((props, ref) => {
|
|
|
118
134
|
isSelected && mergedTheme.selectedStyle,
|
|
119
135
|
// Cursor styling
|
|
120
136
|
isInteractive ? "cursor-pointer" : "cursor-default", className // User overrides (highest priority)
|
|
121
|
-
), onClick: handleClick, onKeyDown:
|
|
137
|
+
), onClick: handleClick, onKeyDown: composedKeyDown, "data-size": size, "data-selected": isSelected ? "true" : "false", "data-readonly": !isInteractive ? "true" : "false", "data-selectable": isSelectable ? "true" : "false",
|
|
122
138
|
// Accessibility
|
|
123
139
|
role: isSelectable && !readOnly ? "button" : undefined, tabIndex: isInteractive ? 0 : undefined, "aria-pressed": isSelectable && !readOnly ? isSelected : undefined, "aria-readonly": readOnly || undefined,
|
|
124
140
|
// Animation
|
|
125
|
-
variants: PILL_PRESS_VARIANTS, animate: "rest", whileHover: isInteractive && !shouldReduceMotion ? "hover" : undefined, whileTap: isInteractive && !shouldReduceMotion ? "press" : undefined, ...restProps, children: [renderStartIcon(), children] }));
|
|
141
|
+
variants: PILL_PRESS_VARIANTS, animate: "rest", whileHover: isInteractive && !shouldReduceMotion ? "hover" : undefined, whileTap: isInteractive && !shouldReduceMotion ? "press" : undefined, ...restProps, children: [renderStartIcon(), children, isInteractive && jsx(Ripple, {})] }));
|
|
126
142
|
});
|
|
127
143
|
Pill.displayName = "Pill";
|
|
128
144
|
|
|
@@ -8,8 +8,10 @@ const pillTheme = {
|
|
|
8
8
|
/**
|
|
9
9
|
* Base pill style - structure and default colors (no hover)
|
|
10
10
|
*/
|
|
11
|
-
baseStyle:
|
|
12
|
-
|
|
11
|
+
baseStyle:
|
|
12
|
+
// `relative` positions the press <Ripple /> layer (selectable pills only).
|
|
13
|
+
"relative inline-flex items-center justify-center font-medium rounded-full select-none whitespace-nowrap " +
|
|
14
|
+
"ring-1 bg-[var(--color-surface)] transition-[color,background-color,box-shadow] duration-[var(--motion-duration-fast)] ease-out " +
|
|
13
15
|
"text-[var(--color-text-primary)] ring-[var(--color-border)] " +
|
|
14
16
|
"focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary)]",
|
|
15
17
|
/**
|
|
@@ -30,8 +30,21 @@ export interface PillProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, "
|
|
|
30
30
|
* Note: Replaced by CheckIcon when pill is selected
|
|
31
31
|
*/
|
|
32
32
|
iconStart?: React.ReactNode;
|
|
33
|
-
/**
|
|
33
|
+
/**
|
|
34
|
+
* Whether the pill is selected — CONTROLLED. Passing it makes the prop
|
|
35
|
+
* authoritative: the pill renders from it on every render and keeps no copy,
|
|
36
|
+
* so a parent that rejects or normalizes a change (a single-choice group
|
|
37
|
+
* refusing to deselect the active option) stays truthfully reflected.
|
|
38
|
+
*
|
|
39
|
+
* Mutually exclusive with `defaultSelected` (dev-warns if both are passed).
|
|
40
|
+
*/
|
|
34
41
|
selected?: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Initial selection for an UNCONTROLLED pill, which then owns its own state.
|
|
44
|
+
* Ignored when `selected` is provided.
|
|
45
|
+
* @default false
|
|
46
|
+
*/
|
|
47
|
+
defaultSelected?: boolean;
|
|
35
48
|
/**
|
|
36
49
|
* Callback when selection state changes
|
|
37
50
|
* @param selected - The new selected state
|
|
@@ -45,11 +45,22 @@ const PopoverBody = React__default.forwardRef(({ children, className, animation
|
|
|
45
45
|
((_a = triggerRef.current) === null || _a === void 0 ? void 0 : _a.contains(e.target))) {
|
|
46
46
|
return;
|
|
47
47
|
}
|
|
48
|
-
// Ignore clicks that land inside
|
|
49
|
-
// Select/Tooltip/Dropdown/Popover renders to document.body,
|
|
50
|
-
// content ref — without this it would count as an outside
|
|
51
|
-
// dismiss the popover). See the `data-flikkui-portal`
|
|
52
|
-
|
|
48
|
+
// Ignore clicks that land inside a DESCENDANT FlikkUI overlay portal (a
|
|
49
|
+
// nested Select/Tooltip/Dropdown/Popover renders to document.body,
|
|
50
|
+
// outside our content ref — without this it would count as an outside
|
|
51
|
+
// click and dismiss the popover). See the `data-flikkui-portal`
|
|
52
|
+
// convention.
|
|
53
|
+
//
|
|
54
|
+
// The bail only protects against a DESCENDANT portal, not an ANCESTOR
|
|
55
|
+
// one: when this popover's own trigger lives inside another overlay
|
|
56
|
+
// (e.g. a Popover opened from inside a Modal), a click on that host
|
|
57
|
+
// overlay's body content also matches `closest("[data-flikkui-portal]")`
|
|
58
|
+
// — it finds the Modal's portal wrapper, which contains our trigger.
|
|
59
|
+
// That's a real outside click and must still close the popover. Only
|
|
60
|
+
// bail when the matched portal does NOT contain our trigger — i.e.
|
|
61
|
+
// it's a portal we opened ourselves, not the one hosting us.
|
|
62
|
+
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]");
|
|
63
|
+
if (portalEl && !portalEl.contains(triggerRef.current)) {
|
|
53
64
|
return;
|
|
54
65
|
}
|
|
55
66
|
if (closeOnClickOutside && !preventClose) {
|
|
@@ -1,29 +1,4 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { ProgressProps } from "./Progress.types";
|
|
3
|
-
/**
|
|
4
|
-
* Progress component - Linear progress bar for tracking completion
|
|
5
|
-
*
|
|
6
|
-
* Features:
|
|
7
|
-
* - Determinate mode: Shows specific progress value (0-100)
|
|
8
|
-
* - Indeterminate mode: Animated loading state when value is undefined
|
|
9
|
-
* - Multiple sizes with default primary color
|
|
10
|
-
* - className controls the fill bar color (the primary styling target)
|
|
11
|
-
* - wrapperClassName controls the outer container
|
|
12
|
-
* - Flexible label positioning (right, top, bottom, inside)
|
|
13
|
-
* - Respects reduced motion preferences
|
|
14
|
-
*
|
|
15
|
-
* @example
|
|
16
|
-
* // Default (primary color)
|
|
17
|
-
* <Progress value={60} />
|
|
18
|
-
*
|
|
19
|
-
* // Custom fill color via className
|
|
20
|
-
* <Progress value={70} className="bg-[var(--color-success)]" />
|
|
21
|
-
*
|
|
22
|
-
* // With label
|
|
23
|
-
* <Progress value={75} showLabel labelPosition="right" />
|
|
24
|
-
*
|
|
25
|
-
* // Indeterminate (loading)
|
|
26
|
-
* <Progress />
|
|
27
|
-
*/
|
|
28
3
|
declare const Progress: React.ForwardRefExoticComponent<ProgressProps & React.RefAttributes<HTMLDivElement>>;
|
|
29
4
|
export { Progress };
|
|
@@ -15,8 +15,9 @@ const PROGRESS_SPRING_TRANSITION = {
|
|
|
15
15
|
* Progress component - Linear progress bar for tracking completion
|
|
16
16
|
*
|
|
17
17
|
* Features:
|
|
18
|
-
* - Determinate mode: Shows specific progress value (0
|
|
18
|
+
* - Determinate mode: Shows specific progress value (0 to max)
|
|
19
19
|
* - Indeterminate mode: Animated loading state when value is undefined
|
|
20
|
+
* - Continuous bar, or a discrete LED-style meter via `segments`
|
|
20
21
|
* - Multiple sizes with default primary color
|
|
21
22
|
* - className controls the fill bar color (the primary styling target)
|
|
22
23
|
* - wrapperClassName controls the outer container
|
|
@@ -33,10 +34,25 @@ const PROGRESS_SPRING_TRANSITION = {
|
|
|
33
34
|
* // With label
|
|
34
35
|
* <Progress value={75} showLabel labelPosition="right" />
|
|
35
36
|
*
|
|
37
|
+
* // Segmented meter over an arbitrary range
|
|
38
|
+
* <Progress value={214} max={300} segments={24} />
|
|
39
|
+
*
|
|
36
40
|
* // Indeterminate (loading)
|
|
37
41
|
* <Progress />
|
|
38
42
|
*/
|
|
39
|
-
|
|
43
|
+
/** Cells within this distance of the leading edge fade out when segmentFade is on */
|
|
44
|
+
const SEGMENT_FADE_DISTANCE = 3;
|
|
45
|
+
/** Opacity of the outermost faded cell */
|
|
46
|
+
const SEGMENT_FADE_MIN_OPACITY = 0.4;
|
|
47
|
+
/** Per-cell entrance stagger, seconds */
|
|
48
|
+
const SEGMENT_STAGGER = 0.03;
|
|
49
|
+
/** Per-cell offset of the indeterminate chase, seconds */
|
|
50
|
+
const SEGMENT_CHASE_STAGGER = 0.06;
|
|
51
|
+
const SEGMENT_ENTRANCE_TRANSITION = {
|
|
52
|
+
duration: 0.25,
|
|
53
|
+
ease: "easeOut",
|
|
54
|
+
};
|
|
55
|
+
const Progress = React__default.forwardRef(({ value, max = 100, segments, segmentFade = false, size = "md", showLabel = false, labelPosition = "right", formatLabel, animated = true, wrapperClassName, className, theme: customTheme, 'aria-label': consumerAriaLabel, ...props }, ref) => {
|
|
40
56
|
const shouldReduceMotion = useReducedMotion();
|
|
41
57
|
// Merge custom theme with default theme
|
|
42
58
|
const theme = useMemo(() => {
|
|
@@ -46,16 +62,38 @@ const Progress = React__default.forwardRef(({ value, size = "md", showLabel = fa
|
|
|
46
62
|
...progressTheme,
|
|
47
63
|
...customTheme,
|
|
48
64
|
sizes: { ...progressTheme.sizes, ...customTheme.sizes },
|
|
65
|
+
segmentSizes: { ...progressTheme.segmentSizes, ...customTheme.segmentSizes },
|
|
49
66
|
};
|
|
50
67
|
}, [customTheme]);
|
|
51
|
-
//
|
|
52
|
-
|
|
53
|
-
if (
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
68
|
+
// Dev-time warnings for common issues
|
|
69
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
70
|
+
if (segments !== undefined && (!Number.isInteger(segments) || segments < 1)) {
|
|
71
|
+
// eslint-disable-next-line no-console
|
|
72
|
+
console.warn(`Progress: 'segments' must be a positive integer, received ${segments}. Falling back to the continuous bar.`);
|
|
73
|
+
}
|
|
74
|
+
if (max <= 0) {
|
|
75
|
+
// eslint-disable-next-line no-console
|
|
76
|
+
console.warn(`Progress: 'max' must be greater than 0, received ${max}.`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Segmented rendering is opted into by passing a usable cell count.
|
|
80
|
+
const segmentCount = segments !== undefined && Number.isInteger(segments) && segments >= 1
|
|
81
|
+
? segments
|
|
82
|
+
: undefined;
|
|
83
|
+
const isSegmented = segmentCount !== undefined;
|
|
57
84
|
// Determine if this is indeterminate mode
|
|
58
85
|
const isIndeterminate = value === undefined || value === null;
|
|
86
|
+
// The value clamped into [0, max]. Rounded, matching the historical behaviour
|
|
87
|
+
// of the 0-100 form.
|
|
88
|
+
const clampedValue = useMemo(() => {
|
|
89
|
+
if (value === undefined || value === null)
|
|
90
|
+
return 0;
|
|
91
|
+
return Math.min(Math.max(Math.round(value), 0), Math.max(max, 0));
|
|
92
|
+
}, [value, max]);
|
|
93
|
+
// Position within the range, 0-1
|
|
94
|
+
const ratio = max > 0 ? clampedValue / max : 0;
|
|
95
|
+
// Calculate percentage (0-100) for labels and the continuous fill
|
|
96
|
+
const percentage = useMemo(() => Math.round(ratio * 100), [ratio]);
|
|
59
97
|
// Format the label
|
|
60
98
|
const label = useMemo(() => {
|
|
61
99
|
if (formatLabel)
|
|
@@ -86,6 +124,10 @@ const Progress = React__default.forwardRef(({ value, size = "md", showLabel = fa
|
|
|
86
124
|
if (!showLabel || isIndeterminate)
|
|
87
125
|
return null;
|
|
88
126
|
if (labelPosition === "inside") {
|
|
127
|
+
// No continuous track to sit inside, and a label straddling the cells
|
|
128
|
+
// would be unreadable
|
|
129
|
+
if (isSegmented)
|
|
130
|
+
return null;
|
|
89
131
|
// Only show inside label for lg size (enough height)
|
|
90
132
|
if (size !== "lg")
|
|
91
133
|
return null;
|
|
@@ -100,10 +142,36 @@ const Progress = React__default.forwardRef(({ value, size = "md", showLabel = fa
|
|
|
100
142
|
// Indeterminate animation
|
|
101
143
|
jsx("div", { className: cn(theme.fillStyle, "absolute", theme.indeterminateStyle, className) })) : shouldAnimate ? (
|
|
102
144
|
// Animated determinate progress with spring animation (scaleX avoids layout recalculation)
|
|
103
|
-
jsx(motion.div, { className: cn(theme.fillStyle, className), style: { width: '100%', transformOrigin: 'left' }, initial: { scaleX: 0 }, animate: { scaleX:
|
|
145
|
+
jsx(motion.div, { className: cn(theme.fillStyle, className), style: { width: '100%', transformOrigin: 'left' }, initial: { scaleX: 0 }, animate: { scaleX: ratio }, transition: PROGRESS_SPRING_TRANSITION })) : (
|
|
104
146
|
// Static determinate progress
|
|
105
|
-
jsx("div", { className: cn(theme.fillStyle, className), style: { width: `${
|
|
106
|
-
|
|
147
|
+
jsx("div", { className: cn(theme.fillStyle, className), style: { width: `${ratio * 100}%` } })), showLabel && labelPosition === "inside" && size === "lg" && !isIndeterminate && (jsx("span", { className: theme.insideLabelStyle, children: label }))] }));
|
|
148
|
+
// Discrete cell row — the LED-style meter. Each cell paints the empty fill,
|
|
149
|
+
// and lit cells stack a coloured overlay on top so the base stays visible
|
|
150
|
+
// underneath while the overlay fades in.
|
|
151
|
+
const renderSegmentedTrack = () => {
|
|
152
|
+
const { height, gap } = theme.segmentSizes[size];
|
|
153
|
+
const litCount = Math.round(ratio * segmentCount);
|
|
154
|
+
return (jsx("div", { className: cn(theme.segmentTrackStyle, gap, wrapperClassName), children: Array.from({ length: segmentCount }, (_, i) => {
|
|
155
|
+
const isLit = !isIndeterminate && i < litCount;
|
|
156
|
+
// Cells nearest the leading edge dim toward it
|
|
157
|
+
const distanceFromEdge = litCount - i;
|
|
158
|
+
const fillOpacity = segmentFade && distanceFromEdge <= SEGMENT_FADE_DISTANCE
|
|
159
|
+
? SEGMENT_FADE_MIN_OPACITY +
|
|
160
|
+
(distanceFromEdge / SEGMENT_FADE_DISTANCE) *
|
|
161
|
+
(1 - SEGMENT_FADE_MIN_OPACITY)
|
|
162
|
+
: 1;
|
|
163
|
+
// While indeterminate every cell carries the overlay so the chase
|
|
164
|
+
// reads in the fill colour rather than in the muted empty fill.
|
|
165
|
+
const isChasing = isIndeterminate && shouldAnimate;
|
|
166
|
+
const fillClassName = cn(theme.segmentFillStyle, className, isChasing && theme.segmentChaseStyle);
|
|
167
|
+
return (jsx("div", { "data-progress-segment": "", "data-state": isLit ? "filled" : "empty", className: cn(theme.segmentStyle, height, theme.segmentEmptyStyle), children: isChasing ? (jsx("div", { className: fillClassName, style: { animationDelay: `${i * SEGMENT_CHASE_STAGGER}s` } })) : isLit && shouldAnimate ? (jsx(motion.div, { className: fillClassName, initial: { opacity: 0 }, animate: { opacity: fillOpacity }, transition: {
|
|
168
|
+
...SEGMENT_ENTRANCE_TRANSITION,
|
|
169
|
+
delay: i * SEGMENT_STAGGER,
|
|
170
|
+
} })) : isLit ? (jsx("div", { className: fillClassName, style: { opacity: fillOpacity } })) : null }, i));
|
|
171
|
+
}) }));
|
|
172
|
+
};
|
|
173
|
+
const trackNode = isSegmented ? renderSegmentedTrack() : renderTrack();
|
|
174
|
+
return (jsxs("div", { ref: ref, className: cn(theme.containerStyle, containerLayoutClass), role: "progressbar", "aria-valuemin": 0, "aria-valuemax": max, "aria-valuenow": isIndeterminate ? undefined : clampedValue, "aria-label": consumerAriaLabel !== null && consumerAriaLabel !== void 0 ? consumerAriaLabel : (isIndeterminate ? "Loading" : `${percentage}% complete`), ...props, children: [labelPosition === "top" && renderLabel(), labelPosition === "right" ? (jsxs(Fragment, { children: [jsx("div", { className: "flex-1", children: trackNode }), renderLabel()] })) : (trackNode), labelPosition === "bottom" && renderLabel()] }));
|
|
107
175
|
});
|
|
108
176
|
Progress.displayName = "Progress";
|
|
109
177
|
|
|
@@ -20,6 +20,23 @@ const progressTheme = {
|
|
|
20
20
|
},
|
|
21
21
|
// Indeterminate animation styles
|
|
22
22
|
indeterminateStyle: "animate-[progress-indeterminate_1.8s_linear_infinite]",
|
|
23
|
+
// Row holding the segment cells — no track fill, rounding or clipping here;
|
|
24
|
+
// each cell paints its own background.
|
|
25
|
+
segmentTrackStyle: "flex items-end w-full",
|
|
26
|
+
// A single segment cell. flex-1 so the row always fills its container
|
|
27
|
+
// regardless of how many cells were asked for.
|
|
28
|
+
segmentStyle: "relative rounded-sm flex-1",
|
|
29
|
+
// Lit overlay — `className` lands here, so it carries the fill colour.
|
|
30
|
+
segmentFillStyle: "absolute inset-0 rounded-sm bg-[var(--color-primary)]",
|
|
31
|
+
segmentEmptyStyle: "bg-[var(--color-surface-sunken)]",
|
|
32
|
+
// Deliberately NOT the continuous `sizes` ramp (h-1.5/h-2.5/h-4) — at that
|
|
33
|
+
// height a cell reads as noise rather than a lit segment.
|
|
34
|
+
segmentSizes: {
|
|
35
|
+
sm: { height: "h-4", gap: "gap-[2px]" },
|
|
36
|
+
md: { height: "h-6", gap: "gap-[3px]" },
|
|
37
|
+
lg: { height: "h-8", gap: "gap-1" },
|
|
38
|
+
},
|
|
39
|
+
segmentChaseStyle: "animate-[progress-segment-chase_1.2s_ease-in-out_infinite]",
|
|
23
40
|
};
|
|
24
41
|
|
|
25
42
|
export { progressTheme };
|
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
export type ProgressSize = "sm" | "md" | "lg";
|
|
3
3
|
export type ProgressLabelPosition = "right" | "top" | "bottom" | "inside";
|
|
4
|
+
/**
|
|
5
|
+
* Per-size geometry for the segmented form.
|
|
6
|
+
*
|
|
7
|
+
* Two keys rather than a single class string because the two values land on
|
|
8
|
+
* different elements: `height` on each cell, `gap` on the row that holds them.
|
|
9
|
+
*/
|
|
10
|
+
export interface ProgressSegmentSize {
|
|
11
|
+
/** Height of a single segment cell */
|
|
12
|
+
height: string;
|
|
13
|
+
/** Gap between segment cells (applied to the row) */
|
|
14
|
+
gap: string;
|
|
15
|
+
}
|
|
4
16
|
/**
|
|
5
17
|
* Theme configuration for Progress component
|
|
6
18
|
*/
|
|
@@ -19,6 +31,18 @@ export interface ProgressTheme {
|
|
|
19
31
|
sizes: Record<ProgressSize, string>;
|
|
20
32
|
/** Indeterminate animation styles */
|
|
21
33
|
indeterminateStyle: string;
|
|
34
|
+
/** Row that holds the segment cells (segmented form only) */
|
|
35
|
+
segmentTrackStyle: string;
|
|
36
|
+
/** Base styles for a single segment cell */
|
|
37
|
+
segmentStyle: string;
|
|
38
|
+
/** The lit overlay painted inside a segment cell */
|
|
39
|
+
segmentFillStyle: string;
|
|
40
|
+
/** Fill for an unlit segment cell */
|
|
41
|
+
segmentEmptyStyle: string;
|
|
42
|
+
/** Per-size segment geometry */
|
|
43
|
+
segmentSizes: Record<ProgressSize, ProgressSegmentSize>;
|
|
44
|
+
/** Indeterminate chase animation applied to each segment cell */
|
|
45
|
+
segmentChaseStyle: string;
|
|
22
46
|
}
|
|
23
47
|
/**
|
|
24
48
|
* Theme overrides for Progress component
|
|
@@ -31,13 +55,35 @@ export interface ProgressThemeOverrides {
|
|
|
31
55
|
insideLabelStyle?: string;
|
|
32
56
|
sizes?: Partial<Record<ProgressSize, string>>;
|
|
33
57
|
indeterminateStyle?: string;
|
|
58
|
+
segmentTrackStyle?: string;
|
|
59
|
+
segmentStyle?: string;
|
|
60
|
+
segmentFillStyle?: string;
|
|
61
|
+
segmentEmptyStyle?: string;
|
|
62
|
+
segmentSizes?: Partial<Record<ProgressSize, ProgressSegmentSize>>;
|
|
63
|
+
segmentChaseStyle?: string;
|
|
34
64
|
}
|
|
35
65
|
export interface ProgressProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "children"> {
|
|
36
66
|
/**
|
|
37
|
-
* Progress value from 0 to
|
|
67
|
+
* Progress value, from 0 to `max`.
|
|
38
68
|
* If undefined, the progress bar will be in indeterminate mode.
|
|
39
69
|
*/
|
|
40
70
|
value?: number;
|
|
71
|
+
/**
|
|
72
|
+
* Upper bound of the range `value` is measured against.
|
|
73
|
+
* @default 100
|
|
74
|
+
*/
|
|
75
|
+
max?: number;
|
|
76
|
+
/**
|
|
77
|
+
* Number of cells to render the bar as an LED-style segmented meter.
|
|
78
|
+
*
|
|
79
|
+
* Omitted renders the continuous fill.
|
|
80
|
+
*/
|
|
81
|
+
segments?: number;
|
|
82
|
+
/**
|
|
83
|
+
* Fade the meter out across its last few lit cells (segmented form only).
|
|
84
|
+
* @default false
|
|
85
|
+
*/
|
|
86
|
+
segmentFade?: boolean;
|
|
41
87
|
/**
|
|
42
88
|
* The size of the progress bar
|
|
43
89
|
* @default 'md'
|
|
@@ -6,7 +6,7 @@ const ratingTheme = {
|
|
|
6
6
|
// Base container styles
|
|
7
7
|
baseStyle: "inline-flex items-center",
|
|
8
8
|
// Individual star button styles
|
|
9
|
-
starStyle: "relative inline-flex items-center justify-center shrink-0 transition-transform duration-
|
|
9
|
+
starStyle: "relative inline-flex items-center justify-center shrink-0 transition-transform duration-[var(--motion-duration-fast)] cursor-pointer focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary)] focus-visible:ring-offset-1 rounded-sm",
|
|
10
10
|
// Star icon sizes per rating size
|
|
11
11
|
starSizes: {
|
|
12
12
|
sm: "size-4",
|
|
@@ -97,11 +97,12 @@ export interface RatingProps extends Omit<React.HTMLAttributes<HTMLDivElement>,
|
|
|
97
97
|
*/
|
|
98
98
|
onChange?: (value: number) => void;
|
|
99
99
|
/**
|
|
100
|
-
* Custom filled star icon
|
|
100
|
+
* Custom filled star icon. Defaults to Phosphor `Star` — the built-in filled
|
|
101
|
+
* and empty stars are the same glyph, distinguished by color, not by shape.
|
|
101
102
|
*/
|
|
102
103
|
iconFilled?: ReactNode;
|
|
103
104
|
/**
|
|
104
|
-
* Custom empty star icon
|
|
105
|
+
* Custom empty star icon. Defaults to Phosphor `Star` — see `iconFilled`.
|
|
105
106
|
*/
|
|
106
107
|
iconEmpty?: ReactNode;
|
|
107
108
|
/**
|
|
@@ -393,7 +393,7 @@ const ScrollArea = React__default.forwardRef(({ children, type = 'hover', size =
|
|
|
393
393
|
'[&::-webkit-scrollbar-thumb]:bg-transparent',
|
|
394
394
|
'[&[data-scrolling]::-webkit-scrollbar-thumb]:bg-[var(--color-border)]',
|
|
395
395
|
'[&::-webkit-scrollbar-thumb]:transition-colors',
|
|
396
|
-
'[&::-webkit-scrollbar-thumb]:duration-
|
|
396
|
+
'[&::-webkit-scrollbar-thumb]:duration-[var(--motion-duration-slow)]',
|
|
397
397
|
].join(' ');
|
|
398
398
|
case 'hover':
|
|
399
399
|
return [
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
const scrollAreaTheme = {
|
|
6
6
|
baseStyle: 'relative h-full w-full',
|
|
7
|
-
scrollbarStyle: 'flex touch-none select-none transition-colors duration-
|
|
7
|
+
scrollbarStyle: 'flex touch-none select-none transition-colors duration-[var(--motion-duration-fast)]',
|
|
8
8
|
thumbStyle: 'relative flex-1 rounded-full bg-[var(--color-border)]/60',
|
|
9
9
|
};
|
|
10
10
|
|