@gradial/aci 0.1.20-preview.2 → 0.1.20

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 (249) hide show
  1. package/README.md +48 -110
  2. package/bin/{aci → aci-darwin-arm64} +0 -0
  3. package/bin/aci.js +99 -6
  4. package/dist/assets/index.d.ts +3 -3
  5. package/dist/assets/index.js +3 -3
  6. package/dist/astro/index.d.ts +14 -3
  7. package/dist/astro/index.js +24 -5
  8. package/dist/content/assets.d.ts +17 -0
  9. package/dist/content/assets.js +65 -0
  10. package/dist/content/index.d.ts +2 -0
  11. package/dist/content/index.js +2 -0
  12. package/dist/content/provider.d.ts +19 -0
  13. package/dist/content/provider.js +7 -0
  14. package/dist/content/resolve-slots.d.ts +9 -0
  15. package/dist/content/resolve-slots.js +24 -0
  16. package/dist/content/types.d.ts +1 -1
  17. package/dist/define-component.d.ts +1 -2
  18. package/dist/define-component.js +73 -11
  19. package/dist/define-layout.d.ts +2 -0
  20. package/dist/define-layout.js +3 -0
  21. package/dist/dev/content-watch.d.ts +37 -0
  22. package/dist/dev/content-watch.js +154 -0
  23. package/dist/dev/index.d.ts +24 -43
  24. package/dist/dev/index.js +4 -169
  25. package/dist/index.d.ts +14 -5
  26. package/dist/index.js +8 -8
  27. package/dist/next/asset-route.d.ts +2 -0
  28. package/dist/next/asset-route.js +12 -4
  29. package/dist/next/config.d.ts +2 -2
  30. package/dist/next/config.js +6 -6
  31. package/dist/next/content-watch.js +6 -1
  32. package/dist/next/index.d.ts +2 -2
  33. package/dist/next/index.js +2 -2
  34. package/dist/next/middleware.d.ts +7 -3
  35. package/dist/next/middleware.js +12 -7
  36. package/dist/next/page.d.ts +16 -15
  37. package/dist/next/page.js +30 -10
  38. package/dist/next/render.d.ts +5 -0
  39. package/dist/next/render.js +17 -0
  40. package/dist/next/root-layout.d.ts +4 -0
  41. package/dist/next/root-layout.js +5 -0
  42. package/dist/next/server.d.ts +14 -13
  43. package/dist/next/server.js +13 -3
  44. package/dist/providers/file.d.ts +2 -0
  45. package/dist/providers/file.js +61 -1
  46. package/dist/providers/s3.d.ts +1 -0
  47. package/dist/providers/s3.js +14 -1
  48. package/dist/react/Media.d.ts +24 -0
  49. package/dist/react/Media.js +30 -0
  50. package/dist/react/Picture.d.ts +12 -0
  51. package/dist/react/Picture.js +11 -0
  52. package/dist/react/VideoPlayer.d.ts +13 -0
  53. package/dist/react/{GradialVideoPlayer.js → VideoPlayer.js} +6 -5
  54. package/dist/react/index.d.ts +333 -3
  55. package/dist/react/index.js +89 -3
  56. package/dist/registry.d.ts +15 -0
  57. package/dist/registry.js +10 -0
  58. package/dist/testing/index.d.ts +3 -0
  59. package/dist/testing/index.js +15 -2
  60. package/dist/types/block-ref.d.ts +26 -0
  61. package/dist/types/block-ref.js +28 -0
  62. package/dist/types/component.d.ts +36 -41
  63. package/dist/types/config.d.ts +1 -2
  64. package/dist/types/image.d.ts +33 -20
  65. package/dist/types/image.js +42 -50
  66. package/dist/types/index.d.ts +1 -0
  67. package/dist/types/index.js +1 -0
  68. package/dist/types/link.d.ts +38 -0
  69. package/dist/types/link.js +58 -0
  70. package/dist/types/media.d.ts +16 -35
  71. package/dist/types/media.js +15 -84
  72. package/dist/types/page.d.ts +1 -2
  73. package/dist/types/render-mode.d.ts +0 -1
  74. package/dist/types/renderer.d.ts +1 -1
  75. package/dist/types/rich-text.d.ts +40 -0
  76. package/dist/types/rich-text.js +39 -0
  77. package/dist/types/video.d.ts +7 -13
  78. package/dist/types/video.js +3 -3
  79. package/package.json +32 -74
  80. package/src/cli/compile-registry.mjs +236 -59
  81. package/src/cli/validate-content.mjs +38 -75
  82. package/src/types/image.ts +79 -60
  83. package/templates/astro/template/.aci.yaml +27 -0
  84. package/templates/astro/template/.storybook/main.ts +79 -0
  85. package/templates/astro/template/.storybook/manager.ts +6 -0
  86. package/templates/astro/template/.storybook/preview.ts +33 -0
  87. package/templates/astro/template/astro.config.mjs +37 -0
  88. package/templates/astro/template/package.json.tmpl +41 -0
  89. package/templates/astro/template/src/cms/contracts/layouts/index.ts +18 -0
  90. package/templates/astro/template/src/cms/registry.ts +28 -0
  91. package/templates/astro/template/src/components/chrome/Footer.astro +107 -0
  92. package/templates/astro/template/src/components/chrome/Header.astro +94 -0
  93. package/templates/astro/template/src/components/elements/AtomicBlock.astro +15 -0
  94. package/templates/astro/template/src/components/elements/AtomicBlocks.astro +16 -0
  95. package/templates/astro/template/src/components/elements/Button.astro +51 -0
  96. package/templates/astro/template/src/components/elements/ButtonBlock.astro +25 -0
  97. package/templates/astro/template/src/components/elements/Container.astro +11 -0
  98. package/templates/astro/template/src/components/elements/Icon.astro +31 -0
  99. package/templates/astro/template/src/components/elements/Logo.astro +29 -0
  100. package/templates/astro/template/src/components/elements/RemoteImage.astro +41 -0
  101. package/templates/astro/template/src/components/sections/ContainerSection.astro +32 -0
  102. package/templates/astro/template/src/components/sections/FeatureCard.astro +23 -0
  103. package/templates/astro/template/src/components/sections/FeatureGrid.astro +35 -0
  104. package/templates/astro/template/src/components/sections/HomeHero.astro +51 -0
  105. package/templates/astro/template/src/components/sections/StatsBar.astro +33 -0
  106. package/templates/astro/template/src/design-system/styles.css +399 -0
  107. package/templates/astro/template/src/design-system/tokens/colors.css +60 -0
  108. package/templates/astro/template/src/design-system/tokens/components.css +69 -0
  109. package/templates/astro/template/src/design-system/tokens/index.css +6 -0
  110. package/templates/astro/template/src/design-system/tokens/radii.css +5 -0
  111. package/templates/astro/template/src/design-system/tokens/shadows.css +5 -0
  112. package/templates/astro/template/src/design-system/tokens/spacing.css +13 -0
  113. package/templates/astro/template/src/design-system/tokens/typography.css +24 -0
  114. package/templates/astro/template/src/env.d.ts +1 -0
  115. package/templates/astro/template/src/fixtures/atomicBlocks.ts +33 -0
  116. package/templates/astro/template/src/fixtures/composition.ts +31 -0
  117. package/templates/astro/template/src/fixtures/index.ts +17 -0
  118. package/templates/astro/template/src/fixtures/sections.ts +39 -0
  119. package/templates/astro/template/src/layouts/SiteLayout.astro +30 -0
  120. package/templates/astro/template/src/pages/[...slug].astro +61 -0
  121. package/templates/astro/template/src/render/RenderPage.astro +66 -0
  122. package/templates/astro/template/src/stories/CompositionStoryFrame.astro +15 -0
  123. package/templates/astro/template/src/stories/HomeHero.stories.ts +24 -0
  124. package/templates/astro/template/src/stories/SectionStoryFrame.astro +16 -0
  125. package/templates/astro/template/src/stories/StoryDocFrame.astro +31 -0
  126. package/templates/astro/template/tsconfig.json +11 -0
  127. package/templates/common/.agents/AGENTS.md +37 -0
  128. package/templates/common/.agents/skills/aci/SKILL.md +162 -0
  129. package/templates/common/.agents/skills/authoring/SKILL.md +590 -0
  130. package/templates/common/.agents/skills/authoring/references/block-registry.md +151 -0
  131. package/templates/common/.agents/skills/authoring/references/contracts.md +153 -0
  132. package/templates/common/.agents/skills/authoring/references/design-system.md +171 -0
  133. package/templates/common/.agents/skills/authoring/references/image-assets.md +73 -0
  134. package/templates/common/.agents/skills/authoring/references/repo-structure.md +157 -0
  135. package/templates/common/.agents/skills/migration/SKILL.md +160 -0
  136. package/templates/common/.agents/skills/migration/references/analyzing-source.md +215 -0
  137. package/templates/common/.agents/skills/migration/references/component-migration.md +200 -0
  138. package/templates/common/.agents/skills/migration/references/selector-map.md +31 -0
  139. package/templates/common/.content/.gradial-dam/blobs/sha256/7f/bf/7fbfc7fe230ff12688c496f660119e41d9725c4504d82e310c15665c73c09292 +0 -0
  140. package/templates/common/.content/.gradial-dam/blobs/sha256/a0/f5/a0f506689de9b15a7055f70103a3f02cd3ba105771ae2de6754df2ede1210d3a +0 -0
  141. package/templates/common/.content/.gradial-dam/blobs/sha256/dd/b7/ddb7e9642be08317bcd4b2bd26b58ba8d0d34dd7239e03e684a4f3634fa3845b +0 -0
  142. package/templates/common/.content/.gradial-dam/blobs/sha256/fb/32/fb3260e8286ea8231ea1c77b9c0be92d6edd9026565731eb14cfdcfd6b1b75b3 +0 -0
  143. package/templates/common/.content/config/site.json +192 -0
  144. package/templates/common/.content/dam/folders/seed/ast_site_about_hero/asset.json +9 -0
  145. package/templates/common/.content/dam/folders/seed/ast_site_about_hero/editorial.json +14 -0
  146. package/templates/common/.content/dam/folders/seed/ast_site_about_hero/governance.json +23 -0
  147. package/templates/common/.content/dam/folders/seed/ast_site_about_hero/versions/v0001.json +37 -0
  148. package/templates/common/.content/dam/folders/seed/ast_site_home_hero/asset.json +9 -0
  149. package/templates/common/.content/dam/folders/seed/ast_site_home_hero/editorial.json +14 -0
  150. package/templates/common/.content/dam/folders/seed/ast_site_home_hero/governance.json +23 -0
  151. package/templates/common/.content/dam/folders/seed/ast_site_home_hero/versions/v0001.json +37 -0
  152. package/templates/common/.content/fragments/navbar/_index.json +25 -0
  153. package/templates/common/.content/fragments/site-footer/_index.json +62 -0
  154. package/templates/common/.content/pages/about/_index.json +51 -0
  155. package/templates/common/.content/pages/home/_index.json +112 -0
  156. package/templates/common/.content/schemas/site.schema.json +123 -0
  157. package/templates/common/README.md.tmpl +45 -0
  158. package/templates/common/contracts/components/button.contract.ts +19 -0
  159. package/templates/common/contracts/components/container.contract.ts +19 -0
  160. package/templates/common/contracts/components/featureCard.contract.ts +15 -0
  161. package/templates/common/contracts/components/featureGrid.contract.ts +16 -0
  162. package/templates/common/contracts/components/homeHero.contract.ts +36 -0
  163. package/templates/common/contracts/components/index.ts +21 -0
  164. package/templates/common/contracts/components/siteFooter.contract.ts +45 -0
  165. package/templates/common/contracts/components/siteNavigation.contract.ts +30 -0
  166. package/templates/common/contracts/components/statsBar.contract.ts +19 -0
  167. package/templates/common/design-system/styles.css +346 -0
  168. package/templates/common/design-system/tokens/colors.css +110 -0
  169. package/templates/common/design-system/tokens/components.css +86 -0
  170. package/templates/common/design-system/tokens/index.css +6 -0
  171. package/templates/common/design-system/tokens/radii.css +5 -0
  172. package/templates/common/design-system/tokens/shadows.css +9 -0
  173. package/templates/common/design-system/tokens/spacing.css +26 -0
  174. package/templates/common/design-system/tokens/typography.css +32 -0
  175. package/templates/common/eslint-rules/no-raw-tailwind-values.js +127 -0
  176. package/templates/common/public/assets/Dwire-model.png +0 -0
  177. package/templates/common/public/assets/bare-metal-logo.png +0 -0
  178. package/templates/common/public/assets/meridian-logo.svg +8 -0
  179. package/templates/common/public/assets/seattle.avif +0 -0
  180. package/templates/nextjs/template/.aci.yaml +25 -0
  181. package/templates/nextjs/template/.storybook/main.ts +13 -0
  182. package/templates/nextjs/template/.storybook/preview.ts +34 -0
  183. package/templates/nextjs/template/eslint.config.mjs +36 -0
  184. package/templates/nextjs/template/next-env.d.ts +6 -0
  185. package/templates/nextjs/template/next.config.ts +8 -0
  186. package/templates/nextjs/template/package.json.tmpl +46 -0
  187. package/templates/nextjs/template/postcss.config.mjs +7 -0
  188. package/templates/nextjs/template/src/app/[[...slug]]/page.tsx +8 -0
  189. package/templates/nextjs/template/src/app/gradial/assets/[releaseId]/[...path]/route.ts +31 -0
  190. package/templates/nextjs/template/src/app/layout.tsx +29 -0
  191. package/templates/nextjs/template/src/cms/contracts/components/button.contract.ts +19 -0
  192. package/templates/nextjs/template/src/cms/contracts/components/container.contract.ts +20 -0
  193. package/templates/nextjs/template/src/cms/contracts/components/homeHero.contract.ts +36 -0
  194. package/templates/nextjs/template/src/cms/contracts/components/index.ts +15 -0
  195. package/templates/nextjs/template/src/cms/contracts/components/siteFooter.contract.ts +45 -0
  196. package/templates/nextjs/template/src/cms/contracts/components/siteNavigation.contract.ts +30 -0
  197. package/templates/nextjs/template/src/cms/contracts/layouts/index.ts +16 -0
  198. package/templates/nextjs/template/src/cms/registry.ts +28 -0
  199. package/templates/nextjs/template/src/components/chrome/Footer.tsx +86 -0
  200. package/templates/nextjs/template/src/components/chrome/Header.tsx +74 -0
  201. package/templates/nextjs/template/src/components/elements/AtomicBlock.tsx +13 -0
  202. package/templates/nextjs/template/src/components/elements/Button.tsx +40 -0
  203. package/templates/nextjs/template/src/components/elements/ButtonBlock.tsx +18 -0
  204. package/templates/nextjs/template/src/components/elements/Container.tsx +14 -0
  205. package/templates/nextjs/template/src/components/elements/Icon.tsx +29 -0
  206. package/templates/nextjs/template/src/components/elements/Logo.tsx +38 -0
  207. package/templates/nextjs/template/src/components/sections/ContainerSection.tsx +28 -0
  208. package/templates/nextjs/template/src/components/sections/FeatureCard.tsx +25 -0
  209. package/templates/nextjs/template/src/components/sections/FeatureGrid.tsx +36 -0
  210. package/templates/nextjs/template/src/components/sections/HomeHero.tsx +62 -0
  211. package/templates/nextjs/template/src/components/sections/StatsBar.tsx +30 -0
  212. package/templates/nextjs/template/src/middleware.ts +4 -0
  213. package/templates/nextjs/template/src/stories/Button.stories.tsx +38 -0
  214. package/templates/nextjs/template/src/stories/Header.stories.tsx +30 -0
  215. package/templates/nextjs/template/src/stories/HomeHero.stories.tsx +33 -0
  216. package/templates/nextjs/template/tsconfig.json +23 -0
  217. package/templates/nextjs/template/vercel.json +6 -0
  218. package/dist/content/cache.test.d.ts +0 -1
  219. package/dist/content/cache.test.js +0 -86
  220. package/dist/content/contract.d.ts +0 -83
  221. package/dist/content/contract.js +0 -104
  222. package/dist/content/tailwind-validator.d.ts +0 -6
  223. package/dist/content/tailwind-validator.js +0 -31
  224. package/dist/content/validation.d.ts +0 -108
  225. package/dist/content/validation.js +0 -184
  226. package/dist/next/preview-banner.d.ts +0 -4
  227. package/dist/next/preview-banner.js +0 -51
  228. package/dist/next/preview.d.ts +0 -7
  229. package/dist/next/preview.js +0 -37
  230. package/dist/react/GradialMedia.d.ts +0 -24
  231. package/dist/react/GradialMedia.js +0 -31
  232. package/dist/react/GradialPicture.d.ts +0 -14
  233. package/dist/react/GradialPicture.js +0 -30
  234. package/dist/react/GradialVideoPlayer.d.ts +0 -13
  235. package/dist/sveltekit/index.d.ts +0 -23
  236. package/dist/sveltekit/index.js +0 -62
  237. package/dist/sveltekit/preview.d.ts +0 -5
  238. package/dist/sveltekit/preview.js +0 -33
  239. package/src/cli/verify-renderer.mjs +0 -73
  240. package/src/types/component.ts +0 -59
  241. package/src/types/config.ts +0 -38
  242. package/src/types/data.ts +0 -47
  243. package/src/types/index.ts +0 -10
  244. package/src/types/layout.ts +0 -29
  245. package/src/types/media.ts +0 -125
  246. package/src/types/page.ts +0 -48
  247. package/src/types/render-mode.ts +0 -18
  248. package/src/types/renderer.ts +0 -83
  249. package/src/types/video.ts +0 -66
