@cogenta/theme-restaurant 0.3.2 → 0.5.3

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 (138) hide show
  1. package/dist/src/index.d.ts +3 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +3 -0
  4. package/dist/src/index.js.map +1 -1
  5. package/dist/src/render/blocks/accordion.d.ts +7 -0
  6. package/dist/src/render/blocks/accordion.d.ts.map +1 -1
  7. package/dist/src/render/blocks/accordion.js +10 -16
  8. package/dist/src/render/blocks/accordion.js.map +1 -1
  9. package/dist/src/render/blocks/collection-list.d.ts +4 -11
  10. package/dist/src/render/blocks/collection-list.d.ts.map +1 -1
  11. package/dist/src/render/blocks/collection-list.js +96 -96
  12. package/dist/src/render/blocks/collection-list.js.map +1 -1
  13. package/dist/src/render/blocks/cta.d.ts +7 -4
  14. package/dist/src/render/blocks/cta.d.ts.map +1 -1
  15. package/dist/src/render/blocks/cta.js +9 -7
  16. package/dist/src/render/blocks/cta.js.map +1 -1
  17. package/dist/src/render/blocks/embed.d.ts.map +1 -1
  18. package/dist/src/render/blocks/embed.js +30 -28
  19. package/dist/src/render/blocks/embed.js.map +1 -1
  20. package/dist/src/render/blocks/faq.d.ts +13 -1
  21. package/dist/src/render/blocks/faq.d.ts.map +1 -1
  22. package/dist/src/render/blocks/faq.js +15 -11
  23. package/dist/src/render/blocks/faq.js.map +1 -1
  24. package/dist/src/render/blocks/feature-grid.d.ts.map +1 -1
  25. package/dist/src/render/blocks/feature-grid.js +43 -16
  26. package/dist/src/render/blocks/feature-grid.js.map +1 -1
  27. package/dist/src/render/blocks/gallery.d.ts +0 -7
  28. package/dist/src/render/blocks/gallery.d.ts.map +1 -1
  29. package/dist/src/render/blocks/gallery.js +28 -10
  30. package/dist/src/render/blocks/gallery.js.map +1 -1
  31. package/dist/src/render/blocks/hero.d.ts +16 -9
  32. package/dist/src/render/blocks/hero.d.ts.map +1 -1
  33. package/dist/src/render/blocks/hero.js +27 -20
  34. package/dist/src/render/blocks/hero.js.map +1 -1
  35. package/dist/src/render/blocks/logo-strip.d.ts +6 -0
  36. package/dist/src/render/blocks/logo-strip.d.ts.map +1 -1
  37. package/dist/src/render/blocks/logo-strip.js +7 -9
  38. package/dist/src/render/blocks/logo-strip.js.map +1 -1
  39. package/dist/src/render/blocks/logos.d.ts +8 -0
  40. package/dist/src/render/blocks/logos.d.ts.map +1 -1
  41. package/dist/src/render/blocks/logos.js +18 -18
  42. package/dist/src/render/blocks/logos.js.map +1 -1
  43. package/dist/src/render/blocks/media-figure.d.ts +14 -3
  44. package/dist/src/render/blocks/media-figure.d.ts.map +1 -1
  45. package/dist/src/render/blocks/media-figure.js +34 -16
  46. package/dist/src/render/blocks/media-figure.js.map +1 -1
  47. package/dist/src/render/blocks/pricing-table.d.ts.map +1 -1
  48. package/dist/src/render/blocks/pricing-table.js +17 -22
  49. package/dist/src/render/blocks/pricing-table.js.map +1 -1
  50. package/dist/src/render/blocks/prose.d.ts +11 -6
  51. package/dist/src/render/blocks/prose.d.ts.map +1 -1
  52. package/dist/src/render/blocks/prose.js +13 -7
  53. package/dist/src/render/blocks/prose.js.map +1 -1
  54. package/dist/src/render/blocks/quote.d.ts +6 -2
  55. package/dist/src/render/blocks/quote.d.ts.map +1 -1
  56. package/dist/src/render/blocks/quote.js +14 -12
  57. package/dist/src/render/blocks/quote.js.map +1 -1
  58. package/dist/src/render/blocks/stat-counter.d.ts +6 -0
  59. package/dist/src/render/blocks/stat-counter.d.ts.map +1 -1
  60. package/dist/src/render/blocks/stat-counter.js +7 -10
  61. package/dist/src/render/blocks/stat-counter.js.map +1 -1
  62. package/dist/src/render/blocks/stats.d.ts +7 -0
  63. package/dist/src/render/blocks/stats.d.ts.map +1 -1
  64. package/dist/src/render/blocks/stats.js +8 -16
  65. package/dist/src/render/blocks/stats.js.map +1 -1
  66. package/dist/src/render/blocks/testimonial.d.ts +5 -11
  67. package/dist/src/render/blocks/testimonial.d.ts.map +1 -1
  68. package/dist/src/render/blocks/testimonial.js +9 -17
  69. package/dist/src/render/blocks/testimonial.js.map +1 -1
  70. package/dist/src/render/chrome.d.ts.map +1 -1
  71. package/dist/src/render/chrome.js +101 -84
  72. package/dist/src/render/chrome.js.map +1 -1
  73. package/dist/src/render/dish.d.ts +13 -0
  74. package/dist/src/render/dish.d.ts.map +1 -0
  75. package/dist/src/render/dish.js +84 -0
  76. package/dist/src/render/dish.js.map +1 -0
  77. package/dist/src/render/layout.d.ts +23 -0
  78. package/dist/src/render/layout.d.ts.map +1 -0
  79. package/dist/src/render/layout.js +33 -0
  80. package/dist/src/render/layout.js.map +1 -0
  81. package/dist/src/render/menu.d.ts +53 -0
  82. package/dist/src/render/menu.d.ts.map +1 -0
  83. package/dist/src/render/menu.js +99 -0
  84. package/dist/src/render/menu.js.map +1 -0
  85. package/dist/src/render/render-block.d.ts +19 -0
  86. package/dist/src/render/render-block.d.ts.map +1 -1
  87. package/dist/src/render/render-block.js +50 -39
  88. package/dist/src/render/render-block.js.map +1 -1
  89. package/dist/src/render/strings.d.ts +15 -0
  90. package/dist/src/render/strings.d.ts.map +1 -0
  91. package/dist/src/render/strings.js +23 -0
  92. package/dist/src/render/strings.js.map +1 -0
  93. package/dist/src/render/term-archive.d.ts +10 -4
  94. package/dist/src/render/term-archive.d.ts.map +1 -1
  95. package/dist/src/render/term-archive.js +25 -16
  96. package/dist/src/render/term-archive.js.map +1 -1
  97. package/dist/src/render/widget-areas.d.ts +13 -0
  98. package/dist/src/render/widget-areas.d.ts.map +1 -0
  99. package/dist/src/render/widget-areas.js +20 -0
  100. package/dist/src/render/widget-areas.js.map +1 -0
  101. package/dist/theme.config.d.ts +1 -1
  102. package/dist/theme.config.js +2 -2
  103. package/dist/theme.config.js.map +1 -1
  104. package/package.json +5 -5
  105. package/src/index.ts +3 -0
  106. package/src/render/blocks/accordion.ts +18 -47
  107. package/src/render/blocks/collection-list.ts +245 -133
  108. package/src/render/blocks/cta.ts +20 -11
  109. package/src/render/blocks/embed.ts +45 -36
  110. package/src/render/blocks/faq.ts +32 -25
  111. package/src/render/blocks/feature-grid.ts +83 -33
  112. package/src/render/blocks/gallery.ts +39 -21
  113. package/src/render/blocks/hero.ts +41 -34
  114. package/src/render/blocks/logo-strip.ts +27 -25
  115. package/src/render/blocks/logos.ts +34 -43
  116. package/src/render/blocks/media-figure.ts +49 -24
  117. package/src/render/blocks/pricing-table.ts +30 -42
  118. package/src/render/blocks/prose.ts +18 -9
  119. package/src/render/blocks/quote.ts +29 -19
  120. package/src/render/blocks/stat-counter.ts +24 -29
  121. package/src/render/blocks/stats.ts +30 -40
  122. package/src/render/blocks/testimonial.ts +17 -22
  123. package/src/render/chrome.ts +113 -95
  124. package/src/render/dish.ts +195 -0
  125. package/src/render/layout.ts +64 -0
  126. package/src/render/menu.ts +117 -0
  127. package/src/render/render-block.ts +51 -40
  128. package/src/render/strings.ts +44 -0
  129. package/src/render/term-archive.ts +78 -44
  130. package/src/render/widget-areas.ts +23 -0
  131. package/src/styles/archive.css +46 -56
  132. package/src/styles/base.css +807 -554
  133. package/src/styles/blocks.css +723 -641
  134. package/src/styles/menu.css +482 -0
  135. package/src/styles/theme.css +24 -25
  136. package/src/styles/tokens.css +239 -225
  137. package/src/styles/widgets.css +853 -0
  138. package/tokens.json +16 -16
