@madebywild/sanity-link-field 0.0.9 → 0.1.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 +0 -2
- package/dist/index.cjs +98 -106
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +42 -43
- package/dist/index.d.ts +42 -43
- package/dist/index.js +100 -107
- package/dist/index.js.map +1 -1
- package/package.json +17 -18
- package/src/index.tsx +56 -112
- package/src/input.tsx +64 -92
- package/src/preview.tsx +61 -0
- package/src/types.tsx +38 -0
- package/src/types.ts +0 -38
package/README.md
CHANGED
package/dist/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: !0 });
|
|
3
|
-
var jsxRuntime = require("react/jsx-runtime"), sanityUtils = require("@madebywild/sanity-utils"), sanity = require("sanity"), ui = require("@sanity/ui"), changeCase = require("change-case"), React = require("react");
|
|
3
|
+
var jsxRuntime = require("react/jsx-runtime"), sanityUtils = require("@madebywild/sanity-utils"), sanity = require("sanity"), asyncAutocomplete = require("@madebywild/sanity-utils/async-autocomplete"), ui = require("@sanity/ui"), changeCase = require("change-case"), React = require("react");
|
|
4
4
|
function _interopNamespaceCompat(e) {
|
|
5
5
|
if (e && typeof e == "object" && "default" in e) return e;
|
|
6
6
|
var n = /* @__PURE__ */ Object.create(null);
|
|
@@ -17,80 +17,63 @@ function _interopNamespaceCompat(e) {
|
|
|
17
17
|
}), n.default = e, Object.freeze(n);
|
|
18
18
|
}
|
|
19
19
|
var changeCase__namespace = /* @__PURE__ */ _interopNamespaceCompat(changeCase), React__namespace = /* @__PURE__ */ _interopNamespaceCompat(React);
|
|
20
|
-
function
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
[members, fieldName]
|
|
24
|
-
);
|
|
20
|
+
function FieldInput(props) {
|
|
21
|
+
const options = props.schemaType.options;
|
|
22
|
+
return /* @__PURE__ */ jsxRuntime.jsx(ui.Stack, { space: 4, children: props.members.map((member) => member.kind !== "field" || options?.noCustomText && member.name === "customText" ? null : /* @__PURE__ */ jsxRuntime.jsx(sanity.MemberField, { member, ...props }, member.key)) });
|
|
25
23
|
}
|
|
24
|
+
const SectionsQuery = `
|
|
25
|
+
*[_id == $pageId && defined(pageBuilder.sectionsArray)][0]{
|
|
26
|
+
"sections": array::compact(pageBuilder.sectionsArray[]{
|
|
27
|
+
"value": _key,
|
|
28
|
+
"label": coalesce(sectionSettings.sectionTitle, _type),
|
|
29
|
+
}),
|
|
30
|
+
}.sections
|
|
31
|
+
`;
|
|
26
32
|
function InternalLinkInput({
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
onChange
|
|
33
|
+
pluginConfig,
|
|
34
|
+
...props
|
|
30
35
|
}) {
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}, [
|
|
36
|
+
const linkFieldMember = sanityUtils.useFieldMember(props.members, "link"), selectedLink = sanity.useFormValue([...props.path, "link"]), selectedSection = sanity.useFormValue([...props.path, "sectionTarget"]);
|
|
37
|
+
React__namespace.useEffect(() => {
|
|
38
|
+
!selectedLink?._ref && selectedSection !== void 0 && props.onChange(sanity.unset(["sectionTarget"]));
|
|
39
|
+
}, [selectedLink, selectedSection, props.onChange]);
|
|
40
|
+
const client = sanity.useClient({ apiVersion: "2025-10-21" }), fetchSections = React__namespace.useCallback(() => selectedLink?._ref ? client.fetch(SectionsQuery, { pageId: selectedLink._ref }).catch(() => []) : [], [client, selectedLink, SectionsQuery]);
|
|
41
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(ui.Stack, { space: 2, children: [
|
|
42
|
+
linkFieldMember && /* @__PURE__ */ jsxRuntime.jsx(sanity.MemberField, { member: linkFieldMember, ...props }),
|
|
35
43
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
36
|
-
|
|
37
|
-
{
|
|
38
|
-
placeholder: "Select page",
|
|
39
|
-
defaultValue: value?.link?._ref,
|
|
40
|
-
listItems: items,
|
|
41
|
-
onChange: (value2) => {
|
|
42
|
-
const next = value2 ? sanity.set({ _ref: value2, _type: "reference" }, ["link"]) : sanity.unset(["link"]);
|
|
43
|
-
return onChange(next);
|
|
44
|
-
},
|
|
45
|
-
renderValue: (value2, opt) => opt?.label ? changeCase__namespace.capitalCase(opt.label) : value2,
|
|
46
|
-
renderOption: ({ label, uri }) => /* @__PURE__ */ jsxRuntime.jsx(ui.Card, { as: "button", children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Flex, { flex: 1, padding: 3, gap: 2, direction: "column", children: [
|
|
47
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: 2, children: changeCase__namespace.capitalCase(label) }),
|
|
48
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: 0, muted: !0, children: uri })
|
|
49
|
-
] }) })
|
|
50
|
-
}
|
|
51
|
-
),
|
|
52
|
-
selectedItem?.sections?.length ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
53
|
-
sanityUtils.AsyncAutocomplete,
|
|
44
|
+
asyncAutocomplete.AsyncAutocomplete,
|
|
54
45
|
{
|
|
55
46
|
placeholder: "Select section",
|
|
56
|
-
|
|
57
|
-
listItems:
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
47
|
+
noOptionsPlaceholder: "No sections found",
|
|
48
|
+
listItems: fetchSections,
|
|
49
|
+
value: selectedSection,
|
|
50
|
+
renderValue: (value, opt) => opt?.label ? changeCase__namespace.capitalCase(opt.label) : value,
|
|
51
|
+
onChange: (value) => {
|
|
52
|
+
const next = value ? sanity.set(value, ["sectionTarget"]) : sanity.unset(["sectionTarget"]);
|
|
53
|
+
return props.onChange(next);
|
|
61
54
|
},
|
|
62
|
-
|
|
63
|
-
|
|
55
|
+
renderOption: ({ label, value }) => /* @__PURE__ */ jsxRuntime.jsx(ui.Card, { as: "button", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { flex: 1, padding: 3, children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Stack, { space: 3, children: [
|
|
56
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: 2, children: changeCase__namespace.capitalCase(label ?? value) }),
|
|
57
|
+
/* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { size: 1, muted: !0, children: [
|
|
58
|
+
"#",
|
|
59
|
+
changeCase__namespace.capitalCase(value)
|
|
60
|
+
] })
|
|
61
|
+
] }) }) })
|
|
64
62
|
}
|
|
65
|
-
)
|
|
63
|
+
)
|
|
66
64
|
] });
|
|
67
65
|
}
|
|
68
|
-
function LinkInput(props) {
|
|
69
|
-
const options = props.schemaType.options, typeFieldMember = useFieldMember(props.members, "type"), externalFieldMember = useFieldMember(props.members, "external"), emailFieldMember = useFieldMember(props.members, "email"), phoneFieldMember = useFieldMember(props.members, "phone"), fileFieldMember = useFieldMember(props.members, "file"), canDownloadFieldMember = useFieldMember(props.members, "canDownload"), internalFieldMember = useFieldMember(props.members, "internal"), customTextFieldMember = useFieldMember(props.members, "customText"), openInNewTabFieldMember = useFieldMember(props.members, "openInNewTab");
|
|
70
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(ui.Stack, { space: 4, children: [
|
|
71
|
-
typeFieldMember && /* @__PURE__ */ jsxRuntime.jsx(sanity.MemberField, { member: typeFieldMember, ...props }),
|
|
72
|
-
externalFieldMember && /* @__PURE__ */ jsxRuntime.jsx(sanity.MemberField, { member: externalFieldMember, ...props }),
|
|
73
|
-
emailFieldMember && /* @__PURE__ */ jsxRuntime.jsx(sanity.MemberField, { member: emailFieldMember, ...props }),
|
|
74
|
-
phoneFieldMember && /* @__PURE__ */ jsxRuntime.jsx(sanity.MemberField, { member: phoneFieldMember, ...props }),
|
|
75
|
-
fileFieldMember && /* @__PURE__ */ jsxRuntime.jsx(sanity.MemberField, { member: fileFieldMember, ...props }),
|
|
76
|
-
canDownloadFieldMember && /* @__PURE__ */ jsxRuntime.jsx(sanity.MemberField, { member: canDownloadFieldMember, ...props }),
|
|
77
|
-
internalFieldMember && /* @__PURE__ */ jsxRuntime.jsx(InternalLinkInput, { ...props }),
|
|
78
|
-
!options?.noCustomText && customTextFieldMember && /* @__PURE__ */ jsxRuntime.jsx(sanity.MemberField, { member: customTextFieldMember, ...props }),
|
|
79
|
-
openInNewTabFieldMember && /* @__PURE__ */ jsxRuntime.jsx(sanity.MemberField, { member: openInNewTabFieldMember, ...props })
|
|
80
|
-
] });
|
|
81
|
-
}
|
|
82
|
-
const typeName = "wild.link", visibleIfType = sanityUtils.visibleIf("type"), requiredIfType = sanityUtils.requiredIf("type");
|
|
83
66
|
function buildLinkPreview({
|
|
84
|
-
|
|
67
|
+
kind,
|
|
68
|
+
email,
|
|
69
|
+
phone,
|
|
70
|
+
fileName,
|
|
85
71
|
customText,
|
|
86
72
|
internalUri,
|
|
87
|
-
internalTitle,
|
|
88
73
|
externalUrl,
|
|
89
|
-
|
|
90
|
-
phone,
|
|
91
|
-
fileName
|
|
74
|
+
internalTitle
|
|
92
75
|
}) {
|
|
93
|
-
switch (
|
|
76
|
+
switch (kind) {
|
|
94
77
|
case "internal":
|
|
95
78
|
return {
|
|
96
79
|
title: customText ?? internalTitle ?? "Internal Link",
|
|
@@ -128,7 +111,13 @@ function buildLinkPreview({
|
|
|
128
111
|
};
|
|
129
112
|
}
|
|
130
113
|
}
|
|
131
|
-
const
|
|
114
|
+
const typeName = "wild.link", LinkKind = {
|
|
115
|
+
internal: "internal",
|
|
116
|
+
external: "external",
|
|
117
|
+
email: "email",
|
|
118
|
+
phone: "phone",
|
|
119
|
+
file: "file"
|
|
120
|
+
}, visibleIfKind = sanityUtils.visibleIf("kind"), requiredIfKind = sanityUtils.requiredIf("kind"), wildSanityLinkFieldPlugin = sanity.definePlugin((config) => ({
|
|
132
121
|
name: "@madebywild/sanity-link-field",
|
|
133
122
|
schema: {
|
|
134
123
|
types: [
|
|
@@ -139,82 +128,74 @@ const wildSanityLinkFieldPlugin = sanity.definePlugin((config) => ({
|
|
|
139
128
|
description: "Link to an internal page, external URL and more.",
|
|
140
129
|
icon: () => /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: "\u{1F517}" }),
|
|
141
130
|
components: {
|
|
142
|
-
input: (props) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
131
|
+
input: (props) => /* @__PURE__ */ jsxRuntime.jsx(FieldInput, { ...props })
|
|
143
132
|
},
|
|
144
133
|
fields: [
|
|
145
134
|
sanity.defineField({
|
|
146
|
-
name: "
|
|
135
|
+
name: "kind",
|
|
147
136
|
type: "string",
|
|
148
|
-
title: "Link
|
|
137
|
+
title: "Link Kind",
|
|
138
|
+
description: "Select the kind of link.",
|
|
149
139
|
options: {
|
|
150
140
|
layout: "dropdown",
|
|
151
141
|
list: [
|
|
152
|
-
{ title: "\u{1F4C4} Internal Link", value:
|
|
153
|
-
{ title: "\u{1F30D} External Link", value:
|
|
154
|
-
{ title: "\u{1F4E7} Email", value:
|
|
155
|
-
{ title: "\u260E\uFE0F Phone", value:
|
|
156
|
-
{ title: "\u{1F4C3} File", value:
|
|
142
|
+
{ title: "\u{1F4C4} Internal Link", value: LinkKind.internal },
|
|
143
|
+
{ title: "\u{1F30D} External Link", value: LinkKind.external },
|
|
144
|
+
{ title: "\u{1F4E7} Email", value: LinkKind.email },
|
|
145
|
+
{ title: "\u260E\uFE0F Phone", value: LinkKind.phone },
|
|
146
|
+
{ title: "\u{1F4C3} File", value: LinkKind.file }
|
|
157
147
|
]
|
|
158
148
|
}
|
|
159
149
|
}),
|
|
160
150
|
sanity.defineField({
|
|
161
|
-
name:
|
|
151
|
+
name: LinkKind.external,
|
|
162
152
|
type: "url",
|
|
163
153
|
title: "External Link",
|
|
164
|
-
...
|
|
165
|
-
...
|
|
154
|
+
...visibleIfKind(LinkKind.external),
|
|
155
|
+
...requiredIfKind(LinkKind.external)
|
|
166
156
|
}),
|
|
167
157
|
sanity.defineField({
|
|
168
|
-
name:
|
|
158
|
+
name: LinkKind.email,
|
|
169
159
|
type: "string",
|
|
170
160
|
title: "Email",
|
|
171
|
-
...
|
|
172
|
-
...
|
|
161
|
+
...visibleIfKind(LinkKind.email),
|
|
162
|
+
...requiredIfKind(LinkKind.email)
|
|
173
163
|
}),
|
|
174
164
|
sanity.defineField({
|
|
175
|
-
name:
|
|
165
|
+
name: LinkKind.phone,
|
|
176
166
|
type: "string",
|
|
177
167
|
title: "Phone",
|
|
178
|
-
...
|
|
179
|
-
...
|
|
168
|
+
...visibleIfKind(LinkKind.phone),
|
|
169
|
+
...requiredIfKind(LinkKind.phone)
|
|
180
170
|
}),
|
|
181
171
|
sanity.defineField({
|
|
182
|
-
name:
|
|
172
|
+
name: LinkKind.file,
|
|
183
173
|
type: "file",
|
|
184
174
|
title: "File",
|
|
185
|
-
...
|
|
186
|
-
...
|
|
187
|
-
}),
|
|
188
|
-
sanity.defineField({
|
|
189
|
-
name: "canDownload",
|
|
190
|
-
type: "boolean",
|
|
191
|
-
title: "Downloadable",
|
|
192
|
-
initialValue: !0,
|
|
193
|
-
description: "The file will be downloaded when the link is clicked.",
|
|
194
|
-
options: { layout: "switch" },
|
|
195
|
-
...visibleIfType("file"),
|
|
196
|
-
...requiredIfType("file")
|
|
175
|
+
...visibleIfKind(LinkKind.file),
|
|
176
|
+
...requiredIfKind(LinkKind.file)
|
|
197
177
|
}),
|
|
198
178
|
sanity.defineField({
|
|
199
|
-
name:
|
|
179
|
+
name: LinkKind.internal,
|
|
200
180
|
type: "object",
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
collapsible: !1
|
|
181
|
+
...visibleIfKind(LinkKind.internal),
|
|
182
|
+
...requiredIfKind(LinkKind.internal),
|
|
183
|
+
options: { collapsed: !1, collapsible: !1 },
|
|
184
|
+
components: {
|
|
185
|
+
field: (props) => /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: props.children }),
|
|
186
|
+
input: (props) => /* @__PURE__ */ jsxRuntime.jsx(InternalLinkInput, { pluginConfig: config, ...props })
|
|
208
187
|
},
|
|
209
188
|
fields: [
|
|
210
189
|
sanity.defineField({
|
|
211
190
|
type: "reference",
|
|
212
|
-
weak: !0,
|
|
213
191
|
name: "link",
|
|
214
|
-
title: "
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
to: config.internalLinkSchemaTypes
|
|
192
|
+
title: "Internal Link",
|
|
193
|
+
description: "Select a page and an optional section target.",
|
|
194
|
+
weak: config.weakReferences ?? !0,
|
|
195
|
+
to: config.internalLinkSchemaTypes,
|
|
196
|
+
options: {
|
|
197
|
+
disableNew: !0
|
|
198
|
+
}
|
|
218
199
|
}),
|
|
219
200
|
sanity.defineField({
|
|
220
201
|
type: "string",
|
|
@@ -229,6 +210,16 @@ const wildSanityLinkFieldPlugin = sanity.definePlugin((config) => ({
|
|
|
229
210
|
title: "Custom text",
|
|
230
211
|
description: "Will take precedence over inferred text."
|
|
231
212
|
}),
|
|
213
|
+
sanity.defineField({
|
|
214
|
+
name: "canDownload",
|
|
215
|
+
type: "boolean",
|
|
216
|
+
title: "Downloadable",
|
|
217
|
+
initialValue: !0,
|
|
218
|
+
description: "The file will be downloaded when the link is clicked.",
|
|
219
|
+
options: { layout: "switch" },
|
|
220
|
+
...visibleIfKind(LinkKind.file),
|
|
221
|
+
...requiredIfKind(LinkKind.file)
|
|
222
|
+
}),
|
|
232
223
|
sanity.defineField({
|
|
233
224
|
name: "openInNewTab",
|
|
234
225
|
type: "boolean",
|
|
@@ -236,12 +227,12 @@ const wildSanityLinkFieldPlugin = sanity.definePlugin((config) => ({
|
|
|
236
227
|
description: "Open the link in a new tab.",
|
|
237
228
|
initialValue: !1,
|
|
238
229
|
options: { layout: "switch" },
|
|
239
|
-
...
|
|
230
|
+
...visibleIfKind([LinkKind.external, LinkKind.internal])
|
|
240
231
|
})
|
|
241
232
|
],
|
|
242
233
|
preview: {
|
|
243
234
|
select: {
|
|
244
|
-
|
|
235
|
+
kind: "kind",
|
|
245
236
|
email: "email",
|
|
246
237
|
phone: "phone",
|
|
247
238
|
customText: "customText",
|
|
@@ -256,6 +247,7 @@ const wildSanityLinkFieldPlugin = sanity.definePlugin((config) => ({
|
|
|
256
247
|
]
|
|
257
248
|
}
|
|
258
249
|
}));
|
|
250
|
+
exports.LinkKind = LinkKind;
|
|
259
251
|
exports.buildLinkPreview = buildLinkPreview;
|
|
260
252
|
exports.typeName = typeName;
|
|
261
253
|
exports.wildSanityLinkFieldPlugin = wildSanityLinkFieldPlugin;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/input.tsx","../src/types.ts","../src/index.tsx"],"sourcesContent":["import { AsyncAutocomplete } from \"@madebywild/sanity-utils\";\nimport { Box, Card, Flex, Stack, Text } from \"@sanity/ui\";\nimport * as changeCase from \"change-case\";\nimport * as React from \"react\";\nimport type { FieldMember, ObjectInputProps, ObjectMember } from \"sanity\";\nimport { MemberField, set, unset, useClient } from \"sanity\";\nimport type { FieldOptions, InternalLinksQueryResult, PluginConfig } from \"./types\";\n\nfunction useFieldMember(members: ObjectMember[], fieldName: string): FieldMember | undefined {\n return React.useMemo(\n () => members.find((member): member is FieldMember => member.kind === \"field\" && member.name === fieldName),\n [members, fieldName]\n );\n}\n\nfunction InternalLinkInput({\n config,\n value,\n onChange,\n}: ObjectInputProps & {\n config: PluginConfig;\n}) {\n const linkQuery = config.internalLinkQuery;\n const queryTransformer = config.internalLinkTransformer ?? ((res: unknown) => res as InternalLinksQueryResult);\n\n const client = useClient({ apiVersion: \"2025-10-21\" });\n\n const [items, setItems] = React.useState<InternalLinksQueryResult>([]);\n const selectedItem = items.find((_) => _.value === value?.link?._ref);\n\n React.useEffect(() => {\n client\n .fetch(linkQuery)\n .then(queryTransformer)\n .then((items) => items.sort((a, b) => a.label.localeCompare(b.label)))\n .then(setItems);\n }, [client, linkQuery, queryTransformer]);\n\n return (\n <Flex direction=\"column\" gap={2}>\n <AsyncAutocomplete\n placeholder=\"Select page\"\n defaultValue={value?.link?._ref}\n listItems={items}\n onChange={(value) => {\n const next = value ? set({ _ref: value, _type: \"reference\" }, [\"link\"]) : unset([\"link\"]);\n return onChange(next);\n }}\n renderValue={(value, opt) => {\n return opt?.label ? changeCase.capitalCase(opt.label) : value;\n }}\n renderOption={({ label, uri }) => {\n return (\n <Card as=\"button\">\n <Flex flex={1} padding={3} gap={2} direction=\"column\">\n <Text size={2}>{changeCase.capitalCase(label)}</Text>\n <Text size={0} muted>\n {uri}\n </Text>\n </Flex>\n </Card>\n );\n }}\n />\n {selectedItem?.sections?.length ? (\n <AsyncAutocomplete\n placeholder=\"Select section\"\n defaultValue={value?.sectionTarget}\n listItems={selectedItem?.sections}\n onChange={(value) => {\n const next = value ? set(value, [\"sectionTarget\"]) : unset([\"sectionTarget\"]);\n return onChange(next);\n }}\n renderValue={(value, opt) => {\n return opt?.label ? changeCase.capitalCase(opt.label) : value;\n }}\n renderOption={({ label }) => {\n return (\n <Card as=\"button\">\n <Box flex={1} padding={3}>\n <Text size={2}>{changeCase.capitalCase(label)}</Text>\n </Box>\n </Card>\n );\n }}\n />\n ) : null}\n </Flex>\n );\n}\n\nfunction LinkInput(props: ObjectInputProps & { config: PluginConfig }) {\n const options = props.schemaType.options as FieldOptions | undefined;\n\n const typeFieldMember = useFieldMember(props.members, \"type\");\n const externalFieldMember = useFieldMember(props.members, \"external\");\n const emailFieldMember = useFieldMember(props.members, \"email\");\n const phoneFieldMember = useFieldMember(props.members, \"phone\");\n const fileFieldMember = useFieldMember(props.members, \"file\");\n const canDownloadFieldMember = useFieldMember(props.members, \"canDownload\");\n const internalFieldMember = useFieldMember(props.members, \"internal\");\n const customTextFieldMember = useFieldMember(props.members, \"customText\");\n const openInNewTabFieldMember = useFieldMember(props.members, \"openInNewTab\");\n\n return (\n <Stack space={4}>\n {typeFieldMember && <MemberField member={typeFieldMember} {...props} />}\n {externalFieldMember && <MemberField member={externalFieldMember} {...props} />}\n {emailFieldMember && <MemberField member={emailFieldMember} {...props} />}\n {phoneFieldMember && <MemberField member={phoneFieldMember} {...props} />}\n {fileFieldMember && <MemberField member={fileFieldMember} {...props} />}\n {canDownloadFieldMember && <MemberField member={canDownloadFieldMember} {...props} />}\n {internalFieldMember && <InternalLinkInput {...props} />}\n {!options?.noCustomText && customTextFieldMember && <MemberField member={customTextFieldMember} {...props} />}\n {openInNewTabFieldMember && <MemberField member={openInNewTabFieldMember} {...props} />}\n </Stack>\n );\n}\n\nexport { LinkInput };\n","import type { ObjectDefinition, ObjectOptions, ReferenceTo } from \"sanity\";\n\n/** @public */\nexport type InternalLinksQueryResult = {\n label: string;\n value: string;\n uri?: string;\n sections?: {\n label: string;\n value: string;\n }[];\n}[];\n\n/** @public */\nexport type PluginConfig = {\n internalLinkQuery: string;\n internalLinkSchemaTypes?: ReferenceTo;\n internalLinkTransformer?: <QueryRes = unknown>(queryRes: QueryRes) => InternalLinksQueryResult;\n};\n\n/** @public */\nexport type FieldOptions = ObjectOptions & {\n noCustomText?: boolean;\n};\n\n/** @public */\nexport const typeName = \"wild.link\" as const;\n\n// Add the custom field definition to Sanity's intrinsic definitions\n// so that type checking works correctly when using this field type.\ndeclare module \"sanity\" {\n export interface IntrinsicDefinitions {\n [typeName]: Omit<ObjectDefinition, \"type\" | \"fields\"> & {\n type: typeof typeName;\n options?: FieldOptions;\n };\n }\n}\n","import { requiredIf, visibleIf } from \"@madebywild/sanity-utils\";\nimport { defineField, definePlugin, defineType } from \"sanity\";\nimport { LinkInput } from \"./input\";\nimport { type FieldOptions, type InternalLinksQueryResult, type PluginConfig, typeName } from \"./types\";\n\nconst visibleIfType = visibleIf(\"type\");\nconst requiredIfType = requiredIf(\"type\");\n\n/** @public */\nfunction buildLinkPreview({\n type,\n customText,\n internalUri,\n internalTitle,\n externalUrl,\n email,\n phone,\n fileName,\n}: {\n type?: string;\n customText?: string;\n internalUri?: string;\n internalTitle?: string;\n externalUrl?: string;\n email?: string;\n phone?: string;\n fileName?: string;\n}) {\n switch (type) {\n case \"internal\": {\n return {\n title: customText ?? internalTitle ?? \"Internal Link\",\n subtitle: internalUri,\n media: () => <>📄</>,\n };\n }\n case \"external\":\n return {\n title: customText ?? \"External Link\",\n subtitle: externalUrl,\n media: () => <>🌍</>,\n };\n case \"email\":\n return {\n title: customText ?? \"Email Link\",\n subtitle: email,\n media: () => <>📧</>,\n };\n case \"phone\":\n return {\n title: customText ?? \"Phone Link\",\n subtitle: phone,\n media: () => <>☎️</>,\n };\n case \"file\":\n return {\n title: customText ?? \"File Link\",\n subtitle: fileName,\n media: () => <>📃</>,\n };\n default:\n return {\n title: customText ?? \"Empty Link\",\n media: () => <>⛓️💥</>,\n };\n }\n}\n\n/** @public */\nconst wildSanityLinkFieldPlugin = definePlugin<PluginConfig>((config) => {\n return {\n name: \"@madebywild/sanity-link-field\",\n schema: {\n types: [\n defineType({\n name: typeName,\n type: \"object\",\n title: \"Link\",\n description: \"Link to an internal page, external URL and more.\",\n icon: () => <>🔗</>,\n components: {\n input: (props) => <LinkInput config={config} {...props} />,\n },\n fields: [\n defineField({\n name: \"type\",\n type: \"string\",\n title: \"Link Type\",\n options: {\n layout: \"dropdown\",\n list: [\n { title: \"📄 Internal Link\", value: \"internal\" },\n { title: \"🌍 External Link\", value: \"external\" },\n { title: \"📧 Email\", value: \"email\" },\n { title: \"☎️ Phone\", value: \"phone\" },\n { title: \"📃 File\", value: \"file\" },\n ],\n },\n }),\n defineField({\n name: \"external\",\n type: \"url\",\n title: \"External Link\",\n ...visibleIfType(\"external\"),\n ...requiredIfType(\"external\"),\n }),\n defineField({\n name: \"email\",\n type: \"string\",\n title: \"Email\",\n ...visibleIfType(\"email\"),\n ...requiredIfType(\"email\"),\n }),\n defineField({\n name: \"phone\",\n type: \"string\",\n title: \"Phone\",\n ...visibleIfType(\"phone\"),\n ...requiredIfType(\"phone\"),\n }),\n defineField({\n name: \"file\",\n type: \"file\",\n title: \"File\",\n ...visibleIfType(\"file\"),\n ...requiredIfType(\"file\"),\n }),\n defineField({\n name: \"canDownload\",\n type: \"boolean\",\n title: \"Downloadable\",\n initialValue: true,\n description: \"The file will be downloaded when the link is clicked.\",\n options: { layout: \"switch\" },\n ...visibleIfType(\"file\"),\n ...requiredIfType(\"file\"),\n }),\n defineField({\n name: \"internal\",\n type: \"object\",\n title: \"Internal Link\",\n description: \"Select a page and an optional section target.\",\n ...visibleIfType(\"internal\"),\n ...requiredIfType(\"internal\"),\n options: {\n collapsed: false,\n collapsible: false,\n },\n fields: [\n defineField({\n type: \"reference\",\n weak: true,\n name: \"link\",\n title: \"Page\",\n // Note: The custom input component will augment this and add more types.\n // We need to keep at least one type here for Sanity to not complain.\n to: config.internalLinkSchemaTypes ?? [{ type: \"page\" }],\n }),\n defineField({\n type: \"string\",\n name: \"sectionTarget\",\n title: \"Section Target\",\n }),\n ],\n }),\n defineField({\n name: \"customText\",\n type: \"string\",\n title: \"Custom text\",\n description: \"Will take precedence over inferred text.\",\n }),\n defineField({\n name: \"openInNewTab\",\n type: \"boolean\",\n title: \"Open in new tab\",\n description: \"Open the link in a new tab.\",\n initialValue: false,\n options: { layout: \"switch\" },\n ...visibleIfType([\"external\", \"internal\"]),\n }),\n ],\n preview: {\n select: {\n type: \"type\",\n email: \"email\",\n phone: \"phone\",\n customText: \"customText\",\n fileName: \"file.asset.originalFilename\",\n externalUrl: \"external\",\n internalUri: \"internal.uri.current\",\n internalTitle: \"internal.title\",\n },\n prepare: (props) => {\n return buildLinkPreview(props);\n },\n },\n }),\n ],\n },\n };\n});\n\nexport {\n wildSanityLinkFieldPlugin,\n buildLinkPreview,\n typeName,\n type FieldOptions,\n type InternalLinksQueryResult,\n type PluginConfig,\n};\n"],"names":["React","useClient","items","jsxs","Flex","jsx","AsyncAutocomplete","value","set","unset","changeCase","Card","Text","Box","Stack","MemberField","visibleIf","requiredIf","Fragment","definePlugin","defineType","defineField"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/input.tsx","../src/preview.tsx","../src/types.tsx","../src/index.tsx"],"sourcesContent":["import { useFieldMember } from \"@madebywild/sanity-utils\";\nimport { AsyncAutocomplete } from \"@madebywild/sanity-utils/async-autocomplete\";\nimport { Box, Card, Stack, Text } from \"@sanity/ui\";\nimport * as changeCase from \"change-case\";\nimport * as React from \"react\";\nimport type { ObjectInputProps, ObjectMember, Reference } from \"sanity\";\nimport { MemberField, set, unset, useClient, useFormValue } from \"sanity\";\nimport type { FieldOptions, PluginConfig } from \"./types\";\n\nfunction FieldInput(props: ObjectInputProps) {\n const options = props.schemaType.options as FieldOptions | undefined;\n\n return (\n <Stack space={4}>\n {props.members.map((member: ObjectMember) => {\n if (member.kind !== \"field\") return null;\n if (options?.noCustomText && member.name === \"customText\") return null;\n return <MemberField key={member.key} member={member} {...props} />;\n })}\n </Stack>\n );\n}\n\nconst SectionsQuery = `\n *[_id == $pageId && defined(pageBuilder.sectionsArray)][0]{\n \"sections\": array::compact(pageBuilder.sectionsArray[]{\n \"value\": _key,\n \"label\": coalesce(sectionSettings.sectionTitle, _type),\n }),\n }.sections\n`;\n\nfunction InternalLinkInput({\n pluginConfig,\n ...props\n}: ObjectInputProps & {\n pluginConfig: PluginConfig;\n}) {\n const linkFieldMember = useFieldMember(props.members, \"link\");\n\n const selectedLink = useFormValue([...props.path, \"link\"]) as Reference | undefined;\n const selectedSection = useFormValue([...props.path, \"sectionTarget\"]) as string | undefined;\n\n // Reset sectionTarget if link is removed.\n React.useEffect(() => {\n if (!selectedLink?._ref && selectedSection !== undefined) {\n props.onChange(unset([\"sectionTarget\"]));\n }\n }, [selectedLink, selectedSection, props.onChange]);\n\n const client = useClient({ apiVersion: \"2025-10-21\" });\n\n const fetchSections = React.useCallback(() => {\n if (!selectedLink?._ref) return [];\n return client.fetch(SectionsQuery, { pageId: selectedLink._ref }).catch(() => []);\n }, [client, selectedLink, SectionsQuery]);\n\n return (\n <Stack space={2}>\n {linkFieldMember && <MemberField member={linkFieldMember} {...props} />}\n <AsyncAutocomplete\n placeholder=\"Select section\"\n noOptionsPlaceholder=\"No sections found\"\n listItems={fetchSections}\n value={selectedSection}\n renderValue={(value, opt) => {\n return opt?.label ? changeCase.capitalCase(opt.label) : value;\n }}\n onChange={(value) => {\n const next = value ? set(value, [\"sectionTarget\"]) : unset([\"sectionTarget\"]);\n return props.onChange(next);\n }}\n renderOption={({ label, value }) => {\n return (\n <Card as=\"button\">\n <Box flex={1} padding={3}>\n <Stack space={3}>\n <Text size={2}>{changeCase.capitalCase(label ?? value)}</Text>\n <Text size={1} muted>\n #{changeCase.capitalCase(value)}\n </Text>\n </Stack>\n </Box>\n </Card>\n );\n }}\n />\n </Stack>\n );\n}\n\nexport { FieldInput, InternalLinkInput };\n","import type { LinkKind } from \"./types\";\n\n/** @public */\nexport function buildLinkPreview({\n kind,\n email,\n phone,\n fileName,\n customText,\n internalUri,\n externalUrl,\n internalTitle,\n}: {\n kind?: string;\n email?: string;\n phone?: string;\n fileName?: string;\n customText?: string;\n externalUrl?: string;\n internalUri?: string;\n internalTitle?: string;\n}) {\n switch (kind as keyof typeof LinkKind) {\n case \"internal\": {\n return {\n title: customText ?? internalTitle ?? \"Internal Link\",\n subtitle: internalUri,\n media: () => <>📄</>,\n };\n }\n case \"external\":\n return {\n title: customText ?? \"External Link\",\n subtitle: externalUrl,\n media: () => <>🌍</>,\n };\n case \"email\":\n return {\n title: customText ?? \"Email Link\",\n subtitle: email,\n media: () => <>📧</>,\n };\n case \"phone\":\n return {\n title: customText ?? \"Phone Link\",\n subtitle: phone,\n media: () => <>☎️</>,\n };\n case \"file\":\n return {\n title: customText ?? \"File Link\",\n subtitle: fileName,\n media: () => <>📃</>,\n };\n default:\n return {\n title: customText ?? \"Empty Link\",\n media: () => <>⛓️💥</>,\n };\n }\n}\n","import type { ListItem } from \"@madebywild/sanity-utils/async-autocomplete\";\nimport type { ObjectOptions, ReferenceTo, StringDefinition } from \"sanity\";\n\n/** @public */\nexport const typeName = \"wild.link\" as const;\n\n/** @public */\nexport const LinkKind = {\n internal: \"internal\",\n external: \"external\",\n email: \"email\",\n phone: \"phone\",\n file: \"file\",\n} as const;\n\n/** @public */\nexport type SectionQueryResult = ListItem[];\n\n/** @public */\nexport type PluginConfig = {\n weakReferences?: boolean;\n internalLinkSchemaTypes: ReferenceTo;\n};\n\n/** @public */\nexport type FieldOptions = ObjectOptions & {\n noCustomText?: boolean;\n};\n\n// Add the custom field definition to Sanity's intrinsic definitions\n// so that type checking works correctly when using this field type.\ndeclare module \"sanity\" {\n export interface IntrinsicDefinitions {\n [typeName]: Omit<StringDefinition, \"type\" | \"fields\"> & {\n type: typeof typeName;\n };\n }\n}\n","import { requiredIf, visibleIf } from \"@madebywild/sanity-utils\";\nimport { defineField, definePlugin, defineType } from \"sanity\";\nimport { FieldInput, InternalLinkInput } from \"./input\";\nimport { buildLinkPreview } from \"./preview\";\nimport { type FieldOptions, LinkKind, type PluginConfig, type SectionQueryResult, typeName } from \"./types\";\n\nconst visibleIfKind = visibleIf(\"kind\");\nconst requiredIfKind = requiredIf(\"kind\");\n\n/** @public */\nconst wildSanityLinkFieldPlugin = definePlugin<PluginConfig>((config) => {\n return {\n name: \"@madebywild/sanity-link-field\",\n schema: {\n types: [\n defineType({\n name: typeName,\n type: \"object\",\n title: \"Link\",\n description: \"Link to an internal page, external URL and more.\",\n icon: () => <>🔗</>,\n components: {\n input: (props) => <FieldInput {...props} />,\n },\n fields: [\n defineField({\n name: \"kind\",\n type: \"string\",\n title: \"Link Kind\",\n description: \"Select the kind of link.\",\n options: {\n layout: \"dropdown\",\n list: [\n { title: \"📄 Internal Link\", value: LinkKind.internal },\n { title: \"🌍 External Link\", value: LinkKind.external },\n { title: \"📧 Email\", value: LinkKind.email },\n { title: \"☎️ Phone\", value: LinkKind.phone },\n { title: \"📃 File\", value: LinkKind.file },\n ],\n },\n }),\n defineField({\n name: LinkKind.external,\n type: \"url\",\n title: \"External Link\",\n ...visibleIfKind(LinkKind.external),\n ...requiredIfKind(LinkKind.external),\n }),\n defineField({\n name: LinkKind.email,\n type: \"string\",\n title: \"Email\",\n ...visibleIfKind(LinkKind.email),\n ...requiredIfKind(LinkKind.email),\n }),\n defineField({\n name: LinkKind.phone,\n type: \"string\",\n title: \"Phone\",\n ...visibleIfKind(LinkKind.phone),\n ...requiredIfKind(LinkKind.phone),\n }),\n defineField({\n name: LinkKind.file,\n type: \"file\",\n title: \"File\",\n ...visibleIfKind(LinkKind.file),\n ...requiredIfKind(LinkKind.file),\n }),\n defineField({\n name: LinkKind.internal,\n type: \"object\",\n ...visibleIfKind(LinkKind.internal),\n ...requiredIfKind(LinkKind.internal),\n options: { collapsed: false, collapsible: false },\n components: {\n field: (props) => <>{props.children}</>,\n input: (props) => <InternalLinkInput pluginConfig={config} {...props} />,\n },\n fields: [\n defineField({\n type: \"reference\",\n name: \"link\",\n title: \"Internal Link\",\n description: \"Select a page and an optional section target.\",\n weak: config.weakReferences ?? true,\n to: config.internalLinkSchemaTypes,\n options: {\n disableNew: true,\n },\n }),\n defineField({\n type: \"string\",\n name: \"sectionTarget\",\n title: \"Section Target\",\n }),\n ],\n }),\n defineField({\n name: \"customText\",\n type: \"string\",\n title: \"Custom text\",\n description: \"Will take precedence over inferred text.\",\n }),\n defineField({\n name: \"canDownload\",\n type: \"boolean\",\n title: \"Downloadable\",\n initialValue: true,\n description: \"The file will be downloaded when the link is clicked.\",\n options: { layout: \"switch\" },\n ...visibleIfKind(LinkKind.file),\n ...requiredIfKind(LinkKind.file),\n }),\n defineField({\n name: \"openInNewTab\",\n type: \"boolean\",\n title: \"Open in new tab\",\n description: \"Open the link in a new tab.\",\n initialValue: false,\n options: { layout: \"switch\" },\n ...visibleIfKind([LinkKind.external, LinkKind.internal]),\n }),\n ],\n preview: {\n select: {\n kind: \"kind\",\n email: \"email\",\n phone: \"phone\",\n customText: \"customText\",\n fileName: \"file.asset.originalFilename\",\n externalUrl: \"external\",\n internalUri: \"internal.uri.current\",\n internalTitle: \"internal.title\",\n },\n prepare: (props) => {\n return buildLinkPreview(props);\n },\n },\n }),\n ],\n },\n };\n});\n\nexport {\n wildSanityLinkFieldPlugin,\n typeName,\n LinkKind,\n buildLinkPreview,\n type PluginConfig,\n type FieldOptions,\n type SectionQueryResult,\n};\n"],"names":["jsx","Stack","MemberField","useFieldMember","useFormValue","React","unset","useClient","jsxs","AsyncAutocomplete","changeCase","set","Card","Box","Text","Fragment","visibleIf","requiredIf","definePlugin","defineType","defineField"],"mappings":"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"}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,55 +1,26 @@
|
|
|
1
|
-
import * as react1 from "react";
|
|
2
1
|
import * as sanity0 from "sanity";
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
label: string;
|
|
7
|
-
value: string;
|
|
8
|
-
uri?: string;
|
|
9
|
-
sections?: {
|
|
10
|
-
label: string;
|
|
11
|
-
value: string;
|
|
12
|
-
}[];
|
|
13
|
-
}[];
|
|
14
|
-
/** @public */
|
|
15
|
-
type PluginConfig = {
|
|
16
|
-
internalLinkQuery: string;
|
|
17
|
-
internalLinkSchemaTypes?: ReferenceTo;
|
|
18
|
-
internalLinkTransformer?: <QueryRes = unknown>(queryRes: QueryRes) => InternalLinksQueryResult;
|
|
19
|
-
};
|
|
20
|
-
/** @public */
|
|
21
|
-
type FieldOptions = ObjectOptions & {
|
|
22
|
-
noCustomText?: boolean;
|
|
23
|
-
};
|
|
24
|
-
/** @public */
|
|
25
|
-
declare const typeName: "wild.link";
|
|
26
|
-
declare module "sanity" {
|
|
27
|
-
interface IntrinsicDefinitions {
|
|
28
|
-
[typeName]: Omit<ObjectDefinition, "type" | "fields"> & {
|
|
29
|
-
type: typeof typeName;
|
|
30
|
-
options?: FieldOptions;
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
}
|
|
2
|
+
import { ObjectOptions, ReferenceTo, StringDefinition } from "sanity";
|
|
3
|
+
import * as react1 from "react";
|
|
4
|
+
import { ListItem } from "@madebywild/sanity-utils/async-autocomplete";
|
|
34
5
|
/** @public */
|
|
35
6
|
declare function buildLinkPreview({
|
|
36
|
-
|
|
7
|
+
kind,
|
|
8
|
+
email,
|
|
9
|
+
phone,
|
|
10
|
+
fileName,
|
|
37
11
|
customText,
|
|
38
12
|
internalUri,
|
|
39
|
-
internalTitle,
|
|
40
13
|
externalUrl,
|
|
41
|
-
|
|
42
|
-
phone,
|
|
43
|
-
fileName
|
|
14
|
+
internalTitle
|
|
44
15
|
}: {
|
|
45
|
-
|
|
46
|
-
customText?: string;
|
|
47
|
-
internalUri?: string;
|
|
48
|
-
internalTitle?: string;
|
|
49
|
-
externalUrl?: string;
|
|
16
|
+
kind?: string;
|
|
50
17
|
email?: string;
|
|
51
18
|
phone?: string;
|
|
52
19
|
fileName?: string;
|
|
20
|
+
customText?: string;
|
|
21
|
+
externalUrl?: string;
|
|
22
|
+
internalUri?: string;
|
|
23
|
+
internalTitle?: string;
|
|
53
24
|
}): {
|
|
54
25
|
title: string;
|
|
55
26
|
subtitle: string | undefined;
|
|
@@ -60,5 +31,33 @@ declare function buildLinkPreview({
|
|
|
60
31
|
subtitle?: undefined;
|
|
61
32
|
};
|
|
62
33
|
/** @public */
|
|
34
|
+
declare const typeName: "wild.link";
|
|
35
|
+
/** @public */
|
|
36
|
+
declare const LinkKind: {
|
|
37
|
+
readonly internal: "internal";
|
|
38
|
+
readonly external: "external";
|
|
39
|
+
readonly email: "email";
|
|
40
|
+
readonly phone: "phone";
|
|
41
|
+
readonly file: "file";
|
|
42
|
+
};
|
|
43
|
+
/** @public */
|
|
44
|
+
type SectionQueryResult = ListItem[];
|
|
45
|
+
/** @public */
|
|
46
|
+
type PluginConfig = {
|
|
47
|
+
weakReferences?: boolean;
|
|
48
|
+
internalLinkSchemaTypes: ReferenceTo;
|
|
49
|
+
};
|
|
50
|
+
/** @public */
|
|
51
|
+
type FieldOptions = ObjectOptions & {
|
|
52
|
+
noCustomText?: boolean;
|
|
53
|
+
};
|
|
54
|
+
declare module "sanity" {
|
|
55
|
+
interface IntrinsicDefinitions {
|
|
56
|
+
[typeName]: Omit<StringDefinition, "type" | "fields"> & {
|
|
57
|
+
type: typeof typeName;
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/** @public */
|
|
63
62
|
declare const wildSanityLinkFieldPlugin: sanity0.Plugin<PluginConfig>;
|
|
64
|
-
export { type FieldOptions, type
|
|
63
|
+
export { type FieldOptions, LinkKind, type PluginConfig, type SectionQueryResult, buildLinkPreview, typeName, wildSanityLinkFieldPlugin };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,55 +1,26 @@
|
|
|
1
|
-
import * as react1 from "react";
|
|
2
1
|
import * as sanity0 from "sanity";
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
label: string;
|
|
7
|
-
value: string;
|
|
8
|
-
uri?: string;
|
|
9
|
-
sections?: {
|
|
10
|
-
label: string;
|
|
11
|
-
value: string;
|
|
12
|
-
}[];
|
|
13
|
-
}[];
|
|
14
|
-
/** @public */
|
|
15
|
-
type PluginConfig = {
|
|
16
|
-
internalLinkQuery: string;
|
|
17
|
-
internalLinkSchemaTypes?: ReferenceTo;
|
|
18
|
-
internalLinkTransformer?: <QueryRes = unknown>(queryRes: QueryRes) => InternalLinksQueryResult;
|
|
19
|
-
};
|
|
20
|
-
/** @public */
|
|
21
|
-
type FieldOptions = ObjectOptions & {
|
|
22
|
-
noCustomText?: boolean;
|
|
23
|
-
};
|
|
24
|
-
/** @public */
|
|
25
|
-
declare const typeName: "wild.link";
|
|
26
|
-
declare module "sanity" {
|
|
27
|
-
interface IntrinsicDefinitions {
|
|
28
|
-
[typeName]: Omit<ObjectDefinition, "type" | "fields"> & {
|
|
29
|
-
type: typeof typeName;
|
|
30
|
-
options?: FieldOptions;
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
}
|
|
2
|
+
import { ObjectOptions, ReferenceTo, StringDefinition } from "sanity";
|
|
3
|
+
import * as react1 from "react";
|
|
4
|
+
import { ListItem } from "@madebywild/sanity-utils/async-autocomplete";
|
|
34
5
|
/** @public */
|
|
35
6
|
declare function buildLinkPreview({
|
|
36
|
-
|
|
7
|
+
kind,
|
|
8
|
+
email,
|
|
9
|
+
phone,
|
|
10
|
+
fileName,
|
|
37
11
|
customText,
|
|
38
12
|
internalUri,
|
|
39
|
-
internalTitle,
|
|
40
13
|
externalUrl,
|
|
41
|
-
|
|
42
|
-
phone,
|
|
43
|
-
fileName
|
|
14
|
+
internalTitle
|
|
44
15
|
}: {
|
|
45
|
-
|
|
46
|
-
customText?: string;
|
|
47
|
-
internalUri?: string;
|
|
48
|
-
internalTitle?: string;
|
|
49
|
-
externalUrl?: string;
|
|
16
|
+
kind?: string;
|
|
50
17
|
email?: string;
|
|
51
18
|
phone?: string;
|
|
52
19
|
fileName?: string;
|
|
20
|
+
customText?: string;
|
|
21
|
+
externalUrl?: string;
|
|
22
|
+
internalUri?: string;
|
|
23
|
+
internalTitle?: string;
|
|
53
24
|
}): {
|
|
54
25
|
title: string;
|
|
55
26
|
subtitle: string | undefined;
|
|
@@ -60,5 +31,33 @@ declare function buildLinkPreview({
|
|
|
60
31
|
subtitle?: undefined;
|
|
61
32
|
};
|
|
62
33
|
/** @public */
|
|
34
|
+
declare const typeName: "wild.link";
|
|
35
|
+
/** @public */
|
|
36
|
+
declare const LinkKind: {
|
|
37
|
+
readonly internal: "internal";
|
|
38
|
+
readonly external: "external";
|
|
39
|
+
readonly email: "email";
|
|
40
|
+
readonly phone: "phone";
|
|
41
|
+
readonly file: "file";
|
|
42
|
+
};
|
|
43
|
+
/** @public */
|
|
44
|
+
type SectionQueryResult = ListItem[];
|
|
45
|
+
/** @public */
|
|
46
|
+
type PluginConfig = {
|
|
47
|
+
weakReferences?: boolean;
|
|
48
|
+
internalLinkSchemaTypes: ReferenceTo;
|
|
49
|
+
};
|
|
50
|
+
/** @public */
|
|
51
|
+
type FieldOptions = ObjectOptions & {
|
|
52
|
+
noCustomText?: boolean;
|
|
53
|
+
};
|
|
54
|
+
declare module "sanity" {
|
|
55
|
+
interface IntrinsicDefinitions {
|
|
56
|
+
[typeName]: Omit<StringDefinition, "type" | "fields"> & {
|
|
57
|
+
type: typeof typeName;
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/** @public */
|
|
63
62
|
declare const wildSanityLinkFieldPlugin: sanity0.Plugin<PluginConfig>;
|
|
64
|
-
export { type FieldOptions, type
|
|
63
|
+
export { type FieldOptions, LinkKind, type PluginConfig, type SectionQueryResult, buildLinkPreview, typeName, wildSanityLinkFieldPlugin };
|