@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.
- package/README.md +242 -60
- package/dist/admin.css +2 -3
- package/dist/components/SeoButton/ScoreBadge.d.ts.map +1 -1
- package/dist/components/SeoButton/ScoreBadge.js +10 -7
- package/dist/components/SeoButton/ScoreBadge.js.map +1 -1
- package/dist/components/SeoButton/SeoButtonInner.d.ts +2 -2
- package/dist/components/SeoButton/SeoButtonInner.d.ts.map +1 -1
- package/dist/components/SeoButton/SeoButtonInner.js +11 -5
- package/dist/components/SeoButton/SeoButtonInner.js.map +1 -1
- package/dist/components/SeoDrawer/TabsNav/index.d.ts.map +1 -1
- package/dist/components/SeoDrawer/TabsNav/index.js +15 -4
- package/dist/components/SeoDrawer/TabsNav/index.js.map +1 -1
- package/dist/components/SeoDrawer/TabsNav/variants.d.ts.map +1 -1
- package/dist/components/SeoDrawer/TabsNav/variants.js +12 -9
- package/dist/components/SeoDrawer/TabsNav/variants.js.map +1 -1
- package/dist/components/SeoDrawer/analysisDecision.d.ts.map +1 -1
- package/dist/components/SeoDrawer/analysisDecision.js.map +1 -1
- package/dist/components/SeoDrawer/build-analysis-input.d.ts +3 -8
- package/dist/components/SeoDrawer/build-analysis-input.d.ts.map +1 -1
- package/dist/components/SeoDrawer/build-analysis-input.js +28 -12
- package/dist/components/SeoDrawer/build-analysis-input.js.map +1 -1
- package/dist/components/SeoDrawer/buildInput.d.ts +1 -1
- package/dist/components/SeoDrawer/buildInput.d.ts.map +1 -1
- package/dist/components/SeoDrawer/buildInput.js +13 -3
- package/dist/components/SeoDrawer/buildInput.js.map +1 -1
- package/dist/components/SeoDrawer/components/Header.d.ts.map +1 -1
- package/dist/components/SeoDrawer/components/Header.js +20 -2
- package/dist/components/SeoDrawer/components/Header.js.map +1 -1
- package/dist/components/SeoDrawer/components/HeadingsSection/HeadingLevelTiles.d.ts.map +1 -1
- package/dist/components/SeoDrawer/components/HeadingsSection/HeadingLevelTiles.js +23 -5
- package/dist/components/SeoDrawer/components/HeadingsSection/HeadingLevelTiles.js.map +1 -1
- package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/Chevron.d.ts.map +1 -1
- package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/Chevron.js +12 -1
- package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/Chevron.js.map +1 -1
- package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeGroup.d.ts.map +1 -1
- package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeGroup.js +43 -4
- package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeGroup.js.map +1 -1
- package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeRow.d.ts +1 -1
- package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeRow.d.ts.map +1 -1
- package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeRow.js +45 -10
- package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeRow.js.map +1 -1
- package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/index.d.ts.map +1 -1
- package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/index.js.map +1 -1
- package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/useHeadingRails.d.ts +1 -1
- package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/useHeadingRails.d.ts.map +1 -1
- package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/useHeadingRails.js +6 -1
- package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/useHeadingRails.js.map +1 -1
- package/dist/components/SeoDrawer/components/HeadingsSection/index.d.ts.map +1 -1
- package/dist/components/SeoDrawer/components/HeadingsSection/index.js.map +1 -1
- package/dist/components/SeoDrawer/components/SerpPreview/highlight-keyphrase.d.ts.map +1 -1
- package/dist/components/SeoDrawer/components/SerpPreview/highlight-keyphrase.js +3 -1
- package/dist/components/SeoDrawer/components/SerpPreview/highlight-keyphrase.js.map +1 -1
- package/dist/components/SeoDrawer/components/SerpPreview/index.d.ts.map +1 -1
- package/dist/components/SeoDrawer/components/SerpPreview/index.js +8 -1
- package/dist/components/SeoDrawer/components/SerpPreview/index.js.map +1 -1
- package/dist/components/SeoDrawer/components/SerpPreview/serp-favicon.d.ts.map +1 -1
- package/dist/components/SeoDrawer/components/SerpPreview/serp-favicon.js.map +1 -1
- package/dist/components/SeoDrawer/components/SerpPreview/variants.d.ts.map +1 -1
- package/dist/components/SeoDrawer/components/SerpPreview/variants.js +9 -6
- package/dist/components/SeoDrawer/components/SerpPreview/variants.js.map +1 -1
- package/dist/components/SeoDrawer/index.d.ts.map +1 -1
- package/dist/components/SeoDrawer/index.js +50 -15
- package/dist/components/SeoDrawer/index.js.map +1 -1
- package/dist/components/SeoDrawer/keyphrasePending.d.ts.map +1 -1
- package/dist/components/SeoDrawer/keyphrasePending.js.map +1 -1
- package/dist/components/SeoDrawer/languagePacks.d.ts.map +1 -1
- package/dist/components/SeoDrawer/languagePacks.js.map +1 -1
- package/dist/components/SeoDrawer/tabs/InclusiveTab.d.ts.map +1 -1
- package/dist/components/SeoDrawer/tabs/InclusiveTab.js +31 -10
- package/dist/components/SeoDrawer/tabs/InclusiveTab.js.map +1 -1
- package/dist/components/SeoDrawer/tabs/KeyphraseTab.d.ts +1 -1
- package/dist/components/SeoDrawer/tabs/KeyphraseTab.d.ts.map +1 -1
- package/dist/components/SeoDrawer/tabs/KeyphraseTab.js +8 -1
- package/dist/components/SeoDrawer/tabs/KeyphraseTab.js.map +1 -1
- package/dist/components/SeoDrawer/tabs/SerpTab.d.ts +1 -1
- package/dist/components/SeoDrawer/tabs/SerpTab.d.ts.map +1 -1
- package/dist/components/SeoDrawer/tabs/SerpTab.js +5 -1
- package/dist/components/SeoDrawer/tabs/SerpTab.js.map +1 -1
- package/dist/components/SeoDrawer/tabs/VitalsTab.d.ts.map +1 -1
- package/dist/components/SeoDrawer/tabs/VitalsTab.js +32 -9
- package/dist/components/SeoDrawer/tabs/VitalsTab.js.map +1 -1
- package/dist/components/SeoDrawer/useAnalysis.d.ts +1 -1
- package/dist/components/SeoDrawer/useAnalysis.d.ts.map +1 -1
- package/dist/components/SeoDrawer/useAnalysis.js +6 -1
- package/dist/components/SeoDrawer/useAnalysis.js.map +1 -1
- package/dist/components/SeoDrawer/useLiveDocument.d.ts +3 -4
- package/dist/components/SeoDrawer/useLiveDocument.d.ts.map +1 -1
- package/dist/components/SeoDrawer/useLiveDocument.js +45 -48
- package/dist/components/SeoDrawer/useLiveDocument.js.map +1 -1
- package/dist/components/icons.d.ts.map +1 -1
- package/dist/components/icons.js +16 -1
- package/dist/components/icons.js.map +1 -1
- package/dist/constants/checkIds.d.ts.map +1 -1
- package/dist/constants/checkIds.js +18 -2
- package/dist/constants/checkIds.js.map +1 -1
- package/dist/content/index.d.ts +5 -0
- package/dist/content/index.d.ts.map +1 -0
- package/dist/content/index.js +15 -0
- package/dist/content/index.js.map +1 -0
- package/dist/content/registry.d.ts +4 -0
- package/dist/content/registry.d.ts.map +1 -0
- package/dist/content/registry.js +22 -0
- package/dist/content/registry.js.map +1 -0
- package/dist/content/resolve/resolve-docs.d.ts +3 -0
- package/dist/content/resolve/resolve-docs.d.ts.map +1 -0
- package/dist/content/resolve/resolve-docs.js +48 -0
- package/dist/content/resolve/resolve-docs.js.map +1 -0
- package/dist/content/schema/helpers.d.ts +10 -0
- package/dist/content/schema/helpers.d.ts.map +1 -0
- package/dist/content/schema/helpers.js +64 -0
- package/dist/content/schema/helpers.js.map +1 -0
- package/dist/content/schema/nodes.d.ts +26 -0
- package/dist/content/schema/nodes.d.ts.map +1 -0
- package/dist/content/schema/nodes.js +8 -0
- package/dist/content/schema/nodes.js.map +1 -0
- package/dist/content/schema/serialize.d.ts +3 -0
- package/dist/content/schema/serialize.d.ts.map +1 -0
- package/dist/content/schema/serialize.js +31 -0
- package/dist/content/schema/serialize.js.map +1 -0
- package/dist/engine/assessorAdapter.d.ts.map +1 -1
- package/dist/engine/assessorAdapter.js.map +1 -1
- package/dist/engine/extractCheckData.d.ts.map +1 -1
- package/dist/engine/extractCheckData.js +19 -5
- package/dist/engine/extractCheckData.js.map +1 -1
- package/dist/engine/helpers/title-progress.d.ts +1 -1
- package/dist/engine/helpers/title-progress.js.map +1 -1
- package/dist/engine/inclusiveScore.d.ts.map +1 -1
- package/dist/engine/inclusiveScore.js.map +1 -1
- package/dist/engine/recommendations.d.ts.map +1 -1
- package/dist/engine/recommendations.js.map +1 -1
- package/dist/engine/runAnalysis/services/derive-inclusive.js.map +1 -1
- package/dist/engine/runAnalysis/services/derive-readability.d.ts.map +1 -1
- package/dist/engine/runAnalysis/services/derive-readability.js +5 -1
- package/dist/engine/runAnalysis/services/derive-readability.js.map +1 -1
- package/dist/engine/runAnalysis/services/derive-vitals/heading-tree.d.ts.map +1 -1
- package/dist/engine/runAnalysis/services/derive-vitals/heading-tree.js.map +1 -1
- package/dist/engine/runAnalysis/services/derive-vitals/index.d.ts.map +1 -1
- package/dist/engine/runAnalysis/services/derive-vitals/index.js +9 -1
- package/dist/engine/runAnalysis/services/derive-vitals/index.js.map +1 -1
- package/dist/engine/runAnalysis/services/derive-vitals/researches.d.ts +1 -1
- package/dist/engine/runAnalysis/services/derive-vitals/researches.d.ts.map +1 -1
- package/dist/engine/runAnalysis/services/derive-vitals/researches.js +8 -2
- package/dist/engine/runAnalysis/services/derive-vitals/researches.js.map +1 -1
- package/dist/engine/runAnalysis/utils/enrich.d.ts.map +1 -1
- package/dist/engine/runAnalysis/utils/enrich.js.map +1 -1
- package/dist/engine/visualization/resolveVisualization/constants.d.ts.map +1 -1
- package/dist/engine/visualization/resolveVisualization/constants.js +9 -1
- package/dist/engine/visualization/resolveVisualization/constants.js.map +1 -1
- package/dist/engine/visualization/resolveVisualization/index.d.ts.map +1 -1
- package/dist/engine/visualization/resolveVisualization/index.js.map +1 -1
- package/dist/engine/visualization/resolveVisualization/resolves/resolveDrilldown.d.ts.map +1 -1
- package/dist/engine/visualization/resolveVisualization/resolves/resolveDrilldown.js.map +1 -1
- package/dist/engine/visualization/resolveVisualization/resolves/resolveLinks.d.ts.map +1 -1
- package/dist/engine/visualization/resolveVisualization/resolves/resolveLinks.js.map +1 -1
- package/dist/engine/visualization/resolveVisualization/resolves/resolveProportionCount.d.ts.map +1 -1
- package/dist/engine/visualization/resolveVisualization/resolves/resolveProportionCount.js.map +1 -1
- package/dist/engine/visualization/resolveVisualization/resolves/resolveValueRange.d.ts.map +1 -1
- package/dist/engine/visualization/resolveVisualization/resolves/resolveValueRange.js.map +1 -1
- package/dist/engine/visualization/resolveVisualization/utils/pluralize.d.ts.map +1 -1
- package/dist/engine/visualization/resolveVisualization/utils/pluralize.js.map +1 -1
- package/dist/engine/visualization/resolveVisualization/utils/readDrilldownItems.d.ts.map +1 -1
- package/dist/engine/visualization/resolveVisualization/utils/readDrilldownItems.js.map +1 -1
- package/dist/engine/visualization/resolveVisualization/utils/readNumber.d.ts.map +1 -1
- package/dist/engine/visualization/resolveVisualization/utils/readNumber.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +24 -4
- package/dist/plugin.js.map +1 -1
- package/dist/types/config.d.ts +42 -9
- package/dist/types/config.d.ts.map +1 -1
- package/dist/ui/CheckRow/CheckVisualization/visualizations/DensityGauge.d.ts.map +1 -1
- package/dist/ui/CheckRow/CheckVisualization/visualizations/DensityGauge.js +24 -5
- package/dist/ui/CheckRow/CheckVisualization/visualizations/DensityGauge.js.map +1 -1
- package/dist/ui/CheckRow/CheckVisualization/visualizations/DistributionBar.d.ts.map +1 -1
- package/dist/ui/CheckRow/CheckVisualization/visualizations/DistributionBar.js +8 -1
- package/dist/ui/CheckRow/CheckVisualization/visualizations/DistributionBar.js.map +1 -1
- package/dist/ui/CheckRow/CheckVisualization/visualizations/DrillDown.d.ts.map +1 -1
- package/dist/ui/CheckRow/CheckVisualization/visualizations/DrillDown.js +11 -4
- package/dist/ui/CheckRow/CheckVisualization/visualizations/DrillDown.js.map +1 -1
- package/dist/ui/CheckRow/CheckVisualization/visualizations/SegmentBar.d.ts.map +1 -1
- package/dist/ui/CheckRow/CheckVisualization/visualizations/SegmentBar.js +7 -1
- package/dist/ui/CheckRow/CheckVisualization/visualizations/SegmentBar.js.map +1 -1
- package/dist/ui/CheckRow/index.d.ts.map +1 -1
- package/dist/ui/CheckRow/index.js +23 -9
- package/dist/ui/CheckRow/index.js.map +1 -1
- package/dist/ui/FilterPills.d.ts.map +1 -1
- package/dist/ui/FilterPills.js +78 -19
- package/dist/ui/FilterPills.js.map +1 -1
- package/dist/ui/KpiCard.d.ts.map +1 -1
- package/dist/ui/KpiCard.js.map +1 -1
- package/dist/ui/Pill.d.ts.map +1 -1
- package/dist/ui/Pill.js +11 -8
- package/dist/ui/Pill.js.map +1 -1
- package/dist/ui/ScoreRing.d.ts.map +1 -1
- package/dist/ui/ScoreRing.js +12 -2
- package/dist/ui/ScoreRing.js.map +1 -1
- package/dist/ui/SectionWrapper.d.ts.map +1 -1
- package/dist/ui/SectionWrapper.js.map +1 -1
- package/dist/ui/SegmentedControl.d.ts +1 -1
- package/dist/ui/SegmentedControl.d.ts.map +1 -1
- package/dist/ui/SegmentedControl.js +49 -33
- package/dist/ui/SegmentedControl.js.map +1 -1
- package/dist/ui/Tooltip.d.ts +1 -1
- package/dist/ui/Tooltip.d.ts.map +1 -1
- package/dist/ui/Tooltip.js +8 -1
- package/dist/ui/Tooltip.js.map +1 -1
- package/dist/utils/config/overrideAdmin.js +1 -1
- package/dist/utils/config/overrideAdmin.js.map +1 -1
- package/dist/utils/style.d.ts.map +1 -1
- package/dist/utils/style.js.map +1 -1
- package/package.json +9 -7
- package/dist/content/extractContent.d.ts +0 -3
- package/dist/content/extractContent.d.ts.map +0 -1
- package/dist/content/extractContent.js +0 -31
- package/dist/content/extractContent.js.map +0 -1
- package/dist/content/uploads/collect-upload-refs.d.ts +0 -5
- package/dist/content/uploads/collect-upload-refs.d.ts.map +0 -1
- package/dist/content/uploads/collect-upload-refs.js +0 -19
- package/dist/content/uploads/collect-upload-refs.js.map +0 -1
- package/dist/content/uploads/hydrate-values.d.ts +0 -5
- package/dist/content/uploads/hydrate-values.d.ts.map +0 -1
- package/dist/content/uploads/hydrate-values.js +0 -15
- package/dist/content/uploads/hydrate-values.js.map +0 -1
- package/dist/content/uploads/media-resolver.d.ts +0 -7
- package/dist/content/uploads/media-resolver.d.ts.map +0 -1
- package/dist/content/uploads/media-resolver.js +0 -60
- package/dist/content/uploads/media-resolver.js.map +0 -1
- package/dist/content/uploads/transform-lexical-uploads.d.ts +0 -5
- package/dist/content/uploads/transform-lexical-uploads.d.ts.map +0 -1
- package/dist/content/uploads/transform-lexical-uploads.js +0 -34
- package/dist/content/uploads/transform-lexical-uploads.js.map +0 -1
- package/dist/content/uploads/transform-upload-values.d.ts +0 -10
- package/dist/content/uploads/transform-upload-values.d.ts.map +0 -1
- package/dist/content/uploads/transform-upload-values.js +0 -108
- package/dist/content/uploads/transform-upload-values.js.map +0 -1
- package/dist/content/uploads/types.d.ts +0 -8
- package/dist/content/uploads/types.d.ts.map +0 -1
- package/dist/content/uploads/types.js +0 -7
- package/dist/content/uploads/types.js.map +0 -1
- package/dist/content/walkValue.d.ts +0 -14
- package/dist/content/walkValue.d.ts.map +0 -1
- package/dist/content/walkValue.js +0 -62
- package/dist/content/walkValue.js.map +0 -1
|
@@ -1,14 +1,24 @@
|
|
|
1
1
|
function valueAt(values, path) {
|
|
2
2
|
if (!path)
|
|
3
3
|
return "";
|
|
4
|
-
const v = path.split(".").reduce(
|
|
4
|
+
const v = path.split(".").reduce(
|
|
5
|
+
(acc, k) => acc && typeof acc === "object" ? acc[k] : void 0,
|
|
6
|
+
values
|
|
7
|
+
);
|
|
5
8
|
return typeof v === "string" ? v : "";
|
|
6
9
|
}
|
|
7
10
|
function normalizeLocale(locale) {
|
|
8
11
|
const code = (typeof locale === "object" && locale ? locale.code : locale != null ? String(locale) : void 0) ?? "en";
|
|
9
12
|
return code.includes("_") ? code : `${code}_${code.toUpperCase()}`;
|
|
10
13
|
}
|
|
11
|
-
function buildInput({
|
|
14
|
+
function buildInput({
|
|
15
|
+
values,
|
|
16
|
+
contentHtml,
|
|
17
|
+
locale,
|
|
18
|
+
keyphrase,
|
|
19
|
+
fields,
|
|
20
|
+
site
|
|
21
|
+
}) {
|
|
12
22
|
const title = valueAt(values, fields.seoTitle) || valueAt(values, "title");
|
|
13
23
|
return {
|
|
14
24
|
title,
|
|
@@ -22,7 +32,7 @@ function buildInput({ values, contentHtml, locale, keyphrase, fields, site }) {
|
|
|
22
32
|
seoTitle: Boolean(fields.seoTitle && valueAt(values, fields.seoTitle)),
|
|
23
33
|
metaDescription: Boolean(fields.metaDescription),
|
|
24
34
|
slug: Boolean(fields.slug ?? "slug"),
|
|
25
|
-
content:
|
|
35
|
+
content: contentHtml.trim().length > 0
|
|
26
36
|
}
|
|
27
37
|
};
|
|
28
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/SeoDrawer/buildInput.ts"],"sourcesContent":["import type { AnalysisInput } from \"../../engine/types/analysis\";\nimport type { SeoFieldPaths } from \"../../types/config\";\n\nfunction valueAt(values: Record<string, unknown>, path?: string): string {\n if (!path) return \"\";\n\n const v = path.split(\".\").reduce<unknown>((acc, k)
|
|
1
|
+
{"version":3,"sources":["../../../src/components/SeoDrawer/buildInput.ts"],"sourcesContent":["import type { AnalysisInput } from \"../../engine/types/analysis\";\nimport type { SeoFieldPaths } from \"../../types/config\";\n\nfunction valueAt(values: Record<string, unknown>, path?: string): string {\n if (!path) return \"\";\n\n const v = path\n .split(\".\")\n .reduce<unknown>(\n (acc, k) =>\n acc && typeof acc === \"object\" ? (acc as Record<string, unknown>)[k] : undefined,\n values\n );\n\n return typeof v === \"string\" ? v : \"\";\n}\n\nfunction normalizeLocale(locale: string | { code?: string } | null | undefined): string {\n const code =\n (typeof locale === \"object\" && locale\n ? locale.code\n : locale != null\n ? String(locale)\n : undefined) ?? \"en\";\n\n return code.includes(\"_\") ? code : `${code}_${code.toUpperCase()}`;\n}\n\nexport interface BuildInputArgs {\n values: Record<string, unknown>;\n contentHtml: string;\n locale: string | { code?: string } | null | undefined;\n keyphrase: string;\n fields: SeoFieldPaths;\n site: { name: string; baseUrl: string };\n}\n\nexport function buildInput({\n values,\n contentHtml,\n locale,\n keyphrase,\n fields,\n site,\n}: BuildInputArgs): AnalysisInput {\n const title = valueAt(values, fields.seoTitle) || valueAt(values, \"title\");\n\n return {\n title,\n slug: valueAt(values, fields.slug ?? \"slug\"),\n description: valueAt(values, fields.metaDescription),\n contentHtml,\n keyphrase,\n locale: normalizeLocale(locale),\n site,\n has: {\n seoTitle: Boolean(fields.seoTitle && valueAt(values, fields.seoTitle)),\n metaDescription: Boolean(fields.metaDescription),\n slug: Boolean(fields.slug ?? \"slug\"),\n content: contentHtml.trim().length > 0,\n },\n };\n}\n"],"mappings":"AAGA,SAAS,QAAQ,QAAiC,MAAuB;AACvE,MAAI,CAAC;AAAM,WAAO;AAElB,QAAM,IAAI,KACP,MAAM,GAAG,EACT;AAAA,IACC,CAAC,KAAK,MACJ,OAAO,OAAO,QAAQ,WAAY,IAAgC,CAAC,IAAI;AAAA,IACzE;AAAA,EACF;AAEF,SAAO,OAAO,MAAM,WAAW,IAAI;AACrC;AAEA,SAAS,gBAAgB,QAA+D;AACtF,QAAM,QACH,OAAO,WAAW,YAAY,SAC3B,OAAO,OACP,UAAU,OACR,OAAO,MAAM,IACb,WAAc;AAEtB,SAAO,KAAK,SAAS,GAAG,IAAI,OAAO,GAAG,IAAI,IAAI,KAAK,YAAY,CAAC;AAClE;AAWO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAkC;AAChC,QAAM,QAAQ,QAAQ,QAAQ,OAAO,QAAQ,KAAK,QAAQ,QAAQ,OAAO;AAEzE,SAAO;AAAA,IACL;AAAA,IACA,MAAM,QAAQ,QAAQ,OAAO,QAAQ,MAAM;AAAA,IAC3C,aAAa,QAAQ,QAAQ,OAAO,eAAe;AAAA,IACnD;AAAA,IACA;AAAA,IACA,QAAQ,gBAAgB,MAAM;AAAA,IAC9B;AAAA,IACA,KAAK;AAAA,MACH,UAAU,QAAQ,OAAO,YAAY,QAAQ,QAAQ,OAAO,QAAQ,CAAC;AAAA,MACrE,iBAAiB,QAAQ,OAAO,eAAe;AAAA,MAC/C,MAAM,QAAQ,OAAO,QAAQ,MAAM;AAAA,MACnC,SAAS,YAAY,KAAK,EAAE,SAAS;AAAA,IACvC;AAAA,EACF;AACF;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../../../src/components/SeoDrawer/components/Header.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAKlE,UAAU,WAAW;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,wBAAgB,MAAM,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../../../src/components/SeoDrawer/components/Header.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAKlE,UAAU,WAAW;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,wBAAgB,MAAM,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,WAAW,2CA+BrE"}
|
|
@@ -11,8 +11,26 @@ function Header({ drawerSlug, total, totalStatus }) {
|
|
|
11
11
|
/* @__PURE__ */ jsx("h2", { className: "text-[16px] font-semibold m-0", children: "SEO Analytics" }),
|
|
12
12
|
totalStatus === "idle" ? null : /* @__PURE__ */ jsx(Pill, { variant: totalStatus, children: total })
|
|
13
13
|
] }),
|
|
14
|
-
/* @__PURE__ */ jsx(
|
|
15
|
-
|
|
14
|
+
/* @__PURE__ */ jsx(
|
|
15
|
+
"button",
|
|
16
|
+
{
|
|
17
|
+
"aria-label": "Close",
|
|
18
|
+
className: "drawer__header__close",
|
|
19
|
+
onClick: () => closeModal(drawerSlug),
|
|
20
|
+
type: "button",
|
|
21
|
+
children: /* @__PURE__ */ jsx(XIcon, {})
|
|
22
|
+
}
|
|
23
|
+
),
|
|
24
|
+
/* @__PURE__ */ jsx("div", { className: "absolute inset-x-0 bottom-0 h-[2px] bg-neutral-150", children: /* @__PURE__ */ jsx(
|
|
25
|
+
"i",
|
|
26
|
+
{
|
|
27
|
+
className: cn(
|
|
28
|
+
"block h-full",
|
|
29
|
+
totalStatus === "idle" ? void 0 : statusVar({ status: totalStatus })
|
|
30
|
+
),
|
|
31
|
+
style: { width: `${total}%`, background: "var(--seo-c)" }
|
|
32
|
+
}
|
|
33
|
+
) })
|
|
16
34
|
] });
|
|
17
35
|
}
|
|
18
36
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/SeoDrawer/components/Header.tsx"],"sourcesContent":["\"use client\";\n\nimport { useModal, XIcon } from \"@payloadcms/ui\";\nimport type { TotalStatus } from \"../../../engine/types/analysis\";\nimport { cn } from \"../../../utils/style\";\nimport { statusVar } from \"../variants\";\nimport { Pill } from \"../../../ui/Pill\";\n\ninterface HeaderProps {\n drawerSlug: string;\n total: number;\n totalStatus: TotalStatus;\n}\n\nexport function Header({ drawerSlug, total, totalStatus }: HeaderProps) {\n const { closeModal } = useModal();\n\n return (\n <div className=\"relative flex items-center justify-between px-[4px] py-[16px]\">\n <div className=\"flex items-center gap-[11px]\">\n <h2 className=\"text-[16px] font-semibold m-0\">SEO Analytics</h2>\n\n {totalStatus === \"idle\" ? null : <Pill variant={totalStatus}>{total}</Pill>}\n </div>\n\n <button
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/SeoDrawer/components/Header.tsx"],"sourcesContent":["\"use client\";\n\nimport { useModal, XIcon } from \"@payloadcms/ui\";\nimport type { TotalStatus } from \"../../../engine/types/analysis\";\nimport { cn } from \"../../../utils/style\";\nimport { statusVar } from \"../variants\";\nimport { Pill } from \"../../../ui/Pill\";\n\ninterface HeaderProps {\n drawerSlug: string;\n total: number;\n totalStatus: TotalStatus;\n}\n\nexport function Header({ drawerSlug, total, totalStatus }: HeaderProps) {\n const { closeModal } = useModal();\n\n return (\n <div className=\"relative flex items-center justify-between px-[4px] py-[16px]\">\n <div className=\"flex items-center gap-[11px]\">\n <h2 className=\"text-[16px] font-semibold m-0\">SEO Analytics</h2>\n\n {totalStatus === \"idle\" ? null : <Pill variant={totalStatus}>{total}</Pill>}\n </div>\n\n <button\n aria-label=\"Close\"\n className=\"drawer__header__close\"\n onClick={() => closeModal(drawerSlug)}\n type=\"button\"\n >\n <XIcon />\n </button>\n\n <div className=\"absolute inset-x-0 bottom-0 h-[2px] bg-neutral-150\">\n <i\n className={cn(\n \"block h-full\",\n totalStatus === \"idle\" ? undefined : statusVar({ status: totalStatus })\n )}\n style={{ width: `${total}%`, background: \"var(--seo-c)\" }}\n />\n </div>\n </div>\n );\n}\n"],"mappings":";AAmBM,SACE,KADF;AAjBN,SAAS,UAAU,aAAa;AAEhC,SAAS,UAAU;AACnB,SAAS,iBAAiB;AAC1B,SAAS,YAAY;AAQd,SAAS,OAAO,EAAE,YAAY,OAAO,YAAY,GAAgB;AACtE,QAAM,EAAE,WAAW,IAAI,SAAS;AAEhC,SACE,qBAAC,SAAI,WAAU,iEACb;AAAA,yBAAC,SAAI,WAAU,gCACb;AAAA,0BAAC,QAAG,WAAU,iCAAgC,2BAAa;AAAA,MAE1D,gBAAgB,SAAS,OAAO,oBAAC,QAAK,SAAS,aAAc,iBAAM;AAAA,OACtE;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,cAAW;AAAA,QACX,WAAU;AAAA,QACV,SAAS,MAAM,WAAW,UAAU;AAAA,QACpC,MAAK;AAAA,QAEL,8BAAC,SAAM;AAAA;AAAA,IACT;AAAA,IAEA,oBAAC,SAAI,WAAU,sDACb;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA,gBAAgB,SAAS,SAAY,UAAU,EAAE,QAAQ,YAAY,CAAC;AAAA,QACxE;AAAA,QACA,OAAO,EAAE,OAAO,GAAG,KAAK,KAAK,YAAY,eAAe;AAAA;AAAA,IAC1D,GACF;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeadingLevelTiles.d.ts","sourceRoot":"","sources":["../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingLevelTiles.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAG3E,UAAU,sBAAsB;IAC9B,MAAM,EAAE,iBAAiB,EAAE,CAAC;CAC7B;AAED,wBAAgB,iBAAiB,CAAC,EAAE,MAAM,EAAE,EAAE,sBAAsB,
|
|
1
|
+
{"version":3,"file":"HeadingLevelTiles.d.ts","sourceRoot":"","sources":["../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingLevelTiles.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAG3E,UAAU,sBAAsB;IAC9B,MAAM,EAAE,iBAAiB,EAAE,CAAC;CAC7B;AAED,wBAAgB,iBAAiB,CAAC,EAAE,MAAM,EAAE,EAAE,sBAAsB,2CAqCnE"}
|
|
@@ -12,11 +12,29 @@ function HeadingLevelTiles({ levels }) {
|
|
|
12
12
|
zero ? "border-dashed border-neutral-300 bg-neutral-50" : "border-neutral-200 bg-neutral-0"
|
|
13
13
|
),
|
|
14
14
|
children: [
|
|
15
|
-
/* @__PURE__ */ jsxs(
|
|
16
|
-
"
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
15
|
+
/* @__PURE__ */ jsxs(
|
|
16
|
+
"span",
|
|
17
|
+
{
|
|
18
|
+
className: cn(
|
|
19
|
+
"font-mono text-[12px] font-semibold",
|
|
20
|
+
zero ? "text-neutral-400" : "text-neutral-500"
|
|
21
|
+
),
|
|
22
|
+
children: [
|
|
23
|
+
"H",
|
|
24
|
+
level
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
),
|
|
28
|
+
/* @__PURE__ */ jsx(
|
|
29
|
+
"span",
|
|
30
|
+
{
|
|
31
|
+
className: cn(
|
|
32
|
+
"font-mono text-[12px] font-bold",
|
|
33
|
+
zero ? "text-neutral-300" : "text-neutral-1000"
|
|
34
|
+
),
|
|
35
|
+
children: count
|
|
36
|
+
}
|
|
37
|
+
)
|
|
20
38
|
]
|
|
21
39
|
},
|
|
22
40
|
level
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingLevelTiles.tsx"],"sourcesContent":["\"use client\";\n\nimport type { HeadingLevelCount } from \"../../../../engine/types/analysis\";\nimport { cn } from \"../../../../utils/style\";\n\ninterface HeadingLevelTilesProps {\n levels: HeadingLevelCount[];\n}\n\nexport function HeadingLevelTiles({ levels }: HeadingLevelTilesProps) {\n return (\n <div className=\"grid grid-cols-6 gap-[6px] px-[15px] pt-[8px] pb-[12px]\">\n {levels.map(({ level, count }) => {\n const zero = count === 0;\n\n return (\n <div\n key={level}\n className={cn(\n \"flex items-baseline justify-center gap-[5px] rounded-rs border px-[2px] py-[7px]\",\n zero
|
|
1
|
+
{"version":3,"sources":["../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingLevelTiles.tsx"],"sourcesContent":["\"use client\";\n\nimport type { HeadingLevelCount } from \"../../../../engine/types/analysis\";\nimport { cn } from \"../../../../utils/style\";\n\ninterface HeadingLevelTilesProps {\n levels: HeadingLevelCount[];\n}\n\nexport function HeadingLevelTiles({ levels }: HeadingLevelTilesProps) {\n return (\n <div className=\"grid grid-cols-6 gap-[6px] px-[15px] pt-[8px] pb-[12px]\">\n {levels.map(({ level, count }) => {\n const zero = count === 0;\n\n return (\n <div\n key={level}\n className={cn(\n \"flex items-baseline justify-center gap-[5px] rounded-rs border px-[2px] py-[7px]\",\n zero\n ? \"border-dashed border-neutral-300 bg-neutral-50\"\n : \"border-neutral-200 bg-neutral-0\"\n )}\n >\n <span\n className={cn(\n \"font-mono text-[12px] font-semibold\",\n zero ? \"text-neutral-400\" : \"text-neutral-500\"\n )}\n >\n H{level}\n </span>\n <span\n className={cn(\n \"font-mono text-[12px] font-bold\",\n zero ? \"text-neutral-300\" : \"text-neutral-1000\"\n )}\n >\n {count}\n </span>\n </div>\n );\n })}\n </div>\n );\n}\n"],"mappings":";AAyBY,SAQA,KARA;AAtBZ,SAAS,UAAU;AAMZ,SAAS,kBAAkB,EAAE,OAAO,GAA2B;AACpE,SACE,oBAAC,SAAI,WAAU,2DACZ,iBAAO,IAAI,CAAC,EAAE,OAAO,MAAM,MAAM;AAChC,UAAM,OAAO,UAAU;AAEvB,WACE;AAAA,MAAC;AAAA;AAAA,QAEC,WAAW;AAAA,UACT;AAAA,UACA,OACI,mDACA;AAAA,QACN;AAAA,QAEA;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,OAAO,qBAAqB;AAAA,cAC9B;AAAA,cACD;AAAA;AAAA,gBACG;AAAA;AAAA;AAAA,UACJ;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,OAAO,qBAAqB;AAAA,cAC9B;AAAA,cAEC;AAAA;AAAA,UACH;AAAA;AAAA;AAAA,MAvBK;AAAA,IAwBP;AAAA,EAEJ,CAAC,GACH;AAEJ;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chevron.d.ts","sourceRoot":"","sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/Chevron.tsx"],"names":[],"mappings":"AAGA,wBAAgB,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"Chevron.d.ts","sourceRoot":"","sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/Chevron.tsx"],"names":[],"mappings":"AAGA,wBAAgB,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,2CAYlD"}
|
|
@@ -2,7 +2,18 @@ import { jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import { ChevronDown } from "lucide-react";
|
|
3
3
|
import { cn } from "../../../../../utils/style";
|
|
4
4
|
function Chevron({ open }) {
|
|
5
|
-
return /* @__PURE__ */ jsx(
|
|
5
|
+
return /* @__PURE__ */ jsx(
|
|
6
|
+
ChevronDown,
|
|
7
|
+
{
|
|
8
|
+
size: 13,
|
|
9
|
+
strokeWidth: 2.2,
|
|
10
|
+
"aria-hidden": "true",
|
|
11
|
+
className: cn(
|
|
12
|
+
"flex-none text-neutral-500 transition-transform duration-150",
|
|
13
|
+
!open && "-rotate-90"
|
|
14
|
+
)
|
|
15
|
+
}
|
|
16
|
+
);
|
|
6
17
|
}
|
|
7
18
|
export {
|
|
8
19
|
Chevron
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/Chevron.tsx"],"sourcesContent":["import { ChevronDown } from \"lucide-react\";\nimport { cn } from \"../../../../../utils/style\";\n\nexport function Chevron({ open }: { open: boolean }) {\n return <ChevronDown
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/Chevron.tsx"],"sourcesContent":["import { ChevronDown } from \"lucide-react\";\nimport { cn } from \"../../../../../utils/style\";\n\nexport function Chevron({ open }: { open: boolean }) {\n return (\n <ChevronDown\n size={13}\n strokeWidth={2.2}\n aria-hidden=\"true\"\n className={cn(\n \"flex-none text-neutral-500 transition-transform duration-150\",\n !open && \"-rotate-90\"\n )}\n />\n );\n}\n"],"mappings":"AAKI;AALJ,SAAS,mBAAmB;AAC5B,SAAS,UAAU;AAEZ,SAAS,QAAQ,EAAE,KAAK,GAAsB;AACnD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAM;AAAA,MACN,aAAa;AAAA,MACb,eAAY;AAAA,MACZ,WAAW;AAAA,QACT;AAAA,QACA,CAAC,QAAQ;AAAA,MACX;AAAA;AAAA,EACF;AAEJ;","names":[]}
|
package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeGroup.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeadingTreeGroup.d.ts","sourceRoot":"","sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeGroup.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"HeadingTreeGroup.d.ts","sourceRoot":"","sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeGroup.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAuFxE,UAAU,qBAAqB;IAC7B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC/B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAED,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,qBAAqB,2CAe5F"}
|
package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeGroup.js
CHANGED
|
@@ -2,7 +2,14 @@
|
|
|
2
2
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { HeadingTreeRow } from "./HeadingTreeRow";
|
|
4
4
|
import { useHeadingRails } from "./useHeadingRails";
|
|
5
|
-
function HeadingTreeNode({
|
|
5
|
+
function HeadingTreeNode({
|
|
6
|
+
node,
|
|
7
|
+
depth,
|
|
8
|
+
globalFirst,
|
|
9
|
+
collapsed,
|
|
10
|
+
onToggle,
|
|
11
|
+
onBadgeMount
|
|
12
|
+
}) {
|
|
6
13
|
const hasKids = node.children.length > 0;
|
|
7
14
|
const isOpen = hasKids && !collapsed.has(node.id);
|
|
8
15
|
const { containerRef, setBadgeRef, registerChildBadge, rails } = useHeadingRails({
|
|
@@ -37,12 +44,44 @@ function HeadingTreeNode({ node, depth, globalFirst, collapsed, onToggle, onBadg
|
|
|
37
44
|
elbow.id
|
|
38
45
|
))
|
|
39
46
|
] }) : null,
|
|
40
|
-
/* @__PURE__ */ jsx(
|
|
41
|
-
|
|
47
|
+
/* @__PURE__ */ jsx(
|
|
48
|
+
HeadingTreeRow,
|
|
49
|
+
{
|
|
50
|
+
node,
|
|
51
|
+
depth,
|
|
52
|
+
hasKids,
|
|
53
|
+
isOpen,
|
|
54
|
+
globalFirst,
|
|
55
|
+
onToggle,
|
|
56
|
+
badgeRef: setBadgeRef
|
|
57
|
+
}
|
|
58
|
+
),
|
|
59
|
+
isOpen ? /* @__PURE__ */ jsx("div", { children: node.children.map((child) => /* @__PURE__ */ jsx(
|
|
60
|
+
HeadingTreeNode,
|
|
61
|
+
{
|
|
62
|
+
node: child,
|
|
63
|
+
depth: depth + 1,
|
|
64
|
+
globalFirst: false,
|
|
65
|
+
collapsed,
|
|
66
|
+
onToggle,
|
|
67
|
+
onBadgeMount: registerChildBadge(child.id)
|
|
68
|
+
},
|
|
69
|
+
child.id
|
|
70
|
+
)) }) : null
|
|
42
71
|
] });
|
|
43
72
|
}
|
|
44
73
|
function HeadingTreeGroup({ nodes, depth, collapsed, onToggle }) {
|
|
45
|
-
return /* @__PURE__ */ jsx(Fragment, { children: nodes.map((node, i) => /* @__PURE__ */ jsx(
|
|
74
|
+
return /* @__PURE__ */ jsx(Fragment, { children: nodes.map((node, i) => /* @__PURE__ */ jsx(
|
|
75
|
+
HeadingTreeNode,
|
|
76
|
+
{
|
|
77
|
+
node,
|
|
78
|
+
depth,
|
|
79
|
+
globalFirst: depth === 0 && i === 0,
|
|
80
|
+
collapsed,
|
|
81
|
+
onToggle
|
|
82
|
+
},
|
|
83
|
+
node.id
|
|
84
|
+
)) });
|
|
46
85
|
}
|
|
47
86
|
export {
|
|
48
87
|
HeadingTreeGroup
|
package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeGroup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeGroup.tsx"],"sourcesContent":["\"use client\";\n\nimport type { HeadingNode } from \"../../../../../engine/types/analysis\";\nimport { HeadingTreeRow } from \"./HeadingTreeRow\";\nimport { useHeadingRails } from \"./useHeadingRails\";\n\ninterface HeadingTreeNodeProps {\n node: HeadingNode;\n depth: number;\n globalFirst: boolean;\n collapsed: ReadonlySet<string>;\n onToggle: (id: string) => void;\n onBadgeMount?: (el: HTMLSpanElement | null) => void;\n}\n\nfunction HeadingTreeNode({
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeGroup.tsx"],"sourcesContent":["\"use client\";\n\nimport type { HeadingNode } from \"../../../../../engine/types/analysis\";\nimport { HeadingTreeRow } from \"./HeadingTreeRow\";\nimport { useHeadingRails } from \"./useHeadingRails\";\n\ninterface HeadingTreeNodeProps {\n node: HeadingNode;\n depth: number;\n globalFirst: boolean;\n collapsed: ReadonlySet<string>;\n onToggle: (id: string) => void;\n onBadgeMount?: (el: HTMLSpanElement | null) => void;\n}\n\nfunction HeadingTreeNode({\n node,\n depth,\n globalFirst,\n collapsed,\n onToggle,\n onBadgeMount,\n}: HeadingTreeNodeProps) {\n const hasKids = node.children.length > 0;\n const isOpen = hasKids && !collapsed.has(node.id);\n\n const { containerRef, setBadgeRef, registerChildBadge, rails } = useHeadingRails({\n node,\n isOpen,\n collapsed,\n onBadgeMount,\n });\n\n return (\n <div ref={containerRef} className=\"relative\">\n {rails ? (\n <>\n <span\n className=\"absolute w-[1.1px] bg-neutral-150\"\n style={{\n left: rails.vertical.left,\n top: rails.vertical.top,\n height: rails.vertical.height,\n }}\n />\n\n {rails.elbows.map((elbow) => (\n <span\n key={elbow.id}\n className=\"absolute h-[1.1px] bg-neutral-150\"\n style={{\n left: elbow.left,\n top: elbow.top,\n width: elbow.width,\n }}\n />\n ))}\n </>\n ) : null}\n\n <HeadingTreeRow\n node={node}\n depth={depth}\n hasKids={hasKids}\n isOpen={isOpen}\n globalFirst={globalFirst}\n onToggle={onToggle}\n badgeRef={setBadgeRef}\n />\n\n {isOpen ? (\n <div>\n {node.children.map((child) => (\n <HeadingTreeNode\n key={child.id}\n node={child}\n depth={depth + 1}\n globalFirst={false}\n collapsed={collapsed}\n onToggle={onToggle}\n onBadgeMount={registerChildBadge(child.id)}\n />\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n\ninterface HeadingTreeGroupProps {\n nodes: HeadingNode[];\n depth: number;\n collapsed: ReadonlySet<string>;\n onToggle: (id: string) => void;\n}\n\nexport function HeadingTreeGroup({ nodes, depth, collapsed, onToggle }: HeadingTreeGroupProps) {\n return (\n <>\n {nodes.map((node, i) => (\n <HeadingTreeNode\n key={node.id}\n node={node}\n depth={depth}\n globalFirst={depth === 0 && i === 0}\n collapsed={collapsed}\n onToggle={onToggle}\n />\n ))}\n </>\n );\n}\n"],"mappings":";AAoCQ,mBACE,KADF;AAjCR,SAAS,sBAAsB;AAC/B,SAAS,uBAAuB;AAWhC,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,UAAU,KAAK,SAAS,SAAS;AACvC,QAAM,SAAS,WAAW,CAAC,UAAU,IAAI,KAAK,EAAE;AAEhD,QAAM,EAAE,cAAc,aAAa,oBAAoB,MAAM,IAAI,gBAAgB;AAAA,IAC/E;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SACE,qBAAC,SAAI,KAAK,cAAc,WAAU,YAC/B;AAAA,YACC,iCACE;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO;AAAA,YACL,MAAM,MAAM,SAAS;AAAA,YACrB,KAAK,MAAM,SAAS;AAAA,YACpB,QAAQ,MAAM,SAAS;AAAA,UACzB;AAAA;AAAA,MACF;AAAA,MAEC,MAAM,OAAO,IAAI,CAAC,UACjB;AAAA,QAAC;AAAA;AAAA,UAEC,WAAU;AAAA,UACV,OAAO;AAAA,YACL,MAAM,MAAM;AAAA,YACZ,KAAK,MAAM;AAAA,YACX,OAAO,MAAM;AAAA,UACf;AAAA;AAAA,QANK,MAAM;AAAA,MAOb,CACD;AAAA,OACH,IACE;AAAA,IAEJ;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU;AAAA;AAAA,IACZ;AAAA,IAEC,SACC,oBAAC,SACE,eAAK,SAAS,IAAI,CAAC,UAClB;AAAA,MAAC;AAAA;AAAA,QAEC,MAAM;AAAA,QACN,OAAO,QAAQ;AAAA,QACf,aAAa;AAAA,QACb;AAAA,QACA;AAAA,QACA,cAAc,mBAAmB,MAAM,EAAE;AAAA;AAAA,MANpC,MAAM;AAAA,IAOb,CACD,GACH,IACE;AAAA,KACN;AAEJ;AASO,SAAS,iBAAiB,EAAE,OAAO,OAAO,WAAW,SAAS,GAA0B;AAC7F,SACE,gCACG,gBAAM,IAAI,CAAC,MAAM,MAChB;AAAA,IAAC;AAAA;AAAA,MAEC;AAAA,MACA;AAAA,MACA,aAAa,UAAU,KAAK,MAAM;AAAA,MAClC;AAAA,MACA;AAAA;AAAA,IALK,KAAK;AAAA,EAMZ,CACD,GACH;AAEJ;","names":[]}
|
package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeRow.d.ts
CHANGED
|
@@ -10,6 +10,6 @@ interface HeadingTreeRowProps {
|
|
|
10
10
|
rowRef?: Ref<HTMLDivElement>;
|
|
11
11
|
badgeRef?: Ref<HTMLSpanElement>;
|
|
12
12
|
}
|
|
13
|
-
export declare function HeadingTreeRow({ node, depth, hasKids, isOpen, globalFirst, onToggle, rowRef, badgeRef }: HeadingTreeRowProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export declare function HeadingTreeRow({ node, depth, hasKids, isOpen, globalFirst, onToggle, rowRef, badgeRef, }: HeadingTreeRowProps): import("react/jsx-runtime").JSX.Element;
|
|
14
14
|
export {};
|
|
15
15
|
//# sourceMappingURL=HeadingTreeRow.d.ts.map
|
package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeRow.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeadingTreeRow.d.ts","sourceRoot":"","sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeRow.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAIxE,UAAU,mBAAmB;IAC3B,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,MAAM,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAC7B,QAAQ,CAAC,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;CACjC;AAED,wBAAgB,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"HeadingTreeRow.d.ts","sourceRoot":"","sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeRow.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAIxE,UAAU,mBAAmB;IAC3B,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,MAAM,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAC7B,QAAQ,CAAC,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;CACjC;AAED,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,KAAK,EACL,OAAO,EACP,MAAM,EACN,WAAW,EACX,QAAQ,EACR,MAAM,EACN,QAAQ,GACT,EAAE,mBAAmB,2CAwDrB"}
|
|
@@ -1,12 +1,24 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { cn } from "../../../../../utils/style";
|
|
3
3
|
import { Chevron } from "./Chevron";
|
|
4
|
-
function HeadingTreeRow({
|
|
4
|
+
function HeadingTreeRow({
|
|
5
|
+
node,
|
|
6
|
+
depth,
|
|
7
|
+
hasKids,
|
|
8
|
+
isOpen,
|
|
9
|
+
globalFirst,
|
|
10
|
+
onToggle,
|
|
11
|
+
rowRef,
|
|
12
|
+
badgeRef
|
|
13
|
+
}) {
|
|
5
14
|
return /* @__PURE__ */ jsxs(
|
|
6
15
|
"div",
|
|
7
16
|
{
|
|
8
17
|
ref: rowRef,
|
|
9
|
-
className: cn(
|
|
18
|
+
className: cn(
|
|
19
|
+
"relative flex items-center gap-[9px] h-[34px] box-border",
|
|
20
|
+
hasKids && "cursor-pointer focus-visible:outline-2 focus-visible:outline-neutral-400 focus-visible:-outline-offset-2"
|
|
21
|
+
),
|
|
10
22
|
style: { paddingLeft: depth * 20 },
|
|
11
23
|
role: hasKids ? "button" : void 0,
|
|
12
24
|
tabIndex: hasKids ? 0 : void 0,
|
|
@@ -20,14 +32,37 @@ function HeadingTreeRow({ node, depth, hasKids, isOpen, globalFirst, onToggle, r
|
|
|
20
32
|
} : void 0,
|
|
21
33
|
title: hasKids ? isOpen ? "Collapse" : "Expand" : void 0,
|
|
22
34
|
children: [
|
|
23
|
-
/* @__PURE__ */ jsxs(
|
|
24
|
-
"
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
35
|
+
/* @__PURE__ */ jsxs(
|
|
36
|
+
"span",
|
|
37
|
+
{
|
|
38
|
+
ref: badgeRef,
|
|
39
|
+
className: "flex-none font-mono text-[9px] font-bold leading-[100%] text-neutral-1000 bg-neutral-150 rounded-rs px-[6px] py-[3px] min-w-[22px] text-center",
|
|
40
|
+
children: [
|
|
41
|
+
"H",
|
|
42
|
+
node.level
|
|
43
|
+
]
|
|
44
|
+
}
|
|
45
|
+
),
|
|
46
|
+
/* @__PURE__ */ jsxs(
|
|
47
|
+
"div",
|
|
48
|
+
{
|
|
49
|
+
className: cn(
|
|
50
|
+
"flex-1 min-w-0 flex items-center gap-[9px] h-full",
|
|
51
|
+
!globalFirst && "border-t border-neutral-150"
|
|
52
|
+
),
|
|
53
|
+
children: [
|
|
54
|
+
node.text ? /* @__PURE__ */ jsx(
|
|
55
|
+
"span",
|
|
56
|
+
{
|
|
57
|
+
className: "flex-1 min-w-0 truncate text-[12px] font-medium text-neutral-800",
|
|
58
|
+
title: node.text,
|
|
59
|
+
children: node.text
|
|
60
|
+
}
|
|
61
|
+
) : /* @__PURE__ */ jsx("span", { className: "flex-1 min-w-0 truncate text-[12px] font-medium italic text-neutral-400", children: "(empty heading)" }),
|
|
62
|
+
hasKids ? /* @__PURE__ */ jsx(Chevron, { open: isOpen }) : null
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
)
|
|
31
66
|
]
|
|
32
67
|
}
|
|
33
68
|
);
|
package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeRow.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeRow.tsx"],"sourcesContent":["import type { Ref } from \"react\";\nimport type { HeadingNode } from \"../../../../../engine/types/analysis\";\nimport { cn } from \"../../../../../utils/style\";\nimport { Chevron } from \"./Chevron\";\n\ninterface HeadingTreeRowProps {\n node: HeadingNode;\n depth: number;\n hasKids: boolean;\n isOpen: boolean;\n globalFirst: boolean;\n onToggle: (id: string) => void;\n rowRef?: Ref<HTMLDivElement>;\n badgeRef?: Ref<HTMLSpanElement>;\n}\n\nexport function HeadingTreeRow({
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/HeadingTreeRow.tsx"],"sourcesContent":["import type { Ref } from \"react\";\nimport type { HeadingNode } from \"../../../../../engine/types/analysis\";\nimport { cn } from \"../../../../../utils/style\";\nimport { Chevron } from \"./Chevron\";\n\ninterface HeadingTreeRowProps {\n node: HeadingNode;\n depth: number;\n hasKids: boolean;\n isOpen: boolean;\n globalFirst: boolean;\n onToggle: (id: string) => void;\n rowRef?: Ref<HTMLDivElement>;\n badgeRef?: Ref<HTMLSpanElement>;\n}\n\nexport function HeadingTreeRow({\n node,\n depth,\n hasKids,\n isOpen,\n globalFirst,\n onToggle,\n rowRef,\n badgeRef,\n}: HeadingTreeRowProps) {\n return (\n <div\n ref={rowRef}\n className={cn(\n \"relative flex items-center gap-[9px] h-[34px] box-border\",\n hasKids &&\n \"cursor-pointer focus-visible:outline-2 focus-visible:outline-neutral-400 focus-visible:-outline-offset-2\"\n )}\n style={{ paddingLeft: depth * 20 }}\n role={hasKids ? \"button\" : undefined}\n tabIndex={hasKids ? 0 : undefined}\n aria-expanded={hasKids ? isOpen : undefined}\n onClick={hasKids ? () => onToggle(node.id) : undefined}\n onKeyDown={\n hasKids\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onToggle(node.id);\n }\n }\n : undefined\n }\n title={hasKids ? (isOpen ? \"Collapse\" : \"Expand\") : undefined}\n >\n <span\n ref={badgeRef}\n className=\"flex-none font-mono text-[9px] font-bold leading-[100%] text-neutral-1000 bg-neutral-150 rounded-rs px-[6px] py-[3px] min-w-[22px] text-center\"\n >\n H{node.level}\n </span>\n\n <div\n className={cn(\n \"flex-1 min-w-0 flex items-center gap-[9px] h-full\",\n !globalFirst && \"border-t border-neutral-150\"\n )}\n >\n {node.text ? (\n <span\n className=\"flex-1 min-w-0 truncate text-[12px] font-medium text-neutral-800\"\n title={node.text}\n >\n {node.text}\n </span>\n ) : (\n <span className=\"flex-1 min-w-0 truncate text-[12px] font-medium italic text-neutral-400\">\n (empty heading)\n </span>\n )}\n\n {hasKids ? <Chevron open={isOpen} /> : null}\n </div>\n </div>\n );\n}\n"],"mappings":"AAmDM,SAcI,KAdJ;AAjDN,SAAS,UAAU;AACnB,SAAS,eAAe;AAajB,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAwB;AACtB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW;AAAA,QACT;AAAA,QACA,WACE;AAAA,MACJ;AAAA,MACA,OAAO,EAAE,aAAa,QAAQ,GAAG;AAAA,MACjC,MAAM,UAAU,WAAW;AAAA,MAC3B,UAAU,UAAU,IAAI;AAAA,MACxB,iBAAe,UAAU,SAAS;AAAA,MAClC,SAAS,UAAU,MAAM,SAAS,KAAK,EAAE,IAAI;AAAA,MAC7C,WACE,UACI,CAAC,MAAM;AACL,YAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,YAAE,eAAe;AACjB,mBAAS,KAAK,EAAE;AAAA,QAClB;AAAA,MACF,IACA;AAAA,MAEN,OAAO,UAAW,SAAS,aAAa,WAAY;AAAA,MAEpD;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,WAAU;AAAA,YACX;AAAA;AAAA,cACG,KAAK;AAAA;AAAA;AAAA,QACT;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,CAAC,eAAe;AAAA,YAClB;AAAA,YAEC;AAAA,mBAAK,OACJ;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,OAAO,KAAK;AAAA,kBAEX,eAAK;AAAA;AAAA,cACR,IAEA,oBAAC,UAAK,WAAU,2EAA0E,6BAE1F;AAAA,cAGD,UAAU,oBAAC,WAAQ,MAAM,QAAQ,IAAK;AAAA;AAAA;AAAA,QACzC;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/index.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAKxE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,WAAW,EAAE,CAAC;CACrB;AAID,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/index.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAKxE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,WAAW,EAAE,CAAC;CACrB;AAID,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE,gBAAgB,2CA0CrD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/index.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport type { HeadingNode } from \"../../../../../engine/types/analysis\";\nimport { cn } from \"../../../../../utils/style\";\nimport { collectParentIds } from \"./headingTreeView\";\nimport { HeadingTreeGroup } from \"./HeadingTreeGroup\";\n\nexport interface HeadingTreeProps {\n tree: HeadingNode[];\n}\n\nconst SUB_LABEL = \"text-[9.5px] font-semibold uppercase tracking-[0.05em] text-neutral-500\";\n\nexport function HeadingTree({ tree }: HeadingTreeProps) {\n const parentIds = useMemo(() => collectParentIds(tree), [tree]);\n const [collapsed, setCollapsed] = useState<Set<string>>(() => new Set());\n\n const empty = tree.length === 0;\n const allCollapsed = parentIds.length > 0 && parentIds.every((id) => collapsed.has(id));\n\n const toggleAll = () => setCollapsed(allCollapsed ? new Set() : new Set(parentIds));\n const toggle = (id: string) =>\n setCollapsed((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n\n return (\n <div className=\"px-[15px] pt-[11px] border-t border-neutral-150\">\n <div className={cn(SUB_LABEL, \"flex items-center justify-between\")}>\n <span>Structure</span>\n\n {!empty && (\n <button\n type=\"button\"\n onClick={toggleAll}\n className=\"text-[11px] font-medium normal-case tracking-normal text-neutral-600 hover:text-neutral-1000 hover:underline underline-offset-2 bg-transparent border-0 p-0 cursor-pointer\"\n >\n {allCollapsed ? \"Expand all\" : \"Collapse all\"}\n </button>\n )}\n </div>\n {empty ? (\n <div className=\"px-[15px] pt-[20px] pb-[24px] text-center text-[12px] text-neutral-500\"
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/index.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport type { HeadingNode } from \"../../../../../engine/types/analysis\";\nimport { cn } from \"../../../../../utils/style\";\nimport { collectParentIds } from \"./headingTreeView\";\nimport { HeadingTreeGroup } from \"./HeadingTreeGroup\";\n\nexport interface HeadingTreeProps {\n tree: HeadingNode[];\n}\n\nconst SUB_LABEL = \"text-[9.5px] font-semibold uppercase tracking-[0.05em] text-neutral-500\";\n\nexport function HeadingTree({ tree }: HeadingTreeProps) {\n const parentIds = useMemo(() => collectParentIds(tree), [tree]);\n const [collapsed, setCollapsed] = useState<Set<string>>(() => new Set());\n\n const empty = tree.length === 0;\n const allCollapsed = parentIds.length > 0 && parentIds.every((id) => collapsed.has(id));\n\n const toggleAll = () => setCollapsed(allCollapsed ? new Set() : new Set(parentIds));\n const toggle = (id: string) =>\n setCollapsed((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n\n return (\n <div className=\"px-[15px] pt-[11px] border-t border-neutral-150\">\n <div className={cn(SUB_LABEL, \"flex items-center justify-between\")}>\n <span>Structure</span>\n\n {!empty && (\n <button\n type=\"button\"\n onClick={toggleAll}\n className=\"text-[11px] font-medium normal-case tracking-normal text-neutral-600 hover:text-neutral-1000 hover:underline underline-offset-2 bg-transparent border-0 p-0 cursor-pointer\"\n >\n {allCollapsed ? \"Expand all\" : \"Collapse all\"}\n </button>\n )}\n </div>\n {empty ? (\n <div className=\"px-[15px] pt-[20px] pb-[24px] text-center text-[12px] text-neutral-500\">\n No headings found in this content.\n </div>\n ) : (\n <div className=\"relative pt-[5px] pb-[7px]\">\n <HeadingTreeGroup nodes={tree} depth={0} collapsed={collapsed} onToggle={toggle} />\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";AAgCM,SACE,KADF;AA9BN,SAAS,SAAS,gBAAgB;AAElC,SAAS,UAAU;AACnB,SAAS,wBAAwB;AACjC,SAAS,wBAAwB;AAMjC,MAAM,YAAY;AAEX,SAAS,YAAY,EAAE,KAAK,GAAqB;AACtD,QAAM,YAAY,QAAQ,MAAM,iBAAiB,IAAI,GAAG,CAAC,IAAI,CAAC;AAC9D,QAAM,CAAC,WAAW,YAAY,IAAI,SAAsB,MAAM,oBAAI,IAAI,CAAC;AAEvE,QAAM,QAAQ,KAAK,WAAW;AAC9B,QAAM,eAAe,UAAU,SAAS,KAAK,UAAU,MAAM,CAAC,OAAO,UAAU,IAAI,EAAE,CAAC;AAEtF,QAAM,YAAY,MAAM,aAAa,eAAe,oBAAI,IAAI,IAAI,IAAI,IAAI,SAAS,CAAC;AAClF,QAAM,SAAS,CAAC,OACd,aAAa,CAAC,SAAS;AACrB,UAAM,OAAO,IAAI,IAAI,IAAI;AACzB,QAAI,KAAK,IAAI,EAAE;AAAG,WAAK,OAAO,EAAE;AAAA;AAC3B,WAAK,IAAI,EAAE;AAChB,WAAO;AAAA,EACT,CAAC;AAEH,SACE,qBAAC,SAAI,WAAU,mDACb;AAAA,yBAAC,SAAI,WAAW,GAAG,WAAW,mCAAmC,GAC/D;AAAA,0BAAC,UAAK,uBAAS;AAAA,MAEd,CAAC,SACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS;AAAA,UACT,WAAU;AAAA,UAET,yBAAe,eAAe;AAAA;AAAA,MACjC;AAAA,OAEJ;AAAA,IACC,QACC,oBAAC,SAAI,WAAU,0EAAyE,gDAExF,IAEA,oBAAC,SAAI,WAAU,8BACb,8BAAC,oBAAiB,OAAO,MAAM,OAAO,GAAG,WAAsB,UAAU,QAAQ,GACnF;AAAA,KAEJ;AAEJ;","names":[]}
|
package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/useHeadingRails.d.ts
CHANGED
|
@@ -27,6 +27,6 @@ interface UseHeadingRailsResult {
|
|
|
27
27
|
registerChildBadge: (childId: string) => (el: HTMLSpanElement | null) => void;
|
|
28
28
|
rails: RailGeometry | null;
|
|
29
29
|
}
|
|
30
|
-
export declare function useHeadingRails({ node, isOpen, collapsed, onBadgeMount }: UseHeadingRailsParams): UseHeadingRailsResult;
|
|
30
|
+
export declare function useHeadingRails({ node, isOpen, collapsed, onBadgeMount, }: UseHeadingRailsParams): UseHeadingRailsResult;
|
|
31
31
|
export {};
|
|
32
32
|
//# sourceMappingURL=useHeadingRails.d.ts.map
|
package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/useHeadingRails.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useHeadingRails.d.ts","sourceRoot":"","sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/useHeadingRails.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAExE,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,KAAK;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,UAAU,qBAAqB;IAC7B,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC/B,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI,KAAK,IAAI,CAAC;CACrD;AAED,UAAU,qBAAqB;IAC7B,YAAY,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC/C,WAAW,EAAE,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI,KAAK,IAAI,CAAC;IAClD,kBAAkB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI,KAAK,IAAI,CAAC;IAC9E,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;CAC5B;AAED,wBAAgB,eAAe,CAAC,
|
|
1
|
+
{"version":3,"file":"useHeadingRails.d.ts","sourceRoot":"","sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/useHeadingRails.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAExE,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,KAAK;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,UAAU,qBAAqB;IAC7B,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC/B,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI,KAAK,IAAI,CAAC;CACrD;AAED,UAAU,qBAAqB;IAC7B,YAAY,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC/C,WAAW,EAAE,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI,KAAK,IAAI,CAAC;IAClD,kBAAkB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI,KAAK,IAAI,CAAC;IAC9E,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;CAC5B;AAED,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,MAAM,EACN,SAAS,EACT,YAAY,GACb,EAAE,qBAAqB,GAAG,qBAAqB,CA6F/C"}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useLayoutEffect, useRef, useState } from "react";
|
|
3
|
-
function useHeadingRails({
|
|
3
|
+
function useHeadingRails({
|
|
4
|
+
node,
|
|
5
|
+
isOpen,
|
|
6
|
+
collapsed,
|
|
7
|
+
onBadgeMount
|
|
8
|
+
}) {
|
|
4
9
|
const containerRef = useRef(null);
|
|
5
10
|
const badgeRef = useRef(null);
|
|
6
11
|
const childBadges = useRef(/* @__PURE__ */ new Map());
|
package/dist/components/SeoDrawer/components/HeadingsSection/HeadingTree/useHeadingRails.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/useHeadingRails.ts"],"sourcesContent":["\"use client\";\n\nimport type { RefObject } from \"react\";\nimport { useLayoutEffect, useRef, useState } from \"react\";\nimport type { HeadingNode } from \"../../../../../engine/types/analysis\";\n\ninterface VerticalRail {\n left: number;\n top: number;\n height: number;\n}\n\ninterface Elbow {\n id: string;\n left: number;\n top: number;\n width: number;\n}\n\nexport interface RailGeometry {\n vertical: VerticalRail;\n elbows: Elbow[];\n}\n\ninterface UseHeadingRailsParams {\n node: HeadingNode;\n isOpen: boolean;\n collapsed: ReadonlySet<string>;\n onBadgeMount?: (el: HTMLSpanElement | null) => void;\n}\n\ninterface UseHeadingRailsResult {\n containerRef: RefObject<HTMLDivElement | null>;\n setBadgeRef: (el: HTMLSpanElement | null) => void;\n registerChildBadge: (childId: string) => (el: HTMLSpanElement | null) => void;\n rails: RailGeometry | null;\n}\n\nexport function useHeadingRails({
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/components/SeoDrawer/components/HeadingsSection/HeadingTree/useHeadingRails.ts"],"sourcesContent":["\"use client\";\n\nimport type { RefObject } from \"react\";\nimport { useLayoutEffect, useRef, useState } from \"react\";\nimport type { HeadingNode } from \"../../../../../engine/types/analysis\";\n\ninterface VerticalRail {\n left: number;\n top: number;\n height: number;\n}\n\ninterface Elbow {\n id: string;\n left: number;\n top: number;\n width: number;\n}\n\nexport interface RailGeometry {\n vertical: VerticalRail;\n elbows: Elbow[];\n}\n\ninterface UseHeadingRailsParams {\n node: HeadingNode;\n isOpen: boolean;\n collapsed: ReadonlySet<string>;\n onBadgeMount?: (el: HTMLSpanElement | null) => void;\n}\n\ninterface UseHeadingRailsResult {\n containerRef: RefObject<HTMLDivElement | null>;\n setBadgeRef: (el: HTMLSpanElement | null) => void;\n registerChildBadge: (childId: string) => (el: HTMLSpanElement | null) => void;\n rails: RailGeometry | null;\n}\n\nexport function useHeadingRails({\n node,\n isOpen,\n collapsed,\n onBadgeMount,\n}: UseHeadingRailsParams): UseHeadingRailsResult {\n const containerRef = useRef<HTMLDivElement>(null);\n const badgeRef = useRef<HTMLSpanElement | null>(null);\n const childBadges = useRef(new Map<string, HTMLSpanElement>());\n const childSetters = useRef(new Map<string, (el: HTMLSpanElement | null) => void>());\n const [rails, setRails] = useState<RailGeometry | null>(null);\n\n const setBadgeRef = (el: HTMLSpanElement | null) => {\n badgeRef.current = el;\n onBadgeMount?.(el);\n };\n\n const registerChildBadge = (childId: string) => {\n let setter = childSetters.current.get(childId);\n\n if (!setter) {\n setter = (el: HTMLSpanElement | null) => {\n if (el) childBadges.current.set(childId, el);\n else childBadges.current.delete(childId);\n };\n\n childSetters.current.set(childId, setter);\n }\n\n return setter;\n };\n\n useLayoutEffect(() => {\n if (!isOpen) {\n setRails(null);\n return;\n }\n\n const container = containerRef.current;\n const parentBadge = badgeRef.current;\n if (!container || !parentBadge) return;\n\n const measure = () => {\n const containerRect = container.getBoundingClientRect();\n const parentBadgeRect = parentBadge.getBoundingClientRect();\n\n const railCenterX = parentBadgeRect.left + parentBadgeRect.width / 2 - containerRect.left;\n const railStartY = parentBadgeRect.bottom - containerRect.top;\n\n const elbows: Elbow[] = [];\n for (const child of node.children) {\n const childBadge = childBadges.current.get(child.id);\n if (!childBadge) continue;\n\n const childBadgeRect = childBadge.getBoundingClientRect();\n\n const childCenterX = childBadgeRect.left + childBadgeRect.width / 2 - containerRect.left;\n const childCenterY = childBadgeRect.top + childBadgeRect.height / 2 - containerRect.top;\n\n elbows.push({\n id: child.id,\n left: railCenterX,\n top: childCenterY,\n width: Math.max(0, childCenterX - railCenterX),\n });\n }\n\n if (elbows.length === 0) {\n setRails(null);\n return;\n }\n\n const lastChildCenterY = elbows.at(-1)?.top ?? railStartY;\n setRails({\n vertical: {\n left: railCenterX,\n top: railStartY,\n height: Math.max(0, lastChildCenterY - railStartY),\n },\n elbows,\n });\n };\n\n measure();\n\n const observer = new ResizeObserver(measure);\n\n observer.observe(container);\n\n return () => observer.disconnect();\n }, [isOpen, collapsed, node]);\n\n return {\n containerRef,\n setBadgeRef,\n registerChildBadge,\n rails,\n };\n}\n"],"mappings":";AAGA,SAAS,iBAAiB,QAAQ,gBAAgB;AAmC3C,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAiD;AAC/C,QAAM,eAAe,OAAuB,IAAI;AAChD,QAAM,WAAW,OAA+B,IAAI;AACpD,QAAM,cAAc,OAAO,oBAAI,IAA6B,CAAC;AAC7D,QAAM,eAAe,OAAO,oBAAI,IAAkD,CAAC;AACnF,QAAM,CAAC,OAAO,QAAQ,IAAI,SAA8B,IAAI;AAE5D,QAAM,cAAc,CAAC,OAA+B;AAClD,aAAS,UAAU;AACnB,mBAAe,EAAE;AAAA,EACnB;AAEA,QAAM,qBAAqB,CAAC,YAAoB;AAC9C,QAAI,SAAS,aAAa,QAAQ,IAAI,OAAO;AAE7C,QAAI,CAAC,QAAQ;AACX,eAAS,CAAC,OAA+B;AACvC,YAAI;AAAI,sBAAY,QAAQ,IAAI,SAAS,EAAE;AAAA;AACtC,sBAAY,QAAQ,OAAO,OAAO;AAAA,MACzC;AAEA,mBAAa,QAAQ,IAAI,SAAS,MAAM;AAAA,IAC1C;AAEA,WAAO;AAAA,EACT;AAEA,kBAAgB,MAAM;AACpB,QAAI,CAAC,QAAQ;AACX,eAAS,IAAI;AACb;AAAA,IACF;AAEA,UAAM,YAAY,aAAa;AAC/B,UAAM,cAAc,SAAS;AAC7B,QAAI,CAAC,aAAa,CAAC;AAAa;AAEhC,UAAM,UAAU,MAAM;AACpB,YAAM,gBAAgB,UAAU,sBAAsB;AACtD,YAAM,kBAAkB,YAAY,sBAAsB;AAE1D,YAAM,cAAc,gBAAgB,OAAO,gBAAgB,QAAQ,IAAI,cAAc;AACrF,YAAM,aAAa,gBAAgB,SAAS,cAAc;AAE1D,YAAM,SAAkB,CAAC;AACzB,iBAAW,SAAS,KAAK,UAAU;AACjC,cAAM,aAAa,YAAY,QAAQ,IAAI,MAAM,EAAE;AACnD,YAAI,CAAC;AAAY;AAEjB,cAAM,iBAAiB,WAAW,sBAAsB;AAExD,cAAM,eAAe,eAAe,OAAO,eAAe,QAAQ,IAAI,cAAc;AACpF,cAAM,eAAe,eAAe,MAAM,eAAe,SAAS,IAAI,cAAc;AAEpF,eAAO,KAAK;AAAA,UACV,IAAI,MAAM;AAAA,UACV,MAAM;AAAA,UACN,KAAK;AAAA,UACL,OAAO,KAAK,IAAI,GAAG,eAAe,WAAW;AAAA,QAC/C,CAAC;AAAA,MACH;AAEA,UAAI,OAAO,WAAW,GAAG;AACvB,iBAAS,IAAI;AACb;AAAA,MACF;AAEA,YAAM,mBAAmB,OAAO,GAAG,EAAE,GAAG,OAAO;AAC/C,eAAS;AAAA,QACP,UAAU;AAAA,UACR,MAAM;AAAA,UACN,KAAK;AAAA,UACL,QAAQ,KAAK,IAAI,GAAG,mBAAmB,UAAU;AAAA,QACnD;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAEA,YAAQ;AAER,UAAM,WAAW,IAAI,eAAe,OAAO;AAE3C,aAAS,QAAQ,SAAS;AAE1B,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,QAAQ,WAAW,IAAI,CAAC;AAE5B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/SeoDrawer/components/HeadingsSection/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAM1E,UAAU,oBAAoB;IAC5B,IAAI,EAAE,gBAAgB,CAAC;CACxB;AAED,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE,oBAAoB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/SeoDrawer/components/HeadingsSection/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAM1E,UAAU,oBAAoB;IAC5B,IAAI,EAAE,gBAAgB,CAAC;CACxB;AAED,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE,oBAAoB,2CAU7D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/components/SeoDrawer/components/HeadingsSection/index.tsx"],"sourcesContent":["\"use client\";\n\nimport type { HeadingStructure } from \"../../../../engine/types/analysis\";\nimport { SectionCard } from \"../../../../ui/SectionCard\";\nimport { Pill } from \"../../../../ui/Pill\";\nimport { HeadingLevelTiles } from \"./HeadingLevelTiles\";\nimport { HeadingTree } from \"./HeadingTree\";\n\ninterface HeadingsSectionProps {\n data: HeadingStructure;\n}\n\nexport function HeadingsSection({ data }: HeadingsSectionProps) {\n return (\n <SectionCard title=\"Headings\" widget={<Pill variant=\"neutral\">{data.total}</Pill>}>\n <div className=\"text-[9.5px] font-semibold uppercase tracking-[0.05em] text-neutral-500 px-[15px] pt-[11px]\"
|
|
1
|
+
{"version":3,"sources":["../../../../../src/components/SeoDrawer/components/HeadingsSection/index.tsx"],"sourcesContent":["\"use client\";\n\nimport type { HeadingStructure } from \"../../../../engine/types/analysis\";\nimport { SectionCard } from \"../../../../ui/SectionCard\";\nimport { Pill } from \"../../../../ui/Pill\";\nimport { HeadingLevelTiles } from \"./HeadingLevelTiles\";\nimport { HeadingTree } from \"./HeadingTree\";\n\ninterface HeadingsSectionProps {\n data: HeadingStructure;\n}\n\nexport function HeadingsSection({ data }: HeadingsSectionProps) {\n return (\n <SectionCard title=\"Headings\" widget={<Pill variant=\"neutral\">{data.total}</Pill>}>\n <div className=\"text-[9.5px] font-semibold uppercase tracking-[0.05em] text-neutral-500 px-[15px] pt-[11px]\">\n Levels\n </div>\n <HeadingLevelTiles levels={data.levels} />\n <HeadingTree tree={data.tree} />\n </SectionCard>\n );\n}\n"],"mappings":";AAcI,SAAsC,KAAtC;AAXJ,SAAS,mBAAmB;AAC5B,SAAS,YAAY;AACrB,SAAS,yBAAyB;AAClC,SAAS,mBAAmB;AAMrB,SAAS,gBAAgB,EAAE,KAAK,GAAyB;AAC9D,SACE,qBAAC,eAAY,OAAM,YAAW,QAAQ,oBAAC,QAAK,SAAQ,WAAW,eAAK,OAAM,GACxE;AAAA,wBAAC,SAAI,WAAU,+FAA8F,oBAE7G;AAAA,IACA,oBAAC,qBAAkB,QAAQ,KAAK,QAAQ;AAAA,IACxC,oBAAC,eAAY,MAAM,KAAK,MAAM;AAAA,KAChC;AAEJ;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"highlight-keyphrase.d.ts","sourceRoot":"","sources":["../../../../../src/components/SeoDrawer/components/SerpPreview/highlight-keyphrase.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMvC,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"highlight-keyphrase.d.ts","sourceRoot":"","sources":["../../../../../src/components/SeoDrawer/components/SerpPreview/highlight-keyphrase.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMvC,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,CAQ/E"}
|
|
@@ -6,7 +6,9 @@ function highlightKeyphrase(text, keyphrase) {
|
|
|
6
6
|
if (!keyphrase.trim())
|
|
7
7
|
return [text];
|
|
8
8
|
const segments = text.split(new RegExp(`(${escapeRegex(keyphrase)})`, "gi"));
|
|
9
|
-
return segments.map(
|
|
9
|
+
return segments.map(
|
|
10
|
+
(segment, index) => index % 2 === 1 ? /* @__PURE__ */ jsx("strong", { children: segment }, index) : segment
|
|
11
|
+
);
|
|
10
12
|
}
|
|
11
13
|
export {
|
|
12
14
|
highlightKeyphrase
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/components/SeoDrawer/components/SerpPreview/highlight-keyphrase.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\n\nfunction escapeRegex(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nexport function highlightKeyphrase(text: string, keyphrase: string): ReactNode[] {\n if (!keyphrase.trim()) return [text];\n\n const segments = text.split(new RegExp(`(${escapeRegex(keyphrase)})`, \"gi\"));\n\n return segments.map((segment, index)
|
|
1
|
+
{"version":3,"sources":["../../../../../src/components/SeoDrawer/components/SerpPreview/highlight-keyphrase.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\n\nfunction escapeRegex(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nexport function highlightKeyphrase(text: string, keyphrase: string): ReactNode[] {\n if (!keyphrase.trim()) return [text];\n\n const segments = text.split(new RegExp(`(${escapeRegex(keyphrase)})`, \"gi\"));\n\n return segments.map((segment, index) =>\n index % 2 === 1 ? <strong key={index}>{segment}</strong> : segment\n );\n}\n"],"mappings":"AAYsB;AAVtB,SAAS,YAAY,OAAuB;AAC1C,SAAO,MAAM,QAAQ,uBAAuB,MAAM;AACpD;AAEO,SAAS,mBAAmB,MAAc,WAAgC;AAC/E,MAAI,CAAC,UAAU,KAAK;AAAG,WAAO,CAAC,IAAI;AAEnC,QAAM,WAAW,KAAK,MAAM,IAAI,OAAO,IAAI,YAAY,SAAS,CAAC,KAAK,IAAI,CAAC;AAE3E,SAAO,SAAS;AAAA,IAAI,CAAC,SAAS,UAC5B,QAAQ,MAAM,IAAI,oBAAC,YAAoB,qBAAR,KAAgB,IAAY;AAAA,EAC7D;AACF;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/SeoDrawer/components/SerpPreview/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/SeoDrawer/components/SerpPreview/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAapE,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE5C,UAAU,gBAAgB;IACxB,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,gBAAgB,GAAG,YAAY,CAqBjG"}
|
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { highlightKeyphrase } from "./highlight-keyphrase";
|
|
3
3
|
import { SerpFavicon } from "./serp-favicon";
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
serpContainer,
|
|
6
|
+
serpDescription,
|
|
7
|
+
serpHostname,
|
|
8
|
+
serpSiteName,
|
|
9
|
+
serpTitle,
|
|
10
|
+
serpUrlRow
|
|
11
|
+
} from "./variants";
|
|
5
12
|
import { truncateDescription } from "./truncate-description";
|
|
6
13
|
function SerpPreview({ data, keyphrase, faviconUrl, mode }) {
|
|
7
14
|
const result = /* @__PURE__ */ jsxs("div", { className: serpContainer({ mode }), children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/components/SeoDrawer/components/SerpPreview/index.tsx"],"sourcesContent":["import type { ReactElement } from \"react\";\nimport type { SerpResult } from \"../../../../engine/types/analysis\";\nimport { highlightKeyphrase } from \"./highlight-keyphrase\";\nimport { SerpFavicon } from \"./serp-favicon\";\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../../../src/components/SeoDrawer/components/SerpPreview/index.tsx"],"sourcesContent":["import type { ReactElement } from \"react\";\nimport type { SerpResult } from \"../../../../engine/types/analysis\";\nimport { highlightKeyphrase } from \"./highlight-keyphrase\";\nimport { SerpFavicon } from \"./serp-favicon\";\nimport {\n serpContainer,\n serpDescription,\n serpHostname,\n serpSiteName,\n serpTitle,\n serpUrlRow,\n} from \"./variants\";\nimport { truncateDescription } from \"./truncate-description\";\n\nexport type SerpMode = \"mobile\" | \"desktop\";\n\ninterface SerpPreviewProps {\n data: SerpResult;\n keyphrase: string;\n faviconUrl: string;\n mode: SerpMode;\n}\n\nexport function SerpPreview({ data, keyphrase, faviconUrl, mode }: SerpPreviewProps): ReactElement {\n const result = (\n <div className={serpContainer({ mode })}>\n <div className={serpUrlRow({ mode })}>\n <SerpFavicon faviconUrl={faviconUrl} siteName={data.siteName} />\n\n <div className=\"overflow-hidden\">\n <div className={serpSiteName({ mode })}>{data.siteName}</div>\n <div className={serpHostname({ mode })}>{data.url}</div>\n </div>\n </div>\n\n <div className={serpTitle({ mode })}>{data.title}</div>\n\n <div className={serpDescription({ mode })}>\n {highlightKeyphrase(truncateDescription(data.description), keyphrase)}\n </div>\n </div>\n );\n\n return mode === \"desktop\" ? <div className=\"overflow-x-auto\">{result}</div> : result;\n}\n"],"mappings":"AA2BQ,cAEA,YAFA;AAzBR,SAAS,0BAA0B;AACnC,SAAS,mBAAmB;AAC5B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,2BAA2B;AAW7B,SAAS,YAAY,EAAE,MAAM,WAAW,YAAY,KAAK,GAAmC;AACjG,QAAM,SACJ,qBAAC,SAAI,WAAW,cAAc,EAAE,KAAK,CAAC,GACpC;AAAA,yBAAC,SAAI,WAAW,WAAW,EAAE,KAAK,CAAC,GACjC;AAAA,0BAAC,eAAY,YAAwB,UAAU,KAAK,UAAU;AAAA,MAE9D,qBAAC,SAAI,WAAU,mBACb;AAAA,4BAAC,SAAI,WAAW,aAAa,EAAE,KAAK,CAAC,GAAI,eAAK,UAAS;AAAA,QACvD,oBAAC,SAAI,WAAW,aAAa,EAAE,KAAK,CAAC,GAAI,eAAK,KAAI;AAAA,SACpD;AAAA,OACF;AAAA,IAEA,oBAAC,SAAI,WAAW,UAAU,EAAE,KAAK,CAAC,GAAI,eAAK,OAAM;AAAA,IAEjD,oBAAC,SAAI,WAAW,gBAAgB,EAAE,KAAK,CAAC,GACrC,6BAAmB,oBAAoB,KAAK,WAAW,GAAG,SAAS,GACtE;AAAA,KACF;AAGF,SAAO,SAAS,YAAY,oBAAC,SAAI,WAAU,mBAAmB,kBAAO,IAAS;AAChF;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serp-favicon.d.ts","sourceRoot":"","sources":["../../../../../src/components/SeoDrawer/components/SerpPreview/serp-favicon.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,UAAU,gBAAgB;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,WAAW,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,gBAAgB,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"serp-favicon.d.ts","sourceRoot":"","sources":["../../../../../src/components/SeoDrawer/components/SerpPreview/serp-favicon.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,UAAU,gBAAgB;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,WAAW,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,gBAAgB,GAAG,YAAY,CAUpF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/components/SeoDrawer/components/SerpPreview/serp-favicon.tsx"],"sourcesContent":["import type { ReactElement } from \"react\";\n\ninterface SerpFaviconProps {\n faviconUrl: string;\n siteName: string;\n}\n\nexport function SerpFavicon({ faviconUrl, siteName }: SerpFaviconProps): ReactElement {\n return (\n <div className=\"grid h-[28px] w-[28px] min-w-[28px] flex-none place-items-center rounded-[50px] bg-serp-favicon-bg\">\n {faviconUrl ? <img alt=\"\" className=\"mx-[5px] h-[18px] w-[18px]\" src={faviconUrl}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/components/SeoDrawer/components/SerpPreview/serp-favicon.tsx"],"sourcesContent":["import type { ReactElement } from \"react\";\n\ninterface SerpFaviconProps {\n faviconUrl: string;\n siteName: string;\n}\n\nexport function SerpFavicon({ faviconUrl, siteName }: SerpFaviconProps): ReactElement {\n return (\n <div className=\"grid h-[28px] w-[28px] min-w-[28px] flex-none place-items-center rounded-[50px] bg-serp-favicon-bg\">\n {faviconUrl ? (\n <img alt=\"\" className=\"mx-[5px] h-[18px] w-[18px]\" src={faviconUrl} />\n ) : (\n <span className=\"text-[12px] text-neutral-600\">{siteName.charAt(0).toUpperCase()}</span>\n )}\n </div>\n );\n}\n"],"mappings":"AAWQ;AAJD,SAAS,YAAY,EAAE,YAAY,SAAS,GAAmC;AACpF,SACE,oBAAC,SAAI,WAAU,sGACZ,uBACC,oBAAC,SAAI,KAAI,IAAG,WAAU,8BAA6B,KAAK,YAAY,IAEpE,oBAAC,UAAK,WAAU,gCAAgC,mBAAS,OAAO,CAAC,EAAE,YAAY,GAAE,GAErF;AAEJ;","names":[]}
|