@keenmate/pure-admin-core 2.3.0 → 2.3.2

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 (69) hide show
  1. package/README.md +7 -5
  2. package/dist/css/main.css +207 -181
  3. package/package.json +1 -1
  4. package/snippets/buttons.html +375 -365
  5. package/src/scss/_base-css-variables.scss +8 -0
  6. package/src/scss/_core.scss +121 -121
  7. package/src/scss/core-components/_alerts.scss +227 -227
  8. package/src/scss/core-components/_badges.scss +16 -16
  9. package/src/scss/core-components/_base.scss +125 -125
  10. package/src/scss/core-components/_buttons.scss +580 -548
  11. package/src/scss/core-components/_callouts.scss +152 -152
  12. package/src/scss/core-components/_cards.scss +488 -488
  13. package/src/scss/core-components/_checkbox-lists.scss +289 -289
  14. package/src/scss/core-components/_code.scss +141 -141
  15. package/src/scss/core-components/_command-palette.scss +509 -509
  16. package/src/scss/core-components/_comparison.scss +172 -172
  17. package/src/scss/core-components/_data-display.scss +9 -9
  18. package/src/scss/core-components/_data-viz.scss +9 -9
  19. package/src/scss/core-components/_detail-panel.scss +1 -1
  20. package/src/scss/core-components/_file-selector.scss +780 -780
  21. package/src/scss/core-components/_filter-card.scss +58 -58
  22. package/src/scss/core-components/_forms.scss +16 -16
  23. package/src/scss/core-components/_grid.scss +293 -293
  24. package/src/scss/core-components/_layout.scss +15 -15
  25. package/src/scss/core-components/_lists.scss +211 -211
  26. package/src/scss/core-components/_loaders.scss +277 -277
  27. package/src/scss/core-components/_logic-tree.scss +280 -280
  28. package/src/scss/core-components/_modals.scss +203 -203
  29. package/src/scss/core-components/_notifications.scss +320 -320
  30. package/src/scss/core-components/_pagers.scss +141 -141
  31. package/src/scss/core-components/_popconfirm.scss +170 -170
  32. package/src/scss/core-components/_profile.scss +405 -405
  33. package/src/scss/core-components/_scrollbars.scss +40 -40
  34. package/src/scss/core-components/_settings-panel.scss +141 -141
  35. package/src/scss/core-components/_statistics.scss +200 -201
  36. package/src/scss/core-components/_tables.scss +900 -900
  37. package/src/scss/core-components/_tabs.scss +504 -504
  38. package/src/scss/core-components/_timeline.scss +589 -589
  39. package/src/scss/core-components/_toasts.scss +425 -425
  40. package/src/scss/core-components/_tooltips.scss +605 -605
  41. package/src/scss/core-components/_utilities.scss +1 -1
  42. package/src/scss/core-components/_web-components-theme.scss +21 -21
  43. package/src/scss/core-components/badges/_badge-base.scss +121 -121
  44. package/src/scss/core-components/badges/_badge-group.scss +25 -25
  45. package/src/scss/core-components/badges/_composite-badge-variants.scss +396 -396
  46. package/src/scss/core-components/badges/_composite-badge.scss +70 -70
  47. package/src/scss/core-components/badges/_index.scss +10 -10
  48. package/src/scss/core-components/badges/_labels.scss +155 -155
  49. package/src/scss/core-components/forms/_checkboxes-radios.scss +205 -205
  50. package/src/scss/core-components/forms/_form-inputs.scss +136 -135
  51. package/src/scss/core-components/forms/_form-layout.scss +66 -66
  52. package/src/scss/core-components/forms/_form-states.scss +115 -115
  53. package/src/scss/core-components/forms/_index.scss +12 -12
  54. package/src/scss/core-components/forms/_input-groups.scss +154 -154
  55. package/src/scss/core-components/forms/_input-wrapper.scss +89 -89
  56. package/src/scss/core-components/forms/_query-editor.scss +313 -313
  57. package/src/scss/core-components/layout/_index.scss +11 -11
  58. package/src/scss/core-components/layout/_layout-container.scss +168 -168
  59. package/src/scss/core-components/layout/_layout-responsive.scss +99 -99
  60. package/src/scss/core-components/layout/_navbar-elements.scss +250 -250
  61. package/src/scss/core-components/layout/_navbar.scss +83 -83
  62. package/src/scss/core-components/layout/_sidebar-states.scss +237 -237
  63. package/src/scss/core-components/layout/_sidebar.scss +234 -234
  64. package/src/scss/main.scss +7 -7
  65. package/src/scss/utilities.scss +740 -740
  66. package/src/scss/variables/_base.scss +228 -228
  67. package/src/scss/variables/_components.scss +748 -748
  68. package/src/scss/variables/_layout.scss +65 -65
  69. package/src/scss/variables/_typography.scss +37 -37
