@gradial/aci 0.1.20-preview.3 → 0.1.21

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 (227) 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 +1 -0
  27. package/dist/next/middleware.js +49 -8
  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/preview/core.d.ts +5 -0
  35. package/dist/preview/core.js +1 -1
  36. package/dist/react/Media.d.ts +24 -0
  37. package/dist/react/Media.js +30 -0
  38. package/dist/react/Picture.d.ts +12 -0
  39. package/dist/react/Picture.js +11 -0
  40. package/dist/react/VideoPlayer.d.ts +13 -0
  41. package/dist/react/{GradialVideoPlayer.js → VideoPlayer.js} +6 -5
  42. package/dist/react/index.d.ts +333 -3
  43. package/dist/react/index.js +89 -3
  44. package/dist/registry.d.ts +2 -2
  45. package/dist/registry.js +3 -3
  46. package/dist/types/block-ref.d.ts +26 -0
  47. package/dist/types/block-ref.js +28 -0
  48. package/dist/types/component.d.ts +36 -32
  49. package/dist/types/config.d.ts +1 -1
  50. package/dist/types/image.d.ts +33 -20
  51. package/dist/types/image.js +42 -50
  52. package/dist/types/index.d.ts +1 -0
  53. package/dist/types/index.js +1 -0
  54. package/dist/types/link.d.ts +38 -0
  55. package/dist/types/link.js +58 -0
  56. package/dist/types/media.d.ts +16 -35
  57. package/dist/types/media.js +15 -84
  58. package/dist/types/renderer.d.ts +1 -1
  59. package/dist/types/rich-text.d.ts +40 -0
  60. package/dist/types/rich-text.js +39 -0
  61. package/dist/types/video.d.ts +7 -13
  62. package/dist/types/video.js +3 -3
  63. package/package.json +29 -76
  64. package/src/cli/compile-registry.mjs +120 -63
  65. package/src/cli/validate-content.mjs +38 -75
  66. package/src/types/block-ref.ts +74 -0
  67. package/src/types/image.ts +79 -60
  68. package/templates/astro/template/.aci.yaml +28 -0
  69. package/templates/astro/template/.storybook/main.ts +79 -0
  70. package/templates/astro/template/.storybook/manager.ts +6 -0
  71. package/templates/astro/template/.storybook/preview.ts +33 -0
  72. package/templates/astro/template/astro.config.mjs +37 -0
  73. package/templates/astro/template/package.json.tmpl +41 -0
  74. package/templates/astro/template/src/cms/contracts/layouts/index.ts +18 -0
  75. package/templates/astro/template/src/cms/registry.ts +28 -0
  76. package/templates/astro/template/src/components/chrome/Footer.astro +107 -0
  77. package/templates/astro/template/src/components/chrome/Header.astro +94 -0
  78. package/templates/astro/template/src/components/elements/AtomicBlock.astro +15 -0
  79. package/templates/astro/template/src/components/elements/AtomicBlocks.astro +16 -0
  80. package/templates/astro/template/src/components/elements/Button.astro +51 -0
  81. package/templates/astro/template/src/components/elements/ButtonBlock.astro +25 -0
  82. package/templates/astro/template/src/components/elements/Container.astro +11 -0
  83. package/templates/astro/template/src/components/elements/Icon.astro +31 -0
  84. package/templates/astro/template/src/components/elements/Logo.astro +29 -0
  85. package/templates/astro/template/src/components/elements/RemoteImage.astro +41 -0
  86. package/templates/astro/template/src/components/sections/ContainerSection.astro +32 -0
  87. package/templates/astro/template/src/components/sections/FeatureCard.astro +23 -0
  88. package/templates/astro/template/src/components/sections/FeatureGrid.astro +35 -0
  89. package/templates/astro/template/src/components/sections/HomeHero.astro +51 -0
  90. package/templates/astro/template/src/components/sections/StatsBar.astro +33 -0
  91. package/templates/astro/template/src/design-system/styles.css +399 -0
  92. package/templates/astro/template/src/design-system/tokens/colors.css +60 -0
  93. package/templates/astro/template/src/design-system/tokens/components.css +69 -0
  94. package/templates/astro/template/src/design-system/tokens/index.css +6 -0
  95. package/templates/astro/template/src/design-system/tokens/radii.css +5 -0
  96. package/templates/astro/template/src/design-system/tokens/shadows.css +5 -0
  97. package/templates/astro/template/src/design-system/tokens/spacing.css +13 -0
  98. package/templates/astro/template/src/design-system/tokens/typography.css +24 -0
  99. package/templates/astro/template/src/env.d.ts +1 -0
  100. package/templates/astro/template/src/fixtures/atomicBlocks.ts +33 -0
  101. package/templates/astro/template/src/fixtures/composition.ts +31 -0
  102. package/templates/astro/template/src/fixtures/index.ts +17 -0
  103. package/templates/astro/template/src/fixtures/sections.ts +39 -0
  104. package/templates/astro/template/src/layouts/SiteLayout.astro +30 -0
  105. package/templates/astro/template/src/pages/[...slug].astro +61 -0
  106. package/templates/astro/template/src/render/RenderPage.astro +66 -0
  107. package/templates/astro/template/src/stories/CompositionStoryFrame.astro +15 -0
  108. package/templates/astro/template/src/stories/HomeHero.stories.ts +24 -0
  109. package/templates/astro/template/src/stories/SectionStoryFrame.astro +16 -0
  110. package/templates/astro/template/src/stories/StoryDocFrame.astro +31 -0
  111. package/templates/astro/template/tsconfig.json +11 -0
  112. package/templates/common/.agents/AGENTS.md +37 -0
  113. package/templates/common/.agents/skills/aci/SKILL.md +162 -0
  114. package/templates/common/.agents/skills/authoring/SKILL.md +590 -0
  115. package/templates/common/.agents/skills/authoring/references/block-registry.md +151 -0
  116. package/templates/common/.agents/skills/authoring/references/contracts.md +153 -0
  117. package/templates/common/.agents/skills/authoring/references/design-system.md +171 -0
  118. package/templates/common/.agents/skills/authoring/references/image-assets.md +73 -0
  119. package/templates/common/.agents/skills/authoring/references/repo-structure.md +157 -0
  120. package/templates/common/.agents/skills/migration/SKILL.md +160 -0
  121. package/templates/common/.agents/skills/migration/references/analyzing-source.md +215 -0
  122. package/templates/common/.agents/skills/migration/references/component-migration.md +200 -0
  123. package/templates/common/.agents/skills/migration/references/selector-map.md +31 -0
  124. package/templates/common/.content/.gradial-dam/blobs/sha256/7f/bf/7fbfc7fe230ff12688c496f660119e41d9725c4504d82e310c15665c73c09292 +0 -0
  125. package/templates/common/.content/.gradial-dam/blobs/sha256/a0/f5/a0f506689de9b15a7055f70103a3f02cd3ba105771ae2de6754df2ede1210d3a +0 -0
  126. package/templates/common/.content/.gradial-dam/blobs/sha256/dd/b7/ddb7e9642be08317bcd4b2bd26b58ba8d0d34dd7239e03e684a4f3634fa3845b +0 -0
  127. package/templates/common/.content/.gradial-dam/blobs/sha256/fb/32/fb3260e8286ea8231ea1c77b9c0be92d6edd9026565731eb14cfdcfd6b1b75b3 +0 -0
  128. package/templates/common/.content/config/site.json +192 -0
  129. package/templates/common/.content/dam/folders/seed/ast_site_about_hero/asset.json +9 -0
  130. package/templates/common/.content/dam/folders/seed/ast_site_about_hero/editorial.json +14 -0
  131. package/templates/common/.content/dam/folders/seed/ast_site_about_hero/governance.json +23 -0
  132. package/templates/common/.content/dam/folders/seed/ast_site_about_hero/versions/v0001.json +37 -0
  133. package/templates/common/.content/dam/folders/seed/ast_site_home_hero/asset.json +9 -0
  134. package/templates/common/.content/dam/folders/seed/ast_site_home_hero/editorial.json +14 -0
  135. package/templates/common/.content/dam/folders/seed/ast_site_home_hero/governance.json +23 -0
  136. package/templates/common/.content/dam/folders/seed/ast_site_home_hero/versions/v0001.json +37 -0
  137. package/templates/common/.content/fragments/navbar/_index.json +25 -0
  138. package/templates/common/.content/fragments/site-footer/_index.json +62 -0
  139. package/templates/common/.content/pages/about/_index.json +51 -0
  140. package/templates/common/.content/pages/home/_index.json +112 -0
  141. package/templates/common/.content/schemas/site.schema.json +123 -0
  142. package/templates/common/README.md.tmpl +45 -0
  143. package/templates/common/contracts/components/button.contract.ts +19 -0
  144. package/templates/common/contracts/components/container.contract.ts +19 -0
  145. package/templates/common/contracts/components/featureCard.contract.ts +15 -0
  146. package/templates/common/contracts/components/featureGrid.contract.ts +16 -0
  147. package/templates/common/contracts/components/homeHero.contract.ts +36 -0
  148. package/templates/common/contracts/components/index.ts +21 -0
  149. package/templates/common/contracts/components/siteFooter.contract.ts +45 -0
  150. package/templates/common/contracts/components/siteNavigation.contract.ts +30 -0
  151. package/templates/common/contracts/components/statsBar.contract.ts +19 -0
  152. package/templates/common/design-system/styles.css +346 -0
  153. package/templates/common/design-system/tokens/colors.css +110 -0
  154. package/templates/common/design-system/tokens/components.css +86 -0
  155. package/templates/common/design-system/tokens/index.css +6 -0
  156. package/templates/common/design-system/tokens/radii.css +5 -0
  157. package/templates/common/design-system/tokens/shadows.css +9 -0
  158. package/templates/common/design-system/tokens/spacing.css +26 -0
  159. package/templates/common/design-system/tokens/typography.css +32 -0
  160. package/templates/common/eslint-rules/no-raw-tailwind-values.js +127 -0
  161. package/templates/common/public/assets/Dwire-model.png +0 -0
  162. package/templates/common/public/assets/bare-metal-logo.png +0 -0
  163. package/templates/common/public/assets/meridian-logo.svg +8 -0
  164. package/templates/common/public/assets/seattle.avif +0 -0
  165. package/templates/nextjs/template/.aci.yaml +26 -0
  166. package/templates/nextjs/template/.storybook/main.ts +13 -0
  167. package/templates/nextjs/template/.storybook/preview.ts +34 -0
  168. package/templates/nextjs/template/eslint.config.mjs +36 -0
  169. package/templates/nextjs/template/next-env.d.ts +6 -0
  170. package/templates/nextjs/template/next.config.ts +8 -0
  171. package/templates/nextjs/template/package.json.tmpl +46 -0
  172. package/templates/nextjs/template/postcss.config.mjs +7 -0
  173. package/templates/nextjs/template/src/app/[[...slug]]/page.tsx +8 -0
  174. package/templates/nextjs/template/src/app/gradial/assets/[releaseId]/[...path]/route.ts +31 -0
  175. package/templates/nextjs/template/src/app/layout.tsx +29 -0
  176. package/templates/nextjs/template/src/cms/contracts/components/button.contract.ts +19 -0
  177. package/templates/nextjs/template/src/cms/contracts/components/container.contract.ts +20 -0
  178. package/templates/nextjs/template/src/cms/contracts/components/homeHero.contract.ts +36 -0
  179. package/templates/nextjs/template/src/cms/contracts/components/index.ts +15 -0
  180. package/templates/nextjs/template/src/cms/contracts/components/siteFooter.contract.ts +45 -0
  181. package/templates/nextjs/template/src/cms/contracts/components/siteNavigation.contract.ts +30 -0
  182. package/templates/nextjs/template/src/cms/contracts/layouts/index.ts +16 -0
  183. package/templates/nextjs/template/src/cms/registry.ts +28 -0
  184. package/templates/nextjs/template/src/components/chrome/Footer.tsx +86 -0
  185. package/templates/nextjs/template/src/components/chrome/Header.tsx +74 -0
  186. package/templates/nextjs/template/src/components/elements/AtomicBlock.tsx +13 -0
  187. package/templates/nextjs/template/src/components/elements/Button.tsx +40 -0
  188. package/templates/nextjs/template/src/components/elements/ButtonBlock.tsx +18 -0
  189. package/templates/nextjs/template/src/components/elements/Container.tsx +14 -0
  190. package/templates/nextjs/template/src/components/elements/Icon.tsx +29 -0
  191. package/templates/nextjs/template/src/components/elements/Logo.tsx +38 -0
  192. package/templates/nextjs/template/src/components/sections/ContainerSection.tsx +28 -0
  193. package/templates/nextjs/template/src/components/sections/FeatureCard.tsx +25 -0
  194. package/templates/nextjs/template/src/components/sections/FeatureGrid.tsx +36 -0
  195. package/templates/nextjs/template/src/components/sections/HomeHero.tsx +62 -0
  196. package/templates/nextjs/template/src/components/sections/StatsBar.tsx +30 -0
  197. package/templates/nextjs/template/src/middleware.ts +4 -0
  198. package/templates/nextjs/template/src/stories/Button.stories.tsx +38 -0
  199. package/templates/nextjs/template/src/stories/Header.stories.tsx +30 -0
  200. package/templates/nextjs/template/src/stories/HomeHero.stories.tsx +33 -0
  201. package/templates/nextjs/template/tsconfig.json +23 -0
  202. package/templates/nextjs/template/vercel.json +6 -0
  203. package/dist/content/contract.d.ts +0 -83
  204. package/dist/content/contract.js +0 -104
  205. package/dist/content/tailwind-validator.d.ts +0 -6
  206. package/dist/content/tailwind-validator.js +0 -31
  207. package/dist/content/validation.d.ts +0 -108
  208. package/dist/content/validation.js +0 -183
  209. package/dist/react/GradialMedia.d.ts +0 -24
  210. package/dist/react/GradialMedia.js +0 -31
  211. package/dist/react/GradialPicture.d.ts +0 -14
  212. package/dist/react/GradialPicture.js +0 -30
  213. package/dist/react/GradialVideoPlayer.d.ts +0 -13
  214. package/dist/sveltekit/index.d.ts +0 -25
  215. package/dist/sveltekit/index.js +0 -66
  216. package/dist/sveltekit/preview.d.ts +0 -5
  217. package/dist/sveltekit/preview.js +0 -33
  218. package/src/types/component.ts +0 -49
  219. package/src/types/config.ts +0 -37
  220. package/src/types/data.ts +0 -47
  221. package/src/types/index.ts +0 -10
  222. package/src/types/layout.ts +0 -29
  223. package/src/types/media.ts +0 -125
  224. package/src/types/page.ts +0 -47
  225. package/src/types/render-mode.ts +0 -10
  226. package/src/types/renderer.ts +0 -83
  227. package/src/types/video.ts +0 -66
