@keenmate/pure-css 1.0.0-rc03 → 1.0.0-rc05

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.
@@ -146,80 +146,21 @@
146
146
  --base-border-radius-lg: #{$base-border-radius-lg};
147
147
  }
148
148
 
149
- // ============================================================================
150
- // ALERT COLOR DERIVATION MIXINS
151
- // ============================================================================
152
- // These mixins use color-mix() to automatically derive alert colors from
153
- // semantic base colors (--pa-success-bg, --pa-danger-bg, etc.)
154
- //
155
- // Light mode: dark text on subtle backgrounds
156
- // Dark mode: light text on tinted backgrounds
157
- //
158
- // Themes call the appropriate mixin instead of hardcoding 12+ CSS variables.
159
- // Override specific variables after the mixin call if needed.
160
- // ============================================================================
161
-
162
- // Light mode: dark text on subtle backgrounds
163
- @mixin output-pa-alert-variables-light {
164
- // Success
165
- --pa-alert-success-text: color-mix(in srgb, var(--pa-success-bg) #{$alert-text-mix-light}, black);
166
- --pa-alert-success-bg: color-mix(in srgb, var(--pa-success-bg) #{$alert-bg-opacity-light}%, transparent);
167
- --pa-alert-success-border: color-mix(in srgb, var(--pa-success-bg) #{$alert-border-opacity-light}%, transparent);
168
-
169
- // Danger
170
- --pa-alert-danger-text: color-mix(in srgb, var(--pa-danger-bg) #{$alert-text-mix-light}, black);
171
- --pa-alert-danger-bg: color-mix(in srgb, var(--pa-danger-bg) #{$alert-bg-opacity-light}%, transparent);
172
- --pa-alert-danger-border: color-mix(in srgb, var(--pa-danger-bg) #{$alert-border-opacity-light}%, transparent);
173
-
174
- // Warning
175
- --pa-alert-warning-text: color-mix(in srgb, var(--pa-warning-bg) #{$alert-text-mix-light}, black);
176
- --pa-alert-warning-bg: color-mix(in srgb, var(--pa-warning-bg) #{$alert-bg-opacity-light}%, transparent);
177
- --pa-alert-warning-border: color-mix(in srgb, var(--pa-warning-bg) #{$alert-border-opacity-light}%, transparent);
178
-
179
- // Info
180
- --pa-alert-info-text: color-mix(in srgb, var(--pa-info-bg) #{$alert-text-mix-light}, black);
181
- --pa-alert-info-bg: color-mix(in srgb, var(--pa-info-bg) #{$alert-bg-opacity-light}%, transparent);
182
- --pa-alert-info-border: color-mix(in srgb, var(--pa-info-bg) #{$alert-border-opacity-light}%, transparent);
183
- }
184
-
185
- // Dark mode: white text on tinted backgrounds (white text is always readable)
186
- @mixin output-pa-alert-variables-dark {
187
- // Success
188
- --pa-alert-success-text: #ffffff;
189
- --pa-alert-success-bg: color-mix(in srgb, var(--pa-success-bg) #{$alert-bg-opacity-dark}%, transparent);
190
- --pa-alert-success-border: color-mix(in srgb, var(--pa-success-bg) #{$alert-border-opacity-dark}%, transparent);
191
-
192
- // Danger
193
- --pa-alert-danger-text: #ffffff;
194
- --pa-alert-danger-bg: color-mix(in srgb, var(--pa-danger-bg) #{$alert-bg-opacity-dark}%, transparent);
195
- --pa-alert-danger-border: color-mix(in srgb, var(--pa-danger-bg) #{$alert-border-opacity-dark}%, transparent);
196
-
197
- // Warning
198
- --pa-alert-warning-text: #ffffff;
199
- --pa-alert-warning-bg: color-mix(in srgb, var(--pa-warning-bg) #{$alert-bg-opacity-dark}%, transparent);
200
- --pa-alert-warning-border: color-mix(in srgb, var(--pa-warning-bg) #{$alert-border-opacity-dark}%, transparent);
201
-
202
- // Info
203
- --pa-alert-info-text: #ffffff;
204
- --pa-alert-info-bg: color-mix(in srgb, var(--pa-info-bg) #{$alert-bg-opacity-dark}%, transparent);
205
- --pa-alert-info-border: color-mix(in srgb, var(--pa-info-bg) #{$alert-border-opacity-dark}%, transparent);
206
- }
207
-
208
149
  // ============================================================================
209
150
  // DERIVED TOKENS — TEXT CONTRAST TIERS + SURFACE TINTS
210
151
  // ============================================================================
211
- // These tokens use `color-mix(... var(--pa-text-color-1) ...)` to derive
152
+ // These tokens use `color-mix(... var(--pc-text-color-1) ...)` to derive
212
153
  // theme-aware contrast levels. They MUST be emitted at every selector that
213
- // could carry an override of --pa-text-color-1, because CSS custom property
154
+ // could carry an override of --pc-text-color-1, because CSS custom property
214
155
  // substitution bakes nested var() references at the *defining element*, not
215
- // the using element. If we only defined these at `:root, .pa-mode-light`,
156
+ // the using element. If we only defined these at `:root, .pc-mode-light`,
216
157
  // the light-mode text colour would be frozen into the value, and elements
217
- // inside `.pa-mode-dark` (which overrides --pa-text-color-1 at body) would
158
+ // inside `.pc-mode-dark` (which overrides --pc-text-color-1 at body) would
218
159
  // inherit the light-mode-baked tier values → low contrast on dark surfaces.
219
160
  //
220
161
  // Emitting at all three selectors causes each scope to recompute the tiers
221
- // against its own --pa-text-color-1. The selector list `:root, .pa-mode-light,
222
- // .pa-mode-dark` covers html, body in light mode, and body in dark mode —
162
+ // against its own --pc-text-color-1. The selector list `:root, .pc-mode-light,
163
+ // .pc-mode-dark` covers html, body in light mode, and body in dark mode —
223
164
  // regardless of which class layout each theme uses for mode switching.
224
165
  //
225
166
  // This is a TOP-LEVEL rule (not inside the mixin) because themes only call
@@ -228,421 +169,455 @@
228
169
  // dark-mode tiers without changing any theme code.
229
170
  //
230
171
  // Override these per-theme by redefining them in the same scope you
231
- // override --pa-text-color-1.
172
+ // override --pc-text-color-1.
232
173
  // ============================================================================
233
174
 
234
175
  :root,
235
- .pa-mode-light,
236
- .pa-mode-dark {
237
- --pa-text-strong: color-mix(in srgb, var(--pa-text-color-1) 85%, transparent);
238
- --pa-text-secondary: color-mix(in srgb, var(--pa-text-color-1) 70%, transparent);
239
- --pa-text-tertiary: color-mix(in srgb, var(--pa-text-color-1) 55%, transparent);
240
- --pa-surface-hover: color-mix(in srgb, var(--pa-text-color-1) 4%, transparent);
241
- --pa-surface-track: color-mix(in srgb, var(--pa-text-color-1) 12%, transparent);
176
+ .pc-mode-light,
177
+ .pc-mode-dark {
178
+ --pc-text-strong: color-mix(in srgb, var(--pc-text-color-1) 85%, transparent);
179
+ --pc-text-secondary: color-mix(in srgb, var(--pc-text-color-1) 70%, transparent);
180
+ --pc-text-tertiary: color-mix(in srgb, var(--pc-text-color-1) 55%, transparent);
181
+ --pc-surface-hover: color-mix(in srgb, var(--pc-text-color-1) 4%, transparent);
182
+ --pc-surface-track: color-mix(in srgb, var(--pc-text-color-1) 12%, transparent);
242
183
  }
243
184
 
244
185
  // ============================================================================
245
- // PURE ADMIN THEME CSS VARIABLES OUTPUT MIXIN
186
+ // PURE-CSS FOUNDATION TOKENS — the base runtime custom-property contract
246
187
  // ============================================================================
247
- // This mixin outputs all themeable SCSS variables as --pa-* CSS custom properties.
248
- // Components use var(--pa-*) for runtime theme switching capability.
188
+ // pure-css is a *foundation*: it ships only the BASE token contract — the
189
+ // tokens its own CSS (grid / utilities / reboot / scrollbars) consumes, plus
190
+ // the universal theming primitives (surfaces, text, accent, links, border,
191
+ // the semantic role identities + their utility text colours, the theme
192
+ // palette slots, and the border-radius scale).
249
193
  //
250
- // Usage in theme file:
251
- // :root, .theme-light {
252
- // @include output-pa-css-variables;
253
- // }
254
- // .theme-dark {
255
- // @include output-pa-css-variables;
256
- // }
194
+ // COMPONENT tokens (buttons, cards, tables, modals, badges, tooltips, panels,
195
+ // command palette, multiselect, sentiment scale, form spacing, the derived
196
+ // contextual/alert surfaces, admin layout chrome, …) are NOT emitted here —
197
+ // they are pure-admin's contract, emitted by pure-admin's
198
+ // `output-pc-component-variables` + `output-pc-alert-variables-{light,dark}`.
199
+ // Those mixins read the same shared $-variable vocabulary defined in
200
+ // `variables/*`, so themes still override one place; only the *emission* of
201
+ // component custom properties lives with the components that use them.
257
202
  // ============================================================================
258
203
 
259
- @mixin output-pa-css-variables {
260
- // =========================================================================
261
- // COLOR SCHEME SIGNAL
204
+ @mixin output-pc-css-variables {
262
205
  // Tells the browser whether this scope is light or dark so native UA
263
- // elements (scrollbars, form controls) and `light-dark()` resolve
264
- // correctly. Drives web components (e.g. <web-multiselect>) that ship
265
- // adaptive palettes via `light-dark()`. Override $theme-color-scheme
266
- // before importing variables for always-dark themes; for dual-mode
267
- // themes leave default `light` here and add `color-scheme: dark;` to
268
- // the `.pa-mode-dark` block.
269
- // =========================================================================
206
+ // elements (scrollbars, form controls) and `light-dark()` resolve correctly.
207
+ // Override $theme-color-scheme before importing variables for always-dark
208
+ // themes; for dual-mode themes leave `light` and add `color-scheme: dark;`
209
+ // to the `.pc-mode-dark` block.
270
210
  color-scheme: #{$theme-color-scheme};
271
211
 
272
- // =========================================================================
273
- // CORE COLORS
274
- // =========================================================================
275
-
276
- // Background colors
277
- --pa-main-bg: #{$main-bg};
278
- --pa-page-bg: #{$page-bg};
279
- --pa-subtle-bg: #{$subtle-bg};
212
+ // Surfaces
213
+ --pc-main-bg: #{$main-bg};
214
+ --pc-page-bg: #{$page-bg};
215
+ --pc-subtle-bg: #{$subtle-bg};
280
216
 
281
- // Text colors
282
- --pa-text-color-1: #{$text-color-1};
283
- --pa-text-color-2: #{$text-color-2};
217
+ // Text
218
+ --pc-text-color-1: #{$text-color-1};
219
+ --pc-text-color-2: #{$text-color-2};
284
220
 
285
- // Accent colors
286
- --pa-accent: #{$accent-color};
287
- --pa-accent-hover: #{$accent-hover};
288
- // -light derives from --pa-accent at runtime so theme overrides cascade.
289
- // SCSS-only consumers still get $accent-light from variables/_base.scss via the !default chain.
290
- --pa-accent-light: color-mix(in srgb, var(--pa-accent) 5%, transparent);
221
+ // Accent — -light derives from --pc-accent at runtime so theme overrides cascade.
222
+ --pc-accent: #{$accent-color};
223
+ --pc-accent-hover: #{$accent-hover};
224
+ --pc-accent-light: color-mix(in srgb, var(--pc-accent) 5%, transparent);
291
225
 
292
226
  // Links — derive from accent so theme overrides cascade automatically.
293
- // Hover mixes 25% toward currentColor (inherited text colour at the use site),
294
- // so it auto-darkens on light themes and auto-lightens on dark themes
295
- // without per-mode declarations.
296
- --pa-link-color: var(--pa-accent);
297
- --pa-link-color-hover: color-mix(in srgb, var(--pa-link-color), currentColor 50%);
298
- --pa-link-color-visited: var(--pa-link-color);
299
-
300
- // Border. A pure pass-through of the base border colour — emit it as a live reference to
301
- // --base-border-color (not a baked literal) so it follows a RUNTIME --base-* override (a
302
- // theme toggling --base-border-color at :root/.pa-mode-dark), while the build-time value
303
- // stays the fallback. Keeps utilities/components that read --pa-border-color theme-responsive.
304
- --pa-border-color: var(--base-border-color, #{$border-color});
305
-
306
- // =========================================================================
307
- // ROLE COLORS — single source of truth for the four semantic roles.
308
- // Button surfaces (--pa-btn-{success,warning,danger,info}-bg) and
309
- // contextual surfaces (--pa-{success,warning,danger,info}-bg) below
310
- // both reference these via var() so a theme can override one place
311
- // and the change cascades everywhere.
312
- //
313
- // --pa-warning here is also the "off-target / approaching-limit" axis
314
- // colour used by KPI components — orange-500, deliberately distinct
315
- // from the previous Bootstrap yellow.
316
- // =========================================================================
317
-
318
- --pa-success: #{$base-success-color};
319
- --pa-warning: #{$base-warning-color};
320
- --pa-danger: #{$base-danger-color};
321
- --pa-info: #{$base-info-color};
322
-
323
- // =========================================================================
324
- // SENTIMENT SCALE — 5-step direction-of-change.
325
- // Used by KPI / data-display components for indicating directional
326
- // movement (delta colours, sparkline trend colours, etc.).
327
- // The middle three values alias the role colours so a theme that
328
- // retunes --pa-success / --pa-danger automatically retunes the
329
- // matching sentiment positions; the outliers (very-positive /
330
- // very-negative) are explicit darker shades.
331
- //
332
- // Sentiment is on a *different axis* from role colours — direction
333
- // (ordinal: -2 to +2) vs. urgency (categorical: success / warning /
334
- // danger / info). They coexist intentionally.
335
- // =========================================================================
336
-
337
- --pa-very-positive: #{$base-very-positive};
338
- --pa-positive: var(--pa-success);
339
- --pa-neutral: #{$base-neutral};
340
- --pa-negative: var(--pa-danger);
341
- --pa-very-negative: #{$base-very-negative};
342
-
343
- // (Text contrast tiers and surface tints are emitted as a top-level rule
344
- // OUTSIDE this mixin — see below — because their values use
345
- // `var(--pa-text-color-1)` and CSS custom property substitution bakes
346
- // nested var() at the *defining element*, not the using element. That
347
- // means tier vars defined here at `:root, .pa-mode-light` would freeze
348
- // the light-mode text colour into them; under `.pa-mode-dark` (which
349
- // overrides --pa-text-color-1 at body) the tiers would still resolve
350
- // against the light value. Emitting them at all three selectors
351
- // simultaneously fixes the substitution scope.)
352
-
353
- // =========================================================================
354
- // CHART / SPARKLINE
355
- // =========================================================================
356
- // Single height token used by every KPI showcase that renders a sparkline
357
- // / trendline (terminal grid, sparkline list, hero+supporting, bento).
358
- // Centralised so the line proportions stay consistent across designs;
359
- // override globally for taller or shorter trendlines, or per-component
360
- // if a particular layout (e.g. a "hero" pattern) wants a different size.
361
-
362
- --pa-chart-trendline-height: 3rem;
363
- --pa-chart-trendline-stroke: 2.1; // SVG user-space units (viewBox-relative)
364
-
365
- // =========================================================================
366
- // DETAIL POPOVER — Bloomberg-dark by default, regardless of host
367
- // theme, for the terminal/data-dashboard aesthetic. Override the
368
- // five tokens to adopt a theme-aware popover instead.
369
- // =========================================================================
370
-
371
- --pa-detail-bg: rgba(15, 17, 21, 0.97);
372
- --pa-detail-text: #ffffff;
373
- --pa-detail-row-label: rgba(255, 255, 255, 0.75);
374
- --pa-detail-title: rgba(255, 255, 255, 0.55);
375
- --pa-detail-shadow: 0 1.4rem 3.6rem rgba(0, 0, 0, 0.55);
227
+ // Hover mixes 50% toward currentColor (inherited text colour at the use site),
228
+ // so it auto-darkens on light themes and auto-lightens on dark themes.
229
+ --pc-link-color: var(--pc-accent);
230
+ --pc-link-color-hover: color-mix(in srgb, var(--pc-link-color), currentColor 50%);
231
+ --pc-link-color-visited: var(--pc-link-color);
232
+
233
+ // Border — a live reference to --base-border-color (so a runtime --base-*
234
+ // override cascades), with the build-time value as the literal fallback.
235
+ --pc-border-color: var(--base-border-color, #{$border-color});
236
+
237
+ // Semantic role identities — the single source for the four roles. Component
238
+ // surfaces (--pc-*-bg, alerts, buttons) derive from these via var() in
239
+ // pure-admin, so retuning a role here cascades everywhere.
240
+ --pc-success: #{$base-success-color};
241
+ --pc-warning: #{$base-warning-color};
242
+ --pc-danger: #{$base-danger-color};
243
+ --pc-info: #{$base-info-color};
244
+
245
+ // Role text colours — consumed by the .text-{success,danger,warning,info}
246
+ // utilities (utilities.scss). Kept in the base contract for that reason.
247
+ --pc-success-text: #{$success-text};
248
+ --pc-danger-text: #{$danger-text};
249
+ --pc-warning-text: #{$warning-text};
250
+ --pc-info-text: #{$info-text};
251
+
252
+ // Theme palette slots (1–9) + paired contrast text. Consumed by the
253
+ // .text-color-* utilities; themes override $color-N for branded palettes.
254
+ --pc-color-1: #{$color-1};
255
+ --pc-color-2: #{$color-2};
256
+ --pc-color-3: #{$color-3};
257
+ --pc-color-4: #{$color-4};
258
+ --pc-color-5: #{$color-5};
259
+ --pc-color-6: #{$color-6};
260
+ --pc-color-7: #{$color-7};
261
+ --pc-color-8: #{$color-8};
262
+ --pc-color-9: #{$color-9};
263
+ --pc-color-1-text: #{$color-1-text};
264
+ --pc-color-2-text: #{$color-2-text};
265
+ --pc-color-3-text: #{$color-3-text};
266
+ --pc-color-4-text: #{$color-4-text};
267
+ --pc-color-5-text: #{$color-5-text};
268
+ --pc-color-6-text: #{$color-6-text};
269
+ --pc-color-7-text: #{$color-7-text};
270
+ --pc-color-8-text: #{$color-8-text};
271
+ --pc-color-9-text: #{$color-9-text};
272
+
273
+ // Border-radius scale
274
+ --pc-border-radius-sm: #{$border-radius-sm};
275
+ --pc-border-radius: #{$border-radius};
276
+ --pc-border-radius-lg: #{$border-radius-lg};
277
+ }
278
+
279
+ // ============================================================================
280
+ // COMPONENT CSS VARIABLES — pure-admin's contract (DEFINED here, EMITTED there)
281
+ // ============================================================================
282
+ // These emit the component-scoped --pc-* tokens (buttons, cards, tables,
283
+ // panels, badges, tooltips, command palette, multiselect, sentiment scale,
284
+ // form spacing, the derived contextual/alert surfaces, admin layout chrome).
285
+ //
286
+ // They are DEFINED in pure-css only because they read the shared $-variable
287
+ // vocabulary that lives in `variables/*` (in scope here via `@use variables/
288
+ // index as *`); a Sass mixin resolves those globals from its definition site,
289
+ // so it must be authored where the vocabulary is visible.
290
+ //
291
+ // They are NOT part of pure-css's shipped output: base.scss / pure-css.scss do
292
+ // NOT call them, so the foundation bundle emits base tokens only. Consumers
293
+ // that ship the components (pure-admin core, themes) opt in by calling
294
+ // output-pc-component-variables + output-pc-alert-variables-{light,dark}
295
+ // alongside output-pc-css-variables. This keeps the EMISSION with the
296
+ // components while the shared token vocabulary stays single-sourced.
297
+ // ============================================================================
298
+
299
+ @mixin output-pc-component-variables {
300
+ // =========================================================================
301
+ // SENTIMENT SCALE — 5-step direction-of-change (KPI / data-display).
302
+ // Middle three alias the role colours so retuning --pc-success / --pc-danger
303
+ // retunes the matching sentiment positions; outliers are explicit shades.
304
+ // =========================================================================
305
+ --pc-very-positive: #{$base-very-positive};
306
+ --pc-positive: var(--pc-success);
307
+ --pc-neutral: #{$base-neutral};
308
+ --pc-negative: var(--pc-danger);
309
+ --pc-very-negative: #{$base-very-negative};
310
+
311
+ // =========================================================================
312
+ // CHART / SPARKLINE — shared trendline sizing.
313
+ // =========================================================================
314
+ --pc-chart-trendline-height: 3rem;
315
+ --pc-chart-trendline-stroke: 2.1; // SVG user-space units (viewBox-relative)
316
+
317
+ // =========================================================================
318
+ // DETAIL POPOVER — Bloomberg-dark by default regardless of host theme.
319
+ // Override the five tokens to adopt a theme-aware popover instead.
320
+ // =========================================================================
321
+ --pc-detail-bg: rgba(15, 17, 21, 0.97);
322
+ --pc-detail-text: #ffffff;
323
+ --pc-detail-row-label: rgba(255, 255, 255, 0.75);
324
+ --pc-detail-title: rgba(255, 255, 255, 0.55);
325
+ --pc-detail-shadow: 0 1.4rem 3.6rem rgba(0, 0, 0, 0.55);
376
326
 
377
327
  // =========================================================================
378
328
  // LAYOUT COLORS
379
329
  // =========================================================================
380
330
 
381
331
  // Navbar
382
- --pa-navbar-bg: #{$navbar-bg};
383
- --pa-navbar-border-color: #{$navbar-border-color};
384
- --pa-navbar-text: #{$navbar-text};
385
- --pa-navbar-text-secondary: #{$navbar-text-secondary};
386
- --pa-navbar-profile-name-color: #{$navbar-profile-name-color};
332
+ --pc-navbar-bg: #{$navbar-bg};
333
+ --pc-navbar-border-color: #{$navbar-border-color};
334
+ --pc-navbar-text: #{$navbar-text};
335
+ --pc-navbar-text-secondary: #{$navbar-text-secondary};
336
+ --pc-navbar-profile-name-color: #{$navbar-profile-name-color};
387
337
 
388
338
  // Sidebar
389
- --pa-sidebar-bg: #{$sidebar-bg};
390
- --pa-sidebar-text: #{$sidebar-text};
391
- --pa-sidebar-text-secondary: #{$sidebar-text-secondary};
392
- --pa-sidebar-submenu-bg: #{$sidebar-submenu-bg};
393
- --pa-sidebar-submenu-hover-bg: #{$sidebar-submenu-hover-bg};
394
- --pa-sidebar-submenu-active-bg: #{$sidebar-submenu-active-bg};
395
- --pa-sidebar-submenu-active-text: #{$sidebar-submenu-active-text};
339
+ --pc-sidebar-bg: #{$sidebar-bg};
340
+ --pc-sidebar-text: #{$sidebar-text};
341
+ --pc-sidebar-text-secondary: #{$sidebar-text-secondary};
342
+ --pc-sidebar-submenu-bg: #{$sidebar-submenu-bg};
343
+ --pc-sidebar-submenu-hover-bg: #{$sidebar-submenu-hover-bg};
344
+ --pc-sidebar-submenu-active-bg: #{$sidebar-submenu-active-bg};
345
+ --pc-sidebar-submenu-active-text: #{$sidebar-submenu-active-text};
396
346
 
397
347
  // Footer
398
- --pa-footer-bg: #{$footer-bg};
399
- --pa-footer-border-color: #{$footer-border-color};
348
+ --pc-footer-bg: #{$footer-bg};
349
+ --pc-footer-border-color: #{$footer-border-color};
400
350
 
401
351
  // =========================================================================
402
352
  // BUTTON COLORS
403
353
  // =========================================================================
404
354
 
405
355
  // Primary (uses accent color)
406
- --pa-btn-primary-bg: #{$btn-primary-bg};
407
- --pa-btn-primary-bg-hover: #{$btn-primary-bg-hover};
408
- // -light derives from --pa-btn-primary-bg at runtime so theme overrides cascade.
409
- --pa-btn-primary-bg-light: color-mix(in srgb, var(--pa-btn-primary-bg) 5%, transparent);
410
- --pa-btn-primary-text: #{$btn-primary-text};
356
+ --pc-btn-primary-bg: #{$btn-primary-bg};
357
+ --pc-btn-primary-bg-hover: #{$btn-primary-bg-hover};
358
+ --pc-btn-primary-bg-light: color-mix(in srgb, var(--pc-btn-primary-bg) 5%, transparent);
359
+ --pc-btn-primary-text: #{$btn-primary-text};
411
360
 
412
361
  // Secondary
413
- --pa-btn-secondary-bg: #{$btn-secondary-bg};
414
- --pa-btn-secondary-bg-hover: #{$btn-secondary-bg-hover};
415
- --pa-btn-secondary-text: #{$btn-secondary-text};
416
- // Outline-variant border + text colour. Defaults to --pa-btn-secondary-bg
417
- // so the resting outline matches the colour the hover fill animates to.
418
- // Was previously $btn-secondary-text (#ffffff) which rendered invisible on
419
- // any light theme — pre-existing bug, not a 2.7.0 regression.
420
- --pa-btn-secondary-outline-color: var(--pa-btn-secondary-bg);
362
+ --pc-btn-secondary-bg: #{$btn-secondary-bg};
363
+ --pc-btn-secondary-bg-hover: #{$btn-secondary-bg-hover};
364
+ --pc-btn-secondary-text: #{$btn-secondary-text};
365
+ --pc-btn-secondary-outline-color: var(--pc-btn-secondary-bg);
421
366
 
422
367
  // Success — bg references role colour for runtime cascade
423
- --pa-btn-success-bg: var(--pa-success);
424
- --pa-btn-success-bg-hover: #{$btn-success-bg-hover};
425
- --pa-btn-success-text: #{$btn-success-text};
368
+ --pc-btn-success-bg: var(--pc-success);
369
+ --pc-btn-success-bg-hover: #{$btn-success-bg-hover};
370
+ --pc-btn-success-text: #{$btn-success-text};
426
371
 
427
372
  // Danger — bg references role colour for runtime cascade
428
- --pa-btn-danger-bg: var(--pa-danger);
429
- --pa-btn-danger-bg-hover: #{$btn-danger-bg-hover};
430
- --pa-btn-danger-text: #{$btn-danger-text};
373
+ --pc-btn-danger-bg: var(--pc-danger);
374
+ --pc-btn-danger-bg-hover: #{$btn-danger-bg-hover};
375
+ --pc-btn-danger-text: #{$btn-danger-text};
431
376
 
432
377
  // Warning — bg references role colour for runtime cascade
433
- --pa-btn-warning-bg: var(--pa-warning);
434
- --pa-btn-warning-bg-hover: #{$btn-warning-bg-hover};
435
- --pa-btn-warning-text: #{$btn-warning-text};
378
+ --pc-btn-warning-bg: var(--pc-warning);
379
+ --pc-btn-warning-bg-hover: #{$btn-warning-bg-hover};
380
+ --pc-btn-warning-text: #{$btn-warning-text};
436
381
 
437
382
  // Info — bg references role colour for runtime cascade
438
- --pa-btn-info-bg: var(--pa-info);
439
- --pa-btn-info-bg-hover: #{$btn-info-bg-hover};
440
- --pa-btn-info-text: #{$btn-info-text};
383
+ --pc-btn-info-bg: var(--pc-info);
384
+ --pc-btn-info-bg-hover: #{$btn-info-bg-hover};
385
+ --pc-btn-info-text: #{$btn-info-text};
441
386
 
442
387
  // Light
443
- --pa-btn-light-bg: #{$btn-light-bg};
444
- --pa-btn-light-bg-hover: #{$btn-light-bg-hover};
445
- --pa-btn-light-text: #{$btn-light-text};
388
+ --pc-btn-light-bg: #{$btn-light-bg};
389
+ --pc-btn-light-bg-hover: #{$btn-light-bg-hover};
390
+ --pc-btn-light-text: #{$btn-light-text};
446
391
 
447
392
  // Dark
448
- --pa-btn-dark-bg: #{$btn-dark-bg};
449
- --pa-btn-dark-bg-hover: #{$btn-dark-bg-hover};
450
- --pa-btn-dark-text: #{$btn-dark-text};
451
-
452
- // =========================================================================
453
- // CONTEXTUAL/SEMANTIC COLORS
454
- // =========================================================================
455
-
456
- // Success — bg references role colour for runtime cascade.
457
- // -light/-subtle/-border derive from --pa-success at runtime so theme overrides cascade.
458
- // -hover stays compile-time (color.adjust-derived darker shade, not opacity-based).
459
- --pa-success-bg: var(--pa-success);
460
- --pa-success-bg-hover: #{$success-bg-hover};
461
- --pa-success-bg-light: color-mix(in srgb, var(--pa-success) 10%, transparent);
462
- --pa-success-bg-subtle: color-mix(in srgb, var(--pa-success) 8%, transparent);
463
- --pa-success-border: color-mix(in srgb, var(--pa-success) 20%, transparent);
464
- --pa-success-text: #{$success-text};
465
- --pa-success-text-light: #{$success-text-light};
466
-
467
- // Danger — bg references role colour for runtime cascade.
468
- --pa-danger-bg: var(--pa-danger);
469
- --pa-danger-bg-hover: #{$danger-bg-hover};
470
- --pa-danger-bg-light: color-mix(in srgb, var(--pa-danger) 10%, transparent);
471
- --pa-danger-bg-subtle: color-mix(in srgb, var(--pa-danger) 8%, transparent);
472
- --pa-danger-border: color-mix(in srgb, var(--pa-danger) 20%, transparent);
473
- --pa-danger-text: #{$danger-text};
474
- --pa-danger-text-light: #{$danger-text-light};
475
-
476
- // Warning — bg references role colour for runtime cascade.
477
- --pa-warning-bg: var(--pa-warning);
478
- --pa-warning-bg-hover: #{$warning-bg-hover};
479
- --pa-warning-bg-light: color-mix(in srgb, var(--pa-warning) 10%, transparent);
480
- --pa-warning-bg-subtle: color-mix(in srgb, var(--pa-warning) 8%, transparent);
481
- --pa-warning-border: color-mix(in srgb, var(--pa-warning) 20%, transparent);
482
- --pa-warning-text: #{$warning-text};
483
- --pa-warning-text-light: #{$warning-text-light};
484
-
485
- // Info — bg references role colour for runtime cascade.
486
- --pa-info-bg: var(--pa-info);
487
- --pa-info-bg-hover: #{$info-bg-hover};
488
- --pa-info-bg-light: color-mix(in srgb, var(--pa-info) 10%, transparent);
489
- --pa-info-bg-subtle: color-mix(in srgb, var(--pa-info) 8%, transparent);
490
- --pa-info-border: color-mix(in srgb, var(--pa-info) 20%, transparent);
491
- --pa-info-text: #{$info-text};
492
- --pa-info-text-light: #{$info-text-light};
393
+ --pc-btn-dark-bg: #{$btn-dark-bg};
394
+ --pc-btn-dark-bg-hover: #{$btn-dark-bg-hover};
395
+ --pc-btn-dark-text: #{$btn-dark-text};
396
+
397
+ // =========================================================================
398
+ // CONTEXTUAL/SEMANTIC SURFACES — derive from the base role identities.
399
+ // -bg/-light/-subtle/-border derive at runtime so theme overrides cascade;
400
+ // -bg-hover / -text-light stay compile-time. (The role text colours
401
+ // --pc-{success,danger,warning,info}-text live in the base contract.)
402
+ // =========================================================================
403
+ --pc-success-bg: var(--pc-success);
404
+ --pc-success-bg-hover: #{$success-bg-hover};
405
+ --pc-success-bg-light: color-mix(in srgb, var(--pc-success) 10%, transparent);
406
+ --pc-success-bg-subtle: color-mix(in srgb, var(--pc-success) 8%, transparent);
407
+ --pc-success-border: color-mix(in srgb, var(--pc-success) 20%, transparent);
408
+ --pc-success-text-light: #{$success-text-light};
409
+
410
+ --pc-danger-bg: var(--pc-danger);
411
+ --pc-danger-bg-hover: #{$danger-bg-hover};
412
+ --pc-danger-bg-light: color-mix(in srgb, var(--pc-danger) 10%, transparent);
413
+ --pc-danger-bg-subtle: color-mix(in srgb, var(--pc-danger) 8%, transparent);
414
+ --pc-danger-border: color-mix(in srgb, var(--pc-danger) 20%, transparent);
415
+ --pc-danger-text-light: #{$danger-text-light};
416
+
417
+ --pc-warning-bg: var(--pc-warning);
418
+ --pc-warning-bg-hover: #{$warning-bg-hover};
419
+ --pc-warning-bg-light: color-mix(in srgb, var(--pc-warning) 10%, transparent);
420
+ --pc-warning-bg-subtle: color-mix(in srgb, var(--pc-warning) 8%, transparent);
421
+ --pc-warning-border: color-mix(in srgb, var(--pc-warning) 20%, transparent);
422
+ --pc-warning-text-light: #{$warning-text-light};
423
+
424
+ --pc-info-bg: var(--pc-info);
425
+ --pc-info-bg-hover: #{$info-bg-hover};
426
+ --pc-info-bg-light: color-mix(in srgb, var(--pc-info) 10%, transparent);
427
+ --pc-info-bg-subtle: color-mix(in srgb, var(--pc-info) 8%, transparent);
428
+ --pc-info-border: color-mix(in srgb, var(--pc-info) 20%, transparent);
429
+ --pc-info-text-light: #{$info-text-light};
493
430
 
494
431
  // =========================================================================
495
432
  // CARD COLORS
496
433
  // =========================================================================
497
- --pa-card-bg: #{$card-bg};
498
- --pa-card-header-bg: #{$card-header-bg};
499
- --pa-card-footer-bg: #{$card-footer-bg};
500
- --pa-card-tabs-bg: #{$card-tabs-bg};
434
+ --pc-card-bg: #{$card-bg};
435
+ --pc-card-header-bg: #{$card-header-bg};
436
+ --pc-card-footer-bg: #{$card-footer-bg};
437
+ --pc-card-tabs-bg: #{$card-tabs-bg};
501
438
 
502
439
  // =========================================================================
503
440
  // INPUT/FORM COLORS
504
441
  // =========================================================================
505
- --pa-input-bg: #{$input-bg};
506
- --pa-input-border: #{$input-border};
507
- --pa-input-text: #{$input-text};
508
- --pa-input-focus-border-color: #{$input-focus-border-color};
509
- --pa-select-focus-border-color: #{$select-focus-border-color};
510
- --pa-textarea-focus-border-color: #{$textarea-focus-border-color};
442
+ --pc-input-bg: #{$input-bg};
443
+ --pc-input-border: #{$input-border};
444
+ --pc-input-text: #{$input-text};
445
+ --pc-input-focus-border-color: #{$input-focus-border-color};
446
+ --pc-select-focus-border-color: #{$select-focus-border-color};
447
+ --pc-textarea-focus-border-color: #{$textarea-focus-border-color};
511
448
 
512
449
  // Checkbox
513
- --pa-checkbox-border-color: #{$checkbox-border-color};
514
- --pa-checkbox-border-color-hover: #{$checkbox-border-color-hover};
515
- --pa-checkbox-border-color-checked: #{$checkbox-border-color-checked};
516
- --pa-checkbox-bg: #{$checkbox-bg};
517
- --pa-checkbox-bg-checked: #{$checkbox-bg-checked};
518
- --pa-checkbox-bg-indeterminate: #{$checkbox-bg-indeterminate};
519
- --pa-checkbox-checkmark-color: #{$checkbox-checkmark-color};
520
- --pa-checkbox-focus-shadow: #{$checkbox-focus-shadow};
450
+ --pc-checkbox-border-color: #{$checkbox-border-color};
451
+ --pc-checkbox-border-color-hover: #{$checkbox-border-color-hover};
452
+ --pc-checkbox-border-color-checked: #{$checkbox-border-color-checked};
453
+ --pc-checkbox-bg: #{$checkbox-bg};
454
+ --pc-checkbox-bg-checked: #{$checkbox-bg-checked};
455
+ --pc-checkbox-bg-indeterminate: #{$checkbox-bg-indeterminate};
456
+ --pc-checkbox-checkmark-color: #{$checkbox-checkmark-color};
457
+ --pc-checkbox-focus-shadow: #{$checkbox-focus-shadow};
521
458
 
522
459
  // Input group
523
- --pa-input-group-prepend-bg: #{$input-group-prepend-bg};
524
- --pa-input-group-prepend-text: #{$input-group-prepend-text};
525
- --pa-input-group-append-bg: #{$input-group-append-bg};
526
- --pa-input-group-append-text: #{$input-group-append-text};
460
+ --pc-input-group-prepend-bg: #{$input-group-prepend-bg};
461
+ --pc-input-group-prepend-text: #{$input-group-prepend-text};
462
+ --pc-input-group-append-bg: #{$input-group-append-bg};
463
+ --pc-input-group-append-text: #{$input-group-append-text};
527
464
 
528
465
  // =========================================================================
529
466
  // TABLE COLORS
530
467
  // =========================================================================
531
- --pa-table-bg: #{$table-bg};
532
- --pa-table-header-bg: #{$table-header-bg};
533
- --pa-table-stripe: #{$table-stripe};
534
- --pa-table-hover-bg: #{$table-hover-bg};
535
- --pa-table-hover-accent-color: #{$table-hover-accent-color};
468
+ --pc-table-bg: #{$table-bg};
469
+ --pc-table-header-bg: #{$table-header-bg};
470
+ --pc-table-stripe: #{$table-stripe};
471
+ --pc-table-hover-bg: #{$table-hover-bg};
472
+ --pc-table-hover-accent-color: #{$table-hover-accent-color};
536
473
 
537
474
  // =========================================================================
538
475
  // MODAL COLORS
539
476
  // =========================================================================
540
- --pa-modal-overlay-bg: #{$modal-overlay-bg};
541
- --pa-modal-content-bg: #{$modal-content-bg};
542
-
543
- // =========================================================================
544
- // ALERT COLORS - Now derived via output-pa-alert-variables-light/dark mixins
545
- // Themes must call the appropriate mixin after output-pa-css-variables
546
- // =========================================================================
477
+ --pc-modal-overlay-bg: #{$modal-overlay-bg};
478
+ --pc-modal-content-bg: #{$modal-content-bg};
547
479
 
548
480
  // =========================================================================
549
481
  // BADGE COLORS
550
482
  // =========================================================================
551
- --pa-badge-success-bg: #{$badge-success-bg};
552
- --pa-badge-success-text: #{$badge-success-text};
553
- --pa-badge-warning-bg: #{$badge-warning-bg};
554
- --pa-badge-warning-text: #{$badge-warning-text};
555
- --pa-badge-info-bg: #{$badge-info-bg};
556
- --pa-badge-info-text: #{$badge-info-text};
557
- --pa-badge-danger-bg: #{$badge-danger-bg};
558
- --pa-badge-danger-text: #{$badge-danger-text};
483
+ --pc-badge-success-bg: #{$badge-success-bg};
484
+ --pc-badge-success-text: #{$badge-success-text};
485
+ --pc-badge-warning-bg: #{$badge-warning-bg};
486
+ --pc-badge-warning-text: #{$badge-warning-text};
487
+ --pc-badge-info-bg: #{$badge-info-bg};
488
+ --pc-badge-info-text: #{$badge-info-text};
489
+ --pc-badge-danger-bg: #{$badge-danger-bg};
490
+ --pc-badge-danger-text: #{$badge-danger-text};
559
491
 
560
492
  // Composite badge
561
- --pa-composite-badge-icon-bg: #{$composite-badge-icon-bg};
562
- --pa-composite-badge-label-bg: #{$composite-badge-label-bg};
563
- --pa-composite-badge-label-text: #{$composite-badge-label-text};
564
- --pa-composite-badge-label-hover-bg: #{$composite-badge-label-hover-bg};
493
+ --pc-composite-badge-icon-bg: #{$composite-badge-icon-bg};
494
+ --pc-composite-badge-label-bg: #{$composite-badge-label-bg};
495
+ --pc-composite-badge-label-text: #{$composite-badge-label-text};
496
+ --pc-composite-badge-label-hover-bg: #{$composite-badge-label-hover-bg};
565
497
 
566
498
  // =========================================================================
567
499
  // TOOLTIP & POPOVER COLORS
568
500
  // =========================================================================
569
- --pa-tooltip-bg: #{$tooltip-bg};
570
- --pa-tooltip-text: #{$tooltip-text};
571
- --pa-popover-content-bg: #{$popover-content-bg};
572
- --pa-popover-text-light: #{$popover-text-light};
573
- --pa-popover-text-dark: #{$popover-text-dark};
501
+ --pc-tooltip-bg: #{$tooltip-bg};
502
+ --pc-tooltip-text: #{$tooltip-text};
503
+ --pc-popover-content-bg: #{$popover-content-bg};
504
+ --pc-popover-text-light: #{$popover-text-light};
505
+ --pc-popover-text-dark: #{$popover-text-dark};
574
506
 
575
507
  // =========================================================================
576
508
  // LOADER COLORS
577
509
  // =========================================================================
578
- --pa-loader-overlay-bg: #{$loader-overlay-bg};
510
+ --pc-loader-overlay-bg: #{$loader-overlay-bg};
579
511
 
580
512
  // =========================================================================
581
513
  // PROFILE PANEL COLORS
582
514
  // =========================================================================
583
- --pa-profile-overlay-bg: #{$profile-overlay-bg};
515
+ --pc-profile-overlay-bg: #{$profile-overlay-bg};
584
516
 
585
517
  // =========================================================================
586
518
  // DETAIL PANEL COLORS
587
519
  // =========================================================================
588
- --pa-detail-panel-overlay-bg: #{$detail-panel-overlay-bg};
589
- --pa-detail-panel-selected-bg: #{$detail-panel-selected-bg};
590
- --pa-detail-panel-z-index: #{$detail-panel-z-index};
520
+ --pc-detail-panel-overlay-bg: #{$detail-panel-overlay-bg};
521
+ --pc-detail-panel-selected-bg: #{$detail-panel-selected-bg};
522
+ --pc-detail-panel-z-index: #{$detail-panel-z-index};
591
523
 
592
524
  // =========================================================================
593
525
  // COMMAND PALETTE COLORS
594
526
  // =========================================================================
595
- --pa-command-palette-backdrop-bg: #{$command-palette-backdrop-bg};
596
- --pa-command-palette-item-hover-bg: #{$command-palette-item-hover-bg};
597
- --pa-command-palette-item-active-bg: #{$command-palette-item-active-bg};
598
- --pa-command-palette-highlight-bg: #{$command-palette-highlight-bg};
599
- --pa-command-palette-highlight-text: #{$command-palette-highlight-text};
600
- --pa-command-palette-key-bg: #{$subtle-bg};
601
- --pa-command-palette-key-text: #{$text-color-1};
602
- --pa-command-palette-key-font-size: #{$font-size-xs};
603
- --pa-command-palette-key-font-weight: #{$font-weight-semibold};
527
+ --pc-command-palette-backdrop-bg: #{$command-palette-backdrop-bg};
528
+ --pc-command-palette-item-hover-bg: #{$command-palette-item-hover-bg};
529
+ --pc-command-palette-item-active-bg: #{$command-palette-item-active-bg};
530
+ --pc-command-palette-highlight-bg: #{$command-palette-highlight-bg};
531
+ --pc-command-palette-highlight-text: #{$command-palette-highlight-text};
532
+ --pc-command-palette-key-bg: #{$subtle-bg};
533
+ --pc-command-palette-key-text: #{$text-color-1};
534
+ --pc-command-palette-key-font-size: #{$font-size-xs};
535
+ --pc-command-palette-key-font-weight: #{$font-weight-semibold};
604
536
 
605
537
  // =========================================================================
606
538
  // MULTISELECT COLORS
607
539
  // =========================================================================
608
- --pa-multiselect-dropdown-bg: #{$multiselect-dropdown-bg};
609
- --pa-multiselect-dropdown-border: #{$multiselect-dropdown-border};
610
- --pa-multiselect-dropdown-text: #{$multiselect-dropdown-text};
611
- --pa-multiselect-hint-bg: #{$multiselect-hint-bg};
612
- --pa-multiselect-hint-border: #{$multiselect-hint-border};
613
- --pa-multiselect-option-hover-bg: #{$multiselect-option-hover-bg};
614
- --pa-multiselect-pill-bg: #{$multiselect-pill-bg};
615
- --pa-multiselect-pill-border: #{$multiselect-pill-border};
616
-
617
- // =========================================================================
618
- // CUSTOM THEME COLORS (1-9)
619
- // Themes can override $color-1 through $color-9 to define branded colors
620
- // =========================================================================
621
- --pa-color-1: #{$color-1};
622
- --pa-color-2: #{$color-2};
623
- --pa-color-3: #{$color-3};
624
- --pa-color-4: #{$color-4};
625
- --pa-color-5: #{$color-5};
626
- --pa-color-6: #{$color-6};
627
- --pa-color-7: #{$color-7};
628
- --pa-color-8: #{$color-8};
629
- --pa-color-9: #{$color-9};
630
-
631
- // Theme color slots - text/contrast colors
632
- --pa-color-1-text: #{$color-1-text};
633
- --pa-color-2-text: #{$color-2-text};
634
- --pa-color-3-text: #{$color-3-text};
635
- --pa-color-4-text: #{$color-4-text};
636
- --pa-color-5-text: #{$color-5-text};
637
- --pa-color-6-text: #{$color-6-text};
638
- --pa-color-7-text: #{$color-7-text};
639
- --pa-color-8-text: #{$color-8-text};
640
- --pa-color-9-text: #{$color-9-text};
641
-
642
- // =========================================================================
643
- // STRUCTURAL (themeable via CSS variables)
644
- // =========================================================================
645
- --pa-border-radius-sm: #{$border-radius-sm};
646
- --pa-border-radius: #{$border-radius};
647
- --pa-border-radius-lg: #{$border-radius-lg};
540
+ --pc-multiselect-dropdown-bg: #{$multiselect-dropdown-bg};
541
+ --pc-multiselect-dropdown-border: #{$multiselect-dropdown-border};
542
+ --pc-multiselect-dropdown-text: #{$multiselect-dropdown-text};
543
+ --pc-multiselect-hint-bg: #{$multiselect-hint-bg};
544
+ --pc-multiselect-hint-border: #{$multiselect-hint-border};
545
+ --pc-multiselect-option-hover-bg: #{$multiselect-option-hover-bg};
546
+ --pc-multiselect-pill-bg: #{$multiselect-pill-bg};
547
+ --pc-multiselect-pill-border: #{$multiselect-pill-border};
548
+
549
+ // =========================================================================
550
+ // FORM SPACING — the complete anatomy of a form's spacing. Runtime-tunable;
551
+ // the inline "gap" family chains to --pc-form-gap so one knob moves them all.
552
+ // VERTICAL RHYTHM: --pc-label-gap (label→control), --pc-help-gap
553
+ // (control→help), --pc-field-gap (field→field), --pc-form-actions-offset
554
+ // (last field→actions row).
555
+ // INLINE: --pc-form-gap (shared + label↔icon), --pc-choice-gap (between
556
+ // options), --pc-choice-inner-gap (control↔label), --pc-form-actions-gap
557
+ // (between buttons), --pc-field-horizontal-gap (label col↔input col).
558
+ // =========================================================================
559
+ --pc-form-gap: #{$form-gap};
560
+ --pc-choice-gap: var(--pc-form-gap);
561
+ --pc-choice-inner-gap: #{$spacing-sm};
562
+ --pc-form-actions-gap: var(--pc-form-gap);
563
+ --pc-field-horizontal-gap: #{$spacing-base};
564
+ --pc-label-gap: #{$form-label-margin-bottom};
565
+ --pc-help-gap: #{$form-help-margin-top};
566
+ --pc-field-gap: #{$form-group-margin-bottom};
567
+ --pc-form-actions-offset: #{$spacing-base};
568
+ }
569
+
570
+ // ============================================================================
571
+ // ALERT COLOR DERIVATION MIXINS — also pure-admin's contract (see above).
572
+ // ============================================================================
573
+ // Derive alert colours from the semantic role surfaces (--pc-success-bg, etc.)
574
+ // via color-mix(). Consumers call the light or dark variant after
575
+ // output-pc-component-variables. Light: dark text on subtle backgrounds.
576
+ // Dark: white text on tinted backgrounds. Not emitted by pure-css's own bundle.
577
+ // ============================================================================
578
+
579
+ // Light mode: dark text on subtle backgrounds
580
+ @mixin output-pc-alert-variables-light {
581
+ // Success
582
+ --pc-alert-success-text: color-mix(in srgb, var(--pc-success-bg) #{$alert-text-mix-light}, black);
583
+ --pc-alert-success-bg: color-mix(in srgb, var(--pc-success-bg) #{$alert-bg-opacity-light}%, transparent);
584
+ --pc-alert-success-border: color-mix(in srgb, var(--pc-success-bg) #{$alert-border-opacity-light}%, transparent);
585
+
586
+ // Danger
587
+ --pc-alert-danger-text: color-mix(in srgb, var(--pc-danger-bg) #{$alert-text-mix-light}, black);
588
+ --pc-alert-danger-bg: color-mix(in srgb, var(--pc-danger-bg) #{$alert-bg-opacity-light}%, transparent);
589
+ --pc-alert-danger-border: color-mix(in srgb, var(--pc-danger-bg) #{$alert-border-opacity-light}%, transparent);
590
+
591
+ // Warning
592
+ --pc-alert-warning-text: color-mix(in srgb, var(--pc-warning-bg) #{$alert-text-mix-light}, black);
593
+ --pc-alert-warning-bg: color-mix(in srgb, var(--pc-warning-bg) #{$alert-bg-opacity-light}%, transparent);
594
+ --pc-alert-warning-border: color-mix(in srgb, var(--pc-warning-bg) #{$alert-border-opacity-light}%, transparent);
595
+
596
+ // Info
597
+ --pc-alert-info-text: color-mix(in srgb, var(--pc-info-bg) #{$alert-text-mix-light}, black);
598
+ --pc-alert-info-bg: color-mix(in srgb, var(--pc-info-bg) #{$alert-bg-opacity-light}%, transparent);
599
+ --pc-alert-info-border: color-mix(in srgb, var(--pc-info-bg) #{$alert-border-opacity-light}%, transparent);
600
+ }
601
+
602
+ // Dark mode: white text on tinted backgrounds (white text is always readable)
603
+ @mixin output-pc-alert-variables-dark {
604
+ // Success
605
+ --pc-alert-success-text: #ffffff;
606
+ --pc-alert-success-bg: color-mix(in srgb, var(--pc-success-bg) #{$alert-bg-opacity-dark}%, transparent);
607
+ --pc-alert-success-border: color-mix(in srgb, var(--pc-success-bg) #{$alert-border-opacity-dark}%, transparent);
608
+
609
+ // Danger
610
+ --pc-alert-danger-text: #ffffff;
611
+ --pc-alert-danger-bg: color-mix(in srgb, var(--pc-danger-bg) #{$alert-bg-opacity-dark}%, transparent);
612
+ --pc-alert-danger-border: color-mix(in srgb, var(--pc-danger-bg) #{$alert-border-opacity-dark}%, transparent);
613
+
614
+ // Warning
615
+ --pc-alert-warning-text: #ffffff;
616
+ --pc-alert-warning-bg: color-mix(in srgb, var(--pc-warning-bg) #{$alert-bg-opacity-dark}%, transparent);
617
+ --pc-alert-warning-border: color-mix(in srgb, var(--pc-warning-bg) #{$alert-border-opacity-dark}%, transparent);
618
+
619
+ // Info
620
+ --pc-alert-info-text: #ffffff;
621
+ --pc-alert-info-bg: color-mix(in srgb, var(--pc-info-bg) #{$alert-bg-opacity-dark}%, transparent);
622
+ --pc-alert-info-border: color-mix(in srgb, var(--pc-info-bg) #{$alert-border-opacity-dark}%, transparent);
648
623
  }