@mastra/playground-ui 46.0.0-alpha.4 → 46.0.0-alpha.6

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 (140) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/dist/Composer.css +80 -0
  3. package/dist/components/ChatShell.cjs.js +1 -1
  4. package/dist/components/ChatShell.es.js +1 -1
  5. package/dist/components/Composer.cjs.js +46 -0
  6. package/dist/components/Composer.cjs.js.map +1 -1
  7. package/dist/components/Composer.es.js +48 -3
  8. package/dist/components/Composer.es.js.map +1 -1
  9. package/dist/components/DataList.cjs.js +4 -4
  10. package/dist/components/DataList.es.js +4 -4
  11. package/dist/components/EnvironmentVariablesEditor.cjs.js +1 -1
  12. package/dist/components/EnvironmentVariablesEditor.es.js +1 -1
  13. package/dist/components/LogsDataList.cjs.js +2 -2
  14. package/dist/components/LogsDataList.es.js +2 -2
  15. package/dist/components/MainSidebar.cjs.js +213 -208
  16. package/dist/components/MainSidebar.cjs.js.map +1 -1
  17. package/dist/components/MainSidebar.es.js +213 -210
  18. package/dist/components/MainSidebar.es.js.map +1 -1
  19. package/dist/components/MessageScroller.cjs.js +1 -1
  20. package/dist/components/MessageScroller.es.js +1 -1
  21. package/dist/components/SankeyChart.cjs.js +3 -4
  22. package/dist/components/SankeyChart.cjs.js.map +1 -1
  23. package/dist/components/SankeyChart.es.js +3 -4
  24. package/dist/components/SankeyChart.es.js.map +1 -1
  25. package/dist/components/ThreadRail.cjs.js +2 -2
  26. package/dist/components/ThreadRail.cjs.js.map +1 -1
  27. package/dist/components/ThreadRail.es.js +1 -1
  28. package/dist/components/ThreadRail.es.js.map +1 -1
  29. package/dist/{data-list-CEGVpKNo.cjs → data-list-B3P5IlxV.cjs} +31 -8
  30. package/dist/data-list-B3P5IlxV.cjs.map +1 -0
  31. package/dist/{data-list-SGIqDkMi.js → data-list-CZC8N3I4.js} +26 -5
  32. package/dist/data-list-CZC8N3I4.js.map +1 -0
  33. package/dist/{data-list-skeleton-CQvX7jIh.js → data-list-skeleton-BDQEjCWH.js} +2 -2
  34. package/dist/{data-list-skeleton-CQvX7jIh.js.map → data-list-skeleton-BDQEjCWH.js.map} +1 -1
  35. package/dist/{data-list-skeleton-CmCTE-HQ.cjs → data-list-skeleton-ClGPuUja.cjs} +2 -2
  36. package/dist/{data-list-skeleton-CmCTE-HQ.cjs.map → data-list-skeleton-ClGPuUja.cjs.map} +1 -1
  37. package/dist/{data-list-top-cell-DoeqMbd1.cjs → data-list-top-cell-Dfg0AKmr.cjs} +54 -5
  38. package/dist/data-list-top-cell-Dfg0AKmr.cjs.map +1 -0
  39. package/dist/{data-list-top-cell-D9EsRa0k.js → data-list-top-cell-S98SdRsx.js} +53 -2
  40. package/dist/data-list-top-cell-S98SdRsx.js.map +1 -0
  41. package/dist/domains/logs/components/logs-list-view.cjs.js +2 -2
  42. package/dist/domains/logs/components/logs-list-view.es.js +2 -2
  43. package/dist/domains/metrics/components/memory-card-view.cjs.js +1 -1
  44. package/dist/domains/metrics/components/memory-card-view.es.js +1 -1
  45. package/dist/domains/metrics/components/model-usage-cost-card-view.cjs.js +1 -1
  46. package/dist/domains/metrics/components/model-usage-cost-card-view.es.js +1 -1
  47. package/dist/domains/metrics/components/scores-card-view.cjs.js +1 -1
  48. package/dist/domains/metrics/components/scores-card-view.es.js +1 -1
  49. package/dist/domains/traces/components/span-data-panel-view.cjs.js +3 -3
  50. package/dist/domains/traces/components/span-data-panel-view.cjs.js.map +1 -1
  51. package/dist/domains/traces/components/span-data-panel-view.es.js +4 -4
  52. package/dist/domains/traces/components/span-data-panel-view.es.js.map +1 -1
  53. package/dist/domains/traces/components/span-details-view.cjs.js +4 -3
  54. package/dist/domains/traces/components/span-details-view.cjs.js.map +1 -1
  55. package/dist/domains/traces/components/span-details-view.es.js +4 -3
  56. package/dist/domains/traces/components/span-details-view.es.js.map +1 -1
  57. package/dist/domains/traces/components/trace-columns-menu.cjs.js +144 -0
  58. package/dist/domains/traces/components/trace-columns-menu.cjs.js.map +1 -0
  59. package/dist/domains/traces/components/trace-columns-menu.d.ts +2 -0
  60. package/dist/domains/traces/components/trace-columns-menu.es.js +140 -0
  61. package/dist/domains/traces/components/trace-columns-menu.es.js.map +1 -0
  62. package/dist/domains/traces/components/traces-list-view.cjs.js +30 -11
  63. package/dist/domains/traces/components/traces-list-view.cjs.js.map +1 -1
  64. package/dist/domains/traces/components/traces-list-view.es.js +31 -12
  65. package/dist/domains/traces/components/traces-list-view.es.js.map +1 -1
  66. package/dist/domains/traces/hooks/use-trace-column-preferences.cjs.js +80 -0
  67. package/dist/domains/traces/hooks/use-trace-column-preferences.cjs.js.map +1 -0
  68. package/dist/domains/traces/hooks/use-trace-column-preferences.d.ts +2 -0
  69. package/dist/domains/traces/hooks/use-trace-column-preferences.es.js +76 -0
  70. package/dist/domains/traces/hooks/use-trace-column-preferences.es.js.map +1 -0
  71. package/dist/domains/traces/hooks/use-trace-usage.cjs.js +99 -0
  72. package/dist/domains/traces/hooks/use-trace-usage.cjs.js.map +1 -0
  73. package/dist/domains/traces/hooks/use-trace-usage.d.ts +2 -0
  74. package/dist/domains/traces/hooks/use-trace-usage.es.js +95 -0
  75. package/dist/domains/traces/hooks/use-trace-usage.es.js.map +1 -0
  76. package/dist/domains/traces/hooks/use-traces.cjs.js.map +1 -1
  77. package/dist/domains/traces/hooks/use-traces.es.js.map +1 -1
  78. package/dist/domains/traces/trace-list-columns.cjs.js +106 -0
  79. package/dist/domains/traces/trace-list-columns.cjs.js.map +1 -0
  80. package/dist/domains/traces/trace-list-columns.d.ts +2 -0
  81. package/dist/domains/traces/trace-list-columns.es.js +93 -0
  82. package/dist/domains/traces/trace-list-columns.es.js.map +1 -0
  83. package/dist/domains/traces/utils/span-utils.cjs.js +13 -0
  84. package/dist/domains/traces/utils/span-utils.cjs.js.map +1 -1
  85. package/dist/domains/traces/utils/span-utils.es.js +13 -1
  86. package/dist/domains/traces/utils/span-utils.es.js.map +1 -1
  87. package/dist/domains/traces/utils.cjs.js +1 -0
  88. package/dist/domains/traces/utils.cjs.js.map +1 -1
  89. package/dist/domains/traces/utils.es.js +1 -1
  90. package/dist/domains/traces.cjs.js +1 -0
  91. package/dist/domains/traces.cjs.js.map +1 -1
  92. package/dist/domains/traces.es.js +1 -1
  93. package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +1 -1
  94. package/dist/ee/topics/components/topic-trace-summary-list.es.js +1 -1
  95. package/dist/{logs-data-list-BhDEUkXZ.js → logs-data-list-C9Q9MHsz.js} +2 -3
  96. package/dist/{logs-data-list-BhDEUkXZ.js.map → logs-data-list-C9Q9MHsz.js.map} +1 -1
  97. package/dist/{logs-data-list-C_FyPCxE.cjs → logs-data-list-DTt_DmNk.cjs} +4 -5
  98. package/dist/{logs-data-list-C_FyPCxE.cjs.map → logs-data-list-DTt_DmNk.cjs.map} +1 -1
  99. package/dist/{message-scroller-DIgCd5n3.cjs → message-scroller-BmzjZZNs.cjs} +12 -2
  100. package/dist/message-scroller-BmzjZZNs.cjs.map +1 -0
  101. package/dist/{message-scroller-BQpwFsqj.js → message-scroller-D5O7sUS5.js} +12 -2
  102. package/dist/message-scroller-D5O7sUS5.js.map +1 -0
  103. package/dist/src/domains/traces/components/trace-columns-menu.d.ts +11 -0
  104. package/dist/src/domains/traces/components/traces-list-view.d.ts +9 -1
  105. package/dist/src/domains/traces/hooks/use-trace-column-preferences.d.ts +8 -0
  106. package/dist/src/domains/traces/hooks/use-trace-usage.d.ts +6 -0
  107. package/dist/src/domains/traces/hooks/use-traces.d.ts +3 -3
  108. package/dist/src/domains/traces/trace-list-columns.d.ts +21 -0
  109. package/dist/src/domains/traces/utils/index.d.ts +1 -1
  110. package/dist/src/domains/traces/utils/span-utils.d.ts +1 -0
  111. package/dist/src/ds/components/Composer/composer.d.ts +12 -0
  112. package/dist/src/ds/components/Composer/composer.stories.d.ts +3 -0
  113. package/dist/src/ds/components/Composer/index.d.ts +2 -2
  114. package/dist/src/ds/components/Composer/use-composer-pointer-angle.d.ts +2 -0
  115. package/dist/src/ds/components/MainSidebar/main-sidebar-context.d.ts +10 -33
  116. package/dist/src/ds/components/MainSidebar/main-sidebar-provider.d.ts +29 -0
  117. package/dist/src/ds/components/MainSidebar/main-sidebar.d.ts +3 -2
  118. package/dist/src/ds/components/SankeyChart/sankey-chart.stories.d.ts +1 -0
  119. package/dist/style.css +4 -4
  120. package/dist/{traces-data-list-CwGS6fk9.cjs → traces-data-list-D3TOjHkm.cjs} +9 -7
  121. package/dist/traces-data-list-D3TOjHkm.cjs.map +1 -0
  122. package/dist/{traces-data-list-CB4kjGeS.js → traces-data-list-a3sYTxch.js} +7 -5
  123. package/dist/traces-data-list-a3sYTxch.js.map +1 -0
  124. package/package.json +7 -7
  125. package/dist/data-list-CEGVpKNo.cjs.map +0 -1
  126. package/dist/data-list-SGIqDkMi.js.map +0 -1
  127. package/dist/data-list-row-wrapper-C-77LgWH.cjs +0 -61
  128. package/dist/data-list-row-wrapper-C-77LgWH.cjs.map +0 -1
  129. package/dist/data-list-row-wrapper-DbGQIaO1.js +0 -58
  130. package/dist/data-list-row-wrapper-DbGQIaO1.js.map +0 -1
  131. package/dist/data-list-subheading-CtKxxvFr.js +0 -29
  132. package/dist/data-list-subheading-CtKxxvFr.js.map +0 -1
  133. package/dist/data-list-subheading-e_PjriQo.cjs +0 -32
  134. package/dist/data-list-subheading-e_PjriQo.cjs.map +0 -1
  135. package/dist/data-list-top-cell-D9EsRa0k.js.map +0 -1
  136. package/dist/data-list-top-cell-DoeqMbd1.cjs.map +0 -1
  137. package/dist/message-scroller-BQpwFsqj.js.map +0 -1
  138. package/dist/message-scroller-DIgCd5n3.cjs.map +0 -1
  139. package/dist/traces-data-list-CB4kjGeS.js.map +0 -1
  140. package/dist/traces-data-list-CwGS6fk9.cjs.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { c as cn } from '../cn-BakJzhuv.js';
