@cogenta/theme-entreprise 1.1.3 → 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 (115) hide show
  1. package/dist/src/index.d.ts +1 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +1 -0
  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 +12 -15
  7. package/dist/src/render/blocks/accordion.js.map +1 -1
  8. package/dist/src/render/blocks/collection-list.d.ts +5 -7
  9. package/dist/src/render/blocks/collection-list.d.ts.map +1 -1
  10. package/dist/src/render/blocks/collection-list.js +48 -32
  11. package/dist/src/render/blocks/collection-list.js.map +1 -1
  12. package/dist/src/render/blocks/cta.d.ts +6 -6
  13. package/dist/src/render/blocks/cta.d.ts.map +1 -1
  14. package/dist/src/render/blocks/cta.js +12 -12
  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 +22 -27
  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 +13 -16
  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 +22 -22
  24. package/dist/src/render/blocks/feature-grid.js.map +1 -1
  25. package/dist/src/render/blocks/gallery.d.ts +7 -8
  26. package/dist/src/render/blocks/gallery.d.ts.map +1 -1
  27. package/dist/src/render/blocks/gallery.js +16 -14
  28. package/dist/src/render/blocks/gallery.js.map +1 -1
  29. package/dist/src/render/blocks/hero.d.ts +13 -8
  30. package/dist/src/render/blocks/hero.d.ts.map +1 -1
  31. package/dist/src/render/blocks/hero.js +27 -17
  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 +14 -11
  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 +21 -12
  38. package/dist/src/render/blocks/logos.js.map +1 -1
  39. package/dist/src/render/blocks/media-figure.d.ts +10 -6
  40. package/dist/src/render/blocks/media-figure.d.ts.map +1 -1
  41. package/dist/src/render/blocks/media-figure.js +18 -13
  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 +15 -11
  45. package/dist/src/render/blocks/pricing-table.js.map +1 -1
  46. package/dist/src/render/blocks/prose.d.ts +9 -3
  47. package/dist/src/render/blocks/prose.d.ts.map +1 -1
  48. package/dist/src/render/blocks/prose.js +11 -4
  49. package/dist/src/render/blocks/prose.js.map +1 -1
  50. package/dist/src/render/blocks/quote.d.ts +10 -10
  51. package/dist/src/render/blocks/quote.d.ts.map +1 -1
  52. package/dist/src/render/blocks/quote.js +14 -13
  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 +11 -13
  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 +12 -13
  59. package/dist/src/render/blocks/stats.js.map +1 -1
  60. package/dist/src/render/blocks/testimonial.d.ts +9 -9
  61. package/dist/src/render/blocks/testimonial.d.ts.map +1 -1
  62. package/dist/src/render/blocks/testimonial.js +15 -14
  63. package/dist/src/render/blocks/testimonial.js.map +1 -1
  64. package/dist/src/render/chrome.d.ts +3 -1
  65. package/dist/src/render/chrome.d.ts.map +1 -1
  66. package/dist/src/render/chrome.js +71 -46
  67. package/dist/src/render/chrome.js.map +1 -1
  68. package/dist/src/render/layout.d.ts +26 -0
  69. package/dist/src/render/layout.d.ts.map +1 -0
  70. package/dist/src/render/layout.js +51 -0
  71. package/dist/src/render/layout.js.map +1 -0
  72. package/dist/src/render/render-block.d.ts.map +1 -1
  73. package/dist/src/render/render-block.js +23 -2
  74. package/dist/src/render/render-block.js.map +1 -1
  75. package/dist/src/render/term-archive.d.ts +8 -6
  76. package/dist/src/render/term-archive.d.ts.map +1 -1
  77. package/dist/src/render/term-archive.js +22 -16
  78. package/dist/src/render/term-archive.js.map +1 -1
  79. package/dist/src/render/widget-areas.d.ts +13 -0
  80. package/dist/src/render/widget-areas.d.ts.map +1 -0
  81. package/dist/src/render/widget-areas.js +20 -0
  82. package/dist/src/render/widget-areas.js.map +1 -0
  83. package/dist/theme.config.js +2 -2
  84. package/dist/theme.config.js.map +1 -1
  85. package/package.json +5 -5
  86. package/src/index.ts +1 -0
  87. package/src/render/blocks/accordion.ts +32 -27
  88. package/src/render/blocks/collection-list.ts +84 -53
  89. package/src/render/blocks/cta.ts +27 -28
  90. package/src/render/blocks/embed.ts +46 -43
  91. package/src/render/blocks/faq.ts +25 -21
  92. package/src/render/blocks/feature-grid.ts +42 -35
  93. package/src/render/blocks/gallery.ts +21 -16
  94. package/src/render/blocks/hero.ts +40 -28
  95. package/src/render/blocks/logo-strip.ts +26 -16
  96. package/src/render/blocks/logos.ts +33 -17
  97. package/src/render/blocks/media-figure.ts +22 -14
  98. package/src/render/blocks/pricing-table.ts +26 -15
  99. package/src/render/blocks/prose.ts +18 -4
  100. package/src/render/blocks/quote.ts +18 -14
  101. package/src/render/blocks/stat-counter.ts +25 -20
  102. package/src/render/blocks/stats.ts +31 -21
  103. package/src/render/blocks/testimonial.ts +22 -18
  104. package/src/render/chrome.ts +84 -49
  105. package/src/render/layout.ts +67 -0
  106. package/src/render/render-block.ts +24 -1
  107. package/src/render/term-archive.ts +54 -50
  108. package/src/render/widget-areas.ts +23 -0
  109. package/src/styles/archive.css +135 -38
  110. package/src/styles/base.css +553 -426
  111. package/src/styles/blocks.css +1192 -1000
  112. package/src/styles/theme.css +18 -24
  113. package/src/styles/tokens.css +162 -192
  114. package/src/styles/widgets.css +913 -0
  115. package/tokens.json +17 -17
