@focus-reactive/payload-plugin-seo 1.3.0 → 1.4.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 (277) hide show
  1. package/README.md +210 -43
  2. package/dist/admin.css +2 -3
  3. package/dist/components/SeoButton/ScoreBadge.d.ts.map +1 -1
  4. package/dist/components/SeoButton/ScoreBadge.js +10 -7
  5. package/dist/components/SeoButton/ScoreBadge.js.map +1 -1
  6. package/dist/components/SeoButton/SeoButtonInner.d.ts +3 -1
  7. package/dist/components/SeoButton/SeoButtonInner.d.ts.map +1 -1
  8. package/dist/components/SeoButton/SeoButtonInner.js +5 -2
  9. package/dist/components/SeoButton/SeoButtonInner.js.map +1 -1
  10. package/dist/components/SeoDrawer/TabsNav/index.d.ts.map +1 -1
  11. package/dist/components/SeoDrawer/TabsNav/index.js +15 -4
  12. package/dist/components/SeoDrawer/TabsNav/index.js.map +1 -1
  13. package/dist/components/SeoDrawer/TabsNav/variants.d.ts.map +1 -1
  14. package/dist/components/SeoDrawer/TabsNav/variants.js +12 -9
  15. package/dist/components/SeoDrawer/TabsNav/variants.js.map +1 -1
  16. package/dist/components/SeoDrawer/analysisDecision.d.ts.map +1 -1
  17. package/dist/components/SeoDrawer/analysisDecision.js.map +1 -1
  18. package/dist/components/SeoDrawer/build-analysis-input.d.ts +9 -7
  19. package/dist/components/SeoDrawer/build-analysis-input.d.ts.map +1 -1
  20. package/dist/components/SeoDrawer/build-analysis-input.js +39 -11
  21. package/dist/components/SeoDrawer/build-analysis-input.js.map +1 -1
  22. package/dist/components/SeoDrawer/buildInput.d.ts +1 -1
  23. package/dist/components/SeoDrawer/buildInput.d.ts.map +1 -1
  24. package/dist/components/SeoDrawer/buildInput.js +12 -2
  25. package/dist/components/SeoDrawer/buildInput.js.map +1 -1
  26. package/dist/components/SeoDrawer/components/Header.d.ts.map +1 -1
  27. package/dist/components/SeoDrawer/components/Header.js +20 -2
  28. package/dist/components/SeoDrawer/components/Header.js.map +1 -1
  29. package/dist/components/SeoDrawer/components/HeadingsSection/HeadingLevelTiles.d.ts.map +1 -1
  30. package/dist/components/SeoDrawer/components/HeadingsSection/HeadingLevelTiles.js +23 -5
  31. package/dist/components/SeoDrawer/components/HeadingsSection/HeadingLevelTiles.js.map +1 -1
  32. package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/Chevron.d.ts.map +1 -1
  33. package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/Chevron.js +12 -1
  34. package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/Chevron.js.map +1 -1
  35. package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeGroup.d.ts.map +1 -1
  36. package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeGroup.js +43 -4
  37. package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeGroup.js.map +1 -1
  38. package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeRow.d.ts +1 -1
  39. package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeRow.d.ts.map +1 -1
  40. package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeRow.js +45 -10
  41. package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeRow.js.map +1 -1
  42. package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/index.d.ts.map +1 -1
  43. package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/index.js.map +1 -1
  44. package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/useHeadingRails.d.ts +1 -1
  45. package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/useHeadingRails.d.ts.map +1 -1
  46. package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/useHeadingRails.js +6 -1
  47. package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/useHeadingRails.js.map +1 -1
  48. package/dist/components/SeoDrawer/components/HeadingsSection/index.d.ts.map +1 -1
  49. package/dist/components/SeoDrawer/components/HeadingsSection/index.js.map +1 -1
  50. package/dist/components/SeoDrawer/components/SerpPreview/highlight-keyphrase.d.ts.map +1 -1
  51. package/dist/components/SeoDrawer/components/SerpPreview/highlight-keyphrase.js +3 -1
  52. package/dist/components/SeoDrawer/components/SerpPreview/highlight-keyphrase.js.map +1 -1
  53. package/dist/components/SeoDrawer/components/SerpPreview/index.d.ts.map +1 -1
  54. package/dist/components/SeoDrawer/components/SerpPreview/index.js +8 -1
  55. package/dist/components/SeoDrawer/components/SerpPreview/index.js.map +1 -1
  56. package/dist/components/SeoDrawer/components/SerpPreview/serp-favicon.d.ts.map +1 -1
  57. package/dist/components/SeoDrawer/components/SerpPreview/serp-favicon.js.map +1 -1
  58. package/dist/components/SeoDrawer/components/SerpPreview/variants.d.ts.map +1 -1
  59. package/dist/components/SeoDrawer/components/SerpPreview/variants.js +9 -6
  60. package/dist/components/SeoDrawer/components/SerpPreview/variants.js.map +1 -1
  61. package/dist/components/SeoDrawer/index.d.ts.map +1 -1
  62. package/dist/components/SeoDrawer/index.js +50 -15
  63. package/dist/components/SeoDrawer/index.js.map +1 -1
  64. package/dist/components/SeoDrawer/keyphrasePending.d.ts.map +1 -1
  65. package/dist/components/SeoDrawer/keyphrasePending.js.map +1 -1
  66. package/dist/components/SeoDrawer/languagePacks.d.ts.map +1 -1
  67. package/dist/components/SeoDrawer/languagePacks.js.map +1 -1
  68. package/dist/components/SeoDrawer/tabs/InclusiveTab.d.ts.map +1 -1
  69. package/dist/components/SeoDrawer/tabs/InclusiveTab.js +31 -10
  70. package/dist/components/SeoDrawer/tabs/InclusiveTab.js.map +1 -1
  71. package/dist/components/SeoDrawer/tabs/KeyphraseTab.d.ts +1 -1
  72. package/dist/components/SeoDrawer/tabs/KeyphraseTab.d.ts.map +1 -1
  73. package/dist/components/SeoDrawer/tabs/KeyphraseTab.js +8 -1
  74. package/dist/components/SeoDrawer/tabs/KeyphraseTab.js.map +1 -1
  75. package/dist/components/SeoDrawer/tabs/SerpTab.d.ts +1 -1
  76. package/dist/components/SeoDrawer/tabs/SerpTab.d.ts.map +1 -1
  77. package/dist/components/SeoDrawer/tabs/SerpTab.js +5 -1
  78. package/dist/components/SeoDrawer/tabs/SerpTab.js.map +1 -1
  79. package/dist/components/SeoDrawer/tabs/VitalsTab.d.ts.map +1 -1
  80. package/dist/components/SeoDrawer/tabs/VitalsTab.js +32 -9
  81. package/dist/components/SeoDrawer/tabs/VitalsTab.js.map +1 -1
  82. package/dist/components/SeoDrawer/useAnalysis.d.ts +1 -1
  83. package/dist/components/SeoDrawer/useAnalysis.d.ts.map +1 -1
  84. package/dist/components/SeoDrawer/useAnalysis.js +6 -1
  85. package/dist/components/SeoDrawer/useAnalysis.js.map +1 -1
  86. package/dist/components/SeoDrawer/useLiveDocument.d.ts +5 -3
  87. package/dist/components/SeoDrawer/useLiveDocument.d.ts.map +1 -1
  88. package/dist/components/SeoDrawer/useLiveDocument.js +82 -37
  89. package/dist/components/SeoDrawer/useLiveDocument.js.map +1 -1
  90. package/dist/components/icons.d.ts.map +1 -1
  91. package/dist/components/icons.js +16 -1
  92. package/dist/components/icons.js.map +1 -1
  93. package/dist/constants/checkIds.d.ts.map +1 -1
  94. package/dist/constants/checkIds.js +18 -2
  95. package/dist/constants/checkIds.js.map +1 -1
  96. package/dist/content/extract/context.d.ts +11 -0
  97. package/dist/content/extract/context.d.ts.map +1 -0
  98. package/dist/content/extract/context.js +1 -0
  99. package/dist/content/extract/context.js.map +1 -0
  100. package/dist/content/extract/extract.d.ts +18 -0
  101. package/dist/content/extract/extract.d.ts.map +1 -0
  102. package/dist/content/extract/extract.js +211 -0
  103. package/dist/content/extract/extract.js.map +1 -0
  104. package/dist/content/extract/selection.d.ts +3 -0
  105. package/dist/content/extract/selection.d.ts.map +1 -0
  106. package/dist/content/extract/selection.js +32 -0
  107. package/dist/content/extract/selection.js.map +1 -0
  108. package/dist/content/index.d.ts +5 -0
  109. package/dist/content/index.d.ts.map +1 -0
  110. package/dist/content/index.js +14 -0
  111. package/dist/content/index.js.map +1 -0
  112. package/dist/content/lexical/transform.d.ts +5 -0
  113. package/dist/content/lexical/transform.d.ts.map +1 -0
  114. package/dist/content/lexical/transform.js +56 -0
  115. package/dist/content/lexical/transform.js.map +1 -0
  116. package/dist/content/registry.d.ts +4 -0
  117. package/dist/content/registry.d.ts.map +1 -0
  118. package/dist/content/registry.js +22 -0
  119. package/dist/content/registry.js.map +1 -0
  120. package/dist/content/resolve/collect-refs.d.ts +8 -0
  121. package/dist/content/resolve/collect-refs.d.ts.map +1 -0
  122. package/dist/content/resolve/collect-refs.js +79 -0
  123. package/dist/content/resolve/collect-refs.js.map +1 -0
  124. package/dist/content/resolve/hydrate.d.ts +7 -0
  125. package/dist/content/resolve/hydrate.d.ts.map +1 -0
  126. package/dist/content/resolve/hydrate.js +123 -0
  127. package/dist/content/resolve/hydrate.js.map +1 -0
  128. package/dist/content/resolve/resolver.d.ts +7 -0
  129. package/dist/content/resolve/resolver.d.ts.map +1 -0
  130. package/dist/content/{uploads/media-resolver.js → resolve/resolver.js} +21 -16
  131. package/dist/content/resolve/resolver.js.map +1 -0
  132. package/dist/content/resolve/types.d.ts +12 -0
  133. package/dist/content/resolve/types.d.ts.map +1 -0
  134. package/dist/content/resolve/types.js +7 -0
  135. package/dist/content/resolve/types.js.map +1 -0
  136. package/dist/content/schema/helpers.d.ts +9 -0
  137. package/dist/content/schema/helpers.d.ts.map +1 -0
  138. package/dist/content/schema/helpers.js +60 -0
  139. package/dist/content/schema/helpers.js.map +1 -0
  140. package/dist/content/schema/nodes.d.ts +26 -0
  141. package/dist/content/schema/nodes.d.ts.map +1 -0
  142. package/dist/content/schema/nodes.js +8 -0
  143. package/dist/content/schema/nodes.js.map +1 -0
  144. package/dist/content/schema/serialize.d.ts +3 -0
  145. package/dist/content/schema/serialize.d.ts.map +1 -0
  146. package/dist/content/schema/serialize.js +31 -0
  147. package/dist/content/schema/serialize.js.map +1 -0
  148. package/dist/content/walk/walkFields.d.ts +17 -0
  149. package/dist/content/walk/walkFields.d.ts.map +1 -0
  150. package/dist/content/walk/walkFields.js +88 -0
  151. package/dist/content/walk/walkFields.js.map +1 -0
  152. package/dist/engine/assessorAdapter.d.ts.map +1 -1
  153. package/dist/engine/assessorAdapter.js.map +1 -1
  154. package/dist/engine/extractCheckData.d.ts.map +1 -1
  155. package/dist/engine/extractCheckData.js +19 -5
  156. package/dist/engine/extractCheckData.js.map +1 -1
  157. package/dist/engine/helpers/title-progress.d.ts +1 -1
  158. package/dist/engine/helpers/title-progress.js.map +1 -1
  159. package/dist/engine/inclusiveScore.d.ts.map +1 -1
  160. package/dist/engine/inclusiveScore.js.map +1 -1
  161. package/dist/engine/recommendations.d.ts.map +1 -1
  162. package/dist/engine/recommendations.js.map +1 -1
  163. package/dist/engine/runAnalysis/services/derive-inclusive.js.map +1 -1
  164. package/dist/engine/runAnalysis/services/derive-readability.d.ts.map +1 -1
  165. package/dist/engine/runAnalysis/services/derive-readability.js +5 -1
  166. package/dist/engine/runAnalysis/services/derive-readability.js.map +1 -1
  167. package/dist/engine/runAnalysis/services/derive-vitals/heading-tree.d.ts.map +1 -1
  168. package/dist/engine/runAnalysis/services/derive-vitals/heading-tree.js.map +1 -1
  169. package/dist/engine/runAnalysis/services/derive-vitals/index.d.ts.map +1 -1
  170. package/dist/engine/runAnalysis/services/derive-vitals/index.js +9 -1
  171. package/dist/engine/runAnalysis/services/derive-vitals/index.js.map +1 -1
  172. package/dist/engine/runAnalysis/services/derive-vitals/researches.d.ts +1 -1
  173. package/dist/engine/runAnalysis/services/derive-vitals/researches.d.ts.map +1 -1
  174. package/dist/engine/runAnalysis/services/derive-vitals/researches.js +8 -2
  175. package/dist/engine/runAnalysis/services/derive-vitals/researches.js.map +1 -1
  176. package/dist/engine/runAnalysis/utils/enrich.d.ts.map +1 -1
  177. package/dist/engine/runAnalysis/utils/enrich.js.map +1 -1
  178. package/dist/engine/visualization/resolveVisualization/constants.d.ts.map +1 -1
  179. package/dist/engine/visualization/resolveVisualization/constants.js +9 -1
  180. package/dist/engine/visualization/resolveVisualization/constants.js.map +1 -1
  181. package/dist/engine/visualization/resolveVisualization/index.d.ts.map +1 -1
  182. package/dist/engine/visualization/resolveVisualization/index.js.map +1 -1
  183. package/dist/engine/visualization/resolveVisualization/resolves/resolveDrilldown.d.ts.map +1 -1
  184. package/dist/engine/visualization/resolveVisualization/resolves/resolveDrilldown.js.map +1 -1
  185. package/dist/engine/visualization/resolveVisualization/resolves/resolveLinks.d.ts.map +1 -1
  186. package/dist/engine/visualization/resolveVisualization/resolves/resolveLinks.js.map +1 -1
  187. package/dist/engine/visualization/resolveVisualization/resolves/resolveProportionCount.d.ts.map +1 -1
  188. package/dist/engine/visualization/resolveVisualization/resolves/resolveProportionCount.js.map +1 -1
  189. package/dist/engine/visualization/resolveVisualization/resolves/resolveValueRange.d.ts.map +1 -1
  190. package/dist/engine/visualization/resolveVisualization/resolves/resolveValueRange.js.map +1 -1
  191. package/dist/engine/visualization/resolveVisualization/utils/pluralize.d.ts.map +1 -1
  192. package/dist/engine/visualization/resolveVisualization/utils/pluralize.js.map +1 -1
  193. package/dist/engine/visualization/resolveVisualization/utils/readDrilldownItems.d.ts.map +1 -1
  194. package/dist/engine/visualization/resolveVisualization/utils/readDrilldownItems.js.map +1 -1
  195. package/dist/engine/visualization/resolveVisualization/utils/readNumber.d.ts.map +1 -1
  196. package/dist/engine/visualization/resolveVisualization/utils/readNumber.js.map +1 -1
  197. package/dist/index.d.ts +1 -1
  198. package/dist/index.d.ts.map +1 -1
  199. package/dist/index.js.map +1 -1
  200. package/dist/plugin.d.ts.map +1 -1
  201. package/dist/plugin.js +7 -2
  202. package/dist/plugin.js.map +1 -1
  203. package/dist/types/config.d.ts +30 -7
  204. package/dist/types/config.d.ts.map +1 -1
  205. package/dist/ui/CheckRow/CheckVisualization/visualizations/DensityGauge.d.ts.map +1 -1
  206. package/dist/ui/CheckRow/CheckVisualization/visualizations/DensityGauge.js +24 -5
  207. package/dist/ui/CheckRow/CheckVisualization/visualizations/DensityGauge.js.map +1 -1
  208. package/dist/ui/CheckRow/CheckVisualization/visualizations/DistributionBar.d.ts.map +1 -1
  209. package/dist/ui/CheckRow/CheckVisualization/visualizations/DistributionBar.js +8 -1
  210. package/dist/ui/CheckRow/CheckVisualization/visualizations/DistributionBar.js.map +1 -1
  211. package/dist/ui/CheckRow/CheckVisualization/visualizations/DrillDown.d.ts.map +1 -1
  212. package/dist/ui/CheckRow/CheckVisualization/visualizations/DrillDown.js +11 -4
  213. package/dist/ui/CheckRow/CheckVisualization/visualizations/DrillDown.js.map +1 -1
  214. package/dist/ui/CheckRow/CheckVisualization/visualizations/SegmentBar.d.ts.map +1 -1
  215. package/dist/ui/CheckRow/CheckVisualization/visualizations/SegmentBar.js +7 -1
  216. package/dist/ui/CheckRow/CheckVisualization/visualizations/SegmentBar.js.map +1 -1
  217. package/dist/ui/CheckRow/index.d.ts.map +1 -1
  218. package/dist/ui/CheckRow/index.js +23 -9
  219. package/dist/ui/CheckRow/index.js.map +1 -1
  220. package/dist/ui/FilterPills.d.ts.map +1 -1
  221. package/dist/ui/FilterPills.js +78 -19
  222. package/dist/ui/FilterPills.js.map +1 -1
  223. package/dist/ui/KpiCard.d.ts.map +1 -1
  224. package/dist/ui/KpiCard.js.map +1 -1
  225. package/dist/ui/Pill.d.ts.map +1 -1
  226. package/dist/ui/Pill.js +11 -8
  227. package/dist/ui/Pill.js.map +1 -1
  228. package/dist/ui/ScoreRing.d.ts.map +1 -1
  229. package/dist/ui/ScoreRing.js +12 -2
  230. package/dist/ui/ScoreRing.js.map +1 -1
  231. package/dist/ui/SectionWrapper.d.ts.map +1 -1
  232. package/dist/ui/SectionWrapper.js.map +1 -1
  233. package/dist/ui/SegmentedControl.d.ts +1 -1
  234. package/dist/ui/SegmentedControl.d.ts.map +1 -1
  235. package/dist/ui/SegmentedControl.js +49 -33
  236. package/dist/ui/SegmentedControl.js.map +1 -1
  237. package/dist/ui/Tooltip.d.ts +1 -1
  238. package/dist/ui/Tooltip.d.ts.map +1 -1
  239. package/dist/ui/Tooltip.js +8 -1
  240. package/dist/ui/Tooltip.js.map +1 -1
  241. package/dist/utils/config/overrideAdmin.d.ts.map +1 -1
  242. package/dist/utils/config/overrideAdmin.js +9 -1
  243. package/dist/utils/config/overrideAdmin.js.map +1 -1
  244. package/dist/utils/style.d.ts.map +1 -1
  245. package/dist/utils/style.js.map +1 -1
  246. package/package.json +9 -7
  247. package/dist/content/extractContent.d.ts +0 -3
  248. package/dist/content/extractContent.d.ts.map +0 -1
  249. package/dist/content/extractContent.js +0 -31
  250. package/dist/content/extractContent.js.map +0 -1
  251. package/dist/content/uploads/collect-upload-refs.d.ts +0 -5
  252. package/dist/content/uploads/collect-upload-refs.d.ts.map +0 -1
  253. package/dist/content/uploads/collect-upload-refs.js +0 -19
  254. package/dist/content/uploads/collect-upload-refs.js.map +0 -1
  255. package/dist/content/uploads/hydrate-values.d.ts +0 -5
  256. package/dist/content/uploads/hydrate-values.d.ts.map +0 -1
  257. package/dist/content/uploads/hydrate-values.js +0 -15
  258. package/dist/content/uploads/hydrate-values.js.map +0 -1
  259. package/dist/content/uploads/media-resolver.d.ts +0 -7
  260. package/dist/content/uploads/media-resolver.d.ts.map +0 -1
  261. package/dist/content/uploads/media-resolver.js.map +0 -1
  262. package/dist/content/uploads/transform-lexical-uploads.d.ts +0 -5
  263. package/dist/content/uploads/transform-lexical-uploads.d.ts.map +0 -1
  264. package/dist/content/uploads/transform-lexical-uploads.js +0 -34
  265. package/dist/content/uploads/transform-lexical-uploads.js.map +0 -1
  266. package/dist/content/uploads/transform-upload-values.d.ts +0 -10
  267. package/dist/content/uploads/transform-upload-values.d.ts.map +0 -1
  268. package/dist/content/uploads/transform-upload-values.js +0 -108
  269. package/dist/content/uploads/transform-upload-values.js.map +0 -1
  270. package/dist/content/uploads/types.d.ts +0 -8
  271. package/dist/content/uploads/types.d.ts.map +0 -1
  272. package/dist/content/uploads/types.js +0 -7
  273. package/dist/content/uploads/types.js.map +0 -1
  274. package/dist/content/walkValue.d.ts +0 -14
  275. package/dist/content/walkValue.d.ts.map +0 -1
  276. package/dist/content/walkValue.js +0 -62
  277. package/dist/content/walkValue.js.map +0 -1