@@ -1,31 +1,29 @@
1
1
  /*
2
2
  * `@cogenta/theme-restaurant`'s design system.
3
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.
4
+ * The register is a contemporary bistro with serious cooking: warm cream
5
+ * paper and deep charcoal ink, the food and the room carrying the page, a
6
+ * great deal of air, and one brass kept for a few details (the small capitals
7
+ * that name a part of the menu, a focus ring, a selection, the underline of a
8
+ * link in running text). Structure is drawn with space and hairlines, never
9
+ * with boxes or shadows.
11
10
  *
12
- * Two rules hold everywhere in this file and the two that import it:
11
+ * Two families. Cormorant Garamond sets what a guest reads as the house's
12
+ * voice: the name of the place, titles, dish names, prices of set menus,
13
+ * quotations; light at large sizes, medium for a dish name at text size.
14
+ * Karla sets what a guest reads to find their way: running text,
15
+ * descriptions, navigation, labels and the prices of the menu.
13
16
  *
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.
17
+ * Contract D fixes a closed skin token set, so nothing here adds a token:
18
+ * every value is derived from a `--cogenta-*` property (`calc`, `color-mix`,
19
+ * relative colour syntax).
19
20
  *
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.
21
+ * Two rules hold in every stylesheet of this theme:
22
+ *
23
+ * 1. No colour literal. Every colour is a skin token or a function of one.
24
+ * 2. No second scale. Type steps come from `--cogenta-font-size-*`; the
25
+ * display steps above `3xl` continue the same ratio, and fluid sizes only
26
+ * interpolate between steps of that one ladder.
29
27
  */