@@ -1,5 +1,5 @@
1
1
  import { VOCABULARY_NAMES } from '@cogenta/blocks';
2
- import { h, pageHasOwnHeading, renderEntryHeader, resolveBlockForRender, withBlockKey, withBlockVariant, } from '@cogenta/theme-kit';
2
+ import { h, pageHasOwnHeading, providedBlockNode, renderEntryHeader, resolveBlockForRender, withBlockKey, withBlockVariant, } from '@cogenta/theme-kit';
3
3
  import { renderAccordion } from './blocks/accordion.js';
4
4
  import { renderCollectionList } from './blocks/collection-list.js';
5
5
  import { renderCta } from './blocks/cta.js';
@@ -19,6 +19,12 @@ import { renderStats } from './blocks/stats.js';
19
19
  import { renderTestimonial } from './blocks/testimonial.js';
20
20
  export { pageHasOwnHeading, renderEntryHeader, withBlockKey };
21
21
  export function renderBlock(block, ctx, entries = {}, registry) {
22
+ // A block a plugin provides arrives already rendered by the host, in a
23
+ // process of its own (contract D theme@1.7). Nothing else in this theme
24
+ // needs to know such blocks exist.
25
+ const provided = providedBlockNode(block, ctx);
26
+ if (provided !== null)
27
+ return withBlockVariant(provided, block.variant);
22
28
  // `block`'s type says `VocabularyBlock`, but the value crossing this
23
29
  // boundary from stored content is not always literally one of the shared
24
30
  // vocabulary — resolving here is what turns an unimplemented theme-private
@@ -82,6 +88,21 @@ function renderKnownBlock(known, ctx, entries) {
82
88
  }
83
89
  }
84
90
  }
91
+ /** Below this, a reading time says nothing a reader can use. */
92
+ const MIN_READING_MINUTES_SHOWN = 3;
93
+ /**
94
+ * A practice page or a short case study announcing "1 min read" reads like a
95
+ * blog, not like a firm: this theme shows a reading time only for a long
96
+ * read. The rest of the entry furniture is passed through untouched.
97
+ */
98
+ function withoutShortReadingTime(page) {
99
+ const entry = page.entry;
100
+ if (entry?.readingMinutes === undefined || entry.readingMinutes >= MIN_READING_MINUTES_SHOWN) {
101
+ return page;
102
+ }
103
+ const { readingMinutes: _short, ...rest } = entry;
104
+ return { ...page, entry: rest };
105
+ }
85
106
  /**
86
107
  * `<main id="cg-main">` is mandatory: it is the skip-link's target, written
87
108
  * once by `@cogenta/cli`'s `theme-render.ts` outside any theme's control.
@@ -100,7 +121,7 @@ function renderKnownBlock(known, ctx, entries) {
100
121
  * exactly as for every other one.
101
122
  */
