Skip to content

Commit 2dd6c78

Browse files
authored
Merge pull request #3 from lordvins226/feat/six-new-templates
feat(quoteforge): 24 new templates, stat/code/chart blocks, and a green typecheck
2 parents b99c8dc + 7ae47b6 commit 2dd6c78

150 files changed

Lines changed: 6022 additions & 41 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,38 @@
11
# Changelog
22

3+
## 1.0.0
4+
5+
### Added
6+
- 24 new templates, bringing the total to 28, grouped into five families:
7+
- **Statement:** `spotlight`, `frame`, `sticky` (alongside existing `manifesto`, `quote`,
8+
`minimal`).
9+
- **Structure & data:** `ledger`, `index`, `grid`, `timeline`, `versus`, `stat`, `chart`
10+
(alongside existing `list`).
11+
- **Developer:** `terminal`, `code`, `diff`, `window`.
12+
- **Editorial:** `cover`, `split`, `memo`, `receipt`, `ticket`, `calendar`.
13+
- **People & media:** `profile`, `chat`, `prompt`, `polaroid`.
14+
- Three new block types: `stat` (one figure with unit/note), `code` (filename tab over
15+
numbered lines), and `chart` (horizontal bars, pure CSS).
16+
- `eyebrow`: an optional string (max 48 chars) on a card, deck `defaults`, or slide, rendering
17+
as small chrome above the main content on the 8 templates with an eyebrow slot (`cover`,
18+
`memo`, `receipt`, `split`, `spotlight`, `terminal`, `ticket`, `window`).
19+
- Studio: a grouped template picker organized by the same five families, with catalog drift
20+
tests keeping it in sync with the template set.
21+
- Non-fatal warnings for layout mismatches that used to render silently wrong: `grid` cards
22+
without exactly 4 items, and `eyebrow` set on a template with no eyebrow slot.
23+
24+
### Fixed
25+
- Unknown template names now fail with a clear error naming the available templates, instead
26+
of a raw `ENOENT` stack trace for the template's missing `style.css`.
27+
- `quoteforge new` offered only four templates from a hardcoded list; it now offers every
28+
installed template and rejects an unknown `--template`.
29+
- Studio: adding a `stat`, `code`, or `chart` block to a deck slide crashed the editor —
30+
the deck store's block factory had not been extended for the new types.
31+
32+
### Changed
33+
- `bun run typecheck` is now green and gates releases (`preversion` runs it before the test
34+
suite). `src/` and `studio/` are checked as separate TypeScript projects.
35+
336
## 0.6.0
437

538
### Added

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ quoteforge preview <file> [options]
147147
quoteforge new [options]
148148
149149
--type <type> card or deck
150-
--template <name> Template name (manifesto, quote, list, minimal)
150+
--template <name> Template name (28 available — omit for a picker)
151151
--theme <name> Theme name
152152
--slides <n> Number of blank slides (deck only, default: 5)
153153
--size <name> Size name
@@ -350,7 +350,7 @@ work.
350350
- `src/` — CLI + renderer (Bun + Nunjucks + Puppeteer)
351351
- `studio/` — bundled WYSIWYG editor (Vite + React + Zustand, launched by `quoteforge studio`)
352352
- `site/` — standalone landing + MDX docs SPA (separate nginx Dockerfile for deployment)
353-
- `templates/`four built-in card layouts sharing a responsive base CSS
353+
- `templates/`28 built-in card layouts sharing a responsive base CSS
354354
- `themes/` — 12 JSON theme files conforming to `_schema.json`
355355

356356
## Stack
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
{
2+
"$schema": "../../content/_schema.json",
3+
"template": "calendar",
4+
"theme": "noir-crimson",
5+
"size": "instagram-sq",
6+
"blocks": [
7+
{
8+
"id": "date",
9+
"type": "callout",
10+
"items": [
11+
{ "label": "Aug", "text": "14" }
12+
]
13+
},
14+
{
15+
"id": "what",
16+
"type": "headline",
17+
"parts": [
18+
{ "text": "QuoteForge 1.0 goes out", "style": "normal" }
19+
]
20+
},
21+
{
22+
"id": "when",
23+
"type": "text",
24+
"content": "18:00 CET · live on the repo"
25+
}
26+
]
27+
}

