@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 CHANGED
@@ -1,3 +1 @@
1
1
  # @madebywild/sanity-link-field
2
-
3
- Custom link field that supports both internal and external links as well as different link types and options.
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 useFieldMember(members, fieldName) {
21
- return React__namespace.useMemo(
22
- () => members.find((member) => member.kind === "field" && member.name === fieldName),
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
- config,
28
- value,
29
- onChange
33
+ pluginConfig,
34
+ ...props
30
35
  }) {
31
- const linkQuery = config.internalLinkQuery, queryTransformer = config.internalLinkTransformer ?? ((res) => res), 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: [
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
- 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,
44
+ asyncAutocomplete.AsyncAutocomplete,
54
45
  {
55
46
  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);
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
- 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) }) }) })
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
- ) : null
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
- type,
67
+ kind,
68
+ email,
69
+ phone,
70
+ fileName,
85
71
  customText,
86
72
  internalUri,
87
- internalTitle,
88
73
  externalUrl,
89
- email,
90
- phone,
91
- fileName
74
+ internalTitle
92
75
  }) {
93
- switch (type) {
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 wildSanityLinkFieldPlugin = sanity.definePlugin((config) => ({
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(LinkInput, { config, ...props })
131
+ input: (props) => /* @__PURE__ */ jsxRuntime.jsx(FieldInput, { ...props })
143
132
  },
144
133
  fields: [
145
134
  sanity.defineField({
146
- name: "type",
135
+ name: "kind",
147
136
  type: "string",
148
- title: "Link Type",
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: "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" }
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: "external",
151
+ name: LinkKind.external,
162
152
  type: "url",
163
153
  title: "External Link",
164
- ...visibleIfType("external"),
165
- ...requiredIfType("external")
154
+ ...visibleIfKind(LinkKind.external),
155
+ ...requiredIfKind(LinkKind.external)
166
156
  }),
167
157
  sanity.defineField({
168
- name: "email",
158
+ name: LinkKind.email,
169
159
  type: "string",
170
160
  title: "Email",
171
- ...visibleIfType("email"),
172
- ...requiredIfType("email")
161
+ ...visibleIfKind(LinkKind.email),
162
+ ...requiredIfKind(LinkKind.email)
173
163
  }),
174
164
  sanity.defineField({
175
- name: "phone",
165
+ name: LinkKind.phone,
176
166
  type: "string",
177
167
  title: "Phone",
178
- ...visibleIfType("phone"),
179
- ...requiredIfType("phone")
168
+ ...visibleIfKind(LinkKind.phone),
169
+ ...requiredIfKind(LinkKind.phone)
180
170
  }),
181
171
  sanity.defineField({
182
- name: "file",
172
+ name: LinkKind.file,
183
173
  type: "file",
184
174
  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")
175
+ ...visibleIfKind(LinkKind.file),
176
+ ...requiredIfKind(LinkKind.file)
197
177
  }),
198
178
  sanity.defineField({
199
- name: "internal",
179
+ name: LinkKind.internal,
200
180
  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
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: "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" }]
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
- ...visibleIfType(["external", "internal"])
230
+ ...visibleIfKind([LinkKind.external, LinkKind.internal])
240
231
  })
241
232
  ],
242
233
  preview: {
243
234
  select: {
244
- type: "type",
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;
@@ -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 { ObjectDefinition, ObjectOptions, ReferenceTo } from "sanity";
4
- /** @public */
5
- type InternalLinksQueryResult = {
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
- type,
7
+ kind,
8
+ email,
9
+ phone,
10
+ fileName,
37
11
  customText,
38
12
  internalUri,
39
- internalTitle,
40
13
  externalUrl,
41
- email,
42
- phone,
43
- fileName
14
+ internalTitle
44
15
  }: {
45
- type?: string;
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 InternalLinksQueryResult, type PluginConfig, buildLinkPreview, typeName, wildSanityLinkFieldPlugin };
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 { ObjectDefinition, ObjectOptions, ReferenceTo } from "sanity";
4
- /** @public */
5
- type InternalLinksQueryResult = {
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
- type,
7
+ kind,
8
+ email,
9
+ phone,
10
+ fileName,
37
11
  customText,
38
12
  internalUri,
39
- internalTitle,
40
13
  externalUrl,
41
- email,
42
- phone,
43
- fileName
14
+ internalTitle
44
15
  }: {
45
- type?: string;
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 InternalLinksQueryResult, type PluginConfig, buildLinkPreview, typeName, wildSanityLinkFieldPlugin };
63
+ export { type FieldOptions, LinkKind, type PluginConfig, type SectionQueryResult, buildLinkPreview, typeName, wildSanityLinkFieldPlugin };