@focus-reactive/payload-plugin-seo 1.2.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 +12 -9
  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 +9 -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
package/dist/plugin.js CHANGED
@@ -3,14 +3,21 @@ import { PLUGIN_NAME } from "./constants";
3
3
  import { overrideAdmin } from "./utils/config/overrideAdmin";
4
4
  import { mergeTranslations } from "./utils/config/mergeTranslations";
5
5
  import { en } from "./translations/en";
6
+ const PREFIX = `[${PLUGIN_NAME}]`;
6
7
  const seoPlugin = (config) => (incomingConfig) => {
7
8
  if (config.disabled)
8
9
  return incomingConfig;
9
10
  if (!config.collections?.length) {
10
- throw new Error(`[${PLUGIN_NAME}] config.collections must list at least one collection slug`);
11
+ console.warn(
12
+ `${PREFIX} Disabled: config.collections must list at least one collection slug. Plugin not registered.`
13
+ );
14
+ return incomingConfig;
11
15
  }
12
16
  setPluginConfig(config);
13
- const merged = mergeTranslations(incomingConfig.i18n?.translations ?? {}, mergeTranslations(en, config.translations ?? {}));
17
+ const merged = mergeTranslations(
18
+ incomingConfig.i18n?.translations ?? {},
19
+ mergeTranslations(en, config.translations ?? {})
20
+ );
14
21
  const withTranslations = {
15
22
  ...incomingConfig,
16
23
  i18n: { ...incomingConfig.i18n, translations: merged }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/plugin.ts"],"sourcesContent":["import type { Config, Plugin } from \"payload\";\nimport { setPluginConfig } from \"./config\";\nimport { PLUGIN_NAME } from \"./constants\";\nimport type { SeoPluginConfig } from \"./types/config\";\nimport { overrideAdmin } from \"./utils/config/overrideAdmin\";\nimport { mergeTranslations } from \"./utils/config/mergeTranslations\";\nimport { en } from \"./translations/en\";\n\nexport const seoPlugin =\n (config: SeoPluginConfig): Plugin =>\n (incomingConfig: Config): Config => {\n if (config.disabled) return incomingConfig;\n\n if (!config.collections?.length) {\n throw new Error(`[${PLUGIN_NAME}] config.collections must list at least one collection slug`);\n }\n\n setPluginConfig(config);\n\n const merged = mergeTranslations((incomingConfig.i18n?.translations as never) ?? {}, mergeTranslations(en, config.translations ?? {}));\n\n const withTranslations: Config = {\n ...incomingConfig,\n i18n: { ...incomingConfig.i18n, translations: merged as never },\n };\n\n return overrideAdmin(withTranslations, config);\n };\n"],"mappings":"AACA,SAAS,uBAAuB;AAChC,SAAS,mBAAmB;AAE5B,SAAS,qBAAqB;AAC9B,SAAS,yBAAyB;AAClC,SAAS,UAAU;AAEZ,MAAM,YACX,CAAC,WACD,CAAC,mBAAmC;AAClC,MAAI,OAAO;AAAU,WAAO;AAE5B,MAAI,CAAC,OAAO,aAAa,QAAQ;AAC/B,UAAM,IAAI,MAAM,IAAI,WAAW,6DAA6D;AAAA,EAC9F;AAEA,kBAAgB,MAAM;AAEtB,QAAM,SAAS,kBAAmB,eAAe,MAAM,gBAA0B,CAAC,GAAG,kBAAkB,IAAI,OAAO,gBAAgB,CAAC,CAAC,CAAC;AAErI,QAAM,mBAA2B;AAAA,IAC/B,GAAG;AAAA,IACH,MAAM,EAAE,GAAG,eAAe,MAAM,cAAc,OAAgB;AAAA,EAChE;AAEA,SAAO,cAAc,kBAAkB,MAAM;AAC/C;","names":[]}
1
+ {"version":3,"sources":["../src/plugin.ts"],"sourcesContent":["import type { Config, Plugin } from \"payload\";\nimport { setPluginConfig } from \"./config\";\nimport { PLUGIN_NAME } from \"./constants\";\nimport type { SeoPluginConfig } from \"./types/config\";\nimport { overrideAdmin } from \"./utils/config/overrideAdmin\";\nimport { mergeTranslations } from \"./utils/config/mergeTranslations\";\nimport { en } from \"./translations/en\";\n\nconst PREFIX = `[${PLUGIN_NAME}]`;\n\nexport const seoPlugin =\n (config: SeoPluginConfig): Plugin =>\n (incomingConfig: Config): Config => {\n if (config.disabled) return incomingConfig;\n\n if (!config.collections?.length) {\n console.warn(\n `${PREFIX} Disabled: config.collections must list at least one collection slug. Plugin not registered.`\n );\n return incomingConfig;\n }\n\n setPluginConfig(config);\n\n const merged = mergeTranslations(\n (incomingConfig.i18n?.translations as never) ?? {},\n mergeTranslations(en, config.translations ?? {})\n );\n\n const withTranslations: Config = {\n ...incomingConfig,\n i18n: { ...incomingConfig.i18n, translations: merged as never },\n };\n\n return overrideAdmin(withTranslations, config);\n };\n"],"mappings":"AACA,SAAS,uBAAuB;AAChC,SAAS,mBAAmB;AAE5B,SAAS,qBAAqB;AAC9B,SAAS,yBAAyB;AAClC,SAAS,UAAU;AAEnB,MAAM,SAAS,IAAI,WAAW;AAEvB,MAAM,YACX,CAAC,WACD,CAAC,mBAAmC;AAClC,MAAI,OAAO;AAAU,WAAO;AAE5B,MAAI,CAAC,OAAO,aAAa,QAAQ;AAC/B,YAAQ;AAAA,MACN,GAAG,MAAM;AAAA,IACX;AACA,WAAO;AAAA,EACT;AAEA,kBAAgB,MAAM;AAEtB,QAAM,SAAS;AAAA,IACZ,eAAe,MAAM,gBAA0B,CAAC;AAAA,IACjD,kBAAkB,IAAI,OAAO,gBAAgB,CAAC,CAAC;AAAA,EACjD;AAEA,QAAM,mBAA2B;AAAA,IAC/B,GAAG;AAAA,IACH,MAAM,EAAE,GAAG,eAAe,MAAM,cAAc,OAAgB;AAAA,EAChE;AAEA,SAAO,cAAc,kBAAkB,MAAM;AAC/C;","names":[]}
@@ -1,6 +1,21 @@
1
+ import type { ContentNode } from "../content/schema/nodes";
1
2
  import type { Translations } from "../translations/types";
