@aglyn/plugins-ai 1.0.0-beta.270 → 1.0.0-beta.271

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 (216) hide show
  1. package/package.json +17 -17
  2. package/src/lib/activity/ai-activity-actions.d.ts +1 -1
  3. package/src/lib/activity/ai-activity-actions.js +1 -0
  4. package/src/lib/activity/ai-activity-actions.js.map +1 -1
  5. package/src/lib/assets/site-styles/beauty.webp +0 -0
  6. package/src/lib/assets/site-styles/blog.webp +0 -0
  7. package/src/lib/assets/site-styles/business.webp +0 -0
  8. package/src/lib/assets/site-styles/coming-soon.webp +0 -0
  9. package/src/lib/assets/site-styles/education.webp +0 -0
  10. package/src/lib/assets/site-styles/events.webp +0 -0
  11. package/src/lib/assets/site-styles/fitness.webp +0 -0
  12. package/src/lib/assets/site-styles/landing.webp +0 -0
  13. package/src/lib/assets/site-styles/music.webp +0 -0
  14. package/src/lib/assets/site-styles/nonprofit.webp +0 -0
  15. package/src/lib/assets/site-styles/personal.webp +0 -0
  16. package/src/lib/assets/site-styles/photography.webp +0 -0
  17. package/src/lib/assets/site-styles/portfolio.webp +0 -0
  18. package/src/lib/assets/site-styles/professional.webp +0 -0
  19. package/src/lib/assets/site-styles/realestate.webp +0 -0
  20. package/src/lib/assets/site-styles/restaurant.webp +0 -0
  21. package/src/lib/assets/site-styles/store.webp +0 -0
  22. package/src/lib/assets/site-styles/studio.webp +0 -0
  23. package/src/lib/assets/site-styles/trades.webp +0 -0
  24. package/src/lib/assets/site-styles/wellness.webp +0 -0
  25. package/src/lib/assets/site-styles/yoga.webp +0 -0
  26. package/src/lib/components/ai-credits-card.component.d.ts +4 -3
  27. package/src/lib/components/ai-credits-card.component.js +15 -15
  28. package/src/lib/components/ai-credits-card.component.js.map +1 -1
  29. package/src/lib/components/ai-job-input-form.component.d.ts +36 -0
  30. package/src/lib/components/ai-job-input-form.component.js +100 -0
  31. package/src/lib/components/ai-job-input-form.component.js.map +1 -0
  32. package/src/lib/components/ai-job-requests.d.ts +4 -0
  33. package/src/lib/components/ai-job-requests.js +4 -0
  34. package/src/lib/components/ai-job-requests.js.map +1 -1
  35. package/src/lib/components/ai-site-start-card.component.d.ts +1 -1
  36. package/src/lib/components/ai-site-start-card.component.js +99 -31
  37. package/src/lib/components/ai-site-start-card.component.js.map +1 -1
  38. package/src/lib/components/ai-site-start-steps.component.d.ts +43 -2
  39. package/src/lib/components/ai-site-start-steps.component.js +651 -15
  40. package/src/lib/components/ai-site-start-steps.component.js.map +1 -1
  41. package/src/lib/components/ai-site-start-tracking.d.ts +10 -0
  42. package/src/lib/components/ai-site-start-tracking.js +14 -0
  43. package/src/lib/components/ai-site-start-tracking.js.map +1 -1
  44. package/src/lib/components/ai-site-style-previews.js +26 -22
  45. package/src/lib/components/ai-site-style-previews.js.map +1 -1
  46. package/src/lib/components/ai-upsell-dialog.component.d.ts +7 -5
  47. package/src/lib/components/ai-upsell-dialog.component.js +8 -6
  48. package/src/lib/components/ai-upsell-dialog.component.js.map +1 -1
  49. package/src/lib/components/assist-build-card.component.js +11 -1
  50. package/src/lib/components/assist-build-card.component.js.map +1 -1
  51. package/src/lib/components/assist-jobs-drawer.component.js +9 -1
  52. package/src/lib/components/assist-jobs-drawer.component.js.map +1 -1
  53. package/src/lib/components/assist-panel.component.js +8 -4
  54. package/src/lib/components/assist-panel.component.js.map +1 -1
  55. package/src/lib/components/staff-org-ai-card.component.js +4 -7
  56. package/src/lib/components/staff-org-ai-card.component.js.map +1 -1
  57. package/src/lib/declarations.d.ts +2 -2
  58. package/src/lib/declarations.js +9 -5
  59. package/src/lib/declarations.js.map +1 -1
  60. package/src/lib/jobs/ai-build-capabilities.js +3 -1
  61. package/src/lib/jobs/ai-build-capabilities.js.map +1 -1
  62. package/src/lib/jobs/ai-business-profile-prefill.d.ts +1 -1
  63. package/src/lib/jobs/ai-business-profile-prefill.js +14 -3
  64. package/src/lib/jobs/ai-business-profile-prefill.js.map +1 -1
  65. package/src/lib/jobs/ai-job-build-step.js +5 -3
  66. package/src/lib/jobs/ai-job-build-step.js.map +1 -1
  67. package/src/lib/jobs/ai-job-form-step.d.ts +15 -1
  68. package/src/lib/jobs/ai-job-form-step.js +75 -8
  69. package/src/lib/jobs/ai-job-form-step.js.map +1 -1
  70. package/src/lib/jobs/ai-job-page-language.d.ts +13 -0
  71. package/src/lib/jobs/ai-job-page-language.js +37 -1
  72. package/src/lib/jobs/ai-job-page-language.js.map +1 -1
  73. package/src/lib/jobs/ai-job-page-step.d.ts +17 -0
  74. package/src/lib/jobs/ai-job-page-step.js +37 -16
  75. package/src/lib/jobs/ai-job-page-step.js.map +1 -1
  76. package/src/lib/jobs/ai-job-plan-step.d.ts +25 -2
  77. package/src/lib/jobs/ai-job-plan-step.js +103 -29
  78. package/src/lib/jobs/ai-job-plan-step.js.map +1 -1
  79. package/src/lib/jobs/ai-job-settings-step.js +4 -3
  80. package/src/lib/jobs/ai-job-settings-step.js.map +1 -1
  81. package/src/lib/jobs/ai-job-site-datasets.d.ts +27 -0
  82. package/src/lib/jobs/ai-job-site-datasets.js +140 -14
  83. package/src/lib/jobs/ai-job-site-datasets.js.map +1 -1
  84. package/src/lib/jobs/ai-job-site-look.js +18 -5
  85. package/src/lib/jobs/ai-job-site-look.js.map +1 -1
  86. package/src/lib/jobs/ai-job-site-step.d.ts +16 -1
  87. package/src/lib/jobs/ai-job-site-step.js +95 -22
  88. package/src/lib/jobs/ai-job-site-step.js.map +1 -1
  89. package/src/lib/jobs/ai-job-text-step.d.ts +8 -1
  90. package/src/lib/jobs/ai-job-text-step.js.map +1 -1
  91. package/src/lib/jobs/ai-job-tracking-step.d.ts +14 -3
  92. package/src/lib/jobs/ai-job-tracking-step.js +28 -5
  93. package/src/lib/jobs/ai-job-tracking-step.js.map +1 -1
  94. package/src/lib/jobs/ai-jobs.d.ts +8 -1
  95. package/src/lib/jobs/ai-jobs.js +63 -8
  96. package/src/lib/jobs/ai-jobs.js.map +1 -1
  97. package/src/lib/jobs/ai-layout-stock-photos.d.ts +27 -2
  98. package/src/lib/jobs/ai-layout-stock-photos.js +190 -19
  99. package/src/lib/jobs/ai-layout-stock-photos.js.map +1 -1
  100. package/src/lib/jobs/ai-site-inspiration-signals.d.ts +98 -0
  101. package/src/lib/jobs/ai-site-inspiration-signals.js +585 -0
  102. package/src/lib/jobs/ai-site-inspiration-signals.js.map +1 -0
  103. package/src/lib/jobs/ai-site-inspiration.d.ts +157 -0
  104. package/src/lib/jobs/ai-site-inspiration.js +346 -0
  105. package/src/lib/jobs/ai-site-inspiration.js.map +1 -0
  106. package/src/lib/jobs/ai-site-publish.d.ts +26 -1
  107. package/src/lib/jobs/ai-site-publish.js +162 -13
  108. package/src/lib/jobs/ai-site-publish.js.map +1 -1
  109. package/src/lib/jobs/ai-theme-brand-inputs.d.ts +16 -0
  110. package/src/lib/jobs/ai-theme-brand-inputs.js +18 -4
  111. package/src/lib/jobs/ai-theme-brand-inputs.js.map +1 -1
  112. package/src/lib/jobs/fixtures/ai-candle-shop-free-plan-recording.d.ts +97 -0
  113. package/src/lib/jobs/fixtures/ai-candle-shop-free-plan-recording.js +137 -0
  114. package/src/lib/jobs/fixtures/ai-candle-shop-free-plan-recording.js.map +1 -0
  115. package/src/lib/jobs/fixtures/ai-site-inspiration-pages.d.ts +38 -0
  116. package/src/lib/jobs/fixtures/ai-site-inspiration-pages.js +103 -0
  117. package/src/lib/jobs/fixtures/ai-site-inspiration-pages.js.map +1 -0
  118. package/src/lib/jobs/fixtures/ai-stock-photo-agl3988-recordings.d.ts +25 -0
  119. package/src/lib/jobs/fixtures/ai-stock-photo-agl3988-recordings.js +174 -0
  120. package/src/lib/jobs/fixtures/ai-stock-photo-agl3988-recordings.js.map +1 -0
  121. package/src/lib/layout-language/ai-layout-compiler.d.ts +1 -1
  122. package/src/lib/layout-language/ai-layout-compiler.js +438 -25
  123. package/src/lib/layout-language/ai-layout-compiler.js.map +1 -1
  124. package/src/lib/layout-language/ai-layout-contact.d.ts +57 -0
  125. package/src/lib/layout-language/ai-layout-contact.js +137 -0
  126. package/src/lib/layout-language/ai-layout-contact.js.map +1 -0
  127. package/src/lib/layout-language/ai-layout-copy.d.ts +12 -0
  128. package/src/lib/layout-language/ai-layout-copy.js +34 -2
  129. package/src/lib/layout-language/ai-layout-copy.js.map +1 -1
  130. package/src/lib/layout-language/ai-layout-design.d.ts +65 -8
  131. package/src/lib/layout-language/ai-layout-design.js +411 -97
  132. package/src/lib/layout-language/ai-layout-design.js.map +1 -1
  133. package/src/lib/layout-language/ai-layout-frame.js +23 -0
  134. package/src/lib/layout-language/ai-layout-frame.js.map +1 -1
  135. package/src/lib/layout-language/ai-layout-labels.d.ts +2 -0
  136. package/src/lib/layout-language/ai-layout-labels.js +12 -6
  137. package/src/lib/layout-language/ai-layout-labels.js.map +1 -1
  138. package/src/lib/layout-language/ai-layout-language.d.ts +3 -2
  139. package/src/lib/layout-language/ai-layout-language.js +4 -3
  140. package/src/lib/layout-language/ai-layout-language.js.map +1 -1
  141. package/src/lib/layout-language/ai-layout-links.d.ts +13 -0
  142. package/src/lib/layout-language/ai-layout-links.js +30 -0
  143. package/src/lib/layout-language/ai-layout-links.js.map +1 -1
  144. package/src/lib/layout-language/ai-layout-pictures.d.ts +49 -6
  145. package/src/lib/layout-language/ai-layout-pictures.js +145 -22
  146. package/src/lib/layout-language/ai-layout-pictures.js.map +1 -1
  147. package/src/lib/model/ai-build-job.d.ts +16 -1
  148. package/src/lib/model/ai-build-job.js +40 -0
  149. package/src/lib/model/ai-build-job.js.map +1 -1
  150. package/src/lib/model/ai-job-input.d.ts +33 -0
  151. package/src/lib/model/ai-job-input.js +59 -0
  152. package/src/lib/model/ai-job-input.js.map +1 -0
  153. package/src/lib/model/ai-job-notice.d.ts +4 -0
  154. package/src/lib/model/ai-job-notice.js +11 -1
  155. package/src/lib/model/ai-job-notice.js.map +1 -1
  156. package/src/lib/model/ai-jobs.types.d.ts +40 -1
  157. package/src/lib/model/ai-jobs.types.js.map +1 -1
  158. package/src/lib/model/ai-site-details.d.ts +122 -0
  159. package/src/lib/model/ai-site-details.js +300 -0
  160. package/src/lib/model/ai-site-details.js.map +1 -0
  161. package/src/lib/model/ai-site-entity.d.ts +181 -0
  162. package/src/lib/model/ai-site-entity.js +390 -0
  163. package/src/lib/model/ai-site-entity.js.map +1 -0
  164. package/src/lib/model/ai-site-inspiration.d.ts +72 -0
  165. package/src/lib/model/ai-site-inspiration.js +109 -0
  166. package/src/lib/model/ai-site-inspiration.js.map +1 -0
  167. package/src/lib/model/ai-site-job.d.ts +13 -1
  168. package/src/lib/model/ai-site-job.js +15 -2
  169. package/src/lib/model/ai-site-job.js.map +1 -1
  170. package/src/lib/model/ai-site-kinds.js +109 -21
  171. package/src/lib/model/ai-site-kinds.js.map +1 -1
  172. package/src/lib/model/ai-site-look.d.ts +10 -0
  173. package/src/lib/model/ai-site-look.js +24 -0
  174. package/src/lib/model/ai-site-look.js.map +1 -1
  175. package/src/lib/model/ai-site-start-seo.d.ts +19 -5
  176. package/src/lib/model/ai-site-start-seo.js +25 -7
  177. package/src/lib/model/ai-site-start-seo.js.map +1 -1
  178. package/src/lib/model/ai-site-start-steps.d.ts +9 -3
  179. package/src/lib/model/ai-site-start-steps.js +67 -5
  180. package/src/lib/model/ai-site-start-steps.js.map +1 -1
  181. package/src/lib/model/ai-site-start.d.ts +68 -4
  182. package/src/lib/model/ai-site-start.js +166 -13
  183. package/src/lib/model/ai-site-start.js.map +1 -1
  184. package/src/lib/model/ai-upsell-copy.js +4 -1
  185. package/src/lib/model/ai-upsell-copy.js.map +1 -1
  186. package/src/lib/plan-entitlements.d.ts +4 -3
  187. package/src/lib/plan-entitlements.js +3 -8
  188. package/src/lib/plan-entitlements.js.map +1 -1
  189. package/src/lib/runtime/ai-dataset-generation.d.ts +8 -1
  190. package/src/lib/runtime/ai-dataset-generation.js +12 -2
  191. package/src/lib/runtime/ai-dataset-generation.js.map +1 -1
  192. package/src/lib/runtime/ai-doctrine-validators.d.ts +26 -33
  193. package/src/lib/runtime/ai-doctrine-validators.js +54 -44
  194. package/src/lib/runtime/ai-doctrine-validators.js.map +1 -1
  195. package/src/lib/runtime/ai-doctrine.js +1 -1
  196. package/src/lib/runtime/ai-doctrine.js.map +1 -1
  197. package/src/lib/runtime/ai-node-tree.d.ts +7 -0
  198. package/src/lib/runtime/ai-node-tree.js +9 -1
  199. package/src/lib/runtime/ai-node-tree.js.map +1 -1
  200. package/src/lib/server/ai-create-route.d.ts +1 -1
  201. package/src/lib/server/ai-create-route.js +3 -4
  202. package/src/lib/server/ai-create-route.js.map +1 -1
  203. package/src/lib/server/ai-jobs-resume.js +27 -3
  204. package/src/lib/server/ai-jobs-resume.js.map +1 -1
  205. package/src/lib/server/ai-jobs-route.js +7 -0
  206. package/src/lib/server/ai-jobs-route.js.map +1 -1
  207. package/src/lib/usage/assist-credits.d.ts +4 -4
  208. package/src/lib/usage/assist-credits.js +4 -4
  209. package/src/lib/usage/assist-credits.js.map +1 -1
  210. package/src/lib/usage/staff-org-ai-view.js +6 -3
  211. package/src/lib/usage/staff-org-ai-view.js.map +1 -1
  212. package/src/lib/usage/staff-org-ai.d.ts +4 -2
  213. package/src/lib/usage/staff-org-ai.js +7 -7
  214. package/src/lib/usage/staff-org-ai.js.map +1 -1
  215. package/src/lib/usage/staff-org-usage-ai.js +2 -2
  216. package/src/lib/usage/staff-org-usage-ai.js.map +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../libs/plugins/ai/src/lib/jobs/fixtures/ai-stock-photo-agl3988-recordings.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { StockPhoto } from '@aglyn/aglyn/plugin-manager/stock-photo-provider'\n\n/**\n * PIXABAY'S RECORDED ANSWERS FOR THE BETA.270 SUGAR HOLLOW PHOTOGRAPHY\n * GUIDED START (AGL-3988): host MBuUDI70oE, job DQ9pZupq6M, 2026-10-19\n * 19:01Z, \"a wedding and family photographer in the Blue Ridge Mountains\n * who books sessions and elopements\". What production's `stockPhotoSearches`\n * cache held for the searches its \"Gallery collections\" covers and its home\n * and contact heroes sent, read back by each search's key, never searched\n * again. Ids, sizes, page slugs and tags are Pixabay's own, in its order;\n * the contributor is left out, and one contributor stands for all. Its\n * `wedding couple mountains` answer is the beta.267 Copper Hollow cache\n * entry (`ai-stock-photo-agl3942-recordings.ts`).\n */\n\nconst hit = (id: number, width: number, height: number, slug: string, tags: string): StockPhoto =>\n ({\n provider: 'pixabay',\n id: String(id),\n width,\n height,\n pageUrl: `https://pixabay.com/photos/${slug}/`,\n photographer: 'A Pixabay contributor',\n tags: tags ? tags.split(', ') : [],\n downloadUrl: `https://pixabay.com/get/g${id}_1280.jpg`,\n }) as StockPhoto\n\n/** `couple mountains` (horizontal, min_width 900), sent by the \"Gallery collections\" covers; answered 2026-10-19T19:03:23.174Z. */\nexport const COUPLE_MOUNTAINS_0919: StockPhoto[] = [\n hit(7126126, 1280, 853, 'sunset-couple-sky-clouds-mountain-7126126', 'sunset, couple, sky, clouds, mountain, love, nature, couple, love, love, love, love, love'),\n hit(7490522, 1280, 853, 'sunset-silhouettes-romantic-7490522', 'sunset, silhouettes, nature, romantic, together, love, romance, couple'),\n hit(2179256, 1280, 855, 'couple-lake-mountains-point-2179256', 'couple, lake, mountains, point, pointing, lovers, together, hikers, mountaineers, sit, sitting, adventure, mountain lake, alps, daylight, fir trees, hike, hiking, idyllic, landscape'),\n hit(6561172, 1280, 853, 'boat-lake-few-to-travel-tourism-6561172', 'boat, lake, nature, few, to travel, tourism, outdoors, exploration, adventure, sunset, ship, sail, sea, ocean, horizon, seascape, dusk, sailing ship, masts, windjammer'),\n hit(6017739, 1280, 853, 'couple-lovers-kiss-wedding-love-6017739', 'couple, lovers, kiss, wedding, love, romantic, happy, joy, affection, pier, couple, lovers, lovers, kiss, kiss, wedding, wedding, wedding, wedding, wedding'),\n hit(6704262, 1280, 853, 'couple-love-romance-wedding-bride-6704262', 'couple, love, romance, wedding, bride, groom, marriage, affection, together, couple, couple, couple, love, love, love, wedding, wedding, wedding, wedding, wedding'),\n hit(4329036, 1280, 848, 'loves-couple-romantic-sky-sun-4329036', 'loves, couple, romantic, sky, sun, nature, outdoors, together'),\n hit(4900493, 1280, 853, 'road-couple-travel-dessert-4900493', 'road, couple, travel, dessert, road, couple, couple, couple, couple, couple, travel'),\n hit(8574590, 1280, 854, 'morning-sunshine-sunrise-nature-8574590', 'morning, sunshine, sunrise, beautiful flowers, nature, couple, love, sunray, tree, bench, bush, flower background, flower wallpaper, flower, lake, mountain'),\n hit(8497575, 1280, 851, 'mountains-mountain-peak-8497575', 'mountains, mountain peak, cortina d\\'ampezzo, italy, winding road, pine forest, forest, clouds, nature, people, walking, hike, people, people, people, people, people'),\n hit(9215839, 1280, 853, 'couple-boat-shore-lake-coast-love-9215839', 'couple, nature, boat, shore, lake, coast, love, portrait'),\n hit(7144049, 1280, 853, 'valentines-day-background-wedding-7144049', 'valentines day background, wedding, happy, love, nature, sunset, mountain, cloud, forest, wife, husband, pair'),\n hit(7061929, 1280, 853, 'couple-love-nature-sunset-meadow-7061929', 'couple, love, nature, sunset, meadow, romantic, romance, together, man, woman, happiness, couple, love, love, love, love, love, sunset'),\n hit(6562725, 1280, 853, 'couple-sunset-silhouette-love-6562725', 'couple, sunset, silhouette, love, romance, lovers, romantic, relationship, nature, together, man, woman, dusk, dark'),\n hit(5267726, 1280, 853, 'couple-guy-girl-dog-mountain-5267726', 'couple, guy, girl, dog, mountain, mountains, nature, people, hug, pet, romantic, friendship, look, far, future, trail, destiny, animal, open, trip'),\n hit(6230410, 1280, 949, 'bride-groom-wedding-6230410', 'bride, groom, wedding, wedding photography, bridal gown, bridal dress, couple, pair, together, love, lovers, newlyweds, bridal, wedding dress, marriage, woman, fashion, dress, man, people'),\n hit(6770226, 1280, 854, 'couple-countryside-garden-tourists-6770226', 'couple, flower wallpaper, beautiful flowers, countryside, garden, flower background, nature, tourists, flowers'),\n hit(7130484, 1280, 849, 'beach-sea-ocean-love-couple-sand-7130484', 'beach, sea, ocean, love, couple, sand, holiday, nature, outdoors'),\n hit(8028185, 1280, 853, 'bride-groom-wedding-marriage-8028185', 'bride, groom, wedding, marriage, couple, love, bridal gown, model, natural, girl, woman, beautiful, wedding, natural, natural, natural, natural, natural'),\n hit(10480224, 1280, 853, 'sunset-lake-couple-paddling-dusk-10480224', 'sunset, lake, couple, paddling, dusk, romantic, red sky, mountains, silhouette, water sport, tranquility, nature, blue, evening, rowing, silence, evening sky, calm water, fiery sunset, symmetry'),\n hit(5693164, 1280, 853, 'couple-newlyweds-bride-groom-5693164', 'couple, newlyweds, bride, groom, holding hands, pair, love, people, relationship, together, couple, couple, couple, couple, couple, bride, holding hands'),\n hit(9553864, 1280, 854, 'utliberg-switzerland-nature-9553864', 'utliberg, switzerland, nature, landscape, alps, hike, swiss, winter, uetliberg, zurich, excursion'),\n hit(7003291, 1280, 853, 'wedding-snow-prenup-shoot-winter-7003291', 'wedding, snow, prenup shoot, winter, mountains, bride, groom, marriage, man, woman, couple, together, love, garden, nature, snowscape, landscape'),\n hit(6935359, 1280, 853, 'couple-river-holding-hands-mountain-6935359', 'couple, river, holding hands, mountain, walking, man, woman, sky, romantic, love, nature, holding hands, holding hands, holding hands, holding hands, holding hands'),\n hit(4650819, 1280, 619, 'mountain-landscape-nature-4650819', 'mountain, landscape, nature, kiss in the mountains, couple, love, scenic, darling, composition'),\n hit(7140471, 1280, 853, 'monkeys-primates-animals-wildlife-7140471', 'monkeys, primates, animals, wildlife, pair, couple, portrait, mountain, nature, gibraltar'),\n hit(7162791, 1280, 797, 'couple-outdoors-mountain-7162791', 'couple, outdoors, mountain, mountain peak, resting, relaxing, nature, cold, hiking'),\n hit(4388267, 1280, 853, 'manipulation-crescent-moon-couple-4388267', 'manipulation, crescent, moon, couple, romantic, love, sunset, landscape, hill, mountain, nature, birds'),\n hit(2521221, 1280, 761, 'fantasy-dream-cartoon-drawing-2521221', 'fantasy, dream, cartoon, drawing, design, magic, flower background, sweet, girl, nature, animal, fairytale, beautiful flowers, princess, cloud, landscape, happy, mountain, flower wallpaper, night sky'),\n hit(2597270, 1280, 853, 'clouds-sky-mountain-people-woman-2597270', 'clouds, sky, mountain, people, woman, holding hands, guy, nature, dating, blue nature, blue sky, blue mountain, blue clouds, dating, dating, dating, dating, dating'),\n hit(4897535, 1280, 853, 'mountain-snow-winter-cold-couple-4897535', 'mountain, snow, winter, cold, couple, color, landscape, nature, outdoors, happy'),\n hit(2560893, 1280, 854, 'mountain-highland-cloud-sky-peak-2560893', 'mountain, highland, cloud, sky, peak, landscape, nature, valley, people, couple, man, girl, hug, kiss, couple, couple, couple, couple, hug, hug'),\n hit(3916295, 1280, 856, 'landscape-mountain-summit-clouds-3916295', 'landscape, mountain, summit, clouds, sunset, sun, silhouette, couple, countryside, nature, winter, freedom, clermont ferrand, puy de dôme, france, europe, brown mountain'),\n hit(4855390, 1280, 853, 'ninh-binh-couple-travel-boat-4855390', 'ninh binh, nature, couple, travel, boat, mountain'),\n hit(3385783, 1280, 1070, 'silhouette-night-tree-dog-star-3385783', 'silhouette, pet, night, tree, dog, star, animal, starry sky, mountain, couple, nature, bank'),\n hit(2567022, 1280, 853, 'people-woman-man-hug-love-couple-2567022', 'people, woman, man, hug, nature, love, couple, sunset'),\n hit(2506868, 1280, 768, 'wedding-marriage-day-fancy-colored-2506868', 'wedding, marriage, day, fancy, colored, month, rainbow, mountain, couple, nature, tree, castle, fog, forest, could, sky, kiss'),\n hit(4010627, 1280, 720, 'beach-couple-mountain-cloud-ride-4010627', 'beach, couple, nature, mountain, cloud, ride, ocean, umbrella, valentine'),\n hit(7612157, 1280, 816, 'couple-the-glacier-mountains-7612157', 'couple, the glacier, mountains, trekking, tour, jungfrau, switzerland, top, together, tourist, walk together, backpack, mountain hike, mountain path, travel with a backpack, recreation, fresh air, nature, wanderers, adventure'),\n hit(3732779, 1280, 856, 'mountain-top-adventure-hiking-3732779', 'mountain, top, adventure, hiking, travel, couple, freedom, hiker, trekking, man, silhouette, backpacker, nature, blue sky, sky, blue, sunset, sunrise, landscape, fitness'),\n]\n\n/** `family mountains` (horizontal, min_width 900), sent by the \"Gallery collections\" covers; answered 2026-10-19T19:03:23.576Z. */\nexport const FAMILY_MOUNTAINS_0919: StockPhoto[] = [\n hit(920131, 1280, 814, 'children-hug-siblings-brother-920131', 'children, hug, siblings, brother, sister, kiss, affection, affectionate, hugging, embrace, love, relationship, together, portrait, little boy, little girl, friends, childhood, cute, people'),\n hit(4610864, 1280, 853, 'family-hike-travel-alps-4610864', 'family, hike, nature, travel, alps, distant view, hochwald, fir trees, mountains, wallberg, summit, picnic, hiking area, recreation, leisure time, mood, bavaria'),\n hit(4355469, 1280, 853, 'children-girl-hiking-trail-4355469', 'children, girl, hiking, trail, forest road, three, nature, landscape, path, forest, away, woman, person, wanderer, tourism, vacations, sunny, sunny day, mountain hiking, hiking'),\n hit(9822301, 1280, 831, 'viet-nam-flag-country-family-9822301', 'viet nam, flag, country, family, portrait, cute, girl, mother'),\n hit(6775216, 1280, 853, 'hike-nature-travel-adventure-6775216', 'hike, nature, travel, adventure, family, outdoors, forest, drought, pico ruivo, trekking, adventure, adventure, family, family, family, drought, drought, drought, drought, drought'),\n hit(5483516, 1280, 853, 'great-wall-of-china-beijing-china-5483516', 'great wall of china, beijing, china, asia, chinese, travel, adventure, visit, destination, family, great wall, architecture, historical, landmark, tourist attraction, history, places of interest, stone wall, china, china'),\n hit(6935341, 1280, 853, 'mother-daughter-outdoors-parent-6935341', 'mother, daughter, outdoors, parent, baby, child, people, family, love, closeup'),\n hit(3071287, 1280, 853, 'lake-waters-reflection-flow-3071287', 'lake, waters, reflection, flow, nature, mountain, web, family, mountains'),\n hit(7843738, 1280, 853, 'family-travel-mountain-forest-tree-7843738', 'family, travel, mountain, forest, nature, tree, thai nguyen, fun, vietnam'),\n hit(9605495, 1280, 853, 'spring-field-kids-sun-clouds-bird-9605495', 'spring, field, kids, nature, sun, clouds, bird, moutains, meadow'),\n hit(1807560, 1280, 777, 'teddy-bear-toys-asia-bali-kids-1807560', 'teddy bear, toys, asia, bali, kids, china, daughter, family, nature, farm, farmer, harvesting, mountains, people, plant, countryside, sewing, fabrics, woman, mother'),\n hit(1822446, 1280, 821, 'agriculture-rice-field-farming-asia-1822446', 'agriculture, rice field, farming, asia, cambodia, culture, farm, farmers, harvest, terrain, laos, happy mothers day, mountain, countryside, sa pa, valley, vietnam, village, thailand, county'),\n hit(3238401, 1280, 853, 'lifestyle-nature-ease-funny-family-3238401', 'lifestyle, nature, ease, funny, family, kid, union, girl, young, outdoors, joy, love, friendship, kids, smile, happiness, happy kids, family, kids, kids'),\n hit(165077, 1280, 837, 'sunset-sundown-da-nang-bay-165077', 'sunset, sundown, nature, da nang bay, danang city, vietnam, beach'),\n hit(4574003, 1280, 853, 'mountain-mint-clinopodium-nepeta-4574003', 'mountain mint, clinopodium nepeta, small-flowered mountain mint, kölme, lamiaceae, lip flower family, steinquendel, blossoms, blue, violet, alpine plant, mountain mint, mountain mint, mountain mint, mountain mint, mountain mint'),\n hit(6883668, 1280, 853, 'goat-mammal-mother-baby-family-6883668', 'goat, mammal, mother, baby, family, animal, nature, mountain, gerês, portugal'),\n hit(7420557, 1280, 853, 'snow-mountain-trillium-lake-7420557', 'snow mountain, trillium lake, paddle board, nature, child, childhood, summer, family, portland, oregon'),\n hit(275998, 1280, 844, 'sunset-sundown-da-nang-bay-275998', 'sunset, sundown, da nang bay, danang city, central vietnam, vietnam, nature, brown city, brown sunset'),\n hit(854005, 1280, 854, 'people-papa-man-child-girl-meadow-854005', 'people, papa, man, child, girl, meadow, wheelbarrows, mountains, in height, country life, nature, outdoors, sunset, lighting mood, people, papa, country life, country life, country life, country life'),\n hit(3218863, 1280, 853, 'man-child-father-lake-early-fog-3218863', 'man, child, father, lake, early fog, fog, mountains, web, fathers day, waters, people, nature, water, buoy, landscape, fathers day, fathers day, fathers day, fathers day, fathers day'),\n hit(10386423, 1280, 853, 'monkey-macaque-family-interaction-10386423', 'monkey, macaque, family, interaction, dialogue, friendly, nature, cliff, companionship, tourist path, natural habitat, curiosity, group, undershirt, bun, excursion, natural beauty, summer time, observation'),\n hit(838221, 1280, 853, 'boys-brothers-child-fun-little-838221', 'boys, brothers, child, fun, little, childhood, toddler, kid, people, together, young, happiness, siblings, two, play, adorable, outdoor, road, brown happy, brown road'),\n hit(1576456, 1280, 820, 'father-son-family-mountain-1576456', 'father, son, family, mountain, happiness, couple, field, mount, landscape, stone, child portrait, nature, child, smiles, play, family photo, happy, walk, fathers day'),\n hit(868394, 1280, 720, 'father-child-family-love-toddler-868394', 'father, child, family, love, toddler, dad, daughter, mountains, holiday, landscape, nature, view, rest, summer, beauty, the national park, top view, the height of the, ocean, relaxation'),\n hit(845235, 1280, 843, 'capricorn-mountains-alps-boy-cub-845235', 'capricorn, mountains, alps, boy, cub, animal, nature, horns'),\n hit(1837263, 1280, 853, 'child-clouds-dad-dock-father-lake-1837263', 'child, clouds, dad, dock, father, lake, mountain range, mountains, nature, outdoors, parent, pier, relaxation, sky, water, dad, dock, dock, father, father'),\n hit(2106625, 1280, 768, 'landscapedesign-photomanipulations-2106625', 'landscapedesign, photomanipulations, digitalart, art, landscape, landscapephotography, photoshop, design, digital art, art, art, art, art, art, photoshop, photoshop, photoshop, photoshop'),\n hit(7488520, 1280, 854, 'father-and-son-coast-football-wave-7488520', 'father and son, coast, football, nature, wave, playing, mountain, sea, sky, family, classic, love and cherish, romantic, minimalism'),\n hit(4333589, 1280, 689, 'consolation-tears-sad-cry-pain-4333589', 'consolation, tears, sad, cry, pain, help, compassion, suffering, elephants, children, people, compassion, compassion, compassion, compassion, compassion, suffering'),\n hit(2388636, 1280, 969, 'chamois-with-young-animals-2388636', 'chamois with young animals, rupicapra rupicapra, high mountains, switzerland, greina'),\n hit(1044383, 1280, 854, 'alp-canton-of-glarus-mountains-1044383', 'alp, canton of glarus, mountains, glarus, girl, glarus alps, switzerland, nature, glärnisch, child, glarus, switzerland, switzerland, switzerland, switzerland, switzerland, child, child, child'),\n hit(3717770, 1280, 854, 'man-son-people-person-family-3717770', 'man, son, people, person, family, parent, parenthood, walking, beach, mountains, cloudy, phuket, thailand, nature, people, phuket, phuket, phuket, phuket, phuket'),\n hit(10042132, 1280, 720, 'mountainous-area-mountain-10042132', 'mountainous area, mountain, nature, butt people, butt, ethnic minority, number, people'),\n hit(1147499, 1280, 960, 'mountain-avens-alpine-flower-1147499', 'mountain avens, alpine flower, alpine flora, alpine plant, dryas octopetala, blossom, flower background, nature, bloom, flower, roses, trellis shrub, dryas, beautiful flowers, inflorescence, flower wallpaper, seed stand'),\n hit(515532, 1280, 854, 'mother-and-daughter-family-happy-515532', 'mother and daughter, family, happy, outdoors, women, female, people, smile, cheerful'),\n hit(4445289, 1280, 853, 'bellflower-flower-blossom-bloom-4445289', 'bellflower, flower, flower background, blossom, bloom, violet, plant, flower wallpaper, bluebell family, petals, beautiful flowers, flora, wildflower, mountain flower, summer, nature'),\n hit(2592704, 1280, 853, 'family-people-parent-mother-mom-2592704', 'family, people, nature, parent, mother, mom, baby, kid, child, cute, sweet, windmill, plants, mountain'),\n hit(4383859, 1280, 852, 'plant-leaf-rainforest-4383859', 'plant, leaf, nature, rainforest, the transmitted light, spines there, palm family, harry the salak mountain national park, java island, indonesia'),\n hit(3167588, 1280, 652, 'children-ski-lessons-exercise-hills-3167588', 'children, ski lessons, exercise hills, black forest, ski slope, children hill, beginners, hill, nature, snow, winter, forest, landscape, mountain, heaven, cold, hike, travel, vacations, piste'),\n hit(2465836, 1280, 960, 'swan-chick-cute-bird-young-animals-2465836', 'swan, chick, cute, nature, bird, young animals, white, swans, water bird, new burger, lake, switzerland'),\n]\n\n/** `wedding` (horizontal, min_width 1600), sent by the home and contact heroes; answered 2026-10-19T19:04:24.193Z. */\nexport const WEDDING_HERO: StockPhoto[] = [\n hit(1837148, 1280, 853, 'bride-couple-groom-hands-1837148', 'bride, couple, groom, hands, holding hands, wedding, wedding rings, wedding bands, lovers, husband and wife, bride and groom, love, man, marriage, partners, people, trust, woman, wedding, wedding'),\n hit(3611277, 1280, 800, 'wedding-rings-engagement-rings-3611277', 'wedding rings, engagement rings, marriage, jewelry, gold, wedding rings, wedding rings, marriage, marriage, marriage, jewelry, jewelry, gold, gold, gold, gold, gold'),\n hit(2595862, 1280, 853, 'valentines-day-background-wedding-2595862', 'valentines day background, wedding, marriage, husband, wife, bride, groom, bridal gown, bridal dress, bridal bouquet, suit, man, woman, couple, lovers, together, love, people, guy, female'),\n hit(5574694, 1280, 853, 'hand-wedding-marriage-couple-love-5574694', 'hand, wedding, marriage, couple, love, romance, romantic, celebration, family, togetherness, commitment, diamond, honeymoon, relationship, gold, jewelry, fiance, wedding ring, horizontal, touching'),\n hit(260894, 1280, 853, 'flowers-rings-bouquet-260894', 'flowers, flower wallpaper, rings, bouquet, nature, wedding bouquet, wedding rings, bridal bouquet, wedding bands, wedding, marriage, flower background, flower arrangement, beautiful flowers, close up'),\n hit(10320741, 1280, 853, 'wedding-bride-groom-beach-love-10320741', 'wedding, bride, groom, beach, love, beautiful flowers, romance, kiss, nature, couple, wedding dress, suit, tenderness, happiness, marriage, flower wallpaper, flowers, bouquet, special day, bridal bouquet'),\n hit(7744547, 1280, 853, 'church-catholic-cathedral-aisle-7744547', 'church, catholic, cathedral, aisle, pews, religion, altar, christian, faith, wedding, ceremony, wedding ceremony, couple, marriage, chapel, architecture, church, church, church, church'),\n hit(4615557, 1280, 853, 'happy-valentines-day-couple-wedding-4615557', 'happy valentines day, couple, wedding, marriage, bridal, double, nature, love, people, man, woman, romance, happy, romantic, dress, married, male, big, girl, happiness'),\n hit(1284225, 1280, 851, 'wedding-rings-marriage-wedding-1284225', 'wedding rings, marriage, wedding, open bible, golden rings, couple, love, rings, book, bible, vows, love wallpaper, wedding rings, marriage, marriage, marriage, wedding, wedding, wedding, wedding'),\n hit(1836315, 1280, 838, 'wedding-couple-marriage-1836315', 'wedding, beautiful flowers, couple, marriage, bridal bouquet, wedding ceremony, matrimony, husband and wife, bride and groom, bloom, blossom, bouquet, bride, flower background, ceremony, flowers, groom, flower wallpaper, people, nature'),\n hit(8220935, 1280, 853, 'rings-marriage-gold-love-family-8220935', 'rings, marriage, gold, love, family, marriage, marriage, marriage, marriage, marriage, gold, love, love, family'),\n hit(1485984, 1280, 864, 'wedding-dress-bride-extravagant-1485984', 'wedding dress, bride, extravagant, fancy, luxury, dress, white, wedding, wedding gown, fashion, style, modeling, pose, posing, portrait, wedding dress, wedding dress, wedding dress, bride, bride'),\n hit(10397634, 1280, 853, 'couple-hands-wedding-ring-love-10397634', 'couple, hands, wedding, ring, love, wedding rings, vow, delicate, feeling, connection, closeness, romance, skin, ceremony, softness, close, symbol, marriage, holding hands, support'),\n hit(3061485, 1280, 852, 'paper-page-ring-romantic-love-3061485', 'paper, page, ring, romantic, love, valentine, heart, book, read, getting married, rings, proposing, ring, ring, ring, ring, ring, love, love, love'),\n hit(6230420, 1280, 853, 'bride-groom-wedding-marriage-6230420', 'bride, groom, wedding, marriage, wedding photography, bridal gown, bridal dress, couple, love, lovers, bridal, together, man, wedding dress, woman, people, in love, romantic, romance, relationship'),\n hit(6552057, 1280, 762, 'bride-groom-wedding-6552057', 'bride, groom, wedding, wedding photography, bridal gown, bridal dress, couple, pair, together, love, lovers, newlyweds, bridal, wedding dress, marriage, woman, fashion, dress, man, people'),\n hit(698501, 1280, 852, 'sunset-wedding-silhouettes-marriage-698501', 'sunset, wedding, silhouettes, marriage, newlyweds, bride, groom, holding hands, couple, bridal, sky, clouds, dusk, romantic, nature, love, romance, man, woman, relationship'),\n hit(10119091, 1280, 853, 'classic-bike-old-house-kiss-love-10119091', 'classic, bike, old house, kiss, love, couple, romantic, relationship, wedding, wedding ring'),\n hit(5955351, 1280, 853, 'wedding-couple-bouquet-marriage-5955351', 'wedding, couple, bouquet, marriage, love, romantic, bride, groom, man, woman, together, relationship, romance, hands, bridal, wedding dress, happiness, closeup, wedding, wedding'),\n hit(8176869, 1280, 853, 'couple-wedding-marriage-love-8176869', 'couple, wedding, marriage, love, romance, man, woman, portrait, groom, bride'),\n hit(1486005, 1280, 853, 'wedding-dresses-bride-wedding-1486005', 'wedding dresses, bride, wedding, elegant, white, female, bride, wedding, wedding, wedding, wedding, wedding'),\n hit(1846114, 1280, 854, 'wedding-aisle-flower-arrangement-1846114', 'wedding, aisle, flower arrangement, bloom, blossom, bouquet, celebration, chairs, decoration, beautiful flowers, flower background, nature, flora, flowers, roses, event, flower wallpaper, wedding photography, wedding preparations'),\n hit(1854076, 1280, 852, 'beach-wedding-reception-1854076', 'beach, flower wallpaper, wedding, flower background, reception, table setting, centerpieces, flower vases, event, beach wedding, wedding photography, wedding preparations, bunch of flowers, celebration, chairs, decorations, flowers, beautiful flowers, sea, summer'),\n hit(2162950, 1280, 853, 'couple-wedding-love-back-lovers-2162950', 'couple, wedding, love, back, lovers, relationship, newlyweds, marriage, bride, groom, sit, sitting, together, man, woman, dress, female, romantic, pier, jetty'),\n hit(4066022, 1280, 853, 'bride-groom-wedding-4066022', 'bride, groom, wedding, wedding photography, bridal gown, bridal dress, couple, pair, together, love, lovers, newlyweds, bridal, wedding dress, marriage, woman, fashion, dress, man, people'),\n hit(260899, 1280, 853, 'happy-valentines-day-couple-marriage-260899', 'happy valentines day, couple, marriage, bench, married couple, bride, groom, sit, sitting, together, relationship, lovers, love, wedding, rest'),\n hit(443600, 1280, 853, 'couple-wedding-park-newlyweds-443600', 'couple, wedding, park, newlyweds, wedding day, husband, wife, man, woman, bride, groom, romantic, love, happy, relationship, outdoors, wedding photography, portrait, couple, wedding'),\n hit(1183271, 1280, 853, 'wedding-bride-married-ceremony-1183271', 'wedding, bride, married, ceremony, romance, couple, romantic, love, wedding dress, event, white, lovers, marriage, beautiful, woman, brown love, brown beauty, brown wedding, brown event, wedding'),\n hit(1355473, 1280, 850, 'bride-wedding-redhead-red-hair-1355473', 'bride, beautiful flowers, wedding, redhead, flower wallpaper, red hair, floral wreath, hairstyle, flowers, flower background, marriage, decoration, nature, woman'),\n hit(1745240, 1280, 853, 'wedding-beach-young-couple-couple-1745240', 'wedding, beach, young couple, couple, portrait, lovers, husband and wife, bride and groom, beach wedding, marriage, pair, together, romantic couple, couple portrait, love, romantic, ocean, nature, seashore, shore'),\n hit(458119, 1280, 853, 'newlyweds-bride-groom-wedding-458119', 'newlyweds, bride, groom, wedding, bride and groom, husband and wife, wedding photography, wedding day, wedding dress, wedding details, couple, love, man, woman, marriage, happy couple, happy, happiness, together, bridal'),\n hit(1255520, 1280, 852, 'bride-groom-wedding-1255520', 'bride, groom, wedding, wedding photography, bridal gown, bridal dress, couple, pair, together, love, lovers, newlyweds, bridal, wedding dress, marriage, woman, fashion, dress, man, people'),\n hit(9490176, 1280, 853, 'pre-wedding-couple-love-wedding-9490176', 'pre-wedding, couple, love, wedding'),\n hit(1854074, 1280, 852, 'wedding-reception-table-banquet-1854074', 'wedding, reception, table, banquet, centerpieces, flower vases, table setting, bouquets, nature, celebration, flower wallpaper, event, decorations, elegant, flower background, flower arrangements, flowers, roses, beautiful flowers, table set-up'),\n hit(5582980, 1280, 853, 'wedding-photography-wedding-details-5582980', 'wedding photography, wedding details, wedding preparations, flower background, wedding, table set-up, flower arrangement, nature, flowers, table, glassware, candles, dining table, decoration, decorative, flower wallpaper, beautiful flowers, floral'),\n hit(529607, 1280, 852, 'heart-wedding-marriage-529607', 'heart, 4k wallpaper 1920x1080, wedding, marriage, hd wallpaper, valentines day, hands, romantic, wallpaper hd, marry, laptop wallpaper, beautiful wallpaper, mac wallpaper, couple, free background, together, wallpaper 4k, free wallpaper, husband, desktop backgrounds'),\n hit(4226896, 1280, 853, 'marriage-couple-wedding-love-4226896', 'marriage, couple, wedding, love, family, romantic, romance, relationship, happy, together, grooms, husband, wife, wedding, wedding, wedding, wedding, wedding, family'),\n hit(7389356, 1280, 851, 'jewel-diamond-ring-fashion-jewelry-7389356', 'jewel, diamond, ring, fashion, jewelry, wedding, diamond, diamond, ring, ring, ring, jewelry, jewelry, jewelry, jewelry, jewelry'),\n hit(7407081, 1280, 854, 'park-rain-wedding-couple-7407081', 'park, rain, wedding, couple, wedding day, nature, wedding photography, raining, trees, forest, landscape, rain, rain, rain, rain, rain, wedding, raining'),\n hit(8628797, 1280, 853, 'wedding-marriage-couple-love-8628797', 'wedding, marriage, couple, love, relationship, romance, bridal'),\n]\n\n/** The photos production placed whose alt text read as tag soup, by Pixabay id, as their searches answered them. */\nexport const SUGAR_HOLLOW_PLACED: StockPhoto[] = [\n hit(9140142, 853, 1280, 'father-girl-care-love-worry-9140142', 'father, girl, care, love, worry, children, palm, autumn, fall, baby, child, model, nature, park, trees, leaves, family, outdoors'),\n hit(10140688, 854, 1280, 'couple-on-bench-autumn-romance-10140688', 'couple on bench, ipad wallpaper, autumn romance, beautiful wallpaper, lakeside view, phone wallpaper, lock screen wallpaper, cozy moment, fall season, nature love, scenic beauty, peaceful retreat, mobile wallpaper 4k, relationship goals, outdoor date, tranquil forest, serene landscape, iphone wallpa'),\n hit(6071186, 853, 1280, 'family-tourists-sightseeing-6071186', 'family, tourists, sightseeing, mountain, landscape, vacation, holiday, leisure, mother, daughter, women, baby, child, girl, young, people, together, cute, happy, outdoors'),\n hit(7065652, 853, 1280, 'couple-wedding-fog-forest-bride-7065652', 'couple, wedding, fog, forest, bride, groom, romantic, newly married, nature, wedding day, husband, wife, man, woman, love, park, happy, relationship, outdoors, portrait'),\n hit(4897535, 1280, 853, 'mountain-snow-winter-cold-couple-4897535', 'mountain, snow, winter, cold, couple, color, landscape, nature, outdoors, happy'),\n hit(7126126, 1280, 853, 'sunset-couple-sky-clouds-mountain-7126126', 'sunset, couple, sky, clouds, mountain, love, nature, couple, love, love, love, love, love'),\n hit(2191390, 853, 1280, 'couple-sky-evening-sunset-romantic-2191390', 'couple, sky, evening, sunset, romantic, engaged, newy wed, nature, silhouette, happy, love'),\n hit(1837263, 1280, 853, 'child-clouds-dad-dock-father-lake-1837263', 'child, clouds, dad, dock, father, lake, mountain range, mountains, nature, outdoors, parent, pier, relaxation, sky, water, dad, dock, dock, father, father'),\n]\n"],"names":["hit","id","width","height","slug","tags","provider","String","pageUrl","photographer","split","downloadUrl","COUPLE_MOUNTAINS_0919","FAMILY_MOUNTAINS_0919","WEDDING_HERO","SUGAR_HOLLOW_PLACED"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAID;;;;;;;;;;;CAWC,GAED,MAAMA,MAAM,CAACC,IAAYC,OAAeC,QAAgBC,MAAcC,OACnE,CAAA;QACCC,UAAU;QACVL,IAAIM,OAAON;QACXC;QACAC;QACAK,SAAS,CAAC,2BAA2B,EAAEJ,KAAK,CAAC,CAAC;QAC9CK,cAAc;QACdJ,MAAMA,OAAOA,KAAKK,KAAK,CAAC,QAAQ,EAAE;QAClCC,aAAa,CAAC,yBAAyB,EAAEV,GAAG,SAAS,CAAC;IACxD,CAAA;AAEF,iIAAiI,GACjI,OAAO,MAAMW,wBAAsC;IACjDZ,IAAI,SAAS,MAAM,KAAK,6CAA6C;IACrEA,IAAI,SAAS,MAAM,KAAK,uCAAuC;IAC/DA,IAAI,SAAS,MAAM,KAAK,uCAAuC;IAC/DA,IAAI,SAAS,MAAM,KAAK,2CAA2C;IACnEA,IAAI,SAAS,MAAM,KAAK,2CAA2C;IACnEA,IAAI,SAAS,MAAM,KAAK,6CAA6C;IACrEA,IAAI,SAAS,MAAM,KAAK,yCAAyC;IACjEA,IAAI,SAAS,MAAM,KAAK,sCAAsC;IAC9DA,IAAI,SAAS,MAAM,KAAK,2CAA2C;IACnEA,IAAI,SAAS,MAAM,KAAK,mCAAmC;IAC3DA,IAAI,SAAS,MAAM,KAAK,6CAA6C;IACrEA,IAAI,SAAS,MAAM,KAAK,6CAA6C;IACrEA,IAAI,SAAS,MAAM,KAAK,4CAA4C;IACpEA,IAAI,SAAS,MAAM,KAAK,yCAAyC;IACjEA,IAAI,SAAS,MAAM,KAAK,wCAAwC;IAChEA,IAAI,SAAS,MAAM,KAAK,+BAA+B;IACvDA,IAAI,SAAS,MAAM,KAAK,8CAA8C;IACtEA,IAAI,SAAS,MAAM,KAAK,4CAA4C;IACpEA,IAAI,SAAS,MAAM,KAAK,wCAAwC;IAChEA,IAAI,UAAU,MAAM,KAAK,6CAA6C;IACtEA,IAAI,SAAS,MAAM,KAAK,wCAAwC;IAChEA,IAAI,SAAS,MAAM,KAAK,uCAAuC;IAC/DA,IAAI,SAAS,MAAM,KAAK,4CAA4C;IACpEA,IAAI,SAAS,MAAM,KAAK,+CAA+C;IACvEA,IAAI,SAAS,MAAM,KAAK,qCAAqC;IAC7DA,IAAI,SAAS,MAAM,KAAK,6CAA6C;IACrEA,IAAI,SAAS,MAAM,KAAK,oCAAoC;IAC5DA,IAAI,SAAS,MAAM,KAAK,6CAA6C;IACrEA,IAAI,SAAS,MAAM,KAAK,yCAAyC;IACjEA,IAAI,SAAS,MAAM,KAAK,4CAA4C;IACpEA,IAAI,SAAS,MAAM,KAAK,4CAA4C;IACpEA,IAAI,SAAS,MAAM,KAAK,4CAA4C;IACpEA,IAAI,SAAS,MAAM,KAAK,4CAA4C;IACpEA,IAAI,SAAS,MAAM,KAAK,wCAAwC;IAChEA,IAAI,SAAS,MAAM,MAAM,0CAA0C;IACnEA,IAAI,SAAS,MAAM,KAAK,4CAA4C;IACpEA,IAAI,SAAS,MAAM,KAAK,8CAA8C;IACtEA,IAAI,SAAS,MAAM,KAAK,4CAA4C;IACpEA,IAAI,SAAS,MAAM,KAAK,wCAAwC;IAChEA,IAAI,SAAS,MAAM,KAAK,yCAAyC;CAClE,CAAA;AAED,iIAAiI,GACjI,OAAO,MAAMa,wBAAsC;IACjDb,IAAI,QAAQ,MAAM,KAAK,wCAAwC;IAC/DA,IAAI,SAAS,MAAM,KAAK,mCAAmC;IAC3DA,IAAI,SAAS,MAAM,KAAK,sCAAsC;IAC9DA,IAAI,SAAS,MAAM,KAAK,wCAAwC;IAChEA,IAAI,SAAS,MAAM,KAAK,wCAAwC;IAChEA,IAAI,SAAS,MAAM,KAAK,6CAA6C;IACrEA,IAAI,SAAS,MAAM,KAAK,2CAA2C;IACnEA,IAAI,SAAS,MAAM,KAAK,uCAAuC;IAC/DA,IAAI,SAAS,MAAM,KAAK,8CAA8C;IACtEA,IAAI,SAAS,MAAM,KAAK,6CAA6C;IACrEA,IAAI,SAAS,MAAM,KAAK,0CAA0C;IAClEA,IAAI,SAAS,MAAM,KAAK,+CAA+C;IACvEA,IAAI,SAAS,MAAM,KAAK,8CAA8C;IACtEA,IAAI,QAAQ,MAAM,KAAK,qCAAqC;IAC5DA,IAAI,SAAS,MAAM,KAAK,4CAA4C;IACpEA,IAAI,SAAS,MAAM,KAAK,0CAA0C;IAClEA,IAAI,SAAS,MAAM,KAAK,uCAAuC;IAC/DA,IAAI,QAAQ,MAAM,KAAK,qCAAqC;IAC5DA,IAAI,QAAQ,MAAM,KAAK,4CAA4C;IACnEA,IAAI,SAAS,MAAM,KAAK,2CAA2C;IACnEA,IAAI,UAAU,MAAM,KAAK,8CAA8C;IACvEA,IAAI,QAAQ,MAAM,KAAK,yCAAyC;IAChEA,IAAI,SAAS,MAAM,KAAK,sCAAsC;IAC9DA,IAAI,QAAQ,MAAM,KAAK,2CAA2C;IAClEA,IAAI,QAAQ,MAAM,KAAK,2CAA2C;IAClEA,IAAI,SAAS,MAAM,KAAK,6CAA6C;IACrEA,IAAI,SAAS,MAAM,KAAK,8CAA8C;IACtEA,IAAI,SAAS,MAAM,KAAK,8CAA8C;IACtEA,IAAI,SAAS,MAAM,KAAK,0CAA0C;IAClEA,IAAI,SAAS,MAAM,KAAK,sCAAsC;IAC9DA,IAAI,SAAS,MAAM,KAAK,0CAA0C;IAClEA,IAAI,SAAS,MAAM,KAAK,wCAAwC;IAChEA,IAAI,UAAU,MAAM,KAAK,sCAAsC;IAC/DA,IAAI,SAAS,MAAM,KAAK,wCAAwC;IAChEA,IAAI,QAAQ,MAAM,KAAK,2CAA2C;IAClEA,IAAI,SAAS,MAAM,KAAK,2CAA2C;IACnEA,IAAI,SAAS,MAAM,KAAK,2CAA2C;IACnEA,IAAI,SAAS,MAAM,KAAK,iCAAiC;IACzDA,IAAI,SAAS,MAAM,KAAK,+CAA+C;IACvEA,IAAI,SAAS,MAAM,KAAK,8CAA8C;CACvE,CAAA;AAED,oHAAoH,GACpH,OAAO,MAAMc,eAA6B;IACxCd,IAAI,SAAS,MAAM,KAAK,oCAAoC;IAC5DA,IAAI,SAAS,MAAM,KAAK,0CAA0C;IAClEA,IAAI,SAAS,MAAM,KAAK,6CAA6C;IACrEA,IAAI,SAAS,MAAM,KAAK,6CAA6C;IACrEA,IAAI,QAAQ,MAAM,KAAK,gCAAgC;IACvDA,IAAI,UAAU,MAAM,KAAK,2CAA2C;IACpEA,IAAI,SAAS,MAAM,KAAK,2CAA2C;IACnEA,IAAI,SAAS,MAAM,KAAK,+CAA+C;IACvEA,IAAI,SAAS,MAAM,KAAK,0CAA0C;IAClEA,IAAI,SAAS,MAAM,KAAK,mCAAmC;IAC3DA,IAAI,SAAS,MAAM,KAAK,2CAA2C;IACnEA,IAAI,SAAS,MAAM,KAAK,2CAA2C;IACnEA,IAAI,UAAU,MAAM,KAAK,2CAA2C;IACpEA,IAAI,SAAS,MAAM,KAAK,yCAAyC;IACjEA,IAAI,SAAS,MAAM,KAAK,wCAAwC;IAChEA,IAAI,SAAS,MAAM,KAAK,+BAA+B;IACvDA,IAAI,QAAQ,MAAM,KAAK,8CAA8C;IACrEA,IAAI,UAAU,MAAM,KAAK,6CAA6C;IACtEA,IAAI,SAAS,MAAM,KAAK,2CAA2C;IACnEA,IAAI,SAAS,MAAM,KAAK,wCAAwC;IAChEA,IAAI,SAAS,MAAM,KAAK,yCAAyC;IACjEA,IAAI,SAAS,MAAM,KAAK,4CAA4C;IACpEA,IAAI,SAAS,MAAM,KAAK,mCAAmC;IAC3DA,IAAI,SAAS,MAAM,KAAK,2CAA2C;IACnEA,IAAI,SAAS,MAAM,KAAK,+BAA+B;IACvDA,IAAI,QAAQ,MAAM,KAAK,+CAA+C;IACtEA,IAAI,QAAQ,MAAM,KAAK,wCAAwC;IAC/DA,IAAI,SAAS,MAAM,KAAK,0CAA0C;IAClEA,IAAI,SAAS,MAAM,KAAK,0CAA0C;IAClEA,IAAI,SAAS,MAAM,KAAK,6CAA6C;IACrEA,IAAI,QAAQ,MAAM,KAAK,wCAAwC;IAC/DA,IAAI,SAAS,MAAM,KAAK,+BAA+B;IACvDA,IAAI,SAAS,MAAM,KAAK,2CAA2C;IACnEA,IAAI,SAAS,MAAM,KAAK,2CAA2C;IACnEA,IAAI,SAAS,MAAM,KAAK,+CAA+C;IACvEA,IAAI,QAAQ,MAAM,KAAK,iCAAiC;IACxDA,IAAI,SAAS,MAAM,KAAK,wCAAwC;IAChEA,IAAI,SAAS,MAAM,KAAK,8CAA8C;IACtEA,IAAI,SAAS,MAAM,KAAK,oCAAoC;IAC5DA,IAAI,SAAS,MAAM,KAAK,wCAAwC;CACjE,CAAA;AAED,kHAAkH,GAClH,OAAO,MAAMe,sBAAoC;IAC/Cf,IAAI,SAAS,KAAK,MAAM,uCAAuC;IAC/DA,IAAI,UAAU,KAAK,MAAM,2CAA2C;IACpEA,IAAI,SAAS,KAAK,MAAM,uCAAuC;IAC/DA,IAAI,SAAS,KAAK,MAAM,2CAA2C;IACnEA,IAAI,SAAS,MAAM,KAAK,4CAA4C;IACpEA,IAAI,SAAS,MAAM,KAAK,6CAA6C;IACrEA,IAAI,SAAS,KAAK,MAAM,8CAA8C;IACtEA,IAAI,SAAS,MAAM,KAAK,6CAA6C;CACtE,CAAA"}
@@ -174,7 +174,7 @@ export interface SectionScope {
174
174
  groupStyle?: AiLayoutGroupVariant;
175
175
  }
176
176
  /** Compiles a page designed in the layout language into the tree it stores. */
177
- export declare function aiCompileLayoutPage(sections: readonly AiLayoutSection[], plan: AiLayoutPagePlan, targets: AiLayoutTargets, options: AiLayoutCompileOptions): AiLayoutCompiledPage;
177
+ export declare function aiCompileLayoutPage(designed: readonly AiLayoutSection[], plan: AiLayoutPagePlan, targets: AiLayoutTargets, options: AiLayoutCompileOptions): AiLayoutCompiledPage;
178
178
  /** A band's own colors, as palette roles: the dark band pins the scheme instead. */
179
179
  export declare function bandSx(band: AiLayoutBand): Record<string, unknown> | null;
180
180
  export { aiLayoutSpans };
@@ -22,9 +22,10 @@ import { AI_INSTANCE_REF_PROP } from "../runtime/ai-node-tree.js";
22
22
  import { aiPageScrollInteraction } from "../runtime/ai-page-links.js";
23
23
  import { aiLayoutFitText, aiLayoutQuoteGap, aiLayoutWords } from "./ai-layout-copy.js";
24
24
  import { AI_LAYOUT_GROUP_KINDS, AI_LAYOUT_MAX_ITEMS } from "./ai-layout-language.js";
25
- import { aiLayoutDesignChoices, aiLayoutFamily, aiLayoutGroupVariant } from "./ai-layout-design.js";
25
+ import { AI_LAYOUT_HALF_HEROES, aiLayoutDesignChoices, aiLayoutFamily, aiLayoutGroupVariant } from "./ai-layout-design.js";
26
26
  import { AI_LAYOUT_FEATURED_RECORDS, AI_LAYOUT_LISTING_ELEMENTS, aiLayoutIsRecordImageAlt, aiLayoutListingAt, aiLayoutRecordHref, aiLayoutRecordImageAltField, aiLayoutRepeatFilterOf } from "./ai-layout-listings.js";
27
27
  import { aiStorefrontItemIcons } from "./ai-layout-storefront.js";
28
+ import { aiLayoutContactLabel, aiLayoutWithContactLines } from "./ai-layout-contact.js";
28
29
  import { AI_LAYOUT_LABELS_EN, aiLayoutLabel } from "./ai-layout-labels.js";
29
30
  import { aiLayoutRenamedLabel, aiLayoutResolveLink } from "./ai-layout-links.js";
30
31
  import { aiLayoutSpans, AI_LAYOUT_FRAMES, AiLayoutTreeBuilder } from "./ai-layout-tree.js";
@@ -69,8 +70,12 @@ function formSectionOf(sections, plan, targets) {
69
70
  const designed = sections.findIndex((section)=>section.blocks.some((block)=>block.kind === 'form' && (!block.to || forms.has(block.to))));
70
71
  return designed === -1 ? null : designed;
71
72
  }
72
- /** Compiles a page designed in the layout language into the tree it stores. */ export function aiCompileLayoutPage(sections, plan, targets, options) {
73
+ /** Compiles a page designed in the layout language into the tree it stores. */ export function aiCompileLayoutPage(designed, plan, targets, options) {
73
74
  const tree = new AiLayoutTreeBuilder();
75
+ const formSection = formSectionOf(designed, plan, targets);
76
+ // The page a visitor opens to get in touch shows the phone and email the
77
+ // business gave, as links, wherever the design did not (AGL-3979).
78
+ const sections = aiLayoutWithContactLines(designed, formSection, targets.contact);
74
79
  const page = {
75
80
  tree,
76
81
  plan,
@@ -83,7 +88,7 @@ function formSectionOf(sections, plan, targets) {
83
88
  brand: 0,
84
89
  dark: 0
85
90
  },
86
- formSection: formSectionOf(sections, plan, targets),
91
+ formSection,
87
92
  pageIcon: pageIconOf(sections),
88
93
  formsPlaced: new Set(),
89
94
  itemIds: plan.sections.map(()=>[]),
@@ -251,7 +256,7 @@ function compileSection(page, raw, index) {
251
256
  // A row whose columns all say the same kind of thing, three or more across,
252
257
  // is a group of cards: one design, the words the columns gave.
253
258
  if (filled.length >= 3 && sameShape(filled.map((entry)=>entry.column))) {
254
- head.push(columnsAsCards(filled.map((entry)=>entry.column)));
259
+ head.push(...columnsAsCards(filled.map((entry)=>entry.column)));
255
260
  page.settled.push({
256
261
  at,
257
262
  what: `${filled.length} like columns drawn as cards`
@@ -577,19 +582,37 @@ function compileSection(page, raw, index) {
577
582
  /** The block kinds a column holds, as a column's shape is compared. */ function shapeOf(column) {
578
583
  return column.map((block)=>block.kind).join(',');
579
584
  }
580
- function sameShape(columns) {
585
+ /** What a like column may hold and still be read as a card: its words, a picture and one button. */ const CARD_COLUMN_KINDS = new Set([
586
+ 'heading',
587
+ 'text',
588
+ 'lede',
589
+ 'eyebrow',
590
+ 'image',
591
+ 'note',
592
+ 'button'
593
+ ]);
594
+ /** The words of a column a card says: its heading, or its first words. */ const WORDS_KINDS = new Set([
595
+ 'heading',
596
+ 'text',
597
+ 'lede',
598
+ 'note'
599
+ ]);
600
+ /**
601
+ * Whether a row's columns all say the same kind of thing (AGL-3660): the
602
+ * same blocks in the same order, words among them, one button at most. The
603
+ * beta.270 Sugar Hollow Galleries page (AGL-3988) was refused for rule 1,
604
+ * "The same Grid block appears 4 times": four like columns this read did not
605
+ * fold, each of them drawn as a Grid cell of its own.
606
+ */ function sameShape(columns) {
581
607
  const first = shapeOf(columns[0]);
582
- return columns.every((column)=>shapeOf(column) === first) && columns[0].some((block)=>block.kind === 'heading') && columns[0].every((block)=>[
583
- 'heading',
584
- 'text',
585
- 'lede',
586
- 'eyebrow',
587
- 'image',
588
- 'note'
589
- ].includes(block.kind));
608
+ return columns.every((column)=>shapeOf(column) === first) && columns[0].some((block)=>WORDS_KINDS.has(block.kind)) && columns[0].every((block)=>CARD_COLUMN_KINDS.has(block.kind)) && columns[0].filter((block)=>block.kind === 'button').length <= 1;
590
609
  }
591
- /** Like columns as one group of cards: each column's heading its title, its words its text. */ function columnsAsCards(columns) {
592
- return {
610
+ /**
611
+ * Like columns as one group of cards: each column's heading its title, its
612
+ * words its text. Their buttons follow the group (AGL-3988): one, where they
613
+ * all go to the same place, else a list of links, each named by its card.
614
+ */ function columnsAsCards(columns) {
615
+ const cards = {
593
616
  kind: 'cards',
594
617
  items: columns.map((column)=>{
595
618
  var _ref;
@@ -608,6 +631,52 @@ function sameShape(columns) {
608
631
  } : {});
609
632
  })
610
633
  };
634
+ const buttons = columns.flatMap((column)=>{
635
+ var _button_to;
636
+ const button = column.find((block)=>block.kind === 'button');
637
+ return (button == null ? void 0 : (_button_to = button.to) == null ? void 0 : _button_to.trim()) ? [
638
+ {
639
+ button,
640
+ column
641
+ }
642
+ ] : [];
643
+ });
644
+ if (!buttons.length) return [
645
+ cards
646
+ ];
647
+ const places = new Set(buttons.map(({ button })=>{
648
+ var _button_to;
649
+ return ((_button_to = button.to) != null ? _button_to : '').trim().toLowerCase();
650
+ }));
651
+ if (places.size === 1) {
652
+ var _button_text;
653
+ const { button } = buttons[0];
654
+ return [
655
+ cards,
656
+ _extends({
657
+ kind: 'button',
658
+ text: (_button_text = button.text) != null ? _button_text : '',
659
+ to: button.to
660
+ }, button.style ? {
661
+ style: button.style
662
+ } : {})
663
+ ];
664
+ }
665
+ return [
666
+ cards,
667
+ {
668
+ kind: 'list',
669
+ items: buttons.map(({ button, column })=>{
670
+ var _button_to;
671
+ var _column_find;
672
+ return {
673
+ title: ((_column_find = column.find((block)=>block.kind === 'heading')) == null ? void 0 : _column_find.text) || button.text || '',
674
+ text: '',
675
+ to: (_button_to = button.to) != null ? _button_to : ''
676
+ };
677
+ })
678
+ }
679
+ ];
611
680
  }
612
681
  // ── A row of columns ──────────────────────────────────────────────────────
613
682
  // Spans out of twelve live with the tree, so a frame's repair reads them without the compiler (AGL-3735).
@@ -776,7 +845,8 @@ function words(scope, block, place, variant, props, sx) {
776
845
  }
777
846
  function compileButton(scope, block) {
778
847
  var _block_style;
779
- const asked = aiLayoutFitText(block.text, 'label', scope.page.options.language);
848
+ // Words that carry the phone or the email are kept whole (AGL-3979).
849
+ const asked = aiLayoutContactLabel(block.text, scope.page.targets.contact) || aiLayoutFitText(block.text, 'label', scope.page.options.language);
780
850
  if (!asked) return null;
781
851
  const destination = aiLayoutResolveLink(block.to, asked, scope.link, scope.page.targets);
782
852
  if (!destination) {
@@ -844,6 +914,10 @@ export function destinationProps(destination) {
844
914
  if (destination.kind === 'path') return {
845
915
  href: destination.href
846
916
  };
917
+ // A call or an email opens the phone or the mail app, never a new tab (AGL-3979).
918
+ if (destination.kind === 'contact') return {
919
+ href: destination.href
920
+ };
847
921
  return {};
848
922
  }
849
923
  /**
@@ -1284,7 +1358,7 @@ function instances(scope, placed, items, perRow) {
1284
1358
  if (((_block_items = block.items) != null ? _block_items : []).some((item)=>item.to)) {
1285
1359
  var _block_items2;
1286
1360
  const links = ((_block_items2 = block.items) != null ? _block_items2 : []).flatMap((item)=>{
1287
- const label = aiLayoutFitText(item.title || item.text, 'label', scope.page.options.language);
1361
+ const label = aiLayoutContactLabel(item.title || item.text, scope.page.targets.contact) || aiLayoutFitText(item.title || item.text, 'label', scope.page.options.language);
1288
1362
  const destination = label ? aiLayoutResolveLink(item.to, label, scope.link, scope.page.targets) : null;
1289
1363
  if (!destination) return [];
1290
1364
  const id = tree.add('muiScreenLink', _extends({
@@ -1502,12 +1576,12 @@ function instances(scope, placed, items, perRow) {
1502
1576
  const _flow_lead = flow[lead], { style: _style } = _flow_lead, title = _object_without_properties_loose(_flow_lead, [
1503
1577
  "style"
1504
1578
  ]);
1505
- flow[lead] = design.choices.hero === 'split' ? title : _extends({}, title, {
1579
+ flow[lead] = AI_LAYOUT_HALF_HEROES.has(design.choices.hero) ? title : _extends({}, title, {
1506
1580
  style: 'large'
1507
1581
  });
1508
1582
  sellingHero(scope, flow);
1509
1583
  const given = images[0] ? aiLayoutFitText(images[0].text, 'alt', scope.page.options.language) : '';
1510
- return hero(scope, raw, flow, given ? {
1584
+ return hero(scope, flow, given ? {
1511
1585
  alt: given,
1512
1586
  given: true
1513
1587
  } : {
@@ -1536,32 +1610,51 @@ function instances(scope, placed, items, perRow) {
1536
1610
  const group = words[at];
1537
1611
  const tail = words.slice(at + 1);
1538
1612
  const variant = aiLayoutGroupVariant(design.input, design.choices, (_scope_words = scope.words) != null ? _scope_words : '');
1539
- if (!head.every((block)=>WORD_KINDS.has(block.kind) && block.kind !== 'button') || !head.some((block)=>speaksHeading(scope, block)) || !tail.every((block)=>WORD_KINDS.has(block.kind)) || ((_ref = (_group_items = group.items) == null ? void 0 : _group_items.length) != null ? _ref : 0) < 2 || ((_ref1 = (_group_items1 = group.items) == null ? void 0 : _group_items1.length) != null ? _ref1 : 0) > 6 || group.to || group.kind === 'cards' && variant !== 'cards' && variant !== 'ruled') {
1613
+ if (!head.every((block)=>WORD_KINDS.has(block.kind) && block.kind !== 'button') || !head.some((block)=>speaksHeading(scope, block)) || !tail.every((block)=>WORD_KINDS.has(block.kind)) || ((_ref = (_group_items = group.items) == null ? void 0 : _group_items.length) != null ? _ref : 0) < 2 || ((_ref1 = (_group_items1 = group.items) == null ? void 0 : _group_items1.length) != null ? _ref1 : 0) > 6 || group.to || group.kind === 'cards' && variant !== 'cards' && variant !== 'ruled' || // A store's making is shown as pictures across the page (AGL-3676), never
1614
+ // ruled words in half of it: set beside its heading, a seed that splits
1615
+ // headings left a storefront's "how it is made" a band of text (AGL-3985).
1616
+ group.kind === 'steps' && aiLayoutFamily(design.input.kind) === 'retail') {
1540
1617
  return null;
1541
1618
  }
1542
1619
  return splitSection(scope, head, group, tail);
1543
1620
  }
1544
- /** The first section, in the site's hero arrangement. */ function hero(scope, raw, flow, picture) {
1621
+ /** The first section, in the site's hero arrangement. */ function hero(scope, flow, picture) {
1545
1622
  const { page } = scope;
1546
1623
  const tree = page.tree;
1547
1624
  const design = page.design;
1548
1625
  const home = design.input.home;
1549
- const variant = design.choices.hero;
1626
+ // A collage holds two pictures: on a page with room for one, it is drawn split.
1627
+ const chosen = design.choices.hero;
1628
+ const variant = chosen === 'collage' && picturesLeft(page) < 2 ? 'split' : chosen;
1550
1629
  page.settled.push({
1551
1630
  at: scope.at,
1552
1631
  what: `drawn as a ${variant} hero`
1553
1632
  });
1554
- if (variant === 'cover') {
1633
+ if (variant === 'cover' || variant === 'poster') {
1555
1634
  scope.band = 'dark';
1556
- scope.centered = raw.align === 'center';
1557
- return cover(scope, flow, picture, home ? {
1635
+ // A cover sets its words at the start of the page; a poster centers them,
1636
+ // taller, as a restaurant's or a band's opening does (AGL-3985).
1637
+ scope.centered = variant === 'poster';
1638
+ const tall = variant === 'poster';
1639
+ return cover(scope, flow, picture, home ? tall ? {
1640
+ xs: '84vh',
1641
+ md: '94vh'
1642
+ } : {
1558
1643
  xs: '78vh',
1559
1644
  md: '86vh'
1645
+ } : tall ? {
1646
+ xs: '52vh',
1647
+ md: '62vh'
1560
1648
  } : {
1561
1649
  xs: '46vh',
1562
1650
  md: '54vh'
1563
1651
  });
1564
1652
  }
1653
+ if (variant === 'bleed') return bleedHero(scope, flow, picture, home);
1654
+ if (variant === 'column') return columnHero(scope, flow, picture, home);
1655
+ if (variant === 'collage') return collageHero(scope, flow, picture, home);
1656
+ if (variant === 'panel') return panelHero(scope, flow, picture, home);
1657
+ if (variant === 'portrait') return portraitHero(scope, flow, picture);
1565
1658
  const band = scope.band;
1566
1659
  scope.centered = false;
1567
1660
  if (variant === 'split') {
@@ -1724,6 +1817,326 @@ function instances(scope, placed, items, perRow) {
1724
1817
  minHeight
1725
1818
  }, true);
1726
1819
  }
1820
+ /** The surface a band paints, as a palette role: what a picture laid over another is edged in. */ function bandSurface(band) {
1821
+ if (band === 'soft') return 'background.paper';
1822
+ if (band === 'brand') return 'primary.main';
1823
+ return 'background.default';
1824
+ }
1825
+ /**
1826
+ * A bleed hero (AGL-3985): the band in two halves, a photo filling one of
1827
+ * them edge to edge, top to bottom, and the words in the other, centered in
1828
+ * its height. On a phone the photo sits over the words.
1829
+ */ function bleedHero(scope, flow, picture, home) {
1830
+ const { page } = scope;
1831
+ const tree = page.tree;
1832
+ const design = page.design;
1833
+ const band = scope.band;
1834
+ scope.centered = false;
1835
+ const words = compileFlow(scope, flow, 'half');
1836
+ const measure = tree.add('muiBox', null, {
1837
+ maxWidth: {
1838
+ xs: '100%',
1839
+ md: '88%'
1840
+ },
1841
+ px: {
1842
+ xs: 3,
1843
+ sm: 6,
1844
+ md: 8
1845
+ },
1846
+ py: {
1847
+ xs: 6,
1848
+ md: 10
1849
+ }
1850
+ }, [
1851
+ words
1852
+ ], 'measure');
1853
+ const photo = designPicture(scope, picture, {
1854
+ height: '100%',
1855
+ minHeight: home ? {
1856
+ xs: '46vh',
1857
+ md: '84vh'
1858
+ } : {
1859
+ xs: '36vh',
1860
+ md: '56vh'
1861
+ }
1862
+ }, 'bleedPhoto');
1863
+ const right = design.choices.featureLeft;
1864
+ const row = tree.add('muiGrid', {
1865
+ container: true,
1866
+ spacing: '0'
1867
+ }, {
1868
+ alignItems: 'stretch'
1869
+ }, [
1870
+ tree.add('muiGrid', {
1871
+ size: 'xs:12 md:6'
1872
+ }, right ? {
1873
+ order: {
1874
+ xs: 0,
1875
+ md: 1
1876
+ }
1877
+ } : null, [
1878
+ photo
1879
+ ], 'column'),
1880
+ tree.add('muiGrid', {
1881
+ size: 'xs:12 md:6'
1882
+ }, {
1883
+ display: 'flex',
1884
+ alignItems: 'center',
1885
+ justifyContent: right ? 'flex-end' : 'flex-start'
1886
+ }, [
1887
+ measure
1888
+ ], 'column')
1889
+ ], 'row');
1890
+ return designedRoot(scope, [
1891
+ row
1892
+ ], bandSx(band), band === 'dark');
1893
+ }
1894
+ /**
1895
+ * A masthead (AGL-3985): the words centered in a narrow column, as a journal
1896
+ * or a quiet practice opens, and a wide photo under them.
1897
+ */ function columnHero(scope, flow, picture, home) {
1898
+ const tree = scope.page.tree;
1899
+ const band = scope.band;
1900
+ scope.centered = true;
1901
+ const words = compileFlow(scope, flow, 'full');
1902
+ const measure = tree.add('muiBox', null, {
1903
+ maxWidth: {
1904
+ xs: '100%',
1905
+ md: '72%'
1906
+ },
1907
+ mx: 'auto'
1908
+ }, [
1909
+ words
1910
+ ], 'measure');
1911
+ const photo = designPicture(scope, picture, {
1912
+ aspectRatio: home ? {
1913
+ xs: '4 / 3',
1914
+ md: '16 / 7'
1915
+ } : {
1916
+ xs: '16 / 9',
1917
+ md: '3 / 1'
1918
+ },
1919
+ borderRadius: 2
1920
+ });
1921
+ const stack = tree.add('muiStack', {
1922
+ spacing: '8',
1923
+ useFlexGap: true
1924
+ }, null, [
1925
+ measure,
1926
+ photo
1927
+ ], 'content');
1928
+ const container = tree.add('muiContainer', {
1929
+ maxWidth: 'lg'
1930
+ }, {
1931
+ pt: {
1932
+ xs: 8,
1933
+ md: 12
1934
+ },
1935
+ pb: {
1936
+ xs: 6,
1937
+ md: 10
1938
+ }
1939
+ }, [
1940
+ stack
1941
+ ], 'container');
1942
+ return designedRoot(scope, [
1943
+ container
1944
+ ], bandSx(band), band === 'dark');
1945
+ }
1946
+ /**
1947
+ * A collage hero (AGL-3985): the words beside two pictures, a tall one and a
1948
+ * smaller one laid over its lower corner, edged in the band's own surface, as
1949
+ * a shop shows two of its things or an event two moments of its day.
1950
+ */ function collageHero(scope, flow, picture, home) {
1951
+ var _page_plan_sections_scope_index;
1952
+ const { page } = scope;
1953
+ const tree = page.tree;
1954
+ const design = page.design;
1955
+ const band = scope.band;
1956
+ scope.centered = false;
1957
+ const words = compileFlow(scope, flow, 'half');
1958
+ const tall = designPicture(scope, picture, {
1959
+ width: {
1960
+ xs: '78%',
1961
+ md: '76%'
1962
+ },
1963
+ aspectRatio: home ? '4 / 5' : '1 / 1',
1964
+ borderRadius: 2
1965
+ });
1966
+ const small = designPicture(scope, {
1967
+ alt: standInAlt(scope, (_page_plan_sections_scope_index = page.plan.sections[scope.index]) == null ? void 0 : _page_plan_sections_scope_index.name),
1968
+ given: false
1969
+ }, {
1970
+ position: 'absolute',
1971
+ right: 0,
1972
+ bottom: 0,
1973
+ width: {
1974
+ xs: '48%',
1975
+ md: '50%'
1976
+ },
1977
+ aspectRatio: '1 / 1',
1978
+ borderRadius: 2,
1979
+ border: 6,
1980
+ borderColor: bandSurface(band)
1981
+ }, 'collagePhoto');
1982
+ const pictures = tree.add('muiBox', null, {
1983
+ position: 'relative',
1984
+ pb: {
1985
+ xs: 6,
1986
+ md: 10
1987
+ }
1988
+ }, [
1989
+ tall,
1990
+ small
1991
+ ], 'collage');
1992
+ const right = design.choices.featureLeft;
1993
+ const row = designRow(scope, [
1994
+ _extends({
1995
+ id: words,
1996
+ size: 'xs:12 md:5'
1997
+ }, right ? {
1998
+ sx: {
1999
+ order: {
2000
+ xs: 0,
2001
+ md: 1
2002
+ }
2003
+ }
2004
+ } : {}),
2005
+ {
2006
+ id: pictures,
2007
+ size: 'xs:12 md:7'
2008
+ }
2009
+ ], '8');
2010
+ const container = tree.add('muiContainer', {
2011
+ maxWidth: 'lg'
2012
+ }, {
2013
+ py: {
2014
+ xs: 6,
2015
+ md: 10
2016
+ }
2017
+ }, [
2018
+ row
2019
+ ], 'container');
2020
+ return designedRoot(scope, [
2021
+ container
2022
+ ], bandSx(band), band === 'dark');
2023
+ }
2024
+ /**
2025
+ * A panel hero (AGL-3985): a full-bleed photo shown as it is, undimmed, and
2026
+ * the words on a card of the page's own surface over its lower corner, as an
2027
+ * agent's listing or a firm's office opens. The card carries its own colors,
2028
+ * so the words read whatever the photo is.
2029
+ */ function panelHero(scope, flow, picture, home) {
2030
+ const tree = scope.page.tree;
2031
+ // The words sit on the card, never on the band the model chose.
2032
+ scope.band = 'plain';
2033
+ scope.centered = false;
2034
+ const photo = designPicture(scope, picture, {
2035
+ position: 'absolute',
2036
+ top: 0,
2037
+ left: 0,
2038
+ width: '100%',
2039
+ height: '100%'
2040
+ }, 'panelPhoto');
2041
+ const words = compileFlow(scope, flow, 'half');
2042
+ const card = tree.add('muiBox', null, {
2043
+ bgcolor: 'background.paper',
2044
+ color: 'text.primary',
2045
+ borderRadius: 2,
2046
+ boxShadow: 3,
2047
+ p: {
2048
+ xs: 4,
2049
+ md: 6
2050
+ },
2051
+ maxWidth: {
2052
+ xs: '100%',
2053
+ md: '52%'
2054
+ }
2055
+ }, [
2056
+ words
2057
+ ], 'panel');
2058
+ const container = tree.add('muiContainer', {
2059
+ maxWidth: 'lg'
2060
+ }, {
2061
+ position: 'relative',
2062
+ zIndex: 1,
2063
+ pt: {
2064
+ xs: 28,
2065
+ md: 36
2066
+ },
2067
+ pb: {
2068
+ xs: 4,
2069
+ md: 8
2070
+ }
2071
+ }, [
2072
+ card
2073
+ ], 'container');
2074
+ return designedRoot(scope, [
2075
+ photo,
2076
+ container
2077
+ ], {
2078
+ position: 'relative',
2079
+ overflow: 'hidden',
2080
+ display: 'flex',
2081
+ alignItems: 'flex-end',
2082
+ minHeight: home ? {
2083
+ xs: '72vh',
2084
+ md: '84vh'
2085
+ } : {
2086
+ xs: '48vh',
2087
+ md: '56vh'
2088
+ }
2089
+ }, false);
2090
+ }
2091
+ /**
2092
+ * A portrait hero (AGL-3985): a person's own page opens on their round
2093
+ * photo, the words centered under it.
2094
+ */ function portraitHero(scope, flow, picture) {
2095
+ const tree = scope.page.tree;
2096
+ const band = scope.band;
2097
+ scope.centered = true;
2098
+ const photo = designPicture(scope, picture, {
2099
+ width: {
2100
+ xs: '44%',
2101
+ sm: '30%',
2102
+ md: '22%'
2103
+ },
2104
+ aspectRatio: '1 / 1',
2105
+ borderRadius: '50%',
2106
+ flexShrink: 0
2107
+ });
2108
+ const words = compileFlow(scope, flow, 'full');
2109
+ const measure = tree.add('muiBox', null, {
2110
+ maxWidth: {
2111
+ xs: '100%',
2112
+ md: '72%'
2113
+ },
2114
+ mx: 'auto'
2115
+ }, [
2116
+ words
2117
+ ], 'measure');
2118
+ const stack = tree.add('muiStack', {
2119
+ spacing: '5',
2120
+ useFlexGap: true,
2121
+ alignItems: 'center'
2122
+ }, null, [
2123
+ photo,
2124
+ measure
2125
+ ], 'content');
2126
+ const container = tree.add('muiContainer', {
2127
+ maxWidth: 'lg'
2128
+ }, {
2129
+ py: {
2130
+ xs: 8,
2131
+ md: 12
2132
+ }
2133
+ }, [
2134
+ stack
2135
+ ], 'container');
2136
+ return designedRoot(scope, [
2137
+ container
2138
+ ], bandSx(band), band === 'dark');
2139
+ }
1727
2140
  /** A closing section of words over a photo. */ function coverBand(scope, words) {
1728
2141
  scope.band = 'dark';
1729
2142
  scope.centered = true;