@@ -1,548 +1,580 @@
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
- // Theme color slot variants (color-1 through color-9)
208
- @for $i from 1 through 9 {
209
- &--color-#{$i} {
210
- background-color: var(--pa-color-#{$i});
211
- border-color: var(--pa-color-#{$i});
212
- color: var(--pa-color-#{$i}-text);
213
-
214
- &:hover {
215
- filter: brightness($btn-hover-brightness);
216
- }
217
- }
218
-
219
- &--outline-color-#{$i} {
220
- background-color: transparent;
221
- border-color: var(--pa-color-#{$i});
222
- color: var(--pa-color-#{$i});
223
-
224
- &:hover {
225
- background-color: var(--pa-color-#{$i});
226
- color: var(--pa-color-#{$i}-text);
227
- }
228
- }
229
- }
230
-
231
- // Button states
232
- &:disabled {
233
- opacity: $btn-disabled-opacity;
234
- cursor: not-allowed;
235
- transform: none !important;
236
- }
237
-
238
- &--loading {
239
- position: relative;
240
- pointer-events: none;
241
- -webkit-text-fill-color: transparent; // Hide text but preserve layout and currentColor for spinner
242
- transition: none;
243
-
244
- .pa-btn__spinner {
245
- position: absolute;
246
- top: 0;
247
- left: 0;
248
- right: 0;
249
- bottom: 0;
250
- margin: auto;
251
- width: $spinner-size;
252
- height: $spinner-size;
253
- border: $spinner-border-width solid transparent;
254
- border-top: $spinner-border-width solid currentColor;
255
- border-radius: 50%;
256
- animation: pa-spin $animation-spin-duration linear infinite;
257
- }
258
- }
259
-
260
- // Ripple effect
261
- &--ripple {
262
- position: relative;
263
- overflow: hidden;
264
-
265
- &::before {
266
- content: '';
267
- position: absolute;
268
- top: 50%;
269
- left: 50%;
270
- width: 0;
271
- height: 0;
272
- border-radius: 50%;
273
- background: $ripple-color;
274
- transform: translate(-50%, -50%);
275
- transition: width $ripple-transition-duration ease, height $ripple-transition-duration ease;
276
- pointer-events: none;
277
- }
278
-
279
- &.pa-btn--ripple-active::before {
280
- width: $ripple-size;
281
- height: $ripple-size;
282
- }
283
- }
284
-
285
- // Block button
286
- &--block {
287
- width: 100%;
288
- display: block;
289
- }
290
-
291
- // Icon buttons
292
- &--icon-only {
293
- width: $btn-icon-only-size;
294
- height: $btn-icon-only-size;
295
- padding: 0;
296
- display: flex;
297
- align-items: center;
298
- justify-content: center;
299
- line-height: 1;
300
-
301
- // Size-specific icon-only dimensions
302
- &.pa-btn--xs {
303
- width: $btn-icon-only-size-xs;
304
- height: $btn-icon-only-size-xs;
305
- }
306
-
307
- &.pa-btn--sm {
308
- width: $btn-icon-only-size-sm;
309
- height: $btn-icon-only-size-sm;
310
- }
311
-
312
- &.pa-btn--lg {
313
- width: $btn-icon-only-size-lg;
314
- height: $btn-icon-only-size-lg;
315
- }
316
-
317
- &.pa-btn--xl {
318
- width: $btn-icon-only-size-xl;
319
- height: $btn-icon-only-size-xl;
320
- }
321
- }
322
-
323
- &__icon {
324
- margin-inline-end: $btn-icon-margin; // RTL: flips to margin-left
325
-
326
- &:last-child {
327
- margin-inline-end: 0;
328
- margin-inline-start: $btn-icon-margin; // RTL: flips to margin-right
329
- }
330
- }
331
-
332
- // Buttons with icons align to start like sidebar menu items
333
- &:has(.pa-btn__icon) {
334
- text-align: start; // RTL: flips to right
335
- display: inline-flex;
336
- align-items: center;
337
- gap: $spacing-sm;
338
-
339
- .pa-btn__icon {
340
- width: $sidebar-icon-size;
341
- min-width: $sidebar-icon-size;
342
- // No fixed height - let button padding control height
343
- display: flex;
344
- align-items: center;
345
- justify-content: center;
346
- flex-shrink: 0;
347
- margin: 0;
348
-
349
- &:last-child {
350
- margin: 0;
351
- }
352
- }
353
- }
354
-
355
- // Content alignment modifiers (position content within button)
356
- // Button always keeps its horizontal padding (0.75rem on both sides)
357
- // These classes control content position and remove icon padding on aligned sides
358
-
359
- &--align-start {
360
- justify-content: flex-start;
361
-
362
- .pa-btn__icon {
363
- padding-inline-start: 0; // RTL: flips to padding-right
364
- }
365
- }
366
-
367
- &--align-end {
368
- justify-content: flex-end;
369
-
370
- .pa-btn__icon {
371
- padding-inline-end: 0; // RTL: flips to padding-left
372
- }
373
- }
374
-
375
- &--align-center {
376
- justify-content: center;
377
- }
378
-
379
- &--align-justify {
380
- justify-content: space-between;
381
-
382
- .pa-btn__icon:first-child {
383
- padding-inline-start: 0; // RTL: flips to padding-right
384
- }
385
-
386
- // Remove padding from last element (text or icon)
387
- > *:last-child {
388
- padding-inline-end: 0; // RTL: flips to padding-left
389
- }
390
- }
391
- }
392
-
393
- // Button Groups
394
- .pa-btn-group {
395
- display: inline-flex;
396
- gap: $btn-group-gap;
397
- flex-wrap: wrap;
398
- align-items: center;
399
-
400
- // === Direction Variants ===
401
- &--vertical {
402
- flex-direction: column;
403
- align-items: flex-start;
404
- }
405
-
406
- // === Vertical Alignment Variants ===
407
- &--vertical#{&}--center {
408
- align-items: center;
409
- }
410
-
411
- &--vertical#{&}--end {
412
- align-items: flex-end;
413
- }
414
-
415
- &--vertical#{&}--stretch {
416
- align-items: stretch;
417
-
418
- .pa-btn {
419
- width: 100%;
420
- }
421
- }
422
-
423
- // === Responsive Direction Modifiers ===
424
- @each $bp, $min-width in $grid-breakpoints {
425
- &--#{$bp}-vertical {
426
- @media (min-width: $min-width) {
427
- flex-direction: column;
428
- align-items: flex-start;
429
- }
430
- }
431
-
432
- &--#{$bp}-horizontal {
433
- @media (min-width: $min-width) {
434
- flex-direction: row;
435
- align-items: center;
436
- }
437
- }
438
- }
439
-
440
- // === No Wrap Variant ===
441
- &--nowrap {
442
- flex-wrap: nowrap;
443
- }
444
-
445
- // Ensure tooltips on buttons appear above siblings
446
- .pa-btn.pa-tooltip:hover {
447
- position: relative;
448
- z-index: $z-index-modal;
449
- }
450
-
451
- }
452
-
453
- // === Split Button (primary action + dropdown toggle) ===
454
- .pa-btn-split {
455
- position: relative;
456
- display: inline-flex;
457
-
458
- // RTL: reverse order so toggle is on inline-start side
459
- [dir="rtl"] & {
460
- flex-direction: row-reverse;
461
- }
462
-
463
- // Joined buttons with no gap
464
- .pa-btn {
465
- border-radius: 0;
466
-
467
- &:first-child {
468
- border-start-start-radius: $border-radius;
469
- border-end-start-radius: $border-radius;
470
- border-inline-end: none;
471
- }
472
- }
473
-
474
- // Toggle button (chevron) - fixed square width
475
- &__toggle {
476
- border-start-end-radius: $border-radius;
477
- border-end-end-radius: $border-radius;
478
- border-inline-start: $border-width-base solid rgba(255, 255, 255, 0.25);
479
- border-inline-end: none;
480
- padding-inline: 0;
481
- display: inline-flex;
482
- align-items: center;
483
- justify-content: center;
484
- width: $btn-height-base;
485
- min-width: $btn-height-base;
486
-
487
- &.pa-btn--xs { width: $btn-height-xs; min-width: $btn-height-xs; }
488
- &.pa-btn--sm { width: $btn-height-sm; min-width: $btn-height-sm; }
489
- &.pa-btn--lg { width: $btn-height-lg; min-width: $btn-height-lg; }
490
- &.pa-btn--xl { width: $btn-height-xl; min-width: $btn-height-xl; }
491
- }
492
-
493
- // Chevron icon - opt-in rotation on open
494
- &__chevron {
495
- transition: transform $transition-fast $easing-snappy;
496
- }
497
-
498
- &--open &__chevron {
499
- transform: rotate(180deg);
500
- }
501
-
502
- // Dropdown menu (moved to body and positioned by Floating UI)
503
- &__menu {
504
- display: none;
505
- position: fixed;
506
- top: 0;
507
- left: 0;
508
- width: max-content;
509
- background: var(--pa-card-bg);
510
- border: $border-width-base solid var(--pa-border-color);
511
- border-radius: $border-radius;
512
- box-shadow: $shadow-2xl;
513
- z-index: $z-index-dropdown;
514
- padding: $spacing-xs 0;
515
-
516
- &--open {
517
- display: block;
518
- }
519
- }
520
-
521
- // Menu items
522
- &__item {
523
- display: block;
524
- width: 100%;
525
- padding: $spacing-sm $spacing-base;
526
- border: none;
527
- background: none;
528
- text-align: start;
529
- font-size: $font-size-sm;
530
- color: var(--pa-text-color);
531
- cursor: pointer;
532
- white-space: nowrap;
533
-
534
- &:hover {
535
- background-color: var(--pa-accent-hover);
536
- }
537
-
538
- &--danger {
539
- color: var(--pa-btn-danger-bg);
540
-
541
- &:hover {
542
- background-color: var(--pa-btn-danger-bg);
543
- color: var(--pa-btn-danger-text);
544
- }
545
- }
546
- }
547
- }
548
-
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
+ vertical-align: middle;
11
+ height: $btn-height-base;
12
+ padding: $btn-padding-v $btn-padding-h;
13
+ border: $btn-border-width solid transparent;
14
+ border-radius: var(--pa-border-radius);
15
+ font-size: $font-size-sm;
16
+ font-weight: $font-weight-medium;
17
+ text-align: center;
18
+ text-decoration: none;
19
+ cursor: pointer;
20
+ transition: all $transition-fast $easing-snappy;
21
+ background: none;
22
+ color: var(--pa-text-color-1);
23
+
24
+
25
+ &--primary {
26
+ background-color: var(--pa-accent);
27
+ border-color: var(--pa-accent);
28
+ color: var(--pa-btn-primary-text);
29
+
30
+ &:hover {
31
+ background-color: var(--pa-accent);
32
+ filter: brightness($btn-hover-brightness);
33
+ }
34
+ }
35
+
36
+ &--secondary {
37
+ background-color: transparent;
38
+ border-color: var(--pa-border-color);
39
+ color: var(--pa-text-color-1);
40
+
41
+ &:hover {
42
+ background-color: var(--pa-main-bg);
43
+ border-color: var(--pa-accent);
44
+ }
45
+ }
46
+
47
+ &--xs {
48
+ height: $btn-height-xs;
49
+ padding: $btn-padding-xs-v $btn-padding-xs-h;
50
+ font-size: $font-size-xs;
51
+ }
52
+
53
+ &--sm {
54
+ height: $btn-height-sm;
55
+ padding: $btn-padding-sm-v $btn-padding-sm-h;
56
+ font-size: $font-size-sm;
57
+ }
58
+
59
+ &--lg {
60
+ height: $btn-height-lg;
61
+ padding: $btn-padding-lg-v $btn-padding-lg-h;
62
+ font-size: $font-size-base;
63
+ }
64
+
65
+ &--xl {
66
+ height: $btn-height-xl;
67
+ padding: $btn-padding-xl-v $btn-padding-xl-h;
68
+ font-size: $font-size-lg;
69
+ }
70
+
71
+ // Button variants (colors)
72
+ &--success {
73
+ background-color: var(--pa-btn-success-bg);
74
+ border-color: var(--pa-btn-success-bg);
75
+ color: var(--pa-btn-success-text);
76
+
77
+ &:hover {
78
+ background-color: var(--pa-btn-success-bg-hover);
79
+ border-color: var(--pa-btn-success-bg-hover);
80
+ }
81
+ }
82
+
83
+ &--warning {
84
+ background-color: var(--pa-btn-warning-bg);
85
+ border-color: var(--pa-btn-warning-bg);
86
+ color: var(--pa-btn-warning-text);
87
+
88
+ &:hover {
89
+ background-color: var(--pa-btn-warning-bg-hover);
90
+ border-color: var(--pa-btn-warning-bg-hover);
91
+ }
92
+ }
93
+
94
+ &--danger {
95
+ background-color: var(--pa-btn-danger-bg);
96
+ border-color: var(--pa-btn-danger-bg);
97
+ color: var(--pa-btn-danger-text);
98
+
99
+ &:hover {
100
+ background-color: var(--pa-btn-danger-bg-hover);
101
+ border-color: var(--pa-btn-danger-bg-hover);
102
+ }
103
+ }
104
+
105
+ &--info {
106
+ background-color: var(--pa-btn-info-bg);
107
+ border-color: var(--pa-btn-info-bg);
108
+ color: var(--pa-btn-info-text);
109
+
110
+ &:hover {
111
+ background-color: var(--pa-btn-info-bg-hover);
112
+ border-color: var(--pa-btn-info-bg-hover);
113
+ }
114
+ }
115
+
116
+ &--light {
117
+ background-color: var(--pa-btn-light-bg);
118
+ border-color: var(--pa-btn-light-bg);
119
+ color: var(--pa-btn-light-text);
120
+
121
+ &:hover {
122
+ background-color: var(--pa-btn-light-bg-hover);
123
+ border-color: var(--pa-btn-light-bg-hover);
124
+ }
125
+ }
126
+
127
+ &--dark {
128
+ background-color: var(--pa-btn-dark-bg);
129
+ border-color: var(--pa-btn-dark-bg);
130
+ color: var(--pa-btn-dark-text);
131
+
132
+ &:hover {
133
+ background-color: var(--pa-btn-dark-bg-hover);
134
+ border-color: var(--pa-btn-dark-bg-hover);
135
+ }
136
+ }
137
+
138
+ // Outline variants
139
+ &--outline-primary {
140
+ background-color: transparent;
141
+ border-color: var(--pa-accent);
142
+ color: var(--pa-accent);
143
+
144
+ &:hover {
145
+ background-color: var(--pa-accent);
146
+ color: var(--pa-btn-primary-text);
147
+ }
148
+ }
149
+
150
+ &--outline-secondary {
151
+ background-color: transparent;
152
+ border-color: var(--pa-btn-secondary-outline-color);
153
+ color: var(--pa-btn-secondary-outline-color);
154
+
155
+ &:hover {
156
+ background-color: var(--pa-btn-secondary-bg);
157
+ color: var(--pa-btn-secondary-text);
158
+ }
159
+ }
160
+
161
+ &--outline-success {
162
+ background-color: transparent;
163
+ border-color: var(--pa-btn-success-bg);
164
+ color: var(--pa-btn-success-bg);
165
+
166
+ &:hover {
167
+ background-color: var(--pa-btn-success-bg);
168
+ color: var(--pa-btn-success-text);
169
+ }
170
+ }
171
+
172
+ &--outline-warning {
173
+ background-color: transparent;
174
+ border-color: var(--pa-btn-warning-bg);
175
+ color: var(--pa-btn-warning-bg);
176
+
177
+ &:hover {
178
+ background-color: var(--pa-btn-warning-bg);
179
+ color: var(--pa-btn-warning-text);
180
+ }
181
+ }
182
+
183
+ &--outline-danger {
184
+ background-color: transparent;
185
+ border-color: var(--pa-btn-danger-bg);
186
+ color: var(--pa-btn-danger-bg);
187
+
188
+ &:hover {
189
+ background-color: var(--pa-btn-danger-bg);
190
+ color: var(--pa-btn-danger-text);
191
+ }
192
+ }
193
+
194
+ &--outline-info {
195
+ background-color: transparent;
196
+ border-color: var(--pa-btn-info-bg);
197
+ color: var(--pa-btn-info-bg);
198
+
199
+ &:hover {
200
+ background-color: var(--pa-btn-info-bg);
201
+ color: var(--pa-btn-info-text);
202
+ }
203
+ }
204
+
205
+ // Theme color slot variants (color-1 through color-9)
206
+ @for $i from 1 through 9 {
207
+ &--color-#{$i} {
208
+ background-color: var(--pa-color-#{$i});
209
+ border-color: var(--pa-color-#{$i});
210
+ color: var(--pa-color-#{$i}-text);
211
+
212
+ &:hover {
213
+ filter: brightness($btn-hover-brightness);
214
+ }
215
+ }
216
+
217
+ &--outline-color-#{$i} {
218
+ background-color: transparent;
219
+ border-color: var(--pa-color-#{$i});
220
+ color: var(--pa-color-#{$i});
221
+
222
+ &:hover {
223
+ background-color: var(--pa-color-#{$i});
224
+ color: var(--pa-color-#{$i}-text);
225
+ }
226
+ }
227
+ }
228
+
229
+ // Button states
230
+ &:disabled {
231
+ opacity: $btn-disabled-opacity;
232
+ cursor: not-allowed;
233
+ transform: none !important;
234
+ }
235
+
236
+ &--loading {
237
+ position: relative;
238
+ pointer-events: none;
239
+ -webkit-text-fill-color: transparent; // Hide text but preserve layout and currentColor for spinner
240
+ transition: none;
241
+
242
+ .pa-btn__spinner {
243
+ position: absolute;
244
+ top: 0;
245
+ left: 0;
246
+ right: 0;
247
+ bottom: 0;
248
+ margin: auto;
249
+ width: $spinner-size;
250
+ height: $spinner-size;
251
+ border: $spinner-border-width solid transparent;
252
+ border-top: $spinner-border-width solid currentColor;
253
+ border-radius: 50%;
254
+ animation: pa-spin $animation-spin-duration linear infinite;
255
+ }
256
+ }
257
+
258
+ // Ripple effect
259
+ &--ripple {
260
+ position: relative;
261
+ overflow: hidden;
262
+
263
+ &::before {
264
+ content: '';
265
+ position: absolute;
266
+ top: 50%;
267
+ left: 50%;
268
+ width: 0;
269
+ height: 0;
270
+ border-radius: 50%;
271
+ background: $ripple-color;
272
+ transform: translate(-50%, -50%);
273
+ transition: width $ripple-transition-duration ease, height $ripple-transition-duration ease;
274
+ pointer-events: none;
275
+ }
276
+
277
+ &.pa-btn--ripple-active::before {
278
+ width: $ripple-size;
279
+ height: $ripple-size;
280
+ }
281
+ }
282
+
283
+ // Block button
284
+ &--block {
285
+ width: 100%;
286
+ display: block;
287
+ }
288
+
289
+ // Icon buttons
290
+ &--icon-only {
291
+ width: $btn-icon-only-size;
292
+ height: $btn-icon-only-size;
293
+ padding: 0;
294
+ display: flex;
295
+ align-items: center;
296
+ justify-content: center;
297
+ line-height: 1;
298
+
299
+ // Size-specific icon-only dimensions
300
+ &.pa-btn--xs {
301
+ width: $btn-icon-only-size-xs;
302
+ height: $btn-icon-only-size-xs;
303
+ }
304
+
305
+ &.pa-btn--sm {
306
+ width: $btn-icon-only-size-sm;
307
+ height: $btn-icon-only-size-sm;
308
+ }
309
+
310
+ &.pa-btn--lg {
311
+ width: $btn-icon-only-size-lg;
312
+ height: $btn-icon-only-size-lg;
313
+ }
314
+
315
+ &.pa-btn--xl {
316
+ width: $btn-icon-only-size-xl;
317
+ height: $btn-icon-only-size-xl;
318
+ }
319
+ }
320
+
321
+ &__icon {
322
+ margin-inline-end: $btn-icon-margin; // RTL: flips to margin-left
323
+
324
+ &:last-child {
325
+ margin-inline-end: 0;
326
+ margin-inline-start: $btn-icon-margin; // RTL: flips to margin-right
327
+ }
328
+ }
329
+
330
+ &__label {
331
+ flex: 0 1 auto;
332
+ }
333
+
334
+ // Buttons with icons align to start like sidebar menu items
335
+ &:has(.pa-btn__icon) {
336
+ text-align: start; // RTL: flips to right
337
+ display: inline-flex;
338
+ align-items: center;
339
+ gap: $spacing-sm;
340
+
341
+ .pa-btn__icon {
342
+ width: $sidebar-icon-size;
343
+ min-width: $sidebar-icon-size;
344
+ // No fixed height - let button padding control height
345
+ display: flex;
346
+ align-items: center;
347
+ justify-content: center;
348
+ flex-shrink: 0;
349
+ margin: 0;
350
+
351
+ &:last-child {
352
+ margin: 0;
353
+ }
354
+ }
355
+ }
356
+
357
+ // Content alignment modifiers (position content within button)
358
+ // Button always keeps its horizontal padding (0.75rem on both sides)
359
+ // These classes control content position and remove icon padding on aligned sides
360
+
361
+ &--align-start {
362
+ justify-content: flex-start;
363
+
364
+ .pa-btn__icon {
365
+ padding-inline-start: 0; // RTL: flips to padding-right
366
+ }
367
+ }
368
+
369
+ &--align-end {
370
+ justify-content: flex-end;
371
+
372
+ .pa-btn__icon {
373
+ padding-inline-end: 0; // RTL: flips to padding-left
374
+ }
375
+ }
376
+
377
+ &--align-center {
378
+ justify-content: center;
379
+
380
+ .pa-btn__label {
381
+ flex: 1;
382
+ text-align: center;
383
+ }
384
+ }
385
+
386
+ &--align-justify {
387
+ justify-content: space-between;
388
+
389
+ .pa-btn__icon:first-child {
390
+ padding-inline-start: 0; // RTL: flips to padding-right
391
+ }
392
+
393
+ // Remove padding from last element (text or icon)
394
+ > *:last-child {
395
+ padding-inline-end: 0; // RTL: flips to padding-left
396
+ }
397
+ }
398
+ }
399
+
400
+ // Button Groups
401
+ .pa-btn-group {
402
+ display: inline-flex;
403
+ gap: $btn-group-gap;
404
+ flex-wrap: wrap;
405
+ align-items: center;
406
+
407
+ // === Direction Variants ===
408
+ &--vertical {
409
+ flex-direction: column;
410
+ align-items: flex-start;
411
+ }
412
+
413
+ // === Vertical Alignment Variants ===
414
+ &--vertical#{&}--center {
415
+ align-items: center;
416
+ }
417
+
418
+ &--vertical#{&}--end {
419
+ align-items: flex-end;
420
+ }
421
+
422
+ &--vertical#{&}--stretch {
423
+ align-items: stretch;
424
+
425
+ .pa-btn {
426
+ width: 100%;
427
+ }
428
+ }
429
+
430
+ // === Responsive Direction Modifiers ===
431
+ @each $bp, $min-width in $grid-breakpoints {
432
+ &--#{$bp}-vertical {
433
+ @media (min-width: $min-width) {
434
+ flex-direction: column;
435
+ align-items: flex-start;
436
+ }
437
+ }
438
+
439
+ &--#{$bp}-horizontal {
440
+ @media (min-width: $min-width) {
441
+ flex-direction: row;
442
+ align-items: center;
443
+ }
444
+ }
445
+ }
446
+
447
+ // === No Wrap Variant ===
448
+ &--nowrap {
449
+ flex-wrap: nowrap;
450
+ }
451
+
452
+ // Ensure tooltips on buttons appear above siblings
453
+ .pa-btn.pa-tooltip:hover {
454
+ position: relative;
455
+ z-index: $z-index-modal;
456
+ }
457
+
458
+ }
459
+
460
+ // === Split Button (primary action + dropdown toggle) ===
461
+ .pa-btn-split {
462
+ position: relative;
463
+ display: inline-flex;
464
+ border-radius: var(--pa-border-radius);
465
+ overflow: hidden;
466
+
467
+ // All buttons inside: no individual radius — container handles corners
468
+ .pa-btn {
469
+ border-radius: 0;
470
+
471
+ &:first-child {
472
+ border-inline-end: none;
473
+ }
474
+ }
475
+
476
+ // Toggle button (chevron) - fixed square width
477
+ &__toggle {
478
+ border-inline-start: $border-width-base solid rgba(255, 255, 255, 0.25);
479
+ padding-inline: 0;
480
+ display: inline-flex;
481
+ align-items: center;
482
+ justify-content: center;
483
+ width: $btn-height-base;
484
+ min-width: $btn-height-base;
485
+
486
+ &.pa-btn--xs { width: $btn-height-xs; min-width: $btn-height-xs; }
487
+ &.pa-btn--sm { width: $btn-height-sm; min-width: $btn-height-sm; }
488
+ &.pa-btn--lg { width: $btn-height-lg; min-width: $btn-height-lg; }
489
+ &.pa-btn--xl { width: $btn-height-xl; min-width: $btn-height-xl; }
490
+ }
491
+
492
+ // Chevron icon - opt-in rotation on open
493
+ &__chevron {
494
+ transition: transform $transition-fast $easing-snappy;
495
+ }
496
+
497
+ &--open &__chevron {
498
+ transform: rotate(180deg);
499
+ }
500
+
501
+ // Dropdown menu (moved to body and positioned by Floating UI)
502
+ &__menu {
503
+ display: none;
504
+ position: fixed;
505
+ top: 0;
506
+ left: 0;
507
+ width: max-content;
508
+ background: var(--pa-card-bg);
509
+ border: $border-width-base solid var(--pa-border-color);
510
+ border-radius: var(--pa-border-radius);
511
+ box-shadow: $shadow-2xl;
512
+ z-index: $z-index-dropdown;
513
+ overflow: hidden;
514
+
515
+ &--open {
516
+ display: block;
517
+ }
518
+ }
519
+
520
+ &__menu-inner {
521
+ display: flex;
522
+ flex-direction: column;
523
+ gap: $spacing-xs;
524
+ }
525
+
526
+ // Menu items
527
+ &__item {
528
+ display: flex;
529
+ align-items: center;
530
+ gap: $spacing-sm;
531
+ width: 100%;
532
+ padding: $spacing-sm $spacing-base;
533
+ border: none;
534
+ background: none;
535
+ text-align: start;
536
+ font-size: $font-size-sm;
537
+ color: var(--pa-text-color);
538
+ cursor: pointer;
539
+ white-space: nowrap;
540
+
541
+ &:hover {
542
+ background-color: var(--pa-accent-hover);
543
+ }
544
+
545
+ &--danger {
546
+ color: var(--pa-btn-danger-bg);
547
+
548
+ &:hover {
549
+ background-color: var(--pa-btn-danger-bg);
550
+ color: var(--pa-btn-danger-text);
551
+ }
552
+ }
553
+ }
554
+
555
+ // Row with item + action button (e.g. delete)
556
+ &__item-row {
557
+ display: flex;
558
+ align-items: center;
559
+
560
+ .pa-btn-split__item {
561
+ flex: 1;
562
+ }
563
+
564
+ > .pa-btn:last-child {
565
+ flex-shrink: 0;
566
+ margin-inline-end: $spacing-sm;
567
+ }
568
+ }
569
+
570
+ &__item-icon {
571
+ width: $sidebar-icon-size;
572
+ min-width: $sidebar-icon-size;
573
+ display: flex;
574
+ align-items: center;
575
+ justify-content: center;
576
+ flex-shrink: 0;
577
+ opacity: 0.7;
578
+ }
579
+ }
580
+