@aglyn/plugins-ai 1.0.0-beta.264 → 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 (98) 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-plan-step.d.ts +43 -8
  42. package/src/lib/jobs/ai-job-plan-step.js +99 -18
  43. package/src/lib/jobs/ai-job-plan-step.js.map +1 -1
  44. package/src/lib/jobs/ai-job-site-datasets.d.ts +82 -1
  45. package/src/lib/jobs/ai-job-site-datasets.js +276 -14
  46. package/src/lib/jobs/ai-job-site-datasets.js.map +1 -1
  47. package/src/lib/jobs/ai-layout-stock-photos.d.ts +108 -10
  48. package/src/lib/jobs/ai-layout-stock-photos.js +729 -87
  49. package/src/lib/jobs/ai-layout-stock-photos.js.map +1 -1
  50. package/src/lib/jobs/fixtures/ai-site-foreign-datasets-recording.d.ts +58 -0
  51. package/src/lib/jobs/fixtures/ai-site-foreign-datasets-recording.js +678 -0
  52. package/src/lib/jobs/fixtures/ai-site-foreign-datasets-recording.js.map +1 -0
  53. package/src/lib/jobs/fixtures/ai-stock-photo-agl3856-beta265-recordings.d.ts +33 -0
  54. package/src/lib/jobs/fixtures/ai-stock-photo-agl3856-beta265-recordings.js +270 -0
  55. package/src/lib/jobs/fixtures/ai-stock-photo-agl3856-beta265-recordings.js.map +1 -0
  56. package/src/lib/jobs/fixtures/ai-stock-photo-agl3856-people-recordings.d.ts +33 -0
  57. package/src/lib/jobs/fixtures/ai-stock-photo-agl3856-people-recordings.js +277 -0
  58. package/src/lib/jobs/fixtures/ai-stock-photo-agl3856-people-recordings.js.map +1 -0
  59. package/src/lib/layout-language/ai-layout-compiler.js +49 -12
  60. package/src/lib/layout-language/ai-layout-compiler.js.map +1 -1
  61. package/src/lib/layout-language/ai-layout-design.d.ts +6 -3
  62. package/src/lib/layout-language/ai-layout-design.js +14 -13
  63. package/src/lib/layout-language/ai-layout-design.js.map +1 -1
  64. package/src/lib/layout-language/ai-layout-listings.d.ts +48 -0
  65. package/src/lib/layout-language/ai-layout-listings.js +91 -5
  66. package/src/lib/layout-language/ai-layout-listings.js.map +1 -1
  67. package/src/lib/layout-language/ai-layout-pictures.d.ts +15 -0
  68. package/src/lib/layout-language/ai-layout-pictures.js +6 -2
  69. package/src/lib/layout-language/ai-layout-pictures.js.map +1 -1
  70. package/src/lib/model/ai-site-home-arcs.d.ts +75 -0
  71. package/src/lib/model/ai-site-home-arcs.js +741 -0
  72. package/src/lib/model/ai-site-home-arcs.js.map +1 -0
  73. package/src/lib/model/ai-site-inventory.d.ts +18 -0
  74. package/src/lib/model/ai-site-inventory.js.map +1 -1
  75. package/src/lib/model/ai-site-job.d.ts +9 -6
  76. package/src/lib/model/ai-site-job.js +8 -5
  77. package/src/lib/model/ai-site-job.js.map +1 -1
  78. package/src/lib/model/ai-site-kinds.js +24 -24
  79. package/src/lib/model/ai-site-kinds.js.map +1 -1
  80. package/src/lib/model/ai-site-start-steps.d.ts +67 -0
  81. package/src/lib/model/ai-site-start-steps.js +127 -0
  82. package/src/lib/model/ai-site-start-steps.js.map +1 -0
  83. package/src/lib/model/ai-site-start.js +4 -1
  84. package/src/lib/model/ai-site-start.js.map +1 -1
  85. package/src/lib/runtime/ai-doctrine-validators.d.ts +32 -0
  86. package/src/lib/runtime/ai-doctrine-validators.js +119 -2
  87. package/src/lib/runtime/ai-doctrine-validators.js.map +1 -1
  88. package/src/lib/runtime/ai-doctrine.d.ts +6 -1
  89. package/src/lib/runtime/ai-doctrine.js +9 -5
  90. package/src/lib/runtime/ai-doctrine.js.map +1 -1
  91. package/src/lib/runtime/ai-palette.generated.js +5 -2
  92. package/src/lib/runtime/ai-palette.generated.js.map +1 -1
  93. package/src/lib/runtime/site-inventory.js +6 -0
  94. package/src/lib/runtime/site-inventory.js.map +1 -1
  95. package/src/lib/server/ai-insight-digest-route.js +2 -2
  96. package/src/lib/server/ai-insight-digest-route.js.map +1 -1
  97. package/src/lib/usage/assist-free-taste.js +3 -0
  98. package/src/lib/usage/assist-free-taste.js.map +1 -1
@@ -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, aiLayoutIsRecordImageAlt, aiLayoutListingAt, aiLayoutRecordHref, aiLayoutRecordImageAltField } 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
  }
@@ -2629,7 +2664,7 @@ 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) {
2667
+ */ function recordsElement(scope, listing, limit, filter) {
2633
2668
  var _listing_fields, _listing_fields1;
2634
2669
  var _page_design;
2635
2670
  const { page } = scope;
@@ -2685,7 +2720,7 @@ function listingSection(scope, blocks, placed) {
2685
2720
  }, null, 'recordLink') : null;
2686
2721
  page.settled.push({
2687
2722
  at: scope.at,
2688
- 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}”` : ''}`
2689
2724
  });
2690
2725
  const card = questions ? tree.add('muiStack', {
2691
2726
  spacing: '1'
@@ -2711,6 +2746,8 @@ function listingSection(scope, blocks, placed) {
2711
2746
  repeatDataset: listing.datasetId
2712
2747
  }, limit ? {
2713
2748
  repeatLimit: String(limit)
2749
+ } : {}, filter ? {
2750
+ repeatFilter: aiLayoutRepeatFilterOf(filter)
2714
2751
  } : {}), questions ? {
2715
2752
  display: 'grid',
2716
2753
  gap: 3