@aglyn/plugins-ai 1.0.0-beta.256 → 1.0.0-beta.258

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 (88) hide show
  1. package/package.json +17 -17
  2. package/src/lib/components/assist-panel.component.js +21 -8
  3. package/src/lib/components/assist-panel.component.js.map +1 -1
  4. package/src/lib/insights/ai-figure-readers.js +15 -8
  5. package/src/lib/insights/ai-figure-readers.js.map +1 -1
  6. package/src/lib/jobs/ai-job-build-step.d.ts +9 -0
  7. package/src/lib/jobs/ai-job-build-step.js +19 -3
  8. package/src/lib/jobs/ai-job-build-step.js.map +1 -1
  9. package/src/lib/jobs/ai-job-form-step.js +3 -3
  10. package/src/lib/jobs/ai-job-form-step.js.map +1 -1
  11. package/src/lib/jobs/ai-job-insight-step.js +1 -1
  12. package/src/lib/jobs/ai-job-insight-step.js.map +1 -1
  13. package/src/lib/jobs/ai-job-page-language.d.ts +19 -0
  14. package/src/lib/jobs/ai-job-page-language.js +24 -4
  15. package/src/lib/jobs/ai-job-page-language.js.map +1 -1
  16. package/src/lib/jobs/ai-job-page-sections.js +12 -1
  17. package/src/lib/jobs/ai-job-page-sections.js.map +1 -1
  18. package/src/lib/jobs/ai-job-page-step.d.ts +14 -0
  19. package/src/lib/jobs/ai-job-page-step.js +69 -20
  20. package/src/lib/jobs/ai-job-page-step.js.map +1 -1
  21. package/src/lib/jobs/ai-job-seo-step.js +3 -2
  22. package/src/lib/jobs/ai-job-seo-step.js.map +1 -1
  23. package/src/lib/jobs/ai-layout-stock-photos.d.ts +10 -5
  24. package/src/lib/jobs/ai-layout-stock-photos.js +89 -7
  25. package/src/lib/jobs/ai-layout-stock-photos.js.map +1 -1
  26. package/src/lib/jobs/fixtures/ai-stock-photo-copper-kettle-recordings.d.ts +21 -0
  27. package/src/lib/jobs/fixtures/ai-stock-photo-copper-kettle-recordings.js +126 -0
  28. package/src/lib/jobs/fixtures/ai-stock-photo-copper-kettle-recordings.js.map +1 -0
  29. package/src/lib/layout-language/ai-layout-compiler.js +52 -52
  30. package/src/lib/layout-language/ai-layout-compiler.js.map +1 -1
  31. package/src/lib/layout-language/ai-layout-copy.d.ts +9 -5
  32. package/src/lib/layout-language/ai-layout-copy.js +22 -14
  33. package/src/lib/layout-language/ai-layout-copy.js.map +1 -1
  34. package/src/lib/layout-language/ai-layout-frame.js +4 -4
  35. package/src/lib/layout-language/ai-layout-frame.js.map +1 -1
  36. package/src/lib/layout-language/ai-layout-pictures.d.ts +44 -15
  37. package/src/lib/layout-language/ai-layout-pictures.js +29 -8
  38. package/src/lib/layout-language/ai-layout-pictures.js.map +1 -1
  39. package/src/lib/model/ai-build-job.js +14 -0
  40. package/src/lib/model/ai-build-job.js.map +1 -1
  41. package/src/lib/model/ai-host-publish-context.d.ts +6 -0
  42. package/src/lib/model/ai-host-publish-context.js +15 -2
  43. package/src/lib/model/ai-host-publish-context.js.map +1 -1
  44. package/src/lib/model/assist-follow-up.d.ts +35 -0
  45. package/src/lib/model/assist-follow-up.js +44 -4
  46. package/src/lib/model/assist-follow-up.js.map +1 -1
  47. package/src/lib/providers/anthropic.js +17 -4
  48. package/src/lib/providers/anthropic.js.map +1 -1
  49. package/src/lib/providers/cache-write-hour.d.ts +37 -0
  50. package/src/lib/providers/cache-write-hour.js +46 -0
  51. package/src/lib/providers/cache-write-hour.js.map +1 -0
  52. package/src/lib/providers/contract.d.ts +16 -3
  53. package/src/lib/providers/contract.js.map +1 -1
  54. package/src/lib/providers/routing.d.ts +13 -0
  55. package/src/lib/providers/routing.js +27 -11
  56. package/src/lib/providers/routing.js.map +1 -1
  57. package/src/lib/runtime/ai-dev-env.d.ts +13 -3
  58. package/src/lib/runtime/ai-dev-env.js +17 -3
  59. package/src/lib/runtime/ai-dev-env.js.map +1 -1
  60. package/src/lib/runtime/ai-dev-replay.js +4 -2
  61. package/src/lib/runtime/ai-dev-replay.js.map +1 -1
  62. package/src/lib/runtime/ai-doctrine-validators.d.ts +41 -1
  63. package/src/lib/runtime/ai-doctrine-validators.js +263 -2
  64. package/src/lib/runtime/ai-doctrine-validators.js.map +1 -1
  65. package/src/lib/runtime/ai-doctrine.js +7 -1
  66. package/src/lib/runtime/ai-doctrine.js.map +1 -1
  67. package/src/lib/runtime/ai-eval-live.js +1 -1
  68. package/src/lib/runtime/ai-eval-live.js.map +1 -1
  69. package/src/lib/runtime/ai-eval.d.ts +1 -1
  70. package/src/lib/runtime/ai-eval.js +18 -1
  71. package/src/lib/runtime/ai-eval.js.map +1 -1
  72. package/src/lib/runtime/ai-palette.generated.js +162 -2
  73. package/src/lib/runtime/ai-palette.generated.js.map +1 -1
  74. package/src/lib/runtime/ai-placeholder-tokens.d.ts +70 -0
  75. package/src/lib/runtime/ai-placeholder-tokens.js +169 -0
  76. package/src/lib/runtime/ai-placeholder-tokens.js.map +1 -0
  77. package/src/lib/runtime/ai-repeated-items.js +5 -2
  78. package/src/lib/runtime/ai-repeated-items.js.map +1 -1
  79. package/src/lib/runtime/ai-runtime.js +2 -3
  80. package/src/lib/runtime/ai-runtime.js.map +1 -1
  81. package/src/lib/server/assist-chat.js +8 -3
  82. package/src/lib/server/assist-chat.js.map +1 -1
  83. package/src/lib/server/assist-view-context.d.ts +5 -1
  84. package/src/lib/server/assist-view-context.js +8 -3
  85. package/src/lib/server/assist-view-context.js.map +1 -1
  86. package/src/lib/usage/assist-usage.d.ts +2 -0
  87. package/src/lib/usage/assist-usage.js +8 -3
  88. package/src/lib/usage/assist-usage.js.map +1 -1
