@gradial/aci 0.1.52-rc.3 → 0.1.52-rc.34-e2e.1

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 (276) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/README.md +86 -5
  3. package/dist/astro/error-page.js +1 -0
  4. package/dist/astro/index.js +4 -0
  5. package/dist/astro/page.d.ts +5 -2
  6. package/dist/astro/page.js +35 -23
  7. package/dist/astro/preview.js +2 -17
  8. package/dist/audience-data-models.d.ts +308 -194
  9. package/dist/audience-data-models.js +314 -51
  10. package/dist/cli/compile-registry.d.mts +5 -1
  11. package/dist/cli/compile-registry.mjs +31 -46
  12. package/dist/cli/mintlify-render.mjs +8 -0
  13. package/dist/cli/validate-content.d.mts +31 -1
  14. package/dist/cli/validate-content.mjs +50 -12
  15. package/dist/collect/aci.js +1 -1
  16. package/dist/collect/aci.js.sha256 +1 -1
  17. package/dist/collect/api.d.ts +6 -7
  18. package/dist/collect/api.js +21 -8
  19. package/dist/collect/assignments.d.ts +7 -9
  20. package/dist/collect/assignments.js +23 -32
  21. package/dist/collect/batcher.d.ts +9 -7
  22. package/dist/collect/batcher.js +6 -5
  23. package/dist/collect/consent/envelope.d.ts +7 -1
  24. package/dist/collect/consent/envelope.js +3 -1
  25. package/dist/collect/consent/mapping.d.ts +2 -0
  26. package/dist/collect/consent/mapping.js +1 -0
  27. package/dist/collect/consenthold.d.ts +38 -0
  28. package/dist/collect/consenthold.js +82 -0
  29. package/dist/collect/declarative.js +7 -5
  30. package/dist/collect/gapbuffer.d.ts +13 -4
  31. package/dist/collect/gapbuffer.js +21 -10
  32. package/dist/collect/index.js +67 -20
  33. package/dist/collect/pageviews.d.ts +11 -11
  34. package/dist/collect/pageviews.js +27 -22
  35. package/dist/consent-banner/index.d.ts +17 -0
  36. package/dist/consent-banner/index.js +23 -0
  37. package/dist/content/index.d.ts +2 -1
  38. package/dist/content/index.js +4 -1
  39. package/dist/content/provider.d.ts +16 -2
  40. package/dist/content/provider.js +5 -1
  41. package/dist/content/resolve-slots.d.ts +33 -4
  42. package/dist/content/resolve-slots.js +127 -19
  43. package/dist/content/types.d.ts +7 -1
  44. package/dist/edge/expression-capabilities.v1.d.ts +106 -0
  45. package/dist/edge/expression-capabilities.v1.js +165 -0
  46. package/dist/index.d.ts +1 -2
  47. package/dist/index.js +0 -1
  48. package/dist/internal/domain/edge/compose.d.ts +24 -0
  49. package/dist/internal/domain/edge/compose.js +89 -0
  50. package/dist/internal/domain/edge/identity.d.ts +5 -0
  51. package/dist/internal/domain/edge/identity.js +50 -14
  52. package/dist/internal/domain/edge/index.d.ts +2 -0
  53. package/dist/internal/domain/edge/index.js +2 -0
  54. package/dist/internal/domain/edge/mimic_token.d.ts +14 -0
  55. package/dist/internal/domain/edge/mimic_token.js +125 -0
  56. package/dist/internal/domain/edge/personalization-core.d.ts +61 -22
  57. package/dist/internal/domain/edge/personalization-core.js +789 -198
  58. package/dist/internal/domain/edge/personalization_index.d.ts +17 -0
  59. package/dist/internal/domain/edge/personalization_index.js +56 -0
  60. package/dist/internal/domain/edge/record/codec.d.ts +6 -32
  61. package/dist/internal/domain/edge/record/codec.js +86 -168
  62. package/dist/internal/domain/edge/resolve.js +76 -39
  63. package/dist/internal/domain/edge/testdata/flat_only_validator_v1.d.ts +10 -0
  64. package/dist/internal/domain/edge/testdata/flat_only_validator_v1.js +253 -0
  65. package/dist/internal/domain/edge/types.d.ts +93 -41
  66. package/dist/internal/domain/edge/types.js +3 -3
  67. package/dist/internal/domain/edge/variant_key.d.ts +3 -0
  68. package/dist/internal/domain/edge/variant_key.js +44 -0
  69. package/dist/internal/platform/collectionstore/errors.d.ts +24 -0
  70. package/dist/internal/platform/collectionstore/errors.js +48 -0
  71. package/dist/mimic/core.d.ts +2 -0
  72. package/dist/mimic/core.js +31 -0
  73. package/dist/mintlify/blocks.d.ts +6 -0
  74. package/dist/mintlify/blocks.js +201 -0
  75. package/dist/mintlify/config.d.ts +3 -0
  76. package/dist/mintlify/config.js +77 -0
  77. package/dist/mintlify/index.d.ts +3 -0
  78. package/dist/mintlify/index.js +2 -0
  79. package/dist/mintlify/json.d.ts +8 -0
  80. package/dist/mintlify/json.js +37 -0
  81. package/dist/mintlify/materialize.d.ts +14 -0
  82. package/dist/mintlify/materialize.js +254 -0
  83. package/dist/mintlify/types.d.ts +74 -0
  84. package/dist/mintlify/types.js +1 -0
  85. package/dist/mintlify/validate.d.ts +7 -0
  86. package/dist/mintlify/validate.js +256 -0
  87. package/dist/next/assignments-navigation.d.ts +4 -0
  88. package/dist/next/assignments-navigation.js +18 -0
  89. package/dist/next/assignments-script.d.ts +3 -2
  90. package/dist/next/assignments-script.js +5 -5
  91. package/dist/next/error-pages.d.ts +4 -0
  92. package/dist/next/error-pages.js +4 -0
  93. package/dist/next/error-seat-payload.d.ts +2 -1
  94. package/dist/next/error-seat-payload.js +14 -24
  95. package/dist/next/error-seat.js +7 -2
  96. package/dist/next/hosted-page-target.d.ts +7 -0
  97. package/dist/next/hosted-page-target.js +39 -0
  98. package/dist/next/index.d.ts +1 -1
  99. package/dist/next/index.js +3 -1
  100. package/dist/next/page.d.ts +29 -6
  101. package/dist/next/page.js +47 -25
  102. package/dist/next/release-context.d.ts +29 -0
  103. package/dist/next/release-context.js +55 -0
  104. package/dist/next/render.d.ts +1 -1
  105. package/dist/next/render.js +15 -5
  106. package/dist/next/server.d.ts +8 -0
  107. package/dist/next/server.js +44 -3
  108. package/dist/next/vercel-edge-projection-v1.d.ts +0 -9
  109. package/dist/next/vercel-edge-projection-v1.js +9 -539
  110. package/dist/preview/core.d.ts +1 -0
  111. package/dist/preview/core.js +27 -0
  112. package/dist/react/VideoPlayer.d.ts +3 -3
  113. package/dist/react/VideoPlayer.js +2 -2
  114. package/dist/react/index.d.ts +4 -4
  115. package/dist/react/index.js +2 -3
  116. package/dist/registry.d.ts +4 -2
  117. package/dist/testing/conformance/checks.d.ts +2 -2
  118. package/dist/testing/conformance/checks.js +2 -0
  119. package/dist/testing/conformance/index.d.ts +1 -0
  120. package/dist/testing/conformance/index.js +1 -0
  121. package/dist/testing/conformance/next-stubs.d.ts +6 -0
  122. package/dist/testing/conformance/next-stubs.js +9 -0
  123. package/dist/testing/conformance/preset.d.ts +3 -2
  124. package/dist/testing/conformance/preset.js +15 -8
  125. package/dist/testing/conformance/root-identity.d.ts +31 -0
  126. package/dist/testing/conformance/root-identity.js +361 -0
  127. package/dist/testing/conformance/stubs/next-image.d.ts +7 -0
  128. package/dist/testing/conformance/stubs/next-image.js +5 -0
  129. package/dist/testing/conformance/stubs/next-link.d.ts +7 -0
  130. package/dist/testing/conformance/stubs/next-link.js +4 -0
  131. package/dist/testing/conformance/types.d.ts +5 -2
  132. package/dist/testing/index.d.ts +1 -1
  133. package/dist/testing/index.js +4 -3
  134. package/dist/types/block-ref.d.ts +2 -0
  135. package/dist/types/block-ref.js +3 -2
  136. package/dist/types/component.d.ts +9 -0
  137. package/dist/types/config.d.ts +0 -1
  138. package/dist/types/image.d.ts +54 -17
  139. package/dist/types/image.js +102 -18
  140. package/dist/types/index.d.ts +0 -1
  141. package/dist/types/index.js +0 -1
  142. package/dist/types/media.d.ts +14 -6
  143. package/dist/types/page.d.ts +0 -1
  144. package/dist/types/video.d.ts +7 -3
  145. package/migrations/conformance-registry.md +22 -0
  146. package/package.json +21 -7
  147. package/src/cli/compile-registry.mjs +30 -42
  148. package/src/cli/mintlify-render.mjs +9 -0
  149. package/src/cli/validate-content.mjs +52 -13
  150. package/src/types/block-ref.test.ts +60 -0
  151. package/src/types/block-ref.ts +4 -2
  152. package/src/types/component.ts +10 -0
  153. package/src/types/config.ts +0 -1
  154. package/src/types/image.ts +133 -29
  155. package/src/types/index.ts +0 -1
  156. package/src/types/page.ts +0 -1
  157. package/src/types/video.ts +1 -1
  158. package/templates/astro/starter-content/src/components/chrome/Footer.astro +5 -3
  159. package/templates/astro/starter-content/src/components/chrome/Header.astro +5 -3
  160. package/templates/astro/starter-content/src/components/elements/Button.astro +5 -2
  161. package/templates/astro/starter-content/src/components/elements/ButtonBlock.astro +5 -3
  162. package/templates/astro/starter-content/src/components/sections/ContainerSection.astro +4 -3
  163. package/templates/astro/starter-content/src/components/sections/FeatureCard.astro +4 -3
  164. package/templates/astro/starter-content/src/components/sections/FeatureGrid.astro +4 -3
  165. package/templates/astro/starter-content/src/components/sections/HomeHero.astro +5 -3
  166. package/templates/astro/starter-content/src/components/sections/PersonalizationChoice.astro +4 -3
  167. package/templates/astro/starter-content/src/components/sections/StatsBar.astro +4 -3
  168. package/templates/astro/starter-content/src/fixtures/atomicBlocks.ts +7 -6
  169. package/templates/astro/starter-content/src/fixtures/composition.ts +3 -2
  170. package/templates/astro/starter-content/src/fixtures/sections.ts +3 -3
  171. package/templates/astro/starter-content/src/stories/CompositionStoryFrame.astro +7 -2
  172. package/templates/astro/template/.aci.yaml.tmpl +0 -1
  173. package/templates/astro/template/package.json.tmpl +5 -5
  174. package/templates/astro/template/src/layouts/SiteLayout.astro +2 -2
  175. package/templates/common/.agents/skills/aci/SKILL.md +58 -1
  176. package/templates/common/.agents/skills/authoring/SKILL.md +203 -43
  177. package/templates/common/.agents/skills/authoring/references/block-registry.md +19 -3
  178. package/templates/common/.agents/skills/authoring/references/block-slots.md +3 -0
  179. package/templates/common/.agents/skills/authoring/references/contracts.md +9 -30
  180. package/templates/common/.agents/skills/authoring/references/repo-structure.md +5 -4
  181. package/templates/common/.agents/skills/authoring/references/sdk-server-functions.md +3 -3
  182. package/templates/common/.agents/skills/dam-delivery/SKILL.md +217 -0
  183. package/templates/common/.agents/skills/dam-delivery/references/permalink-grammar.md +167 -0
  184. package/templates/common/.agents/skills/migration/references/canon-migration.md +18 -67
  185. package/templates/common/.agents/skills/migration/references/selector-map.md +1 -1
  186. package/templates/common/.content/fragments/navbar/_index.json +24 -0
  187. package/templates/common/.content/fragments/site-footer/_index.json +61 -0
  188. package/templates/common/.content/pages/404/_index.json +4 -2
  189. package/templates/common/.content/pages/{home/_index.json → _index.json} +10 -1
  190. package/templates/common/.content/pages/error/_index.json +4 -2
  191. package/templates/common/.content/schemas/site.schema.json +11 -1
  192. package/templates/common/.content/templates/error.json +24 -0
  193. package/templates/common/.content/templates/home.json +28 -0
  194. package/templates/common/.content/templates/site.json +8 -0
  195. package/templates/common/.content/templates/standard.json +24 -0
  196. package/templates/common/.nvmrc +1 -1
  197. package/templates/common/starter-content/.content/.rules-baseline.json +8 -0
  198. package/templates/common/starter-content/.content/config/site.json +1 -1
  199. package/templates/common/starter-content/.content/content-rules/no-public-resource-paths.json +6 -0
  200. package/templates/common/starter-content/.content/dam/README.md +74 -0
  201. package/templates/common/starter-content/.content/dam/folders/seed/{ast_site_home_hero → 000000000000000000000000101}/asset.json +1 -1
  202. package/templates/common/starter-content/.content/dam/folders/seed/{ast_site_about_hero → 000000000000000000000000101}/governance.json +2 -1
  203. package/templates/common/starter-content/.content/dam/folders/seed/{ast_site_about_hero → 000000000000000000000000102}/asset.json +1 -1
  204. package/templates/common/starter-content/.content/dam/folders/seed/{ast_site_home_hero → 000000000000000000000000102}/governance.json +2 -1
  205. package/templates/common/starter-content/.content/fragments/navbar/_index.json +23 -20
  206. package/templates/common/starter-content/.content/fragments/site-footer/_index.json +59 -56
  207. package/templates/common/starter-content/.content/pages/404/_index.json +2 -2
  208. package/templates/common/starter-content/.content/pages/{home/_index.json → _index.json} +23 -3
  209. package/templates/common/starter-content/.content/pages/about/_index.json +5 -2
  210. package/templates/common/starter-content/.content/pages/error/_index.json +2 -2
  211. package/templates/common/starter-content/.content/patterns/components/button.json +55 -0
  212. package/templates/common/starter-content/.content/patterns/components/container.json +67 -0
  213. package/templates/common/starter-content/.content/patterns/components/feature_card.json +30 -0
  214. package/templates/common/starter-content/.content/patterns/components/feature_grid.json +59 -0
  215. package/templates/common/starter-content/.content/patterns/components/home_hero.json +151 -0
  216. package/templates/common/starter-content/.content/patterns/components/personalization_choice.json +42 -0
  217. package/templates/common/starter-content/.content/patterns/components/site-footer.json +203 -0
  218. package/templates/common/starter-content/.content/patterns/components/site-navigation.json +115 -0
  219. package/templates/common/starter-content/.content/patterns/components/stats_bar.json +45 -0
  220. package/templates/common/starter-content/.content/schemas/site.schema.json +11 -1
  221. package/templates/nextjs/starter-content/src/components/chrome/Footer.tsx +4 -3
  222. package/templates/nextjs/starter-content/src/components/chrome/Header.tsx +4 -3
  223. package/templates/nextjs/starter-content/src/components/elements/Button.tsx +4 -3
  224. package/templates/nextjs/starter-content/src/components/elements/ButtonBlock.tsx +4 -3
  225. package/templates/nextjs/starter-content/src/components/sections/ContainerSection.tsx +4 -2
  226. package/templates/nextjs/starter-content/src/components/sections/FeatureCard.tsx +4 -3
  227. package/templates/nextjs/starter-content/src/components/sections/FeatureGrid.tsx +4 -2
  228. package/templates/nextjs/starter-content/src/components/sections/HomeHero.tsx +4 -3
  229. package/templates/nextjs/starter-content/src/components/sections/PersonalizationChoice.tsx +4 -2
  230. package/templates/nextjs/starter-content/src/components/sections/StatsBar.tsx +4 -3
  231. package/templates/nextjs/template/.aci.yaml +9 -0
  232. package/templates/nextjs/template/.aci.yaml.tmpl +0 -1
  233. package/templates/nextjs/template/package.json.tmpl +4 -3
  234. package/templates/nextjs/template/src/app/_components/c15t-bridge.ts +30 -0
  235. package/templates/nextjs/template/src/app/_components/c15t-consent-ui.tsx +37 -0
  236. package/templates/nextjs/template/src/app/_components/consent-manager.css +63 -0
  237. package/templates/nextjs/template/src/app/_components/consent-manager.tsx +76 -0
  238. package/templates/nextjs/template/src/app/fonts/inter/OFL.txt +93 -0
  239. package/templates/nextjs/template/src/app/fonts/inter/inter-latin.woff2 +0 -0
  240. package/templates/nextjs/template/src/app/fonts/space-grotesk/OFL.txt +93 -0
  241. package/templates/nextjs/template/src/app/fonts/space-grotesk/space-grotesk-latin.woff2 +0 -0
  242. package/templates/nextjs/template/src/app/layout.tsx +12 -7
  243. package/templates/nextjs/template/tests/conformance.test.ts.tmpl +1 -0
  244. package/dist/define-layout.d.ts +0 -6
  245. package/dist/define-layout.js +0 -14
  246. package/dist/edge/personalization-core.d.ts +0 -11
  247. package/dist/edge/personalization-core.js +0 -269
  248. package/dist/next/collect-route.d.ts +0 -19
  249. package/dist/next/collect-route.js +0 -459
  250. package/dist/next/envelope-digest.d.ts +0 -21
  251. package/dist/next/envelope-digest.js +0 -58
  252. package/dist/next/middleware.d.ts +0 -40
  253. package/dist/next/middleware.js +0 -475
  254. package/dist/next/personalization-host.d.ts +0 -134
  255. package/dist/next/personalization-host.js +0 -270
  256. package/dist/next/root-layout.d.ts +0 -4
  257. package/dist/next/root-layout.js +0 -5
  258. package/dist/next/vercel-collect-sdk-route.d.ts +0 -27
  259. package/dist/next/vercel-collect-sdk-route.js +0 -181
  260. package/dist/next/vercel-personalization.d.ts +0 -4
  261. package/dist/next/vercel-personalization.js +0 -4
  262. package/dist/next/vercel-s3-personalization.d.ts +0 -79
  263. package/dist/next/vercel-s3-personalization.js +0 -570
  264. package/dist/types/layout.d.ts +0 -24
  265. package/src/types/layout.ts +0 -29
  266. package/templates/astro/starter-content/src/render/RenderPage.astro +0 -67
  267. package/templates/astro/template/src/cms/contracts/layouts/index.ts +0 -18
  268. package/templates/nextjs/starter-content/src/components/elements/AtomicBlock.tsx +0 -13
  269. package/templates/nextjs/template/src/cms/contracts/layouts/index.ts +0 -16
  270. /package/dist/{types/layout.js → cli/mintlify-render.d.mts} +0 -0
  271. /package/templates/common/.content/overlays/audience/preference-blue/pages/{home/_index.json → _index.json} +0 -0
  272. /package/templates/common/.content/overlays/audience/preference-red/pages/{home/_index.json → _index.json} +0 -0
  273. /package/templates/common/starter-content/.content/dam/folders/seed/{ast_site_home_hero → 000000000000000000000000101}/editorial.json +0 -0
  274. /package/templates/common/starter-content/.content/dam/folders/seed/{ast_site_home_hero → 000000000000000000000000101}/versions/v0001.json +0 -0
  275. /package/templates/common/starter-content/.content/dam/folders/seed/{ast_site_about_hero → 000000000000000000000000102}/editorial.json +0 -0
  276. /package/templates/common/starter-content/.content/dam/folders/seed/{ast_site_about_hero → 000000000000000000000000102}/versions/v0001.json +0 -0
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  import Button from '../elements/Button.astro';
3
+ import type { RootIdentityProps } from '@gradial/aci';
3
4
  import Container from '../elements/Container.astro';
