@sanity/language-filter 0.147.10-next.23 → 1.0.0-v3-studio.1

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/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2016 - 2020 Sanity.io
3
+ Copyright (c) 2022 Sanity.io
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,43 +1,141 @@
1
- ### @sanity/language-filter
1
+ # @sanity/language-filter
2
+
3
+ > **NOTE**
4
+ >
5
+ > This is the **Sanity Studio v3 version** of @sanity/language-filter.
6
+ >
7
+ > For the v2 version, please refer to the [v2 version](https://github.com/sanity-io/sanity/tree/next/packages/%40sanity/language-filter).
8
+
9
+ # Field-level translation filter Plugin for Sanity.io
2
10
 
3
11
  A Sanity plugin that supports filtering localized fields by language
4
12
 
5
- ## Usage
13
+ ![Language Filter UI](https://user-images.githubusercontent.com/9684022/150549913-68f1b7c7-3305-48b4-b72b-41b95e82450c.gif)
6
14
 
7
- ### Install plugin
15
+ ## What this plugin solves
8
16
 
9
- > sanity install @sanity/language-filter
17
+ There are two popular methods of internationalization in Sanity Studio:
10
18
 
11
- ### Add config file
19
+ - **Field-level translation**
20
+ - A single document with many languages of content
21
+ - Achieved by mapping over languages on each field, to create an object
22
+ - Best for documents that have a mix of language-specific and common fields
23
+ - Not recommended for Portable Text
24
+ - **Document-level translation**
25
+ - A unique document version for every language
26
+ - Joined together by references and/or a predictable `_id`
27
+ - Best for documents that have unique, language-specific fields and no common content across languages
28
+ - Best for translating content using Portable Text
12
29
 
13
- In order to know what languages are supported, this plugin needs to be set up with a config file that exports a few options.
14
- This config file needs to implement the part `part:@sanity/language-filter/config`, by adding the following lines to the `parts`-section of your `sanity.json`
30
+ This plugin adds features to the Studio to improve handling **field-level translations**.
15
31
 
16
- ```json
17
- {
18
- "name": "part:@sanity/language-filter/config",
19
- "path": "./parts/languageFilterConfig.js"
20
- }
32
+ - A "Filter Languages" button to show/hide fields in an object of language-specific fields
33
+ - Configuration to set "default" languages which are always visible
34
+
35
+ For **document-level translations** you should use the [@sanity/document-internationalization plugin](https://www.npmjs.com/package/@sanity/document-internationalization).
36
+
37
+
38
+ ## Installation
39
+
40
+ ```
41
+ npm install --save @sanity/language-filter@studio-v3
21
42
  ```
22
43
 
23
- Here's an example `languageFilterConfig.js` file:
44
+ or
45
+
46
+ ```
47
+ yarn add @sanity/language-filter@studio-v3
48
+ ```
49
+
50
+ ## Usage
51
+ Add it as a plugin in sanity.config.ts (or .js), and configure it:
52
+
53
+ ```
54
+ import {createConfig} from 'sanity'
55
+ import {languageFilter} from '@sanity/language-filter'
56
+
57
+ export const createConfig({
58
+ //...
59
+ plugins: [
60
+ languageFilter({
61
+ supportedLanguages: [
62
+ {id: 'nb', title: 'Norwegian (Bokmål)'},
63
+ {id: 'nn', title: 'Norwegian (Nynorsk)'},
64
+ {id: 'en', title: 'English'},
65
+ {id: 'es', title: 'Spanish'},
66
+ {id: 'arb', title: 'Arabic'},
67
+ {id: 'pt', title: 'Portuguese'},
68
+ //...
69
+ ],
70
+ // Select Norwegian (Bokmål) by default
71
+ defaultLanguages: ['nb'],
72
+ // Only show language filter for document type `page` (schemaType.name)
73
+ documentTypes: ['page'],
74
+ filterField: (enclosingType, field, selectedLanguageIds) =>
75
+ !enclosingType.name.startsWith('locale') || selectedLanguageIds.includes(field.name),
76
+ })
77
+ ]
78
+ })
79
+ ```
80
+
81
+ Config properties:
82
+ - `supportedLanguages` is an array of languages with `id` and `title`. If your localized fields are defined using our recommended way described here (https://www.sanity.io/docs/localization), you probably want to share this list of supported languages between this config and your schema.
83
+ - `defaultLanguages` (optional) is an array of strings where each entry must match an `id` from the `supportedLanguages` array. These languages will be listed by default and will not be possible to unselect. If no `defaultLanguages` is configured, all localized fields will be selected by default.
84
+ - `documentTypes` (optional) is an array of strings where each entry must match a `name` from your document schemas. If defined, this property will be used to conditionally show the language filter on specific document schema types. If undefined, the language filter will show on all document schema types.
85
+ - `filterField` (optional) is a function that must return true if the field should be displayed. It is passed the enclosing type (e.g the object type containing the localized fields, the field, and an array of the currently selected language ids.
86
+ This function is called for all fields and fieldsets in objects for documents that have language filter enabled.
87
+ _Default:_ `!enclosingType.name.startsWith('locale') || selectedLanguageIds.includes(field.name)`
88
+
89
+ ## Changes in V3
90
+
91
+ ### filterField
92
+ `filerField` will also be passed any fieldsets in the enclosing object, when present.
93
+
94
+ ### documentTypes
95
+ Language filter can now be enabled/disabled directly from a schema, using `options.languageFilter: boolean`.
96
+ When `documentTypes` is omitted from plugin config, use `options.languageFilter: false` in a document-definition to hide the filter button.
97
+ When `documentTypes` is provided in plugin config, use `options.languageFilter: true` in a document-definition to show the filter button.
98
+
99
+ Example:
24
100
 
25
101
  ```js
26
- export default {
27
- supportedLanguages: [
28
- // If your localized fields are set up using the
29
- {id: 'nb', title: 'Norwegian (Bokmål)'},
30
- {id: 'nn', title: 'Norwegian (Nynorsk)'},
31
- {id: 'en', title: 'English'},
32
- {id: 'es', title: 'Spanish'},
33
- {id: 'arb', title: 'Arabic'},
34
- {id: 'pt', title: 'Portuguese'}
35
- //...
36
- ],
37
- filterField: (enclosingType, field, selectedLanguageIds) =>
38
- !enclosingType.name.startsWith('locale') || selectedLanguageIds.includes(field.name)
102
+ export const myDocumentSchema = {
103
+ type: 'document',
104
+ name: 'my-enabled-language-filter-document',
105
+ /** ... */
106
+ options: {
107
+ // show language filter for this document type, regardless of how documentTypes for the plugin is configured
108
+ languageFilter: true
109
+ }
39
110
  }
40
111
  ```
41
112
 
42
- - `supportedLanguages` is an array of languages with `id` and `title`. If your localized fields are defined using our recommended way described here (https://www.sanity.io/docs/localization), you probably want to share this list of supported languages between this config and your schema.
43
- - `filterField` is a function that must return true if the field should be displayed. It is passed the enclosing type (e.g the object type containing the localized fields, the field, and an array of the currently selected language ids.
113
+ ### State management
114
+ Selected languages are now stored as `langs` url-param state; this allows users to copy paste
115
+ a url in the studio with the currently selected languages preselected.
116
+
117
+ Previously this state was stored in localstorage.
118
+
119
+ ## License
120
+
121
+ MIT © Sanity.io
122
+ See LICENSE
123
+
124
+ ## Develop
125
+
126
+ This plugin uses [@sanity/plugin-kit](https://github.com/sanity-io/plugin-kit)
127
+ with default configuration for build & watch scripts.
128
+
129
+ See [Testing a plugin in Sanity Studio](https://github.com/sanity-io/plugin-kit#testing-a-plugin-in-sanity-studio)
130
+ on how to run this plugin with hotreload in the studio.
131
+
132
+ ### Release new version
133
+
134
+ Run ["CI & Release" workflow](https://github.com/sanity-io/language-filter/actions/workflows/main.yml).
135
+ Make sure to select the main branch and check "Release new version".
136
+
137
+ Semantic release will only release on configured branches, so it is safe to run release on any branch.
138
+
139
+ Note: main branch is configured to release a studio-v3 tagged version of the plugin.
140
+ To make semantic-release happy, the branch "semver-main-placeholder" is regarded as the non-prerelease branch,
141
+ but it is unused. The v2 version lives in the sanity mono-repo.
@@ -0,0 +1,431 @@
1
+ var $k7rGe$reactjsxruntime = require("react/jsx-runtime");
2
+ var $k7rGe$react = require("react");
3
+ var $k7rGe$sanity = require("sanity");
4
+ var $k7rGe$sanityui = require("@sanity/ui");
5
+
6
+ function $parcel$export(e, n, v, s) {
7
+ Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
8
+ }
9
+
10
+ $parcel$export(module.exports, "languageFilter", () => $45e3093e7de8dca2$export$bae498c4212cce68);
11
+ $parcel$export(module.exports, "defaultFilterField", () => $f29012bc04d39674$export$373781be62a9896e);
12
+ $parcel$export(module.exports, "isLanguageFilterEnabled", () => $f29012bc04d39674$export$fe9baa09973dbf22);
13
+ $parcel$export(module.exports, "LanguageFilterObjectInput", () => $a0f4109b367c6ff0$export$7f9ce1f19dc34df5);
14
+ $parcel$export(module.exports, "LanguageFilterMenuButton", () => $4de932c0c6553dd2$export$85fc605f11895007);
15
+ $parcel$export(module.exports, "usePaneLanguages", () => $b7317e67f107ab55$export$cd56401a2a088ead);
16
+
17
+
18
+
19
+
20
+
21
+ const $f29012bc04d39674$export$373781be62a9896e = (enclosingType, field, selectedLanguageIds)=>!enclosingType.name.startsWith("locale") || selectedLanguageIds.includes(field.name);
22
+ function $f29012bc04d39674$export$fe9baa09973dbf22(schemaType, options) {
23
+ const schemaFilter = $f29012bc04d39674$var$isDocument(schemaType) && schemaType?.options?.languageFilter;
24
+ const defaultEnabled = !options.documentTypes;
25
+ return !!(defaultEnabled && schemaFilter !== false || !defaultEnabled && schemaFilter || schemaType && options.documentTypes?.includes(schemaType.name));
26
+ }
27
+ function $f29012bc04d39674$var$isDocument(schemaType) {
28
+ return schemaType?.jsonType === "object" && $f29012bc04d39674$var$getRootType(schemaType).name === "document";
29
+ }
30
+ function $f29012bc04d39674$var$getRootType(schema) {
31
+ if (schema.type) return $f29012bc04d39674$var$getRootType(schema.type);
32
+ return schema;
33
+ }
34
+
35
+
36
+
37
+
38
+ const $bb26db9356030deb$var$LanguageFilterContext = /*#__PURE__*/ (0, $k7rGe$react.createContext)(undefined);
39
+ function $bb26db9356030deb$export$f00537e9911d9516({ options: options , enabled: enabled , children: children }) {
40
+ const value = (0, $k7rGe$react.useMemo)(()=>({
41
+ options: options,
42
+ enabled: enabled
43
+ }), [
44
+ options,
45
+ enabled
46
+ ]);
47
+ return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)($bb26db9356030deb$var$LanguageFilterContext.Provider, {
48
+ value: value,
49
+ children: children
50
+ });
51
+ }
52
+ function $bb26db9356030deb$export$d5c74ca916607f46() {
53
+ const value = (0, $k7rGe$react.useContext)($bb26db9356030deb$var$LanguageFilterContext);
54
+ if (!value) throw new Error("LanguageFilterContext is missing");
55
+ return value;
56
+ }
57
+
58
+
59
+
60
+ const $fe597f02a0bccb26$var$storageKey = "@sanity/plugin/language-filter/selected-languages";
61
+ function $fe597f02a0bccb26$export$f21c039050fb95eb(options) {
62
+ const selectableLangs = $fe597f02a0bccb26$export$76676750ed98bafe(options).map((l)=>l.id);
63
+ let selected = selectableLangs;
64
+ try {
65
+ const persistedValue = window.localStorage.getItem($fe597f02a0bccb26$var$storageKey);
66
+ if (persistedValue) selected = JSON.parse(persistedValue);
67
+ } catch (err) {} // eslint-disable-line no-empty
68
+ // constrain persisted/selected languages to the ones currently supported
69
+ selected = $fe597f02a0bccb26$var$intersection(selected, selectableLangs);
70
+ return selected;
71
+ }
72
+ function $fe597f02a0bccb26$export$833b55f5102c4e70(languageIds) {
73
+ window.localStorage.setItem($fe597f02a0bccb26$var$storageKey, JSON.stringify(languageIds));
74
+ }
75
+ function $fe597f02a0bccb26$var$intersection(array1, array2) {
76
+ return array1.filter((value)=>array2.includes(value));
77
+ }
78
+ function $fe597f02a0bccb26$export$76676750ed98bafe({ supportedLanguages: supportedLanguages , defaultLanguages: defaultLanguages }) {
79
+ return supportedLanguages.filter((lang)=>!defaultLanguages?.includes(lang.id));
80
+ }
81
+ function $fe597f02a0bccb26$export$b484a630b97f9ca3(options) {
82
+ return (0, $k7rGe$react.useState)(()=>$fe597f02a0bccb26$export$f21c039050fb95eb(options));
83
+ }
84
+
85
+
86
+ function $a0f4109b367c6ff0$export$7f9ce1f19dc34df5(props) {
87
+ const { options: options , enabled: enabled } = (0, $bb26db9356030deb$export$d5c74ca916607f46)();
88
+ const { next: next , subscribeSelectedIds: subscribeSelectedIds , ...restProps } = props;
89
+ if (!enabled || !options) return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$reactjsxruntime.Fragment), {
90
+ children: next(restProps)
91
+ });
92
+ return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)($a0f4109b367c6ff0$var$FilteredObjectInput, {
93
+ ...restProps,
94
+ next: next,
95
+ options: options,
96
+ subscribeSelectedIds: subscribeSelectedIds
97
+ });
98
+ }
99
+ function $a0f4109b367c6ff0$var$FilteredObjectInput(props) {
100
+ const { members: membersProp , options: options , schemaType: schemaType , next: next , subscribeSelectedIds: subscribeSelectedIds , ...restProps } = props;
101
+ const [selectedIds, setSelectedIds] = (0, $fe597f02a0bccb26$export$b484a630b97f9ca3)(options);
102
+ (0, $k7rGe$react.useEffect)(()=>{
103
+ const unsubscribe = subscribeSelectedIds(setSelectedIds);
104
+ return ()=>unsubscribe();
105
+ }, [
106
+ subscribeSelectedIds,
107
+ setSelectedIds
108
+ ]);
109
+ const activeLanguages = (0, $k7rGe$react.useMemo)(()=>[
110
+ ...options.defaultLanguages ?? [],
111
+ ...selectedIds
112
+ ], [
113
+ options.defaultLanguages,
114
+ selectedIds
115
+ ]);
116
+ const filterField = options.filterField ?? (0, $f29012bc04d39674$export$373781be62a9896e);
117
+ const members = (0, $k7rGe$react.useMemo)(()=>{
118
+ return membersProp.filter((member)=>member.kind === "field" && filterField(schemaType, member, activeLanguages) || member.kind === "fieldSet" && filterField(schemaType, member.fieldSet, activeLanguages));
119
+ }, [
120
+ schemaType,
121
+ membersProp,
122
+ filterField,
123
+ activeLanguages
124
+ ]);
125
+ return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$reactjsxruntime.Fragment), {
126
+ children: next({
127
+ ...restProps,
128
+ members: members,
129
+ schemaType: schemaType
130
+ })
131
+ });
132
+ }
133
+
134
+
135
+
136
+
137
+
138
+
139
+
140
+ function $b7317e67f107ab55$export$cd56401a2a088ead(props) {
141
+ const { options: options , onSelectedIdsChange: onSelectedIdsChange } = props;
142
+ const { defaultLanguages: defaultLanguages } = options;
143
+ const [selectedIds, setSelectedIds] = (0, $fe597f02a0bccb26$export$b484a630b97f9ca3)(options);
144
+ const selectableLanguages = (0, $k7rGe$react.useMemo)(()=>(0, $fe597f02a0bccb26$export$76676750ed98bafe)(options), [
145
+ options
146
+ ]);
147
+ const updateSelectedIds = (0, $k7rGe$react.useCallback)((ids)=>{
148
+ setSelectedIds(ids);
149
+ (0, $fe597f02a0bccb26$export$833b55f5102c4e70)(ids);
150
+ onSelectedIdsChange(ids);
151
+ }, [
152
+ onSelectedIdsChange,
153
+ setSelectedIds
154
+ ]);
155
+ const selectAll = (0, $k7rGe$react.useCallback)(()=>updateSelectedIds(selectableLanguages.map((l)=>l.id)), [
156
+ updateSelectedIds,
157
+ selectableLanguages
158
+ ]);
159
+ const selectNone = (0, $k7rGe$react.useCallback)(()=>{
160
+ updateSelectedIds([]);
161
+ }, [
162
+ updateSelectedIds
163
+ ]);
164
+ const toggleLanguage = (0, $k7rGe$react.useCallback)((languageId)=>{
165
+ let lang = selectedIds;
166
+ if (lang.includes(languageId)) lang = lang.filter((l)=>l !== languageId);
167
+ else lang = [
168
+ ...lang,
169
+ languageId
170
+ ];
171
+ updateSelectedIds(lang);
172
+ }, [
173
+ updateSelectedIds,
174
+ selectedIds
175
+ ]);
176
+ const activeLanguages = (0, $k7rGe$react.useMemo)(()=>[
177
+ ...defaultLanguages ?? [],
178
+ ...selectedIds
179
+ ], [
180
+ defaultLanguages,
181
+ selectedIds
182
+ ]);
183
+ return {
184
+ activeLanguages: activeLanguages,
185
+ allSelected: selectedIds.length === selectableLanguages.length,
186
+ selectAll: selectAll,
187
+ selectNone: selectNone,
188
+ toggleLanguage: toggleLanguage
189
+ };
190
+ }
191
+
192
+
193
+ function $4de932c0c6553dd2$export$85fc605f11895007(props) {
194
+ const { options: options , onSelectedIdsChange: onSelectedIdsChange } = props;
195
+ const defaultLanguages = options.supportedLanguages.filter((l)=>options.defaultLanguages?.includes(l.id));
196
+ const languageOptions = options.supportedLanguages.filter((l)=>!options.defaultLanguages?.includes(l.id));
197
+ const [open, setOpen] = (0, $k7rGe$react.useState)(false);
198
+ const { activeLanguages: activeLanguages , allSelected: allSelected , selectAll: selectAll , selectNone: selectNone , toggleLanguage: toggleLanguage } = (0, $b7317e67f107ab55$export$cd56401a2a088ead)({
199
+ options: options,
200
+ onSelectedIdsChange: onSelectedIdsChange
201
+ });
202
+ const [button, setButton] = (0, $k7rGe$react.useState)(null);
203
+ const [popover, setPopover] = (0, $k7rGe$react.useState)(null);
204
+ const handleToggleAll = (0, $k7rGe$react.useCallback)((event)=>{
205
+ const checked = event.currentTarget.checked;
206
+ if (checked) selectAll();
207
+ else selectNone();
208
+ }, [
209
+ selectAll,
210
+ selectNone
211
+ ]);
212
+ const handleClick = (0, $k7rGe$react.useCallback)(()=>setOpen((o)=>!o), []);
213
+ const handleClickOutside = (0, $k7rGe$react.useCallback)(()=>setOpen(false), []);
214
+ (0, $k7rGe$sanityui.useClickOutside)(handleClickOutside, [
215
+ button,
216
+ popover
217
+ ]);
218
+ const content = /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsxs)((0, $k7rGe$sanityui.Box), {
219
+ overflow: "auto",
220
+ padding: 1,
221
+ children: [
222
+ defaultLanguages.length > 0 && /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Card), {
223
+ radius: 2,
224
+ children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsxs)((0, $k7rGe$sanityui.Stack), {
225
+ padding: 2,
226
+ space: 3,
227
+ children: [
228
+ /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Box), {
229
+ paddingBottom: 2,
230
+ children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsxs)((0, $k7rGe$sanityui.Text), {
231
+ size: 1,
232
+ weight: "semibold",
233
+ children: [
234
+ "Default language",
235
+ defaultLanguages.length > 1 && /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$reactjsxruntime.Fragment), {
236
+ children: "s"
237
+ })
238
+ ]
239
+ })
240
+ }),
241
+ defaultLanguages.map((l)=>/*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Text), {
242
+ children: l.title
243
+ }, l.id))
244
+ ]
245
+ })
246
+ }),
247
+ /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsxs)((0, $k7rGe$sanityui.Stack), {
248
+ marginTop: 3,
249
+ padding: 2,
250
+ space: 2,
251
+ children: [
252
+ /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Box), {
253
+ paddingBottom: 2,
254
+ children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Text), {
255
+ size: 1,
256
+ weight: "semibold",
257
+ children: "Show translations"
258
+ })
259
+ }),
260
+ /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Card), {
261
+ as: "label",
262
+ children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsxs)((0, $k7rGe$sanityui.Flex), {
263
+ align: "center",
264
+ gap: 2,
265
+ children: [
266
+ /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Checkbox), {
267
+ checked: allSelected,
268
+ name: "_allSelected",
269
+ onChange: handleToggleAll
270
+ }),
271
+ /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Box), {
272
+ flex: 1,
273
+ children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Text), {
274
+ muted: !allSelected,
275
+ weight: "semibold",
276
+ children: "All translations"
277
+ })
278
+ })
279
+ ]
280
+ })
281
+ }),
282
+ languageOptions.map((lang)=>/*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)($4de932c0c6553dd2$var$LanguageFilterOption, {
283
+ id: lang.id,
284
+ onToggle: toggleLanguage,
285
+ selected: activeLanguages.includes(lang.id),
286
+ title: lang.title
287
+ }, lang.id))
288
+ ]
289
+ })
290
+ ]
291
+ });
292
+ const langCount = options.supportedLanguages.length;
293
+ return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Popover), {
294
+ content: content,
295
+ open: open,
296
+ portal: true,
297
+ ref: setPopover,
298
+ children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Button), {
299
+ text: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsxs)((0, $k7rGe$sanityui.Flex), {
300
+ gap: 1,
301
+ children: [
302
+ /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Box), {
303
+ children: "Filter languages:"
304
+ }),
305
+ /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsxs)((0, $k7rGe$sanityui.Flex), {
306
+ gap: 1,
307
+ justify: "space-around",
308
+ children: [
309
+ /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Flex), {
310
+ style: {
311
+ width: `${Math.floor(Math.log10(langCount) + 1)}ch`
312
+ },
313
+ justify: "flex-end",
314
+ children: activeLanguages.length
315
+ }),
316
+ /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Box), {
317
+ children: "/"
318
+ }),
319
+ /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Box), {
320
+ children: langCount
321
+ })
322
+ ]
323
+ })
324
+ ]
325
+ }),
326
+ mode: "bleed",
327
+ onClick: handleClick,
328
+ ref: setButton,
329
+ selected: open
330
+ })
331
+ });
332
+ }
333
+ function $4de932c0c6553dd2$var$LanguageFilterOption(props) {
334
+ const { id: id , onToggle: onToggle , selected: selected , title: title } = props;
335
+ const handleChange = (0, $k7rGe$react.useCallback)(()=>{
336
+ onToggle(id);
337
+ }, [
338
+ id,
339
+ onToggle
340
+ ]);
341
+ return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Card), {
342
+ as: "label",
343
+ children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsxs)((0, $k7rGe$sanityui.Flex), {
344
+ align: "center",
345
+ gap: 2,
346
+ children: [
347
+ /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Checkbox), {
348
+ checked: selected,
349
+ name: `language-${id}`,
350
+ onChange: handleChange
351
+ }),
352
+ /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Box), {
353
+ flex: 1,
354
+ children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Text), {
355
+ muted: !selected,
356
+ children: title
357
+ })
358
+ })
359
+ ]
360
+ })
361
+ });
362
+ }
363
+
364
+
365
+
366
+
367
+ function $a3222324b33f4bdf$export$de189c01fb1f896d() {
368
+ const subs = [];
369
+ const onSelectedIdsChange = (ids)=>{
370
+ subs.forEach((s)=>s(ids));
371
+ };
372
+ const subscribeSelectedIds = (subscription)=>{
373
+ subs.push(subscription);
374
+ return ()=>{
375
+ subs.splice(subs.indexOf(subscription), 1);
376
+ };
377
+ };
378
+ return {
379
+ onSelectedIdsChange: onSelectedIdsChange,
380
+ subscribeSelectedIds: subscribeSelectedIds
381
+ };
382
+ }
383
+
384
+
385
+ const $45e3093e7de8dca2$export$bae498c4212cce68 = (0, $k7rGe$sanity.createPlugin)((options)=>{
386
+ const { onSelectedIdsChange: onSelectedIdsChange , subscribeSelectedIds: subscribeSelectedIds } = (0, $a3222324b33f4bdf$export$de189c01fb1f896d)();
387
+ const RenderLanguageFilter = ()=>{
388
+ return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $4de932c0c6553dd2$export$85fc605f11895007), {
389
+ options: options,
390
+ onSelectedIdsChange: onSelectedIdsChange
391
+ });
392
+ };
393
+ return {
394
+ name: "@sanity/language-filter",
395
+ document: {
396
+ unstable_languageFilter: (prev, { schemaType: schemaType , schema: schema })=>{
397
+ if ((0, $f29012bc04d39674$export$fe9baa09973dbf22)(schema.get(schemaType), options)) return [
398
+ ...prev,
399
+ RenderLanguageFilter
400
+ ];
401
+ return prev;
402
+ }
403
+ },
404
+ form: {
405
+ renderInput (props, next) {
406
+ const enabled = (0, $f29012bc04d39674$export$fe9baa09973dbf22)(props.schemaType, options);
407
+ // will only be considered enabled for document, so this is only done once
408
+ if (enabled) return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $bb26db9356030deb$export$f00537e9911d9516), {
409
+ enabled: enabled,
410
+ options: options,
411
+ children: next(props)
412
+ });
413
+ if (props.schemaType.jsonType === "object") return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $a0f4109b367c6ff0$export$7f9ce1f19dc34df5), {
414
+ ...props,
415
+ next: next,
416
+ subscribeSelectedIds: subscribeSelectedIds
417
+ });
418
+ return undefined;
419
+ }
420
+ }
421
+ };
422
+ });
423
+
424
+
425
+
426
+
427
+
428
+
429
+
430
+
431
+ //# sourceMappingURL=index.js.map