@gradial/aci 0.1.20-preview.3 → 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 (224) hide show
  1. package/README.md +48 -108
  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 +12 -3
  7. package/dist/astro/index.js +20 -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 +1 -0
  11. package/dist/content/index.js +1 -0
  12. package/dist/define-component.d.ts +1 -2
  13. package/dist/define-component.js +73 -5
  14. package/dist/dev/content-watch.d.ts +37 -0
  15. package/dist/dev/content-watch.js +154 -0
  16. package/dist/dev/index.d.ts +24 -43
  17. package/dist/dev/index.js +4 -169
  18. package/dist/index.d.ts +14 -6
  19. package/dist/index.js +8 -9
  20. package/dist/next/asset-route.js +2 -2
  21. package/dist/next/config.d.ts +2 -2
  22. package/dist/next/config.js +5 -5
  23. package/dist/next/content-watch.js +6 -1
  24. package/dist/next/index.d.ts +2 -2
  25. package/dist/next/index.js +2 -2
  26. package/dist/next/middleware.d.ts +2 -2
  27. package/dist/next/middleware.js +6 -6
  28. package/dist/next/page.d.ts +1 -1
  29. package/dist/next/page.js +14 -12
  30. package/dist/next/render.d.ts +3 -3
  31. package/dist/next/render.js +11 -9
  32. package/dist/next/server.d.ts +12 -12
  33. package/dist/next/server.js +1 -1
  34. package/dist/react/Media.d.ts +24 -0
  35. package/dist/react/Media.js +30 -0
  36. package/dist/react/Picture.d.ts +12 -0
  37. package/dist/react/Picture.js +11 -0
  38. package/dist/react/VideoPlayer.d.ts +13 -0
  39. package/dist/react/{GradialVideoPlayer.js → VideoPlayer.js} +6 -5
  40. package/dist/react/index.d.ts +333 -3
  41. package/dist/react/index.js +89 -3
  42. package/dist/registry.d.ts +2 -2
  43. package/dist/registry.js +3 -3
  44. package/dist/types/block-ref.d.ts +26 -0
  45. package/dist/types/block-ref.js +28 -0
  46. package/dist/types/component.d.ts +36 -32
  47. package/dist/types/config.d.ts +1 -1
  48. package/dist/types/image.d.ts +33 -20
  49. package/dist/types/image.js +42 -50
  50. package/dist/types/index.d.ts +1 -0
  51. package/dist/types/index.js +1 -0
  52. package/dist/types/link.d.ts +38 -0
  53. package/dist/types/link.js +58 -0
  54. package/dist/types/media.d.ts +16 -35
  55. package/dist/types/media.js +15 -84
  56. package/dist/types/renderer.d.ts +1 -1
  57. package/dist/types/rich-text.d.ts +40 -0
  58. package/dist/types/rich-text.js +39 -0
  59. package/dist/types/video.d.ts +7 -13
  60. package/dist/types/video.js +3 -3
  61. package/package.json +28 -76
  62. package/src/cli/compile-registry.mjs +120 -63
  63. package/src/cli/validate-content.mjs +38 -75
  64. package/src/types/image.ts +79 -60
  65. package/templates/astro/template/.aci.yaml +27 -0
  66. package/templates/astro/template/.storybook/main.ts +79 -0
  67. package/templates/astro/template/.storybook/manager.ts +6 -0
  68. package/templates/astro/template/.storybook/preview.ts +33 -0
  69. package/templates/astro/template/astro.config.mjs +37 -0
  70. package/templates/astro/template/package.json.tmpl +41 -0
  71. package/templates/astro/template/src/cms/contracts/layouts/index.ts +18 -0
  72. package/templates/astro/template/src/cms/registry.ts +28 -0
  73. package/templates/astro/template/src/components/chrome/Footer.astro +107 -0
  74. package/templates/astro/template/src/components/chrome/Header.astro +94 -0
  75. package/templates/astro/template/src/components/elements/AtomicBlock.astro +15 -0
  76. package/templates/astro/template/src/components/elements/AtomicBlocks.astro +16 -0
  77. package/templates/astro/template/src/components/elements/Button.astro +51 -0
  78. package/templates/astro/template/src/components/elements/ButtonBlock.astro +25 -0
  79. package/templates/astro/template/src/components/elements/Container.astro +11 -0
  80. package/templates/astro/template/src/components/elements/Icon.astro +31 -0
  81. package/templates/astro/template/src/components/elements/Logo.astro +29 -0
  82. package/templates/astro/template/src/components/elements/RemoteImage.astro +41 -0
  83. package/templates/astro/template/src/components/sections/ContainerSection.astro +32 -0
  84. package/templates/astro/template/src/components/sections/FeatureCard.astro +23 -0
  85. package/templates/astro/template/src/components/sections/FeatureGrid.astro +35 -0
  86. package/templates/astro/template/src/components/sections/HomeHero.astro +51 -0
  87. package/templates/astro/template/src/components/sections/StatsBar.astro +33 -0
  88. package/templates/astro/template/src/design-system/styles.css +399 -0
  89. package/templates/astro/template/src/design-system/tokens/colors.css +60 -0
  90. package/templates/astro/template/src/design-system/tokens/components.css +69 -0
  91. package/templates/astro/template/src/design-system/tokens/index.css +6 -0
  92. package/templates/astro/template/src/design-system/tokens/radii.css +5 -0
  93. package/templates/astro/template/src/design-system/tokens/shadows.css +5 -0
  94. package/templates/astro/template/src/design-system/tokens/spacing.css +13 -0
  95. package/templates/astro/template/src/design-system/tokens/typography.css +24 -0
  96. package/templates/astro/template/src/env.d.ts +1 -0
  97. package/templates/astro/template/src/fixtures/atomicBlocks.ts +33 -0
  98. package/templates/astro/template/src/fixtures/composition.ts +31 -0
  99. package/templates/astro/template/src/fixtures/index.ts +17 -0
  100. package/templates/astro/template/src/fixtures/sections.ts +39 -0
  101. package/templates/astro/template/src/layouts/SiteLayout.astro +30 -0
  102. package/templates/astro/template/src/pages/[...slug].astro +61 -0
  103. package/templates/astro/template/src/render/RenderPage.astro +66 -0
  104. package/templates/astro/template/src/stories/CompositionStoryFrame.astro +15 -0
  105. package/templates/astro/template/src/stories/HomeHero.stories.ts +24 -0
  106. package/templates/astro/template/src/stories/SectionStoryFrame.astro +16 -0
  107. package/templates/astro/template/src/stories/StoryDocFrame.astro +31 -0
  108. package/templates/astro/template/tsconfig.json +11 -0
  109. package/templates/common/.agents/AGENTS.md +37 -0
  110. package/templates/common/.agents/skills/aci/SKILL.md +162 -0
  111. package/templates/common/.agents/skills/authoring/SKILL.md +590 -0
  112. package/templates/common/.agents/skills/authoring/references/block-registry.md +151 -0
  113. package/templates/common/.agents/skills/authoring/references/contracts.md +153 -0
  114. package/templates/common/.agents/skills/authoring/references/design-system.md +171 -0
  115. package/templates/common/.agents/skills/authoring/references/image-assets.md +73 -0
  116. package/templates/common/.agents/skills/authoring/references/repo-structure.md +157 -0
  117. package/templates/common/.agents/skills/migration/SKILL.md +160 -0
  118. package/templates/common/.agents/skills/migration/references/analyzing-source.md +215 -0
  119. package/templates/common/.agents/skills/migration/references/component-migration.md +200 -0
  120. package/templates/common/.agents/skills/migration/references/selector-map.md +31 -0
  121. package/templates/common/.content/.gradial-dam/blobs/sha256/7f/bf/7fbfc7fe230ff12688c496f660119e41d9725c4504d82e310c15665c73c09292 +0 -0
  122. package/templates/common/.content/.gradial-dam/blobs/sha256/a0/f5/a0f506689de9b15a7055f70103a3f02cd3ba105771ae2de6754df2ede1210d3a +0 -0
  123. package/templates/common/.content/.gradial-dam/blobs/sha256/dd/b7/ddb7e9642be08317bcd4b2bd26b58ba8d0d34dd7239e03e684a4f3634fa3845b +0 -0
  124. package/templates/common/.content/.gradial-dam/blobs/sha256/fb/32/fb3260e8286ea8231ea1c77b9c0be92d6edd9026565731eb14cfdcfd6b1b75b3 +0 -0
  125. package/templates/common/.content/config/site.json +192 -0
  126. package/templates/common/.content/dam/folders/seed/ast_site_about_hero/asset.json +9 -0
  127. package/templates/common/.content/dam/folders/seed/ast_site_about_hero/editorial.json +14 -0
  128. package/templates/common/.content/dam/folders/seed/ast_site_about_hero/governance.json +23 -0
  129. package/templates/common/.content/dam/folders/seed/ast_site_about_hero/versions/v0001.json +37 -0
  130. package/templates/common/.content/dam/folders/seed/ast_site_home_hero/asset.json +9 -0
  131. package/templates/common/.content/dam/folders/seed/ast_site_home_hero/editorial.json +14 -0
  132. package/templates/common/.content/dam/folders/seed/ast_site_home_hero/governance.json +23 -0
  133. package/templates/common/.content/dam/folders/seed/ast_site_home_hero/versions/v0001.json +37 -0
  134. package/templates/common/.content/fragments/navbar/_index.json +25 -0
  135. package/templates/common/.content/fragments/site-footer/_index.json +62 -0
  136. package/templates/common/.content/pages/about/_index.json +51 -0
  137. package/templates/common/.content/pages/home/_index.json +112 -0
  138. package/templates/common/.content/schemas/site.schema.json +123 -0
  139. package/templates/common/README.md.tmpl +45 -0
  140. package/templates/common/contracts/components/button.contract.ts +19 -0
  141. package/templates/common/contracts/components/container.contract.ts +19 -0
  142. package/templates/common/contracts/components/featureCard.contract.ts +15 -0
  143. package/templates/common/contracts/components/featureGrid.contract.ts +16 -0
  144. package/templates/common/contracts/components/homeHero.contract.ts +36 -0
  145. package/templates/common/contracts/components/index.ts +21 -0
  146. package/templates/common/contracts/components/siteFooter.contract.ts +45 -0
  147. package/templates/common/contracts/components/siteNavigation.contract.ts +30 -0
  148. package/templates/common/contracts/components/statsBar.contract.ts +19 -0
  149. package/templates/common/design-system/styles.css +346 -0
  150. package/templates/common/design-system/tokens/colors.css +110 -0
  151. package/templates/common/design-system/tokens/components.css +86 -0
  152. package/templates/common/design-system/tokens/index.css +6 -0
  153. package/templates/common/design-system/tokens/radii.css +5 -0
  154. package/templates/common/design-system/tokens/shadows.css +9 -0
  155. package/templates/common/design-system/tokens/spacing.css +26 -0
  156. package/templates/common/design-system/tokens/typography.css +32 -0
  157. package/templates/common/eslint-rules/no-raw-tailwind-values.js +127 -0
  158. package/templates/common/public/assets/Dwire-model.png +0 -0
  159. package/templates/common/public/assets/bare-metal-logo.png +0 -0
  160. package/templates/common/public/assets/meridian-logo.svg +8 -0
  161. package/templates/common/public/assets/seattle.avif +0 -0
  162. package/templates/nextjs/template/.aci.yaml +25 -0
  163. package/templates/nextjs/template/.storybook/main.ts +13 -0
  164. package/templates/nextjs/template/.storybook/preview.ts +34 -0
  165. package/templates/nextjs/template/eslint.config.mjs +36 -0
  166. package/templates/nextjs/template/next-env.d.ts +6 -0
  167. package/templates/nextjs/template/next.config.ts +8 -0
  168. package/templates/nextjs/template/package.json.tmpl +46 -0
  169. package/templates/nextjs/template/postcss.config.mjs +7 -0
  170. package/templates/nextjs/template/src/app/[[...slug]]/page.tsx +8 -0
  171. package/templates/nextjs/template/src/app/gradial/assets/[releaseId]/[...path]/route.ts +31 -0
  172. package/templates/nextjs/template/src/app/layout.tsx +29 -0
  173. package/templates/nextjs/template/src/cms/contracts/components/button.contract.ts +19 -0
  174. package/templates/nextjs/template/src/cms/contracts/components/container.contract.ts +20 -0
  175. package/templates/nextjs/template/src/cms/contracts/components/homeHero.contract.ts +36 -0
  176. package/templates/nextjs/template/src/cms/contracts/components/index.ts +15 -0
  177. package/templates/nextjs/template/src/cms/contracts/components/siteFooter.contract.ts +45 -0
  178. package/templates/nextjs/template/src/cms/contracts/components/siteNavigation.contract.ts +30 -0
  179. package/templates/nextjs/template/src/cms/contracts/layouts/index.ts +16 -0
  180. package/templates/nextjs/template/src/cms/registry.ts +28 -0
  181. package/templates/nextjs/template/src/components/chrome/Footer.tsx +86 -0
  182. package/templates/nextjs/template/src/components/chrome/Header.tsx +74 -0
  183. package/templates/nextjs/template/src/components/elements/AtomicBlock.tsx +13 -0
  184. package/templates/nextjs/template/src/components/elements/Button.tsx +40 -0
  185. package/templates/nextjs/template/src/components/elements/ButtonBlock.tsx +18 -0
  186. package/templates/nextjs/template/src/components/elements/Container.tsx +14 -0
  187. package/templates/nextjs/template/src/components/elements/Icon.tsx +29 -0
  188. package/templates/nextjs/template/src/components/elements/Logo.tsx +38 -0
  189. package/templates/nextjs/template/src/components/sections/ContainerSection.tsx +28 -0
  190. package/templates/nextjs/template/src/components/sections/FeatureCard.tsx +25 -0
  191. package/templates/nextjs/template/src/components/sections/FeatureGrid.tsx +36 -0
  192. package/templates/nextjs/template/src/components/sections/HomeHero.tsx +62 -0
  193. package/templates/nextjs/template/src/components/sections/StatsBar.tsx +30 -0
  194. package/templates/nextjs/template/src/middleware.ts +4 -0
  195. package/templates/nextjs/template/src/stories/Button.stories.tsx +38 -0
  196. package/templates/nextjs/template/src/stories/Header.stories.tsx +30 -0
  197. package/templates/nextjs/template/src/stories/HomeHero.stories.tsx +33 -0
  198. package/templates/nextjs/template/tsconfig.json +23 -0
  199. package/templates/nextjs/template/vercel.json +6 -0
  200. package/dist/content/contract.d.ts +0 -83
  201. package/dist/content/contract.js +0 -104
  202. package/dist/content/tailwind-validator.d.ts +0 -6
  203. package/dist/content/tailwind-validator.js +0 -31
  204. package/dist/content/validation.d.ts +0 -108
  205. package/dist/content/validation.js +0 -183
  206. package/dist/react/GradialMedia.d.ts +0 -24
  207. package/dist/react/GradialMedia.js +0 -31
  208. package/dist/react/GradialPicture.d.ts +0 -14
  209. package/dist/react/GradialPicture.js +0 -30
  210. package/dist/react/GradialVideoPlayer.d.ts +0 -13
  211. package/dist/sveltekit/index.d.ts +0 -25
  212. package/dist/sveltekit/index.js +0 -66
  213. package/dist/sveltekit/preview.d.ts +0 -5
  214. package/dist/sveltekit/preview.js +0 -33
  215. package/src/types/component.ts +0 -49
  216. package/src/types/config.ts +0 -37
  217. package/src/types/data.ts +0 -47
  218. package/src/types/index.ts +0 -10
  219. package/src/types/layout.ts +0 -29
  220. package/src/types/media.ts +0 -125
  221. package/src/types/page.ts +0 -47
  222. package/src/types/render-mode.ts +0 -10
  223. package/src/types/renderer.ts +0 -83
  224. 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
+ });