@crombolo/cli 0.0.0-stage → 0.10.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 (97) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE +69 -0
  3. package/bin/crombolo.ts +2183 -0
  4. package/package.json +42 -4
  5. package/src/index.ts +7 -0
  6. package/src/operations/commands.ts +645 -0
  7. package/src/templates.ts +309 -0
  8. package/templates/basic/bundle/content/bundle.json +45 -0
  9. package/templates/basic/bundle/content/nodes/36955f6e-d110-469e-b280-72096eccd148.json +38 -0
  10. package/templates/basic/bundle/package.json +16 -0
  11. package/templates/basic/files/components/homePage.tsx +22 -0
  12. package/templates/basic/files/schema/content-types/home-page.toml +28 -0
  13. package/templates/basic/files/schema/schema.toml +2 -0
  14. package/templates/basic/template.json +4 -0
  15. package/templates/demo/harbourstone/CREDITS.md +42 -0
  16. package/templates/demo/harbourstone/bundle/content/blobs/180cc8ef/distillery-from-the-cliff-path.jpg +0 -0
  17. package/templates/demo/harbourstone/bundle/content/blobs/68c9cfdf/bottle-brine-and-kiln.jpg +0 -0
  18. package/templates/demo/harbourstone/bundle/content/blobs/6be45535/bottle-oloroso-pier.jpg +0 -0
  19. package/templates/demo/harbourstone/bundle/content/blobs/6d8d6398/bottle-the-cove.jpg +0 -0
  20. package/templates/demo/harbourstone/bundle/content/blobs/7b4713f8/copper-pot-stills.jpg +0 -0
  21. package/templates/demo/harbourstone/bundle/content/blobs/c114b7d8/bottle-neap-tide.jpg +0 -0
  22. package/templates/demo/harbourstone/bundle/content/blobs/fd337567/casks-in-the-sea-facing-warehouse.jpg +0 -0
  23. package/templates/demo/harbourstone/bundle/content/bundle.json +197 -0
  24. package/templates/demo/harbourstone/bundle/content/nodes/069cc3c5-c9f5-4792-90c9-e2bfcc4855b6.json +35 -0
  25. package/templates/demo/harbourstone/bundle/content/nodes/13788fe7-1a45-4b48-8ae4-f4227e154e1e.json +35 -0
  26. package/templates/demo/harbourstone/bundle/content/nodes/180cc8ef-caf1-4316-b6a7-e3b5aee41ffd.json +60 -0
  27. package/templates/demo/harbourstone/bundle/content/nodes/22144db2-e214-4006-a0bb-53b5bd121fd6.json +35 -0
  28. package/templates/demo/harbourstone/bundle/content/nodes/26e87610-e2d6-4b47-bf92-3967f7186907.json +35 -0
  29. package/templates/demo/harbourstone/bundle/content/nodes/2caa099b-3884-472d-9cea-797a0f0c376f.json +35 -0
  30. package/templates/demo/harbourstone/bundle/content/nodes/2efbdb5b-7888-4a49-bca5-c0f85b76e472.json +42 -0
  31. package/templates/demo/harbourstone/bundle/content/nodes/2fe03891-1294-4344-8e24-47e8b212e5b0.json +35 -0
  32. package/templates/demo/harbourstone/bundle/content/nodes/38b009f7-03c0-4fda-b5c7-843ad6044e9c.json +35 -0
  33. package/templates/demo/harbourstone/bundle/content/nodes/3d312cc8-2937-40e1-ba14-fd781c9a862d.json +95 -0
  34. package/templates/demo/harbourstone/bundle/content/nodes/3dc30fc1-973a-4217-b26f-24902210be17.json +35 -0
  35. package/templates/demo/harbourstone/bundle/content/nodes/40107d59-f3e9-4592-aee8-5b03d4586cbd.json +101 -0
  36. package/templates/demo/harbourstone/bundle/content/nodes/483a0d3b-a10c-4c9d-8c81-d9607d37e968.json +35 -0
  37. package/templates/demo/harbourstone/bundle/content/nodes/4b760c0b-b83a-4eee-aa29-c225cfabf19b.json +35 -0
  38. package/templates/demo/harbourstone/bundle/content/nodes/4e5c7f3f-54cb-4328-ad61-bc4c2736b890.json +35 -0
  39. package/templates/demo/harbourstone/bundle/content/nodes/62f479ff-0875-453e-99ae-3bf1bec5e3c8.json +35 -0
  40. package/templates/demo/harbourstone/bundle/content/nodes/68c9cfdf-6b40-47da-a1d2-17256a6cc6db.json +60 -0
  41. package/templates/demo/harbourstone/bundle/content/nodes/6ad8f0f3-9334-47f1-b805-80c4b4b4fa88.json +101 -0
  42. package/templates/demo/harbourstone/bundle/content/nodes/6be45535-83e5-4469-acf0-4127016721ae.json +60 -0
  43. package/templates/demo/harbourstone/bundle/content/nodes/6d8d6398-738f-4f38-ad3c-e5d6e9a971fe.json +60 -0
  44. package/templates/demo/harbourstone/bundle/content/nodes/7b4713f8-d917-457d-a9d8-7dd01a3617b4.json +60 -0
  45. package/templates/demo/harbourstone/bundle/content/nodes/88ec1185-53b5-439a-a2ce-3f56603be4ff.json +35 -0
  46. package/templates/demo/harbourstone/bundle/content/nodes/97469df2-107c-4010-8c14-4de88f735529.json +35 -0
  47. package/templates/demo/harbourstone/bundle/content/nodes/a2eb439f-71d9-4ea6-89d7-c5bc72618281.json +35 -0
  48. package/templates/demo/harbourstone/bundle/content/nodes/a562f0a2-cb6e-4ead-a1ce-4d180632419f.json +101 -0
  49. package/templates/demo/harbourstone/bundle/content/nodes/a5e36a18-a2ef-4eb5-85b4-7e12b21cca06.json +35 -0
  50. package/templates/demo/harbourstone/bundle/content/nodes/b1876d3a-50a7-4358-84bf-a0899932ffa9.json +35 -0
  51. package/templates/demo/harbourstone/bundle/content/nodes/b4e38bbd-c1a3-431a-b7a9-5868aa32993a.json +35 -0
  52. package/templates/demo/harbourstone/bundle/content/nodes/c114b7d8-0138-404b-9d8f-a39d992577a2.json +60 -0
  53. package/templates/demo/harbourstone/bundle/content/nodes/cb4c569e-c28a-43b6-a4d7-d33bb544e973.json +136 -0
  54. package/templates/demo/harbourstone/bundle/content/nodes/cd681b4b-9c4e-4624-9c13-450aa6a9c135.json +101 -0
  55. package/templates/demo/harbourstone/bundle/content/nodes/d60ef12b-0f0a-4db5-9763-21fa52b8d4da.json +150 -0
  56. package/templates/demo/harbourstone/bundle/content/nodes/d7f13222-d060-4496-b86d-bef21da963c1.json +35 -0
  57. package/templates/demo/harbourstone/bundle/content/nodes/f36dd4a9-927c-4ca3-a790-c9c859ac7302.json +35 -0
  58. package/templates/demo/harbourstone/bundle/content/nodes/fd337567-df67-41ca-ae94-9d84d8d6042f.json +60 -0
  59. package/templates/demo/harbourstone/bundle/package.json +16 -0
  60. package/templates/demo/harbourstone/files/components/pages/contactPage.tsx +36 -0
  61. package/templates/demo/harbourstone/files/components/pages/contentPage.tsx +54 -0
  62. package/templates/demo/harbourstone/files/components/pages/expression.tsx +33 -0
  63. package/templates/demo/harbourstone/files/components/pages/homePage.tsx +71 -0
  64. package/templates/demo/harbourstone/files/components/pages/whiskyList.tsx +19 -0
  65. package/templates/demo/harbourstone/files/components/shared/bottling.tsx +59 -0
  66. package/templates/demo/harbourstone/files/components/shared/highlights.tsx +39 -0
  67. package/templates/demo/harbourstone/files/components/shared/layout.tsx +49 -0
  68. package/templates/demo/harbourstone/files/components/shared/section-intro.tsx +40 -0
  69. package/templates/demo/harbourstone/files/components/shared/site-footer.tsx +14 -0
  70. package/templates/demo/harbourstone/files/components/shared/site-header.tsx +57 -0
  71. package/templates/demo/harbourstone/files/css/site.css +720 -0
  72. package/templates/demo/harbourstone/files/schema/content-types/contact-page.toml +75 -0
  73. package/templates/demo/harbourstone/files/schema/content-types/content-page.toml +89 -0
  74. package/templates/demo/harbourstone/files/schema/content-types/expression.toml +78 -0
  75. package/templates/demo/harbourstone/files/schema/content-types/highlight.toml +27 -0
  76. package/templates/demo/harbourstone/files/schema/content-types/home-page.toml +104 -0
  77. package/templates/demo/harbourstone/files/schema/content-types/tasting-note.toml +26 -0
  78. package/templates/demo/harbourstone/files/schema/content-types/whisky-list.toml +35 -0
  79. package/templates/demo/harbourstone/files/schema/data-types/highlight-picker.toml +10 -0
  80. package/templates/demo/harbourstone/files/schema/data-types/tasting-note-picker.toml +11 -0
  81. package/templates/demo/harbourstone/files/schema/forms/contact.toml +119 -0
  82. package/templates/demo/harbourstone/files/schema/schema.toml +2 -0
  83. package/templates/demo/harbourstone/template.json +10 -0
  84. package/templates/starter/bundle/content/bundle.json +49 -0
  85. package/templates/starter/bundle/content/nodes/634dd948-cf83-4cad-9b7b-7c938b33da76.json +62 -0
  86. package/templates/starter/bundle/content/nodes/64d95359-d91a-4050-b440-3e5124a74999.json +62 -0
  87. package/templates/starter/bundle/content/nodes/d2997ebb-36ca-47cb-bbc8-31fefca787c0.json +45 -0
  88. package/templates/starter/bundle/package.json +16 -0
  89. package/templates/starter/files/components/pages/contentPage.tsx +25 -0
  90. package/templates/starter/files/components/shared/layout.tsx +24 -0
  91. package/templates/starter/files/components/shared/site-footer.tsx +9 -0
  92. package/templates/starter/files/components/shared/site-header.tsx +40 -0
  93. package/templates/starter/files/css/site.css +117 -0
  94. package/templates/starter/files/schema/content-types/content-page.toml +51 -0
  95. package/templates/starter/files/schema/schema.toml +2 -0
  96. package/templates/starter/template.json +4 -0
  97. package/README.md +0 -3
