@keenmate/pure-admin-core 2.5.0 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/README.md +25 -14
  2. package/dist/css/main.css +379 -297
  3. package/package.json +1 -1
  4. package/src/scss/_base-css-variables.scss +157 -32
  5. package/src/scss/core-components/_alerts.scss +2 -2
  6. package/src/scss/core-components/_base.scss +19 -2
  7. package/src/scss/core-components/_buttons.scss +12 -8
  8. package/src/scss/core-components/_callouts.scss +1 -1
  9. package/src/scss/core-components/_cards.scss +4 -4
  10. package/src/scss/core-components/_checkbox-lists.scss +2 -2
  11. package/src/scss/core-components/_comparison.scss +7 -4
  12. package/src/scss/core-components/_data-display.scss +24 -15
  13. package/src/scss/core-components/_data-viz.scss +140 -132
  14. package/src/scss/core-components/_file-selector.scss +34 -34
  15. package/src/scss/core-components/_lists.scss +4 -4
  16. package/src/scss/core-components/_logic-tree.scss +2 -2
  17. package/src/scss/core-components/_modals.scss +69 -0
  18. package/src/scss/core-components/_notifications.scss +17 -17
  19. package/src/scss/core-components/_popconfirm.scss +1 -1
  20. package/src/scss/core-components/_statistics.scss +40 -37
  21. package/src/scss/core-components/_tabs.scss +12 -12
  22. package/src/scss/core-components/_timeline.scss +30 -30
  23. package/src/scss/core-components/badges/_composite-badge-variants.scss +7 -7
  24. package/src/scss/core-components/badges/_composite-badge.scss +1 -1
  25. package/src/scss/core-components/badges/_labels.scss +6 -6
  26. package/src/scss/core-components/forms/_input-wrapper.scss +1 -1
  27. package/src/scss/core-components/forms/_query-editor.scss +10 -10
  28. package/src/scss/core-components/layout/_sidebar-states.scss +1 -0
  29. package/src/scss/core-components/layout/_sidebar.scss +1 -0
  30. package/src/scss/variables/_base.scss +15 -3
  31. package/src/scss/variables/_colors.scss +1 -0
  32. package/src/scss/variables/_components.scss +26 -14
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keenmate/pure-admin-core",
3
- "version": "2.5.0",
3
+ "version": "2.7.0",
4
4
  "description": "Lightweight, data-focused HTML/CSS admin framework built with PureCSS foundation and comprehensive component system",
5
5
  "style": "dist/css/main.css",
