@kubuild/schema 0.0.1 → 0.1.0

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 kustora
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -53,8 +53,24 @@ export declare const ResponsiveStylesSchema: z.ZodDefault<z.ZodObject<{
53
53
  tablet: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull, z.ZodUndefined]>>>;
54
54
  mobile: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull, z.ZodUndefined]>>>;
55
55
  states: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull, z.ZodUndefined]>>>>;
56
- }, z.core.$catchall<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull, z.ZodUndefined]>>>>>;
56
+ }, z.core.$loose>>;
57
57
  export type ResponsiveStyles = z.infer<typeof ResponsiveStylesSchema>;
58
+ /**
59
+ * Animation Configuration Schema
60
+ * Defines scroll entrance animations (AOS), duration, delay, easing curve,
61
+ * trigger behavior (once), hover micro-interactions, and continuous loop effects.
62
+ */
63
+ export declare const AnimationConfigSchema: z.ZodObject<{
64
+ type: z.ZodDefault<z.ZodOptional<z.ZodString>>;
65
+ duration: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
66
+ delay: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
67
+ easing: z.ZodDefault<z.ZodOptional<z.ZodString>>;
68
+ once: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
69
+ hoverEffect: z.ZodDefault<z.ZodOptional<z.ZodString>>;
70
+ loopEffect: z.ZodDefault<z.ZodOptional<z.ZodString>>;
71
+ }, z.core.$strip>;
72
+ export type AnimationConfig = z.infer<typeof AnimationConfigSchema>;
73
+ export declare const DEFAULT_ANIMATION_CONFIG: AnimationConfig;
58
74
  /**
59
75
  * Recursive Node Type Definition
60
76
  */
@@ -63,6 +79,7 @@ export type Node = {
63
79
  type: string;
64
80
  props?: Record<string, unknown>;
65
81
  styles?: ResponsiveStyles;
82
+ animation?: AnimationConfig;
66
83
  children?: Node[];
67
84
  };
