@sonordev/site-kit 6.5.0 → 7.0.0
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/AGENTS.md +18 -3
- package/README.md +50 -34
- package/agent-manifest.json +282 -52
- package/dist/AnalyticsProvider-GJ6JFQO5.js +11 -0
- package/dist/ArticleFaqSection-3Q26DP7P.js +9 -0
- package/dist/ArticleViewTracker-FEA5SBKW.js +49 -0
- package/dist/BlocksPopup-MNK4SDZM.js +43 -0
- package/dist/ChatWidget-M2YNLRYW.js +15 -0
- package/dist/DatePicker-JEBV6WYJ.js +2 -0
- package/dist/EngageWidget-RR63JQCA.js +11 -0
- package/dist/FileField-JFBXXD43.js +83 -0
- package/dist/FormCelebration-OVGAGBKF.js +2 -0
- package/dist/FormSpotlight-QE3J3VB5.js +754 -0
- package/dist/FormStage-OTPKEWID.js +418 -0
- package/dist/ManagedForm-3VRALWUD.js +14 -0
- package/dist/ManagedNewsletterForm-A2FE6L5C.js +62 -0
- package/dist/SignalCore-S6DO3VQV.js +322 -0
- package/dist/SiteDesignReporter-2WZVWJMA.js +11 -0
- package/dist/SitemapSync-IKNKPT2G.js +8 -0
- package/dist/SitemapSync.d.ts +0 -1
- package/dist/_client/booking-widget.d.ts +4 -0
- package/dist/_client/booking-widget.js +7 -0
- package/dist/_client/testimonial-section.d.ts +11 -0
- package/dist/_client/testimonial-section.js +5 -0
- package/dist/admin-auth/index.d.ts +0 -1
- package/dist/admin-auth/index.js +0 -0
- package/dist/admin-auth/session.d.ts +0 -1
- package/dist/affiliates/AffiliatesWidget.d.ts +0 -1
- package/dist/affiliates/api.d.ts +0 -1
- package/dist/affiliates/index.d.ts +0 -1
- package/dist/affiliates/index.js +149 -0
- package/dist/affiliates/types.d.ts +0 -1
- package/dist/affiliates/useAffiliates.d.ts +0 -1
- package/dist/analytics/AnalyticsProvider.d.ts +0 -1
- package/dist/analytics/WebVitals.d.ts +0 -1
- package/dist/analytics/dispatch.d.ts +0 -1
- package/dist/analytics/index.d.ts +0 -1
- package/dist/analytics/index.js +12 -67
- package/dist/analytics/measurement-context.d.ts +0 -1
- package/dist/analytics/page-observation.d.ts +0 -1
- package/dist/analytics/send-gate.d.ts +0 -1
- package/dist/analytics/types.d.ts +0 -1
- package/dist/analytics/useContactTracking.d.ts +0 -1
- package/dist/article-styles-6CM5FUMV.js +590 -0
- package/dist/article-tables-AXSZOGNW.js +2 -0
- package/dist/articles/Article.d.ts +0 -1
- package/dist/articles/ArticleFAQ.d.ts +0 -1
- package/dist/articles/ArticleFaqSection.d.ts +0 -1
- package/dist/articles/ArticleList.d.ts +0 -1
- package/dist/articles/ArticleViewTracker.d.ts +0 -1
- package/dist/articles/AuthorCard.d.ts +0 -1
- package/dist/articles/AuthorPage.d.ts +0 -1
- package/dist/articles/ClusterLandingPage.d.ts +0 -1
- package/dist/articles/ClusterNavigation.d.ts +0 -1
- package/dist/articles/ManagedNewsletterForm.d.ts +0 -1
- package/dist/articles/NewsletterShell.d.ts +0 -1
- package/dist/articles/NewsletterWidget.d.ts +0 -1
- package/dist/articles/PublicationLayout.d.ts +0 -1
- package/dist/articles/PublicationSidebar.d.ts +0 -1
- package/dist/articles/RelatedPosts.d.ts +0 -1
- package/dist/articles/ServiceCallout.d.ts +0 -1
- package/dist/articles/TableOfContents.d.ts +0 -1
- package/dist/articles/article-styles.d.ts +0 -1
- package/dist/articles/article-tables.d.ts +0 -1
- package/dist/articles/artwork.d.ts +0 -1
- package/dist/articles/author-schema.d.ts +0 -1
- package/dist/articles/author-social.d.ts +0 -1
- package/dist/articles/excerpt.d.ts +0 -1
- package/dist/articles/index.d.ts +0 -1
- package/dist/articles/index.js +87 -147
- package/dist/articles/news-sitemap.d.ts +0 -1
- package/dist/articles/processArticleHtml.d.ts +0 -1
- package/dist/articles/public-reads.d.ts +0 -1
- package/dist/articles/reading-time.d.ts +0 -1
- package/dist/articles/routes.d.ts +0 -1
- package/dist/articles/server-core.d.ts +0 -14
- package/dist/articles/server-ui.d.ts +0 -1
- package/dist/articles/server-ui.js +221 -265
- package/dist/articles/server.d.ts +0 -14
- package/dist/articles/server.js +10 -252
- package/dist/articles/types.d.ts +0 -1
- package/dist/articles/widget-styles.d.ts +0 -1
- package/dist/brand/extract-brand-profile.d.ts +0 -1
- package/dist/chat/index.d.ts +11 -0
- package/dist/chat/index.js +16 -0
- package/dist/chunk-24QZEO3Q.js +41 -0
- package/dist/chunk-3XHK5DFX.js +184 -0
- package/dist/chunk-43OCZ3JA.js +67 -0
- package/dist/chunk-4KZ6W3ZH.js +8 -0
- package/dist/chunk-4WI3FU5L.js +129 -0
- package/dist/chunk-4Y5FWDPM.js +97 -0
- package/dist/chunk-5C4WVOVO.js +478 -0
- package/dist/chunk-5SQK3D53.js +24 -0
- package/dist/chunk-5UZN5V52.js +52 -0
- package/dist/chunk-5YSI5KFD.js +19 -0
- package/dist/chunk-6CUFRMMF.js +937 -0
- package/dist/chunk-6HDT4G4A.js +253 -0
- package/dist/chunk-6T6CQVNL.js +37 -0
- package/dist/chunk-6ZB3XNAT.js +54 -0
- package/dist/chunk-7KJGO77W.js +1 -0
- package/dist/chunk-7L5AARVY.js +68 -0
- package/dist/chunk-7ZHJIRM3.js +4 -0
- package/dist/chunk-7ZWO5HDQ.js +1 -0
- package/dist/chunk-A4CC4ZG3.js +15 -0
- package/dist/chunk-AQSNPZY4.js +92 -0
- package/dist/chunk-B52EXDWI.js +1803 -0
- package/dist/chunk-BQR4IPBW.js +146 -0
- package/dist/chunk-BR4ZKUHH.js +227 -0
- package/dist/chunk-BU66S5B7.js +1 -0
- package/dist/chunk-C4G3NW2E.js +25 -0
- package/dist/chunk-D7SLSJS4.js +1 -0
- package/dist/chunk-DIKNRN34.js +28 -0
- package/dist/chunk-DXO6SBMD.js +43 -0
- package/dist/chunk-EDYHROQ7.js +77 -0
- package/dist/chunk-EKBEOXTH.js +114 -0
- package/dist/chunk-FESKKJAS.js +19 -0
- package/dist/chunk-FV2VD7WM.js +347 -0
- package/dist/chunk-FYAB6CXS.js +265 -0
- package/dist/chunk-G3NHWMP5.js +233 -0
- package/dist/chunk-GJWI74ZZ.js +27 -0
- package/dist/chunk-GKGSXUVQ.js +218 -0
- package/dist/chunk-GLHQ3LRO.js +97 -0
- package/dist/chunk-GW7GSBO7.js +66 -0
- package/dist/chunk-GYBMMWGF.js +163 -0
- package/dist/chunk-GYF2ULVO.js +14 -0
- package/dist/chunk-HPUXKMNR.js +148 -0
- package/dist/chunk-HXJ54KAM.js +122 -0
- package/dist/chunk-I6WUCBKI.js +99 -0
- package/dist/chunk-IHG36STL.js +286 -0
- package/dist/chunk-J4FSB4OG.js +200 -0
- package/dist/chunk-JE4A5S4F.js +48 -0
- package/dist/chunk-JJ4JS3LD.js +26 -0
- package/dist/chunk-JMRESWQT.js +130 -0
- package/dist/chunk-JSZN6LDZ.js +338 -0
- package/dist/chunk-KPAZG65P.js +138 -0
- package/dist/chunk-KV4LOKOU.js +154 -0
- package/dist/chunk-KXPBMCFL.js +39 -0
- package/dist/chunk-L2V5PUFN.js +15 -0
- package/dist/chunk-L3AQCDCY.js +386 -0
- package/dist/chunk-L5UOHS6E.js +45 -0
- package/dist/chunk-LCDVPAMR.js +24 -0
- package/dist/chunk-LE7ZOTHB.js +43 -0
- package/dist/chunk-LNSNA3W4.js +217 -0
- package/dist/chunk-LQJC5S2M.js +236 -0
- package/dist/chunk-LT5ITURG.js +1071 -0
- package/dist/chunk-LVESVYCE.js +270 -0
- package/dist/chunk-M4ZY2FVB.js +177 -0
- package/dist/chunk-MH2DSGC6.js +10 -0
- package/dist/chunk-MJP63SSS.js +14 -0
- package/dist/chunk-MVLMXC44.js +9 -0
- package/dist/chunk-MZFF5F7R.js +407 -0
- package/dist/chunk-N2UVOR3X.js +238 -0
- package/dist/chunk-NDF4A5JM.js +37 -0
- package/dist/chunk-NJCTQH2P.js +62 -0
- package/dist/chunk-NZOJHERI.js +32 -0
- package/dist/chunk-OO2GZ272.js +1241 -0
- package/dist/chunk-OPRBF7VE.js +41 -0
- package/dist/chunk-OSQHWIM5.js +523 -0
- package/dist/chunk-OSYCOC3K.js +21 -0
- package/dist/chunk-P5GB6NEO.js +66 -0
- package/dist/chunk-PKBMQBKP.js +5 -0
- package/dist/chunk-PO2TRJPY.js +40 -0
- package/dist/chunk-PSAG45YF.js +451 -0
- package/dist/chunk-PXKIGZ2F.js +31 -0
- package/dist/chunk-QLTDFUJ7.js +94 -0
- package/dist/chunk-QPEEKFCA.js +533 -0
- package/dist/chunk-QXMIKDOL.js +125 -0
- package/dist/chunk-R3TOKUDJ.js +191 -0
- package/dist/chunk-S22FSH7C.js +94 -0
- package/dist/chunk-SC4MZGWZ.js +63 -0
- package/dist/chunk-SOD2F6C2.js +281 -0
- package/dist/chunk-SS636UDN.js +35 -0
- package/dist/chunk-SSUQKA7L.js +746 -0
- package/dist/chunk-SWKE6FWH.js +47 -0
- package/dist/chunk-T22VK4NJ.js +49 -0
- package/dist/chunk-TT63HHIT.js +543 -0
- package/dist/chunk-TXBAOEKG.js +1084 -0
- package/dist/chunk-UINSEWQ3.js +127 -0
- package/dist/chunk-UPFU63L4.js +126 -0
- package/dist/chunk-UVPGW4R7.js +222 -0
- package/dist/chunk-VX5CMNMM.js +26 -0
- package/dist/chunk-WFHI6HXP.js +837 -0
- package/dist/chunk-WMVK77ND.js +53 -0
- package/dist/chunk-X6F6SO4S.js +135 -0
- package/dist/chunk-XTRZGXB2.js +34 -0
- package/dist/chunk-XZMVNORA.js +100 -0
- package/dist/chunk-Y3INC4QJ.js +133 -0
- package/dist/chunk-YC7ELZS3.js +51 -0
- package/dist/chunk-YGGDU6C3.js +93 -0
- package/dist/chunk-YVKRYQRG.js +70 -0
- package/dist/chunk-Z22QVHT4.js +57 -0
- package/dist/chunk-ZEGVKVD5.js +80 -0
- package/dist/chunk-ZTZQPYP6.js +55 -0
- package/dist/client/SiteKitCredential.d.ts +0 -1
- package/dist/client/index.d.ts +0 -1
- package/dist/client/index.js +13 -53
- package/dist/cms/CmsPage.d.ts +0 -1
- package/dist/cms/CmsPreview.d.ts +0 -1
- package/dist/cms/CmsSection.d.ts +0 -1
- package/dist/cms/PortableTextRenderer.d.ts +0 -1
- package/dist/cms/index.d.ts +1 -2
- package/dist/cms/index.js +5 -410
- package/dist/cms/sanity-image.d.ts +0 -1
- package/dist/cms/sections/CtaSection.d.ts +0 -1
- package/dist/cms/sections/CustomSection.d.ts +0 -1
- package/dist/cms/sections/FaqSection.d.ts +0 -1
- package/dist/cms/sections/FormSection.d.ts +0 -1
- package/dist/cms/sections/GallerySection.d.ts +0 -1
- package/dist/cms/sections/HeroSection.d.ts +0 -1
- package/dist/cms/sections/RichTextSection.d.ts +0 -1
- package/dist/cms/sections/TestimonialsSection.d.ts +0 -1
- package/dist/cms/sections/index.d.ts +0 -1
- package/dist/cms/server-api.d.ts +0 -1
- package/dist/cms/server.d.ts +0 -1
- package/dist/cms/server.js +5 -22
- package/dist/cms/types.d.ts +0 -1
- package/dist/commerce/CalendarView.d.ts +0 -1
- package/dist/commerce/CheckoutForm.d.ts +0 -1
- package/dist/commerce/EventCalendar.d.ts +0 -1
- package/dist/commerce/EventCheckout.d.ts +0 -1
- package/dist/commerce/EventEmbed.d.ts +0 -1
- package/dist/commerce/EventModal.d.ts +0 -1
- package/dist/commerce/EventTile.d.ts +0 -1
- package/dist/commerce/EventsAgenda.d.ts +0 -1
- package/dist/commerce/EventsWidget.d.ts +0 -1
- package/dist/commerce/OfferingCard.d.ts +0 -1
- package/dist/commerce/OfferingList.d.ts +0 -1
- package/dist/commerce/ProductDetail.d.ts +0 -1
- package/dist/commerce/ProductEmbed.d.ts +0 -1
- package/dist/commerce/ProductGrid.d.ts +0 -1
- package/dist/commerce/ProductPage.d.ts +0 -1
- package/dist/commerce/RegistrationForm.d.ts +0 -1
- package/dist/commerce/SizeChart.d.ts +0 -1
- package/dist/commerce/UpcomingEvents.d.ts +0 -1
- package/dist/commerce/api.d.ts +0 -1
- package/dist/commerce/events-extras.d.ts +0 -1
- package/dist/commerce/index.d.ts +0 -1
- package/dist/commerce/index.js +8021 -228
- package/dist/commerce/server.d.ts +0 -1
- package/dist/commerce/server.js +2 -251
- package/dist/commerce/types.d.ts +0 -1
- package/dist/commerce/useEventModal.d.ts +0 -1
- package/dist/commerce/utils.d.ts +0 -1
- package/dist/config/index.d.ts +0 -1
- package/dist/config/index.js +7 -11
- package/dist/contracts/color.d.ts +38 -0
- package/dist/contracts/entries.d.ts +8 -0
- package/dist/contracts/fleet.d.ts +96 -0
- package/dist/contracts/forms.d.ts +89 -0
- package/dist/contracts/llms.d.ts +54 -0
- package/dist/contracts/portfolio.d.ts +158 -0
- package/dist/contracts/seo-meta.d.ts +56 -0
- package/dist/contracts/seo-pages.d.ts +124 -0
- package/dist/contracts/sites-normalize.d.ts +35 -0
- package/dist/contracts/sites.d.ts +48 -0
- package/dist/contracts/slots.d.ts +81 -0
- package/dist/contracts/website.d.ts +148 -0
- package/dist/cta-bar/CtaBar.d.ts +0 -1
- package/dist/cta-bar/CtaBarBehavior.d.ts +0 -1
- package/dist/cta-bar/client.d.ts +0 -1
- package/dist/cta-bar/client.js +3 -22
- package/dist/cta-bar/index.d.ts +0 -1
- package/dist/cta-bar/index.js +5 -227
- package/dist/cta-bar/styles.d.ts +0 -1
- package/dist/discover-3YYOHOQP.js +2 -0
- package/dist/engage/ChatWidget.d.ts +0 -1
- package/dist/engage/DesignRenderer.d.ts +0 -1
- package/dist/engage/EchoUiActions.d.ts +0 -1
- package/dist/engage/EngageWidget.d.ts +2 -1
- package/dist/engage/brand-color.d.ts +0 -1
- package/dist/engage/chat-messages.d.ts +0 -1
- package/dist/engage/echo-config.d.ts +0 -1
- package/dist/engage/element-rules.d.ts +0 -1
- package/dist/engage/index.d.ts +0 -1
- package/dist/engage/index.js +20 -37
- package/dist/engage/launcher-placement.d.ts +0 -1
- package/dist/engage/socket-loader.d.ts +0 -1
- package/dist/engage/types.d.ts +18 -1
- package/dist/fleet/FleetHeartbeat.d.ts +0 -1
- package/dist/fleet/contract.d.ts +1 -98
- package/dist/fleet/contract.js +2 -53
- package/dist/fleet/heartbeat.d.ts +0 -1
- package/dist/fleet/index.d.ts +0 -1
- package/dist/fleet/index.js +9 -76
- package/dist/forms/DatePicker.d.ts +0 -1
- package/dist/forms/FileField.d.ts +0 -1
- package/dist/forms/FormCelebration.d.ts +0 -1
- package/dist/forms/FormClient.d.ts +0 -1
- package/dist/forms/FormEnhancer.d.ts +0 -1
- package/dist/forms/FormField.d.ts +0 -1
- package/dist/forms/FormSpotlight.d.ts +0 -1
- package/dist/forms/FormStage.d.ts +0 -1
- package/dist/forms/HoneypotField.d.ts +0 -1
- package/dist/forms/ManagedForm.d.ts +0 -1
- package/dist/forms/ServerForm.d.ts +0 -1
- package/dist/forms/StaticForm.d.ts +0 -1
- package/dist/forms/contract.d.ts +1 -91
- package/dist/forms/contract.js +2 -37
- package/dist/forms/defaultSuccessMessage.d.ts +0 -1
- package/dist/forms/delight.d.ts +0 -1
- package/dist/forms/experience-chrome.d.ts +0 -1
- package/dist/forms/experience-plan.d.ts +0 -1
- package/dist/forms/field-controls.d.ts +0 -1
- package/dist/forms/field-interactions.d.ts +0 -1
- package/dist/forms/field-rules.d.ts +0 -1
- package/dist/forms/form-loaded-at.d.ts +12 -0
- package/dist/forms/form-values.d.ts +0 -1
- package/dist/forms/formsApi.d.ts +0 -1
- package/dist/forms/ga4-identity.d.ts +0 -1
- package/dist/forms/index.d.ts +0 -1
- package/dist/forms/index.js +20 -64
- package/dist/forms/normalize-config.d.ts +0 -1
- package/dist/forms/recaptcha-warmup.d.ts +0 -1
- package/dist/forms/recaptcha.d.ts +0 -1
- package/dist/forms/server.d.ts +0 -1
- package/dist/forms/server.js +11 -67
- package/dist/forms/static.d.ts +0 -1
- package/dist/forms/static.js +6 -17
- package/dist/forms/submitForm.d.ts +0 -1
- package/dist/forms/tracking-session.d.ts +0 -1
- package/dist/forms/types.d.ts +0 -1
- package/dist/forms/useForm.d.ts +0 -1
- package/dist/forms/useFormTracking.d.ts +0 -1
- package/dist/images/ManagedFavicon.d.ts +0 -1
- package/dist/images/ManagedImage.d.ts +0 -1
- package/dist/images/api.d.ts +0 -1
- package/dist/images/index.d.ts +0 -1
- package/dist/images/index.js +6 -49
- package/dist/images/server.d.ts +0 -1
- package/dist/images/server.js +3 -21
- package/dist/index.d.ts +13 -56
- package/dist/index.js +2 -427
- package/dist/landing/LandingPage.d.ts +0 -1
- package/dist/landing/contract.d.ts +0 -1
- package/dist/landing/index.d.ts +0 -1
- package/dist/landing/index.js +3 -22
- package/dist/landing/metadata.d.ts +0 -1
- package/dist/landing/server.d.ts +0 -1
- package/dist/landing/server.js +3 -17
- package/dist/layout/SiteKitClientProviders.d.ts +12 -3
- package/dist/layout/SiteKitLayout.d.ts +19 -4
- package/dist/layout/SpeculationRules.d.ts +0 -1
- package/dist/layout/client.d.ts +12 -3
- package/dist/layout/client.js +16 -27
- package/dist/layout/index.d.ts +0 -1
- package/dist/layout/index.js +43 -41
- package/dist/layout/types.d.ts +13 -1
- package/dist/llms/AEOComponents.d.ts +0 -1
- package/dist/llms/SpeakableSchema.d.ts +0 -1
- package/dist/llms/agent-access.d.ts +43 -0
- package/dist/llms/aiRobots.d.ts +0 -10
- package/dist/llms/api.d.ts +0 -1
- package/dist/llms/client.d.ts +0 -1
- package/dist/llms/client.js +4 -66
- package/dist/llms/contract.d.ts +1 -42
- package/dist/llms/contract.js +2 -41
- package/dist/llms/discovery-headers.d.ts +6 -1
- package/dist/llms/generateLLMsTxt.d.ts +0 -1
- package/dist/llms/handlers.d.ts +0 -1
- package/dist/llms/humanize-industry.d.ts +0 -1
- package/dist/llms/index.d.ts +3 -2
- package/dist/llms/index.js +17 -448
- package/dist/llms/links.d.ts +0 -1
- package/dist/llms/revalidate.d.ts +0 -1
- package/dist/llms/seo-revalidate.d.ts +0 -1
- package/dist/llms/sourcedFacts.d.ts +0 -1
- package/dist/llms/types.d.ts +6 -1
- package/dist/llms/writeLLMsTxt.d.ts +10 -1
- package/dist/manifest/index.d.ts +0 -1
- package/dist/manifest/index.js +4 -8
- package/dist/maps/GoogleMap.d.ts +0 -1
- package/dist/maps/NeighborhoodMap.d.ts +0 -1
- package/dist/maps/api.d.ts +0 -1
- package/dist/maps/index.d.ts +0 -1
- package/dist/maps/index.js +85 -92
- package/dist/maps/types.d.ts +0 -1
- package/dist/mcp/WebMcpTools.d.ts +0 -1
- package/dist/mcp/client.d.ts +0 -1
- package/dist/mcp/client.js +9 -12
- package/dist/mcp/declarative.d.ts +0 -1
- package/dist/mcp/handlers.d.ts +15 -2
- package/dist/mcp/index.d.ts +2 -3
- package/dist/mcp/index.js +50 -298
- package/dist/mcp/protocol.d.ts +0 -1
- package/dist/mcp/report.d.ts +27 -0
- package/dist/mcp/serverCard.d.ts +0 -1
- package/dist/mcp/sonor.d.ts +99 -0
- package/dist/mcp/sonor.js +482 -0
- package/dist/mcp/transport.d.ts +0 -1
- package/dist/mcp/transport.js +8 -24
- package/dist/mcp/types.d.ts +21 -1
- package/dist/motion/CountUp.d.ts +0 -1
- package/dist/motion/Parallax.d.ts +0 -1
- package/dist/motion/Reveal.d.ts +0 -1
- package/dist/motion/ScrollScene.d.ts +0 -1
- package/dist/motion/engine.d.ts +0 -1
- package/dist/motion/failsafe.d.ts +0 -1
- package/dist/motion/gsap.d.ts +0 -1
- package/dist/motion/gsap.js +17 -29
- package/dist/motion/index.d.ts +0 -1
- package/dist/motion/index.js +25 -51
- package/dist/motion/three.d.ts +0 -1
- package/dist/motion/three.js +16 -23
- package/dist/og/config.d.ts +0 -1
- package/dist/og/contrast.d.ts +0 -1
- package/dist/og/index.d.ts +0 -1
- package/dist/og/index.js +4 -43
- package/dist/og/pages.d.ts +0 -1
- package/dist/og/route-fit.d.ts +0 -1
- package/dist/og/route.d.ts +0 -1
- package/dist/og/route.js +3 -245
- package/dist/og/template.d.ts +0 -1
- package/dist/portfolio/contract.d.ts +1 -153
- package/dist/portfolio/contract.js +2 -136
- package/dist/proxy/index.d.ts +16 -14
- package/dist/proxy/index.js +20 -36
- package/dist/proxy/securityHeaders.d.ts +0 -1
- package/dist/proxy/segment.d.ts +0 -1
- package/dist/redirects/index.d.ts +0 -8
- package/dist/redirects/index.js +6 -41
- package/dist/reputation/TestimonialSection.d.ts +0 -1
- package/dist/reputation/api.d.ts +0 -1
- package/dist/reputation/index.d.ts +0 -1
- package/dist/reputation/index.js +4 -22
- package/dist/reputation/server.d.ts +0 -1
- package/dist/reputation/server.js +3 -17
- package/dist/reputation/types.d.ts +0 -1
- package/dist/robots/index.d.ts +1 -2
- package/dist/robots/index.js +4 -78
- package/dist/robots/indexnow.d.ts +0 -1
- package/dist/robots/indexnow.js +4 -39
- package/dist/robots/next-internals.d.ts +0 -1
- package/dist/seo/ManagedContent.d.ts +0 -1
- package/dist/seo/ManagedFAQ.d.ts +0 -1
- package/dist/seo/ManagedInternalLinks.d.ts +0 -1
- package/dist/seo/ManagedSchema.d.ts +0 -1
- package/dist/seo/ManagedScripts.d.ts +0 -1
- package/dist/seo/api.d.ts +0 -1
- package/dist/seo/client.d.ts +0 -1
- package/dist/seo/client.js +8 -19
- package/dist/seo/entry-indexnow.d.ts +2 -0
- package/dist/seo/entry-llms-client.d.ts +2 -0
- package/dist/seo/entry-llms-contract.d.ts +2 -0
- package/dist/seo/entry-llms.d.ts +2 -0
- package/dist/seo/entry-meta-contract.d.ts +2 -0
- package/dist/seo/entry-og-route.d.ts +2 -0
- package/dist/seo/entry-og.d.ts +2 -0
- package/dist/seo/entry-pages-contract.d.ts +2 -0
- package/dist/seo/entry-redirects.d.ts +2 -0
- package/dist/seo/entry-robots.d.ts +2 -0
- package/dist/seo/entry-sitemap.d.ts +2 -0
- package/dist/seo/getManagedMetadata.d.ts +0 -1
- package/dist/seo/groundingSchema.d.ts +0 -1
- package/dist/seo/index.d.ts +0 -2
- package/dist/seo/index.js +88 -318
- package/dist/seo/indexnow.d.ts +2 -0
- package/dist/seo/indexnow.js +4 -0
- package/dist/seo/llms/client.d.ts +2 -0
- package/dist/seo/llms/client.js +4 -0
- package/dist/seo/llms/contract.d.ts +2 -0
- package/dist/seo/llms/contract.js +2 -0
- package/dist/seo/llms.d.ts +2 -0
- package/dist/seo/llms.js +17 -0
- package/dist/seo/load-env.d.ts +12 -0
- package/dist/seo/meta/contract.d.ts +2 -0
- package/dist/seo/meta/contract.js +2 -0
- package/dist/seo/og/route.d.ts +2 -0
- package/dist/seo/og/route.js +3 -0
- package/dist/seo/og.d.ts +2 -0
- package/dist/seo/og.js +4 -0
- package/dist/seo/pages/contract.d.ts +2 -0
- package/dist/seo/pages/contract.js +4 -0
- package/dist/seo/redirects.d.ts +2 -0
- package/dist/seo/redirects.js +6 -0
- package/dist/seo/register-sitemap-cli-impl.d.ts +6 -1
- package/dist/seo/register-sitemap-cli.d.ts +1 -1
- package/dist/seo/register-sitemap-cli.js +73 -66
- package/dist/seo/register-sitemap-request.d.ts +0 -1
- package/dist/seo/robots.d.ts +2 -0
- package/dist/seo/robots.js +4 -0
- package/dist/seo/routing.d.ts +0 -1
- package/dist/seo/safeJsonLd.d.ts +0 -1
- package/dist/seo/schema-filter.d.ts +0 -1
- package/dist/seo/server-api.d.ts +0 -1
- package/dist/seo/server.d.ts +0 -1
- package/dist/seo/server.js +10 -80
- package/dist/seo/sitemap.d.ts +2 -0
- package/dist/seo/sitemap.js +15 -0
- package/dist/seo/types.d.ts +0 -1
- package/dist/seo/withManagedMetadata.d.ts +0 -1
- package/dist/seo-meta/contract.d.ts +1 -60
- package/dist/seo-meta/contract.js +2 -41
- package/dist/seo-pages/contract.d.ts +1 -61
- package/dist/seo-pages/contract.js +4 -49
- package/dist/server/index.d.ts +0 -1
- package/dist/server/index.js +6 -32
- package/dist/server/mint-site-token.d.ts +0 -1
- package/dist/server/server-fetch.d.ts +0 -1
- package/dist/server-api-GJJQZVG7.js +8 -0
- package/dist/shared/build-entries.d.ts +53 -14
- package/dist/shared/clock.d.ts +20 -0
- package/dist/shared/color.d.ts +1 -39
- package/dist/shared/defer.d.ts +0 -1
- package/dist/shared/fetchWithRetry.d.ts +0 -1
- package/dist/shared/frame.d.ts +1 -9
- package/dist/shared/fresh-fetch.d.ts +0 -1
- package/dist/shared/glass.d.ts +0 -1
- package/dist/shared/identity.d.ts +0 -1
- package/dist/shared/markdown.d.ts +40 -0
- package/dist/shared/next-files.d.ts +0 -1
- package/dist/shared/page-leave.d.ts +0 -1
- package/dist/shared/publishCredential.d.ts +0 -1
- package/dist/shared/reporting-gate.d.ts +0 -1
- package/dist/shared/request-guards.d.ts +0 -1
- package/dist/shared/siteToken.d.ts +0 -1
- package/dist/shared/sonorFetch.d.ts +0 -1
- package/dist/shared/source-graph.d.ts +0 -1
- package/dist/shared/uuid.d.ts +0 -1
- package/dist/shared/version.d.ts +1 -2
- package/dist/shared/visual-viewport-gap.d.ts +0 -1
- package/dist/signal/SignalBridge.d.ts +0 -1
- package/dist/signal/SignalCore.d.ts +0 -1
- package/dist/signal/SignalExperiment.d.ts +0 -1
- package/dist/signal/index.d.ts +0 -1
- package/dist/signal/index.js +72 -44
- package/dist/signal/store.d.ts +0 -1
- package/dist/signal/types.d.ts +0 -1
- package/dist/site-config/index.d.ts +0 -1
- package/dist/site-config/index.js +2 -17
- package/dist/sitemap/discover.d.ts +0 -1
- package/dist/sitemap/index.d.ts +6 -1
- package/dist/sitemap/index.js +15 -553
- package/dist/sitemap/shared.d.ts +0 -1
- package/dist/sites/contract.d.ts +1 -51
- package/dist/sites/contract.js +3 -38
- package/dist/sites/normalize.d.ts +1 -36
- package/dist/sites/resolve.d.ts +0 -1
- package/dist/sites/site-param.d.ts +0 -1
- package/dist/slots/ManagedSlot.d.ts +0 -1
- package/dist/slots/contract.d.ts +1 -82
- package/dist/slots/contract.js +2 -41
- package/dist/slots/index.d.ts +0 -1
- package/dist/slots/index.js +5 -182
- package/dist/slots/revalidate.d.ts +0 -1
- package/dist/slots/server-api.d.ts +0 -1
- package/dist/socket-loader-R24ZSRSQ.js +12 -0
- package/dist/sync/AddToCalendar.d.ts +0 -1
- package/dist/sync/BookingWidget.d.ts +0 -1
- package/dist/sync/MeetingFormatStep.d.ts +0 -1
- package/dist/sync/api.d.ts +0 -1
- package/dist/sync/booking-flow.d.ts +0 -1
- package/dist/sync/index.d.ts +0 -1
- package/dist/sync/index.js +6 -64
- package/dist/sync/types.d.ts +0 -1
- package/dist/types.d.ts +0 -63
- package/dist/web-vitals.attribution-N2PCCF4Q.js +522 -0
- package/dist/website/BlocksPopup.d.ts +25 -0
- package/dist/website/PopupBlocks.d.ts +57 -0
- package/dist/website/SiteDesignReporter.d.ts +28 -0
- package/dist/website/cms/server.d.ts +2 -0
- package/dist/website/cms/server.js +5 -0
- package/dist/website/cms-server.d.ts +2 -0
- package/dist/website/cms.d.ts +2 -0
- package/dist/website/cms.js +5 -0
- package/dist/website/contract.d.ts +1 -0
- package/dist/website/contract.js +3 -0
- package/dist/website/cta-bar.d.ts +2 -0
- package/dist/website/cta-bar.js +5 -0
- package/dist/website/design.d.ts +165 -0
- package/dist/website/images/server.d.ts +2 -0
- package/dist/website/images/server.js +3 -0
- package/dist/website/images-server.d.ts +2 -0
- package/dist/website/images.d.ts +2 -0
- package/dist/website/images.js +6 -0
- package/dist/website/index.d.ts +17 -0
- package/dist/website/index.js +13 -0
- package/dist/website/landing/server.d.ts +2 -0
- package/dist/website/landing/server.js +3 -0
- package/dist/website/landing-server.d.ts +2 -0
- package/dist/website/landing.d.ts +2 -0
- package/dist/website/landing.js +3 -0
- package/dist/website/popups.d.ts +17 -0
- package/dist/website/popups.js +22 -0
- package/dist/website/slots/contract.d.ts +2 -0
- package/dist/website/slots/contract.js +2 -0
- package/dist/website/slots-contract.d.ts +2 -0
- package/dist/website/slots.d.ts +3 -0
- package/dist/website/slots.js +5 -0
- package/dist/writeLLMsTxt-UMHKGNRR.js +11 -0
- package/package.json +191 -161
- package/skills/site-kit/SKILL.md +9 -3
- package/dist/AnalyticsProvider-44PDLORZ.js +0 -34
- package/dist/AnalyticsProvider-44PDLORZ.js.map +0 -1
- package/dist/AnalyticsProvider-F6KHEAOX.mjs +0 -13
- package/dist/AnalyticsProvider-F6KHEAOX.mjs.map +0 -1
- package/dist/ArticleFaqSection-3KZ24MFS.js +0 -13
- package/dist/ArticleFaqSection-3KZ24MFS.js.map +0 -1
- package/dist/ArticleFaqSection-XZPXJVH4.mjs +0 -11
- package/dist/ArticleFaqSection-XZPXJVH4.mjs.map +0 -1
- package/dist/ArticleViewTracker-MGNVIHZ4.js +0 -54
- package/dist/ArticleViewTracker-MGNVIHZ4.js.map +0 -1
- package/dist/ArticleViewTracker-NI4UNSY7.mjs +0 -51
- package/dist/ArticleViewTracker-NI4UNSY7.mjs.map +0 -1
- package/dist/ChatWidget-XSALHDDW.mjs +0 -17
- package/dist/ChatWidget-XSALHDDW.mjs.map +0 -1
- package/dist/ChatWidget-YBXJRR2Z.js +0 -34
- package/dist/ChatWidget-YBXJRR2Z.js.map +0 -1
- package/dist/DatePicker-4WNKNNCV.mjs +0 -4
- package/dist/DatePicker-4WNKNNCV.mjs.map +0 -1
- package/dist/DatePicker-VPZR7RU3.js +0 -13
- package/dist/DatePicker-VPZR7RU3.js.map +0 -1
- package/dist/EngageWidget-DUEXPVOY.mjs +0 -13
- package/dist/EngageWidget-DUEXPVOY.mjs.map +0 -1
- package/dist/EngageWidget-MDCRS3BN.js +0 -22
- package/dist/EngageWidget-MDCRS3BN.js.map +0 -1
- package/dist/FileField-AXU6KBSV.js +0 -91
- package/dist/FileField-AXU6KBSV.js.map +0 -1
- package/dist/FileField-UTLGR5ZN.mjs +0 -85
- package/dist/FileField-UTLGR5ZN.mjs.map +0 -1
- package/dist/FormCelebration-7CBANVNS.mjs +0 -4
- package/dist/FormCelebration-7CBANVNS.mjs.map +0 -1
- package/dist/FormCelebration-O2O5S6JI.js +0 -13
- package/dist/FormCelebration-O2O5S6JI.js.map +0 -1
- package/dist/FormSpotlight-NWLCZMOT.mjs +0 -756
- package/dist/FormSpotlight-NWLCZMOT.mjs.map +0 -1
- package/dist/FormSpotlight-RR5KJDIH.js +0 -761
- package/dist/FormSpotlight-RR5KJDIH.js.map +0 -1
- package/dist/FormStage-GFNX4GLU.js +0 -422
- package/dist/FormStage-GFNX4GLU.js.map +0 -1
- package/dist/FormStage-V4XKLI6J.mjs +0 -420
- package/dist/FormStage-V4XKLI6J.mjs.map +0 -1
- package/dist/ManagedForm-4AD3LWSC.js +0 -25
- package/dist/ManagedForm-4AD3LWSC.js.map +0 -1
- package/dist/ManagedForm-4IWPG6AZ.mjs +0 -16
- package/dist/ManagedForm-4IWPG6AZ.mjs.map +0 -1
- package/dist/ManagedNewsletterForm-ARSY2VHC.mjs +0 -64
- package/dist/ManagedNewsletterForm-ARSY2VHC.mjs.map +0 -1
- package/dist/ManagedNewsletterForm-HJZNUABY.js +0 -66
- package/dist/ManagedNewsletterForm-HJZNUABY.js.map +0 -1
- package/dist/SignalCore-N2LKG4XN.mjs +0 -324
- package/dist/SignalCore-N2LKG4XN.mjs.map +0 -1
- package/dist/SignalCore-P2JUY2BO.js +0 -326
- package/dist/SignalCore-P2JUY2BO.js.map +0 -1
- package/dist/SitemapSync-KFY4PJ7G.js +0 -19
- package/dist/SitemapSync-KFY4PJ7G.js.map +0 -1
- package/dist/SitemapSync-UYDL7T4M.mjs +0 -10
- package/dist/SitemapSync-UYDL7T4M.mjs.map +0 -1
- package/dist/SitemapSync.d.ts.map +0 -1
- package/dist/admin-auth/index.d.ts.map +0 -1
- package/dist/admin-auth/index.js.map +0 -1
- package/dist/admin-auth/index.mjs +0 -0
- package/dist/admin-auth/index.mjs.map +0 -1
- package/dist/admin-auth/session.d.ts.map +0 -1
- package/dist/affiliates/AffiliatesWidget.d.ts.map +0 -1
- package/dist/affiliates/api.d.ts.map +0 -1
- package/dist/affiliates/index.d.ts.map +0 -1
- package/dist/affiliates/types.d.ts.map +0 -1
- package/dist/affiliates/useAffiliates.d.ts.map +0 -1
- package/dist/analytics/AnalyticsProvider.d.ts.map +0 -1
- package/dist/analytics/WebVitals.d.ts.map +0 -1
- package/dist/analytics/dispatch.d.ts.map +0 -1
- package/dist/analytics/index.d.ts.map +0 -1
- package/dist/analytics/index.js.map +0 -1
- package/dist/analytics/index.mjs +0 -15
- package/dist/analytics/index.mjs.map +0 -1
- package/dist/analytics/measurement-context.d.ts.map +0 -1
- package/dist/analytics/page-observation.d.ts.map +0 -1
- package/dist/analytics/send-gate.d.ts.map +0 -1
- package/dist/analytics/types.d.ts.map +0 -1
- package/dist/analytics/useContactTracking.d.ts.map +0 -1
- package/dist/api-D745LGGU.mjs +0 -183
- package/dist/api-XR5APCH3.js +0 -201
- package/dist/article-styles-DACUAOVT.mjs +0 -592
- package/dist/article-styles-DACUAOVT.mjs.map +0 -1
- package/dist/article-styles-JHHTNHOK.js +0 -595
- package/dist/article-styles-JHHTNHOK.js.map +0 -1
- package/dist/article-tables-EWXG4LNP.js +0 -17
- package/dist/article-tables-EWXG4LNP.js.map +0 -1
- package/dist/article-tables-OGE52LNT.mjs +0 -4
- package/dist/article-tables-OGE52LNT.mjs.map +0 -1
- package/dist/articles/Article.d.ts.map +0 -1
- package/dist/articles/ArticleFAQ.d.ts.map +0 -1
- package/dist/articles/ArticleFaqSection.d.ts.map +0 -1
- package/dist/articles/ArticleList.d.ts.map +0 -1
- package/dist/articles/ArticleViewTracker.d.ts.map +0 -1
- package/dist/articles/AuthorCard.d.ts.map +0 -1
- package/dist/articles/AuthorPage.d.ts.map +0 -1
- package/dist/articles/ClusterLandingPage.d.ts.map +0 -1
- package/dist/articles/ClusterNavigation.d.ts.map +0 -1
- package/dist/articles/ManagedNewsletterForm.d.ts.map +0 -1
- package/dist/articles/NewsletterShell.d.ts.map +0 -1
- package/dist/articles/NewsletterWidget.d.ts.map +0 -1
- package/dist/articles/PublicationLayout.d.ts.map +0 -1
- package/dist/articles/PublicationSidebar.d.ts.map +0 -1
- package/dist/articles/RelatedPosts.d.ts.map +0 -1
- package/dist/articles/ServiceCallout.d.ts.map +0 -1
- package/dist/articles/TableOfContents.d.ts.map +0 -1
- package/dist/articles/article-styles.d.ts.map +0 -1
- package/dist/articles/article-tables.d.ts.map +0 -1
- package/dist/articles/artwork.d.ts.map +0 -1
- package/dist/articles/author-schema.d.ts.map +0 -1
- package/dist/articles/author-social.d.ts.map +0 -1
- package/dist/articles/excerpt.d.ts.map +0 -1
- package/dist/articles/index.d.ts.map +0 -1
- package/dist/articles/index.js.map +0 -1
- package/dist/articles/index.mjs +0 -457
- package/dist/articles/index.mjs.map +0 -1
- package/dist/articles/news-sitemap.d.ts.map +0 -1
- package/dist/articles/processArticleHtml.d.ts.map +0 -1
- package/dist/articles/public-reads.d.ts.map +0 -1
- package/dist/articles/reading-time.d.ts.map +0 -1
- package/dist/articles/routes.d.ts.map +0 -1
- package/dist/articles/server-core.d.ts.map +0 -1
- package/dist/articles/server-ui.d.ts.map +0 -1
- package/dist/articles/server-ui.js.map +0 -1
- package/dist/articles/server-ui.mjs +0 -1098
- package/dist/articles/server-ui.mjs.map +0 -1
- package/dist/articles/server.d.ts.map +0 -1
- package/dist/articles/server.js.map +0 -1
- package/dist/articles/server.mjs +0 -11
- package/dist/articles/server.mjs.map +0 -1
- package/dist/articles/types.d.ts.map +0 -1
- package/dist/articles/widget-styles.d.ts.map +0 -1
- package/dist/brand/extract-brand-profile.d.ts.map +0 -1
- package/dist/chunk-2FEQ6TYD.mjs +0 -37
- package/dist/chunk-2FEQ6TYD.mjs.map +0 -1
- package/dist/chunk-34XL7TVH.js +0 -130
- package/dist/chunk-34XL7TVH.js.map +0 -1
- package/dist/chunk-3AOKYAZ2.js +0 -135
- package/dist/chunk-3AOKYAZ2.js.map +0 -1
- package/dist/chunk-3BLKKF67.mjs +0 -131
- package/dist/chunk-3BLKKF67.mjs.map +0 -1
- package/dist/chunk-3DWIYCQX.js +0 -30
- package/dist/chunk-3DWIYCQX.js.map +0 -1
- package/dist/chunk-3EAS4PAT.js +0 -141
- package/dist/chunk-3EAS4PAT.js.map +0 -1
- package/dist/chunk-3SDMJMN2.js +0 -71
- package/dist/chunk-3SDMJMN2.js.map +0 -1
- package/dist/chunk-3T2CVHFO.mjs +0 -453
- package/dist/chunk-3T2CVHFO.mjs.map +0 -1
- package/dist/chunk-42LLFAJQ.mjs +0 -932
- package/dist/chunk-42LLFAJQ.mjs.map +0 -1
- package/dist/chunk-4BEGKFMN.js +0 -133
- package/dist/chunk-4BEGKFMN.js.map +0 -1
- package/dist/chunk-4KAMU5HD.mjs +0 -16
- package/dist/chunk-4KAMU5HD.mjs.map +0 -1
- package/dist/chunk-4U5NCKQY.mjs +0 -39
- package/dist/chunk-4U5NCKQY.mjs.map +0 -1
- package/dist/chunk-4WCA2HM6.mjs +0 -57
- package/dist/chunk-4WCA2HM6.mjs.map +0 -1
- package/dist/chunk-54CARHDR.mjs +0 -95
- package/dist/chunk-54CARHDR.mjs.map +0 -1
- package/dist/chunk-55J2KE7D.js +0 -60
- package/dist/chunk-55J2KE7D.js.map +0 -1
- package/dist/chunk-5F2FIM5A.mjs +0 -135
- package/dist/chunk-5F2FIM5A.mjs.map +0 -1
- package/dist/chunk-5SANRSX3.mjs +0 -17
- package/dist/chunk-5SANRSX3.mjs.map +0 -1
- package/dist/chunk-5XFFUP6D.js +0 -100
- package/dist/chunk-5XFFUP6D.js.map +0 -1
- package/dist/chunk-5YA6SI4Z.mjs +0 -14279
- package/dist/chunk-5YVQWLSQ.mjs +0 -47
- package/dist/chunk-5YVQWLSQ.mjs.map +0 -1
- package/dist/chunk-5ZMTEK7U.js +0 -1430
- package/dist/chunk-5ZMTEK7U.js.map +0 -1
- package/dist/chunk-64BOVMXG.mjs +0 -68
- package/dist/chunk-64BOVMXG.mjs.map +0 -1
- package/dist/chunk-662YHKWW.mjs +0 -10
- package/dist/chunk-662YHKWW.mjs.map +0 -1
- package/dist/chunk-6C47333H.mjs +0 -55
- package/dist/chunk-6C47333H.mjs.map +0 -1
- package/dist/chunk-6EDVCUAG.mjs +0 -29
- package/dist/chunk-6EDVCUAG.mjs.map +0 -1
- package/dist/chunk-6FNFM7JL.js +0 -113
- package/dist/chunk-6FNFM7JL.js.map +0 -1
- package/dist/chunk-6OQYRVMI.js +0 -937
- package/dist/chunk-6OQYRVMI.js.map +0 -1
- package/dist/chunk-6PJTLBRR.mjs +0 -11
- package/dist/chunk-6PJTLBRR.mjs.map +0 -1
- package/dist/chunk-6XNEGG5B.mjs +0 -137
- package/dist/chunk-6XNEGG5B.mjs.map +0 -1
- package/dist/chunk-7F66Y4MA.mjs +0 -1073
- package/dist/chunk-7F66Y4MA.mjs.map +0 -1
- package/dist/chunk-7RLL67F3.js +0 -47
- package/dist/chunk-7RLL67F3.js.map +0 -1
- package/dist/chunk-7THQ4UW3.js +0 -69
- package/dist/chunk-7THQ4UW3.js.map +0 -1
- package/dist/chunk-A2HL22BO.mjs +0 -165
- package/dist/chunk-A2HL22BO.mjs.map +0 -1
- package/dist/chunk-AAZNH3MA.mjs +0 -23
- package/dist/chunk-AAZNH3MA.mjs.map +0 -1
- package/dist/chunk-AEN7EL6N.js +0 -161
- package/dist/chunk-AEN7EL6N.js.map +0 -1
- package/dist/chunk-AGIMH67E.mjs +0 -26
- package/dist/chunk-AGIMH67E.mjs.map +0 -1
- package/dist/chunk-AL4Z6VYF.js +0 -83
- package/dist/chunk-AL4Z6VYF.js.map +0 -1
- package/dist/chunk-AS2HUIDW.mjs +0 -16
- package/dist/chunk-AS2HUIDW.mjs.map +0 -1
- package/dist/chunk-B22WSN4L.mjs +0 -59
- package/dist/chunk-B22WSN4L.mjs.map +0 -1
- package/dist/chunk-B6QPCAEG.mjs +0 -128
- package/dist/chunk-B6QPCAEG.mjs.map +0 -1
- package/dist/chunk-BBBJHYPH.js +0 -19
- package/dist/chunk-BBBJHYPH.js.map +0 -1
- package/dist/chunk-BEXTDHO4.mjs +0 -57
- package/dist/chunk-BEXTDHO4.mjs.map +0 -1
- package/dist/chunk-BHZHWXER.js +0 -791
- package/dist/chunk-BHZHWXER.js.map +0 -1
- package/dist/chunk-BNKBRLJK.mjs +0 -75
- package/dist/chunk-BNKBRLJK.mjs.map +0 -1
- package/dist/chunk-BQP6JIE2.mjs +0 -28
- package/dist/chunk-BQP6JIE2.mjs.map +0 -1
- package/dist/chunk-BZR6RUIN.mjs +0 -128
- package/dist/chunk-BZR6RUIN.mjs.map +0 -1
- package/dist/chunk-C2CTLLIO.mjs +0 -72
- package/dist/chunk-C2CTLLIO.mjs.map +0 -1
- package/dist/chunk-C5VITBN7.mjs +0 -220
- package/dist/chunk-C5VITBN7.mjs.map +0 -1
- package/dist/chunk-CABEVWKJ.mjs +0 -25
- package/dist/chunk-CABEVWKJ.mjs.map +0 -1
- package/dist/chunk-CDRQYJUT.js +0 -355
- package/dist/chunk-CDRQYJUT.js.map +0 -1
- package/dist/chunk-CFRJ2MK5.mjs +0 -16
- package/dist/chunk-CFRJ2MK5.mjs.map +0 -1
- package/dist/chunk-CIM5W3UO.js +0 -26
- package/dist/chunk-CIM5W3UO.js.map +0 -1
- package/dist/chunk-CLO3K7PF.js +0 -19
- package/dist/chunk-CLO3K7PF.js.map +0 -1
- package/dist/chunk-CM4AVKXR.js +0 -533
- package/dist/chunk-CM4AVKXR.js.map +0 -1
- package/dist/chunk-CU6OGBKK.mjs +0 -68
- package/dist/chunk-CU6OGBKK.mjs.map +0 -1
- package/dist/chunk-CUNZAD46.js +0 -53
- package/dist/chunk-CUNZAD46.js.map +0 -1
- package/dist/chunk-CXAXZFFW.js +0 -157
- package/dist/chunk-CXAXZFFW.js.map +0 -1
- package/dist/chunk-D3WJMSTB.mjs +0 -132
- package/dist/chunk-D3WJMSTB.mjs.map +0 -1
- package/dist/chunk-DA7IANFG.mjs +0 -37
- package/dist/chunk-DA7IANFG.mjs.map +0 -1
- package/dist/chunk-DV2LJYFD.js +0 -14
- package/dist/chunk-DV2LJYFD.js.map +0 -1
- package/dist/chunk-DV5KVNA7.js +0 -45
- package/dist/chunk-DV5KVNA7.js.map +0 -1
- package/dist/chunk-DVYYGHSG.js +0 -285
- package/dist/chunk-DVYYGHSG.js.map +0 -1
- package/dist/chunk-DWZGW77V.mjs +0 -1669
- package/dist/chunk-DWZGW77V.mjs.map +0 -1
- package/dist/chunk-EDLNMGQC.mjs +0 -65
- package/dist/chunk-EDLNMGQC.mjs.map +0 -1
- package/dist/chunk-EHJANA5C.js +0 -231
- package/dist/chunk-EHJANA5C.js.map +0 -1
- package/dist/chunk-EMHSHAVW.js +0 -19
- package/dist/chunk-EMHSHAVW.js.map +0 -1
- package/dist/chunk-ESP5RMB7.js +0 -42
- package/dist/chunk-ESP5RMB7.js.map +0 -1
- package/dist/chunk-FCAHV5P3.mjs +0 -45
- package/dist/chunk-FCAHV5P3.mjs.map +0 -1
- package/dist/chunk-FPVYKSXE.mjs +0 -154
- package/dist/chunk-FPVYKSXE.mjs.map +0 -1
- package/dist/chunk-G2KGHIAP.js +0 -176
- package/dist/chunk-G2KGHIAP.js.map +0 -1
- package/dist/chunk-G6WF4G3E.js +0 -43
- package/dist/chunk-G6WF4G3E.js.map +0 -1
- package/dist/chunk-GCPPXUAI.js +0 -72
- package/dist/chunk-GCPPXUAI.js.map +0 -1
- package/dist/chunk-GFSQMK35.mjs +0 -127
- package/dist/chunk-GFSQMK35.mjs.map +0 -1
- package/dist/chunk-GIGUDKLS.mjs +0 -6
- package/dist/chunk-GIGUDKLS.mjs.map +0 -1
- package/dist/chunk-GSRT66PA.js +0 -80
- package/dist/chunk-GSRT66PA.js.map +0 -1
- package/dist/chunk-H4TSADY3.mjs +0 -761
- package/dist/chunk-H4TSADY3.mjs.map +0 -1
- package/dist/chunk-H6AU3WKF.js +0 -108
- package/dist/chunk-H6AU3WKF.js.map +0 -1
- package/dist/chunk-HGNSJXWT.js +0 -55
- package/dist/chunk-HGNSJXWT.js.map +0 -1
- package/dist/chunk-HIZJD7TU.mjs +0 -326
- package/dist/chunk-HIZJD7TU.mjs.map +0 -1
- package/dist/chunk-HPGPOUHU.mjs +0 -105
- package/dist/chunk-HPGPOUHU.mjs.map +0 -1
- package/dist/chunk-HXHDOIV6.js +0 -41
- package/dist/chunk-HXHDOIV6.js.map +0 -1
- package/dist/chunk-I7AZC5ZQ.js +0 -14285
- package/dist/chunk-IBJOGXQI.js +0 -33
- package/dist/chunk-IBJOGXQI.js.map +0 -1
- package/dist/chunk-IMWON7OV.mjs +0 -27
- package/dist/chunk-IMWON7OV.mjs.map +0 -1
- package/dist/chunk-IO65ROAO.js +0 -134
- package/dist/chunk-IO65ROAO.js.map +0 -1
- package/dist/chunk-IWSN4DGG.js +0 -132
- package/dist/chunk-IWSN4DGG.js.map +0 -1
- package/dist/chunk-J7QI3GDX.js +0 -12
- package/dist/chunk-J7QI3GDX.js.map +0 -1
- package/dist/chunk-JA77WXRE.js +0 -30
- package/dist/chunk-JA77WXRE.js.map +0 -1
- package/dist/chunk-JCDX37BY.js +0 -58
- package/dist/chunk-JCDX37BY.js.map +0 -1
- package/dist/chunk-JONWE26J.js +0 -81
- package/dist/chunk-JONWE26J.js.map +0 -1
- package/dist/chunk-JOYMIGR2.mjs +0 -24842
- package/dist/chunk-JP5WGL75.js +0 -62
- package/dist/chunk-JP5WGL75.js.map +0 -1
- package/dist/chunk-JS75ORH7.js +0 -24860
- package/dist/chunk-JSXLTZUP.mjs +0 -255
- package/dist/chunk-JSXLTZUP.mjs.map +0 -1
- package/dist/chunk-JX3PO2MH.js +0 -53
- package/dist/chunk-JX3PO2MH.js.map +0 -1
- package/dist/chunk-KHPJ3CEL.js +0 -72
- package/dist/chunk-KHPJ3CEL.js.map +0 -1
- package/dist/chunk-KP5BFPGT.js +0 -44
- package/dist/chunk-KP5BFPGT.js.map +0 -1
- package/dist/chunk-KR7ATPAN.js +0 -52
- package/dist/chunk-KR7ATPAN.js.map +0 -1
- package/dist/chunk-KZVSB5WE.mjs +0 -21
- package/dist/chunk-KZVSB5WE.mjs.map +0 -1
- package/dist/chunk-LVGSOW2F.js +0 -32
- package/dist/chunk-LVGSOW2F.js.map +0 -1
- package/dist/chunk-M2N7NY3V.js +0 -103
- package/dist/chunk-M2N7NY3V.js.map +0 -1
- package/dist/chunk-MDQLON5R.mjs +0 -101
- package/dist/chunk-MDQLON5R.mjs.map +0 -1
- package/dist/chunk-MHKD34B4.js +0 -1677
- package/dist/chunk-MHKD34B4.js.map +0 -1
- package/dist/chunk-MLVHVKFT.mjs +0 -148
- package/dist/chunk-MLVHVKFT.mjs.map +0 -1
- package/dist/chunk-MU3D5IO7.mjs +0 -283
- package/dist/chunk-MU3D5IO7.mjs.map +0 -1
- package/dist/chunk-MU7DTEUF.mjs +0 -77
- package/dist/chunk-MU7DTEUF.mjs.map +0 -1
- package/dist/chunk-MVHR77V4.js +0 -205
- package/dist/chunk-MVHR77V4.js.map +0 -1
- package/dist/chunk-MXJOKOFK.mjs +0 -51
- package/dist/chunk-MXJOKOFK.mjs.map +0 -1
- package/dist/chunk-NBOBOYMT.js +0 -52
- package/dist/chunk-NBOBOYMT.js.map +0 -1
- package/dist/chunk-NE6QGHFT.mjs +0 -240
- package/dist/chunk-NE6QGHFT.mjs.map +0 -1
- package/dist/chunk-NH2P27MA.js +0 -27
- package/dist/chunk-NH2P27MA.js.map +0 -1
- package/dist/chunk-NN2YE5WT.js +0 -325
- package/dist/chunk-NNZDWY3L.mjs +0 -323
- package/dist/chunk-NSWO43XW.mjs +0 -39
- package/dist/chunk-NSWO43XW.mjs.map +0 -1
- package/dist/chunk-NYXENHD2.mjs +0 -96
- package/dist/chunk-NYXENHD2.mjs.map +0 -1
- package/dist/chunk-O5GHP7UO.js +0 -142
- package/dist/chunk-O5GHP7UO.js.map +0 -1
- package/dist/chunk-OBKS3CPP.mjs +0 -50
- package/dist/chunk-OBKS3CPP.mjs.map +0 -1
- package/dist/chunk-OFBEBMXN.mjs +0 -8014
- package/dist/chunk-OFBEBMXN.mjs.map +0 -1
- package/dist/chunk-OGNX6JT4.js +0 -222
- package/dist/chunk-OGNX6JT4.js.map +0 -1
- package/dist/chunk-OIPG3EGM.js +0 -771
- package/dist/chunk-OIPG3EGM.js.map +0 -1
- package/dist/chunk-OSU4QA5M.js +0 -260
- package/dist/chunk-OSU4QA5M.js.map +0 -1
- package/dist/chunk-OY3PDIB3.js +0 -106
- package/dist/chunk-OY3PDIB3.js.map +0 -1
- package/dist/chunk-P4Y75QSU.js +0 -19
- package/dist/chunk-P4Y75QSU.js.map +0 -1
- package/dist/chunk-PENNTSJE.mjs +0 -99
- package/dist/chunk-PENNTSJE.mjs.map +0 -1
- package/dist/chunk-PFDRQJKJ.js +0 -1079
- package/dist/chunk-PFDRQJKJ.js.map +0 -1
- package/dist/chunk-PGYOBEPL.mjs +0 -150
- package/dist/chunk-PGYOBEPL.mjs.map +0 -1
- package/dist/chunk-PIPGH7GA.js +0 -158
- package/dist/chunk-PIPGH7GA.js.map +0 -1
- package/dist/chunk-PRAHDLKT.js +0 -67
- package/dist/chunk-PRAHDLKT.js.map +0 -1
- package/dist/chunk-PURI56RE.js +0 -8
- package/dist/chunk-PURI56RE.js.map +0 -1
- package/dist/chunk-QAQTDHHT.mjs +0 -1102
- package/dist/chunk-QAQTDHHT.mjs.map +0 -1
- package/dist/chunk-QCS7NWMA.js +0 -161
- package/dist/chunk-QCS7NWMA.js.map +0 -1
- package/dist/chunk-QRHVMTHF.mjs +0 -94
- package/dist/chunk-QRHVMTHF.mjs.map +0 -1
- package/dist/chunk-QZF5NTXQ.mjs +0 -28
- package/dist/chunk-QZF5NTXQ.mjs.map +0 -1
- package/dist/chunk-R5F2JQVX.mjs +0 -41
- package/dist/chunk-R5F2JQVX.mjs.map +0 -1
- package/dist/chunk-RC4WWQXR.js +0 -47
- package/dist/chunk-RC4WWQXR.js.map +0 -1
- package/dist/chunk-RCB6HEHM.mjs +0 -349
- package/dist/chunk-RCB6HEHM.mjs.map +0 -1
- package/dist/chunk-RI6DFQCA.js +0 -539
- package/dist/chunk-RI6DFQCA.js.map +0 -1
- package/dist/chunk-RLUNEEGM.js +0 -336
- package/dist/chunk-RLUNEEGM.js.map +0 -1
- package/dist/chunk-RMDH2HMW.js +0 -108
- package/dist/chunk-RMDH2HMW.js.map +0 -1
- package/dist/chunk-RQROZLH3.js +0 -1153
- package/dist/chunk-RQROZLH3.js.map +0 -1
- package/dist/chunk-SFMNUVDN.mjs +0 -49
- package/dist/chunk-SFMNUVDN.mjs.map +0 -1
- package/dist/chunk-SG7CWD2R.js +0 -138
- package/dist/chunk-SG7CWD2R.js.map +0 -1
- package/dist/chunk-SHLWA6JY.mjs +0 -26
- package/dist/chunk-SHLWA6JY.mjs.map +0 -1
- package/dist/chunk-SNAQBZPT.js +0 -68
- package/dist/chunk-SNAQBZPT.js.map +0 -1
- package/dist/chunk-SUGBIEYQ.js +0 -195
- package/dist/chunk-SUGBIEYQ.js.map +0 -1
- package/dist/chunk-SVCKJ5KH.mjs +0 -193
- package/dist/chunk-SVCKJ5KH.mjs.map +0 -1
- package/dist/chunk-SWIKKSKL.js +0 -19
- package/dist/chunk-SWIKKSKL.js.map +0 -1
- package/dist/chunk-TBXWJJGT.js +0 -468
- package/dist/chunk-TBXWJJGT.js.map +0 -1
- package/dist/chunk-THO4NS6Z.mjs +0 -1416
- package/dist/chunk-THO4NS6Z.mjs.map +0 -1
- package/dist/chunk-TMVKRQGJ.mjs +0 -64
- package/dist/chunk-TMVKRQGJ.mjs.map +0 -1
- package/dist/chunk-TPEPAHU5.mjs +0 -525
- package/dist/chunk-TPEPAHU5.mjs.map +0 -1
- package/dist/chunk-TST2IKYO.js +0 -264
- package/dist/chunk-TST2IKYO.js.map +0 -1
- package/dist/chunk-TULCHQX2.js +0 -29
- package/dist/chunk-TULCHQX2.js.map +0 -1
- package/dist/chunk-U577ITSA.js +0 -23
- package/dist/chunk-U577ITSA.js.map +0 -1
- package/dist/chunk-UCMMIGC6.mjs +0 -156
- package/dist/chunk-UCMMIGC6.mjs.map +0 -1
- package/dist/chunk-UCQDE5UH.mjs +0 -102
- package/dist/chunk-UCQDE5UH.mjs.map +0 -1
- package/dist/chunk-UHYRVALN.mjs +0 -98
- package/dist/chunk-UHYRVALN.mjs.map +0 -1
- package/dist/chunk-UO6KTHBQ.mjs +0 -125
- package/dist/chunk-UO6KTHBQ.mjs.map +0 -1
- package/dist/chunk-UZKXOZHR.js +0 -23
- package/dist/chunk-UZKXOZHR.js.map +0 -1
- package/dist/chunk-VA2O5OSV.mjs +0 -21
- package/dist/chunk-VA2O5OSV.mjs.map +0 -1
- package/dist/chunk-VIGRGMWR.mjs +0 -229
- package/dist/chunk-VIGRGMWR.mjs.map +0 -1
- package/dist/chunk-VJMPIRSD.js +0 -31
- package/dist/chunk-VJMPIRSD.js.map +0 -1
- package/dist/chunk-VJTKIKZY.mjs +0 -782
- package/dist/chunk-VJTKIKZY.mjs.map +0 -1
- package/dist/chunk-VQL7XDIY.mjs +0 -43
- package/dist/chunk-VQL7XDIY.mjs.map +0 -1
- package/dist/chunk-VS67QHNX.mjs +0 -34
- package/dist/chunk-VS67QHNX.mjs.map +0 -1
- package/dist/chunk-VUAGR6VL.js +0 -483
- package/dist/chunk-VUAGR6VL.js.map +0 -1
- package/dist/chunk-WRRVYPMY.mjs +0 -535
- package/dist/chunk-WRRVYPMY.mjs.map +0 -1
- package/dist/chunk-WS7MH3GD.js +0 -40
- package/dist/chunk-WS7MH3GD.js.map +0 -1
- package/dist/chunk-WSPGXSBU.mjs +0 -202
- package/dist/chunk-WSPGXSBU.mjs.map +0 -1
- package/dist/chunk-XEOIGCUE.mjs +0 -480
- package/dist/chunk-XEOIGCUE.mjs.map +0 -1
- package/dist/chunk-Y2CP5J6Q.js +0 -116
- package/dist/chunk-Y2CP5J6Q.js.map +0 -1
- package/dist/chunk-YBKALLBH.js +0 -46
- package/dist/chunk-YBKALLBH.js.map +0 -1
- package/dist/chunk-YMZNEDFP.js +0 -39
- package/dist/chunk-YMZNEDFP.js.map +0 -1
- package/dist/chunk-YPGUV6BT.mjs +0 -30
- package/dist/chunk-YPGUV6BT.mjs.map +0 -1
- package/dist/chunk-YU7QZ3PP.mjs +0 -45
- package/dist/chunk-YU7QZ3PP.mjs.map +0 -1
- package/dist/chunk-YVJASVVK.js +0 -97
- package/dist/chunk-YVJASVVK.js.map +0 -1
- package/dist/chunk-YZJ22HUQ.js +0 -29
- package/dist/chunk-YZJ22HUQ.js.map +0 -1
- package/dist/chunk-Z2URIOKG.mjs +0 -36
- package/dist/chunk-Z2URIOKG.mjs.map +0 -1
- package/dist/chunk-ZN4HBK5C.mjs +0 -17
- package/dist/chunk-ZN4HBK5C.mjs.map +0 -1
- package/dist/chunk-ZVBLXXNJ.mjs +0 -53
- package/dist/chunk-ZVBLXXNJ.mjs.map +0 -1
- package/dist/chunk-ZXC56JS3.js +0 -8071
- package/dist/chunk-ZXC56JS3.js.map +0 -1
- package/dist/chunk-ZZQAGCSI.mjs +0 -43
- package/dist/chunk-ZZQAGCSI.mjs.map +0 -1
- package/dist/cli/agent/checks.d.ts +0 -96
- package/dist/cli/agent/checks.d.ts.map +0 -1
- package/dist/cli/agent/context.d.ts +0 -50
- package/dist/cli/agent/context.d.ts.map +0 -1
- package/dist/cli/agent/envelope.d.ts +0 -98
- package/dist/cli/agent/envelope.d.ts.map +0 -1
- package/dist/cli/agent/errors.d.ts +0 -36
- package/dist/cli/agent/errors.d.ts.map +0 -1
- package/dist/cli/agent/output.d.ts +0 -41
- package/dist/cli/agent/output.d.ts.map +0 -1
- package/dist/cli/agent/ssr-bailout.d.ts +0 -27
- package/dist/cli/agent/ssr-bailout.d.ts.map +0 -1
- package/dist/cli/api/sonor.d.ts +0 -39
- package/dist/cli/api/sonor.d.ts.map +0 -1
- package/dist/cli/codemod/diff.d.ts +0 -14
- package/dist/cli/codemod/diff.d.ts.map +0 -1
- package/dist/cli/codemod/engine.d.ts +0 -26
- package/dist/cli/codemod/engine.d.ts.map +0 -1
- package/dist/cli/codemod/transforms.d.ts +0 -31
- package/dist/cli/codemod/transforms.d.ts.map +0 -1
- package/dist/cli/commands/api-routes.d.ts +0 -13
- package/dist/cli/commands/api-routes.d.ts.map +0 -1
- package/dist/cli/commands/codemod.d.ts +0 -21
- package/dist/cli/commands/codemod.d.ts.map +0 -1
- package/dist/cli/commands/doctor.d.ts +0 -27
- package/dist/cli/commands/doctor.d.ts.map +0 -1
- package/dist/cli/commands/faqs.d.ts +0 -16
- package/dist/cli/commands/faqs.d.ts.map +0 -1
- package/dist/cli/commands/geo.d.ts +0 -18
- package/dist/cli/commands/geo.d.ts.map +0 -1
- package/dist/cli/commands/images.d.ts +0 -85
- package/dist/cli/commands/images.d.ts.map +0 -1
- package/dist/cli/commands/init.d.ts +0 -21
- package/dist/cli/commands/init.d.ts.map +0 -1
- package/dist/cli/commands/install.d.ts +0 -15
- package/dist/cli/commands/install.d.ts.map +0 -1
- package/dist/cli/commands/locations.d.ts +0 -55
- package/dist/cli/commands/locations.d.ts.map +0 -1
- package/dist/cli/commands/manifest.d.ts +0 -17
- package/dist/cli/commands/manifest.d.ts.map +0 -1
- package/dist/cli/commands/migrate.d.ts +0 -19
- package/dist/cli/commands/migrate.d.ts.map +0 -1
- package/dist/cli/commands/next16.d.ts +0 -10
- package/dist/cli/commands/next16.d.ts.map +0 -1
- package/dist/cli/commands/og.d.ts +0 -117
- package/dist/cli/commands/og.d.ts.map +0 -1
- package/dist/cli/commands/scaffold.d.ts +0 -22
- package/dist/cli/commands/scaffold.d.ts.map +0 -1
- package/dist/cli/commands/scan.d.ts +0 -18
- package/dist/cli/commands/scan.d.ts.map +0 -1
- package/dist/cli/commands/setup.d.ts +0 -35
- package/dist/cli/commands/setup.d.ts.map +0 -1
- package/dist/cli/commands/sync.d.ts +0 -22
- package/dist/cli/commands/sync.d.ts.map +0 -1
- package/dist/cli/commands/upgrade.d.ts +0 -15
- package/dist/cli/commands/upgrade.d.ts.map +0 -1
- package/dist/cli/commands/verify.d.ts +0 -22
- package/dist/cli/commands/verify.d.ts.map +0 -1
- package/dist/cli/config.d.ts +0 -31
- package/dist/cli/config.d.ts.map +0 -1
- package/dist/cli/generators/index.d.ts +0 -60
- package/dist/cli/generators/index.d.ts.map +0 -1
- package/dist/cli/index.d.ts +0 -15
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js +0 -32904
- package/dist/cli/index.mjs +0 -32872
- package/dist/cli/migrator/index.d.ts +0 -92
- package/dist/cli/migrator/index.d.ts.map +0 -1
- package/dist/cli/scanner/index.d.ts +0 -129
- package/dist/cli/scanner/index.d.ts.map +0 -1
- package/dist/cli/state.d.ts +0 -7
- package/dist/cli/state.d.ts.map +0 -1
- package/dist/client/SiteKitCredential.d.ts.map +0 -1
- package/dist/client/index.d.ts.map +0 -1
- package/dist/client/index.js.map +0 -1
- package/dist/client/index.mjs +0 -27
- package/dist/client/index.mjs.map +0 -1
- package/dist/cms/CmsPage.d.ts.map +0 -1
- package/dist/cms/CmsPreview.d.ts.map +0 -1
- package/dist/cms/CmsSection.d.ts.map +0 -1
- package/dist/cms/PortableTextRenderer.d.ts.map +0 -1
- package/dist/cms/index.d.ts.map +0 -1
- package/dist/cms/index.js.map +0 -1
- package/dist/cms/index.mjs +0 -389
- package/dist/cms/index.mjs.map +0 -1
- package/dist/cms/sanity-image.d.ts.map +0 -1
- package/dist/cms/sections/CtaSection.d.ts.map +0 -1
- package/dist/cms/sections/CustomSection.d.ts.map +0 -1
- package/dist/cms/sections/FaqSection.d.ts.map +0 -1
- package/dist/cms/sections/FormSection.d.ts.map +0 -1
- package/dist/cms/sections/GallerySection.d.ts.map +0 -1
- package/dist/cms/sections/HeroSection.d.ts.map +0 -1
- package/dist/cms/sections/RichTextSection.d.ts.map +0 -1
- package/dist/cms/sections/TestimonialsSection.d.ts.map +0 -1
- package/dist/cms/sections/index.d.ts.map +0 -1
- package/dist/cms/server-api.d.ts.map +0 -1
- package/dist/cms/server.d.ts.map +0 -1
- package/dist/cms/server.js.map +0 -1
- package/dist/cms/server.mjs +0 -5
- package/dist/cms/server.mjs.map +0 -1
- package/dist/cms/types.d.ts.map +0 -1
- package/dist/commerce/CalendarView.d.ts.map +0 -1
- package/dist/commerce/CheckoutForm.d.ts.map +0 -1
- package/dist/commerce/EventCalendar.d.ts.map +0 -1
- package/dist/commerce/EventCheckout.d.ts.map +0 -1
- package/dist/commerce/EventEmbed.d.ts.map +0 -1
- package/dist/commerce/EventModal.d.ts.map +0 -1
- package/dist/commerce/EventTile.d.ts.map +0 -1
- package/dist/commerce/EventsAgenda.d.ts.map +0 -1
- package/dist/commerce/EventsWidget.d.ts.map +0 -1
- package/dist/commerce/OfferingCard.d.ts.map +0 -1
- package/dist/commerce/OfferingList.d.ts.map +0 -1
- package/dist/commerce/ProductDetail.d.ts.map +0 -1
- package/dist/commerce/ProductEmbed.d.ts.map +0 -1
- package/dist/commerce/ProductGrid.d.ts.map +0 -1
- package/dist/commerce/ProductPage.d.ts.map +0 -1
- package/dist/commerce/RegistrationForm.d.ts.map +0 -1
- package/dist/commerce/SizeChart.d.ts.map +0 -1
- package/dist/commerce/UpcomingEvents.d.ts.map +0 -1
- package/dist/commerce/api.d.ts.map +0 -1
- package/dist/commerce/events-extras.d.ts.map +0 -1
- package/dist/commerce/index.d.ts.map +0 -1
- package/dist/commerce/index.js.map +0 -1
- package/dist/commerce/index.mjs +0 -16
- package/dist/commerce/index.mjs.map +0 -1
- package/dist/commerce/server.d.ts.map +0 -1
- package/dist/commerce/server.js.map +0 -1
- package/dist/commerce/server.mjs +0 -237
- package/dist/commerce/server.mjs.map +0 -1
- package/dist/commerce/types.d.ts.map +0 -1
- package/dist/commerce/useEventModal.d.ts.map +0 -1
- package/dist/commerce/utils.d.ts.map +0 -1
- package/dist/config/index.d.ts.map +0 -1
- package/dist/config/index.js.map +0 -1
- package/dist/config/index.mjs +0 -116
- package/dist/config/index.mjs.map +0 -1
- package/dist/cta-bar/CtaBar.d.ts.map +0 -1
- package/dist/cta-bar/CtaBarBehavior.d.ts.map +0 -1
- package/dist/cta-bar/client.d.ts.map +0 -1
- package/dist/cta-bar/client.js.map +0 -1
- package/dist/cta-bar/client.mjs +0 -6
- package/dist/cta-bar/client.mjs.map +0 -1
- package/dist/cta-bar/index.d.ts.map +0 -1
- package/dist/cta-bar/index.js.map +0 -1
- package/dist/cta-bar/index.mjs +0 -221
- package/dist/cta-bar/index.mjs.map +0 -1
- package/dist/cta-bar/styles.d.ts.map +0 -1
- package/dist/discover-LPN55L5B.js +0 -21
- package/dist/discover-LPN55L5B.js.map +0 -1
- package/dist/discover-QGA6QFSR.mjs +0 -4
- package/dist/discover-QGA6QFSR.mjs.map +0 -1
- package/dist/engage/ChatWidget.d.ts.map +0 -1
- package/dist/engage/DesignRenderer.d.ts.map +0 -1
- package/dist/engage/EchoUiActions.d.ts.map +0 -1
- package/dist/engage/EngageWidget.d.ts.map +0 -1
- package/dist/engage/brand-color.d.ts.map +0 -1
- package/dist/engage/chat-messages.d.ts.map +0 -1
- package/dist/engage/echo-config.d.ts.map +0 -1
- package/dist/engage/element-rules.d.ts.map +0 -1
- package/dist/engage/index.d.ts.map +0 -1
- package/dist/engage/index.js.map +0 -1
- package/dist/engage/index.mjs +0 -51
- package/dist/engage/index.mjs.map +0 -1
- package/dist/engage/launcher-placement.d.ts.map +0 -1
- package/dist/engage/socket-loader.d.ts.map +0 -1
- package/dist/engage/types.d.ts.map +0 -1
- package/dist/fleet/FleetHeartbeat.d.ts.map +0 -1
- package/dist/fleet/contract.d.ts.map +0 -1
- package/dist/fleet/contract.js.map +0 -1
- package/dist/fleet/contract.mjs +0 -4
- package/dist/fleet/contract.mjs.map +0 -1
- package/dist/fleet/heartbeat.d.ts.map +0 -1
- package/dist/fleet/index.d.ts.map +0 -1
- package/dist/fleet/index.js.map +0 -1
- package/dist/fleet/index.mjs +0 -12
- package/dist/fleet/index.mjs.map +0 -1
- package/dist/forms/DatePicker.d.ts.map +0 -1
- package/dist/forms/FileField.d.ts.map +0 -1
- package/dist/forms/FormCelebration.d.ts.map +0 -1
- package/dist/forms/FormClient.d.ts.map +0 -1
- package/dist/forms/FormEnhancer.d.ts.map +0 -1
- package/dist/forms/FormField.d.ts.map +0 -1
- package/dist/forms/FormSpotlight.d.ts.map +0 -1
- package/dist/forms/FormStage.d.ts.map +0 -1
- package/dist/forms/HoneypotField.d.ts.map +0 -1
- package/dist/forms/ManagedForm.d.ts.map +0 -1
- package/dist/forms/ServerForm.d.ts.map +0 -1
- package/dist/forms/StaticForm.d.ts.map +0 -1
- package/dist/forms/contract.d.ts.map +0 -1
- package/dist/forms/contract.js.map +0 -1
- package/dist/forms/contract.mjs +0 -4
- package/dist/forms/contract.mjs.map +0 -1
- package/dist/forms/defaultSuccessMessage.d.ts.map +0 -1
- package/dist/forms/delight.d.ts.map +0 -1
- package/dist/forms/experience-chrome.d.ts.map +0 -1
- package/dist/forms/experience-plan.d.ts.map +0 -1
- package/dist/forms/field-controls.d.ts.map +0 -1
- package/dist/forms/field-interactions.d.ts.map +0 -1
- package/dist/forms/field-rules.d.ts.map +0 -1
- package/dist/forms/form-values.d.ts.map +0 -1
- package/dist/forms/formsApi.d.ts.map +0 -1
- package/dist/forms/ga4-identity.d.ts.map +0 -1
- package/dist/forms/index.d.ts.map +0 -1
- package/dist/forms/index.js.map +0 -1
- package/dist/forms/index.mjs +0 -341
- package/dist/forms/index.mjs.map +0 -1
- package/dist/forms/normalize-config.d.ts.map +0 -1
- package/dist/forms/recaptcha-warmup.d.ts.map +0 -1
- package/dist/forms/recaptcha.d.ts.map +0 -1
- package/dist/forms/server.d.ts.map +0 -1
- package/dist/forms/server.js.map +0 -1
- package/dist/forms/server.mjs +0 -61
- package/dist/forms/server.mjs.map +0 -1
- package/dist/forms/static.d.ts.map +0 -1
- package/dist/forms/static.js.map +0 -1
- package/dist/forms/static.mjs +0 -8
- package/dist/forms/static.mjs.map +0 -1
- package/dist/forms/submitForm.d.ts.map +0 -1
- package/dist/forms/tracking-session.d.ts.map +0 -1
- package/dist/forms/types.d.ts.map +0 -1
- package/dist/forms/useForm.d.ts.map +0 -1
- package/dist/forms/useFormTracking.d.ts.map +0 -1
- package/dist/images/ManagedFavicon.d.ts.map +0 -1
- package/dist/images/ManagedImage.d.ts.map +0 -1
- package/dist/images/api.d.ts.map +0 -1
- package/dist/images/index.d.ts.map +0 -1
- package/dist/images/index.js.map +0 -1
- package/dist/images/index.mjs +0 -8
- package/dist/images/index.mjs.map +0 -1
- package/dist/images/server.d.ts.map +0 -1
- package/dist/images/server.js.map +0 -1
- package/dist/images/server.mjs +0 -4
- package/dist/images/server.mjs.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/index.mjs +0 -173
- package/dist/index.mjs.map +0 -1
- package/dist/landing/LandingPage.d.ts.map +0 -1
- package/dist/landing/contract.d.ts.map +0 -1
- package/dist/landing/index.d.ts.map +0 -1
- package/dist/landing/index.js.map +0 -1
- package/dist/landing/index.mjs +0 -5
- package/dist/landing/index.mjs.map +0 -1
- package/dist/landing/metadata.d.ts.map +0 -1
- package/dist/landing/server.d.ts.map +0 -1
- package/dist/landing/server.js.map +0 -1
- package/dist/landing/server.mjs +0 -4
- package/dist/landing/server.mjs.map +0 -1
- package/dist/layout/SiteKitClientProviders.d.ts.map +0 -1
- package/dist/layout/SiteKitLayout.d.ts.map +0 -1
- package/dist/layout/SpeculationRules.d.ts.map +0 -1
- package/dist/layout/client.d.ts.map +0 -1
- package/dist/layout/client.js.map +0 -1
- package/dist/layout/client.mjs +0 -19
- package/dist/layout/client.mjs.map +0 -1
- package/dist/layout/index.d.ts.map +0 -1
- package/dist/layout/index.js.map +0 -1
- package/dist/layout/index.mjs +0 -106
- package/dist/layout/index.mjs.map +0 -1
- package/dist/layout/types.d.ts.map +0 -1
- package/dist/lib-6HOOMENJ.js +0 -28
- package/dist/lib-BGAWCSUH.js +0 -31
- package/dist/lib-R7IQ4ZHE.mjs +0 -3
- package/dist/lib-RSDMEKDQ.mjs +0 -4
- package/dist/llms/AEOComponents.d.ts.map +0 -1
- package/dist/llms/SpeakableSchema.d.ts.map +0 -1
- package/dist/llms/aiRobots.d.ts.map +0 -1
- package/dist/llms/api.d.ts.map +0 -1
- package/dist/llms/client.d.ts.map +0 -1
- package/dist/llms/client.js.map +0 -1
- package/dist/llms/client.mjs +0 -5
- package/dist/llms/client.mjs.map +0 -1
- package/dist/llms/contract.d.ts.map +0 -1
- package/dist/llms/contract.js.map +0 -1
- package/dist/llms/contract.mjs +0 -4
- package/dist/llms/contract.mjs.map +0 -1
- package/dist/llms/discovery-headers.d.ts.map +0 -1
- package/dist/llms/generateLLMsTxt.d.ts.map +0 -1
- package/dist/llms/handlers.d.ts.map +0 -1
- package/dist/llms/humanize-industry.d.ts.map +0 -1
- package/dist/llms/index.d.ts.map +0 -1
- package/dist/llms/index.js.map +0 -1
- package/dist/llms/index.mjs +0 -286
- package/dist/llms/index.mjs.map +0 -1
- package/dist/llms/links.d.ts.map +0 -1
- package/dist/llms/revalidate.d.ts.map +0 -1
- package/dist/llms/seo-revalidate.d.ts.map +0 -1
- package/dist/llms/sourcedFacts.d.ts.map +0 -1
- package/dist/llms/types.d.ts.map +0 -1
- package/dist/llms/wiring.d.ts +0 -103
- package/dist/llms/wiring.d.ts.map +0 -1
- package/dist/llms/writeLLMsTxt.d.ts.map +0 -1
- package/dist/manifest/index.d.ts.map +0 -1
- package/dist/manifest/index.js.map +0 -1
- package/dist/manifest/index.mjs +0 -83
- package/dist/manifest/index.mjs.map +0 -1
- package/dist/maps/GoogleMap.d.ts.map +0 -1
- package/dist/maps/NeighborhoodMap.d.ts.map +0 -1
- package/dist/maps/api.d.ts.map +0 -1
- package/dist/maps/index.d.ts.map +0 -1
- package/dist/maps/index.js.map +0 -1
- package/dist/maps/index.mjs +0 -361
- package/dist/maps/index.mjs.map +0 -1
- package/dist/maps/types.d.ts.map +0 -1
- package/dist/mcp/WebMcpTools.d.ts.map +0 -1
- package/dist/mcp/client.d.ts.map +0 -1
- package/dist/mcp/client.js.map +0 -1
- package/dist/mcp/client.mjs +0 -129
- package/dist/mcp/client.mjs.map +0 -1
- package/dist/mcp/declarative.d.ts.map +0 -1
- package/dist/mcp/handlers.d.ts.map +0 -1
- package/dist/mcp/index.d.ts.map +0 -1
- package/dist/mcp/index.js.map +0 -1
- package/dist/mcp/index.mjs +0 -509
- package/dist/mcp/index.mjs.map +0 -1
- package/dist/mcp/protocol.d.ts.map +0 -1
- package/dist/mcp/serverCard.d.ts.map +0 -1
- package/dist/mcp/transport.d.ts.map +0 -1
- package/dist/mcp/transport.js.map +0 -1
- package/dist/mcp/transport.mjs +0 -123
- package/dist/mcp/transport.mjs.map +0 -1
- package/dist/mcp/types.d.ts.map +0 -1
- package/dist/motion/CountUp.d.ts.map +0 -1
- package/dist/motion/Parallax.d.ts.map +0 -1
- package/dist/motion/Reveal.d.ts.map +0 -1
- package/dist/motion/ScrollScene.d.ts.map +0 -1
- package/dist/motion/engine.d.ts.map +0 -1
- package/dist/motion/failsafe.d.ts.map +0 -1
- package/dist/motion/gsap.d.ts.map +0 -1
- package/dist/motion/gsap.js.map +0 -1
- package/dist/motion/gsap.mjs +0 -220
- package/dist/motion/gsap.mjs.map +0 -1
- package/dist/motion/index.d.ts.map +0 -1
- package/dist/motion/index.js.map +0 -1
- package/dist/motion/index.mjs +0 -209
- package/dist/motion/index.mjs.map +0 -1
- package/dist/motion/three.d.ts.map +0 -1
- package/dist/motion/three.js.map +0 -1
- package/dist/motion/three.mjs +0 -145
- package/dist/motion/three.mjs.map +0 -1
- package/dist/og/config.d.ts.map +0 -1
- package/dist/og/contrast.d.ts.map +0 -1
- package/dist/og/index.d.ts.map +0 -1
- package/dist/og/index.js.map +0 -1
- package/dist/og/index.mjs +0 -6
- package/dist/og/index.mjs.map +0 -1
- package/dist/og/pages.d.ts.map +0 -1
- package/dist/og/route-copy.d.ts +0 -34
- package/dist/og/route-copy.d.ts.map +0 -1
- package/dist/og/route-fit.d.ts.map +0 -1
- package/dist/og/route.d.ts.map +0 -1
- package/dist/og/route.js.map +0 -1
- package/dist/og/route.mjs +0 -239
- package/dist/og/route.mjs.map +0 -1
- package/dist/og/template.d.ts.map +0 -1
- package/dist/og/wiring.d.ts +0 -100
- package/dist/og/wiring.d.ts.map +0 -1
- package/dist/portfolio/contract.d.ts.map +0 -1
- package/dist/portfolio/contract.js.map +0 -1
- package/dist/portfolio/contract.mjs +0 -115
- package/dist/portfolio/contract.mjs.map +0 -1
- package/dist/proxy/index.d.ts.map +0 -1
- package/dist/proxy/index.js.map +0 -1
- package/dist/proxy/index.mjs +0 -170
- package/dist/proxy/index.mjs.map +0 -1
- package/dist/proxy/securityHeaders.d.ts.map +0 -1
- package/dist/proxy/segment.d.ts.map +0 -1
- package/dist/redirects/index.d.ts.map +0 -1
- package/dist/redirects/index.js.map +0 -1
- package/dist/redirects/index.mjs +0 -8
- package/dist/redirects/index.mjs.map +0 -1
- package/dist/redirects/not-found.d.ts +0 -31
- package/dist/redirects/not-found.d.ts.map +0 -1
- package/dist/redirects/not-found.js +0 -47
- package/dist/redirects/not-found.js.map +0 -1
- package/dist/redirects/not-found.mjs +0 -45
- package/dist/redirects/not-found.mjs.map +0 -1
- package/dist/reputation/TestimonialSection.d.ts.map +0 -1
- package/dist/reputation/api.d.ts.map +0 -1
- package/dist/reputation/index.d.ts.map +0 -1
- package/dist/reputation/index.js.map +0 -1
- package/dist/reputation/index.mjs +0 -5
- package/dist/reputation/index.mjs.map +0 -1
- package/dist/reputation/server.d.ts.map +0 -1
- package/dist/reputation/server.js.map +0 -1
- package/dist/reputation/server.mjs +0 -4
- package/dist/reputation/server.mjs.map +0 -1
- package/dist/reputation/types.d.ts.map +0 -1
- package/dist/robots/index.d.ts.map +0 -1
- package/dist/robots/index.js.map +0 -1
- package/dist/robots/index.mjs +0 -53
- package/dist/robots/index.mjs.map +0 -1
- package/dist/robots/indexnow.d.ts.map +0 -1
- package/dist/robots/indexnow.js.map +0 -1
- package/dist/robots/indexnow.mjs +0 -34
- package/dist/robots/indexnow.mjs.map +0 -1
- package/dist/robots/next-internals.d.ts.map +0 -1
- package/dist/search/contract.d.ts +0 -62
- package/dist/search/contract.d.ts.map +0 -1
- package/dist/search/contract.js +0 -17
- package/dist/search/contract.js.map +0 -1
- package/dist/search/contract.mjs +0 -4
- package/dist/search/contract.mjs.map +0 -1
- package/dist/search/index.d.ts +0 -52
- package/dist/search/index.d.ts.map +0 -1
- package/dist/search/index.js +0 -105
- package/dist/search/index.js.map +0 -1
- package/dist/search/index.mjs +0 -99
- package/dist/search/index.mjs.map +0 -1
- package/dist/seo/LocationPageContent.d.ts +0 -64
- package/dist/seo/LocationPageContent.d.ts.map +0 -1
- package/dist/seo/ManagedContent.d.ts.map +0 -1
- package/dist/seo/ManagedFAQ.d.ts.map +0 -1
- package/dist/seo/ManagedInternalLinks.d.ts.map +0 -1
- package/dist/seo/ManagedSchema.d.ts.map +0 -1
- package/dist/seo/ManagedScripts.d.ts.map +0 -1
- package/dist/seo/api.d.ts.map +0 -1
- package/dist/seo/client.d.ts.map +0 -1
- package/dist/seo/client.js.map +0 -1
- package/dist/seo/client.mjs +0 -11
- package/dist/seo/client.mjs.map +0 -1
- package/dist/seo/getManagedMetadata.d.ts.map +0 -1
- package/dist/seo/groundingSchema.d.ts.map +0 -1
- package/dist/seo/index.d.ts.map +0 -1
- package/dist/seo/index.js.map +0 -1
- package/dist/seo/index.mjs +0 -702
- package/dist/seo/index.mjs.map +0 -1
- package/dist/seo/register-sitemap-cli-impl.d.ts.map +0 -1
- package/dist/seo/register-sitemap-cli.d.ts.map +0 -1
- package/dist/seo/register-sitemap-cli.mjs +0 -528
- package/dist/seo/register-sitemap-request.d.ts.map +0 -1
- package/dist/seo/routing.d.ts.map +0 -1
- package/dist/seo/safeJsonLd.d.ts.map +0 -1
- package/dist/seo/schema-filter.d.ts.map +0 -1
- package/dist/seo/server-api.d.ts.map +0 -1
- package/dist/seo/server.d.ts.map +0 -1
- package/dist/seo/server.js.map +0 -1
- package/dist/seo/server.mjs +0 -11
- package/dist/seo/server.mjs.map +0 -1
- package/dist/seo/types.d.ts.map +0 -1
- package/dist/seo/withManagedMetadata.d.ts.map +0 -1
- package/dist/seo-meta/contract.d.ts.map +0 -1
- package/dist/seo-meta/contract.js.map +0 -1
- package/dist/seo-meta/contract.mjs +0 -4
- package/dist/seo-meta/contract.mjs.map +0 -1
- package/dist/seo-pages/contract.d.ts.map +0 -1
- package/dist/seo-pages/contract.js.map +0 -1
- package/dist/seo-pages/contract.mjs +0 -45
- package/dist/seo-pages/contract.mjs.map +0 -1
- package/dist/server/index.d.ts.map +0 -1
- package/dist/server/index.js.map +0 -1
- package/dist/server/index.mjs +0 -7
- package/dist/server/index.mjs.map +0 -1
- package/dist/server/mint-site-token.d.ts.map +0 -1
- package/dist/server/server-fetch.d.ts.map +0 -1
- package/dist/server-api-7F5P6CSH.mjs +0 -9
- package/dist/server-api-7F5P6CSH.mjs.map +0 -1
- package/dist/server-api-OC5JNK6R.js +0 -86
- package/dist/server-api-OC5JNK6R.js.map +0 -1
- package/dist/setup/index.d.ts +0 -12
- package/dist/setup/index.d.ts.map +0 -1
- package/dist/setup/index.js +0 -4
- package/dist/setup/index.js.map +0 -1
- package/dist/setup/index.mjs +0 -3
- package/dist/setup/index.mjs.map +0 -1
- package/dist/shared/build-entries.d.ts.map +0 -1
- package/dist/shared/color.d.ts.map +0 -1
- package/dist/shared/defer.d.ts.map +0 -1
- package/dist/shared/fetchWithRetry.d.ts.map +0 -1
- package/dist/shared/frame.d.ts.map +0 -1
- package/dist/shared/fresh-fetch.d.ts.map +0 -1
- package/dist/shared/glass.d.ts.map +0 -1
- package/dist/shared/identity.d.ts.map +0 -1
- package/dist/shared/next-files.d.ts.map +0 -1
- package/dist/shared/page-leave.d.ts.map +0 -1
- package/dist/shared/publishCredential.d.ts.map +0 -1
- package/dist/shared/reporting-gate.d.ts.map +0 -1
- package/dist/shared/request-guards.d.ts.map +0 -1
- package/dist/shared/siteToken.d.ts.map +0 -1
- package/dist/shared/sonorFetch.d.ts.map +0 -1
- package/dist/shared/source-graph.d.ts.map +0 -1
- package/dist/shared/uuid.d.ts.map +0 -1
- package/dist/shared/version.d.ts.map +0 -1
- package/dist/shared/visual-viewport-gap.d.ts.map +0 -1
- package/dist/signal/SignalBridge.d.ts.map +0 -1
- package/dist/signal/SignalCore.d.ts.map +0 -1
- package/dist/signal/SignalExperiment.d.ts.map +0 -1
- package/dist/signal/index.d.ts.map +0 -1
- package/dist/signal/index.js.map +0 -1
- package/dist/signal/index.mjs +0 -6
- package/dist/signal/index.mjs.map +0 -1
- package/dist/signal/store.d.ts.map +0 -1
- package/dist/signal/types.d.ts.map +0 -1
- package/dist/site-config/index.d.ts.map +0 -1
- package/dist/site-config/index.js.map +0 -1
- package/dist/site-config/index.mjs +0 -4
- package/dist/site-config/index.mjs.map +0 -1
- package/dist/sitemap/discover.d.ts.map +0 -1
- package/dist/sitemap/index.d.ts.map +0 -1
- package/dist/sitemap/index.js.map +0 -1
- package/dist/sitemap/index.mjs +0 -549
- package/dist/sitemap/index.mjs.map +0 -1
- package/dist/sitemap/shared.d.ts.map +0 -1
- package/dist/sites/contract.d.ts.map +0 -1
- package/dist/sites/contract.js.map +0 -1
- package/dist/sites/contract.mjs +0 -5
- package/dist/sites/contract.mjs.map +0 -1
- package/dist/sites/normalize.d.ts.map +0 -1
- package/dist/sites/resolve.d.ts.map +0 -1
- package/dist/sites/site-param.d.ts.map +0 -1
- package/dist/slots/ManagedSlot.d.ts.map +0 -1
- package/dist/slots/contract.d.ts.map +0 -1
- package/dist/slots/contract.js.map +0 -1
- package/dist/slots/contract.mjs +0 -4
- package/dist/slots/contract.mjs.map +0 -1
- package/dist/slots/index.d.ts.map +0 -1
- package/dist/slots/index.js.map +0 -1
- package/dist/slots/index.mjs +0 -142
- package/dist/slots/index.mjs.map +0 -1
- package/dist/slots/revalidate.d.ts.map +0 -1
- package/dist/slots/server-api.d.ts.map +0 -1
- package/dist/socket-loader-2NYBMBFQ.js +0 -16
- package/dist/socket-loader-2NYBMBFQ.js.map +0 -1
- package/dist/socket-loader-JA2DI2RT.mjs +0 -14
- package/dist/socket-loader-JA2DI2RT.mjs.map +0 -1
- package/dist/sync/AddToCalendar.d.ts.map +0 -1
- package/dist/sync/BookingWidget.d.ts.map +0 -1
- package/dist/sync/MeetingFormatStep.d.ts.map +0 -1
- package/dist/sync/api.d.ts.map +0 -1
- package/dist/sync/booking-flow.d.ts.map +0 -1
- package/dist/sync/index.d.ts.map +0 -1
- package/dist/sync/index.js.map +0 -1
- package/dist/sync/index.mjs +0 -7
- package/dist/sync/index.mjs.map +0 -1
- package/dist/sync/types.d.ts.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/web-vitals.attribution-7LKLZ5GR.mjs +0 -524
- package/dist/web-vitals.attribution-7LKLZ5GR.mjs.map +0 -1
- package/dist/web-vitals.attribution-ONVYQNRB.js +0 -535
- package/dist/web-vitals.attribution-ONVYQNRB.js.map +0 -1
- package/dist/writeLLMsTxt-IYJILIU3.mjs +0 -11
- package/dist/writeLLMsTxt-SQG4B63X.js +0 -20
- package/scripts/postinstall.cjs +0 -67
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"serverCard.d.ts","sourceRoot":"","sources":["../../src/mcp/serverCard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAG3E,eAAO,MAAM,sBAAsB,8EAC0C,CAAA;AAE7E,4CAA4C;AAC5C,eAAO,MAAM,oBAAoB,iCAAiC,CAAA;AAClE,qDAAqD;AACrD,eAAO,MAAM,2BAA2B,0BAA0B,CAAA;AAElE;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,4BAA4B,CAAA;AAE/D,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,iBAAiB,GAAG,KAAK,CAAA;IAC/B,GAAG,EAAE,MAAM,CAAA;IACX,yBAAyB,CAAC,EAAE,MAAM,EAAE,CAAA;IACpC,OAAO,CAAC,EAAE;QACR,IAAI,EAAE,MAAM,CAAA;QACZ,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,UAAU,CAAC,EAAE,OAAO,CAAA;QACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;QAClB,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;KACnB,EAAE,CAAA;CACJ;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,aAAa,EAAE,CAAA;IACvB,OAAO,CAAC,EAAE,SAAS,EAAE,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAChC;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,aAAa,CAAA;IACnB,2EAA2E;IAC3E,OAAO,EAAE,MAAM,CAAA;IACf,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,aAAa,EAAE,CAAA;IACvB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,CAAA;IAC/B,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,SAAS,EAAE,CAAA;CAChC;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,aAAa,CAyCpF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,EAAE,CAyBnE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/mcp/transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AASH,4CAA4C;AAC5C,eAAO,MAAM,wBAAwB,yBAAyB,CAAA;AAE9D,+EAA+E;AAC/E,eAAO,MAAM,4BAA4B,yBAAyB,CAAA;AAElE,6EAA6E;AAC7E,eAAO,MAAM,2BAA2B,0BAA0B,CAAA;AAElE,4DAA4D;AAC5D,eAAO,MAAM,iBAAiB,sBAAsB,CAAA;AAEpD,sFAAsF;AACtF,eAAO,MAAM,gBAAgB,4BAA4B,CAAA;AAEzD,uEAAuE;AACvE,eAAO,MAAM,wBAAwB,QAAY,CAAA;AAEjD,6FAA6F;AAC7F,eAAO,MAAM,oBAAoB,QAAS,CAAA;AAE1C,2DAA2D;AAC3D,eAAO,MAAM,iBAAiB,YAAI,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAU,CAAA;AAM9E,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAA;CAC7C;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;AAEhF,uFAAuF;AACvF,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,eAAe,CAAA;IACpB,IAAI,EAAE,eAAe,CAAA;IACrB,MAAM,EAAE,eAAe,CAAA;IACvB,OAAO,EAAE,eAAe,CAAA;CACzB;AAED,MAAM,WAAW,yBAA0B,SAAQ,mBAAmB;IACpE;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,CAAA;CACpC;AAED,MAAM,WAAW,sBAAuB,SAAQ,mBAAmB;IACjE,oFAAoF;IACpF,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,mEAAmE;IACnE,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,iEAAiE;AACjE,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACxB,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CACvC;AA6BD,0FAA0F;AAC1F,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAoC,GAAG,MAAM,CAEpG;AAUD;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAEzG;AAYD;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,GAAE,yBAA8B,GACtC,kBAAkB,CAgBpB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,GAAE,mBAAwB,GAChC,kBAAkB,CAkBpB;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,GAAE,sBAA2B,GACnC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,QAAQ,CAAC,CAmDvE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/mcp/transport.ts"],"names":["createHmac","timingSafeEqual","readCappedBody"],"mappings":"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","file":"transport.js","sourcesContent":["/**\n * @sonordev/site-kit/mcp/transport — the rate-limited public MCP relay\n *\n * Netlify rate-limits a native function (declarative `config.rateLimit`), never\n * a Next.js route handler. So a public MCP endpoint on Netlify takes this path:\n *\n * agent ─► /api/mcp netlify/functions/mcp.mjs, rate-limited\n * │ createNetlifyMcpRelay: signs the request\n * │ (HMAC-SHA256 of MCP_TRANSPORT_SECRET over a label)\n * ▼\n * https://<deploy-id>--<site>.netlify.app/api/mcp-internal\n * │ createMcpInternalRoute: 403 unless signed,\n * ▼ then dispatches to the /api/mcp handlers\n * app/api/mcp/route.ts protectMcpHandlers(createMcpHandler(...))\n *\n * In production the function owns /api/mcp, and the Next route behind it\n * refuses unsigned calls too, so no request reaches a tool without passing\n * the rate limit. The relay targets the deploy permalink, so a request is\n * answered by the same immutable deploy that received it, and the base URL\n * comes from the platform (`context`), never from a client header.\n *\n * Single source of truth for the relay. It replaced per-site copies in\n * upforge-nextjs and wirsch-law-nextjs (`lib/mcp/transport-auth.ts`, the\n * `protect()` wrapper, the `/api/mcp-internal` relay and the function body);\n * don't fork it back into a site.\n *\n * Node only (`crypto`), and deliberately not re-exported from the\n * `@sonordev/site-kit/mcp` barrel so that barrel stays runtime-neutral.\n * Nothing here imports `server-only`: the Netlify function runs in plain Node,\n * where `server-only` throws on import.\n *\n * Setup: `MCP_TRANSPORT_SECRET` (`openssl rand -hex 32`) in every deploy\n * context, Functions scope. See the module README for the three files.\n */\n\nimport { createHmac, timingSafeEqual } from 'crypto'\nimport { readCappedBody } from '../shared/request-guards'\n\n// ============================================\n// Constants\n// ============================================\n\n/** Env var holding the relay's HMAC key. */\nexport const MCP_TRANSPORT_SECRET_ENV = 'MCP_TRANSPORT_SECRET'\n\n/** Default request header carrying the signature (and the response marker). */\nexport const DEFAULT_MCP_TRANSPORT_HEADER = 'x-site-mcp-transport'\n\n/** Default HMAC message. Changing it invalidates every signature at once. */\nexport const DEFAULT_MCP_TRANSPORT_LABEL = 'site-mcp-transport-v1'\n\n/** Path of the signed Next route the function relays to. */\nexport const MCP_INTERNAL_PATH = '/api/mcp-internal'\n\n/** Value of the marker header on every relayed response. Release checks assert it. */\nexport const MCP_RELAY_MARKER = 'netlify-rate-limited-v1'\n\n/** Largest POST body the relay forwards (tool arguments), in bytes. */\nexport const MCP_RELAY_MAX_BODY_BYTES = 64 * 1024\n\n/** Upstream timeout. Under Netlify's 60 s synchronous function limit, so the 502 is ours. */\nexport const MCP_RELAY_TIMEOUT_MS = 55_000\n\n/** Methods the MCP wire uses. Anything else gets a 405. */\nexport const MCP_RELAY_METHODS = ['GET', 'POST', 'OPTIONS', 'DELETE'] as const\n\n// ============================================\n// Types\n// ============================================\n\nexport interface McpTransportOptions {\n /**\n * Request header that carries the signature. The relay also stamps it on\n * responses with {@link MCP_RELAY_MARKER}. Must match between the function\n * and the Next routes. Default {@link DEFAULT_MCP_TRANSPORT_HEADER}.\n */\n header?: string\n /**\n * HMAC message. Must match between the function and the Next routes.\n * Default {@link DEFAULT_MCP_TRANSPORT_LABEL}.\n */\n label?: string\n /**\n * The HMAC key, or a getter for it. Default: `MCP_TRANSPORT_SECRET`, read on\n * every request (`Netlify.env` when present, else `process.env`).\n */\n secret?: string | (() => string | undefined)\n}\n\nexport type McpRouteHandler = (request: Request) => Response | Promise<Response>\n\n/** The four method handlers an MCP route exports (what `createMcpHandler` returns). */\nexport interface McpRouteHandlerSet {\n GET: McpRouteHandler\n POST: McpRouteHandler\n DELETE: McpRouteHandler\n OPTIONS: McpRouteHandler\n}\n\nexport interface ProtectMcpHandlersOptions extends McpTransportOptions {\n /**\n * Refuse unsigned requests. Default: `NODE_ENV === 'production'`, read per\n * request, so `next dev` still answers a local MCP client directly.\n */\n enforce?: boolean | (() => boolean)\n}\n\nexport interface NetlifyMcpRelayOptions extends McpTransportOptions {\n /** The signed Next route, on the same deploy. Default {@link MCP_INTERNAL_PATH}. */\n internalPath?: string\n /** Error text for the 502 when the upstream fails or times out. */\n timeoutMessage?: string\n}\n\n/** The parts of Netlify's function `context` the relay reads. */\nexport interface NetlifyRelayContext {\n deploy?: { id?: string }\n site?: { name?: string; url?: string }\n}\n\ninterface ResolvedTransport {\n header: string\n label: string\n secret: McpTransportOptions['secret']\n}\n\n// ============================================\n// Signing\n// ============================================\n\nfunction resolveTransport(options: McpTransportOptions = {}): ResolvedTransport {\n const header = (options.header ?? DEFAULT_MCP_TRANSPORT_HEADER).toLowerCase()\n const label = options.label ?? DEFAULT_MCP_TRANSPORT_LABEL\n if (!/^[a-z0-9-]+$/.test(header)) {\n throw new TypeError(`@sonordev/site-kit/mcp/transport: invalid header name ${JSON.stringify(options.header)}`)\n }\n if (!label) throw new TypeError('@sonordev/site-kit/mcp/transport: label must not be empty')\n return { header, label, secret: options.secret }\n}\n\nfunction readSecret(secret: McpTransportOptions['secret']): string | undefined {\n if (typeof secret === 'function') return secret()\n if (secret !== undefined) return secret\n const netlify = (globalThis as { Netlify?: { env?: { get(name: string): string | undefined } } }).Netlify\n return netlify?.env?.get(MCP_TRANSPORT_SECRET_ENV) || process.env[MCP_TRANSPORT_SECRET_ENV]\n}\n\n/** The signature a relayed request carries: hex HMAC-SHA256 of `label` under `secret`. */\nexport function signMcpTransport(secret: string, label: string = DEFAULT_MCP_TRANSPORT_LABEL): string {\n return createHmac('sha256', secret).update(label).digest('hex')\n}\n\nfunction verify(request: Request, transport: ResolvedTransport): boolean {\n const key = readSecret(transport.secret)\n const supplied = request.headers.get(transport.header) || ''\n if (!key || !/^[a-f0-9]{64}$/.test(supplied)) return false\n const expected = createHmac('sha256', key).update(transport.label).digest()\n return timingSafeEqual(expected, Buffer.from(supplied, 'hex'))\n}\n\n/**\n * True when the request came through the rate-limited relay: its transport\n * header holds the HMAC of `label` under `MCP_TRANSPORT_SECRET`, compared in\n * constant time. False when the secret is unset.\n */\nexport function hasMcpTransportAuthorization(request: Request, options: McpTransportOptions = {}): boolean {\n return verify(request, resolveTransport(options))\n}\n\n// ============================================\n// Next.js routes\n// ============================================\n\nfunction isEnforced(enforce: ProtectMcpHandlersOptions['enforce']): boolean {\n if (typeof enforce === 'function') return enforce()\n if (enforce !== undefined) return enforce\n return process.env.NODE_ENV === 'production'\n}\n\n/**\n * Wrap the `/api/mcp` handlers so, in production, they answer only relayed\n * (signed) requests. The public path is the function's; this closes the Next\n * handler behind it so nothing can skip the rate limit.\n *\n * @example\n * ```ts\n * // app/api/mcp/route.ts\n * export const { POST, GET, DELETE, OPTIONS } = protectMcpHandlers(\n * createMcpHandler({ server: mcpServer, baseUrl: SITE_URL, allowedOrigins: '*' }),\n * )\n * ```\n */\nexport function protectMcpHandlers(\n handlers: McpRouteHandlerSet,\n options: ProtectMcpHandlersOptions = {},\n): McpRouteHandlerSet {\n const transport = resolveTransport(options)\n const protect =\n (handler: McpRouteHandler): McpRouteHandler =>\n (request) => {\n if (isEnforced(options.enforce) && !verify(request, transport)) {\n return Response.json({ error: 'Use the public MCP endpoint' }, { status: 403 })\n }\n return handler(request)\n }\n return {\n GET: protect(handlers.GET),\n POST: protect(handlers.POST),\n DELETE: protect(handlers.DELETE),\n OPTIONS: protect(handlers.OPTIONS),\n }\n}\n\n/**\n * Handlers for `/api/mcp-internal`, the relay's target. 403 without a valid\n * signature in every environment, then dispatch by method to the `/api/mcp`\n * handlers.\n *\n * @example\n * ```ts\n * // app/api/mcp-internal/route.ts\n * import * as mcp from '../mcp/route'\n * export const { POST, GET, DELETE, OPTIONS } = createMcpInternalRoute(mcp)\n * ```\n */\nexport function createMcpInternalRoute(\n handlers: McpRouteHandlerSet,\n options: McpTransportOptions = {},\n): McpRouteHandlerSet {\n const transport = resolveTransport(options)\n const relay: McpRouteHandler = (request) => {\n if (!verify(request, transport)) return Response.json({ error: 'Forbidden' }, { status: 403 })\n switch (request.method) {\n case 'GET':\n return handlers.GET(request)\n case 'POST':\n return handlers.POST(request)\n case 'DELETE':\n return handlers.DELETE(request)\n case 'OPTIONS':\n return handlers.OPTIONS(request)\n default:\n return new Response(null, { status: 405 })\n }\n }\n return { GET: relay, POST: relay, DELETE: relay, OPTIONS: relay }\n}\n\n// ============================================\n// Netlify function\n// ============================================\n\n/**\n * The default export for `netlify/functions/mcp.mjs`. Signs the request and\n * relays it to {@link MCP_INTERNAL_PATH} on the same deploy.\n *\n * - 503 when `MCP_TRANSPORT_SECRET` is unset; 405 for methods MCP doesn't use.\n * - Strips `host` and `content-length`, overwrites any client-sent transport\n * header with the real signature.\n * - POST bodies over 64 KB get a 413 and are never forwarded.\n * - `redirect: 'error'` and a 55 s timeout; any upstream failure is a 502.\n * - Responses drop the encoding/length headers fetch already undid, and gain\n * `Cache-Control: no-store` plus the transport header set to\n * {@link MCP_RELAY_MARKER}.\n *\n * The function file must still declare its own literal `config`: Netlify\n * reads `path` and `rateLimit` statically from that file, so they can't come\n * from an import.\n *\n * @example\n * ```js\n * // netlify/functions/mcp.mjs\n * import { createNetlifyMcpRelay } from '@sonordev/site-kit/mcp/transport'\n *\n * export default createNetlifyMcpRelay()\n *\n * export const config = {\n * path: '/api/mcp',\n * rateLimit: { windowSize: 60, windowLimit: 60, aggregateBy: ['ip', 'domain'] },\n * }\n * ```\n */\nexport function createNetlifyMcpRelay(\n options: NetlifyMcpRelayOptions = {},\n): (request: Request, context: NetlifyRelayContext) => Promise<Response> {\n const transport = resolveTransport(options)\n const internalPath = options.internalPath ?? MCP_INTERNAL_PATH\n const timeoutMessage = options.timeoutMessage ?? 'MCP request timed out. Try again.'\n const unavailable = () => Response.json({ error: 'MCP is temporarily unavailable' }, { status: 503 })\n\n return async function relayMcp(request, context) {\n const key = readSecret(transport.secret)\n if (!key) return unavailable()\n if (!(MCP_RELAY_METHODS as readonly string[]).includes(request.method)) return new Response(null, { status: 405 })\n\n // context is platform-provided, never a client-controlled forwarding URL.\n // The deploy permalink keeps the relay on the deploy that took the call.\n const base =\n context?.deploy?.id && context.site?.name\n ? `https://${context.deploy.id}--${context.site.name}.netlify.app`\n : context?.site?.url\n if (!base) return unavailable()\n const target = new URL(internalPath, base)\n\n const headers = new Headers(request.headers)\n headers.delete('host')\n headers.delete('content-length')\n // set, not append: overwrite anything a client sent under this name.\n headers.set(transport.header, signMcpTransport(key, transport.label))\n\n let body: Uint8Array<ArrayBuffer> | undefined\n if (request.method === 'POST') {\n const bytes = await readCappedBody(request, MCP_RELAY_MAX_BODY_BYTES)\n if (!bytes) return Response.json({ error: 'Tool arguments are too large' }, { status: 413 })\n body = bytes\n }\n\n try {\n const response = await fetch(target, {\n method: request.method,\n headers,\n body,\n redirect: 'error',\n signal: AbortSignal.timeout(MCP_RELAY_TIMEOUT_MS),\n })\n const outgoing = new Headers(response.headers)\n // fetch decodes the upstream body; its compression/length headers no longer apply.\n for (const name of ['content-encoding', 'content-length', 'transfer-encoding']) outgoing.delete(name)\n outgoing.set('Cache-Control', 'no-store')\n outgoing.set(transport.header, MCP_RELAY_MARKER)\n return new Response(response.body, { status: response.status, headers: outgoing })\n } catch {\n return Response.json({ error: timeoutMessage }, { status: 502 })\n }\n }\n}\n"]}
|
package/dist/mcp/transport.mjs
DELETED
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
import { readCappedBody } from '../chunk-Z2URIOKG.mjs';
|
|
2
|
-
import '../chunk-BEXTDHO4.mjs';
|
|
3
|
-
import { createHmac, timingSafeEqual } from 'crypto';
|
|
4
|
-
|
|
5
|
-
var MCP_TRANSPORT_SECRET_ENV = "MCP_TRANSPORT_SECRET";
|
|
6
|
-
var DEFAULT_MCP_TRANSPORT_HEADER = "x-site-mcp-transport";
|
|
7
|
-
var DEFAULT_MCP_TRANSPORT_LABEL = "site-mcp-transport-v1";
|
|
8
|
-
var MCP_INTERNAL_PATH = "/api/mcp-internal";
|
|
9
|
-
var MCP_RELAY_MARKER = "netlify-rate-limited-v1";
|
|
10
|
-
var MCP_RELAY_MAX_BODY_BYTES = 64 * 1024;
|
|
11
|
-
var MCP_RELAY_TIMEOUT_MS = 55e3;
|
|
12
|
-
var MCP_RELAY_METHODS = ["GET", "POST", "OPTIONS", "DELETE"];
|
|
13
|
-
function resolveTransport(options = {}) {
|
|
14
|
-
const header = (options.header ?? DEFAULT_MCP_TRANSPORT_HEADER).toLowerCase();
|
|
15
|
-
const label = options.label ?? DEFAULT_MCP_TRANSPORT_LABEL;
|
|
16
|
-
if (!/^[a-z0-9-]+$/.test(header)) {
|
|
17
|
-
throw new TypeError(`@sonordev/site-kit/mcp/transport: invalid header name ${JSON.stringify(options.header)}`);
|
|
18
|
-
}
|
|
19
|
-
if (!label) throw new TypeError("@sonordev/site-kit/mcp/transport: label must not be empty");
|
|
20
|
-
return { header, label, secret: options.secret };
|
|
21
|
-
}
|
|
22
|
-
function readSecret(secret) {
|
|
23
|
-
if (typeof secret === "function") return secret();
|
|
24
|
-
if (secret !== void 0) return secret;
|
|
25
|
-
const netlify = globalThis.Netlify;
|
|
26
|
-
return netlify?.env?.get(MCP_TRANSPORT_SECRET_ENV) || process.env[MCP_TRANSPORT_SECRET_ENV];
|
|
27
|
-
}
|
|
28
|
-
function signMcpTransport(secret, label = DEFAULT_MCP_TRANSPORT_LABEL) {
|
|
29
|
-
return createHmac("sha256", secret).update(label).digest("hex");
|
|
30
|
-
}
|
|
31
|
-
function verify(request, transport) {
|
|
32
|
-
const key = readSecret(transport.secret);
|
|
33
|
-
const supplied = request.headers.get(transport.header) || "";
|
|
34
|
-
if (!key || !/^[a-f0-9]{64}$/.test(supplied)) return false;
|
|
35
|
-
const expected = createHmac("sha256", key).update(transport.label).digest();
|
|
36
|
-
return timingSafeEqual(expected, Buffer.from(supplied, "hex"));
|
|
37
|
-
}
|
|
38
|
-
function hasMcpTransportAuthorization(request, options = {}) {
|
|
39
|
-
return verify(request, resolveTransport(options));
|
|
40
|
-
}
|
|
41
|
-
function isEnforced(enforce) {
|
|
42
|
-
if (typeof enforce === "function") return enforce();
|
|
43
|
-
if (enforce !== void 0) return enforce;
|
|
44
|
-
return process.env.NODE_ENV === "production";
|
|
45
|
-
}
|
|
46
|
-
function protectMcpHandlers(handlers, options = {}) {
|
|
47
|
-
const transport = resolveTransport(options);
|
|
48
|
-
const protect = (handler) => (request) => {
|
|
49
|
-
if (isEnforced(options.enforce) && !verify(request, transport)) {
|
|
50
|
-
return Response.json({ error: "Use the public MCP endpoint" }, { status: 403 });
|
|
51
|
-
}
|
|
52
|
-
return handler(request);
|
|
53
|
-
};
|
|
54
|
-
return {
|
|
55
|
-
GET: protect(handlers.GET),
|
|
56
|
-
POST: protect(handlers.POST),
|
|
57
|
-
DELETE: protect(handlers.DELETE),
|
|
58
|
-
OPTIONS: protect(handlers.OPTIONS)
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
function createMcpInternalRoute(handlers, options = {}) {
|
|
62
|
-
const transport = resolveTransport(options);
|
|
63
|
-
const relay = (request) => {
|
|
64
|
-
if (!verify(request, transport)) return Response.json({ error: "Forbidden" }, { status: 403 });
|
|
65
|
-
switch (request.method) {
|
|
66
|
-
case "GET":
|
|
67
|
-
return handlers.GET(request);
|
|
68
|
-
case "POST":
|
|
69
|
-
return handlers.POST(request);
|
|
70
|
-
case "DELETE":
|
|
71
|
-
return handlers.DELETE(request);
|
|
72
|
-
case "OPTIONS":
|
|
73
|
-
return handlers.OPTIONS(request);
|
|
74
|
-
default:
|
|
75
|
-
return new Response(null, { status: 405 });
|
|
76
|
-
}
|
|
77
|
-
};
|
|
78
|
-
return { GET: relay, POST: relay, DELETE: relay, OPTIONS: relay };
|
|
79
|
-
}
|
|
80
|
-
function createNetlifyMcpRelay(options = {}) {
|
|
81
|
-
const transport = resolveTransport(options);
|
|
82
|
-
const internalPath = options.internalPath ?? MCP_INTERNAL_PATH;
|
|
83
|
-
const timeoutMessage = options.timeoutMessage ?? "MCP request timed out. Try again.";
|
|
84
|
-
const unavailable = () => Response.json({ error: "MCP is temporarily unavailable" }, { status: 503 });
|
|
85
|
-
return async function relayMcp(request, context) {
|
|
86
|
-
const key = readSecret(transport.secret);
|
|
87
|
-
if (!key) return unavailable();
|
|
88
|
-
if (!MCP_RELAY_METHODS.includes(request.method)) return new Response(null, { status: 405 });
|
|
89
|
-
const base = context?.deploy?.id && context.site?.name ? `https://${context.deploy.id}--${context.site.name}.netlify.app` : context?.site?.url;
|
|
90
|
-
if (!base) return unavailable();
|
|
91
|
-
const target = new URL(internalPath, base);
|
|
92
|
-
const headers = new Headers(request.headers);
|
|
93
|
-
headers.delete("host");
|
|
94
|
-
headers.delete("content-length");
|
|
95
|
-
headers.set(transport.header, signMcpTransport(key, transport.label));
|
|
96
|
-
let body;
|
|
97
|
-
if (request.method === "POST") {
|
|
98
|
-
const bytes = await readCappedBody(request, MCP_RELAY_MAX_BODY_BYTES);
|
|
99
|
-
if (!bytes) return Response.json({ error: "Tool arguments are too large" }, { status: 413 });
|
|
100
|
-
body = bytes;
|
|
101
|
-
}
|
|
102
|
-
try {
|
|
103
|
-
const response = await fetch(target, {
|
|
104
|
-
method: request.method,
|
|
105
|
-
headers,
|
|
106
|
-
body,
|
|
107
|
-
redirect: "error",
|
|
108
|
-
signal: AbortSignal.timeout(MCP_RELAY_TIMEOUT_MS)
|
|
109
|
-
});
|
|
110
|
-
const outgoing = new Headers(response.headers);
|
|
111
|
-
for (const name of ["content-encoding", "content-length", "transfer-encoding"]) outgoing.delete(name);
|
|
112
|
-
outgoing.set("Cache-Control", "no-store");
|
|
113
|
-
outgoing.set(transport.header, MCP_RELAY_MARKER);
|
|
114
|
-
return new Response(response.body, { status: response.status, headers: outgoing });
|
|
115
|
-
} catch {
|
|
116
|
-
return Response.json({ error: timeoutMessage }, { status: 502 });
|
|
117
|
-
}
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
export { DEFAULT_MCP_TRANSPORT_HEADER, DEFAULT_MCP_TRANSPORT_LABEL, MCP_INTERNAL_PATH, MCP_RELAY_MARKER, MCP_RELAY_MAX_BODY_BYTES, MCP_RELAY_METHODS, MCP_RELAY_TIMEOUT_MS, MCP_TRANSPORT_SECRET_ENV, createMcpInternalRoute, createNetlifyMcpRelay, hasMcpTransportAuthorization, protectMcpHandlers, signMcpTransport };
|
|
122
|
-
//# sourceMappingURL=transport.mjs.map
|
|
123
|
-
//# sourceMappingURL=transport.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/mcp/transport.ts"],"names":[],"mappings":"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","file":"transport.mjs","sourcesContent":["/**\n * @sonordev/site-kit/mcp/transport — the rate-limited public MCP relay\n *\n * Netlify rate-limits a native function (declarative `config.rateLimit`), never\n * a Next.js route handler. So a public MCP endpoint on Netlify takes this path:\n *\n * agent ─► /api/mcp netlify/functions/mcp.mjs, rate-limited\n * │ createNetlifyMcpRelay: signs the request\n * │ (HMAC-SHA256 of MCP_TRANSPORT_SECRET over a label)\n * ▼\n * https://<deploy-id>--<site>.netlify.app/api/mcp-internal\n * │ createMcpInternalRoute: 403 unless signed,\n * ▼ then dispatches to the /api/mcp handlers\n * app/api/mcp/route.ts protectMcpHandlers(createMcpHandler(...))\n *\n * In production the function owns /api/mcp, and the Next route behind it\n * refuses unsigned calls too, so no request reaches a tool without passing\n * the rate limit. The relay targets the deploy permalink, so a request is\n * answered by the same immutable deploy that received it, and the base URL\n * comes from the platform (`context`), never from a client header.\n *\n * Single source of truth for the relay. It replaced per-site copies in\n * upforge-nextjs and wirsch-law-nextjs (`lib/mcp/transport-auth.ts`, the\n * `protect()` wrapper, the `/api/mcp-internal` relay and the function body);\n * don't fork it back into a site.\n *\n * Node only (`crypto`), and deliberately not re-exported from the\n * `@sonordev/site-kit/mcp` barrel so that barrel stays runtime-neutral.\n * Nothing here imports `server-only`: the Netlify function runs in plain Node,\n * where `server-only` throws on import.\n *\n * Setup: `MCP_TRANSPORT_SECRET` (`openssl rand -hex 32`) in every deploy\n * context, Functions scope. See the module README for the three files.\n */\n\nimport { createHmac, timingSafeEqual } from 'crypto'\nimport { readCappedBody } from '../shared/request-guards'\n\n// ============================================\n// Constants\n// ============================================\n\n/** Env var holding the relay's HMAC key. */\nexport const MCP_TRANSPORT_SECRET_ENV = 'MCP_TRANSPORT_SECRET'\n\n/** Default request header carrying the signature (and the response marker). */\nexport const DEFAULT_MCP_TRANSPORT_HEADER = 'x-site-mcp-transport'\n\n/** Default HMAC message. Changing it invalidates every signature at once. */\nexport const DEFAULT_MCP_TRANSPORT_LABEL = 'site-mcp-transport-v1'\n\n/** Path of the signed Next route the function relays to. */\nexport const MCP_INTERNAL_PATH = '/api/mcp-internal'\n\n/** Value of the marker header on every relayed response. Release checks assert it. */\nexport const MCP_RELAY_MARKER = 'netlify-rate-limited-v1'\n\n/** Largest POST body the relay forwards (tool arguments), in bytes. */\nexport const MCP_RELAY_MAX_BODY_BYTES = 64 * 1024\n\n/** Upstream timeout. Under Netlify's 60 s synchronous function limit, so the 502 is ours. */\nexport const MCP_RELAY_TIMEOUT_MS = 55_000\n\n/** Methods the MCP wire uses. Anything else gets a 405. */\nexport const MCP_RELAY_METHODS = ['GET', 'POST', 'OPTIONS', 'DELETE'] as const\n\n// ============================================\n// Types\n// ============================================\n\nexport interface McpTransportOptions {\n /**\n * Request header that carries the signature. The relay also stamps it on\n * responses with {@link MCP_RELAY_MARKER}. Must match between the function\n * and the Next routes. Default {@link DEFAULT_MCP_TRANSPORT_HEADER}.\n */\n header?: string\n /**\n * HMAC message. Must match between the function and the Next routes.\n * Default {@link DEFAULT_MCP_TRANSPORT_LABEL}.\n */\n label?: string\n /**\n * The HMAC key, or a getter for it. Default: `MCP_TRANSPORT_SECRET`, read on\n * every request (`Netlify.env` when present, else `process.env`).\n */\n secret?: string | (() => string | undefined)\n}\n\nexport type McpRouteHandler = (request: Request) => Response | Promise<Response>\n\n/** The four method handlers an MCP route exports (what `createMcpHandler` returns). */\nexport interface McpRouteHandlerSet {\n GET: McpRouteHandler\n POST: McpRouteHandler\n DELETE: McpRouteHandler\n OPTIONS: McpRouteHandler\n}\n\nexport interface ProtectMcpHandlersOptions extends McpTransportOptions {\n /**\n * Refuse unsigned requests. Default: `NODE_ENV === 'production'`, read per\n * request, so `next dev` still answers a local MCP client directly.\n */\n enforce?: boolean | (() => boolean)\n}\n\nexport interface NetlifyMcpRelayOptions extends McpTransportOptions {\n /** The signed Next route, on the same deploy. Default {@link MCP_INTERNAL_PATH}. */\n internalPath?: string\n /** Error text for the 502 when the upstream fails or times out. */\n timeoutMessage?: string\n}\n\n/** The parts of Netlify's function `context` the relay reads. */\nexport interface NetlifyRelayContext {\n deploy?: { id?: string }\n site?: { name?: string; url?: string }\n}\n\ninterface ResolvedTransport {\n header: string\n label: string\n secret: McpTransportOptions['secret']\n}\n\n// ============================================\n// Signing\n// ============================================\n\nfunction resolveTransport(options: McpTransportOptions = {}): ResolvedTransport {\n const header = (options.header ?? DEFAULT_MCP_TRANSPORT_HEADER).toLowerCase()\n const label = options.label ?? DEFAULT_MCP_TRANSPORT_LABEL\n if (!/^[a-z0-9-]+$/.test(header)) {\n throw new TypeError(`@sonordev/site-kit/mcp/transport: invalid header name ${JSON.stringify(options.header)}`)\n }\n if (!label) throw new TypeError('@sonordev/site-kit/mcp/transport: label must not be empty')\n return { header, label, secret: options.secret }\n}\n\nfunction readSecret(secret: McpTransportOptions['secret']): string | undefined {\n if (typeof secret === 'function') return secret()\n if (secret !== undefined) return secret\n const netlify = (globalThis as { Netlify?: { env?: { get(name: string): string | undefined } } }).Netlify\n return netlify?.env?.get(MCP_TRANSPORT_SECRET_ENV) || process.env[MCP_TRANSPORT_SECRET_ENV]\n}\n\n/** The signature a relayed request carries: hex HMAC-SHA256 of `label` under `secret`. */\nexport function signMcpTransport(secret: string, label: string = DEFAULT_MCP_TRANSPORT_LABEL): string {\n return createHmac('sha256', secret).update(label).digest('hex')\n}\n\nfunction verify(request: Request, transport: ResolvedTransport): boolean {\n const key = readSecret(transport.secret)\n const supplied = request.headers.get(transport.header) || ''\n if (!key || !/^[a-f0-9]{64}$/.test(supplied)) return false\n const expected = createHmac('sha256', key).update(transport.label).digest()\n return timingSafeEqual(expected, Buffer.from(supplied, 'hex'))\n}\n\n/**\n * True when the request came through the rate-limited relay: its transport\n * header holds the HMAC of `label` under `MCP_TRANSPORT_SECRET`, compared in\n * constant time. False when the secret is unset.\n */\nexport function hasMcpTransportAuthorization(request: Request, options: McpTransportOptions = {}): boolean {\n return verify(request, resolveTransport(options))\n}\n\n// ============================================\n// Next.js routes\n// ============================================\n\nfunction isEnforced(enforce: ProtectMcpHandlersOptions['enforce']): boolean {\n if (typeof enforce === 'function') return enforce()\n if (enforce !== undefined) return enforce\n return process.env.NODE_ENV === 'production'\n}\n\n/**\n * Wrap the `/api/mcp` handlers so, in production, they answer only relayed\n * (signed) requests. The public path is the function's; this closes the Next\n * handler behind it so nothing can skip the rate limit.\n *\n * @example\n * ```ts\n * // app/api/mcp/route.ts\n * export const { POST, GET, DELETE, OPTIONS } = protectMcpHandlers(\n * createMcpHandler({ server: mcpServer, baseUrl: SITE_URL, allowedOrigins: '*' }),\n * )\n * ```\n */\nexport function protectMcpHandlers(\n handlers: McpRouteHandlerSet,\n options: ProtectMcpHandlersOptions = {},\n): McpRouteHandlerSet {\n const transport = resolveTransport(options)\n const protect =\n (handler: McpRouteHandler): McpRouteHandler =>\n (request) => {\n if (isEnforced(options.enforce) && !verify(request, transport)) {\n return Response.json({ error: 'Use the public MCP endpoint' }, { status: 403 })\n }\n return handler(request)\n }\n return {\n GET: protect(handlers.GET),\n POST: protect(handlers.POST),\n DELETE: protect(handlers.DELETE),\n OPTIONS: protect(handlers.OPTIONS),\n }\n}\n\n/**\n * Handlers for `/api/mcp-internal`, the relay's target. 403 without a valid\n * signature in every environment, then dispatch by method to the `/api/mcp`\n * handlers.\n *\n * @example\n * ```ts\n * // app/api/mcp-internal/route.ts\n * import * as mcp from '../mcp/route'\n * export const { POST, GET, DELETE, OPTIONS } = createMcpInternalRoute(mcp)\n * ```\n */\nexport function createMcpInternalRoute(\n handlers: McpRouteHandlerSet,\n options: McpTransportOptions = {},\n): McpRouteHandlerSet {\n const transport = resolveTransport(options)\n const relay: McpRouteHandler = (request) => {\n if (!verify(request, transport)) return Response.json({ error: 'Forbidden' }, { status: 403 })\n switch (request.method) {\n case 'GET':\n return handlers.GET(request)\n case 'POST':\n return handlers.POST(request)\n case 'DELETE':\n return handlers.DELETE(request)\n case 'OPTIONS':\n return handlers.OPTIONS(request)\n default:\n return new Response(null, { status: 405 })\n }\n }\n return { GET: relay, POST: relay, DELETE: relay, OPTIONS: relay }\n}\n\n// ============================================\n// Netlify function\n// ============================================\n\n/**\n * The default export for `netlify/functions/mcp.mjs`. Signs the request and\n * relays it to {@link MCP_INTERNAL_PATH} on the same deploy.\n *\n * - 503 when `MCP_TRANSPORT_SECRET` is unset; 405 for methods MCP doesn't use.\n * - Strips `host` and `content-length`, overwrites any client-sent transport\n * header with the real signature.\n * - POST bodies over 64 KB get a 413 and are never forwarded.\n * - `redirect: 'error'` and a 55 s timeout; any upstream failure is a 502.\n * - Responses drop the encoding/length headers fetch already undid, and gain\n * `Cache-Control: no-store` plus the transport header set to\n * {@link MCP_RELAY_MARKER}.\n *\n * The function file must still declare its own literal `config`: Netlify\n * reads `path` and `rateLimit` statically from that file, so they can't come\n * from an import.\n *\n * @example\n * ```js\n * // netlify/functions/mcp.mjs\n * import { createNetlifyMcpRelay } from '@sonordev/site-kit/mcp/transport'\n *\n * export default createNetlifyMcpRelay()\n *\n * export const config = {\n * path: '/api/mcp',\n * rateLimit: { windowSize: 60, windowLimit: 60, aggregateBy: ['ip', 'domain'] },\n * }\n * ```\n */\nexport function createNetlifyMcpRelay(\n options: NetlifyMcpRelayOptions = {},\n): (request: Request, context: NetlifyRelayContext) => Promise<Response> {\n const transport = resolveTransport(options)\n const internalPath = options.internalPath ?? MCP_INTERNAL_PATH\n const timeoutMessage = options.timeoutMessage ?? 'MCP request timed out. Try again.'\n const unavailable = () => Response.json({ error: 'MCP is temporarily unavailable' }, { status: 503 })\n\n return async function relayMcp(request, context) {\n const key = readSecret(transport.secret)\n if (!key) return unavailable()\n if (!(MCP_RELAY_METHODS as readonly string[]).includes(request.method)) return new Response(null, { status: 405 })\n\n // context is platform-provided, never a client-controlled forwarding URL.\n // The deploy permalink keeps the relay on the deploy that took the call.\n const base =\n context?.deploy?.id && context.site?.name\n ? `https://${context.deploy.id}--${context.site.name}.netlify.app`\n : context?.site?.url\n if (!base) return unavailable()\n const target = new URL(internalPath, base)\n\n const headers = new Headers(request.headers)\n headers.delete('host')\n headers.delete('content-length')\n // set, not append: overwrite anything a client sent under this name.\n headers.set(transport.header, signMcpTransport(key, transport.label))\n\n let body: Uint8Array<ArrayBuffer> | undefined\n if (request.method === 'POST') {\n const bytes = await readCappedBody(request, MCP_RELAY_MAX_BODY_BYTES)\n if (!bytes) return Response.json({ error: 'Tool arguments are too large' }, { status: 413 })\n body = bytes\n }\n\n try {\n const response = await fetch(target, {\n method: request.method,\n headers,\n body,\n redirect: 'error',\n signal: AbortSignal.timeout(MCP_RELAY_TIMEOUT_MS),\n })\n const outgoing = new Headers(response.headers)\n // fetch decodes the upstream body; its compression/length headers no longer apply.\n for (const name of ['content-encoding', 'content-length', 'transfer-encoding']) outgoing.delete(name)\n outgoing.set('Cache-Control', 'no-store')\n outgoing.set(transport.header, MCP_RELAY_MARKER)\n return new Response(response.body, { status: response.status, headers: outgoing })\n } catch {\n return Response.json({ error: timeoutMessage }, { status: 502 })\n }\n }\n}\n"]}
|
package/dist/mcp/types.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mcp/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CountUp.d.ts","sourceRoot":"","sources":["../../src/motion/CountUp.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAU,KAAK,WAAW,EAAE,MAAM,OAAO,CAAA;AAGhD;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,WAAW,YAAY;IAC3B,sEAAsE;IACtE,QAAQ,EAAE,MAAM,CAAA;IAChB,yCAAyC;IACzC,EAAE,CAAC,EAAE,WAAW,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,uEAAuE;IACvE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;CAC9B;AAKD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAsB9D;AAED,wBAAgB,OAAO,CAAC,EACtB,QAAQ,EAAE,IAAI,EACd,EAAW,EACX,SAAS,EACT,EAAE,EACF,QAAc,EACd,IAAmB,EACnB,KAAiB,GAClB,EAAE,YAAY,+BA4Cd"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Parallax.d.ts","sourceRoot":"","sources":["../../src/motion/Parallax.tsx"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,OAAO,CAAA;AACd,OAAO,EAAuC,KAAK,WAAW,EAAE,MAAM,UAAU,CAAA;AAEhF;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,WAAW,eAAe;IAC9B,oEAAoE;IACpE,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACpB,+BAA+B;IAC/B,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACpB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC1B,yCAAyC;IACzC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACzB,gEAAgE;IAChE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;IAC5B;;;;;OAKG;IACH,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE,OAAO,GAAE,eAAoB,GAAG,IAAI,CA+BnG;AAED,MAAM,WAAW,aAAc,SAAQ,eAAe;IACpD,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,wCAAwC;IACxC,EAAE,CAAC,EAAE,WAAW,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB,EAAE,CAAC,EAAE,MAAM,CAAA;CACZ;AAED,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAU,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,aAAa,+BASjG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Reveal.d.ts","sourceRoot":"","sources":["../../src/motion/Reveal.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAqB,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAI/F;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAA;AAEvE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,wCAAwC;IACxC,EAAE,CAAC,EAAE,WAAW,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,sEAAsE;IACtE,IAAI,CAAC,EAAE,eAAe,CAAA;IACtB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IAC1B,wEAAwE;IACxE,IAAI,CAAC,EAAE,OAAO,CAAA;IACd;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,mCAAmC;IACnC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAeD,wBAAgB,MAAM,CAAC,EACrB,QAAQ,EACR,EAAU,EACV,SAAS,EACT,KAAK,EACL,EAAE,EACF,IAAW,EACX,QAAa,EACb,KAAS,EACT,QAAc,EACd,OAAe,EACf,IAAW,EACX,SAAgB,EAChB,KAAK,EACL,OAAW,EACX,MAAuB,GACxB,EAAE,WAAW,+BA2Gb"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ScrollScene.d.ts","sourceRoot":"","sources":["../../src/motion/ScrollScene.tsx"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,OAAO,CAAA;AACd,OAAO,EAAiB,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAA;AAE3E;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,WAAW,qBAAsB,SAAQ,YAAY;IACzD,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;CACxB;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EAClC,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,KAAK,IAAI,EACjD,OAAO,GAAE,qBAA0B,GAClC,IAAI,CAkBN;AAGD,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,qBAAqB,EAAE,MAAM,GAAG,QAAQ,CAAC;IACtF,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,0CAA0C;IAC1C,EAAE,CAAC,EAAE,WAAW,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,gEAAgE;IAChE,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,aAAa,CAAA;IAC1B,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,KAAK,IAAI,CAAA;CAClD;AAED,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,MAAgB,EAChB,EAAc,EACd,SAAS,EACT,KAAK,EACL,EAAE,EACF,cAAc,EACd,UAAU,EACV,UAAU,EACV,UAAU,EACV,QAAQ,EACR,IAAI,EACJ,MAAM,GACP,EAAE,gBAAgB,+BAqBlB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/motion/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,CAAA;AAEtC;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAA;AAEhC,MAAM,WAAW,SAAS;IACxB,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAA;IACd,yEAAyE;IACzE,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,KAAK,IAAI,CAAA;AAE9D,MAAM,WAAW,YAAY;IAC3B,yEAAyE;IACzE,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AA6BD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,SAAS,EACf,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,GACrB,MAAM,CAKR;AAmHD,kFAAkF;AAClF,wBAAgB,oBAAoB,IAAI,OAAO,CAI9C;AAED;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAIpC;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,WAAW,EAChB,EAAE,EAAE,WAAW,EACf,IAAI,GAAE,YAAiB,GACtB,MAAM,IAAI,CAiCZ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"failsafe.d.ts","sourceRoot":"","sources":["../../src/motion/failsafe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAiBH;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,SAAO,GAAG,MAAM,IAAI,CAOhE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gsap.d.ts","sourceRoot":"","sources":["../../src/motion/gsap.ts"],"names":[],"mappings":"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"}
|
package/dist/motion/gsap.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/motion/CountUp.tsx","../../src/motion/gsap.ts"],"names":["useRef","pending","useEffect","prefersReducedMotion","onNoScroll"],"mappings":"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","file":"gsap.js","sourcesContent":["'use client'\n\nimport { useRef, type ElementType } from 'react'\nimport { scrollIn, useGsap } from './gsap'\n\n/**\n * <CountUp> — a stat that rolls up to its value as it scrolls into view.\n * Tier 1: it runs on `useGsap`, so it lives on the gsap subpath.\n *\n * It takes the formatted value as its text (\"$412,500\", \"38.2%\", \"24 min\")\n * and rolls the first number in it, keeping the formatting around it: the\n * same decimals, and thousands separators only if the text had them.\n *\n * The rules, all inherited from `scrollIn` / `useGsap`:\n *\n * - The server HTML is the real text, so crawlers, no-JS visitors and the\n * indexed snapshot read the true number.\n * - A stat already on screen when setup runs keeps its real number; only\n * one still below the fold is zeroed (offscreen, unseen) and rolled when\n * its top crosses `start`.\n * - The real text is restored at the end of the roll, and by the no-scroll\n * failsafe if the visitor never scrolls to it.\n * - Reduced motion never loads gsap and never touches the text.\n *\n * Replaces the per-site CountUp components.\n */\n\nexport interface CountUpProps {\n /** The formatted value exactly as it should read, e.g. \"$412,500\". */\n children: string\n /** Element to render. Default \"span\". */\n as?: ElementType\n className?: string\n id?: string\n /** Roll length in seconds. Default 1.3. */\n duration?: number\n /** gsap ease. Default \"power2.out\". */\n ease?: string\n /** ScrollTrigger start that begins the roll. Default \"top 90%\". */\n start?: string\n}\n\nexport interface CountUpParts {\n /** The number the text states. */\n value: number\n /** The text with `n` in the number's place, formatted the same way. */\n format: (n: number) => string\n}\n\n// A grouped number (1,204,500.25) or a plain one (1204.5).\nconst NUMBER = /\\d{1,3}(?:,\\d{3})+(?:\\.\\d+)?|\\d+(?:\\.\\d+)?/\n\n/**\n * Splits formatted text around its first number. Null when there's nothing\n * to roll, in which case CountUp leaves the text alone.\n */\nexport function parseCountUp(text: string): CountUpParts | null {\n const match = NUMBER.exec(text)\n if (!match) return null\n const digits = match[0]\n const value = parseFloat(digits.replace(/,/g, ''))\n if (!Number.isFinite(value)) return null\n\n const decimals = digits.includes('.') ? digits.length - digits.indexOf('.') - 1 : 0\n const useGrouping = digits.includes(',')\n const head = text.slice(0, match.index)\n const tail = text.slice(match.index + digits.length)\n return {\n value,\n format: (n) =>\n head +\n n.toLocaleString('en-US', {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n useGrouping,\n }) +\n tail,\n }\n}\n\nexport function CountUp({\n children: text,\n as = 'span',\n className,\n id,\n duration = 1.3,\n ease = 'power2.out',\n start = 'top 90%',\n}: CountUpProps) {\n const ref = useRef<HTMLElement>(null)\n const Tag = as as ElementType\n\n useGsap(\n ref,\n ({ gsap, el }) => {\n const parts = parseCountUp(text)\n if (!parts) return\n\n // Cleared on cleanup, which useGsap runs before it reverts the\n // context: a revert can replay onUpdate, and React owns the text again\n // by then.\n let live = true\n const state = { n: 0 }\n const render = () => {\n if (live) el.textContent = parts.format(state.n)\n }\n const restore = () => {\n if (live) el.textContent = text\n }\n\n const cancel = scrollIn(\n gsap,\n el,\n (tl) => {\n render()\n tl.to(state, { n: parts.value, duration, ease, onUpdate: render, onComplete: restore })\n },\n { start },\n )\n return () => {\n live = false\n cancel?.()\n }\n },\n [text, duration, ease, start],\n )\n\n return (\n <Tag ref={ref} id={id} className={className} data-sk-countup=\"\">\n {text}\n </Tag>\n )\n}\n","/**\n * @sonordev/site-kit/motion/gsap — the Upforge motion standard, tier 1.\n *\n * GSAP for the moments that earn it: sequenced timelines, SplitText,\n * Flip, MorphSVG. Requires the optional peer `gsap` (all plugins are free\n * since 3.13):\n *\n * npm i gsap\n *\n * A site that never imports this subpath never installs gsap. NOTHING\n * outside this file may import from 'gsap' — that is what keeps the tier\n * boundary real (src/motion/motion.test.tsx enforces it).\n *\n * Cost and where it goes: gsap core + ScrollTrigger is ~46KB gzipped.\n * `useGsap` loads it once per page at idle, after the page has loaded and the\n * main thread has gone quiet, so it never sits on the LCP critical path or\n * competes with hydration, and it's already in hand by the time a visitor\n * scrolls to an animated section. Setup still waits for its element to come\n * near the viewport. It must only be used BELOW the fold; first-paint content\n * renders static.\n *\n * Not included on purpose: ScrollSmoother. It drives scrolling by\n * transforming the page body, which fights native scroll, costs INP on\n * mobile, and breaks every scroll-geometry read on the page. The engine's\n * per-scene lerp gives the liquid feel without hijacking anything.\n */\n\n'use client'\n\nimport { useEffect, useRef, type DependencyList, type RefObject } from 'react'\nimport { prefersReducedMotion } from './engine'\nimport { onNoScroll } from './failsafe'\n\ntype GsapModule = typeof import('gsap')\ntype ScrollTriggerModule = typeof import('gsap/ScrollTrigger')\n\nexport type Gsap = GsapModule['gsap']\nexport type ScrollTriggerStatic = ScrollTriggerModule['ScrollTrigger']\nexport type GsapTimeline = ReturnType<Gsap['timeline']>\n\nexport interface GsapBundle {\n gsap: Gsap\n ScrollTrigger: ScrollTriggerStatic\n}\n\nlet pending: Promise<GsapBundle> | null = null\n\n/**\n * Load gsap + ScrollTrigger once, register the plugin, and share the\n * promise. Safe to call from anywhere; resolves the same bundle every time.\n */\nexport function loadGsap(): Promise<GsapBundle> {\n if (!pending) {\n pending = Promise.all([import('gsap'), import('gsap/ScrollTrigger')]).then(([g, st]) => {\n const gsap = g.gsap ?? g.default\n const ScrollTrigger = st.ScrollTrigger ?? st.default\n gsap.registerPlugin(ScrollTrigger)\n return { gsap, ScrollTrigger }\n })\n }\n return pending\n}\n\nlet idle: Promise<void> | null = null\n\n/**\n * Resolves once per page, after the `load` event, when the main thread next\n * goes idle (or after `timeout` ms of waiting for that, so a busy page still\n * gets there). requestIdleCallback where it exists; Safari, which lacks it,\n * waits a beat after load instead.\n *\n * The gate `useGsap` loads gsap behind: late enough to stay off the LCP\n * critical path and out of hydration's way, early enough that gsap is ready\n * before anyone scrolls to the section that needs it.\n */\nexport function whenIdle(timeout = 2000): Promise<void> {\n if (!idle) {\n idle = new Promise<void>(resolve => {\n const schedule = () => {\n if (typeof window.requestIdleCallback === 'function') {\n window.requestIdleCallback(() => resolve(), { timeout })\n } else {\n setTimeout(resolve, 200)\n }\n }\n if (document.readyState === 'complete') schedule()\n else window.addEventListener('load', schedule, { once: true })\n })\n }\n return idle\n}\n\n/** Dynamic imports of GSAP plugins, by name: `{ SplitText: () => import('gsap/SplitText') }`. */\nexport type GsapPluginLoaders = Record<string, () => Promise<unknown>>\n\ntype GsapContext = ReturnType<Gsap['context']>\n\nexport interface GsapSetupContext extends GsapBundle {\n /** The element the hook is attached to — use it as the ScrollTrigger trigger and the selector scope. */\n el: HTMLElement\n /**\n * The plugins asked for in `options.plugins`, loaded and registered before\n * setup runs, by the same names: `plugins.SplitText`.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n plugins: Record<string, any>\n /**\n * The gsap.context setup runs in. Anything setup starts asynchronously\n * (after an await, in a timer, in a plugin callback that fires later)\n * lands outside it, so wrap that work in `context.add(() => ...)` to have\n * it scoped and reverted on unmount with the rest.\n */\n context: GsapContext\n}\n\nexport interface UseGsapOptions {\n /**\n * Run setup once the element is this close to the viewport. Default\n * \"200px 0px\". gsap itself loads at idle regardless (see `whenIdle`), so\n * this only decides when the element's timelines and ScrollTriggers are\n * built.\n */\n near?: string\n /** \"skip\" (default) does nothing under prefers-reduced-motion; \"run\" lets setup decide. */\n reducedMotion?: 'skip' | 'run'\n /**\n * GSAP plugins to load alongside gsap, as dynamic imports keyed by name:\n *\n * { plugins: { SplitText: () => import('gsap/SplitText') } }\n *\n * They're loaded when gsap is, registered, and handed to setup as\n * `plugins`, so setup can stay synchronous. That matters: gsap.context\n * only records what runs synchronously inside it, so a plugin imported\n * from within setup did its work outside the context, unscoped and never\n * reverted on unmount (vsf-consulting-nextjs's SplitHeading had to build a\n * second context of its own to clean up).\n */\n plugins?: GsapPluginLoaders\n}\n\nconst pluginCache = new Map<string, Promise<unknown>>()\n\n/** The plugin object out of its module: the named export, else the default. */\nfunction pickPlugin(mod: unknown, name: string): unknown {\n const m = mod as Record<string, unknown> | null\n return (m && (m[name] ?? m.default)) ?? mod\n}\n\n/**\n * Load plugins by name, once per name for the page, and register them with\n * gsap. Resolves to the plugins keyed by the same names.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function loadGsapPlugins(gsap: Gsap, loaders: GsapPluginLoaders = {}): Promise<Record<string, any>> {\n const entries = await Promise.all(\n Object.entries(loaders).map(async ([name, load]) => {\n let pending = pluginCache.get(name)\n if (!pending) {\n pending = load().then(mod => pickPlugin(mod, name))\n pluginCache.set(name, pending)\n }\n return [name, await pending] as const\n }),\n )\n const plugins = Object.fromEntries(entries)\n const list = Object.values(plugins)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (list.length) gsap.registerPlugin(...(list as any[]))\n return plugins\n}\n\n/**\n * Run a setup inside a gsap.context scoped to `el`, synchronously. Split out\n * of useGsap so the contract (everything setup creates belongs to the\n * returned context, plugins included) is testable without a DOM.\n */\nexport function runGsapSetup(\n bundle: GsapBundle,\n el: HTMLElement,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n plugins: Record<string, any>,\n setup: (ctx: GsapSetupContext) => void | (() => void),\n): { context: GsapContext; cleanup: (() => void) | void } {\n let cleanup: (() => void) | void = undefined\n const context = bundle.gsap.context((self: GsapContext) => {\n cleanup = setup({ ...bundle, el, plugins, context: self })\n }, el)\n return { context, cleanup }\n}\n\n/**\n * Run a GSAP setup against an element, lazily and safely:\n *\n * - gsap loads once per page at idle (`whenIdle`), so it's ready before\n * the visitor gets there; setup runs when the element nears the viewport\n * - setup runs inside `gsap.context(el)`, so selectors are scoped and\n * everything it creates is reverted on unmount (including ScrollTriggers)\n * - plugins beyond ScrollTrigger (SplitText, Flip, MorphSVG) come in through\n * `options.plugins`, loaded before setup, so setup stays synchronous and\n * inside the context. Anything setup must still start later goes through\n * `context.add()`.\n * - the element must be server-rendered and visible; hide things inside\n * `setup` with `gsap.set`, never with a stylesheet\n *\n * @example\n * const ref = useRef<HTMLDivElement>(null)\n * useGsap(ref, ({ gsap, el }) => {\n * gsap.from(el.querySelectorAll('[data-line]'), {\n * yPercent: 100, opacity: 0, stagger: 0.06, duration: 0.8, ease: 'power3.out',\n * scrollTrigger: { trigger: el, start: 'top 80%' },\n * })\n * })\n *\n * @example With a plugin\n * useGsap(ref, ({ gsap, el, plugins: { SplitText } }) => {\n * SplitText.create(el, {\n * type: 'lines', mask: 'lines', autoSplit: true,\n * onSplit: self => gsap.from(self.lines, { yPercent: 115, stagger: 0.09, scrollTrigger: { trigger: el } }),\n * })\n * }, [], { plugins: { SplitText: () => import('gsap/SplitText') } })\n */\nexport function useGsap(\n ref: RefObject<HTMLElement | null>,\n setup: (ctx: GsapSetupContext) => void | (() => void),\n deps: DependencyList = [],\n options: UseGsapOptions = {},\n): void {\n const setupRef = useRef(setup)\n setupRef.current = setup\n // A ref, like setup: an inline `plugins` object is new every render and\n // must not re-run the effect.\n const pluginsRef = useRef(options.plugins)\n pluginsRef.current = options.plugins\n const { near = '200px 0px', reducedMotion = 'skip' } = options\n\n useEffect(() => {\n const el = ref.current\n if (!el) return\n if (reducedMotion === 'skip' && prefersReducedMotion()) return\n\n let cancelled = false\n let cleanup: (() => void) | void\n let ctx: GsapContext | undefined\n\n // gsap (and any plugins) load at idle whether or not the element is near\n // yet; setup waits for both that and the element's approach.\n const ready = whenIdle()\n .then(loadGsap)\n .then(async bundle => ({ bundle, plugins: await loadGsapPlugins(bundle.gsap, pluginsRef.current) }))\n\n const io = new IntersectionObserver(\n ([entry]) => {\n if (!entry?.isIntersecting) return\n io.disconnect()\n ready.then(({ bundle, plugins }) => {\n if (cancelled || !el.isConnected) return\n ;({ context: ctx, cleanup } = runGsapSetup(bundle, el, plugins, setupRef.current))\n })\n },\n { rootMargin: near },\n )\n io.observe(el)\n\n return () => {\n cancelled = true\n io.disconnect()\n if (typeof cleanup === 'function') cleanup()\n ctx?.revert()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ref, near, reducedMotion, ...deps])\n}\n\nexport interface ScrollInOptions {\n /** ScrollTrigger start that plays the timeline. Default \"top 90%\". */\n start?: string\n}\n\n/**\n * A below-the-fold entrance on gsap, with the rules every kit reveal keeps.\n * Call it from a `useGsap` setup (which already skips reduced motion):\n *\n * - an element already on screen when setup runs is left exactly as the\n * server rendered it and `build` never runs, so nothing above the fold\n * animates in;\n * - otherwise `build` fills a paused timeline whose from-states apply now,\n * while the element is still below the fold and unseen, and it plays\n * once the element's top crosses `start`;\n * - a visitor who never scrolls (a headless renderer) gets the finished\n * state after 2.5s through the shared failsafe (./failsafe), callbacks\n * included, so the indexed snapshot never shows a from-state.\n *\n * Returns the failsafe's cancel, for the setup to return as its cleanup.\n * `CountUp` is built on it.\n *\n * @example\n * useGsap(ref, ({ gsap, el }) =>\n * scrollIn(gsap, el, tl => tl.from(el.querySelectorAll('li'), { y: 24, opacity: 0, stagger: 0.06 })),\n * )\n */\nexport function scrollIn(\n gsap: Gsap,\n el: HTMLElement,\n build: (tl: GsapTimeline) => void,\n { start = 'top 90%' }: ScrollInOptions = {},\n): (() => void) | undefined {\n if (el.getBoundingClientRect().top < window.innerHeight) return undefined\n\n const tl = gsap.timeline({ scrollTrigger: { trigger: el, start, once: true } })\n build(tl)\n\n return onNoScroll(() => {\n tl.scrollTrigger?.kill()\n tl.progress(1)\n })\n}\n\nexport { CountUp, parseCountUp } from './CountUp'\nexport type { CountUpProps, CountUpParts } from './CountUp'\n\nexport interface ExpandCollapseOptions {\n duration?: number\n ease?: string\n}\n\n/**\n * Animate expand/collapse without mount/unmount. Content stays in the DOM\n * (so it stays indexable) with overflow hidden; gsap animates height and\n * opacity, and loads on the first toggle, not at mount.\n *\n * @example\n * const { contentRef } = useExpandCollapse(isOpen)\n * <div ref={contentRef}>{children}</div>\n */\nexport function useExpandCollapse(\n isOpen: boolean,\n options: ExpandCollapseOptions = {},\n): { contentRef: RefObject<HTMLDivElement | null> } {\n const { duration = 0.3, ease = 'power2.inOut' } = options\n const contentRef = useRef<HTMLDivElement>(null)\n const initialized = useRef(false)\n\n useEffect(() => {\n const el = contentRef.current\n if (!el) return\n\n // First render: set the resting state with inline styles, no gsap.\n if (!initialized.current) {\n initialized.current = true\n el.style.overflow = 'hidden'\n if (!isOpen) {\n el.style.height = '0px'\n el.style.opacity = '0'\n }\n return\n }\n\n let cancelled = false\n loadGsap().then(({ gsap }) => {\n if (cancelled || !el.isConnected) return\n if (prefersReducedMotion()) {\n gsap.set(el, { height: isOpen ? 'auto' : 0, opacity: isOpen ? 1 : 0 })\n el.style.overflow = isOpen ? 'visible' : 'hidden'\n return\n }\n if (isOpen) {\n gsap.to(el, {\n height: 'auto',\n opacity: 1,\n duration,\n ease,\n onComplete() {\n el.style.overflow = 'visible'\n },\n })\n } else {\n el.style.overflow = 'hidden'\n gsap.to(el, { height: 0, opacity: 0, duration: duration * 0.85, ease })\n }\n })\n return () => {\n cancelled = true\n }\n }, [isOpen, duration, ease])\n\n return { contentRef }\n}\n"]}
|
package/dist/motion/gsap.mjs
DELETED
|
@@ -1,220 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { onNoScroll } from '../chunk-IMWON7OV.mjs';
|
|
3
|
-
import { prefersReducedMotion } from '../chunk-UCMMIGC6.mjs';
|
|
4
|
-
import '../chunk-BEXTDHO4.mjs';
|
|
5
|
-
import { useRef, useEffect } from 'react';
|
|
6
|
-
import { jsx } from 'react/jsx-runtime';
|
|
7
|
-
|
|
8
|
-
var NUMBER = /\d{1,3}(?:,\d{3})+(?:\.\d+)?|\d+(?:\.\d+)?/;
|
|
9
|
-
function parseCountUp(text) {
|
|
10
|
-
const match = NUMBER.exec(text);
|
|
11
|
-
if (!match) return null;
|
|
12
|
-
const digits = match[0];
|
|
13
|
-
const value = parseFloat(digits.replace(/,/g, ""));
|
|
14
|
-
if (!Number.isFinite(value)) return null;
|
|
15
|
-
const decimals = digits.includes(".") ? digits.length - digits.indexOf(".") - 1 : 0;
|
|
16
|
-
const useGrouping = digits.includes(",");
|
|
17
|
-
const head = text.slice(0, match.index);
|
|
18
|
-
const tail = text.slice(match.index + digits.length);
|
|
19
|
-
return {
|
|
20
|
-
value,
|
|
21
|
-
format: (n) => head + n.toLocaleString("en-US", {
|
|
22
|
-
minimumFractionDigits: decimals,
|
|
23
|
-
maximumFractionDigits: decimals,
|
|
24
|
-
useGrouping
|
|
25
|
-
}) + tail
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
function CountUp({
|
|
29
|
-
children: text,
|
|
30
|
-
as = "span",
|
|
31
|
-
className,
|
|
32
|
-
id,
|
|
33
|
-
duration = 1.3,
|
|
34
|
-
ease = "power2.out",
|
|
35
|
-
start = "top 90%"
|
|
36
|
-
}) {
|
|
37
|
-
const ref = useRef(null);
|
|
38
|
-
const Tag = as;
|
|
39
|
-
useGsap(
|
|
40
|
-
ref,
|
|
41
|
-
({ gsap, el }) => {
|
|
42
|
-
const parts = parseCountUp(text);
|
|
43
|
-
if (!parts) return;
|
|
44
|
-
let live = true;
|
|
45
|
-
const state = { n: 0 };
|
|
46
|
-
const render = () => {
|
|
47
|
-
if (live) el.textContent = parts.format(state.n);
|
|
48
|
-
};
|
|
49
|
-
const restore = () => {
|
|
50
|
-
if (live) el.textContent = text;
|
|
51
|
-
};
|
|
52
|
-
const cancel = scrollIn(
|
|
53
|
-
gsap,
|
|
54
|
-
el,
|
|
55
|
-
(tl) => {
|
|
56
|
-
render();
|
|
57
|
-
tl.to(state, { n: parts.value, duration, ease, onUpdate: render, onComplete: restore });
|
|
58
|
-
},
|
|
59
|
-
{ start }
|
|
60
|
-
);
|
|
61
|
-
return () => {
|
|
62
|
-
live = false;
|
|
63
|
-
cancel?.();
|
|
64
|
-
};
|
|
65
|
-
},
|
|
66
|
-
[text, duration, ease, start]
|
|
67
|
-
);
|
|
68
|
-
return /* @__PURE__ */ jsx(Tag, { ref, id, className, "data-sk-countup": "", children: text });
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// src/motion/gsap.ts
|
|
72
|
-
var pending = null;
|
|
73
|
-
function loadGsap() {
|
|
74
|
-
if (!pending) {
|
|
75
|
-
pending = Promise.all([import('gsap'), import('gsap/ScrollTrigger')]).then(([g, st]) => {
|
|
76
|
-
const gsap = g.gsap ?? g.default;
|
|
77
|
-
const ScrollTrigger = st.ScrollTrigger ?? st.default;
|
|
78
|
-
gsap.registerPlugin(ScrollTrigger);
|
|
79
|
-
return { gsap, ScrollTrigger };
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
return pending;
|
|
83
|
-
}
|
|
84
|
-
var idle = null;
|
|
85
|
-
function whenIdle(timeout = 2e3) {
|
|
86
|
-
if (!idle) {
|
|
87
|
-
idle = new Promise((resolve) => {
|
|
88
|
-
const schedule = () => {
|
|
89
|
-
if (typeof window.requestIdleCallback === "function") {
|
|
90
|
-
window.requestIdleCallback(() => resolve(), { timeout });
|
|
91
|
-
} else {
|
|
92
|
-
setTimeout(resolve, 200);
|
|
93
|
-
}
|
|
94
|
-
};
|
|
95
|
-
if (document.readyState === "complete") schedule();
|
|
96
|
-
else window.addEventListener("load", schedule, { once: true });
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
return idle;
|
|
100
|
-
}
|
|
101
|
-
var pluginCache = /* @__PURE__ */ new Map();
|
|
102
|
-
function pickPlugin(mod, name) {
|
|
103
|
-
const m = mod;
|
|
104
|
-
return (m && (m[name] ?? m.default)) ?? mod;
|
|
105
|
-
}
|
|
106
|
-
async function loadGsapPlugins(gsap, loaders = {}) {
|
|
107
|
-
const entries = await Promise.all(
|
|
108
|
-
Object.entries(loaders).map(async ([name, load]) => {
|
|
109
|
-
let pending2 = pluginCache.get(name);
|
|
110
|
-
if (!pending2) {
|
|
111
|
-
pending2 = load().then((mod) => pickPlugin(mod, name));
|
|
112
|
-
pluginCache.set(name, pending2);
|
|
113
|
-
}
|
|
114
|
-
return [name, await pending2];
|
|
115
|
-
})
|
|
116
|
-
);
|
|
117
|
-
const plugins = Object.fromEntries(entries);
|
|
118
|
-
const list = Object.values(plugins);
|
|
119
|
-
if (list.length) gsap.registerPlugin(...list);
|
|
120
|
-
return plugins;
|
|
121
|
-
}
|
|
122
|
-
function runGsapSetup(bundle, el, plugins, setup) {
|
|
123
|
-
let cleanup = void 0;
|
|
124
|
-
const context = bundle.gsap.context((self) => {
|
|
125
|
-
cleanup = setup({ ...bundle, el, plugins, context: self });
|
|
126
|
-
}, el);
|
|
127
|
-
return { context, cleanup };
|
|
128
|
-
}
|
|
129
|
-
function useGsap(ref, setup, deps = [], options = {}) {
|
|
130
|
-
const setupRef = useRef(setup);
|
|
131
|
-
setupRef.current = setup;
|
|
132
|
-
const pluginsRef = useRef(options.plugins);
|
|
133
|
-
pluginsRef.current = options.plugins;
|
|
134
|
-
const { near = "200px 0px", reducedMotion = "skip" } = options;
|
|
135
|
-
useEffect(() => {
|
|
136
|
-
const el = ref.current;
|
|
137
|
-
if (!el) return;
|
|
138
|
-
if (reducedMotion === "skip" && prefersReducedMotion()) return;
|
|
139
|
-
let cancelled = false;
|
|
140
|
-
let cleanup;
|
|
141
|
-
let ctx;
|
|
142
|
-
const ready = whenIdle().then(loadGsap).then(async (bundle) => ({ bundle, plugins: await loadGsapPlugins(bundle.gsap, pluginsRef.current) }));
|
|
143
|
-
const io = new IntersectionObserver(
|
|
144
|
-
([entry]) => {
|
|
145
|
-
if (!entry?.isIntersecting) return;
|
|
146
|
-
io.disconnect();
|
|
147
|
-
ready.then(({ bundle, plugins }) => {
|
|
148
|
-
if (cancelled || !el.isConnected) return;
|
|
149
|
-
({ context: ctx, cleanup } = runGsapSetup(bundle, el, plugins, setupRef.current));
|
|
150
|
-
});
|
|
151
|
-
},
|
|
152
|
-
{ rootMargin: near }
|
|
153
|
-
);
|
|
154
|
-
io.observe(el);
|
|
155
|
-
return () => {
|
|
156
|
-
cancelled = true;
|
|
157
|
-
io.disconnect();
|
|
158
|
-
if (typeof cleanup === "function") cleanup();
|
|
159
|
-
ctx?.revert();
|
|
160
|
-
};
|
|
161
|
-
}, [ref, near, reducedMotion, ...deps]);
|
|
162
|
-
}
|
|
163
|
-
function scrollIn(gsap, el, build, { start = "top 90%" } = {}) {
|
|
164
|
-
if (el.getBoundingClientRect().top < window.innerHeight) return void 0;
|
|
165
|
-
const tl = gsap.timeline({ scrollTrigger: { trigger: el, start, once: true } });
|
|
166
|
-
build(tl);
|
|
167
|
-
return onNoScroll(() => {
|
|
168
|
-
tl.scrollTrigger?.kill();
|
|
169
|
-
tl.progress(1);
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
function useExpandCollapse(isOpen, options = {}) {
|
|
173
|
-
const { duration = 0.3, ease = "power2.inOut" } = options;
|
|
174
|
-
const contentRef = useRef(null);
|
|
175
|
-
const initialized = useRef(false);
|
|
176
|
-
useEffect(() => {
|
|
177
|
-
const el = contentRef.current;
|
|
178
|
-
if (!el) return;
|
|
179
|
-
if (!initialized.current) {
|
|
180
|
-
initialized.current = true;
|
|
181
|
-
el.style.overflow = "hidden";
|
|
182
|
-
if (!isOpen) {
|
|
183
|
-
el.style.height = "0px";
|
|
184
|
-
el.style.opacity = "0";
|
|
185
|
-
}
|
|
186
|
-
return;
|
|
187
|
-
}
|
|
188
|
-
let cancelled = false;
|
|
189
|
-
loadGsap().then(({ gsap }) => {
|
|
190
|
-
if (cancelled || !el.isConnected) return;
|
|
191
|
-
if (prefersReducedMotion()) {
|
|
192
|
-
gsap.set(el, { height: isOpen ? "auto" : 0, opacity: isOpen ? 1 : 0 });
|
|
193
|
-
el.style.overflow = isOpen ? "visible" : "hidden";
|
|
194
|
-
return;
|
|
195
|
-
}
|
|
196
|
-
if (isOpen) {
|
|
197
|
-
gsap.to(el, {
|
|
198
|
-
height: "auto",
|
|
199
|
-
opacity: 1,
|
|
200
|
-
duration,
|
|
201
|
-
ease,
|
|
202
|
-
onComplete() {
|
|
203
|
-
el.style.overflow = "visible";
|
|
204
|
-
}
|
|
205
|
-
});
|
|
206
|
-
} else {
|
|
207
|
-
el.style.overflow = "hidden";
|
|
208
|
-
gsap.to(el, { height: 0, opacity: 0, duration: duration * 0.85, ease });
|
|
209
|
-
}
|
|
210
|
-
});
|
|
211
|
-
return () => {
|
|
212
|
-
cancelled = true;
|
|
213
|
-
};
|
|
214
|
-
}, [isOpen, duration, ease]);
|
|
215
|
-
return { contentRef };
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
export { CountUp, loadGsap, loadGsapPlugins, parseCountUp, runGsapSetup, scrollIn, useExpandCollapse, useGsap, whenIdle };
|
|
219
|
-
//# sourceMappingURL=gsap.mjs.map
|
|
220
|
-
//# sourceMappingURL=gsap.mjs.map
|
package/dist/motion/gsap.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/motion/CountUp.tsx","../../src/motion/gsap.ts"],"names":["pending","useRef"],"mappings":"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","file":"gsap.mjs","sourcesContent":["'use client'\n\nimport { useRef, type ElementType } from 'react'\nimport { scrollIn, useGsap } from './gsap'\n\n/**\n * <CountUp> — a stat that rolls up to its value as it scrolls into view.\n * Tier 1: it runs on `useGsap`, so it lives on the gsap subpath.\n *\n * It takes the formatted value as its text (\"$412,500\", \"38.2%\", \"24 min\")\n * and rolls the first number in it, keeping the formatting around it: the\n * same decimals, and thousands separators only if the text had them.\n *\n * The rules, all inherited from `scrollIn` / `useGsap`:\n *\n * - The server HTML is the real text, so crawlers, no-JS visitors and the\n * indexed snapshot read the true number.\n * - A stat already on screen when setup runs keeps its real number; only\n * one still below the fold is zeroed (offscreen, unseen) and rolled when\n * its top crosses `start`.\n * - The real text is restored at the end of the roll, and by the no-scroll\n * failsafe if the visitor never scrolls to it.\n * - Reduced motion never loads gsap and never touches the text.\n *\n * Replaces the per-site CountUp components.\n */\n\nexport interface CountUpProps {\n /** The formatted value exactly as it should read, e.g. \"$412,500\". */\n children: string\n /** Element to render. Default \"span\". */\n as?: ElementType\n className?: string\n id?: string\n /** Roll length in seconds. Default 1.3. */\n duration?: number\n /** gsap ease. Default \"power2.out\". */\n ease?: string\n /** ScrollTrigger start that begins the roll. Default \"top 90%\". */\n start?: string\n}\n\nexport interface CountUpParts {\n /** The number the text states. */\n value: number\n /** The text with `n` in the number's place, formatted the same way. */\n format: (n: number) => string\n}\n\n// A grouped number (1,204,500.25) or a plain one (1204.5).\nconst NUMBER = /\\d{1,3}(?:,\\d{3})+(?:\\.\\d+)?|\\d+(?:\\.\\d+)?/\n\n/**\n * Splits formatted text around its first number. Null when there's nothing\n * to roll, in which case CountUp leaves the text alone.\n */\nexport function parseCountUp(text: string): CountUpParts | null {\n const match = NUMBER.exec(text)\n if (!match) return null\n const digits = match[0]\n const value = parseFloat(digits.replace(/,/g, ''))\n if (!Number.isFinite(value)) return null\n\n const decimals = digits.includes('.') ? digits.length - digits.indexOf('.') - 1 : 0\n const useGrouping = digits.includes(',')\n const head = text.slice(0, match.index)\n const tail = text.slice(match.index + digits.length)\n return {\n value,\n format: (n) =>\n head +\n n.toLocaleString('en-US', {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n useGrouping,\n }) +\n tail,\n }\n}\n\nexport function CountUp({\n children: text,\n as = 'span',\n className,\n id,\n duration = 1.3,\n ease = 'power2.out',\n start = 'top 90%',\n}: CountUpProps) {\n const ref = useRef<HTMLElement>(null)\n const Tag = as as ElementType\n\n useGsap(\n ref,\n ({ gsap, el }) => {\n const parts = parseCountUp(text)\n if (!parts) return\n\n // Cleared on cleanup, which useGsap runs before it reverts the\n // context: a revert can replay onUpdate, and React owns the text again\n // by then.\n let live = true\n const state = { n: 0 }\n const render = () => {\n if (live) el.textContent = parts.format(state.n)\n }\n const restore = () => {\n if (live) el.textContent = text\n }\n\n const cancel = scrollIn(\n gsap,\n el,\n (tl) => {\n render()\n tl.to(state, { n: parts.value, duration, ease, onUpdate: render, onComplete: restore })\n },\n { start },\n )\n return () => {\n live = false\n cancel?.()\n }\n },\n [text, duration, ease, start],\n )\n\n return (\n <Tag ref={ref} id={id} className={className} data-sk-countup=\"\">\n {text}\n </Tag>\n )\n}\n","/**\n * @sonordev/site-kit/motion/gsap — the Upforge motion standard, tier 1.\n *\n * GSAP for the moments that earn it: sequenced timelines, SplitText,\n * Flip, MorphSVG. Requires the optional peer `gsap` (all plugins are free\n * since 3.13):\n *\n * npm i gsap\n *\n * A site that never imports this subpath never installs gsap. NOTHING\n * outside this file may import from 'gsap' — that is what keeps the tier\n * boundary real (src/motion/motion.test.tsx enforces it).\n *\n * Cost and where it goes: gsap core + ScrollTrigger is ~46KB gzipped.\n * `useGsap` loads it once per page at idle, after the page has loaded and the\n * main thread has gone quiet, so it never sits on the LCP critical path or\n * competes with hydration, and it's already in hand by the time a visitor\n * scrolls to an animated section. Setup still waits for its element to come\n * near the viewport. It must only be used BELOW the fold; first-paint content\n * renders static.\n *\n * Not included on purpose: ScrollSmoother. It drives scrolling by\n * transforming the page body, which fights native scroll, costs INP on\n * mobile, and breaks every scroll-geometry read on the page. The engine's\n * per-scene lerp gives the liquid feel without hijacking anything.\n */\n\n'use client'\n\nimport { useEffect, useRef, type DependencyList, type RefObject } from 'react'\nimport { prefersReducedMotion } from './engine'\nimport { onNoScroll } from './failsafe'\n\ntype GsapModule = typeof import('gsap')\ntype ScrollTriggerModule = typeof import('gsap/ScrollTrigger')\n\nexport type Gsap = GsapModule['gsap']\nexport type ScrollTriggerStatic = ScrollTriggerModule['ScrollTrigger']\nexport type GsapTimeline = ReturnType<Gsap['timeline']>\n\nexport interface GsapBundle {\n gsap: Gsap\n ScrollTrigger: ScrollTriggerStatic\n}\n\nlet pending: Promise<GsapBundle> | null = null\n\n/**\n * Load gsap + ScrollTrigger once, register the plugin, and share the\n * promise. Safe to call from anywhere; resolves the same bundle every time.\n */\nexport function loadGsap(): Promise<GsapBundle> {\n if (!pending) {\n pending = Promise.all([import('gsap'), import('gsap/ScrollTrigger')]).then(([g, st]) => {\n const gsap = g.gsap ?? g.default\n const ScrollTrigger = st.ScrollTrigger ?? st.default\n gsap.registerPlugin(ScrollTrigger)\n return { gsap, ScrollTrigger }\n })\n }\n return pending\n}\n\nlet idle: Promise<void> | null = null\n\n/**\n * Resolves once per page, after the `load` event, when the main thread next\n * goes idle (or after `timeout` ms of waiting for that, so a busy page still\n * gets there). requestIdleCallback where it exists; Safari, which lacks it,\n * waits a beat after load instead.\n *\n * The gate `useGsap` loads gsap behind: late enough to stay off the LCP\n * critical path and out of hydration's way, early enough that gsap is ready\n * before anyone scrolls to the section that needs it.\n */\nexport function whenIdle(timeout = 2000): Promise<void> {\n if (!idle) {\n idle = new Promise<void>(resolve => {\n const schedule = () => {\n if (typeof window.requestIdleCallback === 'function') {\n window.requestIdleCallback(() => resolve(), { timeout })\n } else {\n setTimeout(resolve, 200)\n }\n }\n if (document.readyState === 'complete') schedule()\n else window.addEventListener('load', schedule, { once: true })\n })\n }\n return idle\n}\n\n/** Dynamic imports of GSAP plugins, by name: `{ SplitText: () => import('gsap/SplitText') }`. */\nexport type GsapPluginLoaders = Record<string, () => Promise<unknown>>\n\ntype GsapContext = ReturnType<Gsap['context']>\n\nexport interface GsapSetupContext extends GsapBundle {\n /** The element the hook is attached to — use it as the ScrollTrigger trigger and the selector scope. */\n el: HTMLElement\n /**\n * The plugins asked for in `options.plugins`, loaded and registered before\n * setup runs, by the same names: `plugins.SplitText`.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n plugins: Record<string, any>\n /**\n * The gsap.context setup runs in. Anything setup starts asynchronously\n * (after an await, in a timer, in a plugin callback that fires later)\n * lands outside it, so wrap that work in `context.add(() => ...)` to have\n * it scoped and reverted on unmount with the rest.\n */\n context: GsapContext\n}\n\nexport interface UseGsapOptions {\n /**\n * Run setup once the element is this close to the viewport. Default\n * \"200px 0px\". gsap itself loads at idle regardless (see `whenIdle`), so\n * this only decides when the element's timelines and ScrollTriggers are\n * built.\n */\n near?: string\n /** \"skip\" (default) does nothing under prefers-reduced-motion; \"run\" lets setup decide. */\n reducedMotion?: 'skip' | 'run'\n /**\n * GSAP plugins to load alongside gsap, as dynamic imports keyed by name:\n *\n * { plugins: { SplitText: () => import('gsap/SplitText') } }\n *\n * They're loaded when gsap is, registered, and handed to setup as\n * `plugins`, so setup can stay synchronous. That matters: gsap.context\n * only records what runs synchronously inside it, so a plugin imported\n * from within setup did its work outside the context, unscoped and never\n * reverted on unmount (vsf-consulting-nextjs's SplitHeading had to build a\n * second context of its own to clean up).\n */\n plugins?: GsapPluginLoaders\n}\n\nconst pluginCache = new Map<string, Promise<unknown>>()\n\n/** The plugin object out of its module: the named export, else the default. */\nfunction pickPlugin(mod: unknown, name: string): unknown {\n const m = mod as Record<string, unknown> | null\n return (m && (m[name] ?? m.default)) ?? mod\n}\n\n/**\n * Load plugins by name, once per name for the page, and register them with\n * gsap. Resolves to the plugins keyed by the same names.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function loadGsapPlugins(gsap: Gsap, loaders: GsapPluginLoaders = {}): Promise<Record<string, any>> {\n const entries = await Promise.all(\n Object.entries(loaders).map(async ([name, load]) => {\n let pending = pluginCache.get(name)\n if (!pending) {\n pending = load().then(mod => pickPlugin(mod, name))\n pluginCache.set(name, pending)\n }\n return [name, await pending] as const\n }),\n )\n const plugins = Object.fromEntries(entries)\n const list = Object.values(plugins)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (list.length) gsap.registerPlugin(...(list as any[]))\n return plugins\n}\n\n/**\n * Run a setup inside a gsap.context scoped to `el`, synchronously. Split out\n * of useGsap so the contract (everything setup creates belongs to the\n * returned context, plugins included) is testable without a DOM.\n */\nexport function runGsapSetup(\n bundle: GsapBundle,\n el: HTMLElement,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n plugins: Record<string, any>,\n setup: (ctx: GsapSetupContext) => void | (() => void),\n): { context: GsapContext; cleanup: (() => void) | void } {\n let cleanup: (() => void) | void = undefined\n const context = bundle.gsap.context((self: GsapContext) => {\n cleanup = setup({ ...bundle, el, plugins, context: self })\n }, el)\n return { context, cleanup }\n}\n\n/**\n * Run a GSAP setup against an element, lazily and safely:\n *\n * - gsap loads once per page at idle (`whenIdle`), so it's ready before\n * the visitor gets there; setup runs when the element nears the viewport\n * - setup runs inside `gsap.context(el)`, so selectors are scoped and\n * everything it creates is reverted on unmount (including ScrollTriggers)\n * - plugins beyond ScrollTrigger (SplitText, Flip, MorphSVG) come in through\n * `options.plugins`, loaded before setup, so setup stays synchronous and\n * inside the context. Anything setup must still start later goes through\n * `context.add()`.\n * - the element must be server-rendered and visible; hide things inside\n * `setup` with `gsap.set`, never with a stylesheet\n *\n * @example\n * const ref = useRef<HTMLDivElement>(null)\n * useGsap(ref, ({ gsap, el }) => {\n * gsap.from(el.querySelectorAll('[data-line]'), {\n * yPercent: 100, opacity: 0, stagger: 0.06, duration: 0.8, ease: 'power3.out',\n * scrollTrigger: { trigger: el, start: 'top 80%' },\n * })\n * })\n *\n * @example With a plugin\n * useGsap(ref, ({ gsap, el, plugins: { SplitText } }) => {\n * SplitText.create(el, {\n * type: 'lines', mask: 'lines', autoSplit: true,\n * onSplit: self => gsap.from(self.lines, { yPercent: 115, stagger: 0.09, scrollTrigger: { trigger: el } }),\n * })\n * }, [], { plugins: { SplitText: () => import('gsap/SplitText') } })\n */\nexport function useGsap(\n ref: RefObject<HTMLElement | null>,\n setup: (ctx: GsapSetupContext) => void | (() => void),\n deps: DependencyList = [],\n options: UseGsapOptions = {},\n): void {\n const setupRef = useRef(setup)\n setupRef.current = setup\n // A ref, like setup: an inline `plugins` object is new every render and\n // must not re-run the effect.\n const pluginsRef = useRef(options.plugins)\n pluginsRef.current = options.plugins\n const { near = '200px 0px', reducedMotion = 'skip' } = options\n\n useEffect(() => {\n const el = ref.current\n if (!el) return\n if (reducedMotion === 'skip' && prefersReducedMotion()) return\n\n let cancelled = false\n let cleanup: (() => void) | void\n let ctx: GsapContext | undefined\n\n // gsap (and any plugins) load at idle whether or not the element is near\n // yet; setup waits for both that and the element's approach.\n const ready = whenIdle()\n .then(loadGsap)\n .then(async bundle => ({ bundle, plugins: await loadGsapPlugins(bundle.gsap, pluginsRef.current) }))\n\n const io = new IntersectionObserver(\n ([entry]) => {\n if (!entry?.isIntersecting) return\n io.disconnect()\n ready.then(({ bundle, plugins }) => {\n if (cancelled || !el.isConnected) return\n ;({ context: ctx, cleanup } = runGsapSetup(bundle, el, plugins, setupRef.current))\n })\n },\n { rootMargin: near },\n )\n io.observe(el)\n\n return () => {\n cancelled = true\n io.disconnect()\n if (typeof cleanup === 'function') cleanup()\n ctx?.revert()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ref, near, reducedMotion, ...deps])\n}\n\nexport interface ScrollInOptions {\n /** ScrollTrigger start that plays the timeline. Default \"top 90%\". */\n start?: string\n}\n\n/**\n * A below-the-fold entrance on gsap, with the rules every kit reveal keeps.\n * Call it from a `useGsap` setup (which already skips reduced motion):\n *\n * - an element already on screen when setup runs is left exactly as the\n * server rendered it and `build` never runs, so nothing above the fold\n * animates in;\n * - otherwise `build` fills a paused timeline whose from-states apply now,\n * while the element is still below the fold and unseen, and it plays\n * once the element's top crosses `start`;\n * - a visitor who never scrolls (a headless renderer) gets the finished\n * state after 2.5s through the shared failsafe (./failsafe), callbacks\n * included, so the indexed snapshot never shows a from-state.\n *\n * Returns the failsafe's cancel, for the setup to return as its cleanup.\n * `CountUp` is built on it.\n *\n * @example\n * useGsap(ref, ({ gsap, el }) =>\n * scrollIn(gsap, el, tl => tl.from(el.querySelectorAll('li'), { y: 24, opacity: 0, stagger: 0.06 })),\n * )\n */\nexport function scrollIn(\n gsap: Gsap,\n el: HTMLElement,\n build: (tl: GsapTimeline) => void,\n { start = 'top 90%' }: ScrollInOptions = {},\n): (() => void) | undefined {\n if (el.getBoundingClientRect().top < window.innerHeight) return undefined\n\n const tl = gsap.timeline({ scrollTrigger: { trigger: el, start, once: true } })\n build(tl)\n\n return onNoScroll(() => {\n tl.scrollTrigger?.kill()\n tl.progress(1)\n })\n}\n\nexport { CountUp, parseCountUp } from './CountUp'\nexport type { CountUpProps, CountUpParts } from './CountUp'\n\nexport interface ExpandCollapseOptions {\n duration?: number\n ease?: string\n}\n\n/**\n * Animate expand/collapse without mount/unmount. Content stays in the DOM\n * (so it stays indexable) with overflow hidden; gsap animates height and\n * opacity, and loads on the first toggle, not at mount.\n *\n * @example\n * const { contentRef } = useExpandCollapse(isOpen)\n * <div ref={contentRef}>{children}</div>\n */\nexport function useExpandCollapse(\n isOpen: boolean,\n options: ExpandCollapseOptions = {},\n): { contentRef: RefObject<HTMLDivElement | null> } {\n const { duration = 0.3, ease = 'power2.inOut' } = options\n const contentRef = useRef<HTMLDivElement>(null)\n const initialized = useRef(false)\n\n useEffect(() => {\n const el = contentRef.current\n if (!el) return\n\n // First render: set the resting state with inline styles, no gsap.\n if (!initialized.current) {\n initialized.current = true\n el.style.overflow = 'hidden'\n if (!isOpen) {\n el.style.height = '0px'\n el.style.opacity = '0'\n }\n return\n }\n\n let cancelled = false\n loadGsap().then(({ gsap }) => {\n if (cancelled || !el.isConnected) return\n if (prefersReducedMotion()) {\n gsap.set(el, { height: isOpen ? 'auto' : 0, opacity: isOpen ? 1 : 0 })\n el.style.overflow = isOpen ? 'visible' : 'hidden'\n return\n }\n if (isOpen) {\n gsap.to(el, {\n height: 'auto',\n opacity: 1,\n duration,\n ease,\n onComplete() {\n el.style.overflow = 'visible'\n },\n })\n } else {\n el.style.overflow = 'hidden'\n gsap.to(el, { height: 0, opacity: 0, duration: duration * 0.85, ease })\n }\n })\n return () => {\n cancelled = true\n }\n }, [isOpen, duration, ease])\n\n return { contentRef }\n}\n"]}
|