@flikk/ui 1.0.0-beta.25 → 1.0.0-beta.27
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/dist/components/ai/CodeBlock/CodeBlock.theme.js +2 -2
- package/dist/components/ai/PromptInput/PromptInput.js +4 -0
- package/dist/components/ai/PromptInput/VoiceRecorder.js +4 -0
- package/dist/components/ai/StreamingResponse/MarkdownRenderer.js +1 -1
- package/dist/components/ai/TokenCounter/TokenCounter.theme.js +1 -1
- package/dist/components/charts/BarChart/BarChart.js +2 -2
- package/dist/components/charts/StackedBarChart/StackedBarChart.js +1 -1
- package/dist/components/charts/shared/BarRenderer/BarRenderer.js +2 -2
- package/dist/components/core/Breadcrumbs/Breadcrumbs.theme.js +1 -1
- package/dist/components/core/Button/Button.js +1 -1
- package/dist/components/core/Button/Button.theme.js +5 -5
- package/dist/components/core/Calendar/Calendar.theme.js +1 -1
- package/dist/components/core/Calendar/CalendarMini/CalendarMini.theme.js +1 -1
- package/dist/components/core/CommandPalette/CommandItem.js +4 -5
- package/dist/components/core/CommandPalette/CommandPalette.js +1 -1
- package/dist/components/core/CommandPalette/CommandPalette.theme.js +11 -13
- package/dist/components/core/CommandPalette/CommandPalette.types.d.ts +0 -2
- package/dist/components/core/ContextMenu/ContextMenu.theme.js +13 -14
- package/dist/components/core/DotSeparator/DotSeparator.d.ts +3 -0
- package/dist/components/core/DotSeparator/DotSeparator.js +19 -0
- package/dist/components/core/DotSeparator/DotSeparator.theme.d.ts +2 -0
- package/dist/components/core/DotSeparator/DotSeparator.theme.js +10 -0
- package/dist/components/core/DotSeparator/DotSeparator.types.d.ts +25 -0
- package/dist/components/core/DotSeparator/index.d.ts +3 -0
- package/dist/components/core/Drawer/Drawer.theme.js +2 -2
- package/dist/components/core/Dropdown/Dropdown.theme.js +4 -5
- package/dist/components/core/Dropdown/DropdownItem.js +1 -1
- package/dist/components/core/Dropdown/DropdownMenu.js +1 -1
- package/dist/components/core/Empty/Empty.js +1 -1
- package/dist/components/core/ImagePlaceholder/ImagePlaceholder.d.ts +14 -0
- package/dist/components/core/ImagePlaceholder/ImagePlaceholder.js +28 -0
- package/dist/components/core/ImagePlaceholder/ImagePlaceholder.theme.d.ts +6 -0
- package/dist/components/core/ImagePlaceholder/ImagePlaceholder.theme.js +8 -0
- package/dist/components/core/ImagePlaceholder/ImagePlaceholder.types.d.ts +32 -0
- package/dist/components/core/ImagePlaceholder/index.d.ts +2 -0
- package/dist/components/core/MenuItem/MenuItem.js +5 -2
- package/dist/components/core/MenuItem/MenuItem.theme.d.ts +6 -0
- package/dist/components/core/MenuItem/MenuItem.theme.js +19 -16
- package/dist/components/core/MenuItem/MenuItem.types.d.ts +2 -0
- package/dist/components/core/Message/Message.theme.js +1 -1
- package/dist/components/core/Modal/Modal.theme.js +1 -1
- package/dist/components/core/NavItem/NavItem.d.ts +1 -1
- package/dist/components/core/NavItem/NavItem.js +187 -68
- package/dist/components/core/NavItem/NavItem.theme.js +31 -12
- package/dist/components/core/NavItem/NavItem.types.d.ts +17 -39
- package/dist/components/core/Pagination/Pagination.theme.js +3 -3
- package/dist/components/core/Popover/Popover.theme.js +1 -1
- package/dist/components/core/Popover/Popover.types.d.ts +6 -2
- package/dist/components/core/Popover/PopoverBody.js +10 -3
- package/dist/components/core/Progress/Progress.theme.js +1 -1
- package/dist/components/core/ScrollArea/ScrollArea.js +2 -2
- package/dist/components/core/ScrollArea/ScrollArea.theme.js +1 -1
- package/dist/components/core/Segmented/Segmented.js +8 -6
- package/dist/components/core/Segmented/Segmented.theme.js +3 -3
- package/dist/components/core/Sidebar/Sidebar.d.ts +3 -1
- package/dist/components/core/Sidebar/Sidebar.js +53 -16
- package/dist/components/core/Sidebar/Sidebar.theme.js +5 -7
- package/dist/components/core/Sidebar/Sidebar.types.d.ts +125 -8
- package/dist/components/core/Sidebar/SidebarCard.d.ts +25 -0
- package/dist/components/core/Sidebar/SidebarCard.js +68 -0
- package/dist/components/core/Sidebar/SidebarCard.theme.d.ts +8 -0
- package/dist/components/core/Sidebar/SidebarCard.theme.js +18 -0
- package/dist/components/core/Sidebar/SidebarContent.js +10 -6
- package/dist/components/core/Sidebar/SidebarContext.d.ts +17 -16
- package/dist/components/core/Sidebar/SidebarContext.js +43 -20
- package/dist/components/core/Sidebar/SidebarFooter.js +4 -6
- package/dist/components/core/Sidebar/SidebarHeader.js +12 -9
- package/dist/components/core/Sidebar/SidebarLogo.js +39 -8
- package/dist/components/core/Sidebar/SidebarNav.js +4 -3
- package/dist/components/core/Sidebar/SidebarNavGroup.js +4 -7
- package/dist/components/core/Sidebar/SidebarSearch.d.ts +22 -0
- package/dist/components/core/Sidebar/SidebarSearch.js +135 -0
- package/dist/components/core/Sidebar/SidebarToggle.js +6 -1
- package/dist/components/core/Sidebar/SidebarUserProfile.js +33 -17
- package/dist/components/core/Sidebar/index.d.ts +4 -3
- package/dist/components/core/Skeleton/Skeleton.theme.js +1 -1
- package/dist/components/core/Spinner/Spinner.theme.js +1 -1
- package/dist/components/core/Tabs/Tabs.js +6 -1
- package/dist/components/core/Tabs/Tabs.types.d.ts +2 -0
- package/dist/components/core/Tabs/TabsBody.js +5 -3
- package/dist/components/core/Tag/Tag.js +29 -5
- package/dist/components/core/Tag/Tag.theme.js +14 -9
- package/dist/components/core/Tag/Tag.types.d.ts +7 -0
- package/dist/components/core/Tooltip/Tooltip.js +1 -1
- package/dist/components/core/Tooltip/Tooltip.theme.js +1 -2
- package/dist/components/core/index.d.ts +2 -0
- package/dist/components/core/index.js +6 -2
- package/dist/components/data-display/GanttChart/GanttChart.d.ts +1 -1
- package/dist/components/data-display/GanttChart/GanttChart.js +31 -4
- package/dist/components/data-display/GanttChart/GanttChart.theme.js +19 -17
- package/dist/components/data-display/GanttChart/GanttChart.types.d.ts +19 -0
- package/dist/components/data-display/GanttChart/GanttChart.utils.js +1 -1
- package/dist/components/data-display/GanttChart/GanttChartPanel.d.ts +1 -1
- package/dist/components/data-display/GanttChart/GanttChartPanel.js +3 -3
- package/dist/components/data-display/GanttChart/GanttDependencyArrows.js +7 -4
- package/dist/components/data-display/GanttChart/GanttMilestone.js +5 -5
- package/dist/components/data-display/GanttChart/GanttTableGroupRow.js +1 -1
- package/dist/components/data-display/GanttChart/GanttTablePanel.js +1 -1
- package/dist/components/data-display/GanttChart/GanttTableTaskRow.js +2 -2
- package/dist/components/data-display/GanttChart/GanttTaskBar.js +37 -16
- package/dist/components/data-display/GanttChart/GanttTimelineGrid.js +2 -1
- package/dist/components/data-display/GanttChart/GanttTimelineHeader.js +35 -11
- package/dist/components/data-display/GanttChart/GanttToolbar.js +2 -2
- package/dist/components/data-display/GanttChart/hooks/useGanttDrag.js +3 -2
- package/dist/components/data-display/GanttChart/index.d.ts +1 -1
- package/dist/components/data-display/KPI/KPI.js +13 -3
- package/dist/components/data-display/KPI/KPI.theme.js +3 -3
- package/dist/components/data-display/Metric/Metric.theme.js +3 -3
- package/dist/components/data-display/Table/Table.js +4 -3
- package/dist/components/data-display/Table/Table.theme.js +14 -6
- package/dist/components/data-display/Table/Table.types.d.ts +15 -0
- package/dist/components/data-display/Table/TableColumnManager.js +1 -1
- package/dist/components/data-display/Table/index.d.ts +2 -2
- package/dist/components/effects/Aurora/Aurora.d.ts +6 -17
- package/dist/components/effects/Aurora/Aurora.js +310 -105
- package/dist/components/effects/Aurora/Aurora.types.d.ts +6 -0
- package/dist/components/effects/InteractiveCharacters/InteractiveCharacters.js +3 -3
- package/dist/components/effects/InteractiveCharacters/characters/BlobCharacter.js +13 -4
- package/dist/components/effects/InteractiveCharacters/characters/SmallCharacter.js +13 -4
- package/dist/components/effects/InteractiveCharacters/characters/TallCharacter.js +14 -4
- package/dist/components/effects/MorphingText/MorphingText.js +40 -7
- package/dist/components/effects/StripePattern/StripePattern.d.ts +18 -0
- package/dist/components/effects/StripePattern/StripePattern.js +54 -0
- package/dist/components/effects/StripePattern/StripePattern.types.d.ts +53 -0
- package/dist/components/effects/StripePattern/index.d.ts +2 -0
- package/dist/components/effects/index.d.ts +2 -0
- package/dist/components/effects/index.js +1 -0
- package/dist/components/forms/Checkbox/Checkbox.theme.js +1 -1
- package/dist/components/forms/Combobox/Combobox.js +1 -1
- package/dist/components/forms/Combobox/Combobox.theme.js +2 -4
- package/dist/components/forms/CronInput/CronInput.js +1 -1
- package/dist/components/forms/CronInput/CronInput.theme.js +22 -31
- package/dist/components/forms/DatePicker/DatePicker.theme.js +11 -18
- package/dist/components/forms/DatePicker/DatePickerTrigger.js +1 -1
- package/dist/components/forms/DateRangePicker/DateRangePicker.theme.js +7 -14
- package/dist/components/forms/DateRangePicker/DateRangePickerTrigger.js +1 -1
- package/dist/components/forms/FileUpload/FileUpload.animations.d.ts +29 -0
- package/dist/components/forms/FileUpload/FileUpload.animations.js +19 -0
- package/dist/components/forms/FileUpload/FileUpload.js +88 -49
- package/dist/components/forms/FileUpload/FileUpload.theme.d.ts +2 -10
- package/dist/components/forms/FileUpload/FileUpload.theme.js +16 -30
- package/dist/components/forms/FileUpload/FileUpload.types.d.ts +26 -10
- package/dist/components/forms/FileUpload/FileUploadProgress.js +27 -20
- package/dist/components/forms/FileUpload/FileUploadProgress.theme.js +2 -2
- package/dist/components/forms/Input/Input.theme.js +16 -15
- package/dist/components/forms/InputCounter/InputCounter.theme.js +1 -1
- package/dist/components/forms/Mention/Mention.js +152 -57
- package/dist/components/forms/Mention/Mention.theme.js +16 -23
- package/dist/components/forms/Mention/Mention.types.d.ts +12 -12
- package/dist/components/forms/Mention/Mention.utils.js +32 -4
- package/dist/components/forms/Radio/Radio.theme.js +1 -1
- package/dist/components/forms/RichTextEditor/RichTextEditor.d.ts +18 -0
- package/dist/components/forms/RichTextEditor/RichTextEditor.js +1231 -236
- package/dist/components/forms/RichTextEditor/RichTextEditor.theme.d.ts +53 -1
- package/dist/components/forms/RichTextEditor/RichTextEditor.theme.js +99 -25
- package/dist/components/forms/RichTextEditor/RichTextEditor.types.d.ts +42 -3
- package/dist/components/forms/RichTextEditor/index.d.ts +2 -2
- package/dist/components/forms/Select/Select.js +2 -2
- package/dist/components/forms/Select/Select.theme.js +3 -3
- package/dist/components/forms/Slider/Slider.theme.js +1 -1
- package/dist/components/forms/Switch/Switch.theme.js +1 -1
- package/dist/components/forms/TimePicker/TimePicker.theme.js +2 -2
- package/dist/components/forms/TimePicker/TimePickerContent.js +4 -0
- package/dist/components/forms/TimePicker/TimePickerTrigger.js +1 -1
- package/dist/components/forms/forms.theme.js +24 -19
- package/dist/components/forms/index.js +4 -0
- package/dist/components/layout/AppShell/AppShell.d.ts +10 -0
- package/dist/components/layout/AppShell/AppShell.js +84 -0
- package/dist/components/layout/AppShell/AppShell.theme.d.ts +3 -0
- package/dist/components/layout/AppShell/AppShell.theme.js +42 -0
- package/dist/components/layout/AppShell/AppShell.types.d.ts +127 -0
- package/dist/components/layout/AppShell/AppShellContext.d.ts +14 -0
- package/dist/components/layout/AppShell/AppShellContext.js +19 -0
- package/dist/components/layout/AppShell/AppShellFooter.d.ts +3 -0
- package/dist/components/layout/AppShell/AppShellFooter.js +12 -0
- package/dist/components/layout/AppShell/AppShellHeader.d.ts +3 -0
- package/dist/components/layout/AppShell/AppShellHeader.js +12 -0
- package/dist/components/layout/AppShell/AppShellMain.d.ts +3 -0
- package/dist/components/layout/AppShell/AppShellMain.js +19 -0
- package/dist/components/layout/AppShell/AppShellRightPanel.d.ts +3 -0
- package/dist/components/layout/AppShell/AppShellRightPanel.js +16 -0
- package/dist/components/layout/AppShell/AppShellSidebar.d.ts +3 -0
- package/dist/components/layout/AppShell/AppShellSidebar.js +16 -0
- package/dist/components/layout/AppShell/AppShellTopbar.d.ts +3 -0
- package/dist/components/layout/AppShell/AppShellTopbar.js +12 -0
- package/dist/components/layout/AppShell/index.d.ts +3 -0
- package/dist/components/layout/FormLayout/FormLayout.js +9 -4
- package/dist/components/layout/FormLayout/FormLayout.types.d.ts +3 -3
- package/dist/components/layout/FormLayout/FormLayoutSection.js +6 -1
- package/dist/components/layout/PageLayout/PageLayout.d.ts +2 -2
- package/dist/components/layout/PageLayout/PageLayout.js +23 -5
- package/dist/components/layout/PageLayout/PageLayout.theme.d.ts +2 -1
- package/dist/components/layout/PageLayout/PageLayout.theme.js +35 -6
- package/dist/components/layout/PageLayout/PageLayout.types.d.ts +45 -0
- package/dist/components/layout/PageLayout/PageLayoutContent.js +6 -4
- package/dist/components/layout/PageLayout/PageLayoutHeader.js +3 -3
- package/dist/components/layout/PageLayout/PageLayoutSidebar.js +5 -3
- package/dist/components/layout/PageLayout/index.d.ts +1 -1
- package/dist/components/layout/index.d.ts +1 -0
- package/dist/components/layout/index.js +2 -0
- package/dist/hooks/useSelectPortal.d.ts +10 -2
- package/dist/hooks/useSelectPortal.js +45 -24
- package/dist/index.js +8 -2
- package/dist/registry.json +10021 -0
- package/dist/styles.css +1 -1
- package/dist/utils/dateUtils.js +11 -1
- package/package.json +4 -2
- package/src/global.scss +29 -8
- package/src/styles/theme.css +174 -100
- package/dist/components/core/Sidebar/SidebarSubmenu.d.ts +0 -7
- package/dist/components/core/Sidebar/SidebarSubmenu.js +0 -12
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const codeBlockTheme = {
|
|
2
|
-
baseStyle: "relative rounded-[var(--codeblock-radius)] border border-[var(--color-border)] overflow-hidden bg-[var(--color-
|
|
2
|
+
baseStyle: "relative rounded-[var(--codeblock-radius)] border border-[var(--color-border)] overflow-hidden bg-[var(--color-surface-sunken)]",
|
|
3
3
|
header: "flex items-center justify-between px-3 py-1.5 bg-[var(--color-background-secondary)] border-b border-[var(--color-border)]",
|
|
4
4
|
headerLeft: "flex items-center gap-2 min-w-0 flex-1 ",
|
|
5
5
|
headerRight: "flex items-center gap-2 flex-shrink-0",
|
|
@@ -10,7 +10,7 @@ const codeBlockTheme = {
|
|
|
10
10
|
highlightedLine: " -mx-4 px-4 bg-[var(--color-primary-50)] border-l-2 border-l-[var(--color-primary)] dark:bg-[var(--color-neutral-400)]/5 dark:border-l-[var(--color-neutral-200)]",
|
|
11
11
|
diffAddition: "-mx-4 px-4 bg-[var(--color-success-50)] border-l-4 border-l-[var(--color-success)] dark:bg-[var(--color-success-600)]/20 dark:border-l-[var(--color-success-700)]",
|
|
12
12
|
diffDeletion: "-mx-4 px-4 bg-[var(--color-danger-50)] border-l-4 border-l-[var(--color-danger)] dark:bg-[var(--color-danger-600)]/20 dark:border-l-[var(--color-danger-700)]",
|
|
13
|
-
copyButton: "p-1.5 rounded-[calc(var(--radius-base)*0.75)] text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)] hover:bg-[var(--color-
|
|
13
|
+
copyButton: "p-1.5 rounded-[calc(var(--radius-base)*0.75)] text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)] hover:bg-[var(--color-surface-hover)] transition-colors cursor-pointer focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary)]",
|
|
14
14
|
copySuccess: "text-[var(--color-success)]",
|
|
15
15
|
};
|
|
16
16
|
|
|
@@ -50,6 +50,7 @@ import '../../core/Dropdown/DropdownItem.js';
|
|
|
50
50
|
import '../../core/Dropdown/DropdownSection.js';
|
|
51
51
|
import '../../core/Dropdown/DropdownSeparator.js';
|
|
52
52
|
import '../../core/Dropdown/Dropdown.theme.js';
|
|
53
|
+
import '../../core/DotSeparator/DotSeparator.js';
|
|
53
54
|
import '../../core/Kbd/Kbd.js';
|
|
54
55
|
import '../../core/MenuItem/MenuItem.js';
|
|
55
56
|
import '../../core/Link/Link.js';
|
|
@@ -100,12 +101,15 @@ import '../../core/Sidebar/SidebarToggle.js';
|
|
|
100
101
|
import '../../core/Sidebar/SidebarMobileTrigger.js';
|
|
101
102
|
import '../../core/Sidebar/SidebarUserProfile.js';
|
|
102
103
|
import '../../core/Sidebar/SidebarLogo.js';
|
|
104
|
+
import '../../core/Sidebar/SidebarSearch.js';
|
|
105
|
+
import '../../core/Sidebar/SidebarCard.js';
|
|
103
106
|
import '../../core/Sidebar/SidebarContext.js';
|
|
104
107
|
import '../../core/OfflineIndicator/OfflineIndicator.js';
|
|
105
108
|
import '../../core/ContextMenu/ContextMenu.js';
|
|
106
109
|
import '../../core/ContextMenu/ContextMenu.theme.js';
|
|
107
110
|
import '../../core/Pill/Pill.js';
|
|
108
111
|
import '../../core/Icon/Icon.js';
|
|
112
|
+
import '../../core/ImagePlaceholder/ImagePlaceholder.js';
|
|
109
113
|
import '../../forms/TimePicker/WheelColumn.js';
|
|
110
114
|
import '../../forms/TimePicker/TimePicker.theme.js';
|
|
111
115
|
import '../../forms/Slider/Slider.js';
|
|
@@ -32,6 +32,7 @@ import '../../core/Dropdown/DropdownItem.js';
|
|
|
32
32
|
import '../../core/Dropdown/DropdownSection.js';
|
|
33
33
|
import '../../core/Dropdown/DropdownSeparator.js';
|
|
34
34
|
import '../../core/Dropdown/Dropdown.theme.js';
|
|
35
|
+
import '../../core/DotSeparator/DotSeparator.js';
|
|
35
36
|
import '../../core/Kbd/Kbd.js';
|
|
36
37
|
import '../../core/MenuItem/MenuItem.js';
|
|
37
38
|
import '../../core/Link/Link.js';
|
|
@@ -82,12 +83,15 @@ import '../../core/Sidebar/SidebarToggle.js';
|
|
|
82
83
|
import '../../core/Sidebar/SidebarMobileTrigger.js';
|
|
83
84
|
import '../../core/Sidebar/SidebarUserProfile.js';
|
|
84
85
|
import '../../core/Sidebar/SidebarLogo.js';
|
|
86
|
+
import '../../core/Sidebar/SidebarSearch.js';
|
|
87
|
+
import '../../core/Sidebar/SidebarCard.js';
|
|
85
88
|
import '../../core/Sidebar/SidebarContext.js';
|
|
86
89
|
import '../../core/OfflineIndicator/OfflineIndicator.js';
|
|
87
90
|
import '../../core/ContextMenu/ContextMenu.js';
|
|
88
91
|
import '../../core/ContextMenu/ContextMenu.theme.js';
|
|
89
92
|
import '../../core/Pill/Pill.js';
|
|
90
93
|
import '../../core/Icon/Icon.js';
|
|
94
|
+
import '../../core/ImagePlaceholder/ImagePlaceholder.js';
|
|
91
95
|
|
|
92
96
|
/**
|
|
93
97
|
* Format seconds into MM:SS display
|
|
@@ -73,7 +73,7 @@ const MarkdownRenderer = ({ content, options = {}, isStreaming = false, animated
|
|
|
73
73
|
return (jsxs(AnimatedBlock, { animate: shouldAnimate, children: [jsx(SkipWords, { children: children }), jsx(Prism, { style: syntaxTheme === 'dark' ? oneDark : oneLight, language: language, PreTag: "div", className: "rounded-lg my-3", ...props, children: String(children).replace(/\n$/, '') })] }));
|
|
74
74
|
}
|
|
75
75
|
// Inline code — skip word animation for code tokens
|
|
76
|
-
return (jsxs(Fragment, { children: [jsx(SkipWords, { children: children }), jsx("code", { className: "bg-(--color-
|
|
76
|
+
return (jsxs(Fragment, { children: [jsx(SkipWords, { children: children }), jsx("code", { className: "bg-(--color-surface-sunken) text-(--color-primary) px-1.5 py-0.5 rounded text-base font-mono", ...props, children: children })] }));
|
|
77
77
|
},
|
|
78
78
|
// Paragraphs — word-level animation
|
|
79
79
|
p({ children }) {
|
|
@@ -4,7 +4,7 @@ const tokenCounterTheme = {
|
|
|
4
4
|
countStyle: "font-medium text-[var(--color-text-primary)]",
|
|
5
5
|
labelStyle: "text-[var(--color-text-muted)]",
|
|
6
6
|
costStyle: "text-[var(--color-text-muted)] font-mono",
|
|
7
|
-
progressStyle: "h-1 bg-[var(--color-
|
|
7
|
+
progressStyle: "h-1 bg-[var(--color-surface-sunken)] rounded-full overflow-hidden",
|
|
8
8
|
progressBarStyle: "h-full bg-[var(--color-primary)] transition-all duration-200",
|
|
9
9
|
sizes: {
|
|
10
10
|
sm: {
|
|
@@ -353,9 +353,9 @@ className, title, description, enableKeyboardNavigation = BAR_CHART_DEFAULTS.ena
|
|
|
353
353
|
originY: isNegative ? 0 : 1,
|
|
354
354
|
transformOrigin: isNegative ? "top" : "bottom",
|
|
355
355
|
fill: isNull
|
|
356
|
-
? "var(--color-
|
|
356
|
+
? "var(--color-surface-sunken)"
|
|
357
357
|
: shouldReduceOpacity
|
|
358
|
-
? "var(--color-
|
|
358
|
+
? "var(--color-surface-sunken)"
|
|
359
359
|
: fillColor,
|
|
360
360
|
opacity: !isNull && shouldReduceOpacity ? 0.9 : 1,
|
|
361
361
|
stroke: isFocused ? "var(--color-primary)" : "none",
|
|
@@ -234,7 +234,7 @@ className, title, description, enableKeyboardNavigation = STACKED_BAR_CHART_DEFA
|
|
|
234
234
|
originY: 1,
|
|
235
235
|
transformOrigin: "bottom",
|
|
236
236
|
fill: shouldReduceOpacity
|
|
237
|
-
? "var(--color-
|
|
237
|
+
? "var(--color-surface-sunken)"
|
|
238
238
|
: fillColor,
|
|
239
239
|
opacity: shouldReduceOpacity ? 0.9 : 1,
|
|
240
240
|
stroke: isFocused ? "var(--color-primary)" : "none",
|
|
@@ -148,9 +148,9 @@ const BarRenderer = ({ data, config, scales, dimensions, margin, stacked = false
|
|
|
148
148
|
originY: isNegative ? 0 : 1,
|
|
149
149
|
transformOrigin: isNegative ? "top" : "bottom",
|
|
150
150
|
fill: isNull
|
|
151
|
-
? "var(--color-
|
|
151
|
+
? "var(--color-surface-sunken)"
|
|
152
152
|
: shouldReduceOpacity
|
|
153
|
-
? "var(--color-
|
|
153
|
+
? "var(--color-surface-sunken)"
|
|
154
154
|
: fillColor,
|
|
155
155
|
opacity: !isNull && shouldReduceOpacity ? 0.9 : 1,
|
|
156
156
|
stroke: isFocused ? "var(--color-primary)" : "none",
|
|
@@ -10,7 +10,7 @@ const breadcrumbsTheme = {
|
|
|
10
10
|
link: "text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)] transition-colors duration-150 font-medium",
|
|
11
11
|
current: "text-[var(--color-text-primary)] font-medium",
|
|
12
12
|
separator: "text-[var(--color-text-muted)] select-none",
|
|
13
|
-
ellipsis: "text-sm text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)] transition-colors duration-150 cursor-pointer p-1 rounded hover:bg-[var(--color-
|
|
13
|
+
ellipsis: "text-sm text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)] transition-colors duration-150 cursor-pointer p-1 rounded hover:bg-[var(--color-surface-hover)]",
|
|
14
14
|
};
|
|
15
15
|
/**
|
|
16
16
|
* Variant styles for different breadcrumb appearances
|
|
@@ -107,7 +107,7 @@ const Button = React__default.forwardRef(({ children, className = "", iconOnly =
|
|
|
107
107
|
return (jsxs(motion.button, { type: "button", ...restProps, ...animationProps, ref: mergedRef, className: cn(buttonTheme.baseStyle, colorClasses, variantClasses, sizeClasses, blockStyle, stateClasses, darkMode && "dark", className), disabled: isDisabled, "data-state": state, "data-color": resolvedColor, "data-variant": resolvedVariant, "data-size": size, "data-icon-only": iconOnly ? "true" : "false", "data-block": block ? "true" : "false", "aria-disabled": isDisabled || undefined, "aria-invalid": isError || undefined, "aria-label": ariaLabel, onClick: handleClick, children: [showReflection &&
|
|
108
108
|
resolvedVariant !== "link" &&
|
|
109
109
|
resolvedVariant !== "ghost" &&
|
|
110
|
-
resolvedVariant !== "outline" && (jsx("div", { className: "absolute top-0.25 right-0.25 left-0.25 h-3 border-t-[0.5px] border-white/40 rounded-t-[calc(var(--button-radius)-1.25px)] opacity-60" })), isLoading && (jsx("div", { className: "absolute inset-0 flex items-center justify-center", children: jsx(Spinner, { size: "sm", color: color, className: spinnerClassName }) })), jsx("span", { className: cn("inline-flex items-center gap-2 whitespace-nowrap", isLoading && "opacity-0"), children: children }), enableRipple &&
|
|
110
|
+
resolvedVariant !== "outline" && (jsx("div", { className: "absolute top-0.25 right-0.25 left-0.25 h-3 border-t-[0.5px] border-white/40 rounded-t-[calc(var(--button-radius)-1.25px)] opacity-60 blur-[0.75px]" })), isLoading && (jsx("div", { className: "absolute inset-0 flex items-center justify-center", children: jsx(Spinner, { size: "sm", color: color, className: spinnerClassName }) })), jsx("span", { className: cn("inline-flex items-center gap-2 whitespace-nowrap", isLoading && "opacity-0"), children: children }), enableRipple &&
|
|
111
111
|
ripples.map((ripple) => {
|
|
112
112
|
const animation = getRippleAnimation(effect, ripple, rippleScale);
|
|
113
113
|
return (jsx(motion.span, { initial: animation.initial, animate: animation.animate, transition: animation.transition, className: cn("absolute rounded-full size-5 pointer-events-none ", animation.className, rippleClassName ||
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
const buttonTheme = {
|
|
5
5
|
// Base styles for the button element
|
|
6
|
-
baseStyle: "relative inline-flex items-center justify-center gap-2 focus:outline-none rounded-[var(--button-radius)] overflow-hidden cursor-pointer transition-all duration-300 ease-in-out min-w-fit flex-shrink-0 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 cursor-pointer",
|
|
6
|
+
baseStyle: "relative inline-flex items-center justify-center gap-2 focus:outline-none rounded-[var(--button-radius)] overflow-hidden cursor-pointer transition-all duration-300 ease-in-out min-w-fit flex-shrink-0 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 cursor-pointer backdrop-blur-sm",
|
|
7
7
|
// Visual style variants - STRUCTURE only (no colors)
|
|
8
8
|
variantStyles: {
|
|
9
9
|
filled: "border hover:brightness-[0.9] dark:hover:brightness-[1.15]",
|
|
@@ -152,19 +152,19 @@ const buttonTheme = {
|
|
|
152
152
|
// Size variants
|
|
153
153
|
sizes: {
|
|
154
154
|
sm: {
|
|
155
|
-
default: "font-
|
|
155
|
+
default: "font-medium min-h-[var(--button-min-h-sm)] px-[var(--button-px-sm)] py-[var(--button-py-sm)] text-sm",
|
|
156
156
|
iconOnly: "size-[var(--button-icon-size-sm)] p-[var(--button-icon-p-sm)]",
|
|
157
157
|
link: "font-semibold p-0 text-sm h-fit",
|
|
158
158
|
},
|
|
159
159
|
md: {
|
|
160
|
-
default: "font-
|
|
160
|
+
default: "font-medium min-h-[var(--button-min-h-md)] px-[var(--button-px-md)] py-[var(--button-py-md)] text-sm",
|
|
161
161
|
iconOnly: "size-[var(--button-icon-size-md)] p-[var(--button-icon-p-md)]",
|
|
162
162
|
link: "font-semibold p-0 text-sm h-fit",
|
|
163
163
|
},
|
|
164
164
|
lg: {
|
|
165
|
-
default: "font-
|
|
165
|
+
default: "font-medium min-h-[var(--button-min-h-lg)] px-[var(--button-px-lg)] py-[var(--button-py-lg)] text-base",
|
|
166
166
|
iconOnly: "size-[var(--button-icon-size-lg)] p-[var(--button-icon-p-lg)]",
|
|
167
|
-
link: "font-
|
|
167
|
+
link: "font-medium p-0 text-base h-fit",
|
|
168
168
|
},
|
|
169
169
|
},
|
|
170
170
|
// State styles
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Uses design tokens and data-[state=*] selectors
|
|
4
4
|
*/
|
|
5
5
|
const calendarTheme = {
|
|
6
|
-
baseStyle: "select-none w-full bg-
|
|
6
|
+
baseStyle: "select-none w-full bg-[var(--color-surface)]",
|
|
7
7
|
headerStyle: "flex items-center justify-between mb-4",
|
|
8
8
|
titleStyle: "text-sm font-semibold text-[var(--color-text-primary)] " + "",
|
|
9
9
|
headerDropdownsStyle: "grid grid-cols-2 items-center gap-2 flex-1 justify-center mx-3",
|
|
@@ -3,7 +3,7 @@ const calendarMiniTheme = {
|
|
|
3
3
|
monthRowStyle: "flex flex-1 gap-4 overflow-x-auto scrollbar-hide scroll-smooth snap-x snap-mandatory px-4 ml-3",
|
|
4
4
|
monthItemStyle: "font-semibold text-[var(--color-text-secondary)] cursor-pointer transition-colors hover:text-[var(--color-text-primary)] flex-shrink-0 snap-center data-[state=active]:text-[var(--color-text-primary)] data-[state=active]:opacity-100",
|
|
5
5
|
dateRowStyle: "relative overflow-hidden px-4 py-0.5",
|
|
6
|
-
dateItemStyle: "px-0 py-1.5 min-w-[50px] flex flex-col items-center rounded-[var(--form-radius)] cursor-pointer transition-all text-[var(--color-text-primary)] hover:bg-[var(--color-
|
|
6
|
+
dateItemStyle: "px-0 py-1.5 min-w-[50px] flex flex-col items-center rounded-[var(--form-radius)] cursor-pointer transition-all text-[var(--color-text-primary)] hover:bg-[var(--color-surface-hover)] flex-shrink-0 snap-center ring-1 ring-transparent data-[state=selected]:bg-[var(--color-background-secondary)] data-[state=selected]:ring-[var(--color-border)] data-[state=selected]:hover:bg-[var(--color-background-secondary)] data-[state=selected]:z-2 data-[disabled]:opacity-40 data-[disabled]:cursor-not-allowed data-[disabled]:hover:bg-[var(--color-background-secondary)]",
|
|
7
7
|
};
|
|
8
8
|
|
|
9
9
|
export { calendarMiniTheme };
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
2
|
import React__default from 'react';
|
|
3
|
-
import {
|
|
3
|
+
import { MenuItem } from '../MenuItem/MenuItem.js';
|
|
4
4
|
import { Kbd } from '../Kbd/Kbd.js';
|
|
5
|
-
import { commandPaletteTheme } from './CommandPalette.theme.js';
|
|
6
5
|
|
|
7
6
|
/**
|
|
8
7
|
* Map string shortcuts to KbdKey types
|
|
@@ -100,7 +99,7 @@ const Shortcut = ({ keys }) => {
|
|
|
100
99
|
* />
|
|
101
100
|
* ```
|
|
102
101
|
*/
|
|
103
|
-
const CommandItem = ({ command, index, isHighlighted, contentStart, contentEnd, className, onSelect, onMouseEnter,
|
|
102
|
+
const CommandItem = ({ command, index, isHighlighted, contentStart, contentEnd, className, onSelect, onMouseEnter, }) => {
|
|
104
103
|
const handleClick = () => {
|
|
105
104
|
if (!command.disabled) {
|
|
106
105
|
onSelect(command);
|
|
@@ -126,7 +125,7 @@ const CommandItem = ({ command, index, isHighlighted, contentStart, contentEnd,
|
|
|
126
125
|
}
|
|
127
126
|
return null;
|
|
128
127
|
};
|
|
129
|
-
return (
|
|
128
|
+
return (jsx(MenuItem, { role: "option", selected: isHighlighted, disabled: command.disabled, startContent: finalContentStart, subtitle: command.subtitle, endContent: renderContentEnd(), onActivate: handleClick, onMouseEnter: handleMouseEnter, "aria-selected": isHighlighted, "data-command-index": index, "data-highlighted": isHighlighted, className: className, children: command.label }));
|
|
130
129
|
};
|
|
131
130
|
|
|
132
131
|
export { CommandItem };
|
|
@@ -211,7 +211,7 @@ const CommandPalette = React__default.forwardRef(({ isOpen, onClose, commands =
|
|
|
211
211
|
// Otherwise render flat list
|
|
212
212
|
return displayCommands.map((command, index) => (jsx(CommandItem, { command: command, index: index, isHighlighted: index === highlightedIndex, onSelect: handleSelectCommand, onMouseEnter: setHighlightedIndex, theme: theme }, command.id)));
|
|
213
213
|
};
|
|
214
|
-
return (jsxs(Overlay, { ref: ref, isOpen: isOpen, onClose: onClose, closeOnOverlayClick: closeOnOverlayClick, closeOnEsc: closeOnEsc, position: "top", overlayClassName: overlayClassName, contentClassName: cn(theme.container, className), animations: {
|
|
214
|
+
return (jsxs(Overlay, { ref: ref, isOpen: isOpen, onClose: onClose, closeOnOverlayClick: closeOnOverlayClick, closeOnEsc: closeOnEsc, position: "top", overlayClassName: cn(theme.overlay, overlayClassName), contentClassName: cn(theme.container, className), animations: {
|
|
215
215
|
overlay: overlayAnimations,
|
|
216
216
|
content: containerAnimations,
|
|
217
217
|
}, children: [jsx("div", { className: theme.searchWrapper, children: jsxs("div", { className: "flex items-center gap-3", children: [jsx(MagnifyingGlassIcon, { className: "w-5 h-5 text-[var(--color-text-muted)]", strokeWidth: 2 }), jsx("input", { ref: searchInputRef, type: "text", className: theme.searchInput, placeholder: placeholder, value: searchValue, onChange: handleSearchChange, autoComplete: "off", autoCorrect: "off", spellCheck: false, "aria-label": "Search commands" })] }) }), jsx(ScrollArea, { ref: listContainerRef, type: "hover", className: "overscroll-contain px-1", style: {
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
const commandPaletteTheme = {
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
// Applied to the Overlay backdrop (positioning/z-index come from Overlay).
|
|
3
|
+
// Overrides the shared 65%-black scrim (--overlay-bg) with a lighter dim so
|
|
4
|
+
// real page content sits behind the container — that's what the container's
|
|
5
|
+
// backdrop-blur frosts into the glass effect. A heavy scrim would leave only
|
|
6
|
+
// a flat dark layer to blur, making backdrop-blur look like it does nothing.
|
|
7
|
+
overlay: "bg-black/30",
|
|
4
8
|
container: "relative w-full max-h-[calc(100vh-2rem)] max-w-lg " +
|
|
5
|
-
"bg-[var(--color-
|
|
9
|
+
"bg-[var(--color-surface-overlay)] backdrop-blur-md rounded-[var(--modal-radius)] shadow-2xl shadow-black/30 " +
|
|
6
10
|
"border border-[var(--color-border)] ring-4 ring-[var(--color-background)]/20 " +
|
|
7
11
|
"flex flex-col my-4 min-h-0 overflow-hidden " +
|
|
8
12
|
// Dark mode
|
|
@@ -11,18 +15,12 @@ const commandPaletteTheme = {
|
|
|
11
15
|
searchInput: "w-full px-0 py-0 text-sm bg-transparent border-none outline-none " +
|
|
12
16
|
"text-[var(--color-text-primary)] placeholder:text-[var(--color-text-placeholder)] " +
|
|
13
17
|
"focus:outline-none focus:ring-0 " +
|
|
14
|
-
// Dark mode
|
|
15
|
-
"dark:text-[var(--color-
|
|
18
|
+
// Dark mode — matches Input's controlBaseStyle text/placeholder tokens
|
|
19
|
+
"dark:text-[var(--color-text-primary)] dark:placeholder:text-[var(--color-neutral-500)]",
|
|
16
20
|
groupLabel: "px-4 py-1 text-xs font-semibold text-[var(--color-text-muted)]/50 uppercase " +
|
|
17
21
|
"dark:text-[var(--color-neutral-500)]",
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
"data-[highlighted=true]:bg-[var(--color-primary)] data-[highlighted=true]:hover:bg-[var(--color-primary)] " +
|
|
21
|
-
"data-[highlighted=true]:text-[var(--color-primary-contrast)] " +
|
|
22
|
-
"data-[disabled=true]:opacity-50 data-[disabled=true]:cursor-not-allowed data-[disabled=true]:hover:bg-transparent " +
|
|
23
|
-
// Dark mode - adjust hover state
|
|
24
|
-
"dark:text-[var(--color-neutral-200)] dark:hover:bg-[var(--color-primary-600)] " +
|
|
25
|
-
"dark:data-[highlighted=true]:bg-[var(--color-primary-600)]",
|
|
22
|
+
// Command rows render via the shared MenuItem primitive and use its default
|
|
23
|
+
// styling (subtle highlight + standard padding) — no per-row theme here.
|
|
26
24
|
emptyState: "px-4 py-12 text-center text-sm text-[var(--color-text-muted)] " +
|
|
27
25
|
"dark:text-[var(--color-neutral-500)]",
|
|
28
26
|
footer: "border-t border-[var(--color-border)] px-4 py-2 text-xs text-[var(--color-text-muted)]font-medium",
|
|
@@ -86,8 +86,6 @@ export interface CommandPaletteThemeOverrides {
|
|
|
86
86
|
searchInput?: string;
|
|
87
87
|
/** Style for group labels */
|
|
88
88
|
groupLabel?: string;
|
|
89
|
-
/** Style for command items (uses data-[highlighted] and data-[disabled] selectors) */
|
|
90
|
-
commandItem?: string;
|
|
91
89
|
/** Style for empty state */
|
|
92
90
|
emptyState?: string;
|
|
93
91
|
/** Style for the footer area */
|
|
@@ -5,21 +5,20 @@ const contextMenuTheme = {
|
|
|
5
5
|
...dropdownTheme,
|
|
6
6
|
// Content uses the same styling as Dropdown menu
|
|
7
7
|
contentStyle: dropdownTheme.menuStyle.replace("flex", "flex-col p-1"),
|
|
8
|
-
// Items use exact same styling as Dropdown items
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
8
|
+
// Items use exact same styling as Dropdown items. The left padding for the
|
|
9
|
+
// check icon is applied per-item in ContextMenuItem (className) when checked.
|
|
10
|
+
itemStyle: dropdownTheme.itemBaseStyle,
|
|
11
|
+
// Checked state - tick icon positioning (absolute left).
|
|
12
|
+
// --color-text-primary flips for dark mode on its own.
|
|
13
|
+
itemCheckedStyle: "absolute left-2.5 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--color-text-primary)]",
|
|
14
|
+
// Submenu trigger - based on Dropdown item style with chevron space.
|
|
15
|
+
// --color-surface-hover is a translucent tint that lightens in dark on its own.
|
|
16
|
+
subTriggerStyle: `${dropdownTheme.itemBaseStyle} pr-8 data-[state=open]:bg-[var(--color-surface-hover)]`,
|
|
17
|
+
// Submenu content - floating anchored overlay, matches main dropdown menu
|
|
17
18
|
subContentStyle: "min-w-[180px] max-h-[400px] overflow-y-auto rounded-[var(--dropdown-radius)] border border-[var(--color-border)] " +
|
|
18
|
-
"bg-[var(--color-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
separatorStyle: "h-px bg-[var(--color-border)] my-1 -mx-1 " +
|
|
22
|
-
"dark:bg-[var(--color-neutral-700)]",
|
|
19
|
+
"bg-[var(--color-surface-overlay)] shadow-real-xl flex flex-col p-1 focus:outline-none",
|
|
20
|
+
// Separator - horizontal divider (--color-border flips for dark on its own)
|
|
21
|
+
separatorStyle: "h-px bg-[var(--color-border)] my-1 -mx-1",
|
|
23
22
|
// Label - section header (matches Dropdown section title)
|
|
24
23
|
labelStyle: dropdownTheme.sectionTitleStyle,
|
|
25
24
|
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import React__default, { useMemo } from 'react';
|
|
3
|
+
import { cn } from '../../../utils/cn.js';
|
|
4
|
+
import { dotSeparatorTheme } from './DotSeparator.theme.js';
|
|
5
|
+
|
|
6
|
+
const DotSeparator = React__default.forwardRef(({ size = 'md', className, theme: customTheme = {}, ...props }, ref) => {
|
|
7
|
+
const theme = useMemo(() => ({
|
|
8
|
+
...dotSeparatorTheme,
|
|
9
|
+
...customTheme,
|
|
10
|
+
sizes: {
|
|
11
|
+
...dotSeparatorTheme.sizes,
|
|
12
|
+
...customTheme.sizes,
|
|
13
|
+
},
|
|
14
|
+
}), [customTheme]);
|
|
15
|
+
return (jsx("span", { ref: ref, "aria-hidden": "true", className: cn(theme.baseStyle, theme.sizes[size], className), ...props }));
|
|
16
|
+
});
|
|
17
|
+
DotSeparator.displayName = 'DotSeparator';
|
|
18
|
+
|
|
19
|
+
export { DotSeparator };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
const dotSeparatorTheme = {
|
|
2
|
+
baseStyle: 'inline-block shrink-0 rounded-full align-middle bg-[var(--color-text-muted)]',
|
|
3
|
+
sizes: {
|
|
4
|
+
sm: 'size-0.5 mx-1', // 2px dot
|
|
5
|
+
md: 'size-1 mx-1.5', // 4px dot
|
|
6
|
+
lg: 'size-1.5 mx-2', // 6px dot
|
|
7
|
+
},
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export { dotSeparatorTheme };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { HTMLAttributes } from 'react';
|
|
2
|
+
export type DotSeparatorSize = 'sm' | 'md' | 'lg';
|
|
3
|
+
export interface DotSeparatorTheme {
|
|
4
|
+
baseStyle: string;
|
|
5
|
+
sizes: Record<DotSeparatorSize, string>;
|
|
6
|
+
}
|
|
7
|
+
export interface DotSeparatorThemeOverrides {
|
|
8
|
+
baseStyle?: string;
|
|
9
|
+
sizes?: Partial<Record<DotSeparatorSize, string>>;
|
|
10
|
+
}
|
|
11
|
+
export interface DotSeparatorProps extends HTMLAttributes<HTMLSpanElement> {
|
|
12
|
+
/**
|
|
13
|
+
* The size of the dot (also scales its horizontal spacing)
|
|
14
|
+
* @default 'md'
|
|
15
|
+
*/
|
|
16
|
+
size?: DotSeparatorSize;
|
|
17
|
+
/**
|
|
18
|
+
* Custom class name for the dot
|
|
19
|
+
*/
|
|
20
|
+
className?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Component-level theme overrides
|
|
23
|
+
*/
|
|
24
|
+
theme?: DotSeparatorThemeOverrides;
|
|
25
|
+
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
const drawerTheme = {
|
|
2
2
|
// Note: overlay styling is now handled by the shared Overlay component
|
|
3
3
|
overlay: "",
|
|
4
|
-
container: "fixed bg-
|
|
4
|
+
container: "fixed bg-[var(--color-surface-raised)] shadow-2xl shadow-black/30 " +
|
|
5
5
|
"border border-[var(--color-border)] ring-4 ring-white/10 " +
|
|
6
6
|
"flex flex-col overflow-hidden rounded-[var(--drawer-radius)] " +
|
|
7
|
-
"dark:bg-[var(--color-
|
|
7
|
+
"dark:bg-[var(--color-surface-raised)] dark:ring-white/5",
|
|
8
8
|
inner: "h-full flex flex-col",
|
|
9
9
|
header: "flex items-start justify-between p-4 border-b border-[var(--color-border)] shrink-0 text-[var(--color-text-primary)] gap-4",
|
|
10
10
|
headerContent: "flex items-start gap-3 flex-1 min-w-0",
|
|
@@ -2,8 +2,8 @@ import { menuItemTheme } from '../MenuItem/MenuItem.theme.js';
|
|
|
2
2
|
|
|
3
3
|
const dropdownTheme = {
|
|
4
4
|
// Menu container - similar to Popover but with menu-specific styling
|
|
5
|
-
menuStyle: "min-w-[200px] max-h-[400px] overflow-y-auto rounded-[var(--dropdown-radius)] border border-[var(--color-border)] bg-
|
|
6
|
-
"dark:bg-[var(--color-
|
|
5
|
+
menuStyle: "min-w-[200px] max-h-[400px] overflow-y-auto rounded-[var(--dropdown-radius)] border border-[var(--color-border)] bg-[var(--color-surface-overlay)] shadow-real-xl focus:outline-none flex disabled:cursor-not-allowed " +
|
|
6
|
+
"dark:bg-[var(--color-surface-overlay)]",
|
|
7
7
|
// Delegate item styles to shared MenuItem theme
|
|
8
8
|
itemBaseStyle: menuItemTheme.baseStyle,
|
|
9
9
|
itemDangerStyle: menuItemTheme.dangerStyle,
|
|
@@ -12,9 +12,8 @@ const dropdownTheme = {
|
|
|
12
12
|
sectionTitleStyle: "px-2 py-1.5 text-xs font-semibold text-[var(--color-text-muted)] uppercase tracking-tight",
|
|
13
13
|
// Section container styling
|
|
14
14
|
sectionStyle: "py-1",
|
|
15
|
-
// Separator between sections
|
|
16
|
-
separatorStyle: "my-1 h-px bg-[var(--color-border)]
|
|
17
|
-
"dark:bg-[var(--color-neutral-700)]",
|
|
15
|
+
// Separator between sections (--color-border flips for dark mode on its own)
|
|
16
|
+
separatorStyle: "my-1 h-px bg-[var(--color-border)]",
|
|
18
17
|
};
|
|
19
18
|
|
|
20
19
|
export { dropdownTheme };
|
|
@@ -63,7 +63,7 @@ const DropdownItem = React__default.forwardRef(({ itemKey, children, className,
|
|
|
63
63
|
// Build end content: user's endContent OR selection checkmark
|
|
64
64
|
const resolvedEndContent = endContent ||
|
|
65
65
|
(selectionMode !== "none" ? (jsx("div", { className: cn("flex items-center justify-center flex-shrink-0 w-5 h-5"), children: isSelected && (jsx(CheckIcon, { className: "size-4 text-[var(--color-text-secondary)]" })) })) : undefined);
|
|
66
|
-
return (jsx(MenuItem, { ref: ref, role: itemRole, disabled: disabled, isDanger: isDanger, startContent: startContent, endContent: resolvedEndContent, subtitle: subtitle, shortcut: shortcut, onActivate: handleActivate,
|
|
66
|
+
return (jsx(MenuItem, { ref: ref, role: itemRole, disabled: disabled, isDanger: isDanger, startContent: startContent, endContent: resolvedEndContent, subtitle: subtitle, shortcut: shortcut, onActivate: handleActivate, selected: isSelected, ...(selectionMode !== "none" ? { "aria-checked": isSelected } : {}), className: className, theme: {
|
|
67
67
|
baseStyle: theme.itemBaseStyle,
|
|
68
68
|
dangerStyle: theme.itemDangerStyle,
|
|
69
69
|
focusStyle: theme.itemFocusStyle,
|
|
@@ -189,7 +189,7 @@ const DropdownMenu = React__default.forwardRef(({ children, className, animation
|
|
|
189
189
|
}, "data-state": isOpen ? "open" : "closed", "data-placement": placement, ...domProps, children: children })) }));
|
|
190
190
|
// Use portal if specified - wrap with dark class for dark mode support
|
|
191
191
|
if (portal && isClient) {
|
|
192
|
-
return createPortal(jsx("div", { className: isDarkMode ? "dark" : undefined, children: menuContent }), document.body);
|
|
192
|
+
return createPortal(jsx("div", { "data-flikkui-portal": "", className: isDarkMode ? "dark" : undefined, children: menuContent }), document.body);
|
|
193
193
|
}
|
|
194
194
|
return menuContent;
|
|
195
195
|
});
|
|
@@ -11,7 +11,7 @@ const Empty = React__default.forwardRef(({ title, subtitle, image, imageAlt, ico
|
|
|
11
11
|
if (children) {
|
|
12
12
|
return (jsx("div", { ref: ref, className: cn(emptyTheme.baseStyle, className), role: "region", "aria-label": "Empty state", ...props, children: children }));
|
|
13
13
|
}
|
|
14
|
-
return (jsxs("div", { ref: ref, className: cn(emptyTheme.baseStyle, className), role: "region", "aria-label": "Empty state", ...props, children: [image ? (jsx("div", { className: "flex-shrink-0 mb-6", children: jsx("img", { src: image, alt: imageAlt || "Empty state illustration", className: cn("mx-auto object-cover", imageDimensions), loading: "lazy" }) })) : icon ? (jsx("div", { className: cn("flex-shrink-0 mx-auto text-[var(--color-text-muted)] mb-6", iconDimensions), "aria-hidden": "true", children: icon })) : null, jsxs("div", { className: "flex flex-col items-center justify-center gap-1", children: [title && jsx("div", { className: emptyTheme.titleStyle, children: title }), subtitle && (jsx("div", { className: emptyTheme.subtitleStyle, children: subtitle }))] }), action && (jsx("div", { className: "flex flex-col sm:flex-row gap-2 justify-center items-center mt-3", children: action }))] }));
|
|
14
|
+
return (jsxs("div", { ref: ref, className: cn(emptyTheme.baseStyle, className), role: "region", "aria-label": "Empty state", ...props, children: [image ? (jsx("div", { className: "flex-shrink-0 mb-6", children: jsx("img", { src: image, alt: imageAlt || "Empty state illustration", className: cn("mx-auto object-cover", imageDimensions), loading: "lazy" }) })) : icon ? (jsx("div", { className: cn("flex-shrink-0 mx-auto flex items-center justify-center text-[var(--color-text-muted)] mb-6", iconDimensions), "aria-hidden": "true", children: icon })) : null, jsxs("div", { className: "flex flex-col items-center justify-center gap-1", children: [title && jsx("div", { className: emptyTheme.titleStyle, children: title }), subtitle && (jsx("div", { className: emptyTheme.subtitleStyle, children: subtitle }))] }), action && (jsx("div", { className: "flex flex-col sm:flex-row gap-2 justify-center items-center mt-3", children: action }))] }));
|
|
15
15
|
});
|
|
16
16
|
// Set display name for dev tools and Storybook
|
|
17
17
|
Empty.displayName = "Empty";
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { ImagePlaceholderProps } from "./ImagePlaceholder.types";
|
|
3
|
+
/**
|
|
4
|
+
* ImagePlaceholder renders a striped placeholder surface used when a
|
|
5
|
+
* header / banner / cover image has not yet been uploaded.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```tsx
|
|
9
|
+
* <ImagePlaceholder ratio={16 / 9}>
|
|
10
|
+
* <Button>Upload cover</Button>
|
|
11
|
+
* </ImagePlaceholder>
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export declare const ImagePlaceholder: React.ForwardRefExoticComponent<ImagePlaceholderProps & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import React__default from 'react';
|
|
3
|
+
import { cn } from '../../../utils/cn.js';
|
|
4
|
+
import { AspectRatio } from '../AspectRatio/AspectRatio.js';
|
|
5
|
+
import { StripePattern } from '../../effects/StripePattern/StripePattern.js';
|
|
6
|
+
import { imagePlaceholderTheme } from './ImagePlaceholder.theme.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* ImagePlaceholder renders a striped placeholder surface used when a
|
|
10
|
+
* header / banner / cover image has not yet been uploaded.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```tsx
|
|
14
|
+
* <ImagePlaceholder ratio={16 / 9}>
|
|
15
|
+
* <Button>Upload cover</Button>
|
|
16
|
+
* </ImagePlaceholder>
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
const ImagePlaceholder = React__default.forwardRef(({ ratio = 16 / 9, bordered = true, rounded = true, pattern, children, className, ...rest }, ref) => {
|
|
20
|
+
const surface = (jsxs("div", { ref: ref, className: cn(imagePlaceholderTheme.surfaceStyle, rounded && imagePlaceholderTheme.roundedStyle, bordered && imagePlaceholderTheme.borderedStyle, className), ...rest, children: [jsx(StripePattern, { ...pattern }), children !== undefined && (jsx("div", { className: imagePlaceholderTheme.contentStyle, children: children }))] }));
|
|
21
|
+
if (ratio === undefined) {
|
|
22
|
+
return surface;
|
|
23
|
+
}
|
|
24
|
+
return jsx(AspectRatio, { ratio: ratio, children: surface });
|
|
25
|
+
});
|
|
26
|
+
ImagePlaceholder.displayName = "ImagePlaceholder";
|
|
27
|
+
|
|
28
|
+
export { ImagePlaceholder };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
const imagePlaceholderTheme = {
|
|
2
|
+
surfaceStyle: "relative w-full h-full overflow-hidden bg-[var(--color-background-secondary)]",
|
|
3
|
+
borderedStyle: "border border-dashed border-[var(--color-border)]",
|
|
4
|
+
roundedStyle: "rounded-[var(--card-rounded)]",
|
|
5
|
+
contentStyle: "absolute inset-0 z-10 flex items-center justify-center text-[var(--color-text-muted)]",
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export { imagePlaceholderTheme };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { StripePatternProps } from "../../effects/StripePattern";
|
|
3
|
+
export interface ImagePlaceholderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "children"> {
|
|
4
|
+
/**
|
|
5
|
+
* Aspect ratio (width / height) for the placeholder surface.
|
|
6
|
+
* Pass `undefined` to skip the AspectRatio wrapper and let the parent
|
|
7
|
+
* control the height (e.g. when used inside a fixed-height container).
|
|
8
|
+
* @default 16/9
|
|
9
|
+
*/
|
|
10
|
+
ratio?: number;
|
|
11
|
+
/**
|
|
12
|
+
* Show the dashed outer border.
|
|
13
|
+
* @default true
|
|
14
|
+
*/
|
|
15
|
+
bordered?: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Apply rounded corners.
|
|
18
|
+
* @default true
|
|
19
|
+
*/
|
|
20
|
+
rounded?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Override props passed to the inner StripePattern (color, spacing, angle, etc.).
|
|
23
|
+
*/
|
|
24
|
+
pattern?: Partial<StripePatternProps>;
|
|
25
|
+
/**
|
|
26
|
+
* Optional content rendered above the striped surface (e.g. an icon,
|
|
27
|
+
* caption, or upload button).
|
|
28
|
+
*/
|
|
29
|
+
children?: React.ReactNode;
|
|
30
|
+
/** className override on the outer surface (shadcn pattern). */
|
|
31
|
+
className?: string;
|
|
32
|
+
}
|