@@ -0,0 +1,200 @@
1
+ # Component Migration
2
+
3
+ This guide covers building components to spec, visual verification, and
4
+ variance targets during the component development phase.
5
+
6
+ ## Building Components
7
+
8
+ ### Start with global sections
9
+
10
+ Work in this order:
11
+ 1. Header (navigation, branding, ancillary nav, utility buttons)
12
+ 2. Footer (columns, social links, legal links, copyright)
13
+ 3. Page sections (hero, feature grids, CTAs, etc.)
14
+
15
+ ### Atomic before composite
16
+
17
+ Always migrate the smallest reusable unit first:
18
+
19
+ 1. Identify reused elements (buttons, icons, cards, logos)
20
+ 2. Build them as `elements/` components
21
+ 3. Compose sections from elements
22
+
23
+ ### Build new components
24
+
25
+ The default assumption is that **new components will be built.** If you
26
+ finish a section and built no new components, that's a smell — re-inspect
27
+ for missed detail before declaring done.
28
+
29
+ ### Visual description first
30
+
31
+ Before writing component code:
32
+ 1. Describe what you see in prose (layout, colors, spacing, imagery)
33
+ 2. Identify the source CSS class names for the component
34
+ 3. Determine the imagery mode (img child vs background-image)
35
+ 4. Note interactive behavior
36
+
37
+ Then build the component to match the visual description, not the source
38
+ markup.
39
+
40
+ ## Component Tiers
41
+
42
+ Use the three-tier structure:
43
+
44
+ | Tier | Directory | Purpose |
45
+ |------|-----------|---------|
46
+ | elements | `src/components/elements/` | Small reusable UI + atomic content blocks |
47
+ | sections | `src/components/sections/` | Page-level section components |
48
+ | chrome | `src/components/chrome/` | Site chrome (Header, Footer, Nav) |
49
+
50
+ Do not create additional tiers. Three directories are sufficient.
51
+
52
+ ## Header Inventory Checklist
53
+
54
+ Verify every item is present:
55
+ - [ ] Customer logo (image, linked to brandHref)
56
+ - [ ] Ancillary nav (top strip — residential/business switcher, phone, etc.)
57
+ - [ ] Primary nav with hover/click flyouts for sub-links
58
+ - [ ] Utility buttons (Support, Sign In) with icons
59
+ - [ ] Address-availability signup form (if present on source)
60
+ - [ ] Mobile: hamburger on correct side, mobile logo, mobile-nav icons,
61
+ mobile ancillary nav, full-screen drawer behavior
62
+
63
+ **Mobile nav pro-tip:** do NOT try to contort the desktop nav into a
64
+ mobile nav by re-arranging the same elements. Duplicate the nav elements
65
+ for mobile and show/hide via media queries and JS-applied open/closed
66
+ classes. Markup duplication is cheaper than the state machine you'll
67
+ otherwise build.
68
+
69
+ ## Footer Inventory Checklist
70
+
71
+ - [ ] Customer logo
72
+ - [ ] Left column: phone number, address, legal disclaimer, copyright,
73
+ social icon links
74
+ - [ ] Footer nav columns (Company, Products, Support, etc.)
75
+ - [ ] Any sub-footer / accessibility links
76
+
77
+ ## Storybook Stories
78
+
79
+ Build stories for every component/block, including variants and all states
80
+ (hover, mobile-open, signed-in, etc.):
81
+
82
+ ```ts
83
+ // src/stories/HomeHero.stories.ts
84
+ export default {
85
+ title: 'Sections/HomeHero',
86
+ component: HomeHero,
87
+ };
88
+
89
+ export const Default = {
90
+ args: {
91
+ eyebrow: 'Welcome',
92
+ headline: 'Build something great',
93
+ ctaLabel: 'Get started',
94
+ ctaHref: '#start',
95
+ },
96
+ };
97
+
98
+ export const NoEyebrow = {
99
+ args: {
100
+ headline: 'Build something great',
101
+ ctaLabel: 'Get started',
102
+ ctaHref: '#start',
103
+ },
104
+ };
105
+ ```
106
+
107
+ ## Visual Verification
108
+
109
+ ### Phase 3: <10% variance per section
110
+
111
+ 1. Render both source and target at the same viewport size.
112
+ 2. Take screenshots of each section.
113
+ 3. Compare visually and compute variance percentage.
114
+ 4. If over 10%, identify the missing structural element and fix it.
115
+
116
+ Common Phase 3 failures:
117
+ - Missing nav item
118
+ - Missing icon
119
+ - Wrong markup tree (e.g., media-then-body when source is
120
+ background-image overlay)
121
+ - Missing entire section
122
+
123
+ ### Phase 4: <1% variance per element
124
+
125
+ 1. Go element by element (a single button, a single nav link, a single
126
+ heading).
127
+ 2. Inspect applied CSS on the source for each element.
128
+ 3. Copy CSS verbatim when the design system can't express the fidelity.
129
+ 4. Diff, fix one delta, re-diff. Iterate until under 1%.
130
+
131
+ Common Phase 4 failures:
132
+ - Wrong hex color
133
+ - Wrong font weight (source uses 500/600 where you used 400/700)
134
+ - Wrong padding between text elements
135
+ - Missing icon
136
+ - Wrong icon size
137
+ - Missing accent line/underline
138
+ - Wrong border-radius
139
+
140
+ ## CSS Discipline
141
+
142
+ Phase 4 says "copy applied CSS verbatim" — that is the intent, not the
143
+ implementation. The implementation must respect design-token discipline:
144
+
145
+ - **Raw hex colors are banned in component CSS.** If the source uses
146
+ `#002864`, find the matching token or add a new one in
147
+ `src/design-system/tokens/colors.css`.
148
+ - **Raw px/rem/em units are banned in component CSS.** Use existing
149
+ spacing/typography tokens, or add new ones. `px` is permitted for border
150
+ widths and inside `@media` declarations only.
151
+ - **Tokens live in `src/design-system/tokens/`.** Add to these files when
152
+ source values don't map, then reference from component CSS.
153
+
154
+ Workflow for a Phase 4 fix:
155
+ 1. Pull the value via `getComputedStyle`.
156
+ 2. Check if a token exists that matches.
157
+ 3. If not, add the token to the appropriate `tokens/*.css` file.
158
+ 4. Reference the token from the component.
159
+
160
+ ## Images-as-Text Detection
161
+
162
+ Eyebrows, brand wordmarks, and badges that *look like text* are often
163
+ `<img>` elements. Check the DOM:
164
+
165
+ ```javascript
166
+ const eyebrow = document.querySelector('.hero .eyebrow');
167
+ console.log(eyebrow.tagName); // 'IMG' or 'SPAN' or 'DIV'
168
+ ```
169
+
170
+ If it's an `<img>`, treat it as an image in the content model, not text.
171
+
172
+ ## Interactivity Approach
173
+
174
+ Apply interactivity with a light touch:
175
+ - Click through tabs to verify other panes
176
+ - Scroll to verify sticky elements
177
+ - Use class name toggles over markup restructuring
178
+ - Use show/hide variant content based on applied classes
179
+ - Prefer style attributes and class application over drastic markup changes
180
+
181
+ ## Page Section Strategy
182
+
183
+ - Stub sections with base container/column grid first
184
+ - Most layouts should be child blocks within base layout blocks
185
+ - Promote a section to its own section block only when it requires:
186
+ - Interactive elements
187
+ - Animations
188
+ - Dynamic data (product listings, tabs, carousels)
189
+
190
+ ## Responsive Verification
191
+
192
+ Always view pages at multiple viewport sizes (mobile, tablet, desktop)
193
+ before declaring a section complete. Use the source's breakpoint set as
194
+ the reference viewports.
195
+
196
+ ## When to Ask for Clarification
197
+
198
+ - The design system lacks tokens for a clearly important visual element
199
+ - A section's interactivity model is unclear (carousel vs static grid)
200
+ - Content modeling decisions have multiple valid interpretations
@@ -0,0 +1,31 @@
1
+ # Selector Map
2
+
3
+ Maintain a running log mapping every migrated content element to its
4
+ source and target CSS selectors.
5
+
6
+ Location: `artifacts/source-vs-target/selector-map.json`
7
+
8
+ ## Schema
9
+
10
+ ```json
11
+ {
12
+ "sourceUrl": "https://www.example.com/",
13
+ "targetUrl": "http://localhost:3000/",
14
+ "breakpoints": [360, 768, 1024, 1280, 1400],
15
+ "entries": {
16
+ "content/pages/home/_index.json blocks[\"home-hero\"]": {
17
+ "source": ".home-hero",
18
+ "target": ".home-hero",
19
+ "viewport": "both",
20
+ "notes": "eyebrow is an <img>, not text"
21
+ }
22
+ }
23
+ }
24
+ ```
25
+
26
+ ## Rules
27
+
28
+ - Append, don't overwrite. Add new entries as you inspect new elements.
29
+ - Both selectors must be precise.
30
+ - Add an entry the moment you inspect an element.
31
+ - Capture interactivity and animation in notes.
@@ -0,0 +1,192 @@
1
+ {
2
+ "$type": "site",
3
+ "id": "meridian",
4
+ "status": "published",
5
+ "title": "Meridian",
6
+ "domain": "www.meridian.local",
7
+ "defaultLocale": "en-us",
8
+ "locales": ["en-us"],
9
+ "overlayResolution": ["locale", "audience"],
10
+ "brandHref": "/",
11
+ "brandLogo": {
12
+ "src": "/assets/meridian-logo.svg",
13
+ "alt": "Meridian"
14
+ },
15
+ "seo": {
16
+ "title": "Meridian",
17
+ "description": "Global satellite internet from anywhere on Earth.",
18
+ "siteName": "Meridian"
19
+ },
20
+ "navigation": [
21
+ {
22
+ "id": "home",
23
+ "label": "Home",
24
+ "href": "/"
25
+ },
26
+ {
27
+ "id": "plans",
28
+ "label": "Plans",
29
+ "href": "/plans/"
30
+ },
31
+ {
32
+ "id": "devices",
33
+ "label": "Devices",
34
+ "href": "/devices/"
35
+ },
36
+ {
37
+ "id": "business",
38
+ "label": "Business",
39
+ "href": "/business/"
40
+ },
41
+ {
42
+ "id": "blog",
43
+ "label": "Blog",
44
+ "href": "/blog/"
45
+ },
46
+ {
47
+ "id": "about",
48
+ "label": "About",
49
+ "href": "/about/"
50
+ }
51
+ ],
52
+ "utilities": [
53
+ {
54
+ "id": "sign-in",
55
+ "label": "Sign in",
56
+ "href": "/sign-in/",
57
+ "variant": "ghost"
58
+ },
59
+ {
60
+ "id": "contact-sales",
61
+ "label": "Contact sales",
62
+ "href": "/contact-sales/",
63
+ "variant": "primary"
64
+ }
65
+ ],
66
+ "footer": {
67
+ "columns": [
68
+ {
69
+ "id": "products",
70
+ "title": "Products",
71
+ "links": [
72
+ {
73
+ "id": "plans",
74
+ "label": "Plans",
75
+ "href": "/plans/"
76
+ },
77
+ {
78
+ "id": "devices",
79
+ "label": "Devices",
80
+ "href": "/devices/"
81
+ },
82
+ {
83
+ "id": "coverage",
84
+ "label": "Coverage",
85
+ "href": "/coverage/"
86
+ }
87
+ ]
88
+ },
89
+ {
90
+ "id": "solutions",
91
+ "title": "Solutions",
92
+ "links": [
93
+ {
94
+ "id": "business",
95
+ "label": "Business",
96
+ "href": "/business/"
97
+ },
98
+ {
99
+ "id": "maritime",
100
+ "label": "Maritime",
101
+ "href": "/business/maritime/"
102
+ },
103
+ {
104
+ "id": "aerospace",
105
+ "label": "Aerospace",
106
+ "href": "/business/aerospace/"
107
+ }
108
+ ]
109
+ },
110
+ {
111
+ "id": "resources",
112
+ "title": "Resources",
113
+ "links": [
114
+ {
115
+ "id": "blog",
116
+ "label": "Blog",
117
+ "href": "/blog/"
118
+ },
119
+ {
120
+ "id": "documentation",
121
+ "label": "Documentation",
122
+ "href": "/docs/"
123
+ },
124
+ {
125
+ "id": "support",
126
+ "label": "Support",
127
+ "href": "/support/"
128
+ }
129
+ ]
130
+ },
131
+ {
132
+ "id": "company",
133
+ "title": "Company",
134
+ "links": [
135
+ {
136
+ "id": "about",
137
+ "label": "About us",
138
+ "href": "/about/"
139
+ },
140
+ {
141
+ "id": "careers",
142
+ "label": "Careers",
143
+ "href": "/careers/"
144
+ },
145
+ {
146
+ "id": "contact",
147
+ "label": "Contact",
148
+ "href": "/contact/"
149
+ }
150
+ ]
151
+ }
152
+ ],
153
+ "social": [
154
+ {
155
+ "id": "x",
156
+ "label": "X",
157
+ "href": "https://x.com/meridian",
158
+ "icon": "X"
159
+ },
160
+ {
161
+ "id": "linkedin",
162
+ "label": "LinkedIn",
163
+ "href": "https://www.linkedin.com/company/meridian",
164
+ "icon": "in"
165
+ },
166
+ {
167
+ "id": "youtube",
168
+ "label": "YouTube",
169
+ "href": "https://www.youtube.com/meridian",
170
+ "icon": "YT"
171
+ }
172
+ ],
173
+ "legalLinks": [
174
+ {
175
+ "id": "terms",
176
+ "label": "Terms of Service",
177
+ "href": "/terms/"
178
+ },
179
+ {
180
+ "id": "privacy",
181
+ "label": "Privacy Policy",
182
+ "href": "/privacy/"
183
+ },
184
+ {
185
+ "id": "security",
186
+ "label": "Security",
187
+ "href": "/security/"
188
+ }
189
+ ],
190
+ "copyright": "Copyright (c) 2026 Meridian Satellite Networks, Inc. All rights reserved."
191
+ }
192
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "$type": "dam.asset",
3
+ "schemaVersion": 1,
4
+ "assetId": "ast_site_about_hero",
5
+ "createdAt": "2026-06-01T00:00:00Z",
6
+ "createdBy": "local-seed",
7
+ "updatedAt": "2026-06-01T00:00:00Z",
8
+ "updatedBy": "local-seed"
9
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "$type": "dam.editorial",
3
+ "schemaVersion": 1,
4
+ "title": "Meridian about hero",
5
+ "description": "Seeded hero image for the Meridian about page.",
6
+ "altText": "Satellite ground station at twilight",
7
+ "tags": ["meridian", "hero", "ground-station", "satellite"],
8
+ "properties": {
9
+ "source": "unsplash",
10
+ "sourceUrl": "https://images.unsplash.com/photo-1516849841032-87cbac4d88f7?w=1920&q=80"
11
+ },
12
+ "customFields": {},
13
+ "notes": "Downloaded for the local DAM bridge harness."
14
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "$type": "dam.governance",
3
+ "schemaVersion": 1,
4
+ "asset": {
5
+ "status": "active",
6
+ "legalHold": false,
7
+ "retention": {
8
+ "policy": "local-seed"
9
+ },
10
+ "publicationRestriction": "none"
11
+ },
12
+ "versions": {
13
+ "v0001": {
14
+ "status": "approved",
15
+ "approvedAt": "2026-06-01T00:00:00Z",
16
+ "approvedBy": "local-seed",
17
+ "license": {
18
+ "kind": "unsplash-local-fixture"
19
+ },
20
+ "publicationRestriction": "none"
21
+ }
22
+ }
23
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "$type": "dam.assetVersion",
3
+ "schemaVersion": 1,
4
+ "versionId": "v0001",
5
+ "blob": {
6
+ "sha256": "fb3260e8286ea8231ea1c77b9c0be92d6edd9026565731eb14cfdcfd6b1b75b3",
7
+ "key": ".gradial-dam/blobs/sha256/fb/32/fb3260e8286ea8231ea1c77b9c0be92d6edd9026565731eb14cfdcfd6b1b75b3",
8
+ "byteSize": 14255,
9
+ "mime": "image/jpeg",
10
+ "originalFilename": "about-hero.jpg",
11
+ "checksumSource": "server-computed"
12
+ },
13
+ "technical": {
14
+ "dimensions": {
15
+ "width": 1200,
16
+ "height": 600
17
+ },
18
+ "duration": null,
19
+ "exif": {},
20
+ "iptc": {},
21
+ "xmp": {},
22
+ "video": null,
23
+ "audio": null,
24
+ "document": null,
25
+ "analysis": {
26
+ "saliency": null,
27
+ "faces": [],
28
+ "objects": [],
29
+ "segments": [],
30
+ "textRegions": [],
31
+ "logoRegions": [],
32
+ "safeAreas": []
33
+ }
34
+ },
35
+ "createdAt": "2026-06-01T00:00:00Z",
36
+ "createdBy": "local-seed"
37
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "$type": "dam.asset",
3
+ "schemaVersion": 1,
4
+ "assetId": "ast_site_home_hero",
5
+ "createdAt": "2026-06-01T00:00:00Z",
6
+ "createdBy": "local-seed",
7
+ "updatedAt": "2026-06-01T00:00:00Z",
8
+ "updatedBy": "local-seed"
9
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "$type": "dam.editorial",
3
+ "schemaVersion": 1,
4
+ "title": "Meridian home hero",
5
+ "description": "Seeded hero image for the Meridian home page.",
6
+ "altText": "Earth from space with satellite constellation",
7
+ "tags": ["meridian", "hero", "space", "earth"],
8
+ "properties": {
9
+ "source": "unsplash",
10
+ "sourceUrl": "https://images.unsplash.com/photo-1451187580459-43490279c0fa?w=1920&q=80"
11
+ },
12
+ "customFields": {},
13
+ "notes": "Downloaded for the local DAM bridge harness."
14
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "$type": "dam.governance",
3
+ "schemaVersion": 1,
4
+ "asset": {
5
+ "status": "active",
6
+ "legalHold": false,
7
+ "retention": {
8
+ "policy": "local-seed"
9
+ },
10
+ "publicationRestriction": "none"
11
+ },
12
+ "versions": {
13
+ "v0001": {
14
+ "status": "approved",
15
+ "approvedAt": "2026-06-01T00:00:00Z",
16
+ "approvedBy": "local-seed",
17
+ "license": {
18
+ "kind": "unsplash-local-fixture"
19
+ },
20
+ "publicationRestriction": "none"
21
+ }
22
+ }
23
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "$type": "dam.assetVersion",
3
+ "schemaVersion": 1,
4
+ "versionId": "v0001",
5
+ "blob": {
6
+ "sha256": "a0f506689de9b15a7055f70103a3f02cd3ba105771ae2de6754df2ede1210d3a",
7
+ "key": ".gradial-dam/blobs/sha256/a0/f5/a0f506689de9b15a7055f70103a3f02cd3ba105771ae2de6754df2ede1210d3a",
8
+ "byteSize": 15601,
9
+ "mime": "image/jpeg",
10
+ "originalFilename": "home-hero.jpg",
11
+ "checksumSource": "server-computed"
12
+ },
13
+ "technical": {
14
+ "dimensions": {
15
+ "width": 1200,
16
+ "height": 600
17
+ },
18
+ "duration": null,
19
+ "exif": {},
20
+ "iptc": {},
21
+ "xmp": {},
22
+ "video": null,
23
+ "audio": null,
24
+ "document": null,
25
+ "analysis": {
26
+ "saliency": null,
27
+ "faces": [],
28
+ "objects": [],
29
+ "segments": [],
30
+ "textRegions": [],
31
+ "logoRegions": [],
32
+ "safeAreas": []
33
+ }
34
+ },
35
+ "createdAt": "2026-06-01T00:00:00Z",
36
+ "createdBy": "local-seed"
37
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "$type": "fragment",
3
+ "fragmentId": "navbar",
4
+ "component": "site-navigation",
5
+ "props": {
6
+ "brandHref": "/",
7
+ "brandLabel": "Meridian",
8
+ "brandLogo": {
9
+ "src": "/assets/meridian-logo.svg",
10
+ "alt": "Meridian"
11
+ },
12
+ "navigation": [
13
+ { "id": "home", "label": "Home", "href": "/" },
14
+ { "id": "plans", "label": "Plans", "href": "/plans/" },
15
+ { "id": "devices", "label": "Devices", "href": "/devices/" },
16
+ { "id": "business", "label": "Business", "href": "/business/" },
17
+ { "id": "blog", "label": "Blog", "href": "/blog/" },
18
+ { "id": "about", "label": "About", "href": "/about/" }
19
+ ],
20
+ "utilities": [
21
+ { "id": "sign-in", "label": "Sign in", "href": "/sign-in/", "variant": "ghost" },
22
+ { "id": "contact-sales", "label": "Contact sales", "href": "/contact-sales/", "variant": "primary" }
23
+ ]
24
+ }
25
+ }