@aglyn/plugins-ai 1.0.0-beta.263 → 1.0.0-beta.266

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 (109) hide show
  1. package/package.json +17 -17
  2. package/src/lib/assets/site-styles/beauty.webp +0 -0
  3. package/src/lib/assets/site-styles/blog.webp +0 -0
  4. package/src/lib/assets/site-styles/business.webp +0 -0
  5. package/src/lib/assets/site-styles/coming-soon.webp +0 -0
  6. package/src/lib/assets/site-styles/education.webp +0 -0
  7. package/src/lib/assets/site-styles/events.webp +0 -0
  8. package/src/lib/assets/site-styles/fitness.webp +0 -0
  9. package/src/lib/assets/site-styles/landing.webp +0 -0
  10. package/src/lib/assets/site-styles/music.webp +0 -0
  11. package/src/lib/assets/site-styles/nonprofit.webp +0 -0
  12. package/src/lib/assets/site-styles/personal.webp +0 -0
  13. package/src/lib/assets/site-styles/photography.webp +0 -0
  14. package/src/lib/assets/site-styles/portfolio.webp +0 -0
  15. package/src/lib/assets/site-styles/professional.webp +0 -0
  16. package/src/lib/assets/site-styles/realestate.webp +0 -0
  17. package/src/lib/assets/site-styles/restaurant.webp +0 -0
  18. package/src/lib/assets/site-styles/store.webp +0 -0
  19. package/src/lib/assets/site-styles/studio.webp +0 -0
  20. package/src/lib/assets/site-styles/trades.webp +0 -0
  21. package/src/lib/assets/site-styles/wellness.webp +0 -0
  22. package/src/lib/assets/site-styles/yoga.webp +0 -0
  23. package/src/lib/components/ai-site-start-card.component.d.ts +12 -0
  24. package/src/lib/components/ai-site-start-card.component.js +256 -236
  25. package/src/lib/components/ai-site-start-card.component.js.map +1 -1
  26. package/src/lib/components/ai-site-start-steps.component.d.ts +108 -0
  27. package/src/lib/components/ai-site-start-steps.component.js +451 -0
  28. package/src/lib/components/ai-site-start-steps.component.js.map +1 -0
  29. package/src/lib/components/ai-site-start-tracking.d.ts +114 -0
  30. package/src/lib/components/ai-site-start-tracking.js +277 -0
  31. package/src/lib/components/ai-site-start-tracking.js.map +1 -0
  32. package/src/lib/components/ai-site-style-previews.d.ts +26 -0
  33. package/src/lib/components/ai-site-style-previews.js +115 -0
  34. package/src/lib/components/ai-site-style-previews.js.map +1 -0
  35. package/src/lib/insights/ai-insight-digest.d.ts +9 -0
  36. package/src/lib/insights/ai-insight-digest.js +35 -11
  37. package/src/lib/insights/ai-insight-digest.js.map +1 -1
  38. package/src/lib/jobs/ai-job-page-language.d.ts +9 -0
  39. package/src/lib/jobs/ai-job-page-language.js +20 -2
  40. package/src/lib/jobs/ai-job-page-language.js.map +1 -1
  41. package/src/lib/jobs/ai-job-page-sections.js +8 -2
  42. package/src/lib/jobs/ai-job-page-sections.js.map +1 -1
  43. package/src/lib/jobs/ai-job-plan-step.d.ts +43 -8
  44. package/src/lib/jobs/ai-job-plan-step.js +99 -18
  45. package/src/lib/jobs/ai-job-plan-step.js.map +1 -1
  46. package/src/lib/jobs/ai-job-site-datasets.d.ts +93 -2
  47. package/src/lib/jobs/ai-job-site-datasets.js +308 -21
  48. package/src/lib/jobs/ai-job-site-datasets.js.map +1 -1
  49. package/src/lib/jobs/ai-layout-stock-photos.d.ts +191 -13
  50. package/src/lib/jobs/ai-layout-stock-photos.js +1709 -69
  51. package/src/lib/jobs/ai-layout-stock-photos.js.map +1 -1
  52. package/src/lib/jobs/fixtures/ai-site-foreign-datasets-recording.d.ts +58 -0
  53. package/src/lib/jobs/fixtures/ai-site-foreign-datasets-recording.js +678 -0
  54. package/src/lib/jobs/fixtures/ai-site-foreign-datasets-recording.js.map +1 -0
  55. package/src/lib/jobs/fixtures/ai-stock-photo-agl3856-beta265-recordings.d.ts +33 -0
  56. package/src/lib/jobs/fixtures/ai-stock-photo-agl3856-beta265-recordings.js +270 -0
  57. package/src/lib/jobs/fixtures/ai-stock-photo-agl3856-beta265-recordings.js.map +1 -0
  58. package/src/lib/jobs/fixtures/ai-stock-photo-agl3856-people-recordings.d.ts +33 -0
  59. package/src/lib/jobs/fixtures/ai-stock-photo-agl3856-people-recordings.js +277 -0
  60. package/src/lib/jobs/fixtures/ai-stock-photo-agl3856-people-recordings.js.map +1 -0
  61. package/src/lib/jobs/fixtures/ai-stock-photo-juniper-records-recordings.d.ts +23 -0
  62. package/src/lib/jobs/fixtures/ai-stock-photo-juniper-records-recordings.js +163 -0
  63. package/src/lib/jobs/fixtures/ai-stock-photo-juniper-records-recordings.js.map +1 -0
  64. package/src/lib/jobs/fixtures/ai-stock-photo-learning-center-recordings.d.ts +23 -0
  65. package/src/lib/jobs/fixtures/ai-stock-photo-learning-center-recordings.js +53 -0
  66. package/src/lib/jobs/fixtures/ai-stock-photo-learning-center-recordings.js.map +1 -0
  67. package/src/lib/jobs/fixtures/ai-stock-photo-synchronicity-recordings.d.ts +21 -0
  68. package/src/lib/jobs/fixtures/ai-stock-photo-synchronicity-recordings.js +119 -0
  69. package/src/lib/jobs/fixtures/ai-stock-photo-synchronicity-recordings.js.map +1 -0
  70. package/src/lib/layout-language/ai-layout-compiler.js +54 -15
  71. package/src/lib/layout-language/ai-layout-compiler.js.map +1 -1
  72. package/src/lib/layout-language/ai-layout-design.d.ts +6 -3
  73. package/src/lib/layout-language/ai-layout-design.js +14 -13
  74. package/src/lib/layout-language/ai-layout-design.js.map +1 -1
  75. package/src/lib/layout-language/ai-layout-listings.d.ts +55 -0
  76. package/src/lib/layout-language/ai-layout-listings.js +103 -5
  77. package/src/lib/layout-language/ai-layout-listings.js.map +1 -1
  78. package/src/lib/layout-language/ai-layout-pictures.d.ts +42 -8
  79. package/src/lib/layout-language/ai-layout-pictures.js +91 -6
  80. package/src/lib/layout-language/ai-layout-pictures.js.map +1 -1
  81. package/src/lib/model/ai-site-home-arcs.d.ts +75 -0
  82. package/src/lib/model/ai-site-home-arcs.js +741 -0
  83. package/src/lib/model/ai-site-home-arcs.js.map +1 -0
  84. package/src/lib/model/ai-site-inventory.d.ts +18 -0
  85. package/src/lib/model/ai-site-inventory.js.map +1 -1
  86. package/src/lib/model/ai-site-job.d.ts +9 -6
  87. package/src/lib/model/ai-site-job.js +8 -5
  88. package/src/lib/model/ai-site-job.js.map +1 -1
  89. package/src/lib/model/ai-site-kinds.js +24 -24
  90. package/src/lib/model/ai-site-kinds.js.map +1 -1
  91. package/src/lib/model/ai-site-start-steps.d.ts +67 -0
  92. package/src/lib/model/ai-site-start-steps.js +127 -0
  93. package/src/lib/model/ai-site-start-steps.js.map +1 -0
  94. package/src/lib/model/ai-site-start.js +4 -1
  95. package/src/lib/model/ai-site-start.js.map +1 -1
  96. package/src/lib/runtime/ai-doctrine-validators.d.ts +32 -0
  97. package/src/lib/runtime/ai-doctrine-validators.js +119 -2
  98. package/src/lib/runtime/ai-doctrine-validators.js.map +1 -1
  99. package/src/lib/runtime/ai-doctrine.d.ts +6 -1
  100. package/src/lib/runtime/ai-doctrine.js +9 -5
  101. package/src/lib/runtime/ai-doctrine.js.map +1 -1
  102. package/src/lib/runtime/ai-palette.generated.js +5 -2
  103. package/src/lib/runtime/ai-palette.generated.js.map +1 -1
  104. package/src/lib/runtime/site-inventory.js +6 -0
  105. package/src/lib/runtime/site-inventory.js.map +1 -1
  106. package/src/lib/server/ai-insight-digest-route.js +2 -2
  107. package/src/lib/server/ai-insight-digest-route.js.map +1 -1
  108. package/src/lib/usage/assist-free-taste.js +3 -0
  109. package/src/lib/usage/assist-free-taste.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, aiLayoutRepeatFilterOf } 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";
