@keenmate/pure-admin-core 2.6.0 → 2.7.1

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 (40) hide show
  1. package/README.md +24 -16
  2. package/dist/css/main.css +1865 -257
  3. package/package.json +1 -1
  4. package/src/scss/_base-css-variables.scss +37 -19
  5. package/src/scss/_core.scss +11 -0
  6. package/src/scss/core-components/_alerts.scss +2 -2
  7. package/src/scss/core-components/_base.scss +19 -2
  8. package/src/scss/core-components/_buttons.scss +12 -8
  9. package/src/scss/core-components/_callouts.scss +1 -1
  10. package/src/scss/core-components/_cards.scss +4 -4
  11. package/src/scss/core-components/_checkbox-lists.scss +2 -2
  12. package/src/scss/core-components/_comparison.scss +7 -4
  13. package/src/scss/core-components/_data-display.scss +24 -15
  14. package/src/scss/core-components/_data-viz.scss +139 -131
  15. package/src/scss/core-components/_file-selector.scss +34 -34
  16. package/src/scss/core-components/_kpi-base.scss +169 -0
  17. package/src/scss/core-components/_kpi-bento.scss +182 -0
  18. package/src/scss/core-components/_kpi-comparison-gauges.scss +132 -0
  19. package/src/scss/core-components/_kpi-editorial-minimal.scss +128 -0
  20. package/src/scss/core-components/_kpi-hero-supporting.scss +210 -0
  21. package/src/scss/core-components/_kpi-numeric-strip.scss +154 -0
  22. package/src/scss/core-components/_kpi-sparkline-list.scss +171 -0
  23. package/src/scss/core-components/_kpi-terminal.scss +229 -0
  24. package/src/scss/core-components/_lists.scss +4 -4
  25. package/src/scss/core-components/_logic-tree.scss +2 -2
  26. package/src/scss/core-components/_modals.scss +69 -0
  27. package/src/scss/core-components/_notifications.scss +17 -17
  28. package/src/scss/core-components/_popconfirm.scss +1 -1
  29. package/src/scss/core-components/_statistics.scss +25 -19
  30. package/src/scss/core-components/_tabs.scss +12 -12
  31. package/src/scss/core-components/_timeline.scss +30 -30
  32. package/src/scss/core-components/badges/_composite-badge-variants.scss +7 -7
  33. package/src/scss/core-components/badges/_composite-badge.scss +1 -1
  34. package/src/scss/core-components/badges/_labels.scss +6 -6
  35. package/src/scss/core-components/forms/_input-wrapper.scss +1 -1
  36. package/src/scss/core-components/forms/_query-editor.scss +10 -10
  37. package/src/scss/core-components/layout/_sidebar-states.scss +1 -0
  38. package/src/scss/core-components/layout/_sidebar.scss +1 -0
  39. package/src/scss/variables/_colors.scss +1 -0
  40. package/src/scss/variables/_components.scss +3 -2
package/dist/css/main.css CHANGED
@@ -2629,6 +2629,19 @@ p {
2629
2629
  padding: 0;
2630
2630
  }
2631
2631
 
