@cogenta/theme-portfolio 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 +17 -0
  3. package/dist/src/index.d.ts.map +1 -0
  4. package/dist/src/index.js +20 -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 +25 -0
  11. package/dist/src/render/blocks/collection-list.d.ts.map +1 -0
  12. package/dist/src/render/blocks/collection-list.js +77 -0
  13. package/dist/src/render/blocks/collection-list.js.map +1 -0
  14. package/dist/src/render/blocks/cta.d.ts +10 -0
  15. package/dist/src/render/blocks/cta.d.ts.map +1 -0
  16. package/dist/src/render/blocks/cta.js +16 -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 +88 -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 +23 -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 +30 -0
  29. package/dist/src/render/blocks/feature-grid.js.map +1 -0
  30. package/dist/src/render/blocks/gallery.d.ts +18 -0
  31. package/dist/src/render/blocks/gallery.d.ts.map +1 -0
  32. package/dist/src/render/blocks/gallery.js +34 -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 +23 -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 +28 -0
  45. package/dist/src/render/blocks/logos.js.map +1 -0
  46. package/dist/src/render/blocks/media-figure.d.ts +19 -0
  47. package/dist/src/render/blocks/media-figure.d.ts.map +1 -0
  48. package/dist/src/render/blocks/media-figure.js +36 -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 +29 -0
  53. package/dist/src/render/blocks/pricing-table.js.map +1 -0
  54. package/dist/src/render/blocks/prose.d.ts +16 -0
  55. package/dist/src/render/blocks/prose.d.ts.map +1 -0
  56. package/dist/src/render/blocks/prose.js +17 -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 +18 -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 +22 -0
  69. package/dist/src/render/blocks/stats.js.map +1 -0
  70. package/dist/src/render/blocks/testimonial.d.ts +20 -0
  71. package/dist/src/render/blocks/testimonial.d.ts.map +1 -0
  72. package/dist/src/render/blocks/testimonial.js +29 -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 +114 -0
  77. package/dist/src/render/chrome.js.map +1 -0
  78. package/dist/src/render/render-block.d.ts +12 -0
  79. package/dist/src/render/render-block.d.ts.map +1 -0
  80. package/dist/src/render/render-block.js +111 -0
  81. package/dist/src/render/render-block.js.map +1 -0
  82. package/dist/src/render/term-archive.d.ts +14 -0
  83. package/dist/src/render/term-archive.d.ts.map +1 -0
  84. package/dist/src/render/term-archive.js +36 -0
  85. package/dist/src/render/term-archive.js.map +1 -0
  86. package/dist/theme.config.d.ts +26 -0
  87. package/dist/theme.config.d.ts.map +1 -0
  88. package/dist/theme.config.js +56 -0
  89. package/dist/theme.config.js.map +1 -0
  90. package/package.json +57 -0
  91. package/src/index.ts +19 -0
  92. package/src/render/blocks/accordion.ts +64 -0
  93. package/src/render/blocks/collection-list.ts +181 -0
  94. package/src/render/blocks/cta.ts +37 -0
  95. package/src/render/blocks/embed.ts +111 -0
  96. package/src/render/blocks/faq.ts +54 -0
  97. package/src/render/blocks/feature-grid.ts +68 -0
  98. package/src/render/blocks/gallery.ts +55 -0
  99. package/src/render/blocks/hero.ts +55 -0
  100. package/src/render/blocks/logo-strip.ts +38 -0
  101. package/src/render/blocks/logos.ts +63 -0
  102. package/src/render/blocks/media-figure.ts +51 -0
  103. package/src/render/blocks/pricing-table.ts +69 -0
  104. package/src/render/blocks/prose.ts +22 -0
  105. package/src/render/blocks/quote.ts +48 -0
  106. package/src/render/blocks/stat-counter.ts +49 -0
  107. package/src/render/blocks/stats.ts +49 -0
  108. package/src/render/blocks/testimonial.ts +45 -0
  109. package/src/render/chrome.ts +142 -0
  110. package/src/render/render-block.ts +155 -0
  111. package/src/render/term-archive.ts +88 -0
  112. package/src/styles/archive.css +40 -0
  113. package/src/styles/base.css +1056 -0
  114. package/src/styles/blocks.css +1468 -0
  115. package/src/styles/theme.css +20 -0
  116. package/src/styles/tokens.css +363 -0
  117. package/tokens.json +36 -0
