@admin-layout/tailwind-design-pro 12.2.4-alpha.2 → 12.2.4-alpha.20
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.
- package/README.md +80 -0
- package/lib/components/LanguageMenu/LanguageMenu.d.ts.map +1 -1
- package/lib/components/LanguageMenu/LanguageMenu.js +6 -2
- package/lib/components/LanguageMenu/LanguageMenu.js.map +1 -1
- package/lib/components/Layout/BasicLayout/index.d.ts.map +1 -1
- package/lib/components/Layout/BasicLayout/index.js +13 -5
- package/lib/components/Layout/BasicLayout/index.js.map +1 -1
- package/lib/components/Layout/BasicLayout/utils.js +1 -1
- package/lib/components/Layout/BasicLayout/utils.js.map +1 -1
- package/lib/components/Layout/GlobalFooter/BottomMenuDropdown.js +1 -1
- package/lib/components/Layout/GlobalFooter/BottomMenuDropdown.js.map +1 -1
- package/lib/components/Layout/GlobalHeader/NavbarSlotStrip.d.ts +12 -0
- package/lib/components/Layout/GlobalHeader/NavbarSlotStrip.d.ts.map +1 -0
- package/lib/components/Layout/GlobalHeader/NavbarSlotStrip.js +18 -0
- package/lib/components/Layout/GlobalHeader/NavbarSlotStrip.js.map +1 -0
- package/lib/components/Layout/GlobalHeader/RightContent.d.ts +1 -2
- package/lib/components/Layout/GlobalHeader/RightContent.d.ts.map +1 -1
- package/lib/components/Layout/GlobalHeader/RightContent.js +10 -72
- package/lib/components/Layout/GlobalHeader/RightContent.js.map +1 -1
- package/lib/components/Layout/GlobalHeader/index.d.ts +1 -0
- package/lib/components/Layout/GlobalHeader/index.d.ts.map +1 -1
- package/lib/components/Layout/ProTailwindLayout.d.ts +19 -8
- package/lib/components/Layout/ProTailwindLayout.d.ts.map +1 -1
- package/lib/components/Layout/ProTailwindLayout.js +227 -76
- package/lib/components/Layout/ProTailwindLayout.js.map +1 -1
- package/lib/components/Layout/Sidebar/BottomMenu.d.ts.map +1 -1
- package/lib/components/Layout/Sidebar/BottomMenu.js +4 -4
- package/lib/components/Layout/Sidebar/BottomMenu.js.map +1 -1
- package/lib/components/Layout/Sidebar/MainSidebar.d.ts.map +1 -1
- package/lib/components/Layout/Sidebar/MainSidebar.js +10 -3
- package/lib/components/Layout/Sidebar/MainSidebar.js.map +1 -1
- package/lib/components/Layout/Sidebar/PerplexSidebarMenu.d.ts.map +1 -1
- package/lib/components/Layout/Sidebar/PerplexSidebarMenu.js +53 -14
- package/lib/components/Layout/Sidebar/PerplexSidebarMenu.js.map +1 -1
- package/lib/components/Layout/TailwindLayout.d.ts.map +1 -1
- package/lib/components/Layout/TailwindLayout.js +19 -2
- package/lib/components/Layout/TailwindLayout.js.map +1 -1
- package/lib/components/Layout/defaultPermissions.d.ts +134 -0
- package/lib/components/Layout/defaultPermissions.d.ts.map +1 -0
- package/lib/components/Layout/defaultPermissions.js +134 -0
- package/lib/components/Layout/defaultPermissions.js.map +1 -0
- package/lib/components/Layout/slot-fill/RightContent.d.ts +3 -1
- package/lib/components/Layout/slot-fill/RightContent.d.ts.map +1 -1
- package/lib/components/Layout/slot-fill/RightContent.js +4 -6
- package/lib/components/Layout/slot-fill/RightContent.js.map +1 -1
- package/lib/components/SettingDrawer/hooks/useSettingsOperations.d.ts.map +1 -1
- package/lib/components/SettingDrawer/hooks/useSettingsOperations.js +13 -9
- package/lib/components/SettingDrawer/hooks/useSettingsOperations.js.map +1 -1
- package/lib/components/SettingDrawer/utils/transformers.d.ts +16 -0
- package/lib/components/SettingDrawer/utils/transformers.d.ts.map +1 -1
- package/lib/components/SettingDrawer/utils/transformers.js +39 -2
- package/lib/components/SettingDrawer/utils/transformers.js.map +1 -1
- package/lib/components/index.js +1 -1
- package/lib/components/typings.d.ts +2 -0
- package/lib/components/typings.d.ts.map +1 -1
- package/lib/compute.d.ts.map +1 -1
- package/lib/compute.js +1 -1
- package/lib/compute.js.map +1 -1
- package/lib/routes.json +2 -1
- package/package.json +7 -6
|
@@ -1,23 +1,31 @@
|
|
|
1
1
|
import { filterRoutesWithLocale, transformData, addProLayoutParentKeys, removeUnnecessaryProperties, menuDataRender } from '@admin-layout/client';
|
|
2
2
|
import { matchParentRoute } from '@admin-layout/client/lib/utils/parentRoute.js';
|
|
3
3
|
import { getAvailableCategories, getMenusByAdvancedFilter } from '@common-stack/client-react/lib/utils/filteredRoutes.js';
|
|
4
|
-
import { useMatches } from '@remix-run/react';
|
|
4
|
+
import { useLoaderData, useMatches } from '@remix-run/react';
|
|
5
5
|
import { ClientContainerService } from 'common';
|
|
6
6
|
import * as React from 'react';
|
|
7
7
|
import { useSelector } from 'react-redux';
|
|
8
8
|
import { createSelector } from 'reselect';
|
|
9
|
+
import { defaultPermissions } from './defaultPermissions.js';
|
|
9
10
|
import { config } from '../../config/env-config.js';
|
|
10
11
|
import BasicLayoutEnhanced from './TailwindLayout.js';
|
|
11
|
-
import stylesheet from '../../styles/index.css?url';
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
import stylesheet from '../../styles/index.css?url'; // Cache for SPA mode menu data to avoid re-fetching on every route change
|
|
13
|
+
let cachedSpaMenuData = null;
|
|
14
|
+
// Safe selectors that handle undefined state slices in SPA mode
|
|
15
|
+
const selectOrgName = state => state?.platform?.orgName ?? '';
|
|
16
|
+
const selectSettings = state => state?.settings ?? {};
|
|
14
17
|
const selector = createSelector([selectOrgName, selectSettings], (orgName, settings) => ({
|
|
15
18
|
orgName,
|
|
16
19
|
settings
|
|
17
20
|
}));
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
const handle = {
|
|
22
|
+
i18n: 'menu'
|
|
23
|
+
};
|
|
24
|
+
const links = () => [{
|
|
25
|
+
rel: 'stylesheet',
|
|
26
|
+
href: stylesheet
|
|
27
|
+
}];
|
|
28
|
+
//helper func
|
|
21
29
|
function filterMenuItemsByVisibility(menuData, settings) {
|
|
22
30
|
if (!menuData || !Array.isArray(menuData)) return [];
|
|
23
31
|
const hiddenMenuCategories = settings?.hiddenMenuCategories || [];
|
|
@@ -67,13 +75,220 @@ function filterMenuItemsByVisibility(menuData, settings) {
|
|
|
67
75
|
};
|
|
68
76
|
return filterItemsRecursively(filteredByCategory);
|
|
69
77
|
}
|
|
70
|
-
|
|
78
|
+
// NOTE: No HydrateFallback exported - we use SSR so the server-rendered content displays immediately.
|
|
79
|
+
// HydrateFallback should only be used for client-only routes that can't render until clientLoader runs.
|
|
80
|
+
// loader or action
|
|
81
|
+
async function loader(params) {
|
|
71
82
|
const {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
83
|
+
routeConfig
|
|
84
|
+
} = params.context;
|
|
85
|
+
let parentRoute = null;
|
|
86
|
+
try {
|
|
87
|
+
parentRoute = matchParentRoute(routeConfig, config.LAYOUT_ROOT);
|
|
88
|
+
} catch (e) {
|
|
89
|
+
console.log('[ProTailwindLayout loader] Error matching parent route:', e);
|
|
90
|
+
}
|
|
91
|
+
// Handle case when parentRoute is null or doesn't have routes
|
|
92
|
+
const routes = parentRoute?.routes || [];
|
|
93
|
+
if (routes.length === 0) {
|
|
94
|
+
console.warn('[ProTailwindLayout loader] No routes found for LAYOUT_ROOT:', config.LAYOUT_ROOT);
|
|
95
|
+
}
|
|
96
|
+
const routeWithLocale = filterRoutesWithLocale(routes);
|
|
97
|
+
const routeWithChildren = transformData(routeWithLocale);
|
|
98
|
+
const menuDataWithParentKeys = addProLayoutParentKeys(routeWithChildren);
|
|
99
|
+
menuDataWithParentKeys.forEach(item => removeUnnecessaryProperties(item));
|
|
100
|
+
let permissions = params?._dataContext?.permissions;
|
|
101
|
+
let apolloState = params?._dataContext?.apolloState;
|
|
102
|
+
if (!permissions) {
|
|
103
|
+
throw new Error('Permissions not found');
|
|
104
|
+
}
|
|
105
|
+
if (!apolloState) {
|
|
106
|
+
throw new Error('ApolloState not found');
|
|
107
|
+
}
|
|
108
|
+
const newMenuData = menuDataRender(routeWithLocale, permissions);
|
|
109
|
+
// returnInfo: {"keys":["newMenuData","apolloState","permissions"],"hasOptions":false}
|
|
110
|
+
return {
|
|
111
|
+
data: [newMenuData, apolloState, permissions]
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
async function clientLoader({
|
|
115
|
+
serverLoader
|
|
116
|
+
}) {
|
|
117
|
+
// In SPA mode (ssr: false), serverLoader throws an error when called
|
|
118
|
+
// We check the Remix context to determine if we're in SPA mode
|
|
119
|
+
const remixContext = typeof window !== 'undefined' ? window.__remixContext : null;
|
|
120
|
+
// In SPA mode, isSpaMode is true. In SSR mode, it's false or undefined.
|
|
121
|
+
const isSPAMode = remixContext?.isSpaMode === true;
|
|
122
|
+
console.log('[ProTailwindLayout clientLoader] Starting...', {
|
|
123
|
+
isSPAMode,
|
|
124
|
+
hasRemixContext: !!remixContext,
|
|
125
|
+
remixContextKeys: remixContext ? Object.keys(remixContext) : []
|
|
126
|
+
});
|
|
127
|
+
let loaderData = null;
|
|
128
|
+
let hasValidServerData = false;
|
|
129
|
+
// Only attempt to call serverLoader in SSR mode
|
|
130
|
+
// In SPA mode, serverLoader() will throw "You cannot call serverLoader() in SPA Mode"
|
|
131
|
+
if (!isSPAMode) {
|
|
132
|
+
try {
|
|
133
|
+
console.log('[ProTailwindLayout clientLoader] Calling serverLoader (SSR mode)...');
|
|
134
|
+
loaderData = await serverLoader();
|
|
135
|
+
hasValidServerData = loaderData && loaderData.newMenuData && loaderData.newMenuData.length > 0;
|
|
136
|
+
console.log('[ProTailwindLayout clientLoader] serverLoader result:', {
|
|
137
|
+
hasLoaderData: !!loaderData,
|
|
138
|
+
hasNewMenuData: !!loaderData?.newMenuData,
|
|
139
|
+
menuDataLength: loaderData?.newMenuData?.length || 0,
|
|
140
|
+
hasValidServerData
|
|
141
|
+
});
|
|
142
|
+
} catch (e) {
|
|
143
|
+
// If serverLoader fails, we'll fall back to SPA mode data generation
|
|
144
|
+
// This can happen if the server doesn't return expected data
|
|
145
|
+
console.warn('[ProTailwindLayout clientLoader] serverLoader failed:', e);
|
|
146
|
+
}
|
|
147
|
+
} else {
|
|
148
|
+
console.log('[ProTailwindLayout clientLoader] Skipping serverLoader (SPA mode detected)');
|
|
149
|
+
}
|
|
150
|
+
if (hasValidServerData) {
|
|
151
|
+
// SSR mode - hydrate apollo cache and organization context
|
|
152
|
+
const {
|
|
153
|
+
apolloState
|
|
154
|
+
} = loaderData;
|
|
155
|
+
try {
|
|
156
|
+
const {
|
|
157
|
+
container
|
|
158
|
+
} = window.__CLIENT_SERVICE__;
|
|
159
|
+
// const apolloCache = container.get(ClientTypes.InMemoryCache);
|
|
160
|
+
// apolloCache.restore(apolloState);
|
|
161
|
+
const organizationContext = container.get(ClientContainerService.IOrganizationContextService);
|
|
162
|
+
organizationContext.hydrate(apolloState);
|
|
163
|
+
} catch (e) {
|
|
164
|
+
console.error('[ProTailwindLayout clientLoader] Error in client hydrate:', e);
|
|
165
|
+
}
|
|
166
|
+
console.log('[ProTailwindLayout clientLoader] Returning SSR data with', loaderData.newMenuData.length, 'menu items');
|
|
167
|
+
return loaderData;
|
|
168
|
+
}
|
|
169
|
+
// SPA mode - get route config from window.__ROUTES_CONFIG__ or fetch from routes-config.json
|
|
170
|
+
console.log('[ProTailwindLayout clientLoader] Entering SPA mode route generation...');
|
|
171
|
+
// Return cached data if available to avoid unnecessary fetches on route changes
|
|
172
|
+
if (cachedSpaMenuData && cachedSpaMenuData.newMenuData.length > 0) {
|
|
173
|
+
console.log('[ProTailwindLayout clientLoader] Returning cached SPA menu data');
|
|
174
|
+
return cachedSpaMenuData;
|
|
175
|
+
}
|
|
176
|
+
try {
|
|
177
|
+
// First try to get routes config from window global variable
|
|
178
|
+
// If not available, fall back to fetching from routes-config.json
|
|
179
|
+
let routeConfig = [];
|
|
180
|
+
if (typeof window !== 'undefined' && window.__ROUTES_CONFIG__) {
|
|
181
|
+
console.log('[ProTailwindLayout clientLoader] Using window.__ROUTES_CONFIG__');
|
|
182
|
+
// Handle both array format and object format { routes: [...] }
|
|
183
|
+
const windowConfig = window.__ROUTES_CONFIG__;
|
|
184
|
+
routeConfig = Array.isArray(windowConfig) ? windowConfig : windowConfig?.routes || [];
|
|
185
|
+
}
|
|
186
|
+
if (!routeConfig.length) {
|
|
187
|
+
// Fetch routes-config.json as fallback
|
|
188
|
+
// Try multiple paths since Vite serves files differently in dev vs prod
|
|
189
|
+
console.log('[ProTailwindLayout clientLoader] Fetching routes-config.json...');
|
|
190
|
+
const pathsToTry = ['/app/routes-config.json', '/routes-config.json', './routes-config.json'];
|
|
191
|
+
for (const path of pathsToTry) {
|
|
192
|
+
try {
|
|
193
|
+
const response = await fetch(path);
|
|
194
|
+
if (response.ok) {
|
|
195
|
+
const jsonData = await response.json();
|
|
196
|
+
// Handle both array format and object format { routes: [...] }
|
|
197
|
+
routeConfig = Array.isArray(jsonData) ? jsonData : jsonData?.routes || [];
|
|
198
|
+
console.log('[ProTailwindLayout clientLoader] Fetched routes-config.json from', path);
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
} catch (fetchError) {
|
|
202
|
+
console.warn('[ProTailwindLayout clientLoader] Failed to fetch from', path);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (!routeConfig.length) {
|
|
206
|
+
console.warn('[ProTailwindLayout clientLoader] Could not fetch routes-config.json from any path');
|
|
207
|
+
}
|
|
75
208
|
}
|
|
76
|
-
|
|
209
|
+
console.log('[ProTailwindLayout clientLoader] routeConfig:', {
|
|
210
|
+
isArray: Array.isArray(routeConfig),
|
|
211
|
+
length: routeConfig?.length || 0,
|
|
212
|
+
topLevelKeys: routeConfig?.map?.(r => r.key) || []
|
|
213
|
+
});
|
|
214
|
+
// Transform routes to menu format - the config already has hierarchical structure with nested routes
|
|
215
|
+
const transformToMenuData = routes => {
|
|
216
|
+
return routes.filter(r => !r.hideInMenu && !r.isResourceRoute && !r.path?.includes('/resources/')).map(route => {
|
|
217
|
+
const menuItem = {
|
|
218
|
+
key: route.key,
|
|
219
|
+
name: route.name,
|
|
220
|
+
path: route.path,
|
|
221
|
+
icon: route.icon,
|
|
222
|
+
position: route.position,
|
|
223
|
+
priority: route.priority,
|
|
224
|
+
exact: route.exact
|
|
225
|
+
};
|
|
226
|
+
// Recursively transform child routes
|
|
227
|
+
if (route.routes && route.routes.length > 0) {
|
|
228
|
+
menuItem.children = transformToMenuData(route.routes);
|
|
229
|
+
}
|
|
230
|
+
return menuItem;
|
|
231
|
+
});
|
|
232
|
+
};
|
|
233
|
+
// Find the root layout and get its child routes for menu
|
|
234
|
+
// Look for the layout route that contains child routes for the sidebar menu
|
|
235
|
+
const rootLayout = routeConfig.find?.(r => (r.key === 'root-layout' || r.path?.includes(':orgName')) && r.routes && r.routes.length > 0);
|
|
236
|
+
const menuRoutes = rootLayout?.routes || routeConfig;
|
|
237
|
+
console.log('[ProTailwindLayout clientLoader] Root layout found:', !!rootLayout, rootLayout?.key, rootLayout?.path);
|
|
238
|
+
console.log('[ProTailwindLayout clientLoader] Menu routes count:', menuRoutes?.length || 0);
|
|
239
|
+
const menuData = transformToMenuData(menuRoutes || []);
|
|
240
|
+
console.log('[ProTailwindLayout clientLoader] Final menuData:', {
|
|
241
|
+
length: menuData.length,
|
|
242
|
+
items: menuData.map(m => ({
|
|
243
|
+
key: m.key,
|
|
244
|
+
name: m.name,
|
|
245
|
+
path: m.path,
|
|
246
|
+
icon: m.icon,
|
|
247
|
+
childrenCount: m.children?.length || 0
|
|
248
|
+
}))
|
|
249
|
+
});
|
|
250
|
+
// Cache the result for subsequent route changes
|
|
251
|
+
cachedSpaMenuData = {
|
|
252
|
+
newMenuData: menuData,
|
|
253
|
+
permissions: defaultPermissions,
|
|
254
|
+
apolloState: {}
|
|
255
|
+
};
|
|
256
|
+
return cachedSpaMenuData;
|
|
257
|
+
} catch (e) {
|
|
258
|
+
console.error('[ProTailwindLayout clientLoader] Error generating menu data in SPA mode:', e);
|
|
259
|
+
console.error('[ProTailwindLayout clientLoader] Error details:', {
|
|
260
|
+
name: e.name,
|
|
261
|
+
message: e.message,
|
|
262
|
+
stack: e.stack
|
|
263
|
+
});
|
|
264
|
+
return {
|
|
265
|
+
newMenuData: [],
|
|
266
|
+
permissions: {},
|
|
267
|
+
apolloState: {}
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
// NOTE: We intentionally do NOT set clientLoader.hydrate = true
|
|
272
|
+
// This means:
|
|
273
|
+
// - Initial page load: Uses server loader data directly (instant SSR)
|
|
274
|
+
// - Client navigation: clientLoader runs to fetch/transform data
|
|
275
|
+
// - No HydrateFallback needed since SSR content renders immediately
|
|
276
|
+
const shouldRevalidate = ({
|
|
277
|
+
currentParams,
|
|
278
|
+
nextParams
|
|
279
|
+
}) => {
|
|
280
|
+
return currentParams.orgName !== nextParams.orgName;
|
|
281
|
+
};
|
|
282
|
+
function ProTailwindLayout(props) {
|
|
283
|
+
// Use Remix's useLoaderData to get data from clientLoader/loader
|
|
284
|
+
const loaderData = useLoaderData() || {
|
|
285
|
+
permissions: null,
|
|
286
|
+
newMenuData: []
|
|
287
|
+
};
|
|
288
|
+
const {
|
|
289
|
+
permissions = defaultPermissions,
|
|
290
|
+
newMenuData = []
|
|
291
|
+
} = loaderData || {};
|
|
77
292
|
const matches = useMatches();
|
|
78
293
|
const current = matches[matches.length - 1];
|
|
79
294
|
const {
|
|
@@ -116,69 +331,5 @@ const ProTailwindLayout = props => {
|
|
|
116
331
|
menuData: filteredMenuData,
|
|
117
332
|
fullMenuData: newMenuData
|
|
118
333
|
});
|
|
119
|
-
};
|
|
120
|
-
const handle = {
|
|
121
|
-
i18n: 'menu'
|
|
122
|
-
};
|
|
123
|
-
const links = () => [{
|
|
124
|
-
rel: 'stylesheet',
|
|
125
|
-
href: stylesheet
|
|
126
|
-
}];
|
|
127
|
-
const loader = async params => {
|
|
128
|
-
const {
|
|
129
|
-
routeConfig
|
|
130
|
-
} = params.context;
|
|
131
|
-
let parentRoute = {};
|
|
132
|
-
try {
|
|
133
|
-
parentRoute = matchParentRoute(routeConfig, config.LAYOUT_ROOT);
|
|
134
|
-
} catch (e) {
|
|
135
|
-
console.log(e);
|
|
136
|
-
}
|
|
137
|
-
const routeWithLocale = filterRoutesWithLocale(parentRoute['routes']);
|
|
138
|
-
const routeWithChildren = transformData(routeWithLocale);
|
|
139
|
-
const menuDataWithParentKeys = addProLayoutParentKeys(routeWithChildren);
|
|
140
|
-
menuDataWithParentKeys.forEach(item => removeUnnecessaryProperties(item));
|
|
141
|
-
let permissions = params?._dataContext?.permissions;
|
|
142
|
-
let apolloState = params?._dataContext?.apolloState;
|
|
143
|
-
if (!permissions) {
|
|
144
|
-
throw new Error('Permissions not found');
|
|
145
|
-
}
|
|
146
|
-
if (!apolloState) {
|
|
147
|
-
throw new Error('ApolloState not found');
|
|
148
|
-
}
|
|
149
|
-
const newMenuData = menuDataRender(routeWithLocale, permissions);
|
|
150
|
-
// returnInfo: {"keys":["newMenuData","apolloState"],"hasOptions":false}
|
|
151
|
-
return {
|
|
152
|
-
data: [newMenuData, apolloState]
|
|
153
|
-
};
|
|
154
|
-
};
|
|
155
|
-
async function clientLoader({
|
|
156
|
-
request,
|
|
157
|
-
params,
|
|
158
|
-
serverLoader
|
|
159
|
-
}) {
|
|
160
|
-
// During client-side navigations, we hit our exposed API endpoints directly
|
|
161
|
-
// do not restore apollo state in cache memory as it can rewrite newer data
|
|
162
|
-
const loaderData = await serverLoader();
|
|
163
|
-
const {
|
|
164
|
-
apolloState
|
|
165
|
-
} = loaderData;
|
|
166
|
-
try {
|
|
167
|
-
const {
|
|
168
|
-
container
|
|
169
|
-
} = window.__CLIENT_SERVICE__;
|
|
170
|
-
const organizationContext = container.get(ClientContainerService.IOrganizationContextService);
|
|
171
|
-
organizationContext.hydrate(apolloState);
|
|
172
|
-
} catch (e) {
|
|
173
|
-
console.error('Error in client hydrate');
|
|
174
|
-
console.error(e);
|
|
175
|
-
}
|
|
176
|
-
return loaderData;
|
|
177
334
|
}
|
|
178
|
-
const shouldRevalidate = ({
|
|
179
|
-
currentParams,
|
|
180
|
-
nextParams
|
|
181
|
-
}) => {
|
|
182
|
-
return currentParams.orgName !== nextParams.orgName;
|
|
183
|
-
};
|
|
184
335
|
export { clientLoader, ProTailwindLayout as default, handle, links, loader, shouldRevalidate }; //# sourceMappingURL=ProTailwindLayout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProTailwindLayout.js","sources":["../../../src/components/Layout/ProTailwindLayout.tsx"],"sourcesContent":[null],"names":[
|
|
1
|
+
{"version":3,"file":"ProTailwindLayout.js","sources":["../../../src/components/Layout/ProTailwindLayout.tsx"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BottomMenu.d.ts","sourceRoot":"","sources":["../../../../src/components/Layout/Sidebar/BottomMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgD,MAAM,OAAO,CAAC;AAOrE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAgBhD,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,
|
|
1
|
+
{"version":3,"file":"BottomMenu.d.ts","sourceRoot":"","sources":["../../../../src/components/Layout/Sidebar/BottomMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgD,MAAM,OAAO,CAAC;AAOrE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAgBhD,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAyUhD,CAAC"}
|
|
@@ -34,13 +34,13 @@ const BottomMenu = ({
|
|
|
34
34
|
t: key => key
|
|
35
35
|
}; // Mock translation function
|
|
36
36
|
// const cancelRef = React.useRef();
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
// Memoized selector to avoid returning new references
|
|
38
|
+
const userState = useAppSelector(state => state?.user);
|
|
39
|
+
const profile = userState?.profile || {};
|
|
40
40
|
const {
|
|
41
41
|
nickname,
|
|
42
42
|
picture: profilePicture
|
|
43
|
-
} = profile
|
|
43
|
+
} = profile;
|
|
44
44
|
const onOpen = () => setIsOpen(true);
|
|
45
45
|
const onClose = () => setIsOpen(false);
|
|
46
46
|
const toggleMenu = () => setIsOpen(!isOpen);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BottomMenu.js","sources":["../../../../src/components/Layout/Sidebar/BottomMenu.tsx"],"sourcesContent":[null],"names":["React"],"mappings":"yTASA,MAAM,eAAe,GAAkB,CAAC;MACpC;;;eAIQ,EAAA,SAAc,IAAI,QAAQ,CAAA,IAAA,CAAA;kBACtB;AACJ,IAAA,IAAA,CAAA,MAAG,EAAA;mBACN,CAAA,IAAA,CAAA,CAAA,IAAA,CAAA,SAAA,IAAA;QACF,SAAI,CAAA,SAAA,CAAA;AAEP,MAAA,CAAA,CAAA;AACJ,IAAE;AAEF,EAAA,CAAA,EAAA,EAAO;SAUH,uBAAkB,CAAA,aAAa,CAAG,MAAA,CAAA,OAA+B,EAAA;IACjE,OAAO,EAAA;AACP,GAAA,CAAA,GAAAA,cAAO,CAAA,aAAc,CAAE,KAAA,EAAA,IAAA,EAAA,YAAqB,CAAK;AACjD,CAAA;AACQ,MAAC,UAAU,GAAC,CAAG;UACvB;
|
|
1
|
+
{"version":3,"file":"BottomMenu.js","sources":["../../../../src/components/Layout/Sidebar/BottomMenu.tsx"],"sourcesContent":[null],"names":["React","RouterLink"],"mappings":"yTASA,MAAM,eAAe,GAAkB,CAAC;MACpC;;;eAIQ,EAAA,SAAc,IAAI,QAAQ,CAAA,IAAA,CAAA;kBACtB;AACJ,IAAA,IAAA,CAAA,MAAG,EAAA;mBACN,CAAA,IAAA,CAAA,CAAA,IAAA,CAAA,SAAA,IAAA;QACF,SAAI,CAAA,SAAA,CAAA;AAEP,MAAA,CAAA,CAAA;AACJ,IAAE;AAEF,EAAA,CAAA,EAAA,EAAO;SAUH,uBAAkB,CAAA,aAAa,CAAG,MAAA,CAAA,OAA+B,EAAA;IACjE,OAAO,EAAA;AACP,GAAA,CAAA,GAAAA,cAAO,CAAA,aAAc,CAAE,KAAA,EAAA,IAAA,EAAA,YAAqB,CAAK;AACjD,CAAA;AACQ,MAAC,UAAU,GAAC,CAAG;UACvB;aAEA;AACA,EAAA,iBAAe;AACf,EAAA,QAAM;UACA;aAEA;UACA;;AAEN,CAAA,KAAA;AACA,EAAA,MAAA,CAAA,uBAAwB,CAAA,GAAQ,QAAQ,EAAE;QAE1C,CAAA,MAAA,EAAA,SAAA,CAAA,GAAA,QAAA,CAAA,KAAA,CAAA;QACA,CAAA,cAAe,EAAA,iBAAA,CAAA,GAAAA,cAAA,CAAA,QAAA,CAAA,IAAA,CAAA;AACX,EAAA,MAAA,OAAM,GAAA,MAAA,CAAA,IAAA,CAAA;AACF,EAAA,MAAA;;;AAGJ,IAAA,CAAA,EAAA,GAAE,IAAA;;AAGF;AACI;iBACI,GAAA,cAAiB,CAAA,KAAA,IAAA,KAAA,EAAA,IAAA,CAAA;eACpB,GAAA,SAAA,EAAA,OAAA,IAAA,EAAA;AACL,EAAA,MAAA;YAEI;AACA,IAAA,OAAA,EAAA;AACA,GAAA,GAAA,OAAA;QACJ,MAAC,GAAA,MAAA,SAAA,CAAA,IAAA,CAAA;AAED,EAAA,MAAA,OAAO,GAAG,MAAE,SAAA,CAAA,KAAA,CAAA;AACR,EAAA,MAAA,UAAA,GAAS,MAAA,SAAA,CAAA,CAAA;AACT,EAAA,MAAA,gBAAS,GAAA,QAAA,EAAA,IAAoB,SAAS,IAAE,CAAA,GAAA,KAAA,SAAc,CAAA;AAC1D,EAAA,MAAA,eAAE,GAAA,QAAA,EAAA,MAAA,CAAA,IAAA,IAAA,IAAA,CAAA,GAAA,KAAA,cAAA,CAAA;AACN;WAEM,CAAA,MAAA;UACA,kBAAsB,GAAA,KAAA,IAAW;AACnC,MAAA,IAAE,QAAa,OAAE,IAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,KAAA,CAAA,MAAA,CAAA,EAAA;AACb,QAAA,SAAO,CAAA,KAAA,CAAA;;AAEH,IAAA,CAAA;;AAER,IAAA,MAAG,YAAA,GAAA,KAAA,IAAA;MACP,IAAA,SAAe,KAAA,QAAA,EAAA;AACX,QAAA,SAAA,CAAA,KAAa,CAAA;AACjB,MAAC;AAED,IAAA,CAAA;QACI,MAAI,EAAI;AACJ,MAAA,QAAA,CAAA,gBAAY,CAAA,WAAA,EAAA,kBAAA,CAAA;cACf,CAAA,gBAAA,CAAA,SAAA,EAAA,YAAA,CAAA;;iBAEG;cACH,CAAA,mBAAA,CAAA,WAAA,EAAA,kBAAA,CAAA;AACD,MAAA,QAAA,CAAO,mBAAiB,CAAA,SAAQ,EAAM,YAAO,CAAA;AACjD,IAAA,CAAC;AAED,EAAA,CAAA,EAAA,CAAA,MAAM,CAAA,CAAA;QACF,WAAA,GAAA,QAAA,EAAA,MAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,UAAwC,CAAA,EAAA,GAAA,CAAA,CAAA,IAAA;QACxC,CAAA,CAAA,CAAA,UAAa,EAAA;AAEb,MAAA,MAAA,IACI,GAAA,gBAAA,CAAA,CAAA,CAAA,IAAA,EAAA,WACW,CAAA;;AAEH,QAAA,GAAA,CAAA;AACJ,QAAA;;AAKC,IAAA;AAGb,EAAA,CAAA,CAAA;AAEA,EAAA,SAAA,CAAA,MAAA;;;AAGG,EAAA,MAAA,cAAA,GAAA,IAAA,IAAA;AAEH,IAAA,IAAA,IAAM,IAAA,IAAA,CAAA,OAAkB,CAAC,MAAM,CAAA,KAAE,CAAA,EAAA;aAC7B,IAAA;;QAEA,IAAA,IAAA,IAAA,CAAA,OAAA,CAAA,OAAA,CAAA,KAAA,CAAA,EAAA;aACA,YAAgB,CAAA,MAAM,EAAI,EAAE,CAAA;;AAE5B,IAAA,OAAA,CAAI,cAAc,CAAC,CAAA,OAAK,CAAA,QAAY,GAAA,CAAA;;wBASxB,GAAA,IAAA,IAAA;;AAAsD,IAAA,MAAA;;UAIjE;AACD,MAAA;YAOQ;yBACK,CACI,aACf,CAAA,QAAA,EAAA;AACN,MAAE,OAAA,EAAA,MAAA;QAEF,iBAAmB,CAAG,GAAG,CAAA;QACrB,SAAI,CAAA,KAAW,CAAA,CAAA;AACf,MAAA,CAAA;AACA,MAAA,wFAA4E;AAC5E,MAAA,IAAA,EAAA;AACA,KAAA,EAAAA,cAAA,CAAA,aAAiB,CAAA,KAAG,EAAA;AAEpB,MAAA,SAAI,EAAA;wBAAmC,CAAA,cAAe,CAAA,CAAA;AACtD,EAAA,CAAA;;AACA;;AACA;uBAAwC,GAAG;;kBAGjC,iBAAiB,KAAE,CAAI,IAAE,CAAG;AAElC;;AAIgB,MAAA,MAAA;AACI,MAAA,IAAA;AAGQ,MAAA;;AAEJ;AAGR,IAAA,IAAA,cAAA,CAAA,IAAA,CAAA,QAAA,CAAA,EAAA;yCAGA,CAAA,GAAA,EAAA;;;;AAYoB,QAAA,SAAA,EAAA,6DAAU;;6CAEd;;qCAGA,CAAA,EAAAA,cAAA,CAAA,aAAA,CAAA,MACI,EAAA;AAOA,QAAA,SAAA,EAAA;;;AAaA,IAAA,OAAAA,cAAA,CAAA,aAAA,CAAAC,IAAA,EAAA;;;AAWxC,MAAA,SAAG,EAAA,6EAAA;AACP,MAAE,IAAA,EAAA;AAEF,KAAA,EAAAD,cACI,CAAA,aAAA,CAAA,KAAA,EAAA;eACI,EAAA;AACI,KAAA,EAAA,iBAAA,CAAA,IAAA,CAAA,CAAA,EAAA,IAAA,CAAA;AACI,EAAA,CAAA;;sBAGC,EAAA;AAaW,IAAA,MAAA,UAAA,GAAA,SAAA,EAAA,UAAA,EAAA,mBACkB,KAAA,IACd,CAAA;qBAOf,GAAQ,SAAI,EAAA,WAAA,EAAA,MAAA,CAAA,CAAA,IAAM,CAAA,CAAA,KAAS,KAAC,IAAA,CAAA;AAGhC,IAAA,MAAA,UAAM,GACH,SAAA,EAAA,UAAA,EAAA,MACI,CAAA,CAAA,IAAA,CAAA,CAAA,KAAU,KAAA,IAAA,CAAA;AAMT,IAAA,MAAA,WAAA,GAAA,SAAW,EAAA,aAAqB,MAAK,CAAE,CAAC,IACrC,CAAA,CAAA,KAAA,KAAA,IAAA,CAAA;kBAOH,EAAA,MAAS,iBAAc,qBAAyB,CAAA,GAAA,UAAa,CAAA;AAG7D,IAAA,IAAA,WAAA,EAAA,MAAW,GAAA,CAAA,EAAA,WAAiB,cACzB,CAAA,MAAA,CAAA,GAAA,WAAA,CAAA;kBAMH,EAAA,MAAO,iBAAoB,GAAE,WAAY,CACtC,MAAA,CAAA,GAAA,UAAA,CAAA;qBAOY,MAAA,GAAA,CAAA,EAAA,WAAA,GAAA,WAAc,OAAC,CAAA,GAAA,WAAmB,CAAA;AAC9B,IAAA,OAAA,WAAA,CAAA,GAAA,CAAA,CAAA,IAAA,EAAA,CAAA,KAAA;AACA,MAAA,MAAA;AAEH,QAAA,UAAA;AAQhB,QAAA,GAAA;AAEA,QAAA;;qBAeO,cAAA,IAAAA,cAAA,CAAA,aAAM,CAAS,KAAC,EAAA;;AAOvB,QAAA,SAAA,EAAA;SAQZA,cAAA,CAAA,aAEP,CAAA,KAAA,EAAA;AACN,QAAE,SAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MainSidebar.d.ts","sourceRoot":"","sources":["../../../../src/components/Layout/Sidebar/MainSidebar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAIzC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAO7C,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,
|
|
1
|
+
{"version":3,"file":"MainSidebar.d.ts","sourceRoot":"","sources":["../../../../src/components/Layout/Sidebar/MainSidebar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAIzC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAO7C,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CAmS9C,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
|
@@ -11,7 +11,8 @@ import {getMenuSeparation}from'@admin-layout/client';import React__default,{useE
|
|
|
11
11
|
showHeader,
|
|
12
12
|
menuHeaderRender,
|
|
13
13
|
deviceSettings,
|
|
14
|
-
isSideMenuLayout
|
|
14
|
+
isSideMenuLayout,
|
|
15
|
+
navbarSlotStripHeight = 0
|
|
15
16
|
} = props;
|
|
16
17
|
const [iconModule, setIconModule] = React__default.useState(null);
|
|
17
18
|
const {
|
|
@@ -188,8 +189,14 @@ import {getMenuSeparation}from'@admin-layout/client';import React__default,{useE
|
|
|
188
189
|
}))));
|
|
189
190
|
};
|
|
190
191
|
return React__default.createElement("div", null, !isMobile && React__default.createElement("aside", {
|
|
191
|
-
className: `${deviceLayout?.fixedSidebar ? 'fixed' : 'relative'} border-r border-border z-20 bg-card text-card-foreground md:block flex-shrink-0 transition-all duration-300 ease-in-out ${collapsed ? 'w-16' : 'w-64'} ${showHeader && deviceLayout?.fixedHeader ? deviceLayout?.fixedSidebar ? 'h-[calc(100vh-5rem)] top-20' : 'h-[calc(100vh-5rem)]' : 'h-screen'}`,
|
|
192
|
-
style:
|
|
192
|
+
className: `${deviceLayout?.fixedSidebar ? 'fixed' : 'relative'} border-r border-border z-20 bg-card text-card-foreground md:block flex-shrink-0 transition-all duration-300 ease-in-out ${collapsed ? 'w-16' : 'w-64'} ${navbarSlotStripHeight > 0 ? '' : showHeader && deviceLayout?.fixedHeader ? deviceLayout?.fixedSidebar ? 'h-[calc(100vh-5rem)] top-20' : 'h-[calc(100vh-5rem)]' : 'h-screen'}`,
|
|
193
|
+
style: {
|
|
194
|
+
...SidebarStyles,
|
|
195
|
+
...(navbarSlotStripHeight > 0 && {
|
|
196
|
+
top: deviceLayout?.fixedSidebar ? navbarSlotStripHeight : undefined,
|
|
197
|
+
height: `calc(100vh - ${navbarSlotStripHeight}px)`
|
|
198
|
+
})
|
|
199
|
+
}
|
|
193
200
|
}, menuHeaderRender && isSideMenuLayout && React__default.createElement("div", {
|
|
194
201
|
className: "border-b border-border py-1 flex items-center justify-center"
|
|
195
202
|
}, React__default.createElement(SideMenuLogoSlot, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MainSidebar.js","sources":["../../../../src/components/Layout/Sidebar/MainSidebar.tsx"],"sourcesContent":[null],"names":["React"],"mappings":"4sBAYO,MAAM,WAAW,GAA2B,KAAC,IAAO;
|
|
1
|
+
{"version":3,"file":"MainSidebar.js","sources":["../../../../src/components/Layout/Sidebar/MainSidebar.tsx"],"sourcesContent":[null],"names":["React"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PerplexSidebarMenu.d.ts","sourceRoot":"","sources":["../../../../src/components/Layout/Sidebar/PerplexSidebarMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAM3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,GAAG,GAAG,
|
|
1
|
+
{"version":3,"file":"PerplexSidebarMenu.d.ts","sourceRoot":"","sources":["../../../../src/components/Layout/Sidebar/PerplexSidebarMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAM3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,GAAG,GAAG,CA4c/D,CAAC"}
|
|
@@ -90,6 +90,7 @@ import React__default,{useState,useRef}from'react';import {useSelector}from'@xst
|
|
|
90
90
|
window.clearTimeout(hoverOpenTimeout.current);
|
|
91
91
|
hoverOpenTimeout.current = null;
|
|
92
92
|
}
|
|
93
|
+
// Always update the current hovered menu ref
|
|
93
94
|
currentHoveredMenu.current = item.path;
|
|
94
95
|
// Update which item is being hovered and its children data
|
|
95
96
|
if (hoveredMenu !== item.path) {
|
|
@@ -97,6 +98,10 @@ import React__default,{useState,useRef}from'react';import {useSelector}from'@xst
|
|
|
97
98
|
setActiveMenuItem(item);
|
|
98
99
|
// If we're already showing a menu, just update content without closing/reopening
|
|
99
100
|
if (flyoutVisible) {
|
|
101
|
+
// If menu is closing, cancel the close and reopen
|
|
102
|
+
if (menuTransition === 'closing') {
|
|
103
|
+
setMenuTransition('opening');
|
|
104
|
+
}
|
|
100
105
|
// Just update the hovered menu path without animation
|
|
101
106
|
setHoveredMenu(item.path);
|
|
102
107
|
} else {
|
|
@@ -105,6 +110,13 @@ import React__default,{useState,useRef}from'react';import {useSelector}from'@xst
|
|
|
105
110
|
setFlyoutVisible(true);
|
|
106
111
|
setHoveredMenu(item.path);
|
|
107
112
|
}
|
|
113
|
+
} else {
|
|
114
|
+
// Same menu item, but ensure state is consistent
|
|
115
|
+
// This handles the case where we re-enter after leaving
|
|
116
|
+
if (!flyoutVisible || menuTransition === 'closing') {
|
|
117
|
+
setMenuTransition('opening');
|
|
118
|
+
setFlyoutVisible(true);
|
|
119
|
+
}
|
|
108
120
|
}
|
|
109
121
|
// If a different top-level item is hovered while pinned, update pinnedPath
|
|
110
122
|
if (depth === 0 && pinnedPath) {
|
|
@@ -127,20 +139,33 @@ import React__default,{useState,useRef}from'react';import {useSelector}from'@xst
|
|
|
127
139
|
window.clearTimeout(hoverOpenTimeout.current);
|
|
128
140
|
hoverOpenTimeout.current = null;
|
|
129
141
|
}
|
|
130
|
-
currentHoveredMenu
|
|
131
|
-
//
|
|
142
|
+
// Don't immediately clear currentHoveredMenu - wait to see if user moves to flyout
|
|
143
|
+
// The flyout's onMouseEnter will restore it if user moves there
|
|
144
|
+
// If user moves to content, the timeout will clear it
|
|
145
|
+
// Add a delay before closing the menu to allow movement to flyout
|
|
132
146
|
hoverCloseTimeout.current = window.setTimeout(() => {
|
|
133
|
-
if (
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
}, 150);
|
|
147
|
+
// Check if we're still hovering the flyout (activeMenuItem matches)
|
|
148
|
+
if (activeMenuItem?.path === item.path) {
|
|
149
|
+
// User is hovering the flyout, don't close
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
// Check if we re-entered the menu item
|
|
153
|
+
if (currentHoveredMenu.current === item.path) {
|
|
154
|
+
// User re-entered menu item, don't close
|
|
155
|
+
return;
|
|
143
156
|
}
|
|
157
|
+
// Safe to close now
|
|
158
|
+
currentHoveredMenu.current = null;
|
|
159
|
+
setMenuTransition('closing');
|
|
160
|
+
// Additional delay to complete closing animation
|
|
161
|
+
setTimeout(() => {
|
|
162
|
+
// Double-check before closing
|
|
163
|
+
if (activeMenuItem?.path !== item.path && currentHoveredMenu.current !== item.path) {
|
|
164
|
+
setFlyoutVisible(false);
|
|
165
|
+
setHoveredMenu(null);
|
|
166
|
+
setActiveMenuItem(null);
|
|
167
|
+
}
|
|
168
|
+
}, 150);
|
|
144
169
|
}, 300); // Extended delay to give more time to move between items
|
|
145
170
|
}
|
|
146
171
|
};
|
|
@@ -199,23 +224,37 @@ import React__default,{useState,useRef}from'react';import {useSelector}from'@xst
|
|
|
199
224
|
...SidebarStyles
|
|
200
225
|
},
|
|
201
226
|
onMouseEnter: () => {
|
|
227
|
+
// Clear any pending close timeouts
|
|
202
228
|
if (hoverCloseTimeout.current) {
|
|
203
229
|
window.clearTimeout(hoverCloseTimeout.current);
|
|
204
230
|
hoverCloseTimeout.current = null;
|
|
205
231
|
}
|
|
206
|
-
//
|
|
232
|
+
// Restore the hovered menu ref when entering the flyout
|
|
233
|
+
// This ensures state consistency when moving between menu item and flyout
|
|
234
|
+
if (activeMenuItem) {
|
|
235
|
+
currentHoveredMenu.current = activeMenuItem.path;
|
|
236
|
+
// Ensure flyout is visible and in opening state
|
|
237
|
+
if (!flyoutVisible || menuTransition === 'closing') {
|
|
238
|
+
setMenuTransition('opening');
|
|
239
|
+
setFlyoutVisible(true);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
207
242
|
},
|
|
208
243
|
onMouseLeave: () => {
|
|
209
244
|
if (pinnedPath === item.path) return; // don't close if pinned
|
|
245
|
+
// Clear any existing timeouts
|
|
210
246
|
if (hoverCloseTimeout.current) {
|
|
211
247
|
window.clearTimeout(hoverCloseTimeout.current);
|
|
212
248
|
}
|
|
213
|
-
|
|
249
|
+
// Don't immediately set to null - wait for timeout
|
|
250
|
+
// This allows re-entering the menu item to restore state
|
|
214
251
|
setMenuTransition('closing');
|
|
215
252
|
hoverCloseTimeout.current = window.setTimeout(() => {
|
|
253
|
+
// Only close if we're still not hovering anything
|
|
216
254
|
if (!currentHoveredMenu.current) {
|
|
217
255
|
setFlyoutVisible(false);
|
|
218
256
|
setHoveredMenu(null);
|
|
257
|
+
setActiveMenuItem(null);
|
|
219
258
|
}
|
|
220
259
|
}, 150);
|
|
221
260
|
}
|