@keenmate/pure-admin-core 1.0.0-rc06 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/README.md +77 -7
  2. package/dist/css/main.css +1313 -452
  3. package/package.json +1 -1
  4. package/snippets/customization.html +1 -1
  5. package/snippets/layout.html +66 -0
  6. package/snippets/manifest.json +0 -50
  7. package/snippets/profile.html +51 -3
  8. package/src/scss/_base-css-variables.scss +432 -422
  9. package/src/scss/_core.scss +105 -105
  10. package/src/scss/_fonts.scss +0 -14
  11. package/src/scss/_variables.scss +12 -14
  12. package/src/scss/core-components/_alerts.scss +7 -7
  13. package/src/scss/core-components/_base.scss +3 -3
  14. package/src/scss/core-components/_buttons.scss +425 -425
  15. package/src/scss/core-components/_callouts.scss +139 -139
  16. package/src/scss/core-components/_cards.scss +321 -321
  17. package/src/scss/core-components/_checkbox-lists.scss +2 -2
  18. package/src/scss/core-components/_code.scss +4 -4
  19. package/src/scss/core-components/_command-palette.scss +518 -518
  20. package/src/scss/core-components/_comparison.scss +3 -3
  21. package/src/scss/core-components/_file-selector.scss +780 -780
  22. package/src/scss/core-components/_forms.scss +16 -16
  23. package/src/scss/core-components/_grid.scss +25 -0
  24. package/src/scss/core-components/_layout.scss +15 -15
  25. package/src/scss/core-components/_lists.scss +7 -7
  26. package/src/scss/core-components/_logic-tree.scss +280 -280
  27. package/src/scss/core-components/_modals.scss +2 -2
  28. package/src/scss/core-components/_notifications.scss +74 -7
  29. package/src/scss/core-components/_pagers.scss +3 -3
  30. package/src/scss/core-components/_popconfirm.scss +1 -1
  31. package/src/scss/core-components/_profile.scss +400 -379
  32. package/src/scss/core-components/_scrollbars.scss +40 -41
  33. package/src/scss/core-components/_settings-panel.scss +5 -5
  34. package/src/scss/core-components/_statistics.scss +6 -6
  35. package/src/scss/core-components/_tables.scss +566 -566
  36. package/src/scss/core-components/_tabs.scss +493 -493
  37. package/src/scss/core-components/_timeline.scss +15 -15
  38. package/src/scss/core-components/_toasts.scss +4 -4
  39. package/src/scss/core-components/_tooltips.scss +8 -8
  40. package/src/scss/core-components/_utilities.scss +35 -30
  41. package/src/scss/core-components/_web-components-theme.scss +294 -294
  42. package/src/scss/core-components/badges/_composite-badge-variants.scss +3 -3
  43. package/src/scss/core-components/badges/_labels.scss +1 -1
  44. package/src/scss/core-components/forms/_checkboxes-radios.scss +2 -2
  45. package/src/scss/core-components/forms/_form-inputs.scss +4 -4
  46. package/src/scss/core-components/forms/_form-layout.scss +2 -2
  47. package/src/scss/core-components/forms/_form-states.scss +1 -1
  48. package/src/scss/core-components/forms/_input-groups.scss +13 -11
  49. package/src/scss/core-components/forms/_input-wrapper.scss +1 -1
  50. package/src/scss/core-components/forms/_query-editor.scss +17 -17
  51. package/src/scss/core-components/layout/_layout-container.scss +33 -1
  52. package/src/scss/core-components/layout/_navbar-elements.scss +1 -1
  53. package/src/scss/core-components/layout/_sidebar.scss +53 -2
  54. package/src/scss/utilities.scss +81 -2
  55. package/src/scss/variables/_base.scss +20 -10
  56. package/src/scss/variables/_colors.scss +7 -6
  57. package/src/scss/variables/_components.scss +8 -11
  58. package/src/scss/variables/_index.scss +11 -7
  59. package/src/scss/variables/_spacing.scss +12 -0
  60. package/src/scss/variables/_typography.scss +2 -2
  61. package/dist/fonts/Delivery/Delivery_W_Bd.woff2 +0 -0
  62. package/dist/fonts/Delivery/Delivery_W_BdIt.woff2 +0 -0
  63. package/dist/fonts/Delivery/Delivery_W_CdBlk.woff2 +0 -0
  64. package/dist/fonts/Delivery/Delivery_W_CdLt.woff2 +0 -0
  65. package/dist/fonts/Delivery/Delivery_W_It.woff2 +0 -0
  66. package/dist/fonts/Delivery/Delivery_W_Lt.woff2 +0 -0
  67. package/dist/fonts/Delivery/Delivery_W_LtIt.woff2 +0 -0
  68. package/dist/fonts/Delivery/Delivery_W_Rg.woff2 +0 -0
  69. package/src/scss/themes/_dark-base.scss +0 -207
  70. package/src/scss/themes/audi-light.scss +0 -341
  71. package/src/scss/themes/audi.scss +0 -303
  72. package/src/scss/themes/corporate.scss +0 -229
  73. package/src/scss/themes/dark-blue.scss +0 -165
  74. package/src/scss/themes/dark-green.scss +0 -169
  75. package/src/scss/themes/dark-red.scss +0 -173
  76. package/src/scss/themes/dark.scss +0 -158
  77. package/src/scss/themes/express.scss +0 -294
  78. package/src/scss/themes/minimal.scss +0 -134
