ui-soxo-bootstrap-core 2.6.1-dev.16 → 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.
@@ -10,11 +10,11 @@
10
10
 
11
11
  import React, { useState, useEffect, useContext } from 'react';
12
12
 
13
- import { animationControls, motion, useAnimation } from 'framer-motion';
13
+ import { motion, useReducedMotion } from 'framer-motion';
14
14
 
15
15
  import { GlobalContext } from './../../Store';
16
16
 
17
- import { Menu, message, Skeleton, Space, Popover } from 'antd';
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
- const [isMobile, setIsMobile] = useState(false);
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
- <div className="menu-collapsed">
61
- <div>
62
- {menu && menu.image_path ? <img style={{ width: '25px' }} src={menu.image_path}></img> : <i className={`fa-solid fas ${icon}`} />}
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
- </div>
151
+ </>
73
152
  ) : (
74
- <div className="menu-collapsed">
75
- <span className="anticon">
76
- {menu && menu.image_path ? <img style={{ width: '25px' }} src={menu.image_path}></img> : <i className={`fa-solid fas ${icon}`} />}
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
- </div>
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
- <Space className="side-loader">
275
- <Skeleton.Avatar />
276
- <Skeleton.Button />
277
- {/* <Skeleton.Input /> */}
278
- </Space>
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 className={`menu-item ${!collapsed ? 'open' : 'close'}`} style={{ backgroundColor: state.theme.colors.leftSectionBackground }}>
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
- <Menu
337
- // selectedKeys={[selected]}
338
- // style={{ width: 256 }}
339
- // defaultSelectedKeys={selected}
340
- // defaultOpenKeys={['']}
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
- {/* <Menu.Item
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-solid fas fa-user'}
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={menu}
555
+ menu={submenu}
437
556
  caption={submenu.caption}
438
- icon={submenu.icon_name || 'fa-solid fas fa-user'}
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-solid fas fa-user'}
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={menu}
604
+ menu={submenu}
486
605
  caption={submenu.caption}
487
- icon={submenu.icon_name || 'fa-solid fas fa-user'}
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-solid fas fa-user'} collapsed={collapsed} />
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
- {loading ? (
518
- <div class="skeleton-wrapper"></div>
519
- ) : (
520
- <Menu.Item onClick={handleLogout} key="logout-button">
521
- <CollapsedIconMenu caption="Logout" icon="fa-solid fas fa-user" collapsed={collapsed} />
522
- </Menu.Item>
523
- )}
524
- </Menu>
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: #fff;
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: 10px;
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-bottom: 1px solid #f0f0f0;
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: 50px;
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: 81px;
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: 0px;
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: #ffffff !important;
276
- color: #000000 !important;
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
  }