@agentic-design-kits/verdigris 2026.1113.1 → 2026.1114.0
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 +8 -7
- package/DESIGN.md +44 -4
- package/fonts/Cormorant-Italic-VF.woff2 +0 -0
- package/fonts/Cormorant-VF.woff2 +0 -0
- package/kit/astro/Rosette.astro +6 -15
- package/kit/astro/font.ts +2 -2
- package/kit/astro/rosette.ts +20 -0
- package/kit/fonts.css +6 -33
- package/kit/verdigris.css +30 -20
- package/package.json +2 -2
- package/tokens.json +36 -44
- package/fonts/Cormorant-Light.woff2 +0 -0
- package/fonts/Cormorant-LightItalic.woff2 +0 -0
- package/fonts/Cormorant-Medium.woff2 +0 -0
- package/fonts/Cormorant-MediumItalic.woff2 +0 -0
- package/fonts/Cormorant-SemiBold.woff2 +0 -0
- package/fonts/Cormorant-SemiBoldItalic.woff2 +0 -0
package/COMPONENTS.md
CHANGED
|
@@ -289,6 +289,7 @@ A row of outlined buttons that narrows a list to one category. One choice at a t
|
|
|
289
289
|
- Announce the result in a polite live region outside the accordion: `<p class="sr-only" aria-live="polite">Showing 5 Writing items</p>`.
|
|
290
290
|
- With `FavoriteStar`, add a **Favorites** chip after All, its count in `<span class="chip-count" data-favorites-count>0</span>`. It filters like a category, using the starred ids. When it shows nothing, say how to add some in a `muted` line under the accordion.
|
|
291
291
|
- Listen for `filter:reset` and go back to All (`JumpToCurrent` sends it when the current item is filtered out).
|
|
292
|
+
- A chip that can't be chosen right now takes `disabled`: it fades to 60% and doesn't fill on hover. Say why near the row.
|
|
292
293
|
|
|
293
294
|
## FavoriteStar
|
|
294
295
|
|
|
@@ -741,7 +742,7 @@ A title banner in place of a hero, for pages that need a name but not an introdu
|
|
|
741
742
|
|
|
742
743
|
**Markup.** `<header class="page-title"><h1 class="page-title-text">All work</h1></header>`. Add `page-title--bar` to set it on a dark `bar` block with `bar-ink` text and an 8px `accent` rule along its bottom edge (plain `accent`, since it is a large shape; vermilion or verdigris with the site).
|
|
743
744
|
|
|
744
|
-
-
|
|
745
|
+
- Light (300), `clamp(3.5rem, 9vw, 8rem)`, line height 1.1 to give Cormorant's ascenders and descenders room: smaller than `display`, still the biggest thing on the page. A long word wraps instead of pushing the page sideways.
|
|
745
746
|
- Space like a hero's: `space-12` above, a little less below (more from 768px). No rule under it; the section below starts with its own 2px rule.
|
|
746
747
|
- The bar version spans the container, not the window, and keeps a margin above and below so it reads as a block on the page.
|
|
747
748
|
- One per page, and only on pages without a `Hero`.
|
|
@@ -833,7 +834,7 @@ In Astro, `<PostList posts={posts} />`, each a `Post` (`title`, `href`, `date`,
|
|
|
833
834
|
|
|
834
835
|
## PostFeature
|
|
835
836
|
|
|
836
|
-
One post at the top of a blog's index,
|
|
837
|
+
One post at the top of a blog's index, in one of two layouts. **Split**, like a split `Hero`: the text and a square image 50/50 from 768px, text first on phones. **Wide**: the text across the full width, then the image under it at 16:9. The `PostList` of the other posts follows it.
|
|
837
838
|
|
|
838
839
|
**Markup.**
|
|
839
840
|
|
|
@@ -850,15 +851,15 @@ One post at the top of a blog's index, set like a split `Hero`: the text and a s
|
|
|
850
851
|
</article>
|
|
851
852
|
```
|
|
852
853
|
|
|
853
|
-
In Astro, `<PostFeature post={post} image={art} alt="What it shows" />`, with the same `Post` as `PostList` and an imported image. `label` (default "Featured") and `action` (default "Read post") change the two short labels; `level="h1"` when nothing else on the page is the `h1`.
|
|
854
|
+
In Astro, `<PostFeature post={post} image={art} alt="What it shows" />`, with the same `Post` as `PostList` and an imported image. The image's shape picks the layout: wide for a landscape image, split for a square or portrait one. `layout="wide"` or `layout="split"` overrides it. `label` (default "Featured") and `action` (default "Read post") change the two short labels; `level="h1"` when nothing else on the page is the `h1`.
|
|
854
855
|
|
|
855
856
|
- It takes a hero's place and space: `space-12` above, more from 768px. A page with a `PostFeature` has no `Hero` or `PageTitle`; give it an `h1` (visually hidden is fine) naming the page.
|
|
856
857
|
- The label is small, bold and `accent-text`; the title is bold and tight at `clamp(2.5rem, 5.5vw, 5rem)`, and underlines (3px) on hover.
|
|
857
858
|
- The primary button is the page's one main action. Its name adds the post's title, so it says where it goes.
|
|
858
|
-
-
|
|
859
|
+
- Split crops the image square (`.media--1x1`); wide crops it 16:9 (`.media--16x9`) and adds `post-feature--wide` to the article, which also gives the summary a longer measure. Either way it loads eagerly, like a hero's. Give wide a landscape original and split a square or portrait one, so the crop takes little.
|
|
859
860
|
- Only one per page. Don't repeat the featured post in the list below it.
|
|
860
861
|
|
|
861
|
-
**Other media.** `image` and `alt` are optional. To show something other than a raster image, such as an SVG that follows the theme, leave them out and fill the `media` slot: `<PostFeature post={post}><svg slot="media" …></svg></PostFeature>`. Keep it square, and give it its own text alternative if it says anything.
|
|
862
|
+
**Other media.** `image` and `alt` are optional. To show something other than a raster image, such as an SVG that follows the theme, leave them out and fill the `media` slot: `<PostFeature post={post}><svg slot="media" …></svg></PostFeature>`. Keep it square, or 16:9 with `layout="wide"`, and give it its own text alternative if it says anything.
|
|
862
863
|
|
|
863
864
|
## Pager
|
|
864
865
|
|
|
@@ -986,9 +987,9 @@ One note a reader must not miss. The manicule is the font's, drawn in CSS, so it
|
|
|
986
987
|
|
|
987
988
|
## Rosette
|
|
988
989
|
|
|
989
|
-
Engraved line work in the two metals, for a page with no picture of its own. It follows the theme, and is `aria-hidden`. No text on it, and never a background. `<Rosette />` draws it at build time; `.rosette` sets its strokes
|
|
990
|
+
Engraved line work in the two metals, for a page with no picture of its own. It follows the theme, and is `aria-hidden`. No text on it, and never a background. `<Rosette />` draws it at build time; `.rosette` sets its strokes in `--rosette-verdigris` and `--rosette-copper`, a verdigris and a bright copper orange with their own light and dark values. `--rosette-line` is thicker in light than in dark, because dark lines on paper read thinner.
|
|
990
991
|
|
|
991
|
-
`<Rosette spin />` turns it once every
|
|
992
|
+
`<Rosette spin />` turns it once every 30 seconds and adds a switch, on by default, that stops it. Moving content needs a way to stop it (WCAG 2.2.2), so never remove the switch. With Reduce Motion it stays still and the switch is hidden. Use `spin` once a page at most.
|
|
992
993
|
|
|
993
994
|
For a wide crop, put it in a `.media` box with `.rosette-crop`: `<div class="media media--16x9 rosette-crop"><Rosette /></div>`.
|
|
994
995
|
|
package/DESIGN.md
CHANGED
|
@@ -12,7 +12,7 @@ Verdigris is a package, built for **Astro with Tailwind v4** (no React needed).
|
|
|
12
12
|
- `panel.js` (Swiss Minimal, imported as `@agentic-design-kits/verdigris/panel.js`): the slide-down panel's behavior, tabs included. Plain JavaScript, no dependencies, like the other scripts: `new-dot.js` (the "new" dot), `drawer.js` (the second, non-modal panel), `jump.js` (jump to the current item), `marquee.js` (a scrolling title), `file-pick.js` (the file picker), `output.js` (live output), `dialog.js` (fills in for the native dialog where a browser is behind), `favorites.js` (favorite stars) and `icon-controls.js` (icon buttons for rows built in the browser).
|
|
13
13
|
- The Astro components, imported as `@agentic-design-kits/verdigris/astro/Name.astro`. `BaseLayout`, `Mark` and `Rosette` are written here (`kit/astro/`); the rest are Swiss Minimal's, passed on by `kit/shared/`: BaseLayout, Hero, PageTitle, Mark, Rosette, PostList, PostFeature, Pager, PostHeader, PostNav, Footer, BottomBar, FilePicker, SummaryList, OutputPanel, Dialog, Ellipse, NumCircle, MenuButton, MenuPanel, MenuItems, ThemeToggle, Drawer, DrawerButton, FavoriteButton, FeaturesList, IconTemplates (needs `astro-icon`) and the types (`MenuItem`, `PanelTab`, `NewDot`, `Feature`, `Post`, `PostLink`). They use Tailwind utilities for layout and the kit classes for components.
|
|
14
14
|
- `kit/example.html`: a one-page demo using only `theme.css` and `verdigris.css`. Open it from the repository (it reads Swiss Minimal's `theme.css` from the `kit/` at the root) to see what "correct" looks like.
|
|
15
|
-
- `fonts/Cormorant
|
|
15
|
+
- `fonts/Cormorant-VF.woff2` and `fonts/Cormorant-Italic-VF.woff2` (variable, weights 300 to 700) and `fonts/Cormorant-LICENSE.txt`, SIL OFL 1.1. Keep the license beside the fonts. Source Code Pro, for code, comes with Swiss Minimal.
|
|
16
16
|
- `tokens.json`: the token values as data. If a value in `theme.css` ever differs, `tokens.json` wins.
|
|
17
17
|
|
|
18
18
|
Put this in `<head>` before first paint so a saved theme does not flash:
|
|
@@ -58,7 +58,7 @@ Light is the default. Dark keeps the same roles.
|
|
|
58
58
|
|
|
59
59
|
## Type
|
|
60
60
|
|
|
61
|
-
One family, `--font-sans` (Cormorant, falling back to Garamond, Iowan Old Style, Georgia). Code is the only exception: `code`, `pre`, `kbd` and `samp` use `--font-mono`, Source Code Pro at 400, scaled to 0.
|
|
61
|
+
One family, `--font-sans` (Cormorant, falling back to Garamond, Iowan Old Style, Georgia). Code is the only exception: `code`, `pre`, `kbd` and `samp` use `--font-mono`, Source Code Pro at 400, scaled to 0.72em (code blocks 0.7em) because it is far larger on its body than Cormorant.
|
|
62
62
|
|
|
63
63
|
| Style | Use |
|
|
64
64
|
| --- | --- |
|
|
@@ -69,7 +69,7 @@ One family, `--font-sans` (Cormorant, falling back to Garamond, Iowan Old Style,
|
|
|
69
69
|
| `body` | Body copy, 1.375rem then 1.625rem from 768px, 500, line height 1.55, Garamond forms on (`ss02`) |
|
|
70
70
|
| `small` | Meta, sublines, counts, 1.125rem |
|
|
71
71
|
| `label` | 1 to 2 words, sentence case, 600 |
|
|
72
|
-
| `code` | Code, file names, commands, keys: `--font-mono` at 0.
|
|
72
|
+
| `code` | Code, file names, commands, keys: `--font-mono` at 0.72em, never under 0.875rem; a code block at 0.7em, never under 18px |
|
|
73
73
|
|
|
74
74
|
- **18px is the floor.** Cormorant's x-height is 0.386 of its size against Overused Grotesk's 0.5, so 18px reads about as tall as 14px there. Code is the exception, as its x-height is large.
|
|
75
75
|
- **Weight follows size.** Light at display sizes, medium for reading, semibold for names. Never light under 1.75rem: the hairlines disappear.
|
|
@@ -78,6 +78,46 @@ One family, `--font-sans` (Cormorant, falling back to Garamond, Iowan Old Style,
|
|
|
78
78
|
- Every size, weight, body line height and label style is a token at the top of `theme.css`, set for Verdigris in `verdigris.css`. A new rule uses these tokens, never a raw value.
|
|
79
79
|
- Code is plain HTML, no class, as in Swiss Minimal; see CodeBlock in `COMPONENTS.md`. Monospace never goes beyond code.
|
|
80
80
|
|
|
81
|
+
### OpenType features
|
|
82
|
+
|
|
83
|
+
Cormorant has many optional glyphs. Verdigris already sets these: `kern`, `liga` and `ss02` (Garamond forms) on body text, `dlig` on headings, old-style figures in text, and lining tabular figures in `.num`. The demo's Type and color page shows every feature off and on.
|
|
84
|
+
|
|
85
|
+
| Feature | What it changes | Use |
|
|
86
|
+
| --- | --- | --- |
|
|
87
|
+
| `dlig` | Joins c t, s t, s p, r t, t t, f u, Q y | Display sizes only; already on in headings |
|
|
88
|
+
| `hlig` | Joins ſ t and t z | Display sizes only |
|
|
89
|
+
| `liga` | Joins f with i, l, f | Leave on (the default) |
|
|
90
|
+
| `ss01` | Calligraphic A B J K Q R U, and g | Display sizes only |
|
|
91
|
+
| `ss02` | Garamond forms: A C G R, a e g, 1 | Already on in body text |
|
|
92
|
+
| `ss03` | U W, single-storey a and g, w y | Site-wide in place of `ss02`, if chosen; the two both change a and g, so use one |
|
|
93
|
+
| `ss04` | Umlaut dots | Site-wide, for German text, if chosen |
|
|
94
|
+
| `ss13` | Accents on capitals | Site-wide, if chosen |
|
|
95
|
+
| `ss15` | Dagger | Upright only |
|
|
96
|
+
| `cv01`, `cv02` | Tail of a Q on its own (not before u) | Display sizes |
|
|
97
|
+
| `cv05` | f | Site-wide, if chosen |
|
|
98
|
+
| `cv06`, `cv07` | Long s (ſ) | Upright only, for old spellings |
|
|
99
|
+
| `case` | Brackets, dashes, colon and @ raised to sit with capitals; lining figures | Around acronyms: "(NASA)" |
|
|
100
|
+
| `onum` / `lnum` | Old-style or lining figures | Old-style is already the default in text; `.num` sets lining |
|
|
101
|
+
| `tnum` | Tabular figures | Through `.num` |
|
|
102
|
+
| `frac` | Fractions | On the fraction only |
|
|
103
|
+
| `zero` | A dot in the zero (Cormorant's form of the slashed zero) | Where 0 and O could be confused |
|
|
104
|
+
| `ordn` | Raised a and o after a figure; No. becomes № | Where the text calls for it |
|
|
105
|
+
| `sups`, `subs` | Superscript, subscript figures | On the figures only |
|
|
106
|
+
| `cv03`, `cv04`, `ss07`, `ss08` | Italic only: two more Q tails, another a, the long-tailed Q before u | In italic, at display sizes |
|
|
107
|
+
|
|
108
|
+
- **Choose alternates once.** Set a site's alternate letters on `body`, or on the heading styles, so a letter has one shape everywhere. Don't switch them word by word.
|
|
109
|
+
- **Prefer `font-variant-*`** where it exists: `font-variant-ligatures` (`discretionary-ligatures`, `historical-ligatures`), `font-variant-numeric` (`oldstyle-nums`, `lining-nums`, `tabular-nums`, `diagonal-fractions`, `slashed-zero`, `ordinal`) and `font-variant-position` (`super`, `sub`). These combine on their own. Stylistic sets, character variants and `case` have no such property, so they need `font-feature-settings`.
|
|
110
|
+
- **`font-feature-settings` replaces, it doesn't add.** Setting it on an element drops every feature it inherited, including Verdigris's `ss02` on body text and `dlig` on headings. To let features stack, give each its own custom property, keep the kit's own in the list, and set only the one that changes:
|
|
111
|
+
|
|
112
|
+
```css
|
|
113
|
+
body { font-feature-settings: "kern", "liga", var(--ff-ss02, "ss02" 1), var(--ff-ss04, "ss04" 0), var(--ff-zero, "zero" 0); }
|
|
114
|
+
.codes { --ff-zero: "zero" 1; }
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
- **Ligatures stay in display text.** A ligature can confuse a screen reader, and copy and paste, when it stands for more than one letter.
|
|
118
|
+
- **The italic has fewer.** It has no `ss15`, `cv06` or `cv07`, and adds `cv03`, `cv04`, `ss07` and `ss08` of its own.
|
|
119
|
+
- **Never used:** `smcp`, `c2sc` and `ss05` (small caps, all small caps, unicase), as Verdigris has no capitals. `ss06` and `ss12` change only small caps. `ss09`, `ss10` and `ss14` change Cyrillic only.
|
|
120
|
+
|
|
81
121
|
## Layout
|
|
82
122
|
|
|
83
123
|
- Content width `page-max` (88rem), centered in `.page`, with `gutter` side padding (1rem, 2rem from 640px).
|
|
@@ -94,7 +134,7 @@ One family, `--font-sans` (Cormorant, falling back to Garamond, Iowan Old Style,
|
|
|
94
134
|
|
|
95
135
|
## Iconography
|
|
96
136
|
|
|
97
|
-
- **Glyphs come first.** Use the font's own: ❦ ⁂ † ‡ § ☞ ◆ and the arrows. CSS draws the menu bars and the plus and minus.
|
|
137
|
+
- **Glyphs come first.** Use the font's own: ❦ ⁂ † ‡ § ☞ ☜ ◆ ◇ ◊ and the arrows. The demo's Type and color page shows every ornament, arrow, shape and sign Cormorant has. A glyph that acts as a control needs an `aria-label`, as screen readers read glyphs by their Unicode names. CSS draws the menu bars and the plus and minus.
|
|
98
138
|
- **Marks are the icon set.** `Mark.astro` holds twelve drawn icons (menu, search, next, open, close, journal, write, letter, save, leaf, date, place): 24px grid, 1.25px line, round ends. Add new ones in the same pen.
|
|
99
139
|
- **A mark may stand beside its label,** which Swiss Minimal did not allow. It should add recognition, not repeat a whole row of the same picture.
|
|
100
140
|
- Third-party brand marks (YouTube, Spotify) still use Simple Icons, and a few actions Material Symbols, through `astro-icon`.
|
|
Binary file
|
|
Binary file
|
package/kit/astro/Rosette.astro
CHANGED
|
@@ -1,17 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
// The engraved rosette (see Ornament in DESIGN.md): line work in the two metals, for a page with
|
|
3
3
|
// no picture of its own. Drawn at build time, so it follows the theme. Decorative: aria-hidden.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
for (let i = 0; i < points; i += 1) {
|
|
7
|
-
const angle = (2 * Math.PI * i) / points;
|
|
8
|
-
const r = radius + depth * Math.sin(waves * angle + phase);
|
|
9
|
-
at.push(`${(300 + r * Math.cos(angle)).toFixed(1)} ${(300 + r * Math.sin(angle)).toFixed(1)}`);
|
|
10
|
-
}
|
|
11
|
-
return `M${at.join('L')}Z`;
|
|
12
|
-
}
|
|
13
|
-
const band = (curves: number, radius: number, depth: number, waves: number, points: number) =>
|
|
14
|
-
Array.from({ length: curves }, (_, i) => wave(radius, depth, waves, (2 * Math.PI * i) / curves, points)).join('');
|
|
4
|
+
import { rosettePaths } from './rosette.ts';
|
|
5
|
+
|
|
15
6
|
interface Props {
|
|
16
7
|
class?: string;
|
|
17
8
|
spin?: boolean; // Turns slowly, with a switch to stop it (WCAG 2.2.2). Never with Reduce Motion.
|
|
@@ -22,10 +13,10 @@ const { class: className, spin = false } = Astro.props;
|
|
|
22
13
|
<div class:list={['rosette', { 'rosette--spin': spin }, className]}>
|
|
23
14
|
<div class="rosette-disc">
|
|
24
15
|
<svg viewBox="0 0 600 600" aria-hidden="true">
|
|
25
|
-
<path class="rosette-outer" d={
|
|
26
|
-
<path class="rosette-inner" d={
|
|
27
|
-
<path class="rosette-core" d={
|
|
16
|
+
<path class="rosette-outer" d={rosettePaths.outer}></path>
|
|
17
|
+
<path class="rosette-inner" d={rosettePaths.inner}></path>
|
|
18
|
+
<path class="rosette-core" d={rosettePaths.core}></path>
|
|
28
19
|
</svg>
|
|
29
20
|
</div>
|
|
30
|
-
{spin && <label class="choice rosette-switch"><input class="switch" type="checkbox" role="switch" checked /> Turn the rosette
|
|
21
|
+
{spin && <label class="choice rosette-switch"><input class="switch" type="checkbox" role="switch" checked /> Turn the rosette</label>}
|
|
31
22
|
</div>
|
package/kit/astro/font.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
// The one font BaseLayout preloads: the
|
|
2
|
-
export { default } from '../../fonts/Cormorant-
|
|
1
|
+
// The one font BaseLayout preloads: the upright variable file, which has every weight. Belongs to Verdigris, not Swiss Minimal.
|
|
2
|
+
export { default } from '../../fonts/Cormorant-VF.woff2?url';
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// The rosette's geometry: three bands of wavy rings in a 600-unit square. Rosette.astro draws it
|
|
2
|
+
// in the page; demo/scripts/hero-image.ts draws the same paths into a picture.
|
|
3
|
+
function wave(radius: number, depth: number, waves: number, phase: number, points: number) {
|
|
4
|
+
const at: string[] = [];
|
|
5
|
+
for (let i = 0; i < points; i += 1) {
|
|
6
|
+
const angle = (2 * Math.PI * i) / points;
|
|
7
|
+
const r = radius + depth * Math.sin(waves * angle + phase);
|
|
8
|
+
at.push(`${(300 + r * Math.cos(angle)).toFixed(1)} ${(300 + r * Math.sin(angle)).toFixed(1)}`);
|
|
9
|
+
}
|
|
10
|
+
return `M${at.join('L')}Z`;
|
|
11
|
+
}
|
|
12
|
+
const band = (curves: number, radius: number, depth: number, waves: number, points: number) =>
|
|
13
|
+
Array.from({ length: curves }, (_, i) => wave(radius, depth, waves, (2 * Math.PI * i) / curves, points)).join('');
|
|
14
|
+
|
|
15
|
+
/** The path data for each band: the outer ring and the core in verdigris, the inner ring in copper. */
|
|
16
|
+
export const rosettePaths = {
|
|
17
|
+
outer: band(12, 262, 24, 18, 216),
|
|
18
|
+
inner: band(12, 150, 46, 9, 126),
|
|
19
|
+
core: band(8, 52, 20, 6, 72),
|
|
20
|
+
};
|
package/kit/fonts.css
CHANGED
|
@@ -1,46 +1,19 @@
|
|
|
1
1
|
/* Verdigris's typeface. tailwind.css loads this after Swiss Minimal's theme.css, so its
|
|
2
2
|
--font-sans wins. The fonts live in ../fonts (SIL OFL 1.1, keep Cormorant-LICENSE.txt beside
|
|
3
|
-
them)
|
|
3
|
+
them): one variable file for upright and one for italic, each covering weights 300 to 700.
|
|
4
|
+
Source Code Pro, for code, comes with Swiss Minimal. */
|
|
4
5
|
|
|
5
6
|
@font-face {
|
|
6
7
|
font-family: "Cormorant";
|
|
7
|
-
src: url("../fonts/Cormorant-
|
|
8
|
-
font-weight: 300;
|
|
8
|
+
src: url("../fonts/Cormorant-VF.woff2") format("woff2");
|
|
9
|
+
font-weight: 300 700;
|
|
9
10
|
font-style: normal;
|
|
10
11
|
font-display: swap;
|
|
11
12
|
}
|
|
12
13
|
@font-face {
|
|
13
14
|
font-family: "Cormorant";
|
|
14
|
-
src: url("../fonts/Cormorant-
|
|
15
|
-
font-weight: 300;
|
|
16
|
-
font-style: italic;
|
|
17
|
-
font-display: swap;
|
|
18
|
-
}
|
|
19
|
-
@font-face {
|
|
20
|
-
font-family: "Cormorant";
|
|
21
|
-
src: url("../fonts/Cormorant-Medium.woff2") format("woff2");
|
|
22
|
-
font-weight: 500;
|
|
23
|
-
font-style: normal;
|
|
24
|
-
font-display: swap;
|
|
25
|
-
}
|
|
26
|
-
@font-face {
|
|
27
|
-
font-family: "Cormorant";
|
|
28
|
-
src: url("../fonts/Cormorant-MediumItalic.woff2") format("woff2");
|
|
29
|
-
font-weight: 500;
|
|
30
|
-
font-style: italic;
|
|
31
|
-
font-display: swap;
|
|
32
|
-
}
|
|
33
|
-
@font-face {
|
|
34
|
-
font-family: "Cormorant";
|
|
35
|
-
src: url("../fonts/Cormorant-SemiBold.woff2") format("woff2");
|
|
36
|
-
font-weight: 600;
|
|
37
|
-
font-style: normal;
|
|
38
|
-
font-display: swap;
|
|
39
|
-
}
|
|
40
|
-
@font-face {
|
|
41
|
-
font-family: "Cormorant";
|
|
42
|
-
src: url("../fonts/Cormorant-SemiBoldItalic.woff2") format("woff2");
|
|
43
|
-
font-weight: 600;
|
|
15
|
+
src: url("../fonts/Cormorant-Italic-VF.woff2") format("woff2");
|
|
16
|
+
font-weight: 300 700;
|
|
44
17
|
font-style: italic;
|
|
45
18
|
font-display: swap;
|
|
46
19
|
}
|
package/kit/verdigris.css
CHANGED
|
@@ -11,16 +11,18 @@
|
|
|
11
11
|
--ink: #10201f; /* text and rules, a green-black (14.4:1) */
|
|
12
12
|
--muted: #566460; /* secondary text (5.3:1) */
|
|
13
13
|
--rule: #c9c5b4; /* thin row dividers, decorative */
|
|
14
|
-
--accent: #
|
|
14
|
+
--accent: #328f6c; /* verdigris: large shapes and the focus ring only (3.4:1) */
|
|
15
15
|
--accent-ink: #ffffff; /* text on a verdigris fill (6.3:1) */
|
|
16
|
-
--accent-text: #
|
|
17
|
-
--accent-bright: #
|
|
16
|
+
--accent-text: #256a50; /* small verdigris text (5.5:1) */
|
|
17
|
+
--accent-bright: #51c297;/* small verdigris text on bar (6.9:1) */
|
|
18
18
|
--copper: #b0612f; /* large ornament only (3.9:1) */
|
|
19
|
-
--copper-text: #
|
|
20
|
-
--copper-bright: #
|
|
19
|
+
--copper-text: #8f4c1e; /* small ornament and labels (5.6:1) */
|
|
20
|
+
--copper-bright: #db8b54;/* ornament and labels on bar (5.7:1) */
|
|
21
21
|
--bar: #0e2a29; /* dark surfaces stay dark in both themes */
|
|
22
22
|
--bar-ink: #f2ede1; /* text on bar (13:1) */
|
|
23
23
|
--rosette-line: 0.9; /* dark lines on paper read thinner than light lines on dark */
|
|
24
|
+
--rosette-verdigris: #016a41; /* the rosette's outer ring and core; decorative, so no contrast floor */
|
|
25
|
+
--rosette-copper: #f75b00; /* the rosette's inner ring */
|
|
24
26
|
--row-hover-bg: var(--bar);
|
|
25
27
|
--row-active-bg: var(--bar);
|
|
26
28
|
--row-fg: var(--bar-ink);
|
|
@@ -41,7 +43,7 @@
|
|
|
41
43
|
--size-page-title: clamp(3.5rem, 9vw, 8rem);
|
|
42
44
|
--size-post-feature: clamp(2.75rem, 5.5vw, 5.25rem);
|
|
43
45
|
--size-post-title: clamp(3.5rem, 7.4vw, 5.75rem);
|
|
44
|
-
--code-sample-size: var(--size-
|
|
46
|
+
--code-sample-size: var(--size-100); /* code on the Beautiful Code page: 18px, as larger sizes run large here */
|
|
45
47
|
--weight-body: 500;
|
|
46
48
|
--weight-medium: 600;
|
|
47
49
|
--weight-strong: 600;
|
|
@@ -58,15 +60,18 @@
|
|
|
58
60
|
--ink: #ece6d8;
|
|
59
61
|
--muted: #a6b5b0;
|
|
60
62
|
--rule: #3a4a47;
|
|
61
|
-
--accent: #
|
|
63
|
+
--accent: #51c297;
|
|
62
64
|
--accent-ink: #0b1716;
|
|
63
|
-
--accent-text: #
|
|
64
|
-
--accent-bright: #
|
|
65
|
+
--accent-text: #51c297;
|
|
66
|
+
--accent-bright: #51c297;
|
|
65
67
|
--copper: #e39a68;
|
|
66
|
-
--copper-text: #
|
|
68
|
+
--copper-text: #db8b54;
|
|
69
|
+
--copper-bright: #db8b54;
|
|
67
70
|
--bar: #132c2a;
|
|
68
71
|
--bar-ink: #ece6d8;
|
|
69
72
|
--rosette-line: 0.6;
|
|
73
|
+
--rosette-verdigris: #43f6b3;
|
|
74
|
+
--rosette-copper: #f15900;
|
|
70
75
|
--row-hover-bg: #132c2a;
|
|
71
76
|
--row-active-bg: var(--bar);
|
|
72
77
|
--row-fg: var(--ink);
|
|
@@ -78,15 +83,18 @@
|
|
|
78
83
|
--ink: #ece6d8;
|
|
79
84
|
--muted: #a6b5b0;
|
|
80
85
|
--rule: #3a4a47;
|
|
81
|
-
--accent: #
|
|
86
|
+
--accent: #51c297;
|
|
82
87
|
--accent-ink: #0b1716;
|
|
83
|
-
--accent-text: #
|
|
84
|
-
--accent-bright: #
|
|
88
|
+
--accent-text: #51c297;
|
|
89
|
+
--accent-bright: #51c297;
|
|
85
90
|
--copper: #e39a68;
|
|
86
|
-
--copper-text: #
|
|
91
|
+
--copper-text: #db8b54;
|
|
92
|
+
--copper-bright: #db8b54;
|
|
87
93
|
--bar: #132c2a;
|
|
88
94
|
--bar-ink: #ece6d8;
|
|
89
95
|
--rosette-line: 0.6;
|
|
96
|
+
--rosette-verdigris: #43f6b3;
|
|
97
|
+
--rosette-copper: #f15900;
|
|
90
98
|
--row-hover-bg: #132c2a;
|
|
91
99
|
--row-active-bg: var(--bar);
|
|
92
100
|
--row-fg: var(--ink);
|
|
@@ -101,14 +109,16 @@ body {
|
|
|
101
109
|
.display, .h2, .page-title-text, .post-feature-title, .post-header-title {
|
|
102
110
|
font-feature-settings: "kern", "liga", "dlig";
|
|
103
111
|
}
|
|
112
|
+
/* Cormorant's tall ascenders and descenders need more room than Swiss Minimal's tight 0.9. */
|
|
113
|
+
.page-title-text { line-height: 1.1; }
|
|
104
114
|
.lead { font-style: italic; font-weight: 300; line-height: 1.22; }
|
|
105
115
|
.figure > figcaption, .post-body figcaption { font-style: italic; }
|
|
106
116
|
/* Source Code Pro is far larger on its body than Cormorant, so code steps down to match. */
|
|
107
|
-
code, kbd, samp { font-size: max(0.875rem, 0.
|
|
117
|
+
code, kbd, samp { font-size: max(0.875rem, 0.72em); }
|
|
108
118
|
/* 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
|
|
119
|
+
the text around it: about 18px beside 26px text, as on the Beautiful Code page, never under
|
|
110
120
|
the 18px floor. */
|
|
111
|
-
pre { font-size: max(var(--size-100), 0.
|
|
121
|
+
pre { font-size: max(var(--size-100), 0.7em); }
|
|
112
122
|
/* Numbers that line up need lining figures; old-style would wander. */
|
|
113
123
|
.num, .chip-count, .panel-tab-num, .num-circle, .post-body ol { font-variant-numeric: lining-nums tabular-nums; }
|
|
114
124
|
|
|
@@ -145,13 +155,13 @@ pre { font-size: max(var(--size-100), 0.77em); }
|
|
|
145
155
|
.rosette { fill: none; stroke-width: var(--rosette-line); }
|
|
146
156
|
.rosette svg { display: block; width: 100%; height: auto; }
|
|
147
157
|
.rosette-disc { overflow: hidden; } /* the square's corners swing wider than the page on a phone */
|
|
148
|
-
.rosette-outer, .rosette-core { stroke: var(--
|
|
149
|
-
.rosette-inner { stroke: var(--copper
|
|
158
|
+
.rosette-outer, .rosette-core { stroke: var(--rosette-verdigris); }
|
|
159
|
+
.rosette-inner { stroke: var(--rosette-copper); }
|
|
150
160
|
/* Under no-preference, so Reduce Motion never starts it. The switch is hidden there too. */
|
|
151
161
|
.rosette-switch { display: none; }
|
|
152
162
|
@media (prefers-reduced-motion: no-preference) {
|
|
153
163
|
.rosette--spin .rosette-switch { display: inline-flex; margin-top: 0.5rem; }
|
|
154
|
-
.rosette--spin svg { animation: rosette-turn
|
|
164
|
+
.rosette--spin svg { animation: rosette-turn 30s linear infinite; will-change: transform; }
|
|
155
165
|
.rosette--spin:has(.switch:not(:checked)) svg { animation-play-state: paused; }
|
|
156
166
|
}
|
|
157
167
|
@keyframes rosette-turn { to { transform: rotate(360deg); } }
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentic-design-kits/verdigris",
|
|
3
|
-
"version": "2026.
|
|
3
|
+
"version": "2026.1114.0",
|
|
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.
|
|
46
|
+
"@agentic-design-kits/swiss-minimal": "2026.1114.0"
|
|
47
47
|
},
|
|
48
48
|
"peerDependencies": {
|
|
49
49
|
"astro": ">=7.0.0",
|
package/tokens.json
CHANGED
|
@@ -48,10 +48,10 @@
|
|
|
48
48
|
{
|
|
49
49
|
"name": "accent",
|
|
50
50
|
"value": {
|
|
51
|
-
"light": "#
|
|
52
|
-
"dark": "#
|
|
51
|
+
"light": "#328f6c",
|
|
52
|
+
"dark": "#51c297"
|
|
53
53
|
},
|
|
54
|
-
"usage": "Verdigris for LARGE shapes only, and the 3px focus ring (3.4:1 on light `paper`,
|
|
54
|
+
"usage": "Verdigris for LARGE shapes only, and the 3px focus ring (3.4:1 on light `paper`, 8.3:1 dark). Never small text."
|
|
55
55
|
},
|
|
56
56
|
{
|
|
57
57
|
"name": "accent-ink",
|
|
@@ -59,23 +59,23 @@
|
|
|
59
59
|
"light": "#ffffff",
|
|
60
60
|
"dark": "#0b1716"
|
|
61
61
|
},
|
|
62
|
-
"usage": "Text on a verdigris fill: 6.
|
|
62
|
+
"usage": "Text on a verdigris fill: 6.5:1 on light `accent-text`, 8.3:1 dark."
|
|
63
63
|
},
|
|
64
64
|
{
|
|
65
65
|
"name": "accent-text",
|
|
66
66
|
"value": {
|
|
67
|
-
"light": "#
|
|
68
|
-
"dark": "#
|
|
67
|
+
"light": "#256a50",
|
|
68
|
+
"dark": "#51c297"
|
|
69
69
|
},
|
|
70
|
-
"usage": "Verdigris for small text on `paper` (5.
|
|
70
|
+
"usage": "Verdigris for small text on `paper` (5.5:1 light, 8.3:1 dark) and the fill of the primary button."
|
|
71
71
|
},
|
|
72
72
|
{
|
|
73
73
|
"name": "accent-bright",
|
|
74
74
|
"value": {
|
|
75
|
-
"light": "#
|
|
76
|
-
"dark": "#
|
|
75
|
+
"light": "#51c297",
|
|
76
|
+
"dark": "#51c297"
|
|
77
77
|
},
|
|
78
|
-
"usage": "Verdigris for small text and marks on `bar` (
|
|
78
|
+
"usage": "Verdigris for small text and marks on `bar` (6.9:1 light, 6.7:1 dark)."
|
|
79
79
|
},
|
|
80
80
|
{
|
|
81
81
|
"name": "copper",
|
|
@@ -88,18 +88,18 @@
|
|
|
88
88
|
{
|
|
89
89
|
"name": "copper-text",
|
|
90
90
|
"value": {
|
|
91
|
-
"light": "#
|
|
92
|
-
"dark": "#
|
|
91
|
+
"light": "#8f4c1e",
|
|
92
|
+
"dark": "#db8b54"
|
|
93
93
|
},
|
|
94
|
-
"usage": "Copper for labels and small ornament on `paper` (5.
|
|
94
|
+
"usage": "Copper for labels and small ornament on `paper` (5.6:1 light, 6.8:1 dark). Never marks an action."
|
|
95
95
|
},
|
|
96
96
|
{
|
|
97
97
|
"name": "copper-bright",
|
|
98
98
|
"value": {
|
|
99
|
-
"light": "#
|
|
100
|
-
"dark": "#
|
|
99
|
+
"light": "#db8b54",
|
|
100
|
+
"dark": "#db8b54"
|
|
101
101
|
},
|
|
102
|
-
"usage": "Copper on `bar` (
|
|
102
|
+
"usage": "Copper on `bar` (5.7:1 light, 5.5:1 dark)."
|
|
103
103
|
},
|
|
104
104
|
{
|
|
105
105
|
"name": "bar",
|
|
@@ -219,38 +219,14 @@
|
|
|
219
219
|
"fonts": [
|
|
220
220
|
{
|
|
221
221
|
"family": "Cormorant",
|
|
222
|
-
"file": "fonts/Cormorant-
|
|
223
|
-
"weight": "300",
|
|
224
|
-
"style": "normal"
|
|
225
|
-
},
|
|
226
|
-
{
|
|
227
|
-
"family": "Cormorant",
|
|
228
|
-
"file": "fonts/Cormorant-LightItalic.woff2",
|
|
229
|
-
"weight": "300",
|
|
230
|
-
"style": "italic"
|
|
231
|
-
},
|
|
232
|
-
{
|
|
233
|
-
"family": "Cormorant",
|
|
234
|
-
"file": "fonts/Cormorant-Medium.woff2",
|
|
235
|
-
"weight": "500",
|
|
236
|
-
"style": "normal"
|
|
237
|
-
},
|
|
238
|
-
{
|
|
239
|
-
"family": "Cormorant",
|
|
240
|
-
"file": "fonts/Cormorant-MediumItalic.woff2",
|
|
241
|
-
"weight": "500",
|
|
242
|
-
"style": "italic"
|
|
243
|
-
},
|
|
244
|
-
{
|
|
245
|
-
"family": "Cormorant",
|
|
246
|
-
"file": "fonts/Cormorant-SemiBold.woff2",
|
|
247
|
-
"weight": "600",
|
|
222
|
+
"file": "fonts/Cormorant-VF.woff2",
|
|
223
|
+
"weight": "300 700",
|
|
248
224
|
"style": "normal"
|
|
249
225
|
},
|
|
250
226
|
{
|
|
251
227
|
"family": "Cormorant",
|
|
252
|
-
"file": "fonts/Cormorant-
|
|
253
|
-
"weight": "
|
|
228
|
+
"file": "fonts/Cormorant-Italic-VF.woff2",
|
|
229
|
+
"weight": "300 700",
|
|
254
230
|
"style": "italic"
|
|
255
231
|
},
|
|
256
232
|
{
|
|
@@ -609,6 +585,22 @@
|
|
|
609
585
|
"dark": "0.6"
|
|
610
586
|
},
|
|
611
587
|
"usage": "Stroke width of the rosette, in its 600-unit drawing. Dark lines on paper read thinner than light lines on a dark ground."
|
|
588
|
+
},
|
|
589
|
+
{
|
|
590
|
+
"name": "rosette-verdigris",
|
|
591
|
+
"value": {
|
|
592
|
+
"light": "#016a41",
|
|
593
|
+
"dark": "#43f6b3"
|
|
594
|
+
},
|
|
595
|
+
"usage": "The rosette's outer ring and core. The rosette is decorative and aria-hidden, so its colors have no contrast floor."
|
|
596
|
+
},
|
|
597
|
+
{
|
|
598
|
+
"name": "rosette-copper",
|
|
599
|
+
"value": {
|
|
600
|
+
"light": "#f75b00",
|
|
601
|
+
"dark": "#f15900"
|
|
602
|
+
},
|
|
603
|
+
"usage": "The rosette's inner ring, a bright copper orange."
|
|
612
604
|
}
|
|
613
605
|
]
|
|
614
606
|
},
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|