@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.
- package/README.md +48 -110
- package/bin/{aci → aci-darwin-arm64} +0 -0
- package/bin/aci.js +99 -6
- package/dist/assets/index.d.ts +3 -3
- package/dist/assets/index.js +3 -3
- package/dist/astro/index.d.ts +14 -3
- package/dist/astro/index.js +24 -5
- package/dist/content/assets.d.ts +17 -0
- package/dist/content/assets.js +65 -0
- package/dist/content/index.d.ts +2 -0
- package/dist/content/index.js +2 -0
- package/dist/content/provider.d.ts +19 -0
- package/dist/content/provider.js +7 -0
- package/dist/content/resolve-slots.d.ts +9 -0
- package/dist/content/resolve-slots.js +24 -0
- package/dist/content/types.d.ts +1 -1
- package/dist/define-component.d.ts +1 -2
- package/dist/define-component.js +73 -11
- package/dist/define-layout.d.ts +2 -0
- package/dist/define-layout.js +3 -0
- package/dist/dev/content-watch.d.ts +37 -0
- package/dist/dev/content-watch.js +154 -0
- package/dist/dev/index.d.ts +24 -43
- package/dist/dev/index.js +4 -169
- package/dist/index.d.ts +14 -5
- package/dist/index.js +8 -8
- package/dist/next/asset-route.d.ts +2 -0
- package/dist/next/asset-route.js +12 -4
- package/dist/next/config.d.ts +2 -2
- package/dist/next/config.js +6 -6
- package/dist/next/content-watch.js +6 -1
- package/dist/next/index.d.ts +2 -2
- package/dist/next/index.js +2 -2
- package/dist/next/middleware.d.ts +7 -3
- package/dist/next/middleware.js +12 -7
- package/dist/next/page.d.ts +16 -15
- package/dist/next/page.js +30 -10
- package/dist/next/render.d.ts +5 -0
- package/dist/next/render.js +17 -0
- package/dist/next/root-layout.d.ts +4 -0
- package/dist/next/root-layout.js +5 -0
- package/dist/next/server.d.ts +14 -13
- package/dist/next/server.js +13 -3
- package/dist/providers/file.d.ts +2 -0
- package/dist/providers/file.js +61 -1
- package/dist/providers/s3.d.ts +1 -0
- package/dist/providers/s3.js +14 -1
- package/dist/react/Media.d.ts +24 -0
- package/dist/react/Media.js +30 -0
- package/dist/react/Picture.d.ts +12 -0
- package/dist/react/Picture.js +11 -0
- package/dist/react/VideoPlayer.d.ts +13 -0
- package/dist/react/{GradialVideoPlayer.js → VideoPlayer.js} +6 -5
- package/dist/react/index.d.ts +333 -3
- package/dist/react/index.js +89 -3
- package/dist/registry.d.ts +15 -0
- package/dist/registry.js +10 -0
- package/dist/testing/index.d.ts +3 -0
- package/dist/testing/index.js +15 -2
- package/dist/types/block-ref.d.ts +26 -0
- package/dist/types/block-ref.js +28 -0
- package/dist/types/component.d.ts +36 -41
- package/dist/types/config.d.ts +1 -2
- package/dist/types/image.d.ts +33 -20
- package/dist/types/image.js +42 -50
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.js +1 -0
- package/dist/types/link.d.ts +38 -0
- package/dist/types/link.js +58 -0
- package/dist/types/media.d.ts +16 -35
- package/dist/types/media.js +15 -84
- package/dist/types/page.d.ts +1 -2
- package/dist/types/render-mode.d.ts +0 -1
- package/dist/types/renderer.d.ts +1 -1
- package/dist/types/rich-text.d.ts +40 -0
- package/dist/types/rich-text.js +39 -0
- package/dist/types/video.d.ts +7 -13
- package/dist/types/video.js +3 -3
- package/package.json +32 -74
- package/src/cli/compile-registry.mjs +236 -59
- package/src/cli/validate-content.mjs +38 -75
- package/src/types/image.ts +79 -60
- package/templates/astro/template/.aci.yaml +27 -0
- package/templates/astro/template/.storybook/main.ts +79 -0
- package/templates/astro/template/.storybook/manager.ts +6 -0
- package/templates/astro/template/.storybook/preview.ts +33 -0
- package/templates/astro/template/astro.config.mjs +37 -0
- package/templates/astro/template/package.json.tmpl +41 -0
- package/templates/astro/template/src/cms/contracts/layouts/index.ts +18 -0
- package/templates/astro/template/src/cms/registry.ts +28 -0
- package/templates/astro/template/src/components/chrome/Footer.astro +107 -0
- package/templates/astro/template/src/components/chrome/Header.astro +94 -0
- package/templates/astro/template/src/components/elements/AtomicBlock.astro +15 -0
- package/templates/astro/template/src/components/elements/AtomicBlocks.astro +16 -0
- package/templates/astro/template/src/components/elements/Button.astro +51 -0
- package/templates/astro/template/src/components/elements/ButtonBlock.astro +25 -0
- package/templates/astro/template/src/components/elements/Container.astro +11 -0
- package/templates/astro/template/src/components/elements/Icon.astro +31 -0
- package/templates/astro/template/src/components/elements/Logo.astro +29 -0
- package/templates/astro/template/src/components/elements/RemoteImage.astro +41 -0
- package/templates/astro/template/src/components/sections/ContainerSection.astro +32 -0
- package/templates/astro/template/src/components/sections/FeatureCard.astro +23 -0
- package/templates/astro/template/src/components/sections/FeatureGrid.astro +35 -0
- package/templates/astro/template/src/components/sections/HomeHero.astro +51 -0
- package/templates/astro/template/src/components/sections/StatsBar.astro +33 -0
- package/templates/astro/template/src/design-system/styles.css +399 -0
- package/templates/astro/template/src/design-system/tokens/colors.css +60 -0
- package/templates/astro/template/src/design-system/tokens/components.css +69 -0
- package/templates/astro/template/src/design-system/tokens/index.css +6 -0
- package/templates/astro/template/src/design-system/tokens/radii.css +5 -0
- package/templates/astro/template/src/design-system/tokens/shadows.css +5 -0
- package/templates/astro/template/src/design-system/tokens/spacing.css +13 -0
- package/templates/astro/template/src/design-system/tokens/typography.css +24 -0
- package/templates/astro/template/src/env.d.ts +1 -0
- package/templates/astro/template/src/fixtures/atomicBlocks.ts +33 -0
- package/templates/astro/template/src/fixtures/composition.ts +31 -0
- package/templates/astro/template/src/fixtures/index.ts +17 -0
- package/templates/astro/template/src/fixtures/sections.ts +39 -0
- package/templates/astro/template/src/layouts/SiteLayout.astro +30 -0
- package/templates/astro/template/src/pages/[...slug].astro +61 -0
- package/templates/astro/template/src/render/RenderPage.astro +66 -0
- package/templates/astro/template/src/stories/CompositionStoryFrame.astro +15 -0
- package/templates/astro/template/src/stories/HomeHero.stories.ts +24 -0
- package/templates/astro/template/src/stories/SectionStoryFrame.astro +16 -0
- package/templates/astro/template/src/stories/StoryDocFrame.astro +31 -0
- package/templates/astro/template/tsconfig.json +11 -0
- package/templates/common/.agents/AGENTS.md +37 -0
- package/templates/common/.agents/skills/aci/SKILL.md +162 -0
- package/templates/common/.agents/skills/authoring/SKILL.md +590 -0
- package/templates/common/.agents/skills/authoring/references/block-registry.md +151 -0
- package/templates/common/.agents/skills/authoring/references/contracts.md +153 -0
- package/templates/common/.agents/skills/authoring/references/design-system.md +171 -0
- package/templates/common/.agents/skills/authoring/references/image-assets.md +73 -0
- package/templates/common/.agents/skills/authoring/references/repo-structure.md +157 -0
- package/templates/common/.agents/skills/migration/SKILL.md +160 -0
- package/templates/common/.agents/skills/migration/references/analyzing-source.md +215 -0
- package/templates/common/.agents/skills/migration/references/component-migration.md +200 -0
- package/templates/common/.agents/skills/migration/references/selector-map.md +31 -0
- package/templates/common/.content/.gradial-dam/blobs/sha256/7f/bf/7fbfc7fe230ff12688c496f660119e41d9725c4504d82e310c15665c73c09292 +0 -0
- package/templates/common/.content/.gradial-dam/blobs/sha256/a0/f5/a0f506689de9b15a7055f70103a3f02cd3ba105771ae2de6754df2ede1210d3a +0 -0
- package/templates/common/.content/.gradial-dam/blobs/sha256/dd/b7/ddb7e9642be08317bcd4b2bd26b58ba8d0d34dd7239e03e684a4f3634fa3845b +0 -0
- package/templates/common/.content/.gradial-dam/blobs/sha256/fb/32/fb3260e8286ea8231ea1c77b9c0be92d6edd9026565731eb14cfdcfd6b1b75b3 +0 -0
- package/templates/common/.content/config/site.json +192 -0
- package/templates/common/.content/dam/folders/seed/ast_site_about_hero/asset.json +9 -0
- package/templates/common/.content/dam/folders/seed/ast_site_about_hero/editorial.json +14 -0
- package/templates/common/.content/dam/folders/seed/ast_site_about_hero/governance.json +23 -0
- package/templates/common/.content/dam/folders/seed/ast_site_about_hero/versions/v0001.json +37 -0
- package/templates/common/.content/dam/folders/seed/ast_site_home_hero/asset.json +9 -0
- package/templates/common/.content/dam/folders/seed/ast_site_home_hero/editorial.json +14 -0
- package/templates/common/.content/dam/folders/seed/ast_site_home_hero/governance.json +23 -0
- package/templates/common/.content/dam/folders/seed/ast_site_home_hero/versions/v0001.json +37 -0
- package/templates/common/.content/fragments/navbar/_index.json +25 -0
- package/templates/common/.content/fragments/site-footer/_index.json +62 -0
- package/templates/common/.content/pages/about/_index.json +51 -0
- package/templates/common/.content/pages/home/_index.json +112 -0
- package/templates/common/.content/schemas/site.schema.json +123 -0
- package/templates/common/README.md.tmpl +45 -0
- package/templates/common/contracts/components/button.contract.ts +19 -0
- package/templates/common/contracts/components/container.contract.ts +19 -0
- package/templates/common/contracts/components/featureCard.contract.ts +15 -0
- package/templates/common/contracts/components/featureGrid.contract.ts +16 -0
- package/templates/common/contracts/components/homeHero.contract.ts +36 -0
- package/templates/common/contracts/components/index.ts +21 -0
- package/templates/common/contracts/components/siteFooter.contract.ts +45 -0
- package/templates/common/contracts/components/siteNavigation.contract.ts +30 -0
- package/templates/common/contracts/components/statsBar.contract.ts +19 -0
- package/templates/common/design-system/styles.css +346 -0
- package/templates/common/design-system/tokens/colors.css +110 -0
- package/templates/common/design-system/tokens/components.css +86 -0
- package/templates/common/design-system/tokens/index.css +6 -0
- package/templates/common/design-system/tokens/radii.css +5 -0
- package/templates/common/design-system/tokens/shadows.css +9 -0
- package/templates/common/design-system/tokens/spacing.css +26 -0
- package/templates/common/design-system/tokens/typography.css +32 -0
- package/templates/common/eslint-rules/no-raw-tailwind-values.js +127 -0
- package/templates/common/public/assets/Dwire-model.png +0 -0
- package/templates/common/public/assets/bare-metal-logo.png +0 -0
- package/templates/common/public/assets/meridian-logo.svg +8 -0
- package/templates/common/public/assets/seattle.avif +0 -0
- package/templates/nextjs/template/.aci.yaml +25 -0
- package/templates/nextjs/template/.storybook/main.ts +13 -0
- package/templates/nextjs/template/.storybook/preview.ts +34 -0
- package/templates/nextjs/template/eslint.config.mjs +36 -0
- package/templates/nextjs/template/next-env.d.ts +6 -0
- package/templates/nextjs/template/next.config.ts +8 -0
- package/templates/nextjs/template/package.json.tmpl +46 -0
- package/templates/nextjs/template/postcss.config.mjs +7 -0
- package/templates/nextjs/template/src/app/[[...slug]]/page.tsx +8 -0
- package/templates/nextjs/template/src/app/gradial/assets/[releaseId]/[...path]/route.ts +31 -0
- package/templates/nextjs/template/src/app/layout.tsx +29 -0
- package/templates/nextjs/template/src/cms/contracts/components/button.contract.ts +19 -0
- package/templates/nextjs/template/src/cms/contracts/components/container.contract.ts +20 -0
- package/templates/nextjs/template/src/cms/contracts/components/homeHero.contract.ts +36 -0
- package/templates/nextjs/template/src/cms/contracts/components/index.ts +15 -0
- package/templates/nextjs/template/src/cms/contracts/components/siteFooter.contract.ts +45 -0
- package/templates/nextjs/template/src/cms/contracts/components/siteNavigation.contract.ts +30 -0
- package/templates/nextjs/template/src/cms/contracts/layouts/index.ts +16 -0
- package/templates/nextjs/template/src/cms/registry.ts +28 -0
- package/templates/nextjs/template/src/components/chrome/Footer.tsx +86 -0
- package/templates/nextjs/template/src/components/chrome/Header.tsx +74 -0
- package/templates/nextjs/template/src/components/elements/AtomicBlock.tsx +13 -0
- package/templates/nextjs/template/src/components/elements/Button.tsx +40 -0
- package/templates/nextjs/template/src/components/elements/ButtonBlock.tsx +18 -0
- package/templates/nextjs/template/src/components/elements/Container.tsx +14 -0
- package/templates/nextjs/template/src/components/elements/Icon.tsx +29 -0
- package/templates/nextjs/template/src/components/elements/Logo.tsx +38 -0
- package/templates/nextjs/template/src/components/sections/ContainerSection.tsx +28 -0
- package/templates/nextjs/template/src/components/sections/FeatureCard.tsx +25 -0
- package/templates/nextjs/template/src/components/sections/FeatureGrid.tsx +36 -0
- package/templates/nextjs/template/src/components/sections/HomeHero.tsx +62 -0
- package/templates/nextjs/template/src/components/sections/StatsBar.tsx +30 -0
- package/templates/nextjs/template/src/middleware.ts +4 -0
- package/templates/nextjs/template/src/stories/Button.stories.tsx +38 -0
- package/templates/nextjs/template/src/stories/Header.stories.tsx +30 -0
- package/templates/nextjs/template/src/stories/HomeHero.stories.tsx +33 -0
- package/templates/nextjs/template/tsconfig.json +23 -0
- package/templates/nextjs/template/vercel.json +6 -0
- package/dist/content/cache.test.d.ts +0 -1
- package/dist/content/cache.test.js +0 -86
- package/dist/content/contract.d.ts +0 -83
- package/dist/content/contract.js +0 -104
- package/dist/content/tailwind-validator.d.ts +0 -6
- package/dist/content/tailwind-validator.js +0 -31
- package/dist/content/validation.d.ts +0 -108
- package/dist/content/validation.js +0 -184
- package/dist/next/preview-banner.d.ts +0 -4
- package/dist/next/preview-banner.js +0 -51
- package/dist/next/preview.d.ts +0 -7
- package/dist/next/preview.js +0 -37
- package/dist/react/GradialMedia.d.ts +0 -24
- package/dist/react/GradialMedia.js +0 -31
- package/dist/react/GradialPicture.d.ts +0 -14
- package/dist/react/GradialPicture.js +0 -30
- package/dist/react/GradialVideoPlayer.d.ts +0 -13
- package/dist/sveltekit/index.d.ts +0 -23
- package/dist/sveltekit/index.js +0 -62
- package/dist/sveltekit/preview.d.ts +0 -5
- package/dist/sveltekit/preview.js +0 -33
- package/src/cli/verify-renderer.mjs +0 -73
- package/src/types/component.ts +0 -59
- package/src/types/config.ts +0 -38
- package/src/types/data.ts +0 -47
- package/src/types/index.ts +0 -10
- package/src/types/layout.ts +0 -29
- package/src/types/media.ts +0 -125
- package/src/types/page.ts +0 -48
- package/src/types/render-mode.ts +0 -18
- package/src/types/renderer.ts +0 -83
- 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
|
+
});
|