@aglyn/plugins-ai 1.0.0-beta.143
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.
- package/LICENSE +201 -0
- package/README.md +25 -0
- package/package.json +60 -0
- package/src/index.d.ts +21 -0
- package/src/index.js +22 -0
- package/src/index.js.map +1 -0
- package/src/lib/activity/ai-activity-actions.d.ts +106 -0
- package/src/lib/activity/ai-activity-actions.js +209 -0
- package/src/lib/activity/ai-activity-actions.js.map +1 -0
- package/src/lib/activity/ai-activity.d.ts +219 -0
- package/src/lib/activity/ai-activity.js +251 -0
- package/src/lib/activity/ai-activity.js.map +1 -0
- package/src/lib/billing/ai-overage-charge.d.ts +102 -0
- package/src/lib/billing/ai-overage-charge.js +258 -0
- package/src/lib/billing/ai-overage-charge.js.map +1 -0
- package/src/lib/billing/ai-overage-close.d.ts +62 -0
- package/src/lib/billing/ai-overage-close.js +129 -0
- package/src/lib/billing/ai-overage-close.js.map +1 -0
- package/src/lib/billing/ai-overage-cutover.d.ts +63 -0
- package/src/lib/billing/ai-overage-cutover.js +114 -0
- package/src/lib/billing/ai-overage-cutover.js.map +1 -0
- package/src/lib/billing/ai-overage-events.d.ts +77 -0
- package/src/lib/billing/ai-overage-events.js +174 -0
- package/src/lib/billing/ai-overage-events.js.map +1 -0
- package/src/lib/billing/ai-overage-gate.d.ts +147 -0
- package/src/lib/billing/ai-overage-gate.js +177 -0
- package/src/lib/billing/ai-overage-gate.js.map +1 -0
- package/src/lib/billing/ai-overage-ledger.d.ts +135 -0
- package/src/lib/billing/ai-overage-ledger.js +278 -0
- package/src/lib/billing/ai-overage-ledger.js.map +1 -0
- package/src/lib/billing/ai-overage-standing-writes.d.ts +110 -0
- package/src/lib/billing/ai-overage-standing-writes.js +205 -0
- package/src/lib/billing/ai-overage-standing-writes.js.map +1 -0
- package/src/lib/billing/ai-overage-standing.d.ts +168 -0
- package/src/lib/billing/ai-overage-standing.js +215 -0
- package/src/lib/billing/ai-overage-standing.js.map +1 -0
- package/src/lib/billing/ai-overage-trigger.d.ts +30 -0
- package/src/lib/billing/ai-overage-trigger.js +76 -0
- package/src/lib/billing/ai-overage-trigger.js.map +1 -0
- package/src/lib/components/ai-allotment-editor.component.d.ts +40 -0
- package/src/lib/components/ai-allotment-editor.component.js +213 -0
- package/src/lib/components/ai-allotment-editor.component.js.map +1 -0
- package/src/lib/components/ai-assist-actions-context.d.ts +13 -0
- package/src/lib/components/ai-assist-actions-context.js +21 -0
- package/src/lib/components/ai-assist-actions-context.js.map +1 -0
- package/src/lib/components/ai-assist-provider.component.d.ts +51 -0
- package/src/lib/components/ai-assist-provider.component.js +519 -0
- package/src/lib/components/ai-assist-provider.component.js.map +1 -0
- package/src/lib/components/ai-brief-dialog.component.d.ts +56 -0
- package/src/lib/components/ai-brief-dialog.component.js +319 -0
- package/src/lib/components/ai-brief-dialog.component.js.map +1 -0
- package/src/lib/components/ai-collaborator-permissions-column.component.d.ts +32 -0
- package/src/lib/components/ai-collaborator-permissions-column.component.js +132 -0
- package/src/lib/components/ai-collaborator-permissions-column.component.js.map +1 -0
- package/src/lib/components/ai-credits-card.component.d.ts +34 -0
- package/src/lib/components/ai-credits-card.component.js +131 -0
- package/src/lib/components/ai-credits-card.component.js.map +1 -0
- package/src/lib/components/ai-credits-columns.component.d.ts +56 -0
- package/src/lib/components/ai-credits-columns.component.js +118 -0
- package/src/lib/components/ai-credits-columns.component.js.map +1 -0
- package/src/lib/components/ai-crm-email-draft.component.d.ts +17 -0
- package/src/lib/components/ai-crm-email-draft.component.js +159 -0
- package/src/lib/components/ai-crm-email-draft.component.js.map +1 -0
- package/src/lib/components/ai-crm-import-mapping.component.d.ts +20 -0
- package/src/lib/components/ai-crm-import-mapping.component.js +167 -0
- package/src/lib/components/ai-crm-import-mapping.component.js.map +1 -0
- package/src/lib/components/ai-crm-record-card.component.d.ts +27 -0
- package/src/lib/components/ai-crm-record-card.component.js +263 -0
- package/src/lib/components/ai-crm-record-card.component.js.map +1 -0
- package/src/lib/components/ai-describe-automation.component.d.ts +31 -0
- package/src/lib/components/ai-describe-automation.component.js +226 -0
- package/src/lib/components/ai-describe-automation.component.js.map +1 -0
- package/src/lib/components/ai-describe-button.component.d.ts +39 -0
- package/src/lib/components/ai-describe-button.component.js +87 -0
- package/src/lib/components/ai-describe-button.component.js.map +1 -0
- package/src/lib/components/ai-describe-page.component.d.ts +26 -0
- package/src/lib/components/ai-describe-page.component.js +18 -0
- package/src/lib/components/ai-describe-page.component.js.map +1 -0
- package/src/lib/components/ai-experiment-cards.component.d.ts +75 -0
- package/src/lib/components/ai-experiment-cards.component.js +573 -0
- package/src/lib/components/ai-experiment-cards.component.js.map +1 -0
- package/src/lib/components/ai-explain-automation.component.d.ts +31 -0
- package/src/lib/components/ai-explain-automation.component.js +265 -0
- package/src/lib/components/ai-explain-automation.component.js.map +1 -0
- package/src/lib/components/ai-insight-dialog.component.d.ts +37 -0
- package/src/lib/components/ai-insight-dialog.component.js +441 -0
- package/src/lib/components/ai-insight-dialog.component.js.map +1 -0
- package/src/lib/components/ai-job-plan.component.d.ts +46 -0
- package/src/lib/components/ai-job-plan.component.js +192 -0
- package/src/lib/components/ai-job-plan.component.js.map +1 -0
- package/src/lib/components/ai-model-selector.component.d.ts +21 -0
- package/src/lib/components/ai-model-selector.component.js +109 -0
- package/src/lib/components/ai-model-selector.component.js.map +1 -0
- package/src/lib/components/ai-page-brief-dialog.component.d.ts +29 -0
- package/src/lib/components/ai-page-brief-dialog.component.js +27 -0
- package/src/lib/components/ai-page-brief-dialog.component.js.map +1 -0
- package/src/lib/components/ai-permissions-on-host.component.d.ts +55 -0
- package/src/lib/components/ai-permissions-on-host.component.js +91 -0
- package/src/lib/components/ai-permissions-on-host.component.js.map +1 -0
- package/src/lib/components/ai-product-copy-card.component.d.ts +25 -0
- package/src/lib/components/ai-product-copy-card.component.js +328 -0
- package/src/lib/components/ai-product-copy-card.component.js.map +1 -0
- package/src/lib/components/ai-product-import-option.component.d.ts +14 -0
- package/src/lib/components/ai-product-import-option.component.js +58 -0
- package/src/lib/components/ai-product-import-option.component.js.map +1 -0
- package/src/lib/components/ai-products-hub-card.component.d.ts +15 -0
- package/src/lib/components/ai-products-hub-card.component.js +418 -0
- package/src/lib/components/ai-products-hub-card.component.js.map +1 -0
- package/src/lib/components/ai-products-proposals.component.d.ts +19 -0
- package/src/lib/components/ai-products-proposals.component.js +547 -0
- package/src/lib/components/ai-products-proposals.component.js.map +1 -0
- package/src/lib/components/ai-save-as-component.component.d.ts +38 -0
- package/src/lib/components/ai-save-as-component.component.js +231 -0
- package/src/lib/components/ai-save-as-component.component.js.map +1 -0
- package/src/lib/components/ai-seo-audit-card.component.d.ts +9 -0
- package/src/lib/components/ai-seo-audit-card.component.js +620 -0
- package/src/lib/components/ai-seo-audit-card.component.js.map +1 -0
- package/src/lib/components/ai-seo-fields-card.component.d.ts +10 -0
- package/src/lib/components/ai-seo-fields-card.component.js +453 -0
- package/src/lib/components/ai-seo-fields-card.component.js.map +1 -0
- package/src/lib/components/ai-site-batch-card.component.d.ts +32 -0
- package/src/lib/components/ai-site-batch-card.component.js +531 -0
- package/src/lib/components/ai-site-batch-card.component.js.map +1 -0
- package/src/lib/components/ai-site-seo-start-card.component.d.ts +26 -0
- package/src/lib/components/ai-site-seo-start-card.component.js +178 -0
- package/src/lib/components/ai-site-seo-start-card.component.js.map +1 -0
- package/src/lib/components/ai-site-start-card.component.d.ts +19 -0
- package/src/lib/components/ai-site-start-card.component.js +348 -0
- package/src/lib/components/ai-site-start-card.component.js.map +1 -0
- package/src/lib/components/ai-template-collection-field.component.d.ts +32 -0
- package/src/lib/components/ai-template-collection-field.component.js +63 -0
- package/src/lib/components/ai-template-collection-field.component.js.map +1 -0
- package/src/lib/components/ai-theme-proposal-card.component.d.ts +6 -0
- package/src/lib/components/ai-theme-proposal-card.component.js +619 -0
- package/src/lib/components/ai-theme-proposal-card.component.js.map +1 -0
- package/src/lib/components/ai-usage-strip.component.d.ts +27 -0
- package/src/lib/components/ai-usage-strip.component.js +145 -0
- package/src/lib/components/ai-usage-strip.component.js.map +1 -0
- package/src/lib/components/assist-edit-canvas.d.ts +169 -0
- package/src/lib/components/assist-edit-canvas.js +636 -0
- package/src/lib/components/assist-edit-canvas.js.map +1 -0
- package/src/lib/components/assist-edit-card.component.d.ts +16 -0
- package/src/lib/components/assist-edit-card.component.js +181 -0
- package/src/lib/components/assist-edit-card.component.js.map +1 -0
- package/src/lib/components/assist-jobs-drawer.component.d.ts +72 -0
- package/src/lib/components/assist-jobs-drawer.component.js +626 -0
- package/src/lib/components/assist-jobs-drawer.component.js.map +1 -0
- package/src/lib/components/assist-panel.component.d.ts +136 -0
- package/src/lib/components/assist-panel.component.js +1099 -0
- package/src/lib/components/assist-panel.component.js.map +1 -0
- package/src/lib/components/assist-signals-page.component.d.ts +3 -0
- package/src/lib/components/assist-signals-page.component.js +1017 -0
- package/src/lib/components/assist-signals-page.component.js.map +1 -0
- package/src/lib/components/besigner-ai-controls.component.d.ts +29 -0
- package/src/lib/components/besigner-ai-controls.component.js +81 -0
- package/src/lib/components/besigner-ai-controls.component.js.map +1 -0
- package/src/lib/components/billing-ai-allotments.component.d.ts +36 -0
- package/src/lib/components/billing-ai-allotments.component.js +486 -0
- package/src/lib/components/billing-ai-allotments.component.js.map +1 -0
- package/src/lib/components/billing-ai-top-users.component.d.ts +44 -0
- package/src/lib/components/billing-ai-top-users.component.js +304 -0
- package/src/lib/components/billing-ai-top-users.component.js.map +1 -0
- package/src/lib/components/billing-assist-overage-card.component.d.ts +69 -0
- package/src/lib/components/billing-assist-overage-card.component.js +437 -0
- package/src/lib/components/billing-assist-overage-card.component.js.map +1 -0
- package/src/lib/components/host-ai-allotments.component.d.ts +40 -0
- package/src/lib/components/host-ai-allotments.component.js +239 -0
- package/src/lib/components/host-ai-allotments.component.js.map +1 -0
- package/src/lib/components/member-ai-allotment-card.component.d.ts +28 -0
- package/src/lib/components/member-ai-allotment-card.component.js +172 -0
- package/src/lib/components/member-ai-allotment-card.component.js.map +1 -0
- package/src/lib/components/member-ai-usage-card.component.d.ts +28 -0
- package/src/lib/components/member-ai-usage-card.component.js +240 -0
- package/src/lib/components/member-ai-usage-card.component.js.map +1 -0
- package/src/lib/components/staff-org-ai-card.component.d.ts +17 -0
- package/src/lib/components/staff-org-ai-card.component.js +739 -0
- package/src/lib/components/staff-org-ai-card.component.js.map +1 -0
- package/src/lib/components/staff-org-usage-ai-columns.component.d.ts +41 -0
- package/src/lib/components/staff-org-usage-ai-columns.component.js +65 -0
- package/src/lib/components/staff-org-usage-ai-columns.component.js.map +1 -0
- package/src/lib/components/staff-orgs-ai-spend-column.component.d.ts +28 -0
- package/src/lib/components/staff-orgs-ai-spend-column.component.js +89 -0
- package/src/lib/components/staff-orgs-ai-spend-column.component.js.map +1 -0
- package/src/lib/components/staff-user-ai-usage-card.component.d.ts +27 -0
- package/src/lib/components/staff-user-ai-usage-card.component.js +183 -0
- package/src/lib/components/staff-user-ai-usage-card.component.js.map +1 -0
- package/src/lib/components/use-ai-allotments.d.ts +49 -0
- package/src/lib/components/use-ai-allotments.js +171 -0
- package/src/lib/components/use-ai-allotments.js.map +1 -0
- package/src/lib/components/use-ai-crm-answer.d.ts +50 -0
- package/src/lib/components/use-ai-crm-answer.js +220 -0
- package/src/lib/components/use-ai-crm-answer.js.map +1 -0
- package/src/lib/components/use-ai-job-run.d.ts +51 -0
- package/src/lib/components/use-ai-job-run.js +176 -0
- package/src/lib/components/use-ai-job-run.js.map +1 -0
- package/src/lib/components/use-ai-model-choice.d.ts +47 -0
- package/src/lib/components/use-ai-model-choice.js +150 -0
- package/src/lib/components/use-ai-model-choice.js.map +1 -0
- package/src/lib/components/use-ai-products-jobs.d.ts +36 -0
- package/src/lib/components/use-ai-products-jobs.js +190 -0
- package/src/lib/components/use-ai-products-jobs.js.map +1 -0
- package/src/lib/components/use-ai-usage-meter.d.ts +11 -0
- package/src/lib/components/use-ai-usage-meter.js +96 -0
- package/src/lib/components/use-ai-usage-meter.js.map +1 -0
- package/src/lib/components/use-org-ai-usage.d.ts +42 -0
- package/src/lib/components/use-org-ai-usage.js +181 -0
- package/src/lib/components/use-org-ai-usage.js.map +1 -0
- package/src/lib/components/use-staff-orgs-ai-spend.d.ts +18 -0
- package/src/lib/components/use-staff-orgs-ai-spend.js +127 -0
- package/src/lib/components/use-staff-orgs-ai-spend.js.map +1 -0
- package/src/lib/constants.d.ts +24 -0
- package/src/lib/constants.js +23 -0
- package/src/lib/constants.js.map +1 -0
- package/src/lib/declarations.d.ts +48 -0
- package/src/lib/declarations.js +129 -0
- package/src/lib/declarations.js.map +1 -0
- package/src/lib/declarations.server.d.ts +35 -0
- package/src/lib/declarations.server.js +138 -0
- package/src/lib/declarations.server.js.map +1 -0
- package/src/lib/insights/ai-figure-readers.d.ts +90 -0
- package/src/lib/insights/ai-figure-readers.js +863 -0
- package/src/lib/insights/ai-figure-readers.js.map +1 -0
- package/src/lib/insights/ai-insight-digest.d.ts +165 -0
- package/src/lib/insights/ai-insight-digest.js +363 -0
- package/src/lib/insights/ai-insight-digest.js.map +1 -0
- package/src/lib/insights/ai-insight-readers.d.ts +71 -0
- package/src/lib/insights/ai-insight-readers.js +141 -0
- package/src/lib/insights/ai-insight-readers.js.map +1 -0
- package/src/lib/jobs/ai-crm-access.d.ts +61 -0
- package/src/lib/jobs/ai-crm-access.js +94 -0
- package/src/lib/jobs/ai-crm-access.js.map +1 -0
- package/src/lib/jobs/ai-email-bindings.d.ts +97 -0
- package/src/lib/jobs/ai-email-bindings.js +147 -0
- package/src/lib/jobs/ai-email-bindings.js.map +1 -0
- package/src/lib/jobs/ai-job-admission.d.ts +82 -0
- package/src/lib/jobs/ai-job-admission.js +45 -0
- package/src/lib/jobs/ai-job-admission.js.map +1 -0
- package/src/lib/jobs/ai-job-budget.d.ts +167 -0
- package/src/lib/jobs/ai-job-budget.js +161 -0
- package/src/lib/jobs/ai-job-budget.js.map +1 -0
- package/src/lib/jobs/ai-job-campaign-step.d.ts +108 -0
- package/src/lib/jobs/ai-job-campaign-step.js +340 -0
- package/src/lib/jobs/ai-job-campaign-step.js.map +1 -0
- package/src/lib/jobs/ai-job-component-checks.d.ts +74 -0
- package/src/lib/jobs/ai-job-component-checks.js +442 -0
- package/src/lib/jobs/ai-job-component-checks.js.map +1 -0
- package/src/lib/jobs/ai-job-component-step.d.ts +75 -0
- package/src/lib/jobs/ai-job-component-step.js +262 -0
- package/src/lib/jobs/ai-job-component-step.js.map +1 -0
- package/src/lib/jobs/ai-job-crm-step.d.ts +192 -0
- package/src/lib/jobs/ai-job-crm-step.js +734 -0
- package/src/lib/jobs/ai-job-crm-step.js.map +1 -0
- package/src/lib/jobs/ai-job-draft-ids.d.ts +62 -0
- package/src/lib/jobs/ai-job-draft-ids.js +132 -0
- package/src/lib/jobs/ai-job-draft-ids.js.map +1 -0
- package/src/lib/jobs/ai-job-drafts.d.ts +304 -0
- package/src/lib/jobs/ai-job-drafts.js +557 -0
- package/src/lib/jobs/ai-job-drafts.js.map +1 -0
- package/src/lib/jobs/ai-job-email-step.d.ts +195 -0
- package/src/lib/jobs/ai-job-email-step.js +547 -0
- package/src/lib/jobs/ai-job-email-step.js.map +1 -0
- package/src/lib/jobs/ai-job-experiment-step.d.ts +105 -0
- package/src/lib/jobs/ai-job-experiment-step.js +445 -0
- package/src/lib/jobs/ai-job-experiment-step.js.map +1 -0
- package/src/lib/jobs/ai-job-form-step.d.ts +250 -0
- package/src/lib/jobs/ai-job-form-step.js +634 -0
- package/src/lib/jobs/ai-job-form-step.js.map +1 -0
- package/src/lib/jobs/ai-job-generation.d.ts +114 -0
- package/src/lib/jobs/ai-job-generation.js +384 -0
- package/src/lib/jobs/ai-job-generation.js.map +1 -0
- package/src/lib/jobs/ai-job-insight-budget.d.ts +41 -0
- package/src/lib/jobs/ai-job-insight-budget.js +46 -0
- package/src/lib/jobs/ai-job-insight-budget.js.map +1 -0
- package/src/lib/jobs/ai-job-insight-step.d.ts +58 -0
- package/src/lib/jobs/ai-job-insight-step.js +350 -0
- package/src/lib/jobs/ai-job-insight-step.js.map +1 -0
- package/src/lib/jobs/ai-job-layout-step.d.ts +103 -0
- package/src/lib/jobs/ai-job-layout-step.js +340 -0
- package/src/lib/jobs/ai-job-layout-step.js.map +1 -0
- package/src/lib/jobs/ai-job-page-budget.d.ts +57 -0
- package/src/lib/jobs/ai-job-page-budget.js +60 -0
- package/src/lib/jobs/ai-job-page-budget.js.map +1 -0
- package/src/lib/jobs/ai-job-page-sections.d.ts +150 -0
- package/src/lib/jobs/ai-job-page-sections.js +450 -0
- package/src/lib/jobs/ai-job-page-sections.js.map +1 -0
- package/src/lib/jobs/ai-job-page-step.d.ts +198 -0
- package/src/lib/jobs/ai-job-page-step.js +667 -0
- package/src/lib/jobs/ai-job-page-step.js.map +1 -0
- package/src/lib/jobs/ai-job-plan-conformance.d.ts +107 -0
- package/src/lib/jobs/ai-job-plan-conformance.js +164 -0
- package/src/lib/jobs/ai-job-plan-conformance.js.map +1 -0
- package/src/lib/jobs/ai-job-plan-step.d.ts +196 -0
- package/src/lib/jobs/ai-job-plan-step.js +458 -0
- package/src/lib/jobs/ai-job-plan-step.js.map +1 -0
- package/src/lib/jobs/ai-job-plugin-drafts.d.ts +76 -0
- package/src/lib/jobs/ai-job-plugin-drafts.js +91 -0
- package/src/lib/jobs/ai-job-plugin-drafts.js.map +1 -0
- package/src/lib/jobs/ai-job-products-step.d.ts +106 -0
- package/src/lib/jobs/ai-job-products-step.js +436 -0
- package/src/lib/jobs/ai-job-products-step.js.map +1 -0
- package/src/lib/jobs/ai-job-seo-budget.d.ts +52 -0
- package/src/lib/jobs/ai-job-seo-budget.js +63 -0
- package/src/lib/jobs/ai-job-seo-budget.js.map +1 -0
- package/src/lib/jobs/ai-job-seo-step.d.ts +145 -0
- package/src/lib/jobs/ai-job-seo-step.js +809 -0
- package/src/lib/jobs/ai-job-seo-step.js.map +1 -0
- package/src/lib/jobs/ai-job-site-step.d.ts +252 -0
- package/src/lib/jobs/ai-job-site-step.js +538 -0
- package/src/lib/jobs/ai-job-site-step.js.map +1 -0
- package/src/lib/jobs/ai-job-template-step.d.ts +105 -0
- package/src/lib/jobs/ai-job-template-step.js +391 -0
- package/src/lib/jobs/ai-job-template-step.js.map +1 -0
- package/src/lib/jobs/ai-job-text-step.d.ts +125 -0
- package/src/lib/jobs/ai-job-text-step.js +128 -0
- package/src/lib/jobs/ai-job-text-step.js.map +1 -0
- package/src/lib/jobs/ai-job-theme-budget.d.ts +38 -0
- package/src/lib/jobs/ai-job-theme-budget.js +43 -0
- package/src/lib/jobs/ai-job-theme-budget.js.map +1 -0
- package/src/lib/jobs/ai-job-theme-step.d.ts +115 -0
- package/src/lib/jobs/ai-job-theme-step.js +337 -0
- package/src/lib/jobs/ai-job-theme-step.js.map +1 -0
- package/src/lib/jobs/ai-job-workflow-step.d.ts +139 -0
- package/src/lib/jobs/ai-job-workflow-step.js +530 -0
- package/src/lib/jobs/ai-job-workflow-step.js.map +1 -0
- package/src/lib/jobs/ai-jobs-beat.d.ts +78 -0
- package/src/lib/jobs/ai-jobs-beat.js +93 -0
- package/src/lib/jobs/ai-jobs-beat.js.map +1 -0
- package/src/lib/jobs/ai-jobs-pause.d.ts +38 -0
- package/src/lib/jobs/ai-jobs-pause.js +45 -0
- package/src/lib/jobs/ai-jobs-pause.js.map +1 -0
- package/src/lib/jobs/ai-jobs.d.ts +558 -0
- package/src/lib/jobs/ai-jobs.js +1410 -0
- package/src/lib/jobs/ai-jobs.js.map +1 -0
- package/src/lib/jobs/ai-media-asset-server.d.ts +34 -0
- package/src/lib/jobs/ai-media-asset-server.js +34 -0
- package/src/lib/jobs/ai-media-asset-server.js.map +1 -0
- package/src/lib/jobs/ai-media-asset.d.ts +59 -0
- package/src/lib/jobs/ai-media-asset.js +86 -0
- package/src/lib/jobs/ai-media-asset.js.map +1 -0
- package/src/lib/jobs/ai-product-image.d.ts +78 -0
- package/src/lib/jobs/ai-product-image.js +113 -0
- package/src/lib/jobs/ai-product-image.js.map +1 -0
- package/src/lib/jobs/ai-theme-brand-inputs.d.ts +125 -0
- package/src/lib/jobs/ai-theme-brand-inputs.js +378 -0
- package/src/lib/jobs/ai-theme-brand-inputs.js.map +1 -0
- package/src/lib/jobs/ai-theme-brand-server.d.ts +33 -0
- package/src/lib/jobs/ai-theme-brand-server.js +33 -0
- package/src/lib/jobs/ai-theme-brand-server.js.map +1 -0
- package/src/lib/jobs/ai-workflow-records.d.ts +84 -0
- package/src/lib/jobs/ai-workflow-records.js +158 -0
- package/src/lib/jobs/ai-workflow-records.js.map +1 -0
- package/src/lib/jobs/fixtures/ai-free-page-built-recording.d.ts +31 -0
- package/src/lib/jobs/fixtures/ai-free-page-built-recording.js +367 -0
- package/src/lib/jobs/fixtures/ai-free-page-built-recording.js.map +1 -0
- package/src/lib/jobs/fixtures/ai-free-page-recording.d.ts +69 -0
- package/src/lib/jobs/fixtures/ai-free-page-recording.js +442 -0
- package/src/lib/jobs/fixtures/ai-free-page-recording.js.map +1 -0
- package/src/lib/jobs/fixtures/ai-page-briefs.d.ts +146 -0
- package/src/lib/jobs/fixtures/ai-page-briefs.js +1850 -0
- package/src/lib/jobs/fixtures/ai-page-briefs.js.map +1 -0
- package/src/lib/model/ai-allotments.d.ts +208 -0
- package/src/lib/model/ai-allotments.js +269 -0
- package/src/lib/model/ai-allotments.js.map +1 -0
- package/src/lib/model/ai-automation-draft.d.ts +74 -0
- package/src/lib/model/ai-automation-draft.js +310 -0
- package/src/lib/model/ai-automation-draft.js.map +1 -0
- package/src/lib/model/ai-automation-outline.d.ts +50 -0
- package/src/lib/model/ai-automation-outline.js +262 -0
- package/src/lib/model/ai-automation-outline.js.map +1 -0
- package/src/lib/model/ai-build-plan.d.ts +197 -0
- package/src/lib/model/ai-build-plan.js +438 -0
- package/src/lib/model/ai-build-plan.js.map +1 -0
- package/src/lib/model/ai-crm.d.ts +237 -0
- package/src/lib/model/ai-crm.js +225 -0
- package/src/lib/model/ai-crm.js.map +1 -0
- package/src/lib/model/ai-experiment-proposal.d.ts +68 -0
- package/src/lib/model/ai-experiment-proposal.js +146 -0
- package/src/lib/model/ai-experiment-proposal.js.map +1 -0
- package/src/lib/model/ai-experiment.d.ts +309 -0
- package/src/lib/model/ai-experiment.js +395 -0
- package/src/lib/model/ai-experiment.js.map +1 -0
- package/src/lib/model/ai-insight.d.ts +178 -0
- package/src/lib/model/ai-insight.js +201 -0
- package/src/lib/model/ai-insight.js.map +1 -0
- package/src/lib/model/ai-jobs.types.d.ts +412 -0
- package/src/lib/model/ai-jobs.types.js +42 -0
- package/src/lib/model/ai-jobs.types.js.map +1 -0
- package/src/lib/model/ai-page-job.d.ts +92 -0
- package/src/lib/model/ai-page-job.js +159 -0
- package/src/lib/model/ai-page-job.js.map +1 -0
- package/src/lib/model/ai-permissions.d.ts +49 -0
- package/src/lib/model/ai-permissions.js +97 -0
- package/src/lib/model/ai-permissions.js.map +1 -0
- package/src/lib/model/ai-plan-capabilities.d.ts +139 -0
- package/src/lib/model/ai-plan-capabilities.js +149 -0
- package/src/lib/model/ai-plan-capabilities.js.map +1 -0
- package/src/lib/model/ai-products.d.ts +251 -0
- package/src/lib/model/ai-products.js +253 -0
- package/src/lib/model/ai-products.js.map +1 -0
- package/src/lib/model/ai-seo.d.ts +208 -0
- package/src/lib/model/ai-seo.js +150 -0
- package/src/lib/model/ai-seo.js.map +1 -0
- package/src/lib/model/ai-site-inventory.d.ts +164 -0
- package/src/lib/model/ai-site-inventory.js +145 -0
- package/src/lib/model/ai-site-inventory.js.map +1 -0
- package/src/lib/model/ai-site-job.d.ts +247 -0
- package/src/lib/model/ai-site-job.js +314 -0
- package/src/lib/model/ai-site-job.js.map +1 -0
- package/src/lib/model/ai-site-start-seo.d.ts +103 -0
- package/src/lib/model/ai-site-start-seo.js +154 -0
- package/src/lib/model/ai-site-start-seo.js.map +1 -0
- package/src/lib/model/ai-site-start.d.ts +122 -0
- package/src/lib/model/ai-site-start.js +159 -0
- package/src/lib/model/ai-site-start.js.map +1 -0
- package/src/lib/model/ai-site-switch.d.ts +56 -0
- package/src/lib/model/ai-site-switch.js +73 -0
- package/src/lib/model/ai-site-switch.js.map +1 -0
- package/src/lib/model/ai-storefront-claims.d.ts +70 -0
- package/src/lib/model/ai-storefront-claims.js +130 -0
- package/src/lib/model/ai-storefront-claims.js.map +1 -0
- package/src/lib/model/ai-template-subjects.d.ts +82 -0
- package/src/lib/model/ai-template-subjects.js +136 -0
- package/src/lib/model/ai-template-subjects.js.map +1 -0
- package/src/lib/model/ai-theme-proposal.d.ts +210 -0
- package/src/lib/model/ai-theme-proposal.js +506 -0
- package/src/lib/model/ai-theme-proposal.js.map +1 -0
- package/src/lib/model/ai-tokens.d.ts +96 -0
- package/src/lib/model/ai-tokens.js +117 -0
- package/src/lib/model/ai-tokens.js.map +1 -0
- package/src/lib/model/ai-usage-by-user.d.ts +120 -0
- package/src/lib/model/ai-usage-by-user.js +139 -0
- package/src/lib/model/ai-usage-by-user.js.map +1 -0
- package/src/lib/model/ai-workflow-job.d.ts +111 -0
- package/src/lib/model/ai-workflow-job.js +183 -0
- package/src/lib/model/ai-workflow-job.js.map +1 -0
- package/src/lib/model/assist-edit.d.ts +261 -0
- package/src/lib/model/assist-edit.js +175 -0
- package/src/lib/model/assist-edit.js.map +1 -0
- package/src/lib/plugin-config.d.ts +33 -0
- package/src/lib/plugin-config.js +118 -0
- package/src/lib/plugin-config.js.map +1 -0
- package/src/lib/plugin.d.ts +30 -0
- package/src/lib/plugin.js +525 -0
- package/src/lib/plugin.js.map +1 -0
- package/src/lib/providers/anthropic.d.ts +84 -0
- package/src/lib/providers/anthropic.js +432 -0
- package/src/lib/providers/anthropic.js.map +1 -0
- package/src/lib/providers/catalog.d.ts +197 -0
- package/src/lib/providers/catalog.js +312 -0
- package/src/lib/providers/catalog.js.map +1 -0
- package/src/lib/providers/contract.d.ts +464 -0
- package/src/lib/providers/contract.js +274 -0
- package/src/lib/providers/contract.js.map +1 -0
- package/src/lib/providers/model-choice.d.ts +119 -0
- package/src/lib/providers/model-choice.js +416 -0
- package/src/lib/providers/model-choice.js.map +1 -0
- package/src/lib/providers/openai-compatible.d.ts +58 -0
- package/src/lib/providers/openai-compatible.js +361 -0
- package/src/lib/providers/openai-compatible.js.map +1 -0
- package/src/lib/providers/registry.d.ts +49 -0
- package/src/lib/providers/registry.js +71 -0
- package/src/lib/providers/registry.js.map +1 -0
- package/src/lib/providers/routing.d.ts +98 -0
- package/src/lib/providers/routing.js +450 -0
- package/src/lib/providers/routing.js.map +1 -0
- package/src/lib/runtime/ai-abuse-guards.d.ts +113 -0
- package/src/lib/runtime/ai-abuse-guards.js +148 -0
- package/src/lib/runtime/ai-abuse-guards.js.map +1 -0
- package/src/lib/runtime/ai-component-bindings.d.ts +67 -0
- package/src/lib/runtime/ai-component-bindings.js +106 -0
- package/src/lib/runtime/ai-component-bindings.js.map +1 -0
- package/src/lib/runtime/ai-device-audit.d.ts +109 -0
- package/src/lib/runtime/ai-device-audit.js +97 -0
- package/src/lib/runtime/ai-device-audit.js.map +1 -0
- package/src/lib/runtime/ai-doctrine-validators.d.ts +720 -0
- package/src/lib/runtime/ai-doctrine-validators.js +3133 -0
- package/src/lib/runtime/ai-doctrine-validators.js.map +1 -0
- package/src/lib/runtime/ai-doctrine.d.ts +372 -0
- package/src/lib/runtime/ai-doctrine.js +944 -0
- package/src/lib/runtime/ai-doctrine.js.map +1 -0
- package/src/lib/runtime/ai-eval-live.d.ts +321 -0
- package/src/lib/runtime/ai-eval-live.js +1257 -0
- package/src/lib/runtime/ai-eval-live.js.map +1 -0
- package/src/lib/runtime/ai-eval-memory-firestore.d.ts +51 -0
- package/src/lib/runtime/ai-eval-memory-firestore.js +183 -0
- package/src/lib/runtime/ai-eval-memory-firestore.js.map +1 -0
- package/src/lib/runtime/ai-eval.d.ts +441 -0
- package/src/lib/runtime/ai-eval.js +1151 -0
- package/src/lib/runtime/ai-eval.js.map +1 -0
- package/src/lib/runtime/ai-gate.d.ts +130 -0
- package/src/lib/runtime/ai-gate.js +272 -0
- package/src/lib/runtime/ai-gate.js.map +1 -0
- package/src/lib/runtime/ai-generation-bounds.d.ts +24 -0
- package/src/lib/runtime/ai-generation-bounds.js +23 -0
- package/src/lib/runtime/ai-generation-bounds.js.map +1 -0
- package/src/lib/runtime/ai-insight-check.d.ts +76 -0
- package/src/lib/runtime/ai-insight-check.js +281 -0
- package/src/lib/runtime/ai-insight-check.js.map +1 -0
- package/src/lib/runtime/ai-node-tree.d.ts +181 -0
- package/src/lib/runtime/ai-node-tree.js +931 -0
- package/src/lib/runtime/ai-node-tree.js.map +1 -0
- package/src/lib/runtime/ai-page-links.d.ts +79 -0
- package/src/lib/runtime/ai-page-links.js +135 -0
- package/src/lib/runtime/ai-page-links.js.map +1 -0
- package/src/lib/runtime/ai-palette.d.ts +252 -0
- package/src/lib/runtime/ai-palette.generated.d.ts +34 -0
- package/src/lib/runtime/ai-palette.generated.js +5263 -0
- package/src/lib/runtime/ai-palette.generated.js.map +1 -0
- package/src/lib/runtime/ai-palette.js +187 -0
- package/src/lib/runtime/ai-palette.js.map +1 -0
- package/src/lib/runtime/ai-products-generation.d.ts +107 -0
- package/src/lib/runtime/ai-products-generation.js +250 -0
- package/src/lib/runtime/ai-products-generation.js.map +1 -0
- package/src/lib/runtime/ai-repeated-items.d.ts +95 -0
- package/src/lib/runtime/ai-repeated-items.js +397 -0
- package/src/lib/runtime/ai-repeated-items.js.map +1 -0
- package/src/lib/runtime/ai-runtime.d.ts +148 -0
- package/src/lib/runtime/ai-runtime.js +237 -0
- package/src/lib/runtime/ai-runtime.js.map +1 -0
- package/src/lib/runtime/ai-template-examples.d.ts +71 -0
- package/src/lib/runtime/ai-template-examples.js +135 -0
- package/src/lib/runtime/ai-template-examples.js.map +1 -0
- package/src/lib/runtime/assist-answer-cache.d.ts +80 -0
- package/src/lib/runtime/assist-answer-cache.js +184 -0
- package/src/lib/runtime/assist-answer-cache.js.map +1 -0
- package/src/lib/runtime/seo-audit.d.ts +93 -0
- package/src/lib/runtime/seo-audit.js +260 -0
- package/src/lib/runtime/seo-audit.js.map +1 -0
- package/src/lib/runtime/seo-content-fixes.d.ts +41 -0
- package/src/lib/runtime/seo-content-fixes.js +168 -0
- package/src/lib/runtime/seo-content-fixes.js.map +1 -0
- package/src/lib/runtime/seo-fields.d.ts +152 -0
- package/src/lib/runtime/seo-fields.js +215 -0
- package/src/lib/runtime/seo-fields.js.map +1 -0
- package/src/lib/runtime/seo-page-facts.d.ts +61 -0
- package/src/lib/runtime/seo-page-facts.js +150 -0
- package/src/lib/runtime/seo-page-facts.js.map +1 -0
- package/src/lib/runtime/site-inventory.d.ts +63 -0
- package/src/lib/runtime/site-inventory.js +230 -0
- package/src/lib/runtime/site-inventory.js.map +1 -0
- package/src/lib/server/ai-admin-org.d.ts +33 -0
- package/src/lib/server/ai-admin-org.js +381 -0
- package/src/lib/server/ai-admin-org.js.map +1 -0
- package/src/lib/server/ai-admin-orgs-spend.d.ts +40 -0
- package/src/lib/server/ai-admin-orgs-spend.js +129 -0
- package/src/lib/server/ai-admin-orgs-spend.js.map +1 -0
- package/src/lib/server/ai-admin-overage.d.ts +19 -0
- package/src/lib/server/ai-admin-overage.js +246 -0
- package/src/lib/server/ai-admin-overage.js.map +1 -0
- package/src/lib/server/ai-admin-signals.d.ts +34 -0
- package/src/lib/server/ai-admin-signals.js +330 -0
- package/src/lib/server/ai-admin-signals.js.map +1 -0
- package/src/lib/server/ai-admin-user.d.ts +27 -0
- package/src/lib/server/ai-admin-user.js +128 -0
- package/src/lib/server/ai-admin-user.js.map +1 -0
- package/src/lib/server/ai-allotments.d.ts +27 -0
- package/src/lib/server/ai-allotments.js +544 -0
- package/src/lib/server/ai-allotments.js.map +1 -0
- package/src/lib/server/ai-assist-prompts.d.ts +102 -0
- package/src/lib/server/ai-assist-prompts.js +207 -0
- package/src/lib/server/ai-assist-prompts.js.map +1 -0
- package/src/lib/server/ai-assist.d.ts +119 -0
- package/src/lib/server/ai-assist.js +517 -0
- package/src/lib/server/ai-assist.js.map +1 -0
- package/src/lib/server/ai-crm-answer.d.ts +30 -0
- package/src/lib/server/ai-crm-answer.js +98 -0
- package/src/lib/server/ai-crm-answer.js.map +1 -0
- package/src/lib/server/ai-generate-component.d.ts +111 -0
- package/src/lib/server/ai-generate-component.js +643 -0
- package/src/lib/server/ai-generate-component.js.map +1 -0
- package/src/lib/server/ai-host-permissions.d.ts +46 -0
- package/src/lib/server/ai-host-permissions.js +204 -0
- package/src/lib/server/ai-host-permissions.js.map +1 -0
- package/src/lib/server/ai-insight-answer.d.ts +30 -0
- package/src/lib/server/ai-insight-answer.js +83 -0
- package/src/lib/server/ai-insight-answer.js.map +1 -0
- package/src/lib/server/ai-insight-digest-route.d.ts +30 -0
- package/src/lib/server/ai-insight-digest-route.js +156 -0
- package/src/lib/server/ai-insight-digest-route.js.map +1 -0
- package/src/lib/server/ai-jobs-batch.d.ts +48 -0
- package/src/lib/server/ai-jobs-batch.js +306 -0
- package/src/lib/server/ai-jobs-batch.js.map +1 -0
- package/src/lib/server/ai-jobs-beat-route.d.ts +36 -0
- package/src/lib/server/ai-jobs-beat-route.js +86 -0
- package/src/lib/server/ai-jobs-beat-route.js.map +1 -0
- package/src/lib/server/ai-jobs-cancel.d.ts +30 -0
- package/src/lib/server/ai-jobs-cancel.js +74 -0
- package/src/lib/server/ai-jobs-cancel.js.map +1 -0
- package/src/lib/server/ai-jobs-events-route.d.ts +31 -0
- package/src/lib/server/ai-jobs-events-route.js +51 -0
- package/src/lib/server/ai-jobs-events-route.js.map +1 -0
- package/src/lib/server/ai-jobs-events.d.ts +55 -0
- package/src/lib/server/ai-jobs-events.js +144 -0
- package/src/lib/server/ai-jobs-events.js.map +1 -0
- package/src/lib/server/ai-jobs-gate.d.ts +47 -0
- package/src/lib/server/ai-jobs-gate.js +106 -0
- package/src/lib/server/ai-jobs-gate.js.map +1 -0
- package/src/lib/server/ai-jobs-resume.d.ts +23 -0
- package/src/lib/server/ai-jobs-resume.js +209 -0
- package/src/lib/server/ai-jobs-resume.js.map +1 -0
- package/src/lib/server/ai-jobs-route.d.ts +32 -0
- package/src/lib/server/ai-jobs-route.js +307 -0
- package/src/lib/server/ai-jobs-route.js.map +1 -0
- package/src/lib/server/ai-models.d.ts +18 -0
- package/src/lib/server/ai-models.js +134 -0
- package/src/lib/server/ai-models.js.map +1 -0
- package/src/lib/server/ai-seo-apply.d.ts +53 -0
- package/src/lib/server/ai-seo-apply.js +294 -0
- package/src/lib/server/ai-seo-apply.js.map +1 -0
- package/src/lib/server/ai-usage.d.ts +18 -0
- package/src/lib/server/ai-usage.js +220 -0
- package/src/lib/server/ai-usage.js.map +1 -0
- package/src/lib/server/assist-chat.d.ts +234 -0
- package/src/lib/server/assist-chat.js +1446 -0
- package/src/lib/server/assist-chat.js.map +1 -0
- package/src/lib/server/assist-edit-applied.d.ts +22 -0
- package/src/lib/server/assist-edit-applied.js +239 -0
- package/src/lib/server/assist-edit-applied.js.map +1 -0
- package/src/lib/server/assist-edit.d.ts +124 -0
- package/src/lib/server/assist-edit.js +1000 -0
- package/src/lib/server/assist-edit.js.map +1 -0
- package/src/lib/server/assist-feedback.d.ts +31 -0
- package/src/lib/server/assist-feedback.js +115 -0
- package/src/lib/server/assist-feedback.js.map +1 -0
- package/src/lib/server/assist-view-context.d.ts +343 -0
- package/src/lib/server/assist-view-context.js +690 -0
- package/src/lib/server/assist-view-context.js.map +1 -0
- package/src/lib/server/billing-credits.d.ts +59 -0
- package/src/lib/server/billing-credits.js +146 -0
- package/src/lib/server/billing-credits.js.map +1 -0
- package/src/lib/server/billing-overage.d.ts +19 -0
- package/src/lib/server/billing-overage.js +337 -0
- package/src/lib/server/billing-overage.js.map +1 -0
- package/src/lib/server.d.ts +32 -0
- package/src/lib/server.js +265 -0
- package/src/lib/server.js.map +1 -0
- package/src/lib/subprocessors.d.ts +18 -0
- package/src/lib/subprocessors.js +52 -0
- package/src/lib/subprocessors.js.map +1 -0
- package/src/lib/tools/ai-component-tool.d.ts +99 -0
- package/src/lib/tools/ai-component-tool.js +369 -0
- package/src/lib/tools/ai-component-tool.js.map +1 -0
- package/src/lib/tools/ai-crm-tool.d.ts +106 -0
- package/src/lib/tools/ai-crm-tool.js +488 -0
- package/src/lib/tools/ai-crm-tool.js.map +1 -0
- package/src/lib/tools/ai-duplicate-resource-tool.d.ts +71 -0
- package/src/lib/tools/ai-duplicate-resource-tool.js +164 -0
- package/src/lib/tools/ai-duplicate-resource-tool.js.map +1 -0
- package/src/lib/tools/ai-experiment-tool.d.ts +40 -0
- package/src/lib/tools/ai-experiment-tool.js +155 -0
- package/src/lib/tools/ai-experiment-tool.js.map +1 -0
- package/src/lib/tools/ai-insight-tool.d.ts +46 -0
- package/src/lib/tools/ai-insight-tool.js +200 -0
- package/src/lib/tools/ai-insight-tool.js.map +1 -0
- package/src/lib/tools/ai-inventory-lookup-tool.d.ts +86 -0
- package/src/lib/tools/ai-inventory-lookup-tool.js +164 -0
- package/src/lib/tools/ai-inventory-lookup-tool.js.map +1 -0
- package/src/lib/tools/ai-products-tool.d.ts +65 -0
- package/src/lib/tools/ai-products-tool.js +644 -0
- package/src/lib/tools/ai-products-tool.js.map +1 -0
- package/src/lib/tools/ai-seo-tool.d.ts +162 -0
- package/src/lib/tools/ai-seo-tool.js +546 -0
- package/src/lib/tools/ai-seo-tool.js.map +1 -0
- package/src/lib/tools/ai-theme-tool.d.ts +101 -0
- package/src/lib/tools/ai-theme-tool.js +562 -0
- package/src/lib/tools/ai-theme-tool.js.map +1 -0
- package/src/lib/tools/ai-workflow-tool.d.ts +166 -0
- package/src/lib/tools/ai-workflow-tool.js +860 -0
- package/src/lib/tools/ai-workflow-tool.js.map +1 -0
- package/src/lib/usage/ai-allotment-alerts.d.ts +72 -0
- package/src/lib/usage/ai-allotment-alerts.js +157 -0
- package/src/lib/usage/ai-allotment-alerts.js.map +1 -0
- package/src/lib/usage/ai-allotments.d.ts +125 -0
- package/src/lib/usage/ai-allotments.js +239 -0
- package/src/lib/usage/ai-allotments.js.map +1 -0
- package/src/lib/usage/ai-model-sample.d.ts +36 -0
- package/src/lib/usage/ai-model-sample.js +68 -0
- package/src/lib/usage/ai-model-sample.js.map +1 -0
- package/src/lib/usage/ai-usage-alerts.d.ts +55 -0
- package/src/lib/usage/ai-usage-alerts.js +114 -0
- package/src/lib/usage/ai-usage-alerts.js.map +1 -0
- package/src/lib/usage/ai-usage-by-user.d.ts +161 -0
- package/src/lib/usage/ai-usage-by-user.js +211 -0
- package/src/lib/usage/ai-usage-by-user.js.map +1 -0
- package/src/lib/usage/ai-usage-eraser.d.ts +29 -0
- package/src/lib/usage/ai-usage-eraser.js +40 -0
- package/src/lib/usage/ai-usage-eraser.js.map +1 -0
- package/src/lib/usage/ai-usage-meter.d.ts +39 -0
- package/src/lib/usage/ai-usage-meter.js +85 -0
- package/src/lib/usage/ai-usage-meter.js.map +1 -0
- package/src/lib/usage/ai-usage-wire.d.ts +184 -0
- package/src/lib/usage/ai-usage-wire.js +98 -0
- package/src/lib/usage/ai-usage-wire.js.map +1 -0
- package/src/lib/usage/assist-ceiling.d.ts +87 -0
- package/src/lib/usage/assist-ceiling.js +110 -0
- package/src/lib/usage/assist-ceiling.js.map +1 -0
- package/src/lib/usage/assist-free-taste.d.ts +225 -0
- package/src/lib/usage/assist-free-taste.js +308 -0
- package/src/lib/usage/assist-free-taste.js.map +1 -0
- package/src/lib/usage/assist-refusals.d.ts +69 -0
- package/src/lib/usage/assist-refusals.js +79 -0
- package/src/lib/usage/assist-refusals.js.map +1 -0
- package/src/lib/usage/assist-signal-mining.d.ts +375 -0
- package/src/lib/usage/assist-signal-mining.js +344 -0
- package/src/lib/usage/assist-signal-mining.js.map +1 -0
- package/src/lib/usage/assist-usage.d.ts +571 -0
- package/src/lib/usage/assist-usage.js +978 -0
- package/src/lib/usage/assist-usage.js.map +1 -0
- package/src/lib/usage/staff-org-ai.d.ts +242 -0
- package/src/lib/usage/staff-org-ai.js +173 -0
- package/src/lib/usage/staff-org-ai.js.map +1 -0
- package/src/lib/usage/staff-org-usage-ai.d.ts +83 -0
- package/src/lib/usage/staff-org-usage-ai.js +59 -0
- package/src/lib/usage/staff-org-usage-ai.js.map +1 -0
- package/src/lib/usage/staff-orgs-ai-spend.d.ts +83 -0
- package/src/lib/usage/staff-orgs-ai-spend.js +114 -0
- package/src/lib/usage/staff-orgs-ai-spend.js.map +1 -0
|
@@ -0,0 +1,1850 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/ import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
17
|
+
import { emptyAiSiteInventory } from "../../model/ai-site-inventory.js";
|
|
18
|
+
function section(prefix, name, uses, items, build) {
|
|
19
|
+
const nodes = {};
|
|
20
|
+
let counter = 0;
|
|
21
|
+
const add = (node, id)=>{
|
|
22
|
+
const key = id != null ? id : `${prefix}${++counter}`;
|
|
23
|
+
nodes[key] = node;
|
|
24
|
+
return key;
|
|
25
|
+
};
|
|
26
|
+
const root = add(build(add), `${prefix}section`);
|
|
27
|
+
nodes['root'] = {
|
|
28
|
+
componentId: 'div',
|
|
29
|
+
nodes: [
|
|
30
|
+
root
|
|
31
|
+
]
|
|
32
|
+
};
|
|
33
|
+
return {
|
|
34
|
+
answer: {
|
|
35
|
+
rootId: 'root',
|
|
36
|
+
nodes
|
|
37
|
+
},
|
|
38
|
+
section: {
|
|
39
|
+
name,
|
|
40
|
+
uses,
|
|
41
|
+
items
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const typography = (variant, children, component)=>({
|
|
46
|
+
componentId: 'muiTypography',
|
|
47
|
+
props: _extends({
|
|
48
|
+
variant,
|
|
49
|
+
children
|
|
50
|
+
}, component ? {
|
|
51
|
+
component
|
|
52
|
+
} : {})
|
|
53
|
+
});
|
|
54
|
+
/** A Section holding a Container holding a column Stack: the frame every golden section uses. */ function framed(add, children, maxWidth, py, stack = {}) {
|
|
55
|
+
const column = add({
|
|
56
|
+
componentId: 'muiStack',
|
|
57
|
+
props: _extends({
|
|
58
|
+
direction: 'column'
|
|
59
|
+
}, stack),
|
|
60
|
+
sx: {
|
|
61
|
+
gap: 2
|
|
62
|
+
},
|
|
63
|
+
nodes: children
|
|
64
|
+
});
|
|
65
|
+
const container = add({
|
|
66
|
+
componentId: 'muiContainer',
|
|
67
|
+
props: {
|
|
68
|
+
maxWidth
|
|
69
|
+
},
|
|
70
|
+
sx: {
|
|
71
|
+
py
|
|
72
|
+
},
|
|
73
|
+
nodes: [
|
|
74
|
+
column
|
|
75
|
+
]
|
|
76
|
+
});
|
|
77
|
+
return {
|
|
78
|
+
componentId: 'section',
|
|
79
|
+
props: {
|
|
80
|
+
element: 'section'
|
|
81
|
+
},
|
|
82
|
+
nodes: [
|
|
83
|
+
container
|
|
84
|
+
]
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function hero(prefix, input) {
|
|
88
|
+
var _input_name;
|
|
89
|
+
return section(prefix, (_input_name = input.name) != null ? _input_name : 'hero', input.cta ? [
|
|
90
|
+
input.cta.screenId
|
|
91
|
+
] : [], 0, (add)=>{
|
|
92
|
+
const children = [
|
|
93
|
+
add(typography('h1', input.title, 'h1')),
|
|
94
|
+
add(typography('body1', input.lead))
|
|
95
|
+
];
|
|
96
|
+
if (input.cta) {
|
|
97
|
+
children.push(add({
|
|
98
|
+
componentId: 'muiButton',
|
|
99
|
+
props: {
|
|
100
|
+
children: input.cta.label,
|
|
101
|
+
variant: 'contained',
|
|
102
|
+
screenId: input.cta.screenId
|
|
103
|
+
}
|
|
104
|
+
}));
|
|
105
|
+
}
|
|
106
|
+
if (input.image) children.push(add({
|
|
107
|
+
componentId: 'image',
|
|
108
|
+
props: {
|
|
109
|
+
alt: input.image
|
|
110
|
+
}
|
|
111
|
+
}));
|
|
112
|
+
return framed(add, children, 'md', 8, {
|
|
113
|
+
alignItems: 'flex-start'
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* The size each item of a golden row takes (AGL-3055): full width on a phone,
|
|
119
|
+
* two across from sm where four or more share the row, and two, three or four
|
|
120
|
+
* across from md, as the stored string the Grid renderer reads.
|
|
121
|
+
*/ function span(items) {
|
|
122
|
+
if (items <= 2) return 'xs:12 md:6';
|
|
123
|
+
if (items === 3) return 'xs:12 md:4';
|
|
124
|
+
return items === 4 ? 'xs:12 sm:6 md:3' : 'xs:12 sm:6 md:4';
|
|
125
|
+
}
|
|
126
|
+
/** A Grid item of a row of `items`, holding one element. */ function cell(add, items, child, repeat) {
|
|
127
|
+
return add(_extends({
|
|
128
|
+
componentId: 'muiGrid',
|
|
129
|
+
props: {
|
|
130
|
+
size: span(items)
|
|
131
|
+
},
|
|
132
|
+
nodes: [
|
|
133
|
+
child
|
|
134
|
+
]
|
|
135
|
+
}, repeat ? {
|
|
136
|
+
repeat
|
|
137
|
+
} : {}));
|
|
138
|
+
}
|
|
139
|
+
/** A row of Grid items: a Grid container spaced by its own spacing (AGL-3055). */ function row(add, cells) {
|
|
140
|
+
return add({
|
|
141
|
+
componentId: 'muiGrid',
|
|
142
|
+
props: {
|
|
143
|
+
container: true,
|
|
144
|
+
spacing: 3
|
|
145
|
+
},
|
|
146
|
+
nodes: cells
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
function cards(prefix, input) {
|
|
150
|
+
return section(prefix, input.name, [
|
|
151
|
+
input.componentId
|
|
152
|
+
], input.items.length, (add)=>{
|
|
153
|
+
const cells = input.items.map((propValues)=>cell(add, input.items.length, add({
|
|
154
|
+
componentId: 'reusableInstance',
|
|
155
|
+
props: {
|
|
156
|
+
refId: input.componentId,
|
|
157
|
+
propValues
|
|
158
|
+
}
|
|
159
|
+
})));
|
|
160
|
+
const children = [
|
|
161
|
+
add(typography('h2', input.heading, 'h2'))
|
|
162
|
+
];
|
|
163
|
+
if (input.intro) children.push(add(typography('body1', input.intro)));
|
|
164
|
+
children.push(row(add, cells));
|
|
165
|
+
return framed(add, children, 'lg', 8);
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
/** A short list: fewer rows than the plan rules count as repeated items. */ function list(prefix, input) {
|
|
169
|
+
return section(prefix, input.name, [], input.items.length, (add)=>{
|
|
170
|
+
const rows = input.items.map((item)=>add({
|
|
171
|
+
componentId: 'muiListItem',
|
|
172
|
+
nodes: [
|
|
173
|
+
add({
|
|
174
|
+
componentId: 'muiListItemText',
|
|
175
|
+
props: _extends({
|
|
176
|
+
primary: item.primary
|
|
177
|
+
}, item.secondary ? {
|
|
178
|
+
secondary: item.secondary
|
|
179
|
+
} : {})
|
|
180
|
+
})
|
|
181
|
+
]
|
|
182
|
+
}));
|
|
183
|
+
return framed(add, [
|
|
184
|
+
add(typography('h2', input.heading, 'h2')),
|
|
185
|
+
add({
|
|
186
|
+
componentId: 'muiList',
|
|
187
|
+
props: {
|
|
188
|
+
dense: false
|
|
189
|
+
},
|
|
190
|
+
nodes: rows
|
|
191
|
+
})
|
|
192
|
+
], 'md', 6);
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
function prose(prefix, input) {
|
|
196
|
+
return section(prefix, input.name, [], 0, (add)=>framed(add, [
|
|
197
|
+
add(typography('h2', input.heading, 'h2')),
|
|
198
|
+
...input.paragraphs.map((copy)=>add(typography('body1', copy)))
|
|
199
|
+
], 'md', 6));
|
|
200
|
+
}
|
|
201
|
+
function form(prefix, input) {
|
|
202
|
+
return section(prefix, input.name, [
|
|
203
|
+
input.formId
|
|
204
|
+
], 0, (add)=>framed(add, [
|
|
205
|
+
add(typography('h2', input.heading, 'h2')),
|
|
206
|
+
add(typography('body1', input.intro)),
|
|
207
|
+
add({
|
|
208
|
+
componentId: 'form',
|
|
209
|
+
props: {
|
|
210
|
+
formId: input.formId
|
|
211
|
+
}
|
|
212
|
+
})
|
|
213
|
+
], 'sm', 8));
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Items drawn where they repeat, each a Card: what a workspace that keeps no
|
|
217
|
+
* reusable components builds instead of placing a component (AGL-3030).
|
|
218
|
+
*/ function inlineCards(prefix, input) {
|
|
219
|
+
return section(prefix, input.name, [], input.items.length, (add)=>{
|
|
220
|
+
const cells = input.items.map((item)=>cell(add, input.items.length, add({
|
|
221
|
+
componentId: 'muiCard',
|
|
222
|
+
props: {
|
|
223
|
+
variant: 'outlined'
|
|
224
|
+
},
|
|
225
|
+
nodes: [
|
|
226
|
+
add({
|
|
227
|
+
componentId: 'muiCardContent',
|
|
228
|
+
nodes: [
|
|
229
|
+
add(typography('h3', item.title, 'h3')),
|
|
230
|
+
add(typography('body2', item.summary))
|
|
231
|
+
]
|
|
232
|
+
})
|
|
233
|
+
]
|
|
234
|
+
})));
|
|
235
|
+
return framed(add, [
|
|
236
|
+
add(typography('h2', input.heading, 'h2')),
|
|
237
|
+
row(add, cells)
|
|
238
|
+
], 'lg', 8);
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* The same cards written once (AGL-3053): one Grid item holding a Card whose
|
|
243
|
+
* title is `{{1}}` and whose summary is `{{2}}`, with every card's pair listed
|
|
244
|
+
* on the item, which the section check draws into exactly the cells
|
|
245
|
+
* `inlineCards` writes out.
|
|
246
|
+
*/ function inlineCardsOnce(prefix, input) {
|
|
247
|
+
return section(prefix, input.name, [], input.items.length, (add)=>{
|
|
248
|
+
const item = cell(add, input.items.length, add({
|
|
249
|
+
componentId: 'muiCard',
|
|
250
|
+
props: {
|
|
251
|
+
variant: 'outlined'
|
|
252
|
+
},
|
|
253
|
+
nodes: [
|
|
254
|
+
add({
|
|
255
|
+
componentId: 'muiCardContent',
|
|
256
|
+
nodes: [
|
|
257
|
+
add(typography('h3', '{{1}}', 'h3')),
|
|
258
|
+
add(typography('body2', '{{2}}'))
|
|
259
|
+
]
|
|
260
|
+
})
|
|
261
|
+
]
|
|
262
|
+
}), input.items.map((entry)=>[
|
|
263
|
+
entry.title,
|
|
264
|
+
entry.summary
|
|
265
|
+
]));
|
|
266
|
+
return framed(add, [
|
|
267
|
+
add(typography('h2', input.heading, 'h2')),
|
|
268
|
+
row(add, [
|
|
269
|
+
item
|
|
270
|
+
])
|
|
271
|
+
], 'lg', 8);
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* A form the page carries itself: a Form with no formId, holding its Form
|
|
276
|
+
* Fields — what a workspace that keeps no saved forms builds instead of
|
|
277
|
+
* placing one (AGL-3030). The site's submit route collects it by its name.
|
|
278
|
+
*/ function inlineForm(prefix, input) {
|
|
279
|
+
return section(prefix, input.name, [], 0, (add)=>framed(add, [
|
|
280
|
+
add(typography('h2', input.heading, 'h2')),
|
|
281
|
+
add(typography('body1', input.intro)),
|
|
282
|
+
add({
|
|
283
|
+
componentId: 'form',
|
|
284
|
+
props: {
|
|
285
|
+
formName: input.formName,
|
|
286
|
+
submitLabel: input.submitLabel
|
|
287
|
+
},
|
|
288
|
+
nodes: input.fields.map((field)=>add({
|
|
289
|
+
componentId: 'formField',
|
|
290
|
+
props: _extends({}, field)
|
|
291
|
+
}))
|
|
292
|
+
})
|
|
293
|
+
], 'sm', 8));
|
|
294
|
+
}
|
|
295
|
+
function callToAction(prefix, input) {
|
|
296
|
+
return section(prefix, input.name, [
|
|
297
|
+
input.screenId
|
|
298
|
+
], 0, (add)=>framed(add, [
|
|
299
|
+
add(typography('h2', input.heading, 'h2')),
|
|
300
|
+
add(typography('body1', input.body)),
|
|
301
|
+
add({
|
|
302
|
+
componentId: 'muiButton',
|
|
303
|
+
props: {
|
|
304
|
+
children: input.label,
|
|
305
|
+
variant: 'contained',
|
|
306
|
+
screenId: input.screenId
|
|
307
|
+
}
|
|
308
|
+
})
|
|
309
|
+
], 'md', 8, {
|
|
310
|
+
alignItems: 'center'
|
|
311
|
+
}));
|
|
312
|
+
}
|
|
313
|
+
const THEME = {
|
|
314
|
+
summary: [
|
|
315
|
+
'Light scheme with the theme’s default type'
|
|
316
|
+
],
|
|
317
|
+
colors: {
|
|
318
|
+
'primary.main': '#1f5fa8',
|
|
319
|
+
'secondary.main': '#c2410c'
|
|
320
|
+
},
|
|
321
|
+
fonts: [
|
|
322
|
+
'Inter'
|
|
323
|
+
]
|
|
324
|
+
};
|
|
325
|
+
const SITE_LAYOUT = {
|
|
326
|
+
id: 'lay-site',
|
|
327
|
+
name: 'Site layout',
|
|
328
|
+
parentId: null
|
|
329
|
+
};
|
|
330
|
+
const HOME = {
|
|
331
|
+
id: 'scr-home',
|
|
332
|
+
name: 'Home',
|
|
333
|
+
slug: '/',
|
|
334
|
+
layoutId: 'lay-site',
|
|
335
|
+
template: false
|
|
336
|
+
};
|
|
337
|
+
function site(hostId, parts) {
|
|
338
|
+
var _parts_components, _parts_forms, _parts_layouts, _parts_screens;
|
|
339
|
+
return _extends({}, emptyAiSiteInventory(hostId), {
|
|
340
|
+
components: (_parts_components = parts.components) != null ? _parts_components : [],
|
|
341
|
+
forms: (_parts_forms = parts.forms) != null ? _parts_forms : [],
|
|
342
|
+
layouts: (_parts_layouts = parts.layouts) != null ? _parts_layouts : [
|
|
343
|
+
SITE_LAYOUT
|
|
344
|
+
],
|
|
345
|
+
screens: [
|
|
346
|
+
HOME,
|
|
347
|
+
...(_parts_screens = parts.screens) != null ? _parts_screens : []
|
|
348
|
+
],
|
|
349
|
+
theme: THEME
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
function brief(input) {
|
|
353
|
+
const components = new Set(input.inventory.components.map((row)=>row.id));
|
|
354
|
+
const forms = new Set(input.inventory.forms.map((row)=>row.id));
|
|
355
|
+
const screens = new Set(input.inventory.screens.map((row)=>row.id));
|
|
356
|
+
const reuse = [
|
|
357
|
+
{
|
|
358
|
+
kind: 'layout',
|
|
359
|
+
id: input.layout,
|
|
360
|
+
purpose: 'the page renders inside it'
|
|
361
|
+
}
|
|
362
|
+
];
|
|
363
|
+
const seen = new Set([
|
|
364
|
+
input.layout
|
|
365
|
+
]);
|
|
366
|
+
for (const { section: planned } of input.sections){
|
|
367
|
+
for (const ref of planned.uses){
|
|
368
|
+
if (seen.has(ref)) continue;
|
|
369
|
+
seen.add(ref);
|
|
370
|
+
if (components.has(ref)) reuse.push({
|
|
371
|
+
kind: 'component',
|
|
372
|
+
id: ref,
|
|
373
|
+
purpose: planned.name
|
|
374
|
+
});
|
|
375
|
+
else if (forms.has(ref)) reuse.push({
|
|
376
|
+
kind: 'form',
|
|
377
|
+
id: ref,
|
|
378
|
+
purpose: planned.name
|
|
379
|
+
});
|
|
380
|
+
else if (screens.has(ref)) reuse.push({
|
|
381
|
+
kind: 'screen',
|
|
382
|
+
id: ref,
|
|
383
|
+
purpose: `linked from ${planned.name}`
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
return {
|
|
388
|
+
id: input.id,
|
|
389
|
+
icp: input.icp,
|
|
390
|
+
pageType: input.pageType,
|
|
391
|
+
brief: input.brief,
|
|
392
|
+
inventory: input.inventory,
|
|
393
|
+
plan: {
|
|
394
|
+
reuse,
|
|
395
|
+
create: [],
|
|
396
|
+
screens: [
|
|
397
|
+
{
|
|
398
|
+
title: input.title,
|
|
399
|
+
slug: input.slug,
|
|
400
|
+
layout: input.layout,
|
|
401
|
+
template: null,
|
|
402
|
+
duplicateOf: null,
|
|
403
|
+
nav: input.nav,
|
|
404
|
+
seoTitle: input.seo.title,
|
|
405
|
+
seoDescription: input.seo.description,
|
|
406
|
+
sections: input.sections.map((entry)=>entry.section)
|
|
407
|
+
}
|
|
408
|
+
]
|
|
409
|
+
},
|
|
410
|
+
answers: input.sections.map((entry)=>entry.answer),
|
|
411
|
+
seo: input.seo
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
export const AI_PAGE_BRIEF_FIXTURES = [
|
|
415
|
+
// ── Agency client sites ─────────────────────────────────────────────────
|
|
416
|
+
brief({
|
|
417
|
+
id: 'agency-roofing-landing',
|
|
418
|
+
icp: 'agency',
|
|
419
|
+
pageType: 'landing',
|
|
420
|
+
brief: 'A landing page for our spring roof inspection offer in Springfield: what the inspection covers, two customer quotes, and the quote request form.',
|
|
421
|
+
inventory: site('host-acme-roofing', {
|
|
422
|
+
components: [
|
|
423
|
+
{
|
|
424
|
+
id: 'cmp-service-card',
|
|
425
|
+
name: 'Service card',
|
|
426
|
+
props: {
|
|
427
|
+
title: 'text',
|
|
428
|
+
summary: 'text'
|
|
429
|
+
}
|
|
430
|
+
},
|
|
431
|
+
{
|
|
432
|
+
id: 'cmp-testimonial',
|
|
433
|
+
name: 'Testimonial',
|
|
434
|
+
props: {
|
|
435
|
+
quote: 'text',
|
|
436
|
+
name: 'text',
|
|
437
|
+
role: 'text'
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
],
|
|
441
|
+
forms: [
|
|
442
|
+
{
|
|
443
|
+
id: 'frm-quote',
|
|
444
|
+
name: 'Quote request',
|
|
445
|
+
fields: [
|
|
446
|
+
'name',
|
|
447
|
+
'email',
|
|
448
|
+
'phone',
|
|
449
|
+
'message'
|
|
450
|
+
]
|
|
451
|
+
}
|
|
452
|
+
],
|
|
453
|
+
screens: [
|
|
454
|
+
{
|
|
455
|
+
id: 'scr-contact',
|
|
456
|
+
name: 'Contact',
|
|
457
|
+
slug: 'contact',
|
|
458
|
+
layoutId: 'lay-site',
|
|
459
|
+
template: false
|
|
460
|
+
}
|
|
461
|
+
]
|
|
462
|
+
}),
|
|
463
|
+
title: 'Spring roof inspections',
|
|
464
|
+
slug: '/spring-roof-inspection',
|
|
465
|
+
layout: 'lay-site',
|
|
466
|
+
nav: false,
|
|
467
|
+
seo: {
|
|
468
|
+
title: 'Spring Roof Inspections in Springfield',
|
|
469
|
+
description: 'A licensed roofer checks shingles, flashing and gutters, then sends photos and a written report within two days.'
|
|
470
|
+
},
|
|
471
|
+
sections: [
|
|
472
|
+
hero('a', {
|
|
473
|
+
title: 'Spring roof inspections in Springfield',
|
|
474
|
+
lead: 'A licensed roofer checks shingles, flashing and gutters, and sends you photos and a written report within two days.',
|
|
475
|
+
cta: {
|
|
476
|
+
label: 'Request a quote',
|
|
477
|
+
screenId: 'scr-contact'
|
|
478
|
+
},
|
|
479
|
+
image: 'A roofer inspecting shingles on a two-story house'
|
|
480
|
+
}),
|
|
481
|
+
cards('b', {
|
|
482
|
+
name: 'what the inspection covers',
|
|
483
|
+
heading: 'What the inspection covers',
|
|
484
|
+
componentId: 'cmp-service-card',
|
|
485
|
+
items: [
|
|
486
|
+
{
|
|
487
|
+
title: 'Shingles and flashing',
|
|
488
|
+
summary: 'Lifted, cracked or missing shingles, and the seals around chimneys and vents.'
|
|
489
|
+
},
|
|
490
|
+
{
|
|
491
|
+
title: 'Gutters and drainage',
|
|
492
|
+
summary: 'Clogs, sagging runs and downspouts that send water toward the foundation.'
|
|
493
|
+
},
|
|
494
|
+
{
|
|
495
|
+
title: 'Attic and ventilation',
|
|
496
|
+
summary: 'Signs of leaks, damp insulation and blocked soffit vents.'
|
|
497
|
+
}
|
|
498
|
+
]
|
|
499
|
+
}),
|
|
500
|
+
cards('c', {
|
|
501
|
+
name: 'customer quotes',
|
|
502
|
+
heading: 'What homeowners say',
|
|
503
|
+
componentId: 'cmp-testimonial',
|
|
504
|
+
items: [
|
|
505
|
+
{
|
|
506
|
+
quote: 'They found a failed vent boot before it leaked into the bedroom.',
|
|
507
|
+
name: '[customer name]',
|
|
508
|
+
role: 'Homeowner, Springfield'
|
|
509
|
+
},
|
|
510
|
+
{
|
|
511
|
+
quote: 'The report had photos of every problem and a price for each fix.',
|
|
512
|
+
name: '[customer name]',
|
|
513
|
+
role: 'Homeowner, Riverton'
|
|
514
|
+
}
|
|
515
|
+
]
|
|
516
|
+
}),
|
|
517
|
+
form('d', {
|
|
518
|
+
name: 'quote request form',
|
|
519
|
+
heading: 'Book your inspection',
|
|
520
|
+
intro: 'Tell us about your roof and when you are home. We confirm a time within one business day.',
|
|
521
|
+
formId: 'frm-quote'
|
|
522
|
+
})
|
|
523
|
+
]
|
|
524
|
+
}),
|
|
525
|
+
brief({
|
|
526
|
+
id: 'agency-dental-implants-service',
|
|
527
|
+
icp: 'agency',
|
|
528
|
+
pageType: 'service',
|
|
529
|
+
brief: 'A service page for dental implants: how treatment works step by step, our two implant dentists, and the appointment request form.',
|
|
530
|
+
inventory: site('host-lakeside-dental', {
|
|
531
|
+
components: [
|
|
532
|
+
{
|
|
533
|
+
id: 'cmp-dentist-card',
|
|
534
|
+
name: 'Dentist card',
|
|
535
|
+
props: {
|
|
536
|
+
name: 'text',
|
|
537
|
+
credentials: 'text',
|
|
538
|
+
bio: 'text'
|
|
539
|
+
}
|
|
540
|
+
},
|
|
541
|
+
{
|
|
542
|
+
id: 'cmp-treatment-step',
|
|
543
|
+
name: 'Treatment step',
|
|
544
|
+
props: {
|
|
545
|
+
step: 'text',
|
|
546
|
+
detail: 'text'
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
],
|
|
550
|
+
forms: [
|
|
551
|
+
{
|
|
552
|
+
id: 'frm-appointment',
|
|
553
|
+
name: 'Appointment request',
|
|
554
|
+
fields: [
|
|
555
|
+
'name',
|
|
556
|
+
'email',
|
|
557
|
+
'phone',
|
|
558
|
+
'preferred time'
|
|
559
|
+
]
|
|
560
|
+
}
|
|
561
|
+
]
|
|
562
|
+
}),
|
|
563
|
+
title: 'Dental implants',
|
|
564
|
+
slug: '/dental-implants',
|
|
565
|
+
layout: 'lay-site',
|
|
566
|
+
nav: true,
|
|
567
|
+
seo: {
|
|
568
|
+
title: 'Dental Implants at Lakeside Dental',
|
|
569
|
+
description: 'Permanent tooth replacement placed and restored in one office, from the first 3D scan to the final crown.'
|
|
570
|
+
},
|
|
571
|
+
sections: [
|
|
572
|
+
hero('a', {
|
|
573
|
+
title: 'Dental implants at Lakeside Dental',
|
|
574
|
+
lead: 'A permanent tooth replacement placed and restored in one office, from the first scan to the final crown.',
|
|
575
|
+
image: 'A dentist showing a patient an implant model'
|
|
576
|
+
}),
|
|
577
|
+
cards('b', {
|
|
578
|
+
name: 'how treatment works',
|
|
579
|
+
heading: 'How treatment works',
|
|
580
|
+
componentId: 'cmp-treatment-step',
|
|
581
|
+
items: [
|
|
582
|
+
{
|
|
583
|
+
step: 'Consultation and 3D scan',
|
|
584
|
+
detail: 'We check bone density and plan the implant position.'
|
|
585
|
+
},
|
|
586
|
+
{
|
|
587
|
+
step: 'Implant placement',
|
|
588
|
+
detail: 'A short procedure under local anesthetic.'
|
|
589
|
+
},
|
|
590
|
+
{
|
|
591
|
+
step: 'Healing',
|
|
592
|
+
detail: 'Usually three to six months while the implant bonds with the bone.'
|
|
593
|
+
},
|
|
594
|
+
{
|
|
595
|
+
step: 'Crown fitting',
|
|
596
|
+
detail: 'A custom crown matched to your natural teeth.'
|
|
597
|
+
}
|
|
598
|
+
]
|
|
599
|
+
}),
|
|
600
|
+
cards('c', {
|
|
601
|
+
name: 'implant dentists',
|
|
602
|
+
heading: 'Your implant team',
|
|
603
|
+
componentId: 'cmp-dentist-card',
|
|
604
|
+
items: [
|
|
605
|
+
{
|
|
606
|
+
name: '[dentist name]',
|
|
607
|
+
credentials: 'DDS, implant fellowship',
|
|
608
|
+
bio: 'Places and restores implants in the same office.'
|
|
609
|
+
},
|
|
610
|
+
{
|
|
611
|
+
name: '[dentist name]',
|
|
612
|
+
credentials: 'DMD, prosthodontist',
|
|
613
|
+
bio: 'Designs crowns, bridges and full-arch restorations.'
|
|
614
|
+
}
|
|
615
|
+
]
|
|
616
|
+
}),
|
|
617
|
+
form('d', {
|
|
618
|
+
name: 'appointment request form',
|
|
619
|
+
heading: 'Ask for a consultation',
|
|
620
|
+
intro: 'Send a few details and we call you to find a time. Bring any X-rays you already have.',
|
|
621
|
+
formId: 'frm-appointment'
|
|
622
|
+
})
|
|
623
|
+
]
|
|
624
|
+
}),
|
|
625
|
+
brief({
|
|
626
|
+
id: 'agency-law-firm-about',
|
|
627
|
+
icp: 'agency',
|
|
628
|
+
pageType: 'about',
|
|
629
|
+
brief: 'An about page for a family law firm: how the firm works with clients, the three attorneys and what each practices, and a link to book a consultation.',
|
|
630
|
+
inventory: site('host-hart-law', {
|
|
631
|
+
components: [
|
|
632
|
+
{
|
|
633
|
+
id: 'cmp-attorney-card',
|
|
634
|
+
name: 'Attorney card',
|
|
635
|
+
props: {
|
|
636
|
+
name: 'text',
|
|
637
|
+
practice: 'text'
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
],
|
|
641
|
+
screens: [
|
|
642
|
+
{
|
|
643
|
+
id: 'scr-contact',
|
|
644
|
+
name: 'Contact',
|
|
645
|
+
slug: 'contact',
|
|
646
|
+
layoutId: 'lay-site',
|
|
647
|
+
template: false
|
|
648
|
+
}
|
|
649
|
+
]
|
|
650
|
+
}),
|
|
651
|
+
title: 'About the firm',
|
|
652
|
+
slug: '/about',
|
|
653
|
+
layout: 'lay-site',
|
|
654
|
+
nav: true,
|
|
655
|
+
seo: {
|
|
656
|
+
title: 'About Hart & Owens Family Law',
|
|
657
|
+
description: 'A family law practice in Marion County. One attorney from first meeting to final order, and a written estimate before filing.'
|
|
658
|
+
},
|
|
659
|
+
sections: [
|
|
660
|
+
hero('a', {
|
|
661
|
+
title: 'About Hart & Owens',
|
|
662
|
+
lead: 'A family law practice that has represented parents and spouses in Marion County since [founding year].'
|
|
663
|
+
}),
|
|
664
|
+
prose('b', {
|
|
665
|
+
name: 'how we work',
|
|
666
|
+
heading: 'How we work',
|
|
667
|
+
paragraphs: [
|
|
668
|
+
'Every client works with one attorney from the first meeting to the final order, and gets a written estimate before any filing.',
|
|
669
|
+
'We settle when settlement protects you, and we go to trial when it does not.'
|
|
670
|
+
]
|
|
671
|
+
}),
|
|
672
|
+
cards('c', {
|
|
673
|
+
name: 'attorneys',
|
|
674
|
+
heading: 'Our attorneys',
|
|
675
|
+
componentId: 'cmp-attorney-card',
|
|
676
|
+
items: [
|
|
677
|
+
{
|
|
678
|
+
name: '[attorney name]',
|
|
679
|
+
practice: 'Divorce and property division'
|
|
680
|
+
},
|
|
681
|
+
{
|
|
682
|
+
name: '[attorney name]',
|
|
683
|
+
practice: 'Custody and parenting plans'
|
|
684
|
+
},
|
|
685
|
+
{
|
|
686
|
+
name: '[attorney name]',
|
|
687
|
+
practice: 'Adoption and guardianship'
|
|
688
|
+
}
|
|
689
|
+
]
|
|
690
|
+
}),
|
|
691
|
+
callToAction('d', {
|
|
692
|
+
name: 'book a consultation',
|
|
693
|
+
heading: 'Talk to an attorney',
|
|
694
|
+
body: 'The first consultation covers your situation, your options and what each would cost.',
|
|
695
|
+
label: 'Schedule a consultation',
|
|
696
|
+
screenId: 'scr-contact'
|
|
697
|
+
})
|
|
698
|
+
]
|
|
699
|
+
}),
|
|
700
|
+
brief({
|
|
701
|
+
id: 'agency-hvac-pricing',
|
|
702
|
+
icp: 'agency',
|
|
703
|
+
pageType: 'pricing',
|
|
704
|
+
brief: 'A pricing page for heating and cooling maintenance plans: the three plans, what every visit includes, and a button to schedule service.',
|
|
705
|
+
inventory: site('host-northside-hvac', {
|
|
706
|
+
components: [
|
|
707
|
+
{
|
|
708
|
+
id: 'cmp-plan-card',
|
|
709
|
+
name: 'Plan card',
|
|
710
|
+
props: {
|
|
711
|
+
name: 'text',
|
|
712
|
+
price: 'text',
|
|
713
|
+
summary: 'text'
|
|
714
|
+
}
|
|
715
|
+
},
|
|
716
|
+
{
|
|
717
|
+
id: 'cmp-checklist-item',
|
|
718
|
+
name: 'Checklist item',
|
|
719
|
+
props: {
|
|
720
|
+
item: 'text'
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
],
|
|
724
|
+
screens: [
|
|
725
|
+
{
|
|
726
|
+
id: 'scr-schedule',
|
|
727
|
+
name: 'Schedule service',
|
|
728
|
+
slug: 'schedule',
|
|
729
|
+
layoutId: 'lay-site',
|
|
730
|
+
template: false
|
|
731
|
+
}
|
|
732
|
+
]
|
|
733
|
+
}),
|
|
734
|
+
title: 'Maintenance plans',
|
|
735
|
+
slug: '/maintenance-plans',
|
|
736
|
+
layout: 'lay-site',
|
|
737
|
+
nav: true,
|
|
738
|
+
seo: {
|
|
739
|
+
title: 'Heating and Cooling Maintenance Plans',
|
|
740
|
+
description: 'Two tune-ups a year, priority scheduling and a repair discount for one yearly price. Plans for one system or the whole home.'
|
|
741
|
+
},
|
|
742
|
+
sections: [
|
|
743
|
+
hero('a', {
|
|
744
|
+
title: 'Heating and cooling maintenance plans',
|
|
745
|
+
lead: 'Two tune-ups a year, priority scheduling and a discount on repairs, for one flat yearly price.'
|
|
746
|
+
}),
|
|
747
|
+
cards('b', {
|
|
748
|
+
name: 'plans',
|
|
749
|
+
heading: 'Choose a plan',
|
|
750
|
+
componentId: 'cmp-plan-card',
|
|
751
|
+
items: [
|
|
752
|
+
{
|
|
753
|
+
name: 'Single system',
|
|
754
|
+
price: '[price] a year',
|
|
755
|
+
summary: 'One furnace or one air conditioner.'
|
|
756
|
+
},
|
|
757
|
+
{
|
|
758
|
+
name: 'Whole home',
|
|
759
|
+
price: '[price] a year',
|
|
760
|
+
summary: 'A furnace and an air conditioner.'
|
|
761
|
+
},
|
|
762
|
+
{
|
|
763
|
+
name: 'Multi-zone',
|
|
764
|
+
price: '[price] a year',
|
|
765
|
+
summary: 'Up to three systems at one address.'
|
|
766
|
+
}
|
|
767
|
+
]
|
|
768
|
+
}),
|
|
769
|
+
cards('c', {
|
|
770
|
+
name: 'what every visit includes',
|
|
771
|
+
heading: 'Every visit includes',
|
|
772
|
+
componentId: 'cmp-checklist-item',
|
|
773
|
+
items: [
|
|
774
|
+
{
|
|
775
|
+
item: 'Filter change and coil cleaning'
|
|
776
|
+
},
|
|
777
|
+
{
|
|
778
|
+
item: 'Refrigerant and pressure checks'
|
|
779
|
+
},
|
|
780
|
+
{
|
|
781
|
+
item: 'A written report on the system’s condition'
|
|
782
|
+
}
|
|
783
|
+
]
|
|
784
|
+
}),
|
|
785
|
+
callToAction('d', {
|
|
786
|
+
name: 'schedule service',
|
|
787
|
+
heading: 'Start with a tune-up',
|
|
788
|
+
body: 'Pick a time and we sign you up at the visit.',
|
|
789
|
+
label: 'Schedule service',
|
|
790
|
+
screenId: 'scr-schedule'
|
|
791
|
+
})
|
|
792
|
+
]
|
|
793
|
+
}),
|
|
794
|
+
// ── Multi-brand businesses ──────────────────────────────────────────────
|
|
795
|
+
brief({
|
|
796
|
+
id: 'multibrand-restaurant-group-event',
|
|
797
|
+
icp: 'multi-brand',
|
|
798
|
+
pageType: 'event',
|
|
799
|
+
brief: 'An event page for the Piedmont wine dinner at Osteria Lume, one of our group’s restaurants: the courses and pairings, a note about the winemaker, and the reservation form.',
|
|
800
|
+
inventory: site('host-harbor-group-osteria', {
|
|
801
|
+
components: [
|
|
802
|
+
{
|
|
803
|
+
id: 'cmp-menu-item',
|
|
804
|
+
name: 'Menu item',
|
|
805
|
+
props: {
|
|
806
|
+
dish: 'text',
|
|
807
|
+
pairing: 'text'
|
|
808
|
+
}
|
|
809
|
+
}
|
|
810
|
+
],
|
|
811
|
+
layouts: [
|
|
812
|
+
{
|
|
813
|
+
id: 'lay-osteria',
|
|
814
|
+
name: 'Osteria layout',
|
|
815
|
+
parentId: null
|
|
816
|
+
},
|
|
817
|
+
{
|
|
818
|
+
id: 'lay-grill',
|
|
819
|
+
name: 'Harbor Grill layout',
|
|
820
|
+
parentId: null
|
|
821
|
+
}
|
|
822
|
+
],
|
|
823
|
+
forms: [
|
|
824
|
+
{
|
|
825
|
+
id: 'frm-reservation',
|
|
826
|
+
name: 'Event reservation',
|
|
827
|
+
fields: [
|
|
828
|
+
'name',
|
|
829
|
+
'email',
|
|
830
|
+
'party size'
|
|
831
|
+
]
|
|
832
|
+
}
|
|
833
|
+
],
|
|
834
|
+
screens: [
|
|
835
|
+
{
|
|
836
|
+
id: 'scr-menu',
|
|
837
|
+
name: 'Menu',
|
|
838
|
+
slug: 'menu',
|
|
839
|
+
layoutId: 'lay-osteria',
|
|
840
|
+
template: false
|
|
841
|
+
}
|
|
842
|
+
]
|
|
843
|
+
}),
|
|
844
|
+
title: 'Piedmont wine dinner',
|
|
845
|
+
slug: '/events/piedmont-wine-dinner',
|
|
846
|
+
layout: 'lay-osteria',
|
|
847
|
+
nav: false,
|
|
848
|
+
seo: {
|
|
849
|
+
title: 'Piedmont Wine Dinner at Osteria Lume',
|
|
850
|
+
description: 'Five courses paired with wines from one family vineyard, with a tasting led by the winemaker. Reserve seats online.'
|
|
851
|
+
},
|
|
852
|
+
sections: [
|
|
853
|
+
hero('a', {
|
|
854
|
+
title: 'Piedmont wine dinner at Osteria Lume',
|
|
855
|
+
lead: 'Five courses paired with wines from one family vineyard, on [event date] at 7 p.m.',
|
|
856
|
+
image: 'A long table set for dinner with wine glasses'
|
|
857
|
+
}),
|
|
858
|
+
cards('b', {
|
|
859
|
+
name: 'courses and pairings',
|
|
860
|
+
heading: 'The menu',
|
|
861
|
+
componentId: 'cmp-menu-item',
|
|
862
|
+
items: [
|
|
863
|
+
{
|
|
864
|
+
dish: 'Vitello tonnato',
|
|
865
|
+
pairing: 'Paired with Arneis'
|
|
866
|
+
},
|
|
867
|
+
{
|
|
868
|
+
dish: 'Agnolotti del plin',
|
|
869
|
+
pairing: 'Paired with Dolcetto'
|
|
870
|
+
},
|
|
871
|
+
{
|
|
872
|
+
dish: 'Braised short rib',
|
|
873
|
+
pairing: 'Paired with Barbaresco'
|
|
874
|
+
},
|
|
875
|
+
{
|
|
876
|
+
dish: 'Hazelnut torte',
|
|
877
|
+
pairing: 'Paired with Moscato d’Asti'
|
|
878
|
+
}
|
|
879
|
+
]
|
|
880
|
+
}),
|
|
881
|
+
prose('c', {
|
|
882
|
+
name: 'about the winemaker',
|
|
883
|
+
heading: 'About the winemaker',
|
|
884
|
+
paragraphs: [
|
|
885
|
+
'The vineyard’s third-generation winemaker leads a short tasting before the first course and answers questions at each table.'
|
|
886
|
+
]
|
|
887
|
+
}),
|
|
888
|
+
form('d', {
|
|
889
|
+
name: 'reservation form',
|
|
890
|
+
heading: 'Reserve seats',
|
|
891
|
+
intro: 'Seats are limited to [number of seats]. We confirm by email and hold your table until 7:15 p.m.',
|
|
892
|
+
formId: 'frm-reservation'
|
|
893
|
+
})
|
|
894
|
+
]
|
|
895
|
+
}),
|
|
896
|
+
brief({
|
|
897
|
+
id: 'multibrand-home-goods-product',
|
|
898
|
+
icp: 'multi-brand',
|
|
899
|
+
pageType: 'product',
|
|
900
|
+
brief: 'A product page for the Hearth cast iron skillet on the Hearth brand site: three features, two reviews from home cooks, and a link to where to buy.',
|
|
901
|
+
inventory: site('host-hearth-and-grain', {
|
|
902
|
+
components: [
|
|
903
|
+
{
|
|
904
|
+
id: 'cmp-feature',
|
|
905
|
+
name: 'Feature',
|
|
906
|
+
props: {
|
|
907
|
+
title: 'text',
|
|
908
|
+
body: 'text'
|
|
909
|
+
}
|
|
910
|
+
},
|
|
911
|
+
{
|
|
912
|
+
id: 'cmp-review',
|
|
913
|
+
name: 'Review',
|
|
914
|
+
props: {
|
|
915
|
+
quote: 'text',
|
|
916
|
+
name: 'text'
|
|
917
|
+
}
|
|
918
|
+
}
|
|
919
|
+
],
|
|
920
|
+
layouts: [
|
|
921
|
+
{
|
|
922
|
+
id: 'lay-hearth',
|
|
923
|
+
name: 'Hearth layout',
|
|
924
|
+
parentId: null
|
|
925
|
+
},
|
|
926
|
+
{
|
|
927
|
+
id: 'lay-grain',
|
|
928
|
+
name: 'Grain layout',
|
|
929
|
+
parentId: null
|
|
930
|
+
}
|
|
931
|
+
],
|
|
932
|
+
screens: [
|
|
933
|
+
{
|
|
934
|
+
id: 'scr-stores',
|
|
935
|
+
name: 'Where to buy',
|
|
936
|
+
slug: 'where-to-buy',
|
|
937
|
+
layoutId: 'lay-hearth',
|
|
938
|
+
template: false
|
|
939
|
+
}
|
|
940
|
+
]
|
|
941
|
+
}),
|
|
942
|
+
title: 'Cast iron skillet',
|
|
943
|
+
slug: '/cast-iron-skillet',
|
|
944
|
+
layout: 'lay-hearth',
|
|
945
|
+
nav: false,
|
|
946
|
+
seo: {
|
|
947
|
+
title: 'Hearth 12-Inch Cast Iron Skillet',
|
|
948
|
+
description: 'A seasoned 12-inch skillet with a milled cooking surface, a thick base that holds heat and a helper handle.'
|
|
949
|
+
},
|
|
950
|
+
sections: [
|
|
951
|
+
hero('a', {
|
|
952
|
+
title: 'The Hearth cast iron skillet',
|
|
953
|
+
lead: 'A 12-inch skillet with a smooth-milled cooking surface, seasoned and ready to use.',
|
|
954
|
+
image: 'A cast iron skillet searing vegetables on a stovetop'
|
|
955
|
+
}),
|
|
956
|
+
cards('b', {
|
|
957
|
+
name: 'features',
|
|
958
|
+
heading: 'Why it cooks evenly',
|
|
959
|
+
componentId: 'cmp-feature',
|
|
960
|
+
items: [
|
|
961
|
+
{
|
|
962
|
+
title: 'Milled surface',
|
|
963
|
+
body: 'Food releases without a thick coat of oil.'
|
|
964
|
+
},
|
|
965
|
+
{
|
|
966
|
+
title: 'Thick base',
|
|
967
|
+
body: 'Holds heat when cold food hits the pan.'
|
|
968
|
+
},
|
|
969
|
+
{
|
|
970
|
+
title: 'Helper handle',
|
|
971
|
+
body: 'A second grip for lifting a full pan.'
|
|
972
|
+
}
|
|
973
|
+
]
|
|
974
|
+
}),
|
|
975
|
+
cards('c', {
|
|
976
|
+
name: 'reviews',
|
|
977
|
+
heading: 'From home cooks',
|
|
978
|
+
componentId: 'cmp-review',
|
|
979
|
+
items: [
|
|
980
|
+
{
|
|
981
|
+
quote: 'Eggs slide right off after a week of use.',
|
|
982
|
+
name: '[reviewer name]'
|
|
983
|
+
},
|
|
984
|
+
{
|
|
985
|
+
quote: 'Heavy, but it holds a sear better than anything I own.',
|
|
986
|
+
name: '[reviewer name]'
|
|
987
|
+
}
|
|
988
|
+
]
|
|
989
|
+
}),
|
|
990
|
+
callToAction('d', {
|
|
991
|
+
name: 'where to buy',
|
|
992
|
+
heading: 'Find it near you',
|
|
993
|
+
body: 'Hearth skillets are sold in kitchen stores and online.',
|
|
994
|
+
label: 'Where to buy',
|
|
995
|
+
screenId: 'scr-stores'
|
|
996
|
+
})
|
|
997
|
+
]
|
|
998
|
+
}),
|
|
999
|
+
brief({
|
|
1000
|
+
id: 'multibrand-fitness-studios-pricing',
|
|
1001
|
+
icp: 'multi-brand',
|
|
1002
|
+
pageType: 'pricing',
|
|
1003
|
+
brief: 'A pricing page for Pulse Cycle memberships across all Pulse Cycle studios: the three memberships, the questions riders ask most, and the free class form.',
|
|
1004
|
+
inventory: site('host-pulse-studios-cycle', {
|
|
1005
|
+
components: [
|
|
1006
|
+
{
|
|
1007
|
+
id: 'cmp-plan-card',
|
|
1008
|
+
name: 'Membership card',
|
|
1009
|
+
props: {
|
|
1010
|
+
name: 'text',
|
|
1011
|
+
price: 'text',
|
|
1012
|
+
summary: 'text'
|
|
1013
|
+
}
|
|
1014
|
+
},
|
|
1015
|
+
{
|
|
1016
|
+
id: 'cmp-faq-item',
|
|
1017
|
+
name: 'FAQ item',
|
|
1018
|
+
props: {
|
|
1019
|
+
question: 'text',
|
|
1020
|
+
answer: 'text'
|
|
1021
|
+
}
|
|
1022
|
+
}
|
|
1023
|
+
],
|
|
1024
|
+
layouts: [
|
|
1025
|
+
{
|
|
1026
|
+
id: 'lay-cycle',
|
|
1027
|
+
name: 'Pulse Cycle layout',
|
|
1028
|
+
parentId: null
|
|
1029
|
+
},
|
|
1030
|
+
{
|
|
1031
|
+
id: 'lay-yoga',
|
|
1032
|
+
name: 'Pulse Yoga layout',
|
|
1033
|
+
parentId: null
|
|
1034
|
+
}
|
|
1035
|
+
],
|
|
1036
|
+
forms: [
|
|
1037
|
+
{
|
|
1038
|
+
id: 'frm-trial',
|
|
1039
|
+
name: 'Free class',
|
|
1040
|
+
fields: [
|
|
1041
|
+
'name',
|
|
1042
|
+
'email',
|
|
1043
|
+
'studio'
|
|
1044
|
+
]
|
|
1045
|
+
}
|
|
1046
|
+
]
|
|
1047
|
+
}),
|
|
1048
|
+
title: 'Memberships',
|
|
1049
|
+
slug: '/memberships',
|
|
1050
|
+
layout: 'lay-cycle',
|
|
1051
|
+
nav: true,
|
|
1052
|
+
seo: {
|
|
1053
|
+
title: 'Pulse Cycle Memberships',
|
|
1054
|
+
description: 'Ride at any Pulse Cycle studio with a monthly membership or a class pack. Every membership starts with a free class.'
|
|
1055
|
+
},
|
|
1056
|
+
sections: [
|
|
1057
|
+
hero('a', {
|
|
1058
|
+
title: 'Pulse Cycle memberships',
|
|
1059
|
+
lead: 'Ride at any Pulse Cycle studio. Every membership starts with a free class.'
|
|
1060
|
+
}),
|
|
1061
|
+
cards('b', {
|
|
1062
|
+
name: 'memberships',
|
|
1063
|
+
heading: 'Memberships',
|
|
1064
|
+
componentId: 'cmp-plan-card',
|
|
1065
|
+
items: [
|
|
1066
|
+
{
|
|
1067
|
+
name: 'Four classes',
|
|
1068
|
+
price: '[price] a month',
|
|
1069
|
+
summary: 'Four rides a month, booked up to a week ahead.'
|
|
1070
|
+
},
|
|
1071
|
+
{
|
|
1072
|
+
name: 'Unlimited',
|
|
1073
|
+
price: '[price] a month',
|
|
1074
|
+
summary: 'Ride as often as you like, booked two weeks ahead.'
|
|
1075
|
+
},
|
|
1076
|
+
{
|
|
1077
|
+
name: 'Class pack',
|
|
1078
|
+
price: '[price] for ten',
|
|
1079
|
+
summary: 'Ten rides to use within three months.'
|
|
1080
|
+
}
|
|
1081
|
+
]
|
|
1082
|
+
}),
|
|
1083
|
+
cards('c', {
|
|
1084
|
+
name: 'questions riders ask',
|
|
1085
|
+
heading: 'Questions riders ask',
|
|
1086
|
+
componentId: 'cmp-faq-item',
|
|
1087
|
+
items: [
|
|
1088
|
+
{
|
|
1089
|
+
question: 'Can I pause my membership?',
|
|
1090
|
+
answer: 'Yes, for up to two months a year.'
|
|
1091
|
+
},
|
|
1092
|
+
{
|
|
1093
|
+
question: 'Do I need cycling shoes?',
|
|
1094
|
+
answer: 'No. Every studio lends shoes at no charge.'
|
|
1095
|
+
},
|
|
1096
|
+
{
|
|
1097
|
+
question: 'Can I ride at another studio?',
|
|
1098
|
+
answer: 'Yes, at every Pulse Cycle location.'
|
|
1099
|
+
}
|
|
1100
|
+
]
|
|
1101
|
+
}),
|
|
1102
|
+
form('d', {
|
|
1103
|
+
name: 'free class form',
|
|
1104
|
+
heading: 'Book a free class',
|
|
1105
|
+
intro: 'Choose your studio and we send the schedule for the week.',
|
|
1106
|
+
formId: 'frm-trial'
|
|
1107
|
+
})
|
|
1108
|
+
]
|
|
1109
|
+
}),
|
|
1110
|
+
// ── Single small businesses ─────────────────────────────────────────────
|
|
1111
|
+
brief({
|
|
1112
|
+
id: 'smallbiz-bakery-contact',
|
|
1113
|
+
icp: 'small-business',
|
|
1114
|
+
pageType: 'contact',
|
|
1115
|
+
brief: 'A contact page for our bakery with the opening hours and the contact form for custom cake and wholesale questions.',
|
|
1116
|
+
inventory: site('host-corner-bakery', {
|
|
1117
|
+
forms: [
|
|
1118
|
+
{
|
|
1119
|
+
id: 'frm-contact',
|
|
1120
|
+
name: 'Contact',
|
|
1121
|
+
fields: [
|
|
1122
|
+
'name',
|
|
1123
|
+
'email',
|
|
1124
|
+
'message'
|
|
1125
|
+
]
|
|
1126
|
+
}
|
|
1127
|
+
]
|
|
1128
|
+
}),
|
|
1129
|
+
title: 'Contact',
|
|
1130
|
+
slug: '/contact',
|
|
1131
|
+
layout: 'lay-site',
|
|
1132
|
+
nav: true,
|
|
1133
|
+
seo: {
|
|
1134
|
+
title: 'Visit or Contact the Bakery',
|
|
1135
|
+
description: 'Opening hours for the bakery, and a form for custom cake and wholesale questions. We answer within a day.'
|
|
1136
|
+
},
|
|
1137
|
+
sections: [
|
|
1138
|
+
hero('a', {
|
|
1139
|
+
title: 'Visit or call the bakery',
|
|
1140
|
+
lead: 'Fresh bread from 7 a.m., six days a week, at [street address].'
|
|
1141
|
+
}),
|
|
1142
|
+
prose('b', {
|
|
1143
|
+
name: 'opening hours',
|
|
1144
|
+
heading: 'Opening hours',
|
|
1145
|
+
paragraphs: [
|
|
1146
|
+
'Open Tuesday to Friday from 7 a.m. to 3 p.m., and Saturday and Sunday from 8 a.m. to 2 p.m. Closed on Mondays.'
|
|
1147
|
+
]
|
|
1148
|
+
}),
|
|
1149
|
+
form('c', {
|
|
1150
|
+
name: 'contact form',
|
|
1151
|
+
heading: 'Send us a message',
|
|
1152
|
+
intro: 'Ask about custom cakes and wholesale orders. We answer within a day.',
|
|
1153
|
+
formId: 'frm-contact'
|
|
1154
|
+
})
|
|
1155
|
+
]
|
|
1156
|
+
}),
|
|
1157
|
+
brief({
|
|
1158
|
+
id: 'smallbiz-yoga-teacher-about',
|
|
1159
|
+
icp: 'small-business',
|
|
1160
|
+
pageType: 'about',
|
|
1161
|
+
brief: 'An about page for my yoga teaching: why I teach, my training, and a link to the class schedule.',
|
|
1162
|
+
inventory: site('host-maya-yoga', {
|
|
1163
|
+
screens: [
|
|
1164
|
+
{
|
|
1165
|
+
id: 'scr-classes',
|
|
1166
|
+
name: 'Classes',
|
|
1167
|
+
slug: 'classes',
|
|
1168
|
+
layoutId: 'lay-site',
|
|
1169
|
+
template: false
|
|
1170
|
+
}
|
|
1171
|
+
]
|
|
1172
|
+
}),
|
|
1173
|
+
title: 'About',
|
|
1174
|
+
slug: '/about',
|
|
1175
|
+
layout: 'lay-site',
|
|
1176
|
+
nav: true,
|
|
1177
|
+
seo: {
|
|
1178
|
+
title: 'About Maya: Slow Flow and Restorative Yoga',
|
|
1179
|
+
description: 'Small-group slow flow and restorative yoga classes under twelve students, with room for questions in every class.'
|
|
1180
|
+
},
|
|
1181
|
+
sections: [
|
|
1182
|
+
hero('a', {
|
|
1183
|
+
title: 'About Maya',
|
|
1184
|
+
lead: 'I teach slow flow and restorative yoga in small groups, with room for questions in every class.',
|
|
1185
|
+
image: 'A yoga teacher guiding a small class in a sunlit studio'
|
|
1186
|
+
}),
|
|
1187
|
+
prose('b', {
|
|
1188
|
+
name: 'why I teach',
|
|
1189
|
+
heading: 'Why I teach',
|
|
1190
|
+
paragraphs: [
|
|
1191
|
+
'I started yoga to recover from a running injury, and kept practicing because it made the rest of my week calmer.',
|
|
1192
|
+
'My classes stay under twelve students, so I can offer a change for each body in the room.'
|
|
1193
|
+
]
|
|
1194
|
+
}),
|
|
1195
|
+
list('c', {
|
|
1196
|
+
name: 'training',
|
|
1197
|
+
heading: 'Training',
|
|
1198
|
+
items: [
|
|
1199
|
+
{
|
|
1200
|
+
primary: '500-hour yoga teacher training',
|
|
1201
|
+
secondary: '[school name]'
|
|
1202
|
+
},
|
|
1203
|
+
{
|
|
1204
|
+
primary: 'Restorative yoga certificate',
|
|
1205
|
+
secondary: '[school name]'
|
|
1206
|
+
}
|
|
1207
|
+
]
|
|
1208
|
+
}),
|
|
1209
|
+
callToAction('d', {
|
|
1210
|
+
name: 'class schedule',
|
|
1211
|
+
heading: 'Come to a class',
|
|
1212
|
+
body: 'New students can try any class at the drop-in rate.',
|
|
1213
|
+
label: 'See the schedule',
|
|
1214
|
+
screenId: 'scr-classes'
|
|
1215
|
+
})
|
|
1216
|
+
]
|
|
1217
|
+
}),
|
|
1218
|
+
brief({
|
|
1219
|
+
id: 'smallbiz-bike-repair-service',
|
|
1220
|
+
icp: 'small-business',
|
|
1221
|
+
pageType: 'service',
|
|
1222
|
+
brief: 'A service page for bike tune-ups and repairs: the three tune-up levels, how long repairs take, and the drop-off booking form.',
|
|
1223
|
+
inventory: site('host-spoke-bike-repair', {
|
|
1224
|
+
components: [
|
|
1225
|
+
{
|
|
1226
|
+
id: 'cmp-service-item',
|
|
1227
|
+
name: 'Service item',
|
|
1228
|
+
props: {
|
|
1229
|
+
name: 'text',
|
|
1230
|
+
detail: 'text'
|
|
1231
|
+
}
|
|
1232
|
+
}
|
|
1233
|
+
],
|
|
1234
|
+
forms: [
|
|
1235
|
+
{
|
|
1236
|
+
id: 'frm-booking',
|
|
1237
|
+
name: 'Repair booking',
|
|
1238
|
+
fields: [
|
|
1239
|
+
'name',
|
|
1240
|
+
'email',
|
|
1241
|
+
'bike type',
|
|
1242
|
+
'drop-off day'
|
|
1243
|
+
]
|
|
1244
|
+
}
|
|
1245
|
+
]
|
|
1246
|
+
}),
|
|
1247
|
+
title: 'Tune-ups and repairs',
|
|
1248
|
+
slug: '/repairs',
|
|
1249
|
+
layout: 'lay-site',
|
|
1250
|
+
nav: true,
|
|
1251
|
+
seo: {
|
|
1252
|
+
title: 'Bike Tune-Ups and Repairs',
|
|
1253
|
+
description: 'Drop off your bike any weekday morning. Three tune-up levels, most ready the next day, with a call before any extra cost.'
|
|
1254
|
+
},
|
|
1255
|
+
sections: [
|
|
1256
|
+
hero('a', {
|
|
1257
|
+
title: 'Bike tune-ups and repairs',
|
|
1258
|
+
lead: 'Drop off your bike any weekday morning and pick it up ready to ride, most often the next day.'
|
|
1259
|
+
}),
|
|
1260
|
+
cards('b', {
|
|
1261
|
+
name: 'tune-up levels',
|
|
1262
|
+
heading: 'Tune-up levels',
|
|
1263
|
+
componentId: 'cmp-service-item',
|
|
1264
|
+
items: [
|
|
1265
|
+
{
|
|
1266
|
+
name: 'Safety check',
|
|
1267
|
+
detail: 'Brakes, tires and a full bolt check. [price]'
|
|
1268
|
+
},
|
|
1269
|
+
{
|
|
1270
|
+
name: 'Standard tune-up',
|
|
1271
|
+
detail: 'Adds gear and brake adjustment and wheel truing. [price]'
|
|
1272
|
+
},
|
|
1273
|
+
{
|
|
1274
|
+
name: 'Overhaul',
|
|
1275
|
+
detail: 'Adds a full strip-down, cleaning and new cables. [price]'
|
|
1276
|
+
}
|
|
1277
|
+
]
|
|
1278
|
+
}),
|
|
1279
|
+
prose('c', {
|
|
1280
|
+
name: 'how long repairs take',
|
|
1281
|
+
heading: 'How long it takes',
|
|
1282
|
+
paragraphs: [
|
|
1283
|
+
'Most tune-ups are ready the next day. We call before any repair that costs more than the estimate.'
|
|
1284
|
+
]
|
|
1285
|
+
}),
|
|
1286
|
+
form('d', {
|
|
1287
|
+
name: 'drop-off booking form',
|
|
1288
|
+
heading: 'Book a drop-off',
|
|
1289
|
+
intro: 'Tell us about the bike and the day you can bring it in.',
|
|
1290
|
+
formId: 'frm-booking'
|
|
1291
|
+
})
|
|
1292
|
+
]
|
|
1293
|
+
})
|
|
1294
|
+
];
|
|
1295
|
+
/** A Free page brief whose card sections are written once, with the page written out in full beside it. */ function freeBrief(input) {
|
|
1296
|
+
const once = input.sections.map((entry)=>'once' in entry ? entry.once : entry);
|
|
1297
|
+
const full = input.sections.map((entry)=>'full' in entry ? entry.full : entry);
|
|
1298
|
+
return _extends({}, brief(_extends({}, input, {
|
|
1299
|
+
sections: once
|
|
1300
|
+
})), {
|
|
1301
|
+
writtenOut: full.map((entry)=>entry.answer)
|
|
1302
|
+
});
|
|
1303
|
+
}
|
|
1304
|
+
/** A section of cards, written once and written out. */ function repeatedCards(prefix, input) {
|
|
1305
|
+
return {
|
|
1306
|
+
once: inlineCardsOnce(prefix, input),
|
|
1307
|
+
full: inlineCards(prefix, input)
|
|
1308
|
+
};
|
|
1309
|
+
}
|
|
1310
|
+
/**
|
|
1311
|
+
* A page brief for a Free workspace (AGL-3030): a site that keeps no reusable
|
|
1312
|
+
* components and no saved forms, with the one layout its plan includes. Its
|
|
1313
|
+
* practice areas repeat and its consultation request is a form, so the page
|
|
1314
|
+
* is built the one way such a workspace can build it — the cards drawn where
|
|
1315
|
+
* they repeat, written once in the answer (AGL-3053), and the form carried by
|
|
1316
|
+
* the page with its fields inside it. The plan the page job keeps for it is
|
|
1317
|
+
* held to the Free workspace's capabilities, never the whole doctrine.
|
|
1318
|
+
*/ export const AI_FREE_PAGE_FIXTURE = freeBrief({
|
|
1319
|
+
id: 'free-law-firm-about',
|
|
1320
|
+
icp: 'small-business',
|
|
1321
|
+
pageType: 'about',
|
|
1322
|
+
brief: 'An about page for Brightwater Law: who we are, the four areas we practice, how we work with clients, and a form to request a consultation.',
|
|
1323
|
+
inventory: site('host-brightwater-law', {}),
|
|
1324
|
+
title: 'About Brightwater Law',
|
|
1325
|
+
slug: '/about',
|
|
1326
|
+
layout: 'lay-site',
|
|
1327
|
+
nav: true,
|
|
1328
|
+
seo: {
|
|
1329
|
+
title: 'About Brightwater Law',
|
|
1330
|
+
description: 'A small firm for families and small businesses: estate planning, real estate, business formation and landlord-tenant matters.'
|
|
1331
|
+
},
|
|
1332
|
+
sections: [
|
|
1333
|
+
hero('a', {
|
|
1334
|
+
title: 'About Brightwater Law',
|
|
1335
|
+
lead: 'We are a small firm that helps families and small businesses in [city] plan ahead and settle disputes before they reach a courtroom.'
|
|
1336
|
+
}),
|
|
1337
|
+
repeatedCards('b', {
|
|
1338
|
+
name: 'practice areas',
|
|
1339
|
+
heading: 'What we help with',
|
|
1340
|
+
items: [
|
|
1341
|
+
{
|
|
1342
|
+
title: 'Estate planning',
|
|
1343
|
+
summary: 'Wills, trusts and powers of attorney, written so your family knows what you wanted.'
|
|
1344
|
+
},
|
|
1345
|
+
{
|
|
1346
|
+
title: 'Real estate',
|
|
1347
|
+
summary: 'Purchase agreements, title questions and closings for homes and small commercial property.'
|
|
1348
|
+
},
|
|
1349
|
+
{
|
|
1350
|
+
title: 'Business formation',
|
|
1351
|
+
summary: 'Choosing an entity, operating agreements and the contracts a new business signs first.'
|
|
1352
|
+
},
|
|
1353
|
+
{
|
|
1354
|
+
title: 'Landlord and tenant',
|
|
1355
|
+
summary: 'Leases, deposits and notices, for owners with a few units and the people who rent from them.'
|
|
1356
|
+
}
|
|
1357
|
+
]
|
|
1358
|
+
}),
|
|
1359
|
+
prose('c', {
|
|
1360
|
+
name: 'how we work',
|
|
1361
|
+
heading: 'How we work with you',
|
|
1362
|
+
paragraphs: [
|
|
1363
|
+
'Your first call is with the attorney who will handle the matter. We quote a flat fee where the work allows one, and we say so before we start when it does not.'
|
|
1364
|
+
]
|
|
1365
|
+
}),
|
|
1366
|
+
inlineForm('d', {
|
|
1367
|
+
name: 'consultation request form',
|
|
1368
|
+
heading: 'Request a consultation',
|
|
1369
|
+
intro: 'Tell us a little about what you need. We reply within one business day.',
|
|
1370
|
+
formName: 'Consultation request',
|
|
1371
|
+
submitLabel: 'Request a consultation',
|
|
1372
|
+
fields: [
|
|
1373
|
+
{
|
|
1374
|
+
fieldName: 'name',
|
|
1375
|
+
label: 'Your name',
|
|
1376
|
+
fieldType: 'text',
|
|
1377
|
+
required: true
|
|
1378
|
+
},
|
|
1379
|
+
{
|
|
1380
|
+
fieldName: 'email',
|
|
1381
|
+
label: 'Email',
|
|
1382
|
+
fieldType: 'email',
|
|
1383
|
+
required: true
|
|
1384
|
+
},
|
|
1385
|
+
{
|
|
1386
|
+
fieldName: 'phone',
|
|
1387
|
+
label: 'Phone',
|
|
1388
|
+
fieldType: 'text'
|
|
1389
|
+
},
|
|
1390
|
+
{
|
|
1391
|
+
fieldName: 'matter',
|
|
1392
|
+
label: 'What can we help with?',
|
|
1393
|
+
fieldType: 'textarea',
|
|
1394
|
+
required: true
|
|
1395
|
+
}
|
|
1396
|
+
]
|
|
1397
|
+
})
|
|
1398
|
+
]
|
|
1399
|
+
});
|
|
1400
|
+
/**
|
|
1401
|
+
* A Free law firm's practice areas with copy of the length a firm writes
|
|
1402
|
+
* (AGL-3053): four areas for families and six for businesses and property
|
|
1403
|
+
* owners, 25 to 29 words a summary. A live Free About page's four practice
|
|
1404
|
+
* areas, drawn card by card, were cut off at their pass's ceiling on their
|
|
1405
|
+
* answer and on their re-ask. Written once, four and six such cards each fit a
|
|
1406
|
+
* balanced-tier pass; written out card by card, neither does
|
|
1407
|
+
* (`ai-job-page-evals.spec.ts`).
|
|
1408
|
+
*/ export const AI_FREE_PRACTICE_AREAS_FIXTURE = freeBrief({
|
|
1409
|
+
id: 'free-law-firm-practice-areas',
|
|
1410
|
+
icp: 'small-business',
|
|
1411
|
+
pageType: 'about',
|
|
1412
|
+
brief: 'An about page for Cedar Point Law: who we are, the four ways we help families, and the six ways we help businesses and property owners, a few sentences on each.',
|
|
1413
|
+
inventory: site('host-cedar-point-law', {}),
|
|
1414
|
+
title: 'About Cedar Point Law',
|
|
1415
|
+
slug: '/about',
|
|
1416
|
+
layout: 'lay-site',
|
|
1417
|
+
nav: true,
|
|
1418
|
+
seo: {
|
|
1419
|
+
title: 'About Cedar Point Law',
|
|
1420
|
+
description: 'A general practice for families, businesses and property owners in [county], from estate planning and probate to leases and closings.'
|
|
1421
|
+
},
|
|
1422
|
+
sections: [
|
|
1423
|
+
hero('a', {
|
|
1424
|
+
title: 'About Cedar Point Law',
|
|
1425
|
+
lead: 'A general practice in [town] for families, small businesses and property owners, with the same attorney answering your calls from the first meeting to the last filing.'
|
|
1426
|
+
}),
|
|
1427
|
+
repeatedCards('b', {
|
|
1428
|
+
name: 'four ways we help families',
|
|
1429
|
+
heading: 'For families',
|
|
1430
|
+
items: [
|
|
1431
|
+
{
|
|
1432
|
+
title: 'Estate planning',
|
|
1433
|
+
summary: 'Wills, revocable trusts, powers of attorney and health care directives, drafted after a conversation about your family, your property and who should decide for you if you cannot.'
|
|
1434
|
+
},
|
|
1435
|
+
{
|
|
1436
|
+
title: 'Divorce and custody',
|
|
1437
|
+
summary: 'Uncontested and contested divorces, parenting plans and support, with a written estimate before anything is filed and a schedule for the children that both households can follow.'
|
|
1438
|
+
},
|
|
1439
|
+
{
|
|
1440
|
+
title: 'Probate',
|
|
1441
|
+
summary: 'Opening probate, listing assets, paying debts and distributing property for personal representatives, with a written timeline so heirs know what happens next and about how long it takes.'
|
|
1442
|
+
},
|
|
1443
|
+
{
|
|
1444
|
+
title: 'Guardianship and elder law',
|
|
1445
|
+
summary: 'Guardianship and conservatorship petitions, long-term care planning and help for adult children managing a parent’s money, with meetings at home or at a care facility when travel is hard.'
|
|
1446
|
+
}
|
|
1447
|
+
]
|
|
1448
|
+
}),
|
|
1449
|
+
repeatedCards('c', {
|
|
1450
|
+
name: 'six ways we help businesses and property owners',
|
|
1451
|
+
heading: 'For businesses and property owners',
|
|
1452
|
+
items: [
|
|
1453
|
+
{
|
|
1454
|
+
title: 'Business formation',
|
|
1455
|
+
summary: 'Choosing between an LLC and a corporation, operating agreements, partner buyout terms and the first contracts a new business signs with its landlord, lenders and first employees.'
|
|
1456
|
+
},
|
|
1457
|
+
{
|
|
1458
|
+
title: 'Contracts',
|
|
1459
|
+
summary: 'Vendor, customer and service agreements drafted or reviewed in plain language, with the payment terms, termination rights and limits on liability explained before you sign anything.'
|
|
1460
|
+
},
|
|
1461
|
+
{
|
|
1462
|
+
title: 'Commercial leases',
|
|
1463
|
+
summary: 'First leases and renewals for shops, offices and restaurants, including build-out allowances, personal guarantees, rent increases and what happens when the business outgrows the space.'
|
|
1464
|
+
},
|
|
1465
|
+
{
|
|
1466
|
+
title: 'Real estate closings',
|
|
1467
|
+
summary: 'Purchase agreements, title review, boundary questions and closings for homes, rental property and small commercial buildings, with one attorney following the file from contract to keys.'
|
|
1468
|
+
},
|
|
1469
|
+
{
|
|
1470
|
+
title: 'Landlord and tenant',
|
|
1471
|
+
summary: 'Leases, security deposits, repair disputes and eviction notices, for owners with a few rental units and for tenants who need to know where they stand before they answer.'
|
|
1472
|
+
},
|
|
1473
|
+
{
|
|
1474
|
+
title: 'Employment matters',
|
|
1475
|
+
summary: 'Offer letters, handbooks, contractor questions and separation agreements for businesses with fewer than fifty employees, written to fit the state rules that apply to them.'
|
|
1476
|
+
}
|
|
1477
|
+
]
|
|
1478
|
+
})
|
|
1479
|
+
]
|
|
1480
|
+
});
|
|
1481
|
+
const CREATION_JOB = 'job-golden-creations';
|
|
1482
|
+
/** The ids the plan recorded for what it creates, as a kept plan carries them. */ const CREATION_IDS = {
|
|
1483
|
+
component: 'tstmnlCard',
|
|
1484
|
+
layout: 'hrbrLayout',
|
|
1485
|
+
form: 'roofQuoteF'
|
|
1486
|
+
};
|
|
1487
|
+
export const AI_PAGE_CREATION_FIXTURE = (()=>{
|
|
1488
|
+
const component = CREATION_IDS.component;
|
|
1489
|
+
const form = CREATION_IDS.form;
|
|
1490
|
+
const opener = hero('a', {
|
|
1491
|
+
title: 'Roof repair in Harbor County',
|
|
1492
|
+
lead: 'A local crew that finds the leak, fixes it the same week and sends you photos of the work.',
|
|
1493
|
+
cta: {
|
|
1494
|
+
label: 'Meet the crew',
|
|
1495
|
+
screenId: 'scr-about'
|
|
1496
|
+
}
|
|
1497
|
+
});
|
|
1498
|
+
const quotes = section('b', 'customer words', [
|
|
1499
|
+
'new:Testimonial card'
|
|
1500
|
+
], 3, (add)=>{
|
|
1501
|
+
// The brief names no customer's role, so each card leaves it to the card's default (AGL-3056).
|
|
1502
|
+
const cells = [
|
|
1503
|
+
{
|
|
1504
|
+
quote: 'They found the leak two other companies missed.',
|
|
1505
|
+
name: '[customer name]'
|
|
1506
|
+
},
|
|
1507
|
+
{
|
|
1508
|
+
quote: 'On time, tidy, and the photos made the invoice easy to trust.',
|
|
1509
|
+
name: '[customer name]'
|
|
1510
|
+
},
|
|
1511
|
+
{
|
|
1512
|
+
quote: 'The same crew came back to check the repair after the first storm.',
|
|
1513
|
+
name: '[customer name]'
|
|
1514
|
+
}
|
|
1515
|
+
].map((propValues)=>cell(add, 3, add({
|
|
1516
|
+
componentId: 'reusableInstance',
|
|
1517
|
+
props: {
|
|
1518
|
+
refId: component,
|
|
1519
|
+
propValues
|
|
1520
|
+
}
|
|
1521
|
+
})));
|
|
1522
|
+
return framed(add, [
|
|
1523
|
+
add(typography('h2', 'What homeowners say', 'h2')),
|
|
1524
|
+
row(add, cells)
|
|
1525
|
+
], 'lg', 8);
|
|
1526
|
+
});
|
|
1527
|
+
const request = section('c', 'quote request form', [
|
|
1528
|
+
'new:Roof quote request'
|
|
1529
|
+
], 0, (add)=>framed(add, [
|
|
1530
|
+
add(typography('h2', 'Request a quote', 'h2')),
|
|
1531
|
+
add(typography('body1', 'Tell us about the roof. We call back within one business day.')),
|
|
1532
|
+
add({
|
|
1533
|
+
componentId: 'form',
|
|
1534
|
+
props: {
|
|
1535
|
+
formId: form
|
|
1536
|
+
}
|
|
1537
|
+
})
|
|
1538
|
+
], 'sm', 8));
|
|
1539
|
+
const seo = {
|
|
1540
|
+
title: 'Roof Repair in Harbor County',
|
|
1541
|
+
description: 'Same-week roof repair from a local crew, with photos of every fix and a callback within one business day.'
|
|
1542
|
+
};
|
|
1543
|
+
return {
|
|
1544
|
+
id: 'agency-roofing-creations',
|
|
1545
|
+
icp: 'agency',
|
|
1546
|
+
pageType: 'service',
|
|
1547
|
+
brief: 'A roof repair page for Harbor Roofing: what we fix, three things customers have said, and a form to request a quote. The site is new and has no layout, cards or forms yet.',
|
|
1548
|
+
inventory: site('host-harbor-new', {
|
|
1549
|
+
layouts: [],
|
|
1550
|
+
screens: [
|
|
1551
|
+
{
|
|
1552
|
+
id: 'scr-about',
|
|
1553
|
+
name: 'About',
|
|
1554
|
+
slug: 'about',
|
|
1555
|
+
layoutId: null,
|
|
1556
|
+
template: false
|
|
1557
|
+
}
|
|
1558
|
+
]
|
|
1559
|
+
}),
|
|
1560
|
+
plan: {
|
|
1561
|
+
reuse: [
|
|
1562
|
+
{
|
|
1563
|
+
kind: 'screen',
|
|
1564
|
+
id: 'scr-about',
|
|
1565
|
+
purpose: 'linked from the hero'
|
|
1566
|
+
}
|
|
1567
|
+
],
|
|
1568
|
+
create: [
|
|
1569
|
+
{
|
|
1570
|
+
kind: 'component',
|
|
1571
|
+
name: 'Testimonial card',
|
|
1572
|
+
why: 'Three quotes share one card, and the site has no card yet.',
|
|
1573
|
+
duplicateOf: null,
|
|
1574
|
+
fields: [
|
|
1575
|
+
'quote:richText',
|
|
1576
|
+
'name:text',
|
|
1577
|
+
'role:text',
|
|
1578
|
+
'photo:image'
|
|
1579
|
+
],
|
|
1580
|
+
id: CREATION_IDS.component
|
|
1581
|
+
},
|
|
1582
|
+
{
|
|
1583
|
+
kind: 'layout',
|
|
1584
|
+
name: 'Harbor Roofing site',
|
|
1585
|
+
why: 'The site has no layout, so every page would otherwise carry its own header and footer.',
|
|
1586
|
+
duplicateOf: null,
|
|
1587
|
+
fields: [],
|
|
1588
|
+
id: CREATION_IDS.layout
|
|
1589
|
+
},
|
|
1590
|
+
{
|
|
1591
|
+
kind: 'form',
|
|
1592
|
+
name: 'Roof quote request',
|
|
1593
|
+
why: 'The site has no form to request a quote.',
|
|
1594
|
+
duplicateOf: null,
|
|
1595
|
+
fields: [],
|
|
1596
|
+
id: CREATION_IDS.form
|
|
1597
|
+
}
|
|
1598
|
+
],
|
|
1599
|
+
screens: [
|
|
1600
|
+
{
|
|
1601
|
+
title: 'Roof repair',
|
|
1602
|
+
slug: '/roof-repair',
|
|
1603
|
+
layout: 'new:Harbor Roofing site',
|
|
1604
|
+
template: null,
|
|
1605
|
+
duplicateOf: null,
|
|
1606
|
+
nav: true,
|
|
1607
|
+
seoTitle: seo.title,
|
|
1608
|
+
seoDescription: seo.description,
|
|
1609
|
+
sections: [
|
|
1610
|
+
opener.section,
|
|
1611
|
+
quotes.section,
|
|
1612
|
+
request.section
|
|
1613
|
+
]
|
|
1614
|
+
}
|
|
1615
|
+
]
|
|
1616
|
+
},
|
|
1617
|
+
answers: [
|
|
1618
|
+
opener.answer,
|
|
1619
|
+
quotes.answer,
|
|
1620
|
+
request.answer
|
|
1621
|
+
],
|
|
1622
|
+
seo,
|
|
1623
|
+
jobId: CREATION_JOB,
|
|
1624
|
+
screenId: 'roofRepair',
|
|
1625
|
+
layout: {
|
|
1626
|
+
rootId: 'root',
|
|
1627
|
+
nodes: {
|
|
1628
|
+
root: {
|
|
1629
|
+
componentId: 'div',
|
|
1630
|
+
nodes: [
|
|
1631
|
+
'header',
|
|
1632
|
+
'slot',
|
|
1633
|
+
'footer'
|
|
1634
|
+
]
|
|
1635
|
+
},
|
|
1636
|
+
header: {
|
|
1637
|
+
componentId: 'muiAppBar',
|
|
1638
|
+
props: {
|
|
1639
|
+
position: 'static',
|
|
1640
|
+
color: 'default'
|
|
1641
|
+
},
|
|
1642
|
+
nodes: [
|
|
1643
|
+
'bar'
|
|
1644
|
+
]
|
|
1645
|
+
},
|
|
1646
|
+
bar: {
|
|
1647
|
+
componentId: 'muiToolbar',
|
|
1648
|
+
nodes: [
|
|
1649
|
+
'brand',
|
|
1650
|
+
'home',
|
|
1651
|
+
'about'
|
|
1652
|
+
]
|
|
1653
|
+
},
|
|
1654
|
+
brand: {
|
|
1655
|
+
componentId: 'muiTypography',
|
|
1656
|
+
props: {
|
|
1657
|
+
variant: 'h6',
|
|
1658
|
+
component: 'p',
|
|
1659
|
+
children: 'Harbor Roofing'
|
|
1660
|
+
}
|
|
1661
|
+
},
|
|
1662
|
+
home: {
|
|
1663
|
+
componentId: 'muiScreenLink',
|
|
1664
|
+
props: {
|
|
1665
|
+
screenId: 'scr-home',
|
|
1666
|
+
children: 'Home'
|
|
1667
|
+
}
|
|
1668
|
+
},
|
|
1669
|
+
about: {
|
|
1670
|
+
componentId: 'muiScreenLink',
|
|
1671
|
+
props: {
|
|
1672
|
+
screenId: 'scr-about',
|
|
1673
|
+
children: 'About'
|
|
1674
|
+
}
|
|
1675
|
+
},
|
|
1676
|
+
slot: {
|
|
1677
|
+
componentId: 'layoutSlot'
|
|
1678
|
+
},
|
|
1679
|
+
footer: {
|
|
1680
|
+
componentId: 'section',
|
|
1681
|
+
props: {
|
|
1682
|
+
element: 'footer'
|
|
1683
|
+
},
|
|
1684
|
+
nodes: [
|
|
1685
|
+
'tagline'
|
|
1686
|
+
]
|
|
1687
|
+
},
|
|
1688
|
+
tagline: {
|
|
1689
|
+
componentId: 'muiTypography',
|
|
1690
|
+
props: {
|
|
1691
|
+
variant: 'body2',
|
|
1692
|
+
children: 'Family-run roofers in Harbor County since 1998.'
|
|
1693
|
+
}
|
|
1694
|
+
}
|
|
1695
|
+
}
|
|
1696
|
+
},
|
|
1697
|
+
componentGolden: 'component-testimonial-card',
|
|
1698
|
+
formGolden: 'roofingQuote'
|
|
1699
|
+
};
|
|
1700
|
+
})();
|
|
1701
|
+
const ATTORNEYS = [
|
|
1702
|
+
{
|
|
1703
|
+
photo: 'A portrait of [attorney name], the founding partner, in the firm’s office',
|
|
1704
|
+
name: '[attorney name]',
|
|
1705
|
+
role: 'Founding partner, family law',
|
|
1706
|
+
bio: 'Has represented parents and spouses in [county] for [years] years, and settles most cases before they reach a courtroom.'
|
|
1707
|
+
},
|
|
1708
|
+
{
|
|
1709
|
+
photo: 'A portrait of [attorney name] at a conference table',
|
|
1710
|
+
name: '[attorney name]',
|
|
1711
|
+
role: 'Partner, estate planning and real estate',
|
|
1712
|
+
bio: 'Writes wills and trusts for young families, and handles closings for homes and small commercial property.'
|
|
1713
|
+
}
|
|
1714
|
+
];
|
|
1715
|
+
export const AI_TWO_PERSON_PAGE_FIXTURE = (()=>{
|
|
1716
|
+
const introduction = section('b', 'meet our attorneys', [], ATTORNEYS.length, (add)=>{
|
|
1717
|
+
const cards = ATTORNEYS.map((person)=>add({
|
|
1718
|
+
componentId: 'muiCard',
|
|
1719
|
+
props: {
|
|
1720
|
+
variant: 'outlined'
|
|
1721
|
+
},
|
|
1722
|
+
sx: {
|
|
1723
|
+
flex: 1
|
|
1724
|
+
},
|
|
1725
|
+
nodes: [
|
|
1726
|
+
add({
|
|
1727
|
+
componentId: 'image',
|
|
1728
|
+
props: {
|
|
1729
|
+
alt: person.photo
|
|
1730
|
+
}
|
|
1731
|
+
}),
|
|
1732
|
+
add(typography('h3', person.name, 'h3')),
|
|
1733
|
+
add(typography('subtitle1', person.role)),
|
|
1734
|
+
add(typography('body2', person.bio))
|
|
1735
|
+
]
|
|
1736
|
+
}));
|
|
1737
|
+
// A Grid of two would take two more elements than the fifteen the pass
|
|
1738
|
+
// asks for (AGL-3055); a Stack that turns from a column into a row at md
|
|
1739
|
+
// is the same responsive pair in none.
|
|
1740
|
+
return framed(add, [
|
|
1741
|
+
add(typography('h2', 'Meet our attorneys', 'h2')),
|
|
1742
|
+
add({
|
|
1743
|
+
componentId: 'muiStack',
|
|
1744
|
+
sx: {
|
|
1745
|
+
flexDirection: {
|
|
1746
|
+
xs: 'column',
|
|
1747
|
+
md: 'row'
|
|
1748
|
+
},
|
|
1749
|
+
gap: 3
|
|
1750
|
+
},
|
|
1751
|
+
nodes: cards
|
|
1752
|
+
})
|
|
1753
|
+
], 'lg', 8);
|
|
1754
|
+
});
|
|
1755
|
+
const roomier = section('b', 'meet our attorneys', [], ATTORNEYS.length, (add)=>{
|
|
1756
|
+
const cells = ATTORNEYS.map((person)=>add({
|
|
1757
|
+
componentId: 'muiGrid',
|
|
1758
|
+
props: {
|
|
1759
|
+
size: span(ATTORNEYS.length)
|
|
1760
|
+
},
|
|
1761
|
+
nodes: [
|
|
1762
|
+
add({
|
|
1763
|
+
componentId: 'muiCard',
|
|
1764
|
+
props: {
|
|
1765
|
+
variant: 'outlined'
|
|
1766
|
+
},
|
|
1767
|
+
sx: {
|
|
1768
|
+
height: '100%'
|
|
1769
|
+
},
|
|
1770
|
+
nodes: [
|
|
1771
|
+
add({
|
|
1772
|
+
componentId: 'image',
|
|
1773
|
+
props: {
|
|
1774
|
+
alt: person.photo,
|
|
1775
|
+
objectFit: 'cover',
|
|
1776
|
+
loading: 'lazy'
|
|
1777
|
+
},
|
|
1778
|
+
sx: {
|
|
1779
|
+
width: '100%'
|
|
1780
|
+
}
|
|
1781
|
+
}),
|
|
1782
|
+
add({
|
|
1783
|
+
componentId: 'muiCardContent',
|
|
1784
|
+
nodes: [
|
|
1785
|
+
add(typography('h3', person.name, 'h3')),
|
|
1786
|
+
add({
|
|
1787
|
+
componentId: 'muiTypography',
|
|
1788
|
+
props: {
|
|
1789
|
+
variant: 'subtitle1',
|
|
1790
|
+
children: person.role
|
|
1791
|
+
},
|
|
1792
|
+
sx: {
|
|
1793
|
+
color: 'text.secondary'
|
|
1794
|
+
}
|
|
1795
|
+
}),
|
|
1796
|
+
add(typography('body2', person.bio))
|
|
1797
|
+
]
|
|
1798
|
+
})
|
|
1799
|
+
]
|
|
1800
|
+
})
|
|
1801
|
+
]
|
|
1802
|
+
}));
|
|
1803
|
+
return framed(add, [
|
|
1804
|
+
add(typography('h2', 'Meet our attorneys', 'h2')),
|
|
1805
|
+
add(typography('body1', 'Two attorneys, and one of them handles your matter from the first meeting to the final order.')),
|
|
1806
|
+
row(add, cells)
|
|
1807
|
+
], 'lg', 8);
|
|
1808
|
+
});
|
|
1809
|
+
const fixture = brief({
|
|
1810
|
+
id: 'agency-law-firm-two-attorneys',
|
|
1811
|
+
icp: 'agency',
|
|
1812
|
+
pageType: 'about',
|
|
1813
|
+
brief: 'An about page for Harborline Law: who we are, and our two attorneys with a photo, their role and a short bio for each.',
|
|
1814
|
+
inventory: site('host-harborline-law', {
|
|
1815
|
+
screens: [
|
|
1816
|
+
{
|
|
1817
|
+
id: 'scr-contact',
|
|
1818
|
+
name: 'Contact',
|
|
1819
|
+
slug: 'contact',
|
|
1820
|
+
layoutId: 'lay-site',
|
|
1821
|
+
template: false
|
|
1822
|
+
}
|
|
1823
|
+
]
|
|
1824
|
+
}),
|
|
1825
|
+
title: 'About Harborline Law',
|
|
1826
|
+
slug: '/about',
|
|
1827
|
+
layout: 'lay-site',
|
|
1828
|
+
nav: true,
|
|
1829
|
+
seo: {
|
|
1830
|
+
title: 'About Harborline Law',
|
|
1831
|
+
description: 'A coastal law firm for families and homeowners: family law, estate planning and real estate closings.'
|
|
1832
|
+
},
|
|
1833
|
+
sections: [
|
|
1834
|
+
hero('a', {
|
|
1835
|
+
title: 'About Harborline Law',
|
|
1836
|
+
lead: 'A small coastal firm for families and homeowners, in family law, estate planning and real estate closings.',
|
|
1837
|
+
cta: {
|
|
1838
|
+
label: 'Request a consultation',
|
|
1839
|
+
screenId: 'scr-contact'
|
|
1840
|
+
}
|
|
1841
|
+
}),
|
|
1842
|
+
introduction
|
|
1843
|
+
]
|
|
1844
|
+
});
|
|
1845
|
+
return _extends({}, fixture, {
|
|
1846
|
+
roomier: roomier.answer
|
|
1847
|
+
});
|
|
1848
|
+
})();
|
|
1849
|
+
|
|
1850
|
+
//# sourceMappingURL=ai-page-briefs.js.map
|