jekyll-theme-zer0 1.28.0 → 1.30.0

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 (191) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1143 -13
  3. data/_data/README.md +2 -0
  4. data/_data/ai.yml +5 -3
  5. data/_data/ai_pricing.yml +36 -0
  6. data/_data/backlog.yml +507 -2
  7. data/_data/consumers.yml +157 -9
  8. data/_data/features.yml +303 -20
  9. data/_data/feedback_types.yml +17 -12
  10. data/_data/i18n/fr.yml +12 -7
  11. data/_data/i18n/manifest.yml +39 -12
  12. data/_data/ingredient_densities.yml +122 -0
  13. data/_data/landing.yml +5 -2
  14. data/_data/navigation/main.yml +16 -0
  15. data/_data/navigation/quickstart.yml +4 -0
  16. data/_data/recipe_courses.yml +64 -0
  17. data/_data/site_builder.yml +874 -0
  18. data/_data/theme-manifest.yml +160 -124
  19. data/_data/ui-text.yml +26 -0
  20. data/_includes/README.md +26 -2
  21. data/_includes/analytics/posthog.html +2 -2
  22. data/_includes/components/admin-links.html +2 -2
  23. data/_includes/components/admin-tabs.html +2 -2
  24. data/_includes/components/ai-chat.html +14 -11
  25. data/_includes/components/analytics-dashboard.html +8 -8
  26. data/_includes/components/author-bio.html +1 -1
  27. data/_includes/components/author-card.html +10 -2
  28. data/_includes/components/author-eeat.html +4 -4
  29. data/_includes/components/background-customizer.html +10 -10
  30. data/_includes/components/background-image.html +114 -0
  31. data/_includes/components/background-settings.html +28 -15
  32. data/_includes/components/collection-manager.html +5 -5
  33. data/_includes/components/component-showcase.html +13 -13
  34. data/_includes/components/config-editor.html +12 -12
  35. data/_includes/components/config-viewer.html +8 -8
  36. data/_includes/components/cookie-consent.html +15 -15
  37. data/_includes/components/cta-button.html +7 -2
  38. data/_includes/components/dev-shortcuts.html +7 -7
  39. data/_includes/components/env-dashboard.html +8 -8
  40. data/_includes/components/env-switcher.html +9 -9
  41. data/_includes/components/feature-card.html +2 -2
  42. data/_includes/components/halfmoon.html +2 -2
  43. data/_includes/components/info-section.html +42 -37
  44. data/_includes/components/js-cdn.html +15 -15
  45. data/_includes/components/language-toggle.html +168 -21
  46. data/_includes/components/mermaid.html +72 -435
  47. data/_includes/components/nanobar.html +5 -5
  48. data/_includes/components/nav-editor.html +2 -2
  49. data/_includes/components/nav-export.html +2 -2
  50. data/_includes/components/nav-overview.html +2 -2
  51. data/_includes/components/page-feedback.html +45 -30
  52. data/_includes/components/page-views-init.html +55 -0
  53. data/_includes/components/page-views.html +33 -0
  54. data/_includes/components/post-card.html +22 -22
  55. data/_includes/components/post-type-badge.html +2 -2
  56. data/_includes/components/powered-by.html +2 -2
  57. data/_includes/components/preview-image.html +6 -0
  58. data/_includes/components/quick-index.html +2 -2
  59. data/_includes/components/recipe-card.html +67 -0
  60. data/_includes/components/recipe-duration.html +50 -0
  61. data/_includes/components/recipe-grams.html +58 -0
  62. data/_includes/components/recipe-index.html +96 -0
  63. data/_includes/components/recipe-ingredients.html +90 -0
  64. data/_includes/components/recipe-meta.html +96 -0
  65. data/_includes/components/recipe-nutrition.html +57 -0
  66. data/_includes/components/recipe-qty.html +73 -0
  67. data/_includes/components/recipe-ratio.html +151 -0
  68. data/_includes/components/recipe-scaler.html +73 -0
  69. data/_includes/components/recipe-steps.html +86 -0
  70. data/_includes/components/recipe-temp.html +45 -0
  71. data/_includes/components/search-modal.html +29 -4
  72. data/_includes/components/searchbar.html +2 -2
  73. data/_includes/components/shortcuts-modal.html +3 -0
  74. data/_includes/components/svg-background.html +2 -2
  75. data/_includes/components/theme-customizer.html +2 -2
  76. data/_includes/components/theme-info.html +14 -7
  77. data/_includes/components/theme-preview-gallery.html +22 -22
  78. data/_includes/content/giscus.html +2 -2
  79. data/_includes/content/intro.html +8 -8
  80. data/_includes/content/jsonld-faq.html +2 -2
  81. data/_includes/content/jsonld-software.html +24 -5
  82. data/_includes/content/seo.html +4 -4
  83. data/_includes/content/sitemap.html +27 -27
  84. data/_includes/content/toc.html +183 -183
  85. data/_includes/core/branding.html +6 -6
  86. data/_includes/core/console-capture.html +32 -74
  87. data/_includes/core/favicon.html +49 -7
  88. data/_includes/core/footer-fabs.html +17 -3
  89. data/_includes/core/footer.html +49 -34
  90. data/_includes/core/head.html +110 -86
  91. data/_includes/core/header.html +76 -54
  92. data/_includes/docs/bootstrap-docs.html +8 -8
  93. data/_includes/landing/landing-install-cards.html +2 -2
  94. data/_includes/landing/landing-quick-links.html +1 -1
  95. data/_includes/navigation/admin-nav.html +2 -2
  96. data/_includes/navigation/nav-tree.html +8 -8
  97. data/_includes/navigation/navbar.html +12 -12
  98. data/_includes/navigation/section-sidebar.html +109 -27
  99. data/_includes/navigation/sidebar-config.html +36 -2
  100. data/_includes/navigation/sidebar-left.html +17 -16
  101. data/_includes/navigation/sidebar-right.html +8 -7
  102. data/_includes/obsidian/full-graph.html +2 -2
  103. data/_includes/setup/claude-session.html +72 -0
  104. data/_includes/setup/prereq-checklist.html +90 -0
  105. data/_includes/setup/wizard.html +924 -222
  106. data/_includes/stats/stats-categories.html +8 -8
  107. data/_includes/stats/stats-header.html +14 -14
  108. data/_includes/stats/stats-metrics.html +14 -14
  109. data/_includes/stats/stats-no-data.html +12 -12
  110. data/_includes/stats/stats-overview.html +6 -6
  111. data/_includes/stats/stats-tags.html +8 -8
  112. data/_layouts/404.html +38 -24
  113. data/_layouts/README.md +2 -0
  114. data/_layouts/admin.html +24 -24
  115. data/_layouts/article.html +43 -33
  116. data/_layouts/author.html +20 -20
  117. data/_layouts/authors.html +2 -2
  118. data/_layouts/book-abc.html +12 -12
  119. data/_layouts/book-story.html +15 -15
  120. data/_layouts/book.html +12 -12
  121. data/_layouts/collection.html +33 -33
  122. data/_layouts/cookbook.html +88 -0
  123. data/_layouts/default.html +31 -28
  124. data/_layouts/home.html +23 -23
  125. data/_layouts/index.html +10 -10
  126. data/_layouts/landing.html +17 -17
  127. data/_layouts/news.html +44 -44
  128. data/_layouts/note.html +38 -38
  129. data/_layouts/notebook.html +34 -34
  130. data/_layouts/recipe.html +274 -0
  131. data/_layouts/root.html +92 -55
  132. data/_layouts/section.html +62 -33
  133. data/_layouts/setup.html +3 -3
  134. data/_layouts/sitemap-collection.html +49 -49
  135. data/_layouts/stats.html +40 -40
  136. data/_layouts/tag.html +12 -12
  137. data/_layouts/welcome.html +21 -21
  138. data/_sass/components/_callout.scss +1 -1
  139. data/_sass/components/_footer.scss +37 -1
  140. data/_sass/components/_mermaid.scss +375 -0
  141. data/_sass/components/_page-views.scss +36 -0
  142. data/_sass/components/_recipe.scss +506 -0
  143. data/_sass/components/_setup-wizard.scss +764 -0
  144. data/_sass/components/_ui-enhancements.scss +6 -6
  145. data/_sass/core/_navbar.scss +261 -46
  146. data/_sass/layouts/_landing.scss +2 -2
  147. data/_sass/layouts/_navbar-extras.scss +14 -4
  148. data/_sass/tokens/_color.scss +6 -0
  149. data/_sass/tokens/_index.scss +2 -0
  150. data/_sass/tokens/_radius.scss +21 -0
  151. data/_sass/tokens/_typography.scss +4 -0
  152. data/_sass/utilities/_focus.scss +14 -0
  153. data/assets/css/main.scss +4 -0
  154. data/assets/js/ai-chat.js +47 -5
  155. data/assets/js/fleet-feedback-capture.js +124 -0
  156. data/assets/js/fleet-feedback.js +853 -0
  157. data/assets/js/mermaid-diagrams.js +1267 -0
  158. data/assets/js/modules/navigation/config.js +9 -6
  159. data/assets/js/modules/navigation/navbar.js +55 -0
  160. data/assets/js/modules/navigation/scroll-spy.js +315 -80
  161. data/assets/js/modules/theme/appearance.js +8 -2
  162. data/assets/js/obsidian-wiki-links.js +8 -3
  163. data/assets/js/page-feedback.js +125 -192
  164. data/assets/js/page-views.js +372 -0
  165. data/assets/js/recipe-scaler.js +501 -0
  166. data/assets/js/search-modal.js +36 -0
  167. data/assets/js/setup-wizard.js +2279 -226
  168. data/assets/js/site-builder.js +1834 -0
  169. data/assets/js/ui-enhancements.js +11 -3
  170. data/scripts/README.md +44 -0
  171. data/scripts/ai/README.md +38 -0
  172. data/scripts/ai/api_call.rb +124 -0
  173. data/scripts/ai/usage.rb +314 -0
  174. data/scripts/ai/usage_report.rb +225 -0
  175. data/scripts/bin/audit-consumer +39 -7
  176. data/scripts/bin/giscus-discussions +213 -14
  177. data/scripts/bin/manifest +35 -12
  178. data/scripts/ci/agent_review_result.py +164 -0
  179. data/scripts/ci/test_agent_review_result.py +172 -0
  180. data/scripts/ci/test_visual_evidence_autogen.py +341 -0
  181. data/scripts/ci/visual_evidence_autogen.py +1060 -0
  182. data/scripts/content-review.rb +20 -1
  183. data/scripts/design-system-check.rb +170 -0
  184. data/scripts/lib/audit.sh +42 -2
  185. data/scripts/lint-liquid-raw.rb +137 -0
  186. data/scripts/test/integration/mermaid +22 -8
  187. data/scripts/test/lib/run_tests.sh +3 -1
  188. data/scripts/test/lib/test_agent_review_result.sh +27 -0
  189. data/scripts/test/lib/test_visual_evidence_autogen.sh +24 -0
  190. data/scripts/translate.rb +94 -16
  191. metadata +48 -2
