@cogenta/theme-association 0.3.3 → 0.5.4

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 (148) hide show
  1. package/dist/src/index.d.ts +6 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +9 -0
  4. package/dist/src/index.js.map +1 -1
  5. package/dist/src/render/blocks/accordion.d.ts.map +1 -1
  6. package/dist/src/render/blocks/accordion.js +13 -10
  7. package/dist/src/render/blocks/accordion.js.map +1 -1
  8. package/dist/src/render/blocks/breakdown.d.ts +14 -0
  9. package/dist/src/render/blocks/breakdown.d.ts.map +1 -0
  10. package/dist/src/render/blocks/breakdown.js +17 -0
  11. package/dist/src/render/blocks/breakdown.js.map +1 -0
  12. package/dist/src/render/blocks/collection-list.d.ts +4 -10
  13. package/dist/src/render/blocks/collection-list.d.ts.map +1 -1
  14. package/dist/src/render/blocks/collection-list.js +89 -58
  15. package/dist/src/render/blocks/collection-list.js.map +1 -1
  16. package/dist/src/render/blocks/cta.d.ts +0 -5
  17. package/dist/src/render/blocks/cta.d.ts.map +1 -1
  18. package/dist/src/render/blocks/cta.js +22 -10
  19. package/dist/src/render/blocks/cta.js.map +1 -1
  20. package/dist/src/render/blocks/embed.d.ts.map +1 -1
  21. package/dist/src/render/blocks/embed.js +30 -22
  22. package/dist/src/render/blocks/embed.js.map +1 -1
  23. package/dist/src/render/blocks/faq.d.ts.map +1 -1
  24. package/dist/src/render/blocks/faq.js +11 -15
  25. package/dist/src/render/blocks/faq.js.map +1 -1
  26. package/dist/src/render/blocks/feature-grid.d.ts +6 -0
  27. package/dist/src/render/blocks/feature-grid.d.ts.map +1 -1
  28. package/dist/src/render/blocks/feature-grid.js +42 -20
  29. package/dist/src/render/blocks/feature-grid.js.map +1 -1
  30. package/dist/src/render/blocks/gallery.d.ts +9 -7
  31. package/dist/src/render/blocks/gallery.d.ts.map +1 -1
  32. package/dist/src/render/blocks/gallery.js +22 -16
  33. package/dist/src/render/blocks/gallery.js.map +1 -1
  34. package/dist/src/render/blocks/hero.d.ts +23 -9
  35. package/dist/src/render/blocks/hero.d.ts.map +1 -1
  36. package/dist/src/render/blocks/hero.js +40 -23
  37. package/dist/src/render/blocks/hero.js.map +1 -1
  38. package/dist/src/render/blocks/logo-strip.d.ts +6 -0
  39. package/dist/src/render/blocks/logo-strip.d.ts.map +1 -1
  40. package/dist/src/render/blocks/logo-strip.js +7 -9
  41. package/dist/src/render/blocks/logo-strip.js.map +1 -1
  42. package/dist/src/render/blocks/logos.d.ts +14 -0
  43. package/dist/src/render/blocks/logos.d.ts.map +1 -1
  44. package/dist/src/render/blocks/logos.js +30 -16
  45. package/dist/src/render/blocks/logos.js.map +1 -1
  46. package/dist/src/render/blocks/media-figure.d.ts +12 -5
  47. package/dist/src/render/blocks/media-figure.d.ts.map +1 -1
  48. package/dist/src/render/blocks/media-figure.js +32 -18
  49. package/dist/src/render/blocks/media-figure.js.map +1 -1
  50. package/dist/src/render/blocks/pricing-table.d.ts.map +1 -1
  51. package/dist/src/render/blocks/pricing-table.js +18 -20
  52. package/dist/src/render/blocks/pricing-table.js.map +1 -1
  53. package/dist/src/render/blocks/prose.d.ts +9 -3
  54. package/dist/src/render/blocks/prose.d.ts.map +1 -1
  55. package/dist/src/render/blocks/prose.js +11 -4
  56. package/dist/src/render/blocks/prose.js.map +1 -1
  57. package/dist/src/render/blocks/quote.d.ts +4 -7
  58. package/dist/src/render/blocks/quote.d.ts.map +1 -1
  59. package/dist/src/render/blocks/quote.js +12 -17
  60. package/dist/src/render/blocks/quote.js.map +1 -1
  61. package/dist/src/render/blocks/stat-counter.d.ts +8 -1
  62. package/dist/src/render/blocks/stat-counter.d.ts.map +1 -1
  63. package/dist/src/render/blocks/stat-counter.js +18 -10
  64. package/dist/src/render/blocks/stat-counter.js.map +1 -1
  65. package/dist/src/render/blocks/stats.d.ts +12 -1
  66. package/dist/src/render/blocks/stats.d.ts.map +1 -1
  67. package/dist/src/render/blocks/stats.js +24 -14
  68. package/dist/src/render/blocks/stats.js.map +1 -1
  69. package/dist/src/render/blocks/testimonial.d.ts +6 -5
  70. package/dist/src/render/blocks/testimonial.d.ts.map +1 -1
  71. package/dist/src/render/blocks/testimonial.js +13 -11
  72. package/dist/src/render/blocks/testimonial.js.map +1 -1
  73. package/dist/src/render/chrome.d.ts +38 -1
  74. package/dist/src/render/chrome.d.ts.map +1 -1
  75. package/dist/src/render/chrome.js +117 -91
  76. package/dist/src/render/chrome.js.map +1 -1
  77. package/dist/src/render/details.d.ts +79 -0
  78. package/dist/src/render/details.d.ts.map +1 -0
  79. package/dist/src/render/details.js +221 -0
  80. package/dist/src/render/details.js.map +1 -0
  81. package/dist/src/render/figures.d.ts +29 -0
  82. package/dist/src/render/figures.d.ts.map +1 -0
  83. package/dist/src/render/figures.js +59 -0
  84. package/dist/src/render/figures.js.map +1 -0
  85. package/dist/src/render/layout.d.ts +31 -0
  86. package/dist/src/render/layout.d.ts.map +1 -0
  87. package/dist/src/render/layout.js +46 -0
  88. package/dist/src/render/layout.js.map +1 -0
  89. package/dist/src/render/page-head.d.ts +7 -0
  90. package/dist/src/render/page-head.d.ts.map +1 -0
  91. package/dist/src/render/page-head.js +95 -0
  92. package/dist/src/render/page-head.js.map +1 -0
  93. package/dist/src/render/render-block.d.ts +8 -12
  94. package/dist/src/render/render-block.d.ts.map +1 -1
  95. package/dist/src/render/render-block.js +40 -29
  96. package/dist/src/render/render-block.js.map +1 -1
  97. package/dist/src/render/strings.d.ts +15 -0
  98. package/dist/src/render/strings.d.ts.map +1 -0
  99. package/dist/src/render/strings.js +39 -0
  100. package/dist/src/render/strings.js.map +1 -0
  101. package/dist/src/render/term-archive.d.ts.map +1 -1
  102. package/dist/src/render/term-archive.js +33 -25
  103. package/dist/src/render/term-archive.js.map +1 -1
  104. package/dist/src/render/widget-areas.d.ts +14 -0
  105. package/dist/src/render/widget-areas.d.ts.map +1 -0
  106. package/dist/src/render/widget-areas.js +21 -0
  107. package/dist/src/render/widget-areas.js.map +1 -0
  108. package/dist/theme.config.d.ts +1 -1
  109. package/dist/theme.config.js +3 -3
  110. package/dist/theme.config.js.map +1 -1
  111. package/package.json +5 -5
  112. package/src/index.ts +9 -0
  113. package/src/render/blocks/accordion.ts +28 -22
  114. package/src/render/blocks/breakdown.ts +42 -0
  115. package/src/render/blocks/collection-list.ts +234 -103
  116. package/src/render/blocks/cta.ts +48 -19
  117. package/src/render/blocks/embed.ts +47 -29
  118. package/src/render/blocks/faq.ts +22 -31
  119. package/src/render/blocks/feature-grid.ts +73 -41
  120. package/src/render/blocks/gallery.ts +32 -26
  121. package/src/render/blocks/hero.ts +56 -43
  122. package/src/render/blocks/logo-strip.ts +23 -21
  123. package/src/render/blocks/logos.ts +45 -40
  124. package/src/render/blocks/media-figure.ts +49 -24
  125. package/src/render/blocks/pricing-table.ts +31 -40
  126. package/src/render/blocks/prose.ts +16 -6
  127. package/src/render/blocks/quote.ts +34 -27
  128. package/src/render/blocks/stat-counter.ts +35 -29
  129. package/src/render/blocks/stats.ts +46 -38
  130. package/src/render/blocks/testimonial.ts +29 -20
  131. package/src/render/chrome.ts +165 -91
  132. package/src/render/details.ts +276 -0
  133. package/src/render/figures.ts +68 -0
  134. package/src/render/layout.ts +78 -0
  135. package/src/render/page-head.ts +193 -0
  136. package/src/render/render-block.ts +45 -32
  137. package/src/render/strings.ts +74 -0
  138. package/src/render/term-archive.ts +94 -58
  139. package/src/render/widget-areas.ts +24 -0
  140. package/src/styles/archive.css +38 -102
  141. package/src/styles/base.css +503 -554
  142. package/src/styles/blocks.css +913 -666
  143. package/src/styles/chrome.css +506 -0
  144. package/src/styles/listings.css +591 -0
  145. package/src/styles/theme.css +25 -19
  146. package/src/styles/tokens.css +284 -234
  147. package/src/styles/widgets.css +1059 -0
  148. package/tokens.json +18 -18
