@sonordev/site-kit 8.5.2 → 8.7.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/CHANGELOG.md +16 -0
- package/agent-manifest.json +1 -1
- package/dist/{AnalyticsProvider-HSJMHYBA.js → AnalyticsProvider-3UIQMIRW.js} +6 -6
- package/dist/{ArticleViewTracker-XEA6ZY67.js → ArticleViewTracker-KNXP2DXL.js} +5 -5
- package/dist/{BlocksPopup-DUTOENMQ.js → BlocksPopup-DFE32GPX.js} +9 -8
- package/dist/{ChatWidget-PMVQTSEU.js → ChatWidget-L74L4YAD.js} +6 -6
- package/dist/FileField-P3PLEAON.js +237 -0
- package/dist/{FormSpotlight-RTPJPLQ3.js → FormSpotlight-DNBSBRIE.js} +2 -2
- package/dist/{FormStage-UANGD66Z.js → FormStage-I4JGLT57.js} +2 -2
- package/dist/{ManagedForm-4AACRHEY.js → ManagedForm-GJRGBM6W.js} +8 -8
- package/dist/{ManagedNewsletterForm-RWKFWZ72.js → ManagedNewsletterForm-AUZ6YB7G.js} +11 -11
- package/dist/{SignalCore-XULLPKPX.js → SignalCore-UV7K7PT4.js} +5 -5
- package/dist/SiteChat-6UWE545R.js +6 -0
- package/dist/SiteDesignReporter-ZSU76DZJ.js +13 -0
- package/dist/{SitePopups-US6VQN7X.js → SitePopups-XHWU7GNF.js} +6 -6
- package/dist/SitemapSync-ELWV6W7Y.js +9 -0
- package/dist/_client/booking-widget.js +5 -5
- package/dist/affiliates/index.js +3 -3
- package/dist/analytics/content-text.d.ts +17 -0
- package/dist/analytics/index.js +6 -6
- package/dist/{article-styles-VASFBYA3.js → article-styles-D7VCDXMG.js} +2 -1
- package/dist/article-tables-W45BE353.js +3 -0
- package/dist/articles/index.js +7 -20
- package/dist/articles/server-ui.js +29 -55
- package/dist/articles/server.js +6 -5
- package/dist/chat/index.js +9 -9
- package/dist/{chunk-3RDJKIYO.js → chunk-2WDWQI7K.js} +1 -1
- package/dist/{chunk-DLTLXYOV.js → chunk-36ZMNBXZ.js} +4 -9
- package/dist/chunk-3MJNBOUO.js +8 -0
- package/dist/{chunk-IXA7ZB6U.js → chunk-3MLWIBHX.js} +1 -1
- package/dist/{chunk-BF7TZYC3.js → chunk-52KO4LKD.js} +1 -1
- package/dist/{chunk-ZDUTXHM6.js → chunk-5WHBYQJ4.js} +3 -3
- package/dist/{chunk-5D7ZISUP.js → chunk-7DYMM6SS.js} +11 -6
- package/dist/{chunk-HNYECNCU.js → chunk-7YB3QA4P.js} +15 -7
- package/dist/{chunk-N4ZCNYWF.js → chunk-A2MDVP47.js} +1 -1
- package/dist/{chunk-E4PTMORJ.js → chunk-AL5UCWLI.js} +23 -8
- package/dist/{chunk-ANVHRT35.js → chunk-BAJUXQTH.js} +2 -2
- package/dist/{chunk-ITQND6IB.js → chunk-BJYX6SFI.js} +2 -2
- package/dist/{chunk-TYAVHRWH.js → chunk-CVADNHJ4.js} +8 -2
- package/dist/{chunk-5BRHTBPO.js → chunk-DJIGFX33.js} +1 -1
- package/dist/{chunk-ZSU7KTIE.js → chunk-DPYGC7WE.js} +2 -2
- package/dist/{chunk-XA7Q2VQA.js → chunk-EK7P62DT.js} +1 -1
- package/dist/chunk-FXR5PJDL.js +420 -0
- package/dist/{chunk-GLLFIE2R.js → chunk-G5FD7UXK.js} +2 -2
- package/dist/{chunk-OFQ3BU52.js → chunk-HM7CDWFK.js} +1 -1
- package/dist/{chunk-Q4Y3WIHE.js → chunk-HWQPCZOX.js} +1 -1
- package/dist/{chunk-6KU7STM3.js → chunk-HY7ZEU2C.js} +3 -1
- package/dist/chunk-IBHBEUZV.js +27 -0
- package/dist/{chunk-7HRYSLY2.js → chunk-IXZBOOAD.js} +4 -4
- package/dist/chunk-JESLPEST.js +14 -0
- package/dist/{chunk-BC7JMY4Z.js → chunk-JG53YJLM.js} +58 -1
- package/dist/{chunk-FVXCQC7W.js → chunk-JWCCY72G.js} +1 -1
- package/dist/{chunk-RI2N2EBI.js → chunk-JYITKUUB.js} +13 -5
- package/dist/chunk-KIYACQW3.js +1 -0
- package/dist/{chunk-YW3LNSBM.js → chunk-KLIDCNML.js} +1 -1
- package/dist/{chunk-3PT6SO65.js → chunk-L2KSHJS2.js} +5 -5
- package/dist/{chunk-27LYZVPP.js → chunk-LGWN6KCN.js} +2 -2
- package/dist/{chunk-GTVOB5RN.js → chunk-MJW6YIDJ.js} +1 -1
- package/dist/{chunk-CFSIGEUW.js → chunk-MNORERMF.js} +1 -1
- package/dist/{chunk-Y35BWW2C.js → chunk-ODOV76VW.js} +1 -1
- package/dist/{chunk-EQHGPB3J.js → chunk-OHLCE4GC.js} +2 -2
- package/dist/{chunk-OEA7U4HJ.js → chunk-P5PRR2BB.js} +1 -1
- package/dist/{chunk-JJ4JS3LD.js → chunk-PAYCK7FC.js} +1 -1
- package/dist/{chunk-DLM4FFNH.js → chunk-QTBAKOCZ.js} +1 -1
- package/dist/{chunk-2QFIYYMP.js → chunk-RHT7OZNF.js} +1 -1
- package/dist/{chunk-UGZ3B5AK.js → chunk-RWWSOYJO.js} +9 -9
- package/dist/{chunk-T6U6J3QK.js → chunk-T6TWPKBL.js} +1 -1
- package/dist/{chunk-5SQK3D53.js → chunk-TYSIAWC3.js} +1 -0
- package/dist/{chunk-24NM64IV.js → chunk-U4OQJQK6.js} +3 -3
- package/dist/{chunk-GDQKDL3E.js → chunk-UYOE3HA4.js} +2 -2
- package/dist/chunk-VEJD5EJ2.js +344 -0
- package/dist/{chunk-LNSF6BJC.js → chunk-VPZJ7ZTL.js} +2 -2
- package/dist/chunk-XAZC2TUD.js +1119 -0
- package/dist/{chunk-A7RZQI6H.js → chunk-XC2TWYDV.js} +3 -3
- package/dist/{chunk-URJN75ZG.js → chunk-XIDWNXZN.js} +3 -3
- package/dist/chunk-XLAHRN4B.js +1 -0
- package/dist/{chunk-URZTBPZO.js → chunk-XZFOQ2V4.js} +113 -93
- package/dist/{chunk-I4LMZNBN.js → chunk-YYPYLYZM.js} +1 -1
- package/dist/client/index.js +4 -4
- package/dist/contracts/broadcast-layouts.d.ts +133 -0
- package/dist/contracts/business-claims.d.ts +456 -0
- package/dist/contracts/campaign-normalize.d.ts +2 -0
- package/dist/contracts/entries.d.ts +1 -1
- package/dist/contracts/funnels.d.ts +576 -0
- package/dist/contracts/inbox.d.ts +42 -0
- package/dist/contracts/llms.d.ts +200 -0
- package/dist/contracts/outreach.d.ts +267 -0
- package/dist/contracts/page-titles.d.ts +140 -0
- package/dist/contracts/portfolio.d.ts +170 -0
- package/dist/contracts/public-url-host.d.ts +10 -0
- package/dist/contracts/publication-branding.d.ts +151 -0
- package/dist/contracts/publication-charter.d.ts +14 -0
- package/dist/contracts/site-cache.d.ts +2 -0
- package/dist/fleet/index.js +6 -6
- package/dist/forms/FileField.d.ts +3 -1
- package/dist/forms/PrivateFileField.d.ts +3 -0
- package/dist/forms/index.js +11 -11
- package/dist/forms/private-file-rules.d.ts +8 -0
- package/dist/forms/server.js +5 -5
- package/dist/forms/static.js +3 -3
- package/dist/forms/styles.css +17 -1
- package/dist/forms/types.d.ts +4 -0
- package/dist/images/index.js +4 -4
- package/dist/index.js +1 -1
- package/dist/landing/contract.d.ts +2 -13
- package/dist/landing/contract.js +2 -0
- package/dist/landing/index.js +4 -2
- package/dist/landing/managed-server.d.ts +21 -0
- package/dist/landing/managed.d.ts +11 -0
- package/dist/landing/metadata.js +2 -0
- package/dist/landing/server.d.ts +5 -0
- package/dist/landing/server.js +19 -2
- package/dist/layout/client.js +9 -9
- package/dist/layout/index.js +10 -10
- package/dist/llms/contract.js +2 -1
- package/dist/llms/index.js +9 -7
- package/dist/llms/merge.d.ts +29 -0
- package/dist/maps/index.js +3 -3
- package/dist/mcp/sonor.js +12 -11
- package/dist/portfolio/contract.js +1 -1
- package/dist/press-kit/articles/article-body.d.ts +13 -0
- package/dist/press-kit/articles/article-heading-ids.d.ts +7 -0
- package/dist/press-kit/articles/article-headings.d.ts +61 -0
- package/dist/press-kit/articles/html-tags.d.ts +46 -0
- package/dist/press-kit/articles/types.d.ts +2 -0
- package/dist/revalidate/index.js +3 -3
- package/dist/runtime/index.js +3 -3
- package/dist/seo/client.js +6 -6
- package/dist/seo/index.js +14 -13
- package/dist/seo/llms/contract.js +2 -1
- package/dist/seo/llms.js +9 -7
- package/dist/seo/meta/contract.js +2 -1
- package/dist/seo/register-sitemap-cli.js +1 -1
- package/dist/seo/server.js +5 -4
- package/dist/seo/sitemap.js +7 -5
- package/dist/seo-meta/contract.js +2 -1
- package/dist/server/index.js +3 -3
- package/dist/{server-api-EGOKC7Q3.js → server-api-XIKDWSNO.js} +2 -2
- package/dist/shared/build-entries.d.ts +3 -1
- package/dist/shared/markdown.d.ts +7 -6
- package/dist/shared/version.d.ts +1 -1
- package/dist/signal/index.js +2 -2
- package/dist/sitemap/index.js +7 -5
- package/dist/slots/index.js +2 -2
- package/dist/sync/index.js +5 -5
- package/dist/website/contract.js +2 -1
- package/dist/website/images.js +4 -4
- package/dist/website/index.js +10 -9
- package/dist/website/landing/server.js +19 -2
- package/dist/website/landing.js +4 -2
- package/dist/website/popups.js +9 -8
- package/dist/website/slots.js +2 -2
- package/dist/{writeLLMsTxt-BAK5XMRR.js → writeLLMsTxt-QN2HIVT4.js} +6 -4
- package/docs.json +5 -0
- package/package.json +1 -1
- package/src/analytics/README.md +1 -1
- package/src/forms/README.md +22 -0
- package/src/landing/README.md +64 -0
- package/src/llms/README.md +52 -20
- package/dist/FileField-F7BG4XAZ.js +0 -83
- package/dist/SiteChat-P4CRBRJZ.js +0 -6
- package/dist/SiteDesignReporter-QDVP4WMK.js +0 -12
- package/dist/SitemapSync-5FBRDGHG.js +0 -9
- package/dist/article-tables-6XHVULPU.js +0 -2
- package/dist/chunk-EKBEOXTH.js +0 -114
- package/dist/chunk-NZ4RXN3G.js +0 -145
- package/dist/chunk-OSYCOC3K.js +0 -21
- /package/dist/{chunk-7ZWO5HDQ.js → chunk-BTHEQDN4.js} +0 -0
- /package/dist/{chunk-BQR4IPBW.js → chunk-ISRBSTB7.js} +0 -0
- /package/dist/{chunk-IHG36STL.js → chunk-XHYE24HU.js} +0 -0
package/dist/sitemap/index.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
export { createSitemap, getPortfolioPaths, syncSitemapToPortal } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
3
|
-
import '../chunk-
|
|
1
|
+
export { createSitemap, getPortfolioPaths, syncSitemapToPortal } from '../chunk-3MLWIBHX.js';
|
|
2
|
+
import '../chunk-XZFOQ2V4.js';
|
|
3
|
+
import '../chunk-EK7P62DT.js';
|
|
4
4
|
import '../chunk-Z22QVHT4.js';
|
|
5
|
-
import '../chunk-
|
|
5
|
+
import '../chunk-7DYMM6SS.js';
|
|
6
|
+
import '../chunk-IBHBEUZV.js';
|
|
6
7
|
import '../chunk-4K735O3J.js';
|
|
7
8
|
import '../chunk-UAYAJPEP.js';
|
|
8
|
-
import '../chunk-
|
|
9
|
+
import '../chunk-XAZC2TUD.js';
|
|
10
|
+
import '../chunk-ISRBSTB7.js';
|
|
9
11
|
import '../chunk-MJP63SSS.js';
|
|
10
12
|
import '../chunk-ZEGVKVD5.js';
|
|
11
13
|
import '../chunk-YVKRYQRG.js';
|
package/dist/slots/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { ManagedLink, ManagedList, ManagedRichText, ManagedSlot, SLOTS_CACHE_TAG, createSlotsRevalidateHandler, ManagedSlot_default as default, getSlot, renderSlotRichText, resolveSlots } from '../chunk-
|
|
1
|
+
export { ManagedLink, ManagedList, ManagedRichText, ManagedSlot, SLOTS_CACHE_TAG, createSlotsRevalidateHandler, ManagedSlot_default as default, getSlot, renderSlotRichText, resolveSlots } from '../chunk-2WDWQI7K.js';
|
|
2
2
|
export { SLOTS_CONTRACT_VERSION, signSlotContent, slotSigningPayload, verifySlotContent } from '../chunk-VCJYLYJV.js';
|
|
3
3
|
export { SLOT_CONTENT_MAX_LENGTH, SLOT_CONTENT_TYPES, SLOT_ID_PATTERN, SLOT_LIST_MAX_ITEMS, isSafeSlotHref, isValidSlotId, normalizeSlotValue, parseSlotRichText } from '../chunk-LPH5FANE.js';
|
|
4
|
-
import '../chunk-
|
|
4
|
+
import '../chunk-HY7ZEU2C.js';
|
|
5
5
|
import '../chunk-C7TLGL3R.js';
|
|
6
6
|
import '../chunk-MH2DSGC6.js';
|
|
7
7
|
import '../chunk-PKBMQBKP.js';
|
package/dist/sync/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export { BookingWidget } from '../chunk-
|
|
2
|
-
export { createBooking, createSlotHold, detectTimezone, fetchAvailability, fetchAvailableDates, fetchBookingTypeDetails, fetchBookingTypes, formatDate, formatDuration, formatTime, prepareMeeting, releaseSlotHold } from '../chunk-
|
|
1
|
+
export { BookingWidget } from '../chunk-YYPYLYZM.js';
|
|
2
|
+
export { createBooking, createSlotHold, detectTimezone, fetchAvailability, fetchAvailableDates, fetchBookingTypeDetails, fetchBookingTypes, formatDate, formatDuration, formatTime, prepareMeeting, releaseSlotHold } from '../chunk-DJIGFX33.js';
|
|
3
3
|
import '../chunk-5ROTTMBL.js';
|
|
4
4
|
import '../chunk-5TM3WPCI.js';
|
|
5
|
-
import '../chunk-
|
|
6
|
-
import '../chunk-
|
|
5
|
+
import '../chunk-UYOE3HA4.js';
|
|
6
|
+
import '../chunk-P5PRR2BB.js';
|
|
7
7
|
import '../chunk-W7OPEMGJ.js';
|
|
8
|
-
import '../chunk-
|
|
8
|
+
import '../chunk-MNORERMF.js';
|
|
9
9
|
import '../chunk-PKBMQBKP.js';
|
package/dist/website/contract.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import '../chunk-XLAHRN4B.js';
|
|
2
|
+
export { DESIGN_TOKENS_VERSION, POPUP_BLOCK_LIMITS, POPUP_BLOCK_TYPES, designTokenCssVars, designTokensHash, isSafePopupUrl, mixHex, normalizeDesignTokens, normalizePopupBlocks, popupBlocksText, popupHtmlText, readableOn, sanitizePopupHtml, toHexColor } from '../chunk-XHYE24HU.js';
|
|
2
3
|
import '../chunk-S22FSH7C.js';
|
|
3
4
|
import '../chunk-PKBMQBKP.js';
|
package/dist/website/images.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { ManagedImage, assignImageToSlot, clearImageSlot, fetchManagedImage, fetchManagedImages, listImageFiles, uploadImage } from '../chunk-
|
|
1
|
+
export { ManagedImage, assignImageToSlot, clearImageSlot, fetchManagedImage, fetchManagedImages, listImageFiles, uploadImage } from '../chunk-HWQPCZOX.js';
|
|
2
2
|
export { ManagedFavicon, getManagedFaviconUrl } from '../chunk-GW7GSBO7.js';
|
|
3
|
-
import '../chunk-
|
|
4
|
-
import '../chunk-
|
|
5
|
-
import '../chunk-
|
|
3
|
+
import '../chunk-UYOE3HA4.js';
|
|
4
|
+
import '../chunk-P5PRR2BB.js';
|
|
5
|
+
import '../chunk-MNORERMF.js';
|
|
6
6
|
import '../chunk-PKBMQBKP.js';
|
package/dist/website/index.js
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
export { SiteDesignReporter } from '../chunk-
|
|
3
|
-
export { SITE_DESIGN_PATH, cleanFontStack, colorToHex, getSiteDesignTokens, measureSiteDesign, readDeclaredDesign, sendSiteDesign } from '../chunk-
|
|
4
|
-
export { DEFAULT_POPUP_TOKENS, PopupBlocks } from '../chunk-
|
|
5
|
-
import '../chunk-
|
|
2
|
+
export { SiteDesignReporter } from '../chunk-XC2TWYDV.js';
|
|
3
|
+
export { SITE_DESIGN_PATH, cleanFontStack, colorToHex, getSiteDesignTokens, measureSiteDesign, readDeclaredDesign, sendSiteDesign } from '../chunk-IXZBOOAD.js';
|
|
4
|
+
export { DEFAULT_POPUP_TOKENS, PopupBlocks } from '../chunk-52KO4LKD.js';
|
|
5
|
+
import '../chunk-XLAHRN4B.js';
|
|
6
|
+
import '../chunk-XHYE24HU.js';
|
|
6
7
|
import '../chunk-YC7ELZS3.js';
|
|
7
8
|
import '../chunk-S22FSH7C.js';
|
|
8
|
-
import '../chunk-
|
|
9
|
-
import '../chunk-
|
|
10
|
-
import '../chunk-
|
|
11
|
-
import '../chunk-
|
|
9
|
+
import '../chunk-QTBAKOCZ.js';
|
|
10
|
+
import '../chunk-VEJD5EJ2.js';
|
|
11
|
+
import '../chunk-UYOE3HA4.js';
|
|
12
|
+
import '../chunk-P5PRR2BB.js';
|
|
12
13
|
import '../chunk-W7OPEMGJ.js';
|
|
13
|
-
import '../chunk-
|
|
14
|
+
import '../chunk-MNORERMF.js';
|
|
14
15
|
import '../chunk-PKBMQBKP.js';
|
|
@@ -1,3 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
export { FunnelPageContent, ManagedFunnelPage, getPublishedFunnelPage, managedFunnelMetadata } from '../../chunk-FXR5PJDL.js';
|
|
2
|
+
import '../../chunk-PAYCK7FC.js';
|
|
3
|
+
export { normalizeCampaignSlug } from '../../chunk-3MJNBOUO.js';
|
|
4
|
+
export { landingPageMetadata } from '../../chunk-JESLPEST.js';
|
|
5
|
+
import '../../chunk-XHYE24HU.js';
|
|
6
|
+
import '../../chunk-DPYGC7WE.js';
|
|
7
|
+
import '../../chunk-G5FD7UXK.js';
|
|
8
|
+
import '../../chunk-C2FZBUSS.js';
|
|
9
|
+
import '../../chunk-YC7ELZS3.js';
|
|
10
|
+
import '../../chunk-VPZJ7ZTL.js';
|
|
11
|
+
import '../../chunk-DXO6SBMD.js';
|
|
12
|
+
import '../../chunk-CVADNHJ4.js';
|
|
13
|
+
import '../../chunk-TYSIAWC3.js';
|
|
14
|
+
import '../../chunk-HW7B43E5.js';
|
|
15
|
+
import '../../chunk-NJCTQH2P.js';
|
|
16
|
+
import '../../chunk-C7TLGL3R.js';
|
|
17
|
+
import '../../chunk-MH2DSGC6.js';
|
|
18
|
+
import '../../chunk-S22FSH7C.js';
|
|
19
|
+
import '../../chunk-A4CC4ZG3.js';
|
|
3
20
|
import '../../chunk-PKBMQBKP.js';
|
package/dist/website/landing.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
export {
|
|
1
|
+
import '../chunk-BTHEQDN4.js';
|
|
2
|
+
export { LandingPage } from '../chunk-PAYCK7FC.js';
|
|
3
|
+
export { normalizeCampaignSlug } from '../chunk-3MJNBOUO.js';
|
|
4
|
+
export { landingPageMetadata } from '../chunk-JESLPEST.js';
|
|
3
5
|
import '../chunk-PKBMQBKP.js';
|
package/dist/website/popups.js
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
export { SitePopups } from '../chunk-
|
|
2
|
+
export { SitePopups } from '../chunk-U4OQJQK6.js';
|
|
3
3
|
import '../chunk-27FISYK4.js';
|
|
4
|
-
export { DEFAULT_POPUP_TOKENS, PopupBlocks } from '../chunk-
|
|
5
|
-
import '../chunk-
|
|
4
|
+
export { DEFAULT_POPUP_TOKENS, PopupBlocks } from '../chunk-52KO4LKD.js';
|
|
5
|
+
import '../chunk-XLAHRN4B.js';
|
|
6
|
+
import '../chunk-XHYE24HU.js';
|
|
6
7
|
import '../chunk-5ROTTMBL.js';
|
|
7
8
|
import '../chunk-S22FSH7C.js';
|
|
8
9
|
import '../chunk-IPQKQEWI.js';
|
|
9
10
|
import '../chunk-GJWI74ZZ.js';
|
|
10
11
|
import '../chunk-5TM3WPCI.js';
|
|
11
|
-
import '../chunk-
|
|
12
|
-
import '../chunk-
|
|
13
|
-
import '../chunk-
|
|
14
|
-
import '../chunk-
|
|
12
|
+
import '../chunk-QTBAKOCZ.js';
|
|
13
|
+
import '../chunk-VEJD5EJ2.js';
|
|
14
|
+
import '../chunk-UYOE3HA4.js';
|
|
15
|
+
import '../chunk-P5PRR2BB.js';
|
|
15
16
|
import '../chunk-W7OPEMGJ.js';
|
|
16
|
-
import '../chunk-
|
|
17
|
+
import '../chunk-MNORERMF.js';
|
|
17
18
|
import '../chunk-PKBMQBKP.js';
|
package/dist/website/slots.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { ManagedLink, ManagedList, ManagedRichText, ManagedSlot, SLOTS_CACHE_TAG, createSlotsRevalidateHandler, ManagedSlot_default as default, getSlot, renderSlotRichText, resolveSlots } from '../chunk-
|
|
1
|
+
export { ManagedLink, ManagedList, ManagedRichText, ManagedSlot, SLOTS_CACHE_TAG, createSlotsRevalidateHandler, ManagedSlot_default as default, getSlot, renderSlotRichText, resolveSlots } from '../chunk-2WDWQI7K.js';
|
|
2
2
|
export { SLOTS_CONTRACT_VERSION, signSlotContent, slotSigningPayload, verifySlotContent } from '../chunk-VCJYLYJV.js';
|
|
3
3
|
export { SLOT_CONTENT_MAX_LENGTH, SLOT_CONTENT_TYPES, SLOT_ID_PATTERN, SLOT_LIST_MAX_ITEMS, isSafeSlotHref, isValidSlotId, normalizeSlotValue, parseSlotRichText } from '../chunk-LPH5FANE.js';
|
|
4
|
-
import '../chunk-
|
|
4
|
+
import '../chunk-HY7ZEU2C.js';
|
|
5
5
|
import '../chunk-C7TLGL3R.js';
|
|
6
6
|
import '../chunk-MH2DSGC6.js';
|
|
7
7
|
import '../chunk-PKBMQBKP.js';
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
export { writeLLMsTxtToPublic } from './chunk-
|
|
2
|
-
import './chunk-
|
|
3
|
-
import './chunk-
|
|
1
|
+
export { writeLLMsTxtToPublic } from './chunk-XZFOQ2V4.js';
|
|
2
|
+
import './chunk-EK7P62DT.js';
|
|
3
|
+
import './chunk-7DYMM6SS.js';
|
|
4
|
+
import './chunk-IBHBEUZV.js';
|
|
4
5
|
import './chunk-4K735O3J.js';
|
|
5
6
|
import './chunk-UAYAJPEP.js';
|
|
6
|
-
import './chunk-
|
|
7
|
+
import './chunk-XAZC2TUD.js';
|
|
8
|
+
import './chunk-ISRBSTB7.js';
|
|
7
9
|
import './chunk-MJP63SSS.js';
|
|
8
10
|
import './chunk-YVKRYQRG.js';
|
|
9
11
|
import './chunk-FESKKJAS.js';
|
package/docs.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sonordev/site-kit",
|
|
3
|
-
"version": "8.
|
|
3
|
+
"version": "8.7.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"packageManager": "pnpm@11.5.3",
|
|
6
6
|
"description": "Sonor's Next.js foundation: SEO, analytics, forms, chat, booking, AI visibility and agent tools. Add @sonordev/press-kit for publications or @sonordev/commerce-kit for selling. Legacy article imports remain compatible in 8.x.",
|
package/src/analytics/README.md
CHANGED
|
@@ -168,7 +168,7 @@ interface AnalyticsConfig {
|
|
|
168
168
|
- **Page views**: on every route change (path, URL, title, referrer, UTM params, device/browser/OS)
|
|
169
169
|
- **Web Vitals**: LCP, CLS, TTFB, INP, FCP with good/needs-improvement/poor ratings
|
|
170
170
|
- **Contact clicks**: `tel:` and `mailto:` links tracked as conversions, once `<ContactTracking />` is mounted (it isn't by default)
|
|
171
|
-
- **DOM metadata**: full snapshot per page view (meta tags, H1, word count, links, content, FAQs)
|
|
171
|
+
- **DOM metadata**: full snapshot per page view (meta tags, H1, word count, links, content, FAQs). The content text keeps the page's elements apart (a space after every block element and line break) and leaves out menus, form fields, buttons and dialogs, so a heading never runs into the paragraph after it
|
|
172
172
|
|
|
173
173
|
## Embedded pages report nothing (`analytics.allowInFrame`)
|
|
174
174
|
|
package/src/forms/README.md
CHANGED
|
@@ -313,6 +313,28 @@ tag, and add `autocompleteFor` to your controls for the autofill tokens.
|
|
|
313
313
|
form can send a managed form, so `enhance={false}` only ever produced a form
|
|
314
314
|
that silently went nowhere.
|
|
315
315
|
|
|
316
|
+
## Private documents (8.6.0+)
|
|
317
|
+
|
|
318
|
+
A managed `file` field with `validation.private_attachments: true` uses the
|
|
319
|
+
private document control. Set `validation.max_files` from one to four. It
|
|
320
|
+
accepts PDF, JPEG, PNG and WebP, up to 10 MB per file, with drag and drop,
|
|
321
|
+
upload status, removal and retry. A required field stays unanswered until
|
|
322
|
+
every selected file has uploaded successfully.
|
|
323
|
+
|
|
324
|
+
This requires the Sonor API private attachment migration and endpoints plus
|
|
325
|
+
the Sonor app's authorized document download controls. It never falls back
|
|
326
|
+
to the public media upload endpoint. The server-rendered file control stays
|
|
327
|
+
disabled until enhancement, so it can't accidentally use a public upload.
|
|
328
|
+
Keep the private flag in `ServerForm`'s `initialConfig`; if configuration is
|
|
329
|
+
unavailable, render a contact fallback instead of fetching an unmarked field.
|
|
330
|
+
|
|
331
|
+
Uploads return signed, expiring grants. Submissions store private document
|
|
332
|
+
references, and the Sonor app obtains short-lived download URLs only after
|
|
333
|
+
checking access to the submission. Do not display those references as links.
|
|
334
|
+
|
|
335
|
+
Date and file controls load on demand. They also finish loading when React
|
|
336
|
+
Strict Mode restarts their effects during development.
|
|
337
|
+
|
|
316
338
|
## Styles
|
|
317
339
|
|
|
318
340
|
```tsx
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Managed landing pages
|
|
2
|
+
|
|
3
|
+
Use the server entry for an opt-in managed landing route. The same bounded layout supports a newsletter signup, a requested guide or an inquiry. Page text renders on the server and follows the site's existing layout. Managed forms handle browser submission.
|
|
4
|
+
|
|
5
|
+
First check your site's route inventory for `/f` collisions. Install this adapter only when the prefix is available, then verify the deployed route before enabling managed publication in Sonor. Existing-page funnels work independently of this adapter.
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
// app/f/[slug]/page.tsx
|
|
9
|
+
import { notFound } from 'next/navigation'
|
|
10
|
+
import {
|
|
11
|
+
getPublishedFunnelPage,
|
|
12
|
+
managedFunnelMetadata,
|
|
13
|
+
ManagedFunnelPage,
|
|
14
|
+
} from '@sonordev/site-kit/website/landing/server'
|
|
15
|
+
|
|
16
|
+
const options = { site: 'example.com' } // Your registered site host.
|
|
17
|
+
type PageProps = { params: Promise<{ slug: string }> }
|
|
18
|
+
|
|
19
|
+
export async function generateMetadata({ params }: PageProps) {
|
|
20
|
+
const { slug } = await params
|
|
21
|
+
const page = await getPublishedFunnelPage(slug, options)
|
|
22
|
+
return page ? managedFunnelMetadata(page) : { robots: { index: false } }
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export default async function Page({ params }: PageProps) {
|
|
26
|
+
const { slug } = await params
|
|
27
|
+
const page = await getPublishedFunnelPage(slug, options)
|
|
28
|
+
if (!page) notFound()
|
|
29
|
+
return <ManagedFunnelPage page={page} />
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Keep `SiteKitLayout` in your root layout and use its deferred analytics sibling. The adapter doesn't require analytics to submit a form. It reads the server credential through the existing server transport and requires an explicit registered site. Responses from another host or path are refused.
|
|
34
|
+
|
|
35
|
+
Published-page reads use `no-store` in this version so an outdated or removed publication isn't served from the fetch cache. Keep the route dynamic and avoid wrapping this reader in a persistent cache. `managedFunnelMetadata` defaults to noindex, nofollow. Keep these campaign routes out of your sitemap.
|
|
36
|
+
|
|
37
|
+
Use the normal revalidation route:
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
// app/api/seo-revalidate/route.ts
|
|
41
|
+
export { POST } from '@sonordev/site-kit/revalidate'
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Sonor can invalidate the exact published path and `SITE_CACHE_TAGS.funnels`. That refresh is distinct from installing and verifying the route.
|
|
45
|
+
|
|
46
|
+
Private previews use the exact owner-authorized dashboard DTO. Pausing follow-ups retains the published landing page and independent form confirmations. `FunnelPageContent` from the server entry accepts `preview` and displays an inert form placeholder with a noindex and reporting-suppression marker. `ManagedFunnelPage preview` also skips form fetching. Serve private preview responses with `Cache-Control: no-store`; these components don't authorize requests or set HTTP headers. No public draft-token route is included.
|
|
47
|
+
|
|
48
|
+
Content is limited to text paragraphs and bullet lists. Logos use resolved, validated asset URLs, colors and fonts use the shared brand contract, and the renderer accepts no stored HTML, scripts or CSS. If a full logo is missing, the verified display name appears. Theme variants, square marks and publisher attribution retain their separate roles.
|
|
49
|
+
|
|
50
|
+
For developer-authored paid pages, the existing `LandingPage` component remains available from `@sonordev/site-kit/website/landing`. Import `landingPageMetadata` from the server entry. Campaign normalization now comes from the shared contracts package.
|
|
51
|
+
|
|
52
|
+
## Record the installation
|
|
53
|
+
|
|
54
|
+
An authorized repository owner completes this checklist once per site:
|
|
55
|
+
|
|
56
|
+
1. Inventory the whole `/f` prefix, including routes, rewrites and dynamic route collisions.
|
|
57
|
+
2. Install the adapter above and verify server-rendered content, form behavior, exact host binding, private preview isolation and mobile/desktop layouts for that source revision.
|
|
58
|
+
3. Record the inventory digest, source revision, supported adapter version and named verification through the existing owner-authorized project settings path.
|
|
59
|
+
|
|
60
|
+
The installation record lives at `projects.settings.managed_funnel_pages[normalizedOwnedHost]`. It contains `schemaVersion: 1`, `enabled`, `prefix: '/f'`, `adapterVersion`, `routeInventoryDigest`, `sourceRevision`, `verifiedAt`, `verifiedBy` and `provenance: 'owner_installation_attestation'`. The server attributes the actor and provenance. Use the adapter version supported by your Sonor installation. Each record belongs to one registered host.
|
|
61
|
+
|
|
62
|
+
A draft or a browser report can't assert that the route is installed. This record describes an operator's installation check. Report a verified deployment and current live reachability separately when you've observed them. Publishing a funnel doesn't install the adapter.
|
|
63
|
+
|
|
64
|
+
Disable the record before removing the adapter. For route, host or adapter changes, invalidate the old record, repeat the checks and replace its revision and digest. Sonor snapshots this installation evidence during preview and rechecks it at launch and public resolution. Existing-page funnels remain available when managed-page installation is missing.
|
package/src/llms/README.md
CHANGED
|
@@ -42,6 +42,7 @@ The GEO system uses a shared contract (`@sonordev/site-kit/llms/contract`) consu
|
|
|
42
42
|
- **`LLM_GEO_CONTRACT_VERSION`** (currently `1`) — increment on breaking payload changes
|
|
43
43
|
- **`LLMS_PUBLIC_SUMMARY_MAX_LENGTH`** (`400`) — max chars for page link notes
|
|
44
44
|
- **Sanitizers** — `sanitizeLlmsPublicSummary()`, `sanitizeLlmsDisclaimerLine()`, `sanitizePrimaryLanguageTag()`, `pickManagedLlmSchemaForJsonLd()`
|
|
45
|
+
- **Page notes, titles and order** — `pickLlmsPageDescription()`, `llmsPageListNote()`, `llmsPageTitle()`, `isLlmsListablePage()`, `selectLlmsPages()`, `groupLlmsPages()`, `cleanScrapedPageText()`, `stripContactDetails()`. The Sonor API and site-kit's local generator both build page lines through these, so a page reads the same wherever the file is built (see [What a page line says](#what-a-page-line-says)).
|
|
45
46
|
|
|
46
47
|
See `LLM_GEO_CONTRACT.md` for the full spec.
|
|
47
48
|
|
|
@@ -337,8 +338,8 @@ export async function POST(request: Request) {
|
|
|
337
338
|
### How `generateLLMsTxt()` Works
|
|
338
339
|
|
|
339
340
|
1. Fetches all data via `getLLMsData()` → `GET /api/public/llms/data`
|
|
340
|
-
2. Optionally merges with local data (`getLocalData` callback) when Sonor returns empty
|
|
341
|
-
3. Builds markdown sections in order: **Header → About →
|
|
341
|
+
2. Optionally merges with local data (`getLocalData` callback) when Sonor returns nothing, leaves services, FAQs or pages empty, or leaves the business's name, description, phone or address empty. The merge is field by field: a field Sonor fills wins, and a field Sonor leaves empty never deletes the value the site supplied
|
|
342
|
+
3. Builds markdown sections in order: **Header → About → Contact → Services → Site Pages → Portfolio → FAQ → Full Context Link → Knowledge Graph → Topic Clusters → Custom Sections → Agent access → Optional**. The business and the contact block come first because they are short and answer the commonest question; the page index comes before the FAQ; `## Optional` is last because the spec lets a short-context reader stop there
|
|
342
343
|
4. Portfolio, Entity, and Topic Cluster sections are fetched **in parallel** via `Promise.allSettled()`
|
|
343
344
|
5. Returns `{ markdown, metadata }` where metadata includes `sections`, `attempted_sections`, and `failed_sections`
|
|
344
345
|
|
|
@@ -356,9 +357,27 @@ export async function POST(request: Request) {
|
|
|
356
357
|
|
|
357
358
|
Business description...
|
|
358
359
|
|
|
360
|
+
## Contact Information
|
|
361
|
+
|
|
362
|
+
- **Phone:** 555-0100
|
|
363
|
+
- **Email:** info@example.com
|
|
364
|
+
- **Address:** 123 Main St, Springfield, OH 45501
|
|
365
|
+
- **Hours:** Mon-Fri 8am-5pm
|
|
366
|
+
|
|
359
367
|
## Services
|
|
360
368
|
|
|
361
|
-
- [Service Name](/services/slug): Brief description
|
|
369
|
+
- [Service Name](https://example.com/services/slug): Brief description
|
|
370
|
+
|
|
371
|
+
## Site Pages
|
|
372
|
+
|
|
373
|
+
### Key pages
|
|
374
|
+
|
|
375
|
+
- [Home](https://example.com/): Public-safe summary of the page content
|
|
376
|
+
- [About](https://example.com/about): Learn about our team and mission
|
|
377
|
+
|
|
378
|
+
### Services
|
|
379
|
+
|
|
380
|
+
- [Furnace repair](https://example.com/services/furnace-repair): Same-day furnace repair in Springfield
|
|
362
381
|
|
|
363
382
|
## Portfolio & Case Studies
|
|
364
383
|
|
|
@@ -366,27 +385,12 @@ Business description...
|
|
|
366
385
|
|
|
367
386
|
Description of the project.
|
|
368
387
|
|
|
369
|
-
## Contact Information
|
|
370
|
-
|
|
371
|
-
- **Phone:** 555-1234
|
|
372
|
-
- **Email:** info@example.com
|
|
373
|
-
- **Address:** 123 Main St, City, State
|
|
374
|
-
|
|
375
388
|
## Frequently Asked Questions
|
|
376
389
|
|
|
377
390
|
### How do you work?
|
|
378
391
|
|
|
379
392
|
We follow a proven process...
|
|
380
393
|
|
|
381
|
-
## Site Pages
|
|
382
|
-
|
|
383
|
-
- [Home](https://example.com/): Public-safe summary of the page content
|
|
384
|
-
- [About](https://example.com/about): Learn about our team and mission
|
|
385
|
-
|
|
386
|
-
## Optional
|
|
387
|
-
|
|
388
|
-
- [Privacy Policy](https://example.com/privacy): How we collect and use your information
|
|
389
|
-
|
|
390
394
|
## Full context
|
|
391
395
|
|
|
392
396
|
- [llms-full.txt](https://example.com/llms-full.txt): Expanded index for large-context systems.
|
|
@@ -408,6 +412,10 @@ Service page: https://example.com/services/family-law
|
|
|
408
412
|
Pillar: [Complete Guide to Family Law](/article/family-law-guide)
|
|
409
413
|
- [How to File for Divorce](/article/filing-divorce) (Mar 15, 2026)
|
|
410
414
|
- [Child Custody Laws](/article/custody-laws) (Mar 10, 2026)
|
|
415
|
+
|
|
416
|
+
## Optional
|
|
417
|
+
|
|
418
|
+
- [Privacy Policy](https://example.com/privacy): How we collect and use your information
|
|
411
419
|
```
|
|
412
420
|
|
|
413
421
|
### Configuration Options
|
|
@@ -433,7 +441,7 @@ generateLLMsTxt({
|
|
|
433
441
|
// Spec features
|
|
434
442
|
linkToFullLlms: true, // Append "Full context" section
|
|
435
443
|
optionalPagePaths: ['/privacy', '/terms'], // Moved from Site Pages to ## Optional
|
|
436
|
-
pageListNotesFromPublicSummaryOnly: false, // Strict mode:
|
|
444
|
+
pageListNotesFromPublicSummaryOnly: false, // Strict mode: a note only from llms_public_summary
|
|
437
445
|
|
|
438
446
|
// Overrides (take precedence over Sonor settings)
|
|
439
447
|
headerPrimaryLanguage: 'en',
|
|
@@ -447,6 +455,30 @@ generateLLMsTxt({
|
|
|
447
455
|
})
|
|
448
456
|
```
|
|
449
457
|
|
|
458
|
+
### What a page line says
|
|
459
|
+
|
|
460
|
+
Every `- [Title](url): note` line is built by the same rules, in `@sonordev/contracts/llms`, wherever the file is generated.
|
|
461
|
+
|
|
462
|
+
**The note**, best source first (`pickLlmsPageDescription`):
|
|
463
|
+
|
|
464
|
+
1. the page's `llms_public_summary`, written for this file. A phone number or an email address in it is taken out along with the "call" or "email us at" in front of it, and the rest is used. (A summary used to be thrown away whole, and the page fell back to its scrape.) A lead-in such as "This page covers" is dropped, so the note starts at what the page is about;
|
|
465
|
+
2. the curated meta description (`managed_meta_description`);
|
|
466
|
+
3. the meta description the page serves;
|
|
467
|
+
4. the page's schema description;
|
|
468
|
+
5. last, the page's scraped text, cleaned (`cleanScrapedPageText`): the whitespace between elements put back, form labels, menu items, cookie banners and button text dropped, contact details removed.
|
|
469
|
+
|
|
470
|
+
Every note is cut at a sentence end or a word boundary, 500 characters at the most, and never mid-word. A note that only repeats the page's title, or whose text is an error page, is skipped. `pageListNotesFromPublicSummaryOnly` still limits notes to source 1.
|
|
471
|
+
|
|
472
|
+
**The title** is the curated title, else the title the page serves, else its h1, each without its `| Brand` tail; the home page is the business name; a page with none of these is named from the last segment of its path ("Accounting" for `/features/accounting`). It is never the raw path.
|
|
473
|
+
|
|
474
|
+
**Which pages are listed.** A page the last visit saw answer with an error, a page that asks search engines to leave it out (`noindex`), and a utility page (a cart, a thank-you page, a login) are left out, and each path is listed once.
|
|
475
|
+
|
|
476
|
+
**Order and groups** (`groupLlmsPages`). The home page first, then the top-level pages by value (what the site does, where, the proof, who, the cost, contact), then one `###` group per section of the site (`/services/*` is "Services"), the biggest unlisted sections last, and the legal pages at the very end. A site of 12 pages or fewer is one list. When `maxPages` is smaller than the site, `selectLlmsPages` keeps every section represented, most valuable first, and the shorter list is always a subset of `llms-full.txt`.
|
|
477
|
+
|
|
478
|
+
**Contact block.** Phone, email, one-line address and hours. A field with nothing in it is not printed, and a contact with nothing at all leaves the whole section out.
|
|
479
|
+
|
|
480
|
+
**The first line** under the name is the tagline, else the first sentence of the description (not the text up to its first full stop, which cuts "Smith & Sons, Inc. is..." at "Inc").
|
|
481
|
+
|
|
450
482
|
### Optional pages
|
|
451
483
|
|
|
452
484
|
`optionalPagePaths` demotes pages to `## Optional`, the section llmstxt.org lets a
|
|
@@ -465,7 +497,7 @@ const { markdown, metadata } = await generateLLMsTxt({})
|
|
|
465
497
|
|
|
466
498
|
metadata.generated_at // ISO timestamp
|
|
467
499
|
metadata.project_id // From API key
|
|
468
|
-
metadata.sections // ['header', 'about', '
|
|
500
|
+
metadata.sections // ['header', 'about', 'contact', 'services', 'pages', 'faq', ...]
|
|
469
501
|
metadata.attempted_sections // ['portfolio', 'knowledge-graph', 'topic-clusters']
|
|
470
502
|
metadata.failed_sections // ['knowledge-graph'] — if entity API was unavailable
|
|
471
503
|
```
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { sonorFetch } from './chunk-GDQKDL3E.js';
|
|
3
|
-
import './chunk-OEA7U4HJ.js';
|
|
4
|
-
import { getClientApiConfig } from './chunk-W7OPEMGJ.js';
|
|
5
|
-
import './chunk-CFSIGEUW.js';
|
|
6
|
-
import './chunk-PKBMQBKP.js';
|
|
7
|
-
import React from 'react';
|
|
8
|
-
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
9
|
-
|
|
10
|
-
function FileField({
|
|
11
|
-
field,
|
|
12
|
-
inputId,
|
|
13
|
-
classPrefix,
|
|
14
|
-
baseInputStyle,
|
|
15
|
-
onChange
|
|
16
|
-
}) {
|
|
17
|
-
const [status, setStatus] = React.useState("idle");
|
|
18
|
-
const [fileName, setFileName] = React.useState("");
|
|
19
|
-
const handleFile = async (e) => {
|
|
20
|
-
const file = e.target.files?.[0];
|
|
21
|
-
if (!file) return;
|
|
22
|
-
setFileName(file.name);
|
|
23
|
-
setStatus("uploading");
|
|
24
|
-
onChange("");
|
|
25
|
-
try {
|
|
26
|
-
const url = await uploadFormFile(file);
|
|
27
|
-
onChange(url);
|
|
28
|
-
setStatus("idle");
|
|
29
|
-
} catch (err) {
|
|
30
|
-
console.error("[Forms] File upload failed:", err);
|
|
31
|
-
onChange("");
|
|
32
|
-
setStatus("error");
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
36
|
-
/* @__PURE__ */ jsx(
|
|
37
|
-
"input",
|
|
38
|
-
{
|
|
39
|
-
id: inputId,
|
|
40
|
-
className: `${classPrefix}__input ${classPrefix}__input--file`,
|
|
41
|
-
type: "file",
|
|
42
|
-
name: field.slug,
|
|
43
|
-
required: field.is_required,
|
|
44
|
-
disabled: status === "uploading",
|
|
45
|
-
onChange: handleFile,
|
|
46
|
-
style: baseInputStyle
|
|
47
|
-
}
|
|
48
|
-
),
|
|
49
|
-
status === "uploading" && /* @__PURE__ */ jsxs("p", { style: { color: "var(--sk-text-tertiary, #6b7280)", fontSize: 14, marginTop: 4 }, children: [
|
|
50
|
-
"Uploading ",
|
|
51
|
-
fileName,
|
|
52
|
-
"\u2026"
|
|
53
|
-
] }),
|
|
54
|
-
status === "error" && /* @__PURE__ */ jsx("p", { role: "alert", style: { color: "var(--sk-error, #dc2626)", fontSize: 14, marginTop: 4 }, children: "Upload failed. Please choose the file again." })
|
|
55
|
-
] });
|
|
56
|
-
}
|
|
57
|
-
async function uploadFormFile(file) {
|
|
58
|
-
const { apiUrl, apiKey } = getClientApiConfig();
|
|
59
|
-
if (!apiKey) {
|
|
60
|
-
throw new Error("API key is required to upload files.");
|
|
61
|
-
}
|
|
62
|
-
const body = new FormData();
|
|
63
|
-
body.append("file", file);
|
|
64
|
-
const response = await sonorFetch(
|
|
65
|
-
`${apiUrl}/api/public/forms/upload`,
|
|
66
|
-
{
|
|
67
|
-
method: "POST",
|
|
68
|
-
headers: { Authorization: `Bearer ${apiKey}` },
|
|
69
|
-
body
|
|
70
|
-
},
|
|
71
|
-
{ retries: 1, timeoutMs: 6e4 }
|
|
72
|
-
);
|
|
73
|
-
if (!response.ok) {
|
|
74
|
-
throw new Error(`Upload failed (${response.status})`);
|
|
75
|
-
}
|
|
76
|
-
const data = await response.json().catch(() => null);
|
|
77
|
-
if (!data?.url) {
|
|
78
|
-
throw new Error("Upload did not return a URL.");
|
|
79
|
-
}
|
|
80
|
-
return data.url;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
export { FileField };
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export { SiteDesignReporter } from './chunk-A7RZQI6H.js';
|
|
2
|
-
import './chunk-7HRYSLY2.js';
|
|
3
|
-
import './chunk-IHG36STL.js';
|
|
4
|
-
import './chunk-YC7ELZS3.js';
|
|
5
|
-
import './chunk-S22FSH7C.js';
|
|
6
|
-
import './chunk-DLM4FFNH.js';
|
|
7
|
-
import './chunk-EKBEOXTH.js';
|
|
8
|
-
import './chunk-GDQKDL3E.js';
|
|
9
|
-
import './chunk-OEA7U4HJ.js';
|
|
10
|
-
import './chunk-W7OPEMGJ.js';
|
|
11
|
-
import './chunk-CFSIGEUW.js';
|
|
12
|
-
import './chunk-PKBMQBKP.js';
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export { SitemapSync } from './chunk-EQHGPB3J.js';
|
|
2
|
-
import './chunk-YVKRYQRG.js';
|
|
3
|
-
import './chunk-DLM4FFNH.js';
|
|
4
|
-
import './chunk-EKBEOXTH.js';
|
|
5
|
-
import './chunk-GDQKDL3E.js';
|
|
6
|
-
import './chunk-OEA7U4HJ.js';
|
|
7
|
-
import './chunk-W7OPEMGJ.js';
|
|
8
|
-
import './chunk-CFSIGEUW.js';
|
|
9
|
-
import './chunk-PKBMQBKP.js';
|