3
- import { MenuIcon, PanelRightIcon, KeyboardIcon } from 'lucide-react';
3
+ import { MenuIcon, PanelRightIcon } from 'lucide-react';
4
4
  import React__default, { useRef, useEffect, useCallback, useId } from 'react';
5
5
  import { S as ScrollArea } from '../scroll-area-DZrEuKjC.js';
6
6
  import { VisuallyHidden } from '@radix-ui/react-visually-hidden';
@@ -13,11 +13,11 @@ function MainSidebarBottom({ className, children, ...props }) {
13
13
  return /* @__PURE__ */ jsx("div", { className: cn("mt-auto", className), ...props, children });
14
14
  }
15
15
 
16
- const SIDEBAR_STATE_KEY = "sidebar:state";
17
- const SIDEBAR_WIDTH_KEY = "sidebar:width";
18
- const SIDEBAR_WIDTH_VAR = "--sidebar-width";
19
16
  const MainSidebarContext = React__default.createContext(null);
20
17
  const MobileDrawerContext = React__default.createContext(null);
18
+ function useMaybeSidebarState() {
19
+ return React__default.useContext(MainSidebarContext);
20
+ }
21
21
  function useMainSidebar() {
22
22
  const ctx = React__default.useContext(MainSidebarContext);
23
23
  const drawer = React__default.useContext(MobileDrawerContext);
@@ -32,201 +32,10 @@ function useMaybeSidebar() {
32
32
  if (!ctx || !drawer) return null;
33
33
  return { ...ctx, ...drawer };
34
34
  }
35
- const clamp = (v, lo, hi) => Math.min(hi, Math.max(lo, v));
36
- const useIsoLayoutEffect = typeof window !== "undefined" ? React__default.useLayoutEffect : React__default.useEffect;
37
- function MainSidebarProvider({
38
- children,
39
- defaultState = "default",
40
- defaultWidth = 240,
41
- minWidth = 200,
42
- maxWidth = 480,
43
- collapseBelow,
44
- collapsedWidth = 64,
45
- disableKeyboardShortcut = false,
46
- storageKey,
47
- mobileBreakpoint = 1024,
48
- mobileWidth = 360,
49
- LinkComponent
50
- }) {
51
- const safeMin = Math.max(0, Math.min(minWidth, maxWidth));
52
- const safeMax = Math.max(safeMin, maxWidth);
53
- const safeCollapsed = Math.max(0, Math.min(collapsedWidth, safeMax));
54
- const safeDefault = clamp(defaultWidth, safeMin, safeMax);
55
- const safeCollapseBelow = collapseBelow ?? safeMin;
56
- const stateStorageKey = storageKey ? `${storageKey}:${SIDEBAR_STATE_KEY}` : SIDEBAR_STATE_KEY;
57
- const widthStorageKey = storageKey ? `${storageKey}:${SIDEBAR_WIDTH_KEY}` : SIDEBAR_WIDTH_KEY;
58
- const readInitial = () => {
59
- if (typeof window === "undefined") return { state: defaultState, width: safeDefault };
60
- try {
61
- let nextState = defaultState;
62
- let nextWidth = safeDefault;
63
- const storedState = window.localStorage.getItem(stateStorageKey);
64
- if (storedState === "collapsed" || storedState === "default") nextState = storedState;
65
- const storedWidth = window.localStorage.getItem(widthStorageKey);
66
- if (storedWidth !== null) {
67
- const parsed = Number(storedWidth);
68
- if (Number.isFinite(parsed)) nextWidth = clamp(parsed, safeMin, safeMax);
69
- }
70
- return { state: nextState, width: nextWidth };
71
- } catch {
72
- return { state: defaultState, width: safeDefault };
73
- }
74
- };
75
- const initialRef = React__default.useRef(null);
76
- if (initialRef.current === null) initialRef.current = readInitial();
77
- const initial = initialRef.current;
78
- const [state, setState] = React__default.useState(initial.state);
79
- const [width, setWidthState] = React__default.useState(initial.width);
80
- const [isMobile, setIsMobile] = React__default.useState(false);
81
- const [openMobile, setOpenMobile] = React__default.useState(false);
82
- const widthRef = React__default.useRef(initial.width);
83
- const stateRef = React__default.useRef(initial.state);
84
- stateRef.current = state;
85
- const scopeRef = React__default.useRef(null);
86
- React__default.useEffect(() => {
87
- if (typeof window === "undefined") return;
88
- const mq = window.matchMedia(`(max-width: ${mobileBreakpoint - 1}px)`);
89
- const update = () => setIsMobile(mq.matches);
90
- update();
91
- mq.addEventListener("change", update);
92
- return () => mq.removeEventListener("change", update);
93
- }, [mobileBreakpoint]);
94
- React__default.useEffect(() => {
95
- if (!isMobile && openMobile) setOpenMobile(false);
96
- }, [isMobile, openMobile]);
97
- const writeCssVar = React__default.useCallback((px) => {
98
- const el = scopeRef.current;
99
- if (el) el.style.setProperty(SIDEBAR_WIDTH_VAR, `${px}px`);
100
- }, []);
101
- useIsoLayoutEffect(() => {
102
- writeCssVar(state === "collapsed" ? safeCollapsed : widthRef.current);
103
- }, [state, safeCollapsed, writeCssVar]);
104
- const persistState = React__default.useCallback(
105
- (next) => {
106
- try {
107
- window.localStorage.setItem(stateStorageKey, next);
108
- } catch {
109
- }
110
- },
111
- [stateStorageKey]
112
- );
113
- const toggleSidebar = React__default.useCallback(() => {
114
- if (isMobile) {
115
- setOpenMobile((prev) => !prev);
116
- return;
117
- }
118
- setState((prev) => {
119
- const next = prev === "default" ? "collapsed" : "default";
120
- stateRef.current = next;
121
- persistState(next);
122
- return next;
123
- });
124
- }, [isMobile, persistState]);
125
- const setWidth = React__default.useCallback(
126
- (next) => {
127
- const clamped = clamp(next, safeMin, safeMax);
128
- widthRef.current = clamped;
129
- writeCssVar(clamped);
130
- },
131
- [safeMin, safeMax, writeCssVar]
132
- );
133
- const collapse = React__default.useCallback(() => {
134
- stateRef.current = "collapsed";
135
- persistState("collapsed");
136
- setState("collapsed");
137
- }, [persistState]);
138
- const expand = React__default.useCallback(() => {
139
- stateRef.current = "default";
140
- persistState("default");
141
- setState("default");
142
- }, [persistState]);
143
- const commit = React__default.useCallback(() => {
144
- setWidthState(widthRef.current);
145
- try {
146
- window.localStorage.setItem(stateStorageKey, stateRef.current);
147
- window.localStorage.setItem(widthStorageKey, String(widthRef.current));
148
- } catch {
149
- }
150
- }, [stateStorageKey, widthStorageKey]);
151
- const setGestureActive = React__default.useCallback((active) => {
152
- const el = scopeRef.current;
153
- if (!el) return;
154
- if (active) el.setAttribute("data-sidebar-gesture", "active");
155
- else el.removeAttribute("data-sidebar-gesture");
156
- }, []);
157
- React__default.useEffect(() => {
158
- if (disableKeyboardShortcut) return;
159
- const onKeyDown = (ev) => {
160
- if (ev.code !== "KeyB") return;
161
- if (!(ev.metaKey || ev.ctrlKey)) return;
162
- if (ev.altKey || ev.shiftKey) return;
163
- const target = ev.target;
164
- if (target) {
165
- const tag = target.tagName;
166
- if (tag === "INPUT" || tag === "TEXTAREA" || tag === "SELECT") return;
167
- if (target.isContentEditable) return;
168
- }
169
- ev.preventDefault();
170
- toggleSidebar();
171
- };
172
- window.addEventListener("keydown", onKeyDown);
173
- return () => window.removeEventListener("keydown", onKeyDown);
174
- }, [disableKeyboardShortcut, toggleSidebar]);
175
- const effectiveState = isMobile ? "default" : state;
176
- const contextValue = React__default.useMemo(
177
- () => ({
178
- state: effectiveState,
179
- desktopState: state,
180
- width,
181
- minWidth: safeMin,
182
- maxWidth: safeMax,
183
- collapseBelow: safeCollapseBelow,
184
- collapsedWidth: safeCollapsed,
185
- isMobile,
186
- toggleSidebar,
187
- setWidth,
188
- collapse,
189
- expand,
190
- commit,
191
- setGestureActive,
192
- LinkComponent
193
- }),
194
- [
195
- effectiveState,
196
- state,
197
- width,
198
- safeMin,
199
- safeMax,
200
- safeCollapseBelow,
201
- safeCollapsed,
202
- isMobile,
203
- toggleSidebar,
204
- setWidth,
205
- collapse,
206
- expand,
207
- commit,
208
- setGestureActive,
209
- LinkComponent
210
- ]
211
- );
212
- const drawerValue = React__default.useMemo(() => ({ openMobile, setOpenMobile }), [openMobile]);
213
- const scopeStyle = {
214
- [SIDEBAR_WIDTH_VAR]: `${initial.state === "collapsed" ? safeCollapsed : initial.width}px`,
215
- ["--sidebar-width-mobile"]: `${mobileWidth}px`,
216
- display: "contents"
217
- };
218
- return /* @__PURE__ */ jsx(
219
- "div",
220
- {
221
- ref: scopeRef,
222
- "data-sidebar-scope": true,
223
- "data-sidebar-state": state,
224
- "data-sidebar-mobile": isMobile ? "true" : "false",
225
- style: scopeStyle,
226
- suppressHydrationWarning: true,
227
- children: /* @__PURE__ */ jsx(MainSidebarContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(MobileDrawerContext.Provider, { value: drawerValue, children }) })
228
- }
229
- );
35
+ function useMobileDrawer() {
36
+ const drawer = React__default.useContext(MobileDrawerContext);
37
+ if (!drawer) throw new Error("useMobileDrawer must be used within a MainSidebarProvider.");
38
+ return drawer;
230
39
  }
231
40
 
232
41
  function MainSidebarMobileTrigger({
@@ -281,7 +90,7 @@ function MainSidebarNavHeader({
281
90
  LinkComponent: LinkProp,
282
91
  ...props
283
92
  }) {
284
- const ctx = useMaybeSidebar();
93
+ const ctx = useMaybeSidebarState();
285
94
  const state = stateProp ?? ctx?.state ?? "default";
286
95
  const isMobile = ctx?.isMobile ?? false;
287
96
  const Link = LinkProp ?? ctx?.LinkComponent ?? "a";
@@ -313,7 +122,7 @@ function MainSidebarNavHeader({
313
122
  }
314
123
 
315
124
  function MainSidebarNavLabel({ children, className, state: stateProp, ...rest }) {
316
- const ctx = useMaybeSidebar();
125
+ const ctx = useMaybeSidebarState();
317
126
  const state = stateProp ?? ctx?.state ?? "default";
318
127
  if (state === "collapsed") {
319
128
  return /* @__PURE__ */ jsx(VisuallyHidden, { children });
@@ -368,7 +177,7 @@ function MainSidebarNavLink({
368
177
  asChild = false,
369
178
  ...props
370
179
  }) {
371
- const ctx = useMaybeSidebar();
180
+ const ctx = useMaybeSidebarState();
372
181
  const state = stateProp ?? ctx?.state ?? "default";
373
182
  const Link = LinkProp ?? ctx?.LinkComponent ?? "a";
374
183
  const isCollapsed = state === "collapsed";
@@ -762,16 +571,210 @@ function MainSidebarTrigger({ className, onClick, ...props }) {
762
571
  )
763
572
  }
764
573
  ),
765
- /* @__PURE__ */ jsxs(TooltipContent, { children: [
766
- "Toggle Sidebar",
767
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 [&>svg]:size-[1em]", children: [
768
- /* @__PURE__ */ jsx(KeyboardIcon, {}),
769
- " Ctrl+B"
770
- ] })
771
- ] })
574
+ /* @__PURE__ */ jsx(TooltipContent, { children: "Toggle Sidebar" })
772
575
  ] });
