@sonordev/site-kit 8.6.0 → 8.8.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.
Files changed (161) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/agent-manifest.json +1 -1
  3. package/dist/{AnalyticsProvider-GVJYL6XY.js → AnalyticsProvider-7SBJ27SI.js} +6 -6
  4. package/dist/{ArticleViewTracker-AOJXEBYM.js → ArticleViewTracker-PV2RD3P6.js} +5 -5
  5. package/dist/{BlocksPopup-AJ3CKVQG.js → BlocksPopup-NEEFV2L3.js} +9 -8
  6. package/dist/{ChatWidget-EYBVB5SZ.js → ChatWidget-V46UBDOM.js} +5 -5
  7. package/dist/{FileField-UEQYIFRO.js → FileField-MJ3RCNFJ.js} +3 -3
  8. package/dist/{FormSpotlight-H73ZZ66T.js → FormSpotlight-NQPQFZS7.js} +1 -1
  9. package/dist/{FormStage-2PLWWYBW.js → FormStage-4T5PJR5K.js} +1 -1
  10. package/dist/{ManagedForm-ZQOFXEWS.js → ManagedForm-DDDVMKLJ.js} +6 -6
  11. package/dist/{ManagedNewsletterForm-5TE47YZD.js → ManagedNewsletterForm-TUYGN6O3.js} +9 -9
  12. package/dist/{SignalCore-FEFNMNYN.js → SignalCore-OW3YIH6M.js} +5 -5
  13. package/dist/SiteChat-XMKHBSEK.js +6 -0
  14. package/dist/SiteDesignReporter-BRH7ORQS.js +13 -0
  15. package/dist/{SitePopups-C44YTQ3Q.js → SitePopups-VU2C3Z6B.js} +6 -6
  16. package/dist/SitemapSync-C4H3HF3L.js +9 -0
  17. package/dist/_client/booking-widget.js +5 -5
  18. package/dist/admin-auth/index.d.ts +2 -2
  19. package/dist/admin-auth/session.d.ts +2 -2
  20. package/dist/affiliates/index.js +3 -3
  21. package/dist/analytics/content-text.d.ts +17 -0
  22. package/dist/analytics/index.js +6 -6
  23. package/dist/{article-styles-VASFBYA3.js → article-styles-D7VCDXMG.js} +2 -1
  24. package/dist/article-tables-W45BE353.js +3 -0
  25. package/dist/articles/index.js +7 -20
  26. package/dist/articles/server-ui.js +29 -55
  27. package/dist/articles/server.js +6 -5
  28. package/dist/chat/index.js +8 -8
  29. package/dist/{chunk-3RDJKIYO.js → chunk-2WDWQI7K.js} +1 -1
  30. package/dist/{chunk-KTMHRXDT.js → chunk-2WM4TNDF.js} +1 -1
  31. package/dist/chunk-3MJNBOUO.js +8 -0
  32. package/dist/{chunk-BF7TZYC3.js → chunk-52KO4LKD.js} +1 -1
  33. package/dist/chunk-64XODP7M.js +7 -0
  34. package/dist/{chunk-DSD3XZQQ.js → chunk-6BFQI3ZE.js} +3 -3
  35. package/dist/{chunk-QNOJSSQT.js → chunk-6DXQHNZK.js} +1 -1
  36. package/dist/{chunk-5D7ZISUP.js → chunk-7DYMM6SS.js} +11 -6
  37. package/dist/{chunk-QQT2T6JQ.js → chunk-7HW4TZB5.js} +1 -1
  38. package/dist/{chunk-E4PTMORJ.js → chunk-AL5UCWLI.js} +23 -8
  39. package/dist/chunk-AYQEIMGS.js +390 -0
  40. package/dist/{chunk-L6QTERSH.js → chunk-DYROJGI2.js} +1 -1
  41. package/dist/{chunk-XA7Q2VQA.js → chunk-EK7P62DT.js} +1 -1
  42. package/dist/{chunk-BUE3Z32O.js → chunk-F6WLHVMQ.js} +1 -1
  43. package/dist/{chunk-IYCSDFPN.js → chunk-FLOJUMFR.js} +2 -2
  44. package/dist/{chunk-7R2STOVD.js → chunk-G7BRCSV6.js} +3 -3
  45. package/dist/{chunk-NI6ZTP3D.js → chunk-GQN4BGK6.js} +1 -1
  46. package/dist/{chunk-GFY3E7EQ.js → chunk-GXWM5KNS.js} +15 -7
  47. package/dist/{chunk-U34O6I7W.js → chunk-HN7GVGWC.js} +3 -3
  48. package/dist/{chunk-6KU7STM3.js → chunk-HY7ZEU2C.js} +3 -1
  49. package/dist/chunk-IBHBEUZV.js +27 -0
  50. package/dist/{chunk-ZZSAWXWD.js → chunk-IDC5CVBR.js} +1 -1
  51. package/dist/{chunk-HMTPRBYJ.js → chunk-IWNJCRXW.js} +1 -1
  52. package/dist/chunk-JESLPEST.js +14 -0
  53. package/dist/{chunk-BC7JMY4Z.js → chunk-JG53YJLM.js} +58 -1
  54. package/dist/{chunk-RI2N2EBI.js → chunk-JYITKUUB.js} +13 -5
  55. package/dist/{chunk-V67OD7RW.js → chunk-KG5IEV7I.js} +113 -93
  56. package/dist/chunk-KIYACQW3.js +1 -0
  57. package/dist/{chunk-JSW42BHL.js → chunk-M5JIHQ42.js} +1 -1
  58. package/dist/{chunk-YJH6WE76.js → chunk-NFGAXWCN.js} +9 -9
  59. package/dist/{chunk-Y35BWW2C.js → chunk-ODOV76VW.js} +1 -1
  60. package/dist/{chunk-VA6IJ55K.js → chunk-OPUY4RS6.js} +1 -1
  61. package/dist/{chunk-6NXFA7HE.js → chunk-OWZWRP7Y.js} +2 -2
  62. package/dist/{chunk-JJ4JS3LD.js → chunk-PAYCK7FC.js} +1 -1
  63. package/dist/{chunk-72F44HKL.js → chunk-PSS6M4CG.js} +1 -1
  64. package/dist/{chunk-O3Z5HHFP.js → chunk-SBPUFTMP.js} +2 -2
  65. package/dist/{chunk-OFSV5TZY.js → chunk-SHAUX2MQ.js} +1 -1
  66. package/dist/{chunk-OWO3RFEX.js → chunk-SLFYTELD.js} +1 -1
  67. package/dist/{chunk-CMUD37WV.js → chunk-SVHPILS3.js} +1 -1
  68. package/dist/{chunk-YNBRVVTX.js → chunk-THXELZTQ.js} +1 -1
  69. package/dist/{chunk-IGAIQ2B3.js → chunk-TP32MRXV.js} +2 -2
  70. package/dist/{chunk-NUXXFCIT.js → chunk-URLTBVRX.js} +4 -4
  71. package/dist/chunk-XAZC2TUD.js +1119 -0
  72. package/dist/{chunk-URJN75ZG.js → chunk-XIDWNXZN.js} +3 -3
  73. package/dist/chunk-XLAHRN4B.js +1 -0
  74. package/dist/chunk-XS2ORMUG.js +32 -0
  75. package/dist/{chunk-6AWIUO2Z.js → chunk-Y6SHFILE.js} +1 -1
  76. package/dist/{chunk-FTSEP7Q3.js → chunk-YEX5RAEU.js} +3 -3
  77. package/dist/{chunk-AJG74ZZV.js → chunk-YRQS7VAH.js} +1 -1
  78. package/dist/{chunk-DLM4FFNH.js → chunk-ZQSCMYZO.js} +1 -1
  79. package/dist/client/index.js +4 -4
  80. package/dist/contracts/campaign-normalize.d.ts +2 -0
  81. package/dist/contracts/entries.d.ts +1 -1
  82. package/dist/contracts/frame-ready.d.ts +23 -0
  83. package/dist/contracts/funnels.d.ts +576 -0
  84. package/dist/contracts/inbox.d.ts +42 -0
  85. package/dist/contracts/llms.d.ts +200 -0
  86. package/dist/contracts/portfolio.d.ts +361 -8
  87. package/dist/contracts/publication-branding.d.ts +10 -2
  88. package/dist/contracts/site-cache.d.ts +2 -0
  89. package/dist/fleet/index.js +6 -6
  90. package/dist/forms/index.js +9 -9
  91. package/dist/forms/server.js +2 -2
  92. package/dist/images/index.js +4 -4
  93. package/dist/index.js +1 -1
  94. package/dist/landing/contract.d.ts +2 -13
  95. package/dist/landing/contract.js +2 -0
  96. package/dist/landing/index.js +4 -2
  97. package/dist/landing/managed-server.d.ts +21 -0
  98. package/dist/landing/managed.d.ts +11 -0
  99. package/dist/landing/metadata.js +2 -0
  100. package/dist/landing/server.d.ts +5 -0
  101. package/dist/landing/server.js +20 -2
  102. package/dist/layout/client.js +9 -9
  103. package/dist/layout/index.js +10 -10
  104. package/dist/llms/contract.js +2 -1
  105. package/dist/llms/index.js +9 -7
  106. package/dist/llms/merge.d.ts +29 -0
  107. package/dist/maps/index.js +3 -3
  108. package/dist/mcp/sonor.js +9 -8
  109. package/dist/og/pages.d.ts +3 -3
  110. package/dist/portfolio/contract.js +705 -1
  111. package/dist/press-kit/articles/article-body.d.ts +12 -0
  112. package/dist/press-kit/articles/article-heading-ids.d.ts +7 -0
  113. package/dist/press-kit/articles/article-headings.d.ts +61 -0
  114. package/dist/press-kit/articles/html-tags.d.ts +46 -0
  115. package/dist/press-kit/articles/types.d.ts +2 -0
  116. package/dist/revalidate/index.js +3 -3
  117. package/dist/runtime/index.js +3 -3
  118. package/dist/seo/client.js +6 -6
  119. package/dist/seo/index.js +14 -13
  120. package/dist/seo/llms/contract.js +2 -1
  121. package/dist/seo/llms.js +9 -7
  122. package/dist/seo/meta/contract.js +2 -1
  123. package/dist/seo/register-sitemap-cli.js +1 -1
  124. package/dist/seo/server.js +5 -4
  125. package/dist/seo/sitemap.js +7 -5
  126. package/dist/seo-meta/contract.js +2 -1
  127. package/dist/server/index.js +3 -3
  128. package/dist/{server-api-EGOKC7Q3.js → server-api-XIKDWSNO.js} +2 -2
  129. package/dist/shared/build-entries.d.ts +3 -1
  130. package/dist/shared/frame.d.ts +1 -1
  131. package/dist/shared/markdown.d.ts +7 -6
  132. package/dist/shared/source-graph.d.ts +5 -5
  133. package/dist/shared/version.d.ts +1 -1
  134. package/dist/signal/index.js +2 -2
  135. package/dist/sitemap/index.js +7 -5
  136. package/dist/sitemap/shared.d.ts +1 -2
  137. package/dist/slots/index.js +2 -2
  138. package/dist/sync/index.js +5 -5
  139. package/dist/website/contract.js +2 -1
  140. package/dist/website/images.js +4 -4
  141. package/dist/website/index.js +10 -9
  142. package/dist/website/landing/server.js +20 -2
  143. package/dist/website/landing.js +4 -2
  144. package/dist/website/popups.js +9 -8
  145. package/dist/website/slots.js +2 -2
  146. package/dist/{writeLLMsTxt-KHVHNSDM.js → writeLLMsTxt-4HHUAOA6.js} +6 -4
  147. package/docs.json +5 -0
  148. package/package.json +1 -1
  149. package/src/analytics/README.md +1 -1
  150. package/src/landing/README.md +64 -0
  151. package/src/llms/README.md +52 -20
  152. package/dist/SiteChat-3MKYL2XM.js +0 -6
  153. package/dist/SiteDesignReporter-AJDIBNHI.js +0 -12
  154. package/dist/SitemapSync-UJA6JVPW.js +0 -9
  155. package/dist/article-tables-6XHVULPU.js +0 -2
  156. package/dist/chunk-EKBEOXTH.js +0 -114
  157. package/dist/chunk-NZ4RXN3G.js +0 -145
  158. package/dist/chunk-OSYCOC3K.js +0 -21
  159. /package/dist/{chunk-7ZWO5HDQ.js → chunk-BTHEQDN4.js} +0 -0
  160. /package/dist/{chunk-BQR4IPBW.js → chunk-ISRBSTB7.js} +0 -0
  161. /package/dist/{chunk-IHG36STL.js → chunk-XHYE24HU.js} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # @sonordev/site-kit Changelog