6
6
  "exports": {
@@ -207,6 +207,42 @@
207
207
  --pa-alert-info-border: color-mix(in srgb, var(--pa-info-bg) #{$alert-border-opacity-dark}%, transparent);
208
208
  }
209
209
 
210
+ // ============================================================================
211
+ // DERIVED TOKENS — TEXT CONTRAST TIERS + SURFACE TINTS
212
+ // ============================================================================
213
+ // These tokens use `color-mix(... var(--pa-text-color-1) ...)` to derive
214
+ // theme-aware contrast levels. They MUST be emitted at every selector that
215
+ // could carry an override of --pa-text-color-1, because CSS custom property
216
+ // substitution bakes nested var() references at the *defining element*, not
217
+ // the using element. If we only defined these at `:root, .pa-mode-light`,
218
+ // the light-mode text colour would be frozen into the value, and elements
219
+ // inside `.pa-mode-dark` (which overrides --pa-text-color-1 at body) would
220
+ // inherit the light-mode-baked tier values → low contrast on dark surfaces.
221
+ //
222
+ // Emitting at all three selectors causes each scope to recompute the tiers
223
+ // against its own --pa-text-color-1. The selector list `:root, .pa-mode-light,
224
+ // .pa-mode-dark` covers html, body in light mode, and body in dark mode —
225
+ // regardless of which class layout each theme uses for mode switching.
226
+ //
227
+ // This is a TOP-LEVEL rule (not inside the mixin) because themes only call
228
+ // the mixin from their light-mode block; they don't call it again in the
229
+ // dark-mode block. Emitting at framework level means themes get correct
230
+ // dark-mode tiers without changing any theme code.
231
+ //
232
+ // Override these per-theme by redefining them in the same scope you
233
+ // override --pa-text-color-1.
234
+ // ============================================================================
235
+
236
+ :root,
237
+ .pa-mode-light,
238
+ .pa-mode-dark {
239
+ --pa-text-strong: color-mix(in srgb, var(--pa-text-color-1) 85%, transparent);
240
+ --pa-text-secondary: color-mix(in srgb, var(--pa-text-color-1) 70%, transparent);
241
+ --pa-text-tertiary: color-mix(in srgb, var(--pa-text-color-1) 55%, transparent);
242
+ --pa-surface-hover: color-mix(in srgb, var(--pa-text-color-1) 4%, transparent);
243
+ --pa-surface-track: color-mix(in srgb, var(--pa-text-color-1) 12%, transparent);
244
+ }
245
+
210
246
  // ============================================================================
211
247
  // PURE ADMIN THEME CSS VARIABLES OUTPUT MIXIN
212
248
  // ============================================================================
@@ -239,11 +275,92 @@
239
275
  // Accent colors
240
276
  --pa-accent: #{$accent-color};
241
277
  --pa-accent-hover: #{$accent-hover};
242
- --pa-accent-light: #{$accent-light};
278
+ // -light derives from --pa-accent at runtime so theme overrides cascade.
279
+ // SCSS-only consumers still get $accent-light from variables/_base.scss via the !default chain.
280
+ --pa-accent-light: color-mix(in srgb, var(--pa-accent) 5%, transparent);
281
+
282
+ // Links — derive from accent so theme overrides cascade automatically.
283
+ // Hover mixes 25% toward currentColor (inherited text colour at the use site),
284
+ // so it auto-darkens on light themes and auto-lightens on dark themes
285
+ // without per-mode declarations.
286
+ --pa-link-color: var(--pa-accent);
287
+ --pa-link-color-hover: color-mix(in srgb, var(--pa-link-color), currentColor 50%);
288
+ --pa-link-color-visited: var(--pa-link-color);
243
289
 
244
290
  // Border
245
291
  --pa-border-color: #{$border-color};
246
292
 
293
+ // =========================================================================
294
+ // ROLE COLORS — single source of truth for the four semantic roles.
295
+ // Button surfaces (--pa-btn-{success,warning,danger,info}-bg) and
296
+ // contextual surfaces (--pa-{success,warning,danger,info}-bg) below
297
+ // both reference these via var() so a theme can override one place
298
+ // and the change cascades everywhere.
299
+ //
300
+ // --pa-warning here is also the "off-target / approaching-limit" axis
301
+ // colour used by KPI components — orange-500, deliberately distinct
302
+ // from the previous Bootstrap yellow.
303
+ // =========================================================================
304
+
305
+ --pa-success: #{$base-success-color};
306
+ --pa-warning: #{$base-warning-color};
307
+ --pa-danger: #{$base-danger-color};
308
+ --pa-info: #{$base-info-color};
309
+
310
+ // =========================================================================
311
+ // SENTIMENT SCALE — 5-step direction-of-change.
312
+ // Used by KPI / data-display components for indicating directional
313
+ // movement (delta colours, sparkline trend colours, etc.).
314
+ // The middle three values alias the role colours so a theme that
315
+ // retunes --pa-success / --pa-danger automatically retunes the
316
+ // matching sentiment positions; the outliers (very-positive /
317
+ // very-negative) are explicit darker shades.
318
+ //
319
+ // Sentiment is on a *different axis* from role colours — direction
320
+ // (ordinal: -2 to +2) vs. urgency (categorical: success / warning /
321
+ // danger / info). They coexist intentionally.
322
+ // =========================================================================
323
+
324
+ --pa-very-positive: #{$base-very-positive};
325
+ --pa-positive: var(--pa-success);
326
+ --pa-neutral: #{$base-neutral};
327
+ --pa-negative: var(--pa-danger);
328
+ --pa-very-negative: #{$base-very-negative};
329
+
330
+ // (Text contrast tiers and surface tints are emitted as a top-level rule
331
+ // OUTSIDE this mixin — see below — because their values use
332
+ // `var(--pa-text-color-1)` and CSS custom property substitution bakes
333
+ // nested var() at the *defining element*, not the using element. That
334
+ // means tier vars defined here at `:root, .pa-mode-light` would freeze
335
+ // the light-mode text colour into them; under `.pa-mode-dark` (which
336
+ // overrides --pa-text-color-1 at body) the tiers would still resolve
337
+ // against the light value. Emitting them at all three selectors
338
+ // simultaneously fixes the substitution scope.)
339
+
340
+ // =========================================================================
341
+ // CHART / SPARKLINE
342
+ // =========================================================================
343
+ // Single height token used by every KPI showcase that renders a sparkline
344
+ // / trendline (terminal grid, sparkline list, hero+supporting, bento).
345
+ // Centralised so the line proportions stay consistent across designs;
346
+ // override globally for taller or shorter trendlines, or per-component
347
+ // if a particular layout (e.g. a "hero" pattern) wants a different size.
348
+
349
+ --pa-chart-trendline-height: 3rem;
350
+ --pa-chart-trendline-stroke: 2.1; // SVG user-space units (viewBox-relative)
351
+
352
+ // =========================================================================
353
+ // DETAIL POPOVER — Bloomberg-dark by default, regardless of host
354
+ // theme, for the terminal/data-dashboard aesthetic. Override the
355
+ // five tokens to adopt a theme-aware popover instead.
356
+ // =========================================================================
357
+
358
+ --pa-detail-bg: rgba(15, 17, 21, 0.97);
359
+ --pa-detail-text: #ffffff;
360
+ --pa-detail-row-label: rgba(255, 255, 255, 0.75);
361
+ --pa-detail-title: rgba(255, 255, 255, 0.55);
362
+ --pa-detail-shadow: 0 1.4rem 3.6rem rgba(0, 0, 0, 0.55);
363
+
247
364
  // =========================================================================
248
365
  // LAYOUT COLORS
249
366
  // =========================================================================
@@ -262,6 +379,7 @@
262
379
  --pa-sidebar-submenu-bg: #{$sidebar-submenu-bg};
263
380
  --pa-sidebar-submenu-hover-bg: #{$sidebar-submenu-hover-bg};
264
381
  --pa-sidebar-submenu-active-bg: #{$sidebar-submenu-active-bg};
382
+ --pa-sidebar-submenu-active-text: #{$sidebar-submenu-active-text};
265
383
 
266
384
  // Footer
267
385
  --pa-footer-bg: #{$footer-bg};
@@ -274,32 +392,37 @@
274
392
  // Primary (uses accent color)
275
393
  --pa-btn-primary-bg: #{$btn-primary-bg};
276
394
  --pa-btn-primary-bg-hover: #{$btn-primary-bg-hover};
277
- --pa-btn-primary-bg-light: #{$accent-light};
395
+ // -light derives from --pa-btn-primary-bg at runtime so theme overrides cascade.
396
+ --pa-btn-primary-bg-light: color-mix(in srgb, var(--pa-btn-primary-bg) 5%, transparent);
278
397
  --pa-btn-primary-text: #{$btn-primary-text};
279
398
 
280
399
  // Secondary
281
400
  --pa-btn-secondary-bg: #{$btn-secondary-bg};
282
401
  --pa-btn-secondary-bg-hover: #{$btn-secondary-bg-hover};
283
402
  --pa-btn-secondary-text: #{$btn-secondary-text};
284
- --pa-btn-secondary-outline-color: #{$btn-secondary-text};
285
-
286
- // Success
287
- --pa-btn-success-bg: #{$btn-success-bg};
403
+ // Outline-variant border + text colour. Defaults to --pa-btn-secondary-bg
404
+ // so the resting outline matches the colour the hover fill animates to.
405
+ // Was previously $btn-secondary-text (#ffffff) which rendered invisible on
406
+ // any light theme — pre-existing bug, not a 2.7.0 regression.
407
+ --pa-btn-secondary-outline-color: var(--pa-btn-secondary-bg);
408
+
409
+ // Success — bg references role colour for runtime cascade
410
+ --pa-btn-success-bg: var(--pa-success);
288
411
  --pa-btn-success-bg-hover: #{$btn-success-bg-hover};
289
412
  --pa-btn-success-text: #{$btn-success-text};
290
413
 
291
- // Danger
292
- --pa-btn-danger-bg: #{$btn-danger-bg};
414
+ // Danger — bg references role colour for runtime cascade
415
+ --pa-btn-danger-bg: var(--pa-danger);
293
416
  --pa-btn-danger-bg-hover: #{$btn-danger-bg-hover};
294
417
  --pa-btn-danger-text: #{$btn-danger-text};
295
418
 
296
- // Warning
297
- --pa-btn-warning-bg: #{$btn-warning-bg};
419
+ // Warning — bg references role colour for runtime cascade
420
+ --pa-btn-warning-bg: var(--pa-warning);
298
421
  --pa-btn-warning-bg-hover: #{$btn-warning-bg-hover};
299
422
  --pa-btn-warning-text: #{$btn-warning-text};
300
423
 
301
- // Info
302
- --pa-btn-info-bg: #{$btn-info-bg};
424
+ // Info — bg references role colour for runtime cascade
425
+ --pa-btn-info-bg: var(--pa-info);
303
426
  --pa-btn-info-bg-hover: #{$btn-info-bg-hover};
304
427
  --pa-btn-info-text: #{$btn-info-text};
305
428
 
@@ -317,39 +440,41 @@
317
440
  // CONTEXTUAL/SEMANTIC COLORS
318
441
  // =========================================================================
319
442
 
320
- // Success
321
- --pa-success-bg: #{$success-bg};
443
+ // Success — bg references role colour for runtime cascade.
444
+ // -light/-subtle/-border derive from --pa-success at runtime so theme overrides cascade.
445
+ // -hover stays compile-time (color.adjust-derived darker shade, not opacity-based).
446
+ --pa-success-bg: var(--pa-success);
322
447
  --pa-success-bg-hover: #{$success-bg-hover};
323
- --pa-success-bg-light: #{$success-bg-light};
324
- --pa-success-bg-subtle: #{$success-bg-subtle};
325
- --pa-success-border: #{$success-border};
448
+ --pa-success-bg-light: color-mix(in srgb, var(--pa-success) 10%, transparent);
449
+ --pa-success-bg-subtle: color-mix(in srgb, var(--pa-success) 8%, transparent);
450
+ --pa-success-border: color-mix(in srgb, var(--pa-success) 20%, transparent);
326
451
  --pa-success-text: #{$success-text};
327
452
  --pa-success-text-light: #{$success-text-light};
328
453
 
329
- // Danger
330
- --pa-danger-bg: #{$danger-bg};
454
+ // Danger — bg references role colour for runtime cascade.
455
+ --pa-danger-bg: var(--pa-danger);
331
456
  --pa-danger-bg-hover: #{$danger-bg-hover};
332
- --pa-danger-bg-light: #{$danger-bg-light};
333
- --pa-danger-bg-subtle: #{$danger-bg-subtle};
334
- --pa-danger-border: #{$danger-border};
457
+ --pa-danger-bg-light: color-mix(in srgb, var(--pa-danger) 10%, transparent);
458
+ --pa-danger-bg-subtle: color-mix(in srgb, var(--pa-danger) 8%, transparent);
459
+ --pa-danger-border: color-mix(in srgb, var(--pa-danger) 20%, transparent);
335
460
  --pa-danger-text: #{$danger-text};
336
461
  --pa-danger-text-light: #{$danger-text-light};
337
462
 
338
- // Warning
339
- --pa-warning-bg: #{$warning-bg};
463
+ // Warning — bg references role colour for runtime cascade.
464
+ --pa-warning-bg: var(--pa-warning);
340
465
  --pa-warning-bg-hover: #{$warning-bg-hover};
341
- --pa-warning-bg-light: #{$warning-bg-light};
342
- --pa-warning-bg-subtle: #{$warning-bg-subtle};
343
- --pa-warning-border: #{$warning-border};
466
+ --pa-warning-bg-light: color-mix(in srgb, var(--pa-warning) 10%, transparent);
467
+ --pa-warning-bg-subtle: color-mix(in srgb, var(--pa-warning) 8%, transparent);
468
+ --pa-warning-border: color-mix(in srgb, var(--pa-warning) 20%, transparent);
344
469
  --pa-warning-text: #{$warning-text};
345
470
  --pa-warning-text-light: #{$warning-text-light};
346
471
 
347
- // Info
348
- --pa-info-bg: #{$info-bg};
472
+ // Info — bg references role colour for runtime cascade.
473
+ --pa-info-bg: var(--pa-info);
349
474
  --pa-info-bg-hover: #{$info-bg-hover};
350
- --pa-info-bg-light: #{$info-bg-light};
351
- --pa-info-bg-subtle: #{$info-bg-subtle};
352
- --pa-info-border: #{$info-border};
475
+ --pa-info-bg-light: color-mix(in srgb, var(--pa-info) 10%, transparent);
476
+ --pa-info-bg-subtle: color-mix(in srgb, var(--pa-info) 8%, transparent);
477
+ --pa-info-border: color-mix(in srgb, var(--pa-info) 20%, transparent);
353
478
  --pa-info-text: #{$info-text};
354
479
  --pa-info-text-light: #{$info-text-light};
355
480
 
@@ -32,8 +32,8 @@
32
32
  // Basic alert variants - using theme colors with subtle backgrounds
33
33
  &--primary {
34
34
  color: var(--pa-accent);
35
- background-color: rgba($accent-color, $opacity-subtle);
36
- border-color: rgba($accent-color, $opacity-border);
35
+ background-color: color-mix(in srgb, var(--pa-accent) #{$opacity-subtle * 100%}, transparent);
36
+ border-color: color-mix(in srgb, var(--pa-accent) #{$opacity-border * 100%}, transparent);
37
37
  }
38
38
 
39
39
  &--secondary {
@@ -27,6 +27,23 @@ p {
27
27
  padding: 0;
28
28
  }
29
29
 
30
+ // Links — global default. Wrapped in :where() so specificity is 0,
31
+ // letting component scopes (alerts, navbar, sidebar) override with even a
32
+ // single class without fighting the pseudo-class specificity raise that
33
+ // `a:hover` / `a:visited` would otherwise add (0,1,1 vs a class's 0,1,0).
34
+ :where(a) {
35
+ color: var(--pa-link-color);
36
+ text-decoration: underline;
37
+ }
38
+
39
+ :where(a:hover) {
40
+ color: var(--pa-link-color-hover);
41
+ }
42
+
43
+ :where(a:visited) {
44
+ color: var(--pa-link-color-visited);
45
+ }
46
+
30
47
  // Lists - styled lists (default browser styling)
31
48
  ul, ol {
32
49
  margin: $list-margin-top 0 $list-margin-bottom 0;
@@ -101,8 +118,8 @@ body {
101
118
  right: 0;
102
119
  bottom: 0;
103
120
  background:
104
- radial-gradient(circle at $bg-pattern-circle-1-x $bg-pattern-circle-1-y, rgba($accent-color, $bg-pattern-opacity) $bg-pattern-gradient-start, transparent $bg-pattern-gradient-stop),
105
- radial-gradient(circle at $bg-pattern-circle-2-x $bg-pattern-circle-2-y, rgba($accent-color, $bg-pattern-opacity) $bg-pattern-gradient-start, transparent $bg-pattern-gradient-stop);
121
+ radial-gradient(circle at $bg-pattern-circle-1-x $bg-pattern-circle-1-y, color-mix(in srgb, var(--pa-accent) #{$bg-pattern-opacity * 100%}, transparent) $bg-pattern-gradient-start, transparent $bg-pattern-gradient-stop),
122
+ radial-gradient(circle at $bg-pattern-circle-2-x $bg-pattern-circle-2-y, color-mix(in srgb, var(--pa-accent) #{$bg-pattern-opacity * 100%}, transparent) $bg-pattern-gradient-start, transparent $bg-pattern-gradient-stop);
106
123
  pointer-events: none;
107
124
  z-index: -1;
108
125
  }
@@ -461,16 +461,20 @@
461
461
  .pa-btn-split {
462
462
  position: relative;
463
463
  display: inline-flex;
464
- border-radius: var(--pa-border-radius);
465
- overflow: hidden;
466
464
 
467
- // All buttons inside: no individual radius container handles corners
468
- .pa-btn {
469
- border-radius: 0;
465
+ // Flatten the inner edges between the two trigger buttons; outer corners
466
+ // stay rounded from each .pa-btn's own border-radius. Avoids relying on
467
+ // overflow:hidden + container border-radius, which gets bypassed by hover
468
+ // background paint in some browsers/themes.
469
+ > .pa-btn:first-child {
470
+ border-start-end-radius: 0;
471
+ border-end-end-radius: 0;
472
+ border-inline-end: none;
473
+ }
470
474
 
471
- &:first-child {
472
- border-inline-end: none;
473
- }
475
+ > .pa-btn-split__toggle {
476
+ border-start-start-radius: 0;
477
+ border-end-start-radius: 0;
474
478
  }
475
479
 
476
480
  // Toggle button (chevron) - fixed square width
@@ -26,7 +26,7 @@
26
26
  // Callout variants
27
27
  &--primary {
28
28
  border-inline-start-color: var(--pa-accent);
29
- background-color: rgba($accent-color, $opacity-subtle);
29
+ background-color: color-mix(in srgb, var(--pa-accent) #{$opacity-subtle * 100%}, transparent);
30
30
  }
31
31
 
32
32
  &--secondary {
@@ -344,12 +344,12 @@
344
344
  // Live-data state — persistent tinted background reflecting latest change
345
345
  // JS swaps the class on each data update; color stays until next update
346
346
  &--live-up {
347
- background-color: rgba($success-bg, 0.10);
347
+ background-color: color-mix(in srgb, var(--pa-positive) 10%, transparent);
348
348
  transition: background-color 0.3s ease;
349
349
  }
350
350
 
351
351
  &--live-down {
352
- background-color: rgba($danger-bg, 0.10);
352
+ background-color: color-mix(in srgb, var(--pa-negative) 10%, transparent);
353
353
  transition: background-color 0.3s ease;
354
354
  }
355
355
 
@@ -398,7 +398,7 @@
398
398
 
399
399
  &:hover {
400
400
  color: var(--pa-text-color-1);
401
- background-color: rgba($accent-color, $card-tab-hover-opacity);
401
+ background-color: color-mix(in srgb, var(--pa-accent) #{$card-tab-hover-opacity * 100%}, transparent);
402
402
  }
403
403
 
404
404
  &--active {
@@ -434,7 +434,7 @@
434
434
  transition: all $transition-fast $easing-snappy;
435
435
 
436
436
  &:hover {
437
- background-color: rgba($accent-color, $card-tab-hover-opacity);
437
+ background-color: color-mix(in srgb, var(--pa-accent) #{$card-tab-hover-opacity * 100%}, transparent);
438
438
  color: var(--pa-text-color-1);
439
439
  }
440
440
 
@@ -158,7 +158,7 @@
158
158
  cursor: not-allowed;
159
159
 
160
160
  &:hover {
161
- background-color: rgba($warning-bg, 0.05);
161
+ background-color: color-mix(in srgb, var(--pa-warning) 5%, transparent);
162
162
  }
163
163
 
164
164
  .pa-checkbox-list__checkbox {
@@ -172,7 +172,7 @@
172
172
 
173
173
  // Add lock icon before text
174
174
  .pa-checkbox-list__text {
175
- color: $warning-bg;
175
+ color: var(--pa-warning);
176
176
 
177
177
  &::before {
178
178
  content: '🔒 ';
@@ -67,7 +67,10 @@
67
67
 
68
68
  // Changed value highlighting (pink/salmon background)
69
69
  &__changed {
70
- background-color: rgba(244, 114, 182, 0.15); // Pink highlight
70
+ // Diff-specific accent (pink, distinct from role colours so it doesn't
71
+ // collide with status chips in the same row). All three intensities
72
+ // derive from $comparison-accent-pink so a theme override cascades.
73
+ background-color: color-mix(in srgb, $comparison-accent-pink 15%, transparent);
71
74
  position: relative;
72
75
 
73
76
  &::before {
@@ -82,7 +85,7 @@
82
85
 
83
86
  // Solid background variant (no left border accent)
84
87
  &--solid {
85
- background-color: rgba(244, 114, 182, 0.25) !important; // More opaque pink
88
+ background-color: color-mix(in srgb, $comparison-accent-pink 25%, transparent) !important;
86
89
 
87
90
  &::before {
88
91
  content: none; // Remove left border accent
@@ -92,7 +95,7 @@
92
95
 
93
96
  // Conflict highlighting (orange background for 3-column merge conflicts)
94
97
  &__conflict {
95
- background-color: rgba(251, 146, 60, 0.15); // Orange highlight
98
+ background-color: color-mix(in srgb, $comparison-accent-orange 15%, transparent);
96
99
 
97
100
  &::before {
98
101
  background-color: $comparison-accent-orange;
@@ -100,7 +103,7 @@
100
103
 
101
104
  // Solid background variant (no left border accent)
102
105
  &--solid {
103
- background-color: rgba(251, 146, 60, 0.25) !important; // More opaque orange
106
+ background-color: color-mix(in srgb, $comparison-accent-orange 25%, transparent) !important;
104
107
 
105
108
  &::before {
106
109
  content: none; // Remove left border accent
@@ -139,7 +139,7 @@
139
139
  .pa-field__value::after {
140
140
  content: 'Copied!' !important;
141
141
  opacity: 1 !important;
142
- color: var(--pa-color-4, #28a745);
142
+ color: var(--pa-success);
143
143
  }
144
144
  }
145
145
  }
@@ -452,19 +452,28 @@
452
452
  border-radius: var(--pa-border-radius);
453
453
  font-size: $fields-chips-value-font-size;
454
454
 
455
+ // Status chips use role colours. The framework reliably defines all
456
+ // four --pa-{role} and --pa-{role}-bg-light tokens, so no fallback
457
+ // needed. (Previous --pa-success-color refs were broken — they didn't
458
+ // exist, so chips silently used the hardcoded RGB fallbacks below.)
455
459
  &--success {
456
- background: var(--pa-success-bg-light, rgba(0, 200, 80, 0.12));
457
- color: var(--pa-success-color, #28a745);
460
+ background: var(--pa-success-bg-light);
461
+ color: var(--pa-success);
458
462
  }
459
463
 
460
464
  &--warning {
461
- background: var(--pa-warning-bg-light, rgba(255, 165, 0, 0.12));
462
- color: var(--pa-warning-color, #e68a00);
465
+ background: var(--pa-warning-bg-light);
466
+ color: var(--pa-warning);
463
467
  }
464
468
 
465
469
  &--danger {
466
- background: var(--pa-danger-bg-light, rgba(255, 0, 0, 0.12));
467
- color: var(--pa-danger-color, #dc3545);
470
+ background: var(--pa-danger-bg-light);
471
+ color: var(--pa-danger);
472
+ }
473
+
474
+ &--info {
475
+ background: var(--pa-info-bg-light);
476
+ color: var(--pa-info);
468
477
  }
469
478
  }
470
479
  }
@@ -681,7 +690,7 @@
681
690
  &__value--copied::after {
682
691
  content: 'Copied!' !important;
683
692
  opacity: 1 !important;
684
- color: var(--pa-color-4, #28a745);
693
+ color: var(--pa-success);
685
694
  }
686
695
  }
687
696
 
@@ -1010,7 +1019,7 @@
1010
1019
  &__row--copied &__value::after {
1011
1020
  content: 'Copied!' !important;
1012
1021
  opacity: 1 !important;
1013
- color: var(--pa-color-4, #28a745);
1022
+ color: var(--pa-success);
1014
1023
  }
1015
1024
  }
1016
1025
 
@@ -1027,12 +1036,12 @@
1027
1036
  &__item {
1028
1037
  padding: $accent-grid-item-padding-v $accent-grid-item-padding-h;
1029
1038
  padding-inline-start: $accent-grid-item-padding-start;
1030
- border-inline-start: $accent-grid-border-width solid var(--pa-accent, #3b82f6);
1039
+ border-inline-start: $accent-grid-border-width solid var(--pa-accent);
1031
1040
 
1032
- &--success { border-inline-start-color: var(--pa-success-color, #28a745); }
1033
- &--warning { border-inline-start-color: var(--pa-warning-color, #e68a00); }
1034
- &--danger { border-inline-start-color: var(--pa-danger-color, #dc3545); }
1035
- &--info { border-inline-start-color: var(--pa-info-color, #17a2b8); }
1041
+ &--success { border-inline-start-color: var(--pa-success); }
1042
+ &--warning { border-inline-start-color: var(--pa-warning); }
1043
+ &--danger { border-inline-start-color: var(--pa-danger); }
1044
+ &--info { border-inline-start-color: var(--pa-info); }
1036
1045
  }
1037
1046
 
1038
1047
  &__label {
@@ -1107,6 +1116,6 @@
1107
1116
  &__item--copied &__value::after {
1108
1117
  content: 'Copied!' !important;
1109
1118
  opacity: 1 !important;
1110
- color: var(--pa-color-4, #28a745);
1119
+ color: var(--pa-success);
1111
1120
  }
1112
1121
  }