@cogenta/theme-restaurant 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/LICENSE +373 -0
  2. package/dist/src/index.d.ts +22 -0
  3. package/dist/src/index.d.ts.map +1 -0
  4. package/dist/src/index.js +25 -0
  5. package/dist/src/index.js.map +1 -0
  6. package/dist/src/render/blocks/accordion.d.ts +4 -0
  7. package/dist/src/render/blocks/accordion.d.ts.map +1 -0
  8. package/dist/src/render/blocks/accordion.js +21 -0
  9. package/dist/src/render/blocks/accordion.js.map +1 -0
  10. package/dist/src/render/blocks/collection-list.d.ts +13 -0
  11. package/dist/src/render/blocks/collection-list.d.ts.map +1 -0
  12. package/dist/src/render/blocks/collection-list.js +109 -0
  13. package/dist/src/render/blocks/collection-list.js.map +1 -0
  14. package/dist/src/render/blocks/cta.d.ts +10 -0
  15. package/dist/src/render/blocks/cta.d.ts.map +1 -0
  16. package/dist/src/render/blocks/cta.js +13 -0
  17. package/dist/src/render/blocks/cta.js.map +1 -0
  18. package/dist/src/render/blocks/embed.d.ts +4 -0
  19. package/dist/src/render/blocks/embed.d.ts.map +1 -0
  20. package/dist/src/render/blocks/embed.js +82 -0
  21. package/dist/src/render/blocks/embed.js.map +1 -0
  22. package/dist/src/render/blocks/faq.d.ts +4 -0
  23. package/dist/src/render/blocks/faq.d.ts.map +1 -0
  24. package/dist/src/render/blocks/faq.js +17 -0
  25. package/dist/src/render/blocks/faq.js.map +1 -0
  26. package/dist/src/render/blocks/feature-grid.d.ts +4 -0
  27. package/dist/src/render/blocks/feature-grid.d.ts.map +1 -0
  28. package/dist/src/render/blocks/feature-grid.js +24 -0
  29. package/dist/src/render/blocks/feature-grid.js.map +1 -0
  30. package/dist/src/render/blocks/gallery.d.ts +11 -0
  31. package/dist/src/render/blocks/gallery.d.ts.map +1 -0
  32. package/dist/src/render/blocks/gallery.js +20 -0
  33. package/dist/src/render/blocks/gallery.js.map +1 -0
  34. package/dist/src/render/blocks/hero.d.ts +16 -0
  35. package/dist/src/render/blocks/hero.d.ts.map +1 -0
  36. package/dist/src/render/blocks/hero.js +32 -0
  37. package/dist/src/render/blocks/hero.js.map +1 -0
  38. package/dist/src/render/blocks/logo-strip.d.ts +4 -0
  39. package/dist/src/render/blocks/logo-strip.d.ts.map +1 -0
  40. package/dist/src/render/blocks/logo-strip.js +16 -0
  41. package/dist/src/render/blocks/logo-strip.js.map +1 -0
  42. package/dist/src/render/blocks/logos.d.ts +4 -0
  43. package/dist/src/render/blocks/logos.d.ts.map +1 -0
  44. package/dist/src/render/blocks/logos.js +23 -0
  45. package/dist/src/render/blocks/logos.js.map +1 -0
  46. package/dist/src/render/blocks/media-figure.d.ts +9 -0
  47. package/dist/src/render/blocks/media-figure.d.ts.map +1 -0
  48. package/dist/src/render/blocks/media-figure.js +24 -0
  49. package/dist/src/render/blocks/media-figure.js.map +1 -0
  50. package/dist/src/render/blocks/pricing-table.d.ts +4 -0
  51. package/dist/src/render/blocks/pricing-table.d.ts.map +1 -0
  52. package/dist/src/render/blocks/pricing-table.js +30 -0
  53. package/dist/src/render/blocks/pricing-table.js.map +1 -0
  54. package/dist/src/render/blocks/prose.d.ts +13 -0
  55. package/dist/src/render/blocks/prose.d.ts.map +1 -0
  56. package/dist/src/render/blocks/prose.js +14 -0
  57. package/dist/src/render/blocks/prose.js.map +1 -0
  58. package/dist/src/render/blocks/quote.d.ts +8 -0
  59. package/dist/src/render/blocks/quote.d.ts.map +1 -0
  60. package/dist/src/render/blocks/quote.js +21 -0
  61. package/dist/src/render/blocks/quote.js.map +1 -0
  62. package/dist/src/render/blocks/stat-counter.d.ts +4 -0
  63. package/dist/src/render/blocks/stat-counter.d.ts.map +1 -0
  64. package/dist/src/render/blocks/stat-counter.js +15 -0
  65. package/dist/src/render/blocks/stat-counter.js.map +1 -0
  66. package/dist/src/render/blocks/stats.d.ts +4 -0
  67. package/dist/src/render/blocks/stats.d.ts.map +1 -0
  68. package/dist/src/render/blocks/stats.js +21 -0
  69. package/dist/src/render/blocks/stats.js.map +1 -0
  70. package/dist/src/render/blocks/testimonial.d.ts +17 -0
  71. package/dist/src/render/blocks/testimonial.d.ts.map +1 -0
  72. package/dist/src/render/blocks/testimonial.js +26 -0
  73. package/dist/src/render/blocks/testimonial.js.map +1 -0
  74. package/dist/src/render/chrome.d.ts +3 -0
  75. package/dist/src/render/chrome.d.ts.map +1 -0
  76. package/dist/src/render/chrome.js +108 -0
  77. package/dist/src/render/chrome.js.map +1 -0
  78. package/dist/src/render/render-block.d.ts +6 -0
  79. package/dist/src/render/render-block.d.ts.map +1 -0
  80. package/dist/src/render/render-block.js +118 -0
  81. package/dist/src/render/render-block.js.map +1 -0
  82. package/dist/src/render/term-archive.d.ts +10 -0
  83. package/dist/src/render/term-archive.d.ts.map +1 -0
  84. package/dist/src/render/term-archive.js +32 -0
  85. package/dist/src/render/term-archive.js.map +1 -0
  86. package/dist/theme.config.d.ts +11 -0
  87. package/dist/theme.config.d.ts.map +1 -0
  88. package/dist/theme.config.js +41 -0
  89. package/dist/theme.config.js.map +1 -0
  90. package/package.json +57 -0
  91. package/src/index.ts +24 -0
  92. package/src/render/blocks/accordion.ts +57 -0
  93. package/src/render/blocks/collection-list.ts +189 -0
  94. package/src/render/blocks/cta.ts +31 -0
  95. package/src/render/blocks/embed.ts +105 -0
  96. package/src/render/blocks/faq.ts +53 -0
  97. package/src/render/blocks/feature-grid.ts +61 -0
  98. package/src/render/blocks/gallery.ts +40 -0
  99. package/src/render/blocks/hero.ts +58 -0
  100. package/src/render/blocks/logo-strip.ts +35 -0
  101. package/src/render/blocks/logos.ts +53 -0
  102. package/src/render/blocks/media-figure.ts +39 -0
  103. package/src/render/blocks/pricing-table.ts +74 -0
  104. package/src/render/blocks/prose.ts +19 -0
  105. package/src/render/blocks/quote.ts +38 -0
  106. package/src/render/blocks/stat-counter.ts +37 -0
  107. package/src/render/blocks/stats.ts +48 -0
  108. package/src/render/blocks/testimonial.ts +42 -0
  109. package/src/render/chrome.ts +141 -0
  110. package/src/render/render-block.ts +156 -0
  111. package/src/render/term-archive.ts +78 -0
  112. package/src/styles/archive.css +84 -0
  113. package/src/styles/base.css +923 -0
  114. package/src/styles/blocks.css +975 -0
  115. package/src/styles/theme.css +36 -0
  116. package/src/styles/tokens.css +320 -0
  117. package/tokens.json +36 -0
