@keenmate/pure-admin-core 2.7.1 → 2.9.0-rc01

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.
package/dist/css/main.css CHANGED
@@ -5425,8 +5425,6 @@ body:not(.sidebar-hidden) .pa-layout__sidebar--icon-collapse .pa-sidebar__icon {
5425
5425
  .pa-card__header {
5426
5426
  padding: 0.5rem 1rem;
5427
5427
  min-height: 4rem;
5428
- border-top-left-radius: 8px;
5429
- border-top-right-radius: 8px;
5430
5428
  border-bottom: 1px solid var(--pa-border-color);
5431
5429
  background: var(--pa-card-header-bg);
5432
5430
  display: flex;
@@ -5604,6 +5602,7 @@ body:not(.sidebar-hidden) .pa-layout__sidebar--icon-collapse .pa-sidebar__icon {
5604
5602
  }
5605
5603
  .pa-card--primary .pa-card__header {
5606
5604
  background-color: var(--pa-accent);
5605
+ border-bottom-color: var(--pa-accent);
5607
5606
  color: var(--pa-btn-primary-text);
5608
5607
  }
5609
5608
  .pa-card--primary .pa-card__header h1,
@@ -5619,6 +5618,7 @@ body:not(.sidebar-hidden) .pa-layout__sidebar--icon-collapse .pa-sidebar__icon {
5619
5618
  }
5620
5619
  .pa-card--success .pa-card__header {
5621
5620
  background-color: var(--pa-success-bg);
5621
+ border-bottom-color: var(--pa-success-bg);
5622
5622
  color: var(--pa-btn-success-text);
5623
5623
  }
5624
5624
  .pa-card--success .pa-card__header h1,
@@ -5634,6 +5634,7 @@ body:not(.sidebar-hidden) .pa-layout__sidebar--icon-collapse .pa-sidebar__icon {
5634
5634
  }
5635
5635
  .pa-card--warning .pa-card__header {
5636
5636
  background-color: var(--pa-warning-bg);
5637
+ border-bottom-color: var(--pa-warning-bg);
5637
5638
  color: var(--pa-btn-warning-text);
5638
5639
  }
5639
5640
  .pa-card--warning .pa-card__header h1,
@@ -5649,6 +5650,7 @@ body:not(.sidebar-hidden) .pa-layout__sidebar--icon-collapse .pa-sidebar__icon {
5649
5650
  }
5650
5651
  .pa-card--danger .pa-card__header {
5651
5652
  background-color: var(--pa-danger-bg);
5653
+ border-bottom-color: var(--pa-danger-bg);
5652
5654
  color: var(--pa-btn-danger-text);
5653
5655
  }
5654
5656
  .pa-card--danger .pa-card__header h1,
@@ -5695,6 +5697,7 @@ body:not(.sidebar-hidden) .pa-layout__sidebar--icon-collapse .pa-sidebar__icon {
5695
5697
  }
5696
5698
  .pa-card--color-1 .pa-card__header {
5697
5699
  background-color: var(--pa-color-1);
5700
+ border-bottom-color: var(--pa-color-1);
5698
5701
  color: var(--pa-color-1-text);
5699
5702
  }
5700
5703
  .pa-card--color-1 .pa-card__header h1,
@@ -5710,6 +5713,7 @@ body:not(.sidebar-hidden) .pa-layout__sidebar--icon-collapse .pa-sidebar__icon {
5710
5713
  }
5711
5714
  .pa-card--color-2 .pa-card__header {
5712
5715
  background-color: var(--pa-color-2);
5716
+ border-bottom-color: var(--pa-color-2);
5713
5717
  color: var(--pa-color-2-text);
5714
5718
  }
5715
5719
  .pa-card--color-2 .pa-card__header h1,
@@ -5725,6 +5729,7 @@ body:not(.sidebar-hidden) .pa-layout__sidebar--icon-collapse .pa-sidebar__icon {
5725
5729
  }
5726
5730
  .pa-card--color-3 .pa-card__header {
5727
5731
  background-color: var(--pa-color-3);
5732
+ border-bottom-color: var(--pa-color-3);
5728
5733
  color: var(--pa-color-3-text);
5729
5734
  }
5730
5735
  .pa-card--color-3 .pa-card__header h1,
@@ -5740,6 +5745,7 @@ body:not(.sidebar-hidden) .pa-layout__sidebar--icon-collapse .pa-sidebar__icon {
5740
5745
  }
5741
5746
  .pa-card--color-4 .pa-card__header {
5742
5747
  background-color: var(--pa-color-4);
5748
+ border-bottom-color: var(--pa-color-4);
5743
5749
  color: var(--pa-color-4-text);
5744
5750
  }
5745
5751
  .pa-card--color-4 .pa-card__header h1,
@@ -5755,6 +5761,7 @@ body:not(.sidebar-hidden) .pa-layout__sidebar--icon-collapse .pa-sidebar__icon {
5755
5761
  }
5756
5762
  .pa-card--color-5 .pa-card__header {
5757
5763
  background-color: var(--pa-color-5);
5764
+ border-bottom-color: var(--pa-color-5);
5758
5765
  color: var(--pa-color-5-text);
5759
5766
  }
5760
5767
  .pa-card--color-5 .pa-card__header h1,
@@ -5770,6 +5777,7 @@ body:not(.sidebar-hidden) .pa-layout__sidebar--icon-collapse .pa-sidebar__icon {
5770
5777
  }
5771
5778
  .pa-card--color-6 .pa-card__header {
5772
5779
  background-color: var(--pa-color-6);
5780
+ border-bottom-color: var(--pa-color-6);
5773
5781
  color: var(--pa-color-6-text);
5774
5782
  }
5775
5783
  .pa-card--color-6 .pa-card__header h1,
@@ -5785,6 +5793,7 @@ body:not(.sidebar-hidden) .pa-layout__sidebar--icon-collapse .pa-sidebar__icon {
5785
5793
  }
5786
5794
  .pa-card--color-7 .pa-card__header {
5787
5795
  background-color: var(--pa-color-7);
5796
+ border-bottom-color: var(--pa-color-7);
5788
5797
  color: var(--pa-color-7-text);
5789
5798
  }
5790
5799
  .pa-card--color-7 .pa-card__header h1,
@@ -5800,6 +5809,7 @@ body:not(.sidebar-hidden) .pa-layout__sidebar--icon-collapse .pa-sidebar__icon {
5800
5809
  }
5801
5810
  .pa-card--color-8 .pa-card__header {
5802
5811
  background-color: var(--pa-color-8);
5812
+ border-bottom-color: var(--pa-color-8);
5803
5813
  color: var(--pa-color-8-text);
5804
5814
  }
5805
5815
  .pa-card--color-8 .pa-card__header h1,
@@ -5815,6 +5825,7 @@ body:not(.sidebar-hidden) .pa-layout__sidebar--icon-collapse .pa-sidebar__icon {
5815
5825
  }
5816
5826
  .pa-card--color-9 .pa-card__header {
5817
5827
  background-color: var(--pa-color-9);
5828
+ border-bottom-color: var(--pa-color-9);
5818
5829
  color: var(--pa-color-9-text);
5819
5830
  }
5820
5831
  .pa-card--color-9 .pa-card__header h1,
@@ -12264,18 +12275,6 @@ code {
12264
12275
  text-overflow: ellipsis;
12265
12276
  white-space: nowrap;
12266
12277
  }
12267
- .pa-profile-panel__role {
12268
- display: inline-block;
12269
- padding: 0.8rem 1.2rem;
12270
- background-color: var(--pa-accent-light);
12271
- background-color: color-mix(in srgb, var(--pa-header-profile-name-color) 15%, transparent);
12272
- color: var(--pa-header-profile-name-color);
12273
- font-size: 1.2rem;
12274
- font-weight: 500;
12275
- border-radius: var(--pa-border-radius);
12276
- text-transform: uppercase;
12277
- letter-spacing: 0.5px;
12278
- }
12279
12278
  .pa-profile-panel__close {
12280
12279
  position: absolute;
12281
12280
  top: 1.6rem;
@@ -16823,25 +16822,31 @@ code {
16823
16822
  /* ========================================
16824
16823
  KPI · Terminal grid
16825
16824
  Bloomberg-style dense panel: mono numbers, status pills, inline SVG
16826
- sparklines, ▲▼ deltas, segmented view-mode toggle (VALUE/Δ%/TREND).
16825
+ sparklines, ▲▼ deltas, optional segmented tab strip for swapping
16826
+ the body content (different tile sets / grids per tab).
16827
16827
  Shared chrome (header, live, footer, detail popover, spark-dot) is in
16828
16828
  _kpi-base.scss.
16829
16829
  ======================================== */
16830
- /* ----- View-mode toggle (segmented button group) ------------------------ */
16830
+ /* ----- Tab strip (segmented button group) ------------------------------
16831
+ Generalised tabs — each `.pa-kpi-terminal__tab` carries a `data-tab`
16832
+ slug that matches a `.pa-kpi-terminal__pane[data-tab="…"]` in the body.
16833
+ JS toggles `.is-active` on the clicked tab + matching pane; tabs and
16834
+ panes are otherwise independent so each pane can hold a completely
16835
+ different grid (different tile count, different grid modifier). */
16831
16836
  .pa-kpi-terminal__controls {
16832
16837
  display: inline-flex;
16833
16838
  align-items: center;
16834
16839
  gap: 1.6rem;
16835
16840
  }
16836
16841
 
16837
- .pa-kpi-terminal__viewtoggle {
16842
+ .pa-kpi-terminal__tabs {
16838
16843
  display: inline-flex;
16839
16844
  border: 1px solid var(--pa-border-color);
16840
16845
  border-radius: 0.4rem;
16841
16846
  overflow: hidden;
16842
16847
  }
16843
16848
 
16844
- .pa-kpi-terminal__viewbtn {
16849
+ .pa-kpi-terminal__tab {
16845
16850
  background: transparent;
16846
16851
  border: 0;
16847
16852
  color: var(--pa-text-color-2);
@@ -16853,14 +16858,22 @@ code {
16853
16858
  cursor: pointer;
16854
16859
  transition: background-color 0.1s ease-out, color 0.1s ease-out;
16855
16860
  }
16856
- .pa-kpi-terminal__viewbtn:hover {
16861
+ .pa-kpi-terminal__tab:hover {
16857
16862
  color: var(--pa-text-color-1);
16858
16863
  }
16859
- .pa-kpi-terminal__viewbtn.is-active {
16864
+ .pa-kpi-terminal__tab.is-active {
16860
16865
  background: var(--pa-text-color-1);
16861
16866
  color: var(--pa-card-bg);
16862
16867
  }
16863
16868
 
16869
+ /* ----- Pane visibility ------------------------------------------------- */
16870
+ .pa-kpi-terminal__pane {
16871
+ display: none;
16872
+ }
16873
+ .pa-kpi-terminal__pane.is-active {
16874
+ display: block;
16875
+ }
16876
+
16864
16877
  /* ----- Grid + tile borders ----------------------------------------------
16865
16878
  Hairline 1px borders between tiles, no gap. Last-row/last-column
16866
16879
  borders suppressed via :nth-last-child / :nth-child selectors. */
@@ -16956,17 +16969,16 @@ code {
16956
16969
  margin-bottom: 0.8rem;
16957
16970
  }
16958
16971
 
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. */
16972
+ /* ----- Big value -------------------------------------------------------
16973
+ One value per tile sentiment colour set via `--very-positive` /
16974
+ `--positive` / `--neutral` / `--negative` / `--very-negative` modifier
16975
+ on the value element. */
16964
16976
  .pa-kpi-tile__values {
16965
16977
  margin-bottom: 0.4rem;
16966
16978
  }
16967
16979
 
16968
16980
  .pa-kpi-tile__value {
16969
- display: none;
16981
+ display: inline-flex;
16970
16982
  align-items: baseline;
16971
16983
  gap: 0.3rem;
16972
16984
  font-family: var(--base-font-family-mono);
@@ -16988,12 +17000,6 @@ code {
16988
17000
  color: var(--pa-very-negative);
16989
17001
  }
16990
17002
 
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
17003
  .pa-kpi-tile__num {
16998
17004
  font-size: 3.8rem;
16999
17005
  font-weight: 700;
@@ -17078,7 +17084,16 @@ code {
17078
17084
  scanning rather than per-tile depth — no view-mode toggle, no status
17079
17085
  pills. Container queries collapse 4-col → 2-row → 3-row as the card
17080
17086
  narrows.
17087
+
17088
+ Row template uses local SCSS variables for the four column widths
17089
+ (`$spark-col-label`, `$spark-col-chart`, `$spark-col-value`,
17090
+ `$spark-col-delta`) so all responsive overrides reference the same
17091
+ widths — change one and every breakpoint follows. The `--no-delta`
17092
+ modifier drops the rightmost column; the other three are load-bearing
17093
+ (a sparkline list without label, chart, or value is a different
17094
+ design).
17081
17095
  ======================================== */
17096
+ /* Per-column track widths — referenced from every template selector. */
17082
17097
  /* Card is a query container so rows react to *card* width, not viewport. */
17083
17098
  .pa-kpi-spark-list {
17084
17099
  container-type: inline-size;
@@ -17101,6 +17116,18 @@ code {
17101
17116
  border-bottom: 0;
17102
17117
  }
17103
17118
 
17119
+ /* Modifier: --no-delta — drops the rightmost column. label · chart ·
17120
+ value only. Useful when the chart's slope already conveys direction
17121
+ and the delta would be redundant. Hides the delta element and shrinks
17122
+ the row template to 3 columns. */
17123
+ .pa-kpi-spark-list--no-delta .pa-kpi-spark-row {
17124
+ grid-template-columns: minmax(14rem, 28%) minmax(10rem, 1fr) minmax(8rem, 18%);
17125
+ }
17126
+
17127
+ .pa-kpi-spark-list--no-delta .pa-kpi-spark-row__delta {
17128
+ display: none;
17129
+ }
17130
+
17104
17131
  /* Mid-narrow card (1×3 page-grid + 45% column): stack to 2 rows.
17105
17132
  Label/value/delta on top, full-width chart below. Default order is
17106
17133
  value-above-chart; use .pa-kpi-spark-list--chart-first to flip. */
@@ -17152,6 +17179,16 @@ code {
17152
17179
  .pa-kpi-spark-list--chart-first .pa-kpi-spark-row__delta {
17153
17180
  align-self: baseline;
17154
17181
  }
17182
+ /* --no-delta at mid-narrow: 2-row layout, top row is label+value only. */
17183
+ .pa-kpi-spark-list--no-delta .pa-kpi-spark-row {
17184
+ grid-template-columns: minmax(0, 1fr) auto;
17185
+ grid-template-areas: "label value" "chart chart";
17186
+ }
17187
+ /* --no-delta + --chart-first: 3-row single-column stack. */
17188
+ .pa-kpi-spark-list--no-delta.pa-kpi-spark-list--chart-first .pa-kpi-spark-row {
17189
+ grid-template-columns: 1fr;
17190
+ grid-template-areas: "label" "chart" "value";
17191
+ }
17155
17192
  }
17156
17193
  /* Very narrow card (~280–360px, 25% page-grid stress test): force the
17157
17194
  chart-first 3-row layout regardless of modifier. */
@@ -17180,6 +17217,11 @@ code {
17180
17217
  grid-area: delta;
17181
17218
  align-self: baseline;
17182
17219
  }
17220
+ /* --no-delta at very-narrow: 3-row single-column stack (no delta cell). */
17221
+ .pa-kpi-spark-list--no-delta .pa-kpi-spark-row {
17222
+ grid-template-columns: 1fr;
17223
+ grid-template-areas: "label" "chart" "value";
17224
+ }
17183
17225
  }
17184
17226
  /* ----- Cell typography -------------------------------------------------- */
17185
17227
  .pa-kpi-spark-row__label {
@@ -17284,43 +17326,86 @@ code {
17284
17326
  Goal-oriented progress bars. Each KPI shows label · value, a bar with a
17285
17327
  target tick, and a 0 · tgt scale below. Bar fill = value/target * 100%,
17286
17328
  capped visually so overshoots are signalled by colour, not overflow.
17287
- ======================================== */
17288
- .pa-kpi-gauge-list {
17289
- container-type: inline-size;
17290
- }
17291
17329
 
17330
+ Layout is a cell-min-driven `auto-fit` grid — cells stay at least
17331
+ `--pa-kpi-gauge-cell-min` wide, the grid fits as many columns as the
17332
+ container allows, and the responsive cascade is intrinsic to the grid
17333
+ template (no `@container` queries). `--max-N` cap modifiers cap the
17334
+ column count at N while still collapsing below the cell-min × N
17335
+ threshold. Same pattern as `_kpi-editorial-minimal.scss`.
17336
+ ======================================== */
17292
17337
  .pa-kpi-gauge-list__body {
17293
17338
  padding: 0;
17294
17339
  }
17295
17340
 
17296
- /* 2-column internal grid by default; collapses to 1-col when card narrows. */
17341
+ /* ----- Grid + hairline rules -------------------------------------------
17342
+ Cell-min-driven responsive layout. Override `--pa-kpi-gauge-cell-min`
17343
+ per instance to change density (smaller min → more columns at the same
17344
+ container width).
17345
+
17346
+ `gap: 1px` over `background: var(--pa-border-color)` with each tile
17347
+ painting `background: var(--pa-card-bg)` on top — only the gap shows
17348
+ through, giving single-pixel hairlines on every interior boundary
17349
+ regardless of column count. The card's outer border supplies the
17350
+ perimeter. Replaces the previous per-tile `border-right` +
17351
+ `border-bottom` + nth-child suppression machinery, which only worked
17352
+ for the hardcoded 2-col layout. */
17297
17353
  .pa-kpi-gauge-list__grid {
17298
17354
  display: grid;
17355
+ grid-template-columns: repeat(auto-fit, minmax(var(--pa-kpi-gauge-cell-min, 20rem), 1fr));
17356
+ gap: 1px;
17357
+ background: var(--pa-border-color);
17358
+ }
17359
+
17360
+ /* Modifier: force exactly 2 columns regardless of cell-min or container
17361
+ width. For placements wanting a deterministic 2×N layout. */
17362
+ .pa-kpi-gauge-list__grid--2col {
17299
17363
  grid-template-columns: repeat(2, 1fr);
17300
17364
  }
17301
17365
 
17302
- @container (max-width: 600px) {
17303
- .pa-kpi-gauge-list__grid {
17304
- grid-template-columns: 1fr;
17305
- }
17366
+ /* Cap-at-N modifiers: combine auto-fit with a ceiling on the column
17367
+ count. Cells stay at least --pa-kpi-gauge-cell-min wide, but the grid
17368
+ never exceeds N columns even when the container is wide enough to fit
17369
+ more. Below the cell-min × N threshold the grid still collapses
17370
+ responsively — these modifiers cap the maximum, not the minimum.
17371
+
17372
+ How the calc reads: each track's effective min is
17373
+ max(cell-min, (container − total-gap) / N)
17374
+ On a wide container the calc wins (so tracks grow, you stay at N).
17375
+ On a narrow container cell-min wins (so the grid collapses).
17376
+
17377
+ Pick the cap so your item count divides into clean rows. */
17378
+ .pa-kpi-gauge-list__grid--max-2 {
17379
+ grid-template-columns: repeat(auto-fit, minmax(max(var(--pa-kpi-gauge-cell-min, 20rem), (100% - 1px) / 2), 1fr));
17380
+ }
17381
+
17382
+ .pa-kpi-gauge-list__grid--max-3 {
17383
+ grid-template-columns: repeat(auto-fit, minmax(max(var(--pa-kpi-gauge-cell-min, 20rem), (100% - 2px) / 3), 1fr));
17306
17384
  }
17385
+
17386
+ .pa-kpi-gauge-list__grid--max-4 {
17387
+ grid-template-columns: repeat(auto-fit, minmax(max(var(--pa-kpi-gauge-cell-min, 20rem), (100% - 3px) / 4), 1fr));
17388
+ }
17389
+
17390
+ .pa-kpi-gauge-list__grid--max-5 {
17391
+ grid-template-columns: repeat(auto-fit, minmax(max(var(--pa-kpi-gauge-cell-min, 20rem), (100% - 4px) / 5), 1fr));
17392
+ }
17393
+
17394
+ .pa-kpi-gauge-list__grid--max-6 {
17395
+ grid-template-columns: repeat(auto-fit, minmax(max(var(--pa-kpi-gauge-cell-min, 20rem), (100% - 5px) / 6), 1fr));
17396
+ }
17397
+
17307
17398
  /* ----- Gauge tile (label/value head · bar · 0/tgt scale) ---------------- */
17308
17399
  .pa-kpi-gauge {
17309
17400
  position: relative;
17401
+ background: var(--pa-card-bg);
17310
17402
  padding: 1.6rem 2rem;
17311
- border-bottom: 1px solid var(--pa-border-color);
17312
- border-right: 1px solid var(--pa-border-color);
17403
+ min-width: 0;
17313
17404
  /* Per-tile bar colour cascade — modifiers below set the var, the fill
17314
17405
  reads it. Cleaner than per-modifier-per-element rules; host apps can
17315
17406
  override at the tile level via inline style="--pa-kpi-bar-color: …". */
17316
17407
  --pa-kpi-bar-color: var(--pa-positive);
17317
17408
  }
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
17409
  .pa-kpi-gauge--positive {
17325
17410
  --pa-kpi-bar-color: var(--pa-positive);
17326
17411
  }
@@ -17334,17 +17419,6 @@ code {
17334
17419
  --pa-kpi-bar-color: color-mix(in srgb, var(--pa-text-color-1) 70%, transparent);
17335
17420
  }
17336
17421
 
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
17422
  /* ----- Head: label left, value right (baseline-aligned) ----------------- */
17349
17423
  .pa-kpi-gauge__head {
17350
17424
  display: flex;
@@ -17442,13 +17516,29 @@ code {
17442
17516
  padding: 1.6rem;
17443
17517
  }
17444
17518
 
17445
- /* ----- Layout: hero left, rail right ------------------------------------ */
17519
+ /* ----- Layout: hero left, rail right ------------------------------------
17520
+ Default split is 1:1 (50% hero / 50% rail). Modifiers below shift the
17521
+ weight to the hero, which is the more common "executive dashboard"
17522
+ shape — one big headline, supporting tiles compressed into a narrower
17523
+ rail. Pick a modifier per instance; the markup stays unchanged. */
17446
17524
  .pa-kpi-hero-list__layout {
17447
17525
  display: grid;
17448
17526
  grid-template-columns: 1fr 1fr;
17449
17527
  gap: 1.4rem;
17450
17528
  }
17451
17529
 
17530
+ /* Hero 2/3, rail 1/3. */
17531
+ .pa-kpi-hero-list__layout--hero-2-3 {
17532
+ grid-template-columns: 2fr 1fr;
17533
+ }
17534
+
17535
+ /* Hero 3/4, rail 1/4 — hero-dominant; rail is a thin sidebar. */
17536
+ .pa-kpi-hero-list__layout--hero-3-4 {
17537
+ grid-template-columns: 3fr 1fr;
17538
+ }
17539
+
17540
+ /* Narrow card → stack to single column. Overrides any --hero-N-M modifier
17541
+ that lives on the same element. */
17452
17542
  @container (max-width: 700px) {
17453
17543
  .pa-kpi-hero-list__layout {
17454
17544
  grid-template-columns: 1fr;
@@ -17660,23 +17750,33 @@ code {
17660
17750
  /* ========================================
17661
17751
  KPI · Bento layout
17662
17752
  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
17753
+ fills behind the values. Default 6-tile layout on a 6-col × 3-row grid
17664
17754
  (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.
17755
+ tiles bottom row). Tile placement is by source order via :nth-child, so
17756
+ markup stays identical across layout modifiers.
17757
+
17758
+ Layout modifiers (below) swap `grid-template-areas` to provide
17759
+ alternative compositions:
17760
+ · default (no modifier) — 6 tiles, hero on the left
17761
+ · `--hero-right` — 6 tiles, mirror of default (hero on right)
17762
+ · `--5-tile` — 5 tiles, hero + 4 supporting
17763
+ Row height is a CSS variable (`--pa-kpi-bento-row-height`, default
17764
+ `12rem`) so authors can dial tile height per instance.
17666
17765
  ======================================== */
17667
17766
  .pa-kpi-bento {
17668
17767
  container-type: inline-size;
17768
+ --pa-kpi-bento-row-height: 12rem;
17669
17769
  }
17670
17770
 
17671
17771
  .pa-kpi-bento__body {
17672
17772
  padding: 1.6rem;
17673
17773
  }
17674
17774
 
17675
- /* ----- Bento grid ------------------------------------------------------- */
17775
+ /* ----- Bento grid (default: 6 tiles, hero on left) ---------------------- */
17676
17776
  .pa-kpi-bento__grid {
17677
17777
  display: grid;
17678
17778
  grid-template-columns: repeat(6, 1fr);
17679
- grid-template-rows: 12rem 12rem 12rem;
17779
+ grid-template-rows: repeat(3, var(--pa-kpi-bento-row-height));
17680
17780
  grid-template-areas: "hero hero hero a a a" "hero hero hero b b b" "c c d d e e";
17681
17781
  gap: 1rem;
17682
17782
  }
@@ -17699,8 +17799,27 @@ code {
17699
17799
  grid-area: e;
17700
17800
  }
17701
17801
 
17702
- /* Narrow card stack everything single column. Hero modifier still
17703
- bumps the value font-size so it reads as the headline. */
17802
+ /* Modifier: --hero-right mirror of default. Hero on the right half,
17803
+ two stacked tiles on the left of rows 1-2, three equal tiles below.
17804
+ Same 6-tile contract as default; only the template flips. Source
17805
+ order stays unchanged (1st = hero, 2nd = a, …). */
17806
+ .pa-kpi-bento__grid--hero-right {
17807
+ grid-template-areas: "a a a hero hero hero" "b b b hero hero hero" "c c d d e e";
17808
+ }
17809
+
17810
+ /* Modifier: --5-tile — hero + 4 supporting. Hero spans the left half ×
17811
+ 2 rows, two stacked tiles on the right (rows 1-2), two equal halves on
17812
+ the bottom row. Requires exactly 5 tiles — a 6th tile (if present)
17813
+ would be auto-placed in a new row and break the layout. */
17814
+ .pa-kpi-bento__grid--5-tile {
17815
+ grid-template-areas: "hero hero hero a a a" "hero hero hero b b b" "c c c d d d";
17816
+ }
17817
+
17818
+ /* Narrow card → stack everything single column. Resets `grid-area: auto`
17819
+ on every tile so the same markup works regardless of which layout
17820
+ modifier the grid carries (the @container override sets
17821
+ `grid-template-areas: none` and the `grid-area: auto` on nth-child
17822
+ together neutralise any modifier's template). */
17704
17823
  @container (max-width: 700px) {
17705
17824
  .pa-kpi-bento__grid {
17706
17825
  grid-template-columns: 1fr;
@@ -17867,12 +17986,20 @@ code {
17867
17986
 
17868
17987
  /* ========================================
17869
17988
  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
17989
+ Tabular "spreadsheet-style" table card with metric / now / prev / Δ% /
17990
+ target columns — most data per pixel, no chart chrome. Each row is its
17991
+ own grid sharing the same column template so cells align across rows
17873
17992
  without needing subgrid. Wide-only by design — no responsive collapse;
17874
17993
  narrow placements should use Comparison gauges instead.
17994
+
17995
+ Column contract: `metric` + `now` are always present; `prev`, `delta`,
17996
+ and `target` are independently optional via toggle modifiers on the
17997
+ strip (`--no-prev`, `--no-delta`, `--no-target`). Modifiers compose, so
17998
+ the visible column count ranges from 2 (all three optional columns
17999
+ dropped) to 5 (none dropped). Each combination has its own template
18000
+ selector below so the grid tracks always match the visible cell count.
17875
18001
  ======================================== */
18002
+ /* Per-column track widths — referenced from every template selector. */
17876
18003
  .pa-kpi-strip__body {
17877
18004
  padding: 0;
17878
18005
  }
@@ -17881,7 +18008,7 @@ code {
17881
18008
  .pa-kpi-strip__row,
17882
18009
  .pa-kpi-strip__head-row {
17883
18010
  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) */
18011
+ grid-template-columns: minmax(0, 2fr) minmax(0, 1.1fr) minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1.6fr);
17885
18012
  column-gap: 1.6rem;
17886
18013
  align-items: center;
17887
18014
  position: relative;
@@ -18018,16 +18145,76 @@ code {
18018
18145
  line-height: 1;
18019
18146
  }
18020
18147
 
18021
- /* ----- --no-prev: 4-col layout (metric / now / Δ% / target) -------------
18022
- Useful for narrow placements; markup omits the prev cells. */
18148
+ /* ----- Toggle modifiers ------------------------------------------------
18149
+ `--no-prev`, `--no-delta`, `--no-target` are independently composable.
18150
+ Each hides its column's cells (data + header) and the matching template
18151
+ selector below adjusts `grid-template-columns` to the visible cell
18152
+ count, so source order (metric, now, prev, delta, target) is preserved
18153
+ and the remaining cells slot into the right tracks.
18154
+
18155
+ `metric` and `now` are mandatory — no toggle drops them. If a strip
18156
+ doesn't need a focal value, it's a different design (use comparison
18157
+ gauges or editorial-minimal). */
18158
+ .pa-kpi-strip--no-prev .pa-kpi-strip__prev,
18159
+ .pa-kpi-strip--no-prev .pa-kpi-strip__head--prev {
18160
+ display: none;
18161
+ }
18162
+
18163
+ .pa-kpi-strip--no-delta .pa-kpi-strip__delta,
18164
+ .pa-kpi-strip--no-delta .pa-kpi-strip__head--delta {
18165
+ display: none;
18166
+ }
18167
+
18168
+ .pa-kpi-strip--no-target .pa-kpi-strip__target,
18169
+ .pa-kpi-strip--no-target .pa-kpi-strip__head--target {
18170
+ display: none;
18171
+ }
18172
+
18173
+ /* ----- Grid templates per visible-column combination -------------------
18174
+ 8 combos (1 default + 3 single-drops + 3 double-drops + 1 triple-drop).
18175
+ Each lists the visible columns in source order with their declared
18176
+ `$strip-col-*` width. */
18177
+ /* 4-col: one optional column dropped */
18023
18178
  .pa-kpi-strip--no-prev .pa-kpi-strip__row,
18024
18179
  .pa-kpi-strip--no-prev .pa-kpi-strip__head-row {
18025
18180
  grid-template-columns: minmax(0, 2fr) minmax(0, 1.1fr) minmax(0, 1fr) minmax(0, 1.6fr);
18026
18181
  }
18027
18182
 
18183
+ .pa-kpi-strip--no-delta .pa-kpi-strip__row,
18184
+ .pa-kpi-strip--no-delta .pa-kpi-strip__head-row {
18185
+ grid-template-columns: minmax(0, 2fr) minmax(0, 1.1fr) minmax(0, 1fr) minmax(0, 1.6fr);
18186
+ }
18187
+
18188
+ .pa-kpi-strip--no-target .pa-kpi-strip__row,
18189
+ .pa-kpi-strip--no-target .pa-kpi-strip__head-row {
18190
+ grid-template-columns: minmax(0, 2fr) minmax(0, 1.1fr) minmax(0, 1fr) minmax(0, 1fr);
18191
+ }
18192
+
18193
+ /* 3-col: two optional columns dropped */
18194
+ .pa-kpi-strip--no-prev.pa-kpi-strip--no-delta .pa-kpi-strip__row,
18195
+ .pa-kpi-strip--no-prev.pa-kpi-strip--no-delta .pa-kpi-strip__head-row {
18196
+ grid-template-columns: minmax(0, 2fr) minmax(0, 1.1fr) minmax(0, 1.6fr);
18197
+ }
18198
+
18199
+ .pa-kpi-strip--no-prev.pa-kpi-strip--no-target .pa-kpi-strip__row,
18200
+ .pa-kpi-strip--no-prev.pa-kpi-strip--no-target .pa-kpi-strip__head-row {
18201
+ grid-template-columns: minmax(0, 2fr) minmax(0, 1.1fr) minmax(0, 1fr);
18202
+ }
18203
+
18204
+ .pa-kpi-strip--no-delta.pa-kpi-strip--no-target .pa-kpi-strip__row,
18205
+ .pa-kpi-strip--no-delta.pa-kpi-strip--no-target .pa-kpi-strip__head-row {
18206
+ grid-template-columns: minmax(0, 2fr) minmax(0, 1.1fr) minmax(0, 1fr);
18207
+ }
18208
+
18209
+ /* 2-col: all three optional columns dropped (metric + now only) */
18210
+ .pa-kpi-strip--no-prev.pa-kpi-strip--no-delta.pa-kpi-strip--no-target .pa-kpi-strip__row,
18211
+ .pa-kpi-strip--no-prev.pa-kpi-strip--no-delta.pa-kpi-strip--no-target .pa-kpi-strip__head-row {
18212
+ grid-template-columns: minmax(0, 2fr) minmax(0, 1.1fr);
18213
+ }
18214
+
18028
18215
  /* ========================================
18029
18216
  KPI · Editorial minimal
18030
- Six KPIs in a 2×3 / 3×2 grid with hairline rules between cells,
18217
+ KPI tiles in a responsive grid with hairline rules between cells,
18031
18218
  generous space, and an extra-light-weight number as the focal point per
18032
18219
  tile. No charts, no pills — the design's whole identity is the thin
18033
18220
  numeral. Renders as a table card (zero card-body padding) so hairlines
@@ -18038,38 +18225,74 @@ code {
18038
18225
  }
18039
18226
 
18040
18227
  /* ----- Grid + hairline rules -------------------------------------------
18228
+ Cell-min-driven responsive layout: cells stay at least
18229
+ --pa-kpi-edit-cell-min wide; the grid fits as many columns as the
18230
+ container allows. No @container queries — `auto-fit + minmax` handles
18231
+ the cascade intrinsically. Override the min per instance to change
18232
+ density (smaller min → more columns at the same container width).
18233
+
18041
18234
  `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. */
18235
+ painting `background: var(--pa-card-bg)` on top only the gap shows
18236
+ through, giving single-pixel hairlines on every interior boundary
18237
+ regardless of column count. The card's outer border supplies the
18238
+ perimeter. */
18046
18239
  .pa-kpi-edit__grid {
18047
18240
  display: grid;
18048
- grid-template-columns: repeat(3, 1fr);
18241
+ grid-template-columns: repeat(auto-fit, minmax(var(--pa-kpi-edit-cell-min, 14rem), 1fr));
18049
18242
  gap: 1px;
18050
18243
  background: var(--pa-border-color);
18051
- container-type: inline-size;
18052
18244
  }
18053
18245
 
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. */
18246
+ /* Modifier: force exactly 2 columns regardless of cell-min or container
18247
+ width. For placements wanting a deterministic 2×N layout (e.g. 4 tiles
18248
+ as a clean 2×2 even when the container is wide enough for more). */
18067
18249
  .pa-kpi-edit__grid--2col {
18068
18250
  grid-template-columns: repeat(2, 1fr);
18069
18251
  }
18070
18252
 
18071
- /* ----- Tile (editorial spacing leans on the 2.4rem padding) ------------- */
18253
+ /* Cap-at-N modifiers: combine auto-fit with a ceiling on the column
18254
+ count. Cells stay at least --pa-kpi-edit-cell-min wide, but the grid
18255
+ never exceeds N columns even when the container is wide enough to fit
18256
+ more. Below the cell-min × N threshold the grid still collapses
18257
+ responsively — these modifiers cap the maximum, not the minimum.
18258
+
18259
+ How the calc reads: each track's effective min is
18260
+ max(cell-min, (container − total-gap) / N)
18261
+ On a wide container the calc wins (so tracks grow, you stay at N).
18262
+ On a narrow container cell-min wins (so the grid collapses).
18263
+
18264
+ Why this matters for the gray-void edge case: `auto-fit` keeps as many
18265
+ tracks as fit the container, then only collapses tracks empty across
18266
+ the *whole* grid. With 6 items at 4-col auto-fit, tracks 1–4 all have
18267
+ row-1 items, so row 2's tracks 3–4 stay (and show the gap background).
18268
+ Capping at 3 makes 6 items pack 3×2 cleanly. Pick the cap so your item
18269
+ count divides into clean rows. */
18270
+ .pa-kpi-edit__grid--max-2 {
18271
+ grid-template-columns: repeat(auto-fit, minmax(max(var(--pa-kpi-edit-cell-min, 14rem), (100% - 1px) / 2), 1fr));
18272
+ }
18273
+
18274
+ .pa-kpi-edit__grid--max-3 {
18275
+ grid-template-columns: repeat(auto-fit, minmax(max(var(--pa-kpi-edit-cell-min, 14rem), (100% - 2px) / 3), 1fr));
18276
+ }
18277
+
18278
+ .pa-kpi-edit__grid--max-4 {
18279
+ grid-template-columns: repeat(auto-fit, minmax(max(var(--pa-kpi-edit-cell-min, 14rem), (100% - 3px) / 4), 1fr));
18280
+ }
18281
+
18282
+ .pa-kpi-edit__grid--max-5 {
18283
+ grid-template-columns: repeat(auto-fit, minmax(max(var(--pa-kpi-edit-cell-min, 14rem), (100% - 4px) / 5), 1fr));
18284
+ }
18285
+
18286
+ .pa-kpi-edit__grid--max-6 {
18287
+ grid-template-columns: repeat(auto-fit, minmax(max(var(--pa-kpi-edit-cell-min, 14rem), (100% - 5px) / 6), 1fr));
18288
+ }
18289
+
18290
+ /* ----- Tile (editorial spacing leans on the 2.4rem padding) -------------
18291
+ Per-cell container: the value's `cqi`-based font-size scales with
18292
+ *this* tile's width, not the whole grid's. Keeps typography legible as
18293
+ the grid packs more cells into the same row. */
18072
18294
  .pa-kpi-edit__tile {
18295
+ container-type: inline-size;
18073
18296
  background: var(--pa-card-bg);
18074
18297
  padding: 2.4rem 2rem;
18075
18298
  display: flex;
@@ -18101,11 +18324,13 @@ code {
18101
18324
  "monospace at low contrast".
18102
18325
  - font-weight: 200 (extra-light). 300 was tested first but didn't read
18103
18326
  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. */
18327
+ - clamp() lets the number shrink in narrow cells without manual
18328
+ breakpoints. `cqi` measures per-cell (tile is a container) so the
18329
+ value tracks each cell's actual width as the grid packs more
18330
+ columns into a wider container. */
18106
18331
  .pa-kpi-edit__value {
18107
18332
  font-family: var(--base-font-family);
18108
- font-size: clamp(3.2rem, 18cqi, 5.6rem);
18333
+ font-size: clamp(3.2rem, 22cqi, 5.6rem);
18109
18334
  font-weight: 200;
18110
18335
  letter-spacing: -0.02em;
18111
18336
  line-height: 1;
@@ -19062,3 +19287,309 @@ html.pa-font-base-12 {
19062
19287
  .text-end {
19063
19288
  text-align: end;
19064
19289
  }
19290
+
19291
+ /* Pure Admin Visual Framework - Core Styles */
19292
+ :root,
19293
+ .pa-mode-light,
19294
+ .pa-mode-dark {
19295
+ --pa-text-strong: color-mix(in srgb, var(--pa-text-color-1) 85%, transparent);
19296
+ --pa-text-secondary: color-mix(in srgb, var(--pa-text-color-1) 70%, transparent);
19297
+ --pa-text-tertiary: color-mix(in srgb, var(--pa-text-color-1) 55%, transparent);
19298
+ --pa-surface-hover: color-mix(in srgb, var(--pa-text-color-1) 4%, transparent);
19299
+ --pa-surface-track: color-mix(in srgb, var(--pa-text-color-1) 12%, transparent);
19300
+ }
19301
+
19302
+ :root {
19303
+ --base-accent-color: #007bff;
19304
+ --base-accent-color-hover: rgb(51, 149.4, 255);
19305
+ --base-accent-color-active: rgb(102, 175.8, 255);
19306
+ --base-accent-color-light: rgba(0, 123, 255, 0.05);
19307
+ --base-accent-color-light-hover: rgba(0, 123, 255, 0.12);
19308
+ --base-text-color-1: #2c3e50;
19309
+ --base-text-color-2: #6c757d;
19310
+ --base-text-color-3: #7a8a99;
19311
+ --base-text-color-4: #a3b1bf;
19312
+ --base-text-color-on-accent: #ffffff;
19313
+ --base-main-bg: #ffffff;
19314
+ --base-page-bg: #f8f9fa;
19315
+ --base-subtle-bg: #e9ecef;
19316
+ --base-inverse-bg: #2c3e50;
19317
+ --base-overlay-bg: rgba(0, 0, 0, 0.5);
19318
+ --base-shadow-color: rgba(0, 0, 0, 0.15);
19319
+ --base-hover-bg: #e9ecef;
19320
+ --base-active-bg: rgb(218.2368421053, 223.25, 228.2631578947);
19321
+ --base-disabled-bg: #e9ecef;
19322
+ --base-elevated-bg: #f5f5f5;
19323
+ --base-border-color: #e1e5e9;
19324
+ --base-border: 1px solid #e1e5e9;
19325
+ --base-input-bg: #ffffff;
19326
+ --base-input-color: #495057;
19327
+ --base-input-border: 1px solid #ced4da;
19328
+ --base-input-border-hover: 1px solid #b8bfc6;
19329
+ --base-input-border-focus: 1px solid #007bff;
19330
+ --base-input-placeholder-color: #a3b1bf;
19331
+ --base-input-bg-disabled: rgba(255, 255, 255, 0.5);
19332
+ --base-input-size-xs-height: 3.1;
19333
+ --base-input-size-sm-height: 3.3;
19334
+ --base-input-size-md-height: 3.5;
19335
+ --base-input-size-lg-height: 3.8;
19336
+ --base-input-size-xl-height: 4.1;
19337
+ --base-dropdown-bg: #ffffff;
19338
+ --base-dropdown-border: 1px solid #e1e5e9;
19339
+ --base-dropdown-box-shadow: 0 8px 16px rgba(0, 0, 0, 0.15);
19340
+ --base-tooltip-bg: #2c3e50;
19341
+ --base-tooltip-text-color: #ffffff;
19342
+ --base-success-color: #22c55e;
19343
+ --base-success-color-hover: rgb(26.4935064935, 153.5064935065, 73.2467532468);
19344
+ --base-success-bg-light: rgba(34, 197, 94, 0.1);
19345
+ --base-success-bg-subtle: rgba(34, 197, 94, 0.08);
19346
+ --base-success-border: rgba(34, 197, 94, 0.2);
19347
+ --base-success-text: #155724;
19348
+ --base-success-text-light: #d4edda;
19349
+ --base-text-on-success: #ffffff;
19350
+ --base-danger-color: #ef4444;
19351
+ --base-danger-color-hover: rgb(234.9802955665, 21.0197044335, 21.0197044335);
19352
+ --base-danger-bg-light: rgba(239, 68, 68, 0.1);
19353
+ --base-danger-bg-subtle: rgba(239, 68, 68, 0.08);
19354
+ --base-danger-border: rgba(239, 68, 68, 0.2);
19355
+ --base-danger-text: #721c24;
19356
+ --base-danger-text-light: #f8d7da;
19357
+ --base-text-on-danger: #ffffff;
19358
+ --base-warning-color: #f97316;
19359
+ --base-warning-color-hover: rgb(214.4769874477, 91.129707113, 5.5230125523);
19360
+ --base-warning-bg-light: rgba(249, 115, 22, 0.1);
19361
+ --base-warning-bg-subtle: rgba(249, 115, 22, 0.08);
19362
+ --base-warning-border: rgba(249, 115, 22, 0.2);
19363
+ --base-warning-text: #856404;
19364
+ --base-warning-text-light: #fff3cd;
19365
+ --base-text-on-warning: #212529;
19366
+ --base-info-color: #17a2b8;
19367
+ --base-info-color-hover: rgb(17.3333333333, 122.0869565217, 138.6666666667);
19368
+ --base-info-bg-light: rgba(23, 162, 184, 0.1);
19369
+ --base-info-bg-subtle: rgba(23, 162, 184, 0.08);
19370
+ --base-info-border: rgba(23, 162, 184, 0.2);
19371
+ --base-info-text: #0c5460;
19372
+ --base-info-text-light: #d1ecf1;
19373
+ --base-text-on-info: #ffffff;
19374
+ --base-hover-overlay: rgba(0, 0, 0, 0.04);
19375
+ --base-active-overlay: rgba(0, 0, 0, 0.08);
19376
+ --base-focus-ring-color: #007bff;
19377
+ --base-focus-ring-width: 3px;
19378
+ --base-font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, sans-serif;
19379
+ --base-font-family-mono: SFMono-Regular, Menlo, Monaco, Consolas, Liberation Mono, Courier New, monospace;
19380
+ --base-font-size-2xs: 1;
19381
+ --base-font-size-xs: 1.2;
19382
+ --base-font-size-sm: 1.4;
19383
+ --base-font-size-base: 1.6;
19384
+ --base-font-size-lg: 1.8;
19385
+ --base-font-size-xl: 2;
19386
+ --base-font-size-2xl: 2.4;
19387
+ --base-font-weight-normal: 400;
19388
+ --base-font-weight-medium: 500;
19389
+ --base-font-weight-semibold: 600;
19390
+ --base-font-weight-bold: 700;
19391
+ --base-line-height-tight: 1.25;
19392
+ --base-line-height-normal: 1.5;
19393
+ --base-line-height-relaxed: 1.75;
19394
+ --base-border-radius-sm: 0.4;
19395
+ --base-border-radius-md: 0.6;
19396
+ --base-border-radius-lg: 0.8;
19397
+ color-scheme: light;
19398
+ --pa-main-bg: #f8f9fa;
19399
+ --pa-page-bg: #f8f9fa;
19400
+ --pa-subtle-bg: #ffffff;
19401
+ --pa-text-color-1: #2c3e50;
19402
+ --pa-text-color-2: #6c757d;
19403
+ --pa-accent: #007bff;
19404
+ --pa-accent-hover: rgba(0, 123, 255, 0.12);
19405
+ --pa-accent-light: color-mix(in srgb, var(--pa-accent) 5%, transparent);
19406
+ --pa-link-color: var(--pa-accent);
19407
+ --pa-link-color-hover: color-mix(in srgb, var(--pa-link-color), currentColor 50%);
19408
+ --pa-link-color-visited: var(--pa-link-color);
19409
+ --pa-border-color: #e1e5e9;
19410
+ --pa-success: #22c55e;
19411
+ --pa-warning: #f97316;
19412
+ --pa-danger: #ef4444;
19413
+ --pa-info: #17a2b8;
19414
+ --pa-very-positive: #16a34a;
19415
+ --pa-positive: var(--pa-success);
19416
+ --pa-neutral: #9ca3af;
19417
+ --pa-negative: var(--pa-danger);
19418
+ --pa-very-negative: #dc2626;
19419
+ --pa-chart-trendline-height: 3rem;
19420
+ --pa-chart-trendline-stroke: 2.1;
19421
+ --pa-detail-bg: rgba(15, 17, 21, 0.97);
19422
+ --pa-detail-text: #ffffff;
19423
+ --pa-detail-row-label: rgba(255, 255, 255, 0.75);
19424
+ --pa-detail-title: rgba(255, 255, 255, 0.55);
19425
+ --pa-detail-shadow: 0 1.4rem 3.6rem rgba(0, 0, 0, 0.55);
19426
+ --pa-header-bg: #ffffff;
19427
+ --pa-header-border-color: #e1e5e9;
19428
+ --pa-header-text: #2c3e50;
19429
+ --pa-header-text-secondary: #6c757d;
19430
+ --pa-header-profile-name-color: #2c3e50;
19431
+ --pa-sidebar-bg: #f8f9fa;
19432
+ --pa-sidebar-text: #2c3e50;
19433
+ --pa-sidebar-text-secondary: #6c757d;
19434
+ --pa-sidebar-submenu-bg: #e9ecef;
19435
+ --pa-sidebar-submenu-hover-bg: rgb(218.2368421053, 223.25, 228.2631578947);
19436
+ --pa-sidebar-submenu-active-bg: rgb(203.4736842105, 210.5, 217.5263157895);
19437
+ --pa-sidebar-submenu-active-text: #2c3e50;
19438
+ --pa-footer-bg: #ffffff;
19439
+ --pa-footer-border-color: #e1e5e9;
19440
+ --pa-btn-primary-bg: #007bff;
19441
+ --pa-btn-primary-bg-hover: rgb(51, 149.4, 255);
19442
+ --pa-btn-primary-bg-light: color-mix(in srgb, var(--pa-btn-primary-bg) 5%, transparent);
19443
+ --pa-btn-primary-text: #ffffff;
19444
+ --pa-btn-secondary-bg: #6c757d;
19445
+ --pa-btn-secondary-bg-hover: #545b62;
19446
+ --pa-btn-secondary-text: #ffffff;
19447
+ --pa-btn-secondary-outline-color: var(--pa-btn-secondary-bg);
19448
+ --pa-btn-success-bg: var(--pa-success);
19449
+ --pa-btn-success-bg-hover: rgb(26.4935064935, 153.5064935065, 73.2467532468);
19450
+ --pa-btn-success-text: #ffffff;
19451
+ --pa-btn-danger-bg: var(--pa-danger);
19452
+ --pa-btn-danger-bg-hover: rgb(234.9802955665, 21.0197044335, 21.0197044335);
19453
+ --pa-btn-danger-text: #ffffff;
19454
+ --pa-btn-warning-bg: var(--pa-warning);
19455
+ --pa-btn-warning-bg-hover: rgb(214.4769874477, 91.129707113, 5.5230125523);
19456
+ --pa-btn-warning-text: #212529;
19457
+ --pa-btn-info-bg: var(--pa-info);
19458
+ --pa-btn-info-bg-hover: rgb(17.3333333333, 122.0869565217, 138.6666666667);
19459
+ --pa-btn-info-text: #ffffff;
19460
+ --pa-btn-light-bg: #f8f9fa;
19461
+ --pa-btn-light-bg-hover: #e9ecef;
19462
+ --pa-btn-light-text: #2c3e50;
19463
+ --pa-btn-dark-bg: #343a40;
19464
+ --pa-btn-dark-bg-hover: #1d2124;
19465
+ --pa-btn-dark-text: #ffffff;
19466
+ --pa-success-bg: var(--pa-success);
19467
+ --pa-success-bg-hover: rgb(26.4935064935, 153.5064935065, 73.2467532468);
19468
+ --pa-success-bg-light: color-mix(in srgb, var(--pa-success) 10%, transparent);
19469
+ --pa-success-bg-subtle: color-mix(in srgb, var(--pa-success) 8%, transparent);
19470
+ --pa-success-border: color-mix(in srgb, var(--pa-success) 20%, transparent);
19471
+ --pa-success-text: #155724;
19472
+ --pa-success-text-light: #d4edda;
19473
+ --pa-danger-bg: var(--pa-danger);
19474
+ --pa-danger-bg-hover: rgb(234.9802955665, 21.0197044335, 21.0197044335);
19475
+ --pa-danger-bg-light: color-mix(in srgb, var(--pa-danger) 10%, transparent);
19476
+ --pa-danger-bg-subtle: color-mix(in srgb, var(--pa-danger) 8%, transparent);
19477
+ --pa-danger-border: color-mix(in srgb, var(--pa-danger) 20%, transparent);
19478
+ --pa-danger-text: #721c24;
19479
+ --pa-danger-text-light: #f8d7da;
19480
+ --pa-warning-bg: var(--pa-warning);
19481
+ --pa-warning-bg-hover: rgb(214.4769874477, 91.129707113, 5.5230125523);
19482
+ --pa-warning-bg-light: color-mix(in srgb, var(--pa-warning) 10%, transparent);
19483
+ --pa-warning-bg-subtle: color-mix(in srgb, var(--pa-warning) 8%, transparent);
19484
+ --pa-warning-border: color-mix(in srgb, var(--pa-warning) 20%, transparent);
19485
+ --pa-warning-text: #856404;
19486
+ --pa-warning-text-light: #fff3cd;
19487
+ --pa-info-bg: var(--pa-info);
19488
+ --pa-info-bg-hover: rgb(17.3333333333, 122.0869565217, 138.6666666667);
19489
+ --pa-info-bg-light: color-mix(in srgb, var(--pa-info) 10%, transparent);
19490
+ --pa-info-bg-subtle: color-mix(in srgb, var(--pa-info) 8%, transparent);
19491
+ --pa-info-border: color-mix(in srgb, var(--pa-info) 20%, transparent);
19492
+ --pa-info-text: #0c5460;
19493
+ --pa-info-text-light: #d1ecf1;
19494
+ --pa-card-bg: #ffffff;
19495
+ --pa-card-header-bg: #f8f9fa;
19496
+ --pa-card-footer-bg: #ffffff;
19497
+ --pa-card-tabs-bg: #f8f9fa;
19498
+ --pa-input-bg: #ffffff;
19499
+ --pa-input-border: #ced4da;
19500
+ --pa-input-text: #495057;
19501
+ --pa-input-focus-border-color: #007bff;
19502
+ --pa-select-focus-border-color: #007bff;
19503
+ --pa-textarea-focus-border-color: #007bff;
19504
+ --pa-checkbox-border-color: #e1e5e9;
19505
+ --pa-checkbox-border-color-hover: #007bff;
19506
+ --pa-checkbox-border-color-checked: #007bff;
19507
+ --pa-checkbox-bg: #ffffff;
19508
+ --pa-checkbox-bg-checked: #007bff;
19509
+ --pa-checkbox-bg-indeterminate: #007bff;
19510
+ --pa-checkbox-checkmark-color: white;
19511
+ --pa-checkbox-focus-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);
19512
+ --pa-input-group-prepend-bg: #6c757d;
19513
+ --pa-input-group-prepend-text: #6c757d;
19514
+ --pa-input-group-append-bg: #6c757d;
19515
+ --pa-input-group-append-text: #6c757d;
19516
+ --pa-table-bg: #ffffff;
19517
+ --pa-table-header-bg: #f8f9fa;
19518
+ --pa-table-stripe: #f8f9fa;
19519
+ --pa-table-hover-bg: #f8f9fa;
19520
+ --pa-table-hover-accent-color: #007bff;
19521
+ --pa-modal-overlay-bg: rgba(0, 0, 0, 0.5);
19522
+ --pa-modal-content-bg: #ffffff;
19523
+ --pa-badge-success-bg: #d4edda;
19524
+ --pa-badge-success-text: #155724;
19525
+ --pa-badge-warning-bg: #fff3cd;
19526
+ --pa-badge-warning-text: #856404;
19527
+ --pa-badge-info-bg: #d1ecf1;
19528
+ --pa-badge-info-text: #0c5460;
19529
+ --pa-badge-danger-bg: #f8d7da;
19530
+ --pa-badge-danger-text: #721c24;
19531
+ --pa-composite-badge-icon-bg: #6c757d;
19532
+ --pa-composite-badge-label-bg: #e9ecef;
19533
+ --pa-composite-badge-label-text: #2c3e50;
19534
+ --pa-composite-badge-label-hover-bg: #e9ecef;
19535
+ --pa-tooltip-bg: #2c3e50;
19536
+ --pa-tooltip-text: #ffffff;
19537
+ --pa-popover-content-bg: #ffffff;
19538
+ --pa-popover-text-light: #ffffff;
19539
+ --pa-popover-text-dark: #000000;
19540
+ --pa-loader-overlay-bg: rgba(255, 255, 255, 0.8);
19541
+ --pa-profile-overlay-bg: rgba(0, 0, 0, 0.3);
19542
+ --pa-detail-panel-overlay-bg: rgba(0, 0, 0, 0.3);
19543
+ --pa-detail-panel-selected-bg: rgba(0, 123, 255, 0.08);
19544
+ --pa-detail-panel-z-index: 4500;
19545
+ --pa-command-palette-backdrop-bg: rgba(0, 0, 0, 0.5);
19546
+ --pa-command-palette-item-hover-bg: rgba(0, 123, 255, 0.05);
19547
+ --pa-command-palette-item-active-bg: rgba(0, 123, 255, 0.1);
19548
+ --pa-command-palette-highlight-bg: rgba(0, 123, 255, 0.2);
19549
+ --pa-command-palette-highlight-text: #007bff;
19550
+ --pa-command-palette-key-bg: #ffffff;
19551
+ --pa-command-palette-key-text: #2c3e50;
19552
+ --pa-command-palette-key-font-size: 1.2rem;
19553
+ --pa-command-palette-key-font-weight: 600;
19554
+ --pa-multiselect-dropdown-bg: #ffffff;
19555
+ --pa-multiselect-dropdown-border: #e1e5e9;
19556
+ --pa-multiselect-dropdown-text: #2c3e50;
19557
+ --pa-multiselect-hint-bg: #f8f9fa;
19558
+ --pa-multiselect-hint-border: #e1e5e9;
19559
+ --pa-multiselect-option-hover-bg: #f8f9fa;
19560
+ --pa-multiselect-pill-bg: rgba(0, 123, 255, 0.05);
19561
+ --pa-multiselect-pill-border: #007bff;
19562
+ --pa-color-1: transparent;
19563
+ --pa-color-2: transparent;
19564
+ --pa-color-3: transparent;
19565
+ --pa-color-4: transparent;
19566
+ --pa-color-5: transparent;
19567
+ --pa-color-6: transparent;
19568
+ --pa-color-7: transparent;
19569
+ --pa-color-8: transparent;
19570
+ --pa-color-9: transparent;
19571
+ --pa-color-1-text: #ffffff;
19572
+ --pa-color-2-text: #ffffff;
19573
+ --pa-color-3-text: #ffffff;
19574
+ --pa-color-4-text: #ffffff;
19575
+ --pa-color-5-text: #ffffff;
19576
+ --pa-color-6-text: #ffffff;
19577
+ --pa-color-7-text: #ffffff;
19578
+ --pa-color-8-text: #ffffff;
19579
+ --pa-color-9-text: #ffffff;
19580
+ --pa-border-radius-sm: 2px;
19581
+ --pa-border-radius: 4px;
19582
+ --pa-border-radius-lg: 8px;
19583
+ --pa-alert-success-text: color-mix(in srgb, var(--pa-success-bg) 60%, black);
19584
+ --pa-alert-success-bg: color-mix(in srgb, var(--pa-success-bg) 15%, transparent);
19585
+ --pa-alert-success-border: color-mix(in srgb, var(--pa-success-bg) 30%, transparent);
19586
+ --pa-alert-danger-text: color-mix(in srgb, var(--pa-danger-bg) 60%, black);
19587
+ --pa-alert-danger-bg: color-mix(in srgb, var(--pa-danger-bg) 15%, transparent);
19588
+ --pa-alert-danger-border: color-mix(in srgb, var(--pa-danger-bg) 30%, transparent);
19589
+ --pa-alert-warning-text: color-mix(in srgb, var(--pa-warning-bg) 60%, black);
19590
+ --pa-alert-warning-bg: color-mix(in srgb, var(--pa-warning-bg) 15%, transparent);
19591
+ --pa-alert-warning-border: color-mix(in srgb, var(--pa-warning-bg) 30%, transparent);
19592
+ --pa-alert-info-text: color-mix(in srgb, var(--pa-info-bg) 60%, black);
19593
+ --pa-alert-info-bg: color-mix(in srgb, var(--pa-info-bg) 15%, transparent);
19594
+ --pa-alert-info-border: color-mix(in srgb, var(--pa-info-bg) 30%, transparent);
19595
+ }