# Changelog

All notable changes to `mgf-brand-web` are documented here. The format follows
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and this project adheres
to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.5.1] - 2026-07-14

### Changed
- **Released what accumulated on `main` since v0.5.0.** Ships the Apache-2.0 relicence (the published v0.5.0 wheel still carried `License: MIT` with no `NOTICE`) plus the fixes and pin updates merged since. A fix that isn't released isn't shipped; `mgf/tools/verify_release_currency.py` (now devpi-aware) flags this class.

## [Unreleased]

## [0.5.0] - 2026-07-05

### Added
- **The living Magogi mark.** `logo_mark(mode, on_dark, …)` macro (inline
  animatable SVG — mark + "Magogi" lockup) and `static/logo-motion.css` — the
  one grammar (idle heartbeat, hover pulse, route sweep, success ring, subdued
  error; transform/opacity only, `prefers-reduced-motion`-gated). The
  `.mgf-console` shell's top-bar mark is now this inline living mark (was a
  static `<img>`), so apps extending the shell inherit it: `console.html` loads
  `logo-motion.css` and adds `lm-host` to the mark link for the hover pulse. The
  styleguide gains a "living mark" showcase. Runs on brand motion tokens
  promoted upstream in `mgf-brand` (`--mgf-duration-heartbeat/-sweep`,
  `--mgf-ease-orbit`); `global-tokens.css` re-vendored to carry them. Additive —
  the static mark path stays valid without the motion CSS.

## [0.4.0] - 2026-07-04

The kit for every operator app (M1 Wave-2 P4.1): the shared console shell,
the icon sprite, and a Jinja template pack — the fed↔test duplication named
by the G3 recon, lifted.

### Added
- **The `.mgf-console` operator shell** (`static/console.css`, a new optional
  LAYOUT layer loaded after `instruments.css`): the always-dark instrument
  top bar (mark + status pill + actions), the dark left rail (nav rows + the
  pinned state-language legend), the light printable readout, a proper
  `.skip-link` (WCAG 2.4.1, visible on focus), the responsive narrowing and
  the print reset — extracted from the near-identical `.fw-*` (mgf-fed-web)
  and `.pw-*` (mgf-test-web) app shells. Canonical `--mgf-*` tokens
  throughout; the chrome stays dark in both themes, the readout follows.
- **The 42-icon sprite** (`static/icons/icons-sprite.svg`) — the F3-approved
  icon vocabulary (Brand Book Part VIb), a VERBATIM byte-identical copy of
  the GENERATED `mgf-brand/brand/assets/icons/icons-sprite.svg` @ `865477b`
  (sha256 `392322edc7a3ec2ed6ca9dbac8b6a6cc55d359a162ef752920949c04f6dfd774`;
  single source: the per-icon SVGs via `gen_icons.py` — never hand-edit here,
  re-vendor). Usage doc in `static/README.md`; `.mgf-icon` sizing utility in
  `base.css` (and an exemption from the element-default `svg` rules that
  would break inline sprite references). Integrity is test-pinned: 42 unique
  `mgf-icon-<kebab>` symbol ids, every `viewBox="0 0 24 24"`, currentColor.
- **A Jinja template pack as package data** (`templates/mgf/`, new
  `templates_dir()` accessor; the kit still imports NO web framework —
  templates are data, jinja2 stays a dev-only extra): `mgf/console.html`
  (the shell as an extendable base: head chrome with `color-scheme`, kit
  sheets in canonical order, skip link, topbar/rail/main blocks),
  `mgf/macros.html` (`icon()` + `sync_chip()`/`status_chip()` with optional
  sprite-icon slots + `tstate()`/`origin_badge()`/`derived_tag()`/`absence()`/
  `empty_state()` — the macros fed-web/test-web copy-pasted), and
  `mgf/styleguide.html`.