@@ -0,0 +1,4 @@
1
+ import type { StatCounterBlock } from '@cogenta/blocks';
2
+ import { type HtmlElement, type RenderContext } from '@cogenta/theme-kit';
3
+ export declare function renderStatCounter(block: StatCounterBlock, _ctx: RenderContext): HtmlElement;
4
+ //# sourceMappingURL=stat-counter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stat-counter.d.ts","sourceRoot":"","sources":["../../../../src/render/blocks/stat-counter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAmB,MAAM,iBAAiB,CAAA;AACxE,OAAO,EAEL,KAAK,WAAW,EAGhB,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAA;AAwB3B,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,aAAa,GAAG,WAAW,CAiB3F"}
@@ -0,0 +1,18 @@
1
+ import { blockHeadingTag, h, heading, } from '@cogenta/theme-kit';
2
+ /**
3
+ * Narrower than `stats` (no `unit`, RFC 0001's own reasoning), so this is not
4
+ * `stats.ts`'s description list of labelled figures again with a field
5
+ * dropped — it is set as a single running strip of oversized digits
6
+ * separated by hairlines, the way a spec sheet's headline numbers run across
7
+ * a masthead, each with its own zero-padded index the way `logos.ts` numbers
8
+ * its marks. `stats.ts` stays the fuller, boxed "by the numbers" panel.
9
+ */
10
+ function renderItem(item, index) {
11
+ return h('li', { class: 'cg-counter__item' }, h('span', { class: 'cg-counter__index', 'aria-hidden': 'true' }, String(index + 1).padStart(2, '0')), h('span', { class: 'cg-counter__value' }, item.value), h('span', { class: 'cg-counter__label' }, item.label));
12
+ }
13
+ export function renderStatCounter(block, _ctx) {
14
+ return h('section', { class: 'cg-block cg-counter', 'data-block': 'statCounter' }, block.title === undefined
15
+ ? null
16
+ : heading(blockHeadingTag('statCounter') ?? 'h2', { class: 'cg-counter__title', 'data-field': 'title' }, block.title), h('ul', { class: 'cg-counter__items' }, block.stats.map((item, index) => renderItem(item, index))));
17
+ }
18
+ //# 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;;;;;;;GAOG;AACH,SAAS,UAAU,CAAC,IAAqB,EAAE,KAAa;IACtD,OAAO,CAAC,CACN,IAAI,EACJ,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAC7B,CAAC,CACC,MAAM,EACN,EAAE,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,EAAE,EACrD,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CACnC,EACD,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,EACrD,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CACtD,CAAA;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAuB,EAAE,IAAmB;IAC5E,OAAO,CAAC,CACN,SAAS,EACT,EAAE,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,aAAa,EAAE,EAC7D,KAAK,CAAC,KAAK,KAAK,SAAS;QACvB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,OAAO,CACL,eAAe,CAAC,aAAa,CAAC,IAAI,IAAI,EACtC,EAAE,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,OAAO,EAAE,EACrD,KAAK,CAAC,KAAK,CACZ,EACL,CAAC,CACC,IAAI,EACJ,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAC9B,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAC1D,CACF,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;AA4B3B,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,GAAG,WAAW,CAa/E"}
@@ -0,0 +1,22 @@
1
+ import { blockHeadingTag, h, heading, } from '@cogenta/theme-kit';
2
+ /**
3
+ * A description list: each figure is the description of its label, which is
4
+ * exactly what `<dt>`/`<dd>` mean, and it survives being read linearly.
5
+ *
6
+ * The label comes first in the markup and the skin puts the figure above it
7
+ * — reading order and visual order stay independent, which is what WCAG
8
+ * 1.3.2 asks for.
9
+ *
10
+ * Figures are set at the theme's biggest display scale and in tabular mono
11
+ * numerals — a portfolio's "by the numbers" row reads like a spec sheet,
12
+ * not a dashboard widget.
13
+ */
14
+ function renderItem(item) {
15
+ return h('div', { class: 'cg-stat' }, h('dt', { class: 'cg-stat__label' }, item.label), h('dd', { class: 'cg-stat__value' }, item.value, item.unit === undefined ? null : h('span', { class: 'cg-stat__unit' }, item.unit)));
16
+ }
17
+ export function renderStats(block, _ctx) {
18
+ return h('section', { class: 'cg-block cg-stats', 'data-block': 'stats' }, block.title === undefined
19
+ ? null
20
+ : heading(blockHeadingTag('stats') ?? 'h2', { class: 'cg-stats__title', 'data-field': 'title' }, block.title), h('dl', { class: 'cg-stats__items' }, block.items.map(renderItem)));
21
+ }
22
+ //# 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;;;;;;;;;;;GAWG;AACH,SAAS,UAAU,CAAC,IAAc;IAChC,OAAO,CAAC,CACN,KAAK,EACL,EAAE,KAAK,EAAE,SAAS,EAAE,EACpB,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,EAChD,CAAC,CACC,IAAI,EACJ,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAC3B,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAClF,CACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAiB,EAAE,IAAmB;IAChE,OAAO,CAAC,CACN,SAAS,EACT,EAAE,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,OAAO,EAAE,EACrD,KAAK,CAAC,KAAK,KAAK,SAAS;QACvB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,OAAO,CACL,eAAe,CAAC,OAAO,CAAC,IAAI,IAAI,EAChC,EAAE,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,OAAO,EAAE,EACnD,KAAK,CAAC,KAAK,CACZ,EACL,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CACnE,CAAA;AACH,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { TestimonialBlock } from '@cogenta/blocks';
2
+ import { type HtmlElement, type RenderContext } from '@cogenta/theme-kit';
3
+ /**
4
+ * Distinct from `quote` on purpose (RFC 0001): `quote` is this theme's full-
5
+ * bleed pull quote, set left-aligned at display scale with no frame. A wall
6
+ * of testimonials needs to sit several-up without each one reading as a
7
+ * headline, so this is a bordered card instead — the same "cut paper"
8
+ * language `feature-grid.ts` uses for its items, at a quieter type scale.
9
+ *
10
+ * `attribution` arrives as one grouped field (RFC 0001's own reasoning for
11
+ * shaping it that way), so its `name`/`role` are not marked `data-field`:
12
+ * that attribute is reserved for a plain-text field the block schema
13
+ * declares at the top level, and neither of these is one — only `attribution`
14
+ * itself is, and it is not plain text.
15
+ *
16
+ * The avatar is decorative, exactly like `quote.ts`'s own — the name sits
17
+ * right beside it in text, so its media entity's alt text is expected empty.
18
+ */
19
+ export declare function renderTestimonial(block: TestimonialBlock, ctx: RenderContext): HtmlElement;
20
+ //# 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;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,EAAE,aAAa,GAAG,WAAW,CAyB1F"}
@@ -0,0 +1,29 @@
1
+ import { h, image, renderRichText } from '@cogenta/theme-kit';
2
+ /**
3
+ * Distinct from `quote` on purpose (RFC 0001): `quote` is this theme's full-
4
+ * bleed pull quote, set left-aligned at display scale with no frame. A wall
5
+ * of testimonials needs to sit several-up without each one reading as a
6
+ * headline, so this is a bordered card instead — the same "cut paper"
7
+ * language `feature-grid.ts` uses for its items, at a quieter type scale.
8
+ *
9
+ * `attribution` arrives as one grouped field (RFC 0001's own reasoning for
10
+ * shaping it that way), so its `name`/`role` are not marked `data-field`:
11
+ * that attribute is reserved for a plain-text field the block schema
12
+ * declares at the top level, and neither of these is one — only `attribution`
13
+ * itself is, and it is not plain text.
14
+ *
15
+ * The avatar is decorative, exactly like `quote.ts`'s own — the name sits
16
+ * right beside it in text, so its media entity's alt text is expected empty.
17
+ */
18
+ export function renderTestimonial(block, ctx) {
19
+ const { attribution } = block;
20
+ return h('figure', { class: 'cg-block cg-testimonial', 'data-block': 'testimonial' }, h('blockquote', { class: 'cg-testimonial__quote' }, renderRichText(ctx, block.quote)), h('figcaption', { class: 'cg-testimonial__attribution' }, attribution.avatar === undefined
21
+ ? null
22
+ : image(ctx, attribution.avatar, {
23
+ className: 'cg-testimonial__avatar',
24
+ variant: { width: 96, height: 96, fit: 'cover' },
25
+ }), h('span', { class: 'cg-testimonial__names' }, h('span', { class: 'cg-testimonial__name' }, attribution.name), attribution.role === undefined
26
+ ? null
27
+ : h('span', { class: 'cg-testimonial__role' }, attribution.role))));
28
+ }
29
+ //# 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;;;;;;;;;;;;;;;GAeG;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,yBAAyB,EAAE,YAAY,EAAE,aAAa,EAAE,EACjE,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,uBAAuB,EAAE,EAClC,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;AAwE3B,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,YAAY,CA2D7D"}
@@ -0,0 +1,114 @@
1
+ import { escapeAttribute, escapeText, renderBrandMark, renderSocialLinks, renderThemeToggle, serialize, } from '@cogenta/theme-kit';
2
+ /**
3
+ * The chrome this theme ships (`theme@1.4`): a thin, sticky index bar up
4
+ * top — the site name treated as a typographic mark rather than a logo
5
+ * slot, a running index number, a real desktop `<nav>`, `headerAction`
6
+ * (`"Let's talk"`, a flat filled button) and a CSS-only mobile menu — and a
7
+ * footer that becomes a second headline: the site name set at display
8
+ * scale, repeated as a closing statement, the `tagline` beneath it, then a
9
+ * real row of footer navigation, social icons (`renderSocialLinks`) and the
10
+ * `footerNote` beside the branding fragment.
11
+ *
12
+ * The mobile menu is the same checkbox/label trick every L25 theme uses —
13
+ * a visually-hidden `<input type="checkbox">` paired with a `<label>`
14
+ * styled as a three-bar button; `base.css`'s sibling combinator is what
15
+ * reveals the panel when the box is checked, so there is exactly one real
16
+ * `<nav>` in the markup (the same one desktop and mobile both use, retiled
17
+ * by CSS at the breakpoint), never two copies of the same links.
18
+ *
19
+ * Both fragments are built with the same string-escaping discipline
20
+ * `theme-kit`'s own reference chrome uses (`escapeText`/`escapeAttribute`) —
21
+ * `headerNav`/`footerNav` arrive pre-resolved and are rendered as given,
22
+ * never invented or dropped, and `brandingHtml` is placed, never altered.
23
+ * Every `theme@1.4` field (`tagline`/`social`/`footerNote`/`headerAction`)
24
+ * is optional and additive: a host or a site that never sets one gets
25
+ * exactly the `1.3` markup in that spot, byte for byte (`chrome.test.ts`'s
26
+ * "without the new fields" cases).
27
+ *
28
+ * The manual light/dark/system toggle (`renderThemeToggle`, `@cogenta/
29
+ * theme-kit`, L26) is unconditional — every render carries it, `theme@1.4`
30
+ * or not — placed as its own sibling after the nav/hamburger pair so it
31
+ * stays visible whether or not the mobile menu is open, styled in this
32
+ * theme's own hairline-bordered, sharp-cornered register in `base.css`
33
+ * rather than canonical's pill button.
34
+ */
35
+ function renderNavLinks(links, className) {
36
+ if (links.length === 0)
37
+ return '';
38
+ const items = links
39
+ .filter((link) => link.href !== null || link.kind === 'submenu-placeholder')
40
+ .map((link, index) => {
41
+ const label = escapeText(link.label);
42
+ const titleAttr = link.title === null ? '' : ` title="${escapeAttribute(link.title)}"`;
43
+ const number = String(index + 1).padStart(2, '0');
44
+ if (link.href === null) {
45
+ return `<li><span class="cg-nav__index" aria-hidden="true">${number}</span><span${titleAttr}>${label}</span></li>`;
46
+ }
47
+ const href = escapeAttribute(link.href);
48
+ const target = link.openInNewTab ? ' target="_blank" rel="noopener"' : '';
49
+ return (`<li><span class="cg-nav__index" aria-hidden="true">${number}</span>` +
50
+ `<a href="${href}"${target}${titleAttr}>${label}</a></li>`);
51
+ })
52
+ .join('');
53
+ return items === '' ? '' : `<ul class="${className}">${items}</ul>`;
54
+ }
55
+ /** The header's own call-to-action link (`theme@1.4`) — a flat filled button, the theme's one accent-coloured control, at the tail of the nav list. */
56
+ function renderHeaderAction(action) {
57
+ if (action === undefined)
58
+ return '';
59
+ return (`<a class="cg-action cg-site-header__action" data-emphasis="primary" ` +
60
+ `href="${escapeAttribute(action.href)}">${escapeText(action.label)}</a>`);
61
+ }
62
+ /** A hamburger mark drawn from three stacked bars — no icon font, no glyph a font might not ship. */
63
+ function menuGlyph() {
64
+ return '<span class="cg-nav-toggle-bar"></span><span class="cg-nav-toggle-bar"></span><span class="cg-nav-toggle-bar"></span>';
65
+ }
66
+ export function renderChrome(input) {
67
+ const siteName = escapeText(input.site.name);
68
+ const home = escapeAttribute(input.homeHref);
69
+ const headerNav = renderNavLinks(input.headerNav, 'cg-nav');
70
+ const footerNav = renderNavLinks(input.footerNav, 'cg-nav cg-nav--footer');
71
+ const headerAction = renderHeaderAction(input.headerAction);
72
+ const themeToggle = serialize(renderThemeToggle(input.locale, { className: 'cg-theme-toggle' }));
73
+ // The asterisk glyph is this theme's own typographic mark. It belongs to
74
+ // the *wordmark* treatment, so an uploaded logo replaces both together —
75
+ // an asterisk stapled to somebody else's logo is not a design decision
76
+ // this theme gets to make on their behalf.
77
+ const logo = renderBrandMark(input.brand, { className: 'cg-site-header__logo' });
78
+ const mark = logo ?? `<span class="cg-site-header__glyph" aria-hidden="true">*</span>${siteName}`;
79
+ const hasMenu = headerNav !== '' || headerAction !== '';
80
+ const nav = hasMenu
81
+ ? `<nav class="cg-site-header__nav" id="cg-nav" aria-label="Primary">${headerNav}${headerAction}</nav>`
82
+ : '';
83
+ const toggle = hasMenu
84
+ ? `<input type="checkbox" id="cg-nav-toggle" class="cg-nav-toggle-input" aria-label="Menu">` +
85
+ `<label for="cg-nav-toggle" class="cg-nav-toggle-label" aria-hidden="true">${menuGlyph()}</label>`
86
+ : '';
87
+ const header = `<header class="cg-site-header"><div class="cg-site-header__inner">` +
88
+ `<a class="cg-site-header__mark" href="${home}">${mark}</a>` +
89
+ `${toggle}${nav}` +
90
+ `${themeToggle}` +
91
+ `</div></header>`;
92
+ const tagline = input.tagline === undefined
93
+ ? ''
94
+ : `<p class="cg-site-footer__tagline" data-field="tagline">${escapeText(input.tagline)}</p>`;
95
+ const social = input.social === undefined
96
+ ? ''
97
+ : serialize(renderSocialLinks(input.social, {
98
+ className: 'cg-site-footer__social',
99
+ itemClassName: 'cg-site-footer__social-item',
100
+ }) ?? { kind: 'text', value: '' });
101
+ const footerNote = input.footerNote === undefined
102
+ ? ''
103
+ : `<p class="cg-site-footer__note">${escapeText(input.footerNote)}</p>`;
104
+ const footer = `<footer class="cg-site-footer"><div class="cg-site-footer__inner">` +
105
+ `<a class="cg-site-footer__statement" href="${home}">${siteName}</a>` +
106
+ `${tagline}` +
107
+ `<div class="cg-site-footer__row">` +
108
+ `${footerNav === '' ? '' : `<nav aria-label="Footer">${footerNav}</nav>`}` +
109
+ `${social === '' ? '' : `<div class="cg-site-footer__social-col">${social}</div>`}` +
110
+ `<div class="cg-site-footer__meta">${footerNote}<div class="cg-site-footer__branding">${input.brandingHtml}</div></div>` +
111
+ `</div></div></footer>`;
112
+ return { header, footer };
113
+ }
114
+ //# sourceMappingURL=chrome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chrome.js","sourceRoot":"","sources":["../../../src/render/chrome.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
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
+ /**
4
+ * `PageContent`/`FetchedEntries`/`pageHasOwnHeading`/`withBlockKey` are
5
+ * `@cogenta/theme-kit`'s own — re-exported here so this package's public
6
+ * surface names them, the same shape every theme package shares them under.
7
+ */
8
+ export type { FetchedEntries, PageContent };
9
+ export { pageHasOwnHeading, renderEntryHeader, withBlockKey };
10
+ export declare function renderBlock(block: VocabularyBlock, ctx: RenderContext, entries?: FetchedEntries, registry?: BlockRegistry): HtmlElement | null;
11
+ export declare function renderPage(page: PageContent, ctx: RenderContext, entries?: FetchedEntries, registry?: BlockRegistry): HtmlElement;
12
+ //# 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;;;;GAIG;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,CAapB;AA4ED,wBAAgB,UAAU,CACxB,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,aAAa,EAClB,OAAO,GAAE,cAAmB,EAC5B,QAAQ,CAAC,EAAE,aAAa,GACvB,WAAW,CAgBb"}
@@ -0,0 +1,111 @@
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 a
74
+ // block this package does not implement stops it compiling until it is.
75
+ const unreachable = known;
76
+ void unreachable;
77
+ return null;
78
+ }
79
+ }
80
+ }
81
+ /**
82
+ * `renderEntryHeader` (`theme@1.4`) draws the eyebrow/title/excerpt/meta/
83
+ * cover furniture for a page backed by a real content entry — a project —
84
+ * and already returns `null` for a page with no `entry` meta *and* for one
85
+ * whose blocks draw their own heading (a `hero`), so the bare
86
+ * `<h1 class="cg-page__title">` fallback below is the right markup in both
87
+ * of those cases and only those — never a double heading, and never a page
88
+ * with none at all. A page rendered before `theme@1.4` (`page.entry`
89
+ * absent) gets exactly the pre-1.4 markup, byte for byte.
90
+ */
91
+ /**
92
+ * `withBlockKey` stamps `data-block-key` (the L16 builder's own hook); this
93
+ * theme additionally stamps a real `id`, the block's own `_key`, on the same
94
+ * element — `_key` is already unique within a page (contract B), so it
95
+ * doubles as a genuine in-page anchor. The header/footer's own single-page
96
+ * links (the `portfolio` blueprint's "Work"/"Services" nav) resolve to a
97
+ * real target this way, rather than a `#fragment` nothing on the page
98
+ * answers to.
99
+ */
100
+ function withBlockAnchor(element, key) {
101
+ if (element === null)
102
+ return null;
103
+ return { ...element, attrs: { ...element.attrs, id: key } };
104
+ }
105
+ export function renderPage(page, ctx, entries = {}, registry) {
106
+ const entryHeader = renderEntryHeader(page, ctx);
107
+ return h('main', { class: 'cg-main', id: 'cg-main' }, entryHeader, entryHeader === null && !pageHasOwnHeading(page.blocks)
108
+ ? h('h1', { class: 'cg-page__title' }, page.title)
109
+ : null, page.blocks.map((block) => withBlockAnchor(withBlockKey(renderBlock(block, ctx, entries, registry), block._key), block._key)));
110
+ }
111
+ //# 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,14 @@
1
+ import { type HtmlElement, type TermArchiveInput } from '@cogenta/theme-kit';
2
+ /**
3
+ * The taxonomy-term archive (contract D `theme@1.3`), in this theme's own
4
+ * brutalist-editorial voice: the term set as a display heading with the
5
+ * taxonomy name as a kicker above it, and the entries as the same numbered
6
+ * `cg-entry` rows `collectionList` already renders here — an index, not a
7
+ * card grid.
8
+ *
9
+ * Reusing the block's own classes rather than inventing archive-only ones is
10
+ * deliberate: it is what makes an archive of work look like this theme's
11
+ * lists without a second stylesheet to keep in step.
12
+ */
13
+ export declare function renderTermArchive(input: TermArchiveInput): HtmlElement;
14
+ //# 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;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,WAAW,CA4DtE"}
@@ -0,0 +1,36 @@
1
+ import { h } from '@cogenta/theme-kit';
2
+ /**
3
+ * The taxonomy-term archive (contract D `theme@1.3`), in this theme's own
4
+ * brutalist-editorial voice: the term set as a display heading with the
5
+ * taxonomy name as a kicker above it, and the entries as the same numbered
6
+ * `cg-entry` rows `collectionList` already renders here — an index, not a
7
+ * card grid.
8
+ *
9
+ * Reusing the block's own classes rather than inventing archive-only ones is
10
+ * deliberate: it is what makes an archive of work look like this theme's
11
+ * lists without a second stylesheet to keep in step.
12
+ */
13
+ export function renderTermArchive(input) {
14
+ const items = input.entries.map((entry, index) => h('li', { class: 'cg-entry' }, h('div', { class: 'cg-entry__body' }, h('span', { class: 'cg-entry__index', 'aria-hidden': 'true' }, String(index + 1).padStart(2, '0')), h('h2', { class: 'cg-entry__title' }, entry.href === null
15
+ ? entry.title
16
+ : h('a', { class: 'cg-entry__link', href: entry.href }, entry.title)), entry.publishedAt === null
17
+ ? null
18
+ : 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))));
19
+ return h('main', { class: 'cg-main cg-archive', id: 'cg-main' }, input.ancestors.length === 0
20
+ ? null
21
+ : 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('p', { class: 'cg-collection__title' }, input.taxonomyName), h('h1', { class: 'cg-page__title' }, input.term.label), input.children.length === 0
22
+ ? null
23
+ : h('ul', { class: 'cg-archive__children', 'aria-label': input.labels.subterms }, ...input.children.map((c) => h('li', {}, h('a', { href: c.href }, c.label)))), items.length === 0
24
+ ? h('p', { class: 'cg-collection__empty' }, input.labels.empty)
25
+ : h('ul', { class: 'cg-collection__items' }, ...items), pager(input));
26
+ }
27
+ function pager(input) {
28
+ if (input.page.previousHref === null && input.page.nextHref === null)
29
+ return null;
30
+ return h('nav', { class: 'cg-archive__pager', 'aria-label': input.labels.pagination }, input.page.previousHref === null
31
+ ? null
32
+ : h('a', { rel: 'prev', href: input.page.previousHref }, input.labels.previous), input.page.nextHref === null
33
+ ? null
34
+ : h('a', { rel: 'next', href: input.page.nextHref }, input.labels.next));
35
+ }
36
+ //# 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,26 @@
1
+ /**
2
+ * Contract D — Thème, `theme@1.4`.
3
+ *
4
+ * `implements` lists the seventeen blocks of contract B (`blocks@2.0`, RFC
5
+ * 0001) in the order the contract lists them. A theme that omits one fails
6
+ * installation, which is what guarantees that switching theme never erases
7
+ * content.
8
+ *
9
+ * `runtime: 'static'` describes what *this theme* needs, not what every block
10
+ * on a page needs: `collectionList` is `runtime: 'server'` in the vocabulary
11
+ * and it is the block, not the theme, that makes a static build refuse.
12
+ *
13
+ * `a11y.verified` is a claim this package has to keep true: the tests assert
14
+ * the heading outline, the mandatory `alt`, and zero client JavaScript.
15
+ *
16
+ * L25 pro pass: `renderChrome` now uses every `theme@1.4` field (a real
17
+ * `headerAction` button, a CSS-only mobile menu, `tagline`/`social`/
18
+ * `footerNote` in the footer); `renderPage` draws `renderEntryHeader` for a
19
+ * project's own page; `collectionList`'s `grid`/`carousel` layouts show a
20
+ * full-bleed cover card instead of the plain numbered row; dark-mode
21
+ * elevation was rebuilt from an accent-tinted glow into a flat, zero-blur
22
+ * offset shadow (D5, binding).
23
+ */
24
+ declare const _default: import("@cogenta/theme-kit").ThemeManifest;
25
+ export default _default;
26
+ //# 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;;;;;;;;;;;;;;;;;;;;;;GAsBG"}
@@ -0,0 +1,56 @@
1
+ import { defineTheme } from '@cogenta/theme-kit';
2
+ /**
3
+ * Contract D — Thème, `theme@1.4`.
4
+ *
5
+ * `implements` lists the seventeen blocks of contract B (`blocks@2.0`, RFC
6
+ * 0001) in the order the contract lists them. A theme that omits one fails
7
+ * installation, which is what guarantees that switching theme never erases
8
+ * content.
9
+ *
10
+ * `runtime: 'static'` describes what *this theme* needs, not what every block
11
+ * on a page needs: `collectionList` is `runtime: 'server'` in the vocabulary
12
+ * and it is the block, not the theme, that makes a static build refuse.
13
+ *
14
+ * `a11y.verified` is a claim this package has to keep true: the tests assert
15
+ * the heading outline, the mandatory `alt`, and zero client JavaScript.
16
+ *
17
+ * L25 pro pass: `renderChrome` now uses every `theme@1.4` field (a real
18
+ * `headerAction` button, a CSS-only mobile menu, `tagline`/`social`/
19
+ * `footerNote` in the footer); `renderPage` draws `renderEntryHeader` for a
20
+ * project's own page; `collectionList`'s `grid`/`carousel` layouts show a
21
+ * full-bleed cover card instead of the plain numbered row; dark-mode
22
+ * elevation was rebuilt from an accent-tinted glow into a flat, zero-blur
23
+ * offset shadow (D5, binding).
24
+ */
25
+ export default defineTheme({
26
+ name: 'portfolio',
27
+ version: '1.2.0',
28
+ description: 'An ultra-modern creative-portfolio theme: brutalist-meets-editorial display type, an electric accent, zero client JavaScript.',
29
+ author: 'Cogenta',
30
+ engine: '^1.0.0',
31
+ blocks: '^2.0.0',
32
+ implements: [
33
+ 'hero',
34
+ 'prose',
35
+ 'mediaFigure',
36
+ 'featureGrid',
37
+ 'cta',
38
+ 'gallery',
39
+ 'quote',
40
+ 'faq',
41
+ 'stats',
42
+ 'logos',
43
+ 'collectionList',
44
+ 'embed',
45
+ 'testimonial',
46
+ 'pricingTable',
47
+ 'accordion',
48
+ 'statCounter',
49
+ 'logoStrip',
50
+ ],
51
+ collections: ['project', 'page'],
52
+ runtime: 'static',
53
+ tokens: './tokens.json',
54
+ a11y: { verified: 'WCAG-2.2-AA' },
55
+ });
56
+ //# 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,oBAAoB,CAAA;AAEhD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAe,WAAW,CAAC;IACzB,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,OAAO;IAChB,WAAW,EACT,+HAA+H;IACjI,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-portfolio",
3
+ "version": "1.1.2",
4
+ "description": "An ultra-modern creative-portfolio theme for Cogenta: brutalist-meets-editorial typography, an oversized display scale, 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-portfolio"
37
+ },
38
+ "dependencies": {
39
+ "@cogenta/blocks": "1.0.3",
40
+ "@cogenta/render": "0.2.3",
41
+ "@cogenta/theme-kit": "0.3.2"
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
+ }