@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.
- package/README.md +48 -108
- 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 +12 -3
- package/dist/astro/index.js +20 -5
- package/dist/content/assets.d.ts +17 -0
- package/dist/content/assets.js +65 -0
- package/dist/content/index.d.ts +1 -0
- package/dist/content/index.js +1 -0
- package/dist/define-component.d.ts +1 -2
- package/dist/define-component.js +73 -5
- 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 -6
- package/dist/index.js +8 -9
- package/dist/next/asset-route.js +2 -2
- package/dist/next/config.d.ts +2 -2
- package/dist/next/config.js +5 -5
- 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 +1 -0
- package/dist/next/middleware.js +49 -8
- package/dist/next/page.d.ts +1 -1
- package/dist/next/page.js +14 -12
- package/dist/next/render.d.ts +3 -3
- package/dist/next/render.js +11 -9
- package/dist/next/server.d.ts +12 -12
- package/dist/next/server.js +1 -1
- package/dist/preview/core.d.ts +5 -0
- package/dist/preview/core.js +1 -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 +2 -2
- package/dist/registry.js +3 -3
- package/dist/types/block-ref.d.ts +26 -0
- package/dist/types/block-ref.js +28 -0
- package/dist/types/component.d.ts +36 -32
- package/dist/types/config.d.ts +1 -1
- 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/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 +29 -76
- package/src/cli/compile-registry.mjs +120 -63
- package/src/cli/validate-content.mjs +38 -75
- package/src/types/block-ref.ts +74 -0
- package/src/types/image.ts +79 -60
- package/templates/astro/template/.aci.yaml +28 -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 +26 -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/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 -183
- 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 -25
- package/dist/sveltekit/index.js +0 -66
- package/dist/sveltekit/preview.d.ts +0 -5
- package/dist/sveltekit/preview.js +0 -33
- package/src/types/component.ts +0 -49
- package/src/types/config.ts +0 -37
- 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 -47
- package/src/types/render-mode.ts +0 -10
- package/src/types/renderer.ts +0 -83
- 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.
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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,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,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
|
+
}
|