@keenmate/pure-admin-core 1.0.0-rc01
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/LICENSE +21 -0
- package/README.md +172 -0
- package/dist/css/main.css +11542 -0
- package/dist/fonts/Delivery/Delivery_W_Bd.woff2 +0 -0
- package/dist/fonts/Delivery/Delivery_W_BdIt.woff2 +0 -0
- package/dist/fonts/Delivery/Delivery_W_CdBlk.woff2 +0 -0
- package/dist/fonts/Delivery/Delivery_W_CdLt.woff2 +0 -0
- package/dist/fonts/Delivery/Delivery_W_It.woff2 +0 -0
- package/dist/fonts/Delivery/Delivery_W_Lt.woff2 +0 -0
- package/dist/fonts/Delivery/Delivery_W_LtIt.woff2 +0 -0
- package/dist/fonts/Delivery/Delivery_W_Rg.woff2 +0 -0
- package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8UH-qVHQ.woff2 +0 -0
- package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8UH-qVHQ.woff2.1 +0 -0
- package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8UH-qVHQ.woff2.2 +0 -0
- package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8VH-qVHQ.woff2 +0 -0
- package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8VH-qVHQ.woff2.1 +0 -0
- package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8VH-qVHQ.woff2.2 +0 -0
- package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8bH-o.woff2 +0 -0
- package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8bH-o.woff2.1 +0 -0
- package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8fH-qVHQ.woff2 +0 -0
- package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8fH-qVHQ.woff2.1 +0 -0
- package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8fH-qVHQ.woff2.2 +0 -0
- package/dist/fonts/google/6aez4K2oVqwIvtE2H68T.woff2 +0 -0
- package/dist/fonts/google/6aez4K2oVqwIvtU2Hw.woff2 +0 -0
- package/dist/fonts/google/6aez4K2oVqwIvtY2H68T.woff2 +0 -0
- package/dist/fonts/google/6aez4K2oVqwIvtg2H68T.woff2 +0 -0
- package/dist/fonts/google/6aez4K2oVqwIvto2H68T.woff2 +0 -0
- package/dist/fonts/google/6aez4K2oVqwIvts2H68T.woff2 +0 -0
- package/dist/fonts/google/7Auup_AqnyWWAxW2Wk3swUz56MS91Eww8SX21nejog.woff2 +0 -0
- package/dist/fonts/google/7Auup_AqnyWWAxW2Wk3swUz56MS91Eww8SX21nijogp5.woff2 +0 -0
- package/dist/fonts/google/7Auup_AqnyWWAxW2Wk3swUz56MS91Eww8SX21nmjogp5.woff2 +0 -0
- package/dist/fonts/google/PN_xRfK9oXHga0XdZ8g_vT0.woff2 +0 -0
- package/dist/fonts/google/PN_xRfK9oXHga0XdZsg_.woff2 +0 -0
- package/dist/fonts/google/PN_xRfK9oXHga0XdaMg_vT0.woff2 +0 -0
- package/dist/fonts/google/TK3tWkYFABsmjsphPho.woff2 +0 -0
- package/dist/fonts/google/TK3tWkYFABsmjspuPho7vA.woff2 +0 -0
- package/dist/fonts/google/TK3tWkYFABsmjspvPho7vA.woff2 +0 -0
- package/dist/fonts/google/dg45_pLmvrkcOkBnKsOzXyGWTBcmg-X6VjTYJwQj.woff2 +0 -0
- package/dist/fonts/google/dg45_pLmvrkcOkBnKsOzXyGWTBcmg-X6VjXYJwQj.woff2 +0 -0
- package/dist/fonts/google/dg45_pLmvrkcOkBnKsOzXyGWTBcmg-X6Vj_YJwQj.woff2 +0 -0
- package/dist/fonts/google/dg45_pLmvrkcOkBnKsOzXyGWTBcmg-X6VjbYJwQj.woff2 +0 -0
- package/dist/fonts/google/dg45_pLmvrkcOkBnKsOzXyGWTBcmg-X6VjvYJw.woff2 +0 -0
- package/dist/fonts/google/fonts-tracklist.txt +48 -0
- package/dist/fonts/google/vEFO2_JTCgwQ5ejvMV0O96D01E8J0tJXHKbBjM4.woff2 +0 -0
- package/dist/fonts/google/vEFO2_JTCgwQ5ejvMV0O96D01E8J0tJXHKbOjM7sfA.woff2 +0 -0
- package/dist/fonts/google/vEFO2_JTCgwQ5ejvMV0O96D01E8J0tJXHKbPjM7sfA.woff2 +0 -0
- package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfLtrftV.woff2 +0 -0
- package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfXtrftV.woff2 +0 -0
- package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfbtrQ.woff2 +0 -0
- package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfjtrftV.woff2 +0 -0
- package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfntrftV.woff2 +0 -0
- package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfrtrftV.woff2 +0 -0
- package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfvtrftV.woff2 +0 -0
- package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_B-bnBeA.woff2 +0 -0
- package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_C-bk.woff2 +0 -0
- package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_G-bnBeA.woff2 +0 -0
- package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_M-bnBeA.woff2 +0 -0
- package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_N-bnBeA.woff2 +0 -0
- package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_P-bnBeA.woff2 +0 -0
- package/package.json +60 -0
- package/snippets/alerts.html +281 -0
- package/snippets/badges.html +212 -0
- package/snippets/buttons.html +287 -0
- package/snippets/cards.html +393 -0
- package/snippets/checkbox-lists.html +490 -0
- package/snippets/code.html +225 -0
- package/snippets/command-palette.html +210 -0
- package/snippets/comparison.html +428 -0
- package/snippets/customization.html +142 -0
- package/snippets/forms.html +477 -0
- package/snippets/grid.html +338 -0
- package/snippets/layout.html +598 -0
- package/snippets/lists.html +232 -0
- package/snippets/loaders.html +183 -0
- package/snippets/manifest.json +388 -0
- package/snippets/modal-dialogs.html +411 -0
- package/snippets/modals.html +310 -0
- package/snippets/popconfirm.html +253 -0
- package/snippets/profile.html +264 -0
- package/snippets/tables.html +317 -0
- package/snippets/tabs.html +930 -0
- package/snippets/timeline.html +364 -0
- package/snippets/toasts.html +154 -0
- package/snippets/tooltips.html +411 -0
- package/snippets/typography.html +101 -0
- package/snippets/utilities.html +595 -0
- package/snippets/virtual-scroll.html +322 -0
- package/snippets/web-daterangepicker.html +634 -0
- package/snippets/web-multiselect.html +362 -0
- package/src/scss/.claude/settings.local.json +11 -0
- package/src/scss/_base-css-variables.scss +348 -0
- package/src/scss/_core.scss +99 -0
- package/src/scss/_fonts.scss +67 -0
- package/src/scss/_purecss-grid-responsive.scss +138 -0
- package/src/scss/_purecss-grid.scss +58 -0
- package/src/scss/_variables.scss +14 -0
- package/src/scss/core-components/_alerts.scss +212 -0
- package/src/scss/core-components/_badges.scss +16 -0
- package/src/scss/core-components/_base.scss +124 -0
- package/src/scss/core-components/_buttons.scss +473 -0
- package/src/scss/core-components/_cards.scss +285 -0
- package/src/scss/core-components/_checkbox-lists.scss +289 -0
- package/src/scss/core-components/_code.scss +141 -0
- package/src/scss/core-components/_command-palette.scss +518 -0
- package/src/scss/core-components/_comparison.scss +172 -0
- package/src/scss/core-components/_file-selector.scss +780 -0
- package/src/scss/core-components/_forms.scss +16 -0
- package/src/scss/core-components/_grid.scss +264 -0
- package/src/scss/core-components/_layout.scss +15 -0
- package/src/scss/core-components/_lists.scss +211 -0
- package/src/scss/core-components/_loaders.scss +277 -0
- package/src/scss/core-components/_logic-tree.scss +280 -0
- package/src/scss/core-components/_modals.scss +209 -0
- package/src/scss/core-components/_notifications.scss +253 -0
- package/src/scss/core-components/_pagers.scss +141 -0
- package/src/scss/core-components/_popconfirm.scss +170 -0
- package/src/scss/core-components/_profile.scss +281 -0
- package/src/scss/core-components/_settings-panel.scss +128 -0
- package/src/scss/core-components/_statistics.scss +200 -0
- package/src/scss/core-components/_tables.scss +555 -0
- package/src/scss/core-components/_tabs.scss +438 -0
- package/src/scss/core-components/_timeline.scss +589 -0
- package/src/scss/core-components/_toasts.scss +281 -0
- package/src/scss/core-components/_tooltips.scss +503 -0
- package/src/scss/core-components/_utilities.scss +241 -0
- package/src/scss/core-components/_web-components-theme.scss +294 -0
- package/src/scss/core-components/badges/_badge-base.scss +131 -0
- package/src/scss/core-components/badges/_badge-group.scss +25 -0
- package/src/scss/core-components/badges/_composite-badge-variants.scss +396 -0
- package/src/scss/core-components/badges/_composite-badge.scss +70 -0
- package/src/scss/core-components/badges/_index.scss +10 -0
- package/src/scss/core-components/badges/_labels.scss +155 -0
- package/src/scss/core-components/forms/_checkboxes-radios.scss +205 -0
- package/src/scss/core-components/forms/_form-inputs.scss +100 -0
- package/src/scss/core-components/forms/_form-layout.scss +66 -0
- package/src/scss/core-components/forms/_form-states.scss +89 -0
- package/src/scss/core-components/forms/_index.scss +12 -0
- package/src/scss/core-components/forms/_input-groups.scss +149 -0
- package/src/scss/core-components/forms/_input-wrapper.scss +89 -0
- package/src/scss/core-components/forms/_query-editor.scss +313 -0
- package/src/scss/core-components/layout/_index.scss +11 -0
- package/src/scss/core-components/layout/_layout-container.scss +105 -0
- package/src/scss/core-components/layout/_layout-responsive.scss +100 -0
- package/src/scss/core-components/layout/_navbar-elements.scss +238 -0
- package/src/scss/core-components/layout/_navbar.scss +71 -0
- package/src/scss/core-components/layout/_sidebar-states.scss +228 -0
- package/src/scss/core-components/layout/_sidebar.scss +177 -0
- package/src/scss/main.scss +7 -0
- package/src/scss/themes/_dark-base.scss +207 -0
- package/src/scss/themes/audi-light.scss +311 -0
- package/src/scss/themes/audi.scss +288 -0
- package/src/scss/themes/corporate.scss +203 -0
- package/src/scss/themes/dark-blue.scss +152 -0
- package/src/scss/themes/dark-green.scss +156 -0
- package/src/scss/themes/dark-red.scss +160 -0
- package/src/scss/themes/dark.scss +145 -0
- package/src/scss/themes/express.scss +281 -0
- package/src/scss/themes/minimal.scss +121 -0
- package/src/scss/utilities.scss +481 -0
- package/src/scss/variables/_base.scss +81 -0
- package/src/scss/variables/_colors.scss +148 -0
- package/src/scss/variables/_components.scss +509 -0
- package/src/scss/variables/_index.scss +13 -0
- package/src/scss/variables/_layout.scss +65 -0
- package/src/scss/variables/_spacing.scss +66 -0
- package/src/scss/variables/_system.scss +80 -0
- package/src/scss/variables/_typography.scss +37 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/* ========================================
|
|
2
|
+
Navbar/Header Elements
|
|
3
|
+
Burger menu, brand, navigation, title, profile button, theme switcher
|
|
4
|
+
======================================== */
|
|
5
|
+
@use '../../variables' as *;
|
|
6
|
+
|
|
7
|
+
// Navbar elements (using pa-header__ prefix for backward compatibility with existing partials)
|
|
8
|
+
.pa-header {
|
|
9
|
+
&__burger {
|
|
10
|
+
flex-shrink: 0;
|
|
11
|
+
margin-left: $burger-menu-margin-left;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
&__brand {
|
|
15
|
+
flex-shrink: 0;
|
|
16
|
+
padding-left: $header-brand-padding-left;
|
|
17
|
+
|
|
18
|
+
h1 {
|
|
19
|
+
margin: 0;
|
|
20
|
+
font-size: $font-size-lg;
|
|
21
|
+
font-weight: $font-weight-semibold;
|
|
22
|
+
color: var(--pa-header-text);
|
|
23
|
+
white-space: nowrap;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
&__nav {
|
|
28
|
+
flex-shrink: 0;
|
|
29
|
+
|
|
30
|
+
// Only style the direct child ul (main navigation)
|
|
31
|
+
> ul {
|
|
32
|
+
list-style: none;
|
|
33
|
+
margin: 0;
|
|
34
|
+
padding: 0;
|
|
35
|
+
display: flex;
|
|
36
|
+
gap: $spacing-md;
|
|
37
|
+
|
|
38
|
+
> li {
|
|
39
|
+
margin: 0; // Disable base margins from _base.scss
|
|
40
|
+
position: relative; // For dropdown positioning
|
|
41
|
+
display: flex;
|
|
42
|
+
align-items: center;
|
|
43
|
+
|
|
44
|
+
> a {
|
|
45
|
+
text-decoration: none;
|
|
46
|
+
color: var(--pa-header-text-secondary);
|
|
47
|
+
font-weight: $font-weight-medium;
|
|
48
|
+
padding: $spacing-xs $spacing-sm;
|
|
49
|
+
border-radius: $border-radius;
|
|
50
|
+
transition: all $transition-fast $easing-snappy;
|
|
51
|
+
font-size: $font-size-sm;
|
|
52
|
+
display: flex;
|
|
53
|
+
align-items: center;
|
|
54
|
+
|
|
55
|
+
&:hover {
|
|
56
|
+
color: var(--pa-accent);
|
|
57
|
+
background-color: var(--pa-accent-hover);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
&--left {
|
|
64
|
+
margin-right: auto;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
&--right {
|
|
68
|
+
margin-left: auto;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Dropdown navigation items
|
|
73
|
+
&__nav-item {
|
|
74
|
+
&--has-dropdown {
|
|
75
|
+
position: static; // Position dropdown relative to header, not this item
|
|
76
|
+
|
|
77
|
+
&:hover > .pa-header__dropdown {
|
|
78
|
+
display: block !important; // Override the !important hide
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
&__nav-link {
|
|
84
|
+
display: flex;
|
|
85
|
+
align-items: center;
|
|
86
|
+
gap: $spacing-xs;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Dropdown menus
|
|
90
|
+
&__dropdown {
|
|
91
|
+
display: none !important; // Force hide by default
|
|
92
|
+
position: absolute;
|
|
93
|
+
top: 100%;
|
|
94
|
+
left: 0;
|
|
95
|
+
min-width: 19.2rem;
|
|
96
|
+
background-color: var(--pa-card-bg);
|
|
97
|
+
border: $border-width-base solid var(--pa-border-color);
|
|
98
|
+
border-radius: $border-radius;
|
|
99
|
+
box-shadow: $shadow-lg;
|
|
100
|
+
z-index: 1100;
|
|
101
|
+
padding: $spacing-xs 0;
|
|
102
|
+
margin-top: 0;
|
|
103
|
+
list-style: none;
|
|
104
|
+
flex-direction: column; // Override any flex from parent
|
|
105
|
+
|
|
106
|
+
li {
|
|
107
|
+
margin: 0; // Disable base margins from _base.scss
|
|
108
|
+
display: block;
|
|
109
|
+
position: relative;
|
|
110
|
+
|
|
111
|
+
// Create invisible bridge for nested dropdowns (horizontal)
|
|
112
|
+
&.pa-header__nav-item--has-dropdown::after {
|
|
113
|
+
content: '';
|
|
114
|
+
position: absolute;
|
|
115
|
+
top: 0;
|
|
116
|
+
left: 100%;
|
|
117
|
+
width: 6.4px; // Small invisible bridge
|
|
118
|
+
height: 100%;
|
|
119
|
+
z-index: 1099;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Show nested dropdown on hover
|
|
123
|
+
&:hover > .pa-header__dropdown {
|
|
124
|
+
display: block !important;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
a {
|
|
128
|
+
display: block;
|
|
129
|
+
padding: $spacing-sm $spacing-base;
|
|
130
|
+
color: var(--pa-text-primary);
|
|
131
|
+
border-radius: 0;
|
|
132
|
+
white-space: nowrap;
|
|
133
|
+
text-decoration: none;
|
|
134
|
+
font-weight: $font-weight-medium;
|
|
135
|
+
font-size: $font-size-sm;
|
|
136
|
+
|
|
137
|
+
&:hover {
|
|
138
|
+
background-color: var(--pa-accent-light);
|
|
139
|
+
color: var(--pa-accent);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Level 2 dropdown (nested)
|
|
145
|
+
&--level2 {
|
|
146
|
+
top: 0;
|
|
147
|
+
left: 100%;
|
|
148
|
+
margin-top: 0;
|
|
149
|
+
margin-left: 0; // Remove gap to prevent dropdown from disappearing
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
&__title {
|
|
154
|
+
flex: 1;
|
|
155
|
+
min-width: 0; // Enable ellipsis
|
|
156
|
+
text-align: center;
|
|
157
|
+
|
|
158
|
+
h2 {
|
|
159
|
+
margin: 0;
|
|
160
|
+
font-size: $font-size-lg;
|
|
161
|
+
font-weight: $font-weight-semibold;
|
|
162
|
+
color: var(--pa-header-text);
|
|
163
|
+
white-space: nowrap;
|
|
164
|
+
overflow: hidden;
|
|
165
|
+
text-overflow: ellipsis;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
&__profile-btn {
|
|
170
|
+
flex-shrink: 0;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Burger menu button
|
|
175
|
+
.burger-menu {
|
|
176
|
+
display: flex;
|
|
177
|
+
flex-direction: column;
|
|
178
|
+
justify-content: space-around;
|
|
179
|
+
width: $burger-width;
|
|
180
|
+
height: $burger-height;
|
|
181
|
+
background: transparent;
|
|
182
|
+
border: none;
|
|
183
|
+
cursor: pointer;
|
|
184
|
+
padding: 0;
|
|
185
|
+
|
|
186
|
+
span {
|
|
187
|
+
width: 100%;
|
|
188
|
+
height: $burger-bar-height;
|
|
189
|
+
background-color: var(--pa-header-text);
|
|
190
|
+
border-radius: $border-radius;
|
|
191
|
+
transition: all $transition-normal $easing-snappy;
|
|
192
|
+
transform-origin: center;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
&.active {
|
|
196
|
+
span:nth-child(1) {
|
|
197
|
+
transform: rotate(45deg) translate($burger-transform-offset, $burger-transform-offset);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
span:nth-child(2) {
|
|
201
|
+
opacity: 0;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
span:nth-child(3) {
|
|
205
|
+
transform: rotate(-45deg) translate($burger-transform-offset, -$burger-transform-offset);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
&:hover span {
|
|
210
|
+
background-color: var(--pa-accent);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Theme switcher styling
|
|
215
|
+
.theme-switcher {
|
|
216
|
+
display: flex;
|
|
217
|
+
align-items: center;
|
|
218
|
+
gap: $spacing-sm;
|
|
219
|
+
|
|
220
|
+
label {
|
|
221
|
+
color: var(--pa-header-text-secondary);
|
|
222
|
+
font-size: $font-size-sm;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
select {
|
|
226
|
+
padding: $spacing-xs $spacing-sm;
|
|
227
|
+
border: $border-width-base solid var(--pa-border-color);
|
|
228
|
+
border-radius: $border-radius;
|
|
229
|
+
background-color: var(--pa-header-bg);
|
|
230
|
+
color: var(--pa-header-text);
|
|
231
|
+
font-size: $font-size-sm;
|
|
232
|
+
|
|
233
|
+
&:focus {
|
|
234
|
+
outline: none;
|
|
235
|
+
border-color: var(--pa-accent);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/* ========================================
|
|
2
|
+
Navbar Component
|
|
3
|
+
Fixed navbar and constrained container widths
|
|
4
|
+
======================================== */
|
|
5
|
+
@use '../../variables' as *;
|
|
6
|
+
|
|
7
|
+
// Navbar - Fixed at top, full width by default
|
|
8
|
+
.pa-navbar {
|
|
9
|
+
position: fixed;
|
|
10
|
+
top: 0;
|
|
11
|
+
left: 0;
|
|
12
|
+
right: 0;
|
|
13
|
+
height: $header-height;
|
|
14
|
+
background-color: var(--pa-header-bg);
|
|
15
|
+
border-bottom: $border-width-base solid var(--pa-header-border-color);
|
|
16
|
+
z-index: $z-index-header; // 2000
|
|
17
|
+
display: flex;
|
|
18
|
+
align-items: center;
|
|
19
|
+
justify-content: center; // Center for constrained mode
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Constrained navbar - limit navbar width to match container
|
|
23
|
+
// Body class is just a marker, no width styles on body itself
|
|
24
|
+
body.pa-container-sm .pa-navbar {
|
|
25
|
+
max-width: $layout-container-sm;
|
|
26
|
+
left: 0;
|
|
27
|
+
right: 0;
|
|
28
|
+
margin-left: auto;
|
|
29
|
+
margin-right: auto;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
body.pa-container-md .pa-navbar {
|
|
33
|
+
max-width: $layout-container-md;
|
|
34
|
+
left: 0;
|
|
35
|
+
right: 0;
|
|
36
|
+
margin-left: auto;
|
|
37
|
+
margin-right: auto;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
body.pa-container-lg .pa-navbar {
|
|
41
|
+
max-width: $layout-container-lg;
|
|
42
|
+
left: 0;
|
|
43
|
+
right: 0;
|
|
44
|
+
margin-left: auto;
|
|
45
|
+
margin-right: auto;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
body.pa-container-xl .pa-navbar {
|
|
49
|
+
max-width: $layout-container-xl;
|
|
50
|
+
left: 0;
|
|
51
|
+
right: 0;
|
|
52
|
+
margin-left: auto;
|
|
53
|
+
margin-right: auto;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
body.pa-container-2xl .pa-navbar {
|
|
57
|
+
max-width: $layout-container-2xl;
|
|
58
|
+
left: 0;
|
|
59
|
+
right: 0;
|
|
60
|
+
margin-left: auto;
|
|
61
|
+
margin-right: auto;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Navbar inner content
|
|
65
|
+
.pa-navbar__inner {
|
|
66
|
+
width: 100%;
|
|
67
|
+
padding: 0 $spacing-base;
|
|
68
|
+
display: flex;
|
|
69
|
+
align-items: center;
|
|
70
|
+
gap: $spacing-base;
|
|
71
|
+
}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/* ========================================
|
|
2
|
+
Sidebar States
|
|
3
|
+
Hidden, icon-collapse, and expanded states
|
|
4
|
+
======================================== */
|
|
5
|
+
@use '../../variables' as *;
|
|
6
|
+
|
|
7
|
+
// Sidebar hidden state
|
|
8
|
+
.sidebar-hidden {
|
|
9
|
+
.pa-layout__sidebar {
|
|
10
|
+
width: 0;
|
|
11
|
+
opacity: 0;
|
|
12
|
+
overflow: hidden;
|
|
13
|
+
border-right: none;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Icon-collapse mode: show narrow icon-only bar when hidden
|
|
17
|
+
.pa-layout__sidebar--icon-collapse {
|
|
18
|
+
width: $sidebar-collapsed-width;
|
|
19
|
+
opacity: 1; // Override parent opacity: 0 to make icons visible
|
|
20
|
+
overflow: visible !important; // Allow flyout to show outside sidebar
|
|
21
|
+
z-index: 1050; // Higher than content area (950) for flyouts
|
|
22
|
+
border-right: $border-width-base solid $border-color; // Restore border
|
|
23
|
+
|
|
24
|
+
// Enable positioning for flyouts
|
|
25
|
+
.pa-sidebar__item {
|
|
26
|
+
position: relative;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Hide text labels
|
|
30
|
+
.pa-sidebar__label {
|
|
31
|
+
opacity: 0;
|
|
32
|
+
width: 0;
|
|
33
|
+
overflow: hidden;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Hide chevron indicators
|
|
37
|
+
.pa-sidebar__chevron {
|
|
38
|
+
display: none;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Hide submenus when collapsed (but allow hover override)
|
|
42
|
+
.pa-sidebar__submenu {
|
|
43
|
+
display: none;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Icon stays in same position (no changes needed - already fixed width)
|
|
47
|
+
// The icon container maintains its $sidebar-icon-size width and position
|
|
48
|
+
|
|
49
|
+
// Keep EXACTLY the same padding as expanded state - icon must not move
|
|
50
|
+
.pa-sidebar__link,
|
|
51
|
+
.pa-sidebar__toggle {
|
|
52
|
+
padding: $sidebar-padding; // Same as expanded: 0.5rem 1rem (8px 16px)
|
|
53
|
+
position: relative; // For flyout positioning
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Flyout label on hover
|
|
57
|
+
.pa-sidebar__link:hover,
|
|
58
|
+
.pa-sidebar__toggle:hover {
|
|
59
|
+
overflow: visible;
|
|
60
|
+
z-index: 1000; // Elevate parent above content area
|
|
61
|
+
|
|
62
|
+
.pa-sidebar__label {
|
|
63
|
+
opacity: 1;
|
|
64
|
+
width: auto;
|
|
65
|
+
overflow: visible; // Remove overflow hidden
|
|
66
|
+
position: absolute;
|
|
67
|
+
left: 100%;
|
|
68
|
+
top: 0;
|
|
69
|
+
bottom: 0;
|
|
70
|
+
padding: $spacing-sm $spacing-base;
|
|
71
|
+
background-color: var(--pa-sidebar-bg);
|
|
72
|
+
border: $border-width-base solid var(--pa-border-color);
|
|
73
|
+
border-left: none;
|
|
74
|
+
border-radius: 0 $border-radius $border-radius 0;
|
|
75
|
+
box-shadow: $shadow-md;
|
|
76
|
+
white-space: nowrap;
|
|
77
|
+
z-index: 10; // Relative to parent
|
|
78
|
+
display: flex;
|
|
79
|
+
align-items: center;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Show submenu flyout on hover (for items with submenus)
|
|
84
|
+
.pa-sidebar__item:hover > .pa-sidebar__submenu,
|
|
85
|
+
.pa-sidebar__submenu:hover {
|
|
86
|
+
display: block !important;
|
|
87
|
+
max-height: none !important;
|
|
88
|
+
overflow: visible !important;
|
|
89
|
+
position: absolute;
|
|
90
|
+
left: 100%;
|
|
91
|
+
top: 0;
|
|
92
|
+
min-width: 12rem;
|
|
93
|
+
margin: 0;
|
|
94
|
+
padding: 0;
|
|
95
|
+
list-style: none;
|
|
96
|
+
background-color: var(--pa-sidebar-submenu-bg);
|
|
97
|
+
border: $border-width-base solid var(--pa-border-color);
|
|
98
|
+
border-left: none;
|
|
99
|
+
border-radius: 0 $border-radius $border-radius 0;
|
|
100
|
+
box-shadow: $shadow-md;
|
|
101
|
+
z-index: 1001; // Higher than parent
|
|
102
|
+
|
|
103
|
+
// Reset submenu styling for flyout
|
|
104
|
+
.pa-sidebar__item {
|
|
105
|
+
position: relative; // For nested flyouts
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.pa-sidebar__link,
|
|
109
|
+
.pa-sidebar__toggle {
|
|
110
|
+
padding: $spacing-sm $spacing-base;
|
|
111
|
+
justify-content: flex-start;
|
|
112
|
+
gap: $sidebar-item-gap;
|
|
113
|
+
font-size: $font-size-sm;
|
|
114
|
+
width: 100%;
|
|
115
|
+
|
|
116
|
+
&:hover {
|
|
117
|
+
background-color: var(--pa-sidebar-submenu-hover-bg);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
&--active {
|
|
121
|
+
background-color: var(--pa-sidebar-submenu-active-bg);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.pa-sidebar__icon {
|
|
126
|
+
width: $sidebar-icon-size;
|
|
127
|
+
min-width: $sidebar-icon-size;
|
|
128
|
+
justify-content: center;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.pa-sidebar__label {
|
|
132
|
+
position: static;
|
|
133
|
+
opacity: 1;
|
|
134
|
+
width: auto;
|
|
135
|
+
padding: 0;
|
|
136
|
+
background: none;
|
|
137
|
+
border: none;
|
|
138
|
+
box-shadow: none;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
.pa-sidebar__chevron {
|
|
142
|
+
display: inline;
|
|
143
|
+
margin-left: auto;
|
|
144
|
+
transform: none !important; // Always point right in flyout menus (never rotate down)
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Nested submenu flyout (level 3)
|
|
148
|
+
.pa-sidebar__submenu {
|
|
149
|
+
display: none;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.pa-sidebar__item:hover > .pa-sidebar__submenu,
|
|
153
|
+
.pa-sidebar__submenu .pa-sidebar__submenu:hover {
|
|
154
|
+
display: block !important;
|
|
155
|
+
max-height: none !important;
|
|
156
|
+
overflow: visible !important;
|
|
157
|
+
position: absolute;
|
|
158
|
+
left: 100%;
|
|
159
|
+
top: 0;
|
|
160
|
+
min-width: 19.2rem;
|
|
161
|
+
margin: 0;
|
|
162
|
+
padding: 0;
|
|
163
|
+
list-style: none;
|
|
164
|
+
background-color: var(--pa-sidebar-submenu-bg);
|
|
165
|
+
border: $border-width-base solid var(--pa-border-color);
|
|
166
|
+
border-left: none;
|
|
167
|
+
border-radius: 0 $border-radius $border-radius 0;
|
|
168
|
+
box-shadow: $shadow-md;
|
|
169
|
+
z-index: 1002; // Higher than parent submenu
|
|
170
|
+
|
|
171
|
+
.pa-sidebar__link,
|
|
172
|
+
.pa-sidebar__toggle {
|
|
173
|
+
font-size: $font-size-xs;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
.pa-sidebar__chevron {
|
|
177
|
+
transform: none !important; // Always point right in nested flyout menus
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// Sidebar expanded state (when not hidden) - ensure icon-collapse mode shows full width
|
|
185
|
+
body:not(.sidebar-hidden) {
|
|
186
|
+
.pa-layout__sidebar--icon-collapse {
|
|
187
|
+
width: $sidebar-width;
|
|
188
|
+
|
|
189
|
+
// Show labels when expanded
|
|
190
|
+
.pa-sidebar__label {
|
|
191
|
+
opacity: 1;
|
|
192
|
+
width: auto;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Show chevron when expanded
|
|
196
|
+
.pa-sidebar__chevron {
|
|
197
|
+
display: inline;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Restore normal padding for level 1 items only
|
|
201
|
+
.pa-sidebar__link,
|
|
202
|
+
.pa-sidebar__toggle {
|
|
203
|
+
padding: $sidebar-padding;
|
|
204
|
+
justify-content: flex-start;
|
|
205
|
+
gap: $sidebar-item-gap; // Restore gap when expanded
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Submenus controlled by --open class (no forced display)
|
|
209
|
+
|
|
210
|
+
// Restore submenu indentation for level 2
|
|
211
|
+
.pa-sidebar__submenu > .pa-sidebar__item > .pa-sidebar__link,
|
|
212
|
+
.pa-sidebar__submenu > .pa-sidebar__item > .pa-sidebar__toggle {
|
|
213
|
+
padding-left: $sidebar-submenu-indent;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Restore submenu indentation for level 3
|
|
217
|
+
.pa-sidebar__submenu .pa-sidebar__submenu > .pa-sidebar__item > .pa-sidebar__link,
|
|
218
|
+
.pa-sidebar__submenu .pa-sidebar__submenu > .pa-sidebar__item > .pa-sidebar__toggle {
|
|
219
|
+
padding-left: calc($sidebar-submenu-indent * $sidebar-submenu-indent-multiplier);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Icon maintains same position in both states
|
|
223
|
+
.pa-sidebar__icon {
|
|
224
|
+
width: $sidebar-icon-size;
|
|
225
|
+
// No justify-content needed - parent flex container handles alignment
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/* ========================================
|
|
2
|
+
Sidebar Component
|
|
3
|
+
Sidebar navigation with nested submenus
|
|
4
|
+
======================================== */
|
|
5
|
+
@use '../../variables' as *;
|
|
6
|
+
|
|
7
|
+
// Sidebar layout element
|
|
8
|
+
.pa-layout__sidebar {
|
|
9
|
+
width: $sidebar-width;
|
|
10
|
+
background-color: var(--pa-sidebar-bg);
|
|
11
|
+
border-right: $border-width-base solid var(--pa-border-color);
|
|
12
|
+
flex-shrink: 0;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// Sticky mode - sidebar scrolls
|
|
16
|
+
body.pa-layout--sticky .pa-layout__sidebar {
|
|
17
|
+
overflow-y: auto;
|
|
18
|
+
overflow-x: visible; // Allow tooltips to escape right
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Sidebar component (separate BEM block)
|
|
22
|
+
.pa-sidebar {
|
|
23
|
+
&__nav {
|
|
24
|
+
padding: $spacing-base 0;
|
|
25
|
+
|
|
26
|
+
ul {
|
|
27
|
+
list-style: none;
|
|
28
|
+
margin: 0;
|
|
29
|
+
padding: 0;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
&__item {
|
|
34
|
+
// Base styles for all sidebar items (regular links and submenu toggles)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
&__link {
|
|
38
|
+
display: flex;
|
|
39
|
+
align-items: center;
|
|
40
|
+
gap: $sidebar-item-gap;
|
|
41
|
+
padding: $sidebar-padding;
|
|
42
|
+
color: var(--pa-sidebar-text-secondary);
|
|
43
|
+
text-decoration: none;
|
|
44
|
+
font-weight: $font-weight-medium;
|
|
45
|
+
border-right: $border-width-thick solid transparent; // Reserve space to prevent shift on active
|
|
46
|
+
|
|
47
|
+
body.loaded & {
|
|
48
|
+
transition: all $transition-fast $easing-snappy;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
&:hover {
|
|
52
|
+
color: var(--pa-sidebar-text);
|
|
53
|
+
background-color: var(--pa-accent-light);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
&--active {
|
|
57
|
+
color: var(--pa-sidebar-text);
|
|
58
|
+
background-color: var(--pa-accent-hover);
|
|
59
|
+
border-right-color: var(--pa-accent); // Only change color, not width
|
|
60
|
+
font-weight: $font-weight-semibold; // Make active item bolder
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
&__toggle {
|
|
65
|
+
// For submenu toggle buttons (non-link items)
|
|
66
|
+
display: flex;
|
|
67
|
+
align-items: center;
|
|
68
|
+
gap: $sidebar-item-gap;
|
|
69
|
+
padding: $sidebar-padding;
|
|
70
|
+
color: var(--pa-sidebar-text-secondary);
|
|
71
|
+
background: none;
|
|
72
|
+
border: none;
|
|
73
|
+
width: 100%;
|
|
74
|
+
text-align: left;
|
|
75
|
+
font-weight: $font-weight-medium;
|
|
76
|
+
cursor: pointer;
|
|
77
|
+
|
|
78
|
+
body.loaded & {
|
|
79
|
+
transition: all $transition-fast $easing-snappy;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
&:hover {
|
|
83
|
+
color: var(--pa-sidebar-text);
|
|
84
|
+
background-color: var(--pa-accent-light);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
&--active {
|
|
88
|
+
color: var(--pa-sidebar-text);
|
|
89
|
+
background-color: var(--pa-accent-hover);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Icon and label styles
|
|
94
|
+
&__icon {
|
|
95
|
+
width: $sidebar-icon-size;
|
|
96
|
+
min-width: $sidebar-icon-size;
|
|
97
|
+
height: $sidebar-icon-size;
|
|
98
|
+
display: flex;
|
|
99
|
+
align-items: center;
|
|
100
|
+
justify-content: center;
|
|
101
|
+
flex-shrink: 0;
|
|
102
|
+
font-size: $font-size-base;
|
|
103
|
+
text-align: center;
|
|
104
|
+
line-height: 1; // Prevent emoji baseline shift
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
&__label {
|
|
108
|
+
flex: 1;
|
|
109
|
+
overflow: hidden;
|
|
110
|
+
text-overflow: ellipsis;
|
|
111
|
+
white-space: nowrap;
|
|
112
|
+
|
|
113
|
+
body.loaded & {
|
|
114
|
+
transition: opacity $transition-normal $easing-snappy, width $transition-normal $easing-snappy;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Submenu styles - Level 2
|
|
119
|
+
&__submenu {
|
|
120
|
+
list-style: none;
|
|
121
|
+
margin: 0;
|
|
122
|
+
padding: 0;
|
|
123
|
+
display: none;
|
|
124
|
+
background-color: var(--pa-sidebar-submenu-bg);
|
|
125
|
+
|
|
126
|
+
&--open {
|
|
127
|
+
display: block;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Level 2 submenu links
|
|
132
|
+
&__submenu > &__item > &__link {
|
|
133
|
+
padding-left: $sidebar-submenu-indent;
|
|
134
|
+
font-size: $font-size-md;
|
|
135
|
+
border-right: $border-width-medium solid transparent; // Reserve space to prevent shift on active
|
|
136
|
+
|
|
137
|
+
&:hover {
|
|
138
|
+
background-color: var(--pa-sidebar-submenu-hover-bg);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
&--active {
|
|
142
|
+
background-color: var(--pa-sidebar-submenu-active-bg);
|
|
143
|
+
border-right-color: var(--pa-accent); // Only change color, not width
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Level 2 submenu toggles (for third level)
|
|
148
|
+
&__submenu > &__item > &__toggle {
|
|
149
|
+
padding-left: $sidebar-submenu-indent;
|
|
150
|
+
font-size: $font-size-md;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Level 3 submenu links
|
|
154
|
+
&__submenu &__submenu > &__item > &__link {
|
|
155
|
+
padding-left: calc($sidebar-submenu-indent * $sidebar-submenu-indent-multiplier);
|
|
156
|
+
font-size: $font-size-sm;
|
|
157
|
+
border-right: $border-width-base solid transparent; // Reserve space to prevent shift on active
|
|
158
|
+
|
|
159
|
+
&--active {
|
|
160
|
+
border-right-color: var(--pa-accent); // Only change color, not width
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Chevron icon for toggle buttons
|
|
165
|
+
&__chevron {
|
|
166
|
+
margin-left: auto;
|
|
167
|
+
font-size: $font-size-xs;
|
|
168
|
+
|
|
169
|
+
body.loaded & {
|
|
170
|
+
transition: transform $transition-fast $easing-snappy;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.pa-sidebar__item--open & {
|
|
174
|
+
transform: rotate(90deg);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|