# Changelog

All notable changes to this project are documented here.

The format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

---

## [2.2.6] - 2026-07-22

### Security

Six newly disclosed advisories failed the release-time Trivy scan on the 2.2.5
container. The scan runs before the push, so no vulnerable image reached GHCR;
2.2.5 published to npm but shipped neither a container image nor a GitHub
release. This release carries both. None of these reach the npm package, which
is CSS-only with no runtime dependencies.

Two lived in the demo's own tree and are pinned via `overrides`:

- `brace-expansion` to `^2.1.2` (CVE-2026-13149, **HIGH**, denial of service
  through exponential-time complexity).
- `js-yaml` to `^4.3.0` (CVE-2026-59869, **HIGH**, denial of service via
  crafted YAML documents).

Four lived in the npm bundled with the base image, reachable only while
building the image, never by the demo runtime:

- `tar` (CVE-2026-59873, **CRITICAL**, gzip bomb; CVE-2026-59874, **HIGH**,
  malformed archive header), `undici` (CVE-2026-12151, **HIGH**) and
  `brace-expansion` (CVE-2026-13149, **HIGH**).

Rather than suppress them, the Dockerfile now installs `npm@12.0.1`, which
bundles `tar >= 7.5.19`. This is exactly the base-image bump `.trivyignore`
deferred back when the base was node 20 and npm 12 could not be installed on
it. The version is pinned rather than floating so the image stays
reproducible.

A fresh-database scan of the rebuilt image reports **zero HIGH or CRITICAL**.
The stale `sigstore` suppression was removed along with its now-false
rationale.

Nine of the ten moderate advisories in the demo tree are also resolved. They
matter more than the severity suggests: the demo container runs `npm start`,
so `webpack-dev-server` is its runtime, and the advisories covered cross-origin
source exposure, CSRF on internal developer endpoints and a Host-header denial
of service.

- `webpack-dev-server` 5.2.3 to 5.2.6, `express` 4.22.1 to 4.22.2,
  `body-parser` 1.20.4 to 1.20.6, `qs` 6.14.2 to 6.15.3,
  `http-proxy-middleware` 2.0.9 to 2.0.10, `joi` 17.13.3 to 17.13.4,
  `launch-editor` 2.13.1 to 2.14.1, `follow-redirects` 1.15.11 to 1.16.0.
  All within their existing majors, no `--force` needed.

The tenth, `uuid` 8.3.2 (GHSA-w5hq-g745-h8pq), is **left as is on purpose**.
It reaches the tree only through `sockjs`, and the flaw is a missing buffer
bounds check in the v3, v5 and v6 generators when a `buf` argument is passed.
`sockjs` calls `uuid.v4()` with no arguments and nothing else
(`lib/transport.js:37`), so the vulnerable path cannot be reached. Clearing
the warning would mean forcing `uuid` across three majors inside a dependency
that provably cannot trigger it, which is more risk than the warning is worth.

### Changed

- **demo**: React and React DOM 19.2.7 to 19.2.8, bumped as a pair because
  Docusaurus refuses to build when they diverge.
- **CI**: `actions/upload-artifact` 5.0.0 to 7.0.1.

The published theme output is unchanged from 2.2.5.

---

## [2.2.5] - 2026-07-22

### Fixed

