@withpotter/lib 0.13.0-next.101
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/dist/__fixtures__/demo-content-server.json +484 -0
- package/dist/accessibility-context.d.ts +27 -0
- package/dist/accessibility-context.js +107 -0
- package/dist/accessibility-context.js.map +1 -0
- package/dist/active-workspace.d.ts +45 -0
- package/dist/active-workspace.js +34 -0
- package/dist/active-workspace.js.map +1 -0
- package/dist/admin-account-officer-api.d.ts +13 -0
- package/dist/admin-account-officer-api.js +12 -0
- package/dist/admin-account-officer-api.js.map +1 -0
- package/dist/admin-account-types.d.ts +122 -0
- package/dist/admin-account-types.js +1 -0
- package/dist/admin-account-types.js.map +1 -0
- package/dist/admin-adoption-api.d.ts +35 -0
- package/dist/admin-adoption-api.js +16 -0
- package/dist/admin-adoption-api.js.map +1 -0
- package/dist/admin-api.d.ts +1219 -0
- package/dist/admin-api.js +325 -0
- package/dist/admin-api.js.map +1 -0
- package/dist/admin-case-api.d.ts +32 -0
- package/dist/admin-case-api.js +63 -0
- package/dist/admin-case-api.js.map +1 -0
- package/dist/admin-case-types.d.ts +166 -0
- package/dist/admin-case-types.js +1 -0
- package/dist/admin-case-types.js.map +1 -0
- package/dist/admin-compliance-api.d.ts +31 -0
- package/dist/admin-compliance-api.js +20 -0
- package/dist/admin-compliance-api.js.map +1 -0
- package/dist/admin-country-api.d.ts +28 -0
- package/dist/admin-country-api.js +9 -0
- package/dist/admin-country-api.js.map +1 -0
- package/dist/admin-currency-types.d.ts +138 -0
- package/dist/admin-currency-types.js +1 -0
- package/dist/admin-currency-types.js.map +1 -0
- package/dist/admin-feedback-api.d.ts +215 -0
- package/dist/admin-feedback-api.js +63 -0
- package/dist/admin-feedback-api.js.map +1 -0
- package/dist/admin-inbox-seen.d.ts +22 -0
- package/dist/admin-inbox-seen.js +47 -0
- package/dist/admin-inbox-seen.js.map +1 -0
- package/dist/admin-ledger-api.d.ts +85 -0
- package/dist/admin-ledger-api.js +30 -0
- package/dist/admin-ledger-api.js.map +1 -0
- package/dist/admin-money-api.d.ts +127 -0
- package/dist/admin-money-api.js +125 -0
- package/dist/admin-money-api.js.map +1 -0
- package/dist/admin-newsletter-contacts-api.d.ts +70 -0
- package/dist/admin-newsletter-contacts-api.js +20 -0
- package/dist/admin-newsletter-contacts-api.js.map +1 -0
- package/dist/admin-newsletter-deliveries-api.d.ts +47 -0
- package/dist/admin-newsletter-deliveries-api.js +16 -0
- package/dist/admin-newsletter-deliveries-api.js.map +1 -0
- package/dist/admin-newsletters-api.d.ts +118 -0
- package/dist/admin-newsletters-api.js +47 -0
- package/dist/admin-newsletters-api.js.map +1 -0
- package/dist/admin-pos-api.d.ts +16 -0
- package/dist/admin-pos-api.js +35 -0
- package/dist/admin-pos-api.js.map +1 -0
- package/dist/admin-pos-query.d.ts +43 -0
- package/dist/admin-pos-query.js +55 -0
- package/dist/admin-pos-query.js.map +1 -0
- package/dist/admin-pos-types.d.ts +122 -0
- package/dist/admin-pos-types.js +1 -0
- package/dist/admin-pos-types.js.map +1 -0
- package/dist/admin-pricing-api.d.ts +88 -0
- package/dist/admin-pricing-api.js +66 -0
- package/dist/admin-pricing-api.js.map +1 -0
- package/dist/admin-readiness-api.d.ts +25 -0
- package/dist/admin-readiness-api.js +39 -0
- package/dist/admin-readiness-api.js.map +1 -0
- package/dist/admin-sales-api.d.ts +124 -0
- package/dist/admin-sales-api.js +41 -0
- package/dist/admin-sales-api.js.map +1 -0
- package/dist/admin-saved-replies-api.d.ts +35 -0
- package/dist/admin-saved-replies-api.js +70 -0
- package/dist/admin-saved-replies-api.js.map +1 -0
- package/dist/admin-service-operations-api.d.ts +142 -0
- package/dist/admin-service-operations-api.js +52 -0
- package/dist/admin-service-operations-api.js.map +1 -0
- package/dist/admin-signatures-api.d.ts +57 -0
- package/dist/admin-signatures-api.js +15 -0
- package/dist/admin-signatures-api.js.map +1 -0
- package/dist/admin-support-analytics-api.d.ts +36 -0
- package/dist/admin-support-analytics-api.js +71 -0
- package/dist/admin-support-analytics-api.js.map +1 -0
- package/dist/admin-tenant-setup-types.d.ts +85 -0
- package/dist/admin-tenant-setup-types.js +1 -0
- package/dist/admin-tenant-setup-types.js.map +1 -0
- package/dist/admin-tenants-query.d.ts +14 -0
- package/dist/admin-tenants-query.js +17 -0
- package/dist/admin-tenants-query.js.map +1 -0
- package/dist/analytics/PostHogProvider.d.ts +25 -0
- package/dist/analytics/PostHogProvider.js +44 -0
- package/dist/analytics/PostHogProvider.js.map +1 -0
- package/dist/analytics/index.d.ts +1 -0
- package/dist/analytics/index.js +11 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics.d.ts +1 -0
- package/dist/analytics.js +1 -0
- package/dist/api/abandoned-cart.d.ts +18 -0
- package/dist/api/abandoned-cart.js +68 -0
- package/dist/api/abandoned-cart.js.map +1 -0
- package/dist/api/accounts.d.ts +176 -0
- package/dist/api/accounts.js +194 -0
- package/dist/api/accounts.js.map +1 -0
- package/dist/api/analytics-patterns.d.ts +18 -0
- package/dist/api/analytics-patterns.js +52 -0
- package/dist/api/analytics-patterns.js.map +1 -0
- package/dist/api/analytics.d.ts +143 -0
- package/dist/api/analytics.js +379 -0
- package/dist/api/analytics.js.map +1 -0
- package/dist/api/assignee-prefs.d.ts +7 -0
- package/dist/api/assignee-prefs.js +17 -0
- package/dist/api/assignee-prefs.js.map +1 -0
- package/dist/api/automations.d.ts +73 -0
- package/dist/api/automations.js +102 -0
- package/dist/api/automations.js.map +1 -0
- package/dist/api/behaviors.d.ts +15 -0
- package/dist/api/behaviors.js +15 -0
- package/dist/api/behaviors.js.map +1 -0
- package/dist/api/bio.d.ts +7 -0
- package/dist/api/bio.js +17 -0
- package/dist/api/bio.js.map +1 -0
- package/dist/api/booking-calendar.d.ts +14 -0
- package/dist/api/booking-calendar.js +33 -0
- package/dist/api/booking-calendar.js.map +1 -0
- package/dist/api/bookings.d.ts +199 -0
- package/dist/api/bookings.js +284 -0
- package/dist/api/bookings.js.map +1 -0
- package/dist/api/business-devices.d.ts +108 -0
- package/dist/api/business-devices.js +139 -0
- package/dist/api/business-devices.js.map +1 -0
- package/dist/api/business-locations.d.ts +26 -0
- package/dist/api/business-locations.js +39 -0
- package/dist/api/business-locations.js.map +1 -0
- package/dist/api/cache-bus.d.ts +56 -0
- package/dist/api/cache-bus.js +18 -0
- package/dist/api/cache-bus.js.map +1 -0
- package/dist/api/calendar-sync.d.ts +49 -0
- package/dist/api/calendar-sync.js +50 -0
- package/dist/api/calendar-sync.js.map +1 -0
- package/dist/api/campaign-initiatives.d.ts +115 -0
- package/dist/api/campaign-initiatives.js +42 -0
- package/dist/api/campaign-initiatives.js.map +1 -0
- package/dist/api/campaigns.d.ts +89 -0
- package/dist/api/campaigns.js +100 -0
- package/dist/api/campaigns.js.map +1 -0
- package/dist/api/capabilities.d.ts +12 -0
- package/dist/api/capabilities.js +16 -0
- package/dist/api/capabilities.js.map +1 -0
- package/dist/api/commerce.d.ts +19 -0
- package/dist/api/commerce.js +31 -0
- package/dist/api/commerce.js.map +1 -0
- package/dist/api/communications.d.ts +166 -0
- package/dist/api/communications.js +141 -0
- package/dist/api/communications.js.map +1 -0
- package/dist/api/connect.d.ts +72 -0
- package/dist/api/connect.js +50 -0
- package/dist/api/connect.js.map +1 -0
- package/dist/api/content.d.ts +146 -0
- package/dist/api/content.js +187 -0
- package/dist/api/content.js.map +1 -0
- package/dist/api/conversations.d.ts +79 -0
- package/dist/api/conversations.js +41 -0
- package/dist/api/conversations.js.map +1 -0
- package/dist/api/core.d.ts +62 -0
- package/dist/api/core.js +223 -0
- package/dist/api/core.js.map +1 -0
- package/dist/api/credentials.d.ts +65 -0
- package/dist/api/credentials.js +48 -0
- package/dist/api/credentials.js.map +1 -0
- package/dist/api/credits.d.ts +96 -0
- package/dist/api/credits.js +24 -0
- package/dist/api/credits.js.map +1 -0
- package/dist/api/crm-analytics.d.ts +10 -0
- package/dist/api/crm-analytics.js +22 -0
- package/dist/api/crm-analytics.js.map +1 -0
- package/dist/api/crm-segments.d.ts +14 -0
- package/dist/api/crm-segments.js +42 -0
- package/dist/api/crm-segments.js.map +1 -0
- package/dist/api/deliveries.d.ts +99 -0
- package/dist/api/deliveries.js +37 -0
- package/dist/api/deliveries.js.map +1 -0
- package/dist/api/demo-content.d.ts +104 -0
- package/dist/api/demo-content.js +36 -0
- package/dist/api/demo-content.js.map +1 -0
- package/dist/api/device-shifts.d.ts +56 -0
- package/dist/api/device-shifts.js +50 -0
- package/dist/api/device-shifts.js.map +1 -0
- package/dist/api/devices.d.ts +6 -0
- package/dist/api/devices.js +10 -0
- package/dist/api/devices.js.map +1 -0
- package/dist/api/digital-files.d.ts +22 -0
- package/dist/api/digital-files.js +55 -0
- package/dist/api/digital-files.js.map +1 -0
- package/dist/api/discounts.d.ts +29 -0
- package/dist/api/discounts.js +46 -0
- package/dist/api/discounts.js.map +1 -0
- package/dist/api/disputes.d.ts +47 -0
- package/dist/api/disputes.js +42 -0
- package/dist/api/disputes.js.map +1 -0
- package/dist/api/feature-locked.d.ts +11 -0
- package/dist/api/feature-locked.js +18 -0
- package/dist/api/feature-locked.js.map +1 -0
- package/dist/api/feedback-prompts.d.ts +45 -0
- package/dist/api/feedback-prompts.js +85 -0
- package/dist/api/feedback-prompts.js.map +1 -0
- package/dist/api/feedback.d.ts +254 -0
- package/dist/api/feedback.js +108 -0
- package/dist/api/feedback.js.map +1 -0
- package/dist/api/finance.d.ts +199 -0
- package/dist/api/finance.js +203 -0
- package/dist/api/finance.js.map +1 -0
- package/dist/api/gallery.d.ts +30 -0
- package/dist/api/gallery.js +48 -0
- package/dist/api/gallery.js.map +1 -0
- package/dist/api/geo.d.ts +18 -0
- package/dist/api/geo.js +19 -0
- package/dist/api/geo.js.map +1 -0
- package/dist/api/giftcards.d.ts +63 -0
- package/dist/api/giftcards.js +63 -0
- package/dist/api/giftcards.js.map +1 -0
- package/dist/api/hardware-orders.d.ts +40 -0
- package/dist/api/hardware-orders.js +37 -0
- package/dist/api/hardware-orders.js.map +1 -0
- package/dist/api/index.d.ts +71 -0
- package/dist/api/index.js +78 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/inquiries.d.ts +92 -0
- package/dist/api/inquiries.js +129 -0
- package/dist/api/inquiries.js.map +1 -0
- package/dist/api/inventory.d.ts +133 -0
- package/dist/api/inventory.js +203 -0
- package/dist/api/inventory.js.map +1 -0
- package/dist/api/invite-body.d.ts +19 -0
- package/dist/api/invite-body.js +8 -0
- package/dist/api/invite-body.js.map +1 -0
- package/dist/api/invoices.d.ts +19 -0
- package/dist/api/invoices.js +80 -0
- package/dist/api/invoices.js.map +1 -0
- package/dist/api/locations.d.ts +15 -0
- package/dist/api/locations.js +30 -0
- package/dist/api/locations.js.map +1 -0
- package/dist/api/loyalty.d.ts +68 -0
- package/dist/api/loyalty.js +112 -0
- package/dist/api/loyalty.js.map +1 -0
- package/dist/api/marketing-consent.d.ts +36 -0
- package/dist/api/marketing-consent.js +11 -0
- package/dist/api/marketing-consent.js.map +1 -0
- package/dist/api/marketing-suppressions.d.ts +81 -0
- package/dist/api/marketing-suppressions.js +65 -0
- package/dist/api/marketing-suppressions.js.map +1 -0
- package/dist/api/members.d.ts +79 -0
- package/dist/api/members.js +148 -0
- package/dist/api/members.js.map +1 -0
- package/dist/api/merchant-notifications.d.ts +27 -0
- package/dist/api/merchant-notifications.js +41 -0
- package/dist/api/merchant-notifications.js.map +1 -0
- package/dist/api/merchant-referrals.d.ts +23 -0
- package/dist/api/merchant-referrals.js +10 -0
- package/dist/api/merchant-referrals.js.map +1 -0
- package/dist/api/merchant-subscriptions.d.ts +117 -0
- package/dist/api/merchant-subscriptions.js +113 -0
- package/dist/api/merchant-subscriptions.js.map +1 -0
- package/dist/api/misc.d.ts +4 -0
- package/dist/api/misc.js +24 -0
- package/dist/api/misc.js.map +1 -0
- package/dist/api/odoo.d.ts +102 -0
- package/dist/api/odoo.js +36 -0
- package/dist/api/odoo.js.map +1 -0
- package/dist/api/onboarding.d.ts +48 -0
- package/dist/api/onboarding.js +78 -0
- package/dist/api/onboarding.js.map +1 -0
- package/dist/api/orders.d.ts +153 -0
- package/dist/api/orders.js +303 -0
- package/dist/api/orders.js.map +1 -0
- package/dist/api/organizations.d.ts +14 -0
- package/dist/api/organizations.js +19 -0
- package/dist/api/organizations.js.map +1 -0
- package/dist/api/packages.d.ts +16 -0
- package/dist/api/packages.js +25 -0
- package/dist/api/packages.js.map +1 -0
- package/dist/api/pages.d.ts +79 -0
- package/dist/api/pages.js +125 -0
- package/dist/api/pages.js.map +1 -0
- package/dist/api/payables.d.ts +34 -0
- package/dist/api/payables.js +70 -0
- package/dist/api/payables.js.map +1 -0
- package/dist/api/plan-refusal.d.ts +21 -0
- package/dist/api/plan-refusal.js +28 -0
- package/dist/api/plan-refusal.js.map +1 -0
- package/dist/api/pos.d.ts +66 -0
- package/dist/api/pos.js +115 -0
- package/dist/api/pos.js.map +1 -0
- package/dist/api/potter.d.ts +114 -0
- package/dist/api/potter.js +88 -0
- package/dist/api/potter.js.map +1 -0
- package/dist/api/push.d.ts +25 -0
- package/dist/api/push.js +23 -0
- package/dist/api/push.js.map +1 -0
- package/dist/api/referrals.d.ts +10 -0
- package/dist/api/referrals.js +16 -0
- package/dist/api/referrals.js.map +1 -0
- package/dist/api/resource-categories.d.ts +35 -0
- package/dist/api/resource-categories.js +76 -0
- package/dist/api/resource-categories.js.map +1 -0
- package/dist/api/resources.d.ts +54 -0
- package/dist/api/resources.js +92 -0
- package/dist/api/resources.js.map +1 -0
- package/dist/api/reviews.d.ts +18 -0
- package/dist/api/reviews.js +46 -0
- package/dist/api/reviews.js.map +1 -0
- package/dist/api/riders.d.ts +70 -0
- package/dist/api/riders.js +24 -0
- package/dist/api/riders.js.map +1 -0
- package/dist/api/role-permissions.d.ts +25 -0
- package/dist/api/role-permissions.js +47 -0
- package/dist/api/role-permissions.js.map +1 -0
- package/dist/api/sales-channels.d.ts +234 -0
- package/dist/api/sales-channels.js +119 -0
- package/dist/api/sales-channels.js.map +1 -0
- package/dist/api/service-missing.d.ts +10 -0
- package/dist/api/service-missing.js +19 -0
- package/dist/api/service-missing.js.map +1 -0
- package/dist/api/session-refresh.d.ts +18 -0
- package/dist/api/session-refresh.js +37 -0
- package/dist/api/session-refresh.js.map +1 -0
- package/dist/api/session-scope.d.ts +35 -0
- package/dist/api/session-scope.js +53 -0
- package/dist/api/session-scope.js.map +1 -0
- package/dist/api/settlements.d.ts +106 -0
- package/dist/api/settlements.js +114 -0
- package/dist/api/settlements.js.map +1 -0
- package/dist/api/share-links.d.ts +46 -0
- package/dist/api/share-links.js +25 -0
- package/dist/api/share-links.js.map +1 -0
- package/dist/api/shift-notes.d.ts +19 -0
- package/dist/api/shift-notes.js +13 -0
- package/dist/api/shift-notes.js.map +1 -0
- package/dist/api/shipping.d.ts +42 -0
- package/dist/api/shipping.js +53 -0
- package/dist/api/shipping.js.map +1 -0
- package/dist/api/social-sources.d.ts +58 -0
- package/dist/api/social-sources.js +23 -0
- package/dist/api/social-sources.js.map +1 -0
- package/dist/api/tabs.d.ts +14 -0
- package/dist/api/tabs.js +39 -0
- package/dist/api/tabs.js.map +1 -0
- package/dist/api/team.d.ts +112 -0
- package/dist/api/team.js +144 -0
- package/dist/api/team.js.map +1 -0
- package/dist/api/template-settings.d.ts +26 -0
- package/dist/api/template-settings.js +36 -0
- package/dist/api/template-settings.js.map +1 -0
- package/dist/api/templates.d.ts +21 -0
- package/dist/api/templates.js +25 -0
- package/dist/api/templates.js.map +1 -0
- package/dist/api/tenant-slug.d.ts +13 -0
- package/dist/api/tenant-slug.js +18 -0
- package/dist/api/tenant-slug.js.map +1 -0
- package/dist/api/tenant.d.ts +33 -0
- package/dist/api/tenant.js +51 -0
- package/dist/api/tenant.js.map +1 -0
- package/dist/api/types/analytics-attribution.d.ts +43 -0
- package/dist/api/types/analytics-attribution.js +1 -0
- package/dist/api/types/analytics-attribution.js.map +1 -0
- package/dist/api/types/analytics.d.ts +465 -0
- package/dist/api/types/analytics.js +1 -0
- package/dist/api/types/analytics.js.map +1 -0
- package/dist/api/types/auth.d.ts +206 -0
- package/dist/api/types/auth.js +7 -0
- package/dist/api/types/auth.js.map +1 -0
- package/dist/api/types/automation-flow.d.ts +199 -0
- package/dist/api/types/automation-flow.js +1 -0
- package/dist/api/types/automation-flow.js.map +1 -0
- package/dist/api/types/bookings.d.ts +226 -0
- package/dist/api/types/bookings.js +1 -0
- package/dist/api/types/bookings.js.map +1 -0
- package/dist/api/types/campaigns.d.ts +262 -0
- package/dist/api/types/campaigns.js +1 -0
- package/dist/api/types/campaigns.js.map +1 -0
- package/dist/api/types/catalog.d.ts +273 -0
- package/dist/api/types/catalog.js +1 -0
- package/dist/api/types/catalog.js.map +1 -0
- package/dist/api/types/collections.d.ts +189 -0
- package/dist/api/types/collections.js +1 -0
- package/dist/api/types/collections.js.map +1 -0
- package/dist/api/types/crm.d.ts +264 -0
- package/dist/api/types/crm.js +1 -0
- package/dist/api/types/crm.js.map +1 -0
- package/dist/api/types/customers.d.ts +269 -0
- package/dist/api/types/customers.js +1 -0
- package/dist/api/types/customers.js.map +1 -0
- package/dist/api/types/devices.d.ts +390 -0
- package/dist/api/types/devices.js +1 -0
- package/dist/api/types/devices.js.map +1 -0
- package/dist/api/types/discounts.d.ts +237 -0
- package/dist/api/types/discounts.js +1 -0
- package/dist/api/types/discounts.js.map +1 -0
- package/dist/api/types/filters.d.ts +258 -0
- package/dist/api/types/filters.js +1 -0
- package/dist/api/types/filters.js.map +1 -0
- package/dist/api/types/index.d.ts +31 -0
- package/dist/api/types/index.js +25 -0
- package/dist/api/types/index.js.map +1 -0
- package/dist/api/types/inquiries.d.ts +266 -0
- package/dist/api/types/inquiries.js +1 -0
- package/dist/api/types/inquiries.js.map +1 -0
- package/dist/api/types/locations.d.ts +208 -0
- package/dist/api/types/locations.js +1 -0
- package/dist/api/types/locations.js.map +1 -0
- package/dist/api/types/onboarding.d.ts +311 -0
- package/dist/api/types/onboarding.js +1 -0
- package/dist/api/types/onboarding.js.map +1 -0
- package/dist/api/types/operations.d.ts +136 -0
- package/dist/api/types/operations.js +1 -0
- package/dist/api/types/operations.js.map +1 -0
- package/dist/api/types/orders.d.ts +242 -0
- package/dist/api/types/orders.js +1 -0
- package/dist/api/types/orders.js.map +1 -0
- package/dist/api/types/payables.d.ts +140 -0
- package/dist/api/types/payables.js +1 -0
- package/dist/api/types/payables.js.map +1 -0
- package/dist/api/types/pos.d.ts +121 -0
- package/dist/api/types/pos.js +5 -0
- package/dist/api/types/pos.js.map +1 -0
- package/dist/api/types/record-analytics.d.ts +95 -0
- package/dist/api/types/record-analytics.js +1 -0
- package/dist/api/types/record-analytics.js.map +1 -0
- package/dist/api/types/sales-patterns.d.ts +58 -0
- package/dist/api/types/sales-patterns.js +1 -0
- package/dist/api/types/sales-patterns.js.map +1 -0
- package/dist/api/types/tabs.d.ts +210 -0
- package/dist/api/types/tabs.js +1 -0
- package/dist/api/types/tabs.js.map +1 -0
- package/dist/api/types/templates.d.ts +398 -0
- package/dist/api/types/templates.js +1 -0
- package/dist/api/types/templates.js.map +1 -0
- package/dist/api/types/waitlist.d.ts +324 -0
- package/dist/api/types/waitlist.js +1 -0
- package/dist/api/types/waitlist.js.map +1 -0
- package/dist/api/types.d.ts +1 -0
- package/dist/api/types.js +1 -0
- package/dist/api/unserved-routes.d.ts +4 -0
- package/dist/api/unserved-routes.js +15 -0
- package/dist/api/unserved-routes.js.map +1 -0
- package/dist/api/waitlist.d.ts +80 -0
- package/dist/api/waitlist.js +85 -0
- package/dist/api/waitlist.js.map +1 -0
- package/dist/api.d.ts +1 -0
- package/dist/api.js +1 -0
- package/dist/app-name.d.ts +29 -0
- package/dist/app-name.js +11 -0
- package/dist/app-name.js.map +1 -0
- package/dist/arrival.d.ts +48 -0
- package/dist/arrival.js +34 -0
- package/dist/arrival.js.map +1 -0
- package/dist/auth-context.d.ts +90 -0
- package/dist/auth-context.js +732 -0
- package/dist/auth-context.js.map +1 -0
- package/dist/auth-session.d.ts +1 -0
- package/dist/auth-session.js +25 -0
- package/dist/auth-session.js.map +1 -0
- package/dist/bank-phone.d.ts +2 -0
- package/dist/bank-phone.js +12 -0
- package/dist/bank-phone.js.map +1 -0
- package/dist/behavior-config-types.d.ts +49 -0
- package/dist/behavior-config-types.js +1 -0
- package/dist/behavior-config-types.js.map +1 -0
- package/dist/behavior-context.d.ts +15 -0
- package/dist/behavior-context.js +38 -0
- package/dist/behavior-context.js.map +1 -0
- package/dist/behavior-fields.d.ts +41 -0
- package/dist/behavior-fields.js +20 -0
- package/dist/behavior-fields.js.map +1 -0
- package/dist/blog/__fixtures__/paste-hygiene.d.ts +7 -0
- package/dist/blog/__fixtures__/paste-hygiene.js +36 -0
- package/dist/blog/__fixtures__/paste-hygiene.js.map +1 -0
- package/dist/blog/density.d.ts +65 -0
- package/dist/blog/density.js +126 -0
- package/dist/blog/density.js.map +1 -0
- package/dist/blog/paste-hygiene.d.ts +3 -0
- package/dist/blog/paste-hygiene.js +168 -0
- package/dist/blog/paste-hygiene.js.map +1 -0
- package/dist/booking-location-label.d.ts +10 -0
- package/dist/booking-location-label.js +24 -0
- package/dist/booking-location-label.js.map +1 -0
- package/dist/booking-meeting-link.d.ts +48 -0
- package/dist/booking-meeting-link.js +40 -0
- package/dist/booking-meeting-link.js.map +1 -0
- package/dist/box-channels.d.ts +22 -0
- package/dist/box-channels.js +16 -0
- package/dist/box-channels.js.map +1 -0
- package/dist/box-delivery.d.ts +10 -0
- package/dist/box-delivery.js +5 -0
- package/dist/box-delivery.js.map +1 -0
- package/dist/box-inbox.d.ts +11 -0
- package/dist/box-inbox.js +5 -0
- package/dist/box-inbox.js.map +1 -0
- package/dist/box-letting.d.ts +14 -0
- package/dist/box-letting.js +7 -0
- package/dist/box-letting.js.map +1 -0
- package/dist/box-mark-paths.d.ts +28 -0
- package/dist/box-mark-paths.js +23 -0
- package/dist/box-mark-paths.js.map +1 -0
- package/dist/box-media.d.ts +9 -0
- package/dist/box-media.js +5 -0
- package/dist/box-media.js.map +1 -0
- package/dist/box-products.d.ts +16 -0
- package/dist/box-products.js +9 -0
- package/dist/box-products.js.map +1 -0
- package/dist/box-splits.d.ts +12 -0
- package/dist/box-splits.js +5 -0
- package/dist/box-splits.js.map +1 -0
- package/dist/brand.d.ts +26 -0
- package/dist/brand.js +22 -0
- package/dist/brand.js.map +1 -0
- package/dist/business-categories.d.ts +50 -0
- package/dist/business-categories.js +378 -0
- package/dist/business-categories.js.map +1 -0
- package/dist/business-intents.d.ts +31 -0
- package/dist/business-intents.js +142 -0
- package/dist/business-intents.js.map +1 -0
- package/dist/capability-context.d.ts +63 -0
- package/dist/capability-context.js +84 -0
- package/dist/capability-context.js.map +1 -0
- package/dist/carriers.d.ts +83 -0
- package/dist/carriers.js +124 -0
- package/dist/carriers.js.map +1 -0
- package/dist/commerce-build/api.d.ts +29 -0
- package/dist/commerce-build/api.js +152 -0
- package/dist/commerce-build/api.js.map +1 -0
- package/dist/commerce-build/contracts-profile.d.ts +83 -0
- package/dist/commerce-build/contracts-profile.js +1 -0
- package/dist/commerce-build/contracts-profile.js.map +1 -0
- package/dist/commerce-build/contracts-spec.d.ts +217 -0
- package/dist/commerce-build/contracts-spec.js +1 -0
- package/dist/commerce-build/contracts-spec.js.map +1 -0
- package/dist/commerce-build/contracts.d.ts +2 -0
- package/dist/commerce-build/contracts.js +1 -0
- package/dist/commerce-build/contracts.js.map +1 -0
- package/dist/commerce-build/launch-state.d.ts +20 -0
- package/dist/commerce-build/launch-state.js +72 -0
- package/dist/commerce-build/launch-state.js.map +1 -0
- package/dist/commerce-build/profile-utils.d.ts +5 -0
- package/dist/commerce-build/profile-utils.js +14 -0
- package/dist/commerce-build/profile-utils.js.map +1 -0
- package/dist/commerce-build/setup-flow.d.ts +10 -0
- package/dist/commerce-build/setup-flow.js +24 -0
- package/dist/commerce-build/setup-flow.js.map +1 -0
- package/dist/commerce-build/setup-session.d.ts +26 -0
- package/dist/commerce-build/setup-session.js +70 -0
- package/dist/commerce-build/setup-session.js.map +1 -0
- package/dist/commerce-build/turn-streaming.d.ts +21 -0
- package/dist/commerce-build/turn-streaming.js +113 -0
- package/dist/commerce-build/turn-streaming.js.map +1 -0
- package/dist/commerce-build/workspace-components.d.ts +23 -0
- package/dist/commerce-build/workspace-components.js +66 -0
- package/dist/commerce-build/workspace-components.js.map +1 -0
- package/dist/commerce-build/workspace-config.d.ts +7 -0
- package/dist/commerce-build/workspace-config.js +74 -0
- package/dist/commerce-build/workspace-config.js.map +1 -0
- package/dist/companion/config.d.ts +31 -0
- package/dist/companion/config.js +59 -0
- package/dist/companion/config.js.map +1 -0
- package/dist/connect/catalog.d.ts +32 -0
- package/dist/connect/catalog.js +268 -0
- package/dist/connect/catalog.js.map +1 -0
- package/dist/connect/fixtures/commands.d.ts +8 -0
- package/dist/connect/fixtures/commands.js +146 -0
- package/dist/connect/fixtures/commands.js.map +1 -0
- package/dist/connect/fixtures/connections.d.ts +21 -0
- package/dist/connect/fixtures/connections.js +370 -0
- package/dist/connect/fixtures/connections.js.map +1 -0
- package/dist/connect/fixtures/identities.d.ts +10 -0
- package/dist/connect/fixtures/identities.js +61 -0
- package/dist/connect/fixtures/identities.js.map +1 -0
- package/dist/connect/fixtures/index.d.ts +11 -0
- package/dist/connect/fixtures/index.js +11 -0
- package/dist/connect/fixtures/index.js.map +1 -0
- package/dist/connect/fixtures/usage.d.ts +2 -0
- package/dist/connect/fixtures/usage.js +21 -0
- package/dist/connect/fixtures/usage.js.map +1 -0
- package/dist/connect/fixtures.d.ts +1 -0
- package/dist/connect/fixtures.js +1 -0
- package/dist/connect/from-notifications.d.ts +3 -0
- package/dist/connect/from-notifications.js +78 -0
- package/dist/connect/from-notifications.js.map +1 -0
- package/dist/connect/identity.d.ts +67 -0
- package/dist/connect/identity.js +24 -0
- package/dist/connect/identity.js.map +1 -0
- package/dist/connect/index.d.ts +13 -0
- package/dist/connect/index.js +22 -0
- package/dist/connect/index.js.map +1 -0
- package/dist/connect/next-up.d.ts +18 -0
- package/dist/connect/next-up.js +45 -0
- package/dist/connect/next-up.js.map +1 -0
- package/dist/connect/types.d.ts +354 -0
- package/dist/connect/types.js +68 -0
- package/dist/connect/types.js.map +1 -0
- package/dist/connect/use-connect.d.ts +51 -0
- package/dist/connect/use-connect.js +85 -0
- package/dist/connect/use-connect.js.map +1 -0
- package/dist/connect.d.ts +1 -0
- package/dist/connect.js +1 -0
- package/dist/converted-tag.d.ts +7 -0
- package/dist/converted-tag.js +9 -0
- package/dist/converted-tag.js.map +1 -0
- package/dist/countries.d.ts +65 -0
- package/dist/countries.js +374 -0
- package/dist/countries.js.map +1 -0
- package/dist/country-regions.d.ts +12 -0
- package/dist/country-regions.js +36 -0
- package/dist/country-regions.js.map +1 -0
- package/dist/csv.d.ts +28 -0
- package/dist/csv.js +91 -0
- package/dist/csv.js.map +1 -0
- package/dist/currency.d.ts +5 -0
- package/dist/currency.js +25 -0
- package/dist/currency.js.map +1 -0
- package/dist/customer-helpers.d.ts +30 -0
- package/dist/customer-helpers.js +66 -0
- package/dist/customer-helpers.js.map +1 -0
- package/dist/customer-stage.d.ts +125 -0
- package/dist/customer-stage.js +113 -0
- package/dist/customer-stage.js.map +1 -0
- package/dist/dashboard-destinations.d.ts +5 -0
- package/dist/dashboard-destinations.js +29 -0
- package/dist/dashboard-destinations.js.map +1 -0
- package/dist/demo-content-mock.d.ts +22 -0
- package/dist/demo-content-mock.js +70 -0
- package/dist/demo-content-mock.js.map +1 -0
- package/dist/demo-content-poller.d.ts +33 -0
- package/dist/demo-content-poller.js +80 -0
- package/dist/demo-content-poller.js.map +1 -0
- package/dist/demo-content.d.ts +43 -0
- package/dist/demo-content.js +78 -0
- package/dist/demo-content.js.map +1 -0
- package/dist/describe-activity.d.ts +44 -0
- package/dist/describe-activity.js +16 -0
- package/dist/describe-activity.js.map +1 -0
- package/dist/describe-invite.d.ts +19 -0
- package/dist/describe-invite.js +46 -0
- package/dist/describe-invite.js.map +1 -0
- package/dist/design-schema.d.ts +76 -0
- package/dist/design-schema.js +47 -0
- package/dist/design-schema.js.map +1 -0
- package/dist/destination-alias.d.ts +43 -0
- package/dist/destination-alias.js +146 -0
- package/dist/destination-alias.js.map +1 -0
- package/dist/document-numbering.d.ts +40 -0
- package/dist/document-numbering.js +48 -0
- package/dist/document-numbering.js.map +1 -0
- package/dist/document-title.d.ts +22 -0
- package/dist/document-title.js +85 -0
- package/dist/document-title.js.map +1 -0
- package/dist/editor/row-ops.d.ts +39 -0
- package/dist/editor/row-ops.js +25 -0
- package/dist/editor/row-ops.js.map +1 -0
- package/dist/editor-agent/apply-proposal.d.ts +12 -0
- package/dist/editor-agent/apply-proposal.js +44 -0
- package/dist/editor-agent/apply-proposal.js.map +1 -0
- package/dist/editor-agent/contracts.d.ts +174 -0
- package/dist/editor-agent/contracts.js +1 -0
- package/dist/editor-agent/contracts.js.map +1 -0
- package/dist/editor-agent/converse.d.ts +34 -0
- package/dist/editor-agent/converse.js +141 -0
- package/dist/editor-agent/converse.js.map +1 -0
- package/dist/editor-agent/flag.d.ts +12 -0
- package/dist/editor-agent/flag.js +19 -0
- package/dist/editor-agent/flag.js.map +1 -0
- package/dist/editor-agent/template-document.d.ts +52 -0
- package/dist/editor-agent/template-document.js +50 -0
- package/dist/editor-agent/template-document.js.map +1 -0
- package/dist/editor-agent/use-converse.d.ts +30 -0
- package/dist/editor-agent/use-converse.js +130 -0
- package/dist/editor-agent/use-converse.js.map +1 -0
- package/dist/effective-module-labels.d.ts +17 -0
- package/dist/effective-module-labels.js +14 -0
- package/dist/effective-module-labels.js.map +1 -0
- package/dist/embedded-frame.d.ts +30 -0
- package/dist/embedded-frame.js +23 -0
- package/dist/embedded-frame.js.map +1 -0
- package/dist/empty-state-copy.d.ts +27 -0
- package/dist/empty-state-copy.js +167 -0
- package/dist/empty-state-copy.js.map +1 -0
- package/dist/end-session.d.ts +23 -0
- package/dist/end-session.js +30 -0
- package/dist/end-session.js.map +1 -0
- package/dist/file-intake.d.ts +65 -0
- package/dist/file-intake.js +162 -0
- package/dist/file-intake.js.map +1 -0
- package/dist/first-run.d.ts +5 -0
- package/dist/first-run.js +13 -0
- package/dist/first-run.js.map +1 -0
- package/dist/form-answers.d.ts +57 -0
- package/dist/form-answers.js +79 -0
- package/dist/form-answers.js.map +1 -0
- package/dist/form-draft.d.ts +30 -0
- package/dist/form-draft.js +73 -0
- package/dist/form-draft.js.map +1 -0
- package/dist/format.d.ts +29 -0
- package/dist/format.js +21 -0
- package/dist/format.js.map +1 -0
- package/dist/fulfilment-nav.d.ts +79 -0
- package/dist/fulfilment-nav.js +18 -0
- package/dist/fulfilment-nav.js.map +1 -0
- package/dist/go-live-gate.d.ts +55 -0
- package/dist/go-live-gate.js +17 -0
- package/dist/go-live-gate.js.map +1 -0
- package/dist/group-activity.d.ts +37 -0
- package/dist/group-activity.js +43 -0
- package/dist/group-activity.js.map +1 -0
- package/dist/haptic.d.ts +5 -0
- package/dist/haptic.js +16 -0
- package/dist/haptic.js.map +1 -0
- package/dist/help-topics.d.ts +77 -0
- package/dist/help-topics.js +308 -0
- package/dist/help-topics.js.map +1 -0
- package/dist/icon-resolver.d.ts +45 -0
- package/dist/icon-resolver.js +40 -0
- package/dist/icon-resolver.js.map +1 -0
- package/dist/icons/commerce.d.ts +9 -0
- package/dist/icons/commerce.js +168 -0
- package/dist/icons/commerce.js.map +1 -0
- package/dist/icons/core.d.ts +9 -0
- package/dist/icons/core.js +173 -0
- package/dist/icons/core.js.map +1 -0
- package/dist/icons/making.d.ts +9 -0
- package/dist/icons/making.js +209 -0
- package/dist/icons/making.js.map +1 -0
- package/dist/icons/places.d.ts +9 -0
- package/dist/icons/places.js +232 -0
- package/dist/icons/places.js.map +1 -0
- package/dist/icons/world.d.ts +9 -0
- package/dist/icons/world.js +87 -0
- package/dist/icons/world.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/industry-configs/beauty.d.ts +2 -0
- package/dist/industry-configs/beauty.js +152 -0
- package/dist/industry-configs/beauty.js.map +1 -0
- package/dist/industry-configs/creative.d.ts +2 -0
- package/dist/industry-configs/creative.js +131 -0
- package/dist/industry-configs/creative.js.map +1 -0
- package/dist/industry-configs/default.d.ts +2 -0
- package/dist/industry-configs/default.js +77 -0
- package/dist/industry-configs/default.js.map +1 -0
- package/dist/industry-configs/education.d.ts +2 -0
- package/dist/industry-configs/education.js +137 -0
- package/dist/industry-configs/education.js.map +1 -0
- package/dist/industry-configs/events.d.ts +2 -0
- package/dist/industry-configs/events.js +118 -0
- package/dist/industry-configs/events.js.map +1 -0
- package/dist/industry-configs/fashion.d.ts +2 -0
- package/dist/industry-configs/fashion.js +128 -0
- package/dist/industry-configs/fashion.js.map +1 -0
- package/dist/industry-configs/fitness.d.ts +2 -0
- package/dist/industry-configs/fitness.js +128 -0
- package/dist/industry-configs/fitness.js.map +1 -0
- package/dist/industry-configs/food.d.ts +2 -0
- package/dist/industry-configs/food.js +138 -0
- package/dist/industry-configs/food.js.map +1 -0
- package/dist/industry-configs/hospitality.d.ts +2 -0
- package/dist/industry-configs/hospitality.js +157 -0
- package/dist/industry-configs/hospitality.js.map +1 -0
- package/dist/industry-configs/index.d.ts +25 -0
- package/dist/industry-configs/index.js +77 -0
- package/dist/industry-configs/index.js.map +1 -0
- package/dist/industry-configs/professional.d.ts +2 -0
- package/dist/industry-configs/professional.js +129 -0
- package/dist/industry-configs/professional.js.map +1 -0
- package/dist/industry-configs/realestate.d.ts +2 -0
- package/dist/industry-configs/realestate.js +146 -0
- package/dist/industry-configs/realestate.js.map +1 -0
- package/dist/industry-configs/retail.d.ts +2 -0
- package/dist/industry-configs/retail.js +108 -0
- package/dist/industry-configs/retail.js.map +1 -0
- package/dist/industry-configs/services.d.ts +2 -0
- package/dist/industry-configs/services.js +120 -0
- package/dist/industry-configs/services.js.map +1 -0
- package/dist/industry-configs/technology.d.ts +2 -0
- package/dist/industry-configs/technology.js +120 -0
- package/dist/industry-configs/technology.js.map +1 -0
- package/dist/industry-configs/types.d.ts +99 -0
- package/dist/industry-configs/types.js +1 -0
- package/dist/industry-configs/types.js.map +1 -0
- package/dist/industry-configs/wellness.d.ts +2 -0
- package/dist/industry-configs/wellness.js +112 -0
- package/dist/industry-configs/wellness.js.map +1 -0
- package/dist/industry-configs.d.ts +1 -0
- package/dist/industry-configs.js +1 -0
- package/dist/intents/analytics-labels.d.ts +70 -0
- package/dist/intents/analytics-labels.js +39 -0
- package/dist/intents/analytics-labels.js.map +1 -0
- package/dist/intents/archetype-flow.d.ts +146 -0
- package/dist/intents/archetype-flow.js +185 -0
- package/dist/intents/archetype-flow.js.map +1 -0
- package/dist/intents/booking-query-style.d.ts +32 -0
- package/dist/intents/booking-query-style.js +22 -0
- package/dist/intents/booking-query-style.js.map +1 -0
- package/dist/intents/capture-leads.config.d.ts +31 -0
- package/dist/intents/capture-leads.config.js +231 -0
- package/dist/intents/capture-leads.config.js.map +1 -0
- package/dist/intents/catalog-stock.d.ts +43 -0
- package/dist/intents/catalog-stock.js +43 -0
- package/dist/intents/catalog-stock.js.map +1 -0
- package/dist/intents/collapse-shared-nav.d.ts +95 -0
- package/dist/intents/collapse-shared-nav.js +171 -0
- package/dist/intents/collapse-shared-nav.js.map +1 -0
- package/dist/intents/default-commerce.config.d.ts +6 -0
- package/dist/intents/default-commerce.config.js +281 -0
- package/dist/intents/default-commerce.config.js.map +1 -0
- package/dist/intents/digital-products.config.d.ts +2 -0
- package/dist/intents/digital-products.config.js +239 -0
- package/dist/intents/digital-products.config.js.map +1 -0
- package/dist/intents/dine-in.config.d.ts +15 -0
- package/dist/intents/dine-in.config.js +331 -0
- package/dist/intents/dine-in.config.js.map +1 -0
- package/dist/intents/event-tickets.config.d.ts +2 -0
- package/dist/intents/event-tickets.config.js +368 -0
- package/dist/intents/event-tickets.config.js.map +1 -0
- package/dist/intents/food-orders.config.d.ts +2 -0
- package/dist/intents/food-orders.config.js +299 -0
- package/dist/intents/food-orders.config.js.map +1 -0
- package/dist/intents/icon-map.d.ts +15 -0
- package/dist/intents/icon-map.js +104 -0
- package/dist/intents/icon-map.js.map +1 -0
- package/dist/intents/index.d.ts +12 -0
- package/dist/intents/index.js +50 -0
- package/dist/intents/index.js.map +1 -0
- package/dist/intents/infer-intents.d.ts +10 -0
- package/dist/intents/infer-intents.js +23 -0
- package/dist/intents/infer-intents.js.map +1 -0
- package/dist/intents/intent-chips.d.ts +47 -0
- package/dist/intents/intent-chips.js +38 -0
- package/dist/intents/intent-chips.js.map +1 -0
- package/dist/intents/intent-nav.d.ts +95 -0
- package/dist/intents/intent-nav.js +423 -0
- package/dist/intents/intent-nav.js.map +1 -0
- package/dist/intents/intent-scope.d.ts +52 -0
- package/dist/intents/intent-scope.js +19 -0
- package/dist/intents/intent-scope.js.map +1 -0
- package/dist/intents/nav-coverage.d.ts +71 -0
- package/dist/intents/nav-coverage.js +132 -0
- package/dist/intents/nav-coverage.js.map +1 -0
- package/dist/intents/operating-shell.d.ts +45 -0
- package/dist/intents/operating-shell.js +142 -0
- package/dist/intents/operating-shell.js.map +1 -0
- package/dist/intents/order-display.d.ts +21 -0
- package/dist/intents/order-display.js +110 -0
- package/dist/intents/order-display.js.map +1 -0
- package/dist/intents/order-intent.d.ts +18 -0
- package/dist/intents/order-intent.js +14 -0
- package/dist/intents/order-intent.js.map +1 -0
- package/dist/intents/order-progress.d.ts +81 -0
- package/dist/intents/order-progress.js +91 -0
- package/dist/intents/order-progress.js.map +1 -0
- package/dist/intents/order-sections.d.ts +173 -0
- package/dist/intents/order-sections.js +188 -0
- package/dist/intents/order-sections.js.map +1 -0
- package/dist/intents/order-stats.d.ts +24 -0
- package/dist/intents/order-stats.js +16 -0
- package/dist/intents/order-stats.js.map +1 -0
- package/dist/intents/order-transitions.d.ts +19 -0
- package/dist/intents/order-transitions.js +66 -0
- package/dist/intents/order-transitions.js.map +1 -0
- package/dist/intents/product-editor-config.d.ts +23 -0
- package/dist/intents/product-editor-config.js +13 -0
- package/dist/intents/product-editor-config.js.map +1 -0
- package/dist/intents/product-intent.d.ts +38 -0
- package/dist/intents/product-intent.js +19 -0
- package/dist/intents/product-intent.js.map +1 -0
- package/dist/intents/registry.d.ts +32 -0
- package/dist/intents/registry.js +41 -0
- package/dist/intents/registry.js.map +1 -0
- package/dist/intents/rent-property.config.d.ts +2 -0
- package/dist/intents/rent-property.config.js +284 -0
- package/dist/intents/rent-property.config.js.map +1 -0
- package/dist/intents/resolve-stats.d.ts +7 -0
- package/dist/intents/resolve-stats.js +29 -0
- package/dist/intents/resolve-stats.js.map +1 -0
- package/dist/intents/resolve-tenant-intents.d.ts +11 -0
- package/dist/intents/resolve-tenant-intents.js +61 -0
- package/dist/intents/resolve-tenant-intents.js.map +1 -0
- package/dist/intents/resolvers.d.ts +52 -0
- package/dist/intents/resolvers.js +177 -0
- package/dist/intents/resolvers.js.map +1 -0
- package/dist/intents/row-identity.d.ts +62 -0
- package/dist/intents/row-identity.js +25 -0
- package/dist/intents/row-identity.js.map +1 -0
- package/dist/intents/sales-verb.d.ts +8 -0
- package/dist/intents/sales-verb.js +12 -0
- package/dist/intents/sales-verb.js.map +1 -0
- package/dist/intents/scoped-config.d.ts +12 -0
- package/dist/intents/scoped-config.js +17 -0
- package/dist/intents/scoped-config.js.map +1 -0
- package/dist/intents/screen-title.d.ts +27 -0
- package/dist/intents/screen-title.js +59 -0
- package/dist/intents/screen-title.js.map +1 -0
- package/dist/intents/section-registry.d.ts +48 -0
- package/dist/intents/section-registry.js +33 -0
- package/dist/intents/section-registry.js.map +1 -0
- package/dist/intents/sell-products.config.d.ts +2 -0
- package/dist/intents/sell-products.config.js +275 -0
- package/dist/intents/sell-products.config.js.map +1 -0
- package/dist/intents/send-invoices.config.d.ts +16 -0
- package/dist/intents/send-invoices.config.js +223 -0
- package/dist/intents/send-invoices.config.js.map +1 -0
- package/dist/intents/subscriptions.config.d.ts +2 -0
- package/dist/intents/subscriptions.config.js +260 -0
- package/dist/intents/subscriptions.config.js.map +1 -0
- package/dist/intents/take-bookings.config.d.ts +2 -0
- package/dist/intents/take-bookings.config.js +298 -0
- package/dist/intents/take-bookings.config.js.map +1 -0
- package/dist/intents/types.d.ts +246 -0
- package/dist/intents/types.js +1 -0
- package/dist/intents/types.js.map +1 -0
- package/dist/intents/use-active-intent.d.ts +27 -0
- package/dist/intents/use-active-intent.js +74 -0
- package/dist/intents/use-active-intent.js.map +1 -0
- package/dist/intents/use-destination-label.d.ts +18 -0
- package/dist/intents/use-destination-label.js +45 -0
- package/dist/intents/use-destination-label.js.map +1 -0
- package/dist/intents/use-entity-label.d.ts +32 -0
- package/dist/intents/use-entity-label.js +75 -0
- package/dist/intents/use-entity-label.js.map +1 -0
- package/dist/intents/use-intent-config.d.ts +20 -0
- package/dist/intents/use-intent-config.js +91 -0
- package/dist/intents/use-intent-config.js.map +1 -0
- package/dist/intents/use-intent-nav-rows.d.ts +26 -0
- package/dist/intents/use-intent-nav-rows.js +49 -0
- package/dist/intents/use-intent-nav-rows.js.map +1 -0
- package/dist/intents/use-resource-label.d.ts +10 -0
- package/dist/intents/use-resource-label.js +9 -0
- package/dist/intents/use-resource-label.js.map +1 -0
- package/dist/intents/use-row-noun.d.ts +19 -0
- package/dist/intents/use-row-noun.js +13 -0
- package/dist/intents/use-row-noun.js.map +1 -0
- package/dist/intents/use-screen-title.d.ts +9 -0
- package/dist/intents/use-screen-title.js +25 -0
- package/dist/intents/use-screen-title.js.map +1 -0
- package/dist/intents/what-it-adds.d.ts +70 -0
- package/dist/intents/what-it-adds.js +29 -0
- package/dist/intents/what-it-adds.js.map +1 -0
- package/dist/intents/workflow-shape.d.ts +66 -0
- package/dist/intents/workflow-shape.js +151 -0
- package/dist/intents/workflow-shape.js.map +1 -0
- package/dist/intents.d.ts +1 -0
- package/dist/intents.js +1 -0
- package/dist/invite-refusal.d.ts +37 -0
- package/dist/invite-refusal.js +26 -0
- package/dist/invite-refusal.js.map +1 -0
- package/dist/invoice-brand.d.ts +28 -0
- package/dist/invoice-brand.js +33 -0
- package/dist/invoice-brand.js.map +1 -0
- package/dist/ios-navigation-context.d.ts +11 -0
- package/dist/ios-navigation-context.js +52 -0
- package/dist/ios-navigation-context.js.map +1 -0
- package/dist/legal-links.d.ts +10 -0
- package/dist/legal-links.js +7 -0
- package/dist/legal-links.js.map +1 -0
- package/dist/letting-policy.d.ts +85 -0
- package/dist/letting-policy.js +47 -0
- package/dist/letting-policy.js.map +1 -0
- package/dist/list-page-size.d.ts +24 -0
- package/dist/list-page-size.js +5 -0
- package/dist/list-page-size.js.map +1 -0
- package/dist/live-events/sse-frames.d.ts +15 -0
- package/dist/live-events/sse-frames.js +37 -0
- package/dist/live-events/sse-frames.js.map +1 -0
- package/dist/location-options.d.ts +16 -0
- package/dist/location-options.js +94 -0
- package/dist/location-options.js.map +1 -0
- package/dist/location-scope-context.d.ts +47 -0
- package/dist/location-scope-context.js +85 -0
- package/dist/location-scope-context.js.map +1 -0
- package/dist/media-service.d.ts +97 -0
- package/dist/media-service.js +282 -0
- package/dist/media-service.js.map +1 -0
- package/dist/media-utils.d.ts +51 -0
- package/dist/media-utils.js +85 -0
- package/dist/media-utils.js.map +1 -0
- package/dist/member-presence.d.ts +40 -0
- package/dist/member-presence.js +77 -0
- package/dist/member-presence.js.map +1 -0
- package/dist/member-subscription-enrollment.d.ts +16 -0
- package/dist/member-subscription-enrollment.js +32 -0
- package/dist/member-subscription-enrollment.js.map +1 -0
- package/dist/membership-freshness.d.ts +31 -0
- package/dist/membership-freshness.js +21 -0
- package/dist/membership-freshness.js.map +1 -0
- package/dist/mobile-header-context.d.ts +32 -0
- package/dist/mobile-header-context.js +59 -0
- package/dist/mobile-header-context.js.map +1 -0
- package/dist/mobile-routes.d.ts +81 -0
- package/dist/mobile-routes.js +406 -0
- package/dist/mobile-routes.js.map +1 -0
- package/dist/mobile-tab-config.d.ts +18 -0
- package/dist/mobile-tab-config.js +43 -0
- package/dist/mobile-tab-config.js.map +1 -0
- package/dist/money-coming-soon.d.ts +16 -0
- package/dist/money-coming-soon.js +22 -0
- package/dist/money-coming-soon.js.map +1 -0
- package/dist/money-minor.d.ts +17 -0
- package/dist/money-minor.js +53 -0
- package/dist/money-minor.js.map +1 -0
- package/dist/money-visibility.d.ts +38 -0
- package/dist/money-visibility.js +13 -0
- package/dist/money-visibility.js.map +1 -0
- package/dist/motion.d.ts +160 -0
- package/dist/motion.js +130 -0
- package/dist/motion.js.map +1 -0
- package/dist/nav-pending.d.ts +42 -0
- package/dist/nav-pending.js +84 -0
- package/dist/nav-pending.js.map +1 -0
- package/dist/navigation-groups.d.ts +52 -0
- package/dist/navigation-groups.js +64 -0
- package/dist/navigation-groups.js.map +1 -0
- package/dist/onboarding-draft.d.ts +23 -0
- package/dist/onboarding-draft.js +35 -0
- package/dist/onboarding-draft.js.map +1 -0
- package/dist/operating-model/index.d.ts +4 -0
- package/dist/operating-model/index.js +13 -0
- package/dist/operating-model/index.js.map +1 -0
- package/dist/operating-model/order-display.d.ts +10 -0
- package/dist/operating-model/order-display.js +24 -0
- package/dist/operating-model/order-display.js.map +1 -0
- package/dist/operating-model/resolver.d.ts +9 -0
- package/dist/operating-model/resolver.js +110 -0
- package/dist/operating-model/resolver.js.map +1 -0
- package/dist/operating-model/types.d.ts +36 -0
- package/dist/operating-model/types.js +1 -0
- package/dist/operating-model/types.js.map +1 -0
- package/dist/operating-model/use-operating-model.d.ts +7 -0
- package/dist/operating-model/use-operating-model.js +65 -0
- package/dist/operating-model/use-operating-model.js.map +1 -0
- package/dist/operating-model.d.ts +1 -0
- package/dist/operating-model.js +1 -0
- package/dist/order-config.d.ts +30 -0
- package/dist/order-config.js +56 -0
- package/dist/order-config.js.map +1 -0
- package/dist/order-discounts.d.ts +25 -0
- package/dist/order-discounts.js +27 -0
- package/dist/order-discounts.js.map +1 -0
- package/dist/order-shipping.d.ts +33 -0
- package/dist/order-shipping.js +49 -0
- package/dist/order-shipping.js.map +1 -0
- package/dist/order-tax.d.ts +28 -0
- package/dist/order-tax.js +21 -0
- package/dist/order-tax.js.map +1 -0
- package/dist/page-intros.d.ts +78 -0
- package/dist/page-intros.js +164 -0
- package/dist/page-intros.js.map +1 -0
- package/dist/page-transition.d.ts +20 -0
- package/dist/page-transition.js +19 -0
- package/dist/page-transition.js.map +1 -0
- package/dist/pages-api-response.d.ts +8 -0
- package/dist/pages-api-response.js +18 -0
- package/dist/pages-api-response.js.map +1 -0
- package/dist/payment-method-label.d.ts +6 -0
- package/dist/payment-method-label.js +14 -0
- package/dist/payment-method-label.js.map +1 -0
- package/dist/permission-aliases.d.ts +18 -0
- package/dist/permission-aliases.js +20 -0
- package/dist/permission-aliases.js.map +1 -0
- package/dist/permission-catalog-fallback.d.ts +17 -0
- package/dist/permission-catalog-fallback.js +147 -0
- package/dist/permission-catalog-fallback.js.map +1 -0
- package/dist/permission-change.d.ts +42 -0
- package/dist/permission-change.js +33 -0
- package/dist/permission-change.js.map +1 -0
- package/dist/phone.d.ts +16 -0
- package/dist/phone.js +20 -0
- package/dist/phone.js.map +1 -0
- package/dist/plan-access.d.ts +39 -0
- package/dist/plan-access.js +57 -0
- package/dist/plan-access.js.map +1 -0
- package/dist/plan-card-api.d.ts +34 -0
- package/dist/plan-card-api.js +30 -0
- package/dist/plan-card-api.js.map +1 -0
- package/dist/plan-price.d.ts +34 -0
- package/dist/plan-price.js +57 -0
- package/dist/plan-price.js.map +1 -0
- package/dist/post-login-target.d.ts +24 -0
- package/dist/post-login-target.js +12 -0
- package/dist/post-login-target.js.map +1 -0
- package/dist/potter-mark-paths.d.ts +21 -0
- package/dist/potter-mark-paths.js +9 -0
- package/dist/potter-mark-paths.js.map +1 -0
- package/dist/pricing-plans-types.d.ts +143 -0
- package/dist/pricing-plans-types.js +1 -0
- package/dist/pricing-plans-types.js.map +1 -0
- package/dist/product-assignees.d.ts +1 -0
- package/dist/product-assignees.js +18 -0
- package/dist/product-assignees.js.map +1 -0
- package/dist/product-collection-sync.d.ts +12 -0
- package/dist/product-collection-sync.js +97 -0
- package/dist/product-collection-sync.js.map +1 -0
- package/dist/product-cost.d.ts +12 -0
- package/dist/product-cost.js +24 -0
- package/dist/product-cost.js.map +1 -0
- package/dist/product-insights-api.d.ts +38 -0
- package/dist/product-insights-api.js +51 -0
- package/dist/product-insights-api.js.map +1 -0
- package/dist/product-types.d.ts +311 -0
- package/dist/product-types.js +38 -0
- package/dist/product-types.js.map +1 -0
- package/dist/promised-day.d.ts +33 -0
- package/dist/promised-day.js +38 -0
- package/dist/promised-day.js.map +1 -0
- package/dist/proposals-api.d.ts +96 -0
- package/dist/proposals-api.js +41 -0
- package/dist/proposals-api.js.map +1 -0
- package/dist/proxy-allowlist.d.ts +15 -0
- package/dist/proxy-allowlist.js +153 -0
- package/dist/proxy-allowlist.js.map +1 -0
- package/dist/public-config-loader.d.ts +27 -0
- package/dist/public-config-loader.js +12 -0
- package/dist/public-config-loader.js.map +1 -0
- package/dist/public-config-provider.d.ts +16 -0
- package/dist/public-config-provider.js +14 -0
- package/dist/public-config-provider.js.map +1 -0
- package/dist/resolve-enabled-behaviors.d.ts +55 -0
- package/dist/resolve-enabled-behaviors.js +134 -0
- package/dist/resolve-enabled-behaviors.js.map +1 -0
- package/dist/resource-types.d.ts +198 -0
- package/dist/resource-types.js +96 -0
- package/dist/resource-types.js.map +1 -0
- package/dist/resume-screen.d.ts +31 -0
- package/dist/resume-screen.js +25 -0
- package/dist/resume-screen.js.map +1 -0
- package/dist/rider-display.d.ts +37 -0
- package/dist/rider-display.js +110 -0
- package/dist/rider-display.js.map +1 -0
- package/dist/rider-view.d.ts +37 -0
- package/dist/rider-view.js +47 -0
- package/dist/rider-view.js.map +1 -0
- package/dist/roster-label.d.ts +27 -0
- package/dist/roster-label.js +8 -0
- package/dist/roster-label.js.map +1 -0
- package/dist/route-pattern.d.ts +11 -0
- package/dist/route-pattern.js +20 -0
- package/dist/route-pattern.js.map +1 -0
- package/dist/route-permission.d.ts +60 -0
- package/dist/route-permission.js +48 -0
- package/dist/route-permission.js.map +1 -0
- package/dist/runtime-config.d.ts +33 -0
- package/dist/runtime-config.js +23 -0
- package/dist/runtime-config.js.map +1 -0
- package/dist/schema-validation.d.ts +172 -0
- package/dist/schema-validation.js +252 -0
- package/dist/schema-validation.js.map +1 -0
- package/dist/service-areas.d.ts +30 -0
- package/dist/service-areas.js +24 -0
- package/dist/service-areas.js.map +1 -0
- package/dist/service-operations-api.d.ts +78 -0
- package/dist/service-operations-api.js +37 -0
- package/dist/service-operations-api.js.map +1 -0
- package/dist/settings-relevance.d.ts +64 -0
- package/dist/settings-relevance.js +25 -0
- package/dist/settings-relevance.js.map +1 -0
- package/dist/singularise.d.ts +16 -0
- package/dist/singularise.js +37 -0
- package/dist/singularise.js.map +1 -0
- package/dist/site-address.d.ts +14 -0
- package/dist/site-address.js +28 -0
- package/dist/site-address.js.map +1 -0
- package/dist/slug.d.ts +26 -0
- package/dist/slug.js +15 -0
- package/dist/slug.js.map +1 -0
- package/dist/sound.d.ts +14 -0
- package/dist/sound.js +166 -0
- package/dist/sound.js.map +1 -0
- package/dist/staff-arrival.d.ts +3 -0
- package/dist/staff-arrival.js +11 -0
- package/dist/staff-arrival.js.map +1 -0
- package/dist/staff-home.d.ts +58 -0
- package/dist/staff-home.js +90 -0
- package/dist/staff-home.js.map +1 -0
- package/dist/staff-landing.d.ts +1 -0
- package/dist/staff-landing.js +15 -0
- package/dist/staff-landing.js.map +1 -0
- package/dist/stat-card-types.d.ts +19 -0
- package/dist/stat-card-types.js +1 -0
- package/dist/stat-card-types.js.map +1 -0
- package/dist/stock-levels.d.ts +32 -0
- package/dist/stock-levels.js +17 -0
- package/dist/stock-levels.js.map +1 -0
- package/dist/stored-token.d.ts +1 -0
- package/dist/stored-token.js +11 -0
- package/dist/stored-token.js.map +1 -0
- package/dist/storefront-url.d.ts +31 -0
- package/dist/storefront-url.js +40 -0
- package/dist/storefront-url.js.map +1 -0
- package/dist/storefront.d.ts +64 -0
- package/dist/storefront.js +51 -0
- package/dist/storefront.js.map +1 -0
- package/dist/subscription-billing-api.d.ts +115 -0
- package/dist/subscription-billing-api.js +27 -0
- package/dist/subscription-billing-api.js.map +1 -0
- package/dist/subscription-billing-model.d.ts +26 -0
- package/dist/subscription-billing-model.js +58 -0
- package/dist/subscription-billing-model.js.map +1 -0
- package/dist/support-case-subject.d.ts +10 -0
- package/dist/support-case-subject.js +13 -0
- package/dist/support-case-subject.js.map +1 -0
- package/dist/support-inbox.d.ts +6 -0
- package/dist/support-inbox.js +5 -0
- package/dist/support-inbox.js.map +1 -0
- package/dist/support.d.ts +7 -0
- package/dist/support.js +16 -0
- package/dist/support.js.map +1 -0
- package/dist/team-page.d.ts +9 -0
- package/dist/team-page.js +5 -0
- package/dist/team-page.js.map +1 -0
- package/dist/team-roles.d.ts +140 -0
- package/dist/team-roles.js +247 -0
- package/dist/team-roles.js.map +1 -0
- package/dist/team-successors.d.ts +20 -0
- package/dist/team-successors.js +13 -0
- package/dist/team-successors.js.map +1 -0
- package/dist/template-asset-url.d.ts +11 -0
- package/dist/template-asset-url.js +8 -0
- package/dist/template-asset-url.js.map +1 -0
- package/dist/template-capabilities.d.ts +2 -0
- package/dist/template-capabilities.js +71 -0
- package/dist/template-capabilities.js.map +1 -0
- package/dist/template-context.d.ts +111 -0
- package/dist/template-context.js +1278 -0
- package/dist/template-context.js.map +1 -0
- package/dist/template-filter.d.ts +29 -0
- package/dist/template-filter.js +41 -0
- package/dist/template-filter.js.map +1 -0
- package/dist/template-preview/preview-author-patch.d.ts +24 -0
- package/dist/template-preview/preview-author-patch.js +78 -0
- package/dist/template-preview/preview-author-patch.js.map +1 -0
- package/dist/template-preview/use-template-document.d.ts +38 -0
- package/dist/template-preview/use-template-document.js +45 -0
- package/dist/template-preview/use-template-document.js.map +1 -0
- package/dist/template-requirements.d.ts +38 -0
- package/dist/template-requirements.js +13 -0
- package/dist/template-requirements.js.map +1 -0
- package/dist/template-types.d.ts +317 -0
- package/dist/template-types.js +1 -0
- package/dist/template-types.js.map +1 -0
- package/dist/templates.d.ts +22 -0
- package/dist/templates.js +1 -0
- package/dist/templates.js.map +1 -0
- package/dist/theme-context.d.ts +58 -0
- package/dist/theme-context.js +283 -0
- package/dist/theme-context.js.map +1 -0
- package/dist/theme-policy.d.ts +41 -0
- package/dist/theme-policy.js +32 -0
- package/dist/theme-policy.js.map +1 -0
- package/dist/ticket-access.d.ts +20 -0
- package/dist/ticket-access.js +39 -0
- package/dist/ticket-access.js.map +1 -0
- package/dist/timeline-copy.d.ts +65 -0
- package/dist/timeline-copy.js +150 -0
- package/dist/timeline-copy.js.map +1 -0
- package/dist/url-params.d.ts +23 -0
- package/dist/url-params.js +43 -0
- package/dist/url-params.js.map +1 -0
- package/dist/use-behaviors.d.ts +13 -0
- package/dist/use-behaviors.js +41 -0
- package/dist/use-behaviors.js.map +1 -0
- package/dist/use-business-locations.d.ts +35 -0
- package/dist/use-business-locations.js +71 -0
- package/dist/use-business-locations.js.map +1 -0
- package/dist/use-currency.d.ts +12 -0
- package/dist/use-currency.js +16 -0
- package/dist/use-currency.js.map +1 -0
- package/dist/use-empty-state-copy.d.ts +12 -0
- package/dist/use-empty-state-copy.js +13 -0
- package/dist/use-empty-state-copy.js.map +1 -0
- package/dist/use-geo-cities.d.ts +1 -0
- package/dist/use-geo-cities.js +42 -0
- package/dist/use-geo-cities.js.map +1 -0
- package/dist/use-has-hardware.d.ts +13 -0
- package/dist/use-has-hardware.js +14 -0
- package/dist/use-has-hardware.js.map +1 -0
- package/dist/use-industry-key.d.ts +10 -0
- package/dist/use-industry-key.js +16 -0
- package/dist/use-industry-key.js.map +1 -0
- package/dist/use-item-links.d.ts +20 -0
- package/dist/use-item-links.js +30 -0
- package/dist/use-item-links.js.map +1 -0
- package/dist/use-job-roles.d.ts +21 -0
- package/dist/use-job-roles.js +76 -0
- package/dist/use-job-roles.js.map +1 -0
- package/dist/use-merchant-plan.d.ts +36 -0
- package/dist/use-merchant-plan.js +78 -0
- package/dist/use-merchant-plan.js.map +1 -0
- package/dist/use-module-label.d.ts +12 -0
- package/dist/use-module-label.js +13 -0
- package/dist/use-module-label.js.map +1 -0
- package/dist/use-money-visibility.d.ts +14 -0
- package/dist/use-money-visibility.js +13 -0
- package/dist/use-money-visibility.js.map +1 -0
- package/dist/use-nav-groups.d.ts +27 -0
- package/dist/use-nav-groups.js +141 -0
- package/dist/use-nav-groups.js.map +1 -0
- package/dist/use-pathname.d.ts +15 -0
- package/dist/use-pathname.js +29 -0
- package/dist/use-pathname.js.map +1 -0
- package/dist/use-permissions.d.ts +43 -0
- package/dist/use-permissions.js +158 -0
- package/dist/use-permissions.js.map +1 -0
- package/dist/use-platform-modules.d.ts +49 -0
- package/dist/use-platform-modules.js +416 -0
- package/dist/use-platform-modules.js.map +1 -0
- package/dist/use-staff-home.d.ts +9 -0
- package/dist/use-staff-home.js +24 -0
- package/dist/use-staff-home.js.map +1 -0
- package/dist/use-workspace-invite.d.ts +37 -0
- package/dist/use-workspace-invite.js +69 -0
- package/dist/use-workspace-invite.js.map +1 -0
- package/dist/utils.d.ts +53 -0
- package/dist/utils.js +161 -0
- package/dist/utils.js.map +1 -0
- package/dist/wallet-format.d.ts +8 -0
- package/dist/wallet-format.js +36 -0
- package/dist/wallet-format.js.map +1 -0
- package/dist/wallet-settlement.d.ts +14 -0
- package/dist/wallet-settlement.js +5 -0
- package/dist/wallet-settlement.js.map +1 -0
- package/dist/web-url.d.ts +1 -0
- package/dist/web-url.js +50 -0
- package/dist/web-url.js.map +1 -0
- package/dist/whats-new.d.ts +59 -0
- package/dist/whats-new.js +77 -0
- package/dist/whats-new.js.map +1 -0
- package/dist/workspace-recents.d.ts +30 -0
- package/dist/workspace-recents.js +37 -0
- package/dist/workspace-recents.js.map +1 -0
- package/dist/workspace-slug.d.ts +1 -0
- package/dist/workspace-slug.js +15 -0
- package/dist/workspace-slug.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/template-context.tsx"],"sourcesContent":["'use client';\n\nimport { BRAND_PRIMARY } from '@withpotter/lib/brand';\nimport React, {\n createContext,\n useContext,\n useState,\n useEffect,\n useCallback,\n useMemo,\n useRef,\n} from 'react';\nimport {\n type TemplateConfigAPI,\n type TemplateConfig,\n type ContentTypeConfig,\n type DashboardModule,\n type TemplateCategory,\n type CoreEndpoint,\n type AppearanceSchema,\n type PageContentSchemas,\n type PageSectionField,\n type SiteSettingsSchema,\n type SettingsSection,\n type SettingsFieldConfig,\n} from './template-types';\nimport { resolveIcon } from './icon-resolver';\nimport { validateTemplateConfig } from './schema-validation';\nimport { resolveWebUrl } from './web-url';\nimport { apiFetch } from '@withpotter/lib/api/core';\n\n// ============================================\n// Configuration\n// ============================================\n\nconst WEB_URL = resolveWebUrl();\n\n// ============================================\n// Template Schema localStorage Cache\n// ============================================\n\nconst SCHEMA_CACHE_PREFIX = 'pb_template_schema_';\nconst SCHEMA_CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n\ninterface CachedSchema {\n data: TemplateConfigAPI;\n timestamp: number;\n}\n\nfunction getSchemaCache(templateId: string): CachedSchema | null {\n try {\n const raw = localStorage.getItem(SCHEMA_CACHE_PREFIX + templateId);\n if (!raw) return null;\n return JSON.parse(raw) as CachedSchema;\n } catch {\n return null;\n }\n}\n\nfunction setSchemaCache(templateId: string, data: TemplateConfigAPI): void {\n try {\n const entry: CachedSchema = { data, timestamp: Date.now() };\n localStorage.setItem(\n SCHEMA_CACHE_PREFIX + templateId,\n JSON.stringify(entry),\n );\n } catch {\n // localStorage full or unavailable — ignore\n }\n}\n\nfunction isCacheFresh(cache: CachedSchema): boolean {\n return Date.now() - cache.timestamp < SCHEMA_CACHE_TTL;\n}\n\n// Registry types (lightweight)\nexport interface RegistryCategory {\n id: string;\n name: string;\n icon: string;\n count: number;\n}\n\nexport interface RegistryTemplate {\n id: string;\n name: string;\n description: string;\n category: string;\n icon: string;\n thumbnail: string | null;\n tags: string[];\n relevantCategories?: string[];\n sortOrder: number;\n behaviors?: string[];\n /**\n * The pages this template ships, as surfaces — its own vocabulary stripped\n * off. `/stay`, `/halls` and `/venues` are all `stayable-list`.\n */\n surfaces?: string[];\n /**\n * Which archetypes it can actually present, derived from `surfaces` by the\n * registry. Prefer this over `behaviors` for matching: lagoon-house-01 and\n * listening-room-01 declare identical behaviors and are nothing alike.\n */\n archetypes?: string[];\n /** Who built the template (from the manifest); null when unspecified. */\n author?: string | null;\n /** Price in NGN for premium templates; null/0 = free. */\n price?: number | null;\n}\n\ninterface TemplateRegistry {\n version: string;\n generatedAt: string;\n categories: RegistryCategory[];\n templates: RegistryTemplate[];\n}\n\n// ============================================\n// API Client - Split Schema Architecture\n// ============================================\n\n/**\n * Fetch lightweight registry (categories + template metadata).\n * Retries up to 3 times with exponential backoff — this avoids blank-page\n * scenarios on mobile where a single flaky request fails silently.\n */\n/**\n * Exported so a surface outside the provider can still read the catalogue the\n * RIGHT way round.\n *\n * Onboarding needs templates before there is a business, so it sits outside\n * TemplateProvider and called `templatesApi.list()` directly — the API's\n * templates table, chosen at the time because the registry 502s when the\n * renderer is down. That reasoning was sound and the conclusion was backwards:\n * the table is the STALE source. Measured against staging it serves 7 rows, all\n * tagged `ecommerce`, two of them (`bella-cucina-01`, `strobe-events-01`)\n * pointing at templates the renderer no longer has — which is why they rendered\n * as broken images. The registry serves 11 with real categories, descriptions\n * and behaviors, including every bookings template.\n *\n * So the resilience belongs here, in one place, and every surface gets it:\n * registry first, table only when the renderer is unreachable.\n */\n/**\n * The registry, fetched at most once a minute per page load.\n *\n * Every call was a fresh round trip to the renderer with `no-store`, up to\n * three attempts and a ten-second timeout each — and onboarding calls it on the\n * step where the merchant is waiting to see a wall of pictures (John,\n * 2026-09-10: *\"the template screen took too long to load up\"*). Nothing about\n * the registry changes inside a single setup flow, so the second and third\n * caller should get the first caller's answer.\n *\n * The PROMISE is memoised, not the value: two surfaces mounting at once share\n * one request rather than racing two. A rejection clears the memo, so a failed\n * fetch is retried rather than cached as a failure — see the fallback path\n * below, which is the thing that makes a failure slow in the first place.\n */\nlet registryMemo: { at: number; value: Promise<TemplateRegistry> } | null =\n null;\nconst REGISTRY_MEMO_MS = 60_000;\n\nexport function fetchRegistry(): Promise<TemplateRegistry> {\n if (registryMemo && Date.now() - registryMemo.at < REGISTRY_MEMO_MS) {\n return registryMemo.value;\n }\n const value = fetchRegistryUncached().catch((err) => {\n registryMemo = null;\n throw err;\n });\n registryMemo = { at: Date.now(), value };\n return value;\n}\n\n/** Warm the memo without caring about the answer. Safe to call anywhere. */\nexport function prefetchRegistry(): void {\n void fetchRegistry().catch(() => {});\n}\n\nasync function fetchRegistryUncached(): Promise<TemplateRegistry> {\n const MAX_ATTEMPTS = 3;\n let lastError: Error = new Error('Failed to fetch template registry');\n\n for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {\n if (attempt > 0) {\n // 600ms, then 1200ms between retries\n await new Promise((resolve) => setTimeout(resolve, attempt * 600));\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10_000);\n\n try {\n const res = await fetch(`${WEB_URL}/api/templates/registry`, {\n cache: 'no-store',\n signal: controller.signal,\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return await res.json();\n } catch (err) {\n lastError = err instanceof Error ? err : new Error('Fetch failed');\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n // The renderer is unreachable. Fall back to the API's templates table, which\n // is the actual source of truth for a template's identity, availability,\n // price and behaviors — the manifest only adds presentation.\n //\n // WHY THIS EXISTS. Every template surface read the registry, and the registry\n // proxies web-render. So while the renderer was down or mid-deploy the\n // gallery was EMPTY: merchants could not see templates, could not select one,\n // could not start using one. Three symptoms, one cause, and the admin plane\n // had no business depending on the render plane for liveness in the first\n // place. Now the worst case is stale presentation rather than no templates.\n try {\n const fallback = await fetchRegistryFromApi();\n if (fallback.templates.length > 0) return fallback;\n } catch {\n // Both sources are gone. Report the original failure, which is the more\n // useful one: it names the renderer.\n }\n\n throw lastError;\n}\n\n/**\n * The ids provisioning will actually accept.\n *\n * THE REGISTRY IS NOT THIS LIST. The renderer's registry is what a template\n * looks like; the API's `templates` table is what a tenant can be created with,\n * and provisioning validates against the table and nothing else:\n *\n * Unknown template \"standard-store-01\".\n * Available: bella-cucina-01, ebe-events-01, glow-beauty-01, …\n *\n * The two have drifted — `provision-tenant.usecase.ts` says so in its own\n * comment — and the gallery reads the registry, so it was cheerfully offering\n * seven storefronts that could not be used. Choosing one lost the whole form at\n * the last step, after every question had been answered.\n *\n * So the shelf is the INTERSECTION: the registry's presentation, filtered to\n * what the API can vouch for. Returns null when the table cannot be read, which\n * means \"do not filter\" rather than \"filter everything away\" — a failed lookup\n * must not empty the shelf.\n */\nexport async function fetchProvisionableTemplateIds(): Promise<Set<string> | null> {\n try {\n const rows =\n await apiFetch<{ id: string; isActive?: boolean }[]>('/templates');\n const ids = rows.filter((t) => t.isActive !== false).map((t) => t.id);\n return ids.length > 0 ? new Set(ids) : null;\n } catch {\n return null;\n }\n}\n\n/**\n * The templates table, shaped like a registry.\n *\n * Categories are derived rather than declared, because the table does not carry\n * them: it carries a category per template, which is the same information one\n * level down.\n */\nasync function fetchRegistryFromApi(): Promise<TemplateRegistry> {\n const rows = await apiFetch<\n {\n id: string;\n name: string;\n description?: string;\n category?: string;\n previewImage?: string | null;\n behaviors?: string[];\n sortOrder?: number;\n isActive?: boolean;\n }[]\n >('/templates');\n\n const templates: RegistryTemplate[] = rows\n .filter((t) => t.isActive !== false)\n .map((t) => ({\n id: t.id,\n name: t.name,\n description: t.description ?? '',\n category: t.category ?? 'other',\n icon: '',\n thumbnail: t.previewImage ?? null,\n tags: [],\n sortOrder: t.sortOrder ?? 0,\n behaviors: t.behaviors ?? [],\n }));\n\n const counts = new Map<string, number>();\n for (const t of templates)\n counts.set(t.category, (counts.get(t.category) ?? 0) + 1);\n\n return {\n version: 'api-fallback',\n generatedAt: new Date().toISOString(),\n categories: [...counts].map(([id, count]) => ({\n id,\n name: id.charAt(0).toUpperCase() + id.slice(1),\n icon: '',\n count,\n })),\n templates,\n };\n}\n\n// ============================================\n// Dashboard State Types\n// ============================================\n\nexport type DashboardState =\n 'healthy' | 'loading' | 'degraded' | 'template-missing' | 'offline';\n\nexport interface SchemaValidationResult {\n valid: boolean;\n warnings: string[];\n}\n\n/**\n * Validate a template schema structure on load.\n * Uses Zod-based validation for structural integrity checks.\n * Returns warnings for non-blocking issues and errors for blocking ones.\n */\nexport function validateTemplateSchema(\n schema: TemplateConfigAPI,\n): SchemaValidationResult {\n const zodResult = validateTemplateConfig(\n schema as unknown as Record<string, unknown>,\n );\n\n // Merge Zod errors into warnings for backward compatibility\n // (existing callers expect { valid, warnings } shape)\n const warnings: string[] = [\n ...zodResult.errors.map(\n (e) => `[Schema Error] ${e.path ? `${e.path}: ` : ''}${e.message}`,\n ),\n ...zodResult.warnings,\n ];\n\n return { valid: zodResult.valid, warnings };\n}\n\n// Track failed template fetches with TTL to allow retries after shorter interval\nconst failedTemplateFetches = new Map<string, number>();\nconst FAILURE_TTL_MS = 10_000; // 10 seconds (reduced from 60s to allow faster recovery)\n\nfunction hasRecentlyFailed(templateId: string): boolean {\n const failedAt = failedTemplateFetches.get(templateId);\n if (!failedAt) return false;\n if (Date.now() - failedAt > FAILURE_TTL_MS) {\n failedTemplateFetches.delete(templateId);\n return false;\n }\n return true;\n}\n\nfunction markFailed(templateId: string): void {\n failedTemplateFetches.set(templateId, Date.now());\n}\n\n// Allow manual retry by clearing the failed cache\nfunction clearFailedCache(templateId: string): void {\n failedTemplateFetches.delete(templateId);\n}\n\n/**\n * Fetch full schema for a single template (on-demand)\n * Never falls back silently to a different template — returns null on failure\n * so consumers can show platform modules + a clear warning banner.\n */\nconst standIn = (t: unknown) =>\n (t as { __servedFromApiRow?: boolean } | null)?.__servedFromApiRow;\n\nasync function fetchTemplateSchema(\n templateId: string,\n retryCount = 0,\n timeoutMs = 2000,\n): Promise<TemplateConfigAPI | null> {\n // Template data is supplementary to the dashboard. Do not hold every\n // dashboard screen behind a renderer that is unavailable locally or during\n // a deploy; the API-row fallback below can resolve the shell immediately.\n // Only the patient background refetch retries; the fast first try never does.\n const MAX_RETRIES = timeoutMs > 2000 ? 3 : 0;\n\n // Don't retry templates that recently failed (unless it's a manual retry)\n if (retryCount === 0 && hasRecentlyFailed(templateId)) {\n console.warn(`Template \"${templateId}\" recently failed, skipping fetch`);\n return null;\n }\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n const res = await fetch(`${WEB_URL}/api/templates/${templateId}`, {\n cache: 'no-store',\n signal: controller.signal,\n }).finally(() => clearTimeout(timeoutId));\n\n if (!res.ok) {\n // 404 = template doesn't exist, don't retry\n if (res.status === 404) {\n markFailed(templateId);\n console.error(`Template not found: ${templateId} (HTTP ${res.status})`);\n return null;\n }\n\n // Other errors: retry if we haven't exceeded MAX_RETRIES\n if (retryCount < MAX_RETRIES) {\n console.warn(\n `Template fetch failed (attempt ${retryCount + 1}), retrying...`,\n );\n await new Promise((resolve) =>\n setTimeout(resolve, (retryCount + 1) * 500),\n );\n return fetchTemplateSchema(templateId, retryCount + 1, timeoutMs);\n }\n\n markFailed(templateId);\n console.error(\n `Failed to fetch schema for template: ${templateId} (HTTP ${res.status})`,\n );\n return null;\n }\n\n // Success - clear any failure cache\n clearFailedCache(templateId);\n return res.json();\n } catch (err) {\n // Network error or timeout - retry if we haven't exceeded MAX_RETRIES\n if (retryCount < MAX_RETRIES) {\n console.warn(\n `Template fetch error (attempt ${retryCount + 1}), retrying...`,\n err,\n );\n await new Promise((resolve) =>\n setTimeout(resolve, (retryCount + 1) * 500),\n );\n return fetchTemplateSchema(templateId, retryCount + 1, timeoutMs);\n }\n\n /**\n * The renderer is unreachable. Fall back to the API's own row.\n *\n * This is the error merchants actually hit on entry. The registry going\n * down emptied the gallery — already fixed — but the SCHEMA fetch points at\n * web-render too, and when it failed `setDashboardState('template-missing')`\n * fired and the dashboard fell back to platform modules only. So a renderer\n * outage did not just cost you template pictures, it reshaped the whole\n * dashboard: the archetype's own surfaces disappeared.\n *\n * The row carries `contentTypes`, `dashboardModules` and `behaviors`, which\n * is precisely what the dashboard shapes itself from. What it lacks is\n * `blockSchemas`, `blockRenderers`, `pageContent` and `appearance` — all\n * rendering and editor concerns. Which is the boundary that should have\n * existed all along: the table says what a business IS, the manifest says\n * how its site draws.\n *\n * So a renderer outage now degrades the editor, not the dashboard.\n */\n try {\n const row = await apiFetch<TemplateConfigAPI>(`/templates/${templateId}`);\n if (row?.id) {\n console.warn(\n `Template \"${templateId}\" schema served from the API row; ` +\n 'the dashboard is degraded until the renderer returns.',\n );\n // Tagged, because this is NOT the real schema and must never be\n // reported as healthy. The row carries the name, the category and the\n // behaviors — enough for the shell to know what kind of business this\n // is — but contentTypes and dashboardModules are empty on EVERY row, so\n // the archetype's own surfaces are still missing. Quietly rendering a\n // thinner dashboard as though nothing were wrong would be worse than\n // the error it replaces.\n return { ...row, __servedFromApiRow: true } as TemplateConfigAPI;\n }\n } catch {\n // Both sources are gone; report the renderer failure, which names the\n // thing that is actually down.\n }\n\n markFailed(templateId);\n console.error(`Error fetching template ${templateId}:`, err);\n return null;\n }\n}\n\n// ============================================\n// Icon Resolution (for API responses)\n// ============================================\n\n/**\n * Transform API response to include resolved icons\n */\nfunction resolveTemplateConfig(apiTemplate: TemplateConfigAPI): TemplateConfig {\n const FONT_SIZE_OPTIONS = [\n { label: 'Extra Small (12px)', value: 'xs' },\n { label: 'Small (14px)', value: 'sm' },\n { label: 'Base (16px)', value: 'base' },\n { label: 'Large (18px)', value: 'lg' },\n { label: 'Extra Large (20px)', value: 'xl' },\n { label: '2XL (24px)', value: '2xl' },\n { label: '3XL (30px)', value: '3xl' },\n { label: '4XL (36px)', value: '4xl' },\n { label: '5XL (48px)', value: '5xl' },\n { label: '6XL (60px)', value: '6xl' },\n ];\n\n const FONT_SIZE_EXCLUDED_NAME_PATTERN =\n /(link|url|slug|email|phone|sku|placeholder|alt|path|handle|id)$/i;\n\n function defaultFontSizeForField(field: PageSectionField): string {\n const key = `${field.name} ${field.label}`.toLowerCase();\n\n if (/headline|hero\\s*title|main\\s*title/.test(key)) return '6xl';\n if (/title|heading/.test(key)) return '4xl';\n if (/subtitle|description|content|story|body/.test(key)) return 'base';\n if (/eyebrow|caption|tagline|label/.test(key)) return 'sm';\n\n if (field.type === 'textarea' || field.type === 'richtext') return 'base';\n return 'lg';\n }\n\n function shouldAttachFontSizeField(\n field: PageSectionField,\n sectionFields: PageSectionField[],\n ): boolean {\n if (!['text', 'textarea', 'richtext'].includes(field.type)) return false;\n if (field.name.endsWith('Size')) return false;\n if (FONT_SIZE_EXCLUDED_NAME_PATTERN.test(field.name)) return false;\n\n return !sectionFields.some((f) => f.name === `${field.name}Size`);\n }\n\n function attachFontSizeFields(\n fields: PageSectionField[],\n ): PageSectionField[] {\n const result: PageSectionField[] = [];\n\n for (const field of fields) {\n result.push(field);\n\n if (!shouldAttachFontSizeField(field, fields)) continue;\n\n result.push({\n name: `${field.name}Size`,\n label: `${field.label} Size`,\n type: 'select',\n ui: 'fontSizeScale',\n default: defaultFontSizeForField(field),\n options: FONT_SIZE_OPTIONS,\n previewText: field.label,\n description: `Controls font size for \"${field.label}\"`,\n });\n }\n\n return result;\n }\n\n function withFontSizeControls(\n pageContent: PageContentSchemas,\n ): PageContentSchemas {\n const enhanced: PageContentSchemas = {};\n\n for (const [pageKey, pageSchema] of Object.entries(pageContent)) {\n if (!pageSchema) continue;\n\n // Dedupe sections by `id` — some API-served templates ship the same\n // section id twice and React's reconciler then warns about duplicate\n // keys. Keep the first occurrence, drop the rest, and warn so the\n // offending template surfaces in dev.\n const sourceSections = pageSchema.sections || [];\n const seen = new Set<string>();\n const dedupedSections: typeof sourceSections = [];\n for (const section of sourceSections) {\n if (seen.has(section.id)) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `[template-context] Duplicate section id \"${section.id}\" on page \"${pageKey}\" — dropping duplicate.`,\n );\n }\n continue;\n }\n seen.add(section.id);\n dedupedSections.push(section);\n }\n\n enhanced[pageKey] = {\n ...pageSchema,\n sections: dedupedSections.map((section) => ({\n ...section,\n fields: attachFontSizeFields(section.fields || []),\n })),\n };\n }\n\n return enhanced;\n }\n\n // Normalize siteSettings: JSON schema uses { title, fields: { key: config } }\n // but TypeScript expects { label, fields: [{ name, ...config }] }\n // Preserves non-standard sections (e.g. categoryManager) as-is\n function normalizeSiteSettings(\n raw: Record<string, unknown> | undefined,\n ): SiteSettingsSchema | undefined {\n if (!raw) return undefined;\n const result: SiteSettingsSchema = {};\n for (const [sectionKey, sectionVal] of Object.entries(raw)) {\n if (!sectionVal || typeof sectionVal !== 'object') continue;\n const section = sectionVal as Record<string, unknown>;\n\n // Non-standard sections (e.g. categoryManager) — pass through unchanged\n if (section.type && section.type !== 'section') {\n result[sectionKey] = section as unknown as SettingsSection;\n continue;\n }\n\n const fieldsRaw = section.fields;\n // If fields is already an array, just use it directly\n let fieldsArray: SettingsFieldConfig[];\n if (Array.isArray(fieldsRaw)) {\n fieldsArray = fieldsRaw;\n } else if (fieldsRaw && typeof fieldsRaw === 'object') {\n // Convert object-keyed fields to array with name property\n fieldsArray = Object.entries(fieldsRaw as Record<string, unknown>).map(\n ([fieldName, fieldConfig]) => ({\n ...(fieldConfig as Record<string, unknown>),\n name: fieldName,\n }),\n ) as SettingsFieldConfig[];\n } else {\n // No fields at all — pass through as-is (preserves unknown section shapes)\n result[sectionKey] = section as unknown as SettingsSection;\n continue;\n }\n result[sectionKey] = {\n label:\n (section.title as string) || (section.label as string) || sectionKey,\n description: section.description as string | undefined,\n fields: fieldsArray,\n };\n }\n return Object.keys(result).length > 0 ? result : undefined;\n }\n\n // Resolve content types - map API field names to expected field names\n const contentTypes: Record<string, ContentTypeConfig> = {};\n for (const [key, ct] of Object.entries(apiTemplate.contentTypes || {})) {\n const ctRecord = ct as unknown as Record<string, unknown>;\n contentTypes[key] = {\n ...ct,\n // Map API field names to expected field names\n name: ct.name || (ctRecord.label as string) || key,\n singularName:\n ct.singularName ||\n (ctRecord.labelSingular as string) ||\n (ctRecord.label as string) ||\n key,\n apiEndpoint: ct.apiEndpoint || (ctRecord.coreEndpoint as CoreEndpoint),\n contentTypeKey: ct.contentTypeKey || key, // Set contentTypeKey to the object key if not provided\n icon: resolveIcon(ct.icon),\n };\n }\n\n // ── Universal Content Types ──\n // Blog is a core platform feature available to all merchants, regardless of template.\n // Inject it if not already present (templates may override with custom fields).\n if (!contentTypes.blog) {\n contentTypes.blog = {\n name: 'Blog Posts',\n singularName: 'Blog Post',\n icon: resolveIcon('BookOpen'),\n apiEndpoint: 'blog',\n contentTypeKey: 'blog',\n behaviors: [],\n fields: [\n { name: 'title', label: 'Post Title', type: 'text', required: true },\n { name: 'slug', label: 'URL Slug', type: 'text', required: true },\n { name: 'shortDescription', label: 'Excerpt', type: 'textarea' },\n { name: 'description', label: 'Body', type: 'richtext' },\n { name: 'image', label: 'Cover Image', type: 'image' },\n { name: 'category', label: 'Category', type: 'text' },\n { name: 'tags', label: 'Tags', type: 'text' },\n { name: 'author', label: 'Author Name', type: 'text' },\n { name: 'readTime', label: 'Read Time (minutes)', type: 'number' },\n { name: 'featured', label: 'Featured', type: 'boolean' },\n {\n name: 'status',\n label: 'Status',\n type: 'select',\n options: [\n { label: 'Published', value: 'published' },\n { label: 'Draft', value: 'draft' },\n ],\n },\n ],\n };\n }\n\n // Resolve dashboard modules - map API fields to dashboard fields\n // For content-type modules, route to /dashboard/content/[type]\n // For special modules (settings, appearance, etc.), use the original path\n\n // Feature pages that have dedicated components (not content types)\n // NOTE: analytics, customers, orders are core platform features with dedicated pages\n // Blog is also a core feature with its dedicated page at /dashboard/blog\n const featurePages = new Set([\n 'analytics',\n 'customers',\n 'orders',\n 'bookings',\n 'payments',\n 'calendar-sync',\n 'gift-cards',\n 'giftcards',\n 'memberships',\n 'waitlist',\n 'loyalty',\n 'gallery',\n 'collections',\n 'blog',\n ]);\n\n const specialPaths = new Set([\n '/dashboard',\n '/dashboard/settings',\n '/dashboard/appearance',\n '/dashboard/payments',\n '/dashboard/analytics',\n '/dashboard/customers',\n '/dashboard/orders',\n '/dashboard/content/team',\n '/dashboard/content/inquiries',\n '/dashboard/bookings',\n '/dashboard/calendar-sync',\n '/dashboard/gift-cards',\n '/dashboard/content/memberships',\n '/dashboard/waitlist',\n '/dashboard/gallery',\n '/dashboard/blog',\n ]);\n\n // Map API paths to dashboard paths\n // Supports both /admin/* and /* path formats from template schemas\n const pathMapping: Record<string, string> = {\n '/overview': '/dashboard',\n '/admin': '/dashboard',\n '/settings': '/dashboard/settings',\n '/admin/settings': '/dashboard/settings',\n '/appearance': '/dashboard/appearance',\n '/admin/appearance': '/dashboard/appearance',\n '/payments': '/dashboard/payments',\n '/admin/payments': '/dashboard/payments',\n '/orders': '/dashboard/orders',\n '/admin/orders': '/dashboard/orders',\n '/analytics': '/dashboard/analytics',\n '/admin/analytics': '/dashboard/analytics',\n '/customers': '/dashboard/customers',\n '/admin/customers': '/dashboard/customers',\n '/products': '/dashboard/content/products',\n '/admin/products': '/dashboard/content/products',\n '/pages': '/dashboard/content/pages',\n '/admin/pages': '/dashboard/content/pages',\n '/team': '/dashboard/content/team',\n '/admin/team': '/dashboard/content/team',\n '/inquiries': '/dashboard/content/inquiries',\n '/admin/inquiries': '/dashboard/content/inquiries',\n '/bookings': '/dashboard/bookings',\n '/admin/bookings': '/dashboard/bookings',\n '/gallery': '/dashboard/gallery',\n '/admin/gallery': '/dashboard/gallery',\n '/testimonials': '/dashboard/content/testimonials',\n '/admin/testimonials': '/dashboard/content/testimonials',\n '/collections': '/dashboard/collections',\n '/admin/collections': '/dashboard/collections',\n };\n\n // Handle dashboardModules as either array or object (or missing)\n const rawModules = apiTemplate.dashboardModules;\n const modulesArray = !rawModules\n ? []\n : Array.isArray(rawModules)\n ? rawModules\n : Object.entries(rawModules).map(([id, mod]) => ({\n id,\n ...(mod as Record<string, unknown>),\n }));\n\n const dashboardModules: DashboardModule[] = modulesArray.map((mod) => {\n const modRecord = mod as Record<string, unknown>;\n const apiPath = modRecord.path as string;\n const contentType = modRecord.contentType as string | undefined;\n\n // Determine the correct href\n let href = pathMapping[apiPath] || apiPath;\n\n // If path still has /admin prefix (not in mapping), strip it and re-route\n if (href && href.startsWith('/admin')) {\n href = href.replace(/^\\/admin/, '');\n }\n\n // If path doesn't start with /dashboard, prefix it\n if (href && !href.startsWith('/dashboard')) {\n href = `/dashboard${href}`;\n }\n\n // For feature pages (like customers, reports), use direct path\n // For content-type modules that aren't feature pages, route to /dashboard/content/[type]\n if (contentType && !specialPaths.has(href)) {\n if (featurePages.has(contentType)) {\n // This is a feature page - use direct route\n href = `/dashboard/${contentType}`;\n } else {\n // This is a content type - use content route\n href = `/dashboard/content/${contentType}`;\n }\n }\n\n return {\n id: modRecord.id as string,\n name: (modRecord.label || modRecord.name || modRecord.title) as string, // Map 'label', 'name', or 'title'\n href,\n icon: resolveIcon(modRecord.icon as string),\n description: modRecord.description as string | undefined,\n badge: modRecord.badge as string | undefined,\n contentType: modRecord.contentType as string | undefined,\n };\n });\n\n // ── Default Appearance Schema ──────────────────────────────────────────────\n // Every admin should always have baseline appearance controls, even if the\n // template doesn't declare its own schema.\n const DEFAULT_APPEARANCE: AppearanceSchema = {\n colors: {\n label: 'Brand Colors',\n description: 'Customize the color palette of your website',\n fields: [\n {\n name: 'primary',\n label: 'Primary',\n type: 'color',\n default: BRAND_PRIMARY,\n },\n {\n name: 'secondary',\n label: 'Secondary',\n type: 'color',\n default: '#1A1A1A',\n },\n { name: 'accent', label: 'Accent', type: 'color', default: '#FFB800' },\n {\n name: 'background',\n label: 'Background',\n type: 'color',\n default: '#FFFFFF',\n },\n { name: 'text', label: 'Text', type: 'color', default: '#2D2D2D' },\n ],\n },\n fonts: {\n label: 'Typography',\n description: 'Choose fonts for headings and body text',\n fields: [\n {\n name: 'heading',\n label: 'Heading Font',\n type: 'font',\n default: 'Inter',\n },\n { name: 'body', label: 'Body Font', type: 'font', default: 'Inter' },\n ],\n },\n sections: {\n label: 'Section Visibility',\n description: 'Show or hide sections on your website',\n fields: [\n {\n name: 'showHero',\n label: 'Hero Banner',\n type: 'boolean',\n default: true,\n },\n {\n name: 'showTestimonials',\n label: 'Testimonials',\n type: 'boolean',\n default: true,\n },\n {\n name: 'showNewsletter',\n label: 'Newsletter Signup',\n type: 'boolean',\n default: true,\n },\n ],\n },\n };\n\n // ── Default Page Content Schema ─────────────────────────────────────────────\n // Provides baseline page editing controls for all standard pages.\n const DEFAULT_PAGE_CONTENT: PageContentSchemas = {\n home: {\n label: 'Home',\n description: 'Content for your homepage',\n sections: [\n {\n id: 'hero',\n label: 'Hero Section',\n fields: [\n {\n name: 'headline',\n label: 'Headline',\n type: 'text',\n placeholder: 'Welcome to our store',\n },\n {\n name: 'subheadline',\n label: 'Subheadline',\n type: 'textarea',\n placeholder: 'Discover amazing products',\n },\n { name: 'heroImage', label: 'Hero Image', type: 'image' },\n {\n name: 'ctaText',\n label: 'Button Text',\n type: 'text',\n default: 'Shop Now',\n placeholder: 'Shop Now',\n },\n {\n name: 'ctaLink',\n label: 'Button Link',\n type: 'text',\n default: '/products',\n placeholder: '/products',\n },\n ],\n },\n {\n id: 'featured',\n label: 'Featured Section',\n fields: [\n {\n name: 'title',\n label: 'Section Title',\n type: 'text',\n default: 'Featured Products',\n placeholder: 'Featured Products',\n },\n {\n name: 'subtitle',\n label: 'Section Subtitle',\n type: 'textarea',\n placeholder: 'Our top picks for you',\n },\n ],\n },\n ],\n },\n about: {\n label: 'About',\n description: 'Tell visitors about your business',\n sections: [\n {\n id: 'story',\n label: 'Our Story',\n fields: [\n {\n name: 'title',\n label: 'Page Title',\n type: 'text',\n default: 'About Us',\n placeholder: 'About Us',\n },\n {\n name: 'content',\n label: 'Story Content',\n type: 'richtext',\n placeholder: 'Tell your brand story...',\n },\n { name: 'image', label: 'About Image', type: 'image' },\n ],\n },\n {\n id: 'mission',\n label: 'Mission & Values',\n fields: [\n {\n name: 'mission',\n label: 'Mission Statement',\n type: 'textarea',\n placeholder: 'Our mission is...',\n },\n {\n name: 'values',\n label: 'Core Values',\n type: 'textarea',\n placeholder: 'Quality, Integrity, Innovation',\n },\n ],\n },\n ],\n },\n contact: {\n label: 'Contact',\n description: 'Contact page information',\n sections: [\n {\n id: 'info',\n label: 'Contact Information',\n fields: [\n {\n name: 'title',\n label: 'Page Title',\n type: 'text',\n default: 'Contact Us',\n placeholder: 'Contact Us',\n },\n {\n name: 'description',\n label: 'Description',\n type: 'textarea',\n placeholder: \"We'd love to hear from you\",\n },\n {\n name: 'email',\n label: 'Email Address',\n type: 'text',\n placeholder: 'hello@example.com',\n },\n {\n name: 'phone',\n label: 'Phone Number',\n type: 'text',\n placeholder: '+1 (555) 000-0000',\n },\n {\n name: 'address',\n label: 'Address',\n type: 'textarea',\n placeholder: '123 Main St, City, State',\n },\n ],\n },\n ],\n },\n faq: {\n label: 'FAQ',\n description: 'Frequently asked questions page',\n sections: [\n {\n id: 'header',\n label: 'Page Header',\n fields: [\n {\n name: 'title',\n label: 'Page Title',\n type: 'text',\n default: 'Frequently Asked Questions',\n placeholder: 'Frequently Asked Questions',\n },\n {\n name: 'subtitle',\n label: 'Subtitle',\n type: 'textarea',\n placeholder: 'Find answers to common questions',\n },\n ],\n },\n ],\n },\n shop: {\n label: 'Shop',\n description: 'Shop / products listing page',\n sections: [\n {\n id: 'header',\n label: 'Page Header',\n fields: [\n {\n name: 'title',\n label: 'Page Title',\n type: 'text',\n default: 'Shop',\n placeholder: 'Shop',\n },\n {\n name: 'subtitle',\n label: 'Subtitle',\n type: 'textarea',\n placeholder: 'Browse our collection',\n },\n ],\n },\n ],\n },\n orderTrack: {\n label: 'Order Tracking',\n description: 'Order tracking page',\n sections: [\n {\n id: 'header',\n label: 'Page Header',\n fields: [\n {\n name: 'title',\n label: 'Page Title',\n type: 'text',\n default: 'Track Your Order',\n placeholder: 'Track Your Order',\n },\n {\n name: 'subtitle',\n label: 'Subtitle',\n type: 'textarea',\n placeholder: 'Enter your order details to check the status',\n },\n ],\n },\n ],\n },\n booking: {\n label: 'Booking',\n description: 'Booking / appointment page',\n platformFallback: true,\n sections: [\n {\n id: 'header',\n label: 'Page Header',\n fields: [\n {\n name: 'title',\n label: 'Page Title',\n type: 'text',\n default: 'Book an Appointment',\n placeholder: 'Book an Appointment',\n },\n {\n name: 'subtitle',\n label: 'Subtitle',\n type: 'textarea',\n placeholder: 'Schedule your visit with us',\n },\n ],\n },\n {\n id: 'layout',\n label: 'Layout',\n fields: [\n {\n name: 'variant',\n label: 'Layout Style',\n type: 'select',\n default: 'default',\n options: [\n { value: 'default', label: 'Default' },\n { value: 'split', label: 'Split (calendar left / form right)' },\n ],\n },\n ],\n },\n ],\n },\n membership: {\n label: 'Membership',\n description: 'Membership / subscription page',\n platformFallback: true,\n sections: [\n {\n id: 'header',\n label: 'Page Header',\n fields: [\n {\n name: 'title',\n label: 'Page Title',\n type: 'text',\n default: 'Membership Plans',\n placeholder: 'Membership Plans',\n },\n {\n name: 'subtitle',\n label: 'Subtitle',\n type: 'textarea',\n placeholder: 'Choose the plan that suits you best',\n },\n ],\n },\n {\n id: 'layout',\n label: 'Layout',\n fields: [\n {\n name: 'variant',\n label: 'Layout Style',\n type: 'select',\n default: 'cards',\n options: [\n { value: 'cards', label: 'Cards (side by side)' },\n { value: 'comparison', label: 'Comparison Table' },\n ],\n },\n ],\n },\n ],\n },\n services: {\n label: 'Services',\n description: 'Services listing page',\n platformFallback: true,\n sections: [\n {\n id: 'header',\n label: 'Page Header',\n fields: [\n {\n name: 'title',\n label: 'Page Title',\n type: 'text',\n default: 'Our Services',\n placeholder: 'Our Services',\n },\n {\n name: 'subtitle',\n label: 'Subtitle',\n type: 'textarea',\n placeholder: 'Browse our services and book online',\n },\n ],\n },\n {\n id: 'layout',\n label: 'Layout',\n fields: [\n {\n name: 'variant',\n label: 'Layout Style',\n type: 'select',\n default: 'grid',\n options: [\n { value: 'grid', label: 'Grid' },\n { value: 'list', label: 'List' },\n ],\n },\n ],\n },\n ],\n },\n events: {\n label: 'Events',\n description: 'Events listing page',\n platformFallback: true,\n sections: [\n {\n id: 'header',\n label: 'Page Header',\n fields: [\n {\n name: 'title',\n label: 'Page Title',\n type: 'text',\n default: 'Upcoming Events',\n placeholder: 'Upcoming Events',\n },\n {\n name: 'subtitle',\n label: 'Subtitle',\n type: 'textarea',\n placeholder: 'Browse and register for upcoming events',\n },\n ],\n },\n {\n id: 'layout',\n label: 'Layout',\n fields: [\n {\n name: 'variant',\n label: 'Layout Style',\n type: 'select',\n default: 'grid',\n options: [\n { value: 'grid', label: 'Grid' },\n { value: 'list', label: 'List (timeline-style)' },\n ],\n },\n ],\n },\n ],\n },\n packages: {\n label: 'Packages',\n description: 'Packages / services listing page',\n sections: [\n {\n id: 'header',\n label: 'Page Header',\n fields: [\n {\n name: 'title',\n label: 'Page Title',\n type: 'text',\n default: 'Our Packages',\n placeholder: 'Our Packages',\n },\n {\n name: 'subtitle',\n label: 'Subtitle',\n type: 'textarea',\n placeholder: 'Explore our curated packages',\n },\n ],\n },\n ],\n },\n footer: {\n label: 'Footer',\n description: 'Customize your website footer',\n sections: [\n {\n id: 'content',\n label: 'Footer Content',\n fields: [\n {\n name: 'tagline',\n label: 'Tagline',\n type: 'text',\n placeholder: 'Your tagline here',\n },\n {\n name: 'copyright',\n label: 'Copyright Text',\n type: 'text',\n placeholder: '© 2026 Your Business',\n },\n {\n name: 'showSocialLinks',\n label: 'Show Social Links',\n type: 'boolean',\n default: true,\n },\n ],\n },\n ],\n },\n };\n\n // Assemble appearance from separate top-level keys (colors, fonts, sections)\n // The API returns these as flat keys but TemplateConfig expects them under `appearance`\n const apiRecord = apiTemplate as unknown as Record<string, unknown>;\n const templateAppearance = apiTemplate.appearance || {\n ...(apiRecord.colors ? { colors: apiRecord.colors } : {}),\n ...(apiRecord.fonts ? { fonts: apiRecord.fonts } : {}),\n ...(apiRecord.sections ? { sections: apiRecord.sections } : {}),\n };\n const resolvedAppearance: AppearanceSchema =\n Object.keys(templateAppearance).length > 0\n ? (templateAppearance as AppearanceSchema)\n : DEFAULT_APPEARANCE;\n\n // Resolve pageContent — use template's schema if it has pages with sections,\n // otherwise fall back to platform defaults.\n //\n // IMPORTANT: The canonical source of truth for page schemas is\n // `BASE_PAGE_CONTENT` in web/src/lib/templates/base-dashboard-schema.ts.\n // All templates inherit from it via `buildDashboardSchema()`.\n // `DEFAULT_PAGE_CONTENT` below is a safety-net fallback only used when\n // the template API returns no pageContent. If you add a new page, add it\n // to BOTH `BASE_PAGE_CONTENT` (web) AND `DEFAULT_PAGE_CONTENT` (dashboard).\n // The web test suite (`dashboard-schema.test.ts`) enforces route ↔ schema\n // parity to catch missing entries.\n const templatePageContent = apiTemplate.pageContent as\n PageContentSchemas | undefined;\n const hasPageContent =\n templatePageContent &&\n Object.values(templatePageContent).some(\n (schema) => (schema?.sections?.length ?? 0) > 0,\n );\n const resolvedPageContent: PageContentSchemas = hasPageContent\n ? templatePageContent!\n : DEFAULT_PAGE_CONTENT;\n\n const finalPageContent = withFontSizeControls(resolvedPageContent);\n return {\n ...apiTemplate,\n icon: resolveIcon(apiTemplate.icon),\n contentTypes,\n dashboardModules,\n appearance: resolvedAppearance,\n pageContent: withFontSizeControls(resolvedPageContent),\n siteSettings: normalizeSiteSettings(\n apiTemplate.siteSettings as unknown as Record<string, unknown>,\n ),\n };\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface TemplateContextValue {\n // Registry data (lightweight)\n registry: TemplateRegistry | null;\n categories: RegistryCategory[];\n templateList: RegistryTemplate[];\n // Loaded schemas (full, on-demand)\n loadedSchemas: Map<string, TemplateConfig>;\n // Current tenant's template\n currentTemplate: TemplateConfig | null;\n // Dashboard resilience state\n dashboardState: DashboardState;\n schemaWarnings: string[];\n // Loading states\n registryLoading: boolean;\n schemaLoading: boolean;\n error: Error | null;\n // Actions\n loadTemplateSchema: (templateId: string) => Promise<TemplateConfig | null>;\n getTemplate: (id: string) => TemplateConfig | null;\n getTemplatesByCategory: (category: TemplateCategory) => RegistryTemplate[];\n getContentType: (\n templateId: string,\n contentTypeKey: string,\n ) => ContentTypeConfig | null;\n setCurrentTemplate: (templateId: string) => Promise<void>;\n refetchRegistry: () => Promise<void>;\n retryCurrentTemplate: () => Promise<void>;\n}\n\nconst TemplateContext = createContext<TemplateContextValue | null>(null);\n\nexport function TemplateProvider({ children }: { children: React.ReactNode }) {\n // Registry state (lightweight list)\n const [registry, setRegistry] = useState<TemplateRegistry | null>(null);\n const [registryLoading, setRegistryLoading] = useState(false);\n\n // Schema cache (full schemas, loaded on-demand)\n const [loadedSchemas, setLoadedSchemas] = useState<\n Map<string, TemplateConfig>\n >(new Map());\n const [schemaLoading, setSchemaLoading] = useState(false);\n\n // Current tenant's template\n const [currentTemplate, setCurrentTemplateState] =\n useState<TemplateConfig | null>(null);\n\n // Dashboard resilience state\n const [dashboardState, setDashboardState] =\n useState<DashboardState>('loading');\n const [schemaWarnings, setSchemaWarnings] = useState<string[]>([]);\n\n const [error, setError] = useState<Error | null>(null);\n\n // Load registry on mount\n const loadRegistry = useCallback(async () => {\n try {\n setRegistryLoading(true);\n setError(null);\n const data = await fetchRegistry();\n setRegistry(data);\n } catch (err) {\n console.warn('Failed to load template registry:', err);\n setError(\n err instanceof Error ? err : new Error('Failed to load registry'),\n );\n } finally {\n setRegistryLoading(false);\n }\n }, []);\n\n // Registry is loaded on-demand (e.g. when template picker page mounts),\n // not eagerly on every dashboard load. Call refetchRegistry() to trigger.\n\n // Track templates currently being loaded to prevent duplicate requests\n const loadingTemplatesRef = useRef<Set<string>>(new Set());\n const requestedTemplateRef = useRef<string | null>(null);\n // Use ref for schema cache to avoid stale closures in useCallback\n const loadedSchemasRef = useRef<Map<string, TemplateConfig>>(loadedSchemas);\n loadedSchemasRef.current = loadedSchemas;\n\n // Load a specific template's full schema\n const loadTemplateSchema = useCallback(\n async (templateId: string): Promise<TemplateConfig | null> => {\n // Guard against invalid template IDs\n if (\n !templateId ||\n templateId === 'default' ||\n templateId === 'undefined'\n ) {\n return null;\n }\n\n // Check in-memory cache first (using ref to avoid stale closures)\n // A stand-in is not a cache hit, or it would be served forever.\n const cached = loadedSchemasRef.current.get(templateId);\n if (cached && !standIn(cached)) return cached;\n\n // Check if already loading this template — wait for it instead of returning null\n if (loadingTemplatesRef.current.has(templateId)) {\n // Wait for the in-flight request to complete\n return new Promise((resolve) => {\n const check = () => {\n if (!loadingTemplatesRef.current.has(templateId)) {\n resolve(loadedSchemasRef.current.get(templateId) || null);\n } else {\n setTimeout(check, 50);\n }\n };\n setTimeout(check, 50);\n });\n }\n\n // Check localStorage cache before network fetch\n const lsCache = getSchemaCache(templateId);\n if (lsCache) {\n const validation = validateTemplateSchema(lsCache.data);\n if (validation.warnings.length > 0) {\n setSchemaWarnings(validation.warnings);\n setDashboardState('degraded');\n } else {\n setSchemaWarnings([]);\n setDashboardState('healthy');\n }\n const resolved = resolveTemplateConfig(lsCache.data);\n setLoadedSchemas((prev) => new Map(prev).set(templateId, resolved));\n\n // If stale, background-refresh without blocking\n if (!isCacheFresh(lsCache)) {\n fetchTemplateSchema(templateId)\n .then((fresh) => {\n if (fresh) {\n setSchemaCache(templateId, fresh);\n const freshResolved = resolveTemplateConfig(fresh);\n setLoadedSchemas((prev) =>\n new Map(prev).set(templateId, freshResolved),\n );\n }\n })\n .catch(() => {\n /* background refresh failed — stale cache still valid */\n });\n }\n\n return resolved;\n }\n\n // Mark as loading\n loadingTemplatesRef.current.add(templateId);\n\n // Fetch template schema from web API (source of truth: dashboard-schema.json + manifest.json)\n try {\n setSchemaLoading(true);\n const apiSchema = await fetchTemplateSchema(templateId);\n\n if (!apiSchema) {\n console.warn(\n `Template \"${templateId}\" schema not available from API`,\n );\n return null;\n }\n\n // Validate schema structure before resolving\n const validation = validateTemplateSchema(apiSchema);\n if (validation.warnings.length > 0) {\n console.warn(\n `Template \"${templateId}\" schema warnings:`,\n validation.warnings,\n );\n setSchemaWarnings(validation.warnings);\n setDashboardState('degraded');\n } else {\n setSchemaWarnings([]);\n setDashboardState('healthy');\n }\n\n const resolved = resolveTemplateConfig(apiSchema);\n\n // A stand-in from the API row is functional but thin; say so rather\n // than claiming health, and never cache it — a renderer outage must not\n // leave a degraded schema on disk after the renderer comes back.\n if (\n (apiSchema as { __servedFromApiRow?: boolean }).__servedFromApiRow\n ) {\n setDashboardState('degraded');\n setSchemaWarnings([\n 'Showing a reduced dashboard: the template service is unreachable.',\n ]);\n setLoadedSchemas((prev) => new Map(prev).set(templateId, resolved));\n // The 2s budget is for the shell; the stand-in must not stay (it\n // drops edits to most sections). Refetch patiently and swap it in.\n void fetchTemplateSchema(templateId, 1, 12000).then((full) => {\n if (!full || standIn(full)) return;\n setSchemaCache(templateId, full);\n const real = resolveTemplateConfig(full);\n setLoadedSchemas((prev) => new Map(prev).set(templateId, real));\n if (requestedTemplateRef.current !== templateId) return;\n setCurrentTemplateState(real);\n setSchemaWarnings([]);\n setDashboardState('healthy');\n });\n return resolved;\n }\n\n // Cache in memory + localStorage\n setLoadedSchemas((prev) => new Map(prev).set(templateId, resolved));\n setSchemaCache(templateId, apiSchema);\n return resolved;\n } catch (err) {\n console.warn(`Failed to load schema for ${templateId} from API:`, err);\n setDashboardState('template-missing');\n setSchemaWarnings([]);\n return null;\n } finally {\n setSchemaLoading(false);\n loadingTemplatesRef.current.delete(templateId);\n }\n },\n [], // No dependencies — uses refs for cache access\n );\n\n // Set current template (called when tenant is known)\n const setCurrentTemplate = useCallback(\n async (templateId: string) => {\n // Guard against invalid template IDs\n if (\n !templateId ||\n templateId === 'default' ||\n templateId === 'undefined'\n ) {\n console.warn(\n `setCurrentTemplate: Invalid templateId \"${templateId}\", ignoring`,\n );\n return;\n }\n requestedTemplateRef.current = templateId;\n setDashboardState('loading');\n const schema = await loadTemplateSchema(templateId);\n if (requestedTemplateRef.current !== templateId) return;\n // Only update state if we got a valid schema — never wipe an existing template\n if (schema) {\n setCurrentTemplateState(schema);\n // dashboardState is set inside loadTemplateSchema (healthy or degraded)\n } else {\n // Template failed to load — show platform modules only with warning\n setDashboardState('template-missing');\n }\n },\n [loadTemplateSchema],\n );\n\n // Get template from cache (loaded from API)\n const getTemplate = useCallback(\n (id: string): TemplateConfig | null => {\n return loadedSchemas.get(id) || null;\n },\n [loadedSchemas],\n );\n\n // Get templates in a category (from registry, lightweight)\n const getTemplatesByCategory = useCallback(\n (category: TemplateCategory): RegistryTemplate[] => {\n return registry?.templates.filter((t) => t.category === category) || [];\n },\n [registry],\n );\n\n const getContentType = useCallback(\n (templateId: string, contentTypeKey: string): ContentTypeConfig | null => {\n const template = getTemplate(templateId);\n return template?.contentTypes[contentTypeKey] || null;\n },\n [getTemplate],\n );\n\n // Retry loading the current template (clears failure cache first)\n const retryCurrentTemplate = useCallback(async () => {\n if (!currentTemplate?.id) {\n console.warn('No current template to retry');\n return;\n }\n const templateId = currentTemplate.id;\n console.log(`Retrying template load: ${templateId}`);\n // Clear the failure cache to allow immediate retry\n clearFailedCache(templateId);\n // Force reload\n setDashboardState('loading');\n await setCurrentTemplate(templateId);\n }, [currentTemplate, setCurrentTemplate]);\n\n // Derived values\n const categories = useMemo(() => registry?.categories || [], [registry]);\n const templateList = useMemo(() => registry?.templates || [], [registry]);\n\n const value = useMemo(\n () => ({\n registry,\n categories,\n templateList,\n loadedSchemas,\n currentTemplate,\n dashboardState,\n schemaWarnings,\n registryLoading,\n schemaLoading,\n error,\n loadTemplateSchema,\n getTemplate,\n getTemplatesByCategory,\n getContentType,\n setCurrentTemplate,\n refetchRegistry: loadRegistry,\n retryCurrentTemplate,\n }),\n [\n registry,\n categories,\n templateList,\n loadedSchemas,\n currentTemplate,\n dashboardState,\n schemaWarnings,\n registryLoading,\n schemaLoading,\n error,\n loadTemplateSchema,\n getTemplate,\n getTemplatesByCategory,\n getContentType,\n setCurrentTemplate,\n loadRegistry,\n retryCurrentTemplate,\n ],\n );\n\n return (\n <TemplateContext.Provider value={value}>\n {children}\n </TemplateContext.Provider>\n );\n}\n\nexport function useTemplates() {\n const context = useContext(TemplateContext);\n if (!context) {\n throw new Error('useTemplates must be used within a TemplateProvider');\n }\n return context;\n}\n\n/**\n * Hook for components that need the current tenant's template\n * Automatically loads schema if not already loaded\n */\nexport function useCurrentTemplate(templateId?: string) {\n const {\n currentTemplate,\n setCurrentTemplate,\n schemaLoading,\n dashboardState,\n schemaWarnings,\n retryCurrentTemplate,\n } = useTemplates();\n // Use ref to track attempted loads - avoids re-renders and effect warnings\n const attemptedLoadRef = useRef<string | null>(null);\n\n useEffect(() => {\n // Don't fetch if no templateId, or if it's a known invalid value\n if (!templateId || templateId === 'default' || templateId === 'undefined') {\n return;\n }\n\n // Don't re-attempt if we already tried this exact templateId\n if (attemptedLoadRef.current === templateId) {\n return;\n }\n\n // Fetch if no template loaded yet OR if switching workspaces\n // (templateId changed from what we previously loaded)\n const needsLoad =\n !currentTemplate || attemptedLoadRef.current !== templateId;\n\n if (needsLoad) {\n // Mark that we've attempted this templateId\n attemptedLoadRef.current = templateId;\n setCurrentTemplate(templateId);\n }\n }, [templateId, currentTemplate, setCurrentTemplate]);\n\n return {\n template: currentTemplate?.id === templateId ? currentTemplate : null,\n loading: schemaLoading,\n dashboardState,\n schemaWarnings,\n retryCurrentTemplate,\n };\n}\n\n// ============================================\n// Re-export types\n// ============================================\n\nexport type {\n TemplateConfig,\n TemplateConfigAPI,\n ContentTypeConfig,\n ContentFieldConfig,\n DashboardModule,\n FieldGroup,\n FieldType,\n SelectOption,\n ValidationRule,\n ContentBehavior,\n CoreEndpoint,\n TemplateCategory,\n} from './template-types';\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface FilterableTemplate {
|
|
2
|
+
id: string;
|
|
3
|
+
category: string;
|
|
4
|
+
tags: string[];
|
|
5
|
+
behaviors?: string[];
|
|
6
|
+
relevantCategories?: string[];
|
|
7
|
+
}
|
|
8
|
+
export interface TemplateFilterOptions {
|
|
9
|
+
category?: string | null;
|
|
10
|
+
behaviors?: string[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Score, filter, and sort templates by category relevance and behavior compatibility.
|
|
14
|
+
*
|
|
15
|
+
* When behaviors are specified, templates with zero behavior overlap are excluded.
|
|
16
|
+
* Remaining templates are scored and sorted by relevance.
|
|
17
|
+
*
|
|
18
|
+
* Scoring (behavior overlap is the primary ranking signal):
|
|
19
|
+
* - Behavior full match (all requested): +100
|
|
20
|
+
* - Behavior partial match: +10 per overlapping behavior
|
|
21
|
+
* - relevantCategories match: +5
|
|
22
|
+
* - Exact category match: +5
|
|
23
|
+
* - Tag substring match (legacy fallback): +1
|
|
24
|
+
*/
|
|
25
|
+
export declare function filterTemplates<T extends FilterableTemplate>(templates: T[], options: TemplateFilterOptions): T[];
|
|
26
|
+
/**
|
|
27
|
+
* Check if a template is relevant for a given category.
|
|
28
|
+
*/
|
|
29
|
+
export declare function isTemplateRelevantForCategory(template: FilterableTemplate, categoryId: string): boolean;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
function filterTemplates(templates, options) {
|
|
2
|
+
const { category, behaviors = [] } = options;
|
|
3
|
+
if (!category && behaviors.length === 0) return templates;
|
|
4
|
+
const scored = templates.map((t) => {
|
|
5
|
+
let score = 0;
|
|
6
|
+
if (category) {
|
|
7
|
+
if (t.relevantCategories?.includes(category)) {
|
|
8
|
+
score += 5;
|
|
9
|
+
} else if (t.category === category) {
|
|
10
|
+
score += 5;
|
|
11
|
+
} else if (t.tags?.some((tag) => tag.includes(category))) {
|
|
12
|
+
score += 1;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
let behaviorOverlap = 0;
|
|
16
|
+
if (behaviors.length > 0) {
|
|
17
|
+
const tb = t.behaviors ?? [];
|
|
18
|
+
behaviorOverlap = behaviors.filter((b) => tb.includes(b)).length;
|
|
19
|
+
if (behaviorOverlap === behaviors.length) {
|
|
20
|
+
score += 100;
|
|
21
|
+
} else {
|
|
22
|
+
score += behaviorOverlap * 10;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return { template: t, score, behaviorOverlap };
|
|
26
|
+
});
|
|
27
|
+
const filtered = behaviors.length > 0 ? scored.filter((s) => s.behaviorOverlap > 0) : scored;
|
|
28
|
+
filtered.sort((a, b) => b.score - a.score);
|
|
29
|
+
return filtered.map((s) => s.template);
|
|
30
|
+
}
|
|
31
|
+
function isTemplateRelevantForCategory(template, categoryId) {
|
|
32
|
+
if (template.relevantCategories?.includes(categoryId)) return true;
|
|
33
|
+
if (template.category === categoryId) return true;
|
|
34
|
+
if (template.tags?.some((tag) => tag.includes(categoryId))) return true;
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
export {
|
|
38
|
+
filterTemplates,
|
|
39
|
+
isTemplateRelevantForCategory
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=template-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/template-filter.ts"],"sourcesContent":["export interface FilterableTemplate {\n id: string;\n category: string;\n tags: string[];\n behaviors?: string[];\n relevantCategories?: string[];\n}\n\nexport interface TemplateFilterOptions {\n category?: string | null;\n behaviors?: string[];\n}\n\n/**\n * Score, filter, and sort templates by category relevance and behavior compatibility.\n *\n * When behaviors are specified, templates with zero behavior overlap are excluded.\n * Remaining templates are scored and sorted by relevance.\n *\n * Scoring (behavior overlap is the primary ranking signal):\n * - Behavior full match (all requested): +100\n * - Behavior partial match: +10 per overlapping behavior\n * - relevantCategories match: +5\n * - Exact category match: +5\n * - Tag substring match (legacy fallback): +1\n */\nexport function filterTemplates<T extends FilterableTemplate>(\n templates: T[],\n options: TemplateFilterOptions,\n): T[] {\n const { category, behaviors = [] } = options;\n\n if (!category && behaviors.length === 0) return templates;\n\n const scored = templates.map((t) => {\n let score = 0;\n\n if (category) {\n if (t.relevantCategories?.includes(category)) {\n score += 5;\n } else if (t.category === category) {\n score += 5;\n } else if (t.tags?.some((tag) => tag.includes(category))) {\n score += 1;\n }\n }\n\n let behaviorOverlap = 0;\n if (behaviors.length > 0) {\n const tb = t.behaviors ?? [];\n behaviorOverlap = behaviors.filter((b) => tb.includes(b)).length;\n if (behaviorOverlap === behaviors.length) {\n score += 100;\n } else {\n score += behaviorOverlap * 10;\n }\n }\n\n return { template: t, score, behaviorOverlap };\n });\n\n // When behaviors are specified, exclude templates with zero overlap\n const filtered =\n behaviors.length > 0 ? scored.filter((s) => s.behaviorOverlap > 0) : scored;\n\n filtered.sort((a, b) => b.score - a.score);\n\n return filtered.map((s) => s.template);\n}\n\n/**\n * Check if a template is relevant for a given category.\n */\nexport function isTemplateRelevantForCategory(\n template: FilterableTemplate,\n categoryId: string,\n): boolean {\n if (template.relevantCategories?.includes(categoryId)) return true;\n if (template.category === categoryId) return true;\n if (template.tags?.some((tag) => tag.includes(categoryId))) return true;\n return false;\n}\n"],"mappings":"AA0BO,SAAS,gBACd,WACA,SACK;AACL,QAAM,EAAE,UAAU,YAAY,CAAC,EAAE,IAAI;AAErC,MAAI,CAAC,YAAY,UAAU,WAAW,EAAG,QAAO;AAEhD,QAAM,SAAS,UAAU,IAAI,CAAC,MAAM;AAClC,QAAI,QAAQ;AAEZ,QAAI,UAAU;AACZ,UAAI,EAAE,oBAAoB,SAAS,QAAQ,GAAG;AAC5C,iBAAS;AAAA,MACX,WAAW,EAAE,aAAa,UAAU;AAClC,iBAAS;AAAA,MACX,WAAW,EAAE,MAAM,KAAK,CAAC,QAAQ,IAAI,SAAS,QAAQ,CAAC,GAAG;AACxD,iBAAS;AAAA,MACX;AAAA,IACF;AAEA,QAAI,kBAAkB;AACtB,QAAI,UAAU,SAAS,GAAG;AACxB,YAAM,KAAK,EAAE,aAAa,CAAC;AAC3B,wBAAkB,UAAU,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,EAAE;AAC1D,UAAI,oBAAoB,UAAU,QAAQ;AACxC,iBAAS;AAAA,MACX,OAAO;AACL,iBAAS,kBAAkB;AAAA,MAC7B;AAAA,IACF;AAEA,WAAO,EAAE,UAAU,GAAG,OAAO,gBAAgB;AAAA,EAC/C,CAAC;AAGD,QAAM,WACJ,UAAU,SAAS,IAAI,OAAO,OAAO,CAAC,MAAM,EAAE,kBAAkB,CAAC,IAAI;AAEvE,WAAS,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAEzC,SAAO,SAAS,IAAI,CAAC,MAAM,EAAE,QAAQ;AACvC;AAKO,SAAS,8BACd,UACA,YACS;AACT,MAAI,SAAS,oBAAoB,SAAS,UAAU,EAAG,QAAO;AAC9D,MAAI,SAAS,aAAa,WAAY,QAAO;AAC7C,MAAI,SAAS,MAAM,KAAK,CAAC,QAAQ,IAAI,SAAS,UAAU,CAAC,EAAG,QAAO;AACnE,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export declare const PREVIEW_AUTHOR_PATCH_EVENT = "pb:preview-author-patch";
|
|
2
|
+
export interface AuthorPatchDetail {
|
|
3
|
+
blockId: string;
|
|
4
|
+
field: string;
|
|
5
|
+
pathname?: string;
|
|
6
|
+
value: unknown;
|
|
7
|
+
patchId: string;
|
|
8
|
+
ts: number;
|
|
9
|
+
}
|
|
10
|
+
export declare function dispatchAuthorPatch(patch: Omit<AuthorPatchDetail, 'patchId' | 'ts'> & {
|
|
11
|
+
patchId?: string;
|
|
12
|
+
ts?: number;
|
|
13
|
+
}): AuthorPatchDetail;
|
|
14
|
+
export declare function useAuthorPatchSignal(onPatch: (detail: AuthorPatchDetail) => void): void;
|
|
15
|
+
export declare function getAuthorPatchStorageKey(userId: string | null | undefined, templateId: string | null | undefined): string | null;
|
|
16
|
+
export interface StoredPatchSet {
|
|
17
|
+
[key: string]: {
|
|
18
|
+
value: unknown;
|
|
19
|
+
patchId: string;
|
|
20
|
+
ts: number;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export declare function loadStoredPatches(userId: string | null | undefined, templateId: string | null | undefined): StoredPatchSet;
|
|
24
|
+
export declare function persistAuthorPatch(userId: string | null | undefined, templateId: string | null | undefined, patch: AuthorPatchDetail): void;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useEffect } from "react";
|
|
3
|
+
const PREVIEW_AUTHOR_PATCH_EVENT = "pb:preview-author-patch";
|
|
4
|
+
function dispatchAuthorPatch(patch) {
|
|
5
|
+
const detail = {
|
|
6
|
+
blockId: patch.blockId,
|
|
7
|
+
field: patch.field,
|
|
8
|
+
value: patch.value,
|
|
9
|
+
patchId: patch.patchId ?? cryptoRandomId(),
|
|
10
|
+
ts: patch.ts ?? Date.now()
|
|
11
|
+
};
|
|
12
|
+
if (typeof window !== "undefined") {
|
|
13
|
+
window.dispatchEvent(
|
|
14
|
+
new CustomEvent(PREVIEW_AUTHOR_PATCH_EVENT, { detail })
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
return detail;
|
|
18
|
+
}
|
|
19
|
+
function useAuthorPatchSignal(onPatch) {
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
if (typeof window === "undefined") return;
|
|
22
|
+
const handler = (event) => {
|
|
23
|
+
const custom = event;
|
|
24
|
+
if (!custom.detail) return;
|
|
25
|
+
onPatch(custom.detail);
|
|
26
|
+
};
|
|
27
|
+
window.addEventListener(PREVIEW_AUTHOR_PATCH_EVENT, handler);
|
|
28
|
+
return () => {
|
|
29
|
+
window.removeEventListener(PREVIEW_AUTHOR_PATCH_EVENT, handler);
|
|
30
|
+
};
|
|
31
|
+
}, [onPatch]);
|
|
32
|
+
}
|
|
33
|
+
function cryptoRandomId() {
|
|
34
|
+
if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
|
|
35
|
+
return crypto.randomUUID();
|
|
36
|
+
}
|
|
37
|
+
return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
|
|
38
|
+
}
|
|
39
|
+
const STORAGE_PREFIX = "pb:preview-author";
|
|
40
|
+
function getAuthorPatchStorageKey(userId, templateId) {
|
|
41
|
+
if (!userId || !templateId) return null;
|
|
42
|
+
return `${STORAGE_PREFIX}:${userId}:${templateId}`;
|
|
43
|
+
}
|
|
44
|
+
function loadStoredPatches(userId, templateId) {
|
|
45
|
+
const key = getAuthorPatchStorageKey(userId, templateId);
|
|
46
|
+
if (!key || typeof window === "undefined") return {};
|
|
47
|
+
try {
|
|
48
|
+
const raw = window.localStorage.getItem(key);
|
|
49
|
+
if (!raw) return {};
|
|
50
|
+
const parsed = JSON.parse(raw);
|
|
51
|
+
if (parsed && typeof parsed === "object") return parsed;
|
|
52
|
+
} catch {
|
|
53
|
+
}
|
|
54
|
+
return {};
|
|
55
|
+
}
|
|
56
|
+
function persistAuthorPatch(userId, templateId, patch) {
|
|
57
|
+
const key = getAuthorPatchStorageKey(userId, templateId);
|
|
58
|
+
if (!key || typeof window === "undefined") return;
|
|
59
|
+
const current = loadStoredPatches(userId, templateId);
|
|
60
|
+
current[`${patch.pathname ?? "*"}:${patch.blockId}:${patch.field}`] = {
|
|
61
|
+
value: patch.value,
|
|
62
|
+
patchId: patch.patchId,
|
|
63
|
+
ts: patch.ts
|
|
64
|
+
};
|
|
65
|
+
try {
|
|
66
|
+
window.localStorage.setItem(key, JSON.stringify(current));
|
|
67
|
+
} catch {
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export {
|
|
71
|
+
PREVIEW_AUTHOR_PATCH_EVENT,
|
|
72
|
+
dispatchAuthorPatch,
|
|
73
|
+
getAuthorPatchStorageKey,
|
|
74
|
+
loadStoredPatches,
|
|
75
|
+
persistAuthorPatch,
|
|
76
|
+
useAuthorPatchSignal
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=preview-author-patch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/template-preview/preview-author-patch.ts"],"sourcesContent":["'use client';\n\n/**\n * Dashboard-side author-patch signal. The preview inspector dispatches\n * `pb:preview-author-patch` CustomEvents which the StorefrontPreview\n * listens for and forwards into the preview iframe via\n * `iframe.contentWindow.postMessage`.\n *\n * Mirrors the `preview-refresh.ts` shape — same pattern, same scoping.\n *\n * Cross-repo contract:\n * `withpotter/roadmap/handoffs/in-dashboard-author-mode.md` §4.\n */\n\nimport { useEffect } from 'react';\n\nexport const PREVIEW_AUTHOR_PATCH_EVENT = 'pb:preview-author-patch';\n\nexport interface AuthorPatchDetail {\n blockId: string;\n field: string;\n pathname?: string;\n value: unknown;\n patchId: string;\n ts: number;\n}\n\nexport function dispatchAuthorPatch(\n patch: Omit<AuthorPatchDetail, 'patchId' | 'ts'> & {\n patchId?: string;\n ts?: number;\n },\n): AuthorPatchDetail {\n const detail: AuthorPatchDetail = {\n blockId: patch.blockId,\n field: patch.field,\n value: patch.value,\n patchId: patch.patchId ?? cryptoRandomId(),\n ts: patch.ts ?? Date.now(),\n };\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent(PREVIEW_AUTHOR_PATCH_EVENT, { detail }),\n );\n }\n return detail;\n}\n\nexport function useAuthorPatchSignal(\n onPatch: (detail: AuthorPatchDetail) => void,\n): void {\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const handler = (event: Event) => {\n const custom = event as CustomEvent<AuthorPatchDetail>;\n if (!custom.detail) return;\n onPatch(custom.detail);\n };\n window.addEventListener(PREVIEW_AUTHOR_PATCH_EVENT, handler);\n return () => {\n window.removeEventListener(PREVIEW_AUTHOR_PATCH_EVENT, handler);\n };\n }, [onPatch]);\n}\n\nfunction cryptoRandomId(): string {\n if (\n typeof crypto !== 'undefined' &&\n typeof crypto.randomUUID === 'function'\n ) {\n return crypto.randomUUID();\n }\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n// =============================================================================\n// localStorage persistence\n// =============================================================================\n\nconst STORAGE_PREFIX = 'pb:preview-author';\n\nexport function getAuthorPatchStorageKey(\n userId: string | null | undefined,\n templateId: string | null | undefined,\n): string | null {\n if (!userId || !templateId) return null;\n return `${STORAGE_PREFIX}:${userId}:${templateId}`;\n}\n\nexport interface StoredPatchSet {\n // Keyed by `${pathname}:${blockId}:${field}` so identical sections on\n // different pages do not overwrite one another.\n // overwrites the earlier one.\n [key: string]: { value: unknown; patchId: string; ts: number };\n}\n\nexport function loadStoredPatches(\n userId: string | null | undefined,\n templateId: string | null | undefined,\n): StoredPatchSet {\n const key = getAuthorPatchStorageKey(userId, templateId);\n if (!key || typeof window === 'undefined') return {};\n try {\n const raw = window.localStorage.getItem(key);\n if (!raw) return {};\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed === 'object') return parsed as StoredPatchSet;\n } catch {\n // ignore malformed storage payloads\n }\n return {};\n}\n\nexport function persistAuthorPatch(\n userId: string | null | undefined,\n templateId: string | null | undefined,\n patch: AuthorPatchDetail,\n): void {\n const key = getAuthorPatchStorageKey(userId, templateId);\n if (!key || typeof window === 'undefined') return;\n const current = loadStoredPatches(userId, templateId);\n current[`${patch.pathname ?? '*'}:${patch.blockId}:${patch.field}`] = {\n value: patch.value,\n patchId: patch.patchId,\n ts: patch.ts,\n };\n try {\n window.localStorage.setItem(key, JSON.stringify(current));\n } catch {\n // quota / private-mode: silently drop\n }\n}\n"],"mappings":";AAcA,SAAS,iBAAiB;AAEnB,MAAM,6BAA6B;AAWnC,SAAS,oBACd,OAImB;AACnB,QAAM,SAA4B;AAAA,IAChC,SAAS,MAAM;AAAA,IACf,OAAO,MAAM;AAAA,IACb,OAAO,MAAM;AAAA,IACb,SAAS,MAAM,WAAW,eAAe;AAAA,IACzC,IAAI,MAAM,MAAM,KAAK,IAAI;AAAA,EAC3B;AACA,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO;AAAA,MACL,IAAI,YAAY,4BAA4B,EAAE,OAAO,CAAC;AAAA,IACxD;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,qBACd,SACM;AACN,YAAU,MAAM;AACd,QAAI,OAAO,WAAW,YAAa;AACnC,UAAM,UAAU,CAAC,UAAiB;AAChC,YAAM,SAAS;AACf,UAAI,CAAC,OAAO,OAAQ;AACpB,cAAQ,OAAO,MAAM;AAAA,IACvB;AACA,WAAO,iBAAiB,4BAA4B,OAAO;AAC3D,WAAO,MAAM;AACX,aAAO,oBAAoB,4BAA4B,OAAO;AAAA,IAChE;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AACd;AAEA,SAAS,iBAAyB;AAChC,MACE,OAAO,WAAW,eAClB,OAAO,OAAO,eAAe,YAC7B;AACA,WAAO,OAAO,WAAW;AAAA,EAC3B;AACA,SAAO,GAAG,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AAC9E;AAMA,MAAM,iBAAiB;AAEhB,SAAS,yBACd,QACA,YACe;AACf,MAAI,CAAC,UAAU,CAAC,WAAY,QAAO;AACnC,SAAO,GAAG,cAAc,IAAI,MAAM,IAAI,UAAU;AAClD;AASO,SAAS,kBACd,QACA,YACgB;AAChB,QAAM,MAAM,yBAAyB,QAAQ,UAAU;AACvD,MAAI,CAAC,OAAO,OAAO,WAAW,YAAa,QAAO,CAAC;AACnD,MAAI;AACF,UAAM,MAAM,OAAO,aAAa,QAAQ,GAAG;AAC3C,QAAI,CAAC,IAAK,QAAO,CAAC;AAClB,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,UAAU,OAAO,WAAW,SAAU,QAAO;AAAA,EACnD,QAAQ;AAAA,EAER;AACA,SAAO,CAAC;AACV;AAEO,SAAS,mBACd,QACA,YACA,OACM;AACN,QAAM,MAAM,yBAAyB,QAAQ,UAAU;AACvD,MAAI,CAAC,OAAO,OAAO,WAAW,YAAa;AAC3C,QAAM,UAAU,kBAAkB,QAAQ,UAAU;AACpD,UAAQ,GAAG,MAAM,YAAY,GAAG,IAAI,MAAM,OAAO,IAAI,MAAM,KAAK,EAAE,IAAI;AAAA,IACpE,OAAO,MAAM;AAAA,IACb,SAAS,MAAM;AAAA,IACf,IAAI,MAAM;AAAA,EACZ;AACA,MAAI;AACF,WAAO,aAAa,QAAQ,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,EAC1D,QAAQ;AAAA,EAER;AACF;","names":[]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface TemplateBlockField {
|
|
2
|
+
name: string;
|
|
3
|
+
label: string;
|
|
4
|
+
type: 'text' | 'textarea' | 'richtext' | 'image' | 'url' | 'icon' | 'select' | 'number' | 'toggle' | 'boolean' | 'color' | 'email';
|
|
5
|
+
required?: boolean;
|
|
6
|
+
default?: unknown;
|
|
7
|
+
description?: string;
|
|
8
|
+
placeholder?: string;
|
|
9
|
+
options?: {
|
|
10
|
+
label: string;
|
|
11
|
+
value: string;
|
|
12
|
+
}[];
|
|
13
|
+
}
|
|
14
|
+
export interface TemplateBlockSchema {
|
|
15
|
+
label: string;
|
|
16
|
+
fields: TemplateBlockField[];
|
|
17
|
+
items?: {
|
|
18
|
+
fields: TemplateBlockField[];
|
|
19
|
+
minItems?: number;
|
|
20
|
+
maxItems?: number;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export interface TemplateDocument {
|
|
24
|
+
blockSchemas?: Record<string, TemplateBlockSchema>;
|
|
25
|
+
pageBlockSchemas?: Record<string, Record<string, TemplateBlockSchema>>;
|
|
26
|
+
demoContent?: Record<string, Array<{
|
|
27
|
+
blockType: string;
|
|
28
|
+
data: Record<string, unknown>;
|
|
29
|
+
items?: Record<string, unknown>[];
|
|
30
|
+
}>>;
|
|
31
|
+
[key: string]: unknown;
|
|
32
|
+
}
|
|
33
|
+
export interface UseTemplateDocumentResult {
|
|
34
|
+
document: TemplateDocument | null;
|
|
35
|
+
loading: boolean;
|
|
36
|
+
error: string | null;
|
|
37
|
+
}
|
|
38
|
+
export declare function useTemplateDocument(previewOrigin: string | null | undefined, templateId: string | null | undefined): UseTemplateDocumentResult;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useEffect, useRef, useState } from "react";
|
|
3
|
+
function useTemplateDocument(previewOrigin, templateId) {
|
|
4
|
+
const [document, setDocument] = useState(null);
|
|
5
|
+
const [loading, setLoading] = useState(false);
|
|
6
|
+
const [error, setError] = useState(null);
|
|
7
|
+
const abortRef = useRef(null);
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
if (!previewOrigin || !templateId) {
|
|
10
|
+
setDocument(null);
|
|
11
|
+
setLoading(false);
|
|
12
|
+
setError(null);
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
abortRef.current?.abort();
|
|
16
|
+
const controller = new AbortController();
|
|
17
|
+
abortRef.current = controller;
|
|
18
|
+
setLoading(true);
|
|
19
|
+
setError(null);
|
|
20
|
+
setDocument(null);
|
|
21
|
+
const url = `${previewOrigin.replace(/\/$/, "")}/api/templates/${encodeURIComponent(templateId)}`;
|
|
22
|
+
fetch(url, { signal: controller.signal }).then(async (res) => {
|
|
23
|
+
if (!res.ok) {
|
|
24
|
+
throw new Error(`Template ${templateId} returned ${res.status}`);
|
|
25
|
+
}
|
|
26
|
+
return await res.json();
|
|
27
|
+
}).then((doc) => {
|
|
28
|
+
if (controller.signal.aborted) return;
|
|
29
|
+
setDocument(doc);
|
|
30
|
+
setLoading(false);
|
|
31
|
+
}).catch((err) => {
|
|
32
|
+
if (controller.signal.aborted) return;
|
|
33
|
+
setError(err instanceof Error ? err.message : "Failed to load template");
|
|
34
|
+
setLoading(false);
|
|
35
|
+
});
|
|
36
|
+
return () => {
|
|
37
|
+
controller.abort();
|
|
38
|
+
};
|
|
39
|
+
}, [previewOrigin, templateId]);
|
|
40
|
+
return { document, loading, error };
|
|
41
|
+
}
|
|
42
|
+
export {
|
|
43
|
+
useTemplateDocument
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=use-template-document.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/template-preview/use-template-document.ts"],"sourcesContent":["'use client';\n\n/**\n * Fetches a template document from the web-render preview origin and exposes\n * its `blockSchemas` map (added in withpotter/web-render#174) for the\n * dashboard editor's preview-mode inspector. The endpoint is publicly\n * readable and CORS-permitted for any origin, so no auth headers are sent.\n *\n * Cross-repo contract:\n * `withpotter/roadmap/handoffs/in-dashboard-author-mode.md` §3.\n */\n\nimport { useEffect, useRef, useState } from 'react';\n\nexport interface TemplateBlockField {\n name: string;\n label: string;\n type:\n | 'text'\n | 'textarea'\n | 'richtext'\n | 'image'\n | 'url'\n | 'icon'\n | 'select'\n | 'number'\n | 'toggle'\n | 'boolean'\n | 'color'\n | 'email';\n required?: boolean;\n default?: unknown;\n description?: string;\n placeholder?: string;\n options?: { label: string; value: string }[];\n}\n\nexport interface TemplateBlockSchema {\n label: string;\n fields: TemplateBlockField[];\n items?: { fields: TemplateBlockField[]; minItems?: number; maxItems?: number };\n}\n\nexport interface TemplateDocument {\n blockSchemas?: Record<string, TemplateBlockSchema>;\n pageBlockSchemas?: Record<string, Record<string, TemplateBlockSchema>>;\n demoContent?: Record<\n string,\n Array<{ blockType: string; data: Record<string, unknown>; items?: Record<string, unknown>[] }>\n >;\n [key: string]: unknown;\n}\n\nexport interface UseTemplateDocumentResult {\n document: TemplateDocument | null;\n loading: boolean;\n error: string | null;\n}\n\nexport function useTemplateDocument(\n previewOrigin: string | null | undefined,\n templateId: string | null | undefined,\n): UseTemplateDocumentResult {\n const [document, setDocument] = useState<TemplateDocument | null>(null);\n const [loading, setLoading] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n\n useEffect(() => {\n if (!previewOrigin || !templateId) {\n setDocument(null);\n setLoading(false);\n setError(null);\n return;\n }\n\n abortRef.current?.abort();\n const controller = new AbortController();\n abortRef.current = controller;\n\n setLoading(true);\n setError(null);\n setDocument(null);\n\n const url = `${previewOrigin.replace(/\\/$/, '')}/api/templates/${encodeURIComponent(templateId)}`;\n fetch(url, { signal: controller.signal })\n .then(async (res) => {\n if (!res.ok) {\n throw new Error(`Template ${templateId} returned ${res.status}`);\n }\n return (await res.json()) as TemplateDocument;\n })\n .then((doc) => {\n if (controller.signal.aborted) return;\n setDocument(doc);\n setLoading(false);\n })\n .catch((err: unknown) => {\n if (controller.signal.aborted) return;\n setError(err instanceof Error ? err.message : 'Failed to load template');\n setLoading(false);\n });\n\n return () => {\n controller.abort();\n };\n }, [previewOrigin, templateId]);\n\n return { document, loading, error };\n}\n"],"mappings":";AAYA,SAAS,WAAW,QAAQ,gBAAgB;AA+CrC,SAAS,oBACd,eACA,YAC2B;AAC3B,QAAM,CAAC,UAAU,WAAW,IAAI,SAAkC,IAAI;AACtE,QAAM,CAAC,SAAS,UAAU,IAAI,SAAkB,KAAK;AACrD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AACtD,QAAM,WAAW,OAA+B,IAAI;AAEpD,YAAU,MAAM;AACd,QAAI,CAAC,iBAAiB,CAAC,YAAY;AACjC,kBAAY,IAAI;AAChB,iBAAW,KAAK;AAChB,eAAS,IAAI;AACb;AAAA,IACF;AAEA,aAAS,SAAS,MAAM;AACxB,UAAM,aAAa,IAAI,gBAAgB;AACvC,aAAS,UAAU;AAEnB,eAAW,IAAI;AACf,aAAS,IAAI;AACb,gBAAY,IAAI;AAEhB,UAAM,MAAM,GAAG,cAAc,QAAQ,OAAO,EAAE,CAAC,kBAAkB,mBAAmB,UAAU,CAAC;AAC/F,UAAM,KAAK,EAAE,QAAQ,WAAW,OAAO,CAAC,EACrC,KAAK,OAAO,QAAQ;AACnB,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,IAAI,MAAM,YAAY,UAAU,aAAa,IAAI,MAAM,EAAE;AAAA,MACjE;AACA,aAAQ,MAAM,IAAI,KAAK;AAAA,IACzB,CAAC,EACA,KAAK,CAAC,QAAQ;AACb,UAAI,WAAW,OAAO,QAAS;AAC/B,kBAAY,GAAG;AACf,iBAAW,KAAK;AAAA,IAClB,CAAC,EACA,MAAM,CAAC,QAAiB;AACvB,UAAI,WAAW,OAAO,QAAS;AAC/B,eAAS,eAAe,QAAQ,IAAI,UAAU,yBAAyB;AACvE,iBAAW,KAAK;AAAA,IAClB,CAAC;AAEH,WAAO,MAAM;AACX,iBAAW,MAAM;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,eAAe,UAAU,CAAC;AAE9B,SAAO,EAAE,UAAU,SAAS,MAAM;AACpC;","names":[]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a merchant has to connect before a template does everything it claims.
|
|
3
|
+
*
|
|
4
|
+
* A template can be perfectly rendered and still be half a product: a booking
|
|
5
|
+
* site whose calendar was never connected takes bookings, sends a confirmation
|
|
6
|
+
* with no video link in it, and double-books its owner against their own
|
|
7
|
+
* diary. Each of those fails days later, to a customer, and reads as the
|
|
8
|
+
* product being broken rather than as setup nobody finished.
|
|
9
|
+
*
|
|
10
|
+
* So a template declares its dependencies in its manifest, the registry
|
|
11
|
+
* carries them, and the gallery says them at the one moment a merchant is
|
|
12
|
+
* thinking about setup. Nothing here blocks the choice.
|
|
13
|
+
*
|
|
14
|
+
* It lives in its own module rather than on `RegistryTemplate` because that
|
|
15
|
+
* type sits in `template-context.tsx`, which is on the file-length ledger and
|
|
16
|
+
* fails the guard if it grows at all.
|
|
17
|
+
*/
|
|
18
|
+
export interface TemplateRequirement {
|
|
19
|
+
/** The connector's id in the integration catalogue. */
|
|
20
|
+
id: string;
|
|
21
|
+
/** What the merchant calls it. */
|
|
22
|
+
name: string;
|
|
23
|
+
/**
|
|
24
|
+
* `required` — the template's main act does not work without it.
|
|
25
|
+
* `recommended` — it works, but visibly less well.
|
|
26
|
+
*/
|
|
27
|
+
level: 'required' | 'recommended';
|
|
28
|
+
/** One line: what connecting it turns on. */
|
|
29
|
+
what: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The requirements a registry template declares, ignoring anything malformed.
|
|
33
|
+
*
|
|
34
|
+
* The registry is fetched JSON that nothing validates, and a half-written
|
|
35
|
+
* entry would render as a card with no name in the switch dialog. Dropping it
|
|
36
|
+
* is the right failure: the template still installs.
|
|
37
|
+
*/
|
|
38
|
+
export declare function readTemplateRequirements(template: unknown): TemplateRequirement[];
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const LEVELS = /* @__PURE__ */ new Set(["required", "recommended"]);
|
|
2
|
+
function readTemplateRequirements(template) {
|
|
3
|
+
const declared = template?.requires;
|
|
4
|
+
if (!Array.isArray(declared)) return [];
|
|
5
|
+
return declared.filter((entry) => {
|
|
6
|
+
const r = entry;
|
|
7
|
+
return typeof r?.id === "string" && typeof r?.name === "string" && typeof r?.what === "string" && typeof r?.level === "string" && LEVELS.has(r.level);
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
export {
|
|
11
|
+
readTemplateRequirements
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=template-requirements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/template-requirements.ts"],"sourcesContent":["/**\n * What a merchant has to connect before a template does everything it claims.\n *\n * A template can be perfectly rendered and still be half a product: a booking\n * site whose calendar was never connected takes bookings, sends a confirmation\n * with no video link in it, and double-books its owner against their own\n * diary. Each of those fails days later, to a customer, and reads as the\n * product being broken rather than as setup nobody finished.\n *\n * So a template declares its dependencies in its manifest, the registry\n * carries them, and the gallery says them at the one moment a merchant is\n * thinking about setup. Nothing here blocks the choice.\n *\n * It lives in its own module rather than on `RegistryTemplate` because that\n * type sits in `template-context.tsx`, which is on the file-length ledger and\n * fails the guard if it grows at all.\n */\n\nexport interface TemplateRequirement {\n /** The connector's id in the integration catalogue. */\n id: string;\n /** What the merchant calls it. */\n name: string;\n /**\n * `required` — the template's main act does not work without it.\n * `recommended` — it works, but visibly less well.\n */\n level: 'required' | 'recommended';\n /** One line: what connecting it turns on. */\n what: string;\n}\n\nconst LEVELS = new Set(['required', 'recommended']);\n\n/**\n * The requirements a registry template declares, ignoring anything malformed.\n *\n * The registry is fetched JSON that nothing validates, and a half-written\n * entry would render as a card with no name in the switch dialog. Dropping it\n * is the right failure: the template still installs.\n */\nexport function readTemplateRequirements(\n template: unknown,\n): TemplateRequirement[] {\n const declared = (template as { requires?: unknown })?.requires;\n if (!Array.isArray(declared)) return [];\n return declared.filter((entry): entry is TemplateRequirement => {\n const r = entry as Partial<TemplateRequirement>;\n return (\n typeof r?.id === 'string' &&\n typeof r?.name === 'string' &&\n typeof r?.what === 'string' &&\n typeof r?.level === 'string' &&\n LEVELS.has(r.level)\n );\n });\n}\n"],"mappings":"AAgCA,MAAM,SAAS,oBAAI,IAAI,CAAC,YAAY,aAAa,CAAC;AAS3C,SAAS,yBACd,UACuB;AACvB,QAAM,WAAY,UAAqC;AACvD,MAAI,CAAC,MAAM,QAAQ,QAAQ,EAAG,QAAO,CAAC;AACtC,SAAO,SAAS,OAAO,CAAC,UAAwC;AAC9D,UAAM,IAAI;AACV,WACE,OAAO,GAAG,OAAO,YACjB,OAAO,GAAG,SAAS,YACnB,OAAO,GAAG,SAAS,YACnB,OAAO,GAAG,UAAU,YACpB,OAAO,IAAI,EAAE,KAAK;AAAA,EAEtB,CAAC;AACH;","names":[]}
|