@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,8 +1,7 @@
1
1
  /*
2
- * Document, accessibility floor, page frame, chrome (header/footer/nav, the
3
- * CSS-only mobile menu) and the one control the theme ships (an action
4
- * link). Everything here reads the design system from `tokens.css`; nothing
5
- * here reads a `--cogenta-*` token directly.
2
+ * Document, accessibility floor, the grid, section titles, page titles,
3
+ * actions, the header and footer, and the utility pages the host renders
4
+ * (search, forms, comments). Everything reads `tokens.css`.
6
5
  */
7
6
 
8
7
  /* --------------------------------------------------------------------------
@@ -15,208 +14,225 @@
15
14
  box-sizing: border-box;
16
15
  }
17
16
 
18
- body {
19
- margin: 0;
20
- background: var(--cg-canvas);
21
- color: var(--cg-ink);
22
- font-family: var(--cogenta-font-sans);
23
- font-size: var(--cg-text-md);
24
- line-height: var(--cg-leading-normal);
25
- font-kerning: normal;
26
- font-variant-ligatures: common-ligatures;
27
- text-underline-offset: 0.15em;
28
- text-decoration-thickness: from-font;
17
+ html {
29
18
  -webkit-text-size-adjust: 100%;
19
+ text-size-adjust: 100%;
20
+ scroll-padding-block-start: var(--cr-s6);
21
+ hanging-punctuation: first allow-end last;
30
22
  }
31
23
 
32
- /* The display serif, everywhere a heading appears — light weight, generous
33
- tracking at large sizes, the opposite instinct from a grotesque display
34
- face. Every custom class below inherits this rather than restating it. */
35
- h1,
36
- h2,
37
- h3,
38
- h4,
39
- h5,
40
- h6 {
24
+ body {
41
25
  margin: 0;
42
- font-family: var(--cogenta-font-serif);
43
- font-weight: var(--cg-weight-light);
44
- line-height: var(--cg-leading-tight);
45
- letter-spacing: var(--cg-tracking-tight);
46
- text-wrap: balance;
47
- }
48
-
49
- /* The small-caps, letter-spaced label this theme uses for every eyebrow/
50
- kicker — one utility rather than five near-identical declarations. */
51
- .cg-kicker {
52
- display: inline-block;
53
- font-family: var(--cogenta-font-sans);
54
- font-size: var(--cg-text-xs);
55
- font-weight: var(--cg-weight-medium);
56
- letter-spacing: var(--cg-tracking-caps);
57
- text-transform: uppercase;
26
+ background: var(--cr-canvas);
27
+ color: var(--cr-ink);
28
+ font-family: var(--cr-font-text);
29
+ font-size: var(--cr-text-md);
30
+ font-weight: var(--cr-weight-regular);
31
+ line-height: var(--cr-leading-text);
32
+ font-kerning: normal;
33
+ font-variant-ligatures: common-ligatures;
34
+ font-synthesis: none;
35
+ text-rendering: optimizeLegibility;
36
+ -webkit-font-smoothing: antialiased;
58
37
  }
59
38
 
60
39
  ::selection {
61
- background: var(--cg-accent-soft);
62
- color: var(--cg-accent-soft-fg);
40
+ background: var(--cr-brass);
41
+ color: var(--cr-brass-fg);
63
42
  }
64
43
 
65
44
  img,
66
45
  video,
67
46
  iframe {
68
- max-width: 100%;
69
- height: auto;
47
+ display: block;
48
+ max-inline-size: 100%;
49
+ block-size: auto;
70
50
  }
71
51
 
72
52
  img {
73
- display: block;
74
53
  object-fit: cover;
75
54
  }
76
55
 
56
+ :where(img, video) {
57
+ filter: brightness(var(--cr-image-brightness));
58
+ }
59
+
60
+ :where(h1, h2, h3, h4, h5, h6) {
61
+ margin: 0;
62
+ font-family: var(--cr-font-display);
63
+ font-weight: var(--cr-weight-regular);
64
+ line-height: var(--cr-leading-heading);
65
+ letter-spacing: var(--cr-tracking-heading);
66
+ text-wrap: balance;
67
+ }
68
+
69
+ :where(p, li, dd, figcaption, blockquote) {
70
+ text-wrap: pretty;
71
+ }
72
+
77
73
  :where(a) {
78
- color: var(--cg-accent);
79
- text-decoration-color: color-mix(in oklab, var(--cg-accent) 40%, transparent);
74
+ color: var(--cr-ink);
75
+ text-decoration-line: underline;
76
+ text-decoration-thickness: var(--cr-rule);
77
+ text-decoration-color: var(--cr-line-strong);
78
+ text-underline-offset: 0.24em;
80
79
  transition:
81
- color var(--cg-duration-fast) var(--cg-ease),
82
- text-decoration-color var(--cg-duration-fast) var(--cg-ease);
80
+ color var(--cr-duration) var(--cr-ease),
81
+ text-decoration-color var(--cr-duration) var(--cr-ease);
83
82
  }
84
83
 
85
84
  :where(a:hover) {
86
- color: var(--cg-accent-hover);
87
85
  text-decoration-color: currentColor;
88
86
  }
89
87
 
90
88
  :where(hr) {
89
+ block-size: var(--cr-rule);
90
+ border: 0;
91
+ margin-block: var(--cr-s10);
92
+ background: var(--cr-line);
93
+ }
94
+
95
+ :where(code, kbd, samp, pre) {
96
+ font-family: var(--cr-font-code);
97
+ font-size: 0.88em;
98
+ }
99
+
100
+ :where(data, time) {
101
+ font-variant-numeric: lining-nums tabular-nums;
102
+ }
103
+
104
+ .cg-visually-hidden {
105
+ position: absolute;
106
+ inline-size: 1px;
91
107
  block-size: 1px;
108
+ margin: -1px;
109
+ padding: 0;
110
+ overflow: hidden;
111
+ clip-path: inset(50%);
112
+ white-space: nowrap;
92
113
  border: 0;
93
- margin-block: var(--cg-s10);
94
- background: var(--cg-line);
95
114
  }
96
115
 
97
116
  /* --------------------------------------------------------------------------
98
- Focus, targets, motion
117
+ Focus, targets, motion. Motion is a colour or an underline changing, in
118
+ under 150 ms; nothing moves in space, nothing fades in on scroll.
99
119
  -------------------------------------------------------------------------- */
100
120
 
101
- :where(a, button, summary, [tabindex]):focus-visible {
102
- outline: 2px solid var(--cg-accent);
121
+ :where(a, button, summary, input, select, textarea, [tabindex]):focus-visible {
122
+ outline: var(--cr-rule-strong) solid var(--cr-brass);
103
123
  outline-offset: 3px;
104
- border-radius: var(--cg-radius-xs);
105
124
  }
106
125
 
107
- :where(
108
- .cg-action,
109
- .cg-faq__question,
110
- .cg-hours__question,
111
- .cg-press__link,
112
- .cg-nav__cta,
113
- .cg-mobile-nav__toggle
114
- ) {
126
+ :where(.cg-action, .cr-nav-toggle-label, .cg-theme-toggle, summary) {
115
127
  min-block-size: 44px;
116
- min-inline-size: 44px;
117
- }
118
-
119
- @supports (animation-timeline: view()) {
120
- @media (prefers-reduced-motion: no-preference) {
121
- @keyframes cg-settle {
122
- from {
123
- opacity: 0;
124
- transform: translateY(var(--cg-s3));
125
- }
126
-
127
- to {
128
- opacity: 1;
129
- transform: none;
130
- }
131
- }
132
-
133
- [data-block] {
134
- animation: cg-settle linear both;
135
- animation-timeline: view();
136
- animation-range: entry 0% cover 20%;
137
- }
138
- }
139
128
  }
140
129
 
130
+ /* Every transition in this theme reads `--cr-duration`, so reduced motion is
131
+ one declaration rather than an `!important` sweep over every element. */
141
132
  @media (prefers-reduced-motion: reduce) {
142
- *,
143
- *::before,
144
- *::after {
145
- animation-duration: 1ms !important;
146
- animation-iteration-count: 1 !important;
147
- transition-duration: 1ms !important;
148
- scroll-behavior: auto !important;
133
+ :root {
134
+ --cr-duration: 0ms;
149
135
  }
150
136
  }
151
137
 
152
138
  .cg-skip-link {
153
139
  position: absolute;
154
- inset-inline-start: var(--cg-s3);
155
- inset-block-start: calc(var(--cg-s3) * -8);
156
- z-index: 20;
157
- padding: var(--cg-s2) var(--cg-s4);
158
- background: var(--cg-ink);
159
- color: var(--cg-canvas);
160
- border-radius: var(--cg-radius-sm);
161
- font-weight: var(--cg-weight-medium);
140
+ inset-inline-start: var(--cr-s3);
141
+ inset-block-start: calc(var(--cr-s16) * -1);
142
+ z-index: 40;
143
+ padding: var(--cr-s2) var(--cr-s4);
144
+ background: var(--cr-action);
145
+ color: var(--cr-action-fg);
146
+ font-size: var(--cr-text-caption);
147
+ font-weight: var(--cr-weight-medium);
162
148
  text-decoration: none;
163
- transition: inset-block-start var(--cg-duration) var(--cg-ease);
164
149
  }
165
150
 
166
151
  .cg-skip-link:focus-visible {
167
- inset-block-start: var(--cg-s3);
168
- outline-color: var(--cg-canvas);
152
+ inset-block-start: var(--cr-s3);
169
153
  }
170
154
 
171
155
  /* --------------------------------------------------------------------------
172
- Page frame
156
+ The grid. Every block is a section around a twelve-column container; the
157
+ section rhythm is one variable, applied to all of them.
173
158
  -------------------------------------------------------------------------- */
174
159
 
175
- .cg-main {
160
+ .cr-main {
176
161
  display: flow-root;
162
+ overflow-x: clip;
163
+ padding-block-end: calc(var(--cr-section) / 2);
177
164
  }
178
165
 
179
- [data-block] {
180
- max-inline-size: var(--cg-page);
166
+ .cr-container {
167
+ display: grid;
168
+ grid-template-columns: repeat(var(--cr-columns), minmax(0, 1fr));
169
+ column-gap: var(--cr-col-gap);
170
+ align-items: start;
171
+ inline-size: 100%;
172
+ max-inline-size: calc(var(--cr-page) + var(--cr-gutter) * 2);
181
173
  margin-inline: auto;
182
- margin-block: var(--cg-section-y);
183
- padding-inline: var(--cg-gutter);
174
+ padding-inline: var(--cr-gutter);
184
175
  }
185
176
 
186
- /* The hero and the closing CTA are full-bleed by design — the "full-cadre"
187
- dining-room photograph and the dark closing band both run edge to edge. */
188
- [data-block="hero"],
189
- [data-block="cta"] {
190
- max-inline-size: none;
191
- padding-inline: 0;
192
- margin-block: 0;
177
+ /* Below the wide breakpoint twelve columns only make slivers: every child
178
+ takes the full row, and each block redistributes from there. */
179
+ .cr-container > * {
180
+ grid-column: 1 / -1;
181
+ min-inline-size: 0;
193
182
  }
194
183
 
195
- /* --- per-block visual variant (blocks@2.0, RFC 0002) ---------------------- */
184
+ .cr-section {
185
+ padding-block: calc(var(--cr-section) / 2);
186
+ }
196
187
 
197
- [data-block][data-variant-background="muted"],
198
- [data-block][data-variant-background="image"] {
199
- padding-block: var(--cg-s10);
188
+ /* A page that ends on a band ends on it: no strip of paper between the band
189
+ and the footer. */
190
+ :is(.cr-main, .cg-sidebar-layout__content) > [data-variant-background]:last-child {
191
+ margin-block-end: calc(var(--cr-section) / -2);
192
+ }
193
+
194
+ /* --- section titles ----------------------------------------------------------
195
+ A titled block names itself in the display serif, on the first column,
196
+ with the same space under it everywhere. */
197
+
198
+ .cr-head {
199
+ margin-block-end: var(--cr-s10);
200
200
  }
201
201
 
202
- [data-block][data-variant-background="muted"] {
203
- background: var(--cg-surface-sunken);
202
+ .cr-head__title {
203
+ max-inline-size: 24ch;
204
+ font-size: var(--cr-size-section);
205
+ font-weight: var(--cr-weight-light);
206
+ line-height: var(--cr-leading-heading);
207
+ letter-spacing: var(--cr-tracking-display);
204
208
  }
205
209
 
210
+ .cr-empty {
211
+ margin: 0;
212
+ padding-block: var(--cr-s6);
213
+ border-block: var(--cr-rule) solid var(--cr-line);
214
+ color: var(--cr-ink-muted);
215
+ font-size: var(--cr-text-caption);
216
+ }
217
+
218
+ /* --- per-block variants (blocks@2.0, RFC 0002) --------------------------- */
219
+
220
+ [data-block][data-variant-background="muted"],
206
221
  [data-block][data-variant-background="image"] {
207
- background: var(--cg-surface-tinted);
222
+ background: var(--cr-surface);
223
+ padding-block: calc(var(--cr-section) * 0.7);
208
224
  }
209
225
 
210
- [data-block][data-variant-spacing="compact"] {
211
- margin-block: calc(var(--cg-section-y) / 2);
226
+ [data-block][data-variant-background] + [data-block][data-variant-background] {
227
+ margin-block-start: calc(var(--cr-section) / 2);
212
228
  }
213
229
 
214
- [data-block][data-variant-spacing="spacious"] {
215
- margin-block: calc(var(--cg-section-y) * 1.6);
230
+ [data-block][data-variant-spacing="compact"] {
231
+ padding-block: calc(var(--cr-section) / 4);
216
232
  }
217
233
 
218
- [data-block][data-variant-align="start"] {
219
- text-align: start;
234
+ [data-block][data-variant-spacing="spacious"] {
235
+ padding-block: calc(var(--cr-section) * 0.85);
220
236
  }
221
237
 
222
238
  [data-block][data-variant-align="center"] {
@@ -227,193 +243,285 @@ img {
227
243
  text-align: end;
228
244
  }
229
245
 
230
- [data-block][data-variant-width="full"] {
246
+ [data-block][data-variant-width="full"] > .cr-container {
231
247
  max-inline-size: none;
232
- padding-inline: 0;
233
248
  }
234
249
 
235
- .cg-page__title {
236
- max-inline-size: var(--cg-page);
237
- margin-inline: auto;
238
- margin-block: var(--cg-section-y) var(--cg-s6);
239
- padding-inline: var(--cg-gutter);
240
- font-size: var(--cg-text-3xl);
241
- text-align: center;
250
+ /* --- the title of any page that has no hero and is not a dish ------------- */
251
+
252
+ .cr-page-head {
253
+ padding-block: calc(var(--cr-section) * 0.5) calc(var(--cr-section) * 0.1);
242
254
  }
243
255
 
244
- /* `renderEntryHeader` (`@cogenta/theme-kit`, contract D `theme@1.4`) — the
245
- shared entry furniture a routed collection with no `blocks` field of its
246
- own (this theme's `menu_item`) still gets: title, excerpt, meta line,
247
- cover photo, all centred like the rest of this theme's reading pages. */
248
- .cg-entry-header {
249
- max-inline-size: var(--cg-page-narrow);
250
- margin-inline: auto;
251
- margin-block: var(--cg-section-y) var(--cg-s8);
252
- padding-inline: var(--cg-gutter);
253
- text-align: center;
256
+ .cr-page-head__inner {
257
+ row-gap: var(--cr-s5);
254
258
  }
255
259
 
256
- .cg-entry-header__terms {
260
+ .cr-page-head__title {
261
+ font-size: var(--cr-size-title);
262
+ font-weight: var(--cr-weight-light);
263
+ line-height: var(--cr-leading-display);
264
+ letter-spacing: var(--cr-tracking-display);
265
+ }
266
+
267
+ .cr-page-head__lead {
268
+ margin: 0;
269
+ max-inline-size: 38ch;
270
+ color: var(--cr-ink-muted);
271
+ font-family: var(--cr-font-display);
272
+ font-size: var(--cr-size-lead);
273
+ font-style: italic;
274
+ line-height: var(--cr-leading-lead);
275
+ }
276
+
277
+ .cr-page-head__meta {
257
278
  display: flex;
258
279
  flex-wrap: wrap;
259
- justify-content: center;
260
- gap: var(--cg-s3);
261
- margin: 0 0 var(--cg-s3);
262
- padding: 0;
263
- list-style: none;
264
- font-size: var(--cg-text-xs);
265
- letter-spacing: var(--cg-tracking-caps);
266
- text-transform: uppercase;
267
- color: var(--cg-accent);
280
+ gap: var(--cr-s1) var(--cr-s4);
281
+ margin: 0;
282
+ color: var(--cr-ink-muted);
283
+ font-size: var(--cr-text-caption);
284
+ font-variant-numeric: lining-nums tabular-nums;
268
285
  }
269
286
 
270
- .cg-entry-header__title {
271
- margin: 0 0 var(--cg-s4);
272
- font-size: var(--cg-text-3xl);
287
+ .cr-page-head__cover {
288
+ margin: var(--cr-s6) 0 0;
273
289
  }
274
290
 
275
- .cg-entry-header__excerpt {
276
- margin: 0 0 var(--cg-s4);
277
- font-style: italic;
278
- color: var(--cg-ink-muted);
291
+ .cr-page-head__image {
292
+ inline-size: 100%;
293
+ aspect-ratio: 3 / 2;
294
+ background: var(--cr-plate);
279
295
  }
280
296
 
281
- .cg-entry-header__meta {
297
+ @media (min-width: 64rem) {
298
+ .cr-page-head__title,
299
+ .cr-page-head__meta,
300
+ .cr-archive__breadcrumb {
301
+ grid-column: 1 / span 9;
302
+ }
303
+
304
+ .cr-page-head__lead {
305
+ grid-column: 1 / span 7;
306
+ }
307
+ }
308
+
309
+ /* --------------------------------------------------------------------------
310
+ Actions: a filled rectangle in ink for the primary intent, and for the rest
311
+ the words underlined with an arrow after them. Square corners, no lift, no
312
+ shadow, no accent fill.
313
+ -------------------------------------------------------------------------- */
314
+
315
+ .cg-actions {
282
316
  display: flex;
283
317
  flex-wrap: wrap;
318
+ align-items: center;
319
+ gap: var(--cr-s3) var(--cr-s8);
320
+ margin: 0;
321
+ padding: 0;
322
+ list-style: none;
323
+ }
324
+
325
+ .cg-action,
326
+ .cg-widget__cta-action {
327
+ font-family: var(--cr-font-text);
328
+ font-size: var(--cr-text-md);
329
+ font-weight: var(--cr-weight-medium);
330
+ line-height: 1.2;
331
+ text-decoration: none;
332
+ transition:
333
+ background-color var(--cr-duration) var(--cr-ease),
334
+ color var(--cr-duration) var(--cr-ease),
335
+ border-color var(--cr-duration) var(--cr-ease),
336
+ text-decoration-color var(--cr-duration) var(--cr-ease);
337
+ }
338
+
339
+ /* A widget's call to action (`widgets.css`) is this same filled rectangle. */
340
+ .cg-action[data-emphasis="primary"],
341
+ .cg-widget__cta-action {
342
+ display: inline-flex;
343
+ align-items: center;
284
344
  justify-content: center;
285
- gap: var(--cg-s3);
286
- margin: 0 0 var(--cg-s8);
287
- font-size: var(--cg-text-sm);
288
- color: var(--cg-ink-subtle);
345
+ padding: var(--cr-s3) var(--cr-s8);
346
+ border: var(--cr-rule) solid var(--cr-action);
347
+ border-radius: var(--cr-radius-control);
348
+ background: var(--cr-action);
349
+ color: var(--cr-action-fg);
350
+ white-space: nowrap;
289
351
  }
290
352
 
291
- .cg-entry-header__cover {
292
- margin: 0;
293
- border-radius: var(--cg-radius-md);
294
- overflow: hidden;
353
+ .cg-action[data-emphasis="primary"]:hover,
354
+ .cg-widget__cta-action:hover {
355
+ background: var(--cr-action-hover);
356
+ border-color: var(--cr-action-hover);
357
+ color: var(--cr-action-hover-fg);
295
358
  }
296
359
 
297
- .cg-entry-header__cover img {
298
- inline-size: 100%;
360
+ /* A text link with an arrow after it. Not a flex container: in one, the
361
+ words and the arrow are two flex items and each gets its own underline.
362
+ As inline content the words carry one continuous underline, and the
363
+ arrow, an inline-block, inherits none (CSS Text Decoration: decorations do
364
+ not propagate to atomic inlines). The same rule draws every arrow link of
365
+ the theme, so a lone arrow cannot exist anywhere. */
366
+ .cg-action[data-emphasis="secondary"],
367
+ .cr-arrow-link {
368
+ display: inline-block;
369
+ color: var(--cr-ink);
370
+ text-decoration-line: underline;
371
+ text-decoration-thickness: var(--cr-rule);
372
+ text-decoration-color: var(--cr-line-strong);
373
+ text-decoration-skip-ink: auto;
374
+ text-underline-offset: 0.3em;
375
+ }
376
+
377
+ .cg-action[data-emphasis="secondary"] {
378
+ padding-block: var(--cr-s3);
379
+ }
380
+
381
+ .cg-action[data-emphasis="secondary"]::after,
382
+ .cr-arrow-link::after {
383
+ content: "\2192" / "";
384
+ display: inline-block;
385
+ margin-inline-start: 0.4em;
386
+ }
387
+
388
+ .cr-arrow-link[data-direction="back"]::after {
389
+ content: none;
390
+ }
391
+
392
+ .cr-arrow-link[data-direction="back"]::before {
393
+ content: "\2190" / "";
394
+ display: inline-block;
395
+ margin-inline-end: 0.4em;
396
+ }
397
+
398
+ .cg-action[data-emphasis="secondary"]:hover,
399
+ .cr-arrow-link:hover {
400
+ color: var(--cr-ink);
401
+ text-decoration-color: currentColor;
299
402
  }
300
403
 
301
404
  /* --------------------------------------------------------------------------
302
- Chrome — header, sticky, centred wordmark, CSS-only mobile menu
405
+ Header: one quiet row under a hairline. Not held at the top of the window:
406
+ the photograph of the room below it deserves the whole screen once the
407
+ visitor starts to scroll.
303
408
  -------------------------------------------------------------------------- */
304
409
 
305
- .cg-site-header {
306
- position: sticky;
307
- inset-block-start: 0;
308
- z-index: 10;
309
- padding: var(--cg-s4) var(--cg-gutter);
310
- /* Flat and fully opaque, not a frosted-glass blur: a sticky header reads
311
- as a solid plane sitting above the page, with a hairline marking where
312
- it ends. */
313
- background: var(--cg-canvas);
314
- border-block-end: 1px solid var(--cg-line-soft);
410
+ .cr-header {
411
+ position: relative;
412
+ z-index: 30;
413
+ border-block-end: var(--cr-rule) solid var(--cr-line);
414
+ background: var(--cr-canvas);
315
415
  }
316
416
 
317
- .cg-site-header__inner {
417
+ .cr-header__inner {
318
418
  display: flex;
319
419
  align-items: center;
320
- gap: var(--cg-gap);
321
- max-inline-size: var(--cg-page);
420
+ gap: var(--cr-s2) var(--cr-s8);
421
+ min-block-size: var(--cr-header-height);
422
+ max-inline-size: calc(var(--cr-page) + var(--cr-gutter) * 2);
322
423
  margin-inline: auto;
424
+ padding-inline: var(--cr-gutter);
323
425
  }
324
426
 
325
- .cg-site-header__home {
326
- color: var(--cg-ink);
327
- font-family: var(--cogenta-font-serif);
328
- font-weight: var(--cg-weight-regular);
329
- font-size: var(--cg-text-lg);
330
- letter-spacing: var(--cg-tracking-wide);
427
+ .cr-header__brand {
428
+ display: inline-flex;
429
+ flex: 1 1 auto;
430
+ align-items: center;
431
+ min-block-size: 44px;
432
+ min-inline-size: 0;
433
+ color: var(--cr-ink);
331
434
  text-decoration: none;
332
- margin-inline-end: auto;
333
435
  }
334
436
 
335
- .cg-site-header__logo {
437
+ .cr-header__wordmark {
438
+ overflow: hidden;
439
+ font-family: var(--cr-font-display);
440
+ font-size: var(--cr-size-wordmark);
441
+ font-weight: var(--cr-weight-medium);
442
+ line-height: 1;
443
+ letter-spacing: 0.005em;
444
+ text-overflow: ellipsis;
445
+ white-space: nowrap;
446
+ }
447
+
448
+ .cr-header__logo {
336
449
  display: block;
337
- block-size: 2.25rem;
450
+ block-size: 2rem;
338
451
  inline-size: auto;
339
- max-inline-size: 14rem;
452
+ max-inline-size: min(13rem, 46vw);
340
453
  object-fit: contain;
454
+ filter: none;
341
455
  }
342
456
 
343
- .cg-nav {
344
- display: none;
345
- }
346
-
347
- @media (min-width: 56rem) {
348
- .cg-nav {
349
- display: flex;
350
- align-items: center;
351
- }
352
- }
353
-
354
- .cg-nav__items {
457
+ .cr-header__links {
355
458
  display: flex;
356
459
  flex-wrap: wrap;
357
- align-items: center;
358
- gap: var(--cg-s6);
460
+ gap: 0 var(--cr-s8);
359
461
  margin: 0;
360
462
  padding: 0;
361
463
  list-style: none;
362
- font-size: var(--cg-text-sm);
363
- letter-spacing: var(--cg-tracking-wide);
364
- text-transform: uppercase;
365
464
  }
366
465
 
367
- .cg-nav__items a,
368
- .cg-nav__items span {
369
- color: var(--cg-ink-muted);
370
- text-decoration: none;
466
+ .cr-header__item a,
467
+ .cr-header__item span {
468
+ display: inline-flex;
469
+ align-items: center;
470
+ min-block-size: 44px;
471
+ color: var(--cr-ink);
472
+ font-size: var(--cr-text-md);
473
+ text-decoration-line: underline;
474
+ text-decoration-thickness: var(--cr-rule);
475
+ text-decoration-color: transparent;
476
+ text-underline-offset: 0.42em;
371
477
  }
372
478
 
373
- .cg-nav__items a:hover {
374
- color: var(--cg-ink);
479
+ .cr-header__item a:hover {
480
+ text-decoration-color: currentColor;
375
481
  }
376
482
 
377
- .cg-nav__cta {
378
- display: none;
379
- margin-inline-start: var(--cg-s5);
483
+ /* The one action of the header: the words, underlined, after a hairline. */
484
+ .cr-header__action {
485
+ display: inline-flex;
486
+ flex: none;
487
+ align-items: center;
488
+ min-block-size: 44px;
489
+ color: var(--cr-ink);
490
+ font-size: var(--cr-text-md);
491
+ font-weight: var(--cr-weight-medium);
492
+ text-decoration-line: underline;
493
+ text-decoration-thickness: var(--cr-rule);
494
+ text-decoration-color: var(--cr-line-ink);
495
+ text-underline-offset: 0.42em;
496
+ white-space: nowrap;
380
497
  }
381
498
 
382
- @media (min-width: 56rem) {
383
- .cg-nav__cta {
384
- display: inline-flex;
385
- }
499
+ .cr-header__action:hover {
500
+ text-decoration-color: var(--cr-brass);
386
501
  }
387
502
 
388
- /* The manual light/dark/system toggle (L26) — a plain circular icon button in
389
- the header's own register, the same 2.25rem footprint and hairline border
390
- as the footer's social icons, never a filled control (this theme has none
391
- in its header). Icon visibility (sun/moon) is swapped by CSS alone, from
392
- the same `[data-theme]`/`prefers-color-scheme` signals `tokens.css` already
393
- keys the whole palette on — see `theme-canonical`'s identical comment. */
394
503
  .cg-theme-toggle {
395
504
  display: inline-flex;
505
+ flex: none;
396
506
  align-items: center;
397
507
  justify-content: center;
398
- flex-shrink: 0;
399
- inline-size: 2.25rem;
400
- block-size: 2.25rem;
401
- border: 1px solid var(--cg-line-soft);
402
- border-radius: 50%;
508
+ inline-size: 2.75rem;
509
+ margin-inline-end: calc(var(--cr-s3) * -1);
510
+ padding: 0;
511
+ border: 0;
403
512
  background: transparent;
404
- color: var(--cg-ink);
513
+ color: var(--cr-ink);
405
514
  cursor: pointer;
406
- transition: border-color var(--cg-duration-fast) var(--cg-ease);
515
+ transition: color var(--cr-duration) var(--cr-ease);
407
516
  }
408
517
 
409
518
  .cg-theme-toggle:hover {
410
- border-color: var(--cg-accent);
411
- color: var(--cg-accent);
519
+ color: var(--cr-ink-muted);
412
520
  }
413
521
 
414
522
  .cg-theme-toggle__icon {
415
- inline-size: 1.1rem;
416
- block-size: 1.1rem;
523
+ inline-size: 1.05rem;
524
+ block-size: 1.05rem;
417
525
  }
418
526
 
419
527
  .cg-theme-toggle__icon--moon {
@@ -421,449 +529,553 @@ img {
421
529
  }
422
530
 
423
531
  @media (prefers-color-scheme: dark) {
424
- :where(:root:not([data-theme='light'])) .cg-theme-toggle__icon--sun {
532
+ :where(:root:not([data-theme="light"])) .cg-theme-toggle__icon--sun {
425
533
  display: none;
426
534
  }
427
535
 
428
- :where(:root:not([data-theme='light'])) .cg-theme-toggle__icon--moon {
536
+ :where(:root:not([data-theme="light"])) .cg-theme-toggle__icon--moon {
429
537
  display: block;
430
538
  }
431
539
  }
432
540
 
433
- :where(:root[data-theme='dark']) .cg-theme-toggle__icon--sun {
541
+ :where(:root[data-theme="dark"]) .cg-theme-toggle__icon--sun {
434
542
  display: none;
435
543
  }
436
544
 
437
- :where(:root[data-theme='dark']) .cg-theme-toggle__icon--moon {
545
+ :where(:root[data-theme="dark"]) .cg-theme-toggle__icon--moon {
438
546
  display: block;
439
547
  }
440
548
 
441
- /* The CSS-only mobile menu: a `<details>`/`<summary>` disclosure, shown only
442
- below the breakpoint the desktop `.cg-nav` appears at. No JavaScript
443
- anywhere — expanding, focus and keyboard operation all come from the
444
- browser's own `<details>` behaviour. */
445
- .cg-mobile-nav {
446
- position: relative;
447
- display: inline-flex;
448
- }
449
-
450
- @media (min-width: 56rem) {
451
- .cg-mobile-nav {
452
- display: none;
453
- }
549
+ .cr-nav-toggle-input {
550
+ position: absolute;
551
+ inline-size: 1px;
552
+ block-size: 1px;
553
+ overflow: hidden;
554
+ clip-path: inset(50%);
555
+ white-space: nowrap;
454
556
  }
455
557
 
456
- .cg-mobile-nav__toggle {
457
- display: inline-flex;
458
- align-items: center;
558
+ .cr-nav-toggle-label {
559
+ display: flex;
560
+ flex: none;
561
+ flex-direction: column;
459
562
  justify-content: center;
563
+ gap: 0.45rem;
564
+ order: 4;
565
+ inline-size: 2.75rem;
566
+ margin-inline-end: calc(var(--cr-s2) * -1);
567
+ padding: 0.7rem 0.5rem;
460
568
  cursor: pointer;
461
- color: var(--cg-ink);
462
- list-style: none;
463
569
  }
464
570
 
465
- .cg-mobile-nav__toggle::-webkit-details-marker {
466
- display: none;
571
+ .cr-nav-toggle-input:focus-visible ~ .cr-nav-toggle-label {
572
+ outline: var(--cr-rule-strong) solid var(--cr-brass);
573
+ outline-offset: 2px;
467
574
  }
468
575
 
469
- .cg-mobile-nav__glyph {
470
- inline-size: 1.5rem;
471
- block-size: 1.5rem;
576
+ .cr-nav-toggle-bar {
577
+ display: block;
578
+ inline-size: 100%;
579
+ block-size: 1.5px;
580
+ background: var(--cr-ink);
472
581
  }
473
582
 
474
- .cg-mobile-nav__panel {
475
- position: absolute;
476
- inset-inline-end: 0;
477
- inset-block-start: calc(100% + var(--cg-s3));
478
- z-index: 30;
479
- min-inline-size: 14rem;
480
- padding: var(--cg-s4);
481
- background: var(--cg-surface);
482
- box-shadow: var(--cogenta-shadow-md), var(--cg-ring);
483
- border-radius: var(--cg-radius-md);
583
+ /* Open: the two bars cross. A state, drawn at once; nothing is animated. */
584
+ .cr-nav-toggle-input:checked ~ .cr-nav-toggle-label {
585
+ gap: 0;
484
586
  }
485
587
 
486
- .cg-mobile-nav__items {
487
- display: flex;
488
- flex-direction: column;
489
- gap: var(--cg-s4);
490
- margin: 0;
491
- padding: 0;
492
- list-style: none;
493
- font-size: var(--cg-text-sm);
494
- letter-spacing: var(--cg-tracking-wide);
495
- text-transform: uppercase;
588
+ .cr-nav-toggle-input:checked ~ .cr-nav-toggle-label .cr-nav-toggle-bar:first-child {
589
+ transform: translateY(0.75px) rotate(45deg);
496
590
  }
497
591
 
498
- .cg-mobile-nav__items a,
499
- .cg-mobile-nav__items span {
500
- color: var(--cg-ink);
501
- text-decoration: none;
592
+ .cr-nav-toggle-input:checked ~ .cr-nav-toggle-label .cr-nav-toggle-bar:last-child {
593
+ transform: translateY(-0.75px) rotate(-45deg);
502
594
  }
503
595
 
504
- .cg-mobile-nav__items .cg-nav__cta {
505
- display: inline-flex;
506
- }
596
+ /* Below the wide breakpoint the pages are a panel of large serif links under
597
+ the header, down to the bottom of the screen; the reservation link and the
598
+ light/dark control stay in the header row. */
599
+ @media (max-width: 63.99rem) {
600
+ .cr-header__inner {
601
+ gap: var(--cr-s2) var(--cr-s4);
602
+ }
507
603
 
508
- /* --------------------------------------------------------------------------
509
- Chrome — footer, columns
510
- -------------------------------------------------------------------------- */
604
+ .cr-header__action {
605
+ order: 2;
606
+ }
511
607
 
512
- .cg-site-footer {
513
- padding: var(--cg-s16) var(--cg-gutter) var(--cg-s8);
514
- background: var(--cg-surface-sunken);
515
- color: var(--cg-ink-muted);
516
- border-block-start: 1px solid var(--cg-line-soft);
517
- font-size: var(--cg-text-sm);
608
+ .cg-theme-toggle {
609
+ order: 3;
610
+ margin-inline-end: 0;
611
+ }
612
+
613
+ .cr-header__nav {
614
+ display: none;
615
+ position: absolute;
616
+ inset-inline: 0;
617
+ inset-block-start: 100%;
618
+ z-index: 29;
619
+ min-block-size: calc(100svh - var(--cr-header-height));
620
+ overflow-y: auto;
621
+ padding: var(--cr-s4) var(--cr-gutter) var(--cr-s12);
622
+ border-block-start: var(--cr-rule) solid var(--cr-line);
623
+ background: var(--cr-canvas);
624
+ }
625
+
626
+ .cr-nav-toggle-input:checked ~ .cr-header__nav {
627
+ display: block;
628
+ }
629
+
630
+ .cr-header__links {
631
+ display: block;
632
+ }
633
+
634
+ .cr-header__item {
635
+ border-block-end: var(--cr-rule) solid var(--cr-line);
636
+ }
637
+
638
+ .cr-header__item a,
639
+ .cr-header__item span {
640
+ display: flex;
641
+ min-block-size: 0;
642
+ padding-block: var(--cr-s4);
643
+ font-family: var(--cr-font-display);
644
+ font-size: var(--cr-size-nav);
645
+ font-weight: var(--cr-weight-light);
646
+ line-height: var(--cr-leading-heading);
647
+ letter-spacing: var(--cr-tracking-display);
648
+ }
649
+
650
+ .cr-header__card {
651
+ margin-block-start: var(--cr-s10);
652
+ }
653
+
654
+ .cr-header__card p {
655
+ margin: 0;
656
+ color: var(--cr-ink);
657
+ font-size: var(--cr-text-md);
658
+ line-height: 1.55;
659
+ }
660
+
661
+ .cr-header__card p + p {
662
+ margin-block-start: var(--cr-s4);
663
+ color: var(--cr-ink-muted);
664
+ font-size: var(--cr-text-caption);
665
+ }
518
666
  }
519
667
 
520
- .cg-site-footer__grid {
521
- display: grid;
522
- gap: var(--cg-gap-loose);
523
- grid-template-columns: 1fr;
524
- max-inline-size: var(--cg-page);
525
- margin-inline: auto;
526
- padding-block-end: var(--cg-s10);
527
- border-block-end: 1px solid var(--cg-line-soft);
668
+ @media (max-width: 26rem) {
669
+ .cr-header__action {
670
+ font-size: var(--cr-text-caption);
671
+ }
528
672
  }
529
673
 
530
- @media (min-width: 48rem) {
531
- .cg-site-footer__grid {
532
- grid-template-columns: 1.2fr 1fr 1fr;
533
- align-items: start;
674
+ @media (min-width: 64rem) {
675
+ .cr-nav-toggle-label,
676
+ .cr-header__card {
677
+ display: none;
678
+ }
679
+
680
+ .cr-header__nav {
681
+ order: 1;
682
+ }
683
+
684
+ .cr-header__action {
685
+ order: 2;
686
+ padding-inline-start: var(--cr-s8);
687
+ border-inline-start: var(--cr-rule) solid var(--cr-line);
688
+ }
689
+
690
+ .cg-theme-toggle {
691
+ order: 3;
534
692
  }
535
693
  }
536
694
 
537
- .cg-site-footer__brand-name {
538
- display: block;
539
- color: var(--cg-ink);
540
- font-family: var(--cogenta-font-serif);
541
- font-size: var(--cg-text-xl);
542
- letter-spacing: var(--cg-tracking-wide);
543
- text-decoration: none;
544
- margin-block-end: var(--cg-s3);
695
+ /* --------------------------------------------------------------------------
696
+ Footer: a charcoal band. The name, the address card, the pages, the
697
+ profiles, and the legal line.
698
+ -------------------------------------------------------------------------- */
699
+
700
+ .cr-footer {
701
+ padding-block: var(--cr-s20) var(--cr-s10);
702
+ background: var(--cr-footer);
703
+ color: var(--cr-footer-ink);
704
+ font-size: var(--cr-text-caption);
705
+ line-height: var(--cr-leading-ui);
545
706
  }
546
707
 
547
- .cg-site-footer__tagline {
548
- margin: 0 0 var(--cg-s4);
708
+ .cr-footer__inner {
709
+ display: grid;
710
+ grid-template-columns: repeat(var(--cr-columns), minmax(0, 1fr));
711
+ column-gap: var(--cr-col-gap);
712
+ row-gap: var(--cr-s12);
713
+ max-inline-size: calc(var(--cr-page) + var(--cr-gutter) * 2);
714
+ margin-inline: auto;
715
+ padding-inline: var(--cr-gutter);
549
716
  }
550
717
 
551
- .cg-site-footer__social {
552
- display: flex;
553
- gap: var(--cg-s3);
554
- margin: 0;
555
- padding: 0;
556
- list-style: none;
718
+ .cr-footer__inner > * {
719
+ grid-column: 1 / -1;
720
+ min-inline-size: 0;
557
721
  }
558
722
 
559
- .cg-site-footer__social-item a {
560
- display: inline-flex;
561
- align-items: center;
562
- justify-content: center;
563
- inline-size: 2.25rem;
564
- block-size: 2.25rem;
565
- border-radius: 50%;
566
- box-shadow: var(--cg-ring);
567
- color: var(--cg-ink-muted);
723
+ .cr-footer :where(a) {
724
+ color: var(--cr-footer-ink);
725
+ text-decoration-color: var(--cr-footer-line);
568
726
  }
569
727
 
570
- .cg-site-footer__social-item a:hover {
571
- color: var(--cg-accent);
572
- box-shadow: var(--cg-ring-accent);
728
+ .cr-footer :where(a:hover) {
729
+ text-decoration-color: currentColor;
573
730
  }
574
731
 
575
- .cg-social__icon {
576
- inline-size: 1.1rem;
577
- block-size: 1.1rem;
732
+ .cr-footer__name {
733
+ display: inline-block;
734
+ color: var(--cr-footer-ink);
735
+ font-family: var(--cr-font-display);
736
+ font-size: var(--cr-text-3xl);
737
+ font-weight: var(--cr-weight-light);
738
+ line-height: 1.05;
739
+ letter-spacing: var(--cr-tracking-display);
740
+ text-decoration: none;
578
741
  }
579
742
 
580
- .cg-visually-hidden {
581
- position: absolute;
582
- inline-size: 1px;
583
- block-size: 1px;
584
- overflow: hidden;
585
- clip: rect(0 0 0 0);
586
- white-space: nowrap;
743
+ .cr-footer__tagline {
744
+ margin: var(--cr-s3) 0 0;
745
+ max-inline-size: 30ch;
746
+ color: var(--cr-footer-muted);
747
+ font-family: var(--cr-font-display);
748
+ font-size: var(--cr-text-lg);
749
+ font-style: italic;
750
+ line-height: var(--cr-leading-lead);
587
751
  }
588
752
 
589
- .cg-site-footer__nav .cg-nav__items {
590
- flex-direction: column;
591
- align-items: flex-start;
592
- gap: var(--cg-s3);
593
- text-transform: none;
594
- letter-spacing: var(--cg-tracking-normal);
753
+ .cr-footer__note p {
754
+ margin: 0;
755
+ max-inline-size: 36ch;
756
+ color: var(--cr-footer-ink);
757
+ font-size: var(--cr-text-md);
758
+ line-height: 1.55;
595
759
  }
596
760
 
597
- .cg-site-footer__about {
598
- font-style: italic;
761
+ .cr-footer__note p + p {
762
+ margin-block-start: var(--cr-s4);
763
+ color: var(--cr-footer-muted);
764
+ font-size: var(--cr-text-caption);
599
765
  }
600
766
 
601
- .cg-site-footer__bottom {
602
- display: flex;
603
- flex-wrap: wrap;
604
- align-items: center;
605
- justify-content: space-between;
606
- gap: var(--cg-s4);
607
- max-inline-size: var(--cg-page);
608
- margin-inline: auto;
609
- padding-block-start: var(--cg-s6);
610
- font-size: var(--cg-text-xs);
611
- letter-spacing: var(--cg-tracking-wide);
612
- text-transform: uppercase;
613
- color: var(--cg-ink-subtle);
767
+ .cr-footer__links,
768
+ .cr-footer__social {
769
+ display: grid;
770
+ gap: var(--cr-s1);
771
+ margin: 0;
772
+ padding: 0;
773
+ list-style: none;
614
774
  }
615
775
 
616
- .cg-site-footer__branding {
617
- display: flex;
776
+ .cr-footer__item a,
777
+ .cr-footer__item span,
778
+ .cr-footer__social-item a {
779
+ display: inline-flex;
618
780
  align-items: center;
619
- gap: 0.4em;
620
- opacity: 0.8;
621
- transition: opacity var(--cg-duration) var(--cg-ease);
781
+ gap: var(--cr-s2);
782
+ min-block-size: 2rem;
783
+ color: var(--cr-footer-ink);
784
+ font-size: var(--cr-text-md);
785
+ text-decoration-line: underline;
786
+ text-decoration-color: transparent;
787
+ text-underline-offset: 0.3em;
622
788
  }
623
789
 
624
- .cg-site-footer__branding a {
625
- display: flex;
626
- align-items: center;
627
- gap: 0.4em;
790
+ .cr-footer__item a:hover,
791
+ .cr-footer__social-item a:hover {
792
+ text-decoration-color: currentColor;
628
793
  }
629
794
 
630
- .cg-site-footer__branding a:hover,
631
- .cg-site-footer__branding a:focus-visible {
632
- opacity: 1;
795
+ /* The social profiles keep their names: a row of icons alone asks a guest to
796
+ recognise every logo, and a restaurant's footer has room for the words. */
797
+ .cr-footer__social .cg-visually-hidden {
798
+ position: static;
799
+ inline-size: auto;
800
+ block-size: auto;
801
+ margin: 0;
802
+ overflow: visible;
803
+ clip-path: none;
804
+ white-space: normal;
633
805
  }
634
806
 
635
- /* --------------------------------------------------------------------------
636
- Actions — the theme's only control
637
- -------------------------------------------------------------------------- */
807
+ .cg-social__icon {
808
+ inline-size: 1rem;
809
+ block-size: 1rem;
810
+ flex: none;
811
+ }
638
812
 
639
- .cg-actions {
813
+ .cr-footer__legal {
640
814
  display: flex;
641
815
  flex-wrap: wrap;
642
- gap: var(--cg-s4);
643
- margin: var(--cg-s8) 0 0;
644
- padding: 0;
645
- list-style: none;
816
+ align-items: center;
817
+ justify-content: space-between;
818
+ gap: var(--cr-s3) var(--cr-s8);
819
+ padding-block-start: var(--cr-s6);
820
+ border-block-start: var(--cr-rule) solid var(--cr-footer-line);
821
+ color: var(--cr-footer-muted);
822
+ font-size: var(--cr-text-sm);
823
+ }
824
+
825
+ .cr-footer__copyright {
826
+ margin: 0;
827
+ font-variant-numeric: lining-nums tabular-nums;
646
828
  }
647
829
 
648
- .cg-action {
830
+ .cr-footer__branding a {
649
831
  display: inline-flex;
650
832
  align-items: center;
651
- justify-content: center;
652
- gap: var(--cg-s2);
653
- padding: var(--cg-s3) var(--cg-s6);
654
- border: 1px solid transparent;
655
- border-radius: var(--cg-radius-sm);
656
- font-size: var(--cg-text-sm);
657
- font-weight: var(--cg-weight-medium);
658
- letter-spacing: var(--cg-tracking-wide);
659
- text-transform: uppercase;
660
- line-height: var(--cg-leading-snug);
833
+ gap: 0.5em;
834
+ color: var(--cr-footer-muted);
661
835
  text-decoration: none;
662
- white-space: nowrap;
663
- transition:
664
- background-color var(--cg-duration) var(--cg-ease),
665
- color var(--cg-duration) var(--cg-ease),
666
- border-color var(--cg-duration) var(--cg-ease),
667
- transform var(--cg-duration-fast) var(--cg-ease);
668
836
  }
669
837
 
670
- .cg-action[data-emphasis="primary"] {
671
- background: var(--cg-accent);
672
- border-color: var(--cg-accent);
673
- color: var(--cg-accent-fg);
838
+ .cr-footer__branding a:hover {
839
+ color: var(--cr-footer-ink);
674
840
  }
675
841
 
676
- .cg-action[data-emphasis="primary"]:hover {
677
- background: var(--cg-accent-hover);
678
- border-color: var(--cg-accent-hover);
679
- transform: translateY(-1px);
842
+ .cg-site-footer__brand-logo {
843
+ display: block;
844
+ block-size: 18px;
845
+ inline-size: auto;
680
846
  }
681
847
 
682
- .cg-action[data-emphasis="secondary"] {
683
- background: transparent;
684
- border-color: var(--cg-line-strong);
685
- color: var(--cg-ink);
848
+ .cg-site-footer__version {
849
+ font-variant-numeric: tabular-nums;
686
850
  }
687
851
 
688
- .cg-action[data-emphasis="secondary"]:hover {
689
- border-color: var(--cg-accent);
690
- color: var(--cg-accent);
852
+ .cr-footer__nav,
853
+ .cr-footer__follow {
854
+ grid-column: span 6;
691
855
  }
692
856
 
693
- .cg-action:active {
694
- transform: translateY(0);
857
+ @media (min-width: 40rem) {
858
+ .cr-footer__about,
859
+ .cr-footer__note {
860
+ grid-column: span 6;
861
+ }
695
862
  }
696
863
 
697
- /* --------------------------------------------------------------------------
698
- Shared block furniture — every custom title class this theme's seventeen
699
- blocks declare, kept to one typographic rule so a page mixing all of them
700
- reads as one system.
701
- -------------------------------------------------------------------------- */
864
+ @media (min-width: 64rem) {
865
+ .cr-footer__about {
866
+ grid-column: 1 / span 4;
867
+ }
702
868
 
703
- .cg-craft__title-heading,
704
- .cg-close__title,
705
- .cg-faq__title,
706
- .cg-figures__title,
707
- .cg-press__title,
708
- .cg-set-menu__title,
709
- .cg-tallies__title,
710
- .cg-hours__title,
711
- .cg-menu__title {
712
- margin: 0 0 var(--cg-s10);
713
- font-size: var(--cg-text-2xl);
714
- text-align: center;
715
- }
869
+ .cr-footer__note {
870
+ grid-column: 5 / span 4;
871
+ }
716
872
 
717
- .cg-craft__items,
718
- .cg-press__items,
719
- .cg-press-strip__items,
720
- .cg-gallery__items,
721
- .cg-faq__items,
722
- .cg-hours__items,
723
- .cg-set-menu__tiers,
724
- .cg-menu__dishes {
725
- margin: 0;
726
- padding: 0;
727
- list-style: none;
728
- }
873
+ .cr-footer__nav {
874
+ grid-column: 9 / span 2;
875
+ }
876
+
877
+ .cr-footer__follow {
878
+ grid-column: 11 / span 2;
879
+ }
729
880
 
730
- .cg-gallery__viewport,
731
- .cg-menu__viewport {
732
- overflow-x: auto;
733
- scroll-snap-type: x mandatory;
734
- scroll-behavior: smooth;
735
- overscroll-behavior-inline: contain;
736
- scrollbar-width: thin;
737
- scrollbar-color: var(--cg-line-strong) transparent;
738
- padding-block: var(--cg-s2);
739
- margin-block: calc(var(--cg-s2) * -1);
881
+ .cr-footer__legal {
882
+ grid-column: 1 / -1;
883
+ }
740
884
  }
741
885
 
742
886
  /* --------------------------------------------------------------------------
743
- Search, forms, comments — public utility pages and post-content
744
- furniture, styled with the same restrained, elegant language as the
745
- seventeen blocks.
887
+ Search, forms and comments: the utility pages the host renders, in the
888
+ same register. The host sets them in a bare `<main class="cg-main">`.
746
889
  -------------------------------------------------------------------------- */
747
890
 
891
+ :is(.cg-main, .cg-sidebar-layout__content) > .cg-page__title,
748
892
  .cg-search__form,
749
893
  .cg-search__results,
750
894
  .cg-search__empty,
751
895
  .cg-search__error,
752
896
  .cg-form,
753
- .cg-form__confirmation,
754
- .cg-comments {
755
- max-inline-size: var(--cg-page);
897
+ .cg-form__confirmation {
898
+ inline-size: 100%;
899
+ max-inline-size: calc(var(--cr-page) + var(--cr-gutter) * 2);
756
900
  margin-inline: auto;
757
- padding-inline: var(--cg-gutter);
901
+ padding-inline: var(--cr-gutter);
902
+ }
903
+
904
+ :is(.cg-main, .cg-sidebar-layout__content) > .cg-page__title {
905
+ padding-block: calc(var(--cr-section) * 0.5) var(--cr-s8);
906
+ font-size: var(--cr-size-title);
907
+ font-weight: var(--cr-weight-light);
908
+ line-height: var(--cr-leading-display);
909
+ letter-spacing: var(--cr-tracking-display);
910
+ }
911
+
912
+ .cg-search__form > *,
913
+ .cg-form > * {
914
+ max-inline-size: 44rem;
758
915
  }
759
916
 
760
917
  .cg-search__form {
761
918
  display: flex;
762
919
  flex-wrap: wrap;
763
920
  align-items: end;
764
- gap: var(--cg-s3);
765
- margin-block-end: var(--cg-s8);
921
+ gap: var(--cr-s3) var(--cr-s4);
922
+ margin-block: 0 var(--cr-s10);
766
923
  }
767
924
 
768
- .cg-search__form label {
925
+ .cg-search__form label,
926
+ .cg-form__field label,
927
+ .cg-comment__form label {
769
928
  display: block;
770
- font-size: var(--cg-text-sm);
771
- margin-block-end: var(--cg-s2);
929
+ margin-block-end: var(--cr-s2);
930
+ color: var(--cr-ink-muted);
931
+ font-size: var(--cr-text-caption);
932
+ font-weight: var(--cr-weight-medium);
933
+ }
934
+
935
+ .cg-search__form label {
936
+ flex-basis: 100%;
937
+ margin: 0;
772
938
  }
773
939
 
774
940
  .cg-search__form input[type="search"] {
775
- flex: 1 1 16rem;
941
+ flex: 1 1 18rem;
776
942
  }
777
943
 
778
944
  .cg-search__results {
779
- margin: 0 auto;
780
- padding-inline-start: var(--cg-gutter);
781
945
  display: grid;
782
- gap: var(--cg-s4);
783
- font-size: var(--cg-text-lg);
946
+ margin-block: 0 var(--cr-section);
947
+ list-style: none;
948
+ font-family: var(--cr-font-display);
949
+ font-size: var(--cr-text-xl);
950
+ }
951
+
952
+ .cg-search__results > * {
953
+ padding-block: var(--cr-s5);
954
+ border-block-start: var(--cr-rule) solid var(--cr-line);
955
+ }
956
+
957
+ /* Under a result's name its words are the menu's description, in the text
958
+ face and this theme's muted ink, which follows the evening palette (the
959
+ host's floor reads the skin's daytime grey directly). */
960
+ .cg-search__excerpt,
961
+ .cg-search__meta,
962
+ .cg-search__count {
963
+ color: var(--cr-ink-muted);
964
+ font-family: var(--cr-font-text);
965
+ font-size: var(--cr-text-caption);
966
+ line-height: 1.5;
967
+ }
968
+
969
+ .cg-search__excerpt {
970
+ max-inline-size: 52ch;
784
971
  }
785
972
 
786
973
  .cg-search__empty,
787
974
  .cg-comments__empty,
788
- .cg-comments__closed {
789
- color: var(--cg-ink-muted);
975
+ .cg-comments__closed,
976
+ .cg-form__help {
977
+ color: var(--cr-ink-muted);
790
978
  }
791
979
 
792
980
  .cg-search__error,
793
981
  .cg-form__error,
794
982
  .cg-form__field-error {
795
- color: var(--cg-ink);
796
- font-weight: var(--cg-weight-semibold);
983
+ color: var(--cr-ink);
984
+ font-weight: var(--cr-weight-semibold);
797
985
  }
798
986
 
987
+ /* Fields are a baseline, not a box: a rule under the words, darkening to ink
988
+ on focus. */
799
989
  .cg-search__form input,
800
990
  .cg-form__field input,
801
991
  .cg-form__field select,
802
992
  .cg-form__field textarea,
803
993
  .cg-comment__form input,
804
- .cg-comment__form textarea {
994
+ .cg-comment__form textarea,
995
+ .cg-widget__search-input,
996
+ .cg-widget__jump select {
805
997
  inline-size: 100%;
806
- padding: var(--cg-s3) var(--cg-s4);
807
- border: 1px solid var(--cg-line);
808
- border-radius: var(--cg-radius-sm);
809
- background: var(--cg-surface);
810
- color: var(--cg-ink);
811
- font: inherit;
998
+ min-block-size: 44px;
999
+ padding: var(--cr-s2) 0;
1000
+ border: 0;
1001
+ border-block-end: var(--cr-rule) solid var(--cr-line-strong);
1002
+ border-radius: 0;
1003
+ background: transparent;
1004
+ color: var(--cr-ink);
1005
+ font-family: var(--cr-font-text);
1006
+ font-size: var(--cr-text-md);
1007
+ line-height: var(--cr-leading-ui);
1008
+ transition: border-color var(--cr-duration) var(--cr-ease);
1009
+ }
1010
+
1011
+ .cg-form__field textarea,
1012
+ .cg-comment__form textarea {
1013
+ padding: var(--cr-s3);
1014
+ border: var(--cr-rule) solid var(--cr-line-strong);
1015
+ border-radius: var(--cr-radius);
1016
+ resize: vertical;
1017
+ }
1018
+
1019
+ .cg-search__form input:focus-visible,
1020
+ .cg-form__field :is(input, select, textarea):focus-visible,
1021
+ .cg-comment__form :is(input, textarea):focus-visible,
1022
+ .cg-widget__search-input:focus-visible,
1023
+ .cg-widget__jump select:focus-visible {
1024
+ outline: none;
1025
+ border-color: var(--cr-ink);
1026
+ box-shadow: inset 0 calc(var(--cr-rule) * -1) 0 var(--cr-ink);
812
1027
  }
813
1028
 
814
1029
  .cg-form__field input[aria-invalid="true"],
815
1030
  .cg-form__field select[aria-invalid="true"],
816
1031
  .cg-form__field textarea[aria-invalid="true"] {
817
- border-width: 2px;
818
- border-color: var(--cg-line-strong);
1032
+ border-color: var(--cr-ink);
1033
+ border-block-end-width: var(--cr-rule-strong);
819
1034
  }
820
1035
 
821
1036
  .cg-search__form button,
822
1037
  .cg-form button[type="submit"],
823
1038
  .cg-comment__form button[type="submit"] {
824
- padding: var(--cg-s3) var(--cg-s6);
825
- border: 0;
826
- border-radius: var(--cg-radius-sm);
827
- background: var(--cg-accent);
828
- color: var(--cg-accent-fg);
829
- font-weight: var(--cg-weight-medium);
830
- letter-spacing: var(--cg-tracking-wide);
831
- text-transform: uppercase;
1039
+ min-block-size: 44px;
1040
+ padding: var(--cr-s3) var(--cr-s8);
1041
+ border: var(--cr-rule) solid var(--cr-action);
1042
+ border-radius: var(--cr-radius-control);
1043
+ background: var(--cr-action);
1044
+ color: var(--cr-action-fg);
1045
+ font-family: var(--cr-font-text);
1046
+ font-size: var(--cr-text-md);
1047
+ font-weight: var(--cr-weight-medium);
832
1048
  cursor: pointer;
833
- transition: background-color var(--cg-duration) var(--cg-ease);
1049
+ transition:
1050
+ background-color var(--cr-duration) var(--cr-ease),
1051
+ border-color var(--cr-duration) var(--cr-ease),
1052
+ color var(--cr-duration) var(--cr-ease);
834
1053
  }
835
1054
 
836
1055
  .cg-search__form button:hover,
837
1056
  .cg-form button[type="submit"]:hover,
838
1057
  .cg-comment__form button[type="submit"]:hover {
839
- background: var(--cg-accent-hover);
1058
+ background: var(--cr-action-hover);
1059
+ border-color: var(--cr-action-hover);
1060
+ color: var(--cr-action-hover-fg);
840
1061
  }
841
1062
 
842
- .cg-form__field,
843
- .cg-comment__form p {
1063
+ .cg-form__field {
844
1064
  display: block;
845
- margin-block-end: var(--cg-s5);
846
- }
847
-
848
- .cg-form__field label,
849
- .cg-comment__form label {
850
- display: block;
851
- font-size: var(--cg-text-sm);
852
- margin-block-end: var(--cg-s2);
1065
+ margin-block-end: var(--cr-s6);
853
1066
  }
854
1067
 
855
1068
  .cg-form__help {
856
- margin: var(--cg-s2) 0 0;
857
- font-size: var(--cg-text-sm);
858
- color: var(--cg-ink-muted);
1069
+ margin: var(--cr-s2) 0 0;
1070
+ font-size: var(--cr-text-sm);
859
1071
  }
860
1072
 
861
1073
  .cg-form__choice {
862
1074
  display: inline-flex;
863
1075
  align-items: center;
864
- gap: var(--cg-s2);
865
- margin-inline-end: var(--cg-s4);
866
- font-weight: normal;
1076
+ gap: var(--cr-s2);
1077
+ margin-inline-end: var(--cr-s4);
1078
+ font-weight: var(--cr-weight-regular);
867
1079
  }
868
1080
 
869
1081
  .cg-form__honeypot,
@@ -875,11 +1087,34 @@ img {
875
1087
  inset-inline-start: -9999px;
876
1088
  }
877
1089
 
1090
+ /* Comments sit on the same twelve columns as the text above them, from the
1091
+ third column, like running text. */
878
1092
  .cg-comments {
879
- margin-block-start: var(--cg-section-y);
880
- padding-block-start: var(--cg-s8);
881
- padding-block-end: var(--cg-section-y);
882
- border-block-start: 1px solid var(--cg-line-soft);
1093
+ display: grid;
1094
+ grid-template-columns: repeat(var(--cr-columns), minmax(0, 1fr));
1095
+ column-gap: var(--cr-col-gap);
1096
+ max-inline-size: calc(var(--cr-page) + var(--cr-gutter) * 2);
1097
+ margin: 0 auto var(--cr-section);
1098
+ padding: 0 var(--cr-gutter);
1099
+ }
1100
+
1101
+ .cg-comments > * {
1102
+ grid-column: 1 / -1;
1103
+ min-inline-size: 0;
1104
+ }
1105
+
1106
+ @media (min-width: 64rem) {
1107
+ .cg-comments > * {
1108
+ grid-column: 3 / span 7;
1109
+ }
1110
+ }
1111
+
1112
+ .cg-comments > h2 {
1113
+ padding-block-start: var(--cr-s5);
1114
+ border-block-start: var(--cr-rule) solid var(--cr-line-ink);
1115
+ margin-block-end: var(--cr-s5);
1116
+ font-size: var(--cr-size-section);
1117
+ font-weight: var(--cr-weight-light);
883
1118
  }
884
1119
 
885
1120
  .cg-comments__list,
@@ -890,34 +1125,52 @@ img {
890
1125
  }
891
1126
 
892
1127
  .cg-comment {
893
- padding-block: var(--cg-s5);
894
- border-block-end: 1px solid var(--cg-line-soft);
1128
+ padding-block: var(--cr-s5);
1129
+ border-block-start: var(--cr-rule) solid var(--cr-line);
895
1130
  }
896
1131
 
897
1132
  .cg-comment__replies {
898
- padding-block-start: var(--cg-s5);
899
- }
900
-
901
- .cg-comment__replies .cg-comment {
902
- padding-inline-start: var(--cg-s6);
903
- border-inline-start: 2px solid var(--cg-line-soft);
904
- border-block-end: 0;
1133
+ margin-block-start: var(--cr-s4);
1134
+ padding-inline-start: var(--cr-s6);
1135
+ border-inline-start: var(--cr-rule) solid var(--cr-line);
905
1136
  }
906
1137
 
907
1138
  .cg-comment__meta {
908
1139
  display: flex;
909
- gap: var(--cg-s3);
910
- align-items: baseline;
911
- font-size: var(--cg-text-sm);
912
- color: var(--cg-ink-muted);
913
- margin-block-end: var(--cg-s2);
1140
+ flex-wrap: wrap;
1141
+ gap: var(--cr-s1) var(--cr-s3);
1142
+ margin: 0 0 var(--cr-s2);
1143
+ font-size: var(--cr-text-sm);
914
1144
  }
915
1145
 
916
1146
  .cg-comment__author {
917
- font-weight: var(--cg-weight-semibold);
918
- color: var(--cg-ink);
1147
+ color: var(--cr-ink);
1148
+ font-weight: var(--cr-weight-semibold);
919
1149
  }
920
1150
 
921
- .cg-comment__body {
1151
+ .cg-comment__date {
1152
+ color: var(--cr-ink-muted);
1153
+ font-variant-numeric: lining-nums tabular-nums;
1154
+ }
1155
+
1156
+ .cg-comment__body p {
922
1157
  margin: 0;
923
1158
  }
1159
+
1160
+ .cg-comment__body p + p {
1161
+ margin-block-start: var(--cr-s3);
1162
+ }
1163
+
1164
+ .cg-comment__form {
1165
+ display: grid;
1166
+ gap: var(--cr-s3);
1167
+ margin-block-start: var(--cr-s6);
1168
+ }
1169
+
1170
+ .cg-comment__form > * {
1171
+ margin: 0;
1172
+ }
1173
+
1174
+ .cg-comment__form button[type="submit"] {
1175
+ justify-self: start;
1176
+ }