@@ -57,10 +57,15 @@ const componentOf = (targets, id)=>{
57
57
  /**
58
58
  * The section of this page that places a form: one whose plan places one, or
59
59
  * whose design places one by its id.
60
- */ function formSectionOf(sections, plan, targets) {
60
+ */ /** Whether the site's form lives on another page of the site than this one. */ function formLivesElsewhere(targets) {
61
+ return !!targets.formPageId && targets.formPageId !== targets.pageId;
62
+ }
63
+ function formSectionOf(sections, plan, targets) {
61
64
  const forms = formIdsOf(targets);
62
65
  const planned = plan.sections.findIndex((section)=>section.uses.some((ref)=>forms.has(ref)));
63
66
  if (planned !== -1) return planned;
67
+ // A form drawn on a page it does not live on becomes a button to its page (AGL-3899).
68
+ if (formLivesElsewhere(targets)) return null;
64
69
  const designed = sections.findIndex((section)=>section.blocks.some((block)=>block.kind === 'form' && (!block.to || forms.has(block.to))));
65
70
  return designed === -1 ? null : designed;
66
71
  }
@@ -456,6 +461,31 @@ function compileSection(page, raw, index) {
456
461
  ]
457
462
  } : {}));
458
463
  const lastCol = raw.cols && raw.cols.length >= 2 ? raw.cols.length - 1 : undefined;
