@gradial/aci 0.1.31 → 0.1.33

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 (159) hide show
  1. package/README.md +4 -4
  2. package/bin/aci-darwin-arm64 +0 -0
  3. package/bin/aci.js +29 -31
  4. package/dist/astro/assets.d.ts +46 -0
  5. package/dist/astro/assets.js +51 -0
  6. package/dist/astro/index.d.ts +2 -0
  7. package/dist/astro/index.js +8 -0
  8. package/dist/astro/page.d.ts +88 -0
  9. package/dist/astro/page.js +117 -0
  10. package/dist/dev/content-watch.d.ts +1 -0
  11. package/dist/dev/content-watch.js +1 -1
  12. package/dist/next/config.d.ts +6 -0
  13. package/dist/next/config.js +20 -13
  14. package/dist/next/content-watch.d.ts +1 -0
  15. package/dist/next/content-watch.js +2 -2
  16. package/dist/next/index.d.ts +1 -0
  17. package/dist/next/index.js +1 -0
  18. package/dist/next/middleware.d.ts +3 -2
  19. package/dist/next/middleware.js +40 -7
  20. package/dist/next/page.d.ts +13 -5
  21. package/dist/next/page.js +42 -17
  22. package/dist/next/server.d.ts +1 -1
  23. package/dist/next/server.js +7 -8
  24. package/dist/testing/conformance/checks.d.ts +12 -0
  25. package/dist/testing/conformance/checks.js +483 -0
  26. package/dist/testing/conformance/index.d.ts +3 -0
  27. package/dist/testing/conformance/index.js +2 -0
  28. package/dist/testing/conformance/preset.d.ts +14 -0
  29. package/dist/testing/conformance/preset.js +98 -0
  30. package/dist/testing/conformance/types.d.ts +45 -0
  31. package/dist/testing/conformance/types.js +7 -0
  32. package/package.json +17 -9
  33. package/src/cli/materialize-template.mjs +133 -0
  34. package/src/cli/validate-content.mjs +0 -0
  35. package/src/cli/verify-next-cdn-routes.mjs +10 -19
  36. package/templates/astro/starter-content/src/cms/contracts/components/button.contract.ts +19 -0
  37. package/templates/astro/starter-content/src/cms/contracts/components/container.contract.ts +19 -0
  38. package/templates/astro/starter-content/src/cms/contracts/components/featureCard.contract.ts +15 -0
  39. package/templates/astro/starter-content/src/cms/contracts/components/featureGrid.contract.ts +16 -0
  40. package/templates/astro/starter-content/src/cms/contracts/components/homeHero.contract.ts +36 -0
  41. package/templates/astro/starter-content/src/cms/contracts/components/index.ts +21 -0
  42. package/templates/astro/starter-content/src/cms/contracts/components/statsBar.contract.ts +19 -0
  43. package/templates/astro/starter-content/src/cms/registry.ts +28 -0
  44. package/templates/astro/template/{.aci.yaml → .aci.yaml.tmpl} +1 -1
  45. package/templates/astro/template/README.md.tmpl +53 -0
  46. package/templates/astro/template/gitignore +12 -0
  47. package/templates/astro/template/package.json.tmpl +5 -3
  48. package/templates/astro/template/src/cms/contracts/components/index.ts +3 -0
  49. package/templates/astro/template/src/cms/registry.ts +3 -26
  50. package/templates/astro/template/src/pages/[...slug].astro +13 -35
  51. package/templates/astro/template/tests/conformance.test.ts.tmpl +12 -0
  52. package/templates/common/.agents/AGENTS.md +3 -5
  53. package/templates/common/.agents/skills/aci/SKILL.md +72 -23
  54. package/templates/common/.agents/skills/authoring/SKILL.md +53 -14
  55. package/templates/common/.agents/skills/authoring/references/block-registry.md +109 -15
  56. package/templates/common/.agents/skills/authoring/references/contracts.md +23 -7
  57. package/templates/common/.agents/skills/authoring/references/repo-structure.md +35 -19
  58. package/templates/common/.agents/skills/authoring/references/sdk-server-functions.md +75 -17
  59. package/templates/common/.agents/skills/migration/SKILL.md +7 -1
  60. package/templates/common/.agents/skills/migration/references/canon-migration.md +471 -0
  61. package/templates/common/.content/config/site.json.tmpl +15 -0
  62. package/templates/common/.content/pages/home/_index.json +4 -103
  63. package/templates/common/.nvmrc +1 -0
  64. package/templates/common/README.md.tmpl +32 -11
  65. package/templates/common/contracts/components/index.ts +1 -19
  66. package/templates/common/design-system/tokens/colors.css +34 -10
  67. package/templates/common/starter-content/.content/config/robots.txt +2 -0
  68. package/templates/common/starter-content/.content/pages/home/_index.json +112 -0
  69. package/templates/common/starter-content/.content/schemas/site.schema.json +138 -0
  70. package/templates/nextjs/starter-content/src/cms/contracts/components/container.contract.ts +19 -0
  71. package/templates/nextjs/starter-content/src/cms/contracts/components/featureCard.contract.ts +15 -0
  72. package/templates/nextjs/starter-content/src/cms/contracts/components/featureGrid.contract.ts +16 -0
  73. package/templates/nextjs/starter-content/src/cms/contracts/components/index.ts +21 -0
  74. package/templates/nextjs/starter-content/src/cms/contracts/components/siteFooter.contract.ts +45 -0
  75. package/templates/nextjs/starter-content/src/cms/contracts/components/siteNavigation.contract.ts +30 -0
  76. package/templates/nextjs/starter-content/src/cms/contracts/components/statsBar.contract.ts +19 -0
  77. package/templates/nextjs/starter-content/src/cms/registry.ts +28 -0
  78. package/templates/nextjs/template/{.aci.yaml → .aci.yaml.tmpl} +1 -1
  79. package/templates/nextjs/template/README.md.tmpl +52 -0
  80. package/templates/nextjs/template/gitignore +15 -0
  81. package/templates/nextjs/template/next.config.mjs +1 -6
  82. package/templates/nextjs/template/package.json.tmpl +5 -3
  83. package/templates/nextjs/template/src/app/gradial/assets/[...path]/route.ts +1 -4
  84. package/templates/nextjs/template/src/cms/contracts/components/index.ts +1 -13
  85. package/templates/nextjs/template/src/cms/registry.ts +3 -26
  86. package/templates/nextjs/template/src/design-system/styles.css +346 -0
  87. package/templates/nextjs/template/src/design-system/tokens/colors.css +110 -0
  88. package/templates/nextjs/template/src/design-system/tokens/components.css +86 -0
  89. package/templates/nextjs/template/src/design-system/tokens/index.css +6 -0
  90. package/templates/nextjs/template/src/design-system/tokens/radii.css +5 -0
  91. package/templates/nextjs/template/src/design-system/tokens/shadows.css +9 -0
  92. package/templates/nextjs/template/src/design-system/tokens/spacing.css +26 -0
  93. package/templates/nextjs/template/src/design-system/tokens/typography.css +32 -0
  94. package/templates/nextjs/template/src/middleware.ts.tmpl +12 -0
  95. package/templates/nextjs/template/tests/conformance.test.ts.tmpl +12 -0
  96. package/templates/nextjs/template/src/cms/contracts/components/container.contract.ts +0 -20
  97. package/templates/nextjs/template/src/middleware.ts +0 -7
  98. /package/templates/{nextjs/template → astro/starter-content}/src/cms/contracts/components/siteFooter.contract.ts +0 -0
  99. /package/templates/{nextjs/template → astro/starter-content}/src/cms/contracts/components/siteNavigation.contract.ts +0 -0
  100. /package/templates/astro/{template → starter-content}/src/components/chrome/Footer.astro +0 -0
  101. /package/templates/astro/{template → starter-content}/src/components/chrome/Header.astro +0 -0
  102. /package/templates/astro/{template → starter-content}/src/components/elements/AtomicBlock.astro +0 -0
  103. /package/templates/astro/{template → starter-content}/src/components/elements/AtomicBlocks.astro +0 -0
  104. /package/templates/astro/{template → starter-content}/src/components/elements/Button.astro +0 -0
  105. /package/templates/astro/{template → starter-content}/src/components/elements/ButtonBlock.astro +0 -0
  106. /package/templates/astro/{template → starter-content}/src/components/elements/Container.astro +0 -0
  107. /package/templates/astro/{template → starter-content}/src/components/elements/Icon.astro +0 -0
  108. /package/templates/astro/{template → starter-content}/src/components/elements/Logo.astro +0 -0
  109. /package/templates/astro/{template → starter-content}/src/components/elements/RemoteImage.astro +0 -0
  110. /package/templates/astro/{template → starter-content}/src/components/sections/ContainerSection.astro +0 -0
  111. /package/templates/astro/{template → starter-content}/src/components/sections/FeatureCard.astro +0 -0
  112. /package/templates/astro/{template → starter-content}/src/components/sections/FeatureGrid.astro +0 -0
  113. /package/templates/astro/{template → starter-content}/src/components/sections/HomeHero.astro +0 -0
  114. /package/templates/astro/{template → starter-content}/src/components/sections/StatsBar.astro +0 -0
  115. /package/templates/astro/{template → starter-content}/src/fixtures/atomicBlocks.ts +0 -0
  116. /package/templates/astro/{template → starter-content}/src/fixtures/composition.ts +0 -0
  117. /package/templates/astro/{template → starter-content}/src/fixtures/index.ts +0 -0
  118. /package/templates/astro/{template → starter-content}/src/fixtures/sections.ts +0 -0
  119. /package/templates/astro/{template → starter-content}/src/render/RenderPage.astro +0 -0
  120. /package/templates/astro/{template → starter-content}/src/stories/CompositionStoryFrame.astro +0 -0
  121. /package/templates/astro/{template → starter-content}/src/stories/HomeHero.stories.ts +0 -0
  122. /package/templates/astro/{template → starter-content}/src/stories/SectionStoryFrame.astro +0 -0
  123. /package/templates/astro/{template → starter-content}/src/stories/StoryDocFrame.astro +0 -0
  124. /package/templates/common/{.content → starter-content/.content}/.gradial-dam/blobs/sha256/7f/bf/7fbfc7fe230ff12688c496f660119e41d9725c4504d82e310c15665c73c09292 +0 -0
  125. /package/templates/common/{.content → starter-content/.content}/.gradial-dam/blobs/sha256/a0/f5/a0f506689de9b15a7055f70103a3f02cd3ba105771ae2de6754df2ede1210d3a +0 -0
  126. /package/templates/common/{.content → starter-content/.content}/.gradial-dam/blobs/sha256/dd/b7/ddb7e9642be08317bcd4b2bd26b58ba8d0d34dd7239e03e684a4f3634fa3845b +0 -0
  127. /package/templates/common/{.content → starter-content/.content}/.gradial-dam/blobs/sha256/fb/32/fb3260e8286ea8231ea1c77b9c0be92d6edd9026565731eb14cfdcfd6b1b75b3 +0 -0
  128. /package/templates/common/{.content → starter-content/.content}/config/site.json +0 -0
  129. /package/templates/common/{.content → starter-content/.content}/dam/folders/seed/ast_site_about_hero/asset.json +0 -0
  130. /package/templates/common/{.content → starter-content/.content}/dam/folders/seed/ast_site_about_hero/editorial.json +0 -0
  131. /package/templates/common/{.content → starter-content/.content}/dam/folders/seed/ast_site_about_hero/governance.json +0 -0
  132. /package/templates/common/{.content → starter-content/.content}/dam/folders/seed/ast_site_about_hero/versions/v0001.json +0 -0
  133. /package/templates/common/{.content → starter-content/.content}/dam/folders/seed/ast_site_home_hero/asset.json +0 -0
  134. /package/templates/common/{.content → starter-content/.content}/dam/folders/seed/ast_site_home_hero/editorial.json +0 -0
  135. /package/templates/common/{.content → starter-content/.content}/dam/folders/seed/ast_site_home_hero/governance.json +0 -0
  136. /package/templates/common/{.content → starter-content/.content}/dam/folders/seed/ast_site_home_hero/versions/v0001.json +0 -0
  137. /package/templates/common/{.content → starter-content/.content}/fragments/navbar/_index.json +0 -0
  138. /package/templates/common/{.content → starter-content/.content}/fragments/site-footer/_index.json +0 -0
  139. /package/templates/common/{.content → starter-content/.content}/pages/about/_index.json +0 -0
  140. /package/templates/common/{public → starter-content/public}/assets/Dwire-model.png +0 -0
  141. /package/templates/common/{public → starter-content/public}/assets/seattle.avif +0 -0
  142. /package/templates/nextjs/{template → starter-content}/src/cms/contracts/components/button.contract.ts +0 -0
  143. /package/templates/nextjs/{template → starter-content}/src/cms/contracts/components/homeHero.contract.ts +0 -0
  144. /package/templates/nextjs/{template → starter-content}/src/components/chrome/Footer.tsx +0 -0
  145. /package/templates/nextjs/{template → starter-content}/src/components/chrome/Header.tsx +0 -0
  146. /package/templates/nextjs/{template → starter-content}/src/components/elements/AtomicBlock.tsx +0 -0
  147. /package/templates/nextjs/{template → starter-content}/src/components/elements/Button.tsx +0 -0
  148. /package/templates/nextjs/{template → starter-content}/src/components/elements/ButtonBlock.tsx +0 -0
  149. /package/templates/nextjs/{template → starter-content}/src/components/elements/Container.tsx +0 -0
  150. /package/templates/nextjs/{template → starter-content}/src/components/elements/Icon.tsx +0 -0
  151. /package/templates/nextjs/{template → starter-content}/src/components/elements/Logo.tsx +0 -0
  152. /package/templates/nextjs/{template → starter-content}/src/components/sections/ContainerSection.tsx +0 -0
  153. /package/templates/nextjs/{template → starter-content}/src/components/sections/FeatureCard.tsx +0 -0
  154. /package/templates/nextjs/{template → starter-content}/src/components/sections/FeatureGrid.tsx +0 -0
  155. /package/templates/nextjs/{template → starter-content}/src/components/sections/HomeHero.tsx +0 -0
  156. /package/templates/nextjs/{template → starter-content}/src/components/sections/StatsBar.tsx +0 -0
  157. /package/templates/nextjs/{template → starter-content}/src/stories/Button.stories.tsx +0 -0
  158. /package/templates/nextjs/{template → starter-content}/src/stories/Header.stories.tsx +0 -0
  159. /package/templates/nextjs/{template → starter-content}/src/stories/HomeHero.stories.tsx +0 -0
