@sonordev/site-kit 6.4.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 -66
- 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 +6 -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 -227
- 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 -36
- 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 -75
- 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 -426
- 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 -26
- package/dist/layout/index.d.ts +0 -1
- package/dist/layout/index.js +43 -40
- package/dist/layout/types.d.ts +19 -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 -60
- package/dist/portfolio/contract.js +2 -43
- 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 -18
- 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 -317
- 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 +8 -1
- 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 +175 -147
- package/skills/site-kit/SKILL.md +9 -3
- package/dist/AnalyticsProvider-4K5T7OQ7.mjs +0 -12
- package/dist/AnalyticsProvider-4K5T7OQ7.mjs.map +0 -1
- package/dist/AnalyticsProvider-QXZN5O6D.js +0 -33
- package/dist/AnalyticsProvider-QXZN5O6D.js.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-BUG2TOHS.mjs +0 -51
- package/dist/ArticleViewTracker-BUG2TOHS.mjs.map +0 -1
- package/dist/ArticleViewTracker-FFMHR7AY.js +0 -54
- package/dist/ArticleViewTracker-FFMHR7AY.js.map +0 -1
- package/dist/ChatWidget-CRQPBDEF.mjs +0 -17
- package/dist/ChatWidget-CRQPBDEF.mjs.map +0 -1
- package/dist/ChatWidget-XFYLVXAX.js +0 -34
- package/dist/ChatWidget-XFYLVXAX.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-S234YAT2.js +0 -21
- package/dist/EngageWidget-S234YAT2.js.map +0 -1
- package/dist/EngageWidget-SQU4T7CI.mjs +0 -12
- package/dist/EngageWidget-SQU4T7CI.mjs.map +0 -1
- package/dist/FileField-HNEBEBLB.mjs +0 -85
- package/dist/FileField-HNEBEBLB.mjs.map +0 -1
- package/dist/FileField-XG4EYAZW.js +0 -91
- package/dist/FileField-XG4EYAZW.js.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-IODREOPN.js +0 -761
- package/dist/FormSpotlight-IODREOPN.js.map +0 -1
- package/dist/FormSpotlight-VKD774PZ.mjs +0 -756
- package/dist/FormSpotlight-VKD774PZ.mjs.map +0 -1
- package/dist/FormStage-37KKZQH4.js +0 -422
- package/dist/FormStage-37KKZQH4.js.map +0 -1
- package/dist/FormStage-PRZNRYNC.mjs +0 -420
- package/dist/FormStage-PRZNRYNC.mjs.map +0 -1
- package/dist/ManagedForm-4PZOCKCV.mjs +0 -16
- package/dist/ManagedForm-4PZOCKCV.mjs.map +0 -1
- package/dist/ManagedForm-JCMEE626.js +0 -25
- package/dist/ManagedForm-JCMEE626.js.map +0 -1
- package/dist/ManagedNewsletterForm-CTC33B2U.js +0 -66
- package/dist/ManagedNewsletterForm-CTC33B2U.js.map +0 -1
- package/dist/ManagedNewsletterForm-KMZG24OE.mjs +0 -64
- package/dist/ManagedNewsletterForm-KMZG24OE.mjs.map +0 -1
- package/dist/SignalCore-YHT7WPXV.js +0 -326
- package/dist/SignalCore-YHT7WPXV.js.map +0 -1
- package/dist/SignalCore-YIPKKIUG.mjs +0 -324
- package/dist/SignalCore-YIPKKIUG.mjs.map +0 -1
- package/dist/SitemapSync-GN4OXIM2.js +0 -18
- package/dist/SitemapSync-GN4OXIM2.js.map +0 -1
- package/dist/SitemapSync-NG763CGN.mjs +0 -9
- package/dist/SitemapSync-NG763CGN.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 -14
- 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-24LFAQEG.mjs +0 -480
- package/dist/chunk-24LFAQEG.mjs.map +0 -1
- package/dist/chunk-2FEQ6TYD.mjs +0 -37
- package/dist/chunk-2FEQ6TYD.mjs.map +0 -1
- package/dist/chunk-3AOKYAZ2.js +0 -135
- package/dist/chunk-3AOKYAZ2.js.map +0 -1
- package/dist/chunk-3DWIYCQX.js +0 -30
- package/dist/chunk-3DWIYCQX.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-4BEGKFMN.js +0 -133
- package/dist/chunk-4BEGKFMN.js.map +0 -1
- package/dist/chunk-4C3INRHE.mjs +0 -1073
- package/dist/chunk-4C3INRHE.mjs.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-5BARLEAI.mjs +0 -102
- package/dist/chunk-5BARLEAI.mjs.map +0 -1
- package/dist/chunk-5F2FIM5A.mjs +0 -135
- package/dist/chunk-5F2FIM5A.mjs.map +0 -1
- package/dist/chunk-5RNAUYWE.js +0 -50
- package/dist/chunk-5RNAUYWE.js.map +0 -1
- package/dist/chunk-5SANRSX3.mjs +0 -17
- package/dist/chunk-5SANRSX3.mjs.map +0 -1
- package/dist/chunk-5T3J24K4.mjs +0 -131
- package/dist/chunk-5T3J24K4.mjs.map +0 -1
- package/dist/chunk-5W4S7XQD.js +0 -141
- package/dist/chunk-5W4S7XQD.js.map +0 -1
- package/dist/chunk-5XFFUP6D.js +0 -100
- package/dist/chunk-5XFFUP6D.js.map +0 -1
- package/dist/chunk-5YVQWLSQ.mjs +0 -47
- package/dist/chunk-5YVQWLSQ.mjs.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-6PJTLBRR.mjs +0 -11
- package/dist/chunk-6PJTLBRR.mjs.map +0 -1
- package/dist/chunk-6QPKC6XP.mjs +0 -1416
- package/dist/chunk-6QPKC6XP.mjs.map +0 -1
- package/dist/chunk-6XNEGG5B.mjs +0 -137
- package/dist/chunk-6XNEGG5B.mjs.map +0 -1
- package/dist/chunk-7K6L33BX.mjs +0 -24842
- 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-A6UYV475.mjs +0 -45
- package/dist/chunk-A6UYV475.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-AS2HUIDW.mjs +0 -16
- package/dist/chunk-AS2HUIDW.mjs.map +0 -1
- package/dist/chunk-ATPQ6264.js +0 -24860
- package/dist/chunk-B22WSN4L.mjs +0 -59
- package/dist/chunk-B22WSN4L.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-BI7DH42Z.mjs +0 -101
- package/dist/chunk-BI7DH42Z.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-C7J4XLBN.js +0 -134
- package/dist/chunk-C7J4XLBN.js.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-CIB3RHNZ.js +0 -8
- package/dist/chunk-CIB3RHNZ.js.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-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-CUZ3I6CO.js +0 -23
- package/dist/chunk-CUZ3I6CO.js.map +0 -1
- package/dist/chunk-CXAXZFFW.js +0 -157
- package/dist/chunk-CXAXZFFW.js.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-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-EWDWLY74.js +0 -158
- package/dist/chunk-EWDWLY74.js.map +0 -1
- package/dist/chunk-F2GECCK7.js +0 -483
- package/dist/chunk-F2GECCK7.js.map +0 -1
- package/dist/chunk-FCAHV5P3.mjs +0 -45
- package/dist/chunk-FCAHV5P3.mjs.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-GGGX54ZE.js +0 -8071
- package/dist/chunk-GGGX54ZE.js.map +0 -1
- package/dist/chunk-GSRT66PA.js +0 -80
- package/dist/chunk-GSRT66PA.js.map +0 -1
- package/dist/chunk-GSU6VTCZ.mjs +0 -165
- package/dist/chunk-GSU6VTCZ.mjs.map +0 -1
- package/dist/chunk-GXSSFQ5D.js +0 -1677
- package/dist/chunk-GXSSFQ5D.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-HSLPN3QK.js +0 -106
- package/dist/chunk-HSLPN3QK.js.map +0 -1
- package/dist/chunk-HTCNRTN6.js +0 -791
- package/dist/chunk-HTCNRTN6.js.map +0 -1
- package/dist/chunk-HXHDOIV6.js +0 -41
- package/dist/chunk-HXHDOIV6.js.map +0 -1
- 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-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-JONWE26J.js +0 -81
- package/dist/chunk-JONWE26J.js.map +0 -1
- package/dist/chunk-JP5WGL75.js +0 -62
- package/dist/chunk-JP5WGL75.js.map +0 -1
- 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-JXRGIE3V.mjs +0 -1669
- package/dist/chunk-JXRGIE3V.mjs.map +0 -1
- package/dist/chunk-K3PVUXKB.mjs +0 -6
- package/dist/chunk-K3PVUXKB.mjs.map +0 -1
- package/dist/chunk-KHPJ3CEL.js +0 -72
- package/dist/chunk-KHPJ3CEL.js.map +0 -1
- package/dist/chunk-KOPFFKG2.mjs +0 -132
- package/dist/chunk-KOPFFKG2.mjs.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-KZBDH5A3.js +0 -130
- package/dist/chunk-KZBDH5A3.js.map +0 -1
- package/dist/chunk-KZVSB5WE.mjs +0 -21
- package/dist/chunk-KZVSB5WE.mjs.map +0 -1
- package/dist/chunk-LPDXS2B2.mjs +0 -932
- package/dist/chunk-LPDXS2B2.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-M3JCHPK3.mjs +0 -782
- package/dist/chunk-M3JCHPK3.mjs.map +0 -1
- package/dist/chunk-M62L2N5A.mjs +0 -193
- package/dist/chunk-M62L2N5A.mjs.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-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-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-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-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-PRAHDLKT.js +0 -67
- package/dist/chunk-PRAHDLKT.js.map +0 -1
- package/dist/chunk-QAQTDHHT.mjs +0 -1102
- package/dist/chunk-QAQTDHHT.mjs.map +0 -1
- package/dist/chunk-QOKMH2TD.mjs +0 -21
- package/dist/chunk-QOKMH2TD.mjs.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-RH4XEXTK.mjs +0 -323
- 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-RQROZLH3.js +0 -1153
- package/dist/chunk-RQROZLH3.js.map +0 -1
- package/dist/chunk-S5QKNXLQ.js +0 -1430
- package/dist/chunk-S5QKNXLQ.js.map +0 -1
- package/dist/chunk-SBTA6B6Y.mjs +0 -8014
- package/dist/chunk-SBTA6B6Y.mjs.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-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-TIFVAASU.mjs +0 -14279
- package/dist/chunk-TMVKRQGJ.mjs +0 -64
- package/dist/chunk-TMVKRQGJ.mjs.map +0 -1
- package/dist/chunk-TPDDSEL3.mjs +0 -75
- package/dist/chunk-TPDDSEL3.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-U4CYO4NG.js +0 -195
- package/dist/chunk-U4CYO4NG.js.map +0 -1
- package/dist/chunk-U5NFIHLY.js +0 -158
- package/dist/chunk-U5NFIHLY.js.map +0 -1
- package/dist/chunk-UCMMIGC6.mjs +0 -156
- package/dist/chunk-UCMMIGC6.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-USQPRLSG.mjs +0 -151
- package/dist/chunk-USQPRLSG.mjs.map +0 -1
- package/dist/chunk-UZKXOZHR.js +0 -23
- package/dist/chunk-UZKXOZHR.js.map +0 -1
- package/dist/chunk-VDEQVXNV.js +0 -176
- package/dist/chunk-VDEQVXNV.js.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-VMNPLCZB.js +0 -533
- package/dist/chunk-VMNPLCZB.js.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-W7IAG5YD.js +0 -108
- package/dist/chunk-W7IAG5YD.js.map +0 -1
- package/dist/chunk-WIWHM47B.mjs +0 -525
- package/dist/chunk-WIWHM47B.mjs.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-XXSSUCJB.js +0 -14285
- package/dist/chunk-XZHR4E2D.js +0 -83
- package/dist/chunk-XZHR4E2D.js.map +0 -1
- package/dist/chunk-Y2CP5J6Q.js +0 -116
- package/dist/chunk-Y2CP5J6Q.js.map +0 -1
- package/dist/chunk-YACU35MY.js +0 -937
- package/dist/chunk-YACU35MY.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-YRKWJCML.mjs +0 -150
- package/dist/chunk-YRKWJCML.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-ZEBOOUBP.mjs +0 -128
- package/dist/chunk-ZEBOOUBP.mjs.map +0 -1
- package/dist/chunk-ZN4HBK5C.mjs +0 -17
- package/dist/chunk-ZN4HBK5C.mjs.map +0 -1
- package/dist/chunk-ZOBUA65N.js +0 -1079
- package/dist/chunk-ZOBUA65N.js.map +0 -1
- package/dist/chunk-ZUQSVCMD.js +0 -325
- package/dist/chunk-ZVBLXXNJ.mjs +0 -53
- package/dist/chunk-ZVBLXXNJ.mjs.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 -15
- 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 -50
- 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 -11
- 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 -172
- 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 -18
- 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 -105
- package/dist/layout/index.mjs.map +0 -1
- package/dist/layout/types.d.ts.map +0 -1
- package/dist/lib-6GWWPDJR.js +0 -28
- package/dist/lib-BD4KKQBI.mjs +0 -4
- package/dist/lib-N5PD6JNJ.mjs +0 -3
- package/dist/lib-WFB5RLEQ.js +0 -31
- 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 -38
- 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 -10
- 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 -701
- 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-CHXXWO72.mjs +0 -524
- package/dist/web-vitals.attribution-CHXXWO72.mjs.map +0 -1
- package/dist/web-vitals.attribution-SQVZNHN3.js +0 -535
- package/dist/web-vitals.attribution-SQVZNHN3.js.map +0 -1
- package/dist/writeLLMsTxt-IYJILIU3.mjs +0 -11
- package/dist/writeLLMsTxt-SQG4B63X.js +0 -20
- package/scripts/postinstall.cjs +0 -67
package/dist/og/route.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/og/route-fit.ts","../../src/og/route.tsx"],"names":["OG_WIDTH","OG_HEIGHT","TITLE_MAX_PX","TITLE_MIN_PX","jsxs","jsx","barTextColor"],"mappings":"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","file":"route.js","sourcesContent":["/**\n * @sonordev/site-kit/og — title fitting for the runtime (Satori) card.\n *\n * The build-time card is fitted in the page: Chrome measures the rendered\n * title and steps it down until it fits (template.ts). The runtime card is\n * Satori, which has no DOM to measure, so its title sat at a fixed 84px,\n * uppercase, with no fitting. Beside the 430px photo that holds about 11\n * characters a line, so a real post title ran off the bottom of the card.\n * watsonhac.com, reinhart and vsf-consulting-nextjs each worked around it by\n * dropping the photo past a hand-picked length (40 or 50 characters).\n *\n * This does what the build-time fitter does, from an estimate instead of a\n * measurement: the same size range (TITLE_MAX_PX down to TITLE_MIN_PX, in 2px\n * steps), word-wrapped at an estimated glyph width against the real column\n * width and the height the kicker, subtitle and bar leave. When the title\n * can't fit beside the photo even at the floor, the photo goes and the title\n * gets the full width.\n *\n * The estimate is deliberately wide (uppercase, bold-ish) so an unusual\n * face errs toward a smaller title, never an overflowing one, and the title\n * box clips at its height as the backstop.\n *\n * Pure: no DOM, no Node built-ins. Geometry constants are the card's own\n * (route.tsx imports them), so the two can't drift.\n */\n\nimport { OG_HEIGHT, OG_WIDTH, TITLE_MAX_PX, TITLE_MIN_PX } from './config'\n\n/** The runtime card's layout, in px. route.tsx renders exactly this. */\nexport const ROUTE_CARD = {\n padX: 68,\n gap: 48,\n photoWidth: 430,\n photoHeight: 470,\n barHeight: 74,\n /** Breathing room above and below the copy column. */\n padY: 44,\n kickerPx: 24,\n kickerGap: 18,\n subtitlePx: 30,\n subtitleGap: 20,\n subtitleLineHeight: 1.3,\n titleLineHeight: 1.02,\n} as const\n\n/**\n * Average advance of an UPPERCASE glyph, in em. Calibrated against next/og's\n * bundled face and a bold sans; errs wide. Narrow glyphs are counted\n * separately so \"ILLINOIS\" isn't treated like \"MMMMMMMM\".\n */\nconst UPPER_EM = 0.68\nconst NARROW_EM = 0.32\nconst SPACE_EM = 0.3\n/** Mixed-case body text (the subtitle), in em. */\nconst BODY_EM = 0.52\n/** The kicker is uppercase with 6px letter spacing at 24px. */\nconst KICKER_EM = 0.72 + 6 / 24\n\nconst NARROW = /[IJ1.,:;'’!|()\\-]/\n\n/** Estimated width of `text` set uppercase at `px`. */\nexport function uppercaseWidth(text: string, px: number): number {\n let em = 0\n for (const ch of text.toUpperCase()) {\n em += ch === ' ' ? SPACE_EM : NARROW.test(ch) ? NARROW_EM : UPPER_EM\n }\n return em * px\n}\n\n/**\n * Lines `text` wraps to in a column `width` px wide, greedy by word, the way\n * the browser and Satori wrap. `\\n` is a hard break. Returns Infinity when a\n * single word is wider than the column: it can't wrap, so no line count fits.\n */\nexport function wrappedLines(\n text: string,\n width: number,\n measure: (s: string) => number,\n): number {\n let lines = 0\n for (const paragraph of text.split('\\n')) {\n const words = paragraph.split(/\\s+/).filter(Boolean)\n if (!words.length) {\n lines++\n continue\n }\n let current = ''\n for (const word of words) {\n if (measure(word) > width) return Infinity\n const next = current ? `${current} ${word}` : word\n if (current && measure(next) > width) {\n lines++\n current = word\n } else {\n current = next\n }\n }\n lines++\n }\n return lines\n}\n\nexport interface RouteFitInput {\n title: string\n kicker?: string\n subtitle?: string\n /** A photo was offered. */\n photo: boolean\n /** The card has a bottom bar. */\n bar: boolean\n}\n\nexport interface RouteFit {\n /** Title size in px. */\n titlePx: number\n /** Keep the photo. False when the title only fits at full width. */\n photo: boolean\n /** Height the title box may use; route.tsx clips the title to it. */\n titleMaxHeight: number\n /** The title fits at `titlePx` by the estimate (false only at the floor, full width). */\n fits: boolean\n}\n\nfunction columnWidth(photo: boolean): number {\n const inner = OG_WIDTH - ROUTE_CARD.padX * 2\n return photo ? inner - ROUTE_CARD.photoWidth - ROUTE_CARD.gap : inner\n}\n\n/** Height left for the title once the kicker and subtitle have theirs. */\nfunction titleBudget(input: RouteFitInput, width: number): number {\n const c = ROUTE_CARD\n let height = OG_HEIGHT - (input.bar ? c.barHeight : 0) - c.padY * 2\n if (input.kicker) {\n const lines = wrappedLines(input.kicker, width, s => s.length * KICKER_EM * c.kickerPx)\n height -= Math.min(lines, 2) * c.kickerPx * 1.2 + c.kickerGap\n }\n if (input.subtitle) {\n const lines = wrappedLines(input.subtitle, width, s => s.length * BODY_EM * c.subtitlePx)\n height -= Math.min(lines, 3) * c.subtitlePx * c.subtitleLineHeight + c.subtitleGap\n }\n return height\n}\n\n/** Largest title size that fits `width`, or null when none down to the floor does. */\nfunction largestFit(input: RouteFitInput, photo: boolean): { px: number; budget: number } | null {\n const width = columnWidth(photo)\n const budget = titleBudget(input, width)\n for (let px = TITLE_MAX_PX; px >= TITLE_MIN_PX; px -= 2) {\n const lines = wrappedLines(input.title, width, s => uppercaseWidth(s, px))\n if (lines * px * ROUTE_CARD.titleLineHeight <= budget) return { px, budget }\n }\n return null\n}\n\n/**\n * Size the title, and decide whether the photo stays.\n *\n * Beside the photo first, since the photo is the page's own image and worth\n * keeping. If even the floor size doesn't fit there, drop the photo and fit\n * the full width. If that fails too, the title sits at the floor and clips.\n */\nexport function fitRouteTitle(input: RouteFitInput): RouteFit {\n if (input.photo) {\n const withPhoto = largestFit(input, true)\n if (withPhoto) {\n return { titlePx: withPhoto.px, photo: true, titleMaxHeight: withPhoto.budget, fits: true }\n }\n }\n const full = largestFit(input, false)\n if (full) return { titlePx: full.px, photo: false, titleMaxHeight: full.budget, fits: true }\n return {\n titlePx: TITLE_MIN_PX,\n photo: false,\n titleMaxHeight: titleBudget(input, columnWidth(false)),\n fits: false,\n }\n}\n","/**\n * @sonordev/site-kit/og/route — tier 2: per-entity runtime OG cards.\n *\n * `sonor-setup og` covers the build-time cards: the site card and one per\n * route. This covers the cards that must vary per URL and can't wait for a\n * rebuild — one per article, per event, per product — rendered on demand\n * with next/og (Satori).\n *\n * TWO SHAPES, ONE CARD:\n *\n * `createOgImage` is the metadata file convention, and the one to reach for.\n * Next calls an `opengraph-image.tsx` default export with `{ params }` and\n * wires og:image and twitter:image for the page by itself, and `sonor-setup\n * og` sees the file and leaves the folder alone:\n *\n * ```tsx\n * // app/blog/[slug]/opengraph-image.tsx\n * import { createOgImage } from '@sonordev/site-kit/og/route'\n * import { getArticle } from '@sonordev/site-kit/articles/server'\n *\n * export { size, contentType } from '@sonordev/site-kit/og/route'\n * export const alt = 'From the Acme article'\n *\n * export default createOgImage<{ slug: string }>(async ({ slug }) => {\n * const post = await getArticle(slug)\n * if (!post) return null // 404: a bad slug never renders a card\n * return {\n * theme: { bg: '#111110', text: '#faf6f0', accent: '#ad1d25' },\n * kicker: 'From the publication',\n * title: post.title,\n * photoUrl: post.featured_image, // absolute URL (Satori requirement)\n * bar: 'yourdomain.com',\n * }\n * })\n * ```\n *\n * The page then passes `images: false` to generateArticleMetadata: declared\n * images beat the file convention.\n *\n * `createOgImageRoute` is a plain route handler, `GET(request, { params })`,\n * for a card served at a URL of your choosing (`app/og/[slug]/route.tsx`).\n * Next doesn't wire it into metadata; the page declares it.\n *\n * Sites needed an adapter between the two before `createOgImage` existed\n * (watsonhac.com, reinhart, vsf-consulting-nextjs: a default export that\n * built a dummy Request to call the GET handler).\n *\n * SATORI CONSTRAINTS (why this is not the static template): flexbox-only CSS\n * subset, no external stylesheets, images must be absolute URLs or data URIs,\n * and fonts must be provided as ArrayBuffers via `fonts` — Satori cannot load\n * Google Fonts at runtime. Without fonts it falls back to Satori's default\n * face; brand-critical cards should pass font data (fetch the TTF once at\n * module init and reuse the promise).\n *\n * TITLE FITTING: Satori can't measure, so the title is sized from an estimate\n * (og/route-fit.ts) over the same range the build-time card uses, and the\n * photo is dropped when the title can't fit beside it. Long post titles no\n * longer run off the card.\n */\n\nimport React from 'react'\nimport { OG_HEIGHT, OG_WIDTH } from './config'\nimport { barTextColor } from './contrast'\nimport { fitRouteTitle, ROUTE_CARD } from './route-fit'\n\nexport interface OgRouteTheme {\n bg: string\n text: string\n accent: string\n muted?: string\n /** og.config.ts's surface color. Only used as a bar-text candidate. */\n surface?: string\n /**\n * Bottom-bar text, set on `accent`. Defaults to the first of `surface`,\n * `bg`, `text` that reaches WCAG AA for large text (3:1) against the\n * accent. It used to be `text`, which is unreadable wherever text and\n * accent are both strong (navy on crimson).\n */\n barText?: string\n}\n\nexport interface OgRouteCard {\n /** og.config.ts's `theme` can be passed as is. */\n theme: OgRouteTheme\n kicker?: string\n title: string\n subtitle?: string\n /** Absolute URL (Satori requirement) of the page's own image. */\n photoUrl?: string\n /** Bottom-bar text, e.g. the domain. */\n bar?: string\n}\n\nexport interface OgRouteFont {\n name: string\n data: ArrayBuffer\n weight?: number\n style?: 'normal' | 'italic'\n}\n\nexport interface OgImageOptions {\n fonts?: OgRouteFont[]\n}\n\n/** For `export { size, contentType } from '@sonordev/site-kit/og/route'` in an opengraph-image file. */\nexport const size = { width: OG_WIDTH, height: OG_HEIGHT }\nexport const contentType = 'image/png'\n\ntype Resolver<Ctx> = (req: Request, ctx: Ctx) => Promise<OgRouteCard | null> | OgRouteCard | null\n\n/**\n * Satori-safe element tree — exported for tests and for sites that want to\n * extend it inside their own ImageResponse.\n */\nexport function ogRouteElement(card: OgRouteCard): React.ReactElement {\n const { theme } = card\n const muted = theme.muted || theme.text\n // Only an absolute URL (or data URI) renders in Satori; anything else would\n // throw inside the render, so it's treated as no photo.\n const hasPhoto = !!card.photoUrl && /^(https?:|data:)/.test(card.photoUrl)\n const fit = fitRouteTitle({\n title: card.title,\n kicker: card.kicker,\n subtitle: card.subtitle,\n photo: hasPhoto,\n bar: !!card.bar,\n })\n const titleLine = fit.titlePx * ROUTE_CARD.titleLineHeight\n // Clip on a whole line, so an estimate that ran short loses a line cleanly\n // instead of spilling onto the bar.\n const titleMaxHeight = Math.max(1, Math.floor(fit.titleMaxHeight / titleLine)) * titleLine\n\n return (\n <div\n style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n backgroundColor: theme.bg,\n color: theme.text,\n fontSize: 32,\n }}\n >\n <div\n style={{\n display: 'flex',\n flex: 1,\n alignItems: 'center',\n padding: `0 ${ROUTE_CARD.padX}px`,\n gap: ROUTE_CARD.gap,\n minHeight: 0,\n }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', flex: 1, minWidth: 0 }}>\n {card.kicker ? (\n <div\n style={{\n fontSize: ROUTE_CARD.kickerPx,\n letterSpacing: 6,\n textTransform: 'uppercase',\n color: theme.accent,\n marginBottom: ROUTE_CARD.kickerGap,\n fontWeight: 700,\n }}\n >\n {card.kicker}\n </div>\n ) : null}\n <div\n style={{\n display: 'flex',\n fontSize: fit.titlePx,\n fontWeight: 800,\n lineHeight: ROUTE_CARD.titleLineHeight,\n textTransform: 'uppercase',\n maxHeight: titleMaxHeight,\n overflow: 'hidden',\n }}\n >\n {card.title}\n </div>\n {card.subtitle ? (\n <div\n style={{\n fontSize: ROUTE_CARD.subtitlePx,\n marginTop: ROUTE_CARD.subtitleGap,\n color: muted,\n lineHeight: ROUTE_CARD.subtitleLineHeight,\n }}\n >\n {card.subtitle}\n </div>\n ) : null}\n </div>\n {hasPhoto && fit.photo ? (\n <img\n src={card.photoUrl}\n width={ROUTE_CARD.photoWidth}\n height={ROUTE_CARD.photoHeight}\n style={{ borderRadius: 24, objectFit: 'cover' }}\n />\n ) : null}\n </div>\n {card.bar ? (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: ROUTE_CARD.barHeight,\n backgroundColor: theme.accent,\n color: barTextColor(theme),\n fontSize: 30,\n fontWeight: 800,\n letterSpacing: 3,\n textTransform: 'uppercase',\n }}\n >\n {card.bar}\n </div>\n ) : null}\n </div>\n )\n}\n\n/**\n * Render a card, or 404 for null. Single source of truth for both factories:\n * the file convention and the route handler differ only in how they're called.\n */\nasync function renderCard(card: OgRouteCard | null, options: OgImageOptions): Promise<Response> {\n if (!card) return new Response('Not found', { status: 404 })\n\n // next/og is imported lazily so this module stays importable in test/node\n // contexts that lack the Next server runtime.\n const { ImageResponse } = await import('next/og')\n return new ImageResponse(ogRouteElement(card), {\n ...size,\n ...(options.fonts?.length ? { fonts: options.fonts as any } : {}),\n })\n}\n\n/**\n * Metadata file-convention factory, for `export default` from an\n * `opengraph-image.tsx` (or `twitter-image.tsx`). Next calls it with\n * `{ params }` (a promise on Next 15+) and, with `generateImageMetadata`, an\n * `id`. The resolver gets both already awaited. Return null for a 404.\n */\nexport function createOgImage<Params extends Record<string, string | string[]> = Record<string, string>>(\n resolve: (params: Params, ctx: { id?: string }) => Promise<OgRouteCard | null> | OgRouteCard | null,\n options: OgImageOptions = {},\n) {\n return async function Image(props: {\n params: Params | Promise<Params>\n id?: string | Promise<string>\n }): Promise<Response> {\n const params = await props.params\n const id = props.id === undefined ? undefined : await props.id\n return renderCard(await resolve(params, { id }), options)\n }\n}\n\n/**\n * Route handler factory, `export const GET` from a `route.tsx`. Returns 404\n * when the resolver returns null, so a bad slug never renders a broken card.\n *\n * Next doesn't wire a route handler into metadata. For a card Next should\n * attach to the page by itself, use `createOgImage` in `opengraph-image.tsx`.\n */\nexport function createOgImageRoute<Ctx = { params: Promise<Record<string, string>> }>(\n resolve: Resolver<Ctx>,\n options: OgImageOptions = {},\n) {\n return async function GET(req: Request, ctx: Ctx): Promise<Response> {\n return renderCard(await resolve(req, ctx), options)\n }\n}\n"]}
|
package/dist/og/route.mjs
DELETED
|
@@ -1,239 +0,0 @@
|
|
|
1
|
-
import { OG_HEIGHT, OG_WIDTH, barTextColor, TITLE_MIN_PX, TITLE_MAX_PX } from '../chunk-YU7QZ3PP.mjs';
|
|
2
|
-
import '../chunk-BEXTDHO4.mjs';
|
|
3
|
-
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
4
|
-
|
|
5
|
-
// src/og/route-fit.ts
|
|
6
|
-
var ROUTE_CARD = {
|
|
7
|
-
padX: 68,
|
|
8
|
-
gap: 48,
|
|
9
|
-
photoWidth: 430,
|
|
10
|
-
photoHeight: 470,
|
|
11
|
-
barHeight: 74,
|
|
12
|
-
/** Breathing room above and below the copy column. */
|
|
13
|
-
padY: 44,
|
|
14
|
-
kickerPx: 24,
|
|
15
|
-
kickerGap: 18,
|
|
16
|
-
subtitlePx: 30,
|
|
17
|
-
subtitleGap: 20,
|
|
18
|
-
subtitleLineHeight: 1.3,
|
|
19
|
-
titleLineHeight: 1.02
|
|
20
|
-
};
|
|
21
|
-
var UPPER_EM = 0.68;
|
|
22
|
-
var NARROW_EM = 0.32;
|
|
23
|
-
var SPACE_EM = 0.3;
|
|
24
|
-
var BODY_EM = 0.52;
|
|
25
|
-
var KICKER_EM = 0.72 + 6 / 24;
|
|
26
|
-
var NARROW = /[IJ1.,:;'’!|()\-]/;
|
|
27
|
-
function uppercaseWidth(text, px) {
|
|
28
|
-
let em = 0;
|
|
29
|
-
for (const ch of text.toUpperCase()) {
|
|
30
|
-
em += ch === " " ? SPACE_EM : NARROW.test(ch) ? NARROW_EM : UPPER_EM;
|
|
31
|
-
}
|
|
32
|
-
return em * px;
|
|
33
|
-
}
|
|
34
|
-
function wrappedLines(text, width, measure) {
|
|
35
|
-
let lines = 0;
|
|
36
|
-
for (const paragraph of text.split("\n")) {
|
|
37
|
-
const words = paragraph.split(/\s+/).filter(Boolean);
|
|
38
|
-
if (!words.length) {
|
|
39
|
-
lines++;
|
|
40
|
-
continue;
|
|
41
|
-
}
|
|
42
|
-
let current = "";
|
|
43
|
-
for (const word of words) {
|
|
44
|
-
if (measure(word) > width) return Infinity;
|
|
45
|
-
const next = current ? `${current} ${word}` : word;
|
|
46
|
-
if (current && measure(next) > width) {
|
|
47
|
-
lines++;
|
|
48
|
-
current = word;
|
|
49
|
-
} else {
|
|
50
|
-
current = next;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
lines++;
|
|
54
|
-
}
|
|
55
|
-
return lines;
|
|
56
|
-
}
|
|
57
|
-
function columnWidth(photo) {
|
|
58
|
-
const inner = OG_WIDTH - ROUTE_CARD.padX * 2;
|
|
59
|
-
return photo ? inner - ROUTE_CARD.photoWidth - ROUTE_CARD.gap : inner;
|
|
60
|
-
}
|
|
61
|
-
function titleBudget(input, width) {
|
|
62
|
-
const c = ROUTE_CARD;
|
|
63
|
-
let height = OG_HEIGHT - (input.bar ? c.barHeight : 0) - c.padY * 2;
|
|
64
|
-
if (input.kicker) {
|
|
65
|
-
const lines = wrappedLines(input.kicker, width, (s) => s.length * KICKER_EM * c.kickerPx);
|
|
66
|
-
height -= Math.min(lines, 2) * c.kickerPx * 1.2 + c.kickerGap;
|
|
67
|
-
}
|
|
68
|
-
if (input.subtitle) {
|
|
69
|
-
const lines = wrappedLines(input.subtitle, width, (s) => s.length * BODY_EM * c.subtitlePx);
|
|
70
|
-
height -= Math.min(lines, 3) * c.subtitlePx * c.subtitleLineHeight + c.subtitleGap;
|
|
71
|
-
}
|
|
72
|
-
return height;
|
|
73
|
-
}
|
|
74
|
-
function largestFit(input, photo) {
|
|
75
|
-
const width = columnWidth(photo);
|
|
76
|
-
const budget = titleBudget(input, width);
|
|
77
|
-
for (let px = TITLE_MAX_PX; px >= TITLE_MIN_PX; px -= 2) {
|
|
78
|
-
const lines = wrappedLines(input.title, width, (s) => uppercaseWidth(s, px));
|
|
79
|
-
if (lines * px * ROUTE_CARD.titleLineHeight <= budget) return { px, budget };
|
|
80
|
-
}
|
|
81
|
-
return null;
|
|
82
|
-
}
|
|
83
|
-
function fitRouteTitle(input) {
|
|
84
|
-
if (input.photo) {
|
|
85
|
-
const withPhoto = largestFit(input, true);
|
|
86
|
-
if (withPhoto) {
|
|
87
|
-
return { titlePx: withPhoto.px, photo: true, titleMaxHeight: withPhoto.budget, fits: true };
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
const full = largestFit(input, false);
|
|
91
|
-
if (full) return { titlePx: full.px, photo: false, titleMaxHeight: full.budget, fits: true };
|
|
92
|
-
return {
|
|
93
|
-
titlePx: TITLE_MIN_PX,
|
|
94
|
-
photo: false,
|
|
95
|
-
titleMaxHeight: titleBudget(input, columnWidth(false)),
|
|
96
|
-
fits: false
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
var size = { width: OG_WIDTH, height: OG_HEIGHT };
|
|
100
|
-
var contentType = "image/png";
|
|
101
|
-
function ogRouteElement(card) {
|
|
102
|
-
const { theme } = card;
|
|
103
|
-
const muted = theme.muted || theme.text;
|
|
104
|
-
const hasPhoto = !!card.photoUrl && /^(https?:|data:)/.test(card.photoUrl);
|
|
105
|
-
const fit = fitRouteTitle({
|
|
106
|
-
title: card.title,
|
|
107
|
-
kicker: card.kicker,
|
|
108
|
-
subtitle: card.subtitle,
|
|
109
|
-
photo: hasPhoto,
|
|
110
|
-
bar: !!card.bar
|
|
111
|
-
});
|
|
112
|
-
const titleLine = fit.titlePx * ROUTE_CARD.titleLineHeight;
|
|
113
|
-
const titleMaxHeight = Math.max(1, Math.floor(fit.titleMaxHeight / titleLine)) * titleLine;
|
|
114
|
-
return /* @__PURE__ */ jsxs(
|
|
115
|
-
"div",
|
|
116
|
-
{
|
|
117
|
-
style: {
|
|
118
|
-
width: "100%",
|
|
119
|
-
height: "100%",
|
|
120
|
-
display: "flex",
|
|
121
|
-
flexDirection: "column",
|
|
122
|
-
backgroundColor: theme.bg,
|
|
123
|
-
color: theme.text,
|
|
124
|
-
fontSize: 32
|
|
125
|
-
},
|
|
126
|
-
children: [
|
|
127
|
-
/* @__PURE__ */ jsxs(
|
|
128
|
-
"div",
|
|
129
|
-
{
|
|
130
|
-
style: {
|
|
131
|
-
display: "flex",
|
|
132
|
-
flex: 1,
|
|
133
|
-
alignItems: "center",
|
|
134
|
-
padding: `0 ${ROUTE_CARD.padX}px`,
|
|
135
|
-
gap: ROUTE_CARD.gap,
|
|
136
|
-
minHeight: 0
|
|
137
|
-
},
|
|
138
|
-
children: [
|
|
139
|
-
/* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", flex: 1, minWidth: 0 }, children: [
|
|
140
|
-
card.kicker ? /* @__PURE__ */ jsx(
|
|
141
|
-
"div",
|
|
142
|
-
{
|
|
143
|
-
style: {
|
|
144
|
-
fontSize: ROUTE_CARD.kickerPx,
|
|
145
|
-
letterSpacing: 6,
|
|
146
|
-
textTransform: "uppercase",
|
|
147
|
-
color: theme.accent,
|
|
148
|
-
marginBottom: ROUTE_CARD.kickerGap,
|
|
149
|
-
fontWeight: 700
|
|
150
|
-
},
|
|
151
|
-
children: card.kicker
|
|
152
|
-
}
|
|
153
|
-
) : null,
|
|
154
|
-
/* @__PURE__ */ jsx(
|
|
155
|
-
"div",
|
|
156
|
-
{
|
|
157
|
-
style: {
|
|
158
|
-
display: "flex",
|
|
159
|
-
fontSize: fit.titlePx,
|
|
160
|
-
fontWeight: 800,
|
|
161
|
-
lineHeight: ROUTE_CARD.titleLineHeight,
|
|
162
|
-
textTransform: "uppercase",
|
|
163
|
-
maxHeight: titleMaxHeight,
|
|
164
|
-
overflow: "hidden"
|
|
165
|
-
},
|
|
166
|
-
children: card.title
|
|
167
|
-
}
|
|
168
|
-
),
|
|
169
|
-
card.subtitle ? /* @__PURE__ */ jsx(
|
|
170
|
-
"div",
|
|
171
|
-
{
|
|
172
|
-
style: {
|
|
173
|
-
fontSize: ROUTE_CARD.subtitlePx,
|
|
174
|
-
marginTop: ROUTE_CARD.subtitleGap,
|
|
175
|
-
color: muted,
|
|
176
|
-
lineHeight: ROUTE_CARD.subtitleLineHeight
|
|
177
|
-
},
|
|
178
|
-
children: card.subtitle
|
|
179
|
-
}
|
|
180
|
-
) : null
|
|
181
|
-
] }),
|
|
182
|
-
hasPhoto && fit.photo ? /* @__PURE__ */ jsx(
|
|
183
|
-
"img",
|
|
184
|
-
{
|
|
185
|
-
src: card.photoUrl,
|
|
186
|
-
width: ROUTE_CARD.photoWidth,
|
|
187
|
-
height: ROUTE_CARD.photoHeight,
|
|
188
|
-
style: { borderRadius: 24, objectFit: "cover" }
|
|
189
|
-
}
|
|
190
|
-
) : null
|
|
191
|
-
]
|
|
192
|
-
}
|
|
193
|
-
),
|
|
194
|
-
card.bar ? /* @__PURE__ */ jsx(
|
|
195
|
-
"div",
|
|
196
|
-
{
|
|
197
|
-
style: {
|
|
198
|
-
display: "flex",
|
|
199
|
-
alignItems: "center",
|
|
200
|
-
justifyContent: "center",
|
|
201
|
-
height: ROUTE_CARD.barHeight,
|
|
202
|
-
backgroundColor: theme.accent,
|
|
203
|
-
color: barTextColor(theme),
|
|
204
|
-
fontSize: 30,
|
|
205
|
-
fontWeight: 800,
|
|
206
|
-
letterSpacing: 3,
|
|
207
|
-
textTransform: "uppercase"
|
|
208
|
-
},
|
|
209
|
-
children: card.bar
|
|
210
|
-
}
|
|
211
|
-
) : null
|
|
212
|
-
]
|
|
213
|
-
}
|
|
214
|
-
);
|
|
215
|
-
}
|
|
216
|
-
async function renderCard(card, options) {
|
|
217
|
-
if (!card) return new Response("Not found", { status: 404 });
|
|
218
|
-
const { ImageResponse } = await import('next/og');
|
|
219
|
-
return new ImageResponse(ogRouteElement(card), {
|
|
220
|
-
...size,
|
|
221
|
-
...options.fonts?.length ? { fonts: options.fonts } : {}
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
function createOgImage(resolve, options = {}) {
|
|
225
|
-
return async function Image(props) {
|
|
226
|
-
const params = await props.params;
|
|
227
|
-
const id = props.id === void 0 ? void 0 : await props.id;
|
|
228
|
-
return renderCard(await resolve(params, { id }), options);
|
|
229
|
-
};
|
|
230
|
-
}
|
|
231
|
-
function createOgImageRoute(resolve, options = {}) {
|
|
232
|
-
return async function GET(req, ctx) {
|
|
233
|
-
return renderCard(await resolve(req, ctx), options);
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
export { contentType, createOgImage, createOgImageRoute, ogRouteElement, size };
|
|
238
|
-
//# sourceMappingURL=route.mjs.map
|
|
239
|
-
//# sourceMappingURL=route.mjs.map
|
package/dist/og/route.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/og/route-fit.ts","../../src/og/route.tsx"],"names":[],"mappings":"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","file":"route.mjs","sourcesContent":["/**\n * @sonordev/site-kit/og — title fitting for the runtime (Satori) card.\n *\n * The build-time card is fitted in the page: Chrome measures the rendered\n * title and steps it down until it fits (template.ts). The runtime card is\n * Satori, which has no DOM to measure, so its title sat at a fixed 84px,\n * uppercase, with no fitting. Beside the 430px photo that holds about 11\n * characters a line, so a real post title ran off the bottom of the card.\n * watsonhac.com, reinhart and vsf-consulting-nextjs each worked around it by\n * dropping the photo past a hand-picked length (40 or 50 characters).\n *\n * This does what the build-time fitter does, from an estimate instead of a\n * measurement: the same size range (TITLE_MAX_PX down to TITLE_MIN_PX, in 2px\n * steps), word-wrapped at an estimated glyph width against the real column\n * width and the height the kicker, subtitle and bar leave. When the title\n * can't fit beside the photo even at the floor, the photo goes and the title\n * gets the full width.\n *\n * The estimate is deliberately wide (uppercase, bold-ish) so an unusual\n * face errs toward a smaller title, never an overflowing one, and the title\n * box clips at its height as the backstop.\n *\n * Pure: no DOM, no Node built-ins. Geometry constants are the card's own\n * (route.tsx imports them), so the two can't drift.\n */\n\nimport { OG_HEIGHT, OG_WIDTH, TITLE_MAX_PX, TITLE_MIN_PX } from './config'\n\n/** The runtime card's layout, in px. route.tsx renders exactly this. */\nexport const ROUTE_CARD = {\n padX: 68,\n gap: 48,\n photoWidth: 430,\n photoHeight: 470,\n barHeight: 74,\n /** Breathing room above and below the copy column. */\n padY: 44,\n kickerPx: 24,\n kickerGap: 18,\n subtitlePx: 30,\n subtitleGap: 20,\n subtitleLineHeight: 1.3,\n titleLineHeight: 1.02,\n} as const\n\n/**\n * Average advance of an UPPERCASE glyph, in em. Calibrated against next/og's\n * bundled face and a bold sans; errs wide. Narrow glyphs are counted\n * separately so \"ILLINOIS\" isn't treated like \"MMMMMMMM\".\n */\nconst UPPER_EM = 0.68\nconst NARROW_EM = 0.32\nconst SPACE_EM = 0.3\n/** Mixed-case body text (the subtitle), in em. */\nconst BODY_EM = 0.52\n/** The kicker is uppercase with 6px letter spacing at 24px. */\nconst KICKER_EM = 0.72 + 6 / 24\n\nconst NARROW = /[IJ1.,:;'’!|()\\-]/\n\n/** Estimated width of `text` set uppercase at `px`. */\nexport function uppercaseWidth(text: string, px: number): number {\n let em = 0\n for (const ch of text.toUpperCase()) {\n em += ch === ' ' ? SPACE_EM : NARROW.test(ch) ? NARROW_EM : UPPER_EM\n }\n return em * px\n}\n\n/**\n * Lines `text` wraps to in a column `width` px wide, greedy by word, the way\n * the browser and Satori wrap. `\\n` is a hard break. Returns Infinity when a\n * single word is wider than the column: it can't wrap, so no line count fits.\n */\nexport function wrappedLines(\n text: string,\n width: number,\n measure: (s: string) => number,\n): number {\n let lines = 0\n for (const paragraph of text.split('\\n')) {\n const words = paragraph.split(/\\s+/).filter(Boolean)\n if (!words.length) {\n lines++\n continue\n }\n let current = ''\n for (const word of words) {\n if (measure(word) > width) return Infinity\n const next = current ? `${current} ${word}` : word\n if (current && measure(next) > width) {\n lines++\n current = word\n } else {\n current = next\n }\n }\n lines++\n }\n return lines\n}\n\nexport interface RouteFitInput {\n title: string\n kicker?: string\n subtitle?: string\n /** A photo was offered. */\n photo: boolean\n /** The card has a bottom bar. */\n bar: boolean\n}\n\nexport interface RouteFit {\n /** Title size in px. */\n titlePx: number\n /** Keep the photo. False when the title only fits at full width. */\n photo: boolean\n /** Height the title box may use; route.tsx clips the title to it. */\n titleMaxHeight: number\n /** The title fits at `titlePx` by the estimate (false only at the floor, full width). */\n fits: boolean\n}\n\nfunction columnWidth(photo: boolean): number {\n const inner = OG_WIDTH - ROUTE_CARD.padX * 2\n return photo ? inner - ROUTE_CARD.photoWidth - ROUTE_CARD.gap : inner\n}\n\n/** Height left for the title once the kicker and subtitle have theirs. */\nfunction titleBudget(input: RouteFitInput, width: number): number {\n const c = ROUTE_CARD\n let height = OG_HEIGHT - (input.bar ? c.barHeight : 0) - c.padY * 2\n if (input.kicker) {\n const lines = wrappedLines(input.kicker, width, s => s.length * KICKER_EM * c.kickerPx)\n height -= Math.min(lines, 2) * c.kickerPx * 1.2 + c.kickerGap\n }\n if (input.subtitle) {\n const lines = wrappedLines(input.subtitle, width, s => s.length * BODY_EM * c.subtitlePx)\n height -= Math.min(lines, 3) * c.subtitlePx * c.subtitleLineHeight + c.subtitleGap\n }\n return height\n}\n\n/** Largest title size that fits `width`, or null when none down to the floor does. */\nfunction largestFit(input: RouteFitInput, photo: boolean): { px: number; budget: number } | null {\n const width = columnWidth(photo)\n const budget = titleBudget(input, width)\n for (let px = TITLE_MAX_PX; px >= TITLE_MIN_PX; px -= 2) {\n const lines = wrappedLines(input.title, width, s => uppercaseWidth(s, px))\n if (lines * px * ROUTE_CARD.titleLineHeight <= budget) return { px, budget }\n }\n return null\n}\n\n/**\n * Size the title, and decide whether the photo stays.\n *\n * Beside the photo first, since the photo is the page's own image and worth\n * keeping. If even the floor size doesn't fit there, drop the photo and fit\n * the full width. If that fails too, the title sits at the floor and clips.\n */\nexport function fitRouteTitle(input: RouteFitInput): RouteFit {\n if (input.photo) {\n const withPhoto = largestFit(input, true)\n if (withPhoto) {\n return { titlePx: withPhoto.px, photo: true, titleMaxHeight: withPhoto.budget, fits: true }\n }\n }\n const full = largestFit(input, false)\n if (full) return { titlePx: full.px, photo: false, titleMaxHeight: full.budget, fits: true }\n return {\n titlePx: TITLE_MIN_PX,\n photo: false,\n titleMaxHeight: titleBudget(input, columnWidth(false)),\n fits: false,\n }\n}\n","/**\n * @sonordev/site-kit/og/route — tier 2: per-entity runtime OG cards.\n *\n * `sonor-setup og` covers the build-time cards: the site card and one per\n * route. This covers the cards that must vary per URL and can't wait for a\n * rebuild — one per article, per event, per product — rendered on demand\n * with next/og (Satori).\n *\n * TWO SHAPES, ONE CARD:\n *\n * `createOgImage` is the metadata file convention, and the one to reach for.\n * Next calls an `opengraph-image.tsx` default export with `{ params }` and\n * wires og:image and twitter:image for the page by itself, and `sonor-setup\n * og` sees the file and leaves the folder alone:\n *\n * ```tsx\n * // app/blog/[slug]/opengraph-image.tsx\n * import { createOgImage } from '@sonordev/site-kit/og/route'\n * import { getArticle } from '@sonordev/site-kit/articles/server'\n *\n * export { size, contentType } from '@sonordev/site-kit/og/route'\n * export const alt = 'From the Acme article'\n *\n * export default createOgImage<{ slug: string }>(async ({ slug }) => {\n * const post = await getArticle(slug)\n * if (!post) return null // 404: a bad slug never renders a card\n * return {\n * theme: { bg: '#111110', text: '#faf6f0', accent: '#ad1d25' },\n * kicker: 'From the publication',\n * title: post.title,\n * photoUrl: post.featured_image, // absolute URL (Satori requirement)\n * bar: 'yourdomain.com',\n * }\n * })\n * ```\n *\n * The page then passes `images: false` to generateArticleMetadata: declared\n * images beat the file convention.\n *\n * `createOgImageRoute` is a plain route handler, `GET(request, { params })`,\n * for a card served at a URL of your choosing (`app/og/[slug]/route.tsx`).\n * Next doesn't wire it into metadata; the page declares it.\n *\n * Sites needed an adapter between the two before `createOgImage` existed\n * (watsonhac.com, reinhart, vsf-consulting-nextjs: a default export that\n * built a dummy Request to call the GET handler).\n *\n * SATORI CONSTRAINTS (why this is not the static template): flexbox-only CSS\n * subset, no external stylesheets, images must be absolute URLs or data URIs,\n * and fonts must be provided as ArrayBuffers via `fonts` — Satori cannot load\n * Google Fonts at runtime. Without fonts it falls back to Satori's default\n * face; brand-critical cards should pass font data (fetch the TTF once at\n * module init and reuse the promise).\n *\n * TITLE FITTING: Satori can't measure, so the title is sized from an estimate\n * (og/route-fit.ts) over the same range the build-time card uses, and the\n * photo is dropped when the title can't fit beside it. Long post titles no\n * longer run off the card.\n */\n\nimport React from 'react'\nimport { OG_HEIGHT, OG_WIDTH } from './config'\nimport { barTextColor } from './contrast'\nimport { fitRouteTitle, ROUTE_CARD } from './route-fit'\n\nexport interface OgRouteTheme {\n bg: string\n text: string\n accent: string\n muted?: string\n /** og.config.ts's surface color. Only used as a bar-text candidate. */\n surface?: string\n /**\n * Bottom-bar text, set on `accent`. Defaults to the first of `surface`,\n * `bg`, `text` that reaches WCAG AA for large text (3:1) against the\n * accent. It used to be `text`, which is unreadable wherever text and\n * accent are both strong (navy on crimson).\n */\n barText?: string\n}\n\nexport interface OgRouteCard {\n /** og.config.ts's `theme` can be passed as is. */\n theme: OgRouteTheme\n kicker?: string\n title: string\n subtitle?: string\n /** Absolute URL (Satori requirement) of the page's own image. */\n photoUrl?: string\n /** Bottom-bar text, e.g. the domain. */\n bar?: string\n}\n\nexport interface OgRouteFont {\n name: string\n data: ArrayBuffer\n weight?: number\n style?: 'normal' | 'italic'\n}\n\nexport interface OgImageOptions {\n fonts?: OgRouteFont[]\n}\n\n/** For `export { size, contentType } from '@sonordev/site-kit/og/route'` in an opengraph-image file. */\nexport const size = { width: OG_WIDTH, height: OG_HEIGHT }\nexport const contentType = 'image/png'\n\ntype Resolver<Ctx> = (req: Request, ctx: Ctx) => Promise<OgRouteCard | null> | OgRouteCard | null\n\n/**\n * Satori-safe element tree — exported for tests and for sites that want to\n * extend it inside their own ImageResponse.\n */\nexport function ogRouteElement(card: OgRouteCard): React.ReactElement {\n const { theme } = card\n const muted = theme.muted || theme.text\n // Only an absolute URL (or data URI) renders in Satori; anything else would\n // throw inside the render, so it's treated as no photo.\n const hasPhoto = !!card.photoUrl && /^(https?:|data:)/.test(card.photoUrl)\n const fit = fitRouteTitle({\n title: card.title,\n kicker: card.kicker,\n subtitle: card.subtitle,\n photo: hasPhoto,\n bar: !!card.bar,\n })\n const titleLine = fit.titlePx * ROUTE_CARD.titleLineHeight\n // Clip on a whole line, so an estimate that ran short loses a line cleanly\n // instead of spilling onto the bar.\n const titleMaxHeight = Math.max(1, Math.floor(fit.titleMaxHeight / titleLine)) * titleLine\n\n return (\n <div\n style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n backgroundColor: theme.bg,\n color: theme.text,\n fontSize: 32,\n }}\n >\n <div\n style={{\n display: 'flex',\n flex: 1,\n alignItems: 'center',\n padding: `0 ${ROUTE_CARD.padX}px`,\n gap: ROUTE_CARD.gap,\n minHeight: 0,\n }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', flex: 1, minWidth: 0 }}>\n {card.kicker ? (\n <div\n style={{\n fontSize: ROUTE_CARD.kickerPx,\n letterSpacing: 6,\n textTransform: 'uppercase',\n color: theme.accent,\n marginBottom: ROUTE_CARD.kickerGap,\n fontWeight: 700,\n }}\n >\n {card.kicker}\n </div>\n ) : null}\n <div\n style={{\n display: 'flex',\n fontSize: fit.titlePx,\n fontWeight: 800,\n lineHeight: ROUTE_CARD.titleLineHeight,\n textTransform: 'uppercase',\n maxHeight: titleMaxHeight,\n overflow: 'hidden',\n }}\n >\n {card.title}\n </div>\n {card.subtitle ? (\n <div\n style={{\n fontSize: ROUTE_CARD.subtitlePx,\n marginTop: ROUTE_CARD.subtitleGap,\n color: muted,\n lineHeight: ROUTE_CARD.subtitleLineHeight,\n }}\n >\n {card.subtitle}\n </div>\n ) : null}\n </div>\n {hasPhoto && fit.photo ? (\n <img\n src={card.photoUrl}\n width={ROUTE_CARD.photoWidth}\n height={ROUTE_CARD.photoHeight}\n style={{ borderRadius: 24, objectFit: 'cover' }}\n />\n ) : null}\n </div>\n {card.bar ? (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: ROUTE_CARD.barHeight,\n backgroundColor: theme.accent,\n color: barTextColor(theme),\n fontSize: 30,\n fontWeight: 800,\n letterSpacing: 3,\n textTransform: 'uppercase',\n }}\n >\n {card.bar}\n </div>\n ) : null}\n </div>\n )\n}\n\n/**\n * Render a card, or 404 for null. Single source of truth for both factories:\n * the file convention and the route handler differ only in how they're called.\n */\nasync function renderCard(card: OgRouteCard | null, options: OgImageOptions): Promise<Response> {\n if (!card) return new Response('Not found', { status: 404 })\n\n // next/og is imported lazily so this module stays importable in test/node\n // contexts that lack the Next server runtime.\n const { ImageResponse } = await import('next/og')\n return new ImageResponse(ogRouteElement(card), {\n ...size,\n ...(options.fonts?.length ? { fonts: options.fonts as any } : {}),\n })\n}\n\n/**\n * Metadata file-convention factory, for `export default` from an\n * `opengraph-image.tsx` (or `twitter-image.tsx`). Next calls it with\n * `{ params }` (a promise on Next 15+) and, with `generateImageMetadata`, an\n * `id`. The resolver gets both already awaited. Return null for a 404.\n */\nexport function createOgImage<Params extends Record<string, string | string[]> = Record<string, string>>(\n resolve: (params: Params, ctx: { id?: string }) => Promise<OgRouteCard | null> | OgRouteCard | null,\n options: OgImageOptions = {},\n) {\n return async function Image(props: {\n params: Params | Promise<Params>\n id?: string | Promise<string>\n }): Promise<Response> {\n const params = await props.params\n const id = props.id === undefined ? undefined : await props.id\n return renderCard(await resolve(params, { id }), options)\n }\n}\n\n/**\n * Route handler factory, `export const GET` from a `route.tsx`. Returns 404\n * when the resolver returns null, so a bad slug never renders a broken card.\n *\n * Next doesn't wire a route handler into metadata. For a card Next should\n * attach to the page by itself, use `createOgImage` in `opengraph-image.tsx`.\n */\nexport function createOgImageRoute<Ctx = { params: Promise<Record<string, string>> }>(\n resolve: Resolver<Ctx>,\n options: OgImageOptions = {},\n) {\n return async function GET(req: Request, ctx: Ctx): Promise<Response> {\n return renderCard(await resolve(req, ctx), options)\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/og/template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAsB,MAAM,UAAU,CAAA;AAqKhE,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CA2ExD"}
|
package/dist/og/wiring.d.ts
DELETED
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @sonordev/site-kit/og — the single source of truth for "is this site's OG
|
|
3
|
-
* wiring correct".
|
|
4
|
-
*
|
|
5
|
-
* SINGLE SOURCE OF TRUTH, deliberately. This rule had two independent
|
|
6
|
-
* implementations — `sonor-setup og`'s post-render check and the doctor's
|
|
7
|
-
* `og.card` check — and BOTH were wrong the same way: they told a site to add
|
|
8
|
-
* `openGraph.images: ['/og.png']` to the root layout. Since per-page cards
|
|
9
|
-
* landed that advice actively breaks the site, because declared images override
|
|
10
|
-
* the per-page card files. Two copies of a rule that inverted is exactly why it
|
|
11
|
-
* lives in one function now. Never re-fork it.
|
|
12
|
-
*
|
|
13
|
-
* The rule itself, verified against real Next builds rather than assumed:
|
|
14
|
-
*
|
|
15
|
-
* 1. Config metadata BEATS the `opengraph-image` file convention. A route
|
|
16
|
-
* whose generateMetadata returns `openGraph.images` overrides its own card
|
|
17
|
-
* file. So a site with per-page cards must declare NO images anywhere —
|
|
18
|
-
* including `seo_pages.managed_og_image`, which site-kit serves into
|
|
19
|
-
* openGraph.images for every managed page.
|
|
20
|
-
* 2. File metadata does NOT cascade to child segments. A card at `services/`
|
|
21
|
-
* is not inherited by `services/[city]`; a dynamic segment needs its own.
|
|
22
|
-
* 3. A site with NO per-page cards still needs the layout to reference the
|
|
23
|
-
* site card, which is the original check and still correct in that mode.
|
|
24
|
-
* 4. Next spells a code-based card's URL with no extension
|
|
25
|
-
* (`/article/x/opengraph-image`), and `trailingSlash: true` 308s it. Such a
|
|
26
|
-
* page declares the slashed URL (`codeCardImage`) instead.
|
|
27
|
-
*
|
|
28
|
-
* `summary_large_image` and the code-card rules read the site's code through
|
|
29
|
-
* `shared/source-graph`, which follows imports into `lib/` helpers and
|
|
30
|
-
* monorepo workspace packages. They used to grep the root layout alone, and
|
|
31
|
-
* almost no site sets `twitter.card` there.
|
|
32
|
-
*
|
|
33
|
-
* `managed_og_image` is only reported when it's KNOWN to be set: the caller
|
|
34
|
-
* passes the pages Sonor says have one (`sonor-setup og` reads them while
|
|
35
|
-
* titling cards; `doctor --online` asks). It used to be a warning on every
|
|
36
|
-
* per-page site, set or not, which taught people to ignore the check.
|
|
37
|
-
*
|
|
38
|
-
* Node-only (fs/path): never import from browser or client code.
|
|
39
|
-
*/
|
|
40
|
-
export interface OgWiringFacts {
|
|
41
|
-
/** `public/og.png` (or a sibling) exists. */
|
|
42
|
-
siteCard: boolean;
|
|
43
|
-
/**
|
|
44
|
-
* Absolute paths of every `opengraph-image.*` / `twitter-image.*` found
|
|
45
|
-
* anywhere under app/: static images AND code-generated cards
|
|
46
|
-
* (`opengraph-image.tsx` and friends). Declared metadata overrides both.
|
|
47
|
-
*/
|
|
48
|
-
pageCards: string[];
|
|
49
|
-
/** The root layout declares an `images: [...]` array. */
|
|
50
|
-
layoutDeclaresImages: boolean;
|
|
51
|
-
/**
|
|
52
|
-
* `summary_large_image` is set somewhere the pages run: the root layout or
|
|
53
|
-
* a page, or a helper either imports. A `twitter-image` file counts too
|
|
54
|
-
* (Next sets the large card for it).
|
|
55
|
-
*/
|
|
56
|
-
largeCard: boolean;
|
|
57
|
-
/** The root layout references the site card at all. */
|
|
58
|
-
referencesImage: boolean;
|
|
59
|
-
/** Root layout was found. */
|
|
60
|
-
layoutFound: boolean;
|
|
61
|
-
/** next.config sets `trailingSlash: true`. */
|
|
62
|
-
trailingSlash?: boolean;
|
|
63
|
-
/** Code-based cards (`opengraph-image.tsx`) and what their page does about them. */
|
|
64
|
-
codeCards?: OgCodeCardFacts[];
|
|
65
|
-
/**
|
|
66
|
-
* Paths whose seo_pages row sets managed_og_image, when known. Undefined
|
|
67
|
-
* means nobody asked Sonor, which is not the same as none.
|
|
68
|
-
*/
|
|
69
|
-
managedOgImages?: string[];
|
|
70
|
-
}
|
|
71
|
-
export interface OgCodeCardFacts {
|
|
72
|
-
/** Project-relative card file. */
|
|
73
|
-
file: string;
|
|
74
|
-
/** Route pattern, `/article/*`. */
|
|
75
|
-
route: string;
|
|
76
|
-
/** The page (or a helper it imports) declares the card with `codeCardImage`. */
|
|
77
|
-
declaresUrl: boolean;
|
|
78
|
-
/** The page calls generateArticleMetadata without `images: false`. */
|
|
79
|
-
articleDeclaresImages: boolean;
|
|
80
|
-
}
|
|
81
|
-
export interface OgWiringProblem {
|
|
82
|
-
message: string;
|
|
83
|
-
fix: string;
|
|
84
|
-
}
|
|
85
|
-
/** Every `opengraph-image.*` under the app directory, at any depth. */
|
|
86
|
-
export declare function findPageCards(cwd: string): string[];
|
|
87
|
-
/** Read the observable facts. No judgement here — that is `judgeOgWiring`. */
|
|
88
|
-
export declare function readOgWiring(cwd: string, known?: {
|
|
89
|
-
managedOgImages?: string[];
|
|
90
|
-
}): OgWiringFacts;
|
|
91
|
-
/**
|
|
92
|
-
* Turn the facts into problems, in the order that matters most. Empty array
|
|
93
|
-
* means the wiring is right.
|
|
94
|
-
*/
|
|
95
|
-
export declare function judgeOgWiring(facts: OgWiringFacts): OgWiringProblem[];
|
|
96
|
-
/** Convenience: read + judge in one call. */
|
|
97
|
-
export declare function checkOgWiring(cwd: string, known?: {
|
|
98
|
-
managedOgImages?: string[];
|
|
99
|
-
}): OgWiringProblem[];
|
|
100
|
-
//# sourceMappingURL=wiring.d.ts.map
|
package/dist/og/wiring.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wiring.d.ts","sourceRoot":"","sources":["../../src/og/wiring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAOH,MAAM,WAAW,aAAa;IAC5B,6CAA6C;IAC7C,QAAQ,EAAE,OAAO,CAAA;IACjB;;;;OAIG;IACH,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,yDAAyD;IACzD,oBAAoB,EAAE,OAAO,CAAA;IAC7B;;;;OAIG;IACH,SAAS,EAAE,OAAO,CAAA;IAClB,uDAAuD;IACvD,eAAe,EAAE,OAAO,CAAA;IACxB,6BAA6B;IAC7B,WAAW,EAAE,OAAO,CAAA;IACpB,8CAA8C;IAC9C,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,oFAAoF;IACpF,SAAS,CAAC,EAAE,eAAe,EAAE,CAAA;IAC7B;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAA;IACb,gFAAgF;IAChF,WAAW,EAAE,OAAO,CAAA;IACpB,sEAAsE;IACtE,qBAAqB,EAAE,OAAO,CAAA;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;CACZ;AAYD,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBnD;AAwED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,GAAE;IAAE,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;CAAO,GAAG,aAAa,CAqCnG;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,eAAe,EAAE,CAoErE;AAED,6CAA6C;AAC7C,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,GAAE;IAAE,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;CAAO,GAAG,eAAe,EAAE,CAExG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/portfolio/contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,uDAAuD;AACvD,eAAO,MAAM,0BAA0B,EAAG,CAAU,CAAA;AAEpD,gFAAgF;AAChF,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAID,+DAA+D;AAC/D,wBAAgB,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,OAAO,CAEpE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAehE;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB;aACpC,OAAO,EAAE,yCAAyC;aAClD,GAAG,EAAE,gDAAgD;aACrD,KAAK,EAAE,SAAS;aAChB,WAAW,EAAE,0EAA0E;aACvF,IAAI,EAAE,QAAQ;aACd,QAAQ,YAAG,OAAO,EAAE,OAAO;aAC3B,UAAU;iBACR,KAAK;qBAAI,IAAI,EAAE,QAAQ;;iBACvB,KAAK;qBAAI,IAAI,EAAE,QAAQ;;iBACvB,WAAW;qBAAI,IAAI,EAAE,QAAQ;;;aAE/B,oBAAoB;CACZ,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/portfolio/contract.ts"],"names":[],"mappings":";;;;;AAoBO,IAAM,0BAAA,GAA6B;AAS1C,IAAM,aAAA,GAAgB,aAAA;AAGf,SAAS,gBAAgB,GAAA,EAAsC;AACpE,EAAA,OAAO,aAAA,CAAc,IAAA,CAAK,GAAA,CAAI,KAAA,IAAS,EAAE,CAAA;AAC3C;AAQO,SAAS,eAAkC,IAAA,EAAgB;AAChE,EAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,CAAC,MAAM,CAAC,eAAA,CAAgB,CAAC,CAAC,CAAA;AACvD,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,eAAe,CAAA;AAC9C,EAAA,IAAI,UAAA,CAAW,MAAA,IAAU,CAAA,EAAG,OAAO,IAAA;AAEnC,EAAA,MAAM,UAAA,GAAa,UAAA,CAAW,MAAA,IAAU,CAAA,IAAK,UAAA,CAAW,MAAM,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,GAAG,CAAA;AACpF,EAAA,MAAM,UAAa,UAAA,GACf;AAAA,IACE,GAAG,WAAW,CAAC,CAAA;AAAA,IACf,KAAA,EAAO,8BAAA;AAAA,IACP,WAAA,EAAa;AAAA,GACf,GACC,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,cAAA,CAAe,IAAA,CAAK,CAAA,CAAE,KAAK,CAAC,CAAA,IAAK,UAAA,CAAW,CAAC,CAAA;AAEzE,EAAA,OAAO,CAAC,GAAG,QAAA,EAAU,OAAO,CAAA;AAC9B;AAMO,IAAM,yBAAA,GAA4B;AAAA,EACvC,OAAA,EAAS,yCAAA;AAAA,EACT,GAAA,EAAK,gDAAA;AAAA,EACL,KAAA,EAAO,SAAA;AAAA,EACP,WAAA,EAAa,0EAAA;AAAA,EACb,IAAA,EAAM,QAAA;AAAA,EACN,QAAA,EAAU,CAAC,OAAA,EAAS,OAAO,CAAA;AAAA,EAC3B,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IACxB,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IACxB,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA;AAAS,GAChC;AAAA,EACA,oBAAA,EAAsB;AACxB","file":"contract.js","sourcesContent":["/**\n * @sonordev/site-kit/portfolio/contract — portfolio proof display policy (v1)\n *\n * Single source of truth for the Lighthouse-KPI collapse policy shared by the\n * content side (signal-api generation) and the render side (agency-site-kit\n * display). Same pattern as the other site-kit contracts:\n * - agency-site-kit imports these directly (it already depends on site-kit)\n * from `src/portfolio/curate-proof.ts`, which keeps the render-only\n * primitives that bind to its section types.\n * - signal-api keeps a byte-identical inline mirror\n * (`src/modules/skills/portfolio/portfolio-kpi-policy.util.ts`) guarded by\n * the shared drift-test vectors in `contract.test.ts`.\n *\n * Why it exists: generated case studies arrived with four \"100/100 Lighthouse X\"\n * KPIs repeated across hero, results cards, and a Performance section. One\n * differentiator repeated a dozen times stops differentiating — collapse the\n * per-category Lighthouse tiles to at most one summary, business outcomes first.\n */\n\n/** Bump on breaking changes to the collapse policy. */\nexport const PORTFOLIO_CONTRACT_VERSION = 1 as const\n\n/** Minimal KPI shape the policy reads — callers pass their own richer tiles. */\nexport interface KpiLike {\n label: string\n value: number\n description?: string\n}\n\nconst LIGHTHOUSE_RE = /lighthouse/i\n\n/** True when a KPI tile is a per-category Lighthouse score. */\nexport function isLighthouseKpi(kpi: Pick<KpiLike, 'label'>): boolean {\n return LIGHTHOUSE_RE.test(kpi.label || '')\n}\n\n/**\n * Collapse per-category Lighthouse KPIs to at most one summary tile, business\n * outcomes first. When every category is present at 100 the summary says so;\n * otherwise the Performance category (the one buyers know) represents the set.\n * Fewer than two Lighthouse tiles → returned unchanged.\n */\nexport function curateHeroKpis<T extends KpiLike>(kpis: T[]): T[] {\n const business = kpis.filter((k) => !isLighthouseKpi(k))\n const lighthouse = kpis.filter(isLighthouseKpi)\n if (lighthouse.length <= 1) return kpis\n\n const allPerfect = lighthouse.length >= 4 && lighthouse.every((k) => k.value === 100)\n const summary: T = allPerfect\n ? {\n ...lighthouse[0],\n label: 'Lighthouse, all 4 categories',\n description: 'Perfect scores across performance, SEO, accessibility, and best practices.',\n }\n : (lighthouse.find((k) => /performance/i.test(k.label)) ?? lighthouse[0])\n\n return [...business, summary]\n}\n\n/**\n * Agent-native contract: JSON Schema for the minimal KPI shape, so services and\n * agents can validate tiles before applying the collapse policy.\n */\nexport const PORTFOLIO_KPI_JSON_SCHEMA = {\n $schema: 'http://json-schema.org/draft-07/schema#',\n $id: 'https://sonor.io/schemas/portfolio-kpi.v1.json',\n title: 'KpiLike',\n description: 'The subset of a portfolio KPI tile the Lighthouse-collapse policy reads.',\n type: 'object',\n required: ['label', 'value'],\n properties: {\n label: { type: 'string' },\n value: { type: 'number' },\n description: { type: 'string' },\n },\n additionalProperties: true,\n} as const\n"]}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import '../chunk-BEXTDHO4.mjs';
|
|
2
|
-
|
|
3
|
-
// src/portfolio/contract.ts
|
|
4
|
-
var PORTFOLIO_CONTRACT_VERSION = 1;
|
|
5
|
-
var LIGHTHOUSE_RE = /lighthouse/i;
|
|
6
|
-
function isLighthouseKpi(kpi) {
|
|
7
|
-
return LIGHTHOUSE_RE.test(kpi.label || "");
|
|
8
|
-
}
|
|
9
|
-
function curateHeroKpis(kpis) {
|
|
10
|
-
const business = kpis.filter((k) => !isLighthouseKpi(k));
|
|
11
|
-
const lighthouse = kpis.filter(isLighthouseKpi);
|
|
12
|
-
if (lighthouse.length <= 1) return kpis;
|
|
13
|
-
const allPerfect = lighthouse.length >= 4 && lighthouse.every((k) => k.value === 100);
|
|
14
|
-
const summary = allPerfect ? {
|
|
15
|
-
...lighthouse[0],
|
|
16
|
-
label: "Lighthouse, all 4 categories",
|
|
17
|
-
description: "Perfect scores across performance, SEO, accessibility, and best practices."
|
|
18
|
-
} : lighthouse.find((k) => /performance/i.test(k.label)) ?? lighthouse[0];
|
|
19
|
-
return [...business, summary];
|
|
20
|
-
}
|
|
21
|
-
var PORTFOLIO_KPI_JSON_SCHEMA = {
|
|
22
|
-
$schema: "http://json-schema.org/draft-07/schema#",
|
|
23
|
-
$id: "https://sonor.io/schemas/portfolio-kpi.v1.json",
|
|
24
|
-
title: "KpiLike",
|
|
25
|
-
description: "The subset of a portfolio KPI tile the Lighthouse-collapse policy reads.",
|
|
26
|
-
type: "object",
|
|
27
|
-
required: ["label", "value"],
|
|
28
|
-
properties: {
|
|
29
|
-
label: { type: "string" },
|
|
30
|
-
value: { type: "number" },
|
|
31
|
-
description: { type: "string" }
|
|
32
|
-
},
|
|
33
|
-
additionalProperties: true
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
export { PORTFOLIO_CONTRACT_VERSION, PORTFOLIO_KPI_JSON_SCHEMA, curateHeroKpis, isLighthouseKpi };
|
|
37
|
-
//# sourceMappingURL=contract.mjs.map
|
|
38
|
-
//# sourceMappingURL=contract.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/portfolio/contract.ts"],"names":[],"mappings":";;;AAoBO,IAAM,0BAAA,GAA6B;AAS1C,IAAM,aAAA,GAAgB,aAAA;AAGf,SAAS,gBAAgB,GAAA,EAAsC;AACpE,EAAA,OAAO,aAAA,CAAc,IAAA,CAAK,GAAA,CAAI,KAAA,IAAS,EAAE,CAAA;AAC3C;AAQO,SAAS,eAAkC,IAAA,EAAgB;AAChE,EAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,CAAC,MAAM,CAAC,eAAA,CAAgB,CAAC,CAAC,CAAA;AACvD,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,eAAe,CAAA;AAC9C,EAAA,IAAI,UAAA,CAAW,MAAA,IAAU,CAAA,EAAG,OAAO,IAAA;AAEnC,EAAA,MAAM,UAAA,GAAa,UAAA,CAAW,MAAA,IAAU,CAAA,IAAK,UAAA,CAAW,MAAM,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,GAAG,CAAA;AACpF,EAAA,MAAM,UAAa,UAAA,GACf;AAAA,IACE,GAAG,WAAW,CAAC,CAAA;AAAA,IACf,KAAA,EAAO,8BAAA;AAAA,IACP,WAAA,EAAa;AAAA,GACf,GACC,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,cAAA,CAAe,IAAA,CAAK,CAAA,CAAE,KAAK,CAAC,CAAA,IAAK,UAAA,CAAW,CAAC,CAAA;AAEzE,EAAA,OAAO,CAAC,GAAG,QAAA,EAAU,OAAO,CAAA;AAC9B;AAMO,IAAM,yBAAA,GAA4B;AAAA,EACvC,OAAA,EAAS,yCAAA;AAAA,EACT,GAAA,EAAK,gDAAA;AAAA,EACL,KAAA,EAAO,SAAA;AAAA,EACP,WAAA,EAAa,0EAAA;AAAA,EACb,IAAA,EAAM,QAAA;AAAA,EACN,QAAA,EAAU,CAAC,OAAA,EAAS,OAAO,CAAA;AAAA,EAC3B,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IACxB,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IACxB,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA;AAAS,GAChC;AAAA,EACA,oBAAA,EAAsB;AACxB","file":"contract.mjs","sourcesContent":["/**\n * @sonordev/site-kit/portfolio/contract — portfolio proof display policy (v1)\n *\n * Single source of truth for the Lighthouse-KPI collapse policy shared by the\n * content side (signal-api generation) and the render side (agency-site-kit\n * display). Same pattern as the other site-kit contracts:\n * - agency-site-kit imports these directly (it already depends on site-kit)\n * from `src/portfolio/curate-proof.ts`, which keeps the render-only\n * primitives that bind to its section types.\n * - signal-api keeps a byte-identical inline mirror\n * (`src/modules/skills/portfolio/portfolio-kpi-policy.util.ts`) guarded by\n * the shared drift-test vectors in `contract.test.ts`.\n *\n * Why it exists: generated case studies arrived with four \"100/100 Lighthouse X\"\n * KPIs repeated across hero, results cards, and a Performance section. One\n * differentiator repeated a dozen times stops differentiating — collapse the\n * per-category Lighthouse tiles to at most one summary, business outcomes first.\n */\n\n/** Bump on breaking changes to the collapse policy. */\nexport const PORTFOLIO_CONTRACT_VERSION = 1 as const\n\n/** Minimal KPI shape the policy reads — callers pass their own richer tiles. */\nexport interface KpiLike {\n label: string\n value: number\n description?: string\n}\n\nconst LIGHTHOUSE_RE = /lighthouse/i\n\n/** True when a KPI tile is a per-category Lighthouse score. */\nexport function isLighthouseKpi(kpi: Pick<KpiLike, 'label'>): boolean {\n return LIGHTHOUSE_RE.test(kpi.label || '')\n}\n\n/**\n * Collapse per-category Lighthouse KPIs to at most one summary tile, business\n * outcomes first. When every category is present at 100 the summary says so;\n * otherwise the Performance category (the one buyers know) represents the set.\n * Fewer than two Lighthouse tiles → returned unchanged.\n */\nexport function curateHeroKpis<T extends KpiLike>(kpis: T[]): T[] {\n const business = kpis.filter((k) => !isLighthouseKpi(k))\n const lighthouse = kpis.filter(isLighthouseKpi)\n if (lighthouse.length <= 1) return kpis\n\n const allPerfect = lighthouse.length >= 4 && lighthouse.every((k) => k.value === 100)\n const summary: T = allPerfect\n ? {\n ...lighthouse[0],\n label: 'Lighthouse, all 4 categories',\n description: 'Perfect scores across performance, SEO, accessibility, and best practices.',\n }\n : (lighthouse.find((k) => /performance/i.test(k.label)) ?? lighthouse[0])\n\n return [...business, summary]\n}\n\n/**\n * Agent-native contract: JSON Schema for the minimal KPI shape, so services and\n * agents can validate tiles before applying the collapse policy.\n */\nexport const PORTFOLIO_KPI_JSON_SCHEMA = {\n $schema: 'http://json-schema.org/draft-07/schema#',\n $id: 'https://sonor.io/schemas/portfolio-kpi.v1.json',\n title: 'KpiLike',\n description: 'The subset of a portfolio KPI tile the Lighthouse-collapse policy reads.',\n type: 'object',\n required: ['label', 'value'],\n properties: {\n label: { type: 'string' },\n value: { type: 'number' },\n description: { type: 'string' },\n },\n additionalProperties: true,\n} as const\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/proxy/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,cAAc,CAAA;AACrB,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,mBAAmB,CAAA;AAO1B,YAAY,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,aAAa,EACb,KAAK,cAAc,EACnB,KAAK,aAAa,GACnB,MAAM,WAAW,CAAA;AAElB,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAA;IACf,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC;;;;;;;;;;;;;;OAcG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,cAAc,CAAA;IACpC,6CAA6C;IAC7C,eAAe,CAAC,EAAE,OAAO,GAAG,qBAAqB,CAAA;IACjD;;;;OAIG;IACH,aAAa,CAAC,EAAE,mBAAmB,GAAG,KAAK,CAAA;IAC3C;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,EAAE,OAAO,GAAG,cAAc,CAAA;IACnC;;;OAGG;IACH,MAAM,CAAC,EAAE,CACP,OAAO,EAAE,WAAW,KACjB,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAAA;IACjE;;;OAGG;IACH,KAAK,CAAC,EAAE,CACN,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,YAAY,KACnB,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;CAC1C;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,kBAAkB,aAe1C,WAAW,KACnB,OAAO,CAAC,YAAY,CAAC,CA+FzB;AAWD;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc;IACzB,OAAO;CAGR,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,oBAAc,CAAA;AAE3C,4CAA4C;AAC5C,MAAM,MAAM,uBAAuB,GAAG,kBAAkB,CAAA"}
|
package/dist/proxy/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/proxy/segment.ts","../../src/proxy/index.ts"],"names":["buildSecurityHeaders","buildAiDiscoveryHeaders","handleManagedRedirects","SK_PATH_HEADER","NextResponse","wantsLlmsDiscoveryLink","uuid"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @sonordev/site-kit/proxy — visitor segment resolution (the \"one edge pass\").\n *\n * Pure, edge-runtime-safe helpers that classify a request into a coarse visitor\n * segment (new-vs-returning + marketing source + campaign) from the URL's UTM\n * params and the referrer. The middleware writes the result to the `_sk_seg`\n * cookie so server-rendered slots / personalization can vary by segment WITHOUT\n * each one re-parsing the request. Resolved once, at the edge.\n *\n * Kept side-effect-free (no NextResponse, no cookie writes) so it is trivially\n * unit-testable and reusable.\n */\nimport type { NextRequest } from 'next/server'\n\nexport type SegmentSource = 'paid' | 'organic' | 'social' | 'referral' | 'direct'\n\nexport interface VisitorSegment {\n /** `new` on the first visit (no prior `_sk_vid` cookie), else `returning`. */\n visitorType: 'new' | 'returning'\n /** Marketing source bucket derived from UTM medium/source, then referrer. */\n source: SegmentSource\n /** `utm_campaign`, if present (sanitized when encoded). */\n campaign: string | null\n}\n\nconst PAID_MEDIUMS = ['cpc', 'ppc', 'paid', 'paidsearch', 'paid-search', 'display', 'cpm', 'banner']\nconst SOCIAL_MEDIUMS = ['social', 'social-media', 'social_media', 'sm']\nconst SOCIAL_HOSTS = [\n 'facebook.',\n 'instagram.',\n 'linkedin.',\n 't.co',\n 'twitter.',\n 'x.com',\n 'pinterest.',\n 'tiktok.',\n 'youtube.',\n 'reddit.',\n]\nconst SEARCH_HOSTS = ['google.', 'bing.', 'duckduckgo.', 'yahoo.', 'ecosia.', 'brave.', 'baidu.', 'yandex.']\n\n/**\n * Classify `request` into a {@link VisitorSegment}. UTM params win over the\n * referrer; a same-host referrer is ignored (internal navigation, not a source).\n */\nexport function resolveVisitorSegment(\n request: NextRequest,\n opts: { hadVisitorCookie: boolean },\n): VisitorSegment {\n const params = request.nextUrl.searchParams\n const medium = (params.get('utm_medium') || '').toLowerCase().trim()\n const campaign = params.get('utm_campaign')\n\n let source: SegmentSource = 'direct'\n\n if (PAID_MEDIUMS.includes(medium)) {\n source = 'paid'\n } else if (SOCIAL_MEDIUMS.includes(medium)) {\n source = 'social'\n } else if (medium === 'organic') {\n source = 'organic'\n } else if (medium === 'referral') {\n source = 'referral'\n } else if (params.get('utm_source') || params.get('gclid') || params.get('fbclid')) {\n // A tagged link with a non-standard medium: gclid => paid Google, fbclid => social.\n if (params.get('gclid')) source = 'paid'\n else if (params.get('fbclid')) source = 'social'\n else source = 'referral'\n } else {\n // No campaign tagging — fall back to the referrer host.\n const ref = request.headers.get('referer') || ''\n if (ref) {\n try {\n const host = new URL(ref).host.toLowerCase()\n const selfHost = request.nextUrl.host.toLowerCase()\n if (host && host !== selfHost) {\n if (SEARCH_HOSTS.some((h) => host.includes(h))) source = 'organic'\n else if (SOCIAL_HOSTS.some((h) => host.includes(h))) source = 'social'\n else source = 'referral'\n }\n } catch {\n /* malformed referer — stays 'direct' */\n }\n }\n }\n\n return {\n visitorType: opts.hadVisitorCookie ? 'returning' : 'new',\n source,\n campaign: campaign || null,\n }\n}\n\n/**\n * Compact, cookie-safe encoding: `\"<visitorType>|<source>|<campaign>\"`, e.g.\n * `\"new|paid|spring_sale\"`. Campaign is sanitized to `[A-Za-z0-9_-]` and capped.\n * Decode with {@link decodeSegment}.\n */\nexport function encodeSegment(seg: VisitorSegment): string {\n const campaign = (seg.campaign || '').replace(/[^a-zA-Z0-9_-]/g, '').slice(0, 40)\n return `${seg.visitorType}|${seg.source}|${campaign}`\n}\n\n/** Parse a `_sk_seg` cookie value produced by {@link encodeSegment}. */\nexport function decodeSegment(value: string | undefined | null): VisitorSegment | null {\n if (!value) return null\n const [visitorType, source, campaign] = value.split('|')\n if (visitorType !== 'new' && visitorType !== 'returning') return null\n return {\n visitorType,\n source: (['paid', 'organic', 'social', 'referral', 'direct'].includes(source) ? source : 'direct') as SegmentSource,\n campaign: campaign || null,\n }\n}\n","/**\n * @sonordev/site-kit/proxy\n *\n * Composable Next.js Proxy factory (Next 16's replacement for middleware).\n * Also served on the deprecated `/middleware` subpath. Handles:\n * - Security headers (CSP frame-ancestors, nosniff, referrer/permissions\n * policy — deliberately NO X-Frame-Options; see securityHeaders.ts)\n * - Portal-managed redirects (rule list cached in memory, see the\n * `redirects` option below)\n * - Stamps `x-sk-path` on the request (read by the deprecated not-found\n * resolver; kept so sites still using it don't break)\n * - Optional before/after hooks for custom logic\n *\n * @example\n * ```ts\n * // proxy.ts — entire file\n * import { createProxy } from '@sonordev/site-kit/proxy'\n *\n * export default createProxy()\n *\n * // Inlined on purpose: Next statically parses `config.matcher` at build\n * // time and REJECTS an imported value (Turbopack build error). Keep in\n * // sync with siteKitMatcher below.\n * export const config = {\n * matcher: [\n * '/((?!_next/static|_next/image|favicon\\\\.ico|.*\\\\.(?:ico|png|jpg|jpeg|gif|webp|svg|woff2?)$).*)',\n * ],\n * }\n * ```\n *\n * Next 16 notes: `middleware.ts` is deprecated (codemod:\n * `npx @next/codemod@canary middleware-to-proxy .`), Proxy defaults to the\n * Node.js runtime, and the `runtime` config option is unavailable in proxy\n * files — setting it throws at build time.\n *\n * @example With custom hooks:\n * ```ts\n * export default createProxy({\n * before: (req) => {\n * // Custom auth check, etc.\n * },\n * })\n * ```\n */\n\nimport { NextRequest, NextResponse } from 'next/server'\nimport {\n handleManagedRedirects,\n SK_PATH_HEADER,\n type RedirectConfig,\n} from '../redirects'\nimport {\n buildSecurityHeaders,\n type SecurityHeadersConfig,\n} from './securityHeaders'\nimport { buildAiDiscoveryHeaders, wantsLlmsDiscoveryLink } from '../llms/discovery-headers'\nimport { resolveVisitorSegment, encodeSegment } from './segment'\n// Single source of truth for v4 UUIDs — Web Crypto in the edge runtime, with a\n// non-throwing fallback everywhere else. Do NOT re-fork ID generation here.\nimport { uuid } from '../shared/uuid'\n\nexport type { SecurityHeadersConfig } from './securityHeaders'\nexport { DEFAULT_FRAME_ANCESTORS } from './securityHeaders'\nexport {\n resolveVisitorSegment,\n encodeSegment,\n decodeSegment,\n type VisitorSegment,\n type SegmentSource,\n} from './segment'\n\nexport interface IdentityConfig {\n /**\n * Also resolve + persist a coarse visitor segment (new-vs-returning + source\n * + campaign) into the `_sk_seg` cookie, for segment-aware slots /\n * personalization. Default: true (when identity is enabled).\n */\n segment?: boolean\n /** Days the `_sk_vid` visitor cookie persists. Default: 730 (~2 years). */\n cookieMaxAgeDays?: number\n}\n\nexport interface LlmsDiscoveryConfig {\n /** Canonical site origin, e.g. `https://example.com` */\n siteUrl: string\n /** Path to llms.txt (default `/llms.txt`) */\n llmsPath?: string\n}\n\nexport interface SiteKitProxyConfig {\n /**\n * Portal-managed redirects, checked before each page render. Default: true,\n * and the recommended setting.\n *\n * The rule list is cached in memory for `cacheSeconds` (default 300) per\n * instance, and a fetch is bounded at 300ms with a 30s failure cooldown,\n * so page loads rarely wait on it. Set `false` only on a site that uses no\n * Sonor-managed redirects.\n *\n * Don't move redirects into app/not-found.tsx with\n * `resolveManagedRedirect()`. Next renders the root not-found boundary\n * inside every page, and the resolver's headers() call opts every route\n * into dynamic rendering (verified on a Next 16 build: every ○ route became\n * ƒ). That resolver is deprecated.\n */\n redirects?: boolean | RedirectConfig\n /** Enable security headers. Default: true */\n securityHeaders?: boolean | SecurityHeadersConfig\n /**\n * Opt-in: inject `Link: <...>; rel=\"describedby\"` header on HTML responses\n * pointing to /llms.txt for AI crawler discovery (RFC 8288).\n * Preferred over visible footer links.\n */\n llmsDiscovery?: LlmsDiscoveryConfig | false\n /**\n * Opt-in EDGE IDENTITY pass. When enabled, the middleware ensures a\n * first-party `_sk_vid` visitor cookie exists (server-authoritative id) and\n * resolves the visitor segment into `_sk_seg`, so server-rendered slots and\n * personalization can read identity + segment without re-parsing the request.\n * Purely additive — it only writes cookies, never changes the rendered HTML,\n * so it is LCP/static-safe. Default: OFF (sites opt in for 3.0 personalization).\n *\n * NOTE: to make these the SAME id the client uses, the shared identity helper\n * must read `_sk_vid` cookie-first (a follow-on change validated with a live\n * preview); until then the cookie is the server-side mirror.\n */\n identity?: boolean | IdentityConfig\n /**\n * Hook that runs BEFORE redirect check.\n * Return a NextResponse to short-circuit, or undefined to continue.\n */\n before?: (\n request: NextRequest,\n ) => NextResponse | undefined | Promise<NextResponse | undefined>\n /**\n * Hook that runs AFTER all processing.\n * Receives the response that will be sent — mutate headers, etc.\n */\n after?: (\n request: NextRequest,\n response: NextResponse,\n ) => NextResponse | Promise<NextResponse>\n}\n\n/**\n * Create a fully-featured Next.js Proxy function.\n *\n * With zero config this handles redirects + security headers automatically.\n * Export it from `proxy.ts` at the project root (or `src/`).\n */\nexport function createProxy(config?: SiteKitProxyConfig) {\n const securityHeaders = buildSecurityHeaders(\n config?.securityHeaders,\n )\n\n // Pre-compute discovery headers (static per middleware instance)\n const discoveryHeaders: Record<string, string> =\n config?.llmsDiscovery\n ? buildAiDiscoveryHeaders({\n siteUrl: config.llmsDiscovery.siteUrl,\n llmsPath: config.llmsDiscovery.llmsPath,\n })\n : {}\n\n return async function proxy(\n request: NextRequest,\n ): Promise<NextResponse> {\n // 1. Run user's 'before' hook\n if (config?.before) {\n const earlyResponse = await config.before(request)\n if (earlyResponse) {\n // Apply security headers even to early responses\n applyHeaders(earlyResponse, securityHeaders)\n return earlyResponse\n }\n }\n\n // 2. Check Portal-managed redirects (unless disabled)\n if (config?.redirects !== false) {\n const redirectConfig: RedirectConfig =\n typeof config?.redirects === 'object'\n ? config.redirects\n : {}\n\n const redirect = await handleManagedRedirects(\n request,\n redirectConfig,\n )\n if (redirect) {\n // Redirects get security headers too\n applyHeaders(redirect, securityHeaders)\n return redirect\n }\n }\n\n // 3. Build the pass-through response. Stamp the requested\n // pathname+search onto the REQUEST for the deprecated not-found\n // resolver, so sites still calling it keep working.\n // Pure header write — no fetch, static-safe.\n const requestHeaders = new Headers(request.headers)\n requestHeaders.set(\n SK_PATH_HEADER,\n request.nextUrl.pathname + request.nextUrl.search,\n )\n let response = NextResponse.next({ request: { headers: requestHeaders } })\n\n // 4. Apply security headers\n applyHeaders(response, securityHeaders)\n\n // 5. Apply the AI discovery Link header to anything that could be a page.\n // A request with no Accept header counts: that's how curl and many\n // crawlers ask, and they're who the header is for.\n if (\n Object.keys(discoveryHeaders).length > 0 &&\n wantsLlmsDiscoveryLink({\n method: request.method,\n pathname: request.nextUrl.pathname,\n accept: request.headers.get('accept'),\n rsc: request.headers.get('rsc'),\n })\n ) {\n applyHeaders(response, discoveryHeaders)\n }\n\n // 5b. Edge identity pass (opt-in). Ensure a first-party `_sk_vid` visitor\n // cookie exists and resolve the visitor segment into `_sk_seg`. Additive:\n // only writes cookies, never changes the rendered HTML (LCP/static-safe).\n if (config?.identity) {\n const idCfg: IdentityConfig =\n typeof config.identity === 'object' ? config.identity : {}\n const hadVisitorCookie = !!request.cookies.get('_sk_vid')?.value\n if (!hadVisitorCookie) {\n const maxAgeDays = idCfg.cookieMaxAgeDays ?? 730\n response.cookies.set('_sk_vid', uuid(), {\n maxAge: maxAgeDays * 24 * 60 * 60,\n path: '/',\n sameSite: 'lax',\n secure: true,\n })\n }\n if (idCfg.segment !== false) {\n const segment = encodeSegment(\n resolveVisitorSegment(request, { hadVisitorCookie }),\n )\n response.cookies.set('_sk_seg', segment, {\n // Session-ish: a fresh campaign / source on a later visit re-segments.\n maxAge: 30 * 60,\n path: '/',\n sameSite: 'lax',\n secure: true,\n })\n }\n }\n\n // 6. Run user's 'after' hook\n if (config?.after) {\n response = await config.after(request, response)\n }\n\n return response\n }\n}\n\nfunction applyHeaders(\n response: NextResponse,\n headers: Record<string, string>,\n): void {\n for (const [key, value] of Object.entries(headers)) {\n response.headers.set(key, value)\n }\n}\n\n/**\n * REFERENCE VALUE ONLY — copy the array into your proxy.ts, do not export it.\n *\n * `export const config = siteKitMatcher` is a BUILD ERROR on Next 16:\n * `config.matcher` must be statically analyzable and Turbopack rejects any\n * imported value. This constant exists so the canonical pattern lives in one\n * place (the scaffold, docs, and tests read it) — inline its contents.\n */\nexport const siteKitMatcher = {\n matcher: [\n '/((?!_next/static|_next/image|favicon\\\\.ico|.*\\\\.(?:ico|png|jpg|jpeg|gif|webp|svg|woff2?)$).*)',\n ],\n}\n\n/**\n * @deprecated Use `createProxy`. Next 16 renamed the `middleware` file\n * convention to `proxy` (`npx @next/codemod@canary middleware-to-proxy .`);\n * the old name still builds but warns, and the factory is named for the file\n * it is exported from. Kept indefinitely — 100+ fleet sites import it — but\n * new code should say `createProxy` from `@sonordev/site-kit/proxy`.\n */\nexport const createMiddleware = createProxy\n\n/** @deprecated Use `SiteKitProxyConfig`. */\nexport type SiteKitMiddlewareConfig = SiteKitProxyConfig\n"]}
|