@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
@@ -0,0 +1,203 @@
1
+ {
2
+ "$type": "componentPattern",
3
+ "buildId": "codebuild_01a12331-b86d-7d20-8a35-a7a71d96e8be",
4
+ "codeDigest": "sha256:f1246860864e55359c7ad442a7a956b61a835a4826cd6229cc9971db1fe29a67",
5
+ "name": "site-footer",
6
+ "schema": {
7
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
8
+ "title": "site-footer",
9
+ "type": "object",
10
+ "properties": {
11
+ "brandHref": {
12
+ "type": "string",
13
+ "minLength": 1
14
+ },
15
+ "brandLabel": {
16
+ "type": "string",
17
+ "minLength": 1
18
+ },
19
+ "brandLogo": {
20
+ "anyOf": [
21
+ {
22
+ "type": "object",
23
+ "properties": {
24
+ "src": {
25
+ "type": "string"
26
+ },
27
+ "alt": {
28
+ "type": "string"
29
+ }
30
+ },
31
+ "required": [
32
+ "src",
33
+ "alt"
34
+ ],
35
+ "additionalProperties": false
36
+ },
37
+ {
38
+ "type": "null"
39
+ }
40
+ ]
41
+ },
42
+ "columns": {
43
+ "type": "array",
44
+ "items": {
45
+ "type": "object",
46
+ "properties": {
47
+ "id": {
48
+ "type": "string",
49
+ "minLength": 1
50
+ },
51
+ "title": {
52
+ "type": "string"
53
+ },
54
+ "links": {
55
+ "type": "array",
56
+ "items": {
57
+ "type": "object",
58
+ "properties": {
59
+ "id": {
60
+ "type": "string",
61
+ "minLength": 1
62
+ },
63
+ "label": {
64
+ "type": "string",
65
+ "minLength": 1
66
+ },
67
+ "href": {
68
+ "type": "string",
69
+ "minLength": 1
70
+ }
71
+ },
72
+ "required": [
73
+ "id",
74
+ "label",
75
+ "href"
76
+ ],
77
+ "additionalProperties": false
78
+ }
79
+ },
80
+ "groups": {
81
+ "type": "array",
82
+ "items": {
83
+ "type": "object",
84
+ "properties": {
85
+ "id": {
86
+ "type": "string",
87
+ "minLength": 1
88
+ },
89
+ "title": {
90
+ "type": "string"
91
+ },
92
+ "links": {
93
+ "type": "array",
94
+ "items": {
95
+ "type": "object",
96
+ "properties": {
97
+ "id": {
98
+ "type": "string",
99
+ "minLength": 1
100
+ },
101
+ "label": {
102
+ "type": "string",
103
+ "minLength": 1
104
+ },
105
+ "href": {
106
+ "type": "string",
107
+ "minLength": 1
108
+ }
109
+ },
110
+ "required": [
111
+ "id",
112
+ "label",
113
+ "href"
114
+ ],
115
+ "additionalProperties": false
116
+ }
117
+ }
118
+ },
119
+ "required": [
120
+ "id",
121
+ "title",
122
+ "links"
123
+ ],
124
+ "additionalProperties": false
125
+ }
126
+ }
127
+ },
128
+ "required": [
129
+ "id"
130
+ ],
131
+ "additionalProperties": false
132
+ }
133
+ },
134
+ "social": {
135
+ "type": "array",
136
+ "items": {
137
+ "type": "object",
138
+ "properties": {
139
+ "id": {
140
+ "type": "string",
141
+ "minLength": 1
142
+ },
143
+ "label": {
144
+ "type": "string",
145
+ "minLength": 1
146
+ },
147
+ "href": {
148
+ "type": "string",
149
+ "minLength": 1
150
+ },
151
+ "icon": {
152
+ "type": "string"
153
+ }
154
+ },
155
+ "required": [
156
+ "id",
157
+ "label",
158
+ "href"
159
+ ],
160
+ "additionalProperties": false
161
+ }
162
+ },
163
+ "legalLinks": {
164
+ "type": "array",
165
+ "items": {
166
+ "type": "object",
167
+ "properties": {
168
+ "id": {
169
+ "type": "string",
170
+ "minLength": 1
171
+ },
172
+ "label": {
173
+ "type": "string",
174
+ "minLength": 1
175
+ },
176
+ "href": {
177
+ "type": "string",
178
+ "minLength": 1
179
+ }
180
+ },
181
+ "required": [
182
+ "id",
183
+ "label",
184
+ "href"
185
+ ],
186
+ "additionalProperties": false
187
+ }
188
+ },
189
+ "copyright": {
190
+ "type": "string"
191
+ }
192
+ },
193
+ "required": [
194
+ "brandHref",
195
+ "brandLabel",
196
+ "columns"
197
+ ],
198
+ "additionalProperties": false
199
+ },
200
+ "imageSlots": {},
201
+ "notes": "",
202
+ "skills": []
203
+ }
@@ -0,0 +1,115 @@
1
+ {
2
+ "$type": "componentPattern",
3
+ "buildId": "codebuild_01a12331-b86d-7d20-8a35-a7a71d96e8be",
4
+ "codeDigest": "sha256:f1246860864e55359c7ad442a7a956b61a835a4826cd6229cc9971db1fe29a67",
5
+ "name": "site-navigation",
6
+ "schema": {
7
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
8
+ "title": "site-navigation",
9
+ "type": "object",
10
+ "properties": {
11
+ "brandHref": {
12
+ "type": "string",
13
+ "minLength": 1
14
+ },
15
+ "brandLabel": {
16
+ "type": "string",
17
+ "minLength": 1
18
+ },
19
+ "brandLogo": {
20
+ "anyOf": [
21
+ {
22
+ "type": "object",
23
+ "properties": {
24
+ "src": {
25
+ "type": "string"
26
+ },
27
+ "alt": {
28
+ "type": "string"
29
+ }
30
+ },
31
+ "required": [
32
+ "src",
33
+ "alt"
34
+ ],
35
+ "additionalProperties": false
36
+ },
37
+ {
38
+ "type": "null"
39
+ }
40
+ ]
41
+ },
42
+ "navigation": {
43
+ "type": "array",
44
+ "items": {
45
+ "type": "object",
46
+ "properties": {
47
+ "id": {
48
+ "type": "string",
49
+ "minLength": 1
50
+ },
51
+ "label": {
52
+ "type": "string",
53
+ "minLength": 1
54
+ },
55
+ "href": {
56
+ "type": "string",
57
+ "minLength": 1
58
+ }
59
+ },
60
+ "required": [
61
+ "id",
62
+ "label",
63
+ "href"
64
+ ],
65
+ "additionalProperties": false
66
+ }
67
+ },
68
+ "utilities": {
69
+ "type": "array",
70
+ "items": {
71
+ "type": "object",
72
+ "properties": {
73
+ "id": {
74
+ "type": "string",
75
+ "minLength": 1
76
+ },
77
+ "label": {
78
+ "type": "string",
79
+ "minLength": 1
80
+ },
81
+ "href": {
82
+ "type": "string",
83
+ "minLength": 1
84
+ },
85
+ "variant": {
86
+ "type": "string",
87
+ "enum": [
88
+ "primary",
89
+ "secondary",
90
+ "tertiary",
91
+ "outline",
92
+ "ghost"
93
+ ]
94
+ }
95
+ },
96
+ "required": [
97
+ "id",
98
+ "label",
99
+ "href"
100
+ ],
101
+ "additionalProperties": false
102
+ }
103
+ }
104
+ },
105
+ "required": [
106
+ "brandHref",
107
+ "brandLabel",
108
+ "navigation"
109
+ ],
110
+ "additionalProperties": false
111
+ },
112
+ "imageSlots": {},
113
+ "notes": "",
114
+ "skills": []
115
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "$type": "componentPattern",
3
+ "buildId": "codebuild_01a12331-b86d-7d20-8a35-a7a71d96e8be",
4
+ "codeDigest": "sha256:f1246860864e55359c7ad442a7a956b61a835a4826cd6229cc9971db1fe29a67",
5
+ "name": "stats_bar",
6
+ "schema": {
7
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
8
+ "title": "stats_bar",
9
+ "type": "object",
10
+ "properties": {
11
+ "stats": {
12
+ "minItems": 1,
13
+ "type": "array",
14
+ "items": {
15
+ "type": "object",
16
+ "properties": {
17
+ "label": {
18
+ "type": "string",
19
+ "minLength": 1
20
+ },
21
+ "value": {
22
+ "type": "string",
23
+ "minLength": 1
24
+ },
25
+ "suffix": {
26
+ "type": "string"
27
+ }
28
+ },
29
+ "required": [
30
+ "label",
31
+ "value"
32
+ ],
33
+ "additionalProperties": false
34
+ }
35
+ }
36
+ },
37
+ "required": [
38
+ "stats"
39
+ ],
40
+ "additionalProperties": false
41
+ },
42
+ "imageSlots": {},
43
+ "notes": "",
44
+ "skills": []
45
+ }
@@ -27,7 +27,17 @@
27
27
  },
