@keenmate/pure-admin-core 1.0.0-rc01 → 1.0.0-rc02
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.
- package/README.md +59 -22
- package/dist/css/main.css +178 -88
- package/package.json +1 -1
- package/snippets/profile.html +169 -7
- package/src/scss/_base-css-variables.scss +63 -3
- package/src/scss/_core.scss +3 -0
- package/src/scss/core-components/_cards.scss +2 -2
- package/src/scss/core-components/_profile.scss +112 -40
- package/src/scss/core-components/_scrollbars.scss +41 -0
- package/src/scss/core-components/_statistics.scss +3 -3
- package/src/scss/core-components/_tabs.scss +2 -2
- package/src/scss/variables/_base.scss +185 -61
- package/src/scss/variables/_colors.scss +162 -108
- package/src/scss/variables/_components.scss +7 -6
- package/src/scss/variables/_index.scss +9 -3
- package/src/scss/variables/_layout.scss +2 -2
package/snippets/profile.html
CHANGED
|
@@ -8,15 +8,15 @@
|
|
|
8
8
|
================================ -->
|
|
9
9
|
|
|
10
10
|
<!-- Profile Button (goes in header/navbar) -->
|
|
11
|
-
<button class="pa-
|
|
11
|
+
<button class="pa-header__profile-btn" onclick="toggleProfilePanel()" aria-label="User Profile">
|
|
12
12
|
<span class="pa-btn__icon">👤</span>
|
|
13
|
-
<span class="pa-
|
|
13
|
+
<span class="pa-header__profile-name">John Doe</span>
|
|
14
14
|
</button>
|
|
15
15
|
|
|
16
16
|
<!-- Profile Button with Font Awesome -->
|
|
17
|
-
<button class="pa-
|
|
17
|
+
<button class="pa-header__profile-btn" onclick="toggleProfilePanel()" aria-label="User Profile">
|
|
18
18
|
<span class="pa-btn__icon"><i class="fa-solid fa-user"></i></span>
|
|
19
|
-
<span class="pa-
|
|
19
|
+
<span class="pa-header__profile-name">John Doe</span>
|
|
20
20
|
</button>
|
|
21
21
|
|
|
22
22
|
|
|
@@ -81,6 +81,115 @@
|
|
|
81
81
|
</div>
|
|
82
82
|
|
|
83
83
|
|
|
84
|
+
<!-- ================================
|
|
85
|
+
PROFILE PANEL - WITH TABS (PROFILE + FAVORITES)
|
|
86
|
+
================================ -->
|
|
87
|
+
|
|
88
|
+
<div class="pa-profile-panel" id="profilePanel">
|
|
89
|
+
<div class="pa-profile-panel__overlay" onclick="closeProfilePanel()"></div>
|
|
90
|
+
<div class="pa-profile-panel__content">
|
|
91
|
+
<div class="pa-profile-panel__header">
|
|
92
|
+
<div class="pa-profile-panel__avatar">
|
|
93
|
+
<span class="pa-profile-panel__avatar-icon">👤</span>
|
|
94
|
+
</div>
|
|
95
|
+
<div class="pa-profile-panel__info">
|
|
96
|
+
<h3 class="pa-profile-panel__name">John Doe</h3>
|
|
97
|
+
<p class="pa-profile-panel__email">john.doe@company.com</p>
|
|
98
|
+
<span class="pa-profile-panel__role">Administrator</span>
|
|
99
|
+
</div>
|
|
100
|
+
<button class="pa-profile-panel__close" onclick="closeProfilePanel()" aria-label="Close Profile">
|
|
101
|
+
✕
|
|
102
|
+
</button>
|
|
103
|
+
</div>
|
|
104
|
+
|
|
105
|
+
<!-- Profile Panel Tabs -->
|
|
106
|
+
<div class="pa-profile-panel__tabs">
|
|
107
|
+
<div class="pa-tabs pa-tabs--full">
|
|
108
|
+
<button class="pa-tabs__item pa-tabs__item--active" data-profile-tab="profile">
|
|
109
|
+
<span>👤</span> Profile
|
|
110
|
+
</button>
|
|
111
|
+
<button class="pa-tabs__item" data-profile-tab="favorites">
|
|
112
|
+
<span>⭐</span> Favorites
|
|
113
|
+
</button>
|
|
114
|
+
</div>
|
|
115
|
+
</div>
|
|
116
|
+
|
|
117
|
+
<div class="pa-profile-panel__body">
|
|
118
|
+
<!-- Profile Tab -->
|
|
119
|
+
<div class="pa-tabs__panel pa-tabs__panel--active" data-profile-panel="profile">
|
|
120
|
+
<nav class="pa-profile-panel__nav">
|
|
121
|
+
<ul>
|
|
122
|
+
<li><a href="#profile" class="pa-profile-panel__nav-item">
|
|
123
|
+
<span class="pa-profile-panel__nav-icon">👤</span>
|
|
124
|
+
Profile Settings
|
|
125
|
+
</a></li>
|
|
126
|
+
<li><a href="#security" class="pa-profile-panel__nav-item">
|
|
127
|
+
<span class="pa-profile-panel__nav-icon">🔒</span>
|
|
128
|
+
Security
|
|
129
|
+
</a></li>
|
|
130
|
+
<li><a href="#notifications" class="pa-profile-panel__nav-item">
|
|
131
|
+
<span class="pa-profile-panel__nav-icon">🔔</span>
|
|
132
|
+
Notifications
|
|
133
|
+
</a></li>
|
|
134
|
+
<li><a href="#preferences" class="pa-profile-panel__nav-item">
|
|
135
|
+
<span class="pa-profile-panel__nav-icon">⚙️</span>
|
|
136
|
+
Preferences
|
|
137
|
+
</a></li>
|
|
138
|
+
<li><a href="#help" class="pa-profile-panel__nav-item">
|
|
139
|
+
<span class="pa-profile-panel__nav-icon">❓</span>
|
|
140
|
+
Help & Support
|
|
141
|
+
</a></li>
|
|
142
|
+
</ul>
|
|
143
|
+
</nav>
|
|
144
|
+
|
|
145
|
+
<div class="pa-profile-panel__actions">
|
|
146
|
+
<button class="pa-btn pa-btn--secondary pa-btn--block">
|
|
147
|
+
Switch Account
|
|
148
|
+
</button>
|
|
149
|
+
<button class="pa-btn pa-btn--danger pa-btn--block">
|
|
150
|
+
Sign Out
|
|
151
|
+
</button>
|
|
152
|
+
</div>
|
|
153
|
+
</div>
|
|
154
|
+
|
|
155
|
+
<!-- Favorites Tab -->
|
|
156
|
+
<div class="pa-tabs__panel" data-profile-panel="favorites">
|
|
157
|
+
<div class="pa-profile-panel__favorites">
|
|
158
|
+
<ul>
|
|
159
|
+
<li>
|
|
160
|
+
<div class="pa-profile-panel__favorite-item" data-href="/dashboard">
|
|
161
|
+
<span class="pa-profile-panel__favorite-icon">📊</span>
|
|
162
|
+
<span class="pa-profile-panel__favorite-label">Dashboard</span>
|
|
163
|
+
<button class="pa-profile-panel__favorite-remove" title="Remove from favorites">✕</button>
|
|
164
|
+
</div>
|
|
165
|
+
</li>
|
|
166
|
+
<li>
|
|
167
|
+
<div class="pa-profile-panel__favorite-item" data-href="/reports">
|
|
168
|
+
<span class="pa-profile-panel__favorite-icon">📝</span>
|
|
169
|
+
<span class="pa-profile-panel__favorite-label">Reports</span>
|
|
170
|
+
<button class="pa-profile-panel__favorite-remove" title="Remove from favorites">✕</button>
|
|
171
|
+
</div>
|
|
172
|
+
</li>
|
|
173
|
+
<li>
|
|
174
|
+
<div class="pa-profile-panel__favorite-item" data-href="/settings">
|
|
175
|
+
<span class="pa-profile-panel__favorite-icon">⚙️</span>
|
|
176
|
+
<span class="pa-profile-panel__favorite-label">Settings</span>
|
|
177
|
+
<button class="pa-profile-panel__favorite-remove" title="Remove from favorites">✕</button>
|
|
178
|
+
</div>
|
|
179
|
+
</li>
|
|
180
|
+
</ul>
|
|
181
|
+
</div>
|
|
182
|
+
<div class="pa-profile-panel__favorites-add">
|
|
183
|
+
<button class="pa-btn pa-btn--sm pa-btn--outline-secondary pa-btn--block">
|
|
184
|
+
+ Add Current Page
|
|
185
|
+
</button>
|
|
186
|
+
</div>
|
|
187
|
+
</div>
|
|
188
|
+
</div>
|
|
189
|
+
</div>
|
|
190
|
+
</div>
|
|
191
|
+
|
|
192
|
+
|
|
84
193
|
<!-- ================================
|
|
85
194
|
PROFILE PANEL - WITH FONT AWESOME
|
|
86
195
|
================================ -->
|
|
@@ -206,7 +315,7 @@ function closeProfilePanel() {
|
|
|
206
315
|
*/
|
|
207
316
|
document.addEventListener('click', (e) => {
|
|
208
317
|
const profilePanel = document.getElementById('profilePanel');
|
|
209
|
-
const profileBtn = document.querySelector('.pa-
|
|
318
|
+
const profileBtn = document.querySelector('.pa-header__profile-btn');
|
|
210
319
|
|
|
211
320
|
if (!profilePanel || !profileBtn) return;
|
|
212
321
|
|
|
@@ -215,6 +324,43 @@ document.addEventListener('click', (e) => {
|
|
|
215
324
|
closeProfilePanel();
|
|
216
325
|
}
|
|
217
326
|
});
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* Profile panel tab switching
|
|
330
|
+
*/
|
|
331
|
+
document.querySelectorAll('[data-profile-tab]').forEach(tab => {
|
|
332
|
+
tab.addEventListener('click', () => {
|
|
333
|
+
const tabId = tab.dataset.profileTab;
|
|
334
|
+
// Update active tab
|
|
335
|
+
document.querySelectorAll('[data-profile-tab]').forEach(t =>
|
|
336
|
+
t.classList.toggle('pa-tabs__item--active', t.dataset.profileTab === tabId));
|
|
337
|
+
// Update active panel
|
|
338
|
+
document.querySelectorAll('[data-profile-panel]').forEach(p =>
|
|
339
|
+
p.classList.toggle('pa-tabs__panel--active', p.dataset.profilePanel === tabId));
|
|
340
|
+
});
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Favorite item click - navigate using data-href
|
|
345
|
+
*/
|
|
346
|
+
document.querySelectorAll('.pa-profile-panel__favorite-item').forEach(item => {
|
|
347
|
+
item.addEventListener('click', (e) => {
|
|
348
|
+
// Skip if clicking the remove button
|
|
349
|
+
if (e.target.closest('.pa-profile-panel__favorite-remove')) return;
|
|
350
|
+
const href = item.dataset.href;
|
|
351
|
+
if (href) window.location.href = href;
|
|
352
|
+
});
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* Favorite remove button - remove item from list
|
|
357
|
+
*/
|
|
358
|
+
document.querySelectorAll('.pa-profile-panel__favorite-remove').forEach(btn => {
|
|
359
|
+
btn.addEventListener('click', (e) => {
|
|
360
|
+
e.stopPropagation();
|
|
361
|
+
btn.closest('li').remove();
|
|
362
|
+
});
|
|
363
|
+
});
|
|
218
364
|
</script>
|
|
219
365
|
|
|
220
366
|
|
|
@@ -224,9 +370,9 @@ document.addEventListener('click', (e) => {
|
|
|
224
370
|
|
|
225
371
|
<!--
|
|
226
372
|
PROFILE BUTTON (HEADER):
|
|
227
|
-
- .pa-
|
|
373
|
+
- .pa-header__profile-btn - Profile button in header
|
|
228
374
|
- .pa-btn__icon - Icon container
|
|
229
|
-
- .pa-
|
|
375
|
+
- .pa-header__profile-name - User name text
|
|
230
376
|
|
|
231
377
|
PROFILE PANEL STRUCTURE:
|
|
232
378
|
- .pa-profile-panel - Main panel container
|
|
@@ -245,6 +391,12 @@ PANEL HEADER:
|
|
|
245
391
|
- .pa-profile-panel__role - User role badge
|
|
246
392
|
- .pa-profile-panel__close - Close button
|
|
247
393
|
|
|
394
|
+
PANEL TABS (optional):
|
|
395
|
+
- .pa-profile-panel__tabs - Tabs container
|
|
396
|
+
- .pa-tabs.pa-tabs--full - Full-width tabs
|
|
397
|
+
- [data-profile-tab] - Tab button attribute
|
|
398
|
+
- [data-profile-panel] - Tab panel attribute
|
|
399
|
+
|
|
248
400
|
PANEL BODY:
|
|
249
401
|
- .pa-profile-panel__body - Body container
|
|
250
402
|
- .pa-profile-panel__nav - Navigation menu
|
|
@@ -252,10 +404,20 @@ PANEL BODY:
|
|
|
252
404
|
- .pa-profile-panel__nav-icon - Navigation icon
|
|
253
405
|
- .pa-profile-panel__actions - Action buttons container
|
|
254
406
|
|
|
407
|
+
FAVORITES SECTION:
|
|
408
|
+
- .pa-profile-panel__favorites - Favorites container
|
|
409
|
+
- .pa-profile-panel__favorite-item - Favorite link (use div with data-href)
|
|
410
|
+
- .pa-profile-panel__favorite-icon - Favorite icon
|
|
411
|
+
- .pa-profile-panel__favorite-label - Favorite text label
|
|
412
|
+
- .pa-profile-panel__favorite-remove - Remove button (appears on hover)
|
|
413
|
+
- .pa-profile-panel__favorites-add - Add button container
|
|
414
|
+
|
|
255
415
|
JAVASCRIPT FUNCTIONS:
|
|
256
416
|
- toggleProfilePanel() - Toggle panel open/closed
|
|
257
417
|
- closeProfilePanel() - Close panel
|
|
258
418
|
- Auto-closes when clicking outside
|
|
419
|
+
- Tab switching via data-profile-tab/data-profile-panel attributes
|
|
420
|
+
- Favorite navigation via data-href attribute
|
|
259
421
|
|
|
260
422
|
PLACEMENT:
|
|
261
423
|
- Profile button goes in header/navbar
|
|
@@ -15,19 +15,31 @@
|
|
|
15
15
|
// ============================================================================
|
|
16
16
|
|
|
17
17
|
@mixin output-base-css-variables {
|
|
18
|
-
// === Colors ===
|
|
18
|
+
// === Accent Colors ===
|
|
19
19
|
--base-accent-color: #{$base-accent-color};
|
|
20
20
|
--base-accent-color-hover: #{$base-accent-color-hover};
|
|
21
21
|
--base-accent-color-active: #{$base-accent-color-active};
|
|
22
22
|
--base-accent-color-light: #{$base-accent-color-light};
|
|
23
23
|
--base-accent-color-light-hover: #{$base-accent-color-light-hover};
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
|
|
25
|
+
// === Text Colors ===
|
|
26
26
|
--base-text-color-1: #{$base-text-color-1};
|
|
27
27
|
--base-text-color-2: #{$base-text-color-2};
|
|
28
28
|
--base-text-color-3: #{$base-text-color-3};
|
|
29
29
|
--base-text-color-4: #{$base-text-color-4};
|
|
30
30
|
--base-text-color-on-accent: #{$base-text-color-on-accent};
|
|
31
|
+
|
|
32
|
+
// === Surface Colors ===
|
|
33
|
+
--base-surface-1: #{$base-surface-1};
|
|
34
|
+
--base-surface-2: #{$base-surface-2};
|
|
35
|
+
--base-surface-3: #{$base-surface-3};
|
|
36
|
+
--base-surface-inverse: #{$base-surface-inverse};
|
|
37
|
+
--base-overlay-bg: #{$base-overlay-bg};
|
|
38
|
+
--base-shadow-color: #{$base-shadow-color};
|
|
39
|
+
--base-primary-bg: #{$base-primary-bg};
|
|
40
|
+
--base-primary-bg-hover: #{$base-primary-bg-hover};
|
|
41
|
+
|
|
42
|
+
// === Border Colors ===
|
|
31
43
|
--base-border-color: #{$base-border-color};
|
|
32
44
|
--base-border: #{$base-border};
|
|
33
45
|
|
|
@@ -56,8 +68,55 @@
|
|
|
56
68
|
--base-tooltip-bg: #{$base-tooltip-bg};
|
|
57
69
|
--base-tooltip-text-color: #{$base-tooltip-text-color};
|
|
58
70
|
|
|
71
|
+
// === Contextual Colors - Success ===
|
|
72
|
+
--base-success-color: #{$base-success-color};
|
|
73
|
+
--base-success-color-hover: #{$base-success-color-hover};
|
|
74
|
+
--base-success-bg-light: #{$base-success-bg-light};
|
|
75
|
+
--base-success-bg-subtle: #{$base-success-bg-subtle};
|
|
76
|
+
--base-success-border: #{$base-success-border};
|
|
77
|
+
--base-success-text: #{$base-success-text};
|
|
78
|
+
--base-success-text-light: #{$base-success-text-light};
|
|
79
|
+
--base-text-on-success: #{$base-text-on-success};
|
|
80
|
+
|
|
81
|
+
// === Contextual Colors - Danger ===
|
|
82
|
+
--base-danger-color: #{$base-danger-color};
|
|
83
|
+
--base-danger-color-hover: #{$base-danger-color-hover};
|
|
84
|
+
--base-danger-bg-light: #{$base-danger-bg-light};
|
|
85
|
+
--base-danger-bg-subtle: #{$base-danger-bg-subtle};
|
|
86
|
+
--base-danger-border: #{$base-danger-border};
|
|
87
|
+
--base-danger-text: #{$base-danger-text};
|
|
88
|
+
--base-danger-text-light: #{$base-danger-text-light};
|
|
89
|
+
--base-text-on-danger: #{$base-text-on-danger};
|
|
90
|
+
|
|
91
|
+
// === Contextual Colors - Warning ===
|
|
92
|
+
--base-warning-color: #{$base-warning-color};
|
|
93
|
+
--base-warning-color-hover: #{$base-warning-color-hover};
|
|
94
|
+
--base-warning-bg-light: #{$base-warning-bg-light};
|
|
95
|
+
--base-warning-bg-subtle: #{$base-warning-bg-subtle};
|
|
96
|
+
--base-warning-border: #{$base-warning-border};
|
|
97
|
+
--base-warning-text: #{$base-warning-text};
|
|
98
|
+
--base-warning-text-light: #{$base-warning-text-light};
|
|
99
|
+
--base-text-on-warning: #{$base-text-on-warning};
|
|
100
|
+
|
|
101
|
+
// === Contextual Colors - Info ===
|
|
102
|
+
--base-info-color: #{$base-info-color};
|
|
103
|
+
--base-info-color-hover: #{$base-info-color-hover};
|
|
104
|
+
--base-info-bg-light: #{$base-info-bg-light};
|
|
105
|
+
--base-info-bg-subtle: #{$base-info-bg-subtle};
|
|
106
|
+
--base-info-border: #{$base-info-border};
|
|
107
|
+
--base-info-text: #{$base-info-text};
|
|
108
|
+
--base-info-text-light: #{$base-info-text-light};
|
|
109
|
+
--base-text-on-info: #{$base-text-on-info};
|
|
110
|
+
|
|
111
|
+
// === Interactive States ===
|
|
112
|
+
--base-hover-overlay: #{$base-hover-overlay};
|
|
113
|
+
--base-active-overlay: #{$base-active-overlay};
|
|
114
|
+
--base-focus-ring-color: #{$base-focus-ring-color};
|
|
115
|
+
--base-focus-ring-width: #{$base-focus-ring-width};
|
|
116
|
+
|
|
59
117
|
// === Typography ===
|
|
60
118
|
--base-font-family: #{$base-font-family};
|
|
119
|
+
--base-font-family-mono: #{$base-font-family-mono};
|
|
61
120
|
--base-font-size-2xs: #{$base-font-size-2xs};
|
|
62
121
|
--base-font-size-xs: #{$base-font-size-xs};
|
|
63
122
|
--base-font-size-sm: #{$base-font-size-sm};
|
|
@@ -68,6 +127,7 @@
|
|
|
68
127
|
--base-font-weight-normal: #{$base-font-weight-normal};
|
|
69
128
|
--base-font-weight-medium: #{$base-font-weight-medium};
|
|
70
129
|
--base-font-weight-semibold: #{$base-font-weight-semibold};
|
|
130
|
+
--base-font-weight-bold: #{$base-font-weight-bold};
|
|
71
131
|
--base-line-height-tight: #{$base-line-height-tight};
|
|
72
132
|
--base-line-height-normal: #{$base-line-height-normal};
|
|
73
133
|
--base-line-height-relaxed: #{$base-line-height-relaxed};
|
package/src/scss/_core.scss
CHANGED
|
@@ -83,12 +83,12 @@
|
|
|
83
83
|
color: var(--pa-text-primary);
|
|
84
84
|
font-size: $font-size-base;
|
|
85
85
|
font-weight: $font-weight-semibold;
|
|
86
|
+
line-height: 1;
|
|
86
87
|
}
|
|
87
88
|
}
|
|
88
89
|
|
|
89
90
|
&__body {
|
|
90
|
-
padding: $card-body-padding $card-body-padding
|
|
91
|
-
$card-body-padding;
|
|
91
|
+
padding: $card-body-padding-v $card-body-padding-h;
|
|
92
92
|
flex: 1;
|
|
93
93
|
|
|
94
94
|
// Remove top margin from first child to avoid double spacing with padding
|
|
@@ -196,8 +196,8 @@
|
|
|
196
196
|
&__nav-item {
|
|
197
197
|
display: flex;
|
|
198
198
|
align-items: center;
|
|
199
|
-
gap: $
|
|
200
|
-
padding: $
|
|
199
|
+
gap: $sidebar-item-gap;
|
|
200
|
+
padding: $sidebar-padding;
|
|
201
201
|
color: var(--pa-text-primary);
|
|
202
202
|
text-decoration: none;
|
|
203
203
|
border-radius: $border-radius;
|
|
@@ -217,8 +217,8 @@
|
|
|
217
217
|
}
|
|
218
218
|
|
|
219
219
|
&__nav-icon {
|
|
220
|
-
font-size: $font-size-
|
|
221
|
-
width: $
|
|
220
|
+
font-size: $font-size-base;
|
|
221
|
+
width: $sidebar-icon-size;
|
|
222
222
|
text-align: center;
|
|
223
223
|
}
|
|
224
224
|
|
|
@@ -228,54 +228,126 @@
|
|
|
228
228
|
gap: $spacing-md;
|
|
229
229
|
margin-top: auto;
|
|
230
230
|
}
|
|
231
|
-
}
|
|
232
231
|
|
|
233
|
-
//
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
232
|
+
// Tabs section
|
|
233
|
+
&__tabs {
|
|
234
|
+
padding: 0 $spacing-lg;
|
|
235
|
+
border-bottom: $border-width-base solid var(--pa-border-color);
|
|
236
|
+
background-color: var(--pa-header-bg);
|
|
237
|
+
|
|
238
|
+
.pa-tabs {
|
|
239
|
+
border-bottom: none;
|
|
240
|
+
margin-bottom: 0;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
.pa-tabs__item {
|
|
244
|
+
color: var(--pa-header-text-secondary);
|
|
245
|
+
border-bottom-color: transparent;
|
|
246
|
+
|
|
247
|
+
&:hover {
|
|
248
|
+
color: var(--pa-header-text);
|
|
249
|
+
background-color: rgba(255, 255, 255, 0.1);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
&--active {
|
|
253
|
+
color: var(--pa-header-text);
|
|
254
|
+
border-bottom-color: var(--pa-accent);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
238
257
|
}
|
|
239
258
|
|
|
240
|
-
|
|
241
|
-
|
|
259
|
+
// Favorites section
|
|
260
|
+
&__favorites {
|
|
261
|
+
display: flex;
|
|
262
|
+
flex-direction: column;
|
|
263
|
+
gap: $spacing-sm;
|
|
264
|
+
|
|
265
|
+
ul {
|
|
266
|
+
list-style: none;
|
|
267
|
+
margin: 0;
|
|
268
|
+
padding: 0;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
li {
|
|
272
|
+
margin-bottom: $spacing-sm;
|
|
273
|
+
}
|
|
242
274
|
}
|
|
243
|
-
}
|
|
244
275
|
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
276
|
+
&__favorite-item {
|
|
277
|
+
display: flex;
|
|
278
|
+
align-items: center;
|
|
279
|
+
gap: $sidebar-item-gap;
|
|
280
|
+
padding: $sidebar-padding;
|
|
281
|
+
color: var(--pa-text-primary);
|
|
282
|
+
text-decoration: none;
|
|
283
|
+
border-radius: $border-radius;
|
|
284
|
+
cursor: pointer;
|
|
285
|
+
transition: background-color $transition-fast $easing-snappy,
|
|
286
|
+
color $transition-fast $easing-snappy;
|
|
287
|
+
font-weight: $font-weight-medium;
|
|
251
288
|
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
}
|
|
289
|
+
&:hover {
|
|
290
|
+
background-color: var(--pa-accent-light);
|
|
291
|
+
color: var(--pa-accent);
|
|
292
|
+
}
|
|
256
293
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
294
|
+
&:focus {
|
|
295
|
+
outline: $focus-outline-width solid var(--pa-accent);
|
|
296
|
+
outline-offset: $focus-outline-offset;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
261
299
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
300
|
+
&__favorite-icon {
|
|
301
|
+
font-size: $font-size-base;
|
|
302
|
+
width: $sidebar-icon-size;
|
|
303
|
+
text-align: center;
|
|
265
304
|
}
|
|
266
305
|
|
|
267
|
-
|
|
268
|
-
|
|
306
|
+
&__favorite-label {
|
|
307
|
+
flex: 1;
|
|
269
308
|
}
|
|
270
|
-
}
|
|
271
309
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
310
|
+
// Favorite remove button
|
|
311
|
+
&__favorite-remove {
|
|
312
|
+
opacity: 0;
|
|
313
|
+
margin-left: auto;
|
|
314
|
+
background: none;
|
|
315
|
+
border: none;
|
|
316
|
+
padding: $spacing-sm;
|
|
317
|
+
color: var(--pa-text-secondary);
|
|
318
|
+
cursor: pointer;
|
|
319
|
+
border-radius: $border-radius;
|
|
320
|
+
font-size: $font-size-sm;
|
|
321
|
+
line-height: 1;
|
|
322
|
+
transition: opacity $transition-fast $easing-snappy,
|
|
323
|
+
color $transition-fast $easing-snappy,
|
|
324
|
+
background-color $transition-fast $easing-snappy;
|
|
325
|
+
|
|
326
|
+
&:hover {
|
|
327
|
+
color: var(--pa-danger);
|
|
328
|
+
background-color: var(--pa-danger-bg-light);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
275
331
|
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
332
|
+
// Show remove button on favorite-item hover
|
|
333
|
+
&__favorite-item:hover &__favorite-remove {
|
|
334
|
+
opacity: 1;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
&__favorites-add {
|
|
338
|
+
margin-top: auto;
|
|
339
|
+
padding-top: $spacing-md;
|
|
340
|
+
}
|
|
280
341
|
}
|
|
281
342
|
|
|
343
|
+
// Responsive adjustments
|
|
344
|
+
@media (max-width: $mobile-breakpoint) {
|
|
345
|
+
.pa-profile-panel__content {
|
|
346
|
+
width: 85vw;
|
|
347
|
+
max-width: $profile-panel-mobile-max-width;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
.pa-header__profile-name {
|
|
351
|
+
display: none;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// SCROLLBARS
|
|
3
|
+
// Global scrollbar styling for consistent appearance across browsers
|
|
4
|
+
// ============================================================================
|
|
5
|
+
@use '../variables' as *;
|
|
6
|
+
|
|
7
|
+
/* Webkit browsers (Chrome, Safari, Edge) */
|
|
8
|
+
*::-webkit-scrollbar {
|
|
9
|
+
width: $scrollbar-width;
|
|
10
|
+
height: $scrollbar-width;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
*::-webkit-scrollbar-track {
|
|
14
|
+
background: var(--pa-primary-bg);
|
|
15
|
+
border-radius: $scrollbar-border-radius;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
*::-webkit-scrollbar-thumb {
|
|
19
|
+
background: $border-color;
|
|
20
|
+
border-radius: $scrollbar-border-radius;
|
|
21
|
+
border: $border-width-base solid var(--pa-primary-bg);
|
|
22
|
+
|
|
23
|
+
&:hover {
|
|
24
|
+
background: $accent-color;
|
|
25
|
+
border-color: $accent-hover;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
&:active {
|
|
29
|
+
background: $accent-hover;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
*::-webkit-scrollbar-corner {
|
|
34
|
+
background: var(--pa-primary-bg);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/* Firefox */
|
|
38
|
+
* {
|
|
39
|
+
scrollbar-width: thin;
|
|
40
|
+
scrollbar-color: var(--pa-border-color) var(--pa-primary-bg);
|
|
41
|
+
}
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
font-size: $font-size-4xl;
|
|
76
76
|
font-weight: $font-weight-bold;
|
|
77
77
|
color: var(--pa-text-primary);
|
|
78
|
-
line-height: 1;
|
|
78
|
+
line-height: 1.1;
|
|
79
79
|
margin-bottom: $spacing-sm;
|
|
80
80
|
}
|
|
81
81
|
|
|
@@ -120,7 +120,7 @@
|
|
|
120
120
|
.pa-stat__number {
|
|
121
121
|
font-size: clamp($stat-square-number-min, $stat-square-number-scale, $stat-square-number-max);
|
|
122
122
|
font-weight: $font-weight-bold;
|
|
123
|
-
line-height: 1;
|
|
123
|
+
line-height: 1.1;
|
|
124
124
|
color: inherit;
|
|
125
125
|
z-index: $focus-outline-width;
|
|
126
126
|
position: relative;
|
|
@@ -134,7 +134,7 @@
|
|
|
134
134
|
.pa-stat__symbol {
|
|
135
135
|
font-size: clamp($stat-square-symbol-min, $stat-square-symbol-scale, $stat-square-symbol-max);
|
|
136
136
|
font-weight: $font-weight-bold;
|
|
137
|
-
line-height: 1;
|
|
137
|
+
line-height: 1.1;
|
|
138
138
|
opacity: $stat-symbol-opacity;
|
|
139
139
|
color: inherit;
|
|
140
140
|
position: absolute;
|
|
@@ -304,7 +304,7 @@
|
|
|
304
304
|
&--bordered {
|
|
305
305
|
border: $border-width-base solid var(--pa-border-color);
|
|
306
306
|
border-radius: $border-radius-lg;
|
|
307
|
-
padding: $card-body-padding;
|
|
307
|
+
padding: $card-body-padding-v $card-body-padding-h;
|
|
308
308
|
background-color: var(--pa-card-bg);
|
|
309
309
|
|
|
310
310
|
// Remove bottom border from tabs since wrapper has border
|
|
@@ -337,7 +337,7 @@
|
|
|
337
337
|
&--bordered {
|
|
338
338
|
border: $border-width-base solid var(--pa-border-color);
|
|
339
339
|
border-radius: $border-radius-lg;
|
|
340
|
-
padding: $card-body-padding;
|
|
340
|
+
padding: $card-body-padding-v $card-body-padding-h;
|
|
341
341
|
background-color: var(--pa-card-bg);
|
|
342
342
|
|
|
343
343
|
// Add divider between tabs and content (gap already provides spacing)
|