@cogenta/theme-restaurant 0.3.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.
Files changed (117) hide show
  1. package/LICENSE +373 -0
  2. package/dist/src/index.d.ts +22 -0
  3. package/dist/src/index.d.ts.map +1 -0
  4. package/dist/src/index.js +25 -0
  5. package/dist/src/index.js.map +1 -0
  6. package/dist/src/render/blocks/accordion.d.ts +4 -0
  7. package/dist/src/render/blocks/accordion.d.ts.map +1 -0
  8. package/dist/src/render/blocks/accordion.js +21 -0
  9. package/dist/src/render/blocks/accordion.js.map +1 -0
  10. package/dist/src/render/blocks/collection-list.d.ts +13 -0
  11. package/dist/src/render/blocks/collection-list.d.ts.map +1 -0
  12. package/dist/src/render/blocks/collection-list.js +109 -0
  13. package/dist/src/render/blocks/collection-list.js.map +1 -0
  14. package/dist/src/render/blocks/cta.d.ts +10 -0
  15. package/dist/src/render/blocks/cta.d.ts.map +1 -0
  16. package/dist/src/render/blocks/cta.js +13 -0
  17. package/dist/src/render/blocks/cta.js.map +1 -0
  18. package/dist/src/render/blocks/embed.d.ts +4 -0
  19. package/dist/src/render/blocks/embed.d.ts.map +1 -0
  20. package/dist/src/render/blocks/embed.js +82 -0
  21. package/dist/src/render/blocks/embed.js.map +1 -0
  22. package/dist/src/render/blocks/faq.d.ts +4 -0
  23. package/dist/src/render/blocks/faq.d.ts.map +1 -0
  24. package/dist/src/render/blocks/faq.js +17 -0
  25. package/dist/src/render/blocks/faq.js.map +1 -0
  26. package/dist/src/render/blocks/feature-grid.d.ts +4 -0
  27. package/dist/src/render/blocks/feature-grid.d.ts.map +1 -0
  28. package/dist/src/render/blocks/feature-grid.js +24 -0
  29. package/dist/src/render/blocks/feature-grid.js.map +1 -0
  30. package/dist/src/render/blocks/gallery.d.ts +11 -0
  31. package/dist/src/render/blocks/gallery.d.ts.map +1 -0
  32. package/dist/src/render/blocks/gallery.js +20 -0
  33. package/dist/src/render/blocks/gallery.js.map +1 -0
  34. package/dist/src/render/blocks/hero.d.ts +16 -0
  35. package/dist/src/render/blocks/hero.d.ts.map +1 -0
  36. package/dist/src/render/blocks/hero.js +32 -0
  37. package/dist/src/render/blocks/hero.js.map +1 -0
  38. package/dist/src/render/blocks/logo-strip.d.ts +4 -0
  39. package/dist/src/render/blocks/logo-strip.d.ts.map +1 -0
  40. package/dist/src/render/blocks/logo-strip.js +16 -0
  41. package/dist/src/render/blocks/logo-strip.js.map +1 -0
  42. package/dist/src/render/blocks/logos.d.ts +4 -0
  43. package/dist/src/render/blocks/logos.d.ts.map +1 -0
  44. package/dist/src/render/blocks/logos.js +23 -0
  45. package/dist/src/render/blocks/logos.js.map +1 -0
  46. package/dist/src/render/blocks/media-figure.d.ts +9 -0
  47. package/dist/src/render/blocks/media-figure.d.ts.map +1 -0
  48. package/dist/src/render/blocks/media-figure.js +24 -0
  49. package/dist/src/render/blocks/media-figure.js.map +1 -0
  50. package/dist/src/render/blocks/pricing-table.d.ts +4 -0
  51. package/dist/src/render/blocks/pricing-table.d.ts.map +1 -0
  52. package/dist/src/render/blocks/pricing-table.js +30 -0
  53. package/dist/src/render/blocks/pricing-table.js.map +1 -0
  54. package/dist/src/render/blocks/prose.d.ts +13 -0
  55. package/dist/src/render/blocks/prose.d.ts.map +1 -0
  56. package/dist/src/render/blocks/prose.js +14 -0
  57. package/dist/src/render/blocks/prose.js.map +1 -0
  58. package/dist/src/render/blocks/quote.d.ts +8 -0
  59. package/dist/src/render/blocks/quote.d.ts.map +1 -0
  60. package/dist/src/render/blocks/quote.js +21 -0
  61. package/dist/src/render/blocks/quote.js.map +1 -0
  62. package/dist/src/render/blocks/stat-counter.d.ts +4 -0
  63. package/dist/src/render/blocks/stat-counter.d.ts.map +1 -0
  64. package/dist/src/render/blocks/stat-counter.js +15 -0
  65. package/dist/src/render/blocks/stat-counter.js.map +1 -0
  66. package/dist/src/render/blocks/stats.d.ts +4 -0
  67. package/dist/src/render/blocks/stats.d.ts.map +1 -0
  68. package/dist/src/render/blocks/stats.js +21 -0
  69. package/dist/src/render/blocks/stats.js.map +1 -0
  70. package/dist/src/render/blocks/testimonial.d.ts +17 -0
  71. package/dist/src/render/blocks/testimonial.d.ts.map +1 -0
  72. package/dist/src/render/blocks/testimonial.js +26 -0
  73. package/dist/src/render/blocks/testimonial.js.map +1 -0
  74. package/dist/src/render/chrome.d.ts +3 -0
  75. package/dist/src/render/chrome.d.ts.map +1 -0
  76. package/dist/src/render/chrome.js +108 -0
  77. package/dist/src/render/chrome.js.map +1 -0
  78. package/dist/src/render/render-block.d.ts +6 -0
  79. package/dist/src/render/render-block.d.ts.map +1 -0
  80. package/dist/src/render/render-block.js +118 -0
  81. package/dist/src/render/render-block.js.map +1 -0
  82. package/dist/src/render/term-archive.d.ts +10 -0
  83. package/dist/src/render/term-archive.d.ts.map +1 -0
  84. package/dist/src/render/term-archive.js +32 -0
  85. package/dist/src/render/term-archive.js.map +1 -0
  86. package/dist/theme.config.d.ts +11 -0
  87. package/dist/theme.config.d.ts.map +1 -0
  88. package/dist/theme.config.js +41 -0
  89. package/dist/theme.config.js.map +1 -0
  90. package/package.json +57 -0
  91. package/src/index.ts +24 -0
  92. package/src/render/blocks/accordion.ts +57 -0
  93. package/src/render/blocks/collection-list.ts +189 -0
  94. package/src/render/blocks/cta.ts +31 -0
  95. package/src/render/blocks/embed.ts +105 -0
  96. package/src/render/blocks/faq.ts +53 -0
  97. package/src/render/blocks/feature-grid.ts +61 -0
  98. package/src/render/blocks/gallery.ts +40 -0
  99. package/src/render/blocks/hero.ts +58 -0
  100. package/src/render/blocks/logo-strip.ts +35 -0
  101. package/src/render/blocks/logos.ts +53 -0
  102. package/src/render/blocks/media-figure.ts +39 -0
  103. package/src/render/blocks/pricing-table.ts +74 -0
  104. package/src/render/blocks/prose.ts +19 -0
  105. package/src/render/blocks/quote.ts +38 -0
  106. package/src/render/blocks/stat-counter.ts +37 -0
  107. package/src/render/blocks/stats.ts +48 -0
  108. package/src/render/blocks/testimonial.ts +42 -0
  109. package/src/render/chrome.ts +141 -0
  110. package/src/render/render-block.ts +156 -0
  111. package/src/render/term-archive.ts +78 -0
  112. package/src/styles/archive.css +84 -0
  113. package/src/styles/base.css +923 -0
  114. package/src/styles/blocks.css +975 -0
  115. package/src/styles/theme.css +36 -0
  116. package/src/styles/tokens.css +320 -0
  117. package/tokens.json +36 -0
