@cogenta/theme-magazine 1.1.2 → 1.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/dist/src/index.d.ts +3 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +3 -0
  4. package/dist/src/index.js.map +1 -1
  5. package/dist/src/render/article.d.ts +32 -0
  6. package/dist/src/render/article.d.ts.map +1 -0
  7. package/dist/src/render/article.js +137 -0
  8. package/dist/src/render/article.js.map +1 -0
  9. package/dist/src/render/blocks/accordion.d.ts.map +1 -1
  10. package/dist/src/render/blocks/accordion.js +9 -13
  11. package/dist/src/render/blocks/accordion.js.map +1 -1
  12. package/dist/src/render/blocks/collection-list.d.ts.map +1 -1
  13. package/dist/src/render/blocks/collection-list.js +91 -118
  14. package/dist/src/render/blocks/collection-list.js.map +1 -1
  15. package/dist/src/render/blocks/cta.d.ts +4 -4
  16. package/dist/src/render/blocks/cta.d.ts.map +1 -1
  17. package/dist/src/render/blocks/cta.js +7 -9
  18. package/dist/src/render/blocks/cta.js.map +1 -1
  19. package/dist/src/render/blocks/embed.d.ts.map +1 -1
  20. package/dist/src/render/blocks/embed.js +17 -20
  21. package/dist/src/render/blocks/embed.js.map +1 -1
  22. package/dist/src/render/blocks/faq.d.ts.map +1 -1
  23. package/dist/src/render/blocks/faq.js +12 -11
  24. package/dist/src/render/blocks/faq.js.map +1 -1
  25. package/dist/src/render/blocks/feature-grid.d.ts.map +1 -1
  26. package/dist/src/render/blocks/feature-grid.js +13 -20
  27. package/dist/src/render/blocks/feature-grid.js.map +1 -1
  28. package/dist/src/render/blocks/gallery.d.ts +6 -6
  29. package/dist/src/render/blocks/gallery.d.ts.map +1 -1
  30. package/dist/src/render/blocks/gallery.js +15 -13
  31. package/dist/src/render/blocks/gallery.js.map +1 -1
  32. package/dist/src/render/blocks/hero.d.ts +6 -5
  33. package/dist/src/render/blocks/hero.d.ts.map +1 -1
  34. package/dist/src/render/blocks/hero.js +15 -14
  35. package/dist/src/render/blocks/hero.js.map +1 -1
  36. package/dist/src/render/blocks/logo-strip.d.ts.map +1 -1
  37. package/dist/src/render/blocks/logo-strip.js +8 -11
  38. package/dist/src/render/blocks/logo-strip.js.map +1 -1
  39. package/dist/src/render/blocks/logos.d.ts.map +1 -1
  40. package/dist/src/render/blocks/logos.js +16 -16
  41. package/dist/src/render/blocks/logos.js.map +1 -1
  42. package/dist/src/render/blocks/media-figure.d.ts +8 -8
  43. package/dist/src/render/blocks/media-figure.d.ts.map +1 -1
  44. package/dist/src/render/blocks/media-figure.js +23 -19
  45. package/dist/src/render/blocks/media-figure.js.map +1 -1
  46. package/dist/src/render/blocks/pricing-table.d.ts.map +1 -1
  47. package/dist/src/render/blocks/pricing-table.js +19 -22
  48. package/dist/src/render/blocks/pricing-table.js.map +1 -1
  49. package/dist/src/render/blocks/prose.d.ts +6 -10
  50. package/dist/src/render/blocks/prose.d.ts.map +1 -1
  51. package/dist/src/render/blocks/prose.js +8 -11
  52. package/dist/src/render/blocks/prose.js.map +1 -1
  53. package/dist/src/render/blocks/quote.d.ts +6 -9
  54. package/dist/src/render/blocks/quote.d.ts.map +1 -1
  55. package/dist/src/render/blocks/quote.js +11 -13
  56. package/dist/src/render/blocks/quote.js.map +1 -1
  57. package/dist/src/render/blocks/stat-counter.d.ts.map +1 -1
  58. package/dist/src/render/blocks/stat-counter.js +9 -10
  59. package/dist/src/render/blocks/stat-counter.js.map +1 -1
  60. package/dist/src/render/blocks/stats.d.ts.map +1 -1
  61. package/dist/src/render/blocks/stats.js +9 -12
  62. package/dist/src/render/blocks/stats.js.map +1 -1
  63. package/dist/src/render/blocks/testimonial.d.ts +4 -13
  64. package/dist/src/render/blocks/testimonial.d.ts.map +1 -1
  65. package/dist/src/render/blocks/testimonial.js +7 -15
  66. package/dist/src/render/blocks/testimonial.js.map +1 -1
  67. package/dist/src/render/chrome.d.ts.map +1 -1
  68. package/dist/src/render/chrome.js +109 -97
  69. package/dist/src/render/chrome.js.map +1 -1
  70. package/dist/src/render/layout.d.ts +28 -0
  71. package/dist/src/render/layout.d.ts.map +1 -0
  72. package/dist/src/render/layout.js +72 -0
  73. package/dist/src/render/layout.js.map +1 -0
  74. package/dist/src/render/render-block.d.ts +15 -13
  75. package/dist/src/render/render-block.d.ts.map +1 -1
  76. package/dist/src/render/render-block.js +53 -29
  77. package/dist/src/render/render-block.js.map +1 -1
  78. package/dist/src/render/story.d.ts +41 -0
  79. package/dist/src/render/story.d.ts.map +1 -0
  80. package/dist/src/render/story.js +65 -0
  81. package/dist/src/render/story.js.map +1 -0
  82. package/dist/src/render/term-archive.d.ts +0 -10
  83. package/dist/src/render/term-archive.d.ts.map +1 -1
  84. package/dist/src/render/term-archive.js +42 -19
  85. package/dist/src/render/term-archive.js.map +1 -1
  86. package/dist/src/render/widget-areas.d.ts +12 -0
  87. package/dist/src/render/widget-areas.d.ts.map +1 -0
  88. package/dist/src/render/widget-areas.js +19 -0
  89. package/dist/src/render/widget-areas.js.map +1 -0
  90. package/dist/theme.config.js +2 -2
  91. package/dist/theme.config.js.map +1 -1
  92. package/package.json +5 -5
  93. package/src/index.ts +3 -0
  94. package/src/render/article.ts +239 -0
  95. package/src/render/blocks/accordion.ts +23 -30
  96. package/src/render/blocks/collection-list.ts +161 -225
  97. package/src/render/blocks/cta.ts +19 -13
  98. package/src/render/blocks/embed.ts +40 -36
  99. package/src/render/blocks/faq.ts +31 -36
  100. package/src/render/blocks/feature-grid.ts +26 -36
  101. package/src/render/blocks/gallery.ts +24 -18
  102. package/src/render/blocks/hero.ts +32 -32
  103. package/src/render/blocks/logo-strip.ts +17 -17
  104. package/src/render/blocks/logos.ts +23 -31
  105. package/src/render/blocks/media-figure.ts +36 -20
  106. package/src/render/blocks/pricing-table.ts +29 -34
  107. package/src/render/blocks/prose.ts +13 -13
  108. package/src/render/blocks/quote.ts +24 -24
  109. package/src/render/blocks/stat-counter.ts +16 -24
  110. package/src/render/blocks/stats.ts +14 -24
  111. package/src/render/blocks/testimonial.ts +12 -17
  112. package/src/render/chrome.ts +123 -104
  113. package/src/render/layout.ts +105 -0
  114. package/src/render/render-block.ts +61 -33
  115. package/src/render/story.ts +139 -0
  116. package/src/render/term-archive.ts +111 -58
  117. package/src/render/widget-areas.ts +22 -0
  118. package/src/styles/archive.css +114 -17
  119. package/src/styles/article.css +237 -0
  120. package/src/styles/base.css +848 -591
  121. package/src/styles/blocks.css +903 -921
  122. package/src/styles/stories.css +593 -0
  123. package/src/styles/theme.css +28 -9
  124. package/src/styles/tokens.css +200 -185
  125. package/src/styles/widgets.css +614 -0
  126. package/tokens.json +18 -18