@@ -1,12 +1,24 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { cn } from "../../../../../utils/style";
3
3
  import { Chevron } from "./Chevron";
4
- function HeadingTreeRow({ node, depth, hasKids, isOpen, globalFirst, onToggle, rowRef, badgeRef }) {
4
+ function HeadingTreeRow({
5
+ node,
6
+ depth,
7
+ hasKids,
8
+ isOpen,
9
+ globalFirst,
10
+ onToggle,
11
+ rowRef,
12
+ badgeRef
13
+ }) {
5
14
  return /* @__PURE__ */ jsxs(
6
15
  "div",
7
16
  {
8
17
  ref: rowRef,
9
- className: cn("relative flex items-center gap-[9px] h-[34px] box-border", hasKids && "cursor-pointer focus-visible:outline-2 focus-visible:outline-neutral-400 focus-visible:-outline-offset-2"),
18
+ className: cn(
19
+ "relative flex items-center gap-[9px] h-[34px] box-border",
20
+ hasKids && "cursor-pointer focus-visible:outline-2 focus-visible:outline-neutral-400 focus-visible:-outline-offset-2"
21
+ ),
10
22
  style: { paddingLeft: depth * 20 },
11
23
  role: hasKids ? "button" : void 0,
12
24
  tabIndex: hasKids ? 0 : void 0,
@@ -20,14 +32,37 @@ function HeadingTreeRow({ node, depth, hasKids, isOpen, globalFirst, onToggle, r
20
32
  } : void 0,
21
33
  title: hasKids ? isOpen ? "Collapse" : "Expand" : void 0,
22
34
  children: [
23
- /* @__PURE__ */ jsxs("span", { ref: badgeRef, className: "flex-none font-mono text-[9px] font-bold leading-[100%] text-neutral-1000 bg-neutral-150 rounded-rs px-[6px] py-[3px] min-w-[22px] text-center", children: [
24
- "H",
25
- node.level
26
- ] }),
27
- /* @__PURE__ */ jsxs("div", { className: cn("flex-1 min-w-0 flex items-center gap-[9px] h-full", !globalFirst && "border-t border-neutral-150"), children: [
28
- node.text ? /* @__PURE__ */ jsx("span", { className: "flex-1 min-w-0 truncate text-[12px] font-medium text-neutral-800", title: node.text, children: node.text }) : /* @__PURE__ */ jsx("span", { className: "flex-1 min-w-0 truncate text-[12px] font-medium italic text-neutral-400", children: "(empty heading)" }),
29
- hasKids ? /* @__PURE__ */ jsx(Chevron, { open: isOpen }) : null
30
- ] })
35
+ /* @__PURE__ */ jsxs(
36
+ "span",
37
+ {
38
+ ref: badgeRef,
39
+ className: "flex-none font-mono text-[9px] font-bold leading-[100%] text-neutral-1000 bg-neutral-150 rounded-rs px-[6px] py-[3px] min-w-[22px] text-center",
40
+ children: [
41
+ "H",
42
+ node.level
43
+ ]
44
+ }
45
+ ),
46
+ /* @__PURE__ */ jsxs(
47
+ "div",
48
+ {
49
+ className: cn(
50
+ "flex-1 min-w-0 flex items-center gap-[9px] h-full",
51
+ !globalFirst && "border-t border-neutral-150"
52
+ ),
53
+ children: [
54
+ node.text ? /* @__PURE__ */ jsx(
55
+ "span",
56
+ {
57
+ className: "flex-1 min-w-0 truncate text-[12px] font-medium text-neutral-800",
58
+ title: node.text,
59
+ children: node.text
60
+ }
61
+ ) : /* @__PURE__ */ jsx("span", { className: "flex-1 min-w-0 truncate text-[12px] font-medium italic text-neutral-400", children: "(empty heading)" }),
62
+ hasKids ? /* @__PURE__ */ jsx(Chevron, { open: isOpen }) : null
63
+ ]
64
+ }
65
+ )
31
66
  ]
32
67
  }
33
68
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeRow.tsx"],"sourcesContent":["import type { Ref } from \"react\";\nimport type { HeadingNode } from \"../../../../../engine/types/analysis\";\nimport { cn } from \"../../../../../utils/style\";\nimport { Chevron } from \"./Chevron\";\n\ninterface HeadingTreeRowProps {\n node: HeadingNode;\n depth: number;\n hasKids: boolean;\n isOpen: boolean;\n globalFirst: boolean;\n onToggle: (id: string) => void;\n rowRef?: Ref<HTMLDivElement>;\n badgeRef?: Ref<HTMLSpanElement>;\n}\n\nexport function HeadingTreeRow({ node, depth, hasKids, isOpen, globalFirst, onToggle, rowRef, badgeRef }: HeadingTreeRowProps) {\n return (\n <div\n ref={rowRef}\n className={cn(\"relative flex items-center gap-[9px] h-[34px] box-border\", hasKids && \"cursor-pointer focus-visible:outline-2 focus-visible:outline-neutral-400 focus-visible:-outline-offset-2\")}\n style={{ paddingLeft: depth * 20 }}\n role={hasKids ? \"button\" : undefined}\n tabIndex={hasKids ? 0 : undefined}\n aria-expanded={hasKids ? isOpen : undefined}\n onClick={hasKids ? () => onToggle(node.id) : undefined}\n onKeyDown={\n hasKids\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onToggle(node.id);\n }\n }\n : undefined\n }\n title={hasKids ? (isOpen ? \"Collapse\" : \"Expand\") : undefined}\n >\n <span ref={badgeRef} className=\"flex-none font-mono text-[9px] font-bold leading-[100%] text-neutral-1000 bg-neutral-150 rounded-rs px-[6px] py-[3px] min-w-[22px] text-center\">\n H{node.level}\n </span>\n\n <div className={cn(\"flex-1 min-w-0 flex items-center gap-[9px] h-full\", !globalFirst && \"border-t border-neutral-150\")}>\n {node.text ? (\n <span className=\"flex-1 min-w-0 truncate text-[12px] font-medium text-neutral-800\" title={node.text}>\n {node.text}\n </span>\n ) : (\n <span className=\"flex-1 min-w-0 truncate text-[12px] font-medium italic text-neutral-400\">(empty heading)</span>\n )}\n\n {hasKids ? <Chevron open={isOpen} /> : null}\n </div>\n </div>\n );\n}\n"],"mappings":"AAsCM,SAMI,KANJ;AApCN,SAAS,UAAU;AACnB,SAAS,eAAe;AAajB,SAAS,eAAe,EAAE,MAAM,OAAO,SAAS,QAAQ,aAAa,UAAU,QAAQ,SAAS,GAAwB;AAC7H,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW,GAAG,4DAA4D,WAAW,0GAA0G;AAAA,MAC/L,OAAO,EAAE,aAAa,QAAQ,GAAG;AAAA,MACjC,MAAM,UAAU,WAAW;AAAA,MAC3B,UAAU,UAAU,IAAI;AAAA,MACxB,iBAAe,UAAU,SAAS;AAAA,MAClC,SAAS,UAAU,MAAM,SAAS,KAAK,EAAE,IAAI;AAAA,MAC7C,WACE,UACI,CAAC,MAAM;AACL,YAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,YAAE,eAAe;AACjB,mBAAS,KAAK,EAAE;AAAA,QAClB;AAAA,MACF,IACA;AAAA,MAEN,OAAO,UAAW,SAAS,aAAa,WAAY;AAAA,MAEpD;AAAA,6BAAC,UAAK,KAAK,UAAU,WAAU,kJAAiJ;AAAA;AAAA,UAC5K,KAAK;AAAA,WACT;AAAA,QAEA,qBAAC,SAAI,WAAW,GAAG,qDAAqD,CAAC,eAAe,6BAA6B,GAClH;AAAA,eAAK,OACJ,oBAAC,UAAK,WAAU,oEAAmE,OAAO,KAAK,MAC5F,eAAK,MACR,IAEA,oBAAC,UAAK,WAAU,2EAA0E,6BAAe;AAAA,UAG1G,UAAU,oBAAC,WAAQ,MAAM,QAAQ,IAAK;AAAA,WACzC;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeRow.tsx"],"sourcesContent":["import type { Ref } from \"react\";\nimport type { HeadingNode } from \"../../../../../engine/types/analysis\";\nimport { cn } from \"../../../../../utils/style\";\nimport { Chevron } from \"./Chevron\";\n\ninterface HeadingTreeRowProps {\n node: HeadingNode;\n depth: number;\n hasKids: boolean;\n isOpen: boolean;\n globalFirst: boolean;\n onToggle: (id: string) => void;\n rowRef?: Ref<HTMLDivElement>;\n badgeRef?: Ref<HTMLSpanElement>;\n}\n\nexport function HeadingTreeRow({\n node,\n depth,\n hasKids,\n isOpen,\n globalFirst,\n onToggle,\n rowRef,\n badgeRef,\n}: HeadingTreeRowProps) {\n return (\n <div\n ref={rowRef}\n className={cn(\n \"relative flex items-center gap-[9px] h-[34px] box-border\",\n hasKids &&\n \"cursor-pointer focus-visible:outline-2 focus-visible:outline-neutral-400 focus-visible:-outline-offset-2\"\n )}\n style={{ paddingLeft: depth * 20 }}\n role={hasKids ? \"button\" : undefined}\n tabIndex={hasKids ? 0 : undefined}\n aria-expanded={hasKids ? isOpen : undefined}\n onClick={hasKids ? () => onToggle(node.id) : undefined}\n onKeyDown={\n hasKids\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onToggle(node.id);\n }\n }\n : undefined\n }\n title={hasKids ? (isOpen ? \"Collapse\" : \"Expand\") : undefined}\n >\n <span\n ref={badgeRef}\n className=\"flex-none font-mono text-[9px] font-bold leading-[100%] text-neutral-1000 bg-neutral-150 rounded-rs px-[6px] py-[3px] min-w-[22px] text-center\"\n >\n H{node.level}\n </span>\n\n <div\n className={cn(\n \"flex-1 min-w-0 flex items-center gap-[9px] h-full\",\n !globalFirst && \"border-t border-neutral-150\"\n )}\n >\n {node.text ? (\n <span\n className=\"flex-1 min-w-0 truncate text-[12px] font-medium text-neutral-800\"\n title={node.text}\n >\n {node.text}\n </span>\n ) : (\n <span className=\"flex-1 min-w-0 truncate text-[12px] font-medium italic text-neutral-400\">\n (empty heading)\n </span>\n )}\n\n {hasKids ? <Chevron open={isOpen} /> : null}\n </div>\n </div>\n );\n}\n"],"mappings":"AAmDM,SAcI,KAdJ;AAjDN,SAAS,UAAU;AACnB,SAAS,eAAe;AAajB,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAwB;AACtB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW;AAAA,QACT;AAAA,QACA,WACE;AAAA,MACJ;AAAA,MACA,OAAO,EAAE,aAAa,QAAQ,GAAG;AAAA,MACjC,MAAM,UAAU,WAAW;AAAA,MAC3B,UAAU,UAAU,IAAI;AAAA,MACxB,iBAAe,UAAU,SAAS;AAAA,MAClC,SAAS,UAAU,MAAM,SAAS,KAAK,EAAE,IAAI;AAAA,MAC7C,WACE,UACI,CAAC,MAAM;AACL,YAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,YAAE,eAAe;AACjB,mBAAS,KAAK,EAAE;AAAA,QAClB;AAAA,MACF,IACA;AAAA,MAEN,OAAO,UAAW,SAAS,aAAa,WAAY;AAAA,MAEpD;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,WAAU;AAAA,YACX;AAAA;AAAA,cACG,KAAK;AAAA;AAAA;AAAA,QACT;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,CAAC,eAAe;AAAA,YAClB;AAAA,YAEC;AAAA,mBAAK,OACJ;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,OAAO,KAAK;AAAA,kBAEX,eAAK;AAAA;AAAA,cACR,IAEA,oBAAC,UAAK,WAAU,2EAA0E,6BAE1F;AAAA,cAGD,UAAU,oBAAC,WAAQ,MAAM,QAAQ,IAAK;AAAA;AAAA;AAAA,QACzC;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/index.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAKxE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,WAAW,EAAE,CAAC;CACrB;AAID,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE,gBAAgB,2CAwCrD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/index.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAKxE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,WAAW,EAAE,CAAC;CACrB;AAID,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE,gBAAgB,2CA0CrD"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/index.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport type { HeadingNode } from \"../../../../../engine/types/analysis\";\nimport { cn } from \"../../../../../utils/style\";\nimport { collectParentIds } from \"./headingTreeView\";\nimport { HeadingTreeGroup } from \"./HeadingTreeGroup\";\n\nexport interface HeadingTreeProps {\n tree: HeadingNode[];\n}\n\nconst SUB_LABEL = \"text-[9.5px] font-semibold uppercase tracking-[0.05em] text-neutral-500\";\n\nexport function HeadingTree({ tree }: HeadingTreeProps) {\n const parentIds = useMemo(() => collectParentIds(tree), [tree]);\n const [collapsed, setCollapsed] = useState<Set<string>>(() => new Set());\n\n const empty = tree.length === 0;\n const allCollapsed = parentIds.length > 0 && parentIds.every((id) => collapsed.has(id));\n\n const toggleAll = () => setCollapsed(allCollapsed ? new Set() : new Set(parentIds));\n const toggle = (id: string) =>\n setCollapsed((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n\n return (\n <div className=\"px-[15px] pt-[11px] border-t border-neutral-150\">\n <div className={cn(SUB_LABEL, \"flex items-center justify-between\")}>\n <span>Structure</span>\n\n {!empty && (\n <button\n type=\"button\"\n onClick={toggleAll}\n className=\"text-[11px] font-medium normal-case tracking-normal text-neutral-600 hover:text-neutral-1000 hover:underline underline-offset-2 bg-transparent border-0 p-0 cursor-pointer\"\n >\n {allCollapsed ? \"Expand all\" : \"Collapse all\"}\n </button>\n )}\n </div>\n {empty ? (\n <div className=\"px-[15px] pt-[20px] pb-[24px] text-center text-[12px] text-neutral-500\">No headings found in this content.</div>\n ) : (\n <div className=\"relative pt-[5px] pb-[7px]\">\n <HeadingTreeGroup nodes={tree} depth={0} collapsed={collapsed} onToggle={toggle} />\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";AAgCM,SACE,KADF;AA9BN,SAAS,SAAS,gBAAgB;AAElC,SAAS,UAAU;AACnB,SAAS,wBAAwB;AACjC,SAAS,wBAAwB;AAMjC,MAAM,YAAY;AAEX,SAAS,YAAY,EAAE,KAAK,GAAqB;AACtD,QAAM,YAAY,QAAQ,MAAM,iBAAiB,IAAI,GAAG,CAAC,IAAI,CAAC;AAC9D,QAAM,CAAC,WAAW,YAAY,IAAI,SAAsB,MAAM,oBAAI,IAAI,CAAC;AAEvE,QAAM,QAAQ,KAAK,WAAW;AAC9B,QAAM,eAAe,UAAU,SAAS,KAAK,UAAU,MAAM,CAAC,OAAO,UAAU,IAAI,EAAE,CAAC;AAEtF,QAAM,YAAY,MAAM,aAAa,eAAe,oBAAI,IAAI,IAAI,IAAI,IAAI,SAAS,CAAC;AAClF,QAAM,SAAS,CAAC,OACd,aAAa,CAAC,SAAS;AACrB,UAAM,OAAO,IAAI,IAAI,IAAI;AACzB,QAAI,KAAK,IAAI,EAAE;AAAG,WAAK,OAAO,EAAE;AAAA;AAC3B,WAAK,IAAI,EAAE;AAChB,WAAO;AAAA,EACT,CAAC;AAEH,SACE,qBAAC,SAAI,WAAU,mDACb;AAAA,yBAAC,SAAI,WAAW,GAAG,WAAW,mCAAmC,GAC/D;AAAA,0BAAC,UAAK,uBAAS;AAAA,MAEd,CAAC,SACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS;AAAA,UACT,WAAU;AAAA,UAET,yBAAe,eAAe;AAAA;AAAA,MACjC;AAAA,OAEJ;AAAA,IACC,QACC,oBAAC,SAAI,WAAU,0EAAyE,gDAAkC,IAE1H,oBAAC,SAAI,WAAU,8BACb,8BAAC,oBAAiB,OAAO,MAAM,OAAO,GAAG,WAAsB,UAAU,QAAQ,GACnF;AAAA,KAEJ;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/index.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport type { HeadingNode } from \"../../../../../engine/types/analysis\";\nimport { cn } from \"../../../../../utils/style\";\nimport { collectParentIds } from \"./headingTreeView\";\nimport { HeadingTreeGroup } from \"./HeadingTreeGroup\";\n\nexport interface HeadingTreeProps {\n tree: HeadingNode[];\n}\n\nconst SUB_LABEL = \"text-[9.5px] font-semibold uppercase tracking-[0.05em] text-neutral-500\";\n\nexport function HeadingTree({ tree }: HeadingTreeProps) {\n const parentIds = useMemo(() => collectParentIds(tree), [tree]);\n const [collapsed, setCollapsed] = useState<Set<string>>(() => new Set());\n\n const empty = tree.length === 0;\n const allCollapsed = parentIds.length > 0 && parentIds.every((id) => collapsed.has(id));\n\n const toggleAll = () => setCollapsed(allCollapsed ? new Set() : new Set(parentIds));\n const toggle = (id: string) =>\n setCollapsed((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n\n return (\n <div className=\"px-[15px] pt-[11px] border-t border-neutral-150\">\n <div className={cn(SUB_LABEL, \"flex items-center justify-between\")}>\n <span>Structure</span>\n\n {!empty && (\n <button\n type=\"button\"\n onClick={toggleAll}\n className=\"text-[11px] font-medium normal-case tracking-normal text-neutral-600 hover:text-neutral-1000 hover:underline underline-offset-2 bg-transparent border-0 p-0 cursor-pointer\"\n >\n {allCollapsed ? \"Expand all\" : \"Collapse all\"}\n </button>\n )}\n </div>\n {empty ? (\n <div className=\"px-[15px] pt-[20px] pb-[24px] text-center text-[12px] text-neutral-500\">\n No headings found in this content.\n </div>\n ) : (\n <div className=\"relative pt-[5px] pb-[7px]\">\n <HeadingTreeGroup nodes={tree} depth={0} collapsed={collapsed} onToggle={toggle} />\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";AAgCM,SACE,KADF;AA9BN,SAAS,SAAS,gBAAgB;AAElC,SAAS,UAAU;AACnB,SAAS,wBAAwB;AACjC,SAAS,wBAAwB;AAMjC,MAAM,YAAY;AAEX,SAAS,YAAY,EAAE,KAAK,GAAqB;AACtD,QAAM,YAAY,QAAQ,MAAM,iBAAiB,IAAI,GAAG,CAAC,IAAI,CAAC;AAC9D,QAAM,CAAC,WAAW,YAAY,IAAI,SAAsB,MAAM,oBAAI,IAAI,CAAC;AAEvE,QAAM,QAAQ,KAAK,WAAW;AAC9B,QAAM,eAAe,UAAU,SAAS,KAAK,UAAU,MAAM,CAAC,OAAO,UAAU,IAAI,EAAE,CAAC;AAEtF,QAAM,YAAY,MAAM,aAAa,eAAe,oBAAI,IAAI,IAAI,IAAI,IAAI,SAAS,CAAC;AAClF,QAAM,SAAS,CAAC,OACd,aAAa,CAAC,SAAS;AACrB,UAAM,OAAO,IAAI,IAAI,IAAI;AACzB,QAAI,KAAK,IAAI,EAAE;AAAG,WAAK,OAAO,EAAE;AAAA;AAC3B,WAAK,IAAI,EAAE;AAChB,WAAO;AAAA,EACT,CAAC;AAEH,SACE,qBAAC,SAAI,WAAU,mDACb;AAAA,yBAAC,SAAI,WAAW,GAAG,WAAW,mCAAmC,GAC/D;AAAA,0BAAC,UAAK,uBAAS;AAAA,MAEd,CAAC,SACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS;AAAA,UACT,WAAU;AAAA,UAET,yBAAe,eAAe;AAAA;AAAA,MACjC;AAAA,OAEJ;AAAA,IACC,QACC,oBAAC,SAAI,WAAU,0EAAyE,gDAExF,IAEA,oBAAC,SAAI,WAAU,8BACb,8BAAC,oBAAiB,OAAO,MAAM,OAAO,GAAG,WAAsB,UAAU,QAAQ,GACnF;AAAA,KAEJ;AAEJ;","names":[]}
@@ -27,6 +27,6 @@ interface UseHeadingRailsResult {
27
27
  registerChildBadge: (childId: string) => (el: HTMLSpanElement | null) => void;
28
28
  rails: RailGeometry | null;
29
29
  }
30
- export declare function useHeadingRails({ node, isOpen, collapsed, onBadgeMount }: UseHeadingRailsParams): UseHeadingRailsResult;
30
+ export declare function useHeadingRails({ node, isOpen, collapsed, onBadgeMount, }: UseHeadingRailsParams): UseHeadingRailsResult;
31
31
  export {};
32
32
  //# sourceMappingURL=useHeadingRails.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useHeadingRails.d.ts","sourceRoot":"","sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/useHeadingRails.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAExE,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,KAAK;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,UAAU,qBAAqB;IAC7B,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC/B,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI,KAAK,IAAI,CAAC;CACrD;AAED,UAAU,qBAAqB;IAC7B,YAAY,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC/C,WAAW,EAAE,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI,KAAK,IAAI,CAAC;IAClD,kBAAkB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI,KAAK,IAAI,CAAC;IAC9E,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;CAC5B;AAED,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,qBAAqB,GAAG,qBAAqB,CA6FvH"}
1
+ {"version":3,"file":"useHeadingRails.d.ts","sourceRoot":"","sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/useHeadingRails.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAExE,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,KAAK;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,UAAU,qBAAqB;IAC7B,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC/B,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI,KAAK,IAAI,CAAC;CACrD;AAED,UAAU,qBAAqB;IAC7B,YAAY,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC/C,WAAW,EAAE,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI,KAAK,IAAI,CAAC;IAClD,kBAAkB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI,KAAK,IAAI,CAAC;IAC9E,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;CAC5B;AAED,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,MAAM,EACN,SAAS,EACT,YAAY,GACb,EAAE,qBAAqB,GAAG,qBAAqB,CA6F/C"}
@@ -1,6 +1,11 @@
1
1
  "use client";
2
2
  import { useLayoutEffect, useRef, useState } from "react";
3
- function useHeadingRails({ node, isOpen, collapsed, onBadgeMount }) {
3
+ function useHeadingRails({
4
+ node,
5
+ isOpen,
6
+ collapsed,
7
+ onBadgeMount
8
+ }) {
4
9
  const containerRef = useRef(null);
5
10
  const badgeRef = useRef(null);
6
11
  const childBadges = useRef(/* @__PURE__ */ new Map());
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/useHeadingRails.ts"],"sourcesContent":["\"use client\";\n\nimport type { RefObject } from \"react\";\nimport { useLayoutEffect, useRef, useState } from \"react\";\nimport type { HeadingNode } from \"../../../../../engine/types/analysis\";\n\ninterface VerticalRail {\n left: number;\n top: number;\n height: number;\n}\n\ninterface Elbow {\n id: string;\n left: number;\n top: number;\n width: number;\n}\n\nexport interface RailGeometry {\n vertical: VerticalRail;\n elbows: Elbow[];\n}\n\ninterface UseHeadingRailsParams {\n node: HeadingNode;\n isOpen: boolean;\n collapsed: ReadonlySet<string>;\n onBadgeMount?: (el: HTMLSpanElement | null) => void;\n}\n\ninterface UseHeadingRailsResult {\n containerRef: RefObject<HTMLDivElement | null>;\n setBadgeRef: (el: HTMLSpanElement | null) => void;\n registerChildBadge: (childId: string) => (el: HTMLSpanElement | null) => void;\n rails: RailGeometry | null;\n}\n\nexport function useHeadingRails({ node, isOpen, collapsed, onBadgeMount }: UseHeadingRailsParams): UseHeadingRailsResult {\n const containerRef = useRef<HTMLDivElement>(null);\n const badgeRef = useRef<HTMLSpanElement | null>(null);\n const childBadges = useRef(new Map<string, HTMLSpanElement>());\n const childSetters = useRef(new Map<string, (el: HTMLSpanElement | null) => void>());\n const [rails, setRails] = useState<RailGeometry | null>(null);\n\n const setBadgeRef = (el: HTMLSpanElement | null) => {\n badgeRef.current = el;\n onBadgeMount?.(el);\n };\n\n const registerChildBadge = (childId: string) => {\n let setter = childSetters.current.get(childId);\n\n if (!setter) {\n setter = (el: HTMLSpanElement | null) => {\n if (el) childBadges.current.set(childId, el);\n else childBadges.current.delete(childId);\n };\n\n childSetters.current.set(childId, setter);\n }\n\n return setter;\n };\n\n useLayoutEffect(() => {\n if (!isOpen) {\n setRails(null);\n return;\n }\n\n const container = containerRef.current;\n const parentBadge = badgeRef.current;\n if (!container || !parentBadge) return;\n\n const measure = () => {\n const containerRect = container.getBoundingClientRect();\n const parentBadgeRect = parentBadge.getBoundingClientRect();\n\n const railCenterX = parentBadgeRect.left + parentBadgeRect.width / 2 - containerRect.left;\n const railStartY = parentBadgeRect.bottom - containerRect.top;\n\n const elbows: Elbow[] = [];\n for (const child of node.children) {\n const childBadge = childBadges.current.get(child.id);\n if (!childBadge) continue;\n\n const childBadgeRect = childBadge.getBoundingClientRect();\n\n const childCenterX = childBadgeRect.left + childBadgeRect.width / 2 - containerRect.left;\n const childCenterY = childBadgeRect.top + childBadgeRect.height / 2 - containerRect.top;\n\n elbows.push({\n id: child.id,\n left: railCenterX,\n top: childCenterY,\n width: Math.max(0, childCenterX - railCenterX),\n });\n }\n\n if (elbows.length === 0) {\n setRails(null);\n return;\n }\n\n const lastChildCenterY = elbows.at(-1)?.top ?? railStartY;\n setRails({\n vertical: {\n left: railCenterX,\n top: railStartY,\n height: Math.max(0, lastChildCenterY - railStartY),\n },\n elbows,\n });\n };\n\n measure();\n\n const observer = new ResizeObserver(measure);\n\n observer.observe(container);\n\n return () => observer.disconnect();\n }, [isOpen, collapsed, node]);\n\n return {\n containerRef,\n setBadgeRef,\n registerChildBadge,\n rails,\n };\n}\n"],"mappings":";AAGA,SAAS,iBAAiB,QAAQ,gBAAgB;AAmC3C,SAAS,gBAAgB,EAAE,MAAM,QAAQ,WAAW,aAAa,GAAiD;AACvH,QAAM,eAAe,OAAuB,IAAI;AAChD,QAAM,WAAW,OAA+B,IAAI;AACpD,QAAM,cAAc,OAAO,oBAAI,IAA6B,CAAC;AAC7D,QAAM,eAAe,OAAO,oBAAI,IAAkD,CAAC;AACnF,QAAM,CAAC,OAAO,QAAQ,IAAI,SAA8B,IAAI;AAE5D,QAAM,cAAc,CAAC,OAA+B;AAClD,aAAS,UAAU;AACnB,mBAAe,EAAE;AAAA,EACnB;AAEA,QAAM,qBAAqB,CAAC,YAAoB;AAC9C,QAAI,SAAS,aAAa,QAAQ,IAAI,OAAO;AAE7C,QAAI,CAAC,QAAQ;AACX,eAAS,CAAC,OAA+B;AACvC,YAAI;AAAI,sBAAY,QAAQ,IAAI,SAAS,EAAE;AAAA;AACtC,sBAAY,QAAQ,OAAO,OAAO;AAAA,MACzC;AAEA,mBAAa,QAAQ,IAAI,SAAS,MAAM;AAAA,IAC1C;AAEA,WAAO;AAAA,EACT;AAEA,kBAAgB,MAAM;AACpB,QAAI,CAAC,QAAQ;AACX,eAAS,IAAI;AACb;AAAA,IACF;AAEA,UAAM,YAAY,aAAa;AAC/B,UAAM,cAAc,SAAS;AAC7B,QAAI,CAAC,aAAa,CAAC;AAAa;AAEhC,UAAM,UAAU,MAAM;AACpB,YAAM,gBAAgB,UAAU,sBAAsB;AACtD,YAAM,kBAAkB,YAAY,sBAAsB;AAE1D,YAAM,cAAc,gBAAgB,OAAO,gBAAgB,QAAQ,IAAI,cAAc;AACrF,YAAM,aAAa,gBAAgB,SAAS,cAAc;AAE1D,YAAM,SAAkB,CAAC;AACzB,iBAAW,SAAS,KAAK,UAAU;AACjC,cAAM,aAAa,YAAY,QAAQ,IAAI,MAAM,EAAE;AACnD,YAAI,CAAC;AAAY;AAEjB,cAAM,iBAAiB,WAAW,sBAAsB;AAExD,cAAM,eAAe,eAAe,OAAO,eAAe,QAAQ,IAAI,cAAc;AACpF,cAAM,eAAe,eAAe,MAAM,eAAe,SAAS,IAAI,cAAc;AAEpF,eAAO,KAAK;AAAA,UACV,IAAI,MAAM;AAAA,UACV,MAAM;AAAA,UACN,KAAK;AAAA,UACL,OAAO,KAAK,IAAI,GAAG,eAAe,WAAW;AAAA,QAC/C,CAAC;AAAA,MACH;AAEA,UAAI,OAAO,WAAW,GAAG;AACvB,iBAAS,IAAI;AACb;AAAA,MACF;AAEA,YAAM,mBAAmB,OAAO,GAAG,EAAE,GAAG,OAAO;AAC/C,eAAS;AAAA,QACP,UAAU;AAAA,UACR,MAAM;AAAA,UACN,KAAK;AAAA,UACL,QAAQ,KAAK,IAAI,GAAG,mBAAmB,UAAU;AAAA,QACnD;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAEA,YAAQ;AAER,UAAM,WAAW,IAAI,eAAe,OAAO;AAE3C,aAAS,QAAQ,SAAS;AAE1B,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,QAAQ,WAAW,IAAI,CAAC;AAE5B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/useHeadingRails.ts"],"sourcesContent":["\"use client\";\n\nimport type { RefObject } from \"react\";\nimport { useLayoutEffect, useRef, useState } from \"react\";\nimport type { HeadingNode } from \"../../../../../engine/types/analysis\";\n\ninterface VerticalRail {\n left: number;\n top: number;\n height: number;\n}\n\ninterface Elbow {\n id: string;\n left: number;\n top: number;\n width: number;\n}\n\nexport interface RailGeometry {\n vertical: VerticalRail;\n elbows: Elbow[];\n}\n\ninterface UseHeadingRailsParams {\n node: HeadingNode;\n isOpen: boolean;\n collapsed: ReadonlySet<string>;\n onBadgeMount?: (el: HTMLSpanElement | null) => void;\n}\n\ninterface UseHeadingRailsResult {\n containerRef: RefObject<HTMLDivElement | null>;\n setBadgeRef: (el: HTMLSpanElement | null) => void;\n registerChildBadge: (childId: string) => (el: HTMLSpanElement | null) => void;\n rails: RailGeometry | null;\n}\n\nexport function useHeadingRails({\n node,\n isOpen,\n collapsed,\n onBadgeMount,\n}: UseHeadingRailsParams): UseHeadingRailsResult {\n const containerRef = useRef<HTMLDivElement>(null);\n const badgeRef = useRef<HTMLSpanElement | null>(null);\n const childBadges = useRef(new Map<string, HTMLSpanElement>());\n const childSetters = useRef(new Map<string, (el: HTMLSpanElement | null) => void>());\n const [rails, setRails] = useState<RailGeometry | null>(null);\n\n const setBadgeRef = (el: HTMLSpanElement | null) => {\n badgeRef.current = el;\n onBadgeMount?.(el);\n };\n\n const registerChildBadge = (childId: string) => {\n let setter = childSetters.current.get(childId);\n\n if (!setter) {\n setter = (el: HTMLSpanElement | null) => {\n if (el) childBadges.current.set(childId, el);\n else childBadges.current.delete(childId);\n };\n\n childSetters.current.set(childId, setter);\n }\n\n return setter;\n };\n\n useLayoutEffect(() => {\n if (!isOpen) {\n setRails(null);\n return;\n }\n\n const container = containerRef.current;\n const parentBadge = badgeRef.current;\n if (!container || !parentBadge) return;\n\n const measure = () => {\n const containerRect = container.getBoundingClientRect();\n const parentBadgeRect = parentBadge.getBoundingClientRect();\n\n const railCenterX = parentBadgeRect.left + parentBadgeRect.width / 2 - containerRect.left;\n const railStartY = parentBadgeRect.bottom - containerRect.top;\n\n const elbows: Elbow[] = [];\n for (const child of node.children) {\n const childBadge = childBadges.current.get(child.id);\n if (!childBadge) continue;\n\n const childBadgeRect = childBadge.getBoundingClientRect();\n\n const childCenterX = childBadgeRect.left + childBadgeRect.width / 2 - containerRect.left;\n const childCenterY = childBadgeRect.top + childBadgeRect.height / 2 - containerRect.top;\n\n elbows.push({\n id: child.id,\n left: railCenterX,\n top: childCenterY,\n width: Math.max(0, childCenterX - railCenterX),\n });\n }\n\n if (elbows.length === 0) {\n setRails(null);\n return;\n }\n\n const lastChildCenterY = elbows.at(-1)?.top ?? railStartY;\n setRails({\n vertical: {\n left: railCenterX,\n top: railStartY,\n height: Math.max(0, lastChildCenterY - railStartY),\n },\n elbows,\n });\n };\n\n measure();\n\n const observer = new ResizeObserver(measure);\n\n observer.observe(container);\n\n return () => observer.disconnect();\n }, [isOpen, collapsed, node]);\n\n return {\n containerRef,\n setBadgeRef,\n registerChildBadge,\n rails,\n };\n}\n"],"mappings":";AAGA,SAAS,iBAAiB,QAAQ,gBAAgB;AAmC3C,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAiD;AAC/C,QAAM,eAAe,OAAuB,IAAI;AAChD,QAAM,WAAW,OAA+B,IAAI;AACpD,QAAM,cAAc,OAAO,oBAAI,IAA6B,CAAC;AAC7D,QAAM,eAAe,OAAO,oBAAI,IAAkD,CAAC;AACnF,QAAM,CAAC,OAAO,QAAQ,IAAI,SAA8B,IAAI;AAE5D,QAAM,cAAc,CAAC,OAA+B;AAClD,aAAS,UAAU;AACnB,mBAAe,EAAE;AAAA,EACnB;AAEA,QAAM,qBAAqB,CAAC,YAAoB;AAC9C,QAAI,SAAS,aAAa,QAAQ,IAAI,OAAO;AAE7C,QAAI,CAAC,QAAQ;AACX,eAAS,CAAC,OAA+B;AACvC,YAAI;AAAI,sBAAY,QAAQ,IAAI,SAAS,EAAE;AAAA;AACtC,sBAAY,QAAQ,OAAO,OAAO;AAAA,MACzC;AAEA,mBAAa,QAAQ,IAAI,SAAS,MAAM;AAAA,IAC1C;AAEA,WAAO;AAAA,EACT;AAEA,kBAAgB,MAAM;AACpB,QAAI,CAAC,QAAQ;AACX,eAAS,IAAI;AACb;AAAA,IACF;AAEA,UAAM,YAAY,aAAa;AAC/B,UAAM,cAAc,SAAS;AAC7B,QAAI,CAAC,aAAa,CAAC;AAAa;AAEhC,UAAM,UAAU,MAAM;AACpB,YAAM,gBAAgB,UAAU,sBAAsB;AACtD,YAAM,kBAAkB,YAAY,sBAAsB;AAE1D,YAAM,cAAc,gBAAgB,OAAO,gBAAgB,QAAQ,IAAI,cAAc;AACrF,YAAM,aAAa,gBAAgB,SAAS,cAAc;AAE1D,YAAM,SAAkB,CAAC;AACzB,iBAAW,SAAS,KAAK,UAAU;AACjC,cAAM,aAAa,YAAY,QAAQ,IAAI,MAAM,EAAE;AACnD,YAAI,CAAC;AAAY;AAEjB,cAAM,iBAAiB,WAAW,sBAAsB;AAExD,cAAM,eAAe,eAAe,OAAO,eAAe,QAAQ,IAAI,cAAc;AACpF,cAAM,eAAe,eAAe,MAAM,eAAe,SAAS,IAAI,cAAc;AAEpF,eAAO,KAAK;AAAA,UACV,IAAI,MAAM;AAAA,UACV,MAAM;AAAA,UACN,KAAK;AAAA,UACL,OAAO,KAAK,IAAI,GAAG,eAAe,WAAW;AAAA,QAC/C,CAAC;AAAA,MACH;AAEA,UAAI,OAAO,WAAW,GAAG;AACvB,iBAAS,IAAI;AACb;AAAA,MACF;AAEA,YAAM,mBAAmB,OAAO,GAAG,EAAE,GAAG,OAAO;AAC/C,eAAS;AAAA,QACP,UAAU;AAAA,UACR,MAAM;AAAA,UACN,KAAK;AAAA,UACL,QAAQ,KAAK,IAAI,GAAG,mBAAmB,UAAU;AAAA,QACnD;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAEA,YAAQ;AAER,UAAM,WAAW,IAAI,eAAe,OAAO;AAE3C,aAAS,QAAQ,SAAS;AAE1B,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,QAAQ,WAAW,IAAI,CAAC;AAE5B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/SeoDrawer/components/HeadingsSection/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAM1E,UAAU,oBAAoB;IAC5B,IAAI,EAAE,gBAAgB,CAAC;CACxB;AAED,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE,oBAAoB,2CAQ7D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/SeoDrawer/components/HeadingsSection/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAM1E,UAAU,oBAAoB;IAC5B,IAAI,EAAE,gBAAgB,CAAC;CACxB;AAED,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE,oBAAoB,2CAU7D"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/components/SeoDrawer/components/HeadingsSection/index.tsx"],"sourcesContent":["\"use client\";\n\nimport type { HeadingStructure } from \"../../../../engine/types/analysis\";\nimport { SectionCard } from \"../../../../ui/SectionCard\";\nimport { Pill } from \"../../../../ui/Pill\";\nimport { HeadingLevelTiles } from \"./HeadingLevelTiles\";\nimport { HeadingTree } from \"./HeadingTree\";\n\ninterface HeadingsSectionProps {\n data: HeadingStructure;\n}\n\nexport function HeadingsSection({ data }: HeadingsSectionProps) {\n return (\n <SectionCard title=\"Headings\" widget={<Pill variant=\"neutral\">{data.total}</Pill>}>\n <div className=\"text-[9.5px] font-semibold uppercase tracking-[0.05em] text-neutral-500 px-[15px] pt-[11px]\">Levels</div>\n <HeadingLevelTiles levels={data.levels} />\n <HeadingTree tree={data.tree} />\n </SectionCard>\n );\n}\n"],"mappings":";AAcI,SAAsC,KAAtC;AAXJ,SAAS,mBAAmB;AAC5B,SAAS,YAAY;AACrB,SAAS,yBAAyB;AAClC,SAAS,mBAAmB;AAMrB,SAAS,gBAAgB,EAAE,KAAK,GAAyB;AAC9D,SACE,qBAAC,eAAY,OAAM,YAAW,QAAQ,oBAAC,QAAK,SAAQ,WAAW,eAAK,OAAM,GACxE;AAAA,wBAAC,SAAI,WAAU,+FAA8F,oBAAM;AAAA,IACnH,oBAAC,qBAAkB,QAAQ,KAAK,QAAQ;AAAA,IACxC,oBAAC,eAAY,MAAM,KAAK,MAAM;AAAA,KAChC;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/components/SeoDrawer/components/HeadingsSection/index.tsx"],"sourcesContent":["\"use client\";\n\nimport type { HeadingStructure } from \"../../../../engine/types/analysis\";\nimport { SectionCard } from \"../../../../ui/SectionCard\";\nimport { Pill } from \"../../../../ui/Pill\";\nimport { HeadingLevelTiles } from \"./HeadingLevelTiles\";\nimport { HeadingTree } from \"./HeadingTree\";\n\ninterface HeadingsSectionProps {\n data: HeadingStructure;\n}\n\nexport function HeadingsSection({ data }: HeadingsSectionProps) {\n return (\n <SectionCard title=\"Headings\" widget={<Pill variant=\"neutral\">{data.total}</Pill>}>\n <div className=\"text-[9.5px] font-semibold uppercase tracking-[0.05em] text-neutral-500 px-[15px] pt-[11px]\">\n Levels\n </div>\n <HeadingLevelTiles levels={data.levels} />\n <HeadingTree tree={data.tree} />\n </SectionCard>\n );\n}\n"],"mappings":";AAcI,SAAsC,KAAtC;AAXJ,SAAS,mBAAmB;AAC5B,SAAS,YAAY;AACrB,SAAS,yBAAyB;AAClC,SAAS,mBAAmB;AAMrB,SAAS,gBAAgB,EAAE,KAAK,GAAyB;AAC9D,SACE,qBAAC,eAAY,OAAM,YAAW,QAAQ,oBAAC,QAAK,SAAQ,WAAW,eAAK,OAAM,GACxE;AAAA,wBAAC,SAAI,WAAU,+FAA8F,oBAE7G;AAAA,IACA,oBAAC,qBAAkB,QAAQ,KAAK,QAAQ;AAAA,IACxC,oBAAC,eAAY,MAAM,KAAK,MAAM;AAAA,KAChC;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"highlight-keyphrase.d.ts","sourceRoot":"","sources":["../../../../../src/components/SeoDrawer/components/SerpPreview/highlight-keyphrase.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMvC,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,CAM/E"}
1
+ {"version":3,"file":"highlight-keyphrase.d.ts","sourceRoot":"","sources":["../../../../../src/components/SeoDrawer/components/SerpPreview/highlight-keyphrase.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMvC,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,CAQ/E"}
@@ -6,7 +6,9 @@ function highlightKeyphrase(text, keyphrase) {
6
6
  if (!keyphrase.trim())
7
7
  return [text];
8
8
  const segments = text.split(new RegExp(`(${escapeRegex(keyphrase)})`, "gi"));
9
- return segments.map((segment, index) => index % 2 === 1 ? /* @__PURE__ */ jsx("strong", { children: segment }, index) : segment);
9
+ return segments.map(
10
+ (segment, index) => index % 2 === 1 ? /* @__PURE__ */ jsx("strong", { children: segment }, index) : segment
11
+ );
10
12
  }
11
13
  export {
12
14
  highlightKeyphrase
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/components/SeoDrawer/components/SerpPreview/highlight-keyphrase.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\n\nfunction escapeRegex(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nexport function highlightKeyphrase(text: string, keyphrase: string): ReactNode[] {\n if (!keyphrase.trim()) return [text];\n\n const segments = text.split(new RegExp(`(${escapeRegex(keyphrase)})`, \"gi\"));\n\n return segments.map((segment, index) => (index % 2 === 1 ? <strong key={index}>{segment}</strong> : segment));\n}\n"],"mappings":"AAW6D;AAT7D,SAAS,YAAY,OAAuB;AAC1C,SAAO,MAAM,QAAQ,uBAAuB,MAAM;AACpD;AAEO,SAAS,mBAAmB,MAAc,WAAgC;AAC/E,MAAI,CAAC,UAAU,KAAK;AAAG,WAAO,CAAC,IAAI;AAEnC,QAAM,WAAW,KAAK,MAAM,IAAI,OAAO,IAAI,YAAY,SAAS,CAAC,KAAK,IAAI,CAAC;AAE3E,SAAO,SAAS,IAAI,CAAC,SAAS,UAAW,QAAQ,MAAM,IAAI,oBAAC,YAAoB,qBAAR,KAAgB,IAAY,OAAQ;AAC9G;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/components/SeoDrawer/components/SerpPreview/highlight-keyphrase.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\n\nfunction escapeRegex(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nexport function highlightKeyphrase(text: string, keyphrase: string): ReactNode[] {\n if (!keyphrase.trim()) return [text];\n\n const segments = text.split(new RegExp(`(${escapeRegex(keyphrase)})`, \"gi\"));\n\n return segments.map((segment, index) =>\n index % 2 === 1 ? <strong key={index}>{segment}</strong> : segment\n );\n}\n"],"mappings":"AAYsB;AAVtB,SAAS,YAAY,OAAuB;AAC1C,SAAO,MAAM,QAAQ,uBAAuB,MAAM;AACpD;AAEO,SAAS,mBAAmB,MAAc,WAAgC;AAC/E,MAAI,CAAC,UAAU,KAAK;AAAG,WAAO,CAAC,IAAI;AAEnC,QAAM,WAAW,KAAK,MAAM,IAAI,OAAO,IAAI,YAAY,SAAS,CAAC,KAAK,IAAI,CAAC;AAE3E,SAAO,SAAS;AAAA,IAAI,CAAC,SAAS,UAC5B,QAAQ,MAAM,IAAI,oBAAC,YAAoB,qBAAR,KAAgB,IAAY;AAAA,EAC7D;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/SeoDrawer/components/SerpPreview/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAMpE,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE5C,UAAU,gBAAgB;IACxB,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,gBAAgB,GAAG,YAAY,CAmBjG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/SeoDrawer/components/SerpPreview/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAapE,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE5C,UAAU,gBAAgB;IACxB,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,gBAAgB,GAAG,YAAY,CAqBjG"}
@@ -1,7 +1,14 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { highlightKeyphrase } from "./highlight-keyphrase";
3
3
  import { SerpFavicon } from "./serp-favicon";
4
- import { serpContainer, serpDescription, serpHostname, serpSiteName, serpTitle, serpUrlRow } from "./variants";
4
+ import {
5
+ serpContainer,
6
+ serpDescription,
7
+ serpHostname,
8
+ serpSiteName,
9
+ serpTitle,
10
+ serpUrlRow
11
+ } from "./variants";
5
12
  import { truncateDescription } from "./truncate-description";
6
13
  function SerpPreview({ data, keyphrase, faviconUrl, mode }) {
7
14
  const result = /* @__PURE__ */ jsxs("div", { className: serpContainer({ mode }), children: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/components/SeoDrawer/components/SerpPreview/index.tsx"],"sourcesContent":["import type { ReactElement } from \"react\";\nimport type { SerpResult } from \"../../../../engine/types/analysis\";\nimport { highlightKeyphrase } from \"./highlight-keyphrase\";\nimport { SerpFavicon } from \"./serp-favicon\";\nimport { serpContainer, serpDescription, serpHostname, serpSiteName, serpTitle, serpUrlRow } from \"./variants\";\nimport { truncateDescription } from \"./truncate-description\";\n\nexport type SerpMode = \"mobile\" | \"desktop\";\n\ninterface SerpPreviewProps {\n data: SerpResult;\n keyphrase: string;\n faviconUrl: string;\n mode: SerpMode;\n}\n\nexport function SerpPreview({ data, keyphrase, faviconUrl, mode }: SerpPreviewProps): ReactElement {\n const result = (\n <div className={serpContainer({ mode })}>\n <div className={serpUrlRow({ mode })}>\n <SerpFavicon faviconUrl={faviconUrl} siteName={data.siteName} />\n\n <div className=\"overflow-hidden\">\n <div className={serpSiteName({ mode })}>{data.siteName}</div>\n <div className={serpHostname({ mode })}>{data.url}</div>\n </div>\n </div>\n\n <div className={serpTitle({ mode })}>{data.title}</div>\n\n <div className={serpDescription({ mode })}>{highlightKeyphrase(truncateDescription(data.description), keyphrase)}</div>\n </div>\n );\n\n return mode === \"desktop\" ? <div className=\"overflow-x-auto\">{result}</div> : result;\n}\n"],"mappings":"AAoBQ,cAEA,YAFA;AAlBR,SAAS,0BAA0B;AACnC,SAAS,mBAAmB;AAC5B,SAAS,eAAe,iBAAiB,cAAc,cAAc,WAAW,kBAAkB;AAClG,SAAS,2BAA2B;AAW7B,SAAS,YAAY,EAAE,MAAM,WAAW,YAAY,KAAK,GAAmC;AACjG,QAAM,SACJ,qBAAC,SAAI,WAAW,cAAc,EAAE,KAAK,CAAC,GACpC;AAAA,yBAAC,SAAI,WAAW,WAAW,EAAE,KAAK,CAAC,GACjC;AAAA,0BAAC,eAAY,YAAwB,UAAU,KAAK,UAAU;AAAA,MAE9D,qBAAC,SAAI,WAAU,mBACb;AAAA,4BAAC,SAAI,WAAW,aAAa,EAAE,KAAK,CAAC,GAAI,eAAK,UAAS;AAAA,QACvD,oBAAC,SAAI,WAAW,aAAa,EAAE,KAAK,CAAC,GAAI,eAAK,KAAI;AAAA,SACpD;AAAA,OACF;AAAA,IAEA,oBAAC,SAAI,WAAW,UAAU,EAAE,KAAK,CAAC,GAAI,eAAK,OAAM;AAAA,IAEjD,oBAAC,SAAI,WAAW,gBAAgB,EAAE,KAAK,CAAC,GAAI,6BAAmB,oBAAoB,KAAK,WAAW,GAAG,SAAS,GAAE;AAAA,KACnH;AAGF,SAAO,SAAS,YAAY,oBAAC,SAAI,WAAU,mBAAmB,kBAAO,IAAS;AAChF;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/components/SeoDrawer/components/SerpPreview/index.tsx"],"sourcesContent":["import type { ReactElement } from \"react\";\nimport type { SerpResult } from \"../../../../engine/types/analysis\";\nimport { highlightKeyphrase } from \"./highlight-keyphrase\";\nimport { SerpFavicon } from \"./serp-favicon\";\nimport {\n serpContainer,\n serpDescription,\n serpHostname,\n serpSiteName,\n serpTitle,\n serpUrlRow,\n} from \"./variants\";\nimport { truncateDescription } from \"./truncate-description\";\n\nexport type SerpMode = \"mobile\" | \"desktop\";\n\ninterface SerpPreviewProps {\n data: SerpResult;\n keyphrase: string;\n faviconUrl: string;\n mode: SerpMode;\n}\n\nexport function SerpPreview({ data, keyphrase, faviconUrl, mode }: SerpPreviewProps): ReactElement {\n const result = (\n <div className={serpContainer({ mode })}>\n <div className={serpUrlRow({ mode })}>\n <SerpFavicon faviconUrl={faviconUrl} siteName={data.siteName} />\n\n <div className=\"overflow-hidden\">\n <div className={serpSiteName({ mode })}>{data.siteName}</div>\n <div className={serpHostname({ mode })}>{data.url}</div>\n </div>\n </div>\n\n <div className={serpTitle({ mode })}>{data.title}</div>\n\n <div className={serpDescription({ mode })}>\n {highlightKeyphrase(truncateDescription(data.description), keyphrase)}\n </div>\n </div>\n );\n\n return mode === \"desktop\" ? <div className=\"overflow-x-auto\">{result}</div> : result;\n}\n"],"mappings":"AA2BQ,cAEA,YAFA;AAzBR,SAAS,0BAA0B;AACnC,SAAS,mBAAmB;AAC5B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,2BAA2B;AAW7B,SAAS,YAAY,EAAE,MAAM,WAAW,YAAY,KAAK,GAAmC;AACjG,QAAM,SACJ,qBAAC,SAAI,WAAW,cAAc,EAAE,KAAK,CAAC,GACpC;AAAA,yBAAC,SAAI,WAAW,WAAW,EAAE,KAAK,CAAC,GACjC;AAAA,0BAAC,eAAY,YAAwB,UAAU,KAAK,UAAU;AAAA,MAE9D,qBAAC,SAAI,WAAU,mBACb;AAAA,4BAAC,SAAI,WAAW,aAAa,EAAE,KAAK,CAAC,GAAI,eAAK,UAAS;AAAA,QACvD,oBAAC,SAAI,WAAW,aAAa,EAAE,KAAK,CAAC,GAAI,eAAK,KAAI;AAAA,SACpD;AAAA,OACF;AAAA,IAEA,oBAAC,SAAI,WAAW,UAAU,EAAE,KAAK,CAAC,GAAI,eAAK,OAAM;AAAA,IAEjD,oBAAC,SAAI,WAAW,gBAAgB,EAAE,KAAK,CAAC,GACrC,6BAAmB,oBAAoB,KAAK,WAAW,GAAG,SAAS,GACtE;AAAA,KACF;AAGF,SAAO,SAAS,YAAY,oBAAC,SAAI,WAAU,mBAAmB,kBAAO,IAAS;AAChF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"serp-favicon.d.ts","sourceRoot":"","sources":["../../../../../src/components/SeoDrawer/components/SerpPreview/serp-favicon.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,UAAU,gBAAgB;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,WAAW,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,gBAAgB,GAAG,YAAY,CAMpF"}
1
+ {"version":3,"file":"serp-favicon.d.ts","sourceRoot":"","sources":["../../../../../src/components/SeoDrawer/components/SerpPreview/serp-favicon.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,UAAU,gBAAgB;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,WAAW,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,gBAAgB,GAAG,YAAY,CAUpF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/components/SeoDrawer/components/SerpPreview/serp-favicon.tsx"],"sourcesContent":["import type { ReactElement } from \"react\";\n\ninterface SerpFaviconProps {\n faviconUrl: string;\n siteName: string;\n}\n\nexport function SerpFavicon({ faviconUrl, siteName }: SerpFaviconProps): ReactElement {\n return (\n <div className=\"grid h-[28px] w-[28px] min-w-[28px] flex-none place-items-center rounded-[50px] bg-serp-favicon-bg\">\n {faviconUrl ? <img alt=\"\" className=\"mx-[5px] h-[18px] w-[18px]\" src={faviconUrl} /> : <span className=\"text-[12px] text-neutral-600\">{siteName.charAt(0).toUpperCase()}</span>}\n </div>\n );\n}\n"],"mappings":"AAUoB;AAHb,SAAS,YAAY,EAAE,YAAY,SAAS,GAAmC;AACpF,SACE,oBAAC,SAAI,WAAU,sGACZ,uBAAa,oBAAC,SAAI,KAAI,IAAG,WAAU,8BAA6B,KAAK,YAAY,IAAK,oBAAC,UAAK,WAAU,gCAAgC,mBAAS,OAAO,CAAC,EAAE,YAAY,GAAE,GAC1K;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/components/SeoDrawer/components/SerpPreview/serp-favicon.tsx"],"sourcesContent":["import type { ReactElement } from \"react\";\n\ninterface SerpFaviconProps {\n faviconUrl: string;\n siteName: string;\n}\n\nexport function SerpFavicon({ faviconUrl, siteName }: SerpFaviconProps): ReactElement {\n return (\n <div className=\"grid h-[28px] w-[28px] min-w-[28px] flex-none place-items-center rounded-[50px] bg-serp-favicon-bg\">\n {faviconUrl ? (\n <img alt=\"\" className=\"mx-[5px] h-[18px] w-[18px]\" src={faviconUrl} />\n ) : (\n <span className=\"text-[12px] text-neutral-600\">{siteName.charAt(0).toUpperCase()}</span>\n )}\n </div>\n );\n}\n"],"mappings":"AAWQ;AAJD,SAAS,YAAY,EAAE,YAAY,SAAS,GAAmC;AACpF,SACE,oBAAC,SAAI,WAAU,sGACZ,uBACC,oBAAC,SAAI,KAAI,IAAG,WAAU,8BAA6B,KAAK,YAAY,IAEpE,oBAAC,UAAK,WAAU,gCAAgC,mBAAS,OAAO,CAAC,EAAE,YAAY,GAAE,GAErF;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"variants.d.ts","sourceRoot":"","sources":["../../../../../src/components/SeoDrawer/components/SerpPreview/variants.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa;;8EAOxB,CAAC;AAEH,eAAO,MAAM,UAAU;;8EAOrB,CAAC;AAEH,eAAO,MAAM,YAAY;;8EAOvB,CAAC;AAEH,eAAO,MAAM,YAAY;;8EAOvB,CAAC;AAEH,eAAO,MAAM,SAAS;;8EAOpB,CAAC;AAEH,eAAO,MAAM,eAAe;;8EAO1B,CAAC"}
1
+ {"version":3,"file":"variants.d.ts","sourceRoot":"","sources":["../../../../../src/components/SeoDrawer/components/SerpPreview/variants.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa;;8EAOxB,CAAC;AAEH,eAAO,MAAM,UAAU;;8EAUtB,CAAC;AAEF,eAAO,MAAM,YAAY;;8EAOvB,CAAC;AAEH,eAAO,MAAM,YAAY;;8EAOvB,CAAC;AAEH,eAAO,MAAM,SAAS;;8EAQpB,CAAC;AAEH,eAAO,MAAM,eAAe;;8EAO1B,CAAC"}
@@ -7,14 +7,17 @@ const serpContainer = cva("", {
7
7
  }
8
8
  }
9
9
  });
10
- const serpUrlRow = cva("flex items-center gap-x-[12px] mb-[12px] pt-[1px] overflow-hidden whitespace-nowrap text-ellipsis", {
11
- variants: {
12
- mode: {
13
- desktop: "",
14
- mobile: ""
10
+ const serpUrlRow = cva(
11
+ "flex items-center gap-x-[12px] mb-[12px] pt-[1px] overflow-hidden whitespace-nowrap text-ellipsis",
12
+ {
13
+ variants: {
14
+ mode: {
15
+ desktop: "",
16
+ mobile: ""
17
+ }
15
18
  }
16
19
  }
17
- });
20
+ );
18
21
  const serpSiteName = cva("text-[14px] leading-[18px] text-serp-sitename font-normal", {
19
22
  variants: {
20
23
  mode: {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/components/SeoDrawer/components/SerpPreview/variants.ts"],"sourcesContent":["import { cva } from \"class-variance-authority\";\n\nexport const serpContainer = cva(\"\", {\n variants: {\n mode: {\n desktop: \"w-[600px] font-[arial,sans-serif]\",\n mobile: \"max-w-[368px] font-[Arial,Roboto-Regular,HelveticaNeue,sans-serif]\",\n },\n },\n});\n\nexport const serpUrlRow = cva(\"flex items-center gap-x-[12px] mb-[12px] pt-[1px] overflow-hidden whitespace-nowrap text-ellipsis\", {\n variants: {\n mode: {\n desktop: \"\",\n mobile: \"\",\n },\n },\n});\n\nexport const serpSiteName = cva(\"text-[14px] leading-[18px] text-serp-sitename font-normal\", {\n variants: {\n mode: {\n desktop: \"\",\n mobile: \"max-w-[300px]\",\n },\n },\n});\n\nexport const serpHostname = cva(\"\", {\n variants: {\n mode: {\n desktop: \"text-[14px] leading-[1.3] text-serp-hostname\",\n mobile: \"text-[12px] leading-[20px] text-serp-hostname-mobile\",\n },\n },\n});\n\nexport const serpTitle = cva(\"text-[20px] font-normal\", {\n variants: {\n mode: {\n desktop: \"block leading-[1.3] text-serp-title max-w-[600px] overflow-hidden text-ellipsis whitespace-nowrap\",\n mobile: \"leading-[26px] text-serp-title-mobile line-clamp-2 max-h-[52px] overflow-hidden\",\n },\n },\n});\n\nexport const serpDescription = cva(\"text-[14px] [&_strong]:font-bold\", {\n variants: {\n mode: {\n desktop: \"leading-[1.58] text-serp-description max-w-[600px]\",\n mobile: \"leading-[1.4] text-serp-description-mobile\",\n },\n },\n});\n"],"mappings":"AAAA,SAAS,WAAW;AAEb,MAAM,gBAAgB,IAAI,IAAI;AAAA,EACnC,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AACF,CAAC;AAEM,MAAM,aAAa,IAAI,qGAAqG;AAAA,EACjI,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AACF,CAAC;AAEM,MAAM,eAAe,IAAI,6DAA6D;AAAA,EAC3F,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AACF,CAAC;AAEM,MAAM,eAAe,IAAI,IAAI;AAAA,EAClC,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AACF,CAAC;AAEM,MAAM,YAAY,IAAI,2BAA2B;AAAA,EACtD,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AACF,CAAC;AAEM,MAAM,kBAAkB,IAAI,oCAAoC;AAAA,EACrE,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AACF,CAAC;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/components/SeoDrawer/components/SerpPreview/variants.ts"],"sourcesContent":["import { cva } from \"class-variance-authority\";\n\nexport const serpContainer = cva(\"\", {\n variants: {\n mode: {\n desktop: \"w-[600px] font-[arial,sans-serif]\",\n mobile: \"max-w-[368px] font-[Arial,Roboto-Regular,HelveticaNeue,sans-serif]\",\n },\n },\n});\n\nexport const serpUrlRow = cva(\n \"flex items-center gap-x-[12px] mb-[12px] pt-[1px] overflow-hidden whitespace-nowrap text-ellipsis\",\n {\n variants: {\n mode: {\n desktop: \"\",\n mobile: \"\",\n },\n },\n }\n);\n\nexport const serpSiteName = cva(\"text-[14px] leading-[18px] text-serp-sitename font-normal\", {\n variants: {\n mode: {\n desktop: \"\",\n mobile: \"max-w-[300px]\",\n },\n },\n});\n\nexport const serpHostname = cva(\"\", {\n variants: {\n mode: {\n desktop: \"text-[14px] leading-[1.3] text-serp-hostname\",\n mobile: \"text-[12px] leading-[20px] text-serp-hostname-mobile\",\n },\n },\n});\n\nexport const serpTitle = cva(\"text-[20px] font-normal\", {\n variants: {\n mode: {\n desktop:\n \"block leading-[1.3] text-serp-title max-w-[600px] overflow-hidden text-ellipsis whitespace-nowrap\",\n mobile: \"leading-[26px] text-serp-title-mobile line-clamp-2 max-h-[52px] overflow-hidden\",\n },\n },\n});\n\nexport const serpDescription = cva(\"text-[14px] [&_strong]:font-bold\", {\n variants: {\n mode: {\n desktop: \"leading-[1.58] text-serp-description max-w-[600px]\",\n mobile: \"leading-[1.4] text-serp-description-mobile\",\n },\n },\n});\n"],"mappings":"AAAA,SAAS,WAAW;AAEb,MAAM,gBAAgB,IAAI,IAAI;AAAA,EACnC,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AACF,CAAC;AAEM,MAAM,aAAa;AAAA,EACxB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AAEO,MAAM,eAAe,IAAI,6DAA6D;AAAA,EAC3F,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AACF,CAAC;AAEM,MAAM,eAAe,IAAI,IAAI;AAAA,EAClC,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AACF,CAAC;AAEM,MAAM,YAAY,IAAI,2BAA2B;AAAA,EACtD,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,SACE;AAAA,MACF,QAAQ;AAAA,IACV;AAAA,EACF;AACF,CAAC;AAEM,MAAM,kBAAkB,IAAI,oCAAoC;AAAA,EACrE,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AACF,CAAC;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/SeoDrawer/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,6BAA6B,CAAC;AAW/E,OAAO,iBAAiB,CAAC;AAEzB,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7D;AAED,eAAO,MAAM,SAAS,sDAiCpB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/SeoDrawer/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,6BAA6B,CAAC;AAW/E,OAAO,iBAAiB,CAAC;AAEzB,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7D;AAED,eAAO,MAAM,SAAS,sDA6DpB,CAAC"}
@@ -12,24 +12,59 @@ import { InclusiveTab } from "./tabs/InclusiveTab";
12
12
  import { SerpTab } from "./tabs/SerpTab";
13
13
  import { VitalsTab } from "./tabs/VitalsTab";
14
14
  import "../../admin.css";
15
- const SeoDrawer = memo(function SeoDrawer2({ drawerSlug, keyphrase, setKeyphrase, result, analyzing, keyphrasePending, analyzeNow, site }) {
15
+ const SeoDrawer = memo(function SeoDrawer2({
16
+ drawerSlug,
17
+ keyphrase,
18
+ setKeyphrase,
19
+ result,
20
+ analyzing,
21
+ keyphrasePending,
22
+ analyzeNow,
23
+ site
24
+ }) {
16
25
  const [tab, setTab] = useState("keyphrase");
17
26
  const total = result?.overall.seoScore ?? 0;
18
27
  const totalStatus = result ? result.overall.status : "idle";
19
- return /* @__PURE__ */ jsx(Drawer, { slug: drawerSlug, className: "seo-drawer", Header: /* @__PURE__ */ jsx(Header, { drawerSlug, total, totalStatus }), children: /* @__PURE__ */ jsxs("div", { className: "seo-root relative text-neutral-800", "data-status": totalStatus, children: [
20
- /* @__PURE__ */ jsx(TabsNav, { active: tab, onChange: setTab }),
21
- /* @__PURE__ */ jsx("div", { className: "py-[18px]", children: result === null ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-[8px] text-neutral-500 text-[13px]", role: "status", "aria-live": "polite", children: [
22
- /* @__PURE__ */ jsx(Loader2, { "aria-hidden": "true", className: "w-[14px] h-[14px] animate-spin" }),
23
- "Analyzing\u2026"
24
- ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
25
- tab === "keyphrase" && /* @__PURE__ */ jsx(KeyphraseTab, { data: result.keyphrase, keyphrase, setKeyphrase, analyzing, keyphrasePending, analyzeNow }),
26
- tab === "onpage" && /* @__PURE__ */ jsx(OnPageTab, { data: result.onPage }),
27
- tab === "readability" && /* @__PURE__ */ jsx(ReadabilityTab, { data: result.readability }),
28
- tab === "inclusive" && /* @__PURE__ */ jsx(InclusiveTab, { data: result.inclusive }),
29
- tab === "vitals" && /* @__PURE__ */ jsx(VitalsTab, { data: result.vitals, onRequestKeyphrase: () => setTab("keyphrase") }),
30
- tab === "serp" && /* @__PURE__ */ jsx(SerpTab, { data: result.serp, keyphrase, faviconUrl: site.faviconUrl })
31
- ] }) })
32
- ] }) });
28
+ return /* @__PURE__ */ jsx(
29
+ Drawer,
30
+ {
31
+ slug: drawerSlug,
32
+ className: "seo-drawer",
33
+ Header: /* @__PURE__ */ jsx(Header, { drawerSlug, total, totalStatus }),
34
+ children: /* @__PURE__ */ jsxs("div", { className: "seo-root relative text-neutral-800", "data-status": totalStatus, children: [
35
+ /* @__PURE__ */ jsx(TabsNav, { active: tab, onChange: setTab }),
36
+ /* @__PURE__ */ jsx("div", { className: "py-[18px]", children: result === null ? /* @__PURE__ */ jsxs(
37
+ "div",
38
+ {
39
+ className: "flex items-center gap-[8px] text-neutral-500 text-[13px]",
40
+ role: "status",
41
+ "aria-live": "polite",
42
+ children: [
43
+ /* @__PURE__ */ jsx(Loader2, { "aria-hidden": "true", className: "w-[14px] h-[14px] animate-spin" }),
44
+ "Analyzing\u2026"
45
+ ]
46
+ }
47
+ ) : /* @__PURE__ */ jsxs(Fragment, { children: [
48
+ tab === "keyphrase" && /* @__PURE__ */ jsx(
49
+ KeyphraseTab,
50
+ {
51
+ data: result.keyphrase,
52
+ keyphrase,
53
+ setKeyphrase,
54
+ analyzing,
55
+ keyphrasePending,
56
+ analyzeNow
57
+ }
58
+ ),
59
+ tab === "onpage" && /* @__PURE__ */ jsx(OnPageTab, { data: result.onPage }),
60
+ tab === "readability" && /* @__PURE__ */ jsx(ReadabilityTab, { data: result.readability }),
61
+ tab === "inclusive" && /* @__PURE__ */ jsx(InclusiveTab, { data: result.inclusive }),
62
+ tab === "vitals" && /* @__PURE__ */ jsx(VitalsTab, { data: result.vitals, onRequestKeyphrase: () => setTab("keyphrase") }),
63
+ tab === "serp" && /* @__PURE__ */ jsx(SerpTab, { data: result.serp, keyphrase, faviconUrl: site.faviconUrl })
64
+ ] }) })
65
+ ] })
66
+ }
67
+ );
33
68
  });
34
69
  export {
35
70
  SeoDrawer
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/SeoDrawer/index.tsx"],"sourcesContent":["\"use client\";\n\nimport { Drawer } from \"@payloadcms/ui\";\nimport { Loader2 } from \"lucide-react\";\nimport { memo, useState } from \"react\";\nimport type { AnalysisResult, TotalStatus } from \"../../engine/types/analysis\";\nimport { Header } from \"./components/Header\";\nimport { TabsNav } from \"./TabsNav\";\nimport type { TabKey } from \"./TabsNav\";\nimport { KeyphraseTab } from \"./tabs/KeyphraseTab\";\nimport { OnPageTab } from \"./tabs/OnPageTab\";\nimport { ReadabilityTab } from \"./tabs/ReadabilityTab\";\nimport { InclusiveTab } from \"./tabs/InclusiveTab\";\nimport { SerpTab } from \"./tabs/SerpTab\";\nimport { VitalsTab } from \"./tabs/VitalsTab\";\n\nimport \"../../admin.css\";\n\nexport interface SeoDrawerProps {\n drawerSlug: string;\n keyphrase: string;\n setKeyphrase: (keyphrase: string) => void;\n result: AnalysisResult | null;\n analyzing: boolean;\n keyphrasePending: boolean;\n analyzeNow: () => void;\n site: { name: string; baseUrl: string; faviconUrl: string };\n}\n\nexport const SeoDrawer = memo(function SeoDrawer({ drawerSlug, keyphrase, setKeyphrase, result, analyzing, keyphrasePending, analyzeNow, site }: SeoDrawerProps) {\n const [tab, setTab] = useState<TabKey>(\"keyphrase\");\n\n const total = result?.overall.seoScore ?? 0;\n const totalStatus: TotalStatus = result ? result.overall.status : \"idle\";\n\n return (\n <Drawer slug={drawerSlug} className=\"seo-drawer\" Header={<Header drawerSlug={drawerSlug} total={total} totalStatus={totalStatus} />}>\n <div className=\"seo-root relative text-neutral-800\" data-status={totalStatus}>\n <TabsNav active={tab} onChange={setTab} />\n\n <div className=\"py-[18px]\">\n {result === null ? (\n <div className=\"flex items-center gap-[8px] text-neutral-500 text-[13px]\" role=\"status\" aria-live=\"polite\">\n <Loader2 aria-hidden=\"true\" className=\"w-[14px] h-[14px] animate-spin\" />\n Analyzing…\n </div>\n ) : (\n <>\n {tab === \"keyphrase\" && (\n <KeyphraseTab data={result.keyphrase} keyphrase={keyphrase} setKeyphrase={setKeyphrase} analyzing={analyzing} keyphrasePending={keyphrasePending} analyzeNow={analyzeNow} />\n )}\n {tab === \"onpage\" && <OnPageTab data={result.onPage} />}\n {tab === \"readability\" && <ReadabilityTab data={result.readability} />}\n {tab === \"inclusive\" && <InclusiveTab data={result.inclusive} />}\n {tab === \"vitals\" && <VitalsTab data={result.vitals} onRequestKeyphrase={() => setTab(\"keyphrase\")} />}\n {tab === \"serp\" && <SerpTab data={result.serp} keyphrase={keyphrase} faviconUrl={site.faviconUrl} />}\n </>\n )}\n </div>\n </div>\n </Drawer>\n );\n});\n"],"mappings":";AAoC6D,SAWjD,UAXiD,KAMjD,YANiD;AAlC7D,SAAS,cAAc;AACvB,SAAS,eAAe;AACxB,SAAS,MAAM,gBAAgB;AAE/B,SAAS,cAAc;AACvB,SAAS,eAAe;AAExB,SAAS,oBAAoB;AAC7B,SAAS,iBAAiB;AAC1B,SAAS,sBAAsB;AAC/B,SAAS,oBAAoB;AAC7B,SAAS,eAAe;AACxB,SAAS,iBAAiB;AAE1B,OAAO;AAaA,MAAM,YAAY,KAAK,SAASA,WAAU,EAAE,YAAY,WAAW,cAAc,QAAQ,WAAW,kBAAkB,YAAY,KAAK,GAAmB;AAC/J,QAAM,CAAC,KAAK,MAAM,IAAI,SAAiB,WAAW;AAElD,QAAM,QAAQ,QAAQ,QAAQ,YAAY;AAC1C,QAAM,cAA2B,SAAS,OAAO,QAAQ,SAAS;AAElE,SACE,oBAAC,UAAO,MAAM,YAAY,WAAU,cAAa,QAAQ,oBAAC,UAAO,YAAwB,OAAc,aAA0B,GAC/H,+BAAC,SAAI,WAAU,sCAAqC,eAAa,aAC/D;AAAA,wBAAC,WAAQ,QAAQ,KAAK,UAAU,QAAQ;AAAA,IAExC,oBAAC,SAAI,WAAU,aACZ,qBAAW,OACV,qBAAC,SAAI,WAAU,4DAA2D,MAAK,UAAS,aAAU,UAChG;AAAA,0BAAC,WAAQ,eAAY,QAAO,WAAU,kCAAiC;AAAA,MAAE;AAAA,OAE3E,IAEA,iCACG;AAAA,cAAQ,eACP,oBAAC,gBAAa,MAAM,OAAO,WAAW,WAAsB,cAA4B,WAAsB,kBAAoC,YAAwB;AAAA,MAE3K,QAAQ,YAAY,oBAAC,aAAU,MAAM,OAAO,QAAQ;AAAA,MACpD,QAAQ,iBAAiB,oBAAC,kBAAe,MAAM,OAAO,aAAa;AAAA,MACnE,QAAQ,eAAe,oBAAC,gBAAa,MAAM,OAAO,WAAW;AAAA,MAC7D,QAAQ,YAAY,oBAAC,aAAU,MAAM,OAAO,QAAQ,oBAAoB,MAAM,OAAO,WAAW,GAAG;AAAA,MACnG,QAAQ,UAAU,oBAAC,WAAQ,MAAM,OAAO,MAAM,WAAsB,YAAY,KAAK,YAAY;AAAA,OACpG,GAEJ;AAAA,KACF,GACF;AAEJ,CAAC;","names":["SeoDrawer"]}
1
+ {"version":3,"sources":["../../../src/components/SeoDrawer/index.tsx"],"sourcesContent":["\"use client\";\n\nimport { Drawer } from \"@payloadcms/ui\";\nimport { Loader2 } from \"lucide-react\";\nimport { memo, useState } from \"react\";\nimport type { AnalysisResult, TotalStatus } from \"../../engine/types/analysis\";\nimport { Header } from \"./components/Header\";\nimport { TabsNav } from \"./TabsNav\";\nimport type { TabKey } from \"./TabsNav\";\nimport { KeyphraseTab } from \"./tabs/KeyphraseTab\";\nimport { OnPageTab } from \"./tabs/OnPageTab\";\nimport { ReadabilityTab } from \"./tabs/ReadabilityTab\";\nimport { InclusiveTab } from \"./tabs/InclusiveTab\";\nimport { SerpTab } from \"./tabs/SerpTab\";\nimport { VitalsTab } from \"./tabs/VitalsTab\";\n\nimport \"../../admin.css\";\n\nexport interface SeoDrawerProps {\n drawerSlug: string;\n keyphrase: string;\n setKeyphrase: (keyphrase: string) => void;\n result: AnalysisResult | null;\n analyzing: boolean;\n keyphrasePending: boolean;\n analyzeNow: () => void;\n site: { name: string; baseUrl: string; faviconUrl: string };\n}\n\nexport const SeoDrawer = memo(function SeoDrawer({\n drawerSlug,\n keyphrase,\n setKeyphrase,\n result,\n analyzing,\n keyphrasePending,\n analyzeNow,\n site,\n}: SeoDrawerProps) {\n const [tab, setTab] = useState<TabKey>(\"keyphrase\");\n\n const total = result?.overall.seoScore ?? 0;\n const totalStatus: TotalStatus = result ? result.overall.status : \"idle\";\n\n return (\n <Drawer\n slug={drawerSlug}\n className=\"seo-drawer\"\n Header={<Header drawerSlug={drawerSlug} total={total} totalStatus={totalStatus} />}\n >\n <div className=\"seo-root relative text-neutral-800\" data-status={totalStatus}>\n <TabsNav active={tab} onChange={setTab} />\n\n <div className=\"py-[18px]\">\n {result === null ? (\n <div\n className=\"flex items-center gap-[8px] text-neutral-500 text-[13px]\"\n role=\"status\"\n aria-live=\"polite\"\n >\n <Loader2 aria-hidden=\"true\" className=\"w-[14px] h-[14px] animate-spin\" />\n Analyzing…\n </div>\n ) : (\n <>\n {tab === \"keyphrase\" && (\n <KeyphraseTab\n data={result.keyphrase}\n keyphrase={keyphrase}\n setKeyphrase={setKeyphrase}\n analyzing={analyzing}\n keyphrasePending={keyphrasePending}\n analyzeNow={analyzeNow}\n />\n )}\n {tab === \"onpage\" && <OnPageTab data={result.onPage} />}\n {tab === \"readability\" && <ReadabilityTab data={result.readability} />}\n {tab === \"inclusive\" && <InclusiveTab data={result.inclusive} />}\n {tab === \"vitals\" && (\n <VitalsTab data={result.vitals} onRequestKeyphrase={() => setTab(\"keyphrase\")} />\n )}\n {tab === \"serp\" && (\n <SerpTab data={result.serp} keyphrase={keyphrase} faviconUrl={site.faviconUrl} />\n )}\n </>\n )}\n </div>\n </div>\n </Drawer>\n );\n});\n"],"mappings":";AAgDc,SAgBF,UAhBE,KAOF,YAPE;AA9Cd,SAAS,cAAc;AACvB,SAAS,eAAe;AACxB,SAAS,MAAM,gBAAgB;AAE/B,SAAS,cAAc;AACvB,SAAS,eAAe;AAExB,SAAS,oBAAoB;AAC7B,SAAS,iBAAiB;AAC1B,SAAS,sBAAsB;AAC/B,SAAS,oBAAoB;AAC7B,SAAS,eAAe;AACxB,SAAS,iBAAiB;AAE1B,OAAO;AAaA,MAAM,YAAY,KAAK,SAASA,WAAU;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmB;AACjB,QAAM,CAAC,KAAK,MAAM,IAAI,SAAiB,WAAW;AAElD,QAAM,QAAQ,QAAQ,QAAQ,YAAY;AAC1C,QAAM,cAA2B,SAAS,OAAO,QAAQ,SAAS;AAElE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAM;AAAA,MACN,WAAU;AAAA,MACV,QAAQ,oBAAC,UAAO,YAAwB,OAAc,aAA0B;AAAA,MAEhF,+BAAC,SAAI,WAAU,sCAAqC,eAAa,aAC/D;AAAA,4BAAC,WAAQ,QAAQ,KAAK,UAAU,QAAQ;AAAA,QAExC,oBAAC,SAAI,WAAU,aACZ,qBAAW,OACV;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,aAAU;AAAA,YAEV;AAAA,kCAAC,WAAQ,eAAY,QAAO,WAAU,kCAAiC;AAAA,cAAE;AAAA;AAAA;AAAA,QAE3E,IAEA,iCACG;AAAA,kBAAQ,eACP;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,OAAO;AAAA,cACb;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA;AAAA,UACF;AAAA,UAED,QAAQ,YAAY,oBAAC,aAAU,MAAM,OAAO,QAAQ;AAAA,UACpD,QAAQ,iBAAiB,oBAAC,kBAAe,MAAM,OAAO,aAAa;AAAA,UACnE,QAAQ,eAAe,oBAAC,gBAAa,MAAM,OAAO,WAAW;AAAA,UAC7D,QAAQ,YACP,oBAAC,aAAU,MAAM,OAAO,QAAQ,oBAAoB,MAAM,OAAO,WAAW,GAAG;AAAA,UAEhF,QAAQ,UACP,oBAAC,WAAQ,MAAM,OAAO,MAAM,WAAsB,YAAY,KAAK,YAAY;AAAA,WAEnF,GAEJ;AAAA,SACF;AAAA;AAAA,EACF;AAEJ,CAAC;","names":["SeoDrawer"]}
@@ -1 +1 @@
1
- {"version":3,"file":"keyphrasePending.d.ts","sourceRoot":"","sources":["../../../src/components/SeoDrawer/keyphrasePending.ts"],"names":[],"mappings":"AAAA,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAGnG"}
1
+ {"version":3,"file":"keyphrasePending.d.ts","sourceRoot":"","sources":["../../../src/components/SeoDrawer/keyphrasePending.ts"],"names":[],"mappings":"AAAA,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,MAAM,EACrB,iBAAiB,EAAE,MAAM,GAAG,IAAI,GAC/B,OAAO,CAGT"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/SeoDrawer/keyphrasePending.ts"],"sourcesContent":["export function isKeyphrasePending(liveKeyphrase: string, analyzedKeyphrase: string | null): boolean {\n if (liveKeyphrase.trim().length === 0) return false;\n return liveKeyphrase !== analyzedKeyphrase;\n}\n"],"mappings":"AAAO,SAAS,mBAAmB,eAAuB,mBAA2C;AACnG,MAAI,cAAc,KAAK,EAAE,WAAW;AAAG,WAAO;AAC9C,SAAO,kBAAkB;AAC3B;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/SeoDrawer/keyphrasePending.ts"],"sourcesContent":["export function isKeyphrasePending(\n liveKeyphrase: string,\n analyzedKeyphrase: string | null\n): boolean {\n if (liveKeyphrase.trim().length === 0) return false;\n return liveKeyphrase !== analyzedKeyphrase;\n}\n"],"mappings":"AAAO,SAAS,mBACd,eACA,mBACS;AACT,MAAI,cAAc,KAAK,EAAE,WAAW;AAAG,WAAO;AAC9C,SAAO,kBAAkB;AAC3B;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"languagePacks.d.ts","sourceRoot":"","sources":["../../../src/components/SeoDrawer/languagePacks.ts"],"names":[],"mappings":"AAIA,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAU3F"}
1
+ {"version":3,"file":"languagePacks.d.ts","sourceRoot":"","sources":["../../../src/components/SeoDrawer/languagePacks.ts"],"names":[],"mappings":"AAIA,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAY3F"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/SeoDrawer/languagePacks.ts"],"sourcesContent":["\"use client\";\n\nconst loaded = new Set<string>([\"en\"]);\n\nexport async function ensureLanguagePack(locale: string, supported: string[]): Promise<void> {\n const lang = locale.split(\"_\")[0] ?? \"en\";\n\n if (lang === \"en\" || loaded.has(lang) || !supported.includes(lang)) return;\n\n try {\n await import(/* @vite-ignore */ `yoastseo/build/languageProcessing/languages/${lang}/Researcher`);\n\n loaded.add(lang);\n } catch {}\n}\n"],"mappings":";AAEA,MAAM,SAAS,oBAAI,IAAY,CAAC,IAAI,CAAC;AAErC,eAAsB,mBAAmB,QAAgB,WAAoC;AAC3F,QAAM,OAAO,OAAO,MAAM,GAAG,EAAE,CAAC,KAAK;AAErC,MAAI,SAAS,QAAQ,OAAO,IAAI,IAAI,KAAK,CAAC,UAAU,SAAS,IAAI;AAAG;AAEpE,MAAI;AACF,UAAM;AAAA;AAAA,MAA0B,+CAA+C,IAAI;AAAA;AAEnF,WAAO,IAAI,IAAI;AAAA,EACjB,QAAQ;AAAA,EAAC;AACX;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/SeoDrawer/languagePacks.ts"],"sourcesContent":["\"use client\";\n\nconst loaded = new Set<string>([\"en\"]);\n\nexport async function ensureLanguagePack(locale: string, supported: string[]): Promise<void> {\n const lang = locale.split(\"_\")[0] ?? \"en\";\n\n if (lang === \"en\" || loaded.has(lang) || !supported.includes(lang)) return;\n\n try {\n await import(\n /* @vite-ignore */ `yoastseo/build/languageProcessing/languages/${lang}/Researcher`\n );\n\n loaded.add(lang);\n } catch {}\n}\n"],"mappings":";AAEA,MAAM,SAAS,oBAAI,IAAY,CAAC,IAAI,CAAC;AAErC,eAAsB,mBAAmB,QAAgB,WAAoC;AAC3F,QAAM,OAAO,OAAO,MAAM,GAAG,EAAE,CAAC,KAAK;AAErC,MAAI,SAAS,QAAQ,OAAO,IAAI,IAAI,KAAK,CAAC,UAAU,SAAS,IAAI;AAAG;AAEpE,MAAI;AACF,UAAM;AAAA;AAAA,MACe,+CAA+C,IAAI;AAAA;AAGxE,WAAO,IAAI,IAAI;AAAA,EACjB,QAAQ;AAAA,EAAC;AACX;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"InclusiveTab.d.ts","sourceRoot":"","sources":["../../../../src/components/SeoDrawer/tabs/InclusiveTab.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAMrE,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,cAAc,CAAC,WAAW,CAAC,CAAA;CAAE,2CAmD3E"}
1
+ {"version":3,"file":"InclusiveTab.d.ts","sourceRoot":"","sources":["../../../../src/components/SeoDrawer/tabs/InclusiveTab.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAMrE,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,cAAc,CAAC,WAAW,CAAC,CAAA;CAAE,2CA8D3E"}
@@ -27,17 +27,38 @@ function InclusiveTab({ data }) {
27
27
  /* @__PURE__ */ jsx("span", { className: "font-bold text-[12.5px]", children: cat.name }),
28
28
  /* @__PURE__ */ jsx(Pill, { variant: "bad", children: cat.flags.length })
29
29
  ] }),
30
- cat.flags.map((f, i) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-[9px] py-[6px] text-[12px]", children: [
31
- /* @__PURE__ */ jsx("span", { className: "text-seo-bad font-medium whitespace-nowrap", children: f.term }),
32
- /* @__PURE__ */ jsx("span", { className: "text-neutral-300", children: "\u203A" }),
33
- /* @__PURE__ */ jsx("span", { className: "text-seo-good font-medium flex-1", children: f.suggestion }),
34
- /* @__PURE__ */ jsx("span", { className: "text-neutral-500 font-mono text-[10.5px] whitespace-nowrap", children: f.location })
35
- ] }, `${f.term}-${i}`))
30
+ cat.flags.map((f, i) => /* @__PURE__ */ jsxs(
31
+ "div",
32
+ {
33
+ className: "flex items-center gap-[9px] py-[6px] text-[12px]",
34
+ children: [
35
+ /* @__PURE__ */ jsx("span", { className: "text-seo-bad font-medium whitespace-nowrap", children: f.term }),
36
+ /* @__PURE__ */ jsx("span", { className: "text-neutral-300", children: "\u203A" }),
37
+ /* @__PURE__ */ jsx("span", { className: "text-seo-good font-medium flex-1", children: f.suggestion }),
38
+ /* @__PURE__ */ jsx("span", { className: "text-neutral-500 font-mono text-[10.5px] whitespace-nowrap", children: f.location })
39
+ ]
40
+ },
41
+ `${f.term}-${i}`
42
+ ))
36
43
  ] }, cat.name)) }),
