@homepages/template-kit 0.2.0 → 0.4.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.
Files changed (165) hide show
  1. package/CHANGELOG.md +222 -0
  2. package/README.md +96 -17
  3. package/dist/asset-modules.d.ts +81 -0
  4. package/dist/base.css +9 -0
  5. package/dist/cli/check/config.js +41 -0
  6. package/dist/cli/check/css.js +131 -0
  7. package/dist/cli/check/diagnostics.js +32 -0
  8. package/dist/cli/check/index.js +87 -0
  9. package/dist/cli/check/loader.js +146 -0
  10. package/dist/cli/check/paths.js +15 -0
  11. package/dist/cli/check/relativize.js +18 -0
  12. package/dist/cli/check/render-invariants.js +24 -0
  13. package/dist/cli/check/resolve-tool.js +38 -0
  14. package/dist/cli/check/section-assets.js +58 -0
  15. package/dist/cli/check/stages/deps.js +337 -0
  16. package/dist/cli/check/stages/lint.js +46 -0
  17. package/dist/cli/check/stages/render.js +101 -0
  18. package/dist/cli/check/stages/size.js +274 -0
  19. package/dist/cli/check/stages/tree.js +206 -0
  20. package/dist/cli/check/stages/typecheck.js +46 -0
  21. package/dist/cli/check/stages/validate/catalog-exhaustiveness.js +18 -0
  22. package/dist/cli/check/stages/validate/facts.js +18 -0
  23. package/dist/cli/check/stages/validate/formatter-contract.js +14 -0
  24. package/dist/cli/check/stages/validate/group-contract.js +21 -0
  25. package/dist/cli/check/stages/validate/index.js +66 -0
  26. package/dist/cli/check/stages/validate/list-scalar-contract.js +22 -0
  27. package/dist/cli/check/stages/validate/nav-contract.js +93 -0
  28. package/dist/cli/check/stages/validate/nested-slot-contract.js +12 -0
  29. package/dist/cli/check/stages/validate/object-list-contract.js +31 -0
  30. package/dist/cli/check/stages/validate/orchestrator.js +241 -0
  31. package/dist/cli/check/stages/validate/produced-by-contract.js +18 -0
  32. package/dist/cli/check/stages/validate/row-contract.js +31 -0
  33. package/dist/cli/check/stages/validate/select-contract.js +13 -0
  34. package/dist/cli/check/stages/validate/source-contract.js +21 -0
  35. package/dist/cli/check/stages/validate/variant-contract.js +15 -0
  36. package/dist/cli/check/workspace.js +86 -0
  37. package/dist/cli/dev/build-css.js +91 -0
  38. package/dist/cli/dev/catalog.js +35 -0
  39. package/dist/cli/dev/compose-template.js +38 -0
  40. package/dist/cli/dev/content-override.js +58 -0
  41. package/dist/cli/dev/discover.js +35 -0
  42. package/dist/cli/dev/fill-state.js +75 -0
  43. package/dist/cli/dev/index.js +32 -0
  44. package/dist/cli/dev/inspect.js +38 -0
  45. package/dist/cli/dev/island-bootstrap.js +38 -0
  46. package/dist/cli/dev/island-map.js +35 -0
  47. package/dist/cli/dev/island-transform.js +31 -0
  48. package/dist/cli/dev/manifest-instances.js +31 -0
  49. package/dist/cli/dev/render-section.js +24 -0
  50. package/dist/cli/dev/screenshot-target.js +24 -0
  51. package/dist/cli/dev/section-page.js +54 -0
  52. package/dist/cli/dev/server.js +480 -0
  53. package/dist/cli/dev/slot-schema.js +12 -0
  54. package/dist/cli/dev/structure-summary.js +118 -0
  55. package/dist/cli/dev/tailwind.js +32 -0
  56. package/dist/cli/dev/vite-server.js +33 -0
  57. package/dist/cli/dev/workspace.js +63 -0
  58. package/dist/cli/link/index.js +74 -0
  59. package/dist/cli/link/overlay.js +59 -0
  60. package/dist/cli/link/watch.js +25 -0
  61. package/dist/cli/new/emit.js +48 -0
  62. package/dist/cli/new/index.js +69 -0
  63. package/dist/cli/new/scaffold/section/_Renderer.tsx +20 -0
  64. package/dist/cli/new/scaffold/section/_fill-spec.ts +18 -0
  65. package/dist/cli/new/scaffold/section/_fixtures.ts +13 -0
  66. package/dist/cli/new/scaffold/section/_schema.ts +24 -0
  67. package/dist/cli/new/scaffold/template/_manifest.json +9 -0
  68. package/dist/cli/new/scaffold/template/sections/hero/ExpandableText.tsx +45 -0
  69. package/dist/cli/new/scaffold/template/sections/hero/Renderer.tsx +40 -0
  70. package/dist/cli/new/scaffold/template/sections/hero/components/Feature.tsx +14 -0
  71. package/dist/cli/new/scaffold/template/sections/hero/fill-spec.ts +29 -0
  72. package/dist/cli/new/scaffold/template/sections/hero/fixtures.ts +41 -0
  73. package/dist/cli/new/scaffold/template/sections/hero/schema.ts +60 -0
  74. package/dist/cli/new/scaffold/template/theme.css +24 -0
  75. package/dist/cli/new/scaffold/template/theme.ts +27 -0
  76. package/dist/cli/new/scaffold-assets.js +20 -0
  77. package/dist/cli/pack/collect.js +44 -0
  78. package/dist/cli/pack/guards.js +57 -0
  79. package/dist/cli/pack/index.js +66 -0
  80. package/dist/cli/pack/manifest.js +15 -0
  81. package/dist/cli/pack/zip.js +86 -0
  82. package/dist/cli/theme/generate.js +43 -0
  83. package/dist/cli/theme/index.js +33 -0
  84. package/dist/cli/theme/load-theme.js +69 -0
  85. package/dist/cli.js +100 -16
  86. package/dist/contracts/fill-treatments.js +47 -0
  87. package/dist/design-system/theme.d.ts +30 -300
  88. package/dist/design-system/theme.js +112 -90
  89. package/dist/dev-client/assets/index-DfEfrp6P.css +1 -0
  90. package/dist/dev-client/assets/index-bpMP0b0W.js +50 -0
  91. package/dist/dev-client/index.html +13 -0
  92. package/dist/eslint/is-client-file.d.ts +4 -0
  93. package/dist/eslint/rules/no-hex.js +78 -6
  94. package/dist/eslint.js +1 -1
  95. package/dist/index.d.ts +3 -2
  96. package/dist/index.js +2 -2
  97. package/dist/islands/detect.d.ts +16 -0
  98. package/dist/islands/detect.js +22 -0
  99. package/dist/islands/discover.d.ts +5 -0
  100. package/dist/islands/discover.js +19 -0
  101. package/dist/islands/esbuild-plugin.d.ts +13 -0
  102. package/dist/islands/esbuild-plugin.js +39 -0
  103. package/dist/islands/wrap.d.ts +11 -0
  104. package/dist/islands/wrap.js +48 -0
  105. package/dist/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.js +77 -0
  106. package/dist/node_modules/magic-string/dist/magic-string.es.js +939 -0
  107. package/dist/package.js +1 -1
  108. package/dist/primitives/Image.js +1 -1
  109. package/dist/schema/fill-spec.d.ts +80 -590
  110. package/dist/schema/fixture-schema.d.ts +5 -81
  111. package/dist/schema/manifest.d.ts +39 -475
  112. package/dist/schema/resolve-section-ref.js +10 -0
  113. package/dist/schema/rows.js +10 -0
  114. package/dist/schema/section-nav.js +9 -0
  115. package/dist/schema/section-schema.d.ts +51 -437
  116. package/dist/schema/slot-types.d.ts +12 -16
  117. package/dist/ssr.d.ts +31 -0
  118. package/dist/ssr.js +46 -0
  119. package/dist/styles.css +31 -88
  120. package/docs/INDEX.md +12 -3
  121. package/docs/assets.md +128 -0
  122. package/docs/check.md +124 -0
  123. package/docs/dev.md +187 -0
  124. package/docs/eslint.md +18 -8
  125. package/docs/islands.md +5 -2
  126. package/docs/llms.txt +59 -9
  127. package/docs/new.md +27 -0
  128. package/docs/overview.md +57 -0
  129. package/docs/pack.md +46 -0
  130. package/docs/primitives.md +10 -6
  131. package/docs/quickstart.md +102 -0
  132. package/docs/recipes/INDEX.md +27 -0
  133. package/docs/recipes/bind-property-fact.md +58 -0
  134. package/docs/recipes/collection-slot.md +100 -0
  135. package/docs/recipes/fill-spec-decision.md +66 -0
  136. package/docs/recipes/fixture-states.md +68 -0
  137. package/docs/recipes/image-slot-crop.md +98 -0
  138. package/docs/recipes/interactive-island.md +100 -0
  139. package/docs/recipes/organize-section-folder.md +72 -0
  140. package/docs/recipes/prepare-submission.md +55 -0
  141. package/docs/recipes/second-template.md +49 -0
  142. package/docs/recipes/select-slot.md +59 -0
  143. package/docs/recipes/static-asset.md +103 -0
  144. package/docs/recipes/third-party-package.md +90 -0
  145. package/docs/rules/INDEX.md +14 -5
  146. package/docs/rules/bundle-binary-asset.md +83 -0
  147. package/docs/rules/bundle-incomplete.md +2 -2
  148. package/docs/rules/css-reason.md +3 -3
  149. package/docs/rules/fixtures-invalid.md +96 -0
  150. package/docs/rules/license-denied.md +11 -3
  151. package/docs/rules/manifest-invalid.md +99 -0
  152. package/docs/rules/no-bare-css-import.md +8 -8
  153. package/docs/rules/no-css-import-from-render-path.md +7 -8
  154. package/docs/rules/no-hex.md +76 -10
  155. package/docs/rules/no-templates.md +87 -0
  156. package/docs/rules/parse-error.md +76 -0
  157. package/docs/rules/schema-invalid.md +96 -0
  158. package/docs/rules/size-assets.md +88 -0
  159. package/docs/rules/size-island-bundle.md +123 -0
  160. package/docs/rules/size-section-css.md +19 -14
  161. package/docs/schema-system.md +28 -28
  162. package/docs/theme-and-css.md +157 -92
  163. package/docs/vocabulary.md +98 -0
  164. package/package.json +14 -11
  165. package/tsconfig.json +1 -1