content/examples/chart-demo.json

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
{
2+
"$schema": "../../content/_schema.json",
3+
"template": "chart",
4+
"theme": "oceanic",
5+
"size": "instagram-port",
6+
"blocks": [
7+
{
8+
"id": "title",
9+
"type": "headline",
10+
"parts": [{ "text": "Where the render time goes", "style": "normal" }]
11+
},
12+
{
13+
"id": "bars",
14+
"type": "chart",
15+
"rows": [
16+
{ "label": "Chrome launch", "value": 61 },
17+
{ "label": "Font settling", "value": 22 },
18+
{ "label": "Nunjucks", "value": 11, "muted": true },
19+
{ "label": "Screenshot", "value": 6, "muted": true }
20+
]
21+
},
22+
{
23+
"id": "footer",
24+
"type": "text",
25+
"content": "n = 500 renders · 1080²"
26+
}
27+
]
28+
}

content/examples/chat-demo.json

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"$schema": "../../content/_schema.json",
3+
"template": "chat",
4+
"theme": "dark-orange",
5+
"size": "instagram-sq",
6+
"blocks": [
7+
{
8+
"id": "thread",
9+
"type": "bullet-list",
10+
"items": [
11+
{ "label": "them", "text": "Can this render offline, no cloud?" },
12+
{ "label": "me", "text": "Yes — Bun + headless Chrome, nothing leaves your machine." },
13+
{ "label": "them", "text": "And carousels?" },
14+
{ "label": "me", "text": "One deck JSON, one command." }
15+
]
16+
}
17+
]
18+
}

content/examples/code-demo.json

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"$schema": "../../content/_schema.json",
3+
"template": "code",
4+
"theme": "terminal-green",
5+
"size": "twitter",
6+
"blocks": [
7+
{
8+
"id": "snippet",
9+
"type": "code",
10+
"filename": "renderer.ts",
11+
"lang": "ts",
12+
"lines": [
13+
"export function render(card: Card): Buffer {",
14+
" const html = compile(card);",
15+
" return screenshot(html);",
16+
"}"
17+
]
18+
}
19+
]
20+
}

content/examples/cover-demo.json

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
"$schema": "../../content/_schema.json",
3+
"template": "cover",
4+
"theme": "mono-slate",
5+
"size": "instagram-port",
6+
"eyebrow": "Field notes — 07",
7+
"blocks": [
8+
{
9+
"id": "title",
10+
"type": "headline",
11+
"parts": [
12+
{ "text": "Rendering text is harder than it looks", "style": "normal" }
13+
]
14+
},
15+
{
16+
"id": "author",
17+
"type": "text",
18+
"content": "Kevin W."
19+
},
20+
{
21+
"id": "read-time",
22+
"type": "text",
23+
"content": "12 min"
24+
}
25+
]
26+
}

content/examples/diff-demo.json

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
{
2+
"$schema": "../../content/_schema.json",
3+
"template": "diff",
4+
"theme": "dark-orange",
5+
"size": "twitter",
6+
"blocks": [
7+
{
8+
"id": "head",
9+
"type": "text",
10+
"content": "v0.5.0 → v0.6.0 · templates/_base.css"
11+
},
12+
{
13+
"id": "rows",
14+
"type": "bullet-list",
15+
"items": [
16+
{ "label": "-", "text": ".block { flex: 1 1 0 }" },
17+
{ "label": "+", "text": ".block { flex: 0 0 auto }" },
18+
{ "label": "+", "text": ".card.align-center { justify-content: center }" }
19+
]
20+
},
21+
{
22+
"id": "foot",
23+
"type": "text",
24+
"content": "Content groups instead of stranding."
25+
}
26+
]
27+
}

content/examples/frame-demo.json

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"$schema": "../../content/_schema.json",
3+
"template": "frame",
4+
"theme": "kyoto",
5+
"size": "instagram-sq",
6+
"blocks": [
7+
{
8+
"id": "quote",
9+
"type": "blockquote",
10+
"parts": [
11+
{ "text": "The best interface is the one you don't have to think about.", "style": "normal" }
12+
]
13+
},
14+
{
15+
"id": "attribution",
16+
"type": "text",
17+
"content": "Kyoto · 1080²"
18+
}
19+
]
20+
}

content/examples/grid-demo.json

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"$schema": "../../content/_schema.json",
3+
"template": "grid",
4+
"theme": "brutal-white",
5+
"size": "instagram-sq",
6+
"blocks": [
7+
{
8+
"id": "cells",
9+
"type": "bullet-list",
10+
"items": [
11+
{ "label": "Own", "text": "Version the source" },
12+
{ "label": "Script", "text": "Automate the output" },
13+
{ "label": "Ship", "text": "Deterministic PNGs" },
14+
{ "label": "Repeat", "text": "No drag-and-drop drift" }
15+
]
16+
}
17+
]
18+
}

0 commit comments

Comments
 (0)