@cogenta/theme-portfolio 1.1.3 → 1.3.4

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 (128) hide show
  1. package/dist/src/index.d.ts +9 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +10 -1
  4. package/dist/src/index.js.map +1 -1
  5. package/dist/src/render/blocks/accordion.d.ts.map +1 -1
  6. package/dist/src/render/blocks/accordion.js +10 -18
  7. package/dist/src/render/blocks/accordion.js.map +1 -1
  8. package/dist/src/render/blocks/collection-list.d.ts +0 -20
  9. package/dist/src/render/blocks/collection-list.d.ts.map +1 -1
  10. package/dist/src/render/blocks/collection-list.js +59 -66
  11. package/dist/src/render/blocks/collection-list.js.map +1 -1
  12. package/dist/src/render/blocks/cta.d.ts +4 -4
  13. package/dist/src/render/blocks/cta.d.ts.map +1 -1
  14. package/dist/src/render/blocks/cta.js +15 -10
  15. package/dist/src/render/blocks/cta.js.map +1 -1
  16. package/dist/src/render/blocks/embed.d.ts.map +1 -1
  17. package/dist/src/render/blocks/embed.js +16 -31
  18. package/dist/src/render/blocks/embed.js.map +1 -1
  19. package/dist/src/render/blocks/faq.d.ts.map +1 -1
  20. package/dist/src/render/blocks/faq.js +12 -17
  21. package/dist/src/render/blocks/faq.js.map +1 -1
  22. package/dist/src/render/blocks/feature-grid.d.ts.map +1 -1
  23. package/dist/src/render/blocks/feature-grid.js +26 -23
  24. package/dist/src/render/blocks/feature-grid.js.map +1 -1
  25. package/dist/src/render/blocks/gallery.d.ts +0 -14
  26. package/dist/src/render/blocks/gallery.d.ts.map +1 -1
  27. package/dist/src/render/blocks/gallery.js +29 -21
  28. package/dist/src/render/blocks/gallery.js.map +1 -1
  29. package/dist/src/render/blocks/hero.d.ts +8 -8
  30. package/dist/src/render/blocks/hero.d.ts.map +1 -1
  31. package/dist/src/render/blocks/hero.js +17 -18
  32. package/dist/src/render/blocks/hero.js.map +1 -1
  33. package/dist/src/render/blocks/logo-strip.d.ts.map +1 -1
  34. package/dist/src/render/blocks/logo-strip.js +9 -14
  35. package/dist/src/render/blocks/logo-strip.js.map +1 -1
  36. package/dist/src/render/blocks/logos.d.ts.map +1 -1
  37. package/dist/src/render/blocks/logos.js +14 -19
  38. package/dist/src/render/blocks/logos.js.map +1 -1
  39. package/dist/src/render/blocks/media-figure.d.ts +8 -12
  40. package/dist/src/render/blocks/media-figure.d.ts.map +1 -1
  41. package/dist/src/render/blocks/media-figure.js +20 -20
  42. package/dist/src/render/blocks/media-figure.js.map +1 -1
  43. package/dist/src/render/blocks/pricing-table.d.ts.map +1 -1
  44. package/dist/src/render/blocks/pricing-table.js +17 -20
  45. package/dist/src/render/blocks/pricing-table.js.map +1 -1
  46. package/dist/src/render/blocks/prose.d.ts +10 -9
  47. package/dist/src/render/blocks/prose.d.ts.map +1 -1
  48. package/dist/src/render/blocks/prose.js +29 -10
  49. package/dist/src/render/blocks/prose.js.map +1 -1
  50. package/dist/src/render/blocks/quote.d.ts +5 -12
  51. package/dist/src/render/blocks/quote.d.ts.map +1 -1
  52. package/dist/src/render/blocks/quote.js +9 -15
  53. package/dist/src/render/blocks/quote.js.map +1 -1
  54. package/dist/src/render/blocks/stat-counter.d.ts.map +1 -1
  55. package/dist/src/render/blocks/stat-counter.js +10 -12
  56. package/dist/src/render/blocks/stat-counter.js.map +1 -1
  57. package/dist/src/render/blocks/stats.d.ts.map +1 -1
  58. package/dist/src/render/blocks/stats.js +7 -15
  59. package/dist/src/render/blocks/stats.js.map +1 -1
  60. package/dist/src/render/blocks/testimonial.d.ts +4 -14
  61. package/dist/src/render/blocks/testimonial.d.ts.map +1 -1
  62. package/dist/src/render/blocks/testimonial.js +9 -18
  63. package/dist/src/render/blocks/testimonial.js.map +1 -1
  64. package/dist/src/render/chrome.d.ts.map +1 -1
  65. package/dist/src/render/chrome.js +93 -90
  66. package/dist/src/render/chrome.js.map +1 -1
  67. package/dist/src/render/layout.d.ts +61 -0
  68. package/dist/src/render/layout.d.ts.map +1 -0
  69. package/dist/src/render/layout.js +134 -0
  70. package/dist/src/render/layout.js.map +1 -0
  71. package/dist/src/render/project.d.ts +27 -0
  72. package/dist/src/render/project.d.ts.map +1 -0
  73. package/dist/src/render/project.js +82 -0
  74. package/dist/src/render/project.js.map +1 -0
  75. package/dist/src/render/render-block.d.ts +17 -7
  76. package/dist/src/render/render-block.d.ts.map +1 -1
  77. package/dist/src/render/render-block.js +47 -34
  78. package/dist/src/render/render-block.js.map +1 -1
  79. package/dist/src/render/term-archive.d.ts +0 -11
  80. package/dist/src/render/term-archive.d.ts.map +1 -1
  81. package/dist/src/render/term-archive.js +36 -24
  82. package/dist/src/render/term-archive.js.map +1 -1
  83. package/dist/src/render/widget-areas.d.ts +14 -0
  84. package/dist/src/render/widget-areas.d.ts.map +1 -0
  85. package/dist/src/render/widget-areas.js +21 -0
  86. package/dist/src/render/widget-areas.js.map +1 -0
  87. package/dist/src/render/work.d.ts +37 -0
  88. package/dist/src/render/work.d.ts.map +1 -0
  89. package/dist/src/render/work.js +49 -0
  90. package/dist/src/render/work.js.map +1 -0
  91. package/dist/theme.config.d.ts +4 -7
  92. package/dist/theme.config.d.ts.map +1 -1
  93. package/dist/theme.config.js +6 -9
  94. package/dist/theme.config.js.map +1 -1
  95. package/package.json +4 -4
  96. package/src/index.ts +10 -1
  97. package/src/render/blocks/accordion.ts +22 -42
  98. package/src/render/blocks/collection-list.ts +83 -137
  99. package/src/render/blocks/cta.ts +24 -12
  100. package/src/render/blocks/embed.ts +39 -47
  101. package/src/render/blocks/faq.ts +24 -33
  102. package/src/render/blocks/feature-grid.ts +38 -41
  103. package/src/render/blocks/gallery.ts +34 -28
  104. package/src/render/blocks/hero.ts +31 -28
  105. package/src/render/blocks/logo-strip.ts +18 -20
  106. package/src/render/blocks/logos.ts +22 -43
  107. package/src/render/blocks/media-figure.ts +28 -20
  108. package/src/render/blocks/pricing-table.ts +31 -32
  109. package/src/render/blocks/prose.ts +38 -13
  110. package/src/render/blocks/quote.ts +18 -18
  111. package/src/render/blocks/stat-counter.ts +19 -37
  112. package/src/render/blocks/stats.ts +18 -33
  113. package/src/render/blocks/testimonial.ts +16 -22
  114. package/src/render/chrome.ts +99 -97
  115. package/src/render/layout.ts +177 -0
  116. package/src/render/project.ts +140 -0
  117. package/src/render/render-block.ts +49 -45
  118. package/src/render/term-archive.ts +92 -70
  119. package/src/render/widget-areas.ts +25 -0
  120. package/src/render/work.ts +124 -0
  121. package/src/styles/archive.css +61 -21
  122. package/src/styles/base.css +763 -648
  123. package/src/styles/blocks.css +697 -1093
  124. package/src/styles/theme.css +22 -10
  125. package/src/styles/tokens.css +174 -252
  126. package/src/styles/widgets.css +948 -0
  127. package/src/styles/work.css +405 -0
  128. package/tokens.json +19 -19