@@ -7,102 +7,26 @@ declare const FixtureOverride: z.ZodObject<{
7
7
  options: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
8
8
  anchors: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
9
9
  variants: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
10
- }, "strip", z.ZodTypeAny, {
11
- options?: Record<string, unknown> | undefined;
12
- label?: string | undefined;
13
- variants?: Record<string, string> | undefined;
14
- slots?: Record<string, unknown> | undefined;
15
- anchors?: Record<string, string> | undefined;
16
- }, {
17
- options?: Record<string, unknown> | undefined;
18
- label?: string | undefined;
19
- variants?: Record<string, string> | undefined;
20
- slots?: Record<string, unknown> | undefined;
21
- anchors?: Record<string, string> | undefined;
22
- }>;
10
+ }, z.core.$strip>;
23
11
  declare const FixtureModuleShape: z.ZodObject<{
24
12
  base: z.ZodObject<{
25
13
  slots: z.ZodRecord<z.ZodString, z.ZodUnknown>;
26
14
  options: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
27
15
  anchors: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
28
16
  variants: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
29
- }, "strip", z.ZodTypeAny, {
30
- slots: Record<string, unknown>;
31
- options?: Record<string, unknown> | undefined;
32
- variants?: Record<string, string> | undefined;
33
- anchors?: Record<string, string> | undefined;
34
- }, {
35
- slots: Record<string, unknown>;
36
- options?: Record<string, unknown> | undefined;
37
- variants?: Record<string, string> | undefined;
38
- anchors?: Record<string, string> | undefined;
39
- }>;
17
+ }, z.core.$strip>;
40
18
  option_matrix: z.ZodOptional<z.ZodArray<z.ZodObject<{
41
19
  label: z.ZodOptional<z.ZodString>;
42
20
  options: z.ZodRecord<z.ZodString, z.ZodUnknown>;
43
- }, "strip", z.ZodTypeAny, {
44
- options: Record<string, unknown>;
45
- label?: string | undefined;
46
- }, {
47
- options: Record<string, unknown>;
48
- label?: string | undefined;
49
- }>, "many">>;
21
+ }, z.core.$strip>>>;
50
22
  states: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
