@agentic-design-kits/verdigris 2026.1113.0 → 2026.1113.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/COMPONENTS.md CHANGED
@@ -909,10 +909,12 @@ The top of a blog post, in place of a `Hero` or `PageTitle`: a small label back
909
909
 
910
910
  In Astro, `<PostHeader title="…" lead="…" back={{ label: 'Blog', href: '/blog/' }} date="2026-10-20" author="…" minutes={4} tags={['Type']} />`. It writes Published, By, Reading and Topics, leaving out any you don't pass.
911
911
 
912
- - The label is the `label` style in `ink`, `accent-text` and underlined on hover. One or two words.
913
- - The title is bold and tight at `clamp(2.5rem, 6vw, 5rem)`, between `page-title` and `h2`, since post titles run longer. It stops at 18em wide, so a long title breaks into lines of a few words, and it wraps a long word.
914
- - The byline is a row of small `muted` labels over their values, under a scotch rule; it wraps on phones.
915
- - A cover image, if any, goes after the header: full width, 16:9 (`.media .media--16x9`), never behind the title.
912
+ - Everything is centered, like a title page.
913
+ - The label is 22px (`--size-300`) in `copper-text`, between two asterisms (⁂, hidden from screen readers), and turns `accent-text` and underlined on hover. One or two words.
914
+ - The title is light at `--size-post-title` (`clamp(3.5rem, 7.4vw, 5.75rem)`), between `page-title` and `h2`, since post titles run longer. It stops at 18em wide, so a long title breaks into lines of a few words, and it wraps a long word.
915
+ - The lead is italic at `clamp(1.625rem, 2.6vw, 2rem)`, at most 28em wide.
916
+ - The byline is one 22px (`--size-300`) `muted` line of values with a copper lozenge (◆) between them, and no rule. Its labels (Published, By…) are hidden but stay in the markup for screen readers.
917
+ - A cover image, if any, goes after the header: full width at 16:9 (`.media .media--16x9`) when it is landscape, centered at its own shape when it is not, never behind the title. A post with no picture takes a `.rule-fleuron` there instead, at the text's width.
916
918
 
917
919
  ## PostBody
918
920
 
@@ -920,13 +922,15 @@ Long-form text from Markdown: `.post-body` styles the plain elements inside it,
920
922
 
921
923
  **Markup.** `<div class="post-body"><Content /></div>`, after the `PostHeader`.
922
924
 
923
- - A 42rem measure by default (`max-w-*` on the same element changes it). Paragraphs and blocks are 1.25rem apart.
925
+ - A 45rem measure (`max-w-*` on the same element changes it); center it under the header with `mx-auto`. Paragraphs are `clamp(1.375rem, 2vw, 1.625rem)` on 1.52 leading, a step up from the page's text, and blocks are 1.25rem apart.
924
926
  - `h2` is bold at 1.75rem, 2.25rem from 768px, with `space-12` above it and no rule: inside one article, space and size mark a new part, and the 2px rule is kept for the page's own sections; `h3` is the `title` size. Don't skip from the post's `h1` to an `h3`.
925
927
  - Links underline and turn `accent-text` on hover, like `.link`.
926
928
  - Lists have square markers (`ul`) or tabular numbers (`ol`), in `muted`.
927
- - A quote is large and bold beside a 6px `accent` edge, the same edge as the active row. Keep quotes short; one or two per post.
928
- - `hr` is a scotch rule. Images fill the measure, square, on `rule` until they load. A table has small headings over a 2px rule and 1px rules between rows.
929
+ - A quote is large, light and italic in `accent-text`, centered between two 1px `rule` lines. Keep quotes short; one or two per post.
930
+ - `hr` is an asterism (⁂) in `copper-text`. Images fill the measure, square, on `rule` until they load. A table has small headings over a 2px rule and 1px rules between rows.
929
931
  - Code uses the kit's own `pre` and `code` styles.
932
+ - Markdown footnotes (`[^1]`) are numbered in `accent-text`; the notes sit at the end in 20px `muted` text under a 1px `ink` rule, numbered in `copper-text`.
933
+ - `.post-body--end` ends the piece with an asterism, above the notes when there are any.
930
934
 
931
935
  **Don't.** Set a whole paragraph in a quote to make it stand out, or add colored callout boxes.
932
936
 
@@ -945,7 +949,7 @@ The previous and next posts, at the end of a post.
945
949
 
