@aglyn/plugins-ai 1.0.0-beta.244 → 1.0.0-beta.247

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 (173) hide show
  1. package/package.json +17 -17
  2. package/src/lib/activity/ai-activity-actions.js +7 -1
  3. package/src/lib/activity/ai-activity-actions.js.map +1 -1
  4. package/src/lib/components/ai-job-links.js +21 -0
  5. package/src/lib/components/ai-job-links.js.map +1 -1
  6. package/src/lib/components/ai-product-zones.d.ts +3 -1
  7. package/src/lib/components/ai-product-zones.js.map +1 -1
  8. package/src/lib/components/ai-products-hub-card.component.js +1 -1
  9. package/src/lib/components/ai-products-hub-card.component.js.map +1 -1
  10. package/src/lib/components/ai-products-proposals.component.js +17 -9
  11. package/src/lib/components/ai-products-proposals.component.js.map +1 -1
  12. package/src/lib/components/ai-site-start-card.component.d.ts +1 -1
  13. package/src/lib/components/ai-site-start-card.component.js +98 -23
  14. package/src/lib/components/ai-site-start-card.component.js.map +1 -1
  15. package/src/lib/components/ai-upsell-dialog.component.js +1 -1
  16. package/src/lib/components/ai-upsell-dialog.component.js.map +1 -1
  17. package/src/lib/declarations.server.js +12 -0
  18. package/src/lib/declarations.server.js.map +1 -1
  19. package/src/lib/jobs/ai-build-capabilities.js +216 -2
  20. package/src/lib/jobs/ai-build-capabilities.js.map +1 -1
  21. package/src/lib/jobs/ai-job-build-step.d.ts +3 -1
  22. package/src/lib/jobs/ai-job-build-step.js +124 -18
  23. package/src/lib/jobs/ai-job-build-step.js.map +1 -1
  24. package/src/lib/jobs/ai-job-duplicate-step.d.ts +123 -0
  25. package/src/lib/jobs/ai-job-duplicate-step.js +269 -0
  26. package/src/lib/jobs/ai-job-duplicate-step.js.map +1 -0
  27. package/src/lib/jobs/ai-job-form-dataset.d.ts +8 -5
  28. package/src/lib/jobs/ai-job-form-dataset.js +28 -10
  29. package/src/lib/jobs/ai-job-form-dataset.js.map +1 -1
  30. package/src/lib/jobs/ai-job-form-step.d.ts +20 -4
  31. package/src/lib/jobs/ai-job-form-step.js +98 -28
  32. package/src/lib/jobs/ai-job-form-step.js.map +1 -1
  33. package/src/lib/jobs/ai-job-layout-language.d.ts +6 -2
  34. package/src/lib/jobs/ai-job-layout-language.js +29 -5
  35. package/src/lib/jobs/ai-job-layout-language.js.map +1 -1
  36. package/src/lib/jobs/ai-job-layout-step.js +4 -1
  37. package/src/lib/jobs/ai-job-layout-step.js.map +1 -1
  38. package/src/lib/jobs/ai-job-media-step.d.ts +239 -0
  39. package/src/lib/jobs/ai-job-media-step.js +610 -0
  40. package/src/lib/jobs/ai-job-media-step.js.map +1 -0
  41. package/src/lib/jobs/ai-job-navigation-step.d.ts +157 -0
  42. package/src/lib/jobs/ai-job-navigation-step.js +439 -0
  43. package/src/lib/jobs/ai-job-navigation-step.js.map +1 -0
  44. package/src/lib/jobs/ai-job-page-language.d.ts +4 -1
  45. package/src/lib/jobs/ai-job-page-language.js +30 -5
  46. package/src/lib/jobs/ai-job-page-language.js.map +1 -1
  47. package/src/lib/jobs/ai-job-page-sections.js +5 -4
  48. package/src/lib/jobs/ai-job-page-sections.js.map +1 -1
  49. package/src/lib/jobs/ai-job-page-step.js +3 -2
  50. package/src/lib/jobs/ai-job-page-step.js.map +1 -1
  51. package/src/lib/jobs/ai-job-plan-step.d.ts +14 -3
  52. package/src/lib/jobs/ai-job-plan-step.js +87 -20
  53. package/src/lib/jobs/ai-job-plan-step.js.map +1 -1
  54. package/src/lib/jobs/ai-job-products-step.d.ts +2 -2
  55. package/src/lib/jobs/ai-job-products-step.js +2 -2
  56. package/src/lib/jobs/ai-job-products-step.js.map +1 -1
  57. package/src/lib/jobs/ai-job-settings-step.d.ts +268 -0
  58. package/src/lib/jobs/ai-job-settings-step.js +690 -0
  59. package/src/lib/jobs/ai-job-settings-step.js.map +1 -0
  60. package/src/lib/jobs/ai-job-site-content.d.ts +22 -8
  61. package/src/lib/jobs/ai-job-site-content.js +33 -15
  62. package/src/lib/jobs/ai-job-site-content.js.map +1 -1
  63. package/src/lib/jobs/ai-job-site-datasets.d.ts +3 -1
  64. package/src/lib/jobs/ai-job-site-datasets.js +13 -5
  65. package/src/lib/jobs/ai-job-site-datasets.js.map +1 -1
  66. package/src/lib/jobs/ai-job-site-events.d.ts +148 -0
  67. package/src/lib/jobs/ai-job-site-events.js +313 -0
  68. package/src/lib/jobs/ai-job-site-events.js.map +1 -0
  69. package/src/lib/jobs/ai-job-site-step.d.ts +12 -4
  70. package/src/lib/jobs/ai-job-site-step.js +132 -26
  71. package/src/lib/jobs/ai-job-site-step.js.map +1 -1
  72. package/src/lib/jobs/ai-job-tracking-step.d.ts +184 -0
  73. package/src/lib/jobs/ai-job-tracking-step.js +501 -0
  74. package/src/lib/jobs/ai-job-tracking-step.js.map +1 -0
  75. package/src/lib/jobs/ai-layout-stock-photos.d.ts +21 -0
  76. package/src/lib/jobs/ai-layout-stock-photos.js +41 -4
  77. package/src/lib/jobs/ai-layout-stock-photos.js.map +1 -1
  78. package/src/lib/jobs/ai-site-publish.d.ts +62 -4
  79. package/src/lib/jobs/ai-site-publish.js +202 -56
  80. package/src/lib/jobs/ai-site-publish.js.map +1 -1
  81. package/src/lib/jobs/ai-stock-photo-picker.d.ts +24 -0
  82. package/src/lib/jobs/ai-stock-photo-picker.js +108 -0
  83. package/src/lib/jobs/ai-stock-photo-picker.js.map +1 -0
  84. package/src/lib/jobs/fixtures/ai-jazz-events-build-plan-recording.d.ts +37 -0
  85. package/src/lib/jobs/fixtures/ai-jazz-events-build-plan-recording.js +47 -0
  86. package/src/lib/jobs/fixtures/ai-jazz-events-build-plan-recording.js.map +1 -0
  87. package/src/lib/jobs/fixtures/ai-stock-photo-agl3760-recordings.d.ts +21 -0
  88. package/src/lib/jobs/fixtures/ai-stock-photo-agl3760-recordings.js +128 -0
  89. package/src/lib/jobs/fixtures/ai-stock-photo-agl3760-recordings.js.map +1 -0
  90. package/src/lib/layout-language/ai-layout-compiler.d.ts +16 -7
  91. package/src/lib/layout-language/ai-layout-compiler.js +62 -42
  92. package/src/lib/layout-language/ai-layout-compiler.js.map +1 -1
  93. package/src/lib/layout-language/ai-layout-frame-hollows.d.ts +41 -0
  94. package/src/lib/layout-language/ai-layout-frame-hollows.js +330 -0
  95. package/src/lib/layout-language/ai-layout-frame-hollows.js.map +1 -0
  96. package/src/lib/layout-language/ai-layout-frame.d.ts +24 -5
  97. package/src/lib/layout-language/ai-layout-frame.js +93 -20
  98. package/src/lib/layout-language/ai-layout-frame.js.map +1 -1
  99. package/src/lib/layout-language/ai-layout-gaps.js +3 -1
  100. package/src/lib/layout-language/ai-layout-gaps.js.map +1 -1
  101. package/src/lib/layout-language/ai-layout-labels.d.ts +70 -0
  102. package/src/lib/layout-language/ai-layout-labels.js +162 -0
  103. package/src/lib/layout-language/ai-layout-labels.js.map +1 -0
  104. package/src/lib/layout-language/ai-layout-links.js +5 -2
  105. package/src/lib/layout-language/ai-layout-links.js.map +1 -1
  106. package/src/lib/layout-language/ai-layout-listings.d.ts +49 -1
  107. package/src/lib/layout-language/ai-layout-listings.js +66 -5
  108. package/src/lib/layout-language/ai-layout-listings.js.map +1 -1
  109. package/src/lib/layout-language/ai-layout-tree.d.ts +2 -0
  110. package/src/lib/layout-language/ai-layout-tree.js +17 -0
  111. package/src/lib/layout-language/ai-layout-tree.js.map +1 -1
  112. package/src/lib/model/ai-build-event-page.d.ts +70 -0
  113. package/src/lib/model/ai-build-event-page.js +145 -0
  114. package/src/lib/model/ai-build-event-page.js.map +1 -0
  115. package/src/lib/model/ai-build-job.d.ts +44 -0
  116. package/src/lib/model/ai-build-job.js +141 -13
  117. package/src/lib/model/ai-build-job.js.map +1 -1
  118. package/src/lib/model/ai-build-plan.d.ts +39 -3
  119. package/src/lib/model/ai-build-plan.js +59 -5
  120. package/src/lib/model/ai-build-plan.js.map +1 -1
  121. package/src/lib/model/ai-credit-estimate.d.ts +52 -0
  122. package/src/lib/model/ai-credit-estimate.js +51 -0
  123. package/src/lib/model/ai-credit-estimate.js.map +1 -1
  124. package/src/lib/model/ai-job-activity.js +6 -1
  125. package/src/lib/model/ai-job-activity.js.map +1 -1
  126. package/src/lib/model/ai-jobs.types.d.ts +18 -2
  127. package/src/lib/model/ai-jobs.types.js +6 -1
  128. package/src/lib/model/ai-jobs.types.js.map +1 -1
  129. package/src/lib/model/ai-layout-menus.d.ts +104 -0
  130. package/src/lib/model/ai-layout-menus.js +518 -0
  131. package/src/lib/model/ai-layout-menus.js.map +1 -0
  132. package/src/lib/model/ai-plan-capabilities.d.ts +8 -0
  133. package/src/lib/model/ai-plan-capabilities.js.map +1 -1
  134. package/src/lib/model/ai-products.d.ts +31 -1
  135. package/src/lib/model/ai-products.js +34 -1
  136. package/src/lib/model/ai-products.js.map +1 -1
  137. package/src/lib/model/ai-site-inventory.d.ts +17 -0
  138. package/src/lib/model/ai-site-inventory.js +5 -0
  139. package/src/lib/model/ai-site-inventory.js.map +1 -1
  140. package/src/lib/model/ai-site-job.d.ts +12 -2
  141. package/src/lib/model/ai-site-job.js +39 -12
  142. package/src/lib/model/ai-site-job.js.map +1 -1
  143. package/src/lib/model/ai-site-store-pages.js +1 -1
  144. package/src/lib/model/ai-site-store-pages.js.map +1 -1
  145. package/src/lib/runtime/ai-doctrine-validators.d.ts +78 -3
  146. package/src/lib/runtime/ai-doctrine-validators.js +219 -31
  147. package/src/lib/runtime/ai-doctrine-validators.js.map +1 -1
  148. package/src/lib/runtime/ai-doctrine.d.ts +6 -1
  149. package/src/lib/runtime/ai-doctrine.js +16 -7
  150. package/src/lib/runtime/ai-doctrine.js.map +1 -1
  151. package/src/lib/runtime/ai-eval-live.d.ts +1 -1
  152. package/src/lib/runtime/ai-eval-live.js +1 -1
  153. package/src/lib/runtime/ai-eval-live.js.map +1 -1
  154. package/src/lib/runtime/ai-palette.d.ts +3 -1
  155. package/src/lib/runtime/ai-palette.generated.js +499 -11
  156. package/src/lib/runtime/ai-palette.generated.js.map +1 -1
  157. package/src/lib/runtime/ai-palette.js +5 -3
  158. package/src/lib/runtime/ai-palette.js.map +1 -1
  159. package/src/lib/runtime/ai-products-generation.d.ts +4 -2
  160. package/src/lib/runtime/ai-products-generation.js +12 -6
  161. package/src/lib/runtime/ai-products-generation.js.map +1 -1
  162. package/src/lib/runtime/ai-template-examples.js +8 -2
  163. package/src/lib/runtime/ai-template-examples.js.map +1 -1
  164. package/src/lib/runtime/site-inventory.d.ts +12 -0
  165. package/src/lib/runtime/site-inventory.js +29 -1
  166. package/src/lib/runtime/site-inventory.js.map +1 -1
  167. package/src/lib/server.js +20 -0
  168. package/src/lib/server.js.map +1 -1
  169. package/src/lib/testing/stand-in-dataset-index.js +37 -3
  170. package/src/lib/testing/stand-in-dataset-index.js.map +1 -1
  171. package/src/lib/tools/ai-products-tool.d.ts +3 -1
  172. package/src/lib/tools/ai-products-tool.js +15 -5
  173. package/src/lib/tools/ai-products-tool.js.map +1 -1