@@ -1,79 +1,102 @@
1
1
  import { type HtmlElement, h, type TermArchiveInput } from '@cogenta/theme-kit'
2
+ import { arrowWords } from './layout.js'
2
3
 
3
4
  /**
4
- * The taxonomy-term archive (contract D `theme@1.3`) — a card grid, the same
5
- * register the home page's "Upcoming events" `collectionList` uses: a
6
- * rounded, shadowed card per entry, with a big day/month badge when the
7
- * entry carries a publication date, title and summary underneath. There is
8
- * no `entryImage` here (`TermArchiveEntry` carries no image field), so the
9
- * card leans on the date badge and warm surface colour for shape instead of
10
- * a missing photo.
5
+ * The taxonomy-term archive (contract D `theme@1.3`), in the organisation's
6
+ * own register: a breadcrumb in small words, the term as the page title, its
7
+ * sub-terms as a row of links, then the classified entries as ruled rows of
8
+ * titles, dates and summaries, and a pager of two arrow links.
9
+ *
10
+ * `TermArchiveEntry` carries no picture and no event date, so an archive is
11
+ * an index, drawn like one, rather than a calendar with its days missing. A
12
+ * site that wants a calendar of one kind of event builds it from a
13
+ * `collectionList`, which carries both.
11
14
  */