2
2
 
3
+ ## 8.8.0
4
+
5
+ - `@sonordev/site-kit/portfolio/contract` adds the verification, a proof-stage case study section for a build a Lighthouse run can't honestly score, such as an app behind a sign-in. It's a short list of checks, each saying what was checked, where, how, when, what came out and what it doesn't cover. New: `portfolioVerification` in `PORTFOLIO_SECTION_TYPES` (in the proof stage), `verificationProblems`, `readVerificationChecks`, `verificationLink`, `isVacuousScope`, `isPlaceholderText`, `isRealDay`, `latestVerificationDay`, `PORTFOLIO_VERIFICATION_JSON_SCHEMA`, the `PortfolioVerificationData` and `VerificationCheck` types and the limits `VERIFICATION_MAX_CHECKS`, `VERIFICATION_FIELD_MAX_CHARS` and `VERIFICATION_EARLIEST_DAY`. Nothing was removed or renamed. A `Record<PortfolioSectionType, ...>` of your own needs an entry for `portfolioVerification` before it type-checks.
6
+ - A verification completes the proof stage on its own once it has a check a page can show: `caseStudyStageStatus` accepts it where it expected a Performance section (`STAGE_CORE_ALTERNATES`, `stageCoreSections`), and now reads each section's `data` to tell. A reported number's date has to be a real day; `2026-02-31` used to pass. The same code ships as `@sonordev/contracts` 2.16.0.
7
+ - Analytics, the layout, SEO, chat and popups load about 4 KB less gzipped JavaScript than they did in 8.7.0. The message a framed page posts to tell its embedder it has painted lived in the case study rules, so every page carried all of them. It's now its own small module, and `@sonordev/site-kit/portfolio/contract` still exports it.
8
+
9
+ ## 8.7.0
10
+
11
+ - Add opt-in managed landing-page reads and a bounded server-rendered layout through `website/landing/server`. Published reads are site scoped and uncached. Private previews use inert conversion controls and suppress reporting.
12
+ - Share campaign normalization and the funnel cache tag with `@sonordev/contracts`. Existing authored landing-page imports remain available.
13
+ - `llms.txt` describes each page with its best source: the page's public summary, then its curated meta description, the meta description the page serves, its schema description and, last, a cleaned copy of its scraped text. A summary that mentions a phone number or an email address loses just that part and is still used; it used to be thrown away whole, and the page fell back to its scrape. Notes are cut at a sentence or word boundary, and a lead-in such as "This page covers" is dropped.
14
+ - A page whose title is its path is named from the path ("Accounting", not `/features/accounting`). A page that answered with an error, a `noindex` page and a utility page (cart, thank-you, login) are left out, and each path is listed once.
15
+ - The page index lists the home page and the key pages first, then one group per section of the site, with the legal pages last. When `maxPages` is smaller than the site, every section stays represented, most valuable first, instead of the end of an alphabetical list being cut.
16
+ - Sections now read About, Contact, Services, Site Pages, Portfolio, FAQ, with `## Optional` last. The contact block prints an address on one line with hours, and is left out when it has nothing in it. Service links are absolute URLs. The line under the name is the first sentence of the description, not the text up to its first full stop.
17
+ - `getLocalData` fills gaps field by field. An empty field from Sonor no longer deletes the business name, description, phone or address the site supplies, and the site's data is read whenever Sonor leaves services, FAQs, pages or those fields empty.
18
+ - The analytics page-text scrape keeps elements apart and leaves out menus, form fields, buttons and dialogs, so stored page text no longer runs a heading into the paragraph after it.
19
+
3
20
  ## 8.6.0