51
23
  label: z.ZodOptional<z.ZodString>;
52
24
  slots: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
53
25
  options: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
54
26
  anchors: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
55
27
  variants: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
56
- }, "strip", z.ZodTypeAny, {
57
- options?: Record<string, unknown> | undefined;
58
- label?: string | undefined;
59
- variants?: Record<string, string> | undefined;
60
- slots?: Record<string, unknown> | undefined;
61
- anchors?: Record<string, string> | undefined;
62
- }, {
63
- options?: Record<string, unknown> | undefined;
64
- label?: string | undefined;
65
- variants?: Record<string, string> | undefined;
66
- slots?: Record<string, unknown> | undefined;
67
- anchors?: Record<string, string> | undefined;
68
- }>>>;
69
- }, "strip", z.ZodTypeAny, {
70
- base: {
71
- slots: Record<string, unknown>;
72
- options?: Record<string, unknown> | undefined;
73
- variants?: Record<string, string> | undefined;
74
- anchors?: Record<string, string> | undefined;
75
- };
76
- option_matrix?: {
77
- options: Record<string, unknown>;
78
- label?: string | undefined;
79
- }[] | undefined;
80
- states?: Record<string, {
81
- options?: Record<string, unknown> | undefined;
82
- label?: string | undefined;
83
- variants?: Record<string, string> | undefined;
84
- slots?: Record<string, unknown> | undefined;
85
- anchors?: Record<string, string> | undefined;
86
- }> | undefined;
87
- }, {
88
- base: {
89
- slots: Record<string, unknown>;
90
- options?: Record<string, unknown> | undefined;
91
- variants?: Record<string, string> | undefined;
92
- anchors?: Record<string, string> | undefined;
93
- };
94
- option_matrix?: {
95
- options: Record<string, unknown>;
96
- label?: string | undefined;
97
- }[] | undefined;
98
- states?: Record<string, {
99
- options?: Record<string, unknown> | undefined;
100
- label?: string | undefined;
101
- variants?: Record<string, string> | undefined;
102
- slots?: Record<string, unknown> | undefined;
103
- anchors?: Record<string, string> | undefined;
104
- }> | undefined;
105
- }>;
28
+ }, z.core.$strip>>>;
29
+ }, z.core.$strip>;
106
30
  type FixtureModule = z.infer<typeof FixtureModuleShape>;