68
85
  /**
@@ -126,6 +143,7 @@ export type PageDocument = z.infer<typeof PageDocumentSchema>;
126
143
  export declare function isAssetReference(value: unknown): value is AssetReference;
127
144
  export declare function isVariableBinding(value: unknown): value is VariableBinding;
128
145
  export declare function isActionBinding(value: unknown): value is ActionBinding;
146
+ export declare function isAnimationConfig(value: unknown): value is AnimationConfig;
129
147
  /**
130
148
  * Deterministic Node ID Generator
131
149
  * Generates predictable IDs based on prefix and an index/identifier (not bound to React keys).
@@ -1 +1 @@
1
- {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../src/document.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../src/document.ts"],"names":[],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -21,8 +21,10 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
23
  ActionBindingSchema: () => ActionBindingSchema,
24
+ AnimationConfigSchema: () => AnimationConfigSchema,
24
25
  AssetReferenceSchema: () => AssetReferenceSchema,
25
26
  CURRENT_SCHEMA_VERSION: () => CURRENT_SCHEMA_VERSION,
27
+ DEFAULT_ANIMATION_CONFIG: () => DEFAULT_ANIMATION_CONFIG,
26
28
  DocumentMetadataSchema: () => DocumentMetadataSchema,
27
29
  MANIFEST_JSON_SCHEMA_V1: () => MANIFEST_JSON_SCHEMA_V1,
28
30
  ManifestAssetItemSchema: () => ManifestAssetItemSchema,
@@ -50,6 +52,7 @@ __export(index_exports, {
50
52
  getPageDocumentJsonSchema: () => getPageDocumentJsonSchema,
51
53
  getTemplateRecordJsonSchema: () => getTemplateRecordJsonSchema,
52
54
  isActionBinding: () => isActionBinding,
55
+ isAnimationConfig: () => isAnimationConfig,
53
56
  isAssetReference: () => isAssetReference,
54
57
  isManifest: () => isManifest,
55
58
  isSafeThumbnail: () => isSafeThumbnail,
@@ -99,13 +102,40 @@ var ResponsiveStylesSchema = import_zod.z.object({
99
102
  tablet: StyleDefinitionSchema.optional(),
100
103
  mobile: StyleDefinitionSchema.optional(),
101
104
  states: PseudoStateStylesSchema.optional()
102
- }).catchall(StyleDefinitionSchema).default({});
105
+ }).passthrough().default({});
106
+ var AnimationConfigSchema = import_zod.z.object({
107
+ type: import_zod.z.string().refine((value) => !DANGEROUS_STYLE_VALUE_PATTERN.test(value), {
108
+ message: "Animation type contains a disallowed or unsafe pattern"
109
+ }).optional().default("none"),
110
+ duration: import_zod.z.number().min(0, "Duration must be non-negative").optional().default(600),
111
+ delay: import_zod.z.number().min(0, "Delay must be non-negative").optional().default(0),
112
+ easing: import_zod.z.string().refine((value) => !DANGEROUS_STYLE_VALUE_PATTERN.test(value), {
113
+ message: "Animation easing contains a disallowed or unsafe pattern"
114
+ }).optional().default("ease-out"),
115
+ once: import_zod.z.boolean().optional().default(true),
116
+ hoverEffect: import_zod.z.string().refine((value) => !DANGEROUS_STYLE_VALUE_PATTERN.test(value), {
117
+ message: "Hover effect contains a disallowed or unsafe pattern"
118
+ }).optional().default("none"),
119
+ loopEffect: import_zod.z.string().refine((value) => !DANGEROUS_STYLE_VALUE_PATTERN.test(value), {
120
+ message: "Loop effect contains a disallowed or unsafe pattern"
121
+ }).optional().default("none")
122
+ });
123
+ var DEFAULT_ANIMATION_CONFIG = {
124
+ type: "none",
125
+ duration: 600,
126
+ delay: 0,
127
+ easing: "ease-out",
128
+ once: true,
129
+ hoverEffect: "none",
130
+ loopEffect: "none"
131
+ };
103
132
  var NodeSchema = import_zod.z.lazy(
104
133
  () => import_zod.z.object({
105
134
  id: import_zod.z.string().min(1, "Node ID must be a non-empty string"),
106
135
  type: import_zod.z.string().min(1, "Node type must be a non-empty string"),
107
136
  props: import_zod.z.record(import_zod.z.string(), import_zod.z.unknown()).optional().default({}),
108
137
  styles: ResponsiveStylesSchema.optional().default({}),
138
+ animation: AnimationConfigSchema.optional(),
109
139
  children: import_zod.z.array(NodeSchema).optional().default([])
110
140
  })
111
141
  );
@@ -142,6 +172,9 @@ function isVariableBinding(value) {
142
172
  function isActionBinding(value) {
143
173
  return ActionBindingSchema.safeParse(value).success;
144
174
  }
175
+ function isAnimationConfig(value) {
176
+ return AnimationConfigSchema.safeParse(value).success;
177
+ }
145
178
  function generateDeterministicNodeId(prefix, indexOrKey) {
146
179
  const cleanPrefix = prefix.toLowerCase().replace(/[^a-z0-9_-]/g, "-");
147
180
  return `${cleanPrefix}_${indexOrKey}`;
@@ -524,6 +557,49 @@ var PAGE_DOCUMENT_JSON_SCHEMA_V1 = {
524
557
  },
525
558
  additionalProperties: false
526
559
  },
560
+ animationConfig: {
561
+ type: "object",
562
+ properties: {
563
+ type: {
564
+ type: "string",
565
+ default: "none",
566
+ description: "Scroll entrance animation type (e.g. fade, fade-up, zoom-in, slide-left)"
567
+ },
568
+ duration: {
569
+ type: "number",
570
+ minimum: 0,
571
+ default: 600,
572
+ description: "Animation duration in milliseconds"
573
+ },
574
+ delay: {
575
+ type: "number",
576
+ minimum: 0,
577
+ default: 0,
578
+ description: "Animation delay in milliseconds"
579
+ },
580
+ easing: {
581
+ type: "string",
582
+ default: "ease-out",
583
+ description: "CSS animation easing / transition timing function"
584
+ },
585
+ once: {
586
+ type: "boolean",
587
+ default: true,
588
+ description: "Whether scroll animation plays only once when entering viewport"
589
+ },
590
+ hoverEffect: {
591
+ type: "string",
592
+ default: "none",
593
+ description: "Hover micro-interaction effect (e.g. lift, scale, glow, tilt)"
594
+ },
595
+ loopEffect: {
596
+ type: "string",
597
+ default: "none",
598
+ description: "Continuous loop animation effect (e.g. pulse, bounce, spin, float)"
599
+ }
600
+ },
601
+ additionalProperties: false
602
+ },
527
603
  node: {
528
604
  type: "object",
529
605
  required: ["id", "type"],
@@ -546,6 +622,9 @@ var PAGE_DOCUMENT_JSON_SCHEMA_V1 = {
546
622
  styles: {
547
623
  $ref: "#/definitions/responsiveStyles"
548
624
  },
625
+ animation: {
626
+ $ref: "#/definitions/animationConfig"
627
+ },
549
628
  children: {
550
629
  type: "array",
551
630
  items: {
@@ -885,8 +964,10 @@ function getTemplateRecordJsonSchema() {
885
964
  // Annotate the CommonJS export names for ESM import in node:
886
965
  0 && (module.exports = {
887
966
  ActionBindingSchema,
967
+ AnimationConfigSchema,
888
968
  AssetReferenceSchema,
889
969
  CURRENT_SCHEMA_VERSION,
970
+ DEFAULT_ANIMATION_CONFIG,
890
971
  DocumentMetadataSchema,
891
972
  MANIFEST_JSON_SCHEMA_V1,
892
973
  ManifestAssetItemSchema,
@@ -914,6 +995,7 @@ function getTemplateRecordJsonSchema() {
914
995
  getPageDocumentJsonSchema,
915
996
  getTemplateRecordJsonSchema,
916
997
  isActionBinding,
998
+ isAnimationConfig,
917
999
  isAssetReference,
918
1000
  isManifest,
919
1001
  isSafeThumbnail,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/document.ts","../src/manifest.ts","../src/template.ts","../src/fixtures/starter-page.json","../src/fixtures.ts","../src/json-schema.ts"],"sourcesContent":["export * from './document';\nexport * from './manifest';\nexport * from './template';\nexport * from './fixtures';\nexport * from './json-schema';\n\n","import { z } from 'zod';\n\nexport const SCHEMA_NAME = 'stora.page' as const;\nexport const CURRENT_SCHEMA_VERSION = '1.0.0' as const;\n\n/**\n * Asset Reference Schema\n * Represents a reference to an asset stored either locally within the .stora package or hosted externally.\n */\nexport const AssetReferenceSchema = z.object({\n type: z.literal('asset'),\n assetId: z.string().min(1, 'Asset ID cannot be empty'),\n filename: z.string().optional(),\n mimeType: z.string().optional(),\n fallbackUrl: z.string().url().optional(),\n});\n\nexport type AssetReference = z.infer<typeof AssetReferenceSchema>;\n\n/**\n * Variable Binding Schema\n * Represents a dynamic runtime variable replacement (e.g. {{ site.name }}).\n */\nexport const VariableBindingSchema = z.object({\n type: z.literal('variable'),\n key: z.string().min(1, 'Variable key cannot be empty'),\n fallback: z.unknown().optional(),\n});\n\nexport type VariableBinding = z.infer<typeof VariableBindingSchema>;\n\n/**\n * Action Binding Schema\n * Represents an interactive action triggerable by UI components (e.g. navigation, modal, custom event).\n */\nexport const ActionBindingSchema = z.object({\n type: z.string().min(1, 'Action type cannot be empty'),\n payload: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type ActionBinding = z.infer<typeof ActionBindingSchema>;\n\n/**\n * Style Definition Schema\n * Key-value mapping of CSS properties or design tokens.\n *\n * Values are restricted to safe, serializable primitives (string, number,\n * boolean, null) — no functions, objects, or arrays — and string values are\n * screened against known CSS/HTML injection vectors (e.g. `url(javascript:...)`,\n * legacy IE `expression()`, `@import`, embedded `<script>` tags).\n */\nconst DANGEROUS_STYLE_VALUE_PATTERN = /javascript:|expression\\(|@import|<script|vbscript:|data:text\\/html/i;\n\nexport const StyleValueSchema = z.union([\n z.string().refine((value) => !DANGEROUS_STYLE_VALUE_PATTERN.test(value), {\n message: 'Style value contains a disallowed or unsafe pattern',\n }),\n z.number(),\n z.boolean(),\n z.null(),\n z.undefined(),\n]);\nexport const StyleDefinitionSchema = z.record(z.string(), StyleValueSchema);\nexport type StyleDefinition = Record<string, string | number | boolean | null | undefined>;\n\n/**\n * Pseudo-state style definitions keyed by CSS pseudo-class selector\n * (e.g. `:hover`, `:focus`, `:active`). Each entry is a style layer applied\n * on top of the resolved breakpoint styles when the state is active.\n */\nexport const PseudoStateStylesSchema = z.record(z.string(), StyleDefinitionSchema);\nexport type PseudoStateStyles = Record<string, StyleDefinition>;\n\n/**\n * Responsive Styles Schema\n * Breakpoint-specific style definitions: base (all viewports), desktop, tablet, and mobile.\n * Optionally carries `states` — pseudo-class style layers (e.g. `:hover`).\n */\nexport const ResponsiveStylesSchema = z\n .object({\n base: StyleDefinitionSchema.optional(),\n desktop: StyleDefinitionSchema.optional(),\n tablet: StyleDefinitionSchema.optional(),\n mobile: StyleDefinitionSchema.optional(),\n states: PseudoStateStylesSchema.optional(),\n })\n .catchall(StyleDefinitionSchema)\n .default({});\n\nexport type ResponsiveStyles = z.infer<typeof ResponsiveStylesSchema>;\n\n/**\n * Recursive Node Type Definition\n */\nexport type Node = {\n id: string;\n type: string;\n props?: Record<string, unknown>;\n styles?: ResponsiveStyles;\n children?: Node[];\n};\n\n/**\n * Recursive Node Schema\n * Represents any element/node in the document tree.\n * Node IDs are deterministic, independent of React keys, and unique across the document.\n */\nexport const NodeSchema: z.ZodType<Node> = z.lazy(() =>\n z.object({\n id: z.string().min(1, 'Node ID must be a non-empty string'),\n type: z.string().min(1, 'Node type must be a non-empty string'),\n props: z.record(z.string(), z.unknown()).optional().default({}),\n styles: ResponsiveStylesSchema.optional().default({}),\n children: z.array(NodeSchema).optional().default([]),\n }),\n);\n\nexport type RootPageNode = Node & { type: 'page' };\n\n/**\n * Root Page Node Schema\n * The root node of a PageDocument must be of type 'page'.\n */\nexport const RootPageNodeSchema: z.ZodType<RootPageNode> = NodeSchema.refine(\n (node): node is RootPageNode => node.type === 'page',\n {\n message: 'Root node must have type \"page\"',\n path: ['type'],\n },\n);\n\n\n/**\n * Document Metadata Schema\n * Pure serializable metadata for the document.\n */\nexport const DocumentMetadataSchema = z.object({\n title: z.string().min(1, 'Title is required').default('Untitled Page'),\n description: z.string().optional().default(''),\n author: z.string().optional().default(''),\n createdAt: z.string().optional(),\n updatedAt: z.string().optional(),\n tags: z.array(z.string()).optional().default([]),\n category: z.string().optional().default('general'),\n version: z.string().optional().default('1.0.0'),\n custom: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type DocumentMetadata = z.infer<typeof DocumentMetadataSchema>;\n\n/**\n * Page Document Schema v1\n * Root portable document structure:\n * - schema: strictly \"stora.page\"\n * - version: schema version string (e.g. \"1.0.0\")\n * - metadata: serializable metadata\n * - document: root page node\n */\nexport const PageDocumentSchema = z.object({\n schema: z.literal(SCHEMA_NAME),\n version: z.string().min(1, 'Schema version is required').default(CURRENT_SCHEMA_VERSION),\n metadata: DocumentMetadataSchema.optional(),\n document: RootPageNodeSchema,\n});\n\nexport type PageDocument = z.infer<typeof PageDocumentSchema>;\n\n\n\n/**\n * Type guards\n */\nexport function isAssetReference(value: unknown): value is AssetReference {\n return AssetReferenceSchema.safeParse(value).success;\n}\n\nexport function isVariableBinding(value: unknown): value is VariableBinding {\n return VariableBindingSchema.safeParse(value).success;\n}\n\nexport function isActionBinding(value: unknown): value is ActionBinding {\n return ActionBindingSchema.safeParse(value).success;\n}\n\n/**\n * Deterministic Node ID Generator\n * Generates predictable IDs based on prefix and an index/identifier (not bound to React keys).\n */\nexport function generateDeterministicNodeId(prefix: string, indexOrKey: number | string): string {\n const cleanPrefix = prefix.toLowerCase().replace(/[^a-z0-9_-]/g, '-');\n return `${cleanPrefix}_${indexOrKey}`;\n}\n\n/**\n * Collect all Node IDs in a node tree\n */\nexport function collectNodeIds(node: Node): string[] {\n const ids: string[] = [node.id];\n if (node.children && Array.isArray(node.children)) {\n for (const child of node.children) {\n ids.push(...collectNodeIds(child));\n }\n }\n return ids;\n}\n\n/**\n * Validate Node ID uniqueness across a node tree or document\n */\nexport function validateNodeIdUniqueness(node: Node): { valid: boolean; duplicateIds: string[] } {\n const allIds = collectNodeIds(node);\n const seen = new Set<string>();\n const duplicates = new Set<string>();\n\n for (const id of allIds) {\n if (seen.has(id)) {\n duplicates.add(id);\n } else {\n seen.add(id);\n }\n }\n\n return {\n valid: duplicates.size === 0,\n duplicateIds: Array.from(duplicates),\n };\n}\n","import { z } from 'zod';\nimport { SCHEMA_NAME } from './document';\n\nexport const ManifestAssetItemSchema = z.object({\n id: z.string().min(1, 'Asset ID cannot be empty'),\n path: z.string().min(1, 'Asset archive path cannot be empty'),\n mimeType: z.string().min(1, 'MIME type cannot be empty'),\n size: z.number().nonnegative('Asset size must be non-negative'),\n checksum: z.string().optional(),\n});\n\nexport type ManifestAssetItem = z.infer<typeof ManifestAssetItemSchema>;\n\nexport const ManifestSchema = z.object({\n schema: z.literal(SCHEMA_NAME).default(SCHEMA_NAME),\n schemaVersion: z.string().min(1, 'Schema version cannot be empty').default('1.0.0'),\n packageVersion: z.string().min(1, 'Package version cannot be empty').default('1.0.0'),\n builderCompatibility: z.string().default('>=0.1.0'),\n requiredComponents: z.array(z.string()).default([]),\n requiredCapabilities: z.array(z.string()).default([]),\n assets: z.array(ManifestAssetItemSchema).default([]),\n createdAt: z.string().optional(),\n});\n\nexport type Manifest = z.infer<typeof ManifestSchema>;\n\nexport function isManifest(value: unknown): value is Manifest {\n return ManifestSchema.safeParse(value).success;\n}\n","import { z } from 'zod';\nimport { AssetReferenceSchema, PageDocumentSchema, type AssetReference, type PageDocument } from './document';\n\n/**\n * Regex for screening dangerous URI schemes and payloads in thumbnail URLs.\n * Rejects javascript:, vbscript:, data: URIs that are not images (e.g. data:text/html),\n * and embedded <script> tags.\n */\nconst DANGEROUS_URI_PATTERN = /^(javascript:|vbscript:|data:(?!image\\/))|<script/i;\n\n/**\n * Validates a string as a safe URL or safe asset path.\n */\nexport function isSafeThumbnailUrl(url: string): boolean {\n if (!url || typeof url !== 'string') return false;\n const trimmed = url.trim();\n if (trimmed.length === 0) return false;\n if (DANGEROUS_URI_PATTERN.test(trimmed)) return false;\n return true;\n}\n\n/**\n * Safe Thumbnail URL String Schema\n */\nexport const SafeThumbnailUrlSchema = z.string().min(1, 'Thumbnail URL cannot be empty').refine(\n (url) => isSafeThumbnailUrl(url),\n { message: 'Thumbnail URL contains an unsafe protocol or payload' }\n);\n\n/**\n * Safe Thumbnail Object Schema\n */\nexport const SafeThumbnailObjectSchema = z.object({\n url: SafeThumbnailUrlSchema,\n alt: z.string().optional(),\n width: z.number().positive().optional(),\n height: z.number().positive().optional(),\n});\n\nexport type SafeThumbnailObject = z.infer<typeof SafeThumbnailObjectSchema>;\n\n/**\n * Safe Thumbnail Schema (AssetReference | safe URL string | safe thumbnail object)\n */\nexport const SafeThumbnailSchema = z.union([\n AssetReferenceSchema,\n SafeThumbnailObjectSchema,\n SafeThumbnailUrlSchema,\n]);\n\nexport type SafeThumbnail = AssetReference | SafeThumbnailObject | string;\n\n/**\n * Template Package Reference Schema\n * Points to an external or archived .stora / JSON package file.\n */\nexport const TemplatePackageRefSchema = z.object({\n path: z.string().optional(),\n url: SafeThumbnailUrlSchema.optional(),\n checksum: z.string().optional(),\n format: z.enum(['stora', 'json']).default('stora'),\n});\n\nexport type TemplatePackageRef = z.infer<typeof TemplatePackageRefSchema>;\n\n/**\n * Template Requirements Schema\n * Declares custom components and host capabilities required by this template.\n */\nexport const TemplateRequirementsSchema = z.object({\n requiredComponents: z.array(z.string()).default([]),\n requiredCapabilities: z.array(z.string()).default([]),\n});\n\nexport type TemplateRequirements = z.infer<typeof TemplateRequirementsSchema>;\n\n/**\n * Template Record Schema v1\n * Represents a reusable page template with full metadata, safe thumbnail,\n * component/capability requirements, and snapshot document / package reference.\n */\nexport const TemplateRecordSchema = z.object({\n id: z.string().min(1, 'Template ID must be a non-empty string'),\n name: z.string().min(1, 'Template name must be a non-empty string'),\n description: z.string().optional().default(''),\n category: z.string().optional().default('general'),\n tags: z.array(z.string()).optional().default([]),\n thumbnail: SafeThumbnailSchema.optional(),\n author: z.string().optional().default(''),\n version: z.string().optional().default('1.0.0'),\n document: PageDocumentSchema.optional(),\n packageReference: TemplatePackageRefSchema.optional(),\n requirements: TemplateRequirementsSchema.default({\n requiredComponents: [],\n requiredCapabilities: [],\n }),\n createdAt: z.string().optional(),\n updatedAt: z.string().optional(),\n custom: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type TemplateRecord = z.infer<typeof TemplateRecordSchema>;\n\n/**\n * Type guard for TemplateRecord\n */\nexport function isTemplateRecord(value: unknown): value is TemplateRecord {\n return TemplateRecordSchema.safeParse(value).success;\n}\n\n/**\n * Type guard for SafeThumbnail\n */\nexport function isSafeThumbnail(value: unknown): value is SafeThumbnail {\n return SafeThumbnailSchema.safeParse(value).success;\n}\n\n","{\n \"schema\": \"stora.page\",\n \"version\": \"1.0.0\",\n \"metadata\": {\n \"title\": \"Welcome to KUBUILD\",\n \"description\": \"A starter template built with KUBUILD portable web builder\",\n \"author\": \"KUBUILD Team\",\n \"tags\": [\"landing-page\", \"starter\", \"portable\"],\n \"category\": \"landing\",\n \"version\": \"1.0.0\",\n \"createdAt\": \"2026-08-22T00:00:00.000Z\",\n \"updatedAt\": \"2026-08-22T00:00:00.000Z\"\n },\n \"document\": {\n \"id\": \"root-page\",\n \"type\": \"page\",\n \"props\": {\n \"title\": \"KUBUILD Starter Page\"\n },\n \"styles\": {\n \"base\": {\n \"backgroundColor\": \"#ffffff\",\n \"fontFamily\": \"Inter, sans-serif\",\n \"color\": \"#111827\",\n \"minHeight\": \"100vh\"\n }\n },\n \"children\": [\n {\n \"id\": \"hero-section\",\n \"type\": \"section\",\n \"props\": {},\n \"styles\": {\n \"base\": {\n \"paddingTop\": \"64px\",\n \"paddingBottom\": \"64px\",\n \"paddingLeft\": \"24px\",\n \"paddingRight\": \"24px\",\n \"backgroundColor\": \"#f8fafc\"\n }\n },\n \"children\": [\n {\n \"id\": \"hero-container\",\n \"type\": \"container\",\n \"props\": {\n \"maxWidth\": \"1200px\"\n },\n \"styles\": {\n \"base\": {\n \"margin\": \"0 auto\",\n \"display\": \"flex\",\n \"flexDirection\": \"column\",\n \"alignItems\": \"center\",\n \"textAlign\": \"center\",\n \"gap\": \"24px\"\n }\n },\n \"children\": [\n {\n \"id\": \"hero-heading\",\n \"type\": \"heading\",\n \"props\": {\n \"text\": \"Build Once, Render Anywhere\",\n \"level\": 1\n },\n \"styles\": {\n \"base\": {\n \"fontSize\": \"48px\",\n \"fontWeight\": \"800\",\n \"color\": \"#0f172a\",\n \"lineHeight\": \"1.2\"\n },\n \"mobile\": {\n \"fontSize\": \"32px\"\n }\n },\n \"children\": []\n },\n {\n \"id\": \"hero-text\",\n \"type\": \"text\",\n \"props\": {\n \"content\": \"KUBUILD is an open, portable web page builder engine designed for modern web applications.\"\n },\n \"styles\": {\n \"base\": {\n \"fontSize\": \"18px\",\n \"color\": \"#475569\",\n \"maxWidth\": \"680px\",\n \"lineHeight\": \"1.6\"\n }\n },\n \"children\": []\n },\n {\n \"id\": \"hero-image\",\n \"type\": \"image\",\n \"props\": {\n \"src\": \"https://picsum.photos/200/300\",\n \"asset\": {\n \"type\": \"asset\",\n \"assetId\": \"asset_hero_graphic\",\n \"filename\": \"hero.webp\",\n \"mimeType\": \"image/webp\"\n },\n \"alt\": \"KUBUILD Platform Graphic\",\n \"width\": 640,\n \"height\": 360\n },\n \"styles\": {\n \"base\": {\n \"borderRadius\": \"12px\",\n \"maxWidth\": \"100%\",\n \"height\": \"auto\",\n \"boxShadow\": \"0 20px 25px -5px rgba(0, 0, 0, 0.1)\"\n }\n },\n \"children\": []\n },\n {\n \"id\": \"hero-button\",\n \"type\": \"button\",\n \"props\": {\n \"label\": \"Get Started\",\n \"action\": {\n \"type\": \"navigate\",\n \"payload\": {\n \"url\": \"/docs\"\n }\n }\n },\n \"styles\": {\n \"base\": {\n \"backgroundColor\": \"#2563eb\",\n \"color\": \"#ffffff\",\n \"paddingTop\": \"12px\",\n \"paddingBottom\": \"12px\",\n \"paddingLeft\": \"28px\",\n \"paddingRight\": \"28px\",\n \"borderRadius\": \"8px\",\n \"fontWeight\": \"600\",\n \"fontSize\": \"16px\",\n \"cursor\": \"pointer\",\n \"border\": \"none\"\n }\n },\n \"children\": []\n }\n ]\n }\n ]\n }\n ]\n }\n}\n","import starterPageData from './fixtures/starter-page.json';\nimport { PageDocument } from './document';\n\nexport const starterPageFixture: PageDocument = starterPageData as unknown as PageDocument;\n","/**\n * Standard JSON Schema Draft-07 representation of stora.page Document v1\n * Aligned 1:1 with TypeScript PageDocument type definition.\n */\nexport const PAGE_DOCUMENT_JSON_SCHEMA_V1 = {\n $schema: 'http://json-schema.org/draft-07/schema#',\n $id: 'https://schema.stora.page/v1/page.json',\n title: 'StoraPageDocument',\n description: 'Portable Web Page Document v1 schema definition for KUBUILD',\n type: 'object',\n required: ['schema', 'version', 'document'],\n additionalProperties: false,\n properties: {\n schema: {\n type: 'string',\n const: 'stora.page',\n description: 'Identifies the document type format',\n },\n version: {\n type: 'string',\n pattern: '^\\\\d+(\\\\.\\\\d+)*$',\n description: 'Schema version of the document',\n default: '1.0.0',\n },\n metadata: {\n $ref: '#/definitions/documentMetadata',\n },\n document: {\n $ref: '#/definitions/rootPageNode',\n },\n },\n definitions: {\n styleValue: {\n type: ['string', 'number', 'boolean', 'null'],\n description: 'A CSS property or design token value',\n },\n styleDefinition: {\n type: 'object',\n additionalProperties: {\n $ref: '#/definitions/styleValue',\n },\n description: 'Key-value map of style properties',\n },\n responsiveStyles: {\n type: 'object',\n properties: {\n base: { $ref: '#/definitions/styleDefinition' },\n desktop: { $ref: '#/definitions/styleDefinition' },\n tablet: { $ref: '#/definitions/styleDefinition' },\n mobile: { $ref: '#/definitions/styleDefinition' },\n },\n additionalProperties: {\n $ref: '#/definitions/styleDefinition',\n },\n },\n assetReference: {\n type: 'object',\n required: ['type', 'assetId'],\n properties: {\n type: {\n type: 'string',\n const: 'asset',\n },\n assetId: {\n type: 'string',\n minLength: 1,\n },\n filename: {\n type: 'string',\n },\n mimeType: {\n type: 'string',\n },\n fallbackUrl: {\n type: 'string',\n format: 'uri',\n },\n },\n additionalProperties: false,\n },\n variableBinding: {\n type: 'object',\n required: ['type', 'key'],\n properties: {\n type: {\n type: 'string',\n const: 'variable',\n },\n key: {\n type: 'string',\n minLength: 1,\n },\n fallback: {},\n },\n additionalProperties: false,\n },\n actionBinding: {\n type: 'object',\n required: ['type'],\n properties: {\n type: {\n type: 'string',\n minLength: 1,\n },\n payload: {\n type: 'object',\n },\n },\n additionalProperties: false,\n },\n node: {\n type: 'object',\n required: ['id', 'type'],\n properties: {\n id: {\n type: 'string',\n minLength: 1,\n description: 'Unique deterministic node identifier',\n },\n type: {\n type: 'string',\n minLength: 1,\n description: 'Component type identifier',\n },\n props: {\n type: 'object',\n description: 'Component props payload and bindings',\n default: {},\n },\n styles: {\n $ref: '#/definitions/responsiveStyles',\n },\n children: {\n type: 'array',\n items: {\n $ref: '#/definitions/node',\n },\n default: [],\n },\n },\n additionalProperties: false,\n },\n rootPageNode: {\n allOf: [\n { $ref: '#/definitions/node' },\n {\n type: 'object',\n properties: {\n type: {\n type: 'string',\n const: 'page',\n description: 'The root node type must be \"page\"',\n },\n },\n },\n ],\n },\n documentMetadata: {\n type: 'object',\n required: ['title'],\n properties: {\n title: {\n type: 'string',\n minLength: 1,\n default: 'Untitled Page',\n },\n description: {\n type: 'string',\n default: '',\n },\n author: {\n type: 'string',\n default: '',\n },\n createdAt: {\n type: 'string',\n format: 'date-time',\n },\n updatedAt: {\n type: 'string',\n format: 'date-time',\n },\n tags: {\n type: 'array',\n items: { type: 'string' },\n default: [],\n },\n category: {\n type: 'string',\n default: 'general',\n },\n version: {\n type: 'string',\n default: '1.0.0',\n },\n custom: {\n type: 'object',\n },\n },\n additionalProperties: false,\n },\n },\n} as const;\n\nexport function getPageDocumentJsonSchema() {\n return PAGE_DOCUMENT_JSON_SCHEMA_V1;\n}\n\n/**\n * Standard JSON Schema Draft-07 representation of stora.page Package Manifest v1\n * Aligned 1:1 with TypeScript Manifest type definition.\n */\nexport const MANIFEST_JSON_SCHEMA_V1 = {\n $schema: 'http://json-schema.org/draft-07/schema#',\n $id: 'https://schema.stora.page/v1/manifest.json',\n title: 'StoraPackageManifest',\n description: 'Portable Package Manifest v1 schema definition for KUBUILD (.stora)',\n type: 'object',\n required: ['schemaVersion', 'packageVersion', 'builderCompatibility', 'requiredComponents', 'requiredCapabilities', 'assets'],\n additionalProperties: false,\n properties: {\n schema: {\n type: 'string',\n const: 'stora.page',\n description: 'Schema identifier',\n default: 'stora.page',\n },\n schemaVersion: {\n type: 'string',\n pattern: '^\\\\d+(\\\\.\\\\d+)*$',\n description: 'Document schema version',\n default: '1.0.0',\n },\n packageVersion: {\n type: 'string',\n pattern: '^\\\\d+(\\\\.\\\\d+)*$',\n description: 'Package version',\n default: '1.0.0',\n },\n builderCompatibility: {\n type: 'string',\n description: 'Minimum or range of builder versions compatible with this package',\n default: '>=0.1.0',\n },\n requiredComponents: {\n type: 'array',\n items: { type: 'string' },\n description: 'List of custom component types required by the page',\n default: [],\n },\n requiredCapabilities: {\n type: 'array',\n items: { type: 'string' },\n description: 'List of capabilities required by components in the page',\n default: [],\n },\n assets: {\n type: 'array',\n items: { $ref: '#/definitions/manifestAssetItem' },\n description: 'Inventory of local assets packaged within the archive',\n default: [],\n },\n createdAt: {\n type: 'string',\n format: 'date-time',\n description: 'ISO timestamp when the package was created',\n },\n },\n definitions: {\n manifestAssetItem: {\n type: 'object',\n required: ['id', 'path', 'mimeType', 'size'],\n properties: {\n id: {\n type: 'string',\n minLength: 1,\n description: 'Unique asset identifier',\n },\n path: {\n type: 'string',\n minLength: 1,\n description: 'Relative archive path to asset file (e.g. assets/hero.png)',\n },\n mimeType: {\n type: 'string',\n minLength: 1,\n description: 'MIME type of the asset',\n },\n size: {\n type: 'number',\n minimum: 0,\n description: 'Asset size in bytes',\n },\n checksum: {\n type: 'string',\n description: 'SHA-256 or algorithm-prefixed checksum (e.g. sha256:...)',\n },\n },\n additionalProperties: false,\n },\n },\n} as const;\n\nexport function getManifestJsonSchema() {\n return MANIFEST_JSON_SCHEMA_V1;\n}\n\n/**\n * Standard JSON Schema Draft-07 representation of Template Record v1\n * Aligned 1:1 with TypeScript TemplateRecord type definition.\n */\nexport const TEMPLATE_RECORD_JSON_SCHEMA_V1 = {\n $schema: 'http://json-schema.org/draft-07/schema#',\n $id: 'https://schema.stora.page/v1/template.json',\n title: 'StoraTemplateRecord',\n description: 'Reusable Page Template Record v1 schema definition for KUBUILD',\n type: 'object',\n required: ['id', 'name'],\n additionalProperties: false,\n properties: {\n id: {\n type: 'string',\n minLength: 1,\n description: 'Unique template identifier',\n },\n name: {\n type: 'string',\n minLength: 1,\n description: 'Human-readable name of the template',\n },\n description: {\n type: 'string',\n default: '',\n description: 'Detailed description of the template purpose and contents',\n },\n category: {\n type: 'string',\n default: 'general',\n description: 'Template category grouping',\n },\n tags: {\n type: 'array',\n items: { type: 'string' },\n default: [],\n description: 'Search and filter tags',\n },\n thumbnail: {\n oneOf: [\n { $ref: '#/definitions/assetReference' },\n { $ref: '#/definitions/safeThumbnailObject' },\n { type: 'string', minLength: 1 },\n ],\n description: 'Safe preview image asset reference or URL',\n },\n author: {\n type: 'string',\n default: '',\n description: 'Template creator or team',\n },\n version: {\n type: 'string',\n default: '1.0.0',\n description: 'Semantic version of the template',\n },\n document: {\n $ref: 'https://schema.stora.page/v1/page.json#',\n description: 'Embedded PageDocument snapshot (optional if packageReference provided)',\n },\n packageReference: {\n $ref: '#/definitions/templatePackageRef',\n description: 'External package/archive reference (optional if document provided)',\n },\n requirements: {\n $ref: '#/definitions/templateRequirements',\n description: 'Component and capability requirements for this template',\n },\n createdAt: {\n type: 'string',\n format: 'date-time',\n description: 'ISO creation timestamp',\n },\n updatedAt: {\n type: 'string',\n format: 'date-time',\n description: 'ISO last updated timestamp',\n },\n custom: {\n type: 'object',\n description: 'Custom host-specific serializable metadata',\n },\n },\n definitions: {\n assetReference: {\n type: 'object',\n required: ['type', 'assetId'],\n properties: {\n type: {\n type: 'string',\n const: 'asset',\n },\n assetId: {\n type: 'string',\n minLength: 1,\n },\n filename: {\n type: 'string',\n },\n mimeType: {\n type: 'string',\n },\n fallbackUrl: {\n type: 'string',\n format: 'uri',\n },\n },\n additionalProperties: false,\n },\n safeThumbnailObject: {\n type: 'object',\n required: ['url'],\n properties: {\n url: {\n type: 'string',\n minLength: 1,\n },\n alt: {\n type: 'string',\n },\n width: {\n type: 'number',\n minimum: 1,\n },\n height: {\n type: 'number',\n minimum: 1,\n },\n },\n additionalProperties: false,\n },\n templatePackageRef: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n },\n url: {\n type: 'string',\n },\n checksum: {\n type: 'string',\n },\n format: {\n type: 'string',\n enum: ['stora', 'json'],\n default: 'stora',\n },\n },\n additionalProperties: false,\n },\n templateRequirements: {\n type: 'object',\n properties: {\n requiredComponents: {\n type: 'array',\n items: { type: 'string' },\n default: [],\n },\n requiredCapabilities: {\n type: 'array',\n items: { type: 'string' },\n default: [],\n },\n },\n additionalProperties: false,\n },\n },\n} as const;\n\nexport function getTemplateRecordJsonSchema() {\n return TEMPLATE_RECORD_JSON_SCHEMA_V1;\n}\n\n"],"mappings":"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","names":["import_zod","import_zod"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/document.ts","../src/manifest.ts","../src/template.ts","../src/fixtures/starter-page.json","../src/fixtures.ts","../src/json-schema.ts"],"sourcesContent":["export * from './document';\nexport * from './manifest';\nexport * from './template';\nexport * from './fixtures';\nexport * from './json-schema';\n\n","import { z } from 'zod';\n\nexport const SCHEMA_NAME = 'stora.page' as const;\nexport const CURRENT_SCHEMA_VERSION = '1.0.0' as const;\n\n/**\n * Asset Reference Schema\n * Represents a reference to an asset stored either locally within the .stora package or hosted externally.\n */\nexport const AssetReferenceSchema = z.object({\n type: z.literal('asset'),\n assetId: z.string().min(1, 'Asset ID cannot be empty'),\n filename: z.string().optional(),\n mimeType: z.string().optional(),\n fallbackUrl: z.string().url().optional(),\n});\n\nexport type AssetReference = z.infer<typeof AssetReferenceSchema>;\n\n/**\n * Variable Binding Schema\n * Represents a dynamic runtime variable replacement (e.g. {{ site.name }}).\n */\nexport const VariableBindingSchema = z.object({\n type: z.literal('variable'),\n key: z.string().min(1, 'Variable key cannot be empty'),\n fallback: z.unknown().optional(),\n});\n\nexport type VariableBinding = z.infer<typeof VariableBindingSchema>;\n\n/**\n * Action Binding Schema\n * Represents an interactive action triggerable by UI components (e.g. navigation, modal, custom event).\n */\nexport const ActionBindingSchema = z.object({\n type: z.string().min(1, 'Action type cannot be empty'),\n payload: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type ActionBinding = z.infer<typeof ActionBindingSchema>;\n\n/**\n * Style Definition Schema\n * Key-value mapping of CSS properties or design tokens.\n *\n * Values are restricted to safe, serializable primitives (string, number,\n * boolean, null) — no functions, objects, or arrays — and string values are\n * screened against known CSS/HTML injection vectors (e.g. `url(javascript:...)`,\n * legacy IE `expression()`, `@import`, embedded `<script>` tags).\n */\nconst DANGEROUS_STYLE_VALUE_PATTERN = /javascript:|expression\\(|@import|<script|vbscript:|data:text\\/html/i;\n\nexport const StyleValueSchema = z.union([\n z.string().refine((value) => !DANGEROUS_STYLE_VALUE_PATTERN.test(value), {\n message: 'Style value contains a disallowed or unsafe pattern',\n }),\n z.number(),\n z.boolean(),\n z.null(),\n z.undefined(),\n]);\nexport const StyleDefinitionSchema = z.record(z.string(), StyleValueSchema);\nexport type StyleDefinition = Record<string, string | number | boolean | null | undefined>;\n\n/**\n * Pseudo-state style definitions keyed by CSS pseudo-class selector\n * (e.g. `:hover`, `:focus`, `:active`). Each entry is a style layer applied\n * on top of the resolved breakpoint styles when the state is active.\n */\nexport const PseudoStateStylesSchema = z.record(z.string(), StyleDefinitionSchema);\nexport type PseudoStateStyles = Record<string, StyleDefinition>;\n\n/**\n * Responsive Styles Schema\n * Breakpoint-specific style definitions: base (all viewports), desktop, tablet, and mobile.\n * Optionally carries `states` — pseudo-class style layers (e.g. `:hover`).\n */\nexport const ResponsiveStylesSchema = z\n .object({\n base: StyleDefinitionSchema.optional(),\n desktop: StyleDefinitionSchema.optional(),\n tablet: StyleDefinitionSchema.optional(),\n mobile: StyleDefinitionSchema.optional(),\n states: PseudoStateStylesSchema.optional(),\n })\n .passthrough()\n .default({});\n\nexport type ResponsiveStyles = z.infer<typeof ResponsiveStylesSchema>;\n\n/**\n * Animation Configuration Schema\n * Defines scroll entrance animations (AOS), duration, delay, easing curve,\n * trigger behavior (once), hover micro-interactions, and continuous loop effects.\n */\nexport const AnimationConfigSchema = z.object({\n type: z\n .string()\n .refine((value) => !DANGEROUS_STYLE_VALUE_PATTERN.test(value), {\n message: 'Animation type contains a disallowed or unsafe pattern',\n })\n .optional()\n .default('none'),\n duration: z.number().min(0, 'Duration must be non-negative').optional().default(600),\n delay: z.number().min(0, 'Delay must be non-negative').optional().default(0),\n easing: z\n .string()\n .refine((value) => !DANGEROUS_STYLE_VALUE_PATTERN.test(value), {\n message: 'Animation easing contains a disallowed or unsafe pattern',\n })\n .optional()\n .default('ease-out'),\n once: z.boolean().optional().default(true),\n hoverEffect: z\n .string()\n .refine((value) => !DANGEROUS_STYLE_VALUE_PATTERN.test(value), {\n message: 'Hover effect contains a disallowed or unsafe pattern',\n })\n .optional()\n .default('none'),\n loopEffect: z\n .string()\n .refine((value) => !DANGEROUS_STYLE_VALUE_PATTERN.test(value), {\n message: 'Loop effect contains a disallowed or unsafe pattern',\n })\n .optional()\n .default('none'),\n});\n\nexport type AnimationConfig = z.infer<typeof AnimationConfigSchema>;\n\nexport const DEFAULT_ANIMATION_CONFIG: AnimationConfig = {\n type: 'none',\n duration: 600,\n delay: 0,\n easing: 'ease-out',\n once: true,\n hoverEffect: 'none',\n loopEffect: 'none',\n};\n\n/**\n * Recursive Node Type Definition\n */\nexport type Node = {\n id: string;\n type: string;\n props?: Record<string, unknown>;\n styles?: ResponsiveStyles;\n animation?: AnimationConfig;\n children?: Node[];\n};\n\n/**\n * Recursive Node Schema\n * Represents any element/node in the document tree.\n * Node IDs are deterministic, independent of React keys, and unique across the document.\n */\nexport const NodeSchema: z.ZodType<Node> = z.lazy(() =>\n z.object({\n id: z.string().min(1, 'Node ID must be a non-empty string'),\n type: z.string().min(1, 'Node type must be a non-empty string'),\n props: z.record(z.string(), z.unknown()).optional().default({}),\n styles: ResponsiveStylesSchema.optional().default({}),\n animation: AnimationConfigSchema.optional(),\n children: z.array(NodeSchema).optional().default([]),\n }),\n);\n\nexport type RootPageNode = Node & { type: 'page' };\n\n/**\n * Root Page Node Schema\n * The root node of a PageDocument must be of type 'page'.\n */\nexport const RootPageNodeSchema: z.ZodType<RootPageNode> = NodeSchema.refine(\n (node): node is RootPageNode => node.type === 'page',\n {\n message: 'Root node must have type \"page\"',\n path: ['type'],\n },\n);\n\n\n/**\n * Document Metadata Schema\n * Pure serializable metadata for the document.\n */\nexport const DocumentMetadataSchema = z.object({\n title: z.string().min(1, 'Title is required').default('Untitled Page'),\n description: z.string().optional().default(''),\n author: z.string().optional().default(''),\n createdAt: z.string().optional(),\n updatedAt: z.string().optional(),\n tags: z.array(z.string()).optional().default([]),\n category: z.string().optional().default('general'),\n version: z.string().optional().default('1.0.0'),\n custom: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type DocumentMetadata = z.infer<typeof DocumentMetadataSchema>;\n\n/**\n * Page Document Schema v1\n * Root portable document structure:\n * - schema: strictly \"stora.page\"\n * - version: schema version string (e.g. \"1.0.0\")\n * - metadata: serializable metadata\n * - document: root page node\n */\nexport const PageDocumentSchema = z.object({\n schema: z.literal(SCHEMA_NAME),\n version: z.string().min(1, 'Schema version is required').default(CURRENT_SCHEMA_VERSION),\n metadata: DocumentMetadataSchema.optional(),\n document: RootPageNodeSchema,\n});\n\nexport type PageDocument = z.infer<typeof PageDocumentSchema>;\n\n\n\n/**\n * Type guards\n */\nexport function isAssetReference(value: unknown): value is AssetReference {\n return AssetReferenceSchema.safeParse(value).success;\n}\n\nexport function isVariableBinding(value: unknown): value is VariableBinding {\n return VariableBindingSchema.safeParse(value).success;\n}\n\nexport function isActionBinding(value: unknown): value is ActionBinding {\n return ActionBindingSchema.safeParse(value).success;\n}\n\nexport function isAnimationConfig(value: unknown): value is AnimationConfig {\n return AnimationConfigSchema.safeParse(value).success;\n}\n\n/**\n * Deterministic Node ID Generator\n * Generates predictable IDs based on prefix and an index/identifier (not bound to React keys).\n */\nexport function generateDeterministicNodeId(prefix: string, indexOrKey: number | string): string {\n const cleanPrefix = prefix.toLowerCase().replace(/[^a-z0-9_-]/g, '-');\n return `${cleanPrefix}_${indexOrKey}`;\n}\n\n/**\n * Collect all Node IDs in a node tree\n */\nexport function collectNodeIds(node: Node): string[] {\n const ids: string[] = [node.id];\n if (node.children && Array.isArray(node.children)) {\n for (const child of node.children) {\n ids.push(...collectNodeIds(child));\n }\n }\n return ids;\n}\n\n/**\n * Validate Node ID uniqueness across a node tree or document\n */\nexport function validateNodeIdUniqueness(node: Node): { valid: boolean; duplicateIds: string[] } {\n const allIds = collectNodeIds(node);\n const seen = new Set<string>();\n const duplicates = new Set<string>();\n\n for (const id of allIds) {\n if (seen.has(id)) {\n duplicates.add(id);\n } else {\n seen.add(id);\n }\n }\n\n return {\n valid: duplicates.size === 0,\n duplicateIds: Array.from(duplicates),\n };\n}\n","import { z } from 'zod';\nimport { SCHEMA_NAME } from './document';\n\nexport const ManifestAssetItemSchema = z.object({\n id: z.string().min(1, 'Asset ID cannot be empty'),\n path: z.string().min(1, 'Asset archive path cannot be empty'),\n mimeType: z.string().min(1, 'MIME type cannot be empty'),\n size: z.number().nonnegative('Asset size must be non-negative'),\n checksum: z.string().optional(),\n});\n\nexport type ManifestAssetItem = z.infer<typeof ManifestAssetItemSchema>;\n\nexport const ManifestSchema = z.object({\n schema: z.literal(SCHEMA_NAME).default(SCHEMA_NAME),\n schemaVersion: z.string().min(1, 'Schema version cannot be empty').default('1.0.0'),\n packageVersion: z.string().min(1, 'Package version cannot be empty').default('1.0.0'),\n builderCompatibility: z.string().default('>=0.1.0'),\n requiredComponents: z.array(z.string()).default([]),\n requiredCapabilities: z.array(z.string()).default([]),\n assets: z.array(ManifestAssetItemSchema).default([]),\n createdAt: z.string().optional(),\n});\n\nexport type Manifest = z.infer<typeof ManifestSchema>;\n\nexport function isManifest(value: unknown): value is Manifest {\n return ManifestSchema.safeParse(value).success;\n}\n","import { z } from 'zod';\nimport { AssetReferenceSchema, PageDocumentSchema, type AssetReference, type PageDocument } from './document';\n\n/**\n * Regex for screening dangerous URI schemes and payloads in thumbnail URLs.\n * Rejects javascript:, vbscript:, data: URIs that are not images (e.g. data:text/html),\n * and embedded <script> tags.\n */\nconst DANGEROUS_URI_PATTERN = /^(javascript:|vbscript:|data:(?!image\\/))|<script/i;\n\n/**\n * Validates a string as a safe URL or safe asset path.\n */\nexport function isSafeThumbnailUrl(url: string): boolean {\n if (!url || typeof url !== 'string') return false;\n const trimmed = url.trim();\n if (trimmed.length === 0) return false;\n if (DANGEROUS_URI_PATTERN.test(trimmed)) return false;\n return true;\n}\n\n/**\n * Safe Thumbnail URL String Schema\n */\nexport const SafeThumbnailUrlSchema = z.string().min(1, 'Thumbnail URL cannot be empty').refine(\n (url) => isSafeThumbnailUrl(url),\n { message: 'Thumbnail URL contains an unsafe protocol or payload' }\n);\n\n/**\n * Safe Thumbnail Object Schema\n */\nexport const SafeThumbnailObjectSchema = z.object({\n url: SafeThumbnailUrlSchema,\n alt: z.string().optional(),\n width: z.number().positive().optional(),\n height: z.number().positive().optional(),\n});\n\nexport type SafeThumbnailObject = z.infer<typeof SafeThumbnailObjectSchema>;\n\n/**\n * Safe Thumbnail Schema (AssetReference | safe URL string | safe thumbnail object)\n */\nexport const SafeThumbnailSchema = z.union([\n AssetReferenceSchema,\n SafeThumbnailObjectSchema,\n SafeThumbnailUrlSchema,\n]);\n\nexport type SafeThumbnail = AssetReference | SafeThumbnailObject | string;\n\n/**\n * Template Package Reference Schema\n * Points to an external or archived .stora / JSON package file.\n */\nexport const TemplatePackageRefSchema = z.object({\n path: z.string().optional(),\n url: SafeThumbnailUrlSchema.optional(),\n checksum: z.string().optional(),\n format: z.enum(['stora', 'json']).default('stora'),\n});\n\nexport type TemplatePackageRef = z.infer<typeof TemplatePackageRefSchema>;\n\n/**\n * Template Requirements Schema\n * Declares custom components and host capabilities required by this template.\n */\nexport const TemplateRequirementsSchema = z.object({\n requiredComponents: z.array(z.string()).default([]),\n requiredCapabilities: z.array(z.string()).default([]),\n});\n\nexport type TemplateRequirements = z.infer<typeof TemplateRequirementsSchema>;\n\n/**\n * Template Record Schema v1\n * Represents a reusable page template with full metadata, safe thumbnail,\n * component/capability requirements, and snapshot document / package reference.\n */\nexport const TemplateRecordSchema = z.object({\n id: z.string().min(1, 'Template ID must be a non-empty string'),\n name: z.string().min(1, 'Template name must be a non-empty string'),\n description: z.string().optional().default(''),\n category: z.string().optional().default('general'),\n tags: z.array(z.string()).optional().default([]),\n thumbnail: SafeThumbnailSchema.optional(),\n author: z.string().optional().default(''),\n version: z.string().optional().default('1.0.0'),\n document: PageDocumentSchema.optional(),\n packageReference: TemplatePackageRefSchema.optional(),\n requirements: TemplateRequirementsSchema.default({\n requiredComponents: [],\n requiredCapabilities: [],\n }),\n createdAt: z.string().optional(),\n updatedAt: z.string().optional(),\n custom: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type TemplateRecord = z.infer<typeof TemplateRecordSchema>;\n\n/**\n * Type guard for TemplateRecord\n */\nexport function isTemplateRecord(value: unknown): value is TemplateRecord {\n return TemplateRecordSchema.safeParse(value).success;\n}\n\n/**\n * Type guard for SafeThumbnail\n */\nexport function isSafeThumbnail(value: unknown): value is SafeThumbnail {\n return SafeThumbnailSchema.safeParse(value).success;\n}\n\n","{\n \"schema\": \"stora.page\",\n \"version\": \"1.0.0\",\n \"metadata\": {\n \"title\": \"Welcome to KUBUILD\",\n \"description\": \"A starter template built with KUBUILD portable web builder\",\n \"author\": \"KUBUILD Team\",\n \"tags\": [\"landing-page\", \"starter\", \"portable\"],\n \"category\": \"landing\",\n \"version\": \"1.0.0\",\n \"createdAt\": \"2026-08-22T00:00:00.000Z\",\n \"updatedAt\": \"2026-08-22T00:00:00.000Z\"\n },\n \"document\": {\n \"id\": \"root-page\",\n \"type\": \"page\",\n \"props\": {\n \"title\": \"KUBUILD Starter Page\"\n },\n \"styles\": {\n \"base\": {\n \"backgroundColor\": \"#ffffff\",\n \"fontFamily\": \"Inter, sans-serif\",\n \"color\": \"#111827\",\n \"minHeight\": \"100vh\"\n }\n },\n \"children\": [\n {\n \"id\": \"hero-section\",\n \"type\": \"section\",\n \"props\": {},\n \"styles\": {\n \"base\": {\n \"paddingTop\": \"64px\",\n \"paddingBottom\": \"64px\",\n \"paddingLeft\": \"24px\",\n \"paddingRight\": \"24px\",\n \"backgroundColor\": \"#f8fafc\"\n }\n },\n \"children\": [\n {\n \"id\": \"hero-container\",\n \"type\": \"container\",\n \"props\": {\n \"maxWidth\": \"1200px\"\n },\n \"styles\": {\n \"base\": {\n \"margin\": \"0 auto\",\n \"display\": \"flex\",\n \"flexDirection\": \"column\",\n \"alignItems\": \"center\",\n \"textAlign\": \"center\",\n \"gap\": \"24px\"\n }\n },\n \"children\": [\n {\n \"id\": \"hero-heading\",\n \"type\": \"heading\",\n \"props\": {\n \"text\": \"Build Once, Render Anywhere\",\n \"level\": 1\n },\n \"styles\": {\n \"base\": {\n \"fontSize\": \"48px\",\n \"fontWeight\": \"800\",\n \"color\": \"#0f172a\",\n \"lineHeight\": \"1.2\"\n },\n \"mobile\": {\n \"fontSize\": \"32px\"\n }\n },\n \"children\": []\n },\n {\n \"id\": \"hero-text\",\n \"type\": \"text\",\n \"props\": {\n \"content\": \"KUBUILD is an open, portable web page builder engine designed for modern web applications.\"\n },\n \"styles\": {\n \"base\": {\n \"fontSize\": \"18px\",\n \"color\": \"#475569\",\n \"maxWidth\": \"680px\",\n \"lineHeight\": \"1.6\"\n }\n },\n \"children\": []\n },\n {\n \"id\": \"hero-image\",\n \"type\": \"image\",\n \"props\": {\n \"src\": \"https://picsum.photos/200/300\",\n \"asset\": {\n \"type\": \"asset\",\n \"assetId\": \"asset_hero_graphic\",\n \"filename\": \"hero.webp\",\n \"mimeType\": \"image/webp\"\n },\n \"alt\": \"KUBUILD Platform Graphic\",\n \"width\": 640,\n \"height\": 360\n },\n \"styles\": {\n \"base\": {\n \"borderRadius\": \"12px\",\n \"maxWidth\": \"100%\",\n \"height\": \"auto\",\n \"boxShadow\": \"0 20px 25px -5px rgba(0, 0, 0, 0.1)\"\n }\n },\n \"children\": []\n },\n {\n \"id\": \"hero-button\",\n \"type\": \"button\",\n \"props\": {\n \"label\": \"Get Started\",\n \"action\": {\n \"type\": \"navigate\",\n \"payload\": {\n \"url\": \"/docs\"\n }\n }\n },\n \"styles\": {\n \"base\": {\n \"backgroundColor\": \"#2563eb\",\n \"color\": \"#ffffff\",\n \"paddingTop\": \"12px\",\n \"paddingBottom\": \"12px\",\n \"paddingLeft\": \"28px\",\n \"paddingRight\": \"28px\",\n \"borderRadius\": \"8px\",\n \"fontWeight\": \"600\",\n \"fontSize\": \"16px\",\n \"cursor\": \"pointer\",\n \"border\": \"none\"\n }\n },\n \"children\": []\n }\n ]\n }\n ]\n }\n ]\n }\n}\n","import starterPageData from './fixtures/starter-page.json';\nimport { PageDocument } from './document';\n\nexport const starterPageFixture: PageDocument = starterPageData as unknown as PageDocument;\n","/**\n * Standard JSON Schema Draft-07 representation of stora.page Document v1\n * Aligned 1:1 with TypeScript PageDocument type definition.\n */\nexport const PAGE_DOCUMENT_JSON_SCHEMA_V1 = {\n $schema: 'http://json-schema.org/draft-07/schema#',\n $id: 'https://schema.stora.page/v1/page.json',\n title: 'StoraPageDocument',\n description: 'Portable Web Page Document v1 schema definition for KUBUILD',\n type: 'object',\n required: ['schema', 'version', 'document'],\n additionalProperties: false,\n properties: {\n schema: {\n type: 'string',\n const: 'stora.page',\n description: 'Identifies the document type format',\n },\n version: {\n type: 'string',\n pattern: '^\\\\d+(\\\\.\\\\d+)*$',\n description: 'Schema version of the document',\n default: '1.0.0',\n },\n metadata: {\n $ref: '#/definitions/documentMetadata',\n },\n document: {\n $ref: '#/definitions/rootPageNode',\n },\n },\n definitions: {\n styleValue: {\n type: ['string', 'number', 'boolean', 'null'],\n description: 'A CSS property or design token value',\n },\n styleDefinition: {\n type: 'object',\n additionalProperties: {\n $ref: '#/definitions/styleValue',\n },\n description: 'Key-value map of style properties',\n },\n responsiveStyles: {\n type: 'object',\n properties: {\n base: { $ref: '#/definitions/styleDefinition' },\n desktop: { $ref: '#/definitions/styleDefinition' },\n tablet: { $ref: '#/definitions/styleDefinition' },\n mobile: { $ref: '#/definitions/styleDefinition' },\n },\n additionalProperties: {\n $ref: '#/definitions/styleDefinition',\n },\n },\n assetReference: {\n type: 'object',\n required: ['type', 'assetId'],\n properties: {\n type: {\n type: 'string',\n const: 'asset',\n },\n assetId: {\n type: 'string',\n minLength: 1,\n },\n filename: {\n type: 'string',\n },\n mimeType: {\n type: 'string',\n },\n fallbackUrl: {\n type: 'string',\n format: 'uri',\n },\n },\n additionalProperties: false,\n },\n variableBinding: {\n type: 'object',\n required: ['type', 'key'],\n properties: {\n type: {\n type: 'string',\n const: 'variable',\n },\n key: {\n type: 'string',\n minLength: 1,\n },\n fallback: {},\n },\n additionalProperties: false,\n },\n actionBinding: {\n type: 'object',\n required: ['type'],\n properties: {\n type: {\n type: 'string',\n minLength: 1,\n },\n payload: {\n type: 'object',\n },\n },\n additionalProperties: false,\n },\n animationConfig: {\n type: 'object',\n properties: {\n type: {\n type: 'string',\n default: 'none',\n description: 'Scroll entrance animation type (e.g. fade, fade-up, zoom-in, slide-left)',\n },\n duration: {\n type: 'number',\n minimum: 0,\n default: 600,\n description: 'Animation duration in milliseconds',\n },\n delay: {\n type: 'number',\n minimum: 0,\n default: 0,\n description: 'Animation delay in milliseconds',\n },\n easing: {\n type: 'string',\n default: 'ease-out',\n description: 'CSS animation easing / transition timing function',\n },\n once: {\n type: 'boolean',\n default: true,\n description: 'Whether scroll animation plays only once when entering viewport',\n },\n hoverEffect: {\n type: 'string',\n default: 'none',\n description: 'Hover micro-interaction effect (e.g. lift, scale, glow, tilt)',\n },\n loopEffect: {\n type: 'string',\n default: 'none',\n description: 'Continuous loop animation effect (e.g. pulse, bounce, spin, float)',\n },\n },\n additionalProperties: false,\n },\n node: {\n type: 'object',\n required: ['id', 'type'],\n properties: {\n id: {\n type: 'string',\n minLength: 1,\n description: 'Unique deterministic node identifier',\n },\n type: {\n type: 'string',\n minLength: 1,\n description: 'Component type identifier',\n },\n props: {\n type: 'object',\n description: 'Component props payload and bindings',\n default: {},\n },\n styles: {\n $ref: '#/definitions/responsiveStyles',\n },\n animation: {\n $ref: '#/definitions/animationConfig',\n },\n children: {\n type: 'array',\n items: {\n $ref: '#/definitions/node',\n },\n default: [],\n },\n },\n additionalProperties: false,\n },\n rootPageNode: {\n allOf: [\n { $ref: '#/definitions/node' },\n {\n type: 'object',\n properties: {\n type: {\n type: 'string',\n const: 'page',\n description: 'The root node type must be \"page\"',\n },\n },\n },\n ],\n },\n documentMetadata: {\n type: 'object',\n required: ['title'],\n properties: {\n title: {\n type: 'string',\n minLength: 1,\n default: 'Untitled Page',\n },\n description: {\n type: 'string',\n default: '',\n },\n author: {\n type: 'string',\n default: '',\n },\n createdAt: {\n type: 'string',\n format: 'date-time',\n },\n updatedAt: {\n type: 'string',\n format: 'date-time',\n },\n tags: {\n type: 'array',\n items: { type: 'string' },\n default: [],\n },\n category: {\n type: 'string',\n default: 'general',\n },\n version: {\n type: 'string',\n default: '1.0.0',\n },\n custom: {\n type: 'object',\n },\n },\n additionalProperties: false,\n },\n },\n} as const;\n\nexport function getPageDocumentJsonSchema() {\n return PAGE_DOCUMENT_JSON_SCHEMA_V1;\n}\n\n/**\n * Standard JSON Schema Draft-07 representation of stora.page Package Manifest v1\n * Aligned 1:1 with TypeScript Manifest type definition.\n */\nexport const MANIFEST_JSON_SCHEMA_V1 = {\n $schema: 'http://json-schema.org/draft-07/schema#',\n $id: 'https://schema.stora.page/v1/manifest.json',\n title: 'StoraPackageManifest',\n description: 'Portable Package Manifest v1 schema definition for KUBUILD (.stora)',\n type: 'object',\n required: ['schemaVersion', 'packageVersion', 'builderCompatibility', 'requiredComponents', 'requiredCapabilities', 'assets'],\n additionalProperties: false,\n properties: {\n schema: {\n type: 'string',\n const: 'stora.page',\n description: 'Schema identifier',\n default: 'stora.page',\n },\n schemaVersion: {\n type: 'string',\n pattern: '^\\\\d+(\\\\.\\\\d+)*$',\n description: 'Document schema version',\n default: '1.0.0',\n },\n packageVersion: {\n type: 'string',\n pattern: '^\\\\d+(\\\\.\\\\d+)*$',\n description: 'Package version',\n default: '1.0.0',\n },\n builderCompatibility: {\n type: 'string',\n description: 'Minimum or range of builder versions compatible with this package',\n default: '>=0.1.0',\n },\n requiredComponents: {\n type: 'array',\n items: { type: 'string' },\n description: 'List of custom component types required by the page',\n default: [],\n },\n requiredCapabilities: {\n type: 'array',\n items: { type: 'string' },\n description: 'List of capabilities required by components in the page',\n default: [],\n },\n assets: {\n type: 'array',\n items: { $ref: '#/definitions/manifestAssetItem' },\n description: 'Inventory of local assets packaged within the archive',\n default: [],\n },\n createdAt: {\n type: 'string',\n format: 'date-time',\n description: 'ISO timestamp when the package was created',\n },\n },\n definitions: {\n manifestAssetItem: {\n type: 'object',\n required: ['id', 'path', 'mimeType', 'size'],\n properties: {\n id: {\n type: 'string',\n minLength: 1,\n description: 'Unique asset identifier',\n },\n path: {\n type: 'string',\n minLength: 1,\n description: 'Relative archive path to asset file (e.g. assets/hero.png)',\n },\n mimeType: {\n type: 'string',\n minLength: 1,\n description: 'MIME type of the asset',\n },\n size: {\n type: 'number',\n minimum: 0,\n description: 'Asset size in bytes',\n },\n checksum: {\n type: 'string',\n description: 'SHA-256 or algorithm-prefixed checksum (e.g. sha256:...)',\n },\n },\n additionalProperties: false,\n },\n },\n} as const;\n\nexport function getManifestJsonSchema() {\n return MANIFEST_JSON_SCHEMA_V1;\n}\n\n/**\n * Standard JSON Schema Draft-07 representation of Template Record v1\n * Aligned 1:1 with TypeScript TemplateRecord type definition.\n */\nexport const TEMPLATE_RECORD_JSON_SCHEMA_V1 = {\n $schema: 'http://json-schema.org/draft-07/schema#',\n $id: 'https://schema.stora.page/v1/template.json',\n title: 'StoraTemplateRecord',\n description: 'Reusable Page Template Record v1 schema definition for KUBUILD',\n type: 'object',\n required: ['id', 'name'],\n additionalProperties: false,\n properties: {\n id: {\n type: 'string',\n minLength: 1,\n description: 'Unique template identifier',\n },\n name: {\n type: 'string',\n minLength: 1,\n description: 'Human-readable name of the template',\n },\n description: {\n type: 'string',\n default: '',\n description: 'Detailed description of the template purpose and contents',\n },\n category: {\n type: 'string',\n default: 'general',\n description: 'Template category grouping',\n },\n tags: {\n type: 'array',\n items: { type: 'string' },\n default: [],\n description: 'Search and filter tags',\n },\n thumbnail: {\n oneOf: [\n { $ref: '#/definitions/assetReference' },\n { $ref: '#/definitions/safeThumbnailObject' },\n { type: 'string', minLength: 1 },\n ],\n description: 'Safe preview image asset reference or URL',\n },\n author: {\n type: 'string',\n default: '',\n description: 'Template creator or team',\n },\n version: {\n type: 'string',\n default: '1.0.0',\n description: 'Semantic version of the template',\n },\n document: {\n $ref: 'https://schema.stora.page/v1/page.json#',\n description: 'Embedded PageDocument snapshot (optional if packageReference provided)',\n },\n packageReference: {\n $ref: '#/definitions/templatePackageRef',\n description: 'External package/archive reference (optional if document provided)',\n },\n requirements: {\n $ref: '#/definitions/templateRequirements',\n description: 'Component and capability requirements for this template',\n },\n createdAt: {\n type: 'string',\n format: 'date-time',\n description: 'ISO creation timestamp',\n },\n updatedAt: {\n type: 'string',\n format: 'date-time',\n description: 'ISO last updated timestamp',\n },\n custom: {\n type: 'object',\n description: 'Custom host-specific serializable metadata',\n },\n },\n definitions: {\n assetReference: {\n type: 'object',\n required: ['type', 'assetId'],\n properties: {\n type: {\n type: 'string',\n const: 'asset',\n },\n assetId: {\n type: 'string',\n minLength: 1,\n },\n filename: {\n type: 'string',\n },\n mimeType: {\n type: 'string',\n },\n fallbackUrl: {\n type: 'string',\n format: 'uri',\n },\n },\n additionalProperties: false,\n },\n safeThumbnailObject: {\n type: 'object',\n required: ['url'],\n properties: {\n url: {\n type: 'string',\n minLength: 1,\n },\n alt: {\n type: 'string',\n },\n width: {\n type: 'number',\n minimum: 1,\n },\n height: {\n type: 'number',\n minimum: 1,\n },\n },\n additionalProperties: false,\n },\n templatePackageRef: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n },\n url: {\n type: 'string',\n },\n checksum: {\n type: 'string',\n },\n format: {\n type: 'string',\n enum: ['stora', 'json'],\n default: 'stora',\n },\n },\n additionalProperties: false,\n },\n templateRequirements: {\n type: 'object',\n properties: {\n requiredComponents: {\n type: 'array',\n items: { type: 'string' },\n default: [],\n },\n requiredCapabilities: {\n type: 'array',\n items: { type: 'string' },\n default: [],\n },\n },\n additionalProperties: false,\n },\n },\n} as const;\n\nexport function getTemplateRecordJsonSchema() {\n return TEMPLATE_RECORD_JSON_SCHEMA_V1;\n}\n\n"],"mappings":"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","names":["import_zod","import_zod"]}
package/dist/index.js CHANGED
@@ -36,13 +36,40 @@ var ResponsiveStylesSchema = z.object({
36
36
  tablet: StyleDefinitionSchema.optional(),
37
37
  mobile: StyleDefinitionSchema.optional(),
38
38
  states: PseudoStateStylesSchema.optional()
39
- }).catchall(StyleDefinitionSchema).default({});
39
+ }).passthrough().default({});
40
+ var AnimationConfigSchema = z.object({
41
+ type: z.string().refine((value) => !DANGEROUS_STYLE_VALUE_PATTERN.test(value), {
42
+ message: "Animation type contains a disallowed or unsafe pattern"
43
+ }).optional().default("none"),
44
+ duration: z.number().min(0, "Duration must be non-negative").optional().default(600),
45
+ delay: z.number().min(0, "Delay must be non-negative").optional().default(0),
46
+ easing: z.string().refine((value) => !DANGEROUS_STYLE_VALUE_PATTERN.test(value), {
47
+ message: "Animation easing contains a disallowed or unsafe pattern"
48
+ }).optional().default("ease-out"),
49
+ once: z.boolean().optional().default(true),
50
+ hoverEffect: z.string().refine((value) => !DANGEROUS_STYLE_VALUE_PATTERN.test(value), {
51
+ message: "Hover effect contains a disallowed or unsafe pattern"
52
+ }).optional().default("none"),
53
+ loopEffect: z.string().refine((value) => !DANGEROUS_STYLE_VALUE_PATTERN.test(value), {
54
+ message: "Loop effect contains a disallowed or unsafe pattern"
55
+ }).optional().default("none")
56
+ });
57
+ var DEFAULT_ANIMATION_CONFIG = {
58
+ type: "none",
59
+ duration: 600,
60
+ delay: 0,
61
+ easing: "ease-out",
62
+ once: true,
63
+ hoverEffect: "none",
64
+ loopEffect: "none"
65
+ };
40
66
  var NodeSchema = z.lazy(
41
67
  () => z.object({
42
68
  id: z.string().min(1, "Node ID must be a non-empty string"),
43
69
  type: z.string().min(1, "Node type must be a non-empty string"),
44
70
  props: z.record(z.string(), z.unknown()).optional().default({}),
45
71
  styles: ResponsiveStylesSchema.optional().default({}),
72
+ animation: AnimationConfigSchema.optional(),
46
73
  children: z.array(NodeSchema).optional().default([])
47
74
  })
48
75
  );
@@ -79,6 +106,9 @@ function isVariableBinding(value) {
79
106
  function isActionBinding(value) {
80
107
  return ActionBindingSchema.safeParse(value).success;
81
108
  }
109
+ function isAnimationConfig(value) {
110
+ return AnimationConfigSchema.safeParse(value).success;
111
+ }
82
112
  function generateDeterministicNodeId(prefix, indexOrKey) {
83
113
  const cleanPrefix = prefix.toLowerCase().replace(/[^a-z0-9_-]/g, "-");
84
114
  return `${cleanPrefix}_${indexOrKey}`;
@@ -461,6 +491,49 @@ var PAGE_DOCUMENT_JSON_SCHEMA_V1 = {
461
491
  },
462
492
  additionalProperties: false
463
493
  },
494
+ animationConfig: {
495
+ type: "object",
496
+ properties: {
497
+ type: {
498
+ type: "string",
499
+ default: "none",
500
+ description: "Scroll entrance animation type (e.g. fade, fade-up, zoom-in, slide-left)"
501
+ },
502
+ duration: {
503
+ type: "number",
504
+ minimum: 0,
505
+ default: 600,
506
+ description: "Animation duration in milliseconds"
507
+ },
508
+ delay: {
509
+ type: "number",
510
+ minimum: 0,
511
+ default: 0,
512
+ description: "Animation delay in milliseconds"
513
+ },
514
+ easing: {
515
+ type: "string",
516
+ default: "ease-out",
517
+ description: "CSS animation easing / transition timing function"
518
+ },
519
+ once: {
520
+ type: "boolean",
521
+ default: true,
522
+ description: "Whether scroll animation plays only once when entering viewport"
523
+ },
524
+ hoverEffect: {
525
+ type: "string",
526
+ default: "none",
527
+ description: "Hover micro-interaction effect (e.g. lift, scale, glow, tilt)"
528
+ },
529
+ loopEffect: {
530
+ type: "string",
531
+ default: "none",
532
+ description: "Continuous loop animation effect (e.g. pulse, bounce, spin, float)"
533
+ }
534
+ },
535
+ additionalProperties: false
536
+ },
464
537
  node: {
465
538
  type: "object",
466
539
  required: ["id", "type"],
@@ -483,6 +556,9 @@ var PAGE_DOCUMENT_JSON_SCHEMA_V1 = {
483
556
  styles: {
484
557
  $ref: "#/definitions/responsiveStyles"
485
558
  },
559
+ animation: {
560
+ $ref: "#/definitions/animationConfig"
561
+ },
486
562
  children: {
487
563
  type: "array",
488
564
  items: {
@@ -821,8 +897,10 @@ function getTemplateRecordJsonSchema() {
821
897
  }
822
898
  export {
823
899
  ActionBindingSchema,
900
+ AnimationConfigSchema,
824
901
  AssetReferenceSchema,
825
902
  CURRENT_SCHEMA_VERSION,
903
+ DEFAULT_ANIMATION_CONFIG,
826
904
  DocumentMetadataSchema,
827
905
  MANIFEST_JSON_SCHEMA_V1,
828
906
  ManifestAssetItemSchema,
@@ -850,6 +928,7 @@ export {
850
928
  getPageDocumentJsonSchema,
851
929
  getTemplateRecordJsonSchema,
852
930
  isActionBinding,
931
+ isAnimationConfig,
853
932
  isAssetReference,
854
933
  isManifest,
855
934
  isSafeThumbnail,