37
- data.cleanCategories.length > 0 && /* @__PURE__ */ jsx(SectionCard, { title: "No issues found", widget: /* @__PURE__ */ jsx(Pill, { variant: "neutral", children: data.cleanCategories.length }), children: /* @__PURE__ */ jsx("div", { className: "flex gap-[8px] flex-wrap px-[15px] py-[13px]", children: data.cleanCategories.map((n) => /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-[6px] text-[11.5px] text-seo-good bg-seo-good-100 border border-seo-good-200 rounded-[20px] px-[11px] py-[4px] font-medium", children: [
38
- "\u2713 ",
39
- n
40
- ] }, n)) }) })
44
+ data.cleanCategories.length > 0 && /* @__PURE__ */ jsx(
45
+ SectionCard,
46
+ {
47
+ title: "No issues found",
48
+ widget: /* @__PURE__ */ jsx(Pill, { variant: "neutral", children: data.cleanCategories.length }),
49
+ children: /* @__PURE__ */ jsx("div", { className: "flex gap-[8px] flex-wrap px-[15px] py-[13px]", children: data.cleanCategories.map((n) => /* @__PURE__ */ jsxs(
50
+ "span",
51
+ {
52
+ className: "inline-flex items-center gap-[6px] text-[11.5px] text-seo-good bg-seo-good-100 border border-seo-good-200 rounded-[20px] px-[11px] py-[4px] font-medium",
53
+ children: [
54
+ "\u2713 ",
55
+ n
56
+ ]
57
+ },
58
+ n
59
+ )) })
60
+ }
61
+ )
41
62
  ] });
