@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
@@ -17,11 +17,11 @@ function MainSidebarBottom({ className, children, ...props }) {
17
17
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: utils_cn.cn("mt-auto", className), ...props, children });
18
18
  }
19
19
 
20
- const SIDEBAR_STATE_KEY = "sidebar:state";
21
- const SIDEBAR_WIDTH_KEY = "sidebar:width";
22
- const SIDEBAR_WIDTH_VAR = "--sidebar-width";
23
20
  const MainSidebarContext = React.createContext(null);
24
21
  const MobileDrawerContext = React.createContext(null);
22
+ function useMaybeSidebarState() {
23
+ return React.useContext(MainSidebarContext);
24
+ }
25
25
  function useMainSidebar() {
26
26
  const ctx = React.useContext(MainSidebarContext);
27
27
  const drawer = React.useContext(MobileDrawerContext);
@@ -36,201 +36,10 @@ function useMaybeSidebar() {
36
36
  if (!ctx || !drawer) return null;
37
37
  return { ...ctx, ...drawer };
38
38
  }
39
- const clamp = (v, lo, hi) => Math.min(hi, Math.max(lo, v));
40
- const useIsoLayoutEffect = typeof window !== "undefined" ? React.useLayoutEffect : React.useEffect;
41
- function MainSidebarProvider({
42
- children,
43
- defaultState = "default",
44
- defaultWidth = 240,
45
- minWidth = 200,
46
- maxWidth = 480,
47
- collapseBelow,
48
- collapsedWidth = 64,
49
- disableKeyboardShortcut = false,
50
- storageKey,
51
- mobileBreakpoint = 1024,
52
- mobileWidth = 360,
53
- LinkComponent
54
- }) {
55
- const safeMin = Math.max(0, Math.min(minWidth, maxWidth));
56
- const safeMax = Math.max(safeMin, maxWidth);
57
- const safeCollapsed = Math.max(0, Math.min(collapsedWidth, safeMax));
58
- const safeDefault = clamp(defaultWidth, safeMin, safeMax);
59
- const safeCollapseBelow = collapseBelow ?? safeMin;
60
- const stateStorageKey = storageKey ? `${storageKey}:${SIDEBAR_STATE_KEY}` : SIDEBAR_STATE_KEY;
61
- const widthStorageKey = storageKey ? `${storageKey}:${SIDEBAR_WIDTH_KEY}` : SIDEBAR_WIDTH_KEY;
62
- const readInitial = () => {
63
- if (typeof window === "undefined") return { state: defaultState, width: safeDefault };
64
- try {
65
- let nextState = defaultState;
66
- let nextWidth = safeDefault;
67
- const storedState = window.localStorage.getItem(stateStorageKey);
68
- if (storedState === "collapsed" || storedState === "default") nextState = storedState;
69
- const storedWidth = window.localStorage.getItem(widthStorageKey);
70
- if (storedWidth !== null) {
71
- const parsed = Number(storedWidth);
72
- if (Number.isFinite(parsed)) nextWidth = clamp(parsed, safeMin, safeMax);
73
- }
74
- return { state: nextState, width: nextWidth };
75
- } catch {
76
- return { state: defaultState, width: safeDefault };
77
- }
78
- };
79
- const initialRef = React.useRef(null);
80
- if (initialRef.current === null) initialRef.current = readInitial();
81
- const initial = initialRef.current;
82
- const [state, setState] = React.useState(initial.state);
83
- const [width, setWidthState] = React.useState(initial.width);
84
- const [isMobile, setIsMobile] = React.useState(false);
85
- const [openMobile, setOpenMobile] = React.useState(false);
86
- const widthRef = React.useRef(initial.width);
87
- const stateRef = React.useRef(initial.state);
88
- stateRef.current = state;
89
- const scopeRef = React.useRef(null);
90
- React.useEffect(() => {
91
- if (typeof window === "undefined") return;
92
- const mq = window.matchMedia(`(max-width: ${mobileBreakpoint - 1}px)`);
93
- const update = () => setIsMobile(mq.matches);
94
- update();
95
- mq.addEventListener("change", update);
96
- return () => mq.removeEventListener("change", update);
97
- }, [mobileBreakpoint]);
98
- React.useEffect(() => {
99
- if (!isMobile && openMobile) setOpenMobile(false);
100
- }, [isMobile, openMobile]);
101
- const writeCssVar = React.useCallback((px) => {
102
- const el = scopeRef.current;
103
- if (el) el.style.setProperty(SIDEBAR_WIDTH_VAR, `${px}px`);
104
- }, []);
105
- useIsoLayoutEffect(() => {
106
- writeCssVar(state === "collapsed" ? safeCollapsed : widthRef.current);
107
- }, [state, safeCollapsed, writeCssVar]);
108
- const persistState = React.useCallback(
109
- (next) => {
110
- try {
111
- window.localStorage.setItem(stateStorageKey, next);
112
- } catch {
113
- }
114
- },
115
- [stateStorageKey]
116
- );
117
- const toggleSidebar = React.useCallback(() => {
118
- if (isMobile) {
119
- setOpenMobile((prev) => !prev);
120
- return;
121
- }
122
- setState((prev) => {
123
- const next = prev === "default" ? "collapsed" : "default";
124
- stateRef.current = next;
125
- persistState(next);
126
- return next;
127
- });
128
- }, [isMobile, persistState]);
129
- const setWidth = React.useCallback(
130
- (next) => {
131
- const clamped = clamp(next, safeMin, safeMax);
132
- widthRef.current = clamped;
133
- writeCssVar(clamped);
134
- },
135
- [safeMin, safeMax, writeCssVar]
136
- );
137
- const collapse = React.useCallback(() => {
138
- stateRef.current = "collapsed";
139
- persistState("collapsed");
140
- setState("collapsed");
141
- }, [persistState]);
142
- const expand = React.useCallback(() => {
143
- stateRef.current = "default";
144
- persistState("default");
145
- setState("default");
146
- }, [persistState]);
147
- const commit = React.useCallback(() => {
148
- setWidthState(widthRef.current);
149
- try {
150
- window.localStorage.setItem(stateStorageKey, stateRef.current);
151
- window.localStorage.setItem(widthStorageKey, String(widthRef.current));
152
- } catch {
153
- }
154
- }, [stateStorageKey, widthStorageKey]);
155
- const setGestureActive = React.useCallback((active) => {
156
- const el = scopeRef.current;
157
- if (!el) return;
158
- if (active) el.setAttribute("data-sidebar-gesture", "active");
159
- else el.removeAttribute("data-sidebar-gesture");
160
- }, []);
161
- React.useEffect(() => {
162
- if (disableKeyboardShortcut) return;
163
- const onKeyDown = (ev) => {
164
- if (ev.code !== "KeyB") return;
165
- if (!(ev.metaKey || ev.ctrlKey)) return;
166
- if (ev.altKey || ev.shiftKey) return;
167
- const target = ev.target;
168
- if (target) {
169
- const tag = target.tagName;
170
- if (tag === "INPUT" || tag === "TEXTAREA" || tag === "SELECT") return;
171
- if (target.isContentEditable) return;
172
- }
173
- ev.preventDefault();
174
- toggleSidebar();
175
- };
176
- window.addEventListener("keydown", onKeyDown);
177
- return () => window.removeEventListener("keydown", onKeyDown);
178
- }, [disableKeyboardShortcut, toggleSidebar]);
179
- const effectiveState = isMobile ? "default" : state;
180
- const contextValue = React.useMemo(
181
- () => ({
182
- state: effectiveState,
183
- desktopState: state,
184
- width,
185
- minWidth: safeMin,
186
- maxWidth: safeMax,
187
- collapseBelow: safeCollapseBelow,
188
- collapsedWidth: safeCollapsed,
189
- isMobile,
190
- toggleSidebar,
191
- setWidth,
192
- collapse,
193
- expand,
194
- commit,
195
- setGestureActive,
196
- LinkComponent
197
- }),
198
- [
199
- effectiveState,
200
- state,
201
- width,
202
- safeMin,
203
- safeMax,
204
- safeCollapseBelow,
205
- safeCollapsed,
206
- isMobile,
207
- toggleSidebar,
208
- setWidth,
209
- collapse,
210
- expand,
211
- commit,
212
- setGestureActive,
213
- LinkComponent
214
- ]
215
- );
216
- const drawerValue = React.useMemo(() => ({ openMobile, setOpenMobile }), [openMobile]);
217
- const scopeStyle = {
218
- [SIDEBAR_WIDTH_VAR]: `${initial.state === "collapsed" ? safeCollapsed : initial.width}px`,
219
- ["--sidebar-width-mobile"]: `${mobileWidth}px`,
220
- display: "contents"
221
- };
222
- return /* @__PURE__ */ jsxRuntime.jsx(
223
- "div",
224
- {
225
- ref: scopeRef,
226
- "data-sidebar-scope": true,
227
- "data-sidebar-state": state,
228
- "data-sidebar-mobile": isMobile ? "true" : "false",
229
- style: scopeStyle,
230
- suppressHydrationWarning: true,
231
- children: /* @__PURE__ */ jsxRuntime.jsx(MainSidebarContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsxRuntime.jsx(MobileDrawerContext.Provider, { value: drawerValue, children }) })
232
- }
233
- );
39
+ function useMobileDrawer() {
40
+ const drawer = React.useContext(MobileDrawerContext);
41
+ if (!drawer) throw new Error("useMobileDrawer must be used within a MainSidebarProvider.");
42
+ return drawer;
234
43
  }
235
44
 
236
45
  function MainSidebarMobileTrigger({
@@ -285,7 +94,7 @@ function MainSidebarNavHeader({
285
94
  LinkComponent: LinkProp,
286
95
  ...props
287
96
  }) {
288
- const ctx = useMaybeSidebar();
97
+ const ctx = useMaybeSidebarState();
289
98
  const state = stateProp ?? ctx?.state ?? "default";
290
99
  const isMobile = ctx?.isMobile ?? false;
291
100
  const Link = LinkProp ?? ctx?.LinkComponent ?? "a";
@@ -317,7 +126,7 @@ function MainSidebarNavHeader({
317
126
  }
318
127
 
319
128
  function MainSidebarNavLabel({ children, className, state: stateProp, ...rest }) {
320
- const ctx = useMaybeSidebar();
129
+ const ctx = useMaybeSidebarState();
321
130
  const state = stateProp ?? ctx?.state ?? "default";
322
131
  if (state === "collapsed") {
323
132
  return /* @__PURE__ */ jsxRuntime.jsx(reactVisuallyHidden.VisuallyHidden, { children });
@@ -372,7 +181,7 @@ function MainSidebarNavLink({
372
181
  asChild = false,
373
182
  ...props
374
183
  }) {
375
- const ctx = useMaybeSidebar();
184
+ const ctx = useMaybeSidebarState();
376
185
  const state = stateProp ?? ctx?.state ?? "default";
377
186
  const Link = LinkProp ?? ctx?.LinkComponent ?? "a";
378
187
  const isCollapsed = state === "collapsed";
@@ -766,16 +575,210 @@ function MainSidebarTrigger({ className, onClick, ...props }) {
766
575
  )
767
576
  }
768
577
  ),
769
- /* @__PURE__ */ jsxRuntime.jsxs(tooltip.TooltipContent, { children: [
770
- "Toggle Sidebar",
771
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1 [&>svg]:size-[1em]", children: [
772
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.KeyboardIcon, {}),
773
- " Ctrl+B"
774
- ] })
775
- ] })
578
+ /* @__PURE__ */ jsxRuntime.jsx(tooltip.TooltipContent, { children: "Toggle Sidebar" })
776
579
  ] });
