@aglyn/plugins-ai 1.0.0-beta.262 → 1.0.0-beta.264

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 (64) hide show
  1. package/package.json +17 -17
  2. package/src/lib/insights/ai-figure-summaries.d.ts +1 -1
  3. package/src/lib/insights/ai-figure-summaries.js +55 -38
  4. package/src/lib/insights/ai-figure-summaries.js.map +1 -1
  5. package/src/lib/insights/ai-insight-digest.d.ts +2 -0
  6. package/src/lib/insights/ai-insight-digest.js +7 -4
  7. package/src/lib/insights/ai-insight-digest.js.map +1 -1
  8. package/src/lib/jobs/ai-job-insight-step.d.ts +1 -1
  9. package/src/lib/jobs/ai-job-insight-step.js +5 -3
  10. package/src/lib/jobs/ai-job-insight-step.js.map +1 -1
  11. package/src/lib/jobs/ai-job-page-language.d.ts +2 -0
  12. package/src/lib/jobs/ai-job-page-language.js +23 -2
  13. package/src/lib/jobs/ai-job-page-language.js.map +1 -1
  14. package/src/lib/jobs/ai-job-page-sections.js +8 -2
  15. package/src/lib/jobs/ai-job-page-sections.js.map +1 -1
  16. package/src/lib/jobs/ai-job-plan-step.d.ts +14 -1
  17. package/src/lib/jobs/ai-job-plan-step.js +44 -9
  18. package/src/lib/jobs/ai-job-plan-step.js.map +1 -1
  19. package/src/lib/jobs/ai-job-site-datasets.d.ts +11 -1
  20. package/src/lib/jobs/ai-job-site-datasets.js +32 -7
  21. package/src/lib/jobs/ai-job-site-datasets.js.map +1 -1
  22. package/src/lib/jobs/ai-jobs-notify.d.ts +8 -1
  23. package/src/lib/jobs/ai-jobs-notify.js +44 -2
  24. package/src/lib/jobs/ai-jobs-notify.js.map +1 -1
  25. package/src/lib/jobs/ai-layout-stock-photos.d.ts +91 -11
  26. package/src/lib/jobs/ai-layout-stock-photos.js +1046 -48
  27. package/src/lib/jobs/ai-layout-stock-photos.js.map +1 -1
  28. package/src/lib/jobs/fixtures/ai-stock-photo-juniper-records-recordings.d.ts +23 -0
  29. package/src/lib/jobs/fixtures/ai-stock-photo-juniper-records-recordings.js +163 -0
  30. package/src/lib/jobs/fixtures/ai-stock-photo-juniper-records-recordings.js.map +1 -0
  31. package/src/lib/jobs/fixtures/ai-stock-photo-learning-center-recordings.d.ts +23 -0
  32. package/src/lib/jobs/fixtures/ai-stock-photo-learning-center-recordings.js +53 -0
  33. package/src/lib/jobs/fixtures/ai-stock-photo-learning-center-recordings.js.map +1 -0
  34. package/src/lib/jobs/fixtures/ai-stock-photo-synchronicity-recordings.d.ts +21 -0
  35. package/src/lib/jobs/fixtures/ai-stock-photo-synchronicity-recordings.js +119 -0
  36. package/src/lib/jobs/fixtures/ai-stock-photo-synchronicity-recordings.js.map +1 -0
  37. package/src/lib/layout-language/ai-layout-compiler.js +24 -11
  38. package/src/lib/layout-language/ai-layout-compiler.js.map +1 -1
  39. package/src/lib/layout-language/ai-layout-listings.d.ts +7 -0
  40. package/src/lib/layout-language/ai-layout-listings.js +12 -0
  41. package/src/lib/layout-language/ai-layout-listings.js.map +1 -1
  42. package/src/lib/layout-language/ai-layout-pictures.d.ts +27 -8
  43. package/src/lib/layout-language/ai-layout-pictures.js +85 -4
  44. package/src/lib/layout-language/ai-layout-pictures.js.map +1 -1
  45. package/src/lib/layout-language/ai-layout-promised-copy.d.ts +54 -0
  46. package/src/lib/layout-language/ai-layout-promised-copy.js +104 -0
  47. package/src/lib/layout-language/ai-layout-promised-copy.js.map +1 -0
  48. package/src/lib/model/ai-insight.d.ts +9 -0
  49. package/src/lib/model/ai-insight.js +12 -0
  50. package/src/lib/model/ai-insight.js.map +1 -1
  51. package/src/lib/model/ai-job-notice.d.ts +7 -1
  52. package/src/lib/model/ai-job-notice.js +10 -9
  53. package/src/lib/model/ai-job-notice.js.map +1 -1
  54. package/src/lib/model/ai-plan-said-sections.d.ts +81 -0
  55. package/src/lib/model/ai-plan-said-sections.js +168 -0
  56. package/src/lib/model/ai-plan-said-sections.js.map +1 -0
  57. package/src/lib/model/ai-site-job.d.ts +8 -2
  58. package/src/lib/model/ai-site-job.js +7 -1
  59. package/src/lib/model/ai-site-job.js.map +1 -1
  60. package/src/lib/runtime/ai-doctrine-validators.d.ts +15 -1
  61. package/src/lib/runtime/ai-doctrine-validators.js +80 -1
  62. package/src/lib/runtime/ai-doctrine-validators.js.map +1 -1
  63. package/src/lib/runtime/ai-palette.generated.js +11 -3
  64. package/src/lib/runtime/ai-palette.generated.js.map +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../libs/plugins/ai/src/lib/jobs/fixtures/ai-stock-photo-synchronicity-recordings.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { StockPhoto } from '@aglyn/aglyn/plugin-manager/stock-photo-provider'\n\n/**\n * PIXABAY'S RECORDED ANSWERS FOR THE BETA.261 SYNCHRONICITY GYM START\n * (AGL-3856): what production's `stockPhotoSearches` cache held on 2026-10-16\n * for \"ready train\", the one search the site's home page sent (job\n * pB0Jnr3isL; its hero, held to no world, sent none), and for \"gym\", sent\n * the same day by another start, read back from the cache by each search's\n * key, never searched again. Ids, sizes, page slugs and tags are Pixabay's\n * own, in its order; the contributor is left out.\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/** `ready train` (horizontal, min_width 900), for the Synchronicity Gym closing band, a cover whose words read as the subject \"ready train\"; answered 2026-10-16T19:19:16.709Z. 8517089 is the subway train it placed. */\nexport const READY_TRAIN_WIDE: StockPhoto[] = [\n hit(3237738, 1280, 722, 'regional-express-double-deck-train-3237738', 'regional express, double deck train, schubzug, control car, electric locomotive, br143, hbf, central station, trier, platform, ready to go, train, railroad, transport system, rail, railway regional transport, regional train, the moselle range'),\n hit(2110931, 1280, 820, 'switzerland-sbb-powerhouse-30000-hp-2110931', 'switzerland, sbb, powerhouse, 30000 hp, ready to use, uphill, alpine crossing, railroad, swiss federal railway, ffs, cff, electric locomotive, re 16-16, freight train, brig, valais, central station, rhône valley, lötschberg, simplon'),\n hit(4576439, 1280, 725, 'lokdepot-deutsche-bahn-depot-meshes-4576439', 'lokdepot, deutsche bahn, depot, meshes, hamburg, electric locomotive, diesel locomotive, switcher, waiting, readiness for operation, overview of freight trains, marshalling yard'),\n hit(3274537, 1280, 853, 'transportation-system-bus-car-train-3274537', 'transportation system, bus, car, train, traffic, street, subway system, city, free wallpaper, vehicle, public, road, industry, urban, travel, railway, commuter, wallpaper hd, tram, locomotive'),\n hit(498257, 1280, 853, 'woman-athlete-running-exercise-498257', 'woman, athlete, running, exercise, sprint, cinder-track, cinderpath, start, sports, fitness, healthy, workout, young, female, body, lifestyle, training, fit, health, people'),\n hit(797072, 1280, 853, 'train-railroad-transport-rails-797072', 'train, railroad, transport, rails, catenary, miniature, masts, catenary masts, railway line, rail track, train, train, train, train, train'),\n hit(4362166, 1280, 853, 'train-monument-scotland-jacobite-4362166', 'train, monument, scotland, jacobite, landscape, travel, scottish, nature, train, train, train, train, train, scotland, scotland'),\n hit(4797907, 1280, 853, 'bride-ready-wedding-female-dress-4797907', 'bride, ready, wedding, female, dress, gray wedding, bride, bride, ready, ready, ready, ready, ready, wedding'),\n hit(4314049, 1280, 853, 'train-bridge-mountains-railway-4314049', 'train, bridge, mountains, railway, steam, transport, landscape, nature, railroad'),\n hit(5237269, 1280, 853, 'shinkansen-bullet-train-5237269', 'shinkansen, bullet train, railway station, train station, express train, platform, railway, railroad, travel, train, transport, vehicle, high speed, fast, modern, kyoto, japan, shinkansen, bullet train, bullet train'),\n hit(3169964, 1280, 722, 'train-station-couple-traveling-3169964', 'train station, couple, traveling, railway, travelers, train station, couple, couple, couple, couple, couple, traveling'),\n hit(8517089, 1280, 720, 'train-station-subway-metro-8517089', 'train, station, subway, metro, architecture, cityscape, transport, modern, futuristic, building, steel construction, germany, hamburg, track, railroad, rails, railroad track, elbe bridge, hafencity'),\n hit(4324792, 1280, 720, 'buildings-skyscrapers-downtown-4324792', 'buildings, skyscrapers, downtown, chicago, architecture, urban, illinois, city, cityscape, nature, skyline, water, travel'),\n hit(1527780, 1280, 652, 'central-station-railway-station-1527780', 'central station, railway station, train, cologne, cologne main station, railway, rails, railroad track, rail traffic, train tracks, train station, departure, tilt shift, train, train, train, train, train'),\n hit(7859021, 1280, 850, 'train-railroad-station-passengers-7859021', 'train, railroad, station, passengers, travellers, regional train, train, train, train, train, train'),\n hit(7860168, 1280, 853, 'railway-train-station-train-7860168', 'railway, train station, train, passenger, travel, skill, civilization, rail, transportation, red, train station, train, train, train, train, train'),\n hit(3928590, 1280, 853, 'harbour-city-hamburg-city-3928590', 'harbour city, hamburg, city, lights game, shining, lamps, metro, platform, modern, architecture, hamburg, hamburg, hamburg, hamburg, hamburg, city, city, city, metro, metro'),\n hit(1868256, 1280, 853, 'train-station-adult-wait-waiting-1868256', 'train station, adult, wait, waiting, benches, trains, commuter, commute, passenger trains, public transportation, transportation, city, man, person, railway, station, train, transportation system, travel, urban'),\n hit(7767132, 1280, 853, 'station-train-railroad-rail-city-7767132', 'station, train, railroad, rail, city, architecture, berlin, germany, icc, capital city, cityscape, transport, metro, to travel, wait, commuter, platform, terminal, station, rail'),\n hit(1940691, 1280, 853, 'city-people-underground-metro-1940691', 'city, people, underground, metro, transport, transfer, traffic, transportation, prague, czech, business, man, motion, lights, station, train, stop, architecture, metro, metro'),\n hit(3714601, 1280, 815, 'train-speed-in-transit-platform-3714601', 'train, speed, in transit, platform, train station, passenger train, railway, railroad, railway station, railroad station, railway system, transportation, commute, motion, station, amsterdam, urban, subway, metro, transit'),\n hit(5616861, 1280, 853, 'woman-bride-smile-make-up-5616861', 'woman, bride, smile, make up, getting ready, lashes, mascara, hairstyle, wedding, married, getting ready, lashes, lashes, lashes, lashes, lashes, mascara, mascara'),\n hit(4068968, 1280, 829, 'berlin-metro-train-station-4068968', 'berlin, metro, train station, train platform, architecture, railway station, underground, urban, platform, germany, landmark, building, berlin, berlin, berlin, berlin, berlin, metro, train station, train station'),\n hit(10442256, 1280, 853, 'railway-track-sun-sunset-landscape-10442256', 'railway track, sun, sunset, landscape, forest, nature, railway, path, railway route, railway curve, railroad line, railway setting, railway construction, railway station, railway infrastructure, railway bridge, railway facility, winter railway, railway tracks'),\n hit(3384786, 1280, 853, 'train-station-platform-railway-3384786', 'train, station, platform, railway, rail, transport, travel, people, waiting, train, train, train, train, train'),\n hit(8302635, 1280, 828, 'train-windows-platform-speed-8302635', 'train, windows, platform, speed, circulation, transport, public transport, wagon, wide, wide view, snapshot, station, train station, roof'),\n hit(4501839, 1280, 788, 'metro-station-subway-train-4501839', 'metro, station, subway, train, underground, urban, transport, platform, architecture, travel, transportation, trainstation, terminal, railway, tube, metro, metro, subway, subway, train'),\n hit(619082, 1280, 853, 'train-tracks-train-station-railroad-619082', 'train, tracks, train station, railroad, train tracks, railway system, railway tracks, railway station, cologne, railway, rails, steel structure, cologne main station, central station, steel, train, train, train, train, train'),\n hit(4300448, 1280, 853, 'sit-architecture-inner-space-4300448', 'sit, architecture, inner space, building, subway, platform, wait, train, blur, move, stop, subway, subway, subway, platform, wait, train, train, train, train'),\n hit(4651062, 1280, 853, 'rail-track-stop-glass-4651062', 'rail, track, stop, glass, transportation, engine, rail, rail, stop, stop, stop, stop, stop, transportation, engine, engine, engine'),\n hit(7427924, 1280, 854, 'ice-train-train-railroad-transport-7427924', 'ice train, train, railroad, transport, speed train, travel, ice, ice train, ice train, ice train, ice train, ice train, train, train, train, train, train, speed train, speed train, speed train'),\n hit(4971800, 1280, 853, 'train-railway-locomotive-station-4971800', 'train, railway, locomotive, station, railroad, transport, transportation, rail, travel, electric, track, platform, engine, diesel, red, russia, cargo, power, speed, wagon'),\n hit(1486004, 1280, 853, 'bride-woman-model-wedding-dress-1486004', 'bride, woman, model, wedding dress, room, windows, elegant, extravagant, fancy, luxury, wedding, bride, model, luxury, luxury, wedding, wedding, wedding, wedding, wedding'),\n hit(3758523, 1280, 854, 'train-transportation-winter-season-3758523', 'train, transportation, winter, season, landscape, nature, travel, adventure, train, train, train, train, train, winter, winter, winter, winter, travel, travel'),\n hit(5422795, 1280, 853, 'couple-social-distancing-5422795', 'couple, social distancing, train station, coronavirus, face mask, covid-19, covid, distancing, pandemic, protection, new normal, indonesia, jakarta, covid-19, covid, covid, covid, covid, covid, pandemic'),\n hit(731165, 1280, 853, 'little-boy-window-waiting-bored-731165', 'little boy, window, waiting, bored, tired, rainy weather, glass window, raindrops, water droplets, wet, kid, child, inside, nature, train, looking out, boring, travel, rain, weather'),\n hit(60539, 1280, 848, 'train-railroad-transportation-60539', 'train, railroad, transportation, trail raffic, railway, rail, rail track, transport, locomotive, steam locomotive, russia, train, train, train, train, train'),\n hit(62849, 1280, 788, 'train-railway-snow-winter-railroad-62849', 'train, nature, railway, snow, winter, railroad, rail track, rail, transport, transportation, electric locomotive, locomotive, mountain railway, lagalb, bernina, bernina railway, switzerland'),\n hit(3153742, 1280, 854, 'railway-train-travel-street-train-3153742', 'railway train, travel, street, train, transport system, the train conductor, train station, diesel train, pingxi line, railway, platform, taiwan'),\n hit(7057750, 1280, 961, 'model-train-toy-train-train-7057750', 'model train, toy train, train, close up, miniature'),\n]\n\n/** `gym` (horizontal, min_width 900), sent by the beta.259 Ironline Strength Studio start; answered 2026-10-16T06:27:32.432Z. */\nexport const GYM_WIDE: StockPhoto[] = [\n hit(1282232, 1280, 853, 'man-person-power-strength-strong-1282232', 'man, person, power, strength, strong, fitness, body, muscles, weights, exhausted, heavy, weightlifting, effort, exhausting, bodybuilding, powerful, black fitness, black workout, black body, black power'),\n hit(2604149, 1280, 720, 'man-exercise-fitness-gym-dumbbells-2604149', 'man, exercise, fitness, gym, dumbbells, workout, weightlifting, exercise, fitness, gym, gym, gym, gym, gym, workout'),\n hit(2465478, 1280, 853, 'dumbbells-shoes-sneakers-2465478', 'dumbbells, shoes, sneakers, rubber shoes, fitness, gym, training, workout, exercise, health, fit, strength, bodybuilding, pilates, trainer, running shoes, cardio vascular, physio therapy, wellness, shoes'),\n hit(2250970, 1280, 853, 'woman-crunches-sport-training-2250970', 'woman, crunches, sport, training, exercise, fit, fitness, wellness, body, abdominals, movement, sporty, active, condition, shoes, sneakers, health, healthy, sport, sport'),\n hit(1850925, 1280, 850, 'adult-gym-athlete-dark-energy-1850925', 'adult, gym, athlete, dark, energy, exercise, exercise equipment, female, fit, fitness, girl, healthy, legs, muscles, plates, strength, strong, sweat, training, woman'),\n hit(8246973, 1280, 960, 'weight-dumbbell-strength-arm-force-8246973', 'weight, dumbbell, strength, arm, force, male, exercise, sport, fitness, wrist, hand, muscle, youth, body, adult, health, exercise, exercise, exercise, exercise'),\n hit(8246972, 1280, 960, 'weights-dumbbells-strength-force-8246972', 'weights, dumbbells, strength, force, exercise, sport, fitness, wrist, hand, muscle, body, health'),\n hit(1284616, 1280, 853, 'weight-lifting-fitness-gym-1284616', 'weight lifting, fitness, gym, perspective, bodybuilding, dumbells, weights, health, sport, training, exercise, workout, fitness, gym, gym, gym, gym, gym'),\n hit(1850926, 1280, 850, 'abs-athlete-biceps-blonde-body-1850926', 'abs, athlete, biceps, blonde, body, fit, fitness, gym, healthy, muscles, person, strength, strong, trainer, training, woman, workout, workout gear'),\n hit(534615, 1280, 853, 'crossfit-sports-fitness-training-534615', 'crossfit, sports, fitness, training, exercise, athlete, young, healthy, workout, fit, muscular, body, people, strength, power, strong, female, sport, woman, athletic'),\n hit(6995813, 1280, 1280, 'kettlebell-crossfit-training-gym-6995813', 'kettlebell, crossfit, training, gym, fitness, exercise, kettlebell, kettlebell, kettlebell, kettlebell, kettlebell, crossfit, crossfit, crossfit, crossfit, gym'),\n hit(828726, 1280, 850, 'training-muscles-arms-blonde-828726', 'training, muscles, arms, blonde, bar bells, workout, fitness, exercise, sport, gym, strong, young, woman, person, healthy, lifestyle, body, fit, muscular, studio'),\n hit(594143, 1280, 853, 'fitness-dumbbells-training-gym-594143', 'fitness, dumbbells, training, gym, weights, weightlifting, weight training, gym equipment, fitness studio, studio, weight, exercise, many, train, fit, fitness, gym, gym, gym, gym'),\n hit(828741, 1280, 850, 'training-rmuscles-back-shoulders-828741', 'training, rmuscles, back, shoulders, blonde, workout, fitness, exercise, sport, gym, strong, young, woman, person, healthy, lifestyle, body, fit, muscular, studio'),\n hit(9180669, 1280, 720, 'fitness-exercise-men-work-out-gym-9180669', 'fitness, exercise, men, work out, gym'),\n hit(2264825, 1280, 853, 'man-woman-push-ups-wellness-2264825', 'man, woman, push-ups, wellness, exercise, pair, couple, fit, fitness, sport, strength training, one arm, sporty, movement, muscles, muscle training, training, exercise, exercise, fitness'),\n hit(595529, 1280, 853, 'physiotherapy-weight-training-595529', 'physiotherapy, weight training, dumbbells, exercise balls, weight loss, workout, health, gym, therapist, physiotherapist, healthcare, fitness, wellness, rehabilitation, healing, therapeutic, weight loss, weight loss, workout, health'),\n hit(2260736, 1280, 853, 'woman-personal-trainer-fitness-2260736', 'woman, personal trainer, fitness, exercise, workout, strength training, coach, dumbbells, weight bench, weight training, healthy, caucasian, personal trainer, personal trainer, personal trainer, personal trainer, fitness, fitness, fitness, fitness'),\n hit(8563109, 1280, 914, 'ai-generated-woman-fitness-training-8563109', 'ai generated, woman, fitness, training, gym, adventure, sport, portrait, pose, stretch, exercise'),\n hit(1984344, 1280, 783, 'boxer-woman-sport-fighter-fitness-1984344', 'boxer, woman, sport, fighter, fitness, training, athlete, dark, fitness, fitness, fitness, fitness, fitness'),\n hit(2245029, 1280, 853, 'sports-fitness-fit-training-2245029', 'sports, fitness, fit, training, abdominal muscles, six pack, athletic, move, gymnastics, power, weight training, human, elegant, female, elegance, abdominal trainer, woman, bodybuilding, femininity, abdominal exercise'),\n hit(6902886, 1280, 853, 'sport-basketball-ball-gym-activity-6902886', 'sport, basketball, ball, gym, activity, basketball, basketball, basketball, basketball, basketball'),\n hit(5031071, 1280, 945, 'workout-gym-exercise-fitness-5031071', 'workout, gym, exercise, fitness, healthy, athletic, lifestyle, gym, gym, gym, gym, gym'),\n hit(998836, 1280, 853, 'abs-gym-exercise-athlete-horse-998836', 'abs, gym, nature, exercise, athlete, horse, italian'),\n hit(3483560, 1280, 853, 'weights-dumbbells-exercise-gym-3483560', 'weights, dumbbells, exercise, gym, workout, equipment, brown fitness, brown gym, brown exercise, brown workout, gym, gym, gym, gym, gym'),\n hit(8108014, 1280, 948, 'gym-fitness-exercise-workout-yoga-8108014', 'gym, fitness, exercise, workout, yoga, fit, training, workout, workout, workout, workout, workout'),\n hit(6888634, 1280, 930, 'woman-training-health-gym-strong-6888634', 'woman, training, health, gym, strong, wellness, strength, fit, gym, gym, gym, gym, gym'),\n hit(5013985, 1280, 853, 'bodybuilding-gym-muscles-dumbbells-5013985', 'bodybuilding, gym, muscles, dumbbells, training, bodybuilding, bodybuilding, bodybuilding, bodybuilding, gym, gym, gym, gym, gym, dumbbells, dumbbells, dumbbells'),\n hit(3324976, 1280, 853, 'dumbbell-gym-fitness-dumbbells-3324976', 'dumbbell, gym, fitness, dumbbells, training, dumbbell, gym, gym, gym, gym, gym, dumbbells'),\n hit(4938219, 1280, 853, 'fitness-weights-gym-exercise-4938219', 'fitness, weights, gym, exercise, weight, strength, gray fitness, gray gym, gray exercise, gray workout, gym, gym, gym, gym, gym'),\n hit(6894904, 1280, 853, 'gym-fitness-training-exercise-6894904', 'gym, fitness, training, exercise, health, diet, slimming'),\n hit(4873885, 1280, 853, 'boiled-eggs-eggs-gym-food-4873885', 'boiled eggs, eggs, gym food, healthy food, food, protein, egg, food photography, delicious, breakfast, gym diet, brown gym, brown egg, brown eggs, brown diet'),\n hit(3516215, 1280, 853, 'gym-abdomen-training-3516215', 'gym, abdomen, training, gym, gym, abdomen, abdomen, abdomen, abdomen, abdomen'),\n hit(1126999, 1280, 856, 'crossfit-zimmer-health-fitness-1126999', 'crossfit, zimmer, health, fitness, dumbbell, gym, gym, gym, gym, gym, gym'),\n hit(6789766, 1280, 853, 'abandoned-school-abandoned-school-gym-6789766', 'abandoned school, abandoned school gym, abandoned building'),\n hit(5031689, 1280, 953, 'home-workout-gym-exercise-fitness-5031689', 'home workout, gym, exercise, fitness, training, treadmill, gray home, gray fitness, gray gym, gray exercise, gray training, gray workout, home workout, treadmill, treadmill, treadmill, treadmill, treadmill'),\n hit(4161647, 1280, 853, 'sneakers-gym-shoes-gym-plimsolls-4161647', 'sneakers, gym shoes, gym plimsolls, shoes, shoelace, sole, youth, fashion, sport, shoelace, shoelace, shoelace, shoelace, shoelace'),\n hit(4873886, 1280, 853, 'boiled-eggs-eggs-gym-food-4873886', 'boiled eggs, eggs, gym food, healthy food, food, protein, egg, food photography, delicious, breakfast, gym diet, brown gym, brown egg, brown eggs, brown diet, gym food, gym food, gym food, gym food, gym food'),\n hit(1235019, 1280, 853, 'sport-exercises-fitness-center-1235019', 'sport, exercises, fitness center, muscles, iron, metal, bitumen, rubber, health, strength, practice, diet, bodybuilding, dumbbells, barbells, slimming, fitness center, strength, strength, strength'),\n hit(8268566, 1280, 853, 'running-sportswear-sports-fitness-8268566', 'running, sportswear, sports, fitness, gym, nature, running, running, running, running, running'),\n]\n"],"names":["hit","id","width","height","slug","tags","provider","String","pageUrl","photographer","split","downloadUrl","READY_TRAIN_WIDE","GYM_WIDE"],"mappings":"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"}
