@keenmate/pure-admin-core 1.0.0 → 1.1.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.
Files changed (76) hide show
  1. package/README.md +77 -7
  2. package/dist/css/main.css +792 -431
  3. package/package.json +1 -1
  4. package/snippets/customization.html +1 -1
  5. package/snippets/layout.html +4 -4
  6. package/snippets/manifest.json +0 -50
  7. package/snippets/profile.html +51 -3
  8. package/src/scss/_base-css-variables.scss +432 -422
  9. package/src/scss/_core.scss +105 -105
  10. package/src/scss/_fonts.scss +0 -14
  11. package/src/scss/_variables.scss +12 -14
  12. package/src/scss/core-components/_alerts.scss +7 -7
  13. package/src/scss/core-components/_base.scss +3 -3
  14. package/src/scss/core-components/_buttons.scss +425 -425
  15. package/src/scss/core-components/_callouts.scss +139 -139
  16. package/src/scss/core-components/_cards.scss +321 -321
  17. package/src/scss/core-components/_checkbox-lists.scss +2 -2
  18. package/src/scss/core-components/_code.scss +4 -4
  19. package/src/scss/core-components/_command-palette.scss +518 -518
  20. package/src/scss/core-components/_comparison.scss +3 -3
  21. package/src/scss/core-components/_file-selector.scss +780 -780
  22. package/src/scss/core-components/_forms.scss +16 -16
  23. package/src/scss/core-components/_layout.scss +15 -15
  24. package/src/scss/core-components/_lists.scss +7 -7
  25. package/src/scss/core-components/_logic-tree.scss +280 -280
  26. package/src/scss/core-components/_modals.scss +2 -2
  27. package/src/scss/core-components/_notifications.scss +7 -7
  28. package/src/scss/core-components/_pagers.scss +3 -3
  29. package/src/scss/core-components/_popconfirm.scss +1 -1
  30. package/src/scss/core-components/_profile.scss +400 -389
  31. package/src/scss/core-components/_scrollbars.scss +40 -40
  32. package/src/scss/core-components/_settings-panel.scss +5 -5
  33. package/src/scss/core-components/_statistics.scss +6 -6
  34. package/src/scss/core-components/_tables.scss +566 -566
  35. package/src/scss/core-components/_tabs.scss +493 -493
  36. package/src/scss/core-components/_timeline.scss +15 -15
  37. package/src/scss/core-components/_toasts.scss +4 -4
  38. package/src/scss/core-components/_tooltips.scss +8 -8
  39. package/src/scss/core-components/_utilities.scss +11 -30
  40. package/src/scss/core-components/_web-components-theme.scss +294 -294
  41. package/src/scss/core-components/badges/_composite-badge-variants.scss +3 -3
  42. package/src/scss/core-components/badges/_labels.scss +1 -1
  43. package/src/scss/core-components/forms/_checkboxes-radios.scss +2 -2
  44. package/src/scss/core-components/forms/_form-inputs.scss +4 -4
  45. package/src/scss/core-components/forms/_form-layout.scss +2 -2
  46. package/src/scss/core-components/forms/_form-states.scss +1 -1
  47. package/src/scss/core-components/forms/_input-wrapper.scss +1 -1
  48. package/src/scss/core-components/forms/_query-editor.scss +17 -17
  49. package/src/scss/core-components/layout/_layout-container.scss +1 -1
  50. package/src/scss/core-components/layout/_navbar-elements.scss +1 -1
  51. package/src/scss/core-components/layout/_sidebar.scss +5 -5
  52. package/src/scss/utilities.scss +24 -0
  53. package/src/scss/variables/_base.scss +20 -10
  54. package/src/scss/variables/_colors.scss +7 -6
  55. package/src/scss/variables/_components.scss +8 -11
  56. package/src/scss/variables/_index.scss +11 -7
  57. package/src/scss/variables/_spacing.scss +12 -0
  58. package/src/scss/variables/_typography.scss +2 -2
  59. package/dist/fonts/Delivery/Delivery_W_Bd.woff2 +0 -0
  60. package/dist/fonts/Delivery/Delivery_W_BdIt.woff2 +0 -0
  61. package/dist/fonts/Delivery/Delivery_W_CdBlk.woff2 +0 -0
  62. package/dist/fonts/Delivery/Delivery_W_CdLt.woff2 +0 -0
  63. package/dist/fonts/Delivery/Delivery_W_It.woff2 +0 -0
  64. package/dist/fonts/Delivery/Delivery_W_Lt.woff2 +0 -0
  65. package/dist/fonts/Delivery/Delivery_W_LtIt.woff2 +0 -0
  66. package/dist/fonts/Delivery/Delivery_W_Rg.woff2 +0 -0
  67. package/src/scss/themes/_dark-base.scss +0 -207
  68. package/src/scss/themes/audi-light.scss +0 -341
  69. package/src/scss/themes/audi.scss +0 -303
  70. package/src/scss/themes/corporate.scss +0 -229
  71. package/src/scss/themes/dark-blue.scss +0 -165
  72. package/src/scss/themes/dark-green.scss +0 -169
  73. package/src/scss/themes/dark-red.scss +0 -173
  74. package/src/scss/themes/dark.scss +0 -158
  75. package/src/scss/themes/express.scss +0 -294
  76. package/src/scss/themes/minimal.scss +0 -134
@@ -1,389 +1,400 @@
1
- /* ========================================
2
- Profile Panel Components
3
- Profile panel and header button
4
- ======================================== */
5
- @use '../variables' as *;
6
-
7
- // CSS variable for profile panel width (allows utility class override)
8
- :root {
9
- --pa-profile-panel-width: #{$profile-panel-width};
10
- --pa-profile-panel-max-width: #{$profile-panel-max-width};
11
- }
12
-
13
- // Profile panel content width - :where() for low specificity (utility classes can override)
14
- :where(.pa-profile-panel__content) {
15
- width: var(--pa-profile-panel-width);
16
- max-width: var(--pa-profile-panel-max-width);
17
- }
18
-
19
- // ====================
20
- // Profile Panel & Header Button
21
- // ====================
22
-
23
- // Header profile button
24
- .pa-header__profile-btn {
25
- display: flex;
26
- align-items: center;
27
- background: none;
28
- border: none;
29
- padding: $spacing-xs $spacing-sm; // Match nav item padding
30
- border-radius: $border-radius;
31
- color: var(--pa-text-primary);
32
- cursor: pointer;
33
- font-size: $font-size-sm; // Apply to whole button (text and icon)
34
- transition: background-color $transition-fast $easing-snappy;
35
-
36
- &:hover {
37
- background-color: var(--pa-accent-light);
38
- }
39
-
40
- &:focus {
41
- outline: $focus-outline-width solid var(--pa-accent);
42
- outline-offset: $focus-outline-offset;
43
- }
44
- }
45
-
46
- .pa-header__profile-name {
47
- font-weight: $font-weight-medium;
48
- color: $header-profile-name-color;
49
- }
50
-
51
- // Profile panel
52
- .pa-profile-panel {
53
- position: fixed;
54
- top: 0;
55
- right: 0;
56
- height: 100vh;
57
- z-index: $z-index-profile-panel;
58
- pointer-events: none;
59
- opacity: 0;
60
- visibility: hidden;
61
- transition: opacity $transition-medium $easing-snappy,
62
- visibility $transition-medium $easing-snappy;
63
-
64
- &--open {
65
- opacity: 1;
66
- visibility: visible;
67
- pointer-events: all;
68
-
69
- .pa-profile-panel__content {
70
- transform: translateX(0);
71
- }
72
- }
73
-
74
- &__overlay {
75
- position: absolute;
76
- top: 0;
77
- left: 0;
78
- width: 100vw;
79
- height: 100vh;
80
- background-color: var(--pa-profile-overlay-bg);
81
- cursor: pointer;
82
- }
83
-
84
- &__content {
85
- position: absolute;
86
- top: 0;
87
- right: 0;
88
- height: 100vh;
89
- background-color: var(--pa-card-bg);
90
- box-shadow: $shadow-profile-panel;
91
- transform: translateX(100%);
92
- transition: transform $transition-medium $easing-snappy;
93
- display: flex;
94
- flex-direction: column;
95
- overflow: hidden;
96
- }
97
-
98
- &__header {
99
- padding: $spacing-lg;
100
- background-color: var(--pa-header-bg);
101
- border-bottom: 1px solid var(--pa-border-color);
102
- display: flex;
103
- align-items: flex-start;
104
- gap: $spacing-base;
105
- position: relative;
106
-
107
- // No-avatar variant for corporate apps without user photos
108
- &--no-avatar {
109
- .pa-profile-panel__avatar {
110
- display: none;
111
- }
112
- }
113
- }
114
-
115
- &__avatar {
116
- width: $profile-avatar-size;
117
- height: $profile-avatar-size;
118
- background-color: var(--pa-accent-light);
119
- border-radius: 50%;
120
- display: flex;
121
- align-items: center;
122
- justify-content: center;
123
- flex-shrink: 0;
124
- }
125
-
126
- &__avatar-icon {
127
- font-size: $font-size-4xl;
128
- color: var(--pa-accent);
129
- }
130
-
131
- &__info {
132
- flex: 1;
133
- min-width: 0;
134
- padding-right: $profile-close-size; // Space for close button
135
- }
136
-
137
- &__name {
138
- margin: 0 0 $spacing-xs 0;
139
- font-size: $font-size-lg;
140
- font-weight: $font-weight-semibold;
141
- color: var(--pa-text-primary);
142
- // Truncate long names
143
- overflow: hidden;
144
- text-overflow: ellipsis;
145
- white-space: nowrap;
146
- }
147
-
148
- &__email {
149
- margin: 0 0 $spacing-sm 0;
150
- font-size: $font-size-sm;
151
- color: var(--pa-text-secondary);
152
- overflow: hidden;
153
- text-overflow: ellipsis;
154
- white-space: nowrap;
155
- }
156
-
157
- &__role {
158
- display: inline-block;
159
- padding: $btn-padding-v $btn-padding-h;
160
- background-color: var(--pa-accent-light);
161
- color: var(--pa-accent);
162
- font-size: $font-size-xs;
163
- font-weight: $font-weight-medium;
164
- border-radius: $border-radius;
165
- text-transform: uppercase;
166
- letter-spacing: $profile-role-letter-spacing;
167
- }
168
-
169
- &__close {
170
- position: absolute;
171
- top: $spacing-base;
172
- right: $spacing-base;
173
- width: $profile-close-size;
174
- height: $profile-close-size;
175
- background: none;
176
- border: none;
177
- cursor: pointer;
178
- display: flex;
179
- align-items: center;
180
- justify-content: center;
181
- color: var(--pa-text-secondary);
182
- border-radius: $border-radius;
183
- transition: background-color $transition-fast $easing-snappy,
184
- color $transition-fast $easing-snappy;
185
-
186
- &:hover {
187
- background-color: var(--pa-accent-light);
188
- color: var(--pa-accent);
189
- }
190
-
191
- &:focus {
192
- outline: $focus-outline-width solid var(--pa-accent);
193
- outline-offset: $focus-outline-offset;
194
- }
195
- }
196
-
197
- &__body {
198
- flex: 1;
199
- padding: $spacing-lg 0; // Vertical only - items handle horizontal
200
- display: flex;
201
- flex-direction: column;
202
- gap: $profile-section-gap;
203
- overflow-y: auto;
204
- }
205
-
206
- &__nav {
207
- ul {
208
- list-style: none;
209
- margin: 0;
210
- padding: 0;
211
- }
212
-
213
- li {
214
- margin-bottom: $spacing-sm;
215
- }
216
- }
217
-
218
- &__nav-item {
219
- display: flex;
220
- align-items: center;
221
- gap: $sidebar-item-gap;
222
- padding: $sidebar-padding;
223
- color: var(--pa-text-primary);
224
- text-decoration: none;
225
- border-radius: $border-radius;
226
- transition: background-color $transition-fast $easing-snappy,
227
- color $transition-fast $easing-snappy;
228
- font-weight: $font-weight-medium;
229
-
230
- &:hover {
231
- background-color: var(--pa-accent-light);
232
- color: var(--pa-accent);
233
- }
234
-
235
- &:focus {
236
- outline: $focus-outline-width solid var(--pa-accent);
237
- outline-offset: $focus-outline-offset;
238
- }
239
- }
240
-
241
- &__nav-icon {
242
- font-size: $font-size-base;
243
- width: $sidebar-icon-size;
244
- height: $sidebar-icon-size;
245
- display: flex;
246
- align-items: center;
247
- justify-content: center;
248
- }
249
-
250
- &__actions {
251
- display: flex;
252
- flex-direction: column;
253
- gap: $spacing-md;
254
- margin-top: auto;
255
- padding: 0 $profile-panel-content-padding;
256
- }
257
-
258
- // Fixed footer - always visible at bottom, content scrolls above
259
- &__footer {
260
- flex-shrink: 0;
261
- padding: $spacing-lg; // Matches header padding
262
- border-top: $border-width-base solid var(--pa-border-color);
263
- background-color: var(--pa-card-bg);
264
- display: flex;
265
- flex-direction: column;
266
- gap: $spacing-md;
267
- }
268
-
269
- // Tabs section
270
- &__tabs {
271
- padding: 0 $profile-panel-content-padding;
272
- border-bottom: $border-width-base solid var(--pa-border-color);
273
- background-color: var(--pa-header-bg);
274
-
275
- .pa-tabs {
276
- border-bottom: none;
277
- margin-bottom: 0;
278
- }
279
-
280
- .pa-tabs__item {
281
- color: var(--pa-header-text-secondary);
282
- border-bottom-color: transparent;
283
-
284
- &:hover {
285
- color: var(--pa-header-text);
286
- background-color: var(--pa-accent-light);
287
- }
288
-
289
- &--active {
290
- color: var(--pa-header-text);
291
- border-bottom-color: var(--pa-accent);
292
- }
293
- }
294
- }
295
-
296
- // Favorites section
297
- &__favorites {
298
- ul {
299
- list-style: none;
300
- margin: 0;
301
- padding: 0;
302
- }
303
-
304
- li {
305
- margin-bottom: $spacing-sm;
306
- }
307
- }
308
-
309
- &__favorite-item {
310
- display: flex;
311
- align-items: center;
312
- gap: $sidebar-item-gap;
313
- padding: $sidebar-padding;
314
- color: var(--pa-text-primary);
315
- text-decoration: none;
316
- border-radius: $border-radius;
317
- cursor: pointer;
318
- transition: background-color $transition-fast $easing-snappy,
319
- color $transition-fast $easing-snappy;
320
- font-weight: $font-weight-medium;
321
-
322
- &:hover {
323
- background-color: var(--pa-accent-light);
324
- color: var(--pa-accent);
325
- }
326
-
327
- &:focus {
328
- outline: $focus-outline-width solid var(--pa-accent);
329
- outline-offset: $focus-outline-offset;
330
- }
331
- }
332
-
333
- &__favorite-icon {
334
- font-size: $font-size-base;
335
- width: $sidebar-icon-size;
336
- height: $sidebar-icon-size;
337
- display: flex;
338
- align-items: center;
339
- justify-content: center;
340
- }
341
-
342
- &__favorite-label {
343
- flex: 1;
344
- }
345
-
346
- // Favorite remove button
347
- &__favorite-remove {
348
- opacity: 0;
349
- margin-left: auto;
350
- background: none;
351
- border: none;
352
- padding: $spacing-xs;
353
- color: var(--pa-text-secondary);
354
- cursor: pointer;
355
- border-radius: $border-radius;
356
- font-size: $font-size-sm;
357
- line-height: 1;
358
- transition: opacity $transition-fast $easing-snappy,
359
- color $transition-fast $easing-snappy,
360
- background-color $transition-fast $easing-snappy;
361
-
362
- &:hover {
363
- color: var(--pa-danger);
364
- background-color: var(--pa-danger-bg-light);
365
- }
366
- }
367
-
368
- // Show remove button on favorite-item hover
369
- &__favorite-item:hover &__favorite-remove {
370
- opacity: 1;
371
- }
372
-
373
- &__favorites-add {
374
- margin-top: auto;
375
- padding: $spacing-md $profile-panel-content-padding 0;
376
- }
377
- }
378
-
379
- // Responsive adjustments
380
- @media (max-width: $mobile-breakpoint) {
381
- .pa-profile-panel__content {
382
- width: 85vw;
383
- max-width: $profile-panel-mobile-max-width;
384
- }
385
-
386
- .pa-header__profile-name {
387
- display: none;
388
- }
389
- }
1
+ /* ========================================
2
+ Profile Panel Components
3
+ Profile panel and header button
4
+ ======================================== */
5
+ @use '../variables' as *;
6
+
7
+ // Local CSS variables for profile panel (runtime state, modified by JS for resize)
8
+ :root {
9
+ --pa-local-profile-panel-width: #{$profile-panel-width};
10
+ --pa-local-profile-panel-max-width: #{$profile-panel-max-width};
11
+ }
12
+
13
+ // Profile panel content width - :where() for low specificity (utility classes can override)
14
+ :where(.pa-profile-panel__content) {
15
+ width: var(--pa-local-profile-panel-width);
16
+ max-width: var(--pa-local-profile-panel-max-width);
17
+ }
18
+
19
+ // ====================
20
+ // Profile Panel & Header Button
21
+ // ====================
22
+
23
+ // Header profile button
24
+ .pa-header__profile-btn {
25
+ display: flex;
26
+ align-items: center;
27
+ gap: $spacing-xs;
28
+ background: none;
29
+ border: none;
30
+ padding: $spacing-xs $spacing-sm; // Match nav item padding
31
+ border-radius: $border-radius;
32
+ color: var(--pa-header-text); // Use header text color, not content text color
33
+ cursor: pointer;
34
+ font-size: $font-size-sm; // Apply to whole button (text and icon)
35
+ transition: background-color $transition-fast $easing-snappy;
36
+
37
+ &:hover {
38
+ background-color: var(--pa-accent-light);
39
+ }
40
+
41
+ &:focus {
42
+ outline: $focus-outline-width solid var(--pa-accent);
43
+ outline-offset: $focus-outline-offset;
44
+ }
45
+ }
46
+
47
+ .pa-header__profile-name {
48
+ font-weight: $font-weight-medium;
49
+ color: var(--pa-header-profile-name-color); // Use CSS variable for theme control
50
+ }
51
+
52
+ // Profile panel
53
+ .pa-profile-panel {
54
+ position: fixed;
55
+ top: 0;
56
+ right: 0;
57
+ height: 100vh;
58
+ z-index: $z-index-profile-panel;
59
+ pointer-events: none;
60
+ opacity: 0;
61
+ visibility: hidden;
62
+ transition: opacity $transition-medium $easing-snappy,
63
+ visibility $transition-medium $easing-snappy;
64
+
65
+ &--open {
66
+ opacity: 1;
67
+ visibility: visible;
68
+ pointer-events: all;
69
+
70
+ .pa-profile-panel__content {
71
+ transform: translateX(0);
72
+ }
73
+ }
74
+
75
+ &__overlay {
76
+ position: absolute;
77
+ top: 0;
78
+ left: 0;
79
+ width: 100vw;
80
+ height: 100vh;
81
+ background-color: var(--pa-profile-overlay-bg);
82
+ cursor: pointer;
83
+ }
84
+
85
+ &__content {
86
+ position: absolute;
87
+ top: 0;
88
+ right: 0;
89
+ height: 100vh;
90
+ background-color: var(--pa-card-bg);
91
+ box-shadow: $shadow-profile-panel;
92
+ transform: translateX(100%);
93
+ transition: transform $transition-medium $easing-snappy;
94
+ display: flex;
95
+ flex-direction: column;
96
+ overflow: hidden;
97
+ }
98
+
99
+ &__header {
100
+ padding: $spacing-lg;
101
+ background-color: var(--pa-header-bg);
102
+ border-bottom: 1px solid var(--pa-border-color);
103
+ display: flex;
104
+ align-items: flex-start;
105
+ gap: $spacing-base;
106
+ position: relative;
107
+
108
+ // No-avatar variant for corporate apps without user photos
109
+ &--no-avatar {
110
+ .pa-profile-panel__avatar {
111
+ display: none;
112
+ }
113
+ }
114
+ }
115
+
116
+ &__avatar {
117
+ width: $profile-avatar-size;
118
+ height: $profile-avatar-size;
119
+ background-color: var(--pa-accent-light);
120
+ border-radius: 50%;
121
+ display: flex;
122
+ align-items: center;
123
+ justify-content: center;
124
+ flex-shrink: 0;
125
+ }
126
+
127
+ &__avatar-icon {
128
+ font-size: $font-size-4xl;
129
+ color: var(--pa-accent);
130
+ }
131
+
132
+ &__info {
133
+ flex: 1;
134
+ min-width: 0;
135
+ padding-right: $profile-close-size; // Space for close button
136
+ }
137
+
138
+ &__name {
139
+ margin: 0 0 $spacing-xs 0;
140
+ font-size: $font-size-lg;
141
+ font-weight: $font-weight-semibold;
142
+ color: var(--pa-text-color-1);
143
+ // Truncate long names
144
+ overflow: hidden;
145
+ text-overflow: ellipsis;
146
+ white-space: nowrap;
147
+ }
148
+
149
+ &__email {
150
+ margin: 0 0 $spacing-sm 0;
151
+ font-size: $font-size-sm;
152
+ color: var(--pa-text-color-2);
153
+ overflow: hidden;
154
+ text-overflow: ellipsis;
155
+ white-space: nowrap;
156
+ }
157
+
158
+ &__role {
159
+ display: inline-block;
160
+ padding: $btn-padding-v $btn-padding-h;
161
+ background-color: var(--pa-accent-light);
162
+ color: var(--pa-accent);
163
+ font-size: $font-size-xs;
164
+ font-weight: $font-weight-medium;
165
+ border-radius: $border-radius;
166
+ text-transform: uppercase;
167
+ letter-spacing: $profile-role-letter-spacing;
168
+ }
169
+
170
+ &__close {
171
+ position: absolute;
172
+ top: $spacing-base;
173
+ right: $spacing-base;
174
+ width: $profile-close-size;
175
+ height: $profile-close-size;
176
+ background: none;
177
+ border: none;
178
+ cursor: pointer;
179
+ display: flex;
180
+ align-items: center;
181
+ justify-content: center;
182
+ color: var(--pa-text-color-2);
183
+ border-radius: $border-radius;
184
+ transition: background-color $transition-fast $easing-snappy,
185
+ color $transition-fast $easing-snappy;
186
+
187
+ &:hover {
188
+ background-color: var(--pa-accent-light);
189
+ color: var(--pa-accent);
190
+ }
191
+
192
+ &:focus {
193
+ outline: $focus-outline-width solid var(--pa-accent);
194
+ outline-offset: $focus-outline-offset;
195
+ }
196
+ }
197
+
198
+ &__body {
199
+ flex: 1;
200
+ padding: $spacing-lg 0; // Vertical only - items handle horizontal
201
+ display: flex;
202
+ flex-direction: column;
203
+ gap: $profile-section-gap;
204
+ overflow-y: auto;
205
+ }
206
+
207
+ &__nav {
208
+ ul {
209
+ list-style: none;
210
+ margin: 0;
211
+ padding: 0;
212
+ }
213
+
214
+ li {
215
+ margin-bottom: $spacing-sm;
216
+ }
217
+ }
218
+
219
+ &__nav-item {
220
+ display: flex;
221
+ align-items: center;
222
+ gap: $sidebar-item-gap;
223
+ padding: $sidebar-padding;
224
+ color: var(--pa-text-color-1);
225
+ text-decoration: none;
226
+ border-radius: $border-radius;
227
+ transition: background-color $transition-fast $easing-snappy,
228
+ color $transition-fast $easing-snappy;
229
+ font-weight: $font-weight-medium;
230
+
231
+ &:hover {
232
+ background-color: var(--pa-accent-light);
233
+ color: var(--pa-accent);
234
+ }
235
+
236
+ &:focus {
237
+ outline: $focus-outline-width solid var(--pa-accent);
238
+ outline-offset: $focus-outline-offset;
239
+ }
240
+ }
241
+
242
+ &__nav-icon {
243
+ font-size: $font-size-base;
244
+ width: $sidebar-icon-size;
245
+ height: $sidebar-icon-size;
246
+ display: flex;
247
+ align-items: center;
248
+ justify-content: center;
249
+ }
250
+
251
+ &__actions {
252
+ display: flex;
253
+ flex-direction: column;
254
+ gap: $spacing-md;
255
+ margin-top: auto;
256
+ padding: 0 $profile-panel-content-padding;
257
+ }
258
+
259
+ // Fixed footer - always visible at bottom, content scrolls above
260
+ &__footer {
261
+ flex-shrink: 0;
262
+ padding: $spacing-lg; // Matches header padding
263
+ border-top: $border-width-base solid var(--pa-border-color);
264
+ background-color: var(--pa-card-bg);
265
+ display: flex;
266
+ flex-direction: column;
267
+ gap: $spacing-md;
268
+ }
269
+
270
+ // Tabs section
271
+ &__tabs {
272
+ padding: 0 $profile-panel-content-padding;
273
+ border-bottom: $border-width-base solid var(--pa-border-color);
274
+ background-color: var(--pa-header-bg);
275
+
276
+ .pa-tabs {
277
+ border-bottom: none;
278
+ margin-bottom: 0;
279
+ }
280
+
281
+ .pa-tabs__item {
282
+ color: var(--pa-header-text-secondary);
283
+ border-bottom-color: transparent;
284
+
285
+ &:hover {
286
+ color: var(--pa-header-text);
287
+ background-color: var(--pa-accent-light);
288
+ }
289
+
290
+ &--active {
291
+ color: var(--pa-header-text);
292
+ border-bottom-color: var(--pa-accent);
293
+ }
294
+ }
295
+
296
+ // Icon-only tabs modifier - hides text labels
297
+ &--icon-only .pa-profile-panel__tab-text {
298
+ display: none;
299
+ }
300
+ }
301
+
302
+ // Tab text element (for icon-only toggle)
303
+ &__tab-text {
304
+ // Default: visible
305
+ }
306
+
307
+ // Favorites section
308
+ &__favorites {
309
+ ul {
310
+ list-style: none;
311
+ margin: 0;
312
+ padding: 0;
313
+ }
314
+
315
+ li {
316
+ margin-bottom: $spacing-sm;
317
+ }
318
+ }
319
+
320
+ &__favorite-item {
321
+ display: flex;
322
+ align-items: center;
323
+ gap: $sidebar-item-gap;
324
+ padding: $sidebar-padding;
325
+ color: var(--pa-text-color-1);
326
+ text-decoration: none;
327
+ border-radius: $border-radius;
328
+ cursor: pointer;
329
+ transition: background-color $transition-fast $easing-snappy,
330
+ color $transition-fast $easing-snappy;
331
+ font-weight: $font-weight-medium;
332
+
333
+ &:hover {
334
+ background-color: var(--pa-accent-light);
335
+ color: var(--pa-accent);
336
+ }
337
+
338
+ &:focus {
339
+ outline: $focus-outline-width solid var(--pa-accent);
340
+ outline-offset: $focus-outline-offset;
341
+ }
342
+ }
343
+
344
+ &__favorite-icon {
345
+ font-size: $font-size-base;
346
+ width: $sidebar-icon-size;
347
+ height: $sidebar-icon-size;
348
+ display: flex;
349
+ align-items: center;
350
+ justify-content: center;
351
+ }
352
+
353
+ &__favorite-label {
354
+ flex: 1;
355
+ }
356
+
357
+ // Favorite remove button
358
+ &__favorite-remove {
359
+ opacity: 0;
360
+ margin-left: auto;
361
+ background: none;
362
+ border: none;
363
+ padding: $spacing-xs;
364
+ color: var(--pa-text-color-2);
365
+ cursor: pointer;
366
+ border-radius: $border-radius;
367
+ font-size: $font-size-sm;
368
+ line-height: 1;
369
+ transition: opacity $transition-fast $easing-snappy,
370
+ color $transition-fast $easing-snappy,
371
+ background-color $transition-fast $easing-snappy;
372
+
373
+ &:hover {
374
+ color: var(--pa-danger-bg);
375
+ background-color: var(--pa-danger-bg-light);
376
+ }
377
+ }
378
+
379
+ // Show remove button on favorite-item hover
380
+ &__favorite-item:hover &__favorite-remove {
381
+ opacity: 1;
382
+ }
383
+
384
+ &__favorites-add {
385
+ margin-top: auto;
386
+ padding: $spacing-md $profile-panel-content-padding 0;
387
+ }
388
+ }
389
+
390
+ // Responsive adjustments
391
+ @media (max-width: $mobile-breakpoint) {
392
+ .pa-profile-panel__content {
393
+ width: 85vw;
394
+ max-width: $profile-panel-mobile-max-width;
395
+ }
396
+
397
+ .pa-header__profile-name {
398
+ display: none;
399
+ }
400
+ }