30
28
 
31
29
  :where(:root) {
@@ -41,280 +39,296 @@
41
39
  }
42
40
 
43
41
  /* --------------------------------------------------------------------------
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.
42
+ Space: one unit, one section rhythm, one twelve-column grid.
47
43
  -------------------------------------------------------------------------- */
48
44
 
49
45
  :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;
46
+ --cr-density: var(--cogenta-space-scale, 1);
47
+ --cr-unit: calc(var(--cogenta-space-unit) * var(--cr-density));
48
+
49
+ --cr-s1: calc(var(--cr-unit) * 1);
50
+ --cr-s2: calc(var(--cr-unit) * 2);
51
+ --cr-s3: calc(var(--cr-unit) * 3);
52
+ --cr-s4: calc(var(--cr-unit) * 4);
53
+ --cr-s5: calc(var(--cr-unit) * 5);
54
+ --cr-s6: calc(var(--cr-unit) * 6);
55
+ --cr-s8: calc(var(--cr-unit) * 8);
56
+ --cr-s10: calc(var(--cr-unit) * 10);
57
+ --cr-s12: calc(var(--cr-unit) * 12);
58
+ --cr-s16: calc(var(--cr-unit) * 16);
59
+ --cr-s20: calc(var(--cr-unit) * 20);
60
+ --cr-s24: calc(var(--cr-unit) * 24);
61
+ --cr-s32: calc(var(--cr-unit) * 32);
62
+
63
+ /* The only vertical rhythm between blocks. Every block is padded by half of
64
+ it above and below, so any two blocks sit one full step apart, whatever
65
+ their order. Generous: a dining room is mostly the space between tables. */
66
+ --cr-section: clamp(var(--cr-s20), 10vw, var(--cr-s32));
67
+
68
+ --cr-columns: 12;
69
+ --cr-gutter: clamp(var(--cr-s5), 4vw, var(--cr-s16));
70
+ --cr-col-gap: clamp(var(--cr-s4), 2vw, var(--cr-s8));
71
+ --cr-page: 86rem;
72
+
73
+ --cr-measure: 64ch;
74
+ --cr-header-height: 5rem;
76
75
  }