@@ -23,7 +23,7 @@ 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, aiLayoutRecordHref } from "./ai-layout-listings.js";
26
+ import { AI_LAYOUT_FEATURED_RECORDS, AI_LAYOUT_LISTING_ELEMENTS, aiLayoutIsRecordImageAlt, aiLayoutListingAt, aiLayoutRecordHref, aiLayoutRecordImageAltField } from "./ai-layout-listings.js";
27
27
  import { aiStorefrontItemIcons } from "./ai-layout-storefront.js";
28
28
  import { AI_LAYOUT_LABELS_EN, aiLayoutLabel } from "./ai-layout-labels.js";
29
29
  import { aiLayoutRenamedLabel, aiLayoutResolveLink } from "./ai-layout-links.js";
@@ -689,6 +689,15 @@ function compileBlock(scope, block, room) {
689
689
  color: 'text.secondary'
690
690
  };
691
691
  }
692
+ /**
693
+ * A List Item Text's secondary words: MUI draws them in the muted text color
694
+ * whatever they sit on, so on a brand band, or over a photo, they take the
695
+ * band's own color as the primary words do (AGL-3886).
696
+ */ function mutedSecondary(scope) {
697
+ return scope.band === 'brand' || scope.overPhoto ? {
698
+ secondaryColor: 'inherit'
699
+ } : {};
700
+ }
692
701
  /** An accent's color: the brand's, or the band's own on a brand band. */ function accent(scope) {
693
702
  return scope.band === 'brand' || scope.overPhoto ? null : {
694
703
  color: 'primary.main'
@@ -1109,9 +1118,9 @@ function instances(scope, placed, items, perRow) {
1109
1118
  const text = block.kind === 'quotes' ? '[Customer name]' : aiLayoutWords(item.text, block.kind === 'stats' ? 'statLabel' : 'itemText', facts, scope.page.options.language);
1110
1119
  return tree.add('muiListItemText', _extends({
1111
1120
  primary: title
1112
- }, text ? {
1121
+ }, text ? _extends({
1113
1122
  secondary: text
1114
- } : {}), null, null, 'pair');
1123
+ }, mutedSecondary(scope)) : {}), null, null, 'pair');
1115
1124
  });