12
- function dateBadge(publishedAt: string | null): HtmlElement | null {
13
- if (publishedAt === null) return null
14
- const date = new Date(publishedAt)
15
- if (Number.isNaN(date.getTime())) return null
16
- return h(
17
- 'time',
18
- { class: 'cg-archive-card__date', datetime: publishedAt },
19
- h('span', { class: 'cg-archive-card__day' }, String(date.getUTCDate())),
20
- h(
21
- 'span',
22
- { class: 'cg-archive-card__month' },
23
- new Intl.DateTimeFormat('en', { month: 'short' }).format(date),
24
- ),
25
- )
15
+ function formatDate(iso: string, locale: string): string {
16
+ try {
17
+ return new Intl.DateTimeFormat(locale, { dateStyle: 'long', timeZone: 'UTC' }).format(
18
+ new Date(iso),
19
+ )
20
+ } catch {
21
+ return iso
22
+ }
26
23
  }
27
24
 
28
25
  export function renderTermArchive(input: TermArchiveInput): HtmlElement {
29
- const cards = input.entries.map((entry) =>
26
+ const rows = input.entries.map((entry) =>
30
27
  h(
31
28
  'li',
32
- { class: 'cg-archive-card' },
33
- dateBadge(entry.publishedAt),
29
+ { class: 'ca-index__item' },
34
30
  h(
35
- 'div',
36
- { class: 'cg-archive-card__body' },
37
- h(
38
- 'h2',
39
- { class: 'cg-archive-card__title' },
40
- entry.href === null
41
- ? entry.title
42
- : h('a', { class: 'cg-archive-card__link', href: entry.href }, entry.title),
43
- ),
44
- entry.summary === null
45
- ? null
46
- : h('p', { class: 'cg-archive-card__excerpt' }, entry.summary),
31
+ 'h2',
32
+ { class: 'ca-index__title' },
33
+ entry.href === null
34
+ ? entry.title
35
+ : h('a', { class: 'ca-index__link', href: entry.href }, entry.title),
47
36
  ),
37
+ entry.publishedAt === null
38
+ ? null
39
+ : h(
40
+ 'p',
41
+ { class: 'ca-index__date' },
42
+ h('time', { datetime: entry.publishedAt }, formatDate(entry.publishedAt, input.locale)),
43
+ ),
44
+ entry.summary === null ? null : h('p', { class: 'ca-index__text' }, entry.summary),
48
45
  ),
49
46
  )
50
47
 
51
48
  return h(
52
49
  'main',
53
- { class: 'cg-main cg-archive', id: 'cg-main' },
54
- input.ancestors.length === 0
50
+ { class: 'cg-main ca-main ca-archive', id: 'cg-main' },
51
+ h(
52
+ 'header',
53
+ { class: 'ca-page-head' },
54
+ h(
55
+ 'div',
56
+ { class: 'ca-container ca-page-head__inner' },
57
+ input.ancestors.length === 0
58
+ ? null
59
+ : h(
60
+ 'nav',
61
+ { class: 'ca-archive__breadcrumb', 'aria-label': input.labels.breadcrumb },
62
+ h(
63
+ 'ol',
64
+ { class: 'ca-archive__trail' },
65
+ input.ancestors.map((link) => h('li', {}, h('a', { href: link.href }, link.label))),
66
+ ),
67
+ ),
68
+ h('h1', { class: 'ca-page-head__title' }, input.term.label),
69
+ ),
70
+ ),
71
+ input.children.length === 0
55
72
  ? null
56
73
  : h(
57
- 'nav',
58
- { class: 'cg-archive__breadcrumb', 'aria-label': input.labels.breadcrumb },
74
+ 'div',
75
+ { class: 'ca-section ca-archive__children' },
59
76
  h(
60
- 'ol',
61
- {},
62
- ...input.ancestors.map((link) => h('li', {}, h('a', { href: link.href }, link.label))),
77
+ 'div',
78
+ { class: 'ca-container' },
79
+ h(
80
+ 'ul',
81
+ { class: 'ca-archive__terms', 'aria-label': input.labels.subterms },
82
+ input.children.map((child) =>
83
+ h('li', { class: 'ca-archive__term' }, h('a', { href: child.href }, child.label)),
84
+ ),
85
+ ),
63
86
  ),
64
87
  ),
65
- h('h1', { class: 'cg-archive__title' }, input.term.label),
66
- input.children.length === 0
67
- ? null
68
- : h(
69
- 'ul',
70
- { class: 'cg-archive__children', 'aria-label': input.labels.subterms },
71
- ...input.children.map((child) => h('li', {}, h('a', { href: child.href }, child.label))),
72
- ),
73
- cards.length === 0
74
- ? h('p', { class: 'cg-archive__empty' }, input.labels.empty)
75
- : h('ul', { class: 'cg-archive__grid' }, ...cards),
76
- pager(input),
88
+ h(
89
+ 'section',
90
+ { class: 'ca-section ca-list', 'data-shape': rows.length === 0 ? 'empty' : 'index' },
91
+ h(
92
+ 'div',
93
+ { class: 'ca-container ca-list__inner' },
94
+ rows.length === 0
95
+ ? h('p', { class: 'ca-empty' }, input.labels.empty)
96
+ : h('ul', { class: 'ca-list__items ca-index' }, rows),
97
+ pager(input),
98
+ ),
99
+ ),
77
100
  )
78
101
  }
79
102
 
@@ -81,12 +104,25 @@ function pager(input: TermArchiveInput): HtmlElement | null {
81
104
  if (input.page.previousHref === null && input.page.nextHref === null) return null
82
105
  return h(
83
106
  'nav',
84
- { class: 'cg-archive__pager', 'aria-label': input.labels.pagination },
107
+ { class: 'ca-archive__pager', 'aria-label': input.labels.pagination },
85
108
  input.page.previousHref === null
86
109
  ? null
87
- : h('a', { rel: 'prev', href: input.page.previousHref }, input.labels.previous),
110
+ : h(
111
+ 'a',
112
+ {
113
+ class: 'ca-arrow-link',
114
+ 'data-direction': 'back',
115
+ rel: 'prev',
116
+ href: input.page.previousHref,
117
+ },
118
+ h('span', { class: 'ca-arrow-link__start' }, input.labels.previous),
119
+ ),
88
120
  input.page.nextHref === null
89
121
  ? null
90
- : h('a', { rel: 'next', href: input.page.nextHref }, input.labels.next),
122
+ : h(
123
+ 'a',
124
+ { class: 'ca-arrow-link', rel: 'next', href: input.page.nextHref },
125
+ arrowWords(input.labels.next),
126
+ ),
91
127
  )
92
128
  }
@@ -0,0 +1,24 @@
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
+ * green band; 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 noticeboard: short labels, ruled lists, photographs, and the
7
+ * ask on the paper band.
8
+ */
9
+ export const widgetAreas: readonly {
10
+ readonly id: string
11
+ readonly label: string
12
+ readonly description?: string
13
+ }[] = [
14
+ {
15
+ id: 'sidebar',
16
+ label: 'Side column',
17
+ description: 'Beside an event, a programme and search results.',
18
+ },
19
+ {
20
+ id: 'content-after',
21
+ label: 'Under the page',
22
+ description: 'After an event, a programme or a page, before the comments.',
23
+ },
24
+ ]
@@ -1,129 +1,65 @@
1
1
  /*
2
- * The taxonomy-term archive (contract D `theme@1.3`) — a card grid in the
3
- * same warm, dated-card register the home page's "Upcoming events" block
4
- * uses, so a visitor who lands on a term archive from a search engine still
5
- * recognises the site.
2
+ * The taxonomy-term archive: a breadcrumb, the term, its sub-terms, the
3
+ * classified entries as an index, and a pager. Everything reads `tokens.css`.
6
4
  */
7
5
 
8
- .cg-archive {
9
- max-inline-size: var(--cg-page);
10
- margin-inline: auto;
11
- padding: var(--cg-s10) var(--cg-gutter);
12
- }
13
-
14
- .cg-archive__title {
15
- margin: 0 0 var(--cg-s8);
16
- font-size: var(--cg-text-3xl);
17
- line-height: var(--cg-leading-tight);
18
- letter-spacing: var(--cg-tracking-tight);
19
- text-wrap: balance;
20
- }
21
-
22
- .cg-archive__breadcrumb ol,
23
- .cg-archive__children {
6
+ .ca-archive__trail {
24
7
  display: flex;
25
8
  flex-wrap: wrap;
26
- gap: var(--cg-s3);
27
- margin: 0 0 var(--cg-s4);
28
- padding: 0;
29
- list-style: none;
30
- font-size: var(--cg-text-sm);
31
- }
32
-
33
- .cg-archive__children {
34
- margin-block: var(--cg-s4) var(--cg-s8);
35
- }
36
-
37
- .cg-archive__grid {
38
- display: grid;
39
- gap: var(--cg-s5);
40
- grid-template-columns: 1fr;
9
+ gap: var(--ca-s1) var(--ca-s2);
41
10
  margin: 0;
42
11
  padding: 0;
43
12
  list-style: none;
13
+ font-size: var(--ca-text-caption);
44
14
  }
45
15
 
46
- @media (min-width: 46rem) {
47
- .cg-archive__grid {
48
- grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
49
- }
50
- }
51
-
52
- .cg-archive-card {
53
- display: flex;
54
- gap: var(--cg-s5);
55
- padding: var(--cg-s5);
56
- background: var(--cg-surface-raised);
57
- border-radius: var(--cg-radius-lg);
58
- box-shadow: var(--cogenta-shadow-sm);
16
+ .ca-archive__trail li + li::before {
17
+ content: "/" / "";
18
+ margin-inline-end: var(--ca-s2);
19
+ color: var(--ca-ink-subtle);
59
20
  }
60
21
 
61
- .cg-archive-card__date {
62
- display: flex;
63
- flex-direction: column;
64
- align-items: center;
65
- justify-content: center;
66
- flex-shrink: 0;
67
- inline-size: 4rem;
68
- block-size: 4rem;
69
- border-radius: var(--cg-radius-md);
70
- background: var(--cg-accent-soft);
71
- color: var(--cg-accent-soft-fg);
22
+ .ca-archive__trail a {
23
+ color: var(--ca-ink-muted);
24
+ text-decoration-color: transparent;
72
25
  }
73
26
 
74
- .cg-archive-card__day {
75
- font-family: var(--cg-font-display);
76
- font-size: var(--cg-text-lg);
77
- font-weight: var(--cg-weight-bold);
78
- line-height: 1;
27
+ .ca-archive__trail a:hover {
28
+ color: var(--ca-ink);
29
+ text-decoration-color: var(--ca-green);
79
30
  }
80
31
 
81
- .cg-archive-card__month {
82
- font-size: var(--cg-text-xs);
83
- font-weight: var(--cg-weight-bold);
84
- letter-spacing: var(--cg-tracking-wide);
85
- text-transform: uppercase;
32
+ .ca-archive__children {
33
+ padding-block: 0;
86
34
  }
87
35
 
88
- .cg-archive-card__body {
89
- min-inline-size: 0;
90
- }
91
-
92
- .cg-archive-card__title {
36
+ .ca-archive__terms {
37
+ display: flex;
38
+ flex-wrap: wrap;
39
+ gap: var(--ca-s2) var(--ca-s6);
93
40
  margin: 0;
94
- font-size: var(--cg-text-md);
95
- line-height: var(--cg-leading-snug);
96
- }
97
-
98
- .cg-archive-card__link {
99
- color: var(--cg-ink);
100
- text-decoration: none;
41
+ padding: 0;
42
+ list-style: none;
101
43
  }
102
44
 
103
- .cg-archive-card__link:hover {
104
- color: var(--cg-accent);
45
+ .ca-archive__term a {
46
+ font-weight: var(--ca-weight-semibold);
105
47
  }
106
48
 
107
- .cg-archive-card__excerpt {
108
- margin: var(--cg-s1) 0 0;
109
- color: var(--cg-ink-muted);
110
- font-size: var(--cg-text-sm);
49
+ .ca-archive__pager {
50
+ display: flex;
51
+ flex-wrap: wrap;
52
+ justify-content: space-between;
53
+ gap: var(--ca-s4);
54
+ margin-block-start: var(--ca-s10);
111
55
  }
112
56
 
113
- .cg-archive__empty {
114
- padding: var(--cg-s10);
115
- color: var(--cg-ink-muted);
116
- text-align: center;
117
- background: var(--cg-surface-sunken);
118
- border-radius: var(--cg-radius-lg);
119
- }
57
+ @media (min-width: 64rem) {
58
+ .ca-archive__breadcrumb {
59
+ grid-column: 1 / span 9;
60
+ }
120
61
 
121
- .cg-archive__pager {
122
- display: flex;
123
- justify-content: space-between;
124
- gap: var(--cg-s4);
125
- margin-block-start: var(--cg-s10);
126
- padding-block-start: var(--cg-s5);
127
- border-block-start: 1px solid var(--cg-line-soft);
128
- font-weight: var(--cg-weight-semibold);
62
+ .ca-archive__pager {
63
+ grid-column: 1 / span 8;
64
+ }
129
65
  }