@@ -0,0 +1,975 @@
1
+ /*
2
+ * The seventeen vocabulary blocks (`blocks@2.0`). Reads only `--cg-*` from
3
+ * `tokens.css`; nothing here reads a `--cogenta-*` token directly.
4
+ */
5
+
6
+ /* --------------------------------------------------------------------------
7
+ hero — full-bleed, centred, a flat scrim over any photograph
8
+ -------------------------------------------------------------------------- */
9
+
10
+ .cg-hero {
11
+ position: relative;
12
+ display: flex;
13
+ align-items: center;
14
+ justify-content: center;
15
+ min-block-size: 34rem;
16
+ padding: var(--cg-s20) var(--cg-gutter);
17
+ overflow: hidden;
18
+ background: var(--cg-ink);
19
+ color: var(--cg-canvas);
20
+ text-align: center;
21
+ }
22
+
23
+ @media (min-width: 56rem) {
24
+ .cg-hero {
25
+ min-block-size: 44rem;
26
+ }
27
+ }
28
+
29
+ .cg-hero[data-has-media="false"] {
30
+ background: var(--cg-surface-sunken);
31
+ color: var(--cg-ink);
32
+ }
33
+
34
+ .cg-hero__media {
35
+ position: absolute;
36
+ inset: 0;
37
+ z-index: 0;
38
+ }
39
+
40
+ .cg-hero__image {
41
+ inline-size: 100%;
42
+ block-size: 100%;
43
+ object-fit: cover;
44
+ }
45
+
46
+ /* A flat, uniform veil rather than a gradient fade: `.cg-hero`'s content is
47
+ centred over the whole image (not pinned to the bottom), so contrast
48
+ needs to hold anywhere in the frame, not just near the caption. */
49
+ .cg-hero__scrim {
50
+ position: absolute;
51
+ inset: 0;
52
+ background: var(--cg-scrim);
53
+ }
54
+
55
+ .cg-hero__body {
56
+ position: relative;
57
+ z-index: 1;
58
+ display: flex;
59
+ flex-direction: column;
60
+ align-items: center;
61
+ gap: var(--cg-s5);
62
+ max-inline-size: 42rem;
63
+ }
64
+
65
+ .cg-hero__eyebrow {
66
+ margin: 0;
67
+ color: inherit;
68
+ }
69
+
70
+ .cg-hero__eyebrow::before,
71
+ .cg-hero__eyebrow::after {
72
+ display: inline-block;
73
+ inline-size: 1.5em;
74
+ border-block-end: 1px solid currentColor;
75
+ vertical-align: middle;
76
+ margin-inline: 0.5em;
77
+ opacity: 0.6;
78
+ content: "";
79
+ }
80
+
81
+ .cg-hero__title {
82
+ margin: 0;
83
+ font-size: clamp(var(--cg-text-3xl), 6vw, var(--cg-text-4xl));
84
+ letter-spacing: var(--cg-tracking-wide);
85
+ }
86
+
87
+ .cg-hero__subtitle {
88
+ margin: 0;
89
+ font-size: var(--cg-text-lg);
90
+ opacity: 0.92;
91
+ }
92
+
93
+ .cg-hero .cg-actions {
94
+ justify-content: center;
95
+ }
96
+
97
+ /* The secondary action's global rule (`base.css`) hardcodes `--cg-ink` — the
98
+ * right choice on the plain, light `data-has-media="false"` backdrop below,
99
+ * but unreadable dark-on-dark once a photograph and its scrim are behind it.
100
+ * Same fix as `.cg-close`'s own secondary override just below in this file,
101
+ * scoped to the media case only so the no-media hero keeps its correct ink
102
+ * text untouched. */
103
+ .cg-hero[data-has-media="true"] .cg-action[data-emphasis="secondary"] {
104
+ border-color: color-mix(in oklab, var(--cg-canvas) 40%, transparent);
105
+ color: var(--cg-canvas);
106
+ }
107
+
108
+ .cg-hero[data-has-media="true"] .cg-action[data-emphasis="secondary"]:hover {
109
+ border-color: var(--cg-canvas);
110
+ color: var(--cg-canvas);
111
+ }
112
+
113
+ /* --------------------------------------------------------------------------
114
+ prose ("Our story") — a short, centred, narrow column
115
+ -------------------------------------------------------------------------- */
116
+
117
+ .cg-story {
118
+ text-align: center;
119
+ }
120
+
121
+ .cg-story__body {
122
+ max-inline-size: var(--cg-measure-narrow);
123
+ margin-inline: auto;
124
+ text-align: start;
125
+ }
126
+
127
+ .cg-story__body p {
128
+ margin: 0 0 var(--cg-s5);
129
+ }
130
+
131
+ .cg-story__body :is(h2, h3, h4) {
132
+ margin-block: var(--cg-s8) var(--cg-s4);
133
+ }
134
+
135
+ .cg-story__body blockquote {
136
+ margin: var(--cg-s6) 0;
137
+ padding-inline-start: var(--cg-s5);
138
+ border-inline-start: 2px solid var(--cg-accent);
139
+ font-style: italic;
140
+ }
141
+
142
+ .cg-prose__figure {
143
+ margin: var(--cg-s6) 0;
144
+ }
145
+
146
+ .cg-prose__figure figcaption {
147
+ margin-block-start: var(--cg-s2);
148
+ font-size: var(--cg-text-sm);
149
+ color: var(--cg-ink-muted);
150
+ }
151
+
152
+ .cg-prose__rule {
153
+ block-size: 1px;
154
+ border: 0;
155
+ margin-block: var(--cg-s8);
156
+ background: var(--cg-line);
157
+ }
158
+
159
+ /* --------------------------------------------------------------------------
160
+ collectionList — "The menu", grouped by category, priced with a leader
161
+ -------------------------------------------------------------------------- */
162
+
163
+ .cg-menu__groups {
164
+ display: grid;
165
+ gap: var(--cg-s16);
166
+ grid-template-columns: 1fr;
167
+ }
168
+
169
+ @media (min-width: 80rem) {
170
+ .cg-menu__groups {
171
+ grid-template-columns: 1fr 1fr;
172
+ column-gap: var(--cg-s20);
173
+ }
174
+ }
175
+
176
+ .cg-menu__group-title {
177
+ margin: 0 0 var(--cg-s6);
178
+ font-size: var(--cg-text-lg);
179
+ text-align: center;
180
+ letter-spacing: var(--cg-tracking-caps);
181
+ text-transform: uppercase;
182
+ font-family: var(--cogenta-font-sans);
183
+ font-weight: var(--cg-weight-medium);
184
+ color: var(--cg-accent);
185
+ }
186
+
187
+ .cg-menu__group + .cg-menu__group {
188
+ padding-block-start: var(--cg-s10);
189
+ border-block-start: 1px solid var(--cg-line-soft);
190
+ }
191
+
192
+ @media (min-width: 80rem) {
193
+ .cg-menu__group + .cg-menu__group {
194
+ border-block-start: 0;
195
+ padding-block-start: 0;
196
+ }
197
+ }
198
+
199
+ .cg-menu__dish {
200
+ display: flex;
201
+ gap: var(--cg-s4);
202
+ padding-block: var(--cg-s5);
203
+ }
204
+
205
+ .cg-menu__dish + .cg-menu__dish {
206
+ border-block-start: 1px dotted var(--cg-line);
207
+ }
208
+
209
+ .cg-menu__dish-photo {
210
+ flex: 0 0 auto;
211
+ }
212
+
213
+ .cg-menu__dish-image {
214
+ inline-size: 5rem;
215
+ block-size: 5rem;
216
+ border-radius: var(--cg-radius-md);
217
+ }
218
+
219
+ .cg-menu__dish-body {
220
+ flex: 1 1 auto;
221
+ min-inline-size: 0;
222
+ }
223
+
224
+ .cg-menu__dish-row {
225
+ display: flex;
226
+ flex-wrap: wrap;
227
+ align-items: baseline;
228
+ gap: var(--cg-s2);
229
+ }
230
+
231
+ .cg-menu__dish-name {
232
+ margin: 0;
233
+ /* Shrinkable and free to wrap: a real, human-entered dish name has no
234
+ length limit, and on a narrow screen it must break onto a second line
235
+ — or shrink to make room for its leader and price — rather than force
236
+ the whole row (and the page) wider than the viewport, which `nowrap`
237
+ plus a non-shrinking basis did below ~400px. */
238
+ flex: 1 1 auto;
239
+ min-inline-size: 0;
240
+ font-size: var(--cg-text-lg);
241
+ font-weight: var(--cg-weight-regular);
242
+ }
243
+
244
+ /*
245
+ * The leader and its price move as one unit (`collection-list.ts` nests
246
+ * both in a single `<span>`): on a name too long to share its line, the
247
+ * dots must wrap down *with* the price they point to, never left dangling
248
+ * at the end of the name's own line while the price they introduce sits
249
+ * stranded below on a line of its own.
250
+ */
251
+ .cg-menu__dish-tail {
252
+ display: flex;
253
+ align-items: baseline;
254
+ gap: var(--cg-s2);
255
+ flex: 0 1 auto;
256
+ min-inline-size: 5rem;
257
+ }
258
+
259
+ .cg-menu__dish-leader {
260
+ flex: 1 1 auto;
261
+ block-size: 0;
262
+ border-block-end: 1px dotted var(--cg-line-strong);
263
+ margin-block-end: 0.35em;
264
+ min-inline-size: var(--cg-s5);
265
+ }
266
+
267
+ .cg-menu__dish-price {
268
+ flex: 0 0 auto;
269
+ font-family: var(--cogenta-font-sans);
270
+ font-weight: var(--cg-weight-medium);
271
+ color: var(--cg-accent);
272
+ white-space: nowrap;
273
+ }
274
+
275
+ .cg-menu__dish-description {
276
+ margin: var(--cg-s1) 0 0;
277
+ font-style: italic;
278
+ color: var(--cg-ink-muted);
279
+ font-size: var(--cg-text-sm);
280
+ }
281
+
282
+ .cg-menu__empty {
283
+ text-align: center;
284
+ color: var(--cg-ink-muted);
285
+ }
286
+
287
+ /* --------------------------------------------------------------------------
288
+ gallery — grid / carousel / masonry, no JavaScript
289
+ -------------------------------------------------------------------------- */
290
+
291
+ .cg-gallery__item {
292
+ border-radius: var(--cg-radius-md);
293
+ overflow: hidden;
294
+ }
295
+
296
+ .cg-gallery__item img {
297
+ aspect-ratio: 4 / 3;
298
+ inline-size: 100%;
299
+ object-fit: cover;
300
+ transition: transform var(--cg-duration-slow) var(--cg-ease);
301
+ }
302
+
303
+ .cg-gallery__item:hover img {
304
+ transform: scale(1.03);
305
+ }
306
+
307
+ .cg-gallery[data-layout="grid"] .cg-gallery__items {
308
+ display: grid;
309
+ gap: var(--cg-s4);
310
+ grid-template-columns: repeat(2, 1fr);
311
+ }
312
+
313
+ @media (min-width: 48rem) {
314
+ .cg-gallery[data-layout="grid"] .cg-gallery__items {
315
+ grid-template-columns: repeat(3, 1fr);
316
+ }
317
+ }
318
+
319
+ .cg-gallery[data-layout="carousel"] .cg-gallery__items {
320
+ display: flex;
321
+ gap: var(--cg-s4);
322
+ }
323
+
324
+ .cg-gallery[data-layout="carousel"] .cg-gallery__item {
325
+ flex: 0 0 auto;
326
+ inline-size: 16rem;
327
+ scroll-snap-align: start;
328
+ }
329
+
330
+ /* True masonry, no JavaScript: a multi-column flow, each tile forbidden
331
+ from breaking across a column so the effect reads as a real masonry wall
332
+ rather than a grid with gaps. */
333
+ .cg-gallery[data-layout="masonry"] .cg-gallery__items {
334
+ column-count: 2;
335
+ column-gap: var(--cg-s4);
336
+ }
337
+
338
+ @media (min-width: 48rem) {
339
+ .cg-gallery[data-layout="masonry"] .cg-gallery__items {
340
+ column-count: 3;
341
+ }
342
+ }
343
+
344
+ .cg-gallery[data-layout="masonry"] .cg-gallery__item {
345
+ margin-block-end: var(--cg-s4);
346
+ break-inside: avoid;
347
+ }
348
+
349
+ .cg-gallery[data-layout="masonry"] .cg-gallery__item img {
350
+ aspect-ratio: auto;
351
+ }
352
+
353
+ /* --------------------------------------------------------------------------
354
+ stats ("Since 1994 · 3 chefs · 120 seats")
355
+ -------------------------------------------------------------------------- */
356
+
357
+ .cg-figures__items {
358
+ display: flex;
359
+ flex-wrap: wrap;
360
+ justify-content: center;
361
+ gap: 0;
362
+ margin: 0;
363
+ padding: 0;
364
+ }
365
+
366
+ .cg-figures__item {
367
+ display: flex;
368
+ flex-direction: column;
369
+ align-items: center;
370
+ gap: var(--cg-s2);
371
+ padding-inline: var(--cg-s8);
372
+ text-align: center;
373
+ }
374
+
375
+ .cg-figures__item + .cg-figures__item {
376
+ border-inline-start: 1px solid var(--cg-line-soft);
377
+ }
378
+
379
+ .cg-figures__value {
380
+ margin: 0;
381
+ font-family: var(--cogenta-font-serif);
382
+ font-size: var(--cg-text-3xl);
383
+ font-weight: var(--cg-weight-light);
384
+ color: var(--cg-accent);
385
+ }
386
+
387
+ .cg-figures__unit {
388
+ margin-inline-start: 0.15em;
389
+ font-size: 0.6em;
390
+ }
391
+
392
+ .cg-figures__label {
393
+ margin: 0;
394
+ font-size: var(--cg-text-xs);
395
+ letter-spacing: var(--cg-tracking-caps);
396
+ text-transform: uppercase;
397
+ color: var(--cg-ink-muted);
398
+ }
399
+
400
+ /* --------------------------------------------------------------------------
401
+ testimonial — a guestbook quotation
402
+ -------------------------------------------------------------------------- */
403
+
404
+ .cg-testimonial {
405
+ max-inline-size: var(--cg-page-narrow);
406
+ margin-inline: auto;
407
+ text-align: center;
408
+ }
409
+
410
+ .cg-testimonial__quote {
411
+ margin: 0 0 var(--cg-s6);
412
+ font-family: var(--cogenta-font-serif);
413
+ font-size: var(--cg-text-xl);
414
+ font-style: italic;
415
+ line-height: var(--cg-leading-snug);
416
+ }
417
+
418
+ .cg-testimonial__quote::before {
419
+ display: block;
420
+ margin-block-end: var(--cg-s2);
421
+ font-size: var(--cg-text-3xl);
422
+ color: var(--cg-accent);
423
+ font-family: var(--cogenta-font-serif);
424
+ content: "\201C";
425
+ }
426
+
427
+ .cg-testimonial__attribution {
428
+ display: flex;
429
+ flex-direction: column;
430
+ align-items: center;
431
+ gap: var(--cg-s2);
432
+ }
433
+
434
+ .cg-testimonial__avatar {
435
+ inline-size: 3.5rem;
436
+ block-size: 3.5rem;
437
+ border-radius: 50%;
438
+ }
439
+
440
+ .cg-testimonial__who {
441
+ display: flex;
442
+ flex-direction: column;
443
+ font-size: var(--cg-text-sm);
444
+ }
445
+
446
+ .cg-testimonial__name {
447
+ font-weight: var(--cg-weight-medium);
448
+ }
449
+
450
+ .cg-testimonial__role {
451
+ color: var(--cg-ink-muted);
452
+ }
453
+
454
+ /* --------------------------------------------------------------------------
455
+ accordion ("Hours & location")
456
+ -------------------------------------------------------------------------- */
457
+
458
+ .cg-hours {
459
+ max-inline-size: var(--cg-page-narrow);
460
+ margin-inline: auto;
461
+ }
462
+
463
+ .cg-hours__item + .cg-hours__item {
464
+ border-block-start: 1px solid var(--cg-line-soft);
465
+ }
466
+
467
+ .cg-hours__details {
468
+ padding-block: var(--cg-s2);
469
+ }
470
+
471
+ .cg-hours__question {
472
+ display: flex;
473
+ align-items: center;
474
+ justify-content: space-between;
475
+ gap: var(--cg-s4);
476
+ padding-block: var(--cg-s4);
477
+ cursor: pointer;
478
+ list-style: none;
479
+ font-size: var(--cg-text-lg);
480
+ }
481
+
482
+ .cg-hours__question::-webkit-details-marker {
483
+ display: none;
484
+ }
485
+
486
+ .cg-hours__question-text {
487
+ font-family: var(--cogenta-font-serif);
488
+ }
489
+
490
+ .cg-hours__mark {
491
+ position: relative;
492
+ flex: 0 0 auto;
493
+ inline-size: 0.9rem;
494
+ block-size: 0.9rem;
495
+ }
496
+
497
+ .cg-hours__mark::before,
498
+ .cg-hours__mark::after {
499
+ position: absolute;
500
+ inset: 0;
501
+ margin: auto;
502
+ inline-size: 100%;
503
+ block-size: 1px;
504
+ background: currentColor;
505
+ content: "";
506
+ }
507
+
508
+ .cg-hours__mark::after {
509
+ transform: rotate(90deg);
510
+ transition: transform var(--cg-duration) var(--cg-ease);
511
+ }
512
+
513
+ .cg-hours__details[open] .cg-hours__mark::after {
514
+ transform: rotate(0deg);
515
+ }
516
+
517
+ .cg-hours__answer {
518
+ padding-block-end: var(--cg-s5);
519
+ color: var(--cg-ink-muted);
520
+ }
521
+
522
+ .cg-hours__answer table {
523
+ width: 100%;
524
+ border-collapse: collapse;
525
+ }
526
+
527
+ .cg-hours__answer td,
528
+ .cg-hours__answer th {
529
+ padding: var(--cg-s2) var(--cg-s3);
530
+ border-block-end: 1px solid var(--cg-line-soft);
531
+ text-align: start;
532
+ }
533
+
534
+ /* --------------------------------------------------------------------------
535
+ embed — the map placeholder card
536
+ -------------------------------------------------------------------------- */
537
+
538
+ .cg-embed {
539
+ position: relative;
540
+ max-inline-size: var(--cg-page-narrow);
541
+ margin-inline: auto;
542
+ aspect-ratio: var(--cg-ratio, 16 / 9);
543
+ border-radius: var(--cg-radius-md);
544
+ overflow: hidden;
545
+ box-shadow: var(--cg-ring);
546
+ }
547
+
548
+ .cg-embed__frame {
549
+ position: absolute;
550
+ inset: 0;
551
+ inline-size: 100%;
552
+ block-size: 100%;
553
+ border: 0;
554
+ }
555
+
556
+ .cg-embed__placeholder {
557
+ position: absolute;
558
+ inset: 0;
559
+ display: flex;
560
+ flex-direction: column;
561
+ align-items: center;
562
+ justify-content: center;
563
+ gap: var(--cg-s3);
564
+ padding: var(--cg-s6);
565
+ background: var(--cg-surface-sunken);
566
+ text-align: center;
567
+ }
568
+
569
+ .cg-embed__provider {
570
+ margin: 0;
571
+ font-size: var(--cg-text-xs);
572
+ letter-spacing: var(--cg-tracking-caps);
573
+ text-transform: uppercase;
574
+ color: var(--cg-ink-subtle);
575
+ }
576
+
577
+ .cg-embed__notice {
578
+ margin: 0;
579
+ max-inline-size: 28rem;
580
+ color: var(--cg-ink-muted);
581
+ }
582
+
583
+ .cg-embed__link {
584
+ font-weight: var(--cg-weight-medium);
585
+ }
586
+
587
+ /* --------------------------------------------------------------------------
588
+ cta ("Book now / Call us") — full-bleed closing band
589
+ -------------------------------------------------------------------------- */
590
+
591
+ .cg-close {
592
+ display: flex;
593
+ flex-direction: column;
594
+ align-items: center;
595
+ gap: var(--cg-s5);
596
+ padding: var(--cg-s20) var(--cg-gutter);
597
+ background: var(--cg-ink);
598
+ color: var(--cg-canvas);
599
+ text-align: center;
600
+ }
601
+
602
+ .cg-close__title {
603
+ color: inherit;
604
+ font-size: var(--cg-text-2xl);
605
+ }
606
+
607
+ .cg-close__text {
608
+ margin: 0;
609
+ max-inline-size: 36rem;
610
+ opacity: 0.9;
611
+ }
612
+
613
+ .cg-close .cg-actions {
614
+ justify-content: center;
615
+ }
616
+
617
+ .cg-close .cg-action[data-emphasis="secondary"] {
618
+ border-color: color-mix(in oklab, var(--cg-canvas) 40%, transparent);
619
+ color: var(--cg-canvas);
620
+ }
621
+
622
+ .cg-close .cg-action[data-emphasis="secondary"]:hover {
623
+ border-color: var(--cg-canvas);
624
+ color: var(--cg-canvas);
625
+ }
626
+
627
+ /* --------------------------------------------------------------------------
628
+ mediaFigure
629
+ -------------------------------------------------------------------------- */
630
+
631
+ .cg-plate {
632
+ margin: 0;
633
+ }
634
+
635
+ .cg-plate__frame {
636
+ overflow: hidden;
637
+ border-radius: var(--cg-radius-md);
638
+ box-shadow: var(--cg-ring);
639
+ aspect-ratio: var(--cg-ratio, auto);
640
+ }
641
+
642
+ .cg-plate__media {
643
+ inline-size: 100%;
644
+ block-size: 100%;
645
+ object-fit: cover;
646
+ }
647
+
648
+ .cg-plate__caption {
649
+ margin-block-start: var(--cg-s3);
650
+ font-size: var(--cg-text-sm);
651
+ font-style: italic;
652
+ color: var(--cg-ink-muted);
653
+ text-align: center;
654
+ }
655
+
656
+ .cg-plate__credit {
657
+ display: block;
658
+ font-style: normal;
659
+ font-size: var(--cg-text-xs);
660
+ color: var(--cg-ink-subtle);
661
+ }
662
+
663
+ .cg-plate[data-align="wide"] {
664
+ max-inline-size: none;
665
+ }
666
+
667
+ .cg-plate[data-align="full"] {
668
+ max-inline-size: none;
669
+ margin-inline: calc(var(--cg-gutter) * -1);
670
+ }
671
+
672
+ .cg-plate[data-align="full"] .cg-plate__frame {
673
+ border-radius: 0;
674
+ }
675
+
676
+ /* --------------------------------------------------------------------------
677
+ featureGrid — "How we cook"
678
+ -------------------------------------------------------------------------- */
679
+
680
+ .cg-craft__items {
681
+ display: grid;
682
+ gap: var(--cg-s10);
683
+ grid-template-columns: 1fr;
684
+ text-align: center;
685
+ }
686
+
687
+ @media (min-width: 48rem) {
688
+ .cg-craft__items {
689
+ grid-template-columns: repeat(3, 1fr);
690
+ }
691
+ }
692
+
693
+ .cg-craft__mark {
694
+ display: inline-flex;
695
+ align-items: center;
696
+ justify-content: center;
697
+ inline-size: 3rem;
698
+ block-size: 3rem;
699
+ margin-block-end: var(--cg-s4);
700
+ border: 1px solid var(--cg-line-strong);
701
+ border-radius: 50%;
702
+ color: var(--cg-accent);
703
+ }
704
+
705
+ .cg-craft__glyph {
706
+ inline-size: 1.4rem;
707
+ block-size: 1.4rem;
708
+ }
709
+
710
+ .cg-craft__title {
711
+ margin: 0 0 var(--cg-s2);
712
+ font-size: var(--cg-text-lg);
713
+ font-weight: var(--cg-weight-regular);
714
+ }
715
+
716
+ .cg-craft__link {
717
+ color: inherit;
718
+ }
719
+
720
+ .cg-craft__text {
721
+ margin: 0;
722
+ color: var(--cg-ink-muted);
723
+ }
724
+
725
+ /* --------------------------------------------------------------------------
726
+ quote — the menu-insert pull-quote
727
+ -------------------------------------------------------------------------- */
728
+
729
+ .cg-line {
730
+ max-inline-size: var(--cg-page-narrow);
731
+ margin-inline: auto;
732
+ text-align: center;
733
+ }
734
+
735
+ .cg-line__text {
736
+ margin: 0 0 var(--cg-s4);
737
+ font-family: var(--cogenta-font-serif);
738
+ font-size: var(--cg-text-xl);
739
+ font-style: italic;
740
+ }
741
+
742
+ .cg-line__attribution {
743
+ display: flex;
744
+ flex-direction: column;
745
+ align-items: center;
746
+ gap: var(--cg-s2);
747
+ }
748
+
749
+ .cg-line__avatar {
750
+ inline-size: 3rem;
751
+ block-size: 3rem;
752
+ border-radius: 50%;
753
+ }
754
+
755
+ .cg-line__who {
756
+ display: flex;
757
+ flex-direction: column;
758
+ font-size: var(--cg-text-sm);
759
+ }
760
+
761
+ .cg-line__author {
762
+ font-weight: var(--cg-weight-medium);
763
+ }
764
+
765
+ .cg-line__role {
766
+ color: var(--cg-ink-muted);
767
+ }
768
+
769
+ /* --------------------------------------------------------------------------
770
+ faq
771
+ -------------------------------------------------------------------------- */
772
+
773
+ .cg-faq {
774
+ max-inline-size: var(--cg-page-narrow);
775
+ margin-inline: auto;
776
+ }
777
+
778
+ .cg-faq__item + .cg-faq__item {
779
+ border-block-start: 1px solid var(--cg-line-soft);
780
+ }
781
+
782
+ .cg-faq__question {
783
+ display: flex;
784
+ align-items: baseline;
785
+ gap: var(--cg-s4);
786
+ padding-block: var(--cg-s4);
787
+ cursor: pointer;
788
+ list-style: none;
789
+ font-size: var(--cg-text-lg);
790
+ }
791
+
792
+ .cg-faq__question::-webkit-details-marker {
793
+ display: none;
794
+ }
795
+
796
+ .cg-faq__index {
797
+ flex: 0 0 auto;
798
+ font-family: var(--cogenta-font-serif);
799
+ font-style: italic;
800
+ color: var(--cg-accent);
801
+ }
802
+
803
+ .cg-faq__question-text {
804
+ font-family: var(--cogenta-font-serif);
805
+ }
806
+
807
+ .cg-faq__answer {
808
+ padding-block-end: var(--cg-s5);
809
+ padding-inline-start: calc(var(--cg-s4) + 1.6em);
810
+ color: var(--cg-ink-muted);
811
+ }
812
+
813
+ /* --------------------------------------------------------------------------
814
+ logos — press mentions, held back until hovered
815
+ -------------------------------------------------------------------------- */
816
+
817
+ .cg-press__items {
818
+ display: flex;
819
+ flex-wrap: wrap;
820
+ justify-content: center;
821
+ align-items: center;
822
+ gap: var(--cg-s10);
823
+ }
824
+
825
+ .cg-press__logo {
826
+ max-block-size: 2.25rem;
827
+ inline-size: auto;
828
+ filter: grayscale(1);
829
+ opacity: 0.7;
830
+ transition:
831
+ opacity var(--cg-duration) var(--cg-ease),
832
+ filter var(--cg-duration) var(--cg-ease);
833
+ }
834
+
835
+ .cg-press__link:hover .cg-press__logo,
836
+ .cg-press__link:focus-visible .cg-press__logo {
837
+ filter: none;
838
+ opacity: 1;
839
+ }
840
+
841
+ /* --------------------------------------------------------------------------
842
+ logoStrip — trust badges, dense single row
843
+ -------------------------------------------------------------------------- */
844
+
845
+ .cg-press-strip {
846
+ margin: 0;
847
+ text-align: center;
848
+ }
849
+
850
+ .cg-press-strip__items {
851
+ display: flex;
852
+ flex-wrap: wrap;
853
+ justify-content: center;
854
+ align-items: center;
855
+ gap: var(--cg-s8);
856
+ }
857
+
858
+ .cg-press-strip__image {
859
+ max-block-size: 1.75rem;
860
+ inline-size: auto;
861
+ }
862
+
863
+ .cg-press-strip__caption {
864
+ margin-block-start: var(--cg-s4);
865
+ font-size: var(--cg-text-xs);
866
+ letter-spacing: var(--cg-tracking-caps);
867
+ text-transform: uppercase;
868
+ color: var(--cg-ink-subtle);
869
+ }
870
+
871
+ /* --------------------------------------------------------------------------
872
+ pricingTable — the set-menu comparison
873
+ -------------------------------------------------------------------------- */
874
+
875
+ .cg-set-menu__tiers {
876
+ display: grid;
877
+ gap: var(--cg-s6);
878
+ grid-template-columns: 1fr;
879
+ }
880
+
881
+ @media (min-width: 56rem) {
882
+ .cg-set-menu__tiers {
883
+ grid-template-columns: repeat(3, 1fr);
884
+ }
885
+ }
886
+
887
+ .cg-set-menu__tier {
888
+ display: flex;
889
+ flex-direction: column;
890
+ padding: var(--cg-s8);
891
+ border-radius: var(--cg-radius-md);
892
+ box-shadow: var(--cg-ring);
893
+ text-align: center;
894
+ }
895
+
896
+ .cg-set-menu__tier[data-highlighted="true"] {
897
+ box-shadow: var(--cg-ring-accent);
898
+ }
899
+
900
+ .cg-set-menu__name {
901
+ margin: 0 0 var(--cg-s3);
902
+ font-size: var(--cg-text-lg);
903
+ }
904
+
905
+ .cg-set-menu__price {
906
+ margin: 0 0 var(--cg-s5);
907
+ }
908
+
909
+ .cg-set-menu__amount {
910
+ font-family: var(--cogenta-font-serif);
911
+ font-size: var(--cg-text-2xl);
912
+ color: var(--cg-accent);
913
+ }
914
+
915
+ .cg-set-menu__interval {
916
+ margin-inline-start: 0.25em;
917
+ color: var(--cg-ink-muted);
918
+ }
919
+
920
+ .cg-set-menu__features {
921
+ flex: 1 1 auto;
922
+ margin: 0 0 var(--cg-s6);
923
+ padding: 0;
924
+ list-style: none;
925
+ color: var(--cg-ink-muted);
926
+ }
927
+
928
+ .cg-set-menu__feature {
929
+ padding-block: var(--cg-s2);
930
+ border-block-start: 1px solid var(--cg-line-soft);
931
+ }
932
+
933
+ .cg-set-menu__feature:first-child {
934
+ border-block-start: 0;
935
+ }
936
+
937
+ .cg-set-menu__action .cg-action {
938
+ inline-size: 100%;
939
+ }
940
+
941
+ /* --------------------------------------------------------------------------
942
+ statCounter
943
+ -------------------------------------------------------------------------- */
944
+
945
+ .cg-tallies__items {
946
+ display: flex;
947
+ flex-wrap: wrap;
948
+ justify-content: center;
949
+ gap: var(--cg-s10);
950
+ margin: 0;
951
+ padding: 0;
952
+ }
953
+
954
+ .cg-tally {
955
+ display: flex;
956
+ flex-direction: column;
957
+ align-items: center;
958
+ gap: var(--cg-s1);
959
+ text-align: center;
960
+ }
961
+
962
+ .cg-tally__value {
963
+ margin: 0;
964
+ font-family: var(--cogenta-font-serif);
965
+ font-size: var(--cg-text-2xl);
966
+ color: var(--cg-accent);
967
+ }
968
+
969
+ .cg-tally__label {
970
+ margin: 0;
971
+ font-size: var(--cg-text-xs);
972
+ letter-spacing: var(--cg-tracking-caps);
973
+ text-transform: uppercase;
974
+ color: var(--cg-ink-muted);
975
+ }