@cogenta/theme-canonical 1.1.2 → 1.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) 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/arrow-link.d.ts +11 -0
  6. package/dist/src/render/arrow-link.d.ts.map +1 -0
  7. package/dist/src/render/arrow-link.js +29 -0
  8. package/dist/src/render/arrow-link.js.map +1 -0
  9. package/dist/src/render/blocks/collection-list.d.ts +15 -5
  10. package/dist/src/render/blocks/collection-list.d.ts.map +1 -1
  11. package/dist/src/render/blocks/collection-list.js +36 -13
  12. package/dist/src/render/blocks/collection-list.js.map +1 -1
  13. package/dist/src/render/blocks/embed.d.ts.map +1 -1
  14. package/dist/src/render/blocks/embed.js +3 -2
  15. package/dist/src/render/blocks/embed.js.map +1 -1
  16. package/dist/src/render/blocks/gallery.d.ts.map +1 -1
  17. package/dist/src/render/blocks/gallery.js +4 -1
  18. package/dist/src/render/blocks/gallery.js.map +1 -1
  19. package/dist/src/render/blocks/hero.d.ts.map +1 -1
  20. package/dist/src/render/blocks/hero.js +9 -2
  21. package/dist/src/render/blocks/hero.js.map +1 -1
  22. package/dist/src/render/blocks/pricing-table.d.ts.map +1 -1
  23. package/dist/src/render/blocks/pricing-table.js +17 -4
  24. package/dist/src/render/blocks/pricing-table.js.map +1 -1
  25. package/dist/src/render/chrome.d.ts +40 -1
  26. package/dist/src/render/chrome.d.ts.map +1 -1
  27. package/dist/src/render/chrome.js +103 -71
  28. package/dist/src/render/chrome.js.map +1 -1
  29. package/dist/src/render/dates.d.ts +9 -0
  30. package/dist/src/render/dates.d.ts.map +1 -0
  31. package/dist/src/render/dates.js +16 -0
  32. package/dist/src/render/dates.js.map +1 -0
  33. package/dist/src/render/render-block.d.ts.map +1 -1
  34. package/dist/src/render/render-block.js +7 -1
  35. package/dist/src/render/render-block.js.map +1 -1
  36. package/dist/src/render/strings.d.ts +25 -0
  37. package/dist/src/render/strings.d.ts.map +1 -0
  38. package/dist/src/render/strings.js +26 -0
  39. package/dist/src/render/strings.js.map +1 -0
  40. package/dist/src/render/term-archive.d.ts +5 -5
  41. package/dist/src/render/term-archive.d.ts.map +1 -1
  42. package/dist/src/render/term-archive.js +14 -12
  43. package/dist/src/render/term-archive.js.map +1 -1
  44. package/dist/src/render/widget-areas.d.ts +20 -0
  45. package/dist/src/render/widget-areas.d.ts.map +1 -0
  46. package/dist/src/render/widget-areas.js +40 -0
  47. package/dist/src/render/widget-areas.js.map +1 -0
  48. package/package.json +5 -5
  49. package/src/index.ts +1 -0
  50. package/src/render/arrow-link.ts +27 -0
  51. package/src/render/blocks/collection-list.ts +53 -15
  52. package/src/render/blocks/embed.ts +3 -2
  53. package/src/render/blocks/gallery.ts +4 -1
  54. package/src/render/blocks/hero.ts +9 -2
  55. package/src/render/blocks/pricing-table.ts +22 -4
  56. package/src/render/chrome.ts +156 -70
  57. package/src/render/dates.ts +14 -0
  58. package/src/render/render-block.ts +6 -0
  59. package/src/render/strings.ts +30 -0
  60. package/src/render/term-archive.ts +54 -32
  61. package/src/render/widget-areas.ts +44 -0
  62. package/src/styles/archive.css +66 -20
  63. package/src/styles/base.css +266 -680
  64. package/src/styles/blocks.css +678 -811
  65. package/src/styles/chrome.css +469 -0
  66. package/src/styles/listings.css +183 -0
  67. package/src/styles/theme.css +28 -14
  68. package/src/styles/tokens.css +192 -205
  69. package/src/styles/utility.css +295 -0
  70. package/src/styles/widgets.css +1064 -0
  71. package/tokens.json +15 -15