42
63
  }
43
64
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/SeoDrawer/tabs/InclusiveTab.tsx"],"sourcesContent":["\"use client\";\n\nimport type { AnalysisResult } from \"../../../engine/types/analysis\";\nimport { cn, ROW_SEPARATOR } from \"../../../utils/style\";\nimport { TabHeader } from \"../../../ui/TabHeader\";\nimport { SectionCard } from \"../../../ui/SectionCard\";\nimport { Pill } from \"../../../ui/Pill\";\n\nexport function InclusiveTab({ data }: { data: AnalysisResult[\"inclusive\"] }) {\n const flagged = data.categories.reduce((n, c) => n + c.flags.length, 0);\n\n return (\n <section className=\"flex flex-col gap-[13px]\">\n <TabHeader\n title=\"Inclusive language\"\n score={data.ringScore}\n status={data.status}\n statusLabel={data.status === \"good\" ? \"Good\" : \"Needs work\"}\n subtitle={\n <>\n {flagged} phrases flagged across {data.categories.length} categories\n </>\n }\n />\n\n {data.categories.length > 0 && (\n <SectionCard title=\"Marked by category\" widget={<Pill variant=\"neutral\">{flagged}</Pill>}>\n {data.categories.map((cat) => (\n <div className={cn(\"relative px-[15px] py-[12px]\", ROW_SEPARATOR)} key={cat.name}>\n <div className=\"flex items-center gap-[8px] mb-[9px]\">\n <span className=\"font-bold text-[12.5px]\">{cat.name}</span>\n <Pill variant=\"bad\">{cat.flags.length}</Pill>\n </div>\n {cat.flags.map((f, i) => (\n <div className=\"flex items-center gap-[9px] py-[6px] text-[12px]\" key={`${f.term}-${i}`}>\n <span className=\"text-seo-bad font-medium whitespace-nowrap\">{f.term}</span>\n <span className=\"text-neutral-300\">›</span>\n <span className=\"text-seo-good font-medium flex-1\">{f.suggestion}</span>\n <span className=\"text-neutral-500 font-mono text-[10.5px] whitespace-nowrap\">{f.location}</span>\n </div>\n ))}\n </div>\n ))}\n </SectionCard>\n )}\n\n {data.cleanCategories.length > 0 && (\n <SectionCard title=\"No issues found\" widget={<Pill variant=\"neutral\">{data.cleanCategories.length}</Pill>}>\n <div className=\"flex gap-[8px] flex-wrap px-[15px] py-[13px]\">\n {data.cleanCategories.map((n) => (\n <span className=\"inline-flex items-center gap-[6px] text-[11.5px] text-seo-good bg-seo-good-100 border border-seo-good-200 rounded-[20px] px-[11px] py-[4px] font-medium\" key={n}>\n ✓ {n}\n </span>\n ))}\n </div>\n </SectionCard>\n )}\n </section>\n );\n}\n"],"mappings":";AAaM,SAMI,UANJ,KAMI,YANJ;AAVN,SAAS,IAAI,qBAAqB;AAClC,SAAS,iBAAiB;AAC1B,SAAS,mBAAmB;AAC5B,SAAS,YAAY;AAEd,SAAS,aAAa,EAAE,KAAK,GAA0C;AAC5E,QAAM,UAAU,KAAK,WAAW,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEtE,SACE,qBAAC,aAAQ,WAAU,4BACjB;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,QACb,aAAa,KAAK,WAAW,SAAS,SAAS;AAAA,QAC/C,UACE,iCACG;AAAA;AAAA,UAAQ;AAAA,UAAyB,KAAK,WAAW;AAAA,UAAO;AAAA,WAC3D;AAAA;AAAA,IAEJ;AAAA,IAEC,KAAK,WAAW,SAAS,KACxB,oBAAC,eAAY,OAAM,sBAAqB,QAAQ,oBAAC,QAAK,SAAQ,WAAW,mBAAQ,GAC9E,eAAK,WAAW,IAAI,CAAC,QACpB,qBAAC,SAAI,WAAW,GAAG,gCAAgC,aAAa,GAC9D;AAAA,2BAAC,SAAI,WAAU,wCACb;AAAA,4BAAC,UAAK,WAAU,2BAA2B,cAAI,MAAK;AAAA,QACpD,oBAAC,QAAK,SAAQ,OAAO,cAAI,MAAM,QAAO;AAAA,SACxC;AAAA,MACC,IAAI,MAAM,IAAI,CAAC,GAAG,MACjB,qBAAC,SAAI,WAAU,oDACb;AAAA,4BAAC,UAAK,WAAU,8CAA8C,YAAE,MAAK;AAAA,QACrE,oBAAC,UAAK,WAAU,oBAAmB,oBAAC;AAAA,QACpC,oBAAC,UAAK,WAAU,oCAAoC,YAAE,YAAW;AAAA,QACjE,oBAAC,UAAK,WAAU,8DAA8D,YAAE,UAAS;AAAA,WAJpB,GAAG,EAAE,IAAI,IAAI,CAAC,EAKrF,CACD;AAAA,SAZqE,IAAI,IAa5E,CACD,GACH;AAAA,IAGD,KAAK,gBAAgB,SAAS,KAC7B,oBAAC,eAAY,OAAM,mBAAkB,QAAQ,oBAAC,QAAK,SAAQ,WAAW,eAAK,gBAAgB,QAAO,GAChG,8BAAC,SAAI,WAAU,gDACZ,eAAK,gBAAgB,IAAI,CAAC,MACzB,qBAAC,UAAK,WAAU,2JAAkK;AAAA;AAAA,MAC7K;AAAA,SAD0K,CAE/K,CACD,GACH,GACF;AAAA,KAEJ;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/SeoDrawer/tabs/InclusiveTab.tsx"],"sourcesContent":["\"use client\";\n\nimport type { AnalysisResult } from \"../../../engine/types/analysis\";\nimport { cn, ROW_SEPARATOR } from \"../../../utils/style\";\nimport { TabHeader } from \"../../../ui/TabHeader\";\nimport { SectionCard } from \"../../../ui/SectionCard\";\nimport { Pill } from \"../../../ui/Pill\";\n\nexport function InclusiveTab({ data }: { data: AnalysisResult[\"inclusive\"] }) {\n const flagged = data.categories.reduce((n, c) => n + c.flags.length, 0);\n\n return (\n <section className=\"flex flex-col gap-[13px]\">\n <TabHeader\n title=\"Inclusive language\"\n score={data.ringScore}\n status={data.status}\n statusLabel={data.status === \"good\" ? \"Good\" : \"Needs work\"}\n subtitle={\n <>\n {flagged} phrases flagged across {data.categories.length} categories\n </>\n }\n />\n\n {data.categories.length > 0 && (\n <SectionCard title=\"Marked by category\" widget={<Pill variant=\"neutral\">{flagged}</Pill>}>\n {data.categories.map((cat) => (\n <div className={cn(\"relative px-[15px] py-[12px]\", ROW_SEPARATOR)} key={cat.name}>\n <div className=\"flex items-center gap-[8px] mb-[9px]\">\n <span className=\"font-bold text-[12.5px]\">{cat.name}</span>\n <Pill variant=\"bad\">{cat.flags.length}</Pill>\n </div>\n {cat.flags.map((f, i) => (\n <div\n className=\"flex items-center gap-[9px] py-[6px] text-[12px]\"\n key={`${f.term}-${i}`}\n >\n <span className=\"text-seo-bad font-medium whitespace-nowrap\">{f.term}</span>\n <span className=\"text-neutral-300\">›</span>\n <span className=\"text-seo-good font-medium flex-1\">{f.suggestion}</span>\n <span className=\"text-neutral-500 font-mono text-[10.5px] whitespace-nowrap\">\n {f.location}\n </span>\n </div>\n ))}\n </div>\n ))}\n </SectionCard>\n )}\n\n {data.cleanCategories.length > 0 && (\n <SectionCard\n title=\"No issues found\"\n widget={<Pill variant=\"neutral\">{data.cleanCategories.length}</Pill>}\n >\n <div className=\"flex gap-[8px] flex-wrap px-[15px] py-[13px]\">\n {data.cleanCategories.map((n) => (\n <span\n className=\"inline-flex items-center gap-[6px] text-[11.5px] text-seo-good bg-seo-good-100 border border-seo-good-200 rounded-[20px] px-[11px] py-[4px] font-medium\"\n key={n}\n >\n ✓ {n}\n </span>\n ))}\n </div>\n </SectionCard>\n )}\n </section>\n );\n}\n"],"mappings":";AAaM,SAMI,UANJ,KAMI,YANJ;AAVN,SAAS,IAAI,qBAAqB;AAClC,SAAS,iBAAiB;AAC1B,SAAS,mBAAmB;AAC5B,SAAS,YAAY;AAEd,SAAS,aAAa,EAAE,KAAK,GAA0C;AAC5E,QAAM,UAAU,KAAK,WAAW,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEtE,SACE,qBAAC,aAAQ,WAAU,4BACjB;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,QACb,aAAa,KAAK,WAAW,SAAS,SAAS;AAAA,QAC/C,UACE,iCACG;AAAA;AAAA,UAAQ;AAAA,UAAyB,KAAK,WAAW;AAAA,UAAO;AAAA,WAC3D;AAAA;AAAA,IAEJ;AAAA,IAEC,KAAK,WAAW,SAAS,KACxB,oBAAC,eAAY,OAAM,sBAAqB,QAAQ,oBAAC,QAAK,SAAQ,WAAW,mBAAQ,GAC9E,eAAK,WAAW,IAAI,CAAC,QACpB,qBAAC,SAAI,WAAW,GAAG,gCAAgC,aAAa,GAC9D;AAAA,2BAAC,SAAI,WAAU,wCACb;AAAA,4BAAC,UAAK,WAAU,2BAA2B,cAAI,MAAK;AAAA,QACpD,oBAAC,QAAK,SAAQ,OAAO,cAAI,MAAM,QAAO;AAAA,SACxC;AAAA,MACC,IAAI,MAAM,IAAI,CAAC,GAAG,MACjB;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UAGV;AAAA,gCAAC,UAAK,WAAU,8CAA8C,YAAE,MAAK;AAAA,YACrE,oBAAC,UAAK,WAAU,oBAAmB,oBAAC;AAAA,YACpC,oBAAC,UAAK,WAAU,oCAAoC,YAAE,YAAW;AAAA,YACjE,oBAAC,UAAK,WAAU,8DACb,YAAE,UACL;AAAA;AAAA;AAAA,QAPK,GAAG,EAAE,IAAI,IAAI,CAAC;AAAA,MAQrB,CACD;AAAA,SAjBqE,IAAI,IAkB5E,CACD,GACH;AAAA,IAGD,KAAK,gBAAgB,SAAS,KAC7B;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,QAAQ,oBAAC,QAAK,SAAQ,WAAW,eAAK,gBAAgB,QAAO;AAAA,QAE7D,8BAAC,SAAI,WAAU,gDACZ,eAAK,gBAAgB,IAAI,CAAC,MACzB;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YAEX;AAAA;AAAA,cACI;AAAA;AAAA;AAAA,UAFE;AAAA,QAGP,CACD,GACH;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;","names":[]}
@@ -7,5 +7,5 @@ export interface KeyphraseTabProps {
7
7
  keyphrasePending: boolean;
8
8
  analyzeNow: () => void;
9
9
  }
