Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@
"Bash(python3 -m muriel.oklch:*)",
"Bash(.venv/bin/python -m muriel.oklch:*)",
"Bash(uv run python -m muriel.oklch:*)",
"Bash(python -m muriel.rasterize:*)",
"Bash(python3 -m muriel.rasterize:*)",
"Bash(.venv/bin/python -m muriel.rasterize:*)",
"Bash(uv run python -m muriel.rasterize:*)",
"Bash(cairosvg:*)",
"Bash(.venv/bin/cairosvg:*)",
"Bash(python -m cairosvg:*)",
Expand Down
15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,21 @@ version numbers follow [Semantic Versioning](https://semver.org/).

### Added

- **`muriel rasterize` — SVG to PNG without Cairo.** The critique agent's
rasterize step called `cairosvg`, which on Windows installs and then fails
at import (no `libcairo-2.dll`). `muriel.rasterize` keeps cairosvg first
and falls back to ImageMagick 7 (`magick`), whose Windows build carries
librsvg and Cairo itself. Its librsvg reads only the first family of a
`font-family` stack and rounds weight 600 to Bold, so before the render
every stack is resolved against `magick -list font`. The CSS keywords muriel's
generators lead with (`ui-sans-serif`, `system-ui`, `ui-monospace`)
resolve to the faces a browser picks. On Windows, intermediate weights
become their named faces ("Segoe UI Semibold"), chosen by the CSS
weight-matching rule. Prints the backend, every substitution, leftover
font fallbacks, and a note when `<image>` elements are present, since
ImageMagick's librsvg drops them. The critique agent and the repo's
permission allowlist now point at it.

- **`muriel.collection` accepts a clip's `video` for Wunderkammer's next
release.** Wunderkammer's `feat/video-tiles` (4c86e79) adds an optional
`video` to a clip: one http(s), `blob:` or relative URL, never `data:`,
Expand Down
2 changes: 2 additions & 0 deletions muriel/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
muriel diagram-check fig.svg # a11y + label + contrast gate
muriel dimensions # print the dimensions registry
muriel heroshot in.png out.png --tilt 12
muriel rasterize fig.svg -o fig.png # SVG to PNG, cairosvg or ImageMagick
muriel tilt-shift raw.png hero.png
muriel venn spec.json out.png
muriel styleguide examples/muriel-brand.toml --css
Expand Down Expand Up @@ -60,6 +61,7 @@
"import-tokens": ("muriel.design_tokens_import", "Convert a DTCG / open-codesign tokens.json into a muriel brand.toml"),
"import-corpus": ("muriel.tools.corpus_audit", "Audit a DESIGN.md corpus through design_md_import + 8:1 floor"),
"palettes": ("muriel.palettes", "List / generate / validate categorical palettes (CVD + contrast)"),
"rasterize": ("muriel.rasterize", "SVG to PNG for a visual audit: cairosvg, else ImageMagick with fonts pinned to installed faces"),
"smartcrop": ("muriel.tools.smartcrop", "Saliency-aware crop solver (edges + optional faces / text / saliency)"),
"squint": ("muriel.squint", "Dimension-scaled blur ladder + thumbnail companions — does hierarchy survive degradation?"),
"styleguide": ("muriel.styleguide", "Load a brand.toml; print / derive CSS / matplotlibrc / contrast audit"),
Expand Down
Loading
Loading