@@ -1,82 +1,114 @@
1
- import { escapeAttribute, escapeText, renderBrandMark, renderSocialLinks, renderThemeToggle, serialize, } from '@cogenta/theme-kit';
2
- /**
3
- * The site header and footer — moved here, verbatim, from what used to be
4
- * `@cogenta/cli`'s own hardcoded `<header class="cg-site-header">`/`<footer
5
- * class="cg-site-footer">` template (`packages/cli/src/commands/theme-render.ts`,
6
- * before the chrome extension point existed). Byte-identical output to that
7
- * template: this is the reference theme, and every site that installed it
8
- * before a second theme existed must render exactly as it always has.
9
- *
10
- * A future theme with a structurally different header (a mega-menu, a cart
11
- * icon, no header at all) implements its own `renderChrome` instead — this is
12
- * simply the one this package ships.
13
- *
14
- * `theme@1.4` (L25 D2) adds four optional fields, each rendered only when
15
- * present: `headerAction` as a button-styled link at the end of the header
16
- * nav, `tagline` under the site name in the footer, `social` as an icon-link
17
- * row (`renderSocialLinks`), `footerNote` as a short "about" paragraph. A
18
- * site that sets none of them, and a `1.3` render that never reaches this
19
- * file at all, both keep the pre-1.4 header/footer byte for byte — see
20
- * `test/chrome.test.ts`'s own "without the new fields" case.
21
- */
22
- function renderNavLinks(links) {
23
- if (links.length === 0)
24
- return '';
25
- const items = links
26
- .filter((link) => link.href !== null || link.kind === 'submenu-placeholder')
27
- .map((link) => {
28
- const label = escapeText(link.label);
29
- const titleAttr = link.title === null ? '' : ` title="${escapeAttribute(link.title)}"`;
30
- if (link.href === null)
31
- return `<li><span${titleAttr}>${label}</span></li>`;
32
- const href = escapeAttribute(link.href);
33
- const target = link.openInNewTab ? ' target="_blank" rel="noopener"' : '';
34
- return `<li><a href="${href}"${target}${titleAttr}>${label}</a></li>`;
35
- })
36
- .join('');
37
- return items === '' ? '' : `<ul class="cg-menu">${items}</ul>`;
1
+ import { escapeAttribute, escapeText, renderBrandMark, renderFooterWidgets, renderSocialLinks, renderThemeToggle, serialize, } from '@cogenta/theme-kit';
2
+ import { word } from './strings.js';
3
+ /** Links a visitor can follow, plus the unlinked headings that name a column. */
4
+ function usable(links) {
5
+ return links.filter((link) => link.href !== null || link.kind === 'submenu-placeholder');
6
+ }
7
+ function linkItem(link) {
8
+ const label = escapeText(link.label);
9
+ const titleAttr = link.title === null ? '' : ` title="${escapeAttribute(link.title)}"`;
10
+ if (link.href === null)
11
+ return `<li><span${titleAttr}>${label}</span></li>`;
12
+ const target = link.openInNewTab ? ' target="_blank" rel="noopener"' : '';
13
+ return `<li><a href="${escapeAttribute(link.href)}"${target}${titleAttr}>${label}</a></li>`;
14
+ }
15
+ /** The footer menu, split into columns at each unlinked heading. */
16
+ export function footerGroups(links) {
17
+ const groups = [];
18
+ for (const link of usable(links)) {
19
+ if (link.kind === 'submenu-placeholder' && link.href === null) {
20
+ groups.push({ heading: link.label, links: [] });
21
+ continue;
22
+ }
23
+ const current = groups[groups.length - 1];
24
+ if (current === undefined)
25
+ groups.push({ heading: null, links: [link] });
26
+ else
27
+ current.links.push(link);
28
+ }
29
+ return groups.filter((group) => group.links.length > 0);
38
30
  }
39
- /** The header's own call-to-action link (`theme@1.4`), styled like the block vocabulary's own primary action. */
40
- function renderHeaderAction(action) {
41
- if (action === undefined)
31
+ /** `footerNote` as paragraphs at blank lines, each keeping its own line breaks. */
32
+ function renderFooterNote(note) {
33
+ const paragraphs = note
34
+ .replace(/\r\n?/g, '\n')
35
+ .split(/\n\s*\n/)
36
+ .map((paragraph) => paragraph
37
+ .split('\n')
38
+ .map((line) => line.trim())
39
+ .filter((line) => line !== ''))
40
+ .filter((lines) => lines.length > 0);
41
+ if (paragraphs.length === 0)
42
42
  return '';
43
- return (`<a class="cg-action cg-site-header__action" data-emphasis="primary" ` +
44
- `href="${escapeAttribute(action.href)}">${escapeText(action.label)}</a>`);
43
+ return `<div class="cg-site-footer__about">${paragraphs
44
+ .map((lines) => `<p class="cg-site-footer__note">${lines.map((line) => escapeText(line)).join('<br>')}</p>`)
45
+ .join('')}</div>`;
45
46
  }
46
- export function renderChrome(input) {
47
- const siteName = escapeAttribute(input.site.name);
48
- const headerNav = renderNavLinks(input.headerNav);
49
- const footerNav = renderNavLinks(input.footerNav);
47
+ function renderHeader(input) {
48
+ const siteName = escapeText(input.site.name);
49
+ const home = escapeAttribute(input.homeHref);
50
50
  // The uploaded logo replaces the wordmark, and only the wordmark: the
51
- // footer keeps the site's name in text, so a site whose logo fails to load
52
- // is still named somewhere on every page.
51
+ // footer keeps the site's name in text, so a page whose logo fails to load
52
+ // still names the site.
53
53
  const mark = renderBrandMark(input.brand, { className: 'cg-site-header__logo' }) ?? siteName;
54
- const headerAction = renderHeaderAction(input.headerAction);
55
- const themeToggle = serialize(renderThemeToggle(input.locale, { className: 'cg-theme-toggle' }));
56
- const header = `<header class="cg-site-header"><div class="cg-site-header__inner">` +
57
- `<a class="cg-site-header__home" href="${escapeAttribute(input.homeHref)}">${mark}</a>` +
58
- `${headerNav === '' ? '' : `<nav class="cg-site-header__nav" aria-label="Primary">${headerNav}</nav>`}` +
59
- `${themeToggle}` +
60
- `${headerAction}` +
61
- `</div></header>`;
54
+ const links = usable(input.headerNav).map(linkItem).join('');
55
+ const actionHref = input.headerAction === undefined ? '' : escapeAttribute(input.headerAction.href);
56
+ const actionLabel = input.headerAction === undefined ? '' : escapeText(input.headerAction.label);
57
+ // On a phone the bar holds the name, the menu control and the light/dark
58
+ // control; the action moves to the foot of the menu panel. It is the same
59
+ // link twice in the source, and the stylesheet shows exactly one of them at
60
+ // any width (`display: none` hides the other from assistive technology
61
+ // too), so it is never announced twice.
62
+ const menuAction = input.headerAction === undefined
63
+ ? ''
64
+ : `<p class="cg-site-header__menu-action"><a class="cg-action" data-emphasis="primary" href="${actionHref}">${actionLabel}</a></p>`;
65
+ const menu = links === ''
66
+ ? ''
67
+ : `<input type="checkbox" id="cg-nav-toggle" class="cg-nav-toggle" aria-controls="cg-site-nav">` +
68
+ `<label for="cg-nav-toggle" class="cg-nav-toggle__label">${escapeText(word(input.locale, 'menu'))}</label>` +
69
+ `<nav class="cg-site-header__nav" id="cg-site-nav" aria-label="${escapeAttribute(word(input.locale, 'primaryNavigation'))}"><ul class="cg-menu">${links}</ul>${menuAction}</nav>`;
70
+ const action = input.headerAction === undefined
71
+ ? ''
72
+ : `<a class="cg-action cg-site-header__action" data-emphasis="primary" href="${actionHref}">${actionLabel}</a>`;
73
+ const toggle = serialize(renderThemeToggle(input.locale, { className: 'cg-theme-toggle' }));
74
+ return (`<header class="cg-site-header" data-nav="${links === '' ? 'none' : 'links'}"><div class="cg-site-header__inner">` +
75
+ `<a class="cg-site-header__home" href="${home}">${mark}</a>` +
76
+ menu +
77
+ `<div class="cg-site-header__end">${action}${toggle}</div>` +
78
+ `</div></header>`);
79
+ }
80
+ function renderFooter(input) {
81
+ const siteName = escapeText(input.site.name);
62
82
  const tagline = input.tagline === undefined
63
83
  ? ''
64
84
  : `<p class="cg-site-footer__tagline">${escapeText(input.tagline)}</p>`;
65
- const social = input.social === undefined
66
- ? ''
67
- : serialize(renderSocialLinks(input.social, {
68
- className: 'cg-site-footer__social',
69
- itemClassName: 'cg-site-footer__social-item',
70
- }) ?? { kind: 'text', value: '' });
71
- const footerNote = input.footerNote === undefined
85
+ const note = input.footerNote === undefined ? '' : renderFooterNote(input.footerNote);
86
+ const socialLinks = renderSocialLinks(input.social, {
87
+ className: 'cg-site-footer__social',
88
+ itemClassName: 'cg-site-footer__social-item',
89
+ });
90
+ const social = socialLinks === null ? '' : serialize(socialLinks);
91
+ const groups = footerGroups(input.footerNav);
92
+ const nav = groups.length === 0
72
93
  ? ''
73
- : `<p class="cg-site-footer__note">${escapeText(input.footerNote)}</p>`;
74
- const footer = `<footer class="cg-site-footer"><div class="cg-site-footer__inner">` +
75
- `<span>${siteName}</span>${tagline}` +
76
- `${footerNav === '' ? '' : `<nav class="cg-site-footer__nav" aria-label="Footer">${footerNav}</nav>`}` +
77
- `${social}` +
78
- `${footerNote === '' ? '' : `<div class="cg-site-footer__about">${footerNote}</div>`}` +
79
- `${input.brandingHtml}</div></footer>`;
80
- return { header, footer };
94
+ : `<nav class="cg-site-footer__nav" aria-label="${escapeAttribute(word(input.locale, 'footerNavigation'))}" data-columns="${Math.min(groups.length, 3)}">${groups
95
+ .map((group) => `<div class="cg-site-footer__group">${group.heading === null
96
+ ? ''
97
+ : `<p class="cg-site-footer__heading">${escapeText(group.heading)}</p>`}<ul class="cg-menu">${group.links.map(linkItem).join('')}</ul></div>`)
98
+ .join('')}</nav>`;
99
+ const widgets = renderFooterWidgets(input.widgets, {
100
+ className: 'cg-site-footer__widgets',
101
+ headingLevel: 'h2',
102
+ });
103
+ const year = new Date().getFullYear();
104
+ return (`<footer class="cg-site-footer"><div class="cg-site-footer__inner">` +
105
+ `<div class="cg-site-footer__identity"><p class="cg-site-footer__name">${siteName}</p>${tagline}${note}${social}</div>` +
106
+ nav +
107
+ (widgets === null ? '' : serialize(widgets)) +
108
+ `<div class="cg-site-footer__legal"><p class="cg-site-footer__copyright">© ${year} ${siteName}</p>${input.brandingHtml}</div>` +
109
+ `</div></footer>`);
110
+ }
111
+ export function renderChrome(input) {
112
+ return { header: renderHeader(input), footer: renderFooter(input) };
81
113
  }
82
114
  //# sourceMappingURL=chrome.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chrome.js","sourceRoot":"","sources":["../../../src/render/chrome.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chrome.js","sourceRoot":"","sources":["../../../src/render/chrome.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * The one date format of this theme — `Intl`'s long date, in the page's own
3
+ * language — shared by the collection list, the term archive and the entry
4
+ * header (`renderEntryHeader` formats the same way), so a date reads alike on
5
+ * every page. An invalid locale or date falls back to the ISO day, a true
6
+ * answer rather than a thrown error.
7
+ */
8
+ export declare function formatEntryDate(iso: string, locale: string): string;
9
+ //# sourceMappingURL=dates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dates.d.ts","sourceRoot":"","sources":["../../../src/render/dates.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAMnE"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * The one date format of this theme — `Intl`'s long date, in the page's own
3
+ * language — shared by the collection list, the term archive and the entry
4
+ * header (`renderEntryHeader` formats the same way), so a date reads alike on
5
+ * every page. An invalid locale or date falls back to the ISO day, a true
6
+ * answer rather than a thrown error.
7
+ */
8
+ export function formatEntryDate(iso, locale) {
9
+ try {
10
+ return new Intl.DateTimeFormat(locale, { dateStyle: 'long' }).format(new Date(iso));
11
+ }
12
+ catch {
13
+ return iso.slice(0, 10);
14
+ }
15
+ }
16
+ //# sourceMappingURL=dates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dates.js","sourceRoot":"","sources":["../../../src/render/dates.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,MAAc;IACzD,IAAI,CAAC;QACH,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IACrF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACzB,CAAC;AACH,CAAC"}
@@ -1 +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,EAChB,iBAAiB,EACjB,iBAAiB,EAEjB,YAAY,EAEb,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAkBzD,OAAO,EAAE,KAAK,WAAW,EAAK,MAAM,WAAW,CAAA;AAE/C;;;;;GAKG;AACH,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,CAcpB;AA0DD,wBAAgB,UAAU,CACxB,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,aAAa,EAClB,OAAO,GAAE,cAAmB,EAC5B,QAAQ,CAAC,EAAE,aAAa,GACvB,WAAW,CAkBb"}
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,EAChB,iBAAiB,EAEjB,iBAAiB,EAEjB,YAAY,EAEb,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAkBzD,OAAO,EAAE,KAAK,WAAW,EAAK,MAAM,WAAW,CAAA;AAE/C;;;;;GAKG;AACH,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,CAmBpB;AA0DD,wBAAgB,UAAU,CACxB,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,aAAa,EAClB,OAAO,GAAE,cAAmB,EAC5B,QAAQ,CAAC,EAAE,aAAa,GACvB,WAAW,CAkBb"}
@@ -1,5 +1,5 @@
1
1
  import { VOCABULARY_NAMES } from '@cogenta/blocks';
2
- import { pageHasOwnHeading, renderEntryHeader, resolveBlockForRender, withBlockKey, withBlockVariant, } from '@cogenta/theme-kit';
2
+ import { 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';
@@ -20,6 +20,12 @@ import { renderTestimonial } from './blocks/testimonial.js';
20
20
  import { h } from './html.js';
21
21
  export { pageHasOwnHeading, renderEntryHeader, withBlockKey };
22
22
  export function renderBlock(block, ctx, entries = {}, registry) {
23
+ // A block a plugin provides arrives already rendered by the host, in a
24
+ // process of its own (contract D theme@1.7). Nothing else in this theme
25
+ // needs to know such blocks exist.
26
+ const provided = providedBlockNode(block, ctx);
27
+ if (provided !== null)
28
+ return withBlockVariant(provided, block.variant);
23
29
  // `block`'s type says `VocabularyBlock`, but the value crossing this
24
30
  // boundary from stored content is not always literally one of the twelve —
25
31
  // `theme-render.ts` cannot know at compile time what a block zone holds.
@@ -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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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * The few words this theme prints on its own, beyond `THEME_STRINGS`
3
+ * (`@cogenta/theme-kit`): the name of the menu control and of the two
4
+ * navigation landmarks, and the label over a recommended plan. The same two
5
+ * languages as the shared table, resolved the same way (`fr-CA` is French,
6
+ * anything unknown is English).
7
+ */
8
+ declare const WORDS: {
9
+ readonly en: {
10
+ readonly menu: 'Menu';
11
+ readonly primaryNavigation: 'Primary';
12
+ readonly footerNavigation: 'Footer';
13
+ readonly recommended: 'Recommended';
14
+ };
15
+ readonly fr: {
16
+ readonly menu: 'Menu';
17
+ readonly primaryNavigation: 'Principale';
18
+ readonly footerNavigation: 'Pied de page';
19
+ readonly recommended: 'Recommandé';
20
+ };
21
+ };
22
+ export type ThemeWord = keyof (typeof WORDS)['en'];
23
+ export declare function word(locale: string, key: ThemeWord): string;
24
+ export {};
25
+ //# sourceMappingURL=strings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strings.d.ts","sourceRoot":"","sources":["../../../src/render/strings.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,QAAA,MAAM,KAAK;aACT,EAAE;iBACA,IAAI,EAAE,MAAM;iBACZ,iBAAiB,EAAE,SAAS;iBAC5B,gBAAgB,EAAE,QAAQ;iBAC1B,WAAW,EAAE,aAAa;;aAE5B,EAAE;iBACA,IAAI,EAAE,MAAM;iBACZ,iBAAiB,EAAE,YAAY;iBAC/B,gBAAgB,EAAE,cAAc;iBAChC,WAAW,EAAE,YAAY;;CAEnB,CAAA;AAEV,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,CAAC,CAAA;AAElD,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,GAAG,MAAM,CAE3D"}
@@ -0,0 +1,26 @@
1
+ import { themeLocaleFor } from '@cogenta/theme-kit';
2
+ /**
3
+ * The few words this theme prints on its own, beyond `THEME_STRINGS`
4
+ * (`@cogenta/theme-kit`): the name of the menu control and of the two
5
+ * navigation landmarks, and the label over a recommended plan. The same two
6
+ * languages as the shared table, resolved the same way (`fr-CA` is French,
7
+ * anything unknown is English).
8
+ */
9
+ const WORDS = {
10
+ en: {
11
+ menu: 'Menu',
12
+ primaryNavigation: 'Primary',
13
+ footerNavigation: 'Footer',
14
+ recommended: 'Recommended',
15
+ },
16
+ fr: {
17
+ menu: 'Menu',
18
+ primaryNavigation: 'Principale',
19
+ footerNavigation: 'Pied de page',
20
+ recommended: 'Recommandé',
21
+ },
22
+ };
23
+ export function word(locale, key) {
24
+ return WORDS[themeLocaleFor(locale)][key];
25
+ }
26
+ //# sourceMappingURL=strings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strings.js","sourceRoot":"","sources":["../../../src/render/strings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEnD;;;;;;GAMG;AAEH,MAAM,KAAK,GAAG;IACZ,EAAE,EAAE;QACF,IAAI,EAAE,MAAM;QACZ,iBAAiB,EAAE,SAAS;QAC5B,gBAAgB,EAAE,QAAQ;QAC1B,WAAW,EAAE,aAAa;KAC3B;IACD,EAAE,EAAE;QACF,IAAI,EAAE,MAAM;QACZ,iBAAiB,EAAE,YAAY;QAC/B,gBAAgB,EAAE,cAAc;QAChC,WAAW,EAAE,YAAY;KAC1B;CACO,CAAA;AAIV,MAAM,UAAU,IAAI,CAAC,MAAc,EAAE,GAAc;IACjD,OAAO,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;AAC3C,CAAC"}
@@ -2,11 +2,11 @@ import { type HtmlElement, type TermArchiveInput } from '@cogenta/theme-kit';
2
2
  /**
3
3
  * The taxonomy-term archive (contract D `theme@1.3`).
4
4
  *
5
- * Built from this theme's *own* entry-card classes — the same `cg-entry`
6
- * markup `collectionList` already renders — rather than a new set of
7
- * archive-only classes: an archive of articles should look like a list of
8
- * articles on this theme, and reusing the classes is what guarantees that
9
- * without a second stylesheet to keep in step.
5
+ * A header in the page frame (the breadcrumb, the term as the page's title,
6
+ * the sub-terms), then the classified entries as this theme's index: the
7
+ * same `cg-collection`/`cg-entry` markup a `collectionList` block renders in
8
+ * its `list` layout, so an archive of articles reads exactly like a list of
9
+ * articles anywhere else on the site, from one set of rules.
10
10
  */
11
11
  export declare function renderTermArchive(input: TermArchiveInput): HtmlElement;
12
12
  //# 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;AAI/E;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,WAAW,CAkEtE"}
@@ -1,26 +1,28 @@
1
1
  import { h } from '@cogenta/theme-kit';
2
+ import { arrowWords } from './arrow-link.js';
3
+ import { formatEntryDate } from './dates.js';
2
4
  /**
3
5
  * The taxonomy-term archive (contract D `theme@1.3`).
4
6
  *
5
- * Built from this theme's *own* entry-card classes — the same `cg-entry`
6
- * markup `collectionList` already renders — rather than a new set of
7
- * archive-only classes: an archive of articles should look like a list of
8
- * articles on this theme, and reusing the classes is what guarantees that
9
- * without a second stylesheet to keep in step.
7
+ * A header in the page frame (the breadcrumb, the term as the page's title,
8
+ * the sub-terms), then the classified entries as this theme's index: the
9
+ * same `cg-collection`/`cg-entry` markup a `collectionList` block renders in
10
+ * its `list` layout, so an archive of articles reads exactly like a list of
11
+ * articles anywhere else on the site, from one set of rules.
10
12
  */
11
13
  export function renderTermArchive(input) {
12
- const items = input.entries.map((entry) => h('li', { class: 'cg-entry' }, h('div', { class: 'cg-entry__body' }, h('h2', { class: 'cg-entry__title' }, entry.href === null
14
+ const items = input.entries.map((entry) => h('li', { class: 'cg-entry', 'data-picture': 'false' }, h('article', { class: 'cg-entry__body' }, h('h2', { class: 'cg-entry__title' }, entry.href === null
13
15
  ? entry.title
14
16
  : h('a', { class: 'cg-entry__link', href: entry.href }, entry.title)), entry.publishedAt === null
15
17
  ? null
16
- : h('time', { class: 'cg-entry__date', datetime: entry.publishedAt }, entry.publishedAt.slice(0, 10)), entry.summary === null ? null : h('p', { class: 'cg-entry__excerpt' }, entry.summary))));
17
- return h('main', { class: 'cg-main cg-archive', id: 'cg-main' }, input.ancestors.length === 0
18
+ : h('time', { class: 'cg-entry__date', datetime: entry.publishedAt }, formatEntryDate(entry.publishedAt, input.locale)), entry.summary === null ? null : h('p', { class: 'cg-entry__excerpt' }, entry.summary))));
19
+ return h('main', { class: 'cg-main cg-archive', id: 'cg-main' }, h('div', { class: 'cg-archive__head' }, input.ancestors.length === 0
18
20
  ? null
19
21
  : 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-page__title' }, input.term.label), input.children.length === 0
20
22
  ? null
21
- : h('ul', { class: 'cg-archive__children', 'aria-label': input.labels.subterms }, ...input.children.map((child) => h('li', {}, h('a', { href: child.href }, child.label)))), items.length === 0
23
+ : h('ul', { class: 'cg-archive__children', 'aria-label': input.labels.subterms }, ...input.children.map((child) => h('li', {}, h('a', { href: child.href }, child.label))))), h('section', { class: 'cg-collection cg-archive__list', 'data-layout': 'list' }, items.length === 0
22
24
  ? h('p', { class: 'cg-collection__empty' }, input.labels.empty)
23
- : h('ul', { class: 'cg-collection__items' }, ...items), renderPager(input));
25
+ : h('ul', { class: 'cg-collection__items' }, ...items), renderPager(input)));
24
26
  }
25
27
  /**
26
28
  * Previous/next only — never a numbered pager. This renderer is handed the
@@ -32,8 +34,8 @@ function renderPager(input) {
32
34
  return null;
33
35
  return h('nav', { class: 'cg-archive__pager', 'aria-label': input.labels.pagination }, input.page.previousHref === null
34
36
  ? null
35
- : h('a', { rel: 'prev', href: input.page.previousHref }, input.labels.previous), input.page.nextHref === null
37
+ : h('a', { class: 'cg-arrow-link', rel: 'prev', href: input.page.previousHref }, arrowWords(input.labels.previous, 'back')), input.page.nextHref === null
36
38
  ? null
37
- : h('a', { rel: 'next', href: input.page.nextHref }, input.labels.next));
39
+ : h('a', { class: 'cg-arrow-link', rel: 'next', href: input.page.nextHref }, arrowWords(input.labels.next)));
38
40
  }
39
41
  //# sourceMappingURL=term-archive.js.map
@@ -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,20 @@
1
+ /**
2
+ * The widget areas this theme names (contract D `theme@1.6`).
3
+ *
4
+ * Exporting `widgetAreas` is what tells the host that this theme draws the
5
+ * footer columns (`footer-1`..`footer-4`) inside its own footer, where
6
+ * `renderChrome` places them between the footer menu and the legal line. The
7
+ * page areas (`content-before`, `content-after`, `sidebar`) are placed by the
8
+ * host in the one `cg-sidebar-layout` markup every theme styles; this theme
9
+ * sets it on its twelve-column grid in `styles/widgets.css`.
10
+ *
11
+ * A third-party theme can copy this file as it is: a theme that adds an area
12
+ * of its own lists it here too, and renders it itself with
13
+ * `renderWidgetArea` from `@cogenta/theme-kit`.
14
+ */
15
+ export declare const widgetAreas: readonly {
16
+ readonly id: string;
17
+ readonly label: string;
18
+ readonly description?: string;
19
+ }[];
20
+ //# 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;;;;;;;;;;;;;GAaG;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,EAyBA,CAAA"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * The widget areas this theme names (contract D `theme@1.6`).
3
+ *
4
+ * Exporting `widgetAreas` is what tells the host that this theme draws the
5
+ * footer columns (`footer-1`..`footer-4`) inside its own footer, where
6
+ * `renderChrome` places them between the footer menu and the legal line. The
7
+ * page areas (`content-before`, `content-after`, `sidebar`) are placed by the
8
+ * host in the one `cg-sidebar-layout` markup every theme styles; this theme
9
+ * sets it on its twelve-column grid in `styles/widgets.css`.
10
+ *
11
+ * A third-party theme can copy this file as it is: a theme that adds an area
12
+ * of its own lists it here too, and renders it itself with
13
+ * `renderWidgetArea` from `@cogenta/theme-kit`.
14
+ */
15
+ export const widgetAreas = [
16
+ {
17
+ id: 'sidebar',
18
+ label: 'Sidebar',
19
+ description: 'Beside an entry, an archive or search results on a wide screen; under the content on a phone and on the home page.',
20
+ },
21
+ {
22
+ id: 'content-before',
23
+ label: 'Before the content',
24
+ description: 'At the top of the page, under the header.',
25
+ },
26
+ {
27
+ id: 'content-after',
28
+ label: 'After the content',
29
+ description: 'Under the page’s own content, before the comments.',
30
+ },
31
+ {
32
+ id: 'footer-1',
33
+ label: 'Footer, column 1',
34
+ description: 'In the footer, between the footer menu and the legal line.',
35
+ },
36
+ { id: 'footer-2', label: 'Footer, column 2' },
37
+ { id: 'footer-3', label: 'Footer, column 3' },
38
+ { id: 'footer-4', label: 'Footer, column 4' },
39
+ ];
40
+ //# 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;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,WAAW,GAIlB;IACJ;QACE,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,SAAS;QAChB,WAAW,EACT,oHAAoH;KACvH;IACD;QACE,EAAE,EAAE,gBAAgB;QACpB,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,2CAA2C;KACzD;IACD;QACE,EAAE,EAAE,eAAe;QACnB,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,oDAAoD;KAClE;IACD;QACE,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,4DAA4D;KAC1E;IACD,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,kBAAkB,EAAE;IAC7C,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,kBAAkB,EAAE;IAC7C,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,kBAAkB,EAAE;CAC9C,CAAA"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cogenta/theme-canonical",
3
- "version": "1.1.2",
4
- "description": "The reference Cogenta theme: the twelve vocabulary blocks, rendered accessibly, with zero client JavaScript.",
3
+ "version": "1.3.3",
4
+ "description": "The reference Cogenta theme: all seventeen vocabulary blocks on a twelve-column grid, set in Instrument Sans and Instrument Serif, accessible, with zero client JavaScript.",
5
5
  "license": "MPL-2.0",
6
6
  "type": "module",
7
7
  "sideEffects": false,
@@ -39,9 +39,9 @@
39
39
  "directory": "packages/theme-canonical"
40
40
  },
41
41
  "dependencies": {
42
- "@cogenta/blocks": "1.0.3",
43
- "@cogenta/theme-kit": "0.3.2",
44
- "@cogenta/render": "0.2.3"
42
+ "@cogenta/render": "0.3.5",
43
+ "@cogenta/blocks": "1.1.3",
44
+ "@cogenta/theme-kit": "0.5.3"
45
45
  },
46
46
  "peerDependencies": {
47
47
  "astro": "^7.2.1"
package/src/index.ts CHANGED
@@ -21,4 +21,5 @@ export * from './render/media.js'
21
21
  export * from './render/render-block.js'
22
22
  export * from './render/rich-text.js'
23
23
  export * from './render/term-archive.js'
24
+ export * from './render/widget-areas.js'
24
25
  export * from './theme-contract.js'
@@ -0,0 +1,27 @@
1
+ import { type Child, h, text } from '@cogenta/theme-kit'
2
+
3
+ /**
4
+ * The words of a link that ends (or starts) with an arrow.
5
+ *
6
+ * The arrow itself is drawn by the stylesheet, after the last word (or before
7
+ * the first), on a `<span>` that also refuses to break: a long label wraps
8
+ * between its earlier words, and the arrow always travels with a word. A
9
+ * label of one word is that span alone.
10
+ */
11
+ export function arrowWords(label: string, direction: 'forward' | 'back' = 'forward'): Child[] {
12
+ const trimmed = label.trim()
13
+ if (direction === 'back') {
14
+ const at = trimmed.indexOf(' ')
15
+ if (at === -1) return [h('span', { class: 'cg-arrow-link__start' }, trimmed)]
16
+ return [
17
+ h('span', { class: 'cg-arrow-link__start' }, trimmed.slice(0, at)),
18
+ text(trimmed.slice(at)),
19
+ ]
20
+ }
21
+ const at = trimmed.lastIndexOf(' ')
22
+ if (at === -1) return [h('span', { class: 'cg-arrow-link__end' }, trimmed)]
23
+ return [
24
+ text(trimmed.slice(0, at + 1)),
25
+ h('span', { class: 'cg-arrow-link__end' }, trimmed.slice(at + 1)),
26
+ ]
27
+ }