@gradial/aci 0.1.20-preview.3 → 0.1.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/README.md +48 -108
  2. package/bin/{aci → aci-darwin-arm64} +0 -0
  3. package/bin/aci.js +99 -6
  4. package/dist/assets/index.d.ts +3 -3
  5. package/dist/assets/index.js +3 -3
  6. package/dist/astro/index.d.ts +12 -3
  7. package/dist/astro/index.js +20 -5
  8. package/dist/content/assets.d.ts +17 -0
  9. package/dist/content/assets.js +65 -0
  10. package/dist/content/index.d.ts +1 -0
  11. package/dist/content/index.js +1 -0
  12. package/dist/define-component.d.ts +1 -2
  13. package/dist/define-component.js +73 -5
  14. package/dist/dev/content-watch.d.ts +37 -0
  15. package/dist/dev/content-watch.js +154 -0
  16. package/dist/dev/index.d.ts +24 -43
  17. package/dist/dev/index.js +4 -169
  18. package/dist/index.d.ts +14 -6
  19. package/dist/index.js +8 -9
  20. package/dist/next/asset-route.js +2 -2
  21. package/dist/next/config.d.ts +2 -2
  22. package/dist/next/config.js +5 -5
  23. package/dist/next/content-watch.js +6 -1
  24. package/dist/next/index.d.ts +2 -2
  25. package/dist/next/index.js +2 -2
  26. package/dist/next/middleware.d.ts +2 -2
  27. package/dist/next/middleware.js +6 -6
  28. package/dist/next/page.d.ts +1 -1
  29. package/dist/next/page.js +14 -12
  30. package/dist/next/render.d.ts +3 -3
  31. package/dist/next/render.js +11 -9
  32. package/dist/next/server.d.ts +12 -12
  33. package/dist/next/server.js +1 -1
  34. package/dist/react/Media.d.ts +24 -0
  35. package/dist/react/Media.js +30 -0
  36. package/dist/react/Picture.d.ts +12 -0
  37. package/dist/react/Picture.js +11 -0
  38. package/dist/react/VideoPlayer.d.ts +13 -0
  39. package/dist/react/{GradialVideoPlayer.js → VideoPlayer.js} +6 -5
  40. package/dist/react/index.d.ts +333 -3
  41. package/dist/react/index.js +89 -3
  42. package/dist/registry.d.ts +2 -2
  43. package/dist/registry.js +3 -3
  44. package/dist/types/block-ref.d.ts +26 -0
  45. package/dist/types/block-ref.js +28 -0
  46. package/dist/types/component.d.ts +36 -32
  47. package/dist/types/config.d.ts +1 -1
  48. package/dist/types/image.d.ts +33 -20
  49. package/dist/types/image.js +42 -50
  50. package/dist/types/index.d.ts +1 -0
  51. package/dist/types/index.js +1 -0
  52. package/dist/types/link.d.ts +38 -0
  53. package/dist/types/link.js +58 -0
  54. package/dist/types/media.d.ts +16 -35
  55. package/dist/types/media.js +15 -84
  56. package/dist/types/renderer.d.ts +1 -1
  57. package/dist/types/rich-text.d.ts +40 -0
  58. package/dist/types/rich-text.js +39 -0
  59. package/dist/types/video.d.ts +7 -13
  60. package/dist/types/video.js +3 -3
  61. package/package.json +28 -76
  62. package/src/cli/compile-registry.mjs +120 -63
  63. package/src/cli/validate-content.mjs +38 -75
  64. package/src/types/image.ts +79 -60
  65. package/templates/astro/template/.aci.yaml +27 -0
  66. package/templates/astro/template/.storybook/main.ts +79 -0
  67. package/templates/astro/template/.storybook/manager.ts +6 -0
  68. package/templates/astro/template/.storybook/preview.ts +33 -0
  69. package/templates/astro/template/astro.config.mjs +37 -0
  70. package/templates/astro/template/package.json.tmpl +41 -0
  71. package/templates/astro/template/src/cms/contracts/layouts/index.ts +18 -0
  72. package/templates/astro/template/src/cms/registry.ts +28 -0
  73. package/templates/astro/template/src/components/chrome/Footer.astro +107 -0
  74. package/templates/astro/template/src/components/chrome/Header.astro +94 -0
  75. package/templates/astro/template/src/components/elements/AtomicBlock.astro +15 -0
  76. package/templates/astro/template/src/components/elements/AtomicBlocks.astro +16 -0
  77. package/templates/astro/template/src/components/elements/Button.astro +51 -0
  78. package/templates/astro/template/src/components/elements/ButtonBlock.astro +25 -0
  79. package/templates/astro/template/src/components/elements/Container.astro +11 -0
  80. package/templates/astro/template/src/components/elements/Icon.astro +31 -0
  81. package/templates/astro/template/src/components/elements/Logo.astro +29 -0
  82. package/templates/astro/template/src/components/elements/RemoteImage.astro +41 -0
  83. package/templates/astro/template/src/components/sections/ContainerSection.astro +32 -0
  84. package/templates/astro/template/src/components/sections/FeatureCard.astro +23 -0
  85. package/templates/astro/template/src/components/sections/FeatureGrid.astro +35 -0
  86. package/templates/astro/template/src/components/sections/HomeHero.astro +51 -0
  87. package/templates/astro/template/src/components/sections/StatsBar.astro +33 -0
  88. package/templates/astro/template/src/design-system/styles.css +399 -0
  89. package/templates/astro/template/src/design-system/tokens/colors.css +60 -0
  90. package/templates/astro/template/src/design-system/tokens/components.css +69 -0
  91. package/templates/astro/template/src/design-system/tokens/index.css +6 -0
  92. package/templates/astro/template/src/design-system/tokens/radii.css +5 -0
  93. package/templates/astro/template/src/design-system/tokens/shadows.css +5 -0
  94. package/templates/astro/template/src/design-system/tokens/spacing.css +13 -0
  95. package/templates/astro/template/src/design-system/tokens/typography.css +24 -0
  96. package/templates/astro/template/src/env.d.ts +1 -0
  97. package/templates/astro/template/src/fixtures/atomicBlocks.ts +33 -0
  98. package/templates/astro/template/src/fixtures/composition.ts +31 -0
  99. package/templates/astro/template/src/fixtures/index.ts +17 -0
  100. package/templates/astro/template/src/fixtures/sections.ts +39 -0
  101. package/templates/astro/template/src/layouts/SiteLayout.astro +30 -0
  102. package/templates/astro/template/src/pages/[...slug].astro +61 -0
  103. package/templates/astro/template/src/render/RenderPage.astro +66 -0
  104. package/templates/astro/template/src/stories/CompositionStoryFrame.astro +15 -0
  105. package/templates/astro/template/src/stories/HomeHero.stories.ts +24 -0
  106. package/templates/astro/template/src/stories/SectionStoryFrame.astro +16 -0
  107. package/templates/astro/template/src/stories/StoryDocFrame.astro +31 -0
  108. package/templates/astro/template/tsconfig.json +11 -0
  109. package/templates/common/.agents/AGENTS.md +37 -0
  110. package/templates/common/.agents/skills/aci/SKILL.md +162 -0
  111. package/templates/common/.agents/skills/authoring/SKILL.md +590 -0
  112. package/templates/common/.agents/skills/authoring/references/block-registry.md +151 -0
  113. package/templates/common/.agents/skills/authoring/references/contracts.md +153 -0
  114. package/templates/common/.agents/skills/authoring/references/design-system.md +171 -0
  115. package/templates/common/.agents/skills/authoring/references/image-assets.md +73 -0
  116. package/templates/common/.agents/skills/authoring/references/repo-structure.md +157 -0
  117. package/templates/common/.agents/skills/migration/SKILL.md +160 -0
  118. package/templates/common/.agents/skills/migration/references/analyzing-source.md +215 -0
  119. package/templates/common/.agents/skills/migration/references/component-migration.md +200 -0
  120. package/templates/common/.agents/skills/migration/references/selector-map.md +31 -0
  121. package/templates/common/.content/.gradial-dam/blobs/sha256/7f/bf/7fbfc7fe230ff12688c496f660119e41d9725c4504d82e310c15665c73c09292 +0 -0
  122. package/templates/common/.content/.gradial-dam/blobs/sha256/a0/f5/a0f506689de9b15a7055f70103a3f02cd3ba105771ae2de6754df2ede1210d3a +0 -0
  123. package/templates/common/.content/.gradial-dam/blobs/sha256/dd/b7/ddb7e9642be08317bcd4b2bd26b58ba8d0d34dd7239e03e684a4f3634fa3845b +0 -0
  124. package/templates/common/.content/.gradial-dam/blobs/sha256/fb/32/fb3260e8286ea8231ea1c77b9c0be92d6edd9026565731eb14cfdcfd6b1b75b3 +0 -0
  125. package/templates/common/.content/config/site.json +192 -0
  126. package/templates/common/.content/dam/folders/seed/ast_site_about_hero/asset.json +9 -0
  127. package/templates/common/.content/dam/folders/seed/ast_site_about_hero/editorial.json +14 -0
  128. package/templates/common/.content/dam/folders/seed/ast_site_about_hero/governance.json +23 -0
  129. package/templates/common/.content/dam/folders/seed/ast_site_about_hero/versions/v0001.json +37 -0
  130. package/templates/common/.content/dam/folders/seed/ast_site_home_hero/asset.json +9 -0
  131. package/templates/common/.content/dam/folders/seed/ast_site_home_hero/editorial.json +14 -0
  132. package/templates/common/.content/dam/folders/seed/ast_site_home_hero/governance.json +23 -0
  133. package/templates/common/.content/dam/folders/seed/ast_site_home_hero/versions/v0001.json +37 -0
  134. package/templates/common/.content/fragments/navbar/_index.json +25 -0
  135. package/templates/common/.content/fragments/site-footer/_index.json +62 -0
  136. package/templates/common/.content/pages/about/_index.json +51 -0
  137. package/templates/common/.content/pages/home/_index.json +112 -0
  138. package/templates/common/.content/schemas/site.schema.json +123 -0
  139. package/templates/common/README.md.tmpl +45 -0
  140. package/templates/common/contracts/components/button.contract.ts +19 -0
  141. package/templates/common/contracts/components/container.contract.ts +19 -0
  142. package/templates/common/contracts/components/featureCard.contract.ts +15 -0
  143. package/templates/common/contracts/components/featureGrid.contract.ts +16 -0
  144. package/templates/common/contracts/components/homeHero.contract.ts +36 -0
  145. package/templates/common/contracts/components/index.ts +21 -0
  146. package/templates/common/contracts/components/siteFooter.contract.ts +45 -0
  147. package/templates/common/contracts/components/siteNavigation.contract.ts +30 -0
  148. package/templates/common/contracts/components/statsBar.contract.ts +19 -0
  149. package/templates/common/design-system/styles.css +346 -0
  150. package/templates/common/design-system/tokens/colors.css +110 -0
  151. package/templates/common/design-system/tokens/components.css +86 -0
  152. package/templates/common/design-system/tokens/index.css +6 -0
  153. package/templates/common/design-system/tokens/radii.css +5 -0
  154. package/templates/common/design-system/tokens/shadows.css +9 -0
  155. package/templates/common/design-system/tokens/spacing.css +26 -0
  156. package/templates/common/design-system/tokens/typography.css +32 -0
  157. package/templates/common/eslint-rules/no-raw-tailwind-values.js +127 -0
  158. package/templates/common/public/assets/Dwire-model.png +0 -0
  159. package/templates/common/public/assets/bare-metal-logo.png +0 -0
  160. package/templates/common/public/assets/meridian-logo.svg +8 -0
  161. package/templates/common/public/assets/seattle.avif +0 -0
  162. package/templates/nextjs/template/.aci.yaml +25 -0
  163. package/templates/nextjs/template/.storybook/main.ts +13 -0
  164. package/templates/nextjs/template/.storybook/preview.ts +34 -0
  165. package/templates/nextjs/template/eslint.config.mjs +36 -0
  166. package/templates/nextjs/template/next-env.d.ts +6 -0
  167. package/templates/nextjs/template/next.config.ts +8 -0
  168. package/templates/nextjs/template/package.json.tmpl +46 -0
  169. package/templates/nextjs/template/postcss.config.mjs +7 -0
  170. package/templates/nextjs/template/src/app/[[...slug]]/page.tsx +8 -0
  171. package/templates/nextjs/template/src/app/gradial/assets/[releaseId]/[...path]/route.ts +31 -0
  172. package/templates/nextjs/template/src/app/layout.tsx +29 -0
  173. package/templates/nextjs/template/src/cms/contracts/components/button.contract.ts +19 -0
  174. package/templates/nextjs/template/src/cms/contracts/components/container.contract.ts +20 -0
  175. package/templates/nextjs/template/src/cms/contracts/components/homeHero.contract.ts +36 -0
  176. package/templates/nextjs/template/src/cms/contracts/components/index.ts +15 -0
  177. package/templates/nextjs/template/src/cms/contracts/components/siteFooter.contract.ts +45 -0
  178. package/templates/nextjs/template/src/cms/contracts/components/siteNavigation.contract.ts +30 -0
  179. package/templates/nextjs/template/src/cms/contracts/layouts/index.ts +16 -0
  180. package/templates/nextjs/template/src/cms/registry.ts +28 -0
  181. package/templates/nextjs/template/src/components/chrome/Footer.tsx +86 -0
  182. package/templates/nextjs/template/src/components/chrome/Header.tsx +74 -0
  183. package/templates/nextjs/template/src/components/elements/AtomicBlock.tsx +13 -0
  184. package/templates/nextjs/template/src/components/elements/Button.tsx +40 -0
  185. package/templates/nextjs/template/src/components/elements/ButtonBlock.tsx +18 -0
  186. package/templates/nextjs/template/src/components/elements/Container.tsx +14 -0
  187. package/templates/nextjs/template/src/components/elements/Icon.tsx +29 -0
  188. package/templates/nextjs/template/src/components/elements/Logo.tsx +38 -0
  189. package/templates/nextjs/template/src/components/sections/ContainerSection.tsx +28 -0
  190. package/templates/nextjs/template/src/components/sections/FeatureCard.tsx +25 -0
  191. package/templates/nextjs/template/src/components/sections/FeatureGrid.tsx +36 -0
  192. package/templates/nextjs/template/src/components/sections/HomeHero.tsx +62 -0
  193. package/templates/nextjs/template/src/components/sections/StatsBar.tsx +30 -0
  194. package/templates/nextjs/template/src/middleware.ts +4 -0
  195. package/templates/nextjs/template/src/stories/Button.stories.tsx +38 -0
  196. package/templates/nextjs/template/src/stories/Header.stories.tsx +30 -0
  197. package/templates/nextjs/template/src/stories/HomeHero.stories.tsx +33 -0
  198. package/templates/nextjs/template/tsconfig.json +23 -0
  199. package/templates/nextjs/template/vercel.json +6 -0
  200. package/dist/content/contract.d.ts +0 -83
  201. package/dist/content/contract.js +0 -104
  202. package/dist/content/tailwind-validator.d.ts +0 -6
  203. package/dist/content/tailwind-validator.js +0 -31
  204. package/dist/content/validation.d.ts +0 -108
  205. package/dist/content/validation.js +0 -183
  206. package/dist/react/GradialMedia.d.ts +0 -24
  207. package/dist/react/GradialMedia.js +0 -31
  208. package/dist/react/GradialPicture.d.ts +0 -14
  209. package/dist/react/GradialPicture.js +0 -30
  210. package/dist/react/GradialVideoPlayer.d.ts +0 -13
  211. package/dist/sveltekit/index.d.ts +0 -25
  212. package/dist/sveltekit/index.js +0 -66
  213. package/dist/sveltekit/preview.d.ts +0 -5
  214. package/dist/sveltekit/preview.js +0 -33
  215. package/src/types/component.ts +0 -49
  216. package/src/types/config.ts +0 -37
  217. package/src/types/data.ts +0 -47
  218. package/src/types/index.ts +0 -10
  219. package/src/types/layout.ts +0 -29
  220. package/src/types/media.ts +0 -125
  221. package/src/types/page.ts +0 -47
  222. package/src/types/render-mode.ts +0 -10
  223. package/src/types/renderer.ts +0 -83
  224. package/src/types/video.ts +0 -66