946
950
  In Astro, `<PostNav prev={{ title, href }} next={{ title, href }} />` (`PostLink` in `kit/astro/types.ts`). Previous is the older post, Next the newer one; leave either off at the ends, and it draws nothing when both are off.
947
951
 
948
- - A scotch rule, then a small `muted` label over each post's title, which underlines on hover.
952
+ - A scotch rule, then a 20px `copper-text` label over each post's title, set at 1.75rem in the reading weight, which underlines on hover.
949
953
  - Stacked on phones with a 1px `rule` between; two columns from 640px, Next always on the right.
950
954
  - The arrows are the font's own glyphs, hidden from screen readers.
951
955
 
package/DESIGN.md CHANGED
@@ -89,7 +89,7 @@ One family, `--font-sans` (Cormorant, falling back to Garamond, Iowan Old Style,
89
89
  - Pages end with a `Footer`: the scotch rule, the site name and its links.
90
90
  - A fixed bottom bar (`BottomBar`) is optional, and goes only on pages where something stays current while the page scrolls. On those pages, set `bar-h` to its height and reserve that space at the bottom of the page (`BaseLayout`'s `barHeight` prop does both). Without one, `--bar-h` is `0rem`.
91
91
  - A page that needs a name but no hero opens with a `PageTitle`: one big `h1` across the width of `.page`, on the paper or on a `bar` block.
92
- - A blog's index may open with a `PostFeature` (one post beside a square image) in place of a hero, kept at the top of every page when a `Pager` splits the list. A blog post opens with a `PostHeader`, its text in a `.post-body` at a 42rem measure, and ends with a `PostNav`.
92
+ - A blog's index may open with a `PostFeature` (one post beside a square image) in place of a hero, kept at the top of every page when a `Pager` splits the list. A blog post opens with a `PostHeader`, centered, its text in a `.post-body` at a 45rem measure under it, and ends with a `PostNav`.
93
93
  - Everything is square: `radius-none`. `radius-round` is for six marks only: the spinner, the "new" dot (`.new-dot`), the drawer's "more below" arrow (`.drawer-more`), the radio button (`.radio`), the oval badge (`.ellipse`, at 50%) and the number circle (`.num-circle`, at 50%). The switch stays square.
94
94
 
95
95
  ## Iconography
@@ -108,7 +108,7 @@ One family, `--font-sans` (Cormorant, falling back to Garamond, Iowan Old Style,
108
108
  Ornament is what separates this kit from Swiss Minimal, so it has its own limits.
109
109
 
110
110
  - **Fleuron rule** (`.rule-fleuron`): a pause between parts of a page. Once a page at most.
111
- - **Asterism** (⁂): the end of a piece, or a Markdown `---` in a post.
111
+ - **Asterism** (⁂): the end of a piece (`.post-body--end`), or a Markdown `---` in a post.
112
112
  - **Dagger** (†): a footnote mark.
113
113
  - **Manicule** (☞): a `.notice`, for one note a reader must not miss.
114
114
  - **Lozenge** (◆): separates metadata.
@@ -155,7 +155,7 @@ Photos, artwork, screenshots and product shots are welcome. The test is whether
155
155
 
156
156
  ## Components
157
157
 
158
- Every component is a plain CSS class in `kit/theme.css` (loaded through `kit/tailwind.css`); there is no JavaScript bundle, only a few small plain scripts for the pieces that need behavior. In short: **Skip link** (`.skip-link`), **Top bar** (`.topbar`), **Outlined button** (`.topbar-btn`, `.burger`), **Hover label** (`data-tip`), **Primary button** (`.btn`), **Secondary button** (`.btn-outline`, `.btn-group`), **Tertiary button** (`.btn-outline--tertiary`), **Slide-down panel** (`.panel`, with `kit/panel.js`), **Menu** (`.menu-list`, `.acc`, `.submenu`), **Panel tabs** (`.panel-tabs`, `.panel-tab`), **"New" dot** (`.new-dot`, with `kit/new-dot.js`), **Field** (`.field`), **Select** (`.select-wrap`, `.select`), **Date and time** (`.field` on `type="date"`, `time`…), **File picker** (`.file-pick`, with `kit/file-pick.js`), **Switch** (`.choice`, `.switch`), **Radio** (`.choice-group`, `.radio`), **Filter buttons** (`.chip`), **Favorite star** (`.fav-btn`, with `kit/favorites.js`), **Page accordion** (`.page-acc`), **List row** (`.row`), **Bottom bar** (`.bottom-bar`, optional), **Jump to current** (`.jump-btn`, with `kit/jump.js`), **Scrolling title** (`.marquee`, with `kit/marquee.js`), **Dialog** (`.dialog` on `<dialog>`, with `kit/dialog.js`), **Toast** (`.toast`), **Drawer** (`.drawer`, with `kit/drawer.js`), **Scotch rule** (`.rule-scotch`, `.rule-thick`), **Fleuron rule** (`.rule-fleuron`), **Plate** (`.plate`), **Notice** (`.notice`), **Rosette** (`.rosette`), **Mark** (`.mark`), **Drop cap** (`.post-body--cap`), **Icon actions** (`.icon-row`, `.icon-btn`, with `kit/icon-controls.js`), **Closing note** (`.closing-note`), **Dated list** (`.dated-list`), **Summary list** (`.summary-list`), **Output panel** (`.output`, with `kit/output.js`), **Code block** (`pre`, `.pre--bar`, `.pre-cmd`, `.pre-err`, `.tok-*`), **Ellipse** (`.ellipse`, `.ellipse--solid`), **Number circle** (`.num-circle`, `.num-circle--solid`, `.num-circle--accent`), **Activity indicators** (`.eq`, `.spinner`), **Image** (`.media`, `.figure`), **Hero** (`.hero`, `.hero--split`, `.hero--wide`), **Page title** (`.page-title`, `.page-title--bar`), **CTA** (`.cta`), **Card grid** (`.card-grid`, `.card`), **Post list** (`.post-list`), **Post feature** (`.post-feature`), **Pager** (`.pager`), **Post header** (`.post-header`, `.post-meta`), **Post body** (`.post-body`), **Post nav** (`.post-nav`), **Footer** (`.site-footer`, `.site-footer--bar`).
158
+ Every component is a plain CSS class in `kit/theme.css` (loaded through `kit/tailwind.css`); there is no JavaScript bundle, only a few small plain scripts for the pieces that need behavior. In short: **Skip link** (`.skip-link`), **Top bar** (`.topbar`), **Outlined button** (`.topbar-btn`, `.burger`), **Hover label** (`data-tip`), **Primary button** (`.btn`), **Secondary button** (`.btn-outline`, `.btn-group`), **Tertiary button** (`.btn-outline--tertiary`), **Slide-down panel** (`.panel`, with `kit/panel.js`), **Menu** (`.menu-list`, `.acc`, `.submenu`), **Panel tabs** (`.panel-tabs`, `.panel-tab`), **"New" dot** (`.new-dot`, with `kit/new-dot.js`), **Field** (`.field`), **Select** (`.select-wrap`, `.select`), **Date and time** (`.field` on `type="date"`, `time`…), **File picker** (`.file-pick`, with `kit/file-pick.js`), **Switch** (`.choice`, `.switch`), **Radio** (`.choice-group`, `.radio`), **Filter buttons** (`.chip`), **Favorite star** (`.fav-btn`, with `kit/favorites.js`), **Page accordion** (`.page-acc`), **List row** (`.row`), **Bottom bar** (`.bottom-bar`, optional), **Jump to current** (`.jump-btn`, with `kit/jump.js`), **Scrolling title** (`.marquee`, with `kit/marquee.js`), **Dialog** (`.dialog` on `<dialog>`, with `kit/dialog.js`), **Toast** (`.toast`), **Drawer** (`.drawer`, with `kit/drawer.js`), **Scotch rule** (`.rule-scotch`, `.rule-thick`), **Fleuron rule** (`.rule-fleuron`), **Plate** (`.plate`), **Notice** (`.notice`), **Rosette** (`.rosette`), **Mark** (`.mark`), **Drop cap** (`.post-body--cap`), **Ending** (`.post-body--end`), **Icon actions** (`.icon-row`, `.icon-btn`, with `kit/icon-controls.js`), **Closing note** (`.closing-note`), **Dated list** (`.dated-list`), **Summary list** (`.summary-list`), **Output panel** (`.output`, with `kit/output.js`), **Code block** (`pre`, `.pre--bar`, `.pre-cmd`, `.pre-err`, `.tok-*`), **Ellipse** (`.ellipse`, `.ellipse--solid`), **Number circle** (`.num-circle`, `.num-circle--solid`, `.num-circle--accent`), **Activity indicators** (`.eq`, `.spinner`), **Image** (`.media`, `.figure`), **Hero** (`.hero`, `.hero--split`, `.hero--wide`), **Page title** (`.page-title`, `.page-title--bar`), **CTA** (`.cta`), **Card grid** (`.card-grid`, `.card`), **Post list** (`.post-list`), **Post feature** (`.post-feature`), **Pager** (`.pager`), **Post header** (`.post-header`, `.post-meta`), **Post body** (`.post-body`), **Post nav** (`.post-nav`), **Footer** (`.site-footer`, `.site-footer--bar`).
159
159
 
160
160
  ## With Tailwind v4
161
161
 
package/kit/verdigris.css CHANGED
@@ -40,7 +40,7 @@
40
40
  --size-display-split: clamp(4rem, 9.5vw, 9.5rem);
41
41
  --size-page-title: clamp(3.5rem, 9vw, 8rem);
42
42
  --size-post-feature: clamp(2.75rem, 5.5vw, 5.25rem);
43
- --size-post-title: clamp(3rem, 6vw, 5.5rem);
43
+ --size-post-title: clamp(3.5rem, 7.4vw, 5.75rem);
44
44
  --code-sample-size: var(--size-200); /* code on the Beautiful Code page: 20px, as --size-300 runs large here */
45
45
  --weight-body: 500;
46
46
  --weight-medium: 600;
@@ -105,6 +105,10 @@ body {
105
105
  .figure > figcaption, .post-body figcaption { font-style: italic; }
106
106
  /* Source Code Pro is far larger on its body than Cormorant, so code steps down to match. */
107
107
  code, kbd, samp { font-size: max(0.875rem, 0.8em); }
108
+ /* A code block steps down further than theme.css's 0.9375em, or it reads nearly as large as
109
+ the text around it: about 20px beside 26px text, as on the Beautiful Code page, never under
110
+ the 18px floor. */
111
+ pre { font-size: max(var(--size-100), 0.77em); }
108
112
  /* Numbers that line up need lining figures; old-style would wander. */
109
113
  .num, .chip-count, .panel-tab-num, .num-circle, .post-body ol { font-variant-numeric: lining-nums tabular-nums; }
110
114
 
@@ -161,6 +165,12 @@ code, kbd, samp { font-size: max(0.875rem, 0.8em); }
161
165
  .mark { flex: none; width: 1.625rem; height: 1.625rem; fill: none; stroke: currentColor; stroke-width: 1.25; stroke-linecap: round; stroke-linejoin: round; }
162
166
 
163
167
  /* ---------- Reading ---------- */
168
+ /* The site name in the top bar: the shared layout sets it at 16px, under this kit's 18px floor
169
+ for Cormorant. It takes the floor on phones, where it shares the row with three buttons, and
170
+ the bar's own 20px from 640px. */
171
+ .topbar-home { font-size: var(--size-100); }
172
+ @media (min-width: 640px) { .topbar-home { font-size: var(--size-200); } }
173
+
164
174
  /* The drop cap is ::first-letter, so the word stays whole for screen readers. */
165
175
  .post-body--cap > p:first-of-type::first-letter {
166
176
  float: left; padding: 0.5rem 0.75rem 0 0;
@@ -175,3 +185,55 @@ code, kbd, samp { font-size: max(0.875rem, 0.8em); }
175
185
  }
176
186
  .post-body hr { border-top: 0; height: auto; overflow: visible; text-align: center; }
177
187
  .post-body hr::before { content: "\2042"; color: var(--copper-text); font-size: 2.125rem; line-height: 1; }
188
+
189
+ /* A post is set on a centered axis, like a title page: the label in copper over the title,
190
+ the lead in italic, and the byline as one quiet line of values parted by lozenges. Its
191
+ labels (Published, By…) stay in the markup for screen readers. */
192
+ .post-header { display: flex; flex-direction: column; align-items: center; text-align: center; }
193
+ .post-header-label { margin-bottom: 1.25rem; font-size: var(--size-300); color: var(--copper-text); }
194
+ a.post-header-label:hover { color: var(--accent-text); }
195
+ /* An asterism each side of the label. Inline blocks, so the hover underline leaves them out. */
196
+ .post-header-label::before, .post-header-label::after {
197
+ content: "\2042" / ""; display: inline-block; color: var(--copper-text); text-decoration: none;
198
+ }
199
+ .post-header-label::before { margin-right: 0.5em; }
200
+ .post-header-label::after { margin-left: 0.5em; }
201
+ .post-header-title { line-height: 0.98; letter-spacing: -0.015em; }
202
+ .post-header-lead { max-width: 28em; margin-top: 1.25rem; font-size: clamp(1.625rem, 2.6vw, 2rem); line-height: 1.25; }
203
+ .post-meta {
204
+ justify-content: center; gap: 0.25rem 1rem;
205
+ margin-top: 1.25rem; padding-top: 0; border-top: 0; background-image: none;
206
+ font-size: var(--size-300); color: var(--muted);
207
+ }
208
+ .post-meta > div { display: flex; gap: 1rem; align-items: baseline; }
209
+ .post-meta > div + div::before { content: "\25C6" / ""; color: var(--copper-text); }
210
+ .post-meta dt { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; }
211
+ .post-meta dd { margin: 0; }
212
+
213
+ /* Body text a step up from the page's, at a 45rem measure. */
214
+ .post-body { max-width: 45rem; }
215
+ .post-body p { font-size: clamp(1.375rem, 2vw, 1.625rem); line-height: 1.52; }
216
+ .post-body blockquote p { font-size: inherit; line-height: inherit; }
217
+
218
+ /* The end of a piece (.post-body--end): an asterism, then the notes, if any, under a rule. */
219
+ .post-body--end::after, .post-body--end .footnotes::before {
220
+ content: "\2042" / ""; display: block; margin-top: 2.5rem; text-align: center;
221
+ color: var(--copper-text); font-size: 2.125rem; line-height: 1;
222
+ }
223
+ .post-body--end:has(.footnotes)::after { content: none; }
224
+ .post-body .footnotes { margin: 0; font-size: var(--size-200); line-height: 1.4; color: var(--muted); }
225
+ .post-body .footnotes::before { margin-bottom: 2rem; }
226
+ .post-body .footnotes ol { margin: 0; padding: 0.75rem 0 0 0; border-top: 1px solid var(--ink); list-style: decimal inside; }
227
+ .post-body .footnotes li::marker { color: var(--copper-text); }
228
+ .post-body .footnotes p { display: inline; font-size: inherit; line-height: inherit; }
229
+ /* The number in the text is a superscript, so it can drop the underline; the way back sits in
230
+ the note's own text, so it keeps one. */
231
+ .post-body :is([data-footnote-ref], [data-footnote-backref]) { margin-left: 0.125rem; color: var(--accent-text); }
232
+ .post-body [data-footnote-ref] { text-decoration: none; }
233
+ .post-body :is([data-footnote-ref], [data-footnote-backref]):hover { color: var(--copper-text); }
234
+
235
+ /* The previous and next posts: copper labels over the titles, set in the reading weight. */
236
+ .post-nav { margin-top: 4.5rem; }
237
+ .post-nav a { padding-top: 1.25rem; }
238
+ .post-nav-label { font-size: var(--size-200); color: var(--copper-text); }
239
+ .post-nav-title { font-size: var(--size-500); font-weight: var(--weight-body); letter-spacing: 0; }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentic-design-kits/verdigris",
3
- "version": "2026.1113.0",
3
+ "version": "2026.1113.2",
4
4
  "description": "A design kit in Cormorant, copper green and engraved line work, for Astro and Tailwind v4 sites. Built on Swiss Minimal.",
5
5
  "license": "MIT",
6
6
  "author": "Danny Englander",
@@ -43,7 +43,7 @@
43
43
  "./*.js": "./kit/shared/*.ts"
44
44
  },
45
45
  "dependencies": {
46
- "@agentic-design-kits/swiss-minimal": "2026.1113.0"
46
+ "@agentic-design-kits/swiss-minimal": "2026.1113.2"
47
47
  },
48
48
  "peerDependencies": {
49
49
  "astro": ">=7.0.0",
package/tokens.json CHANGED
@@ -337,7 +337,7 @@
337
337
  },
338
338
  {
339
339
  "name": "size-post-title",
340
- "value": "clamp(3rem, 6vw, 5.5rem)",
340
+ "value": "clamp(3.5rem, 7.4vw, 5.75rem)",
341
341
  "usage": "Post header title, fluid."
342
342
  },
343
343
  {