@madebywild/sanity-link-field 0.0.4 → 0.0.6
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/dist/index.cjs +259 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +245 -4
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
- package/dist/_chunks-cjs/index.cjs +0 -18575
- package/dist/_chunks-cjs/index.cjs.map +0 -1
- package/dist/_chunks-cjs/refractor.cjs +0 -4643
- package/dist/_chunks-cjs/refractor.cjs.map +0 -1
- package/dist/_chunks-es/index.js +0 -18565
- package/dist/_chunks-es/index.js.map +0 -1
- package/dist/_chunks-es/refractor.js +0 -4646
- package/dist/_chunks-es/refractor.js.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -1,10 +1,262 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: !0 });
|
|
3
|
-
require("react/jsx-runtime");
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
var
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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");
|
|
4
|
+
function _interopNamespaceCompat(e) {
|
|
5
|
+
if (e && typeof e == "object" && "default" in e) return e;
|
|
6
|
+
var n = /* @__PURE__ */ Object.create(null);
|
|
7
|
+
return e && Object.keys(e).forEach(function(k) {
|
|
8
|
+
if (k !== "default") {
|
|
9
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
10
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
11
|
+
enumerable: !0,
|
|
12
|
+
get: function() {
|
|
13
|
+
return e[k];
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
}), n.default = e, Object.freeze(n);
|
|
18
|
+
}
|
|
19
|
+
var changeCase__namespace = /* @__PURE__ */ _interopNamespaceCompat(changeCase), React__namespace = /* @__PURE__ */ _interopNamespaceCompat(React);
|
|
20
|
+
function useFieldMember(members, fieldName) {
|
|
21
|
+
return React__namespace.useMemo(
|
|
22
|
+
() => members.find((member) => member.kind === "field" && member.name === fieldName),
|
|
23
|
+
[members, fieldName]
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
function InternalLinkInput({
|
|
27
|
+
config,
|
|
28
|
+
value,
|
|
29
|
+
onChange
|
|
30
|
+
}) {
|
|
31
|
+
const linkQuery = config.internalLinkQuery, queryTransformer = config.internalLinkTransformer, client = sanity.useClient({ apiVersion: "2025-10-21" }), [items, setItems] = React__namespace.useState([]), selectedItem = items.find((_) => _.value === value?.link?._ref);
|
|
32
|
+
return React__namespace.useEffect(() => {
|
|
33
|
+
client.fetch(linkQuery).then(queryTransformer).then((items2) => items2.sort((a, b) => a.label.localeCompare(b.label))).then(setItems);
|
|
34
|
+
}, [client, linkQuery, queryTransformer]), /* @__PURE__ */ jsxRuntime.jsxs(ui.Flex, { direction: "column", gap: 2, children: [
|
|
35
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
36
|
+
sanityUtils.AsyncAutocomplete,
|
|
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,
|
|
54
|
+
{
|
|
55
|
+
placeholder: "Select section",
|
|
56
|
+
defaultValue: value?.sectionTarget,
|
|
57
|
+
listItems: selectedItem?.sections,
|
|
58
|
+
onChange: (value2) => {
|
|
59
|
+
const next = value2 ? sanity.set(value2, ["sectionTarget"]) : sanity.unset(["sectionTarget"]);
|
|
60
|
+
return onChange(next);
|
|
61
|
+
},
|
|
62
|
+
renderValue: (value2, opt) => opt?.label ? changeCase__namespace.capitalCase(opt.label) : value2,
|
|
63
|
+
renderOption: ({ label }) => /* @__PURE__ */ jsxRuntime.jsx(ui.Card, { as: "button", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { flex: 1, padding: 3, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: 2, children: changeCase__namespace.capitalCase(label) }) }) })
|
|
64
|
+
}
|
|
65
|
+
) : null
|
|
66
|
+
] });
|
|
67
|
+
}
|
|
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
|
+
function buildLinkPreview({
|
|
84
|
+
type,
|
|
85
|
+
customText,
|
|
86
|
+
internalUri,
|
|
87
|
+
internalTitle,
|
|
88
|
+
externalUrl,
|
|
89
|
+
email,
|
|
90
|
+
phone,
|
|
91
|
+
fileName
|
|
92
|
+
}) {
|
|
93
|
+
switch (type) {
|
|
94
|
+
case "internal":
|
|
95
|
+
return {
|
|
96
|
+
title: customText ?? internalTitle ?? "Internal Link",
|
|
97
|
+
subtitle: internalUri,
|
|
98
|
+
media: () => /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: "\u{1F4C4}" })
|
|
99
|
+
};
|
|
100
|
+
case "external":
|
|
101
|
+
return {
|
|
102
|
+
title: customText ?? "External Link",
|
|
103
|
+
subtitle: externalUrl,
|
|
104
|
+
media: () => /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: "\u{1F30D}" })
|
|
105
|
+
};
|
|
106
|
+
case "email":
|
|
107
|
+
return {
|
|
108
|
+
title: customText ?? "Email Link",
|
|
109
|
+
subtitle: email,
|
|
110
|
+
media: () => /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: "\u{1F4E7}" })
|
|
111
|
+
};
|
|
112
|
+
case "phone":
|
|
113
|
+
return {
|
|
114
|
+
title: customText ?? "Phone Link",
|
|
115
|
+
subtitle: phone,
|
|
116
|
+
media: () => /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: "\u260E\uFE0F" })
|
|
117
|
+
};
|
|
118
|
+
case "file":
|
|
119
|
+
return {
|
|
120
|
+
title: customText ?? "File Link",
|
|
121
|
+
subtitle: fileName,
|
|
122
|
+
media: () => /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: "\u{1F4C3}" })
|
|
123
|
+
};
|
|
124
|
+
default:
|
|
125
|
+
return {
|
|
126
|
+
title: customText ?? "Empty Link",
|
|
127
|
+
media: () => /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: "\u26D3\uFE0F\u200D\u{1F4A5}" })
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const wildSanityLinkFieldPlugin = sanity.definePlugin((config) => ({
|
|
132
|
+
name: "@madebywild/sanity-link-field",
|
|
133
|
+
schema: {
|
|
134
|
+
types: [
|
|
135
|
+
sanity.defineType({
|
|
136
|
+
name: typeName,
|
|
137
|
+
type: "object",
|
|
138
|
+
title: "Link",
|
|
139
|
+
description: "Link to an internal page, external URL and more.",
|
|
140
|
+
icon: () => /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: "\u{1F517}" }),
|
|
141
|
+
components: {
|
|
142
|
+
input: (props) => /* @__PURE__ */ jsxRuntime.jsx(LinkInput, { config, ...props })
|
|
143
|
+
},
|
|
144
|
+
fields: [
|
|
145
|
+
sanity.defineField({
|
|
146
|
+
name: "type",
|
|
147
|
+
type: "string",
|
|
148
|
+
title: "Link Type",
|
|
149
|
+
options: {
|
|
150
|
+
layout: "dropdown",
|
|
151
|
+
list: [
|
|
152
|
+
{ title: "\u{1F4C4} Internal Link", value: "internal" },
|
|
153
|
+
{ title: "\u{1F30D} External Link", value: "external" },
|
|
154
|
+
{ title: "\u{1F4E7} Email", value: "email" },
|
|
155
|
+
{ title: "\u260E\uFE0F Phone", value: "phone" },
|
|
156
|
+
{ title: "\u{1F4C3} File", value: "file" }
|
|
157
|
+
]
|
|
158
|
+
}
|
|
159
|
+
}),
|
|
160
|
+
sanity.defineField({
|
|
161
|
+
name: "external",
|
|
162
|
+
type: "url",
|
|
163
|
+
title: "External Link",
|
|
164
|
+
...visibleIfType("external"),
|
|
165
|
+
...requiredIfType("external")
|
|
166
|
+
}),
|
|
167
|
+
sanity.defineField({
|
|
168
|
+
name: "email",
|
|
169
|
+
type: "string",
|
|
170
|
+
title: "Email",
|
|
171
|
+
...visibleIfType("email"),
|
|
172
|
+
...requiredIfType("email")
|
|
173
|
+
}),
|
|
174
|
+
sanity.defineField({
|
|
175
|
+
name: "phone",
|
|
176
|
+
type: "string",
|
|
177
|
+
title: "Phone",
|
|
178
|
+
...visibleIfType("phone"),
|
|
179
|
+
...requiredIfType("phone")
|
|
180
|
+
}),
|
|
181
|
+
sanity.defineField({
|
|
182
|
+
name: "file",
|
|
183
|
+
type: "file",
|
|
184
|
+
title: "File",
|
|
185
|
+
...visibleIfType("file"),
|
|
186
|
+
...requiredIfType("file")
|
|
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")
|
|
197
|
+
}),
|
|
198
|
+
sanity.defineField({
|
|
199
|
+
name: "internal",
|
|
200
|
+
type: "object",
|
|
201
|
+
title: "Internal Link",
|
|
202
|
+
description: "Select a page and an optional section target.",
|
|
203
|
+
...visibleIfType("internal"),
|
|
204
|
+
...requiredIfType("internal"),
|
|
205
|
+
options: {
|
|
206
|
+
collapsed: !1,
|
|
207
|
+
collapsible: !1
|
|
208
|
+
},
|
|
209
|
+
fields: [
|
|
210
|
+
sanity.defineField({
|
|
211
|
+
type: "reference",
|
|
212
|
+
weak: !0,
|
|
213
|
+
name: "link",
|
|
214
|
+
title: "Page",
|
|
215
|
+
// Note: The custom input component will augment this and add more types.
|
|
216
|
+
// We need to keep at least one type here for Sanity to not complain.
|
|
217
|
+
to: config.internalLinkSchemaTypes ?? [{ type: "page" }]
|
|
218
|
+
}),
|
|
219
|
+
sanity.defineField({
|
|
220
|
+
type: "string",
|
|
221
|
+
name: "sectionTarget",
|
|
222
|
+
title: "Section Target"
|
|
223
|
+
})
|
|
224
|
+
]
|
|
225
|
+
}),
|
|
226
|
+
sanity.defineField({
|
|
227
|
+
name: "customText",
|
|
228
|
+
type: "string",
|
|
229
|
+
title: "Custom text",
|
|
230
|
+
description: "Will take precedence over inferred text."
|
|
231
|
+
}),
|
|
232
|
+
sanity.defineField({
|
|
233
|
+
name: "openInNewTab",
|
|
234
|
+
type: "boolean",
|
|
235
|
+
title: "Open in new tab",
|
|
236
|
+
description: "Open the link in a new tab.",
|
|
237
|
+
initialValue: !1,
|
|
238
|
+
options: { layout: "switch" },
|
|
239
|
+
...visibleIfType(["external", "internal"])
|
|
240
|
+
})
|
|
241
|
+
],
|
|
242
|
+
preview: {
|
|
243
|
+
select: {
|
|
244
|
+
type: "type",
|
|
245
|
+
email: "email",
|
|
246
|
+
phone: "phone",
|
|
247
|
+
customText: "customText",
|
|
248
|
+
fileName: "file.asset.originalFilename",
|
|
249
|
+
externalUrl: "external",
|
|
250
|
+
internalUri: "internal.uri.current",
|
|
251
|
+
internalTitle: "internal.title"
|
|
252
|
+
},
|
|
253
|
+
prepare: (props) => buildLinkPreview(props)
|
|
254
|
+
}
|
|
255
|
+
})
|
|
256
|
+
]
|
|
257
|
+
}
|
|
258
|
+
}));
|
|
259
|
+
exports.buildLinkPreview = buildLinkPreview;
|
|
260
|
+
exports.typeName = typeName;
|
|
261
|
+
exports.wildSanityLinkFieldPlugin = wildSanityLinkFieldPlugin;
|
|
10
262
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
|
|
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;\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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"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,248 @@
|
|
|
1
|
-
import "react/jsx-runtime";
|
|
2
|
-
import "@madebywild/sanity-utils";
|
|
3
|
-
import "sanity";
|
|
4
|
-
import {
|
|
1
|
+
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { AsyncAutocomplete, visibleIf, requiredIf } from "@madebywild/sanity-utils";
|
|
3
|
+
import { MemberField, useClient, set, unset, definePlugin, defineType, defineField } from "sanity";
|
|
4
|
+
import { Stack, Flex, Card, Text, Box } from "@sanity/ui";
|
|
5
|
+
import * as changeCase from "change-case";
|
|
6
|
+
import * as React from "react";
|
|
7
|
+
function useFieldMember(members, fieldName) {
|
|
8
|
+
return React.useMemo(
|
|
9
|
+
() => members.find((member) => member.kind === "field" && member.name === fieldName),
|
|
10
|
+
[members, fieldName]
|
|
11
|
+
);
|
|
12
|
+
}
|
|
13
|
+
function InternalLinkInput({
|
|
14
|
+
config,
|
|
15
|
+
value,
|
|
16
|
+
onChange
|
|
17
|
+
}) {
|
|
18
|
+
const linkQuery = config.internalLinkQuery, queryTransformer = config.internalLinkTransformer, client = useClient({ apiVersion: "2025-10-21" }), [items, setItems] = React.useState([]), selectedItem = items.find((_) => _.value === value?.link?._ref);
|
|
19
|
+
return React.useEffect(() => {
|
|
20
|
+
client.fetch(linkQuery).then(queryTransformer).then((items2) => items2.sort((a, b) => a.label.localeCompare(b.label))).then(setItems);
|
|
21
|
+
}, [client, linkQuery, queryTransformer]), /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: 2, children: [
|
|
22
|
+
/* @__PURE__ */ jsx(
|
|
23
|
+
AsyncAutocomplete,
|
|
24
|
+
{
|
|
25
|
+
placeholder: "Select page",
|
|
26
|
+
defaultValue: value?.link?._ref,
|
|
27
|
+
listItems: items,
|
|
28
|
+
onChange: (value2) => {
|
|
29
|
+
const next = value2 ? set({ _ref: value2, _type: "reference" }, ["link"]) : unset(["link"]);
|
|
30
|
+
return onChange(next);
|
|
31
|
+
},
|
|
32
|
+
renderValue: (value2, opt) => opt?.label ? changeCase.capitalCase(opt.label) : value2,
|
|
33
|
+
renderOption: ({ label, uri }) => /* @__PURE__ */ jsx(Card, { as: "button", children: /* @__PURE__ */ jsxs(Flex, { flex: 1, padding: 3, gap: 2, direction: "column", children: [
|
|
34
|
+
/* @__PURE__ */ jsx(Text, { size: 2, children: changeCase.capitalCase(label) }),
|
|
35
|
+
/* @__PURE__ */ jsx(Text, { size: 0, muted: !0, children: uri })
|
|
36
|
+
] }) })
|
|
37
|
+
}
|
|
38
|
+
),
|
|
39
|
+
selectedItem?.sections?.length ? /* @__PURE__ */ jsx(
|
|
40
|
+
AsyncAutocomplete,
|
|
41
|
+
{
|
|
42
|
+
placeholder: "Select section",
|
|
43
|
+
defaultValue: value?.sectionTarget,
|
|
44
|
+
listItems: selectedItem?.sections,
|
|
45
|
+
onChange: (value2) => {
|
|
46
|
+
const next = value2 ? set(value2, ["sectionTarget"]) : unset(["sectionTarget"]);
|
|
47
|
+
return onChange(next);
|
|
48
|
+
},
|
|
49
|
+
renderValue: (value2, opt) => opt?.label ? changeCase.capitalCase(opt.label) : value2,
|
|
50
|
+
renderOption: ({ label }) => /* @__PURE__ */ jsx(Card, { as: "button", children: /* @__PURE__ */ jsx(Box, { flex: 1, padding: 3, children: /* @__PURE__ */ jsx(Text, { size: 2, children: changeCase.capitalCase(label) }) }) })
|
|
51
|
+
}
|
|
52
|
+
) : null
|
|
53
|
+
] });
|
|
54
|
+
}
|
|
55
|
+
function LinkInput(props) {
|
|
56
|
+
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");
|
|
57
|
+
return /* @__PURE__ */ jsxs(Stack, { space: 4, children: [
|
|
58
|
+
typeFieldMember && /* @__PURE__ */ jsx(MemberField, { member: typeFieldMember, ...props }),
|
|
59
|
+
externalFieldMember && /* @__PURE__ */ jsx(MemberField, { member: externalFieldMember, ...props }),
|
|
60
|
+
emailFieldMember && /* @__PURE__ */ jsx(MemberField, { member: emailFieldMember, ...props }),
|
|
61
|
+
phoneFieldMember && /* @__PURE__ */ jsx(MemberField, { member: phoneFieldMember, ...props }),
|
|
62
|
+
fileFieldMember && /* @__PURE__ */ jsx(MemberField, { member: fileFieldMember, ...props }),
|
|
63
|
+
canDownloadFieldMember && /* @__PURE__ */ jsx(MemberField, { member: canDownloadFieldMember, ...props }),
|
|
64
|
+
internalFieldMember && /* @__PURE__ */ jsx(InternalLinkInput, { ...props }),
|
|
65
|
+
!options?.noCustomText && customTextFieldMember && /* @__PURE__ */ jsx(MemberField, { member: customTextFieldMember, ...props }),
|
|
66
|
+
openInNewTabFieldMember && /* @__PURE__ */ jsx(MemberField, { member: openInNewTabFieldMember, ...props })
|
|
67
|
+
] });
|
|
68
|
+
}
|
|
69
|
+
const typeName = "wild.link", visibleIfType = visibleIf("type"), requiredIfType = requiredIf("type");
|
|
70
|
+
function buildLinkPreview({
|
|
71
|
+
type,
|
|
72
|
+
customText,
|
|
73
|
+
internalUri,
|
|
74
|
+
internalTitle,
|
|
75
|
+
externalUrl,
|
|
76
|
+
email,
|
|
77
|
+
phone,
|
|
78
|
+
fileName
|
|
79
|
+
}) {
|
|
80
|
+
switch (type) {
|
|
81
|
+
case "internal":
|
|
82
|
+
return {
|
|
83
|
+
title: customText ?? internalTitle ?? "Internal Link",
|
|
84
|
+
subtitle: internalUri,
|
|
85
|
+
media: () => /* @__PURE__ */ jsx(Fragment, { children: "\u{1F4C4}" })
|
|
86
|
+
};
|
|
87
|
+
case "external":
|
|
88
|
+
return {
|
|
89
|
+
title: customText ?? "External Link",
|
|
90
|
+
subtitle: externalUrl,
|
|
91
|
+
media: () => /* @__PURE__ */ jsx(Fragment, { children: "\u{1F30D}" })
|
|
92
|
+
};
|
|
93
|
+
case "email":
|
|
94
|
+
return {
|
|
95
|
+
title: customText ?? "Email Link",
|
|
96
|
+
subtitle: email,
|
|
97
|
+
media: () => /* @__PURE__ */ jsx(Fragment, { children: "\u{1F4E7}" })
|
|
98
|
+
};
|
|
99
|
+
case "phone":
|
|
100
|
+
return {
|
|
101
|
+
title: customText ?? "Phone Link",
|
|
102
|
+
subtitle: phone,
|
|
103
|
+
media: () => /* @__PURE__ */ jsx(Fragment, { children: "\u260E\uFE0F" })
|
|
104
|
+
};
|
|
105
|
+
case "file":
|
|
106
|
+
return {
|
|
107
|
+
title: customText ?? "File Link",
|
|
108
|
+
subtitle: fileName,
|
|
109
|
+
media: () => /* @__PURE__ */ jsx(Fragment, { children: "\u{1F4C3}" })
|
|
110
|
+
};
|
|
111
|
+
default:
|
|
112
|
+
return {
|
|
113
|
+
title: customText ?? "Empty Link",
|
|
114
|
+
media: () => /* @__PURE__ */ jsx(Fragment, { children: "\u26D3\uFE0F\u200D\u{1F4A5}" })
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const wildSanityLinkFieldPlugin = definePlugin((config) => ({
|
|
119
|
+
name: "@madebywild/sanity-link-field",
|
|
120
|
+
schema: {
|
|
121
|
+
types: [
|
|
122
|
+
defineType({
|
|
123
|
+
name: typeName,
|
|
124
|
+
type: "object",
|
|
125
|
+
title: "Link",
|
|
126
|
+
description: "Link to an internal page, external URL and more.",
|
|
127
|
+
icon: () => /* @__PURE__ */ jsx(Fragment, { children: "\u{1F517}" }),
|
|
128
|
+
components: {
|
|
129
|
+
input: (props) => /* @__PURE__ */ jsx(LinkInput, { config, ...props })
|
|
130
|
+
},
|
|
131
|
+
fields: [
|
|
132
|
+
defineField({
|
|
133
|
+
name: "type",
|
|
134
|
+
type: "string",
|
|
135
|
+
title: "Link Type",
|
|
136
|
+
options: {
|
|
137
|
+
layout: "dropdown",
|
|
138
|
+
list: [
|
|
139
|
+
{ title: "\u{1F4C4} Internal Link", value: "internal" },
|
|
140
|
+
{ title: "\u{1F30D} External Link", value: "external" },
|
|
141
|
+
{ title: "\u{1F4E7} Email", value: "email" },
|
|
142
|
+
{ title: "\u260E\uFE0F Phone", value: "phone" },
|
|
143
|
+
{ title: "\u{1F4C3} File", value: "file" }
|
|
144
|
+
]
|
|
145
|
+
}
|
|
146
|
+
}),
|
|
147
|
+
defineField({
|
|
148
|
+
name: "external",
|
|
149
|
+
type: "url",
|
|
150
|
+
title: "External Link",
|
|
151
|
+
...visibleIfType("external"),
|
|
152
|
+
...requiredIfType("external")
|
|
153
|
+
}),
|
|
154
|
+
defineField({
|
|
155
|
+
name: "email",
|
|
156
|
+
type: "string",
|
|
157
|
+
title: "Email",
|
|
158
|
+
...visibleIfType("email"),
|
|
159
|
+
...requiredIfType("email")
|
|
160
|
+
}),
|
|
161
|
+
defineField({
|
|
162
|
+
name: "phone",
|
|
163
|
+
type: "string",
|
|
164
|
+
title: "Phone",
|
|
165
|
+
...visibleIfType("phone"),
|
|
166
|
+
...requiredIfType("phone")
|
|
167
|
+
}),
|
|
168
|
+
defineField({
|
|
169
|
+
name: "file",
|
|
170
|
+
type: "file",
|
|
171
|
+
title: "File",
|
|
172
|
+
...visibleIfType("file"),
|
|
173
|
+
...requiredIfType("file")
|
|
174
|
+
}),
|
|
175
|
+
defineField({
|
|
176
|
+
name: "canDownload",
|
|
177
|
+
type: "boolean",
|
|
178
|
+
title: "Downloadable",
|
|
179
|
+
initialValue: !0,
|
|
180
|
+
description: "The file will be downloaded when the link is clicked.",
|
|
181
|
+
options: { layout: "switch" },
|
|
182
|
+
...visibleIfType("file"),
|
|
183
|
+
...requiredIfType("file")
|
|
184
|
+
}),
|
|
185
|
+
defineField({
|
|
186
|
+
name: "internal",
|
|
187
|
+
type: "object",
|
|
188
|
+
title: "Internal Link",
|
|
189
|
+
description: "Select a page and an optional section target.",
|
|
190
|
+
...visibleIfType("internal"),
|
|
191
|
+
...requiredIfType("internal"),
|
|
192
|
+
options: {
|
|
193
|
+
collapsed: !1,
|
|
194
|
+
collapsible: !1
|
|
195
|
+
},
|
|
196
|
+
fields: [
|
|
197
|
+
defineField({
|
|
198
|
+
type: "reference",
|
|
199
|
+
weak: !0,
|
|
200
|
+
name: "link",
|
|
201
|
+
title: "Page",
|
|
202
|
+
// Note: The custom input component will augment this and add more types.
|
|
203
|
+
// We need to keep at least one type here for Sanity to not complain.
|
|
204
|
+
to: config.internalLinkSchemaTypes ?? [{ type: "page" }]
|
|
205
|
+
}),
|
|
206
|
+
defineField({
|
|
207
|
+
type: "string",
|
|
208
|
+
name: "sectionTarget",
|
|
209
|
+
title: "Section Target"
|
|
210
|
+
})
|
|
211
|
+
]
|
|
212
|
+
}),
|
|
213
|
+
defineField({
|
|
214
|
+
name: "customText",
|
|
215
|
+
type: "string",
|
|
216
|
+
title: "Custom text",
|
|
217
|
+
description: "Will take precedence over inferred text."
|
|
218
|
+
}),
|
|
219
|
+
defineField({
|
|
220
|
+
name: "openInNewTab",
|
|
221
|
+
type: "boolean",
|
|
222
|
+
title: "Open in new tab",
|
|
223
|
+
description: "Open the link in a new tab.",
|
|
224
|
+
initialValue: !1,
|
|
225
|
+
options: { layout: "switch" },
|
|
226
|
+
...visibleIfType(["external", "internal"])
|
|
227
|
+
})
|
|
228
|
+
],
|
|
229
|
+
preview: {
|
|
230
|
+
select: {
|
|
231
|
+
type: "type",
|
|
232
|
+
email: "email",
|
|
233
|
+
phone: "phone",
|
|
234
|
+
customText: "customText",
|
|
235
|
+
fileName: "file.asset.originalFilename",
|
|
236
|
+
externalUrl: "external",
|
|
237
|
+
internalUri: "internal.uri.current",
|
|
238
|
+
internalTitle: "internal.title"
|
|
239
|
+
},
|
|
240
|
+
prepare: (props) => buildLinkPreview(props)
|
|
241
|
+
}
|
|
242
|
+
})
|
|
243
|
+
]
|
|
244
|
+
}
|
|
245
|
+
}));
|
|
5
246
|
export {
|
|
6
247
|
buildLinkPreview,
|
|
7
248
|
typeName,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
1
|
+
{"version":3,"file":"index.js","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;\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":["items","value"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"browserslist": "extends @sanity/browserslist-config",
|
|
7
|
-
"version": "0.0.
|
|
7
|
+
"version": "0.0.6",
|
|
8
8
|
"exports": {
|
|
9
9
|
"./package.json": "./package.json",
|
|
10
10
|
".": {
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
"change-case": "^5.4.4"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
|
34
|
+
"@sanity/ui": "^3.1.11",
|
|
34
35
|
"react": "^19",
|
|
35
36
|
"react-dom": "^19",
|
|
36
37
|
"sanity": "^4.17"
|