- **dark mode**: six custom properties never reached the page. Infima declares
  them under `html[data-theme='dark']` (specificity 0,1,1) while the theme used
  a plain `[data-theme='dark']` block (0,1,0), so Infima won regardless of load
  order and the theme's values were silently discarded. They now sit in a
  matching `html[data-theme='dark']` block.

  | Variable                         | Rendered before            | Renders now |
  | -------------------------------- | -------------------------- | ----------- |
  | `--ifm-background-color`         | `#1b1b1d`                  | `#030712`   |
  | `--ifm-background-surface-color` | `#242526`                  | `#111827`   |
  | `--ifm-code-background`          | `rgba(255,255,255,.1)`     | `#1f2937`   |
  | `--ifm-color-emphasis-300`       | `--ifm-color-gray-700`     | `#1f2937`   |
  | `--ifm-color-emphasis-600`       | `--ifm-color-gray-400`     | `#a3a3a3`   |
  | `--ifm-toc-border-color`         | `--ifm-color-emphasis-200` | `#1f2937`   |

  Dark mode therefore looks different after upgrading: the page background is
  deeper, surfaces and inline code pick up the intended gray-900 / gray-800,
  and borders are no longer Infima gray. This restores the values the theme
  always declared, so it is a fix rather than a redesign, but the change is
  visible on every site. If you were overriding any of these six with a plain
  `[data-theme='dark']` rule, raise it to `html[data-theme='dark']`. That
  override was losing to Infima before this release too.

  This is the bug the new render smoke test caught on its very first run.

- **horizontal rules**: the theme declared `--ifm-hr-border-color`, a name
  Infima does not read. The variable Infima reads is
  `--ifm-hr-background-color`, so `<hr>` rendered with the Infima
  emphasis-500 grey instead of the theme's gray-200 / gray-800. Renamed, so
  the intended color now applies.

### Removed

- Six custom properties that nothing read, ten declarations in total:
  `--ifm-sidebar-width` and `--ifm-sidebar-padding` (Infima has neither; the
  name Docusaurus reads is `--doc-sidebar-width`, which the theme already
  set), `--ifm-tag-background`, `--ifm-tag-color` and `--ifm-tag-border-color`
  (Infima has no tag variables; tag colors come from the `[class*='tagItem']`
  rules, which set the properties directly), and
  `--docusaurus-collapse-button-bg-hover-color` (a misspelling of
  `--docusaurus-collapse-button-bg-hover`).

  The collapse button keeps theme-classic's own hover shades rather than being
  renamed onto the correct variable. theme-classic declares it from a CSS
  module that loads after this file, so matching its selector is not enough to
  win, and the theme would have to inflate specificity for a hover tint that
  is visually interchangeable with the default. Say so if you want the subtler
  5% shade back; it is a deliberate choice, not an oversight.

  No rendering changes from these removals: every one of them was already
  inert.

### Added

- **CI**: a render smoke test (`tests/render/`, Playwright + Chromium) loads
  the built demo in a real browser and asserts computed styles in both color
  modes: theme variables, navbar and sidebar sharing one background, navbar
  height, the Outfit and IBM Plex Mono stacks, and the self-hosted woff2 files
  returning 200. One assertion is structural rather than value-based: no
  dark-mode variable may be declared at both `[data-theme=dark]` and
  `html[data-theme=dark]`, which catches the bug above for variables added
  later, not just the six known ones.

  The 2.2.2 cascade-layers regression passed stylelint, the demo build, the
  page check and Trivy while the site rendered as near-vanilla Docusaurus,
  because no gate looked at rendering. Reading CSS as text cannot catch a
  specificity inversion; only a real cascade engine can. Re-enabling
  `useCssCascadeLayers` now fails all eight assertions, which is how the test
  was verified.

  Playwright lives in its own package rather than in `demo/` so that the demo
  build, the Pages deploy and the Docker image do not pull a browser binary.

---

## [2.2.4] - 2026-07-22

### Fixed

- **demo**: disabled `future.v4.useCssCascadeLayers`, which caused a visible
  regression on the demo site: the navbar rendered `#242526` instead of
  `#111827`, so it no longer matched the sidebar. Lightning CSS flattens
  `@layer` by inflating the layered (Infima) rules with `:not(#\#):not(#\#)`,
  and that outranks this theme's plain-specificity `:root` / `[data-theme]`
  custom properties. Infima then won every variable override, including
  `--ifm-background-surface-color`. The 2.2.2 note claiming the theme rendered
  correctly under cascade layers was wrong: only the build had been checked,
  not the rendering. Re-enable this flag only once the theme declares its own
  cascade layer or raises the specificity of its overrides.

The published theme output is unchanged from 2.2.1.

---

