@thl-ui/styles 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +42 -2
  3. package/dist/components/alert.css +1 -0
  4. package/dist/components/app.css +1 -0
  5. package/dist/components/avatar.css +1 -0
  6. package/dist/components/badge.css +1 -0
  7. package/dist/components/button.css +1 -0
  8. package/dist/components/card.css +1 -0
  9. package/dist/components/form.css +1 -0
  10. package/dist/components/nav.css +1 -0
  11. package/dist/components/overlay.css +1 -0
  12. package/dist/components/pages.css +1 -0
  13. package/dist/components/progress.css +1 -0
  14. package/dist/components/ribbon.css +1 -0
  15. package/dist/components/table.css +1 -0
  16. package/dist/components/widgets.css +1 -0
  17. package/dist/fonts/OFL.txt +93 -0
  18. package/dist/fonts/open-sans-cyrillic-ext-wght-normal.woff2 +0 -0
  19. package/dist/fonts/open-sans-cyrillic-wght-normal.woff2 +0 -0
  20. package/dist/fonts/open-sans-greek-ext-wght-normal.woff2 +0 -0
  21. package/dist/fonts/open-sans-greek-wght-normal.woff2 +0 -0
  22. package/dist/fonts/open-sans-latin-ext-wght-normal.woff2 +0 -0
  23. package/dist/fonts/open-sans-latin-wght-normal.woff2 +0 -0
  24. package/dist/fonts/open-sans-vietnamese-wght-normal.woff2 +0 -0
  25. package/dist/fonts.css +70 -0
  26. package/dist/thl-ui.css +447 -0
  27. package/dist/tokens.css +376 -0
  28. package/package.json +48 -4
  29. package/src/_base.scss +408 -0
  30. package/src/_mixins.scss +53 -0
  31. package/src/components/_alert.scss +183 -0
  32. package/src/components/_avatar.scss +75 -0
  33. package/src/components/_badge.scss +112 -0
  34. package/src/components/_button.scss +242 -0
  35. package/src/components/_card.scss +211 -0
  36. package/src/components/_form.scss +959 -0
  37. package/src/components/_nav.scss +738 -0
  38. package/src/components/_overlay.scss +382 -0
  39. package/src/components/_progress.scss +103 -0
  40. package/src/components/_ribbon.scss +136 -0
  41. package/src/components/_table.scss +215 -0
  42. package/src/components/_widgets.scss +1102 -0
  43. package/src/index.scss +16 -0
  44. package/src/layout/_app.scss +804 -0
  45. package/src/pages/_pages.scss +691 -0