2632
+ :where(a) {
2633
+ color: var(--pa-link-color);
2634
+ text-decoration: underline;
2635
+ }
2636
+
2637
+ :where(a:hover) {
2638
+ color: var(--pa-link-color-hover);
2639
+ }
2640
+
2641
+ :where(a:visited) {
2642
+ color: var(--pa-link-color-visited);
2643
+ }
2644
+
2632
2645
  ul, ol {
2633
2646
  margin: 0 0 1.6rem 0;
2634
2647
  padding: 0;
@@ -2692,7 +2705,7 @@ body::before {
2692
2705
  left: 0;
2693
2706
  right: 0;
2694
2707
  bottom: 0;
2695
- background: radial-gradient(circle at 20% 80%, rgba(0, 123, 255, 0.03) 0%, transparent 50%), radial-gradient(circle at 80% 20%, rgba(0, 123, 255, 0.03) 0%, transparent 50%);
2708
+ background: radial-gradient(circle at 20% 80%, color-mix(in srgb, var(--pa-accent) 3%, transparent) 0%, transparent 50%), radial-gradient(circle at 80% 20%, color-mix(in srgb, var(--pa-accent) 3%, transparent) 0%, transparent 50%);
2696
2709
  pointer-events: none;
2697
2710
  z-index: -1;
2698
2711
  }
@@ -3132,6 +3145,7 @@ body.loaded .pa-sidebar__label {
3132
3145
  }
3133
3146
  .pa-sidebar__submenu > .pa-sidebar__item > .pa-sidebar__link--active {
3134
3147
  background-color: var(--pa-sidebar-submenu-active-bg);
3148
+ color: var(--pa-sidebar-submenu-active-text);
3135
3149
  border-inline-end-color: var(--pa-accent);
3136
3150
  }
3137
3151
  .pa-sidebar__submenu > .pa-sidebar__item > .pa-sidebar__toggle {
@@ -3271,6 +3285,7 @@ body.loaded .pa-sidebar__chevron {
3271
3285
  .sidebar-hidden .pa-layout__sidebar--icon-collapse .pa-sidebar__submenu:hover .pa-sidebar__link--active,
3272
3286
  .sidebar-hidden .pa-layout__sidebar--icon-collapse .pa-sidebar__submenu:hover .pa-sidebar__toggle--active {
3273
3287
  background-color: var(--pa-sidebar-submenu-active-bg);
3288
+ color: var(--pa-sidebar-submenu-active-text);
3274
3289
  }
3275
3290
  .sidebar-hidden .pa-layout__sidebar--icon-collapse .pa-sidebar__item:hover > .pa-sidebar__submenu .pa-sidebar__icon,
3276
3291
  .sidebar-hidden .pa-layout__sidebar--icon-collapse .pa-sidebar__submenu:hover .pa-sidebar__icon {
@@ -5664,11 +5679,11 @@ body:not(.sidebar-hidden) .pa-layout__sidebar--icon-collapse .pa-sidebar__icon {
5664
5679
  border-top: none !important;
5665
5680
  }
5666
5681
  .pa-card--live-up {
5667
- background-color: rgba(34, 197, 94, 0.1);
5682
+ background-color: color-mix(in srgb, var(--pa-positive) 10%, transparent);
5668
5683
  transition: background-color 0.3s ease;
5669
5684
  }
5670
5685
  .pa-card--live-down {
5671
- background-color: rgba(239, 68, 68, 0.1);
5686
+ background-color: color-mix(in srgb, var(--pa-negative) 10%, transparent);
5672
5687
  transition: background-color 0.3s ease;
5673
5688
  }
5674
5689
  .pa-card--live-neutral {
@@ -5826,7 +5841,7 @@ body:not(.sidebar-hidden) .pa-layout__sidebar--icon-collapse .pa-sidebar__icon {
5826
5841
  }
5827
5842
  .pa-card__tab:hover {
5828
5843
  color: var(--pa-text-color-1);
5829
- background-color: rgba(0, 123, 255, 0.05);
5844
+ background-color: color-mix(in srgb, var(--pa-accent) 5%, transparent);
5830
5845
  }
5831
5846
  .pa-card__tab--active {
5832
5847
  color: var(--pa-accent);
@@ -5856,7 +5871,7 @@ body:not(.sidebar-hidden) .pa-layout__sidebar--icon-collapse .pa-sidebar__icon {
5856
5871
  transition: all 0.1s ease-out;
5857
5872
  }
5858
5873
  .pa-card__tabs--inline .pa-card__tab:hover {
5859
- background-color: rgba(0, 123, 255, 0.05);
5874
+ background-color: color-mix(in srgb, var(--pa-accent) 5%, transparent);
5860
5875
  color: var(--pa-text-color-1);
5861
5876
  }
5862
5877
  .pa-card__tabs--inline .pa-card__tab--active {
@@ -5923,11 +5938,11 @@ a.pa-card p {
5923
5938
  }
5924
5939
  .pa-tabs__item:hover {
5925
5940
  color: var(--pa-text-color-1);
5926
- background-color: rgba(0, 123, 255, 0.05);
5941
+ background-color: color-mix(in srgb, var(--pa-accent) 5%, transparent);
5927
5942
  }
5928
5943
  .pa-tabs__item--active {
5929
- color: #007bff;
5930
- border-bottom-color: #007bff;
5944
+ color: var(--pa-accent);
5945
+ border-bottom-color: var(--pa-accent);
5931
5946
  font-weight: 600;
5932
5947
  }
5933
5948
  .pa-tabs__item i {
@@ -5953,8 +5968,8 @@ a.pa-card p {
5953
5968
  background-color: var(--pa-main-bg);
5954
5969
  }
5955
5970
  .pa-tabs--pills .pa-tabs__item:hover {
5956
- background-color: rgba(0, 123, 255, 0.1);
5957
- border-color: rgba(0, 123, 255, 0.3);
5971
+ background-color: color-mix(in srgb, var(--pa-accent) 10%, transparent);
5972
+ border-color: color-mix(in srgb, var(--pa-accent) 30%, transparent);
5958
5973
  color: var(--pa-text-color-1);
5959
5974
  }
5960
5975
  .pa-tabs--pills .pa-tabs__item--active {
@@ -5976,7 +5991,7 @@ a.pa-card p {
5976
5991
  padding: 0.8rem 1.2rem;
5977
5992
  }
5978
5993
  .pa-tabs--boxed .pa-tabs__item:hover {
5979
- background-color: rgba(0, 123, 255, 0.1);
5994
+ background-color: color-mix(in srgb, var(--pa-accent) 10%, transparent);
5980
5995
  color: var(--pa-text-color-1);
5981
5996
  }
5982
5997
  .pa-tabs--boxed .pa-tabs__item--active {
@@ -6008,11 +6023,11 @@ a.pa-card p {
6008
6023
  min-height: 4rem;
6009
6024
  }
6010
6025
  .pa-tabs--vertical .pa-tabs__item:hover {
6011
- background-color: rgba(0, 123, 255, 0.05);
6026
+ background-color: color-mix(in srgb, var(--pa-accent) 5%, transparent);
6012
6027
  }
6013
6028
  .pa-tabs--vertical .pa-tabs__item--active {
6014
- border-inline-end-color: #007bff;
6015
- background-color: rgba(0, 123, 255, 0.1);
6029
+ border-inline-end-color: var(--pa-accent);
6030
+ background-color: color-mix(in srgb, var(--pa-accent) 10%, transparent);
6016
6031
  }
6017
6032
  .pa-tabs--vertical .pa-tabs__item i {
6018
6033
  width: 2.4rem;
@@ -6204,7 +6219,7 @@ a.pa-card p {
6204
6219
  height: 4rem;
6205
6220
  }
6206
6221
  .pa-tabs__container--card .pa-tabs__overflow-toggle:hover {
6207
- background-color: rgba(0, 123, 255, 0.05);
6222
+ background-color: color-mix(in srgb, var(--pa-accent) 5%, transparent);
6208
6223
  color: var(--pa-text-color-1);
6209
6224
  }
6210
6225
  .pa-tabs__container--card .pa-tabs__overflow-toggle--has-active {
@@ -6248,10 +6263,10 @@ a.pa-card p {
6248
6263
  white-space: nowrap;
6249
6264
  }
6250
6265
  .pa-tabs__container--card .pa-tabs__overflow-menu .pa-tabs__item:hover {
6251
- background-color: rgba(0, 123, 255, 0.05);
6266
+ background-color: color-mix(in srgb, var(--pa-accent) 5%, transparent);
6252
6267
  }
6253
6268
  .pa-tabs__container--card .pa-tabs__overflow-menu .pa-tabs__item--active {
6254
- background-color: rgba(0, 123, 255, 0.1);
6269
+ background-color: color-mix(in srgb, var(--pa-accent) 10%, transparent);
6255
6270
  border-bottom: none;
6256
6271
  }
6257
6272
  .pa-tabs__vertical-layout {
@@ -6295,20 +6310,24 @@ a.pa-card p {
6295
6310
  font-size: 2rem;
6296
6311
  }
6297
6312
  .pa-stat__icon--primary {
6298
- background-color: rgba(0, 123, 255, 0.1);
6299
- color: #007bff;
6313
+ background-color: var(--pa-accent-light);
6314
+ color: var(--pa-accent);
6300
6315
  }
6301
6316
  .pa-stat__icon--success {
6302
- background-color: rgba(34, 197, 94, 0.1);
6303
- color: #22c55e;
6317
+ background-color: var(--pa-success-bg-light);
6318
+ color: var(--pa-success-bg);
6304
6319
  }
6305
6320
  .pa-stat__icon--warning {
6306
- background-color: rgba(249, 115, 22, 0.1);
6307
- color: #f97316;
6321
+ background-color: var(--pa-warning-bg-light);
6322
+ color: var(--pa-warning-bg);
6323
+ }
6324
+ .pa-stat__icon--danger {
6325
+ background-color: var(--pa-danger-bg-light);
6326
+ color: var(--pa-danger-bg);
6308
6327
  }
6309
6328
  .pa-stat__icon--info {
6310
- background-color: rgba(23, 162, 184, 0.1);
6311
- color: #17a2b8;
6329
+ background-color: var(--pa-info-bg-light);
6330
+ color: var(--pa-info-bg);
6312
6331
  }
6313
6332
  .pa-stat__content {
6314
6333
  flex: 1;
@@ -6347,14 +6366,20 @@ a.pa-card p {
6347
6366
  font-size: 1.2rem;
6348
6367
  font-weight: 600;
6349
6368
  }
6369
+ .pa-stat--hero .pa-stat__change--very-positive, .pa-stat--hero-compact .pa-stat__change--very-positive {
6370
+ color: var(--pa-very-positive);
6371
+ }
6350
6372
  .pa-stat--hero .pa-stat__change--positive, .pa-stat--hero-compact .pa-stat__change--positive {
6351
- color: #22c55e;
6373
+ color: var(--pa-positive);
6374
+ }
6375
+ .pa-stat--hero .pa-stat__change--neutral, .pa-stat--hero-compact .pa-stat__change--neutral {
6376
+ color: var(--pa-neutral);
6352
6377
  }
6353
6378
  .pa-stat--hero .pa-stat__change--negative, .pa-stat--hero-compact .pa-stat__change--negative {
6354
- color: #ef4444;
6379
+ color: var(--pa-negative);
6355
6380
  }
6356
- .pa-stat--hero .pa-stat__change--neutral, .pa-stat--hero-compact .pa-stat__change--neutral {
6357
- color: var(--pa-text-color-2);
6381
+ .pa-stat--hero .pa-stat__change--very-negative, .pa-stat--hero-compact .pa-stat__change--very-negative {
6382
+ color: var(--pa-very-negative);
6358
6383
  }
6359
6384
  .pa-stat--square {
6360
6385
  container-type: inline-size;
@@ -6497,21 +6522,21 @@ a.pa-card p {
6497
6522
  }
6498
6523
  .pa-list-basic--icon li::before {
6499
6524
  content: "✓";
6500
- color: #22c55e;
6525
+ color: var(--pa-success);
6501
6526
  font-weight: 600;
6502
6527
  flex-shrink: 0;
6503
6528
  }
6504
6529
  .pa-list-basic--icon.pa-list-basic--danger li::before {
6505
6530
  content: "✗";
6506
- color: #ef4444;
6531
+ color: var(--pa-danger);
6507
6532
  }
6508
6533
  .pa-list-basic--icon.pa-list-basic--info li::before {
6509
6534
  content: "→";
6510
- color: #17a2b8;
6535
+ color: var(--pa-info);
6511
6536
  }
6512
6537
  .pa-list-basic--icon.pa-list-basic--warning li::before {
6513
6538
  content: "!";
6514
- color: #f97316;
6539
+ color: var(--pa-warning);
6515
6540
  }
6516
6541
 
6517
6542
  .pa-list-ordered {
@@ -6767,7 +6792,7 @@ a.pa-card p {
6767
6792
  }
6768
6793
  .pa-composite-badge__button:focus {
6769
6794
  outline: none;
6770
- box-shadow: 0 0 0 2px rgba(239, 68, 68, 0.25);
6795
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--pa-danger) 25%, transparent);
6771
6796
  }
6772
6797
 
6773
6798
  /* ========================================
@@ -7031,7 +7056,7 @@ a.pa-card p {
7031
7056
  background-color: rgb(51, 149.4, 255);
7032
7057
  }
7033
7058
  .pa-composite-badge--btn-primary .pa-composite-badge__button:focus {
7034
- box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);
7059
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--pa-btn-primary-bg) 25%, transparent);
7035
7060
  }
7036
7061
  .pa-composite-badge--btn-secondary .pa-composite-badge__button {
7037
7062
  background-color: #6c757d;
@@ -7040,7 +7065,7 @@ a.pa-card p {
7040
7065
  background-color: #545b62;
7041
7066
  }
7042
7067
  .pa-composite-badge--btn-secondary .pa-composite-badge__button:focus {
7043
- box-shadow: 0 0 0 2px rgba(108, 117, 125, 0.25);
7068
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--pa-btn-secondary-bg) 25%, transparent);
7044
7069
  }
7045
7070
  .pa-composite-badge--btn-success .pa-composite-badge__button {
7046
7071
  background-color: #22c55e;
@@ -7049,7 +7074,7 @@ a.pa-card p {
7049
7074
  background-color: rgb(26.4935064935, 153.5064935065, 73.2467532468);
7050
7075
  }
7051
7076
  .pa-composite-badge--btn-success .pa-composite-badge__button:focus {
7052
- box-shadow: 0 0 0 2px rgba(34, 197, 94, 0.25);
7077
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--pa-success) 25%, transparent);
7053
7078
  }
7054
7079
  .pa-composite-badge--btn-warning .pa-composite-badge__button {
7055
7080
  background-color: #f97316;
@@ -7059,7 +7084,7 @@ a.pa-card p {
7059
7084
  background-color: rgb(214.4769874477, 91.129707113, 5.5230125523);
7060
7085
  }
7061
7086
  .pa-composite-badge--btn-warning .pa-composite-badge__button:focus {
7062
- box-shadow: 0 0 0 2px rgba(249, 115, 22, 0.25);
7087
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--pa-warning) 25%, transparent);
7063
7088
  }
7064
7089
  .pa-composite-badge--btn-info .pa-composite-badge__button {
7065
7090
  background-color: #17a2b8;
@@ -7068,7 +7093,7 @@ a.pa-card p {
7068
7093
  background-color: rgb(17.3333333333, 122.0869565217, 138.6666666667);
7069
7094
  }
7070
7095
  .pa-composite-badge--btn-info .pa-composite-badge__button:focus {
7071
- box-shadow: 0 0 0 2px rgba(23, 162, 184, 0.25);
7096
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--pa-info) 25%, transparent);
7072
7097
  }
7073
7098
  .pa-composite-badge--btn-light .pa-composite-badge__button {
7074
7099
  background-color: #f8f9fa;
@@ -7078,7 +7103,7 @@ a.pa-card p {
7078
7103
  background-color: #e9ecef;
7079
7104
  }
7080
7105
  .pa-composite-badge--btn-light .pa-composite-badge__button:focus {
7081
- box-shadow: 0 0 0 2px rgba(248, 249, 250, 0.25);
7106
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--pa-btn-light-bg) 25%, transparent);
7082
7107
  }
7083
7108
  .pa-composite-badge--btn-dark .pa-composite-badge__button {
7084
7109
  background-color: #343a40;
@@ -7087,7 +7112,7 @@ a.pa-card p {
7087
7112
  background-color: #1d2124;
7088
7113
  }
7089
7114
  .pa-composite-badge--btn-dark .pa-composite-badge__button:focus {
7090
- box-shadow: 0 0 0 2px rgba(52, 58, 64, 0.25);
7115
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--pa-btn-dark-bg) 25%, transparent);
7091
7116
  }
7092
7117
 
7093
7118
  /* ========================================
@@ -7167,17 +7192,17 @@ a.pa-card p {
7167
7192
  background-color: var(--pa-accent-light);
7168
7193
  }
7169
7194
  .pa-label--secondary {
7170
- background-color: rgba(108, 117, 125, 0.1);
7171
- color: #6c757d;
7172
- border-color: #6c757d;
7195
+ background-color: color-mix(in srgb, var(--pa-btn-secondary-bg) 10%, transparent);
7196
+ color: var(--pa-btn-secondary-bg);
7197
+ border-color: var(--pa-btn-secondary-bg);
7173
7198
  }
7174
7199
  .pa-label--secondary.pa-label--outline {
7175
7200
  background-color: transparent;
7176
- color: #6c757d;
7177
- border-color: #6c757d;
7201
+ color: var(--pa-btn-secondary-bg);
7202
+ border-color: var(--pa-btn-secondary-bg);
7178
7203
  }
7179
7204
  .pa-label--secondary.pa-label--outline:hover {
7180
- background-color: rgba(108, 117, 125, 0.1);
7205
+ background-color: color-mix(in srgb, var(--pa-btn-secondary-bg) 10%, transparent);
7181
7206
  }
7182
7207
  .pa-label--success {
7183
7208
  background-color: var(--pa-success-bg-light);
@@ -7764,15 +7789,16 @@ a.pa-card p {
7764
7789
  .pa-btn-split {
7765
7790
  position: relative;
7766
7791
  display: inline-flex;
7767
- border-radius: var(--pa-border-radius);
7768
- overflow: hidden;
7769
7792
  }
7770
- .pa-btn-split .pa-btn {
7771
- border-radius: 0;
7772
- }
7773
- .pa-btn-split .pa-btn:first-child {
7793
+ .pa-btn-split > .pa-btn:first-child {
7794
+ border-start-end-radius: 0;
7795
+ border-end-end-radius: 0;
7774
7796
  border-inline-end: none;
7775
7797
  }
7798
+ .pa-btn-split > .pa-btn-split__toggle {
7799
+ border-start-start-radius: 0;
7800
+ border-end-start-radius: 0;
7801
+ }
7776
7802
  .pa-btn-split__toggle {
7777
7803
  border-inline-start: 1px solid rgba(255, 255, 255, 0.25);
7778
7804
  padding-inline: 0;
@@ -8776,8 +8802,8 @@ a.pa-card p {
8776
8802
  }
8777
8803
  .pa-alert--primary {
8778
8804
  color: var(--pa-accent);
8779
- background-color: rgba(0, 123, 255, 0.08);
8780
- border-color: rgba(0, 123, 255, 0.2);
8805
+ background-color: color-mix(in srgb, var(--pa-accent) 8%, transparent);
8806
+ border-color: color-mix(in srgb, var(--pa-accent) 20%, transparent);
8781
8807
  }
8782
8808
  .pa-alert--secondary {
8783
8809
  color: var(--pa-text-color-2);
@@ -9047,7 +9073,7 @@ a.pa-card p {
9047
9073
  }
9048
9074
  .pa-callout--primary {
9049
9075
  border-inline-start-color: var(--pa-accent);
9050
- background-color: rgba(0, 123, 255, 0.08);
9076
+ background-color: color-mix(in srgb, var(--pa-accent) 8%, transparent);
9051
9077
  }
9052
9078
  .pa-callout--secondary {
9053
9079
  border-inline-start-color: var(--pa-text-color-2);
@@ -9722,7 +9748,7 @@ a.pa-card p {
9722
9748
  }
9723
9749
  .pa-input-wrapper__clear:hover {
9724
9750
  opacity: 1;
9725
- color: #ef4444;
9751
+ color: var(--pa-danger);
9726
9752
  }
9727
9753
  .pa-input-wrapper__clear:focus {
9728
9754
  outline: none;
@@ -9797,16 +9823,16 @@ a.pa-card p {
9797
9823
  }
9798
9824
  .pa-search-highlight__field {
9799
9825
  display: inline;
9800
- background-color: rgba(0, 123, 255, 0.15);
9801
- color: #007bff;
9826
+ background-color: color-mix(in srgb, var(--pa-accent) 15%, transparent);
9827
+ color: var(--pa-accent);
9802
9828
  padding: 0.2rem 0.4rem;
9803
9829
  border-radius: var(--pa-border-radius-sm);
9804
9830
  font-weight: 500;
9805
9831
  }
9806
9832
  .pa-search-highlight__operator {
9807
9833
  display: inline;
9808
- background-color: rgba(34, 197, 94, 0.15);
9809
- color: #22c55e;
9834
+ background-color: color-mix(in srgb, var(--pa-success) 15%, transparent);
9835
+ color: var(--pa-success);
9810
9836
  padding: 0.2rem 0.4rem;
9811
9837
  border-radius: var(--pa-border-radius-sm);
9812
9838
  font-weight: 500;
@@ -9957,24 +9983,24 @@ a.pa-card p {
9957
9983
  font-weight: 500;
9958
9984
  }
9959
9985
  .pa-inline-query-token--field {
9960
- background-color: rgba(0, 123, 255, 0.15);
9986
+ background-color: color-mix(in srgb, var(--pa-accent) 15%, transparent);
9961
9987
  color: var(--pa-text-color-1);
9962
9988
  }
9963
9989
  .pa-inline-query-token--field.pa-inline-query-token--invalid {
9964
- background-color: rgba(239, 68, 68, 0.15);
9990
+ background-color: color-mix(in srgb, var(--pa-danger) 15%, transparent);
9965
9991
  color: var(--pa-text-color-1);
9966
9992
  text-decoration: wavy underline;
9967
9993
  }
9968
9994
  .pa-inline-query-token--operator {
9969
- background-color: rgba(var(--pa-text-color-2), 0.15);
9995
+ background-color: color-mix(in srgb, var(--pa-text-color-2) 15%, transparent);
9970
9996
  color: var(--pa-text-color-1);
9971
9997
  }
9972
9998
  .pa-inline-query-token--value {
9973
- background-color: rgba(34, 197, 94, 0.15);
9999
+ background-color: color-mix(in srgb, var(--pa-success) 15%, transparent);
9974
10000
  color: var(--pa-text-color-1);
9975
10001
  }
9976
10002
  .pa-inline-query-token--keyword {
9977
- background-color: rgba(249, 115, 22, 0.15);
10003
+ background-color: color-mix(in srgb, var(--pa-warning) 15%, transparent);
9978
10004
  color: var(--pa-text-color-1);
9979
10005
  font-style: italic;
9980
10006
  }
@@ -10028,7 +10054,7 @@ a.pa-card p {
10028
10054
  flex-shrink: 0;
10029
10055
  font-size: 1.2rem;
10030
10056
  padding: 0.2rem 0.6rem;
10031
- background-color: rgba(var(--pa-text-color-2), 0.1);
10057
+ background-color: color-mix(in srgb, var(--pa-text-color-2) 10%, transparent);
10032
10058
  color: var(--pa-text-color-2);
10033
10059
  border-radius: var(--pa-border-radius-sm);
10034
10060
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
@@ -10257,12 +10283,12 @@ web-multiselect {
10257
10283
  cursor: pointer;
10258
10284
  }
10259
10285
  .pa-file-dropzone:hover {
10260
- border-color: #007bff;
10261
- background: rgba(0, 123, 255, 0.05);
10286
+ border-color: var(--pa-accent);
10287
+ background: color-mix(in srgb, var(--pa-accent) 5%, transparent);
10262
10288
  }
10263
10289
  .pa-file-dropzone--active {
10264
- border-color: #007bff;
10265
- background: rgba(0, 123, 255, 0.1);
10290
+ border-color: var(--pa-accent);
10291
+ background: color-mix(in srgb, var(--pa-accent) 10%, transparent);
10266
10292
  border-style: solid;
10267
10293
  }
10268
10294
  .pa-file-dropzone__input {
@@ -10288,7 +10314,7 @@ web-multiselect {
10288
10314
  margin-bottom: 0.4rem;
10289
10315
  }
10290
10316
  .pa-file-dropzone__text strong {
10291
- color: #007bff;
10317
+ color: var(--pa-accent);
10292
10318
  font-weight: 600;
10293
10319
  }
10294
10320
  .pa-file-dropzone__hint {
@@ -10327,7 +10353,7 @@ web-multiselect {
10327
10353
  transition: all 0.1s ease-out;
10328
10354
  }
10329
10355
  .pa-file-dropzone__file-card:hover {
10330
- border-color: #007bff;
10356
+ border-color: var(--pa-accent);
10331
10357
  box-shadow: 0 1.6px 4.8px rgba(0, 0, 0, 0.1);
10332
10358
  }
10333
10359
  .pa-file-dropzone__file-card-icon {
@@ -10355,7 +10381,7 @@ web-multiselect {
10355
10381
  width: 2rem;
10356
10382
  height: 2rem;
10357
10383
  border: none;
10358
- background: #ef4444;
10384
+ background: var(--pa-danger);
10359
10385
  color: #ffffff;
10360
10386
  cursor: pointer;
10361
10387
  border-radius: 50%;
@@ -10375,7 +10401,7 @@ web-multiselect {
10375
10401
  }
10376
10402
  .pa-file-dropzone__file-card-remove:hover {
10377
10403
  transform: scale(1.1);
10378
- background: rgba(239, 68, 68, 0.9);
10404
+ background: color-mix(in srgb, var(--pa-danger) 90%, transparent);
10379
10405
  }
10380
10406
  .pa-file-dropzone__image-card {
10381
10407
  position: relative;
@@ -10416,7 +10442,7 @@ web-multiselect {
10416
10442
  opacity: 1;
10417
10443
  }
10418
10444
  .pa-file-dropzone__image-card-remove:hover {
10419
- background: #ef4444;
10445
+ background: var(--pa-danger);
10420
10446
  transform: scale(1.1);
10421
10447
  }
10422
10448
  .pa-file-dropzone__summary {
@@ -10435,7 +10461,7 @@ web-multiselect {
10435
10461
  transition: background-color 0.1s ease-out;
10436
10462
  }
10437
10463
  .pa-file-dropzone__summary-line:hover {
10438
- background-color: rgba(0, 123, 255, 0.1);
10464
+ background-color: color-mix(in srgb, var(--pa-accent) 10%, transparent);
10439
10465
  }
10440
10466
  .pa-file-dropzone__summary-line:not(:last-child)::after {
10441
10467
  content: " • ";
@@ -10445,7 +10471,7 @@ web-multiselect {
10445
10471
  }
10446
10472
  .pa-file-dropzone__summary-count {
10447
10473
  font-weight: 500;
10448
- color: #007bff;
10474
+ color: var(--pa-accent);
10449
10475
  }
10450
10476
  .pa-file-dropzone__summary-size {
10451
10477
  color: var(--pa-text-color-2);
@@ -10519,7 +10545,7 @@ web-multiselect {
10519
10545
  justify-content: center;
10520
10546
  }
10521
10547
  .pa-file-popover__close:hover {
10522
- background: rgba(var(--pa-text-color-2), 0.1);
10548
+ background: color-mix(in srgb, var(--pa-text-color-2) 10%, transparent);
10523
10549
  color: var(--pa-text-color-1);
10524
10550
  }
10525
10551
  .pa-file-popover__body {
@@ -10553,10 +10579,10 @@ web-multiselect {
10553
10579
  color: var(--pa-text-color-1);
10554
10580
  }
10555
10581
  .pa-file-popover__table tbody tr:hover {
10556
- background: rgba(0, 123, 255, 0.05);
10582
+ background: color-mix(in srgb, var(--pa-accent) 5%, transparent);
10557
10583
  }
10558
10584
  .pa-file-popover__table tbody tr.uploading {
10559
- background: rgba(0, 123, 255, 0.1);
10585
+ background: color-mix(in srgb, var(--pa-accent) 10%, transparent);
10560
10586
  }
10561
10587
  .pa-file-popover__file-name {
10562
10588
  overflow: hidden;
@@ -10573,14 +10599,14 @@ web-multiselect {
10573
10599
  }
10574
10600
  .pa-file-popover__progress-bar {
10575
10601
  height: 6.4px;
10576
- background: rgba(0, 123, 255, 0.2);
10602
+ background: color-mix(in srgb, var(--pa-accent) 20%, transparent);
10577
10603
  border-radius: var(--pa-border-radius-sm);
10578
10604
  overflow: hidden;
10579
10605
  margin-bottom: 0.4rem;
10580
10606
  }
10581
10607
  .pa-file-popover__progress-fill {
10582
10608
  height: 100%;
10583
- background: #007bff;
10609
+ background: var(--pa-accent);
10584
10610
  border-radius: var(--pa-border-radius-sm);
10585
10611
  transition: width 0.48s ease;
10586
10612
  }
@@ -10597,13 +10623,13 @@ web-multiselect {
10597
10623
  color: var(--pa-text-color-2);
10598
10624
  }
10599
10625
  .pa-file-popover__status--uploading {
10600
- color: #007bff;
10626
+ color: var(--pa-accent);
10601
10627
  }
10602
10628
  .pa-file-popover__status--complete {
10603
- color: #22c55e;
10629
+ color: var(--pa-success);
10604
10630
  }
10605
10631
  .pa-file-popover__status--error {
10606
- color: #ef4444;
10632
+ color: var(--pa-danger);
10607
10633
  }
10608
10634
  .pa-file-popover__remove-cell {
10609
10635
  text-align: center;
@@ -10615,7 +10641,7 @@ web-multiselect {
10615
10641
  height: 3.2rem;
10616
10642
  border: 1px solid var(--pa-border-color);
10617
10643
  background: var(--pa-card-bg);
10618
- color: #ef4444;
10644
+ color: var(--pa-danger);
10619
10645
  cursor: pointer;
10620
10646
  border-radius: var(--pa-border-radius-sm);
10621
10647
  font-size: 2.4rem;
@@ -10627,9 +10653,9 @@ web-multiselect {
10627
10653
  font-weight: 700;
10628
10654
  }
10629
10655
  .pa-file-popover__remove-btn:hover {
10630
- background: #ef4444;
10656
+ background: var(--pa-danger);
10631
10657
  color: #ffffff;
10632
- border-color: #ef4444;
10658
+ border-color: var(--pa-danger);
10633
10659
  transform: scale(1.1);
10634
10660
  }
10635
10661
 
@@ -10666,9 +10692,9 @@ web-multiselect {
10666
10692
  display: flex;
10667
10693
  align-items: center;
10668
10694
  justify-content: center;
10669
- background: rgba(0, 123, 255, 0.1);
10695
+ background: color-mix(in srgb, var(--pa-accent) 10%, transparent);
10670
10696
  border-radius: var(--pa-border-radius);
10671
- color: #007bff;
10697
+ color: var(--pa-accent);
10672
10698
  }
10673
10699
  .pa-file-item__info {
10674
10700
  flex: 1;
@@ -10704,8 +10730,8 @@ web-multiselect {
10704
10730
  justify-content: center;
10705
10731
  }
10706
10732
  .pa-file-item__remove:hover {
10707
- background: rgba(239, 68, 68, 0.1);
10708
- color: #ef4444;
10733
+ background: color-mix(in srgb, var(--pa-danger) 10%, transparent);
10734
+ color: var(--pa-danger);
10709
10735
  }
10710
10736
  .pa-file-item__remove::before {
10711
10737
  content: "×";
@@ -10752,7 +10778,7 @@ web-multiselect {
10752
10778
  justify-content: center;
10753
10779
  }
10754
10780
  .pa-file-preview__remove:hover {
10755
- background: #ef4444;
10781
+ background: var(--pa-danger);
10756
10782
  transform: scale(1.1);
10757
10783
  }
10758
10784
  .pa-file-preview__remove::before {
@@ -10777,13 +10803,13 @@ web-multiselect {
10777
10803
  }
10778
10804
  .pa-file-progress__bar {
10779
10805
  height: 6.4px;
10780
- background: rgba(0, 123, 255, 0.2);
10806
+ background: color-mix(in srgb, var(--pa-accent) 20%, transparent);
10781
10807
  border-radius: var(--pa-border-radius-sm);
10782
10808
  overflow: hidden;
10783
10809
  }
10784
10810
  .pa-file-progress__fill {
10785
10811
  height: 100%;
10786
- background: #007bff;
10812
+ background: var(--pa-accent);
10787
10813
  border-radius: var(--pa-border-radius-sm);
10788
10814
  transition: width 0.48s ease;
10789
10815
  }
@@ -10800,10 +10826,10 @@ web-multiselect {
10800
10826
  font-weight: 600;
10801
10827
  }
10802
10828
  .pa-file-progress__status--complete {
10803
- color: #22c55e;
10829
+ color: var(--pa-success);
10804
10830
  }
10805
10831
  .pa-file-progress__status--error {
10806
- color: #ef4444;
10832
+ color: var(--pa-danger);
10807
10833
  }
10808
10834
 
10809
10835
  .pa-file-icon--pdf::before {
@@ -10835,9 +10861,9 @@ web-multiselect {
10835
10861
  }
10836
10862
 
10837
10863
  .pa-file-dropzone-overlay {
10838
- background: rgba(0, 123, 255, 0.15);
10864
+ background: color-mix(in srgb, var(--pa-accent) 15%, transparent);
10839
10865
  backdrop-filter: blur(3.2px);
10840
- border: 4.8px dashed #007bff;
10866
+ border: 4.8px dashed var(--pa-accent);
10841
10867
  border-radius: var(--pa-border-radius);
10842
10868
  display: flex;
10843
10869
  align-items: center;
@@ -10855,7 +10881,7 @@ web-multiselect {
10855
10881
  .pa-file-dropzone-overlay__text {
10856
10882
  font-size: 2rem;
10857
10883
  font-weight: 600;
10858
- color: #007bff;
10884
+ color: var(--pa-accent);
10859
10885
  }
10860
10886
 
10861
10887
  /* ========================================
@@ -10974,7 +11000,7 @@ web-multiselect {
10974
11000
  cursor: not-allowed;
10975
11001
  }
10976
11002
  .pa-checkbox-list__item--locked:hover {
10977
- background-color: rgba(249, 115, 22, 0.05);
11003
+ background-color: color-mix(in srgb, var(--pa-warning) 5%, transparent);
10978
11004
  }
10979
11005
  .pa-checkbox-list__item--locked .pa-checkbox-list__checkbox {
10980
11006
  cursor: not-allowed;
@@ -10985,7 +11011,7 @@ web-multiselect {
10985
11011
  position: relative;
10986
11012
  }
10987
11013
  .pa-checkbox-list__item--locked .pa-checkbox-list__label .pa-checkbox-list__text {
10988
- color: #f97316;
11014
+ color: var(--pa-warning);
10989
11015
  }
10990
11016
  .pa-checkbox-list__item--locked .pa-checkbox-list__label .pa-checkbox-list__text::before {
10991
11017
  content: "🔒 ";
@@ -11795,7 +11821,7 @@ tbody tr:hover .pa-comparison-table__copy {
11795
11821
  opacity: 1;
11796
11822
  }
11797
11823
  .pa-comparison-table__changed {
11798
- background-color: rgba(244, 114, 182, 0.15);
11824
+ background-color: color-mix(in srgb, #ec4899 15%, transparent);
11799
11825
  position: relative;
11800
11826
  }
11801
11827
  .pa-comparison-table__changed::before {
@@ -11808,19 +11834,19 @@ tbody tr:hover .pa-comparison-table__copy {
11808
11834
  background-color: #ec4899;
11809
11835
  }
11810
11836
  .pa-comparison-table__changed--solid {
11811
- background-color: rgba(244, 114, 182, 0.25) !important;
11837
+ background-color: color-mix(in srgb, #ec4899 25%, transparent) !important;
11812
11838
  }
11813
11839
  .pa-comparison-table__changed--solid::before {
11814
11840
  content: none;
11815
11841
  }
11816
11842
  .pa-comparison-table__conflict {
11817
- background-color: rgba(251, 146, 60, 0.15);
11843
+ background-color: color-mix(in srgb, #f97316 15%, transparent);
11818
11844
  }
11819
11845
  .pa-comparison-table__conflict::before {
11820
11846
  background-color: #f97316;
11821
11847
  }
11822
11848
  .pa-comparison-table__conflict--solid {
11823
- background-color: rgba(251, 146, 60, 0.25) !important;
11849
+ background-color: color-mix(in srgb, #f97316 25%, transparent) !important;
11824
11850
  }
11825
11851
  .pa-comparison-table__conflict--solid::before {
11826
11852
  content: none;
@@ -12517,6 +12543,7 @@ code {
12517
12543
  .pa-modal__footer {
12518
12544
  padding: 1.2rem 1.6rem;
12519
12545
  border-top: 1px solid var(--pa-border-color);
12546
+ border-radius: 0 0 var(--pa-border-radius) var(--pa-border-radius);
12520
12547
  display: flex;
12521
12548
  justify-content: flex-end;
12522
12549
  gap: 1.2rem;
@@ -12559,6 +12586,55 @@ code {
12559
12586
  color: var(--pa-btn-danger-text);
12560
12587
  }
12561
12588
 
12589
+ .pa-modal--banded .pa-modal__header {
12590
+ background-color: var(--pa-modal-band-bg);
12591
+ color: var(--pa-modal-band-text);
12592
+ border-bottom-color: var(--pa-modal-band-border);
12593
+ }
12594
+ .pa-modal--banded .pa-modal__header .pa-modal__title {
12595
+ color: var(--pa-modal-band-text);
12596
+ }
12597
+ .pa-modal--banded .pa-modal__footer {
12598
+ background-color: var(--pa-modal-band-bg);
12599
+ color: var(--pa-modal-band-text);
12600
+ border-top-color: var(--pa-modal-band-border);
12601
+ }
12602
+ .pa-modal--banded .pa-modal__header .pa-btn,
12603
+ .pa-modal--banded .pa-modal__footer .pa-btn {
12604
+ background-color: var(--pa-text-color-1);
12605
+ color: var(--pa-modal-content-bg);
12606
+ border-color: var(--pa-text-color-1);
12607
+ }
12608
+ .pa-modal--banded .pa-modal__header .pa-btn:hover,
12609
+ .pa-modal--banded .pa-modal__footer .pa-btn:hover {
12610
+ background-color: color-mix(in srgb, var(--pa-text-color-1) 85%, transparent);
12611
+ border-color: color-mix(in srgb, var(--pa-text-color-1) 85%, transparent);
12612
+ }
12613
+
12614
+ .pa-modal--banded.pa-modal--success {
12615
+ --pa-modal-band-bg: var(--pa-alert-success-bg);
12616
+ --pa-modal-band-text: var(--pa-alert-success-text);
12617
+ --pa-modal-band-border: var(--pa-alert-success-border);
12618
+ }
12619
+
12620
+ .pa-modal--banded.pa-modal--warning {
12621
+ --pa-modal-band-bg: var(--pa-alert-warning-bg);
12622
+ --pa-modal-band-text: var(--pa-alert-warning-text);
12623
+ --pa-modal-band-border: var(--pa-alert-warning-border);
12624
+ }
12625
+
12626
+ .pa-modal--banded.pa-modal--danger {
12627
+ --pa-modal-band-bg: var(--pa-alert-danger-bg);
12628
+ --pa-modal-band-text: var(--pa-alert-danger-text);
12629
+ --pa-modal-band-border: var(--pa-alert-danger-border);
12630
+ }
12631
+
12632
+ .pa-modal--banded.pa-modal--info {
12633
+ --pa-modal-band-bg: var(--pa-alert-info-bg);
12634
+ --pa-modal-band-text: var(--pa-alert-info-text);
12635
+ --pa-modal-band-border: var(--pa-alert-info-border);
12636
+ }
12637
+
12562
12638
  .pa-modal__body--scrollable {
12563
12639
  max-height: 60vh;
12564
12640
  overflow-y: auto;
@@ -13258,51 +13334,51 @@ code {
13258
13334
  width: 15px;
13259
13335
  height: 15px;
13260
13336
  background: var(--pa-main-bg);
13261
- border: 1px solid #007bff;
13262
- border-radius: 50%;
13263
- box-shadow: 3px 3px 0 rgba(0, 123, 255, 0.3);
13337
+ border: 1px solid var(--pa-accent);
13338
+ border-radius: 30%;
13339
+ box-shadow: 3px 3px 0 color-mix(in srgb, var(--pa-accent) 50%, transparent);
13264
13340
  }
13265
13341
  .pa-timeline--simple .pa-timeline__item--primary::before {
13266
- border-color: #007bff;
13267
- box-shadow: 3px 3px 0 rgba(0, 123, 255, 0.3);
13342
+ border-color: var(--pa-btn-primary-bg);
13343
+ box-shadow: 3px 3px 0 color-mix(in srgb, var(--pa-btn-primary-bg) 50%, transparent);
13268
13344
  }
13269
13345
  .pa-timeline--simple .pa-timeline__item--success::before {
13270
- border-color: #22c55e;
13271
- box-shadow: 3px 3px 0 rgba(34, 197, 94, 0.3);
13346
+ border-color: var(--pa-success);
13347
+ box-shadow: 3px 3px 0 color-mix(in srgb, var(--pa-success) 50%, transparent);
13272
13348
  }
13273
13349
  .pa-timeline--simple .pa-timeline__item--warning::before {
13274
- border-color: #f97316;
13275
- box-shadow: 3px 3px 0 rgba(249, 115, 22, 0.3);
13350
+ border-color: var(--pa-warning);
13351
+ box-shadow: 3px 3px 0 color-mix(in srgb, var(--pa-warning) 50%, transparent);
13276
13352
  }
13277
13353
  .pa-timeline--simple .pa-timeline__item--danger::before {
13278
- border-color: #ef4444;
13279
- box-shadow: 3px 3px 0 rgba(239, 68, 68, 0.3);
13354
+ border-color: var(--pa-danger);
13355
+ box-shadow: 3px 3px 0 color-mix(in srgb, var(--pa-danger) 50%, transparent);
13280
13356
  }
13281
13357
  .pa-timeline--simple .pa-timeline__item--info::before {
13282
- border-color: #17a2b8;
13283
- box-shadow: 3px 3px 0 rgba(23, 162, 184, 0.3);
13358
+ border-color: var(--pa-info);
13359
+ box-shadow: 3px 3px 0 color-mix(in srgb, var(--pa-info) 50%, transparent);
13284
13360
  }
13285
13361
  .pa-timeline--simple .pa-timeline__item--secondary::before {
13286
13362
  border-color: var(--pa-text-color-2);
13287
- box-shadow: 3px 3px 0 rgba(var(--pa-text-color-2), 0.3);
13363
+ box-shadow: 3px 3px 0 color-mix(in srgb, var(--pa-text-color-2) 50%, transparent);
13288
13364
  }
13289
13365
  .pa-timeline--simple .pa-timeline__item--filled::before {
13290
- background: #007bff;
13366
+ background: var(--pa-accent);
13291
13367
  }
13292
13368
  .pa-timeline--simple .pa-timeline__item--filled.pa-timeline__item--primary::before {
13293
- background: #007bff;
13369
+ background: var(--pa-btn-primary-bg);
13294
13370
  }
13295
13371
  .pa-timeline--simple .pa-timeline__item--filled.pa-timeline__item--success::before {
13296
- background: #22c55e;
13372
+ background: var(--pa-success);
13297
13373
  }
13298
13374
  .pa-timeline--simple .pa-timeline__item--filled.pa-timeline__item--warning::before {
13299
- background: #f97316;
13375
+ background: var(--pa-warning);
13300
13376
  }
13301
13377
  .pa-timeline--simple .pa-timeline__item--filled.pa-timeline__item--danger::before {
13302
- background: #ef4444;
13378
+ background: var(--pa-danger);
13303
13379
  }
13304
13380
  .pa-timeline--simple .pa-timeline__item--filled.pa-timeline__item--info::before {
13305
- background: #17a2b8;
13381
+ background: var(--pa-info);
13306
13382
  }
13307
13383
  .pa-timeline--simple .pa-timeline__item--filled.pa-timeline__item--secondary::before {
13308
13384
  background: var(--pa-text-color-2);
@@ -13330,7 +13406,7 @@ code {
13330
13406
  content: "";
13331
13407
  position: absolute;
13332
13408
  width: 2px;
13333
- background: #007bff;
13409
+ background: var(--pa-accent);
13334
13410
  top: 0;
13335
13411
  bottom: 0;
13336
13412
  left: 50%;
@@ -13375,7 +13451,7 @@ code {
13375
13451
  height: 2px;
13376
13452
  top: calc(50% - 1px);
13377
13453
  right: 8px;
13378
- background: #007bff;
13454
+ background: var(--pa-accent);
13379
13455
  z-index: 1;
13380
13456
  }
13381
13457
  .pa-timeline--alternating .pa-timeline__item:nth-child(even) {
@@ -13411,7 +13487,7 @@ code {
13411
13487
  height: 2px;
13412
13488
  top: calc(50% - 1px);
13413
13489
  left: 8px;
13414
- background: #007bff;
13490
+ background: var(--pa-accent);
13415
13491
  z-index: 1;
13416
13492
  }
13417
13493
  .pa-timeline--alternating .pa-timeline__date {
@@ -13421,7 +13497,7 @@ code {
13421
13497
  text-align: center;
13422
13498
  font-size: 1.4rem;
13423
13499
  font-weight: 700;
13424
- color: #007bff;
13500
+ color: var(--pa-accent);
13425
13501
  text-transform: uppercase;
13426
13502
  letter-spacing: 1px;
13427
13503
  z-index: 1;
@@ -13434,15 +13510,15 @@ code {
13434
13510
  width: 40px;
13435
13511
  height: 40px;
13436
13512
  top: calc(50% - 20px);
13437
- background: #f97316;
13438
- border: 2px solid #007bff;
13513
+ background: var(--pa-warning);
13514
+ border: 2px solid var(--pa-accent);
13439
13515
  border-radius: 50%;
13440
13516
  font-size: 1.8rem;
13441
- color: #007bff;
13517
+ color: var(--pa-accent);
13442
13518
  z-index: 1;
13443
13519
  }
13444
13520
  .pa-timeline--alternating .pa-timeline__content {
13445
- background: #f97316;
13521
+ background: var(--pa-warning);
13446
13522
  position: relative;
13447
13523
  }
13448
13524
  .pa-timeline--alternating .pa-timeline__content h3 {
@@ -13455,7 +13531,7 @@ code {
13455
13531
  margin: 0;
13456
13532
  font-size: 1.6rem;
13457
13533
  line-height: 1.8;
13458
- color: #856404;
13534
+ color: var(--pa-warning-text);
13459
13535
  }
13460
13536
  @media (max-width: 767px) {
13461
13537
  .pa-timeline--alternating:not(.pa-timeline--keep-layout)::after {
@@ -13593,7 +13669,7 @@ code {
13593
13669
  line-height: 1.8;
13594
13670
  }
13595
13671
  .pa-timeline--feed .pa-timeline__content a {
13596
- color: #007bff;
13672
+ color: var(--pa-accent);
13597
13673
  text-decoration: none;
13598
13674
  font-weight: 500;
13599
13675
  }
@@ -14196,11 +14272,11 @@ code {
14196
14272
  background: #fff;
14197
14273
  }
14198
14274
  .pa-logic-tree__block--and {
14199
- border-color: #f97316;
14275
+ border-color: var(--pa-warning);
14200
14276
  background: linear-gradient(135deg, #fff8e1 0%, #ffffff 100%);
14201
14277
  }
14202
14278
  .pa-logic-tree__block--or {
14203
- border-color: #17a2b8;
14279
+ border-color: var(--pa-info);
14204
14280
  background: linear-gradient(135deg, #e3f2fd 0%, #ffffff 100%);
14205
14281
  }
14206
14282
  .pa-logic-tree__block--group {
@@ -14450,14 +14526,14 @@ code {
14450
14526
  background: none;
14451
14527
  border: none;
14452
14528
  padding: 0;
14453
- color: #007bff;
14529
+ color: var(--pa-accent);
14454
14530
  font-size: 1.4rem;
14455
14531
  font-weight: 500;
14456
14532
  cursor: pointer;
14457
14533
  transition: color 0.1s ease-out;
14458
14534
  }
14459
14535
  .pa-notifications__mark-read:hover {
14460
- color: rgba(0, 123, 255, 0.12);
14536
+ color: var(--pa-accent-hover);
14461
14537
  }
14462
14538
 
14463
14539
  .pa-notifications__list {
@@ -14483,10 +14559,10 @@ code {
14483
14559
  background-color: var(--pa-accent-light);
14484
14560
  }
14485
14561
  .pa-notifications__item--unread {
14486
- background-color: rgba(0, 123, 255, 0.05);
14562
+ background-color: color-mix(in srgb, var(--pa-accent) 5%, transparent);
14487
14563
  }
14488
14564
  .pa-notifications__item--unread:hover {
14489
- background-color: rgba(0, 123, 255, 0.1);
14565
+ background-color: color-mix(in srgb, var(--pa-accent) 10%, transparent);
14490
14566
  }
14491
14567
 
14492
14568
  .pa-notifications__icon-wrapper {
@@ -14496,29 +14572,29 @@ code {
14496
14572
  display: flex;
14497
14573
  align-items: center;
14498
14574
  justify-content: center;
14499
- border-radius: 50%;
14500
14575
  font-size: 1.6rem;
14501
- background-color: var(--pa-accent-light);
14502
14576
  color: var(--pa-accent);
14577
+ border: 1px solid transparent;
14578
+ border-radius: var(--pa-border-radius);
14503
14579
  }
14504
14580
  .pa-notifications__icon-wrapper--primary {
14505
- background-color: rgba(0, 123, 255, 0.1);
14506
- color: #007bff;
14581
+ border-color: var(--pa-btn-primary-bg);
14582
+ color: var(--pa-btn-primary-bg);
14507
14583
  }
14508
14584
  .pa-notifications__icon-wrapper--success {
14509
- background-color: rgba(34, 197, 94, 0.1);
14510
- color: #22c55e;
14585
+ border-color: var(--pa-success);
14586
+ color: var(--pa-success);
14511
14587
  }
14512
14588
  .pa-notifications__icon-wrapper--warning {
14513
- background-color: rgba(249, 115, 22, 0.1);
14514
- color: #f97316;
14589
+ border-color: var(--pa-warning);
14590
+ color: var(--pa-warning);
14515
14591
  }
14516
14592
  .pa-notifications__icon-wrapper--danger {
14517
- background-color: rgba(239, 68, 68, 0.1);
14518
- color: #ef4444;
14593
+ border-color: var(--pa-danger);
14594
+ color: var(--pa-danger);
14519
14595
  }
14520
14596
  .pa-notifications__icon-wrapper--secondary {
14521
- background-color: rgba(var(--pa-text-color-2), 0.1);
14597
+ border-color: var(--pa-text-color-2);
14522
14598
  color: var(--pa-text-color-2);
14523
14599
  }
14524
14600
 
@@ -14557,14 +14633,14 @@ code {
14557
14633
  text-align: center;
14558
14634
  }
14559
14635
  .pa-notifications__footer a {
14560
- color: #007bff;
14636
+ color: var(--pa-accent);
14561
14637
  font-size: 1.4rem;
14562
14638
  font-weight: 500;
14563
14639
  text-decoration: none;
14564
14640
  transition: color 0.1s ease-out;
14565
14641
  }
14566
14642
  .pa-notifications__footer a:hover {
14567
- color: rgba(0, 123, 255, 0.12);
14643
+ color: var(--pa-accent-hover);
14568
14644
  }
14569
14645
 
14570
14646
  @media (max-width: 768px) {
@@ -14696,7 +14772,7 @@ code {
14696
14772
  display: flex;
14697
14773
  gap: 0.8rem;
14698
14774
  justify-content: flex-end;
14699
- background-color: rgba(225, 229, 233, 0.3);
14775
+ background-color: color-mix(in srgb, var(--pa-border-color) 30%, transparent);
14700
14776
  }
14701
14777
  .pa-popconfirm__actions .pa-btn {
14702
14778
  font-size: 1.2rem;
@@ -15255,7 +15331,7 @@ code {
15255
15331
  .pa-field--copied .pa-field__value::after {
15256
15332
  content: "Copied!" !important;
15257
15333
  opacity: 1 !important;
15258
- color: var(--pa-color-4, #28a745);
15334
+ color: var(--pa-success);
15259
15335
  }
15260
15336
 
15261
15337
  .pa-field-group {
@@ -15515,16 +15591,20 @@ code {
15515
15591
  font-size: 1.3rem;
15516
15592
  }
15517
15593
  .pa-fields--chips .pa-field__value--success {
15518
- background: var(--pa-success-bg-light, rgba(0, 200, 80, 0.12));
15519
- color: var(--pa-success-color, #28a745);
15594
+ background: var(--pa-success-bg-light);
15595
+ color: var(--pa-success);
15520
15596
  }
15521
15597
  .pa-fields--chips .pa-field__value--warning {
15522
- background: var(--pa-warning-bg-light, rgba(255, 165, 0, 0.12));
15523
- color: var(--pa-warning-color, #e68a00);
15598
+ background: var(--pa-warning-bg-light);
15599
+ color: var(--pa-warning);
15524
15600
  }
15525
15601
  .pa-fields--chips .pa-field__value--danger {
15526
- background: var(--pa-danger-bg-light, rgba(255, 0, 0, 0.12));
15527
- color: var(--pa-danger-color, #dc3545);
15602
+ background: var(--pa-danger-bg-light);
15603
+ color: var(--pa-danger);
15604
+ }
15605
+ .pa-fields--chips .pa-field__value--info {
15606
+ background: var(--pa-info-bg-light);
15607
+ color: var(--pa-info);
15528
15608
  }
15529
15609
 
15530
15610
  .pa-desc-container {
@@ -15684,7 +15764,7 @@ code {
15684
15764
  .pa-desc-table__value--copied::after {
15685
15765
  content: "Copied!" !important;
15686
15766
  opacity: 1 !important;
15687
- color: var(--pa-color-4, #28a745);
15767
+ color: var(--pa-success);
15688
15768
  }
15689
15769
 
15690
15770
  .pa-dot-leaders {
@@ -15960,7 +16040,7 @@ code {
15960
16040
  .pa-banded__row--copied .pa-banded__value::after {
15961
16041
  content: "Copied!" !important;
15962
16042
  opacity: 1 !important;
15963
- color: var(--pa-color-4, #28a745);
16043
+ color: var(--pa-success);
15964
16044
  }
15965
16045
 
15966
16046
  .pa-accent-grid {
@@ -15971,19 +16051,19 @@ code {
15971
16051
  .pa-accent-grid__item {
15972
16052
  padding: 0.8rem 1.2rem;
15973
16053
  padding-inline-start: 1.4rem;
15974
- border-inline-start: 3px solid var(--pa-accent, #3b82f6);
16054
+ border-inline-start: 3px solid var(--pa-accent);
15975
16055
  }
15976
16056
  .pa-accent-grid__item--success {
15977
- border-inline-start-color: var(--pa-success-color, #28a745);
16057
+ border-inline-start-color: var(--pa-success);
15978
16058
  }
15979
16059
  .pa-accent-grid__item--warning {
15980
- border-inline-start-color: var(--pa-warning-color, #e68a00);
16060
+ border-inline-start-color: var(--pa-warning);
15981
16061
  }
15982
16062
  .pa-accent-grid__item--danger {
15983
- border-inline-start-color: var(--pa-danger-color, #dc3545);
16063
+ border-inline-start-color: var(--pa-danger);
15984
16064
  }
15985
16065
  .pa-accent-grid__item--info {
15986
- border-inline-start-color: var(--pa-info-color, #17a2b8);
16066
+ border-inline-start-color: var(--pa-info);
15987
16067
  }
15988
16068
  .pa-accent-grid__label {
15989
16069
  font-size: 1.1rem;
@@ -16050,7 +16130,7 @@ code {
16050
16130
  .pa-accent-grid__item--copied .pa-accent-grid__value::after {
16051
16131
  content: "Copied!" !important;
16052
16132
  opacity: 1 !important;
16053
- color: var(--pa-color-4, #28a745);
16133
+ color: var(--pa-success);
16054
16134
  }
16055
16135
 
16056
16136
  /* ========================================
@@ -16060,7 +16140,7 @@ code {
16060
16140
  .pa-progress {
16061
16141
  width: 100%;
16062
16142
  height: 0.8rem;
16063
- background: color-mix(in srgb, var(--pa-text-color-1) 12%, transparent);
16143
+ background: var(--pa-surface-track);
16064
16144
  border-radius: var(--pa-border-radius);
16065
16145
  overflow: hidden;
16066
16146
  position: relative;
@@ -16068,7 +16148,7 @@ code {
16068
16148
  .pa-progress__fill {
16069
16149
  height: 100%;
16070
16150
  width: var(--value, 0%);
16071
- background: #007bff;
16151
+ background: var(--pa-accent);
16072
16152
  border-radius: inherit;
16073
16153
  transition: width 0.25s ease;
16074
16154
  }
@@ -16093,16 +16173,16 @@ code {
16093
16173
  height: 1.2rem;
16094
16174
  }
16095
16175
  .pa-progress--success > .pa-progress__fill {
16096
- background: #22c55e;
16176
+ background: var(--pa-success);
16097
16177
  }
16098
16178
  .pa-progress--warning > .pa-progress__fill {
16099
- background: #f97316;
16179
+ background: var(--pa-warning);
16100
16180
  }
16101
16181
  .pa-progress--danger > .pa-progress__fill {
16102
- background: #ef4444;
16182
+ background: var(--pa-danger);
16103
16183
  }
16104
16184
  .pa-progress--info > .pa-progress__fill {
16105
- background: #17a2b8;
16185
+ background: var(--pa-info);
16106
16186
  }
16107
16187
  .pa-progress--rounded {
16108
16188
  border-radius: 50rem;
@@ -16135,28 +16215,28 @@ code {
16135
16215
  height: 1.2rem;
16136
16216
  border-radius: var(--pa-border-radius);
16137
16217
  overflow: hidden;
16138
- background: color-mix(in srgb, var(--pa-text-color-1) 12%, transparent);
16218
+ background: var(--pa-surface-track);
16139
16219
  }
16140
16220
  .pa-stacked-bar__segment {
16141
16221
  height: 100%;
16142
16222
  width: var(--value, 0%);
16143
16223
  transition: width 0.25s ease;
16144
- background: #007bff;
16224
+ background: var(--pa-accent);
16145
16225
  }
16146
16226
  .pa-stacked-bar__segment--success {
16147
- background: #22c55e;
16227
+ background: var(--pa-success);
16148
16228
  }
16149
16229
  .pa-stacked-bar__segment--warning {
16150
- background: #f97316;
16230
+ background: var(--pa-warning);
16151
16231
  }
16152
16232
  .pa-stacked-bar__segment--danger {
16153
- background: #ef4444;
16233
+ background: var(--pa-danger);
16154
16234
  }
16155
16235
  .pa-stacked-bar__segment--info {
16156
- background: #17a2b8;
16236
+ background: var(--pa-info);
16157
16237
  }
16158
16238
  .pa-stacked-bar__segment--secondary {
16159
- background: #6c757d;
16239
+ background: var(--pa-btn-secondary-bg);
16160
16240
  }
16161
16241
  .pa-stacked-bar__legend {
16162
16242
  display: flex;
@@ -16178,22 +16258,22 @@ code {
16178
16258
  flex-shrink: 0;
16179
16259
  }
16180
16260
  .pa-stacked-bar__legend-swatch--primary {
16181
- background: #007bff;
16261
+ background: var(--pa-accent);
16182
16262
  }
16183
16263
  .pa-stacked-bar__legend-swatch--success {
16184
- background: #22c55e;
16264
+ background: var(--pa-success);
16185
16265
  }
16186
16266
  .pa-stacked-bar__legend-swatch--warning {
16187
- background: #f97316;
16267
+ background: var(--pa-warning);
16188
16268
  }
16189
16269
  .pa-stacked-bar__legend-swatch--danger {
16190
- background: #ef4444;
16270
+ background: var(--pa-danger);
16191
16271
  }
16192
16272
  .pa-stacked-bar__legend-swatch--info {
16193
- background: #17a2b8;
16273
+ background: var(--pa-info);
16194
16274
  }
16195
16275
  .pa-stacked-bar__legend-swatch--secondary {
16196
- background: #6c757d;
16276
+ background: var(--pa-btn-secondary-bg);
16197
16277
  }
16198
16278
  .pa-stacked-bar--sm {
16199
16279
  height: 0.5rem;
@@ -16209,7 +16289,7 @@ code {
16209
16289
  width: 8rem;
16210
16290
  height: 8rem;
16211
16291
  border-radius: 50%;
16212
- background: conic-gradient(#007bff calc(var(--value, 0) * 3.6deg), color-mix(in srgb, var(--pa-text-color-1) 12%, transparent) 0deg);
16292
+ background: conic-gradient(var(--pa-accent) calc(var(--value, 0) * 3.6deg), var(--pa-surface-track) 0deg);
16213
16293
  display: flex;
16214
16294
  align-items: center;
16215
16295
  justify-content: center;
@@ -16257,57 +16337,65 @@ code {
16257
16337
  font-size: 1.2rem;
16258
16338
  }
16259
16339
  .pa-progress-ring--success {
16260
- background: conic-gradient(#22c55e calc(var(--value, 0) * 3.6deg), color-mix(in srgb, var(--pa-text-color-1) 12%, transparent) 0deg);
16340
+ background: conic-gradient(var(--pa-success) calc(var(--value, 0) * 3.6deg), var(--pa-surface-track) 0deg);
16261
16341
  }
16262
16342
  .pa-progress-ring--warning {
16263
- background: conic-gradient(#f97316 calc(var(--value, 0) * 3.6deg), color-mix(in srgb, var(--pa-text-color-1) 12%, transparent) 0deg);
16343
+ background: conic-gradient(var(--pa-warning) calc(var(--value, 0) * 3.6deg), var(--pa-surface-track) 0deg);
16264
16344
  }
16265
16345
  .pa-progress-ring--danger {
16266
- background: conic-gradient(#ef4444 calc(var(--value, 0) * 3.6deg), color-mix(in srgb, var(--pa-text-color-1) 12%, transparent) 0deg);
16346
+ background: conic-gradient(var(--pa-danger) calc(var(--value, 0) * 3.6deg), var(--pa-surface-track) 0deg);
16267
16347
  }
16268
16348
  .pa-progress-ring--info {
16269
- background: conic-gradient(#17a2b8 calc(var(--value, 0) * 3.6deg), color-mix(in srgb, var(--pa-text-color-1) 12%, transparent) 0deg);
16349
+ background: conic-gradient(var(--pa-info) calc(var(--value, 0) * 3.6deg), var(--pa-surface-track) 0deg);
16270
16350
  }
16271
16351
 
16272
16352
  .pa-gauge {
16273
- width: 12rem;
16274
- height: calc(12rem / 2);
16275
- border-radius: 12rem 12rem 0 0;
16276
- overflow: hidden;
16277
- background: conic-gradient(from 0.75turn, #007bff calc(var(--value, 0) * 1.8deg), color-mix(in srgb, var(--pa-text-color-1) 12%, transparent) 0deg);
16353
+ --pa-gauge-fill: var(--pa-accent);
16354
+ --pa-gauge-size: 12rem;
16355
+ width: var(--pa-gauge-size);
16356
+ height: calc(var(--pa-gauge-size) / 2);
16357
+ margin-bottom: 1.6rem;
16278
16358
  position: relative;
16279
16359
  flex-shrink: 0;
16280
16360
  }
16361
+ .pa-gauge::before {
16362
+ content: "";
16363
+ position: absolute;
16364
+ inset: 0;
16365
+ border-radius: var(--pa-gauge-size) var(--pa-gauge-size) 0 0;
16366
+ background: conic-gradient(from 0.75turn at 50% 100%, var(--pa-gauge-fill) calc(var(--value, 0) * 1.8deg), var(--pa-surface-track) 0deg);
16367
+ -webkit-mask-image: radial-gradient(circle farthest-side at 50% 100%, transparent 0 70%, #000 70%);
16368
+ mask-image: radial-gradient(circle farthest-side at 50% 100%, transparent 0 70%, #000 70%);
16369
+ }
16281
16370
  .pa-gauge__inner {
16282
16371
  position: absolute;
16283
16372
  bottom: 0;
16284
16373
  left: 15%;
16285
16374
  right: 15%;
16286
16375
  height: 70%;
16287
- border-radius: 12rem 12rem 0 0;
16288
- background: var(--pa-card-bg);
16289
16376
  display: flex;
16290
- flex-direction: column;
16291
- align-items: center;
16292
- justify-content: flex-end;
16293
- padding-bottom: 0.4rem;
16377
+ align-items: flex-end;
16378
+ justify-content: center;
16294
16379
  }
16295
16380
  .pa-gauge__value {
16296
- font-size: 2.4rem;
16381
+ font-size: 2.8rem;
16297
16382
  font-weight: 700;
16298
16383
  line-height: 1;
16299
16384
  color: var(--pa-text-color-1);
16300
16385
  }
16301
- .pa-gauge__label {
16302
- font-size: 1.2rem;
16303
- color: var(--pa-text-color-2);
16304
- margin-top: 0.4rem;
16305
- }
16306
- .pa-gauge__min, .pa-gauge__max {
16386
+ .pa-gauge__label, .pa-gauge__min, .pa-gauge__max {
16307
16387
  position: absolute;
16308
- bottom: 0;
16388
+ top: 100%;
16389
+ margin-top: 0.4rem;
16309
16390
  font-size: 1rem;
16391
+ line-height: 1.2rem;
16310
16392
  color: var(--pa-text-color-2);
16393
+ white-space: nowrap;
16394
+ }
16395
+ .pa-gauge__label {
16396
+ left: 50%;
16397
+ transform: translateX(-50%);
16398
+ font-size: 1.2rem;
16311
16399
  }
16312
16400
  .pa-gauge__min {
16313
16401
  left: 0;
@@ -16316,19 +16404,19 @@ code {
16316
16404
  right: 0;
16317
16405
  }
16318
16406
  .pa-gauge--success {
16319
- background: conic-gradient(from 0.75turn, #22c55e calc(var(--value, 0) * 1.8deg), color-mix(in srgb, var(--pa-text-color-1) 12%, transparent) 0deg);
16407
+ --pa-gauge-fill: var(--pa-success);
16320
16408
  }
16321
16409
  .pa-gauge--warning {
16322
- background: conic-gradient(from 0.75turn, #f97316 calc(var(--value, 0) * 1.8deg), color-mix(in srgb, var(--pa-text-color-1) 12%, transparent) 0deg);
16410
+ --pa-gauge-fill: var(--pa-warning);
16323
16411
  }
16324
16412
  .pa-gauge--danger {
16325
- background: conic-gradient(from 0.75turn, #ef4444 calc(var(--value, 0) * 1.8deg), color-mix(in srgb, var(--pa-text-color-1) 12%, transparent) 0deg);
16413
+ --pa-gauge-fill: var(--pa-danger);
16326
16414
  }
16327
16415
  .pa-gauge--info {
16328
- background: conic-gradient(from 0.75turn, #17a2b8 calc(var(--value, 0) * 1.8deg), color-mix(in srgb, var(--pa-text-color-1) 12%, transparent) 0deg);
16416
+ --pa-gauge-fill: var(--pa-info);
16329
16417
  }
16330
- .pa-gauge--zones {
16331
- background: conic-gradient(from 0.75turn, #22c55e 0deg, #22c55e 90deg, #f97316 90deg, #f97316 135deg, #ef4444 135deg, #ef4444 180deg, color-mix(in srgb, var(--pa-text-color-1) 12%, transparent) 180deg);
16418
+ .pa-gauge--zones::before {
16419
+ background: conic-gradient(from 0.75turn at 50% 100%, var(--pa-success) 0deg, var(--pa-success) 90deg, var(--pa-warning) 90deg, var(--pa-warning) 135deg, var(--pa-danger) 135deg, var(--pa-danger) 180deg, var(--pa-surface-track) 180deg);
16332
16420
  }
16333
16421
 
16334
16422
  .pa-data-bar {
@@ -16346,31 +16434,31 @@ code {
16346
16434
  .pa-data-bar__track {
16347
16435
  width: 100%;
16348
16436
  height: 0.4rem;
16349
- background: rgba(0, 0, 0, 0.06);
16437
+ background: var(--pa-surface-track);
16350
16438
  border-radius: var(--pa-border-radius-sm);
16351
16439
  overflow: hidden;
16352
16440
  }
16353
16441
  .pa-data-bar__fill {
16354
16442
  height: 100%;
16355
16443
  width: var(--value, 0%);
16356
- background: #007bff;
16444
+ background: var(--pa-accent);
16357
16445
  border-radius: inherit;
16358
16446
  transition: width 0.25s ease;
16359
16447
  }
16360
16448
  .pa-data-bar--success .pa-data-bar__fill {
16361
- background: #22c55e;
16449
+ background: var(--pa-success);
16362
16450
  }
16363
16451
  .pa-data-bar--warning .pa-data-bar__fill {
16364
- background: #f97316;
16452
+ background: var(--pa-warning);
16365
16453
  }
16366
16454
  .pa-data-bar--danger .pa-data-bar__fill {
16367
- background: #ef4444;
16455
+ background: var(--pa-danger);
16368
16456
  }
16369
16457
  .pa-data-bar--info .pa-data-bar__fill {
16370
- background: #17a2b8;
16458
+ background: var(--pa-info);
16371
16459
  }
16372
16460
  .pa-data-bar--negative .pa-data-bar__fill {
16373
- background: #ef4444;
16461
+ background: var(--pa-danger);
16374
16462
  margin-inline-start: auto;
16375
16463
  }
16376
16464
 
@@ -16382,43 +16470,43 @@ code {
16382
16470
  }
16383
16471
  .pa-heatmap__cell {
16384
16472
  border-radius: var(--pa-border-radius-sm);
16385
- background: color-mix(in srgb, var(--pa-text-color-1) 12%, transparent);
16473
+ background: var(--pa-surface-track);
16386
16474
  }
16387
16475
  .pa-heatmap__cell[data-level="1"] {
16388
- background: rgba(0, 123, 255, 0.2);
16476
+ background: color-mix(in srgb, var(--pa-accent) 20%, transparent);
16389
16477
  }
16390
16478
  .pa-heatmap__cell[data-level="2"] {
16391
- background: rgba(0, 123, 255, 0.4);
16479
+ background: color-mix(in srgb, var(--pa-accent) 40%, transparent);
16392
16480
  }
16393
16481
  .pa-heatmap__cell[data-level="3"] {
16394
- background: rgba(0, 123, 255, 0.65);
16482
+ background: color-mix(in srgb, var(--pa-accent) 65%, transparent);
16395
16483
  }
16396
16484
  .pa-heatmap__cell[data-level="4"] {
16397
- background: #007bff;
16485
+ background: var(--pa-accent);
16398
16486
  }
16399
16487
  .pa-heatmap--success .pa-heatmap__cell[data-level="1"] {
16400
- background: rgba(34, 197, 94, 0.2);
16488
+ background: color-mix(in srgb, var(--pa-success) 20%, transparent);
16401
16489
  }
16402
16490
  .pa-heatmap--success .pa-heatmap__cell[data-level="2"] {
16403
- background: rgba(34, 197, 94, 0.4);
16491
+ background: color-mix(in srgb, var(--pa-success) 40%, transparent);
16404
16492
  }
16405
16493
  .pa-heatmap--success .pa-heatmap__cell[data-level="3"] {
16406
- background: rgba(34, 197, 94, 0.65);
16494
+ background: color-mix(in srgb, var(--pa-success) 65%, transparent);
16407
16495
  }
16408
16496
  .pa-heatmap--success .pa-heatmap__cell[data-level="4"] {
16409
- background: #22c55e;
16497
+ background: var(--pa-success);
16410
16498
  }
16411
16499
  .pa-heatmap--danger .pa-heatmap__cell[data-level="1"] {
16412
- background: rgba(239, 68, 68, 0.2);
16500
+ background: color-mix(in srgb, var(--pa-danger) 20%, transparent);
16413
16501
  }
16414
16502
  .pa-heatmap--danger .pa-heatmap__cell[data-level="2"] {
16415
- background: rgba(239, 68, 68, 0.4);
16503
+ background: color-mix(in srgb, var(--pa-danger) 40%, transparent);
16416
16504
  }
16417
16505
  .pa-heatmap--danger .pa-heatmap__cell[data-level="3"] {
16418
- background: rgba(239, 68, 68, 0.65);
16506
+ background: color-mix(in srgb, var(--pa-danger) 65%, transparent);
16419
16507
  }
16420
16508
  .pa-heatmap--danger .pa-heatmap__cell[data-level="4"] {
16421
- background: #ef4444;
16509
+ background: var(--pa-danger);
16422
16510
  }
16423
16511
  .pa-heatmap__legend {
16424
16512
  display: flex;
@@ -16432,19 +16520,19 @@ code {
16432
16520
  width: 1.2rem;
16433
16521
  height: 1.2rem;
16434
16522
  border-radius: var(--pa-border-radius-sm);
16435
- background: color-mix(in srgb, var(--pa-text-color-1) 12%, transparent);
16523
+ background: var(--pa-surface-track);
16436
16524
  }
16437
16525
  .pa-heatmap__legend-cell[data-level="1"] {
16438
- background: rgba(0, 123, 255, 0.2);
16526
+ background: color-mix(in srgb, var(--pa-accent) 20%, transparent);
16439
16527
  }
16440
16528
  .pa-heatmap__legend-cell[data-level="2"] {
16441
- background: rgba(0, 123, 255, 0.4);
16529
+ background: color-mix(in srgb, var(--pa-accent) 40%, transparent);
16442
16530
  }
16443
16531
  .pa-heatmap__legend-cell[data-level="3"] {
16444
- background: rgba(0, 123, 255, 0.65);
16532
+ background: color-mix(in srgb, var(--pa-accent) 65%, transparent);
16445
16533
  }
16446
16534
  .pa-heatmap__legend-cell[data-level="4"] {
16447
- background: #007bff;
16535
+ background: var(--pa-accent);
16448
16536
  }
16449
16537
  .pa-heatmap--compact {
16450
16538
  grid-template-columns: repeat(53, 1rem);
@@ -16464,22 +16552,22 @@ code {
16464
16552
  .pa-sparkline__bar {
16465
16553
  width: 0.3rem;
16466
16554
  height: var(--value, 50%);
16467
- background: #007bff;
16555
+ background: var(--pa-accent);
16468
16556
  border-radius: var(--pa-border-radius-sm) var(--pa-border-radius-sm) 0 0;
16469
16557
  transition: height 0.25s ease;
16470
16558
  min-height: 1px;
16471
16559
  }
16472
16560
  .pa-sparkline--success .pa-sparkline__bar {
16473
- background: #22c55e;
16561
+ background: var(--pa-success);
16474
16562
  }
16475
16563
  .pa-sparkline--warning .pa-sparkline__bar {
16476
- background: #f97316;
16564
+ background: var(--pa-warning);
16477
16565
  }
16478
16566
  .pa-sparkline--danger .pa-sparkline__bar {
16479
- background: #ef4444;
16567
+ background: var(--pa-danger);
16480
16568
  }
16481
16569
  .pa-sparkline--info .pa-sparkline__bar {
16482
- background: #17a2b8;
16570
+ background: var(--pa-info);
16483
16571
  }
16484
16572
  .pa-sparkline--sm {
16485
16573
  height: 2rem;
@@ -16524,7 +16612,7 @@ code {
16524
16612
  .pa-bar-list__bar {
16525
16613
  width: 100%;
16526
16614
  height: 0.4rem;
16527
- background: rgba(0, 0, 0, 0.06);
16615
+ background: var(--pa-surface-track);
16528
16616
  border-radius: var(--pa-border-radius-sm);
16529
16617
  overflow: hidden;
16530
16618
  }
@@ -16533,21 +16621,21 @@ code {
16533
16621
  display: block;
16534
16622
  height: 100%;
16535
16623
  width: var(--value, 0%);
16536
- background: #007bff;
16624
+ background: var(--pa-accent);
16537
16625
  border-radius: inherit;
16538
16626
  transition: width 0.25s ease;
16539
16627
  }
16540
16628
  .pa-bar-list--success .pa-bar-list__bar::after {
16541
- background: #22c55e;
16629
+ background: var(--pa-success);
16542
16630
  }
16543
16631
  .pa-bar-list--warning .pa-bar-list__bar::after {
16544
- background: #f97316;
16632
+ background: var(--pa-warning);
16545
16633
  }
16546
16634
  .pa-bar-list--danger .pa-bar-list__bar::after {
16547
- background: #ef4444;
16635
+ background: var(--pa-danger);
16548
16636
  }
16549
16637
  .pa-bar-list--info .pa-bar-list__bar::after {
16550
- background: #17a2b8;
16638
+ background: var(--pa-info);
16551
16639
  }
16552
16640
  .pa-bar-list--compact {
16553
16641
  gap: 0.8rem;
@@ -16563,6 +16651,1526 @@ code {
16563
16651
  height: 0.3rem;
16564
16652
  }
16565
16653
 
16654
+ /* ========================================
16655
+ KPI · shared base
16656
+ Cross-cutting building blocks used by every pa-kpi-* showcase.
16657
+ Tokens (--pa-positive, --pa-detail-bg, --pa-chart-trendline-*) live in
16658
+ _base-css-variables.scss; this file only defines the shared class
16659
+ surface that consumes them.
16660
+ ======================================== */
16661
+ /* ----- LIVE indicator (title-bar pulse) ---------------------------------
16662
+ Used in every KPI card header — a small mono "LIVE" caption with a
16663
+ pulsing green dot. Sits next to the card title. */
16664
+ .pa-kpi-live {
16665
+ display: inline-flex;
16666
+ align-items: center;
16667
+ gap: 0.6rem;
16668
+ font-family: var(--base-font-family-mono);
16669
+ font-size: 1.2rem;
16670
+ font-weight: 600;
16671
+ letter-spacing: 0.06em;
16672
+ color: var(--pa-text-secondary);
16673
+ }
16674
+ .pa-kpi-live__dot {
16675
+ width: 0.8rem;
16676
+ height: 0.8rem;
16677
+ border-radius: 50%;
16678
+ background: var(--pa-positive);
16679
+ box-shadow: 0 0 6px var(--pa-positive);
16680
+ animation: pa-kpi-pulse 1.6s ease-in-out infinite;
16681
+ }
16682
+
16683
+ @keyframes pa-kpi-pulse {
16684
+ 50% {
16685
+ opacity: 0.35;
16686
+ }
16687
+ }
16688
+ /* ----- Card header row --------------------------------------------------
16689
+ Title (h2/h3 by author choice) on one side, controls + LIVE on the other.
16690
+ Wraps onto multiple rows on narrow cards. Every showcase uses this shape. */
16691
+ .pa-kpi-header {
16692
+ display: flex;
16693
+ justify-content: space-between;
16694
+ align-items: center;
16695
+ gap: 1.6rem;
16696
+ flex-wrap: wrap;
16697
+ }
16698
+
16699
+ /* ----- Card footer caption ---------------------------------------------
16700
+ Two-line mono caption row at the bottom of the card (left: data source,
16701
+ right: timestamp). Strong text inside picks up the focal color so things
16702
+ like a metric name or count stand out. */
16703
+ .pa-kpi-footer {
16704
+ display: flex;
16705
+ justify-content: space-between;
16706
+ align-items: center;
16707
+ flex-wrap: wrap;
16708
+ gap: 1rem;
16709
+ font-family: var(--base-font-family-mono);
16710
+ font-size: 1.2rem;
16711
+ color: var(--pa-text-secondary);
16712
+ }
16713
+ .pa-kpi-footer strong {
16714
+ color: var(--pa-text-color-1);
16715
+ font-weight: 700;
16716
+ }
16717
+
16718
+ /* ----- Sparkline endpoint dot ------------------------------------------
16719
+ The SVG circle that marks the end of a sparkline is converted to a CSS
16720
+ span at init time — the SVG uses preserveAspectRatio="none" so an
16721
+ embedded <circle> renders as an oval at non-square aspect ratios.
16722
+ See kpi-showcases.js for the conversion; here we only style the result. */
16723
+ .pa-kpi-spark-dot {
16724
+ position: absolute;
16725
+ width: 6px;
16726
+ height: 6px;
16727
+ margin: -3px 0 0 -3px; /* centre on the (left, top) anchor */
16728
+ border-radius: 50%;
16729
+ background: currentColor; /* inherits sentiment color from chart wrapper */
16730
+ pointer-events: none;
16731
+ }
16732
+
16733
+ /* Wrapper inserted around an SVG sparkline at init time when its parent
16734
+ isn't already a positioned anchor — so the .pa-kpi-spark-dot can be
16735
+ absolutely positioned relative to the chart. */
16736
+ .pa-kpi-spark-wrap {
16737
+ display: block;
16738
+ position: relative;
16739
+ width: 100%;
16740
+ }
16741
+
16742
+ /* ----- Hover detail popover --------------------------------------------
16743
+ Bloomberg-dark by default regardless of host theme (terminal/data-dashboard
16744
+ aesthetic). Override the --pa-detail-* tokens at :root or .pa-kpi-detail
16745
+ level for a light/theme-aware variant.
16746
+
16747
+ Positioned by Floating UI anchored to a virtual element at the cursor —
16748
+ the JS appends each popover to <body> at init so ancestor overflow:hidden
16749
+ doesn't clip it. position: fixed because cursor coords are viewport-
16750
+ relative; pointer-events:none so the cursor passes through cleanly and
16751
+ tile mouseleave fires reliably. */
16752
+ .pa-kpi-detail {
16753
+ position: fixed;
16754
+ top: 0;
16755
+ left: 0;
16756
+ visibility: hidden;
16757
+ pointer-events: none;
16758
+ z-index: 9000;
16759
+ min-width: 26rem;
16760
+ max-width: 32rem;
16761
+ background: var(--pa-detail-bg);
16762
+ color: var(--pa-detail-text);
16763
+ padding: 1.2rem 1.5rem;
16764
+ font-family: var(--base-font-family-mono);
16765
+ font-size: 1.25rem;
16766
+ line-height: 1.5;
16767
+ border-radius: 0.4rem;
16768
+ box-shadow: var(--pa-detail-shadow);
16769
+ }
16770
+ .pa-kpi-detail[data-show] {
16771
+ visibility: visible;
16772
+ }
16773
+ .pa-kpi-detail__title {
16774
+ text-transform: uppercase;
16775
+ letter-spacing: 0.08em;
16776
+ font-size: 1.05rem;
16777
+ font-weight: 700;
16778
+ color: var(--pa-detail-title);
16779
+ margin-bottom: 0.6rem;
16780
+ }
16781
+ .pa-kpi-detail dl {
16782
+ display: grid;
16783
+ grid-template-columns: 1fr auto;
16784
+ gap: 0.35rem 1.6rem;
16785
+ margin: 0;
16786
+ }
16787
+ .pa-kpi-detail dt {
16788
+ margin: 0;
16789
+ color: var(--pa-detail-row-label);
16790
+ font-weight: 400;
16791
+ }
16792
+ .pa-kpi-detail dd {
16793
+ margin: 0;
16794
+ text-align: end;
16795
+ font-weight: 600;
16796
+ font-variant-numeric: tabular-nums;
16797
+ }
16798
+ .pa-kpi-detail {
16799
+ /* Inline sentiment hints for dd content (e.g. <dd>+12% <span class="pos">…</span></dd>) */
16800
+ }
16801
+ .pa-kpi-detail .pos {
16802
+ color: var(--pa-positive);
16803
+ }
16804
+ .pa-kpi-detail .neg {
16805
+ color: var(--pa-negative);
16806
+ }
16807
+ .pa-kpi-detail .warn {
16808
+ color: var(--pa-warning);
16809
+ }
16810
+
16811
+ /* ----- Section heading strip used outside card chrome -------------------
16812
+ The 7 showcases each render a "stress-test" section that places tiles
16813
+ directly inside .pa-col-* page-grid cells (no card wrapper). The strip
16814
+ above those layouts hosts a label or LIVE indicator at the row's end. */
16815
+ .pa-kpi-sectionhead {
16816
+ display: flex;
16817
+ justify-content: flex-end;
16818
+ align-items: center;
16819
+ gap: 1.6rem;
16820
+ margin-bottom: 1.2rem;
16821
+ }
16822
+
16823
+ /* ========================================
16824
+ KPI · Terminal grid
16825
+ Bloomberg-style dense panel: mono numbers, status pills, inline SVG
16826
+ sparklines, ▲▼ deltas, segmented view-mode toggle (VALUE/Δ%/TREND).
16827
+ Shared chrome (header, live, footer, detail popover, spark-dot) is in
16828
+ _kpi-base.scss.
16829
+ ======================================== */
16830
+ /* ----- View-mode toggle (segmented button group) ------------------------ */
16831
+ .pa-kpi-terminal__controls {
16832
+ display: inline-flex;
16833
+ align-items: center;
16834
+ gap: 1.6rem;
16835
+ }
16836
+
16837
+ .pa-kpi-terminal__viewtoggle {
16838
+ display: inline-flex;
16839
+ border: 1px solid var(--pa-border-color);
16840
+ border-radius: 0.4rem;
16841
+ overflow: hidden;
16842
+ }
16843
+
16844
+ .pa-kpi-terminal__viewbtn {
16845
+ background: transparent;
16846
+ border: 0;
16847
+ color: var(--pa-text-color-2);
16848
+ padding: 0.4rem 1.1rem;
16849
+ font-family: var(--base-font-family-mono);
16850
+ font-size: 1.1rem;
16851
+ font-weight: 600;
16852
+ letter-spacing: 0.06em;
16853
+ cursor: pointer;
16854
+ transition: background-color 0.1s ease-out, color 0.1s ease-out;
16855
+ }
16856
+ .pa-kpi-terminal__viewbtn:hover {
16857
+ color: var(--pa-text-color-1);
16858
+ }
16859
+ .pa-kpi-terminal__viewbtn.is-active {
16860
+ background: var(--pa-text-color-1);
16861
+ color: var(--pa-card-bg);
16862
+ }
16863
+
16864
+ /* ----- Grid + tile borders ----------------------------------------------
16865
+ Hairline 1px borders between tiles, no gap. Last-row/last-column
16866
+ borders suppressed via :nth-last-child / :nth-child selectors. */
16867
+ .pa-kpi-terminal__body {
16868
+ padding: 0;
16869
+ }
16870
+
16871
+ .pa-kpi-terminal__grid {
16872
+ display: grid;
16873
+ grid-template-columns: repeat(2, 1fr);
16874
+ }
16875
+ .pa-kpi-terminal__grid .pa-kpi-tile {
16876
+ border-bottom: 1px solid var(--pa-border-color);
16877
+ border-right: 1px solid var(--pa-border-color);
16878
+ }
16879
+
16880
+ .pa-kpi-terminal__grid--2col .pa-kpi-tile:nth-child(2n) {
16881
+ border-right: 0;
16882
+ }
16883
+ .pa-kpi-terminal__grid--2col .pa-kpi-tile:nth-last-child(-n+2) {
16884
+ border-bottom: 0;
16885
+ }
16886
+
16887
+ /* ----- Tile (per-KPI panel) --------------------------------------------- */
16888
+ .pa-kpi-tile {
16889
+ position: relative;
16890
+ padding: 1.4rem 1.8rem 1.6rem;
16891
+ min-height: 16rem;
16892
+ display: flex;
16893
+ flex-direction: column;
16894
+ /* Standalone modifier: tile lives directly inside a .pa-col-* (no
16895
+ neighbour cells in a parent grid) — gets a full border + card bg so
16896
+ it doesn't look orphaned. */
16897
+ }
16898
+ .pa-kpi-tile--standalone {
16899
+ background: var(--pa-card-bg);
16900
+ border: 1px solid var(--pa-border-color);
16901
+ margin-bottom: 1.2rem;
16902
+ }
16903
+ .pa-kpi-tile--standalone:last-child {
16904
+ margin-bottom: 0;
16905
+ }
16906
+
16907
+ /* ----- Tile head: ID · period + status pill ----------------------------- */
16908
+ .pa-kpi-tile__head {
16909
+ display: flex;
16910
+ justify-content: space-between;
16911
+ align-items: center;
16912
+ font-family: var(--base-font-family-mono);
16913
+ font-size: 1.3rem;
16914
+ letter-spacing: 0.04em;
16915
+ margin-bottom: 0.3rem;
16916
+ }
16917
+
16918
+ .pa-kpi-tile__id {
16919
+ color: var(--pa-text-tertiary);
16920
+ font-weight: 600;
16921
+ }
16922
+
16923
+ .pa-kpi-tile__status {
16924
+ font-family: var(--base-font-family-mono);
16925
+ font-size: 1.2rem;
16926
+ font-weight: 700;
16927
+ letter-spacing: 0.08em;
16928
+ padding: 0.3rem 0.9rem;
16929
+ line-height: 1.3;
16930
+ }
16931
+ .pa-kpi-tile__status--warn {
16932
+ background: var(--pa-warning-bg);
16933
+ color: var(--pa-btn-warning-text);
16934
+ }
16935
+ .pa-kpi-tile__status {
16936
+ /* GOOD is the "default" state — text-only, no chrome */
16937
+ }
16938
+ .pa-kpi-tile__status--good {
16939
+ background: transparent;
16940
+ color: var(--pa-text-color-1);
16941
+ padding: 0.2rem 0;
16942
+ }
16943
+ .pa-kpi-tile__status--neutral {
16944
+ background: color-mix(in srgb, var(--pa-text-color-2) 25%, transparent);
16945
+ color: var(--pa-text-color-1);
16946
+ }
16947
+
16948
+ /* ----- Label ------------------------------------------------------------ */
16949
+ .pa-kpi-tile__label {
16950
+ font-family: var(--base-font-family-mono);
16951
+ font-size: 1.4rem;
16952
+ font-weight: 700;
16953
+ letter-spacing: 0.1em;
16954
+ text-transform: uppercase;
16955
+ color: var(--pa-text-strong);
16956
+ margin-bottom: 0.8rem;
16957
+ }
16958
+
16959
+ /* ----- Big value with 3-mode swap --------------------------------------
16960
+ Author renders three .pa-kpi-tile__value siblings (data-mode="value" /
16961
+ "delta" / "trend"); the active mode is selected via the
16962
+ .pa-kpi-terminal[data-view="X"] attribute. JS toggles that attribute
16963
+ when the segmented control is clicked. */
16964
+ .pa-kpi-tile__values {
16965
+ margin-bottom: 0.4rem;
16966
+ }
16967
+
16968
+ .pa-kpi-tile__value {
16969
+ display: none;
16970
+ align-items: baseline;
16971
+ gap: 0.3rem;
16972
+ font-family: var(--base-font-family-mono);
16973
+ line-height: 1;
16974
+ }
16975
+ .pa-kpi-tile__value--very-positive .pa-kpi-tile__num {
16976
+ color: var(--pa-very-positive);
16977
+ }
16978
+ .pa-kpi-tile__value--positive .pa-kpi-tile__num {
16979
+ color: var(--pa-positive);
16980
+ }
16981
+ .pa-kpi-tile__value--neutral .pa-kpi-tile__num {
16982
+ color: var(--pa-neutral);
16983
+ }
16984
+ .pa-kpi-tile__value--negative .pa-kpi-tile__num {
16985
+ color: var(--pa-negative);
16986
+ }
16987
+ .pa-kpi-tile__value--very-negative .pa-kpi-tile__num {
16988
+ color: var(--pa-very-negative);
16989
+ }
16990
+
16991
+ .pa-kpi-terminal[data-view=value] .pa-kpi-tile__value[data-mode=value],
16992
+ .pa-kpi-terminal[data-view=delta] .pa-kpi-tile__value[data-mode=delta],
16993
+ .pa-kpi-terminal[data-view=trend] .pa-kpi-tile__value[data-mode=trend] {
16994
+ display: inline-flex;
16995
+ }
16996
+
16997
+ .pa-kpi-tile__num {
16998
+ font-size: 3.8rem;
16999
+ font-weight: 700;
17000
+ letter-spacing: -0.02em;
17001
+ color: var(--pa-text-color-1);
17002
+ }
17003
+
17004
+ .pa-kpi-tile__unit {
17005
+ font-size: 1.6rem;
17006
+ font-weight: 500;
17007
+ color: var(--pa-text-secondary);
17008
+ }
17009
+
17010
+ /* ----- Previous-value + delta row -------------------------------------- */
17011
+ .pa-kpi-tile__prev {
17012
+ display: flex;
17013
+ justify-content: space-between;
17014
+ align-items: center;
17015
+ font-family: var(--base-font-family-mono);
17016
+ font-size: 1.3rem;
17017
+ margin-top: auto; /* push to bottom of flex column */
17018
+ margin-bottom: 0.4rem;
17019
+ color: var(--pa-text-tertiary);
17020
+ }
17021
+
17022
+ .pa-kpi-tile__delta--very-positive {
17023
+ color: var(--pa-very-positive);
17024
+ }
17025
+ .pa-kpi-tile__delta--positive {
17026
+ color: var(--pa-positive);
17027
+ }
17028
+ .pa-kpi-tile__delta--neutral {
17029
+ color: var(--pa-neutral);
17030
+ }
17031
+ .pa-kpi-tile__delta--negative {
17032
+ color: var(--pa-negative);
17033
+ }
17034
+ .pa-kpi-tile__delta--very-negative {
17035
+ color: var(--pa-very-negative);
17036
+ }
17037
+
17038
+ /* ----- Sparkline -------------------------------------------------------- */
17039
+ .pa-kpi-tile__spark {
17040
+ display: block;
17041
+ width: 100%;
17042
+ height: var(--pa-chart-trendline-height);
17043
+ overflow: visible;
17044
+ }
17045
+ .pa-kpi-tile__spark polyline {
17046
+ fill: none;
17047
+ stroke: currentColor;
17048
+ stroke-width: var(--pa-chart-trendline-stroke);
17049
+ stroke-linecap: round;
17050
+ stroke-linejoin: round;
17051
+ }
17052
+
17053
+ /* Sentiment-coloured sparkline. Class names use up/down wording but pick
17054
+ colours from the sentiment-of-the-change axis, not line shape — so an
17055
+ error-rate metric whose line is falling but the change is good uses
17056
+ --up. See showcase docs for the rationale. Colour is set on both the
17057
+ SVG and the JS-inserted .pa-kpi-spark-wrap so currentColor resolves
17058
+ for the SVG content (line) and the HTML dot (inside the wrap). */
17059
+ .pa-kpi-tile--up-strong .pa-kpi-tile__spark, .pa-kpi-tile--up-strong .pa-kpi-spark-wrap {
17060
+ color: var(--pa-very-positive);
17061
+ }
17062
+ .pa-kpi-tile--up .pa-kpi-tile__spark, .pa-kpi-tile--up .pa-kpi-spark-wrap {
17063
+ color: var(--pa-positive);
17064
+ }
17065
+ .pa-kpi-tile--flat .pa-kpi-tile__spark, .pa-kpi-tile--flat .pa-kpi-spark-wrap {
17066
+ color: var(--pa-neutral);
17067
+ }
17068
+ .pa-kpi-tile--down .pa-kpi-tile__spark, .pa-kpi-tile--down .pa-kpi-spark-wrap {
17069
+ color: var(--pa-negative);
17070
+ }
17071
+ .pa-kpi-tile--down-strong .pa-kpi-tile__spark, .pa-kpi-tile--down-strong .pa-kpi-spark-wrap {
17072
+ color: var(--pa-very-negative);
17073
+ }
17074
+
17075
+ /* ========================================
17076
+ KPI · Sparkline list
17077
+ Each KPI is one row: label · sparkline · value · Δ%. Built for vertical
17078
+ scanning rather than per-tile depth — no view-mode toggle, no status
17079
+ pills. Container queries collapse 4-col → 2-row → 3-row as the card
17080
+ narrows.
17081
+ ======================================== */
17082
+ /* Card is a query container so rows react to *card* width, not viewport. */
17083
+ .pa-kpi-spark-list {
17084
+ container-type: inline-size;
17085
+ }
17086
+
17087
+ .pa-kpi-spark-list__body {
17088
+ padding: 0;
17089
+ }
17090
+
17091
+ /* ----- Row: wide 4-column grid (label · chart · value · delta) ---------- */
17092
+ .pa-kpi-spark-row {
17093
+ display: grid;
17094
+ grid-template-columns: minmax(14rem, 28%) minmax(10rem, 1fr) minmax(8rem, 18%) minmax(7rem, 12%);
17095
+ align-items: center;
17096
+ gap: 1.6rem;
17097
+ padding: 1.4rem 2rem;
17098
+ border-bottom: 1px solid var(--pa-border-color);
17099
+ }
17100
+ .pa-kpi-spark-row:last-child {
17101
+ border-bottom: 0;
17102
+ }
17103
+
17104
+ /* Mid-narrow card (1×3 page-grid + 45% column): stack to 2 rows.
17105
+ Label/value/delta on top, full-width chart below. Default order is
17106
+ value-above-chart; use .pa-kpi-spark-list--chart-first to flip. */
17107
+ @container (max-width: 640px) {
17108
+ .pa-kpi-spark-row {
17109
+ grid-template-columns: minmax(0, 1fr) auto auto;
17110
+ grid-template-rows: auto auto;
17111
+ grid-template-areas: "label value delta" "chart chart chart";
17112
+ column-gap: 1.2rem;
17113
+ row-gap: 0.4rem;
17114
+ align-items: baseline;
17115
+ padding: 1.2rem 1.6rem;
17116
+ }
17117
+ .pa-kpi-spark-row__label {
17118
+ grid-area: label;
17119
+ align-self: center;
17120
+ font-size: 1.25rem;
17121
+ }
17122
+ .pa-kpi-spark-row__value {
17123
+ grid-area: value;
17124
+ }
17125
+ .pa-kpi-spark-row__delta {
17126
+ grid-area: delta;
17127
+ font-size: 1.25rem;
17128
+ }
17129
+ .pa-kpi-spark-row__chart {
17130
+ grid-area: chart;
17131
+ }
17132
+ .pa-kpi-spark-row__num {
17133
+ font-size: 2rem;
17134
+ }
17135
+ /* --chart-first: rotates the canonical L→R order 90°. Label on top,
17136
+ chart in the middle, value+delta side-by-side at the bottom. */
17137
+ .pa-kpi-spark-list--chart-first .pa-kpi-spark-row {
17138
+ grid-template-columns: 1fr auto;
17139
+ grid-template-rows: auto auto auto;
17140
+ grid-template-areas: "label label" "chart chart" "value delta";
17141
+ row-gap: 0.5rem;
17142
+ column-gap: 1rem;
17143
+ padding: 1.2rem 1.6rem;
17144
+ }
17145
+ .pa-kpi-spark-list--chart-first .pa-kpi-spark-row__label {
17146
+ align-self: start;
17147
+ }
17148
+ .pa-kpi-spark-list--chart-first .pa-kpi-spark-row__value {
17149
+ text-align: start;
17150
+ align-self: baseline;
17151
+ }
17152
+ .pa-kpi-spark-list--chart-first .pa-kpi-spark-row__delta {
17153
+ align-self: baseline;
17154
+ }
17155
+ }
17156
+ /* Very narrow card (~280–360px, 25% page-grid stress test): force the
17157
+ chart-first 3-row layout regardless of modifier. */
17158
+ @container (max-width: 360px) {
17159
+ .pa-kpi-spark-row {
17160
+ grid-template-columns: 1fr auto;
17161
+ grid-template-rows: auto auto auto;
17162
+ grid-template-areas: "label label" "chart chart" "value delta";
17163
+ row-gap: 0.5rem;
17164
+ column-gap: 1rem;
17165
+ padding: 1.2rem 1.4rem;
17166
+ }
17167
+ .pa-kpi-spark-row__label {
17168
+ grid-area: label;
17169
+ align-self: start;
17170
+ }
17171
+ .pa-kpi-spark-row__chart {
17172
+ grid-area: chart;
17173
+ }
17174
+ .pa-kpi-spark-row__value {
17175
+ grid-area: value;
17176
+ text-align: start;
17177
+ align-self: baseline;
17178
+ }
17179
+ .pa-kpi-spark-row__delta {
17180
+ grid-area: delta;
17181
+ align-self: baseline;
17182
+ }
17183
+ }
17184
+ /* ----- Cell typography -------------------------------------------------- */
17185
+ .pa-kpi-spark-row__label {
17186
+ font-family: var(--base-font-family-mono);
17187
+ font-size: 1.4rem;
17188
+ font-weight: 700;
17189
+ letter-spacing: 0.1em;
17190
+ text-transform: uppercase;
17191
+ color: color-mix(in srgb, var(--pa-text-color-1) 60%, transparent);
17192
+ }
17193
+
17194
+ /* Sparkline cell — line + filled area + trailing dot (the dot is rendered
17195
+ as a CSS span by the JS init pass; see kpi-showcases.js). */
17196
+ .pa-kpi-spark-row__chart {
17197
+ position: relative; /* anchor for .pa-kpi-spark-dot */
17198
+ }
17199
+ .pa-kpi-spark-row__chart svg {
17200
+ display: block;
17201
+ width: 100%;
17202
+ height: var(--pa-chart-trendline-height);
17203
+ overflow: visible;
17204
+ }
17205
+ .pa-kpi-spark-row__chart polyline {
17206
+ fill: none;
17207
+ stroke: currentColor;
17208
+ stroke-width: var(--pa-chart-trendline-stroke);
17209
+ stroke-linecap: round;
17210
+ stroke-linejoin: round;
17211
+ }
17212
+ .pa-kpi-spark-row__chart polygon {
17213
+ fill: currentColor;
17214
+ fill-opacity: 0.18; /* same hue as line, soft area shading */
17215
+ stroke: none;
17216
+ }
17217
+
17218
+ /* Sentiment-coloured sparkline. Color is set on the chart wrapper so
17219
+ currentColor resolves for both the SVG content (line/area) and the
17220
+ dot inside the wrapper. */
17221
+ .pa-kpi-spark-row--up-strong .pa-kpi-spark-row__chart {
17222
+ color: var(--pa-very-positive);
17223
+ }
17224
+ .pa-kpi-spark-row--up .pa-kpi-spark-row__chart {
17225
+ color: var(--pa-positive);
17226
+ }
17227
+ .pa-kpi-spark-row--flat .pa-kpi-spark-row__chart {
17228
+ color: var(--pa-neutral);
17229
+ }
17230
+ .pa-kpi-spark-row--down .pa-kpi-spark-row__chart {
17231
+ color: var(--pa-negative);
17232
+ }
17233
+ .pa-kpi-spark-row--down-strong .pa-kpi-spark-row__chart {
17234
+ color: var(--pa-very-negative);
17235
+ }
17236
+
17237
+ /* ----- Value (focal white number + muted unit) ------------------------- */
17238
+ .pa-kpi-spark-row__value {
17239
+ font-family: var(--base-font-family-mono);
17240
+ text-align: end;
17241
+ line-height: 1;
17242
+ }
17243
+
17244
+ .pa-kpi-spark-row__num {
17245
+ font-size: 2.6rem;
17246
+ font-weight: 700;
17247
+ letter-spacing: -0.02em;
17248
+ color: var(--pa-text-color-1);
17249
+ }
17250
+
17251
+ .pa-kpi-spark-row__unit {
17252
+ font-size: 1.3rem;
17253
+ font-weight: 500;
17254
+ color: var(--pa-text-secondary);
17255
+ margin-left: 0.2rem;
17256
+ }
17257
+
17258
+ /* ----- Delta (sentiment-coloured) -------------------------------------- */
17259
+ .pa-kpi-spark-row__delta {
17260
+ font-family: var(--base-font-family-mono);
17261
+ font-size: 1.4rem;
17262
+ font-weight: 600;
17263
+ text-align: end;
17264
+ font-variant-numeric: tabular-nums;
17265
+ }
17266
+ .pa-kpi-spark-row__delta--very-positive {
17267
+ color: var(--pa-very-positive);
17268
+ }
17269
+ .pa-kpi-spark-row__delta--positive {
17270
+ color: var(--pa-positive);
17271
+ }
17272
+ .pa-kpi-spark-row__delta--neutral {
17273
+ color: var(--pa-neutral);
17274
+ }
17275
+ .pa-kpi-spark-row__delta--negative {
17276
+ color: var(--pa-negative);
17277
+ }
17278
+ .pa-kpi-spark-row__delta--very-negative {
17279
+ color: var(--pa-very-negative);
17280
+ }
17281
+
17282
+ /* ========================================
17283
+ KPI · Comparison gauges
17284
+ Goal-oriented progress bars. Each KPI shows label · value, a bar with a
17285
+ target tick, and a 0 · tgt scale below. Bar fill = value/target * 100%,
17286
+ capped visually so overshoots are signalled by colour, not overflow.
17287
+ ======================================== */
17288
+ .pa-kpi-gauge-list {
17289
+ container-type: inline-size;
17290
+ }
17291
+
17292
+ .pa-kpi-gauge-list__body {
17293
+ padding: 0;
17294
+ }
17295
+
17296
+ /* 2-column internal grid by default; collapses to 1-col when card narrows. */
17297
+ .pa-kpi-gauge-list__grid {
17298
+ display: grid;
17299
+ grid-template-columns: repeat(2, 1fr);
17300
+ }
17301
+
17302
+ @container (max-width: 600px) {
17303
+ .pa-kpi-gauge-list__grid {
17304
+ grid-template-columns: 1fr;
17305
+ }
17306
+ }
17307
+ /* ----- Gauge tile (label/value head · bar · 0/tgt scale) ---------------- */
17308
+ .pa-kpi-gauge {
17309
+ position: relative;
17310
+ padding: 1.6rem 2rem;
17311
+ border-bottom: 1px solid var(--pa-border-color);
17312
+ border-right: 1px solid var(--pa-border-color);
17313
+ /* Per-tile bar colour cascade — modifiers below set the var, the fill
17314
+ reads it. Cleaner than per-modifier-per-element rules; host apps can
17315
+ override at the tile level via inline style="--pa-kpi-bar-color: …". */
17316
+ --pa-kpi-bar-color: var(--pa-positive);
17317
+ }
17318
+ .pa-kpi-gauge:nth-child(2n) {
17319
+ border-right: 0;
17320
+ }
17321
+ .pa-kpi-gauge:nth-last-child(-n+2) {
17322
+ border-bottom: 0;
17323
+ }
17324
+ .pa-kpi-gauge--positive {
17325
+ --pa-kpi-bar-color: var(--pa-positive);
17326
+ }
17327
+ .pa-kpi-gauge--warning {
17328
+ --pa-kpi-bar-color: var(--pa-warning);
17329
+ }
17330
+ .pa-kpi-gauge--negative {
17331
+ --pa-kpi-bar-color: var(--pa-negative);
17332
+ }
17333
+ .pa-kpi-gauge--neutral {
17334
+ --pa-kpi-bar-color: color-mix(in srgb, var(--pa-text-color-1) 70%, transparent);
17335
+ }
17336
+
17337
+ @container (max-width: 600px) {
17338
+ .pa-kpi-gauge {
17339
+ border-right: 0;
17340
+ }
17341
+ .pa-kpi-gauge:nth-last-child(-n+2) {
17342
+ border-bottom: 1px solid var(--pa-border-color);
17343
+ }
17344
+ .pa-kpi-gauge:last-child {
17345
+ border-bottom: 0;
17346
+ }
17347
+ }
17348
+ /* ----- Head: label left, value right (baseline-aligned) ----------------- */
17349
+ .pa-kpi-gauge__head {
17350
+ display: flex;
17351
+ justify-content: space-between;
17352
+ align-items: baseline;
17353
+ gap: 1.2rem;
17354
+ margin-bottom: 0.8rem;
17355
+ }
17356
+
17357
+ .pa-kpi-gauge__label {
17358
+ font-family: var(--base-font-family-mono);
17359
+ font-size: 1.4rem;
17360
+ font-weight: 700;
17361
+ letter-spacing: 0.1em;
17362
+ text-transform: uppercase;
17363
+ color: color-mix(in srgb, var(--pa-text-color-1) 60%, transparent);
17364
+ }
17365
+
17366
+ .pa-kpi-gauge__value {
17367
+ font-family: var(--base-font-family-mono);
17368
+ line-height: 1;
17369
+ }
17370
+
17371
+ .pa-kpi-gauge__num {
17372
+ font-size: 2.6rem;
17373
+ font-weight: 700;
17374
+ letter-spacing: -0.02em;
17375
+ color: var(--pa-text-color-1);
17376
+ }
17377
+
17378
+ .pa-kpi-gauge__unit {
17379
+ font-size: 1.3rem;
17380
+ font-weight: 500;
17381
+ color: var(--pa-text-secondary);
17382
+ margin-left: 0.2rem;
17383
+ }
17384
+
17385
+ /* ----- Bar (track + sentiment-coloured fill + target tick) -------------- */
17386
+ .pa-kpi-gauge__bar {
17387
+ /* Author-controlled tick position (default 100% — the target sits at the
17388
+ right edge of the bar's "0 → target" scale). Override per-tile via
17389
+ style="--pa-kpi-gauge-tick-pos: 80%" if the bar represents a wider
17390
+ scale where the target sits inside the bar. */
17391
+ --pa-kpi-gauge-tick-pos: 100%;
17392
+ --pa-kpi-gauge-tick-color: var(--pa-text-color-1);
17393
+ position: relative;
17394
+ height: 0.7rem;
17395
+ background: var(--pa-surface-track);
17396
+ margin-bottom: 0.5rem;
17397
+ overflow: visible; /* tick can sit just outside the track */
17398
+ /* Target tick — small bar slightly taller than the track. Centred on
17399
+ --pa-kpi-gauge-tick-pos via the negative margin-left (matches half
17400
+ the tick width). Full opacity so it stays readable on dark themes
17401
+ against bright orange/green fills. */
17402
+ }
17403
+ .pa-kpi-gauge__bar::after {
17404
+ content: "";
17405
+ position: absolute;
17406
+ left: var(--pa-kpi-gauge-tick-pos);
17407
+ margin-left: -0.15rem;
17408
+ top: -0.2rem;
17409
+ bottom: -0.2rem;
17410
+ width: 0.3rem;
17411
+ background: var(--pa-kpi-gauge-tick-color);
17412
+ }
17413
+
17414
+ .pa-kpi-gauge__fill {
17415
+ height: 100%;
17416
+ background: var(--pa-kpi-bar-color);
17417
+ /* Width set inline per tile via style="width: X%". */
17418
+ transition: width 0.3s ease;
17419
+ }
17420
+
17421
+ /* ----- Scale row (0 left · tgt XYZ right) ------------------------------- */
17422
+ .pa-kpi-gauge__scale {
17423
+ display: flex;
17424
+ justify-content: space-between;
17425
+ font-family: var(--base-font-family-mono);
17426
+ font-size: 1.2rem;
17427
+ color: var(--pa-text-tertiary);
17428
+ }
17429
+
17430
+ /* ========================================
17431
+ KPI · Hero + supporting
17432
+ Marketing/exec dashboard pattern: one headline metric on the left (huge
17433
+ container-query-relative value, inline meta row, big filled-area
17434
+ sparkline), and a vertical rail of compact supporting tiles on the
17435
+ right. Container query collapses to single column on narrow cards.
17436
+ ======================================== */
17437
+ .pa-kpi-hero-list {
17438
+ container-type: inline-size;
17439
+ }
17440
+
17441
+ .pa-kpi-hero-list__body {
17442
+ padding: 1.6rem;
17443
+ }
17444
+
17445
+ /* ----- Layout: hero left, rail right ------------------------------------ */
17446
+ .pa-kpi-hero-list__layout {
17447
+ display: grid;
17448
+ grid-template-columns: 1fr 1fr;
17449
+ gap: 1.4rem;
17450
+ }
17451
+
17452
+ @container (max-width: 700px) {
17453
+ .pa-kpi-hero-list__layout {
17454
+ grid-template-columns: 1fr;
17455
+ }
17456
+ }
17457
+ .pa-kpi-hero-list__rail {
17458
+ display: flex;
17459
+ flex-direction: column;
17460
+ gap: 1rem;
17461
+ }
17462
+
17463
+ /* ----- HERO panel (label · big value · meta row · sparkline) ------------ */
17464
+ .pa-kpi-hero-main {
17465
+ position: relative;
17466
+ padding: 1.8rem 2rem;
17467
+ border: 1px solid var(--pa-border-color);
17468
+ display: flex;
17469
+ flex-direction: column;
17470
+ gap: 0.6rem;
17471
+ /* Sentiment cascade — chart and delta inherit via currentColor. */
17472
+ --pa-kpi-accent: var(--pa-positive);
17473
+ }
17474
+ .pa-kpi-hero-main--positive {
17475
+ --pa-kpi-accent: var(--pa-positive);
17476
+ }
17477
+ .pa-kpi-hero-main--negative {
17478
+ --pa-kpi-accent: var(--pa-negative);
17479
+ }
17480
+ .pa-kpi-hero-main--neutral {
17481
+ --pa-kpi-accent: var(--pa-neutral);
17482
+ }
17483
+ .pa-kpi-hero-main--up-strong {
17484
+ --pa-kpi-accent: var(--pa-very-positive);
17485
+ }
17486
+
17487
+ .pa-kpi-hero-main__label {
17488
+ font-family: var(--base-font-family-mono);
17489
+ font-size: 1.4rem;
17490
+ font-weight: 700;
17491
+ letter-spacing: 0.1em;
17492
+ text-transform: uppercase;
17493
+ color: color-mix(in srgb, var(--pa-text-color-1) 60%, transparent);
17494
+ }
17495
+
17496
+ .pa-kpi-hero-main__value {
17497
+ display: inline-flex;
17498
+ align-items: baseline;
17499
+ font-family: var(--base-font-family-mono);
17500
+ line-height: 1;
17501
+ margin: 0.4rem 0 0.6rem;
17502
+ }
17503
+
17504
+ .pa-kpi-hero-main__num {
17505
+ /* Container-query-relative: scales with the hero panel's width.
17506
+ Floor keeps it readable in narrow page-grid cards. */
17507
+ font-size: clamp(4rem, 17cqi, 7rem);
17508
+ font-weight: 700;
17509
+ letter-spacing: -0.02em;
17510
+ color: var(--pa-text-color-1);
17511
+ }
17512
+
17513
+ .pa-kpi-hero-main__unit {
17514
+ font-size: clamp(1.8rem, 8cqi, 3rem);
17515
+ font-weight: 500;
17516
+ color: var(--pa-text-secondary);
17517
+ margin: 0 0.1rem;
17518
+ }
17519
+
17520
+ /* Meta row: inline delta + period text + target on one baseline. */
17521
+ .pa-kpi-hero-main__meta {
17522
+ display: grid;
17523
+ grid-template-columns: auto minmax(0, 1fr) auto;
17524
+ align-items: baseline;
17525
+ gap: 0.4rem 1.4rem;
17526
+ font-family: var(--base-font-family-mono);
17527
+ font-size: 1.3rem;
17528
+ }
17529
+
17530
+ .pa-kpi-hero-main__delta {
17531
+ display: inline-flex;
17532
+ align-items: baseline;
17533
+ gap: 0.4rem;
17534
+ color: var(--pa-kpi-accent);
17535
+ font-weight: 700;
17536
+ font-size: 1.5rem;
17537
+ line-height: 1.2;
17538
+ }
17539
+
17540
+ .pa-kpi-hero-main__period {
17541
+ color: color-mix(in srgb, var(--pa-text-color-1) 60%, transparent);
17542
+ line-height: 1.3;
17543
+ }
17544
+
17545
+ .pa-kpi-hero-main__target {
17546
+ color: color-mix(in srgb, var(--pa-text-color-1) 50%, transparent);
17547
+ text-align: end;
17548
+ }
17549
+
17550
+ /* Hero sparkline — chart container fills extra vertical space (when the
17551
+ rail forces a tall row); SVG inside stays at fixed pixel height so the
17552
+ line shape is never distorted along Y. The SVG uses
17553
+ preserveAspectRatio="none", so any element that should keep its shape
17554
+ needs to live outside that scaling or have fixed pixel dimensions. */
17555
+ .pa-kpi-hero-main__chart {
17556
+ flex: 1 1 10rem;
17557
+ min-height: 10rem;
17558
+ margin-top: 0.6rem;
17559
+ color: var(--pa-kpi-accent);
17560
+ display: flex;
17561
+ align-items: flex-end; /* SVG wrap pinned to bottom */
17562
+ }
17563
+ .pa-kpi-hero-main__chart polyline {
17564
+ fill: none;
17565
+ stroke: currentColor;
17566
+ stroke-width: var(--pa-chart-trendline-stroke);
17567
+ stroke-linecap: round;
17568
+ stroke-linejoin: round;
17569
+ }
17570
+ .pa-kpi-hero-main__chart polygon {
17571
+ fill: currentColor;
17572
+ fill-opacity: 0.18;
17573
+ stroke: none;
17574
+ }
17575
+
17576
+ .pa-kpi-hero-main__chart-svg {
17577
+ position: relative;
17578
+ display: block;
17579
+ width: 100%;
17580
+ height: var(--pa-chart-trendline-height);
17581
+ }
17582
+ .pa-kpi-hero-main__chart-svg svg {
17583
+ display: block;
17584
+ width: 100%;
17585
+ height: 100%;
17586
+ overflow: visible;
17587
+ }
17588
+
17589
+ /* ----- SIDE rail tile (2×2 grid, value spans both rows on right) -------- */
17590
+ .pa-kpi-hero-side {
17591
+ position: relative;
17592
+ padding: 1.2rem 1.4rem;
17593
+ border: 1px solid var(--pa-border-color);
17594
+ display: grid;
17595
+ grid-template-columns: minmax(0, 1fr) auto;
17596
+ grid-template-areas: "label value" "delta value";
17597
+ column-gap: 1.2rem;
17598
+ row-gap: 0.4rem;
17599
+ align-items: center;
17600
+ --pa-kpi-accent: var(--pa-positive);
17601
+ }
17602
+ .pa-kpi-hero-side--positive {
17603
+ --pa-kpi-accent: var(--pa-positive);
17604
+ }
17605
+ .pa-kpi-hero-side--negative {
17606
+ --pa-kpi-accent: var(--pa-negative);
17607
+ }
17608
+ .pa-kpi-hero-side--neutral {
17609
+ --pa-kpi-accent: var(--pa-neutral);
17610
+ }
17611
+ .pa-kpi-hero-side--up-strong {
17612
+ --pa-kpi-accent: var(--pa-very-positive);
17613
+ }
17614
+
17615
+ .pa-kpi-hero-side__label {
17616
+ grid-area: label;
17617
+ align-self: end; /* tucks against the vertically-centred value */
17618
+ font-family: var(--base-font-family-mono);
17619
+ font-size: 1.3rem;
17620
+ font-weight: 700;
17621
+ letter-spacing: 0.1em;
17622
+ text-transform: uppercase;
17623
+ color: color-mix(in srgb, var(--pa-text-color-1) 60%, transparent);
17624
+ line-height: 1.25;
17625
+ }
17626
+
17627
+ .pa-kpi-hero-side__value {
17628
+ grid-area: value;
17629
+ align-self: center;
17630
+ font-family: var(--base-font-family-mono);
17631
+ line-height: 1;
17632
+ white-space: nowrap;
17633
+ display: inline-flex;
17634
+ align-items: baseline;
17635
+ }
17636
+
17637
+ .pa-kpi-hero-side__num {
17638
+ font-size: 2.4rem;
17639
+ font-weight: 700;
17640
+ letter-spacing: -0.02em;
17641
+ color: var(--pa-text-color-1);
17642
+ }
17643
+
17644
+ .pa-kpi-hero-side__unit {
17645
+ font-size: 1.5rem;
17646
+ font-weight: 500;
17647
+ color: var(--pa-text-secondary);
17648
+ margin: 0 0.35rem;
17649
+ }
17650
+
17651
+ .pa-kpi-hero-side__delta {
17652
+ grid-area: delta;
17653
+ align-self: start;
17654
+ font-family: var(--base-font-family-mono);
17655
+ font-size: 1.2rem;
17656
+ font-weight: 600;
17657
+ color: var(--pa-kpi-accent);
17658
+ }
17659
+
17660
+ /* ========================================
17661
+ KPI · Bento layout
17662
+ Magazine-style asymmetric tile sizing with sparklines as soft background
17663
+ fills behind the values. 6 tiles arranged on a 6-col × 3-row grid
17664
+ (hero left-half × 2 rows, two stacked right-half × 2 rows, three equal
17665
+ tiles bottom row). Tile placement by source order via :nth-child.
17666
+ ======================================== */
17667
+ .pa-kpi-bento {
17668
+ container-type: inline-size;
17669
+ }
17670
+
17671
+ .pa-kpi-bento__body {
17672
+ padding: 1.6rem;
17673
+ }
17674
+
17675
+ /* ----- Bento grid ------------------------------------------------------- */
17676
+ .pa-kpi-bento__grid {
17677
+ display: grid;
17678
+ grid-template-columns: repeat(6, 1fr);
17679
+ grid-template-rows: 12rem 12rem 12rem;
17680
+ grid-template-areas: "hero hero hero a a a" "hero hero hero b b b" "c c d d e e";
17681
+ gap: 1rem;
17682
+ }
17683
+ .pa-kpi-bento__grid > :nth-child(1) {
17684
+ grid-area: hero;
17685
+ }
17686
+ .pa-kpi-bento__grid > :nth-child(2) {
17687
+ grid-area: a;
17688
+ }
17689
+ .pa-kpi-bento__grid > :nth-child(3) {
17690
+ grid-area: b;
17691
+ }
17692
+ .pa-kpi-bento__grid > :nth-child(4) {
17693
+ grid-area: c;
17694
+ }
17695
+ .pa-kpi-bento__grid > :nth-child(5) {
17696
+ grid-area: d;
17697
+ }
17698
+ .pa-kpi-bento__grid > :nth-child(6) {
17699
+ grid-area: e;
17700
+ }
17701
+
17702
+ /* Narrow card → stack everything single column. Hero modifier still
17703
+ bumps the value font-size so it reads as the headline. */
17704
+ @container (max-width: 700px) {
17705
+ .pa-kpi-bento__grid {
17706
+ grid-template-columns: 1fr;
17707
+ grid-template-rows: auto;
17708
+ grid-template-areas: none;
17709
+ gap: 0.8rem;
17710
+ }
17711
+ .pa-kpi-bento__grid > :nth-child(n) {
17712
+ grid-area: auto;
17713
+ }
17714
+ .pa-kpi-bento-tile {
17715
+ min-height: 10rem;
17716
+ }
17717
+ .pa-kpi-bento-tile--hero {
17718
+ min-height: 14rem;
17719
+ }
17720
+ }
17721
+ /* ----- Tile (per-KPI bento cell) ---------------------------------------- */
17722
+ .pa-kpi-bento-tile {
17723
+ /* Per-tile inline-size container so the value font-size scales with
17724
+ *this* tile's width via cqi (not the outer card's width). The hero
17725
+ and the smaller bottom tiles each scale to their own column. */
17726
+ container-type: inline-size;
17727
+ position: relative;
17728
+ overflow: hidden;
17729
+ padding: 1.3rem 1.5rem;
17730
+ border: 1px solid var(--pa-border-color);
17731
+ background: var(--pa-card-bg);
17732
+ display: grid;
17733
+ grid-template-columns: minmax(0, 1fr) auto;
17734
+ grid-template-rows: auto 1fr auto;
17735
+ grid-template-areas: "label delta" ". . " "value value";
17736
+ gap: 0.4rem 1rem;
17737
+ /* Sparkline + delta sentiment cascade via currentColor. */
17738
+ --pa-kpi-accent: var(--pa-positive);
17739
+ }
17740
+ .pa-kpi-bento-tile--positive {
17741
+ --pa-kpi-accent: var(--pa-positive);
17742
+ }
17743
+ .pa-kpi-bento-tile--negative {
17744
+ --pa-kpi-accent: var(--pa-negative);
17745
+ }
17746
+ .pa-kpi-bento-tile--neutral {
17747
+ --pa-kpi-accent: var(--pa-neutral);
17748
+ }
17749
+ .pa-kpi-bento-tile--up-strong {
17750
+ --pa-kpi-accent: var(--pa-very-positive);
17751
+ }
17752
+ .pa-kpi-bento-tile--down-strong {
17753
+ --pa-kpi-accent: var(--pa-very-negative);
17754
+ }
17755
+ .pa-kpi-bento-tile--hero {
17756
+ padding: 1.6rem 1.8rem;
17757
+ }
17758
+ .pa-kpi-bento-tile--hero .pa-kpi-bento-tile__num {
17759
+ font-size: clamp(3.6rem, 22cqi, 7rem);
17760
+ }
17761
+ .pa-kpi-bento-tile--hero .pa-kpi-bento-tile__unit {
17762
+ font-size: clamp(1.6rem, 9cqi, 2.6rem);
17763
+ }
17764
+ .pa-kpi-bento-tile--hero .pa-kpi-bento-tile__label,
17765
+ .pa-kpi-bento-tile--hero .pa-kpi-bento-tile__delta {
17766
+ font-size: 1.4rem;
17767
+ }
17768
+ .pa-kpi-bento-tile--hero .pa-kpi-bento-tile__chart {
17769
+ height: 70%;
17770
+ }
17771
+
17772
+ /* ----- Top row: label + delta, both layered over the chart -------------- */
17773
+ .pa-kpi-bento-tile__label {
17774
+ grid-area: label;
17775
+ font-family: var(--base-font-family-mono);
17776
+ font-size: 1.3rem;
17777
+ font-weight: 700;
17778
+ letter-spacing: 0.1em;
17779
+ text-transform: uppercase;
17780
+ color: color-mix(in srgb, var(--pa-text-color-1) 60%, transparent);
17781
+ z-index: 1;
17782
+ line-height: 1.2;
17783
+ }
17784
+
17785
+ .pa-kpi-bento-tile__delta {
17786
+ grid-area: delta;
17787
+ font-family: var(--base-font-family-mono);
17788
+ font-size: 1.3rem;
17789
+ font-weight: 700;
17790
+ color: var(--pa-kpi-accent);
17791
+ z-index: 1;
17792
+ align-self: start;
17793
+ line-height: 1.2;
17794
+ }
17795
+
17796
+ /* ----- Value (bottom of grid, layered over chart) ----------------------- */
17797
+ .pa-kpi-bento-tile__value {
17798
+ grid-area: value;
17799
+ align-self: end;
17800
+ position: relative;
17801
+ z-index: 1;
17802
+ font-family: var(--base-font-family-mono);
17803
+ display: inline-flex;
17804
+ align-items: baseline;
17805
+ line-height: 1;
17806
+ white-space: nowrap;
17807
+ }
17808
+
17809
+ .pa-kpi-bento-tile__num {
17810
+ font-size: clamp(2rem, 14cqi, 3.2rem);
17811
+ font-weight: 700;
17812
+ letter-spacing: -0.02em;
17813
+ color: var(--pa-text-color-1);
17814
+ }
17815
+
17816
+ .pa-kpi-bento-tile__unit {
17817
+ font-size: clamp(1.2rem, 7cqi, 1.6rem);
17818
+ font-weight: 500;
17819
+ color: color-mix(in srgb, var(--pa-text-color-1) 50%, transparent);
17820
+ margin: 0 0.3rem;
17821
+ }
17822
+
17823
+ /* ----- Sparkline background ---------------------------------------------
17824
+ Absolutely positioned, fills the bottom 65% of the tile. The value sits
17825
+ over it (z-index: 1 above). The line/area read through behind the
17826
+ digits at lower opacity so the value remains the focal point. SVG is
17827
+ nested in a fixed-height wrapper so taller tiles don't distort the line
17828
+ shape (preserveAspectRatio="none" would otherwise stretch the Y axis). */
17829
+ .pa-kpi-bento-tile__chart {
17830
+ position: absolute;
17831
+ left: 0;
17832
+ right: 0;
17833
+ bottom: 0;
17834
+ height: 65%;
17835
+ pointer-events: none;
17836
+ color: var(--pa-kpi-accent);
17837
+ z-index: 0;
17838
+ display: flex;
17839
+ align-items: flex-end;
17840
+ }
17841
+ .pa-kpi-bento-tile__chart svg {
17842
+ display: block;
17843
+ width: 100%;
17844
+ height: 100%;
17845
+ overflow: visible;
17846
+ }
17847
+ .pa-kpi-bento-tile__chart polyline {
17848
+ fill: none;
17849
+ stroke: currentColor;
17850
+ stroke-opacity: 0.55;
17851
+ stroke-width: var(--pa-chart-trendline-stroke);
17852
+ stroke-linecap: round;
17853
+ stroke-linejoin: round;
17854
+ }
17855
+ .pa-kpi-bento-tile__chart polygon {
17856
+ fill: currentColor;
17857
+ fill-opacity: 0.1;
17858
+ stroke: none;
17859
+ }
17860
+
17861
+ .pa-kpi-bento-tile__chart-svg {
17862
+ position: relative;
17863
+ display: block;
17864
+ width: 100%;
17865
+ height: var(--pa-chart-trendline-height);
17866
+ }
17867
+
17868
+ /* ========================================
17869
+ KPI · Numeric strip (densest)
17870
+ Tabular "spreadsheet-style" table card with metric/now/prev/Δ%/vs target
17871
+ columns — most data per pixel, no chart chrome. Each row is its own
17872
+ grid sharing the same column template so cells align across rows
17873
+ without needing subgrid. Wide-only by design — no responsive collapse;
17874
+ narrow placements should use Comparison gauges instead.
17875
+ ======================================== */
17876
+ .pa-kpi-strip__body {
17877
+ padding: 0;
17878
+ }
17879
+
17880
+ /* ----- Table layout ----------------------------------------------------- */
17881
+ .pa-kpi-strip__row,
17882
+ .pa-kpi-strip__head-row {
17883
+ display: grid;
17884
+ grid-template-columns: minmax(0, 2fr) minmax(0, 1.1fr) minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1.6fr); /* target (bar + pct stacked) */
17885
+ column-gap: 1.6rem;
17886
+ align-items: center;
17887
+ position: relative;
17888
+ padding: 1.1rem 1.6rem;
17889
+ }
17890
+
17891
+ /* Divider between data rows / between head and first row only. */
17892
+ .pa-kpi-strip__row + .pa-kpi-strip__row,
17893
+ .pa-kpi-strip__head-row + .pa-kpi-strip__row {
17894
+ border-top: 1px solid var(--pa-border-color);
17895
+ }
17896
+
17897
+ /* Hover host: subtle row highlight so the cursor-anchored popover has a
17898
+ clear "this row" anchor. */
17899
+ .pa-kpi-strip__row:hover {
17900
+ background: var(--pa-surface-hover);
17901
+ }
17902
+
17903
+ /* ----- Header cells (uppercase mono captions) --------------------------- */
17904
+ .pa-kpi-strip__head {
17905
+ font-family: var(--base-font-family-mono);
17906
+ font-size: 1.1rem;
17907
+ font-weight: 700;
17908
+ letter-spacing: 0.1em;
17909
+ text-transform: uppercase;
17910
+ color: var(--pa-text-tertiary);
17911
+ }
17912
+ .pa-kpi-strip__head--num {
17913
+ text-align: end;
17914
+ }
17915
+
17916
+ /* ----- Metric label ----------------------------------------------------- */
17917
+ .pa-kpi-strip__metric {
17918
+ font-family: var(--base-font-family-mono);
17919
+ font-size: 1.4rem;
17920
+ font-weight: 700;
17921
+ letter-spacing: 0.08em;
17922
+ text-transform: uppercase;
17923
+ color: color-mix(in srgb, var(--pa-text-color-1) 78%, transparent);
17924
+ line-height: 1.2;
17925
+ }
17926
+
17927
+ /* ----- NOW (focal value) ------------------------------------------------ */
17928
+ .pa-kpi-strip__now {
17929
+ font-family: var(--base-font-family-mono);
17930
+ font-size: 1.8rem;
17931
+ font-weight: 700;
17932
+ text-align: end;
17933
+ display: flex;
17934
+ align-items: baseline;
17935
+ justify-content: flex-end;
17936
+ color: var(--pa-text-color-1);
17937
+ white-space: nowrap;
17938
+ line-height: 1;
17939
+ }
17940
+ .pa-kpi-strip__now .pa-kpi-strip__num {
17941
+ font-weight: 700;
17942
+ }
17943
+ .pa-kpi-strip__now .pa-kpi-strip__unit {
17944
+ font-size: 1.1rem;
17945
+ font-weight: 500;
17946
+ color: color-mix(in srgb, var(--pa-text-color-1) 50%, transparent);
17947
+ margin: 0 0.2rem;
17948
+ }
17949
+
17950
+ /* ----- PREV (reference data, low contrast) ------------------------------ */
17951
+ .pa-kpi-strip__prev {
17952
+ font-family: var(--base-font-family-mono);
17953
+ font-size: 1.5rem;
17954
+ font-weight: 500;
17955
+ color: var(--pa-text-tertiary);
17956
+ text-align: end;
17957
+ white-space: nowrap;
17958
+ }
17959
+
17960
+ /* ----- Δ% (sentiment-coloured) ------------------------------------------ */
17961
+ .pa-kpi-strip__delta {
17962
+ font-family: var(--base-font-family-mono);
17963
+ font-size: 1.5rem;
17964
+ font-weight: 700;
17965
+ text-align: end;
17966
+ white-space: nowrap;
17967
+ color: var(--pa-positive);
17968
+ }
17969
+ .pa-kpi-strip__delta--positive {
17970
+ color: var(--pa-positive);
17971
+ }
17972
+ .pa-kpi-strip__delta--negative {
17973
+ color: var(--pa-negative);
17974
+ }
17975
+ .pa-kpi-strip__delta--neutral {
17976
+ color: var(--pa-neutral);
17977
+ }
17978
+ .pa-kpi-strip__delta--up-strong {
17979
+ color: var(--pa-very-positive);
17980
+ }
17981
+ .pa-kpi-strip__delta--down-strong {
17982
+ color: var(--pa-very-negative);
17983
+ }
17984
+
17985
+ /* ----- VS TARGET (bar + pct stacked, capped at 100% visual) -------------
17986
+ Theme-neutral grey fill — the pct value itself signals overshoot /
17987
+ undershoot ("97" vs "108" vs "54") so colour reinforcement isn't
17988
+ needed. The bar visually caps at 100% via overflow: hidden so an
17989
+ over-target metric reads as "fully filled" rather than overflowing. */
17990
+ .pa-kpi-strip__target {
17991
+ display: flex;
17992
+ flex-direction: column;
17993
+ gap: 0.35rem;
17994
+ }
17995
+
17996
+ .pa-kpi-strip__bar {
17997
+ position: relative;
17998
+ height: 0.5rem;
17999
+ background: var(--pa-surface-track);
18000
+ overflow: hidden;
18001
+ border-radius: 0.1rem;
18002
+ }
18003
+
18004
+ .pa-kpi-strip__fill {
18005
+ position: absolute;
18006
+ top: 0;
18007
+ left: 0;
18008
+ bottom: 0;
18009
+ background: color-mix(in srgb, var(--pa-text-color-1) 40%, transparent);
18010
+ }
18011
+
18012
+ .pa-kpi-strip__bar-pct {
18013
+ font-family: var(--base-font-family-mono);
18014
+ font-size: 1.05rem;
18015
+ font-weight: 600;
18016
+ color: var(--pa-text-secondary);
18017
+ align-self: flex-end;
18018
+ line-height: 1;
18019
+ }
18020
+
18021
+ /* ----- --no-prev: 4-col layout (metric / now / Δ% / target) -------------
18022
+ Useful for narrow placements; markup omits the prev cells. */
18023
+ .pa-kpi-strip--no-prev .pa-kpi-strip__row,
18024
+ .pa-kpi-strip--no-prev .pa-kpi-strip__head-row {
18025
+ grid-template-columns: minmax(0, 2fr) minmax(0, 1.1fr) minmax(0, 1fr) minmax(0, 1.6fr);
18026
+ }
18027
+
18028
+ /* ========================================
18029
+ KPI · Editorial minimal
18030
+ Six KPIs in a 2×3 / 3×2 grid with hairline rules between cells,
18031
+ generous space, and an extra-light-weight number as the focal point per
18032
+ tile. No charts, no pills — the design's whole identity is the thin
18033
+ numeral. Renders as a table card (zero card-body padding) so hairlines
18034
+ go edge-to-edge.
18035
+ ======================================== */
18036
+ .pa-kpi-edit__body {
18037
+ padding: 0;
18038
+ }
18039
+
18040
+ /* ----- Grid + hairline rules -------------------------------------------
18041
+ `gap: 1px` over `background: var(--pa-border-color)` with each tile
18042
+ painting `background: var(--pa-card-bg)` on top. Only the gap shows
18043
+ through, giving perfect single-pixel hairlines on every interior
18044
+ boundary (vertical and horizontal) for free, regardless of column
18045
+ count. The card's outer border supplies the perimeter. */
18046
+ .pa-kpi-edit__grid {
18047
+ display: grid;
18048
+ grid-template-columns: repeat(3, 1fr);
18049
+ gap: 1px;
18050
+ background: var(--pa-border-color);
18051
+ container-type: inline-size;
18052
+ }
18053
+
18054
+ @container (max-width: 640px) {
18055
+ .pa-kpi-edit__grid {
18056
+ grid-template-columns: repeat(2, 1fr);
18057
+ }
18058
+ }
18059
+ @container (max-width: 360px) {
18060
+ .pa-kpi-edit__grid {
18061
+ grid-template-columns: 1fr;
18062
+ }
18063
+ }
18064
+ /* Modifier: force 2-col regardless of card width. For placements wanting
18065
+ a deterministic 2×N layout (e.g. 4 tiles as clean 2×2) instead of
18066
+ relying on the container query to land in the right bucket. */
18067
+ .pa-kpi-edit__grid--2col {
18068
+ grid-template-columns: repeat(2, 1fr);
18069
+ }
18070
+
18071
+ /* ----- Tile (editorial spacing leans on the 2.4rem padding) ------------- */
18072
+ .pa-kpi-edit__tile {
18073
+ background: var(--pa-card-bg);
18074
+ padding: 2.4rem 2rem;
18075
+ display: flex;
18076
+ flex-direction: column;
18077
+ gap: 1.2rem;
18078
+ position: relative;
18079
+ min-width: 0;
18080
+ /* Hover host: faint wash so the cursor-anchored popover has a clear
18081
+ "this tile" anchor. */
18082
+ }
18083
+ .pa-kpi-edit__tile:hover {
18084
+ background: color-mix(in srgb, var(--pa-text-color-1) 4%, var(--pa-card-bg));
18085
+ }
18086
+
18087
+ /* ----- Label (uppercase mono caption) ----------------------------------- */
18088
+ .pa-kpi-edit__label {
18089
+ font-family: var(--base-font-family-mono);
18090
+ font-size: 1.2rem;
18091
+ font-weight: 600;
18092
+ letter-spacing: 0.12em;
18093
+ text-transform: uppercase;
18094
+ color: color-mix(in srgb, var(--pa-text-color-1) 50%, transparent);
18095
+ line-height: 1.3;
18096
+ }
18097
+
18098
+ /* ----- Value (the editorial signature) ---------------------------------
18099
+ - NOT mono — mono fonts rarely have a true 200 weight; using the body
18100
+ sans gives proper thin glyphs that read as "editorial" rather than
18101
+ "monospace at low contrast".
18102
+ - font-weight: 200 (extra-light). 300 was tested first but didn't read
18103
+ distinctly enough as "light" against the body's 400 default.
18104
+ - clamp() lets the number shrink in narrow 25% page-grid cells without
18105
+ manual breakpoints. */
18106
+ .pa-kpi-edit__value {
18107
+ font-family: var(--base-font-family);
18108
+ font-size: clamp(3.2rem, 18cqi, 5.6rem);
18109
+ font-weight: 200;
18110
+ letter-spacing: -0.02em;
18111
+ line-height: 1;
18112
+ color: var(--pa-text-color-1);
18113
+ display: flex;
18114
+ align-items: baseline;
18115
+ gap: 0.2rem;
18116
+ flex-wrap: wrap;
18117
+ }
18118
+
18119
+ .pa-kpi-edit__num {
18120
+ font-weight: 200;
18121
+ font-variant-numeric: tabular-nums;
18122
+ }
18123
+
18124
+ .pa-kpi-edit__unit {
18125
+ font-size: 0.4em;
18126
+ font-weight: 300;
18127
+ color: color-mix(in srgb, var(--pa-text-color-1) 50%, transparent);
18128
+ letter-spacing: 0;
18129
+ }
18130
+
18131
+ /* ----- Meta row (delta + tgt) ------------------------------------------ */
18132
+ .pa-kpi-edit__meta {
18133
+ display: flex;
18134
+ align-items: baseline;
18135
+ gap: 1.4rem;
18136
+ font-family: var(--base-font-family-mono);
18137
+ font-size: 1.3rem;
18138
+ line-height: 1.3;
18139
+ flex-wrap: wrap;
18140
+ }
18141
+
18142
+ .pa-kpi-edit__delta {
18143
+ font-weight: 700;
18144
+ white-space: nowrap;
18145
+ color: var(--pa-positive);
18146
+ }
18147
+ .pa-kpi-edit__delta--positive {
18148
+ color: var(--pa-positive);
18149
+ }
18150
+ .pa-kpi-edit__delta--negative {
18151
+ color: var(--pa-negative);
18152
+ }
18153
+ .pa-kpi-edit__delta--neutral {
18154
+ color: var(--pa-neutral);
18155
+ }
18156
+ .pa-kpi-edit__delta--up-strong {
18157
+ color: var(--pa-very-positive);
18158
+ }
18159
+ .pa-kpi-edit__delta--down-strong {
18160
+ color: var(--pa-very-negative);
18161
+ }
18162
+
18163
+ .pa-kpi-edit__target {
18164
+ font-weight: 500;
18165
+ color: color-mix(in srgb, var(--pa-text-color-1) 50%, transparent);
18166
+ white-space: nowrap;
18167
+ }
18168
+ .pa-kpi-edit__target em {
18169
+ font-style: normal;
18170
+ color: color-mix(in srgb, var(--pa-text-color-1) 38%, transparent);
18171
+ margin-right: 0.5rem;
18172
+ }
18173
+
16566
18174
  /* ========================================
16567
18175
  Utility Components
16568
18176
  Font utilities, compact mode, component showcase