107
31
  type FixtureOverride = z.infer<typeof FixtureOverride>;
108
32
  type ResolvedFixture = {
@@ -1,527 +1,91 @@
1
1
  import { z } from "zod";
2
2
  //#region src/schema/manifest.d.ts
3
- declare const TemplateManifest: z.ZodEffects<z.ZodObject<{
3
+ declare const TemplateManifest: z.ZodObject<{
4
4
  key: z.ZodString;
5
5
  name: z.ZodString;
6
- deliverable_type: z.ZodEnum<["single_property_website"]>;
7
- options: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
6
+ deliverable_type: z.ZodEnum<{
7
+ single_property_website: "single_property_website";
8
+ }>;
9
+ options: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodDiscriminatedUnion<[z.ZodObject<{
8
10
  user_editable: z.ZodDefault<z.ZodBoolean>;
9
11
  template_overridable: z.ZodDefault<z.ZodBoolean>;
10
12
  planner_settable: z.ZodDefault<z.ZodBoolean>;
11
- affects_decisions: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
12
- affects_slots: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
13
+ affects_decisions: z.ZodDefault<z.ZodArray<z.ZodString>>;
14
+ affects_slots: z.ZodDefault<z.ZodArray<z.ZodString>>;
13
15
  type: z.ZodLiteral<"enum">;
14
- values: z.ZodArray<z.ZodString, "many">;
16
+ values: z.ZodArray<z.ZodString>;
15
17
  default: z.ZodString;
16
- }, "strict", z.ZodTypeAny, {
17
- type: "enum";
18
- values: string[];
19
- default: string;
20
- user_editable: boolean;
21
- template_overridable: boolean;
22
- planner_settable: boolean;
23
- affects_decisions: string[];
24
- affects_slots: string[];
25
- }, {
26
- type: "enum";
27
- values: string[];
28
- default: string;
29
- user_editable?: boolean | undefined;
30
- template_overridable?: boolean | undefined;
31
- planner_settable?: boolean | undefined;
32
- affects_decisions?: string[] | undefined;
33
- affects_slots?: string[] | undefined;
34
- }>, z.ZodObject<{
18
+ }, z.core.$strict>, z.ZodObject<{
35
19
  user_editable: z.ZodDefault<z.ZodBoolean>;
36
20
  template_overridable: z.ZodDefault<z.ZodBoolean>;
37
21
  planner_settable: z.ZodDefault<z.ZodBoolean>;
38
- affects_decisions: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
39
- affects_slots: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
22
+ affects_decisions: z.ZodDefault<z.ZodArray<z.ZodString>>;
23
+ affects_slots: z.ZodDefault<z.ZodArray<z.ZodString>>;
40
24
  type: z.ZodLiteral<"bool">;
41
25
  default: z.ZodBoolean;
42
- }, "strict", z.ZodTypeAny, {
43
- type: "bool";
44
- default: boolean;
45
- user_editable: boolean;
46
- template_overridable: boolean;
47
- planner_settable: boolean;
48
- affects_decisions: string[];
49
- affects_slots: string[];
50
- }, {
51
- type: "bool";
52
- default: boolean;
53
- user_editable?: boolean | undefined;
54
- template_overridable?: boolean | undefined;
55
- planner_settable?: boolean | undefined;
56
- affects_decisions?: string[] | undefined;
57
- affects_slots?: string[] | undefined;
58
- }>, z.ZodObject<{
26
+ }, z.core.$strict>, z.ZodObject<{
59
27
  user_editable: z.ZodDefault<z.ZodBoolean>;
60
28
  template_overridable: z.ZodDefault<z.ZodBoolean>;
61
29
  planner_settable: z.ZodDefault<z.ZodBoolean>;
62
- affects_decisions: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
63
- affects_slots: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
30
+ affects_decisions: z.ZodDefault<z.ZodArray<z.ZodString>>;
31
+ affects_slots: z.ZodDefault<z.ZodArray<z.ZodString>>;
64
32
  type: z.ZodLiteral<"int">;
65
33
  default: z.ZodNumber;
66
34
  min: z.ZodOptional<z.ZodNumber>;
67
35
  max: z.ZodOptional<z.ZodNumber>;
68
- }, "strict", z.ZodTypeAny, {
69
- type: "int";
70
- default: number;
71
- user_editable: boolean;
72
- template_overridable: boolean;
73
- planner_settable: boolean;
74
- affects_decisions: string[];
75
- affects_slots: string[];
76
- min?: number | undefined;
77
- max?: number | undefined;
78
- }, {
79
- type: "int";
80
- default: number;
81
- user_editable?: boolean | undefined;
82
- template_overridable?: boolean | undefined;
83
- planner_settable?: boolean | undefined;
84
- affects_decisions?: string[] | undefined;
85
- affects_slots?: string[] | undefined;
86
- min?: number | undefined;
87
- max?: number | undefined;
88
- }>, z.ZodObject<{
36
+ }, z.core.$strict>, z.ZodObject<{
89
37
  user_editable: z.ZodDefault<z.ZodBoolean>;
90
38
  template_overridable: z.ZodDefault<z.ZodBoolean>;
91
39
  planner_settable: z.ZodDefault<z.ZodBoolean>;
92
- affects_decisions: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
93
- affects_slots: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
40
+ affects_decisions: z.ZodDefault<z.ZodArray<z.ZodString>>;
41
+ affects_slots: z.ZodDefault<z.ZodArray<z.ZodString>>;
94
42
  type: z.ZodLiteral<"string">;
95
43
  default: z.ZodString;
96
- }, "strict", z.ZodTypeAny, {
97
- type: "string";
98
- default: string;
99
- user_editable: boolean;
100
- template_overridable: boolean;
101
- planner_settable: boolean;
102
- affects_decisions: string[];
103
- affects_slots: string[];
104
- }, {
105
- type: "string";
106
- default: string;
107
- user_editable?: boolean | undefined;
108
- template_overridable?: boolean | undefined;
109
- planner_settable?: boolean | undefined;
110
- affects_decisions?: string[] | undefined;
111
- affects_slots?: string[] | undefined;
112
- }>, z.ZodObject<{
44
+ }, z.core.$strict>, z.ZodObject<{
113
45
  user_editable: z.ZodDefault<z.ZodBoolean>;
114
46
  template_overridable: z.ZodDefault<z.ZodBoolean>;
115
47
  planner_settable: z.ZodDefault<z.ZodBoolean>;
116
- affects_decisions: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
117
- affects_slots: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
48
+ affects_decisions: z.ZodDefault<z.ZodArray<z.ZodString>>;
49
+ affects_slots: z.ZodDefault<z.ZodArray<z.ZodString>>;
118
50
  type: z.ZodLiteral<"json">;
119
51
  default: z.ZodUnknown;
120
- }, "strict", z.ZodTypeAny, {
121
- type: "json";
122
- user_editable: boolean;
123
- template_overridable: boolean;
124
- planner_settable: boolean;
125
- affects_decisions: string[];
126
- affects_slots: string[];
127
- default?: unknown;
128
- }, {
129
- type: "json";
130
- default?: unknown;
131
- user_editable?: boolean | undefined;
132
- template_overridable?: boolean | undefined;
133
- planner_settable?: boolean | undefined;
134
- affects_decisions?: string[] | undefined;
135
- affects_slots?: string[] | undefined;
136
- }>]>>>;
52
+ }, z.core.$strict>], "type">>>;
137
53
  sections: z.ZodArray<z.ZodObject<{
138
54
  section: z.ZodString;
139
55
  instance_id: z.ZodString;
140
56
  options: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
141
- locked: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
57
+ locked: z.ZodDefault<z.ZodArray<z.ZodString>>;
142
58
  required: z.ZodDefault<z.ZodBoolean>;
143
59
  reorderable: z.ZodDefault<z.ZodBoolean>;
144
- }, "strict", z.ZodTypeAny, {
145
- options: Record<string, unknown>;
146
- required: boolean;
147
- section: string;
148
- instance_id: string;
149
- locked: string[];
150
- reorderable: boolean;
151
- }, {
152
- section: string;
153
- instance_id: string;
154
- options?: Record<string, unknown> | undefined;
155
- required?: boolean | undefined;
156
- locked?: string[] | undefined;
157
- reorderable?: boolean | undefined;
158
- }>, "many">;
60
+ }, z.core.$strict>>;
159
61
  reconcile: z.ZodDefault<z.ZodArray<z.ZodObject<{
160
62
  type: z.ZodLiteral<"dedup-image">;
161
63
  from: z.ZodObject<{
162
64
  section: z.ZodString;
163
65
  slot: z.ZodString;
164
- }, "strict", z.ZodTypeAny, {
165
- slot: string;
166
- section: string;
167
- }, {
168
- slot: string;
169
- section: string;
170
- }>;
66
+ }, z.core.$strict>;
171
67
  into: z.ZodObject<{
172
68
  section: z.ZodString;
173
69
  slot: z.ZodString;
174
- }, "strict", z.ZodTypeAny, {
175
- slot: string;
176
- section: string;
177
- }, {
178
- slot: string;
179
- section: string;
180
- }>;
181
- predicate_tags: z.ZodArray<z.ZodString, "many">;
70
+ }, z.core.$strict>;
71
+ predicate_tags: z.ZodArray<z.ZodString>;
182
72
  min: z.ZodNumber;