@@ -0,0 +1,804 @@
1
+ @use '../mixins' as *;
2
+
3
+ /*
4
+ * App layout — vertical, mini and horizontal shells.
5
+ * Driven by data attributes on <html> (set by createThl().applyToDocument()) and modifier classes on .thl-app:
6
+ * .thl-app--mini sidebar collapsed to 60px (desktop)
7
+ * .thl-app--mobile-open sidebar slid in on small screens
8
+ * .thl-app--horizontal horizontal menu under topbar
9
+ */
10
+ .#{$p}-app {
11
+ min-height: 100vh;
12
+ background: v(body-bg);
13
+ color: v(text);
14
+ font-family: v(font-family);
15
+ font-size: v(font-size);
16
+ line-height: v(line-height);
17
+ position: relative;
18
+ }
19
+
20
+ /* ---------- topbar ---------- */
21
+ .#{$p}-topbar {
22
+ position: relative;
23
+ z-index: calc(#{v(z-sidebar)} + 1);
24
+ display: flex;
25
+ align-items: stretch;
26
+ height: v(topbar-height);
27
+ color: v(topbar-text);
28
+ background: v(topbar-1);
29
+ background: linear-gradient(to right, #{v(topbar-1)} 1%, #{v(topbar-2)} 100%);
30
+ &__brand {
31
+ width: v(sidebar-width);
32
+ flex-shrink: 0;
33
+ display: flex;
34
+ align-items: center;
35
+ gap: 12px;
36
+ padding: 0 18px;
37
+ background: rgba(0, 0, 0, 0.1);
38
+ color: #fff;
39
+ font-weight: 700;
40
+ font-size: 20px;
41
+ overflow: hidden;
42
+ white-space: nowrap;
43
+ transition: width 0.2s ease;
44
+ img {
45
+ height: 32px;
46
+ }
47
+ a {
48
+ color: inherit;
49
+ display: flex;
50
+ align-items: center;
51
+ gap: 12px;
52
+ }
53
+ }
54
+ &__brand-text {
55
+ transition: opacity 0.2s;
56
+ }
57
+ &__left,
58
+ &__right {
59
+ display: flex;
60
+ align-items: stretch;
61
+ margin: 0;
62
+ padding: 0;
63
+ list-style: none;
64
+ }
65
+ &__right {
66
+ margin-inline-start: auto;
67
+ }
68
+ &__item {
69
+ position: relative;
70
+ display: flex;
71
+ align-items: center;
72
+ }
73
+ &__btn {
74
+ display: inline-flex;
75
+ align-items: center;
76
+ justify-content: center;
77
+ gap: 6px;
78
+ height: v(topbar-height);
79
+ min-width: 60px;
80
+ padding: 0 16px;
81
+ border: 0;
82
+ background: none;
83
+ color: #fff;
84
+ font: inherit;
85
+ cursor: pointer;
86
+ position: relative;
87
+ &:hover {
88
+ background: rgba(0, 0, 0, 0.1);
89
+ color: #fff;
90
+ }
91
+ }
92
+ &__btn-text {
93
+ text-transform: uppercase;
94
+ font-size: 12px;
95
+ }
96
+ &__dot {
97
+ position: absolute;
98
+ top: 18px;
99
+ inset-inline-end: 18px;
100
+ width: 8px;
101
+ height: 8px;
102
+ border-radius: 50%;
103
+ background: v(color-danger);
104
+ box-shadow: 0 0 0 0 rgba(231, 74, 37, 0.6);
105
+ animation: #{$p}-ping 1.8s infinite;
106
+ }
107
+ &__search {
108
+ display: flex;
109
+ align-items: center;
110
+ padding: 0 10px;
111
+ input {
112
+ width: 180px;
113
+ height: 36px;
114
+ border-radius: 40px;
115
+ border: 0;
116
+ padding-block: 0;
117
+ padding-inline: 16px 36px;
118
+ background: rgba(255, 255, 255, 0.2);
119
+ color: #fff;
120
+ font: inherit;
121
+ transition:
122
+ width 0.3s,
123
+ background 0.3s;
124
+ &::placeholder {
125
+ color: rgba(255, 255, 255, 0.75);
126
+ }
127
+ &:focus {
128
+ outline: none;
129
+ width: 240px;
130
+ background: rgba(255, 255, 255, 0.3);
131
+ }
132
+ }
133
+ }
134
+ &__user {
135
+ display: flex;
136
+ align-items: center;
137
+ gap: 10px;
138
+ color: #fff;
139
+ padding: 0 16px;
140
+ img {
141
+ width: 36px;
142
+ height: 36px;
143
+ border-radius: 50%;
144
+ object-fit: cover;
145
+ }
146
+ }
147
+ &__dropdown {
148
+ position: absolute;
149
+ top: calc(100% - 4px);
150
+ inset-inline-end: 0;
151
+ width: 310px;
152
+ padding: 0;
153
+ overflow: hidden;
154
+ color: v(text);
155
+ @include down(sm) {
156
+ position: fixed;
157
+ top: v(topbar-height);
158
+ inset-inline: 8px;
159
+ width: auto;
160
+ }
161
+ }
162
+ &__drop-title {
163
+ padding: 12px 20px;
164
+ font-weight: 600;
165
+ color: v(heading);
166
+ border-bottom: 1px solid v(border-color);
167
+ }
168
+ &__drop-footer {
169
+ display: block;
170
+ padding: 12px;
171
+ text-align: center;
172
+ border-top: 1px solid v(border-color);
173
+ color: v(text-strong);
174
+ font-size: 13px;
175
+ &:hover {
176
+ color: v(theme-text);
177
+ }
178
+ }
179
+ @include down(sm) {
180
+ &__brand {
181
+ width: auto;
182
+ }
183
+ &__brand-text {
184
+ display: none;
185
+ }
186
+ &__search {
187
+ display: none;
188
+ }
189
+ &__btn {
190
+ min-width: 48px;
191
+ padding: 0 10px;
192
+ }
193
+ }
194
+ /* phones: 7 icon buttons must fit in 320–479px */
195
+ @include down(xs) {
196
+ &__brand {
197
+ padding: 0 12px;
198
+ }
199
+ &__right {
200
+ min-width: 0;
201
+ }
202
+ &__btn {
203
+ min-width: 40px;
204
+ padding: 0 6px;
205
+ }
206
+ &__dot {
207
+ top: 16px;
208
+ inset-inline-end: 8px;
209
+ }
210
+ /* language code ("EN") is redundant next to the globe icon */
211
+ &__btn-text {
212
+ display: none;
213
+ }
214
+ }
215
+ }
216
+ @keyframes #{$p}-ping {
217
+ 70% {
218
+ box-shadow: 0 0 0 8px rgba(231, 74, 37, 0);
219
+ }
220
+ 100% {
221
+ box-shadow: 0 0 0 0 rgba(231, 74, 37, 0);
222
+ }
223
+ }
224
+
225
+ /* message-center inside topbar dropdowns */
226
+ .#{$p}-message-center {
227
+ max-height: 300px;
228
+ overflow-y: auto;
229
+ &__item {
230
+ display: flex;
231
+ gap: 12px;
232
+ padding: 12px 20px;
233
+ border-bottom: 1px solid v(border-color);
234
+ color: v(text);
235
+ &:hover {
236
+ background: v(surface-muted);
237
+ }
238
+ }
239
+ &__body {
240
+ flex: 1;
241
+ min-width: 0;
242
+ h5,
243
+ &-title {
244
+ margin: 0 0 2px !important;
245
+ color: v(heading);
246
+ font-size: 14px !important;
247
+ }
248
+ }
249
+ &__desc {
250
+ display: block;
251
+ font-size: 12px;
252
+ overflow: hidden;
253
+ text-overflow: ellipsis;
254
+ white-space: nowrap;
255
+ }
256
+ &__time {
257
+ display: block;
258
+ font-size: 11px;
259
+ color: v(text);
260
+ opacity: 0.8;
261
+ }
262
+ }
263
+
264
+ /* ---------- sidebar ---------- */
265
+ .#{$p}-sidebar {
266
+ position: absolute;
267
+ top: v(topbar-height);
268
+ bottom: 0;
269
+ inset-inline-start: 0;
270
+ z-index: v(z-sidebar);
271
+ width: v(sidebar-width);
272
+ background: v(sidebar-bg);
273
+ border-inline-end: 1px solid v(sidebar-border);
274
+ transition:
275
+ width 0.2s ease,
276
+ transform 0.3s ease;
277
+ display: flex;
278
+ flex-direction: column;
279
+ &__scroll {
280
+ flex: 1;
281
+ overflow-y: auto;
282
+ overflow-x: hidden;
283
+ scrollbar-width: thin;
284
+ scrollbar-color: #dcdcdc transparent;
285
+ }
286
+ &__footer {
287
+ padding: 20px 30px;
288
+ display: flex;
289
+ flex-direction: column;
290
+ gap: 10px;
291
+ }
292
+ }
293
+ [data-#{$p}-fixed-sidebar] .#{$p}-sidebar {
294
+ position: fixed;
295
+ }
296
+
297
+ /* user profile block */
298
+ .#{$p}-user-profile {
299
+ padding: 30px 15px 15px;
300
+ text-align: center;
301
+ position: relative;
302
+ &__avatar {
303
+ position: relative;
304
+ display: block;
305
+ width: 79px;
306
+ margin: 0 auto;
307
+ img {
308
+ width: 79px;
309
+ height: 79px;
310
+ border-radius: 50%;
311
+ object-fit: cover;
312
+ }
313
+ }
314
+ &__badge {
315
+ position: absolute;
316
+ top: 0;
317
+ inset-inline-end: -4px;
318
+ width: 26px;
319
+ height: 26px;
320
+ border-radius: 50%;
321
+ border: 3px solid v(sidebar-bg);
322
+ background: v(color-danger);
323
+ color: #fff;
324
+ font-size: 10px;
325
+ display: flex;
326
+ align-items: center;
327
+ justify-content: center;
328
+ }
329
+ &__name {
330
+ margin-top: 12px;
331
+ color: v(sidebar-active);
332
+ font-weight: 500;
333
+ display: flex;
334
+ justify-content: center;
335
+ align-items: center;
336
+ gap: 4px;
337
+ background: none;
338
+ border: 0;
339
+ font: inherit;
340
+ cursor: pointer;
341
+ }
342
+ &__role {
343
+ font-size: 12px;
344
+ color: v(sidebar-text);
345
+ }
346
+ .#{$p}-menu {
347
+ inset-inline-start: 50%;
348
+ transform: translateX(-50%);
349
+ }
350
+ }
351
+
352
+ /* side menu (metisMenu replacement) */
353
+ .#{$p}-side-menu {
354
+ list-style: none;
355
+ margin: 0;
356
+ padding: 0;
357
+ &__heading {
358
+ padding: 18px 30px 6px;
359
+ font-size: 11px;
360
+ font-weight: 700;
361
+ text-transform: uppercase;
362
+ letter-spacing: 0.08em;
363
+ color: v(sidebar-text);
364
+ opacity: 0.7;
365
+ white-space: nowrap;
366
+ }
367
+ &__divider {
368
+ height: 1px;
369
+ margin: 10px 30px;
370
+ background: v(sidebar-border);
371
+ }
372
+ &__link {
373
+ display: flex;
374
+ align-items: center;
375
+ gap: 0;
376
+ width: 100%;
377
+ padding-block: 14px;
378
+ padding-inline: 30px 25px;
379
+ color: v(sidebar-text);
380
+ font: inherit;
381
+ font-size: 15px;
382
+ font-weight: 500;
383
+ text-align: start;
384
+ background: none;
385
+ border: 0;
386
+ cursor: pointer;
387
+ white-space: nowrap;
388
+ text-decoration: none;
389
+ transition: color 0.2s;
390
+ position: relative;
391
+ &:hover {
392
+ color: v(theme-text);
393
+ }
394
+ &.is-active {
395
+ color: v(sidebar-active);
396
+ .#{$p}-side-menu__icon {
397
+ color: v(theme-text);
398
+ }
399
+ }
400
+ &.is-current::before {
401
+ content: '';
402
+ position: absolute;
403
+ inset-inline-end: 0;
404
+ top: 0;
405
+ bottom: 0;
406
+ width: 2px;
407
+ background: v(theme);
408
+ }
409
+ }
410
+ &__icon {
411
+ width: 20px;
412
+ margin-inline-end: 10px;
413
+ font-size: 18px;
414
+ display: inline-flex;
415
+ justify-content: center;
416
+ flex-shrink: 0;
417
+ }
418
+ &__label {
419
+ flex: 1;
420
+ overflow: hidden;
421
+ text-overflow: ellipsis;
422
+ }
423
+ &__badge {
424
+ margin-inline-start: 8px;
425
+ }
426
+ &__arrow {
427
+ margin-inline-start: 8px;
428
+ font-size: 12px;
429
+ transition: transform 0.2s;
430
+ }
431
+ &__link[aria-expanded='true'] &__arrow {
432
+ transform: rotate(90deg);
433
+ }
434
+ &__sub {
435
+ list-style: none;
436
+ margin: 0;
437
+ padding: 0;
438
+ padding-inline-start: 30px;
439
+ overflow: hidden;
440
+ .#{$p}-side-menu__link {
441
+ padding-block: 8px;
442
+ padding-inline: 34px 25px;
443
+ font-size: 14px;
444
+ font-weight: 400;
445
+ }
446
+ .#{$p}-side-menu__sub {
447
+ padding-inline-start: 20px;
448
+ }
449
+ }
450
+ &__collapse {
451
+ display: grid;
452
+ grid-template-rows: 0fr;
453
+ transition: grid-template-rows 0.25s ease;
454
+ > * {
455
+ overflow: hidden;
456
+ }
457
+ &.is-open {
458
+ grid-template-rows: 1fr;
459
+ }
460
+ }
461
+ }
462
+ [dir='rtl'] .#{$p}-side-menu__link[aria-expanded='true'] .#{$p}-side-menu__arrow {
463
+ transform: rotate(-90deg);
464
+ }
465
+
466
+ /* ---------- page wrapper ---------- */
467
+ .#{$p}-page {
468
+ margin-inline-start: v(sidebar-width);
469
+ min-height: calc(100vh - #{v(topbar-height)});
470
+ display: flex;
471
+ flex-direction: column;
472
+ transition: margin 0.2s ease;
473
+ background: v(body-bg);
474
+ }
475
+ .#{$p}-page__content {
476
+ flex: 1;
477
+ padding: v(container-padding) v(container-padding) 0;
478
+ min-width: 0;
479
+ }
480
+ .#{$p}-page__content > .#{$p}-row + .#{$p}-row {
481
+ margin-top: 0;
482
+ }
483
+ .#{$p}-page-header {
484
+ display: flex;
485
+ align-items: center;
486
+ justify-content: space-between;
487
+ gap: 12px;
488
+ flex-wrap: wrap;
489
+ padding: 15px v(container-padding);
490
+ background: v(surface);
491
+ border-bottom: 1px solid v(border-color);
492
+ margin-bottom: 0;
493
+ &__title {
494
+ margin: 0 !important;
495
+ font-size: 14px !important;
496
+ font-weight: 600;
497
+ text-transform: uppercase;
498
+ color: v(heading);
499
+ letter-spacing: 0.03em;
500
+ line-height: 1.5 !important;
501
+ }
502
+ &__actions {
503
+ display: flex;
504
+ gap: 10px;
505
+ align-items: center;
506
+ }
507
+ }
508
+ .#{$p}-footer {
509
+ padding: 20px v(container-padding);
510
+ color: v(text);
511
+ background: v(surface);
512
+ border-top: 1px solid v(border-color);
513
+ text-align: center;
514
+ font-size: 13px;
515
+ margin-top: v(space-7);
516
+ }
517
+
518
+ /* fixed header */
519
+ [data-#{$p}-fixed-header] {
520
+ .#{$p}-topbar {
521
+ position: fixed;
522
+ top: 0;
523
+ inset-inline: 0;
524
+ }
525
+ .#{$p}-app:not(.#{$p}-app--blank) {
526
+ padding-top: v(topbar-height);
527
+ }
528
+ .#{$p}-sidebar {
529
+ position: fixed;
530
+ }
531
+ }
532
+
533
+ /* ---------- mini sidebar ---------- */
534
+ .#{$p}-app--mini {
535
+ .#{$p}-topbar__brand {
536
+ width: v(sidebar-mini-width);
537
+ padding: 0 14px;
538
+ }
539
+ .#{$p}-topbar__brand-text {
540
+ opacity: 0;
541
+ width: 0;
542
+ }
543
+ .#{$p}-sidebar {
544
+ width: v(sidebar-mini-width);
545
+ }
546
+ .#{$p}-sidebar:not(:hover) {
547
+ .#{$p}-side-menu__label,
548
+ .#{$p}-side-menu__arrow,
549
+ .#{$p}-side-menu__badge,
550
+ .#{$p}-side-menu__heading,
551
+ .#{$p}-user-profile,
552
+ .#{$p}-sidebar__footer {
553
+ display: none;
554
+ }
555
+ .#{$p}-side-menu__collapse {
556
+ display: none;
557
+ }
558
+ .#{$p}-side-menu__link {
559
+ padding-inline: 20px;
560
+ }
561
+ }
562
+ /* expand on hover as an overlay (265px flyout) */
563
+ .#{$p}-sidebar:hover {
564
+ width: v(sidebar-width);
565
+ box-shadow: v(shadow-lg);
566
+ }
567
+ .#{$p}-page {
568
+ margin-inline-start: v(sidebar-mini-width);
569
+ }
570
+ }
571
+
572
+ /* ---------- mobile (<768) ---------- */
573
+ @include down(sm) {
574
+ .#{$p}-sidebar,
575
+ .#{$p}-app--mini .#{$p}-sidebar {
576
+ width: v(sidebar-width);
577
+ transform: translateX(-100%);
578
+ position: fixed;
579
+ box-shadow: none;
580
+ }
581
+ [dir='rtl'] .#{$p}-sidebar {
582
+ transform: translateX(100%);
583
+ }
584
+ .#{$p}-app--mini .#{$p}-sidebar:not(:hover) {
585
+ .#{$p}-side-menu__label,
586
+ .#{$p}-side-menu__arrow,
587
+ .#{$p}-side-menu__badge,
588
+ .#{$p}-side-menu__heading {
589
+ display: revert;
590
+ }
591
+ .#{$p}-side-menu__link {
592
+ padding-inline: 30px 25px;
593
+ }
594
+ .#{$p}-user-profile,
595
+ .#{$p}-sidebar__footer {
596
+ display: block;
597
+ }
598
+ .#{$p}-side-menu__collapse {
599
+ display: grid;
600
+ }
601
+ }
602
+ .#{$p}-app--mobile-open .#{$p}-sidebar {
603
+ transform: none !important;
604
+ box-shadow: v(shadow-lg);
605
+ }
606
+ .#{$p}-page,
607
+ .#{$p}-app--mini .#{$p}-page {
608
+ margin-inline-start: 0;
609
+ }
610
+ .#{$p}-page__content {
611
+ padding: 15px 15px 0;
612
+ }
613
+ .#{$p}-page-header {
614
+ padding: 12px 15px;
615
+ }
616
+ .#{$p}-sidebar-backdrop {
617
+ position: fixed;
618
+ inset: 0;
619
+ z-index: calc(#{v(z-sidebar)} - 1);
620
+ background: rgba(0, 0, 0, 0.4);
621
+ animation: #{$p}-fade-in 0.2s;
622
+ }
623
+ }
624
+ @include up(sm) {
625
+ .#{$p}-sidebar-backdrop {
626
+ display: none;
627
+ }
628
+ }
629
+
630
+ /* ---------- horizontal ---------- */
631
+ .#{$p}-app--horizontal {
632
+ .#{$p}-sidebar {
633
+ position: sticky;
634
+ top: 0;
635
+ bottom: auto;
636
+ width: 100% !important;
637
+ height: auto;
638
+ flex-direction: row;
639
+ border-inline-end: 0;
640
+ border-bottom: 1px solid v(sidebar-border);
641
+ box-shadow: 1px 0 20px rgba(0, 0, 0, 0.08);
642
+ transform: none !important;
643
+ }
644
+ .#{$p}-sidebar__scroll {
645
+ overflow: visible;
646
+ }
647
+ .#{$p}-user-profile,
648
+ .#{$p}-sidebar__footer,
649
+ .#{$p}-side-menu__heading,
650
+ .#{$p}-side-menu__divider {
651
+ display: none;
652
+ }
653
+ .#{$p}-side-menu {
654
+ display: flex;
655
+ flex-wrap: nowrap;
656
+ padding: 0 15px;
657
+ > li {
658
+ position: relative;
659
+ flex-shrink: 0;
660
+ }
661
+ /* items that do not fit stay measurable but out of flow; they are repeated inside "More" */
662
+ > li.is-overflow {
663
+ position: absolute;
664
+ top: 0;
665
+ inset-inline-start: 0;
666
+ visibility: hidden;
667
+ pointer-events: none;
668
+ }
669
+ > .#{$p}-side-menu__more > .#{$p}-side-menu__collapse .#{$p}-side-menu__sub {
670
+ max-height: calc(100vh - #{v(topbar-height)} - 70px);
671
+ overflow-y: auto;
672
+ }
673
+ > li > .#{$p}-side-menu__link {
674
+ padding: 15px;
675
+ }
676
+ > li > .#{$p}-side-menu__collapse {
677
+ position: absolute;
678
+ top: 100%;
679
+ inset-inline-start: 0;
680
+ width: 260px;
681
+ z-index: v(z-dropdown);
682
+ background: v(surface);
683
+ box-shadow: v(shadow-lg);
684
+ border-radius: 0 0 v(radius) v(radius);
685
+ display: none;
686
+ grid-template-rows: 1fr;
687
+ }
688
+ > li:hover > .#{$p}-side-menu__collapse,
689
+ > li:focus-within > .#{$p}-side-menu__collapse {
690
+ display: grid;
691
+ }
692
+ > li:last-child > .#{$p}-side-menu__collapse,
693
+ > li:nth-last-child(2) > .#{$p}-side-menu__collapse {
694
+ inset-inline-start: auto;
695
+ inset-inline-end: 0;
696
+ }
697
+ .#{$p}-side-menu__sub {
698
+ padding: 8px 0;
699
+ .#{$p}-side-menu__link {
700
+ color: v(text-strong);
701
+ padding: 8px 20px;
702
+ &:hover {
703
+ color: v(theme-text);
704
+ }
705
+ }
706
+ }
707
+ }
708
+ .#{$p}-side-menu__link[aria-expanded] .#{$p}-side-menu__arrow {
709
+ transform: rotate(90deg);
710
+ }
711
+ .#{$p}-page {
712
+ margin-inline-start: 0 !important;
713
+ }
714
+ .#{$p}-topbar__brand {
715
+ width: auto;
716
+ padding: 0 25px;
717
+ }
718
+ .#{$p}-topbar__toggler {
719
+ display: none;
720
+ }
721
+ @include down(sm) {
722
+ .#{$p}-sidebar {
723
+ position: fixed;
724
+ top: v(topbar-height);
725
+ bottom: 0;
726
+ width: v(sidebar-width) !important;
727
+ flex-direction: column;
728
+ transform: translateX(-100%) !important;
729
+ }
730
+ &.#{$p}-app--mobile-open .#{$p}-sidebar {
731
+ transform: none !important;
732
+ }
733
+ .#{$p}-sidebar__scroll {
734
+ overflow-y: auto;
735
+ }
736
+ .#{$p}-side-menu {
737
+ flex-direction: column;
738
+ flex-wrap: nowrap;
739
+ padding: 0;
740
+ > li > .#{$p}-side-menu__collapse {
741
+ position: static;
742
+ width: auto;
743
+ box-shadow: none;
744
+ display: grid;
745
+ }
746
+ }
747
+ .#{$p}-topbar__toggler {
748
+ display: inline-flex;
749
+ }
750
+ }
751
+ }
752
+ [data-#{$p}-fixed-header] .#{$p}-app--horizontal .#{$p}-sidebar {
753
+ top: v(topbar-height);
754
+ position: sticky;
755
+ }
756
+
757
+ /* ---------- settings panel (right-sidebar) ---------- */
758
+ .#{$p}-settings {
759
+ display: flex;
760
+ flex-direction: column;
761
+ gap: 22px;
762
+ &__section :is(h3, h5) {
763
+ margin: 0 0 10px !important;
764
+ line-height: 18px;
765
+ font-size: 13px !important;
766
+ text-transform: uppercase;
767
+ font-weight: 600;
768
+ color: v(heading);
769
+ letter-spacing: 0.04em;
770
+ }
771
+ &__skins {
772
+ display: grid;
773
+ grid-template-columns: repeat(6, 1fr);
774
+ gap: 8px;
775
+ list-style: none;
776
+ padding: 0;
777
+ margin: 0 0 8px;
778
+ }
779
+ &__skin {
780
+ width: 100%;
781
+ aspect-ratio: 1;
782
+ border-radius: v(radius-sm);
783
+ border: 2px solid transparent;
784
+ cursor: pointer;
785
+ padding: 0;
786
+ position: relative;
787
+ overflow: hidden;
788
+ &--dark::after {
789
+ content: '';
790
+ position: absolute;
791
+ inset: 0 0 0 50%;
792
+ background: #4f5467;
793
+ }
794
+ &.is-active {
795
+ border-color: v(text-strong);
796
+ box-shadow: 0 0 0 2px v(surface) inset;
797
+ }
798
+ }
799
+ &__options {
800
+ display: flex;
801
+ gap: 6px;
802
+ flex-wrap: wrap;
803
+ }
804
+ }