@focus-reactive/payload-plugin-seo 1.3.0 → 1.5.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 (245) hide show
  1. package/README.md +242 -60
  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 +2 -2
  7. package/dist/components/SeoButton/SeoButtonInner.d.ts.map +1 -1
  8. package/dist/components/SeoButton/SeoButtonInner.js +11 -5
  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 +3 -8
  19. package/dist/components/SeoDrawer/build-analysis-input.d.ts.map +1 -1
  20. package/dist/components/SeoDrawer/build-analysis-input.js +28 -12
  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 +13 -3
  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 +3 -4
  87. package/dist/components/SeoDrawer/useLiveDocument.d.ts.map +1 -1
  88. package/dist/components/SeoDrawer/useLiveDocument.js +45 -48
  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/index.d.ts +5 -0
  97. package/dist/content/index.d.ts.map +1 -0
  98. package/dist/content/index.js +15 -0
  99. package/dist/content/index.js.map +1 -0
  100. package/dist/content/registry.d.ts +4 -0
  101. package/dist/content/registry.d.ts.map +1 -0
  102. package/dist/content/registry.js +22 -0
  103. package/dist/content/registry.js.map +1 -0
  104. package/dist/content/resolve/resolve-docs.d.ts +3 -0
  105. package/dist/content/resolve/resolve-docs.d.ts.map +1 -0
  106. package/dist/content/resolve/resolve-docs.js +48 -0
  107. package/dist/content/resolve/resolve-docs.js.map +1 -0
  108. package/dist/content/schema/helpers.d.ts +10 -0
  109. package/dist/content/schema/helpers.d.ts.map +1 -0
  110. package/dist/content/schema/helpers.js +64 -0
  111. package/dist/content/schema/helpers.js.map +1 -0
  112. package/dist/content/schema/nodes.d.ts +26 -0
  113. package/dist/content/schema/nodes.d.ts.map +1 -0
  114. package/dist/content/schema/nodes.js +8 -0
  115. package/dist/content/schema/nodes.js.map +1 -0
  116. package/dist/content/schema/serialize.d.ts +3 -0
  117. package/dist/content/schema/serialize.d.ts.map +1 -0
  118. package/dist/content/schema/serialize.js +31 -0
  119. package/dist/content/schema/serialize.js.map +1 -0
  120. package/dist/engine/assessorAdapter.d.ts.map +1 -1
  121. package/dist/engine/assessorAdapter.js.map +1 -1
  122. package/dist/engine/extractCheckData.d.ts.map +1 -1
  123. package/dist/engine/extractCheckData.js +19 -5
  124. package/dist/engine/extractCheckData.js.map +1 -1
  125. package/dist/engine/helpers/title-progress.d.ts +1 -1
  126. package/dist/engine/helpers/title-progress.js.map +1 -1
  127. package/dist/engine/inclusiveScore.d.ts.map +1 -1
  128. package/dist/engine/inclusiveScore.js.map +1 -1
  129. package/dist/engine/recommendations.d.ts.map +1 -1
  130. package/dist/engine/recommendations.js.map +1 -1
  131. package/dist/engine/runAnalysis/services/derive-inclusive.js.map +1 -1
  132. package/dist/engine/runAnalysis/services/derive-readability.d.ts.map +1 -1
  133. package/dist/engine/runAnalysis/services/derive-readability.js +5 -1
  134. package/dist/engine/runAnalysis/services/derive-readability.js.map +1 -1
  135. package/dist/engine/runAnalysis/services/derive-vitals/heading-tree.d.ts.map +1 -1
  136. package/dist/engine/runAnalysis/services/derive-vitals/heading-tree.js.map +1 -1
  137. package/dist/engine/runAnalysis/services/derive-vitals/index.d.ts.map +1 -1
  138. package/dist/engine/runAnalysis/services/derive-vitals/index.js +9 -1
  139. package/dist/engine/runAnalysis/services/derive-vitals/index.js.map +1 -1
  140. package/dist/engine/runAnalysis/services/derive-vitals/researches.d.ts +1 -1
  141. package/dist/engine/runAnalysis/services/derive-vitals/researches.d.ts.map +1 -1
  142. package/dist/engine/runAnalysis/services/derive-vitals/researches.js +8 -2
  143. package/dist/engine/runAnalysis/services/derive-vitals/researches.js.map +1 -1
  144. package/dist/engine/runAnalysis/utils/enrich.d.ts.map +1 -1
  145. package/dist/engine/runAnalysis/utils/enrich.js.map +1 -1
  146. package/dist/engine/visualization/resolveVisualization/constants.d.ts.map +1 -1
  147. package/dist/engine/visualization/resolveVisualization/constants.js +9 -1
  148. package/dist/engine/visualization/resolveVisualization/constants.js.map +1 -1
  149. package/dist/engine/visualization/resolveVisualization/index.d.ts.map +1 -1
  150. package/dist/engine/visualization/resolveVisualization/index.js.map +1 -1
  151. package/dist/engine/visualization/resolveVisualization/resolves/resolveDrilldown.d.ts.map +1 -1
  152. package/dist/engine/visualization/resolveVisualization/resolves/resolveDrilldown.js.map +1 -1
  153. package/dist/engine/visualization/resolveVisualization/resolves/resolveLinks.d.ts.map +1 -1
  154. package/dist/engine/visualization/resolveVisualization/resolves/resolveLinks.js.map +1 -1
  155. package/dist/engine/visualization/resolveVisualization/resolves/resolveProportionCount.d.ts.map +1 -1
  156. package/dist/engine/visualization/resolveVisualization/resolves/resolveProportionCount.js.map +1 -1
  157. package/dist/engine/visualization/resolveVisualization/resolves/resolveValueRange.d.ts.map +1 -1
  158. package/dist/engine/visualization/resolveVisualization/resolves/resolveValueRange.js.map +1 -1
  159. package/dist/engine/visualization/resolveVisualization/utils/pluralize.d.ts.map +1 -1
  160. package/dist/engine/visualization/resolveVisualization/utils/pluralize.js.map +1 -1
  161. package/dist/engine/visualization/resolveVisualization/utils/readDrilldownItems.d.ts.map +1 -1
  162. package/dist/engine/visualization/resolveVisualization/utils/readDrilldownItems.js.map +1 -1
  163. package/dist/engine/visualization/resolveVisualization/utils/readNumber.d.ts.map +1 -1
  164. package/dist/engine/visualization/resolveVisualization/utils/readNumber.js.map +1 -1
  165. package/dist/index.d.ts +1 -1
  166. package/dist/index.d.ts.map +1 -1
  167. package/dist/index.js.map +1 -1
  168. package/dist/plugin.d.ts.map +1 -1
  169. package/dist/plugin.js +24 -4
  170. package/dist/plugin.js.map +1 -1
  171. package/dist/types/config.d.ts +42 -9
  172. package/dist/types/config.d.ts.map +1 -1
  173. package/dist/ui/CheckRow/CheckVisualization/visualizations/DensityGauge.d.ts.map +1 -1
  174. package/dist/ui/CheckRow/CheckVisualization/visualizations/DensityGauge.js +24 -5
  175. package/dist/ui/CheckRow/CheckVisualization/visualizations/DensityGauge.js.map +1 -1
  176. package/dist/ui/CheckRow/CheckVisualization/visualizations/DistributionBar.d.ts.map +1 -1
  177. package/dist/ui/CheckRow/CheckVisualization/visualizations/DistributionBar.js +8 -1
  178. package/dist/ui/CheckRow/CheckVisualization/visualizations/DistributionBar.js.map +1 -1
  179. package/dist/ui/CheckRow/CheckVisualization/visualizations/DrillDown.d.ts.map +1 -1
  180. package/dist/ui/CheckRow/CheckVisualization/visualizations/DrillDown.js +11 -4
  181. package/dist/ui/CheckRow/CheckVisualization/visualizations/DrillDown.js.map +1 -1
  182. package/dist/ui/CheckRow/CheckVisualization/visualizations/SegmentBar.d.ts.map +1 -1
  183. package/dist/ui/CheckRow/CheckVisualization/visualizations/SegmentBar.js +7 -1
  184. package/dist/ui/CheckRow/CheckVisualization/visualizations/SegmentBar.js.map +1 -1
  185. package/dist/ui/CheckRow/index.d.ts.map +1 -1
  186. package/dist/ui/CheckRow/index.js +23 -9
  187. package/dist/ui/CheckRow/index.js.map +1 -1
  188. package/dist/ui/FilterPills.d.ts.map +1 -1
  189. package/dist/ui/FilterPills.js +78 -19
  190. package/dist/ui/FilterPills.js.map +1 -1
  191. package/dist/ui/KpiCard.d.ts.map +1 -1
  192. package/dist/ui/KpiCard.js.map +1 -1
  193. package/dist/ui/Pill.d.ts.map +1 -1
  194. package/dist/ui/Pill.js +11 -8
  195. package/dist/ui/Pill.js.map +1 -1
  196. package/dist/ui/ScoreRing.d.ts.map +1 -1
  197. package/dist/ui/ScoreRing.js +12 -2
  198. package/dist/ui/ScoreRing.js.map +1 -1
  199. package/dist/ui/SectionWrapper.d.ts.map +1 -1
  200. package/dist/ui/SectionWrapper.js.map +1 -1
  201. package/dist/ui/SegmentedControl.d.ts +1 -1
  202. package/dist/ui/SegmentedControl.d.ts.map +1 -1
  203. package/dist/ui/SegmentedControl.js +49 -33
  204. package/dist/ui/SegmentedControl.js.map +1 -1
  205. package/dist/ui/Tooltip.d.ts +1 -1
  206. package/dist/ui/Tooltip.d.ts.map +1 -1
  207. package/dist/ui/Tooltip.js +8 -1
  208. package/dist/ui/Tooltip.js.map +1 -1
  209. package/dist/utils/config/overrideAdmin.js +1 -1
  210. package/dist/utils/config/overrideAdmin.js.map +1 -1
  211. package/dist/utils/style.d.ts.map +1 -1
  212. package/dist/utils/style.js.map +1 -1
  213. package/package.json +9 -7
  214. package/dist/content/extractContent.d.ts +0 -3
  215. package/dist/content/extractContent.d.ts.map +0 -1
  216. package/dist/content/extractContent.js +0 -31
  217. package/dist/content/extractContent.js.map +0 -1
  218. package/dist/content/uploads/collect-upload-refs.d.ts +0 -5
  219. package/dist/content/uploads/collect-upload-refs.d.ts.map +0 -1
  220. package/dist/content/uploads/collect-upload-refs.js +0 -19
  221. package/dist/content/uploads/collect-upload-refs.js.map +0 -1
  222. package/dist/content/uploads/hydrate-values.d.ts +0 -5
  223. package/dist/content/uploads/hydrate-values.d.ts.map +0 -1
  224. package/dist/content/uploads/hydrate-values.js +0 -15
  225. package/dist/content/uploads/hydrate-values.js.map +0 -1
  226. package/dist/content/uploads/media-resolver.d.ts +0 -7
  227. package/dist/content/uploads/media-resolver.d.ts.map +0 -1
  228. package/dist/content/uploads/media-resolver.js +0 -60
  229. package/dist/content/uploads/media-resolver.js.map +0 -1
  230. package/dist/content/uploads/transform-lexical-uploads.d.ts +0 -5
  231. package/dist/content/uploads/transform-lexical-uploads.d.ts.map +0 -1
  232. package/dist/content/uploads/transform-lexical-uploads.js +0 -34
  233. package/dist/content/uploads/transform-lexical-uploads.js.map +0 -1
  234. package/dist/content/uploads/transform-upload-values.d.ts +0 -10
  235. package/dist/content/uploads/transform-upload-values.d.ts.map +0 -1
  236. package/dist/content/uploads/transform-upload-values.js +0 -108
  237. package/dist/content/uploads/transform-upload-values.js.map +0 -1
  238. package/dist/content/uploads/types.d.ts +0 -8
  239. package/dist/content/uploads/types.d.ts.map +0 -1
  240. package/dist/content/uploads/types.js +0 -7
  241. package/dist/content/uploads/types.js.map +0 -1
  242. package/dist/content/walkValue.d.ts +0 -14
  243. package/dist/content/walkValue.d.ts.map +0 -1
  244. package/dist/content/walkValue.js +0 -62
  245. package/dist/content/walkValue.js.map +0 -1