@@ -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
+ });
@@ -0,0 +1,28 @@
1
+ import { createRegistry } from '@gradial/aci';
2
+ import { homeHeroContract } from './contracts/components/homeHero.contract';
3
+ import { containerContract } from './contracts/components/container.contract';
4
+ import { buttonContract } from './contracts/components/button.contract';
5
+ import { siteNavigationContract } from './contracts/components/siteNavigation.contract';
6
+ import { siteFooterContract } from './contracts/components/siteFooter.contract';
7
+ import { featureGridContract } from './contracts/components/featureGrid.contract';
8
+ import { featureCardContract } from './contracts/components/featureCard.contract';
9
+ import { statsBarContract } from './contracts/components/statsBar.contract';
10
+ import { HomeHero } from '@/components/sections/HomeHero';
11
+ import { ContainerSection } from '@/components/sections/ContainerSection';
12
+ import { ButtonBlock } from '@/components/elements/ButtonBlock';
13
+ import { Header } from '@/components/chrome/Header';
14
+ import { Footer } from '@/components/chrome/Footer';
15
+ import { FeatureGrid } from '@/components/sections/FeatureGrid';
16
+ import { FeatureCard } from '@/components/sections/FeatureCard';
17
+ import { StatsBar } from '@/components/sections/StatsBar';
18
+
19
+ export const registry = createRegistry([
20
+ [homeHeroContract, HomeHero],
21
+ [containerContract, ContainerSection],
22
+ [buttonContract, ButtonBlock],
23
+ [siteNavigationContract, Header],
24
+ [siteFooterContract, Footer],
25
+ [featureGridContract, FeatureGrid],
26
+ [featureCardContract, FeatureCard],
27
+ [statsBarContract, StatsBar],
28
+ ]);
@@ -1,5 +1,5 @@
1
1
  version: "1"
