@keenmate/pure-admin-core 2.7.0 → 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.
@@ -0,0 +1,171 @@
1
+ /* ========================================
2
+ KPI · Editorial minimal
3
+ KPI tiles in a responsive grid with hairline rules between cells,
4
+ generous space, and an extra-light-weight number as the focal point per
5
+ tile. No charts, no pills — the design's whole identity is the thin
6
+ numeral. Renders as a table card (zero card-body padding) so hairlines
7
+ go edge-to-edge.
8
+ ======================================== */
9
+ @use '../variables' as *;
10
+
11
+ .pa-kpi-edit__body { padding: 0; }
12
+
13
+ /* ----- Grid + hairline rules -------------------------------------------
14
+ Cell-min-driven responsive layout: cells stay at least
15
+ --pa-kpi-edit-cell-min wide; the grid fits as many columns as the
16
+ container allows. No @container queries — `auto-fit + minmax` handles
17
+ the cascade intrinsically. Override the min per instance to change
18
+ density (smaller min → more columns at the same container width).
19
+
20
+ `gap: 1px` over `background: var(--pa-border-color)` with each tile
21
+ painting `background: var(--pa-card-bg)` on top — only the gap shows
22
+ through, giving single-pixel hairlines on every interior boundary
23
+ regardless of column count. The card's outer border supplies the
24
+ perimeter. */
25
+ .pa-kpi-edit__grid {
26
+ display: grid;
27
+ grid-template-columns: repeat(auto-fit, minmax(var(--pa-kpi-edit-cell-min, 14rem), 1fr));
28
+ gap: 1px;
29
+ background: var(--pa-border-color);
30
+ }
31
+
32
+ /* Modifier: force exactly 2 columns regardless of cell-min or container
33
+ width. For placements wanting a deterministic 2×N layout (e.g. 4 tiles
34
+ as a clean 2×2 even when the container is wide enough for more). */
35
+ .pa-kpi-edit__grid--2col { grid-template-columns: repeat(2, 1fr); }
36
+
37
+ /* Cap-at-N modifiers: combine auto-fit with a ceiling on the column
38
+ count. Cells stay at least --pa-kpi-edit-cell-min wide, but the grid
39
+ never exceeds N columns even when the container is wide enough to fit
40
+ more. Below the cell-min × N threshold the grid still collapses
41
+ responsively — these modifiers cap the maximum, not the minimum.
42
+
43
+ How the calc reads: each track's effective min is
44
+ max(cell-min, (container − total-gap) / N)
45
+ On a wide container the calc wins (so tracks grow, you stay at N).
46
+ On a narrow container cell-min wins (so the grid collapses).
47
+
48
+ Why this matters for the gray-void edge case: `auto-fit` keeps as many
49
+ tracks as fit the container, then only collapses tracks empty across
50
+ the *whole* grid. With 6 items at 4-col auto-fit, tracks 1–4 all have
51
+ row-1 items, so row 2's tracks 3–4 stay (and show the gap background).
52
+ Capping at 3 makes 6 items pack 3×2 cleanly. Pick the cap so your item
53
+ count divides into clean rows. */
54
+ .pa-kpi-edit__grid--max-2 {
55
+ grid-template-columns:
56
+ repeat(auto-fit, minmax(max(var(--pa-kpi-edit-cell-min, 14rem), calc((100% - 1px) / 2)), 1fr));
57
+ }
58
+ .pa-kpi-edit__grid--max-3 {
59
+ grid-template-columns:
60
+ repeat(auto-fit, minmax(max(var(--pa-kpi-edit-cell-min, 14rem), calc((100% - 1px * 2) / 3)), 1fr));
61
+ }
62
+ .pa-kpi-edit__grid--max-4 {
63
+ grid-template-columns:
64
+ repeat(auto-fit, minmax(max(var(--pa-kpi-edit-cell-min, 14rem), calc((100% - 1px * 3) / 4)), 1fr));
65
+ }
66
+ .pa-kpi-edit__grid--max-5 {
67
+ grid-template-columns:
68
+ repeat(auto-fit, minmax(max(var(--pa-kpi-edit-cell-min, 14rem), calc((100% - 1px * 4) / 5)), 1fr));
69
+ }
70
+ .pa-kpi-edit__grid--max-6 {
71
+ grid-template-columns:
72
+ repeat(auto-fit, minmax(max(var(--pa-kpi-edit-cell-min, 14rem), calc((100% - 1px * 5) / 6)), 1fr));
73
+ }
74
+
75
+ /* ----- Tile (editorial spacing leans on the 2.4rem padding) -------------
76
+ Per-cell container: the value's `cqi`-based font-size scales with
77
+ *this* tile's width, not the whole grid's. Keeps typography legible as
78
+ the grid packs more cells into the same row. */
79
+ .pa-kpi-edit__tile {
80
+ container-type: inline-size;
81
+ background: var(--pa-card-bg);
82
+ padding: 2.4rem 2rem;
83
+ display: flex;
84
+ flex-direction: column;
85
+ gap: 1.2rem;
86
+ position: relative;
87
+ min-width: 0;
88
+
89
+ /* Hover host: faint wash so the cursor-anchored popover has a clear
90
+ "this tile" anchor. */
91
+ &:hover {
92
+ background: color-mix(in srgb, var(--pa-text-color-1) 4%, var(--pa-card-bg));
93
+ }
94
+ }
95
+
96
+ /* ----- Label (uppercase mono caption) ----------------------------------- */
97
+ .pa-kpi-edit__label {
98
+ font-family: var(--base-font-family-mono);
99
+ font-size: 1.2rem;
100
+ font-weight: 600;
101
+ letter-spacing: 0.12em;
102
+ text-transform: uppercase;
103
+ color: color-mix(in srgb, var(--pa-text-color-1) 50%, transparent);
104
+ line-height: 1.3;
105
+ }
106
+
107
+ /* ----- Value (the editorial signature) ---------------------------------
108
+ - NOT mono — mono fonts rarely have a true 200 weight; using the body
109
+ sans gives proper thin glyphs that read as "editorial" rather than
110
+ "monospace at low contrast".
111
+ - font-weight: 200 (extra-light). 300 was tested first but didn't read
112
+ distinctly enough as "light" against the body's 400 default.
113
+ - clamp() lets the number shrink in narrow cells without manual
114
+ breakpoints. `cqi` measures per-cell (tile is a container) so the
115
+ value tracks each cell's actual width as the grid packs more
116
+ columns into a wider container. */
117
+ .pa-kpi-edit__value {
118
+ font-family: var(--base-font-family);
119
+ font-size: clamp(3.2rem, 22cqi, 5.6rem);
120
+ font-weight: 200;
121
+ letter-spacing: -0.02em;
122
+ line-height: 1;
123
+ color: var(--pa-text-color-1);
124
+ display: flex;
125
+ align-items: baseline;
126
+ gap: 0.2rem;
127
+ flex-wrap: wrap;
128
+ }
129
+ .pa-kpi-edit__num {
130
+ font-weight: 200;
131
+ font-variant-numeric: tabular-nums;
132
+ }
133
+ .pa-kpi-edit__unit {
134
+ font-size: 0.4em;
135
+ font-weight: 300;
136
+ color: color-mix(in srgb, var(--pa-text-color-1) 50%, transparent);
137
+ letter-spacing: 0;
138
+ }
139
+
140
+ /* ----- Meta row (delta + tgt) ------------------------------------------ */
141
+ .pa-kpi-edit__meta {
142
+ display: flex;
143
+ align-items: baseline;
144
+ gap: 1.4rem;
145
+ font-family: var(--base-font-family-mono);
146
+ font-size: 1.3rem;
147
+ line-height: 1.3;
148
+ flex-wrap: wrap;
149
+ }
150
+ .pa-kpi-edit__delta {
151
+ font-weight: 700;
152
+ white-space: nowrap;
153
+ color: var(--pa-positive);
154
+
155
+ &--positive { color: var(--pa-positive); }
156
+ &--negative { color: var(--pa-negative); }
157
+ &--neutral { color: var(--pa-neutral); }
158
+ &--up-strong { color: var(--pa-very-positive); }
159
+ &--down-strong { color: var(--pa-very-negative); }
160
+ }
161
+ .pa-kpi-edit__target {
162
+ font-weight: 500;
163
+ color: color-mix(in srgb, var(--pa-text-color-1) 50%, transparent);
164
+ white-space: nowrap;
165
+
166
+ em {
167
+ font-style: normal;
168
+ color: color-mix(in srgb, var(--pa-text-color-1) 38%, transparent);
169
+ margin-right: 0.5rem;
170
+ }
171
+ }
@@ -0,0 +1,224 @@
1
+ /* ========================================
2
+ KPI · Hero + supporting
3
+ Marketing/exec dashboard pattern: one headline metric on the left (huge
4
+ container-query-relative value, inline meta row, big filled-area
5
+ sparkline), and a vertical rail of compact supporting tiles on the
6
+ right. Container query collapses to single column on narrow cards.
7
+ ======================================== */
8
+ @use '../variables' as *;
9
+
10
+ .pa-kpi-hero-list {
11
+ container-type: inline-size;
12
+ }
13
+ .pa-kpi-hero-list__body { padding: 1.6rem; }
14
+
15
+ /* ----- Layout: hero left, rail right ------------------------------------
16
+ Default split is 1:1 (50% hero / 50% rail). Modifiers below shift the
17
+ weight to the hero, which is the more common "executive dashboard"
18
+ shape — one big headline, supporting tiles compressed into a narrower
19
+ rail. Pick a modifier per instance; the markup stays unchanged. */
20
+ .pa-kpi-hero-list__layout {
21
+ display: grid;
22
+ grid-template-columns: 1fr 1fr;
23
+ gap: 1.4rem;
24
+ }
25
+ /* Hero 2/3, rail 1/3. */
26
+ .pa-kpi-hero-list__layout--hero-2-3 {
27
+ grid-template-columns: 2fr 1fr;
28
+ }
29
+ /* Hero 3/4, rail 1/4 — hero-dominant; rail is a thin sidebar. */
30
+ .pa-kpi-hero-list__layout--hero-3-4 {
31
+ grid-template-columns: 3fr 1fr;
32
+ }
33
+ /* Narrow card → stack to single column. Overrides any --hero-N-M modifier
34
+ that lives on the same element. */
35
+ @container (max-width: 700px) {
36
+ .pa-kpi-hero-list__layout {
37
+ grid-template-columns: 1fr;
38
+ }
39
+ }
40
+ .pa-kpi-hero-list__rail {
41
+ display: flex;
42
+ flex-direction: column;
43
+ gap: 1rem;
44
+ }
45
+
46
+ /* ----- HERO panel (label · big value · meta row · sparkline) ------------ */
47
+ .pa-kpi-hero-main {
48
+ position: relative;
49
+ padding: 1.8rem 2rem;
50
+ border: 1px solid var(--pa-border-color);
51
+ display: flex;
52
+ flex-direction: column;
53
+ gap: 0.6rem;
54
+
55
+ /* Sentiment cascade — chart and delta inherit via currentColor. */
56
+ --pa-kpi-accent: var(--pa-positive);
57
+
58
+ &--positive { --pa-kpi-accent: var(--pa-positive); }
59
+ &--negative { --pa-kpi-accent: var(--pa-negative); }
60
+ &--neutral { --pa-kpi-accent: var(--pa-neutral); }
61
+ &--up-strong { --pa-kpi-accent: var(--pa-very-positive); }
62
+ }
63
+
64
+ .pa-kpi-hero-main__label {
65
+ font-family: var(--base-font-family-mono);
66
+ font-size: 1.4rem;
67
+ font-weight: 700;
68
+ letter-spacing: 0.1em;
69
+ text-transform: uppercase;
70
+ color: color-mix(in srgb, var(--pa-text-color-1) 60%, transparent);
71
+ }
72
+
73
+ .pa-kpi-hero-main__value {
74
+ display: inline-flex;
75
+ align-items: baseline;
76
+ font-family: var(--base-font-family-mono);
77
+ line-height: 1;
78
+ margin: 0.4rem 0 0.6rem;
79
+ }
80
+ .pa-kpi-hero-main__num {
81
+ /* Container-query-relative: scales with the hero panel's width.
82
+ Floor keeps it readable in narrow page-grid cards. */
83
+ font-size: clamp(4rem, 17cqi, 7rem);
84
+ font-weight: 700;
85
+ letter-spacing: -0.02em;
86
+ color: var(--pa-text-color-1);
87
+ }
88
+ .pa-kpi-hero-main__unit {
89
+ font-size: clamp(1.8rem, 8cqi, 3rem);
90
+ font-weight: 500;
91
+ color: var(--pa-text-secondary);
92
+ margin: 0 0.1rem;
93
+ }
94
+
95
+ /* Meta row: inline delta + period text + target on one baseline. */
96
+ .pa-kpi-hero-main__meta {
97
+ display: grid;
98
+ grid-template-columns: auto minmax(0, 1fr) auto;
99
+ align-items: baseline;
100
+ gap: 0.4rem 1.4rem;
101
+ font-family: var(--base-font-family-mono);
102
+ font-size: 1.3rem;
103
+ }
104
+ .pa-kpi-hero-main__delta {
105
+ display: inline-flex;
106
+ align-items: baseline;
107
+ gap: 0.4rem;
108
+ color: var(--pa-kpi-accent);
109
+ font-weight: 700;
110
+ font-size: 1.5rem;
111
+ line-height: 1.2;
112
+ }
113
+ .pa-kpi-hero-main__period {
114
+ color: color-mix(in srgb, var(--pa-text-color-1) 60%, transparent);
115
+ line-height: 1.3;
116
+ }
117
+ .pa-kpi-hero-main__target {
118
+ color: color-mix(in srgb, var(--pa-text-color-1) 50%, transparent);
119
+ text-align: end;
120
+ }
121
+
122
+ /* Hero sparkline — chart container fills extra vertical space (when the
123
+ rail forces a tall row); SVG inside stays at fixed pixel height so the
124
+ line shape is never distorted along Y. The SVG uses
125
+ preserveAspectRatio="none", so any element that should keep its shape
126
+ needs to live outside that scaling or have fixed pixel dimensions. */
127
+ .pa-kpi-hero-main__chart {
128
+ flex: 1 1 10rem;
129
+ min-height: 10rem;
130
+ margin-top: 0.6rem;
131
+ color: var(--pa-kpi-accent);
132
+ display: flex;
133
+ align-items: flex-end; /* SVG wrap pinned to bottom */
134
+
135
+ polyline {
136
+ fill: none;
137
+ stroke: currentColor;
138
+ stroke-width: var(--pa-chart-trendline-stroke);
139
+ stroke-linecap: round;
140
+ stroke-linejoin: round;
141
+ }
142
+
143
+ polygon {
144
+ fill: currentColor;
145
+ fill-opacity: 0.18;
146
+ stroke: none;
147
+ }
148
+ }
149
+ .pa-kpi-hero-main__chart-svg {
150
+ position: relative;
151
+ display: block;
152
+ width: 100%;
153
+ height: var(--pa-chart-trendline-height);
154
+
155
+ svg {
156
+ display: block;
157
+ width: 100%;
158
+ height: 100%;
159
+ overflow: visible;
160
+ }
161
+ }
162
+
163
+ /* ----- SIDE rail tile (2×2 grid, value spans both rows on right) -------- */
164
+ .pa-kpi-hero-side {
165
+ position: relative;
166
+ padding: 1.2rem 1.4rem;
167
+ border: 1px solid var(--pa-border-color);
168
+ display: grid;
169
+ grid-template-columns: minmax(0, 1fr) auto;
170
+ grid-template-areas:
171
+ "label value"
172
+ "delta value";
173
+ column-gap: 1.2rem;
174
+ row-gap: 0.4rem;
175
+ align-items: center;
176
+
177
+ --pa-kpi-accent: var(--pa-positive);
178
+
179
+ &--positive { --pa-kpi-accent: var(--pa-positive); }
180
+ &--negative { --pa-kpi-accent: var(--pa-negative); }
181
+ &--neutral { --pa-kpi-accent: var(--pa-neutral); }
182
+ &--up-strong { --pa-kpi-accent: var(--pa-very-positive); }
183
+ }
184
+
185
+ .pa-kpi-hero-side__label {
186
+ grid-area: label;
187
+ align-self: end; /* tucks against the vertically-centred value */
188
+ font-family: var(--base-font-family-mono);
189
+ font-size: 1.3rem;
190
+ font-weight: 700;
191
+ letter-spacing: 0.1em;
192
+ text-transform: uppercase;
193
+ color: color-mix(in srgb, var(--pa-text-color-1) 60%, transparent);
194
+ line-height: 1.25;
195
+ }
196
+ .pa-kpi-hero-side__value {
197
+ grid-area: value;
198
+ align-self: center;
199
+ font-family: var(--base-font-family-mono);
200
+ line-height: 1;
201
+ white-space: nowrap;
202
+ display: inline-flex;
203
+ align-items: baseline;
204
+ }
205
+ .pa-kpi-hero-side__num {
206
+ font-size: 2.4rem;
207
+ font-weight: 700;
208
+ letter-spacing: -0.02em;
209
+ color: var(--pa-text-color-1);
210
+ }
211
+ .pa-kpi-hero-side__unit {
212
+ font-size: 1.5rem;
213
+ font-weight: 500;
214
+ color: var(--pa-text-secondary);
215
+ margin: 0 0.35rem;
216
+ }
217
+ .pa-kpi-hero-side__delta {
218
+ grid-area: delta;
219
+ align-self: start;
220
+ font-family: var(--base-font-family-mono);
221
+ font-size: 1.2rem;
222
+ font-weight: 600;
223
+ color: var(--pa-kpi-accent);
224
+ }
@@ -0,0 +1,213 @@
1
+ /* ========================================
2
+ KPI · Numeric strip (densest)
3
+ Tabular "spreadsheet-style" table card with metric / now / prev / Δ% /
4
+ target columns — most data per pixel, no chart chrome. Each row is its
5
+ own grid sharing the same column template so cells align across rows
6
+ without needing subgrid. Wide-only by design — no responsive collapse;
7
+ narrow placements should use Comparison gauges instead.
8
+
9
+ Column contract: `metric` + `now` are always present; `prev`, `delta`,
10
+ and `target` are independently optional via toggle modifiers on the
11
+ strip (`--no-prev`, `--no-delta`, `--no-target`). Modifiers compose, so
12
+ the visible column count ranges from 2 (all three optional columns
13
+ dropped) to 5 (none dropped). Each combination has its own template
14
+ selector below so the grid tracks always match the visible cell count.
15
+ ======================================== */
16
+ @use '../variables' as *;
17
+
18
+ /* Per-column track widths — referenced from every template selector. */
19
+ $strip-col-metric: minmax(0, 2fr);
20
+ $strip-col-now: minmax(0, 1.1fr);
21
+ $strip-col-prev: minmax(0, 1fr);
22
+ $strip-col-delta: minmax(0, 1fr);
23
+ $strip-col-target: minmax(0, 1.6fr);
24
+
25
+ .pa-kpi-strip__body { padding: 0; }
26
+
27
+ /* ----- Table layout ----------------------------------------------------- */
28
+ .pa-kpi-strip__row,
29
+ .pa-kpi-strip__head-row {
30
+ display: grid;
31
+ grid-template-columns:
32
+ $strip-col-metric
33
+ $strip-col-now
34
+ $strip-col-prev
35
+ $strip-col-delta
36
+ $strip-col-target;
37
+ column-gap: 1.6rem;
38
+ align-items: center;
39
+ position: relative;
40
+ padding: 1.1rem 1.6rem;
41
+ }
42
+
43
+ /* Divider between data rows / between head and first row only. */
44
+ .pa-kpi-strip__row + .pa-kpi-strip__row,
45
+ .pa-kpi-strip__head-row + .pa-kpi-strip__row {
46
+ border-top: 1px solid var(--pa-border-color);
47
+ }
48
+
49
+ /* Hover host: subtle row highlight so the cursor-anchored popover has a
50
+ clear "this row" anchor. */
51
+ .pa-kpi-strip__row:hover {
52
+ background: var(--pa-surface-hover);
53
+ }
54
+
55
+ /* ----- Header cells (uppercase mono captions) --------------------------- */
56
+ .pa-kpi-strip__head {
57
+ font-family: var(--base-font-family-mono);
58
+ font-size: 1.1rem;
59
+ font-weight: 700;
60
+ letter-spacing: 0.1em;
61
+ text-transform: uppercase;
62
+ color: var(--pa-text-tertiary);
63
+
64
+ &--num { text-align: end; }
65
+ }
66
+
67
+ /* ----- Metric label ----------------------------------------------------- */
68
+ .pa-kpi-strip__metric {
69
+ font-family: var(--base-font-family-mono);
70
+ font-size: 1.4rem;
71
+ font-weight: 700;
72
+ letter-spacing: 0.08em;
73
+ text-transform: uppercase;
74
+ color: color-mix(in srgb, var(--pa-text-color-1) 78%, transparent);
75
+ line-height: 1.2;
76
+ }
77
+
78
+ /* ----- NOW (focal value) ------------------------------------------------ */
79
+ .pa-kpi-strip__now {
80
+ font-family: var(--base-font-family-mono);
81
+ font-size: 1.8rem;
82
+ font-weight: 700;
83
+ text-align: end;
84
+ display: flex;
85
+ align-items: baseline;
86
+ justify-content: flex-end;
87
+ color: var(--pa-text-color-1);
88
+ white-space: nowrap;
89
+ line-height: 1;
90
+
91
+ .pa-kpi-strip__num { font-weight: 700; }
92
+ .pa-kpi-strip__unit {
93
+ font-size: 1.1rem;
94
+ font-weight: 500;
95
+ color: color-mix(in srgb, var(--pa-text-color-1) 50%, transparent);
96
+ margin: 0 0.2rem;
97
+ }
98
+ }
99
+
100
+ /* ----- PREV (reference data, low contrast) ------------------------------ */
101
+ .pa-kpi-strip__prev {
102
+ font-family: var(--base-font-family-mono);
103
+ font-size: 1.5rem;
104
+ font-weight: 500;
105
+ color: var(--pa-text-tertiary);
106
+ text-align: end;
107
+ white-space: nowrap;
108
+ }
109
+
110
+ /* ----- Δ% (sentiment-coloured) ------------------------------------------ */
111
+ .pa-kpi-strip__delta {
112
+ font-family: var(--base-font-family-mono);
113
+ font-size: 1.5rem;
114
+ font-weight: 700;
115
+ text-align: end;
116
+ white-space: nowrap;
117
+ color: var(--pa-positive);
118
+
119
+ &--positive { color: var(--pa-positive); }
120
+ &--negative { color: var(--pa-negative); }
121
+ &--neutral { color: var(--pa-neutral); }
122
+ &--up-strong { color: var(--pa-very-positive); }
123
+ &--down-strong { color: var(--pa-very-negative); }
124
+ }
125
+
126
+ /* ----- VS TARGET (bar + pct stacked, capped at 100% visual) -------------
127
+ Theme-neutral grey fill — the pct value itself signals overshoot /
128
+ undershoot ("97" vs "108" vs "54") so colour reinforcement isn't
129
+ needed. The bar visually caps at 100% via overflow: hidden so an
130
+ over-target metric reads as "fully filled" rather than overflowing. */
131
+ .pa-kpi-strip__target {
132
+ display: flex;
133
+ flex-direction: column;
134
+ gap: 0.35rem;
135
+ }
136
+ .pa-kpi-strip__bar {
137
+ position: relative;
138
+ height: 0.5rem;
139
+ background: var(--pa-surface-track);
140
+ overflow: hidden;
141
+ border-radius: 0.1rem;
142
+ }
143
+ .pa-kpi-strip__fill {
144
+ position: absolute;
145
+ top: 0;
146
+ left: 0;
147
+ bottom: 0;
148
+ background: color-mix(in srgb, var(--pa-text-color-1) 40%, transparent);
149
+ }
150
+ .pa-kpi-strip__bar-pct {
151
+ font-family: var(--base-font-family-mono);
152
+ font-size: 1.05rem;
153
+ font-weight: 600;
154
+ color: var(--pa-text-secondary);
155
+ align-self: flex-end;
156
+ line-height: 1;
157
+ }
158
+
159
+ /* ----- Toggle modifiers ------------------------------------------------
160
+ `--no-prev`, `--no-delta`, `--no-target` are independently composable.
161
+ Each hides its column's cells (data + header) and the matching template
162
+ selector below adjusts `grid-template-columns` to the visible cell
163
+ count, so source order (metric, now, prev, delta, target) is preserved
164
+ and the remaining cells slot into the right tracks.
165
+
166
+ `metric` and `now` are mandatory — no toggle drops them. If a strip
167
+ doesn't need a focal value, it's a different design (use comparison
168
+ gauges or editorial-minimal). */
169
+ .pa-kpi-strip--no-prev .pa-kpi-strip__prev,
170
+ .pa-kpi-strip--no-prev .pa-kpi-strip__head--prev { display: none; }
171
+ .pa-kpi-strip--no-delta .pa-kpi-strip__delta,
172
+ .pa-kpi-strip--no-delta .pa-kpi-strip__head--delta { display: none; }
173
+ .pa-kpi-strip--no-target .pa-kpi-strip__target,
174
+ .pa-kpi-strip--no-target .pa-kpi-strip__head--target { display: none; }
175
+
176
+ /* ----- Grid templates per visible-column combination -------------------
177
+ 8 combos (1 default + 3 single-drops + 3 double-drops + 1 triple-drop).
178
+ Each lists the visible columns in source order with their declared
179
+ `$strip-col-*` width. */
180
+
181
+ /* 4-col: one optional column dropped */
182
+ .pa-kpi-strip--no-prev .pa-kpi-strip__row,
183
+ .pa-kpi-strip--no-prev .pa-kpi-strip__head-row {
184
+ grid-template-columns: $strip-col-metric $strip-col-now $strip-col-delta $strip-col-target;
185
+ }
186
+ .pa-kpi-strip--no-delta .pa-kpi-strip__row,
187
+ .pa-kpi-strip--no-delta .pa-kpi-strip__head-row {
188
+ grid-template-columns: $strip-col-metric $strip-col-now $strip-col-prev $strip-col-target;
189
+ }
190
+ .pa-kpi-strip--no-target .pa-kpi-strip__row,
191
+ .pa-kpi-strip--no-target .pa-kpi-strip__head-row {
192
+ grid-template-columns: $strip-col-metric $strip-col-now $strip-col-prev $strip-col-delta;
193
+ }
194
+
195
+ /* 3-col: two optional columns dropped */
196
+ .pa-kpi-strip--no-prev.pa-kpi-strip--no-delta .pa-kpi-strip__row,
197
+ .pa-kpi-strip--no-prev.pa-kpi-strip--no-delta .pa-kpi-strip__head-row {
198
+ grid-template-columns: $strip-col-metric $strip-col-now $strip-col-target;
199
+ }
200
+ .pa-kpi-strip--no-prev.pa-kpi-strip--no-target .pa-kpi-strip__row,
201
+ .pa-kpi-strip--no-prev.pa-kpi-strip--no-target .pa-kpi-strip__head-row {
202
+ grid-template-columns: $strip-col-metric $strip-col-now $strip-col-delta;
203
+ }
204
+ .pa-kpi-strip--no-delta.pa-kpi-strip--no-target .pa-kpi-strip__row,
205
+ .pa-kpi-strip--no-delta.pa-kpi-strip--no-target .pa-kpi-strip__head-row {
206
+ grid-template-columns: $strip-col-metric $strip-col-now $strip-col-prev;
207
+ }
208
+
209
+ /* 2-col: all three optional columns dropped (metric + now only) */
210
+ .pa-kpi-strip--no-prev.pa-kpi-strip--no-delta.pa-kpi-strip--no-target .pa-kpi-strip__row,
211
+ .pa-kpi-strip--no-prev.pa-kpi-strip--no-delta.pa-kpi-strip--no-target .pa-kpi-strip__head-row {
212
+ grid-template-columns: $strip-col-metric $strip-col-now;
213
+ }