@@ -0,0 +1,720 @@
1
+ /*
2
+ * Harbourstone: a coastal palette, a display serif for headings and a geometric
3
+ * sans for everything else. Hand-written rather than generated — the template
4
+ * ships a stylesheet, not a build step.
5
+ */
6
+
7
+ :root {
8
+ --paper: #efe8dc;
9
+ --foam: #f7f3eb;
10
+ --card: #fbf8f3;
11
+ --ink: #1a1612;
12
+ --muted: #6d6156;
13
+ --brass: #a6844a;
14
+ --brass-deep: #7a5c2e;
15
+ --sea: #24383c;
16
+ --line: #d8cebf;
17
+
18
+ --display: "Fraunces", "Iowan Old Style", "Palatino Linotype", Georgia, serif;
19
+ --sans: "Outfit", "Avenir Next", "Segoe UI", system-ui, sans-serif;
20
+
21
+ --measure: 72rem;
22
+ --gutter: clamp(1.25rem, 4vw, 2rem);
23
+
24
+ /* One duration, so `prefers-reduced-motion` turns every transition off by
25
+ * redefining it rather than by out-shouting each rule with `!important`. */
26
+ --ease: 0.2s;
27
+ }
28
+
29
+ @media (prefers-reduced-motion: reduce) {
30
+ :root {
31
+ --ease: 0s;
32
+ }
33
+ }
34
+
35
+ *,
36
+ *::before,
37
+ *::after {
38
+ box-sizing: border-box;
39
+ }
40
+
41
+ html {
42
+ -webkit-font-smoothing: antialiased;
43
+ -moz-osx-font-smoothing: grayscale;
44
+ }
45
+
46
+ body {
47
+ margin: 0;
48
+ background: var(--paper);
49
+ color: var(--ink);
50
+ font-family: var(--sans);
51
+ font-weight: 300;
52
+ line-height: 1.55;
53
+ }
54
+
55
+ h1,
56
+ h2,
57
+ h3 {
58
+ font-family: var(--display);
59
+ font-weight: 500;
60
+ letter-spacing: -0.02em;
61
+ line-height: 1.05;
62
+ text-wrap: balance;
63
+ margin: 0;
64
+ }
65
+
66
+ h1 {
67
+ font-size: clamp(2.75rem, 7vw, 4.5rem);
68
+ }
69
+
70
+ h2 {
71
+ font-size: clamp(2rem, 4vw, 3rem);
72
+ margin-top: 0.75rem;
73
+ }
74
+
75
+ h3 {
76
+ font-size: 1.75rem;
77
+ margin: 0.5rem 0 0;
78
+ }
79
+
80
+ p {
81
+ text-wrap: pretty;
82
+ }
83
+
84
+ img {
85
+ display: block;
86
+ width: 100%;
87
+ height: auto;
88
+ }
89
+
90
+ a {
91
+ color: inherit;
92
+ }
93
+
94
+ ::selection {
95
+ background: #e4d3ae;
96
+ color: var(--ink);
97
+ }
98
+
99
+ /* ------------------------------------------------------------ the shell */
100
+
101
+ main > section,
102
+ main > article,
103
+ .page-header {
104
+ margin: 0 auto;
105
+ padding-inline: var(--gutter);
106
+ max-width: var(--measure);
107
+ }
108
+
109
+ /* The rule under the masthead and over the footer runs the full width; the
110
+ * content inside them stops at the measure, which is what the inner div is
111
+ * for. */
112
+ .masthead {
113
+ position: sticky;
114
+ top: 0;
115
+ z-index: 30;
116
+ border-bottom: 1px solid var(--line);
117
+ background: color-mix(in srgb, var(--paper) 90%, transparent);
118
+ backdrop-filter: blur(12px);
119
+ }
120
+
121
+ .masthead__inner,
122
+ .site-footer__inner {
123
+ display: flex;
124
+ flex-wrap: wrap;
125
+ gap: 0.5rem 2rem;
126
+ align-items: center;
127
+ justify-content: space-between;
128
+ margin: 0 auto;
129
+ padding: 1rem var(--gutter);
130
+ max-width: var(--measure);
131
+ }
132
+
133
+ .wordmark {
134
+ font-family: var(--display);
135
+ font-size: 1.5rem;
136
+ letter-spacing: 0.01em;
137
+ text-decoration: none;
138
+ }
139
+
140
+ .wordmark span {
141
+ color: var(--brass-deep);
142
+ }
143
+
144
+ .masthead nav {
145
+ display: flex;
146
+ flex-wrap: wrap;
147
+ gap: 1.75rem;
148
+ }
149
+
150
+ .masthead nav a {
151
+ font-size: 0.75rem;
152
+ font-weight: 500;
153
+ letter-spacing: 0.18em;
154
+ text-transform: uppercase;
155
+ text-decoration: none;
156
+ color: var(--muted);
157
+ transition: color var(--ease);
158
+ }
159
+
160
+ .masthead nav a:hover,
161
+ .masthead nav a.here {
162
+ color: var(--brass-deep);
163
+ }
164
+
165
+ .site-footer {
166
+ margin-top: 5rem;
167
+ border-top: 1px solid var(--line);
168
+ font-size: 0.875rem;
169
+ color: var(--muted);
170
+ }
171
+
172
+ .site-footer__inner {
173
+ align-items: baseline;
174
+ padding-block: 2rem 3rem;
175
+ }
176
+
177
+ .site-footer p {
178
+ margin: 0;
179
+ }
180
+
181
+ /* ------------------------------------------------------- shared pieces */
182
+
183
+ .eyebrow {
184
+ margin: 0;
185
+ font-size: 0.75rem;
186
+ font-weight: 500;
187
+ letter-spacing: 0.22em;
188
+ text-transform: uppercase;
189
+ color: var(--brass-deep);
190
+ }
191
+
192
+ .eyebrow--light {
193
+ color: var(--brass);
194
+ }
195
+
196
+ .standfirst {
197
+ margin: 1.5rem 0 0;
198
+ max-width: 36rem;
199
+ font-size: 1.125rem;
200
+ color: var(--muted);
201
+ }
202
+
203
+ .page-header {
204
+ padding-block: 4rem 1.5rem;
205
+ }
206
+
207
+ .page-header h1 {
208
+ margin-top: 0.75rem;
209
+ max-width: 20ch;
210
+ }
211
+
212
+ .prose {
213
+ max-width: 38rem;
214
+ }
215
+
216
+ .prose p {
217
+ margin: 1.25rem 0 0;
218
+ color: var(--muted);
219
+ }
220
+
221
+ .prose h2 {
222
+ font-size: 1.75rem;
223
+ margin-top: 2rem;
224
+ }
225
+
226
+ .prose ul {
227
+ margin: 1.25rem 0 0;
228
+ padding-left: 1.25rem;
229
+ color: var(--muted);
230
+ }
231
+
232
+ .button {
233
+ display: inline-flex;
234
+ align-items: center;
235
+ min-height: 2.75rem;
236
+ margin-top: 2rem;
237
+ padding-inline: 1.25rem;
238
+ border: 1px solid var(--ink);
239
+ font-size: 0.75rem;
240
+ font-weight: 500;
241
+ letter-spacing: 0.18em;
242
+ text-transform: uppercase;
243
+ text-decoration: none;
244
+ transition:
245
+ background-color var(--ease),
246
+ color var(--ease);
247
+ }
248
+
249
+ .button:hover {
250
+ background: var(--ink);
251
+ color: var(--foam);
252
+ }
253
+
254
+ .button--light {
255
+ border-color: var(--brass);
256
+ color: var(--foam);
257
+ }
258
+
259
+ .button--light:hover {
260
+ background: var(--brass);
261
+ color: var(--ink);
262
+ }
263
+
264
+ /* ----------------------------------------------------------- home page */
265
+
266
+ .hero {
267
+ position: relative;
268
+ display: flex;
269
+ align-items: flex-end;
270
+ min-height: 88vh;
271
+ max-width: none;
272
+ padding: 7rem 0 4rem;
273
+ background: var(--sea);
274
+ color: var(--foam);
275
+ }
276
+
277
+ .hero__image {
278
+ position: absolute;
279
+ inset: 0;
280
+ height: 100%;
281
+ object-fit: cover;
282
+ }
283
+
284
+ .hero::after {
285
+ content: "";
286
+ position: absolute;
287
+ inset: 0;
288
+ background: linear-gradient(
289
+ to top,
290
+ color-mix(in srgb, var(--sea) 92%, transparent),
291
+ color-mix(in srgb, var(--sea) 70%, transparent) 24%,
292
+ color-mix(in srgb, var(--sea) 25%, transparent) 62%,
293
+ color-mix(in srgb, var(--sea) 10%, transparent)
294
+ );
295
+ }
296
+
297
+ .hero__text {
298
+ position: relative;
299
+ z-index: 1;
300
+ margin: 0 auto;
301
+ padding-inline: var(--gutter);
302
+ width: 100%;
303
+ max-width: var(--measure);
304
+ }
305
+
306
+ .hero__text h1 {
307
+ margin-top: 1rem;
308
+ font-size: clamp(3.5rem, 10vw, 7rem);
309
+ }
310
+
311
+ .hero__text .strapline {
312
+ margin: 1.25rem 0 0;
313
+ max-width: 32rem;
314
+ font-size: 1.125rem;
315
+ color: var(--foam);
316
+ }
317
+
318
+ .split {
319
+ display: grid;
320
+ gap: 2.5rem;
321
+ align-items: center;
322
+ padding-block: 5rem;
323
+ }
324
+
325
+ .split__image {
326
+ height: 28rem;
327
+ object-fit: cover;
328
+ }
329
+
330
+ .figures {
331
+ display: grid;
332
+ grid-template-columns: repeat(2, 1fr);
333
+ gap: 1.5rem;
334
+ margin: 2.5rem 0 0;
335
+ padding-top: 1.5rem;
336
+ border-top: 1px solid var(--line);
337
+ }
338
+
339
+ .figures dt {
340
+ font-family: var(--display);
341
+ font-size: 1.875rem;
342
+ }
343
+
344
+ .figures dd {
345
+ margin: 0.25rem 0 0;
346
+ font-size: 0.875rem;
347
+ color: var(--muted);
348
+ }
349
+
350
+ .band {
351
+ max-width: none;
352
+ padding-block: 5rem;
353
+ background: var(--foam);
354
+ }
355
+
356
+ .band > * {
357
+ margin-inline: auto;
358
+ max-width: var(--measure);
359
+ }
360
+
361
+ .band--dark {
362
+ background: var(--sea);
363
+ color: var(--foam);
364
+ }
365
+
366
+ .band--dark h2 {
367
+ color: var(--foam);
368
+ }
369
+
370
+ .band--dark .split {
371
+ padding-block: 0;
372
+ }
373
+
374
+ .highlight-rows {
375
+ margin: 2rem 0 0;
376
+ padding: 0;
377
+ list-style: none;
378
+ }
379
+
380
+ .highlight-rows li {
381
+ display: grid;
382
+ gap: 0.25rem;
383
+ padding-block: 1rem;
384
+ border-top: 1px solid color-mix(in srgb, var(--foam) 15%, transparent);
385
+ color: color-mix(in srgb, var(--foam) 80%, transparent);
386
+ }
387
+
388
+ .highlight-rows li:first-child {
389
+ border-top: 0;
390
+ }
391
+
392
+ .highlight-rows__heading {
393
+ font-family: var(--display);
394
+ font-size: 1.25rem;
395
+ color: var(--foam);
396
+ }
397
+
398
+ /* -------------------------------------------------------- the bottlings */
399
+
400
+ .bottlings {
401
+ display: grid;
402
+ gap: 1.25rem;
403
+ margin: 2.5rem 0 0;
404
+ padding: 0;
405
+ list-style: none;
406
+ }
407
+
408
+ .bottling-card {
409
+ border: 1px solid var(--line);
410
+ background: var(--card);
411
+ }
412
+
413
+ .bottling-card__image {
414
+ display: block;
415
+ background: var(--foam);
416
+ }
417
+
418
+ .bottling-card__image img {
419
+ height: 24rem;
420
+ object-fit: cover;
421
+ }
422
+
423
+ .bottling-card__text {
424
+ padding: 1.5rem;
425
+ }
426
+
427
+ .bottling-card h3 {
428
+ font-size: 1.875rem;
429
+ }
430
+
431
+ .bottling-card h3 a {
432
+ text-decoration: none;
433
+ }
434
+
435
+ .bottling-card h3 a:hover {
436
+ color: var(--brass-deep);
437
+ }
438
+
439
+ .bottling-card__text > p:not(.eyebrow) {
440
+ margin: 0.75rem 0 0;
441
+ color: var(--muted);
442
+ }
443
+
444
+ .bottlings--brief .bottling-card__text {
445
+ padding: 1.5rem;
446
+ }
447
+
448
+ .tasting {
449
+ display: grid;
450
+ gap: 0.75rem;
451
+ margin: 1.5rem 0 0;
452
+ }
453
+
454
+ .tasting dt {
455
+ font-size: 0.875rem;
456
+ font-weight: 500;
457
+ }
458
+
459
+ .tasting dd {
460
+ margin: 0;
461
+ font-size: 0.875rem;
462
+ color: var(--muted);
463
+ }
464
+
465
+ .bottling {
466
+ display: grid;
467
+ gap: 3rem;
468
+ padding-block: 3rem 4rem;
469
+ align-items: start;
470
+ }
471
+
472
+ .bottling__image {
473
+ background: var(--foam);
474
+ border: 1px solid var(--line);
475
+ }
476
+
477
+ .bottling__text h1 {
478
+ margin-top: 0.75rem;
479
+ font-size: clamp(2.5rem, 5vw, 3.5rem);
480
+ }
481
+
482
+ .back {
483
+ margin-top: 2.5rem;
484
+ color: var(--brass-deep);
485
+ font-size: 0.75rem;
486
+ font-weight: 500;
487
+ letter-spacing: 0.18em;
488
+ text-transform: uppercase;
489
+ }
490
+
491
+ /* ------------------------------------------------------------- contact */
492
+
493
+ .contact {
494
+ display: grid;
495
+ gap: 3rem;
496
+ padding-block: 3rem 4rem;
497
+ }
498
+
499
+ .contact__aside h2 {
500
+ font-size: 1.875rem;
501
+ }
502
+
503
+ .contact__aside img {
504
+ margin-top: 2rem;
505
+ height: 14rem;
506
+ object-fit: cover;
507
+ }
508
+
509
+ /* --------------------------------------------------------- the form ---
510
+ * `<Form>` emits its own class names, so a site themes the form by styling
511
+ * them. Nothing here is required for the form to work.
512
+ */
513
+
514
+ .crombolo-form fieldset {
515
+ margin: 0;
516
+ padding: 0;
517
+ border: 0;
518
+ }
519
+
520
+ .crombolo-form__group {
521
+ display: grid;
522
+ gap: 1.25rem;
523
+ }
524
+
525
+ .crombolo-form__group--columns-2 {
526
+ grid-template-columns: repeat(var(--crombolo-form-columns, 2), 1fr);
527
+ }
528
+
529
+ .crombolo-form__group-caption,
530
+ .crombolo-form__page-caption {
531
+ padding: 0;
532
+ font-size: 0.75rem;
533
+ font-weight: 500;
534
+ letter-spacing: 0.22em;
535
+ text-transform: uppercase;
536
+ color: var(--brass-deep);
537
+ }
538
+
539
+ .crombolo-form__label {
540
+ display: block;
541
+ font-size: 0.75rem;
542
+ font-weight: 500;
543
+ letter-spacing: 0.14em;
544
+ text-transform: uppercase;
545
+ color: var(--muted);
546
+ }
547
+
548
+ .crombolo-form__required {
549
+ margin-left: 0.25rem;
550
+ color: var(--brass-deep);
551
+ }
552
+
553
+ .crombolo-form__help {
554
+ margin: 0.25rem 0 0;
555
+ font-size: 0.8125rem;
556
+ color: var(--muted);
557
+ }
558
+
559
+ .crombolo-form input[type="text"],
560
+ .crombolo-form input[type="email"],
561
+ .crombolo-form input[type="tel"],
562
+ .crombolo-form input[type="number"],
563
+ .crombolo-form input[type="date"],
564
+ .crombolo-form select,
565
+ .crombolo-form textarea {
566
+ margin-top: 0.5rem;
567
+ padding: 0.75rem;
568
+ width: 100%;
569
+ border: 1px solid var(--line);
570
+ border-radius: 0;
571
+ background: var(--card);
572
+ color: var(--ink);
573
+ font: inherit;
574
+ font-size: 1rem;
575
+ transition: border-color var(--ease);
576
+ }
577
+
578
+ .crombolo-form textarea {
579
+ resize: vertical;
580
+ }
581
+
582
+ .crombolo-form :is(input, select, textarea):focus-visible {
583
+ outline: none;
584
+ border-color: var(--brass);
585
+ }
586
+
587
+ .crombolo-form__field--invalid :is(input, select, textarea) {
588
+ border-color: #9c3b2e;
589
+ }
590
+
591
+ .crombolo-form__error {
592
+ margin: 0.5rem 0 0;
593
+ font-size: 0.8125rem;
594
+ color: #9c3b2e;
595
+ }
596
+
597
+ .crombolo-form__summary {
598
+ margin-bottom: 1.5rem;
599
+ padding: 1rem;
600
+ border: 1px solid #9c3b2e;
601
+ background: color-mix(in srgb, #9c3b2e 6%, transparent);
602
+ color: #9c3b2e;
603
+ }
604
+
605
+ .crombolo-form__choices {
606
+ display: grid;
607
+ gap: 0.5rem;
608
+ margin-top: 0.5rem;
609
+ }
610
+
611
+ .crombolo-form__choice {
612
+ display: flex;
613
+ gap: 0.5rem;
614
+ align-items: center;
615
+ text-transform: none;
616
+ letter-spacing: normal;
617
+ font-size: 1rem;
618
+ color: var(--ink);
619
+ }
620
+
621
+ /* The label sits above its control everywhere else; a consent tick reads the
622
+ * other way round, so the two are swapped with grid placement rather than by
623
+ * changing what the renderer emits. */
624
+ .crombolo-form__field--dataConsent,
625
+ .crombolo-form__field--checkbox {
626
+ display: grid;
627
+ grid-template-columns: auto 1fr;
628
+ gap: 0.25rem 0.75rem;
629
+ align-items: start;
630
+ }
631
+
632
+ .crombolo-form__field--dataConsent > input,
633
+ .crombolo-form__field--checkbox > input {
634
+ grid-area: 1 / 1;
635
+ margin: 0.3rem 0 0;
636
+ accent-color: var(--brass-deep);
637
+ }
638
+
639
+ .crombolo-form__field--dataConsent > .crombolo-form__label,
640
+ .crombolo-form__field--checkbox > .crombolo-form__label {
641
+ grid-area: 1 / 2;
642
+ font-size: 0.9375rem;
643
+ letter-spacing: normal;
644
+ text-transform: none;
645
+ color: var(--ink);
646
+ }
647
+
648
+ .crombolo-form__field--dataConsent > :is(.crombolo-form__help, .crombolo-form__error),
649
+ .crombolo-form__field--checkbox > :is(.crombolo-form__help, .crombolo-form__error) {
650
+ grid-column: 2;
651
+ }
652
+
653
+ .crombolo-form__actions {
654
+ margin-top: 2rem;
655
+ }
656
+
657
+ .crombolo-form__submit {
658
+ min-height: 2.75rem;
659
+ padding-inline: 1.5rem;
660
+ border: 0;
661
+ background: var(--ink);
662
+ color: var(--foam);
663
+ font-family: inherit;
664
+ font-size: 0.75rem;
665
+ font-weight: 500;
666
+ letter-spacing: 0.16em;
667
+ text-transform: uppercase;
668
+ cursor: pointer;
669
+ transition: background-color var(--ease);
670
+ }
671
+
672
+ .crombolo-form__submit:hover {
673
+ background: var(--brass-deep);
674
+ }
675
+
676
+ .crombolo-form--submitted {
677
+ font-family: var(--display);
678
+ font-size: 1.5rem;
679
+ line-height: 1.3;
680
+ }
681
+
682
+ /* --------------------------------------------------------- wider than a
683
+ * phone. Everything above is the single-column case. */
684
+
685
+ @media (min-width: 48rem) {
686
+ .page-header {
687
+ padding-block: 6rem 1.5rem;
688
+ }
689
+
690
+ .split {
691
+ grid-template-columns: 1fr 1fr;
692
+ padding-block: 7rem;
693
+ }
694
+
695
+ .split--image-first .split__image {
696
+ order: -1;
697
+ }
698
+
699
+ .bottlings {
700
+ grid-template-columns: 1fr 1fr;
701
+ gap: 2rem;
702
+ }
703
+
704
+ .bottlings--brief {
705
+ gap: 1.25rem;
706
+ }
707
+
708
+ .bottling {
709
+ grid-template-columns: minmax(0, 2fr) 3fr;
710
+ }
711
+
712
+ .contact {
713
+ grid-template-columns: 3fr 2fr;
714
+ gap: 3rem;
715
+ }
716
+
717
+ .band--dark .split {
718
+ padding-block: 0;
719
+ }
720
+ }