@mihcm/ui 0.14.1 → 0.15.0

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 (300) hide show
  1. package/dist/CheckboxGrid.native.d.ts.map +1 -1
  2. package/dist/CheckboxGrid.native.js +2 -1
  3. package/dist/CheckboxGrid.native.js.map +1 -1
  4. package/dist/Combobox.native.d.ts.map +1 -1
  5. package/dist/Combobox.native.js +2 -1
  6. package/dist/Combobox.native.js.map +1 -1
  7. package/dist/DataTable/column-filter.d.ts +8 -0
  8. package/dist/DataTable/column-filter.d.ts.map +1 -0
  9. package/dist/DataTable/column-filter.js +67 -0
  10. package/dist/DataTable/column-filter.js.map +1 -0
  11. package/dist/DataTable/column-header.d.ts +16 -0
  12. package/dist/DataTable/column-header.d.ts.map +1 -0
  13. package/dist/DataTable/column-header.js +11 -0
  14. package/dist/DataTable/column-header.js.map +1 -0
  15. package/dist/DataTable/column-visibility.d.ts +7 -0
  16. package/dist/DataTable/column-visibility.d.ts.map +1 -0
  17. package/dist/DataTable/column-visibility.js +35 -0
  18. package/dist/DataTable/column-visibility.js.map +1 -0
  19. package/dist/DataTable/index.d.ts +5 -0
  20. package/dist/DataTable/index.d.ts.map +1 -0
  21. package/dist/DataTable/index.js +5 -0
  22. package/dist/DataTable/index.js.map +1 -0
  23. package/dist/DataTable/pinning.d.ts +13 -0
  24. package/dist/DataTable/pinning.d.ts.map +1 -0
  25. package/dist/DataTable/pinning.js +29 -0
  26. package/dist/DataTable/pinning.js.map +1 -0
  27. package/dist/DataTable.d.ts +3 -7
  28. package/dist/DataTable.d.ts.map +1 -1
  29. package/dist/DataTable.js +7 -126
  30. package/dist/DataTable.js.map +1 -1
  31. package/dist/Dialog.native.d.ts +3 -1
  32. package/dist/Dialog.native.d.ts.map +1 -1
  33. package/dist/Dialog.native.js +2 -2
  34. package/dist/Dialog.native.js.map +1 -1
  35. package/dist/Form/building-blocks.d.ts +26 -0
  36. package/dist/Form/building-blocks.d.ts.map +1 -0
  37. package/dist/Form/building-blocks.js +29 -0
  38. package/dist/Form/building-blocks.js.map +1 -0
  39. package/dist/Form/fields-choice.d.ts +72 -0
  40. package/dist/Form/fields-choice.d.ts.map +1 -0
  41. package/dist/Form/fields-choice.js +69 -0
  42. package/dist/Form/fields-choice.js.map +1 -0
  43. package/dist/Form/fields-complex.d.ts +28 -0
  44. package/dist/Form/fields-complex.d.ts.map +1 -0
  45. package/dist/Form/fields-complex.js +38 -0
  46. package/dist/Form/fields-complex.js.map +1 -0
  47. package/dist/Form/fields-date.d.ts +46 -0
  48. package/dist/Form/fields-date.d.ts.map +1 -0
  49. package/dist/Form/fields-date.js +41 -0
  50. package/dist/Form/fields-date.js.map +1 -0
  51. package/dist/Form/fields-text.d.ts +47 -0
  52. package/dist/Form/fields-text.d.ts.map +1 -0
  53. package/dist/Form/fields-text.js +46 -0
  54. package/dist/Form/fields-text.js.map +1 -0
  55. package/dist/Form/fields-toggle.d.ts +24 -0
  56. package/dist/Form/fields-toggle.d.ts.map +1 -0
  57. package/dist/Form/fields-toggle.js +32 -0
  58. package/dist/Form/fields-toggle.js.map +1 -0
  59. package/dist/Form/helpers.d.ts +66 -0
  60. package/dist/Form/helpers.d.ts.map +1 -0
  61. package/dist/Form/helpers.js +44 -0
  62. package/dist/Form/helpers.js.map +1 -0
  63. package/dist/Form/types.d.ts +25 -0
  64. package/dist/Form/types.d.ts.map +1 -0
  65. package/dist/Form/types.js +8 -0
  66. package/dist/Form/types.js.map +1 -0
  67. package/dist/Form.d.ts +24 -298
  68. package/dist/Form.d.ts.map +1 -1
  69. package/dist/Form.js +30 -246
  70. package/dist/Form.js.map +1 -1
  71. package/dist/IconSidebar.d.ts +6 -46
  72. package/dist/IconSidebar.d.ts.map +1 -1
  73. package/dist/IconSidebar.js +6 -116
  74. package/dist/IconSidebar.js.map +1 -1
  75. package/dist/MainSidebar/back-button.d.ts +14 -0
  76. package/dist/MainSidebar/back-button.d.ts.map +1 -0
  77. package/dist/MainSidebar/back-button.js +14 -0
  78. package/dist/MainSidebar/back-button.js.map +1 -0
  79. package/dist/MainSidebar/breadcrumb.d.ts +10 -0
  80. package/dist/MainSidebar/breadcrumb.d.ts.map +1 -0
  81. package/dist/MainSidebar/breadcrumb.js +24 -0
  82. package/dist/MainSidebar/breadcrumb.js.map +1 -0
  83. package/dist/MainSidebar/columns.d.ts +3 -0
  84. package/dist/MainSidebar/columns.d.ts.map +1 -0
  85. package/dist/MainSidebar/columns.js +198 -0
  86. package/dist/MainSidebar/columns.js.map +1 -0
  87. package/dist/MainSidebar/command.d.ts +3 -0
  88. package/dist/MainSidebar/command.d.ts.map +1 -0
  89. package/dist/MainSidebar/command.js +193 -0
  90. package/dist/MainSidebar/command.js.map +1 -0
  91. package/dist/MainSidebar/drilldown.d.ts +3 -0
  92. package/dist/MainSidebar/drilldown.d.ts.map +1 -0
  93. package/dist/MainSidebar/drilldown.js +154 -0
  94. package/dist/MainSidebar/drilldown.js.map +1 -0
  95. package/dist/MainSidebar/expanded.d.ts +7 -0
  96. package/dist/MainSidebar/expanded.d.ts.map +1 -0
  97. package/dist/MainSidebar/expanded.js +102 -0
  98. package/dist/MainSidebar/expanded.js.map +1 -0
  99. package/dist/MainSidebar/floating.d.ts +3 -0
  100. package/dist/MainSidebar/floating.d.ts.map +1 -0
  101. package/dist/MainSidebar/floating.js +116 -0
  102. package/dist/MainSidebar/floating.js.map +1 -0
  103. package/dist/MainSidebar/helpers.d.ts +50 -0
  104. package/dist/MainSidebar/helpers.d.ts.map +1 -0
  105. package/dist/MainSidebar/helpers.js +148 -0
  106. package/dist/MainSidebar/helpers.js.map +1 -0
  107. package/dist/MainSidebar/hover.d.ts +3 -0
  108. package/dist/MainSidebar/hover.d.ts.map +1 -0
  109. package/dist/MainSidebar/hover.js +177 -0
  110. package/dist/MainSidebar/hover.js.map +1 -0
  111. package/dist/MainSidebar/index.d.ts +6 -0
  112. package/dist/MainSidebar/index.d.ts.map +1 -0
  113. package/dist/MainSidebar/index.js +108 -0
  114. package/dist/MainSidebar/index.js.map +1 -0
  115. package/dist/MainSidebar/mobile.d.ts +29 -0
  116. package/dist/MainSidebar/mobile.d.ts.map +1 -0
  117. package/dist/MainSidebar/mobile.js +38 -0
  118. package/dist/MainSidebar/mobile.js.map +1 -0
  119. package/dist/MainSidebar/motion.d.ts +23 -0
  120. package/dist/MainSidebar/motion.d.ts.map +1 -0
  121. package/dist/MainSidebar/motion.js +40 -0
  122. package/dist/MainSidebar/motion.js.map +1 -0
  123. package/dist/MainSidebar/rail.d.ts +24 -0
  124. package/dist/MainSidebar/rail.d.ts.map +1 -0
  125. package/dist/MainSidebar/rail.js +29 -0
  126. package/dist/MainSidebar/rail.js.map +1 -0
  127. package/dist/MainSidebar/search.d.ts +19 -0
  128. package/dist/MainSidebar/search.d.ts.map +1 -0
  129. package/dist/MainSidebar/search.js +33 -0
  130. package/dist/MainSidebar/search.js.map +1 -0
  131. package/dist/MainSidebar/types.d.ts +161 -0
  132. package/dist/MainSidebar/types.d.ts.map +1 -0
  133. package/dist/MainSidebar/types.js +2 -0
  134. package/dist/MainSidebar/types.js.map +1 -0
  135. package/dist/MainSidebar.d.ts +6 -1
  136. package/dist/MainSidebar.d.ts.map +1 -1
  137. package/dist/MainSidebar.js +6 -1
  138. package/dist/MainSidebar.js.map +1 -1
  139. package/dist/NavigationMenu.js +1 -1
  140. package/dist/NavigationMenu.js.map +1 -1
  141. package/dist/RichTextEditor/theme.d.ts +44 -0
  142. package/dist/RichTextEditor/theme.d.ts.map +1 -0
  143. package/dist/RichTextEditor/theme.js +41 -0
  144. package/dist/RichTextEditor/theme.js.map +1 -0
  145. package/dist/RichTextEditor/toolbar-icons.d.ts +21 -0
  146. package/dist/RichTextEditor/toolbar-icons.d.ts.map +1 -0
  147. package/dist/RichTextEditor/toolbar-icons.js +21 -0
  148. package/dist/RichTextEditor/toolbar-icons.js.map +1 -0
  149. package/dist/RichTextEditor/toolbar.d.ts +5 -0
  150. package/dist/RichTextEditor/toolbar.d.ts.map +1 -0
  151. package/dist/RichTextEditor/toolbar.js +116 -0
  152. package/dist/RichTextEditor/toolbar.js.map +1 -0
  153. package/dist/RichTextEditor.d.ts +16 -9
  154. package/dist/RichTextEditor.d.ts.map +1 -1
  155. package/dist/RichTextEditor.js +18 -164
  156. package/dist/RichTextEditor.js.map +1 -1
  157. package/dist/Select/content.d.ts +9 -0
  158. package/dist/Select/content.d.ts.map +1 -0
  159. package/dist/Select/content.js +80 -0
  160. package/dist/Select/content.js.map +1 -0
  161. package/dist/Select/context.d.ts +27 -0
  162. package/dist/Select/context.d.ts.map +1 -0
  163. package/dist/Select/context.js +35 -0
  164. package/dist/Select/context.js.map +1 -0
  165. package/dist/Select/item.d.ts +13 -0
  166. package/dist/Select/item.d.ts.map +1 -0
  167. package/dist/Select/item.js +39 -0
  168. package/dist/Select/item.js.map +1 -0
  169. package/dist/Select/parts.d.ts +14 -0
  170. package/dist/Select/parts.d.ts.map +1 -0
  171. package/dist/Select/parts.js +17 -0
  172. package/dist/Select/parts.js.map +1 -0
  173. package/dist/Select/react-select.d.ts +25 -0
  174. package/dist/Select/react-select.d.ts.map +1 -0
  175. package/dist/Select/react-select.js +66 -0
  176. package/dist/Select/react-select.js.map +1 -0
  177. package/dist/Select/root.d.ts +15 -0
  178. package/dist/Select/root.d.ts.map +1 -0
  179. package/dist/Select/root.js +41 -0
  180. package/dist/Select/root.js.map +1 -0
  181. package/dist/Select/trigger.d.ts +15 -0
  182. package/dist/Select/trigger.d.ts.map +1 -0
  183. package/dist/Select/trigger.js +61 -0
  184. package/dist/Select/trigger.js.map +1 -0
  185. package/dist/Select.d.ts +14 -62
  186. package/dist/Select.d.ts.map +1 -1
  187. package/dist/Select.js +14 -293
  188. package/dist/Select.js.map +1 -1
  189. package/dist/Sidebar/context.d.ts +28 -0
  190. package/dist/Sidebar/context.d.ts.map +1 -0
  191. package/dist/Sidebar/context.js +37 -0
  192. package/dist/Sidebar/context.js.map +1 -0
  193. package/dist/Sidebar/group.d.ts +13 -0
  194. package/dist/Sidebar/group.d.ts.map +1 -0
  195. package/dist/Sidebar/group.js +20 -0
  196. package/dist/Sidebar/group.js.map +1 -0
  197. package/dist/Sidebar/icons.d.ts +7 -0
  198. package/dist/Sidebar/icons.d.ts.map +1 -0
  199. package/dist/Sidebar/icons.js +12 -0
  200. package/dist/Sidebar/icons.js.map +1 -0
  201. package/dist/Sidebar/layout.d.ts +9 -0
  202. package/dist/Sidebar/layout.d.ts.map +1 -0
  203. package/dist/Sidebar/layout.js +21 -0
  204. package/dist/Sidebar/layout.js.map +1 -0
  205. package/dist/Sidebar/menu.d.ts +29 -0
  206. package/dist/Sidebar/menu.d.ts.map +1 -0
  207. package/dist/Sidebar/menu.js +55 -0
  208. package/dist/Sidebar/menu.js.map +1 -0
  209. package/dist/Sidebar/provider.d.ts +33 -0
  210. package/dist/Sidebar/provider.d.ts.map +1 -0
  211. package/dist/Sidebar/provider.js +110 -0
  212. package/dist/Sidebar/provider.js.map +1 -0
  213. package/dist/Sidebar/sidebar.d.ts +17 -0
  214. package/dist/Sidebar/sidebar.d.ts.map +1 -0
  215. package/dist/Sidebar/sidebar.js +51 -0
  216. package/dist/Sidebar/sidebar.js.map +1 -0
  217. package/dist/Sidebar/submenu.d.ts +13 -0
  218. package/dist/Sidebar/submenu.d.ts.map +1 -0
  219. package/dist/Sidebar/submenu.js +17 -0
  220. package/dist/Sidebar/submenu.js.map +1 -0
  221. package/dist/Sidebar/trigger.d.ts +9 -0
  222. package/dist/Sidebar/trigger.d.ts.map +1 -0
  223. package/dist/Sidebar/trigger.js +33 -0
  224. package/dist/Sidebar/trigger.js.map +1 -0
  225. package/dist/Sidebar.d.ts +14 -104
  226. package/dist/Sidebar.d.ts.map +1 -1
  227. package/dist/Sidebar.js +14 -300
  228. package/dist/Sidebar.js.map +1 -1
  229. package/dist/StatCard.d.ts +67 -9
  230. package/dist/StatCard.d.ts.map +1 -1
  231. package/dist/StatCard.js +111 -9
  232. package/dist/StatCard.js.map +1 -1
  233. package/dist/TransferList.native.d.ts.map +1 -1
  234. package/dist/TransferList.native.js +2 -1
  235. package/dist/TransferList.native.js.map +1 -1
  236. package/package.json +2 -2
  237. package/src/CheckboxGrid.native.tsx +2 -1
  238. package/src/Combobox.native.tsx +2 -1
  239. package/src/DataTable/column-filter.tsx +134 -0
  240. package/src/DataTable/column-header.tsx +67 -0
  241. package/src/DataTable/column-visibility.tsx +87 -0
  242. package/src/DataTable/index.ts +4 -0
  243. package/src/DataTable/pinning.ts +40 -0
  244. package/src/DataTable.tsx +14 -297
  245. package/src/Dialog.native.tsx +4 -2
  246. package/src/Form/building-blocks.tsx +97 -0
  247. package/src/Form/fields-choice.tsx +312 -0
  248. package/src/Form/fields-complex.tsx +195 -0
  249. package/src/Form/fields-date.tsx +195 -0
  250. package/src/Form/fields-text.tsx +218 -0
  251. package/src/Form/fields-toggle.tsx +123 -0
  252. package/src/Form/helpers.tsx +189 -0
  253. package/src/Form/types.ts +26 -0
  254. package/src/Form.tsx +91 -1308
  255. package/src/IconSidebar.tsx +20 -442
  256. package/src/MainSidebar/back-button.tsx +58 -0
  257. package/src/MainSidebar/breadcrumb.tsx +53 -0
  258. package/src/MainSidebar/columns.tsx +350 -0
  259. package/src/MainSidebar/command.tsx +404 -0
  260. package/src/MainSidebar/drilldown.tsx +373 -0
  261. package/src/MainSidebar/expanded.tsx +414 -0
  262. package/src/MainSidebar/floating.tsx +268 -0
  263. package/src/MainSidebar/helpers.ts +164 -0
  264. package/src/MainSidebar/hover.tsx +334 -0
  265. package/src/MainSidebar/index.tsx +191 -0
  266. package/src/MainSidebar/mobile.tsx +117 -0
  267. package/src/MainSidebar/motion.ts +64 -0
  268. package/src/MainSidebar/rail.tsx +137 -0
  269. package/src/MainSidebar/search.tsx +99 -0
  270. package/src/MainSidebar/types.ts +208 -0
  271. package/src/MainSidebar.tsx +15 -4
  272. package/src/NavigationMenu.tsx +1 -1
  273. package/src/RichTextEditor/theme.ts +43 -0
  274. package/src/RichTextEditor/toolbar-icons.tsx +40 -0
  275. package/src/RichTextEditor/toolbar.tsx +271 -0
  276. package/src/RichTextEditor.tsx +23 -371
  277. package/src/Select/content.tsx +111 -0
  278. package/src/Select/context.tsx +66 -0
  279. package/src/Select/item.tsx +97 -0
  280. package/src/Select/parts.tsx +43 -0
  281. package/src/Select/react-select.tsx +216 -0
  282. package/src/Select/root.tsx +75 -0
  283. package/src/Select/trigger.tsx +122 -0
  284. package/src/Select.tsx +34 -692
  285. package/src/Sidebar/context.tsx +72 -0
  286. package/src/Sidebar/group.tsx +69 -0
  287. package/src/Sidebar/icons.tsx +42 -0
  288. package/src/Sidebar/layout.tsx +64 -0
  289. package/src/Sidebar/menu.tsx +171 -0
  290. package/src/Sidebar/provider.tsx +224 -0
  291. package/src/Sidebar/sidebar.tsx +178 -0
  292. package/src/Sidebar/submenu.tsx +58 -0
  293. package/src/Sidebar/trigger.tsx +104 -0
  294. package/src/Sidebar.tsx +44 -927
  295. package/src/StatCard.tsx +365 -20
  296. package/src/TransferList.native.tsx +2 -1
  297. package/dist/TiptapEditor.d.ts +0 -24
  298. package/dist/TiptapEditor.d.ts.map +0 -1
  299. package/dist/TiptapEditor.js +0 -84
  300. package/dist/TiptapEditor.js.map +0 -1
