@agentic-design-kits/verdigris 0.0.0-stage → 2026.1113.1

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.
Files changed (58) hide show
  1. package/COMPONENTS.md +1001 -0
  2. package/DESIGN.md +225 -0
  3. package/LICENSE +21 -0
  4. package/README.md +73 -2
  5. package/fonts/Cormorant-LICENSE.txt +93 -0
  6. package/fonts/Cormorant-Light.woff2 +0 -0
  7. package/fonts/Cormorant-LightItalic.woff2 +0 -0
  8. package/fonts/Cormorant-Medium.woff2 +0 -0
  9. package/fonts/Cormorant-MediumItalic.woff2 +0 -0
  10. package/fonts/Cormorant-SemiBold.woff2 +0 -0
  11. package/fonts/Cormorant-SemiBoldItalic.woff2 +0 -0
  12. package/kit/astro/BaseLayout.astro +31 -0
  13. package/kit/astro/Mark.astro +25 -0
  14. package/kit/astro/Rosette.astro +31 -0
  15. package/kit/astro/font.ts +2 -0
  16. package/kit/example.html +186 -0
  17. package/kit/fonts.css +50 -0
  18. package/kit/shared/astro/BottomBar.ts +2 -0
  19. package/kit/shared/astro/CardGrid.ts +2 -0
  20. package/kit/shared/astro/Cta.ts +2 -0
  21. package/kit/shared/astro/Dialog.ts +2 -0
  22. package/kit/shared/astro/Drawer.ts +2 -0
  23. package/kit/shared/astro/DrawerButton.ts +2 -0
  24. package/kit/shared/astro/Ellipse.ts +2 -0
  25. package/kit/shared/astro/FavoriteButton.ts +2 -0
  26. package/kit/shared/astro/FeaturesList.ts +2 -0
  27. package/kit/shared/astro/FilePicker.ts +2 -0
  28. package/kit/shared/astro/Footer.ts +2 -0
  29. package/kit/shared/astro/Hero.ts +2 -0
  30. package/kit/shared/astro/IconTemplates.ts +2 -0
  31. package/kit/shared/astro/MenuButton.ts +2 -0
  32. package/kit/shared/astro/MenuItems.ts +2 -0
  33. package/kit/shared/astro/MenuPanel.ts +2 -0
  34. package/kit/shared/astro/NumCircle.ts +2 -0
  35. package/kit/shared/astro/OutputPanel.ts +2 -0
  36. package/kit/shared/astro/PageTitle.ts +2 -0
  37. package/kit/shared/astro/Pager.ts +2 -0
  38. package/kit/shared/astro/PostFeature.ts +2 -0
  39. package/kit/shared/astro/PostHeader.ts +2 -0
  40. package/kit/shared/astro/PostList.ts +2 -0
  41. package/kit/shared/astro/PostNav.ts +2 -0
  42. package/kit/shared/astro/SummaryList.ts +2 -0
  43. package/kit/shared/astro/ThemeToggle.ts +2 -0
  44. package/kit/shared/dialog.ts +2 -0
  45. package/kit/shared/drawer.ts +2 -0
  46. package/kit/shared/favorites.ts +2 -0
  47. package/kit/shared/file-pick.ts +2 -0
  48. package/kit/shared/icon-controls.ts +2 -0
  49. package/kit/shared/jump.ts +2 -0
  50. package/kit/shared/marquee.ts +2 -0
  51. package/kit/shared/new-dot.ts +2 -0
  52. package/kit/shared/output.ts +2 -0
  53. package/kit/shared/panel.ts +2 -0
  54. package/kit/tailwind.css +24 -0
  55. package/kit/types.ts +3 -0
  56. package/kit/verdigris.css +239 -0
  57. package/package.json +62 -4
  58. package/tokens.json +618 -0