77
76
 
78
77
  :where([data-density="compact"]) {
79
- --cg-density: 0.9;
78
+ --cr-density: 0.75;
80
79
  }
81
80
 
82
81
  :where([data-density="comfortable"]) {
83
- --cg-density: 1.1;
82
+ --cr-density: 1;
84
83
  }
85
84
 
86
85
  :where([data-density="spacious"]) {
87
- --cg-density: 1.25;
86
+ --cr-density: 1.25;
88
87
  }
89
88
 
90
89
  /* --------------------------------------------------------------------------
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.
90
+ Type: a display serif and a text face.
94
91
  -------------------------------------------------------------------------- */
95
92
 
96
93
  :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;
94
+ --cr-font-display: var(--cogenta-font-serif);
95
+ --cr-font-text: var(--cogenta-font-sans);
96
+ --cr-font-code: var(--cogenta-font-mono);
97
+
98
+ --cr-text-xs: var(--cogenta-font-size-xs, 0.64rem);
99
+ --cr-text-sm: var(--cogenta-font-size-sm, 0.8rem);
100
+ --cr-text-md: var(--cogenta-font-size-md, var(--cogenta-font-base-size, 1rem));
101
+ --cr-text-lg: var(--cogenta-font-size-lg, 1.25rem);
102
+ --cr-text-xl: var(--cogenta-font-size-xl, 1.56rem);
103
+ --cr-text-2xl: var(--cogenta-font-size-2xl, 1.95rem);
104
+ --cr-text-3xl: var(--cogenta-font-size-3xl, 2.44rem);
105
+ /* The same ladder, continued: each step is the previous one times the
106
+ skin's own ratio. */
107
+ --cr-text-4xl: calc(var(--cr-text-3xl) * var(--cogenta-font-scale, 1.25));
108
+ --cr-text-5xl: calc(var(--cr-text-4xl) * var(--cogenta-font-scale, 1.25));
109
+ --cr-text-6xl: calc(var(--cr-text-5xl) * var(--cogenta-font-scale, 1.25));
110
+ --cr-text-7xl: calc(var(--cr-text-6xl) * var(--cogenta-font-scale, 1.25));
111
+ --cr-text-8xl: calc(var(--cr-text-7xl) * var(--cogenta-font-scale, 1.25));
112
+
113
+ /* Labels, captions and small print sit between `sm` and `md`. */
114
+ --cr-text-caption: calc((var(--cr-text-sm) + var(--cr-text-md)) / 2);
115
+ /* The reading size: `md` on a phone, a quarter step above it on a desk. */
116
+ --cr-text-reading: clamp(
117
+ var(--cr-text-md),
118
+ calc(0.94rem + 0.2vw),
119
+ calc((var(--cr-text-md) * 3 + var(--cr-text-lg)) / 4)
120
+ );
121
+
122
+ /* The display serif has a small eye: at the same nominal size it reads a
123
+ step smaller than the text face, so its sizes start a step higher. */
124
+ --cr-size-name: clamp(var(--cr-text-5xl), calc(1rem + 8.4vw), var(--cr-text-8xl));
125
+ --cr-size-title: clamp(var(--cr-text-4xl), calc(1rem + 4.6vw), var(--cr-text-6xl));
126
+ --cr-size-dish: clamp(var(--cr-text-3xl), calc(1rem + 3.2vw), var(--cr-text-5xl));
127
+ --cr-size-section: clamp(var(--cr-text-3xl), calc(1rem + 2.3vw), var(--cr-text-4xl));
128
+ --cr-size-welcome: clamp(
129
+ var(--cr-text-xl),
130
+ calc(0.9rem + 1.25vw),
131
+ calc((var(--cr-text-2xl) + var(--cr-text-3xl)) / 2)
132
+ );
133
+ --cr-size-quote: clamp(var(--cr-text-2xl), calc(0.95rem + 2.2vw), var(--cr-text-4xl));
134
+ --cr-size-lead: clamp(var(--cr-text-lg), calc(0.95rem + 0.7vw), var(--cr-text-2xl));
135
+ --cr-size-figure: clamp(var(--cr-text-3xl), calc(1rem + 3vw), var(--cr-text-5xl));
136
+ --cr-size-dish-name: clamp(var(--cr-text-lg), calc(0.95rem + 0.4vw), var(--cr-text-xl));
137
+ --cr-size-label: clamp(var(--cr-text-lg), calc(0.95rem + 0.35vw), var(--cr-text-xl));
138
+ --cr-size-nav: clamp(var(--cr-text-3xl), calc(1rem + 5vw), var(--cr-text-4xl));
139
+ --cr-size-wordmark: clamp(var(--cr-text-xl), calc(1rem + 0.6vw), var(--cr-text-2xl));
140
+
141
+ --cr-leading-display: 0.98;
142
+ --cr-leading-heading: 1.12;
143
+ --cr-leading-lead: 1.38;
144
+ --cr-leading-text: 1.65;
145
+ --cr-leading-ui: 1.4;
146
+
147
+ --cr-tracking-display: -0.012em;
148
+ --cr-tracking-heading: -0.004em;
149
+ /* Small capitals need a little air between them to read as a word. */
150
+ --cr-tracking-caps: 0.075em;
151
+
152
+ --cr-weight-light: 300;
153
+ --cr-weight-regular: 400;
154
+ --cr-weight-medium: 500;
155
+ --cr-weight-semibold: 600;
124
156
  }