@@ -1,83 +0,0 @@
1
- export declare const themeValues: readonly ["auto", "light", "dark"];
2
- export declare const buttonVariantValues: readonly ["primary", "secondary", "tertiary", "outline", "ghost"];
3
- export declare const iconPositionValues: readonly ["before", "after"];
4
- export type ContractField = {
5
- kind: 'array';
6
- items: ContractField;
7
- optional?: boolean;
8
- } | {
9
- kind: 'enum';
10
- values: readonly [string, ...string[]];
11
- optional?: boolean;
12
- } | {
13
- kind: 'atomicBlocks';
14
- optional?: boolean;
15
- } | {
16
- kind: 'boolean';
17
- optional?: boolean;
18
- } | {
19
- kind: 'className';
20
- optional?: boolean;
21
- } | {
22
- kind: 'componentClassName';
23
- optional?: boolean;
24
- } | {
25
- kind: 'image';
26
- optional?: boolean;
27
- } | {
28
- kind: 'object';
29
- fields: Record<string, ContractField>;
30
- optional?: boolean;
31
- } | {
32
- kind: 'richText';
33
- optional?: boolean;
34
- } | {
35
- kind: 'string';
36
- minLength?: number;
37
- optional?: boolean;
38
- };
39
- export interface BlockContract {
40
- component: string;
41
- displayName: string;
42
- description: string;
43
- props: Record<string, ContractField>;
44
- }
45
- export interface AtomicBlockContract extends BlockContract {
46
- }
47
- export declare const stringField: (options?: {
48
- minLength?: number;
49
- optional?: boolean;
50
- }) => ContractField;
51
- export declare const booleanField: (options?: {
52
- optional?: boolean;
53
- }) => ContractField;
54
- export declare const imageField: (options?: {
55
- optional?: boolean;
56
- }) => ContractField;
57
- export declare const enumField: (values: readonly [string, ...string[]], options?: {
58
- optional?: boolean;
59
- }) => ContractField;
60
- export declare const arrayField: (items: ContractField, options?: {
61
- optional?: boolean;
62
- }) => ContractField;
63
- export declare const objectField: (fields: Record<string, ContractField>, options?: {
64
- optional?: boolean;
65
- }) => ContractField;
66
- export declare const richTextField: (options?: {
67
- optional?: boolean;
68
- }) => ContractField;
69
- export declare const atomicBlocksField: (options?: {
70
- optional?: boolean;
71
- }) => ContractField;
72
- export declare const classNameField: (options?: {
73
- optional?: boolean;
74
- }) => ContractField;
75
- export declare const componentClassNameField: (options?: {
76
- optional?: boolean;
77
- }) => ContractField;
78
- export declare const defaultAtomicBlockContracts: AtomicBlockContract[];
79
- export declare const defaultBlockContracts: BlockContract[];
80
- export declare const blockContracts: BlockContract[];
81
- export declare const atomicBlockContracts: AtomicBlockContract[];
82
- export declare const supportedBlockComponents: string[];
83
- export declare const supportedAtomicBlockComponents: string[];
@@ -1,104 +0,0 @@
1
- export const themeValues = ['auto', 'light', 'dark'];
2
- export const buttonVariantValues = ['primary', 'secondary', 'tertiary', 'outline', 'ghost'];
3
- export const iconPositionValues = ['before', 'after'];
4
- export const stringField = (options = {}) => ({
5
- kind: 'string',
6
- ...options,
7
- });
8
- export const booleanField = (options = {}) => ({
9
- kind: 'boolean',
10
- ...options,
11
- });
12
- export const imageField = (options = {}) => ({
13
- kind: 'image',
14
- ...options,
15
- });
16
- export const enumField = (values, options = {}) => ({
17
- kind: 'enum',
18
- values,
19
- ...options,
20
- });
21
- export const arrayField = (items, options = {}) => ({
22
- kind: 'array',
23
- items,
24
- ...options,
25
- });
26
- export const objectField = (fields, options = {}) => ({
27
- kind: 'object',
28
- fields,
29
- ...options,
30
- });
31
- export const richTextField = (options = {}) => ({
32
- kind: 'richText',
33
- ...options,
34
- });
35
- export const atomicBlocksField = (options = {}) => ({
36
- kind: 'atomicBlocks',
37
- ...options,
38
- });
39
- export const classNameField = (options = {}) => ({
40
- kind: 'className',
41
- ...options,
42
- });
43
- export const componentClassNameField = (options = {}) => ({
44
- kind: 'componentClassName',
45
- ...options,
46
- });
47
- const themeFields = {
48
- theme: enumField(themeValues, { optional: true }),
49
- className: componentClassNameField({ optional: true }),
50
- };
51
- export const defaultAtomicBlockContracts = [
52
- {
53
- component: 'button',
54
- displayName: 'Button',
55
- description: 'Inline link styled as a button.',
56
- props: {
57
- label: stringField({ minLength: 1 }),
58
- href: stringField({ minLength: 1 }),
59
- variant: enumField(buttonVariantValues, { optional: true }),
60
- newWindow: booleanField({ optional: true }),
61
- icon: stringField({ optional: true }),
62
- iconPosition: enumField(iconPositionValues, { optional: true }),
63
- className: componentClassNameField({ optional: true }),
64
- },
65
- },
66
- ];
67
- export const defaultBlockContracts = [
68
- {
69
- component: 'home_hero',
70
- displayName: 'Home Hero',
71
- description: 'Full-width hero section with headline, description, CTA, and image.',
72
- props: {
73
- eyebrow: stringField({ optional: true }),
74
- headline: stringField({ minLength: 1 }),
75
- description: stringField({ optional: true }),
76
- ctaLabel: stringField({ minLength: 1 }),
77
- ctaHref: stringField({ minLength: 1 }),
78
- image: imageField(),
79
- },
80
- },
81
- {
82
- component: 'container',
83
- displayName: 'Container',
84
- description: 'Themed section wrapper that renders a stack of atomic content blocks.',
85
- props: {
86
- ...themeFields,
87
- blocks: atomicBlocksField(),
88
- },
89
- },
90
- {
91
- component: 'ssr_probe',
92
- displayName: 'SSR Probe',
93
- description: 'Server-rendered proof section used by render/publish smoke tests.',
94
- props: {
95
- label: stringField({ optional: true }),
96
- message: stringField({ optional: true }),
97
- mode: stringField({ optional: true }),
98
- },
99
- },
100
- ];
101
- export const blockContracts = defaultBlockContracts;
102
- export const atomicBlockContracts = defaultAtomicBlockContracts;
103
- export const supportedBlockComponents = defaultBlockContracts.map((block) => block.component);
104
- export const supportedAtomicBlockComponents = defaultAtomicBlockContracts.map((block) => block.component);
@@ -1,6 +0,0 @@
1
- export interface ClassNameValidationResult {
2
- valid: boolean;
3
- invalidClasses: string[];
4
- }
5
- export declare function validateContentClassName(value: string): ClassNameValidationResult;
6
- export declare function validateComponentClassName(value: string): ClassNameValidationResult;
@@ -1,31 +0,0 @@
1
- const MODIFIER_PATTERN = /^(!)?(?:(?:hover|focus|focus-within|focus-visible|active|disabled|visited|checked|first|last|odd|even|sm|md|lg|xl|2xl|dark|light|motion-safe|motion-reduce|portrait|landscape|print|rtl|ltr|open|placeholder|before|after|first-line|first-letter|selection|marker|group-hover|group-focus|peer-hover|peer-focus|has|not|aria-\w+|data-\w+):)*/;
2
- const RAW_VALUE_PATTERN = /\[(?:#|.*?\d+(?:px|rem|em|vh|vw|dvh|dvw|svh|svw|ch|ex|cap|ic|lh|rlh|cm|mm|in|pt|pc|%))/;
3
- function parseToken(token) {
4
- return token.replace(MODIFIER_PATTERN, '');
5
- }
6
- function hasArbitraryBracket(bare) {
7
- return bare.includes('[');
8
- }
9
- function hasRawArbitraryValue(bare) {
10
- if (!hasArbitraryBracket(bare)) {
11
- return false;
12
- }
13
- return RAW_VALUE_PATTERN.test(bare);
14
- }
15
- function validate(value, isInvalid) {
16
- const tokens = value.trim().split(/\s+/).filter(Boolean);
17
- const invalidClasses = [];
18
- for (const token of tokens) {
19
- const bare = parseToken(token);
20
- if (isInvalid(bare)) {
21
- invalidClasses.push(token);
22
- }
23
- }
24
- return { valid: invalidClasses.length === 0, invalidClasses };
25
- }
26
- export function validateContentClassName(value) {
27
- return validate(value, hasArbitraryBracket);
28
- }
29
- export function validateComponentClassName(value) {
30
- return validate(value, hasRawArbitraryValue);
31
- }
@@ -1,108 +0,0 @@
1
- import { z } from 'zod';
2
- import { type AtomicBlockContract, type BlockContract, type ContractField } from './contract.js';
3
- import type { KernelPage, KernelSiteConfig } from './types.js';
4
- export interface ContentValidationContracts {
5
- blockContracts?: readonly BlockContract[];
6
- atomicBlockContracts?: readonly AtomicBlockContract[];
7
- }
8
- export interface ContentSchemas {
9
- siteConfigSchema: z.ZodTypeAny;
10
- atomicBlockSchema: z.ZodTypeAny;
11
- pageBlockSchema: z.ZodTypeAny;
12
- pageSchema: z.ZodTypeAny;
13
- schemaFromContractField(field: ContractField): z.ZodTypeAny;
14
- schemaFromContractFields(fields: Record<string, ContractField>): z.ZodTypeAny;
15
- parseKernelSiteConfig(value: unknown, source?: string): KernelSiteConfig;
16
- parseKernelPage(value: unknown, source?: string): KernelPage;
17
- }
18
- export declare const linkSchema: z.ZodObject<{
19
- id: z.ZodString;
20
- label: z.ZodString;
21
- href: z.ZodString;
22
- }, z.core.$loose>;
23
- export declare const imageSchema: z.ZodObject<{
24
- src: z.ZodString;
25
- alt: z.ZodString;
26
- }, z.core.$loose>;
27
- export declare const optionalImageSchema: z.ZodObject<{
28
- src: z.ZodString;
29
- alt: z.ZodOptional<z.ZodString>;
30
- }, z.core.$loose>;
31
- export declare const siteConfigSchema: z.ZodObject<{
32
- id: z.ZodString;
33
- $type: z.ZodLiteral<"site">;
34
- status: z.ZodString;
35
- title: z.ZodString;
36
- domain: z.ZodString;
37
- defaultLocale: z.ZodString;
38
- brandHref: z.ZodOptional<z.ZodString>;
39
- brandLogo: z.ZodOptional<z.ZodObject<{
40
- src: z.ZodString;
41
- alt: z.ZodOptional<z.ZodString>;
42
- }, z.core.$loose>>;
43
- navigation: z.ZodOptional<z.ZodArray<z.ZodObject<{
44
- id: z.ZodString;
45
- label: z.ZodString;
46
- href: z.ZodString;
47
- }, z.core.$loose>>>;
48
- utilities: z.ZodOptional<z.ZodArray<z.ZodObject<{
49
- variant: z.ZodOptional<z.ZodEnum<{
50
- primary: "primary";
51
- secondary: "secondary";
52
- tertiary: "tertiary";
53
- outline: "outline";
54
- ghost: "ghost";
55
- }>>;
56
- id: z.ZodString;
57
- label: z.ZodString;
58
- href: z.ZodString;
59
- }, z.core.$loose>>>;
60
- promo: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
61
- footer: z.ZodOptional<z.ZodObject<{
62
- columns: z.ZodOptional<z.ZodArray<z.ZodObject<{
63
- id: z.ZodString;
64
- title: z.ZodOptional<z.ZodString>;
65
- groups: z.ZodOptional<z.ZodArray<z.ZodObject<{
66
- id: z.ZodString;
67
- title: z.ZodString;
68
- links: z.ZodArray<z.ZodObject<{
69
- id: z.ZodString;
70
- label: z.ZodString;
71
- href: z.ZodString;
72
- }, z.core.$loose>>;
73
- }, z.core.$loose>>>;
74
- links: z.ZodOptional<z.ZodArray<z.ZodObject<{
75
- id: z.ZodString;
76
- label: z.ZodString;
77
- href: z.ZodString;
78
- }, z.core.$loose>>>;
79
- }, z.core.$loose>>>;
80
- social: z.ZodOptional<z.ZodArray<z.ZodObject<{
81
- icon: z.ZodOptional<z.ZodString>;
82
- id: z.ZodString;
83
- label: z.ZodString;
84
- href: z.ZodString;
85
- }, z.core.$loose>>>;
86
- legalLinks: z.ZodOptional<z.ZodArray<z.ZodObject<{
87
- id: z.ZodString;
88
- label: z.ZodString;
89
- href: z.ZodString;
90
- }, z.core.$loose>>>;
91
- copyright: z.ZodOptional<z.ZodString>;
92
- }, z.core.$loose>>;
93
- seo: z.ZodOptional<z.ZodObject<{
94
- title: z.ZodOptional<z.ZodString>;
95
- description: z.ZodOptional<z.ZodString>;
96
- siteName: z.ZodOptional<z.ZodString>;
97
- }, z.core.$loose>>;
98
- }, z.core.$loose>;
99
- export declare function createContentSchemas(contracts?: ContentValidationContracts): ContentSchemas;
100
- export declare function formatZodError(source: string, error: z.ZodError): string;
101
- export declare function parseWithSchema(schema: z.ZodTypeAny, value: unknown, source: string): unknown;
102
- export declare const atomicBlockSchema: z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
103
- export declare const pageBlockSchema: z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
104
- export declare const pageSchema: z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
105
- export declare const schemaFromContractField: (field: ContractField) => z.ZodTypeAny;
106
- export declare const schemaFromContractFields: (fields: Record<string, ContractField>) => z.ZodTypeAny;
107
- export declare const parseKernelSiteConfig: (value: unknown, source?: string) => KernelSiteConfig;
108
- export declare const parseKernelPage: (value: unknown, source?: string) => KernelPage;
@@ -1,183 +0,0 @@
1
- import { z } from 'zod';
2
- import { defaultAtomicBlockContracts, defaultBlockContracts, } from './contract.js';
3
- import { validateContentClassName, validateComponentClassName } from './tailwind-validator.js';
4
- const linkFields = {
5
- id: z.string().min(1),
6
- label: z.string().min(1),
7
- href: z.string().min(1),
8
- };
9
- export const linkSchema = z.looseObject(linkFields);
10
- export const imageSchema = z.looseObject({
11
- src: z.string().min(1),
12
- alt: z.string().min(1),
13
- });
14
- export const optionalImageSchema = z.looseObject({
15
- src: z.string().min(1),
16
- alt: z.string().optional(),
17
- });
18
- export const siteConfigSchema = z.looseObject({
19
- id: z.string().min(1),
20
- $type: z.literal('site'),
21
- status: z.string().min(1),
22
- title: z.string().min(1),
23
- domain: z.string().min(1),
24
- defaultLocale: z.string().min(1),
25
- brandHref: z.string().optional(),
26
- brandLogo: optionalImageSchema.optional(),
27
- navigation: z.array(linkSchema).optional(),
28
- utilities: z.array(z.looseObject({
29
- ...linkFields,
30
- variant: z.enum(['primary', 'secondary', 'tertiary', 'outline', 'ghost']).optional(),
31
- })).optional(),
32
- promo: z.record(z.string(), z.unknown()).optional(),
33
- footer: z.looseObject({
34
- columns: z.array(z.looseObject({
35
- id: z.string().min(1),
36
- title: z.string().optional(),
37
- groups: z.array(z.looseObject({
38
- id: z.string().min(1),
39
- title: z.string(),
40
- links: z.array(linkSchema),
41
- })).optional(),
42
- links: z.array(linkSchema).optional(),
43
- })).optional(),
44
- social: z.array(z.looseObject({
45
- ...linkFields,
46
- icon: z.string().optional(),
47
- })).optional(),
48
- legalLinks: z.array(linkSchema).optional(),
49
- copyright: z.string().optional(),
50
- }).optional(),
51
- seo: z.looseObject({
52
- title: z.string().optional(),
53
- description: z.string().optional(),
54
- siteName: z.string().optional(),
55
- }).optional(),
56
- });
57
- function withOptional(schema, field) {
58
- return field.optional ? schema.optional() : schema;
59
- }
60
- export function createContentSchemas(contracts = {}) {
61
- const blockContracts = contracts.blockContracts ?? defaultBlockContracts;
62
- const atomicBlockContracts = contracts.atomicBlockContracts ?? defaultAtomicBlockContracts;
63
- let atomicBlockSchema;
64
- function schemaFromContractField(field) {
65
- switch (field.kind) {
66
- case 'atomicBlocks':
67
- return withOptional(z.array(atomicBlockSchema), field);
68
- case 'array':
69
- return withOptional(z.array(schemaFromContractField(field.items)), field);
70
- case 'boolean':
71
- return withOptional(z.boolean(), field);
72
- case 'className': {
73
- const schema = z.string().check((ctx) => {
74
- const result = validateContentClassName(ctx.value);
75
- if (!result.valid) {
76
- ctx.issues.push({
77
- code: 'custom',
78
- message: `Invalid Tailwind classes: ${result.invalidClasses.join(', ')}. Use standard utilities only; arbitrary bracket values are not allowed in content.`,
79
- input: ctx.value,
80
- });
81
- }
82
- });
83
- return withOptional(schema, field);
84
- }
85
- case 'componentClassName': {
86
- const schema = z.string().check((ctx) => {
87
- const result = validateComponentClassName(ctx.value);
88
- if (!result.valid) {
89
- ctx.issues.push({
90
- code: 'custom',
91
- message: `Invalid Tailwind classes: ${result.invalidClasses.join(', ')}. Raw dimension/color bracket values (for example [12px] or [#fff]) are not allowed.`,
92
- input: ctx.value,
93
- });
94
- }
95
- });
96
- return withOptional(schema, field);
97
- }
98
- case 'enum':
99
- return withOptional(z.enum(field.values), field);
100
- case 'image':
101
- return withOptional(imageSchema, field);
102
- case 'object':
103
- return withOptional(schemaFromContractFields(field.fields), field);
104
- case 'richText':
105
- return withOptional(z.string(), field);
106
- case 'string': {
107
- const schema = typeof field.minLength === 'number'
108
- ? z.string().min(field.minLength)
109
- : z.string();
110
- return withOptional(schema, field);
111
- }
112
- }
113
- }
114
- function schemaFromContractFields(fields) {
115
- return z.looseObject(Object.fromEntries(Object.entries(fields).map(([key, field]) => [key, schemaFromContractField(field)])));
116
- }
117
- atomicBlockSchema = discriminatedContractUnion('atomic block', atomicBlockContracts, schemaFromContractFields);
118
- const pageBlockSchema = discriminatedContractUnion('page block', blockContracts, schemaFromContractFields);
119
- const pageSchema = z.looseObject({
120
- id: z.string().min(1),
121
- $type: z.literal('page'),
122
- status: z.string().min(1),
123
- layout: z.string().min(1),
124
- metadata: z.looseObject({
125
- title: z.string().optional(),
126
- description: z.string().optional(),
127
- canonical: z.string().optional(),
128
- }),
129
- regions: z.record(z.string(), z.array(pageBlockSchema)),
130
- });
131
- return {
132
- siteConfigSchema,
133
- atomicBlockSchema,
134
- pageBlockSchema,
135
- pageSchema,
136
- schemaFromContractField,
137
- schemaFromContractFields,
138
- parseKernelSiteConfig(value, source = 'site.json') {
139
- return parseWithSchema(siteConfigSchema, value, source);
140
- },
141
- parseKernelPage(value, source = '_index.json') {
142
- return parseWithSchema(pageSchema, value, source);
143
- },
144
- };
145
- }
146
- function discriminatedContractUnion(label, contracts, schemaFromContractFields) {
147
- if (contracts.length === 0) {
148
- throw new Error(`At least one ${label} contract is required`);
149
- }
150
- const schemas = contracts.map((block) => z.looseObject({
151
- id: z.string().min(1),
152
- component: z.literal(block.component),
153
- props: schemaFromContractFields(block.props),
154
- }));
155
- if (schemas.length === 1) {
156
- return schemas[0];
157
- }
158
- return z.discriminatedUnion('component', schemas);
159
- }
160
- export function formatZodError(source, error) {
161
- const issues = error.issues
162
- .map((issue) => {
163
- const path = issue.path.length ? issue.path.join('.') : '<root>';
164
- return `- ${path}: ${issue.message}`;
165
- })
166
- .join('\n');
167
- return `Invalid Gradial content in ${source}:\n${issues}`;
168
- }
169
- export function parseWithSchema(schema, value, source) {
170
- const parsed = schema.safeParse(value);
171
- if (!parsed.success) {
172
- throw new Error(formatZodError(source, parsed.error));
173
- }
174
- return parsed.data;
175
- }
176
- const defaultContentSchemas = createContentSchemas();
177
- export const atomicBlockSchema = defaultContentSchemas.atomicBlockSchema;
178
- export const pageBlockSchema = defaultContentSchemas.pageBlockSchema;
179
- export const pageSchema = defaultContentSchemas.pageSchema;
180
- export const schemaFromContractField = defaultContentSchemas.schemaFromContractField;
181
- export const schemaFromContractFields = defaultContentSchemas.schemaFromContractFields;
182
- export const parseKernelSiteConfig = defaultContentSchemas.parseKernelSiteConfig;
183
- export const parseKernelPage = defaultContentSchemas.parseKernelPage;
@@ -1,24 +0,0 @@
1
- import { type CSSProperties, type ImgHTMLAttributes, type VideoHTMLAttributes } from 'react';
2
- import type { GradialAsset } from '../types/media.js';
3
- export interface GradialMediaProps {
4
- /** The compiler-resolved asset to render. */
5
- asset: GradialAsset;
6
- /** CSS class applied to the rendered element. */
7
- className?: string;
8
- /** Inline styles applied to the rendered element. */
9
- style?: CSSProperties;
10
- /** Loading strategy for images. Defaults to 'lazy'. */
11
- loading?: 'eager' | 'lazy';
12
- /** Additional image attributes (only applied when asset is an image). */
13
- imgProps?: Omit<ImgHTMLAttributes<HTMLImageElement>, 'src' | 'alt'>;
14
- /** Additional video attributes (only applied when asset is a video). */
15
- videoProps?: Omit<VideoHTMLAttributes<HTMLVideoElement>, 'src' | 'poster' | 'width' | 'height'>;
16
- }
17
- /**
18
- * Polymorphic media component — renders a GradialAsset as the appropriate
19
- * HTML element based on $type.
20
- *
21
- * - gradial.image → <picture> or <img> via GradialPicture
22
- * - gradial.video → <video> via GradialVideoPlayer
23
- */
24
- export declare function GradialMedia({ asset, className, style, loading, imgProps, videoProps, }: GradialMediaProps): import("react").FunctionComponentElement<import("./GradialPicture.js").GradialPictureProps> | import("react").FunctionComponentElement<import("./GradialVideoPlayer.js").GradialVideoPlayerProps> | null;
@@ -1,31 +0,0 @@
1
- import { createElement } from 'react';
2
- import { GradialPicture } from './GradialPicture.js';
3
- import { GradialVideoPlayer } from './GradialVideoPlayer.js';
4
- /**
5
- * Polymorphic media component — renders a GradialAsset as the appropriate
6
- * HTML element based on $type.
7
- *
8
- * - gradial.image → <picture> or <img> via GradialPicture
9
- * - gradial.video → <video> via GradialVideoPlayer
10
- */
11
- export function GradialMedia({ asset, className, style, loading = 'lazy', imgProps, videoProps, }) {
12
- switch (asset.$type) {
13
- case 'gradial.image':
14
- return createElement(GradialPicture, {
15
- image: asset,
16
- className,
17
- style,
18
- loading,
19
- ...imgProps,
20
- });
21
- case 'gradial.video':
22
- return createElement(GradialVideoPlayer, {
23
- video: asset,
24
- className,
25
- style,
26
- ...videoProps,
27
- });
28
- default:
29
- return null;
30
- }
31
- }
@@ -1,14 +0,0 @@
1
- import { type ImgHTMLAttributes } from 'react';
2
- import type { GradialImage } from '../types/image.js';
3
- export interface GradialPictureProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, 'src' | 'alt'> {
4
- image: GradialImage;
5
- }
6
- /**
7
- * Renders a GradialImage as a <picture> element with responsive <source> entries,
8
- * or a plain <img> when no art-directed sources exist.
9
- *
10
- * The compiler output determines the rendering:
11
- * - sources[] populated → <picture> with <source> elements (art direction / format variants)
12
- * - sources[] empty → <img> with fallback src
13
- */
14
- export declare function GradialPicture({ image, ...attrs }: GradialPictureProps): import("react").DetailedReactHTMLElement<import("react").HTMLAttributes<HTMLElement>, HTMLElement>;
@@ -1,30 +0,0 @@
1
- import { createElement } from 'react';
2
- /**
3
- * Renders a GradialImage as a <picture> element with responsive <source> entries,
4
- * or a plain <img> when no art-directed sources exist.
5
- *
6
- * The compiler output determines the rendering:
7
- * - sources[] populated → <picture> with <source> elements (art direction / format variants)
8
- * - sources[] empty → <img> with fallback src
9
- */
10
- export function GradialPicture({ image, ...attrs }) {
11
- const img = createElement('img', {
12
- src: image.fallback.src,
13
- alt: image.alt,
14
- width: image.fallback.width > 0 ? image.fallback.width : undefined,
15
- height: image.fallback.height > 0 ? image.fallback.height : undefined,
16
- loading: 'lazy',
17
- decoding: 'async',
18
- ...attrs,
19
- });
20
- if (!image.sources?.length) {
21
- return img;
22
- }
23
- return createElement('picture', null, ...image.sources.map((source, index) => createElement('source', {
24
- key: index,
25
- media: source.media,
26
- type: source.type,
27
- srcSet: source.srcset,
28
- sizes: source.sizes,
29
- })), img);
30
- }
@@ -1,13 +0,0 @@
1
- import { type VideoHTMLAttributes } from 'react';
2
- import type { GradialVideo } from '../types/video.js';
3
- export interface GradialVideoPlayerProps extends Omit<VideoHTMLAttributes<HTMLVideoElement>, 'src' | 'poster' | 'width' | 'height'> {
4
- video: GradialVideo;
5
- }
6
- /**
7
- * Renders a GradialVideo as a <video> element.
8
- *
9
- * - Uses poster.fallback.src for the poster attribute (single URL — browser limitation).
10
- * - Includes <source> elements for format variants when available.
11
- * - Falls back to src attribute on <video> when no source variants exist.
12
- */
13
- export declare function GradialVideoPlayer({ video, ...attrs }: GradialVideoPlayerProps): import("react").DetailedReactHTMLElement<Record<string, unknown>, HTMLElement>;
@@ -1,25 +0,0 @@
1
- import { type GradialContentWatchOptions, type VitePluginLike } from '../dev/index.js';
2
- import type { RenderInput } from '../content/types.js';
3
- /**
4
- * Generates prerender entries from the compiled content manifest for SvelteKit.
5
- *
6
- * Usage in svelte.config.js:
7
- * ```js
8
- * import { gradialEntries } from '@gradial/aci/sveltekit';
9
- * export default { kit: { prerender: { entries: await gradialEntries() } } };
10
- * ```
11
- *
12
- * Or in a catch-all `+page.server.ts`:
13
- * ```ts
14
- * import { gradialEntries } from '@gradial/aci/sveltekit';
15
- * export const entries = gradialEntries;
16
- * ```
17
- */
18
- export declare function gradialEntries(): Promise<string[]>;
19
- export declare function getPageRuntimeRenderInput(event: {
20
- request: Request;
21
- }): RenderInput | null;
22
- export { createRegistry, registryLookup } from '../registry.js';
23
- export type { Registry, RegistryEntry, AnyComponent } from '../registry.js';
24
- export { getPreviewMode, createPreviewBannerHTML, createPreviewCookies, type PreviewContext, type PreviewCookie, } from './preview.js';
25
- export declare function withGradialAci(options?: GradialContentWatchOptions): VitePluginLike;