@@ -0,0 +1,148 @@
1
+ import { isValidElement } from 'react';
2
+ /**
3
+ * `MainSidebarItem.badge` accepts either a primitive (string/number) — in
4
+ * which case the variant wraps it in a default pill — or a fully-styled
5
+ * ReactElement (e.g. `<Badge variant="warning">12</Badge>`), which should
6
+ * render as-is to avoid double backgrounds.
7
+ */
8
+ export function isPrimitiveBadge(badge) {
9
+ return typeof badge === 'string' || typeof badge === 'number';
10
+ }
11
+ /**
12
+ * True when the badge should be rendered inside the variant's default pill
13
+ * wrapper. ReactElements bring their own styling and bypass the wrapper.
14
+ */
15
+ export function shouldWrapBadge(badge) {
16
+ if (badge == null || badge === false)
17
+ return false;
18
+ if (isValidElement(badge))
19
+ return false;
20
+ return true;
21
+ }
22
+ export function findItem(items, key) {
23
+ if (!key)
24
+ return undefined;
25
+ for (const item of items) {
26
+ if (item.key === key)
27
+ return item;
28
+ const child = findItem(item.children ?? [], key);
29
+ if (child)
30
+ return child;
31
+ }
32
+ return undefined;
33
+ }
34
+ /** True if `target` is `item.key` itself, OR appears somewhere in `item`'s subtree. */
35
+ export function isOnPath(item, target) {
36
+ if (!target)
37
+ return false;
38
+ if (item.key === target)
39
+ return true;
40
+ return (item.children ?? []).some((child) => isOnPath(child, target));
41
+ }
42
+ export function firstPanelItem(items, activeKey) {
43
+ const active = findItem(items, activeKey);
44
+ if (active?.children?.length || active?.panel)
45
+ return active;
46
+ return items.find((item) => item.children?.length || item.panel) ?? items[0];
47
+ }
48
+ export function opensPanel(item) {
49
+ return Boolean(item.children?.length || item.panel);
50
+ }
51
+ export function defaultMatcher(item, query) {
52
+ if (!query)
53
+ return true;
54
+ return item.label.toLowerCase().includes(query.toLowerCase());
55
+ }
56
+ /** Filter a list non-recursively (used by per-level search). */
57
+ export function filterLevel(items, query, matcher = defaultMatcher) {
58
+ if (!query)
59
+ return items;
60
+ return items.filter((item) => matcher(item, query));
61
+ }
62
+ /** Recursively flatten + filter the whole tree (used by command variant). */
63
+ export function flatMatchTree(items, query, matcher = defaultMatcher) {
64
+ const out = [];
65
+ const visit = (list, breadcrumbs) => {
66
+ for (const item of list) {
67
+ if (matcher(item, query)) {
68
+ out.push({ item, breadcrumbs });
69
+ }
70
+ if (item.children?.length) {
71
+ visit(item.children, [...breadcrumbs, item.label]);
72
+ }
73
+ }
74
+ };
75
+ visit(items, []);
76
+ return out;
77
+ }
78
+ /**
79
+ * Convert a `MainSidebarColorScheme` into a CSS-variable style payload.
80
+ *
81
+ * Strategy: override the design-system brand variables (`--color-primary`,
82
+ * `--color-accent`, `--color-foreground`, etc.) directly on the sidebar
83
+ * root. Every Tailwind class that resolves through those tokens
84
+ * (`bg-primary`, `text-primary-foreground`, `bg-accent`, …) gets the new
85
+ * colour automatically — no per-element rewrites, and the override applies
86
+ * to nested affordances too (tooltips, breadcrumbs, badges, expanded
87
+ * panel surfaces).
88
+ *
89
+ * Tokens are scoped because the inline style only applies within the
90
+ * sidebar root subtree, so the rest of the page keeps its brand defaults.
91
+ *
92
+ * Omitted tokens are NOT emitted, so the cascade falls through to the
93
+ * page-level defaults.
94
+ */
95
+ export function colorSchemeToStyle(scheme) {
96
+ if (!scheme)
97
+ return {};
98
+ const out = {};
99
+ /* Granular tokens win over the bg/fg shorthands. */
100
+ const railBg = scheme.railBg ?? scheme.bg;
101
+ const railFg = scheme.railFg ?? scheme.fg;
102
+ const panelBg = scheme.panelBg ?? scheme.bg;
103
+ const panelFg = scheme.panelFg ?? scheme.fg;
104
+ if (railBg)
105
+ out['--color-primary'] = railBg;
106
+ if (railFg)
107
+ out['--color-primary-foreground'] = railFg;
108
+ if (panelBg)
109
+ out['--color-card'] = panelBg;
110
+ if (panelFg)
111
+ out['--color-card-foreground'] = panelFg;
112
+ if (scheme.accentBg)
113
+ out['--color-accent'] = scheme.accentBg;
114
+ if (scheme.accentFg)
115
+ out['--color-accent-foreground'] = scheme.accentFg;
116
+ if (scheme.border)
117
+ out['--color-border'] = scheme.border;
118
+ if (scheme.mutedFg)
119
+ out['--color-muted-foreground'] = scheme.mutedFg;
120
+ if (scheme.ring)
121
+ out['--color-ring'] = scheme.ring;
122
+ /*
123
+ * Hover overlay — exposed under a sidebar-specific variable. Components
124
+ * read it via `bg-[var(--mihcm-sidebar-hover-bg,…)]` with a sensible
125
+ * fallback so the default theme still works when `hoverBg` isn't set.
126
+ */
127
+ if (scheme.hoverBg)
128
+ out['--mihcm-sidebar-hover-bg'] = scheme.hoverBg;
129
+ /*
130
+ * Tooltip surface uses --color-foreground / --color-background. These
131
+ * are NOT touched by panelFg/railFg overrides — keeping them at the
132
+ * page's brand defaults lets the rail-icon tooltip flip cleanly with
133
+ * dark mode. Set `tooltipBg`/`tooltipFg` only when you need a tooltip
134
+ * surface distinct from the page brand.
135
+ */
136
+ if (scheme.tooltipBg)
137
+ out['--color-foreground'] = scheme.tooltipBg;
138
+ if (scheme.tooltipFg)
139
+ out['--color-background'] = scheme.tooltipFg;
140
+ return out;
141
+ }
142
+ /** Resolve the active path stack into MainSidebarItem objects (filters missing ids). */
143
+ export function resolvePath(items, pathKeys) {
144
+ return pathKeys
145
+ .map((key) => findItem(items, key))
146
+ .filter((item) => Boolean(item));
147
+ }
148
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/MainSidebar/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { MainSidebarProps } from './types.js';
2
+ export declare const HoverSidebar: import("react").ForwardRefExoticComponent<MainSidebarProps & import("react").RefAttributes<HTMLElement>>;
3
+ //# sourceMappingURL=hover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hover.d.ts","sourceRoot":"","sources":["../../src/MainSidebar/hover.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAmB,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEpE,eAAO,MAAM,YAAY,0GAuTvB,CAAC"}
@@ -0,0 +1,177 @@
1
+ 'use client';
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * MainSidebar — `hover` variant.
5
+ *
6
+ * Rail stays in icon width permanently. Hovering an icon shows that icon's
7
+ * children in a floating mini-menu beside the rail. Clicking a child that
8
+ * itself has children drills the panel deeper — a breadcrumb at the top
9
+ * lets the user jump back to any ancestor in one click. Layout never
10
+ * reflows. Touch devices fall back to tap-toggle.
11
+ */
12
+ import { forwardRef, useEffect, useMemo, useRef, useState } from 'react';
13
+ import { AnimatePresence, motion, useReducedMotion } from 'motion/react';
14
+ import { cn } from '../internal/cn.js';
15
+ import { Rail } from './rail.js';
16
+ import { MenuSearch } from './search.js';
17
+ import { BackButton } from './back-button.js';
18
+ import { PathBreadcrumb } from './breadcrumb.js';
19
+ import { defaultMatcher, filterLevel, findItem, opensPanel } from './helpers.js';
20
+ import { scaleVariants } from './motion.js';
21
+ export const HoverSidebar = forwardRef(function HoverSidebar({ items, activeKey, onItemSelect, header, footer, search = false, searchPlaceholder, onSearchChange, side = 'left', density = 'comfortable', panelWidth = 260, motionPreset = 'expressive', hoverDelayMs = 120, closeOnOutsideClick = true, railClassName, panelClassName, itemClassName, activeItemClassName, backLabel = 'Back', className, ...rest }, ref) {
22
+ const reduceMotion = useReducedMotion();
23
+ const effectivePreset = reduceMotion ? 'subtle' : motionPreset;
24
+ /* `hoveredKey` = the root rail item that opened the panel.
25
+ * `panelPathKeys` = ancestors drilled into INSIDE the panel, starting
26
+ * from (but not including) hoveredKey. When empty, panel shows
27
+ * hoveredItem.children. When [childKey], panel shows child.children. */
28
+ const [hoveredKey, setHoveredKey] = useState(null);
29
+ const [panelPathKeys, setPanelPathKeys] = useState([]);
30
+ const [query, setQuery] = useState('');
31
+ const railRef = useRef(null);
32
+ const panelRef = useRef(null);
33
+ const hideTimer = useRef(undefined);
34
+ const showTimer = useRef(undefined);
35
+ const searchEnabled = search !== false;
36
+ const searchCfg = typeof search === 'object' ? search : undefined;
37
+ const matcher = searchCfg?.matcher ?? defaultMatcher;
38
+ const rootItem = useMemo(() => (hoveredKey ? items.find((it) => it.key === hoveredKey) ?? null : null), [items, hoveredKey]);
39
+ /* Build the full breadcrumb path from rootItem down through the drilled
40
+ * panel ancestors. The deepest entry's children populate the panel. */
41
+ const path = useMemo(() => {
42
+ if (!rootItem)
43
+ return [];
44
+ const stack = [rootItem];
45
+ for (const key of panelPathKeys) {
46
+ const node = findItem(stack[stack.length - 1]?.children ?? [], key);
47
+ if (!node)
48
+ break;
49
+ stack.push(node);
50
+ }
51
+ return stack;
52
+ }, [rootItem, panelPathKeys]);
53
+ const current = path[path.length - 1] ?? null;
54
+ const childList = current?.children ?? [];
55
+ const filtered = filterLevel(childList, query, matcher);
56
+ function cancelHide() {
57
+ if (hideTimer.current !== undefined) {
58
+ window.clearTimeout(hideTimer.current);
59
+ hideTimer.current = undefined;
60
+ }
61
+ }
62
+ function scheduleHide() {
63
+ cancelHide();
64
+ hideTimer.current = window.setTimeout(() => closePanel(), 200);
65
+ }
66
+ function cancelShow() {
67
+ if (showTimer.current !== undefined) {
68
+ window.clearTimeout(showTimer.current);
69
+ showTimer.current = undefined;
70
+ }
71
+ }
72
+ function scheduleShow(key) {
73
+ cancelShow();
74
+ showTimer.current = window.setTimeout(() => {
75
+ if (key !== hoveredKey) {
76
+ setHoveredKey(key);
77
+ setPanelPathKeys([]);
78
+ setQuery('');
79
+ }
80
+ }, hoverDelayMs);
81
+ }
82
+ function closePanel() {
83
+ setHoveredKey(null);
84
+ setPanelPathKeys([]);
85
+ setQuery('');
86
+ }
87
+ function selectRailItem(item) {
88
+ if (item.disabled)
89
+ return;
90
+ onItemSelect?.(item.key, item);
91
+ if (opensPanel(item)) {
92
+ cancelHide();
93
+ cancelShow();
94
+ if (hoveredKey === item.key) {
95
+ closePanel();
96
+ return;
97
+ }
98
+ setHoveredKey(item.key);
99
+ setPanelPathKeys([]);
100
+ setQuery('');
101
+ }
102
+ else {
103
+ closePanel();
104
+ }
105
+ }
106
+ function selectPanelItem(item) {
107
+ if (item.disabled)
108
+ return;
109
+ onItemSelect?.(item.key, item);
110
+ if (opensPanel(item)) {
111
+ /* Drill deeper inside the panel. */
112
+ setPanelPathKeys((prev) => [...prev, item.key]);
113
+ setQuery('');
114
+ }
115
+ else {
116
+ closePanel();
117
+ }
118
+ }
119
+ function goBack() {
120
+ setPanelPathKeys((prev) => prev.slice(0, -1));
121
+ setQuery('');
122
+ }
123
+ /* Esc + outside-click close panel. */
124
+ useEffect(() => {
125
+ if (!hoveredKey)
126
+ return;
127
+ function onKey(e) {
128
+ if (e.key === 'Escape')
129
+ closePanel();
130
+ }
131
+ function onPointerDown(e) {
132
+ if (!closeOnOutsideClick)
133
+ return;
134
+ const target = e.target;
135
+ if (panelRef.current?.contains(target) || railRef.current?.contains(target))
136
+ return;
137
+ closePanel();
138
+ }
139
+ document.addEventListener('keydown', onKey);
140
+ document.addEventListener('pointerdown', onPointerDown);
141
+ return () => {
142
+ document.removeEventListener('keydown', onKey);
143
+ document.removeEventListener('pointerdown', onPointerDown);
144
+ };
145
+ }, [hoveredKey, closeOnOutsideClick]);
146
+ /* Cleanup timers on unmount */
147
+ useEffect(() => {
148
+ return () => {
149
+ cancelHide();
150
+ cancelShow();
151
+ };
152
+ }, []);
153
+ return (_jsxs("div", { ref: ref, className: cn('relative h-full', className), ...rest, children: [_jsx("div", { onMouseEnter: cancelHide, onMouseLeave: scheduleHide, onMouseMove: (e) => {
154
+ const target = e.target.closest('button');
155
+ if (!target)
156
+ return;
157
+ const key = target.dataset.itemKey;
158
+ if (key && key !== hoveredKey)
159
+ scheduleShow(key);
160
+ }, children: _jsx(Rail, { ref: railRef, items: items.map((it) => ({ ...it })), activeKey: activeKey, density: density, side: side, header: header, footer: footer, itemClassName: itemClassName, activeItemClassName: activeItemClassName, className: railClassName, openPanelKey: hoveredKey ?? undefined, onItemSelect: selectRailItem }) }), _jsx(AnimatePresence, { initial: false, mode: "wait", children: current && (childList.length || current.panel) ? (_jsxs(motion.div, { ref: panelRef, variants: scaleVariants(effectivePreset), initial: "initial", animate: "animate", exit: "exit", role: "menu", "aria-label": current.label, onMouseEnter: cancelHide, onMouseLeave: scheduleHide, style: {
161
+ width: typeof panelWidth === 'number' ? `${panelWidth}px` : panelWidth,
162
+ [side === 'right' ? 'right' : 'left']: density === 'compact' ? '3rem' : '3.5rem',
163
+ }, className: cn('absolute top-2 z-10 rounded-xl border border-border bg-card text-card-foreground shadow-xl', panelClassName), children: [_jsxs("div", { className: "border-b border-border px-3 py-2.5", children: [path.length > 1 ? (_jsxs(_Fragment, { children: [_jsx(PathBreadcrumb, { path: path, onJump: (depth) => {
164
+ /* breadcrumb depth indexes into `path` (root=0). The
165
+ * panel stack starts from depth 1, so trim it to
166
+ * keep `depth` items beyond the root. */
167
+ setPanelPathKeys((prev) => prev.slice(0, depth));
168
+ setQuery('');
169
+ }, className: "mb-1" }), _jsx(BackButton, { onClick: goBack, label: backLabel, className: "mb-1 -ml-1.5" })] })) : null, _jsx("div", { className: "truncate text-base font-semibold text-card-foreground", children: current.label }), current.description ? (_jsx("p", { className: "mt-0.5 truncate text-xs text-card-foreground/70", children: current.description })) : null, searchEnabled ? (_jsx("div", { className: "mt-2", children: _jsx(MenuSearch, { value: query, onValueChange: (v) => {
170
+ setQuery(v);
171
+ onSearchChange?.(v);
172
+ }, placeholder: searchCfg?.placeholder ?? searchPlaceholder ?? `Search ${current.label}…`, tone: "onBrand" }) })) : null] }), _jsx("div", { className: "max-h-[min(80vh,32rem)] overflow-y-auto p-1.5", children: filtered.length === 0 && query ? (_jsx("div", { className: "px-3 py-6 text-center text-xs text-card-foreground/70", children: searchCfg?.noResultsLabel ?? `No items match "${query}".` })) : (filtered.map((item) => {
173
+ const hasChildren = opensPanel(item);
174
+ return (_jsxs("button", { type: "button", onClick: () => selectPanelItem(item), disabled: item.disabled, className: cn('group flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm text-card-foreground transition-colors', 'hover:bg-card-foreground/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring', 'disabled:cursor-not-allowed disabled:opacity-50', item.key === activeKey && 'text-card-foreground font-semibold', itemClassName), children: [item.icon ? (_jsx("span", { className: "grid size-4 shrink-0 place-items-center text-card-foreground/70 [&_svg]:size-full", "aria-hidden": "true", children: item.icon })) : null, _jsx("span", { className: "min-w-0 flex-1 truncate", children: item.label }), hasChildren ? (_jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", className: "size-3.5 shrink-0 text-card-foreground/70", "aria-hidden": "true", children: _jsx("path", { d: "m9 18 6-6-6-6", strokeLinecap: "round", strokeLinejoin: "round" }) })) : null] }, item.key));
175
+ })) })] }, rootItem?.key ?? 'panel')) : null })] }));
176
+ });
177
+ //# sourceMappingURL=hover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hover.js","sourceRoot":"","sources":["../../src/MainSidebar/hover.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { MainSidebarProps } from './types.js';
2
+ export type { IconSidebarItem, IconSidebarProps, MainSidebarCollapsible, MainSidebarColorScheme, MainSidebarDensity, MainSidebarItem, MainSidebarMotionPreset, MainSidebarProps, MainSidebarSearchConfig, MainSidebarSide, MainSidebarVariant, } from './types.js';
3
+ export declare const MainSidebar: import("react").ForwardRefExoticComponent<MainSidebarProps & import("react").RefAttributes<HTMLElement>>;
4
+ /** Backward-compat: IconSidebar was the original name. */
5
+ export { MainSidebar as IconSidebar };
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/MainSidebar/index.tsx"],"names":[],"mappings":"AA0CA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,sBAAsB,EACtB,sBAAsB,EACtB,kBAAkB,EAClB,eAAe,EACf,uBAAuB,EACvB,gBAAgB,EAChB,uBAAuB,EACvB,eAAe,EACf,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,WAAW,0GAiItB,CAAC;AAEH,0DAA0D;AAC1D,OAAO,EAAE,WAAW,IAAI,WAAW,EAAE,CAAC"}
@@ -0,0 +1,108 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * MainSidebar — variant dispatcher with shadcn-style collapse toggle.
5
+ *
6
+ * The sidebar has two top-level shapes (matching shadcn's `collapsible="icon"`):
7
+ *
8
+ * - **expanded** — wide vertical sidebar with icon + label rows and
9
+ * inline accordion expansion. Shared across every variant via
10
+ * `ExpandedSidebar`. This is what users see by default unless the call
11
+ * site opts into `defaultCollapsed`.
12
+ * - **collapsed** — the original narrow icon rail; behaviour is
13
+ * variant-specific. Five interaction models live here:
14
+ *
15
+ * - `drilldown` (default) — rail click reveals a panel; deeper levels
16
+ * replace it; back via breadcrumb. Layout overlays.
17
+ * - `floating` — panel floats on top of content; dismiss on
18
+ * outside-click, Esc, or repeated rail click.
19
+ * - `columns` — Finder-style Miller columns; each level keeps
20
+ * the previous column visible; horizontally scrolling.
21
+ * - `command` — search-first; typing filters the whole tree
22
+ * recursively; empty query falls back to drilldown.
23
+ * - `hover` — hovering an icon pops out a floating
24
+ * mini-menu. Touch falls back to tap-toggle.
25
+ *
26
+ * Toggle between the two shapes via the in-built collapse button (header of
27
+ * the expanded sidebar) or a floating expand chip rendered next to the rail
28
+ * when collapsed. Both can be hidden via `showCollapseToggle={false}`.
29
+ *
30
+ * Public barrel — implementations split under `./MainSidebar/*`. Wiki:
31
+ * docs/components/MainSidebar.md.
32
+ */
33
+ import { forwardRef, useState } from 'react';
34
+ import { cn } from '../internal/cn.js';
35
+ import { DrilldownSidebar } from './drilldown.js';
36
+ import { FloatingSidebar } from './floating.js';
37
+ import { ColumnsSidebar } from './columns.js';
38
+ import { CommandSidebar } from './command.js';
39
+ import { HoverSidebar } from './hover.js';
40
+ import { ExpandedSidebar } from './expanded.js';
41
+ import { MobileSidebar } from './mobile.js';
42
+ import { colorSchemeToStyle } from './helpers.js';
43
+ export const MainSidebar = forwardRef(function MainSidebar(props, ref) {
44
+ const { collapsible = 'icon', collapsed, defaultCollapsed = true, onCollapsedChange, showCollapseToggle = true, side = 'left', expandedLabel = 'Expand menu',
45
+ /*
46
+ * Strip sidebar-meta props that no variant destructures. If left in
47
+ * `...rest`, they'd be spread onto the variant's root <div> and
48
+ * trigger "unknown DOM attribute" warnings (e.g. `mobile`).
49
+ */
50
+ mobile, showLabelsWhenExpanded: _showLabelsWhenExpanded, collapsedWidth: _collapsedWidth, expandedWidth: _expandedWidth, collapsedLabel: _collapsedLabel, colorScheme, style,
51
+ /* Variant-specific props — strip from `variantProps` and re-inject only
52
+ * for the variant that actually consumes them. Otherwise the prop
53
+ * leaks through into a variant that doesn't destructure it and lands
54
+ * on its root <div>, triggering "unknown DOM attribute" warnings. */
55
+ columnsMaxVisible, hoverDelayMs, ...variantProps } = props;
56
+ void _showLabelsWhenExpanded;
57
+ void _collapsedWidth;
58
+ void _expandedWidth;
59
+ void _collapsedLabel;
60
+ /* Whitelabel theme — emitted as CSS-variable overrides on the wrapper so
61
+ * every nested Tailwind class (`bg-primary`, `text-primary-foreground`,
62
+ * `bg-accent`, `border-border`, etc.) inside the sidebar subtree
63
+ * resolves through the consumer's brand colours. */
64
+ const themeStyle = { ...colorSchemeToStyle(colorScheme), ...style };
65
+ const [internalCollapsed, setInternalCollapsed] = useState(defaultCollapsed);
66
+ const isCollapsed = collapsed ?? internalCollapsed;
67
+ function setCollapsed(next) {
68
+ if (collapsed === undefined)
69
+ setInternalCollapsed(next);
70
+ onCollapsedChange?.(next);
71
+ }
72
+ /* Mobile / tablet — render a hamburger trigger that opens the sidebar in
73
+ * a Sheet overlay instead of taking inline page width. */
74
+ if (mobile) {
75
+ return (_jsx("div", { style: themeStyle, className: "contents", children: _jsx(MobileSidebar, { ...variantProps, side: side }) }));
76
+ }
77
+ /* Expanded shape — universal across variants. */
78
+ if (collapsible !== 'none' && !isCollapsed) {
79
+ return (_jsx(ExpandedSidebar, { ref: ref, ...variantProps, side: side, showCollapseToggle: showCollapseToggle, onCollapse: () => setCollapsed(true), style: themeStyle }));
80
+ }
81
+ /* Collapsed shape — variant-specific. Wrap in a relative shell so the
82
+ * floating expand chip can sit next to the rail without disturbing the
83
+ * variant's own layout. The wrapper carries the theme style so the
84
+ * floating expand chip also inherits the brand-override variables. */
85
+ const variantNode = (() => {
86
+ switch (props.variant) {
87
+ case 'floating':
88
+ return _jsx(FloatingSidebar, { ref: ref, ...variantProps, side: side });
89
+ case 'columns':
90
+ return (_jsx(ColumnsSidebar, { ref: ref, ...variantProps, side: side, ...(columnsMaxVisible !== undefined ? { columnsMaxVisible } : {}) }));
91
+ case 'command':
92
+ return _jsx(CommandSidebar, { ref: ref, ...variantProps, side: side });
93
+ case 'hover':
94
+ return (_jsx(HoverSidebar, { ref: ref, ...variantProps, side: side, ...(hoverDelayMs !== undefined ? { hoverDelayMs } : {}) }));
95
+ case 'drilldown':
96
+ case undefined:
97
+ default:
98
+ return _jsx(DrilldownSidebar, { ref: ref, ...variantProps, side: side });
99
+ }
100
+ })();
101
+ if (collapsible === 'none' || !showCollapseToggle) {
102
+ return _jsx("div", { style: themeStyle, className: "contents", children: variantNode });
103
+ }
104
+ return (_jsxs("div", { className: "relative flex h-full", style: themeStyle, children: [variantNode, _jsx("button", { type: "button", onClick: () => setCollapsed(false), "aria-label": expandedLabel, className: cn('absolute top-3 z-30 grid size-6 place-items-center rounded-full border border-border bg-card text-muted-foreground shadow-sm transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring', side === 'right' ? 'left-[-12px]' : 'right-[-12px]'), children: _jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", className: "size-3.5", "aria-hidden": "true", children: _jsx("path", { d: side === 'right' ? 'm15 18-6-6 6-6' : 'm9 18 6-6-6-6', strokeLinecap: "round", strokeLinejoin: "round" }) }) })] }));
105
+ });
106
+ /** Backward-compat: IconSidebar was the original name. */
107
+ export { MainSidebar as IconSidebar };
108
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/MainSidebar/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * MainSidebar — `mobile` rendering.
3
+ *
4
+ * On phones and tablets the full sidebar (rail or expanded) consumes too
5
+ * much horizontal space. This component renders a single hamburger button
6
+ * inline; tapping it opens the wide `ExpandedSidebar` inside a `Sheet`
7
+ * overlay slid in from the chosen `side`. The page area stays clear.
8
+ *
9
+ * Triggered via `<MainSidebar mobile items={…} />` — the dispatcher routes
10
+ * here when `mobile === true`. Sheet handles outside-tap dismissal, Esc,
11
+ * focus-trap, and the scrim, so this component just composes existing
12
+ * primitives.
13
+ */
14
+ import { type ReactNode } from 'react';
15
+ import type { MainSidebarProps } from './types.js';
16
+ interface MobileSidebarProps extends MainSidebarProps {
17
+ /** Render-prop override for the trigger — receives an `onClick` to open. */
18
+ trigger?: (props: {
19
+ onClick: () => void;
20
+ 'aria-label': string;
21
+ }) => ReactNode;
22
+ /** Class hook for the default hamburger button. Ignored when `trigger` is set. */
23
+ triggerClassName?: string;
24
+ /** Accessible label on the hamburger. Default: "Open menu". */
25
+ triggerLabel?: string;
26
+ }
27
+ export declare const MobileSidebar: import("react").ForwardRefExoticComponent<MobileSidebarProps & import("react").RefAttributes<HTMLButtonElement>>;
28
+ export {};
29
+ //# sourceMappingURL=mobile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mobile.d.ts","sourceRoot":"","sources":["../../src/MainSidebar/mobile.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAwB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAI7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAmBnD,UAAU,kBAAmB,SAAQ,gBAAgB;IACnD,4EAA4E;IAC5E,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,IAAI,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,KAAK,SAAS,CAAC;IAC9E,kFAAkF;IAClF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,aAAa,kHAqEzB,CAAC"}
@@ -0,0 +1,38 @@
1
+ 'use client';
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * MainSidebar — `mobile` rendering.
5
+ *
6
+ * On phones and tablets the full sidebar (rail or expanded) consumes too
7
+ * much horizontal space. This component renders a single hamburger button
8
+ * inline; tapping it opens the wide `ExpandedSidebar` inside a `Sheet`
9
+ * overlay slid in from the chosen `side`. The page area stays clear.
10
+ *
11
+ * Triggered via `<MainSidebar mobile items={…} />` — the dispatcher routes
12
+ * here when `mobile === true`. Sheet handles outside-tap dismissal, Esc,
13
+ * focus-trap, and the scrim, so this component just composes existing
14
+ * primitives.
15
+ */
16
+ import { forwardRef, useState } from 'react';
17
+ import { cn } from '../internal/cn.js';
18
+ import { Sheet, SheetContent } from '../Sheet.js';
19
+ import { ExpandedSidebar } from './expanded.js';
20
+ function HamburgerIcon({ className }) {
21
+ return (_jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: className, "aria-hidden": "true", children: _jsx("path", { d: "M3 6h18M3 12h18M3 18h18" }) }));
22
+ }
23
+ export const MobileSidebar = forwardRef(function MobileSidebar({ side = 'left', trigger, triggerClassName, triggerLabel = 'Open menu', colorScheme: _colorScheme, style: _style, className: _className, ...sidebarProps }, ref) {
24
+ void _colorScheme;
25
+ void _style;
26
+ void _className;
27
+ const [open, setOpen] = useState(false);
28
+ const sheetSide = side === 'right' ? 'right' : 'left';
29
+ return (_jsxs(_Fragment, { children: [trigger ? (trigger({ onClick: () => setOpen(true), 'aria-label': triggerLabel })) : (_jsx("button", { ref: ref, type: "button", "aria-label": triggerLabel, "aria-haspopup": "menu", "aria-expanded": open, onClick: () => setOpen(true), className: cn('inline-flex size-10 items-center justify-center rounded-md text-foreground', 'hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring', triggerClassName), children: _jsx(HamburgerIcon, { className: "size-5" }) })), _jsx(Sheet, { open: open, onOpenChange: setOpen, children: _jsx(SheetContent, { side: sheetSide, size: "sm", className: "p-0 bg-primary border-0", "aria-label": "Main navigation", children: _jsx(ExpandedSidebar, { ...sidebarProps, side: sheetSide, showCollapseToggle: true, onCollapse: () => setOpen(false), collapsedLabel: "Close menu",
30
+ /*
31
+ * Make the sidebar fill the sheet — the Sheet's `size` prop
32
+ * controls the visible width, the sidebar should not impose
33
+ * its own width on top of that or a stripe of the sheet's
34
+ * card background shows through.
35
+ */
36
+ expandedWidth: "100%", className: "h-full w-full border-0" }) }) })] }));
37
+ });
38
+ //# sourceMappingURL=mobile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mobile.js","sourceRoot":"","sources":["../../src/MainSidebar/mobile.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AAC7D,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGhD,SAAS,aAAa,CAAC,EAAE,SAAS,EAA0B;IAC1D,OAAO,CACL,cACE,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,GAAG,EACf,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,EACtB,SAAS,EAAE,SAAS,iBACR,MAAM,YAElB,eAAM,CAAC,EAAC,yBAAyB,GAAG,GAChC,CACP,CAAC;AACJ,CAAC;AAWD,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CACrC,SAAS,aAAa,CACpB,EACE,IAAI,GAAG,MAAM,EACb,OAAO,EACP,gBAAgB,EAChB,YAAY,GAAG,WAAW,EAC1B,WAAW,EAAE,YAAY,EACzB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,UAAU,EACrB,GAAG,YAAY,EAChB,EACD,GAAG;IAEH,KAAK,YAAY,CAAC;IAClB,KAAK,MAAM,CAAC;IACZ,KAAK,UAAU,CAAC;IAChB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IAEtD,OAAO,CACL,8BACG,OAAO,CAAC,CAAC,CAAC,CACT,OAAO,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CACtE,CAAC,CAAC,CAAC,CACF,iBACE,GAAG,EAAE,GAAG,EACR,IAAI,EAAC,QAAQ,gBACD,YAAY,mBACV,MAAM,mBACL,IAAI,EACnB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAC5B,SAAS,EAAE,EAAE,CACX,4EAA4E,EAC5E,wFAAwF,EACxF,gBAAgB,CACjB,YAED,KAAC,aAAa,IAAC,SAAS,EAAC,QAAQ,GAAG,GAC7B,CACV,EAED,KAAC,KAAK,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,YACtC,KAAC,YAAY,IACX,IAAI,EAAE,SAAS,EACf,IAAI,EAAC,IAAI,EACT,SAAS,EAAC,yBAAyB,gBACxB,iBAAiB,YAE5B,KAAC,eAAe,OACV,YAAY,EAChB,IAAI,EAAE,SAAS,EACf,kBAAkB,QAClB,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAChC,cAAc,EAAC,YAAY;wBAC3B;;;;;2BAKG;wBACH,aAAa,EAAC,MAAM,EACpB,SAAS,EAAC,wBAAwB,GAClC,GACW,GACT,IACP,CACJ,CAAC;AACJ,CAAC,CACF,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Motion presets for `MainSidebar` variants.
3
+ *
4
+ * Three intensity levels. Variants pull from this single source so the
5
+ * design-system motion vocabulary stays consistent.
6
+ *
7
+ * Reduced motion: every variant component checks `prefers-reduced-motion`
8
+ * and falls back to instant cuts when the OS-level preference is set.
9
+ */
10
+ import type { Transition, Variants } from 'motion/react';
11
+ import type { MainSidebarMotionPreset } from './types.js';
12
+ interface MotionConfig {
13
+ /** Slide distance in px on enter. */
14
+ distance: number;
15
+ /** Motion transition. */
16
+ transition: Transition;
17
+ }
18
+ export declare const MOTION_PRESETS: Record<MainSidebarMotionPreset, MotionConfig>;
19
+ export declare function slideVariants(preset: MainSidebarMotionPreset, fromSide: 'left' | 'right'): Variants;
20
+ export declare function fadeVariants(preset: MainSidebarMotionPreset): Variants;
21
+ export declare function scaleVariants(preset: MainSidebarMotionPreset): Variants;
22
+ export {};
23
+ //# sourceMappingURL=motion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"motion.d.ts","sourceRoot":"","sources":["../../src/MainSidebar/motion.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE1D,UAAU,YAAY;IACpB,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,yBAAyB;IACzB,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,uBAAuB,EAAE,YAAY,CAaxE,CAAC;AAEF,wBAAgB,aAAa,CAC3B,MAAM,EAAE,uBAAuB,EAC/B,QAAQ,EAAE,MAAM,GAAG,OAAO,GACzB,QAAQ,CAQV;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,uBAAuB,GAAG,QAAQ,CAOtE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,uBAAuB,GAAG,QAAQ,CAOvE"}