## [2.2.3] - 2026-07-16

### Security

- **demo dependency**: pin `websocket-driver` to `^0.7.5` via `overrides`
  (fixes CVE-2026-54466, **CRITICAL**, message corruption). It reaches the demo
  Docker image through `webpack-dev-server` → `faye-websocket`; not part of the
  npm package. This is the vulnerability that failed the v2.2.2 Docker/GHCR
  publish, so this release also carries the container image and GitHub release
  that 2.2.2 could not.

The published theme output is unchanged from 2.2.1.

---

## [2.2.2] - 2026-07-16

### Changed

- **Docs**: audited and rewrote all 15 demo docs. Verified every
  class/option/font/hex claim against the source and corrected the wrong ones
  (the broken `@import 'cosmos-docusaurus-theme'` CSS example, a non-existent
  `import { themes }`, stale "JetBrains Mono", a wrong breadcrumb color, and a
  false `hide_table_of_contents` breadcrumb claim). Also removed AI-writing
  tells (zero em/en dashes across the set).
- **demo (v4 readiness)**: migrated `onBrokenMarkdownLinks` to
  `markdown.hooks.onBrokenMarkdownLinks` (top-level deprecated, removed in v4);
  enabled Docusaurus Faster (Rspack + SWC + Lightning CSS); enabled
  `future.v4.useCssCascadeLayers` and verified the theme builds and renders
  correctly under it (the theme stays unlayered, so it wins over the
  now-layered Infima by spec).

### Internal

- Maintainer note in `theme.css` cataloguing the CSS-module class prefixes the
  theme matches (outside Docusaurus's public API, re-verify each major).

The published theme output is unchanged from 2.2.1 (docs, demo config, and a CSS
comment only).

---

## [2.2.1] - 2026-07-16

### Security

- **demo dependencies**: pin patched versions via `overrides` for transitive
  deps flagged by Trivy in the Docker image: `shell-quote` (CVE-2026-9277,
  **CRITICAL**), `lodash`, `fast-uri`, `undici`, plus, scoped to their parent so
  other majors stay untouched, `picomatch` (under `anymatch`), `ws` (under
  `webpack-bundle-analyzer` and `webpack-dev-server`), and `path-to-regexp`
  (under `express`). None of these ship in the npm package (CSS-only, no runtime
  deps); they affect the demo Docker image only.
- **`.trivyignore`**: document `sigstore` CVE-2026-48815 as not-applicable. It
  lives in the base image's bundled npm (build-time provenance only, never the
  demo runtime); the fix needs npm ≥ 12 / node ≥ 22, deferred to a future
  base-image bump.

### Fixed

- **publish.yml**: the Trivy scan passed the input `trivyignore` (singular), but
  `aquasecurity/trivy-action` expects **`trivyignores`**, so `.trivyignore` was
  silently never applied. Fixed, so the documented suppressions take effect.

---

## [2.2.0] - 2026-07-15

### Added

- **Self-hosted fonts**: Outfit + IBM Plex Mono are now bundled as woff2
  (`src/css/fonts/`, SIL OFL 1.1) instead of a Google Fonts `@import`. No
  visitor-IP leak to Google (GDPR), no render-blocking third-party request,
  and it works under a strict Content-Security-Policy. Outfit ships as one
  variable file per subset (weight axis 400-700).
- **Brand recolor via custom properties**: `--cosmos-brand`,
  `--cosmos-brand-rgb`, `--cosmos-brand-light`, `--cosmos-brand-light-rgb`.
  Override the light pair and the dark pair to recolor the whole theme.
- **README**: customization/override guide (wiring `custom.css`, `!important`
  note) and a known-limitation note about the color-mode toggle on i18n sites.

### Changed

- **Badges**: `.badge--success/warning/danger` backgrounds darkened to the
  `-700` design tokens to meet WCAG AA contrast (were 2.35-3.76:1 with white
  text, now ≥ 4.8:1).