4
21
 
5
22
  - Managed file fields can accept private documents with drag and drop, upload status, removal and retry. Configure `validation.private_attachments` and `validation.max_files` to accept up to four PDF, JPEG, PNG or WebP files, each up to 10 MB. This requires Sonor's private attachment endpoints; documents never fall back to public media uploads.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "package": "@sonordev/site-kit",
4
- "version": "8.6.0",
4
+ "version": "8.8.0",
5
5
  "description": "Machine-readable manifest for coding agents integrating a site with Sonor. See AGENTS.md (shipped) and docs/SITE-KIT-AGENT-NATIVE.md.",
6
6
  "env": {
7
7
  "required": [
@@ -1,13 +1,13 @@
1
- export { AnalyticsProvider, useAnalytics, useAnalyticsOptional, useTrackEvent } from './chunk-GFY3E7EQ.js';
1
+ export { AnalyticsProvider, useAnalytics, useAnalyticsOptional, useTrackEvent } from './chunk-GXWM5KNS.js';
2
2
  import './chunk-LCDVPAMR.js';
3
3
  import './chunk-IPQKQEWI.js';
4
4
  import './chunk-L2V5PUFN.js';
5
5
  import './chunk-GJWI74ZZ.js';
6
6
  import './chunk-5TM3WPCI.js';
7
- import './chunk-DLM4FFNH.js';
8
- import './chunk-EKBEOXTH.js';
9
- import './chunk-IYCSDFPN.js';
10
- import './chunk-QQT2T6JQ.js';
7
+ import './chunk-ZQSCMYZO.js';
8
+ import './chunk-64XODP7M.js';
9
+ import './chunk-FLOJUMFR.js';
10
+ import './chunk-7HW4TZB5.js';
11
11
  import './chunk-W7OPEMGJ.js';
12
- import './chunk-BUE3Z32O.js';
12
+ import './chunk-F6WLHVMQ.js';
13
13
  import './chunk-PKBMQBKP.js';
@@ -1,7 +1,7 @@
1
1
  'use client';
2
- import './chunk-6AWIUO2Z.js';
2
+ import './chunk-Y6SHFILE.js';
3
3
  import './chunk-B7T2SFUF.js';
4
- import './chunk-VA6IJ55K.js';
4
+ import './chunk-OPUY4RS6.js';
5
5
  import './chunk-6T6CQVNL.js';
6
6
  import './chunk-5ROTTMBL.js';
7
7
  import { useDeferredActivation } from './chunk-YC7ELZS3.js';
@@ -15,10 +15,10 @@ import './chunk-LCDVPAMR.js';
15
15
  import './chunk-IPQKQEWI.js';
16
16
  import './chunk-GJWI74ZZ.js';
17
17
  import './chunk-5TM3WPCI.js';
18
- import { sonorFetch } from './chunk-IYCSDFPN.js';
19
- import './chunk-QQT2T6JQ.js';
18
+ import { sonorFetch } from './chunk-FLOJUMFR.js';
19
+ import './chunk-7HW4TZB5.js';
20
20
  import { readPublishedApiConfig, readPublishedSite } from './chunk-W7OPEMGJ.js';
21
- import './chunk-BUE3Z32O.js';
21
+ import './chunk-F6WLHVMQ.js';
22
22
  import './chunk-PKBMQBKP.js';
23
23
  import { useEffect } from 'react';
24
24
 
@@ -1,14 +1,15 @@
1
1
  'use client';
2
- import { getSiteDesignTokens } from './chunk-NUXXFCIT.js';
3
- import { DEFAULT_POPUP_TOKENS, PopupBlocks } from './chunk-BF7TZYC3.js';
4
- import { normalizePopupBlocks, toHexColor, readableOn } from './chunk-IHG36STL.js';
2
+ import { getSiteDesignTokens } from './chunk-URLTBVRX.js';
3
+ import { DEFAULT_POPUP_TOKENS, PopupBlocks } from './chunk-52KO4LKD.js';
4
+ import './chunk-XLAHRN4B.js';
5
+ import { normalizePopupBlocks, toHexColor, readableOn } from './chunk-XHYE24HU.js';
5
6
  import './chunk-S22FSH7C.js';
6
- import './chunk-DLM4FFNH.js';
7
- import './chunk-EKBEOXTH.js';
8
- import './chunk-IYCSDFPN.js';
9
- import './chunk-QQT2T6JQ.js';
7
+ import './chunk-ZQSCMYZO.js';
8
+ import './chunk-64XODP7M.js';
9
+ import './chunk-FLOJUMFR.js';
10
+ import './chunk-7HW4TZB5.js';
10
11
  import './chunk-W7OPEMGJ.js';
11
- import './chunk-BUE3Z32O.js';
12
+ import './chunk-F6WLHVMQ.js';
12
13
  import './chunk-PKBMQBKP.js';
13
14
  import { useState } from 'react';
14
15
  import { jsx } from 'react/jsx-runtime';
@@ -1,8 +1,8 @@
1
- export { ChatWidget, EchoChat, isChatEnabled } from './chunk-IGAIQ2B3.js';
1
+ export { ChatWidget, EchoChat, isChatEnabled } from './chunk-TP32MRXV.js';
2
2
  import './chunk-6T6CQVNL.js';
3
3
  import './chunk-JE4A5S4F.js';
4
4
  import './chunk-27FISYK4.js';
5
- import './chunk-HMTPRBYJ.js';
5
+ import './chunk-IWNJCRXW.js';
6
6
  import './chunk-Q6E4OPGG.js';
7
7
  import './chunk-5ROTTMBL.js';
8
8
  import './chunk-C2FZBUSS.js';
@@ -13,8 +13,8 @@ import './chunk-S22FSH7C.js';
13
13
  import './chunk-L2V5PUFN.js';
14
14
  import './chunk-GJWI74ZZ.js';
15
15
  import './chunk-5TM3WPCI.js';
16
- import './chunk-IYCSDFPN.js';
17
- import './chunk-QQT2T6JQ.js';
16
+ import './chunk-FLOJUMFR.js';
17
+ import './chunk-7HW4TZB5.js';
18
18
  import './chunk-W7OPEMGJ.js';
19
- import './chunk-BUE3Z32O.js';
19
+ import './chunk-F6WLHVMQ.js';
20
20
  import './chunk-PKBMQBKP.js';
@@ -1,8 +1,8 @@
1
1
  'use client';
2
- import { sonorFetch } from './chunk-IYCSDFPN.js';
3
- import './chunk-QQT2T6JQ.js';
2
+ import { sonorFetch } from './chunk-FLOJUMFR.js';
3
+ import './chunk-7HW4TZB5.js';
4
4
  import { getClientApiConfig } from './chunk-W7OPEMGJ.js';
5
- import './chunk-BUE3Z32O.js';
5
+ import './chunk-F6WLHVMQ.js';
6
6
  import './chunk-PKBMQBKP.js';
7
7
  import React2, { useState, useRef } from 'react';
8
8
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { StageStyles, SummaryTick } from './chunk-3YKQLC7J.js';
3
- import { stageFirstName, useFieldControls, stageViews, stageEstimate, AUTO_ADVANCE_TYPES } from './chunk-NI6ZTP3D.js';
3
+ import { stageFirstName, useFieldControls, stageViews, stageEstimate, AUTO_ADVANCE_TYPES } from './chunk-GQN4BGK6.js';
4
4
  import { readAgentSubmit, formToolAttributes } from './chunk-Q6E4OPGG.js';
5
5
  import { isEmptyValue, unseenControlValues, isDisplayOnly } from './chunk-C2FZBUSS.js';
6
6
  import { FormField } from './chunk-CVADNHJ4.js';
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { StageStyles, SummaryTick } from './chunk-3YKQLC7J.js';
3
- import { useFieldControls, stageViews, stageFirstName, stageEstimate, formatAnswer, AUTO_ADVANCE_TYPES } from './chunk-NI6ZTP3D.js';
3
+ import { useFieldControls, stageViews, stageFirstName, stageEstimate, formatAnswer, AUTO_ADVANCE_TYPES } from './chunk-GQN4BGK6.js';
4
4
  import { readAgentSubmit, formToolAttributes } from './chunk-Q6E4OPGG.js';
5
5
  import { isEmptyValue, unseenControlValues } from './chunk-C2FZBUSS.js';
6
6
  import { FormField } from './chunk-CVADNHJ4.js';
@@ -1,6 +1,6 @@
1
- export { ManagedForm } from './chunk-7R2STOVD.js';
2
- import './chunk-NI6ZTP3D.js';
3
- import './chunk-HMTPRBYJ.js';
1
+ export { ManagedForm } from './chunk-G7BRCSV6.js';
2
+ import './chunk-GQN4BGK6.js';
3
+ import './chunk-IWNJCRXW.js';
4
4
  import './chunk-Q6E4OPGG.js';
5
5
  import './chunk-5ROTTMBL.js';
6
6
  import './chunk-C2FZBUSS.js';
@@ -12,8 +12,8 @@ import './chunk-NJCTQH2P.js';
12
12
  import './chunk-L2V5PUFN.js';
13
13
  import './chunk-GJWI74ZZ.js';
14
14
  import './chunk-5TM3WPCI.js';
15
- import './chunk-IYCSDFPN.js';
16
- import './chunk-QQT2T6JQ.js';
15
+ import './chunk-FLOJUMFR.js';
16
+ import './chunk-7HW4TZB5.js';
17
17
  import './chunk-W7OPEMGJ.js';
18
- import './chunk-BUE3Z32O.js';
18
+ import './chunk-F6WLHVMQ.js';
19
19
  import './chunk-PKBMQBKP.js';
@@ -1,12 +1,12 @@
1
- import './chunk-L6QTERSH.js';
2
- import './chunk-7R2STOVD.js';
3
- import './chunk-NI6ZTP3D.js';
4
- import './chunk-SOD2F6C2.js';
1
+ import './chunk-DYROJGI2.js';
5
2
  import './chunk-YGGDU6C3.js';
6
- import { useForm } from './chunk-HMTPRBYJ.js';
3
+ import './chunk-G7BRCSV6.js';
4
+ import './chunk-GQN4BGK6.js';
5
+ import './chunk-SOD2F6C2.js';
6
+ import { useForm } from './chunk-IWNJCRXW.js';
7
7
  import './chunk-Q6E4OPGG.js';
8
8
  import './chunk-5ROTTMBL.js';
9
- import './chunk-OWO3RFEX.js';
9
+ import './chunk-SLFYTELD.js';
10
10
  import './chunk-C2FZBUSS.js';
11
11
  import './chunk-YC7ELZS3.js';
12
12
  import './chunk-DXO6SBMD.js';
@@ -19,10 +19,10 @@ import './chunk-DJAYFHVF.js';
19
19
  import './chunk-L2V5PUFN.js';
20
20
  import './chunk-GJWI74ZZ.js';
21
21
  import './chunk-5TM3WPCI.js';
22
- import './chunk-IYCSDFPN.js';
23
- import './chunk-QQT2T6JQ.js';
22
+ import './chunk-FLOJUMFR.js';
23
+ import './chunk-7HW4TZB5.js';
24
24
  import './chunk-W7OPEMGJ.js';
25
- import './chunk-BUE3Z32O.js';
25
+ import './chunk-F6WLHVMQ.js';
26
26
  import './chunk-PKBMQBKP.js';
27
27
  import { jsxs, jsx } from 'react/jsx-runtime';
28
28
 
@@ -3,12 +3,12 @@ import { getOrCreateVisitorId, getOrCreateSessionId } from './chunk-IPQKQEWI.js'
3
3
  import { onPageLeave } from './chunk-L2V5PUFN.js';
4
4
  import './chunk-GJWI74ZZ.js';
5
5
  import './chunk-5TM3WPCI.js';
6
- import { isPrivatePreview } from './chunk-DLM4FFNH.js';
7
- import './chunk-EKBEOXTH.js';
8
- import { sonorFetch } from './chunk-IYCSDFPN.js';
9
- import { getFreshCredential, isSiteToken } from './chunk-QQT2T6JQ.js';
6
+ import { isPrivatePreview } from './chunk-ZQSCMYZO.js';
7
+ import './chunk-64XODP7M.js';
8
+ import { sonorFetch } from './chunk-FLOJUMFR.js';
9
+ import { getFreshCredential, isSiteToken } from './chunk-7HW4TZB5.js';
10
10
  import { getClientApiConfig } from './chunk-W7OPEMGJ.js';
11
- import './chunk-BUE3Z32O.js';
11
+ import './chunk-F6WLHVMQ.js';
12
12
  import './chunk-PKBMQBKP.js';
13
13
  import { useState, useRef, useEffect, useCallback } from 'react';
14
14
 
@@ -0,0 +1,6 @@
1
+ export { SiteChat } from './chunk-SBPUFTMP.js';
2
+ import './chunk-27FISYK4.js';
3
+ import './chunk-ZQSCMYZO.js';
4
+ import './chunk-64XODP7M.js';
5
+ import './chunk-W7OPEMGJ.js';
6
+ import './chunk-PKBMQBKP.js';
@@ -0,0 +1,13 @@
1
+ export { SiteDesignReporter } from './chunk-6BFQI3ZE.js';
2
+ import './chunk-URLTBVRX.js';
3
+ import './chunk-XLAHRN4B.js';
4
+ import './chunk-XHYE24HU.js';
5
+ import './chunk-YC7ELZS3.js';
6
+ import './chunk-S22FSH7C.js';
7
+ import './chunk-ZQSCMYZO.js';
8
+ import './chunk-64XODP7M.js';
9
+ import './chunk-FLOJUMFR.js';
10
+ import './chunk-7HW4TZB5.js';
11
+ import './chunk-W7OPEMGJ.js';
12
+ import './chunk-F6WLHVMQ.js';
13
+ import './chunk-PKBMQBKP.js';
@@ -1,13 +1,13 @@
1
- export { SitePopups } from './chunk-FTSEP7Q3.js';
1
+ export { SitePopups } from './chunk-YEX5RAEU.js';
2
2
  import './chunk-27FISYK4.js';
3
3
  import './chunk-5ROTTMBL.js';
4
4
  import './chunk-IPQKQEWI.js';
5
5
  import './chunk-GJWI74ZZ.js';
6
6
  import './chunk-5TM3WPCI.js';
7
- import './chunk-DLM4FFNH.js';
8
- import './chunk-EKBEOXTH.js';
9
- import './chunk-IYCSDFPN.js';
10
- import './chunk-QQT2T6JQ.js';
7
+ import './chunk-ZQSCMYZO.js';
8
+ import './chunk-64XODP7M.js';
9
+ import './chunk-FLOJUMFR.js';
10
+ import './chunk-7HW4TZB5.js';
11
11
  import './chunk-W7OPEMGJ.js';
12
- import './chunk-BUE3Z32O.js';
12
+ import './chunk-F6WLHVMQ.js';
13
13
  import './chunk-PKBMQBKP.js';
@@ -0,0 +1,9 @@
1
+ export { SitemapSync } from './chunk-OWZWRP7Y.js';
2
+ import './chunk-YVKRYQRG.js';
3
+ import './chunk-ZQSCMYZO.js';
4
+ import './chunk-64XODP7M.js';
5
+ import './chunk-FLOJUMFR.js';
6
+ import './chunk-7HW4TZB5.js';
7
+ import './chunk-W7OPEMGJ.js';
8
+ import './chunk-F6WLHVMQ.js';
9
+ import './chunk-PKBMQBKP.js';
@@ -1,10 +1,10 @@
1
1
  'use client';
2
- export { BookingWidget, BookingWidget_default as default } from '../chunk-QNOJSSQT.js';
3
- import '../chunk-72F44HKL.js';
2
+ export { BookingWidget, BookingWidget_default as default } from '../chunk-6DXQHNZK.js';
3
+ import '../chunk-PSS6M4CG.js';
4
4
  import '../chunk-5ROTTMBL.js';
5
5
  import '../chunk-5TM3WPCI.js';
6
- import '../chunk-IYCSDFPN.js';
7
- import '../chunk-QQT2T6JQ.js';
6
+ import '../chunk-FLOJUMFR.js';
7
+ import '../chunk-7HW4TZB5.js';
8
8
  import '../chunk-W7OPEMGJ.js';
9
- import '../chunk-BUE3Z32O.js';
9
+ import '../chunk-F6WLHVMQ.js';
10
10
  import '../chunk-PKBMQBKP.js';
@@ -2,8 +2,8 @@
2
2
  * @sonordev/site-kit/admin-auth — "Sign in with Sonor" for a site's own admin area
3
3
  *
4
4
  * SINGLE SOURCE OF TRUTH for the Sonor SSO handshake on client sites. Before
5
- * this module, 4m-lawn-care (/bid, /route), legacy-clay-classic (/admin) and the
6
- * CCG builder (/studio) each carried a hand-copied version, and the copies had
5
+ * this module, three client sites (an /admin area, a /studio builder and a
6
+ * pair of /bid and /route tools) each carried a hand-copied version, and the copies had
7
7
  * already drifted (Node vs Web Crypto, 7 vs 30 day sessions, roles in one only).
8
8
  * Do not re-fork it into a site.
9
9
  *
@@ -3,8 +3,8 @@
3
3
  *
4
4
  * Format: `<base64url(payload)>.<base64url(HMAC-SHA256(payloadB64))>`, payload
5
5
  * `{ email, contactId, iat, exp }` in Unix seconds. This is byte-compatible with
6
- * the hand-rolled Web Crypto sessions legacy-clay-classic and the CCG builder
7
- * shipped before this module existed, so a site that passes its old cookie name
6
+ * the hand-rolled Web Crypto sessions that client sites shipped before this
7
+ * module existed, so a site that passes its old cookie name
8
8
  * and secret keeps every signed-in user signed in across the switch.
9
9
  *
10
10
  * Web Crypto only (never Node `crypto`): these helpers run in Edge middleware
@@ -1,8 +1,8 @@
1
1
  'use client';
2
- import { sonorFetch } from '../chunk-IYCSDFPN.js';
3
- import '../chunk-QQT2T6JQ.js';
2
+ import { sonorFetch } from '../chunk-FLOJUMFR.js';
3
+ import '../chunk-7HW4TZB5.js';
4
4
  import { getClientApiConfig } from '../chunk-W7OPEMGJ.js';
5
- import '../chunk-BUE3Z32O.js';
5
+ import '../chunk-F6WLHVMQ.js';
6
6
  import '../chunk-PKBMQBKP.js';
7
7
  import { useState, useEffect } from 'react';
8
8
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -0,0 +1,17 @@
1
+ /**
2
+ * The readable text of a page's main content, for `seo_pages.content_text`.
3
+ *
4
+ * `textContent` joins elements with nothing between them, so a heading, its
5
+ * tagline and the first paragraph came out as "Getting paid for the
6
+ * workIncome, spending, budgets.Track expenses", and a contact page as
7
+ * "First Name*Last Name*Email*PhoneMessage*Send Message". That text is stored,
8
+ * read by the metadata generators, and was the last-resort description in
9
+ * llms.txt. A space goes after every block element and in place of every line
10
+ * break, and a form's field names, buttons and dialogs are left out, so the
11
+ * text reads the way the page does. Sonor still cleans what older pages
12
+ * stored (`cleanScrapedPageText` in @sonordev/contracts/llms).
13
+ */
14
+ /** The longest text stored, in characters. */
15
+ export declare const CONTENT_TEXT_MAX_LENGTH = 10000;
16
+ /** The text of `root`'s content with its elements apart, whitespace collapsed, at most `CONTENT_TEXT_MAX_LENGTH` characters. Leaves `root` as it was. */
17
+ export declare function extractContentText(root: Element): string;
@@ -1,17 +1,17 @@
1
1
  'use client';
2
- export { AnalyticsProvider, WebVitals, useAnalytics, useAnalyticsOptional, useTrackEvent } from '../chunk-GFY3E7EQ.js';
2
+ export { AnalyticsProvider, WebVitals, useAnalytics, useAnalyticsOptional, useTrackEvent } from '../chunk-GXWM5KNS.js';
3
3
  import { trackConversion } from '../chunk-LCDVPAMR.js';
4
4
  export { trackConversion, trackEvent } from '../chunk-LCDVPAMR.js';
5
5
  import '../chunk-IPQKQEWI.js';
6
6
  import '../chunk-L2V5PUFN.js';
7
7
  import '../chunk-GJWI74ZZ.js';
8
8
  import '../chunk-5TM3WPCI.js';
9
- export { isCrossOriginFrame, isFramed, isTopFrameSameOrigin } from '../chunk-DLM4FFNH.js';
10
- import '../chunk-EKBEOXTH.js';
11
- import '../chunk-IYCSDFPN.js';
12
- import '../chunk-QQT2T6JQ.js';
9
+ export { isCrossOriginFrame, isFramed, isTopFrameSameOrigin } from '../chunk-ZQSCMYZO.js';
10
+ import '../chunk-64XODP7M.js';
11
+ import '../chunk-FLOJUMFR.js';
12
+ import '../chunk-7HW4TZB5.js';
13
13
  import '../chunk-W7OPEMGJ.js';
14
- import '../chunk-BUE3Z32O.js';
14
+ import '../chunk-F6WLHVMQ.js';
15
15
  import '../chunk-PKBMQBKP.js';
16
16
  import { useCallback, useEffect } from 'react';
17
17
 
@@ -1,5 +1,6 @@
1
1
  import { articlePhotoCss } from './chunk-WHPCGQHC.js';
2
- import { articleTableCss } from './chunk-E4PTMORJ.js';
2
+ import { articleTableCss } from './chunk-AL5UCWLI.js';
3
+ import './chunk-IBHBEUZV.js';
3
4
  import './chunk-PKBMQBKP.js';
4
5
 
5
6
  // packages/press-kit/src/articles/article-styles.ts
@@ -0,0 +1,3 @@
1
+ export { articleTableCss, wrapArticleTables } from './chunk-AL5UCWLI.js';
2
+ import './chunk-IBHBEUZV.js';
3
+ import './chunk-PKBMQBKP.js';
@@ -1,13 +1,14 @@
1
1
  'use client';
2
- import { NewsletterShell } from '../chunk-JHTPHA2D.js';
3
2
  export { ArticleFAQ } from '../chunk-BVB5FBAA.js';
4
- import { getAuthorSocialLinks, readingTimeMinutes } from '../chunk-BC7JMY4Z.js';
5
- export { ClusterNavigation, ServiceCallout, ServiceCallouts } from '../chunk-BC7JMY4Z.js';
3
+ import { NewsletterShell } from '../chunk-JHTPHA2D.js';
4
+ import { getAuthorSocialLinks, generateTableOfContents, readingTimeMinutes } from '../chunk-JG53YJLM.js';
5
+ export { ClusterNavigation, ServiceCallout, ServiceCallouts } from '../chunk-JG53YJLM.js';
6
6
  import '../chunk-DJAYFHVF.js';
7
- export { addExternalLinkTargets, linkClassificationHost, normalizeSiteHost, resolvePublicationSiteUrl } from '../chunk-5D7ZISUP.js';
7
+ export { addExternalLinkTargets, linkClassificationHost, normalizeSiteHost, resolvePublicationSiteUrl } from '../chunk-7DYMM6SS.js';
8
8
  import { generateAuthorSchema, resolveArticleArtwork, articleArtworkImageStyle } from '../chunk-UVYUTBT4.js';
9
9
  export { resolveArticleArtwork } from '../chunk-UVYUTBT4.js';
10
10
  import '../chunk-H72ZFO3F.js';
11
+ import '../chunk-IBHBEUZV.js';
11
12
  import { createPublicationRoutes } from '../chunk-4K735O3J.js';
12
13
  export { articleCategorySlug, createPublicationRoutes, resolveArticleUrl, resolvePublicationUrl } from '../chunk-4K735O3J.js';
13
14
  import { safeJsonLd } from '../chunk-4KZ6W3ZH.js';
@@ -20,7 +21,7 @@ import '../chunk-PKBMQBKP.js';
20
21
  import React, { useState, Suspense, useEffect } from 'react';
21
22
  import { jsx, jsxs } from 'react/jsx-runtime';
22
23
 
23
- var ManagedNewsletterForm = React.lazy(() => import('../ManagedNewsletterForm-5TE47YZD.js'));
24
+ var ManagedNewsletterForm = React.lazy(() => import('../ManagedNewsletterForm-TUYGN6O3.js'));
24
25
  function NewsletterWidget({
25
26
  title = "Subscribe to Our Newsletter",
26
27
  description = "Get the latest posts delivered straight to your inbox.",
@@ -376,27 +377,13 @@ function AuthorPage({ author, posts, basePath, routing, siteUrl, siteName, jsonL
376
377
  ] })
377
378
  ] });
