@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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keenmate/pure-admin-core",
3
- "version": "2.6.0",
3
+ "version": "2.7.1",
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": {
@@ -275,7 +275,17 @@
275
275
  // Accent colors
276
276
  --pa-accent: #{$accent-color};
277
277
  --pa-accent-hover: #{$accent-hover};
278
- --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);
279
289
 
280
290
  // Border
281
291
  --pa-border-color: #{$border-color};
@@ -369,6 +379,7 @@
369
379
  --pa-sidebar-submenu-bg: #{$sidebar-submenu-bg};
370
380
  --pa-sidebar-submenu-hover-bg: #{$sidebar-submenu-hover-bg};
371
381
  --pa-sidebar-submenu-active-bg: #{$sidebar-submenu-active-bg};
382
+ --pa-sidebar-submenu-active-text: #{$sidebar-submenu-active-text};
372
383
 
373
384
  // Footer
374
385
  --pa-footer-bg: #{$footer-bg};
@@ -381,14 +392,19 @@
381
392
  // Primary (uses accent color)
382
393
  --pa-btn-primary-bg: #{$btn-primary-bg};
383
394
  --pa-btn-primary-bg-hover: #{$btn-primary-bg-hover};
384
- --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);
385
397
  --pa-btn-primary-text: #{$btn-primary-text};
386
398
 
387
399
  // Secondary
388
400
  --pa-btn-secondary-bg: #{$btn-secondary-bg};
389
401
  --pa-btn-secondary-bg-hover: #{$btn-secondary-bg-hover};
390
402
  --pa-btn-secondary-text: #{$btn-secondary-text};
391
- --pa-btn-secondary-outline-color: #{$btn-secondary-text};
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);
392
408
 
393
409
  // Success — bg references role colour for runtime cascade
394
410
  --pa-btn-success-bg: var(--pa-success);
@@ -424,39 +440,41 @@
424
440
  // CONTEXTUAL/SEMANTIC COLORS
425
441
  // =========================================================================
426
442
 
427
- // Success — bg references role colour for runtime cascade
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).
428
446
  --pa-success-bg: var(--pa-success);
429
447
  --pa-success-bg-hover: #{$success-bg-hover};
430
- --pa-success-bg-light: #{$success-bg-light};
431
- --pa-success-bg-subtle: #{$success-bg-subtle};
432
- --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);
433
451
  --pa-success-text: #{$success-text};
434
452
  --pa-success-text-light: #{$success-text-light};
435
453
 
436
- // Danger — bg references role colour for runtime cascade
454
+ // Danger — bg references role colour for runtime cascade.
437
455
  --pa-danger-bg: var(--pa-danger);
438
456
  --pa-danger-bg-hover: #{$danger-bg-hover};
439
- --pa-danger-bg-light: #{$danger-bg-light};
440
- --pa-danger-bg-subtle: #{$danger-bg-subtle};
441
- --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);
442
460
  --pa-danger-text: #{$danger-text};
443
461
  --pa-danger-text-light: #{$danger-text-light};
444
462
 
445
- // Warning — bg references role colour for runtime cascade
463
+ // Warning — bg references role colour for runtime cascade.
446
464
  --pa-warning-bg: var(--pa-warning);
447
465
  --pa-warning-bg-hover: #{$warning-bg-hover};
448
- --pa-warning-bg-light: #{$warning-bg-light};
449
- --pa-warning-bg-subtle: #{$warning-bg-subtle};
450
- --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);
451
469
  --pa-warning-text: #{$warning-text};
452
470
  --pa-warning-text-light: #{$warning-text-light};
453
471
 
454
- // Info — bg references role colour for runtime cascade
472
+ // Info — bg references role colour for runtime cascade.
455
473
  --pa-info-bg: var(--pa-info);
456
474
  --pa-info-bg-hover: #{$info-bg-hover};
457
- --pa-info-bg-light: #{$info-bg-light};
458
- --pa-info-bg-subtle: #{$info-bg-subtle};
459
- --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);
460
478
  --pa-info-text: #{$info-text};
461
479
  --pa-info-text-light: #{$info-text-light};
462
480
 
@@ -117,5 +117,16 @@
117
117
  // Data Visualization (progress bars, rings, gauges, heatmaps, sparklines)
118
118
  @use 'core-components/data-viz' as *;
119
119
 
120
+ // KPI showcase components — shared chrome + 7 distinct designs.
121
+ // Base must come first; design files use the shared classes from base.
122
+ @use 'core-components/kpi-base' as *;
123
+ @use 'core-components/kpi-terminal' as *;
124
+ @use 'core-components/kpi-sparkline-list' as *;
125
+ @use 'core-components/kpi-comparison-gauges' as *;
126
+ @use 'core-components/kpi-hero-supporting' as *;
127
+ @use 'core-components/kpi-bento' as *;
128
+ @use 'core-components/kpi-numeric-strip' as *;
129
+ @use 'core-components/kpi-editorial-minimal' as *;
130
+
120
131
  // Utility classes and helpers
121
132
  @use 'core-components/utilities' as *;
@@ -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
  }