@@ -0,0 +1,128 @@
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
+ */ /**
17
+ * PIXABAY'S RECORDED ANSWERS FOR TWO beta.246 HEROES (AGL-3760): what
18
+ * production's `stockPhotoSearches` cache held for the searches the starts
19
+ * sent, read back from the cache, never searched again. Ids, sizes, page
20
+ * slugs and tags are Pixabay's own, in its order; the contributor is left out.
21
+ *
22
+ * - Panadería Sol de Oaxaca (job ODSFzsGM91, 2026-10-13), a Spanish guided
23
+ * start: "Una panadería familiar de San Antonio con pan dulce, conchas y
24
+ * pasteles de tres leches al estilo de Oaxaca". Its business read as "con
25
+ * pan dulce", and all eight photos the site's library copied came from that
26
+ * one search: four of the Río Dulce in Guatemala at dusk (3619205–3619208),
27
+ * the home hero among them; a pan of vegetables, a ship off Côn Island, a
28
+ * rusted weight; and one cake (3147645, tagged "dulce").
29
+ * - Copper Fern Candle Co (job UoGN1DHzur, 2026-10-13): "An online shop for
30
+ * hand-poured soy candles, wax melts and candle gift sets". Its home hero
31
+ * ← 9380550, a latte with a candle blurred behind it, taken because its
32
+ * fifth tag and its page slug said "candle".
33
+ */ const hit = (id, width, height, slug, tags)=>({
34
+ provider: 'pixabay',
35
+ id: String(id),
36
+ width,
37
+ height,
38
+ pageUrl: `https://pixabay.com/photos/${slug}/`,
39
+ photographer: 'A Pixabay contributor',
40
+ tags: tags.split(', '),
41
+ downloadUrl: `https://pixabay.com/get/g${id}_1280.jpg`
42
+ });
43
+ /** `con pan dulce` (horizontal, min_width 1600): the Panadería hero, answered 2026-10-13T15:29:37.726Z. */ export const CON_PAN_DULCE_HERO = [
44
+ hit(2011373, 1280, 878, 'deadvlei-namibia-africa-desert-2011373', 'deadvlei, namibia, africa, desert, dryness, tree, dead vlei, sand, dried up, nature, burned, namib'),
45
+ hit(3238173, 1280, 930, 'fried-egg-pan-meal-grill-egg-yolk-3238173', 'fried egg, pan, meal, grill, egg yolk, food, fried eggs, frying pan, protein, cook, yolk, eggs, kitchen, egg, fried, yummy, tasty, eggs, eggs, eggs'),
46
+ hit(6472033, 1280, 853, 'choclo-maiz-choclo-con-queso-6472033', 'choclo, maiz, choclo con queso, choclo, choclo, choclo, choclo, choclo, maiz'),
47
+ hit(3147645, 1280, 719, 'dulce-sweet-fruit-cake-pastry-3147645', 'dulce, sweet, fruit, cake, pastry, sugar, italy'),
48
+ hit(4506703, 1280, 720, 'dumpling-gyoza-frying-pan-skillet-4506703', 'dumpling, gyoza, frying pan, skillet, pan, gyoza, gyoza, gyoza, gyoza, gyoza'),
49
+ hit(9565430, 1280, 853, 'acacia-nature-tree-africa-etosha-9565430', 'acacia, nature, tree, africa, etosha, salt pan, scenery, panorama'),
50
+ hit(1979272, 1280, 853, 'happy-valentines-day-woman-man-1979272', 'happy valentines day, woman, man, kitchen, food preparation, couple, relationship, together, cooking, pair, cutting, chopping, everyday life, blonde, cutting board, vegetables, happy couple, stove, cook, knife'),
51
+ hit(5921491, 1280, 854, 'meal-food-tofu-rice-dish-cooked-5921491', 'meal, food, tofu, rice, dish, cooked, fried, tasty, delicious, cuisine, pan, bowls, kaiseki, flat lay, meal, food, tofu, tofu, rice, rice'),
52
+ hit(3475625, 1280, 853, 'cireșe-cireșele-dulci-fructe-roșu-3475625', 'cireșe, cireșele dulci, fructe, roșu, dulce, delicios, creangă, frunze, cireșe, fructe, fructe, fructe, fructe, fructe, roșu, roșu, roșu, roșu, roșu, delicios'),
53
+ hit(64310, 1280, 850, 'tree-desert-namibia-clay-pan-64310', 'tree, desert, namibia, nature, clay pan, drought, africa, sand, sky, dunes, outdoors, discovery'),
54
+ hit(7887696, 1280, 853, 'weight-metal-old-rusted-pan-weigh-7887696', 'weight, metal, old, rusted, pan, weigh, weight, weight, weight, weight, weight'),
55
+ hit(8027678, 1280, 853, 'vegetable-pan-grilled-vegetables-8027678', 'vegetable pan, grilled vegetables, cooking, healthy, zucchini, broccoli, paprika, grilling, nourishment, cooking, cooking, cooking, healthy, healthy, healthy, healthy, healthy, zucchini'),
56
+ hit(729069, 1280, 853, 'con-racehorse-gallop-running-horse-729069', 'con, racehorse, gallop, running horse, sport, racehorse, racehorse, racehorse, racehorse, racehorse, running horse'),
57
+ hit(3060093, 1280, 854, 'salt-harvesting-vietnam-water-salt-3060093', 'salt harvesting, vietnam, water, salt, work, people, nature, reflection, hon khoi, salt field, salina, tropical, agriculture, asia, harvest, asian, hats, traditional'),
58
+ hit(9384171, 1280, 853, 'food-japanese-meal-class-b-gourmet-9384171', 'food, japanese meal, class b gourmet, takoyaki, cooking, shop'),
59
+ hit(8295778, 1280, 853, 'sweet-potatoes-potatoes-cook-meal-8295778', 'sweet potatoes, potatoes, cook, meal, food, grill, pan, food, food, food, food, food'),
60
+ hit(3619206, 1280, 847, 'central-america-guatemala-rio-dulce-3619206', 'central america, guatemala, rio dulce, water, heaven, nature, clouds, landscape'),
61
+ hit(1835369, 1280, 726, 'cooking-wok-chinese-asian-food-1835369', 'cooking, wok, chinese, asian, food, frying pan, meal, pan, vegetables, stir fry, frying, cook, cooking food, cooking vegetables, cooking, cooking, cooking, cooking, cooking, wok'),
62
+ hit(6286592, 1280, 853, 'meatballs-cook-frying-pan-6286592', 'meatballs, cook, frying pan, minced meat, meat, food, meal, delicious, fry, sear, pan, closeup, meatballs, meatballs, meatballs, meatballs, meatballs'),
63
+ hit(4926211, 1280, 853, 'girl-the-sea-con-beach-summer-4926211', 'girl, the sea, con, beach, summer, nature, rider, sport, race, animals'),
64
+ hit(3619207, 1280, 848, 'central-america-guatemala-rio-dulce-3619207', 'central america, guatemala, rio dulce, water, nature, heaven, clouds, landscape'),
65
+ hit(4813261, 1280, 853, 'meat-duck-duck-breast-raw-fry-4813261', 'meat, duck, duck breast, raw, fry, court, tasty, fried, sear, recipe, roast duck, food, poultry, food photo, kitchen, cook, meat, meat, meat, duck'),
66
+ hit(4644941, 1280, 853, 'fat-frying-pan-4644941', 'fat, frying, pan'),
67
+ hit(4937535, 1280, 960, 'stroller-beach-the-sea-ocean-sand-4937535', 'stroller, beach, the sea, nature, ocean, sand, con, rider, woman, umbrella, blue, red'),
68
+ hit(1838785, 1280, 1280, 'avocado-chopping-board-ingredients-1838785', 'avocado, chopping board, ingredients, produce, groceries, fresh produce, food preparation, vegetables, cut, chop, kitchen, cooking, eggs, food, frying pan, healthy, knife, mushrooms, kitchen, cooking'),
69
+ hit(4937541, 1280, 853, 'rider-con-arena-saddle-helmet-4937541', 'rider, con, arena, saddle, helmet, costume, wall, sand'),
70
+ hit(6380762, 1280, 853, 'panpipe-musician-guatemalan-6380762', 'panpipe, musician, guatemalan, traditional costume, culture, man, pan flute, instrument, music, musical instrument, portrait, musician, musician, culture, pan flute, music, music, music, music, music'),
71
+ hit(3246189, 1280, 853, 'food-pan-cooking-frying-pan-meal-3246189', 'food, pan, cooking, frying pan, meal, camping, breakfast, fire pit, morning, cook, outdoors, pit, fire, campfire, grill, scrambled, smoke, spatula, outside, skillet'),
72
+ hit(2119027, 1280, 853, 'country-life-pan-kitchen-2119027', 'country life, pan, kitchen, preparation, frying pan, farmer, kitchen appliances, farm yard, country life, country life, pan, kitchen, kitchen, kitchen, kitchen, farmer, kitchen appliances, kitchen appliances, kitchen appliances, kitchen appliances'),
73
+ hit(1927783, 1280, 853, 'pan-cook-fire-boiling-water-food-1927783', 'pan, cook, fire, boiling water, food, picture, free image, cook, boiling water, boiling water, boiling water, boiling water, boiling water'),
74
+ hit(2106825, 1280, 853, 'carrots-yellow-beets-vegetables-2106825', 'carrots, yellow beets, vegetables, carrot, food, vitamins, meal, fresh, bio, cook, yummy, vegetarian, vegetable plants, market fresh vegetables, orange, healthy, nourishment, vegan, ingredients, vegetable pan'),
75
+ hit(3619208, 1280, 847, 'central-america-guatemale-rio-dulce-3619208', 'central america, guatemale, rio dulce, water, heaven, clouds, nature, landscape'),
76
+ hit(5095290, 1280, 853, 'bug-deep-con-infections-spike-5095290', 'bug, deep, con, nature, infections, spike, tree, black'),
77
+ hit(3125689, 1280, 853, 'cook-figure-fried-egg-food-3125689', 'cook, figure, fried egg, food, frying pan, fried eggs, pan, yummy, eggs, grill, egg yolk, yolk, kitchen, fun'),
78
+ hit(3619205, 1280, 847, 'central-america-guatemala-rio-dulce-3619205', 'central america, guatemala, rio dulce, nature, water, heaven, clouds, landscape'),
79
+ hit(3941617, 1280, 853, 'meal-pan-chicken-tomato-3941617', 'meal, pan, chicken, tomato'),
80
+ hit(5650205, 1280, 853, 'cosplay-clown-costume-scary-creepy-5650205', 'cosplay, clown, costume, scary, creepy, evil clown, cosplayer, character, portrait, comic con, clown, clown, clown, clown, clown, evil clown, evil clown, evil clown, evil clown'),
81
+ hit(1583152, 1280, 905, 'pan-vegetables-cook-1583152', 'pan, vegetables, cook, pan, pan, pan, pan, pan, cook'),
82
+ hit(7478482, 1280, 853, 'sea-ship-con-island-ocean-vietnam-7478482', 'sea, ship, con island, ocean, vietnam, nature, fishing boat, blue, minimalism, tran thang nhat, 5 plus english'),
83
+ hit(5427775, 1280, 853, 'sea-vung-tau-beach-sky-dawn-5427775', 'sea, vung tau beach, sky, nature, dawn, con heo hill')
84
+ ];
85
+ /** `candle shop` (vertical, min_width 1600): the Copper Fern hero, answered 2026-10-13T15:42:26.770Z. */ export const CANDLE_SHOP_TALL_HERO = [
86
+ hit(2692556, 937, 1280, 'tea-light-light-worships-2692556', 'tea light, light, worships, candlelight, flame, meditation, prayer, candle, contemplative, memorial candle, ecclesiastical, shining, memorial lights, sacrificial candle, sacrificial light, reflection, warmth, burn, grief, seem'),
87
+ hit(4597415, 853, 1280, 'camera-book-candle-read-cozy-bed-4597415', 'camera, book, candle, read, cozy, bed, lamp, bokeh, light, home, comfort, reading, cold, camera, book, book, book, candle, candle, candle'),
88
+ hit(5850280, 853, 1280, 'candle-christmas-candle-advent-5850280', 'candle, christmas candle, advent, advent candle, candlelight, flame, christmas decoration, christmas decor, decoration, decor, closeup, candle, candle, candle, candle, candle, christmas candle, christmas candle, christmas candle, advent'),
89
+ hit(9874140, 853, 1280, 'candles-candlelight-tea-lights-9874140', 'candles, candlelight, tea lights, church, prayer, faith, religion, light, burn, all saints, advent'),
90
+ hit(6942931, 853, 1280, 'candle-book-read-study-fiction-6942931', 'candle, book, read, study, fiction, story, pages, candle, candle, candle, candle, book, study, study, study, study, study, story'),
91
+ hit(4870097, 853, 1280, 'white-candle-candlelight-dark-4870097', 'white candle, candlelight, dark, blue flame, black candle, black candles'),
92
+ hit(5181374, 857, 1280, 'candle-candlelight-flame-5181374', 'candle, candlelight, flame, candle flame, fire, black background, wick, burning candle, black candle, black candles, iphone wallpaper'),
93
+ hit(1584711, 848, 1280, 'massage-therapy-candles-relaxation-1584711', 'massage therapy, candles, relaxation, treatment, luxury, spa, massage, towels, tea candles, candlelight, spa treatment, spa, spa, spa, spa, spa, massage'),
94
+ hit(4222263, 868, 1280, 'table-candle-decoration-interior-4222263', 'table, candle, decoration, interior, romantic, celebration, candlestick, candlelight, living room, table, table, table, candle, candle, candle, candle, candle, living room, living room, living room'),
95
+ hit(6668364, 853, 1280, 'lemon-candle-scented-candle-6668364', 'lemon candle, scented candle, blackberry candle, scented candle, scented candle, scented candle, scented candle, scented candle'),
96
+ hit(4829516, 960, 1280, 'candlestick-classic-antique-candle-4829516', 'candlestick, classic, antique, candle, decorative, brown candle, brown candles, candlestick, candlestick, candlestick, candlestick, candlestick'),
97
+ hit(2738532, 853, 1280, 'candle-tea-light-hand-church-light-2738532', 'candle, tea light, hand, church, light, worships, candlelight, faith, religion, christianity, flame, commemorate, meditation, prayer, contemplative, memorial candle, ecclesiastical, mood, shining, the atmosphere'),
98
+ hit(8104677, 850, 1280, 'woman-manequin-shop-hat-hat-shop-8104677', 'woman, manequin, shop, hat, hat shop, store window, monochromatic'),
99
+ hit(6145811, 850, 1280, 'bags-shop-gift-shop-establishment-6145811', 'bags, shop, gift shop, establishment, tourist shop, france, monaco, destination, vacation, travel'),
100
+ hit(397965, 809, 1280, 'candle-candle-wax-candlelight-397965', 'candle, candle wax, candlelight, candlestick, flame, wax, illuminated, fire, burning, romantic, candle, candle, candle, candle, candle, candle wax, candlestick, wax'),
101
+ hit(7581472, 853, 1280, 'candle-pine-christmas-tree-holidays-7581472', 'candle, pine, christmas tree, holidays, decoration, the background, pictures, image, burn, fire, heat, light, symbol, cozy, wax, night, black, hot, religion, meditation'),
102
+ hit(7131604, 853, 1280, 'vintage-aesthetic-vintage-fashion-7131604', 'vintage aesthetic, vintage fashion, restaurant, interior, vintage interior, restaurant, restaurant, restaurant, restaurant, restaurant, interior'),
103
+ hit(999370, 853, 1280, 'marrakesh-morocco-market-travel-999370', 'marrakesh, morocco, market, travel, colorful plates, morocco, morocco, morocco, morocco, morocco'),
104
+ hit(5960786, 960, 1280, 'candle-holly-decorative-5960786', 'candle, holly, decorative, beeswax candle, wax candle, scented candle, scented candle, scented candle, scented candle, scented candle, scented candle'),
105
+ hit(4126234, 853, 1280, 'girl-portrait-candle-smoke-4126234', 'girl, portrait, candle, smoke, brown smoke, brown candle, brown candles'),
106
+ hit(4832387, 915, 1280, 'candlelight-candle-flame-dark-4832387', 'candlelight, candle, flame, dark, black candle, black candles'),
107
+ hit(4725958, 1024, 1280, 'string-light-street-lights-violin-4725958', 'string, light, street, lights, violin, candle, christmas, woman, strings, brown candle, brown candles'),
108
+ hit(6805045, 853, 1280, 'christmas-christmas-decoration-6805045', 'christmas, christmas decoration, christmas background, holiday, happychristmas, iphone wallpaper, christmas, christmas, christmas, christmas, christmas, christmas background, christmas background, christmas background, christmas background, christmas background'),
109
+ hit(4368774, 853, 1280, 'street-building-historic-travel-4368774', 'street, building, historic, travel, trogir, architecture, mediterranean, croatia, old, culture, street, street, street, mediterranean, croatia, croatia, croatia, croatia, croatia'),
110
+ hit(4068284, 862, 1280, 'girl-istanbul-shop-shopping-4068284', 'girl, istanbul, shop, shopping, turkish, turkish, turkish, turkish, turkish, turkish'),
111
+ hit(9380550, 854, 1280, 'coffee-latte-art-candle-cozy-drink-9380550', 'coffee, mobile wallpaper 4k, latte art, samsung wallpaper, candle, cozy, drink, relaxation, ipad wallpaper, iphone wallpaper, aroma, beautiful wallpaper, coffee time, lock screen wallpaper, 4k, mobile wallpaper, wallpaper, phone wallpaper, background'),
112
+ hit(4670035, 853, 1280, 'lantern-street-hoi-an-night-4670035', 'lantern, street, hoi an, night, old quarter, lantern, lantern, lantern, lantern, lantern, street, street, street, street, street, hoi an, hoi an, night, night, night'),
113
+ hit(3358546, 960, 1280, 'burnt-flame-candle-dark-wax-burn-3358546', 'burnt, flame, candle, dark, wax, burn, heat, black candle, black candles'),
114
+ hit(3992893, 894, 1280, 'flowers-table-setting-theme-wedding-3992893', 'flowers, table setting, theme, flower background, flower wallpaper, nature, wedding, beautiful flowers, bouquets, romantic, party, love'),
115
+ hit(4523695, 960, 1280, 'candle-light-burnt-black-wight-4523695', 'candle, light, burnt, black, wight, black candle, black candles'),
116
+ hit(5409069, 854, 1280, 'ice-cream-candy-food-dessert-sweet-5409069', 'ice cream, candy, food, dessert, sweet, ice cream, ice cream, ice cream, ice cream, ice cream, candy'),
117
+ hit(8167776, 1024, 1280, 'shopping-shop-store-market-8167776', 'shopping, shop, store, market, supermarket, bakery, window'),
118
+ hit(4562179, 853, 1280, 'candle-candlelight-shiny-mourning-4562179', 'candle, candlelight, shiny, mourning, romantic, mood, decoration, deco, flame, bright, brown candle, brown candles, candle, candle, candle, candle, candle, candlelight'),
119
+ hit(2996627, 960, 1280, 'advent-christmas-time-advent-season-2996627', 'advent, christmas time, advent season, advent wreath, 3advent, advent greeting, greeting card, candles, candlelight, contemplative, decoration, flower arrangement, christmas jewelry, christmas, third candle, advent candle, advent, advent, advent, advent'),
120
+ hit(6783665, 853, 1280, 'mulled-wine-christmas-drink-6783665', 'mulled wine, christmas drink, christmas decor, alcoholic beverage, mulled wine, mulled wine, mulled wine, mulled wine, mulled wine, christmas drink'),
121
+ hit(5196603, 960, 1280, 'candle-shadow-light-mood-fire-5196603', 'candle, shadow, light, mood, fire, reflection, remember, brown candle, brown candles'),
122
+ hit(4449673, 853, 1280, 'bokeh-night-dark-lights-candle-4449673', 'bokeh, night, dark, lights, candle, darkness, mood, black candle, black candles, black bokeh, bokeh, bokeh, bokeh, bokeh, bokeh'),
123
+ hit(4220874, 853, 1280, 'candles-table-mood-candle-light-4220874', 'candles, table, mood, candle, light, candlelight, the atmosphere, lights, warm, candles, candles, candles, candles, candles, table, table, table, candle, light, candlelight'),
124
+ hit(4518366, 960, 1280, 'taiwan-candle-temple-4518366', 'taiwan, candle, temple'),
125
+ hit(4713126, 1024, 1280, 'berlin-germany-city-shopping-4713126', 'berlin, germany, city, shopping, blackandwhite, facade, black city, black shopping, gray shopping, black shop, gray shop')
126
+ ];
127
+
128
+ //# sourceMappingURL=ai-stock-photo-agl3760-recordings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../libs/plugins/ai/src/lib/jobs/fixtures/ai-stock-photo-agl3760-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 TWO beta.246 HEROES (AGL-3760): what\n * production's `stockPhotoSearches` cache held for the searches the starts\n * sent, read back from the cache, never searched again. Ids, sizes, page\n * slugs and tags are Pixabay's own, in its order; the contributor is left out.\n *\n * - Panadería Sol de Oaxaca (job ODSFzsGM91, 2026-10-13), a Spanish guided\n * start: \"Una panadería familiar de San Antonio con pan dulce, conchas y\n * pasteles de tres leches al estilo de Oaxaca\". Its business read as \"con\n * pan dulce\", and all eight photos the site's library copied came from that\n * one search: four of the Río Dulce in Guatemala at dusk (3619205–3619208),\n * the home hero among them; a pan of vegetables, a ship off Côn Island, a\n * rusted weight; and one cake (3147645, tagged \"dulce\").\n * - Copper Fern Candle Co (job UoGN1DHzur, 2026-10-13): \"An online shop for\n * hand-poured soy candles, wax melts and candle gift sets\". Its home hero\n * ← 9380550, a latte with a candle blurred behind it, taken because its\n * fifth tag and its page slug said \"candle\".\n */\n\nconst hit = (\n id: number,\n width: number,\n height: number,\n slug: string,\n tags: string,\n): 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.split(', '),\n downloadUrl: `https://pixabay.com/get/g${id}_1280.jpg`,\n }) as StockPhoto\n\n/** `con pan dulce` (horizontal, min_width 1600): the Panadería hero, answered 2026-10-13T15:29:37.726Z. */\nexport const CON_PAN_DULCE_HERO: StockPhoto[] = [\n hit(\n 2011373,\n 1280,\n 878,\n 'deadvlei-namibia-africa-desert-2011373',\n 'deadvlei, namibia, africa, desert, dryness, tree, dead vlei, sand, dried up, nature, burned, namib',\n ),\n hit(\n 3238173,\n 1280,\n 930,\n 'fried-egg-pan-meal-grill-egg-yolk-3238173',\n 'fried egg, pan, meal, grill, egg yolk, food, fried eggs, frying pan, protein, cook, yolk, eggs, kitchen, egg, fried, yummy, tasty, eggs, eggs, eggs',\n ),\n hit(\n 6472033,\n 1280,\n 853,\n 'choclo-maiz-choclo-con-queso-6472033',\n 'choclo, maiz, choclo con queso, choclo, choclo, choclo, choclo, choclo, maiz',\n ),\n hit(\n 3147645,\n 1280,\n 719,\n 'dulce-sweet-fruit-cake-pastry-3147645',\n 'dulce, sweet, fruit, cake, pastry, sugar, italy',\n ),\n hit(\n 4506703,\n 1280,\n 720,\n 'dumpling-gyoza-frying-pan-skillet-4506703',\n 'dumpling, gyoza, frying pan, skillet, pan, gyoza, gyoza, gyoza, gyoza, gyoza',\n ),\n hit(\n 9565430,\n 1280,\n 853,\n 'acacia-nature-tree-africa-etosha-9565430',\n 'acacia, nature, tree, africa, etosha, salt pan, scenery, panorama',\n ),\n hit(\n 1979272,\n 1280,\n 853,\n 'happy-valentines-day-woman-man-1979272',\n 'happy valentines day, woman, man, kitchen, food preparation, couple, relationship, together, cooking, pair, cutting, chopping, everyday life, blonde, cutting board, vegetables, happy couple, stove, cook, knife',\n ),\n hit(\n 5921491,\n 1280,\n 854,\n 'meal-food-tofu-rice-dish-cooked-5921491',\n 'meal, food, tofu, rice, dish, cooked, fried, tasty, delicious, cuisine, pan, bowls, kaiseki, flat lay, meal, food, tofu, tofu, rice, rice',\n ),\n hit(\n 3475625,\n 1280,\n 853,\n 'cireșe-cireșele-dulci-fructe-roșu-3475625',\n 'cireșe, cireșele dulci, fructe, roșu, dulce, delicios, creangă, frunze, cireșe, fructe, fructe, fructe, fructe, fructe, roșu, roșu, roșu, roșu, roșu, delicios',\n ),\n hit(\n 64310,\n 1280,\n 850,\n 'tree-desert-namibia-clay-pan-64310',\n 'tree, desert, namibia, nature, clay pan, drought, africa, sand, sky, dunes, outdoors, discovery',\n ),\n hit(\n 7887696,\n 1280,\n 853,\n 'weight-metal-old-rusted-pan-weigh-7887696',\n 'weight, metal, old, rusted, pan, weigh, weight, weight, weight, weight, weight',\n ),\n hit(\n 8027678,\n 1280,\n 853,\n 'vegetable-pan-grilled-vegetables-8027678',\n 'vegetable pan, grilled vegetables, cooking, healthy, zucchini, broccoli, paprika, grilling, nourishment, cooking, cooking, cooking, healthy, healthy, healthy, healthy, healthy, zucchini',\n ),\n hit(\n 729069,\n 1280,\n 853,\n 'con-racehorse-gallop-running-horse-729069',\n 'con, racehorse, gallop, running horse, sport, racehorse, racehorse, racehorse, racehorse, racehorse, running horse',\n ),\n hit(\n 3060093,\n 1280,\n 854,\n 'salt-harvesting-vietnam-water-salt-3060093',\n 'salt harvesting, vietnam, water, salt, work, people, nature, reflection, hon khoi, salt field, salina, tropical, agriculture, asia, harvest, asian, hats, traditional',\n ),\n hit(\n 9384171,\n 1280,\n 853,\n 'food-japanese-meal-class-b-gourmet-9384171',\n 'food, japanese meal, class b gourmet, takoyaki, cooking, shop',\n ),\n hit(\n 8295778,\n 1280,\n 853,\n 'sweet-potatoes-potatoes-cook-meal-8295778',\n 'sweet potatoes, potatoes, cook, meal, food, grill, pan, food, food, food, food, food',\n ),\n hit(\n 3619206,\n 1280,\n 847,\n 'central-america-guatemala-rio-dulce-3619206',\n 'central america, guatemala, rio dulce, water, heaven, nature, clouds, landscape',\n ),\n hit(\n 1835369,\n 1280,\n 726,\n 'cooking-wok-chinese-asian-food-1835369',\n 'cooking, wok, chinese, asian, food, frying pan, meal, pan, vegetables, stir fry, frying, cook, cooking food, cooking vegetables, cooking, cooking, cooking, cooking, cooking, wok',\n ),\n hit(\n 6286592,\n 1280,\n 853,\n 'meatballs-cook-frying-pan-6286592',\n 'meatballs, cook, frying pan, minced meat, meat, food, meal, delicious, fry, sear, pan, closeup, meatballs, meatballs, meatballs, meatballs, meatballs',\n ),\n hit(\n 4926211,\n 1280,\n 853,\n 'girl-the-sea-con-beach-summer-4926211',\n 'girl, the sea, con, beach, summer, nature, rider, sport, race, animals',\n ),\n hit(\n 3619207,\n 1280,\n 848,\n 'central-america-guatemala-rio-dulce-3619207',\n 'central america, guatemala, rio dulce, water, nature, heaven, clouds, landscape',\n ),\n hit(\n 4813261,\n 1280,\n 853,\n 'meat-duck-duck-breast-raw-fry-4813261',\n 'meat, duck, duck breast, raw, fry, court, tasty, fried, sear, recipe, roast duck, food, poultry, food photo, kitchen, cook, meat, meat, meat, duck',\n ),\n hit(\n 4644941,\n 1280,\n 853,\n 'fat-frying-pan-4644941',\n 'fat, frying, pan',\n ),\n hit(\n 4937535,\n 1280,\n 960,\n 'stroller-beach-the-sea-ocean-sand-4937535',\n 'stroller, beach, the sea, nature, ocean, sand, con, rider, woman, umbrella, blue, red',\n ),\n hit(\n 1838785,\n 1280,\n 1280,\n 'avocado-chopping-board-ingredients-1838785',\n 'avocado, chopping board, ingredients, produce, groceries, fresh produce, food preparation, vegetables, cut, chop, kitchen, cooking, eggs, food, frying pan, healthy, knife, mushrooms, kitchen, cooking',\n ),\n hit(\n 4937541,\n 1280,\n 853,\n 'rider-con-arena-saddle-helmet-4937541',\n 'rider, con, arena, saddle, helmet, costume, wall, sand',\n ),\n hit(\n 6380762,\n 1280,\n 853,\n 'panpipe-musician-guatemalan-6380762',\n 'panpipe, musician, guatemalan, traditional costume, culture, man, pan flute, instrument, music, musical instrument, portrait, musician, musician, culture, pan flute, music, music, music, music, music',\n ),\n hit(\n 3246189,\n 1280,\n 853,\n 'food-pan-cooking-frying-pan-meal-3246189',\n 'food, pan, cooking, frying pan, meal, camping, breakfast, fire pit, morning, cook, outdoors, pit, fire, campfire, grill, scrambled, smoke, spatula, outside, skillet',\n ),\n hit(\n 2119027,\n 1280,\n 853,\n 'country-life-pan-kitchen-2119027',\n 'country life, pan, kitchen, preparation, frying pan, farmer, kitchen appliances, farm yard, country life, country life, pan, kitchen, kitchen, kitchen, kitchen, farmer, kitchen appliances, kitchen appliances, kitchen appliances, kitchen appliances',\n ),\n hit(\n 1927783,\n 1280,\n 853,\n 'pan-cook-fire-boiling-water-food-1927783',\n 'pan, cook, fire, boiling water, food, picture, free image, cook, boiling water, boiling water, boiling water, boiling water, boiling water',\n ),\n hit(\n 2106825,\n 1280,\n 853,\n 'carrots-yellow-beets-vegetables-2106825',\n 'carrots, yellow beets, vegetables, carrot, food, vitamins, meal, fresh, bio, cook, yummy, vegetarian, vegetable plants, market fresh vegetables, orange, healthy, nourishment, vegan, ingredients, vegetable pan',\n ),\n hit(\n 3619208,\n 1280,\n 847,\n 'central-america-guatemale-rio-dulce-3619208',\n 'central america, guatemale, rio dulce, water, heaven, clouds, nature, landscape',\n ),\n hit(\n 5095290,\n 1280,\n 853,\n 'bug-deep-con-infections-spike-5095290',\n 'bug, deep, con, nature, infections, spike, tree, black',\n ),\n hit(\n 3125689,\n 1280,\n 853,\n 'cook-figure-fried-egg-food-3125689',\n 'cook, figure, fried egg, food, frying pan, fried eggs, pan, yummy, eggs, grill, egg yolk, yolk, kitchen, fun',\n ),\n hit(\n 3619205,\n 1280,\n 847,\n 'central-america-guatemala-rio-dulce-3619205',\n 'central america, guatemala, rio dulce, nature, water, heaven, clouds, landscape',\n ),\n hit(\n 3941617,\n 1280,\n 853,\n 'meal-pan-chicken-tomato-3941617',\n 'meal, pan, chicken, tomato',\n ),\n hit(\n 5650205,\n 1280,\n 853,\n 'cosplay-clown-costume-scary-creepy-5650205',\n 'cosplay, clown, costume, scary, creepy, evil clown, cosplayer, character, portrait, comic con, clown, clown, clown, clown, clown, evil clown, evil clown, evil clown, evil clown',\n ),\n hit(\n 1583152,\n 1280,\n 905,\n 'pan-vegetables-cook-1583152',\n 'pan, vegetables, cook, pan, pan, pan, pan, pan, cook',\n ),\n hit(\n 7478482,\n 1280,\n 853,\n 'sea-ship-con-island-ocean-vietnam-7478482',\n 'sea, ship, con island, ocean, vietnam, nature, fishing boat, blue, minimalism, tran thang nhat, 5 plus english',\n ),\n hit(\n 5427775,\n 1280,\n 853,\n 'sea-vung-tau-beach-sky-dawn-5427775',\n 'sea, vung tau beach, sky, nature, dawn, con heo hill',\n ),\n]\n\n/** `candle shop` (vertical, min_width 1600): the Copper Fern hero, answered 2026-10-13T15:42:26.770Z. */\nexport const CANDLE_SHOP_TALL_HERO: StockPhoto[] = [\n hit(\n 2692556,\n 937,\n 1280,\n 'tea-light-light-worships-2692556',\n 'tea light, light, worships, candlelight, flame, meditation, prayer, candle, contemplative, memorial candle, ecclesiastical, shining, memorial lights, sacrificial candle, sacrificial light, reflection, warmth, burn, grief, seem',\n ),\n hit(\n 4597415,\n 853,\n 1280,\n 'camera-book-candle-read-cozy-bed-4597415',\n 'camera, book, candle, read, cozy, bed, lamp, bokeh, light, home, comfort, reading, cold, camera, book, book, book, candle, candle, candle',\n ),\n hit(\n 5850280,\n 853,\n 1280,\n 'candle-christmas-candle-advent-5850280',\n 'candle, christmas candle, advent, advent candle, candlelight, flame, christmas decoration, christmas decor, decoration, decor, closeup, candle, candle, candle, candle, candle, christmas candle, christmas candle, christmas candle, advent',\n ),\n hit(\n 9874140,\n 853,\n 1280,\n 'candles-candlelight-tea-lights-9874140',\n 'candles, candlelight, tea lights, church, prayer, faith, religion, light, burn, all saints, advent',\n ),\n hit(\n 6942931,\n 853,\n 1280,\n 'candle-book-read-study-fiction-6942931',\n 'candle, book, read, study, fiction, story, pages, candle, candle, candle, candle, book, study, study, study, study, study, story',\n ),\n hit(\n 4870097,\n 853,\n 1280,\n 'white-candle-candlelight-dark-4870097',\n 'white candle, candlelight, dark, blue flame, black candle, black candles',\n ),\n hit(\n 5181374,\n 857,\n 1280,\n 'candle-candlelight-flame-5181374',\n 'candle, candlelight, flame, candle flame, fire, black background, wick, burning candle, black candle, black candles, iphone wallpaper',\n ),\n hit(\n 1584711,\n 848,\n 1280,\n 'massage-therapy-candles-relaxation-1584711',\n 'massage therapy, candles, relaxation, treatment, luxury, spa, massage, towels, tea candles, candlelight, spa treatment, spa, spa, spa, spa, spa, massage',\n ),\n hit(\n 4222263,\n 868,\n 1280,\n 'table-candle-decoration-interior-4222263',\n 'table, candle, decoration, interior, romantic, celebration, candlestick, candlelight, living room, table, table, table, candle, candle, candle, candle, candle, living room, living room, living room',\n ),\n hit(\n 6668364,\n 853,\n 1280,\n 'lemon-candle-scented-candle-6668364',\n 'lemon candle, scented candle, blackberry candle, scented candle, scented candle, scented candle, scented candle, scented candle',\n ),\n hit(\n 4829516,\n 960,\n 1280,\n 'candlestick-classic-antique-candle-4829516',\n 'candlestick, classic, antique, candle, decorative, brown candle, brown candles, candlestick, candlestick, candlestick, candlestick, candlestick',\n ),\n hit(\n 2738532,\n 853,\n 1280,\n 'candle-tea-light-hand-church-light-2738532',\n 'candle, tea light, hand, church, light, worships, candlelight, faith, religion, christianity, flame, commemorate, meditation, prayer, contemplative, memorial candle, ecclesiastical, mood, shining, the atmosphere',\n ),\n hit(\n 8104677,\n 850,\n 1280,\n 'woman-manequin-shop-hat-hat-shop-8104677',\n 'woman, manequin, shop, hat, hat shop, store window, monochromatic',\n ),\n hit(\n 6145811,\n 850,\n 1280,\n 'bags-shop-gift-shop-establishment-6145811',\n 'bags, shop, gift shop, establishment, tourist shop, france, monaco, destination, vacation, travel',\n ),\n hit(\n 397965,\n 809,\n 1280,\n 'candle-candle-wax-candlelight-397965',\n 'candle, candle wax, candlelight, candlestick, flame, wax, illuminated, fire, burning, romantic, candle, candle, candle, candle, candle, candle wax, candlestick, wax',\n ),\n hit(\n 7581472,\n 853,\n 1280,\n 'candle-pine-christmas-tree-holidays-7581472',\n 'candle, pine, christmas tree, holidays, decoration, the background, pictures, image, burn, fire, heat, light, symbol, cozy, wax, night, black, hot, religion, meditation',\n ),\n hit(\n 7131604,\n 853,\n 1280,\n 'vintage-aesthetic-vintage-fashion-7131604',\n 'vintage aesthetic, vintage fashion, restaurant, interior, vintage interior, restaurant, restaurant, restaurant, restaurant, restaurant, interior',\n ),\n hit(\n 999370,\n 853,\n 1280,\n 'marrakesh-morocco-market-travel-999370',\n 'marrakesh, morocco, market, travel, colorful plates, morocco, morocco, morocco, morocco, morocco',\n ),\n hit(\n 5960786,\n 960,\n 1280,\n 'candle-holly-decorative-5960786',\n 'candle, holly, decorative, beeswax candle, wax candle, scented candle, scented candle, scented candle, scented candle, scented candle, scented candle',\n ),\n hit(\n 4126234,\n 853,\n 1280,\n 'girl-portrait-candle-smoke-4126234',\n 'girl, portrait, candle, smoke, brown smoke, brown candle, brown candles',\n ),\n hit(\n 4832387,\n 915,\n 1280,\n 'candlelight-candle-flame-dark-4832387',\n 'candlelight, candle, flame, dark, black candle, black candles',\n ),\n hit(\n 4725958,\n 1024,\n 1280,\n 'string-light-street-lights-violin-4725958',\n 'string, light, street, lights, violin, candle, christmas, woman, strings, brown candle, brown candles',\n ),\n hit(\n 6805045,\n 853,\n 1280,\n 'christmas-christmas-decoration-6805045',\n 'christmas, christmas decoration, christmas background, holiday, happychristmas, iphone wallpaper, christmas, christmas, christmas, christmas, christmas, christmas background, christmas background, christmas background, christmas background, christmas background',\n ),\n hit(\n 4368774,\n 853,\n 1280,\n 'street-building-historic-travel-4368774',\n 'street, building, historic, travel, trogir, architecture, mediterranean, croatia, old, culture, street, street, street, mediterranean, croatia, croatia, croatia, croatia, croatia',\n ),\n hit(\n 4068284,\n 862,\n 1280,\n 'girl-istanbul-shop-shopping-4068284',\n 'girl, istanbul, shop, shopping, turkish, turkish, turkish, turkish, turkish, turkish',\n ),\n hit(\n 9380550,\n 854,\n 1280,\n 'coffee-latte-art-candle-cozy-drink-9380550',\n 'coffee, mobile wallpaper 4k, latte art, samsung wallpaper, candle, cozy, drink, relaxation, ipad wallpaper, iphone wallpaper, aroma, beautiful wallpaper, coffee time, lock screen wallpaper, 4k, mobile wallpaper, wallpaper, phone wallpaper, background',\n ),\n hit(\n 4670035,\n 853,\n 1280,\n 'lantern-street-hoi-an-night-4670035',\n 'lantern, street, hoi an, night, old quarter, lantern, lantern, lantern, lantern, lantern, street, street, street, street, street, hoi an, hoi an, night, night, night',\n ),\n hit(\n 3358546,\n 960,\n 1280,\n 'burnt-flame-candle-dark-wax-burn-3358546',\n 'burnt, flame, candle, dark, wax, burn, heat, black candle, black candles',\n ),\n hit(\n 3992893,\n 894,\n 1280,\n 'flowers-table-setting-theme-wedding-3992893',\n 'flowers, table setting, theme, flower background, flower wallpaper, nature, wedding, beautiful flowers, bouquets, romantic, party, love',\n ),\n hit(\n 4523695,\n 960,\n 1280,\n 'candle-light-burnt-black-wight-4523695',\n 'candle, light, burnt, black, wight, black candle, black candles',\n ),\n hit(\n 5409069,\n 854,\n 1280,\n 'ice-cream-candy-food-dessert-sweet-5409069',\n 'ice cream, candy, food, dessert, sweet, ice cream, ice cream, ice cream, ice cream, ice cream, candy',\n ),\n hit(\n 8167776,\n 1024,\n 1280,\n 'shopping-shop-store-market-8167776',\n 'shopping, shop, store, market, supermarket, bakery, window',\n ),\n hit(\n 4562179,\n 853,\n 1280,\n 'candle-candlelight-shiny-mourning-4562179',\n 'candle, candlelight, shiny, mourning, romantic, mood, decoration, deco, flame, bright, brown candle, brown candles, candle, candle, candle, candle, candle, candlelight',\n ),\n hit(\n 2996627,\n 960,\n 1280,\n 'advent-christmas-time-advent-season-2996627',\n 'advent, christmas time, advent season, advent wreath, 3advent, advent greeting, greeting card, candles, candlelight, contemplative, decoration, flower arrangement, christmas jewelry, christmas, third candle, advent candle, advent, advent, advent, advent',\n ),\n hit(\n 6783665,\n 853,\n 1280,\n 'mulled-wine-christmas-drink-6783665',\n 'mulled wine, christmas drink, christmas decor, alcoholic beverage, mulled wine, mulled wine, mulled wine, mulled wine, mulled wine, christmas drink',\n ),\n hit(\n 5196603,\n 960,\n 1280,\n 'candle-shadow-light-mood-fire-5196603',\n 'candle, shadow, light, mood, fire, reflection, remember, brown candle, brown candles',\n ),\n hit(\n 4449673,\n 853,\n 1280,\n 'bokeh-night-dark-lights-candle-4449673',\n 'bokeh, night, dark, lights, candle, darkness, mood, black candle, black candles, black bokeh, bokeh, bokeh, bokeh, bokeh, bokeh',\n ),\n hit(\n 4220874,\n 853,\n 1280,\n 'candles-table-mood-candle-light-4220874',\n 'candles, table, mood, candle, light, candlelight, the atmosphere, lights, warm, candles, candles, candles, candles, candles, table, table, table, candle, light, candlelight',\n ),\n hit(\n 4518366,\n 960,\n 1280,\n 'taiwan-candle-temple-4518366',\n 'taiwan, candle, temple',\n ),\n hit(\n 4713126,\n 1024,\n 1280,\n 'berlin-germany-city-shopping-4713126',\n 'berlin, germany, city, shopping, blackandwhite, facade, black city, black shopping, gray shopping, black shop, gray shop',\n ),\n]\n"],"names":["hit","id","width","height","slug","tags","provider","String","pageUrl","photographer","split","downloadUrl","CON_PAN_DULCE_HERO","CANDLE_SHOP_TALL_HERO"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAID;;;;;;;;;;;;;;;;;CAiBC,GAED,MAAMA,MAAM,CACVC,IACAC,OACAC,QACAC,MACAC,OAEC,CAAA;QACCC,UAAU;QACVL,IAAIM,OAAON;QACXC;QACAC;QACAK,SAAS,CAAC,2BAA2B,EAAEJ,KAAK,CAAC,CAAC;QAC9CK,cAAc;QACdJ,MAAMA,KAAKK,KAAK,CAAC;QACjBC,aAAa,CAAC,yBAAyB,EAAEV,GAAG,SAAS,CAAC;IACxD,CAAA;AAEF,yGAAyG,GACzG,OAAO,MAAMW,qBAAmC;IAC9CZ,IACE,SACA,MACA,KACA,0CACA;IAEFA,IACE,SACA,MACA,KACA,6CACA;IAEFA,IACE,SACA,MACA,KACA,wCACA;IAEFA,IACE,SACA,MACA,KACA,yCACA;IAEFA,IACE,SACA,MACA,KACA,6CACA;IAEFA,IACE,SACA,MACA,KACA,4CACA;IAEFA,IACE,SACA,MACA,KACA,0CACA;IAEFA,IACE,SACA,MACA,KACA,2CACA;IAEFA,IACE,SACA,MACA,KACA,6CACA;IAEFA,IACE,OACA,MACA,KACA,sCACA;IAEFA,IACE,SACA,MACA,KACA,6CACA;IAEFA,IACE,SACA,MACA,KACA,4CACA;IAEFA,IACE,QACA,MACA,KACA,6CACA;IAEFA,IACE,SACA,MACA,KACA,8CACA;IAEFA,IACE,SACA,MACA,KACA,8CACA;IAEFA,IACE,SACA,MACA,KACA,6CACA;IAEFA,IACE,SACA,MACA,KACA,+CACA;IAEFA,IACE,SACA,MACA,KACA,0CACA;IAEFA,IACE,SACA,MACA,KACA,qCACA;IAEFA,IACE,SACA,MACA,KACA,yCACA;IAEFA,IACE,SACA,MACA,KACA,+CACA;IAEFA,IACE,SACA,MACA,KACA,yCACA;IAEFA,IACE,SACA,MACA,KACA,0BACA;IAEFA,IACE,SACA,MACA,KACA,6CACA;IAEFA,IACE,SACA,MACA,MACA,8CACA;IAEFA,IACE,SACA,MACA,KACA,yCACA;IAEFA,IACE,SACA,MACA,KACA,uCACA;IAEFA,IACE,SACA,MACA,KACA,4CACA;IAEFA,IACE,SACA,MACA,KACA,oCACA;IAEFA,IACE,SACA,MACA,KACA,4CACA;IAEFA,IACE,SACA,MACA,KACA,2CACA;IAEFA,IACE,SACA,MACA,KACA,+CACA;IAEFA,IACE,SACA,MACA,KACA,yCACA;IAEFA,IACE,SACA,MACA,KACA,sCACA;IAEFA,IACE,SACA,MACA,KACA,+CACA;IAEFA,IACE,SACA,MACA,KACA,mCACA;IAEFA,IACE,SACA,MACA,KACA,8CACA;IAEFA,IACE,SACA,MACA,KACA,+BACA;IAEFA,IACE,SACA,MACA,KACA,6CACA;IAEFA,IACE,SACA,MACA,KACA,uCACA;CAEH,CAAA;AAED,uGAAuG,GACvG,OAAO,MAAMa,wBAAsC;IACjDb,IACE,SACA,KACA,MACA,oCACA;IAEFA,IACE,SACA,KACA,MACA,4CACA;IAEFA,IACE,SACA,KACA,MACA,0CACA;IAEFA,IACE,SACA,KACA,MACA,0CACA;IAEFA,IACE,SACA,KACA,MACA,0CACA;IAEFA,IACE,SACA,KACA,MACA,yCACA;IAEFA,IACE,SACA,KACA,MACA,oCACA;IAEFA,IACE,SACA,KACA,MACA,8CACA;IAEFA,IACE,SACA,KACA,MACA,4CACA;IAEFA,IACE,SACA,KACA,MACA,uCACA;IAEFA,IACE,SACA,KACA,MACA,8CACA;IAEFA,IACE,SACA,KACA,MACA,8CACA;IAEFA,IACE,SACA,KACA,MACA,4CACA;IAEFA,IACE,SACA,KACA,MACA,6CACA;IAEFA,IACE,QACA,KACA,MACA,wCACA;IAEFA,IACE,SACA,KACA,MACA,+CACA;IAEFA,IACE,SACA,KACA,MACA,6CACA;IAEFA,IACE,QACA,KACA,MACA,0CACA;IAEFA,IACE,SACA,KACA,MACA,mCACA;IAEFA,IACE,SACA,KACA,MACA,sCACA;IAEFA,IACE,SACA,KACA,MACA,yCACA;IAEFA,IACE,SACA,MACA,MACA,6CACA;IAEFA,IACE,SACA,KACA,MACA,0CACA;IAEFA,IACE,SACA,KACA,MACA,2CACA;IAEFA,IACE,SACA,KACA,MACA,uCACA;IAEFA,IACE,SACA,KACA,MACA,8CACA;IAEFA,IACE,SACA,KACA,MACA,uCACA;IAEFA,IACE,SACA,KACA,MACA,4CACA;IAEFA,IACE,SACA,KACA,MACA,+CACA;IAEFA,IACE,SACA,KACA,MACA,0CACA;IAEFA,IACE,SACA,KACA,MACA,8CACA;IAEFA,IACE,SACA,MACA,MACA,sCACA;IAEFA,IACE,SACA,KACA,MACA,6CACA;IAEFA,IACE,SACA,KACA,MACA,+CACA;IAEFA,IACE,SACA,KACA,MACA,uCACA;IAEFA,IACE,SACA,KACA,MACA,yCACA;IAEFA,IACE,SACA,KACA,MACA,0CACA;IAEFA,IACE,SACA,KACA,MACA,2CACA;IAEFA,IACE,SACA,KACA,MACA,gCACA;IAEFA,IACE,SACA,MACA,MACA,wCACA;CAEH,CAAA"}
@@ -18,7 +18,7 @@ import { type AiIconLibraryEntry } from '../runtime/ai-icon-library';
18
18
  import { type AiLayoutBand, type AiLayoutBlock, type AiLayoutSection, type AiLayoutSettlement } from './ai-layout-language';