125
157
 
126
158
  /* --------------------------------------------------------------------------
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.
159
+ Shape and motion: square corners, motion is a colour or an underline.
130
160
  -------------------------------------------------------------------------- */
131
161
 
132
162
  :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
- }
163
+ --cr-radius: var(--cogenta-radius-sm);
164
+ --cr-radius-control: var(--cogenta-radius-sm);
140
165
 
141
- /* --------------------------------------------------------------------------
142
- Motion
143
- -------------------------------------------------------------------------- */
166
+ --cr-duration: min(var(--cogenta-motion-duration), 150ms);
167
+ --cr-ease: var(--cogenta-motion-easing);
144
168
 
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);
169
+ --cr-rule: 1px;
170
+ --cr-rule-strong: 2px;
150
171
  }
151
172
 
152
173
  /* --------------------------------------------------------------------------
153
- Colour — one palette per scheme, both derived from the same seven tokens.
174
+ Colour: cream, charcoal, and one brass.
154
175
  --------------------------------------------------------------------------
155
176
 
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.
177
+ The first block declares the light palette plainly; the scheme-aware
178
+ values follow behind a feature query, so a browser that cannot parse
179
+ `light-dark()` still gets a complete light palette.
180
+
181
+ Light is the default look, and it follows the visitor's own setting. The
182
+ references for this register (a printed menu card, a lunchtime room with
183
+ daylight on the tablecloths) are paper, and a site that forced its evening
184
+ palette on a visitor whose device is set to light would fight the very
185
+ control in the header that lets them choose.
186
+
187
+ The brass (the skin's accent) is for details only: the small capitals that
188
+ name a part of the menu, a focus ring, a selection, the underline of a link
189
+ inside running text. It is never a fill and never a price.
190
+
191
+ The dark palette is designed, not inverted. It is the room at night:
192
+
193
+ 1. The ground is a deep warm charcoal, taken from the brass's own hue at a
194
+ very low chroma, so it reads like dark wood panelling under low light
195
+ rather than a grey screen. Bands step up in lightness.
196
+ 2. Type is the paper's own cream, lowered a step from white.
197
+ 3. The brass is lifted to hold against the dark ground, keeping its hue.
198
+ 4. Hairlines are a step up in lightness from the ground.
199
+ 5. Photographs are dimmed a very little, with a brightness step, so a white
200
+ plate does not glare in a dark room.
201
+
202
+ The footer is a charcoal band on the paper and a step below the ground in
203
+ the dark, so the page always ends on its heaviest band.
204
+
205
+ Every ratio is computed from this file by `test/design-system.test.ts`,
206
+ in both schemes.
183
207
  -------------------------------------------------------------------------- */