2
- siteId: "site_nextjs"
2
+ siteId: "{{siteName}}"
3
3
  domain: "meridian.local"
4
4
  framework: next
5
5
 
@@ -0,0 +1,52 @@
1
+ # {{siteName}}
2
+
3
+ A Next.js site powered by [ACI](https://docs.gradial.com/aci) (Agentic Content Infrastructure).
4
+
5
+ ## Quick Start
6
+
7
+ ```bash
8
+ npm install
9
+ npm run dev
10
+ ```
11
+
12
+ The dev server starts at `http://localhost:3000`. Content changes in `.content/`
13
+ are picked up automatically via the ACI adapter in `next.config.mjs`.
14
+
15
+ ## Adding Your First Component
16
+
17
+ See `.agents/skills/authoring/SKILL.md` for a step-by-step guide to:
18
+ 1. Define a component contract in `src/cms/contracts/components/`
19
+ 2. Build the React component in `src/components/`
20
+ 3. Register it in `src/cms/registry.ts`
21
+ 4. Add content to `.content/pages/`
22
+
23
+ ## Skills
24
+
25
+ | Skill | When to read |
26
+ |-------|-------------|
27
+ | [aci](.agents/skills/aci/SKILL.md) | Architecture, commands, testing, troubleshooting |
28
+ | [authoring](.agents/skills/authoring/SKILL.md) | Creating content, building components, design tokens |
29
+ | [migration](.agents/skills/migration/SKILL.md) | Migrating an existing site into ACI |
30
+
31
+ ## Commands
32
+
33
+ ```bash
34
+ npm run dev # Start Next.js dev server (auto-compiles content)
35
+ npm run build # Production build
36
+ npm run typecheck # TypeScript type checking
37
+ npm test # Run conformance tests
38
+ npm run content:compile # Compile content into .aci/compiled/
39
+ ```
40
+
41
+ ## Project Structure
42
+
43
+ ```
44
+ .aci.yaml ACI config (siteId, framework, routes)
45
+ .content/ Content source (JSON pages, config, fragments)
46
+ src/cms/ Contracts and component registry
47
+ src/components/ Runtime React components
48
+ src/design-system/ Design tokens and global styles
49
+ src/app/ Next.js App Router pages and routes
50
+ src/middleware.ts ACI middleware (siteId, release routing)
51
+ .agents/skills/ Skills for humans and agents
52
+ ```
@@ -0,0 +1,15 @@
1
+ /.next/
2
+ /node_modules/
3
+ /out/
4
+ /.aci/compiled/
5
+ /.baremetal/
6
+ /.vercel/
7
+ *.log
8
+ *.tsbuildinfo
9
+ .env
10
+ .env.*
11
+ .DS_Store
12
+ .vercel
13
+ /storybook-static/
14
+ pnpm-lock.yaml
15
+ pnpm-workspace.yaml
@@ -1,8 +1,3 @@
1
1
  import { withAci } from '@gradial/aci/next/config';
2
2
 
3
- const nextConfig = {
4
- output: 'standalone',
5
- reactStrictMode: true,
6
- };
7
-
8
- export default withAci(nextConfig);
3
+ export default withAci();
@@ -8,14 +8,16 @@
8
8
  "build": "next build",
9
9
  "preview": "next start -H 0.0.0.0",
10
10
  "typecheck": "tsc --noEmit",
11
- "aci:compile": "node ./node_modules/@gradial/aci/bin/aci.js content compile --content ./.content --out ./.aci",
11
+ "test": "node --import tsx --test tests/**/*.test.ts",
12
12
  "content:compile": "node ./node_modules/@gradial/aci/bin/aci.js content compile --content ./.content --out ./.aci/compiled",
13
- "aci:doctor": "node ./node_modules/@gradial/aci/bin/aci.js doctor",
14
- "aci:validate": "node ./node_modules/@gradial/aci/bin/aci.js doctor",
15
13
  "lint": "eslint .",
16
14
  "storybook": "storybook dev -p 6006",
17
15
  "build:storybook": "storybook build"
18
16
  },