2
- /** Client extractor: receives raw (unhydrated) form values, returns analyzed HTML. */
3
- export type ExtractorFn = (data: Record<string, unknown>) => string | Promise<string>;
3
+ /** Runtime context handed to a content extractor so it can resolve references and locale-correct hrefs. */
4
+ export interface ExtractContext {
5
+ /** Payload locale code (e.g. "en", "es"); absent → extractor falls back to its own default. */
6
+ locale?: string;
7
+ /** Payload REST API route (e.g. "/api") for client-side reference fetches. */
8
+ apiRoute?: string;
9
+ }
10
+ /** Client extractor: receives hydrated, unflattened form values + runtime context, returns the content schema (Intermediate Representation). */
11
+ export type ContentExtractor = (values: Record<string, unknown>, ctx?: ExtractContext) => ContentNode[] | Promise<ContentNode[]>;
12
+ /** Which parts of the document the built-in extractor walks. */
13
+ export interface ContentSelection {
14
+ /** Dot-paths to walk, in order. Omitted or empty = whole document root. */
15
+ include?: string[];
16
+ /** Dot-paths to skip (merged with auto-excluded seoTitle/metaDescription/slug). */
17
+ exclude?: string[];
18
+ }
4
19
  export interface SeoFieldPaths {
5
20
  /** Dot-path to the SEO title. Falls back to the collection useAsTitle / `title` if absent. */
6
21
  seoTitle?: string;
@@ -11,18 +26,26 @@ export interface SeoFieldPaths {
11
26
  * @default "slug"
12
27
  */
13
28
  slug?: string;
14
- /** Dot-path to the primary content field (blocks/richText/textarea). */
15
- content?: string;
29
+ /**
30
+ * Built-in content selection. A string is a single field path.
31
+ * An object selects include/exclude paths over the whole document.
32
+ * Ignored when `extractContentPath` is set and registered.
33
+ */
34
+ content?: string | ContentSelection;
16
35
  }
17
36
  export interface SeoCollectionConfig {
18
37
  slug: string;
19
38
  fields?: SeoFieldPaths;
20
39
  /**
21
- * importMap module-path string to a client extractor `(formData) => string | Promise<string>` (HTML).
22
- * Example: "@/seo/my-extractor#default".
23
- * @default built-in smart extractor
40
+ * importMap path string used as the lookup key for a registered ContentExtractor (returns ContentNode[]).
41
+ * Register the function via registerContentExtractors from "@focus-reactive/payload-plugin-seo/content".
24
42
  */
25
43
  extractContentPath?: string;
44
+ /**
45
+ * Depth of nested relation/upload resolution for the built-in extractor.
46
+ * @default 2
47
+ */
48
+ resolveDepth?: number;
26
49
  }
27
50
  export interface SeoSiteConfig {
28
51
  name?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,sFAAsF;AACtF,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAEtF,MAAM,WAAW,aAAa;IAC5B,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yGAAyG;IACzG,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,mBAAmB,EAAE,CAAC;IACnC,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,2GAA2G;AAC3G,MAAM,WAAW,cAAc;IAC7B,+FAA+F;IAC/F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,gJAAgJ;AAChJ,MAAM,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE,cAAc,KAAK,WAAW,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;AAEjI,gEAAgE;AAChE,MAAM,WAAW,gBAAgB;IAC/B,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,mFAAmF;IACnF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yGAAyG;IACzG,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;CACrC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,mBAAmB,EAAE,CAAC;IACnC,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B"}
@@ -1 +1 @@
1
- {"version":3,"file":"DensityGauge.d.ts","sourceRoot":"","sources":["../../../../../src/ui/CheckRow/CheckVisualization/visualizations/DensityGauge.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAEzE,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,UAAU,2CAoE/F"}
1
+ {"version":3,"file":"DensityGauge.d.ts","sourceRoot":"","sources":["../../../../../src/ui/CheckRow/CheckVisualization/visualizations/DensityGauge.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAEzE,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,UAAU,2CAkG/F"}
@@ -11,7 +11,10 @@ function DensityGauge({ bands, markerPct, markerLabel, markerStatus, labels }) {
11
11
  const halfLabel = dims.label / 2;
12
12
  const labelAlign = dims.label === 0 ? "-translate-x-1/2" : markerPx < halfLabel ? "translate-x-0" : markerPx > dims.bar - halfLabel ? "-translate-x-full" : "-translate-x-1/2";
13
13
  const firstVisibleBand = bands.findIndex((band) => band.endPct > band.startPct);
14
- const lastVisibleBand = bands.reduce((acc, band, i) => band.endPct > band.startPct ? i : acc, -1);
14
+ const lastVisibleBand = bands.reduce(
15
+ (acc, band, i) => band.endPct > band.startPct ? i : acc,
16
+ -1
17
+ );
15
18
  useLayoutEffect(() => {
16
19
  const bar = barRef.current;
17
20
  const label = labelRef.current;
@@ -29,7 +32,12 @@ function DensityGauge({ bands, markerPct, markerLabel, markerStatus, labels }) {
29
32
  bands.map((band, i) => /* @__PURE__ */ jsx(
30
33
  "i",
31
34
  {
32
- className: cn("absolute inset-y-0", statusVar({ status: band.status }), i === firstVisibleBand && "rounded-l-[3px]", i === lastVisibleBand && "rounded-r-[3px]"),
35
+ className: cn(
36
+ "absolute inset-y-0",
37
+ statusVar({ status: band.status }),
38
+ i === firstVisibleBand && "rounded-l-[3px]",
39
+ i === lastVisibleBand && "rounded-r-[3px]"
40
+ ),
33
41
  style: {
34
42
  left: `${band.startPct}%`,
35
43
  width: `${band.endPct - band.startPct}%`,
@@ -42,7 +50,11 @@ function DensityGauge({ bands, markerPct, markerLabel, markerStatus, labels }) {
42
50
  "span",
43
51
  {
44
52
  ref: labelRef,
45
- className: cn("absolute bottom-[13px] font-mono font-bold text-[11px] whitespace-nowrap", statusVar({ status: markerStatus }), labelAlign),
53
+ className: cn(
54
+ "absolute bottom-[13px] font-mono font-bold text-[11px] whitespace-nowrap",
55
+ statusVar({ status: markerStatus }),
56
+ labelAlign
57
+ ),
46
58
  style: { left: `${markerPct}%`, color: "var(--seo-c)" },
47
59
  children: markerLabel
48
60
  }
@@ -50,7 +62,10 @@ function DensityGauge({ bands, markerPct, markerLabel, markerStatus, labels }) {
50
62
  /* @__PURE__ */ jsx(
51
63
  "span",
52
64
  {
53
- className: cn("absolute -top-[3px] -translate-x-1/2 block w-[12px] h-[12px] rounded-full bg-neutral-0 border-2", statusVar({ status: markerStatus })),
65
+ className: cn(
66
+ "absolute -top-[3px] -translate-x-1/2 block w-[12px] h-[12px] rounded-full bg-neutral-0 border-2",
67
+ statusVar({ status: markerStatus })
68
+ ),
54
69
  style: { left: `${markerPct}%`, borderColor: "var(--seo-c)" }
55
70
  }
56
71
  )
@@ -58,7 +73,11 @@ function DensityGauge({ bands, markerPct, markerLabel, markerStatus, labels }) {
58
73
  /* @__PURE__ */ jsx("div", { className: "relative h-[14px] text-[10px] text-neutral-500", children: labels.map((label, i) => /* @__PURE__ */ jsx(
59
74
  "span",
60
75
  {
61
- className: cn("absolute whitespace-nowrap", label.pct <= 0 ? "translate-x-0" : label.pct >= 100 ? "-translate-x-full" : "-translate-x-1/2", label.emphasis === "good" && "text-seo-good"),
76
+ className: cn(
77
+ "absolute whitespace-nowrap",
78
+ label.pct <= 0 ? "translate-x-0" : label.pct >= 100 ? "-translate-x-full" : "-translate-x-1/2",
79
+ label.emphasis === "good" && "text-seo-good"
80
+ ),
62
81
  style: { left: `${label.pct}%` },
63
82
  children: label.text
64
83
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/ui/CheckRow/CheckVisualization/visualizations/DensityGauge.tsx"],"sourcesContent":["\"use client\";\n\nimport { useLayoutEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../../../utils/style\";\nimport { statusVar } from \"../../../../components/SeoDrawer/variants\";\nimport type { GaugeModel } from \"../../../../engine/types/visualization\";\n\nexport function DensityGauge({ bands, markerPct, markerLabel, markerStatus, labels }: GaugeModel) {\n const barRef = useRef<HTMLDivElement>(null);\n const labelRef = useRef<HTMLSpanElement>(null);\n const [dims, setDims] = useState({ bar: 0, label: 0 });\n\n const markerPx = (markerPct / 100) * dims.bar;\n const halfLabel = dims.label / 2;\n const labelAlign = dims.label === 0 ? \"-translate-x-1/2\" : markerPx < halfLabel ? \"translate-x-0\" : markerPx > dims.bar - halfLabel ? \"-translate-x-full\" : \"-translate-x-1/2\";\n\n const firstVisibleBand = bands.findIndex((band) => band.endPct > band.startPct);\n const lastVisibleBand = bands.reduce((acc, band, i) => (band.endPct > band.startPct ? i : acc), -1);\n\n useLayoutEffect(() => {\n const bar = barRef.current;\n const label = labelRef.current;\n\n if (!(bar && label)) return;\n\n const measure = () => setDims({ bar: bar.offsetWidth, label: label.offsetWidth });\n\n const observer = new ResizeObserver(measure);\n\n measure();\n observer.observe(bar);\n observer.observe(label);\n\n return () => observer.disconnect();\n }, []);\n\n return (\n <>\n <div ref={barRef} className=\"relative h-[6px] rounded-[3px] mt-[24px] mb-[14px]\">\n {bands.map((band, i) => (\n <i\n key={`${band.status}-${i}`}\n className={cn(\"absolute inset-y-0\", statusVar({ status: band.status }), i === firstVisibleBand && \"rounded-l-[3px]\", i === lastVisibleBand && \"rounded-r-[3px]\")}\n style={{\n left: `${band.startPct}%`,\n width: `${band.endPct - band.startPct}%`,\n background: \"var(--seo-c)\",\n }}\n />\n ))}\n <span\n ref={labelRef}\n className={cn(\"absolute bottom-[13px] font-mono font-bold text-[11px] whitespace-nowrap\", statusVar({ status: markerStatus }), labelAlign)}\n style={{ left: `${markerPct}%`, color: \"var(--seo-c)\" }}\n >\n {markerLabel}\n </span>\n <span\n className={cn(\"absolute -top-[3px] -translate-x-1/2 block w-[12px] h-[12px] rounded-full bg-neutral-0 border-2\", statusVar({ status: markerStatus }))}\n style={{ left: `${markerPct}%`, borderColor: \"var(--seo-c)\" }}\n />\n </div>\n <div className=\"relative h-[14px] text-[10px] text-neutral-500\">\n {labels.map((label, i) => (\n <span\n key={`${label.text}-${i}`}\n className={cn(\"absolute whitespace-nowrap\", label.pct <= 0 ? \"translate-x-0\" : label.pct >= 100 ? \"-translate-x-full\" : \"-translate-x-1/2\", label.emphasis === \"good\" && \"text-seo-good\")}\n style={{ left: `${label.pct}%` }}\n >\n {label.text}\n </span>\n ))}\n </div>\n </>\n );\n}\n"],"mappings":";AAqCI,mBAGM,KAFJ,YADF;AAnCJ,SAAS,iBAAiB,QAAQ,gBAAgB;AAClD,SAAS,UAAU;AACnB,SAAS,iBAAiB;AAGnB,SAAS,aAAa,EAAE,OAAO,WAAW,aAAa,cAAc,OAAO,GAAe;AAChG,QAAM,SAAS,OAAuB,IAAI;AAC1C,QAAM,WAAW,OAAwB,IAAI;AAC7C,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,EAAE,KAAK,GAAG,OAAO,EAAE,CAAC;AAErD,QAAM,WAAY,YAAY,MAAO,KAAK;AAC1C,QAAM,YAAY,KAAK,QAAQ;AAC/B,QAAM,aAAa,KAAK,UAAU,IAAI,qBAAqB,WAAW,YAAY,kBAAkB,WAAW,KAAK,MAAM,YAAY,sBAAsB;AAE5J,QAAM,mBAAmB,MAAM,UAAU,CAAC,SAAS,KAAK,SAAS,KAAK,QAAQ;AAC9E,QAAM,kBAAkB,MAAM,OAAO,CAAC,KAAK,MAAM,MAAO,KAAK,SAAS,KAAK,WAAW,IAAI,KAAM,EAAE;AAElG,kBAAgB,MAAM;AACpB,UAAM,MAAM,OAAO;AACnB,UAAM,QAAQ,SAAS;AAEvB,QAAI,EAAE,OAAO;AAAQ;AAErB,UAAM,UAAU,MAAM,QAAQ,EAAE,KAAK,IAAI,aAAa,OAAO,MAAM,YAAY,CAAC;AAEhF,UAAM,WAAW,IAAI,eAAe,OAAO;AAE3C,YAAQ;AACR,aAAS,QAAQ,GAAG;AACpB,aAAS,QAAQ,KAAK;AAEtB,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,CAAC;AAEL,SACE,iCACE;AAAA,yBAAC,SAAI,KAAK,QAAQ,WAAU,sDACzB;AAAA,YAAM,IAAI,CAAC,MAAM,MAChB;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW,GAAG,sBAAsB,UAAU,EAAE,QAAQ,KAAK,OAAO,CAAC,GAAG,MAAM,oBAAoB,mBAAmB,MAAM,mBAAmB,iBAAiB;AAAA,UAC/J,OAAO;AAAA,YACL,MAAM,GAAG,KAAK,QAAQ;AAAA,YACtB,OAAO,GAAG,KAAK,SAAS,KAAK,QAAQ;AAAA,YACrC,YAAY;AAAA,UACd;AAAA;AAAA,QANK,GAAG,KAAK,MAAM,IAAI,CAAC;AAAA,MAO1B,CACD;AAAA,MACD;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,WAAW,GAAG,4EAA4E,UAAU,EAAE,QAAQ,aAAa,CAAC,GAAG,UAAU;AAAA,UACzI,OAAO,EAAE,MAAM,GAAG,SAAS,KAAK,OAAO,eAAe;AAAA,UAErD;AAAA;AAAA,MACH;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,GAAG,mGAAmG,UAAU,EAAE,QAAQ,aAAa,CAAC,CAAC;AAAA,UACpJ,OAAO,EAAE,MAAM,GAAG,SAAS,KAAK,aAAa,eAAe;AAAA;AAAA,MAC9D;AAAA,OACF;AAAA,IACA,oBAAC,SAAI,WAAU,kDACZ,iBAAO,IAAI,CAAC,OAAO,MAClB;AAAA,MAAC;AAAA;AAAA,QAEC,WAAW,GAAG,8BAA8B,MAAM,OAAO,IAAI,kBAAkB,MAAM,OAAO,MAAM,sBAAsB,oBAAoB,MAAM,aAAa,UAAU,eAAe;AAAA,QACxL,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;AAAA,QAE9B,gBAAM;AAAA;AAAA,MAJF,GAAG,MAAM,IAAI,IAAI,CAAC;AAAA,IAKzB,CACD,GACH;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/ui/CheckRow/CheckVisualization/visualizations/DensityGauge.tsx"],"sourcesContent":["\"use client\";\n\nimport { useLayoutEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../../../utils/style\";\nimport { statusVar } from \"../../../../components/SeoDrawer/variants\";\nimport type { GaugeModel } from \"../../../../engine/types/visualization\";\n\nexport function DensityGauge({ bands, markerPct, markerLabel, markerStatus, labels }: GaugeModel) {\n const barRef = useRef<HTMLDivElement>(null);\n const labelRef = useRef<HTMLSpanElement>(null);\n const [dims, setDims] = useState({ bar: 0, label: 0 });\n\n const markerPx = (markerPct / 100) * dims.bar;\n const halfLabel = dims.label / 2;\n const labelAlign =\n dims.label === 0\n ? \"-translate-x-1/2\"\n : markerPx < halfLabel\n ? \"translate-x-0\"\n : markerPx > dims.bar - halfLabel\n ? \"-translate-x-full\"\n : \"-translate-x-1/2\";\n\n const firstVisibleBand = bands.findIndex((band) => band.endPct > band.startPct);\n const lastVisibleBand = bands.reduce(\n (acc, band, i) => (band.endPct > band.startPct ? i : acc),\n -1\n );\n\n useLayoutEffect(() => {\n const bar = barRef.current;\n const label = labelRef.current;\n\n if (!(bar && label)) return;\n\n const measure = () => setDims({ bar: bar.offsetWidth, label: label.offsetWidth });\n\n const observer = new ResizeObserver(measure);\n\n measure();\n observer.observe(bar);\n observer.observe(label);\n\n return () => observer.disconnect();\n }, []);\n\n return (\n <>\n <div ref={barRef} className=\"relative h-[6px] rounded-[3px] mt-[24px] mb-[14px]\">\n {bands.map((band, i) => (\n <i\n key={`${band.status}-${i}`}\n className={cn(\n \"absolute inset-y-0\",\n statusVar({ status: band.status }),\n i === firstVisibleBand && \"rounded-l-[3px]\",\n i === lastVisibleBand && \"rounded-r-[3px]\"\n )}\n style={{\n left: `${band.startPct}%`,\n width: `${band.endPct - band.startPct}%`,\n background: \"var(--seo-c)\",\n }}\n />\n ))}\n <span\n ref={labelRef}\n className={cn(\n \"absolute bottom-[13px] font-mono font-bold text-[11px] whitespace-nowrap\",\n statusVar({ status: markerStatus }),\n labelAlign\n )}\n style={{ left: `${markerPct}%`, color: \"var(--seo-c)\" }}\n >\n {markerLabel}\n </span>\n <span\n className={cn(\n \"absolute -top-[3px] -translate-x-1/2 block w-[12px] h-[12px] rounded-full bg-neutral-0 border-2\",\n statusVar({ status: markerStatus })\n )}\n style={{ left: `${markerPct}%`, borderColor: \"var(--seo-c)\" }}\n />\n </div>\n <div className=\"relative h-[14px] text-[10px] text-neutral-500\">\n {labels.map((label, i) => (\n <span\n key={`${label.text}-${i}`}\n className={cn(\n \"absolute whitespace-nowrap\",\n label.pct <= 0\n ? \"translate-x-0\"\n : label.pct >= 100\n ? \"-translate-x-full\"\n : \"-translate-x-1/2\",\n label.emphasis === \"good\" && \"text-seo-good\"\n )}\n style={{ left: `${label.pct}%` }}\n >\n {label.text}\n </span>\n ))}\n </div>\n </>\n );\n}\n"],"mappings":";AA+CI,mBAGM,KAFJ,YADF;AA7CJ,SAAS,iBAAiB,QAAQ,gBAAgB;AAClD,SAAS,UAAU;AACnB,SAAS,iBAAiB;AAGnB,SAAS,aAAa,EAAE,OAAO,WAAW,aAAa,cAAc,OAAO,GAAe;AAChG,QAAM,SAAS,OAAuB,IAAI;AAC1C,QAAM,WAAW,OAAwB,IAAI;AAC7C,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,EAAE,KAAK,GAAG,OAAO,EAAE,CAAC;AAErD,QAAM,WAAY,YAAY,MAAO,KAAK;AAC1C,QAAM,YAAY,KAAK,QAAQ;AAC/B,QAAM,aACJ,KAAK,UAAU,IACX,qBACA,WAAW,YACT,kBACA,WAAW,KAAK,MAAM,YACpB,sBACA;AAEV,QAAM,mBAAmB,MAAM,UAAU,CAAC,SAAS,KAAK,SAAS,KAAK,QAAQ;AAC9E,QAAM,kBAAkB,MAAM;AAAA,IAC5B,CAAC,KAAK,MAAM,MAAO,KAAK,SAAS,KAAK,WAAW,IAAI;AAAA,IACrD;AAAA,EACF;AAEA,kBAAgB,MAAM;AACpB,UAAM,MAAM,OAAO;AACnB,UAAM,QAAQ,SAAS;AAEvB,QAAI,EAAE,OAAO;AAAQ;AAErB,UAAM,UAAU,MAAM,QAAQ,EAAE,KAAK,IAAI,aAAa,OAAO,MAAM,YAAY,CAAC;AAEhF,UAAM,WAAW,IAAI,eAAe,OAAO;AAE3C,YAAQ;AACR,aAAS,QAAQ,GAAG;AACpB,aAAS,QAAQ,KAAK;AAEtB,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,CAAC;AAEL,SACE,iCACE;AAAA,yBAAC,SAAI,KAAK,QAAQ,WAAU,sDACzB;AAAA,YAAM,IAAI,CAAC,MAAM,MAChB;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW;AAAA,YACT;AAAA,YACA,UAAU,EAAE,QAAQ,KAAK,OAAO,CAAC;AAAA,YACjC,MAAM,oBAAoB;AAAA,YAC1B,MAAM,mBAAmB;AAAA,UAC3B;AAAA,UACA,OAAO;AAAA,YACL,MAAM,GAAG,KAAK,QAAQ;AAAA,YACtB,OAAO,GAAG,KAAK,SAAS,KAAK,QAAQ;AAAA,YACrC,YAAY;AAAA,UACd;AAAA;AAAA,QAXK,GAAG,KAAK,MAAM,IAAI,CAAC;AAAA,MAY1B,CACD;AAAA,MACD;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,WAAW;AAAA,YACT;AAAA,YACA,UAAU,EAAE,QAAQ,aAAa,CAAC;AAAA,YAClC;AAAA,UACF;AAAA,UACA,OAAO,EAAE,MAAM,GAAG,SAAS,KAAK,OAAO,eAAe;AAAA,UAErD;AAAA;AAAA,MACH;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA,UAAU,EAAE,QAAQ,aAAa,CAAC;AAAA,UACpC;AAAA,UACA,OAAO,EAAE,MAAM,GAAG,SAAS,KAAK,aAAa,eAAe;AAAA;AAAA,MAC9D;AAAA,OACF;AAAA,IACA,oBAAC,SAAI,WAAU,kDACZ,iBAAO,IAAI,CAAC,OAAO,MAClB;AAAA,MAAC;AAAA;AAAA,QAEC,WAAW;AAAA,UACT;AAAA,UACA,MAAM,OAAO,IACT,kBACA,MAAM,OAAO,MACX,sBACA;AAAA,UACN,MAAM,aAAa,UAAU;AAAA,QAC/B;AAAA,QACA,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;AAAA,QAE9B,gBAAM;AAAA;AAAA,MAZF,GAAG,MAAM,IAAI,IAAI,CAAC;AAAA,IAazB,CACD,GACH;AAAA,KACF;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"DistributionBar.d.ts","sourceRoot":"","sources":["../../../../../src/ui/CheckRow/CheckVisualization/visualizations/DistributionBar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAEhF,wBAAgB,eAAe,CAAC,EAAE,SAAS,EAAE,EAAE,iBAAiB,2CAgB/D"}
1
+ {"version":3,"file":"DistributionBar.d.ts","sourceRoot":"","sources":["../../../../../src/ui/CheckRow/CheckVisualization/visualizations/DistributionBar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAEhF,wBAAgB,eAAe,CAAC,EAAE,SAAS,EAAE,EAAE,iBAAiB,2CAoB/D"}
@@ -2,7 +2,14 @@
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  function DistributionBar({ positions }) {
4
4
  return /* @__PURE__ */ jsxs(Fragment, { children: [
5
- /* @__PURE__ */ jsx("div", { className: "seo-docbar relative h-[24px] rounded-rs border border-neutral-200", children: positions.map((p, i) => /* @__PURE__ */ jsx("i", { className: "absolute top-[3px] bottom-[3px] w-[3px] rounded-[2px] bg-neutral-800", style: { left: `${p}%` } }, `${p}-${i}`)) }),
5
+ /* @__PURE__ */ jsx("div", { className: "seo-docbar relative h-[24px] rounded-rs border border-neutral-200", children: positions.map((p, i) => /* @__PURE__ */ jsx(
6
+ "i",
7
+ {
8
+ className: "absolute top-[3px] bottom-[3px] w-[3px] rounded-[2px] bg-neutral-800",
9
+ style: { left: `${p}%` }
10
+ },
11
+ `${p}-${i}`
12
+ )) }),
6
13
  /* @__PURE__ */ jsxs("div", { className: "flex justify-between text-[10px] text-neutral-500 mt-[5px]", children: [
7
14
  /* @__PURE__ */ jsx("span", { children: "start" }),
8
15
  /* @__PURE__ */ jsx("span", { children: "middle" }),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/ui/CheckRow/CheckVisualization/visualizations/DistributionBar.tsx"],"sourcesContent":["\"use client\";\n\nimport type { DistributionModel } from \"../../../../engine/types/visualization\";\n\nexport function DistributionBar({ positions }: DistributionModel) {\n return (\n <>\n <div className=\"seo-docbar relative h-[24px] rounded-rs border border-neutral-200\">\n {positions.map((p, i) => (\n <i key={`${p}-${i}`} className=\"absolute top-[3px] bottom-[3px] w-[3px] rounded-[2px] bg-neutral-800\" style={{ left: `${p}%` }} />\n ))}\n </div>\n\n <div className=\"flex justify-between text-[10px] text-neutral-500 mt-[5px]\">\n <span>start</span>\n <span>middle</span>\n <span>end</span>\n </div>\n </>\n );\n}\n"],"mappings":";AAMI,mBAGM,KAIJ,YAPF;AAFG,SAAS,gBAAgB,EAAE,UAAU,GAAsB;AAChE,SACE,iCACE;AAAA,wBAAC,SAAI,WAAU,qEACZ,oBAAU,IAAI,CAAC,GAAG,MACjB,oBAAC,OAAoB,WAAU,wEAAuE,OAAO,EAAE,MAAM,GAAG,CAAC,IAAI,KAArH,GAAG,CAAC,IAAI,CAAC,EAA+G,CACjI,GACH;AAAA,IAEA,qBAAC,SAAI,WAAU,8DACb;AAAA,0BAAC,UAAK,mBAAK;AAAA,MACX,oBAAC,UAAK,oBAAM;AAAA,MACZ,oBAAC,UAAK,iBAAG;AAAA,OACX;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/ui/CheckRow/CheckVisualization/visualizations/DistributionBar.tsx"],"sourcesContent":["\"use client\";\n\nimport type { DistributionModel } from \"../../../../engine/types/visualization\";\n\nexport function DistributionBar({ positions }: DistributionModel) {\n return (\n <>\n <div className=\"seo-docbar relative h-[24px] rounded-rs border border-neutral-200\">\n {positions.map((p, i) => (\n <i\n key={`${p}-${i}`}\n className=\"absolute top-[3px] bottom-[3px] w-[3px] rounded-[2px] bg-neutral-800\"\n style={{ left: `${p}%` }}\n />\n ))}\n </div>\n\n <div className=\"flex justify-between text-[10px] text-neutral-500 mt-[5px]\">\n <span>start</span>\n <span>middle</span>\n <span>end</span>\n </div>\n </>\n );\n}\n"],"mappings":";AAMI,mBAGM,KAQJ,YAXF;AAFG,SAAS,gBAAgB,EAAE,UAAU,GAAsB;AAChE,SACE,iCACE;AAAA,wBAAC,SAAI,WAAU,qEACZ,oBAAU,IAAI,CAAC,GAAG,MACjB;AAAA,MAAC;AAAA;AAAA,QAEC,WAAU;AAAA,QACV,OAAO,EAAE,MAAM,GAAG,CAAC,IAAI;AAAA;AAAA,MAFlB,GAAG,CAAC,IAAI,CAAC;AAAA,IAGhB,CACD,GACH;AAAA,IAEA,qBAAC,SAAI,WAAU,8DACb;AAAA,0BAAC,UAAK,mBAAK;AAAA,MACX,oBAAC,UAAK,oBAAM;AAAA,MACZ,oBAAC,UAAK,iBAAG;AAAA,OACX;AAAA,KACF;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"DrillDown.d.ts","sourceRoot":"","sources":["../../../../../src/ui/CheckRow/CheckVisualization/visualizations/DrillDown.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AAE7E,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,cAAc,kDAiCzD"}
1
+ {"version":3,"file":"DrillDown.d.ts","sourceRoot":"","sources":["../../../../../src/ui/CheckRow/CheckVisualization/visualizations/DrillDown.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AAE7E,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,cAAc,kDAoCzD"}
@@ -24,10 +24,17 @@ function DrillDown({ items, label }) {
24
24
  ] })
25
25
  }
26
26
  ),
27
- /* @__PURE__ */ jsx("div", { className: cn("mt-[8px] flex-col gap-[4px]", open ? "flex" : "hidden"), children: items.map((it, i) => /* @__PURE__ */ jsxs("div", { className: "flex justify-between text-[11px] text-neutral-700 bg-neutral-50 rounded-rs px-[9px] py-[4px]", children: [
28
- /* @__PURE__ */ jsx("span", { children: it.left }),
29
- /* @__PURE__ */ jsx("span", { className: "text-neutral-1000", children: it.right })
30
- ] }, `${it.left}-${i}`)) })
27
+ /* @__PURE__ */ jsx("div", { className: cn("mt-[8px] flex-col gap-[4px]", open ? "flex" : "hidden"), children: items.map((it, i) => /* @__PURE__ */ jsxs(
28
+ "div",
29
+ {
30
+ className: "flex justify-between text-[11px] text-neutral-700 bg-neutral-50 rounded-rs px-[9px] py-[4px]",
31
+ children: [
32
+ /* @__PURE__ */ jsx("span", { children: it.left }),
33
+ /* @__PURE__ */ jsx("span", { className: "text-neutral-1000", children: it.right })
34
+ ]
35
+ },
36
+ `${it.left}-${i}`
37
+ )) })
31
38
  ] });
32
39
  }
33
40
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/ui/CheckRow/CheckVisualization/visualizations/DrillDown.tsx"],"sourcesContent":["\"use client\";\n\nimport { ChevronDown, ChevronUp } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { cn } from \"../../../../utils/style\";\nimport type { DrilldownModel } from \"../../../../engine/types/visualization\";\n\nexport function DrillDown({ items, label }: DrilldownModel) {\n const [open, setOpen] = useState(false);\n\n if (!items.length) return null;\n\n return (\n <>\n <button\n type=\"button\"\n className=\"mt-[8px] text-[11px] text-neutral-700 bg-neutral-100 border border-neutral-200 rounded-rs px-[9px] py-[4px] cursor-pointer inline-flex items-center gap-[4px]\"\n onClick={() => setOpen((o) => !o)}\n >\n {open ? (\n <>\n Hide <ChevronUp size={14} />\n </>\n ) : (\n <>\n {label} <ChevronDown size={14} />\n </>\n )}\n </button>\n\n <div className={cn(\"mt-[8px] flex-col gap-[4px]\", open ? \"flex\" : \"hidden\")}>\n {items.map((it, i) => (\n <div className=\"flex justify-between text-[11px] text-neutral-700 bg-neutral-50 rounded-rs px-[9px] py-[4px]\" key={`${it.left}-${i}`}>\n <span>{it.left}</span>\n <span className=\"text-neutral-1000\">{it.right}</span>\n </div>\n ))}\n </div>\n </>\n );\n}\n"],"mappings":";AAoBU,mBACO,KADP;AAlBV,SAAS,aAAa,iBAAiB;AACvC,SAAS,gBAAgB;AACzB,SAAS,UAAU;AAGZ,SAAS,UAAU,EAAE,OAAO,MAAM,GAAmB;AAC1D,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AAEtC,MAAI,CAAC,MAAM;AAAQ,WAAO;AAE1B,SACE,iCACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;AAAA,QAE/B,iBACC,iCAAE;AAAA;AAAA,UACK,oBAAC,aAAU,MAAM,IAAI;AAAA,WAC5B,IAEA,iCACG;AAAA;AAAA,UAAM;AAAA,UAAC,oBAAC,eAAY,MAAM,IAAI;AAAA,WACjC;AAAA;AAAA,IAEJ;AAAA,IAEA,oBAAC,SAAI,WAAW,GAAG,+BAA+B,OAAO,SAAS,QAAQ,GACvE,gBAAM,IAAI,CAAC,IAAI,MACd,qBAAC,SAAI,WAAU,gGACb;AAAA,0BAAC,UAAM,aAAG,MAAK;AAAA,MACf,oBAAC,UAAK,WAAU,qBAAqB,aAAG,OAAM;AAAA,SAFmE,GAAG,GAAG,IAAI,IAAI,CAAC,EAGlI,CACD,GACH;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/ui/CheckRow/CheckVisualization/visualizations/DrillDown.tsx"],"sourcesContent":["\"use client\";\n\nimport { ChevronDown, ChevronUp } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { cn } from \"../../../../utils/style\";\nimport type { DrilldownModel } from \"../../../../engine/types/visualization\";\n\nexport function DrillDown({ items, label }: DrilldownModel) {\n const [open, setOpen] = useState(false);\n\n if (!items.length) return null;\n\n return (\n <>\n <button\n type=\"button\"\n className=\"mt-[8px] text-[11px] text-neutral-700 bg-neutral-100 border border-neutral-200 rounded-rs px-[9px] py-[4px] cursor-pointer inline-flex items-center gap-[4px]\"\n onClick={() => setOpen((o) => !o)}\n >\n {open ? (\n <>\n Hide <ChevronUp size={14} />\n </>\n ) : (\n <>\n {label} <ChevronDown size={14} />\n </>\n )}\n </button>\n\n <div className={cn(\"mt-[8px] flex-col gap-[4px]\", open ? \"flex\" : \"hidden\")}>\n {items.map((it, i) => (\n <div\n className=\"flex justify-between text-[11px] text-neutral-700 bg-neutral-50 rounded-rs px-[9px] py-[4px]\"\n key={`${it.left}-${i}`}\n >\n <span>{it.left}</span>\n <span className=\"text-neutral-1000\">{it.right}</span>\n </div>\n ))}\n </div>\n </>\n );\n}\n"],"mappings":";AAoBU,mBACO,KADP;AAlBV,SAAS,aAAa,iBAAiB;AACvC,SAAS,gBAAgB;AACzB,SAAS,UAAU;AAGZ,SAAS,UAAU,EAAE,OAAO,MAAM,GAAmB;AAC1D,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AAEtC,MAAI,CAAC,MAAM;AAAQ,WAAO;AAE1B,SACE,iCACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;AAAA,QAE/B,iBACC,iCAAE;AAAA;AAAA,UACK,oBAAC,aAAU,MAAM,IAAI;AAAA,WAC5B,IAEA,iCACG;AAAA;AAAA,UAAM;AAAA,UAAC,oBAAC,eAAY,MAAM,IAAI;AAAA,WACjC;AAAA;AAAA,IAEJ;AAAA,IAEA,oBAAC,SAAI,WAAW,GAAG,+BAA+B,OAAO,SAAS,QAAQ,GACvE,gBAAM,IAAI,CAAC,IAAI,MACd;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QAGV;AAAA,8BAAC,UAAM,aAAG,MAAK;AAAA,UACf,oBAAC,UAAK,WAAU,qBAAqB,aAAG,OAAM;AAAA;AAAA;AAAA,MAHzC,GAAG,GAAG,IAAI,IAAI,CAAC;AAAA,IAItB,CACD,GACH;AAAA,KACF;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"SegmentBar.d.ts","sourceRoot":"","sources":["../../../../../src/ui/CheckRow/CheckVisualization/visualizations/SegmentBar.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AAc3E,wBAAgB,UAAU,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,YAAY,2CA0BvF"}
1
+ {"version":3,"file":"SegmentBar.d.ts","sourceRoot":"","sources":["../../../../../src/ui/CheckRow/CheckVisualization/visualizations/SegmentBar.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AAc3E,wBAAgB,UAAU,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,YAAY,2CA6BvF"}
@@ -17,7 +17,13 @@ function SegmentBar({ countLabel, filledPct, filledStatus, legend }) {
17
17
  return /* @__PURE__ */ jsxs(Fragment, { children: [
18
18
  countLabel && /* @__PURE__ */ jsx("div", { className: "text-[10px] text-neutral-500 font-mono mb-[4px] flex justify-end", children: /* @__PURE__ */ jsx("span", { children: countLabel }) }),
19
19
  /* @__PURE__ */ jsxs("div", { className: "flex h-[6px] rounded-[3px] overflow-hidden", children: [
20
- /* @__PURE__ */ jsx("i", { className: cn("block h-full", statusVar({ status: filledStatus })), style: { width: `${filledPct}%`, background: "var(--seo-c)" } }),
20
+ /* @__PURE__ */ jsx(
21
+ "i",
22
+ {
23
+ className: cn("block h-full", statusVar({ status: filledStatus })),
24
+ style: { width: `${filledPct}%`, background: "var(--seo-c)" }
25
+ }
26
+ ),
21
27
  /* @__PURE__ */ jsx("i", { className: "block h-full bg-neutral-150", style: { width: `${100 - filledPct}%` } })
22
28
  ] }),
23
29
  legend && /* @__PURE__ */ jsx("div", { className: "flex gap-[14px] text-[11px] mt-[6px]", children: legend.map((l) => /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-[5px] text-neutral-700", children: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/ui/CheckRow/CheckVisualization/visualizations/SegmentBar.tsx"],"sourcesContent":["\"use client\";\n\nimport { cva } from \"class-variance-authority\";\nimport { cn } from \"../../../../utils/style\";\nimport type { SegmentModel } from \"../../../../engine/types/visualization\";\nimport { statusVar } from \"../../../../components/SeoDrawer/variants\";\n\nconst swatchVariants = cva(\"w-[8px] h-[8px] rounded-[2px] inline-block\", {\n variants: {\n tone: {\n good: \"bg-seo-good\",\n warn: \"bg-seo-warn\",\n bad: \"bg-seo-bad\",\n muted: \"bg-neutral-300\",\n },\n },\n});\n\nexport function SegmentBar({ countLabel, filledPct, filledStatus, legend }: SegmentModel) {\n return (\n <>\n {countLabel && (\n <div className=\"text-[10px] text-neutral-500 font-mono mb-[4px] flex justify-end\">\n <span>{countLabel}</span>\n </div>\n )}\n\n <div className=\"flex h-[6px] rounded-[3px] overflow-hidden\">\n <i className={cn(\"block h-full\", statusVar({ status: filledStatus }))} style={{ width: `${filledPct}%`, background: \"var(--seo-c)\" }} />\n <i className=\"block h-full bg-neutral-150\" style={{ width: `${100 - filledPct}%` }} />\n </div>\n\n {legend && (\n <div className=\"flex gap-[14px] text-[11px] mt-[6px]\">\n {legend.map((l) => (\n <span key={l.label} className=\"inline-flex items-center gap-[5px] text-neutral-700\">\n <span className={swatchVariants({ tone: l.tone })} />\n {l.label}\n </span>\n ))}\n </div>\n )}\n </>\n );\n}\n"],"mappings":";AAoBI,mBAGM,KAIJ,YAPF;AAlBJ,SAAS,WAAW;AACpB,SAAS,UAAU;AAEnB,SAAS,iBAAiB;AAE1B,MAAM,iBAAiB,IAAI,8CAA8C;AAAA,EACvE,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,MACL,OAAO;AAAA,IACT;AAAA,EACF;AACF,CAAC;AAEM,SAAS,WAAW,EAAE,YAAY,WAAW,cAAc,OAAO,GAAiB;AACxF,SACE,iCACG;AAAA,kBACC,oBAAC,SAAI,WAAU,oEACb,8BAAC,UAAM,sBAAW,GACpB;AAAA,IAGF,qBAAC,SAAI,WAAU,8CACb;AAAA,0BAAC,OAAE,WAAW,GAAG,gBAAgB,UAAU,EAAE,QAAQ,aAAa,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,GAAG,SAAS,KAAK,YAAY,eAAe,GAAG;AAAA,MACtI,oBAAC,OAAE,WAAU,+BAA8B,OAAO,EAAE,OAAO,GAAG,MAAM,SAAS,IAAI,GAAG;AAAA,OACtF;AAAA,IAEC,UACC,oBAAC,SAAI,WAAU,wCACZ,iBAAO,IAAI,CAAC,MACX,qBAAC,UAAmB,WAAU,uDAC5B;AAAA,0BAAC,UAAK,WAAW,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;AAAA,MAClD,EAAE;AAAA,SAFM,EAAE,KAGb,CACD,GACH;AAAA,KAEJ;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/ui/CheckRow/CheckVisualization/visualizations/SegmentBar.tsx"],"sourcesContent":["\"use client\";\n\nimport { cva } from \"class-variance-authority\";\nimport { cn } from \"../../../../utils/style\";\nimport type { SegmentModel } from \"../../../../engine/types/visualization\";\nimport { statusVar } from \"../../../../components/SeoDrawer/variants\";\n\nconst swatchVariants = cva(\"w-[8px] h-[8px] rounded-[2px] inline-block\", {\n variants: {\n tone: {\n good: \"bg-seo-good\",\n warn: \"bg-seo-warn\",\n bad: \"bg-seo-bad\",\n muted: \"bg-neutral-300\",\n },\n },\n});\n\nexport function SegmentBar({ countLabel, filledPct, filledStatus, legend }: SegmentModel) {\n return (\n <>\n {countLabel && (\n <div className=\"text-[10px] text-neutral-500 font-mono mb-[4px] flex justify-end\">\n <span>{countLabel}</span>\n </div>\n )}\n\n <div className=\"flex h-[6px] rounded-[3px] overflow-hidden\">\n <i\n className={cn(\"block h-full\", statusVar({ status: filledStatus }))}\n style={{ width: `${filledPct}%`, background: \"var(--seo-c)\" }}\n />\n <i className=\"block h-full bg-neutral-150\" style={{ width: `${100 - filledPct}%` }} />\n </div>\n\n {legend && (\n <div className=\"flex gap-[14px] text-[11px] mt-[6px]\">\n {legend.map((l) => (\n <span key={l.label} className=\"inline-flex items-center gap-[5px] text-neutral-700\">\n <span className={swatchVariants({ tone: l.tone })} />\n {l.label}\n </span>\n ))}\n </div>\n )}\n </>\n );\n}\n"],"mappings":";AAoBI,mBAGM,KAIJ,YAPF;AAlBJ,SAAS,WAAW;AACpB,SAAS,UAAU;AAEnB,SAAS,iBAAiB;AAE1B,MAAM,iBAAiB,IAAI,8CAA8C;AAAA,EACvE,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,MACL,OAAO;AAAA,IACT;AAAA,EACF;AACF,CAAC;AAEM,SAAS,WAAW,EAAE,YAAY,WAAW,cAAc,OAAO,GAAiB;AACxF,SACE,iCACG;AAAA,kBACC,oBAAC,SAAI,WAAU,oEACb,8BAAC,UAAM,sBAAW,GACpB;AAAA,IAGF,qBAAC,SAAI,WAAU,8CACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,GAAG,gBAAgB,UAAU,EAAE,QAAQ,aAAa,CAAC,CAAC;AAAA,UACjE,OAAO,EAAE,OAAO,GAAG,SAAS,KAAK,YAAY,eAAe;AAAA;AAAA,MAC9D;AAAA,MACA,oBAAC,OAAE,WAAU,+BAA8B,OAAO,EAAE,OAAO,GAAG,MAAM,SAAS,IAAI,GAAG;AAAA,OACtF;AAAA,IAEC,UACC,oBAAC,SAAI,WAAU,wCACZ,iBAAO,IAAI,CAAC,MACX,qBAAC,UAAmB,WAAU,uDAC5B;AAAA,0BAAC,UAAK,WAAW,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;AAAA,MAClD,EAAE;AAAA,SAFM,EAAE,KAGb,CACD,GACH;AAAA,KAEJ;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/CheckRow/index.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAG/D,UAAU,aAAa;IACrB,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,aAAa,2CA4BhD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/CheckRow/index.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAG/D,UAAU,aAAa;IACrB,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,aAAa,2CAoChD"}
@@ -13,15 +13,29 @@ function CheckRow({ check }) {
13
13
  tip: ""
14
14
  };
15
15
  const Icon = CHECK_ICONS[check.id] ?? CHECK_ICONS._default;
16
- return /* @__PURE__ */ jsxs("div", { className: cn("relative px-[15px] py-[13px] overflow-visible", ROW_SEPARATOR), "data-status": check.status, children: [
17
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-[9px] mb-[7px]", children: [
18
- /* @__PURE__ */ jsx("span", { className: "w-[26px] h-[26px] rounded-rs bg-neutral-100 text-neutral-600 grid place-items-center flex-none [&_svg]:size-[15px]", children: /* @__PURE__ */ jsx(Icon, { size: 15 }) }),
19
- /* @__PURE__ */ jsx("span", { className: "flex-1 font-semibold text-[12.5px]", children: /* @__PURE__ */ jsx(Tooltip, { content: meta.tip, className: "border-0 border-b border-dotted border-neutral-400", children: meta.name }) }),
20
- /* @__PURE__ */ jsx(Pill, { variant: check.status, children: STATUS_PILL_LABEL[check.status] })
21
- ] }),
22
- /* @__PURE__ */ jsx(CheckVisualization, { check }),
23
- check.recommendation && /* @__PURE__ */ jsx("div", { className: "text-neutral-600 text-[11.5px]", children: check.recommendation })
24
- ] });
16
+ return /* @__PURE__ */ jsxs(
17
+ "div",
18
+ {
19
+ className: cn("relative px-[15px] py-[13px] overflow-visible", ROW_SEPARATOR),
20
+ "data-status": check.status,
21
+ children: [
22
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-[9px] mb-[7px]", children: [
23
+ /* @__PURE__ */ jsx("span", { className: "w-[26px] h-[26px] rounded-rs bg-neutral-100 text-neutral-600 grid place-items-center flex-none [&_svg]:size-[15px]", children: /* @__PURE__ */ jsx(Icon, { size: 15 }) }),
24
+ /* @__PURE__ */ jsx("span", { className: "flex-1 font-semibold text-[12.5px]", children: /* @__PURE__ */ jsx(
25
+ Tooltip,
26
+ {
27
+ content: meta.tip,
28
+ className: "border-0 border-b border-dotted border-neutral-400",
29
+ children: meta.name
30
+ }
31
+ ) }),
32
+ /* @__PURE__ */ jsx(Pill, { variant: check.status, children: STATUS_PILL_LABEL[check.status] })
33
+ ] }),
34
+ /* @__PURE__ */ jsx(CheckVisualization, { check }),
35
+ check.recommendation && /* @__PURE__ */ jsx("div", { className: "text-neutral-600 text-[11.5px]", children: check.recommendation })
36
+ ]
37
+ }
38
+ );
25
39
  }
26
40
  export {
27
41
  CheckRow
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/ui/CheckRow/index.tsx"],"sourcesContent":["\"use client\";\n\nimport { CHECK_ICONS } from \"../../components/icons\";\nimport { CheckVisualization } from \"./CheckVisualization\";\nimport { LABELS } from \"./constants/labels\";\nimport { Pill } from \"../Pill\";\nimport { STATUS_PILL_LABEL } from \"../../constants\";\nimport { Tooltip } from \"../Tooltip\";\nimport type { CheckResult } from \"../../engine/types/analysis\";\nimport { cn, ROW_SEPARATOR } from \"../../utils/style\";\n\ninterface CheckRowProps {\n check: CheckResult;\n}\n\nexport function CheckRow({ check }: CheckRowProps) {\n const meta = LABELS[check.id as keyof typeof LABELS] ?? {\n name: check.id,\n tip: \"\",\n };\n const Icon = CHECK_ICONS[check.id] ?? CHECK_ICONS._default;\n\n return (\n <div className={cn(\"relative px-[15px] py-[13px] overflow-visible\", ROW_SEPARATOR)} data-status={check.status}>\n <div className=\"flex items-center gap-[9px] mb-[7px]\">\n <span className=\"w-[26px] h-[26px] rounded-rs bg-neutral-100 text-neutral-600 grid place-items-center flex-none [&_svg]:size-[15px]\">\n <Icon size={15} />\n </span>\n\n <span className=\"flex-1 font-semibold text-[12.5px]\">\n <Tooltip content={meta.tip} className=\"border-0 border-b border-dotted border-neutral-400\">\n {meta.name}\n </Tooltip>\n </span>\n\n <Pill variant={check.status}>{STATUS_PILL_LABEL[check.status]}</Pill>\n </div>\n\n <CheckVisualization check={check} />\n\n {check.recommendation && <div className=\"text-neutral-600 text-[11.5px]\">{check.recommendation}</div>}\n </div>\n );\n}\n"],"mappings":";AAwBM,SAEI,KAFJ;AAtBN,SAAS,mBAAmB;AAC5B,SAAS,0BAA0B;AACnC,SAAS,cAAc;AACvB,SAAS,YAAY;AACrB,SAAS,yBAAyB;AAClC,SAAS,eAAe;AAExB,SAAS,IAAI,qBAAqB;AAM3B,SAAS,SAAS,EAAE,MAAM,GAAkB;AACjD,QAAM,OAAO,OAAO,MAAM,EAAyB,KAAK;AAAA,IACtD,MAAM,MAAM;AAAA,IACZ,KAAK;AAAA,EACP;AACA,QAAM,OAAO,YAAY,MAAM,EAAE,KAAK,YAAY;AAElD,SACE,qBAAC,SAAI,WAAW,GAAG,iDAAiD,aAAa,GAAG,eAAa,MAAM,QACrG;AAAA,yBAAC,SAAI,WAAU,wCACb;AAAA,0BAAC,UAAK,WAAU,sHACd,8BAAC,QAAK,MAAM,IAAI,GAClB;AAAA,MAEA,oBAAC,UAAK,WAAU,sCACd,8BAAC,WAAQ,SAAS,KAAK,KAAK,WAAU,sDACnC,eAAK,MACR,GACF;AAAA,MAEA,oBAAC,QAAK,SAAS,MAAM,QAAS,4BAAkB,MAAM,MAAM,GAAE;AAAA,OAChE;AAAA,IAEA,oBAAC,sBAAmB,OAAc;AAAA,IAEjC,MAAM,kBAAkB,oBAAC,SAAI,WAAU,kCAAkC,gBAAM,gBAAe;AAAA,KACjG;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/ui/CheckRow/index.tsx"],"sourcesContent":["\"use client\";\n\nimport { CHECK_ICONS } from \"../../components/icons\";\nimport { CheckVisualization } from \"./CheckVisualization\";\nimport { LABELS } from \"./constants/labels\";\nimport { Pill } from \"../Pill\";\nimport { STATUS_PILL_LABEL } from \"../../constants\";\nimport { Tooltip } from \"../Tooltip\";\nimport type { CheckResult } from \"../../engine/types/analysis\";\nimport { cn, ROW_SEPARATOR } from \"../../utils/style\";\n\ninterface CheckRowProps {\n check: CheckResult;\n}\n\nexport function CheckRow({ check }: CheckRowProps) {\n const meta = LABELS[check.id as keyof typeof LABELS] ?? {\n name: check.id,\n tip: \"\",\n };\n const Icon = CHECK_ICONS[check.id] ?? CHECK_ICONS._default;\n\n return (\n <div\n className={cn(\"relative px-[15px] py-[13px] overflow-visible\", ROW_SEPARATOR)}\n data-status={check.status}\n >\n <div className=\"flex items-center gap-[9px] mb-[7px]\">\n <span className=\"w-[26px] h-[26px] rounded-rs bg-neutral-100 text-neutral-600 grid place-items-center flex-none [&_svg]:size-[15px]\">\n <Icon size={15} />\n </span>\n\n <span className=\"flex-1 font-semibold text-[12.5px]\">\n <Tooltip\n content={meta.tip}\n className=\"border-0 border-b border-dotted border-neutral-400\"\n >\n {meta.name}\n </Tooltip>\n </span>\n\n <Pill variant={check.status}>{STATUS_PILL_LABEL[check.status]}</Pill>\n </div>\n\n <CheckVisualization check={check} />\n\n {check.recommendation && (\n <div className=\"text-neutral-600 text-[11.5px]\">{check.recommendation}</div>\n )}\n </div>\n );\n}\n"],"mappings":";AA2BM,SAEI,KAFJ;AAzBN,SAAS,mBAAmB;AAC5B,SAAS,0BAA0B;AACnC,SAAS,cAAc;AACvB,SAAS,YAAY;AACrB,SAAS,yBAAyB;AAClC,SAAS,eAAe;AAExB,SAAS,IAAI,qBAAqB;AAM3B,SAAS,SAAS,EAAE,MAAM,GAAkB;AACjD,QAAM,OAAO,OAAO,MAAM,EAAyB,KAAK;AAAA,IACtD,MAAM,MAAM;AAAA,IACZ,KAAK;AAAA,EACP;AACA,QAAM,OAAO,YAAY,MAAM,EAAE,KAAK,YAAY;AAElD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,iDAAiD,aAAa;AAAA,MAC5E,eAAa,MAAM;AAAA,MAEnB;AAAA,6BAAC,SAAI,WAAU,wCACb;AAAA,8BAAC,UAAK,WAAU,sHACd,8BAAC,QAAK,MAAM,IAAI,GAClB;AAAA,UAEA,oBAAC,UAAK,WAAU,sCACd;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,KAAK;AAAA,cACd,WAAU;AAAA,cAET,eAAK;AAAA;AAAA,UACR,GACF;AAAA,UAEA,oBAAC,QAAK,SAAS,MAAM,QAAS,4BAAkB,MAAM,MAAM,GAAE;AAAA,WAChE;AAAA,QAEA,oBAAC,sBAAmB,OAAc;AAAA,QAEjC,MAAM,kBACL,oBAAC,SAAI,WAAU,kCAAkC,gBAAM,gBAAe;AAAA;AAAA;AAAA,EAE1E;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"FilterPills.d.ts","sourceRoot":"","sources":["../../src/ui/FilterPills.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAGpE,MAAM,MAAM,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAkCpC,UAAU,gBAAgB;IACxB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAED,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,gBAAgB,2CASxE"}
1
+ {"version":3,"file":"FilterPills.d.ts","sourceRoot":"","sources":["../../src/ui/FilterPills.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAGpE,MAAM,MAAM,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAiDpC,UAAU,gBAAgB;IACxB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAED,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,gBAAgB,2CAoCxE"}
@@ -3,32 +3,91 @@ import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { cva } from "class-variance-authority";
4
4
  import { cn } from "../utils/style";
5
5
  import { statusVar } from "../components/SeoDrawer/variants";
6
- const filterPillVariants = cva("inline-flex items-center gap-[5px] px-[10px] py-[4px] rounded-[20px] border text-[11px] font-medium cursor-pointer", {
7
- variants: {
8
- active: {
9
- true: "bg-neutral-1000 text-neutral-0 border-neutral-1000",
10
- false: "border-neutral-200 bg-neutral-0 text-neutral-700"
11
- }
12
- },
13
- defaultVariants: { active: false }
14
- });
6
+ const filterPillVariants = cva(
7
+ "inline-flex items-center gap-[5px] px-[10px] py-[4px] rounded-[20px] border text-[11px] font-medium cursor-pointer",
8
+ {
9
+ variants: {
10
+ active: {
11
+ true: "bg-neutral-1000 text-neutral-0 border-neutral-1000",
12
+ false: "border-neutral-200 bg-neutral-0 text-neutral-700"
13
+ }
14
+ },
15
+ defaultVariants: { active: false }
16
+ }
17
+ );
15
18
  function Pill({ filter, label, count, active, onSelect, dotStatus }) {
16
- return /* @__PURE__ */ jsxs("button", { type: "button", className: filterPillVariants({ active }), onClick: () => onSelect(filter), children: [
17
- dotStatus && /* @__PURE__ */ jsx("span", { className: cn("w-[6px] h-[6px] rounded-full inline-block", statusVar({ status: dotStatus })), style: { background: "var(--seo-c)" } }),
18
- label,
19
- " ",
20
- /* @__PURE__ */ jsx("span", { className: "font-mono font-bold", children: count })
21
- ] });
19
+ return /* @__PURE__ */ jsxs(
20
+ "button",
21
+ {
22
+ type: "button",
23
+ className: filterPillVariants({ active }),
24
+ onClick: () => onSelect(filter),
25
+ children: [
26
+ dotStatus && /* @__PURE__ */ jsx(
27
+ "span",
28
+ {
29
+ className: cn(
30
+ "w-[6px] h-[6px] rounded-full inline-block",
31
+ statusVar({ status: dotStatus })
32
+ ),
33
+ style: { background: "var(--seo-c)" }
34
+ }
35
+ ),
36
+ label,
37
+ " ",
38
+ /* @__PURE__ */ jsx("span", { className: "font-mono font-bold", children: count })
39
+ ]
40
+ }
41
+ );
22
42
  }
23
43
  function countByStatus(checks, status) {
24
44
  return checks.filter((c) => c.status === status).length;
25
45
  }
26
46
  function FilterPills({ checks, value, onChange }) {
27
47
  return /* @__PURE__ */ jsxs("div", { className: "flex gap-[6px] flex-wrap px-[15px] py-[11px]", children: [
28
- /* @__PURE__ */ jsx(Pill, { filter: "all", label: "All", count: checks.length, active: value === "all", onSelect: onChange }),
29
- /* @__PURE__ */ jsx(Pill, { filter: "bad", label: "Problems", count: countByStatus(checks, "bad"), active: value === "bad", onSelect: onChange, dotStatus: "bad" }),
30
- /* @__PURE__ */ jsx(Pill, { filter: "warn", label: "Needs work", count: countByStatus(checks, "warn"), active: value === "warn", onSelect: onChange, dotStatus: "warn" }),
31
- /* @__PURE__ */ jsx(Pill, { filter: "good", label: "Good", count: countByStatus(checks, "good"), active: value === "good", onSelect: onChange, dotStatus: "good" })
48
+ /* @__PURE__ */ jsx(
49
+ Pill,
50
+ {
51
+ filter: "all",
52
+ label: "All",
53
+ count: checks.length,
54
+ active: value === "all",
55
+ onSelect: onChange
56
+ }
57
+ ),
58
+ /* @__PURE__ */ jsx(
59
+ Pill,
60
+ {
61
+ filter: "bad",
62
+ label: "Problems",
63
+ count: countByStatus(checks, "bad"),
64
+ active: value === "bad",
65
+ onSelect: onChange,
66
+ dotStatus: "bad"
67
+ }
68
+ ),
69
+ /* @__PURE__ */ jsx(
70
+ Pill,
71
+ {
72
+ filter: "warn",
73
+ label: "Needs work",
74
+ count: countByStatus(checks, "warn"),
75
+ active: value === "warn",
76
+ onSelect: onChange,
77
+ dotStatus: "warn"
78
+ }
79
+ ),
80
+ /* @__PURE__ */ jsx(
81
+ Pill,
82
+ {
83
+ filter: "good",
84
+ label: "Good",
85
+ count: countByStatus(checks, "good"),
86
+ active: value === "good",
87
+ onSelect: onChange,
88
+ dotStatus: "good"
89
+ }
90
+ )
32
91
  ] });
33
92
  }
34
93
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ui/FilterPills.tsx"],"sourcesContent":["\"use client\";\n\nimport { cva } from \"class-variance-authority\";\nimport { cn } from \"../utils/style\";\nimport type { CheckResult, Status } from \"../engine/types/analysis\";\nimport { statusVar } from \"../components/SeoDrawer/variants\";\n\nexport type Filter = \"all\" | Status;\n\nconst filterPillVariants = cva(\"inline-flex items-center gap-[5px] px-[10px] py-[4px] rounded-[20px] border text-[11px] font-medium cursor-pointer\", {\n variants: {\n active: {\n true: \"bg-neutral-1000 text-neutral-0 border-neutral-1000\",\n false: \"border-neutral-200 bg-neutral-0 text-neutral-700\",\n },\n },\n defaultVariants: { active: false },\n});\n\ninterface PillProps {\n filter: Filter;\n label: string;\n count: number;\n active: boolean;\n onSelect: (f: Filter) => void;\n dotStatus?: Status;\n}\n\nfunction Pill({ filter, label, count, active, onSelect, dotStatus }: PillProps) {\n return (\n <button type=\"button\" className={filterPillVariants({ active })} onClick={() => onSelect(filter)}>\n {dotStatus && <span className={cn(\"w-[6px] h-[6px] rounded-full inline-block\", statusVar({ status: dotStatus }))} style={{ background: \"var(--seo-c)\" }} />}\n {label} <span className=\"font-mono font-bold\">{count}</span>\n </button>\n );\n}\n\nfunction countByStatus(checks: CheckResult[], status: Status) {\n return checks.filter((c) => c.status === status).length;\n}\n\ninterface FilterPillsProps {\n checks: CheckResult[];\n value: Filter;\n onChange: (f: Filter) => void;\n}\n\nexport function FilterPills({ checks, value, onChange }: FilterPillsProps) {\n return (\n <div className=\"flex gap-[6px] flex-wrap px-[15px] py-[11px]\">\n <Pill filter=\"all\" label=\"All\" count={checks.length} active={value === \"all\"} onSelect={onChange} />\n <Pill filter=\"bad\" label=\"Problems\" count={countByStatus(checks, \"bad\")} active={value === \"bad\"} onSelect={onChange} dotStatus=\"bad\" />\n <Pill filter=\"warn\" label=\"Needs work\" count={countByStatus(checks, \"warn\")} active={value === \"warn\"} onSelect={onChange} dotStatus=\"warn\" />\n <Pill filter=\"good\" label=\"Good\" count={countByStatus(checks, \"good\")} active={value === \"good\"} onSelect={onChange} dotStatus=\"good\" />\n </div>\n );\n}\n"],"mappings":";AA8BI,SACgB,KADhB;AA5BJ,SAAS,WAAW;AACpB,SAAS,UAAU;AAEnB,SAAS,iBAAiB;AAI1B,MAAM,qBAAqB,IAAI,sHAAsH;AAAA,EACnJ,UAAU;AAAA,IACR,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,iBAAiB,EAAE,QAAQ,MAAM;AACnC,CAAC;AAWD,SAAS,KAAK,EAAE,QAAQ,OAAO,OAAO,QAAQ,UAAU,UAAU,GAAc;AAC9E,SACE,qBAAC,YAAO,MAAK,UAAS,WAAW,mBAAmB,EAAE,OAAO,CAAC,GAAG,SAAS,MAAM,SAAS,MAAM,GAC5F;AAAA,iBAAa,oBAAC,UAAK,WAAW,GAAG,6CAA6C,UAAU,EAAE,QAAQ,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,YAAY,eAAe,GAAG;AAAA,IACxJ;AAAA,IAAM;AAAA,IAAC,oBAAC,UAAK,WAAU,uBAAuB,iBAAM;AAAA,KACvD;AAEJ;AAEA,SAAS,cAAc,QAAuB,QAAgB;AAC5D,SAAO,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,EAAE;AACnD;AAQO,SAAS,YAAY,EAAE,QAAQ,OAAO,SAAS,GAAqB;AACzE,SACE,qBAAC,SAAI,WAAU,gDACb;AAAA,wBAAC,QAAK,QAAO,OAAM,OAAM,OAAM,OAAO,OAAO,QAAQ,QAAQ,UAAU,OAAO,UAAU,UAAU;AAAA,IAClG,oBAAC,QAAK,QAAO,OAAM,OAAM,YAAW,OAAO,cAAc,QAAQ,KAAK,GAAG,QAAQ,UAAU,OAAO,UAAU,UAAU,WAAU,OAAM;AAAA,IACtI,oBAAC,QAAK,QAAO,QAAO,OAAM,cAAa,OAAO,cAAc,QAAQ,MAAM,GAAG,QAAQ,UAAU,QAAQ,UAAU,UAAU,WAAU,QAAO;AAAA,IAC5I,oBAAC,QAAK,QAAO,QAAO,OAAM,QAAO,OAAO,cAAc,QAAQ,MAAM,GAAG,QAAQ,UAAU,QAAQ,UAAU,UAAU,WAAU,QAAO;AAAA,KACxI;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/ui/FilterPills.tsx"],"sourcesContent":["\"use client\";\n\nimport { cva } from \"class-variance-authority\";\nimport { cn } from \"../utils/style\";\nimport type { CheckResult, Status } from \"../engine/types/analysis\";\nimport { statusVar } from \"../components/SeoDrawer/variants\";\n\nexport type Filter = \"all\" | Status;\n\nconst filterPillVariants = cva(\n \"inline-flex items-center gap-[5px] px-[10px] py-[4px] rounded-[20px] border text-[11px] font-medium cursor-pointer\",\n {\n variants: {\n active: {\n true: \"bg-neutral-1000 text-neutral-0 border-neutral-1000\",\n false: \"border-neutral-200 bg-neutral-0 text-neutral-700\",\n },\n },\n defaultVariants: { active: false },\n }\n);\n\ninterface PillProps {\n filter: Filter;\n label: string;\n count: number;\n active: boolean;\n onSelect: (f: Filter) => void;\n dotStatus?: Status;\n}\n\nfunction Pill({ filter, label, count, active, onSelect, dotStatus }: PillProps) {\n return (\n <button\n type=\"button\"\n className={filterPillVariants({ active })}\n onClick={() => onSelect(filter)}\n >\n {dotStatus && (\n <span\n className={cn(\n \"w-[6px] h-[6px] rounded-full inline-block\",\n statusVar({ status: dotStatus })\n )}\n style={{ background: \"var(--seo-c)\" }}\n />\n )}\n {label} <span className=\"font-mono font-bold\">{count}</span>\n </button>\n );\n}\n\nfunction countByStatus(checks: CheckResult[], status: Status) {\n return checks.filter((c) => c.status === status).length;\n}\n\ninterface FilterPillsProps {\n checks: CheckResult[];\n value: Filter;\n onChange: (f: Filter) => void;\n}\n\nexport function FilterPills({ checks, value, onChange }: FilterPillsProps) {\n return (\n <div className=\"flex gap-[6px] flex-wrap px-[15px] py-[11px]\">\n <Pill\n filter=\"all\"\n label=\"All\"\n count={checks.length}\n active={value === \"all\"}\n onSelect={onChange}\n />\n <Pill\n filter=\"bad\"\n label=\"Problems\"\n count={countByStatus(checks, \"bad\")}\n active={value === \"bad\"}\n onSelect={onChange}\n dotStatus=\"bad\"\n />\n <Pill\n filter=\"warn\"\n label=\"Needs work\"\n count={countByStatus(checks, \"warn\")}\n active={value === \"warn\"}\n onSelect={onChange}\n dotStatus=\"warn\"\n />\n <Pill\n filter=\"good\"\n label=\"Good\"\n count={countByStatus(checks, \"good\")}\n active={value === \"good\"}\n onSelect={onChange}\n dotStatus=\"good\"\n />\n </div>\n );\n}\n"],"mappings":";AAiCI,SAMI,KANJ;AA/BJ,SAAS,WAAW;AACpB,SAAS,UAAU;AAEnB,SAAS,iBAAiB;AAI1B,MAAM,qBAAqB;AAAA,EACzB;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;AAWA,SAAS,KAAK,EAAE,QAAQ,OAAO,OAAO,QAAQ,UAAU,UAAU,GAAc;AAC9E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAW,mBAAmB,EAAE,OAAO,CAAC;AAAA,MACxC,SAAS,MAAM,SAAS,MAAM;AAAA,MAE7B;AAAA,qBACC;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,UAAU,EAAE,QAAQ,UAAU,CAAC;AAAA,YACjC;AAAA,YACA,OAAO,EAAE,YAAY,eAAe;AAAA;AAAA,QACtC;AAAA,QAED;AAAA,QAAM;AAAA,QAAC,oBAAC,UAAK,WAAU,uBAAuB,iBAAM;AAAA;AAAA;AAAA,EACvD;AAEJ;AAEA,SAAS,cAAc,QAAuB,QAAgB;AAC5D,SAAO,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,EAAE;AACnD;AAQO,SAAS,YAAY,EAAE,QAAQ,OAAO,SAAS,GAAqB;AACzE,SACE,qBAAC,SAAI,WAAU,gDACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAO;AAAA,QACP,OAAM;AAAA,QACN,OAAO,OAAO;AAAA,QACd,QAAQ,UAAU;AAAA,QAClB,UAAU;AAAA;AAAA,IACZ;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,QAAO;AAAA,QACP,OAAM;AAAA,QACN,OAAO,cAAc,QAAQ,KAAK;AAAA,QAClC,QAAQ,UAAU;AAAA,QAClB,UAAU;AAAA,QACV,WAAU;AAAA;AAAA,IACZ;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,QAAO;AAAA,QACP,OAAM;AAAA,QACN,OAAO,cAAc,QAAQ,MAAM;AAAA,QACnC,QAAQ,UAAU;AAAA,QAClB,UAAU;AAAA,QACV,WAAU;AAAA;AAAA,IACZ;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,QAAO;AAAA,QACP,OAAM;AAAA,QACN,OAAO,cAAc,QAAQ,MAAM;AAAA,QACnC,QAAQ,UAAU;AAAA,QAClB,UAAU;AAAA,QACV,WAAU;AAAA;AAAA,IACZ;AAAA,KACF;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"KpiCard.d.ts","sourceRoot":"","sources":["../../src/ui/KpiCard.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,YAAY,2CAa7D"}
1
+ {"version":3,"file":"KpiCard.d.ts","sourceRoot":"","sources":["../../src/ui/KpiCard.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,YAAY,2CAe7D"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ui/KpiCard.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { SectionWrapper } from \"./SectionWrapper\";\n\ninterface KpiCardProps {\n label: string;\n value: ReactNode;\n suffix?: string;\n}\n\nexport function KpiCard({ label, value, suffix }: KpiCardProps) {\n return (\n <SectionWrapper className=\"px-[13px] py-[12px]\">\n <div className=\"flex items-center gap-[6px]\">\n <span className=\"text-[9.5px] uppercase tracking-[0.05em] text-neutral-500 font-semibold\">{label}</span>\n </div>\n\n <div className=\"text-[23px] font-bold mt-[5px] leading-none\">\n {value}\n {suffix && <small className=\"text-[11px] font-medium text-neutral-500\"> {suffix}</small>}\n </div>\n </SectionWrapper>\n );\n}\n"],"mappings":";AAeQ,cAKW,YALX;AAZR,SAAS,sBAAsB;AAQxB,SAAS,QAAQ,EAAE,OAAO,OAAO,OAAO,GAAiB;AAC9D,SACE,qBAAC,kBAAe,WAAU,uBACxB;AAAA,wBAAC,SAAI,WAAU,+BACb,8BAAC,UAAK,WAAU,2EAA2E,iBAAM,GACnG;AAAA,IAEA,qBAAC,SAAI,WAAU,+CACZ;AAAA;AAAA,MACA,UAAU,qBAAC,WAAM,WAAU,4CAA2C;AAAA;AAAA,QAAE;AAAA,SAAO;AAAA,OAClF;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/ui/KpiCard.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { SectionWrapper } from \"./SectionWrapper\";\n\ninterface KpiCardProps {\n label: string;\n value: ReactNode;\n suffix?: string;\n}\n\nexport function KpiCard({ label, value, suffix }: KpiCardProps) {\n return (\n <SectionWrapper className=\"px-[13px] py-[12px]\">\n <div className=\"flex items-center gap-[6px]\">\n <span className=\"text-[9.5px] uppercase tracking-[0.05em] text-neutral-500 font-semibold\">\n {label}\n </span>\n </div>\n\n <div className=\"text-[23px] font-bold mt-[5px] leading-none\">\n {value}\n {suffix && <small className=\"text-[11px] font-medium text-neutral-500\"> {suffix}</small>}\n </div>\n </SectionWrapper>\n );\n}\n"],"mappings":";AAeQ,cAOW,YAPX;AAZR,SAAS,sBAAsB;AAQxB,SAAS,QAAQ,EAAE,OAAO,OAAO,OAAO,GAAiB;AAC9D,SACE,qBAAC,kBAAe,WAAU,uBACxB;AAAA,wBAAC,SAAI,WAAU,+BACb,8BAAC,UAAK,WAAU,2EACb,iBACH,GACF;AAAA,IAEA,qBAAC,SAAI,WAAU,+CACZ;AAAA;AAAA,MACA,UAAU,qBAAC,WAAM,WAAU,4CAA2C;AAAA;AAAA,QAAE;AAAA,SAAO;AAAA,OAClF;AAAA,KACF;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"Pill.d.ts","sourceRoot":"","sources":["../../src/ui/Pill.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAcvD,UAAU,SAAS;IACjB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,SAAS,2CAEpD"}
1
+ {"version":3,"file":"Pill.d.ts","sourceRoot":"","sources":["../../src/ui/Pill.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAiBvD,UAAU,SAAS;IACjB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,SAAS,2CAEpD"}
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"}