@aglyn/plugins-ai 1.0.0-beta.272 → 1.0.0-beta.273

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 (52) hide show
  1. package/package.json +17 -17
  2. package/src/lib/components/ai-site-start-card.component.js +237 -234
  3. package/src/lib/components/ai-site-start-card.component.js.map +1 -1
  4. package/src/lib/jobs/ai-empty-site-sweep.d.ts +12 -1
  5. package/src/lib/jobs/ai-empty-site-sweep.js +15 -3
  6. package/src/lib/jobs/ai-empty-site-sweep.js.map +1 -1
  7. package/src/lib/jobs/ai-job-page-step.js +21 -2
  8. package/src/lib/jobs/ai-job-page-step.js.map +1 -1
  9. package/src/lib/jobs/ai-job-seo-step.js +8 -4
  10. package/src/lib/jobs/ai-job-seo-step.js.map +1 -1
  11. package/src/lib/jobs/ai-job-site-datasets.d.ts +39 -1
  12. package/src/lib/jobs/ai-job-site-datasets.js +111 -15
  13. package/src/lib/jobs/ai-job-site-datasets.js.map +1 -1
  14. package/src/lib/jobs/ai-job-site-step.d.ts +12 -3
  15. package/src/lib/jobs/ai-job-site-step.js +85 -11
  16. package/src/lib/jobs/ai-job-site-step.js.map +1 -1
  17. package/src/lib/jobs/ai-job-text-step.d.ts +8 -0
  18. package/src/lib/jobs/ai-job-text-step.js.map +1 -1
  19. package/src/lib/jobs/ai-jobs.d.ts +3 -0
  20. package/src/lib/jobs/ai-jobs.js +4 -0
  21. package/src/lib/jobs/ai-jobs.js.map +1 -1
  22. package/src/lib/jobs/ai-layout-owner-photos.js +4 -4
  23. package/src/lib/jobs/ai-layout-owner-photos.js.map +1 -1
  24. package/src/lib/jobs/ai-layout-stock-photos.d.ts +35 -0
  25. package/src/lib/jobs/ai-layout-stock-photos.js +114 -43
  26. package/src/lib/jobs/ai-layout-stock-photos.js.map +1 -1
  27. package/src/lib/jobs/ai-site-late-photos.d.ts +143 -0
  28. package/src/lib/jobs/ai-site-late-photos.js +486 -0
  29. package/src/lib/jobs/ai-site-late-photos.js.map +1 -0
  30. package/src/lib/jobs/ai-site-publish.d.ts +18 -0
  31. package/src/lib/jobs/ai-site-publish.js +123 -5
  32. package/src/lib/jobs/ai-site-publish.js.map +1 -1
  33. package/src/lib/jobs/fixtures/ai-site-late-photos-laurel-fork.d.ts +83 -0
  34. package/src/lib/jobs/fixtures/ai-site-late-photos-laurel-fork.js +1553 -0
  35. package/src/lib/jobs/fixtures/ai-site-late-photos-laurel-fork.js.map +1 -0
  36. package/src/lib/layout-language/ai-layout-pictures.d.ts +50 -13
  37. package/src/lib/layout-language/ai-layout-pictures.js +81 -19
  38. package/src/lib/layout-language/ai-layout-pictures.js.map +1 -1
  39. package/src/lib/model/ai-jobs.types.d.ts +10 -0
  40. package/src/lib/model/ai-jobs.types.js.map +1 -1
  41. package/src/lib/model/ai-site-photos.d.ts +119 -0
  42. package/src/lib/model/ai-site-photos.js +128 -0
  43. package/src/lib/model/ai-site-photos.js.map +1 -0
  44. package/src/lib/runtime/ai-doctrine-validators.d.ts +3 -1
  45. package/src/lib/runtime/ai-doctrine-validators.js +3 -1
  46. package/src/lib/runtime/ai-doctrine-validators.js.map +1 -1
  47. package/src/lib/runtime/seo-fields.d.ts +29 -4
  48. package/src/lib/runtime/seo-fields.js +58 -11
  49. package/src/lib/runtime/seo-fields.js.map +1 -1
  50. package/src/lib/tools/ai-seo-tool.d.ts +25 -1
  51. package/src/lib/tools/ai-seo-tool.js +61 -0
  52. package/src/lib/tools/ai-seo-tool.js.map +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aglyn/plugins-ai",