@@ -1,425 +1,425 @@
1
- /* ========================================
2
- Button Components
3
- Buttons, button groups, sizes, colors, states, and icon buttons
4
- ======================================== */
5
- @use '../variables' as *;
6
-
7
- // Buttons
8
- .pa-btn {
9
- display: inline-block;
10
- height: $btn-height-base;
11
- padding: $btn-padding-v $btn-padding-h;
12
- border: $btn-border-width solid transparent;
13
- border-radius: $border-radius;
14
- font-size: $font-size-sm;
15
- font-weight: $font-weight-medium;
16
- text-align: center;
17
- text-decoration: none;
18
- cursor: pointer;
19
- transition: all $transition-fast $easing-snappy;
20
- background: none;
21
- color: var(--pa-text-primary);
22
-
23
- &:hover {
24
- transform: translateY($btn-hover-lift);
25
- }
26
-
27
- &--primary {
28
- background-color: var(--pa-accent);
29
- border-color: var(--pa-accent);
30
- color: var(--pa-btn-primary-text);
31
-
32
- &:hover {
33
- background-color: var(--pa-accent);
34
- filter: brightness($btn-hover-brightness);
35
- }
36
- }
37
-
38
- &--secondary {
39
- background-color: transparent;
40
- border-color: var(--pa-border-color);
41
- color: var(--pa-text-primary);
42
-
43
- &:hover {
44
- background-color: var(--pa-primary-bg);
45
- border-color: var(--pa-accent);
46
- }
47
- }
48
-
49
- &--xs {
50
- height: $btn-height-xs;
51
- padding: $btn-padding-xs-v $btn-padding-xs-h;
52
- font-size: $font-size-xs;
53
- }
54
-
55
- &--sm {
56
- height: $btn-height-sm;
57
- padding: $btn-padding-sm-v $btn-padding-sm-h;
58
- font-size: $font-size-sm;
59
- }
60
-
61
- &--lg {
62
- height: $btn-height-lg;
63
- padding: $btn-padding-lg-v $btn-padding-lg-h;
64
- font-size: $font-size-base;
65
- }
66
-
67
- &--xl {
68
- height: $btn-height-xl;
69
- padding: $btn-padding-xl-v $btn-padding-xl-h;
70
- font-size: $font-size-lg;
71
- }
72
-
73
- // Button variants (colors)
74
- &--success {
75
- background-color: var(--pa-btn-success-bg);
76
- border-color: var(--pa-btn-success-bg);
77
- color: var(--pa-btn-success-text);
78
-
79
- &:hover {
80
- background-color: var(--pa-btn-success-bg-hover);
81
- border-color: var(--pa-btn-success-bg-hover);
82
- }
83
- }
84
-
85
- &--warning {
86
- background-color: var(--pa-btn-warning-bg);
87
- border-color: var(--pa-btn-warning-bg);
88
- color: var(--pa-btn-warning-text);
89
-
90
- &:hover {
91
- background-color: var(--pa-btn-warning-bg-hover);
92
- border-color: var(--pa-btn-warning-bg-hover);
93
- }
94
- }
95
-
96
- &--danger {
97
- background-color: var(--pa-btn-danger-bg);
98
- border-color: var(--pa-btn-danger-bg);
99
- color: var(--pa-btn-danger-text);
100
-
101
- &:hover {
102
- background-color: var(--pa-btn-danger-bg-hover);
103
- border-color: var(--pa-btn-danger-bg-hover);
104
- }
105
- }
106
-
107
- &--info {
108
- background-color: var(--pa-btn-info-bg);
109
- border-color: var(--pa-btn-info-bg);
110
- color: var(--pa-btn-info-text);
111
-
112
- &:hover {
113
- background-color: var(--pa-btn-info-bg-hover);
114
- border-color: var(--pa-btn-info-bg-hover);
115
- }
116
- }
117
-
118
- &--light {
119
- background-color: var(--pa-btn-light-bg);
120
- border-color: var(--pa-btn-light-bg);
121
- color: var(--pa-btn-light-text);
122
-
123
- &:hover {
124
- background-color: var(--pa-btn-light-bg-hover);
125
- border-color: var(--pa-btn-light-bg-hover);
126
- }
127
- }
128
-
129
- &--dark {
130
- background-color: var(--pa-btn-dark-bg);
131
- border-color: var(--pa-btn-dark-bg);
132
- color: var(--pa-btn-dark-text);
133
-
134
- &:hover {
135
- background-color: var(--pa-btn-dark-bg-hover);
136
- border-color: var(--pa-btn-dark-bg-hover);
137
- }
138
- }
139
-
140
- // Outline variants
141
- &--outline-primary {
142
- background-color: transparent;
143
- border-color: var(--pa-accent);
144
- color: var(--pa-accent);
145
-
146
- &:hover {
147
- background-color: var(--pa-accent);
148
- color: var(--pa-btn-primary-text);
149
- }
150
- }
151
-
152
- &--outline-secondary {
153
- background-color: transparent;
154
- border-color: var(--pa-btn-secondary-bg);
155
- color: var(--pa-btn-secondary-bg);
156
-
157
- &:hover {
158
- background-color: var(--pa-btn-secondary-bg);
159
- color: var(--pa-btn-secondary-text);
160
- }
161
- }
162
-
163
- &--outline-success {
164
- background-color: transparent;
165
- border-color: var(--pa-btn-success-bg);
166
- color: var(--pa-btn-success-bg);
167
-
168
- &:hover {
169
- background-color: var(--pa-btn-success-bg);
170
- color: var(--pa-btn-success-text);
171
- }
172
- }
173
-
174
- &--outline-warning {
175
- background-color: transparent;
176
- border-color: var(--pa-btn-warning-bg);
177
- color: var(--pa-btn-warning-bg);
178
-
179
- &:hover {
180
- background-color: var(--pa-btn-warning-bg);
181
- color: var(--pa-btn-warning-text);
182
- }
183
- }
184
-
185
- &--outline-danger {
186
- background-color: transparent;
187
- border-color: var(--pa-btn-danger-bg);
188
- color: var(--pa-btn-danger-bg);
189
-
190
- &:hover {
191
- background-color: var(--pa-btn-danger-bg);
192
- color: var(--pa-btn-danger-text);
193
- }
194
- }
195
-
196
- &--outline-info {
197
- background-color: transparent;
198
- border-color: var(--pa-btn-info-bg);
199
- color: var(--pa-btn-info-bg);
200
-
201
- &:hover {
202
- background-color: var(--pa-btn-info-bg);
203
- color: var(--pa-btn-info-text);
204
- }
205
- }
206
-
207
- // Button states
208
- &:disabled {
209
- opacity: $btn-disabled-opacity;
210
- cursor: not-allowed;
211
- transform: none !important;
212
- }
213
-
214
- &--loading {
215
- position: relative;
216
- pointer-events: none;
217
-
218
- .pa-btn__spinner {
219
- position: absolute;
220
- top: 0;
221
- left: 0;
222
- right: 0;
223
- bottom: 0;
224
- margin: auto;
225
- width: $spinner-size;
226
- height: $spinner-size;
227
- border: $spinner-border-width solid transparent;
228
- border-top: $spinner-border-width solid currentColor;
229
- border-radius: 50%;
230
- animation: pa-spin $animation-spin-duration linear infinite;
231
- }
232
- }
233
-
234
- // Ripple effect
235
- &--ripple {
236
- position: relative;
237
- overflow: hidden;
238
-
239
- &::before {
240
- content: '';
241
- position: absolute;
242
- top: 50%;
243
- left: 50%;
244
- width: 0;
245
- height: 0;
246
- border-radius: 50%;
247
- background: $ripple-color;
248
- transform: translate(-50%, -50%);
249
- transition: width $ripple-transition-duration ease, height $ripple-transition-duration ease;
250
- pointer-events: none;
251
- }
252
-
253
- &.pa-btn--ripple-active::before {
254
- width: $ripple-size;
255
- height: $ripple-size;
256
- }
257
- }
258
-
259
- // Block button
260
- &--block {
261
- width: 100%;
262
- display: block;
263
- }
264
-
265
- // Icon buttons
266
- &--icon-only {
267
- width: $btn-icon-only-size;
268
- height: $btn-icon-only-size;
269
- padding: 0;
270
- display: flex;
271
- align-items: center;
272
- justify-content: center;
273
- line-height: 1;
274
-
275
- // Size-specific icon-only dimensions
276
- &.pa-btn--xs {
277
- width: $btn-icon-only-size-xs;
278
- height: $btn-icon-only-size-xs;
279
- }
280
-
281
- &.pa-btn--sm {
282
- width: $btn-icon-only-size-sm;
283
- height: $btn-icon-only-size-sm;
284
- }
285
-
286
- &.pa-btn--lg {
287
- width: $btn-icon-only-size-lg;
288
- height: $btn-icon-only-size-lg;
289
- }
290
-
291
- &.pa-btn--xl {
292
- width: $btn-icon-only-size-xl;
293
- height: $btn-icon-only-size-xl;
294
- }
295
- }
296
-
297
- &__icon {
298
- margin-right: $btn-icon-margin;
299
-
300
- &:last-child {
301
- margin-right: 0;
302
- margin-left: $btn-icon-margin;
303
- }
304
- }
305
-
306
- // Buttons with icons align left like sidebar menu items
307
- &:has(.pa-btn__icon) {
308
- text-align: left;
309
- display: inline-flex;
310
- align-items: center;
311
- gap: $spacing-sm;
312
-
313
- .pa-btn__icon {
314
- width: $sidebar-icon-size;
315
- min-width: $sidebar-icon-size;
316
- // No fixed height - let button padding control height
317
- display: flex;
318
- align-items: center;
319
- justify-content: center;
320
- flex-shrink: 0;
321
- margin: 0;
322
-
323
- &:last-child {
324
- margin: 0;
325
- }
326
- }
327
- }
328
-
329
- // Content alignment modifiers (position content within button)
330
- // Button always keeps its horizontal padding (0.75rem on both sides)
331
- // These classes control content position and remove icon padding on aligned sides
332
-
333
- &--align-left {
334
- justify-content: flex-start;
335
-
336
- .pa-btn__icon {
337
- padding-left: 0;
338
- }
339
- }
340
-
341
- &--align-right {
342
- justify-content: flex-end;
343
-
344
- .pa-btn__icon {
345
- padding-right: 0;
346
- }
347
- }
348
-
349
- &--align-center {
350
- justify-content: center;
351
- }
352
-
353
- &--align-justify {
354
- justify-content: space-between;
355
-
356
- .pa-btn__icon:first-child {
357
- padding-left: 0;
358
- }
359
-
360
- // Remove padding from last element (text or icon)
361
- > *:last-child {
362
- padding-right: 0;
363
- }
364
- }
365
- }
366
-
367
- // Button Groups
368
- .pa-btn-group {
369
- display: inline-flex;
370
- gap: $btn-group-gap;
371
- flex-wrap: wrap;
372
- align-items: center;
373
-
374
- // === Direction Variants ===
375
- &--vertical {
376
- flex-direction: column;
377
- align-items: flex-start;
378
- }
379
-
380
- // === Vertical Alignment Variants ===
381
- &--vertical#{&}--center {
382
- align-items: center;
383
- }
384
-
385
- &--vertical#{&}--end {
386
- align-items: flex-end;
387
- }
388
-
389
- &--vertical#{&}--stretch {
390
- align-items: stretch;
391
-
392
- .pa-btn {
393
- width: 100%;
394
- }
395
- }
396
-
397
- // === Responsive Direction Modifiers ===
398
- @each $bp, $min-width in $grid-breakpoints {
399
- &--#{$bp}-vertical {
400
- @media (min-width: $min-width) {
401
- flex-direction: column;
402
- align-items: flex-start;
403
- }
404
- }
405
-
406
- &--#{$bp}-horizontal {
407
- @media (min-width: $min-width) {
408
- flex-direction: row;
409
- align-items: center;
410
- }
411
- }
412
- }
413
-
414
- // === No Wrap Variant ===
415
- &--nowrap {
416
- flex-wrap: nowrap;
417
- }
418
-
419
- // Ensure tooltips on buttons appear above siblings
420
- .pa-btn.pa-tooltip:hover {
421
- position: relative;
422
- z-index: $z-index-modal;
423
- }
424
- }
425
-
1
+ /* ========================================
2
+ Button Components
3
+ Buttons, button groups, sizes, colors, states, and icon buttons
4
+ ======================================== */
5
+ @use '../variables' as *;
6
+
7
+ // Buttons
8
+ .pa-btn {
9
+ display: inline-block;
10
+ height: $btn-height-base;
11
+ padding: $btn-padding-v $btn-padding-h;
12
+ border: $btn-border-width solid transparent;
13
+ border-radius: $border-radius;
14
+ font-size: $font-size-sm;
15
+ font-weight: $font-weight-medium;
16
+ text-align: center;
17
+ text-decoration: none;
18
+ cursor: pointer;
19
+ transition: all $transition-fast $easing-snappy;
20
+ background: none;
21
+ color: var(--pa-text-color-1);
22
+
23
+ &:hover {
24
+ transform: translateY($btn-hover-lift);
25
+ }
26
+
27
+ &--primary {
28
+ background-color: var(--pa-accent);
29
+ border-color: var(--pa-accent);
30
+ color: var(--pa-btn-primary-text);
31
+
32
+ &:hover {
33
+ background-color: var(--pa-accent);
34
+ filter: brightness($btn-hover-brightness);
35
+ }
36
+ }
37
+
38
+ &--secondary {
39
+ background-color: transparent;
40
+ border-color: var(--pa-border-color);
41
+ color: var(--pa-text-color-1);
42
+
43
+ &:hover {
44
+ background-color: var(--pa-main-bg);
45
+ border-color: var(--pa-accent);
46
+ }
47
+ }
48
+
49
+ &--xs {
50
+ height: $btn-height-xs;
51
+ padding: $btn-padding-xs-v $btn-padding-xs-h;
52
+ font-size: $font-size-xs;
53
+ }
54
+
55
+ &--sm {
56
+ height: $btn-height-sm;
57
+ padding: $btn-padding-sm-v $btn-padding-sm-h;
58
+ font-size: $font-size-sm;
59
+ }
60
+
61
+ &--lg {
62
+ height: $btn-height-lg;
63
+ padding: $btn-padding-lg-v $btn-padding-lg-h;
64
+ font-size: $font-size-base;
65
+ }
66
+
67
+ &--xl {
68
+ height: $btn-height-xl;
69
+ padding: $btn-padding-xl-v $btn-padding-xl-h;
70
+ font-size: $font-size-lg;
71
+ }
72
+
73
+ // Button variants (colors)
74
+ &--success {
75
+ background-color: var(--pa-btn-success-bg);
76
+ border-color: var(--pa-btn-success-bg);
77
+ color: var(--pa-btn-success-text);
78
+
79
+ &:hover {
80
+ background-color: var(--pa-btn-success-bg-hover);
81
+ border-color: var(--pa-btn-success-bg-hover);
82
+ }
83
+ }
84
+
85
+ &--warning {
86
+ background-color: var(--pa-btn-warning-bg);
87
+ border-color: var(--pa-btn-warning-bg);
88
+ color: var(--pa-btn-warning-text);
89
+
90
+ &:hover {
91
+ background-color: var(--pa-btn-warning-bg-hover);
92
+ border-color: var(--pa-btn-warning-bg-hover);
93
+ }
94
+ }
95
+
96
+ &--danger {
97
+ background-color: var(--pa-btn-danger-bg);
98
+ border-color: var(--pa-btn-danger-bg);
99
+ color: var(--pa-btn-danger-text);
100
+
101
+ &:hover {
102
+ background-color: var(--pa-btn-danger-bg-hover);
103
+ border-color: var(--pa-btn-danger-bg-hover);
104
+ }
105
+ }
106
+
107
+ &--info {
108
+ background-color: var(--pa-btn-info-bg);
109
+ border-color: var(--pa-btn-info-bg);
110
+ color: var(--pa-btn-info-text);
111
+
112
+ &:hover {
113
+ background-color: var(--pa-btn-info-bg-hover);
114
+ border-color: var(--pa-btn-info-bg-hover);
115
+ }
116
+ }
117
+
118
+ &--light {
119
+ background-color: var(--pa-btn-light-bg);
120
+ border-color: var(--pa-btn-light-bg);
121
+ color: var(--pa-btn-light-text);
122
+
123
+ &:hover {
124
+ background-color: var(--pa-btn-light-bg-hover);
125
+ border-color: var(--pa-btn-light-bg-hover);
126
+ }
127
+ }
128
+
129
+ &--dark {
130
+ background-color: var(--pa-btn-dark-bg);
131
+ border-color: var(--pa-btn-dark-bg);
132
+ color: var(--pa-btn-dark-text);
133
+
134
+ &:hover {
135
+ background-color: var(--pa-btn-dark-bg-hover);
136
+ border-color: var(--pa-btn-dark-bg-hover);
137
+ }
138
+ }
139
+
140
+ // Outline variants
141
+ &--outline-primary {
142
+ background-color: transparent;
143
+ border-color: var(--pa-accent);
144
+ color: var(--pa-accent);
145
+
146
+ &:hover {
147
+ background-color: var(--pa-accent);
148
+ color: var(--pa-btn-primary-text);
149
+ }
150
+ }
151
+
152
+ &--outline-secondary {
153
+ background-color: transparent;
154
+ border-color: var(--pa-btn-secondary-bg);
155
+ color: var(--pa-btn-secondary-bg);
156
+
157
+ &:hover {
158
+ background-color: var(--pa-btn-secondary-bg);
159
+ color: var(--pa-btn-secondary-text);
160
+ }
161
+ }
162
+
163
+ &--outline-success {
164
+ background-color: transparent;
165
+ border-color: var(--pa-btn-success-bg);
166
+ color: var(--pa-btn-success-bg);
167
+
168
+ &:hover {
169
+ background-color: var(--pa-btn-success-bg);
170
+ color: var(--pa-btn-success-text);
171
+ }
172
+ }
173
+
174
+ &--outline-warning {
175
+ background-color: transparent;
176
+ border-color: var(--pa-btn-warning-bg);
177
+ color: var(--pa-btn-warning-bg);
178
+
179
+ &:hover {
180
+ background-color: var(--pa-btn-warning-bg);
181
+ color: var(--pa-btn-warning-text);
182
+ }
183
+ }
184
+
185
+ &--outline-danger {
186
+ background-color: transparent;
187
+ border-color: var(--pa-btn-danger-bg);
188
+ color: var(--pa-btn-danger-bg);
189
+
190
+ &:hover {
191
+ background-color: var(--pa-btn-danger-bg);
192
+ color: var(--pa-btn-danger-text);
193
+ }
194
+ }
195
+
196
+ &--outline-info {
197
+ background-color: transparent;
198
+ border-color: var(--pa-btn-info-bg);
199
+ color: var(--pa-btn-info-bg);
200
+
201
+ &:hover {
202
+ background-color: var(--pa-btn-info-bg);
203
+ color: var(--pa-btn-info-text);
204
+ }
205
+ }
206
+
207
+ // Button states
208
+ &:disabled {
209
+ opacity: $btn-disabled-opacity;
210
+ cursor: not-allowed;
211
+ transform: none !important;
212
+ }
213
+
214
+ &--loading {
215
+ position: relative;
216
+ pointer-events: none;
217
+
218
+ .pa-btn__spinner {
219
+ position: absolute;
220
+ top: 0;
221
+ left: 0;
222
+ right: 0;
223
+ bottom: 0;
224
+ margin: auto;
225
+ width: $spinner-size;
226
+ height: $spinner-size;
227
+ border: $spinner-border-width solid transparent;
228
+ border-top: $spinner-border-width solid currentColor;
229
+ border-radius: 50%;
230
+ animation: pa-spin $animation-spin-duration linear infinite;
231
+ }
232
+ }
233
+
234
+ // Ripple effect
235
+ &--ripple {
236
+ position: relative;
237
+ overflow: hidden;
238
+
239
+ &::before {
240
+ content: '';
241
+ position: absolute;
242
+ top: 50%;
243
+ left: 50%;
244
+ width: 0;
245
+ height: 0;
246
+ border-radius: 50%;
247
+ background: $ripple-color;
248
+ transform: translate(-50%, -50%);
249
+ transition: width $ripple-transition-duration ease, height $ripple-transition-duration ease;
250
+ pointer-events: none;
251
+ }
252
+
253
+ &.pa-btn--ripple-active::before {
254
+ width: $ripple-size;
255
+ height: $ripple-size;
256
+ }
257
+ }
258
+
259
+ // Block button
260
+ &--block {
261
+ width: 100%;
262
+ display: block;
263
+ }
264
+
265
+ // Icon buttons
266
+ &--icon-only {
267
+ width: $btn-icon-only-size;
268
+ height: $btn-icon-only-size;
269
+ padding: 0;
270
+ display: flex;
271
+ align-items: center;
272
+ justify-content: center;
273
+ line-height: 1;
274
+
275
+ // Size-specific icon-only dimensions
276
+ &.pa-btn--xs {
277
+ width: $btn-icon-only-size-xs;
278
+ height: $btn-icon-only-size-xs;
279
+ }
280
+
281
+ &.pa-btn--sm {
282
+ width: $btn-icon-only-size-sm;
283
+ height: $btn-icon-only-size-sm;
284
+ }
285
+
286
+ &.pa-btn--lg {
287
+ width: $btn-icon-only-size-lg;
288
+ height: $btn-icon-only-size-lg;
289
+ }
290
+
291
+ &.pa-btn--xl {
292
+ width: $btn-icon-only-size-xl;
293
+ height: $btn-icon-only-size-xl;
294
+ }
295
+ }
296
+
297
+ &__icon {
298
+ margin-right: $btn-icon-margin;
299
+
300
+ &:last-child {
301
+ margin-right: 0;
302
+ margin-left: $btn-icon-margin;
303
+ }
304
+ }
305
+
306
+ // Buttons with icons align left like sidebar menu items
307
+ &:has(.pa-btn__icon) {
308
+ text-align: left;
309
+ display: inline-flex;
310
+ align-items: center;
311
+ gap: $spacing-sm;
312
+
313
+ .pa-btn__icon {
314
+ width: $sidebar-icon-size;
315
+ min-width: $sidebar-icon-size;
316
+ // No fixed height - let button padding control height
317
+ display: flex;
318
+ align-items: center;
319
+ justify-content: center;
320
+ flex-shrink: 0;
321
+ margin: 0;
322
+
323
+ &:last-child {
324
+ margin: 0;
325
+ }
326
+ }
327
+ }
328
+
329
+ // Content alignment modifiers (position content within button)
330
+ // Button always keeps its horizontal padding (0.75rem on both sides)
331
+ // These classes control content position and remove icon padding on aligned sides
332
+
333
+ &--align-left {
334
+ justify-content: flex-start;
335
+
336
+ .pa-btn__icon {
337
+ padding-left: 0;
338
+ }
339
+ }
340
+
341
+ &--align-right {
342
+ justify-content: flex-end;
343
+
344
+ .pa-btn__icon {
345
+ padding-right: 0;
346
+ }
347
+ }
348
+
349
+ &--align-center {
350
+ justify-content: center;
351
+ }
352
+
353
+ &--align-justify {
354
+ justify-content: space-between;
355
+
356
+ .pa-btn__icon:first-child {
357
+ padding-left: 0;
358
+ }
359
+
360
+ // Remove padding from last element (text or icon)
361
+ > *:last-child {
362
+ padding-right: 0;
363
+ }
364
+ }
365
+ }
366
+
367
+ // Button Groups
368
+ .pa-btn-group {
369
+ display: inline-flex;
370
+ gap: $btn-group-gap;
371
+ flex-wrap: wrap;
372
+ align-items: center;
373
+
374
+ // === Direction Variants ===
375
+ &--vertical {
376
+ flex-direction: column;
377
+ align-items: flex-start;
378
+ }
379
+
380
+ // === Vertical Alignment Variants ===
381
+ &--vertical#{&}--center {
382
+ align-items: center;
383
+ }
384
+
385
+ &--vertical#{&}--end {
386
+ align-items: flex-end;
387
+ }
388
+
389
+ &--vertical#{&}--stretch {
390
+ align-items: stretch;
391
+
392
+ .pa-btn {
393
+ width: 100%;
394
+ }
395
+ }
396
+
397
+ // === Responsive Direction Modifiers ===
398
+ @each $bp, $min-width in $grid-breakpoints {
399
+ &--#{$bp}-vertical {
400
+ @media (min-width: $min-width) {
401
+ flex-direction: column;
402
+ align-items: flex-start;
403
+ }
404
+ }
405
+
406
+ &--#{$bp}-horizontal {
407
+ @media (min-width: $min-width) {
408
+ flex-direction: row;
409
+ align-items: center;
410
+ }
411
+ }
412
+ }
413
+
414
+ // === No Wrap Variant ===
415
+ &--nowrap {
416
+ flex-wrap: nowrap;
417
+ }
418
+
419
+ // Ensure tooltips on buttons appear above siblings
420
+ .pa-btn.pa-tooltip:hover {
421
+ position: relative;
422
+ z-index: $z-index-modal;
423
+ }
424
+ }
425
+