@cogenta/theme-entreprise 1.1.3 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +61 -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 +103 -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 +137 -38
  110. package/src/styles/base.css +553 -426
  111. package/src/styles/blocks.css +1343 -1010
  112. package/src/styles/theme.css +18 -24
  113. package/src/styles/tokens.css +166 -192
  114. package/src/styles/widgets.css +914 -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":"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"}
@@ -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.4.0",
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.6",
40
+ "@cogenta/blocks": "1.1.4",
41
+ "@cogenta/theme-kit": "0.5.4"
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,66 +16,113 @@ 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),
103
+ renderKeyFigure(entry),
75
104
  ),
76
105
  )
77
106
  }
78
107
 
108
+ /**
109
+ * The one number a case study is remembered by, when the entry declares it
110
+ * (`keyFigure`, and `keyFigureLabel` for what it measures): set large under
111
+ * the summary, as a result on a data sheet. An entry without it renders
112
+ * exactly as before.
113
+ */
114
+ function renderKeyFigure(entry: ContentEntry): HtmlElement | null {
115
+ const value = entry.keyFigure
116
+ if (typeof value !== 'string' || value.trim() === '') return null
117
+ const label = typeof entry.keyFigureLabel === 'string' ? entry.keyFigureLabel : undefined
118
+ return h(
119
+ 'p',
120
+ { class: 'cg-entry__figure' },
121
+ h('span', { class: 'cg-entry__figure-value' }, value),
122
+ label === undefined ? null : h('span', { class: 'cg-entry__figure-label' }, label),
123
+ )
124
+ }
125
+
79
126
  export function renderCollectionList(
80
127
  block: CollectionListBlock,
81
128
  ctx: RenderContext,
@@ -85,32 +132,35 @@ export function renderCollectionList(
85
132
  const entryTag = nestedHeadingTag('collectionList', hasTitle)
86
133
  const items =
87
134
  entries.length === 0
88
- ? h('p', { class: 'cg-list__empty' }, ctx.t('collection.empty'))
135
+ ? h('p', { class: 'cg-collection__empty' }, ctx.t('collection.empty'))
89
136
  : h(
90
- 'ul',
91
- { class: 'cg-list__items' },
92
- entries.map((entry) => renderEntry(entry, ctx, entryTag)),
137
+ block.layout === 'list' ? 'ol' : 'ul',
138
+ { class: 'cg-collection__items', 'data-count': String(entries.length) },
139
+ entries.map((entry, index) => renderEntry(entry, index, ctx, entryTag)),
93
140
  )
94
141
 
95
- return h(
142
+ return section(
96
143
  'section',
97
- {
98
- class: 'cg-list',
99
- 'data-block': 'collectionList',
100
- 'data-layout': block.layout,
101
- },
144
+ 'collectionList',
145
+ 'cg-collection',
146
+ { 'data-layout': block.layout },
147
+ 'div',
102
148
  hasTitle
103
- ? heading(
104
- blockHeadingTag('collectionList') ?? 'h2',
105
- { class: 'cg-list__title-heading', 'data-field': 'title' },
106
- block.title ?? '',
149
+ ? h(
150
+ 'div',
151
+ { class: 'cg-head' },
152
+ heading(
153
+ blockHeadingTag('collectionList') ?? 'h2',
154
+ { class: 'cg-head__title', 'data-field': 'title' },
155
+ block.title ?? '',
156
+ ),
107
157
  )
108
158
  : null,
109
- block.layout === 'carousel'
159
+ block.layout === 'carousel' && entries.length > 0
110
160
  ? h(
111
161
  'div',
112
162
  {
113
- class: 'cg-list__viewport',
163
+ class: 'cg-collection__viewport',
114
164
  role: 'region',
115
165
  'aria-label': block.title ?? ctx.t('collection.carousel'),
116
166
  tabindex: '0',