ui-soxo-bootstrap-core 2.6.1-dev.17 → 2.6.1-dev.18
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/core/components/landing-api/landing-api.js +29 -12
- package/core/components/license-management/license-alert.js +97 -0
- package/core/lib/components/global-header/animations.js +78 -4
- package/core/lib/components/global-header/global-header.js +49 -23
- package/core/lib/components/global-header/global-header.scss +162 -24
- package/core/lib/components/sidemenu/animations.js +84 -2
- package/core/lib/components/sidemenu/sidemenu.js +175 -55
- package/core/lib/components/sidemenu/sidemenu.scss +221 -14
- package/core/lib/models/process/components/process-dashboard/process-dashboard.js +469 -3
- package/core/lib/models/process/components/process-dashboard/process-dashboard.scss +4 -0
- package/core/lib/pages/login/login.js +20 -37
- package/core/lib/utils/common/common.utils.js +0 -35
- package/core/models/menus/menus.js +6 -0
- package/core/modules/steps/action-buttons.js +60 -46
- package/core/modules/steps/action-buttons.scss +45 -34
- package/core/modules/steps/chat-assistant.js +141 -0
- package/core/modules/steps/openai-realtime.js +275 -0
- package/core/modules/steps/readme.md +167 -0
- package/core/modules/steps/steps.js +1063 -85
- package/core/modules/steps/steps.scss +462 -280
- package/core/modules/steps/voice-navigation.js +709 -0
- package/package.json +1 -1
|
@@ -10,11 +10,11 @@
|
|
|
10
10
|
|
|
11
11
|
import React, { useState, useEffect, useContext } from 'react';
|
|
12
12
|
|
|
13
|
-
import {
|
|
13
|
+
import { motion, useReducedMotion } from 'framer-motion';
|
|
14
14
|
|
|
15
15
|
import { GlobalContext } from './../../Store';
|
|
16
16
|
|
|
17
|
-
import { Menu, message,
|
|
17
|
+
import { Menu, message, Popover } from 'antd';
|
|
18
18
|
|
|
19
19
|
import FirebaseUtils from './../../utils/firebase.utils';
|
|
20
20
|
|
|
@@ -24,6 +24,15 @@ import { useTranslation, Trans } from 'react-i18next';
|
|
|
24
24
|
|
|
25
25
|
import { Menus } from '../../models';
|
|
26
26
|
|
|
27
|
+
import {
|
|
28
|
+
sidebarGroupVariants,
|
|
29
|
+
sidebarIntroVariants,
|
|
30
|
+
sidebarItemRevealVariants,
|
|
31
|
+
sidebarLoaderContainerVariants,
|
|
32
|
+
sidebarLoaderRowVariants,
|
|
33
|
+
sidebarMenuSurfaceVariants,
|
|
34
|
+
} from './animations';
|
|
35
|
+
|
|
27
36
|
import './sidemenu.scss';
|
|
28
37
|
|
|
29
38
|
const { SubMenu } = Menu;
|
|
@@ -39,7 +48,8 @@ function CollapsedIconMenu({ menu, collapsed, icon, caption }) {
|
|
|
39
48
|
// Import t and i18n from useTranslation
|
|
40
49
|
const { t, i18n } = useTranslation();
|
|
41
50
|
const { state } = useContext(GlobalContext);
|
|
42
|
-
|
|
51
|
+
const [isMobile, setIsMobile] = useState(false);
|
|
52
|
+
const [iconImageFailed, setIconImageFailed] = useState(false);
|
|
43
53
|
|
|
44
54
|
useEffect(() => {
|
|
45
55
|
const handleResize = () => {
|
|
@@ -52,39 +62,110 @@ function CollapsedIconMenu({ menu, collapsed, icon, caption }) {
|
|
|
52
62
|
return () => window.removeEventListener('resize', handleResize);
|
|
53
63
|
}, []);
|
|
54
64
|
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
setIconImageFailed(false);
|
|
67
|
+
}, [menu?.image_path]);
|
|
68
|
+
|
|
69
|
+
const normalizeIconClass = (iconValue) => {
|
|
70
|
+
const raw = (iconValue || 'fa-user').trim();
|
|
71
|
+
const tokens = (raw || 'fa-user').split(/\s+/).filter(Boolean);
|
|
72
|
+
const tokenSet = new Set(tokens);
|
|
73
|
+
|
|
74
|
+
const modernToLegacyStyleMap = {
|
|
75
|
+
'fa-solid': 'fas',
|
|
76
|
+
'fa-regular': 'far',
|
|
77
|
+
'fa-light': 'fal',
|
|
78
|
+
'fa-brands': 'fab',
|
|
79
|
+
};
|
|
80
|
+
const fa6ToFa5IconMap = {
|
|
81
|
+
'fa-house': 'fa-home',
|
|
82
|
+
'fa-house-user': 'fa-home',
|
|
83
|
+
'fa-gauge': 'fa-tachometer-alt',
|
|
84
|
+
'fa-location-dot': 'fa-map-marker-alt',
|
|
85
|
+
};
|
|
86
|
+
const styleTokens = ['fa', 'fas', 'far', 'fal', 'fab', 'fa-solid', 'fa-regular', 'fa-light', 'fa-brands'];
|
|
87
|
+
|
|
88
|
+
const iconTokens = tokens.filter((token) => token.startsWith('fa-') && !styleTokens.includes(token));
|
|
89
|
+
const hasAnyStyleToken = tokens.some((token) => styleTokens.includes(token));
|
|
90
|
+
|
|
91
|
+
tokenSet.add('fa');
|
|
92
|
+
|
|
93
|
+
tokens.forEach((token) => {
|
|
94
|
+
if (modernToLegacyStyleMap[token]) {
|
|
95
|
+
tokenSet.add(modernToLegacyStyleMap[token]);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
if (!hasAnyStyleToken) {
|
|
100
|
+
tokenSet.add('fas');
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (!iconTokens.length) {
|
|
104
|
+
const normalizedName = raw && !raw.includes(' ') ? (raw.startsWith('fa-') ? raw : `fa-${raw}`) : 'fa-user';
|
|
105
|
+
tokenSet.add(fa6ToFa5IconMap[normalizedName] || normalizedName);
|
|
106
|
+
} else {
|
|
107
|
+
iconTokens.forEach((token) => {
|
|
108
|
+
const mapped = fa6ToFa5IconMap[token];
|
|
109
|
+
if (mapped) {
|
|
110
|
+
tokenSet.add(mapped);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return Array.from(tokenSet).join(' ');
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
const renderMenuGlyph = () => {
|
|
119
|
+
if (menu && menu.image_path && !iconImageFailed) {
|
|
120
|
+
return (
|
|
121
|
+
<img
|
|
122
|
+
className="menu-image-icon"
|
|
123
|
+
src={menu.image_path}
|
|
124
|
+
alt={menu?.caption || caption || 'menu-icon'}
|
|
125
|
+
onError={() => setIconImageFailed(true)}
|
|
126
|
+
loading="lazy"
|
|
127
|
+
/>
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return <i className={normalizeIconClass(icon)} aria-hidden="true" />;
|
|
132
|
+
};
|
|
133
|
+
|
|
55
134
|
const menuText = t(caption);
|
|
56
135
|
const menuContent = (
|
|
57
|
-
|
|
136
|
+
<motion.div variants={sidebarItemRevealVariants} className="menu-collapsed">
|
|
58
137
|
{/* If value of collapsed is false show caption & icon else hiding caption and showing only icon*/}
|
|
59
138
|
{!collapsed ? (
|
|
60
|
-
|
|
61
|
-
<div>
|
|
62
|
-
{
|
|
139
|
+
<>
|
|
140
|
+
<div className="menu-icon-wrap">
|
|
141
|
+
{renderMenuGlyph()}
|
|
63
142
|
</div>
|
|
64
143
|
|
|
65
|
-
<div style={{ color: state.theme.colors.leftSectionColor }}>
|
|
66
|
-
<span className="caption">
|
|
144
|
+
<div className="menu-label-wrap" style={{ color: state.theme.colors.leftSectionColor }} title={menuText}>
|
|
145
|
+
<span className="caption" title={menuText}>
|
|
67
146
|
{/* {caption} */}
|
|
68
147
|
{/* <Trans i18nKey="Appointments"></Trans> */}
|
|
69
148
|
{t(`${caption}`)}
|
|
70
149
|
</span>
|
|
71
150
|
</div>
|
|
72
|
-
|
|
151
|
+
</>
|
|
73
152
|
) : (
|
|
74
|
-
|
|
75
|
-
<span className="anticon">
|
|
76
|
-
{
|
|
153
|
+
<>
|
|
154
|
+
<span className="anticon menu-icon-wrap">
|
|
155
|
+
{renderMenuGlyph()}
|
|
77
156
|
</span>
|
|
78
157
|
|
|
79
|
-
<span style={{ color: state.theme.colors.colorPrimaryText, paddingLeft: '6px' }}>
|
|
158
|
+
<span className="menu-label-wrap" style={{ color: state.theme.colors.colorPrimaryText, paddingLeft: '6px' }} title={menuText}>
|
|
80
159
|
{/* <>{caption}</> */}
|
|
81
160
|
{t(`${caption}`)}
|
|
82
161
|
</span>
|
|
83
|
-
|
|
162
|
+
</>
|
|
84
163
|
)}
|
|
85
|
-
|
|
164
|
+
</motion.div>
|
|
86
165
|
);
|
|
87
166
|
|
|
167
|
+
// Show tooltip labels on desktop collapsed mode, hide on mobile / expanded mode.
|
|
168
|
+
// return isMobile || !collapsed ? menuContent : <Popover content={menuText} placement="right">{menuContent}</Popover>;
|
|
88
169
|
// On mobile, or when the menu is collapsed (based on original logic), don't show the popover tooltip.
|
|
89
170
|
return isMobile || collapsed ? (
|
|
90
171
|
menuContent
|
|
@@ -267,17 +348,31 @@ export default function SideMenu({ loading, modules = [], callback, appSettings,
|
|
|
267
348
|
}, [state.theme]);
|
|
268
349
|
|
|
269
350
|
const rootSubmenuKeys = Menus.screenMenus(modules, 'order').map((m) => m.id || m.path || m.caption);
|
|
351
|
+
const prefersReducedMotion = useReducedMotion();
|
|
352
|
+
const shouldAnimate = !prefersReducedMotion;
|
|
353
|
+
const loaderRows = collapsed ? 5 : 7;
|
|
270
354
|
|
|
271
355
|
return (
|
|
272
356
|
<div className="sidemenu">
|
|
273
357
|
{loading ? (
|
|
274
|
-
<
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
{
|
|
278
|
-
|
|
358
|
+
<motion.div
|
|
359
|
+
className="side-loader-shell"
|
|
360
|
+
variants={sidebarLoaderContainerVariants}
|
|
361
|
+
initial={shouldAnimate ? 'hidden' : false}
|
|
362
|
+
animate={shouldAnimate ? 'visible' : false}
|
|
363
|
+
>
|
|
364
|
+
{[...Array(4)].map((_, index) => (
|
|
365
|
+
<motion.div key={`intro-loader-${index}`} className="side-loader-chip" variants={sidebarLoaderRowVariants}>
|
|
366
|
+
<span className="side-loader-dot" />
|
|
367
|
+
<span className="side-loader-line" />
|
|
368
|
+
</motion.div>
|
|
369
|
+
))}
|
|
370
|
+
</motion.div>
|
|
279
371
|
) : (
|
|
280
|
-
<div
|
|
372
|
+
<motion.div
|
|
373
|
+
variants={sidebarIntroVariants}
|
|
374
|
+
initial={shouldAnimate ? 'hidden' : false}
|
|
375
|
+
animate={shouldAnimate ? 'visible' : false}
|
|
281
376
|
className="intro"
|
|
282
377
|
style={{ backgroundColor: state.theme.colors.leftSectionBackground, borderBottom: `2px solid ${state.theme.colors.borderColor}` }}
|
|
283
378
|
>
|
|
@@ -312,7 +407,7 @@ export default function SideMenu({ loading, modules = [], callback, appSettings,
|
|
|
312
407
|
{/* If value of collapsed is true render header else not rendering */}
|
|
313
408
|
|
|
314
409
|
{!collapsed ? renderCustomHeader() : ''}
|
|
315
|
-
</div>
|
|
410
|
+
</motion.div>
|
|
316
411
|
)}
|
|
317
412
|
|
|
318
413
|
{/* Intro Component */}
|
|
@@ -329,25 +424,49 @@ export default function SideMenu({ loading, modules = [], callback, appSettings,
|
|
|
329
424
|
|
|
330
425
|
{/* Search for Queries Ends */}
|
|
331
426
|
|
|
332
|
-
<div
|
|
427
|
+
<motion.div
|
|
428
|
+
className={`menu-item ${!collapsed ? 'open' : 'close'}`}
|
|
429
|
+
style={{ backgroundColor: state.theme.colors.leftSectionBackground }}
|
|
430
|
+
variants={sidebarMenuSurfaceVariants}
|
|
431
|
+
initial={shouldAnimate ? 'hidden' : false}
|
|
432
|
+
animate={shouldAnimate ? 'visible' : false}
|
|
433
|
+
>
|
|
333
434
|
{loading ? (
|
|
334
|
-
|
|
435
|
+
<motion.div
|
|
436
|
+
className="side-loader-list"
|
|
437
|
+
variants={sidebarLoaderContainerVariants}
|
|
438
|
+
initial={shouldAnimate ? 'hidden' : false}
|
|
439
|
+
animate={shouldAnimate ? 'visible' : false}
|
|
440
|
+
>
|
|
441
|
+
{[...Array(loaderRows)].map((_, rowIndex) => (
|
|
442
|
+
<motion.div key={`menu-loader-${rowIndex}`} className="side-loader-row" variants={sidebarLoaderRowVariants}>
|
|
443
|
+
<span className="side-loader-dot" />
|
|
444
|
+
<span className="side-loader-line" />
|
|
445
|
+
</motion.div>
|
|
446
|
+
))}
|
|
447
|
+
</motion.div>
|
|
335
448
|
) : (
|
|
336
|
-
<
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
inlineCollapsed={collapsed}
|
|
342
|
-
mode="inline"
|
|
343
|
-
theme={process.env.REACT_APP_THEME}
|
|
344
|
-
selectedKeys={selectedKeys}
|
|
345
|
-
openKeys={openKeys}
|
|
346
|
-
onOpenChange={onOpenChange}
|
|
347
|
-
style={{ backgroundColor: state.theme.colors.leftSectionBackground, color: state.theme.colors.leftSectionColor }}
|
|
348
|
-
// theme={''}
|
|
449
|
+
<motion.div
|
|
450
|
+
className="menu-motion-shell"
|
|
451
|
+
variants={sidebarGroupVariants}
|
|
452
|
+
initial={shouldAnimate ? 'hidden' : false}
|
|
453
|
+
animate={shouldAnimate ? 'visible' : false}
|
|
349
454
|
>
|
|
350
|
-
|
|
455
|
+
<Menu
|
|
456
|
+
// selectedKeys={[selected]}
|
|
457
|
+
// style={{ width: 256 }}
|
|
458
|
+
// defaultSelectedKeys={selected}
|
|
459
|
+
// defaultOpenKeys={['']}
|
|
460
|
+
inlineCollapsed={collapsed}
|
|
461
|
+
mode="inline"
|
|
462
|
+
theme={process.env.REACT_APP_THEME}
|
|
463
|
+
selectedKeys={selectedKeys}
|
|
464
|
+
openKeys={openKeys}
|
|
465
|
+
onOpenChange={onOpenChange}
|
|
466
|
+
style={{ backgroundColor: state.theme.colors.leftSectionBackground, color: state.theme.colors.leftSectionColor }}
|
|
467
|
+
// theme={''}
|
|
468
|
+
>
|
|
469
|
+
{/* <Menu.Item
|
|
351
470
|
onClick={() => {
|
|
352
471
|
setSelected([1]);
|
|
353
472
|
history.push("/");
|
|
@@ -412,7 +531,7 @@ export default function SideMenu({ loading, modules = [], callback, appSettings,
|
|
|
412
531
|
<CollapsedIconMenu
|
|
413
532
|
menu={menu}
|
|
414
533
|
caption={menu.caption}
|
|
415
|
-
icon={menu.icon_name || 'fa-
|
|
534
|
+
icon={menu.icon_name || 'fa-user'}
|
|
416
535
|
collapsed={collapsed}
|
|
417
536
|
/>
|
|
418
537
|
</>
|
|
@@ -433,9 +552,9 @@ export default function SideMenu({ loading, modules = [], callback, appSettings,
|
|
|
433
552
|
title={
|
|
434
553
|
<span>
|
|
435
554
|
<CollapsedIconMenu
|
|
436
|
-
menu={
|
|
555
|
+
menu={submenu}
|
|
437
556
|
caption={submenu.caption}
|
|
438
|
-
icon={submenu.icon_name || 'fa-
|
|
557
|
+
icon={submenu.icon_name || 'fa-user'}
|
|
439
558
|
collapsed={collapsed}
|
|
440
559
|
/>
|
|
441
560
|
</span>
|
|
@@ -459,7 +578,7 @@ export default function SideMenu({ loading, modules = [], callback, appSettings,
|
|
|
459
578
|
<CollapsedIconMenu
|
|
460
579
|
menu={menu}
|
|
461
580
|
caption={menu.caption}
|
|
462
|
-
icon={menu.icon_name || 'fa-
|
|
581
|
+
icon={menu.icon_name || 'fa-user'}
|
|
463
582
|
collapsed={collapsed}
|
|
464
583
|
/>
|
|
465
584
|
</Menu.Item>
|
|
@@ -482,9 +601,9 @@ export default function SideMenu({ loading, modules = [], callback, appSettings,
|
|
|
482
601
|
key={submenu.path || submenu.caption}
|
|
483
602
|
>
|
|
484
603
|
<CollapsedIconMenu
|
|
485
|
-
menu={
|
|
604
|
+
menu={submenu}
|
|
486
605
|
caption={submenu.caption}
|
|
487
|
-
icon={submenu.icon_name || 'fa-
|
|
606
|
+
icon={submenu.icon_name || 'fa-user'}
|
|
488
607
|
collapsed={collapsed}
|
|
489
608
|
/>
|
|
490
609
|
</Menu.Item>
|
|
@@ -508,26 +627,27 @@ export default function SideMenu({ loading, modules = [], callback, appSettings,
|
|
|
508
627
|
// key={`${menu.id}-${randomIndex}`}
|
|
509
628
|
key={menu.path || menu.caption}
|
|
510
629
|
>
|
|
511
|
-
<CollapsedIconMenu menu={menu} caption={menu.caption} icon={menu.icon_name || 'fa-
|
|
630
|
+
<CollapsedIconMenu menu={menu} caption={menu.caption} icon={menu.icon_name || 'fa-user'} collapsed={collapsed} />
|
|
512
631
|
</Menu.Item>
|
|
513
632
|
);
|
|
514
633
|
}
|
|
515
634
|
})}
|
|
516
635
|
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
636
|
+
{loading ? (
|
|
637
|
+
<div className="skeleton-wrapper"></div>
|
|
638
|
+
) : (
|
|
639
|
+
<Menu.Item onClick={handleLogout} key="logout-button">
|
|
640
|
+
<CollapsedIconMenu caption="Logout" icon="fa-user" collapsed={collapsed} />
|
|
641
|
+
</Menu.Item>
|
|
642
|
+
)}
|
|
643
|
+
</Menu>
|
|
644
|
+
</motion.div>
|
|
525
645
|
)}
|
|
526
646
|
|
|
527
647
|
{/* Footer Logo */}
|
|
528
648
|
{/* {renderFooter(footerLogo)} */}
|
|
529
649
|
{/* Footer Logo Ends */}
|
|
530
|
-
</div>
|
|
650
|
+
</motion.div>
|
|
531
651
|
</div>
|
|
532
652
|
);
|
|
533
653
|
}
|
|
@@ -1,4 +1,52 @@
|
|
|
1
1
|
.sidemenu {
|
|
2
|
+
.side-loader-shell {
|
|
3
|
+
margin: 14px 12px 10px;
|
|
4
|
+
padding: 10px;
|
|
5
|
+
border-radius: 14px;
|
|
6
|
+
border: 1px solid rgba(222, 229, 239, 0.9);
|
|
7
|
+
background: linear-gradient(180deg, rgba(255, 255, 255, 0.96) 0%, rgba(248, 250, 255, 0.95) 100%);
|
|
8
|
+
box-shadow: 0 8px 18px rgba(16, 24, 40, 0.05);
|
|
9
|
+
display: grid;
|
|
10
|
+
gap: 8px;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.side-loader-chip,
|
|
14
|
+
.side-loader-row {
|
|
15
|
+
display: flex;
|
|
16
|
+
align-items: center;
|
|
17
|
+
gap: 10px;
|
|
18
|
+
min-height: 30px;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.side-loader-dot {
|
|
22
|
+
width: 14px;
|
|
23
|
+
height: 14px;
|
|
24
|
+
border-radius: 999px;
|
|
25
|
+
background: linear-gradient(90deg, #eef1f5 0%, #f7f8fb 50%, #eef1f5 100%);
|
|
26
|
+
background-size: 220% 100%;
|
|
27
|
+
animation: side-shimmer 1.4s linear infinite;
|
|
28
|
+
flex: 0 0 auto;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.side-loader-line {
|
|
32
|
+
height: 10px;
|
|
33
|
+
border-radius: 999px;
|
|
34
|
+
width: 100%;
|
|
35
|
+
background: linear-gradient(90deg, #edf0f4 0%, #f8f9fb 50%, #edf0f4 100%);
|
|
36
|
+
background-size: 220% 100%;
|
|
37
|
+
animation: side-shimmer 1.4s linear infinite;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.side-loader-list {
|
|
41
|
+
margin: 8px;
|
|
42
|
+
padding: 8px 6px 18px;
|
|
43
|
+
border-radius: 14px;
|
|
44
|
+
border: 1px solid rgba(229, 234, 242, 0.85);
|
|
45
|
+
background: rgba(255, 255, 255, 0.88);
|
|
46
|
+
display: grid;
|
|
47
|
+
gap: 4px;
|
|
48
|
+
}
|
|
49
|
+
|
|
2
50
|
.intro {
|
|
3
51
|
.logo-wrapper {
|
|
4
52
|
border-bottom: none;
|
|
@@ -40,18 +88,26 @@
|
|
|
40
88
|
padding: 5px 16px;
|
|
41
89
|
position: fixed;
|
|
42
90
|
z-index: 1000;
|
|
43
|
-
width: 17%;
|
|
44
|
-
background:
|
|
91
|
+
// width: 17%;
|
|
92
|
+
background: rgba(255, 255, 255, 0.95);
|
|
93
|
+
backdrop-filter: blur(10px);
|
|
45
94
|
// border-bottom: 1.5px solid #24aeb8;
|
|
46
95
|
&.close {
|
|
47
96
|
width: 6% !important;
|
|
48
97
|
}
|
|
49
98
|
|
|
50
99
|
.logo-wrapper {
|
|
100
|
+
display: flex;
|
|
101
|
+
align-items: center;
|
|
102
|
+
justify-content: space-between;
|
|
103
|
+
gap: 8px;
|
|
51
104
|
// height: 15px;
|
|
52
105
|
// border-bottom: 1px solid #eaeaea;
|
|
53
106
|
|
|
54
107
|
.sidemenu-brand-logo {
|
|
108
|
+
transition:
|
|
109
|
+
transform 220ms ease,
|
|
110
|
+
filter 220ms ease;
|
|
55
111
|
// width: 50%;
|
|
56
112
|
// margin: 10px;
|
|
57
113
|
// width: 200px;
|
|
@@ -75,6 +131,11 @@
|
|
|
75
131
|
}
|
|
76
132
|
|
|
77
133
|
cursor: pointer;
|
|
134
|
+
|
|
135
|
+
&:hover {
|
|
136
|
+
transform: translateY(-1px) scale(1.01);
|
|
137
|
+
filter: saturate(1.05);
|
|
138
|
+
}
|
|
78
139
|
}
|
|
79
140
|
}
|
|
80
141
|
|
|
@@ -94,20 +155,22 @@
|
|
|
94
155
|
}
|
|
95
156
|
|
|
96
157
|
.menu-item {
|
|
97
|
-
padding-top:
|
|
158
|
+
padding-top: 8px;
|
|
98
159
|
// height: calc(100vh - 48px); /* Adjust height */
|
|
99
160
|
height: 100vh;
|
|
100
161
|
margin-top: 0px;
|
|
101
162
|
width: 256px;
|
|
102
163
|
top: 48px;
|
|
103
|
-
border-
|
|
164
|
+
border-right: 1px solid rgba(226, 231, 239, 0.9);
|
|
165
|
+
border-bottom: 1px solid rgba(240, 243, 248, 0.8);
|
|
104
166
|
position: fixed;
|
|
105
167
|
height: 100vh;
|
|
106
168
|
margin-top: 0;
|
|
107
169
|
overflow-y: scroll;
|
|
108
170
|
overflow-x: hidden;
|
|
109
171
|
width: 211px;
|
|
110
|
-
padding-bottom:
|
|
172
|
+
padding-bottom: 24px;
|
|
173
|
+
background: linear-gradient(180deg, rgba(255, 255, 255, 0.97) 0%, rgba(249, 250, 252, 0.98) 100%);
|
|
111
174
|
|
|
112
175
|
/* Custom Scrollbar like macOS */
|
|
113
176
|
scrollbar-width: thin; /* For Firefox */
|
|
@@ -142,18 +205,57 @@
|
|
|
142
205
|
margin: 80px;
|
|
143
206
|
}
|
|
144
207
|
|
|
208
|
+
.menu-motion-shell {
|
|
209
|
+
padding: 6px 6px 14px;
|
|
210
|
+
}
|
|
211
|
+
|
|
145
212
|
.ant-menu-inline {
|
|
146
213
|
border: none !important;
|
|
147
214
|
}
|
|
148
215
|
|
|
149
216
|
.menu-collapsed {
|
|
150
|
-
width:
|
|
217
|
+
width: 100%;
|
|
218
|
+
min-width: 0;
|
|
151
219
|
display: flex;
|
|
152
220
|
align-items: center;
|
|
153
221
|
gap: 8px;
|
|
154
222
|
cursor: pointer;
|
|
155
223
|
}
|
|
156
224
|
|
|
225
|
+
.menu-icon-wrap {
|
|
226
|
+
width: 24px;
|
|
227
|
+
height: 24px;
|
|
228
|
+
min-width: 24px;
|
|
229
|
+
border-radius: 8px;
|
|
230
|
+
display: inline-flex;
|
|
231
|
+
align-items: center;
|
|
232
|
+
justify-content: center;
|
|
233
|
+
color: inherit;
|
|
234
|
+
transition:
|
|
235
|
+
background-color 220ms ease,
|
|
236
|
+
transform 220ms ease;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.menu-image-icon {
|
|
240
|
+
width: 18px;
|
|
241
|
+
height: 18px;
|
|
242
|
+
object-fit: contain;
|
|
243
|
+
display: block;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
.menu-label-wrap {
|
|
247
|
+
min-width: 0;
|
|
248
|
+
display: inline-flex;
|
|
249
|
+
align-items: center;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
.caption,
|
|
253
|
+
.menu-label-wrap {
|
|
254
|
+
overflow: hidden;
|
|
255
|
+
text-overflow: ellipsis;
|
|
256
|
+
white-space: nowrap;
|
|
257
|
+
}
|
|
258
|
+
|
|
157
259
|
.menu-collapsed .anticon {
|
|
158
260
|
margin-right: 8px;
|
|
159
261
|
}
|
|
@@ -178,6 +280,102 @@
|
|
|
178
280
|
/* Style selected item */
|
|
179
281
|
.ant-menu {
|
|
180
282
|
background-color: transparent !important;
|
|
283
|
+
padding: 4px 0 28px;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
.ant-menu-item,
|
|
287
|
+
.ant-menu-submenu-title {
|
|
288
|
+
width: calc(100% - 12px) !important;
|
|
289
|
+
margin: 3px 6px !important;
|
|
290
|
+
padding-right: 10px !important;
|
|
291
|
+
border-radius: 12px;
|
|
292
|
+
height: 40px !important;
|
|
293
|
+
line-height: 40px !important;
|
|
294
|
+
transition:
|
|
295
|
+
background-color 180ms ease,
|
|
296
|
+
box-shadow 180ms ease,
|
|
297
|
+
transform 180ms ease;
|
|
298
|
+
border: 1px solid transparent;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
.ant-menu-item::after,
|
|
302
|
+
.ant-menu-submenu-title::after {
|
|
303
|
+
display: none !important;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
.ant-menu-submenu-arrow {
|
|
307
|
+
transition:
|
|
308
|
+
transform 200ms ease,
|
|
309
|
+
opacity 200ms ease;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
.ant-menu-item:hover,
|
|
313
|
+
.ant-menu-submenu-title:hover {
|
|
314
|
+
background: linear-gradient(180deg, rgba(247, 248, 251, 0.98) 0%, rgba(242, 244, 248, 0.98) 100%) !important;
|
|
315
|
+
border-color: rgba(224, 229, 238, 0.95);
|
|
316
|
+
transform: translateX(1px);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
.ant-menu-item:hover .menu-icon-wrap,
|
|
320
|
+
.ant-menu-submenu-title:hover .menu-icon-wrap {
|
|
321
|
+
background: rgba(100, 116, 139, 0.1);
|
|
322
|
+
transform: scale(1.03);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
.ant-menu-item-selected,
|
|
326
|
+
.ant-menu-submenu-selected > .ant-menu-submenu-title {
|
|
327
|
+
background: linear-gradient(180deg, rgba(244, 247, 251, 0.98) 0%, rgba(238, 242, 247, 0.98) 100%) !important;
|
|
328
|
+
border-color: rgba(214, 222, 233, 0.95) !important;
|
|
329
|
+
box-shadow:
|
|
330
|
+
inset 0 1px 0 rgba(255, 255, 255, 0.7),
|
|
331
|
+
0 2px 8px rgba(71, 85, 105, 0.08);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
.ant-menu-item-selected::before,
|
|
335
|
+
.ant-menu-submenu-selected > .ant-menu-submenu-title::before {
|
|
336
|
+
content: '';
|
|
337
|
+
position: absolute;
|
|
338
|
+
left: 6px;
|
|
339
|
+
top: 8px;
|
|
340
|
+
bottom: 8px;
|
|
341
|
+
width: 3px;
|
|
342
|
+
border-radius: 999px;
|
|
343
|
+
background: linear-gradient(180deg, #64748b 0%, #475569 100%);
|
|
344
|
+
opacity: 0.95;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
.ant-menu-sub.ant-menu-inline {
|
|
348
|
+
background: transparent !important;
|
|
349
|
+
padding-top: 2px;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
.ant-menu-sub.ant-menu-inline > .ant-menu-item {
|
|
353
|
+
height: 36px !important;
|
|
354
|
+
line-height: 36px !important;
|
|
355
|
+
border-radius: 10px;
|
|
356
|
+
margin-left: 18px !important;
|
|
357
|
+
width: calc(100% - 24px) !important;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
.ant-menu-inline-collapsed > .ant-menu-item,
|
|
361
|
+
.ant-menu-inline-collapsed > .ant-menu-submenu > .ant-menu-submenu-title {
|
|
362
|
+
padding-inline: calc(50% - 12px) !important;
|
|
363
|
+
width: calc(100% - 12px) !important;
|
|
364
|
+
margin: 4px 6px !important;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
.ant-menu-inline-collapsed .menu-collapsed {
|
|
368
|
+
justify-content: center;
|
|
369
|
+
gap: 0;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
.ant-menu-inline-collapsed .menu-label-wrap {
|
|
373
|
+
display: none !important;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
.ant-menu-inline-collapsed .menu-icon-wrap,
|
|
377
|
+
.ant-menu-inline-collapsed .menu-collapsed .anticon {
|
|
378
|
+
margin-right: 0 !important;
|
|
181
379
|
}
|
|
182
380
|
// .ant-menu-inline .ant-menu-item::after{
|
|
183
381
|
// border-right: none;
|
|
@@ -232,6 +430,15 @@
|
|
|
232
430
|
}
|
|
233
431
|
}
|
|
234
432
|
}
|
|
433
|
+
|
|
434
|
+
@keyframes side-shimmer {
|
|
435
|
+
0% {
|
|
436
|
+
background-position: 200% 0;
|
|
437
|
+
}
|
|
438
|
+
100% {
|
|
439
|
+
background-position: -20% 0;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
235
442
|
@media only screen and (max-width: 768px) {
|
|
236
443
|
.sidemenu {
|
|
237
444
|
// width: 100% !important;
|
|
@@ -245,7 +452,7 @@
|
|
|
245
452
|
.intro {
|
|
246
453
|
width: 210px;
|
|
247
454
|
height: 60px;
|
|
248
|
-
padding:
|
|
455
|
+
padding: 6px 8px;
|
|
249
456
|
// width: 100% !important;
|
|
250
457
|
// padding: 10px 16px;
|
|
251
458
|
}
|
|
@@ -253,6 +460,7 @@
|
|
|
253
460
|
.menu-item {
|
|
254
461
|
width: 100% !important;
|
|
255
462
|
top: 62px;
|
|
463
|
+
border-right: none;
|
|
256
464
|
}
|
|
257
465
|
|
|
258
466
|
.sidebar-footer {
|
|
@@ -261,17 +469,16 @@
|
|
|
261
469
|
}
|
|
262
470
|
}
|
|
263
471
|
|
|
264
|
-
.ant-menu-item:hover {
|
|
265
|
-
background-color: #e6f7ff !important;
|
|
266
|
-
color: #1677ff !important;
|
|
267
|
-
}
|
|
268
|
-
|
|
269
472
|
/* Tooltip styling if needed */
|
|
270
473
|
.ant-tooltip-inner {
|
|
271
474
|
max-width: 200px;
|
|
272
475
|
white-space: nowrap;
|
|
273
476
|
overflow: hidden;
|
|
274
477
|
text-overflow: ellipsis;
|
|
275
|
-
background-color:
|
|
276
|
-
color: #
|
|
478
|
+
background-color: rgba(255, 255, 255, 0.98) !important;
|
|
479
|
+
color: #111827 !important;
|
|
480
|
+
border: 1px solid rgba(224, 229, 238, 0.95);
|
|
481
|
+
box-shadow: 0 8px 20px rgba(15, 23, 42, 0.08);
|
|
482
|
+
border-radius: 10px;
|
|
483
|
+
font-weight: 500;
|
|
277
484
|
}
|