19
19
  import { type AiLayoutDesign, type AiLayoutDesignChoices, type AiLayoutGroupVariant } from './ai-layout-design';
20
20
  import { type AiLayoutDestination, type AiLayoutLinkScope, type AiLayoutTargets } from './ai-layout-links';
21
- import { AiLayoutTreeBuilder, type AiLayoutRawTree } from './ai-layout-tree';
21
+ import { aiLayoutSpans, AiLayoutTreeBuilder, type AiLayoutRawTree } from './ai-layout-tree';
22
22
  /**
23
23
  * The layout language compiler (AGL-3660): a page designed in the language
24
24
  * (`ai-layout-language.ts`) becomes the element tree the page stores — built
@@ -84,6 +84,12 @@ export interface AiLayoutCompileOptions {
84
84
  * uneven grid of pictures. Absent, the compiler's first design.
85
85
  */
86
86
  design?: AiLayoutDesign;
87
+ /**
88
+ * The site's language (AGL-3760), a code such as `es`: the words the
89
+ * compiler writes itself — "See all", a post's link — are in it where it is
90
+ * one `ai-layout-labels.ts` lists. Absent, English.
91
+ */
92
+ language?: string;
87
93
  }
88
94
  export interface AiLayoutCompiledPage {
89
95
  tree: AiLayoutRawTree;
@@ -171,12 +177,13 @@ export interface SectionScope {
171
177
  export declare function aiCompileLayoutPage(sections: readonly AiLayoutSection[], plan: AiLayoutPagePlan, targets: AiLayoutTargets, options: AiLayoutCompileOptions): AiLayoutCompiledPage;
172
178
  /** A band's own colors, as palette roles: the dark band pins the scheme instead. */
173
179
  export declare function bandSx(band: AiLayoutBand): Record<string, unknown> | null;
174
- /** Spans out of twelve for relative widths: each at least three, summing to twelve. */
175
- export declare function aiLayoutSpans(weights: readonly number[]): number[];
180
+ export { aiLayoutSpans };
176
181
  export declare function compileRow(scope: SectionScope, columns: Array<{
177
182
  column: AiLayoutBlock[];
178
183
  weight: number;
179
- }>): string;
184
+ }>,
185
+ /** How the columns sit against each other: centered on a page, top-aligned in a footer (AGL-3735). */
186
+ alignItems?: 'center' | 'flex-start'): string;
180
187
  export type Room = 'full' | 'half' | 'narrow';