- **Base font size**: `--ifm-font-size-base` moved from `16.5px` to
  `1.0313rem` so it honors the browser's font-size preference (identical at the
  default root size).
- **Docker**: `npm install` → `npm ci` for reproducible, lockfile-exact builds.
- **demo**: React `19.2.4` → `19.2.7`, Docusaurus `3.9.2` → `3.10.1`.
- **Dev tooling**: `markdownlint-cli` → `0.49.1`, `prettier` → `3.9.5`,
  `eslint` → `10.7.0`, `stylelint` → `17.14.0`.
- **CI actions** (SHA-pinned): `docker/build-push-action` v7.3.0,
  `actions/upload-pages-artifact` v5.0.0, `actions/setup-node` v7.0.0,
  `docker/login-action` v4.4.0, `actions/deploy-pages` v5.0.0.
- **Internal**: the brand color is now a single source of truth via custom
  properties (no visual change; computed values are identical).

### Fixed

- **Code block title**: matched by class substring (`[class*='codeBlockTitle']`)
  instead of a build-generated CSS-module hash (`.codeBlockTitle_Ktv7`) that
  would silently stop matching on a Docusaurus upgrade.

### Security

- Resolved all `npm audit` advisories in the dev toolchain (4 HIGH plus
  moderates → 0). The published package still ships no runtime dependencies.

---

## [2.1.4] - 2026-03-17

### Security

- **Dockerfile**: add `apk upgrade --no-cache` (fixes zlib CVE-2026-22184 CRITICAL)
- **demo**: add overrides for `cross-spawn`, `glob`, `minimatch`, `tar`
  (actual installed versions are patched; overrides force resolution to fixed versions)
- **`.trivyignore`**: suppress Trivy false positives where nested `package.json`
  version specs are read instead of actual installed (overridden) versions
- **publish.yml**: pass `trivyignore` path to `trivy-action`

---

## [2.1.3] - 2026-03-17

### Security

- **Dockerfile**: base image `node:20.19-alpine3.21` → `node:20.20.1-alpine3.23`
  (fixes CVE-2025-15467 CRITICAL + 4 HIGH in `libcrypto3`/`libssl3`)
- **demo**: force `serialize-javascript ^7.0.4` via `overrides`
  (fixes HIGH in webpack transitive chain: Docusaurus 3.9 ships a vulnerable version)

---

## [2.1.2] - 2026-03-17

### Fixed

- **Mobile navbar sidebar**: `.navbar-sidebar` had no background rule, so
  Infima's default rendered it white in both light and dark mode. Now
  inherits `--ifm-navbar-background-color` (correct for both themes).
- **Mobile navbar overflow**: external links (e.g. GitHub) in
  `.navbar__items--right` were visible on mobile (≤ 996px), overlapping
  the search bar. Hidden on mobile, reachable via the hamburger menu.

### Changed

- **eslint**: `9.39.4` → `10.0.3`
- **@eslint/js**: `9.39.4` → `10.0.1`
- **aquasecurity/trivy-action**: `0.30.0` → `0.35.0` (SHA pinned)

---

## [2.1.1] - 2026-03-11

### Fixed

- **Breadcrumb**: `ul.breadcrumbs { display: flex }` + `::after { content: none }` kills Infima's
  whitespace injection between items; ChevronRight separator correctly aligned as flex child
- **Sidebar sub-menu**: corrected CSS selector from `.theme-doc-sidebar-menu .menu__list .menu__list`
  to `.menu__list > .menu__list-item > .menu__list` (direct child `>`) to match the actual DOM depth;
  `margin-left: 35px !important` aligns `|` line under category title text (measured 51.3px)
- **Sidebar sub-menu color**: `var(--ifm-menu-color)` instead of muted secondary
- **Banners (admonitions)**: reverted unsolicited CSS overrides; kept only the two requested rules:
  `[class*='admonitionHeading']:not(:last-child) { margin-bottom: 1rem }` and
  `[class*='admonitionIcon'] { display: inline-block; vertical-align: middle; margin-right: 0.4em }`