- **Instrument-layer families lifted from the apps** (`instruments.css`):
  `.tstate` workflow chips (kebab modifiers), `.origin-badge` actor badges,
  `.derived-tag`, the `.absence` honest-absence composition, an icon slot on
  `.status-chip`, and the full state language as bare `.status-indicator`
  dots (`--idle`, `--in-sync`, `--stale`, `--tampered`, `--error`,
  `--unknown`, `--unreadable`, `--checking`, `--syncing`).
- **The living styleguide, served** — `python demo/app.py` (stdlib http +
  dev-extra jinja2) renders `mgf/styleguide.html` from the SHIPPED templates
  and assets: the shell, every chip/mark/signal family, all 42 icons on
  Paper and Ink, and the `--mgf-text-*` type ramp. Replaces
  `docs/instruments-demo.html` (hand-copied markup, never served — the G3
  "unserved gallery" hole).

### Changed
- Legacy alias removal **retargeted 0.4.0 → 0.5.0** (`tokens.css`): the P4.2
  adoption wave still consumes aliases from the apps' remaining domain CSS;
  the aliases stay value-faithful and deprecated. New kit CSS (console.css)
  is written in canonical `--mgf-*` spellings.
- `PUBLIC_API.json` regenerated (it had recorded the 0.1.0 surface): now
  `__version__` + `static_dir` + `templates_dir` @ 0.4.0.

## [0.3.0] - 2026-07-04

### Changed
- **One token truth (M1 Wave-2 P1.3).** The kit now consumes the GENERATED
  token layer from `mgf-brand`: `static/global-tokens.css` is a verbatim copy
  of `mgf-brand/brand/assets/system/global-tokens.css` @ `1514515` (single
  source: `design-tokens.json`, emitted by `brand/build/gen_tokens.py`;
  sha256 `f75e8e0d1992bca72bdede39272e3cfd95d5786dc845d30d58738dc21c14154f`).
  `static/tokens.css` — still the linked entry point, so existing `<head>`
  snippets keep working — becomes a thin shim: `@import "global-tokens.css"`
  plus a **deprecated** legacy-alias block. The hand-maintained token fork
  ("ported verbatim from mgf-website's global.css") is gone.
- **The `--mgf-*` namespace is canonical**, including the semantic layer
  (`--mgf-color-*`), roles (`--mgf-role-*`), type ramp (`--mgf-text-*`),
  contiguous spacing (`--mgf-space-0..12,16,24`), motion
  (`--mgf-duration-*`/`--mgf-ease-*`/`--mgf-motion-*`), and component tokens.
  The `--font-*` vs `--mgf-font-*` rename divergence is resolved per the
  generated canon: `--font-sans` → `var(--mgf-font-body)`, `--font-display` →
  `var(--mgf-font-display)`, `--font-mono` → `var(--mgf-font-mono)` (alias
  block, deprecated).
- The invented busy/derived functional hues now **come from canon** —
  ratified as brand law by **Decision 24 (founder-enacted 2026-07-04)**:
  `--mgf-busy`/`--mgf-derived` + the `--mgf-color-state-busy*/-derived*`
  semantic set, generated light+dark at parity. The kit's `--state-*` names
  are deprecated aliases onto them (identical values).
- New for consumers: `[data-theme="light"|"dark"]` explicit theme opt-in at
  parity with the OS-auto path (one dark map, generated into both), plus the
  full canon vocabulary (status tints/strongs, focus ring per the enacted F2
  focus law, breakpoints, radius/tile scale).
- `static/README.md` pre-lift prose corrected (it described the kit as
  "vendored into mgf-cloud-app, awaiting extraction" — it is the installed
  package consumed by fed-web/cloud-web/test-web).

### Deprecated
- The entire un-prefixed legacy alias block in `tokens.css` (`--color-*`,
  `--state-*`, `--font-sans/display/mono`, `--radius-*`, `--shadow-*`,
  `--motion-*`, `--ease-standard`, `--space-*`) — **removal target 0.4.0**.
  Aliases are value-faithful (zero visual change): where a canon token has
  the exact value in both themes the alias points at it; the few legacy
  values with no canon equivalent (`--color-bg-soft`, `--color-border`,
  `--color-primary-tint/-shade`, `--color-accent-tint/-strong`,
  `--radius-sm` 4px, `--radius-xl` 24px, `--motion-normal` 160ms) keep their
  original recipes, each annotated with its nearest canon token. NOTE the
  name trap kept honest by this: legacy `--radius-sm` (4px) ≠ canon
  `--mgf-radius-sm` (8px per the Book) — migrate deliberately.