184
208
 
185
209
  :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
- );
210
+ --cr-canvas: var(--cogenta-color-bg);
211
+ --cr-surface: var(--cogenta-color-muted);
212
+ --cr-plate: color-mix(in oklab, var(--cogenta-color-muted) 70%, var(--cogenta-color-bg));
213
+ --cr-mark-plate: var(--cogenta-color-bg);
214
+
215
+ --cr-ink: var(--cogenta-color-fg);
216
+ --cr-ink-muted: var(--cogenta-color-muted-fg);
217
+ --cr-ink-subtle: color-mix(in oklab, var(--cogenta-color-muted-fg) 88%, var(--cogenta-color-bg));
218
+
219
+ --cr-brass: var(--cogenta-color-accent);
220
+ --cr-brass-fg: var(--cogenta-color-accent-fg);
205
221
 
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));
222
+ --cr-line: var(--cogenta-color-border);
223
+ --cr-line-strong: color-mix(in oklab, var(--cogenta-color-border) 45%, var(--cogenta-color-fg));
224
+ --cr-line-ink: var(--cogenta-color-fg);
209
225
 
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);
226
+ --cr-action: var(--cogenta-color-fg);
227
+ --cr-action-fg: var(--cogenta-color-bg);
228
+ --cr-action-hover: color-mix(in oklab, var(--cogenta-color-fg) 82%, var(--cogenta-color-bg));
229
+ --cr-action-hover-fg: var(--cogenta-color-bg);
230
+
231
+ --cr-footer: var(--cogenta-color-fg);
232
+ --cr-footer-ink: var(--cogenta-color-bg);
233
+ --cr-footer-muted: color-mix(in oklab, var(--cogenta-color-bg) 72%, var(--cogenta-color-fg));
234
+ --cr-footer-line: color-mix(in oklab, var(--cogenta-color-bg) 22%, var(--cogenta-color-fg));
235
+
236
+ --cr-image-brightness: 1;
214
237
  }
215
238
 
216
239
  @supports (color: light-dark(currentColor, currentColor)) and
