@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
@@ -10,24 +10,22 @@ export interface NavItemSubmenuItem {
10
10
  active?: boolean;
11
11
  /** Whether this sub-item is disabled */
12
12
  isDisabled?: boolean;
13
- /** Badge text/number on the sub-item */
14
- badge?: string | number;
15
13
  /** Notification count/dot on the sub-item */
16
14
  notification?: number | boolean;
17
15
  /** Start content (icon) for the sub-item */
18
16
  startContent?: ReactNode;
19
17
  }
20
- export interface NavItemProps extends React.HTMLAttributes<HTMLDivElement> {
18
+ export interface NavItemProps extends React.HTMLAttributes<HTMLElement> {
21
19
  /**
22
20
  * Content of the navigation item
23
21
  */
24
22
  children: ReactNode;
25
23
  /**
26
- * Start content (icon), replaces `icon`
24
+ * Start content (icon)
27
25
  */
28
26
  startContent?: ReactNode;
29
27
  /**
30
- * End content (badge/arrow), replaces `badge`
28
+ * End content (badge/arrow)
31
29
  */
32
30
  endContent?: ReactNode;
33
31
  /**
@@ -38,16 +36,6 @@ export interface NavItemProps extends React.HTMLAttributes<HTMLDivElement> {
38
36
  * Keyboard shortcut (optional)
39
37
  */
40
38
  shortcut?: string;
41
- /**
42
- * Legacy icon prop (mapped to startContent)
43
- * @deprecated Use startContent instead
44
- */
45
- icon?: ReactNode;
46
- /**
47
- * Legacy badge prop (mapped to endContent)
48
- * @deprecated Use endContent instead
49
- */
50
- badge?: string | number;
51
39
  /**
52
40
  * Notification indicator. Pass a number for a count badge, or true for a dot.
53
41
  */
@@ -70,15 +58,6 @@ export interface NavItemProps extends React.HTMLAttributes<HTMLDivElement> {
70
58
  * @default false
71
59
  */
72
60
  isDisabled?: boolean;
73
- /**
74
- * Alias for isDisabled
75
- * @deprecated Use isDisabled
76
- */
77
- disabled?: boolean;
78
- /**
79
- * Whether the item represents a danger action
80
- */
81
- isDanger?: boolean;
82
61
  /**
83
62
  * Whether the item has a submenu (manual mode).
84
63
  * If `items` is provided, this is set automatically.
@@ -128,14 +107,14 @@ export interface NavItemTheme {
128
107
  default: string;
129
108
  active: string;
130
109
  disabled: string;
131
- hover: string;
132
110
  };
133
- iconStates?: {
134
- default?: string;
135
- active?: string;
136
- disabled?: string;
137
- hover?: string;
111
+ iconStates: {
112
+ default: string;
113
+ active: string;
114
+ disabled: string;
138
115
  };
116
+ /** Keyboard focus-visible ring */
117
+ focusStyle: string;
139
118
  levels: {
140
119
  0: string;
141
120
  1: string;
@@ -145,10 +124,10 @@ export interface NavItemTheme {
145
124
  container: string;
146
125
  icon: string;
147
126
  };
148
- activeIndicator?: string;
149
- notificationDot?: string;
150
- notificationBadge?: string;
151
- danger?: string;
127
+ density: {
128
+ compact: string;
129
+ };
130
+ notificationDot: string;
152
131
  }
153
132
  export interface NavItemThemeOverrides {
154
133
  baseStyle?: string;
@@ -158,14 +137,13 @@ export interface NavItemThemeOverrides {
158
137
  default: string;
159
138
  active: string;
160
139
  disabled: string;
161
- hover: string;
162
140
  }>;
163
141
  iconStates?: Partial<{
164
142
  default: string;
165
143
  active: string;
166
144
  disabled: string;
167
- hover: string;
168
145
  }>;
146
+ focusStyle?: string;
169
147
  levels?: Partial<{
170
148
  0: string;
171
149
  1: string;
@@ -175,8 +153,8 @@ export interface NavItemThemeOverrides {
175
153
  container: string;
176
154
  icon: string;
177
155
  }>;
178
- activeIndicator?: string;
156
+ density?: Partial<{
157
+ compact: string;
158
+ }>;
179
159
  notificationDot?: string;
180
- notificationBadge?: string;
181
- danger?: string;
182
160
  }
@@ -13,15 +13,15 @@ const paginationTheme = {
13
13
  // Base state - light
14
14
  "cursor-pointer bg-white border border-transparent text-[var(--color-text-muted)] " +
15
15
  // Base state - dark
16
- "dark:bg-[var(--color-neutral-800)] dark:text-[var(--color-neutral-400)] dark:border-transparent " +
16
+ "dark:bg-transparent dark:text-[var(--color-text-secondary)] dark:border-transparent " +
17
17
  // Hover state - light
18
18
  "hover:text-[var(--color-text-primary)] hover:bg-[var(--color-background-secondary)] hover:border-[var(--color-border)] " +
19
19
  // Hover state - dark
20
- "dark:hover:bg-[var(--color-neutral-700)] dark:hover:text-[var(--color-neutral-200)] dark:hover:border-[var(--color-neutral-600)] " +
20
+ "dark:hover:bg-[var(--color-surface-hover)] dark:hover:text-[var(--color-text-primary)] dark:hover:border-[var(--color-border)]/0 " +
21
21
  // Active state - light
22
22
  "data-[active=true]:bg-white data-[active=true]:border-[var(--color-border)] data-[active=true]:text-[var(--color-text-primary)] " +
23
23
  // Active state - dark (uses primary color accent)
24
- "dark:data-[active=true]:bg-[var(--color-primary-900)] dark:data-[active=true]:border-[var(--color-primary-700)] dark:data-[active=true]:text-[var(--color-primary-300)] " +
24
+ "dark:data-[active=true]:bg-[var(--color-neutral-800)] dark:data-[active=true]:border-none dark:data-[active=true]:text-[var(--color-text-primary)] " +
25
25
  // Disabled state
26
26
  "data-[disabled=true]:opacity-50 data-[disabled=true]:cursor-not-allowed data-[disabled=true]:pointer-events-none",
27
27
  // Unified item sizes
@@ -5,7 +5,7 @@ const popoverTheme = {
5
5
  // Base styles for the popover
6
6
  baseStyle: "z-50 outline-none",
7
7
  // Body styles
8
- bodyStyle: "bg-[var(--color-surface)] border border-[var(--color-border)] rounded-[var(--popover-radius)] shadow-real-xl p-4 max-w-[min(24rem,calc(100vw-2rem))] dark:bg-[var(--color-background-secondary)] ",
8
+ bodyStyle: "bg-[var(--color-surface-overlay)] border border-[var(--color-border)] rounded-[var(--popover-radius)] shadow-real-xl p-4 max-w-[min(24rem,calc(100vw-2rem))] dark:bg-[var(--color-surface-overlay)] ",
9
9
  };
10
10
 
11
11
  export { popoverTheme };
@@ -48,8 +48,12 @@ export interface PopoverBodyProps extends React.HTMLAttributes<HTMLDivElement> {
48
48
  children: ReactNode;
49
49
  animation?: boolean;
50
50
  portal?: boolean;
51
- /** Enable scroll support with viewport-aware max-height. Uses available
52
- * space computed by the positioning hook, falling back to 400px. */
51
+ /** Cap the body to the viewport-available height (space below/above the
52
+ * trigger, computed by the positioning hook; falls back to 400px) and add
53
+ * `overflow-y-auto`, so tall content scrolls inside the popover instead of
54
+ * extending past the viewport unreachably. `max-height` + `auto` means short
55
+ * popovers show no scrollbar. Set `false` to opt out (uncapped, may overflow).
56
+ * @default true */
53
57
  scrollable?: boolean;
54
58
  /** Custom max-height when scrollable is true (e.g. "300px", "20rem").
55
59
  * Overrides the default viewport-aware height. */
@@ -26,7 +26,7 @@ const overlayContentAnimations = {
26
26
  /**
27
27
  * PopoverBody component displays the body/content of the popover
28
28
  */
29
- const PopoverBody = React__default.forwardRef(({ children, className, animation = true, portal = true, scrollable = false, maxHeight, ...props }, ref) => {
29
+ const PopoverBody = React__default.forwardRef(({ children, className, animation = true, portal = true, scrollable = true, maxHeight, ...props }, ref) => {
30
30
  const { isOpen, onOpenChange, triggerRef, contentRef, placement, offset, triggerType, closeOnClickOutside, closeOnEsc, preventClose, hasBackdrop, theme, contentId, } = usePopoverContext();
31
31
  const shouldReduceMotion = useReducedMotion();
32
32
  const localRef = useRef(null);
@@ -45,13 +45,20 @@ const PopoverBody = React__default.forwardRef(({ children, className, animation
45
45
  });
46
46
  // Click outside detection (active when no backdrop — with backdrop, Overlay handles it)
47
47
  useClickOutside(localRef, (e) => {
48
- var _a;
48
+ var _a, _b, _c;
49
49
  if (hasBackdrop)
50
50
  return; // Overlay handles click-outside via backdrop
51
51
  if (e.target === triggerRef.current ||
52
52
  ((_a = triggerRef.current) === null || _a === void 0 ? void 0 : _a.contains(e.target))) {
53
53
  return;
54
54
  }
55
+ // Ignore clicks that land inside any FlikkUI overlay portal (a nested
56
+ // Select/Tooltip/Dropdown/Popover renders to document.body, outside our
57
+ // content ref — without this it would count as an outside click and
58
+ // dismiss the popover). See the `data-flikkui-portal` convention.
59
+ if ((_c = (_b = e.target) === null || _b === void 0 ? void 0 : _b.closest) === null || _c === void 0 ? void 0 : _c.call(_b, "[data-flikkui-portal]")) {
60
+ return;
61
+ }
55
62
  if (closeOnClickOutside && !preventClose) {
56
63
  onOpenChange(false);
57
64
  }
@@ -120,7 +127,7 @@ const PopoverBody = React__default.forwardRef(({ children, className, animation
120
127
  ? { duration: 0 }
121
128
  : popoverTransitions.content, "data-state": isOpen ? "open" : "closed", "data-placement": placement, "data-trigger": triggerType, onClick: (e) => e.stopPropagation(), ...domProps, children: children })) }));
122
129
  if (portal && isClient) {
123
- return createPortal(jsx("div", { className: isDarkMode ? "dark" : undefined, children: popoverContent }), document.body);
130
+ return createPortal(jsx("div", { "data-flikkui-portal": "", className: isDarkMode ? "dark" : undefined, children: popoverContent }), document.body);
124
131
  }
125
132
  return popoverContent;
126
133
  });
@@ -5,7 +5,7 @@ const progressTheme = {
5
5
  // Container styles
6
6
  containerStyle: "w-full",
7
7
  // Track (background) styles
8
- trackStyle: "relative w-full rounded-full bg-[var(--color-background-tertiary)] overflow-hidden",
8
+ trackStyle: "relative w-full rounded-full bg-[var(--color-surface-sunken)] overflow-hidden",
9
9
  // Fill (progress bar) styles — includes default primary color
10
10
  fillStyle: "h-full rounded-full bg-[var(--color-primary)]",
11
11
  // Label text styles
@@ -155,12 +155,12 @@ const ScrollArea = React__default.forwardRef(({ children, type = 'hover', size =
155
155
  case 'always':
156
156
  return [
157
157
  '[&::-webkit-scrollbar-thumb]:bg-[var(--color-border)]',
158
- '[&::-webkit-scrollbar-track]:bg-[var(--color-background-secondary)]',
158
+ '[&::-webkit-scrollbar-track]:bg-[var(--color-surface-sunken)]',
159
159
  ].join(' ');
160
160
  case 'scroll':
161
161
  return [
162
162
  '[&::-webkit-scrollbar-thumb]:bg-transparent',
163
- '[&[data-scrolling]::-webkit-scrollbar-thumb]:bg-black/30',
163
+ '[&[data-scrolling]::-webkit-scrollbar-thumb]:bg-[var(--color-border)]',
164
164
  '[&::-webkit-scrollbar-thumb]:transition-colors',
165
165
  '[&::-webkit-scrollbar-thumb]:duration-300',
166
166
  ].join(' ');
@@ -5,7 +5,7 @@
5
5
  const scrollAreaTheme = {
6
6
  baseStyle: 'relative h-full w-full',
7
7
  scrollbarStyle: 'flex touch-none select-none transition-colors duration-150',
8
- thumbStyle: 'relative flex-1 rounded-full bg-[var(--color-border)]',
8
+ thumbStyle: 'relative flex-1 rounded-full bg-[var(--color-border)]/60',
9
9
  };
10
10
 
11
11
  export { scrollAreaTheme };
@@ -19,13 +19,15 @@ const SegmentedComponent = React__default.forwardRef(({ value, onChange, size =
19
19
  return;
20
20
  const activeButton = containerRef.current.querySelector(`[data-value="${value}"]`);
21
21
  if (activeButton) {
22
- const containerRect = containerRef.current.getBoundingClientRect();
23
- const buttonRect = activeButton.getBoundingClientRect();
22
+ // Use offsetTop/offsetLeft (measured from the offsetParent's padding
23
+ // edge) so the sliding background aligns correctly when the container
24
+ // has a border. getBoundingClientRect() returns border-box coords,
25
+ // which would offset the bg by the container's border width.
24
26
  setActiveStyle({
25
- width: buttonRect.width,
26
- height: buttonRect.height,
27
- top: buttonRect.top - containerRect.top,
28
- transform: `translateX(${buttonRect.left - containerRect.left}px)`,
27
+ width: activeButton.offsetWidth,
28
+ height: activeButton.offsetHeight,
29
+ top: activeButton.offsetTop,
30
+ transform: `translateX(${activeButton.offsetLeft}px)`,
29
31
  });
30
32
  }
31
33
  }, [value]);
@@ -3,7 +3,7 @@
3
3
  */
4
4
  const segmentedTheme = {
5
5
  // Base styles for the segmented container
6
- baseStyle: "relative flex rounded-[var(--segmented-radius)] bg-[var(--color-background-tertiary)]/50 border-0 border-[var(--color-border)]/50 p-1 shadow-inner dark:bg-[var(--color-background-secondary)]",
6
+ baseStyle: "relative flex rounded-[var(--segmented-radius)] bg-[var(--color-surface)] border border-[var(--color-border)]/60 p-[var(--segmented-padding)] shadow-inner",
7
7
  // Size variants using CSS variables
8
8
  sizes: {
9
9
  sm: "min-h-[var(--segmented-min-h-sm)]",
@@ -15,14 +15,14 @@ const segmentedTheme = {
15
15
  // Disabled style
16
16
  disabledStyle: "opacity-50 cursor-not-allowed pointer-events-none",
17
17
  // Sliding background style with CSS variables
18
- slidingBackgroundStyle: "absolute top-[0px] left-[0px] rounded-[calc(var(--segmented-radius)-4px)] transition-transform duration-200 ease-out pointer-events-none z-0 bg-white dark:bg-[var(--color-background-tertiary)] shadow-real-md",
18
+ slidingBackgroundStyle: "absolute top-[0px] left-[0px] rounded-[var(--segmented-inner-radius)] transition-transform duration-200 ease-out pointer-events-none z-0 bg-white dark:bg-[var(--color-surface-raised)] shadow-real-lg",
19
19
  };
20
20
  /**
21
21
  * Default theme for the SegmentedItem component
22
22
  */
23
23
  const segmentedItemTheme = {
24
24
  // Base styles for the segmented item
25
- baseStyle: "relative flex min-w-fit flex-1 items-center justify-center transition-all duration-200 rounded-[calc(var(--segmented-radius)-4px)] font-medium cursor-pointer focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary-500)] focus-visible:ring-offset-1",
25
+ baseStyle: "relative flex min-w-fit flex-1 items-center justify-center whitespace-nowrap transition-all duration-200 rounded-[var(--segmented-inner-radius)] font-medium cursor-pointer focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary-500)] focus-visible:ring-offset-1",
26
26
  // Size variants using CSS variables
27
27
  sizes: {
28
28
  sm: "text-sm px-[var(--segmented-px-sm)]",
@@ -1,14 +1,16 @@
1
1
  import React from "react";
2
2
  import { SidebarProps } from "./Sidebar.types";
3
3
  export declare const Sidebar: React.ForwardRefExoticComponent<SidebarProps & React.RefAttributes<HTMLDivElement>> & {
4
+ Provider: React.FC<import("./Sidebar.types").SidebarProviderProps>;
4
5
  Header: React.ForwardRefExoticComponent<import("./Sidebar.types").SidebarHeaderProps & React.RefAttributes<HTMLDivElement>>;
5
6
  Content: React.ForwardRefExoticComponent<import("./Sidebar.types").SidebarContentProps & React.RefAttributes<HTMLDivElement>>;
6
7
  Footer: React.ForwardRefExoticComponent<import("./Sidebar.types").SidebarFooterProps & React.RefAttributes<HTMLDivElement>>;
7
8
  Nav: React.ForwardRefExoticComponent<import("./Sidebar.types").SidebarNavProps & React.RefAttributes<HTMLDivElement>>;
8
9
  NavGroup: React.ForwardRefExoticComponent<import("./Sidebar.types").SidebarNavGroupProps & React.RefAttributes<HTMLDivElement>>;
9
- Submenu: ({ children, isOpen, className, }: import("./SidebarSubmenu").SidebarSubmenuProps) => import("react/jsx-runtime").JSX.Element;
10
10
  Toggle: React.ForwardRefExoticComponent<import("./Sidebar.types").SidebarToggleProps & React.RefAttributes<HTMLButtonElement>>;
11
11
  MobileTrigger: React.ForwardRefExoticComponent<import("./Sidebar.types").SidebarMobileTriggerProps & React.RefAttributes<HTMLButtonElement>>;
12
12
  UserProfile: React.ForwardRefExoticComponent<import("./Sidebar.types").SidebarUserProfileProps & React.RefAttributes<HTMLDivElement>>;
13
13
  Logo: React.ForwardRefExoticComponent<import("./Sidebar.types").SidebarLogoProps & React.RefAttributes<HTMLDivElement>>;
14
+ Search: React.ForwardRefExoticComponent<import("./Sidebar.types").SidebarSearchProps & React.RefAttributes<HTMLInputElement>>;
15
+ Card: React.ForwardRefExoticComponent<import("./Sidebar.types").SidebarCardProps & React.RefAttributes<HTMLDivElement>>;
14
16
  };
@@ -1,31 +1,40 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
- import React__default, { useMemo } from 'react';
2
+ import React__default, { useMemo, useRef, useEffect } from 'react';
3
3
  import { cn } from '../../../utils/cn.js';
4
4
  import { motion, AnimatePresence } from 'motion/react';
5
5
  import { sidebarTheme } from './Sidebar.theme.js';
6
+ import { useFocusTrap } from '../../../hooks/useFocusTrap.js';
6
7
  import { useSidebarContext, SidebarProvider } from './SidebarContext.js';
7
8
  import { SidebarHeader } from './SidebarHeader.js';
8
9
  import { SidebarContent } from './SidebarContent.js';
9
10
  import { SidebarFooter } from './SidebarFooter.js';
10
11
  import { SidebarNav } from './SidebarNav.js';
11
12
  import { SidebarNavGroup } from './SidebarNavGroup.js';
12
- import { SidebarSubmenu } from './SidebarSubmenu.js';
13
13
  import { SidebarToggle } from './SidebarToggle.js';
14
14
  import { SidebarMobileTrigger } from './SidebarMobileTrigger.js';
15
15
  import { SidebarUserProfile } from './SidebarUserProfile.js';
16
16
  import { SidebarLogo } from './SidebarLogo.js';
17
+ import { SidebarSearch } from './SidebarSearch.js';
18
+ import { SidebarCard } from './SidebarCard.js';
17
19
 
20
+ // Subtle spring on the sidebar's width animation. Stiffness/damping picked so
21
+ // the effective duration sits in the same ~200ms window as the internal CSS
22
+ // transitions on padding/gap (Tailwind `duration-200`), but with a soft
23
+ // organic settle instead of a linear cubic-bezier. Damping ratio ≈ 0.9 — a
24
+ // hair under critical so there's a barely-perceptible easing-into-final
25
+ // rather than an overshoot/bounce.
18
26
  const SIDEBAR_TRANSITION = {
19
- type: "tween",
20
- duration: 0.22,
21
- ease: [0.4, 0, 0.2, 1],
27
+ type: "spring",
28
+ stiffness: 320,
29
+ damping: 34,
30
+ mass: 1,
22
31
  };
23
- const SidebarDesktop = React__default.forwardRef(({ side = "left", variant = "sidebar", width, children, className, theme: customTheme = {}, ...props }, ref) => {
24
- var _a, _b, _c;
32
+ const SidebarDesktop = React__default.forwardRef(({ side = "left", variant = "sidebar", density, width, children, className, theme: customTheme = {}, ...props }, ref) => {
33
+ var _a, _b, _c, _d;
25
34
  const context = useSidebarContext();
26
35
  const collapsed = (_a = context === null || context === void 0 ? void 0 : context.collapsed) !== null && _a !== void 0 ? _a : false;
27
36
  const expandedWidth = (width === null || width === void 0 ? void 0 : width.expanded) || ((_b = context === null || context === void 0 ? void 0 : context.width) === null || _b === void 0 ? void 0 : _b.expanded) || 280;
28
- const collapsedWidth = (width === null || width === void 0 ? void 0 : width.collapsed) || ((_c = context === null || context === void 0 ? void 0 : context.width) === null || _c === void 0 ? void 0 : _c.collapsed) || 64;
37
+ const collapsedWidth = (width === null || width === void 0 ? void 0 : width.collapsed) || ((_c = context === null || context === void 0 ? void 0 : context.width) === null || _c === void 0 ? void 0 : _c.collapsed) || 60;
29
38
  const theme = useMemo(() => ({
30
39
  ...sidebarTheme,
31
40
  ...customTheme,
@@ -38,19 +47,41 @@ const SidebarDesktop = React__default.forwardRef(({ side = "left", variant = "si
38
47
  width: collapsed ? collapsedWidth : expandedWidth,
39
48
  maxWidth: "100vw",
40
49
  }), [collapsed, collapsedWidth, expandedWidth]);
41
- return (jsx(motion.div, { ref: ref, className: sidebarClasses, "data-side": side, "data-variant": variant, "data-collapsed": collapsed, initial: false, animate: animateValue, transition: SIDEBAR_TRANSITION, ...motionSafeProps, children: children }));
50
+ return (jsx(motion.aside, { ref: ref, className: sidebarClasses, "aria-label": "Sidebar", "data-side": side, "data-variant": variant, "data-density": (_d = density !== null && density !== void 0 ? density : context === null || context === void 0 ? void 0 : context.density) !== null && _d !== void 0 ? _d : "comfortable", "data-collapsed": collapsed, initial: false, animate: animateValue, transition: SIDEBAR_TRANSITION, ...motionSafeProps, children: children }));
42
51
  });
43
52
  SidebarDesktop.displayName = "SidebarDesktop";
44
53
  const SidebarMobile = ({ children, className, theme: customTheme = {} }) => {
54
+ var _a, _b, _c, _d;
45
55
  const context = useSidebarContext();
46
- if (!context)
47
- return null;
48
- const { isMobileOpen, setMobileOpen } = context;
56
+ const panelRef = useRef(null);
57
+ // Hooks must run unconditionally — keep above any early return
49
58
  const theme = useMemo(() => ({
50
59
  ...sidebarTheme,
51
60
  ...customTheme,
52
61
  }), [customTheme]);
53
- return (jsx(AnimatePresence, { children: isMobileOpen && (jsxs(Fragment, { children: [jsx(motion.div, { className: cn(theme.mobileBackdrop), initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, transition: { duration: 0.2 }, onClick: () => setMobileOpen(false), "aria-hidden": "true" }), jsx(motion.div, { className: cn(theme.mobileOverlay, className), initial: { opacity: 0, y: 20 }, animate: { opacity: 1, y: 0 }, exit: { opacity: 0, y: 20 }, transition: { type: "spring", stiffness: 400, damping: 35 }, role: "dialog", "aria-modal": "true", "aria-label": "Navigation menu", children: children })] })) }));
62
+ const isMobileOpen = (_a = context === null || context === void 0 ? void 0 : context.isMobileOpen) !== null && _a !== void 0 ? _a : false;
63
+ const side = (_b = context === null || context === void 0 ? void 0 : context.side) !== null && _b !== void 0 ? _b : "left";
64
+ const panelWidth = (_d = (_c = context === null || context === void 0 ? void 0 : context.width) === null || _c === void 0 ? void 0 : _c.expanded) !== null && _d !== void 0 ? _d : 280;
65
+ // Trap focus inside the open drawer; focus returns to trigger on close.
66
+ useFocusTrap(panelRef, isMobileOpen);
67
+ // Close on Escape while the drawer is open.
68
+ useEffect(() => {
69
+ if (!isMobileOpen)
70
+ return;
71
+ const onKeyDown = (e) => {
72
+ if (e.key === "Escape")
73
+ context === null || context === void 0 ? void 0 : context.setMobileOpen(false);
74
+ };
75
+ document.addEventListener("keydown", onKeyDown);
76
+ return () => document.removeEventListener("keydown", onKeyDown);
77
+ }, [isMobileOpen, context]);
78
+ if (!context)
79
+ return null;
80
+ const { setMobileOpen } = context;
81
+ const offscreen = side === "left" ? "-100%" : "100%";
82
+ return (jsx(AnimatePresence, { children: isMobileOpen && (jsxs(Fragment, { children: [jsx(motion.div, { className: cn(theme.mobileBackdrop), initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, transition: { duration: 0.2 }, onClick: () => setMobileOpen(false), "aria-hidden": "true" }), jsx(motion.div, { ref: panelRef, className: cn(theme.mobileOverlay, side === "left"
83
+ ? "left-0 rounded-r-xl border-r"
84
+ : "right-0 rounded-l-xl border-l rounded-r-none border-r-0", className), style: { width: panelWidth }, initial: { x: offscreen }, animate: { x: 0 }, exit: { x: offscreen }, transition: { type: "spring", stiffness: 400, damping: 38 }, role: "dialog", "aria-modal": "true", "aria-label": "Navigation menu", children: children })] })) }));
54
85
  };
55
86
  const SidebarContainer = React__default.forwardRef((props, ref) => {
56
87
  const context = useSidebarContext();
@@ -60,21 +91,27 @@ const SidebarContainer = React__default.forwardRef((props, ref) => {
60
91
  return jsx(SidebarDesktop, { ref: ref, ...props });
61
92
  });
62
93
  SidebarContainer.displayName = "SidebarContainer";
63
- const SidebarRoot = React__default.forwardRef(({ side = "left", variant = "sidebar", defaultCollapsed = false, collapsed: controlledCollapsed, onCollapsedChange, mobileBreakpoint, mobileOpen, onMobileOpenChange, width, children, className, theme: customTheme = {}, ...props }, ref) => {
64
- return (jsx(SidebarProvider, { defaultCollapsed: defaultCollapsed, collapsed: controlledCollapsed, onCollapsedChange: onCollapsedChange, mobileBreakpoint: mobileBreakpoint, mobileOpen: mobileOpen, onMobileOpenChange: onMobileOpenChange, width: width, side: side, variant: variant, children: jsx(SidebarContainer, { ref: ref, className: className, theme: customTheme, side: side, variant: variant, width: width, ...props, children: children }) }));
94
+ const SidebarRoot = React__default.forwardRef(({ side = "left", variant = "sidebar", defaultCollapsed = false, collapsed: controlledCollapsed, onCollapsedChange, density = "comfortable", mobileBreakpoint, mobileOpen, onMobileOpenChange, width, children, className, theme: customTheme = {}, ...props }, ref) => {
95
+ const existingContext = useSidebarContext();
96
+ if (existingContext) {
97
+ return (jsx(SidebarContainer, { ref: ref, className: className, theme: customTheme, side: side, variant: variant, density: density, width: width, ...props, children: children }));
98
+ }
99
+ return (jsx(SidebarProvider, { defaultCollapsed: defaultCollapsed, collapsed: controlledCollapsed, onCollapsedChange: onCollapsedChange, density: density, mobileBreakpoint: mobileBreakpoint, mobileOpen: mobileOpen, onMobileOpenChange: onMobileOpenChange, width: width, side: side, variant: variant, children: jsx(SidebarContainer, { ref: ref, className: className, theme: customTheme, side: side, variant: variant, density: density, width: width, ...props, children: children }) }));
65
100
  });
66
101
  SidebarRoot.displayName = "Sidebar";
67
102
  const Sidebar = Object.assign(SidebarRoot, {
103
+ Provider: SidebarProvider,
68
104
  Header: SidebarHeader,
69
105
  Content: SidebarContent,
70
106
  Footer: SidebarFooter,
71
107
  Nav: SidebarNav,
72
108
  NavGroup: SidebarNavGroup,
73
- Submenu: SidebarSubmenu,
74
109
  Toggle: SidebarToggle,
75
110
  MobileTrigger: SidebarMobileTrigger,
76
111
  UserProfile: SidebarUserProfile,
77
112
  Logo: SidebarLogo,
113
+ Search: SidebarSearch,
114
+ Card: SidebarCard,
78
115
  });
79
116
 
80
117
  export { Sidebar };
@@ -1,18 +1,16 @@
1
1
  const sidebarTheme = {
2
- baseStyle: 'flex flex-col h-full bg-[var(--color-background)] overflow-hidden',
2
+ baseStyle: 'group flex flex-col h-full bg-[var(--color-background)] overflow-visible transition-colors duration-200 relative',
3
3
  variants: {
4
4
  sidebar: 'relative',
5
- floating: 'rounded-[var(--radius-base)] shadow-lg border border-[var(--color-border)]',
6
- inset: 'rounded-[var(--radius-base)] bg-[var(--color-background-secondary)] border border-[var(--color-border)]',
5
+ floating: 'relative m-3 h-[calc(100%-1.5rem)] rounded-xl border border-[var(--color-border)] bg-[color-mix(in_oklab,var(--color-background)_85%,transparent)] backdrop-blur-md shadow-[0_8px_30px_rgba(0,0,0,0.03),inset_0_1px_0_rgba(255,255,255,0.05)]',
6
+ inset: 'relative m-3 h-[calc(100%-1.5rem)] rounded-xl bg-[var(--color-background-secondary)] border border-[var(--color-border)] shadow-sm',
7
7
  },
8
8
  sides: {
9
9
  left: 'border-r border-[var(--color-border)]',
10
10
  right: 'border-l border-[var(--color-border)]',
11
11
  },
12
- collapsed: 'w-16',
13
- expanded: 'w-[280px]',
14
- mobileOverlay: 'fixed inset-0 z-50 flex flex-col bg-[var(--color-background)]',
15
- mobileBackdrop: 'fixed inset-0 z-40 bg-black/50 backdrop-blur-sm',
12
+ mobileOverlay: 'fixed inset-y-0 z-50 flex flex-col bg-[var(--color-background)] shadow-2xl max-w-[85vw] border-[var(--color-border)]',
13
+ mobileBackdrop: 'fixed inset-0 z-40 bg-black/40 backdrop-blur-sm',
16
14
  };
17
15
 
18
16
  export { sidebarTheme };