zenkit-css 1.0.7 → 1.2.0

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.
@@ -0,0 +1,711 @@
1
+ // ========================================
2
+ // ZenKit - Sidebar Component
3
+ // ========================================
4
+
5
+ @use '../abstracts/variables' as *;
6
+
7
+ // ----------------------------------------
8
+ // Sidebar Variables
9
+ // ----------------------------------------
10
+ :root {
11
+ --sidebar-width: 260px;
12
+ --sidebar-collapsed-width: 70px;
13
+ --sidebar-bg: var(--bg);
14
+ --sidebar-border: var(--border);
15
+ --sidebar-transition: 0.3s ease;
16
+ }
17
+
18
+ // ----------------------------------------
19
+ // Sidebar Container
20
+ // ----------------------------------------
21
+ .sidebar {
22
+ position: fixed;
23
+ top: 0;
24
+ left: 0;
25
+ height: 100vh;
26
+ width: var(--sidebar-width);
27
+ background-color: var(--sidebar-bg);
28
+ border-right: 1px solid var(--sidebar-border);
29
+ display: flex;
30
+ flex-direction: column;
31
+ z-index: 1000;
32
+ transition: width var(--sidebar-transition),
33
+ transform var(--sidebar-transition);
34
+ overflow: hidden;
35
+ }
36
+
37
+ .sidebar-right {
38
+ left: auto;
39
+ right: 0;
40
+ border-right: none;
41
+ border-left: 1px solid var(--sidebar-border);
42
+ }
43
+
44
+ // ----------------------------------------
45
+ // Sidebar Header
46
+ // ----------------------------------------
47
+ .sidebar-header {
48
+ display: flex;
49
+ align-items: center;
50
+ justify-content: space-between;
51
+ padding: 1rem 1.25rem;
52
+ border-bottom: 1px solid var(--sidebar-border);
53
+ min-height: 64px;
54
+ }
55
+
56
+ .sidebar-logo {
57
+ display: flex;
58
+ align-items: center;
59
+ gap: 0.75rem;
60
+ text-decoration: none;
61
+ color: var(--text);
62
+ font-weight: $font-weight-semibold;
63
+ font-size: 1.125rem;
64
+ white-space: nowrap;
65
+ overflow: hidden;
66
+ }
67
+
68
+ .sidebar-logo-icon {
69
+ flex-shrink: 0;
70
+ width: 2rem;
71
+ height: 2rem;
72
+ }
73
+
74
+ .sidebar-logo-text {
75
+ opacity: 1;
76
+ transition: opacity var(--sidebar-transition);
77
+ }
78
+
79
+ // ----------------------------------------
80
+ // Sidebar Toggle Button
81
+ // ----------------------------------------
82
+ .sidebar-toggle {
83
+ display: flex;
84
+ align-items: center;
85
+ justify-content: center;
86
+ width: 2rem;
87
+ height: 2rem;
88
+ padding: 0;
89
+ background: transparent;
90
+ border: none;
91
+ border-radius: $border-radius;
92
+ color: var(--text-muted);
93
+ cursor: pointer;
94
+ transition: all $transition-fast $transition-timing;
95
+ flex-shrink: 0;
96
+
97
+ &:hover {
98
+ background-color: var(--gray-100);
99
+ color: var(--text);
100
+ }
101
+
102
+ svg {
103
+ width: 1.25rem;
104
+ height: 1.25rem;
105
+ transition: transform var(--sidebar-transition);
106
+ }
107
+ }
108
+
109
+ // ----------------------------------------
110
+ // Sidebar Content
111
+ // ----------------------------------------
112
+ .sidebar-content {
113
+ flex: 1;
114
+ overflow-y: auto;
115
+ overflow-x: hidden;
116
+ padding: 0.5rem 0;
117
+
118
+ &::-webkit-scrollbar {
119
+ width: 4px;
120
+ }
121
+
122
+ &::-webkit-scrollbar-thumb {
123
+ background-color: var(--gray-300);
124
+ border-radius: 4px;
125
+ }
126
+ }
127
+
128
+ // ----------------------------------------
129
+ // Sidebar Navigation
130
+ // ----------------------------------------
131
+ .sidebar-nav {
132
+ padding: 0 0.75rem;
133
+ }
134
+
135
+ .sidebar-nav-section {
136
+ margin-bottom: 1rem;
137
+ }
138
+
139
+ .sidebar-nav-title {
140
+ display: flex;
141
+ align-items: center;
142
+ padding: 0.5rem 0.75rem;
143
+ font-size: var(--text-xs);
144
+ font-weight: $font-weight-semibold;
145
+ text-transform: uppercase;
146
+ letter-spacing: 0.05em;
147
+ color: var(--text-muted);
148
+ white-space: nowrap;
149
+ overflow: hidden;
150
+ }
151
+
152
+ // ----------------------------------------
153
+ // Sidebar Menu Items
154
+ // ----------------------------------------
155
+ .sidebar-menu {
156
+ list-style: none;
157
+ margin: 0;
158
+ padding: 0;
159
+ }
160
+
161
+ .sidebar-item {
162
+ margin-bottom: 2px;
163
+ }
164
+
165
+ .sidebar-link {
166
+ display: flex;
167
+ align-items: center;
168
+ padding: 0.625rem 0.75rem;
169
+ color: var(--text);
170
+ text-decoration: none;
171
+ border-radius: $border-radius;
172
+ transition: all $transition-fast $transition-timing;
173
+ white-space: nowrap;
174
+ overflow: hidden;
175
+ gap: 0.75rem;
176
+
177
+ &:hover {
178
+ background-color: var(--gray-100);
179
+ color: var(--text);
180
+ }
181
+
182
+ &:focus {
183
+ outline: none;
184
+ box-shadow: 0 0 0 2px var(--primary-200);
185
+ }
186
+ }
187
+
188
+ .sidebar-link.active {
189
+ background-color: var(--primary-50);
190
+ color: var(--primary);
191
+ font-weight: $font-weight-medium;
192
+
193
+ .sidebar-icon {
194
+ color: var(--primary);
195
+ }
196
+ }
197
+
198
+ .sidebar-icon {
199
+ flex-shrink: 0;
200
+ width: 1.25rem;
201
+ height: 1.25rem;
202
+ color: var(--text-muted);
203
+ transition: color $transition-fast $transition-timing;
204
+ }
205
+
206
+ .sidebar-text {
207
+ flex: 1;
208
+ opacity: 1;
209
+ transition: opacity var(--sidebar-transition);
210
+ }
211
+
212
+ .sidebar-badge {
213
+ flex-shrink: 0;
214
+ display: inline-flex;
215
+ align-items: center;
216
+ justify-content: center;
217
+ min-width: 1.25rem;
218
+ height: 1.25rem;
219
+ padding: 0 0.375rem;
220
+ font-size: var(--text-xs);
221
+ font-weight: $font-weight-medium;
222
+ background-color: var(--primary);
223
+ color: var(--white);
224
+ border-radius: 999px;
225
+ }
226
+
227
+ // ----------------------------------------
228
+ // Sidebar Submenu
229
+ // ----------------------------------------
230
+ .sidebar-submenu-toggle {
231
+ display: flex;
232
+ align-items: center;
233
+ width: 100%;
234
+ padding: 0.625rem 0.75rem;
235
+ background: transparent;
236
+ border: none;
237
+ border-radius: $border-radius;
238
+ color: var(--text);
239
+ cursor: pointer;
240
+ transition: all $transition-fast $transition-timing;
241
+ gap: 0.75rem;
242
+
243
+ &:hover {
244
+ background-color: var(--gray-100);
245
+ }
246
+ }
247
+
248
+ .sidebar-submenu-arrow {
249
+ flex-shrink: 0;
250
+ width: 1rem;
251
+ height: 1rem;
252
+ margin-left: auto;
253
+ transition: transform var(--sidebar-transition);
254
+
255
+ &::before {
256
+ content: "";
257
+ display: block;
258
+ width: 6px;
259
+ height: 6px;
260
+ border: solid var(--text-muted);
261
+ border-width: 0 2px 2px 0;
262
+ transform: rotate(-45deg);
263
+ margin: 4px auto;
264
+ }
265
+ }
266
+
267
+ .sidebar-item.open .sidebar-submenu-arrow {
268
+ transform: rotate(90deg);
269
+ }
270
+
271
+ .sidebar-submenu {
272
+ list-style: none;
273
+ margin: 0;
274
+ padding: 0;
275
+ max-height: 0;
276
+ overflow: hidden;
277
+ transition: max-height var(--sidebar-transition);
278
+ }
279
+
280
+ .sidebar-item.open .sidebar-submenu {
281
+ max-height: 500px;
282
+ }
283
+
284
+ .sidebar-submenu .sidebar-link {
285
+ padding-left: 2.75rem;
286
+ font-size: var(--text-sm);
287
+ }
288
+
289
+ // ----------------------------------------
290
+ // Sidebar Footer
291
+ // ----------------------------------------
292
+ .sidebar-footer {
293
+ padding: 1rem 1.25rem;
294
+ border-top: 1px solid var(--sidebar-border);
295
+ margin-top: auto;
296
+ }
297
+
298
+ .sidebar-user {
299
+ display: flex;
300
+ align-items: center;
301
+ gap: 0.75rem;
302
+ overflow: hidden;
303
+ }
304
+
305
+ .sidebar-avatar {
306
+ flex-shrink: 0;
307
+ width: 2.5rem;
308
+ height: 2.5rem;
309
+ border-radius: 50%;
310
+ object-fit: cover;
311
+ }
312
+
313
+ .sidebar-user-info {
314
+ flex: 1;
315
+ min-width: 0;
316
+ overflow: hidden;
317
+ }
318
+
319
+ .sidebar-user-name {
320
+ font-weight: $font-weight-medium;
321
+ white-space: nowrap;
322
+ overflow: hidden;
323
+ text-overflow: ellipsis;
324
+ }
325
+
326
+ .sidebar-user-email {
327
+ font-size: var(--text-xs);
328
+ color: var(--text-muted);
329
+ white-space: nowrap;
330
+ overflow: hidden;
331
+ text-overflow: ellipsis;
332
+ }
333
+
334
+ // ----------------------------------------
335
+ // Collapsed State
336
+ // ----------------------------------------
337
+ .sidebar-collapsed {
338
+ width: var(--sidebar-collapsed-width);
339
+
340
+ .sidebar-logo-text,
341
+ .sidebar-text,
342
+ .sidebar-badge,
343
+ .sidebar-nav-title,
344
+ .sidebar-submenu-arrow,
345
+ .sidebar-user-info {
346
+ opacity: 0;
347
+ visibility: hidden;
348
+ width: 0;
349
+ padding: 0;
350
+ margin: 0;
351
+ }
352
+
353
+ .sidebar-header {
354
+ justify-content: center;
355
+ padding: 1rem;
356
+ }
357
+
358
+ .sidebar-logo {
359
+ justify-content: center;
360
+ }
361
+
362
+ .sidebar-toggle {
363
+ display: none;
364
+ }
365
+
366
+ .sidebar-link,
367
+ .sidebar-submenu-toggle {
368
+ justify-content: center;
369
+ padding: 0.75rem;
370
+ }
371
+
372
+ .sidebar-submenu {
373
+ max-height: 0 !important;
374
+ visibility: hidden;
375
+ }
376
+
377
+ .sidebar-footer {
378
+ padding: 1rem;
379
+ display: flex;
380
+ justify-content: center;
381
+ }
382
+
383
+ .sidebar-user {
384
+ justify-content: center;
385
+ }
386
+
387
+ // Tooltip on hover for collapsed state
388
+ .sidebar-link,
389
+ .sidebar-submenu-toggle {
390
+ position: relative;
391
+
392
+ &::after {
393
+ content: attr(data-tooltip);
394
+ position: absolute;
395
+ left: 100%;
396
+ top: 50%;
397
+ transform: translateY(-50%);
398
+ padding: 0.375rem 0.75rem;
399
+ background-color: var(--gray-900);
400
+ color: var(--white);
401
+ font-size: var(--text-xs);
402
+ border-radius: $border-radius;
403
+ white-space: nowrap;
404
+ opacity: 0;
405
+ visibility: hidden;
406
+ transition: opacity $transition-fast $transition-timing;
407
+ margin-left: 0.5rem;
408
+ z-index: 100;
409
+ }
410
+
411
+ &:hover::after {
412
+ opacity: 1;
413
+ visibility: visible;
414
+ }
415
+ }
416
+ }
417
+
418
+ // Toggle rotation
419
+ .sidebar-collapsed .sidebar-toggle svg {
420
+ transform: rotate(180deg);
421
+ }
422
+
423
+ // ----------------------------------------
424
+ // Sidebar Overlay (Mobile)
425
+ // ----------------------------------------
426
+ .sidebar-overlay {
427
+ position: fixed;
428
+ top: 0;
429
+ left: 0;
430
+ right: 0;
431
+ bottom: 0;
432
+ background-color: rgba(0, 0, 0, 0.5);
433
+ z-index: 999;
434
+ opacity: 0;
435
+ visibility: hidden;
436
+ transition: opacity var(--sidebar-transition),
437
+ visibility var(--sidebar-transition);
438
+ }
439
+
440
+ .sidebar-overlay.active {
441
+ opacity: 1;
442
+ visibility: visible;
443
+ }
444
+
445
+ // ----------------------------------------
446
+ // Mobile Sidebar
447
+ // ----------------------------------------
448
+ @media (max-width: 991px) {
449
+ .sidebar {
450
+ transform: translateX(-100%);
451
+ }
452
+
453
+ .sidebar-right {
454
+ transform: translateX(100%);
455
+ }
456
+
457
+ .sidebar.sidebar-open {
458
+ transform: translateX(0);
459
+ }
460
+
461
+ // Reset collapsed state on mobile
462
+ .sidebar-collapsed {
463
+ width: var(--sidebar-width);
464
+
465
+ .sidebar-logo-text,
466
+ .sidebar-text,
467
+ .sidebar-badge,
468
+ .sidebar-nav-title,
469
+ .sidebar-submenu-arrow,
470
+ .sidebar-user-info {
471
+ opacity: 1;
472
+ visibility: visible;
473
+ width: auto;
474
+ }
475
+
476
+ .sidebar-header {
477
+ justify-content: space-between;
478
+ }
479
+
480
+ .sidebar-link,
481
+ .sidebar-submenu-toggle {
482
+ justify-content: flex-start;
483
+ }
484
+ }
485
+ }
486
+
487
+ // Mobile toggle button (shown outside sidebar)
488
+ .sidebar-mobile-toggle {
489
+ display: none;
490
+ position: fixed;
491
+ bottom: 1rem;
492
+ right: 1rem;
493
+ width: 3rem;
494
+ height: 3rem;
495
+ padding: 0;
496
+ background-color: var(--primary);
497
+ color: var(--white);
498
+ border: none;
499
+ border-radius: 50%;
500
+ cursor: pointer;
501
+ z-index: 998;
502
+ box-shadow: 0 4px 12px rgba($primary, 0.3);
503
+ transition: all $transition-base $transition-timing;
504
+
505
+ &:hover {
506
+ background-color: var(--primary-600);
507
+ transform: scale(1.05);
508
+ }
509
+
510
+ svg {
511
+ width: 1.5rem;
512
+ height: 1.5rem;
513
+ }
514
+
515
+ @media (max-width: 991px) {
516
+ display: flex;
517
+ align-items: center;
518
+ justify-content: center;
519
+ }
520
+ }
521
+
522
+ // ----------------------------------------
523
+ // Main Content with Sidebar
524
+ // ----------------------------------------
525
+ .main-with-sidebar {
526
+ margin-left: var(--sidebar-width);
527
+ transition: margin-left var(--sidebar-transition);
528
+ }
529
+
530
+ .main-with-sidebar-right {
531
+ margin-left: 0;
532
+ margin-right: var(--sidebar-width);
533
+ transition: margin-right var(--sidebar-transition);
534
+ }
535
+
536
+ .sidebar-collapsed ~ .main-with-sidebar,
537
+ .sidebar-collapsed + .main-with-sidebar {
538
+ margin-left: var(--sidebar-collapsed-width);
539
+ }
540
+
541
+ .sidebar-collapsed ~ .main-with-sidebar-right,
542
+ .sidebar-collapsed + .main-with-sidebar-right {
543
+ margin-right: var(--sidebar-collapsed-width);
544
+ }
545
+
546
+ @media (max-width: 991px) {
547
+ .main-with-sidebar,
548
+ .main-with-sidebar-right {
549
+ margin-left: 0;
550
+ margin-right: 0;
551
+ }
552
+ }
553
+
554
+ // ----------------------------------------
555
+ // Sidebar Variants
556
+ // ----------------------------------------
557
+
558
+ // Dark Sidebar
559
+ .sidebar-dark {
560
+ --sidebar-bg: var(--gray-900);
561
+ --sidebar-border: var(--gray-700);
562
+ color: var(--gray-100);
563
+
564
+ .sidebar-logo {
565
+ color: var(--white);
566
+ }
567
+
568
+ .sidebar-toggle:hover {
569
+ background-color: var(--gray-800);
570
+ color: var(--gray-100);
571
+ }
572
+
573
+ .sidebar-nav-title {
574
+ color: var(--gray-500);
575
+ }
576
+
577
+ .sidebar-link {
578
+ color: var(--gray-300);
579
+
580
+ &:hover {
581
+ background-color: var(--gray-800);
582
+ color: var(--white);
583
+ }
584
+ }
585
+
586
+ .sidebar-link.active {
587
+ background-color: rgba($primary, 0.2);
588
+ color: var(--primary-300);
589
+ }
590
+
591
+ .sidebar-icon {
592
+ color: var(--gray-500);
593
+ }
594
+
595
+ .sidebar-submenu-toggle {
596
+ color: var(--gray-300);
597
+
598
+ &:hover {
599
+ background-color: var(--gray-800);
600
+ }
601
+ }
602
+
603
+ .sidebar-submenu-arrow::before {
604
+ border-color: var(--gray-500);
605
+ }
606
+
607
+ &.sidebar-collapsed .sidebar-link::after,
608
+ &.sidebar-collapsed .sidebar-submenu-toggle::after {
609
+ background-color: var(--gray-700);
610
+ }
611
+
612
+ .sidebar-content::-webkit-scrollbar-thumb {
613
+ background-color: var(--gray-600);
614
+ }
615
+ }
616
+
617
+ // Transparent Sidebar
618
+ .sidebar-transparent {
619
+ background-color: transparent;
620
+ border: none;
621
+ backdrop-filter: blur(10px);
622
+ -webkit-backdrop-filter: blur(10px);
623
+ }
624
+
625
+ // Bordered Variant
626
+ .sidebar-bordered {
627
+ border: none;
628
+ box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1);
629
+ }
630
+
631
+ // ----------------------------------------
632
+ // Sidebar Divider
633
+ // ----------------------------------------
634
+ .sidebar-divider {
635
+ height: 1px;
636
+ background-color: var(--sidebar-border);
637
+ margin: 0.5rem 0.75rem;
638
+ }
639
+
640
+ // ----------------------------------------
641
+ // Compact Mode
642
+ // ----------------------------------------
643
+ .sidebar-compact {
644
+ --sidebar-width: 220px;
645
+ --sidebar-collapsed-width: 60px;
646
+
647
+ .sidebar-link,
648
+ .sidebar-submenu-toggle {
649
+ padding: 0.5rem 0.625rem;
650
+ font-size: var(--text-sm);
651
+ }
652
+
653
+ .sidebar-icon {
654
+ width: 1rem;
655
+ height: 1rem;
656
+ }
657
+
658
+ .sidebar-header {
659
+ min-height: 56px;
660
+ padding: 0.75rem 1rem;
661
+ }
662
+ }
663
+
664
+ // ----------------------------------------
665
+ // Dark Mode
666
+ // ----------------------------------------
667
+ [data-theme="dark"] {
668
+ .sidebar {
669
+ --sidebar-bg: var(--gray-900);
670
+ --sidebar-border: var(--gray-700);
671
+ color: var(--gray-100);
672
+ }
673
+
674
+ .sidebar-logo {
675
+ color: var(--gray-100);
676
+ }
677
+
678
+ .sidebar-toggle:hover {
679
+ background-color: var(--gray-800);
680
+ }
681
+
682
+ .sidebar-link {
683
+ color: var(--gray-300);
684
+
685
+ &:hover {
686
+ background-color: var(--gray-800);
687
+ color: var(--white);
688
+ }
689
+ }
690
+
691
+ .sidebar-link.active {
692
+ background-color: rgba($primary, 0.2);
693
+ color: var(--primary-300);
694
+
695
+ .sidebar-icon {
696
+ color: var(--primary-300);
697
+ }
698
+ }
699
+
700
+ .sidebar-icon {
701
+ color: var(--gray-500);
702
+ }
703
+
704
+ .sidebar-submenu-toggle:hover {
705
+ background-color: var(--gray-800);
706
+ }
707
+
708
+ .sidebar-content::-webkit-scrollbar-thumb {
709
+ background-color: var(--gray-600);
710
+ }
711
+ }