28
28
  "overlayResolution": {
29
29
  "type": "array",
30
- "items": { "enum": ["locale", "audience"] }
30
+ "items": {
31
+ "type": "string",
32
+ "minLength": 1,
33
+ "pattern": "^[^;=/\u0009-\u000d\u0020\u0085\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000]+$",
34
+ "not": {
35
+ "anyOf": [
36
+ { "enum": [".", "..", "experiment", "experimentArm"] },
37
+ { "pattern": "^experiment\\." }
38
+ ]
39
+ }
40
+ }
31
41
  },
32
42
  "brandHref": { "type": "string" },
33
43
  "brandLogo": {
@@ -1,8 +1,9 @@
1
1
  import { Container } from '@/components/elements/Container';
2
+ import type { RootIdentityProps } from '@gradial/aci';
2
3
  import { Logo } from '@/components/elements/Logo';
3
4
  import type { FooterColumn, FooterGroup, FooterLink } from '@gradial/aci/content';
4
5
 
5
- interface FooterProps {
6
+ interface FooterProps extends RootIdentityProps {
6
7
  brandHref: string;
7
8
  brandLabel: string;
8
9
  brandLogo?: { src: string; alt?: string } | null;
@@ -17,9 +18,9 @@ function columnGroups(column: FooterColumn): FooterGroup[] {
17
18
  return [{ id: column.id, title: column.title || '', links: column.links || [] }];
18
19
  }
19
20
 
20
- export function Footer({ brandHref, brandLabel, brandLogo = null, columns = [], social = [], legalLinks = [], copyright = '' }: FooterProps) {
21
+ export function Footer({ brandHref, brandLabel, brandLogo = null, columns = [], social = [], legalLinks = [], copyright = '', ...root }: FooterProps) {
21
22
  return (
22
- <footer className="bm-footer relative pt-[var(--spacing-footer-y)]" id="footer">
23
+ <footer {...root} className="bm-footer relative pt-[var(--spacing-footer-y)]" id="footer">
23
24
  <div className="absolute inset-x-0 top-0 h-px bg-gradient-to-r from-transparent via-[var(--color-brand-500)] to-transparent opacity-50" />
24
25
  <Container>
25
26
  <div className="footer-main-grid grid grid-cols-1 gap-12 lg:grid-cols-2">
@@ -2,9 +2,10 @@ import { Button } from '@/components/elements/Button';
2
2
  import { Container } from '@/components/elements/Container';
3
3
  import { Icon } from '@/components/elements/Icon';
4
4
  import { Logo } from '@/components/elements/Logo';
5
+ import type { RootIdentityProps } from '@gradial/aci';
5
6
  import type { NavItem, UtilityItem } from '@gradial/aci/content';
6
7
 
7
- interface HeaderProps {
8
+ interface HeaderProps extends RootIdentityProps {
8
9
  brandHref: string;
9
10
  brandLabel: string;
10
11
  brandLogo?: { src: string; alt?: string } | null;
@@ -12,9 +13,9 @@ interface HeaderProps {
12
13
  utilities?: UtilityItem[];
13
14
  }
14
15
 
15
- export function Header({ brandHref, brandLabel, brandLogo = null, navigation = [], utilities = [] }: HeaderProps) {
16
+ export function Header({ brandHref, brandLabel, brandLogo = null, navigation = [], utilities = [], ...root }: HeaderProps) {
16
17
  return (
17
- <header className="bm-header fixed top-0 left-0 right-0 z-[var(--z-header)] border-b border-[var(--header-border)]">
18
+ <header {...root} className="bm-header fixed top-0 left-0 right-0 z-[var(--z-header)] border-b border-[var(--header-border)]">
18
19
  <a href="#content-main" className="sr-only focus:not-sr-only focus:absolute focus:top-4 focus:left-4 focus:z-[var(--z-overlay)] focus:rounded-button focus:bg-[var(--color-space-900)] focus:px-4 focus:py-2 focus:text-[var(--color-white)]">
19
20
  Skip to main content
20
21
  </a>
@@ -1,9 +1,9 @@
1
- import type { ReactNode } from 'react';
1
+ import type { AnchorHTMLAttributes, ReactNode } from 'react';
2
2
  import type { ButtonVariant } from '@gradial/aci/content';
3
3
 
4
4
  type ButtonSize = 'default' | 'lg';
5
5
 
6
- interface ButtonProps {
6
+ interface ButtonProps extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'href' | 'className' | 'target' | 'rel' | 'children'> {
7
7
  href: string;
8
8
  variant?: ButtonVariant;
9
9
  size?: ButtonSize;
@@ -26,9 +26,10 @@ const sizeClasses: Record<ButtonSize, string> = {
26
26
  lg: 'px-7 py-3.5 min-h-[3.5rem] text-[length:var(--text-size-body-large)]',
27
27
  };
28
28
 
29
- export function Button({ href, variant = 'primary', size = 'default', className = '', target, rel, children }: ButtonProps) {
29
+ export function Button({ href, variant = 'primary', size = 'default', className = '', target, rel, children, ...root }: ButtonProps) {
30
30
  return (
31
31
  <a
32
+ {...root}
32
33
  className={`inline-flex items-center justify-center gap-2 rounded-button leading-button font-[var(--font-weight-semibold)] no-underline transition-all duration-[var(--transition-duration-fast)] ${variantClasses[variant]} ${sizeClasses[size]} ${className}`}
33
34
  href={href}
34
35
  target={target}
@@ -1,15 +1,16 @@
1
1
  import { Button } from '@/components/elements/Button';
2
2
  import { Icon } from '@/components/elements/Icon';
3
+ import type { RootIdentityProps } from '@gradial/aci';
3
4
  import type { ContentProps } from '@/cms/contracts/components/button.contract';
4
5
 
5
- export type ButtonBlockProps = ContentProps;
6
+ export type ButtonBlockProps = ContentProps & RootIdentityProps;
6
7
 
7
- export function ButtonBlock({ label = '', href = '#', variant = 'primary', newWindow = false, icon = '', iconPosition = 'before', className = '' }: ButtonBlockProps) {
8
+ export function ButtonBlock({ label = '', href = '#', variant = 'primary', newWindow = false, icon = '', iconPosition = 'before', className = '', ...root }: ButtonBlockProps) {
8
9
  const target = newWindow ? '_blank' : undefined;
9
10
  const rel = newWindow ? 'noreferrer' : undefined;
10
11
 
11
12
  return (
12
- <Button href={href} variant={variant} target={target} rel={rel} className={className}>
13
+ <Button href={href} variant={variant} target={target} rel={rel} className={className} {...root}>
13
14
  {icon && iconPosition === 'before' ? <Icon name={icon} /> : null}
14
15
  <span>{label}</span>
15
16
  {icon && iconPosition === 'after' ? <Icon name={icon} /> : null}
@@ -1,5 +1,6 @@
1
1
  import { Container } from '@/components/elements/Container';
2
2
  import { type ContentProps } from '@/cms/contracts/components/container.contract';
3
+ import type { RootIdentityProps } from '@gradial/aci';
3
4
  import type { RenderChildren } from '@gradial/aci/react';
4
5
 
5
6
  export async function ContainerSection({
@@ -7,14 +8,15 @@ export async function ContainerSection({
7
8
  className = '',
8
9
  content,
9
10
  renderChildren,
10
- }: ContentProps & { renderChildren: RenderChildren<NonNullable<ContentProps['content']>> }) {
11
+ ...root
12
+ }: ContentProps & RootIdentityProps & { renderChildren: RenderChildren<NonNullable<ContentProps['content']>> }) {
11
13
  const buttonCount = content?.filter((b) => b.component === 'button').length ?? 0;
12
14
  const layout = buttonCount === 1
13
15
  ? 'flex-col items-center'
14
16
  : 'flex-col items-center sm:flex-row sm:justify-center sm:gap-4';
15
17
 
16
18
  return (
17
- <section className={`theme-${theme} relative overflow-hidden py-[var(--spacing-section-y)] ${className}`}>
19
+ <section className={`theme-${theme} relative overflow-hidden py-[var(--spacing-section-y)] ${className}`} {...root}>
18
20
  {theme === 'dark' ? (
19
21
  <div className="pointer-events-none absolute inset-0 bg-[image:var(--gradient-hero-base)] opacity-30" />
20
22
  ) : null}
@@ -1,11 +1,12 @@
1
1
  import { Icon } from '@/components/elements/Icon';
2
+ import type { RootIdentityProps } from '@gradial/aci';
2
3
  import type { ContentProps } from '@/cms/contracts/components/featureCard.contract';
3
4
 
4
- export type FeatureCardProps = ContentProps;
5
+ export type FeatureCardProps = ContentProps & RootIdentityProps;
5
6
 
6
- export function FeatureCard({ icon = '', title = '', description = '' }: FeatureCardProps) {
7
+ export function FeatureCard({ icon = '', title = '', description = '', ...root }: FeatureCardProps) {
7
8
  return (
8
- <div className="group relative overflow-hidden rounded-card border border-[var(--color-border-default)] bg-[var(--color-white)] p-[var(--spacing-card)] shadow-[var(--shadow-card-default)] transition-all duration-[var(--transition-duration-fast)] hover:-translate-y-1 hover:border-[var(--color-border-strong)] hover:shadow-[var(--shadow-elevated)]">
9
+ <div {...root} className="group relative overflow-hidden rounded-card border border-[var(--color-border-default)] bg-[var(--color-white)] p-[var(--spacing-card)] shadow-[var(--shadow-card-default)] transition-all duration-[var(--transition-duration-fast)] hover:-translate-y-1 hover:border-[var(--color-border-strong)] hover:shadow-[var(--shadow-elevated)]">
9
10
  <div className="absolute inset-x-0 top-0 h-px bg-gradient-to-r from-transparent via-[var(--color-brand-500)] to-transparent opacity-0 transition-opacity duration-[var(--transition-duration-fast)] group-hover:opacity-100" />
10
11
  {icon ? (
11
12
  <div className="mb-6 flex h-12 w-12 items-center justify-center rounded-button border border-[var(--color-border-default)] bg-[var(--color-surface-100)] text-[var(--color-brand-600)] shadow-[var(--shadow-glow-sm)] transition-colors group-hover:border-[var(--color-brand-500)] group-hover:text-[var(--color-brand-500)]">
@@ -1,5 +1,6 @@
1
1
  import { Container } from '@/components/elements/Container';
2
2
  import { type ContentProps } from '@/cms/contracts/components/featureGrid.contract';
3
+ import type { RootIdentityProps } from '@gradial/aci';
3
4
  import type { RenderChildren } from '@gradial/aci/react';
4
5
 
5
6
  export async function FeatureGrid({
@@ -7,12 +8,13 @@ export async function FeatureGrid({
7
8
  subtitle = '',
8
9
  features,
9
10
  renderChildren,
10
- }: ContentProps & { renderChildren: RenderChildren<NonNullable<ContentProps['features']>> }) {
11
+ ...root
12
+ }: ContentProps & RootIdentityProps & { renderChildren: RenderChildren<NonNullable<ContentProps['features']>> }) {
11
13
  const count = features?.length ?? 0;
12
14
  const cols = count <= 2 ? 'sm:grid-cols-2' : 'sm:grid-cols-2 lg:grid-cols-3';
13
15
 
14
16
  return (
15
- <section className="theme-light relative overflow-hidden py-[var(--spacing-section-y)] bg-[var(--color-white)]">
17
+ <section className="theme-light relative overflow-hidden py-[var(--spacing-section-y)] bg-[var(--color-white)]" {...root}>
16
18
  <div className="pointer-events-none absolute inset-0 bg-[image:var(--gradient-hero-base)] opacity-50" />
17
19
  <Container className="relative">
18
20
  <div className="mb-14 max-w-[var(--max-width-container-narrow)]">
@@ -1,18 +1,19 @@
1
1
  import { Button } from '@/components/elements/Button';
2
2
  import { Container } from '@/components/elements/Container';
3
- import { primaryImageSource } from '@gradial/aci';
3
+ import { primaryImageSource, type RootIdentityProps } from '@gradial/aci';
4
4
  import type { ContentProps } from '@/cms/contracts/components/homeHero.contract';
5
5
 
6
6
  type HeroImage = NonNullable<ContentProps['image']>;
7
7
 
8
- export type HomeHeroProps = Omit<ContentProps, 'image'> & { image?: HeroImage };
8
+ export type HomeHeroProps = Omit<ContentProps, 'image'> & { image?: HeroImage } & RootIdentityProps;
9
9
 
10
- export function HomeHero({ eyebrow = '', headline = '', description = '', ctaLabel = '', ctaHref = '#', image }: HomeHeroProps) {
10
+ export function HomeHero({ eyebrow = '', headline = '', description = '', ctaLabel = '', ctaHref = '#', image, ...root }: HomeHeroProps) {
11
11
  const imageSrc = heroImageSrc(image);
12
12
  const imageAlt = image?.alt || headline;
13
13
 
14
14
  return (
15
15
  <section
16
+ {...root}
16
17
  className="theme-light relative flex min-h-[var(--height-hero-min)] items-center bg-cover bg-center"
17
18
  aria-label={imageAlt}
18
19
  style={{
@@ -1,6 +1,7 @@
1
1
  'use client';
2
2
 
3
3
  import { useEffect, useState } from 'react';
4
+ import type { RootIdentityProps } from '@gradial/aci';
4
5
  import type { ContentProps } from '@/cms/contracts/components/personalizationChoice.contract';
5
6
 
6
7
  type AciWindow = Window & { aci?: (command: string, value: unknown) => void };
@@ -15,7 +16,8 @@ export function PersonalizationChoice({
15
16
  redLabel,
16
17
  blueLabel,
17
18
  refreshLabel,
18
- }: ContentProps) {
19
+ ...root
20
+ }: ContentProps & RootIdentityProps) {
19
21
  const [consent, setConsent] = useState(false);
20
22
  const [marker, setMarker] = useState(false);
21
23
 
@@ -30,7 +32,7 @@ export function PersonalizationChoice({
30
32
  }, []);
31
33
 
32
34
  return (
33
- <section className="border-y border-[var(--color-border)] bg-[var(--color-surface)] py-[var(--spacing-section-y)]">
35
+ <section className="border-y border-[var(--color-border)] bg-[var(--color-surface)] py-[var(--spacing-section-y)]" {...root}>
34
36
  <div className="mx-auto max-w-[var(--layout-content-max)] px-[var(--layout-gutter)] text-center">
35
37
  <h2 className="text-[length:var(--text-h2)] font-[var(--font-weight-semibold)] text-[var(--color-fg)]">{title}</h2>
36
38
  {description ? <p className="mx-auto mt-3 max-w-2xl text-[var(--color-fg-muted)]">{description}</p> : null}
@@ -1,11 +1,12 @@
1
1
  import { Container } from '@/components/elements/Container';
2
+ import type { RootIdentityProps } from '@gradial/aci';
2
3
  import type { ContentProps } from '@/cms/contracts/components/statsBar.contract';
3
4
 
4
- export type StatsBarProps = ContentProps;
5
+ export type StatsBarProps = ContentProps & RootIdentityProps;
5
6
 
6
- export function StatsBar({ stats = [] }: StatsBarProps) {
7
+ export function StatsBar({ stats = [], ...root }: StatsBarProps) {
7
8
  return (
8
- <section className="theme-light relative border-y border-[var(--color-border-default)] bg-[var(--color-surface-100)] py-[var(--spacing-section-y)]">
9
+ <section {...root} className="theme-light relative border-y border-[var(--color-border-default)] bg-[var(--color-surface-100)] py-[var(--spacing-section-y)]">
9
10
  <div className="pointer-events-none absolute inset-0 bg-[image:var(--gradient-hero-base)] opacity-40" />
10
11
  <Container className="relative">
11
12
  <div className="grid gap-10 sm:grid-cols-2 lg:grid-cols-4">
@@ -0,0 +1,9 @@
1
+ version: "1"
2
+ siteId: "starter-nextjs"
3
+ framework: next
4
+ source:
5
+ root: "./"
6
+ componentRegistry: "src/cms/registry.ts"
7
+ routes:
8
+ cmsManaged: "/[...slug]"
9
+ rendererProtocol: stdio-json
@@ -7,7 +7,6 @@ source:
7
7
  root: "./"
8
8
 
9
9
  componentRegistry: ./src/cms/contracts/components/index.ts
10
- layoutRegistry: ./src/cms/contracts/layouts/index.ts
11
10
 
12
11
  routes:
13
12
  cmsManaged: "/[...slug]"
@@ -15,12 +15,13 @@
15
15
  "build:storybook": "storybook build"
16
16
  },
17
17
  "engines": {
18
- "node": ">=22",
18
+ "node": ">=24",
19
19
  "npm": ">=10"
20
20
  },
21
21
  "dependencies": {
22
+ "@c15t/nextjs": "^2.2.1",
22
23
  "@gradial/aci": "{{aciVersion}}",
23
- "next": "^15.1.6",
24
+ "next": "15.5.24",
24
25
  "react": "^19.0.0",
25
26
  "react-dom": "^19.0.0"
26
27
  },
@@ -31,7 +32,7 @@
31
32
  "@eslint/compat": "^1.2.0",
32
33
  "@eslint/eslintrc": "^3.2.0",
33
34
  "eslint": "^9.18.0",
34
- "eslint-config-next": "^15.1.6",
35
+ "eslint-config-next": "15.5.24",
35
36
  "eslint-plugin-import": "^2.29.1",
36
37
  "tailwindcss": "^4.2.4",
37
38
  "@tailwindcss/postcss": "^4.2.4",