sanity-plugin-seofields 1.7.0 → 1.9.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 +440 -29
- package/dist/SchemaOrgJsonLdPreview-DJLkIPq4.d.cts +78 -0
- package/dist/SchemaOrgJsonLdPreview-DJLkIPq4.d.ts +78 -0
- package/dist/SeoHealthTool-2COI27KI.cjs +8 -0
- package/dist/SeoHealthTool-2COI27KI.cjs.map +1 -0
- package/dist/SeoHealthTool-CWI3KB2V.js +8 -0
- package/dist/SeoHealthTool-CWI3KB2V.js.map +1 -0
- package/dist/{SeoPreview-WYH7NYNM.cjs → SeoPreview-LMZAWWOE.cjs} +35 -38
- package/dist/SeoPreview-LMZAWWOE.cjs.map +1 -0
- package/dist/{SeoPreview-KEGGQSPJ.js → SeoPreview-UNQBKTQO.js} +14 -11
- package/dist/SeoPreview-UNQBKTQO.js.map +1 -0
- package/dist/chunk-3OK3S2F7.cjs +673 -0
- package/dist/chunk-3OK3S2F7.cjs.map +1 -0
- package/dist/{chunk-GWPOJSGW.cjs → chunk-5XTQRILL.cjs} +1022 -307
- package/dist/chunk-5XTQRILL.cjs.map +1 -0
- package/dist/{chunk-2NMEKWO5.js → chunk-7N4MLTMR.js} +8 -15
- package/dist/chunk-7N4MLTMR.js.map +1 -0
- package/dist/{chunk-S367Y35J.cjs → chunk-A57XNQC7.cjs} +9 -20
- package/dist/chunk-A57XNQC7.cjs.map +1 -0
- package/dist/chunk-BWLJDK5J.js +624 -0
- package/dist/chunk-BWLJDK5J.js.map +1 -0
- package/dist/chunk-FUUWBQE2.cjs +195 -0
- package/dist/chunk-FUUWBQE2.cjs.map +1 -0
- package/dist/{chunk-ZBHLMQTS.cjs → chunk-HHO2AKAP.js} +44 -17
- package/dist/chunk-HHO2AKAP.js.map +1 -0
- package/dist/chunk-KIEO6QG3.js +195 -0
- package/dist/chunk-KIEO6QG3.js.map +1 -0
- package/dist/chunk-R2U7JF7U.cjs +624 -0
- package/dist/chunk-R2U7JF7U.cjs.map +1 -0
- package/dist/{chunk-HRKRV2X7.js → chunk-XZKQWV2H.js} +974 -148
- package/dist/chunk-XZKQWV2H.js.map +1 -0
- package/dist/{chunk-HDZZQCH7.js → chunk-Y46ACXM4.cjs} +45 -5
- package/dist/chunk-Y46ACXM4.cjs.map +1 -0
- package/dist/chunk-Z5AOUU4H.js +673 -0
- package/dist/chunk-Z5AOUU4H.js.map +1 -0
- package/dist/cli.js +27 -27
- package/dist/{component-DQ4KuQQD.d.ts → component-CjT1hvxh.d.ts} +3 -27
- package/dist/{component-D1sBm6ts.d.cts → component-WYh0z8as.d.cts} +3 -27
- package/dist/define-cli.cjs +2 -4
- package/dist/define-cli.cjs.map +1 -1
- package/dist/define-cli.js +4 -4
- package/dist/define-cli.js.map +1 -1
- package/dist/head.cjs +14 -0
- package/dist/head.cjs.map +1 -0
- package/dist/head.d.cts +254 -0
- package/dist/head.d.ts +254 -0
- package/dist/head.js +14 -0
- package/dist/head.js.map +1 -0
- package/dist/index.cjs +1797 -230
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +11 -598
- package/dist/index.d.ts +11 -598
- package/dist/index.js +1777 -197
- package/dist/index.js.map +1 -1
- package/dist/next.cjs +210 -447
- package/dist/next.cjs.map +1 -1
- package/dist/next.d.cts +8 -200
- package/dist/next.d.ts +8 -200
- package/dist/next.js +200 -124
- package/dist/next.js.map +1 -1
- package/dist/plugin-DQdThyxG.d.ts +449 -0
- package/dist/plugin-DoGeZP79.d.cts +449 -0
- package/dist/schema/next.cjs +173 -319
- package/dist/schema/next.cjs.map +1 -1
- package/dist/schema/next.d.cts +4 -4
- package/dist/schema/next.d.ts +4 -4
- package/dist/schema/next.js +172 -8
- package/dist/schema/next.js.map +1 -1
- package/dist/schema.cjs +390 -489
- package/dist/schema.cjs.map +1 -1
- package/dist/schema.d.cts +26 -16
- package/dist/schema.d.ts +26 -16
- package/dist/schema.js +236 -13
- package/dist/schema.js.map +1 -1
- package/dist/server.cjs +149 -0
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.cts +102 -0
- package/dist/server.d.ts +102 -0
- package/dist/server.js +149 -0
- package/dist/server.js.map +1 -0
- package/dist/{types-CeBULNFF.d.ts → types-BAdN1RMu.d.ts} +2 -2
- package/dist/{types-_wBLg6RV.d.cts → types-C5i3KMgs.d.cts} +2 -2
- package/dist/{types-9_wbCIi9.d.ts → types-DP-DiW6f.d.cts} +29 -2
- package/dist/{types-Bb49oRBV.d.cts → types-DRLUGLtX.d.ts} +29 -2
- package/dist/{types-B91ena4g.d.cts → types-DxlPXihz.d.cts} +8 -1
- package/dist/{types-B91ena4g.d.ts → types-DxlPXihz.d.ts} +8 -1
- package/package.json +25 -3
- package/dist/SeoHealthDashboard-IP5BJ322.cjs +0 -10
- package/dist/SeoHealthDashboard-IP5BJ322.cjs.map +0 -1
- package/dist/SeoHealthDashboard-PTUEVYZL.js +0 -4
- package/dist/SeoHealthDashboard-PTUEVYZL.js.map +0 -1
- package/dist/SeoHealthTool-CZZRMWQK.cjs +0 -14
- package/dist/SeoHealthTool-CZZRMWQK.cjs.map +0 -1
- package/dist/SeoHealthTool-IULT4G25.js +0 -12
- package/dist/SeoHealthTool-IULT4G25.js.map +0 -1
- package/dist/SeoPreview-KEGGQSPJ.js.map +0 -1
- package/dist/SeoPreview-WYH7NYNM.cjs.map +0 -1
- package/dist/chunk-2NMEKWO5.js.map +0 -1
- package/dist/chunk-5YRH47VQ.cjs +0 -2167
- package/dist/chunk-5YRH47VQ.cjs.map +0 -1
- package/dist/chunk-ARELX3GK.cjs +0 -689
- package/dist/chunk-ARELX3GK.cjs.map +0 -1
- package/dist/chunk-AW7OKBQQ.js +0 -2161
- package/dist/chunk-AW7OKBQQ.js.map +0 -1
- package/dist/chunk-FONJYVF2.js +0 -610
- package/dist/chunk-FONJYVF2.js.map +0 -1
- package/dist/chunk-GWPOJSGW.cjs.map +0 -1
- package/dist/chunk-HDZZQCH7.js.map +0 -1
- package/dist/chunk-HRKRV2X7.js.map +0 -1
- package/dist/chunk-S367Y35J.cjs.map +0 -1
- package/dist/chunk-ZBHLMQTS.cjs.map +0 -1
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { JSX } from 'react';
|
|
2
|
+
import { InputProps } from 'sanity';
|
|
3
|
+
|
|
4
|
+
type DocumentRecord = {
|
|
5
|
+
_id?: string;
|
|
6
|
+
_type?: string;
|
|
7
|
+
title?: string;
|
|
8
|
+
} & Record<string, unknown>;
|
|
9
|
+
type DocumentViewDocument = DocumentRecord | {
|
|
10
|
+
displayed?: DocumentRecord | null;
|
|
11
|
+
draft?: DocumentRecord | null;
|
|
12
|
+
published?: DocumentRecord | null;
|
|
13
|
+
} | null;
|
|
14
|
+
interface SchemaOrgJsonLdPreviewOptions {
|
|
15
|
+
/**
|
|
16
|
+
* The base site URL used with the document slug to show a resolved page URL.
|
|
17
|
+
* Defaults to `https://www.example.com`.
|
|
18
|
+
*/
|
|
19
|
+
baseUrl?: string;
|
|
20
|
+
/**
|
|
21
|
+
* Document field used for the slug. Supports dot paths such as `seo.slug`.
|
|
22
|
+
* Defaults to `slug`.
|
|
23
|
+
*/
|
|
24
|
+
slugField?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Combined Schema.org field on the document. Defaults to `schemaOrg`.
|
|
27
|
+
*/
|
|
28
|
+
schemaOrgField?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Optional path segment placed before the document slug, e.g. `blog`.
|
|
31
|
+
* Can be a function of the current document.
|
|
32
|
+
*/
|
|
33
|
+
pathPrefix?: string | ((document: DocumentRecord) => string);
|
|
34
|
+
/**
|
|
35
|
+
* Full override for building the resolved document URL.
|
|
36
|
+
*/
|
|
37
|
+
urlBuilder?: (document: DocumentRecord) => string;
|
|
38
|
+
/**
|
|
39
|
+
* API version for the slug-list query.
|
|
40
|
+
*/
|
|
41
|
+
apiVersion?: string;
|
|
42
|
+
/**
|
|
43
|
+
* Custom GROQ query for the slug list. Should return `_id`, optional `title`,
|
|
44
|
+
* and `slug` as a string.
|
|
45
|
+
*/
|
|
46
|
+
slugQuery?: string;
|
|
47
|
+
/**
|
|
48
|
+
* Show existing slugs for the same document type.
|
|
49
|
+
* Defaults to `true` for document previews and `false` for field input previews.
|
|
50
|
+
*/
|
|
51
|
+
showSlugList?: boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Max number of existing slugs to fetch. Defaults to `25`.
|
|
54
|
+
*/
|
|
55
|
+
maxSlugItems?: number;
|
|
56
|
+
/**
|
|
57
|
+
* Title field used in the slug list. Defaults to `title`.
|
|
58
|
+
*/
|
|
59
|
+
titleField?: string;
|
|
60
|
+
}
|
|
61
|
+
interface SchemaOrgJsonLdPreviewProps extends SchemaOrgJsonLdPreviewOptions {
|
|
62
|
+
/** Schema.org value to preview. Uses `document[schemaOrgField]` when omitted. */
|
|
63
|
+
value?: Record<string, unknown> | Array<Record<string, unknown>> | null;
|
|
64
|
+
/** Current Sanity document or document-view `document` prop. */
|
|
65
|
+
document?: DocumentViewDocument;
|
|
66
|
+
/** Optional document id from a Sanity document-node component view. */
|
|
67
|
+
documentId?: string;
|
|
68
|
+
/** Optional schema type from a Sanity document-node component view. */
|
|
69
|
+
schemaType?: string;
|
|
70
|
+
/** Fallback Schema.org type name for individual object inputs. */
|
|
71
|
+
schemaTypeName?: string;
|
|
72
|
+
/** Internal flag used by field input previews. */
|
|
73
|
+
fieldPreview?: boolean;
|
|
74
|
+
}
|
|
75
|
+
declare function SchemaOrgJsonLdPreview({ value, document, documentId, schemaType, schemaTypeName, fieldPreview, baseUrl, slugField, schemaOrgField, pathPrefix, urlBuilder, apiVersion, slugQuery, showSlugList, maxSlugItems, titleField, }: SchemaOrgJsonLdPreviewProps): JSX.Element;
|
|
76
|
+
declare function SchemaOrgJsonLdPreviewInput(props: InputProps): JSX.Element;
|
|
77
|
+
|
|
78
|
+
export { SchemaOrgJsonLdPreview as S, type SchemaOrgJsonLdPreviewOptions as a, type SchemaOrgJsonLdPreviewProps as b, SchemaOrgJsonLdPreviewInput as c };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});require('./chunk-A57XNQC7.cjs');
|
|
2
|
+
|
|
3
|
+
// src/components/SeoHealthTool.tsx
|
|
4
|
+
var _seofieldspro = require('seofields-pro');
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
exports.default = _seofieldspro.SeoHealthTool;
|
|
8
|
+
//# sourceMappingURL=SeoHealthTool-2COI27KI.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/hardik/GITHUB/sanity-plugin-seofields/npm/dist/SeoHealthTool-2COI27KI.cjs","../src/components/SeoHealthTool.tsx"],"names":[],"mappings":"AAAA,yGAA6B;AAC7B;AACA;ACFA,6CAAuC;ADIvC;AACE;AACF,8CAAC","file":"/Users/hardik/GITHUB/sanity-plugin-seofields/npm/dist/SeoHealthTool-2COI27KI.cjs","sourcesContent":[null,"export {SeoHealthTool as default} from 'seofields-pro'\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/SeoHealthTool.tsx"],"sourcesContent":["export {SeoHealthTool as default} from 'seofields-pro'\n"],"mappings":";;;AAAA,SAAyB,qBAAc;","names":[]}
|
|
@@ -1,18 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('./chunk-
|
|
5
|
-
var ui = require('@sanity/ui');
|
|
6
|
-
var react = require('react');
|
|
7
|
-
var sanity = require('sanity');
|
|
8
|
-
var styled = require('styled-components');
|
|
9
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
3
|
+
var _chunkY46ACXM4cjs = require('./chunk-Y46ACXM4.cjs');
|
|
4
|
+
require('./chunk-A57XNQC7.cjs');
|
|
10
5
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
var
|
|
14
|
-
|
|
15
|
-
var
|
|
6
|
+
// src/components/SeoPreview.tsx
|
|
7
|
+
var _ui = require('@sanity/ui');
|
|
8
|
+
var _react = require('react');
|
|
9
|
+
var _sanity = require('sanity');
|
|
10
|
+
var _styledcomponents = require('styled-components'); var _styledcomponents2 = _interopRequireDefault(_styledcomponents);
|
|
11
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
12
|
+
var PreviewContainer = _styledcomponents2.default.div`
|
|
16
13
|
max-width: 600px;
|
|
17
14
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
18
15
|
background: #ffffff;
|
|
@@ -20,7 +17,7 @@ var PreviewContainer = styled__default.default.div`
|
|
|
20
17
|
border-radius: 8px;
|
|
21
18
|
overflow: hidden;
|
|
22
19
|
`;
|
|
23
|
-
var PreviewHeader =
|
|
20
|
+
var PreviewHeader = _styledcomponents2.default.div`
|
|
24
21
|
background: #f8f9fa;
|
|
25
22
|
padding: 12px 16px;
|
|
26
23
|
border-bottom: 1px solid #dadce0;
|
|
@@ -29,17 +26,17 @@ var PreviewHeader = styled__default.default.div`
|
|
|
29
26
|
justify-content: space-between;
|
|
30
27
|
gap: 8px;
|
|
31
28
|
`;
|
|
32
|
-
var PreviewBody =
|
|
29
|
+
var PreviewBody = _styledcomponents2.default.div`
|
|
33
30
|
padding: 16px;
|
|
34
31
|
`;
|
|
35
|
-
var SerpUrl =
|
|
32
|
+
var SerpUrl = _styledcomponents2.default.p`
|
|
36
33
|
margin: 0 0 4px;
|
|
37
34
|
color: #006621;
|
|
38
35
|
font-size: 13px;
|
|
39
36
|
line-height: 1.4;
|
|
40
37
|
word-break: break-word;
|
|
41
38
|
`;
|
|
42
|
-
var SerpTitle =
|
|
39
|
+
var SerpTitle = _styledcomponents2.default.h3`
|
|
43
40
|
margin: 0 0 8px;
|
|
44
41
|
color: #1a0dab;
|
|
45
42
|
font-size: 18px;
|
|
@@ -51,7 +48,7 @@ var SerpTitle = styled__default.default.h3`
|
|
|
51
48
|
text-decoration: underline;
|
|
52
49
|
}
|
|
53
50
|
`;
|
|
54
|
-
var SerpDescription =
|
|
51
|
+
var SerpDescription = _styledcomponents2.default.p`
|
|
55
52
|
margin: 0;
|
|
56
53
|
color: #545454;
|
|
57
54
|
font-size: 14px;
|
|
@@ -62,7 +59,7 @@ var SerpDescription = styled__default.default.p`
|
|
|
62
59
|
-webkit-box-orient: vertical;
|
|
63
60
|
overflow: hidden;
|
|
64
61
|
`;
|
|
65
|
-
var LiveIndicator =
|
|
62
|
+
var LiveIndicator = _styledcomponents2.default.span`
|
|
66
63
|
display: inline-flex;
|
|
67
64
|
align-items: center;
|
|
68
65
|
gap: 4px;
|
|
@@ -84,9 +81,9 @@ var SeoPreview = (props) => {
|
|
|
84
81
|
const titleSuffixOption = options == null ? void 0 : options.titleSuffix;
|
|
85
82
|
const titleSuffixInheritColor = (_a = options == null ? void 0 : options.titleSuffixInheritColor) != null ? _a : false;
|
|
86
83
|
const titleSuffixQuery = options == null ? void 0 : options.titleSuffixQuery;
|
|
87
|
-
const client =
|
|
88
|
-
const [groqTitleSuffix, setGroqTitleSuffix] =
|
|
89
|
-
|
|
84
|
+
const client = _sanity.useClient.call(void 0, { apiVersion: (_b = options == null ? void 0 : options.apiVersion) != null ? _b : "2024-01-01" });
|
|
85
|
+
const [groqTitleSuffix, setGroqTitleSuffix] = _react.useState.call(void 0, "");
|
|
86
|
+
_react.useEffect.call(void 0, () => {
|
|
90
87
|
if (!titleSuffixQuery) return;
|
|
91
88
|
client.fetch(titleSuffixQuery).then((result) => {
|
|
92
89
|
setGroqTitleSuffix(result === null || result === void 0 ? "" : String(result));
|
|
@@ -94,12 +91,12 @@ var SeoPreview = (props) => {
|
|
|
94
91
|
setGroqTitleSuffix("");
|
|
95
92
|
});
|
|
96
93
|
}, [titleSuffixQuery, client]);
|
|
97
|
-
const parent =
|
|
94
|
+
const parent = _sanity.useFormValue.call(void 0, [path[0]]) || {
|
|
98
95
|
title: "",
|
|
99
96
|
description: "",
|
|
100
97
|
canonicalUrl: ""
|
|
101
98
|
};
|
|
102
|
-
const rootDoc =
|
|
99
|
+
const rootDoc = _sanity.useFormValue.call(void 0, []) || {
|
|
103
100
|
slug: { current: "" }
|
|
104
101
|
};
|
|
105
102
|
const slug = ((_c = rootDoc == null ? void 0 : rootDoc.slug) == null ? void 0 : _c.current) || "";
|
|
@@ -133,9 +130,9 @@ var SeoPreview = (props) => {
|
|
|
133
130
|
}
|
|
134
131
|
})();
|
|
135
132
|
const urlDisplay = `${domain}${urlPath ? ` \u203A ${urlPath.split("/").slice(-1)[0]}` : ""}`;
|
|
136
|
-
return /* @__PURE__ */
|
|
137
|
-
/* @__PURE__ */
|
|
138
|
-
/* @__PURE__ */
|
|
133
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _ui.Box, { padding: 3, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, PreviewContainer, { children: [
|
|
134
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, PreviewHeader, { children: [
|
|
135
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
139
136
|
"span",
|
|
140
137
|
{
|
|
141
138
|
style: {
|
|
@@ -147,8 +144,8 @@ var SeoPreview = (props) => {
|
|
|
147
144
|
children: "Search Preview"
|
|
148
145
|
}
|
|
149
146
|
),
|
|
150
|
-
/* @__PURE__ */
|
|
151
|
-
/* @__PURE__ */
|
|
147
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, LiveIndicator, { children: [
|
|
148
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
152
149
|
"span",
|
|
153
150
|
{
|
|
154
151
|
style: {
|
|
@@ -163,11 +160,11 @@ var SeoPreview = (props) => {
|
|
|
163
160
|
"Live"
|
|
164
161
|
] })
|
|
165
162
|
] }),
|
|
166
|
-
/* @__PURE__ */
|
|
167
|
-
/* @__PURE__ */
|
|
168
|
-
/* @__PURE__ */
|
|
169
|
-
|
|
170
|
-
titleSuffix && /* @__PURE__ */
|
|
163
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, PreviewBody, { children: [
|
|
164
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, SerpUrl, { children: finalUrl ? urlDisplay : "example.com \u203A page-url" }),
|
|
165
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, SerpTitle, { children: title && title.length > 0 ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
|
|
166
|
+
_chunkY46ACXM4cjs.truncate.call(void 0, title, Math.max(1, 60 - (titleSuffix ? titleSuffix.length + 3 : 0))),
|
|
167
|
+
titleSuffix && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
171
168
|
"span",
|
|
172
169
|
{
|
|
173
170
|
style: titleSuffixInheritColor ? void 0 : { color: "#70757a", fontWeight: 400 },
|
|
@@ -179,12 +176,12 @@ var SeoPreview = (props) => {
|
|
|
179
176
|
}
|
|
180
177
|
)
|
|
181
178
|
] }) : "Your SEO Title will appear here" }),
|
|
182
|
-
/* @__PURE__ */
|
|
179
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, SerpDescription, { children: description && description.length > 0 ? _chunkY46ACXM4cjs.truncate.call(void 0, description, 160) : "Your meta description will show up here. Make it compelling!" })
|
|
183
180
|
] })
|
|
184
181
|
] }) });
|
|
185
182
|
};
|
|
186
183
|
var SeoPreview_default = SeoPreview;
|
|
187
184
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
//# sourceMappingURL=SeoPreview-
|
|
185
|
+
|
|
186
|
+
exports.default = SeoPreview_default;
|
|
187
|
+
//# sourceMappingURL=SeoPreview-LMZAWWOE.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/hardik/GITHUB/sanity-plugin-seofields/npm/dist/SeoPreview-LMZAWWOE.cjs","../src/components/SeoPreview.tsx"],"names":[],"mappings":"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","file":"/Users/hardik/GITHUB/sanity-plugin-seofields/npm/dist/SeoPreview-LMZAWWOE.cjs","sourcesContent":[null,"import {Box} from '@sanity/ui'\nimport {type ReactElement, useEffect, useState} from 'react'\nimport {StringInputProps, useClient, useFormValue} from 'sanity'\nimport styled from 'styled-components'\n\nimport {truncate} from '../utils/seoUtils'\n\nconst PreviewContainer = styled.div`\n max-width: 600px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: #ffffff;\n border: 1px solid #dadce0;\n border-radius: 8px;\n overflow: hidden;\n`\n\nconst PreviewHeader = styled.div`\n background: #f8f9fa;\n padding: 12px 16px;\n border-bottom: 1px solid #dadce0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n`\n\nconst PreviewBody = styled.div`\n padding: 16px;\n`\n\nconst SerpUrl = styled.p`\n margin: 0 0 4px;\n color: #006621;\n font-size: 13px;\n line-height: 1.4;\n word-break: break-word;\n`\n\nconst SerpTitle = styled.h3`\n margin: 0 0 8px;\n color: #1a0dab;\n font-size: 18px;\n font-weight: 500;\n line-height: 1.4;\n word-break: break-word;\n\n &:hover {\n text-decoration: underline;\n }\n`\n\nconst SerpDescription = styled.p`\n margin: 0;\n color: #545454;\n font-size: 14px;\n line-height: 1.6;\n word-break: break-word;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n`\n\nconst LiveIndicator = styled.span`\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: #4f46e5;\n background: #f0f4ff;\n padding: 4px 8px;\n border-radius: 4px;\n`\n\nconst SeoPreview = (props: StringInputProps): ReactElement => {\n const {path, schemaType} = props\n const {options} = schemaType as {\n options?: {\n baseUrl?: string\n apiVersion?: string\n prefix?: ((doc: {_type?: string} & Record<string, unknown>) => string) | string\n titleSuffix?: ((doc: {_type?: string} & Record<string, unknown>) => string) | string\n titleSuffixInheritColor?: boolean\n titleSuffixQuery?: string\n }\n }\n const baseUrl = options?.baseUrl || 'https://www.example.com'\n const prefixFunction = options?.prefix as\n | ((doc: {_type?: string} & Record<string, unknown>) => string)\n | undefined\n const titleSuffixOption = options?.titleSuffix\n const titleSuffixInheritColor = options?.titleSuffixInheritColor ?? false\n const titleSuffixQuery = options?.titleSuffixQuery\n\n const client = useClient({apiVersion: options?.apiVersion ?? '2024-01-01'})\n const [groqTitleSuffix, setGroqTitleSuffix] = useState<string>('')\n\n useEffect(() => {\n if (!titleSuffixQuery) return\n client\n .fetch<string>(titleSuffixQuery)\n .then((result) => {\n setGroqTitleSuffix(result === null || result === undefined ? '' : String(result))\n })\n .catch(() => {\n setGroqTitleSuffix('')\n })\n }, [titleSuffixQuery, client])\n const parent = useFormValue([path[0]]) || {\n title: '',\n description: '',\n canonicalUrl: '',\n }\n const rootDoc: {\n slug?: {current: string}\n } = useFormValue([]) || {\n slug: {current: ''},\n }\n const slug: string = rootDoc?.slug?.current || ''\n\n const {\n title,\n description,\n canonicalUrl: url,\n } = parent as {\n title?: string\n description?: string\n canonicalUrl?: string\n }\n\n const getTitleSuffix = (): string => {\n if (titleSuffixQuery) return groqTitleSuffix\n if (!titleSuffixOption) return ''\n if (typeof titleSuffixOption === 'function') {\n return titleSuffixOption(rootDoc as {_type?: string} & Record<string, unknown>)\n }\n return titleSuffixOption\n }\n const titleSuffix: string = getTitleSuffix()\n\n // Build full URL\n const base = (url || baseUrl)?.replace(/\\/+$/, '')\n const slugStr = String(slug || '').replace(/^\\/+/, '')\n const pref = String(\n prefixFunction ? prefixFunction(rootDoc as {slug?: {current: string}}) : '',\n ).replace(/^\\/+|\\/+$/g, '')\n const urlPath = [pref, slugStr].filter(Boolean).join('/')\n const finalUrl = urlPath ? `${base}/${urlPath}` : base\n\n // Extract domain for display\n const domain = (() => {\n try {\n const u = new URL(finalUrl || base)\n return u.hostname\n } catch {\n return 'example.com'\n }\n })()\n\n // Format URL display with › separator\n const urlDisplay = `${domain}${urlPath ? ` › ${urlPath.split('/').slice(-1)[0]}` : ''}`\n\n return (\n <Box padding={3}>\n <PreviewContainer>\n <PreviewHeader>\n <span\n style={{\n fontSize: '11px',\n color: '#5f6368',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n }}\n >\n Search Preview\n </span>\n <LiveIndicator>\n <span\n style={{\n width: '4px',\n height: '4px',\n borderRadius: '50%',\n backgroundColor: '#4f46e5',\n display: 'inline-block',\n }}\n />\n Live\n </LiveIndicator>\n </PreviewHeader>\n\n <PreviewBody>\n <SerpUrl>{finalUrl ? urlDisplay : 'example.com › page-url'}</SerpUrl>\n <SerpTitle>\n {title && title.length > 0 ? (\n <>\n {truncate(title, Math.max(1, 60 - (titleSuffix ? titleSuffix.length + 3 : 0)))}\n {titleSuffix && (\n <span\n style={\n titleSuffixInheritColor ? undefined : {color: '#70757a', fontWeight: 400}\n }\n >\n {' '}\n | {titleSuffix}\n </span>\n )}\n </>\n ) : (\n 'Your SEO Title will appear here'\n )}\n </SerpTitle>\n <SerpDescription>\n {description && description.length > 0\n ? truncate(description, 160)\n : 'Your meta description will show up here. Make it compelling!'}\n </SerpDescription>\n </PreviewBody>\n </PreviewContainer>\n </Box>\n )\n}\n\nexport default SeoPreview\n"]}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import
|
|
5
|
-
import { useClient, useFormValue } from 'sanity';
|
|
6
|
-
import styled from 'styled-components';
|
|
7
|
-
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
1
|
+
import {
|
|
2
|
+
truncate
|
|
3
|
+
} from "./chunk-HHO2AKAP.js";
|
|
4
|
+
import "./chunk-7N4MLTMR.js";
|
|
8
5
|
|
|
6
|
+
// src/components/SeoPreview.tsx
|
|
7
|
+
import { Box } from "@sanity/ui";
|
|
8
|
+
import { useEffect, useState } from "react";
|
|
9
|
+
import { useClient, useFormValue } from "sanity";
|
|
10
|
+
import styled from "styled-components";
|
|
11
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
9
12
|
var PreviewContainer = styled.div`
|
|
10
13
|
max-width: 600px;
|
|
11
14
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
@@ -178,7 +181,7 @@ var SeoPreview = (props) => {
|
|
|
178
181
|
] }) });
|
|
179
182
|
};
|
|
180
183
|
var SeoPreview_default = SeoPreview;
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
//# sourceMappingURL=SeoPreview-
|
|
184
|
+
export {
|
|
185
|
+
SeoPreview_default as default
|
|
186
|
+
};
|
|
187
|
+
//# sourceMappingURL=SeoPreview-UNQBKTQO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/SeoPreview.tsx"],"sourcesContent":["import {Box} from '@sanity/ui'\nimport {type ReactElement, useEffect, useState} from 'react'\nimport {StringInputProps, useClient, useFormValue} from 'sanity'\nimport styled from 'styled-components'\n\nimport {truncate} from '../utils/seoUtils'\n\nconst PreviewContainer = styled.div`\n max-width: 600px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: #ffffff;\n border: 1px solid #dadce0;\n border-radius: 8px;\n overflow: hidden;\n`\n\nconst PreviewHeader = styled.div`\n background: #f8f9fa;\n padding: 12px 16px;\n border-bottom: 1px solid #dadce0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n`\n\nconst PreviewBody = styled.div`\n padding: 16px;\n`\n\nconst SerpUrl = styled.p`\n margin: 0 0 4px;\n color: #006621;\n font-size: 13px;\n line-height: 1.4;\n word-break: break-word;\n`\n\nconst SerpTitle = styled.h3`\n margin: 0 0 8px;\n color: #1a0dab;\n font-size: 18px;\n font-weight: 500;\n line-height: 1.4;\n word-break: break-word;\n\n &:hover {\n text-decoration: underline;\n }\n`\n\nconst SerpDescription = styled.p`\n margin: 0;\n color: #545454;\n font-size: 14px;\n line-height: 1.6;\n word-break: break-word;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n`\n\nconst LiveIndicator = styled.span`\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: #4f46e5;\n background: #f0f4ff;\n padding: 4px 8px;\n border-radius: 4px;\n`\n\nconst SeoPreview = (props: StringInputProps): ReactElement => {\n const {path, schemaType} = props\n const {options} = schemaType as {\n options?: {\n baseUrl?: string\n apiVersion?: string\n prefix?: ((doc: {_type?: string} & Record<string, unknown>) => string) | string\n titleSuffix?: ((doc: {_type?: string} & Record<string, unknown>) => string) | string\n titleSuffixInheritColor?: boolean\n titleSuffixQuery?: string\n }\n }\n const baseUrl = options?.baseUrl || 'https://www.example.com'\n const prefixFunction = options?.prefix as\n | ((doc: {_type?: string} & Record<string, unknown>) => string)\n | undefined\n const titleSuffixOption = options?.titleSuffix\n const titleSuffixInheritColor = options?.titleSuffixInheritColor ?? false\n const titleSuffixQuery = options?.titleSuffixQuery\n\n const client = useClient({apiVersion: options?.apiVersion ?? '2024-01-01'})\n const [groqTitleSuffix, setGroqTitleSuffix] = useState<string>('')\n\n useEffect(() => {\n if (!titleSuffixQuery) return\n client\n .fetch<string>(titleSuffixQuery)\n .then((result) => {\n setGroqTitleSuffix(result === null || result === undefined ? '' : String(result))\n })\n .catch(() => {\n setGroqTitleSuffix('')\n })\n }, [titleSuffixQuery, client])\n const parent = useFormValue([path[0]]) || {\n title: '',\n description: '',\n canonicalUrl: '',\n }\n const rootDoc: {\n slug?: {current: string}\n } = useFormValue([]) || {\n slug: {current: ''},\n }\n const slug: string = rootDoc?.slug?.current || ''\n\n const {\n title,\n description,\n canonicalUrl: url,\n } = parent as {\n title?: string\n description?: string\n canonicalUrl?: string\n }\n\n const getTitleSuffix = (): string => {\n if (titleSuffixQuery) return groqTitleSuffix\n if (!titleSuffixOption) return ''\n if (typeof titleSuffixOption === 'function') {\n return titleSuffixOption(rootDoc as {_type?: string} & Record<string, unknown>)\n }\n return titleSuffixOption\n }\n const titleSuffix: string = getTitleSuffix()\n\n // Build full URL\n const base = (url || baseUrl)?.replace(/\\/+$/, '')\n const slugStr = String(slug || '').replace(/^\\/+/, '')\n const pref = String(\n prefixFunction ? prefixFunction(rootDoc as {slug?: {current: string}}) : '',\n ).replace(/^\\/+|\\/+$/g, '')\n const urlPath = [pref, slugStr].filter(Boolean).join('/')\n const finalUrl = urlPath ? `${base}/${urlPath}` : base\n\n // Extract domain for display\n const domain = (() => {\n try {\n const u = new URL(finalUrl || base)\n return u.hostname\n } catch {\n return 'example.com'\n }\n })()\n\n // Format URL display with › separator\n const urlDisplay = `${domain}${urlPath ? ` › ${urlPath.split('/').slice(-1)[0]}` : ''}`\n\n return (\n <Box padding={3}>\n <PreviewContainer>\n <PreviewHeader>\n <span\n style={{\n fontSize: '11px',\n color: '#5f6368',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n }}\n >\n Search Preview\n </span>\n <LiveIndicator>\n <span\n style={{\n width: '4px',\n height: '4px',\n borderRadius: '50%',\n backgroundColor: '#4f46e5',\n display: 'inline-block',\n }}\n />\n Live\n </LiveIndicator>\n </PreviewHeader>\n\n <PreviewBody>\n <SerpUrl>{finalUrl ? urlDisplay : 'example.com › page-url'}</SerpUrl>\n <SerpTitle>\n {title && title.length > 0 ? (\n <>\n {truncate(title, Math.max(1, 60 - (titleSuffix ? titleSuffix.length + 3 : 0)))}\n {titleSuffix && (\n <span\n style={\n titleSuffixInheritColor ? undefined : {color: '#70757a', fontWeight: 400}\n }\n >\n {' '}\n | {titleSuffix}\n </span>\n )}\n </>\n ) : (\n 'Your SEO Title will appear here'\n )}\n </SerpTitle>\n <SerpDescription>\n {description && description.length > 0\n ? truncate(description, 160)\n : 'Your meta description will show up here. Make it compelling!'}\n </SerpDescription>\n </PreviewBody>\n </PreviewContainer>\n </Box>\n )\n}\n\nexport default SeoPreview\n"],"mappings":";;;;;;AAAA,SAAQ,WAAU;AAClB,SAA2B,WAAW,gBAAe;AACrD,SAA0B,WAAW,oBAAmB;AACxD,OAAO,YAAY;AAsKT,SA4BI,UA5BJ,KAUA,YAVA;AAlKV,IAAM,mBAAmB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAShC,IAAM,gBAAgB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAU7B,IAAM,cAAc,OAAO;AAAA;AAAA;AAI3B,IAAM,UAAU,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQvB,IAAM,YAAY,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAazB,IAAM,kBAAkB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAY/B,IAAM,gBAAgB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAc7B,IAAM,aAAa,CAAC,UAA0C;AA7E9D;AA8EE,QAAM,EAAC,MAAM,WAAU,IAAI;AAC3B,QAAM,EAAC,QAAO,IAAI;AAUlB,QAAM,WAAU,mCAAS,YAAW;AACpC,QAAM,iBAAiB,mCAAS;AAGhC,QAAM,oBAAoB,mCAAS;AACnC,QAAM,2BAA0B,wCAAS,4BAAT,YAAoC;AACpE,QAAM,mBAAmB,mCAAS;AAElC,QAAM,SAAS,UAAU,EAAC,aAAY,wCAAS,eAAT,YAAuB,aAAY,CAAC;AAC1E,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAiB,EAAE;AAEjE,YAAU,MAAM;AACd,QAAI,CAAC,iBAAkB;AACvB,WACG,MAAc,gBAAgB,EAC9B,KAAK,CAAC,WAAW;AAChB,yBAAmB,WAAW,QAAQ,WAAW,SAAY,KAAK,OAAO,MAAM,CAAC;AAAA,IAClF,CAAC,EACA,MAAM,MAAM;AACX,yBAAmB,EAAE;AAAA,IACvB,CAAC;AAAA,EACL,GAAG,CAAC,kBAAkB,MAAM,CAAC;AAC7B,QAAM,SAAS,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;AAAA,IACxC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,cAAc;AAAA,EAChB;AACA,QAAM,UAEF,aAAa,CAAC,CAAC,KAAK;AAAA,IACtB,MAAM,EAAC,SAAS,GAAE;AAAA,EACpB;AACA,QAAM,SAAe,wCAAS,SAAT,mBAAe,YAAW;AAE/C,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,cAAc;AAAA,EAChB,IAAI;AAMJ,QAAM,iBAAiB,MAAc;AACnC,QAAI,iBAAkB,QAAO;AAC7B,QAAI,CAAC,kBAAmB,QAAO;AAC/B,QAAI,OAAO,sBAAsB,YAAY;AAC3C,aAAO,kBAAkB,OAAqD;AAAA,IAChF;AACA,WAAO;AAAA,EACT;AACA,QAAM,cAAsB,eAAe;AAG3C,QAAM,QAAQ,YAAO,YAAP,mBAAiB,QAAQ,QAAQ;AAC/C,QAAM,UAAU,OAAO,QAAQ,EAAE,EAAE,QAAQ,QAAQ,EAAE;AACrD,QAAM,OAAO;AAAA,IACX,iBAAiB,eAAe,OAAqC,IAAI;AAAA,EAC3E,EAAE,QAAQ,cAAc,EAAE;AAC1B,QAAM,UAAU,CAAC,MAAM,OAAO,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AACxD,QAAM,WAAW,UAAU,GAAG,IAAI,IAAI,OAAO,KAAK;AAGlD,QAAM,UAAU,MAAM;AACpB,QAAI;AACF,YAAM,IAAI,IAAI,IAAI,YAAY,IAAI;AAClC,aAAO,EAAE;AAAA,IACX,SAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,GAAG;AAGH,QAAM,aAAa,GAAG,MAAM,GAAG,UAAU,WAAM,QAAQ,MAAM,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE;AAErF,SACE,oBAAC,OAAI,SAAS,GACZ,+BAAC,oBACC;AAAA,yBAAC,iBACC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,UAAU;AAAA,YACV,OAAO;AAAA,YACP,eAAe;AAAA,YACf,eAAe;AAAA,UACjB;AAAA,UACD;AAAA;AAAA,MAED;AAAA,MACA,qBAAC,iBACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,iBAAiB;AAAA,cACjB,SAAS;AAAA,YACX;AAAA;AAAA,QACF;AAAA,QAAE;AAAA,SAEJ;AAAA,OACF;AAAA,IAEA,qBAAC,eACC;AAAA,0BAAC,WAAS,qBAAW,aAAa,+BAAyB;AAAA,MAC3D,oBAAC,aACE,mBAAS,MAAM,SAAS,IACvB,iCACG;AAAA,iBAAS,OAAO,KAAK,IAAI,GAAG,MAAM,cAAc,YAAY,SAAS,IAAI,EAAE,CAAC;AAAA,QAC5E,eACC;AAAA,UAAC;AAAA;AAAA,YACC,OACE,0BAA0B,SAAY,EAAC,OAAO,WAAW,YAAY,IAAG;AAAA,YAGzE;AAAA;AAAA,cAAI;AAAA,cACF;AAAA;AAAA;AAAA,QACL;AAAA,SAEJ,IAEA,mCAEJ;AAAA,MACA,oBAAC,mBACE,yBAAe,YAAY,SAAS,IACjC,SAAS,aAAa,GAAG,IACzB,gEACN;AAAA,OACF;AAAA,KACF,GACF;AAEJ;AAEA,IAAO,qBAAQ;","names":[]}
|