3
- "version": "1.0.0-beta.272",
3
+ "version": "1.0.0-beta.273",
4
4
  "license": "Apache-2.0",
5
5
  "homepage": "https://aglyn.com",
6
6
  "repository": {
@@ -25,22 +25,22 @@
25
25
  "./package.json": "./package.json"
26
26
  },
27
27
  "dependencies": {
28
- "@aglyn/aglyn": "1.0.0-beta.272",
29
- "@aglyn/shared-data-enums": "1.0.0-beta.272",
30
- "@aglyn/shared-data-mdi": "1.0.0-beta.272",
31
- "@aglyn/shared-data-types": "1.0.0-beta.272",
32
- "@aglyn/shared-ui-email-campaigns": "1.0.0-beta.272",
33
- "@aglyn/shared-ui-jsx": "1.0.0-beta.272",
34
- "@aglyn/shared-ui-snackstack": "1.0.0-beta.272",
35
- "@aglyn/shared-ui-theme": "1.0.0-beta.272",
36
- "@aglyn/shared-util-email": "1.0.0-beta.272",
37
- "@aglyn/shared-util-errors": "1.0.0-beta.272",
38
- "@aglyn/shared-util-http": "1.0.0-beta.272",
39
- "@aglyn/shared-util-timestamp": "1.0.0-beta.272",
40
- "@aglyn/shared-util-tools": "1.0.0-beta.272",
41
- "@aglyn/tenant-data-admin": "1.0.0-beta.272",
42
- "@aglyn/tenant-feature-instance": "1.0.0-beta.272",
43
- "@aglyn/tenant-runtime": "1.0.0-beta.272",
28
+ "@aglyn/aglyn": "1.0.0-beta.273",
29
+ "@aglyn/shared-data-enums": "1.0.0-beta.273",
30
+ "@aglyn/shared-data-mdi": "1.0.0-beta.273",
31
+ "@aglyn/shared-data-types": "1.0.0-beta.273",
32
+ "@aglyn/shared-ui-email-campaigns": "1.0.0-beta.273",
33
+ "@aglyn/shared-ui-jsx": "1.0.0-beta.273",
34
+ "@aglyn/shared-ui-snackstack": "1.0.0-beta.273",
35
+ "@aglyn/shared-ui-theme": "1.0.0-beta.273",
36
+ "@aglyn/shared-util-email": "1.0.0-beta.273",
37
+ "@aglyn/shared-util-errors": "1.0.0-beta.273",
38
+ "@aglyn/shared-util-http": "1.0.0-beta.273",
39
+ "@aglyn/shared-util-timestamp": "1.0.0-beta.273",
40
+ "@aglyn/shared-util-tools": "1.0.0-beta.273",
41
+ "@aglyn/tenant-data-admin": "1.0.0-beta.273",
42
+ "@aglyn/tenant-feature-instance": "1.0.0-beta.273",
43
+ "@aglyn/tenant-runtime": "1.0.0-beta.273",
44
44
  "@swc/helpers": "0.5.23"
45
45
  },
46
46
  "peerDependencies": {
@@ -830,7 +830,7 @@ function SectionLabel({ children, help }) {
830
830
  ]
831
831
  })
832
832
  }),
