@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.
Files changed (211) hide show
  1. package/dist/components/ai/CodeBlock/CodeBlock.theme.js +2 -2
  2. package/dist/components/ai/PromptInput/PromptInput.js +4 -0
  3. package/dist/components/ai/PromptInput/VoiceRecorder.js +4 -0
  4. package/dist/components/ai/StreamingResponse/MarkdownRenderer.js +1 -1
  5. package/dist/components/ai/TokenCounter/TokenCounter.theme.js +1 -1
  6. package/dist/components/charts/BarChart/BarChart.js +2 -2
  7. package/dist/components/charts/StackedBarChart/StackedBarChart.js +1 -1
  8. package/dist/components/charts/shared/BarRenderer/BarRenderer.js +2 -2
  9. package/dist/components/core/Breadcrumbs/Breadcrumbs.theme.js +1 -1
  10. package/dist/components/core/Button/Button.js +1 -1
  11. package/dist/components/core/Button/Button.theme.js +5 -5
  12. package/dist/components/core/Calendar/Calendar.theme.js +1 -1
  13. package/dist/components/core/Calendar/CalendarMini/CalendarMini.theme.js +1 -1
  14. package/dist/components/core/CommandPalette/CommandItem.js +4 -5
  15. package/dist/components/core/CommandPalette/CommandPalette.js +1 -1
  16. package/dist/components/core/CommandPalette/CommandPalette.theme.js +11 -13
  17. package/dist/components/core/CommandPalette/CommandPalette.types.d.ts +0 -2
  18. package/dist/components/core/ContextMenu/ContextMenu.theme.js +13 -14
  19. package/dist/components/core/DotSeparator/DotSeparator.d.ts +3 -0
  20. package/dist/components/core/DotSeparator/DotSeparator.js +19 -0
  21. package/dist/components/core/DotSeparator/DotSeparator.theme.d.ts +2 -0
  22. package/dist/components/core/DotSeparator/DotSeparator.theme.js +10 -0
  23. package/dist/components/core/DotSeparator/DotSeparator.types.d.ts +25 -0
  24. package/dist/components/core/DotSeparator/index.d.ts +3 -0
  25. package/dist/components/core/Drawer/Drawer.theme.js +2 -2
  26. package/dist/components/core/Dropdown/Dropdown.theme.js +4 -5
  27. package/dist/components/core/Dropdown/DropdownItem.js +1 -1
  28. package/dist/components/core/Dropdown/DropdownMenu.js +1 -1
  29. package/dist/components/core/Empty/Empty.js +1 -1
  30. package/dist/components/core/ImagePlaceholder/ImagePlaceholder.d.ts +14 -0
  31. package/dist/components/core/ImagePlaceholder/ImagePlaceholder.js +28 -0
  32. package/dist/components/core/ImagePlaceholder/ImagePlaceholder.theme.d.ts +6 -0
  33. package/dist/components/core/ImagePlaceholder/ImagePlaceholder.theme.js +8 -0
  34. package/dist/components/core/ImagePlaceholder/ImagePlaceholder.types.d.ts +32 -0
  35. package/dist/components/core/ImagePlaceholder/index.d.ts +2 -0
  36. package/dist/components/core/MenuItem/MenuItem.js +5 -2
  37. package/dist/components/core/MenuItem/MenuItem.theme.d.ts +6 -0
  38. package/dist/components/core/MenuItem/MenuItem.theme.js +19 -16
  39. package/dist/components/core/MenuItem/MenuItem.types.d.ts +2 -0
  40. package/dist/components/core/Message/Message.theme.js +1 -1
  41. package/dist/components/core/Modal/Modal.theme.js +1 -1
  42. package/dist/components/core/NavItem/NavItem.d.ts +1 -1
  43. package/dist/components/core/NavItem/NavItem.js +187 -68
  44. package/dist/components/core/NavItem/NavItem.theme.js +31 -12
  45. package/dist/components/core/NavItem/NavItem.types.d.ts +17 -39
  46. package/dist/components/core/Pagination/Pagination.theme.js +3 -3
  47. package/dist/components/core/Popover/Popover.theme.js +1 -1
  48. package/dist/components/core/Popover/Popover.types.d.ts +6 -2
  49. package/dist/components/core/Popover/PopoverBody.js +10 -3
  50. package/dist/components/core/Progress/Progress.theme.js +1 -1
  51. package/dist/components/core/ScrollArea/ScrollArea.js +2 -2
  52. package/dist/components/core/ScrollArea/ScrollArea.theme.js +1 -1
  53. package/dist/components/core/Segmented/Segmented.js +8 -6
  54. package/dist/components/core/Segmented/Segmented.theme.js +3 -3
  55. package/dist/components/core/Sidebar/Sidebar.d.ts +3 -1
  56. package/dist/components/core/Sidebar/Sidebar.js +53 -16
  57. package/dist/components/core/Sidebar/Sidebar.theme.js +5 -7
  58. package/dist/components/core/Sidebar/Sidebar.types.d.ts +125 -8
  59. package/dist/components/core/Sidebar/SidebarCard.d.ts +25 -0
  60. package/dist/components/core/Sidebar/SidebarCard.js +68 -0
  61. package/dist/components/core/Sidebar/SidebarCard.theme.d.ts +8 -0
  62. package/dist/components/core/Sidebar/SidebarCard.theme.js +18 -0
  63. package/dist/components/core/Sidebar/SidebarContent.js +10 -6
  64. package/dist/components/core/Sidebar/SidebarContext.d.ts +17 -16
  65. package/dist/components/core/Sidebar/SidebarContext.js +43 -20
  66. package/dist/components/core/Sidebar/SidebarFooter.js +4 -6
  67. package/dist/components/core/Sidebar/SidebarHeader.js +12 -9
  68. package/dist/components/core/Sidebar/SidebarLogo.js +39 -8
  69. package/dist/components/core/Sidebar/SidebarNav.js +4 -3
  70. package/dist/components/core/Sidebar/SidebarNavGroup.js +4 -7
  71. package/dist/components/core/Sidebar/SidebarSearch.d.ts +22 -0
  72. package/dist/components/core/Sidebar/SidebarSearch.js +135 -0
  73. package/dist/components/core/Sidebar/SidebarToggle.js +6 -1
  74. package/dist/components/core/Sidebar/SidebarUserProfile.js +33 -17
  75. package/dist/components/core/Sidebar/index.d.ts +4 -3
  76. package/dist/components/core/Skeleton/Skeleton.theme.js +1 -1
  77. package/dist/components/core/Spinner/Spinner.theme.js +1 -1
  78. package/dist/components/core/Tabs/Tabs.js +6 -1
  79. package/dist/components/core/Tabs/Tabs.types.d.ts +2 -0
  80. package/dist/components/core/Tabs/TabsBody.js +5 -3
  81. package/dist/components/core/Tag/Tag.js +29 -5
  82. package/dist/components/core/Tag/Tag.theme.js +14 -9
  83. package/dist/components/core/Tag/Tag.types.d.ts +7 -0
  84. package/dist/components/core/Tooltip/Tooltip.js +1 -1
  85. package/dist/components/core/Tooltip/Tooltip.theme.js +1 -2
  86. package/dist/components/core/index.d.ts +2 -0
  87. package/dist/components/core/index.js +6 -2
  88. package/dist/components/data-display/GanttChart/GanttChart.d.ts +1 -1
  89. package/dist/components/data-display/GanttChart/GanttChart.js +31 -4
  90. package/dist/components/data-display/GanttChart/GanttChart.theme.js +19 -17
  91. package/dist/components/data-display/GanttChart/GanttChart.types.d.ts +19 -0
  92. package/dist/components/data-display/GanttChart/GanttChart.utils.js +1 -1
  93. package/dist/components/data-display/GanttChart/GanttChartPanel.d.ts +1 -1
  94. package/dist/components/data-display/GanttChart/GanttChartPanel.js +3 -3
  95. package/dist/components/data-display/GanttChart/GanttDependencyArrows.js +7 -4
  96. package/dist/components/data-display/GanttChart/GanttMilestone.js +5 -5
  97. package/dist/components/data-display/GanttChart/GanttTableGroupRow.js +1 -1
  98. package/dist/components/data-display/GanttChart/GanttTablePanel.js +1 -1
  99. package/dist/components/data-display/GanttChart/GanttTableTaskRow.js +2 -2
  100. package/dist/components/data-display/GanttChart/GanttTaskBar.js +37 -16
  101. package/dist/components/data-display/GanttChart/GanttTimelineGrid.js +2 -1
  102. package/dist/components/data-display/GanttChart/GanttTimelineHeader.js +35 -11
  103. package/dist/components/data-display/GanttChart/GanttToolbar.js +2 -2
  104. package/dist/components/data-display/GanttChart/hooks/useGanttDrag.js +3 -2
  105. package/dist/components/data-display/GanttChart/index.d.ts +1 -1
  106. package/dist/components/data-display/KPI/KPI.js +13 -3
  107. package/dist/components/data-display/KPI/KPI.theme.js +3 -3
  108. package/dist/components/data-display/Metric/Metric.theme.js +3 -3
  109. package/dist/components/data-display/Table/Table.js +4 -3
  110. package/dist/components/data-display/Table/Table.theme.js +14 -6
  111. package/dist/components/data-display/Table/Table.types.d.ts +15 -0
  112. package/dist/components/data-display/Table/TableColumnManager.js +1 -1
  113. package/dist/components/data-display/Table/index.d.ts +2 -2
  114. package/dist/components/effects/Aurora/Aurora.d.ts +6 -17
  115. package/dist/components/effects/Aurora/Aurora.js +310 -105
  116. package/dist/components/effects/Aurora/Aurora.types.d.ts +6 -0
  117. package/dist/components/effects/InteractiveCharacters/InteractiveCharacters.js +3 -3
  118. package/dist/components/effects/InteractiveCharacters/characters/BlobCharacter.js +13 -4
  119. package/dist/components/effects/InteractiveCharacters/characters/SmallCharacter.js +13 -4
  120. package/dist/components/effects/InteractiveCharacters/characters/TallCharacter.js +14 -4
  121. package/dist/components/effects/MorphingText/MorphingText.js +40 -7
  122. package/dist/components/effects/StripePattern/StripePattern.d.ts +18 -0
  123. package/dist/components/effects/StripePattern/StripePattern.js +54 -0
  124. package/dist/components/effects/StripePattern/StripePattern.types.d.ts +53 -0
  125. package/dist/components/effects/StripePattern/index.d.ts +2 -0
  126. package/dist/components/effects/index.d.ts +2 -0
  127. package/dist/components/effects/index.js +1 -0
  128. package/dist/components/forms/Checkbox/Checkbox.theme.js +1 -1
  129. package/dist/components/forms/Combobox/Combobox.js +1 -1
  130. package/dist/components/forms/Combobox/Combobox.theme.js +2 -4
  131. package/dist/components/forms/CronInput/CronInput.js +1 -1
  132. package/dist/components/forms/CronInput/CronInput.theme.js +22 -31
  133. package/dist/components/forms/DatePicker/DatePicker.theme.js +11 -18
  134. package/dist/components/forms/DatePicker/DatePickerTrigger.js +1 -1
  135. package/dist/components/forms/DateRangePicker/DateRangePicker.theme.js +7 -14
  136. package/dist/components/forms/DateRangePicker/DateRangePickerTrigger.js +1 -1
  137. package/dist/components/forms/FileUpload/FileUpload.animations.d.ts +29 -0
  138. package/dist/components/forms/FileUpload/FileUpload.animations.js +19 -0
  139. package/dist/components/forms/FileUpload/FileUpload.js +88 -49
  140. package/dist/components/forms/FileUpload/FileUpload.theme.d.ts +2 -10
  141. package/dist/components/forms/FileUpload/FileUpload.theme.js +16 -30
  142. package/dist/components/forms/FileUpload/FileUpload.types.d.ts +26 -10
  143. package/dist/components/forms/FileUpload/FileUploadProgress.js +27 -20
  144. package/dist/components/forms/FileUpload/FileUploadProgress.theme.js +2 -2
  145. package/dist/components/forms/Input/Input.theme.js +16 -15
  146. package/dist/components/forms/InputCounter/InputCounter.theme.js +1 -1
  147. package/dist/components/forms/Mention/Mention.js +152 -57
  148. package/dist/components/forms/Mention/Mention.theme.js +16 -23
  149. package/dist/components/forms/Mention/Mention.types.d.ts +12 -12
  150. package/dist/components/forms/Mention/Mention.utils.js +32 -4
  151. package/dist/components/forms/Radio/Radio.theme.js +1 -1
  152. package/dist/components/forms/RichTextEditor/RichTextEditor.d.ts +18 -0
  153. package/dist/components/forms/RichTextEditor/RichTextEditor.js +1231 -236
  154. package/dist/components/forms/RichTextEditor/RichTextEditor.theme.d.ts +53 -1
  155. package/dist/components/forms/RichTextEditor/RichTextEditor.theme.js +99 -25
  156. package/dist/components/forms/RichTextEditor/RichTextEditor.types.d.ts +42 -3
  157. package/dist/components/forms/RichTextEditor/index.d.ts +2 -2
  158. package/dist/components/forms/Select/Select.js +2 -2
  159. package/dist/components/forms/Select/Select.theme.js +3 -3
  160. package/dist/components/forms/Slider/Slider.theme.js +1 -1
  161. package/dist/components/forms/Switch/Switch.theme.js +1 -1
  162. package/dist/components/forms/TimePicker/TimePicker.theme.js +2 -2
  163. package/dist/components/forms/TimePicker/TimePickerContent.js +4 -0
  164. package/dist/components/forms/TimePicker/TimePickerTrigger.js +1 -1
  165. package/dist/components/forms/forms.theme.js +24 -19
  166. package/dist/components/forms/index.js +4 -0
  167. package/dist/components/layout/AppShell/AppShell.d.ts +10 -0
  168. package/dist/components/layout/AppShell/AppShell.js +84 -0
  169. package/dist/components/layout/AppShell/AppShell.theme.d.ts +3 -0
  170. package/dist/components/layout/AppShell/AppShell.theme.js +42 -0
  171. package/dist/components/layout/AppShell/AppShell.types.d.ts +127 -0
  172. package/dist/components/layout/AppShell/AppShellContext.d.ts +14 -0
  173. package/dist/components/layout/AppShell/AppShellContext.js +19 -0
  174. package/dist/components/layout/AppShell/AppShellFooter.d.ts +3 -0
  175. package/dist/components/layout/AppShell/AppShellFooter.js +12 -0
  176. package/dist/components/layout/AppShell/AppShellHeader.d.ts +3 -0
  177. package/dist/components/layout/AppShell/AppShellHeader.js +12 -0
  178. package/dist/components/layout/AppShell/AppShellMain.d.ts +3 -0
  179. package/dist/components/layout/AppShell/AppShellMain.js +19 -0
  180. package/dist/components/layout/AppShell/AppShellRightPanel.d.ts +3 -0
  181. package/dist/components/layout/AppShell/AppShellRightPanel.js +16 -0
  182. package/dist/components/layout/AppShell/AppShellSidebar.d.ts +3 -0
  183. package/dist/components/layout/AppShell/AppShellSidebar.js +16 -0
  184. package/dist/components/layout/AppShell/AppShellTopbar.d.ts +3 -0
  185. package/dist/components/layout/AppShell/AppShellTopbar.js +12 -0
  186. package/dist/components/layout/AppShell/index.d.ts +3 -0
  187. package/dist/components/layout/FormLayout/FormLayout.js +9 -4
  188. package/dist/components/layout/FormLayout/FormLayout.types.d.ts +3 -3
  189. package/dist/components/layout/FormLayout/FormLayoutSection.js +6 -1
  190. package/dist/components/layout/PageLayout/PageLayout.d.ts +2 -2
  191. package/dist/components/layout/PageLayout/PageLayout.js +23 -5
  192. package/dist/components/layout/PageLayout/PageLayout.theme.d.ts +2 -1
  193. package/dist/components/layout/PageLayout/PageLayout.theme.js +35 -6
  194. package/dist/components/layout/PageLayout/PageLayout.types.d.ts +45 -0
  195. package/dist/components/layout/PageLayout/PageLayoutContent.js +6 -4
  196. package/dist/components/layout/PageLayout/PageLayoutHeader.js +3 -3
  197. package/dist/components/layout/PageLayout/PageLayoutSidebar.js +5 -3
  198. package/dist/components/layout/PageLayout/index.d.ts +1 -1
  199. package/dist/components/layout/index.d.ts +1 -0
  200. package/dist/components/layout/index.js +2 -0
  201. package/dist/hooks/useSelectPortal.d.ts +10 -2
  202. package/dist/hooks/useSelectPortal.js +45 -24
  203. package/dist/index.js +8 -2
  204. package/dist/registry.json +10021 -0
  205. package/dist/styles.css +1 -1
  206. package/dist/utils/dateUtils.js +11 -1
  207. package/package.json +4 -2
  208. package/src/global.scss +29 -8
  209. package/src/styles/theme.css +174 -100
  210. package/dist/components/core/Sidebar/SidebarSubmenu.d.ts +0 -7
  211. 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-background)]",
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-background-tertiary)] transition-colors cursor-pointer focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary)]",
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-background-tertiary) text-(--color-primary) px-1.5 py-0.5 rounded text-base font-mono", ...props, children: children })] }));
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-background-tertiary)] rounded-full overflow-hidden",
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-background-tertiary)"
356
+ ? "var(--color-surface-sunken)"
357
357
  : shouldReduceOpacity