378
379
  }
379
- function parseHeadings(content) {
380
- const headingRegex = /<h([2-4])[^>]*id="([^"]*)"[^>]*>(.*?)<\/h[2-4]>/gi;
381
- const items = [];
382
- let match;
383
- while ((match = headingRegex.exec(content)) !== null) {
384
- items.push({
385
- level: parseInt(match[1]),
386
- id: match[2],
387
- text: match[3].replace(/<[^>]*>/g, "")
388
- // Strip any nested HTML
389
- });
390
- }
391
- return items;
392
- }
393
380
  function TableOfContents({
394
381
  content,
395
382
  className,
396
383
  maxDepth = 3
397
384
  }) {
398
385
  const [activeId, setActiveId] = useState("");
399
- const items = parseHeadings(content).filter((item) => item.level <= maxDepth);
386
+ const items = generateTableOfContents(content).filter((item) => item.level <= maxDepth);
400
387
  useEffect(() => {
401
388
  if (typeof window === "undefined") return;
402
389
  const observer = new IntersectionObserver(
@@ -1,37 +1,52 @@
1
- import { readingTimeMinutes, ServiceCallouts, ClusterNavigation, getAuthorSocialLinks } from '../chunk-BC7JMY4Z.js';
2
- export { ClusterNavigation } from '../chunk-BC7JMY4Z.js';
1
+ import { generateTableOfContents, readingTimeMinutes, ServiceCallouts, ClusterNavigation, getAuthorSocialLinks, scanHeadings, ownId, slugify } from '../chunk-JG53YJLM.js';
2
+ export { ClusterNavigation } from '../chunk-JG53YJLM.js';
3
3
  import { widgetStyle, widgetTitleStyle } from '../chunk-DJAYFHVF.js';
4
- import { resolvePublicationSiteUrl, addExternalLinkTargets } from '../chunk-5D7ZISUP.js';
5
- import { fetchArticleBySlug, fetchRelatedArticles, fetchArticleCategories, getTopicCluster, ArticleUnavailableError } from '../chunk-RI2N2EBI.js';
4
+ import { resolvePublicationSiteUrl, addExternalLinkTargets } from '../chunk-7DYMM6SS.js';
5
+ import { fetchArticleBySlug, articleBodyHtml, fetchRelatedArticles, fetchArticleCategories, getTopicCluster, ArticleUnavailableError } from '../chunk-JYITKUUB.js';
6
6
  import { insertArticlePhotos } from '../chunk-WHPCGQHC.js';
7
7
  export { articlePhotoCss, insertArticlePhotos } from '../chunk-WHPCGQHC.js';
8
- export { articleTableCss, wrapArticleTables } from '../chunk-E4PTMORJ.js';
8
+ export { articleTableCss, wrapArticleTables } from '../chunk-AL5UCWLI.js';
9
9
  import { resolveArticleArtwork, articleArtworkImageStyle } from '../chunk-UVYUTBT4.js';
10
10
  export { resolveArticleArtwork } from '../chunk-UVYUTBT4.js';
11
11
  import '../chunk-H72ZFO3F.js';
12
+ import { stripHtmlTags } from '../chunk-IBHBEUZV.js';
12
13
  import { createPublicationRoutes, articleCategorySlug } from '../chunk-4K735O3J.js';
13
14
  export { articleCategorySlug, createPublicationRoutes, resolveArticleUrl, resolvePublicationUrl } from '../chunk-4K735O3J.js';
14
15
  import '../chunk-34ZYJTQR.js';
15
- import '../chunk-JSW42BHL.js';
16
+ import '../chunk-M5JIHQ42.js';
16
17
  import '../chunk-UAYAJPEP.js';
17
18
  import '../chunk-VWWITFWM.js';
18
19
  import '../chunk-4KZ6W3ZH.js';
19
20
  import { withSiteParam } from '../chunk-MJP63SSS.js';
20
- import '../chunk-6KU7STM3.js';
21
+ import '../chunk-HY7ZEU2C.js';
21
22
  import '../chunk-C7TLGL3R.js';
22
23
  import '../chunk-MH2DSGC6.js';
23
24
  import '../chunk-YVKRYQRG.js';
24
25
  import '../chunk-FESKKJAS.js';
25
26
  import '../chunk-A4CC4ZG3.js';
26
27
  import '../chunk-W7OPEMGJ.js';
27
- import '../chunk-BUE3Z32O.js';
28
+ import '../chunk-F6WLHVMQ.js';
28
29
  import '../chunk-PKBMQBKP.js';
29
30
  import 'server-only';
30
- import { marked } from 'marked';
31
31
  import { notFound } from 'next/navigation';
32
32
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
33
33
  import React from 'react';
34
34
 
35
+ // packages/press-kit/src/articles/article-heading-ids.ts
36
+ function injectHeadingIds(html) {
37
+ let output = "";
38
+ let cursor = 0;
39
+ for (const { level, attributes, inner, start, end } of scanHeadings(html)) {
40
+ output += html.slice(cursor, start);
41
+ cursor = end;
42
+ if (ownId(attributes) !== null) {
43
+ output += html.slice(start, end);
44
+ continue;
45
+ }
46
+ output += `<h${level}${attributes} id="${slugify(stripHtmlTags(inner))}">${inner}</h${level}>`;
47
+ }
48
+ return output + html.slice(cursor);
49
+ }
35
50
  function getClusterNav(post) {
36
51
  if (!post.cluster_id && !post.cluster_slug) return null;
37
52
  const isPillar = post.article_type === "pillar";
@@ -47,46 +62,6 @@ function getClusterNav(post) {
47
62
  is_pillar: isPillar
48
63
  };
49
64
  }
50
- function looksLikeMarkdown(text) {
51
- if (text.trimStart().startsWith("<")) return false;
52
- const markers = [/^#{1,6}\s/m, /\*\*[^*]+\*\*/, /\[([^\]]+)\]\([^)]+\)/, /^[-*]\s/m, /^>\s/m];
53
- let hits = 0;
54
- for (const re of markers) if (re.test(text)) hits++;
55
- return hits >= 2;
56
- }
57
- function slugify(text) {
58
- return text.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/(^-|-$)/g, "");
59
- }
60
- function ensureHtml(raw) {
61
- if (!raw) return raw;
62
- let html = raw;
63
- if (looksLikeMarkdown(html)) {
64
- html = marked.parse(html, { gfm: true, breaks: false, async: false });
65
- }
66
- html = injectHeadingIds(html);
67
- return html;
68
- }
69
- function injectHeadingIds(html) {
70
- return html.replace(/<h([2-4])([^>]*)>(.*?)<\/h[2-4]>/gi, (_full, level, attrs, inner) => {
71
- if (/\bid\s*=/i.test(attrs)) return _full;
72
- const text = inner.replace(/<[^>]*>/g, "");
73
- const id = slugify(text);
74
- return `<h${level}${attrs} id="${id}">${inner}</h${level}>`;
75
- });
76
- }
77
- function generateTableOfContents(html) {
78
- const headingRegex = /<h([2-4])[^>]*(?:id="([^"]*)")?[^>]*>(.*?)<\/h[2-4]>/gi;
79
- const items = [];
80
- let match;
81
- while ((match = headingRegex.exec(html)) !== null) {
82
- const level = parseInt(match[1]);
83
- const existingId = match[2];
84
- const text = match[3].replace(/<[^>]*>/g, "");
85
- const id = existingId || slugify(text);
86
- items.push({ id, text, level });
87
- }
88
- return items;
89
- }
90
65
  function cls(unstyled, styles, key, defaultClass, extra) {
91
66
  if (unstyled) return styles[key] || void 0;
92
67
  const base = styles[key] || defaultClass;
@@ -118,8 +93,8 @@ async function Article({
118
93
  }
119
94
  const [post, { articleCss }, { wrapArticleTables: wrapArticleTables2 }] = await Promise.all([
120
95
  fetchArticleBySlug({ apiUrl, apiKey, site }, slug),
121
- unstyled ? Promise.resolve({ articleCss: "" }) : import('../article-styles-VASFBYA3.js'),
122
- import('../article-tables-6XHVULPU.js')
96
+ unstyled ? Promise.resolve({ articleCss: "" }) : import('../article-styles-D7VCDXMG.js'),
97
+ import('../article-tables-W45BE353.js')
123
98
  ]);
124
99
  if (!post) {
125
100
  if (notFound$1) notFound();
@@ -132,8 +107,7 @@ async function Article({
132
107
  ] })
133
108
  ] });
134
109
  }
135
- const rawContent = post.content_html || post.content || "";
136
- const content = ensureHtml(rawContent);
110
+ const content = injectHeadingIds(articleBodyHtml(post));
137
111
  const siteUrlResolved = resolvePublicationSiteUrl(siteUrl);
138
112
  const contentWithExternalTargets = wrapArticleTables2(addExternalLinkTargets(insertArticlePhotos(content, post.editorial_photos), siteUrlResolved));
139
113
  const artwork = resolveArticleArtwork(post, "article");
@@ -144,7 +118,7 @@ async function Article({
144
118
  ...item,
145
119
  answer: addExternalLinkTargets(item.answer || "", siteUrlResolved)
146
120
  })) ?? faqRaw;
147
- const { ArticleViewTracker } = await import('../ArticleViewTracker-AOJXEBYM.js');
121
+ const { ArticleViewTracker } = await import('../ArticleViewTracker-PV2RD3P6.js');
148
122
  if (children) {
149
123
  return /* @__PURE__ */ jsxs(Fragment, { children: [
150
124
  /* @__PURE__ */ jsx(ArticleViewTracker, { slug: post.slug, site }),
@@ -426,7 +400,7 @@ async function ArticleList({
426
400
  const [articleData, categories, { articleListCss }] = await Promise.all([
427
401
  fetchArticleList({ apiUrl, apiKey, category, tag, author, featured, search, cluster, page, perPage, orderBy, order, site }),
428
402
  showCategoryFilter ? fetchArticleCategories({ apiUrl, apiKey, site }) : Promise.resolve([]),
429
- unstyled || children ? Promise.resolve({ articleListCss: "" }) : import('../article-styles-VASFBYA3.js')
403
+ unstyled || children ? Promise.resolve({ articleListCss: "" }) : import('../article-styles-D7VCDXMG.js')
430
404
  ]);
431
405
  if (children) {
432
406
  return children({ posts: articleData.posts, pagination: articleData.pagination, categories });