@@ -0,0 +1,62 @@
1
+ {
2
+ "$type": "fragment",
3
+ "fragmentId": "site-footer",
4
+ "component": "site-footer",
5
+ "props": {
6
+ "brandHref": "/",
7
+ "brandLabel": "Meridian",
8
+ "brandLogo": {
9
+ "src": "/assets/meridian-logo.svg",
10
+ "alt": "Meridian"
11
+ },
12
+ "columns": [
13
+ {
14
+ "id": "products",
15
+ "title": "Products",
16
+ "links": [
17
+ { "id": "plans", "label": "Plans", "href": "/plans/" },
18
+ { "id": "devices", "label": "Devices", "href": "/devices/" },
19
+ { "id": "coverage", "label": "Coverage", "href": "/coverage/" }
20
+ ]
21
+ },
22
+ {
23
+ "id": "solutions",
24
+ "title": "Solutions",
25
+ "links": [
26
+ { "id": "business", "label": "Business", "href": "/business/" },
27
+ { "id": "maritime", "label": "Maritime", "href": "/business/maritime/" },
28
+ { "id": "aerospace", "label": "Aerospace", "href": "/business/aerospace/" }
29
+ ]
30
+ },
31
+ {
32
+ "id": "resources",
33
+ "title": "Resources",
34
+ "links": [
35
+ { "id": "blog", "label": "Blog", "href": "/blog/" },
36
+ { "id": "documentation", "label": "Documentation", "href": "/docs/" },
37
+ { "id": "support", "label": "Support", "href": "/support/" }
38
+ ]
39
+ },
40
+ {
41
+ "id": "company",
42
+ "title": "Company",
43
+ "links": [
44
+ { "id": "about", "label": "About us", "href": "/about/" },
45
+ { "id": "careers", "label": "Careers", "href": "/careers/" },
46
+ { "id": "contact", "label": "Contact", "href": "/contact/" }
47
+ ]
48
+ }
49
+ ],
50
+ "social": [
51
+ { "id": "x", "label": "X", "href": "https://x.com/meridian", "icon": "X" },
52
+ { "id": "linkedin", "label": "LinkedIn", "href": "https://www.linkedin.com/company/meridian", "icon": "in" },
53
+ { "id": "youtube", "label": "YouTube", "href": "https://www.youtube.com/meridian", "icon": "YT" }
54
+ ],
55
+ "legalLinks": [
56
+ { "id": "terms", "label": "Terms of Service", "href": "/terms/" },
57
+ { "id": "privacy", "label": "Privacy Policy", "href": "/privacy/" },
58
+ { "id": "security", "label": "Security", "href": "/security/" }
59
+ ],
60
+ "copyright": "Copyright (c) 2026 Meridian Satellite Networks, Inc. All rights reserved."
61
+ }
62
+ }
@@ -0,0 +1,51 @@
1
+ {
2
+ "$type": "page",
3
+ "id": "meridian-about",
4
+ "status": "published",
5
+ "layout": "default",
6
+ "metadata": {
7
+ "title": "About Meridian",
8
+ "description": "Meridian is building the next generation of satellite internet to connect the unconnected.",
9
+ "canonical": "https://www.meridian.local/about"
10
+ },
11
+ "regions": {
12
+ "main": [
13
+ {
14
+ "id": "about-hero",
15
+ "component": "home_hero",
16
+ "props": {
17
+ "eyebrow": "About us",
18
+ "headline": "Connecting the edges of the world.",
19
+ "description": "Meridian designs, builds, and operates low-orbit satellites and ground terminals that bring reliable broadband to places traditional networks cannot reach.",
20
+ "ctaLabel": "Back to home",
21
+ "ctaHref": "/",
22
+ "image": {
23
+ "$type": "dam.assetRef",
24
+ "assetId": "ast_site_about_hero",
25
+ "alt": "Meridian network coverage map with soft gradient"
26
+ }
27
+ }
28
+ },
29
+ {
30
+ "id": "about-actions",
31
+ "component": "container",
32
+ "props": {
33
+ "className": "items-center justify-center text-center",
34
+ "content": [
35
+ {
36
+ "id": "home-link",
37
+ "component": "button",
38
+ "props": {
39
+ "label": "Return home",
40
+ "href": "/",
41
+ "variant": "primary",
42
+ "icon": "arrow_forward",
43
+ "iconPosition": "after"
44
+ }
45
+ }
46
+ ]
47
+ }
48
+ }
49
+ ]
50
+ }
51
+ }
@@ -0,0 +1,112 @@
1
+ {
2
+ "$type": "page",
3
+ "id": "meridian-home",
4
+ "status": "published",
5
+ "layout": "default",
6
+ "metadata": {
7
+ "title": "Meridian — Global Satellite Internet",
8
+ "description": "Connect from anywhere on Earth. Low-latency satellite internet for homes, businesses, and beyond.",
9
+ "canonical": "https://www.meridian.local/"
10
+ },
11
+ "regions": {
12
+ "main": [
13
+ {
14
+ "id": "hero",
15
+ "component": "home_hero",
16
+ "props": {
17
+ "eyebrow": "Global satellite internet",
18
+ "headline": "Connect from anywhere on Earth.",
19
+ "description": "Meridian delivers low-latency broadband to homes, businesses, and remote operations in over 40 countries. No ground infrastructure required.",
20
+ "ctaLabel": "Explore plans",
21
+ "ctaHref": "/plans/",
22
+ "image": {
23
+ "$type": "dam.assetRef",
24
+ "assetId": "ast_site_home_hero",
25
+ "alt": "Light abstract hero background with satellite constellation"
26
+ }
27
+ }
28
+ },
29
+ {
30
+ "id": "why-meridian",
31
+ "component": "feature_grid",
32
+ "props": {
33
+ "title": "Why Meridian",
34
+ "subtitle": "Engineered for the edges of the world.",
35
+ "features": [
36
+ {
37
+ "id": "global-coverage",
38
+ "component": "feature_card",
39
+ "props": {
40
+ "icon": "globe",
41
+ "title": "Global coverage",
42
+ "description": "A constellation of low-orbit satellites keeps you connected across continents, oceans, and remote terrain."
43
+ }
44
+ },
45
+ {
46
+ "id": "low-latency",
47
+ "component": "feature_card",
48
+ "props": {
49
+ "icon": "speed",
50
+ "title": "Low latency",
51
+ "description": "Sub-50ms latency means video calls, gaming, and real-time control feel local, even in the middle of nowhere."
52
+ }
53
+ },
54
+ {
55
+ "id": "easy-setup",
56
+ "component": "feature_card",
57
+ "props": {
58
+ "icon": "setup",
59
+ "title": "Easy setup",
60
+ "description": "A compact terminal and a phone app. Point at the sky, power on, and get online in minutes."
61
+ }
62
+ }
63
+ ]
64
+ }
65
+ },
66
+ {
67
+ "id": "stats",
68
+ "component": "stats_bar",
69
+ "props": {
70
+ "stats": [
71
+ { "label": "Network uptime", "value": "99.9", "suffix": "%" },
72
+ { "label": "Average latency", "value": "<50", "suffix": "ms" },
73
+ { "label": "Countries covered", "value": "40", "suffix": "+" },
74
+ { "label": "Orbital satellites", "value": "2,400", "suffix": "" }
75
+ ]
76
+ }
77
+ },
78
+ {
79
+ "id": "cta",
80
+ "component": "container",
81
+ "props": {
82
+ "theme": "light",
83
+ "className": "items-center justify-center text-center",
84
+ "content": [
85
+ {
86
+ "id": "cta-primary",
87
+ "component": "button",
88
+ "props": {
89
+ "label": "Explore plans",
90
+ "href": "/plans/",
91
+ "variant": "primary",
92
+ "icon": "arrow_forward",
93
+ "iconPosition": "after"
94
+ }
95
+ },
96
+ {
97
+ "id": "cta-secondary",
98
+ "component": "button",
99
+ "props": {
100
+ "label": "Contact sales",
101
+ "href": "/contact-sales/",
102
+ "variant": "outline",
103
+ "icon": "arrow_forward",
104
+ "iconPosition": "after"
105
+ }
106
+ }
107
+ ]
108
+ }
109
+ }
110
+ ]
111
+ }
112
+ }
@@ -0,0 +1,123 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://baremetal.local/schemas/site.schema.json",
4
+ "title": "bare-metal Site Config",
5
+ "type": "object",
6
+ "required": ["$type", "id", "status", "title", "domain", "defaultLocale", "overlayResolution"],
7
+ "additionalProperties": true,
8
+ "properties": {
9
+ "$type": { "const": "site" },
10
+ "id": { "type": "string", "minLength": 1 },
11
+ "status": { "type": "string", "minLength": 1 },
12
+ "title": { "type": "string", "minLength": 1 },
13
+ "domain": { "type": "string", "minLength": 1 },
14
+ "defaultLocale": { "type": "string", "minLength": 1 },
15
+ "locales": {
16
+ "type": "array",
17
+ "items": { "type": "string", "minLength": 1 }
18
+ },
19
+ "overlayResolution": {
20
+ "type": "array",
21
+ "items": { "enum": ["locale", "audience"] }
22
+ },
23
+ "brandHref": { "type": "string" },
24
+ "brandLogo": {
25
+ "type": "object",
26
+ "additionalProperties": true,
27
+ "properties": {
28
+ "src": { "type": "string", "minLength": 1 },
29
+ "alt": { "type": "string" }
30
+ }
31
+ },
32
+ "navigation": {
33
+ "type": "array",
34
+ "items": { "$ref": "#/$defs/link" }
35
+ },
36
+ "utilities": {
37
+ "type": "array",
38
+ "items": {
39
+ "allOf": [
40
+ { "$ref": "#/$defs/link" },
41
+ {
42
+ "type": "object",
43
+ "properties": {
44
+ "variant": {
45
+ "enum": ["primary", "secondary", "outline", "ghost"]
46
+ }
47
+ }
48
+ }
49
+ ]
50
+ }
51
+ },
52
+ "footer": {
53
+ "type": "object",
54
+ "additionalProperties": true,
55
+ "properties": {
56
+ "columns": {
57
+ "type": "array",
58
+ "items": { "$ref": "#/$defs/footerColumn" }
59
+ },
60
+ "social": {
61
+ "type": "array",
62
+ "items": { "$ref": "#/$defs/link" }
63
+ },
64
+ "legalLinks": {
65
+ "type": "array",
66
+ "items": { "$ref": "#/$defs/link" }
67
+ },
68
+ "copyright": { "type": "string" }
69
+ }
70
+ },
71
+ "seo": {
72
+ "type": "object",
73
+ "additionalProperties": true,
74
+ "properties": {
75
+ "title": { "type": "string" },
76
+ "description": { "type": "string" },
77
+ "siteName": { "type": "string" }
78
+ }
79
+ }
80
+ },
81
+ "$defs": {
82
+ "link": {
83
+ "type": "object",
84
+ "required": ["id", "label", "href"],
85
+ "additionalProperties": true,
86
+ "properties": {
87
+ "id": { "type": "string", "minLength": 1 },
88
+ "label": { "type": "string", "minLength": 1 },
89
+ "href": { "type": "string", "minLength": 1 }
90
+ }
91
+ },
92
+ "footerGroup": {
93
+ "type": "object",
94
+ "required": ["id", "title", "links"],
95
+ "additionalProperties": true,
96
+ "properties": {
97
+ "id": { "type": "string", "minLength": 1 },
98
+ "title": { "type": "string" },
99
+ "links": {
100
+ "type": "array",
101
+ "items": { "$ref": "#/$defs/link" }
102
+ }
103
+ }
104
+ },
105
+ "footerColumn": {
106
+ "type": "object",
107
+ "required": ["id"],
108
+ "additionalProperties": true,
109
+ "properties": {
110
+ "id": { "type": "string", "minLength": 1 },
111
+ "title": { "type": "string" },
112
+ "groups": {
113
+ "type": "array",
114
+ "items": { "$ref": "#/$defs/footerGroup" }
115
+ },
116
+ "links": {
117
+ "type": "array",
118
+ "items": { "$ref": "#/$defs/link" }
119
+ }
120
+ }
121
+ }
122
+ }
123
+ }
@@ -0,0 +1,45 @@
1
+ # {{siteName}}
2
+
3
+ ## Quick Start
4
+
5
+ ```bash
6
+ npm install
7
+ npm run dev
8
+ ```
9
+
10
+ ## Skills
11
+
12
+ This project uses progressive disclosure skills for both humans and agents.
13
+ Each skill has a `SKILL.md` entry point and `references/` for deeper topics.
14
+
15
+ | Skill | When to read |
16
+ |-------|-------------|
17
+ | [aci](.agents/skills/aci/SKILL.md) | New to ACI? Start here. Architecture, commands, testing, troubleshooting. |
18
+ | [authoring](.agents/skills/authoring/SKILL.md) | Creating content, building components, design tokens, component registry. |
19
+ | [migration](.agents/skills/migration/SKILL.md) | Migrating an existing site or design into ACI. |
20
+
21
+ Agents: load skills from `.agents/skills/`. See `.agents/AGENTS.md`.
22
+
23
+ ## Commands
24
+
25
+ ```bash
26
+ npm run dev # Start dev server
27
+ npm run build # Build for production
28
+ npm run typecheck # TypeScript type checking
29
+ npm run aci:validate # Validate content against schemas
30
+ npm run aci:compile # Compile contract registry
31
+ npm run content:compile # Compile content into .aci/compiled/
32
+ npm run aci:doctor # Check project health
33
+ npm run aci:build # Full build (contracts + content + framework)
34
+ ```
35
+
36
+ ## Project Structure
37
+
38
+ ```
39
+ .content/ Content source (JSON)
40
+ src/cms/ Contracts and component registry
41
+ src/components/ Runtime components (elements, sections, chrome)
42
+ src/design-system/ Design tokens and global styles
43
+ .agents/skills/ Skills for humans and agents
44
+ .aci/ Generated artifacts (compiled, schemas)
45
+ ```
@@ -0,0 +1,19 @@
1
+ import { defineComponentContract } from '@gradial/aci';
2
+ import { z } from 'zod';
3
+
4
+ export const schema = z.object({
5
+ label: z.string().min(1),
6
+ href: z.string().min(1),
7
+ variant: z.enum(['primary', 'secondary', 'outline', 'tertiary']).optional(),
8
+ newWindow: z.boolean().optional(),
9
+ icon: z.string().optional(),
10
+ iconPosition: z.enum(['before', 'after']).optional(),
11
+ className: z.string().optional(),
12
+ });
13
+
14
+ export type ContentProps = z.infer<typeof schema>;
15
+
16
+ export const buttonContract = defineComponentContract({
17
+ id: 'button',
18
+ props: schema,
19
+ });
@@ -0,0 +1,19 @@
1
+ import { defineComponentContract, blockRefArray } from '@gradial/aci';
2
+ import { z } from 'zod';
3
+ import { buttonContract } from './button.contract';
4
+ import { featureGridContract } from './featureGrid.contract';
5
+ import { featureCardContract } from './featureCard.contract';
6
+ import { statsBarContract } from './statsBar.contract';
7
+
8
+ export const schema = z.object({
9
+ theme: z.enum(['auto', 'light', 'dark']).optional(),
10
+ className: z.string().optional(),
11
+ content: blockRefArray([buttonContract, featureGridContract, featureCardContract, statsBarContract]).optional(),
12
+ });
13
+
14
+ export type ContentProps = z.infer<typeof schema>;
15
+
16
+ export const containerContract = defineComponentContract({
17
+ id: 'container',
18
+ props: schema,
19
+ });
@@ -0,0 +1,15 @@
1
+ import { defineComponentContract } from '@gradial/aci';
2
+ import { z } from 'zod';
3
+
4
+ export const schema = z.object({
5
+ icon: z.string().optional(),
6
+ title: z.string().min(1),
7
+ description: z.string().optional(),
8
+ });
9
+
10
+ export type ContentProps = z.infer<typeof schema>;
11
+
12
+ export const featureCardContract = defineComponentContract({
13
+ id: 'feature_card',
14
+ props: schema,
15
+ });
@@ -0,0 +1,16 @@
1
+ import { defineComponentContract, blockRefArray } from '@gradial/aci';
2
+ import { z } from 'zod';
3
+ import { featureCardContract } from './featureCard.contract';
4
+
5
+ export const schema = z.object({
6
+ title: z.string().optional(),
7
+ subtitle: z.string().optional(),
8
+ features: blockRefArray([featureCardContract]).optional(),
9
+ });
10
+
11
+ export type ContentProps = z.infer<typeof schema>;
12
+
13
+ export const featureGridContract = defineComponentContract({
14
+ id: 'feature_grid',
15
+ props: schema,
16
+ });
@@ -0,0 +1,36 @@
1
+ import { defineComponentContract, ImageSchema } from '@gradial/aci';
2
+ import { z } from 'zod';
3
+
4
+ export const schema = z.object({
5
+ eyebrow: z.string().optional(),
6
+ headline: z.string().min(1),
7
+ description: z.string().optional(),
8
+ ctaLabel: z.string().min(1),
9
+ ctaHref: z.string().min(1),
10
+ image: ImageSchema.optional(),
11
+ });
12
+
13
+ export type ContentProps = z.infer<typeof schema>;
14
+
15
+ export const homeHeroContract = defineComponentContract({
16
+ id: 'home_hero',
17
+ props: schema,
18
+ imageSlots: {
19
+ image: {
20
+ formats: ['image/avif', 'image/webp', 'image/jpeg'],
21
+ sizes: '100vw',
22
+ outputs: [
23
+ {
24
+ aspectRatio: '16:9',
25
+ widths: [768, 1280, 1920],
26
+ media: '(min-width: 768px)',
27
+ },
28
+ {
29
+ aspectRatio: '3:4',
30
+ widths: [480, 720, 960],
31
+ media: '(max-width: 767px)',
32
+ },
33
+ ],
34
+ },
35
+ },
36
+ });
@@ -0,0 +1,21 @@
1
+ import { buttonContract } from './button.contract';
2
+ import { containerContract } from './container.contract';
3
+ import { featureCardContract } from './featureCard.contract';
4
+ import { featureGridContract } from './featureGrid.contract';
5
+ import { homeHeroContract } from './homeHero.contract';
6
+ import { siteNavigationContract } from './siteNavigation.contract';
7
+ import { siteFooterContract } from './siteFooter.contract';
8
+ import { statsBarContract } from './statsBar.contract';
9
+
10
+ const componentContracts = [
11
+ homeHeroContract,
12
+ containerContract,
13
+ buttonContract,
14
+ siteNavigationContract,
15
+ siteFooterContract,
16
+ featureGridContract,
17
+ featureCardContract,
18
+ statsBarContract,
19
+ ];
20
+
21
+ export default componentContracts;
@@ -0,0 +1,45 @@
1
+ import { defineComponentContract } from '@gradial/aci';
2
+ import { z } from 'zod';
3
+
4
+ const linkSchema = z.object({
5
+ id: z.string().min(1),
6
+ label: z.string().min(1),
7
+ href: z.string().min(1),
8
+ });
9
+
10
+ const groupSchema = z.object({
11
+ id: z.string().min(1),
12
+ title: z.string(),
13
+ links: z.array(linkSchema),
14
+ });
15
+
16
+ const columnSchema = z.object({
17
+ id: z.string().min(1),
18
+ title: z.string().optional(),
19
+ links: z.array(linkSchema).optional(),
20
+ groups: z.array(groupSchema).optional(),
21
+ });
22
+
23
+ const socialSchema = linkSchema.extend({
24
+ icon: z.string().optional(),
25
+ });
26
+
27
+ export const schema = z.object({
28
+ brandHref: z.string().min(1),
29
+ brandLabel: z.string().min(1),
30
+ brandLogo: z.object({
31
+ src: z.string(),
32
+ alt: z.string(),
33
+ }).nullable().optional(),
34
+ columns: z.array(columnSchema),
35
+ social: z.array(socialSchema).optional(),
36
+ legalLinks: z.array(linkSchema).optional(),
37
+ copyright: z.string().optional(),
38
+ });
39
+
40
+ export type ContentProps = z.infer<typeof schema>;
41
+
42
+ export const siteFooterContract = defineComponentContract({
43
+ id: 'site-footer',
44
+ props: schema,
45
+ });
@@ -0,0 +1,30 @@
1
+ import { defineComponentContract } from '@gradial/aci';
2
+ import { z } from 'zod';
3
+
4
+ const linkSchema = z.object({
5
+ id: z.string().min(1),
6
+ label: z.string().min(1),
7
+ href: z.string().min(1),
8
+ });
9
+
10
+ const utilitySchema = linkSchema.extend({
11
+ variant: z.enum(['primary', 'secondary', 'tertiary', 'outline', 'ghost']).optional(),
12
+ });
13
+
14
+ export const schema = z.object({
15
+ brandHref: z.string().min(1),
16
+ brandLabel: z.string().min(1),
17
+ brandLogo: z.object({
18
+ src: z.string(),
19
+ alt: z.string(),
20
+ }).nullable().optional(),
21
+ navigation: z.array(linkSchema),
22
+ utilities: z.array(utilitySchema).optional(),
23
+ });
24
+
25
+ export type ContentProps = z.infer<typeof schema>;
26
+
27
+ export const siteNavigationContract = defineComponentContract({
28
+ id: 'site-navigation',
29
+ props: schema,
30
+ });
@@ -0,0 +1,19 @@
1
+ import { defineComponentContract } from '@gradial/aci';
2
+ import { z } from 'zod';
3
+
4
+ const statSchema = z.object({
5
+ label: z.string().min(1),
6
+ value: z.string().min(1),
7
+ suffix: z.string().optional(),
8
+ });
9
+
10
+ export const schema = z.object({
11
+ stats: z.array(statSchema).min(1),
12
+ });
13
+
14
+ export type ContentProps = z.infer<typeof schema>;
15
+
16
+ export const statsBarContract = defineComponentContract({
17
+ id: 'stats_bar',
18
+ props: schema,
19
+ });