@@ -0,0 +1,948 @@
1
+ /*
2
+ * Widgets (contract D `theme@1.6`): the column beside an index of work or
3
+ * search results, the bands before and after a project, the footer columns.
4
+ *
5
+ * The host draws one markup for every theme (`cg-sidebar-layout`); this file
6
+ * sets it on the studio's own twelve columns. The content keeps the first
7
+ * eight, the column takes the last three, the columns the header's
8
+ * navigation and the footer's profiles already stand on, so its edge is a
9
+ * line the page already has. Every group opens the way a block of this theme
10
+ * does: a hairline in ink and a small label under it. Work keeps its 3:2
11
+ * cover, a list is a set of ruled rows like the index, a call to action is
12
+ * words underlined with an arrow after them. No box, no tint, no shadow.
13
+ */
14
+
15
+ /* --------------------------------------------------------------------------
16
+ The layout
17
+ -------------------------------------------------------------------------- */
18
+
19
+ .cg-sidebar-layout {
20
+ display: grid;
21
+ grid-template-columns: minmax(0, 1fr);
22
+ gap: 0;
23
+ inline-size: 100%;
24
+ max-inline-size: calc(var(--cg-page) + var(--cg-gutter) * 2);
25
+ margin-inline: auto;
26
+ padding-inline: var(--cg-gutter);
27
+ padding-block-end: 0;
28
+ }
29
+
30
+ .cg-sidebar-layout__content {
31
+ min-inline-size: 0;
32
+ }
33
+
34
+ /* Inside the content column the layout already holds the page's edges:
35
+ every block's container, and the parts of the pages the host renders,
36
+ start on its first pixel rather than a gutter further in. */
37
+ .cg-sidebar-layout__content :is(.cg-container, .cg-comments, .cg-form, .cg-form__confirmation),
38
+ .cg-sidebar-layout__content
39
+ > :is(
40
+ .cg-page__title,
41
+ .cg-search__form,
42
+ .cg-search__results,
43
+ .cg-search__empty,
44
+ .cg-search__error
45
+ ) {
46
+ max-inline-size: none;
47
+ padding-inline: 0;
48
+ }
49
+
50
+ /* A strip scrolls inside the column instead of reaching for the window's
51
+ edge, which the column no longer owns. */
52
+ .cg-sidebar-layout__content :is(.cg-strip, .cg-pictures__viewport) {
53
+ margin-inline: 0;
54
+ padding-inline: 0;
55
+ scroll-padding-inline: 0;
56
+ }
57
+
58
+ /* A band inside the column stops at the column, so its words keep a margin
59
+ from the edge of their ground. */
60
+ .cg-sidebar-layout__content
61
+ [data-block]:is([data-variant-background="muted"], [data-variant-background="image"])
62
+ > .cg-container {
63
+ padding-inline: var(--cg-s8);
64
+ }
65
+
66
+ /* Under the content on a phone, after the section's own step of space; the
67
+ page's own padding closes it. */
68
+ .cg-sidebar-layout__aside {
69
+ align-self: start;
70
+ min-inline-size: 0;
71
+ padding-block: var(--cg-s4) 0;
72
+ border: 0;
73
+ }
74
+
75
+ @media (min-width: 64rem) {
76
+ .cg-sidebar-layout {
77
+ grid-template-columns: repeat(var(--cg-columns), minmax(0, 1fr));
78
+ column-gap: var(--cg-col-gap);
79
+ }
80
+
81
+ .cg-sidebar-layout__content {
82
+ grid-column: 1 / span 8;
83
+ }
84
+
85
+ /* The column's first label sits on the line of the page head's first line
86
+ (an archive's kicker, a title's cap height), its hairline just above;
87
+ the ninth column is left empty as a margin. */
88
+ .cg-sidebar-layout__aside {
89
+ grid-column: 10 / span 3;
90
+ padding-block-start: calc(var(--cg-section) * 0.45 - var(--cg-s4) - var(--cg-rule));
91
+ }
92
+
93
+ /* Eight columns are narrower than a page: a title, a statement and running
94
+ text take more of their twelve, so they keep the proportion they have on
95
+ a page without the column. */
96
+ .cg-sidebar-layout__content
97
+ :is(
98
+ .cg-page-head__title,
99
+ .cg-archive__title,
100
+ .cg-project-head__title,
101
+ .cg-statement__eyebrow,
102
+ .cg-statement__title
103
+ ) {
104
+ grid-column: 1 / -1;
105
+ }
106
+
107
+ .cg-sidebar-layout__content .cg-project-head__statement {
108
+ grid-column: 3 / -1;
109
+ }
110
+
111
+ .cg-sidebar-layout__content .cg-statement__aside {
112
+ grid-column: 5 / -1;
113
+ }
114
+
115
+ .cg-sidebar-layout__content .cg-facts__item {
116
+ grid-column: span 6;
117
+ }
118
+
119
+ .cg-sidebar-layout__content .cg-prose__label {
120
+ grid-column: 1 / span 4;
121
+ }
122
+
123
+ .cg-sidebar-layout__content :is(.cg-prose__body, .cg-prose[data-label="true"] .cg-prose__body) {
124
+ grid-column: 5 / -1;
125
+ }
126
+
127
+ /* Two columns of text beside a column of widgets would be three: the case
128
+ study reads in one. */
129
+ .cg-sidebar-layout__content .cg-project .cg-prose[data-length="long"] .cg-prose__body,
130
+ .cg-project .cg-sidebar-layout__content .cg-prose[data-length="long"] .cg-prose__body {
131
+ columns: auto;
132
+ }
133
+
134
+ .cg-sidebar-layout__content .cg-split .cg-head {
135
+ grid-column: 1 / span 4;
136
+ }
137
+
138
+ .cg-sidebar-layout__content
139
+ :is(.cg-split .cg-head ~ *, .cg-split[data-titled="false"] .cg-container > *) {
140
+ grid-column: 5 / -1;
141
+ }
142
+
143
+ .cg-sidebar-layout__content .cg-contact__copy {
144
+ grid-column: 1 / span 4;
145
+ }
146
+
147
+ .cg-sidebar-layout__content :is(.cg-contact__lead, .cg-contact .cg-actions) {
148
+ grid-column: 5 / -1;
149
+ }
150
+
151
+ .cg-sidebar-layout__content .cg-grid__item:is([data-place="1"], [data-place="5"]) {
152
+ grid-column: span 7;
153
+ }
154
+
155
+ .cg-sidebar-layout__content .cg-grid__item:is([data-place="2"], [data-place="4"]) {
156
+ grid-column: span 5;
157
+ }
158
+
159
+ .cg-sidebar-layout__content .cg-grid__item[data-place="2"] {
160
+ grid-column: 8 / span 5;
161
+ }
162
+
163
+ .cg-sidebar-layout__content .cg-grid__item[data-place="5"] {
164
+ grid-column: 6 / span 7;
165
+ }
166
+
167
+ .cg-sidebar-layout__content .cg-comments > * {
168
+ grid-column: 1 / -1;
169
+ }
170
+
171
+ .cg-sidebar-layout__content .cg-figure[data-align="full"] .cg-figure__frame {
172
+ margin-inline: 0;
173
+ }
174
+ }
175
+
176
+ /* --------------------------------------------------------------------------
177
+ An area and its widgets
178
+ -------------------------------------------------------------------------- */
179
+
180
+ .cg-widget-area {
181
+ display: grid;
182
+ gap: var(--cg-s12);
183
+ align-content: start;
184
+ }
185
+
186
+ /* Every group opens like a block of this theme: a hairline in ink across
187
+ its width and the label under it. A widget without a title keeps the rule. */
188
+ .cg-widget {
189
+ min-inline-size: 0;
190
+ padding-block-start: var(--cg-s4);
191
+ border-block-start: var(--cg-rule) solid var(--cg-line-ink);
192
+ color: var(--cg-ink);
193
+ font-family: var(--cg-font);
194
+ }
195
+
196
+ .cg-widget__title {
197
+ margin: 0 0 var(--cg-s6);
198
+ color: var(--cg-ink);
199
+ font-family: var(--cg-font);
200
+ font-size: var(--cg-text-caption);
201
+ font-stretch: var(--cg-width-text);
202
+ font-weight: var(--cg-weight-medium);
203
+ line-height: var(--cg-leading-ui);
204
+ letter-spacing: var(--cg-tracking-caption);
205
+ text-transform: none;
206
+ }
207
+
208
+ .cg-widget__body {
209
+ font-size: var(--cg-text-md);
210
+ line-height: var(--cg-leading-ui);
211
+ }
212
+
213
+ .cg-widget__body :is(ul, ol) {
214
+ margin: 0;
215
+ padding: 0;
216
+ list-style: none;
217
+ }
218
+
219
+ .cg-widget__empty {
220
+ margin: 0;
221
+ color: var(--cg-ink-muted);
222
+ font-size: var(--cg-text-caption);
223
+ }
224
+
225
+ /* A band the host places outside the layout (the home page, a page opening
226
+ on its own statement, a project without a column): on the page's edges,
227
+ one section step from what comes before it. */
228
+ .cg-widget-area--placed {
229
+ box-sizing: border-box;
230
+ inline-size: 100%;
231
+ max-inline-size: calc(var(--cg-page) + var(--cg-gutter) * 2);
232
+ margin-inline: auto;
233
+ padding: calc(var(--cg-section) / 2) var(--cg-gutter);
234
+ }
235
+
236
+ .cg-sidebar-layout__content .cg-widget-area--placed {
237
+ max-inline-size: none;
238
+ padding-inline: 0;
239
+ }
240
+
241
+ /* Above a band the label is a section's label: the same distance to what
242
+ it names as `.cg-head`. */
243
+ .cg-widget-area--placed .cg-widget__title {
244
+ margin-block-end: var(--cg-s10);
245
+ }
246
+
247
+ /* Before the content, the page's own head keeps its step of space above it. */
248
+ .cg-widget-area--placed[data-area="content-before"] {
249
+ padding-block-end: 0;
250
+ }
251
+
252
+ .cg-widget-area--placed[data-area="sidebar"] {
253
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 18rem), 1fr));
254
+ gap: var(--cg-s12) var(--cg-col-gap);
255
+ border: 0;
256
+ }
257
+
258
+ .cg-widget-area--placed[data-area="sidebar"] .cg-widget__title {
259
+ margin-block-end: var(--cg-s6);
260
+ }
261
+
262
+ /* --------------------------------------------------------------------------
263
+ Lists: links, disciplines, clients, months, a table of contents. Ruled
264
+ rows, as in the index of work.
265
+ -------------------------------------------------------------------------- */
266
+
267
+ :is(
268
+ .cg-widget__links-item,
269
+ .cg-widget__terms-item,
270
+ .cg-widget__archives-item,
271
+ .cg-widget__toc-item
272
+ ) {
273
+ padding-block: var(--cg-s2);
274
+ border-block-end: var(--cg-rule) solid var(--cg-line);
275
+ }
276
+
277
+ :is(.cg-widget__links, .cg-widget__terms, .cg-widget__archives, .cg-widget__toc) > :first-child {
278
+ padding-block-start: 0;
279
+ }
280
+
281
+ :is(.cg-widget__terms-item, .cg-widget__archives-item) {
282
+ display: flex;
283
+ justify-content: space-between;
284
+ align-items: baseline;
285
+ gap: var(--cg-s4);
286
+ }
287
+
288
+ :is(.cg-widget__links, .cg-widget__terms, .cg-widget__archives, .cg-widget__toc) a,
289
+ .cg-widget__form-link,
290
+ .cg-widget__social a,
291
+ a.cg-widget__entry-title,
292
+ a.cg-widget__comment-entry {
293
+ color: var(--cg-ink);
294
+ text-decoration-line: underline;
295
+ text-decoration-thickness: var(--cg-rule);
296
+ text-decoration-color: transparent;
297
+ text-underline-offset: 0.25em;
298
+ }
299
+
300
+ :is(.cg-widget__links, .cg-widget__terms, .cg-widget__archives, .cg-widget__toc) a:hover,
301
+ .cg-widget__form-link:hover,
302
+ .cg-widget__social a:hover,
303
+ a.cg-widget__entry-title:hover,
304
+ a.cg-widget__comment-entry:hover {
305
+ text-decoration-color: currentColor;
306
+ }
307
+
308
+ /* The page being read keeps its name in ink, underlined in the signal: one
309
+ of the few details the signal is kept for. */
310
+ .cg-widget :is(a[aria-current="page"], [aria-current="page"] > a) {
311
+ font-weight: var(--cg-weight-semibold);
312
+ text-decoration-color: var(--cg-signal);
313
+ text-decoration-thickness: var(--cg-rule-strong);
314
+ }
315
+
316
+ .cg-widget__terms-item[data-depth="1"],
317
+ .cg-widget__toc-item[data-depth="1"] {
318
+ padding-inline-start: var(--cg-s4);
319
+ }
320
+
321
+ .cg-widget__terms-item[data-depth="2"],
322
+ .cg-widget__toc-item[data-depth="2"] {
323
+ padding-inline-start: var(--cg-s8);
324
+ }
325
+
326
+ :is(
327
+ .cg-widget__terms-count,
328
+ .cg-widget__archives-count,
329
+ .cg-widget__cloud-count,
330
+ .cg-widget__entry-date,
331
+ .cg-widget__comment-date
332
+ ) {
333
+ color: var(--cg-ink-muted);
334
+ font-size: var(--cg-text-caption);
335
+ font-variant-numeric: lining-nums tabular-nums;
336
+ }
337
+
338
+ .cg-widget__link {
339
+ display: inline-block;
340
+ }
341
+
342
+ /* Tags as a run of words, their weight a step of the type scale. */
343
+ .cg-widget__cloud {
344
+ display: flex;
345
+ flex-wrap: wrap;
346
+ align-items: baseline;
347
+ gap: var(--cg-s2) var(--cg-s5);
348
+ }
349
+
350
+ .cg-widget__cloud-item {
351
+ display: inline-flex;
352
+ align-items: baseline;
353
+ gap: var(--cg-s1);
354
+ line-height: var(--cg-leading-heading);
355
+ }
356
+
357
+ .cg-widget__cloud-item a {
358
+ color: var(--cg-ink);
359
+ text-decoration-color: transparent;
360
+ text-underline-offset: 0.2em;
361
+ }
362
+
363
+ .cg-widget__cloud-item a:hover {
364
+ text-decoration-color: currentColor;
365
+ }
366
+
367
+ .cg-widget__cloud-item[data-weight="1"] {
368
+ font-size: var(--cg-text-sm);
369
+ }
370
+
371
+ .cg-widget__cloud-item[data-weight="2"] {
372
+ font-size: var(--cg-text-caption);
373
+ }
374
+
375
+ .cg-widget__cloud-item[data-weight="3"] {
376
+ font-size: var(--cg-text-md);
377
+ }
378
+
379
+ .cg-widget__cloud-item[data-weight="4"] {
380
+ font-size: var(--cg-text-lg);
381
+ }
382
+
383
+ .cg-widget__cloud-item[data-weight="5"] {
384
+ font-size: var(--cg-text-xl);
385
+ font-stretch: var(--cg-width-display);
386
+ }
387
+
388
+ /* --------------------------------------------------------------------------
389
+ Work and comments: a cover at 3:2 over its title, the way the grid shows
390
+ a piece of work. An entry without a cover is a ruled row.
391
+ -------------------------------------------------------------------------- */
392
+
393
+ :is(.cg-widget__entries, .cg-widget__comments) {
394
+ display: grid;
395
+ gap: var(--cg-s8);
396
+ }
397
+
398
+ .cg-widget__entry,
399
+ .cg-widget__comment {
400
+ padding-block: 0;
401
+ border-block: 0;
402
+ }
403
+
404
+ .cg-widget__entry {
405
+ display: grid;
406
+ grid-template-columns: minmax(0, 1fr);
407
+ gap: var(--cg-s3);
408
+ align-items: start;
409
+ }
410
+
411
+ .cg-widget__entries:has(.cg-widget__entry[data-image="none"]) {
412
+ gap: 0;
413
+ }
414
+
415
+ .cg-widget__entry[data-image="none"] {
416
+ padding-block: var(--cg-s3);
417
+ border-block-end: var(--cg-rule) solid var(--cg-line);
418
+ }
419
+
420
+ .cg-widget__entry[data-image="none"]:first-child {
421
+ padding-block-start: 0;
422
+ }
423
+
424
+ .cg-widget__entry-image {
425
+ inline-size: 100%;
426
+ block-size: auto;
427
+ aspect-ratio: 3 / 2;
428
+ object-fit: cover;
429
+ background: var(--cg-surface-sunken);
430
+ }
431
+
432
+ .cg-widget__entry-text {
433
+ display: grid;
434
+ gap: var(--cg-s1);
435
+ }
436
+
437
+ .cg-widget__entry-title,
438
+ .cg-widget__comment-entry {
439
+ font-weight: var(--cg-weight-medium);
440
+ line-height: var(--cg-leading-ui);
441
+ }
442
+
443
+ /* A reader points at the cover as often as at the words: both underline the
444
+ title. */
445
+ .cg-widget__entry:hover a.cg-widget__entry-title {
446
+ text-decoration-color: currentColor;
447
+ }
448
+
449
+ .cg-widget__entry-excerpt,
450
+ .cg-widget__comment-excerpt {
451
+ margin: 0;
452
+ max-inline-size: var(--cg-measure-short);
453
+ color: var(--cg-ink-muted);
454
+ font-size: var(--cg-text-caption);
455
+ line-height: var(--cg-leading-ui);
456
+ }
457
+
458
+ .cg-widget__comment {
459
+ display: grid;
460
+ gap: var(--cg-s1);
461
+ }
462
+
463
+ .cg-widget__comment-author {
464
+ color: var(--cg-ink-muted);
465
+ font-size: var(--cg-text-caption);
466
+ }
467
+
468
+ /* Before and after the content, work is a row of covers across the grid;
469
+ on a phone, a strip that scrolls and snaps like the theme's own. */
470
+ .cg-widget-area:is([data-area="content-after"], [data-area="content-before"])
471
+ .cg-widget__entries:not(:has([data-image="none"])) {
472
+ grid-auto-flow: column;
473
+ grid-auto-columns: min(78vw, 30rem);
474
+ gap: var(--cg-col-gap);
475
+ overflow-x: auto;
476
+ overscroll-behavior-inline: contain;
477
+ scroll-snap-type: x mandatory;
478
+ scroll-padding-inline: var(--cg-gutter);
479
+ margin-inline: calc(var(--cg-gutter) * -1);
480
+ padding: 0 var(--cg-gutter) var(--cg-s4);
481
+ }
482
+
483
+ .cg-widget-area:is([data-area="content-after"], [data-area="content-before"])
484
+ .cg-widget__entries:not(:has([data-image="none"]))
485
+ .cg-widget__entry {
486
+ scroll-snap-align: start;
487
+ }
488
+
489
+ @media (min-width: 48rem) {
490
+ .cg-widget-area:is([data-area="content-after"], [data-area="content-before"])
491
+ .cg-widget__entries:not(:has([data-image="none"])) {
492
+ grid-auto-flow: row;
493
+ grid-auto-columns: auto;
494
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 14rem), 1fr));
495
+ row-gap: var(--cg-s12);
496
+ overflow: visible;
497
+ margin-inline: 0;
498
+ padding: 0;
499
+ }
500
+
501
+ .cg-widget-area:is([data-area="content-after"], [data-area="content-before"])
502
+ .cg-widget__entry-text {
503
+ font-size: var(--cg-size-work);
504
+ }
505
+ }
506
+
507
+ .cg-sidebar-layout__content
508
+ .cg-widget-area:is([data-area="content-after"], [data-area="content-before"])
509
+ .cg-widget__entries:not(:has([data-image="none"])) {
510
+ margin-inline: 0;
511
+ padding-inline: 0;
512
+ scroll-padding-inline: 0;
513
+ }
514
+
515
+ /* --------------------------------------------------------------------------
516
+ Words and pictures
517
+ -------------------------------------------------------------------------- */
518
+
519
+ .cg-widget__text :where(p, ul, ol, h2, h3, h4, blockquote) {
520
+ margin: 0;
521
+ }
522
+
523
+ .cg-widget__text
524
+ :where(p, ul, ol, h2, h3, h4, blockquote)
525
+ + :where(p, ul, ol, h2, h3, h4, blockquote) {
526
+ margin-block-start: 0.8em;
527
+ }
528
+
529
+ .cg-widget__text a {
530
+ color: var(--cg-ink);
531
+ text-decoration-color: var(--cg-line-strong);
532
+ }
533
+
534
+ .cg-widget__text a:hover {
535
+ text-decoration-color: currentColor;
536
+ }
537
+
538
+ .cg-widget__figure,
539
+ .cg-widget__embed,
540
+ .cg-widget__quote {
541
+ margin: 0;
542
+ }
543
+
544
+ :is(.cg-widget__image, .cg-widget__about-image, .cg-widget__gallery-image) {
545
+ display: block;
546
+ inline-size: 100%;
547
+ background: var(--cg-surface-sunken);
548
+ }
549
+
550
+ .cg-widget__caption {
551
+ margin-block-start: var(--cg-s2);
552
+ color: var(--cg-ink-muted);
553
+ font-size: var(--cg-text-caption);
554
+ line-height: var(--cg-leading-ui);
555
+ }
556
+
557
+ .cg-widget__frame {
558
+ inline-size: 100%;
559
+ aspect-ratio: 16 / 9;
560
+ border: 0;
561
+ background: var(--cg-surface-sunken);
562
+ }
563
+
564
+ .cg-widget__gallery {
565
+ display: grid;
566
+ grid-template-columns: repeat(3, minmax(0, 1fr));
567
+ gap: var(--cg-s2);
568
+ }
569
+
570
+ .cg-widget__gallery[data-columns="2"] {
571
+ grid-template-columns: repeat(2, minmax(0, 1fr));
572
+ }
573
+
574
+ .cg-widget__gallery[data-columns="4"] {
575
+ grid-template-columns: repeat(4, minmax(0, 1fr));
576
+ }
577
+
578
+ .cg-widget__gallery-image {
579
+ aspect-ratio: 1;
580
+ object-fit: cover;
581
+ }
582
+
583
+ /* A client's words, set like the quote block but at the column's size. */
584
+ .cg-widget__quote-text {
585
+ margin: 0;
586
+ font-family: var(--cg-font);
587
+ quotes: "\201C" "\201D" "\2018" "\2019";
588
+ font-size: var(--cg-text-lg);
589
+ font-stretch: var(--cg-width-display);
590
+ font-weight: var(--cg-weight-regular);
591
+ line-height: var(--cg-leading-lead);
592
+ letter-spacing: -0.01em;
593
+ }
594
+
595
+ .cg-widget__quote-text p {
596
+ margin: 0;
597
+ }
598
+
599
+ .cg-widget__quote-text p::before {
600
+ content: open-quote;
601
+ }
602
+
603
+ .cg-widget__quote-text p::after {
604
+ content: close-quote;
605
+ }
606
+
607
+ .cg-widget__quote-source {
608
+ display: grid;
609
+ gap: 0;
610
+ margin-block-start: var(--cg-s4);
611
+ font-size: var(--cg-text-caption);
612
+ line-height: var(--cg-leading-ui);
613
+ }
614
+
615
+ .cg-widget__quote-name {
616
+ color: var(--cg-ink);
617
+ font-weight: var(--cg-weight-medium);
618
+ }
619
+
620
+ .cg-widget__quote-role {
621
+ color: var(--cg-ink-muted);
622
+ font-size: inherit;
623
+ }
624
+
625
+ .cg-widget__about,
626
+ .cg-widget__cta {
627
+ display: grid;
628
+ gap: var(--cg-s3);
629
+ justify-items: start;
630
+ }
631
+
632
+ .cg-widget__about-image {
633
+ aspect-ratio: 3 / 2;
634
+ object-fit: cover;
635
+ margin-block-end: var(--cg-s2);
636
+ }
637
+
638
+ .cg-widget__about-heading,
639
+ .cg-widget__cta-heading {
640
+ margin: 0;
641
+ font-family: var(--cg-font);
642
+ color: var(--cg-ink);
643
+ font-size: var(--cg-text-lg);
644
+ font-stretch: var(--cg-width-display);
645
+ font-weight: var(--cg-weight-medium);
646
+ line-height: var(--cg-leading-heading);
647
+ letter-spacing: var(--cg-tracking-heading);
648
+ text-wrap: balance;
649
+ }
650
+
651
+ .cg-widget__about-body,
652
+ .cg-widget__cta-body {
653
+ margin: 0;
654
+ max-inline-size: var(--cg-measure-short);
655
+ color: var(--cg-ink-muted);
656
+ line-height: var(--cg-leading-text);
657
+ }
658
+
659
+ /* The call to action and the link under an introduction are the theme's
660
+ arrow link (`.cg-arrow-link`, `base.css`): words with one continuous
661
+ underline and an arrow after them, never a second filled rectangle beside
662
+ the work. The host floor's filled button is undone here. */
663
+ .cg-widget__cta-action,
664
+ .cg-widget__about-link {
665
+ display: inline-block;
666
+ margin-block-start: var(--cg-s2);
667
+ padding: 0;
668
+ border: 0;
669
+ background: none;
670
+ color: var(--cg-ink);
671
+ font-weight: var(--cg-weight-medium);
672
+ text-decoration-line: underline;
673
+ text-decoration-thickness: var(--cg-rule);
674
+ text-decoration-color: var(--cg-line-strong);
675
+ text-decoration-skip-ink: none;
676
+ text-underline-offset: 0.3em;
677
+ }
678
+
679
+ .cg-widget__cta-action::after,
680
+ .cg-widget__about-link::after {
681
+ content: "\2192" / "";
682
+ display: inline-block;
683
+ margin-inline-start: 0.4em;
684
+ }
685
+
686
+ .cg-widget__cta-action:hover,
687
+ .cg-widget__about-link:hover {
688
+ color: var(--cg-ink);
689
+ text-decoration-color: currentColor;
690
+ }
691
+
692
+ .cg-widget__contact {
693
+ display: grid;
694
+ gap: var(--cg-s2);
695
+ }
696
+
697
+ .cg-widget__body .cg-widget__contact-line {
698
+ display: flex;
699
+ gap: var(--cg-s3);
700
+ align-items: baseline;
701
+ margin: 0;
702
+ }
703
+
704
+ .cg-widget__contact-line a {
705
+ color: var(--cg-ink);
706
+ text-decoration-color: var(--cg-line-strong);
707
+ overflow-wrap: anywhere;
708
+ }
709
+
710
+ .cg-widget__contact-line a:hover {
711
+ text-decoration-color: currentColor;
712
+ }
713
+
714
+ .cg-widget__icon {
715
+ flex: none;
716
+ align-self: start;
717
+ margin-block-start: 0.2em;
718
+ color: var(--cg-ink-muted);
719
+ }
720
+
721
+ /* Hours are ruled rows: the day small, the time in figures that line up.
722
+ The rule runs unbroken under both, so the space between them is padding. */
723
+ .cg-widget__hours {
724
+ display: grid;
725
+ grid-template-columns: minmax(0, auto) minmax(0, 1fr);
726
+ gap: 0;
727
+ margin: var(--cg-s3) 0 0;
728
+ border-block-start: var(--cg-rule) solid var(--cg-line);
729
+ }
730
+
731
+ .cg-widget__hours :is(dt, dd) {
732
+ margin: 0;
733
+ padding-block: var(--cg-s2);
734
+ border-block-end: var(--cg-rule) solid var(--cg-line);
735
+ }
736
+
737
+ .cg-widget__hours-label {
738
+ color: var(--cg-ink-muted);
739
+ font-size: var(--cg-text-caption);
740
+ }
741
+
742
+ .cg-widget__hours-value {
743
+ padding-inline-start: var(--cg-s4);
744
+ font-variant-numeric: lining-nums tabular-nums;
745
+ }
746
+
747
+ /* The profiles keep their names, as in the footer. */
748
+ .cg-widget__social {
749
+ display: grid;
750
+ gap: var(--cg-s1);
751
+ }
752
+
753
+ .cg-widget__social a {
754
+ display: inline-flex;
755
+ align-items: center;
756
+ gap: var(--cg-s2);
757
+ min-block-size: 2rem;
758
+ }
759
+
760
+ .cg-widget__social .cg-visually-hidden {
761
+ position: static;
762
+ inline-size: auto;
763
+ block-size: auto;
764
+ margin: 0;
765
+ overflow: visible;
766
+ clip-path: none;
767
+ white-space: normal;
768
+ }
769
+
770
+ /* --------------------------------------------------------------------------
771
+ Search, a jump menu, a form: fields are a baseline, as on the search page
772
+ (`base.css` draws the field and the button).
773
+ -------------------------------------------------------------------------- */
774
+
775
+ /* In a narrow column the button goes under the field rather than squeezing
776
+ it. */
777
+ .cg-widget__search,
778
+ .cg-widget__jump {
779
+ display: flex;
780
+ flex-wrap: wrap;
781
+ align-items: end;
782
+ gap: var(--cg-s3);
783
+ }
784
+
785
+ .cg-widget__search-input,
786
+ .cg-widget__jump select {
787
+ flex: 1 1 9rem;
788
+ min-inline-size: 0;
789
+ }
790
+
791
+ .cg-widget__search-button,
792
+ .cg-widget__jump-button {
793
+ flex: none;
794
+ }
795
+
796
+ .cg-widget .cg-form {
797
+ display: grid;
798
+ gap: var(--cg-s5);
799
+ inline-size: auto;
800
+ max-inline-size: none;
801
+ margin: 0;
802
+ padding-inline: 0;
803
+ }
804
+
805
+ .cg-widget .cg-form__field {
806
+ margin-block-end: 0;
807
+ }
808
+
809
+ .cg-widget__form-submit {
810
+ justify-self: start;
811
+ }
812
+
813
+ /* --------------------------------------------------------------------------
814
+ A month of work
815
+ -------------------------------------------------------------------------- */
816
+
817
+ .cg-widget__calendar-table {
818
+ inline-size: 100%;
819
+ border-collapse: collapse;
820
+ font-size: var(--cg-text-caption);
821
+ font-variant-numeric: lining-nums tabular-nums;
822
+ text-align: center;
823
+ }
824
+
825
+ .cg-widget__calendar-table caption {
826
+ padding-block-end: var(--cg-s3);
827
+ font-weight: var(--cg-weight-medium);
828
+ text-align: start;
829
+ }
830
+
831
+ .cg-widget__calendar-table th {
832
+ padding-block: var(--cg-s2);
833
+ border-block-end: var(--cg-rule) solid var(--cg-line);
834
+ color: var(--cg-ink-muted);
835
+ font-weight: var(--cg-weight-regular);
836
+ }
837
+
838
+ .cg-widget__calendar-table td {
839
+ padding-block: var(--cg-s2);
840
+ color: var(--cg-ink-muted);
841
+ }
842
+
843
+ .cg-widget__calendar-table td[data-posts] a {
844
+ color: var(--cg-ink);
845
+ font-weight: var(--cg-weight-semibold);
846
+ text-decoration-color: currentColor;
847
+ }
848
+
849
+ .cg-widget__calendar-nav {
850
+ display: flex;
851
+ justify-content: space-between;
852
+ margin: var(--cg-s3) 0 0;
853
+ font-size: var(--cg-text-caption);
854
+ }
855
+
856
+ /* --------------------------------------------------------------------------
857
+ The footer's widget columns: a tier of their own at the top of the
858
+ colophon, under its hairline, on its twelve columns.
859
+ -------------------------------------------------------------------------- */
860
+
861
+ .cg-colophon__widgets {
862
+ display: grid;
863
+ grid-template-columns: minmax(0, 1fr);
864
+ gap: var(--cg-s10) var(--cg-col-gap);
865
+ padding-block-end: var(--cg-s12);
866
+ border-block-end: var(--cg-rule) solid var(--cg-line);
867
+ }
868
+
869
+ .cg-colophon__widgets .cg-widget-area {
870
+ gap: var(--cg-s10);
871
+ }
872
+
873
+ /* The colophon's own hairline opens the tier: the first group of each
874
+ column does not draw a second one under it. */
875
+ .cg-colophon__widgets .cg-widget:first-child {
876
+ padding-block-start: 0;
877
+ border-block-start: 0;
878
+ }
879
+
880
+ .cg-colophon__widgets .cg-widget__body {
881
+ font-size: var(--cg-text-caption);
882
+ }
883
+
884
+ @media (min-width: 40rem) {
885
+ .cg-colophon__widgets {
886
+ grid-template-columns: repeat(2, minmax(0, 1fr));
887
+ }
888
+
889
+ .cg-colophon__widgets[data-columns="1"] {
890
+ grid-template-columns: minmax(0, 1fr);
891
+ }
892
+ }
893
+
894
+ @media (min-width: 64rem) {
895
+ .cg-colophon__widgets {
896
+ grid-template-columns: repeat(var(--cg-columns), minmax(0, 1fr));
897
+ }
898
+
899
+ .cg-colophon__widgets > .cg-widget-area {
900
+ grid-column: span var(--cg-footer-widget-span, 3);
901
+ }
902
+
903
+ .cg-colophon__widgets[data-columns="1"] {
904
+ --cg-footer-widget-span: 12;
905
+ }
906
+
907
+ .cg-colophon__widgets[data-columns="2"] {
908
+ --cg-footer-widget-span: 6;
909
+ }
910
+
911
+ .cg-colophon__widgets[data-columns="3"] {
912
+ --cg-footer-widget-span: 4;
913
+ }
914
+
915
+ /* One column on its own is set like the theme's contact block: the label
916
+ on the first three columns, the words from the fourth. */
917
+ .cg-colophon__widgets[data-columns="1"] .cg-widget {
918
+ display: grid;
919
+ grid-template-columns: repeat(var(--cg-columns), minmax(0, 1fr));
920
+ column-gap: var(--cg-col-gap);
921
+ }
922
+
923
+ .cg-colophon__widgets[data-columns="1"] .cg-widget__title {
924
+ grid-column: 1 / span 3;
925
+ margin: 0;
926
+ }
927
+
928
+ .cg-colophon__widgets[data-columns="1"] .cg-widget__body {
929
+ grid-column: 4 / -1;
930
+ }
931
+ }
932
+
933
+ /* A call to action alone in the footer is the studio's invitation: the
934
+ heading at the size of the contact line, the rest in the colophon's size. */
935
+ .cg-colophon__widgets[data-columns="1"] .cg-widget__cta-heading {
936
+ max-inline-size: 22ch;
937
+ font-size: var(--cg-size-contact);
938
+ line-height: var(--cg-leading-title);
939
+ letter-spacing: var(--cg-tracking-display);
940
+ }
941
+
942
+ .cg-colophon__widgets[data-columns="1"] .cg-widget__cta {
943
+ gap: var(--cg-s4);
944
+ }
945
+
946
+ .cg-colophon__widgets .cg-widget__cta-action {
947
+ font-size: var(--cg-text-md);
948
+ }