@@ -0,0 +1,506 @@
1
+ // ============================================================================
2
+ // COOKBOOK & RECIPES — structured recipe presentation (Feature: ZER0-084)
3
+ // ----------------------------------------------------------------------------
4
+ // Styles for the `recipes` collection: the recipe page (fact bar, scaler,
5
+ // ingredient checklist, method, ratio table, nutrition), the cookbook landing
6
+ // page, and the recipe index cards.
7
+ //
8
+ // Used by:
9
+ // _layouts/recipe.html, _layouts/cookbook.html
10
+ // _includes/components/recipe-{qty,temp,meta,scaler,ingredients,ratio,
11
+ // steps,nutrition,card,index}.html
12
+ //
13
+ // Theming: everything reads Bootstrap's runtime custom properties
14
+ // (var(--bs-*)) so light/dark color modes and theme skins work for free.
15
+ // Consumer knobs are exposed as --zer0-recipe-* custom properties.
16
+ // ============================================================================
17
+
18
+ :root {
19
+ --zer0-recipe-accent: var(--bs-primary);
20
+ --zer0-recipe-surface: var(--bs-tertiary-bg);
21
+ --zer0-recipe-radius: 0.75rem;
22
+ // Ingredient lists stay readable at a narrow measure even in a wide column.
23
+ --zer0-recipe-measure: 34rem;
24
+ }
25
+
26
+ // ----------------------------------------------------------------------------
27
+ // Page header
28
+ // ----------------------------------------------------------------------------
29
+ .recipe-header {
30
+ margin-bottom: 1.5rem;
31
+ }
32
+
33
+ .recipe-eyebrow {
34
+ margin-bottom: 0.35rem;
35
+ font-size: 0.875rem;
36
+ text-transform: uppercase;
37
+ letter-spacing: 0.04em;
38
+ color: var(--bs-secondary-color);
39
+
40
+ a {
41
+ color: inherit;
42
+ text-decoration: none;
43
+
44
+ &:hover,
45
+ &:focus-visible {
46
+ color: var(--zer0-recipe-accent);
47
+ text-decoration: underline;
48
+ }
49
+ }
50
+ }
51
+
52
+ .recipe-title {
53
+ margin-bottom: 0.5rem;
54
+ }
55
+
56
+ .recipe-description {
57
+ max-width: 46rem;
58
+ }
59
+
60
+ .recipe-hero-figure {
61
+ margin: 1.5rem 0 0;
62
+
63
+ img {
64
+ width: 100%;
65
+ height: auto;
66
+ border-radius: var(--zer0-recipe-radius);
67
+ }
68
+ }
69
+
70
+ .recipe-headnote {
71
+ max-width: 46rem;
72
+ margin-bottom: 1.5rem;
73
+ }
74
+
75
+ // ----------------------------------------------------------------------------
76
+ // Fact bar — prep/cook/total/makes/difficulty tiles
77
+ // ----------------------------------------------------------------------------
78
+ .recipe-meta {
79
+ display: flex;
80
+ flex-wrap: wrap;
81
+ gap: 0.5rem 1.5rem;
82
+ margin: 0 0 1.25rem;
83
+ padding: 0.875rem 1.125rem;
84
+ background-color: var(--zer0-recipe-surface);
85
+ border: 1px solid var(--bs-border-color);
86
+ border-radius: var(--zer0-recipe-radius);
87
+ }
88
+
89
+ .recipe-meta-item {
90
+ min-width: 6rem;
91
+
92
+ dt {
93
+ margin-bottom: 0.1rem;
94
+ font-size: 0.75rem;
95
+ font-weight: 500;
96
+ text-transform: uppercase;
97
+ letter-spacing: 0.04em;
98
+ color: var(--bs-secondary-color);
99
+ }
100
+
101
+ dd {
102
+ margin-bottom: 0;
103
+ font-weight: 600;
104
+ }
105
+ }
106
+
107
+ .recipe-meta-item--total dd {
108
+ color: var(--zer0-recipe-accent);
109
+ }
110
+
111
+ .recipe-difficulty {
112
+ font-weight: 600;
113
+
114
+ &--easy { color: var(--bs-success-text-emphasis); }
115
+ &--intermediate { color: var(--bs-warning-text-emphasis); }
116
+ &--advanced { color: var(--bs-danger-text-emphasis); }
117
+ }
118
+
119
+ // ----------------------------------------------------------------------------
120
+ // Scaler control bar
121
+ // ----------------------------------------------------------------------------
122
+ // Hidden until recipe-scaler.js reveals it: without JavaScript the controls
123
+ // would be dead buttons next to amounts they cannot change.
124
+ .recipe-scaler {
125
+ display: flex;
126
+ flex-wrap: wrap;
127
+ align-items: center;
128
+ gap: 0.75rem 1.25rem;
129
+ margin-bottom: 1.5rem;
130
+ padding: 0.75rem 1.125rem;
131
+ background-color: var(--bs-body-bg);
132
+ border: 1px solid var(--bs-border-color);
133
+ border-radius: var(--zer0-recipe-radius);
134
+
135
+ &[hidden] {
136
+ display: none;
137
+ }
138
+ }
139
+
140
+ .recipe-scaler-group {
141
+ display: flex;
142
+ align-items: center;
143
+ gap: 0.5rem;
144
+ }
145
+
146
+ .recipe-scaler-group--reset {
147
+ margin-inline-start: auto;
148
+ }
149
+
150
+ .recipe-scaler-label {
151
+ font-size: 0.75rem;
152
+ font-weight: 500;
153
+ text-transform: uppercase;
154
+ letter-spacing: 0.04em;
155
+ color: var(--bs-secondary-color);
156
+ }
157
+
158
+ .recipe-scaler-stepper {
159
+ width: auto;
160
+
161
+ .form-control {
162
+ max-width: 5rem;
163
+ }
164
+ }
165
+
166
+ .recipe-noscript {
167
+ margin-bottom: 1.5rem;
168
+ }
169
+
170
+ // A quantity the reader has rescaled or converted — a quiet marker, not a
171
+ // highlight, so a fully converted list does not turn into a wall of color.
172
+ .recipe-qty {
173
+ font-variant-numeric: tabular-nums;
174
+ font-weight: 600;
175
+ }
176
+
177
+ [data-scaled='true'] .recipe-qty {
178
+ color: var(--zer0-recipe-accent);
179
+ }
180
+
181
+ .recipe-temp {
182
+ white-space: nowrap;
183
+ }
184
+
185
+ // ----------------------------------------------------------------------------
186
+ // Section headings shared by ingredients / method / ratio / nutrition
187
+ // ----------------------------------------------------------------------------
188
+ .recipe-section-heading {
189
+ margin-bottom: 0.75rem;
190
+ font-size: 1.25rem;
191
+ padding-bottom: 0.4rem;
192
+ border-bottom: 2px solid var(--bs-border-color);
193
+ }
194
+
195
+ // ----------------------------------------------------------------------------
196
+ // Ingredients
197
+ // ----------------------------------------------------------------------------
198
+ .recipe-ingredients {
199
+ max-width: var(--zer0-recipe-measure);
200
+ margin-bottom: 2rem;
201
+ }
202
+
203
+ .recipe-ingredient-group-title {
204
+ margin: 1.25rem 0 0.5rem;
205
+ font-size: 0.8125rem;
206
+ font-weight: 600;
207
+ text-transform: uppercase;
208
+ letter-spacing: 0.05em;
209
+ color: var(--bs-secondary-color);
210
+ }
211
+
212
+ .recipe-ingredient-list {
213
+ margin-bottom: 0;
214
+ }
215
+
216
+ .recipe-ingredient {
217
+ padding: 0.3rem 0;
218
+ border-bottom: 1px solid var(--bs-border-color-translucent);
219
+
220
+ &:last-child {
221
+ border-bottom: 0;
222
+ }
223
+
224
+ .form-check-input {
225
+ margin-top: 0.35rem;
226
+ }
227
+
228
+ .form-check-label {
229
+ cursor: pointer;
230
+ }
231
+ }
232
+
233
+ .recipe-ingredient--done .form-check-label {
234
+ text-decoration: line-through;
235
+ opacity: 0.55;
236
+ }
237
+
238
+ .recipe-ingredient--optional .recipe-ingredient-name {
239
+ font-style: italic;
240
+ }
241
+
242
+ .recipe-ingredient-prep {
243
+ color: var(--bs-secondary-color);
244
+ }
245
+
246
+ .recipe-ingredient-note {
247
+ margin-left: 1.5rem;
248
+ }
249
+
250
+ .recipe-ingredient-badge {
251
+ font-size: 0.65rem;
252
+ vertical-align: middle;
253
+ }
254
+
255
+ // ----------------------------------------------------------------------------
256
+ // Equipment
257
+ // ----------------------------------------------------------------------------
258
+ .recipe-equipment {
259
+ max-width: var(--zer0-recipe-measure);
260
+ margin-bottom: 2rem;
261
+ }
262
+
263
+ .recipe-equipment-list li {
264
+ padding: 0.15rem 0;
265
+ color: var(--bs-body-color);
266
+ }
267
+
268
+ // ----------------------------------------------------------------------------
269
+ // Method
270
+ // ----------------------------------------------------------------------------
271
+ .recipe-steps {
272
+ margin-bottom: 2rem;
273
+ }
274
+
275
+ .recipe-steps-section-title {
276
+ margin: 1.5rem 0 0.75rem;
277
+ font-size: 0.8125rem;
278
+ font-weight: 600;
279
+ text-transform: uppercase;
280
+ letter-spacing: 0.05em;
281
+ color: var(--bs-secondary-color);
282
+ }
283
+
284
+ .recipe-step-list {
285
+ padding-left: 1.35rem;
286
+ margin-bottom: 0;
287
+ }
288
+
289
+ .recipe-step {
290
+ margin-bottom: 1.25rem;
291
+ padding-left: 0.35rem;
292
+
293
+ &::marker {
294
+ font-weight: 700;
295
+ color: var(--zer0-recipe-accent);
296
+ }
297
+
298
+ p:last-child {
299
+ margin-bottom: 0;
300
+ }
301
+ }
302
+
303
+ .recipe-step-title {
304
+ margin-bottom: 0.2rem;
305
+ font-weight: 600;
306
+ }
307
+
308
+ .recipe-step-facts {
309
+ display: flex;
310
+ flex-wrap: wrap;
311
+ gap: 0.25rem 1rem;
312
+ margin: 0.4rem 0 0;
313
+ font-size: 0.875rem;
314
+ color: var(--bs-secondary-color);
315
+ }
316
+
317
+ .recipe-step-figure {
318
+ margin: 0.75rem 0 0;
319
+
320
+ img {
321
+ max-width: 100%;
322
+ height: auto;
323
+ }
324
+ }
325
+
326
+ .recipe-step-note {
327
+ margin: 0.4rem 0 0;
328
+ padding-left: 0.75rem;
329
+ border-left: 3px solid var(--bs-border-color);
330
+ color: var(--bs-secondary-color);
331
+ }
332
+
333
+ // ----------------------------------------------------------------------------
334
+ // Ratio / baker's percentage table
335
+ // ----------------------------------------------------------------------------
336
+ .recipe-ratio {
337
+ margin-bottom: 2rem;
338
+ }
339
+
340
+ .recipe-ratio-intro {
341
+ max-width: 46rem;
342
+ }
343
+
344
+ .recipe-ratio-table {
345
+ td,
346
+ th {
347
+ font-variant-numeric: tabular-nums;
348
+ }
349
+
350
+ tfoot {
351
+ border-top: 2px solid var(--bs-border-color);
352
+ font-weight: 600;
353
+ }
354
+ }
355
+
356
+ // ----------------------------------------------------------------------------
357
+ // Notes & nutrition
358
+ // ----------------------------------------------------------------------------
359
+ .recipe-notes {
360
+ max-width: 46rem;
361
+ margin-bottom: 2rem;
362
+ }
363
+
364
+ .recipe-notes-list li {
365
+ margin-bottom: 0.5rem;
366
+ }
367
+
368
+ .recipe-nutrition {
369
+ margin-bottom: 2rem;
370
+ }
371
+
372
+ .recipe-nutrition-grid {
373
+ display: grid;
374
+ grid-template-columns: repeat(auto-fill, minmax(7rem, 1fr));
375
+ gap: 0.75rem;
376
+ margin-bottom: 0;
377
+ }
378
+
379
+ .recipe-nutrition-item {
380
+ padding: 0.6rem 0.75rem;
381
+ background-color: var(--zer0-recipe-surface);
382
+ border-radius: calc(var(--zer0-recipe-radius) / 1.5);
383
+ text-align: center;
384
+
385
+ dt {
386
+ font-size: 0.7rem;
387
+ font-weight: 500;
388
+ text-transform: uppercase;
389
+ letter-spacing: 0.04em;
390
+ color: var(--bs-secondary-color);
391
+ }
392
+
393
+ dd {
394
+ margin-bottom: 0;
395
+ font-weight: 600;
396
+ font-variant-numeric: tabular-nums;
397
+ }
398
+ }
399
+
400
+ // ----------------------------------------------------------------------------
401
+ // Recipe cards + index
402
+ // ----------------------------------------------------------------------------
403
+ .recipe-card {
404
+ height: 100%;
405
+ overflow: hidden;
406
+ background-color: var(--bs-body-bg);
407
+ border: 1px solid var(--bs-border-color);
408
+ border-radius: var(--zer0-recipe-radius);
409
+ transition: transform 0.2s ease, box-shadow 0.2s ease;
410
+
411
+ @media (prefers-reduced-motion: reduce) {
412
+ transition: none;
413
+ }
414
+
415
+ &:hover,
416
+ &:focus-within {
417
+ transform: translateY(-0.2rem);
418
+ box-shadow: var(--bs-box-shadow, 0 0.5rem 1rem rgba(0, 0, 0, 0.15));
419
+ }
420
+ }
421
+
422
+ .recipe-card-media {
423
+ aspect-ratio: 3 / 2;
424
+ overflow: hidden;
425
+ background-color: var(--bs-secondary-bg);
426
+
427
+ img {
428
+ width: 100%;
429
+ height: 100%;
430
+ object-fit: cover;
431
+ display: block;
432
+ }
433
+ }
434
+
435
+ .recipe-card-body {
436
+ padding: 0.875rem 1rem 1rem;
437
+ }
438
+
439
+ .recipe-card-title {
440
+ margin-bottom: 0.35rem;
441
+ }
442
+
443
+ .recipe-card-description {
444
+ margin-bottom: 0.5rem;
445
+ }
446
+
447
+ .recipe-card-facts {
448
+ display: flex;
449
+ flex-wrap: wrap;
450
+ align-items: center;
451
+ }
452
+
453
+ .recipe-course {
454
+ scroll-margin-top: 5rem;
455
+ }
456
+
457
+ // ----------------------------------------------------------------------------
458
+ // Cookbook landing page
459
+ // ----------------------------------------------------------------------------
460
+ .cookbook-header {
461
+ margin-bottom: 2rem;
462
+ }
463
+
464
+ .cookbook-cover img {
465
+ width: 100%;
466
+ height: auto;
467
+ border-radius: 0.35rem 0.75rem 0.75rem 0.35rem;
468
+ box-shadow:
469
+ inset 0.35rem 0 0.5rem -0.35rem rgba(0, 0, 0, 0.4),
470
+ 0 0.6rem 1.25rem rgba(0, 0, 0, 0.2);
471
+ }
472
+
473
+ .cookbook-about {
474
+ max-width: 46rem;
475
+ margin-bottom: 2rem;
476
+ }
477
+
478
+ .cookbook-jump {
479
+ display: flex;
480
+ flex-wrap: wrap;
481
+ gap: 0.5rem;
482
+ margin-bottom: 2rem;
483
+ }
484
+
485
+ // ----------------------------------------------------------------------------
486
+ // Print — a recipe printed from the browser is a recipe card on the counter.
487
+ // ----------------------------------------------------------------------------
488
+ @media print {
489
+ .recipe-scaler,
490
+ .recipe-noscript {
491
+ display: none !important;
492
+ }
493
+
494
+ .recipe-ingredient .form-check-input {
495
+ // Keep the tick boxes: they are useful on paper too, but flat.
496
+ box-shadow: none;
497
+ }
498
+
499
+ .recipe-step {
500
+ break-inside: avoid;
501
+ }
502
+
503
+ .recipe-card {
504
+ box-shadow: none;
505
+ }
506
+ }