@@ -0,0 +1,36 @@
1
+ /*
2
+ * `@cogenta/theme-restaurant`'s stylesheet — the entry point, and nothing
3
+ * else.
4
+ *
5
+ * Four layers, in the only order that works:
6
+ *
7
+ * tokens.css the design system, derived entirely from the skin's
8
+ * `--cogenta-*` custom properties (contract D)
9
+ * base.css document, accessibility floor, page frame, chrome, actions
10
+ * blocks.css the seventeen vocabulary blocks
11
+ * archive.css the taxonomy-term archive (contract D `theme@1.3`)
12
+ *
13
+ * Not one colour, font, radius, duration or shadow is written literally in
14
+ * any of the four: every value comes from a `--cogenta-<group>-<name>`
15
+ * property produced from the skin's tokens, or from a `--cg-*` property
16
+ * composed from those.
17
+ *
18
+ * `@import` is resolved at build time by Astro, and by `@cogenta/cli`'s own
19
+ * inliner when `cogenta serve` renders without a build. Both flatten these
20
+ * four into one sheet, so no visitor ever pays for four round trips.
21
+ *
22
+ * The one thing this file adds on its own: the Google Fonts request for the
23
+ * two type families `tokens.json` names — Cormorant Garamond (display
24
+ * headings, light weight) and Jost (body copy, controls, small-caps
25
+ * labels) — loaded here, once, rather than per skin, since a skin only ever
26
+ * *names* a font family; it does not fetch one. Both fall back to a real
27
+ * system stack (`tokens.json`'s `font.serif`/`font.sans`) if Google Fonts is
28
+ * unreachable.
29
+ */
30
+
31
+ @import url("https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,300;0,400;0,500;0,600;1,400&family=Jost:ital,wght@0,300;0,400;0,500;0,600;1,400&display=swap");
32
+
33
+ @import "./tokens.css";
34
+ @import "./base.css";
35
+ @import "./blocks.css";
36
+ @import "./archive.css";
@@ -0,0 +1,320 @@
1
+ /*
2
+ * `@cogenta/theme-restaurant`'s design system.
3
+ *
4
+ * Contract D fixes a *closed* skin token set — seven colours, five type
5
+ * tokens, two spacing tokens, three radii, three motion tokens, two shadows
6
+ * — and refuses any skin that adds one. So this layer adds nothing to the
7
+ * skin: every value below is *derived* from `--cogenta-*` by composition
8
+ * (`calc`, `color-mix`, relative colour syntax). A skin swap rewrites the
9
+ * generated `--cogenta-*` sheet and this whole system follows, with no
10
+ * build step.
11
+ *
12
+ * Two rules hold everywhere in this file and the two that import it:
13
+ *
14
+ * 1. **No colour literal.** Not one hex, `rgb()`, `hsl()` or bare `oklch()`.
15
+ * Every colour is either a skin token or a function *of* a skin token.
16
+ * 2. **No second scale.** The type steps come from `--cogenta-font-size-*`
17
+ * and the spacing multiplier from `--cogenta-space-scale`, both emitted
18
+ * by `renderSkin` from the same tokens the validator checked.
19
+ *
20
+ * The default skin (`tokens.json`) is a warm cream, charcoal-ink palette
21
+ * with a deep wine/copper accent — the light scheme is designed on its own
22
+ * terms, not treated as an afterthought to a dark-first theme. Elegance here
23
+ * reads as generous negative space, thin hairlines standing in for most
24
+ * elevation, and small-caps, letter-spaced labels (`--cg-tracking-caps`)
25
+ * for every eyebrow/kicker. The dark palette below is designed on its own
26
+ * terms too — the same five departures from a mechanical `bg`/`fg` swap
27
+ * every built-in theme's dark mode uses, tuned to this palette's own wine
28
+ * accent.
29
+ */
30
+
31
+ :where(:root) {
32
+ color-scheme: light dark;
33
+ }
34
+
35
+ :where(:root[data-theme="dark"]) {
36
+ color-scheme: dark;
37
+ }
38
+
39
+ :where(:root[data-theme="light"]) {
40
+ color-scheme: light;
41
+ }
42
+
43
+ /* --------------------------------------------------------------------------
44
+ Space — a spacious scale (`space.density: "spacious"` in tokens.json):
45
+ this theme spends it on generous section rhythm and a very wide hero,
46
+ the "room to breathe" an elegant dining room's own website should have.
47
+ -------------------------------------------------------------------------- */
48
+
49
+ :where(:root) {
50
+ --cg-density: var(--cogenta-space-scale, 1.25);
51
+ --cg-unit: calc(var(--cogenta-space-unit) * var(--cg-density));
52
+
53
+ --cg-s1: calc(var(--cg-unit) * 1);
54
+ --cg-s2: calc(var(--cg-unit) * 2);
55
+ --cg-s3: calc(var(--cg-unit) * 3);
56
+ --cg-s4: calc(var(--cg-unit) * 4);
57
+ --cg-s5: calc(var(--cg-unit) * 5);
58
+ --cg-s6: calc(var(--cg-unit) * 6);
59
+ --cg-s8: calc(var(--cg-unit) * 8);
60
+ --cg-s10: calc(var(--cg-unit) * 10);
61
+ --cg-s12: calc(var(--cg-unit) * 12);
62
+ --cg-s16: calc(var(--cg-unit) * 16);
63
+ --cg-s20: calc(var(--cg-unit) * 20);
64
+ --cg-s28: calc(var(--cg-unit) * 28);
65
+
66
+ --cg-gutter: var(--cg-s6);
67
+ --cg-gap-tight: var(--cg-s2);
68
+ --cg-gap: var(--cg-s5);
69
+ --cg-gap-loose: var(--cg-s10);
70
+ --cg-section-y: var(--cg-s20);
71
+
72
+ --cg-measure: 66ch;
73
+ --cg-measure-narrow: 40ch;
74
+ --cg-page: 76rem;
75
+ --cg-page-narrow: 46rem;
76
+ }
77
+
78
+ :where([data-density="compact"]) {
79
+ --cg-density: 0.9;
80
+ }
81
+
82
+ :where([data-density="comfortable"]) {
83
+ --cg-density: 1.1;
84
+ }
85
+
86
+ :where([data-density="spacious"]) {
87
+ --cg-density: 1.25;
88
+ }
89
+
90
+ /* --------------------------------------------------------------------------
91
+ Type — the skin's scale, named, plus the two type families this theme
92
+ actually loads: Cormorant Garamond for display headings (light, generous
93
+ letter-spacing at large sizes) and Jost for body copy and every control.
94
+ -------------------------------------------------------------------------- */
95
+
96
+ :where(:root) {
97
+ --cg-text-xs: var(--cogenta-font-size-xs, 0.72rem);
98
+ --cg-text-sm: var(--cogenta-font-size-sm, 0.86rem);
99
+ --cg-text-md: var(--cogenta-font-size-md, var(--cogenta-font-base-size, 1rem));
100
+ --cg-text-lg: var(--cogenta-font-size-lg, 1.25rem);
101
+ --cg-text-xl: var(--cogenta-font-size-xl, 1.563rem);
102
+ --cg-text-2xl: var(--cogenta-font-size-2xl, 1.953rem);
103
+ --cg-text-3xl: var(--cogenta-font-size-3xl, 2.441rem);
104
+ --cg-text-4xl: calc(var(--cogenta-font-size-3xl, 2.441rem) * 1.2);
105
+
106
+ --cg-leading-tight: 1.05;
107
+ --cg-leading-snug: 1.28;
108
+ --cg-leading-normal: 1.65;
109
+ --cg-leading-relaxed: 1.8;
110
+
111
+ /* A light-weight display serif wants *wider* tracking at large sizes, not
112
+ tighter — the opposite instinct from a grotesque display face — and a
113
+ small-caps label wants it wider still. Both scale in `em`. */
114
+ --cg-tracking-tight: 0em;
115
+ --cg-tracking-snug: 0.01em;
116
+ --cg-tracking-normal: 0.01em;
117
+ --cg-tracking-wide: 0.08em;
118
+ --cg-tracking-caps: 0.22em;
119
+
120
+ --cg-weight-light: 300;
121
+ --cg-weight-regular: 400;
122
+ --cg-weight-medium: 500;
123
+ --cg-weight-semibold: 600;
124
+ }
125
+
126
+ /* --------------------------------------------------------------------------
127
+ Radius — kept close to square: hairlines carry this theme's structure,
128
+ never a soft rounded corner. `--cg-radius-pill` is the one rounded shape,
129
+ reserved for the small "chef's pick"/category pills.
130
+ -------------------------------------------------------------------------- */
131
+
132
+ :where(:root) {
133
+ --cg-radius-xs: calc(var(--cogenta-radius-sm) / 2);
134
+ --cg-radius-sm: var(--cogenta-radius-sm);
135
+ --cg-radius-md: var(--cogenta-radius-md);
136
+ --cg-radius-lg: var(--cogenta-radius-lg);
137
+ --cg-radius-xl: calc(var(--cogenta-radius-lg) * 2);
138
+ --cg-radius-pill: 999rem;
139
+ }
140
+
141
+ /* --------------------------------------------------------------------------
142
+ Motion
143
+ -------------------------------------------------------------------------- */
144
+
145
+ :where(:root) {
146
+ --cg-duration-fast: calc(var(--cogenta-motion-duration) * 0.6);
147
+ --cg-duration: var(--cogenta-motion-duration);
148
+ --cg-duration-slow: calc(var(--cogenta-motion-duration) * 3);
149
+ --cg-ease: var(--cogenta-motion-easing);
150
+ }
151
+
152
+ /* --------------------------------------------------------------------------
153
+ Colour — one palette per scheme, both derived from the same seven tokens.
154
+ --------------------------------------------------------------------------
155
+
156
+ The block below declares the **light** palette (this theme's default
157
+ skin: warm cream, charcoal ink, a deep wine accent) in plain terms; the
158
+ scheme-aware values live in the `@supports` block after it, guarded the
159
+ same way every built-in theme guards it: a browser that cannot parse
160
+ `light-dark()` still gets a usable light palette rather than an `unset`
161
+ custom property.
162
+
163
+ **The dark palette is designed on its own terms, not inverted** — the
164
+ same five departures from a mechanical `bg`/`fg` swap every built-in
165
+ theme's dark mode makes, applied to this palette's own wine hue:
166
+
167
+ 1. Elevation is a hairline ring in both schemes; a real shadow is spent
168
+ only on hover, never on a resting surface.
169
+ 2. The accent is lifted well past a mechanical brightening and
170
+ **desaturated** as it lifts — a wine pushed to the light-mode's own
171
+ lightness reads as a highlighter pink; this pulls chroma back as it
172
+ rises so it still reads as "the same considered wine".
173
+ 3. The accent's foreground flips to ink: light text on a lifted accent
174
+ fails contrast.
175
+ 4. Text is never pure light and never fully desaturated — ink carries a
176
+ trace of the accent's own hue.
177
+ 5. A border lightens rather than darkens against its surface.
178
+
179
+ Known limit, recorded once for every built-in theme: the derivation
180
+ assumes a light-first skin (`bg` lighter than `fg`) — this theme's own
181
+ default. A skin that starts dark would need a second colour group in the
182
+ contract, a `theme@2.0` change no single theme can make on its own.
183
+ -------------------------------------------------------------------------- */
184
+
185
+ :where(:root) {
186
+ --cg-canvas: var(--cogenta-color-bg);
187
+ --cg-surface: var(--cogenta-color-bg);
188
+ --cg-surface-raised: var(--cogenta-color-bg);
189
+ --cg-surface-sunken: var(--cogenta-color-muted);
190
+ --cg-surface-tinted: color-mix(in oklab, var(--cogenta-color-accent) 7%, var(--cogenta-color-bg));
191
+
192
+ --cg-ink: var(--cogenta-color-fg);
193
+ --cg-ink-muted: var(--cogenta-color-muted-fg);
194
+ --cg-ink-subtle: color-mix(in oklab, var(--cogenta-color-muted-fg) 85%, var(--cogenta-color-bg));
195
+
196
+ --cg-accent: var(--cogenta-color-accent);
197
+ --cg-accent-fg: var(--cogenta-color-accent-fg);
198
+ --cg-accent-hover: color-mix(in oklab, var(--cogenta-color-accent) 84%, var(--cogenta-color-fg));
199
+ --cg-accent-soft: color-mix(in oklab, var(--cogenta-color-accent) 9%, var(--cogenta-color-bg));
200
+ --cg-accent-soft-fg: color-mix(
201
+ in oklab,
202
+ var(--cogenta-color-accent) 70%,
203
+ var(--cogenta-color-fg)
204
+ );
205
+
206
+ --cg-line: var(--cogenta-color-border);
207
+ --cg-line-soft: color-mix(in oklab, var(--cogenta-color-border) 50%, var(--cogenta-color-bg));
208
+ --cg-line-strong: color-mix(in oklab, var(--cogenta-color-border) 60%, var(--cogenta-color-fg));
209
+
210
+ /* The hero's own flat scrim — a single semi-transparent veil over the
211
+ whole image (D5: no gradient fade), a function of ink rather than a
212
+ literal black wash, so a lighter-ink skin gets a lighter scrim too. */
213
+ --cg-scrim: color-mix(in oklab, var(--cogenta-color-fg) 55%, transparent);
214
+ }
215
+
216
+ @supports (color: light-dark(currentColor, currentColor)) and
217
+ (color: oklch(from currentColor l c h)) {
218
+ :where(:root) {
219
+ --cg-canvas: light-dark(
220
+ var(--cogenta-color-bg),
221
+ oklch(from var(--cogenta-color-fg) 0.145 calc(c * 0.6) h)
222
+ );
223
+ --cg-surface: light-dark(
224
+ var(--cogenta-color-bg),
225
+ oklch(from var(--cogenta-color-fg) 0.145 calc(c * 0.6) h)
226
+ );
227
+ --cg-surface-raised: light-dark(
228
+ var(--cogenta-color-bg),
229
+ oklch(from var(--cogenta-color-fg) 0.21 calc(c * 0.55) h)
230
+ );
231
+ --cg-surface-sunken: light-dark(
232
+ var(--cogenta-color-muted),
233
+ oklch(from var(--cogenta-color-fg) 0.105 calc(c * 0.7) h)
234
+ );
235
+ --cg-surface-tinted: light-dark(
236
+ color-mix(in oklab, var(--cogenta-color-accent) 7%, var(--cogenta-color-bg)),
237
+ oklch(from var(--cogenta-color-accent) 0.225 calc(c * 0.5) h)
238
+ );
239
+
240
+ --cg-ink: light-dark(
241
+ var(--cogenta-color-fg),
242
+ oklch(from var(--cogenta-color-accent) 0.94 0.012 h)
243
+ );
244
+ --cg-ink-muted: light-dark(
245
+ var(--cogenta-color-muted-fg),
246
+ oklch(from var(--cogenta-color-accent) 0.77 0.018 h)
247
+ );
248
+ --cg-ink-subtle: light-dark(
249
+ color-mix(in oklab, var(--cogenta-color-muted-fg) 85%, var(--cogenta-color-bg)),
250
+ oklch(from var(--cogenta-color-accent) 0.64 0.016 h)
251
+ );
252
+
253
+ --cg-accent: light-dark(
254
+ var(--cogenta-color-accent),
255
+ oklch(from var(--cogenta-color-accent) 0.73 calc(c * 0.68) h)
256
+ );
257
+ --cg-accent-fg: light-dark(
258
+ var(--cogenta-color-accent-fg),
259
+ oklch(from var(--cogenta-color-accent) 0.15 calc(c * 0.55) h)
260
+ );
261
+ --cg-accent-hover: light-dark(
262
+ color-mix(in oklab, var(--cogenta-color-accent) 84%, var(--cogenta-color-fg)),
263
+ oklch(from var(--cogenta-color-accent) 0.82 calc(c * 0.64) h)
264
+ );
265
+ --cg-accent-soft: light-dark(
266
+ color-mix(in oklab, var(--cogenta-color-accent) 9%, var(--cogenta-color-bg)),
267
+ oklch(from var(--cogenta-color-accent) 0.27 calc(c * 0.42) h)
268
+ );
269
+ --cg-accent-soft-fg: light-dark(
270
+ color-mix(in oklab, var(--cogenta-color-accent) 70%, var(--cogenta-color-fg)),
271
+ oklch(from var(--cogenta-color-accent) 0.88 calc(c * 0.38) h)
272
+ );
273
+
274
+ --cg-line: light-dark(
275
+ var(--cogenta-color-border),
276
+ oklch(from var(--cogenta-color-accent) 0.32 calc(c * 0.18) h)
277
+ );
278
+ --cg-line-soft: light-dark(
279
+ color-mix(in oklab, var(--cogenta-color-border) 50%, var(--cogenta-color-bg)),
280
+ oklch(from var(--cogenta-color-accent) 0.26 calc(c * 0.16) h)
281
+ );
282
+ --cg-line-strong: light-dark(
283
+ color-mix(in oklab, var(--cogenta-color-border) 60%, var(--cogenta-color-fg)),
284
+ oklch(from var(--cogenta-color-accent) 0.52 calc(c * 0.2) h)
285
+ );
286
+
287
+ --cg-scrim: light-dark(
288
+ color-mix(in oklab, var(--cogenta-color-fg) 55%, transparent),
289
+ color-mix(in oklab, var(--cogenta-color-fg) 62%, transparent)
290
+ );
291
+ }
292
+ }
293
+
294
+ /* --------------------------------------------------------------------------
295
+ Elevation — a hairline ring by default in both schemes; a real shadow is
296
+ spent only on hover, never on a resting surface.
297
+ -------------------------------------------------------------------------- */
298
+
299
+ :where(:root) {
300
+ --cg-ring: inset 0 0 0 1px var(--cg-line);
301
+ --cg-ring-accent: inset 0 0 0 1px var(--cg-accent);
302
+ --cg-ring-strong: inset 0 0 0 1px var(--cg-line-strong);
303
+
304
+ --cg-elevation-0: none;
305
+ --cg-elevation-1: var(--cg-ring);
306
+ --cg-elevation-2: var(--cogenta-shadow-sm), var(--cg-ring);
307
+ --cg-elevation-3: var(--cogenta-shadow-md), var(--cg-ring);
308
+ }
309
+
310
+ @media (prefers-color-scheme: dark) {
311
+ :where(:root:not([data-theme="light"])) {
312
+ --cg-elevation-2: var(--cg-ring-strong);
313
+ --cg-elevation-3: var(--cg-ring-strong), var(--cogenta-shadow-md);
314
+ }
315
+ }
316
+
317
+ :where(:root[data-theme="dark"]) {
318
+ --cg-elevation-2: var(--cg-ring-strong);
319
+ --cg-elevation-3: var(--cg-ring-strong), var(--cogenta-shadow-md);
320
+ }
package/tokens.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "color": {
3
+ "bg": "#f5ecdc",
4
+ "fg": "#231b16",
5
+ "accent": "#7a2a2c",
6
+ "accentFg": "#ffffff",
7
+ "muted": "#ece0cb",
8
+ "mutedFg": "#4a3d33",
9
+ "border": "#ddccae"
10
+ },
11
+ "font": {
12
+ "sans": "'Jost', ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif",
13
+ "serif": "'Cormorant Garamond', ui-serif, Georgia, Cambria, 'Times New Roman', serif",
14
+ "mono": "ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace",
15
+ "scale": 1.25,
16
+ "baseSize": "1rem"
17
+ },
18
+ "space": {
19
+ "unit": "0.25rem",
20
+ "density": "spacious"
21
+ },
22
+ "radius": {
23
+ "sm": "0.0625rem",
24
+ "md": "0.125rem",
25
+ "lg": "0.25rem"
26
+ },
27
+ "motion": {
28
+ "duration": "220ms",
29
+ "easing": "cubic-bezier(0.16, 1, 0.3, 1)",
30
+ "reduced": true
31
+ },
32
+ "shadow": {
33
+ "sm": "0 1px 3px rgba(35, 27, 22, 0.14)",
34
+ "md": "0 16px 40px rgba(35, 27, 22, 0.22)"
35
+ }
36
+ }