181
188
  /** A column of blocks, top to bottom, with buttons side by side; `null` when nothing in it compiles. */
182
189
  export declare function compileFlow(scope: SectionScope, blocks: readonly AiLayoutBlock[], room: Room): string | null;
@@ -208,11 +215,11 @@ export declare const AI_LAYOUT_POST_CARD_TOKENS: readonly ["{{entry.title}}", "{
208
215
  /** The tokens a post's card puts in a link or a picture, which the page's store admits whole. */
209
216
  export declare const AI_LAYOUT_POST_ADDRESS_TOKENS: readonly string[];
210
217
  /** What a store's reviews are headed with where neither the design nor the plan says. */
211
- export declare const AI_LAYOUT_REVIEWS_HEADING = "What our customers say";
218
+ export declare const AI_LAYOUT_REVIEWS_HEADING: "What our customers say";
212
219
  /** What a store's sign-up is headed with where neither the design nor the plan says. */
213
- export declare const AI_LAYOUT_SIGNUP_HEADING = "Join our newsletter";
220
+ export declare const AI_LAYOUT_SIGNUP_HEADING: "Join our newsletter";
214
221
  /** The button a storefront's hero opens its shop with. */
215
- export declare const AI_LAYOUT_SHOP_ALL = "Shop all";
222
+ export declare const AI_LAYOUT_SHOP_ALL: "Shop all";
216
223
  /** What a store's Product grid says while the store lists nothing yet (AGL-3676). */
217
224
  export declare const AI_LAYOUT_STORE_EMPTY: {
218
225
  readonly title: "New pieces are on the way";
@@ -220,6 +227,8 @@ export declare const AI_LAYOUT_STORE_EMPTY: {
220
227
  /** Said where the site has no page to get in touch on. */
221
228
  readonly textAlone: "Our first pieces are being finished now. Check back soon.";
222
229
  };
230
+ /** The words of the link under each record's card to its own page (AGL-3727). */
231
+ export declare const AI_LAYOUT_RECORD_LINK_LABEL: "View details";
223
232
  /** The fields a record's card shows: its name, a kicker line and its words, each by id. */
224
233
  export declare function aiLayoutRecordCardFields(fields: readonly {
225
234
  id: string;
@@ -23,10 +23,11 @@ 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
25
  import { aiLayoutDesignChoices, aiLayoutFamily, aiLayoutGroupVariant } from "./ai-layout-design.js";
26
- import { AI_LAYOUT_FEATURED_RECORDS, AI_LAYOUT_LISTING_ELEMENTS, aiLayoutListingAt } from "./ai-layout-listings.js";
26
+ import { AI_LAYOUT_FEATURED_RECORDS, AI_LAYOUT_LISTING_ELEMENTS, aiLayoutListingAt, aiLayoutRecordHref } from "./ai-layout-listings.js";
27
27
  import { aiStorefrontItemIcons } from "./ai-layout-storefront.js";
28
+ import { AI_LAYOUT_LABELS_EN, aiLayoutLabel } from "./ai-layout-labels.js";
28
29
  import { aiLayoutRenamedLabel, aiLayoutResolveLink } from "./ai-layout-links.js";
29
- import { AI_LAYOUT_FRAMES, AiLayoutTreeBuilder } from "./ai-layout-tree.js";
30
+ import { aiLayoutSpans, AI_LAYOUT_FRAMES, AiLayoutTreeBuilder } from "./ai-layout-tree.js";
30
31
  /**
31
32
  * What a section is called to a screen reader: its plan name, with any note
32
33
  * the plan left in brackets taken out. A live blog plan (2026-10-09) named a
@@ -579,24 +580,9 @@ function sameShape(columns) {
579
580
  };
580
581
  }
581
582
  // ── A row of columns ──────────────────────────────────────────────────────
582
- /** Spans out of twelve for relative widths: each at least three, summing to twelve. */ export function aiLayoutSpans(weights) {
583
- const total = weights.reduce((sum, weight)=>sum + weight, 0);
584
- const spans = weights.map((weight)=>Math.max(3, Math.round(weight / total * 12)));
585
- let over = spans.reduce((sum, span)=>sum + span, 0) - 12;
586
- while(over !== 0){
587
- // Take from (or give to) the widest column that can spare it.
588
- const order = spans.map((span, position)=>({
589
- span,
590
- position
591
- })).sort((a, b)=>over > 0 ? b.span - a.span : a.span - b.span);
592
- const pick = order.find((entry)=>over > 0 ? entry.span > 3 : true);
593
- if (!pick) break;
594
- spans[pick.position] += over > 0 ? -1 : 1;
595
- over += over > 0 ? -1 : 1;
596
- }
597
- return spans;
598
- }
599
- export function compileRow(scope, columns) {
583
+ // Spans out of twelve live with the tree, so a frame's repair reads them without the compiler (AGL-3735).
584
+ export { aiLayoutSpans };
585
+ export function compileRow(scope, columns, /** How the columns sit against each other: centered on a page, top-aligned in a footer (AGL-3735). */ alignItems = 'center') {
600
586
  const tree = scope.page.tree;
601
587
  const spans = aiLayoutSpans(columns.map((entry)=>entry.weight));
602
588
  const items = columns.map((entry, position)=>{
@@ -613,7 +599,7 @@ export function compileRow(scope, columns) {
613
599
  container: true,
614
600
  spacing: columns.length >= 3 ? '4' : '6'
615
601
  }, {
616
- alignItems: 'center'
602
+ alignItems
617
603
  }, items, 'row');
618
604
  }
619
605
  /** A column of blocks, top to bottom, with buttons side by side; `null` when nothing in it compiles. */ export function compileFlow(scope, blocks, room) {
@@ -2032,15 +2018,16 @@ function instances(scope, placed, items, perRow) {
2032
2018
  '{{entry.coverImage}}'
2033
2019
  ];
2034
2020
  /** The button under a featured band that opens the whole list, where the site has one and the design gave none. */ function listingAllButton(page, listing) {
2021
+ const language = page.options.language;
2035
2022
  if (listing.kind === 'posts') return listing.href ? {
2036
2023
  kind: 'button',
2037
- text: 'All posts',
2024
+ text: aiLayoutLabel('allPosts', language),
2038
2025
  to: listing.href,
2039
2026
  style: 'secondary'
2040
2027
  } : null;
2041
2028
  const index = listing.placements.find((placement)=>placement.role === 'index' && placement.screenId !== page.targets.pageId);
2042
2029
  if (!index) return null;
2043
- const text = listing.kind === 'tracks' ? 'All music' : listing.kind === 'records' ? 'See all' : 'Shop all';
2030
+ const text = aiLayoutLabel(listing.kind === 'tracks' ? 'allMusic' : listing.kind === 'events' ? 'allEvents' : listing.kind === 'records' ? 'seeAll' : 'shopAll', language);
2044
2031
  return {
2045
2032
  kind: 'button',
2046
2033
  text,
@@ -2153,7 +2140,7 @@ function listingSection(scope, blocks, placed) {
2153
2140
  container
2154
2141
  ], 'section', (_ref = (_page_options_sectionIds = page.options.sectionIds) == null ? void 0 : _page_options_sectionIds[index]) != null ? _ref : sectionIdOf(index));
2155
2142
  }
2156
- /** What a store's reviews are headed with where neither the design nor the plan says. */ export const AI_LAYOUT_REVIEWS_HEADING = 'What our customers say';
2143
+ /** What a store's reviews are headed with where neither the design nor the plan says. */ export const AI_LAYOUT_REVIEWS_HEADING = AI_LAYOUT_LABELS_EN.reviewsHeading;
2157
2144
  /**
2158
2145
  * A store's own customer reviews (AGL-3676): the commerce plugin's Product
2159
2146
  * reviews in its store-wide scope, carrying the section's heading itself.
@@ -2166,7 +2153,7 @@ function listingSection(scope, blocks, placed) {
2166
2153
  const { page, index, at } = scope;
2167
2154
  const tree = page.tree;
2168
2155
  const given = blocks.find((block)=>speaksHeading(scope, block));
2169
- const heading = aiLayoutWords(given == null ? void 0 : given.text, 'heading', page.targets.facts) || aiLayoutFitText((_page_plan_sections_index = page.plan.sections[index]) == null ? void 0 : _page_plan_sections_index.name, 'heading') || AI_LAYOUT_REVIEWS_HEADING;
2156
+ const heading = aiLayoutWords(given == null ? void 0 : given.text, 'heading', page.targets.facts) || aiLayoutFitText((_page_plan_sections_index = page.plan.sections[index]) == null ? void 0 : _page_plan_sections_index.name, 'heading') || aiLayoutLabel('reviewsHeading', page.options.language);
2170
2157
  page.settled.push({
2171
2158
  at,
2172
2159
  what: "the store's own reviews placed: shown once shoppers leave them, never written for them"
@@ -2193,7 +2180,7 @@ function listingSection(scope, blocks, placed) {
2193
2180
  container
2194
2181
  ], bandSx(scope.band), scope.band === 'dark');
2195
2182
  }
2196
- /** What a store's sign-up is headed with where neither the design nor the plan says. */ export const AI_LAYOUT_SIGNUP_HEADING = 'Join our newsletter';
2183
+ /** What a store's sign-up is headed with where neither the design nor the plan says. */ export const AI_LAYOUT_SIGNUP_HEADING = AI_LAYOUT_LABELS_EN.signupHeading;
2197
2184
  /**
2198
2185
  * A store's newsletter sign-up (AGL-3676): the design's heading and words
2199
2186
  * beside the commerce plugin's Newsletter signup field, or over it on a
@@ -2211,7 +2198,7 @@ function listingSection(scope, blocks, placed) {
2211
2198
  var _page_plan_sections_index;
2212
2199
  flow.unshift({
2213
2200
  kind: 'heading',
2214
- text: ((_page_plan_sections_index = page.plan.sections[index]) == null ? void 0 : _page_plan_sections_index.name) || AI_LAYOUT_SIGNUP_HEADING
2201
+ text: ((_page_plan_sections_index = page.plan.sections[index]) == null ? void 0 : _page_plan_sections_index.name) || aiLayoutLabel('signupHeading', page.options.language)
2215
2202
  });
2216
2203
  }
2217
2204
  page.settled.push({
@@ -2219,7 +2206,7 @@ function listingSection(scope, blocks, placed) {
2219
2206
  what: "the store's newsletter sign-up placed"
2220
2207
  });
2221
2208
  const field = tree.add(AI_LAYOUT_LISTING_ELEMENTS.signup, {
2222
- buttonLabel: 'Subscribe'
2209
+ buttonLabel: aiLayoutLabel('subscribe', page.options.language)
2223
2210
  }, null, null, 'signup');
2224
2211
  noted(scope, [
2225
2212
  field,
@@ -2353,9 +2340,10 @@ function listingSection(scope, blocks, placed) {
2353
2340
  style: 'secondary'
2354
2341
  });
2355
2342
  }
2343
+ const text = aiLayoutLabel('shopAll', scope.page.options.language);
2356
2344
  const shopAll = {
2357
2345
  kind: 'button',
2358
- text: AI_LAYOUT_SHOP_ALL,
2346
+ text,
2359
2347
  to: `page:${shop}`,
2360
2348
  style: 'primary'
2361
2349
  };
@@ -2363,10 +2351,10 @@ function listingSection(scope, blocks, placed) {
2363
2351
  else flow.splice(firstButton, 0, shopAll);
2364
2352
  scope.page.settled.push({
2365
2353
  at: scope.at,
2366
- what: `the hero opens the shop: "${AI_LAYOUT_SHOP_ALL}" leads its buttons`
2354
+ what: `the hero opens the shop: "${text}" leads its buttons`
2367
2355
  });
2368
2356
  }
2369
- /** The button a storefront's hero opens its shop with. */ export const AI_LAYOUT_SHOP_ALL = 'Shop all';
2357
+ /** The button a storefront's hero opens its shop with. */ export const AI_LAYOUT_SHOP_ALL = AI_LAYOUT_LABELS_EN.shopAll;
2370
2358
  /**
2371
2359
  * A storefront's reasons to buy as open columns, each led by an icon over its
2372
2360
  * title and words (AGL-3676): the icon the design named for it, else one its
@@ -2438,6 +2426,22 @@ function listingSection(scope, blocks, placed) {
2438
2426
  ]);
2439
2427
  return id;
2440
2428
  }
2429
+ if (listing.kind === 'events') {
2430
+ // The site's published events (AGL-3755), each with its date, place and
2431
+ // cover: the section's heading is the model's, so the list adds none.
2432
+ id = tree.add(element, featured ? {
2433
+ maxItems: String(shown)
2434
+ } : null, null, null, 'events');
2435
+ page.settled.push({
2436
+ at: scope.at,
2437
+ what: 'the site’s events listed by the Event List'
2438
+ });
2439
+ noted(scope, [
2440
+ id,
2441
+ id
2442
+ ]);
2443
+ return id;
2444
+ }
2441
2445
  if (listing.kind === 'products') {
2442
2446
  id = tree.add(element, _extends({
2443
2447
  source: 'all',
@@ -2456,10 +2460,10 @@ function listingSection(scope, blocks, placed) {
2456
2460
  quickAdd: true,
2457
2461
  // A store that opens before its first products are in says so, with a
2458
2462
  // way to hear when they land (AGL-3676): never placeholder products.
2459
- emptyTitle: AI_LAYOUT_STORE_EMPTY.title,
2460
- emptyText: listing.emptyAction ? AI_LAYOUT_STORE_EMPTY.text : AI_LAYOUT_STORE_EMPTY.textAlone
2463
+ emptyTitle: aiLayoutLabel('storeEmptyTitle', page.options.language),
2464
+ emptyText: aiLayoutLabel(listing.emptyAction ? 'storeEmptyText' : 'storeEmptyTextAlone', page.options.language)
2461
2465
  }, listing.emptyAction ? {
2462
- emptyActionLabel: listing.emptyAction.label,
2466
+ emptyActionLabel: listing.emptyAction.label === AI_LAYOUT_LABELS_EN.getInTouch ? aiLayoutLabel('getInTouch', page.options.language) : listing.emptyAction.label,
2463
2467
  emptyActionHref: listing.emptyAction.href
2464
2468
  } : {}), null, null, 'products');
2465
2469
  } else if (listing.kind === 'records') {
@@ -2475,9 +2479,9 @@ function listingSection(scope, blocks, placed) {
2475
2479
  return id;
2476
2480
  }
2477
2481
  /** What a store's Product grid says while the store lists nothing yet (AGL-3676). */ export const AI_LAYOUT_STORE_EMPTY = {
2478
- title: 'New pieces are on the way',
2479
- text: 'Our first pieces are being finished now. Get in touch and we will let you know the moment they land.',
2480
- /** Said where the site has no page to get in touch on. */ textAlone: 'Our first pieces are being finished now. Check back soon.'
2482
+ title: AI_LAYOUT_LABELS_EN.storeEmptyTitle,
2483
+ text: AI_LAYOUT_LABELS_EN.storeEmptyText,
2484
+ /** Said where the site has no page to get in touch on. */ textAlone: AI_LAYOUT_LABELS_EN.storeEmptyTextAlone
2481
2485
  };
2482
2486
  /** The most posts a page of the site lists where it is the writing's own page. */ const COLLECTION_INDEX_POSTS = 9;
2483
2487
  /** The blog's posts as the site's design lists them: a grid of covers, or a ruled list with the dates. */ function postsElement(scope, listing, limit) {
@@ -2509,7 +2513,7 @@ function listingSection(scope, blocks, placed) {
2509
2513
  variant: 'body2'
2510
2514
  }, muted(scope), null, 'postExcerpt');
2511
2515
  const more = tree.add('muiScreenLink', {
2512
- children: 'Read the post',
2516
+ children: aiLayoutLabel('readPost', page.options.language),
2513
2517
  href: '{{entry.url}}',
2514
2518
  renderAs: 'link',
2515
2519
  color: 'inherit'
@@ -2581,6 +2585,7 @@ function listingSection(scope, blocks, placed) {
2581
2585
  ], 'posts');
2582
2586
  }
2583
2587
  // ── A dataset's records (AGL-3616) ───────────────────────────────────────
2588
+ /** The words of the link under each record's card to its own page (AGL-3727). */ export const AI_LAYOUT_RECORD_LINK_LABEL = AI_LAYOUT_LABELS_EN.viewDetails;
2584
2589
  /** A field whose name says it is a record's kicker: its category, role, time or place. */ const RECORD_KICKER = /\b(category|categories|type|kind|role|title|position|section|course|date|dates|time|times|when|day|days|location|place|where|venue|city|duration|level|tag|tags)\b/i;
2585
2590
  /** A field whose name says it is a record's words: its description, bio or answer. */ const RECORD_BODY = /\b(description|summary|details?|about|bio|biography|answer|text|notes?|body|blurb|overview|excerpt|ingredients|includes)\b/i;
2586
2591
  /** A dataset of questions and answers, listed as a ruled list rather than cards. */ const RECORD_QUESTIONS = /\b(faqs?|questions?|q ?& ?a)\b/i;
@@ -2639,6 +2644,9 @@ function listingSection(scope, blocks, placed) {
2639
2644
  }, textAlign), muted(scope), null, 'recordBody') : null;
2640
2645
  const photoField = !questions && listing.imageField ? listing.imageField : null;
2641
2646
  const opens = Boolean(photoField) && aiOpensGalleriesInLightbox(page);
2647
+ // Each card opens its record's own page where the dataset has one (AGL-3727):
2648
+ // `/{base}/{{item.<address>}}`, filled per record as the card repeats.
2649
+ const recordHref = aiLayoutRecordHref(listing);
2642
2650
  const portrait = ((_page_design = page.design) == null ? void 0 : _page_design.input.kind) === 'photography' || RECORD_PEOPLE.test(listing.name);
2643
2651
  const picture = photoField ? tree.add('image', _extends({
2644
2652
  src: `{{item.${photoField}}}`,
@@ -2648,13 +2656,23 @@ function listingSection(scope, blocks, placed) {
2648
2656
  loading: 'lazy'
2649
2657
  }, opens ? _extends({}, lightboxProps(scope), fields.title ? {
2650
2658
  lightboxCaption: `{{item.${fields.title}}}`
2651
- } : {}) : {}), {
2659
+ } : {}) : {}, recordHref && !opens ? {
2660
+ href: recordHref
2661
+ } : {}), {
2652
2662
  aspectRatio: portrait ? '4 / 5' : '4 / 3',
2653
2663
  borderRadius: 2
2654
2664
  }, null, 'recordImage') : null;
2665
+ const more = recordHref ? tree.add('muiScreenLink', {
2666
+ children: aiLayoutLabel('viewDetails', page.options.language),
2667
+ href: recordHref,
2668
+ renderAs: 'link',
2669
+ color: 'inherit'
2670
+ }, {
2671
+ alignSelf: scope.centered && !questions ? 'center' : 'flex-start'
2672
+ }, null, 'recordLink') : null;
2655
2673
  page.settled.push({
2656
2674
  at: scope.at,
2657
- what: `${listing.name} listed from its dataset${questions ? ' as a ruled list' : picture ? ' as picture cards' : ' as cards'}`
2675
+ what: `${listing.name} listed from its dataset${questions ? ' as a ruled list' : picture ? ' as picture cards' : ' as cards'}${recordHref ? `, each linking its page under /${listing.recordBase}` : ''}`
2658
2676
  });
2659
2677
  const card = questions ? tree.add('muiStack', {
2660
2678
  spacing: '1'
@@ -2663,7 +2681,8 @@ function listingSection(scope, blocks, placed) {
2663
2681
  pt: 3
2664
2682
  }, [
2665
2683
  title,
2666
- body
2684
+ body,
2685
+ more
2667
2686
  ], 'record') : tree.add('muiStack', _extends({
2668
2687
  spacing: picture ? '1.5' : '1'
2669
2688
  }, scope.centered ? {
@@ -2672,7 +2691,8 @@ function listingSection(scope, blocks, placed) {
2672
2691
  picture,
2673
2692
  kicker,
2674
2693
  title,
2675
- body
2694
+ body,
2695
+ more
2676
2696
  ], 'record');
2677
2697
  return tree.add(AI_LAYOUT_LISTING_ELEMENTS.records, _extends({
2678
2698
  repeatDataset: listing.datasetId