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

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 CHANGED
@@ -3,6 +3,60 @@
3
3
  All notable changes to `@keenmate/pure-css` are documented here. Format based on
4
4
  [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
5
5
 
6
+ ## [1.0.0-rc03] — 2026-08-21 [PUBLISHED]
7
+
8
+ ### Changed
9
+
10
+ - **BREAKING — renamed the top-bar region tokens from `header` to `navbar`.** The
11
+ foundation's top-region tokens named the bar as a *component block* rather than a
12
+ layout region, which read as misleading once pure-admin's navbar component dropped its
13
+ legacy `pa-header__*` block naming. Renamed:
14
+ - SCSS variables: `$header-height` → `$navbar-height`, `$header-bg` → `$navbar-bg`,
15
+ `$header-border-color` → `$navbar-border-color`, `$header-text` → `$navbar-text`,
16
+ `$header-text-secondary` → `$navbar-text-secondary`,
17
+ `$header-profile-name-color` → `$navbar-profile-name-color`,
18
+ `$z-index-header` → `$z-index-navbar`.
19
+ - CSS variables: `--pa-header-bg` → `--pa-navbar-bg`,
20
+ `--pa-header-border-color` → `--pa-navbar-border-color`,
21
+ `--pa-header-text` → `--pa-navbar-text`,
22
+ `--pa-header-text-secondary` → `--pa-navbar-text-secondary`,
23
+ `--pa-header-profile-name-color` → `--pa-navbar-profile-name-color`.
24
+ - `$footer-height` still mirrors the bar height (now `$navbar-height`); component-header
25
+ tokens (`$card-header-*`, `$table-header-*`) are unaffected.
26
+
27
+ ### Removed
28
+
29
+ - **Dead `$header-brand-padding-left` variable.** Superseded by the navbar's flex `gap`;
30
+ no live rule consumed it (only a stale comment referenced it).
31
+
32
+ ## [1.0.0-rc02] — 2026-08-05 [PUBLISHED]
33
+
34
+ ### Added
35
+
36
+ - **Reboot layer (`reboot.scss`) — the reset the foundation always assumed.** Emits
37
+ `html { font-size: 10px }` (the 10px rem base every pure-css rem value is authored
38
+ against — `$font-size-base: 1.6rem` is 16px *only* at a 10px root), a `box-sizing:
39
+ border-box` reset, neutral base styling for standard elements (headings, paragraphs,
40
+ links, lists, blockquotes, `hr`, `figure`), the `body` font/colour/background, and the
41
+ `button/input/select/textarea/label { font: inherit }` reset. Relocated from
42
+ pure-admin-core's `core-components/_base.scss` so it sits with the rem-scale variables
43
+ that depend on it. Analogous to Bootstrap's Reboot.
44
+ - **New `reboot.css` build artifact** + `./reboot` export, and `reboot` is now part of the
45
+ `pure-css.css` bundle (emitted before grid/utilities).
46
+ - **Themed scrollbars (`scrollbars.scss`).** The global `*::-webkit-scrollbar` + Firefox
47
+ `scrollbar-width`/`scrollbar-color` styling (thin scrollbars coloured from the `--pa-*`
48
+ cascade), relocated from pure-admin-core's `core-components/_scrollbars.scss`. Global browser
49
+ chrome belongs with the foundation's consistent-appearance promise, so a standalone pure-css
50
+ page gets the same themed scrollbars as a full pure-admin app instead of native ones. Part of
51
+ the `pure-css.css` bundle, plus a standalone `scrollbars.css` artifact + `./scrollbars` export.
52
+
53
+ ### Fixed
54
+
55
+ - **Standalone consumers no longer render 1.6× too large.** Before, the 10px base lived
56
+ only in pure-admin-core, so a page linking `pure-css.css` (or `base.css`) on its own
57
+ inherited the browser's 16px root and every rem was 1.6× oversized. The bundle now ships
58
+ the 10px base itself, so the sizing scale is correct out of the box.
59
+
6
60
  ## [1.0.0-rc01] — 2026-08-04
7
61
 
8
62
  Initial extraction of the CSS foundation out of `@keenmate/pure-admin-core`.
package/README.md CHANGED
@@ -4,29 +4,24 @@ The KeenMate CSS **foundation** — the `--base-*` theming contract, the flexbox
4
4
  utility classes — extracted from [`@keenmate/pure-admin-core`](https://github.com/KeenMate/pure-admin)
5
5
  so it can be consumed on its own.
6
6
 
7
- ## What's New in 1.0.0-rc01
8
-
9
- - **The KeenMate CSS foundation, now standalone.** The `--base-*` theming
10
- contract, the PureCSS grid, and the utility classesextracted from
11
- `@keenmate/pure-admin-core` so a docs site, marketing page, or component host
12
- can use the foundation without the 40+ admin components.
13
- - **One theming layer everyone shares.** `--base-*` is the single source of
14
- truth; `pure-admin-core`, its `--pa-*` component variables, and every KeenMate
15
- web/Svelte component derive from it via fallback chains so one block of
16
- `--base-*` overrides re-themes all of them at once.
17
- - **Four link targets.** `pure-css.css` (everything) or cherry-pick `base.css`
18
- (variables only), `grid.css`, `utilities.css`.
19
- - **The native `.pa-row` / `.pa-col` grid** flexbox columns in 5% percentage
20
- increments plus intuitive fractions (`.pa-col-1-3`, `.pa-col-2-3`, …), with
21
- container-query responsive variants (`.pa-col-md-*`) and RTL-aware gutters.
22
- (This replaces the legacy PureCSS `.pure-g` / `.pure-u-*` grid, which
23
- pure-admin had already stopped using.)
24
- - **New `.gap-*` / `.gap-x-*` / `.gap-y-*` utilities** on the same spacing scale
25
- as the margin/padding helpers — the one spacing family core lacked.
26
- - **Self-sufficient border/rounded utilities.** `.border` / `.rounded` consume
27
- the emitted `--pa-border-*` variables, so `base.css` + `utilities.css` render
28
- correct borders and radii standalone — no host stylesheet required.
29
- - **`dist/` is committed** — vendor the built CSS with no Sass toolchain.
7
+ ## What's New in 1.0.0-rc03
8
+
9
+ - **Theming contract top-bar region tokens renamed from `header` to `navbar` (BREAKING).** The foundation's top-region tokens named the bar as a *component block* (`header`) rather than the layout region it actually is, which read as misleading once pure-admin's navbar component dropped its legacy `pa-header__*` block naming. Every top-bar token is renamed on both sides of the cascade: the `$header-*` SCSS source variables (`$header-height` → `$navbar-height`, `$header-bg` → `$navbar-bg`, `$header-border-color`, `$header-text`, `$header-text-secondary`, `$header-profile-name-color`, and `$z-index-header` → `$z-index-navbar`) and the emitted `--pa-header-*` custom properties (`--pa-navbar-bg`, `--pa-navbar-border-color`, `--pa-navbar-text`, `--pa-navbar-text-secondary`, `--pa-navbar-profile-name-color`). Consumers reading the old names must update — `$footer-height` still mirrors the bar height (now `$navbar-height`), and the component-header tokens (`$card-header-*`, `$table-header-*`) are deliberately untouched since those *are* component blocks.
10
+ - **Removed the dead `$header-brand-padding-left` variable.** It was superseded by the navbar's flex `gap`; no live rule consumed it only a stale comment still referenced it — so it's gone from the source of truth.
11
+
12
+ ## What's New in 1.0.0-rc02
13
+
14
+ - **Reboot layer the 10px base is now built in.** pure-css ships
15
+ `html { font-size: 10px }` (plus a `box-sizing` reset and neutral base element
16
+ styling) via the new `reboot.scss`, included in the `pure-css.css` bundle and
17
+ available standalone as `reboot.css` / the `./reboot` export. Every pure-css
18
+ rem value assumes a 10px root, so previously a standalone consumer rendered
19
+ everything 1.6× too large until they added the base themselves now it just
20
+ works out of the box.
21
+ - **Themed scrollbars, foundation-wide.** The global thin-scrollbar styling
22
+ (`scrollbars.scss`, coloured from the `--pa-*` cascade) moved out of
23
+ pure-admin-core, so a standalone pure-css page gets the same scrollbars as a
24
+ full admin app. In the bundle, or cherry-pick `scrollbars.css` / `./scrollbars`.
30
25
 
31
26
  ## Why
32
27
 
package/dist/css/base.css CHANGED
@@ -132,11 +132,11 @@
132
132
  --pa-detail-row-label: rgba(255, 255, 255, 0.75);
133
133
  --pa-detail-title: rgba(255, 255, 255, 0.55);
134
134
  --pa-detail-shadow: 0 1.4rem 3.6rem rgba(0, 0, 0, 0.55);
135
- --pa-header-bg: #ffffff;
136
- --pa-header-border-color: #e1e5e9;
137
- --pa-header-text: #2c3e50;
138
- --pa-header-text-secondary: #6c757d;
139
- --pa-header-profile-name-color: #2c3e50;
135
+ --pa-navbar-bg: #ffffff;
136
+ --pa-navbar-border-color: #e1e5e9;
137
+ --pa-navbar-text: #2c3e50;
138
+ --pa-navbar-text-secondary: #6c757d;
139
+ --pa-navbar-profile-name-color: #2c3e50;
140
140
  --pa-sidebar-bg: #f8f9fa;
141
141
  --pa-sidebar-text: #2c3e50;
142
142
  --pa-sidebar-text-secondary: #6c757d;
@@ -8,6 +8,134 @@
8
8
  --pa-surface-track: color-mix(in srgb, var(--pa-text-color-1) 12%, transparent);
9
9
  }
10
10
 
11
+ html {
12
+ font-size: 10px;
13
+ }
14
+
15
+ * {
16
+ box-sizing: border-box;
17
+ }
18
+
19
+ h1, h2, h3, h4, h5, h6 {
20
+ margin: 2.4rem 0 0.8rem 0;
21
+ padding: 0;
22
+ }
23
+
24
+ p {
25
+ margin: 0 0 1.6rem 0;
26
+ padding: 0;
27
+ }
28
+
29
+ :where(a) {
30
+ color: var(--pa-link-color);
31
+ text-decoration: underline;
32
+ }
33
+
34
+ :where(a:hover) {
35
+ color: var(--pa-link-color-hover);
36
+ }
37
+
38
+ :where(a:visited) {
39
+ color: var(--pa-link-color-visited);
40
+ }
41
+
42
+ ul, ol {
43
+ margin: 0 0 1.6rem 0;
44
+ padding: 0;
45
+ padding-inline-start: 3.2rem;
46
+ }
47
+ ul li, ol li {
48
+ margin-bottom: 0.4rem;
49
+ }
50
+
51
+ ul.unstyled, ol.unstyled {
52
+ list-style: none;
53
+ padding-inline-start: 0;
54
+ }
55
+ ul.unstyled li, ol.unstyled li {
56
+ margin-bottom: 0;
57
+ }
58
+
59
+ dl {
60
+ margin: 0 0 1.6rem 0;
61
+ padding: 0;
62
+ }
63
+
64
+ dd {
65
+ margin: 0;
66
+ padding: 0;
67
+ }
68
+
69
+ blockquote {
70
+ margin: 1.6rem 0 1.6rem 0;
71
+ padding-inline-start: 2.4rem;
72
+ }
73
+
74
+ pre {
75
+ overflow-x: auto;
76
+ }
77
+
78
+ hr {
79
+ margin: 2.4rem 0 2.4rem 0;
80
+ }
81
+
82
+ figure {
83
+ margin: 1.6rem 0 1.6rem 0;
84
+ padding: 0;
85
+ }
86
+
87
+ body {
88
+ margin: 0;
89
+ padding: 0;
90
+ font-family: var(--base-font-family);
91
+ font-size: 1.6rem;
92
+ color: var(--pa-text-color-1);
93
+ background-color: var(--pa-main-bg);
94
+ line-height: 1.5;
95
+ }
96
+
97
+ button,
98
+ input,
99
+ select,
100
+ textarea,
101
+ label {
102
+ font-family: inherit;
103
+ font-size: inherit;
104
+ }
105
+
106
+ /* Webkit browsers (Chrome, Safari, Edge) */
107
+ *::-webkit-scrollbar {
108
+ width: 6px;
109
+ height: 6px;
110
+ }
111
+
112
+ *::-webkit-scrollbar-track {
113
+ background: var(--pa-main-bg);
114
+ border-radius: var(--pa-border-radius-sm);
115
+ }
116
+
117
+ *::-webkit-scrollbar-thumb {
118
+ background: var(--pa-border-color);
119
+ border-radius: var(--pa-border-radius-sm);
120
+ border: 1px solid var(--pa-main-bg);
121
+ }
122
+ *::-webkit-scrollbar-thumb:hover {
123
+ background: var(--pa-accent);
124
+ }
125
+ *::-webkit-scrollbar-thumb:active {
126
+ background: var(--pa-accent-hover);
127
+ }
128
+
129
+ *::-webkit-scrollbar-corner {
130
+ background: var(--pa-main-bg);
131
+ }
132
+
133
+ /* Firefox */
134
+ * {
135
+ scrollbar-width: thin;
136
+ scrollbar-color: var(--pa-border-color) var(--pa-main-bg);
137
+ }
138
+
11
139
  .pa-row {
12
140
  display: flex;
13
141
  flex-wrap: wrap;
@@ -4667,11 +4795,11 @@
4667
4795
  --pa-detail-row-label: rgba(255, 255, 255, 0.75);
4668
4796
  --pa-detail-title: rgba(255, 255, 255, 0.55);
4669
4797
  --pa-detail-shadow: 0 1.4rem 3.6rem rgba(0, 0, 0, 0.55);
4670
- --pa-header-bg: #ffffff;
4671
- --pa-header-border-color: #e1e5e9;
4672
- --pa-header-text: #2c3e50;
4673
- --pa-header-text-secondary: #6c757d;
4674
- --pa-header-profile-name-color: #2c3e50;
4798
+ --pa-navbar-bg: #ffffff;
4799
+ --pa-navbar-border-color: #e1e5e9;
4800
+ --pa-navbar-text: #2c3e50;
4801
+ --pa-navbar-text-secondary: #6c757d;
4802
+ --pa-navbar-profile-name-color: #2c3e50;
4675
4803
  --pa-sidebar-bg: #f8f9fa;
4676
4804
  --pa-sidebar-text: #2c3e50;
4677
4805
  --pa-sidebar-text-secondary: #6c757d;
@@ -0,0 +1,94 @@
1
+ html {
2
+ font-size: 10px;
3
+ }
4
+
5
+ * {
6
+ box-sizing: border-box;
7
+ }
8
+
9
+ h1, h2, h3, h4, h5, h6 {
10
+ margin: 2.4rem 0 0.8rem 0;
11
+ padding: 0;
12
+ }
13
+
14
+ p {
15
+ margin: 0 0 1.6rem 0;
16
+ padding: 0;
17
+ }
18
+
19
+ :where(a) {
20
+ color: var(--pa-link-color);
21
+ text-decoration: underline;
22
+ }
23
+
24
+ :where(a:hover) {
25
+ color: var(--pa-link-color-hover);
26
+ }
27
+
28
+ :where(a:visited) {
29
+ color: var(--pa-link-color-visited);
30
+ }
31
+
32
+ ul, ol {
33
+ margin: 0 0 1.6rem 0;
34
+ padding: 0;
35
+ padding-inline-start: 3.2rem;
36
+ }
37
+ ul li, ol li {
38
+ margin-bottom: 0.4rem;
39
+ }
40
+
41
+ ul.unstyled, ol.unstyled {
42
+ list-style: none;
43
+ padding-inline-start: 0;
44
+ }
45
+ ul.unstyled li, ol.unstyled li {
46
+ margin-bottom: 0;
47
+ }
48
+
49
+ dl {
50
+ margin: 0 0 1.6rem 0;
51
+ padding: 0;
52
+ }
53
+
54
+ dd {
55
+ margin: 0;
56
+ padding: 0;
57
+ }
58
+
59
+ blockquote {
60
+ margin: 1.6rem 0 1.6rem 0;
61
+ padding-inline-start: 2.4rem;
62
+ }
63
+
64
+ pre {
65
+ overflow-x: auto;
66
+ }
67
+
68
+ hr {
69
+ margin: 2.4rem 0 2.4rem 0;
70
+ }
71
+
72
+ figure {
73
+ margin: 1.6rem 0 1.6rem 0;
74
+ padding: 0;
75
+ }
76
+
77
+ body {
78
+ margin: 0;
79
+ padding: 0;
80
+ font-family: var(--base-font-family);
81
+ font-size: 1.6rem;
82
+ color: var(--pa-text-color-1);
83
+ background-color: var(--pa-main-bg);
84
+ line-height: 1.5;
85
+ }
86
+
87
+ button,
88
+ input,
89
+ select,
90
+ textarea,
91
+ label {
92
+ font-family: inherit;
93
+ font-size: inherit;
94
+ }
@@ -0,0 +1,32 @@
1
+ /* Webkit browsers (Chrome, Safari, Edge) */
2
+ *::-webkit-scrollbar {
3
+ width: 6px;
4
+ height: 6px;
5
+ }
6
+
7
+ *::-webkit-scrollbar-track {
8
+ background: var(--pa-main-bg);
9
+ border-radius: var(--pa-border-radius-sm);
10
+ }
11
+
12
+ *::-webkit-scrollbar-thumb {
13
+ background: var(--pa-border-color);
14
+ border-radius: var(--pa-border-radius-sm);
15
+ border: 1px solid var(--pa-main-bg);
16
+ }
17
+ *::-webkit-scrollbar-thumb:hover {
18
+ background: var(--pa-accent);
19
+ }
20
+ *::-webkit-scrollbar-thumb:active {
21
+ background: var(--pa-accent-hover);
22
+ }
23
+
24
+ *::-webkit-scrollbar-corner {
25
+ background: var(--pa-main-bg);
26
+ }
27
+
28
+ /* Firefox */
29
+ * {
30
+ scrollbar-width: thin;
31
+ scrollbar-color: var(--pa-border-color) var(--pa-main-bg);
32
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keenmate/pure-css",
3
- "version": "1.0.0-rc01",
3
+ "version": "1.0.0-rc03",
4
4
  "description": "The KeenMate CSS foundation — --base-* theming contract, PureCSS grid and utility classes. Extracted from pure-admin-core so docs sites, standalone pages and every web/svelte component share one theming layer.",
5
5
  "style": "dist/css/pure-css.css",
6
6
  "exports": {
@@ -8,6 +8,8 @@
8
8
  "./css": "./dist/css/pure-css.css",
9
9
  "./css/*": "./dist/css/*",
10
10
  "./base": "./dist/css/base.css",
11
+ "./reboot": "./dist/css/reboot.css",
12
+ "./scrollbars": "./dist/css/scrollbars.css",
11
13
  "./grid": "./dist/css/grid.css",
12
14
  "./utilities": "./dist/css/utilities.css",
13
15
  "./scss": "./src/scss/pure-css.scss",
@@ -23,9 +25,11 @@
23
25
  "scripts": {
24
26
  "build:bundle": "sass src/scss/pure-css.scss dist/css/pure-css.css --no-source-map --silence-deprecation=import",
25
27
  "build:base": "sass src/scss/base.scss dist/css/base.css --no-source-map --silence-deprecation=import",
28
+ "build:reboot": "sass src/scss/reboot.scss dist/css/reboot.css --no-source-map --silence-deprecation=import",
29
+ "build:scrollbars": "sass src/scss/scrollbars.scss dist/css/scrollbars.css --no-source-map --silence-deprecation=import",
26
30
  "build:grid": "sass src/scss/grid.scss dist/css/grid.css --no-source-map --silence-deprecation=import",
27
31
  "build:utilities": "sass src/scss/utilities.scss dist/css/utilities.css --no-source-map --silence-deprecation=import",
28
- "build": "npm run build:bundle && npm run build:base && npm run build:grid && npm run build:utilities",
32
+ "build": "npm run build:bundle && npm run build:base && npm run build:reboot && npm run build:scrollbars && npm run build:grid && npm run build:utilities",
29
33
  "watch": "sass --watch src/scss/pure-css.scss:dist/css/pure-css.css --silence-deprecation=import",
30
34
  "prepublishOnly": "npm run build"
31
35
  },
@@ -378,12 +378,12 @@
378
378
  // LAYOUT COLORS
379
379
  // =========================================================================
380
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};
381
+ // 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};
387
387
 
388
388
  // Sidebar
389
389
  --pa-sidebar-bg: #{$sidebar-bg};
@@ -7,14 +7,18 @@
7
7
  //
8
8
  // This bundle emits:
9
9
  // 1. `:root` defaults for every --base-*/--pa-* variable (light values)
10
- // 2. the native flexbox grid (.pa-row / .pa-col)
11
- // 3. the utility classes (.m-*, .d-flex, .w-*, …)
10
+ // 2. the reboot (10px rem base + element reset — the sizing contract)
11
+ // 3. themed scrollbars (global browser chrome)
12
+ // 4. the native flexbox grid (.pa-row / .pa-col)
13
+ // 5. the utility classes (.m-*, .d-flex, .w-*, …)
12
14
  //
13
15
  // A *theme* is just an override of the `$base-*` SCSS variables (or the
14
16
  // `--base-*` custom properties) — everything else re-derives. See README.
15
17
  // ============================================================================
16
18
 
17
19
  @use 'base-css-variables' as bcv;
20
+ @use 'reboot';
21
+ @use 'scrollbars';
18
22
  @use 'pa-grid';
19
23
  @use 'utilities';
20
24
 
@@ -0,0 +1,134 @@
1
+ // @keenmate/pure-css — reset & base element styling ("reboot")
2
+ // ============================================================================
3
+ // The foundation's reset layer. Establishes the 10px rem base that EVERY
4
+ // pure-css rem value assumes (see variables/_typography.scss — `$font-size-base:
5
+ // 1.6rem` is 16px only when the root is 10px), a border-box reset, and neutral
6
+ // base styling for standard HTML elements (headings, paragraphs, links, lists,
7
+ // blockquotes, rules, the body font/colour). Analogous to Bootstrap's Reboot.
8
+ //
9
+ // This lives in pure-css — not in a consuming app — because the 10px base is
10
+ // part of the foundation's sizing contract: without it, a standalone consumer
11
+ // inherits the browser's 16px root and every rem renders 1.6x too large. Link
12
+ // it (or the full `pure-css.css` bundle) and the scale just works.
13
+ //
14
+ // App-specific base rules (the admin dashboard's decorative body background,
15
+ // sidebar overflow handling) intentionally stay in pure-admin-core; a generic
16
+ // foundation shouldn't impose them on every consumer.
17
+ // ============================================================================
18
+
19
+ @use 'variables/index' as *;
20
+
21
+ // 10px rem base for intuitive sizing (1rem = 10px)
22
+ // This makes calculations simple: 1.5rem = 15px, 3.5rem = 35px
23
+ html {
24
+ font-size: 10px;
25
+ }
26
+
27
+ // Reset and base styles
28
+ * {
29
+ box-sizing: border-box;
30
+ }
31
+
32
+ // Standard HTML element spacing (using framework variables)
33
+ // Headings
34
+ h1, h2, h3, h4, h5, h6 {
35
+ margin: $heading-margin-top 0 $heading-margin-bottom 0;
36
+ padding: 0;
37
+ }
38
+
39
+ // Paragraphs
40
+ p {
41
+ margin: $paragraph-margin-top 0 $paragraph-margin-bottom 0;
42
+ padding: 0;
43
+ }
44
+
45
+ // Links — global default. Wrapped in :where() so specificity is 0,
46
+ // letting component scopes (alerts, navbar, sidebar) override with even a
47
+ // single class without fighting the pseudo-class specificity raise that
48
+ // `a:hover` / `a:visited` would otherwise add (0,1,1 vs a class's 0,1,0).
49
+ :where(a) {
50
+ color: var(--pa-link-color);
51
+ text-decoration: underline;
52
+ }
53
+
54
+ :where(a:hover) {
55
+ color: var(--pa-link-color-hover);
56
+ }
57
+
58
+ :where(a:visited) {
59
+ color: var(--pa-link-color-visited);
60
+ }
61
+
62
+ // Lists - styled lists (default browser styling)
63
+ ul, ol {
64
+ margin: $list-margin-top 0 $list-margin-bottom 0;
65
+ padding: 0;
66
+ padding-inline-start: $list-padding-left; // RTL: flips to right
67
+
68
+ li {
69
+ margin-bottom: $list-item-margin-bottom;
70
+ }
71
+ }
72
+
73
+ // Lists - unstyled (for navigation, etc.)
74
+ ul.unstyled, ol.unstyled {
75
+ list-style: none;
76
+ padding-inline-start: 0; // RTL: flips to right
77
+
78
+ li {
79
+ margin-bottom: 0;
80
+ }
81
+ }
82
+
83
+ // Definition lists
84
+ dl {
85
+ margin: $list-margin-top 0 $list-margin-bottom 0;
86
+ padding: 0;
87
+ }
88
+
89
+ dd {
90
+ margin: 0;
91
+ padding: 0;
92
+ }
93
+
94
+ // Blockquote
95
+ blockquote {
96
+ margin: $blockquote-margin-top 0 $blockquote-margin-bottom 0;
97
+ padding-inline-start: $blockquote-padding-left; // RTL: flips to right
98
+ }
99
+
100
+ // Pre/Code blocks
101
+ pre {
102
+ overflow-x: auto;
103
+ }
104
+
105
+ // Horizontal rule
106
+ hr {
107
+ margin: $hr-margin-top 0 $hr-margin-bottom 0;
108
+ }
109
+
110
+ // Figure
111
+ figure {
112
+ margin: $figure-margin-top 0 $figure-margin-bottom 0;
113
+ padding: 0;
114
+ }
115
+
116
+ body {
117
+ margin: 0;
118
+ padding: 0;
119
+ font-family: var(--base-font-family);
120
+ font-size: 1.6rem; // 16px default text (with 10px rem base)
121
+ color: var(--pa-text-color-1);
122
+ background-color: var(--pa-main-bg);
123
+ line-height: $line-height-base;
124
+ }
125
+
126
+ // Ensure form elements and labels inherit theme font and size instead of browser defaults
127
+ button,
128
+ input,
129
+ select,
130
+ textarea,
131
+ label {
132
+ font-family: inherit;
133
+ font-size: inherit;
134
+ }
@@ -0,0 +1,48 @@
1
+ // @keenmate/pure-css — global scrollbar styling
2
+ // ============================================================================
3
+ // Themed, consistent scrollbars across browsers (WebKit `::-webkit-scrollbar`
4
+ // pseudo-elements + the Firefox `scrollbar-width` / `scrollbar-color`
5
+ // properties). Global `*` chrome — part of the foundation's "consistent
6
+ // appearance" promise, so a standalone pure-css page gets the same thin themed
7
+ // scrollbars as a full pure-admin app rather than native browser ones.
8
+ //
9
+ // Colours come from the emitted `--pa-*` cascade, so scrollbars re-theme at
10
+ // runtime with everything else.
11
+ // ============================================================================
12
+
13
+ @use 'variables/index' as *;
14
+
15
+ /* Webkit browsers (Chrome, Safari, Edge) */
16
+ *::-webkit-scrollbar {
17
+ width: $scrollbar-width;
18
+ height: $scrollbar-width;
19
+ }
20
+
21
+ *::-webkit-scrollbar-track {
22
+ background: var(--pa-main-bg);
23
+ border-radius: var(--pa-border-radius-sm);
24
+ }
25
+
26
+ *::-webkit-scrollbar-thumb {
27
+ background: var(--pa-border-color);
28
+ border-radius: var(--pa-border-radius-sm);
29
+ border: $border-width-base solid var(--pa-main-bg);
30
+
31
+ &:hover {
32
+ background: var(--pa-accent);
33
+ }
34
+
35
+ &:active {
36
+ background: var(--pa-accent-hover);
37
+ }
38
+ }
39
+
40
+ *::-webkit-scrollbar-corner {
41
+ background: var(--pa-main-bg);
42
+ }
43
+
44
+ /* Firefox */
45
+ * {
46
+ scrollbar-width: thin;
47
+ scrollbar-color: var(--pa-border-color) var(--pa-main-bg);
48
+ }
@@ -19,12 +19,12 @@ $text-color-1: $base-text-color-1 !default;
19
19
  $text-color-2: $base-text-color-2 !default;
20
20
  $border-color: $base-border-color !default;
21
21
 
22
- // Header colors
23
- $header-bg: $base-main-bg !default;
24
- $header-border-color: $base-border-color !default;
25
- $header-text: $base-text-color-1 !default;
26
- $header-text-secondary: $base-text-color-2 !default;
27
- $header-profile-name-color: $base-text-color-1 !default;
22
+ // Navbar colors
23
+ $navbar-bg: $base-main-bg !default;
24
+ $navbar-border-color: $base-border-color !default;
25
+ $navbar-text: $base-text-color-1 !default;
26
+ $navbar-text-secondary: $base-text-color-2 !default;
27
+ $navbar-profile-name-color: $base-text-color-1 !default;
28
28
 
29
29
  // Sidebar colors
30
30
  $sidebar-bg: $base-page-bg !default;
@@ -6,8 +6,8 @@
6
6
  // NOTE: 10px rem base - all rem values are now in 10px units (1rem = 10px)
7
7
 
8
8
  // Layout dimensions
9
- $header-height: 4.8rem !default; // 48px (was 3rem)
10
- $footer-height: $header-height !default; // Same as header
9
+ $navbar-height: 4.8rem !default; // 48px (was 3rem)
10
+ $footer-height: $navbar-height !default; // Same as navbar
11
11
  $sidebar-width: 28.8rem !default; // 288px (was 18rem)
12
12
  $sidebar-max-width: 40rem !default; // 400px (was 25rem)
13
13
  $sidebar-collapsed-width: 6.4rem !default; // 64px (was 4rem)
@@ -33,9 +33,6 @@ $burger-bar-spacing: 4px !default;
33
33
  $burger-transform-offset: 3px !default;
34
34
  $burger-menu-margin-left: 0.3rem !default; // ~3px (was 0.2rem)
35
35
 
36
- // Header brand
37
- $header-brand-padding-left: 2.1rem !default; // ~21px (was 1.3rem)
38
-
39
36
  // Responsive breakpoints
40
37
  $mobile-breakpoint: 768px !default;
41
38
  $tablet-breakpoint: 1024px !default;
@@ -16,8 +16,8 @@ $z-index-base: 0 !default;
16
16
  $z-index-content: 1000 !default;
17
17
  $z-index-sidebar: 2000 !default;
18
18
  $z-index-sidebar-fixed: 3000 !default;
19
- $z-index-detail-panel-card: 3500 !default; // Card overlay detail panel (below header)
20
- $z-index-header: 4000 !default;
19
+ $z-index-detail-panel-card: 3500 !default; // Card overlay detail panel (below navbar)
20
+ $z-index-navbar: 4000 !default;
21
21
  $z-index-profile-panel: 5000 !default;
22
22
  $z-index-modal-backdrop: 6000 !default;
23
23
  $z-index-modal: 7000 !default;