773
576
  }
774
577
 
578
+ const SIDEBAR_STATE_KEY = "sidebar:state";
579
+ const SIDEBAR_WIDTH_KEY = "sidebar:width";
580
+ const SIDEBAR_WIDTH_VAR = "--sidebar-width";
581
+ const clamp = (v, lo, hi) => Math.min(hi, Math.max(lo, v));
582
+ const useIsoLayoutEffect = typeof window !== "undefined" ? React__default.useLayoutEffect : React__default.useEffect;
583
+ function MainSidebarProvider({
584
+ children,
585
+ defaultState = "default",
586
+ defaultWidth = 240,
587
+ minWidth = 200,
588
+ maxWidth = 480,
589
+ collapseBelow,
590
+ collapsedWidth = 64,
591
+ disableKeyboardShortcut = true,
592
+ storageKey,
593
+ mobileBreakpoint = 1024,
594
+ mobileWidth = 360,
595
+ LinkComponent
596
+ }) {
597
+ const safeMin = Math.max(0, Math.min(minWidth, maxWidth));
598
+ const safeMax = Math.max(safeMin, maxWidth);
599
+ const safeCollapsed = Math.max(0, Math.min(collapsedWidth, safeMax));
600
+ const safeDefault = clamp(defaultWidth, safeMin, safeMax);
601
+ const safeCollapseBelow = collapseBelow ?? safeMin;
602
+ const stateStorageKey = storageKey ? `${storageKey}:${SIDEBAR_STATE_KEY}` : SIDEBAR_STATE_KEY;
603
+ const widthStorageKey = storageKey ? `${storageKey}:${SIDEBAR_WIDTH_KEY}` : SIDEBAR_WIDTH_KEY;
604
+ const readInitial = () => {
605
+ if (typeof window === "undefined") return { state: defaultState, width: safeDefault };
606
+ try {
607
+ let nextState = defaultState;
608
+ let nextWidth = safeDefault;
609
+ const storedState = window.localStorage.getItem(stateStorageKey);
610
+ if (storedState === "collapsed" || storedState === "default") nextState = storedState;
611
+ const storedWidth = window.localStorage.getItem(widthStorageKey);
612
+ if (storedWidth !== null) {
613
+ const parsed = Number(storedWidth);
614
+ if (Number.isFinite(parsed)) nextWidth = clamp(parsed, safeMin, safeMax);
615
+ }
616
+ return { state: nextState, width: nextWidth };
617
+ } catch {
618
+ return { state: defaultState, width: safeDefault };
619
+ }
620
+ };
621
+ const initialRef = React__default.useRef(null);
622
+ if (initialRef.current === null) initialRef.current = readInitial();
623
+ const initial = initialRef.current;
624
+ const [state, setState] = React__default.useState(initial.state);
625
+ const [width, setWidthState] = React__default.useState(initial.width);
626
+ const [isMobile, setIsMobile] = React__default.useState(false);
627
+ const [openMobile, setOpenMobile] = React__default.useState(false);
628
+ const widthRef = React__default.useRef(initial.width);
629
+ const stateRef = React__default.useRef(initial.state);
630
+ stateRef.current = state;
631
+ const scopeRef = React__default.useRef(null);
632
+ React__default.useEffect(() => {
633
+ if (typeof window === "undefined") return;
634
+ const mq = window.matchMedia(`(max-width: ${mobileBreakpoint - 1}px)`);
635
+ const update = () => setIsMobile(mq.matches);
636
+ update();
637
+ mq.addEventListener("change", update);
638
+ return () => mq.removeEventListener("change", update);
639
+ }, [mobileBreakpoint]);
640
+ React__default.useEffect(() => {
641
+ if (!isMobile && openMobile) setOpenMobile(false);
642
+ }, [isMobile, openMobile]);
643
+ const writeCssVar = React__default.useCallback((px) => {
644
+ const el = scopeRef.current;
645
+ if (el) el.style.setProperty(SIDEBAR_WIDTH_VAR, `${px}px`);
646
+ }, []);
647
+ useIsoLayoutEffect(() => {
648
+ writeCssVar(state === "collapsed" ? safeCollapsed : widthRef.current);
649
+ }, [state, safeCollapsed, writeCssVar]);
650
+ const persistState = React__default.useCallback(
651
+ (next) => {
652
+ try {
653
+ window.localStorage.setItem(stateStorageKey, next);
654
+ } catch {
655
+ }
656
+ },
657
+ [stateStorageKey]
658
+ );
659
+ const toggleSidebar = React__default.useCallback(() => {
660
+ if (isMobile) {
661
+ setOpenMobile((prev) => !prev);
662
+ return;
663
+ }
664
+ setState((prev) => {
665
+ const next = prev === "default" ? "collapsed" : "default";
666
+ stateRef.current = next;
667
+ persistState(next);
668
+ return next;
669
+ });
670
+ }, [isMobile, persistState]);
671
+ const setWidth = React__default.useCallback(
672
+ (next) => {
673
+ const clamped = clamp(next, safeMin, safeMax);
674
+ widthRef.current = clamped;
675
+ writeCssVar(clamped);
676
+ },
677
+ [safeMin, safeMax, writeCssVar]
678
+ );
679
+ const collapse = React__default.useCallback(() => {
680
+ stateRef.current = "collapsed";
681
+ persistState("collapsed");
682
+ setState("collapsed");
683
+ }, [persistState]);
684
+ const expand = React__default.useCallback(() => {
685
+ stateRef.current = "default";
686
+ persistState("default");
687
+ setState("default");
688
+ }, [persistState]);
689
+ const commit = React__default.useCallback(() => {
690
+ setWidthState(widthRef.current);
691
+ try {
692
+ window.localStorage.setItem(stateStorageKey, stateRef.current);
693
+ window.localStorage.setItem(widthStorageKey, String(widthRef.current));
694
+ } catch {
695
+ }
696
+ }, [stateStorageKey, widthStorageKey]);
697
+ const setGestureActive = React__default.useCallback((active) => {
698
+ const el = scopeRef.current;
699
+ if (!el) return;
700
+ if (active) el.setAttribute("data-sidebar-gesture", "active");
701
+ else el.removeAttribute("data-sidebar-gesture");
702
+ }, []);
703
+ React__default.useEffect(() => {
704
+ if (disableKeyboardShortcut) return;
705
+ const onKeyDown = (ev) => {
706
+ if (ev.code !== "KeyB") return;
707
+ if (!(ev.metaKey || ev.ctrlKey)) return;
708
+ if (ev.altKey || ev.shiftKey) return;
709
+ const target = ev.target;
710
+ if (target) {
711
+ const tag = target.tagName;
712
+ if (tag === "INPUT" || tag === "TEXTAREA" || tag === "SELECT") return;
713
+ if (target.isContentEditable) return;
714
+ }
715
+ ev.preventDefault();
716
+ toggleSidebar();
717
+ };
718
+ window.addEventListener("keydown", onKeyDown);
719
+ return () => window.removeEventListener("keydown", onKeyDown);
720
+ }, [disableKeyboardShortcut, toggleSidebar]);
721
+ const effectiveState = isMobile ? "default" : state;
722
+ const contextValue = React__default.useMemo(
723
+ () => ({
724
+ state: effectiveState,
725
+ desktopState: state,
726
+ width,
727
+ minWidth: safeMin,
728
+ maxWidth: safeMax,
729
+ collapseBelow: safeCollapseBelow,
730
+ collapsedWidth: safeCollapsed,
731
+ isMobile,
732
+ toggleSidebar,
733
+ setWidth,
734
+ collapse,
735
+ expand,
736
+ commit,
737
+ setGestureActive,
738
+ LinkComponent
739
+ }),
740
+ [
741
+ effectiveState,
742
+ state,
743
+ width,
744
+ safeMin,
745
+ safeMax,
746
+ safeCollapseBelow,
747
+ safeCollapsed,
748
+ isMobile,
749
+ toggleSidebar,
750
+ setWidth,
751
+ collapse,
752
+ expand,
753
+ commit,
754
+ setGestureActive,
755
+ LinkComponent
756
+ ]
757
+ );
758
+ const drawerValue = React__default.useMemo(() => ({ openMobile, setOpenMobile }), [openMobile]);
759
+ const scopeStyle = {
760
+ [SIDEBAR_WIDTH_VAR]: `${initial.state === "collapsed" ? safeCollapsed : initial.width}px`,
761
+ ["--sidebar-width-mobile"]: `${mobileWidth}px`,
762
+ display: "contents"
763
+ };
764
+ return /* @__PURE__ */ jsx(
765
+ "div",
766
+ {
767
+ ref: scopeRef,
768
+ "data-sidebar-scope": true,
769
+ "data-sidebar-state": state,
770
+ "data-sidebar-mobile": isMobile ? "true" : "false",
771
+ style: scopeStyle,
772
+ suppressHydrationWarning: true,
773
+ children: /* @__PURE__ */ jsx(MainSidebarContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(MobileDrawerContext.Provider, { value: drawerValue, children }) })
774
+ }
775
+ );
776
+ }
777
+
775
778
  function getIsLinkActive(link, pathname, siblings = []) {
776
779
  const matches = (url) => pathname === url || pathname.startsWith(url + "/");
777
780
  const flattenLinks = (links) => links.flatMap((item) => [item, ...flattenLinks(item.children ?? [])]);
@@ -796,5 +799,5 @@ const MainSidebar = Object.assign(MainSidebarRoot, {
796
799
  MobileTrigger: MainSidebarMobileTrigger
797
800
  });
798
801
 
799
- export { MainSidebar, MainSidebarMobileTrigger, MainSidebarProvider, MainSidebarTrigger, getIsLinkActive, navItemClasses, useMainSidebar, useMaybeSidebar };
802
+ export { MainSidebar, MainSidebarMobileTrigger, MainSidebarProvider, MainSidebarTrigger, getIsLinkActive, navItemClasses, useMainSidebar, useMaybeSidebar, useMaybeSidebarState, useMobileDrawer };
800
803
  //# sourceMappingURL=MainSidebar.es.js.map