@aglyn/plugins-ai 1.0.0-beta.285 → 1.0.0-beta.287

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 (210) hide show
  1. package/package.json +17 -17
  2. package/src/lib/assets/site-styles/nonprofit.webp +0 -0
  3. package/src/lib/assets/site-styles/professional.webp +0 -0
  4. package/src/lib/assets/site-styles/store.webp +0 -0
  5. package/src/lib/assets/site-styles/trades.webp +0 -0
  6. package/src/lib/components/ai-theme-proposal-card.component.js +12 -3
  7. package/src/lib/components/ai-theme-proposal-card.component.js.map +1 -1
  8. package/src/lib/declarations.js +5 -2
  9. package/src/lib/declarations.js.map +1 -1
  10. package/src/lib/declarations.server.js +12 -0
  11. package/src/lib/declarations.server.js.map +1 -1
  12. package/src/lib/jobs/ai-build-capabilities.d.ts +3 -1
  13. package/src/lib/jobs/ai-build-capabilities.js +27 -2
  14. package/src/lib/jobs/ai-build-capabilities.js.map +1 -1
  15. package/src/lib/jobs/ai-image-reads.d.ts +59 -0
  16. package/src/lib/jobs/ai-image-reads.js +138 -0
  17. package/src/lib/jobs/ai-image-reads.js.map +1 -0
  18. package/src/lib/jobs/ai-job-build-step.d.ts +29 -0
  19. package/src/lib/jobs/ai-job-build-step.js +83 -12
  20. package/src/lib/jobs/ai-job-build-step.js.map +1 -1
  21. package/src/lib/jobs/ai-job-duplicate-step.d.ts +2 -1
  22. package/src/lib/jobs/ai-job-duplicate-step.js +6 -6
  23. package/src/lib/jobs/ai-job-duplicate-step.js.map +1 -1
  24. package/src/lib/jobs/ai-job-import-step.d.ts +4 -2
  25. package/src/lib/jobs/ai-job-import-step.js +15 -11
  26. package/src/lib/jobs/ai-job-import-step.js.map +1 -1
  27. package/src/lib/jobs/ai-job-insight-step.d.ts +10 -0
  28. package/src/lib/jobs/ai-job-insight-step.js +23 -5
  29. package/src/lib/jobs/ai-job-insight-step.js.map +1 -1
  30. package/src/lib/jobs/ai-job-layout-language.js +2 -1
  31. package/src/lib/jobs/ai-job-layout-language.js.map +1 -1
  32. package/src/lib/jobs/ai-job-media-step.d.ts +2 -1
  33. package/src/lib/jobs/ai-job-media-step.js +6 -8
  34. package/src/lib/jobs/ai-job-media-step.js.map +1 -1
  35. package/src/lib/jobs/ai-job-navigation-step.d.ts +2 -1
  36. package/src/lib/jobs/ai-job-navigation-step.js +7 -9
  37. package/src/lib/jobs/ai-job-navigation-step.js.map +1 -1
  38. package/src/lib/jobs/ai-job-page-language.js +7 -1
  39. package/src/lib/jobs/ai-job-page-language.js.map +1 -1
  40. package/src/lib/jobs/ai-job-page-sections.js +16 -3
  41. package/src/lib/jobs/ai-job-page-sections.js.map +1 -1
  42. package/src/lib/jobs/ai-job-page-step.js +9 -1
  43. package/src/lib/jobs/ai-job-page-step.js.map +1 -1
  44. package/src/lib/jobs/ai-job-plan-step.d.ts +30 -8
  45. package/src/lib/jobs/ai-job-plan-step.js +78 -13
  46. package/src/lib/jobs/ai-job-plan-step.js.map +1 -1
  47. package/src/lib/jobs/ai-job-privacy-step.d.ts +4 -2
  48. package/src/lib/jobs/ai-job-privacy-step.js +14 -15
  49. package/src/lib/jobs/ai-job-privacy-step.js.map +1 -1
  50. package/src/lib/jobs/ai-job-products-step.js +5 -3
  51. package/src/lib/jobs/ai-job-products-step.js.map +1 -1
  52. package/src/lib/jobs/ai-job-settings-step.d.ts +2 -1
  53. package/src/lib/jobs/ai-job-settings-step.js +7 -8
  54. package/src/lib/jobs/ai-job-settings-step.js.map +1 -1
  55. package/src/lib/jobs/ai-job-site-content.d.ts +34 -1
  56. package/src/lib/jobs/ai-job-site-content.js +67 -8
  57. package/src/lib/jobs/ai-job-site-content.js.map +1 -1
  58. package/src/lib/jobs/ai-job-site-datasets.d.ts +53 -3
  59. package/src/lib/jobs/ai-job-site-datasets.js +298 -30
  60. package/src/lib/jobs/ai-job-site-datasets.js.map +1 -1
  61. package/src/lib/jobs/ai-job-site-step.js +6 -3
  62. package/src/lib/jobs/ai-job-site-step.js.map +1 -1
  63. package/src/lib/jobs/ai-job-site-store-pages.js +3 -3
  64. package/src/lib/jobs/ai-job-site-store-pages.js.map +1 -1
  65. package/src/lib/jobs/ai-job-tracking-step.d.ts +2 -1
  66. package/src/lib/jobs/ai-job-tracking-step.js +7 -8
  67. package/src/lib/jobs/ai-job-tracking-step.js.map +1 -1
  68. package/src/lib/jobs/ai-jobs-beat.d.ts +11 -7
  69. package/src/lib/jobs/ai-jobs-beat.js +18 -8
  70. package/src/lib/jobs/ai-jobs-beat.js.map +1 -1
  71. package/src/lib/jobs/ai-jobs-notify.d.ts +66 -1
  72. package/src/lib/jobs/ai-jobs-notify.js +136 -3
  73. package/src/lib/jobs/ai-jobs-notify.js.map +1 -1
  74. package/src/lib/jobs/ai-layout-stock-photos.d.ts +59 -4
  75. package/src/lib/jobs/ai-layout-stock-photos.js +897 -81
  76. package/src/lib/jobs/ai-layout-stock-photos.js.map +1 -1
  77. package/src/lib/jobs/ai-product-image.d.ts +14 -0
  78. package/src/lib/jobs/ai-product-image.js +73 -21
  79. package/src/lib/jobs/ai-product-image.js.map +1 -1
  80. package/src/lib/jobs/ai-theme-brand-inputs.d.ts +9 -1
  81. package/src/lib/jobs/ai-theme-brand-inputs.js +28 -2
  82. package/src/lib/jobs/ai-theme-brand-inputs.js.map +1 -1
  83. package/src/lib/jobs/fixtures/ai-site-agl4065-datasets.d.ts +175 -0
  84. package/src/lib/jobs/fixtures/ai-site-agl4065-datasets.js +601 -0
  85. package/src/lib/jobs/fixtures/ai-site-agl4065-datasets.js.map +1 -0
  86. package/src/lib/jobs/fixtures/ai-site-agl4065-pages.d.ts +46 -0
  87. package/src/lib/jobs/fixtures/ai-site-agl4065-pages.js +2862 -0
  88. package/src/lib/jobs/fixtures/ai-site-agl4065-pages.js.map +1 -0
  89. package/src/lib/jobs/fixtures/ai-site-agl4065-plans.d.ts +74 -0
  90. package/src/lib/jobs/fixtures/ai-site-agl4065-plans.js +888 -0
  91. package/src/lib/jobs/fixtures/ai-site-agl4065-plans.js.map +1 -0
  92. package/src/lib/jobs/fixtures/ai-stock-photo-agl4065-judge.d.ts +29 -0
  93. package/src/lib/jobs/fixtures/ai-stock-photo-agl4065-judge.js +81 -0
  94. package/src/lib/jobs/fixtures/ai-stock-photo-agl4065-judge.js.map +1 -0
  95. package/src/lib/jobs/fixtures/ai-stock-photo-agl4065-recordings.d.ts +87 -0
  96. package/src/lib/jobs/fixtures/ai-stock-photo-agl4065-recordings.js +225 -0
  97. package/src/lib/jobs/fixtures/ai-stock-photo-agl4065-recordings.js.map +1 -0
  98. package/src/lib/layout-language/ai-layout-compiler.d.ts +11 -0
  99. package/src/lib/layout-language/ai-layout-compiler.js +194 -18
  100. package/src/lib/layout-language/ai-layout-compiler.js.map +1 -1
  101. package/src/lib/layout-language/ai-layout-copy.d.ts +37 -0
  102. package/src/lib/layout-language/ai-layout-copy.js +383 -3
  103. package/src/lib/layout-language/ai-layout-copy.js.map +1 -1
  104. package/src/lib/layout-language/ai-layout-design.d.ts +19 -0
  105. package/src/lib/layout-language/ai-layout-design.js +31 -11
  106. package/src/lib/layout-language/ai-layout-design.js.map +1 -1
  107. package/src/lib/layout-language/ai-layout-listings.d.ts +7 -1
  108. package/src/lib/layout-language/ai-layout-listings.js +9 -1
  109. package/src/lib/layout-language/ai-layout-listings.js.map +1 -1
  110. package/src/lib/layout-language/ai-layout-pictures.d.ts +30 -0
  111. package/src/lib/layout-language/ai-layout-pictures.js +131 -3
  112. package/src/lib/layout-language/ai-layout-pictures.js.map +1 -1
  113. package/src/lib/layout-language/ai-layout-storefront.d.ts +18 -4
  114. package/src/lib/layout-language/ai-layout-storefront.js +100 -20
  115. package/src/lib/layout-language/ai-layout-storefront.js.map +1 -1
  116. package/src/lib/model/ai-build-job.d.ts +7 -0
  117. package/src/lib/model/ai-build-job.js +36 -7
  118. package/src/lib/model/ai-build-job.js.map +1 -1
  119. package/src/lib/model/ai-build-plan.d.ts +28 -4
  120. package/src/lib/model/ai-build-plan.js +49 -9
  121. package/src/lib/model/ai-build-plan.js.map +1 -1
  122. package/src/lib/model/ai-build-progress.js +3 -1
  123. package/src/lib/model/ai-build-progress.js.map +1 -1
  124. package/src/lib/model/ai-job-notice.d.ts +8 -0
  125. package/src/lib/model/ai-job-notice.js +33 -0
  126. package/src/lib/model/ai-job-notice.js.map +1 -1
  127. package/src/lib/model/ai-job-plan-lines.d.ts +2 -1
  128. package/src/lib/model/ai-job-plan-lines.js +6 -1
  129. package/src/lib/model/ai-job-plan-lines.js.map +1 -1
  130. package/src/lib/model/ai-jobs.types.d.ts +8 -0
  131. package/src/lib/model/ai-jobs.types.js.map +1 -1
  132. package/src/lib/model/ai-permissions.d.ts +13 -0
  133. package/src/lib/model/ai-permissions.js +29 -1
  134. package/src/lib/model/ai-permissions.js.map +1 -1
  135. package/src/lib/model/ai-products.d.ts +18 -0
  136. package/src/lib/model/ai-products.js +32 -0
  137. package/src/lib/model/ai-products.js.map +1 -1
  138. package/src/lib/model/ai-site-inspiration.d.ts +3 -2
  139. package/src/lib/model/ai-site-inspiration.js +3 -2
  140. package/src/lib/model/ai-site-inspiration.js.map +1 -1
  141. package/src/lib/plugin.js +4 -13
  142. package/src/lib/plugin.js.map +1 -1
  143. package/src/lib/providers/anthropic.js +9 -2
  144. package/src/lib/providers/anthropic.js.map +1 -1
  145. package/src/lib/providers/catalog.js +14 -5
  146. package/src/lib/providers/catalog.js.map +1 -1
  147. package/src/lib/providers/contract.d.ts +24 -1
  148. package/src/lib/providers/contract.js.map +1 -1
  149. package/src/lib/providers/routing.js +5 -2
  150. package/src/lib/providers/routing.js.map +1 -1
  151. package/src/lib/runtime/ai-dataset-generation.d.ts +99 -1
  152. package/src/lib/runtime/ai-dataset-generation.js +251 -3
  153. package/src/lib/runtime/ai-dataset-generation.js.map +1 -1
  154. package/src/lib/runtime/ai-dev-replay.d.ts +1 -0
  155. package/src/lib/runtime/ai-dev-replay.js +4 -2
  156. package/src/lib/runtime/ai-dev-replay.js.map +1 -1
  157. package/src/lib/runtime/ai-doctrine-validators.d.ts +47 -3
  158. package/src/lib/runtime/ai-doctrine-validators.js +343 -27
  159. package/src/lib/runtime/ai-doctrine-validators.js.map +1 -1
  160. package/src/lib/runtime/ai-doctrine.js +8 -2
  161. package/src/lib/runtime/ai-doctrine.js.map +1 -1
  162. package/src/lib/runtime/ai-icon-library.d.ts +27 -1
  163. package/src/lib/runtime/ai-icon-library.js +30 -3
  164. package/src/lib/runtime/ai-icon-library.js.map +1 -1
  165. package/src/lib/runtime/ai-products-generation.d.ts +11 -1
  166. package/src/lib/runtime/ai-products-generation.js +51 -4
  167. package/src/lib/runtime/ai-products-generation.js.map +1 -1
  168. package/src/lib/runtime/assist-answer-cache.d.ts +2 -0
  169. package/src/lib/runtime/assist-answer-cache.js +5 -2
  170. package/src/lib/runtime/assist-answer-cache.js.map +1 -1
  171. package/src/lib/server/ai-allotments.js +7 -2
  172. package/src/lib/server/ai-allotments.js.map +1 -1
  173. package/src/lib/server/ai-experiment-versions.js +5 -5
  174. package/src/lib/server/ai-experiment-versions.js.map +1 -1
  175. package/src/lib/server/ai-host-permissions-roster.d.ts +25 -0
  176. package/src/lib/server/ai-host-permissions-roster.js +33 -0
  177. package/src/lib/server/ai-host-permissions-roster.js.map +1 -0
  178. package/src/lib/server/ai-host-permissions.js +8 -6
  179. package/src/lib/server/ai-host-permissions.js.map +1 -1
  180. package/src/lib/server/ai-image-reads-route.d.ts +17 -0
  181. package/src/lib/server/ai-image-reads-route.js +106 -0
  182. package/src/lib/server/ai-image-reads-route.js.map +1 -0
  183. package/src/lib/server/ai-seo-apply.js +5 -5
  184. package/src/lib/server/ai-seo-apply.js.map +1 -1
  185. package/src/lib/server/ai-site-import-route.js +7 -4
  186. package/src/lib/server/ai-site-import-route.js.map +1 -1
  187. package/src/lib/server/assist-build.js +1 -0
  188. package/src/lib/server/assist-build.js.map +1 -1
  189. package/src/lib/server/assist-chat.d.ts +11 -7
  190. package/src/lib/server/assist-chat.js +185 -48
  191. package/src/lib/server/assist-chat.js.map +1 -1
  192. package/src/lib/server/assist-docs-query.d.ts +51 -0
  193. package/src/lib/server/assist-docs-query.js +57 -0
  194. package/src/lib/server/assist-docs-query.js.map +1 -0
  195. package/src/lib/server/assist-jobs-context.d.ts +102 -0
  196. package/src/lib/server/assist-jobs-context.js +227 -0
  197. package/src/lib/server/assist-jobs-context.js.map +1 -0
  198. package/src/lib/server/assist-view-context.d.ts +8 -4
  199. package/src/lib/server/assist-view-context.js +12 -7
  200. package/src/lib/server/assist-view-context.js.map +1 -1
  201. package/src/lib/server.js +12 -0
  202. package/src/lib/server.js.map +1 -1
  203. package/src/lib/tools/ai-dataset-tool.d.ts +11 -1
  204. package/src/lib/tools/ai-dataset-tool.js +24 -7
  205. package/src/lib/tools/ai-dataset-tool.js.map +1 -1
  206. package/src/lib/tools/ai-duplicate-resource-tool.js +5 -6
  207. package/src/lib/tools/ai-duplicate-resource-tool.js.map +1 -1
  208. package/src/lib/components/ai-collaborator-permissions-column.component.d.ts +0 -32
  209. package/src/lib/components/ai-collaborator-permissions-column.component.js +0 -132
  210. package/src/lib/components/ai-collaborator-permissions-column.component.js.map +0 -1