183
- }, "strict", z.ZodTypeAny, {
184
- type: "dedup-image";
185
- min: number;
186
- from: {
187
- slot: string;
188
- section: string;
189
- };
190
- into: {
191
- slot: string;
192
- section: string;
193
- };
194
- predicate_tags: string[];
195
- }, {
196
- type: "dedup-image";
197
- min: number;
198
- from: {
199
- slot: string;
200
- section: string;
201
- };
202
- into: {
203
- slot: string;
204
- section: string;
205
- };
206
- predicate_tags: string[];
207
- }>, "many">>;
73
+ }, z.core.$strict>>>;
208
74
  preview: z.ZodOptional<z.ZodObject<{
209
75
  blurb: z.ZodString;
210
- intents: z.ZodArray<z.ZodEnum<["for_sale", "for_rent"]>, "many">;
211
- types: z.ZodArray<z.ZodEnum<["single_family", "condo_townhome", "multi_family", "investment"]>, "many">;
76
+ intents: z.ZodArray<z.ZodEnum<{
77
+ for_sale: "for_sale";
78
+ for_rent: "for_rent";
79
+ }>>;
80
+ types: z.ZodArray<z.ZodEnum<{
81
+ single_family: "single_family";
82
+ condo_townhome: "condo_townhome";
83
+ multi_family: "multi_family";
84
+ investment: "investment";
85
+ }>>;
212
86
  demoUrl: z.ZodOptional<z.ZodNullable<z.ZodString>>;
213
- }, "strict", z.ZodTypeAny, {
214
- blurb: string;
215
- intents: ("for_sale" | "for_rent")[];
216
- types: ("single_family" | "condo_townhome" | "multi_family" | "investment")[];
217
- demoUrl?: string | null | undefined;
218
- }, {
219
- blurb: string;
220
- intents: ("for_sale" | "for_rent")[];
221
- types: ("single_family" | "condo_townhome" | "multi_family" | "investment")[];
222
- demoUrl?: string | null | undefined;
223
- }>>;
224
- }, "strict", z.ZodTypeAny, {
225
- key: string;
226
- name: string;
227
- deliverable_type: "single_property_website";
228
- sections: {
229
- options: Record<string, unknown>;
230
- required: boolean;
231
- section: string;
232
- instance_id: string;
233
- locked: string[];
234
- reorderable: boolean;
235
- }[];
236
- reconcile: {
237
- type: "dedup-image";
238
- min: number;
239
- from: {
240
- slot: string;
241
- section: string;
242
- };
243
- into: {
244
- slot: string;
245
- section: string;
246
- };
247
- predicate_tags: string[];
248
- }[];
249
- options?: Record<string, {
250
- type: "enum";
251
- values: string[];
252
- default: string;
253
- user_editable: boolean;
254
- template_overridable: boolean;
255
- planner_settable: boolean;
256
- affects_decisions: string[];
257
- affects_slots: string[];
258
- } | {
259
- type: "bool";
260
- default: boolean;
261
- user_editable: boolean;
262
- template_overridable: boolean;
263
- planner_settable: boolean;
264
- affects_decisions: string[];
265
- affects_slots: string[];
266
- } | {
267
- type: "int";
268
- default: number;
269
- user_editable: boolean;
270
- template_overridable: boolean;
271
- planner_settable: boolean;
272
- affects_decisions: string[];
273
- affects_slots: string[];
274
- min?: number | undefined;
275
- max?: number | undefined;
276
- } | {
277
- type: "string";
278
- default: string;
279
- user_editable: boolean;
280
- template_overridable: boolean;
281
- planner_settable: boolean;
282
- affects_decisions: string[];
283
- affects_slots: string[];
284
- } | {
285
- type: "json";
286
- user_editable: boolean;
287
- template_overridable: boolean;
288
- planner_settable: boolean;
289
- affects_decisions: string[];
290
- affects_slots: string[];
291
- default?: unknown;
292
- }> | undefined;
293
- preview?: {
294
- blurb: string;
295
- intents: ("for_sale" | "for_rent")[];
296
- types: ("single_family" | "condo_townhome" | "multi_family" | "investment")[];
297
- demoUrl?: string | null | undefined;
298
- } | undefined;
299
- }, {
300
- key: string;
301
- name: string;
302
- deliverable_type: "single_property_website";
303
- sections: {
304
- section: string;
305
- instance_id: string;
306
- options?: Record<string, unknown> | undefined;
307
- required?: boolean | undefined;
308
- locked?: string[] | undefined;
309
- reorderable?: boolean | undefined;
310
- }[];
311
- options?: Record<string, {
312
- type: "enum";
313
- values: string[];
314
- default: string;
315
- user_editable?: boolean | undefined;
316
- template_overridable?: boolean | undefined;
317
- planner_settable?: boolean | undefined;
318
- affects_decisions?: string[] | undefined;
319
- affects_slots?: string[] | undefined;
320
- } | {
321
- type: "bool";
322
- default: boolean;
323
- user_editable?: boolean | undefined;
324
- template_overridable?: boolean | undefined;
325
- planner_settable?: boolean | undefined;
326
- affects_decisions?: string[] | undefined;
327
- affects_slots?: string[] | undefined;
328
- } | {
329
- type: "int";
330
- default: number;
331
- user_editable?: boolean | undefined;
332
- template_overridable?: boolean | undefined;
333
- planner_settable?: boolean | undefined;
334
- affects_decisions?: string[] | undefined;
335
- affects_slots?: string[] | undefined;
336
- min?: number | undefined;
337
- max?: number | undefined;
338
- } | {
339
- type: "string";
340
- default: string;
341
- user_editable?: boolean | undefined;
342
- template_overridable?: boolean | undefined;
343
- planner_settable?: boolean | undefined;
344
- affects_decisions?: string[] | undefined;
345
- affects_slots?: string[] | undefined;
346
- } | {
347
- type: "json";
348
- default?: unknown;
349
- user_editable?: boolean | undefined;
350
- template_overridable?: boolean | undefined;
351
- planner_settable?: boolean | undefined;
352
- affects_decisions?: string[] | undefined;
353
- affects_slots?: string[] | undefined;
354
- }> | undefined;
355
- reconcile?: {
356
- type: "dedup-image";
357
- min: number;
358
- from: {
359
- slot: string;
360
- section: string;
361
- };
362
- into: {
363
- slot: string;
364
- section: string;
365
- };
366
- predicate_tags: string[];
367
- }[] | undefined;
368
- preview?: {
369
- blurb: string;
370
- intents: ("for_sale" | "for_rent")[];
371
- types: ("single_family" | "condo_townhome" | "multi_family" | "investment")[];
372
- demoUrl?: string | null | undefined;
373
- } | undefined;
374
- }>, {
375
- key: string;
376
- name: string;
377
- deliverable_type: "single_property_website";
378
- sections: {
379
- options: Record<string, unknown>;
380
- required: boolean;
381
- section: string;
382
- instance_id: string;
383
- locked: string[];
384
- reorderable: boolean;
385
- }[];
386
- reconcile: {
387
- type: "dedup-image";
388
- min: number;
389
- from: {
390
- slot: string;
391
- section: string;
392
- };
393
- into: {
394
- slot: string;
395
- section: string;
396
- };
397
- predicate_tags: string[];
398
- }[];
399
- options?: Record<string, {
400
- type: "enum";
401
- values: string[];
402
- default: string;
403
- user_editable: boolean;
404
- template_overridable: boolean;
405
- planner_settable: boolean;
406
- affects_decisions: string[];
407
- affects_slots: string[];
408
- } | {
409
- type: "bool";
410
- default: boolean;
411
- user_editable: boolean;
412
- template_overridable: boolean;
413
- planner_settable: boolean;
414
- affects_decisions: string[];
415
- affects_slots: string[];
416
- } | {
417
- type: "int";
418
- default: number;
419
- user_editable: boolean;
420
- template_overridable: boolean;
421
- planner_settable: boolean;
422
- affects_decisions: string[];
423
- affects_slots: string[];
424
- min?: number | undefined;
425
- max?: number | undefined;
426
- } | {
427
- type: "string";
428
- default: string;
429
- user_editable: boolean;
430
- template_overridable: boolean;
431
- planner_settable: boolean;
432
- affects_decisions: string[];
433
- affects_slots: string[];
434
- } | {
435
- type: "json";
436
- user_editable: boolean;
437
- template_overridable: boolean;
438
- planner_settable: boolean;
439
- affects_decisions: string[];
440
- affects_slots: string[];
441
- default?: unknown;
442
- }> | undefined;
443
- preview?: {
444
- blurb: string;
445
- intents: ("for_sale" | "for_rent")[];
446
- types: ("single_family" | "condo_townhome" | "multi_family" | "investment")[];
447
- demoUrl?: string | null | undefined;
448
- } | undefined;
449
- }, {
450
- key: string;
451
- name: string;
452
- deliverable_type: "single_property_website";
453
- sections: {
454
- section: string;
455
- instance_id: string;
456
- options?: Record<string, unknown> | undefined;
457
- required?: boolean | undefined;
458
- locked?: string[] | undefined;
459
- reorderable?: boolean | undefined;
460
- }[];
461
- options?: Record<string, {
462
- type: "enum";
463
- values: string[];
464
- default: string;
465
- user_editable?: boolean | undefined;
466
- template_overridable?: boolean | undefined;
467
- planner_settable?: boolean | undefined;
468
- affects_decisions?: string[] | undefined;
469
- affects_slots?: string[] | undefined;
470
- } | {
471
- type: "bool";
472
- default: boolean;
473
- user_editable?: boolean | undefined;
474
- template_overridable?: boolean | undefined;
475
- planner_settable?: boolean | undefined;
476
- affects_decisions?: string[] | undefined;
477
- affects_slots?: string[] | undefined;
478
- } | {
479
- type: "int";
480
- default: number;
481
- user_editable?: boolean | undefined;
482
- template_overridable?: boolean | undefined;
483
- planner_settable?: boolean | undefined;
484
- affects_decisions?: string[] | undefined;
485
- affects_slots?: string[] | undefined;
486
- min?: number | undefined;
487
- max?: number | undefined;
488
- } | {
489
- type: "string";
490
- default: string;
491
- user_editable?: boolean | undefined;
492
- template_overridable?: boolean | undefined;
493
- planner_settable?: boolean | undefined;
494
- affects_decisions?: string[] | undefined;
495
- affects_slots?: string[] | undefined;
496
- } | {
497
- type: "json";
498
- default?: unknown;
499
- user_editable?: boolean | undefined;
500
- template_overridable?: boolean | undefined;
501
- planner_settable?: boolean | undefined;
502
- affects_decisions?: string[] | undefined;
503
- affects_slots?: string[] | undefined;
504
- }> | undefined;
505
- reconcile?: {
506
- type: "dedup-image";
507
- min: number;
508
- from: {
509
- slot: string;
510
- section: string;
511
- };
512
- into: {
513
- slot: string;
514
- section: string;
515
- };
516
- predicate_tags: string[];
517
- }[] | undefined;
518
- preview?: {
519
- blurb: string;
520
- intents: ("for_sale" | "for_rent")[];
521
- types: ("single_family" | "condo_townhome" | "multi_family" | "investment")[];
522
- demoUrl?: string | null | undefined;
523
- } | undefined;
524
- }>;
87
+ }, z.core.$strict>>;
88
+ }, z.core.$strict>;
525
89
  type TemplateManifestShape = z.infer<typeof TemplateManifest>;
526
90
  //#endregion
527
91
  export { TemplateManifest, TemplateManifestShape };
@@ -0,0 +1,10 @@
1
+ //#region src/schema/resolve-section-ref.ts
2
+ const SHARED_NS = "shared/";
3
+ function resolveSectionRef(templateKey, ref) {
4
+ if (ref.startsWith(SHARED_NS)) return ref;
5
+ if (ref.includes("/")) throw new Error(`Bare section ref "${ref}" must not contain "/". A local section is named by its bare name; a shared section is named "shared/<name>".`);
6
+ return `${templateKey}/${ref}`;
7
+ }
8
+
9
+ //#endregion
10
+ export { resolveSectionRef };
@@ -0,0 +1,10 @@
1
+ //#region src/schema/rows.ts
2
+ function flattenLayout(layout) {
3
+ return layout.flatMap((entry) => typeof entry === "string" ? [entry] : [entry[0], entry[1]]);
4
+ }
5
+ function isShortSlot(slot) {
6
+ return slot.type === "number" || slot.type === "url" || slot.type === "text" && (slot.size === void 0 || slot.size === "short");
7
+ }
8
+
9
+ //#endregion
10
+ export { flattenLayout, isShortSlot };