package/dist/ui/Pill.js CHANGED
@@ -1,16 +1,19 @@
1
1
  "use client";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  import { cva } from "class-variance-authority";
4
- const pillVariants = cva("inline-flex items-center gap-[4px] px-[14px] py-[1px] rounded-[20px] text-[11px] font-semibold", {
5
- variants: {
6
- variant: {
7
- good: "bg-seo-good-100 text-seo-good",
8
- warn: "bg-seo-warn-100 text-seo-warn",
9
- bad: "bg-seo-bad-100 text-seo-bad",
10
- neutral: "bg-neutral-100 text-neutral-500"
4
+ const pillVariants = cva(
5
+ "inline-flex items-center gap-[4px] px-[14px] py-[1px] rounded-[20px] text-[11px] font-semibold",
6
+ {
7
+ variants: {
8
+ variant: {
9
+ good: "bg-seo-good-100 text-seo-good",
10
+ warn: "bg-seo-warn-100 text-seo-warn",
11
+ bad: "bg-seo-bad-100 text-seo-bad",
12
+ neutral: "bg-neutral-100 text-neutral-500"
13
+ }
11
14
  }
12
15
  }
13
- });
16
+ );
14
17
  function Pill({ variant, children }) {
15
18
  return /* @__PURE__ */ jsx("span", { className: pillVariants({ variant }), children });
16
19
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ui/Pill.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport type { Status } from \"../engine/types/analysis\";\nimport { cva } from \"class-variance-authority\";\n\nconst pillVariants = cva(\"inline-flex items-center gap-[4px] px-[14px] py-[1px] rounded-[20px] text-[11px] font-semibold\", {\n variants: {\n variant: {\n good: \"bg-seo-good-100 text-seo-good\",\n warn: \"bg-seo-warn-100 text-seo-warn\",\n bad: \"bg-seo-bad-100 text-seo-bad\",\n neutral: \"bg-neutral-100 text-neutral-500\",\n },\n },\n});\n\ninterface PillProps {\n variant: Status | \"neutral\";\n children: ReactNode;\n}\n\nexport function Pill({ variant, children }: PillProps) {\n return <span className={pillVariants({ variant })}>{children}</span>;\n}\n"],"mappings":";AAuBS;AAnBT,SAAS,WAAW;AAEpB,MAAM,eAAe,IAAI,kGAAkG;AAAA,EACzH,UAAU;AAAA,IACR,SAAS;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,MACL,SAAS;AAAA,IACX;AAAA,EACF;AACF,CAAC;AAOM,SAAS,KAAK,EAAE,SAAS,SAAS,GAAc;AACrD,SAAO,oBAAC,UAAK,WAAW,aAAa,EAAE,QAAQ,CAAC,GAAI,UAAS;AAC/D;","names":[]}
1
+ {"version":3,"sources":["../../src/ui/Pill.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport type { Status } from \"../engine/types/analysis\";\nimport { cva } from \"class-variance-authority\";\n\nconst pillVariants = cva(\n \"inline-flex items-center gap-[4px] px-[14px] py-[1px] rounded-[20px] text-[11px] font-semibold\",\n {\n variants: {\n variant: {\n good: \"bg-seo-good-100 text-seo-good\",\n warn: \"bg-seo-warn-100 text-seo-warn\",\n bad: \"bg-seo-bad-100 text-seo-bad\",\n neutral: \"bg-neutral-100 text-neutral-500\",\n },\n },\n }\n);\n\ninterface PillProps {\n variant: Status | \"neutral\";\n children: ReactNode;\n}\n\nexport function Pill({ variant, children }: PillProps) {\n return <span className={pillVariants({ variant })}>{children}</span>;\n}\n"],"mappings":";AA0BS;AAtBT,SAAS,WAAW;AAEpB,MAAM,eAAe;AAAA,EACnB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,MAAM;AAAA,QACN,MAAM;AAAA,QACN,KAAK;AAAA,QACL,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;AAOO,SAAS,KAAK,EAAE,SAAS,SAAS,GAAc;AACrD,SAAO,oBAAC,UAAK,WAAW,aAAa,EAAE,QAAQ,CAAC,GAAI,UAAS;AAC/D;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"ScoreRing.d.ts","sourceRoot":"","sources":["../../src/ui/ScoreRing.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAIvD,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,cAAc,2CAa1D"}
1
+ {"version":3,"file":"ScoreRing.d.ts","sourceRoot":"","sources":["../../src/ui/ScoreRing.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAIvD,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,cAAc,2CAmB1D"}
@@ -6,11 +6,21 @@ function ScoreRing({ score, status }) {
6
6
  return /* @__PURE__ */ jsx(
7
7
  "div",
8
8
  {
9
- className: cn("w-[60px] h-[60px] rounded-full flex-none grid place-items-center", statusVar({ status })),
9
+ className: cn(
10
+ "w-[60px] h-[60px] rounded-full flex-none grid place-items-center",
11
+ statusVar({ status })
12
+ ),
10
13
  style: {
11
14
  background: `conic-gradient(var(--seo-c) ${score}%, var(--theme-elevation-150) 0)`
12
15
  },
13
- children: /* @__PURE__ */ jsx("div", { className: "w-[48px] h-[48px] rounded-full bg-neutral-0 grid place-items-center font-bold text-[18px]", style: { color: "var(--seo-c)" }, children: score })
16
+ children: /* @__PURE__ */ jsx(
17
+ "div",
18
+ {
19
+ className: "w-[48px] h-[48px] rounded-full bg-neutral-0 grid place-items-center font-bold text-[18px]",
20
+ style: { color: "var(--seo-c)" },
21
+ children: score
22
+ }
23
+ )
14
24
  }
15
25
  );
16
26
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ui/ScoreRing.tsx"],"sourcesContent":["\"use client\";\n\nimport type { Status } from \"../engine/types/analysis\";\nimport { cn } from \"../utils/style\";\nimport { statusVar } from \"../components/SeoDrawer/variants\";\n\ninterface ScoreRingProps {\n score: number;\n status: Status;\n}\n\nexport function ScoreRing({ score, status }: ScoreRingProps) {\n return (\n <div\n className={cn(\"w-[60px] h-[60px] rounded-full flex-none grid place-items-center\", statusVar({ status }))}\n style={{\n background: `conic-gradient(var(--seo-c) ${score}%, var(--theme-elevation-150) 0)`,\n }}\n >\n <div className=\"w-[48px] h-[48px] rounded-full bg-neutral-0 grid place-items-center font-bold text-[18px]\" style={{ color: \"var(--seo-c)\" }}>\n {score}\n </div>\n </div>\n );\n}\n"],"mappings":";AAmBM;AAhBN,SAAS,UAAU;AACnB,SAAS,iBAAiB;AAOnB,SAAS,UAAU,EAAE,OAAO,OAAO,GAAmB;AAC3D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,oEAAoE,UAAU,EAAE,OAAO,CAAC,CAAC;AAAA,MACvG,OAAO;AAAA,QACL,YAAY,+BAA+B,KAAK;AAAA,MAClD;AAAA,MAEA,8BAAC,SAAI,WAAU,6FAA4F,OAAO,EAAE,OAAO,eAAe,GACvI,iBACH;AAAA;AAAA,EACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/ui/ScoreRing.tsx"],"sourcesContent":["\"use client\";\n\nimport type { Status } from \"../engine/types/analysis\";\nimport { cn } from \"../utils/style\";\nimport { statusVar } from \"../components/SeoDrawer/variants\";\n\ninterface ScoreRingProps {\n score: number;\n status: Status;\n}\n\nexport function ScoreRing({ score, status }: ScoreRingProps) {\n return (\n <div\n className={cn(\n \"w-[60px] h-[60px] rounded-full flex-none grid place-items-center\",\n statusVar({ status })\n )}\n style={{\n background: `conic-gradient(var(--seo-c) ${score}%, var(--theme-elevation-150) 0)`,\n }}\n >\n <div\n className=\"w-[48px] h-[48px] rounded-full bg-neutral-0 grid place-items-center font-bold text-[18px]\"\n style={{ color: \"var(--seo-c)\" }}\n >\n {score}\n </div>\n </div>\n );\n}\n"],"mappings":";AAsBM;AAnBN,SAAS,UAAU;AACnB,SAAS,iBAAiB;AAOnB,SAAS,UAAU,EAAE,OAAO,OAAO,GAAmB;AAC3D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,UAAU,EAAE,OAAO,CAAC;AAAA,MACtB;AAAA,MACA,OAAO;AAAA,QACL,YAAY,+BAA+B,KAAK;AAAA,MAClD;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,OAAO,eAAe;AAAA,UAE9B;AAAA;AAAA,MACH;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"SectionWrapper.d.ts","sourceRoot":"","sources":["../../src/ui/SectionWrapper.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,UAAU,mBAAmB;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,cAAc,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,mBAAmB,2CAE1E"}
1
+ {"version":3,"file":"SectionWrapper.d.ts","sourceRoot":"","sources":["../../src/ui/SectionWrapper.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,UAAU,mBAAmB;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,cAAc,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,mBAAmB,2CAM1E"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ui/SectionWrapper.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../utils/style\";\n\ninterface SectionWrapperProps {\n className?: string;\n children: ReactNode;\n}\n\nexport function SectionWrapper({ className, children }: SectionWrapperProps) {\n return <div className={cn(\"bg-neutral-0 border border-neutral-200 rounded-rm\", className)}>{children}</div>;\n}\n"],"mappings":";AAWS;AART,SAAS,UAAU;AAOZ,SAAS,eAAe,EAAE,WAAW,SAAS,GAAwB;AAC3E,SAAO,oBAAC,SAAI,WAAW,GAAG,qDAAqD,SAAS,GAAI,UAAS;AACvG;","names":[]}
1
+ {"version":3,"sources":["../../src/ui/SectionWrapper.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../utils/style\";\n\ninterface SectionWrapperProps {\n className?: string;\n children: ReactNode;\n}\n\nexport function SectionWrapper({ className, children }: SectionWrapperProps) {\n return (\n <div className={cn(\"bg-neutral-0 border border-neutral-200 rounded-rm\", className)}>\n {children}\n </div>\n );\n}\n"],"mappings":";AAYI;AATJ,SAAS,UAAU;AAOZ,SAAS,eAAe,EAAE,WAAW,SAAS,GAAwB;AAC3E,SACE,oBAAC,SAAI,WAAW,GAAG,qDAAqD,SAAS,GAC9E,UACH;AAEJ;","names":[]}
@@ -10,6 +10,6 @@ interface SegmentedControlProps<T extends string> {
10
10
  onChange: (value: T) => void;
11
11
  label: string;
12
12
  }
13
- export declare function SegmentedControl<T extends string>({ options, value, onChange, label }: SegmentedControlProps<T>): import("react/jsx-runtime").JSX.Element;
13
+ export declare function SegmentedControl<T extends string>({ options, value, onChange, label, }: SegmentedControlProps<T>): import("react/jsx-runtime").JSX.Element;
14
14
  export {};
15
15
  //# sourceMappingURL=SegmentedControl.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SegmentedControl.d.ts","sourceRoot":"","sources":["../../src/ui/SegmentedControl.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAYvC,UAAU,sBAAsB,CAAC,CAAC,SAAS,MAAM;IAC/C,KAAK,EAAE,CAAC,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED,UAAU,qBAAqB,CAAC,CAAC,SAAS,MAAM;IAC9C,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAAC;IACrC,KAAK,EAAE,CAAC,CAAC;IACT,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC,2CAgE/G"}
1
+ {"version":3,"file":"SegmentedControl.d.ts","sourceRoot":"","sources":["../../src/ui/SegmentedControl.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAevC,UAAU,sBAAsB,CAAC,CAAC,SAAS,MAAM;IAC/C,KAAK,EAAE,CAAC,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED,UAAU,qBAAqB,CAAC,CAAC,SAAS,MAAM;IAC9C,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAAC;IACrC,KAAK,EAAE,CAAC,CAAC;IACT,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,EACjD,OAAO,EACP,KAAK,EACL,QAAQ,EACR,KAAK,GACN,EAAE,qBAAqB,CAAC,CAAC,CAAC,2CAoE1B"}
@@ -2,16 +2,24 @@
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { cva } from "class-variance-authority";
4
4
  import { useRef } from "react";
5
- const segmentVariants = cva("inline-flex items-center gap-[5px] px-[11px] py-[4px] rounded-rs text-[11px] font-medium border-0 cursor-pointer", {
6
- variants: {
7
- active: {
8
- true: "bg-neutral-0 text-neutral-1000",
9
- false: "bg-transparent text-neutral-600"
10
- }
11
- },
12
- defaultVariants: { active: false }
13
- });
14
- function SegmentedControl({ options, value, onChange, label }) {
5
+ const segmentVariants = cva(
6
+ "inline-flex items-center gap-[5px] px-[11px] py-[4px] rounded-rs text-[11px] font-medium border-0 cursor-pointer",
7
+ {
8
+ variants: {
9
+ active: {
10
+ true: "bg-neutral-0 text-neutral-1000",
11
+ false: "bg-transparent text-neutral-600"
12
+ }
13
+ },
14
+ defaultVariants: { active: false }
15
+ }
16
+ );
17
+ function SegmentedControl({
18
+ options,
19
+ value,
20
+ onChange,
21
+ label
22
+ }) {
15
23
  const refs = useRef([]);
16
24
  const selectIndex = (index) => {
17
25
  const next = options[index];
@@ -45,29 +53,37 @@ function SegmentedControl({ options, value, onChange, label }) {
45
53
  break;
46
54
  }
47
55
  };
48
- return /* @__PURE__ */ jsx("div", { role: "radiogroup", "aria-label": label, className: "inline-flex bg-neutral-100 rounded-rm p-[2px] gap-[2px]", children: options.map((option, index) => {
49
- const isActive = option.value === value;
50
- return /* @__PURE__ */ jsxs(
51
- "button",
52
- {
53
- ref: (node) => {
54
- refs.current[index] = node;
55
- },
56
- type: "button",
57
- role: "radio",
58
- "aria-checked": isActive,
59
- tabIndex: isActive ? 0 : -1,
60
- className: segmentVariants({ active: isActive }),
61
- onClick: () => selectIndex(index),
62
- onKeyDown: (event) => handleKeyDown(event, index),
63
- children: [
64
- option.icon,
65
- option.label
66
- ]
67
- },
68
- option.value
69
- );
70
- }) });
56
+ return /* @__PURE__ */ jsx(
57
+ "div",
58
+ {
59
+ role: "radiogroup",
60
+ "aria-label": label,
61
+ className: "inline-flex bg-neutral-100 rounded-rm p-[2px] gap-[2px]",
62
+ children: options.map((option, index) => {
63
+ const isActive = option.value === value;
64
+ return /* @__PURE__ */ jsxs(
65
+ "button",
66
+ {
67
+ ref: (node) => {
68
+ refs.current[index] = node;
69
+ },
70
+ type: "button",
71
+ role: "radio",
72
+ "aria-checked": isActive,
73
+ tabIndex: isActive ? 0 : -1,
74
+ className: segmentVariants({ active: isActive }),
75
+ onClick: () => selectIndex(index),
76
+ onKeyDown: (event) => handleKeyDown(event, index),
77
+ children: [
78
+ option.icon,
79
+ option.label
80
+ ]
81
+ },
82
+ option.value
83
+ );
84
+ })
85
+ }
86
+ );
71
87
  }
72
88
  export {
73
89
  SegmentedControl
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ui/SegmentedControl.tsx"],"sourcesContent":["\"use client\";\n\nimport { cva } from \"class-variance-authority\";\nimport { useRef } from \"react\";\nimport type { ReactNode } from \"react\";\n\nconst segmentVariants = cva(\"inline-flex items-center gap-[5px] px-[11px] py-[4px] rounded-rs text-[11px] font-medium border-0 cursor-pointer\", {\n variants: {\n active: {\n true: \"bg-neutral-0 text-neutral-1000\",\n false: \"bg-transparent text-neutral-600\",\n },\n },\n defaultVariants: { active: false },\n});\n\ninterface SegmentedControlOption<T extends string> {\n value: T;\n label: string;\n icon?: ReactNode;\n}\n\ninterface SegmentedControlProps<T extends string> {\n options: SegmentedControlOption<T>[];\n value: T;\n onChange: (value: T) => void;\n label: string;\n}\n\nexport function SegmentedControl<T extends string>({ options, value, onChange, label }: SegmentedControlProps<T>) {\n const refs = useRef<(HTMLButtonElement | null)[]>([]);\n\n const selectIndex = (index: number) => {\n const next = options[index];\n if (!next) return;\n\n onChange(next.value);\n refs.current[index]?.focus();\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLButtonElement>, index: number) => {\n const last = options.length - 1;\n\n switch (event.key) {\n case \"ArrowRight\":\n case \"ArrowDown\":\n event.preventDefault();\n selectIndex(index === last ? 0 : index + 1);\n break;\n case \"ArrowLeft\":\n case \"ArrowUp\":\n event.preventDefault();\n selectIndex(index === 0 ? last : index - 1);\n break;\n case \"Home\":\n event.preventDefault();\n selectIndex(0);\n break;\n case \"End\":\n event.preventDefault();\n selectIndex(last);\n break;\n default:\n break;\n }\n };\n\n return (\n <div role=\"radiogroup\" aria-label={label} className=\"inline-flex bg-neutral-100 rounded-rm p-[2px] gap-[2px]\">\n {options.map((option, index) => {\n const isActive = option.value === value;\n\n return (\n <button\n key={option.value}\n ref={(node) => {\n refs.current[index] = node;\n }}\n type=\"button\"\n role=\"radio\"\n aria-checked={isActive}\n tabIndex={isActive ? 0 : -1}\n className={segmentVariants({ active: isActive })}\n onClick={() => selectIndex(index)}\n onKeyDown={(event) => handleKeyDown(event, index)}\n >\n {option.icon}\n {option.label}\n </button>\n );\n })}\n </div>\n );\n}\n"],"mappings":";AAoEI,cAKM,YALN;AAlEJ,SAAS,WAAW;AACpB,SAAS,cAAc;AAGvB,MAAM,kBAAkB,IAAI,oHAAoH;AAAA,EAC9I,UAAU;AAAA,IACR,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,iBAAiB,EAAE,QAAQ,MAAM;AACnC,CAAC;AAeM,SAAS,iBAAmC,EAAE,SAAS,OAAO,UAAU,MAAM,GAA6B;AAChH,QAAM,OAAO,OAAqC,CAAC,CAAC;AAEpD,QAAM,cAAc,CAAC,UAAkB;AACrC,UAAM,OAAO,QAAQ,KAAK;AAC1B,QAAI,CAAC;AAAM;AAEX,aAAS,KAAK,KAAK;AACnB,SAAK,QAAQ,KAAK,GAAG,MAAM;AAAA,EAC7B;AAEA,QAAM,gBAAgB,CAAC,OAA+C,UAAkB;AACtF,UAAM,OAAO,QAAQ,SAAS;AAE9B,YAAQ,MAAM,KAAK;AAAA,MACjB,KAAK;AAAA,MACL,KAAK;AACH,cAAM,eAAe;AACrB,oBAAY,UAAU,OAAO,IAAI,QAAQ,CAAC;AAC1C;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,cAAM,eAAe;AACrB,oBAAY,UAAU,IAAI,OAAO,QAAQ,CAAC;AAC1C;AAAA,MACF,KAAK;AACH,cAAM,eAAe;AACrB,oBAAY,CAAC;AACb;AAAA,MACF,KAAK;AACH,cAAM,eAAe;AACrB,oBAAY,IAAI;AAChB;AAAA,MACF;AACE;AAAA,IACJ;AAAA,EACF;AAEA,SACE,oBAAC,SAAI,MAAK,cAAa,cAAY,OAAO,WAAU,2DACjD,kBAAQ,IAAI,CAAC,QAAQ,UAAU;AAC9B,UAAM,WAAW,OAAO,UAAU;AAElC,WACE;AAAA,MAAC;AAAA;AAAA,QAEC,KAAK,CAAC,SAAS;AACb,eAAK,QAAQ,KAAK,IAAI;AAAA,QACxB;AAAA,QACA,MAAK;AAAA,QACL,MAAK;AAAA,QACL,gBAAc;AAAA,QACd,UAAU,WAAW,IAAI;AAAA,QACzB,WAAW,gBAAgB,EAAE,QAAQ,SAAS,CAAC;AAAA,QAC/C,SAAS,MAAM,YAAY,KAAK;AAAA,QAChC,WAAW,CAAC,UAAU,cAAc,OAAO,KAAK;AAAA,QAE/C;AAAA,iBAAO;AAAA,UACP,OAAO;AAAA;AAAA;AAAA,MAbH,OAAO;AAAA,IAcd;AAAA,EAEJ,CAAC,GACH;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/ui/SegmentedControl.tsx"],"sourcesContent":["\"use client\";\n\nimport { cva } from \"class-variance-authority\";\nimport { useRef } from \"react\";\nimport type { ReactNode } from \"react\";\n\nconst segmentVariants = cva(\n \"inline-flex items-center gap-[5px] px-[11px] py-[4px] rounded-rs text-[11px] font-medium border-0 cursor-pointer\",\n {\n variants: {\n active: {\n true: \"bg-neutral-0 text-neutral-1000\",\n false: \"bg-transparent text-neutral-600\",\n },\n },\n defaultVariants: { active: false },\n }\n);\n\ninterface SegmentedControlOption<T extends string> {\n value: T;\n label: string;\n icon?: ReactNode;\n}\n\ninterface SegmentedControlProps<T extends string> {\n options: SegmentedControlOption<T>[];\n value: T;\n onChange: (value: T) => void;\n label: string;\n}\n\nexport function SegmentedControl<T extends string>({\n options,\n value,\n onChange,\n label,\n}: SegmentedControlProps<T>) {\n const refs = useRef<(HTMLButtonElement | null)[]>([]);\n\n const selectIndex = (index: number) => {\n const next = options[index];\n if (!next) return;\n\n onChange(next.value);\n refs.current[index]?.focus();\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLButtonElement>, index: number) => {\n const last = options.length - 1;\n\n switch (event.key) {\n case \"ArrowRight\":\n case \"ArrowDown\":\n event.preventDefault();\n selectIndex(index === last ? 0 : index + 1);\n break;\n case \"ArrowLeft\":\n case \"ArrowUp\":\n event.preventDefault();\n selectIndex(index === 0 ? last : index - 1);\n break;\n case \"Home\":\n event.preventDefault();\n selectIndex(0);\n break;\n case \"End\":\n event.preventDefault();\n selectIndex(last);\n break;\n default:\n break;\n }\n };\n\n return (\n <div\n role=\"radiogroup\"\n aria-label={label}\n className=\"inline-flex bg-neutral-100 rounded-rm p-[2px] gap-[2px]\"\n >\n {options.map((option, index) => {\n const isActive = option.value === value;\n\n return (\n <button\n key={option.value}\n ref={(node) => {\n refs.current[index] = node;\n }}\n type=\"button\"\n role=\"radio\"\n aria-checked={isActive}\n tabIndex={isActive ? 0 : -1}\n className={segmentVariants({ active: isActive })}\n onClick={() => selectIndex(index)}\n onKeyDown={(event) => handleKeyDown(event, index)}\n >\n {option.icon}\n {option.label}\n </button>\n );\n })}\n </div>\n );\n}\n"],"mappings":";AA4EI,cASM,YATN;AA1EJ,SAAS,WAAW;AACpB,SAAS,cAAc;AAGvB,MAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,iBAAiB,EAAE,QAAQ,MAAM;AAAA,EACnC;AACF;AAeO,SAAS,iBAAmC;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA6B;AAC3B,QAAM,OAAO,OAAqC,CAAC,CAAC;AAEpD,QAAM,cAAc,CAAC,UAAkB;AACrC,UAAM,OAAO,QAAQ,KAAK;AAC1B,QAAI,CAAC;AAAM;AAEX,aAAS,KAAK,KAAK;AACnB,SAAK,QAAQ,KAAK,GAAG,MAAM;AAAA,EAC7B;AAEA,QAAM,gBAAgB,CAAC,OAA+C,UAAkB;AACtF,UAAM,OAAO,QAAQ,SAAS;AAE9B,YAAQ,MAAM,KAAK;AAAA,MACjB,KAAK;AAAA,MACL,KAAK;AACH,cAAM,eAAe;AACrB,oBAAY,UAAU,OAAO,IAAI,QAAQ,CAAC;AAC1C;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,cAAM,eAAe;AACrB,oBAAY,UAAU,IAAI,OAAO,QAAQ,CAAC;AAC1C;AAAA,MACF,KAAK;AACH,cAAM,eAAe;AACrB,oBAAY,CAAC;AACb;AAAA,MACF,KAAK;AACH,cAAM,eAAe;AACrB,oBAAY,IAAI;AAChB;AAAA,MACF;AACE;AAAA,IACJ;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAY;AAAA,MACZ,WAAU;AAAA,MAET,kBAAQ,IAAI,CAAC,QAAQ,UAAU;AAC9B,cAAM,WAAW,OAAO,UAAU;AAElC,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,KAAK,CAAC,SAAS;AACb,mBAAK,QAAQ,KAAK,IAAI;AAAA,YACxB;AAAA,YACA,MAAK;AAAA,YACL,MAAK;AAAA,YACL,gBAAc;AAAA,YACd,UAAU,WAAW,IAAI;AAAA,YACzB,WAAW,gBAAgB,EAAE,QAAQ,SAAS,CAAC;AAAA,YAC/C,SAAS,MAAM,YAAY,KAAK;AAAA,YAChC,WAAW,CAAC,UAAU,cAAc,OAAO,KAAK;AAAA,YAE/C;AAAA,qBAAO;AAAA,cACP,OAAO;AAAA;AAAA;AAAA,UAbH,OAAO;AAAA,QAcd;AAAA,MAEJ,CAAC;AAAA;AAAA,EACH;AAEJ;","names":[]}
@@ -7,7 +7,7 @@ export interface TooltipProps {
7
7
  width?: number;
8
8
  className?: string;
9
9
  }
10
- export declare function Tooltip({ content, children, side, align, width, className }: TooltipProps): import("react/jsx-runtime").JSX.Element;
10
+ export declare function Tooltip({ content, children, side, align, width, className, }: TooltipProps): import("react/jsx-runtime").JSX.Element;
11
11
  export declare function TooltipTitle({ children }: {
12
12
  children: ReactNode;
13
13
  }): import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../src/ui/Tooltip.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAqBvC,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,SAAS,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,OAAO,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAe,EAAE,KAAe,EAAE,KAAW,EAAE,SAAS,EAAE,EAAE,YAAY,2CA6DpH;AAED,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAEjE;AAED,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAEhE"}
1
+ {"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../src/ui/Tooltip.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAiCvC,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,SAAS,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,OAAO,CAAC,EACtB,OAAO,EACP,QAAQ,EACR,IAAe,EACf,KAAe,EACf,KAAW,EACX,SAAS,GACV,EAAE,YAAY,2CA6Dd;AAED,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAEjE;AAED,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAEhE"}
@@ -10,7 +10,14 @@ function computeCoords(rect, side, align, width) {
10
10
  left = Math.max(GAP, Math.min(left, maxLeft));
11
11
  return side === "top" ? { top: rect.top - GAP, left, transform: "translateY(-100%)" } : { top: rect.bottom + GAP, left, transform: "none" };
12
12
  }
13
- function Tooltip({ content, children, side = "bottom", align = "start", width = 290, className }) {
13
+ function Tooltip({
14
+ content,
15
+ children,
16
+ side = "bottom",
17
+ align = "start",
18
+ width = 290,
19
+ className
20
+ }) {
14
21
  const tooltipId = useId();
15
22
  const triggerRef = useRef(null);
16
23
  const [coords, setCoords] = useState(null);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ui/Tooltip.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../utils/style\";\n\nconst GAP = 8;\n\ninterface Coords {\n top: number;\n left: number;\n transform: string;\n}\n\nfunction computeCoords(rect: DOMRect, side: NonNullable<TooltipProps[\"side\"]>, align: NonNullable<TooltipProps[\"align\"]>, width: number): Coords {\n let left = align === \"start\" ? rect.left : align === \"end\" ? rect.right - width : rect.left + rect.width / 2 - width / 2;\n\n const maxLeft = Math.max(GAP, window.innerWidth - width - GAP);\n left = Math.max(GAP, Math.min(left, maxLeft));\n\n return side === \"top\" ? { top: rect.top - GAP, left, transform: \"translateY(-100%)\" } : { top: rect.bottom + GAP, left, transform: \"none\" };\n}\n\nexport interface TooltipProps {\n content: ReactNode;\n children: ReactNode;\n side?: \"top\" | \"bottom\";\n align?: \"start\" | \"center\" | \"end\";\n width?: number;\n className?: string;\n}\n\nexport function Tooltip({ content, children, side = \"bottom\", align = \"start\", width = 290, className }: TooltipProps) {\n const tooltipId = useId();\n const triggerRef = useRef<HTMLSpanElement>(null);\n const [coords, setCoords] = useState<Coords | null>(null);\n const isOpen = coords != null;\n\n const open = useCallback(() => {\n const el = triggerRef.current;\n\n if (el) {\n setCoords(computeCoords(el.getBoundingClientRect(), side, align, width));\n }\n }, [side, align, width]);\n\n const close = useCallback(() => setCoords(null), []);\n\n useEffect(() => {\n if (!isOpen) return;\n\n window.addEventListener(\"scroll\", close, true);\n window.addEventListener(\"resize\", close);\n\n return () => {\n window.removeEventListener(\"scroll\", close, true);\n window.removeEventListener(\"resize\", close);\n };\n }, [isOpen, close]);\n\n return (\n <span\n ref={triggerRef}\n className={cn(\"relative inline-flex cursor-help outline-none\", className)}\n tabIndex={0}\n aria-describedby={isOpen ? tooltipId : undefined}\n onMouseEnter={open}\n onMouseLeave={close}\n onFocus={open}\n onBlur={close}\n >\n {children}\n\n {isOpen &&\n typeof document !== \"undefined\" &&\n createPortal(\n <span\n id={tooltipId}\n role=\"tooltip\"\n className=\"pointer-events-none fixed z-[100] flex cursor-default flex-col gap-[7px] rounded-rs bg-neutral-1000 px-[13px] py-[11px] text-left font-normal normal-case tracking-normal text-neutral-0 shadow-popover animate-seo-fade-in motion-reduce:animate-none\"\n style={{\n top: coords.top,\n left: coords.left,\n width,\n transform: coords.transform,\n }}\n >\n {content}\n </span>,\n document.body\n )}\n </span>\n );\n}\n\nexport function TooltipTitle({ children }: { children: ReactNode }) {\n return <span className=\"text-[12px] font-semibold\">{children}</span>;\n}\n\nexport function TooltipText({ children }: { children: ReactNode }) {\n return <span className=\"text-[11.5px] leading-[1.45] text-neutral-300\">{children}</span>;\n}\n"],"mappings":";AA8DI,SAeM,KAfN;AA5DJ,SAAS,aAAa,WAAW,OAAO,QAAQ,gBAAgB;AAEhE,SAAS,oBAAoB;AAC7B,SAAS,UAAU;AAEnB,MAAM,MAAM;AAQZ,SAAS,cAAc,MAAe,MAAyC,OAA2C,OAAuB;AAC/I,MAAI,OAAO,UAAU,UAAU,KAAK,OAAO,UAAU,QAAQ,KAAK,QAAQ,QAAQ,KAAK,OAAO,KAAK,QAAQ,IAAI,QAAQ;AAEvH,QAAM,UAAU,KAAK,IAAI,KAAK,OAAO,aAAa,QAAQ,GAAG;AAC7D,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,MAAM,OAAO,CAAC;AAE5C,SAAO,SAAS,QAAQ,EAAE,KAAK,KAAK,MAAM,KAAK,MAAM,WAAW,oBAAoB,IAAI,EAAE,KAAK,KAAK,SAAS,KAAK,MAAM,WAAW,OAAO;AAC5I;AAWO,SAAS,QAAQ,EAAE,SAAS,UAAU,OAAO,UAAU,QAAQ,SAAS,QAAQ,KAAK,UAAU,GAAiB;AACrH,QAAM,YAAY,MAAM;AACxB,QAAM,aAAa,OAAwB,IAAI;AAC/C,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAwB,IAAI;AACxD,QAAM,SAAS,UAAU;AAEzB,QAAM,OAAO,YAAY,MAAM;AAC7B,UAAM,KAAK,WAAW;AAEtB,QAAI,IAAI;AACN,gBAAU,cAAc,GAAG,sBAAsB,GAAG,MAAM,OAAO,KAAK,CAAC;AAAA,IACzE;AAAA,EACF,GAAG,CAAC,MAAM,OAAO,KAAK,CAAC;AAEvB,QAAM,QAAQ,YAAY,MAAM,UAAU,IAAI,GAAG,CAAC,CAAC;AAEnD,YAAU,MAAM;AACd,QAAI,CAAC;AAAQ;AAEb,WAAO,iBAAiB,UAAU,OAAO,IAAI;AAC7C,WAAO,iBAAiB,UAAU,KAAK;AAEvC,WAAO,MAAM;AACX,aAAO,oBAAoB,UAAU,OAAO,IAAI;AAChD,aAAO,oBAAoB,UAAU,KAAK;AAAA,IAC5C;AAAA,EACF,GAAG,CAAC,QAAQ,KAAK,CAAC;AAElB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW,GAAG,iDAAiD,SAAS;AAAA,MACxE,UAAU;AAAA,MACV,oBAAkB,SAAS,YAAY;AAAA,MACvC,cAAc;AAAA,MACd,cAAc;AAAA,MACd,SAAS;AAAA,MACT,QAAQ;AAAA,MAEP;AAAA;AAAA,QAEA,UACC,OAAO,aAAa,eACpB;AAAA,UACE;AAAA,YAAC;AAAA;AAAA,cACC,IAAI;AAAA,cACJ,MAAK;AAAA,cACL,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,KAAK,OAAO;AAAA,gBACZ,MAAM,OAAO;AAAA,gBACb;AAAA,gBACA,WAAW,OAAO;AAAA,cACpB;AAAA,cAEC;AAAA;AAAA,UACH;AAAA,UACA,SAAS;AAAA,QACX;AAAA;AAAA;AAAA,EACJ;AAEJ;AAEO,SAAS,aAAa,EAAE,SAAS,GAA4B;AAClE,SAAO,oBAAC,UAAK,WAAU,6BAA6B,UAAS;AAC/D;AAEO,SAAS,YAAY,EAAE,SAAS,GAA4B;AACjE,SAAO,oBAAC,UAAK,WAAU,iDAAiD,UAAS;AACnF;","names":[]}
1
+ {"version":3,"sources":["../../src/ui/Tooltip.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../utils/style\";\n\nconst GAP = 8;\n\ninterface Coords {\n top: number;\n left: number;\n transform: string;\n}\n\nfunction computeCoords(\n rect: DOMRect,\n side: NonNullable<TooltipProps[\"side\"]>,\n align: NonNullable<TooltipProps[\"align\"]>,\n width: number\n): Coords {\n let left =\n align === \"start\"\n ? rect.left\n : align === \"end\"\n ? rect.right - width\n : rect.left + rect.width / 2 - width / 2;\n\n const maxLeft = Math.max(GAP, window.innerWidth - width - GAP);\n left = Math.max(GAP, Math.min(left, maxLeft));\n\n return side === \"top\"\n ? { top: rect.top - GAP, left, transform: \"translateY(-100%)\" }\n : { top: rect.bottom + GAP, left, transform: \"none\" };\n}\n\nexport interface TooltipProps {\n content: ReactNode;\n children: ReactNode;\n side?: \"top\" | \"bottom\";\n align?: \"start\" | \"center\" | \"end\";\n width?: number;\n className?: string;\n}\n\nexport function Tooltip({\n content,\n children,\n side = \"bottom\",\n align = \"start\",\n width = 290,\n className,\n}: TooltipProps) {\n const tooltipId = useId();\n const triggerRef = useRef<HTMLSpanElement>(null);\n const [coords, setCoords] = useState<Coords | null>(null);\n const isOpen = coords != null;\n\n const open = useCallback(() => {\n const el = triggerRef.current;\n\n if (el) {\n setCoords(computeCoords(el.getBoundingClientRect(), side, align, width));\n }\n }, [side, align, width]);\n\n const close = useCallback(() => setCoords(null), []);\n\n useEffect(() => {\n if (!isOpen) return;\n\n window.addEventListener(\"scroll\", close, true);\n window.addEventListener(\"resize\", close);\n\n return () => {\n window.removeEventListener(\"scroll\", close, true);\n window.removeEventListener(\"resize\", close);\n };\n }, [isOpen, close]);\n\n return (\n <span\n ref={triggerRef}\n className={cn(\"relative inline-flex cursor-help outline-none\", className)}\n tabIndex={0}\n aria-describedby={isOpen ? tooltipId : undefined}\n onMouseEnter={open}\n onMouseLeave={close}\n onFocus={open}\n onBlur={close}\n >\n {children}\n\n {isOpen &&\n typeof document !== \"undefined\" &&\n createPortal(\n <span\n id={tooltipId}\n role=\"tooltip\"\n className=\"pointer-events-none fixed z-[100] flex cursor-default flex-col gap-[7px] rounded-rs bg-neutral-1000 px-[13px] py-[11px] text-left font-normal normal-case tracking-normal text-neutral-0 shadow-popover animate-seo-fade-in motion-reduce:animate-none\"\n style={{\n top: coords.top,\n left: coords.left,\n width,\n transform: coords.transform,\n }}\n >\n {content}\n </span>,\n document.body\n )}\n </span>\n );\n}\n\nexport function TooltipTitle({ children }: { children: ReactNode }) {\n return <span className=\"text-[12px] font-semibold\">{children}</span>;\n}\n\nexport function TooltipText({ children }: { children: ReactNode }) {\n return <span className=\"text-[11.5px] leading-[1.45] text-neutral-300\">{children}</span>;\n}\n"],"mappings":";AAiFI,SAeM,KAfN;AA/EJ,SAAS,aAAa,WAAW,OAAO,QAAQ,gBAAgB;AAEhE,SAAS,oBAAoB;AAC7B,SAAS,UAAU;AAEnB,MAAM,MAAM;AAQZ,SAAS,cACP,MACA,MACA,OACA,OACQ;AACR,MAAI,OACF,UAAU,UACN,KAAK,OACL,UAAU,QACR,KAAK,QAAQ,QACb,KAAK,OAAO,KAAK,QAAQ,IAAI,QAAQ;AAE7C,QAAM,UAAU,KAAK,IAAI,KAAK,OAAO,aAAa,QAAQ,GAAG;AAC7D,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,MAAM,OAAO,CAAC;AAE5C,SAAO,SAAS,QACZ,EAAE,KAAK,KAAK,MAAM,KAAK,MAAM,WAAW,oBAAoB,IAC5D,EAAE,KAAK,KAAK,SAAS,KAAK,MAAM,WAAW,OAAO;AACxD;AAWO,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR;AACF,GAAiB;AACf,QAAM,YAAY,MAAM;AACxB,QAAM,aAAa,OAAwB,IAAI;AAC/C,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAwB,IAAI;AACxD,QAAM,SAAS,UAAU;AAEzB,QAAM,OAAO,YAAY,MAAM;AAC7B,UAAM,KAAK,WAAW;AAEtB,QAAI,IAAI;AACN,gBAAU,cAAc,GAAG,sBAAsB,GAAG,MAAM,OAAO,KAAK,CAAC;AAAA,IACzE;AAAA,EACF,GAAG,CAAC,MAAM,OAAO,KAAK,CAAC;AAEvB,QAAM,QAAQ,YAAY,MAAM,UAAU,IAAI,GAAG,CAAC,CAAC;AAEnD,YAAU,MAAM;AACd,QAAI,CAAC;AAAQ;AAEb,WAAO,iBAAiB,UAAU,OAAO,IAAI;AAC7C,WAAO,iBAAiB,UAAU,KAAK;AAEvC,WAAO,MAAM;AACX,aAAO,oBAAoB,UAAU,OAAO,IAAI;AAChD,aAAO,oBAAoB,UAAU,KAAK;AAAA,IAC5C;AAAA,EACF,GAAG,CAAC,QAAQ,KAAK,CAAC;AAElB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW,GAAG,iDAAiD,SAAS;AAAA,MACxE,UAAU;AAAA,MACV,oBAAkB,SAAS,YAAY;AAAA,MACvC,cAAc;AAAA,MACd,cAAc;AAAA,MACd,SAAS;AAAA,MACT,QAAQ;AAAA,MAEP;AAAA;AAAA,QAEA,UACC,OAAO,aAAa,eACpB;AAAA,UACE;AAAA,YAAC;AAAA;AAAA,cACC,IAAI;AAAA,cACJ,MAAK;AAAA,cACL,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,KAAK,OAAO;AAAA,gBACZ,MAAM,OAAO;AAAA,gBACb;AAAA,gBACA,WAAW,OAAO;AAAA,cACpB;AAAA,cAEC;AAAA;AAAA,UACH;AAAA,UACA,SAAS;AAAA,QACX;AAAA;AAAA;AAAA,EACJ;AAEJ;AAEO,SAAS,aAAa,EAAE,SAAS,GAA4B;AAClE,SAAO,oBAAC,UAAK,WAAU,6BAA6B,UAAS;AAC/D;AAEO,SAAS,YAAY,EAAE,SAAS,GAA4B;AACjE,SAAO,oBAAC,UAAK,WAAU,iDAAiD,UAAS;AACnF;","names":[]}
@@ -11,7 +11,7 @@ function overrideAdmin(incomingConfig, config) {
11
11
  clientProps: {
12
12
  collectionSlug: collection.slug,
13
13
  fields: seoCfg.fields ?? {},
14
- extractContentPath: seoCfg.extractContentPath ?? null,
14
+ extractContentPath: seoCfg.extractContentPath,
15
15
  site: {
16
16
  name: site.name ?? "",
17
17
  baseUrl: site.baseUrl ?? "",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/config/overrideAdmin.ts"],"sourcesContent":["import type { Config } from \"payload\";\nimport { getComponentPath } from \"./getComponentPath\";\nimport type { SeoPluginConfig, SeoSiteConfig } from \"../../types/config\";\n\nexport function overrideAdmin(incomingConfig: Config, config: SeoPluginConfig): Config {\n const bySlug = new Map(config.collections.map((c) => [c.slug, c]));\n const site: SeoSiteConfig = config.site ?? {};\n\n const collections = (incomingConfig.collections ?? []).map((collection) => {\n const seoCfg = bySlug.get(collection.slug);\n if (!seoCfg) return collection;\n\n const buttonEntry = {\n path: getComponentPath(\"components/SeoButton\"),\n clientProps: {\n collectionSlug: collection.slug,\n fields: seoCfg.fields ?? {},\n extractContentPath: seoCfg.extractContentPath ?? null,\n site: {\n name: site.name ?? \"\",\n baseUrl: site.baseUrl ?? \"\",\n faviconUrl: site.faviconUrl ?? \"\",\n },\n supportedLocales: config.supportedLocales ?? [\"en\"],\n },\n };\n\n const existing = collection.admin?.components?.edit?.beforeDocumentControls ?? [];\n\n return {\n ...collection,\n admin: {\n ...collection.admin,\n components: {\n ...collection.admin?.components,\n edit: {\n ...collection.admin?.components?.edit,\n beforeDocumentControls: [...existing, buttonEntry],\n },\n },\n },\n };\n });\n\n return { ...incomingConfig, collections };\n}\n"],"mappings":"AACA,SAAS,wBAAwB;AAG1B,SAAS,cAAc,gBAAwB,QAAiC;AACrF,QAAM,SAAS,IAAI,IAAI,OAAO,YAAY,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AACjE,QAAM,OAAsB,OAAO,QAAQ,CAAC;AAE5C,QAAM,eAAe,eAAe,eAAe,CAAC,GAAG,IAAI,CAAC,eAAe;AACzE,UAAM,SAAS,OAAO,IAAI,WAAW,IAAI;AACzC,QAAI,CAAC;AAAQ,aAAO;AAEpB,UAAM,cAAc;AAAA,MAClB,MAAM,iBAAiB,sBAAsB;AAAA,MAC7C,aAAa;AAAA,QACX,gBAAgB,WAAW;AAAA,QAC3B,QAAQ,OAAO,UAAU,CAAC;AAAA,QAC1B,oBAAoB,OAAO,sBAAsB;AAAA,QACjD,MAAM;AAAA,UACJ,MAAM,KAAK,QAAQ;AAAA,UACnB,SAAS,KAAK,WAAW;AAAA,UACzB,YAAY,KAAK,cAAc;AAAA,QACjC;AAAA,QACA,kBAAkB,OAAO,oBAAoB,CAAC,IAAI;AAAA,MACpD;AAAA,IACF;AAEA,UAAM,WAAW,WAAW,OAAO,YAAY,MAAM,0BAA0B,CAAC;AAEhF,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO;AAAA,QACL,GAAG,WAAW;AAAA,QACd,YAAY;AAAA,UACV,GAAG,WAAW,OAAO;AAAA,UACrB,MAAM;AAAA,YACJ,GAAG,WAAW,OAAO,YAAY;AAAA,YACjC,wBAAwB,CAAC,GAAG,UAAU,WAAW;AAAA,UACnD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO,EAAE,GAAG,gBAAgB,YAAY;AAC1C;","names":[]}
1
+ {"version":3,"sources":["../../../src/utils/config/overrideAdmin.ts"],"sourcesContent":["import type { Config } from \"payload\";\nimport { getComponentPath } from \"./getComponentPath\";\nimport type { SeoPluginConfig, SeoSiteConfig } from \"../../types/config\";\n\nexport function overrideAdmin(incomingConfig: Config, config: SeoPluginConfig): Config {\n const bySlug = new Map(config.collections.map((c) => [c.slug, c]));\n const site: SeoSiteConfig = config.site ?? {};\n\n const collections = (incomingConfig.collections ?? []).map((collection) => {\n const seoCfg = bySlug.get(collection.slug);\n if (!seoCfg) return collection;\n\n const buttonEntry = {\n path: getComponentPath(\"components/SeoButton\"),\n clientProps: {\n collectionSlug: collection.slug,\n fields: seoCfg.fields ?? {},\n extractContentPath: seoCfg.extractContentPath,\n site: {\n name: site.name ?? \"\",\n baseUrl: site.baseUrl ?? \"\",\n faviconUrl: site.faviconUrl ?? \"\",\n },\n supportedLocales: config.supportedLocales ?? [\"en\"],\n },\n };\n\n const existing = collection.admin?.components?.edit?.beforeDocumentControls ?? [];\n\n return {\n ...collection,\n admin: {\n ...collection.admin,\n components: {\n ...collection.admin?.components,\n edit: {\n ...collection.admin?.components?.edit,\n beforeDocumentControls: [...existing, buttonEntry],\n },\n },\n },\n };\n });\n\n return { ...incomingConfig, collections };\n}\n"],"mappings":"AACA,SAAS,wBAAwB;AAG1B,SAAS,cAAc,gBAAwB,QAAiC;AACrF,QAAM,SAAS,IAAI,IAAI,OAAO,YAAY,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AACjE,QAAM,OAAsB,OAAO,QAAQ,CAAC;AAE5C,QAAM,eAAe,eAAe,eAAe,CAAC,GAAG,IAAI,CAAC,eAAe;AACzE,UAAM,SAAS,OAAO,IAAI,WAAW,IAAI;AACzC,QAAI,CAAC;AAAQ,aAAO;AAEpB,UAAM,cAAc;AAAA,MAClB,MAAM,iBAAiB,sBAAsB;AAAA,MAC7C,aAAa;AAAA,QACX,gBAAgB,WAAW;AAAA,QAC3B,QAAQ,OAAO,UAAU,CAAC;AAAA,QAC1B,oBAAoB,OAAO;AAAA,QAC3B,MAAM;AAAA,UACJ,MAAM,KAAK,QAAQ;AAAA,UACnB,SAAS,KAAK,WAAW;AAAA,UACzB,YAAY,KAAK,cAAc;AAAA,QACjC;AAAA,QACA,kBAAkB,OAAO,oBAAoB,CAAC,IAAI;AAAA,MACpD;AAAA,IACF;AAEA,UAAM,WAAW,WAAW,OAAO,YAAY,MAAM,0BAA0B,CAAC;AAEhF,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO;AAAA,QACL,GAAG,WAAW;AAAA,QACd,YAAY;AAAA,UACV,GAAG,WAAW,OAAO;AAAA,UACrB,MAAM;AAAA,YACJ,GAAG,WAAW,OAAO,YAAY;AAAA,YACjC,wBAAwB,CAAC,GAAG,UAAU,WAAW;AAAA,UACnD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO,EAAE,GAAG,gBAAgB,YAAY;AAC1C;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../src/utils/style.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAEvC,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAElD;AAED,eAAO,MAAM,aAAa,gKAAgK,CAAC"}
1
+ {"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../src/utils/style.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAEvC,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAElD;AAED,eAAO,MAAM,aAAa,gKACqI,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/style.ts"],"sourcesContent":["import { clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\nimport type { ClassValue } from \"clsx\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n\nexport const ROW_SEPARATOR = \"not-last:after:content-[''] not-last:after:absolute not-last:after:inset-x-[15px] not-last:after:bottom-0 not-last:after:h-px not-last:after:bg-neutral-200\";\n"],"mappings":"AAAA,SAAS,YAAY;AACrB,SAAS,eAAe;AAGjB,SAAS,MAAM,QAA8B;AAClD,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;AAEO,MAAM,gBAAgB;","names":[]}
1
+ {"version":3,"sources":["../../src/utils/style.ts"],"sourcesContent":["import { clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\nimport type { ClassValue } from \"clsx\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n\nexport const ROW_SEPARATOR =\n \"not-last:after:content-[''] not-last:after:absolute not-last:after:inset-x-[15px] not-last:after:bottom-0 not-last:after:h-px not-last:after:bg-neutral-200\";\n"],"mappings":"AAAA,SAAS,YAAY;AACrB,SAAS,eAAe;AAGjB,SAAS,MAAM,QAA8B;AAClD,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;AAEO,MAAM,gBACX;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@focus-reactive/payload-plugin-seo",
3
- "version": "1.3.0",
3
+ "version": "1.5.0",
4
4
  "license": "MIT",
5
5
  "author": "FocusReactive <ship@focusreactive.com>",
6
6
  "keywords": [
@@ -37,6 +37,10 @@
37
37
  "import": "./dist/index.js",
38
38
  "types": "./dist/index.d.ts"
39
39
  },
40
+ "./content": {
41
+ "import": "./dist/content/index.js",
42
+ "types": "./dist/content/index.d.ts"
43
+ },
40
44
  "./admin.css": "./dist/admin.css",
41
45
  "./components/SeoButton": {
42
46
  "import": "./dist/components/SeoButton/index.js",
@@ -46,8 +50,10 @@
46
50
  "scripts": {
47
51
  "build": "tsup && tsc --emitDeclarationOnly --declarationMap",
48
52
  "dev": "tsup --watch",
49
- "lint": "eslint src/ tests/",
50
- "lint:fix": "eslint src/ tests/ --fix",
53
+ "lint": "ultracite check",
54
+ "lint:fix": "ultracite fix",
55
+ "format": "ultracite fix",
56
+ "format:check": "ultracite check",
51
57
  "test": "vitest run",
52
58
  "test:watch": "vitest"
53
59
  },
@@ -87,20 +93,16 @@
87
93
  "@types/node": "^25.7.0",
88
94
  "@types/react": "19.2.9",
89
95
  "@types/react-dom": "19.2.3",
90
- "eslint": "^9.18.0",
91
- "eslint-config-prettier": "9.0.0",
92
96
  "lucide-react": "^0.469.0",
93
97
  "next": "15.4.10",
94
98
  "payload": "3.84.1",
95
99
  "postcss": "^8.5.1",
96
100
  "postcss-cli": "^11.0.0",
97
- "prettier": "3.0.0",
98
101
  "react": "^19.0.0",
99
102
  "react-dom": "^19.0.0",
100
103
  "tailwindcss": "^4.0.0",
101
104
  "tsup": "8.0.0",
102
105
  "typescript": "5.7.3",
103
- "typescript-eslint": "^8.20.0",
104
106
  "vitest": "^2.1.8"
105
107
  }
106
108
  }
@@ -1,3 +0,0 @@
1
- import type { SeoFieldPaths } from "../types/config";
2
- export declare function extractContent(data: Record<string, unknown>, fields: SeoFieldPaths): string;
3
- //# sourceMappingURL=extractContent.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extractContent.d.ts","sourceRoot":"","sources":["../../src/content/extractContent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAkBrD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,CAe3F"}
@@ -1,31 +0,0 @@
1
- import { lexicalToHtml } from "./lexicalToHtml";
2
- import { walkValue } from "./walkValue";
3
- function getByPath(data, path) {
4
- return path.split(".").reduce((acc, key) => {
5
- if (acc && typeof acc === "object" && key in acc) {
6
- return acc[key];
7
- }
8
- return void 0;
9
- }, data);
10
- }
11
- function escapeHtml(s) {
12
- return s.replace(/&/gu, "&amp;").replace(/</gu, "&lt;").replace(/>/gu, "&gt;");
13
- }
14
- function extractContent(data, fields) {
15
- if (!fields.content)
16
- return "";
17
- const value = getByPath(data, fields.content);
18
- if (value === void 0 || value === null)
19
- return "";
20
- return walkValue(value).map((fragment) => {
21
- if (fragment.kind === "lexical")
22
- return lexicalToHtml(fragment.value);
23
- if (fragment.kind === "html")
24
- return fragment.value;
25
- return `<p>${escapeHtml(fragment.value)}</p>`;
26
- }).filter(Boolean).join("\n");
27
- }
28
- export {
29
- extractContent
30
- };
31
- //# sourceMappingURL=extractContent.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/content/extractContent.ts"],"sourcesContent":["import type { SeoFieldPaths } from \"../types/config\";\nimport { lexicalToHtml } from \"./lexicalToHtml\";\nimport { walkValue } from \"./walkValue\";\n\nfunction getByPath(data: Record<string, unknown>, path: string): unknown {\n return path.split(\".\").reduce<unknown>((acc, key) => {\n if (acc && typeof acc === \"object\" && key in (acc as Record<string, unknown>)) {\n return (acc as Record<string, unknown>)[key];\n }\n\n return undefined;\n }, data);\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/&/gu, \"&amp;\").replace(/</gu, \"&lt;\").replace(/>/gu, \"&gt;\");\n}\n\nexport function extractContent(data: Record<string, unknown>, fields: SeoFieldPaths): string {\n if (!fields.content) return \"\";\n\n const value = getByPath(data, fields.content);\n if (value === undefined || value === null) return \"\";\n\n return walkValue(value)\n .map((fragment) => {\n if (fragment.kind === \"lexical\") return lexicalToHtml(fragment.value);\n if (fragment.kind === \"html\") return fragment.value;\n\n return `<p>${escapeHtml(fragment.value)}</p>`;\n })\n .filter(Boolean)\n .join(\"\\n\");\n}\n"],"mappings":"AACA,SAAS,qBAAqB;AAC9B,SAAS,iBAAiB;AAE1B,SAAS,UAAU,MAA+B,MAAuB;AACvE,SAAO,KAAK,MAAM,GAAG,EAAE,OAAgB,CAAC,KAAK,QAAQ;AACnD,QAAI,OAAO,OAAO,QAAQ,YAAY,OAAQ,KAAiC;AAC7E,aAAQ,IAAgC,GAAG;AAAA,IAC7C;AAEA,WAAO;AAAA,EACT,GAAG,IAAI;AACT;AAEA,SAAS,WAAW,GAAmB;AACrC,SAAO,EAAE,QAAQ,OAAO,OAAO,EAAE,QAAQ,OAAO,MAAM,EAAE,QAAQ,OAAO,MAAM;AAC/E;AAEO,SAAS,eAAe,MAA+B,QAA+B;AAC3F,MAAI,CAAC,OAAO;AAAS,WAAO;AAE5B,QAAM,QAAQ,UAAU,MAAM,OAAO,OAAO;AAC5C,MAAI,UAAU,UAAa,UAAU;AAAM,WAAO;AAElD,SAAO,UAAU,KAAK,EACnB,IAAI,CAAC,aAAa;AACjB,QAAI,SAAS,SAAS;AAAW,aAAO,cAAc,SAAS,KAAK;AACpE,QAAI,SAAS,SAAS;AAAQ,aAAO,SAAS;AAE9C,WAAO,MAAM,WAAW,SAAS,KAAK,CAAC;AAAA,EACzC,CAAC,EACA,OAAO,OAAO,EACd,KAAK,IAAI;AACd;","names":[]}
@@ -1,5 +0,0 @@
1
- import type { ClientField } from "payload";
2
- import type { UploadWalkContext } from "./transform-upload-values";
3
- import type { UploadRef } from "./types";
4
- export declare function collectUploadRefs(values: Record<string, unknown>, fields: ClientField[], ctx: UploadWalkContext): UploadRef[];
5
- //# sourceMappingURL=collect-upload-refs.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"collect-upload-refs.d.ts","sourceRoot":"","sources":["../../../src/content/uploads/collect-upload-refs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAEnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,iBAAiB,GAAG,SAAS,EAAE,CAe7H"}
@@ -1,19 +0,0 @@
1
- import { transformUploadValues } from "./transform-upload-values";
2
- import { uploadKey } from "./types";
3
- function collectUploadRefs(values, fields, ctx) {
4
- const refs = [];
5
- const seen = /* @__PURE__ */ new Set();
6
- transformUploadValues(values, fields, ctx, (ref) => {
7
- const key = uploadKey(ref);
8
- if (!seen.has(key)) {
9
- seen.add(key);
10
- refs.push(ref);
11
- }
12
- return void 0;
13
- });
14
- return refs;
15
- }
16
- export {
17
- collectUploadRefs
18
- };
19
- //# sourceMappingURL=collect-upload-refs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/content/uploads/collect-upload-refs.ts"],"sourcesContent":["import type { ClientField } from \"payload\";\nimport { transformUploadValues } from \"./transform-upload-values\";\nimport type { UploadWalkContext } from \"./transform-upload-values\";\nimport { uploadKey } from \"./types\";\nimport type { UploadRef } from \"./types\";\n\nexport function collectUploadRefs(values: Record<string, unknown>, fields: ClientField[], ctx: UploadWalkContext): UploadRef[] {\n const refs: UploadRef[] = [];\n const seen = new Set<string>();\n\n transformUploadValues(values, fields, ctx, (ref) => {\n const key = uploadKey(ref);\n if (!seen.has(key)) {\n seen.add(key);\n refs.push(ref);\n }\n\n return undefined;\n });\n\n return refs;\n}\n"],"mappings":"AACA,SAAS,6BAA6B;AAEtC,SAAS,iBAAiB;AAGnB,SAAS,kBAAkB,QAAiC,QAAuB,KAAqC;AAC7H,QAAM,OAAoB,CAAC;AAC3B,QAAM,OAAO,oBAAI,IAAY;AAE7B,wBAAsB,QAAQ,QAAQ,KAAK,CAAC,QAAQ;AAClD,UAAM,MAAM,UAAU,GAAG;AACzB,QAAI,CAAC,KAAK,IAAI,GAAG,GAAG;AAClB,WAAK,IAAI,GAAG;AACZ,WAAK,KAAK,GAAG;AAAA,IACf;AAEA,WAAO;AAAA,EACT,CAAC;AAED,SAAO;AACT;","names":[]}
@@ -1,5 +0,0 @@
1
- import type { ClientField } from "payload";
2
- import type { UploadWalkContext } from "./transform-upload-values";
3
- import type { ResolvedUploadDoc } from "./types";
4
- export declare function hydrateUploadValues(values: Record<string, unknown>, fields: ClientField[], ctx: UploadWalkContext, resolved: Map<string, ResolvedUploadDoc>): Record<string, unknown>;
5
- //# sourceMappingURL=hydrate-values.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hydrate-values.d.ts","sourceRoot":"","sources":["../../../src/content/uploads/hydrate-values.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAEnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAMjD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,iBAAiB,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMrL"}
@@ -1,15 +0,0 @@
1
- import { transformUploadValues } from "./transform-upload-values";
2
- import { uploadKey } from "./types";
3
- function isRenderable(doc) {
4
- return typeof doc.url === "string" && typeof doc.mimeType === "string";
5
- }
6
- function hydrateUploadValues(values, fields, ctx, resolved) {
7
- return transformUploadValues(values, fields, ctx, (ref) => {
8
- const doc = resolved.get(uploadKey(ref));
9
- return doc && isRenderable(doc) ? doc : null;
10
- });
11
- }
12
- export {
13
- hydrateUploadValues
14
- };
15
- //# sourceMappingURL=hydrate-values.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/content/uploads/hydrate-values.ts"],"sourcesContent":["import type { ClientField } from \"payload\";\nimport { transformUploadValues } from \"./transform-upload-values\";\nimport type { UploadWalkContext } from \"./transform-upload-values\";\nimport { uploadKey } from \"./types\";\nimport type { ResolvedUploadDoc } from \"./types\";\n\nfunction isRenderable(doc: ResolvedUploadDoc): boolean {\n return typeof doc.url === \"string\" && typeof doc.mimeType === \"string\";\n}\n\nexport function hydrateUploadValues(values: Record<string, unknown>, fields: ClientField[], ctx: UploadWalkContext, resolved: Map<string, ResolvedUploadDoc>): Record<string, unknown> {\n return transformUploadValues(values, fields, ctx, (ref) => {\n const doc = resolved.get(uploadKey(ref));\n\n return doc && isRenderable(doc) ? doc : null;\n });\n}\n"],"mappings":"AACA,SAAS,6BAA6B;AAEtC,SAAS,iBAAiB;AAG1B,SAAS,aAAa,KAAiC;AACrD,SAAO,OAAO,IAAI,QAAQ,YAAY,OAAO,IAAI,aAAa;AAChE;AAEO,SAAS,oBAAoB,QAAiC,QAAuB,KAAwB,UAAmE;AACrL,SAAO,sBAAsB,QAAQ,QAAQ,KAAK,CAAC,QAAQ;AACzD,UAAM,MAAM,SAAS,IAAI,UAAU,GAAG,CAAC;AAEvC,WAAO,OAAO,aAAa,GAAG,IAAI,MAAM;AAAA,EAC1C,CAAC;AACH;","names":[]}
@@ -1,7 +0,0 @@
1
- import type { ResolvedUploadDoc, UploadRef } from "./types";
2
- export interface MediaResolver {
3
- resolve: (refs: UploadRef[], locale: string | undefined) => Promise<Map<string, ResolvedUploadDoc>>;
4
- invalidate: () => void;
5
- }
6
- export declare function createMediaResolver(apiRoute: string): MediaResolver;
7
- //# sourceMappingURL=media-resolver.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"media-resolver.d.ts","sourceRoot":"","sources":["../../../src/content/uploads/media-resolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACpG,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAwBD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAyCnE"}
@@ -1,60 +0,0 @@
1
- import { uploadKey } from "./types";
2
- async function fetchDocs(apiRoute, collection, ids, locale) {
3
- const params = new URLSearchParams({ depth: "0", limit: String(ids.length) });
4
- if (locale)
5
- params.set("locale", locale);
6
- ids.forEach((id, i) => params.set(`where[id][in][${i}]`, String(id)));
7
- try {
8
- const res = await fetch(`${apiRoute}/${collection}?${params.toString()}`, {
9
- credentials: "include"
10
- });
11
- if (!res.ok)
12
- return /* @__PURE__ */ new Map();
13
- const body = await res.json();
14
- return new Map((body.docs ?? []).filter((d) => d.id !== void 0 && d.id !== null).map((d) => [String(d.id), d]));
15
- } catch {
16
- return /* @__PURE__ */ new Map();
17
- }
18
- }
19
- function createMediaResolver(apiRoute) {
20
- const cache = /* @__PURE__ */ new Map();
21
- const cacheKey = (ref, locale) => `${uploadKey(ref)}:${locale ?? ""}`;
22
- return {
23
- async resolve(refs, locale) {
24
- const missing = refs.filter((ref) => !cache.has(cacheKey(ref, locale)));
25
- const byCollection = /* @__PURE__ */ new Map();
26
- for (const ref of missing) {
27
- const group = byCollection.get(ref.collection) ?? [];
28
- group.push(ref);
29
- byCollection.set(ref.collection, group);
30
- }
31
- await Promise.all(
32
- [...byCollection.entries()].map(async ([collection, group]) => {
33
- const docs = await fetchDocs(
34
- apiRoute,
35
- collection,
36
- group.map((r) => r.id),
37
- locale
38
- );
39
- for (const ref of group) {
40
- cache.set(cacheKey(ref, locale), docs.get(String(ref.id)) ?? null);
41
- }
42
- })
43
- );
44
- const out = /* @__PURE__ */ new Map();
45
- for (const ref of refs) {
46
- const doc = cache.get(cacheKey(ref, locale));
47
- if (doc)
48
- out.set(uploadKey(ref), doc);
49
- }
50
- return out;
51
- },
52
- invalidate() {
53
- cache.clear();
54
- }
55
- };
56
- }
57
- export {
58
- createMediaResolver
59
- };
60
- //# sourceMappingURL=media-resolver.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/content/uploads/media-resolver.ts"],"sourcesContent":["import { uploadKey } from \"./types\";\nimport type { ResolvedUploadDoc, UploadRef } from \"./types\";\n\nexport interface MediaResolver {\n resolve: (refs: UploadRef[], locale: string | undefined) => Promise<Map<string, ResolvedUploadDoc>>;\n invalidate: () => void;\n}\n\ninterface FindResponse {\n docs?: Array<ResolvedUploadDoc & { id?: unknown }>;\n}\n\nasync function fetchDocs(apiRoute: string, collection: string, ids: Array<string | number>, locale: string | undefined): Promise<Map<string, ResolvedUploadDoc>> {\n const params = new URLSearchParams({ depth: \"0\", limit: String(ids.length) });\n if (locale) params.set(\"locale\", locale);\n ids.forEach((id, i) => params.set(`where[id][in][${i}]`, String(id)));\n\n try {\n const res = await fetch(`${apiRoute}/${collection}?${params.toString()}`, {\n credentials: \"include\",\n });\n if (!res.ok) return new Map();\n const body = (await res.json()) as FindResponse;\n\n return new Map((body.docs ?? []).filter((d) => d.id !== undefined && d.id !== null).map((d) => [String(d.id), d]));\n } catch {\n return new Map();\n }\n}\n\nexport function createMediaResolver(apiRoute: string): MediaResolver {\n const cache = new Map<string, ResolvedUploadDoc | null>();\n const cacheKey = (ref: UploadRef, locale: string | undefined) => `${uploadKey(ref)}:${locale ?? \"\"}`;\n\n return {\n async resolve(refs, locale) {\n const missing = refs.filter((ref) => !cache.has(cacheKey(ref, locale)));\n\n const byCollection = new Map<string, UploadRef[]>();\n for (const ref of missing) {\n const group = byCollection.get(ref.collection) ?? [];\n group.push(ref);\n byCollection.set(ref.collection, group);\n }\n\n await Promise.all(\n [...byCollection.entries()].map(async ([collection, group]) => {\n const docs = await fetchDocs(\n apiRoute,\n collection,\n group.map((r) => r.id),\n locale\n );\n for (const ref of group) {\n cache.set(cacheKey(ref, locale), docs.get(String(ref.id)) ?? null);\n }\n })\n );\n\n const out = new Map<string, ResolvedUploadDoc>();\n for (const ref of refs) {\n const doc = cache.get(cacheKey(ref, locale));\n if (doc) out.set(uploadKey(ref), doc);\n }\n\n return out;\n },\n invalidate() {\n cache.clear();\n },\n };\n}\n"],"mappings":"AAAA,SAAS,iBAAiB;AAY1B,eAAe,UAAU,UAAkB,YAAoB,KAA6B,QAAqE;AAC/J,QAAM,SAAS,IAAI,gBAAgB,EAAE,OAAO,KAAK,OAAO,OAAO,IAAI,MAAM,EAAE,CAAC;AAC5E,MAAI;AAAQ,WAAO,IAAI,UAAU,MAAM;AACvC,MAAI,QAAQ,CAAC,IAAI,MAAM,OAAO,IAAI,iBAAiB,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;AAEpE,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,GAAG,QAAQ,IAAI,UAAU,IAAI,OAAO,SAAS,CAAC,IAAI;AAAA,MACxE,aAAa;AAAA,IACf,CAAC;AACD,QAAI,CAAC,IAAI;AAAI,aAAO,oBAAI,IAAI;AAC5B,UAAM,OAAQ,MAAM,IAAI,KAAK;AAE7B,WAAO,IAAI,KAAK,KAAK,QAAQ,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,UAAa,EAAE,OAAO,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,EACnH,QAAQ;AACN,WAAO,oBAAI,IAAI;AAAA,EACjB;AACF;AAEO,SAAS,oBAAoB,UAAiC;AACnE,QAAM,QAAQ,oBAAI,IAAsC;AACxD,QAAM,WAAW,CAAC,KAAgB,WAA+B,GAAG,UAAU,GAAG,CAAC,IAAI,UAAU,EAAE;AAElG,SAAO;AAAA,IACL,MAAM,QAAQ,MAAM,QAAQ;AAC1B,YAAM,UAAU,KAAK,OAAO,CAAC,QAAQ,CAAC,MAAM,IAAI,SAAS,KAAK,MAAM,CAAC,CAAC;AAEtE,YAAM,eAAe,oBAAI,IAAyB;AAClD,iBAAW,OAAO,SAAS;AACzB,cAAM,QAAQ,aAAa,IAAI,IAAI,UAAU,KAAK,CAAC;AACnD,cAAM,KAAK,GAAG;AACd,qBAAa,IAAI,IAAI,YAAY,KAAK;AAAA,MACxC;AAEA,YAAM,QAAQ;AAAA,QACZ,CAAC,GAAG,aAAa,QAAQ,CAAC,EAAE,IAAI,OAAO,CAAC,YAAY,KAAK,MAAM;AAC7D,gBAAM,OAAO,MAAM;AAAA,YACjB;AAAA,YACA;AAAA,YACA,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,YACrB;AAAA,UACF;AACA,qBAAW,OAAO,OAAO;AACvB,kBAAM,IAAI,SAAS,KAAK,MAAM,GAAG,KAAK,IAAI,OAAO,IAAI,EAAE,CAAC,KAAK,IAAI;AAAA,UACnE;AAAA,QACF,CAAC;AAAA,MACH;AAEA,YAAM,MAAM,oBAAI,IAA+B;AAC/C,iBAAW,OAAO,MAAM;AACtB,cAAM,MAAM,MAAM,IAAI,SAAS,KAAK,MAAM,CAAC;AAC3C,YAAI;AAAK,cAAI,IAAI,UAAU,GAAG,GAAG,GAAG;AAAA,MACtC;AAEA,aAAO;AAAA,IACT;AAAA,IACA,aAAa;AACX,YAAM,MAAM;AAAA,IACd;AAAA,EACF;AACF;","names":[]}
@@ -1,5 +0,0 @@
1
- import type { UploadTransform } from "./types";
2
- export declare function transformLexicalUploads<T extends {
3
- root?: unknown;
4
- }>(value: T, transform: UploadTransform): T;
5
- //# sourceMappingURL=transform-lexical-uploads.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transform-lexical-uploads.d.ts","sourceRoot":"","sources":["../../../src/content/uploads/transform-lexical-uploads.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,eAAe,EAAE,MAAM,SAAS,CAAC;AAwC1D,wBAAgB,uBAAuB,CAAC,CAAC,SAAS;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,eAAe,GAAG,CAAC,CAI7G"}