217
240
  (color: oklch(from currentColor l c h)) {
218
241
  :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(
242
+ --cr-canvas: light-dark(
228
243
  var(--cogenta-color-bg),
229
- oklch(from var(--cogenta-color-fg) 0.21 calc(c * 0.55) h)
244
+ oklch(from var(--cogenta-color-accent) 0.195 calc(c * 0.09) h)
230
245
  );
231
- --cg-surface-sunken: light-dark(
246
+ --cr-surface: light-dark(
232
247
  var(--cogenta-color-muted),
233
- oklch(from var(--cogenta-color-fg) 0.105 calc(c * 0.7) h)
248
+ oklch(from var(--cogenta-color-accent) 0.235 calc(c * 0.1) h)
234
249
  );
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)
250
+ --cr-plate: light-dark(
251
+ color-mix(in oklab, var(--cogenta-color-muted) 70%, var(--cogenta-color-bg)),
252
+ oklch(from var(--cogenta-color-accent) 0.25 calc(c * 0.09) h)
238
253
  );
239
-
240
- --cg-ink: light-dark(
241
- var(--cogenta-color-fg),
242
- oklch(from var(--cogenta-color-accent) 0.94 0.012 h)
254
+ --cr-mark-plate: light-dark(
255
+ var(--cogenta-color-bg),
256
+ oklch(from var(--cogenta-color-bg) 0.9 c h)
243
257
  );
244
- --cg-ink-muted: light-dark(
258
+
259
+ --cr-ink: light-dark(var(--cogenta-color-fg), oklch(from var(--cogenta-color-bg) 0.925 c h));
260
+ --cr-ink-muted: light-dark(
245
261
  var(--cogenta-color-muted-fg),
246
- oklch(from var(--cogenta-color-accent) 0.77 0.018 h)
262
+ oklch(from var(--cogenta-color-muted) 0.78 c h)
247
263
  );
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)
264
+ --cr-ink-subtle: light-dark(
265
+ color-mix(in oklab, var(--cogenta-color-muted-fg) 88%, var(--cogenta-color-bg)),
266
+ oklch(from var(--cogenta-color-muted) 0.72 c h)
251
267
  );
252
268
 
253
- --cg-accent: light-dark(
269
+ --cr-brass: light-dark(
254
270
  var(--cogenta-color-accent),
255
- oklch(from var(--cogenta-color-accent) 0.73 calc(c * 0.68) h)
271
+ oklch(from var(--cogenta-color-accent) 0.78 calc(c * 0.8) h)
256
272
  );
257
- --cg-accent-fg: light-dark(
273
+ --cr-brass-fg: light-dark(
258
274
  var(--cogenta-color-accent-fg),
259
- oklch(from var(--cogenta-color-accent) 0.15 calc(c * 0.55) h)
275
+ oklch(from var(--cogenta-color-accent) 0.195 calc(c * 0.09) h)
260
276
  );
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)
277
+
278
+ --cr-line: light-dark(
279
+ var(--cogenta-color-border),
280
+ oklch(from var(--cogenta-color-accent) 0.33 calc(c * 0.09) h)
264
281
  );
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)
282
+ --cr-line-strong: light-dark(
283
+ color-mix(in oklab, var(--cogenta-color-border) 45%, var(--cogenta-color-fg)),
284
+ oklch(from var(--cogenta-color-accent) 0.52 calc(c * 0.08) h)
268
285
  );
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)
286
+ --cr-line-ink: light-dark(
287
+ var(--cogenta-color-fg),
288
+ oklch(from var(--cogenta-color-bg) 0.925 c h)
272
289
  );
273
290
 
274
- --cg-line: light-dark(
275
- var(--cogenta-color-border),
276
- oklch(from var(--cogenta-color-accent) 0.32 calc(c * 0.18) h)
291
+ --cr-action: light-dark(var(--cogenta-color-fg), oklch(from var(--cogenta-color-bg) 0.925 c h));
292
+ --cr-action-fg: light-dark(
293
+ var(--cogenta-color-bg),
294
+ oklch(from var(--cogenta-color-accent) 0.195 calc(c * 0.09) h)
277
295
  );
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)
296
+ --cr-action-hover: light-dark(
297
+ color-mix(in oklab, var(--cogenta-color-fg) 82%, var(--cogenta-color-bg)),
298
+ oklch(from var(--cogenta-color-bg) 0.8 c h)
281
299
  );
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)
300
+ --cr-action-hover-fg: light-dark(
301
+ var(--cogenta-color-bg),
302
+ oklch(from var(--cogenta-color-accent) 0.195 calc(c * 0.09) h)
285
303
  );
286
304
 
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)
305
+ --cr-footer: light-dark(
306
+ var(--cogenta-color-fg),
307
+ oklch(from var(--cogenta-color-accent) 0.155 calc(c * 0.08) h)
308
+ );
309
+ --cr-footer-ink: light-dark(
310
+ var(--cogenta-color-bg),
311
+ oklch(from var(--cogenta-color-bg) 0.925 c h)
312
+ );
313
+ --cr-footer-muted: light-dark(
314
+ color-mix(in oklab, var(--cogenta-color-bg) 72%, var(--cogenta-color-fg)),
315
+ oklch(from var(--cogenta-color-muted) 0.76 c h)
316
+ );
317
+ --cr-footer-line: light-dark(
318
+ color-mix(in oklab, var(--cogenta-color-bg) 22%, var(--cogenta-color-fg)),
319
+ oklch(from var(--cogenta-color-accent) 0.3 calc(c * 0.09) h)
290
320
  );
291
321
  }
292
322
  }
293
323
 
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
-
324
+ /* A photograph on the dark ground is dimmed a very little, so a white plate
325
+ does not glare in a dark room. A brightness step, never a blur. */
310
326
  @media (prefers-color-scheme: dark) {
311
327
  :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);
328
+ --cr-image-brightness: 0.92;
314
329
  }
315
330
  }
316
331
 
317
332
  :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);
333
+ --cr-image-brightness: 0.92;
320
334
  }