- **Demo MDX**: `class=` → `className=` in 7 files (fixes React DOM property warning)

### Added

- **`lint-mdx`** Makefile target: scans `demo/docs/**/*.md` for `class=` outside code blocks,
  preventing React prop warnings from slipping through the lint pipeline
- **`demo-check`** Makefile target: verifies 12 key pages exist in the static build output
  after `make demo-build`; more reliable than HTTP checks against the SPA dev server
- **`demo/scripts/check-pages.js`**: static build file checker used by `demo-check`
- `lint` target now includes `lint-mdx` as 5th step

## [2.1.0] - 2026-03-11

### Added

- **Banners (admonitions), complete redesign**: Dismissible Alert style from Rackscope
  `ui-library/alerts` with a uniform full border (not left-only), semantic icon colors, flex
  heading layout, and `overflow: hidden` to clip child shadows at rounded corners
- **Navbar COSMOS wordmark**: Outfit 700 uppercase, brand indigo `#465fff` / `#7592ff` dark;
  `|` vertical separator; active nav tab underline indicator matching Tabs style
- **Tabs**: flat underline (no border-radius), brand active state, proper dark mode vars
- **Pagination**: `rounded-lg`, monospace uppercase sublabel, brand hover ring
- **Breadcrumb**: ChevronRight SVG separator (disables Infima default), brand hover
- **Details accordion**: ChevronRight SVG arrow replacing `›` character
- **Blockquote**: brand left border + subtle tint
- **`<kbd>`**: chip style with 3D bottom border
- **Markdown images**: `border-radius: 12px` + shadow
- **`<abbr title>`**: styled tooltip on hover
- **Buttons**: `.btn` `.btn-primary` `.btn-secondary` `.btn-danger` `.btn-sm` `.btn-lg`
- **Release badges**: `.badge-new` `.badge-beta` `.badge-deprecated` `.badge-experimental`
- **Steps**: `ol.steps`, a numbered procedure with circle indicators
- **Timeline**: `ul.timeline`, a versioned event list with a vertical line
- **Check list**: `ul.list-check`, a feature list with checkmarks
- **Footer CSS**: 4-column grid, responsive (4→2→1), monospace section titles, brand colors
- **Announcement bar**: gradient indigo, improved link style
- **Favicon**: cosmos atom SVG injected via `injectHtmlTags()` with opt-out option
  `injectFavicon: false`; SVG properly `encodeURIComponent()`-encoded for `data:` URI
- **`validateOptions()`** exported: Docusaurus options validation for the theme plugin
- **Demo site restructure**: `showcase/` → `components/` (10 pages); dual navbar
  Documentation | Components; Components sidebar dedicated; `class=` → `className=` in MDX

### Changed

- **Font**: JetBrains Mono → **IBM Plex Mono** (code blocks, kbd, monospace elements)
- **Sidebar sub-menu**: `var(--ifm-menu-color)` color; `|` line aligned under title text
- **GitHub Actions**: all SHA-pinned (supply chain hardening); Node 20.19 pinned
- **CI**: Trivy vulnerability scan before Docker push; `npm ci` in all demo jobs;
  `publish.yml` runs full `npm run lint` before publish; `workflow_dispatch` default removed
- **Dockerfile**: `node:20.19-alpine3.21` (was floating `node:20-alpine`)
- **`demo/package.json`**: `@easyops-cn ^0.55` (was `latest`); `file:..` dependency
- **package.json**: description updated, removes stale "TailAdmin" reference

## [2.0.3] - 2026-03-11

### Added

- **Makefile** with developer targets: `lint`, `lint-css`, `lint-js`, `lint-md`,
  `lint-format`, `format`, `lint-fix`, `security`, `audit`, `install`,
  `demo-build`, `demo-start`, `demo-serve`, `demo-clear`, `docker-build`,
  `docker-up`, `docker-down`, `clean`
- **ESLint** (`eslint@9`, `@eslint/js`): flat config (`eslint.config.mjs`),
  lints `src/**/*.js`; rules: `no-unused-vars` (allow `_` prefix), `no-console off`