10
- export declare function KeyphraseTab({ data, keyphrase, setKeyphrase, analyzing, keyphrasePending, analyzeNow }: KeyphraseTabProps): import("react/jsx-runtime").JSX.Element;
10
+ export declare function KeyphraseTab({ data, keyphrase, setKeyphrase, analyzing, keyphrasePending, analyzeNow, }: KeyphraseTabProps): import("react/jsx-runtime").JSX.Element;
11
11
  //# sourceMappingURL=KeyphraseTab.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"KeyphraseTab.d.ts","sourceRoot":"","sources":["../../../../src/components/SeoDrawer/tabs/KeyphraseTab.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAQrE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,UAAU,EAAE,EAAE,iBAAiB,2CAiEzH"}
1
+ {"version":3,"file":"KeyphraseTab.d.ts","sourceRoot":"","sources":["../../../../src/components/SeoDrawer/tabs/KeyphraseTab.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAQrE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,SAAS,EACT,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,UAAU,GACX,EAAE,iBAAiB,2CAqEnB"}
@@ -8,7 +8,14 @@ import { SectionCard } from "../../../ui/SectionCard";
8
8
  import { Pill } from "../../../ui/Pill";
9
9
  import { FilterPills } from "../../../ui/FilterPills";
10
10
  import { CheckRow } from "../../../ui/CheckRow";
11
- function KeyphraseTab({ data, keyphrase, setKeyphrase, analyzing, keyphrasePending, analyzeNow }) {
11
+ function KeyphraseTab({
12
+ data,
13
+ keyphrase,
14
+ setKeyphrase,
15
+ analyzing,
16
+ keyphrasePending,
17
+ analyzeNow
18
+ }) {
12
19
  const [filter, setFilter] = useState("all");
13
20
  const visible = data.checks.filter((c) => filter === "all" || c.status === filter);
14
21
  const passing = data.checks.filter((c) => c.status === "good").length;