4
5
  import Icon from '../elements/Icon.astro';
5
6
  import Logo from '../elements/Logo.astro';
@@ -14,7 +15,7 @@ interface UtilityItem extends NavItem {
14
15
  variant?: 'primary' | 'secondary' | 'outline' | 'ghost';
15
16
  }
16
17
 
17
- interface Props {
18
+ interface Props extends RootIdentityProps {
18
19
  brandHref: string;
19
20
  brandLabel?: string;
20
21
  brandLogo?: { src: string; alt?: string } | null;
@@ -27,11 +28,12 @@ const {
27
28
  brandLabel = 'Gradial',
28
29
  brandLogo = null,
29
30
  navigation = [],
30
- utilities = []
31
+ utilities = [],
32
+ ...root
31
33
  } = Astro.props;
32
34
  ---
33
35
 
34
- <header class="bm-header sticky top-0 z-[var(--z-header)] [font-family:var(--font-family-base)] text-fg">
36
+ <header {...root} class="bm-header sticky top-0 z-[var(--z-header)] [font-family:var(--font-family-base)] text-fg">
35
37
  <a
36
38
  href="#content-main"
37
39
  class="sr-only focus:not-sr-only focus:absolute focus:left-4 focus:top-4 focus:z-10 focus:rounded-button focus:bg-white focus:px-4 focus:py-2 focus:text-black"
@@ -1,5 +1,7 @@
1
1
  ---
2
- interface Props {
2
+ import type { RootIdentityProps } from '@gradial/aci';
3
+
4
+ interface Props extends RootIdentityProps {
3
5
  href: string;
4
6
  variant?: 'primary' | 'secondary' | 'tertiary' | 'outline' | 'ghost';
5
7
  className?: string;
@@ -7,7 +9,7 @@ interface Props {
7
9
  rel?: string;
8
10
  }
9
11
 
10
- const { href, variant = 'primary', className = '', target, rel } = Astro.props;
12
+ const { href, variant = 'primary', className = '', target, rel, ...root } = Astro.props;
11
13
 
12
14
  const variantTokens = {
13
15
  primary: {
@@ -41,6 +43,7 @@ const tokenStyle = `background-color: ${variantTokens.background}; border-color:
41
43
  ---
42
44
 
43
45
  <a
46
+ {...root}
44
47
  class={`inline-flex min-h-10 items-center justify-center rounded-button border px-[var(--spacing-button-x)] py-[var(--spacing-button-y)] [font-family:var(--font-family-base)] text-[length:var(--text-button)] font-[var(--font-weight-semibold)] leading-button transition duration-200 hover:opacity-85 ${className}`}
45
48
  href={href}
46
49
  target={target}
@@ -1,9 +1,10 @@
1
1
  ---
2
2
  import Button from '../elements/Button.astro';
3
3
  import Icon from '../elements/Icon.astro';
4
+ import type { RootIdentityProps } from '@gradial/aci';
4
5
  import type { ContentProps } from '../../cms/contracts/components/button.contract';
5
6
 
6
- type Props = ContentProps;
7
+ type Props = ContentProps & RootIdentityProps;
7
8
 
8
9
  const {
9
10
  label,
@@ -12,13 +13,14 @@ const {
12
13
  newWindow = false,
13
14
  icon = '',
14
15
  iconPosition = 'before',
15
- className = ''
16
+ className = '',
17
+ ...root
16
18
  } = Astro.props;
17
19
  const target = newWindow ? '_blank' : undefined;
18
20
  const rel = newWindow ? 'noreferrer' : undefined;
19
21
  ---
20
22
 
21
- <Button {href} {variant} {target} {rel} {className}>
23
+ <Button {href} {variant} {target} {rel} {className} {...root}>
22
24
  {icon && iconPosition === 'before' ? <Icon name={icon} className="mr-2 size-4" /> : null}
23
25
  <span>{label}</span>
24
26
  {icon && iconPosition === 'after' ? <Icon name={icon} className="ml-2 size-4" /> : null}
@@ -1,15 +1,16 @@
1
1
  ---
2
2
  import Container from '../elements/Container.astro';
3
+ import type { RootIdentityProps } from '@gradial/aci';
3
4
  import type { RenderChildren, RenderableBlock } from '@gradial/aci/astro';
4
5
 
5
- interface Props {
6
+ interface Props extends RootIdentityProps {
6
7
  theme?: 'auto' | 'light' | 'dark';
7
8
  className?: string;
8
9
  content?: any[];
9
10
  renderChildren?: RenderChildren;
10
11
  }
11
12
 
12
- const { theme = 'auto', className = '', content, renderChildren } = Astro.props;
13
+ const { theme = 'auto', className = '', content, renderChildren, ...root } = Astro.props;
13
14
  const children: RenderableBlock[] = content && renderChildren ? renderChildren(content) : [];
14
15
  const buttonCount = content?.filter((b: any) => b.component === 'button').length ?? 0;
15
16
  const layout = buttonCount === 1
@@ -17,7 +18,7 @@ const layout = buttonCount === 1
17
18
  : 'flex-col items-center sm:flex-row sm:justify-center sm:gap-4';
18
19
  ---
19
20
 
20
- <section class={`theme-${theme} relative overflow-hidden py-[var(--spacing-section-y)] ${className}`}>
21
+ <section {...root} class={`theme-${theme} relative overflow-hidden py-[var(--spacing-section-y)] ${className}`}>
21
22
  {theme === 'dark' ? (
22
23
  <div class="pointer-events-none absolute inset-0 bg-[image:var(--gradient-hero-base)] opacity-30"></div>
23
24
  ) : null}
@@ -1,16 +1,17 @@
1
1
  ---
2
2
  import Icon from '../elements/Icon.astro';
3
+ import type { RootIdentityProps } from '@gradial/aci';
3
4
 
4
- interface Props {
5
+ interface Props extends RootIdentityProps {
5
6
  icon?: string;
6
7
  title: string;
7
8
  description?: string;
8
9
  }
9
10
 
10
- const { icon = '', title = '', description = '' } = Astro.props;
11
+ const { icon = '', title = '', description = '', ...root } = Astro.props;
11
12
  ---
12
13
 
13
- <div class="rounded-card border border-[var(--color-edge-space)] bg-[var(--color-space-surface)] p-[var(--spacing-card)] transition-all duration-[var(--transition-duration-fast)] hover:border-[var(--color-edge-space-strong)] hover:bg-[var(--color-space-raised)] hover:shadow-[var(--shadow-card-default)]">
14
+ <div {...root} class="rounded-card border border-[var(--color-edge-space)] bg-[var(--color-space-surface)] p-[var(--spacing-card)] transition-all duration-[var(--transition-duration-fast)] hover:border-[var(--color-edge-space-strong)] hover:bg-[var(--color-space-raised)] hover:shadow-[var(--shadow-card-default)]">
14
15
  {icon ? (
15
16
  <div class="mb-6 flex h-12 w-12 items-center justify-center rounded-button bg-[color-mix(in_srgb,var(--color-brand-blue)_12%,transparent)] text-[var(--color-brand-blue-light)]">
16
17
  <Icon name={icon} className="h-6 w-6" />
@@ -1,21 +1,22 @@
1
1
  ---
2
2
  import Container from '../elements/Container.astro';
3
+ import type { RootIdentityProps } from '@gradial/aci';
3
4
  import type { RenderChildren, RenderableBlock } from '@gradial/aci/astro';
4
5
 
5
- interface Props {
6
+ interface Props extends RootIdentityProps {
6
7
  title?: string;
7
8
  subtitle?: string;
8
9
  features?: any[];
9
10
  renderChildren?: RenderChildren;
10
11
  }
11
12
 
12
- const { title = '', subtitle = '', features, renderChildren } = Astro.props;
13
+ const { title = '', subtitle = '', features, renderChildren, ...root } = Astro.props;
13
14
  const children: RenderableBlock[] = features && renderChildren ? renderChildren(features) : [];
14
15
  const count = features?.length ?? 0;
15
16
  const cols = count <= 2 ? 'sm:grid-cols-2' : 'sm:grid-cols-2 lg:grid-cols-3';
16
17
  ---
17
18
 
18
- <section class="theme-dark py-[var(--spacing-section-y)] bg-[var(--color-space-deep)]">
19
+ <section {...root} class="theme-dark py-[var(--spacing-section-y)] bg-[var(--color-space-deep)]">
19
20
  <Container>
20
21
  <div class="mb-12 max-w-[var(--max-width-container-narrow)]">
21
22
  {title ? (
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  import Button from '../elements/Button.astro';
3
3
  import Container from '../elements/Container.astro';
4
- import { imageAttrs, type Image } from '@gradial/aci';
4
+ import { imageAttrs, type Image, type RootIdentityProps } from '@gradial/aci';
5
5
 
6
- interface Props {
6
+ interface Props extends RootIdentityProps {
7
7
  eyebrow?: string;
8
8
  headline: string;
9
9
  description?: string;
@@ -18,7 +18,8 @@ const {
18
18
  description = '',
19
19
  ctaLabel,
20
20
  ctaHref,
21
- image
21
+ image,
22
+ ...root
22
23
  } = Astro.props;
23
24
 
24
25
  const imgAttrs = image ? imageAttrs(image, {
@@ -29,6 +30,7 @@ const imgAttrs = image ? imageAttrs(image, {
29
30
  ---
30
31
 
31
32
  <section
33
+ {...root}
32
34
  class="theme-dark relative min-h-[var(--height-hero-min)] overflow-hidden bg-black text-fg"
33
35
  aria-label={image?.alt || headline}
34
36
  >
@@ -1,12 +1,13 @@
1
1
  ---
2
+ import type { RootIdentityProps } from '@gradial/aci';
2
3
  import type { ContentProps } from '../../cms/contracts/components/personalizationChoice.contract';
3
4
 
4
- type Props = ContentProps;
5
+ type Props = ContentProps & RootIdentityProps;
5
6
 
6
- const { title, description, redLabel, blueLabel, refreshLabel } = Astro.props;
7
+ const { title, description, redLabel, blueLabel, refreshLabel, ...root } = Astro.props;
7
8
  ---
8
9
 
9
- <section class="border-y border-[var(--color-border)] bg-[var(--color-surface)] py-[var(--spacing-section-y)]">
10
+ <section {...root} class="border-y border-[var(--color-border)] bg-[var(--color-surface)] py-[var(--spacing-section-y)]">
10
11
  <div class="mx-auto max-w-[var(--layout-content-max)] px-[var(--layout-gutter)] text-center">
11
12
  <h2 class="text-[length:var(--text-h2)] font-[var(--font-weight-semibold)] text-[var(--color-fg)]">{title}</h2>
12
13
  {description ? <p class="mx-auto mt-3 max-w-2xl text-[var(--color-fg-muted)]">{description}</p> : null}
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  import Container from '../elements/Container.astro';
3
+ import type { RootIdentityProps } from '@gradial/aci';
3
4
 
4
5
  interface Stat {
5
6
  label: string;
@@ -7,14 +8,14 @@ interface Stat {
7
8
  suffix?: string;
8
9
  }
9
10
 
10
- interface Props {
11
+ interface Props extends RootIdentityProps {
11
12
  stats?: Stat[];
12
13
  }
13
14
 
14
- const { stats = [] } = Astro.props;
15
+ const { stats = [], ...root } = Astro.props;
15
16
  ---
16
17
 
17
- <section class="theme-dark border-y border-[var(--color-edge-space)] bg-[var(--color-space-surface)] py-[var(--spacing-section-y)]">
18
+ <section {...root} class="theme-dark border-y border-[var(--color-edge-space)] bg-[var(--color-space-surface)] py-[var(--spacing-section-y)]">
18
19
  <Container>
19
20
  <div class="grid gap-8 sm:grid-cols-2 lg:grid-cols-4">
20
21
  {stats.map((stat) => (
@@ -13,17 +13,18 @@ export const atomicBlockStoryFixtures: AtomicBlockStoryFixture[] = [
13
13
  storybookId: 'core-atomic-blocks-button--variants',
14
14
  title: 'Button / All Variants',
15
15
  block: {
16
+ $type: 'component',
16
17
  id: 'fixture-button-variants',
17
18
  component: 'container',
18
19
  props: {
19
20
  theme: 'auto',
20
21
  blocks: [
21
- { id: 'btn-primary', component: 'button', props: { label: 'Primary button', href: '#', variant: 'primary' } },
22
- { id: 'btn-secondary', component: 'button', props: { label: 'Secondary button', href: '#', variant: 'secondary' } },
23
- { id: 'btn-tertiary', component: 'button', props: { label: 'Tertiary button', href: '#', variant: 'tertiary' } },
24
- { id: 'btn-icon-before', component: 'button', props: { label: 'Icon before', href: '#', variant: 'primary', icon: 'arrow-right', iconPosition: 'before' } },
25
- { id: 'btn-icon-after', component: 'button', props: { label: 'Icon after', href: '#', variant: 'secondary', icon: 'arrow-right', iconPosition: 'after' } },
26
- { id: 'btn-new-window', component: 'button', props: { label: 'Opens in new tab', href: 'https://example.com', variant: 'primary', newWindow: true, icon: 'arrow-right', iconPosition: 'after' } }
22
+ { $type: 'component', id: 'btn-primary', component: 'button', props: { label: 'Primary button', href: '#', variant: 'primary' } },
23
+ { $type: 'component', id: 'btn-secondary', component: 'button', props: { label: 'Secondary button', href: '#', variant: 'secondary' } },
24
+ { $type: 'component', id: 'btn-tertiary', component: 'button', props: { label: 'Tertiary button', href: '#', variant: 'tertiary' } },
25
+ { $type: 'component', id: 'btn-icon-before', component: 'button', props: { label: 'Icon before', href: '#', variant: 'primary', icon: 'arrow-right', iconPosition: 'before' } },
26
+ { $type: 'component', id: 'btn-icon-after', component: 'button', props: { label: 'Icon after', href: '#', variant: 'secondary', icon: 'arrow-right', iconPosition: 'after' } },
27
+ { $type: 'component', id: 'btn-new-window', component: 'button', props: { label: 'Opens in new tab', href: 'https://example.com', variant: 'primary', newWindow: true, icon: 'arrow-right', iconPosition: 'after' } }
27
28
  ]
28
29
  }
29
30
  }
@@ -14,14 +14,15 @@ export const compositionStoryFixtures: CompositionStoryFixture[] = [
14
14
  storybookId: 'composition-container--buttons',
15
15
  title: 'Container / Buttons',
16
16
  block: {
17
+ $type: 'component',
17
18
  id: 'fixture-container-buttons',
18
19
  component: 'container',
19
20
  props: {
20
21
  theme: 'auto',
21
22
  className: 'space-y-4',
22
23
  blocks: [
23
- { id: 'btn-1', component: 'button', props: { label: 'Primary action', href: '#', variant: 'primary', icon: 'arrow_forward', iconPosition: 'after' } },
24
- { id: 'btn-2', component: 'button', props: { label: 'Secondary action', href: '#', variant: 'secondary' } }
24
+ { $type: 'component', id: 'btn-1', component: 'button', props: { label: 'Primary action', href: '#', variant: 'primary', icon: 'arrow_forward', iconPosition: 'after' } },
25
+ { $type: 'component', id: 'btn-2', component: 'button', props: { label: 'Secondary action', href: '#', variant: 'secondary' } }
25
26
  ]
26
27
  }
27
28
  }
@@ -14,6 +14,7 @@ export const sectionStoryFixtures: SectionStoryFixture[] = [
14
14
  storybookId: 'sections-home-hero--default',
15
15
  title: 'Home Hero',
16
16
  block: {
17
+ $type: 'component',
17
18
  id: 'fixture-home-hero',
18
19
  component: 'home_hero',
19
20
  props: {
@@ -22,10 +23,9 @@ export const sectionStoryFixtures: SectionStoryFixture[] = [
22
23
  description: 'One content model, three renderers. Build once in Next.js, Astro, and SvelteKit—then prove parity with shared fixtures.',
23
24
  ctaLabel: 'Get started',
24
25
  ctaHref: '/docs',
25
- image: {
26
+ image: {
26
27
  $type: 'gradial.image',
27
- assetId: 'fixture_seattle',
28
- versionId: 'v0001',
28
+ assetId: '3Ih26etWBTYfnAd0EjD0pP2h902',
29
29
  alt: 'Seattle skyline at dusk',
30
30
  sources: [
31
31
  { src: '/assets/seattle.avif', width: 1920, height: 1280, sizes: '100vw', type: 'image/avif' }
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  import type { KernelPageBlock } from '@gradial/aci/content';
3
- import ContainerSection from '../components/sections/ContainerSection.astro';
3
+ import { createRenderChildren } from '@gradial/aci/astro';
4
+ import { registry } from '../cms/registry';
4
5
 
5
6
  interface Props {
6
7
  block: KernelPageBlock;
@@ -8,8 +9,12 @@ interface Props {
8
9
  }
9
10
 
10
11
  const { block, direction = 'ltr' } = Astro.props;
12
+ // Stories render through the same seam as pages so the frame carries the
13
+ // block's root identity (sdk I-19, ADR 0051).
14
+ const [child] = createRenderChildren(registry)([block]);
15
+ const Comp = child.Component as any;
11
16
  ---
12
17
 
13
18
  <div dir={direction}>
14
- {block.component === 'container' ? <ContainerSection {...block.props} /> : null}
19
+ {Comp ? <Comp {...child.props} /> : null}
15
20
  </div>
@@ -9,7 +9,6 @@ source:
9
9
  publicDir: "public"
10
10
 
11
11
  componentRegistry: ./src/cms/contracts/components/index.ts
12
- layoutRegistry: ./src/cms/contracts/layouts/index.ts
13
12
 
14
13
  routes:
15
14
  cmsManaged: "/[...slug]"
@@ -14,7 +14,7 @@
14
14
  "build:storybook": "storybook build"
15
15
  },
16
16
  "engines": {
17
- "node": ">=22",
17
+ "node": ">=24",
18
18
  "npm": ">=10"
19
19
  },
20
20
  "dependencies": {
@@ -31,9 +31,9 @@
31
31
  "tsx": "^4.20.0",
32
32
  "typescript": "5.9.3",
33
33
  "vite": "^7.2.7",
34
- "storybook": "^10.0.0",
35
- "@storybook-astro/framework": "^1.6.0",
36
- "@storybook/addon-docs": "^10.0.0",
37
- "@storybook/builder-vite": "^10.0.0"
34
+ "storybook": "10.5.10",
35
+ "@storybook-astro/framework": "1.11.0",
36
+ "@storybook/addon-docs": "10.5.10",
37
+ "@storybook/builder-vite": "10.5.10"
38
38
  }
39
39
  }
@@ -48,8 +48,8 @@ const { title, description, canonical, siteName = 'Gradial', collectTag, assignm
48
48
  // island (@astrojs/react + @c15t/react) or any setup built on
49
49
  // c15t's createConsentManagerStore; this bridge picks it up either
50
50
  // way. Without a c15t setup the poll gives up silently and only the
51
- // JS consent API (aci('consent', …) under the manual preset) writes
52
- // envelopes.
51
+ // JS consent API (aci('consent', …)) writes envelopes — it is live
52
+ // under every preset, including c15t.
53
53
  //
54
54
  // Consents are mirrored only after a real visitor decision
55
55
  // (consentInfo set), never for pre-decision defaults, so the SDK
@@ -152,6 +152,56 @@ Optional (disabled by default):
152
152
 
153
153
  ## Troubleshooting
154
154
 
155
+ ### Deploying a starter to a hosted Vercel tenant
156
+
157
+ Run the CLI from the starter repository root (where `.aci.yaml` lives), or
158
+ pass `--site-dir .` from that directory. Do not pass an absolute site path
159
+ from another working directory: older CLI versions can serialize it as a
160
+ `../../../tmp/...` source folder, which makes the server-side build fail with
161
+ a generic HTTP 500. The source ref must also be a pushed, cloneable branch;
162
+ `ref: HEAD` from a detached worktree is not cloneable by the build service.
163
+
164
+ The hosted publish sequence is:
165
+
166
+ 1. `GRADIAL_CODE_SOURCE_TOKEN="$(gh auth token)" aci code-build --site-dir . --branch <test-branch> ...`
167
+ 2. `aci branch land <test-branch>` to move the artifact link to `main`.
168
+ 3. Promote `/config/site.json` and the content paths needed by the release.
169
+ 4. Run `aci release publish --activate ...`.
170
+
171
+ Match the tenant rendering mode to the starter's actual route capability. A
172
+ Next starter with `dynamicParams = false` and no release-scoped runtime route
173
+ is an SSG starter and must use `rendering.mode = "ssg"`; `ssr` is only valid
174
+ when the frontend can resolve arbitrary host release routes at request time.
175
+ A mismatch can build successfully but then fail SSG rendering or return a
176
+ live Next 404 after the host rewrites a CMS page.
177
+
178
+ Injected platform functions must be dependency-closed inside their own
179
+ `.vercel/output/functions/<name>.func` mount. A prebuilt Vercel deploy does not
180
+ install a function-local `package.json` after upload. Native dependencies such
181
+ as `sharp` therefore belong to the host-function artifact, built for Vercel's
182
+ Linux/x64 runtime and injected beside the handler; never add them to the
183
+ starter's `package.json` merely to make a platform function resolve.
184
+
185
+ Publish validates `refs/heads/live`, not only `main`. If `main` deletes a
186
+ stale incompatible page or fragment that was previously promoted, promote
187
+ that same path from `main` with `aci promote --path ... --yes`; because the
188
+ source path is absent, the promote records a delete on `live`. This is the
189
+ API-safe way to remove old live content—direct writes to `live` are forbidden.
190
+
191
+ The same rule applies to breaking DAM identifier changes: every
192
+ `dam.assetRef` in `live` is resolved during publish, so one legacy identifier
193
+ blocks the release. Update the reference on a candidate branch through
194
+ `aci content push`, land it, and promote that exact content path before
195
+ publishing again. Do not weaken identifier validation or reactivate an old
196
+ release to bypass the content migration.
197
+
198
+ Legacy assets themselves are replaced through the product API, not rewritten
199
+ in storage: download or retain the needed source bytes, upload them again so
200
+ DAM creates fresh canonical IDs, approve them, replace every content reference,
201
+ then land, promote, and publish the affected paths. This is the supported
202
+ breaking cutover for pre-public tenants; there is no `ast_` alias or bulk
203
+ object-store migration path.
204
+
155
205
  ### "Unknown component" error during content compile
156
206
 
157
207
  The content JSON references a `component` name that is not in the contract
@@ -194,10 +244,10 @@ If a value doesn't survive the round-trip, check:
194
244
  |------|---------|
195
245
  | `.aci.yaml` | ACI config: contract paths, framework, routes, capabilities |
196
246
  | `src/cms/contracts/components/index.ts` | Component contract barrel |
197
- | `src/cms/contracts/layouts/index.ts` | Layout contract barrel |
198
247
  | `src/cms/registry.ts` | Component registry (`createRegistry` with `[contract, component]` tuples) |
199
248
  | `src/components/` | Runtime component implementations |
200
249
  | `src/design-system/` | Design tokens and global styles |
250
+ | `.content/templates/` | Page composition contracts |
201
251
  | `.content/` | Local content for development |
202
252
 
203
253
  ## Deep Dive: Authoring
@@ -209,3 +259,10 @@ development, design tokens, and the full contract/runtime split.
209
259
 
210
260
  Read `.agents/skills/migration/SKILL.md` for reverse-engineering a live
211
261
  site or design into ACI.
262
+
263
+ ## Deep Dive: DAM Delivery
264
+
265
+ Read `.agents/skills/dam-delivery/SKILL.md` for public DAM asset links
266
+ (`/dam/{assetId}`): how to shape an image with the `w`, `h`, `fit`, `fm`,
267
+ `q` query, what makes a link serve or stop serving, and when to use a
268
+ link instead of a pre-baked derivative.