358
- ? "var(--color-background-tertiary)"
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-background-tertiary)"
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-background-tertiary)"
151
+ ? "var(--color-surface-sunken)"
152
152
  : shouldReduceOpacity
153
- ? "var(--color-background-tertiary)"
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-background-tertiary)]",
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-semibold min-h-[var(--button-min-h-sm)] px-[var(--button-px-sm)] py-[var(--button-py-sm)] text-sm",
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-semibold min-h-[var(--button-min-h-md)] px-[var(--button-px-md)] py-[var(--button-py-md)] text-sm",
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-semibold min-h-[var(--button-min-h-lg)] px-[var(--button-px-lg)] py-[var(--button-py-lg)] text-base",
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-semibold p-0 text-base h-fit",
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-white dark:bg-[var(--color-neutral-900)]",
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-background-tertiary)] 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)]",
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 { jsxs, jsx } from 'react/jsx-runtime';
1
+ import { jsx } from 'react/jsx-runtime';
2
2
  import React__default from 'react';
3
- import { cn } from '../../../utils/cn.js';
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, theme = commandPaletteTheme, }) => {
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 (jsxs("div", { "data-command-index": index, "data-highlighted": isHighlighted, "data-disabled": command.disabled || false, className: cn(theme.commandItem, className), role: "option", "aria-selected": isHighlighted, "aria-disabled": command.disabled || false, onClick: handleClick, onMouseEnter: handleMouseEnter, children: [finalContentStart && (jsx("div", { className: "flex-shrink-0", children: finalContentStart })), jsxs("div", { className: "flex-1 min-w-0", children: [jsx("div", { className: "text-base truncate", children: command.label }), command.subtitle && (jsx("div", { className: "text-base opacity-70 truncate mt-0", children: command.subtitle }))] }), renderContentEnd()] }));
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
- overlay: "fixed inset-0 bg-[var(--overlay-bg)] backdrop-blur-[var(--overlay-blur)] z-50 " +
3
- "flex items-start justify-center pt-[min(10vh,4rem)] px-4",
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-background)] rounded-[var(--modal-radius)] shadow-2xl shadow-black/30 " +
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-neutral-200)] dark:placeholder:text-[var(--color-neutral-500)]",
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
- commandItem: "flex items-center gap-3 px-4 py-2 rounded-[var(--radius-base)] cursor-pointer transition-colors " +
19
- "hover:bg-[var(--color-primary)] " +
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 (with space for check icon)
9
- itemStyle: `${dropdownTheme.itemBaseStyle} data-[checked=true]:pl-8`,
10
- // Checked state - tick icon positioning (absolute left)
11
- itemCheckedStyle: "absolute left-2.5 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--color-text-primary)] " +
12
- "dark:text-[var(--color-neutral-200)]",
13
- // Submenu trigger - based on Dropdown item style with chevron space
14
- subTriggerStyle: `${dropdownTheme.itemBaseStyle} pr-8 data-[state=open]:bg-[var(--color-background-tertiary)] ` +
15
- "dark:data-[state=open]:bg-[var(--color-neutral-700)]",
16
- // Submenu content - matches main dropdown menu style
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-background)] shadow-real-xl flex flex-col p-1 focus:outline-none " +
19
- "dark:bg-[var(--color-background-secondary)]",
20
- // Separator - horizontal divider
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,3 @@
1
+ import React from 'react';
2
+ import { DotSeparatorProps } from './DotSeparator.types';
3
+ export declare const DotSeparator: React.ForwardRefExoticComponent<DotSeparatorProps & React.RefAttributes<HTMLSpanElement>>;
@@ -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,2 @@
1
+ import { DotSeparatorTheme } from './DotSeparator.types';
2
+ export declare const dotSeparatorTheme: DotSeparatorTheme;
@@ -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
+ }
@@ -0,0 +1,3 @@
1
+ export { DotSeparator } from './DotSeparator';
2
+ export type { DotSeparatorProps, DotSeparatorSize, DotSeparatorTheme, DotSeparatorThemeOverrides, } from './DotSeparator.types';
3
+ export { dotSeparatorTheme } from './DotSeparator.theme';
@@ -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-white shadow-2xl shadow-black/30 " +
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-background-secondary)] dark:ring-white/5",
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-white shadow-real-xl focus:outline-none flex disabled:cursor-not-allowed " +
6
- "dark:bg-[var(--color-background-secondary)]",
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, "data-selected": isSelected, ...(selectionMode !== "none" ? { "aria-checked": isSelected } : {}), className: className, theme: {
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,6 @@
1
+ export declare const imagePlaceholderTheme: {
2
+ surfaceStyle: string;
3
+ borderedStyle: string;
4
+ roundedStyle: string;
5
+ contentStyle: string;
6
+ };
@@ -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
+ }
@@ -0,0 +1,2 @@
1
+ export { ImagePlaceholder } from "./ImagePlaceholder";
2
+ export type { ImagePlaceholderProps } from "./ImagePlaceholder.types";