@keenmate/pure-css 1.0.0-rc04 → 1.0.0-rc06

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,139 @@
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-rc06] — 2026-08-30
7
+
8
+ ### Fixed
9
+
10
+ - **The app shell now renders standalone — component `--pc-*` tokens fall back to
11
+ `--base-*`.** rc05 relocated the shell into the foundation, but its CSS
12
+ hard-referenced component tokens (`--pc-navbar-bg`, `--pc-sidebar-*`,
13
+ `--pc-footer-*`, `--pc-card-bg`, `--pc-input-bg`) that pure-css does **not**
14
+ emit — those are pure-admin's `output-pc-component-variables` contract. So a
15
+ consumer linking `base.css` / `pure-css.css` alone (keen-docs hit this) got an
16
+ unstyled navbar/sidebar. Every such reference now carries a `--base-*` fallback
17
+ traced from the token's own derivation: `var(--pc-navbar-bg, var(--base-main-bg))`,
18
+ `var(--pc-sidebar-bg, var(--base-page-bg))`, navbar/sidebar text →
19
+ `--base-text-color-1/2`, borders → `--base-border-color`, submenu surfaces →
20
+ `--base-subtle-bg`, input → `--base-input-bg`. This makes `--pc-*` an *optional*
21
+ override layer over a guaranteed `--base-*` floor — link only the base vars and
22
+ the shell just works; set `--pc-navbar-bg` to tune the bar independently of the
23
+ page. 40 references across the eight shell partials.
24
+ - **Dangling token references in `_fit-flyout.scss`.** The fit-flyout trigger
25
+ referenced `--pc-accent-color` (defined nowhere — the token is `--pc-accent`)
26
+ with no fallback, so its focus outline was inert; and `--pc-hover-bg` (also
27
+ undefined) with only an rgba literal. Repointed to
28
+ `var(--pc-accent, var(--base-accent-color))` and
29
+ `var(--pc-hover-bg, var(--base-hover-bg, rgba(…)))`.
30
+
31
+ ### Changed
32
+
33
+ - **Unified the `--pc-border-radius*` scale with the `--base-border-radius-*`
34
+ contract the components already use.** pure-css shipped two disconnected radius
35
+ systems: `--base-border-radius-sm/md/lg` (the unitless rem-multipliers
36
+ `0.4/0.6/0.8` every web/svelte component reads — e.g. web-multiselect's
37
+ `calc(var(--base-border-radius-md) * --ms-rem)`), and its OWN
38
+ `--pc-border-radius-sm/base/lg` as hardcoded `2px/4px/8px` literals disconnected
39
+ from the base layer. On one themed page a `<keen-web-multiselect>` and a pure-css
40
+ `.rounded` element rounded differently, and a runtime `--base-border-radius-*`
41
+ override re-rounded the components but not pure-css's own elements. The three
42
+ `--pc-border-radius*` tokens now derive from the base contract —
43
+ `calc(var(--base-border-radius-{sm,md,lg}, <default>) * 1rem)` (unsuffixed
44
+ `--pc-border-radius` = the `-md` mid step) — mirroring how `--pc-border-color`
45
+ already tracked `--base-border-color`. **Rendered radii change** to match the
46
+ ecosystem: `-sm` 2px → 4px, mid 4px → 6px, `-lg` 8px (unchanged). Overriding
47
+ `--base-border-radius-*` now re-rounds pure-css and the components together.
48
+
49
+ ## [1.0.0-rc05] — 2026-08-27 [PUBLISHED]
50
+
51
+ ### Added
52
+
53
+ - **The app shell moves into the foundation — navbar, sidebar, and layout
54
+ container.** pure-css was variables + grid + utilities; rc05 also relocates the
55
+ structural app-shell layer out of pure-admin-core, so a standalone page (docs
56
+ site, portal) gets the same navbar/sidebar/layout chrome as a full pure-admin
57
+ app without pulling in the component library. Seven new partials, all `@use`d
58
+ into the `pure-css.css` **bundle only** (base.css / grid.css / utilities.css
59
+ untouched; no new standalone artifact):
60
+ - `_navbar.scss` + `_navbar-elements.scss` — the fixed navbar (`.pc-navbar`
61
+ with `__inner`/`__start`/`__center`/`__end` regions) and its elements (burger
62
+ menu, brand wordmark `.pc-app-header`, nav menu `.pc-navmenu`, page title
63
+ `.pc-page-header`, profile button, theme switcher).
64
+ - `_sidebar.scss` + `_sidebar-states.scss` — the sidebar nav with nested
65
+ submenus (`.pc-sidebar`, `.pc-layout__sidebar`, drag-to-resize
66
+ `.pc-sidebar-resize`) and its hidden / icon-collapse / expanded states.
67
+ - `_layout-container.scss` — the layout wrapper (`.pc-layout` with
68
+ `__inner`/`__main`/`__content`/`__footer` and the `.pc-footer__*` regions),
69
+ including sticky/scroll content modes. Emitting `.pc-layout__main` here also
70
+ gives the grid's container-query responsive columns (`.pc-col-md-*`) their
71
+ documented automatic containment context in the same bundle (the
72
+ `_pa-grid.scss` note is corrected from the pre-rc04 `.pa-layout__main` to
73
+ `.pc-layout__main`).
74
+ - `_layout-responsive.scss` — the mobile/tablet media queries for the shell.
75
+ - `_resize-handle.scss` — a mixin-only partial (emits nothing on its own)
76
+ providing the shared grab-knob look `@use`d by the sidebar resize handle and
77
+ splitter gutters.
78
+ - `_fit-flyout.scss` — the Fit engine's floating-menu sink
79
+ (`.pc-fit-flyout__*`): a `•••` trigger + a `<body>`-parented panel that
80
+ `fit.js` fills on demand when slots relocate out of the row.
81
+
82
+ pure-admin-core keeps same-named partials that now just `@forward` these, so the
83
+ shell is single-sourced in the foundation and the two can't drift.
84
+
85
+ - **The shell's behaviour ships too — a dependency-free JS runtime (`src/js/`).**
86
+ The shell is no longer styling-only: the foundation now carries the vanilla-JS
87
+ runtime that drives it, so pure-css is no longer a CSS-only package. Shipped
88
+ **as source** (no build step) via a new `./js` export (and `./js/*` for
89
+ individual engines); `files` gains `src/js/`.
90
+ - `pure-css.js` installs the `window.pureCss` namespace — a tiny event bus,
91
+ live viewport / OS-colour-scheme / capability-first device sources, overlay
92
+ primitives (scroll-lock, keyboard-inset), an open-menu registry, a shared
93
+ `config` baseline (single-sourced from SCSS via `--pc-*` vars), and
94
+ `components.initAll(scope)`. Load-order-safe and stands alone when pure-admin
95
+ is absent; `pure-admin.js` adopts the same buses by reference on top.
96
+ - `fit.js` — the Fit engine (`data-pc-fit` = hide / steps / relocate). It
97
+ **absorbs the former `navbar-collapse.js`** (progressive nav folding via
98
+ `data-pc-fit-nav`, sinking items to the sidebar or a generated "More" menu),
99
+ so that separate file no longer exists.
100
+ - `navbar-dropdown.js` (tap-toggle nav dropdowns/submenus),
101
+ `sidebar-resize.js` (drag-to-resize the sidebar), and
102
+ `container-breakpoint.js` (container-query breakpoint driver).
103
+
104
+ Shell CSS is authored no-JS-safe, so styling degrades gracefully rather than
105
+ breaking when the runtime isn't loaded.
106
+
107
+ ### Fixed
108
+
109
+ - **Migrated the dead `data-pa-nav-collapse` hook to `data-pc-fit-nav`.** The
110
+ relocated nav-collapse CSS keyed on the pre-rc04 `pa-`-branded
111
+ `[data-pa-nav-collapse]` attribute driven by the old `navbar-collapse.js`;
112
+ since that engine is now merged into `fit.js` (which reads `data-pc-fit-nav`),
113
+ the selectors in `_navbar-elements.scss` / `_layout-responsive.scss` were stale
114
+ and matched nothing. Repointed at `[data-pc-fit-nav]` and corrected the
115
+ companion comments (`navbar-collapse.js` → `fit.js`). Also de-branded the fit
116
+ hide-class `.pa-fit-hidden` → `.pc-fit-hidden`.
117
+
118
+ ### Internal
119
+
120
+ - **GitHub Actions release workflow (`.github/workflows/release.yml`).** On a `v*.*.*`
121
+ tag push, builds the CSS (`npm ci` + `npm run build`) and publishes a GitHub Release
122
+ with a `pure-css-<version>.zip` (bundling `dist/`, `src/scss/`, `README.md`,
123
+ `CHANGELOG.md`, `LICENSE` — the same set as the package `files`, so the zip is a
124
+ toolchain-free drop-in for consumers who don't use npm) plus a `.sha256` checksum.
125
+ Auto-generated release notes; tags containing `-` (rc) publish as a pre-release.
126
+ Mirrors pure-admin-core's release workflow, adapted for this single-package repo.
127
+ - **Exhaustive, data-driven utilities e2e coverage.** Rewrote `e2e/utilities.spec.ts`
128
+ from a handful of spot-checks into a hard value assertion for 655 of the 664 shipped
129
+ utility classes (the 9 `auto` sizing classes — `m-auto` + per-side, `w-auto`, `h-auto` —
130
+ are layout-resolved and covered behaviourally instead). Each family measures every one
131
+ of its classes' computed styles in a single in-browser pass, then diffs in Node so a
132
+ failure lists exactly which classes are off; the expectations independently encode the
133
+ 10px-rem contract and the documented scales rather than reading them back from the CSS,
134
+ so a failure means the compiled output disagrees with the contract or the contract
135
+ regressed. Renamed the fixture `test/utilities.html` → `test/utilities-scale.html` with
136
+ definite-size `#w-parent` / `#h-parent` containers so percentage widths/heights resolve
137
+ to known px. Test-only — no change to shipped CSS.
138
+
6
139
  ## [1.0.0-rc04] — 2026-08-26 [PUBLISHED]
7
140
 
8
141
  ### Changed (BREAKING)
package/README.md CHANGED
@@ -4,46 +4,17 @@ 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-rc04
8
-
9
- - **pure-css is now strictly a base — it emits only the base token contract
10
- (BREAKING).** `base.css` / `pure-css.css` ship the ~46 base `--pc-*` tokens the
11
- foundation actually uses or exposes as universal primitives; the ~165 component
12
- tokens (buttons, cards, tables, alerts, panels, …) are pure-admin's contract,
13
- emitted by the new `output-pc-component-variables` mixin. If you author themes
14
- or call the emit mixins, add `@include output-pc-component-variables;` after
15
- `output-pc-css-variables`. Consumers of compiled CSS are unaffected.
16
- - **The foundation namespace is fully de-branded from `pa` to `pc` (BREAKING).**
17
- pure-css was carved out of pure-admin, so it still carried pure-admin's `pa`
18
- brand in its public surface. That's gone:
19
- - **Grid + mode classes:** `.pa-row` / `.pa-col*` / `.pa-offset*` / `.pa-cq` /
20
- `.pa-hide*` / `.pa-show*` → `.pc-*`; `.pa-mode-light` / `.pa-mode-dark` →
21
- `.pc-mode-*`.
22
- - **Every emitted CSS variable:** the whole `--pa-*` runtime surface (~210
23
- custom properties) → `--pc-*` (`--pa-accent` → `--pc-accent`, `--pa-card-bg`
24
- → `--pc-card-bg`, `--pa-color-1..9` → `--pc-color-1..9`, …). `--base-*`
25
- (web-component bridge) and `--page-loader-*` are unchanged.
26
- - **The emit mixins:** `output-pa-css-variables` → `output-pc-css-variables`,
27
- `output-pa-alert-variables-light/dark` → `output-pc-alert-variables-*`.
28
- Consumers migrate markup, `var()` reads, inline `style="--pa-…"`, and theme
29
- `:root` blocks in lockstep — a boundary-aware find/replace of the string
30
- `--pa-` → `--pc-` (safe: it can't touch `--base-*`, `--page-loader-*`, or the
31
- `.pa-color-{name}` variant **class**).
32
- - **Sizing utilities consolidated into the foundation.** The universal
33
- viewport-height utilities (`h-full` / `h-screen` / `min-h-full` /
34
- `min-h-screen` / `max-h-full` / `max-h-screen`) and the Tailwind-style flex
35
- shorthands (`flex-1` / `flex-auto` / `flex-initial` / `flex-none` /
36
- `flex-grow` / `flex-shrink`) now ship from pure-css, so a standalone page gets
37
- the complete set without borrowing anything from pure-admin. pure-admin's
38
- duplicate rem-height `h-Nx` / `min-h-Nx` / `max-h-Nx` classes are retired in
39
- favour of the foundation's `hr-` / `wr-` naming (`r` = rem).
40
- - **Complete form-spacing contract as runtime `--pc-*` variables** and the
41
- `$form-scale` → `$form-gap` rename (see CHANGELOG).
42
-
43
- ## What's New in 1.0.0-rc03
44
-
45
- - **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.
46
- - **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.
7
+ ## What's New in 1.0.0-rc06
8
+
9
+ - **The app shell renders standalone — no `--pc-*` component setup required** — rc05 moved the shell into the foundation, but its CSS referenced component tokens (`--pc-navbar-bg`, `--pc-sidebar-*`, `--pc-card-bg`, …) that pure-css doesn't emit, so linking `base.css` / `pure-css.css` alone gave an unstyled navbar/sidebar (keen-docs hit this). Every such reference now falls back to a `--base-*` var that pure-css *does* emit `var(--pc-navbar-bg, var(--base-main-bg))` and friends, 40 in all, each traced from the token's real derivation. That's a clean two-tier contract: link the base vars and the shell just works out of the box; set the `--pc-*` token only when you want to fine-tune a piece independently. Also fixed two dangling refs in the fit flyout (`--pc-accent-color` → `--pc-accent`, plus a `--base-hover-bg` tier for `--pc-hover-bg`).
10
+ - **One border-radius scale across the whole ecosystem** — pure-css shipped two disconnected radius systems: the `--base-border-radius-sm/md/lg` multipliers every web/svelte component reads (e.g. web-multiselect), and its own `--pc-border-radius*` as hardcoded 2/4/8px literals that ignored the base layer — so a `<keen-web-multiselect>` and a pure-css `.rounded` element rounded differently on the same theme, and a runtime `--base-border-radius-*` override moved the components but not pure-css's own elements. The `--pc-border-radius*` tokens now derive from `--base-border-radius-*` (`calc(var(--base-border-radius-md, 0.6) * 1rem)`), so radii match the components and one override re-rounds everything together. Rendered corners change slightly: small 2px→4px, medium 4px→6px, large unchanged.
11
+
12
+ ## What's New in 1.0.0-rc05
13
+
14
+ - **App shell — the navbar, sidebar, and layout container join the foundation** — pure-css has been variables + grid + utilities since the extraction; rc05 relocates the structural *app-shell* layer out of `@keenmate/pure-admin-core`, so a standalone page gets the same navbar/sidebar/layout chrome as a full admin app without pulling in the 40+ component library. Eight new partials (`_navbar.scss`, `_navbar-elements.scss`, `_sidebar.scss`, `_sidebar-states.scss`, `_layout-container.scss`, `_layout-responsive.scss`, `_resize-handle.scss`, `_fit-flyout.scss`) `@use` into the `pure-css.css` bundle — `base.css`, `grid.css` and `utilities.css` are untouched and there's no new CSS artifact. The emitted surface is `pc-`-branded like the rest of the foundation: the fixed navbar (`.pc-navbar` + `__start`/`__center`/`__end`, burger, brand `.pc-app-header`, `.pc-navmenu`, profile button, theme switcher), the nested sidebar with hidden/icon-collapse/expanded states and a drag-to-resize handle (`.pc-sidebar`, `.pc-layout__sidebar`, `.pc-sidebar-resize`), and the layout wrapper (`.pc-layout` + `__main`/`__content`/`__footer`) with mobile/tablet media queries. pure-admin-core now `@forward`s same-named partials instead of owning copies, so the shell is single-sourced here and can't drift.
15
+ - **The shell now brings its own behaviour — pure-css is no longer CSS-only** — the shell's JavaScript ships with the foundation as a small, dependency-free runtime under `src/js/`, exposed as source (no build step) via a new `./js` export. `pure-css.js` installs `window.pureCss` — an event bus, live viewport / OS-colour-scheme / capability-first device sources, overlay primitives (scroll-lock, keyboard-inset), an open-menu registry, a shared `config` baseline single-sourced from the SCSS via `--pc-*` vars, and `components.initAll(scope)` — and the shell engines hang off it: `fit.js` (the `data-pc-fit` fit engine, which also absorbed the former `navbar-collapse.js` progressive nav-folding via `data-pc-fit-nav`, so that file no longer exists), `navbar-dropdown.js`, `sidebar-resize.js`, and `container-breakpoint.js`. The runtime is load-order-safe and stands alone when pure-admin is absent; the shell CSS is authored no-JS-safe, so styling degrades gracefully rather than breaking when the runtime isn't loaded.
16
+ - **The grid's automatic responsive context now ships in the same bundle** — `_pa-grid.scss`'s container-query responsive columns (`.pc-col-md-*`, …) need a containment-context ancestor, documented as `.pc-layout__main`. That selector previously lived only in pure-admin-core, so the note was aspirational for a standalone pure-css page; with `_layout-container.scss` relocated into the bundle, `.pc-layout__main` is emitted here and the responsive variants get their context out of the box (the stale comment still read `.pa-layout__main` from before the rc04 de-brand — corrected to `.pc-layout__main`).
17
+ - **Toolchain-free zip distribution via GitHub Releases** — a new `.github/workflows/release.yml` builds the CSS on every `v*.*.*` tag push and publishes a GitHub Release carrying `pure-css-<version>.zip` (the same file set as the npm package — `dist/`, `src/scss/`, `README.md`, `CHANGELOG.md`, `LICENSE`) plus a `.sha256` checksum, so consumers who don't use npm can vendor the built foundation as a drop-in. rc tags (those containing `-`) publish as GitHub pre-releases. Mirrors pure-admin-core's release workflow, adapted for this single-package repo.
47
18
 
48
19
  ## Why
49
20
 
@@ -102,6 +73,28 @@ $base-page-bg: #0b1020;
102
73
  | `dist/css/grid.css` | `.pc-row` / `.pc-col-*` (percentage + fraction columns, container-query responsive) | layout only |
103
74
  | `dist/css/utilities.css` | spacing / flex / display / width-height utilities (`.m-4`, `.d-flex`, `.w-50`, …) | utilities only |
104
75
 
76
+ The `pure-css.css` bundle also includes the **app shell** (navbar, sidebar,
77
+ layout container) — `base.css` / `grid.css` / `utilities.css` do not.
78
+
79
+ ### The app-shell runtime (`./js`)
80
+
81
+ The shell's behaviour (nav fit/collapse, dropdowns, drag-to-resize, container
82
+ breakpoints) ships as dependency-free source JS via the `./js` export — no
83
+ bundler required, drop it in with a `<script>` and call `initAll`:
84
+
85
+ ```html
86
+ <link rel="stylesheet" href="node_modules/@keenmate/pure-css/dist/css/pure-css.css">
87
+ <script src="node_modules/@keenmate/pure-css/src/js/pure-css.js"></script>
88
+ <script src="node_modules/@keenmate/pure-css/src/js/fit.js"></script>
89
+ <script src="node_modules/@keenmate/pure-css/src/js/navbar-dropdown.js"></script>
90
+ <script src="node_modules/@keenmate/pure-css/src/js/sidebar-resize.js"></script>
91
+ <script>window.pureCss.components.initAll(document);</script>
92
+ ```
93
+
94
+ `window.pureCss` also exposes an event bus and live `viewport` / `colorScheme` /
95
+ `device` sources. The runtime is optional — shell CSS is authored no-JS-safe, so
96
+ the styling stands on its own and the JS only adds the interactive behaviour.
97
+
105
98
  ### The `--base-*` contract
106
99
 
107
100
  `--base-*` is the **single source of truth for theming**. Framework colors, component variables
package/dist/css/base.css CHANGED
@@ -142,7 +142,7 @@
142
142
  --pc-color-7-text: #ffffff;
143
143
  --pc-color-8-text: #ffffff;
144
144
  --pc-color-9-text: #ffffff;
145
- --pc-border-radius-sm: 2px;
146
- --pc-border-radius: 4px;
147
- --pc-border-radius-lg: 8px;
145
+ --pc-border-radius-sm: calc(var(--base-border-radius-sm, 0.4) * 1rem);
146
+ --pc-border-radius: calc(var(--base-border-radius-md, 0.6) * 1rem);
147
+ --pc-border-radius-lg: calc(var(--base-border-radius-lg, 0.8) * 1rem);
148
148
  }