1116
1125
  return layOut(scope, noted(scope, pairs), perRow, '3', 'compact');
1117
1126
  }
@@ -1120,11 +1129,13 @@ function instances(scope, placed, items, perRow) {
1120
1129
  const tree = scope.page.tree;
1121
1130
  const facts = scope.page.targets.facts;
1122
1131
  const icon = (_aiIconOfWord = aiIconOfWord(item.icon)) != null ? _aiIconOfWord : aiIconOfWord(block.icon);
1132
+ // A quiet card draws no surface of its own, so it is colored as the band it sits on.
1133
+ const quiet = block.style === 'quiet';
1123
1134
  const children = [
1124
1135
  icon ? tree.add(AI_ICON_COMPONENT_ID, {
1125
1136
  iconId: icon.id,
1126
1137
  size: '32'
1127
- }, {
1138
+ }, quiet ? accent(scope) : {
1128
1139
  color: 'primary.main'
1129
1140
  }, null, 'icon') : null,
1130
1141
  item.title.trim() ? tree.add('muiTypography', {
@@ -1135,14 +1146,14 @@ function instances(scope, placed, items, perRow) {
1135
1146
  item.text.trim() ? tree.add('muiTypography', {
1136
1147
  children: aiLayoutWords(item.text, 'itemText', facts, scope.page.options.language),
1137
1148
  variant: 'body1'
1138
- }, {
1149
+ }, quiet ? muted(scope) : {
1139
1150
  color: 'text.secondary'
1140
1151
  }, null, 'text') : null
1141
1152
  ];
1142
1153
  const stack = tree.add('muiStack', {
1143
1154
  spacing: '1.5'
1144
1155
  }, null, children, 'cardStack');
1145
- if (block.style === 'quiet') return stack;
1156
+ if (quiet) return stack;
1146
1157
  const content = tree.add('muiCardContent', null, {
1147
1158
  p: 3
1148
1159
  }, [
@@ -1307,9 +1318,9 @@ function instances(scope, placed, items, perRow) {
1307
1318
  }, null, [
1308
1319
  tree.add('muiListItemText', _extends({
1309
1320
  primary: aiLayoutWords(item.title, 'question', facts, scope.page.options.language)
1310
- }, item.text.trim() ? {
1321
+ }, item.text.trim() ? _extends({
1311
1322
  secondary: aiLayoutWords(item.text, 'answer', facts, scope.page.options.language)
1312
- } : {}), null, null, 'qa')
1323
+ }, mutedSecondary(scope)) : {}), null, null, 'qa')
1313
1324
  ], 'row'));
1314
1325
  return tree.add('muiList', {
1315
1326
  disablePadding: true
@@ -2593,7 +2604,7 @@ function listingSection(scope, blocks, placed) {
2593
2604
  /** The fields a record's card shows: its name, a kicker line and its words, each by id. */ export function aiLayoutRecordCardFields(fields) {
2594
2605
  var _ref, _ref1, _ref2, _ref3;
2595
2606
  var _texts_find, _rest_find, _rest_find1, _rest_find2;
2596
- const texts = fields.filter((field)=>field.type === 'text' || field.type === 'sorted');
2607
+ const texts = fields.filter((field)=>(field.type === 'text' || field.type === 'sorted') && !aiLayoutIsRecordImageAlt(field.name));
2597
2608
  const title = (_ref = (_texts_find = texts.find((field)=>field.type === 'text')) == null ? void 0 : _texts_find.id) != null ? _ref : null;
2598
2609
  const rest = texts.filter((field)=>field.id !== title);
2599
2610
  const body = (_ref1 = (_rest_find = rest.find((field)=>field.type === 'text' && RECORD_BODY.test(field.name))) == null ? void 0 : _rest_find.id) != null ? _ref1 : null;
@@ -2619,7 +2630,7 @@ function listingSection(scope, blocks, placed) {
2619
2630
  * of pieces stays the image-led gallery it was before it was a dataset.
2620
2631
  * A featured band shows the first few; a page of its own, every record.
2621
2632
  */ function recordsElement(scope, listing, limit) {
2622
- var _listing_fields;
2633
+ var _listing_fields, _listing_fields1;
2623
2634
  var _page_design;
2624
2635
  const { page } = scope;
2625
2636
  const tree = page.tree;
@@ -2643,6 +2654,7 @@ function listingSection(scope, blocks, placed) {
2643
2654
  variant: 'body2'
2644
2655
  }, textAlign), muted(scope), null, 'recordBody') : null;
2645
2656
  const photoField = !questions && listing.imageField ? listing.imageField : null;
2657
+ const altField = photoField ? aiLayoutRecordImageAltField((_listing_fields1 = listing.fields) != null ? _listing_fields1 : []) : null;
2646
2658
  const opens = Boolean(photoField) && aiOpensGalleriesInLightbox(page);
2647
2659
  // Each card opens its record's own page where the dataset has one (AGL-3727):
2648
2660
  // `/{base}/{{item.<address>}}`, filled per record as the card repeats.
@@ -2650,7 +2662,8 @@ function listingSection(scope, blocks, placed) {
2650
2662
  const portrait = ((_page_design = page.design) == null ? void 0 : _page_design.input.kind) === 'photography' || RECORD_PEOPLE.test(listing.name);
2651
2663
  const picture = photoField ? tree.add('image', _extends({
2652
2664
  src: `{{item.${photoField}}}`,
2653
- alt: fields.title ? `{{item.${fields.title}}}` : aiLayoutFitText(listing.name, 'alt', scope.page.options.language) || 'A photo',
2665
+ // What the photo shows, where the dataset keeps it; a record's name is what it is called (AGL-3856).
2666
+ alt: altField ? `{{item.${altField}}}` : fields.title ? `{{item.${fields.title}}}` : aiLayoutFitText(listing.name, 'alt', scope.page.options.language) || 'A photo',
2654
2667
  objectFit: 'cover',
2655
2668
  width: '100%',
2656
2669
  loading: 'lazy'