@cogenta/theme-entreprise 1.1.2

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 (117) hide show
  1. package/LICENSE +373 -0
  2. package/dist/src/index.d.ts +16 -0
  3. package/dist/src/index.d.ts.map +1 -0
  4. package/dist/src/index.js +16 -0
  5. package/dist/src/index.js.map +1 -0
  6. package/dist/src/render/blocks/accordion.d.ts +4 -0
  7. package/dist/src/render/blocks/accordion.d.ts.map +1 -0
  8. package/dist/src/render/blocks/accordion.js +24 -0
  9. package/dist/src/render/blocks/accordion.js.map +1 -0
  10. package/dist/src/render/blocks/collection-list.d.ts +14 -0
  11. package/dist/src/render/blocks/collection-list.d.ts.map +1 -0
  12. package/dist/src/render/blocks/collection-list.js +55 -0
  13. package/dist/src/render/blocks/collection-list.js.map +1 -0
  14. package/dist/src/render/blocks/cta.d.ts +12 -0
  15. package/dist/src/render/blocks/cta.d.ts.map +1 -0
  16. package/dist/src/render/blocks/cta.js +19 -0
  17. package/dist/src/render/blocks/cta.js.map +1 -0
  18. package/dist/src/render/blocks/embed.d.ts +4 -0
  19. package/dist/src/render/blocks/embed.d.ts.map +1 -0
  20. package/dist/src/render/blocks/embed.js +92 -0
  21. package/dist/src/render/blocks/embed.js.map +1 -0
  22. package/dist/src/render/blocks/faq.d.ts +4 -0
  23. package/dist/src/render/blocks/faq.d.ts.map +1 -0
  24. package/dist/src/render/blocks/faq.js +25 -0
  25. package/dist/src/render/blocks/faq.js.map +1 -0
  26. package/dist/src/render/blocks/feature-grid.d.ts +4 -0
  27. package/dist/src/render/blocks/feature-grid.d.ts.map +1 -0
  28. package/dist/src/render/blocks/feature-grid.js +33 -0
  29. package/dist/src/render/blocks/feature-grid.js.map +1 -0
  30. package/dist/src/render/blocks/gallery.d.ts +15 -0
  31. package/dist/src/render/blocks/gallery.d.ts.map +1 -0
  32. package/dist/src/render/blocks/gallery.js +28 -0
  33. package/dist/src/render/blocks/gallery.js.map +1 -0
  34. package/dist/src/render/blocks/hero.d.ts +15 -0
  35. package/dist/src/render/blocks/hero.d.ts.map +1 -0
  36. package/dist/src/render/blocks/hero.js +31 -0
  37. package/dist/src/render/blocks/hero.js.map +1 -0
  38. package/dist/src/render/blocks/logo-strip.d.ts +4 -0
  39. package/dist/src/render/blocks/logo-strip.d.ts.map +1 -0
  40. package/dist/src/render/blocks/logo-strip.js +21 -0
  41. package/dist/src/render/blocks/logo-strip.js.map +1 -0
  42. package/dist/src/render/blocks/logos.d.ts +4 -0
  43. package/dist/src/render/blocks/logos.d.ts.map +1 -0
  44. package/dist/src/render/blocks/logos.js +30 -0
  45. package/dist/src/render/blocks/logos.js.map +1 -0
  46. package/dist/src/render/blocks/media-figure.d.ts +13 -0
  47. package/dist/src/render/blocks/media-figure.d.ts.map +1 -0
  48. package/dist/src/render/blocks/media-figure.js +28 -0
  49. package/dist/src/render/blocks/media-figure.js.map +1 -0
  50. package/dist/src/render/blocks/pricing-table.d.ts +4 -0
  51. package/dist/src/render/blocks/pricing-table.d.ts.map +1 -0
  52. package/dist/src/render/blocks/pricing-table.js +33 -0
  53. package/dist/src/render/blocks/pricing-table.js.map +1 -0
  54. package/dist/src/render/blocks/prose.d.ts +9 -0
  55. package/dist/src/render/blocks/prose.d.ts.map +1 -0
  56. package/dist/src/render/blocks/prose.js +10 -0
  57. package/dist/src/render/blocks/prose.js.map +1 -0
  58. package/dist/src/render/blocks/quote.d.ts +18 -0
  59. package/dist/src/render/blocks/quote.d.ts.map +1 -0
  60. package/dist/src/render/blocks/quote.js +31 -0
  61. package/dist/src/render/blocks/quote.js.map +1 -0
  62. package/dist/src/render/blocks/stat-counter.d.ts +4 -0
  63. package/dist/src/render/blocks/stat-counter.d.ts.map +1 -0
  64. package/dist/src/render/blocks/stat-counter.js +23 -0
  65. package/dist/src/render/blocks/stat-counter.js.map +1 -0
  66. package/dist/src/render/blocks/stats.d.ts +4 -0
  67. package/dist/src/render/blocks/stats.d.ts.map +1 -0
  68. package/dist/src/render/blocks/stats.js +23 -0
  69. package/dist/src/render/blocks/stats.js.map +1 -0
  70. package/dist/src/render/blocks/testimonial.d.ts +16 -0
  71. package/dist/src/render/blocks/testimonial.d.ts.map +1 -0
  72. package/dist/src/render/blocks/testimonial.js +25 -0
  73. package/dist/src/render/blocks/testimonial.js.map +1 -0
  74. package/dist/src/render/chrome.d.ts +3 -0
  75. package/dist/src/render/chrome.d.ts.map +1 -0
  76. package/dist/src/render/chrome.js +101 -0
  77. package/dist/src/render/chrome.js.map +1 -0
  78. package/dist/src/render/render-block.d.ts +24 -0
  79. package/dist/src/render/render-block.d.ts.map +1 -0
  80. package/dist/src/render/render-block.js +108 -0
  81. package/dist/src/render/render-block.js.map +1 -0
  82. package/dist/src/render/term-archive.d.ts +12 -0
  83. package/dist/src/render/term-archive.d.ts.map +1 -0
  84. package/dist/src/render/term-archive.js +34 -0
  85. package/dist/src/render/term-archive.js.map +1 -0
  86. package/dist/theme.config.d.ts +16 -0
  87. package/dist/theme.config.d.ts.map +1 -0
  88. package/dist/theme.config.js +46 -0
  89. package/dist/theme.config.js.map +1 -0
  90. package/package.json +57 -0
  91. package/src/index.ts +15 -0
  92. package/src/render/blocks/accordion.ts +60 -0
  93. package/src/render/blocks/collection-list.ts +122 -0
  94. package/src/render/blocks/cta.ts +48 -0
  95. package/src/render/blocks/embed.ts +115 -0
  96. package/src/render/blocks/faq.ts +61 -0
  97. package/src/render/blocks/feature-grid.ts +73 -0
  98. package/src/render/blocks/gallery.ts +48 -0
  99. package/src/render/blocks/hero.ts +60 -0
  100. package/src/render/blocks/logo-strip.ts +36 -0
  101. package/src/render/blocks/logos.ts +60 -0
  102. package/src/render/blocks/media-figure.ts +43 -0
  103. package/src/render/blocks/pricing-table.ts +77 -0
  104. package/src/render/blocks/prose.ts +11 -0
  105. package/src/render/blocks/quote.ts +48 -0
  106. package/src/render/blocks/stat-counter.ts +45 -0
  107. package/src/render/blocks/stats.ts +50 -0
  108. package/src/render/blocks/testimonial.ts +41 -0
  109. package/src/render/chrome.ts +128 -0
  110. package/src/render/render-block.ts +144 -0
  111. package/src/render/term-archive.ts +80 -0
  112. package/src/styles/archive.css +68 -0
  113. package/src/styles/base.css +895 -0
  114. package/src/styles/blocks.css +1433 -0
  115. package/src/styles/theme.css +36 -0
  116. package/src/styles/tokens.css +326 -0
  117. package/tokens.json +36 -0
@@ -0,0 +1,23 @@
1
+ import { blockHeadingTag, h, heading, } from '@cogenta/theme-kit';
2
+ /**
3
+ * `blocks@2.0` (RFC 0001). Narrower than `stats` (no `unit`), and treated
4
+ * that way here: `stats` reads as a quiet KPI strip on the page's own
5
+ * surface, while `statCounter` is this theme's confident "impact numbers"
6
+ * band — an accent-tinted panel of big, tabular figures, the instinct the
7
+ * aesthetic direction already asks for on `stats` pushed one step further
8
+ * for the narrower, single-figure shape this block offers.
9
+ *
10
+ * A `<dl>`, exactly like `stats`: each figure is the description of its
11
+ * label, which is what `<dt>`/`<dd>` mean. The label sits before the figure
12
+ * in markup, the same reading-order guarantee `stats` gives (WCAG 1.3.2);
13
+ * the stylesheet is free to paint the big figure first.
14
+ */
15
+ function renderItem(item) {
16
+ return h('div', { class: 'cg-kpi' }, h('dt', { class: 'cg-kpi__label' }, item.label), h('dd', { class: 'cg-kpi__value' }, item.value));
17
+ }
18
+ export function renderStatCounter(block, _ctx) {
19
+ return h('section', { class: 'cg-kpis', 'data-block': 'statCounter' }, block.title === undefined
20
+ ? null
21
+ : heading(blockHeadingTag('statCounter') ?? 'h2', { class: 'cg-kpis__title', 'data-field': 'title' }, block.title), h('dl', { class: 'cg-kpis__items' }, block.stats.map(renderItem)));
22
+ }
23
+ //# sourceMappingURL=stat-counter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stat-counter.js","sourceRoot":"","sources":["../../../../src/render/blocks/stat-counter.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EAEf,CAAC,EACD,OAAO,GAER,MAAM,oBAAoB,CAAA;AAE3B;;;;;;;;;;;;GAYG;AACH,SAAS,UAAU,CAAC,IAAqB;IACvC,OAAO,CAAC,CACN,KAAK,EACL,EAAE,KAAK,EAAE,QAAQ,EAAE,EACnB,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,EAC/C,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAChD,CAAA;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAuB,EAAE,IAAmB;IAC5E,OAAO,CAAC,CACN,SAAS,EACT,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,EACjD,KAAK,CAAC,KAAK,KAAK,SAAS;QACvB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,OAAO,CACL,eAAe,CAAC,aAAa,CAAC,IAAI,IAAI,EACtC,EAAE,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,OAAO,EAAE,EAClD,KAAK,CAAC,KAAK,CACZ,EACL,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAClE,CAAA;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { StatsBlock } from '@cogenta/blocks';
2
+ import { type HtmlElement, type RenderContext } from '@cogenta/theme-kit';
3
+ export declare function renderStats(block: StatsBlock, _ctx: RenderContext): HtmlElement;
4
+ //# sourceMappingURL=stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../../src/render/blocks/stats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAEL,KAAK,WAAW,EAGhB,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAA;AA6B3B,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,GAAG,WAAW,CAa/E"}
@@ -0,0 +1,23 @@
1
+ import { blockHeadingTag, h, heading, } from '@cogenta/theme-kit';
2
+ /**
3
+ * The "by the numbers" strip. A description list, exactly as the canonical
4
+ * theme uses — each figure is the description of its label, which is what
5
+ * `<dt>`/`<dd>` mean, and it survives being read linearly — but laid out as
6
+ * one continuous row of big, confident figures separated by vertical rules
7
+ * (`border-inline-start` on every item but the first) rather than as
8
+ * separate shadowed tiles: the "real KPI strip" read the aesthetic
9
+ * direction asks for.
10
+ *
11
+ * The label sits above the figure in the markup and the skin is free to
12
+ * repaint the order visually; reading order and visual order stay
13
+ * independent either way (WCAG 1.3.2).
14
+ */
15
+ function renderItem(item) {
16
+ return h('div', { class: 'cg-metric' }, h('dt', { class: 'cg-metric__label' }, item.label), h('dd', { class: 'cg-metric__value' }, item.value, item.unit === undefined ? null : h('span', { class: 'cg-metric__unit' }, item.unit)));
17
+ }
18
+ export function renderStats(block, _ctx) {
19
+ return h('section', { class: 'cg-metrics', 'data-block': 'stats' }, block.title === undefined
20
+ ? null
21
+ : heading(blockHeadingTag('stats') ?? 'h2', { class: 'cg-metrics__title', 'data-field': 'title' }, block.title), h('dl', { class: 'cg-metrics__items' }, block.items.map(renderItem)));
22
+ }
23
+ //# sourceMappingURL=stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../../src/render/blocks/stats.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EAEf,CAAC,EACD,OAAO,GAER,MAAM,oBAAoB,CAAA;AAE3B;;;;;;;;;;;;GAYG;AACH,SAAS,UAAU,CAAC,IAAc;IAChC,OAAO,CAAC,CACN,KAAK,EACL,EAAE,KAAK,EAAE,WAAW,EAAE,EACtB,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,EAClD,CAAC,CACC,IAAI,EACJ,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAC7B,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CACpF,CACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAiB,EAAE,IAAmB;IAChE,OAAO,CAAC,CACN,SAAS,EACT,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,EAC9C,KAAK,CAAC,KAAK,KAAK,SAAS;QACvB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,OAAO,CACL,eAAe,CAAC,OAAO,CAAC,IAAI,IAAI,EAChC,EAAE,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,OAAO,EAAE,EACrD,KAAK,CAAC,KAAK,CACZ,EACL,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CACrE,CAAA;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { TestimonialBlock } from '@cogenta/blocks';
2
+ import { type HtmlElement, type RenderContext } from '@cogenta/theme-kit';
3
+ /**
4
+ * `blocks@2.0` (RFC 0001). This theme's "client success" panel — the same
5
+ * `<figure><blockquote>…</blockquote><figcaption>` pattern `quote` uses, kept
6
+ * consistent so the two read as siblings, but the quote itself is rich text
7
+ * (a testimonial may carry a link or emphasis the shorter, plain-text `quote`
8
+ * block cannot) and the attribution is the block's single grouped
9
+ * `attribution` field rather than three loose ones.
10
+ *
11
+ * The avatar is decorative, exactly like `quote`'s own: the name sits right
12
+ * beside it in text, so its media entity's alt text is expected to be empty;
13
+ * `image` still writes the attribute either way (WCAG 1.1.1).
14
+ */
15
+ export declare function renderTestimonial(block: TestimonialBlock, ctx: RenderContext): HtmlElement;
16
+ //# sourceMappingURL=testimonial.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testimonial.d.ts","sourceRoot":"","sources":["../../../../src/render/blocks/testimonial.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,KAAK,WAAW,EAAY,KAAK,aAAa,EAAkB,MAAM,oBAAoB,CAAA;AAEnG;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,EAAE,aAAa,GAAG,WAAW,CAyB1F"}
@@ -0,0 +1,25 @@
1
+ import { h, image, renderRichText } from '@cogenta/theme-kit';
2
+ /**
3
+ * `blocks@2.0` (RFC 0001). This theme's "client success" panel — the same
4
+ * `<figure><blockquote>…</blockquote><figcaption>` pattern `quote` uses, kept
5
+ * consistent so the two read as siblings, but the quote itself is rich text
6
+ * (a testimonial may carry a link or emphasis the shorter, plain-text `quote`
7
+ * block cannot) and the attribution is the block's single grouped
8
+ * `attribution` field rather than three loose ones.
9
+ *
10
+ * The avatar is decorative, exactly like `quote`'s own: the name sits right
11
+ * beside it in text, so its media entity's alt text is expected to be empty;
12
+ * `image` still writes the attribute either way (WCAG 1.1.1).
13
+ */
14
+ export function renderTestimonial(block, ctx) {
15
+ const { attribution } = block;
16
+ return h('figure', { class: 'cg-testimonial', 'data-block': 'testimonial' }, h('blockquote', { class: 'cg-testimonial__quote' }, renderRichText(ctx, block.quote)), h('figcaption', { class: 'cg-testimonial__attribution' }, attribution.avatar === undefined
17
+ ? null
18
+ : image(ctx, attribution.avatar, {
19
+ className: 'cg-testimonial__avatar',
20
+ variant: { width: 96, height: 96, fit: 'cover' },
21
+ }), h('span', { class: 'cg-testimonial__who' }, h('span', { class: 'cg-testimonial__name' }, attribution.name), attribution.role === undefined
22
+ ? null
23
+ : h('span', { class: 'cg-testimonial__role' }, attribution.role))));
24
+ }
25
+ //# sourceMappingURL=testimonial.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testimonial.js","sourceRoot":"","sources":["../../../../src/render/blocks/testimonial.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,CAAC,EAAE,KAAK,EAAsB,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEnG;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAuB,EAAE,GAAkB;IAC3E,MAAM,EAAE,WAAW,EAAE,GAAG,KAAK,CAAA;IAC7B,OAAO,CAAC,CACN,QAAQ,EACR,EAAE,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,EACxD,CAAC,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE,EAAE,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EACrF,CAAC,CACC,YAAY,EACZ,EAAE,KAAK,EAAE,6BAA6B,EAAE,EACxC,WAAW,CAAC,MAAM,KAAK,SAAS;QAC9B,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,MAAM,EAAE;YAC7B,SAAS,EAAE,wBAAwB;YACnC,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;SACjD,CAAC,EACN,CAAC,CACC,MAAM,EACN,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAChC,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,EAAE,WAAW,CAAC,IAAI,CAAC,EAC9D,WAAW,CAAC,IAAI,KAAK,SAAS;QAC5B,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,EAAE,WAAW,CAAC,IAAI,CAAC,CACnE,CACF,CACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type ChromeInput, type ChromeResult } from '@cogenta/theme-kit';
2
+ export declare function renderChrome(input: ChromeInput): ChromeResult;
3
+ //# sourceMappingURL=chrome.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chrome.d.ts","sourceRoot":"","sources":["../../../src/render/chrome.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAEhB,KAAK,YAAY,EAOlB,MAAM,oBAAoB,CAAA;AA8D3B,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,YAAY,CAuD7D"}
@@ -0,0 +1,101 @@
1
+ import { escapeAttribute, escapeText, renderBrandMark, renderSocialLinks, renderThemeToggle, serialize, } from '@cogenta/theme-kit';
2
+ /**
3
+ * This theme's own header and footer (`theme@1.4`) — a structurally
4
+ * different chrome from the canonical theme's, not a recolour of it.
5
+ *
6
+ * Header: a sticky bar with the corporate wordmark/logo on the left, a real
7
+ * desktop `<nav>`, `headerAction` (`theme@1.4`) rendered as a filled button
8
+ * — the one place this hairline-first chrome spends a solid accent surface
9
+ * — and, below the breakpoint the stylesheet sets, a CSS-only mobile menu:
10
+ * a checkbox (`#cg-nav-toggle`, visually hidden but still focusable and
11
+ * Space-operable) paired with a `<label>` styled as a three-bar button. No
12
+ * `<script>` anywhere: the sibling combinator in `base.css` is what shows
13
+ * the nav panel when the box is checked. This replaces the previous
14
+ * "the last header link doubles as the call to action" convention — with a
15
+ * real `headerAction` field, inventing a role for a plain nav link is no
16
+ * longer the honest reading of the data.
17
+ *
18
+ * Footer: a real four-column layout — a brand column (site name + `tagline`,
19
+ * `theme@1.4`), the site's own footer navigation, `social` (`theme@1.4`, via
20
+ * `renderSocialLinks`), and a fourth column carrying `footerNote`
21
+ * (`theme@1.4`) above Cogenta's own credit (or its white-label replacement).
22
+ * `brandingHtml` is placed exactly once, inside the footer, exactly as
23
+ * received: never altered, never dropped.
24
+ *
25
+ * The manual light/dark/system control (`renderThemeToggle`, `@cogenta/
26
+ * theme-kit`, L26) sits beside the mobile menu button, outside the `<nav>`
27
+ * it controls the collapse of — the `<nav>` panel is hidden under the
28
+ * breakpoint until the checkbox is checked, but a visitor must be able to
29
+ * flip appearance without opening that panel first, on desktop or mobile.
30
+ * This module ships no CSS of its own for it (`base.css` owns
31
+ * `.cg-theme-toggle`, in this theme's own visual register, not canonical's).
32
+ */
33
+ function navItems(links) {
34
+ return links
35
+ .filter((link) => link.href !== null || link.kind === 'submenu-placeholder')
36
+ .map((link) => {
37
+ const label = escapeText(link.label);
38
+ const titleAttr = link.title === null ? '' : ` title="${escapeAttribute(link.title)}"`;
39
+ if (link.href === null)
40
+ return `<li><span${titleAttr}>${label}</span></li>`;
41
+ const href = escapeAttribute(link.href);
42
+ const target = link.openInNewTab ? ' target="_blank" rel="noopener"' : '';
43
+ return `<li><a href="${href}"${target}${titleAttr}>${label}</a></li>`;
44
+ })
45
+ .join('');
46
+ }
47
+ function renderNavList(links) {
48
+ const items = navItems(links);
49
+ return items === '' ? '' : `<ul class="cg-nav__items">${items}</ul>`;
50
+ }
51
+ /** The header's own call-to-action link (`theme@1.4`) — a filled button, distinct from the ordinary nav list. */
52
+ function renderHeaderAction(action) {
53
+ if (action === undefined)
54
+ return '';
55
+ return (`<a class="cg-action cg-site-header__action" data-emphasis="primary" ` +
56
+ `href="${escapeAttribute(action.href)}">${escapeText(action.label)}</a>`);
57
+ }
58
+ export function renderChrome(input) {
59
+ const siteNameText = escapeText(input.site.name);
60
+ const headerNavList = renderNavList(input.headerNav);
61
+ const headerAction = renderHeaderAction(input.headerAction);
62
+ const footerNavList = renderNavList(input.footerNav);
63
+ // A B2B header is a corporate identity slot before it is a wordmark slot.
64
+ const mark = renderBrandMark(input.brand, { className: 'cg-site-header__logo' }) ?? siteNameText;
65
+ const themeToggle = serialize(renderThemeToggle(input.locale, { className: 'cg-theme-toggle' }));
66
+ const header = `<header class="cg-site-header"><div class="cg-site-header__inner">` +
67
+ `<a class="cg-site-header__home" href="${escapeAttribute(input.homeHref)}">${mark}</a>` +
68
+ `<input type="checkbox" id="cg-nav-toggle" class="cg-nav-toggle-input" aria-label="Menu">` +
69
+ `<label for="cg-nav-toggle" class="cg-nav-toggle-label" aria-hidden="true">` +
70
+ `<span class="cg-nav-toggle-bar"></span><span class="cg-nav-toggle-bar"></span><span class="cg-nav-toggle-bar"></span>` +
71
+ `</label>` +
72
+ `${themeToggle}` +
73
+ `<nav class="cg-site-header__nav" id="cg-nav" aria-label="Primary">` +
74
+ `${headerNavList}${headerAction}` +
75
+ `</nav>` +
76
+ `</div></header>`;
77
+ const tagline = input.tagline === undefined
78
+ ? ''
79
+ : `<p class="cg-site-footer__tagline" data-field="tagline">${escapeText(input.tagline)}</p>`;
80
+ const social = input.social === undefined
81
+ ? ''
82
+ : serialize(renderSocialLinks(input.social, {
83
+ className: 'cg-site-footer__social',
84
+ itemClassName: 'cg-site-footer__social-item',
85
+ }) ?? { kind: 'text', value: '' });
86
+ const footerNote = input.footerNote === undefined
87
+ ? ''
88
+ : `<p class="cg-site-footer__note">${escapeText(input.footerNote)}</p>`;
89
+ const footer = `<footer class="cg-site-footer"><div class="cg-site-footer__grid">` +
90
+ `<div class="cg-site-footer__brand">` +
91
+ `<a href="${escapeAttribute(input.homeHref)}">${siteNameText}</a>${tagline}` +
92
+ `</div>` +
93
+ `${footerNavList === ''
94
+ ? ''
95
+ : `<nav class="cg-site-footer__nav" aria-label="Footer">${footerNavList}</nav>`}` +
96
+ `${social === '' ? '' : `<div class="cg-site-footer__social-col">${social}</div>`}` +
97
+ `<div class="cg-site-footer__meta">${footerNote}<div class="cg-site-footer__branding">${input.brandingHtml}</div></div>` +
98
+ `</div><div class="cg-site-footer__bottom"><span>${siteNameText}</span></div></footer>`;
99
+ return { header, footer };
100
+ }
101
+ //# sourceMappingURL=chrome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chrome.js","sourceRoot":"","sources":["../../../src/render/chrome.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,eAAe,EACf,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,SAAS,GACV,MAAM,oBAAoB,CAAA;AAE3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,SAAS,QAAQ,CAAC,KAA+B;IAC/C,OAAO,KAAK;SACT,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,qBAAqB,CAAC;SAC3E,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAA;QACtF,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO,YAAY,SAAS,IAAI,KAAK,cAAc,CAAA;QAC3E,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,EAAE,CAAA;QACzE,OAAO,gBAAgB,IAAI,IAAI,MAAM,GAAG,SAAS,IAAI,KAAK,WAAW,CAAA;IACvE,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAA;AACb,CAAC;AAED,SAAS,aAAa,CAAC,KAA+B;IACpD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC7B,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,6BAA6B,KAAK,OAAO,CAAA;AACtE,CAAC;AAED,iHAAiH;AACjH,SAAS,kBAAkB,CAAC,MAAmC;IAC7D,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,CAAA;IACnC,OAAO,CACL,sEAAsE;QACtE,SAAS,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CACzE,CAAA;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAkB;IAC7C,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAChD,MAAM,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IACpD,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;IAC3D,MAAM,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IACpD,0EAA0E;IAC1E,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,sBAAsB,EAAE,CAAC,IAAI,YAAY,CAAA;IAChG,MAAM,WAAW,GAAG,SAAS,CAAC,iBAAiB,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAA;IAEhG,MAAM,MAAM,GACV,oEAAoE;QACpE,yCAAyC,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,MAAM;QACvF,0FAA0F;QAC1F,4EAA4E;QAC5E,uHAAuH;QACvH,UAAU;QACV,GAAG,WAAW,EAAE;QAChB,oEAAoE;QACpE,GAAG,aAAa,GAAG,YAAY,EAAE;QACjC,QAAQ;QACR,iBAAiB,CAAA;IAEnB,MAAM,OAAO,GACX,KAAK,CAAC,OAAO,KAAK,SAAS;QACzB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,2DAA2D,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAA;IAChG,MAAM,MAAM,GACV,KAAK,CAAC,MAAM,KAAK,SAAS;QACxB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,SAAS,CACP,iBAAiB,CAAC,KAAK,CAAC,MAAM,EAAE;YAC9B,SAAS,EAAE,wBAAwB;YACnC,aAAa,EAAE,6BAA6B;SAC7C,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAClC,CAAA;IACP,MAAM,UAAU,GACd,KAAK,CAAC,UAAU,KAAK,SAAS;QAC5B,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,mCAAmC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAA;IAE3E,MAAM,MAAM,GACV,mEAAmE;QACnE,qCAAqC;QACrC,YAAY,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,YAAY,OAAO,OAAO,EAAE;QAC5E,QAAQ;QACR,GACE,aAAa,KAAK,EAAE;YAClB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,wDAAwD,aAAa,QAC3E,EAAE;QACF,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,2CAA2C,MAAM,QAAQ,EAAE;QACnF,qCAAqC,UAAU,yCAAyC,KAAK,CAAC,YAAY,cAAc;QACxH,mDAAmD,YAAY,wBAAwB,CAAA;IAEzF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;AAC3B,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { type BlockRegistry, type VocabularyBlock } from '@cogenta/blocks';
2
+ import { type FetchedEntries, type HtmlElement, type PageContent, pageHasOwnHeading, type RenderContext, renderEntryHeader, withBlockKey } from '@cogenta/theme-kit';
3
+ export type { FetchedEntries, PageContent };
4
+ export { pageHasOwnHeading, renderEntryHeader, withBlockKey };
5
+ export declare function renderBlock(block: VocabularyBlock, ctx: RenderContext, entries?: FetchedEntries, registry?: BlockRegistry): HtmlElement | null;
6
+ /**
7
+ * `<main id="cg-main">` is mandatory: it is the skip-link's target, written
8
+ * once by `@cogenta/cli`'s `theme-render.ts` outside any theme's control.
9
+ *
10
+ * `renderEntryHeader` (`theme@1.4`) draws the eyebrow/title/excerpt/meta/
11
+ * cover furniture for a page backed by a real content entry — a service or
12
+ * a plain page — and already returns `null` for a page with no `entry`
13
+ * meta *and* for one whose blocks draw their own heading (a `hero`), so the
14
+ * bare `<h1 class="cg-page__title">` fallback below is the right markup in
15
+ * both of those cases and only those — never a double heading, and never a
16
+ * page with none at all.
17
+ *
18
+ * `withBlockKey` stamps every rendered block with its contract-B `_key` —
19
+ * required so the visual page builder (L16) can map a clicked element in
20
+ * the rendered iframe back to the block that produced it, for this theme
21
+ * exactly as for every other one.
22
+ */
23
+ export declare function renderPage(page: PageContent, ctx: RenderContext, entries?: FetchedEntries, registry?: BlockRegistry): HtmlElement;
24
+ //# sourceMappingURL=render-block.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-block.d.ts","sourceRoot":"","sources":["../../../src/render/render-block.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAoB,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAC5F,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,WAAW,EAEhB,KAAK,WAAW,EAChB,iBAAiB,EACjB,KAAK,aAAa,EAClB,iBAAiB,EAEjB,YAAY,EAEb,MAAM,oBAAoB,CAAA;AAmB3B,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,CAAA;AAC3C,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,YAAY,EAAE,CAAA;AAE7D,wBAAgB,WAAW,CACzB,KAAK,EAAE,eAAe,EACtB,GAAG,EAAE,aAAa,EAClB,OAAO,GAAE,cAAmB,EAC5B,QAAQ,CAAC,EAAE,aAAa,GACvB,WAAW,GAAG,IAAI,CAapB;AAwDD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,aAAa,EAClB,OAAO,GAAE,cAAmB,EAC5B,QAAQ,CAAC,EAAE,aAAa,GACvB,WAAW,CAab"}
@@ -0,0 +1,108 @@
1
+ import { VOCABULARY_NAMES } from '@cogenta/blocks';
2
+ import { h, pageHasOwnHeading, renderEntryHeader, resolveBlockForRender, withBlockKey, withBlockVariant, } from '@cogenta/theme-kit';
3
+ import { renderAccordion } from './blocks/accordion.js';
4
+ import { renderCollectionList } from './blocks/collection-list.js';
5
+ import { renderCta } from './blocks/cta.js';
6
+ import { renderEmbed } from './blocks/embed.js';
7
+ import { renderFaq } from './blocks/faq.js';
8
+ import { renderFeatureGrid } from './blocks/feature-grid.js';
9
+ import { renderGallery } from './blocks/gallery.js';
10
+ import { renderHero } from './blocks/hero.js';
11
+ import { renderLogoStrip } from './blocks/logo-strip.js';
12
+ import { renderLogos } from './blocks/logos.js';
13
+ import { renderMediaFigure } from './blocks/media-figure.js';
14
+ import { renderPricingTable } from './blocks/pricing-table.js';
15
+ import { renderProse } from './blocks/prose.js';
16
+ import { renderQuote } from './blocks/quote.js';
17
+ import { renderStatCounter } from './blocks/stat-counter.js';
18
+ import { renderStats } from './blocks/stats.js';
19
+ import { renderTestimonial } from './blocks/testimonial.js';
20
+ export { pageHasOwnHeading, renderEntryHeader, withBlockKey };
21
+ export function renderBlock(block, ctx, entries = {}, registry) {
22
+ // `block`'s type says `VocabularyBlock`, but the value crossing this
23
+ // boundary from stored content is not always literally one of the shared
24
+ // vocabulary — resolving here is what turns an unimplemented theme-private
25
+ // block into its declared fallback instead of a silently blank slot.
26
+ const resolved = resolveBlockForRender(block, VOCABULARY_NAMES, registry);
27
+ if (resolved === null)
28
+ return null;
29
+ const known = resolved;
30
+ // `withBlockVariant` (blocks@2.0, RFC 0002) is applied once here, after
31
+ // dispatch, rather than inside each of the seventeen block renderers —
32
+ // `variant` is envelope data every block carries identically, exactly the
33
+ // same reasoning `withBlockKey` in `renderPage` already follows for `_key`.
34
+ return withBlockVariant(renderKnownBlock(known, ctx, entries), known.variant);
35
+ }
36
+ function renderKnownBlock(known, ctx, entries) {
37
+ switch (known._type) {
38
+ case 'hero':
39
+ return renderHero(known, ctx);
40
+ case 'prose':
41
+ return renderProse(known, ctx);
42
+ case 'mediaFigure':
43
+ return renderMediaFigure(known, ctx);
44
+ case 'featureGrid':
45
+ return renderFeatureGrid(known, ctx);
46
+ case 'cta':
47
+ return renderCta(known, ctx);
48
+ case 'gallery':
49
+ return renderGallery(known, ctx);
50
+ case 'quote':
51
+ return renderQuote(known, ctx);
52
+ case 'faq':
53
+ return renderFaq(known, ctx);
54
+ case 'stats':
55
+ return renderStats(known, ctx);
56
+ case 'logos':
57
+ return renderLogos(known, ctx);
58
+ case 'collectionList':
59
+ return renderCollectionList(known, ctx, entries[known._key] ?? []);
60
+ case 'embed':
61
+ return renderEmbed(known, ctx);
62
+ case 'testimonial':
63
+ return renderTestimonial(known, ctx);
64
+ case 'pricingTable':
65
+ return renderPricingTable(known, ctx);
66
+ case 'accordion':
67
+ return renderAccordion(known, ctx);
68
+ case 'statCounter':
69
+ return renderStatCounter(known, ctx);
70
+ case 'logoStrip':
71
+ return renderLogoStrip(known, ctx);
72
+ default: {
73
+ // Exhaustive over contract B's vocabulary: `known` is `never` here, so
74
+ // a block this package does not implement stops it compiling until it
75
+ // is. Returning null rather than throwing is deliberate — a theme has
76
+ // no access to `@cogenta/core`'s error types (contract D refuses the
77
+ // import), and choosing a fallback block is the render layer's job,
78
+ // not the theme's.
79
+ const unreachable = known;
80
+ void unreachable;
81
+ return null;
82
+ }
83
+ }
84
+ }
85
+ /**
86
+ * `<main id="cg-main">` is mandatory: it is the skip-link's target, written
87
+ * once by `@cogenta/cli`'s `theme-render.ts` outside any theme's control.
88
+ *
89
+ * `renderEntryHeader` (`theme@1.4`) draws the eyebrow/title/excerpt/meta/
90
+ * cover furniture for a page backed by a real content entry — a service or
91
+ * a plain page — and already returns `null` for a page with no `entry`
92
+ * meta *and* for one whose blocks draw their own heading (a `hero`), so the
93
+ * bare `<h1 class="cg-page__title">` fallback below is the right markup in
94
+ * both of those cases and only those — never a double heading, and never a
95
+ * page with none at all.
96
+ *
97
+ * `withBlockKey` stamps every rendered block with its contract-B `_key` —
98
+ * required so the visual page builder (L16) can map a clicked element in
99
+ * the rendered iframe back to the block that produced it, for this theme
100
+ * exactly as for every other one.
101
+ */
102
+ export function renderPage(page, ctx, entries = {}, registry) {
103
+ const entryHeader = renderEntryHeader(page, ctx);
104
+ return h('main', { class: 'cg-main', id: 'cg-main' }, entryHeader, entryHeader === null && !pageHasOwnHeading(page.blocks)
105
+ ? h('h1', { class: 'cg-page__title' }, page.title)
106
+ : null, page.blocks.map((block) => withBlockKey(renderBlock(block, ctx, entries, registry), block._key)));
107
+ }
108
+ //# sourceMappingURL=render-block.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-block.js","sourceRoot":"","sources":["../../../src/render/render-block.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type HtmlElement, type TermArchiveInput } from '@cogenta/theme-kit';
2
+ /**
3
+ * The taxonomy-term archive (contract D `theme@1.3`) — a resource index.
4
+ *
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.
10
+ */
11
+ export declare function renderTermArchive(input: TermArchiveInput): HtmlElement;
12
+ //# sourceMappingURL=term-archive.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,34 @@
1
+ import { h } from '@cogenta/theme-kit';
2
+ /**
3
+ * The taxonomy-term archive (contract D `theme@1.3`) — a resource index.
4
+ *
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.
10
+ */
11
+ export function renderTermArchive(input) {
12
+ const rows = input.entries.map((entry) => h('li', { class: 'cg-list__row' }, entry.publishedAt === null
13
+ ? 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
18
+ ? 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));
24
+ }
25
+ function pager(input) {
26
+ if (input.page.previousHref === null && input.page.nextHref === null)
27
+ return null;
28
+ return h('nav', { class: 'cg-archive__pager', 'aria-label': input.labels.pagination }, input.page.previousHref === null
29
+ ? null
30
+ : h('a', { rel: 'prev', href: input.page.previousHref }, input.labels.previous), input.page.nextHref === null
31
+ ? null
32
+ : h('a', { rel: 'next', href: input.page.nextHref }, input.labels.next));
33
+ }
34
+ //# sourceMappingURL=term-archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"term-archive.js","sourceRoot":"","sources":["../../../src/render/term-archive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Contract D — Thème, `theme@1.0`/`1.1`.
3
+ *
4
+ * `implements` lists the seventeen blocks of contract B (`blocks@2.0`, RFC
5
+ * 0001) in the order the contract lists them — see
6
+ * `@cogenta/theme-canonical/theme.config.ts` for why that order matters
7
+ * (installation refuses an incomplete theme).
8
+ *
9
+ * `runtime: 'static'` describes what this theme package itself needs; the
10
+ * one block in the vocabulary that reads at request time (`collectionList`)
11
+ * still declares `runtime: 'server'` on its own, in the vocabulary — that is
12
+ * a property of the block, not of the theme rendering it.
13
+ */
14
+ declare const _default: import("@cogenta/render").ThemeManifest;
15
+ export default _default;
16
+ //# sourceMappingURL=theme.config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.config.d.ts","sourceRoot":"","sources":["../theme.config.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG"}
@@ -0,0 +1,46 @@
1
+ import { defineTheme } from '@cogenta/render';
2
+ /**
3
+ * Contract D — Thème, `theme@1.0`/`1.1`.
4
+ *
5
+ * `implements` lists the seventeen blocks of contract B (`blocks@2.0`, RFC
6
+ * 0001) in the order the contract lists them — see
7
+ * `@cogenta/theme-canonical/theme.config.ts` for why that order matters
8
+ * (installation refuses an incomplete theme).
9
+ *
10
+ * `runtime: 'static'` describes what this theme package itself needs; the
11
+ * one block in the vocabulary that reads at request time (`collectionList`)
12
+ * still declares `runtime: 'server'` on its own, in the vocabulary — that is
13
+ * a property of the block, not of the theme rendering it.
14
+ */
15
+ export default defineTheme({
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.',
19
+ author: 'Cogenta',
20
+ engine: '^1.0.0',
21
+ blocks: '^2.0.0',
22
+ implements: [
23
+ 'hero',
24
+ 'prose',
25
+ 'mediaFigure',
26
+ 'featureGrid',
27
+ 'cta',
28
+ 'gallery',
29
+ 'quote',
30
+ 'faq',
31
+ 'stats',
32
+ 'logos',
33
+ 'collectionList',
34
+ 'embed',
35
+ 'testimonial',
36
+ 'pricingTable',
37
+ 'accordion',
38
+ 'statCounter',
39
+ 'logoStrip',
40
+ ],
41
+ collections: ['article', 'page'],
42
+ runtime: 'static',
43
+ tokens: './tokens.json',
44
+ a11y: { verified: 'WCAG-2.2-AA' },
45
+ });
46
+ //# sourceMappingURL=theme.config.js.map
@@ -0,0 +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"}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@cogenta/theme-entreprise",
3
+ "version": "1.1.2",
4
+ "description": "A confident, premium B2B theme for Cogenta: structured typography, real KPI/impact sections, a genuine dark mode, and zero client JavaScript.",
5
+ "license": "MPL-2.0",
6
+ "type": "module",
7
+ "sideEffects": false,
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/src/index.d.ts",
11
+ "default": "./dist/src/index.js"
12
+ },
13
+ "./theme.config": {
14
+ "types": "./dist/theme.config.d.ts",
15
+ "default": "./dist/theme.config.js"
16
+ },
17
+ "./tokens.json": "./tokens.json",
18
+ "./styles/theme.css": "./src/styles/theme.css",
19
+ "./styles/*.css": "./src/styles/*.css"
20
+ },
21
+ "files": [
22
+ "dist",
23
+ "src",
24
+ "tokens.json"
25
+ ],
26
+ "engines": {
27
+ "node": ">=22.11.0"
28
+ },
29
+ "publishConfig": {
30
+ "access": "public",
31
+ "provenance": true
32
+ },
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "git+https://github.com/cogenta-cms/cogenta.git",
36
+ "directory": "packages/theme-entreprise"
37
+ },
38
+ "dependencies": {
39
+ "@cogenta/blocks": "1.0.3",
40
+ "@cogenta/theme-kit": "0.3.2",
41
+ "@cogenta/render": "0.2.3"
42
+ },
43
+ "peerDependencies": {
44
+ "astro": "^7.2.1"
45
+ },
46
+ "devDependencies": {
47
+ "astro": "^7.2.1",
48
+ "typescript": "^7.0.2",
49
+ "vitest": "^4.1.10"
50
+ },
51
+ "scripts": {
52
+ "build": "tsc -p tsconfig.json",
53
+ "typecheck": "tsc -p tsconfig.typecheck.json",
54
+ "test": "vitest run --passWithNoTests",
55
+ "test:integration": "vitest run --config vitest.integration.config.ts --passWithNoTests"
56
+ }
57
+ }
package/src/index.ts ADDED
@@ -0,0 +1,15 @@
1
+ export * from './render/blocks/collection-list.js'
2
+ export * from './render/blocks/cta.js'
3
+ export * from './render/blocks/embed.js'
4
+ export * from './render/blocks/faq.js'
5
+ export * from './render/blocks/feature-grid.js'
6
+ export * from './render/blocks/gallery.js'
7
+ export * from './render/blocks/hero.js'
8
+ export * from './render/blocks/logos.js'
9
+ export * from './render/blocks/media-figure.js'
10
+ export * from './render/blocks/prose.js'
11
+ export * from './render/blocks/quote.js'
12
+ export * from './render/blocks/stats.js'
13
+ export * from './render/chrome.js'
14
+ export * from './render/render-block.js'
15
+ export * from './render/term-archive.js'