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

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,34 @@
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-rc02] — 2026-08-05 [PUBLISHED]
7
+
8
+ ### Added
9
+
10
+ - **Reboot layer (`reboot.scss`) — the reset the foundation always assumed.** Emits
11
+ `html { font-size: 10px }` (the 10px rem base every pure-css rem value is authored
12
+ against — `$font-size-base: 1.6rem` is 16px *only* at a 10px root), a `box-sizing:
13
+ border-box` reset, neutral base styling for standard elements (headings, paragraphs,
14
+ links, lists, blockquotes, `hr`, `figure`), the `body` font/colour/background, and the
15
+ `button/input/select/textarea/label { font: inherit }` reset. Relocated from
16
+ pure-admin-core's `core-components/_base.scss` so it sits with the rem-scale variables
17
+ that depend on it. Analogous to Bootstrap's Reboot.
18
+ - **New `reboot.css` build artifact** + `./reboot` export, and `reboot` is now part of the
19
+ `pure-css.css` bundle (emitted before grid/utilities).
20
+ - **Themed scrollbars (`scrollbars.scss`).** The global `*::-webkit-scrollbar` + Firefox
21
+ `scrollbar-width`/`scrollbar-color` styling (thin scrollbars coloured from the `--pa-*`
22
+ cascade), relocated from pure-admin-core's `core-components/_scrollbars.scss`. Global browser
23
+ chrome belongs with the foundation's consistent-appearance promise, so a standalone pure-css
24
+ page gets the same themed scrollbars as a full pure-admin app instead of native ones. Part of
25
+ the `pure-css.css` bundle, plus a standalone `scrollbars.css` artifact + `./scrollbars` export.
26
+
27
+ ### Fixed
28
+
29
+ - **Standalone consumers no longer render 1.6× too large.** Before, the 10px base lived
30
+ only in pure-admin-core, so a page linking `pure-css.css` (or `base.css`) on its own
31
+ inherited the browser's 16px root and every rem was 1.6× oversized. The bundle now ships
32
+ the 10px base itself, so the sizing scale is correct out of the box.
33
+
6
34
  ## [1.0.0-rc01] — 2026-08-04
7
35
 
8
36
  Initial extraction of the CSS foundation out of `@keenmate/pure-admin-core`.
package/README.md CHANGED
@@ -4,6 +4,20 @@ 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-rc02
8
+
9
+ - **Reboot layer — the 10px base is now built in.** pure-css ships
10
+ `html { font-size: 10px }` (plus a `box-sizing` reset and neutral base element
11
+ styling) via the new `reboot.scss`, included in the `pure-css.css` bundle and
12
+ available standalone as `reboot.css` / the `./reboot` export. Every pure-css
13
+ rem value assumes a 10px root, so previously a standalone consumer rendered
14
+ everything 1.6× too large until they added the base themselves — now it just
15
+ works out of the box.
16
+ - **Themed scrollbars, foundation-wide.** The global thin-scrollbar styling
17
+ (`scrollbars.scss`, coloured from the `--pa-*` cascade) moved out of
18
+ pure-admin-core, so a standalone pure-css page gets the same scrollbars as a
19
+ full admin app. In the bundle, or cherry-pick `scrollbars.css` / `./scrollbars`.
20
+
7
21
  ## What's New in 1.0.0-rc01
8
22
 
9
23
  - **The KeenMate CSS foundation, now standalone.** The `--base-*` theming
@@ -14,8 +28,9 @@ so it can be consumed on its own.
14
28
  truth; `pure-admin-core`, its `--pa-*` component variables, and every KeenMate
15
29
  web/Svelte component derive from it via fallback chains — so one block of
16
30
  `--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`.
31
+ - **Link targets.** `pure-css.css` (everything) or cherry-pick `base.css`
32
+ (variables only), `reboot.css` (reset + 10px base), `scrollbars.css`,
33
+ `grid.css`, `utilities.css`.
19
34
  - **The native `.pa-row` / `.pa-col` grid** — flexbox columns in 5% percentage
20
35
  increments plus intuitive fractions (`.pa-col-1-3`, `.pa-col-2-3`, …), with
21
36
  container-query responsive variants (`.pa-col-md-*`) and RTL-aware gutters.
@@ -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;
@@ -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-rc02",
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
  },
@@ -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
+ }