When set to visible, the category always appears in the selector
even when no variant exists for the current page. Navigating to
such a page shows pagenotfoundmessage with no fallback to
default-category content. Default behaviour (hidden) is unchanged.
Updates pageShouldDisplay and visibleCategoryCodesForCurrentPage
to honour the new key alongside the existing notfoundmessage logic.
Docs updated with key description, summary table, and full example.
iOS Safari can fail to honour transform: translateX(-100%) on position:fixed
elements, leaving the sidebar sitting over the content at z-index 100 and
blocking the mobile-header (z-index 50) that contains the hamburger.
Add visibility: hidden to the closed mobile sidebar. A transition-delay of
0.3s (matching the transform duration) keeps the slide-out animation intact —
the sidebar slides away first, then disappears. The open state resets the
transition immediately so the sidebar becomes visible before sliding in.
https://claude.ai/code/session_017r3kqm4FgEGy2DPPzYcLYQ
* 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
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
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
- 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
- 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
- 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
border-left was 4px solid without color; background was missing.
JS sets --callout-primary and --callout-bg on each callout element
but CSS wasn't referencing them.
https://claude.ai/code/session_01UP8Wo2CKPNhvvTkzX48CWF
Cherry-pick had auto-merged with wrong base (reverted TOC/callout CSS
and renderTocTag). Now uses main's index.html with only the three
phase7 additions applied on top: manifest link, SW registration
script, and offline-message localStorage handling.
https://claude.ai/code/session_01UP8Wo2CKPNhvvTkzX48CWF
- config.yml: pwa: yes, navigation: sidebar, offline-message
- home.md: Phase 7 test instructions
- about.md, docs.md: sample pages for offline cache testing
- test_phase.py: all phases point to claude/* branches; EXTRA_FILES for 5 and 7
- version bump to 0.3.9
https://claude.ai/code/session_01UP8Wo2CKPNhvvTkzX48CWF
- Add generate_pwa(): builds manifest.json (name, short_name, theme_color,
standalone display, favicon icon) and service-worker.js with a
cache-first strategy; cache name is versioned by a hash of the precache
file list so new builds automatically invalidate old caches; precache
list covers index.html, config.yml, nav.yml, search.json, theme file,
and all pages/posts/assets
- Call generate_pwa() from run_build() when pwa: yes/true in config.yml
- index.html: add <link rel="manifest"> and SW registration script in
<head>; both silently no-op when the generated files are absent
- index.html boot(): write offline-message from config to localStorage
on every load so the message survives cache eviction
- index.html navigateTo(): show localStorage offline message when a page
fetch fails instead of the generic not-found message
- Update CLAUDE.md with PWA config key reference
https://claude.ai/code/session_015XtsgTMi8UtmgxEgb5Qt2c
- iconEl: use actual icon filename as <img src> fallback so browser
shows a visible broken image when the file is missing (was src="")
- Remove debug console.log statements added for diagnosis
- home.md: add test cases for message: override (with console warning)
and missing icon (broken image should render)
- home.md: add explanatory text for message: key test
https://claude.ai/code/session_01UP8Wo2CKPNhvvTkzX48CWF
Helps diagnose why title row is not showing. Logging shows the raw tag
data and whether the title branch is taken. Inline style bypasses any
CSS custom-property cascade issues.
https://claude.ai/code/session_01UP8Wo2CKPNhvvTkzX48CWF
- Extend renderer.code to match `mdcms <type>` fence syntax (e.g. ```mdcms callout-info)
- Extend parseMdcmsTag to capture body lines after the key-value block
- Add renderCalloutTag: icon + title row, markdown body, colour CSS vars
- Add hexToRgba helper for low-opacity background colour
- Make themeConfig module-level so callout renderer can read callout defaults
- Add callout CSS: left border, title row flex layout, icon fill
- Add reusable message: key support with category-aware language resolution
- Add aitranslation callout message to config.yml for test
- Update home.md with full Phase 4 test cases
https://claude.ai/code/session_01UP8Wo2CKPNhvvTkzX48CWF
- Add 17 SVG icons to app/assets/icons/ (Material Icons paths, Apache 2.0)
- Remove Google Material Icons and Symbols CDN link tags
- Add normaliseIconName(), loadIcon(), getIcon(), iconEl() — icon name
normalisation per spec §2.3, async fetch-and-cache, sync accessor,
element builder with broken-image fallback for missing icons
- Preload all standard icons (+ categories-selecticon if set) concurrently
in boot() before UI is built, so all icon references are sync after that
- Replace ICONS object with icon cache system throughout:
theme toggle → light_mode/dark_mode, search → search, hamburgers → menu,
section toggles → arrow_right/arrow_drop_down, dropdown carets →
arrow_drop_down, category selecticon → normalised SVG lookup
- Update .toggle-icon, .category-icon, .nav-caret CSS for SVG layout
- Add .mdcms-icon CSS class (inline-flex, currentColor fill)
- Fix pre-existing ICONS.close bug (was undefined; hamburger now always
shows menu icon)
https://claude.ai/code/session_015XtsgTMi8UtmgxEgb5Qt2c
- Add app/theme.yml: colours (light/dark), semantic colours, callout
defaults, fonts (with bunny: provider support), font-size, line-height,
main-width, nav-width
- app/config.yml: add `theme: theme.yml` reference; remove font and
layout keys that now live in theme.yml
- index.html: add applyThemeYml() that reads the new theme.yml format
and derives all CSS custom properties (accent-rgb, nav-active-bg,
nav-hover-bg, table-header-bg, link-colour) from the 5 user keys per
mode; add --colour-info/warning/success/error CSS vars with hardcoded
defaults; add --line-height-body CSS var
- index.html: update loadFonts() to accept themeConfig, support
provider:name:weight format for Bunny Fonts and Google Fonts
- index.html: boot() fetches theme file named by config.theme, routes
to applyThemeYml() for new format or applyConfigTheme() for legacy;
falls back gracefully to hardcoded defaults when theme key is absent
https://claude.ai/code/session_015XtsgTMi8UtmgxEgb5Qt2c
Topbar now shows two item types intermixed by sort order:
- Unsectioned pages grouped by sort century: lowest sort = top-level
link, others fold out in a dropdown beneath it
- Sections: appear as named triggers; pages fold out on hover/click;
hidden sections require click to expand, visible sections also open
on hover; draft sections excluded entirely
Desktop: hover or click to open dropdown, small ▾ caret indicates
nested items, parent link highlighted when a child page is active.
Mobile: slide-in panel with accordion expand/collapse per group,
+ / − toggle button on each group that has children.
https://claude.ai/code/session_013A4egzphocyto9bvZ76dxf
Tag names changed from posts-date-*/posts-datetime-* to posts-created-*.
Renderer updated to filter, sort, group, and display using the created
field from search.json. Page meta display also updated to drop date/datetime
fallbacks. Samplesite posts and pages updated to match.
https://claude.ai/code/session_013A4egzphocyto9bvZ76dxf
- Replace interactive TUI with click-based subcommands:
register, delete, view, build
- build accepts NAME (registry), --path, or CWD for GitHub Actions use
- Switch to PyYAML for frontmatter and nav.yml parsing
- Add pyproject.toml with click + PyYAML deps and mdcms entry point
- Add v0.3 version marker to app/config.yml and app/index.html
- Registry moves to ~/.config/mdcms/sites.json (XDG-compliant)
- Project root is now the directory containing index.html (no website/ subdir)
- register auto-downloads template from GitHub if no site found
https://claude.ai/code/session_01MqEqGhP1guGx5VuFsLaws2