- **Prettier** (`prettier@3`): formats CSS, JS, JSON, MD; `.prettierrc` + `.prettierignore`
- **markdownlint-cli** (`@0.48`): lints `*.md` and `docs/**/*.md`; `.markdownlint.json`
  with `MD024: siblings_only` (CHANGELOG-friendly), `MD013/MD033/MD041` disabled
- `npm` scripts: `lint:js`, `lint:md`, `lint:format`, `format`, `lint:fix`;
  `lint` now runs all four linters in sequence
- **CI**: `lint` job extended with JS (ESLint), Markdown, and Prettier steps

### Fixed

- `README.md`: `MD001` heading jump `###` → `##` for Live Demo link; `MD060` table
  pipe spacing on two tables; Development section updated to reference `make` commands
- `CHANGELOG.md`: `MD004` unordered list style, `+` continuation replaced with `and`
- `src/css/theme.css`: reformatted by Prettier (alignment, spacing; no logic change)

## [2.0.2] - 2026-03-11

### Added

- **Dynamic version badge**: the sidebar badge now reads the version from `package.json` at
  build time via `injectHtmlTags()` in `src/index.js`; no longer hardcoded in CSS.
  Consumers upgrading the package will see the correct version without any manual edit.

### Changed

- **Font weights**: Outfit loaded with 4 weights (`400;500;600;700`) instead of 6
  (`300;400;500;600;700;800`); `300` and `800` were unused, reducing the Google Fonts payload
- **demo/package.json**: `cosmos-docusaurus-theme: "latest"` → `"^2"` to prevent
  pulling an unexpected future major version at Docker build time
- **Dockerfile** simplified: only `demo/` is copied (no longer needs the full project
  tree since `file:..` dependency is replaced by `^2` from npm); proper layer caching
  with `package.json` copied before source files
- **workflow_dispatch default**: `ref` input default updated from `v2.0.0` → `v2.0.2`

### Removed

- Hardcoded `:root { --cosmos-version: "cosmos v1.2.6" }` from `theme.css`
  (superseded by `injectHtmlTags()` injection)

## [2.0.1] - 2026-03-10

### Fixed

- **Tables full-width**: `display:table; width:100%` on desktop (>996px),
  `display:block; overflow-x:auto` on mobile. Responsive, never breaks layout

## [2.0.0] - 2026-03-10

### Added: native Docusaurus component coverage

1. **Color mode toggle icons**: sun (amber `#fbbf24`) in dark mode, moon (brand indigo `#7592ff`) in light mode via CSS `filter` colorization
2. **TOCCollapsible**: mobile table-of-contents styled as bordered card with uppercase monospace label, matching sidebar section labels
3. **DocCard / DocCardList**: auto-generated category index cards follow Void/Slate palette with hover lift
4. **Announcement bar close button**: `×` styled with opacity + hover bg tint
5. **Tag pages**: `/docs/tags/...` pages use pill tags with brand hover state
6. **Mobile search**: search input collapses to `2rem` icon-only on ≤576px, expands on focus with smooth width transition
7. **prefers-reduced-motion**: all transitions and animations disabled when the OS accessibility setting is active

### Fixed

- **Docker GHCR push timeout**: `provenance: false` + `sbom: false` on `docker/build-push-action` eliminates attestation overhead that caused network timeouts; `timeout-minutes: 30` on job; `docker/setup-buildx-action` added explicitly
- **CSS comments**: removed stale TailAdmin references, fixed redundant inline color-name comments

## [1.2.6] - 2026-03-10

### Added

- **Sidebar icons**: category icon system via `className: 'sidebar-cat-*'` in `sidebars.js`.
  10 Lucide-style SVG icons (rocket, monitor, pencil, puzzle, sliders, folder, server,
  database, layers, grid, code). CSS-only with dark-mode `filter:invert(1)`.
- **Sidebar sub-menu vertical line**: Rackscope-style left border on nested items.
  Sub-items: slightly smaller font, muted color, left padding.
