@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.
Files changed (167) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +172 -0
  3. package/dist/css/main.css +11542 -0
  4. package/dist/fonts/Delivery/Delivery_W_Bd.woff2 +0 -0
  5. package/dist/fonts/Delivery/Delivery_W_BdIt.woff2 +0 -0
  6. package/dist/fonts/Delivery/Delivery_W_CdBlk.woff2 +0 -0
  7. package/dist/fonts/Delivery/Delivery_W_CdLt.woff2 +0 -0
  8. package/dist/fonts/Delivery/Delivery_W_It.woff2 +0 -0
  9. package/dist/fonts/Delivery/Delivery_W_Lt.woff2 +0 -0
  10. package/dist/fonts/Delivery/Delivery_W_LtIt.woff2 +0 -0
  11. package/dist/fonts/Delivery/Delivery_W_Rg.woff2 +0 -0
  12. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8UH-qVHQ.woff2 +0 -0
  13. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8UH-qVHQ.woff2.1 +0 -0
  14. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8UH-qVHQ.woff2.2 +0 -0
  15. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8VH-qVHQ.woff2 +0 -0
  16. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8VH-qVHQ.woff2.1 +0 -0
  17. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8VH-qVHQ.woff2.2 +0 -0
  18. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8bH-o.woff2 +0 -0
  19. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8bH-o.woff2.1 +0 -0
  20. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8fH-qVHQ.woff2 +0 -0
  21. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8fH-qVHQ.woff2.1 +0 -0
  22. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8fH-qVHQ.woff2.2 +0 -0
  23. package/dist/fonts/google/6aez4K2oVqwIvtE2H68T.woff2 +0 -0
  24. package/dist/fonts/google/6aez4K2oVqwIvtU2Hw.woff2 +0 -0
  25. package/dist/fonts/google/6aez4K2oVqwIvtY2H68T.woff2 +0 -0
  26. package/dist/fonts/google/6aez4K2oVqwIvtg2H68T.woff2 +0 -0
  27. package/dist/fonts/google/6aez4K2oVqwIvto2H68T.woff2 +0 -0
  28. package/dist/fonts/google/6aez4K2oVqwIvts2H68T.woff2 +0 -0
  29. package/dist/fonts/google/7Auup_AqnyWWAxW2Wk3swUz56MS91Eww8SX21nejog.woff2 +0 -0
  30. package/dist/fonts/google/7Auup_AqnyWWAxW2Wk3swUz56MS91Eww8SX21nijogp5.woff2 +0 -0
  31. package/dist/fonts/google/7Auup_AqnyWWAxW2Wk3swUz56MS91Eww8SX21nmjogp5.woff2 +0 -0
  32. package/dist/fonts/google/PN_xRfK9oXHga0XdZ8g_vT0.woff2 +0 -0
  33. package/dist/fonts/google/PN_xRfK9oXHga0XdZsg_.woff2 +0 -0
  34. package/dist/fonts/google/PN_xRfK9oXHga0XdaMg_vT0.woff2 +0 -0
  35. package/dist/fonts/google/TK3tWkYFABsmjsphPho.woff2 +0 -0
  36. package/dist/fonts/google/TK3tWkYFABsmjspuPho7vA.woff2 +0 -0
  37. package/dist/fonts/google/TK3tWkYFABsmjspvPho7vA.woff2 +0 -0
  38. package/dist/fonts/google/dg45_pLmvrkcOkBnKsOzXyGWTBcmg-X6VjTYJwQj.woff2 +0 -0
  39. package/dist/fonts/google/dg45_pLmvrkcOkBnKsOzXyGWTBcmg-X6VjXYJwQj.woff2 +0 -0
  40. package/dist/fonts/google/dg45_pLmvrkcOkBnKsOzXyGWTBcmg-X6Vj_YJwQj.woff2 +0 -0
  41. package/dist/fonts/google/dg45_pLmvrkcOkBnKsOzXyGWTBcmg-X6VjbYJwQj.woff2 +0 -0
  42. package/dist/fonts/google/dg45_pLmvrkcOkBnKsOzXyGWTBcmg-X6VjvYJw.woff2 +0 -0
  43. package/dist/fonts/google/fonts-tracklist.txt +48 -0
  44. package/dist/fonts/google/vEFO2_JTCgwQ5ejvMV0O96D01E8J0tJXHKbBjM4.woff2 +0 -0
  45. package/dist/fonts/google/vEFO2_JTCgwQ5ejvMV0O96D01E8J0tJXHKbOjM7sfA.woff2 +0 -0
  46. package/dist/fonts/google/vEFO2_JTCgwQ5ejvMV0O96D01E8J0tJXHKbPjM7sfA.woff2 +0 -0
  47. package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfLtrftV.woff2 +0 -0
  48. package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfXtrftV.woff2 +0 -0
  49. package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfbtrQ.woff2 +0 -0
  50. package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfjtrftV.woff2 +0 -0
  51. package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfntrftV.woff2 +0 -0
  52. package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfrtrftV.woff2 +0 -0
  53. package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfvtrftV.woff2 +0 -0
  54. package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_B-bnBeA.woff2 +0 -0
  55. package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_C-bk.woff2 +0 -0
  56. package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_G-bnBeA.woff2 +0 -0
  57. package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_M-bnBeA.woff2 +0 -0
  58. package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_N-bnBeA.woff2 +0 -0
  59. package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_P-bnBeA.woff2 +0 -0
  60. package/package.json +60 -0
  61. package/snippets/alerts.html +281 -0
  62. package/snippets/badges.html +212 -0
  63. package/snippets/buttons.html +287 -0
  64. package/snippets/cards.html +393 -0
  65. package/snippets/checkbox-lists.html +490 -0
  66. package/snippets/code.html +225 -0
  67. package/snippets/command-palette.html +210 -0
  68. package/snippets/comparison.html +428 -0
  69. package/snippets/customization.html +142 -0
  70. package/snippets/forms.html +477 -0
  71. package/snippets/grid.html +338 -0
  72. package/snippets/layout.html +598 -0
  73. package/snippets/lists.html +232 -0
  74. package/snippets/loaders.html +183 -0
  75. package/snippets/manifest.json +388 -0
  76. package/snippets/modal-dialogs.html +411 -0
  77. package/snippets/modals.html +310 -0
  78. package/snippets/popconfirm.html +253 -0
  79. package/snippets/profile.html +264 -0
  80. package/snippets/tables.html +317 -0
  81. package/snippets/tabs.html +930 -0
  82. package/snippets/timeline.html +364 -0
  83. package/snippets/toasts.html +154 -0
  84. package/snippets/tooltips.html +411 -0
  85. package/snippets/typography.html +101 -0
  86. package/snippets/utilities.html +595 -0
  87. package/snippets/virtual-scroll.html +322 -0
  88. package/snippets/web-daterangepicker.html +634 -0
  89. package/snippets/web-multiselect.html +362 -0
  90. package/src/scss/.claude/settings.local.json +11 -0
  91. package/src/scss/_base-css-variables.scss +348 -0
  92. package/src/scss/_core.scss +99 -0
  93. package/src/scss/_fonts.scss +67 -0
  94. package/src/scss/_purecss-grid-responsive.scss +138 -0
  95. package/src/scss/_purecss-grid.scss +58 -0
  96. package/src/scss/_variables.scss +14 -0
  97. package/src/scss/core-components/_alerts.scss +212 -0
  98. package/src/scss/core-components/_badges.scss +16 -0
  99. package/src/scss/core-components/_base.scss +124 -0
  100. package/src/scss/core-components/_buttons.scss +473 -0
  101. package/src/scss/core-components/_cards.scss +285 -0
  102. package/src/scss/core-components/_checkbox-lists.scss +289 -0
  103. package/src/scss/core-components/_code.scss +141 -0
  104. package/src/scss/core-components/_command-palette.scss +518 -0
  105. package/src/scss/core-components/_comparison.scss +172 -0
  106. package/src/scss/core-components/_file-selector.scss +780 -0
  107. package/src/scss/core-components/_forms.scss +16 -0
  108. package/src/scss/core-components/_grid.scss +264 -0
  109. package/src/scss/core-components/_layout.scss +15 -0
  110. package/src/scss/core-components/_lists.scss +211 -0
  111. package/src/scss/core-components/_loaders.scss +277 -0
  112. package/src/scss/core-components/_logic-tree.scss +280 -0
  113. package/src/scss/core-components/_modals.scss +209 -0
  114. package/src/scss/core-components/_notifications.scss +253 -0
  115. package/src/scss/core-components/_pagers.scss +141 -0
  116. package/src/scss/core-components/_popconfirm.scss +170 -0
  117. package/src/scss/core-components/_profile.scss +281 -0
  118. package/src/scss/core-components/_settings-panel.scss +128 -0
  119. package/src/scss/core-components/_statistics.scss +200 -0
  120. package/src/scss/core-components/_tables.scss +555 -0
  121. package/src/scss/core-components/_tabs.scss +438 -0
  122. package/src/scss/core-components/_timeline.scss +589 -0
  123. package/src/scss/core-components/_toasts.scss +281 -0
  124. package/src/scss/core-components/_tooltips.scss +503 -0
  125. package/src/scss/core-components/_utilities.scss +241 -0
  126. package/src/scss/core-components/_web-components-theme.scss +294 -0
  127. package/src/scss/core-components/badges/_badge-base.scss +131 -0
  128. package/src/scss/core-components/badges/_badge-group.scss +25 -0
  129. package/src/scss/core-components/badges/_composite-badge-variants.scss +396 -0
  130. package/src/scss/core-components/badges/_composite-badge.scss +70 -0
  131. package/src/scss/core-components/badges/_index.scss +10 -0
  132. package/src/scss/core-components/badges/_labels.scss +155 -0
  133. package/src/scss/core-components/forms/_checkboxes-radios.scss +205 -0
  134. package/src/scss/core-components/forms/_form-inputs.scss +100 -0
  135. package/src/scss/core-components/forms/_form-layout.scss +66 -0
  136. package/src/scss/core-components/forms/_form-states.scss +89 -0
  137. package/src/scss/core-components/forms/_index.scss +12 -0
  138. package/src/scss/core-components/forms/_input-groups.scss +149 -0
  139. package/src/scss/core-components/forms/_input-wrapper.scss +89 -0
  140. package/src/scss/core-components/forms/_query-editor.scss +313 -0
  141. package/src/scss/core-components/layout/_index.scss +11 -0
  142. package/src/scss/core-components/layout/_layout-container.scss +105 -0
  143. package/src/scss/core-components/layout/_layout-responsive.scss +100 -0
  144. package/src/scss/core-components/layout/_navbar-elements.scss +238 -0
  145. package/src/scss/core-components/layout/_navbar.scss +71 -0
  146. package/src/scss/core-components/layout/_sidebar-states.scss +228 -0
  147. package/src/scss/core-components/layout/_sidebar.scss +177 -0
  148. package/src/scss/main.scss +7 -0
  149. package/src/scss/themes/_dark-base.scss +207 -0
  150. package/src/scss/themes/audi-light.scss +311 -0
  151. package/src/scss/themes/audi.scss +288 -0
  152. package/src/scss/themes/corporate.scss +203 -0
  153. package/src/scss/themes/dark-blue.scss +152 -0
  154. package/src/scss/themes/dark-green.scss +156 -0
  155. package/src/scss/themes/dark-red.scss +160 -0
  156. package/src/scss/themes/dark.scss +145 -0
  157. package/src/scss/themes/express.scss +281 -0
  158. package/src/scss/themes/minimal.scss +121 -0
  159. package/src/scss/utilities.scss +481 -0
  160. package/src/scss/variables/_base.scss +81 -0
  161. package/src/scss/variables/_colors.scss +148 -0
  162. package/src/scss/variables/_components.scss +509 -0
  163. package/src/scss/variables/_index.scss +13 -0
  164. package/src/scss/variables/_layout.scss +65 -0
  165. package/src/scss/variables/_spacing.scss +66 -0
  166. package/src/scss/variables/_system.scss +80 -0
  167. 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
+ }
@@ -0,0 +1,7 @@
1
+ /* Pure Admin Visual Framework - Main Entry Point */
2
+
3
+ // Utilities (spacing, etc.)
4
+ @use "utilities" as *;
5
+
6
+ // Core framework (includes variables and all core-components)
7
+ @use 'core' as *;