@flikk/ui 1.0.0-beta.30 → 1.0.0-beta.31
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 +97 -0
- package/dist/components/ai/AgentStatus/AgentStatus.d.ts +3 -0
- package/dist/components/ai/AgentStatus/AgentStatus.js +144 -0
- package/dist/components/ai/AgentStatus/AgentStatus.theme.d.ts +2 -0
- package/dist/components/ai/AgentStatus/AgentStatus.theme.js +37 -0
- package/dist/components/ai/AgentStatus/AgentStatus.types.d.ts +116 -0
- package/dist/components/ai/AgentStatus/index.d.ts +3 -0
- package/dist/components/ai/CodeBlock/CodeBlock.js +3 -3
- package/dist/components/ai/CodeBlock/CodeBlock.theme.js +1 -1
- package/dist/components/ai/PromptInput/PromptInput.js +13 -14
- package/dist/components/ai/PromptInput/PromptInput.theme.js +1 -1
- package/dist/components/ai/PromptInput/VoiceRecorder.js +3 -3
- package/dist/components/ai/Reasoning/Reasoning.d.ts +5 -0
- package/dist/components/ai/Reasoning/Reasoning.js +16 -0
- package/dist/components/ai/Reasoning/Reasoning.types.d.ts +20 -0
- package/dist/components/ai/Reasoning/index.d.ts +2 -0
- package/dist/components/ai/SourceCitation/SourceCitation.d.ts +4 -0
- package/dist/components/ai/SourceCitation/SourceCitation.js +29 -0
- package/dist/components/ai/SourceCitation/SourceCitation.theme.d.ts +2 -0
- package/dist/components/ai/SourceCitation/SourceCitation.theme.js +23 -0
- package/dist/components/ai/SourceCitation/SourceCitation.types.d.ts +55 -0
- package/dist/components/ai/SourceCitation/index.d.ts +3 -0
- package/dist/components/ai/StreamingResponse/ErrorDisplay.js +2 -2
- package/dist/components/ai/StreamingResponse/StreamingResponse.js +1 -3
- package/dist/components/ai/StreamingResponse/StreamingResponse.theme.js +3 -1
- package/dist/components/ai/TokenCounter/TokenCounter.js +2 -2
- package/dist/components/ai/index.d.ts +3 -0
- package/dist/components/ai/index.js +6 -3
- package/dist/components/ai/shared/StatusIndicator.d.ts +8 -0
- package/dist/components/ai/shared/StatusIndicator.js +34 -0
- package/dist/components/canvas/CanvasToolbar.js +2 -2
- package/dist/components/canvas/NodeControls.js +2 -2
- package/dist/components/canvas/NodeRenderer.js +2 -2
- package/dist/components/charts/ActivityRings/ActivityRings.js +2 -2
- package/dist/components/charts/AreaChart/AreaChart.js +21 -32
- package/dist/components/charts/AreaChart/AreaChart.theme.d.ts +1 -6
- package/dist/components/charts/AreaChart/AreaChart.theme.js +7 -19
- package/dist/components/charts/AreaChart/AreaChart.types.d.ts +18 -11
- package/dist/components/charts/AreaChart/AreaChart.types.js +10 -3
- package/dist/components/charts/AreaChart/index.d.ts +1 -1
- package/dist/components/charts/BarChart/BarChart.js +9 -28
- package/dist/components/charts/BarChart/BarChart.types.d.ts +20 -16
- package/dist/components/charts/BarChart/BarChart.types.js +11 -4
- package/dist/components/charts/ComboChart/BarRenderer.js +8 -5
- package/dist/components/charts/ComboChart/ComboChart.js +11 -24
- package/dist/components/charts/ComboChart/ComboChart.types.d.ts +15 -13
- package/dist/components/charts/ComboChart/ComboChart.types.js +14 -2
- package/dist/components/charts/ComboChart/LineRenderer.js +15 -10
- package/dist/components/charts/HorizontalBarChart/HorizontalBarChart.d.ts +16 -0
- package/dist/components/charts/HorizontalBarChart/HorizontalBarChart.js +237 -0
- package/dist/components/charts/HorizontalBarChart/HorizontalBarChart.types.d.ts +62 -0
- package/dist/components/charts/HorizontalBarChart/HorizontalBarChart.types.js +21 -0
- package/dist/components/charts/HorizontalBarChart/index.d.ts +3 -0
- package/dist/components/charts/LineChart/LineChart.js +9 -26
- package/dist/components/charts/LineChart/LineChart.types.d.ts +11 -14
- package/dist/components/charts/LineChart/LineChart.types.js +11 -3
- package/dist/components/charts/LollipopChart/LollipopChart.d.ts +3 -0
- package/dist/components/charts/LollipopChart/LollipopChart.js +361 -0
- package/dist/components/charts/LollipopChart/LollipopChart.types.d.ts +42 -0
- package/dist/components/charts/LollipopChart/LollipopChart.types.js +12 -0
- package/dist/components/charts/LollipopChart/index.d.ts +3 -0
- package/dist/components/charts/ScatterPlot/ScatterPlot.js +5 -4
- package/dist/components/charts/ScatterPlot/ScatterPlot.types.d.ts +14 -19
- package/dist/components/charts/ScatterPlot/ScatterPlot.types.js +9 -2
- package/dist/components/charts/StackedBarChart/StackedBarChart.js +150 -132
- package/dist/components/charts/StackedBarChart/StackedBarChart.types.d.ts +20 -18
- package/dist/components/charts/StackedBarChart/StackedBarChart.types.js +10 -4
- package/dist/components/charts/hooks/useChartAccessibility.d.ts +1 -1
- package/dist/components/charts/hooks/useChartAccessibility.js +3 -0
- package/dist/components/charts/hooks/useTooltipPosition.js +18 -6
- package/dist/components/charts/index.d.ts +6 -0
- package/dist/components/charts/index.js +6 -0
- package/dist/components/charts/shared/ChartAxis/CategoryYAxis.d.ts +14 -0
- package/dist/components/charts/shared/ChartAxis/CategoryYAxis.js +35 -0
- package/dist/components/charts/shared/ChartAxis/ChartAxis.types.d.ts +69 -8
- package/dist/components/charts/shared/ChartAxis/ValueXAxis.d.ts +14 -0
- package/dist/components/charts/shared/ChartAxis/ValueXAxis.js +64 -0
- package/dist/components/charts/shared/ChartAxis/XAxis.js +1 -1
- package/dist/components/charts/shared/ChartAxis/YAxis.js +2 -2
- package/dist/components/charts/shared/ChartAxis/index.d.ts +3 -1
- package/dist/components/charts/shared/ChartGrid/HorizontalGrid.d.ts +0 -2
- package/dist/components/charts/shared/ChartGrid/HorizontalGrid.js +1 -1
- package/dist/components/charts/shared/ChartGrid/VerticalGrid.d.ts +29 -0
- package/dist/components/charts/shared/ChartGrid/VerticalGrid.js +26 -0
- package/dist/components/charts/shared/ChartGrid/index.d.ts +2 -0
- package/dist/components/charts/shared/ChartMarker/ChartMarker.js +7 -1
- package/dist/components/charts/theme/chart.theme.js +18 -23
- package/dist/components/charts/types/chart.types.d.ts +9 -5
- package/dist/components/charts/types/chart.types.js +1 -7
- package/dist/components/charts/utils/animation-utils.js +1 -3
- package/dist/components/charts/utils/bar-emphasis.d.ts +32 -3
- package/dist/components/charts/utils/bar-emphasis.js +24 -8
- package/dist/components/charts/utils/index.d.ts +1 -0
- package/dist/components/charts/utils/series-color.d.ts +7 -0
- package/dist/components/charts/utils/series-color.js +20 -0
- package/dist/components/core/Accordion/Accordion.theme.js +2 -2
- package/dist/components/core/Accordion/AccordionTrigger.js +2 -2
- package/dist/components/core/Alert/Alert.animations.d.ts +2 -1
- package/dist/components/core/Alert/Alert.animations.js +21 -6
- package/dist/components/core/Alert/Alert.js +7 -7
- package/dist/components/core/Avatar/Avatar.js +50 -42
- package/dist/components/core/Avatar/Avatar.theme.d.ts +8 -4
- package/dist/components/core/Avatar/Avatar.theme.js +64 -8
- package/dist/components/core/Avatar/Avatar.types.d.ts +13 -2
- package/dist/components/core/Avatar/index.d.ts +1 -1
- package/dist/components/core/AvatarGroup/AvatarGroup.js +6 -8
- package/dist/components/core/AvatarGroup/AvatarGroup.theme.d.ts +1 -2
- package/dist/components/core/AvatarGroup/AvatarGroup.theme.js +2 -6
- package/dist/components/core/AvatarGroup/AvatarGroup.types.d.ts +0 -6
- package/dist/components/core/AvatarGroup/index.d.ts +1 -1
- package/dist/components/core/Badge/Badge.animations.js +4 -2
- package/dist/components/core/Badge/Badge.js +9 -4
- package/dist/components/core/Badge/Badge.theme.js +18 -12
- package/dist/components/core/Breadcrumbs/Breadcrumbs.theme.d.ts +1 -4
- package/dist/components/core/Breadcrumbs/Breadcrumbs.theme.js +2 -2
- package/dist/components/core/Button/Button.js +9 -17
- package/dist/components/core/Button/Button.ripple.js +2 -2
- package/dist/components/core/Button/Button.theme.d.ts +2 -0
- package/dist/components/core/Button/Button.theme.js +34 -21
- package/dist/components/core/Button/Button.types.d.ts +18 -1
- package/dist/components/core/Calendar/Calendar.js +20 -5
- package/dist/components/core/Calendar/Calendar.theme.js +14 -22
- package/dist/components/core/Calendar/Calendar.types.d.ts +0 -1
- package/dist/components/core/Calendar/CalendarMini/CalendarMini.js +3 -3
- package/dist/components/core/Card/Card.theme.js +12 -4
- package/dist/components/core/Card/CardBody.js +1 -1
- package/dist/components/core/Card/CardFooter.js +1 -1
- package/dist/components/core/Card/CardHeader.js +1 -1
- package/dist/components/core/Carousel/CarouselNext.js +2 -2
- package/dist/components/core/Carousel/CarouselPrevious.js +2 -2
- package/dist/components/core/CommandPalette/CommandPalette.js +5 -4
- package/dist/components/core/CommandPalette/CommandPalette.theme.js +3 -7
- package/dist/components/core/CommandPalette/CommandPalette.types.d.ts +2 -0
- package/dist/components/core/ContextMenu/ContextMenuItem.js +2 -2
- package/dist/components/core/ContextMenu/ContextMenuSubTrigger.js +2 -2
- package/dist/components/core/Drawer/Drawer.theme.js +7 -4
- package/dist/components/core/Drawer/DrawerHeader.js +2 -2
- package/dist/components/core/Dropdown/Dropdown.theme.js +3 -1
- package/dist/components/core/Dropdown/DropdownItem.js +2 -2
- package/dist/components/core/Dropdown/DropdownTrigger.js +16 -5
- package/dist/components/core/HeroCard/HeroCard.theme.js +5 -2
- package/dist/components/core/Kbd/Kbd.theme.js +4 -2
- package/dist/components/core/Link/Link.js +6 -4
- package/dist/components/core/Message/Message.js +2 -2
- package/dist/components/core/Message/Message.theme.js +5 -7
- package/dist/components/core/Message/MessageAudio.js +2 -2
- package/dist/components/core/Message/MessageFile.js +2 -2
- package/dist/components/core/Message/MessageLink.js +2 -2
- package/dist/components/core/Message/MessageStatusIndicator.js +5 -5
- package/dist/components/core/Modal/Modal.d.ts +1 -1
- package/dist/components/core/Modal/Modal.js +2 -2
- package/dist/components/core/Modal/Modal.theme.js +9 -4
- package/dist/components/core/Modal/ModalHeader.js +2 -2
- package/dist/components/core/ModalStack/ModalStackModal.js +2 -2
- package/dist/components/core/NavItem/NavItem.js +6 -6
- package/dist/components/core/OfflineIndicator/OfflineIndicator.animations.d.ts +22 -0
- package/dist/components/core/OfflineIndicator/OfflineIndicator.animations.js +54 -0
- package/dist/components/core/OfflineIndicator/OfflineIndicator.js +23 -24
- package/dist/components/core/OfflineIndicator/OfflineIndicator.theme.js +25 -6
- package/dist/components/core/OfflineIndicator/OfflineIndicator.types.d.ts +17 -0
- package/dist/components/core/PageHeading/PageHeading.theme.js +1 -1
- package/dist/components/core/PageHeading/PageHeadingBackButton.js +2 -2
- package/dist/components/core/Pagination/Pagination.js +3 -3
- package/dist/components/core/Pagination/Pagination.theme.js +3 -3
- package/dist/components/core/Pill/Pill.js +4 -2
- package/dist/components/core/Pill/Pill.theme.js +6 -4
- package/dist/components/core/Rating/Rating.js +4 -5
- package/dist/components/core/Rating/Rating.theme.js +1 -1
- package/dist/components/core/Segmented/Segmented.theme.js +9 -6
- package/dist/components/core/Sidebar/Sidebar.types.d.ts +4 -2
- package/dist/components/core/Sidebar/SidebarHeader.js +2 -2
- package/dist/components/core/Sidebar/SidebarMobileTrigger.js +2 -2
- package/dist/components/core/Sidebar/SidebarSearch.js +3 -3
- package/dist/components/core/Sidebar/SidebarToggle.js +3 -3
- package/dist/components/core/Sidebar/SidebarUserProfile.js +2 -2
- package/dist/components/core/Sortable/Sortable.js +2 -2
- package/dist/components/core/Tag/Tag.js +2 -2
- package/dist/components/core/Tag/Tag.theme.js +4 -2
- package/dist/components/core/Toast/Toast.js +3 -3
- package/dist/components/core/Toast/Toast.types.d.ts +1 -1
- package/dist/components/core/Toast/useToast.js +5 -5
- package/dist/components/core/Tooltip/Tooltip.d.ts +1 -1
- package/dist/components/core/Tooltip/Tooltip.js +42 -10
- package/dist/components/core/Tooltip/Tooltip.types.d.ts +25 -0
- package/dist/components/core/Tree/Tree.js +2 -2
- package/dist/components/core/shared/interaction.animations.d.ts +51 -0
- package/dist/components/core/shared/interaction.animations.js +59 -0
- package/dist/components/data-display/Feed/Feed.js +2 -2
- package/dist/components/data-display/GanttChart/GanttChart.theme.js +1 -1
- package/dist/components/data-display/GanttChart/GanttChartPanel.js +2 -2
- package/dist/components/data-display/GanttChart/GanttTableGroupRow.js +3 -3
- package/dist/components/data-display/GanttChart/GanttTaskContextMenu.js +2 -2
- package/dist/components/data-display/GanttChart/GanttToolbar.js +2 -2
- package/dist/components/data-display/KPI/KPI.js +2 -2
- package/dist/components/data-display/KPI/KPI.theme.js +4 -4
- package/dist/components/data-display/Metric/Metric.js +2 -2
- package/dist/components/data-display/Metric/Metric.theme.js +25 -8
- package/dist/components/data-display/Metric/Metric.types.d.ts +1 -1
- package/dist/components/data-display/Table/Table.theme.js +9 -9
- package/dist/components/data-display/Table/TableActions.js +2 -2
- package/dist/components/data-display/Table/TableActionsMenu.js +1 -1
- package/dist/components/data-display/Table/TableColumnManager.js +2 -2
- package/dist/components/data-display/Table/TableDeclarative.js +3 -3
- package/dist/components/data-display/Table/TableFilter.js +4 -4
- package/dist/components/data-display/Table/TableHeader.js +3 -3
- package/dist/components/data-display/Table/TableRow.js +2 -2
- package/dist/components/data-display/Table/TableSelectionHeader.js +3 -3
- package/dist/components/data-display/Timeline/TimelineMarker.js +2 -2
- package/dist/components/effects/CustomCursor/CustomCursor.js +2 -2
- package/dist/components/effects/CustomCursor/CustomCursor.theme.js +2 -2
- package/dist/components/effects/DotPattern/DotPattern.js +6 -0
- package/dist/components/effects/DotPattern/DotPattern.types.d.ts +4 -2
- package/dist/components/effects/MeshGradient/MeshGradient.utils.d.ts +1 -1
- package/dist/components/effects/MeshGradient/MeshGradient.utils.js +1 -1
- package/dist/components/forms/Checkbox/Checkbox.js +2 -1
- package/dist/components/forms/Checkbox/Checkbox.theme.js +2 -2
- package/dist/components/forms/ColorPicker/ColorPickerEyeDropper.js +2 -2
- package/dist/components/forms/ColorPicker/ColorPickerGradient.js +2 -2
- package/dist/components/forms/ColorPicker/ColorPickerHeader.js +2 -2
- package/dist/components/forms/ColorPicker/ColorPickerImage.js +3 -3
- package/dist/components/forms/ColorPicker/ColorPickerInput.js +2 -2
- package/dist/components/forms/ColorPicker/ColorPickerPresets.js +2 -2
- package/dist/components/forms/ColorPicker/ColorPickerSavedColors.js +2 -2
- package/dist/components/forms/Combobox/Combobox.js +3 -3
- package/dist/components/forms/Combobox/Combobox.theme.js +2 -2
- package/dist/components/forms/DatePicker/DatePicker.animations.js +16 -25
- package/dist/components/forms/DatePicker/DatePicker.theme.js +2 -2
- package/dist/components/forms/DatePicker/DatePickerBody.js +1 -1
- package/dist/components/forms/DatePicker/DatePickerTrigger.js +2 -2
- package/dist/components/forms/DateRangePicker/DateRangePicker.theme.js +3 -3
- package/dist/components/forms/DateRangePicker/DateRangePickerBody.js +1 -1
- package/dist/components/forms/DateRangePicker/DateRangePickerPresets.js +2 -2
- package/dist/components/forms/DateRangePicker/DateRangePickerTrigger.js +2 -2
- package/dist/components/forms/FileUpload/FileUpload.js +4 -4
- package/dist/components/forms/FileUpload/FileUpload.theme.js +5 -1
- package/dist/components/forms/FileUpload/FileUploadProgress.js +7 -7
- package/dist/components/forms/Input/Input.js +6 -7
- package/dist/components/forms/Input/Input.theme.js +19 -15
- package/dist/components/forms/InputAddress/InputAddress.js +10 -3
- package/dist/components/forms/InputCounter/InputCounter.js +3 -3
- package/dist/components/forms/InputOTP/InputOTP.d.ts +3 -12
- package/dist/components/forms/InputOTP/InputOTP.js +140 -151
- package/dist/components/forms/InputOTP/InputOTP.theme.d.ts +5 -1
- package/dist/components/forms/InputOTP/InputOTP.theme.js +40 -5
- package/dist/components/forms/InputOTP/InputOTP.types.d.ts +45 -2
- package/dist/components/forms/InputOTP/index.d.ts +1 -1
- package/dist/components/forms/InputTag/InputTag.js +5 -5
- package/dist/components/forms/InputTag/InputTag.theme.js +1 -2
- package/dist/components/forms/Mention/Mention.theme.js +3 -5
- package/dist/components/forms/Radio/Radio.js +3 -2
- package/dist/components/forms/Radio/Radio.theme.js +2 -2
- package/dist/components/forms/RichTextEditor/RichTextEditor.js +22 -23
- package/dist/components/forms/Select/Select.d.ts +5 -1
- package/dist/components/forms/Select/Select.js +12 -11
- package/dist/components/forms/Select/Select.theme.js +4 -4
- package/dist/components/forms/Select/Select.types.d.ts +4 -1
- package/dist/components/forms/SelectableCard/SelectableCard.animations.d.ts +1 -2
- package/dist/components/forms/SelectableCard/SelectableCard.animations.js +6 -7
- package/dist/components/forms/SelectableCard/SelectableCard.js +1 -1
- package/dist/components/forms/Signature/Signature.js +1 -1
- package/dist/components/forms/Slider/Slider.js +24 -11
- package/dist/components/forms/Slider/Slider.theme.js +9 -3
- package/dist/components/forms/Switch/Switch.theme.js +1 -1
- package/dist/components/forms/TimePicker/TimePicker.theme.js +6 -7
- package/dist/components/forms/TimePicker/TimePickerContent.js +1 -1
- package/dist/components/forms/TimePicker/TimePickerTrigger.js +3 -3
- package/dist/components/forms/forms.theme.js +23 -12
- package/dist/components/forms/index.js +1 -1
- package/dist/components/generative/registry.js +195 -2
- package/dist/components/generative/resolvers.js +16 -16
- package/dist/components/generative/schema.generated.js +2687 -379
- package/dist/components/layout/Section/Section.theme.js +1 -1
- package/dist/generative.schema.json +2687 -379
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/useElapsedTime.d.ts +28 -0
- package/dist/hooks/useElapsedTime.js +37 -0
- package/dist/hooks/useSelectPortal.d.ts +10 -2
- package/dist/hooks/useSelectPortal.js +6 -3
- package/dist/index.js +1 -1
- package/dist/registry.json +835 -261
- package/dist/shadcn-compat.css +1 -1
- package/dist/styles.css +1 -1
- package/dist/theme.css +5 -1
- package/dist/themes/ember.css +131 -0
- package/dist/themes/iris.css +94 -0
- package/dist/themes/jade.css +139 -0
- package/dist/tools.json +2705 -361
- package/dist/utils/colorUtils.d.ts +6 -6
- package/dist/utils/colorUtils.js +8 -8
- package/package.json +9 -6
- package/src/global.scss +15 -4
- package/src/styles/theme.css +440 -152
- package/tailwind.preset.cjs +52 -34
- package/dist/components/core/Pill/Pill.animations.d.ts +0 -32
- package/dist/components/core/Pill/Pill.animations.js +0 -16
|
@@ -4,16 +4,22 @@
|
|
|
4
4
|
* Record<Size, string> per sub-element, CSS variables for all theming.
|
|
5
5
|
*/
|
|
6
6
|
const metricTheme = {
|
|
7
|
-
// Base container (shared across all variants).
|
|
8
|
-
//
|
|
9
|
-
|
|
7
|
+
// Base container (shared across all variants). Overflow + resting surface
|
|
8
|
+
// come from the Card shell Metric renders into (see Metric.tsx), but Metric
|
|
9
|
+
// is a compact stat tile, not a freeform Card — it overrides the shell's
|
|
10
|
+
// --card-radius with its own --metric-radius (same "rounded-[...]" utility
|
|
11
|
+
// group, so this wins via source order) rather than inheriting Card's
|
|
12
|
+
// radius verbatim.
|
|
13
|
+
baseStyle: "transition-colors duration-200 rounded-[var(--metric-radius)]",
|
|
10
14
|
// Visual style variants — container surface + structure.
|
|
11
15
|
// `filled` adds nothing: it inherits the Card shell's --color-surface-raised.
|
|
12
16
|
// `ghost` clears that fill (`!` beats Card's bg utility regardless of
|
|
13
|
-
// source order)
|
|
17
|
+
// source order) and cancels the Card shell's elevation shadow (`shadow-none`
|
|
18
|
+
// is registered in the same tailwind-merge `shadow` group as `shadow-surface-*`
|
|
19
|
+
// in cn.ts, so it reliably overrides it) so it sits fully flush/flat.
|
|
14
20
|
variants: {
|
|
15
21
|
filled: "",
|
|
16
|
-
ghost: "!bg-transparent overflow-visible",
|
|
22
|
+
ghost: "!bg-transparent overflow-visible shadow-none",
|
|
17
23
|
},
|
|
18
24
|
// Icon chip base per variant — classes shared across all colors of that variant
|
|
19
25
|
iconContainerVariants: {
|
|
@@ -22,14 +28,18 @@ const metricTheme = {
|
|
|
22
28
|
},
|
|
23
29
|
// Icon tint per semantic color — shared by every variant (the one thing color drives)
|
|
24
30
|
iconColors: {
|
|
25
|
-
|
|
31
|
+
mono: "text-[var(--color-text-primary)]",
|
|
26
32
|
primary: "text-[var(--color-primary)] dark:text-[var(--color-primary-400)]",
|
|
27
33
|
success: "text-[var(--color-success)] dark:text-[var(--color-success-400)]",
|
|
28
34
|
warning: "text-[var(--color-warning)] dark:text-[var(--color-warning-400)]",
|
|
29
35
|
danger: "text-[var(--color-danger)] dark:text-[var(--color-danger-400)]",
|
|
30
36
|
},
|
|
31
37
|
// Size variants — one Record<Size, string> per sub-element
|
|
32
|
-
contentPaddingSizes: {
|
|
38
|
+
contentPaddingSizes: {
|
|
39
|
+
sm: "p-[var(--metric-content-p-sm)]",
|
|
40
|
+
md: "p-[var(--metric-content-p-md)]",
|
|
41
|
+
lg: "p-[var(--metric-content-p-lg)]",
|
|
42
|
+
},
|
|
33
43
|
iconContainerSizes: { sm: "size-8", md: "size-10", lg: "size-12" },
|
|
34
44
|
// Heights mirror iconContainerSizes — with an icon, the label box spans the
|
|
35
45
|
// chip's height and centers its text against it (mb-3 spacing is dropped;
|
|
@@ -40,7 +50,14 @@ const metricTheme = {
|
|
|
40
50
|
md: "text-sm font-medium tracking-tight",
|
|
41
51
|
lg: "text-sm font-medium tracking-tight",
|
|
42
52
|
},
|
|
43
|
-
|
|
53
|
+
// text-[length:...] (not bare text-[var(...)]) is required — Tailwind's
|
|
54
|
+
// arbitrary text-[...] syntax is ambiguous between color/font-size and a
|
|
55
|
+
// bare var() resolves to color, silently no-oping the size change.
|
|
56
|
+
valueSizes: {
|
|
57
|
+
sm: "text-[length:var(--metric-value-size-sm)] leading-[1.4]",
|
|
58
|
+
md: "text-[length:var(--metric-value-size-md)] leading-[1.2]",
|
|
59
|
+
lg: "text-[length:var(--metric-value-size-lg)] leading-[1.2]",
|
|
60
|
+
},
|
|
44
61
|
subtitleSizes: { sm: "text-xs mt-1", md: "text-xs mt-0.5", lg: "text-sm mt-1" },
|
|
45
62
|
// Common element styles
|
|
46
63
|
labelStyle: "font-semibold text-[var(--color-text-secondary)] mb-2",
|
|
@@ -11,19 +11,19 @@ const tableTheme = {
|
|
|
11
11
|
// border, or by the pagination footer's `border-t` when pagination is shown.
|
|
12
12
|
// `bordered` is a full grid and keeps its closing edge.
|
|
13
13
|
variants: {
|
|
14
|
-
default: "border-[var(--color-border)] dark:border-[var(--color-
|
|
14
|
+
default: "border-[var(--color-border)] dark:border-[var(--color-mono-700)] " +
|
|
15
15
|
"[&>tbody>tr:last-child>td]:border-b-0 " +
|
|
16
16
|
"[&_td]:px-3 [&_td]:py-2.5 [&_th]:px-3 [&_th]:py-2.5",
|
|
17
|
-
striped: "border-[var(--color-border)] dark:border-[var(--color-
|
|
18
|
-
"[&>tbody>tr:nth-child(odd)]:bg-[var(--color-
|
|
17
|
+
striped: "border-[var(--color-border)] dark:border-[var(--color-mono-700)] " +
|
|
18
|
+
"[&>tbody>tr:nth-child(odd)]:bg-[var(--color-mono-50)] dark:[&>tbody>tr:nth-child(odd)]:bg-[var(--color-mono-800)] " +
|
|
19
19
|
"[&>tbody>tr:last-child>td]:border-b-0 " +
|
|
20
20
|
"[&_td]:px-3 [&_td]:py-2.5 [&_th]:px-3 [&_th]:py-2.5",
|
|
21
|
-
bordered: "border-t border-l border-[var(--color-border)] dark:border-[var(--color-
|
|
21
|
+
bordered: "border-t border-l border-[var(--color-border)] dark:border-[var(--color-mono-700)] " +
|
|
22
22
|
"[&_td]:border-b [&_td]:border-r [&_th]:border-b [&_th]:border-r " +
|
|
23
23
|
"[&_td]:border-[var(--color-border)] [&_th]:border-[var(--color-border)] " +
|
|
24
|
-
"dark:[&_td]:border-[var(--color-
|
|
24
|
+
"dark:[&_td]:border-[var(--color-mono-700)] dark:[&_th]:border-[var(--color-mono-700)] " +
|
|
25
25
|
"[&_td]:px-3 [&_td]:py-2.5 [&_th]:px-3 [&_th]:py-2.5",
|
|
26
|
-
compact: "border-[var(--color-border)] dark:border-[var(--color-
|
|
26
|
+
compact: "border-[var(--color-border)] dark:border-[var(--color-mono-700)] " +
|
|
27
27
|
"[&>tbody>tr:last-child>td]:border-b-0 " +
|
|
28
28
|
"[&_td]:px-3 [&_td]:py-1 [&_th]:px-3 [&_th]:py-1",
|
|
29
29
|
},
|
|
@@ -61,7 +61,7 @@ const tableTheme = {
|
|
|
61
61
|
// Row styles — hover and layout only (borders moved to cells)
|
|
62
62
|
// Light: neutral-50 hover | Dark: neutral-800 hover
|
|
63
63
|
rowStyle: "group transition-all duration-300 relative " +
|
|
64
|
-
"hover:bg-[var(--color-
|
|
64
|
+
"hover:bg-[var(--color-mono-50)] " +
|
|
65
65
|
"dark:hover:bg-[var(--color-surface-hover)]",
|
|
66
66
|
// Selected row styles — background is applied per-cell (in TableCell) so that
|
|
67
67
|
// sticky/frozen columns repaint correctly. The row only carries the left indicator.
|
|
@@ -72,8 +72,8 @@ const tableTheme = {
|
|
|
72
72
|
frozenColumnStyle: "sticky left-0 z-10",
|
|
73
73
|
lastFrozenColumnStyle: "sticky right-0 z-10",
|
|
74
74
|
frozenHeaderStyle: "sticky top-0 z-20 " +
|
|
75
|
-
"shadow-lg shadow-[var(--color-
|
|
76
|
-
"dark:shadow-[var(--color-
|
|
75
|
+
"shadow-lg shadow-[var(--color-mono-200)]/50 " +
|
|
76
|
+
"dark:shadow-[var(--color-mono-900)]/50",
|
|
77
77
|
// Utility controls - Column manager button
|
|
78
78
|
// Surface-like control; surface/border/hover tokens flip automatically between light/dark
|
|
79
79
|
columnManagerButton: "inline-flex items-center gap-2 rounded-[calc(var(--radius-base)*0.75)] px-3 py-2 text-sm font-medium " +
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
3
3
|
import { useMemo, useCallback } from 'react';
|
|
4
|
+
import { DotsThree } from '@phosphor-icons/react';
|
|
4
5
|
import { cn } from '../../../utils/cn.js';
|
|
5
6
|
import { Dropdown } from '../../core/Dropdown/Dropdown.js';
|
|
6
7
|
import '../../core/Dropdown/DropdownTrigger.js';
|
|
@@ -10,7 +11,6 @@ import '../../core/Dropdown/DropdownSection.js';
|
|
|
10
11
|
import '../../core/Dropdown/DropdownSeparator.js';
|
|
11
12
|
import '../../core/Dropdown/Dropdown.theme.js';
|
|
12
13
|
import { Button } from '../../core/Button/Button.js';
|
|
13
|
-
import { EllipsisHorizontalIcon } from '@heroicons/react/20/solid';
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* TableActions component with smart display logic
|
|
@@ -50,7 +50,7 @@ const TableActions = ({ actions, row, maxVisibleActions = 2, className, }) => {
|
|
|
50
50
|
});
|
|
51
51
|
};
|
|
52
52
|
const renderOverflowMenu = () => {
|
|
53
|
-
return (jsxs(Dropdown, { placement: "bottom-end", offset: 4, disabledKeys: disabledKeys, onAction: handleAction, children: [jsx(Dropdown.Trigger, { children: jsx(Button, { color: "
|
|
53
|
+
return (jsxs(Dropdown, { placement: "bottom-end", offset: 4, disabledKeys: disabledKeys, onAction: handleAction, children: [jsx(Dropdown.Trigger, { children: jsx(Button, { color: "mono", variant: "ghost", size: "sm", iconOnly: true, "aria-label": "More actions", className: "text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)] !border-none", children: jsx(DotsThree, { className: "size-4" }) }) }), jsx(Dropdown.Menu, { "aria-label": "Row actions", children: sortedActions.map((action) => {
|
|
54
54
|
const Icon = action.icon;
|
|
55
55
|
return (jsx(Dropdown.Item, { itemKey: action.id, isDanger: action.variant === "danger", startContent: jsx(Icon, { className: "size-4" }), children: action.label }, action.id));
|
|
56
56
|
}) })] }));
|
|
@@ -19,7 +19,7 @@ const TableActionsMenu = ({ actions, row, onClose, className, }) => {
|
|
|
19
19
|
var _a;
|
|
20
20
|
const isDisabled = (_a = action.disabled) === null || _a === void 0 ? void 0 : _a.call(action, row);
|
|
21
21
|
const Icon = action.icon;
|
|
22
|
-
return (jsxs(Button, { variant: "ghost", color: action.variant === 'danger' ? 'danger' : '
|
|
22
|
+
return (jsxs(Button, { variant: "ghost", color: action.variant === 'danger' ? 'danger' : 'mono', size: "sm", onClick: () => handleActionClick(action), disabled: isDisabled, className: "w-full justify-start gap-3", role: "menuitem", "aria-label": action.label, children: [jsx(Icon, { className: "size-4 flex-shrink-0" }), jsx("span", { children: action.label })] }, action.id));
|
|
23
23
|
}) }));
|
|
24
24
|
};
|
|
25
25
|
|
|
@@ -3,7 +3,7 @@ import { jsxs, jsx } from 'react/jsx-runtime';
|
|
|
3
3
|
import { Popover } from '../../core/Popover/Popover.js';
|
|
4
4
|
import '../../core/Popover/PopoverContext.js';
|
|
5
5
|
import '../../core/Popover/PopoverBody.js';
|
|
6
|
-
import {
|
|
6
|
+
import { Gear } from '@phosphor-icons/react';
|
|
7
7
|
import { Button } from '../../core/Button/Button.js';
|
|
8
8
|
import 'react';
|
|
9
9
|
import { Checkbox } from '../../forms/Checkbox/Checkbox.js';
|
|
@@ -19,7 +19,7 @@ function TableColumnManagerComponent({ columns, visibleColumns, columnOrder, onT
|
|
|
19
19
|
const displayName = typeof column.header === 'string' ? column.header : column.id;
|
|
20
20
|
return (jsx(Checkbox, { id: `column-checkbox-${column.id}`, name: `column-${column.id}`, value: column.id, checked: isVisible, onChange: () => onToggleColumn(column.id), "aria-label": `Toggle visibility for ${displayName} column`, label: displayName, state: isLocked ? 'disabled' : 'default' }));
|
|
21
21
|
};
|
|
22
|
-
return (jsxs(Popover, { placement: "bottom-end", offset: 8, children: [jsx(Popover.Trigger, { children: jsxs(Button, { color: "
|
|
22
|
+
return (jsxs(Popover, { placement: "bottom-end", offset: 8, children: [jsx(Popover.Trigger, { children: jsxs(Button, { color: "mono", variant: "filled", "aria-label": "Manage column visibility", children: [jsx(Gear, { className: "size-5", "aria-hidden": "true" }), "Manage Columns"] }) }), jsx(Popover.Body, { className: "p-0", children: jsxs("div", { className: "w-64 p-3 overflow-hidden", role: "dialog", "aria-labelledby": "column-manager-title", "aria-describedby": "column-manager-description", "aria-modal": "true", children: [jsx("div", { id: "column-manager-title", className: "text-sm uppercase font-bold mb-3 text-[var(--color-text-placeholder)]", children: "Manage Columns" }), jsx("div", { id: "column-manager-description", className: "sr-only", children: "Use checkboxes to control which columns are visible in the table. Locked columns cannot be hidden." }), jsx("div", { className: "space-y-0.5", role: "group", "aria-label": "Column visibility options", children: onColumnReorder ? (jsx(Sortable, { onReorder: onColumnReorder, showDragHandle: true, className: "space-y-0.5", children: orderedColumns.map((column) => (jsx(SortableItem, { id: column.id, disabled: column.locked === true, className: `hover:bg-[var(--color-surface-hover)] rounded-lg p-1.5 transition-colors ${column.locked ? 'bg-[var(--color-background-secondary)]' : ''}`, children: renderColumnItem(column) }, column.id))) })) : (orderedColumns.map((column) => (jsx("div", { className: `hover:bg-[var(--color-surface-hover)] rounded-lg p-1.5 transition-colors ${column.locked ? 'bg-[var(--color-background-secondary)]' : ''}`, children: renderColumnItem(column) }, column.id)))) }), jsx("div", { className: "mt-3 flex justify-end", children: jsx(Button, { color: "mono", variant: "filled", className: "w-full", onClick: onResetToDefault, children: "Reset to Default" }) })] }) })] }));
|
|
23
23
|
}
|
|
24
24
|
const TableColumnManager = TableColumnManagerComponent;
|
|
25
25
|
|
|
@@ -4,7 +4,7 @@ import React__default, { useContext } from 'react';
|
|
|
4
4
|
import { TableContext } from './TableContext.js';
|
|
5
5
|
import { cn } from '../../../utils/cn.js';
|
|
6
6
|
import { alignmentClasses } from './Table.utils.js';
|
|
7
|
-
import {
|
|
7
|
+
import { CaretUp, CaretDown } from '@phosphor-icons/react';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Declarative Table Header component
|
|
@@ -58,8 +58,8 @@ const HeaderCellComponent = ({ children, isFrozen = false, isLastFrozen = false,
|
|
|
58
58
|
'justify-end': align === 'right',
|
|
59
59
|
'justify-center': align === 'center',
|
|
60
60
|
}), children: [children, isSortable && sortDirection && (jsx("span", { className: "ml-1", children: sortDirection === 'asc'
|
|
61
|
-
? jsx(
|
|
62
|
-
: jsx(
|
|
61
|
+
? jsx(CaretUp, { className: "size-3.5" })
|
|
62
|
+
: jsx(CaretDown, { className: "size-3.5" }) }))] }) }));
|
|
63
63
|
};
|
|
64
64
|
HeaderCellComponent.displayName = 'Table.HeaderCell';
|
|
65
65
|
const HeaderCell = React__default.memo(HeaderCellComponent);
|
|
@@ -11,7 +11,7 @@ import '../../forms/Select/Select.theme.js';
|
|
|
11
11
|
import { Popover } from '../../core/Popover/Popover.js';
|
|
12
12
|
import '../../core/Popover/PopoverContext.js';
|
|
13
13
|
import '../../core/Popover/PopoverBody.js';
|
|
14
|
-
import {
|
|
14
|
+
import { Funnel, X, Plus } from '@phosphor-icons/react';
|
|
15
15
|
import { cn } from '../../../utils/cn.js';
|
|
16
16
|
|
|
17
17
|
/**
|
|
@@ -214,7 +214,7 @@ function TableFilter({ columns, filterConfig, onFilterChange, filterLogic: contr
|
|
|
214
214
|
return true;
|
|
215
215
|
return f.value != null && f.value !== "";
|
|
216
216
|
}).length;
|
|
217
|
-
return (jsxs(Popover, { placement: "bottom-end", offset: 8, closeOnClickOutside: false, children: [jsx(Popover.Trigger, { children: jsxs(Button, { color: "
|
|
217
|
+
return (jsxs(Popover, { placement: "bottom-end", offset: 8, closeOnClickOutside: false, children: [jsx(Popover.Trigger, { children: jsxs(Button, { color: "mono", variant: "outline", "aria-label": "Filter table data", size: "sm", children: [jsx(Funnel, { className: "size-4", "aria-hidden": "true" }), "Filters", appliedFilterCount > 0 && (jsx("span", { className: "ml-1 inline-flex items-center justify-center size-5 rounded-full bg-[var(--color-primary)] text-[var(--color-primary-contrast)] text-sm font-medium", children: appliedFilterCount }))] }) }), jsx(Popover.Body, { className: "p-0 max-w-none", children: jsxs("div", { className: cn("w-[500px] p-3", className), role: "dialog", "aria-labelledby": "table-filter-title", "aria-modal": "true", children: [jsxs("div", { className: "flex items-center justify-between mb-3", children: [jsx("div", { id: "table-filter-title", className: "text-sm uppercase font-bold text-[var(--color-text-placeholder)]", children: "Filters" }), activeFilters.length > 1 && (jsxs("div", { className: "flex items-center gap-0.5 rounded-md bg-[var(--color-surface-sunken)] p-0.5", children: [jsx("button", { type: "button", className: cn("px-2.5 py-0.5 text-sm font-medium rounded transition-colors", filterLogic === "and"
|
|
218
218
|
? "bg-[var(--color-background)] text-[var(--color-text-primary)] shadow-sm"
|
|
219
219
|
: "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"), onClick: () => handleSetLogic("and"), children: "AND" }), jsx("button", { type: "button", className: cn("px-2.5 py-0.5 text-sm font-medium rounded transition-colors", filterLogic === "or"
|
|
220
220
|
? "bg-[var(--color-background)] text-[var(--color-text-primary)] shadow-sm"
|
|
@@ -222,8 +222,8 @@ function TableFilter({ columns, filterConfig, onFilterChange, filterLogic: contr
|
|
|
222
222
|
const selectedColumn = getSelectedColumn(filter.columnId);
|
|
223
223
|
const resolvedType = getResolvedFilterType(selectedColumn);
|
|
224
224
|
const operatorOptions = getOperatorsForFilterType(resolvedType);
|
|
225
|
-
return (jsxs("div", { className: "flex items-center gap-1.5", children: [jsx(Select, { value: filter.columnId, onChange: (value) => handleFilterColumnChange(filter.id, value), options: columnOptions, size: "sm", className: "flex-1 min-w-0" }), jsx(Select, { value: filter.operator, onChange: (value) => handleFilterOperatorChange(filter.id, value), options: operatorOptions, size: "sm", className: "flex-1 min-w-0" }), jsx(FilterValueInput, { filter: filter, column: selectedColumn, filterType: resolvedType, onValueChange: (value) => handleFilterValueChange(filter.id, value) }), jsx(Button, { color: "
|
|
226
|
-
}) }), jsxs("div", { className: "mt-3 flex items-center gap-4", children: [jsxs(Link, { color: "
|
|
225
|
+
return (jsxs("div", { className: "flex items-center gap-1.5", children: [jsx(Select, { value: filter.columnId, onChange: (value) => handleFilterColumnChange(filter.id, value), options: columnOptions, size: "sm", className: "flex-1 min-w-0" }), jsx(Select, { value: filter.operator, onChange: (value) => handleFilterOperatorChange(filter.id, value), options: operatorOptions, size: "sm", className: "flex-1 min-w-0" }), jsx(FilterValueInput, { filter: filter, column: selectedColumn, filterType: resolvedType, onValueChange: (value) => handleFilterValueChange(filter.id, value) }), jsx(Button, { color: "mono", variant: "ghost", size: "sm", iconOnly: true, onClick: () => handleRemoveFilter(filter.id), "aria-label": "Remove filter", className: "text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)]", children: jsx(X, { className: "size-4", weight: "bold" }) })] }, filter.id));
|
|
226
|
+
}) }), jsxs("div", { className: "mt-3 flex items-center gap-4", children: [jsxs(Link, { color: "mono", size: "sm", onClick: handleAddFilter, children: [jsx(Plus, { className: "size-4" }), "Add Filter"] }), activeFilters.length > 0 && (jsx(Link, { color: "mono", size: "sm", onClick: handleClearAll, children: "Clear All" }))] })] }) })] }));
|
|
227
227
|
}
|
|
228
228
|
|
|
229
229
|
export { TableFilter };
|
|
@@ -4,7 +4,7 @@ import { useCallback } from 'react';
|
|
|
4
4
|
import { TableCell } from './TableCell.js';
|
|
5
5
|
import { Checkbox } from '../../forms/Checkbox/Checkbox.js';
|
|
6
6
|
import { getRowId, UTILITY_COLUMN_WIDTH, UTILITY_COLUMN_ID } from './Table.utils.js';
|
|
7
|
-
import {
|
|
7
|
+
import { CaretUp, CaretDown } from '@phosphor-icons/react';
|
|
8
8
|
|
|
9
9
|
function TableHeaderComponent({ columns, sortConfig = [], onSortChange, freezeHeader, freezeFirstColumn, freezeLastColumn, expandable, expandedRowRender, selectable, selectionType, selectedRows = [], onSelectionChange, theme, data = [], rowKey, }) {
|
|
10
10
|
const handleSort = useCallback((columnId) => {
|
|
@@ -51,8 +51,8 @@ function TableHeaderComponent({ columns, sortConfig = [], onSortChange, freezeHe
|
|
|
51
51
|
const currentSort = sortConfig.find(sort => sort.columnId === column.id);
|
|
52
52
|
const isSortable = column.sortable && onSortChange;
|
|
53
53
|
return (jsx(TableCell, { column: column, row: null, rowId: "header", isHeader: true, isFrozen: freezeFirstColumn && index === 0, isLastFrozen: freezeLastColumn && index === columns.length - 1, sortDirection: currentSort === null || currentSort === void 0 ? void 0 : currentSort.direction, theme: theme, children: isSortable ? (jsxs("button", { onClick: () => handleSort(column.id), className: "flex items-center gap-1 w-full text-left hover:text-[var(--color-primary)] transition-colors", "aria-label": `Sort by ${typeof column.header === 'string' ? column.header : column.id}`, children: [column.header, currentSort && (jsx("span", { className: "text-sm", children: currentSort.direction === 'asc'
|
|
54
|
-
? jsx(
|
|
55
|
-
: jsx(
|
|
54
|
+
? jsx(CaretUp, { className: "size-3.5" })
|
|
55
|
+
: jsx(CaretDown, { className: "size-3.5" }) }))] })) : (column.header) }, column.id));
|
|
56
56
|
})] }) }));
|
|
57
57
|
}
|
|
58
58
|
const TableHeader = TableHeaderComponent;
|
|
@@ -6,7 +6,7 @@ import { TableCell } from './TableCell.js';
|
|
|
6
6
|
import { Button } from '../../core/Button/Button.js';
|
|
7
7
|
import { Checkbox } from '../../forms/Checkbox/Checkbox.js';
|
|
8
8
|
import { Radio } from '../../forms/Radio/Radio.js';
|
|
9
|
-
import {
|
|
9
|
+
import { Minus, Plus } from '@phosphor-icons/react';
|
|
10
10
|
import { UTILITY_COLUMN_WIDTH, UTILITY_COLUMN_ID } from './Table.utils.js';
|
|
11
11
|
import { cn } from '../../../utils/cn.js';
|
|
12
12
|
import { tableExpandAnimations, tableExpandContentAnimations } from './Table.animations.js';
|
|
@@ -31,7 +31,7 @@ function TableRowComponent({ row, rowId, columns, onRowClick, expandedRowRender,
|
|
|
31
31
|
accessor: () => "",
|
|
32
32
|
width: UTILITY_COLUMN_WIDTH,
|
|
33
33
|
}, row: row, rowId: rowId, isSelected: isSelected, theme: theme, children: jsxs("div", { className: "flex items-center gap-2", children: [selectable &&
|
|
34
|
-
(selectionType === "checkbox" ? (jsx(Checkbox, { id: `table-checkbox-${rowId}`, name: `table-selection-${rowId}`, value: String(rowId), checked: isSelected, onChange: (checked) => onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange(checked), onClick: (e) => e.stopPropagation(), "aria-label": "Select row" })) : (jsx("div", { onClick: (e) => e.stopPropagation(), children: jsx(Radio, { id: `table-radio-${rowId}`, name: "table-selection", value: String(rowId), checked: isSelected, onChange: (checked) => onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange(checked), "aria-label": "Select row" }) }))), expandedRowRender && (jsx(Button, { color: "
|
|
34
|
+
(selectionType === "checkbox" ? (jsx(Checkbox, { id: `table-checkbox-${rowId}`, name: `table-selection-${rowId}`, value: String(rowId), checked: isSelected, onChange: (checked) => onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange(checked), onClick: (e) => e.stopPropagation(), "aria-label": "Select row" })) : (jsx("div", { onClick: (e) => e.stopPropagation(), children: jsx(Radio, { id: `table-radio-${rowId}`, name: "table-selection", value: String(rowId), checked: isSelected, onChange: (checked) => onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange(checked), "aria-label": "Select row" }) }))), expandedRowRender && (jsx(Button, { color: "mono", variant: "ghost", size: "sm", iconOnly: true, className: "size-6 min-h-0 p-1", onClick: handleExpandClick, "aria-label": isExpanded ? "Collapse row" : "Expand row", children: isExpanded ? (jsx(Minus, { className: "size-4", weight: "bold" })) : (jsx(Plus, { className: "size-4", weight: "bold" })) }))] }) })), columns.map((column, index) => (jsx(TableCell, { column: column, row: row, rowId: rowId, isFrozen: freezeFirstColumn && index === 0, isLastFrozen: freezeLastColumn && index === columns.length - 1, isSelected: isSelected, theme: theme }, column.id)))] }), jsx(AnimatePresence, { initial: false, children: isExpanded && expandedRowRender && (jsx(motion.tr, { initial: "collapsed", animate: "expanded", exit: "collapsed", children: jsx("td", { colSpan: colSpan, className: "!p-0 border-b border-[var(--color-border)] dark:border-[var(--color-mono-700)]", children: jsx(motion.div, { variants: tableExpandAnimations, style: { overflow: "hidden" }, children: jsx(motion.div, { variants: tableExpandContentAnimations, children: expandedRowRender(row) }) }) }) }, `${rowId}-expanded`)) })] }));
|
|
35
35
|
}
|
|
36
36
|
TableRowComponent.displayName = "TableRow";
|
|
37
37
|
const TableRow = React__default.memo(TableRowComponent);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
|
-
import {
|
|
3
|
+
import { X } from '@phosphor-icons/react';
|
|
4
4
|
import { Button } from '../../core/Button/Button.js';
|
|
5
5
|
import 'react';
|
|
6
6
|
import { Link } from '../../core/Link/Link.js';
|
|
@@ -16,8 +16,8 @@ const TableSelectionHeader = ({ selectedCount, totalCount, selectedRows, bulkAct
|
|
|
16
16
|
return (jsxs("div", { className: cn("flex items-center justify-between px-3 py-1 rounded-lg shadow-xl bg-[var(--color-surface-raised)] z-10", className), children: [jsxs("div", { className: "flex items-center gap-3", children: [jsx("span", { className: "text-[var(--color-text-muted)] text-base border-r border-[var(--color-border)] pr-3", children: selectedCount === totalCount
|
|
17
17
|
? `All ${selectedCount} selected`
|
|
18
18
|
: `${selectedCount} selected` }), bulkActions.length > 0 && (jsx("div", { className: "flex items-center gap-2", children: bulkActions.map((action) => {
|
|
19
|
-
return (jsx(Button, { color: "
|
|
20
|
-
}) }))] }), jsxs(Link, { color: "primary", onClick: onClearSelection, "aria-label": "Clear selection", children: [jsx(
|
|
19
|
+
return (jsx(Button, { color: "mono", variant: "filled", onClick: () => action.onClick(selectedRows), className: "text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)]", size: "sm", children: action.label }, action.id));
|
|
20
|
+
}) }))] }), jsxs(Link, { color: "primary", onClick: onClearSelection, "aria-label": "Clear selection", children: [jsx(X, { className: "size-4" }), "Clear"] })] }));
|
|
21
21
|
};
|
|
22
22
|
|
|
23
23
|
export { TableSelectionHeader };
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
3
|
import React__default from 'react';
|
|
4
4
|
import { useReducedMotion, motion } from 'motion/react';
|
|
5
|
-
import {
|
|
5
|
+
import { Check } from '@phosphor-icons/react';
|
|
6
6
|
import { cn } from '../../../utils/cn.js';
|
|
7
7
|
import { useTimelineContext } from './TimelineContext.js';
|
|
8
8
|
import { useTimelineItemContext } from './TimelineItem.js';
|
|
@@ -24,7 +24,7 @@ const TimelineMarker = React__default.forwardRef(({ icon, className, ...props },
|
|
|
24
24
|
if (icon)
|
|
25
25
|
return icon;
|
|
26
26
|
if (status === "completed") {
|
|
27
|
-
return jsx(
|
|
27
|
+
return jsx(Check, { className: "w-4 h-4" });
|
|
28
28
|
}
|
|
29
29
|
if (status === "active") {
|
|
30
30
|
return (jsx("span", { className: "w-2 h-2 rounded-full bg-[var(--color-primary)]" }));
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
3
3
|
import * as React from 'react';
|
|
4
4
|
import { useMotionValue, AnimatePresence, motion, useReducedMotion, useSpring } from 'motion/react';
|
|
5
|
-
import {
|
|
5
|
+
import { PaperPlaneTilt } from '@phosphor-icons/react';
|
|
6
6
|
import { cn } from '../../../utils/cn.js';
|
|
7
7
|
import { Avatar } from '../../core/Avatar/Avatar.js';
|
|
8
8
|
import { customCursorVariants, reducedMotionSpringConfig, defaultSpringConfig } from './CustomCursor.animations.js';
|
|
@@ -150,7 +150,7 @@ const CustomCursor = React.forwardRef(({ children, size = "md", color = "primary
|
|
|
150
150
|
y.set(cursorPos.y);
|
|
151
151
|
}, [cursorPos, x, y]);
|
|
152
152
|
// Default content based on shape
|
|
153
|
-
const defaultContent = shape === "arrow" ? (jsx(
|
|
153
|
+
const defaultContent = shape === "arrow" ? (jsx(PaperPlaneTilt, { className: "w-full h-full rotate-180" })) : (jsx("div", { className: "w-full h-full" }));
|
|
154
154
|
return (jsx(AnimatePresence, { children: isActive && (jsx(motion.div, { ref: cursorRef, "data-slot": "custom-cursor", className: cn(customCursorTheme.baseStyle, customCursorTheme.cursorStyle, customCursorTheme.sizes[size], customCursorTheme.colors[color], customCursorTheme.variants[variant], customCursorTheme.shapes[shape], className), style: { top: y, left: x, ...style }, variants: customCursorVariants, initial: "initial", animate: "animate", exit: "exit", role: "presentation", "aria-hidden": "true", ...props, children: children || defaultContent })) }));
|
|
155
155
|
});
|
|
156
156
|
CustomCursor.displayName = "CustomCursor";
|
|
@@ -10,7 +10,7 @@ const customCursorTheme = {
|
|
|
10
10
|
user: "flex items-center gap-2 rounded-full pl-1 pr-3 py-1 shadow-xl",
|
|
11
11
|
},
|
|
12
12
|
cursorFollowColors: {
|
|
13
|
-
|
|
13
|
+
mono: "bg-[var(--color-background-secondary)]",
|
|
14
14
|
dark: "bg-[var(--color-text-primary)]",
|
|
15
15
|
primary: "bg-[var(--color-primary)]",
|
|
16
16
|
success: "bg-[var(--color-success)]",
|
|
@@ -23,7 +23,7 @@ const customCursorTheme = {
|
|
|
23
23
|
lg: "w-10 h-10",
|
|
24
24
|
},
|
|
25
25
|
colors: {
|
|
26
|
-
|
|
26
|
+
mono: "text-[var(--color-background-secondary)]",
|
|
27
27
|
dark: "text-[var(--color-text-primary)]",
|
|
28
28
|
primary: "text-[var(--color-primary)]",
|
|
29
29
|
success: "text-[var(--color-success)]",
|
|
@@ -12,6 +12,12 @@ function buildMaskImage(direction, fadeSize) {
|
|
|
12
12
|
if (direction === "radial") {
|
|
13
13
|
return `radial-gradient(ellipse at center, black ${100 - stop}%, transparent 100%)`;
|
|
14
14
|
}
|
|
15
|
+
if (direction === "center") {
|
|
16
|
+
// Inverse of "radial": dots fade OUT in the center and stay solid toward
|
|
17
|
+
// the edges (a vignette that keeps the content area behind it clear).
|
|
18
|
+
// Larger fadeSize = larger clear zone in the middle.
|
|
19
|
+
return `radial-gradient(ellipse at center, transparent ${stop}%, black 100%)`;
|
|
20
|
+
}
|
|
15
21
|
const directionMap = {
|
|
16
22
|
top: "to top",
|
|
17
23
|
bottom: "to bottom",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
/** Direction for the fade gradient mask */
|
|
3
|
-
export type DotPatternFadeDirection = "radial" | "top" | "bottom" | "left" | "right";
|
|
3
|
+
export type DotPatternFadeDirection = "radial" | "center" | "top" | "bottom" | "left" | "right";
|
|
4
4
|
export interface DotPatternProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
5
5
|
/**
|
|
6
6
|
* Distance between dots in pixels (center to center).
|
|
@@ -25,7 +25,9 @@ export interface DotPatternProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
|
25
25
|
fade?: boolean;
|
|
26
26
|
/**
|
|
27
27
|
* Direction of the fade gradient.
|
|
28
|
-
* - "radial" fades
|
|
28
|
+
* - "radial" fades the edges out (solid center, transparent edges)
|
|
29
|
+
* - "center" fades the center out (transparent center, solid edges — a
|
|
30
|
+
* vignette that keeps content-area behind it clear)
|
|
29
31
|
* - "top" | "bottom" | "left" | "right" fades toward that edge
|
|
30
32
|
* @default "radial"
|
|
31
33
|
*/
|
|
@@ -78,6 +78,6 @@ export declare const generateMarble: (seed: string, colors: string[], count: num
|
|
|
78
78
|
* mis-reads dark tiles like a teal base with a cream accent.) Pass `threshold`
|
|
79
79
|
* to bias toward light text on more mid-tones (see `contrastTone`). Map the
|
|
80
80
|
* result to the theme-stable neutral tokens at the call site, e.g.
|
|
81
|
-
* `tone === "dark" ? "var(--color-
|
|
81
|
+
* `tone === "dark" ? "var(--color-mono-950)" : "var(--color-mono-50)"`.
|
|
82
82
|
*/
|
|
83
83
|
export declare const getMeshTextTone: (seed: string, colors: string[], count: number, threshold?: number) => ContrastTone;
|
|
@@ -102,7 +102,7 @@ const generateMarble = (seed, colors, count) => {
|
|
|
102
102
|
* mis-reads dark tiles like a teal base with a cream accent.) Pass `threshold`
|
|
103
103
|
* to bias toward light text on more mid-tones (see `contrastTone`). Map the
|
|
104
104
|
* result to the theme-stable neutral tokens at the call site, e.g.
|
|
105
|
-
* `tone === "dark" ? "var(--color-
|
|
105
|
+
* `tone === "dark" ? "var(--color-mono-950)" : "var(--color-mono-50)"`.
|
|
106
106
|
*/
|
|
107
107
|
const getMeshTextTone = (seed, colors, count, threshold) => {
|
|
108
108
|
const { base } = generateMarble(seed, colors, count);
|
|
@@ -8,6 +8,7 @@ import { cn } from '../../../utils/cn.js';
|
|
|
8
8
|
import { useCheckboxGroupContext } from './CheckboxContext.js';
|
|
9
9
|
import { CheckboxGroup } from './CheckboxGroup.js';
|
|
10
10
|
import { reducedMotionVariants, indeterminateVariants, checkmarkVariants } from './Checkbox.animations.js';
|
|
11
|
+
import { CHECK_RIPPLE_MOTION } from '../../core/shared/interaction.animations.js';
|
|
11
12
|
|
|
12
13
|
/**
|
|
13
14
|
* Checkbox component for selecting one or more options
|
|
@@ -75,7 +76,7 @@ const CheckboxComponent = React__default.forwardRef(({ id: idProp, name: namePro
|
|
|
75
76
|
ref(node);
|
|
76
77
|
else if (ref)
|
|
77
78
|
ref.current = node;
|
|
78
|
-
}, type: "checkbox", ...restProps, id: id, name: name, value: value, checked: isChecked, onChange: handleChange, disabled: isDisabled, "aria-describedby": description ? `${id}-description` : undefined, "aria-invalid": !isInGroup && isInvalid ? true : undefined, "data-state": isDisabled ? "disabled" : isInvalid ? "invalid" : "default", className: cn(checkboxTheme.inputStyle, checkboxTheme.sizes[size], indeterminate && "bg-neutral-200") }), jsxs(AnimatePresence, { mode: "wait", children: [indeterminate && (jsx(motion.svg, { viewBox: "0 0 16 16", fill: "none", className: cn("pointer-events-none col-start-1 row-start-1 self-center justify-self-center text-neutral-600", size === "sm" ? "size-3" : size === "lg" ? "size-5" : "size-4"), children: jsx(motion.path, { d: "M3.5 8 L12.5 8", stroke: "currentColor", strokeWidth: 2.5, strokeLinecap: "round", variants: shouldReduceMotion ? reducedMotionVariants : indeterminateVariants, initial: "unchecked", animate: "checked", exit: "unchecked" }) }, "indeterminate")), isChecked && !indeterminate && (jsx(motion.svg, { viewBox: "0 0 16 16", fill: "none", className: cn("pointer-events-none col-start-1 row-start-1 self-center justify-self-center text-[var(--color-primary-contrast)]", size === "sm" ? "size-3" : size === "lg" ? "size-5" : "size-4"), children: jsx(motion.path, { d: "M3.5 8.5 L6.5 11.5 L12.5 4.5", stroke: "currentColor", strokeWidth: 2.5, strokeLinecap: "round", strokeLinejoin: "round", variants: shouldReduceMotion ? reducedMotionVariants : checkmarkVariants, initial: "unchecked", animate: "checked", exit: "unchecked" }) }, "checkmark"))] })] }), (label || description) && (jsxs("label", { htmlFor: id, className: cn("cursor-pointer", isDisabled && "cursor-not-allowed"), children: [label && (typeof label === 'string' ? (jsx("span", { className: cn(formLabelTheme.baseStyle, formLabelTheme.stateStyles[visualState], "mb-0"), children: label })) : (label)), description && (typeof description === 'string' ? (jsx("div", { id: `${id}-description`, className: checkboxTheme.descriptionStyle, children: description })) : (description))] }))] }));
|
|
79
|
+
}, type: "checkbox", ...restProps, id: id, name: name, value: value, checked: isChecked, onChange: handleChange, disabled: isDisabled, "aria-describedby": description ? `${id}-description` : undefined, "aria-invalid": !isInGroup && isInvalid ? true : undefined, "data-state": isDisabled ? "disabled" : isInvalid ? "invalid" : "default", className: cn(checkboxTheme.inputStyle, checkboxTheme.sizes[size], indeterminate && "bg-neutral-200") }), jsx(AnimatePresence, { initial: false, children: isChecked && !shouldReduceMotion && (jsx(motion.div, { ...CHECK_RIPPLE_MOTION, className: "absolute inset-0 rounded-[var(--checkbox-radius)] bg-[var(--color-primary)]/40 pointer-events-none z-0" }, "ripple")) }), jsxs(AnimatePresence, { mode: "wait", children: [indeterminate && (jsx(motion.svg, { viewBox: "0 0 16 16", fill: "none", className: cn("pointer-events-none col-start-1 row-start-1 self-center justify-self-center text-neutral-600", size === "sm" ? "size-3" : size === "lg" ? "size-5" : "size-4"), children: jsx(motion.path, { d: "M3.5 8 L12.5 8", stroke: "currentColor", strokeWidth: 2.5, strokeLinecap: "round", variants: shouldReduceMotion ? reducedMotionVariants : indeterminateVariants, initial: "unchecked", animate: "checked", exit: "unchecked" }) }, "indeterminate")), isChecked && !indeterminate && (jsx(motion.svg, { viewBox: "0 0 16 16", fill: "none", className: cn("pointer-events-none col-start-1 row-start-1 self-center justify-self-center text-[var(--color-primary-contrast)]", size === "sm" ? "size-3" : size === "lg" ? "size-5" : "size-4"), children: jsx(motion.path, { d: "M3.5 8.5 L6.5 11.5 L12.5 4.5", stroke: "currentColor", strokeWidth: 2.5, strokeLinecap: "round", strokeLinejoin: "round", variants: shouldReduceMotion ? reducedMotionVariants : checkmarkVariants, initial: "unchecked", animate: "checked", exit: "unchecked" }) }, "checkmark"))] })] }), (label || description) && (jsxs("label", { htmlFor: id, className: cn("cursor-pointer", isDisabled && "cursor-not-allowed"), children: [label && (typeof label === 'string' ? (jsx("span", { className: cn(formLabelTheme.baseStyle, formLabelTheme.stateStyles[visualState], "mb-0"), children: label })) : (label)), description && (typeof description === 'string' ? (jsx("div", { id: `${id}-description`, className: checkboxTheme.descriptionStyle, children: description })) : (description))] }))] }));
|
|
79
80
|
});
|
|
80
81
|
CheckboxComponent.displayName = "Checkbox";
|
|
81
82
|
const Checkbox = Object.assign(CheckboxComponent, {
|
|
@@ -23,8 +23,8 @@ const checkboxTheme = {
|
|
|
23
23
|
"disabled:bg-[var(--color-background-disabled)] disabled:checked:outline-0 " +
|
|
24
24
|
"data-[state=disabled]:border-[var(--color-border)] data-[state=disabled]:bg-[var(--color-background-disabled)] data-[state=disabled]:cursor-not-allowed " +
|
|
25
25
|
// Disabled state - dark
|
|
26
|
-
"dark:disabled:bg-[var(--color-
|
|
27
|
-
"dark:data-[state=disabled]:bg-[var(--color-
|
|
26
|
+
"dark:disabled:bg-[var(--color-mono-800)] dark:disabled:border-[var(--color-mono-600)] " +
|
|
27
|
+
"dark:data-[state=disabled]:bg-[var(--color-mono-700)] dark:data-[state=disabled]:border-[var(--color-mono-600)]",
|
|
28
28
|
// Invalid is message-led: the control stays neutral (mirrors Radio). The group's
|
|
29
29
|
// required asterisk + error message carry the error (see CheckboxGroup). `data-state=invalid`
|
|
30
30
|
// is still emitted on the input as an unstyled consumer/test hook.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx } from 'react/jsx-runtime';
|
|
3
|
-
import {
|
|
3
|
+
import { Eyedropper } from '@phosphor-icons/react';
|
|
4
4
|
import { useContext, useMemo } from 'react';
|
|
5
5
|
import { cn } from '../../../utils/cn.js';
|
|
6
6
|
import { Button } from '../../core/Button/Button.js';
|
|
@@ -44,7 +44,7 @@ const ColorPickerEyeDropper = ({ className, ...props }) => {
|
|
|
44
44
|
if (!supportsEyeDropper) {
|
|
45
45
|
return null;
|
|
46
46
|
}
|
|
47
|
-
return (jsx(Button, { size: "sm", variant: "outline", color: "
|
|
47
|
+
return (jsx(Button, { size: "sm", variant: "outline", color: "mono", iconOnly: true, onClick: handleEyeDropper, disabled: disabled, "aria-label": "Pick color from screen", title: "Pick color from screen", className: cn(theme.eyedropperButtonStyle, className), children: jsx(Eyedropper, { className: "size-4" }) }));
|
|
48
48
|
};
|
|
49
49
|
ColorPickerEyeDropper.displayName = 'ColorPickerEyeDropper';
|
|
50
50
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
|
-
import {
|
|
3
|
+
import { Trash, Plus, ClipboardText } from '@phosphor-icons/react';
|
|
4
4
|
import { useContext, useState, useRef, useCallback, useEffect } from 'react';
|
|
5
5
|
import { cn } from '../../../utils/cn.js';
|
|
6
6
|
import { Button } from '../../core/Button/Button.js';
|
|
@@ -180,7 +180,7 @@ const ColorPickerGradient = ({ className, ...props }) => {
|
|
|
180
180
|
const remaining = gradient.stops.filter(s => s.id !== selectedStop.id);
|
|
181
181
|
if (remaining[0])
|
|
182
182
|
selectStop(remaining[0].id);
|
|
183
|
-
}, "aria-label": "Remove color stop", children: jsx(
|
|
183
|
+
}, "aria-label": "Remove color stop", children: jsx(Trash, { className: "size-4" }) })), jsx(Button, { variant: "ghost", size: "sm", color: "mono", iconOnly: true, onClick: () => addGradientStop(50), "aria-label": "Add color stop", children: jsx(Plus, { className: "size-4" }) })] })), jsxs("div", { className: "flex items-center gap-2 border border-[var(--color-border)] rounded-lg px-3 py-2", children: [jsx("code", { className: "flex-1 text-xs font-mono text-[var(--color-text-secondary)] truncate", children: outputCSS }), jsx(Button, { variant: "ghost", size: "sm", color: "mono", iconOnly: true, onClick: handleCopy, "aria-label": "Copy gradient CSS", title: copied ? 'Copied!' : 'Copy CSS', children: copied ? (jsx(ClipboardText, { className: "size-4 text-[var(--color-success)]" })) : (jsx(ClipboardText, { className: "size-4" })) })] })] }));
|
|
184
184
|
};
|
|
185
185
|
ColorPickerGradient.displayName = 'ColorPickerGradient';
|
|
186
186
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
|
-
import {
|
|
3
|
+
import { X } from '@phosphor-icons/react';
|
|
4
4
|
import { useContext } from 'react';
|
|
5
5
|
import { cn } from '../../../utils/cn.js';
|
|
6
6
|
import { ColorPickerContext } from './ColorPickerContext.js';
|
|
@@ -25,7 +25,7 @@ const ColorPickerHeader = ({ modes = ['solid'], activeMode: activeModeFromProp,
|
|
|
25
25
|
};
|
|
26
26
|
return (jsxs("div", { className: cn('flex items-center justify-between border-b border-[var(--color-border)] -mx-4 -mt-4 px-4', className), ...props, children: [jsx("div", { className: "flex items-center gap-4", children: modes.map((mode) => (jsxs("button", { type: "button", onClick: () => handleModeChange(mode), className: cn('py-3 text-sm font-medium transition-colors relative cursor-pointer', activeMode === mode
|
|
27
27
|
? 'text-[var(--color-primary)]'
|
|
28
|
-
: 'text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)]'), "aria-selected": activeMode === mode, role: "tab", children: [modeLabels[mode], activeMode === mode && (jsx("div", { className: "absolute bottom-0 left-0 right-0 h-0.5 bg-[var(--color-primary)] rounded-full" }))] }, mode))) }), showClose && (jsx("button", { type: "button", onClick: () => setIsOpen(false), className: "p-1 text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)] transition-colors rounded-md hover:bg-[var(--color-background-secondary)] cursor-pointer", "aria-label": "Close color picker", children: jsx(
|
|
28
|
+
: 'text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)]'), "aria-selected": activeMode === mode, role: "tab", children: [modeLabels[mode], activeMode === mode && (jsx("div", { className: "absolute bottom-0 left-0 right-0 h-0.5 bg-[var(--color-primary)] rounded-full" }))] }, mode))) }), showClose && (jsx("button", { type: "button", onClick: () => setIsOpen(false), className: "p-1 text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)] transition-colors rounded-md hover:bg-[var(--color-background-secondary)] cursor-pointer", "aria-label": "Close color picker", children: jsx(X, { className: "size-5" }) }))] }));
|
|
29
29
|
};
|
|
30
30
|
ColorPickerHeader.displayName = 'ColorPickerHeader';
|
|
31
31
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
|
-
import {
|
|
3
|
+
import { UploadSimple, X } from '@phosphor-icons/react';
|
|
4
4
|
import { useContext, useRef, useState, useEffect, useCallback } from 'react';
|
|
5
5
|
import { cn } from '../../../utils/cn.js';
|
|
6
6
|
import { Button } from '../../core/Button/Button.js';
|
|
@@ -141,14 +141,14 @@ const ColorPickerImage = ({ className, ...props }) => {
|
|
|
141
141
|
/* Upload dropzone */
|
|
142
142
|
jsxs("div", { onDragOver: handleDragOver, onDragLeave: handleDragLeave, onDrop: handleDrop, onClick: () => { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, className: cn('flex flex-col items-center justify-center gap-2 h-[200px] rounded-xl border-2 border-dashed cursor-pointer transition-colors', isDragOver
|
|
143
143
|
? 'border-[var(--color-primary)] bg-[var(--color-primary-50)]'
|
|
144
|
-
: 'border-[var(--color-border)] hover:border-[var(--color-primary)] hover:bg-[var(--color-background-secondary)]'), children: [jsx(
|
|
144
|
+
: 'border-[var(--color-border)] hover:border-[var(--color-primary)] hover:bg-[var(--color-background-secondary)]'), children: [jsx(UploadSimple, { className: "size-8 text-[var(--color-text-muted)]" }), jsx("div", { className: "text-sm text-[var(--color-text-muted)]", children: "Click or drag an image" }), jsx("div", { className: "text-xs text-[var(--color-text-placeholder)]", children: "PNG, JPG, SVG, WebP" }), jsx("input", { ref: fileInputRef, type: "file", accept: "image/*", onChange: handleFileChange, className: "hidden", "aria-label": "Upload image" })] })) : (
|
|
145
145
|
/* Canvas with color picking */
|
|
146
146
|
jsxs("div", { className: "space-y-2", children: [jsxs("div", { className: "relative inline-block rounded-xl overflow-hidden ring-1 ring-inset ring-black/5", children: [jsx("canvas", { ref: canvasRef, onClick: handleCanvasClick, className: "cursor-crosshair block" }), cursorPos && (jsx("div", { className: "absolute w-5 h-5 border-2 border-white rounded-full pointer-events-none", style: {
|
|
147
147
|
left: `${cursorPos.x}%`,
|
|
148
148
|
top: `${cursorPos.y}%`,
|
|
149
149
|
transform: 'translate(-50%, -50%)',
|
|
150
150
|
boxShadow: '0 0 0 1.5px rgba(0,0,0,0.15), 0 2px 6px rgba(0,0,0,0.15)',
|
|
151
|
-
}, children: pickedColor && (jsx("div", { className: "absolute inset-1 rounded-full", style: { backgroundColor: pickedColor } })) }))] }), jsxs("div", { className: "flex items-center justify-between", children: [pickedColor && (jsxs("div", { className: "flex items-center gap-2", children: [jsx("div", { className: "size-5 rounded-full border border-[var(--color-border)]", style: { backgroundColor: pickedColor } }), jsx("span", { className: "text-xs font-mono text-[var(--color-text-secondary)]", children: pickedColor })] })), jsxs(Button, { variant: "ghost", size: "sm", color: "
|
|
151
|
+
}, children: pickedColor && (jsx("div", { className: "absolute inset-1 rounded-full", style: { backgroundColor: pickedColor } })) }))] }), jsxs("div", { className: "flex items-center justify-between", children: [pickedColor && (jsxs("div", { className: "flex items-center gap-2", children: [jsx("div", { className: "size-5 rounded-full border border-[var(--color-border)]", style: { backgroundColor: pickedColor } }), jsx("span", { className: "text-xs font-mono text-[var(--color-text-secondary)]", children: pickedColor })] })), jsxs(Button, { variant: "ghost", size: "sm", color: "mono", onClick: handleClear, "aria-label": "Remove image", className: "ml-auto", children: [jsx(X, { className: "size-3.5" }), "Change"] })] })] })), !imageLoaded && jsx("canvas", { ref: canvasRef, className: "hidden" })] }));
|
|
152
152
|
};
|
|
153
153
|
ColorPickerImage.displayName = 'ColorPickerImage';
|
|
154
154
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
3
|
import { useContext, useState, useEffect } from 'react';
|
|
4
|
-
import {
|
|
4
|
+
import { CaretUpDown, ClipboardText } from '@phosphor-icons/react';
|
|
5
5
|
import { cn } from '../../../utils/cn.js';
|
|
6
6
|
import { Button } from '../../core/Button/Button.js';
|
|
7
7
|
import { ColorPickerContext } from './ColorPickerContext.js';
|
|
@@ -83,7 +83,7 @@ const ColorPickerInput = ({ className, ...props }) => {
|
|
|
83
83
|
};
|
|
84
84
|
// Get the current color as rgba for the swatch
|
|
85
85
|
const swatchColor = `hsla(${color.h}, ${color.s}%, ${color.l}%, ${color.a})`;
|
|
86
|
-
return (jsxs("div", { className: cn("flex items-stretch border border-[var(--color-border)] rounded-lg overflow-hidden divide-x divide-[var(--color-border)]", className), ...props, children: [jsxs(Button, { variant: "ghost", size: "sm", color: "
|
|
86
|
+
return (jsxs("div", { className: cn("flex items-stretch border border-[var(--color-border)] rounded-lg overflow-hidden divide-x divide-[var(--color-border)]", className), ...props, children: [jsxs(Button, { variant: "ghost", size: "sm", color: "mono", onClick: cycleFormat, "aria-label": "Change color format", className: "!rounded-none !border-0 !px-3 !py-2 flex-shrink-0", children: [formatLabel, jsx(CaretUpDown, { className: "size-4 text-[var(--color-text-muted)]" })] }), jsxs("div", { className: "flex items-center gap-2 px-3 py-2 flex-1 min-w-0", children: [jsx("div", { className: "size-5 rounded-full flex-shrink-0 border border-[var(--color-border)]", style: { backgroundColor: swatchColor } }), jsx("input", { type: "text", value: format === 'hex' ? inputValue : getDisplayValue(), onChange: handleChange, onBlur: handleBlur, onKeyDown: handleKeyDown, readOnly: format !== 'hex', className: cn("flex-1 min-w-0 bg-transparent text-sm font-mono text-[var(--color-text-primary)] outline-none", isInvalid && "text-[var(--color-danger)]"), "aria-label": "Color value" }), jsx(Button, { variant: "ghost", size: "sm", color: "mono", iconOnly: true, onClick: handleCopy, "aria-label": "Copy color value", title: copied ? "Copied!" : "Copy color value", className: "!p-0 !size-auto flex-shrink-0", children: copied ? (jsx(ClipboardText, { className: "size-4 text-[var(--color-success)]" })) : (jsx(ClipboardText, { className: "size-4" })) })] }), showAlpha && (jsxs("div", { className: "flex items-center px-3 py-2 flex-shrink-0", children: [jsx("input", { type: "number", min: 0, max: 100, value: alphaPercent, onChange: handleAlphaChange, className: "w-10 bg-transparent text-sm text-[var(--color-text-primary)] text-center outline-none font-mono", "aria-label": "Opacity percentage" }), jsx("span", { className: "text-sm text-[var(--color-text-muted)]", children: "%" })] }))] }));
|
|
87
87
|
};
|
|
88
88
|
ColorPickerInput.displayName = "ColorPickerInput";
|
|
89
89
|
|