464
+ // A form the design drew where the plan places none, on a page the form
465
+ // does not live on, is that page's way to it (AGL-3899): a button to the
466
+ // page that holds the form, never a second copy of the form.
467
+ if (!plannedForms.length && formLivesElsewhere(page.targets)) {
468
+ const at0 = blocks.findIndex((block)=>block.kind === 'form');
469
+ if (at0 !== -1) {
470
+ const asks = blocks.some((block)=>block.kind === 'button' && (block.to === 'form' || block.to === `page:${page.targets.formPageId}`));
471
+ const col = blocks[at0].col;
472
+ const kept = blocks.filter((block)=>block.kind !== 'form');
473
+ if (!asks) {
474
+ kept.splice(at0, 0, _extends({
475
+ kind: 'button',
476
+ text: aiLayoutLabel('getInTouch', page.options.language),
477
+ to: 'form'
478
+ }, col !== undefined ? {
479
+ col
480
+ } : {}));
481
+ }
482
+ blocks.splice(0, blocks.length, ...kept);
483
+ page.settled.push({
484
+ at,
485
+ what: 'a form on a page it does not live on; a button to its page instead'
486
+ });
487
+ }
488
+ }
459
489
  for (const block of blocks){
460
490
  var _block_items;
461
491
  if (block.kind === 'form' && !(block.to && forms.has(block.to))) {
@@ -1071,7 +1101,10 @@ function group(scope, block, room) {
1071
1101
  // columns (AGL-3676): the beta.237 Willow Wick home, on a paid plan, drew
1072
1102
  // every other group compact — four bands of a title and a sentence.
1073
1103
  const variant = design && block.kind === 'cards' && block.style !== 'quiet' ? aiLayoutGroupVariant(design.input, design.choices, (_scope_words = scope.words) != null ? _scope_words : '') : null;
1074
- if (variant === 'icons') return iconColumns(scope, items, room);
1104
+ // Icon columns side by side, where rule 1 knows them by their cells; any
1105
+ // site's groups may take them (AGL-3899), and one to a row outside a
1106
+ // store they are drawn compact.
1107
+ if (variant === 'icons' && (retail || perRow > 1)) return iconColumns(scope, items, room);
1075
1108
  const pictured = (variant === 'pictures' || variant === 'articles') && room === 'full' && picturesLeft(scope.page) >= items.length;
1076
1109
  return pictured && designedGroup(scope, variant, items, room) || compactGroup(scope, block, items, perRow);
1077
1110
  }
@@ -2050,7 +2083,7 @@ function listingSection(scope, blocks, placed) {
2050
2083
  var _ref;
2051
2084
  var _page_plan_sections_index_name, _page_plan_sections_index, _page_options_sectionIds;
2052
2085
  const { page, index, at } = scope;
2053
- const { listing, role } = placed;
2086
+ const { listing, role, filter } = placed;
2054
2087
  if (listing.kind === 'reviews') return reviewsSection(scope, blocks);
2055
2088
  if (listing.kind === 'signup') return signupSection(scope, blocks);
2056
2089
  // The grid straight under a Shop page's title bar opens on the products:
@@ -2111,7 +2144,7 @@ function listingSection(scope, blocks, placed) {
2111
2144
  }
2112
2145
  }
2113
2146
  ], '3', 'flex-end') : head;
