@keenmate/pure-admin-core 2.3.1 → 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 +5 -5
  2. package/dist/css/main.css +187 -178
  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 +31 -16
  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 +3 -3
  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,605 +1,605 @@
1
- /* ========================================
2
- Tooltip and Popover Components
3
- Tooltips with multiple positions and popovers with rich content
4
- ======================================== */
5
- @use '../variables' as *;
6
-
7
- @use "sass:color";
8
-
9
- // Tooltips
10
- .pa-tooltip {
11
- position: relative;
12
- display: inline-block;
13
-
14
- // Elevate z-index on hover to appear above siblings
15
- &:hover {
16
- z-index: $z-index-modal;
17
- }
18
-
19
- // Help cursor modifier - use for informational tooltips
20
- &--help {
21
- cursor: help;
22
- }
23
-
24
- // Keyword modifier - dotted underline for inline term explanations
25
- &--keyword {
26
- border-bottom: $border-width-base dotted currentColor;
27
- cursor: help;
28
- }
29
-
30
- &::before,
31
- &::after {
32
- position: absolute;
33
- opacity: 0;
34
- pointer-events: none;
35
- transition: opacity $transition-normal $easing-smooth, transform $transition-normal $easing-smooth;
36
- z-index: $tooltip-z-index;
37
- }
38
-
39
- // Tooltip content
40
- &::before {
41
- content: attr(data-tooltip);
42
- background-color: var(--pa-tooltip-bg);
43
- color: var(--pa-tooltip-text);
44
- padding: $spacing-xs $spacing-sm;
45
- border-radius: $border-radius;
46
- font-size: $font-size-xs;
47
- white-space: nowrap;
48
- max-width: $tooltip-max-width;
49
- text-align: center;
50
- overflow: hidden;
51
- text-overflow: ellipsis;
52
- }
53
-
54
- // Multiline tooltip variant
55
- &--multiline::before {
56
- white-space: normal;
57
- text-align: start; // RTL: flips to right
58
- width: $tooltip-multiline-width;
59
- max-width: $tooltip-multiline-width;
60
- line-height: $line-height-base;
61
- }
62
-
63
- // Tooltip arrow
64
- &::after {
65
- content: '';
66
- border: $tooltip-arrow-size solid transparent;
67
- }
68
-
69
- // Show on hover
70
- &:hover::before,
71
- &:hover::after {
72
- opacity: 1;
73
- }
74
-
75
- // Disable CSS tooltip when JS floating tooltip is active (prevents double tooltips)
76
- &--floating::before,
77
- &--floating::after {
78
- display: none !important;
79
- }
80
-
81
- // Top position (default)
82
- &::before {
83
- bottom: calc(100% + $tooltip-distance);
84
- left: 50%;
85
- transform: translateX(-50%) translateY(-$tooltip-offset);
86
- }
87
-
88
- &::after {
89
- bottom: calc(100% + ($tooltip-arrow-size - 2px));
90
- left: 50%;
91
- transform: translateX(-50%) translateY(-$tooltip-offset);
92
- border-top-color: var(--pa-tooltip-bg);
93
- }
94
-
95
- &:hover::before,
96
- &:hover::after {
97
- transform: translateX(-50%) translateY(0);
98
- }
99
-
100
- // End position (inline-end: right in LTR, left in RTL)
101
- &--end::before {
102
- bottom: auto;
103
- left: auto;
104
- inset-inline-start: calc(100% + $tooltip-distance);
105
- top: 50%;
106
- transform: translateX(-$tooltip-offset) translateY(-50%);
107
- }
108
-
109
- &--end::after {
110
- bottom: auto;
111
- left: auto;
112
- inset-inline-start: calc(100% + ($tooltip-arrow-size - 2px));
113
- top: 50%;
114
- transform: translateX(-$tooltip-offset) translateY(-50%);
115
- border-top-color: transparent;
116
- border-inline-end-color: var(--pa-tooltip-bg);
117
- }
118
-
119
- &--end:hover::before,
120
- &--end:hover::after {
121
- transform: translateX(0) translateY(-50%);
122
- }
123
-
124
- // RTL: reverse slide direction for end position
125
- [dir="rtl"] &--end::before,
126
- [dir="rtl"] &--end::after {
127
- transform: translateX($tooltip-offset) translateY(-50%);
128
- }
129
-
130
- [dir="rtl"] &--end:hover::before,
131
- [dir="rtl"] &--end:hover::after {
132
- transform: translateX(0) translateY(-50%);
133
- }
134
-
135
- // Bottom position
136
- &--bottom::before {
137
- bottom: auto;
138
- top: calc(100% + $tooltip-distance);
139
- left: 50%;
140
- transform: translateX(-50%) translateY($tooltip-offset);
141
- }
142
-
143
- &--bottom::after {
144
- bottom: auto;
145
- top: calc(100% + ($tooltip-arrow-size - 2px));
146
- left: 50%;
147
- transform: translateX(-50%) translateY($tooltip-offset);
148
- border-top-color: transparent;
149
- border-bottom-color: var(--pa-tooltip-bg);
150
- }
151
-
152
- &--bottom:hover::before,
153
- &--bottom:hover::after {
154
- transform: translateX(-50%) translateY(0);
155
- }
156
-
157
- // Start position (inline-start: left in LTR, right in RTL)
158
- &--start::before {
159
- bottom: auto;
160
- left: auto;
161
- inset-inline-end: calc(100% + $tooltip-distance);
162
- top: 50%;
163
- transform: translateX($tooltip-offset) translateY(-50%);
164
- }
165
-
166
- &--start::after {
167
- bottom: auto;
168
- left: auto;
169
- inset-inline-end: calc(100% + ($tooltip-arrow-size - 2px));
170
- top: 50%;
171
- transform: translateX($tooltip-offset) translateY(-50%);
172
- border-top-color: transparent;
173
- border-inline-start-color: var(--pa-tooltip-bg);
174
- }
175
-
176
- &--start:hover::before,
177
- &--start:hover::after {
178
- transform: translateX(0) translateY(-50%);
179
- }
180
-
181
- // RTL: reverse slide direction for start position
182
- [dir="rtl"] &--start::before,
183
- [dir="rtl"] &--start::after {
184
- transform: translateX(-$tooltip-offset) translateY(-50%);
185
- }
186
-
187
- [dir="rtl"] &--start:hover::before,
188
- [dir="rtl"] &--start:hover::after {
189
- transform: translateX(0) translateY(-50%);
190
- }
191
-
192
- // Color variants
193
- &--primary::before {
194
- background-color: var(--pa-btn-primary-bg);
195
- }
196
- &--primary::after {
197
- border-top-color: var(--pa-btn-primary-bg);
198
- }
199
- &--primary.pa-tooltip--end::after {
200
- border-top-color: transparent;
201
- border-inline-end-color: var(--pa-btn-primary-bg);
202
- }
203
- &--primary.pa-tooltip--bottom::after {
204
- border-top-color: transparent;
205
- border-bottom-color: var(--pa-btn-primary-bg);
206
- }
207
- &--primary.pa-tooltip--start::after {
208
- border-top-color: transparent;
209
- border-inline-start-color: var(--pa-btn-primary-bg);
210
- }
211
-
212
- &--success::before {
213
- background-color: var(--pa-btn-success-bg);
214
- }
215
- &--success::after {
216
- border-top-color: var(--pa-btn-success-bg);
217
- }
218
- &--success.pa-tooltip--end::after {
219
- border-top-color: transparent;
220
- border-inline-end-color: var(--pa-btn-success-bg);
221
- }
222
- &--success.pa-tooltip--bottom::after {
223
- border-top-color: transparent;
224
- border-bottom-color: var(--pa-btn-success-bg);
225
- }
226
- &--success.pa-tooltip--start::after {
227
- border-top-color: transparent;
228
- border-inline-start-color: var(--pa-btn-success-bg);
229
- }
230
-
231
- &--warning::before {
232
- background-color: var(--pa-btn-warning-bg);
233
- color: var(--pa-text-color-1);
234
- }
235
- &--warning::after {
236
- border-top-color: var(--pa-btn-warning-bg);
237
- }
238
- &--warning.pa-tooltip--end::after {
239
- border-top-color: transparent;
240
- border-inline-end-color: var(--pa-btn-warning-bg);
241
- }
242
- &--warning.pa-tooltip--bottom::after {
243
- border-top-color: transparent;
244
- border-bottom-color: var(--pa-btn-warning-bg);
245
- }
246
- &--warning.pa-tooltip--start::after {
247
- border-top-color: transparent;
248
- border-inline-start-color: var(--pa-btn-warning-bg);
249
- }
250
-
251
- &--danger::before {
252
- background-color: var(--pa-btn-danger-bg);
253
- }
254
- &--danger::after {
255
- border-top-color: var(--pa-btn-danger-bg);
256
- }
257
- &--danger.pa-tooltip--end::after {
258
- border-top-color: transparent;
259
- border-inline-end-color: var(--pa-btn-danger-bg);
260
- }
261
- &--danger.pa-tooltip--bottom::after {
262
- border-top-color: transparent;
263
- border-bottom-color: var(--pa-btn-danger-bg);
264
- }
265
- &--danger.pa-tooltip--start::after {
266
- border-top-color: transparent;
267
- border-inline-start-color: var(--pa-btn-danger-bg);
268
- }
269
-
270
- // Numbered color variants (color-1 through color-9)
271
- // These use theme-customizable colors from --pa-color-* CSS variables
272
- @for $i from 1 through 9 {
273
- &--color-#{$i}::before {
274
- background-color: var(--pa-color-#{$i});
275
- color: var(--pa-color-#{$i}-text);
276
- }
277
- &--color-#{$i}::after {
278
- border-top-color: var(--pa-color-#{$i});
279
- }
280
- &--color-#{$i}.pa-tooltip--end::after {
281
- border-top-color: transparent;
282
- border-inline-end-color: var(--pa-color-#{$i});
283
- }
284
- &--color-#{$i}.pa-tooltip--bottom::after {
285
- border-top-color: transparent;
286
- border-bottom-color: var(--pa-color-#{$i});
287
- }
288
- &--color-#{$i}.pa-tooltip--start::after {
289
- border-top-color: transparent;
290
- border-inline-start-color: var(--pa-color-#{$i});
291
- }
292
- }
293
-
294
- // Smart positioning - collision detection adjustments
295
- // Applied dynamically by JavaScript based on viewport boundaries
296
-
297
- // Auto-flip from top to bottom
298
- &--auto-flip-bottom::before {
299
- bottom: auto !important;
300
- top: calc(100% + $tooltip-distance) !important;
301
- transform: translateX(-50%) translateY($tooltip-offset) !important;
302
- }
303
-
304
- &--auto-flip-bottom::after {
305
- bottom: auto !important;
306
- top: calc(100% + ($tooltip-arrow-size - 2px)) !important;
307
- transform: translateX(-50%) translateY($tooltip-offset) !important;
308
- border-top-color: transparent !important;
309
- border-bottom-color: var(--pa-tooltip-bg) !important;
310
- }
311
-
312
- &--auto-flip-bottom:hover::before,
313
- &--auto-flip-bottom:hover::after {
314
- transform: translateX(-50%) translateY(0) !important;
315
- }
316
-
317
- // Auto-flip from bottom to top
318
- &--auto-flip-top::before {
319
- top: auto !important;
320
- bottom: calc(100% + $tooltip-distance) !important;
321
- transform: translateX(-50%) translateY(-$tooltip-offset) !important;
322
- }
323
-
324
- &--auto-flip-top::after {
325
- top: auto !important;
326
- bottom: calc(100% + ($tooltip-arrow-size - 2px)) !important;
327
- transform: translateX(-50%) translateY(-$tooltip-offset) !important;
328
- border-bottom-color: transparent !important;
329
- border-top-color: var(--pa-tooltip-bg) !important;
330
- }
331
-
332
- &--auto-flip-top:hover::before,
333
- &--auto-flip-top:hover::after {
334
- transform: translateX(-50%) translateY(0) !important;
335
- }
336
-
337
- // Auto-flip from start to end
338
- &--auto-flip-end::before {
339
- left: auto !important;
340
- right: auto !important;
341
- inset-inline-start: calc(100% + $tooltip-distance) !important;
342
- transform: translateX(-$tooltip-offset) translateY(-50%) !important;
343
- }
344
-
345
- &--auto-flip-end::after {
346
- left: auto !important;
347
- right: auto !important;
348
- inset-inline-start: calc(100% + ($tooltip-arrow-size - 2px)) !important;
349
- transform: translateX(-$tooltip-offset) translateY(-50%) !important;
350
- border-inline-start-color: transparent !important;
351
- border-inline-end-color: var(--pa-tooltip-bg) !important;
352
- }
353
-
354
- &--auto-flip-end:hover::before,
355
- &--auto-flip-end:hover::after {
356
- transform: translateX(0) translateY(-50%) !important;
357
- }
358
-
359
- // RTL: reverse slide direction for auto-flip-end
360
- [dir="rtl"] &--auto-flip-end::before,
361
- [dir="rtl"] &--auto-flip-end::after {
362
- transform: translateX($tooltip-offset) translateY(-50%) !important;
363
- }
364
-
365
- [dir="rtl"] &--auto-flip-end:hover::before,
366
- [dir="rtl"] &--auto-flip-end:hover::after {
367
- transform: translateX(0) translateY(-50%) !important;
368
- }
369
-
370
- // Auto-flip from end to start
371
- &--auto-flip-start::before {
372
- left: auto !important;
373
- right: auto !important;
374
- inset-inline-end: calc(100% + $tooltip-distance) !important;
375
- transform: translateX($tooltip-offset) translateY(-50%) !important;
376
- }
377
-
378
- &--auto-flip-start::after {
379
- left: auto !important;
380
- right: auto !important;
381
- inset-inline-end: calc(100% + ($tooltip-arrow-size - 2px)) !important;
382
- transform: translateX($tooltip-offset) translateY(-50%) !important;
383
- border-inline-end-color: transparent !important;
384
- border-inline-start-color: var(--pa-tooltip-bg) !important;
385
- }
386
-
387
- &--auto-flip-start:hover::before,
388
- &--auto-flip-start:hover::after {
389
- transform: translateX(0) translateY(-50%) !important;
390
- }
391
-
392
- // RTL: reverse slide direction for auto-flip-start
393
- [dir="rtl"] &--auto-flip-start::before,
394
- [dir="rtl"] &--auto-flip-start::after {
395
- transform: translateX(-$tooltip-offset) translateY(-50%) !important;
396
- }
397
-
398
- [dir="rtl"] &--auto-flip-start:hover::before,
399
- [dir="rtl"] &--auto-flip-start:hover::after {
400
- transform: translateX(0) translateY(-50%) !important;
401
- }
402
- }
403
-
404
- // ========================================
405
- // Popovers - Interactive rich-content tooltips with Floating UI
406
- // ========================================
407
-
408
- .pa-popover {
409
- display: inline-block;
410
-
411
- &__trigger {
412
- display: inline-flex;
413
- align-items: center;
414
- justify-content: center;
415
- width: $popover-trigger-size;
416
- height: $popover-trigger-size;
417
- padding: 0;
418
- border: $border-width-base solid var(--pa-border-color);
419
- border-radius: 50%;
420
- background-color: var(--pa-popover-content-bg);
421
- color: var(--pa-text-color-2);
422
- font-size: $font-size-xs;
423
- font-weight: $font-weight-bold;
424
- cursor: pointer;
425
- transition: all $transition-fast $easing-smooth;
426
-
427
- &:hover {
428
- background-color: var(--pa-accent);
429
- color: var(--pa-modal-content-bg);
430
- border-color: var(--pa-accent);
431
- }
432
- }
433
-
434
- &__content {
435
- position: absolute;
436
- display: none;
437
- min-width: $popover-min-width;
438
- max-width: $popover-max-width;
439
- background-color: var(--pa-card-bg);
440
- border: $border-width-base solid var(--pa-border-color);
441
- border-radius: $border-radius;
442
- box-shadow: $shadow-lg;
443
- z-index: $popover-z-index;
444
-
445
- // Show when data-show attribute is present (controlled by JavaScript)
446
- &[data-show] {
447
- display: block;
448
- }
449
- }
450
-
451
- &__header {
452
- display: flex;
453
- align-items: center;
454
- justify-content: space-between;
455
- padding: $popover-header-padding;
456
- border-bottom: $popover-header-border;
457
- background-color: var(--pa-card-header-bg);
458
- border-radius: $popover-header-border-radius;
459
-
460
- h4 {
461
- margin: 0;
462
- font-size: $popover-title-font-size;
463
- font-weight: $font-weight-semibold;
464
- color: var(--pa-text-color-1);
465
- }
466
- }
467
-
468
- &__body {
469
- padding: $spacing-base;
470
- font-size: $font-size-sm;
471
- line-height: $line-height-base;
472
- color: var(--pa-text-color-1);
473
- text-align: start; // RTL: flips to right
474
-
475
- p {
476
- margin: 0 0 $spacing-sm 0;
477
-
478
- &:last-child {
479
- margin-bottom: 0;
480
- }
481
- }
482
-
483
- a {
484
- color: var(--pa-accent);
485
- text-decoration: underline;
486
-
487
- &:hover {
488
- color: var(--pa-accent-hover);
489
- }
490
- }
491
-
492
- ul, ol {
493
- margin: $spacing-sm 0;
494
- padding-inline-start: $spacing-lg; // RTL: flips to padding-right
495
- }
496
-
497
- code {
498
- padding: $popover-code-padding-v $popover-code-padding-h;
499
- background-color: color-mix(in srgb, var(--pa-text-color-2) 15%, transparent);
500
- border-radius: $border-radius-sm;
501
- font-family: monospace;
502
- font-size: $popover-code-font-scale;
503
- }
504
- }
505
-
506
- &__close {
507
- background: none;
508
- border: none;
509
- font-size: $font-size-lg;
510
- line-height: 1;
511
- color: var(--pa-text-color-2);
512
- cursor: pointer;
513
- padding: 0;
514
- width: $popover-close-size;
515
- height: $popover-close-size;
516
- display: flex;
517
- align-items: center;
518
- justify-content: center;
519
- border-radius: $border-radius;
520
- transition: all $transition-fast $easing-smooth;
521
-
522
- &:hover {
523
- background-color: color-mix(in srgb, var(--pa-text-color-2) 10%, transparent);
524
- color: var(--pa-text-color-1);
525
- }
526
- }
527
-
528
- // Size variants
529
- &--sm &__content {
530
- min-width: $popover-sm-min-width;
531
- max-width: $popover-sm-max-width;
532
- }
533
-
534
- &--lg &__content {
535
- min-width: $popover-lg-min-width;
536
- max-width: $popover-lg-max-width;
537
- }
538
-
539
- // Alignment variants
540
- &--center &__body {
541
- text-align: center;
542
- }
543
-
544
- &--end &__body {
545
- text-align: end; // RTL: flips to left
546
- }
547
- }
548
-
549
- .pa-popover--end .pa-popover__body {
550
- text-align: end;
551
- }
552
-
553
- // ========================================
554
- // Floating UI Tooltip (Portal Rendering)
555
- // ========================================
556
-
557
- .pa-tooltip-floating {
558
- background-color: var(--pa-tooltip-bg);
559
- color: var(--pa-tooltip-text);
560
- padding: $spacing-xs $spacing-sm;
561
- border-radius: $border-radius;
562
- font-size: $font-size-xs;
563
- white-space: nowrap;
564
- max-width: $tooltip-max-width;
565
- text-align: center;
566
- box-shadow: $shadow-md;
567
- pointer-events: none;
568
- z-index: $z-index-tooltip;
569
-
570
- // Multiline variant
571
- &.pa-tooltip--multiline {
572
- white-space: normal;
573
- text-align: start; // RTL: flips to right
574
- max-width: $tooltip-multiline-max-width;
575
- }
576
-
577
- // Color variants
578
- &.pa-tooltip--primary {
579
- background-color: var(--pa-btn-primary-bg);
580
- color: var(--pa-btn-primary-text);
581
- }
582
-
583
- &.pa-tooltip--success {
584
- background-color: var(--pa-btn-success-bg);
585
- color: var(--pa-btn-success-text);
586
- }
587
-
588
- &.pa-tooltip--warning {
589
- background-color: var(--pa-btn-warning-bg);
590
- color: var(--pa-btn-warning-text);
591
- }
592
-
593
- &.pa-tooltip--danger {
594
- background-color: var(--pa-btn-danger-bg);
595
- color: var(--pa-btn-danger-text);
596
- }
597
-
598
- // Numbered color variants (color-1 through color-9)
599
- @for $i from 1 through 9 {
600
- &.pa-tooltip--color-#{$i} {
601
- background-color: var(--pa-color-#{$i});
602
- color: var(--pa-color-#{$i}-text);
603
- }
604
- }
605
- }
1
+ /* ========================================
2
+ Tooltip and Popover Components
3
+ Tooltips with multiple positions and popovers with rich content
4
+ ======================================== */
5
+ @use '../variables' as *;
6
+
7
+ @use "sass:color";
8
+
9
+ // Tooltips
10
+ .pa-tooltip {
11
+ position: relative;
12
+ display: inline-block;
13
+
14
+ // Elevate z-index on hover to appear above siblings
15
+ &:hover {
16
+ z-index: $z-index-modal;
17
+ }
18
+
19
+ // Help cursor modifier - use for informational tooltips
20
+ &--help {
21
+ cursor: help;
22
+ }
23
+
24
+ // Keyword modifier - dotted underline for inline term explanations
25
+ &--keyword {
26
+ border-bottom: $border-width-base dotted currentColor;
27
+ cursor: help;
28
+ }
29
+
30
+ &::before,
31
+ &::after {
32
+ position: absolute;
33
+ opacity: 0;
34
+ pointer-events: none;
35
+ transition: opacity $transition-normal $easing-smooth, transform $transition-normal $easing-smooth;
36
+ z-index: $tooltip-z-index;
37
+ }
38
+
39
+ // Tooltip content
40
+ &::before {
41
+ content: attr(data-tooltip);
42
+ background-color: var(--pa-tooltip-bg);
43
+ color: var(--pa-tooltip-text);
44
+ padding: $spacing-xs $spacing-sm;
45
+ border-radius: var(--pa-border-radius);
46
+ font-size: $font-size-xs;
47
+ white-space: nowrap;
48
+ max-width: $tooltip-max-width;
49
+ text-align: center;
50
+ overflow: hidden;
51
+ text-overflow: ellipsis;
52
+ }
53
+
54
+ // Multiline tooltip variant
55
+ &--multiline::before {
56
+ white-space: normal;
57
+ text-align: start; // RTL: flips to right
58
+ width: $tooltip-multiline-width;
59
+ max-width: $tooltip-multiline-width;
60
+ line-height: $line-height-base;
61
+ }
62
+
63
+ // Tooltip arrow
64
+ &::after {
65
+ content: '';
66
+ border: $tooltip-arrow-size solid transparent;
67
+ }
68
+
69
+ // Show on hover
70
+ &:hover::before,
71
+ &:hover::after {
72
+ opacity: 1;
73
+ }
74
+
75
+ // Disable CSS tooltip when JS floating tooltip is active (prevents double tooltips)
76
+ &--floating::before,
77
+ &--floating::after {
78
+ display: none !important;
79
+ }
80
+
81
+ // Top position (default)
82
+ &::before {
83
+ bottom: calc(100% + $tooltip-distance);
84
+ left: 50%;
85
+ transform: translateX(-50%) translateY(-$tooltip-offset);
86
+ }
87
+
88
+ &::after {
89
+ bottom: calc(100% + ($tooltip-arrow-size - 2px));
90
+ left: 50%;
91
+ transform: translateX(-50%) translateY(-$tooltip-offset);
92
+ border-top-color: var(--pa-tooltip-bg);
93
+ }
94
+
95
+ &:hover::before,
96
+ &:hover::after {
97
+ transform: translateX(-50%) translateY(0);
98
+ }
99
+
100
+ // End position (inline-end: right in LTR, left in RTL)
101
+ &--end::before {
102
+ bottom: auto;
103
+ left: auto;
104
+ inset-inline-start: calc(100% + $tooltip-distance);
105
+ top: 50%;
106
+ transform: translateX(-$tooltip-offset) translateY(-50%);
107
+ }
108
+
109
+ &--end::after {
110
+ bottom: auto;
111
+ left: auto;
112
+ inset-inline-start: calc(100% + ($tooltip-arrow-size - 2px));
113
+ top: 50%;
114
+ transform: translateX(-$tooltip-offset) translateY(-50%);
115
+ border-top-color: transparent;
116
+ border-inline-end-color: var(--pa-tooltip-bg);
117
+ }
118
+
119
+ &--end:hover::before,
120
+ &--end:hover::after {
121
+ transform: translateX(0) translateY(-50%);
122
+ }
123
+
124
+ // RTL: reverse slide direction for end position
125
+ [dir="rtl"] &--end::before,
126
+ [dir="rtl"] &--end::after {
127
+ transform: translateX($tooltip-offset) translateY(-50%);
128
+ }
129
+
130
+ [dir="rtl"] &--end:hover::before,
131
+ [dir="rtl"] &--end:hover::after {
132
+ transform: translateX(0) translateY(-50%);
133
+ }
134
+
135
+ // Bottom position
136
+ &--bottom::before {
137
+ bottom: auto;
138
+ top: calc(100% + $tooltip-distance);
139
+ left: 50%;
140
+ transform: translateX(-50%) translateY($tooltip-offset);
141
+ }
142
+
143
+ &--bottom::after {
144
+ bottom: auto;
145
+ top: calc(100% + ($tooltip-arrow-size - 2px));
146
+ left: 50%;
147
+ transform: translateX(-50%) translateY($tooltip-offset);
148
+ border-top-color: transparent;
149
+ border-bottom-color: var(--pa-tooltip-bg);
150
+ }
151
+
152
+ &--bottom:hover::before,
153
+ &--bottom:hover::after {
154
+ transform: translateX(-50%) translateY(0);
155
+ }
156
+
157
+ // Start position (inline-start: left in LTR, right in RTL)
158
+ &--start::before {
159
+ bottom: auto;
160
+ left: auto;
161
+ inset-inline-end: calc(100% + $tooltip-distance);
162
+ top: 50%;
163
+ transform: translateX($tooltip-offset) translateY(-50%);
164
+ }
165
+
166
+ &--start::after {
167
+ bottom: auto;
168
+ left: auto;
169
+ inset-inline-end: calc(100% + ($tooltip-arrow-size - 2px));
170
+ top: 50%;
171
+ transform: translateX($tooltip-offset) translateY(-50%);
172
+ border-top-color: transparent;
173
+ border-inline-start-color: var(--pa-tooltip-bg);
174
+ }
175
+
176
+ &--start:hover::before,
177
+ &--start:hover::after {
178
+ transform: translateX(0) translateY(-50%);
179
+ }
180
+
181
+ // RTL: reverse slide direction for start position
182
+ [dir="rtl"] &--start::before,
183
+ [dir="rtl"] &--start::after {
184
+ transform: translateX(-$tooltip-offset) translateY(-50%);
185
+ }
186
+
187
+ [dir="rtl"] &--start:hover::before,
188
+ [dir="rtl"] &--start:hover::after {
189
+ transform: translateX(0) translateY(-50%);
190
+ }
191
+
192
+ // Color variants
193
+ &--primary::before {
194
+ background-color: var(--pa-btn-primary-bg);
195
+ }
196
+ &--primary::after {
197
+ border-top-color: var(--pa-btn-primary-bg);
198
+ }
199
+ &--primary.pa-tooltip--end::after {
200
+ border-top-color: transparent;
201
+ border-inline-end-color: var(--pa-btn-primary-bg);
202
+ }
203
+ &--primary.pa-tooltip--bottom::after {
204
+ border-top-color: transparent;
205
+ border-bottom-color: var(--pa-btn-primary-bg);
206
+ }
207
+ &--primary.pa-tooltip--start::after {
208
+ border-top-color: transparent;
209
+ border-inline-start-color: var(--pa-btn-primary-bg);
210
+ }
211
+
212
+ &--success::before {
213
+ background-color: var(--pa-btn-success-bg);
214
+ }
215
+ &--success::after {
216
+ border-top-color: var(--pa-btn-success-bg);
217
+ }
218
+ &--success.pa-tooltip--end::after {
219
+ border-top-color: transparent;
220
+ border-inline-end-color: var(--pa-btn-success-bg);
221
+ }
222
+ &--success.pa-tooltip--bottom::after {
223
+ border-top-color: transparent;
224
+ border-bottom-color: var(--pa-btn-success-bg);
225
+ }
226
+ &--success.pa-tooltip--start::after {
227
+ border-top-color: transparent;
228
+ border-inline-start-color: var(--pa-btn-success-bg);
229
+ }
230
+
231
+ &--warning::before {
232
+ background-color: var(--pa-btn-warning-bg);
233
+ color: var(--pa-text-color-1);
234
+ }
235
+ &--warning::after {
236
+ border-top-color: var(--pa-btn-warning-bg);
237
+ }
238
+ &--warning.pa-tooltip--end::after {
239
+ border-top-color: transparent;
240
+ border-inline-end-color: var(--pa-btn-warning-bg);
241
+ }
242
+ &--warning.pa-tooltip--bottom::after {
243
+ border-top-color: transparent;
244
+ border-bottom-color: var(--pa-btn-warning-bg);
245
+ }
246
+ &--warning.pa-tooltip--start::after {
247
+ border-top-color: transparent;
248
+ border-inline-start-color: var(--pa-btn-warning-bg);
249
+ }
250
+
251
+ &--danger::before {
252
+ background-color: var(--pa-btn-danger-bg);
253
+ }
254
+ &--danger::after {
255
+ border-top-color: var(--pa-btn-danger-bg);
256
+ }
257
+ &--danger.pa-tooltip--end::after {
258
+ border-top-color: transparent;
259
+ border-inline-end-color: var(--pa-btn-danger-bg);
260
+ }
261
+ &--danger.pa-tooltip--bottom::after {
262
+ border-top-color: transparent;
263
+ border-bottom-color: var(--pa-btn-danger-bg);
264
+ }
265
+ &--danger.pa-tooltip--start::after {
266
+ border-top-color: transparent;
267
+ border-inline-start-color: var(--pa-btn-danger-bg);
268
+ }
269
+
270
+ // Numbered color variants (color-1 through color-9)
271
+ // These use theme-customizable colors from --pa-color-* CSS variables
272
+ @for $i from 1 through 9 {
273
+ &--color-#{$i}::before {
274
+ background-color: var(--pa-color-#{$i});
275
+ color: var(--pa-color-#{$i}-text);
276
+ }
277
+ &--color-#{$i}::after {
278
+ border-top-color: var(--pa-color-#{$i});
279
+ }
280
+ &--color-#{$i}.pa-tooltip--end::after {
281
+ border-top-color: transparent;
282
+ border-inline-end-color: var(--pa-color-#{$i});
283
+ }
284
+ &--color-#{$i}.pa-tooltip--bottom::after {
285
+ border-top-color: transparent;
286
+ border-bottom-color: var(--pa-color-#{$i});
287
+ }
288
+ &--color-#{$i}.pa-tooltip--start::after {
289
+ border-top-color: transparent;
290
+ border-inline-start-color: var(--pa-color-#{$i});
291
+ }
292
+ }
293
+
294
+ // Smart positioning - collision detection adjustments
295
+ // Applied dynamically by JavaScript based on viewport boundaries
296
+
297
+ // Auto-flip from top to bottom
298
+ &--auto-flip-bottom::before {
299
+ bottom: auto !important;
300
+ top: calc(100% + $tooltip-distance) !important;
301
+ transform: translateX(-50%) translateY($tooltip-offset) !important;
302
+ }
303
+
304
+ &--auto-flip-bottom::after {
305
+ bottom: auto !important;
306
+ top: calc(100% + ($tooltip-arrow-size - 2px)) !important;
307
+ transform: translateX(-50%) translateY($tooltip-offset) !important;
308
+ border-top-color: transparent !important;
309
+ border-bottom-color: var(--pa-tooltip-bg) !important;
310
+ }
311
+
312
+ &--auto-flip-bottom:hover::before,
313
+ &--auto-flip-bottom:hover::after {
314
+ transform: translateX(-50%) translateY(0) !important;
315
+ }
316
+
317
+ // Auto-flip from bottom to top
318
+ &--auto-flip-top::before {
319
+ top: auto !important;
320
+ bottom: calc(100% + $tooltip-distance) !important;
321
+ transform: translateX(-50%) translateY(-$tooltip-offset) !important;
322
+ }
323
+
324
+ &--auto-flip-top::after {
325
+ top: auto !important;
326
+ bottom: calc(100% + ($tooltip-arrow-size - 2px)) !important;
327
+ transform: translateX(-50%) translateY(-$tooltip-offset) !important;
328
+ border-bottom-color: transparent !important;
329
+ border-top-color: var(--pa-tooltip-bg) !important;
330
+ }
331
+
332
+ &--auto-flip-top:hover::before,
333
+ &--auto-flip-top:hover::after {
334
+ transform: translateX(-50%) translateY(0) !important;
335
+ }
336
+
337
+ // Auto-flip from start to end
338
+ &--auto-flip-end::before {
339
+ left: auto !important;
340
+ right: auto !important;
341
+ inset-inline-start: calc(100% + $tooltip-distance) !important;
342
+ transform: translateX(-$tooltip-offset) translateY(-50%) !important;
343
+ }
344
+
345
+ &--auto-flip-end::after {
346
+ left: auto !important;
347
+ right: auto !important;
348
+ inset-inline-start: calc(100% + ($tooltip-arrow-size - 2px)) !important;
349
+ transform: translateX(-$tooltip-offset) translateY(-50%) !important;
350
+ border-inline-start-color: transparent !important;
351
+ border-inline-end-color: var(--pa-tooltip-bg) !important;
352
+ }
353
+
354
+ &--auto-flip-end:hover::before,
355
+ &--auto-flip-end:hover::after {
356
+ transform: translateX(0) translateY(-50%) !important;
357
+ }
358
+
359
+ // RTL: reverse slide direction for auto-flip-end
360
+ [dir="rtl"] &--auto-flip-end::before,
361
+ [dir="rtl"] &--auto-flip-end::after {
362
+ transform: translateX($tooltip-offset) translateY(-50%) !important;
363
+ }
364
+
365
+ [dir="rtl"] &--auto-flip-end:hover::before,
366
+ [dir="rtl"] &--auto-flip-end:hover::after {
367
+ transform: translateX(0) translateY(-50%) !important;
368
+ }
369
+
370
+ // Auto-flip from end to start
371
+ &--auto-flip-start::before {
372
+ left: auto !important;
373
+ right: auto !important;
374
+ inset-inline-end: calc(100% + $tooltip-distance) !important;
375
+ transform: translateX($tooltip-offset) translateY(-50%) !important;
376
+ }
377
+
378
+ &--auto-flip-start::after {
379
+ left: auto !important;
380
+ right: auto !important;
381
+ inset-inline-end: calc(100% + ($tooltip-arrow-size - 2px)) !important;
382
+ transform: translateX($tooltip-offset) translateY(-50%) !important;
383
+ border-inline-end-color: transparent !important;
384
+ border-inline-start-color: var(--pa-tooltip-bg) !important;
385
+ }
386
+
387
+ &--auto-flip-start:hover::before,
388
+ &--auto-flip-start:hover::after {
389
+ transform: translateX(0) translateY(-50%) !important;
390
+ }
391
+
392
+ // RTL: reverse slide direction for auto-flip-start
393
+ [dir="rtl"] &--auto-flip-start::before,
394
+ [dir="rtl"] &--auto-flip-start::after {
395
+ transform: translateX(-$tooltip-offset) translateY(-50%) !important;
396
+ }
397
+
398
+ [dir="rtl"] &--auto-flip-start:hover::before,
399
+ [dir="rtl"] &--auto-flip-start:hover::after {
400
+ transform: translateX(0) translateY(-50%) !important;
401
+ }
402
+ }
403
+
404
+ // ========================================
405
+ // Popovers - Interactive rich-content tooltips with Floating UI
406
+ // ========================================
407
+
408
+ .pa-popover {
409
+ display: inline-block;
410
+
411
+ &__trigger {
412
+ display: inline-flex;
413
+ align-items: center;
414
+ justify-content: center;
415
+ width: $popover-trigger-size;
416
+ height: $popover-trigger-size;
417
+ padding: 0;
418
+ border: $border-width-base solid var(--pa-border-color);
419
+ border-radius: 50%;
420
+ background-color: var(--pa-popover-content-bg);
421
+ color: var(--pa-text-color-2);
422
+ font-size: $font-size-xs;
423
+ font-weight: $font-weight-bold;
424
+ cursor: pointer;
425
+ transition: all $transition-fast $easing-smooth;
426
+
427
+ &:hover {
428
+ background-color: var(--pa-accent);
429
+ color: var(--pa-modal-content-bg);
430
+ border-color: var(--pa-accent);
431
+ }
432
+ }
433
+
434
+ &__content {
435
+ position: absolute;
436
+ display: none;
437
+ min-width: $popover-min-width;
438
+ max-width: $popover-max-width;
439
+ background-color: var(--pa-card-bg);
440
+ border: $border-width-base solid var(--pa-border-color);
441
+ border-radius: var(--pa-border-radius);
442
+ box-shadow: $shadow-lg;
443
+ z-index: $popover-z-index;
444
+
445
+ // Show when data-show attribute is present (controlled by JavaScript)
446
+ &[data-show] {
447
+ display: block;
448
+ }
449
+ }
450
+
451
+ &__header {
452
+ display: flex;
453
+ align-items: center;
454
+ justify-content: space-between;
455
+ padding: $popover-header-padding;
456
+ border-bottom: $popover-header-border;
457
+ background-color: var(--pa-card-header-bg);
458
+ border-radius: var(--pa-border-radius) var(--pa-border-radius) 0 0;
459
+
460
+ h4 {
461
+ margin: 0;
462
+ font-size: $popover-title-font-size;
463
+ font-weight: $font-weight-semibold;
464
+ color: var(--pa-text-color-1);
465
+ }
466
+ }
467
+
468
+ &__body {
469
+ padding: $spacing-base;
470
+ font-size: $font-size-sm;
471
+ line-height: $line-height-base;
472
+ color: var(--pa-text-color-1);
473
+ text-align: start; // RTL: flips to right
474
+
475
+ p {
476
+ margin: 0 0 $spacing-sm 0;
477
+
478
+ &:last-child {
479
+ margin-bottom: 0;
480
+ }
481
+ }
482
+
483
+ a {
484
+ color: var(--pa-accent);
485
+ text-decoration: underline;
486
+
487
+ &:hover {
488
+ color: var(--pa-accent-hover);
489
+ }
490
+ }
491
+
492
+ ul, ol {
493
+ margin: $spacing-sm 0;
494
+ padding-inline-start: $spacing-lg; // RTL: flips to padding-right
495
+ }
496
+
497
+ code {
498
+ padding: $popover-code-padding-v $popover-code-padding-h;
499
+ background-color: color-mix(in srgb, var(--pa-text-color-2) 15%, transparent);
500
+ border-radius: var(--pa-border-radius-sm);
501
+ font-family: monospace;
502
+ font-size: $popover-code-font-scale;
503
+ }
504
+ }
505
+
506
+ &__close {
507
+ background: none;
508
+ border: none;
509
+ font-size: $font-size-lg;
510
+ line-height: 1;
511
+ color: var(--pa-text-color-2);
512
+ cursor: pointer;
513
+ padding: 0;
514
+ width: $popover-close-size;
515
+ height: $popover-close-size;
516
+ display: flex;
517
+ align-items: center;
518
+ justify-content: center;
519
+ border-radius: var(--pa-border-radius);
520
+ transition: all $transition-fast $easing-smooth;
521
+
522
+ &:hover {
523
+ background-color: color-mix(in srgb, var(--pa-text-color-2) 10%, transparent);
524
+ color: var(--pa-text-color-1);
525
+ }
526
+ }
527
+
528
+ // Size variants
529
+ &--sm &__content {
530
+ min-width: $popover-sm-min-width;
531
+ max-width: $popover-sm-max-width;
532
+ }
533
+
534
+ &--lg &__content {
535
+ min-width: $popover-lg-min-width;
536
+ max-width: $popover-lg-max-width;
537
+ }
538
+
539
+ // Alignment variants
540
+ &--center &__body {
541
+ text-align: center;
542
+ }
543
+
544
+ &--end &__body {
545
+ text-align: end; // RTL: flips to left
546
+ }
547
+ }
548
+
549
+ .pa-popover--end .pa-popover__body {
550
+ text-align: end;
551
+ }
552
+
553
+ // ========================================
554
+ // Floating UI Tooltip (Portal Rendering)
555
+ // ========================================
556
+
557
+ .pa-tooltip-floating {
558
+ background-color: var(--pa-tooltip-bg);
559
+ color: var(--pa-tooltip-text);
560
+ padding: $spacing-xs $spacing-sm;
561
+ border-radius: var(--pa-border-radius);
562
+ font-size: $font-size-xs;
563
+ white-space: nowrap;
564
+ max-width: $tooltip-max-width;
565
+ text-align: center;
566
+ box-shadow: $shadow-md;
567
+ pointer-events: none;
568
+ z-index: $z-index-tooltip;
569
+
570
+ // Multiline variant
571
+ &.pa-tooltip--multiline {
572
+ white-space: normal;
573
+ text-align: start; // RTL: flips to right
574
+ max-width: $tooltip-multiline-max-width;
575
+ }
576
+
577
+ // Color variants
578
+ &.pa-tooltip--primary {
579
+ background-color: var(--pa-btn-primary-bg);
580
+ color: var(--pa-btn-primary-text);
581
+ }
582
+
583
+ &.pa-tooltip--success {
584
+ background-color: var(--pa-btn-success-bg);
585
+ color: var(--pa-btn-success-text);
586
+ }
587
+
588
+ &.pa-tooltip--warning {
589
+ background-color: var(--pa-btn-warning-bg);
590
+ color: var(--pa-btn-warning-text);
591
+ }
592
+
593
+ &.pa-tooltip--danger {
594
+ background-color: var(--pa-btn-danger-bg);
595
+ color: var(--pa-btn-danger-text);
596
+ }
597
+
598
+ // Numbered color variants (color-1 through color-9)
599
+ @for $i from 1 through 9 {
600
+ &.pa-tooltip--color-#{$i} {
601
+ background-color: var(--pa-color-#{$i});
602
+ color: var(--pa-color-#{$i}-text);
603
+ }
604
+ }
605
+ }