### Fixed
- `--space-5` (and the rest of the contiguous 0–12 scale) now resolves —
  `mgf-test-web` consumed `--space-5`, which the pre-0.3 gappy scale never
  defined (silent undefined-token lookup).

### Notes
- Rendering is unchanged for existing consumers by construction (aliases are
  value-faithful); verified by resolving every `var(--*)` consumed by
  `mgf-fed-web`, `mgf-cloud-web`, `mgf-test-web`, and the kit's own sheets
  against the new layer.

## [0.2.0] - 2026-06-29

### Added
- **Operator-instrument CSS layer** (`static/instruments.css`) — an additive
  control-surface layer for MGF operator tools (federation control, the
  testing/CI authority, …), built on the existing brand tokens. ~14 component
  families: state chips (`.status-chip`, the SYNC + TEST state language), live
  indicator dots (`.status-indicator`), progress bars (`.progress`), tabs +
  lens-tabs (`.tabs`/`.tab`, `.lens-tabs`/`.lens-tab`), a dark streaming console
  (`.console`) with per-event-kind colours (`.kind--*`), authority/broker
  markers (`.authority-badge`, `.service-status`), ribbons (`.ribbon--*`), the
  telemetry live-pane (`.live-pane`), the per-test config panel
  (`.config-panel`/`.config-toggle`), level badges (`.level-badge--*`), the
  telemetry marker + live dot/chip (`.telemetry-marker`, `.live-dot`,
  `.live-chip`), reference pills (`.pill--age/--priority`), detail/evidence
  blocks (`.detail`, `.detail-block`, `.evidence`), and empty-state variants
  (`.empty--unknown/--unreadable/--no-data`, `.empty__icon`). Honours
  `prefers-color-scheme` (dark remaps) and `prefers-reduced-motion`.
- Two functional state tokens in `tokens.css` (D-BRAND-ACCENT): `--state-busy`
  (blue, `#2e86c8`) for "busy/running" and `--state-derived` (violet, `#7e5bb0`)
  for "derived/authority", each with light/dark `-tint`/`-text` variants. Gold
  remains the single affirmative-action accent ("one flame per view"); blue is
  never a call-to-action.
- A self-contained demo, `docs/instruments-demo.html`, rendering every family.

### Notes
- Strictly **additive** — no existing token, class, or asset changed; existing
  consumers (e.g. `mgf-cloud-app`) render identically. `instruments.css` is an
  opt-in fifth stylesheet, loaded after `components.css`.

## [0.1.0] - 2026-06-29

### Added
- Initial extraction of the Magogi brand-web kit into its own installable
  package (`mgf.brand_web`): tokenized CSS (tokens/base/components), self-hosted
  OFL fonts, Cornerstone-Orbit logo marks, and Federation-Lattice patterns,
  shipped as package data with a `static_dir()` accessor for mounting. Lifted
  from `mgf-cloud-app`'s vendored kit so MGF web surfaces share one source of
  truth. Framework-free (import-linter contract).

[Unreleased]: https://codeberg.org/magogi-admin/mgf-brand-web/compare/v0.4.0...HEAD
[0.4.0]: https://codeberg.org/magogi-admin/mgf-brand-web/compare/v0.3.0...v0.4.0
[0.3.0]: https://codeberg.org/magogi-admin/mgf-brand-web/compare/v0.2.0...v0.3.0
[0.2.0]: https://codeberg.org/magogi-admin/mgf-brand-web/compare/v0.1.0...v0.2.0
[0.1.0]: https://codeberg.org/magogi-admin/mgf-brand-web/releases/tag/v0.1.0