@@ -0,0 +1,593 @@
1
+ /*
2
+ * Stories as a newspaper lists them: the story unit, then the four forms a
3
+ * listing takes (the front, a rail, a strip, a ranked list) and the section
4
+ * front a term archive reuses. Column rules sit in the middle of a gutter and
5
+ * are drawn as one-pixel pseudo-elements, never as borders on the text.
6
+ */
7
+
8
+ /* --------------------------------------------------------------------------
9
+ The story unit
10
+ -------------------------------------------------------------------------- */
11
+
12
+ .cg-story {
13
+ display: flex;
14
+ flex-direction: column;
15
+ gap: var(--cg-s3);
16
+ min-inline-size: 0;
17
+ }
18
+
19
+ .cg-story__media {
20
+ display: block;
21
+ color: inherit;
22
+ text-decoration: none;
23
+ }
24
+
25
+ .cg-story__image {
26
+ inline-size: 100%;
27
+ aspect-ratio: 3 / 2;
28
+ object-fit: cover;
29
+ border-radius: var(--cg-radius);
30
+ background: var(--cg-surface-sunken);
31
+ }
32
+
33
+ .cg-story__body {
34
+ display: flex;
35
+ flex-direction: column;
36
+ gap: var(--cg-s2);
37
+ min-inline-size: 0;
38
+ }
39
+
40
+ .cg-story__kicker {
41
+ margin: 0;
42
+ color: var(--cg-accent);
43
+ font-family: var(--cg-font-ui);
44
+ font-size: var(--cg-text-label);
45
+ font-weight: var(--cg-weight-bold);
46
+ line-height: 1.2;
47
+ letter-spacing: var(--cg-tracking-caps);
48
+ text-transform: uppercase;
49
+ }
50
+
51
+ .cg-story__title {
52
+ font-size: var(--cg-size-story);
53
+ font-weight: var(--cg-weight-semibold);
54
+ line-height: var(--cg-leading-heading);
55
+ letter-spacing: var(--cg-tracking-heading);
56
+ }
57
+
58
+ .cg-story__link {
59
+ color: var(--cg-ink);
60
+ text-decoration-line: underline;
61
+ text-decoration-color: transparent;
62
+ text-decoration-thickness: var(--cg-rule);
63
+ text-underline-offset: 0.14em;
64
+ }
65
+
66
+ .cg-story__link:hover {
67
+ color: var(--cg-ink);
68
+ text-decoration-color: var(--cg-line-strong);
69
+ }
70
+
71
+ .cg-story__standfirst {
72
+ margin: 0;
73
+ color: var(--cg-ink-muted);
74
+ font-family: var(--cg-font-text);
75
+ font-size: var(--cg-text-sm);
76
+ line-height: var(--cg-leading-snug);
77
+ }
78
+
79
+ .cg-story__meta {
80
+ margin: 0;
81
+ color: var(--cg-ink-subtle);
82
+ font-family: var(--cg-font-ui);
83
+ font-size: var(--cg-text-xs);
84
+ letter-spacing: 0.02em;
85
+ font-variant-numeric: lining-nums tabular-nums;
86
+ }
87
+
88
+ .cg-story__numeral {
89
+ display: block;
90
+ color: var(--cg-accent);
91
+ font-family: var(--cg-font-display);
92
+ font-size: var(--cg-text-3xl);
93
+ font-weight: var(--cg-weight-regular);
94
+ line-height: 1;
95
+ font-variant-numeric: lining-nums tabular-nums;
96
+ }
97
+
98
+ /* --- sizes by slot ------------------------------------------------------- */
99
+
100
+ .cg-story--lead .cg-story__title {
101
+ font-size: var(--cg-size-lead);
102
+ font-weight: var(--cg-weight-semibold);
103
+ line-height: var(--cg-leading-display);
104
+ letter-spacing: var(--cg-tracking-display);
105
+ }
106
+
107
+ .cg-story--lead .cg-story__standfirst {
108
+ max-inline-size: 60ch;
109
+ font-size: var(--cg-text-reading);
110
+ line-height: var(--cg-leading-snug);
111
+ }
112
+
113
+ .cg-story--lead .cg-story__body {
114
+ gap: var(--cg-s3);
115
+ }
116
+
117
+ .cg-story--brief .cg-story__title {
118
+ font-size: var(--cg-size-brief);
119
+ }
120
+
121
+ .cg-story--rail .cg-story__title {
122
+ font-size: var(--cg-size-rail);
123
+ line-height: var(--cg-leading-heading);
124
+ }
125
+
126
+ .cg-story--rail .cg-story__standfirst {
127
+ font-size: var(--cg-text-md);
128
+ }
129
+
130
+ .cg-story--strip .cg-story__title {
131
+ font-size: var(--cg-size-brief);
132
+ font-weight: var(--cg-weight-medium);
133
+ }
134
+
135
+ .cg-story--ranked .cg-story__title {
136
+ font-size: var(--cg-size-story);
137
+ }
138
+
139
+ /* --------------------------------------------------------------------------
140
+ The front: a lead across eight columns, three briefs, a row of four.
141
+ -------------------------------------------------------------------------- */
142
+
143
+ .cg-front {
144
+ display: grid;
145
+ grid-template-columns: minmax(0, 1fr);
146
+ row-gap: var(--cg-s5);
147
+ }
148
+
149
+ .cg-front__briefs,
150
+ .cg-front__more {
151
+ display: grid;
152
+ margin: 0;
153
+ padding: 0;
154
+ list-style: none;
155
+ }
156
+
157
+ .cg-front__brief,
158
+ .cg-front__item {
159
+ position: relative;
160
+ min-inline-size: 0;
161
+ }
162
+
163
+ /* Phone: the briefs and the further stories become one ruled list, each
164
+ further story with a small photograph beside its headline. */
165
+ .cg-front__briefs,
166
+ .cg-front__more {
167
+ row-gap: 0;
168
+ }
169
+
170
+ .cg-front__brief,
171
+ .cg-front__item {
172
+ padding-block: var(--cg-s5);
173
+ border-block-start: var(--cg-rule) solid var(--cg-line);
174
+ }
175
+
176
+ .cg-front__more .cg-story[data-media="image"] {
177
+ display: grid;
178
+ grid-template-columns: minmax(0, 1fr) 6.5rem;
179
+ column-gap: var(--cg-s4);
180
+ align-items: start;
181
+ }
182
+
183
+ .cg-front__more .cg-story[data-media="image"] .cg-story__media {
184
+ grid-column: 2;
185
+ grid-row: 1;
186
+ }
187
+
188
+ .cg-front__more .cg-story[data-media="image"] .cg-story__body {
189
+ grid-column: 1;
190
+ grid-row: 1;
191
+ }
192
+
193
+ @media (min-width: 48rem) {
194
+ .cg-front {
195
+ grid-template-columns: repeat(var(--cg-columns), minmax(0, 1fr));
196
+ column-gap: var(--cg-col-gap);
197
+ row-gap: var(--cg-s8);
198
+ }
199
+
200
+ .cg-front > * {
201
+ grid-column: 1 / -1;
202
+ }
203
+
204
+ .cg-front__briefs,
205
+ .cg-front__more {
206
+ grid-template-columns: repeat(3, minmax(0, 1fr));
207
+ column-gap: var(--cg-col-gap);
208
+ border-block-start: var(--cg-rule) solid var(--cg-line-ink);
209
+ }
210
+
211
+ .cg-front__more {
212
+ grid-template-columns: repeat(2, minmax(0, 1fr));
213
+ row-gap: var(--cg-s8);
214
+ padding-block-start: var(--cg-s5);
215
+ }
216
+
217
+ .cg-front__brief,
218
+ .cg-front__item {
219
+ padding-block: var(--cg-s5) 0;
220
+ border-block-start: 0;
221
+ }
222
+
223
+ .cg-front__item {
224
+ padding-block-start: 0;
225
+ }
226
+
227
+ .cg-front__more .cg-story[data-media="image"] {
228
+ display: flex;
229
+ }
230
+
231
+ /* A column rule in the middle of the gutter before every item that does
232
+ not open a row. */
233
+ .cg-front__brief + .cg-front__brief::before,
234
+ .cg-front__item:nth-child(2n)::before {
235
+ content: "";
236
+ position: absolute;
237
+ inset-block: var(--cg-s5) 0;
238
+ inset-inline-start: calc(var(--cg-col-gap) / -2);
239
+ inline-size: var(--cg-rule);
240
+ background: var(--cg-line);
241
+ }
242
+
243
+ .cg-front__item:nth-child(2n)::before {
244
+ inset-block-start: 0;
245
+ }
246
+ }
247
+
248
+ @media (min-width: 64rem) {
249
+ .cg-front__lead {
250
+ grid-column: 1 / span 8;
251
+ grid-row: 1;
252
+ }
253
+
254
+ .cg-front__briefs {
255
+ position: relative;
256
+ grid-column: 9 / -1;
257
+ grid-row: 1;
258
+ grid-template-columns: minmax(0, 1fr);
259
+ align-self: stretch;
260
+ align-content: start;
261
+ border-block-start: 0;
262
+ }
263
+
264
+ /* The vertical rule between the lead and its briefs. */
265
+ .cg-front__briefs::before {
266
+ content: "";
267
+ position: absolute;
268
+ inset-block: 0;
269
+ inset-inline-start: calc(var(--cg-col-gap) / -2);
270
+ inline-size: var(--cg-rule);
271
+ background: var(--cg-line);
272
+ }
273
+
274
+ .cg-front__brief {
275
+ padding-block: var(--cg-s5);
276
+ border-block-start: var(--cg-rule) solid var(--cg-line);
277
+ }
278
+
279
+ .cg-front__brief:first-child {
280
+ padding-block-start: 0;
281
+ border-block-start: 0;
282
+ }
283
+
284
+ .cg-front__brief + .cg-front__brief::before {
285
+ content: none;
286
+ }
287
+
288
+ .cg-front__more {
289
+ grid-template-columns: repeat(4, minmax(0, 1fr));
290
+ }
291
+
292
+ .cg-front__item::before {
293
+ content: none;
294
+ }
295
+
296
+ .cg-front__item + .cg-front__item::before {
297
+ content: "";
298
+ position: absolute;
299
+ inset-block: 0;
300
+ inset-inline-start: calc(var(--cg-col-gap) / -2);
301
+ inline-size: var(--cg-rule);
302
+ background: var(--cg-line);
303
+ }
304
+
305
+ .cg-front__item:nth-child(4n + 1)::before {
306
+ content: none;
307
+ }
308
+
309
+ /* Without briefs the lead takes the whole row. */
310
+ .cg-front[data-briefs="0"] .cg-front__lead {
311
+ grid-column: 1 / -1;
312
+ }
313
+ }
314
+
315
+ /* --------------------------------------------------------------------------
316
+ A rail: the newest story large beside its photograph, the rest as a column.
317
+ -------------------------------------------------------------------------- */
318
+
319
+ .cg-rail {
320
+ display: grid;
321
+ grid-template-columns: minmax(0, 1fr);
322
+ row-gap: var(--cg-s6);
323
+ }
324
+
325
+ .cg-rail__list {
326
+ display: grid;
327
+ margin: 0;
328
+ padding: 0;
329
+ list-style: none;
330
+ }
331
+
332
+ .cg-rail__item {
333
+ padding-block: var(--cg-s5);
334
+ border-block-start: var(--cg-rule) solid var(--cg-line);
335
+ }
336
+
337
+ .cg-rail__item:last-child {
338
+ padding-block-end: 0;
339
+ }
340
+
341
+ .cg-story--column[data-media="image"] {
342
+ display: grid;
343
+ grid-template-columns: minmax(0, 1fr) 6.5rem;
344
+ column-gap: var(--cg-s4);
345
+ align-items: start;
346
+ }
347
+
348
+ .cg-story--column[data-media="image"] .cg-story__media {
349
+ grid-column: 2;
350
+ grid-row: 1;
351
+ }
352
+
353
+ .cg-story--column[data-media="image"] .cg-story__body {
354
+ grid-column: 1;
355
+ grid-row: 1;
356
+ }
357
+
358
+ @media (min-width: 64rem) {
359
+ .cg-rail {
360
+ grid-template-columns: repeat(var(--cg-columns), minmax(0, 1fr));
361
+ column-gap: var(--cg-col-gap);
362
+ }
363
+
364
+ .cg-rail__lead {
365
+ grid-column: 1 / span 8;
366
+ }
367
+
368
+ .cg-rail__list {
369
+ position: relative;
370
+ grid-column: 9 / -1;
371
+ align-self: stretch;
372
+ align-content: start;
373
+ }
374
+
375
+ .cg-rail__list::before {
376
+ content: "";
377
+ position: absolute;
378
+ inset-block: 0;
379
+ inset-inline-start: calc(var(--cg-col-gap) / -2);
380
+ inline-size: var(--cg-rule);
381
+ background: var(--cg-line);
382
+ }
383
+
384
+ .cg-rail__item:first-child {
385
+ padding-block-start: 0;
386
+ border-block-start: 0;
387
+ }
388
+
389
+ .cg-rail[data-count="1"] .cg-rail__lead {
390
+ grid-column: 1 / -1;
391
+ }
392
+
393
+ /* The lead sets its photograph across half of its eight columns at 4:3 and
394
+ the words in the other half, the way an inside page opens a section: a
395
+ long headline keeps a readable line instead of a stack of two words. */
396
+ .cg-story--rail[data-media="image"] {
397
+ display: grid;
398
+ grid-template-columns: repeat(2, minmax(0, 1fr));
399
+ column-gap: var(--cg-col-gap);
400
+ align-items: start;
401
+ }
402
+
403
+ .cg-story--rail[data-media="image"] .cg-story__image {
404
+ aspect-ratio: 4 / 3;
405
+ }
406
+
407
+ .cg-story--rail[data-media="image"] .cg-story__body {
408
+ gap: var(--cg-s3);
409
+ }
410
+
411
+ /* On a desk the front's lead photograph is set wider than tall, so the
412
+ headline under it reaches the first screen. */
413
+ .cg-story--lead .cg-story__image {
414
+ aspect-ratio: 16 / 9;
415
+ }
416
+ }
417
+
418
+ /* --------------------------------------------------------------------------
419
+ A strip: stories side by side between column rules. It scrolls on a phone.
420
+ -------------------------------------------------------------------------- */
421
+
422
+ .cg-strip {
423
+ overflow-x: auto;
424
+ overscroll-behavior-x: contain;
425
+ scroll-snap-type: x mandatory;
426
+ scrollbar-width: thin;
427
+ margin-inline: calc(var(--cg-gutter) * -1);
428
+ padding-inline: var(--cg-gutter);
429
+ scroll-padding-inline: var(--cg-gutter);
430
+ }
431
+
432
+ .cg-strip:focus-visible {
433
+ outline-offset: -2px;
434
+ }
435
+
436
+ .cg-strip__items {
437
+ display: grid;
438
+ grid-auto-flow: column;
439
+ grid-auto-columns: min(78vw, 20rem);
440
+ column-gap: var(--cg-col-gap);
441
+ margin: 0;
442
+ padding: 0 0 var(--cg-s2);
443
+ list-style: none;
444
+ }
445
+
446
+ .cg-strip__item {
447
+ position: relative;
448
+ scroll-snap-align: start;
449
+ }
450
+
451
+ .cg-strip__item + .cg-strip__item::before {
452
+ content: "";
453
+ position: absolute;
454
+ inset-block: 0;
455
+ inset-inline-start: calc(var(--cg-col-gap) / -2);
456
+ inline-size: var(--cg-rule);
457
+ background: var(--cg-line);
458
+ }
459
+
460
+ @media (min-width: 48rem) {
461
+ .cg-strip {
462
+ overflow-x: visible;
463
+ margin-inline: 0;
464
+ padding-inline: 0;
465
+ }
466
+
467
+ .cg-strip__items {
468
+ grid-auto-flow: row;
469
+ grid-template-columns: repeat(var(--cg-strip-columns, 4), minmax(0, 1fr));
470
+ padding-block-end: 0;
471
+ }
472
+
473
+ .cg-strip[data-count="1"] {
474
+ --cg-strip-columns: 1;
475
+ }
476
+
477
+ .cg-strip[data-count="2"] {
478
+ --cg-strip-columns: 2;
479
+ }
480
+
481
+ .cg-strip[data-count="3"] {
482
+ --cg-strip-columns: 3;
483
+ }
484
+ }
485
+
486
+ /* --------------------------------------------------------------------------
487
+ A ranked list: numbered, side by side on a wide screen.
488
+ -------------------------------------------------------------------------- */
489
+
490
+ .cg-ranked {
491
+ display: grid;
492
+ margin: 0;
493
+ padding: 0;
494
+ list-style: none;
495
+ }
496
+
497
+ .cg-ranked__item {
498
+ position: relative;
499
+ padding-block: var(--cg-s4);
500
+ border-block-start: var(--cg-rule) solid var(--cg-line);
501
+ }
502
+
503
+ .cg-ranked__item:first-child {
504
+ padding-block-start: 0;
505
+ border-block-start: 0;
506
+ }
507
+
508
+ .cg-story--ranked .cg-story__body {
509
+ display: grid;
510
+ grid-template-columns: 3rem minmax(0, 1fr);
511
+ column-gap: var(--cg-s3);
512
+ align-items: baseline;
513
+ }
514
+
515
+ .cg-story--ranked .cg-story__numeral {
516
+ grid-row: 1 / span 3;
517
+ }
518
+
519
+ .cg-story--ranked .cg-story__kicker,
520
+ .cg-story--ranked .cg-story__title {
521
+ grid-column: 2;
522
+ }
523
+
524
+ @media (min-width: 48rem) {
525
+ .cg-ranked {
526
+ grid-template-columns: repeat(3, minmax(0, 1fr));
527
+ column-gap: var(--cg-col-gap);
528
+ row-gap: var(--cg-s6);
529
+ }
530
+
531
+ .cg-ranked__item,
532
+ .cg-ranked__item:first-child {
533
+ padding-block: 0;
534
+ border-block-start: 0;
535
+ }
536
+
537
+ .cg-ranked__item + .cg-ranked__item::before {
538
+ content: "";
539
+ position: absolute;
540
+ inset-block: 0;
541
+ inset-inline-start: calc(var(--cg-col-gap) / -2);
542
+ inline-size: var(--cg-rule);
543
+ background: var(--cg-line);
544
+ }
545
+
546
+ .cg-ranked__item:nth-child(3n + 1)::before {
547
+ content: none;
548
+ }
549
+
550
+ .cg-story--ranked .cg-story__body {
551
+ display: flex;
552
+ flex-direction: column;
553
+ gap: var(--cg-s2);
554
+ }
555
+ }
556
+
557
+ @media (min-width: 64rem) {
558
+ .cg-ranked {
559
+ grid-template-columns: repeat(var(--cg-ranked-columns, 5), minmax(0, 1fr));
560
+ }
561
+
562
+ .cg-ranked__item:nth-child(3n + 1)::before {
563
+ content: "";
564
+ }
565
+
566
+ .cg-ranked__item:first-child::before {
567
+ content: none;
568
+ }
569
+
570
+ .cg-ranked[data-count="1"] {
571
+ --cg-ranked-columns: 1;
572
+ }
573
+
574
+ .cg-ranked[data-count="2"] {
575
+ --cg-ranked-columns: 2;
576
+ }
577
+
578
+ .cg-ranked[data-count="3"] {
579
+ --cg-ranked-columns: 3;
580
+ }
581
+
582
+ .cg-ranked[data-count="4"] {
583
+ --cg-ranked-columns: 4;
584
+ }
585
+ }
586
+
587
+ /* --------------------------------------------------------------------------
588
+ The front page: the first listing sits right under the masthead's rules.
589
+ -------------------------------------------------------------------------- */
590
+
591
+ .cg-front-page > .cg-listing:first-of-type {
592
+ padding-block-start: var(--cg-s6);
593
+ }
@@ -1,18 +1,37 @@
1
1
  /*
2
- * The magazine theme's stylesheet — the entry point, and nothing else.
2
+ * `@cogenta/theme-magazine`'s stylesheet: the entry point, and nothing else.
3
3
  *
4
- * tokens.css the design system (and the Google Fonts `@import`),
5
- * derived entirely from the skin's `--cogenta-*` properties
6
- * base.css document, accessibility floor, masthead/colophon, actions
7
- * blocks.css the twelve vocabulary blocks
4
+ * tokens.css the design system, derived from the skin's `--cogenta-*`
5
+ * custom properties (contract D)
6
+ * base.css document, accessibility floor, grid, actions, masthead,
7
+ * colophon, search, forms and comments
8
+ * stories.css the story unit and the listings: the front, rails, the
9
+ * strip, the ranked list
10
+ * article.css the article page
11
+ * blocks.css the other vocabulary blocks
12
+ * archive.css the taxonomy-term archive, set as a section front
13
+ * widgets.css the widget areas: the rail, the bands, the footer columns
8
14
  *
9
- * Not one colour, font, radius, duration or shadow is written literally in
10
- * any of the three: every value comes from a `--cogenta-<group>-<name>`
11
- * property produced from the skin's tokens, or from a `--cg-*` property
12
- * composed from those.
15
+ * Not one colour is written literally in any of them: every value comes from
16
+ * a skin token or from a `--cg-*` property composed from those.
17
+ *
18
+ * The one thing this file adds on its own is the Google Fonts request for the
19
+ * three families this theme sets: Fraunces (the nameplate and every headline,
20
+ * with its optical-size axis across its whole range, roman only: its italic
21
+ * is too playful for a daily), Source Serif 4 (the text, with its optical
22
+ * sizes and its italic for standfirsts and letters) and Libre Franklin (kickers,
23
+ * bylines, dates, navigation, captions). A skin only names a family; it never
24
+ * fetches one. All three fall back to real system stacks if Google Fonts is
25
+ * unreachable, and `display=swap` keeps text visible while they load.
26
+ * `cogenta serve` hoists this `@import` above the skin's rules.
13
27
  */
14
28
 
29
+ @import url("https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,300..800&family=Libre+Franklin:wght@400..800&family=Source+Serif+4:ital,opsz,wght@0,8..60,400..700;1,8..60,400..600&display=swap");
30
+
15
31
  @import "./tokens.css";
16
32
  @import "./base.css";
33
+ @import "./stories.css";
34
+ @import "./article.css";
17
35
  @import "./blocks.css";
18
36
  @import "./archive.css";
37
+ @import "./widgets.css";