A YAML parse error in config.yml (e.g. a stray tab character) caused
read_config to swallow the exception and return {}, disabling categories
and producing a broken nav.yml with no variants fields and wrong filenames.
read_config now raises ClickException on both OSError and YAMLError.
Documented in docs/knownbugs.md and docs/unreleased.md.
https://claude.ai/code/session_01Xs5GyREFhjWxhS1UhW2wA8
mdcms build now writes the sitename from config.yml into the <title> tag
of index.html. WhatsApp, Slack, and other link-preview crawlers read the
static HTML without executing JavaScript, so the title must be correct in
the raw file. Previously it was blank (or "MD-CMS" in older templates).
The static <title> element previously showed "MD-CMS" before JavaScript
loaded. The JS already sets document.title from config.sitename on boot,
so clearing the initial value ensures the browser tab never displays the
hardcoded string.
Pages without a category suffix still map to the default category.
Only posts/ files without a suffix get uncategorized: true in nav.yml
and category: null in search.json.
https://claude.ai/code/session_01EzU13EL8D5Ud2ngQUKDj9e
Files without a category suffix (e.g. post.md alongside post.en.md)
previously only appeared in the default category. They now appear in
every category, so untranslated content is always visible.
- mdcms.py: nav entries with a bare variant get `uncategorized: true`;
search.json keeps `category: null` instead of mapping to default code
- index.html: pageShouldDisplay, posts filter, and category dropdown
all treat uncategorized/null-category items as universally visible
https://claude.ai/code/session_01EzU13EL8D5Ud2ngQUKDj9e
* Fix category picker and hamburger using page colours instead of nav colours
Both elements render against --bg-nav but were using --font-colour (the page
text colour). Switch to --nav-link-colour / --nav-section-heading-colour /
--nav-link-active-colour so they remain legible when nav-background is set to
a colour that contrasts with the page text colour (e.g. dark blue nav with
white nav-link text).
https://claude.ai/code/session_01MA8V1FvCmxjkCYyTxseaxB
* Fix category font not reverting when switching to a no-font category
maybeLoadCategoryFont applied a font-family to document.body but never
cleared it when switching to a category with no font defined. The inline
style overrides the CSS --font-body variable, so the category font
persisted indefinitely.
Fix: reset document.body.style.fontFamily to '' when the target category
has no font (letting --font-body take effect), and re-apply the family
string when switching back to an already-loaded font category.
https://claude.ai/code/session_01MA8V1FvCmxjkCYyTxseaxB
---------
Co-authored-by: Claude <noreply@anthropic.com>
Both elements render against --bg-nav but were using --font-colour (the page
text colour). Switch to --nav-link-colour / --nav-section-heading-colour /
--nav-link-active-colour so they remain legible when nav-background is set to
a colour that contrasts with the page text colour (e.g. dark blue nav with
white nav-link text).
https://claude.ai/code/session_01MA8V1FvCmxjkCYyTxseaxB
Co-authored-by: Claude <noreply@anthropic.com>
Nastaliq and other complex scripts need significantly more vertical
space than Latin text. A new `line-height` key on any category entry
in config.yml overrides --line-height-body for that category and
restores the theme default when switching away.
https://claude.ai/code/session_01LZVnq4wUgdv5oXFLcj6qXf
The mobile header was hidden via mobileHeader.style.display='none' (inline style),
then a dynamically-injected <style> with !important was supposed to reveal it on mobile.
Inline styles and injected stylesheets interact inconsistently across browsers, making
the hamburger invisible on mobile in practice.
Replace with a simple CSS-only approach: add a base rule
'.layout-sidebar .mobile-header { display: none; }' so the existing media-query
'display: flex' override works through normal cascade — no inline style needed,
no !important injection needed.
https://claude.ai/code/session_01HRJsjppKZ2cpmNUAV2NXds
Two new top-level theme.yml keys — nav-section-expand-icon and
nav-section-collapse-icon — replace the hardcoded arrow_right/arrow_drop_down
used on collapsible nav sections. Defaults preserve existing behaviour.
Eight new icon SVGs added to app/assets/icons/:
keyboard_arrow_right / keyboard_arrow_down (chevrons)
keyboard_double_arrow_right / keyboard_double_arrow_down
expand_content / collapse_content (corner arrows)
add / minimize (plus/minus)
All eight added to STANDARD_ICONS so fetch-deps bundles them correctly.
CLAUDE.md key reference and docs/claude-design.md updated with the full
icon catalogue, pairing guidance, and style notes for Claude Design.
https://claude.ai/code/session_01NQKywehSj8Ku4yKhwB4VNB
Documents every colour pairing to check, WCAG contrast targets for each
role, and common failure modes (saturated accents, muted text on tinted
backgrounds, dark-mode text-muted). Checklist expanded with contrast items.
https://claude.ai/code/session_01NQKywehSj8Ku4yKhwB4VNB
Separates sidebar header colours from nav link colours. The three new keys
control the site name, site description, and dark/light toggle independently,
each cascading from the nearest nav variable (nav-sitename → nav-link,
nav-description and nav-toggle → nav-section-heading) so existing themes
are unaffected.
Enables Claude Design to fine-tune sidebar header legibility on saturated or
bold nav backgrounds without having to override the nav link colours, and vice
versa. CSS selectors and applyThemeYml() updated; app/theme.yml, CLAUDE.md,
and docs/claude-design.md updated with full key reference and pattern examples.
https://claude.ai/code/session_01NQKywehSj8Ku4yKhwB4VNB
Clarifies that nav-link, nav-link-active, and nav-section-heading affect not
just nav links but also the site name, description, and theme toggle — all
sidebar elements that inherit from these variables. Adds a rule of thumb for
when to set the keys explicitly (saturation >20%, or lightness outside the
neutral range).
https://claude.ai/code/session_01NQKywehSj8Ku4yKhwB4VNB
Site name, site description, and dark/light mode toggle all used content-area
colour variables (--font-colour, --font-colour-muted, --divider) which clash
when nav-background differs from the page background. All three now reference
the nav colour variables (--nav-link-colour, --nav-link-active-colour,
--nav-section-heading-colour) with graceful fallbacks, so they remain legible
on any nav background colour without requiring new theme.yml keys.
https://claude.ai/code/session_01NQKywehSj8Ku4yKhwB4VNB
--divider in both light and dark modes now auto-derives from the theme's
background and text colours using color-mix(in srgb, bg 85%, text), so
accent-coloured or custom-background themes get a correct divider without
any extra config. An explicit `divider` key in theme.yml overrides this
for the rare cases where exact control is needed.
docs/claude-design.md and CLAUDE.md updated accordingly.
https://claude.ai/code/session_01NQKywehSj8Ku4yKhwB4VNB
Fixes theme designs (e.g. accent-coloured nav backgrounds) where active nav
links were invisible because nav-link-active defaulted to accent on an
accent-coloured background. Adds colours-semantic-dark for dark mode callout
legibility.
https://claude.ai/code/session_01NQKywehSj8Ku4yKhwB4VNB
- New theme.yml keys: nav-link, nav-link-active, nav-section-heading (per
light/dark mode). Fixes themes where nav-background equals accent, which
made active nav links invisible against their own background.
- New colours-semantic-dark block overrides callout semantic colours in dark
mode only, preventing washed-out callout borders and backgrounds on dark
page backgrounds.
- CSS: nav item and section heading selectors now use the new CSS variables
with graceful fallbacks to existing defaults — no breakage for themes that
don't set the new keys.
- app/theme.yml starter updated with new keys (commented examples) and
sensible colours-semantic-dark defaults.
- CLAUDE.md updated with full key reference table and guidance on when to
use nav colour overrides.
- docs/claude-design.md: new authoring guide for Claude Design covering
contrast rules, nav pattern examples, and a pre-publish checklist.
https://claude.ai/code/session_01NQKywehSj8Ku4yKhwB4VNB
Updated GitHub Actions workflow to include permissions and modified installation command for mdcms. Changed directory handling for building sections to use a loop instead of hardcoded values.
- mdcms.py: expand abbreviated notice to full boilerplate
- app/index.html: fix version in comment header (v0.3.8 → v0.4)
- app/config.yml: add missing final two lines of notice
- app/theme.yml: add full licence notice (was missing entirely)
https://claude.ai/code/session_01UP8Wo2CKPNhvvTkzX48CWF
- Branching: main=release, development=default dev branch, no per-conversation branches
- Add v0.4 renderer features section (callouts, TOC, theme, icons, PWA, fetch-deps)
- Note topbar nav is broken — always use sidebar
- Update version markers to v0.4 throughout
- Add note that tag pushes must be done locally (cloud env blocks them)
https://claude.ai/code/session_01UP8Wo2CKPNhvvTkzX48CWF
Completes the v0.4 milestone. All 7 phases merged and tested.
Phase 7: manifest.json + service-worker.js generation, cache-first offline SW,
offline message from config.yml, favicon.png, PWA installable on desktop.
Also: callout border-color/background CSS fix; v0.4.0 version bump across all files.
- mdcms.py: CLI_VERSION 0.4.0, updated docstring and comment
- pyproject.toml: version 0.4.0
- app/index.html: site format marker → mdcms v0.4
- app/config.yml: site format marker → mdcms v0.4
- app/theme.yml: add site format marker mdcms v0.4
https://claude.ai/code/session_01UP8Wo2CKPNhvvTkzX48CWF