@@ -0,0 +1,21 @@
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
+ import type { StockPhoto } from '@aglyn/aglyn/plugin-manager/stock-photo-provider';
18
+ /** `family-run austin caterer` (horizontal, min_width 1600), answered 2026-10-15T18:47:45.010Z. */
19
+ export declare const FAMILY_RUN_AUSTIN_CATERER: StockPhoto[];
20
+ /** `caterer` (horizontal, min_width 1600), answered 2026-10-15T18:47:45.261Z. */
21
+ export declare const CATERER: StockPhoto[];
@@ -0,0 +1,126 @@
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 THE COPPER KETTLE CATERING HERO (AGL-3831):
18
+ * what production's `stockPhotoSearches` cache held for the two searches the
19
+ * beta.257 restaurant site "Copper Kettle Catering" ("Family-run Austin
20
+ * caterer: Texas barbecue and Tex-Mex for weddings, office lunches and
21
+ * parties", job mRxC_v18aH, 2026-10-15) sent for its home hero, read back
22
+ * from the cache, never searched again. Ids, sizes, page slugs and tags are
23
+ * Pixabay's own, in its order; the contributor is left out. Each search was
24
+ * matched to its cache entry by the entry's key.
25
+ *
26
+ * The hero was held to the craft "caterer", and a photo of catering is
27
+ * tagged "catering", "buffet", "bbq": only three hits said "caterer", none
28
+ * first, so nothing was accepted and the starter pottery photo filled the
29
+ * hero under the model's words "A spread of smoked brisket, fajitas and sides
30
+ * on a long catering table".
31
+ */ const hit = (id, width, height, slug, tags)=>({
32
+ provider: 'pixabay',
33
+ id: String(id),
34
+ width,
35
+ height,
36
+ pageUrl: `https://pixabay.com/photos/${slug}/`,
37
+ photographer: 'A Pixabay contributor',
38
+ tags: tags.split(', '),
39
+ downloadUrl: `https://pixabay.com/get/g${id}_1280.jpg`
40
+ });
41
+ /** `family-run austin caterer` (horizontal, min_width 1600), answered 2026-10-15T18:47:45.010Z. */ export const FAMILY_RUN_AUSTIN_CATERER = [
42
+ hit(3860567, 1280, 853, 'austin-healey-car-automobile-3860567', 'austin healey, car, automobile, vehicle, austin, retro, healey, vintage, chromium, car wallpapers, speed'),
43
+ hit(2999867, 1280, 853, 'traffic-automobile-antique-car-2999867', 'traffic, automobile, car wallpapers, antique car, austin, austin healey, convertible, sports car, headlights, grille, parrot, composing, blue, car, driving a car'),
44
+ hit(5276620, 1280, 853, 'old-buda-texas-city-park-entrance-5276620', 'old buda texas city park entrance, vintage, historical, park, buda, buda texas, atx, texas, central texas, austin, austin texas, city park, texas, central texas, austin texas, austin texas, austin texas, austin texas, austin texas'),
45
+ hit(4877118, 1280, 853, 'cypress-tree-roots-nature-texas-4877118', 'cypress, tree, roots, nature, texas, austin, atx, river, forest, natural, landscape, waterway, cypress, cypress, cypress, cypress, texas, texas, austin, austin'),
46
+ hit(4066441, 1280, 901, 'texas-state-capitol-austin-america-4066441', 'texas state capitol, austin, america, architecture, government, dome, landscape, mood, hdr, landmark, historic, austin, austin, austin, austin, austin'),
47
+ hit(3345327, 1280, 914, 'water-nature-river-landscape-lake-3345327', 'water, nature, river, landscape, lake, bats, austin, reflection, sunset, tranquil, united states, austin, texas'),
48
+ hit(5029318, 1280, 853, 'chinese-rose-rose-flower-rose-5029318', 'chinese rose, rose flower, rose, gold celebration, austin, chinese rose, chinese rose, chinese rose, chinese rose, chinese rose, rose, austin'),
49
+ hit(3967304, 1280, 852, 'macaroon-caterer-plateau-food-3967304', 'macaroon, caterer, plateau, food, cocktail'),
50
+ hit(5357325, 1280, 854, 'river-austin-viewing-bats-texas-5357325', 'river, austin, nature, viewing, bats, texas, water, landscape, bridge'),
51
+ hit(4549223, 1280, 853, 'transport-traffic-automobile-4549223', 'transport, traffic, automobile, sports car, austin, blue, cabriolet, antique car, car wallpapers, car'),
52
+ hit(3409985, 1280, 853, 'texas-art-wall-street-art-urban-3409985', 'texas, art, wall, street art, urban, austin, blue art, blue wall, blue street, austin, austin, austin, austin, austin'),
53
+ hit(4699178, 1280, 960, 'austin-healey-car-classic-sport-4699178', 'austin healey, car, classic, sport, car wallpapers, coupe, austin healey 3000, motot, calender, hood, detail, design, red'),
54
+ hit(7933399, 1280, 670, 'austin-texas-river-buildings-city-7933399', 'austin, texas, river, buildings, city, urban, cityscape, travel, architecture, usa, nature, spring, austin, austin, austin, austin, austin'),
55
+ hit(1566254, 1280, 848, 'table-wedding-table-covered-wedding-1566254', 'table, wedding table, covered, wedding, event, knives, fork, napkin, butterfly, restaurant, caterer, decoration, table decoration, wedding decoration, reception'),
56
+ hit(173907, 1280, 960, 'austin-texas-architecture-skyline-173907', 'austin, texas, architecture, skyline, city, cityscape, tower, skyscraper, building, landmark, urban, scenic, scenery, downtown, metropolis, buildings, metropolitan, austin, austin, austin'),
57
+ hit(4064427, 1280, 853, 'austin-texas-bridge-bats-sunset-4064427', 'austin, texas, bridge, bats, sunset, river, lake, downtown, nature, cityscape, tx, sky'),
58
+ hit(3178752, 1280, 851, 'architecture-city-skyline-3178752', 'architecture, city, nature, skyline, skyscraper, cityscape, austin, texas, lake, blue, buildings, reflections, panorama, downtown, tourism'),
59
+ hit(4874473, 1280, 853, 'windmill-water-tanks-ranch-rural-4874473', 'windmill, water tanks, ranch, rural, farm, old windmill, water storage, meadow, landscape, countryside, austin, texas, old windmill, water storage, water storage, texas, texas, texas, texas, texas'),
60
+ hit(3468795, 1280, 847, 'austin-texas-tx-bridge-lake-3468795', 'austin, texas, nature, tx, bridge, lake, skyline, city, lady bird lake, congress avenue bridge'),
61
+ hit(4874396, 1280, 853, 'texas-scenic-landscape-countryside-4874396', 'texas, scenic, landscape, countryside, shed, cactus, country, outdoors, rural, travel, austin, tx'),
62
+ hit(4822547, 1280, 757, 'flower-yellow-rose-david-austin-4822547', 'flower, yellow, rose, flower background, david austin, flower wallpaper, beautiful flowers, greeting card, decoration, rose flower, cut out, isolated, garden, nature'),
63
+ hit(4357790, 1280, 857, 'shepherd-dog-dog-domestic-animal-4357790', 'shepherd dog, nature, dog, domestic animal, animal, dog puppy, baby dog, young and old, pet, old german shepherd dog, puppy'),
64
+ hit(4681969, 1280, 853, 'cars-malta-classic-cars-vintage-4681969', 'cars, malta, classic cars, vintage, auto, automobile, austin, healey, collectable'),
65
+ hit(1461727, 1280, 856, 'automobile-flower-car-planted-car-1461727', 'automobile, flower car, beautiful flowers, planted car, flower wallpaper, planted, red, flower, flower background, deco, nature, red car, austin, austin-mini'),
66
+ hit(3545794, 1280, 640, 'traffic-automobile-antique-car-3545794', 'traffic, automobile, antique car, austin, blue, sports car, animals, peacock, bird, proudly, composing, feathers, vehicle, nature, to travel, luxury'),
67
+ hit(5313570, 1280, 853, 'nature-flower-blossoms-roses-5313570', 'nature, flower, blossoms, flower background, roses, english rose, flower wallpaper, beautiful flowers, austin rose, garden roses'),
68
+ hit(6885081, 1280, 854, 'knives-cutlery-kitchen-cooking-6885081', 'knives, cutlery, kitchen, cooking, tools, fork, silver, caterer, chop, ladle, metal, cut, kettle, spoon, baking, sharp, knives, knives, knives, knives'),
69
+ hit(3345330, 1280, 960, 'water-lake-river-tree-landscape-3345330', 'water, lake, river, tree, landscape, austin, ladybird, dam, sky, nature, scenery, united states, austin, texas'),
70
+ hit(1756159, 1280, 853, 'austin-texas-austin-tx-texas-1756159', 'austin texas, austin, tx, texas, cityscape, downtown, skyline, urban, america, usa, corporate, austin texas, austin texas, austin texas, austin texas, austin, austin, austin, austin, austin'),
71
+ hit(931131, 1280, 853, 'sisters-girls-field-running-931131', 'sisters, girls, field, running, playing, play, children, childhood, nature, sisterhood, summer, fun, children playing, siblings, young, happy, happiness, outdoors'),
72
+ hit(5756718, 1280, 719, 'buildings-lake-city-skyline-5756718', 'buildings, lake, city, skyline, skyscrapers, nature, downtown, urban, cityscape, austin, texas, usa, aerial view'),
73
+ hit(3255280, 1280, 1002, 'rose-red-david-austin-plant-garden-3255280', 'rose, rose flower, red, david austin, plant, garden, nature, isolated, cut out'),
74
+ hit(3176081, 1280, 851, 'architecture-city-water-reflection-3176081', 'architecture, nature, city, water, reflection, sky, austin, texas, lake, downtown, river, sunlight, scenic, forest, landscape, travel'),
75
+ hit(4477874, 1280, 853, 'family-game-fun-outdoors-playing-4477874', 'family, game, fun, outdoors, playing, family, family, family, family, family'),
76
+ hit(4059507, 1280, 541, 'texas-history-museum-education-4059507', 'texas history museum, education, attractions, tourism, landscape, austin, texas, panorama, building, sky, clouds, nature, trees, hdr, mood, landmark, america'),
77
+ hit(5739040, 1280, 853, 'pat-austin-rose-flower-petals-bloom-5739040', 'pat austin rose, flower, petals, flower wallpaper, flower background, beautiful flowers, bloom, nature, blossom, plant, flora, closeup'),
78
+ hit(4686574, 1280, 960, 'car-coupe-vintage-ancient-4686574', 'car, car wallpapers, coupe, vintage, ancient, austin-healey 3000, wheel, radio, detail'),
79
+ hit(5301421, 1280, 887, 'roses-nature-flower-english-roses-5301421', 'roses, nature, flower, english roses, romance, garden, close up, flower wallpaper, blossoms, rose blossom, austin rose, romantic, flower background, beautiful flowers, fragrance'),
80
+ hit(3468800, 1280, 863, 'austin-texas-tx-city-skyline-3468800', 'austin, texas, nature, tx, city, skyline, buildings, bridge, lake, lady bird lake, congress avenue bridge, blue bridge, blue lady'),
81
+ hit(210403, 1280, 960, 'catering-airport-plane-ever-entry-210403', 'catering, airport, plane, ever, entry, hull, aviation, air traffic, vacations, arrival, rear, charge, meal, food, nourishment, enjoy the meal, airfield, dusseldorf, airport düsseldorf, catering')
82
+ ];
83
+ /** `caterer` (horizontal, min_width 1600), answered 2026-10-15T18:47:45.261Z. */ export const CATERER = [
84
+ hit(3967304, 1280, 852, 'macaroon-caterer-plateau-food-3967304', 'macaroon, caterer, plateau, food, cocktail'),
85
+ hit(1566254, 1280, 848, 'table-wedding-table-covered-wedding-1566254', 'table, wedding table, covered, wedding, event, knives, fork, napkin, butterfly, restaurant, caterer, decoration, table decoration, wedding decoration, reception'),
86
+ hit(6885081, 1280, 854, 'knives-cutlery-kitchen-cooking-6885081', 'knives, cutlery, kitchen, cooking, tools, fork, silver, caterer, chop, ladle, metal, cut, kettle, spoon, baking, sharp, knives, knives, knives, knives'),
87
+ hit(210403, 1280, 960, 'catering-airport-plane-ever-entry-210403', 'catering, airport, plane, ever, entry, hull, aviation, air traffic, vacations, arrival, rear, charge, meal, food, nourishment, enjoy the meal, airfield, dusseldorf, airport düsseldorf, catering'),
88
+ hit(2009590, 1280, 854, 'christmas-wallpaper-platter-food-2009590', 'christmas wallpaper, platter, food, starters, meal, feast, dining table, table, eat, delicious food, restaurant, dining, cuisine, catering, buffet, flat lay'),
89
+ hit(1283608, 1280, 853, 'drinks-alcohol-glasses-champagne-1283608', 'drinks, alcohol, glasses, champagne, wine, serving trays, alcoholic drinks, beverage, refreshment, catering, wedding, party, event, celebration, alcohol, alcohol, champagne, champagne, champagne, champagne'),
90
+ hit(352475, 1280, 853, 'dessert-cupcakes-food-352475', 'dessert, cupcakes, food, strawberry cupcakes, snacks, sweets, confections, baked goods, pastries, tasty, delicious, cake stand, close up, eat, food photography, dessert, dessert, cupcakes, food, food'),
91
+ hit(2175326, 1280, 853, 'hors-doeuvre-starters-appetizers-2175326', "hors d'oeuvre, starters, appetizers, charcuterie, delicatessen, food platter, catering, cheese, salami, smoked beef, tomato, snack, bread, plate, cuisine, protein, antipasto, meat, tasty, platter"),
92
+ hit(5582984, 1280, 853, 'dessert-chocolate-food-sweets-nuts-5582984', 'dessert, chocolate, food, sweets, nuts, tasty, delicious, dessert buffet, glasses, chocolate, chocolate, chocolate, chocolate, chocolate'),
93
+ hit(179046, 1280, 852, 'catering-buffet-food-olives-179046', 'catering, buffet, food, olives, restaurant, cater, party, table, banquet, decoration, catering, catering, catering, catering, buffet, olives, restaurant, restaurant, restaurant, party'),
94
+ hit(176991, 1280, 1024, 'wine-glasses-stemware-crystal-party-176991', 'wine glasses, stemware, crystal, party, glasses, elegant, restaurant, blue wine, blue restaurant, blue party, blue glass, blue glasses, party, party, restaurant, restaurant, restaurant, restaurant, restaurant'),
95
+ hit(594496, 1280, 806, 'chunks-to-dish-out-menu-gastronomy-594496', 'chunks, to dish out, menu, gastronomy, gourmet, meal, greetings from the kitchen, amuse gueule, menu, menu, menu, menu, menu, gastronomy, gastronomy, gastronomy, gourmet, gourmet, gourmet, gourmet'),
96
+ hit(3604064, 1280, 853, 'table-setting-table-arrangement-3604064', 'table setting, table arrangement, tableware, glassware, glasses, banquet table, table decoration, dining, table setting, tableware, banquet table, dining, dining, dining, dining, dining'),
97
+ hit(1206687, 1280, 853, 'skewers-food-party-chunks-1206687', 'skewers, food, party, chunks, mozzarella, olives, celebration, appetizer, vegetables, dish, table, party, party, party, party, party'),
98
+ hit(6657853, 1280, 854, 'table-restaurant-plate-cafe-fork-6657853', 'table, restaurant, plate, cafe, fork, knife, napkin, garden, nature, ornament, decor, decoration, decorative'),
99
+ hit(5993768, 1280, 855, 'eggs-egg-shells-tray-food-catering-5993768', 'eggs, egg shells, tray, food, catering, ingredients'),
100
+ hit(4511335, 1280, 854, 'food-catering-africa-4511335', 'food, catering, africa, catering, catering, catering, catering, catering'),
101
+ hit(5109778, 1280, 1280, 'pizza-italian-delivery-catering-5109778', 'pizza, italian, delivery, catering, home party, dinner'),
102
+ hit(5981612, 1280, 720, 'tunnel-greenhouse-cultivation-5981612', 'tunnel greenhouse, cultivation, nature, kitchen, garden, vegetables, vegetable land, gardening, self catering'),
103
+ hit(4118085, 1280, 853, 'rolls-kaiser-rolls-catering-baked-4118085', 'rolls, kaiser rolls, catering, baked, food, baker, kaiser rolls, kaiser rolls, kaiser rolls, kaiser rolls, kaiser rolls, catering'),
104
+ hit(2534606, 1280, 751, 'antique-car-classic-automobile-2534606', 'antique car, classic, automobile, vehicles, old, snack, hot dog, kiosk, foot truck, truck, food, meal, hunger, coffee, green, old vehicle, transporter, vintage car automobile, street food, rarity'),
105
+ hit(7438072, 1280, 854, 'vegetables-cook-catering-cooking-7438072', 'vegetables, cook, catering, cooking, benchtops, supplier, manufacturer, manufacturing, catering, catering, catering, catering, catering'),
106
+ hit(2655778, 1280, 853, 'food-buffet-restaurant-lunch-2655778', 'food, buffet, restaurant, lunch, catering, plate, cuisine, people, dining, party, dinner, meal, celebration, table, event, dish, gray food, gray restaurant, gray party, gray table'),
107
+ hit(8044946, 1280, 853, 'historic-center-alley-restaurant-8044946', 'historic center, alley, restaurant, historic centre, local, gastronomy, outdoor catering, greece'),
108
+ hit(4625940, 1280, 960, 'food-meat-catering-meal-bbq-4625940', 'food, meat, catering, meal, bbq, barbecue, grilled, catering, catering, catering, catering, catering, bbq, bbq, bbq, bbq, bbq'),
109
+ hit(4235910, 1280, 854, 'sashimi-platter-dinner-4235910', 'sashimi, platter, dinner, japanese meal, catering, delicious, cooking, sound, sashimi, sashimi, sashimi, sashimi, sashimi, catering, catering, sound'),
110
+ hit(4082705, 1280, 848, 'street-cafe-outdoors-restaurant-4082705', 'street cafe, outdoors, restaurant, gastronomy, outdoor catering'),
111
+ hit(7073759, 1280, 960, 'bun-tomatoes-snack-loaf-healthy-7073759', 'bun, tomatoes, snack, loaf, healthy, catering, chunks, food, catering, catering, catering, catering, catering'),
112
+ hit(3911154, 1280, 853, 'breakfast-banquet-catering-table-3911154', 'breakfast, banquet, catering, table, meal, restaurant, serving, dine, plate, wooden, juice, pepper'),
113
+ hit(4003652, 1280, 853, 'wings-bbq-barbecue-chicken-food-4003652', 'wings, bbq, barbecue, chicken, food, meat, delicious, grill, tasty, eat, restaurant, sauce, grilled, dinner, spicy, fried, appetizer, catering, wing, cuisine'),
114
+ hit(3728754, 1280, 853, 'hotel-breakfast-breakfast-buffet-3728754', 'hotel, breakfast, breakfast buffet, gastronomy, fruit, nourishment, enjoy the meal, restaurant, fresh, yummy, tasty, enjoyment, bio, comfortable, in the morning, kitchen, space, room, hotel, kitchen'),
115
+ hit(3393433, 1280, 720, 'moscow-cateral-russia-religion-3393433', 'moscow, cateral, russia, religion, dome, orthodox'),
116
+ hit(315691, 1280, 853, 'buffet-indian-food-spices-lunch-315691', 'buffet, indian, food, spices, lunch, restaurant, cuisine, dinner, spicy, cooking, eating, meal, gourmet, delicious, traditional, india, catering, dining, tasty, brown food'),
117
+ hit(1812772, 1280, 853, 'exclusive-banquet-adoption-1812772', 'exclusive banquet, adoption, business meeting, wedding, the ceremony, restaurant, dinner, party, table, flower wallpaper, eat, bouquet, arrangement, alcohol, wine, flowers, tablecloth, decoration, composition, cutlery'),
118
+ hit(3592178, 1280, 853, 'glass-catering-architecture-3592178', 'glass, catering, architecture, building, urban, passage, people'),
119
+ hit(3393435, 1280, 850, 'moscow-cateral-russia-religion-3393435', 'moscow, cateral, russia, religion, dome, orthodox, gold, cathedral dome, kremlin'),
120
+ hit(3393436, 1280, 720, 'moscow-cateral-russia-religion-3393436', 'moscow, cateral, russia, religion, dome, orthodox, gold, cathedral dome, kremlin'),
121
+ hit(4589759, 1280, 853, 'chicken-and-waffles-fried-chicken-4589759', 'chicken and waffles, fried chicken, chicken, food, meat, table, catering, skewers, waffles, picnic, outdoor dining, dining, bbq, barbeque, fried chicken, catering, catering, catering, catering, catering'),
122
+ hit(8388203, 1280, 853, 'meal-food-party-buffet-cold-buffet-8388203', 'meal, food, party, buffet, cold buffet, yummy, catering, sausage'),
123
+ hit(3354402, 1280, 914, 'people-adult-indoors-restaurant-3354402', 'people, adult, indoors, restaurant, woman, service, table, catering, gray restaurant, gray table, gray service, catering, catering, catering, catering, catering')
124
+ ];
125
+
126
+ //# sourceMappingURL=ai-stock-photo-copper-kettle-recordings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../libs/plugins/ai/src/lib/jobs/fixtures/ai-stock-photo-copper-kettle-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 COPPER KETTLE CATERING HERO (AGL-3831):\n * what production's `stockPhotoSearches` cache held for the two searches the\n * beta.257 restaurant site \"Copper Kettle Catering\" (\"Family-run Austin\n * caterer: Texas barbecue and Tex-Mex for weddings, office lunches and\n * parties\", job mRxC_v18aH, 2026-10-15) sent for its home hero, read back\n * from the cache, never searched again. Ids, sizes, page slugs and tags are\n * Pixabay's own, in its order; the contributor is left out. Each search was\n * matched to its cache entry by the entry's key.\n *\n * The hero was held to the craft \"caterer\", and a photo of catering is\n * tagged \"catering\", \"buffet\", \"bbq\": only three hits said \"caterer\", none\n * first, so nothing was accepted and the starter pottery photo filled the\n * hero under the model's words \"A spread of smoked brisket, fajitas and sides\n * on a long catering table\".\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/** `family-run austin caterer` (horizontal, min_width 1600), answered 2026-10-15T18:47:45.010Z. */\nexport const FAMILY_RUN_AUSTIN_CATERER: StockPhoto[] = [\n hit(\n 3860567,\n 1280,\n 853,\n 'austin-healey-car-automobile-3860567',\n 'austin healey, car, automobile, vehicle, austin, retro, healey, vintage, chromium, car wallpapers, speed',\n ),\n hit(\n 2999867,\n 1280,\n 853,\n 'traffic-automobile-antique-car-2999867',\n 'traffic, automobile, car wallpapers, antique car, austin, austin healey, convertible, sports car, headlights, grille, parrot, composing, blue, car, driving a car',\n ),\n hit(\n 5276620,\n 1280,\n 853,\n 'old-buda-texas-city-park-entrance-5276620',\n 'old buda texas city park entrance, vintage, historical, park, buda, buda texas, atx, texas, central texas, austin, austin texas, city park, texas, central texas, austin texas, austin texas, austin texas, austin texas, austin texas',\n ),\n hit(\n 4877118,\n 1280,\n 853,\n 'cypress-tree-roots-nature-texas-4877118',\n 'cypress, tree, roots, nature, texas, austin, atx, river, forest, natural, landscape, waterway, cypress, cypress, cypress, cypress, texas, texas, austin, austin',\n ),\n hit(\n 4066441,\n 1280,\n 901,\n 'texas-state-capitol-austin-america-4066441',\n 'texas state capitol, austin, america, architecture, government, dome, landscape, mood, hdr, landmark, historic, austin, austin, austin, austin, austin',\n ),\n hit(\n 3345327,\n 1280,\n 914,\n 'water-nature-river-landscape-lake-3345327',\n 'water, nature, river, landscape, lake, bats, austin, reflection, sunset, tranquil, united states, austin, texas',\n ),\n hit(\n 5029318,\n 1280,\n 853,\n 'chinese-rose-rose-flower-rose-5029318',\n 'chinese rose, rose flower, rose, gold celebration, austin, chinese rose, chinese rose, chinese rose, chinese rose, chinese rose, rose, austin',\n ),\n hit(\n 3967304,\n 1280,\n 852,\n 'macaroon-caterer-plateau-food-3967304',\n 'macaroon, caterer, plateau, food, cocktail',\n ),\n hit(\n 5357325,\n 1280,\n 854,\n 'river-austin-viewing-bats-texas-5357325',\n 'river, austin, nature, viewing, bats, texas, water, landscape, bridge',\n ),\n hit(\n 4549223,\n 1280,\n 853,\n 'transport-traffic-automobile-4549223',\n 'transport, traffic, automobile, sports car, austin, blue, cabriolet, antique car, car wallpapers, car',\n ),\n hit(\n 3409985,\n 1280,\n 853,\n 'texas-art-wall-street-art-urban-3409985',\n 'texas, art, wall, street art, urban, austin, blue art, blue wall, blue street, austin, austin, austin, austin, austin',\n ),\n hit(\n 4699178,\n 1280,\n 960,\n 'austin-healey-car-classic-sport-4699178',\n 'austin healey, car, classic, sport, car wallpapers, coupe, austin healey 3000, motot, calender, hood, detail, design, red',\n ),\n hit(\n 7933399,\n 1280,\n 670,\n 'austin-texas-river-buildings-city-7933399',\n 'austin, texas, river, buildings, city, urban, cityscape, travel, architecture, usa, nature, spring, austin, austin, austin, austin, austin',\n ),\n hit(\n 1566254,\n 1280,\n 848,\n 'table-wedding-table-covered-wedding-1566254',\n 'table, wedding table, covered, wedding, event, knives, fork, napkin, butterfly, restaurant, caterer, decoration, table decoration, wedding decoration, reception',\n ),\n hit(\n 173907,\n 1280,\n 960,\n 'austin-texas-architecture-skyline-173907',\n 'austin, texas, architecture, skyline, city, cityscape, tower, skyscraper, building, landmark, urban, scenic, scenery, downtown, metropolis, buildings, metropolitan, austin, austin, austin',\n ),\n hit(\n 4064427,\n 1280,\n 853,\n 'austin-texas-bridge-bats-sunset-4064427',\n 'austin, texas, bridge, bats, sunset, river, lake, downtown, nature, cityscape, tx, sky',\n ),\n hit(\n 3178752,\n 1280,\n 851,\n 'architecture-city-skyline-3178752',\n 'architecture, city, nature, skyline, skyscraper, cityscape, austin, texas, lake, blue, buildings, reflections, panorama, downtown, tourism',\n ),\n hit(\n 4874473,\n 1280,\n 853,\n 'windmill-water-tanks-ranch-rural-4874473',\n 'windmill, water tanks, ranch, rural, farm, old windmill, water storage, meadow, landscape, countryside, austin, texas, old windmill, water storage, water storage, texas, texas, texas, texas, texas',\n ),\n hit(\n 3468795,\n 1280,\n 847,\n 'austin-texas-tx-bridge-lake-3468795',\n 'austin, texas, nature, tx, bridge, lake, skyline, city, lady bird lake, congress avenue bridge',\n ),\n hit(\n 4874396,\n 1280,\n 853,\n 'texas-scenic-landscape-countryside-4874396',\n 'texas, scenic, landscape, countryside, shed, cactus, country, outdoors, rural, travel, austin, tx',\n ),\n hit(\n 4822547,\n 1280,\n 757,\n 'flower-yellow-rose-david-austin-4822547',\n 'flower, yellow, rose, flower background, david austin, flower wallpaper, beautiful flowers, greeting card, decoration, rose flower, cut out, isolated, garden, nature',\n ),\n hit(\n 4357790,\n 1280,\n 857,\n 'shepherd-dog-dog-domestic-animal-4357790',\n 'shepherd dog, nature, dog, domestic animal, animal, dog puppy, baby dog, young and old, pet, old german shepherd dog, puppy',\n ),\n hit(\n 4681969,\n 1280,\n 853,\n 'cars-malta-classic-cars-vintage-4681969',\n 'cars, malta, classic cars, vintage, auto, automobile, austin, healey, collectable',\n ),\n hit(\n 1461727,\n 1280,\n 856,\n 'automobile-flower-car-planted-car-1461727',\n 'automobile, flower car, beautiful flowers, planted car, flower wallpaper, planted, red, flower, flower background, deco, nature, red car, austin, austin-mini',\n ),\n hit(\n 3545794,\n 1280,\n 640,\n 'traffic-automobile-antique-car-3545794',\n 'traffic, automobile, antique car, austin, blue, sports car, animals, peacock, bird, proudly, composing, feathers, vehicle, nature, to travel, luxury',\n ),\n hit(\n 5313570,\n 1280,\n 853,\n 'nature-flower-blossoms-roses-5313570',\n 'nature, flower, blossoms, flower background, roses, english rose, flower wallpaper, beautiful flowers, austin rose, garden roses',\n ),\n hit(\n 6885081,\n 1280,\n 854,\n 'knives-cutlery-kitchen-cooking-6885081',\n 'knives, cutlery, kitchen, cooking, tools, fork, silver, caterer, chop, ladle, metal, cut, kettle, spoon, baking, sharp, knives, knives, knives, knives',\n ),\n hit(\n 3345330,\n 1280,\n 960,\n 'water-lake-river-tree-landscape-3345330',\n 'water, lake, river, tree, landscape, austin, ladybird, dam, sky, nature, scenery, united states, austin, texas',\n ),\n hit(\n 1756159,\n 1280,\n 853,\n 'austin-texas-austin-tx-texas-1756159',\n 'austin texas, austin, tx, texas, cityscape, downtown, skyline, urban, america, usa, corporate, austin texas, austin texas, austin texas, austin texas, austin, austin, austin, austin, austin',\n ),\n hit(\n 931131,\n 1280,\n 853,\n 'sisters-girls-field-running-931131',\n 'sisters, girls, field, running, playing, play, children, childhood, nature, sisterhood, summer, fun, children playing, siblings, young, happy, happiness, outdoors',\n ),\n hit(\n 5756718,\n 1280,\n 719,\n 'buildings-lake-city-skyline-5756718',\n 'buildings, lake, city, skyline, skyscrapers, nature, downtown, urban, cityscape, austin, texas, usa, aerial view',\n ),\n hit(\n 3255280,\n 1280,\n 1002,\n 'rose-red-david-austin-plant-garden-3255280',\n 'rose, rose flower, red, david austin, plant, garden, nature, isolated, cut out',\n ),\n hit(\n 3176081,\n 1280,\n 851,\n 'architecture-city-water-reflection-3176081',\n 'architecture, nature, city, water, reflection, sky, austin, texas, lake, downtown, river, sunlight, scenic, forest, landscape, travel',\n ),\n hit(\n 4477874,\n 1280,\n 853,\n 'family-game-fun-outdoors-playing-4477874',\n 'family, game, fun, outdoors, playing, family, family, family, family, family',\n ),\n hit(\n 4059507,\n 1280,\n 541,\n 'texas-history-museum-education-4059507',\n 'texas history museum, education, attractions, tourism, landscape, austin, texas, panorama, building, sky, clouds, nature, trees, hdr, mood, landmark, america',\n ),\n hit(\n 5739040,\n 1280,\n 853,\n 'pat-austin-rose-flower-petals-bloom-5739040',\n 'pat austin rose, flower, petals, flower wallpaper, flower background, beautiful flowers, bloom, nature, blossom, plant, flora, closeup',\n ),\n hit(\n 4686574,\n 1280,\n 960,\n 'car-coupe-vintage-ancient-4686574',\n 'car, car wallpapers, coupe, vintage, ancient, austin-healey 3000, wheel, radio, detail',\n ),\n hit(\n 5301421,\n 1280,\n 887,\n 'roses-nature-flower-english-roses-5301421',\n 'roses, nature, flower, english roses, romance, garden, close up, flower wallpaper, blossoms, rose blossom, austin rose, romantic, flower background, beautiful flowers, fragrance',\n ),\n hit(\n 3468800,\n 1280,\n 863,\n 'austin-texas-tx-city-skyline-3468800',\n 'austin, texas, nature, tx, city, skyline, buildings, bridge, lake, lady bird lake, congress avenue bridge, blue bridge, blue lady',\n ),\n hit(\n 210403,\n 1280,\n 960,\n 'catering-airport-plane-ever-entry-210403',\n 'catering, airport, plane, ever, entry, hull, aviation, air traffic, vacations, arrival, rear, charge, meal, food, nourishment, enjoy the meal, airfield, dusseldorf, airport düsseldorf, catering',\n ),\n]\n/** `caterer` (horizontal, min_width 1600), answered 2026-10-15T18:47:45.261Z. */\nexport const CATERER: StockPhoto[] = [\n hit(\n 3967304,\n 1280,\n 852,\n 'macaroon-caterer-plateau-food-3967304',\n 'macaroon, caterer, plateau, food, cocktail',\n ),\n hit(\n 1566254,\n 1280,\n 848,\n 'table-wedding-table-covered-wedding-1566254',\n 'table, wedding table, covered, wedding, event, knives, fork, napkin, butterfly, restaurant, caterer, decoration, table decoration, wedding decoration, reception',\n ),\n hit(\n 6885081,\n 1280,\n 854,\n 'knives-cutlery-kitchen-cooking-6885081',\n 'knives, cutlery, kitchen, cooking, tools, fork, silver, caterer, chop, ladle, metal, cut, kettle, spoon, baking, sharp, knives, knives, knives, knives',\n ),\n hit(\n 210403,\n 1280,\n 960,\n 'catering-airport-plane-ever-entry-210403',\n 'catering, airport, plane, ever, entry, hull, aviation, air traffic, vacations, arrival, rear, charge, meal, food, nourishment, enjoy the meal, airfield, dusseldorf, airport düsseldorf, catering',\n ),\n hit(\n 2009590,\n 1280,\n 854,\n 'christmas-wallpaper-platter-food-2009590',\n 'christmas wallpaper, platter, food, starters, meal, feast, dining table, table, eat, delicious food, restaurant, dining, cuisine, catering, buffet, flat lay',\n ),\n hit(\n 1283608,\n 1280,\n 853,\n 'drinks-alcohol-glasses-champagne-1283608',\n 'drinks, alcohol, glasses, champagne, wine, serving trays, alcoholic drinks, beverage, refreshment, catering, wedding, party, event, celebration, alcohol, alcohol, champagne, champagne, champagne, champagne',\n ),\n hit(\n 352475,\n 1280,\n 853,\n 'dessert-cupcakes-food-352475',\n 'dessert, cupcakes, food, strawberry cupcakes, snacks, sweets, confections, baked goods, pastries, tasty, delicious, cake stand, close up, eat, food photography, dessert, dessert, cupcakes, food, food',\n ),\n hit(\n 2175326,\n 1280,\n 853,\n 'hors-doeuvre-starters-appetizers-2175326',\n \"hors d'oeuvre, starters, appetizers, charcuterie, delicatessen, food platter, catering, cheese, salami, smoked beef, tomato, snack, bread, plate, cuisine, protein, antipasto, meat, tasty, platter\",\n ),\n hit(\n 5582984,\n 1280,\n 853,\n 'dessert-chocolate-food-sweets-nuts-5582984',\n 'dessert, chocolate, food, sweets, nuts, tasty, delicious, dessert buffet, glasses, chocolate, chocolate, chocolate, chocolate, chocolate',\n ),\n hit(\n 179046,\n 1280,\n 852,\n 'catering-buffet-food-olives-179046',\n 'catering, buffet, food, olives, restaurant, cater, party, table, banquet, decoration, catering, catering, catering, catering, buffet, olives, restaurant, restaurant, restaurant, party',\n ),\n hit(\n 176991,\n 1280,\n 1024,\n 'wine-glasses-stemware-crystal-party-176991',\n 'wine glasses, stemware, crystal, party, glasses, elegant, restaurant, blue wine, blue restaurant, blue party, blue glass, blue glasses, party, party, restaurant, restaurant, restaurant, restaurant, restaurant',\n ),\n hit(\n 594496,\n 1280,\n 806,\n 'chunks-to-dish-out-menu-gastronomy-594496',\n 'chunks, to dish out, menu, gastronomy, gourmet, meal, greetings from the kitchen, amuse gueule, menu, menu, menu, menu, menu, gastronomy, gastronomy, gastronomy, gourmet, gourmet, gourmet, gourmet',\n ),\n hit(\n 3604064,\n 1280,\n 853,\n 'table-setting-table-arrangement-3604064',\n 'table setting, table arrangement, tableware, glassware, glasses, banquet table, table decoration, dining, table setting, tableware, banquet table, dining, dining, dining, dining, dining',\n ),\n hit(\n 1206687,\n 1280,\n 853,\n 'skewers-food-party-chunks-1206687',\n 'skewers, food, party, chunks, mozzarella, olives, celebration, appetizer, vegetables, dish, table, party, party, party, party, party',\n ),\n hit(\n 6657853,\n 1280,\n 854,\n 'table-restaurant-plate-cafe-fork-6657853',\n 'table, restaurant, plate, cafe, fork, knife, napkin, garden, nature, ornament, decor, decoration, decorative',\n ),\n hit(\n 5993768,\n 1280,\n 855,\n 'eggs-egg-shells-tray-food-catering-5993768',\n 'eggs, egg shells, tray, food, catering, ingredients',\n ),\n hit(\n 4511335,\n 1280,\n 854,\n 'food-catering-africa-4511335',\n 'food, catering, africa, catering, catering, catering, catering, catering',\n ),\n hit(\n 5109778,\n 1280,\n 1280,\n 'pizza-italian-delivery-catering-5109778',\n 'pizza, italian, delivery, catering, home party, dinner',\n ),\n hit(\n 5981612,\n 1280,\n 720,\n 'tunnel-greenhouse-cultivation-5981612',\n 'tunnel greenhouse, cultivation, nature, kitchen, garden, vegetables, vegetable land, gardening, self catering',\n ),\n hit(\n 4118085,\n 1280,\n 853,\n 'rolls-kaiser-rolls-catering-baked-4118085',\n 'rolls, kaiser rolls, catering, baked, food, baker, kaiser rolls, kaiser rolls, kaiser rolls, kaiser rolls, kaiser rolls, catering',\n ),\n hit(\n 2534606,\n 1280,\n 751,\n 'antique-car-classic-automobile-2534606',\n 'antique car, classic, automobile, vehicles, old, snack, hot dog, kiosk, foot truck, truck, food, meal, hunger, coffee, green, old vehicle, transporter, vintage car automobile, street food, rarity',\n ),\n hit(\n 7438072,\n 1280,\n 854,\n 'vegetables-cook-catering-cooking-7438072',\n 'vegetables, cook, catering, cooking, benchtops, supplier, manufacturer, manufacturing, catering, catering, catering, catering, catering',\n ),\n hit(\n 2655778,\n 1280,\n 853,\n 'food-buffet-restaurant-lunch-2655778',\n 'food, buffet, restaurant, lunch, catering, plate, cuisine, people, dining, party, dinner, meal, celebration, table, event, dish, gray food, gray restaurant, gray party, gray table',\n ),\n hit(\n 8044946,\n 1280,\n 853,\n 'historic-center-alley-restaurant-8044946',\n 'historic center, alley, restaurant, historic centre, local, gastronomy, outdoor catering, greece',\n ),\n hit(\n 4625940,\n 1280,\n 960,\n 'food-meat-catering-meal-bbq-4625940',\n 'food, meat, catering, meal, bbq, barbecue, grilled, catering, catering, catering, catering, catering, bbq, bbq, bbq, bbq, bbq',\n ),\n hit(\n 4235910,\n 1280,\n 854,\n 'sashimi-platter-dinner-4235910',\n 'sashimi, platter, dinner, japanese meal, catering, delicious, cooking, sound, sashimi, sashimi, sashimi, sashimi, sashimi, catering, catering, sound',\n ),\n hit(\n 4082705,\n 1280,\n 848,\n 'street-cafe-outdoors-restaurant-4082705',\n 'street cafe, outdoors, restaurant, gastronomy, outdoor catering',\n ),\n hit(\n 7073759,\n 1280,\n 960,\n 'bun-tomatoes-snack-loaf-healthy-7073759',\n 'bun, tomatoes, snack, loaf, healthy, catering, chunks, food, catering, catering, catering, catering, catering',\n ),\n hit(\n 3911154,\n 1280,\n 853,\n 'breakfast-banquet-catering-table-3911154',\n 'breakfast, banquet, catering, table, meal, restaurant, serving, dine, plate, wooden, juice, pepper',\n ),\n hit(\n 4003652,\n 1280,\n 853,\n 'wings-bbq-barbecue-chicken-food-4003652',\n 'wings, bbq, barbecue, chicken, food, meat, delicious, grill, tasty, eat, restaurant, sauce, grilled, dinner, spicy, fried, appetizer, catering, wing, cuisine',\n ),\n hit(\n 3728754,\n 1280,\n 853,\n 'hotel-breakfast-breakfast-buffet-3728754',\n 'hotel, breakfast, breakfast buffet, gastronomy, fruit, nourishment, enjoy the meal, restaurant, fresh, yummy, tasty, enjoyment, bio, comfortable, in the morning, kitchen, space, room, hotel, kitchen',\n ),\n hit(\n 3393433,\n 1280,\n 720,\n 'moscow-cateral-russia-religion-3393433',\n 'moscow, cateral, russia, religion, dome, orthodox',\n ),\n hit(\n 315691,\n 1280,\n 853,\n 'buffet-indian-food-spices-lunch-315691',\n 'buffet, indian, food, spices, lunch, restaurant, cuisine, dinner, spicy, cooking, eating, meal, gourmet, delicious, traditional, india, catering, dining, tasty, brown food',\n ),\n hit(\n 1812772,\n 1280,\n 853,\n 'exclusive-banquet-adoption-1812772',\n 'exclusive banquet, adoption, business meeting, wedding, the ceremony, restaurant, dinner, party, table, flower wallpaper, eat, bouquet, arrangement, alcohol, wine, flowers, tablecloth, decoration, composition, cutlery',\n ),\n hit(\n 3592178,\n 1280,\n 853,\n 'glass-catering-architecture-3592178',\n 'glass, catering, architecture, building, urban, passage, people',\n ),\n hit(\n 3393435,\n 1280,\n 850,\n 'moscow-cateral-russia-religion-3393435',\n 'moscow, cateral, russia, religion, dome, orthodox, gold, cathedral dome, kremlin',\n ),\n hit(\n 3393436,\n 1280,\n 720,\n 'moscow-cateral-russia-religion-3393436',\n 'moscow, cateral, russia, religion, dome, orthodox, gold, cathedral dome, kremlin',\n ),\n hit(\n 4589759,\n 1280,\n 853,\n 'chicken-and-waffles-fried-chicken-4589759',\n 'chicken and waffles, fried chicken, chicken, food, meat, table, catering, skewers, waffles, picnic, outdoor dining, dining, bbq, barbeque, fried chicken, catering, catering, catering, catering, catering',\n ),\n hit(\n 8388203,\n 1280,\n 853,\n 'meal-food-party-buffet-cold-buffet-8388203',\n 'meal, food, party, buffet, cold buffet, yummy, catering, sausage',\n ),\n hit(\n 3354402,\n 1280,\n 914,\n 'people-adult-indoors-restaurant-3354402',\n 'people, adult, indoors, restaurant, woman, service, table, catering, gray restaurant, gray table, gray service, catering, catering, catering, catering, catering',\n ),\n]\n"],"names":["hit","id","width","height","slug","tags","provider","String","pageUrl","photographer","split","downloadUrl","FAMILY_RUN_AUSTIN_CATERER","CATERER"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAID;;;;;;;;;;;;;;;CAeC,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,iGAAiG,GACjG,OAAO,MAAMW,4BAA0C;IACrDZ,IACE,SACA,MACA,KACA,wCACA;IAEFA,IACE,SACA,MACA,KACA,0CACA;IAEFA,IACE,SACA,MACA,KACA,6CACA;IAEFA,IACE,SACA,MACA,KACA,2CACA;IAEFA,IACE,SACA,MACA,KACA,8CACA;IAEFA,IACE,SACA,MACA,KACA,6CACA;IAEFA,IACE,SACA,MACA,KACA,yCACA;IAEFA,IACE,SACA,MACA,KACA,yCACA;IAEFA,IACE,SACA,MACA,KACA,2CACA;IAEFA,IACE,SACA,MACA,KACA,wCACA;IAEFA,IACE,SACA,MACA,KACA,2CACA;IAEFA,IACE,SACA,MACA,KACA,2CACA;IAEFA,IACE,SACA,MACA,KACA,6CACA;IAEFA,IACE,SACA,MACA,KACA,+CACA;IAEFA,IACE,QACA,MACA,KACA,4CACA;IAEFA,IACE,SACA,MACA,KACA,2CACA;IAEFA,IACE,SACA,MACA,KACA,qCACA;IAEFA,IACE,SACA,MACA,KACA,4CACA;IAEFA,IACE,SACA,MACA,KACA,uCACA;IAEFA,IACE,SACA,MACA,KACA,8CACA;IAEFA,IACE,SACA,MACA,KACA,2CACA;IAEFA,IACE,SACA,MACA,KACA,4CACA;IAEFA,IACE,SACA,MACA,KACA,2CACA;IAEFA,IACE,SACA,MACA,KACA,6CACA;IAEFA,IACE,SACA,MACA,KACA,0CACA;IAEFA,IACE,SACA,MACA,KACA,wCACA;IAEFA,IACE,SACA,MACA,KACA,0CACA;IAEFA,IACE,SACA,MACA,KACA,2CACA;IAEFA,IACE,SACA,MACA,KACA,wCACA;IAEFA,IACE,QACA,MACA,KACA,sCACA;IAEFA,IACE,SACA,MACA,KACA,uCACA;IAEFA,IACE,SACA,MACA,MACA,8CACA;IAEFA,IACE,SACA,MACA,KACA,8CACA;IAEFA,IACE,SACA,MACA,KACA,4CACA;IAEFA,IACE,SACA,MACA,KACA,0CACA;IAEFA,IACE,SACA,MACA,KACA,+CACA;IAEFA,IACE,SACA,MACA,KACA,qCACA;IAEFA,IACE,SACA,MACA,KACA,6CACA;IAEFA,IACE,SACA,MACA,KACA,wCACA;IAEFA,IACE,QACA,MACA,KACA,4CACA;CAEH,CAAA;AACD,+EAA+E,GAC/E,OAAO,MAAMa,UAAwB;IACnCb,IACE,SACA,MACA,KACA,yCACA;IAEFA,IACE,SACA,MACA,KACA,+CACA;IAEFA,IACE,SACA,MACA,KACA,0CACA;IAEFA,IACE,QACA,MACA,KACA,4CACA;IAEFA,IACE,SACA,MACA,KACA,4CACA;IAEFA,IACE,SACA,MACA,KACA,4CACA;IAEFA,IACE,QACA,MACA,KACA,gCACA;IAEFA,IACE,SACA,MACA,KACA,4CACA;IAEFA,IACE,SACA,MACA,KACA,8CACA;IAEFA,IACE,QACA,MACA,KACA,sCACA;IAEFA,IACE,QACA,MACA,MACA,8CACA;IAEFA,IACE,QACA,MACA,KACA,6CACA;IAEFA,IACE,SACA,MACA,KACA,2CACA;IAEFA,IACE,SACA,MACA,KACA,qCACA;IAEFA,IACE,SACA,MACA,KACA,4CACA;IAEFA,IACE,SACA,MACA,KACA,8CACA;IAEFA,IACE,SACA,MACA,KACA,gCACA;IAEFA,IACE,SACA,MACA,MACA,2CACA;IAEFA,IACE,SACA,MACA,KACA,yCACA;IAEFA,IACE,SACA,MACA,KACA,6CACA;IAEFA,IACE,SACA,MACA,KACA,0CACA;IAEFA,IACE,SACA,MACA,KACA,4CACA;IAEFA,IACE,SACA,MACA,KACA,wCACA;IAEFA,IACE,SACA,MACA,KACA,4CACA;IAEFA,IACE,SACA,MACA,KACA,uCACA;IAEFA,IACE,SACA,MACA,KACA,kCACA;IAEFA,IACE,SACA,MACA,KACA,2CACA;IAEFA,IACE,SACA,MACA,KACA,2CACA;IAEFA,IACE,SACA,MACA,KACA,4CACA;IAEFA,IACE,SACA,MACA,KACA,2CACA;IAEFA,IACE,SACA,MACA,KACA,4CACA;IAEFA,IACE,SACA,MACA,KACA,0CACA;IAEFA,IACE,QACA,MACA,KACA,0CACA;IAEFA,IACE,SACA,MACA,KACA,sCACA;IAEFA,IACE,SACA,MACA,KACA,uCACA;IAEFA,IACE,SACA,MACA,KACA,0CACA;IAEFA,IACE,SACA,MACA,KACA,0CACA;IAEFA,IACE,SACA,MACA,KACA,6CACA;IAEFA,IACE,SACA,MACA,KACA,8CACA;IAEFA,IACE,SACA,MACA,KACA,2CACA;CAEH,CAAA"}
@@ -33,8 +33,8 @@ import { aiLayoutSpans, AI_LAYOUT_FRAMES, AiLayoutTreeBuilder } from "./ai-layou
33
33
  * the plan left in brackets taken out. A live blog plan (2026-10-09) named a
34
34
  * section "reader notes and kind words [to be added by owner]"; carried into
35
35
  * the label it read as a gap, and the page's gap pass took the section out.
36
- */ function sectionLabel(name, index) {
37
- return aiLayoutFitText(name.replace(/\[[^\]]*\]/g, ' ').replace(/\s+/g, ' ').trim(), 'note') || `Section ${index + 1}`;
36
+ */ function sectionLabel(name, index, language) {
37
+ return aiLayoutFitText(name.replace(/\[[^\]]*\]/g, ' ').replace(/\s+/g, ' ').trim(), 'note', language) || `Section ${index + 1}`;
38
38
  }