102
123
  export function renderPage(page, ctx, entries = {}, registry) {
103
- const entryHeader = renderEntryHeader(page, ctx);
124
+ const entryHeader = renderEntryHeader(withoutShortReadingTime(page), ctx);
104
125
  return h('main', { class: 'cg-main', id: 'cg-main' }, entryHeader, entryHeader === null && !pageHasOwnHeading(page.blocks)
105
126
  ? h('h1', { class: 'cg-page__title' }, page.title)
106
127
  : null, page.blocks.map((block) => withBlockKey(renderBlock(block, ctx, entries, registry), block._key)));
@@ -1 +1 @@
1
- {"version":3,"file":"render-block.js","sourceRoot":"","sources":["../../../src/render/render-block.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"render-block.js","sourceRoot":"","sources":["../../../src/render/render-block.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,gBAAgB,EAAwB,MAAM,iBAAiB,CAAA;AAC5F,OAAO,EAGL,CAAC,EAED,iBAAiB,EACjB,iBAAiB,EAEjB,iBAAiB,EACjB,qBAAqB,EACrB,YAAY,EACZ,gBAAgB,GACjB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAG3D,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,YAAY,EAAE,CAAA;AAE7D,MAAM,UAAU,WAAW,CACzB,KAAsB,EACtB,GAAkB,EAClB,OAAO,GAAmB,EAAE,EAC5B,QAAwB;IAExB,uEAAuE;IACvE,wEAAwE;IACxE,mCAAmC;IACnC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAC9C,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;IACvE,qEAAqE;IACrE,yEAAyE;IACzE,2EAA2E;IAC3E,qEAAqE;IACrE,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,EAAE,QAAQ,CAAC,CAAA;IACzE,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAClC,MAAM,KAAK,GAAG,QAAsC,CAAA;IACpD,wEAAwE;IACxE,uEAAuE;IACvE,0EAA0E;IAC1E,4EAA4E;IAC5E,OAAO,gBAAgB,CAAC,gBAAgB,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;AAC/E,CAAC;AAED,SAAS,gBAAgB,CACvB,KAAsB,EACtB,GAAkB,EAClB,OAAuB;IAEvB,QAAQ,KAAK,CAAC,KAAK,EAAE,CAAC;QACpB,KAAK,MAAM;YACT,OAAO,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QAC/B,KAAK,OAAO;YACV,OAAO,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QAChC,KAAK,aAAa;YAChB,OAAO,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACtC,KAAK,aAAa;YAChB,OAAO,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACtC,KAAK,KAAK;YACR,OAAO,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QAC9B,KAAK,SAAS;YACZ,OAAO,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QAClC,KAAK,OAAO;YACV,OAAO,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QAChC,KAAK,KAAK;YACR,OAAO,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QAC9B,KAAK,OAAO;YACV,OAAO,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QAChC,KAAK,OAAO;YACV,OAAO,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QAChC,KAAK,gBAAgB;YACnB,OAAO,oBAAoB,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;QACpE,KAAK,OAAO;YACV,OAAO,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QAChC,KAAK,aAAa;YAChB,OAAO,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACtC,KAAK,cAAc;YACjB,OAAO,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACvC,KAAK,WAAW;YACd,OAAO,eAAe,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACpC,KAAK,aAAa;YAChB,OAAO,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACtC,KAAK,WAAW;YACd,OAAO,eAAe,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACpC,SAAS,CAAC;YACR,uEAAuE;YACvE,sEAAsE;YACtE,sEAAsE;YACtE,qEAAqE;YACrE,oEAAoE;YACpE,mBAAmB;YACnB,MAAM,WAAW,GAAU,KAAK,CAAA;YAChC,KAAK,WAAW,CAAA;YAChB,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;AACH,CAAC;AAED,gEAAgE;AAChE,MAAM,yBAAyB,GAAG,CAAC,CAAA;AAEnC;;;;GAIG;AACH,SAAS,uBAAuB,CAAC,IAAiB;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;IACxB,IAAI,KAAK,EAAE,cAAc,KAAK,SAAS,IAAI,KAAK,CAAC,cAAc,IAAI,yBAAyB,EAAE,CAAC;QAC7F,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAA;IACjD,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;AACjC,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,UAAU,CACxB,IAAiB,EACjB,GAAkB,EAClB,OAAO,GAAmB,EAAE,EAC5B,QAAwB;IAExB,MAAM,WAAW,GAAG,iBAAiB,CAAC,uBAAuB,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAA;IACzE,OAAO,CAAC,CACN,MAAM,EACN,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EACnC,WAAW,EACX,WAAW,KAAK,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC;QACrD,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC;QAClD,CAAC,CAAC,IAAI,EACR,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACxB,YAAY,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CACrE,CACF,CAAA;AACH,CAAC"}
@@ -1,12 +1,14 @@
1
1
  import { type HtmlElement, type TermArchiveInput } from '@cogenta/theme-kit';
2
2
  /**
3
- * The taxonomy-term archive (contract D `theme@1.3`) — a resource index.
3
+ * The taxonomy-term archive (contract D `theme@1.3`): an index, set the way a
4
+ * firm lists its work by sector.
4
5
  *
5
- * Built from the same `cg-list__row` rows `collectionList` already renders
6
- * here: a date rail on the left, the title and its summary on the right,
7
- * which is the shape a B2B insights or resources index takes. Reusing the
8
- * block's own classes is what keeps an archive looking like the rest of the
9
- * site without a second stylesheet to maintain.
6
+ * A breadcrumb in small capitals, the term as the page title in the display
7
+ * serif, its sub-terms as a ruled line of links, then one hairline row per
8
+ * entry: the title on the left half of the grid, the summary on the right,
9
+ * the date (when there is one) in the margin. `TermArchiveEntry` carries no
10
+ * picture, so this is a typographic index by design rather than a grid of
11
+ * cards with empty image slots.
10
12
  */
11
13
  export declare function renderTermArchive(input: TermArchiveInput): HtmlElement;
12
14
  //# sourceMappingURL=term-archive.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"term-archive.d.ts","sourceRoot":"","sources":["../../../src/render/term-archive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAK,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAE/E;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,WAAW,CAsDtE"}
1
+ {"version":3,"file":"term-archive.d.ts","sourceRoot":"","sources":["../../../src/render/term-archive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAK,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAG/E;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,WAAW,CAuDtE"}
@@ -1,26 +1,32 @@
1
1
  import { h } from '@cogenta/theme-kit';
2
+ import { monthYear } from './layout.js';
2
3
  /**
3
- * The taxonomy-term archive (contract D `theme@1.3`) — a resource index.
4
+ * The taxonomy-term archive (contract D `theme@1.3`): an index, set the way a
5
+ * firm lists its work by sector.
4
6
  *
5
- * Built from the same `cg-list__row` rows `collectionList` already renders
6
- * here: a date rail on the left, the title and its summary on the right,
7
- * which is the shape a B2B insights or resources index takes. Reusing the
8
- * block's own classes is what keeps an archive looking like the rest of the
9
- * site without a second stylesheet to maintain.
7
+ * A breadcrumb in small capitals, the term as the page title in the display
8
+ * serif, its sub-terms as a ruled line of links, then one hairline row per
9
+ * entry: the title on the left half of the grid, the summary on the right,
10
+ * the date (when there is one) in the margin. `TermArchiveEntry` carries no
11
+ * picture, so this is a typographic index by design rather than a grid of
12
+ * cards with empty image slots.
10
13
  */
11
14
  export function renderTermArchive(input) {
12
- const rows = input.entries.map((entry) => h('li', { class: 'cg-list__row' }, entry.publishedAt === null
15
+ const rows = input.entries.map((entry) => {
16
+ const date = entry.publishedAt === null ? null : monthYear(entry.publishedAt, input.locale);
17
+ return h('li', { class: 'cg-index__row' }, h('h2', { class: 'cg-index__title' }, entry.href === null
18
+ ? entry.title
19
+ : h('a', { class: 'cg-index__link', href: entry.href }, entry.title)), entry.summary === null ? null : h('p', { class: 'cg-index__summary' }, entry.summary), entry.publishedAt === null || date === null
20
+ ? null
21
+ : h('time', { class: 'cg-index__date', datetime: entry.publishedAt }, date));
22
+ });
23
+ return h('main', { class: 'cg-main cg-archive', id: 'cg-main' }, h('div', { class: 'cg-container cg-archive__inner' }, input.ancestors.length === 0
13
24
  ? null
14
- : h('time', { class: 'cg-list__date', datetime: entry.publishedAt }, entry.publishedAt.slice(0, 10)), h('div', { class: 'cg-list__body' }, h('h2', { class: 'cg-list__title' }, entry.href === null
15
- ? entry.title
16
- : h('a', { class: 'cg-list__link', href: entry.href }, entry.title)), entry.summary === null ? null : h('p', { class: 'cg-list__excerpt' }, entry.summary))));
17
- return h('main', { class: 'cg-main cg-archive', id: 'cg-main' }, input.ancestors.length === 0
25
+ : h('nav', { class: 'cg-archive__breadcrumb', 'aria-label': input.labels.breadcrumb }, h('ol', {}, ...input.ancestors.map((link) => h('li', {}, h('a', { href: link.href }, link.label))))), h('h1', { class: 'cg-archive__title' }, input.term.label), input.children.length === 0
18
26
  ? null
19
- : h('nav', { class: 'cg-archive__breadcrumb', 'aria-label': input.labels.breadcrumb }, h('ol', {}, ...input.ancestors.map((l) => h('li', {}, h('a', { href: l.href }, l.label))))), h('h1', { class: 'cg-list__title-heading' }, input.term.label), input.children.length === 0
20
- ? null
21
- : h('ul', { class: 'cg-archive__children', 'aria-label': input.labels.subterms }, ...input.children.map((c) => h('li', {}, h('a', { href: c.href }, c.label)))), rows.length === 0
22
- ? h('p', { class: 'cg-list__empty' }, input.labels.empty)
23
- : h('ul', { class: 'cg-list__items' }, ...rows), pager(input));
27
+ : h('ul', { class: 'cg-archive__children', 'aria-label': input.labels.subterms }, ...input.children.map((child) => h('li', {}, h('a', { href: child.href }, child.label)))), rows.length === 0
28
+ ? h('p', { class: 'cg-archive__empty' }, input.labels.empty)
29
+ : h('ol', { class: 'cg-index' }, ...rows), pager(input)));
24
30
  }
25
31
  function pager(input) {
26
32
  if (input.page.previousHref === null && input.page.nextHref === null)
@@ -1 +1 @@
1
- {"version":3,"file":"term-archive.js","sourceRoot":"","sources":["../../../src/render/term-archive.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"term-archive.js","sourceRoot":"","sources":["../../../src/render/term-archive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * The widget areas this theme names (contract D `theme@1.6`). Declaring them
3
+ * is what tells the host this theme draws the footer columns inside its own
4
+ * footer; the page areas are placed by the host in the shared
5
+ * `cg-sidebar-layout` markup, which `styles/widgets.css` sets as the side
6
+ * column of a firm's report.
7
+ */
8
+ export declare const widgetAreas: readonly {
9
+ readonly id: string;
10
+ readonly label: string;
11
+ readonly description?: string;
12
+ }[];
13
+ //# sourceMappingURL=widget-areas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widget-areas.d.ts","sourceRoot":"","sources":["../../../src/render/widget-areas.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,EAAE,SAAS;IACjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAC9B,EAWA,CAAA"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * The widget areas this theme names (contract D `theme@1.6`). Declaring them
3
+ * is what tells the host this theme draws the footer columns inside its own
4
+ * footer; the page areas are placed by the host in the shared
5
+ * `cg-sidebar-layout` markup, which `styles/widgets.css` sets as the side
6
+ * column of a firm's report.
7
+ */
8
+ export const widgetAreas = [
9
+ {
10
+ id: 'sidebar',
11
+ label: 'Side column',
12
+ description: 'Beside a case study, a practice, a sector and search results.',
13
+ },
14
+ {
15
+ id: 'content-after',
16
+ label: 'Under the text',
17
+ description: 'After a case study, a practice or a page, before the comments.',
18
+ },
19
+ ];
20
+ //# sourceMappingURL=widget-areas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widget-areas.js","sourceRoot":"","sources":["../../../src/render/widget-areas.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,WAAW,GAIlB;IACJ;QACE,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,+DAA+D;KAC7E;IACD;QACE,EAAE,EAAE,eAAe;QACnB,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,gEAAgE;KAC9E;CACF,CAAA"}
@@ -14,8 +14,8 @@ import { defineTheme } from '@cogenta/render';
14
14
  */
15
15
  export default defineTheme({
16
16
  name: 'entreprise',
17
- version: '1.1.0',
18
- description: 'A confident, premium B2B theme: structured typography, real KPI/impact sections, a genuine dark mode.',
17
+ version: '1.2.0',
18
+ description: 'A management consultancy theme: Newsreader and Hanken Grotesk on a twelve-column grid, hairlines instead of boxes, one green accent and a designed dark mode.',
19
19
  author: 'Cogenta',
20
20
  engine: '^1.0.0',
21
21
  blocks: '^2.0.0',
@@ -1 +1 @@
1
- {"version":3,"file":"theme.config.js","sourceRoot":"","sources":["../theme.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAE7C;;;;;;;;;;;;GAYG;AACH,eAAe,WAAW,CAAC;IACzB,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,OAAO;IAChB,WAAW,EACT,uGAAuG;IACzG,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,UAAU,EAAE;QACV,MAAM;QACN,OAAO;QACP,aAAa;QACb,aAAa;QACb,KAAK;QACL,SAAS;QACT,OAAO;QACP,KAAK;QACL,OAAO;QACP,OAAO;QACP,gBAAgB;QAChB,OAAO;QACP,aAAa;QACb,cAAc;QACd,WAAW;QACX,aAAa;QACb,WAAW;KACZ;IACD,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC;IAChC,OAAO,EAAE,QAAQ;IACjB,MAAM,EAAE,eAAe;IACvB,IAAI,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE;CAClC,CAAC,CAAA"}
1
+ {"version":3,"file":"theme.config.js","sourceRoot":"","sources":["../theme.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAE7C;;;;;;;;;;;;GAYG;AACH,eAAe,WAAW,CAAC;IACzB,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,OAAO;IAChB,WAAW,EACT,+JAA+J;IACjK,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,UAAU,EAAE;QACV,MAAM;QACN,OAAO;QACP,aAAa;QACb,aAAa;QACb,KAAK;QACL,SAAS;QACT,OAAO;QACP,KAAK;QACL,OAAO;QACP,OAAO;QACP,gBAAgB;QAChB,OAAO;QACP,aAAa;QACb,cAAc;QACd,WAAW;QACX,aAAa;QACb,WAAW;KACZ;IACD,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC;IAChC,OAAO,EAAE,QAAQ;IACjB,MAAM,EAAE,eAAe;IACvB,IAAI,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE;CAClC,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cogenta/theme-entreprise",
3
- "version": "1.1.3",
4
- "description": "A confident, premium B2B theme for Cogenta: structured typography, real KPI/impact sections, a genuine dark mode, and zero client JavaScript.",
3
+ "version": "1.3.3",
4
+ "description": "A management consultancy theme for Cogenta: an editorial twelve-column grid, Newsreader and Hanken Grotesk, hairlines instead of boxes, a designed dark mode, and zero client JavaScript.",
5
5
  "license": "MPL-2.0",
6
6
  "type": "module",
7
7
  "sideEffects": false,
@@ -36,9 +36,9 @@
36
36
  "directory": "packages/theme-entreprise"
37
37
  },
38
38
  "dependencies": {
39
- "@cogenta/render": "0.2.4",
40
- "@cogenta/theme-kit": "0.3.3",
41
- "@cogenta/blocks": "1.0.4"
39
+ "@cogenta/render": "0.3.5",
40
+ "@cogenta/blocks": "1.1.3",
41
+ "@cogenta/theme-kit": "0.5.3"
42
42
  },
43
43
  "peerDependencies": {
44
44
  "astro": "^7.2.1"
package/src/index.ts CHANGED
@@ -13,3 +13,4 @@ export * from './render/blocks/stats.js'
13
13
  export * from './render/chrome.js'
14
14
  export * from './render/render-block.js'
15
15
  export * from './render/term-archive.js'
16
+ export * from './render/widget-areas.js'
@@ -7,54 +7,59 @@ import {
7
7
  type RenderContext,
8
8
  renderRichText,
9
9
  } from '@cogenta/theme-kit'
10
+ import { ordinal, section } from '../layout.js'
10
11
 
11
12
  /**
12
- * `blocks@2.0` (RFC 0001). Reuses `faq`'s zero-JS `<details>`/`<summary>`
13
- * mechanics — expanding, keyboard operation and the expanded state
14
- * announced to assistive technology all come from the browser — but with a
15
- * markup vocabulary and class names of its own (`cg-panels`, not
16
- * `cg-faq`) so the two blocks can diverge visually later without one
17
- * depending on the other: "accordion" and "frequently asked question" are
18
- * different editorial intents even where the underlying question/answer
19
- * shape coincides.
13
+ * `blocks@2.0` (RFC 0001). The same zero-JavaScript `<details>`/`<summary>`
14
+ * mechanics as `faq`, laid out for a different intent: a specification or a
15
+ * method in numbered steps, across the full grid. The title sits above the
16
+ * list rather than beside it, each row carries its ordinal in the left
17
+ * column, and the open panel's text lines up with the question it answers.
20
18
  *
21
- * Where `faq` numbers its rows, this one reads as a stack of bordered
22
- * panels with a rotating chevron mark, closer to a features/specification
23
- * accordion than a support page.
19
+ * Class names are its own (`cg-accordion`, not `cg-faq`) so the two blocks
20
+ * can diverge without one depending on the other.
24
21
  */
25
- function renderItem(item: AccordionItem, ctx: RenderContext): HtmlElement {
22
+ function renderItem(item: AccordionItem, index: number, ctx: RenderContext): HtmlElement {
26
23
  return h(
27
24
  'li',
28
- { class: 'cg-panels__item' },
25
+ { class: 'cg-accordion__item' },
29
26
  h(
30
27
  'details',
31
- { class: 'cg-panels__details' },
28
+ { class: 'cg-accordion__details' },
32
29
  h(
33
30
  'summary',
34
- { class: 'cg-panels__question' },
35
- h('span', { class: 'cg-panels__question-text' }, item.question),
36
- h('span', { class: 'cg-panels__chevron', 'aria-hidden': 'true' }),
31
+ { class: 'cg-accordion__question' },
32
+ h('span', { class: 'cg-accordion__index', 'aria-hidden': 'true' }, ordinal(index)),
33
+ h('span', { class: 'cg-accordion__question-text' }, item.question),
34
+ h('span', { class: 'cg-toggle-mark', 'aria-hidden': 'true' }),
37
35
  ),
38
- h('div', { class: 'cg-panels__answer' }, renderRichText(ctx, item.answer)),
36
+ h('div', { class: 'cg-accordion__answer' }, renderRichText(ctx, item.answer)),
39
37
  ),
40
38
  )
41
39
  }
42
40
 
43
41
  export function renderAccordion(block: AccordionBlock, ctx: RenderContext): HtmlElement {
44
- return h(
42
+ return section(
45
43
  'section',
46
- { class: 'cg-panels', 'data-block': 'accordion' },
44
+ 'accordion',
45
+ 'cg-accordion',
46
+ {},
47
+ 'div',
47
48
  block.title === undefined
48
49
  ? null
49
- : heading(
50
- blockHeadingTag('accordion') ?? 'h2',
51
- { class: 'cg-panels__title', 'data-field': 'title' },
52
- block.title,
50
+ : h(
51
+ 'div',
52
+ { class: 'cg-head' },
53
+ heading(
54
+ blockHeadingTag('accordion') ?? 'h2',
55
+ { class: 'cg-head__title', 'data-field': 'title' },
56
+ block.title,
57
+ ),
53
58
  ),
54
59
  h(
55
- 'ul',
56
- { class: 'cg-panels__items' },
57
- block.items.map((item) => renderItem(item, ctx)),
60
+ 'ol',
61
+ { class: 'cg-accordion__items' },
62
+ block.items.map((item, index) => renderItem(item, index, ctx)),
58
63
  ),
59
64
  )
60
65
  }
@@ -16,62 +16,90 @@ import {
16
16
  type RenderContext,
17
17
  renderImageSource,
18
18
  } from '@cogenta/theme-kit'
19
+ import { arrow, monthYear, ordinal, section } from '../layout.js'
19
20
 
20
21
  /**
21
- * The only block of the seventeen that reads data at render time — contract B
22
- * marks it `runtime: 'server'` for that reason. The read is *not* done
23
- * here: `query` builds the request from the block's own fields
24
- * (`@cogenta/theme-kit`'s `buildCollectionListQuery`, shared across every
25
- * theme), the caller awaits `ctx.content.list(...)` before rendering
26
- * starts, and this function stays a pure function of the entries handed to
27
- * it.
22
+ * The only block of the seventeen that reads data at render time (contract B
23
+ * marks it `runtime: 'server'`). The read is not done here: `query` builds
24
+ * the request from the block's own fields, the caller awaits
25
+ * `ctx.content.list(...)` before rendering starts, and this function stays a
26
+ * pure function of the entries handed to it.
28
27
  */
29
28
  export { buildCollectionListQuery as query }
30
29
 
31
30
  /**
32
- * A card in every layout: a 16:9 cover on top (`entryImage`, the same
33
- * `coverImage`/`cover`/… convention every entry-carrying block on this site
34
- * reads), then title and excerpt below it — the "services/insights card"
35
- * register a B2B site's listing pages use, replacing the previous ledger
36
- * row (a date rail beside plain text, no visual at all). An entry with no
37
- * image still renders a complete card; the cover slot is simply absent
38
- * rather than a placeholder box standing in for one.
31
+ * Three designed layouts, one markup per entry:
32
+ *
33
+ * - `list` is the case-study register: alternating rows, the picture on
34
+ * seven columns and the text on four, swapping sides from one row to the
35
+ * next. An entry with no picture becomes a typographic row (title left,
36
+ * summary right) under the same hairline, never a row with a hole in it.
37
+ * - `grid` is an editorial index in three columns: a 3:2 picture, a hairline,
38
+ * the title in the display serif and its summary. No card border, no lift
39
+ * on hover.
40
+ * - `carousel` is the grid's item in a scroll-snapping, focusable row.
41
+ *
42
+ * The picture link is hidden from assistive technology and from the tab
43
+ * order: it goes where the title link goes, and one link per entry is what
44
+ * a keyboard or screen reader user should meet.
39
45
  */
40
- function renderCover(entry: ContentEntry, ctx: RenderContext): HtmlElement | null {
41
- const cover = entryImage(entry, ctx)
42
- if (cover === undefined) return null
46
+ function renderPicture(entry: ContentEntry, ctx: RenderContext, url: string): HtmlElement | null {
47
+ const picture = entryImage(entry, ctx)
48
+ if (picture === undefined) return null
43
49
  return h(
44
- 'span',
45
- { class: 'cg-list__cover' },
46
- renderImageSource(cover, { className: 'cg-list__cover-image', loading: 'lazy' }),
50
+ 'a',
51
+ { class: 'cg-entry__media', href: url, tabindex: '-1', 'aria-hidden': 'true' },
52
+ renderImageSource(picture, {
53
+ className: 'cg-entry__image',
54
+ loading: 'lazy',
55
+ sizes: '(min-width: 64rem) 55vw, 100vw',
56
+ }),
47
57
  )
48
58
  }
49
59
 
50
- function renderEntry(entry: ContentEntry, ctx: RenderContext, tag: HeadingTag): HtmlElement {
51
- const date = entryDate(entry)
60
+ function renderEntry(
61
+ entry: ContentEntry,
62
+ index: number,
63
+ ctx: RenderContext,
64
+ tag: HeadingTag,
65
+ ): HtmlElement {
66
+ const url = entryHref(entry, ctx)
52
67
  const excerpt = entryExcerpt(entry)
68
+ // Only a declared publication date is shown: `entryDate` falls back to
69
+ // `createdAt`, and the day a record was typed in is not a date a reader of
70
+ // a case study or a practice page is owed.
71
+ const iso = typeof entry.publishedAt === 'string' ? entryDate(entry) : undefined
72
+ const date = iso === undefined ? null : monthYear(iso, ctx.locale)
73
+ const picture = renderPicture(entry, ctx, url)
53
74
  return h(
54
75
  'li',
55
- { class: 'cg-list__row' },
56
- renderCover(entry, ctx),
76
+ { class: 'cg-entry', 'data-media': picture === null ? 'none' : 'present' },
77
+ picture,
57
78
  h(
58
79
  'div',
59
- { class: 'cg-list__body' },
80
+ { class: 'cg-entry__body' },
81
+ h(
82
+ 'p',
83
+ { class: 'cg-entry__meta' },
84
+ h('span', { class: 'cg-entry__index', 'aria-hidden': 'true' }, ordinal(index)),
85
+ iso === undefined || date === null
86
+ ? null
87
+ : h('time', { class: 'cg-entry__date', datetime: iso }, date),
88
+ ),
89
+ // The title is the link, and the arrow sits inline after its last word
90
+ // inside the same link: a bare arrow on a line of its own reads as a
91
+ // placeholder, not as a way into the case study.
60
92
  heading(
61
93
  tag,
62
- { class: 'cg-list__title' },
63
- h('a', { class: 'cg-list__link', href: entryHref(entry, ctx) }, entryTitle(entry, ctx)),
94
+ { class: 'cg-entry__title' },
95
+ h(
96
+ 'a',
97
+ { class: 'cg-entry__link', href: url },
98
+ h('span', { class: 'cg-entry__link-text' }, entryTitle(entry, ctx)),
99
+ h('span', { class: 'cg-entry__arrow', 'aria-hidden': 'true' }, arrow()),
100
+ ),
64
101
  ),
65
- excerpt === undefined ? null : h('p', { class: 'cg-list__excerpt' }, excerpt),
66
- date === undefined
67
- ? null
68
- : h(
69
- 'time',
70
- { class: 'cg-list__date', datetime: date },
71
- new Intl.DateTimeFormat(ctx.locale, { month: 'short', day: '2-digit' }).format(
72
- new Date(date),
73
- ),
74
- ),
102
+ excerpt === undefined ? null : h('p', { class: 'cg-entry__excerpt' }, excerpt),
75
103
  ),
76
104
  )
77
105
  }
@@ -85,32 +113,35 @@ export function renderCollectionList(
85
113
  const entryTag = nestedHeadingTag('collectionList', hasTitle)
86
114
  const items =
87
115
  entries.length === 0
88
- ? h('p', { class: 'cg-list__empty' }, ctx.t('collection.empty'))
116
+ ? h('p', { class: 'cg-collection__empty' }, ctx.t('collection.empty'))
89
117
  : h(
90
- 'ul',
91
- { class: 'cg-list__items' },
92
- entries.map((entry) => renderEntry(entry, ctx, entryTag)),
118
+ block.layout === 'list' ? 'ol' : 'ul',
119
+ { class: 'cg-collection__items', 'data-count': String(Math.min(entries.length, 4)) },
120
+ entries.map((entry, index) => renderEntry(entry, index, ctx, entryTag)),
93
121
  )
94
122
 
95
- return h(
123
+ return section(
96
124
  'section',
97
- {
98
- class: 'cg-list',
99
- 'data-block': 'collectionList',
100
- 'data-layout': block.layout,
101
- },
125
+ 'collectionList',
126
+ 'cg-collection',
127
+ { 'data-layout': block.layout },
128
+ 'div',
102
129
  hasTitle
103
- ? heading(
104
- blockHeadingTag('collectionList') ?? 'h2',
105
- { class: 'cg-list__title-heading', 'data-field': 'title' },
106
- block.title ?? '',
130
+ ? h(
131
+ 'div',
132
+ { class: 'cg-head' },
133
+ heading(
134
+ blockHeadingTag('collectionList') ?? 'h2',
135
+ { class: 'cg-head__title', 'data-field': 'title' },
136
+ block.title ?? '',
137
+ ),
107
138
  )
108
139
  : null,
109
- block.layout === 'carousel'
140
+ block.layout === 'carousel' && entries.length > 0
110
141
  ? h(
111
142
  'div',
112
143
  {
113
- class: 'cg-list__viewport',
144
+ class: 'cg-collection__viewport',
114
145
  role: 'region',
115
146
  'aria-label': block.title ?? ctx.t('collection.carousel'),
116
147
  tabindex: '0',
@@ -7,42 +7,41 @@ import {
7
7
  heading,
8
8
  type RenderContext,
9
9
  } from '@cogenta/theme-kit'
10
+ import { section } from '../layout.js'
10
11
 
11
12
  /**
12
- * A full-width flat band, not a garish sales strip: the ask on the left and
13
- * the action on the right, separated by a vertical rule on wide screens —
14
- * the layout a serious B2B site uses for "talk to us", never centred copy
15
- * stacked above a button. `.cg-banner__inner` re-centres the ask/action
16
- * pair to the page's own measure while the flat tinted fill itself goes
17
- * edge to edge (`blocks.css`).
13
+ * The ink band: the one dark plane on a light page, edge to edge.
14
+ *
15
+ * The ask is set in the display serif across the left eight columns, the
16
+ * supporting line beneath it, and the actions sit in the right-hand columns
17
+ * on the band's baseline. In dark mode the band becomes the raised ink
18
+ * surface between two hairlines, so it keeps its role without inverting.
18
19
  */
19
20
  export function renderCta(block: CtaBlock, ctx: RenderContext): HtmlElement {
20
- return h(
21
+ return section(
21
22
  'section',
22
- { class: 'cg-banner', 'data-block': 'cta' },
23
+ 'cta',
24
+ 'cg-cta',
25
+ {},
26
+ 'div',
23
27
  h(
24
28
  'div',
25
- { class: 'cg-banner__inner' },
26
- h(
27
- 'div',
28
- { class: 'cg-banner__content' },
29
- heading(
30
- blockHeadingTag('cta') ?? 'h2',
31
- { class: 'cg-banner__title', 'data-field': 'title' },
32
- block.title,
33
- ),
34
- block.text === undefined
35
- ? null
36
- : h('p', { class: 'cg-banner__text', 'data-field': 'text' }, block.text),
37
- ),
38
- h(
39
- 'div',
40
- { class: 'cg-banner__actions' },
41
- // `actions` is required and non-empty for a `cta`, so the list is
42
- // always rendered; the null branch stays reachable only through
43
- // invalid data.
44
- actionList(ctx, block.actions, block.title),
29
+ { class: 'cg-cta__copy' },
30
+ heading(
31
+ blockHeadingTag('cta') ?? 'h2',
32
+ { class: 'cg-cta__title', 'data-field': 'title' },
33
+ block.title,
45
34
  ),
35
+ block.text === undefined
36
+ ? null
37
+ : h('p', { class: 'cg-cta__text', 'data-field': 'text' }, block.text),
38
+ ),
39
+ h(
40
+ 'div',
41
+ { class: 'cg-cta__actions' },
42
+ // `actions` is required and non-empty for a `cta`; the null branch is
43
+ // reachable only through invalid data.
44
+ actionList(ctx, block.actions, block.title),
46
45
  ),
47
46
  )
48
47
  }