Skip to content

feat(templates): real-case defaults for all 148 templates - #53

Merged
ajianaz merged 1 commit into
developfrom
feat/real-case-defaults
Aug 13, 2026
Merged

ajianaz merged 1 commit into
developfrom
feat/real-case-defaults

Conversation

@ajianaz

@ajianaz ajianaz commented Aug 13, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Replace all generic sample data with real-case content relevant to each template type.

Changes (148 defaults.json files)

New defaults (130 templates)

Previously the 130 batch templates had no defaults.json. Now all of them do, with realistic content:

  • deploy-status: production v2.1.0, service health statuses
  • changelog: version notes with breaking changes, features, fixes
  • benchmark-result: Rust vs Node.js vs Python render performance
  • code-snippet/snippet-rust: actual Rust async handler code
  • blog-hero: 'Why We Replaced Puppeteer with Pure Rust'
  • big-number: '149 templates available'
  • And 124 more templates

Fixed existing defaults (18 templates)

  • Updated brand_name/brand_handle to ajianaz/@ajianaz
  • Added show_brand: false

Bug fixes

  • Removed SVG-breaking characters (< > and &&) from code samples
  • Removed % suffixes from numeric fields used in float/int operations
  • Fixed comma-separated numbers (2,400 → 2400) in int-parsed fields

Verification

  • ✅ 148/148 templates render successfully
  • ✅ No watermark by default (show_brand: false)
  • ✅ All content uses 'ajianaz' (never 'Ajian Azhari')
  • ✅ No generic 'Sample' text anywhere

Replace generic sample data with realistic, template-relevant content:
- deploy-status: production v2.1.0 deployment with service statuses
- changelog: real version notes with breaking changes and features
- benchmark-result: Rust vs Node.js vs Python render performance
- code-snippet: actual Rust async render handler code
- blog-hero: 'Why We Replaced Puppeteer with Pure Rust'
- big-number: '149 templates available'
- And 142 more templates with contextually relevant content

All defaults now include show_brand: false (no watermark by default).
Fixed SVG-breaking characters in code samples (< > and && removed).
Fixed float-parsing issues (% suffixes removed from numeric fields).

