@keenmate/pure-admin-core 2.3.1 → 2.3.3

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