@@ -0,0 +1,888 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ import { _ as _extends } from "@swc/helpers/_/_extends";
17
+ /**
18
+ * Two booth-kit home pages from the guided starts of 2026-10-25 (AGL-4065),
19
+ * the two trades sites that shared one layout: Holeshot Moto Repair and Two
20
+ * Oaks Handyman, both fictional businesses built in the test workspace.
21
+ *
22
+ * Each plan is the job's own home plan, as its plan step wrote it. Each
23
+ * page's sections are the model's design, rebuilt in the layout language
24
+ * from the words the stored page shows (the decoded page trees): the same
25
+ * bands, headings, ledes and items. Every contact line is left out — the
26
+ * phone and email buttons, the street address an answer gave — so nothing
27
+ * here names a real person, number or address. The towns are the sites'
28
+ * service areas.
29
+ *
30
+ * Alongside them, the item groups whose icons came out random: the "Towns
31
+ * we serve" and "Areas we serve" rows and the reasons to trust each shop;
32
+ * and the Rut Runners Racing and Pit Row Tacos "… in pictures" bands, which
33
+ * showed six captions and no picture.
34
+ */ const block = (kind, text = '', extra = {})=>_extends({
35
+ kind,
36
+ text
37
+ }, extra);
38
+ const items = (...entries)=>entries.map(([title, text = ''])=>({
39
+ title,
40
+ text
41
+ }));
42
+ // ── Holeshot Moto Repair (trades) ────────────────────────────────────────
43
+ /** The words the job was given, minus its contact details: no phone, email or street. */ export const HOLESHOT_FACTS = [
44
+ 'A 5-page website for Motorcycle and dirt bike repair shop: engine rebuilds, suspension, tires, race prep, service; books repair appointments.',
45
+ 'Motorcycle and dirt bike repair shop: engine rebuilds, suspension, tires, race prep, service; books repair appointments',
46
+ 'Dirt bike and street riders, motocross racers and youth-racer parents around San Marcos who want fast, honest repairs',
47
+ 'trades',
48
+ 'Holeshot Moto Repair',
49
+ 'San Marcos',
50
+ 'Back on the gate by race day',
51
+ '2014',
52
+ 'San Marcos\nKyle\nBuda\nWimberley\nNew Braunfels\nLockhart',
53
+ 'English, Spanish',
54
+ 'Tu-Sa 09:00-17:00',
55
+ 'Open Tuesday to Saturday, 9am to 5pm',
56
+ 'TX',
57
+ 'United States'
58
+ ].join('\n');
59
+ export const HOLESHOT_HOME_PLAN = {
60
+ title: 'Home',
61
+ sections: [
62
+ {
63
+ name: 'Hero with book a repair button',
64
+ uses: [],
65
+ items: 0
66
+ },
67
+ {
68
+ name: 'How a job goes, step by step',
69
+ uses: [],
70
+ items: 4
71
+ },
72
+ {
73
+ name: 'What we repair',
74
+ uses: [
75
+ 'new:Repair services'
76
+ ],
77
+ items: 5
78
+ },
79
+ {
80
+ name: 'Why riders and racing parents trust the shop',
81
+ uses: [],
82
+ items: 3
83
+ },
84
+ {
85
+ name: 'Questions riders ask, answered',
86
+ uses: [],
87
+ items: 5
88
+ },
89
+ {
90
+ name: 'Call to action: book your repair',
91
+ uses: [],
92
+ items: 0
93
+ }
94
+ ]
95
+ };
96
+ /** The hero's eyebrow as the model wrote it: 42 characters, cut to "San Marcos motorcycle and dirt bike" on the live page. */ export const HOLESHOT_EYEBROW = 'San Marcos motorcycle and dirt bike repair';
97
+ export const HOLESHOT_TRUST = items([
98
+ 'Open since 2014',
99
+ 'Years of work on dirt bikes and street bikes around San Marcos.'
100
+ ], [
101
+ 'Straight answers',
102
+ "We explain what your bike needs and what it doesn't."
103
+ ], [
104
+ 'English and Spanish',
105
+ "Talk to us in the language you're comfortable with."
106
+ ]);
107
+ export const HOLESHOT_HOME_SECTIONS = [
108
+ {
109
+ band: 'dark',
110
+ blocks: [
111
+ block('eyebrow', HOLESHOT_EYEBROW),
112
+ block('heading', 'Back on the gate by race day', {
113
+ style: 'large'
114
+ }),
115
+ block('lede', 'Fast, honest repairs for dirt bike and street riders, racers and youth-racer parents.'),
116
+ block('button', 'Book a repair', {
117
+ to: 'page:pg-book',
118
+ style: 'primary'
119
+ })
120
+ ]
121
+ },
122
+ {
123
+ band: 'plain',
124
+ blocks: [
125
+ block('heading', 'How a job goes, step by step'),
126
+ block('steps', '', {
127
+ items: items([
128
+ 'Tell us about the bike',
129
+ "Send the make, model, year and what's wrong, plus your race date if you have one."
130
+ ], [
131
+ 'Pick a day',
132
+ 'We book a drop-off that fits your schedule.'
133
+ ], [
134
+ 'We diagnose and repair',
135
+ 'We find the problem and tell you what it needs before the work starts.'
136
+ ], [
137
+ 'Pick up and ride',
138
+ 'Your bike is ready and checked, so you can get back on the track or the road.'
139
+ ])
140
+ })
141
+ ]
142
+ },
143
+ {
144
+ band: 'soft',
145
+ blocks: [
146
+ block('heading', 'What we repair'),
147
+ block('text', 'From full engine work to a routine service, we handle dirt bikes and street bikes.'),
148
+ block('cards', '', {
149
+ items: items([
150
+ 'Engine rebuilds'
151
+ ], [
152
+ 'Suspension'
153
+ ], [
154
+ 'Tires'
155
+ ], [
156
+ 'Race prep'
157
+ ], [
158
+ 'Service'
159
+ ])
160
+ })
161
+ ]
162
+ },
163
+ {
164
+ band: 'plain',
165
+ blocks: [
166
+ block('heading', 'Why riders and racing parents trust the shop'),
167
+ block('cards', '', {
168
+ items: HOLESHOT_TRUST
169
+ })
170
+ ]
171
+ },
172
+ {
173
+ band: 'soft',
174
+ blocks: [
175
+ block('heading', 'Questions riders ask, answered'),
176
+ block('faq', '', {
177
+ items: items([
178
+ 'What do you repair?',
179
+ 'Engine rebuilds, suspension, tires, race prep and service.'
180
+ ], [
181
+ 'Can you get my bike ready for a race?',
182
+ "Yes. Give us your race date when you book and we'll plan around it."
183
+ ], [
184
+ 'When are you open?',
185
+ 'Tuesday to Saturday, 9am to 5pm.'
186
+ ], [
187
+ 'Do you speak Spanish?',
188
+ 'Yes, we work in English and Spanish.'
189
+ ])
190
+ })
191
+ ]
192
+ },
193
+ {
194
+ band: 'brand',
195
+ align: 'center',
196
+ blocks: [
197
+ block('heading', 'Book your repair'),
198
+ block('lede', 'Tell us what your bike needs and when you need it back.'),
199
+ block('button', 'Book a repair', {
200
+ to: 'page:pg-book',
201
+ style: 'primary'
202
+ })
203
+ ]
204
+ }
205
+ ];
206
+ /** The "Repair services" dataset the home lists, as the job proposed it: no photo field. */ const HOLESHOT_REPAIRS = {
207
+ id: 'listing:records:dsRepairs',
208
+ kind: 'records',
209
+ name: 'Repair services',
210
+ records: [
211
+ 'Engine rebuilds',
212
+ 'Suspension',
213
+ 'Tires',
214
+ 'Race prep',
215
+ 'Service'
216
+ ],
217
+ datasetId: 'dsRepairs',
218
+ fields: [
219
+ {
220
+ id: 'name',
221
+ name: 'Name',
222
+ type: 'text'
223
+ },
224
+ {
225
+ id: 'summary',
226
+ name: 'Summary',
227
+ type: 'text'
228
+ },
229
+ {
230
+ id: 'typical_turnaround',
231
+ name: 'Typical turnaround',
232
+ type: 'text'
233
+ },
234
+ {
235
+ id: 'bike_types',
236
+ name: 'Bike types',
237
+ type: 'sorted'
238
+ }
239
+ ],
240
+ placements: [
241
+ {
242
+ screenId: 'pg-home',
243
+ section: 2,
244
+ role: 'featured'
245
+ },
246
+ {
247
+ screenId: 'pg-services',
248
+ section: 1,
249
+ role: 'index'
250
+ }
251
+ ]
252
+ };
253
+ export const HOLESHOT_TARGETS = {
254
+ pageId: 'pg-home',
255
+ pages: [
256
+ {
257
+ id: 'pg-services',
258
+ label: 'Services',
259
+ slug: '/services'
260
+ },
261
+ {
262
+ id: 'pg-about',
263
+ label: 'About',
264
+ slug: '/about'
265
+ },
266
+ {
267
+ id: 'pg-area',
268
+ label: 'Service Area',
269
+ slug: '/service-area'
270
+ },
271
+ {
272
+ id: 'pg-book',
273
+ label: 'Book a Repair',
274
+ slug: '/book-a-repair'
275
+ }
276
+ ],
277
+ homeIds: [
278
+ 'pg-home'
279
+ ],
280
+ forms: [
281
+ {
282
+ id: 'form-repair',
283
+ name: 'Repair request form'
284
+ }
285
+ ],
286
+ formPageId: 'pg-book',
287
+ components: [],
288
+ facts: HOLESHOT_FACTS,
289
+ listings: [
290
+ HOLESHOT_REPAIRS
291
+ ]
292
+ };
293
+ // ── Two Oaks Handyman (trades) ───────────────────────────────────────────
294
+ export const TWO_OAKS_FACTS = [
295
+ 'A 5-page website for Handyman business: home repairs, drywall, fences and decks, doors and trim, small remodels; takes quote requests.',
296
+ 'Handyman business: home repairs, drywall, fences and decks, doors and trim, small remodels; takes quote requests',
297
+ 'Homeowners and landlords around Seguin who need repairs done right without hiring three different trades',
298
+ 'trades',
299
+ 'Two Oaks Handyman',
300
+ 'Seguin',
301
+ 'Fixed right the first time, on time',
302
+ '2012',
303
+ 'Seguin\nNew Braunfels\nSchertz\nCibolo\nMarion',
304
+ 'English, Spanish',
305
+ 'Mo-Sa 09:00-17:00',
306
+ 'Open Mon–Sat 9am–5pm',
307
+ 'TX',
308
+ 'United States'
309
+ ].join('\n');
310
+ export const TWO_OAKS_HOME_PLAN = {
311
+ title: 'Home',
312
+ sections: [
313
+ {
314
+ name: 'Hero: fixed right the first time',
315
+ uses: [],
316
+ items: 0
317
+ },
318
+ {
319
+ name: 'Why homeowners and landlords trust us',
320
+ uses: [],
321
+ items: 4
322
+ },
323
+ {
324
+ name: 'What we repair and build',
325
+ uses: [
326
+ 'new:Services list'
327
+ ],
328
+ items: 6
329
+ },
330
+ {
331
+ name: 'How a job goes',
332
+ uses: [],
333
+ items: 4
334
+ },
335
+ {
336
+ name: 'Questions people ask',
337
+ uses: [
338
+ 'new:Common questions'
339
+ ],
340
+ items: 5
341
+ },
342
+ {
343
+ name: 'Towns we serve',
344
+ uses: [],
345
+ items: 5
346
+ },
347
+ {
348
+ name: 'Call to action: ask for a quote',
349
+ uses: [],
350
+ items: 0
351
+ }
352
+ ]
353
+ };
354
+ export const TWO_OAKS_TRUST = items([
355
+ 'One call, many trades',
356
+ 'Repairs, drywall, fences and trim handled by one person, not three.'
357
+ ], [
358
+ 'Serving Seguin since 2012',
359
+ 'Over a decade of work for local homes and rentals.'
360
+ ], [
361
+ 'On time',
362
+ 'We show up when we say we will.'
363
+ ], [
364
+ 'English and Spanish',
365
+ 'Talk to us in the language you prefer.'
366
+ ]);
367
+ /** "Towns we serve" on the Two Oaks home, as the page showed it. */ export const TWO_OAKS_TOWNS = items([
368
+ 'Seguin',
369
+ 'Our home base.'
370
+ ], [
371
+ 'New Braunfels',
372
+ 'Repairs and remodels.'
373
+ ], [
374
+ 'Schertz',
375
+ 'Homes and rentals.'
376
+ ], [
377
+ 'Cibolo',
378
+ 'Homes and rentals.'
379
+ ], [
380
+ 'Marion',
381
+ 'Homes and rentals.'
382
+ ]);
383
+ export const TWO_OAKS_HOME_SECTIONS = [
384
+ {
385
+ band: 'dark',
386
+ blocks: [
387
+ block('eyebrow', 'Two Oaks Handyman · Seguin, TX'),
388
+ block('heading', 'Fixed right the first time, on time', {
389
+ style: 'large'
390
+ }),
391
+ block('lede', 'One handyman for repairs, drywall, fences, decks, doors, trim and small remodels around Seguin.'),
392
+ block('button', 'Ask for a quote', {
393
+ to: 'page:pg-contact',
394
+ style: 'primary'
395
+ })
396
+ ]
397
+ },
398
+ {
399
+ band: 'plain',
400
+ blocks: [
401
+ block('heading', 'Why homeowners and landlords trust us'),
402
+ block('cards', '', {
403
+ items: TWO_OAKS_TRUST
404
+ })
405
+ ]
406
+ },
407
+ {
408
+ band: 'soft',
409
+ blocks: [
410
+ block('heading', 'What we repair and build'),
411
+ block('lede', 'From a patched wall to a new deck, here is the work we do most.'),
412
+ block('cards', '', {
413
+ items: items([
414
+ 'Home repairs'
415
+ ], [
416
+ 'Drywall'
417
+ ], [
418
+ 'Fences and decks'
419
+ ])
420
+ })
421
+ ]
422
+ },
423
+ {
424
+ band: 'plain',
425
+ blocks: [
426
+ block('heading', 'How a job goes'),
427
+ block('steps', '', {
428
+ items: items([
429
+ 'Send your request',
430
+ 'Tell us what needs fixing and where.'
431
+ ], [
432
+ 'We review the job',
433
+ 'We get back to you to talk through details and timing.'
434
+ ], [
435
+ 'We do the work',
436
+ 'Repairs done properly, in one visit where possible.'
437
+ ], [
438
+ 'Final walk-through',
439
+ 'We check the result with you before we leave.'
440
+ ])
441
+ })
442
+ ]
443
+ },
444
+ {
445
+ band: 'soft',
446
+ blocks: [
447
+ block('heading', 'Questions people ask'),
448
+ block('lede', 'Quick answers about jobs, areas, quotes and languages.')
449
+ ]
450
+ },
451
+ {
452
+ band: 'plain',
453
+ blocks: [
454
+ block('heading', 'Towns we serve'),
455
+ block('cards', '', {
456
+ items: TWO_OAKS_TOWNS
457
+ })
458
+ ]
459
+ },
460
+ {
461
+ band: 'dark',
462
+ align: 'center',
463
+ blocks: [
464
+ block('heading', 'Ready for a quote?'),
465
+ block('lede', 'Describe the job and we will get back to you. Open Mon–Sat 9am–5pm.'),
466
+ block('button', 'Ask for a quote', {
467
+ to: 'page:pg-contact',
468
+ style: 'primary'
469
+ })
470
+ ]
471
+ }
472
+ ];
473
+ const TWO_OAKS_SERVICES = {
474
+ id: 'listing:records:dsServices',
475
+ kind: 'records',
476
+ name: 'Services list',
477
+ records: [
478
+ 'Home repairs',
479
+ 'Drywall',
480
+ 'Fences and decks',
481
+ 'Doors and trim',
482
+ 'Small remodels',
483
+ 'Rental unit repairs'
484
+ ],
485
+ datasetId: 'dsServices',
486
+ fields: [
487
+ {
488
+ id: 'name',
489
+ name: 'Name',
490
+ type: 'text'
491
+ },
492
+ {
493
+ id: 'summary',
494
+ name: 'Summary',
495
+ type: 'text'
496
+ },
497
+ {
498
+ id: 'typical_jobs',
499
+ name: 'Typical jobs',
500
+ type: 'text'
501
+ },
502
+ {
503
+ id: 'category',
504
+ name: 'Category',
505
+ type: 'text'
506
+ },
507
+ {
508
+ id: 'image_description',
509
+ name: 'Image description',
510
+ type: 'text'
511
+ }
512
+ ],
513
+ imageField: 'image',
514
+ placements: [
515
+ {
516
+ screenId: 'pg-home',
517
+ section: 2,
518
+ role: 'featured'
519
+ },
520
+ {
521
+ screenId: 'pg-services',
522
+ section: 1,
523
+ role: 'index'
524
+ }
525
+ ]
526
+ };
527
+ const TWO_OAKS_QUESTIONS = {
528
+ id: 'listing:records:dsQuestions',
529
+ kind: 'records',
530
+ name: 'Common questions',
531
+ records: [
532
+ 'What kinds of jobs does Two Oaks Handyman take on?',
533
+ 'Which areas do you serve?',
534
+ 'How do I ask for a quote?'
535
+ ],
536
+ datasetId: 'dsQuestions',
537
+ fields: [
538
+ {
539
+ id: 'question',
540
+ name: 'Question',
541
+ type: 'text'
542
+ },
543
+ {
544
+ id: 'answer',
545
+ name: 'Answer',
546
+ type: 'text'
547
+ }
548
+ ],
549
+ placements: [
550
+ {
551
+ screenId: 'pg-home',
552
+ section: 4,
553
+ role: 'featured'
554
+ },
555
+ {
556
+ screenId: 'pg-how',
557
+ section: 2,
558
+ role: 'index'
559
+ }
560
+ ]
561
+ };
562
+ export const TWO_OAKS_TARGETS = {
563
+ pageId: 'pg-home',
564
+ pages: [
565
+ {
566
+ id: 'pg-services',
567
+ label: 'Services',
568
+ slug: '/services'
569
+ },
570
+ {
571
+ id: 'pg-about',
572
+ label: 'About',
573
+ slug: '/about'
574
+ },
575
+ {
576
+ id: 'pg-how',
577
+ label: 'How it works',
578
+ slug: '/how-it-works'
579
+ },
580
+ {
581
+ id: 'pg-contact',
582
+ label: 'Contact and Quote',
583
+ slug: '/contact'
584
+ }
585
+ ],
586
+ homeIds: [
587
+ 'pg-home'
588
+ ],
589
+ forms: [
590
+ {
591
+ id: 'form-quote',
592
+ name: 'Quote request form'
593
+ }
594
+ ],
595
+ formPageId: 'pg-contact',
596
+ components: [],
597
+ facts: TWO_OAKS_FACTS,
598
+ listings: [
599
+ TWO_OAKS_SERVICES,
600
+ TWO_OAKS_QUESTIONS
601
+ ]
602
+ };
603
+ // ── The other rows whose icons came out random ───────────────────────────
604
+ /** Bluebonnet Yard & Landscape (business): its hero's eyebrow as written, 42 characters, cut to "…in New" live. */ export const BLUEBONNET_EYEBROW = 'Lawn care and landscaping in New Braunfels';
605
+ export const BLUEBONNET_FACTS = [
606
+ 'Landscaping company: lawn care, native plant beds, xeriscape, sod, irrigation repair, seasonal cleanups; free estimates',
607
+ 'business',
608
+ 'Bluebonnet Yard & Landscape',
609
+ 'New Braunfels',
610
+ 'New Braunfels\nCanyon Lake\nGarden Ridge\nSeguin\nGruene',
611
+ 'English, Spanish',
612
+ 'TX'
613
+ ].join('\n');
614
+ /** "Areas we serve" on the Bluebonnet home: five towns, a title each. */ export const BLUEBONNET_AREAS = items([
615
+ 'New Braunfels'
616
+ ], [
617
+ 'Canyon Lake'
618
+ ], [
619
+ 'Garden Ridge'
620
+ ], [
621
+ 'Seguin'
622
+ ], [
623
+ 'Gruene'
624
+ ]);
625
+ /** "Areas we serve" on the Berm & Bolt Moto Parts About page (store). */ export const BERM_AND_BOLT_AREAS = items([
626
+ 'Kyle',
627
+ 'Home of our shop and pickup counter.'
628
+ ], [
629
+ 'Buda',
630
+ 'Just up the road.'
631
+ ], [
632
+ 'San Marcos',
633
+ 'Pick up on your way home.'
634
+ ], [
635
+ 'Lockhart',
636
+ 'Ranch and trail riders welcome.'
637
+ ], [
638
+ 'Austin',
639
+ 'Worth the drive for fast parts.'
640
+ ]);
641
+ // ── The two "in pictures" bands that showed no picture ────────────────────
642
+ /**
643
+ * Each home's "… in pictures" band, as the model designed it: a heading and
644
+ * six captions, which the page drew as six caption pairs and no picture slot
645
+ * — "in pictures" said nothing the compiler read as a gallery. Each page
646
+ * here is the band between the sections that stood around it on the home,
647
+ * under the home plan's own section names.
648
+ */ const IN_PICTURES_TARGETS = (facts)=>({
649
+ pageId: 'pg-home',
650
+ pages: [
651
+ {
652
+ id: 'pg-about',
653
+ label: 'About',
654
+ slug: '/about'
655
+ },
656
+ {
657
+ id: 'pg-contact',
658
+ label: 'Contact',
659
+ slug: '/contact'
660
+ }
661
+ ],
662
+ homeIds: [
663
+ 'pg-home'
664
+ ],
665
+ forms: [
666
+ {
667
+ id: 'form-inquiry',
668
+ name: 'Inquiry form'
669
+ }
670
+ ],
671
+ formPageId: 'pg-contact',
672
+ components: [],
673
+ facts
674
+ });
675
+ /** Rut Runners Racing (fitness): "The team at the track in pictures", a dark band. */ export const RUT_RUNNERS_FACTS = [
676
+ 'Amateur motocross race team: rider profiles, race schedule and results, sponsor inquiries',
677
+ 'fitness',
678
+ 'Rut Runners Racing',
679
+ 'Lockhart',
680
+ 'Lockhart\nLuling\nSan Marcos\nAustin\nCentral Texas',
681
+ 'English, Spanish',
682
+ 'TX'
683
+ ].join('\n');
684
+ export const RUT_RUNNERS_PICTURES_PLAN = {
685
+ title: 'Home',
686
+ sections: [
687
+ {
688
+ name: 'Hero: built in Lockhart, raced across Texas',
689
+ uses: [],
690
+ items: 0
691
+ },
692
+ {
693
+ name: 'How to get started with the team',
694
+ uses: [],
695
+ items: 4
696
+ },
697
+ {
698
+ name: 'The team at the track in pictures',
699
+ uses: [],
700
+ items: 6
701
+ },
702
+ {
703
+ name: 'Call to action: sponsor or join',
704
+ uses: [],
705
+ items: 0
706
+ }
707
+ ]
708
+ };
709
+ export const RUT_RUNNERS_IN_PICTURES = items([
710
+ 'Gate drop',
711
+ 'Riders staged and ready for the start.'
712
+ ], [
713
+ 'Pit crew',
714
+ 'Families and friends wrenching together.'
715
+ ], [
716
+ 'Practice laps',
717
+ 'Working the ruts before race day.'
718
+ ], [
719
+ 'Podium moments',
720
+ 'Celebrating after a hard-fought moto.'
721
+ ], [
722
+ 'Young riders',
723
+ 'Our minis learning the basics.'
724
+ ], [
725
+ 'Team spirit',
726
+ 'Rut Runners Racing on and off the bike.'
727
+ ]);
728
+ export const RUT_RUNNERS_PICTURES_SECTIONS = [
729
+ {
730
+ band: 'plain',
731
+ blocks: [
732
+ block('eyebrow', 'Rut Runners Racing · Lockhart, TX'),
733
+ block('heading', 'Built in Lockhart, raced across Texas', {
734
+ style: 'large'
735
+ }),
736
+ block('lede', 'Amateur motocross since 2019. Ride with us, sponsor a rider or cheer from the fence.'),
737
+ block('button', 'Sponsor a rider', {
738
+ to: 'page:pg-contact',
739
+ style: 'primary'
740
+ })
741
+ ]
742
+ },
743
+ {
744
+ band: 'soft',
745
+ blocks: [
746
+ block('heading', 'How to get started with the team'),
747
+ block('steps', '', {
748
+ items: items([
749
+ 'Say hello',
750
+ 'Tell us who you are and what you ride, or want to ride.'
751
+ ], [
752
+ 'Meet the team',
753
+ 'Come to the track and see how we train and race.'
754
+ ], [
755
+ 'Find your class',
756
+ 'We match each rider to an age class and skill level.'
757
+ ], [
758
+ 'Hit the track',
759
+ 'Train with the crew and line up at your first race.'
760
+ ])
761
+ })
762
+ ]
763
+ },
764
+ {
765
+ band: 'dark',
766
+ blocks: [
767
+ block('heading', 'The team at the track in pictures'),
768
+ block('cards', '', {
769
+ items: RUT_RUNNERS_IN_PICTURES
770
+ })
771
+ ]
772
+ },
773
+ {
774
+ band: 'brand',
775
+ align: 'center',
776
+ blocks: [
777
+ block('heading', 'Sponsor a rider or join the team'),
778
+ block('lede', 'Back local riders or get your own number plate.'),
779
+ block('button', 'Get in touch', {
780
+ to: 'page:pg-contact',
781
+ style: 'primary'
782
+ })
783
+ ]
784
+ }
785
+ ];
786
+ export const RUT_RUNNERS_PICTURES_TARGETS = IN_PICTURES_TARGETS(RUT_RUNNERS_FACTS);
787
+ /** Pit Row Tacos (restaurant): "The trailer and the food in pictures", centered. */ export const PIT_ROW_FACTS = [
788
+ 'Taco food trailer: breakfast and street tacos at Texas motocross races and around town; takes catering requests',
789
+ 'restaurant',
790
+ 'Pit Row Tacos',
791
+ 'Buda',
792
+ 'Buda\nKyle\nSan Marcos\nAustin\nLockhart',
793
+ 'English, Spanish',
794
+ 'TX'
795
+ ].join('\n');
796
+ export const PIT_ROW_PICTURES_PLAN = {
797
+ title: 'Home',
798
+ sections: [
799
+ {
800
+ name: 'Hero: race-day tacos, made fresh on the line',
801
+ uses: [],
802
+ items: 0
803
+ },
804
+ {
805
+ name: 'Our story: a taco trailer from Buda',
806
+ uses: [],
807
+ items: 0
808
+ },
809
+ {
810
+ name: 'The trailer and the food in pictures',
811
+ uses: [],
812
+ items: 6
813
+ },
814
+ {
815
+ name: 'Call to action: plan your catering',
816
+ uses: [],
817
+ items: 0
818
+ }
819
+ ]
820
+ };
821
+ export const PIT_ROW_IN_PICTURES = items([
822
+ 'The trailer',
823
+ 'Our trailer parked and ready on race day.'
824
+ ], [
825
+ 'Breakfast tacos',
826
+ 'Egg, cheese and warm tortillas wrapped to go.'
827
+ ], [
828
+ 'Street tacos',
829
+ 'Carne asada, al pastor and carnitas piled high.'
830
+ ], [
831
+ 'The griddle',
832
+ 'Meat sizzling and tortillas toasting.'
833
+ ], [
834
+ 'Salsas and toppings',
835
+ 'Fresh, bright and made for sharing.'
836
+ ], [
837
+ 'Fans in line',
838
+ 'Riders and families waiting for their order.'
839
+ ]);
840
+ export const PIT_ROW_PICTURES_SECTIONS = [
841
+ {
842
+ band: 'dark',
843
+ align: 'center',
844
+ blocks: [
845
+ block('heading', 'Race-day tacos, made fresh on the line', {
846
+ style: 'large'
847
+ }),
848
+ block('lede', 'Street and breakfast tacos, hot off the griddle in Buda and at the track.'),
849
+ block('button', 'Plan your catering', {
850
+ to: 'page:pg-contact',
851
+ style: 'primary'
852
+ })
853
+ ]
854
+ },
855
+ {
856
+ band: 'plain',
857
+ blocks: [
858
+ block('eyebrow', 'Our story'),
859
+ block('heading', 'A taco trailer from Buda'),
860
+ block('text', 'Since 2021, Pit Row Tacos has fed riders, families and fans with breakfast tacos and street tacos made fresh on the line.')
861
+ ]
862
+ },
863
+ {
864
+ band: 'plain',
865
+ align: 'center',
866
+ blocks: [
867
+ block('heading', 'The trailer and the food in pictures'),
868
+ block('cards', '', {
869
+ items: PIT_ROW_IN_PICTURES
870
+ })
871
+ ]
872
+ },
873
+ {
874
+ band: 'brand',
875
+ align: 'center',
876
+ blocks: [
877
+ block('heading', 'Plan your catering'),
878
+ block('lede', 'Tell us about your event and we will bring the tacos to you.'),
879
+ block('button', 'Plan your catering', {
880
+ to: 'page:pg-contact',
881
+ style: 'primary'
882
+ })
883
+ ]
884
+ }
885
+ ];
886
+ export const PIT_ROW_PICTURES_TARGETS = IN_PICTURES_TARGETS(PIT_ROW_FACTS);
887
+
888
+ //# sourceMappingURL=ai-site-agl4065-plans.js.map