- **Sidebar version badge**: always pinned at the very bottom of the sidebar viewport
  (`[class*="sidebarViewport"]` flex-column + `::after` outside scroll area).
  Hardcoded backgrounds (#fff / #111827) to always cover scrolled content.
- **Ctrl+K hint redesign**: ghost style with transparent chips and a hairline border,
  `+` separator via `::before`, opacity 0.7 at rest, 0.9 on input focus.
  Preserves plugin positioning (only kbd elements restyled).

### Changed

- Search input: `min-width` 220px → 300px; font-family → `var(--ifm-font-family-base)` (Outfit)
- Demo `docusaurus.config.js`: `{ type:'search' }` positioned before external links;
  `searchBarShortcutHint: true`
- Dockerfile: copies full project so `file:..` resolves during local dev

## [1.2.5] - 2026-03-10

### Fixed

- **Search position**: add `{ type: 'search' }` in demo config before external links
  (CSS `order` alone insufficient when easyops inserts search last in DOM)
- **Search CSS selectors**: `[class*="navbarSearchContainer"]` with `order: -1 !important`
  and `[class*="navbarSearch"]`; the previous `.navbar__search` didn't match the actual class
- **Search input styling**: `!important` on bg/color to beat CSS module specificity
- **CTRL+K**: redesigned as compact transparent pill with clean kbd elements
- **colorModeToggle**: `order: 1 !important` on wrapper div (not button)
- **Hover**: navbar link color now changes to brand primary in both modes

## [1.2.2] - 2026-03-10

### Added

- **`@easyops-cn/docusaurus-search-local` native support**: CSS palette overrides
  so the search dropdown matches Void (dark) / Slate (light) out of the box.
  Set `--search-local-*` variables and `--ifm-navbar-search-input-*` for both modes.
  Navbar search input styled as ghost button matching navbar external links.
- Demo site ships with `@easyops-cn/docusaurus-search-local` pre-configured

### Changed

- Screenshots updated to 2560×1440 (2K) with search bar visible
- New `search.png` screenshot of active search dropdown

## [1.2.0] - 2026-03-10

### Changed: Rackscope design system alignment

6 axes inspired by the `templates/default` component library:

- **Border radius**: Cards `16px` (rounded-2xl), code `12px`, inline code `6px`, pagination `12px`
- **Admonitions**: AlertBanner style with `rounded-2xl`, all-around border at semantic opacity, `padding: 16px 20px`
- **Dark shadows**: shadow-card pattern on cards + code blocks (heavier on dark surfaces)
- **Details/summary**: SectionCard style with `rounded-2xl`, chevron that rotates, dark bg-gray-900
- **TOC active**: bg pill `rgb(70,95,255,0.08)` + border-radius + padding (mirrors sidebar active)
- **Sidebar labels**: `10px` + `letter-spacing: 0.12em` (exact Rackscope LayoutLabel)
- **Typography**: `h1 font-weight: 800`, tight letter-spacing (`-0.04em` → `-0.01em`)
- **Scrollbar**: `4px` (was 5px) to match Rackscope index.css

## [1.1.6] - 2026-03-10

### Changed

- **Navbar right items**: unified ghost button style. External links (GitHub, npm, etc.)
  and the color mode toggle now share the same bordered appearance:
  `1px solid border`, `border-radius: 8px`, identical hover (indigo border + tint)
- Replaces the inconsistent circular toggle + plain text link combo

## [1.1.5] - 2026-03-10

### Fixed

- **Tooltip**: right-aligned to prevent viewport overflow; appears below button
- **Tables dark mode**: direct overrides on `th`/`td`/`thead`, because Infima did not
  cascade the CSS variables down to table cells
- **Cards dark mode**: direct `background-color: #111827` override
- **Breadcrumbs**: explicit active/inactive link colors + separator in dark mode
- **Toggle button**: subtle hover background for better visibility

## [1.1.4] - 2026-03-10

### Fixed

- Tooltip now appears **below** the toggle button instead of above (was clipped
  by the top of the viewport since the navbar sits at the very top of the page)
- Arrow direction corrected accordingly (points up toward the button)

## [1.1.3] - 2026-03-10

### Added

- **Theme transition**: smooth 0.25s fade on `background-color`, `color`, `border-color`
  for navbar, sidebar, article, footer and cards; no more abrupt color switch
- **Color mode tooltip**: shows current mode (`dark mode` / `light mode` / `system mode`)
  on hover over the Docusaurus toggle button, styled per the Void/Slate palette

## [1.1.2] - 2026-03-10

### Added

- `.state-ok`, `.state-warn`, `.state-crit`, `.state-unknown`: aliases for projects
  that use the `.state-*` naming convention (identical colors to `.status-*`)

## [1.1.1] - 2026-03-09

### Fixed

- **Navbar regression**: dark mode navbar was rendering white with dark text. Root cause:
  `--ifm-navbar-background-color` CSS variable was not reliably applied in Docusaurus 3
  SSG/CSR builds. Fix: add direct CSS property overrides on `.navbar` and `.navbar__link`
  instead of relying solely on CSS custom properties.
- Dark mode navbar: `background-color: #111827` (Void gray-900) forced directly on element
- Dark mode footer: `background-color: #030712` (Void gray-950) forced directly
- Dark mode `.main-wrapper`: `background-color: #030712` forced directly
- Navbar links/brand/toggle: explicit `color: #e5e5e5` in dark mode

## [1.1.0] - 2026-03-09

### Added

- **Progress bar**: `--docusaurus-progress-bar-color` → brand indigo (light + dark)
- **Announcement bar**: brand-colored banner with styled links and close button
- **Breadcrumbs**: active crumb uses brand color with subtle hover background
- **Tabs**: styled active tab border + color, hover state on inactive tabs
- **Cards**: border, rounded corners (12px), hover effect with brand border
- **Tags**: pill style with brand-colored background and border
- **Back-to-top button**: brand indigo with hover state (both modes)
- **Algolia DocSearch**: full `--docsearch-*` variable set for light and dark
- **Demo**: now loads `cosmos-docusaurus-theme` as a real npm package (`file:..`)
  instead of a local path, which mirrors a real consumer setup exactly
- **Demo**: new "Native Features" page demonstrating all newly styled elements

### Changed

- `demo/docusaurus.config.js`: `themes: ['cosmos-docusaurus-theme']` (was local path)
- `demo/package.json`: added `cosmos-docusaurus-theme: "file:.."` dependency

## [1.0.1] - 2026-03-09

### Fixed

- Aligned dark palette to **Void** (Tailwind gray-950/900/800 neutral blacks, not TailAdmin bluish-gray)
- Aligned light palette to **Slate** (warm brown text tones `#1a1714` / `#5c574f`, not cold blue-gray)
- Corrected all hardcoded color values in sidebar, navbar border, footer border, scrollbar
- Updated screenshots to reflect corrected palette

## [1.0.0] - 2024-03-09

### Added

- Initial release of `cosmos-docusaurus-theme`
- CSS-only theme based on TailAdmin design system
- Proper Docusaurus theme plugin via `getClientModules()`: use with `themes: ['cosmos-docusaurus-theme']`
- Backwards-compatible CSS import via `cosmos-docusaurus-theme/css/theme.css`
- Light and dark mode support (`[data-theme='dark']`)
- Outfit + JetBrains Mono typography loaded from Google Fonts
- Indigo brand palette (`#465fff`) mapped to Infima CSS variables
- Styled: navbar, sidebar, code blocks, admonitions, tables, pagination, footer, scrollbar
- Optional utility classes: `.method-get/post/put/delete/patch`, `.status-ok/warn/crit/unknown`
- Demo site deployed to GitHub Pages
- CI workflow: stylelint + npm audit + demo build
- Publish workflow: npm publish + GitHub Pages deploy on `v*` tags
- Dependabot for npm and GitHub Actions
