@keenmate/pure-css 1.0.0-rc01
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +49 -0
- package/LICENSE +21 -0
- package/README.md +138 -0
- package/dist/css/base.css +304 -0
- package/dist/css/grid.css +1761 -0
- package/dist/css/pure-css.css +4839 -0
- package/dist/css/utilities.css +2773 -0
- package/package.json +62 -0
- package/src/scss/_base-css-variables.scss +648 -0
- package/src/scss/_fonts.scss +37 -0
- package/src/scss/_pa-grid.scss +292 -0
- package/src/scss/base.scss +15 -0
- package/src/scss/grid.scss +7 -0
- package/src/scss/pure-css.scss +28 -0
- package/src/scss/utilities.scss +759 -0
- package/src/scss/variables/_base.scss +232 -0
- package/src/scss/variables/_colors.scss +231 -0
- package/src/scss/variables/_components.scss +835 -0
- package/src/scss/variables/_index.scss +23 -0
- package/src/scss/variables/_layout.scss +65 -0
- package/src/scss/variables/_spacing.scss +78 -0
- package/src/scss/variables/_system.scss +89 -0
- package/src/scss/variables/_typography.scss +37 -0
|
@@ -0,0 +1,648 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// BASE CSS VARIABLES OUTPUT MIXIN
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// This mixin outputs all $base-* SCSS variables as --base-* CSS custom properties.
|
|
5
|
+
// Include this in themes to enable web component theming.
|
|
6
|
+
//
|
|
7
|
+
// Usage in theme file:
|
|
8
|
+
// @import '../base-css-variables';
|
|
9
|
+
// :root {
|
|
10
|
+
// @include output-base-css-variables;
|
|
11
|
+
// }
|
|
12
|
+
//
|
|
13
|
+
// Web components consume these via fallback chains:
|
|
14
|
+
// --ms-accent-color: var(--base-accent-color, #3b82f6);
|
|
15
|
+
// ============================================================================
|
|
16
|
+
|
|
17
|
+
// Make variables resolvable when this file is loaded as a @use module
|
|
18
|
+
// (e.g. from main.scss). Legacy @import callers (themes) are unaffected —
|
|
19
|
+
// Sass places @use'd members into the importing file's global scope, where
|
|
20
|
+
// theme-set overrides already live.
|
|
21
|
+
@use 'variables/index' as *;
|
|
22
|
+
|
|
23
|
+
@mixin output-base-css-variables {
|
|
24
|
+
// === Accent Colors ===
|
|
25
|
+
--base-accent-color: #{$base-accent-color};
|
|
26
|
+
--base-accent-color-hover: #{$base-accent-color-hover};
|
|
27
|
+
--base-accent-color-active: #{$base-accent-color-active};
|
|
28
|
+
--base-accent-color-light: #{$base-accent-color-light};
|
|
29
|
+
--base-accent-color-light-hover: #{$base-accent-color-light-hover};
|
|
30
|
+
|
|
31
|
+
// === Text Colors ===
|
|
32
|
+
--base-text-color-1: #{$base-text-color-1};
|
|
33
|
+
--base-text-color-2: #{$base-text-color-2};
|
|
34
|
+
--base-text-color-3: #{$base-text-color-3};
|
|
35
|
+
--base-text-color-4: #{$base-text-color-4};
|
|
36
|
+
--base-text-color-on-accent: #{$base-text-color-on-accent};
|
|
37
|
+
|
|
38
|
+
// === Background Colors (semantic) ===
|
|
39
|
+
--base-main-bg: #{$base-main-bg};
|
|
40
|
+
--base-page-bg: #{$base-page-bg};
|
|
41
|
+
--base-subtle-bg: #{$base-subtle-bg};
|
|
42
|
+
--base-inverse-bg: #{$base-inverse-bg};
|
|
43
|
+
--base-overlay-bg: #{$base-overlay-bg};
|
|
44
|
+
--base-shadow-color: #{$base-shadow-color};
|
|
45
|
+
--base-hover-bg: #{$base-hover-bg};
|
|
46
|
+
--base-active-bg: #{$base-active-bg};
|
|
47
|
+
--base-disabled-bg: #{$base-disabled-bg};
|
|
48
|
+
--base-elevated-bg: #{$base-elevated-bg};
|
|
49
|
+
|
|
50
|
+
// === Border Colors ===
|
|
51
|
+
--base-border-color: #{$base-border-color};
|
|
52
|
+
--base-border: #{$base-border};
|
|
53
|
+
|
|
54
|
+
// === Input Fields ===
|
|
55
|
+
--base-input-bg: #{$base-input-bg};
|
|
56
|
+
--base-input-color: #{$base-input-color};
|
|
57
|
+
--base-input-border: #{$base-input-border};
|
|
58
|
+
--base-input-border-hover: #{$base-input-border-hover};
|
|
59
|
+
--base-input-border-focus: #{$base-input-border-focus};
|
|
60
|
+
--base-input-placeholder-color: #{$base-input-placeholder-color};
|
|
61
|
+
--base-input-bg-disabled: #{$base-input-bg-disabled};
|
|
62
|
+
|
|
63
|
+
// === Input Size Heights ===
|
|
64
|
+
--base-input-size-xs-height: #{$base-input-size-xs-height};
|
|
65
|
+
--base-input-size-sm-height: #{$base-input-size-sm-height};
|
|
66
|
+
--base-input-size-md-height: #{$base-input-size-md-height};
|
|
67
|
+
--base-input-size-lg-height: #{$base-input-size-lg-height};
|
|
68
|
+
--base-input-size-xl-height: #{$base-input-size-xl-height};
|
|
69
|
+
|
|
70
|
+
// === Dropdown/Popover ===
|
|
71
|
+
--base-dropdown-bg: #{$base-dropdown-bg};
|
|
72
|
+
--base-dropdown-border: #{$base-dropdown-border};
|
|
73
|
+
--base-dropdown-box-shadow: #{$base-dropdown-box-shadow};
|
|
74
|
+
|
|
75
|
+
// === Tooltip ===
|
|
76
|
+
--base-tooltip-bg: #{$base-tooltip-bg};
|
|
77
|
+
--base-tooltip-text-color: #{$base-tooltip-text-color};
|
|
78
|
+
|
|
79
|
+
// === Contextual Colors - Success ===
|
|
80
|
+
--base-success-color: #{$base-success-color};
|
|
81
|
+
--base-success-color-hover: #{$base-success-color-hover};
|
|
82
|
+
--base-success-bg-light: #{$base-success-bg-light};
|
|
83
|
+
--base-success-bg-subtle: #{$base-success-bg-subtle};
|
|
84
|
+
--base-success-border: #{$base-success-border};
|
|
85
|
+
--base-success-text: #{$base-success-text};
|
|
86
|
+
--base-success-text-light: #{$base-success-text-light};
|
|
87
|
+
--base-text-on-success: #{$base-text-on-success};
|
|
88
|
+
|
|
89
|
+
// === Contextual Colors - Danger ===
|
|
90
|
+
--base-danger-color: #{$base-danger-color};
|
|
91
|
+
--base-danger-color-hover: #{$base-danger-color-hover};
|
|
92
|
+
--base-danger-bg-light: #{$base-danger-bg-light};
|
|
93
|
+
--base-danger-bg-subtle: #{$base-danger-bg-subtle};
|
|
94
|
+
--base-danger-border: #{$base-danger-border};
|
|
95
|
+
--base-danger-text: #{$base-danger-text};
|
|
96
|
+
--base-danger-text-light: #{$base-danger-text-light};
|
|
97
|
+
--base-text-on-danger: #{$base-text-on-danger};
|
|
98
|
+
|
|
99
|
+
// === Contextual Colors - Warning ===
|
|
100
|
+
--base-warning-color: #{$base-warning-color};
|
|
101
|
+
--base-warning-color-hover: #{$base-warning-color-hover};
|
|
102
|
+
--base-warning-bg-light: #{$base-warning-bg-light};
|
|
103
|
+
--base-warning-bg-subtle: #{$base-warning-bg-subtle};
|
|
104
|
+
--base-warning-border: #{$base-warning-border};
|
|
105
|
+
--base-warning-text: #{$base-warning-text};
|
|
106
|
+
--base-warning-text-light: #{$base-warning-text-light};
|
|
107
|
+
--base-text-on-warning: #{$base-text-on-warning};
|
|
108
|
+
|
|
109
|
+
// === Contextual Colors - Info ===
|
|
110
|
+
--base-info-color: #{$base-info-color};
|
|
111
|
+
--base-info-color-hover: #{$base-info-color-hover};
|
|
112
|
+
--base-info-bg-light: #{$base-info-bg-light};
|
|
113
|
+
--base-info-bg-subtle: #{$base-info-bg-subtle};
|
|
114
|
+
--base-info-border: #{$base-info-border};
|
|
115
|
+
--base-info-text: #{$base-info-text};
|
|
116
|
+
--base-info-text-light: #{$base-info-text-light};
|
|
117
|
+
--base-text-on-info: #{$base-text-on-info};
|
|
118
|
+
|
|
119
|
+
// === Interactive States ===
|
|
120
|
+
--base-hover-overlay: #{$base-hover-overlay};
|
|
121
|
+
--base-active-overlay: #{$base-active-overlay};
|
|
122
|
+
--base-focus-ring-color: #{$base-focus-ring-color};
|
|
123
|
+
--base-focus-ring-width: #{$base-focus-ring-width};
|
|
124
|
+
|
|
125
|
+
// === Typography ===
|
|
126
|
+
--base-font-family: #{$base-font-family};
|
|
127
|
+
--base-font-family-mono: #{$base-font-family-mono};
|
|
128
|
+
--base-font-size-2xs: #{$base-font-size-2xs};
|
|
129
|
+
--base-font-size-xs: #{$base-font-size-xs};
|
|
130
|
+
--base-font-size-sm: #{$base-font-size-sm};
|
|
131
|
+
--base-font-size-base: #{$base-font-size-base};
|
|
132
|
+
--base-font-size-lg: #{$base-font-size-lg};
|
|
133
|
+
--base-font-size-xl: #{$base-font-size-xl};
|
|
134
|
+
--base-font-size-2xl: #{$base-font-size-2xl};
|
|
135
|
+
--base-font-weight-normal: #{$base-font-weight-normal};
|
|
136
|
+
--base-font-weight-medium: #{$base-font-weight-medium};
|
|
137
|
+
--base-font-weight-semibold: #{$base-font-weight-semibold};
|
|
138
|
+
--base-font-weight-bold: #{$base-font-weight-bold};
|
|
139
|
+
--base-line-height-tight: #{$base-line-height-tight};
|
|
140
|
+
--base-line-height-normal: #{$base-line-height-normal};
|
|
141
|
+
--base-line-height-relaxed: #{$base-line-height-relaxed};
|
|
142
|
+
|
|
143
|
+
// === Border Radius ===
|
|
144
|
+
--base-border-radius-sm: #{$base-border-radius-sm};
|
|
145
|
+
--base-border-radius-md: #{$base-border-radius-md};
|
|
146
|
+
--base-border-radius-lg: #{$base-border-radius-lg};
|
|
147
|
+
}
|
|
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
|
+
// ============================================================================
|
|
209
|
+
// DERIVED TOKENS — TEXT CONTRAST TIERS + SURFACE TINTS
|
|
210
|
+
// ============================================================================
|
|
211
|
+
// These tokens use `color-mix(... var(--pa-text-color-1) ...)` to derive
|
|
212
|
+
// 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
|
|
214
|
+
// substitution bakes nested var() references at the *defining element*, not
|
|
215
|
+
// the using element. If we only defined these at `:root, .pa-mode-light`,
|
|
216
|
+
// 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
|
|
218
|
+
// inherit the light-mode-baked tier values → low contrast on dark surfaces.
|
|
219
|
+
//
|
|
220
|
+
// 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 —
|
|
223
|
+
// regardless of which class layout each theme uses for mode switching.
|
|
224
|
+
//
|
|
225
|
+
// This is a TOP-LEVEL rule (not inside the mixin) because themes only call
|
|
226
|
+
// the mixin from their light-mode block; they don't call it again in the
|
|
227
|
+
// dark-mode block. Emitting at framework level means themes get correct
|
|
228
|
+
// dark-mode tiers without changing any theme code.
|
|
229
|
+
//
|
|
230
|
+
// Override these per-theme by redefining them in the same scope you
|
|
231
|
+
// override --pa-text-color-1.
|
|
232
|
+
// ============================================================================
|
|
233
|
+
|
|
234
|
+
: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);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// ============================================================================
|
|
245
|
+
// PURE ADMIN THEME CSS VARIABLES OUTPUT MIXIN
|
|
246
|
+
// ============================================================================
|
|
247
|
+
// This mixin outputs all themeable SCSS variables as --pa-* CSS custom properties.
|
|
248
|
+
// Components use var(--pa-*) for runtime theme switching capability.
|
|
249
|
+
//
|
|
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
|
+
// }
|
|
257
|
+
// ============================================================================
|
|
258
|
+
|
|
259
|
+
@mixin output-pa-css-variables {
|
|
260
|
+
// =========================================================================
|
|
261
|
+
// COLOR SCHEME SIGNAL
|
|
262
|
+
// 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
|
+
// =========================================================================
|
|
270
|
+
color-scheme: #{$theme-color-scheme};
|
|
271
|
+
|
|
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};
|
|
280
|
+
|
|
281
|
+
// Text colors
|
|
282
|
+
--pa-text-color-1: #{$text-color-1};
|
|
283
|
+
--pa-text-color-2: #{$text-color-2};
|
|
284
|
+
|
|
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);
|
|
291
|
+
|
|
292
|
+
// 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);
|
|
376
|
+
|
|
377
|
+
// =========================================================================
|
|
378
|
+
// LAYOUT COLORS
|
|
379
|
+
// =========================================================================
|
|
380
|
+
|
|
381
|
+
// Header
|
|
382
|
+
--pa-header-bg: #{$header-bg};
|
|
383
|
+
--pa-header-border-color: #{$header-border-color};
|
|
384
|
+
--pa-header-text: #{$header-text};
|
|
385
|
+
--pa-header-text-secondary: #{$header-text-secondary};
|
|
386
|
+
--pa-header-profile-name-color: #{$header-profile-name-color};
|
|
387
|
+
|
|
388
|
+
// 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};
|
|
396
|
+
|
|
397
|
+
// Footer
|
|
398
|
+
--pa-footer-bg: #{$footer-bg};
|
|
399
|
+
--pa-footer-border-color: #{$footer-border-color};
|
|
400
|
+
|
|
401
|
+
// =========================================================================
|
|
402
|
+
// BUTTON COLORS
|
|
403
|
+
// =========================================================================
|
|
404
|
+
|
|
405
|
+
// 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};
|
|
411
|
+
|
|
412
|
+
// 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);
|
|
421
|
+
|
|
422
|
+
// 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};
|
|
426
|
+
|
|
427
|
+
// 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};
|
|
431
|
+
|
|
432
|
+
// 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};
|
|
436
|
+
|
|
437
|
+
// 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};
|
|
441
|
+
|
|
442
|
+
// 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};
|
|
446
|
+
|
|
447
|
+
// 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};
|
|
493
|
+
|
|
494
|
+
// =========================================================================
|
|
495
|
+
// CARD COLORS
|
|
496
|
+
// =========================================================================
|
|
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};
|
|
501
|
+
|
|
502
|
+
// =========================================================================
|
|
503
|
+
// INPUT/FORM COLORS
|
|
504
|
+
// =========================================================================
|
|
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};
|
|
511
|
+
|
|
512
|
+
// 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};
|
|
521
|
+
|
|
522
|
+
// 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};
|
|
527
|
+
|
|
528
|
+
// =========================================================================
|
|
529
|
+
// TABLE COLORS
|
|
530
|
+
// =========================================================================
|
|
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};
|
|
536
|
+
|
|
537
|
+
// =========================================================================
|
|
538
|
+
// MODAL COLORS
|
|
539
|
+
// =========================================================================
|
|
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
|
+
// =========================================================================
|
|
547
|
+
|
|
548
|
+
// =========================================================================
|
|
549
|
+
// BADGE COLORS
|
|
550
|
+
// =========================================================================
|
|
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};
|
|
559
|
+
|
|
560
|
+
// 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};
|
|
565
|
+
|
|
566
|
+
// =========================================================================
|
|
567
|
+
// TOOLTIP & POPOVER COLORS
|
|
568
|
+
// =========================================================================
|
|
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};
|
|
574
|
+
|
|
575
|
+
// =========================================================================
|
|
576
|
+
// LOADER COLORS
|
|
577
|
+
// =========================================================================
|
|
578
|
+
--pa-loader-overlay-bg: #{$loader-overlay-bg};
|
|
579
|
+
|
|
580
|
+
// =========================================================================
|
|
581
|
+
// PROFILE PANEL COLORS
|
|
582
|
+
// =========================================================================
|
|
583
|
+
--pa-profile-overlay-bg: #{$profile-overlay-bg};
|
|
584
|
+
|
|
585
|
+
// =========================================================================
|
|
586
|
+
// DETAIL PANEL COLORS
|
|
587
|
+
// =========================================================================
|
|
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};
|
|
591
|
+
|
|
592
|
+
// =========================================================================
|
|
593
|
+
// COMMAND PALETTE COLORS
|
|
594
|
+
// =========================================================================
|
|
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};
|
|
604
|
+
|
|
605
|
+
// =========================================================================
|
|
606
|
+
// MULTISELECT COLORS
|
|
607
|
+
// =========================================================================
|
|
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};
|
|
648
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/* Pure Admin Visual Framework - Default Font Definitions */
|
|
2
|
+
|
|
3
|
+
// Default framework fonts - themes can override these
|
|
4
|
+
// Note: Font size classes for <html> are in _utilities.scss (use px values for correct rem scaling)
|
|
5
|
+
|
|
6
|
+
// Font family classes with system defaults
|
|
7
|
+
.font-family-system {
|
|
8
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
|
9
|
+
|
|
10
|
+
*, h1, h2, h3, h4, h5, h6, p, div, span, button, input, textarea, select {
|
|
11
|
+
font-family: inherit;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.font-family-sans {
|
|
16
|
+
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
17
|
+
|
|
18
|
+
*, h1, h2, h3, h4, h5, h6, p, div, span, button, input, textarea, select {
|
|
19
|
+
font-family: inherit;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.font-family-serif {
|
|
24
|
+
font-family: Georgia, "Times New Roman", Times, serif;
|
|
25
|
+
|
|
26
|
+
*, h1, h2, h3, h4, h5, h6, p, div, span, button, input, textarea, select {
|
|
27
|
+
font-family: inherit;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.font-family-mono {
|
|
32
|
+
font-family: "Courier New", Courier, monospace;
|
|
33
|
+
|
|
34
|
+
*, h1, h2, h3, h4, h5, h6, p, div, span, button, input, textarea, select {
|
|
35
|
+
font-family: inherit;
|
|
36
|
+
}
|
|
37
|
+
}
|