2114
- const records = listingElement(scope, listing, role);
2147
+ const records = listingElement(scope, listing, role, filter);
2115
2148
  const parts = [
2116
2149
  top ? centered ? tree.add('muiContainer', {
2117
2150
  maxWidth: 'md',
@@ -2414,7 +2447,7 @@ function listingSection(scope, blocks, placed) {
2414
2447
  * The element that lists the records, bound to them: the Product grid over
2415
2448
  * the site's catalog, or Collection Entries over its blog with one post's
2416
2449
  * card as the template it repeats. Its records count as the section's items.
2417
- */ function listingElement(scope, listing, role) {
2450
+ */ function listingElement(scope, listing, role, filter) {
2418
2451
  const { page } = scope;
2419
2452
  const tree = page.tree;
2420
2453
  const featured = role === 'featured';
@@ -2478,14 +2511,16 @@ function listingSection(scope, blocks, placed) {
2478
2511
  emptyActionHref: listing.emptyAction.href
2479
2512
  } : {}), null, null, 'products');
2480
2513
  } else if (listing.kind === 'records') {
2481
- id = recordsElement(scope, listing, featured ? shown : null);
2514
+ id = recordsElement(scope, listing, featured ? shown : null, filter);
2482
2515
  } else {
2483
2516
  id = postsElement(scope, listing, featured ? shown : COLLECTION_INDEX_POSTS);
2484
2517
  }
2485
- // What a visitor sees here is the site's records, however many it keeps:
2486
- // the section shows its planned items when it has any to show.
2518
+ // What a visitor sees here is the site's records, however many it keeps —
2519
+ // a section named for one group, that group's (AGL-3921): the section shows
2520
+ // its planned items when it has any to show.
2521
+ const listed = (filter == null ? void 0 : filter.records.length) ? filter.records.length : listing.records.length;
2487
2522
  noted(scope, Array.from({
2488
- length: Math.max(2, Math.min(shown, listing.records.length))
2523
+ length: Math.max(2, Math.min(shown, listed))
2489
2524
  }, ()=>id));
2490
2525
  return id;
2491
2526
  }
@@ -2604,7 +2639,7 @@ function listingSection(scope, blocks, placed) {
2604
2639
  /** The fields a record's card shows: its name, a kicker line and its words, each by id. */ export function aiLayoutRecordCardFields(fields) {
2605
2640
  var _ref, _ref1, _ref2, _ref3;
2606
2641
  var _texts_find, _rest_find, _rest_find1, _rest_find2;
2607
- const texts = fields.filter((field)=>field.type === 'text' || field.type === 'sorted');
2642
+ const texts = fields.filter((field)=>(field.type === 'text' || field.type === 'sorted') && !aiLayoutIsRecordImageAlt(field.name));
2608
2643
  const title = (_ref = (_texts_find = texts.find((field)=>field.type === 'text')) == null ? void 0 : _texts_find.id) != null ? _ref : null;
2609
2644
  const rest = texts.filter((field)=>field.id !== title);
2610
2645
  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;
@@ -2629,8 +2664,8 @@ function listingSection(scope, blocks, placed) {
2629
2664
  * record's name, as the design's own picture cards do (AGL-3717) — so a list
2630
2665
  * of pieces stays the image-led gallery it was before it was a dataset.
2631
2666
  * A featured band shows the first few; a page of its own, every record.
2632
- */ function recordsElement(scope, listing, limit) {
2633
- var _listing_fields;
2667
+ */ function recordsElement(scope, listing, limit, filter) {
2668
+ var _listing_fields, _listing_fields1;
2634
2669
  var _page_design;
2635
2670
  const { page } = scope;
2636
2671
  const tree = page.tree;
@@ -2654,6 +2689,7 @@ function listingSection(scope, blocks, placed) {
2654
2689
  variant: 'body2'
2655
2690
  }, textAlign), muted(scope), null, 'recordBody') : null;
2656
2691
  const photoField = !questions && listing.imageField ? listing.imageField : null;
2692
+ const altField = photoField ? aiLayoutRecordImageAltField((_listing_fields1 = listing.fields) != null ? _listing_fields1 : []) : null;
2657
2693
  const opens = Boolean(photoField) && aiOpensGalleriesInLightbox(page);
2658
2694
  // Each card opens its record's own page where the dataset has one (AGL-3727):
2659
2695
  // `/{base}/{{item.<address>}}`, filled per record as the card repeats.
@@ -2661,7 +2697,8 @@ function listingSection(scope, blocks, placed) {
2661
2697
  const portrait = ((_page_design = page.design) == null ? void 0 : _page_design.input.kind) === 'photography' || RECORD_PEOPLE.test(listing.name);
2662
2698
  const picture = photoField ? tree.add('image', _extends({
2663
2699
  src: `{{item.${photoField}}}`,
2664
- alt: fields.title ? `{{item.${fields.title}}}` : aiLayoutFitText(listing.name, 'alt', scope.page.options.language) || 'A photo',
2700
+ // What the photo shows, where the dataset keeps it; a record's name is what it is called (AGL-3856).
2701
+ alt: altField ? `{{item.${altField}}}` : fields.title ? `{{item.${fields.title}}}` : aiLayoutFitText(listing.name, 'alt', scope.page.options.language) || 'A photo',
2665
2702
  objectFit: 'cover',
2666
2703
  width: '100%',
2667
2704
  loading: 'lazy'
@@ -2683,7 +2720,7 @@ function listingSection(scope, blocks, placed) {
2683
2720
  }, null, 'recordLink') : null;
2684
2721
  page.settled.push({
2685
2722
  at: scope.at,
2686
- what: `${listing.name} listed from its dataset${questions ? ' as a ruled list' : picture ? ' as picture cards' : ' as cards'}${recordHref ? `, each linking its page under /${listing.recordBase}` : ''}`
2723
+ what: `${listing.name} listed from its dataset${questions ? ' as a ruled list' : picture ? ' as picture cards' : ' as cards'}${recordHref ? `, each linking its page under /${listing.recordBase}` : ''}${filter ? `, only those filed “${filter.value}”` : ''}`
2687
2724
  });
2688
2725
  const card = questions ? tree.add('muiStack', {
2689
2726
  spacing: '1'
@@ -2709,6 +2746,8 @@ function listingSection(scope, blocks, placed) {
2709
2746
  repeatDataset: listing.datasetId
2710
2747
  }, limit ? {
2711
2748
  repeatLimit: String(limit)
2749
+ } : {}, filter ? {
2750
+ repeatFilter: aiLayoutRepeatFilterOf(filter)
2712
2751
  } : {}), questions ? {
2713
2752
  display: 'grid',
2714
2753
  gap: 3