777
580
  }
778
581
 
582
+ const SIDEBAR_STATE_KEY = "sidebar:state";
583
+ const SIDEBAR_WIDTH_KEY = "sidebar:width";
584
+ const SIDEBAR_WIDTH_VAR = "--sidebar-width";
585
+ const clamp = (v, lo, hi) => Math.min(hi, Math.max(lo, v));
586
+ const useIsoLayoutEffect = typeof window !== "undefined" ? React.useLayoutEffect : React.useEffect;
587
+ function MainSidebarProvider({
588
+ children,
589
+ defaultState = "default",
590
+ defaultWidth = 240,
591
+ minWidth = 200,
592
+ maxWidth = 480,
593
+ collapseBelow,
594
+ collapsedWidth = 64,
595
+ disableKeyboardShortcut = true,
596
+ storageKey,
597
+ mobileBreakpoint = 1024,
598
+ mobileWidth = 360,
599
+ LinkComponent
600
+ }) {
601
+ const safeMin = Math.max(0, Math.min(minWidth, maxWidth));
602
+ const safeMax = Math.max(safeMin, maxWidth);
603
+ const safeCollapsed = Math.max(0, Math.min(collapsedWidth, safeMax));
604
+ const safeDefault = clamp(defaultWidth, safeMin, safeMax);
605
+ const safeCollapseBelow = collapseBelow ?? safeMin;
606
+ const stateStorageKey = storageKey ? `${storageKey}:${SIDEBAR_STATE_KEY}` : SIDEBAR_STATE_KEY;
607
+ const widthStorageKey = storageKey ? `${storageKey}:${SIDEBAR_WIDTH_KEY}` : SIDEBAR_WIDTH_KEY;
608
+ const readInitial = () => {
609
+ if (typeof window === "undefined") return { state: defaultState, width: safeDefault };
610
+ try {
611
+ let nextState = defaultState;
612
+ let nextWidth = safeDefault;
613
+ const storedState = window.localStorage.getItem(stateStorageKey);
614
+ if (storedState === "collapsed" || storedState === "default") nextState = storedState;
615
+ const storedWidth = window.localStorage.getItem(widthStorageKey);
616
+ if (storedWidth !== null) {
617
+ const parsed = Number(storedWidth);
618
+ if (Number.isFinite(parsed)) nextWidth = clamp(parsed, safeMin, safeMax);
619
+ }
620
+ return { state: nextState, width: nextWidth };
621
+ } catch {
622
+ return { state: defaultState, width: safeDefault };
623
+ }
624
+ };
625
+ const initialRef = React.useRef(null);
626
+ if (initialRef.current === null) initialRef.current = readInitial();
627
+ const initial = initialRef.current;
628
+ const [state, setState] = React.useState(initial.state);
629
+ const [width, setWidthState] = React.useState(initial.width);
630
+ const [isMobile, setIsMobile] = React.useState(false);
631
+ const [openMobile, setOpenMobile] = React.useState(false);
632
+ const widthRef = React.useRef(initial.width);
633
+ const stateRef = React.useRef(initial.state);
634
+ stateRef.current = state;
635
+ const scopeRef = React.useRef(null);
636
+ React.useEffect(() => {
637
+ if (typeof window === "undefined") return;
638
+ const mq = window.matchMedia(`(max-width: ${mobileBreakpoint - 1}px)`);
639
+ const update = () => setIsMobile(mq.matches);
640
+ update();
641
+ mq.addEventListener("change", update);
642
+ return () => mq.removeEventListener("change", update);
643
+ }, [mobileBreakpoint]);
644
+ React.useEffect(() => {
645
+ if (!isMobile && openMobile) setOpenMobile(false);
646
+ }, [isMobile, openMobile]);
647
+ const writeCssVar = React.useCallback((px) => {
648
+ const el = scopeRef.current;
649
+ if (el) el.style.setProperty(SIDEBAR_WIDTH_VAR, `${px}px`);
650
+ }, []);
651
+ useIsoLayoutEffect(() => {
652
+ writeCssVar(state === "collapsed" ? safeCollapsed : widthRef.current);
653
+ }, [state, safeCollapsed, writeCssVar]);
654
+ const persistState = React.useCallback(
655
+ (next) => {
656
+ try {
657
+ window.localStorage.setItem(stateStorageKey, next);
658
+ } catch {
659
+ }
660
+ },
661
+ [stateStorageKey]
662
+ );
663
+ const toggleSidebar = React.useCallback(() => {
664
+ if (isMobile) {
665
+ setOpenMobile((prev) => !prev);
666
+ return;
667
+ }
668
+ setState((prev) => {
669
+ const next = prev === "default" ? "collapsed" : "default";
670
+ stateRef.current = next;
671
+ persistState(next);
672
+ return next;
673
+ });
674
+ }, [isMobile, persistState]);
675
+ const setWidth = React.useCallback(
676
+ (next) => {
677
+ const clamped = clamp(next, safeMin, safeMax);
678
+ widthRef.current = clamped;
679
+ writeCssVar(clamped);
680
+ },
681
+ [safeMin, safeMax, writeCssVar]
682
+ );
683
+ const collapse = React.useCallback(() => {
684
+ stateRef.current = "collapsed";
685
+ persistState("collapsed");
686
+ setState("collapsed");
687
+ }, [persistState]);
688
+ const expand = React.useCallback(() => {
689
+ stateRef.current = "default";
690
+ persistState("default");
691
+ setState("default");
692
+ }, [persistState]);
693
+ const commit = React.useCallback(() => {
694
+ setWidthState(widthRef.current);
695
+ try {
696
+ window.localStorage.setItem(stateStorageKey, stateRef.current);
697
+ window.localStorage.setItem(widthStorageKey, String(widthRef.current));
698
+ } catch {
699
+ }
700
+ }, [stateStorageKey, widthStorageKey]);
701
+ const setGestureActive = React.useCallback((active) => {
702
+ const el = scopeRef.current;
703
+ if (!el) return;
704
+ if (active) el.setAttribute("data-sidebar-gesture", "active");
705
+ else el.removeAttribute("data-sidebar-gesture");
706
+ }, []);
707
+ React.useEffect(() => {
708
+ if (disableKeyboardShortcut) return;
709
+ const onKeyDown = (ev) => {
710
+ if (ev.code !== "KeyB") return;
711
+ if (!(ev.metaKey || ev.ctrlKey)) return;
712
+ if (ev.altKey || ev.shiftKey) return;
713
+ const target = ev.target;
714
+ if (target) {
715
+ const tag = target.tagName;
716
+ if (tag === "INPUT" || tag === "TEXTAREA" || tag === "SELECT") return;
717
+ if (target.isContentEditable) return;
718
+ }
719
+ ev.preventDefault();
720
+ toggleSidebar();
721
+ };
722
+ window.addEventListener("keydown", onKeyDown);
723
+ return () => window.removeEventListener("keydown", onKeyDown);
724
+ }, [disableKeyboardShortcut, toggleSidebar]);
725
+ const effectiveState = isMobile ? "default" : state;
726
+ const contextValue = React.useMemo(
727
+ () => ({
728
+ state: effectiveState,
729
+ desktopState: state,
730
+ width,
731
+ minWidth: safeMin,
732
+ maxWidth: safeMax,
733
+ collapseBelow: safeCollapseBelow,
734
+ collapsedWidth: safeCollapsed,
735
+ isMobile,
736
+ toggleSidebar,
737
+ setWidth,
738
+ collapse,
739
+ expand,
740
+ commit,
741
+ setGestureActive,
742
+ LinkComponent
743
+ }),
744
+ [
745
+ effectiveState,
746
+ state,
747
+ width,
748
+ safeMin,
749
+ safeMax,
750
+ safeCollapseBelow,
751
+ safeCollapsed,
752
+ isMobile,
753
+ toggleSidebar,
754
+ setWidth,
755
+ collapse,
756
+ expand,
757
+ commit,
758
+ setGestureActive,
759
+ LinkComponent
760
+ ]
761
+ );
762
+ const drawerValue = React.useMemo(() => ({ openMobile, setOpenMobile }), [openMobile]);
763
+ const scopeStyle = {
764
+ [SIDEBAR_WIDTH_VAR]: `${initial.state === "collapsed" ? safeCollapsed : initial.width}px`,
765
+ ["--sidebar-width-mobile"]: `${mobileWidth}px`,
766
+ display: "contents"
767
+ };
768
+ return /* @__PURE__ */ jsxRuntime.jsx(
769
+ "div",
770
+ {
771
+ ref: scopeRef,
772
+ "data-sidebar-scope": true,
773
+ "data-sidebar-state": state,
774
+ "data-sidebar-mobile": isMobile ? "true" : "false",
775
+ style: scopeStyle,
776
+ suppressHydrationWarning: true,
777
+ children: /* @__PURE__ */ jsxRuntime.jsx(MainSidebarContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsxRuntime.jsx(MobileDrawerContext.Provider, { value: drawerValue, children }) })
778
+ }
779
+ );
780
+ }
781
+
779
782
  function getIsLinkActive(link, pathname, siblings = []) {
780
783
  const matches = (url) => pathname === url || pathname.startsWith(url + "/");
781
784
  const flattenLinks = (links) => links.flatMap((item) => [item, ...flattenLinks(item.children ?? [])]);
@@ -808,4 +811,6 @@ exports.getIsLinkActive = getIsLinkActive;
808
811
  exports.navItemClasses = navItemClasses;
809
812
  exports.useMainSidebar = useMainSidebar;
810
813
  exports.useMaybeSidebar = useMaybeSidebar;
814
+ exports.useMaybeSidebarState = useMaybeSidebarState;
815
+ exports.useMobileDrawer = useMobileDrawer;
811
816
  //# sourceMappingURL=MainSidebar.cjs.js.map