148/148 templates render successfully.
@ajianaz
ajianaz merged commit 53df5e2 into develop Aug 13, 2026
0 of 11 checks passed
@ajianaz
ajianaz deleted the feat/real-case-defaults branch August 13, 2026 11:14
ajianaz added a commit that referenced this pull request Aug 28, 2026
* chore: sync main to develop (release workflow fixes) (#30)

* fix(ci): use mlugg/setup-zig action for cargo-zigbuild

apt-get zig not available on ubuntu-24.04. Switch to mlugg/setup-zig@v1.
Also fix packaging to find binary in zigbuild output path.

* fix(ci): drop cargo-zigbuild, use standard cargo build

mlugg/setup-zig returning 404. Simplify to standard cargo build for v0.1.0.
GLIBC compatibility can be addressed in a future release.

---------

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(docs): add VitePress documentation site with API reference and template gallery (#31)

- VitePress setup with Catppuccin Mocha brand theme
- Guide pages: installation, quick start, CLI reference, HTTP server, Docker, configuration, branding
- Template gallery: all 18 templates with schema reference and JSON examples
- API reference: health check, render endpoint, authentication
- Template authoring guide (moved from docs/ to docs/guide/)
- GitHub Pages CI workflow (bun-based, auto-deploy on docs/** push)
- 32 HTML pages generated, builds in ~8s

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(docs): add sample images and field descriptions for all 18 templates (#32)

- Render all 18 templates with CodeCora brand as visual samples
- Embed sample PNG in each template page (docs/public/samples/)
- Add human-readable field descriptions (was empty from schema.json)
- Add aspect ratio to dimensions table
- Clean up example JSON with realistic data

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(docs): correct brand in sample images to Ajianaz @ajianaz (#33)

All 18 sample images were rendered with CodeCora/@codecoradev branding.
Re-rendered with correct brand: Ajianaz / @ajianaz.

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(docs): all sample images now use ajianaz consistently (#34)

Replaced all author/speaker/guest names in sample data with 'ajianaz'.
No personal names in any sample image.

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 1) (#35)

New templates:
- numbered-tips: Numbered list card (1080x1350)
- progress-card: Progress bar with percentage (1080x1080)
- pinterest-pin: Vertical Pinterest format (1000x1500)
- blog-hero: Wide blog post header (1200x675)
- poll-result: Poll results with percentage bars (1080x1080)
- quote-minimal: Clean minimal quote card (1080x1080)
- step-process: Step-by-step flow diagram (1080x1080)
- faq-card: Q&A card layout (1080x1080)
- metric-grid: 2x2 grid of metrics (1080x1080)
- author-bio: Profile/bio card with tags (1080x1080)

Total templates: 18 → 28

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 2) (#36)

New templates:
- feature-highlight: Single feature with icon badge (1080x1080)
- timeline: Vertical timeline with milestones (1080x1350)
- comparison-table: Side-by-side comparison (1080x1080)
- cta-card: Call-to-action card with URL (1080x1080)
- book-cover: Book/ebook cover design (1080x1620)
- roadmap-card: Horizontal roadmap phases (1080x1080)
- discount-badge: Circular promo badge (800x800)
- code-snippet: Code editor card for social (1200x630)
- big-number: Oversized number/stat (1080x1080)
- event-flyer: Event flyer with details (1080x1350)

Total templates: 28 -> 38

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 3) (#37)

New templates:
- polaroid-quote: Polaroid-style quote card (1080x1080)
- review-card: Product review with rating (1080x1080)
- changelog: Release notes card (1080x1350)
- gradient-hero: Bold hero banner (1200x630)
- testimonial-grid: 3-column testimonials (1080x1080)
- stat-comparison: Before/after comparison (1080x1080)
- calendar-event: Calendar-style event card (1080x1080)
- pricing-card: Single pricing tier (1080x1080)
- github-star: Repo showcase card (1200x630)
- minimal-text: Ultra-minimal text-only (1080x1080)

Total templates: 38 -> 48

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 4) (#38)

New templates:
- quick-tip: Tip card with lightbulb icon (1080x1080)
- tweet-embed: Tweet-style card with avatar (1200x675)
- newsletter-cta: Newsletter signup card (1080x1080)
- retro-badge: Retro circular badge (600x600)
- matrix-card: 2x2 decision matrix (1080x1080)
- certificate: Certificate of achievement (1200x900)
- quote-stack: Stacked quotes with authors (1080x1350)
- webhook-card: API endpoint card (1200x630)
- goal-tracker: Goal progress with checklist (1080x1080)
- color-palette: Design palette showcase (1080x1080)

Total: 48 -> 58 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 5) (#39)

New templates:
- qr-business-card: Digital business card with QR (1080x1080)
- gradient-quote: Full-bleed gradient quote (1080x1080)
- stat-highlight: Bold single statistic (1200x630)
- faq-single: Single FAQ card (1080x1080)
- feature-list: Product features with checkmarks (1080x1350)
- team-member: Team profile card (1080x1080)
- kanban-card: Kanban board with columns (1200x630)
- podcast-episode: Podcast episode card (1080x1080)
- release-notes: Versioned release notes (1080x1350)
- wallpaper-quote: Phone wallpaper quote (1080x1920)

Total: 58 -> 68 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 6) (#40)

New templates:
- social-poll: Poll card with percentage bars (1080x1080)
- command-card: Terminal command with description (1200x630)
- week-schedule: Weekly content schedule grid (1080x1080)
- gradient-banner: Wide gradient banner (1200x630)
- data-counter: 4-metric counter grid (1080x1080)
- recipe-card: Recipe with ingredients and steps (1080x1350)
- css-snippet: CSS code with syntax highlighting (1200x630)
- milestone-celebration: Big number celebration (1080x1080)
- book-club: Book recommendation card (1080x1350)
- terminal-output: Terminal window output (1200x630)

Total: 68 -> 78 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 7) (#41)

New templates:
- github-issue: GitHub issue card with labels (1200x630)
- github-pr: GitHub PR card with merge status (1200x630)
- api-endpoint: API endpoint documentation (1200x630)
- docker-command: Docker command card (1200x630)
- rust-snippet: Rust code with editor style (1200x630)
- vscode-config: VS Code settings JSON (1200x630)
- dev-quote-card: Developer quote card (1080x1080)
- chart-bar: Bar chart visualization (1080x1080)
- git-diff: Git diff visualization (1200x630)
- package-json: package.json dependencies (1200x630)

Total: 78 -> 88 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 8) (#42)

New templates:
- github-profile: GitHub profile card with avatar and stats (1080x1080)
- tech-stack: Technology stack grid (1080x1080)
- contributor-card: OSS contributor appreciation (1200x630)
- release-tag: Git release/tag announcement (1200x630)
- ci-pipeline: CI/CD pipeline visualization (1200x630)
- dependency-graph: Dependency tree visualization (1080x1080)
- feature-flags: Feature flag toggle board (1080x1080)
- uptime-monitor: Service uptime dashboard (1080x1080)
- api-response: API JSON response viewer (1200x630)
- error-404: 404 error page design (1080x1080)

Total: 88 -> 98 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 9) (#43)

New templates:
- log-viewer: Server log output viewer (1200x630)
- database-schema: Database table schema visualization (1200x630)
- dockerfile: Dockerfile instructions viewer (1200x630)
- makefile: Makefile targets viewer (1200x630)
- license-card: Open source license info card (1080x1080)
- pull-request: GitHub PR review card (1200x630)
- code-review: Code review comment card (1200x630)
- version-comparison: Side-by-side version comparison (1080x1080)
- env-setup: Dev environment setup instructions (1200x630)
- security-advisory: Security vulnerability advisory (1200x630)

Total: 98 -> 108 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 10) (#44)

New templates:
- kudos-card: Team appreciation card (1080x1080)
- star-tracker: GitHub stars milestone tracker (1080x1080)
- terminal-prompt: Terminal command prompt snippet (1200x630)
- flame-graph: Performance profiling flame graph (1080x1080)
- migration-status: Database migration progress tracker (1080x1080)
- api-key-display: API key/token reveal card (1200x630)
- credit-badge: Achievement or skill badge (1080x1080)
- roadmap-timeline: Project roadmap horizontal timeline (1080x1080)
- stats-dashboard: Multi-metric dashboard 2x2 grid (1080x1080)
- swagger-endpoint: OpenAPI endpoint documentation (1200x630)

Total: 108 -> 118 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 11) (#45)

New templates:
- webhook-payload: Incoming webhook event payload viewer (1200x630)
- password-generator: Generated password display card (1080x1080)
- qr-code-display: QR code with label and URL (1080x1080)
- diff-viewer: Code diff comparison viewer (1200x630)
- cert-pinned: SSL/TLS certificate details card (1080x1080)
- rate-limit: API rate limit status card (1200x630)
- command-result: CLI command execution result (1080x1080)
- config-display: Configuration key-value display (1200x630)
- health-check: Service health check status board (1080x1080)
- changelog-entry: Release changelog entry card (1200x630)

Total: 118 -> 128 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 12) (#46)

New templates:
- incident-report: Post-mortem incident report (1080x1080)
- deploy-status: Deployment pipeline tracker (1080x1080)
- snippet-go: Go code snippet (1200x630)
- snippet-python: Python code snippet (1200x630)
- snippet-typescript: TypeScript code snippet (1200x630)
- ascii-art: ASCII art display (1200x630)
- matrix-display: Color-coded comparison matrix (1080x1080)
- gradient-mesh: Abstract gradient mesh art (1080x1080)
- token-display: Design token showcase (1200x630)
- feature-grid: Feature showcase 2x2 grid (1080x1080)

Total: 128 -> 138 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 13) (#47)

New templates:
- snippet-rust: Rust code snippet (1200x630)
- snippet-bash: Bash/shell snippet (1200x630)
- snippet-sql: SQL query snippet (1200x630)
- snippet-yaml: YAML config snippet (1200x630)
- leaderboard: Ranked leaderboard (1080x1080)
- sponsor-card: OSS sponsor appreciation (1080x1080)
- version-compare: Side-by-side version comparison (1200x630)
- status-badge: Service status badge (1200x630)
- benchmark-result: Performance benchmark bars (1080x1080)
- archive-card: Blog post archive entry (1080x1350)

Total: 138 -> 148 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* docs: add 148 template pages with MinIO preview images (#48)

- Generate doc page for all 148 templates (fields, dimensions, usage)
- Preview images served from MinIO CDN (slim repo, no binary assets)
- Update sidebar: 11 categories, collapsible, all 148 templates
- Update index.md: responsive gallery grid with lazy loading
- VitePress build: 162 HTML pages, all passing

Total: 18 -> 148 template doc pages

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* docs: change VitePress base to / for Cloudflare Pages (#49)

Deployed to CF Pages project: cosy-docs
Production URL: https://cosy-docs-4f5.pages.dev/

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(docs): Pinterest-style masonry layout for templates gallery (#50)

- Replace CSS grid with CSS columns (masonry/pinterest flow)
- Images display at natural aspect ratio — no cropping
- Responsive: 5 cols desktop → 4 → 3 → 2 → 1 mobile
- Cards use break-inside: avoid for clean column flow
- Deployed to CF Pages production

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(docs): reduce masonry to 3 columns default (4 on ultra-wide)

Desktop default 3 cols, 4 only on 1440px+, gap widened to 16px

* fix(templates): watermark position + border radius consolidation (#51)

Watermark fixes (8 templates):
- linkedin-card: brand_name moved from top (y=95) to bottom-right (y=590)
- twitter-quote: brand_name moved from top (y=120) to bottom-right (y=635)
- dev-quote: brand_name moved from y=968 to y=1040 (40px from bottom)
- instagram-story: y=1780 → y=1870 (50px from bottom)
- tiktok-quote: y=1250 → y=1310 (40px from bottom)
- pinterest-pin: y=1400 → y=1460 (40px from bottom)
- book-cover: y=1530 → y=1580 (40px from bottom)
- youtube-thumb: y=630 → y=690 (30px from bottom)
- twitter-quote + linkedin-card: accent font → muted credit style (20px, #7f849c)

Border radius consolidation (81 templates):
- Standardized 25+ rx values to 4-tier system: 8/12/20/30
- rx 1-5 → 8 (small), rx 6-14 → 12 (default), rx 15-24 → 20 (large), rx 25-40 → 30 (pill)
- rx=0 preserved (intentionally sharp corners)

Refs: miifb (make-interfaces-feel-better), hallmark design audit

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): watermark default off + show_brand toggle (#52)

- Added 'show_brand' boolean field to all 148 schema.json files (default: false)
- Added 'Boolean' variant to FieldType enum in src/schema.rs
- Wrapped all brand_name text elements in {% if brand.show_brand %} conditional
  in all 147 template.svg files that had brand_name
- Watermark/brand now OFF by default — only renders when show_brand: true
- Updated existing 18 defaults.json with show_brand: false

Breaking change: brand_name no longer appears by default.
To enable: pass {"brand": {"show_brand": true, "brand_name": "..."}}

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): real-case defaults for all 148 templates (#53)

Replace generic sample data with realistic, template-relevant content:
- deploy-status: production v2.1.0 deployment with service statuses
- changelog: real version notes with breaking changes and features
- benchmark-result: Rust vs Node.js vs Python render performance
- code-snippet: actual Rust async render handler code
- blog-hero: 'Why We Replaced Puppeteer with Pure Rust'
- big-number: '149 templates available'
- And 142 more templates with contextually relevant content

All defaults now include show_brand: false (no watermark by default).
Fixed SVG-breaking characters in code samples (< > and && removed).
Fixed float-parsing issues (% suffixes removed from numeric fields).

148/148 templates render successfully.

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* docs: border radius 4-tier standard + sub-5px decorative exception (#54) (#57)

Document the radius tier system (8/12/20/30) standardized in #51 and
add an explicit exception for thin decorative elements (<=5px) so
automated audits stop flagging divider bars as non-standard rx.

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(templates): tighten max length on big-number fields (#55) (#58)

Reduce max from 10-20 to 8 chars for hero-size number fields that
render at 140-220px font size — longer values clip at the canvas
edge. Templates: stat-card, big-number, stat-highlight,
star-tracker (current_stars/goal_stars), milestone-celebration.
Descriptions note the clipping constraint.

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(templates): replace emoji with SVG icon + normalize type scale (#56) (#59)

- github-star: replace star emoji with inline SVG star (accent
  gradient fill), optically aligned to text baseline
- feature-highlight: schema description no longer suggests emoji
- type-scale: normalize off-scale font sizes (13->14, 15->16,
  34->32, 38->36, 46->48, 68->64, 76->72) across 17 templates
- pricing-card: drop invented sample metrics from defaults
  ('All 149 templates' -> 'All templates included')

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(schema): validate field types and correct numeric field declarations (#64)

Audit of all 148 templates with max-length edge inputs found 7 templates
(benchmark-result, chart-bar, flame-graph, password-generator, rate-limit,
social-poll, star-tracker) that crash with a confusing Tera
'invalid float literal' error when a field used in arithmetic receives
string input.

Root causes (both fixed):
- schemas declared arithmetic fields as type 'text'; corrected 26 fields
  to type 'number' (display-only fields like b*_ops stay text)
- validate_input never checked field types; render never called
  validate_input at all. Render now validates first and fails fast with
  field-level messages (JSON errors stay machine-readable for --json-output)

Also fixed test data for carousel-default which was silently invalid
(missing required 'headline') — previously passing only because render
did no validation.

Closes #60

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* docs(cli): document render-time schema validation (#65)

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(templates): standardize watermark footer across all 148 templates (#62) (#63)

- Bottom-center, 30px margin, Inter 20px w600 #7f849c everywhere
- Move carousel-default & og-image watermark from top-left to bottom-center
- Add missing watermark block to newsletter-header
- Document watermark spec in template-authoring guide

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(templates): repair 10 high-severity visual defects from vision audit (#66) (#68)

* fix(renderer): xml-escape context text so &, <, > render safely

Literal ampersands in template data previously broke SVG parsing
(malformed entity reference). All string context values are now
XML-escaped before minijinja rendering. Includes unit tests.

* fix(templates): correct default data found by full visual audit

- fit 5 default values to their schema max_length (render blockers):
  changelog-entry, credit-badge, css-snippet, incident-report,
  qr-code-display
- drop prefixes/suffixes the templates already render themselves:
  vv version (changelog-entry, release-notes, security-advisory),
  votes votes (poll-result), subscribers subscribers (newsletter-cta),
  EP EP (podcast-episode), $ $ (terminal-output), 5/5 / 5 (book-club),
  doubled diff markers (diff-viewer, git-diff)
- restore real ampersands previously mangled to 'and' (rust-snippet,
  snippet-go, quick-tip), now safe with xml escaping

* fix(templates): repair 10 high-severity visual defects (#66)

Verified visually against each template's default render:

- command-card, docker-command: command text overflowed its terminal
  panel (63px/141px past the edge) -> fit font size to panel width
- tech-stack: third card column ended at x=1180 on a 1080 canvas,
  clipping 'Tokio'/'Docker' mid-glyph -> redistribute columns
- roadmap-timeline, week-schedule: per-column descriptions wider than
  their columns overlapped into garbled lines -> wordwrap + tspan
  line breaking per column
- vscode-config: 29-char keys collided with values -> smaller font,
  value column moved right
- webhook-payload: ISO timestamp overflowed its 180px panel into the
  Delivery ID column -> shorter format + smaller font
- wallpaper-quote, gradient-quote: wrap_width 16/18 chars produced far
  too many lines for 56/52px type, author block overlapped the quote
  -> wrap widths sized to the actual font metrics
- poll-result: bar fills were hardcoded full width regardless of data
  -> percentage fields are numeric now, fill width = pct * 8px

* style: apply cargo fmt

---------

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(templates): rebalance top-heavy templates + raise contrast (audit part 1/2) (#70)

* fix(templates): rebalance vertically top-heavy templates

9 templates had content ending at 55-70% height leaving the bottom
of the card empty: archive-card, incident-report, version-compare,
version-comparison, step-process, roadmap-card, command-result,
flame-graph, goal-tracker. Content groups recentered/respread; also
fixes step-process badge circles using y= instead of cy=, goal-tracker
progress arc not matching its percentage, and the version-compare
delta badge overlapping a panel edge.

* fix(templates): raise contrast and fix status color semantics

- comparison: losing column raised from near-invisible grey; stray
  unmatched dash bar removed; rows respread over full canvas
- dependency-graph: leaf labels readable; serde_json connector now
  originates from serde (elbow connectors)
- token-display, color-palette: dark swatches get a subtle stroke
- api-key-display: redaction dots visible
- health-check: healthy services render green (status mapping now
  accepts ok/healthy/online case-insensitively; down stays red)

* fix(templates): compute goal-tracker ring arc from current/target

The arc was hardcoded to match the default 68% (CodeCora code-scanning
alert). current/target are numeric schema fields now; the ring renders
slide.current/slide.target of the circumference for any data.

* fix(templates): resolve goal-tracker conflict markers + data-driven arc; adaptive comparison pitch

- goal-tracker: a conflicted stash-application left both ring markups
  in the file; keep the rebalanced geometry (r=180) and compute the
  arc from slide.current/slide.target (circumference 1131)
- comparison: row pitch adapts min(370/(n-1), 150) so wrapped text
  never overflows the canvas while 3-line defaults keep the verified
  balance

---------

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(templates): overflow, glyph and polish fixes (audit part 2/2) (#71)

* fix(templates): fix overflow, collisions and line spacing

- feature-grid, recipe-card: descriptions/steps wrapped via
  wordwrap+tspan inside panel bounds
- password-generator: crack-time wrapped with padding, STRONG label
  centered inside the fill, layout spread over full canvas
- qr-code-display: finder squares inside the QR panel
- credit-badge: headline no longer overlaps the star
- podcast-cover: normal title leading, one step larger
- changelog: even line rhythm, NEW/FIXED bullet dots, respread
- dev-quote: code indentation preserved (xml:space=preserve)
- newsletter-cta: vertical rhythm computed from line counts

* fix(templates): repair glyphs, proportional fills and composition

- tweet-embed: reply/retweet icons drawn as SVG paths (glyphs were
  missing from bundled fonts); testimonial-grid: proper quote mark
- carousel-default, checklist: stray cursor-like accent rects removed
- progress-card: fill width proportional to numeric percentage
  (schema type number, poll-result pattern), 78% now renders 78%
- snippet-yaml: YAML indentation preserved (xml:space=preserve)
- gradient-mesh: text contrast shielded from bright mesh, rebalanced
- instagram-story: badge grouped with centered title block
- matrix-display: table vertically centered

* fix(templates): polish remaining low-severity visual findings

- api-endpoint: auth chip inset from bar edge
- author-bio: width-adaptive tag chips with even padding
- benchmark-result: winner badge grouped with bars
- book-club: cover placeholder visible
- calendar-event: date tile typography rebalanced
- database-schema: duplicate overlapping header text fixed
  (garbled glyph), title deduplicated
- dev-quote-card: quote-mark gap tightened
- gradient-banner: stray accent bar moved clear of text
- quote-stack: quote glyph breathing room
- stats-dashboard: metric digits in Inter for unambiguous 1/7
- webhook-card: response value follows key with natural spacing

---------

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* chore(release): v0.2.0

148 templates, renderer XML-escaping, full vision-audit fix wave
(#66/#67), numeric schema fields, docs gallery. See CHANGELOG.

---------

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
ajianaz added a commit that referenced this pull request Aug 28, 2026
* fix(ci): use mlugg/setup-zig action for cargo-zigbuild

apt-get zig not available on ubuntu-24.04. Switch to mlugg/setup-zig@v1.
Also fix packaging to find binary in zigbuild output path.

* fix(ci): drop cargo-zigbuild, use standard cargo build

mlugg/setup-zig returning 404. Simplify to standard cargo build for v0.1.0.
GLIBC compatibility can be addressed in a future release.

* chore(release): v0.2.0 (#72)

* chore: sync main to develop (release workflow fixes) (#30)

* fix(ci): use mlugg/setup-zig action for cargo-zigbuild

apt-get zig not available on ubuntu-24.04. Switch to mlugg/setup-zig@v1.
Also fix packaging to find binary in zigbuild output path.

* fix(ci): drop cargo-zigbuild, use standard cargo build

mlugg/setup-zig returning 404. Simplify to standard cargo build for v0.1.0.
GLIBC compatibility can be addressed in a future release.

---------

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(docs): add VitePress documentation site with API reference and template gallery (#31)

- VitePress setup with Catppuccin Mocha brand theme
- Guide pages: installation, quick start, CLI reference, HTTP server, Docker, configuration, branding
- Template gallery: all 18 templates with schema reference and JSON examples
- API reference: health check, render endpoint, authentication
- Template authoring guide (moved from docs/ to docs/guide/)
- GitHub Pages CI workflow (bun-based, auto-deploy on docs/** push)
- 32 HTML pages generated, builds in ~8s

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(docs): add sample images and field descriptions for all 18 templates (#32)

- Render all 18 templates with CodeCora brand as visual samples
- Embed sample PNG in each template page (docs/public/samples/)
- Add human-readable field descriptions (was empty from schema.json)
- Add aspect ratio to dimensions table
- Clean up example JSON with realistic data

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(docs): correct brand in sample images to Ajianaz @ajianaz (#33)

All 18 sample images were rendered with CodeCora/@codecoradev branding.
Re-rendered with correct brand: Ajianaz / @ajianaz.

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(docs): all sample images now use ajianaz consistently (#34)

Replaced all author/speaker/guest names in sample data with 'ajianaz'.
No personal names in any sample image.

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 1) (#35)

New templates:
- numbered-tips: Numbered list card (1080x1350)
- progress-card: Progress bar with percentage (1080x1080)
- pinterest-pin: Vertical Pinterest format (1000x1500)
- blog-hero: Wide blog post header (1200x675)
- poll-result: Poll results with percentage bars (1080x1080)
- quote-minimal: Clean minimal quote card (1080x1080)
- step-process: Step-by-step flow diagram (1080x1080)
- faq-card: Q&A card layout (1080x1080)
- metric-grid: 2x2 grid of metrics (1080x1080)
- author-bio: Profile/bio card with tags (1080x1080)

Total templates: 18 → 28

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 2) (#36)

New templates:
- feature-highlight: Single feature with icon badge (1080x1080)
- timeline: Vertical timeline with milestones (1080x1350)
- comparison-table: Side-by-side comparison (1080x1080)
- cta-card: Call-to-action card with URL (1080x1080)
- book-cover: Book/ebook cover design (1080x1620)
- roadmap-card: Horizontal roadmap phases (1080x1080)
- discount-badge: Circular promo badge (800x800)
- code-snippet: Code editor card for social (1200x630)
- big-number: Oversized number/stat (1080x1080)
- event-flyer: Event flyer with details (1080x1350)

Total templates: 28 -> 38

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 3) (#37)

New templates:
- polaroid-quote: Polaroid-style quote card (1080x1080)
- review-card: Product review with rating (1080x1080)
- changelog: Release notes card (1080x1350)
- gradient-hero: Bold hero banner (1200x630)
- testimonial-grid: 3-column testimonials (1080x1080)
- stat-comparison: Before/after comparison (1080x1080)
- calendar-event: Calendar-style event card (1080x1080)
- pricing-card: Single pricing tier (1080x1080)
- github-star: Repo showcase card (1200x630)
- minimal-text: Ultra-minimal text-only (1080x1080)

Total templates: 38 -> 48

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 4) (#38)

New templates:
- quick-tip: Tip card with lightbulb icon (1080x1080)
- tweet-embed: Tweet-style card with avatar (1200x675)
- newsletter-cta: Newsletter signup card (1080x1080)
- retro-badge: Retro circular badge (600x600)
- matrix-card: 2x2 decision matrix (1080x1080)
- certificate: Certificate of achievement (1200x900)
- quote-stack: Stacked quotes with authors (1080x1350)
- webhook-card: API endpoint card (1200x630)
- goal-tracker: Goal progress with checklist (1080x1080)
- color-palette: Design palette showcase (1080x1080)

Total: 48 -> 58 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 5) (#39)

New templates:
- qr-business-card: Digital business card with QR (1080x1080)
- gradient-quote: Full-bleed gradient quote (1080x1080)
- stat-highlight: Bold single statistic (1200x630)
- faq-single: Single FAQ card (1080x1080)
- feature-list: Product features with checkmarks (1080x1350)
- team-member: Team profile card (1080x1080)
- kanban-card: Kanban board with columns (1200x630)
- podcast-episode: Podcast episode card (1080x1080)
- release-notes: Versioned release notes (1080x1350)
- wallpaper-quote: Phone wallpaper quote (1080x1920)

Total: 58 -> 68 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 6) (#40)

New templates:
- social-poll: Poll card with percentage bars (1080x1080)
- command-card: Terminal command with description (1200x630)
- week-schedule: Weekly content schedule grid (1080x1080)
- gradient-banner: Wide gradient banner (1200x630)
- data-counter: 4-metric counter grid (1080x1080)
- recipe-card: Recipe with ingredients and steps (1080x1350)
- css-snippet: CSS code with syntax highlighting (1200x630)
- milestone-celebration: Big number celebration (1080x1080)
- book-club: Book recommendation card (1080x1350)
- terminal-output: Terminal window output (1200x630)

Total: 68 -> 78 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 7) (#41)

New templates:
- github-issue: GitHub issue card with labels (1200x630)
- github-pr: GitHub PR card with merge status (1200x630)
- api-endpoint: API endpoint documentation (1200x630)
- docker-command: Docker command card (1200x630)
- rust-snippet: Rust code with editor style (1200x630)
- vscode-config: VS Code settings JSON (1200x630)
- dev-quote-card: Developer quote card (1080x1080)
- chart-bar: Bar chart visualization (1080x1080)
- git-diff: Git diff visualization (1200x630)
- package-json: package.json dependencies (1200x630)

Total: 78 -> 88 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 8) (#42)

New templates:
- github-profile: GitHub profile card with avatar and stats (1080x1080)
- tech-stack: Technology stack grid (1080x1080)
- contributor-card: OSS contributor appreciation (1200x630)
- release-tag: Git release/tag announcement (1200x630)
- ci-pipeline: CI/CD pipeline visualization (1200x630)
- dependency-graph: Dependency tree visualization (1080x1080)
- feature-flags: Feature flag toggle board (1080x1080)
- uptime-monitor: Service uptime dashboard (1080x1080)
- api-response: API JSON response viewer (1200x630)
- error-404: 404 error page design (1080x1080)

Total: 88 -> 98 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 9) (#43)

New templates:
- log-viewer: Server log output viewer (1200x630)
- database-schema: Database table schema visualization (1200x630)
- dockerfile: Dockerfile instructions viewer (1200x630)
- makefile: Makefile targets viewer (1200x630)
- license-card: Open source license info card (1080x1080)
- pull-request: GitHub PR review card (1200x630)
- code-review: Code review comment card (1200x630)
- version-comparison: Side-by-side version comparison (1080x1080)
- env-setup: Dev environment setup instructions (1200x630)
- security-advisory: Security vulnerability advisory (1200x630)

Total: 98 -> 108 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 10) (#44)

New templates:
- kudos-card: Team appreciation card (1080x1080)
- star-tracker: GitHub stars milestone tracker (1080x1080)
- terminal-prompt: Terminal command prompt snippet (1200x630)
- flame-graph: Performance profiling flame graph (1080x1080)
- migration-status: Database migration progress tracker (1080x1080)
- api-key-display: API key/token reveal card (1200x630)
- credit-badge: Achievement or skill badge (1080x1080)
- roadmap-timeline: Project roadmap horizontal timeline (1080x1080)
- stats-dashboard: Multi-metric dashboard 2x2 grid (1080x1080)
- swagger-endpoint: OpenAPI endpoint documentation (1200x630)

Total: 108 -> 118 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 11) (#45)

New templates:
- webhook-payload: Incoming webhook event payload viewer (1200x630)
- password-generator: Generated password display card (1080x1080)
- qr-code-display: QR code with label and URL (1080x1080)
- diff-viewer: Code diff comparison viewer (1200x630)
- cert-pinned: SSL/TLS certificate details card (1080x1080)
- rate-limit: API rate limit status card (1200x630)
- command-result: CLI command execution result (1080x1080)
- config-display: Configuration key-value display (1200x630)
- health-check: Service health check status board (1080x1080)
- changelog-entry: Release changelog entry card (1200x630)

Total: 118 -> 128 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 12) (#46)

New templates:
- incident-report: Post-mortem incident report (1080x1080)
- deploy-status: Deployment pipeline tracker (1080x1080)
- snippet-go: Go code snippet (1200x630)
- snippet-python: Python code snippet (1200x630)
- snippet-typescript: TypeScript code snippet (1200x630)
- ascii-art: ASCII art display (1200x630)
- matrix-display: Color-coded comparison matrix (1080x1080)
- gradient-mesh: Abstract gradient mesh art (1080x1080)
- token-display: Design token showcase (1200x630)
- feature-grid: Feature showcase 2x2 grid (1080x1080)

Total: 128 -> 138 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 13) (#47)

New templates:
- snippet-rust: Rust code snippet (1200x630)
- snippet-bash: Bash/shell snippet (1200x630)
- snippet-sql: SQL query snippet (1200x630)
- snippet-yaml: YAML config snippet (1200x630)
- leaderboard: Ranked leaderboard (1080x1080)
- sponsor-card: OSS sponsor appreciation (1080x1080)
- version-compare: Side-by-side version comparison (1200x630)
- status-badge: Service status badge (1200x630)
- benchmark-result: Performance benchmark bars (1080x1080)
- archive-card: Blog post archive entry (1080x1350)

Total: 138 -> 148 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* docs: add 148 template pages with MinIO preview images (#48)

- Generate doc page for all 148 templates (fields, dimensions, usage)
- Preview images served from MinIO CDN (slim repo, no binary assets)
- Update sidebar: 11 categories, collapsible, all 148 templates
- Update index.md: responsive gallery grid with lazy loading
- VitePress build: 162 HTML pages, all passing

Total: 18 -> 148 template doc pages

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* docs: change VitePress base to / for Cloudflare Pages (#49)

Deployed to CF Pages project: cosy-docs
Production URL: https://cosy-docs-4f5.pages.dev/

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(docs): Pinterest-style masonry layout for templates gallery (#50)

- Replace CSS grid with CSS columns (masonry/pinterest flow)
- Images display at natural aspect ratio — no cropping
- Responsive: 5 cols desktop → 4 → 3 → 2 → 1 mobile
- Cards use break-inside: avoid for clean column flow
- Deployed to CF Pages production

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(docs): reduce masonry to 3 columns default (4 on ultra-wide)

Desktop default 3 cols, 4 only on 1440px+, gap widened to 16px

* fix(templates): watermark position + border radius consolidation (#51)

Watermark fixes (8 templates):
- linkedin-card: brand_name moved from top (y=95) to bottom-right (y=590)
- twitter-quote: brand_name moved from top (y=120) to bottom-right (y=635)
- dev-quote: brand_name moved from y=968 to y=1040 (40px from bottom)
- instagram-story: y=1780 → y=1870 (50px from bottom)
- tiktok-quote: y=1250 → y=1310 (40px from bottom)
- pinterest-pin: y=1400 → y=1460 (40px from bottom)
- book-cover: y=1530 → y=1580 (40px from bottom)
- youtube-thumb: y=630 → y=690 (30px from bottom)
- twitter-quote + linkedin-card: accent font → muted credit style (20px, #7f849c)

Border radius consolidation (81 templates):
- Standardized 25+ rx values to 4-tier system: 8/12/20/30
- rx 1-5 → 8 (small), rx 6-14 → 12 (default), rx 15-24 → 20 (large), rx 25-40 → 30 (pill)
- rx=0 preserved (intentionally sharp corners)

Refs: miifb (make-interfaces-feel-better), hallmark design audit

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): watermark default off + show_brand toggle (#52)

- Added 'show_brand' boolean field to all 148 schema.json files (default: false)
- Added 'Boolean' variant to FieldType enum in src/schema.rs
- Wrapped all brand_name text elements in {% if brand.show_brand %} conditional
  in all 147 template.svg files that had brand_name
- Watermark/brand now OFF by default — only renders when show_brand: true
- Updated existing 18 defaults.json with show_brand: false

Breaking change: brand_name no longer appears by default.
To enable: pass {"brand": {"show_brand": true, "brand_name": "..."}}

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): real-case defaults for all 148 templates (#53)

Replace generic sample data with realistic, template-relevant content:
- deploy-status: production v2.1.0 deployment with service statuses
- changelog: real version notes with breaking changes and features
- benchmark-result: Rust vs Node.js vs Python render performance
- code-snippet: actual Rust async render handler code
- blog-hero: 'Why We Replaced Puppeteer with Pure Rust'
- big-number: '149 templates available'
- And 142 more templates with contextually relevant content

All defaults now include show_brand: false (no watermark by default).
Fixed SVG-breaking characters in code samples (< > and && removed).
Fixed float-parsing issues (% suffixes removed from numeric fields).

148/148 templates render successfully.

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* docs: border radius 4-tier standard + sub-5px decorative exception (#54) (#57)

Document the radius tier system (8/12/20/30) standardized in #51 and
add an explicit exception for thin decorative elements (<=5px) so
automated audits stop flagging divider bars as non-standard rx.

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(templates): tighten max length on big-number fields (#55) (#58)

Reduce max from 10-20 to 8 chars for hero-size number fields that
render at 140-220px font size — longer values clip at the canvas
edge. Templates: stat-card, big-number, stat-highlight,
star-tracker (current_stars/goal_stars), milestone-celebration.
Descriptions note the clipping constraint.

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(templates): replace emoji with SVG icon + normalize type scale (#56) (#59)

- github-star: replace star emoji with inline SVG star (accent
  gradient fill), optically aligned to text baseline
- feature-highlight: schema description no longer suggests emoji
- type-scale: normalize off-scale font sizes (13->14, 15->16,
  34->32, 38->36, 46->48, 68->64, 76->72) across 17 templates
- pricing-card: drop invented sample metrics from defaults
  ('All 149 templates' -> 'All templates included')

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(schema): validate field types and correct numeric field declarations (#64)

Audit of all 148 templates with max-length edge inputs found 7 templates
(benchmark-result, chart-bar, flame-graph, password-generator, rate-limit,
social-poll, star-tracker) that crash with a confusing Tera
'invalid float literal' error when a field used in arithmetic receives
string input.

Root causes (both fixed):
- schemas declared arithmetic fields as type 'text'; corrected 26 fields
  to type 'number' (display-only fields like b*_ops stay text)
- validate_input never checked field types; render never called
  validate_input at all. Render now validates first and fails fast with
  field-level messages (JSON errors stay machine-readable for --json-output)

Also fixed test data for carousel-default which was silently invalid
(missing required 'headline') — previously passing only because render
did no validation.

Closes #60

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* docs(cli): document render-time schema validation (#65)

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(templates): standardize watermark footer across all 148 templates (#62) (#63)

- Bottom-center, 30px margin, Inter 20px w600 #7f849c everywhere
- Move carousel-default & og-image watermark from top-left to bottom-center
- Add missing watermark block to newsletter-header
- Document watermark spec in template-authoring guide

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(templates): repair 10 high-severity visual defects from vision audit (#66) (#68)

* fix(renderer): xml-escape context text so &, <, > render safely

Literal ampersands in template data previously broke SVG parsing
(malformed entity reference). All string context values are now
XML-escaped before minijinja rendering. Includes unit tests.

* fix(templates): correct default data found by full visual audit

- fit 5 default values to their schema max_length (render blockers):
  changelog-entry, credit-badge, css-snippet, incident-report,
  qr-code-display
- drop prefixes/suffixes the templates already render themselves:
  vv version (changelog-entry, release-notes, security-advisory),
  votes votes (poll-result), subscribers subscribers (newsletter-cta),
  EP EP (podcast-episode), $ $ (terminal-output), 5/5 / 5 (book-club),
  doubled diff markers (diff-viewer, git-diff)
- restore real ampersands previously mangled to 'and' (rust-snippet,
  snippet-go, quick-tip), now safe with xml escaping

* fix(templates): repair 10 high-severity visual defects (#66)

Verified visually against each template's default render:

- command-card, docker-command: command text overflowed its terminal
  panel (63px/141px past the edge) -> fit font size to panel width
- tech-stack: third card column ended at x=1180 on a 1080 canvas,
  clipping 'Tokio'/'Docker' mid-glyph -> redistribute columns
- roadmap-timeline, week-schedule: per-column descriptions wider than
  their columns overlapped into garbled lines -> wordwrap + tspan
  line breaking per column
- vscode-config: 29-char keys collided with values -> smaller font,
  value column moved right
- webhook-payload: ISO timestamp overflowed its 180px panel into the
  Delivery ID column -> shorter format + smaller font
- wallpaper-quote, gradient-quote: wrap_width 16/18 chars produced far
  too many lines for 56/52px type, author block overlapped the quote
  -> wrap widths sized to the actual font metrics
- poll-result: bar fills were hardcoded full width regardless of data
  -> percentage fields are numeric now, fill width = pct * 8px

* style: apply cargo fmt

---------

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(templates): rebalance top-heavy templates + raise contrast (audit part 1/2) (#70)

* fix(templates): rebalance vertically top-heavy templates

9 templates had content ending at 55-70% height leaving the bottom
of the card empty: archive-card, incident-report, version-compare,
version-comparison, step-process, roadmap-card, command-result,
flame-graph, goal-tracker. Content groups recentered/respread; also
fixes step-process badge circles using y= instead of cy=, goal-tracker
progress arc not matching its percentage, and the version-compare
delta badge overlapping a panel edge.

* fix(templates): raise contrast and fix status color semantics

- comparison: losing column raised from near-invisible grey; stray
  unmatched dash bar removed; rows respread over full canvas
- dependency-graph: leaf labels readable; serde_json connector now
  originates from serde (elbow connectors)
- token-display, color-palette: dark swatches get a subtle stroke
- api-key-display: redaction dots visible
- health-check: healthy services render green (status mapping now
  accepts ok/healthy/online case-insensitively; down stays red)

* fix(templates): compute goal-tracker ring arc from current/target

The arc was hardcoded to match the default 68% (CodeCora code-scanning
alert). current/target are numeric schema fields now; the ring renders
slide.current/slide.target of the circumference for any data.

* fix(templates): resolve goal-tracker conflict markers + data-driven arc; adaptive comparison pitch

- goal-tracker: a conflicted stash-application left both ring markups
  in the file; keep the rebalanced geometry (r=180) and compute the
  arc from slide.current/slide.target (circumference 1131)
- comparison: row pitch adapts min(370/(n-1), 150) so wrapped text
  never overflows the canvas while 3-line defaults keep the verified
  balance

---------

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(templates): overflow, glyph and polish fixes (audit part 2/2) (#71)

* fix(templates): fix overflow, collisions and line spacing

- feature-grid, recipe-card: descriptions/steps wrapped via
  wordwrap+tspan inside panel bounds
- password-generator: crack-time wrapped with padding, STRONG label
  centered inside the fill, layout spread over full canvas
- qr-code-display: finder squares inside the QR panel
- credit-badge: headline no longer overlaps the star
- podcast-cover: normal title leading, one step larger
- changelog: even line rhythm, NEW/FIXED bullet dots, respread
- dev-quote: code indentation preserved (xml:space=preserve)
- newsletter-cta: vertical rhythm computed from line counts

* fix(templates): repair glyphs, proportional fills and composition

- tweet-embed: reply/retweet icons drawn as SVG paths (glyphs were
  missing from bundled fonts); testimonial-grid: proper quote mark
- carousel-default, checklist: stray cursor-like accent rects removed
- progress-card: fill width proportional to numeric percentage
  (schema type number, poll-result pattern), 78% now renders 78%
- snippet-yaml: YAML indentation preserved (xml:space=preserve)
- gradient-mesh: text contrast shielded from bright mesh, rebalanced
- instagram-story: badge grouped with centered title block
- matrix-display: table vertically centered

* fix(templates): polish remaining low-severity visual findings

- api-endpoint: auth chip inset from bar edge
- author-bio: width-adaptive tag chips with even padding
- benchmark-result: winner badge grouped with bars
- book-club: cover placeholder visible
- calendar-event: date tile typography rebalanced
- database-schema: duplicate overlapping header text fixed
  (garbled glyph), title deduplicated
- dev-quote-card: quote-mark gap tightened
- gradient-banner: stray accent bar moved clear of text
- quote-stack: quote glyph breathing room
- stats-dashboard: metric digits in Inter for unambiguous 1/7
- webhook-card: response value follows key with natural spacing

---------

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* chore(release): v0.2.0

148 templates, renderer XML-escaping, full vision-audit fix wave
(#66/#67), numeric schema fields, docs gallery. See CHANGELOG.

---------

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

---------

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
ajianaz added a commit that referenced this pull request Sep 29, 2026
* fix(ci): use mlugg/setup-zig action for cargo-zigbuild

apt-get zig not available on ubuntu-24.04. Switch to mlugg/setup-zig@v1.
Also fix packaging to find binary in zigbuild output path.

* fix(ci): drop cargo-zigbuild, use standard cargo build

mlugg/setup-zig returning 404. Simplify to standard cargo build for v0.1.0.
GLIBC compatibility can be addressed in a future release.

* chore(release): v0.2.0 (#72)

* chore: sync main to develop (release workflow fixes) (#30)

* fix(ci): use mlugg/setup-zig action for cargo-zigbuild

apt-get zig not available on ubuntu-24.04. Switch to mlugg/setup-zig@v1.
Also fix packaging to find binary in zigbuild output path.

* fix(ci): drop cargo-zigbuild, use standard cargo build

mlugg/setup-zig returning 404. Simplify to standard cargo build for v0.1.0.
GLIBC compatibility can be addressed in a future release.

---------

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(docs): add VitePress documentation site with API reference and template gallery (#31)

- VitePress setup with Catppuccin Mocha brand theme
- Guide pages: installation, quick start, CLI reference, HTTP server, Docker, configuration, branding
- Template gallery: all 18 templates with schema reference and JSON examples
- API reference: health check, render endpoint, authentication
- Template authoring guide (moved from docs/ to docs/guide/)
- GitHub Pages CI workflow (bun-based, auto-deploy on docs/** push)
- 32 HTML pages generated, builds in ~8s

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(docs): add sample images and field descriptions for all 18 templates (#32)

- Render all 18 templates with CodeCora brand as visual samples
- Embed sample PNG in each template page (docs/public/samples/)
- Add human-readable field descriptions (was empty from schema.json)
- Add aspect ratio to dimensions table
- Clean up example JSON with realistic data

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(docs): correct brand in sample images to Ajianaz @ajianaz (#33)

All 18 sample images were rendered with CodeCora/@codecoradev branding.
Re-rendered with correct brand: Ajianaz / @ajianaz.

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(docs): all sample images now use ajianaz consistently (#34)

Replaced all author/speaker/guest names in sample data with 'ajianaz'.
No personal names in any sample image.

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 1) (#35)

New templates:
- numbered-tips: Numbered list card (1080x1350)
- progress-card: Progress bar with percentage (1080x1080)
- pinterest-pin: Vertical Pinterest format (1000x1500)
- blog-hero: Wide blog post header (1200x675)
- poll-result: Poll results with percentage bars (1080x1080)
- quote-minimal: Clean minimal quote card (1080x1080)
- step-process: Step-by-step flow diagram (1080x1080)
- faq-card: Q&A card layout (1080x1080)
- metric-grid: 2x2 grid of metrics (1080x1080)
- author-bio: Profile/bio card with tags (1080x1080)

Total templates: 18 → 28

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 2) (#36)

New templates:
- feature-highlight: Single feature with icon badge (1080x1080)
- timeline: Vertical timeline with milestones (1080x1350)
- comparison-table: Side-by-side comparison (1080x1080)
- cta-card: Call-to-action card with URL (1080x1080)
- book-cover: Book/ebook cover design (1080x1620)
- roadmap-card: Horizontal roadmap phases (1080x1080)
- discount-badge: Circular promo badge (800x800)
- code-snippet: Code editor card for social (1200x630)
- big-number: Oversized number/stat (1080x1080)
- event-flyer: Event flyer with details (1080x1350)

Total templates: 28 -> 38

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 3) (#37)

New templates:
- polaroid-quote: Polaroid-style quote card (1080x1080)
- review-card: Product review with rating (1080x1080)
- changelog: Release notes card (1080x1350)
- gradient-hero: Bold hero banner (1200x630)
- testimonial-grid: 3-column testimonials (1080x1080)
- stat-comparison: Before/after comparison (1080x1080)
- calendar-event: Calendar-style event card (1080x1080)
- pricing-card: Single pricing tier (1080x1080)
- github-star: Repo showcase card (1200x630)
- minimal-text: Ultra-minimal text-only (1080x1080)

Total templates: 38 -> 48

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 4) (#38)

New templates:
- quick-tip: Tip card with lightbulb icon (1080x1080)
- tweet-embed: Tweet-style card with avatar (1200x675)
- newsletter-cta: Newsletter signup card (1080x1080)
- retro-badge: Retro circular badge (600x600)
- matrix-card: 2x2 decision matrix (1080x1080)
- certificate: Certificate of achievement (1200x900)
- quote-stack: Stacked quotes with authors (1080x1350)
- webhook-card: API endpoint card (1200x630)
- goal-tracker: Goal progress with checklist (1080x1080)
- color-palette: Design palette showcase (1080x1080)

Total: 48 -> 58 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 5) (#39)

New templates:
- qr-business-card: Digital business card with QR (1080x1080)
- gradient-quote: Full-bleed gradient quote (1080x1080)
- stat-highlight: Bold single statistic (1200x630)
- faq-single: Single FAQ card (1080x1080)
- feature-list: Product features with checkmarks (1080x1350)
- team-member: Team profile card (1080x1080)
- kanban-card: Kanban board with columns (1200x630)
- podcast-episode: Podcast episode card (1080x1080)
- release-notes: Versioned release notes (1080x1350)
- wallpaper-quote: Phone wallpaper quote (1080x1920)

Total: 58 -> 68 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 6) (#40)

New templates:
- social-poll: Poll card with percentage bars (1080x1080)
- command-card: Terminal command with description (1200x630)
- week-schedule: Weekly content schedule grid (1080x1080)
- gradient-banner: Wide gradient banner (1200x630)
- data-counter: 4-metric counter grid (1080x1080)
- recipe-card: Recipe with ingredients and steps (1080x1350)
- css-snippet: CSS code with syntax highlighting (1200x630)
- milestone-celebration: Big number celebration (1080x1080)
- book-club: Book recommendation card (1080x1350)
- terminal-output: Terminal window output (1200x630)

Total: 68 -> 78 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 7) (#41)

New templates:
- github-issue: GitHub issue card with labels (1200x630)
- github-pr: GitHub PR card with merge status (1200x630)
- api-endpoint: API endpoint documentation (1200x630)
- docker-command: Docker command card (1200x630)
- rust-snippet: Rust code with editor style (1200x630)
- vscode-config: VS Code settings JSON (1200x630)
- dev-quote-card: Developer quote card (1080x1080)
- chart-bar: Bar chart visualization (1080x1080)
- git-diff: Git diff visualization (1200x630)
- package-json: package.json dependencies (1200x630)

Total: 78 -> 88 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 8) (#42)

New templates:
- github-profile: GitHub profile card with avatar and stats (1080x1080)
- tech-stack: Technology stack grid (1080x1080)
- contributor-card: OSS contributor appreciation (1200x630)
- release-tag: Git release/tag announcement (1200x630)
- ci-pipeline: CI/CD pipeline visualization (1200x630)
- dependency-graph: Dependency tree visualization (1080x1080)
- feature-flags: Feature flag toggle board (1080x1080)
- uptime-monitor: Service uptime dashboard (1080x1080)
- api-response: API JSON response viewer (1200x630)
- error-404: 404 error page design (1080x1080)

Total: 88 -> 98 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 9) (#43)

New templates:
- log-viewer: Server log output viewer (1200x630)
- database-schema: Database table schema visualization (1200x630)
- dockerfile: Dockerfile instructions viewer (1200x630)
- makefile: Makefile targets viewer (1200x630)
- license-card: Open source license info card (1080x1080)
- pull-request: GitHub PR review card (1200x630)
- code-review: Code review comment card (1200x630)
- version-comparison: Side-by-side version comparison (1080x1080)
- env-setup: Dev environment setup instructions (1200x630)
- security-advisory: Security vulnerability advisory (1200x630)

Total: 98 -> 108 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 10) (#44)

New templates:
- kudos-card: Team appreciation card (1080x1080)
- star-tracker: GitHub stars milestone tracker (1080x1080)
- terminal-prompt: Terminal command prompt snippet (1200x630)
- flame-graph: Performance profiling flame graph (1080x1080)
- migration-status: Database migration progress tracker (1080x1080)
- api-key-display: API key/token reveal card (1200x630)
- credit-badge: Achievement or skill badge (1080x1080)
- roadmap-timeline: Project roadmap horizontal timeline (1080x1080)
- stats-dashboard: Multi-metric dashboard 2x2 grid (1080x1080)
- swagger-endpoint: OpenAPI endpoint documentation (1200x630)

Total: 108 -> 118 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 11) (#45)

New templates:
- webhook-payload: Incoming webhook event payload viewer (1200x630)
- password-generator: Generated password display card (1080x1080)
- qr-code-display: QR code with label and URL (1080x1080)
- diff-viewer: Code diff comparison viewer (1200x630)
- cert-pinned: SSL/TLS certificate details card (1080x1080)
- rate-limit: API rate limit status card (1200x630)
- command-result: CLI command execution result (1080x1080)
- config-display: Configuration key-value display (1200x630)
- health-check: Service health check status board (1080x1080)
- changelog-entry: Release changelog entry card (1200x630)

Total: 118 -> 128 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 12) (#46)

New templates:
- incident-report: Post-mortem incident report (1080x1080)
- deploy-status: Deployment pipeline tracker (1080x1080)
- snippet-go: Go code snippet (1200x630)
- snippet-python: Python code snippet (1200x630)
- snippet-typescript: TypeScript code snippet (1200x630)
- ascii-art: ASCII art display (1200x630)
- matrix-display: Color-coded comparison matrix (1080x1080)
- gradient-mesh: Abstract gradient mesh art (1080x1080)
- token-display: Design token showcase (1200x630)
- feature-grid: Feature showcase 2x2 grid (1080x1080)

Total: 128 -> 138 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 13) (#47)

New templates:
- snippet-rust: Rust code snippet (1200x630)
- snippet-bash: Bash/shell snippet (1200x630)
- snippet-sql: SQL query snippet (1200x630)
- snippet-yaml: YAML config snippet (1200x630)
- leaderboard: Ranked leaderboard (1080x1080)
- sponsor-card: OSS sponsor appreciation (1080x1080)
- version-compare: Side-by-side version comparison (1200x630)
- status-badge: Service status badge (1200x630)
- benchmark-result: Performance benchmark bars (1080x1080)
- archive-card: Blog post archive entry (1080x1350)

Total: 138 -> 148 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* docs: add 148 template pages with MinIO preview images (#48)

- Generate doc page for all 148 templates (fields, dimensions, usage)
- Preview images served from MinIO CDN (slim repo, no binary assets)
- Update sidebar: 11 categories, collapsible, all 148 templates
- Update index.md: responsive gallery grid with lazy loading
- VitePress build: 162 HTML pages, all passing

Total: 18 -> 148 template doc pages

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* docs: change VitePress base to / for Cloudflare Pages (#49)

Deployed to CF Pages project: cosy-docs
Production URL: https://cosy-docs-4f5.pages.dev/

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(docs): Pinterest-style masonry layout for templates gallery (#50)

- Replace CSS grid with CSS columns (masonry/pinterest flow)
- Images display at natural aspect ratio — no cropping
- Responsive: 5 cols desktop → 4 → 3 → 2 → 1 mobile
- Cards use break-inside: avoid for clean column flow
- Deployed to CF Pages production

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(docs): reduce masonry to 3 columns default (4 on ultra-wide)

Desktop default 3 cols, 4 only on 1440px+, gap widened to 16px

* fix(templates): watermark position + border radius consolidation (#51)

Watermark fixes (8 templates):
- linkedin-card: brand_name moved from top (y=95) to bottom-right (y=590)
- twitter-quote: brand_name moved from top (y=120) to bottom-right (y=635)
- dev-quote: brand_name moved from y=968 to y=1040 (40px from bottom)
- instagram-story: y=1780 → y=1870 (50px from bottom)
- tiktok-quote: y=1250 → y=1310 (40px from bottom)
- pinterest-pin: y=1400 → y=1460 (40px from bottom)
- book-cover: y=1530 → y=1580 (40px from bottom)
- youtube-thumb: y=630 → y=690 (30px from bottom)
- twitter-quote + linkedin-card: accent font → muted credit style (20px, #7f849c)

Border radius consolidation (81 templates):
- Standardized 25+ rx values to 4-tier system: 8/12/20/30
- rx 1-5 → 8 (small), rx 6-14 → 12 (default), rx 15-24 → 20 (large), rx 25-40 → 30 (pill)
- rx=0 preserved (intentionally sharp corners)

Refs: miifb (make-interfaces-feel-better), hallmark design audit

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): watermark default off + show_brand toggle (#52)

- Added 'show_brand' boolean field to all 148 schema.json files (default: false)
- Added 'Boolean' variant to FieldType enum in src/schema.rs
- Wrapped all brand_name text elements in {% if brand.show_brand %} conditional
  in all 147 template.svg files that had brand_name
- Watermark/brand now OFF by default — only renders when show_brand: true
- Updated existing 18 defaults.json with show_brand: false

Breaking change: brand_name no longer appears by default.
To enable: pass {"brand": {"show_brand": true, "brand_name": "..."}}

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): real-case defaults for all 148 templates (#53)

Replace generic sample data with realistic, template-relevant content:
- deploy-status: production v2.1.0 deployment with service statuses
- changelog: real version notes with breaking changes and features
- benchmark-result: Rust vs Node.js vs Python render performance
- code-snippet: actual Rust async render handler code
- blog-hero: 'Why We Replaced Puppeteer with Pure Rust'
- big-number: '149 templates available'
- And 142 more templates with contextually relevant content

All defaults now include show_brand: false (no watermark by default).
Fixed SVG-breaking characters in code samples (< > and && removed).
Fixed float-parsing issues (% suffixes removed from numeric fields).

148/148 templates render successfully.

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* docs: border radius 4-tier standard + sub-5px decorative exception (#54) (#57)

Document the radius tier system (8/12/20/30) standardized in #51 and
add an explicit exception for thin decorative elements (<=5px) so
automated audits stop flagging divider bars as non-standard rx.

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(templates): tighten max length on big-number fields (#55) (#58)

Reduce max from 10-20 to 8 chars for hero-size number fields that
render at 140-220px font size — longer values clip at the canvas
edge. Templates: stat-card, big-number, stat-highlight,
star-tracker (current_stars/goal_stars), milestone-celebration.
Descriptions note the clipping constraint.

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(templates): replace emoji with SVG icon + normalize type scale (#56) (#59)

- github-star: replace star emoji with inline SVG star (accent
  gradient fill), optically aligned to text baseline
- feature-highlight: schema description no longer suggests emoji
- type-scale: normalize off-scale font sizes (13->14, 15->16,
  34->32, 38->36, 46->48, 68->64, 76->72) across 17 templates
- pricing-card: drop invented sample metrics from defaults
  ('All 149 templates' -> 'All templates included')

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(schema): validate field types and correct numeric field declarations (#64)

Audit of all 148 templates with max-length edge inputs found 7 templates
(benchmark-result, chart-bar, flame-graph, password-generator, rate-limit,
social-poll, star-tracker) that crash with a confusing Tera
'invalid float literal' error when a field used in arithmetic receives
string input.

Root causes (both fixed):
- schemas declared arithmetic fields as type 'text'; corrected 26 fields
  to type 'number' (display-only fields like b*_ops stay text)
- validate_input never checked field types; render never called
  validate_input at all. Render now validates first and fails fast with
  field-level messages (JSON errors stay machine-readable for --json-output)

Also fixed test data for carousel-default which was silently invalid
(missing required 'headline') — previously passing only because render
did no validation.

Closes #60

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* docs(cli): document render-time schema validation (#65)

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(templates): standardize watermark footer across all 148 templates (#62) (#63)

- Bottom-center, 30px margin, Inter 20px w600 #7f849c everywhere
- Move carousel-default & og-image watermark from top-left to bottom-center
- Add missing watermark block to newsletter-header
- Document watermark spec in template-authoring guide

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(templates): repair 10 high-severity visual defects from vision audit (#66) (#68)

* fix(renderer): xml-escape context text so &, <, > render safely

Literal ampersands in template data previously broke SVG parsing
(malformed entity reference). All string context values are now
XML-escaped before minijinja rendering. Includes unit tests.

* fix(templates): correct default data found by full visual audit

- fit 5 default values to their schema max_length (render blockers):
  changelog-entry, credit-badge, css-snippet, incident-report,
  qr-code-display
- drop prefixes/suffixes the templates already render themselves:
  vv version (changelog-entry, release-notes, security-advisory),
  votes votes (poll-result), subscribers subscribers (newsletter-cta),
  EP EP (podcast-episode), $ $ (terminal-output), 5/5 / 5 (book-club),
  doubled diff markers (diff-viewer, git-diff)
- restore real ampersands previously mangled to 'and' (rust-snippet,
  snippet-go, quick-tip), now safe with xml escaping

* fix(templates): repair 10 high-severity visual defects (#66)

Verified visually against each template's default render:

- command-card, docker-command: command text overflowed its terminal
  panel (63px/141px past the edge) -> fit font size to panel width
- tech-stack: third card column ended at x=1180 on a 1080 canvas,
  clipping 'Tokio'/'Docker' mid-glyph -> redistribute columns
- roadmap-timeline, week-schedule: per-column descriptions wider than
  their columns overlapped into garbled lines -> wordwrap + tspan
  line breaking per column
- vscode-config: 29-char keys collided with values -> smaller font,
  value column moved right
- webhook-payload: ISO timestamp overflowed its 180px panel into the
  Delivery ID column -> shorter format + smaller font
- wallpaper-quote, gradient-quote: wrap_width 16/18 chars produced far
  too many lines for 56/52px type, author block overlapped the quote
  -> wrap widths sized to the actual font metrics
- poll-result: bar fills were hardcoded full width regardless of data
  -> percentage fields are numeric now, fill width = pct * 8px

* style: apply cargo fmt

---------

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(templates): rebalance top-heavy templates + raise contrast (audit part 1/2) (#70)

* fix(templates): rebalance vertically top-heavy templates

9 templates had content ending at 55-70% height leaving the bottom
of the card empty: archive-card, incident-report, version-compare,
version-comparison, step-process, roadmap-card, command-result,
flame-graph, goal-tracker. Content groups recentered/respread; also
fixes step-process badge circles using y= instead of cy=, goal-tracker
progress arc not matching its percentage, and the version-compare
delta badge overlapping a panel edge.

* fix(templates): raise contrast and fix status color semantics

- comparison: losing column raised from near-invisible grey; stray
  unmatched dash bar removed; rows respread over full canvas
- dependency-graph: leaf labels readable; serde_json connector now
  originates from serde (elbow connectors)
- token-display, color-palette: dark swatches get a subtle stroke
- api-key-display: redaction dots visible
- health-check: healthy services render green (status mapping now
  accepts ok/healthy/online case-insensitively; down stays red)

* fix(templates): compute goal-tracker ring arc from current/target

The arc was hardcoded to match the default 68% (CodeCora code-scanning
alert). current/target are numeric schema fields now; the ring renders
slide.current/slide.target of the circumference for any data.

* fix(templates): resolve goal-tracker conflict markers + data-driven arc; adaptive comparison pitch

- goal-tracker: a conflicted stash-application left both ring markups
  in the file; keep the rebalanced geometry (r=180) and compute the
  arc from slide.current/slide.target (circumference 1131)
- comparison: row pitch adapts min(370/(n-1), 150) so wrapped text
  never overflows the canvas while 3-line defaults keep the verified
  balance

---------

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(templates): overflow, glyph and polish fixes (audit part 2/2) (#71)

* fix(templates): fix overflow, collisions and line spacing

- feature-grid, recipe-card: descriptions/steps wrapped via
  wordwrap+tspan inside panel bounds
- password-generator: crack-time wrapped with padding, STRONG label
  centered inside the fill, layout spread over full canvas
- qr-code-display: finder squares inside the QR panel
- credit-badge: headline no longer overlaps the star
- podcast-cover: normal title leading, one step larger
- changelog: even line rhythm, NEW/FIXED bullet dots, respread
- dev-quote: code indentation preserved (xml:space=preserve)
- newsletter-cta: vertical rhythm computed from line counts

* fix(templates): repair glyphs, proportional fills and composition

- tweet-embed: reply/retweet icons drawn as SVG paths (glyphs were
  missing from bundled fonts); testimonial-grid: proper quote mark
- carousel-default, checklist: stray cursor-like accent rects removed
- progress-card: fill width proportional to numeric percentage
  (schema type number, poll-result pattern), 78% now renders 78%
- snippet-yaml: YAML indentation preserved (xml:space=preserve)
- gradient-mesh: text contrast shielded from bright mesh, rebalanced
- instagram-story: badge grouped with centered title block
- matrix-display: table vertically centered

* fix(templates): polish remaining low-severity visual findings

- api-endpoint: auth chip inset from bar edge
- author-bio: width-adaptive tag chips with even padding
- benchmark-result: winner badge grouped with bars
- book-club: cover placeholder visible
- calendar-event: date tile typography rebalanced
- database-schema: duplicate overlapping header text fixed
  (garbled glyph), title deduplicated
- dev-quote-card: quote-mark gap tightened
- gradient-banner: stray accent bar moved clear of text
- quote-stack: quote glyph breathing room
- stats-dashboard: metric digits in Inter for unambiguous 1/7
- webhook-card: response value follows key with natural spacing

---------

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* chore(release): v0.2.0

148 templates, renderer XML-escaping, full vision-audit fix wave
(#66/#67), numeric schema fields, docs gallery. See CHANGELOG.

---------

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* chore: GitHub issue templates for template and feature requests

Add two YAML issue forms (template request with platform/content-field
structure, feature request with area taxonomy) plus a config pointing
to the docs site. Gives structured demand data for template priorities
instead of free-form issues. Closes #98.

---------

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
ajianaz added a commit that referenced this pull request Sep 29, 2026
* fix(ci): use mlugg/setup-zig action for cargo-zigbuild

apt-get zig not available on ubuntu-24.04. Switch to mlugg/setup-zig@v1.
Also fix packaging to find binary in zigbuild output path.

* fix(ci): drop cargo-zigbuild, use standard cargo build

mlugg/setup-zig returning 404. Simplify to standard cargo build for v0.1.0.
GLIBC compatibility can be addressed in a future release.

* chore(release): v0.2.0 (#72)

* chore: sync main to develop (release workflow fixes) (#30)

* fix(ci): use mlugg/setup-zig action for cargo-zigbuild

apt-get zig not available on ubuntu-24.04. Switch to mlugg/setup-zig@v1.
Also fix packaging to find binary in zigbuild output path.

* fix(ci): drop cargo-zigbuild, use standard cargo build

mlugg/setup-zig returning 404. Simplify to standard cargo build for v0.1.0.
GLIBC compatibility can be addressed in a future release.

---------

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(docs): add VitePress documentation site with API reference and template gallery (#31)

- VitePress setup with Catppuccin Mocha brand theme
- Guide pages: installation, quick start, CLI reference, HTTP server, Docker, configuration, branding
- Template gallery: all 18 templates with schema reference and JSON examples
- API reference: health check, render endpoint, authentication
- Template authoring guide (moved from docs/ to docs/guide/)
- GitHub Pages CI workflow (bun-based, auto-deploy on docs/** push)
- 32 HTML pages generated, builds in ~8s

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(docs): add sample images and field descriptions for all 18 templates (#32)

- Render all 18 templates with CodeCora brand as visual samples
- Embed sample PNG in each template page (docs/public/samples/)
- Add human-readable field descriptions (was empty from schema.json)
- Add aspect ratio to dimensions table
- Clean up example JSON with realistic data

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(docs): correct brand in sample images to Ajianaz @ajianaz (#33)

All 18 sample images were rendered with CodeCora/@codecoradev branding.
Re-rendered with correct brand: Ajianaz / @ajianaz.

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(docs): all sample images now use ajianaz consistently (#34)

Replaced all author/speaker/guest names in sample data with 'ajianaz'.
No personal names in any sample image.

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 1) (#35)

New templates:
- numbered-tips: Numbered list card (1080x1350)
- progress-card: Progress bar with percentage (1080x1080)
- pinterest-pin: Vertical Pinterest format (1000x1500)
- blog-hero: Wide blog post header (1200x675)
- poll-result: Poll results with percentage bars (1080x1080)
- quote-minimal: Clean minimal quote card (1080x1080)
- step-process: Step-by-step flow diagram (1080x1080)
- faq-card: Q&A card layout (1080x1080)
- metric-grid: 2x2 grid of metrics (1080x1080)
- author-bio: Profile/bio card with tags (1080x1080)

Total templates: 18 → 28

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 2) (#36)

New templates:
- feature-highlight: Single feature with icon badge (1080x1080)
- timeline: Vertical timeline with milestones (1080x1350)
- comparison-table: Side-by-side comparison (1080x1080)
- cta-card: Call-to-action card with URL (1080x1080)
- book-cover: Book/ebook cover design (1080x1620)
- roadmap-card: Horizontal roadmap phases (1080x1080)
- discount-badge: Circular promo badge (800x800)
- code-snippet: Code editor card for social (1200x630)
- big-number: Oversized number/stat (1080x1080)
- event-flyer: Event flyer with details (1080x1350)

Total templates: 28 -> 38

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 3) (#37)

New templates:
- polaroid-quote: Polaroid-style quote card (1080x1080)
- review-card: Product review with rating (1080x1080)
- changelog: Release notes card (1080x1350)
- gradient-hero: Bold hero banner (1200x630)
- testimonial-grid: 3-column testimonials (1080x1080)
- stat-comparison: Before/after comparison (1080x1080)
- calendar-event: Calendar-style event card (1080x1080)
- pricing-card: Single pricing tier (1080x1080)
- github-star: Repo showcase card (1200x630)
- minimal-text: Ultra-minimal text-only (1080x1080)

Total templates: 38 -> 48

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 4) (#38)

New templates:
- quick-tip: Tip card with lightbulb icon (1080x1080)
- tweet-embed: Tweet-style card with avatar (1200x675)
- newsletter-cta: Newsletter signup card (1080x1080)
- retro-badge: Retro circular badge (600x600)
- matrix-card: 2x2 decision matrix (1080x1080)
- certificate: Certificate of achievement (1200x900)
- quote-stack: Stacked quotes with authors (1080x1350)
- webhook-card: API endpoint card (1200x630)
- goal-tracker: Goal progress with checklist (1080x1080)
- color-palette: Design palette showcase (1080x1080)

Total: 48 -> 58 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 5) (#39)

New templates:
- qr-business-card: Digital business card with QR (1080x1080)
- gradient-quote: Full-bleed gradient quote (1080x1080)
- stat-highlight: Bold single statistic (1200x630)
- faq-single: Single FAQ card (1080x1080)
- feature-list: Product features with checkmarks (1080x1350)
- team-member: Team profile card (1080x1080)
- kanban-card: Kanban board with columns (1200x630)
- podcast-episode: Podcast episode card (1080x1080)
- release-notes: Versioned release notes (1080x1350)
- wallpaper-quote: Phone wallpaper quote (1080x1920)

Total: 58 -> 68 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 6) (#40)

New templates:
- social-poll: Poll card with percentage bars (1080x1080)
- command-card: Terminal command with description (1200x630)
- week-schedule: Weekly content schedule grid (1080x1080)
- gradient-banner: Wide gradient banner (1200x630)
- data-counter: 4-metric counter grid (1080x1080)
- recipe-card: Recipe with ingredients and steps (1080x1350)
- css-snippet: CSS code with syntax highlighting (1200x630)
- milestone-celebration: Big number celebration (1080x1080)
- book-club: Book recommendation card (1080x1350)
- terminal-output: Terminal window output (1200x630)

Total: 68 -> 78 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 7) (#41)

New templates:
- github-issue: GitHub issue card with labels (1200x630)
- github-pr: GitHub PR card with merge status (1200x630)
- api-endpoint: API endpoint documentation (1200x630)
- docker-command: Docker command card (1200x630)
- rust-snippet: Rust code with editor style (1200x630)
- vscode-config: VS Code settings JSON (1200x630)
- dev-quote-card: Developer quote card (1080x1080)
- chart-bar: Bar chart visualization (1080x1080)
- git-diff: Git diff visualization (1200x630)
- package-json: package.json dependencies (1200x630)

Total: 78 -> 88 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 8) (#42)

New templates:
- github-profile: GitHub profile card with avatar and stats (1080x1080)
- tech-stack: Technology stack grid (1080x1080)
- contributor-card: OSS contributor appreciation (1200x630)
- release-tag: Git release/tag announcement (1200x630)
- ci-pipeline: CI/CD pipeline visualization (1200x630)
- dependency-graph: Dependency tree visualization (1080x1080)
- feature-flags: Feature flag toggle board (1080x1080)
- uptime-monitor: Service uptime dashboard (1080x1080)
- api-response: API JSON response viewer (1200x630)
- error-404: 404 error page design (1080x1080)

Total: 88 -> 98 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 9) (#43)

New templates:
- log-viewer: Server log output viewer (1200x630)
- database-schema: Database table schema visualization (1200x630)
- dockerfile: Dockerfile instructions viewer (1200x630)
- makefile: Makefile targets viewer (1200x630)
- license-card: Open source license info card (1080x1080)
- pull-request: GitHub PR review card (1200x630)
- code-review: Code review comment card (1200x630)
- version-comparison: Side-by-side version comparison (1080x1080)
- env-setup: Dev environment setup instructions (1200x630)
- security-advisory: Security vulnerability advisory (1200x630)

Total: 98 -> 108 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 10) (#44)

New templates:
- kudos-card: Team appreciation card (1080x1080)
- star-tracker: GitHub stars milestone tracker (1080x1080)
- terminal-prompt: Terminal command prompt snippet (1200x630)
- flame-graph: Performance profiling flame graph (1080x1080)
- migration-status: Database migration progress tracker (1080x1080)
- api-key-display: API key/token reveal card (1200x630)
- credit-badge: Achievement or skill badge (1080x1080)
- roadmap-timeline: Project roadmap horizontal timeline (1080x1080)
- stats-dashboard: Multi-metric dashboard 2x2 grid (1080x1080)
- swagger-endpoint: OpenAPI endpoint documentation (1200x630)

Total: 108 -> 118 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 11) (#45)

New templates:
- webhook-payload: Incoming webhook event payload viewer (1200x630)
- password-generator: Generated password display card (1080x1080)
- qr-code-display: QR code with label and URL (1080x1080)
- diff-viewer: Code diff comparison viewer (1200x630)
- cert-pinned: SSL/TLS certificate details card (1080x1080)
- rate-limit: API rate limit status card (1200x630)
- command-result: CLI command execution result (1080x1080)
- config-display: Configuration key-value display (1200x630)
- health-check: Service health check status board (1080x1080)
- changelog-entry: Release changelog entry card (1200x630)

Total: 118 -> 128 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 12) (#46)

New templates:
- incident-report: Post-mortem incident report (1080x1080)
- deploy-status: Deployment pipeline tracker (1080x1080)
- snippet-go: Go code snippet (1200x630)
- snippet-python: Python code snippet (1200x630)
- snippet-typescript: TypeScript code snippet (1200x630)
- ascii-art: ASCII art display (1200x630)
- matrix-display: Color-coded comparison matrix (1080x1080)
- gradient-mesh: Abstract gradient mesh art (1080x1080)
- token-display: Design token showcase (1200x630)
- feature-grid: Feature showcase 2x2 grid (1080x1080)

Total: 128 -> 138 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): add 10 new templates (batch 13) (#47)

New templates:
- snippet-rust: Rust code snippet (1200x630)
- snippet-bash: Bash/shell snippet (1200x630)
- snippet-sql: SQL query snippet (1200x630)
- snippet-yaml: YAML config snippet (1200x630)
- leaderboard: Ranked leaderboard (1080x1080)
- sponsor-card: OSS sponsor appreciation (1080x1080)
- version-compare: Side-by-side version comparison (1200x630)
- status-badge: Service status badge (1200x630)
- benchmark-result: Performance benchmark bars (1080x1080)
- archive-card: Blog post archive entry (1080x1350)

Total: 138 -> 148 templates

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* docs: add 148 template pages with MinIO preview images (#48)

- Generate doc page for all 148 templates (fields, dimensions, usage)
- Preview images served from MinIO CDN (slim repo, no binary assets)
- Update sidebar: 11 categories, collapsible, all 148 templates
- Update index.md: responsive gallery grid with lazy loading
- VitePress build: 162 HTML pages, all passing

Total: 18 -> 148 template doc pages

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* docs: change VitePress base to / for Cloudflare Pages (#49)

Deployed to CF Pages project: cosy-docs
Production URL: https://cosy-docs-4f5.pages.dev/

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(docs): Pinterest-style masonry layout for templates gallery (#50)

- Replace CSS grid with CSS columns (masonry/pinterest flow)
- Images display at natural aspect ratio — no cropping
- Responsive: 5 cols desktop → 4 → 3 → 2 → 1 mobile
- Cards use break-inside: avoid for clean column flow
- Deployed to CF Pages production

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(docs): reduce masonry to 3 columns default (4 on ultra-wide)

Desktop default 3 cols, 4 only on 1440px+, gap widened to 16px

* fix(templates): watermark position + border radius consolidation (#51)

Watermark fixes (8 templates):
- linkedin-card: brand_name moved from top (y=95) to bottom-right (y=590)
- twitter-quote: brand_name moved from top (y=120) to bottom-right (y=635)
- dev-quote: brand_name moved from y=968 to y=1040 (40px from bottom)
- instagram-story: y=1780 → y=1870 (50px from bottom)
- tiktok-quote: y=1250 → y=1310 (40px from bottom)
- pinterest-pin: y=1400 → y=1460 (40px from bottom)
- book-cover: y=1530 → y=1580 (40px from bottom)
- youtube-thumb: y=630 → y=690 (30px from bottom)
- twitter-quote + linkedin-card: accent font → muted credit style (20px, #7f849c)

Border radius consolidation (81 templates):
- Standardized 25+ rx values to 4-tier system: 8/12/20/30
- rx 1-5 → 8 (small), rx 6-14 → 12 (default), rx 15-24 → 20 (large), rx 25-40 → 30 (pill)
- rx=0 preserved (intentionally sharp corners)

Refs: miifb (make-interfaces-feel-better), hallmark design audit

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): watermark default off + show_brand toggle (#52)

- Added 'show_brand' boolean field to all 148 schema.json files (default: false)
- Added 'Boolean' variant to FieldType enum in src/schema.rs
- Wrapped all brand_name text elements in {% if brand.show_brand %} conditional
  in all 147 template.svg files that had brand_name
- Watermark/brand now OFF by default — only renders when show_brand: true
- Updated existing 18 defaults.json with show_brand: false

Breaking change: brand_name no longer appears by default.
To enable: pass {"brand": {"show_brand": true, "brand_name": "..."}}

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat(templates): real-case defaults for all 148 templates (#53)

Replace generic sample data with realistic, template-relevant content:
- deploy-status: production v2.1.0 deployment with service statuses
- changelog: real version notes with breaking changes and features
- benchmark-result: Rust vs Node.js vs Python render performance
- code-snippet: actual Rust async render handler code
- blog-hero: 'Why We Replaced Puppeteer with Pure Rust'
- big-number: '149 templates available'
- And 142 more templates with contextually relevant content

All defaults now include show_brand: false (no watermark by default).
Fixed SVG-breaking characters in code samples (< > and && removed).
Fixed float-parsing issues (% suffixes removed from numeric fields).

148/148 templates render successfully.

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* docs: border radius 4-tier standard + sub-5px decorative exception (#54) (#57)

Document the radius tier system (8/12/20/30) standardized in #51 and
add an explicit exception for thin decorative elements (<=5px) so
automated audits stop flagging divider bars as non-standard rx.

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(templates): tighten max length on big-number fields (#55) (#58)

Reduce max from 10-20 to 8 chars for hero-size number fields that
render at 140-220px font size — longer values clip at the canvas
edge. Templates: stat-card, big-number, stat-highlight,
star-tracker (current_stars/goal_stars), milestone-celebration.
Descriptions note the clipping constraint.

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(templates): replace emoji with SVG icon + normalize type scale (#56) (#59)

- github-star: replace star emoji with inline SVG star (accent
  gradient fill), optically aligned to text baseline
- feature-highlight: schema description no longer suggests emoji
- type-scale: normalize off-scale font sizes (13->14, 15->16,
  34->32, 38->36, 46->48, 68->64, 76->72) across 17 templates
- pricing-card: drop invented sample metrics from defaults
  ('All 149 templates' -> 'All templates included')

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(schema): validate field types and correct numeric field declarations (#64)

Audit of all 148 templates with max-length edge inputs found 7 templates
(benchmark-result, chart-bar, flame-graph, password-generator, rate-limit,
social-poll, star-tracker) that crash with a confusing Tera
'invalid float literal' error when a field used in arithmetic receives
string input.

Root causes (both fixed):
- schemas declared arithmetic fields as type 'text'; corrected 26 fields
  to type 'number' (display-only fields like b*_ops stay text)
- validate_input never checked field types; render never called
  validate_input at all. Render now validates first and fails fast with
  field-level messages (JSON errors stay machine-readable for --json-output)

Also fixed test data for carousel-default which was silently invalid
(missing required 'headline') — previously passing only because render
did no validation.

Closes #60

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* docs(cli): document render-time schema validation (#65)

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(templates): standardize watermark footer across all 148 templates (#62) (#63)

- Bottom-center, 30px margin, Inter 20px w600 #7f849c everywhere
- Move carousel-default & og-image watermark from top-left to bottom-center
- Add missing watermark block to newsletter-header
- Document watermark spec in template-authoring guide

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(templates): repair 10 high-severity visual defects from vision audit (#66) (#68)

* fix(renderer): xml-escape context text so &, <, > render safely

Literal ampersands in template data previously broke SVG parsing
(malformed entity reference). All string context values are now
XML-escaped before minijinja rendering. Includes unit tests.

* fix(templates): correct default data found by full visual audit

- fit 5 default values to their schema max_length (render blockers):
  changelog-entry, credit-badge, css-snippet, incident-report,
  qr-code-display
- drop prefixes/suffixes the templates already render themselves:
  vv version (changelog-entry, release-notes, security-advisory),
  votes votes (poll-result), subscribers subscribers (newsletter-cta),
  EP EP (podcast-episode), $ $ (terminal-output), 5/5 / 5 (book-club),
  doubled diff markers (diff-viewer, git-diff)
- restore real ampersands previously mangled to 'and' (rust-snippet,
  snippet-go, quick-tip), now safe with xml escaping

* fix(templates): repair 10 high-severity visual defects (#66)

Verified visually against each template's default render:

- command-card, docker-command: command text overflowed its terminal
  panel (63px/141px past the edge) -> fit font size to panel width
- tech-stack: third card column ended at x=1180 on a 1080 canvas,
  clipping 'Tokio'/'Docker' mid-glyph -> redistribute columns
- roadmap-timeline, week-schedule: per-column descriptions wider than
  their columns overlapped into garbled lines -> wordwrap + tspan
  line breaking per column
- vscode-config: 29-char keys collided with values -> smaller font,
  value column moved right
- webhook-payload: ISO timestamp overflowed its 180px panel into the
  Delivery ID column -> shorter format + smaller font
- wallpaper-quote, gradient-quote: wrap_width 16/18 chars produced far
  too many lines for 56/52px type, author block overlapped the quote
  -> wrap widths sized to the actual font metrics
- poll-result: bar fills were hardcoded full width regardless of data
  -> percentage fields are numeric now, fill width = pct * 8px

* style: apply cargo fmt

---------

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(templates): rebalance top-heavy templates + raise contrast (audit part 1/2) (#70)

* fix(templates): rebalance vertically top-heavy templates

9 templates had content ending at 55-70% height leaving the bottom
of the card empty: archive-card, incident-report, version-compare,
version-comparison, step-process, roadmap-card, command-result,
flame-graph, goal-tracker. Content groups recentered/respread; also
fixes step-process badge circles using y= instead of cy=, goal-tracker
progress arc not matching its percentage, and the version-compare
delta badge overlapping a panel edge.

* fix(templates): raise contrast and fix status color semantics

- comparison: losing column raised from near-invisible grey; stray
  unmatched dash bar removed; rows respread over full canvas
- dependency-graph: leaf labels readable; serde_json connector now
  originates from serde (elbow connectors)
- token-display, color-palette: dark swatches get a subtle stroke
- api-key-display: redaction dots visible
- health-check: healthy services render green (status mapping now
  accepts ok/healthy/online case-insensitively; down stays red)

* fix(templates): compute goal-tracker ring arc from current/target

The arc was hardcoded to match the default 68% (CodeCora code-scanning
alert). current/target are numeric schema fields now; the ring renders
slide.current/slide.target of the circumference for any data.

* fix(templates): resolve goal-tracker conflict markers + data-driven arc; adaptive comparison pitch

- goal-tracker: a conflicted stash-application left both ring markups
  in the file; keep the rebalanced geometry (r=180) and compute the
  arc from slide.current/slide.target (circumference 1131)
- comparison: row pitch adapts min(370/(n-1), 150) so wrapped text
  never overflows the canvas while 3-line defaults keep the verified
  balance

---------

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(templates): overflow, glyph and polish fixes (audit part 2/2) (#71)

* fix(templates): fix overflow, collisions and line spacing

- feature-grid, recipe-card: descriptions/steps wrapped via
  wordwrap+tspan inside panel bounds
- password-generator: crack-time wrapped with padding, STRONG label
  centered inside the fill, layout spread over full canvas
- qr-code-display: finder squares inside the QR panel
- credit-badge: headline no longer overlaps the star
- podcast-cover: normal title leading, one step larger
- changelog: even line rhythm, NEW/FIXED bullet dots, respread
- dev-quote: code indentation preserved (xml:space=preserve)
- newsletter-cta: vertical rhythm computed from line counts

* fix(templates): repair glyphs, proportional fills and composition

- tweet-embed: reply/retweet icons drawn as SVG paths (glyphs were
  missing from bundled fonts); testimonial-grid: proper quote mark
- carousel-default, checklist: stray cursor-like accent rects removed
- progress-card: fill width proportional to numeric percentage
  (schema type number, poll-result pattern), 78% now renders 78%
- snippet-yaml: YAML indentation preserved (xml:space=preserve)
- gradient-mesh: text contrast shielded from bright mesh, rebalanced
- instagram-story: badge grouped with centered title block
- matrix-display: table vertically centered

* fix(templates): polish remaining low-severity visual findings

- api-endpoint: auth chip inset from bar edge
- author-bio: width-adaptive tag chips with even padding
- benchmark-result: winner badge grouped with bars
- book-club: cover placeholder visible
- calendar-event: date tile typography rebalanced
- database-schema: duplicate overlapping header text fixed
  (garbled glyph), title deduplicated
- dev-quote-card: quote-mark gap tightened
- gradient-banner: stray accent bar moved clear of text
- quote-stack: quote glyph breathing room
- stats-dashboard: metric digits in Inter for unambiguous 1/7
- webhook-card: response value follows key with natural spacing

---------

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* chore(release): v0.2.0

148 templates, renderer XML-escaping, full vision-audit fix wave
(#66/#67), numeric schema fields, docs gallery. See CHANGELOG.

---------

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>

* feat: code-screenshot template with syntax highlighting

Add a macOS-style code editor screenshot template (1200x675): traffic
lights, window title, filename + language badge, 13-line clip-path code
window, dark/light theme palettes. Real syntax highlighting via the new
highlight module: per-line tokenization into styled segments (comments,
strings, numbers, language-aware keywords for rust/go/python/ts/js/
bash/sql) rendered through the existing tspan segment machinery. New
schema option options:["code"] emits <field>_lines and
<field>_segments from the sibling code_lang field — reusable by other
templates. Pixel-verified token colors, stress-tested at max code
length, vision-QA'd on both themes. Closes #93.

* fix(templates): make code-screenshot line 13 actually visible

Baseline math made the 13th line start at y=603 while the clip rect
ended at y=590, so it was silently clipped away and only 12 lines ever
showed. Shift the first baseline to 192 and tighten leading to 33px:
line 13 now lands at y=588, inside the clip (verified by pixel-scan
ink check at the line-13 band). Found by the CodeCora code-scanning
gate before merge.

* fix(highlight): theme-aware token palettes for light editor background

Token colors were hardcoded to the dark Mocha palette, so the light
theme rendered pastel greens/mauves on white at ~1.6-2:1 contrast
(unreadable) while the template's light palette definition sat unused.
highlight_line/highlight now take the theme and pick a Latte-style
palette (keyword #8839ef, string #40a02b, number #fe640b, comment
#838ba7) for light editors; template.rs passes the sibling theme field
through. Pixel-verified: dark palette absent on light renders, Latte
tokens present; vision QA confirms >=4.5:1 on keywords. Found by the
CodeCora code-scanning gate before merge.

* fix(highlight): case-insensitive SQL keywords

The SQL keyword list is stored uppercase and matched with exact
equality, so conventional lowercase SQL (select id from users) got zero
keyword coloring. SQL now matches keywords ASCII-case-insensitively;
the test previously only fed uppercase input despite its name, and now
exercises both cases. Found by the CodeCora code-scanning gate.

---------

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant