@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.
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/render/blocks/accordion.d.ts.map +1 -1
- package/dist/src/render/blocks/accordion.js +12 -15
- package/dist/src/render/blocks/accordion.js.map +1 -1
- package/dist/src/render/blocks/collection-list.d.ts +5 -7
- package/dist/src/render/blocks/collection-list.d.ts.map +1 -1
- package/dist/src/render/blocks/collection-list.js +61 -32
- package/dist/src/render/blocks/collection-list.js.map +1 -1
- package/dist/src/render/blocks/cta.d.ts +6 -6
- package/dist/src/render/blocks/cta.d.ts.map +1 -1
- package/dist/src/render/blocks/cta.js +12 -12
- package/dist/src/render/blocks/cta.js.map +1 -1
- package/dist/src/render/blocks/embed.d.ts.map +1 -1
- package/dist/src/render/blocks/embed.js +22 -27
- package/dist/src/render/blocks/embed.js.map +1 -1
- package/dist/src/render/blocks/faq.d.ts.map +1 -1
- package/dist/src/render/blocks/faq.js +13 -16
- package/dist/src/render/blocks/faq.js.map +1 -1
- package/dist/src/render/blocks/feature-grid.d.ts.map +1 -1
- package/dist/src/render/blocks/feature-grid.js +22 -22
- package/dist/src/render/blocks/feature-grid.js.map +1 -1
- package/dist/src/render/blocks/gallery.d.ts +7 -8
- package/dist/src/render/blocks/gallery.d.ts.map +1 -1
- package/dist/src/render/blocks/gallery.js +16 -14
- package/dist/src/render/blocks/gallery.js.map +1 -1
- package/dist/src/render/blocks/hero.d.ts +13 -8
- package/dist/src/render/blocks/hero.d.ts.map +1 -1
- package/dist/src/render/blocks/hero.js +27 -17
- package/dist/src/render/blocks/hero.js.map +1 -1
- package/dist/src/render/blocks/logo-strip.d.ts.map +1 -1
- package/dist/src/render/blocks/logo-strip.js +14 -11
- package/dist/src/render/blocks/logo-strip.js.map +1 -1
- package/dist/src/render/blocks/logos.d.ts.map +1 -1
- package/dist/src/render/blocks/logos.js +21 -12
- package/dist/src/render/blocks/logos.js.map +1 -1
- package/dist/src/render/blocks/media-figure.d.ts +10 -6
- package/dist/src/render/blocks/media-figure.d.ts.map +1 -1
- package/dist/src/render/blocks/media-figure.js +18 -13
- package/dist/src/render/blocks/media-figure.js.map +1 -1
- package/dist/src/render/blocks/pricing-table.d.ts.map +1 -1
- package/dist/src/render/blocks/pricing-table.js +15 -11
- package/dist/src/render/blocks/pricing-table.js.map +1 -1
- package/dist/src/render/blocks/prose.d.ts +9 -3
- package/dist/src/render/blocks/prose.d.ts.map +1 -1
- package/dist/src/render/blocks/prose.js +11 -4
- package/dist/src/render/blocks/prose.js.map +1 -1
- package/dist/src/render/blocks/quote.d.ts +10 -10
- package/dist/src/render/blocks/quote.d.ts.map +1 -1
- package/dist/src/render/blocks/quote.js +14 -13
- package/dist/src/render/blocks/quote.js.map +1 -1
- package/dist/src/render/blocks/stat-counter.d.ts.map +1 -1
- package/dist/src/render/blocks/stat-counter.js +11 -13
- package/dist/src/render/blocks/stat-counter.js.map +1 -1
- package/dist/src/render/blocks/stats.d.ts.map +1 -1
- package/dist/src/render/blocks/stats.js +12 -13
- package/dist/src/render/blocks/stats.js.map +1 -1
- package/dist/src/render/blocks/testimonial.d.ts +9 -9
- package/dist/src/render/blocks/testimonial.d.ts.map +1 -1
- package/dist/src/render/blocks/testimonial.js +15 -14
- package/dist/src/render/blocks/testimonial.js.map +1 -1
- package/dist/src/render/chrome.d.ts +3 -1
- package/dist/src/render/chrome.d.ts.map +1 -1
- package/dist/src/render/chrome.js +71 -46
- package/dist/src/render/chrome.js.map +1 -1
- package/dist/src/render/layout.d.ts +26 -0
- package/dist/src/render/layout.d.ts.map +1 -0
- package/dist/src/render/layout.js +51 -0
- package/dist/src/render/layout.js.map +1 -0
- package/dist/src/render/render-block.d.ts.map +1 -1
- package/dist/src/render/render-block.js +23 -2
- package/dist/src/render/render-block.js.map +1 -1
- package/dist/src/render/term-archive.d.ts +8 -6
- package/dist/src/render/term-archive.d.ts.map +1 -1
- package/dist/src/render/term-archive.js +22 -16
- package/dist/src/render/term-archive.js.map +1 -1
- package/dist/src/render/widget-areas.d.ts +13 -0
- package/dist/src/render/widget-areas.d.ts.map +1 -0
- package/dist/src/render/widget-areas.js +20 -0
- package/dist/src/render/widget-areas.js.map +1 -0
- package/dist/theme.config.js +2 -2
- package/dist/theme.config.js.map +1 -1
- package/package.json +5 -5
- package/src/index.ts +1 -0
- package/src/render/blocks/accordion.ts +32 -27
- package/src/render/blocks/collection-list.ts +103 -53
- package/src/render/blocks/cta.ts +27 -28
- package/src/render/blocks/embed.ts +46 -43
- package/src/render/blocks/faq.ts +25 -21
- package/src/render/blocks/feature-grid.ts +42 -35
- package/src/render/blocks/gallery.ts +21 -16
- package/src/render/blocks/hero.ts +40 -28
- package/src/render/blocks/logo-strip.ts +26 -16
- package/src/render/blocks/logos.ts +33 -17
- package/src/render/blocks/media-figure.ts +22 -14
- package/src/render/blocks/pricing-table.ts +26 -15
- package/src/render/blocks/prose.ts +18 -4
- package/src/render/blocks/quote.ts +18 -14
- package/src/render/blocks/stat-counter.ts +25 -20
- package/src/render/blocks/stats.ts +31 -21
- package/src/render/blocks/testimonial.ts +22 -18
- package/src/render/chrome.ts +84 -49
- package/src/render/layout.ts +67 -0
- package/src/render/render-block.ts +24 -1
- package/src/render/term-archive.ts +54 -50
- package/src/render/widget-areas.ts +23 -0
- package/src/styles/archive.css +137 -38
- package/src/styles/base.css +553 -426
- package/src/styles/blocks.css +1343 -1010
- package/src/styles/theme.css +18 -24
- package/src/styles/tokens.css +166 -192
- package/src/styles/widgets.css +914 -0
- 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`)
|
|
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
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
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;
|
|
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`)
|
|
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
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
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) =>
|
|
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('
|
|
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('
|
|
20
|
-
?
|
|
21
|
-
: h('
|
|
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":"AAAA,OAAO,EAAoB,CAAC,EAAyB,MAAM,oBAAoB,CAAA;
|
|
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"}
|
package/dist/theme.config.js
CHANGED
|
@@ -14,8 +14,8 @@ import { defineTheme } from '@cogenta/render';
|
|
|
14
14
|
*/
|
|
15
15
|
export default defineTheme({
|
|
16
16
|
name: 'entreprise',
|
|
17
|
-
version: '1.
|
|
18
|
-
description: 'A
|
|
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',
|
package/dist/theme.config.js.map
CHANGED
|
@@ -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
|
|
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.
|
|
4
|
-
"description": "A
|
|
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.
|
|
40
|
-
"@cogenta/
|
|
41
|
-
"@cogenta/
|
|
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
|
@@ -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).
|
|
13
|
-
* mechanics
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
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
|
-
*
|
|
22
|
-
*
|
|
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-
|
|
25
|
+
{ class: 'cg-accordion__item' },
|
|
29
26
|
h(
|
|
30
27
|
'details',
|
|
31
|
-
{ class: 'cg-
|
|
28
|
+
{ class: 'cg-accordion__details' },
|
|
32
29
|
h(
|
|
33
30
|
'summary',
|
|
34
|
-
{ class: 'cg-
|
|
35
|
-
h('span', { class: 'cg-
|
|
36
|
-
h('span', { class: 'cg-
|
|
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-
|
|
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
|
|
42
|
+
return section(
|
|
45
43
|
'section',
|
|
46
|
-
|
|
44
|
+
'accordion',
|
|
45
|
+
'cg-accordion',
|
|
46
|
+
{},
|
|
47
|
+
'div',
|
|
47
48
|
block.title === undefined
|
|
48
49
|
? null
|
|
49
|
-
:
|
|
50
|
-
|
|
51
|
-
{ class: 'cg-
|
|
52
|
-
|
|
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
|
-
'
|
|
56
|
-
{ class: 'cg-
|
|
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
|
|
22
|
-
* marks it `runtime: 'server'`
|
|
23
|
-
*
|
|
24
|
-
* (
|
|
25
|
-
*
|
|
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
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
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
|
|
41
|
-
const
|
|
42
|
-
if (
|
|
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
|
-
'
|
|
45
|
-
{ class: 'cg-
|
|
46
|
-
renderImageSource(
|
|
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(
|
|
51
|
-
|
|
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-
|
|
56
|
-
|
|
76
|
+
{ class: 'cg-entry', 'data-media': picture === null ? 'none' : 'present' },
|
|
77
|
+
picture,
|
|
57
78
|
h(
|
|
58
79
|
'div',
|
|
59
|
-
{ class: 'cg-
|
|
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-
|
|
63
|
-
h(
|
|
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-
|
|
66
|
-
|
|
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-
|
|
135
|
+
? h('p', { class: 'cg-collection__empty' }, ctx.t('collection.empty'))
|
|
89
136
|
: h(
|
|
90
|
-
'ul',
|
|
91
|
-
{ class: 'cg-
|
|
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
|
|
142
|
+
return section(
|
|
96
143
|
'section',
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
},
|
|
144
|
+
'collectionList',
|
|
145
|
+
'cg-collection',
|
|
146
|
+
{ 'data-layout': block.layout },
|
|
147
|
+
'div',
|
|
102
148
|
hasTitle
|
|
103
|
-
?
|
|
104
|
-
|
|
105
|
-
{ class: 'cg-
|
|
106
|
-
|
|
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-
|
|
163
|
+
class: 'cg-collection__viewport',
|
|
114
164
|
role: 'region',
|
|
115
165
|
'aria-label': block.title ?? ctx.t('collection.carousel'),
|
|
116
166
|
tabindex: '0',
|