17
+ "engines": {
18
+ "node": ">=22",
19
+ "npm": ">=10"
20
+ },
19
21
  "dependencies": {
20
22
  "@gradial/aci": "{{aciVersion}}",
21
23
  "next": "^15.1.6",
@@ -1,4 +1 @@
1
- export { GET } from '@gradial/aci/next/asset-route';
2
-
3
- export const runtime = 'nodejs';
4
- export const dynamic = 'force-dynamic';
1
+ export { GET, runtime, dynamic } from '@gradial/aci/next/asset-route';
@@ -1,15 +1,3 @@
1
- import { buttonContract } from './button.contract';
2
- import { containerContract } from './container.contract';
3
- import { homeHeroContract } from './homeHero.contract';
4
- import { siteNavigationContract } from './siteNavigation.contract';
5
- import { siteFooterContract } from './siteFooter.contract';
6
-
7
- const componentContracts = [
8
- homeHeroContract,
9
- containerContract,
10
- buttonContract,
11
- siteNavigationContract,
12
- siteFooterContract,
13
- ];
1
+ const componentContracts: readonly unknown[] = [];
14
2
 
15
3
  export default componentContracts;
@@ -1,28 +1,5 @@
1
1
  import { createRegistry } from '@gradial/aci';
2
- import { homeHeroContract } from './contracts/components/homeHero.contract';
3
- import { containerContract } from './contracts/components/container.contract';
4
- import { buttonContract } from './contracts/components/button.contract';
5
- import { siteNavigationContract } from './contracts/components/siteNavigation.contract';
6
- import { siteFooterContract } from './contracts/components/siteFooter.contract';
7
- import { featureGridContract } from './contracts/components/featureGrid.contract';
8
- import { featureCardContract } from './contracts/components/featureCard.contract';
9
- import { statsBarContract } from './contracts/components/statsBar.contract';
10
- import { HomeHero } from '@/components/sections/HomeHero';
11
- import { ContainerSection } from '@/components/sections/ContainerSection';
12
- import { ButtonBlock } from '@/components/elements/ButtonBlock';
13
- import { Header } from '@/components/chrome/Header';
14
- import { Footer } from '@/components/chrome/Footer';
15
- import { FeatureGrid } from '@/components/sections/FeatureGrid';
16
- import { FeatureCard } from '@/components/sections/FeatureCard';
17
- import { StatsBar } from '@/components/sections/StatsBar';
18
2
 
19
- export const registry = createRegistry([
20
- [homeHeroContract, HomeHero],
21
- [containerContract, ContainerSection],
22
- [buttonContract, ButtonBlock],
23
- [siteNavigationContract, Header],
24
- [siteFooterContract, Footer],
25
- [featureGridContract, FeatureGrid],
26
- [featureCardContract, FeatureCard],
27
- [statsBarContract, StatsBar],
28
- ]);
3
+ // Register your [contract, component] pairs here.
4
+ // See .agents/skills/authoring/SKILL.md for how to add components.
5
+ export const registry = createRegistry([]);
@@ -0,0 +1,346 @@
1
+ @import "tailwindcss" source(none);
2
+ @import "./tokens/index.css";
3
+
4
+ @source "../**/*.{astro,tsx,svelte,ts,jsx}";
5
+ @source "../../.content/**/*.json";
6
+
7
+ :root {
8
+ color-scheme: light;
9
+ }
10
+
11
+ [dir="rtl"] {
12
+ --gradient-hero-overlay: var(--gradient-hero-overlay-rtl);
13
+ }
14
+
15
+ .theme-auto,
16
+ .theme-light {
17
+ color: var(--color-fg);
18
+ --color-fg: var(--color-text-primary);
19
+ --color-fg-muted: var(--color-text-secondary);
20
+ --color-surface-default: var(--color-white);
21
+ --color-surface-raised-default: var(--color-surface-100);
22
+ --color-edge: var(--color-border-default);
23
+ --color-icon-default: var(--color-text-tertiary);
24
+ --color-link-hover: var(--color-brand-600);
25
+ --color-callout-icon-bg-default: var(--color-callout-icon-bg-light);
26
+ --rich-text-quote-bg-default: var(--rich-text-quote-bg);
27
+ --rich-text-inline-code-bg-default: var(--rich-text-inline-code-bg);
28
+ --shadow-card-default: var(--shadow-card);
29
+ --gradient-cta-default: var(--gradient-cta);
30
+
31
+ --button-primary-bg: var(--color-accent-primary);
32
+ --button-primary-text: var(--color-white);
33
+ --button-primary-border: var(--color-accent-primary);
34
+ --button-primary-hover-bg: var(--color-brand-500);
35
+ --button-primary-hover-border: var(--color-brand-500);
36
+
37
+ --button-secondary-bg: var(--color-surface-100);
38
+ --button-secondary-text: var(--color-text-primary);
39
+ --button-secondary-border: var(--color-surface-200);
40
+
41
+ --button-outline-bg: transparent;
42
+ --button-outline-text: var(--color-text-primary);
43
+ --button-outline-border: var(--color-border-strong);
44
+
45
+ --button-tertiary-text: var(--color-accent-primary);
46
+ }
47
+
48
+ .theme-dark {
49
+ color: var(--color-fg);
50
+ color-scheme: dark;
51
+ --color-fg: var(--color-text-inverse);
52
+ --color-fg-muted: var(--color-surface-300);
53
+ --color-surface-default: var(--color-surface-900);
54
+ --color-surface-raised-default: var(--color-surface-800);
55
+ --color-chrome-surface-default: var(--color-surface-900);
56
+ --color-edge: var(--color-border-inverse);
57
+ --color-icon-default: var(--color-surface-400);
58
+ --color-link-hover: var(--color-brand-400);
59
+ --color-callout-icon-bg-default: var(--color-callout-icon-bg-dark);
60
+ --rich-text-quote-bg-default: var(--rich-text-quote-bg-dark);
61
+ --rich-text-inline-code-bg-default: var(--rich-text-inline-code-bg-dark);
62
+ --shadow-card-default: var(--shadow-card-dark);
63
+ --gradient-cta-default: var(--gradient-cta-dark);
64
+
65
+ --button-primary-bg: var(--color-brand-500);
66
+ --button-primary-text: var(--color-white);
67
+ --button-primary-border: var(--color-brand-500);
68
+ --button-primary-hover-bg: var(--color-brand-400);
69
+ --button-primary-hover-border: var(--color-brand-400);
70
+
71
+ --button-secondary-bg: var(--color-surface-800);
72
+ --button-secondary-text: var(--color-white);
73
+ --button-secondary-border: var(--color-surface-700);
74
+
75
+ --button-outline-bg: transparent;
76
+ --button-outline-text: var(--color-white);
77
+ --button-outline-border: var(--color-border-inverse);
78
+
79
+ --button-tertiary-text: var(--color-brand-400);
80
+ }
81
+
82
+ .theme-accent {
83
+ color: var(--color-fg);
84
+ --color-fg: var(--color-white);
85
+ --color-fg-muted: var(--color-surface-300);
86
+ --color-surface-default: var(--color-surface-800);
87
+ --color-surface-raised-default: var(--color-surface-700);
88
+ --color-edge: var(--color-border-inverse);
89
+ --color-icon-default: var(--color-white);
90
+ --color-link-hover: var(--color-warm-400);
91
+ --gradient-cta-default: var(--gradient-cta);
92
+ }
93
+
94
+ .bm-header {
95
+ background: var(--header-bg);
96
+ backdrop-filter: blur(12px);
97
+ -webkit-backdrop-filter: blur(12px);
98
+ --color-fg: var(--header-text);
99
+ --color-fg-muted: var(--header-muted);
100
+ --color-edge: var(--header-border);
101
+ --color-link-hover: var(--header-link-hover);
102
+ --color-icon-default: var(--header-icon);
103
+ --button-secondary-text: var(--color-text-primary);
104
+ --button-secondary-border: var(--color-surface-200);
105
+ --button-outline-text: var(--color-text-primary);
106
+ --button-outline-border: var(--header-border);
107
+ --button-tertiary-text: var(--color-accent-primary);
108
+ }
109
+
110
+ .bm-footer {
111
+ color: var(--footer-text);
112
+ background: var(--footer-bg);
113
+ --color-fg: var(--footer-text);
114
+ --color-fg-muted: var(--footer-muted);
115
+ --color-edge: var(--footer-border);
116
+ --color-link-hover: var(--footer-link-hover);
117
+ --color-icon-default: var(--footer-muted);
118
+ --button-primary-bg: var(--color-accent-primary);
119
+ --button-primary-text: var(--color-white);
120
+ --button-primary-border: var(--color-accent-primary);
121
+ --button-secondary-text: var(--color-text-primary);
122
+ --button-secondary-border: var(--color-surface-200);
123
+ --button-outline-text: var(--color-text-primary);
124
+ --button-outline-border: var(--footer-border);
125
+ --button-tertiary-text: var(--color-accent-primary);
126
+ }
127
+
128
+ @media (min-width: 1024px) {
129
+ .footer-main-grid {
130
+ grid-template-columns: 1fr 2fr;
131
+ }
132
+ }
133
+
134
+ .bm-mobile-nav {
135
+ color: var(--mobile-nav-text);
136
+ background: var(--mobile-nav-bg);
137
+ --color-fg: var(--mobile-nav-text);
138
+ --color-fg-muted: var(--mobile-nav-muted);
139
+ --color-edge: var(--mobile-nav-border);
140
+ --color-link-hover: var(--mobile-nav-link-hover);
141
+ --color-icon-default: var(--mobile-nav-muted);
142
+ --button-primary-bg: var(--color-accent-primary);
143
+ --button-primary-text: var(--color-white);
144
+ --button-primary-border: var(--color-accent-primary);
145
+ --button-secondary-text: var(--color-text-primary);
146
+ --button-secondary-border: var(--color-surface-200);
147
+ --button-outline-text: var(--color-text-primary);
148
+ --button-outline-border: var(--mobile-nav-border);
149
+ --button-tertiary-text: var(--color-accent-primary);
150
+ }
151
+
152
+ * {
153
+ box-sizing: border-box;
154
+ }
155
+
156
+ html {
157
+ scroll-behavior: smooth;
158
+ }
159
+
160
+ body {
161
+ margin: 0;
162
+ min-width: 320px;
163
+ background: var(--color-page);
164
+ color: var(--color-fg);
165
+ font-family: var(--font-family-base);
166
+ font-size: var(--text-size-body);
167
+ line-height: var(--leading-body);
168
+ -webkit-font-smoothing: antialiased;
169
+ text-rendering: optimizeLegibility;
170
+ }
171
+
172
+ button,
173
+ input,
174
+ select,
175
+ textarea {
176
+ font: inherit;
177
+ }
178
+
179
+ img,
180
+ svg {
181
+ display: block;
182
+ }
183
+
184
+ :focus-visible {
185
+ outline: 0.125rem solid var(--color-focus);
186
+ outline-offset: 0.125rem;
187
+ }
188
+
189
+ @layer base {
190
+ a {
191
+ color: inherit;
192
+ text-decoration: none;
193
+ }
194
+
195
+
196
+ h1, h2, h3, h4, h5, h6 {
197
+ margin-block: 0;
198
+ color: var(--color-fg);
199
+ font-family: var(--font-family-heading);
200
+ font-weight: var(--font-weight-semibold);
201
+ line-height: var(--leading-heading);
202
+ }
203
+
204
+ h1 {
205
+ font-size: var(--text-size-h1-mobile);
206
+ font-weight: var(--font-weight-bold);
207
+ line-height: var(--leading-tight);
208
+ letter-spacing: var(--letter-spacing-tight);
209
+ }
210
+
211
+ h2 { font-size: var(--text-size-h2-mobile); }
212
+ h3 { font-size: var(--text-size-h3); }
213
+ h4 { font-size: var(--text-size-h4); }
214
+ h5 { font-size: var(--text-size-body-large); }
215
+ h6 { font-size: var(--text-size-body); }
216
+
217
+ @media (min-width: 768px) {
218
+ h1 { font-size: var(--text-size-h1); }
219
+ h2 { font-size: var(--text-size-h2); }
220
+ }
221
+
222
+ p, ul, ol, blockquote, pre {
223
+ margin-block: 0;
224
+ }
225
+
226
+ ul { list-style: disc; padding-left: 1.4em; }
227
+ ol { list-style: decimal; padding-left: 1.4em; }
228
+ }
229
+
230
+ /* Rich text styles */
231
+ .bm-rich-text-section {
232
+ background: var(--color-surface-default);
233
+ padding: var(--spacing-section-y) var(--spacing-container);
234
+ }
235
+
236
+ .bm-rich-text-section--quiet {
237
+ background: var(--color-surface-muted);
238
+ }
239
+
240
+ .bm-rich-text {
241
+ max-width: var(--max-width-rich-text);
242
+ margin-inline: auto;
243
+ color: var(--color-fg);
244
+ }
245
+
246
+ .bm-rich-text--wide {
247
+ max-width: var(--max-width-rich-text-wide);
248
+ }
249
+
250
+ .bm-rich-text__eyebrow {
251
+ margin: 0 0 1rem;
252
+ color: var(--color-accent-primary);
253
+ font-size: var(--text-size-eyebrow);
254
+ font-weight: var(--font-weight-bold);
255
+ letter-spacing: var(--letter-spacing-label);
256
+ text-transform: uppercase;
257
+ }
258
+
259
+ .bm-rich-text__heading {
260
+ margin: 0;
261
+ color: var(--color-fg);
262
+ font-family: var(--font-family-heading);
263
+ font-size: var(--text-size-h2-mobile);
264
+ font-weight: var(--font-weight-semibold);
265
+ line-height: var(--leading-heading);
266
+ }
267
+
268
+ .bm-rich-text__body {
269
+ margin-top: var(--rich-text-heading-space);
270
+ color: var(--color-fg);
271
+ font-size: var(--text-size-body-large);
272
+ line-height: var(--leading-relaxed);
273
+ }
274
+
275
+ .bm-rich-text__body--inline {
276
+ margin-top: 0;
277
+ }
278
+
279
+ .bm-rich-text__body > * {
280
+ margin-block: 0;
281
+ }
282
+
283
+ .bm-rich-text__body > * + * {
284
+ margin-top: var(--rich-text-flow-space);
285
+ }
286
+
287
+ .bm-rich-text__body h2,
288
+ .bm-rich-text__body h3,
289
+ .bm-rich-text__body h4 {
290
+ color: var(--color-fg);
291
+ font-family: var(--font-family-heading);
292
+ font-weight: var(--font-weight-semibold);
293
+ line-height: var(--leading-heading);
294
+ }
295
+
296
+ .bm-rich-text__body h2 {
297
+ font-size: var(--text-size-h3);
298
+ }
299
+
300
+ .bm-rich-text__body h3,
301
+ .bm-rich-text__body h4 {
302
+ font-size: var(--text-size-body-large);
303
+ }
304
+
305
+ .bm-rich-text__body a {
306
+ color: var(--color-link-hover);
307
+ font-weight: var(--font-weight-semibold);
308
+ text-decoration: underline;
309
+ text-decoration-thickness: var(--rich-text-link-decoration-thickness);
310
+ text-underline-offset: var(--rich-text-link-underline-offset);
311
+ }
312
+
313
+ .bm-rich-text__body ul {
314
+ list-style: disc;
315
+ padding-left: var(--rich-text-list-indent);
316
+ }
317
+
318
+ .bm-rich-text__body ol {
319
+ list-style: decimal;
320
+ padding-left: var(--rich-text-list-indent);
321
+ }
322
+
323
+ .bm-rich-text__body li + li {
324
+ margin-top: 0.75rem;
325
+ }
326
+
327
+ .bm-rich-text__body blockquote {
328
+ border-left: var(--rich-text-blockquote-border-width) solid var(--rich-text-quote-border);
329
+ background: var(--rich-text-quote-bg-default);
330
+ padding: 1.25rem 1.5rem;
331
+ font-weight: var(--font-weight-medium);
332
+ }
333
+
334
+ .bm-rich-text__body code {
335
+ border-radius: 0.25rem;
336
+ background: var(--rich-text-inline-code-bg-default);
337
+ color: var(--rich-text-inline-code-text);
338
+ font-size: var(--text-size-caption);
339
+ padding: var(--rich-text-inline-code-padding);
340
+ }
341
+
342
+ @media (min-width: 768px) {
343
+ .bm-rich-text__heading {
344
+ font-size: var(--text-size-h2);
345
+ }
346
+ }