@@ -0,0 +1,239 @@
1
+ /* Verdigris: the theme on top of Swiss Minimal's theme.css. tailwind.css loads it right after
2
+ theme.css; a plain page links it after theme.css. Everything that makes this kit Verdigris and
3
+ not Swiss Minimal is here or in fonts.css, so theme.css can keep merging from upstream
4
+ untouched. Read DESIGN.md for the rules. tokens.json wins if the two drift. */
5
+
6
+ /* ---------- Tokens ---------- */
7
+ /* The [data-accent] selectors let these beat theme.css's accent blocks. Verdigris has one
8
+ palette, so the attribute changes nothing. */
9
+ :root, :root[data-accent] {
10
+ --paper: #f2ede1; /* page background */
11
+ --ink: #10201f; /* text and rules, a green-black (14.4:1) */
12
+ --muted: #566460; /* secondary text (5.3:1) */
13
+ --rule: #c9c5b4; /* thin row dividers, decorative */
14
+ --accent: #0f8f8c; /* verdigris: large shapes and the focus ring only (3.4:1) */
15
+ --accent-ink: #ffffff; /* text on a verdigris fill (6.3:1) */
16
+ --accent-text: #0b6b69; /* small verdigris text (5.4:1) */
17
+ --accent-bright: #5fd4cc;/* small verdigris text on bar (8.5:1) */
18
+ --copper: #b0612f; /* large ornament only (3.9:1) */
19
+ --copper-text: #8f4a22; /* small ornament and labels (5.7:1) */
20
+ --copper-bright: #e39a68;/* ornament and labels on bar (6.6:1) */
21
+ --bar: #0e2a29; /* dark surfaces stay dark in both themes */
22
+ --bar-ink: #f2ede1; /* text on bar (13:1) */
23
+ --rosette-line: 0.9; /* dark lines on paper read thinner than light lines on dark */
24
+ --row-hover-bg: var(--bar);
25
+ --row-active-bg: var(--bar);
26
+ --row-fg: var(--bar-ink);
27
+ --row-edge: var(--copper-bright);
28
+
29
+ --size-100: 1.125rem; /* the floor is 18px: Cormorant's small x-height reads like 14px in a grotesque */
30
+ --size-200: 1.25rem;
31
+ --size-300: 1.375rem;
32
+ --size-400: 1.625rem;
33
+ --size-500: 1.75rem;
34
+ --size-600: 1.875rem;
35
+ --size-700: 2.125rem;
36
+ --size-800: 2.5rem;
37
+ --size-900: 2.75rem;
38
+ --size-1000: 3.75rem;
39
+ --size-display: clamp(4.75rem, 12.4vw, 11rem);
40
+ --size-display-split: clamp(4rem, 9.5vw, 9.5rem);
41
+ --size-page-title: clamp(3.5rem, 9vw, 8rem);
42
+ --size-post-feature: clamp(2.75rem, 5.5vw, 5.25rem);
43
+ --size-post-title: clamp(3.5rem, 7.4vw, 5.75rem);
44
+ --code-sample-size: var(--size-200); /* code on the Beautiful Code page: 20px, as --size-300 runs large here */
45
+ --weight-body: 500;
46
+ --weight-medium: 600;
47
+ --weight-strong: 600;
48
+ --weight-display: 300;
49
+ --leading-body: 1.55;
50
+ --label-case: none; /* no capitals anywhere: see DESIGN.md */
51
+ --label-tracking: 0;
52
+ --label-tracking-wide: 0;
53
+ --badge-tracking: 0;
54
+ }
55
+ @media (prefers-color-scheme: dark) {
56
+ :root:not([data-theme="light"]), :root[data-accent]:not([data-theme="light"]) {
57
+ --paper: #0b1716;
58
+ --ink: #ece6d8;
59
+ --muted: #a6b5b0;
60
+ --rule: #3a4a47;
61
+ --accent: #5fd4cc;
62
+ --accent-ink: #0b1716;
63
+ --accent-text: #5fd4cc;
64
+ --accent-bright: #5fd4cc;
65
+ --copper: #e39a68;
66
+ --copper-text: #e39a68;
67
+ --bar: #132c2a;
68
+ --bar-ink: #ece6d8;
69
+ --rosette-line: 0.6;
70
+ --row-hover-bg: #132c2a;
71
+ --row-active-bg: var(--bar);
72
+ --row-fg: var(--ink);
73
+ --row-edge: var(--copper);
74
+ }
75
+ }
76
+ :root[data-theme="dark"], :root[data-accent][data-theme="dark"] {
77
+ --paper: #0b1716;
78
+ --ink: #ece6d8;
79
+ --muted: #a6b5b0;
80
+ --rule: #3a4a47;
81
+ --accent: #5fd4cc;
82
+ --accent-ink: #0b1716;
83
+ --accent-text: #5fd4cc;
84
+ --accent-bright: #5fd4cc;
85
+ --copper: #e39a68;
86
+ --copper-text: #e39a68;
87
+ --bar: #132c2a;
88
+ --bar-ink: #ece6d8;
89
+ --rosette-line: 0.6;
90
+ --row-hover-bg: #132c2a;
91
+ --row-active-bg: var(--bar);
92
+ --row-fg: var(--ink);
93
+ --row-edge: var(--copper);
94
+ }
95
+
96
+ /* ---------- Type ---------- */
97
+ body {
98
+ font-feature-settings: "kern", "liga", "ss02"; /* Garamond forms: bigger counters for reading */
99
+ font-variant-numeric: oldstyle-nums proportional-nums;
100
+ }
101
+ .display, .h2, .page-title-text, .post-feature-title, .post-header-title {
102
+ font-feature-settings: "kern", "liga", "dlig";
103
+ }
104
+ .lead { font-style: italic; font-weight: 300; line-height: 1.22; }
105
+ .figure > figcaption, .post-body figcaption { font-style: italic; }
106
+ /* 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.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); }
112
+ /* Numbers that line up need lining figures; old-style would wander. */
113
+ .num, .chip-count, .panel-tab-num, .num-circle, .post-body ol { font-variant-numeric: lining-nums tabular-nums; }
114
+
115
+ /* ---------- The scotch rule ---------- */
116
+ /* Thick and thin as one line: the 2px border theme.css draws, plus a 1px line 3px below it.
117
+ A background, so it needs no extra markup and works on grids and lists alike. */
118
+ .rule-thick, .rule-scotch, .post-list, .post-meta, .post-nav, .site-footer {
119
+ background-image: linear-gradient(var(--ink), var(--ink));
120
+ background-repeat: no-repeat;
121
+ background-position: 0 3px;
122
+ background-size: 100% 1px;
123
+ }
124
+ .rule-scotch { height: 6px; border: 0; border-top: 2px solid var(--ink); }
125
+
126
+ /* ---------- Ornament ---------- */
127
+ /* A pause in the page, once a page at most. aria-hidden on the element: it says nothing. */
128
+ .rule-fleuron {
129
+ display: flex; align-items: center; gap: 1.25rem;
130
+ margin: 0; color: var(--copper-text); font-size: 1.875rem; line-height: 1;
131
+ }
132
+ .rule-fleuron::before, .rule-fleuron::after { content: ""; flex: 1 1 0; border-top: 1px solid var(--rule); }
133
+ /* A framed quotation or title. One to a page, never around an image or a control. */
134
+ .plate {
135
+ position: relative; margin: 6px; padding: 2.5rem;
136
+ border: 1px solid var(--ink); outline: 2px solid var(--ink); outline-offset: 4px;
137
+ text-align: center;
138
+ }
139
+ .plate-corner { position: absolute; width: 11px; height: 11px; background: var(--accent); transform: rotate(45deg); }
140
+ .plate-corner:nth-of-type(1) { top: -6px; left: -6px; }
141
+ .plate-corner:nth-of-type(2) { top: -6px; right: -6px; }
142
+ .plate-corner:nth-of-type(3) { bottom: -6px; left: -6px; }
143
+ .plate-corner:nth-of-type(4) { bottom: -6px; right: -6px; }
144
+ /* The rosette: line work in the two metals, drawn by Rosette.astro. */
145
+ .rosette { fill: none; stroke-width: var(--rosette-line); }
146
+ .rosette svg { display: block; width: 100%; height: auto; }
147
+ .rosette-disc { overflow: hidden; } /* the square's corners swing wider than the page on a phone */
148
+ .rosette-outer, .rosette-core { stroke: var(--accent-text); }
149
+ .rosette-inner { stroke: var(--copper-text); }
150
+ /* Under no-preference, so Reduce Motion never starts it. The switch is hidden there too. */
151
+ .rosette-switch { display: none; }
152
+ @media (prefers-reduced-motion: no-preference) {
153
+ .rosette--spin .rosette-switch { display: inline-flex; margin-top: 0.5rem; }
154
+ .rosette--spin svg { animation: rosette-turn 120s linear infinite; will-change: transform; }
155
+ .rosette--spin:has(.switch:not(:checked)) svg { animation-play-state: paused; }
156
+ }
157
+ @keyframes rosette-turn { to { transform: rotate(360deg); } }
158
+ /* A wide crop of the rosette: put it in a .media box. Its top and bottom run past the box. */
159
+ .rosette-crop { position: relative; overflow: hidden; background: none; }
160
+ .rosette-crop > .rosette { position: absolute; top: 50%; left: 0; width: 100%; transform: translateY(-50%); }
161
+ /* One note a reader must not miss: a manicule, from the font. */
162
+ .notice { display: flex; gap: 0.875rem; align-items: baseline; padding: 1rem 1.25rem; border: 1px solid var(--ink); }
163
+ .notice::before { content: "\261E"; color: var(--copper-text); font-size: 1.875rem; line-height: 1; }
164
+ /* A drawn mark: Mark.astro. One pen, one color at a time. */
165
+ .mark { flex: none; width: 1.625rem; height: 1.625rem; fill: none; stroke: currentColor; stroke-width: 1.25; stroke-linecap: round; stroke-linejoin: round; }
166
+
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
+
174
+ /* The drop cap is ::first-letter, so the word stays whole for screen readers. */
175
+ .post-body--cap > p:first-of-type::first-letter {
176
+ float: left; padding: 0.5rem 0.75rem 0 0;
177
+ color: var(--accent-text); font-size: 7.375rem; font-weight: 300; line-height: 0.78;
178
+ }
179
+ .post-body blockquote {
180
+ padding: 1.75rem 0; border-left: 0;
181
+ border-top: 1px solid var(--rule); border-bottom: 1px solid var(--rule);
182
+ text-align: center; letter-spacing: 0;
183
+ font-style: italic; font-weight: 300; font-size: clamp(2rem, 3.6vw, 2.75rem); line-height: 1.16;
184
+ color: var(--accent-text);
185
+ }
186
+ .post-body hr { border-top: 0; height: auto; overflow: visible; text-align: center; }
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,64 @@
1
1
  {
2
2
  "name": "@agentic-design-kits/verdigris",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "2026.1113.1",
4
+ "description": "A design kit in Cormorant, copper green and engraved line work, for Astro and Tailwind v4 sites. Built on Swiss Minimal.",
5
+ "license": "MIT",
6
+ "author": "Danny Englander",
7
+ "homepage": "https://verdigris.ch",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/danny-englander/agentic-design-kits.git",
11
+ "directory": "verdigris"
12
+ },
13
+ "keywords": [
14
+ "design-kit",
15
+ "css",
16
+ "astro",
17
+ "astro-component",
18
+ "tailwindcss"
19
+ ],
20
+ "publishConfig": {
21
+ "access": "public"
22
+ },
23
+ "type": "module",
24
+ "files": [
25
+ "kit",
26
+ "fonts",
27
+ "DESIGN.md",
28
+ "COMPONENTS.md",
29
+ "tokens.json"
30
+ ],
31
+ "exports": {
32
+ "./tailwind.css": "./kit/tailwind.css",
33
+ "./verdigris.css": "./kit/verdigris.css",
34
+ "./fonts.css": "./kit/fonts.css",
35
+ "./types": "./kit/types.ts",
36
+ "./astro/BaseLayout.astro": "./kit/astro/BaseLayout.astro",
37
+ "./astro/Mark.astro": "./kit/astro/Mark.astro",
38
+ "./astro/Rosette.astro": "./kit/astro/Rosette.astro",
39
+ "./astro/*.astro": "./kit/shared/astro/*.ts",
40
+ "./fonts/*": "./fonts/*",
41
+ "./tokens.json": "./tokens.json",
42
+ "./package.json": "./package.json",
43
+ "./*.js": "./kit/shared/*.ts"
44
+ },
45
+ "dependencies": {
46
+ "@agentic-design-kits/swiss-minimal": "2026.1113.1"
47
+ },
48
+ "peerDependencies": {
49
+ "astro": ">=7.0.0",
50
+ "astro-icon": "^1.1.5",
51
+ "tailwindcss": "^4.0.0"
52
+ },
53
+ "peerDependenciesMeta": {
54
+ "astro": {
55
+ "optional": true
56
+ },
57
+ "astro-icon": {
58
+ "optional": true
59
+ },
60
+ "tailwindcss": {
61
+ "optional": true
62
+ }
63
+ }
64
+ }