833
- /*#__PURE__*/ _jsx(DialogContent, {
833
+ /*#__PURE__*/ _jsxs(DialogContent, {
834
834
  sx: {
835
835
  px: {
836
836
  xs: 2,
@@ -838,247 +838,250 @@ function SectionLabel({ children, help }) {
838
838
  }
839
839
  },
840
840
  onKeyDown: onStepKeyDown,
841
- children: /*#__PURE__*/ _jsx(Container, {
842
- maxWidth: choosing || step === 'kind' || step === 'style' ? 'md' : 'sm',
843
- disableGutters: true,
844
- sx: {
845
- py: {
846
- xs: 3,
847
- sm: 5
848
- }
849
- },
850
- children: /*#__PURE__*/ _jsxs(Stack, {
851
- spacing: 4,
852
- children: [
853
- /*#__PURE__*/ _jsx(Box, {
854
- sx: {
855
- maxWidth: (t)=>t.spacing(80),
856
- width: '100%',
857
- mx: 'auto'
858
- },
859
- children: importing ? null : /*#__PURE__*/ _jsx(StartProgress, {
860
- step: step,
861
- compact: compact,
862
- onStep: started ? undefined : goBackTo
863
- })
864
- }),
865
- /*#__PURE__*/ _jsxs(Stack, {
866
- spacing: 1,
867
- sx: {
868
- textAlign: choosing ? 'center' : 'left'
869
- },
870
- "data-start-area": "heading",
871
- children: [
872
- /*#__PURE__*/ _jsx(Typography, {
873
- ref: headingRef,
874
- tabIndex: -1,
875
- variant: "h4",
876
- component: "h1",
877
- sx: {
878
- '&:focus': {
879
- outline: 'none'
880
- },
881
- '&:focus-visible': {
882
- outline: 'none'
883
- }
884
- },
885
- children: heading.title
886
- }),
887
- /*#__PURE__*/ _jsxs(Typography, {
888
- variant: "body1",
889
- color: "text.secondary",
890
- children: [
891
- choosing ? /*#__PURE__*/ _jsx(HelpTip, _extends({
892
- sx: {
893
- float: 'right'
841
+ children: [
842
+ importing ? null : /*#__PURE__*/ _jsx(Box, {
843
+ sx: {
844
+ pt: {
845
+ xs: 3,
846
+ sm: 4
847
+ }
848
+ },
849
+ children: /*#__PURE__*/ _jsx(StartProgress, {
850
+ step: step,
851
+ compact: compact,
852
+ onStep: started ? undefined : goBackTo
853
+ })
854
+ }),
855
+ /*#__PURE__*/ _jsx(Container, {
856
+ maxWidth: choosing || step === 'kind' || step === 'style' ? 'md' : 'sm',
857
+ disableGutters: true,
858
+ sx: {
859
+ py: {
860
+ xs: 3,
861
+ sm: 5
862
+ }
863
+ },
864
+ children: /*#__PURE__*/ _jsxs(Stack, {
865
+ spacing: 4,
866
+ children: [
867
+ /*#__PURE__*/ _jsxs(Stack, {
868
+ spacing: 1,
869
+ sx: {
870
+ textAlign: choosing ? 'center' : 'left'
871
+ },
872
+ "data-start-area": "heading",
873
+ children: [
874
+ /*#__PURE__*/ _jsx(Typography, {
875
+ ref: headingRef,
876
+ tabIndex: -1,
877
+ variant: "h4",
878
+ component: "h1",
879
+ sx: {
880
+ '&:focus': {
881
+ outline: 'none'
882
+ },
883
+ '&:focus-visible': {
884
+ outline: 'none'
894
885
  }
895
- }, START_HELP.choose)) : importing ? null : /*#__PURE__*/ _jsx(StepHelp, {
896
- step: step
897
- }),
898
- heading.lede
899
- ]
900
- })
901
- ]
902
- }),
903
- notice && /*#__PURE__*/ _jsx(Alert, {
904
- severity: "info",
905
- "data-start-area": "notice",
906
- children: notice
907
- }),
908
- asking && noneLeft && freeCredits && /*#__PURE__*/ _jsx(Alert, {
909
- severity: "warning",
910
- "data-start-area": "notice",
911
- action: orgSlug ? /*#__PURE__*/ _jsx(Button, {
912
- color: "inherit",
913
- size: "small",
914
- href: aiCreditsBillingHref(orgSlug),
915
- children: 'Upgrade'
916
- }) : undefined,
917
- children: aiFreeCreditsNoneLeftText(freeCredits.resetsOn)
918
- }),
919
- choosing && creating && pendingSite ? /*#__PURE__*/ _jsxs(Stack, {
920
- spacing: 2,
921
- component: "section",
922
- "aria-label": "Your site",
923
- children: [
924
- /*#__PURE__*/ _jsx(SectionLabel, {
925
- children: 'Your site'
926
- }),
927
- pendingSite.fields
928
- ]
929
- }) : null,
930
- importing && orgId ? /*#__PURE__*/ _jsx(AiSiteImportStart, {
931
- orgId: orgId,
932
- orgSlug: orgSlug,
933
- hostId: hostId,
934
- host: host,
935
- user: user,
936
- pendingSite: pendingSite,
937
- onBack: ()=>setImporting(false),
938
- leave: leave
939
- }) : choosing ? /*#__PURE__*/ _jsxs(Stack, {
940
- spacing: 2,
941
- children: [
942
- /*#__PURE__*/ _jsxs(Box, {
943
- "data-start-area": "choose-cards",
944
- sx: {
945
- display: 'grid',
946
- gridTemplateColumns: showsImport ? {
947
- xs: '1fr',
948
- sm: '1fr 1fr',
949
- md: '1fr 1fr 1fr'
950
- } : {
951
- xs: '1fr',
952
- sm: '1fr 1fr'
953
886
  },
954
- gap: 3
955
- },
956
- children: [
957
- /*#__PURE__*/ _jsx(ChoiceCard, {
958
- accent: "secondary",
959
- icon: mdiPageLayoutHeaderFooter.path,
960
- iconId: "page-layout-header-footer",
961
- title: "Start from the starter site",
962
- description: "A ready-made home page with a header, footer and contact form you can edit.",
963
- busy: startingStarter,
964
- onChoose: chooseStarter
965
- }),
966
- /*#__PURE__*/ _jsxs(ChoiceCard, {
967
- accent: "primary",
968
- icon: mdiCreation.path,
969
- iconId: "creation",
970
- title: "Start with AI",
971
- description: `Answer a few questions and ${PLATFORM_BRAND_NAME} AI plans your pages.`,
972
- onChoose: chooseAi,
973
- children: [
974
- /*#__PURE__*/ _jsx(Chip, {
975
- size: "small",
976
- color: "primary",
977
- label: "Recommended"
978
- }),
979
- freeTaste && /*#__PURE__*/ _jsx(Typography, {
980
- variant: "caption",
981
- color: "text.secondary",
982
- children: `Up to ${AI_SITE_FREE_PAGES.max} pages on the Free plan`
983
- })
984
- ]
985
- }),
986
- showsImport && /*#__PURE__*/ _jsx(ChoiceCard, {
987
- accent: "secondary",
988
- icon: mdiWebSync.path,
989
- iconId: "web-sync",
990
- title: "Bring my site",
991
- description: `Bring the website you have now into ${PLATFORM_BRAND_NAME}: its pages, words and photos, rewritten in your new design.`,
992
- blocked: importAvailability.state === 'blocked' ? importAvailability.message : null,
993
- onChoose: chooseImport,
994
- children: importAvailability.state === 'blocked' && importAvailability.reason === 'plan' ? /*#__PURE__*/ _jsx(Chip, {
995
- size: "small",
996
- variant: "outlined",
997
- label: "Paid plans"
998
- }) : null
999
- })
1000
- ]
1001
- }),
1002
- importAvailability.state === 'blocked' ? /*#__PURE__*/ _jsx(PrerequisiteNotice, _extends({}, importAvailability.reason === 'plan' && orgSlug ? {
887
+ children: heading.title
888
+ }),
889
+ /*#__PURE__*/ _jsxs(Typography, {
890
+ variant: "body1",
891
+ color: "text.secondary",
892
+ children: [
893
+ choosing ? /*#__PURE__*/ _jsx(HelpTip, _extends({
894
+ sx: {
895
+ float: 'right'
896
+ }
897
+ }, START_HELP.choose)) : importing ? null : /*#__PURE__*/ _jsx(StepHelp, {
898
+ step: step
899
+ }),
900
+ heading.lede
901
+ ]
902
+ })
903
+ ]
904
+ }),
905
+ notice && /*#__PURE__*/ _jsx(Alert, {
906
+ severity: "info",
907
+ "data-start-area": "notice",
908
+ children: notice
909
+ }),
910
+ asking && noneLeft && freeCredits && /*#__PURE__*/ _jsx(Alert, {
911
+ severity: "warning",
912
+ "data-start-area": "notice",
913
+ action: orgSlug ? /*#__PURE__*/ _jsx(Button, {
914
+ color: "inherit",
915
+ size: "small",
1003
916
  href: aiCreditsBillingHref(orgSlug),
1004
- actionLabel: 'Upgrade'
1005
- } : {}, {
1006
- children: importAvailability.message
1007
- })) : null
1008
- ]
1009
- }) : started && orgId ? /*#__PURE__*/ _jsx(Card, {
1010
- variant: "outlined",
1011
- sx: {
1012
- borderRadius: 2,
1013
- p: {
1014
- xs: 2,
1015
- sm: 3
1016
- }
1017
- },
1018
- children: /*#__PURE__*/ _jsx(AiJobFollow, {
1019
- job: started,
917
+ children: 'Upgrade'
918
+ }) : undefined,
919
+ children: aiFreeCreditsNoneLeftText(freeCredits.resetsOn)
920
+ }),
921
+ choosing && creating && pendingSite ? /*#__PURE__*/ _jsxs(Stack, {
922
+ spacing: 2,
923
+ component: "section",
924
+ "aria-label": "Your site",
925
+ children: [
926
+ /*#__PURE__*/ _jsx(SectionLabel, {
927
+ children: 'Your site'
928
+ }),
929
+ pendingSite.fields
930
+ ]
931
+ }) : null,
932
+ importing && orgId ? /*#__PURE__*/ _jsx(AiSiteImportStart, {
1020
933
  orgId: orgId,
1021
934
  orgSlug: orgSlug,
935
+ hostId: hostId,
936
+ host: host,
1022
937
  user: user,
1023
- intro: 'Your site is being planned. It is then built and published for you, with ' + 'nothing to approve. You can edit or unpublish it afterwards.',
1024
- // Full screen: AI jobs opens in the panel this dialog covers.
1025
- onOpenJobs: exit
1026
- })
1027
- }) : /*#__PURE__*/ _jsxs(Box, {
1028
- component: "section",
1029
- children: [
1030
- step === 'kind' && /*#__PURE__*/ _jsx(KindStep, _extends({}, stepProps)),
1031
- step === 'audience' && /*#__PURE__*/ _jsx(AudienceStep, _extends({}, stepProps)),
1032
- step === 'style' && /*#__PURE__*/ _jsx(StyleStep, _extends({}, stepProps, {
1033
- inspiration: siteInspiration ? {
1034
- limit: aiSiteInspirationLimit(freeTaste),
1035
- upgradeHref: orgSlug ? aiCreditsBillingHref(orgSlug) : null
1036
- } : null
1037
- })),
1038
- step === 'details' && /*#__PURE__*/ _jsx(DetailsStep, _extends({}, stepProps, {
1039
- freeTaste: freeTaste,
1040
- band: band
1041
- })),
1042
- step !== 'review' && /*#__PURE__*/ _jsx(Box, {
1043
- sx: {
1044
- mt: 3
1045
- },
1046
- children: /*#__PURE__*/ _jsx(MoreDetails, _extends({
1047
- step: step
1048
- }, stepProps), step)
1049
- }),
1050
- step === 'review' && /*#__PURE__*/ _jsxs(ReviewStep, {
1051
- answers: answers,
1052
- freeTaste: freeTaste,
1053
- onEdit: edit,
1054
- inspiration: siteInspiration,
1055
- children: [
1056
- clientIntake && /*#__PURE__*/ _jsx(Alert, {
1057
- severity: "info",
1058
- variant: "outlined",
1059
- "data-start-area": "client-intake",
1060
- children: aiSiteStartClientNote(clientIntake)
1061
- }),
1062
- !noneLeft && prompt && /*#__PURE__*/ _jsx(AiCreditsPromptNotice, {
1063
- prompt: prompt,
1064
- noun: "site",
1065
- orgSlug: orgSlug,
1066
- busy: busy,
1067
- onBuildWhatFits: ()=>void plan({
1068
- creditsConfirmed: true
1069
- }),
1070
- onSmaller: ()=>void plan({
1071
- creditsConfirmed: true,
1072
- pages: 1
1073
- })
1074
- })
1075
- ]
938
+ pendingSite: pendingSite,
939
+ onBack: ()=>setImporting(false),
940
+ leave: leave
941
+ }) : choosing ? /*#__PURE__*/ _jsxs(Stack, {
942
+ spacing: 2,
943
+ children: [
944
+ /*#__PURE__*/ _jsxs(Box, {
945
+ "data-start-area": "choose-cards",
946
+ sx: {
947
+ display: 'grid',
948
+ gridTemplateColumns: showsImport ? {
949
+ xs: '1fr',
950
+ sm: '1fr 1fr',
951
+ md: '1fr 1fr 1fr'
952
+ } : {
953
+ xs: '1fr',
954
+ sm: '1fr 1fr'
955
+ },
956
+ gap: 3
957
+ },
958
+ children: [
959
+ /*#__PURE__*/ _jsx(ChoiceCard, {
960
+ accent: "secondary",
961
+ icon: mdiPageLayoutHeaderFooter.path,
962
+ iconId: "page-layout-header-footer",
963
+ title: "Start from the starter site",
964
+ description: "A ready-made home page with a header, footer and contact form you can edit.",
965
+ busy: startingStarter,
966
+ onChoose: chooseStarter
967
+ }),
968
+ /*#__PURE__*/ _jsxs(ChoiceCard, {
969
+ accent: "primary",
970
+ icon: mdiCreation.path,
971
+ iconId: "creation",
972
+ title: "Start with AI",
973
+ description: `Answer a few questions and ${PLATFORM_BRAND_NAME} AI plans your pages.`,
974
+ onChoose: chooseAi,
975
+ children: [
976
+ /*#__PURE__*/ _jsx(Chip, {
977
+ size: "small",
978
+ color: "primary",
979
+ label: "Recommended"
980
+ }),
981
+ freeTaste && /*#__PURE__*/ _jsx(Typography, {
982
+ variant: "caption",
983
+ color: "text.secondary",
984
+ children: `Up to ${AI_SITE_FREE_PAGES.max} pages on the Free plan`
985
+ })
986
+ ]
987
+ }),
988
+ showsImport && /*#__PURE__*/ _jsx(ChoiceCard, {
989
+ accent: "secondary",
990
+ icon: mdiWebSync.path,
991
+ iconId: "web-sync",
992
+ title: "Bring my site",
993
+ description: `Bring the website you have now into ${PLATFORM_BRAND_NAME}: its pages, words and photos, rewritten in your new design.`,
994
+ blocked: importAvailability.state === 'blocked' ? importAvailability.message : null,
995
+ onChoose: chooseImport,
996
+ children: importAvailability.state === 'blocked' && importAvailability.reason === 'plan' ? /*#__PURE__*/ _jsx(Chip, {
997
+ size: "small",
998
+ variant: "outlined",
999
+ label: "Paid plans"
1000
+ }) : null
1001
+ })
1002
+ ]
1003
+ }),
1004
+ importAvailability.state === 'blocked' ? /*#__PURE__*/ _jsx(PrerequisiteNotice, _extends({}, importAvailability.reason === 'plan' && orgSlug ? {
1005
+ href: aiCreditsBillingHref(orgSlug),
1006
+ actionLabel: 'Upgrade'
1007
+ } : {}, {
1008
+ children: importAvailability.message
1009
+ })) : null
1010
+ ]
1011
+ }) : started && orgId ? /*#__PURE__*/ _jsx(Card, {
1012
+ variant: "outlined",
1013
+ sx: {
1014
+ borderRadius: 2,
1015
+ p: {
1016
+ xs: 2,
1017
+ sm: 3
1018
+ }
1019
+ },
1020
+ children: /*#__PURE__*/ _jsx(AiJobFollow, {
1021
+ job: started,
1022
+ orgId: orgId,
1023
+ orgSlug: orgSlug,
1024
+ user: user,
1025
+ intro: 'Your site is being planned. It is then built and published for you, with ' + 'nothing to approve. You can edit or unpublish it afterwards.',
1026
+ // Full screen: AI jobs opens in the panel this dialog covers.
1027
+ onOpenJobs: exit
1076
1028
  })
1077
- ]
1078
- })
1079
- ]
1029
+ }) : /*#__PURE__*/ _jsxs(Box, {
1030
+ component: "section",
1031
+ children: [
1032
+ step === 'kind' && /*#__PURE__*/ _jsx(KindStep, _extends({}, stepProps)),
1033
+ step === 'audience' && /*#__PURE__*/ _jsx(AudienceStep, _extends({}, stepProps)),
1034
+ step === 'style' && /*#__PURE__*/ _jsx(StyleStep, _extends({}, stepProps, {
1035
+ inspiration: siteInspiration ? {
1036
+ limit: aiSiteInspirationLimit(freeTaste),
1037
+ upgradeHref: orgSlug ? aiCreditsBillingHref(orgSlug) : null
1038
+ } : null
1039
+ })),
1040
+ step === 'details' && /*#__PURE__*/ _jsx(DetailsStep, _extends({}, stepProps, {
1041
+ freeTaste: freeTaste,
1042
+ band: band
1043
+ })),
1044
+ step !== 'review' && /*#__PURE__*/ _jsx(Box, {
1045
+ sx: {
1046
+ mt: 3
1047
+ },
1048
+ children: /*#__PURE__*/ _jsx(MoreDetails, _extends({
1049
+ step: step
1050
+ }, stepProps), step)
1051
+ }),
1052
+ step === 'review' && /*#__PURE__*/ _jsxs(ReviewStep, {
1053
+ answers: answers,
1054
+ freeTaste: freeTaste,
1055
+ onEdit: edit,
1056
+ inspiration: siteInspiration,
1057
+ children: [
1058
+ clientIntake && /*#__PURE__*/ _jsx(Alert, {
1059
+ severity: "info",
1060
+ variant: "outlined",
1061
+ "data-start-area": "client-intake",
1062
+ children: aiSiteStartClientNote(clientIntake)
1063
+ }),
1064
+ !noneLeft && prompt && /*#__PURE__*/ _jsx(AiCreditsPromptNotice, {
1065
+ prompt: prompt,
1066
+ noun: "site",
1067
+ orgSlug: orgSlug,
1068
+ busy: busy,
1069
+ onBuildWhatFits: ()=>void plan({
1070
+ creditsConfirmed: true
1071
+ }),
1072
+ onSmaller: ()=>void plan({
1073
+ creditsConfirmed: true,
1074
+ pages: 1
1075
+ })
1076
+ })
1077
+ ]
1078
+ })
1079
+ ]
1080
+ })
1081
+ ]
1082
+ })
1080
1083
  })
1081
- })
1084
+ ]
1082
1085
  }),
1083
1086
  asking && /* The footer stays put while the questions scroll. It wraps, because
1084
1087
  the estimate, the reason and the buttons are wider than a phone. */ /*#__PURE__*/ _jsxs(DialogActions, {