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