39
39
  /** A section root's id where the caller gives none. */ function sectionIdOf(index) {
40
40
  return `section-${index + 1}`;
@@ -262,7 +262,7 @@ function compileSection(page, raw, index) {
262
262
  // heading, the first section always carries the page's one h1, and a
263
263
  // heading written after a group whose titles sit under it moves above it.
264
264
  const inOrder = ()=>head.concat(filled.flatMap((entry)=>entry.column), tail);
265
- const speaks = (block)=>block.kind === 'heading' && !!aiLayoutWords(block.text, 'heading', page.targets.facts);
265
+ const speaks = (block)=>block.kind === 'heading' && !!aiLayoutWords(block.text, 'heading', page.targets.facts, page.options.language);
266
266
  for (const list of [
267
267
  head,
268
268
  tail,
@@ -357,7 +357,7 @@ function compileSection(page, raw, index) {
357
357
  const name = ((_page_plan_sections_index1 = page.plan.sections[index]) == null ? void 0 : (_page_plan_sections_index_name = _page_plan_sections_index1.name) == null ? void 0 : _page_plan_sections_index_name.trim()) || `Section ${index + 1}`;
358
358
  return tree.add('section', _extends({
359
359
  element: 'section',
360
- ariaLabel: sectionLabel(name, index)
360
+ ariaLabel: sectionLabel(name, index, page.options.language)
361
361
  }, band === 'dark' ? {
362
362
  colorScheme: 'dark'
363
363
  } : {}), bandSx(band), [
@@ -700,7 +700,7 @@ function align(scope) {
700
700
  } : {};
701
701
  }
702
702
  function words(scope, block, place, variant, props, sx) {
703
- const text = aiLayoutWords(block.text, place, scope.page.targets.facts);
703
+ const text = aiLayoutWords(block.text, place, scope.page.targets.facts, scope.page.options.language);
704
704
  if (!text) return null;
705
705
  return scope.page.tree.add('muiTypography', _extends({
706
706
  children: text,
@@ -709,7 +709,7 @@ function words(scope, block, place, variant, props, sx) {
709
709
  }
710
710
  /** A heading at its place in the outline: the section's own, or one under it. */ function heading(scope, block) {
711
711
  if (scope.frame) {
712
- const label = aiLayoutWords(block.text, 'itemTitle', scope.page.targets.facts);
712
+ const label = aiLayoutWords(block.text, 'itemTitle', scope.page.targets.facts, scope.page.options.language);
713
713
  return label ? scope.page.tree.add('muiTypography', _extends({
714
714
  children: label,
715
715
  variant: 'subtitle1',
@@ -719,7 +719,7 @@ function words(scope, block, place, variant, props, sx) {
719
719
  const own = !scope.headed;
720
720
  const level = own ? scope.level : scope.level + 1;
721
721
  const place = level === 1 ? 'title' : own ? 'heading' : 'itemTitle';
722
- const text = aiLayoutWords(block.text, place, scope.page.targets.facts);
722
+ const text = aiLayoutWords(block.text, place, scope.page.targets.facts, scope.page.options.language);
723
723
  if (!text) return null;
724
724
  scope.headed = scope.headed || own;
725
725
  const variant = level === 1 ? block.style === 'large' ? 'displayXl' : 'h1' : own ? 'h2' : 'h4';
@@ -737,7 +737,7 @@ function words(scope, block, place, variant, props, sx) {
737
737
  }
738
738
  function compileButton(scope, block) {
739
739
  var _block_style;
740
- const asked = aiLayoutFitText(block.text, 'label');
740
+ const asked = aiLayoutFitText(block.text, 'label', scope.page.options.language);
741
741
  if (!asked) return null;
742
742
  const destination = aiLayoutResolveLink(block.to, asked, scope.link, scope.page.targets);
743
743
  if (!destination) {
@@ -834,8 +834,8 @@ export function destinationProps(destination) {
834
834
  * item's title as its caption. The Image element reads exactly these.
835
835
  */ function lightboxProps(scope, caption) {
836
836
  var _scope_page_plan_sections_scope_index;
837
- const name = aiLayoutFitText(scope.heading, 'alt') || aiLayoutFitText((_scope_page_plan_sections_scope_index = scope.page.plan.sections[scope.index]) == null ? void 0 : _scope_page_plan_sections_scope_index.name, 'alt') || `Gallery ${scope.index + 1}`;
838
- const words = aiLayoutFitText(caption, 'alt');
837
+ const name = aiLayoutFitText(scope.heading, 'alt', scope.page.options.language) || aiLayoutFitText((_scope_page_plan_sections_scope_index = scope.page.plan.sections[scope.index]) == null ? void 0 : _scope_page_plan_sections_scope_index.name, 'alt', scope.page.options.language) || `Gallery ${scope.index + 1}`;
838
+ const words = aiLayoutFitText(caption, 'alt', scope.page.options.language);
839
839
  return _extends({
840
840
  lightbox: true,
841
841
  lightboxGallery: name
@@ -847,7 +847,7 @@ function image(scope, block, room) {
847
847
  var _aiIconOfWord;
848
848
  var _block_to;
849
849
  const { page } = scope;
850
- const alt = aiLayoutFitText(block.text, 'alt');
850
+ const alt = aiLayoutFitText(block.text, 'alt', scope.page.options.language);
851
851
  if (!alt) return null;
852
852
  if (page.images >= maxImages(page)) {
853
853
  page.settled.push({
@@ -923,14 +923,14 @@ function image(scope, block, room) {
923
923
  const values = {};
924
924
  for (const item of (_block_items = block.items) != null ? _block_items : []){
925
925
  const name = item.title.trim();
926
- if (name in declared.props && item.text.trim()) values[name] = aiLayoutWords(item.text, 'text', scope.page.targets.facts);
926
+ if (name in declared.props && item.text.trim()) values[name] = aiLayoutWords(item.text, 'text', scope.page.targets.facts, scope.page.options.language);
927
927
  }
928
928
  // An instance fills at least one prop (rule 1): the block's words, else the
929
929
  // name its section has in the plan, rather than the component's placeholder.
930
930
  if (!Object.values(values).some(Boolean)) {
931
931
  var _scope_page_plan_sections_scope_index;
932
932
  const first = textProps(declared.props)[0];
933
- const words = aiLayoutWords(block.text, 'text', scope.page.targets.facts) || aiLayoutWords((_scope_page_plan_sections_scope_index = scope.page.plan.sections[scope.index]) == null ? void 0 : _scope_page_plan_sections_scope_index.name, 'itemTitle', scope.page.targets.facts);
933
+ const words = aiLayoutWords(block.text, 'text', scope.page.targets.facts, scope.page.options.language) || aiLayoutWords((_scope_page_plan_sections_scope_index = scope.page.plan.sections[scope.index]) == null ? void 0 : _scope_page_plan_sections_scope_index.name, 'itemTitle', scope.page.targets.facts, scope.page.options.language);
934
934
  if (first && words) values[first] = words;
935
935
  }
936
936
  for (const [name, value] of Object.entries(values))if (!value) delete values[name];
@@ -943,16 +943,16 @@ function image(scope, block, room) {
943
943
  function textProps(props) {
944
944
  return Object.entries(props).filter(([, type])=>type === 'text' || type === 'richText').map(([name])=>name);
945
945
  }
946
- /** An item's words as the props of the component that draws it. */ function instanceValues(props, item, facts) {
946
+ /** An item's words as the props of the component that draws it. */ function instanceValues(props, item, facts, language) {
947
947
  var _texts_find, _texts_find1;
948
948
  const texts = textProps(props);
949
949
  const titleProp = (_texts_find = texts.find((name)=>/title|name|heading|label|question|figure|value/i.test(name))) != null ? _texts_find : texts[0];
950
950
  const textProp = (_texts_find1 = texts.find((name)=>name !== titleProp && /text|description|body|summary|copy|answer|detail|caption/i.test(name))) != null ? _texts_find1 : texts.find((name)=>name !== titleProp);
951
951
  const values = {};
952
- if (titleProp && item.title.trim()) values[titleProp] = aiLayoutWords(item.title, 'itemTitle', facts);
953
- if (textProp && item.text.trim()) values[textProp] = aiLayoutWords(item.text, 'itemText', facts);
952
+ if (titleProp && item.title.trim()) values[titleProp] = aiLayoutWords(item.title, 'itemTitle', facts, language);
953
+ if (textProp && item.text.trim()) values[textProp] = aiLayoutWords(item.text, 'itemText', facts, language);
954
954
  const first = titleProp != null ? titleProp : textProp;
955
- if (!Object.values(values).some(Boolean) && first) values[first] = aiLayoutWords(item.title || item.text, 'itemTitle', facts);
955
+ if (!Object.values(values).some(Boolean) && first) values[first] = aiLayoutWords(item.title || item.text, 'itemTitle', facts, language);
956
956
  return values;
957
957
  }
958
958
  // ── Groups ────────────────────────────────────────────────────────────────
@@ -1009,7 +1009,7 @@ function itemSize(perRow) {
1009
1009
  * a section, across all its groups, since eight are a list typed by hand.
1010
1010
  */ /** Whether an item has words left once they are cleaned and fitted: an item with none is no item. */ function speaks(scope, item) {
1011
1011
  const facts = scope.page.targets.facts;
1012
- return !!(aiLayoutWords(item.title, 'itemTitle', facts) || aiLayoutWords(item.text, 'itemText', facts));
1012
+ return !!(aiLayoutWords(item.title, 'itemTitle', facts, scope.page.options.language) || aiLayoutWords(item.text, 'itemText', facts, scope.page.options.language));
1013
1013
  }
1014
1014
  /** A group's items with every part that has no words left once cleaned emptied, and wordless items left out. */ /** A title that only names the kind of thing it is: "Card", "Item 2", "Title". */ const AI_LAYOUT_PLACEHOLDER_TITLE = /^(?:card|item|title|heading|placeholder|tile|box|feature|service|post|article|entry)\s*\d*$/i;
1015
1015
  function cleanItems(scope, items) {
@@ -1021,8 +1021,8 @@ function cleanItems(scope, items) {
1021
1021
  component.id
1022
1022
  ]).map((name)=>name.trim().toLowerCase()));
1023
1023
  return items.map((item)=>_extends({}, item, {
1024
- title: aiLayoutWords(item.title, 'itemTitle', facts) && !references.has(item.title.trim().toLowerCase()) && !AI_LAYOUT_PLACEHOLDER_TITLE.test(item.title.trim()) ? item.title : '',
1025
- text: aiLayoutWords(item.text, 'itemText', facts) ? item.text : ''
1024
+ title: aiLayoutWords(item.title, 'itemTitle', facts, scope.page.options.language) && !references.has(item.title.trim().toLowerCase()) && !AI_LAYOUT_PLACEHOLDER_TITLE.test(item.title.trim()) ? item.title : '',
1025
+ text: aiLayoutWords(item.text, 'itemText', facts, scope.page.options.language) ? item.text : ''
1026
1026
  })).filter((item)=>speaks(scope, item));
1027
1027
  }
1028
1028
  function takeItems(scope, items) {
@@ -1089,7 +1089,7 @@ function group(scope, block, room) {
1089
1089
  function instances(scope, placed, items, perRow) {
1090
1090
  const tree = scope.page.tree;
1091
1091
  const ids = items.map((item)=>{
1092
- const values = instanceValues(placed.props, item, scope.page.targets.facts);
1092
+ const values = instanceValues(placed.props, item, scope.page.targets.facts, scope.page.options.language);
1093
1093
  return tree.add(REUSABLE_INSTANCE_COMPONENT_ID, _extends({
1094
1094
  [AI_INSTANCE_REF_PROP]: placed.id
1095
1095
  }, Object.keys(values).length ? {
@@ -1105,8 +1105,8 @@ function instances(scope, placed, items, perRow) {
1105
1105
  const tree = scope.page.tree;
1106
1106
  const facts = scope.page.targets.facts;
1107
1107
  const pairs = items.map((item, position)=>{
1108
- const title = block.kind === 'quotes' ? aiLayoutQuoteGap(item.text || item.title) : block.kind === 'stats' ? aiLayoutWords(item.title, 'stat', facts) : `${block.kind === 'steps' ? `${position + 1}. ` : ''}${aiLayoutWords(item.title, 'itemTitle', facts)}`;
1109
- const text = block.kind === 'quotes' ? '[Customer name]' : aiLayoutWords(item.text, block.kind === 'stats' ? 'statLabel' : 'itemText', facts);
1108
+ const title = block.kind === 'quotes' ? aiLayoutQuoteGap(item.text || item.title, scope.page.options.language) : block.kind === 'stats' ? aiLayoutWords(item.title, 'stat', facts, scope.page.options.language) : `${block.kind === 'steps' ? `${position + 1}. ` : ''}${aiLayoutWords(item.title, 'itemTitle', facts, scope.page.options.language)}`;
1109
+ const text = block.kind === 'quotes' ? '[Customer name]' : aiLayoutWords(item.text, block.kind === 'stats' ? 'statLabel' : 'itemText', facts, scope.page.options.language);
1110
1110
  return tree.add('muiListItemText', _extends({
1111
1111
  primary: title
1112
1112
  }, text ? {
@@ -1128,12 +1128,12 @@ function instances(scope, placed, items, perRow) {
1128
1128
  color: 'primary.main'
1129
1129
  }, null, 'icon') : null,
1130
1130
  item.title.trim() ? tree.add('muiTypography', {
1131
- children: aiLayoutWords(item.title, 'itemTitle', facts),
1131
+ children: aiLayoutWords(item.title, 'itemTitle', facts, scope.page.options.language),
1132
1132
  variant: 'h5',
1133
1133
  component: itemElement(scope)
1134
1134
  }, null, null, 'title') : null,
1135
1135
  item.text.trim() ? tree.add('muiTypography', {
1136
- children: aiLayoutWords(item.text, 'itemText', facts),
1136
+ children: aiLayoutWords(item.text, 'itemText', facts, scope.page.options.language),
1137
1137
  variant: 'body1'
1138
1138
  }, {
1139
1139
  color: 'text.secondary'
@@ -1168,12 +1168,12 @@ function instances(scope, placed, items, perRow) {
1168
1168
  component: 'p'
1169
1169
  }, accent(scope), null, 'number'),
1170
1170
  item.title.trim() ? tree.add('muiTypography', {
1171
- children: aiLayoutWords(item.title, 'itemTitle', facts),
1171
+ children: aiLayoutWords(item.title, 'itemTitle', facts, scope.page.options.language),
1172
1172
  variant: 'h5',
1173
1173
  component: itemElement(scope)
1174
1174
  }, null, null, 'title') : null,
1175
1175
  item.text.trim() ? tree.add('muiTypography', {
1176
- children: aiLayoutWords(item.text, 'itemText', facts),
1176
+ children: aiLayoutWords(item.text, 'itemText', facts, scope.page.options.language),
1177
1177
  variant: 'body1'
1178
1178
  }, muted(scope), null, 'text') : null
1179
1179
  ], 'step');
@@ -1187,20 +1187,20 @@ function instances(scope, placed, items, perRow) {
1187
1187
  alignItems: 'center'
1188
1188
  } : {}), null, [
1189
1189
  tree.add('muiTypography', _extends({
1190
- children: aiLayoutWords(item.title, 'stat', facts) || '[figure]',
1190
+ children: aiLayoutWords(item.title, 'stat', facts, scope.page.options.language) || '[figure]',
1191
1191
  variant: 'h2',
1192
1192
  component: 'p'
1193
1193
  }, align(scope)), accent(scope), null, 'figure'),
1194
1194
  item.text.trim() ? tree.add('muiTypography', _extends({
1195
- children: aiLayoutWords(item.text, 'statLabel', facts),
1195
+ children: aiLayoutWords(item.text, 'statLabel', facts, scope.page.options.language),
1196
1196
  variant: 'body2'
1197
1197
  }, align(scope)), muted(scope), null, 'label') : null
1198
1198
  ], 'stat');
1199
1199
  }
1200
1200
  /** A quote slot: what a customer should be quoted saying, as the gap the owner fills. */ function quote(scope, item) {
1201
1201
  const tree = scope.page.tree;
1202
- const words = aiLayoutQuoteGap(item.text || item.title);
1203
- const who = item.text && item.title ? aiLayoutFitText(item.title, 'statLabel') : '';
1202
+ const words = aiLayoutQuoteGap(item.text || item.title, scope.page.options.language);
1203
+ const who = item.text && item.title ? aiLayoutFitText(item.title, 'statLabel', scope.page.options.language) : '';
1204
1204
  const stack = tree.add('muiStack', {
1205
1205
  spacing: '2'
1206
1206
  }, null, [
@@ -1215,7 +1215,7 @@ function instances(scope, placed, items, perRow) {
1215
1215
  variant: 'body1'
1216
1216
  }, null, null, 'quote'),
1217
1217
  tree.add('muiTypography', {
1218
- children: aiLayoutFitText(who ? `[Customer name], ${who.replace(/^\[|\]$/g, '')}` : '', 'note') || '[Customer name]',
1218
+ children: aiLayoutFitText(who ? `[Customer name], ${who.replace(/^\[|\]$/g, '')}` : '', 'note', scope.page.options.language) || '[Customer name]',
1219
1219
  variant: 'subtitle2',
1220
1220
  component: 'p'
1221
1221
  }, null, null, 'attribution')
@@ -1240,7 +1240,7 @@ function instances(scope, placed, items, perRow) {
1240
1240
  if (((_block_items = block.items) != null ? _block_items : []).some((item)=>item.to)) {
1241
1241
  var _block_items2;
1242
1242
  const links = ((_block_items2 = block.items) != null ? _block_items2 : []).flatMap((item)=>{
1243
- const label = aiLayoutFitText(item.title || item.text, 'label');
1243
+ const label = aiLayoutFitText(item.title || item.text, 'label', scope.page.options.language);
1244
1244
  const destination = label ? aiLayoutResolveLink(item.to, label, scope.link, scope.page.targets) : null;
1245
1245
  if (!destination) return [];
1246
1246
  const id = tree.add('muiScreenLink', _extends({
@@ -1260,7 +1260,7 @@ function instances(scope, placed, items, perRow) {
1260
1260
  const lines = cleanItems(scope, (_block_items1 = block.items) != null ? _block_items1 : []).map((item)=>aiLayoutWords([
1261
1261
  item.title,
1262
1262
  item.text
1263
- ].filter((part)=>part.trim()).join(' — '), 'listItem', facts)).filter(Boolean);
1263
+ ].filter((part)=>part.trim()).join(' — '), 'listItem', facts, scope.page.options.language)).filter(Boolean);
1264
1264
  takeItemsInPlace(scope, lines);
1265
1265
  if (!lines.length) return null;
1266
1266
  if (rule1(scope)) {
@@ -1298,7 +1298,7 @@ function instances(scope, placed, items, perRow) {
1298
1298
  var _block_items;
1299
1299
  const tree = scope.page.tree;
1300
1300
  const facts = scope.page.targets.facts;
1301
- const items = takeItems(scope, cleanItems(scope, (_block_items = block.items) != null ? _block_items : []).filter((item)=>!!aiLayoutWords(item.title, 'question', facts)));
1301
+ const items = takeItems(scope, cleanItems(scope, (_block_items = block.items) != null ? _block_items : []).filter((item)=>!!aiLayoutWords(item.title, 'question', facts, scope.page.options.language)));
1302
1302
  if (!items.length) return null;
1303
1303
  if (rule1(scope)) {
1304
1304
  const rows = items.map((item)=>tree.add('muiListItem', {
@@ -1306,9 +1306,9 @@ function instances(scope, placed, items, perRow) {
1306
1306
  divider: true
1307
1307
  }, null, [
1308
1308
  tree.add('muiListItemText', _extends({
1309
- primary: aiLayoutWords(item.title, 'question', facts)
1309
+ primary: aiLayoutWords(item.title, 'question', facts, scope.page.options.language)
1310
1310
  }, item.text.trim() ? {
1311
- secondary: aiLayoutWords(item.text, 'answer', facts)
1311
+ secondary: aiLayoutWords(item.text, 'answer', facts, scope.page.options.language)
1312
1312
  } : {}), null, null, 'qa')
1313
1313
  ], 'row'));
1314
1314
  return tree.add('muiList', {
@@ -1321,11 +1321,11 @@ function instances(scope, placed, items, perRow) {
1321
1321
  defaultExpanded: true
1322
1322
  } : {}), null, [
1323
1323
  tree.add('muiAccordionSummary', {
1324
- children: aiLayoutWords(item.title, 'question', facts)
1324
+ children: aiLayoutWords(item.title, 'question', facts, scope.page.options.language)
1325
1325
  }, null, null, 'question'),
1326
1326
  item.text.trim() ? tree.add('muiAccordionDetails', null, null, [
1327
1327
  tree.add('muiTypography', {
1328
- children: aiLayoutWords(item.text, 'answer', facts),
1328
+ children: aiLayoutWords(item.text, 'answer', facts, scope.page.options.language),
1329
1329
  variant: 'body1'
1330
1330
  }, {
1331
1331
  color: 'text.secondary'
@@ -1356,7 +1356,7 @@ function instances(scope, placed, items, perRow) {
1356
1356
  return AI_LAYOUT_MAX_DESIGN_PICTURES - page.images - page.pictures;
1357
1357
  }
1358
1358
  /** Whether a heading block has words left once fitted: one with none is no heading. */ function speaksHeading(scope, block) {
1359
- return block.kind === 'heading' && !!aiLayoutWords(block.text, 'heading', scope.page.targets.facts);
1359
+ return block.kind === 'heading' && !!aiLayoutWords(block.text, 'heading', scope.page.targets.facts, scope.page.options.language);
1360
1360
  }
1361
1361
  /** The section root every designed section is written under, as `compileSection` writes its own. */ function designedRoot(scope, children, sx, dark) {
1362
1362
  var _ref;
@@ -1365,7 +1365,7 @@ function instances(scope, placed, items, perRow) {
1365
1365
  const name = ((_page_plan_sections_index = page.plan.sections[index]) == null ? void 0 : (_page_plan_sections_index_name = _page_plan_sections_index.name) == null ? void 0 : _page_plan_sections_index_name.trim()) || `Section ${index + 1}`;
1366
1366
  return page.tree.add('section', _extends({
1367
1367
  element: 'section',
1368
- ariaLabel: sectionLabel(name, index)
1368
+ ariaLabel: sectionLabel(name, index, page.options.language)
1369
1369
  }, dark ? {
1370
1370
  colorScheme: 'dark'
1371
1371
  } : {}, index === 0 && scope.overPhoto ? {
@@ -1409,7 +1409,7 @@ function instances(scope, placed, items, perRow) {
1409
1409
  }
1410
1410
  /** What a stand-in picture is of, for a stock search: the section's subject, else the site's. */ function standInAlt(scope, words) {
1411
1411
  var _scope_page_plan_sections_scope_index;
1412
- return aiLayoutFitText(words, 'alt') || aiLayoutFitText(scope.heading, 'alt') || aiLayoutFitText((_scope_page_plan_sections_scope_index = scope.page.plan.sections[scope.index]) == null ? void 0 : _scope_page_plan_sections_scope_index.name, 'alt') || aiLayoutFitText(scope.page.plan.title, 'alt') || 'A photo';
1412
+ return aiLayoutFitText(words, 'alt', scope.page.options.language) || aiLayoutFitText(scope.heading, 'alt', scope.page.options.language) || aiLayoutFitText((_scope_page_plan_sections_scope_index = scope.page.plan.sections[scope.index]) == null ? void 0 : _scope_page_plan_sections_scope_index.name, 'alt', scope.page.options.language) || aiLayoutFitText(scope.page.plan.title, 'alt', scope.page.options.language) || 'A photo';
1413
1413
  }
1414
1414
  /** A grid row of sized cells, as `compileRow` writes one, from ids already compiled. */ function designRow(scope, cells, spacing, alignItems = 'center') {
1415
1415
  const tree = scope.page.tree;
@@ -1462,7 +1462,7 @@ function instances(scope, placed, items, perRow) {
1462
1462
  style: 'large'
1463
1463
  });
1464
1464
  sellingHero(scope, flow);
1465
- const given = images[0] ? aiLayoutFitText(images[0].text, 'alt') : '';
1465
+ const given = images[0] ? aiLayoutFitText(images[0].text, 'alt', scope.page.options.language) : '';
1466
1466
  return hero(scope, raw, flow, given ? {
1467
1467
  alt: given,
1468
1468
  given: true
@@ -1838,12 +1838,12 @@ function instances(scope, placed, items, perRow) {
1838
1838
  spacing: '1'
1839
1839
  }, null, [
1840
1840
  item.title.trim() ? tree.add('muiTypography', {
1841
- children: aiLayoutWords(item.title, 'itemTitle', facts),
1841
+ children: aiLayoutWords(item.title, 'itemTitle', facts, scope.page.options.language),
1842
1842
  variant: 'h5',
1843
1843
  component: itemElement(scope)
1844
1844
  }, null, null, 'title') : null,
1845
1845
  item.text.trim() ? tree.add('muiTypography', {
1846
- children: aiLayoutWords(item.text, 'itemText', facts),
1846
+ children: aiLayoutWords(item.text, 'itemText', facts, scope.page.options.language),
1847
1847
  variant: 'body1'
1848
1848
  }, muted(scope), null, 'text') : null
1849
1849
  ], 'stepWords')
@@ -1855,12 +1855,12 @@ function instances(scope, placed, items, perRow) {
1855
1855
  const tree = page.tree;
1856
1856
  const facts = page.targets.facts;
1857
1857
  const title = (item, type = 'h5')=>item.title.trim() ? tree.add('muiTypography', {
1858
- children: aiLayoutWords(item.title, 'itemTitle', facts),
1858
+ children: aiLayoutWords(item.title, 'itemTitle', facts, scope.page.options.language),
1859
1859
  variant: type,
1860
1860
  component: itemElement(scope)
1861
1861
  }, null, null, 'title') : null;
1862
1862
  const words = (item, type = 'body1')=>item.text.trim() ? tree.add('muiTypography', {
1863
- children: aiLayoutWords(item.text, 'itemText', facts),
1863
+ children: aiLayoutWords(item.text, 'itemText', facts, scope.page.options.language),
1864
1864
  variant: type
1865
1865
  }, muted(scope), null, 'text') : null;
1866
1866
  if (variant === 'cards') return null;
@@ -2133,7 +2133,7 @@ function listingSection(scope, blocks, placed) {
2133
2133
  const name = ((_page_plan_sections_index = page.plan.sections[index]) == null ? void 0 : (_page_plan_sections_index_name = _page_plan_sections_index.name) == null ? void 0 : _page_plan_sections_index_name.trim()) || `Section ${index + 1}`;
2134
2134
  return tree.add('section', _extends({
2135
2135
  element: 'section',
2136
- ariaLabel: sectionLabel(name, index)
2136
+ ariaLabel: sectionLabel(name, index, page.options.language)
2137
2137
  }, scope.band === 'dark' ? {
2138
2138
  colorScheme: 'dark'
2139
2139
  } : {}), underTitle ? null : bandSx(scope.band), [
@@ -2153,7 +2153,7 @@ function listingSection(scope, blocks, placed) {
2153
2153
  const { page, index, at } = scope;
2154
2154
  const tree = page.tree;
2155
2155
  const given = blocks.find((block)=>speaksHeading(scope, block));
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);
2156
+ const heading = aiLayoutWords(given == null ? void 0 : given.text, 'heading', page.targets.facts, scope.page.options.language) || aiLayoutFitText((_page_plan_sections_index = page.plan.sections[index]) == null ? void 0 : _page_plan_sections_index.name, 'heading', scope.page.options.language) || aiLayoutLabel('reviewsHeading', page.options.language);
2157
2157
  page.settled.push({
2158
2158
  at,
2159
2159
  what: "the store's own reviews placed: shown once shoppers leave them, never written for them"
@@ -2387,12 +2387,12 @@ function listingSection(scope, blocks, placed) {
2387
2387
  size: '32'
2388
2388
  }, accent(scope), null, 'icon'),
2389
2389
  item.title.trim() ? tree.add('muiTypography', _extends({
2390
- children: aiLayoutWords(item.title, 'itemTitle', facts),
2390
+ children: aiLayoutWords(item.title, 'itemTitle', facts, scope.page.options.language),
2391
2391
  variant: 'h6',
2392
2392
  component: itemElement(scope)
2393
2393
  }, textAlign), null, null, 'title') : null,
2394
2394
  item.text.trim() ? tree.add('muiTypography', _extends({
2395
- children: aiLayoutWords(item.text, 'itemText', facts),
2395
+ children: aiLayoutWords(item.text, 'itemText', facts, scope.page.options.language),
2396
2396
  variant: 'body2'
2397
2397
  }, textAlign), muted(scope), null, 'text') : null
2398
2398
  ], 'iconItem');
@@ -2650,7 +2650,7 @@ function listingSection(scope, blocks, placed) {
2650
2650
  const portrait = ((_page_design = page.design) == null ? void 0 : _page_design.input.kind) === 'photography' || RECORD_PEOPLE.test(listing.name);
2651
2651
  const picture = photoField ? tree.add('image', _extends({
2652
2652
  src: `{{item.${photoField}}}`,
2653
- alt: fields.title ? `{{item.${fields.title}}}` : aiLayoutFitText(listing.name, 'alt') || 'A photo',
2653
+ alt: fields.title ? `{{item.${fields.title}}}` : aiLayoutFitText(listing.name, 'alt', scope.page.options.language) || 'A photo',
2654
2654
  objectFit: 'cover',
2655
2655
  width: '100%',
2656
2656
  loading: 'lazy'