@sanity/language-filter 4.0.6 → 5.0.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/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2025 Sanity.io
3
+ Copyright (c) 2026 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
@@ -67,7 +67,7 @@ Add it as a plugin in sanity.config.ts (or .js), and configure it:
67
67
  defaultLanguages: ['nb'],
68
68
  // Only show language filter for document type `page` (schemaType.name)
69
69
  documentTypes: ['page'],
70
- filterField: (enclosingType, member, selectedLanguageIds) =>
70
+ filterField: (enclosingType, member, selectedLanguageIds, parentValue) =>
71
71
  !enclosingType.name.startsWith('locale') || selectedLanguageIds.includes(member.name),
72
72
  })
73
73
  ]
@@ -81,9 +81,13 @@ Config properties:
81
81
  -- A function that returns a promise resolving to an array of language objects with `id` and `title`. This is useful if you want to fetch the list of supported languages from an external source. See [Loading languages](#loading-languages) for more details.
82
82
  - `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.
83
83
  - `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.
84
- - `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.
85
- This function is called for all fields and in objects for documents that have language filter enabled.
86
- _Default:_ `!enclosingType.name.startsWith('locale') || selectedLanguageIds.includes(field.name)`
84
+ - `filterField` (optional) is a function that must return true if the field should be displayed. It receives:
85
+ - `enclosingType` (for example, the object type containing localized fields)
86
+ - `field` (the field/fieldset member being rendered)
87
+ - `selectedLanguageIds` (an array of currently selected language ids)
88
+ - `parentValue` (the current enclosing object value; `undefined` when not available)
89
+ This function is called for all fields and fieldsets in objects for documents that have language filter enabled.
90
+ _Default:_ `!enclosingType.name.startsWith('locale') || selectedLanguageIds.includes(field.name)`
87
91
  - `apiVersion` (optional) used for the Sanity Client when asynchronously loading languages.
88
92
 
89
93
  ## Loading languages
@@ -0,0 +1,44 @@
1
+ import { FieldMember, FieldsetState, ObjectSchemaType, SanityClient, SchemaType, definePlugin } from "sanity";
2
+ interface LanguageFilterOptions {
3
+ languageFilter?: boolean;
4
+ }
5
+ interface LanguageFilterSchema extends ObjectSchemaType {
6
+ options?: LanguageFilterOptions;
7
+ }
8
+ type Language = {
9
+ id: Intl.UnicodeBCP47LocaleIdentifier;
10
+ title: string;
11
+ };
12
+ type LanguageCallback = (client: SanityClient, selectedValue: Record<string, unknown>) => Promise<Language[]>;
13
+ type FilterFieldFunction = (enclosingType: ObjectSchemaType, field: FieldMember | FieldsetState, selectedLanguageIds: string[], parentValue: Record<string, unknown> | undefined) => boolean;
14
+ interface LanguageFilterConfig {
15
+ supportedLanguages: Language[] | LanguageCallback;
16
+ defaultLanguages?: string[];
17
+ documentTypes?: string[];
18
+ filterField?: FilterFieldFunction;
19
+ /**
20
+ * https://www.sanity.io/docs/api-versioning
21
+ * @defaultValue '2022-11-27'
22
+ */
23
+ apiVersion?: string;
24
+ }
25
+ interface LanguageFilterConfigProcessed extends LanguageFilterConfig {
26
+ supportedLanguages: Language[];
27
+ }
28
+ declare const defaultFilterField: FilterFieldFunction;
29
+ declare function isLanguageFilterEnabled(schemaType: SchemaType | undefined, options: LanguageFilterConfig): boolean;
30
+ interface LanguageFilterStudioContextProcessed {
31
+ options: Required<LanguageFilterConfigProcessed>;
32
+ }
33
+ interface LanguageFilterStudioContextValue extends LanguageFilterStudioContextProcessed {
34
+ selectedLanguageIds: string[];
35
+ setSelectedLanguageIds: (ids: string[]) => void;
36
+ }
37
+ /**
38
+ * Retrieves plugin options and the currently selected
39
+ * language IDs from anywhere in the Studio
40
+ */
41
+ declare function useLanguageFilterStudioContext(): LanguageFilterStudioContextValue;
42
+ declare const languageFilter: ReturnType<typeof definePlugin<LanguageFilterConfig>>;
43
+ export { type FilterFieldFunction, type Language, type LanguageFilterConfig, type LanguageFilterOptions, type LanguageFilterSchema, defaultFilterField, isLanguageFilterEnabled, languageFilter, useLanguageFilterStudioContext };
44
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/filterField.ts","../src/LanguageFilterStudioContext.tsx","../src/plugin.tsx"],"mappings":";UAEiB,qBAAA;EACf,cAAA;AAAA;AAAA,UAGe,oBAAA,SAA6B,gBAAA;EAC5C,OAAA,GAAU,qBAAA;AAAA;AAAA,KAGA,QAAA;EACV,EAAA,EAAI,IAAA,CAAK,4BAAA;EACT,KAAA;AAAA;AAAA,KAGU,gBAAA,IACV,MAAA,EAAQ,YAAA,EACR,aAAA,EAAe,MAAA,sBACZ,OAAA,CAAQ,QAAA;AAAA,KAED,mBAAA,IACV,aAAA,EAAe,gBAAA,EACf,KAAA,EAAO,WAAA,GAAc,aAAA,EACrB,mBAAA,YACA,WAAA,EAAa,MAAA;AAAA,UAGE,oBAAA;EACf,kBAAA,EAAoB,QAAA,KAAa,gBAAA;EACjC,gBAAA;EACA,aAAA;EACA,WAAA,GAAc,mBAAA;;;;;EAKd,UAAA;AAAA;AAAA,UAGe,6BAAA,SAAsC,oBAAA;EACrD,kBAAA,EAAoB,QAAA;AAAA;AAAA,cCpCT,kBAAA,EAAoB,mBAAA;AAAA,iBAMjB,uBAAA,CACd,UAAA,EAAY,UAAA,cACZ,OAAA,EAAS,oBAAA;AAAA,UCIM,oCAAA;EACf,OAAA,EAAS,QAAA,CAAS,6BAAA;AAAA;AAAA,UAGH,gCAAA,SAAyC,oCAAA;EACxD,mBAAA;EACA,sBAAA,GAAyB,GAAA;AAAA;;;;;iBAoEX,8BAAA,CAAA,GAAkC,gCAAA;AAAA,cCvCrC,cAAA,EAAgB,UAAA,QAAkB,YAAA,CAAa,oBAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,344 @@
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import { c } from "react/compiler-runtime";
3
+ import { useState, createContext, useEffect, useContext } from "react";
4
+ import { useClient, TextWithTone, useFormValue, useSchema, definePlugin, isObjectSchemaType } from "sanity";
5
+ import { EyeClosedIcon, EyeOpenIcon, TranslateIcon, CheckmarkCircleIcon, CircleIcon } from "@sanity/icons";
6
+ import { useClickOutsideEvent, Card, Stack, Box, Popover, Button, Text, Flex, TextInput, Badge } from "@sanity/ui";
7
+ const defaultFilterField = (enclosingType, field, selectedLanguageIds) => !enclosingType.name.startsWith("locale") || selectedLanguageIds.includes(field.name);
8
+ function isLanguageFilterEnabled(schemaType, options) {
9
+ const schemaFilter = (
10
+ // oxlint-disable-next-line no-unsafe-type-assertion -- Checking if schemaType has options.languageFilter
11
+ isDocument(schemaType) && schemaType?.options?.languageFilter
12
+ ), defaultEnabled = !options.documentTypes;
13
+ return !!(defaultEnabled && schemaFilter !== !1 || !defaultEnabled && schemaFilter || schemaType && options.documentTypes?.includes(schemaType.name));
14
+ }
15
+ function isDocument(schemaType) {
16
+ return schemaType?.jsonType === "object" && getRootType(schemaType).name === "document";
17
+ }
18
+ function getRootType(schema) {
19
+ return schema.type ? getRootType(schema.type) : schema;
20
+ }
21
+ const storageKey = "@sanity/plugin/language-filter/selected-languages";
22
+ function getPersistedLanguageIds(options) {
23
+ const selectableLangs = getSelectableLanguages(options).map((l) => l.id);
24
+ let selected = selectableLangs;
25
+ try {
26
+ const persistedValue = window.localStorage.getItem(storageKey);
27
+ persistedValue && (selected = JSON.parse(persistedValue));
28
+ } catch {
29
+ }
30
+ return selected = intersection(selected, selectableLangs), selected;
31
+ }
32
+ function persistLanguageIds(languageIds) {
33
+ window.localStorage.setItem(storageKey, JSON.stringify(languageIds));
34
+ }
35
+ function intersection(array1, array2) {
36
+ return array1.filter((value) => array2.includes(value));
37
+ }
38
+ function getSelectableLanguages({
39
+ supportedLanguages,
40
+ defaultLanguages
41
+ }) {
42
+ return Array.isArray(supportedLanguages) ? supportedLanguages.filter((lang) => !defaultLanguages?.includes(lang.id)) : [];
43
+ }
44
+ function useSelectedLanguageIds(options) {
45
+ const $ = c(2);
46
+ let t0;
47
+ return $[0] !== options ? (t0 = () => [...options.defaultLanguages ?? [], ...getPersistedLanguageIds(options)], $[0] = options, $[1] = t0) : t0 = $[1], useState(t0);
48
+ }
49
+ const defaultContextValue = {
50
+ options: {
51
+ apiVersion: "2022-11-27",
52
+ supportedLanguages: [],
53
+ defaultLanguages: [],
54
+ documentTypes: [],
55
+ filterField: defaultFilterField
56
+ },
57
+ selectedLanguageIds: [],
58
+ setSelectedLanguageIds: () => console.error("LanguageFilterStudioContext not initialized")
59
+ }, LanguageFilterStudioContext = createContext(defaultContextValue);
60
+ function LanguageFilterStudioProvider(props) {
61
+ const $ = c(19);
62
+ let t0;
63
+ $[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t0 = {
64
+ apiVersion: "2023-01-01"
65
+ }, $[0] = t0) : t0 = $[0];
66
+ const client = useClient(t0);
67
+ let t1;
68
+ $[1] !== props.options.supportedLanguages ? (t1 = Array.isArray(props.options.supportedLanguages) ? props.options.supportedLanguages : [], $[1] = props.options.supportedLanguages, $[2] = t1) : t1 = $[2];
69
+ const [languages, setLanguages] = useState(t1);
70
+ let t2, t3;
71
+ $[3] !== client || $[4] !== props.options.supportedLanguages ? (t2 = () => {
72
+ let asyncLanguages = [];
73
+ const getLanguages = async function(supportedLanguagesCallback) {
74
+ asyncLanguages = await supportedLanguagesCallback(client, {}), setLanguages(asyncLanguages);
75
+ };
76
+ Array.isArray(props.options.supportedLanguages) || getLanguages(props.options.supportedLanguages);
77
+ }, t3 = [client, props.options.supportedLanguages], $[3] = client, $[4] = props.options.supportedLanguages, $[5] = t2, $[6] = t3) : (t2 = $[5], t3 = $[6]), useEffect(t2, t3);
78
+ let t4;
79
+ $[7] !== languages || $[8] !== props.options ? (t4 = {
80
+ ...defaultContextValue.options,
81
+ ...props.options,
82
+ supportedLanguages: languages
83
+ }, $[7] = languages, $[8] = props.options, $[9] = t4) : t4 = $[9];
84
+ const options = t4, [selectedLanguageIds, setSelectedLanguageIds] = useSelectedLanguageIds(options);
85
+ let t5;
86
+ $[10] !== options || $[11] !== selectedLanguageIds || $[12] !== setSelectedLanguageIds ? (t5 = {
87
+ options,
88
+ selectedLanguageIds,
89
+ setSelectedLanguageIds
90
+ }, $[10] = options, $[11] = selectedLanguageIds, $[12] = setSelectedLanguageIds, $[13] = t5) : t5 = $[13];
91
+ const value = t5;
92
+ let t6;
93
+ $[14] !== props ? (t6 = props.renderDefault(props), $[14] = props, $[15] = t6) : t6 = $[15];
94
+ let t7;
95
+ return $[16] !== t6 || $[17] !== value ? (t7 = /* @__PURE__ */ jsx(LanguageFilterStudioContext.Provider, { value, children: t6 }), $[16] = t6, $[17] = value, $[18] = t7) : t7 = $[18], t7;
96
+ }
97
+ function useLanguageFilterStudioContext() {
98
+ return useContext(LanguageFilterStudioContext);
99
+ }
100
+ const unique = (arr) => Array.from(new Set(arr));
101
+ function usePaneLanguages() {
102
+ const $ = c(25), {
103
+ selectedLanguageIds,
104
+ setSelectedLanguageIds,
105
+ options
106
+ } = useLanguageFilterStudioContext(), {
107
+ defaultLanguages: t0
108
+ } = options;
109
+ let t1;
110
+ $[0] !== t0 ? (t1 = t0 === void 0 ? [] : t0, $[0] = t0, $[1] = t1) : t1 = $[1];
111
+ const defaultLanguages = t1;
112
+ let t2;
113
+ $[2] !== options ? (t2 = getSelectableLanguages(options), $[2] = options, $[3] = t2) : t2 = $[3];
114
+ const selectableLanguages = t2;
115
+ let t3;
116
+ $[4] !== defaultLanguages || $[5] !== setSelectedLanguageIds ? (t3 = (ids) => {
117
+ setSelectedLanguageIds(unique([...defaultLanguages, ...ids])), persistLanguageIds(unique([...defaultLanguages, ...ids]));
118
+ }, $[4] = defaultLanguages, $[5] = setSelectedLanguageIds, $[6] = t3) : t3 = $[6];
119
+ const updateSelectedIds = t3;
120
+ let t4;
121
+ $[7] !== selectableLanguages || $[8] !== updateSelectedIds ? (t4 = () => updateSelectedIds(selectableLanguages.map(_temp$1)), $[7] = selectableLanguages, $[8] = updateSelectedIds, $[9] = t4) : t4 = $[9];
122
+ const selectAll = t4;
123
+ let t5;
124
+ $[10] !== defaultLanguages || $[11] !== updateSelectedIds ? (t5 = () => {
125
+ updateSelectedIds(defaultLanguages);
126
+ }, $[10] = defaultLanguages, $[11] = updateSelectedIds, $[12] = t5) : t5 = $[12];
127
+ const selectNone = t5;
128
+ let t6;
129
+ $[13] !== selectedLanguageIds || $[14] !== updateSelectedIds ? (t6 = (languageId) => {
130
+ let lang = selectedLanguageIds;
131
+ lang.includes(languageId) ? lang = lang.filter((l_0) => l_0 !== languageId) : lang = unique([...lang, languageId]), updateSelectedIds(lang);
132
+ }, $[13] = selectedLanguageIds, $[14] = updateSelectedIds, $[15] = t6) : t6 = $[15];
133
+ const toggleLanguage = t6;
134
+ let t7;
135
+ $[16] !== defaultLanguages || $[17] !== selectedLanguageIds ? (t7 = unique([...defaultLanguages ?? [], ...selectedLanguageIds]), $[16] = defaultLanguages, $[17] = selectedLanguageIds, $[18] = t7) : t7 = $[18];
136
+ const activeLanguages = t7, t8 = selectedLanguageIds.length === selectableLanguages.length + defaultLanguages.length;
137
+ let t9;
138
+ return $[19] !== activeLanguages || $[20] !== selectAll || $[21] !== selectNone || $[22] !== t8 || $[23] !== toggleLanguage ? (t9 = {
139
+ activeLanguages,
140
+ allSelected: t8,
141
+ selectAll,
142
+ selectNone,
143
+ toggleLanguage
144
+ }, $[19] = activeLanguages, $[20] = selectAll, $[21] = selectNone, $[22] = t8, $[23] = toggleLanguage, $[24] = t9) : t9 = $[24], t9;
145
+ }
146
+ function _temp$1(l) {
147
+ return l.id;
148
+ }
149
+ function LanguageFilterMenuButton() {
150
+ const $ = c(54), {
151
+ options
152
+ } = useLanguageFilterStudioContext();
153
+ let t0;
154
+ $[0] !== options.defaultLanguages ? (t0 = (l) => options.defaultLanguages?.includes(l.id), $[0] = options.defaultLanguages, $[1] = t0) : t0 = $[1];
155
+ const defaultLanguages = options.supportedLanguages.filter(t0);
156
+ let t1;
157
+ $[2] !== options.defaultLanguages ? (t1 = (l_0) => !options.defaultLanguages?.includes(l_0.id), $[2] = options.defaultLanguages, $[3] = t1) : t1 = $[3];
158
+ const languageOptions = options.supportedLanguages.filter(t1), [open, setOpen] = useState(!1), {
159
+ activeLanguages,
160
+ allSelected,
161
+ selectAll,
162
+ selectNone,
163
+ toggleLanguage
164
+ } = usePaneLanguages(), [button, setButton] = useState(null), [popover, setPopover] = useState(null);
165
+ let t2;
166
+ $[4] !== selectAll || $[5] !== selectNone ? (t2 = (event) => {
167
+ event.currentTarget.value === "ALL" ? selectAll() : selectNone();
168
+ }, $[4] = selectAll, $[5] = selectNone, $[6] = t2) : t2 = $[6];
169
+ const handleToggleAll = t2;
170
+ let t3;
171
+ $[7] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t3 = () => setOpen(_temp), $[7] = t3) : t3 = $[7];
172
+ const handleClick = t3;
173
+ let t4;
174
+ $[8] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t4 = () => setOpen(!1), $[8] = t4) : t4 = $[8];
175
+ const handleClickOutside = t4;
176
+ let t5;
177
+ $[9] !== button || $[10] !== popover ? (t5 = () => [button, popover].filter(_temp2), $[9] = button, $[10] = popover, $[11] = t5) : t5 = $[11], useClickOutsideEvent(handleClickOutside, t5);
178
+ const langCount = options.supportedLanguages.length, [query, setQuery] = useState("");
179
+ let t6;
180
+ $[12] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t6 = (event_0) => {
181
+ event_0.currentTarget.value ? setQuery(event_0.currentTarget.value) : setQuery("");
182
+ }, $[12] = t6) : t6 = $[12];
183
+ const handleQuery = t6, showSearch = langCount > 4, T0 = Box, t7 = "auto";
184
+ let t8;
185
+ $[13] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t8 = {
186
+ maxHeight: "calc(100vh - 200px)"
187
+ }, $[13] = t8) : t8 = $[13];
188
+ const T1 = Stack, t9 = 1, t10 = 1, t11 = defaultLanguages.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
189
+ defaultLanguages.map(_temp3),
190
+ /* @__PURE__ */ jsx(Card, { borderTop: !0 })
191
+ ] }), t12 = allSelected ? "NONE" : "ALL", t13 = !!query;
192
+ let t14;
193
+ $[14] !== allSelected ? (t14 = /* @__PURE__ */ jsx(Text, { size: 2, children: allSelected ? /* @__PURE__ */ jsx(TextWithTone, { tone: "primary", children: /* @__PURE__ */ jsx(EyeClosedIcon, {}) }) : /* @__PURE__ */ jsx(EyeOpenIcon, {}) }), $[14] = allSelected, $[15] = t14) : t14 = $[15];
194
+ const t15 = allSelected ? "Hide all" : "Show all";
195
+ let t16;
196
+ $[16] !== t15 ? (t16 = /* @__PURE__ */ jsx(Box, { flex: 1, children: /* @__PURE__ */ jsx(Text, { children: t15 }) }), $[16] = t15, $[17] = t16) : t16 = $[17];
197
+ let t17;
198
+ $[18] !== t14 || $[19] !== t16 ? (t17 = /* @__PURE__ */ jsxs(Flex, { gap: 3, align: "center", children: [
199
+ t14,
200
+ t16
201
+ ] }), $[18] = t14, $[19] = t16, $[20] = t17) : t17 = $[20];
202
+ let t18;
203
+ $[21] !== handleToggleAll || $[22] !== t12 || $[23] !== t13 || $[24] !== t17 ? (t18 = /* @__PURE__ */ jsx(Button, { mode: "bleed", onClick: handleToggleAll, justify: "flex-start", value: t12, disabled: t13, children: t17 }), $[21] = handleToggleAll, $[22] = t12, $[23] = t13, $[24] = t17, $[25] = t18) : t18 = $[25];
204
+ let t19;
205
+ $[26] !== query || $[27] !== showSearch ? (t19 = showSearch ? /* @__PURE__ */ jsx(TextInput, { onChange: handleQuery, value: query, placeholder: "Filter languages" }) : /* @__PURE__ */ jsx(Card, { borderTop: !0 }), $[26] = query, $[27] = showSearch, $[28] = t19) : t19 = $[28];
206
+ let t20;
207
+ $[29] !== query ? (t20 = (language) => query ? language.title.toLowerCase().includes(query.toLowerCase()) : !0, $[29] = query, $[30] = t20) : t20 = $[30];
208
+ let t21;
209
+ $[31] !== activeLanguages || $[32] !== toggleLanguage ? (t21 = (lang) => /* @__PURE__ */ jsx(LanguageFilterOption, { id: lang.id, onToggle: toggleLanguage, selected: activeLanguages.includes(lang.id), title: lang.title }, lang.id), $[31] = activeLanguages, $[32] = toggleLanguage, $[33] = t21) : t21 = $[33];
210
+ const t22 = languageOptions.filter(t20).map(t21);
211
+ let t23;
212
+ $[34] !== T1 || $[35] !== t11 || $[36] !== t18 || $[37] !== t19 || $[38] !== t22 ? (t23 = /* @__PURE__ */ jsxs(T1, { padding: t9, space: t10, children: [
213
+ t11,
214
+ t18,
215
+ t19,
216
+ t22
217
+ ] }), $[34] = T1, $[35] = t11, $[36] = t18, $[37] = t19, $[38] = t22, $[39] = t23) : t23 = $[39];
218
+ let t24;
219
+ $[40] !== T0 || $[41] !== t23 || $[42] !== t8 ? (t24 = /* @__PURE__ */ jsx(T0, { overflow: t7, style: t8, children: t23 }), $[40] = T0, $[41] = t23, $[42] = t8, $[43] = t24) : t24 = $[43];
220
+ const content = t24, buttonText = activeLanguages.length === langCount ? "Showing all" : `Showing ${activeLanguages.length} / ${langCount}`;
221
+ let t25;
222
+ $[44] !== buttonText || $[45] !== handleClick || $[46] !== open || $[47] !== setButton ? (t25 = /* @__PURE__ */ jsx(Button, { text: buttonText, icon: TranslateIcon, mode: "bleed", onClick: handleClick, ref: setButton, selected: open }), $[44] = buttonText, $[45] = handleClick, $[46] = open, $[47] = setButton, $[48] = t25) : t25 = $[48];
223
+ let t26;
224
+ return $[49] !== content || $[50] !== open || $[51] !== setPopover || $[52] !== t25 ? (t26 = /* @__PURE__ */ jsx(Popover, { animate: !0, content, open, portal: !0, ref: setPopover, children: t25 }), $[49] = content, $[50] = open, $[51] = setPopover, $[52] = t25, $[53] = t26) : t26 = $[53], t26;
225
+ }
226
+ function _temp3(l_1) {
227
+ return /* @__PURE__ */ jsx(LanguageFilterOption, { id: l_1.id, title: l_1.title, selected: !0 }, l_1.id);
228
+ }
229
+ function _temp2(el) {
230
+ return el !== null;
231
+ }
232
+ function _temp(o) {
233
+ return !o;
234
+ }
235
+ function LanguageFilterOption(props) {
236
+ const $ = c(18), {
237
+ id,
238
+ onToggle,
239
+ selected,
240
+ title
241
+ } = props;
242
+ let t0;
243
+ $[0] !== id || $[1] !== onToggle ? (t0 = () => {
244
+ onToggle && onToggle(id);
245
+ }, $[0] = id, $[1] = onToggle, $[2] = t0) : t0 = $[2];
246
+ const handleChange = t0, disabled = !onToggle;
247
+ let t1;
248
+ $[3] !== disabled || $[4] !== selected ? (t1 = /* @__PURE__ */ jsx(Text, { size: 2, children: selected ? /* @__PURE__ */ jsx(TextWithTone, { tone: disabled ? "default" : "positive", children: /* @__PURE__ */ jsx(CheckmarkCircleIcon, {}) }) : /* @__PURE__ */ jsx(CircleIcon, {}) }), $[3] = disabled, $[4] = selected, $[5] = t1) : t1 = $[5];
249
+ let t2;
250
+ $[6] !== title ? (t2 = /* @__PURE__ */ jsx(Box, { flex: 1, children: /* @__PURE__ */ jsx(Text, { children: title }) }), $[6] = title, $[7] = t2) : t2 = $[7];
251
+ let t3;
252
+ $[8] !== id ? (t3 = /* @__PURE__ */ jsx(Badge, { children: id }), $[8] = id, $[9] = t3) : t3 = $[9];
253
+ let t4;
254
+ $[10] !== t1 || $[11] !== t2 || $[12] !== t3 ? (t4 = /* @__PURE__ */ jsxs(Flex, { gap: 3, align: "center", children: [
255
+ t1,
256
+ t2,
257
+ t3
258
+ ] }), $[10] = t1, $[11] = t2, $[12] = t3, $[13] = t4) : t4 = $[13];
259
+ let t5;
260
+ return $[14] !== disabled || $[15] !== handleChange || $[16] !== t4 ? (t5 = /* @__PURE__ */ jsx(Button, { mode: "bleed", onClick: handleChange, justify: "flex-start", disabled, children: t4 }), $[14] = disabled, $[15] = handleChange, $[16] = t4, $[17] = t5) : t5 = $[17], t5;
261
+ }
262
+ function FilteredObjectWrapper(props) {
263
+ const $ = c(8), {
264
+ options
265
+ } = useLanguageFilterStudioContext();
266
+ let t0;
267
+ $[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t0 = ["_type"], $[0] = t0) : t0 = $[0];
268
+ const documentType = useFormValue(t0), schema = useSchema();
269
+ let t1;
270
+ $[1] !== documentType || $[2] !== options || $[3] !== schema ? (t1 = isLanguageFilterEnabled(schema.get(documentType), options), $[1] = documentType, $[2] = options, $[3] = schema, $[4] = t1) : t1 = $[4];
271
+ const languageFilterEnabled = t1;
272
+ let t2;
273
+ return $[5] !== languageFilterEnabled || $[6] !== props ? (t2 = languageFilterEnabled ? /* @__PURE__ */ jsx(FilteredObjectInput, { ...props }) : props.renderDefault(props), $[5] = languageFilterEnabled, $[6] = props, $[7] = t2) : t2 = $[7], t2;
274
+ }
275
+ function FilteredObjectInput(props) {
276
+ const $ = c(16), {
277
+ members: membersProp,
278
+ schemaType,
279
+ renderDefault,
280
+ ...restProps
281
+ } = props, {
282
+ selectedLanguageIds,
283
+ options
284
+ } = useLanguageFilterStudioContext(), {
285
+ filterField
286
+ } = options, parentValue = props.value;
287
+ let t0;
288
+ if ($[0] !== filterField || $[1] !== membersProp || $[2] !== parentValue || $[3] !== schemaType || $[4] !== selectedLanguageIds) {
289
+ let t1;
290
+ $[6] !== filterField || $[7] !== parentValue || $[8] !== schemaType || $[9] !== selectedLanguageIds ? (t1 = (member) => member.kind === "field" && filterField(schemaType, member, selectedLanguageIds, parentValue) || member.kind === "fieldSet" || member.kind === "error", $[6] = filterField, $[7] = parentValue, $[8] = schemaType, $[9] = selectedLanguageIds, $[10] = t1) : t1 = $[10];
291
+ let t2;
292
+ $[11] !== filterField || $[12] !== parentValue || $[13] !== schemaType || $[14] !== selectedLanguageIds ? (t2 = (member_0) => member_0.kind === "fieldSet" ? Object.assign({}, member_0, {
293
+ fieldSet: Object.assign({}, member_0.fieldSet, {
294
+ members: member_0.fieldSet.members.filter((fieldsetMember) => fieldsetMember.kind === "field" && filterField(schemaType, fieldsetMember, selectedLanguageIds, parentValue))
295
+ })
296
+ }) : member_0, $[11] = filterField, $[12] = parentValue, $[13] = schemaType, $[14] = selectedLanguageIds, $[15] = t2) : t2 = $[15], t0 = membersProp.filter(t1).map(t2), $[0] = filterField, $[1] = membersProp, $[2] = parentValue, $[3] = schemaType, $[4] = selectedLanguageIds, $[5] = t0;
297
+ } else
298
+ t0 = $[5];
299
+ return renderDefault({
300
+ ...restProps,
301
+ members: t0,
302
+ schemaType,
303
+ renderDefault
304
+ });
305
+ }
306
+ const RenderLanguageFilter = () => {
307
+ const $ = c(1);
308
+ let t0;
309
+ return $[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t0 = /* @__PURE__ */ jsx(LanguageFilterMenuButton, {}), $[0] = t0) : t0 = $[0], t0;
310
+ }, languageFilter = definePlugin((options) => {
311
+ const pluginOptions = {
312
+ ...defaultContextValue.options,
313
+ ...options
314
+ };
315
+ return {
316
+ name: "@sanity/language-filter",
317
+ studio: {
318
+ components: {
319
+ layout: (props) => LanguageFilterStudioProvider({
320
+ ...props,
321
+ options: pluginOptions
322
+ })
323
+ }
324
+ },
325
+ document: {
326
+ unstable_languageFilter: (prev, {
327
+ schemaType,
328
+ schema
329
+ }) => isLanguageFilterEnabled(schema.get(schemaType), options) ? [...prev, RenderLanguageFilter] : prev
330
+ },
331
+ form: {
332
+ components: {
333
+ input: (props) => props.id !== "root" && isObjectSchemaType(props.schemaType) ? FilteredObjectWrapper(props) : props.renderDefault(props)
334
+ }
335
+ }
336
+ };
337
+ });
338
+ export {
339
+ defaultFilterField,
340
+ isLanguageFilterEnabled,
341
+ languageFilter,
342
+ useLanguageFilterStudioContext
343
+ };
344
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/filterField.ts","../src/useSelectedLanguageIds.ts","../src/LanguageFilterStudioContext.tsx","../src/usePaneLanguages.ts","../src/LanguageFilterMenuButton.tsx","../src/LanguageFilterObjectInput.tsx","../src/plugin.tsx"],"sourcesContent":["import type {SchemaType} from 'sanity'\n\nimport type {FilterFieldFunction, LanguageFilterConfig, LanguageFilterSchema} from './types'\n\nexport const defaultFilterField: FilterFieldFunction = (\n enclosingType,\n field,\n selectedLanguageIds,\n) => !enclosingType.name.startsWith('locale') || selectedLanguageIds.includes(field.name)\n\nexport function isLanguageFilterEnabled(\n schemaType: SchemaType | undefined,\n options: LanguageFilterConfig,\n): boolean {\n const schemaFilter =\n // oxlint-disable-next-line no-unsafe-type-assertion -- Checking if schemaType has options.languageFilter\n isDocument(schemaType) && (schemaType as LanguageFilterSchema)?.options?.languageFilter\n const defaultEnabled = !options.documentTypes\n\n return !!(\n (defaultEnabled && schemaFilter !== false) ||\n (!defaultEnabled && schemaFilter) ||\n (schemaType && options.documentTypes?.includes(schemaType.name))\n )\n}\n\nfunction isDocument(schemaType?: SchemaType) {\n return schemaType?.jsonType === 'object' && getRootType(schemaType).name === 'document'\n}\n\nfunction getRootType(schema: SchemaType): SchemaType {\n if (schema.type) {\n return getRootType(schema.type)\n }\n return schema\n}\n","import {useState} from 'react'\n\nimport type {Language, LanguageFilterConfig} from './types'\nconst storageKey = '@sanity/plugin/language-filter/selected-languages'\n\nfunction getPersistedLanguageIds(options: LanguageFilterConfig): string[] {\n const selectableLangs = getSelectableLanguages(options).map((l) => l.id)\n\n let selected: string[] = selectableLangs\n try {\n const persistedValue = window.localStorage.getItem(storageKey)\n if (persistedValue) {\n selected = JSON.parse(persistedValue)\n }\n } catch {}\n\n // constrain persisted/selected languages to the ones currently supported\n selected = intersection(selected, selectableLangs)\n return selected\n}\n\nexport function persistLanguageIds(languageIds: string[]): void {\n window.localStorage.setItem(storageKey, JSON.stringify(languageIds))\n}\n\nfunction intersection(array1: string[], array2: string[]) {\n return array1.filter((value) => array2.includes(value))\n}\n\nexport function getSelectableLanguages({\n supportedLanguages,\n defaultLanguages,\n}: LanguageFilterConfig): Language[] {\n return Array.isArray(supportedLanguages)\n ? supportedLanguages.filter((lang) => !defaultLanguages?.includes(lang.id))\n : []\n}\n\nexport function useSelectedLanguageIds(\n options: LanguageFilterConfig,\n): [string[], (ids: string[]) => void] {\n return useState(() => [...(options.defaultLanguages ?? []), ...getPersistedLanguageIds(options)])\n}\n","import {createContext, useContext, useEffect, useMemo, useState} from 'react'\nimport {type LayoutProps, useClient} from 'sanity'\n\nimport {defaultFilterField} from './filterField'\nimport type {\n Language,\n LanguageCallback,\n LanguageFilterConfig,\n LanguageFilterConfigProcessed,\n} from './types'\nimport {useSelectedLanguageIds} from './useSelectedLanguageIds'\n\nexport interface LanguageFilterStudioContextProps {\n options: Required<LanguageFilterConfig>\n}\n\nexport interface LanguageFilterStudioContextProcessed {\n options: Required<LanguageFilterConfigProcessed>\n}\n\nexport interface LanguageFilterStudioContextValue extends LanguageFilterStudioContextProcessed {\n selectedLanguageIds: string[]\n setSelectedLanguageIds: (ids: string[]) => void\n}\n\nexport const defaultContextValue: LanguageFilterStudioContextValue = {\n options: {\n apiVersion: '2022-11-27',\n supportedLanguages: [],\n defaultLanguages: [],\n documentTypes: [],\n filterField: defaultFilterField,\n },\n selectedLanguageIds: [],\n setSelectedLanguageIds: () => console.error('LanguageFilterStudioContext not initialized'),\n}\n\nconst LanguageFilterStudioContext =\n createContext<LanguageFilterStudioContextValue>(defaultContextValue)\n\n/**\n * This is a separate Provider from the Context that wraps the document pane\n * but it used to listen to changes to the selected language IDs inside it\n * and provide them to a Studio-wide context\n */\nexport function LanguageFilterStudioProvider(\n props: LayoutProps & LanguageFilterStudioContextProps,\n): React.JSX.Element {\n const client = useClient({apiVersion: '2023-01-01'})\n const [languages, setLanguages] = useState<Language[]>(\n Array.isArray(props.options.supportedLanguages) ? props.options.supportedLanguages : [],\n )\n useEffect(() => {\n let asyncLanguages: Language[] = []\n\n async function getLanguages(supportedLanguagesCallback: LanguageCallback) {\n asyncLanguages = await supportedLanguagesCallback(client, {})\n setLanguages(asyncLanguages)\n }\n\n if (!Array.isArray(props.options.supportedLanguages)) {\n void getLanguages(props.options.supportedLanguages)\n }\n }, [client, props.options.supportedLanguages])\n\n const options = useMemo<Required<LanguageFilterConfigProcessed>>(() => {\n return {\n ...defaultContextValue.options,\n ...props.options,\n supportedLanguages: languages,\n }\n }, [props.options, languages])\n\n const [selectedLanguageIds, setSelectedLanguageIds] = useSelectedLanguageIds(options)\n const value = useMemo(\n () => ({options, selectedLanguageIds, setSelectedLanguageIds}),\n [options, selectedLanguageIds, setSelectedLanguageIds],\n )\n\n return (\n <LanguageFilterStudioContext.Provider value={value}>\n {props.renderDefault(props)}\n </LanguageFilterStudioContext.Provider>\n )\n}\n\n/**\n * Retrieves plugin options and the currently selected\n * language IDs from anywhere in the Studio\n */\nexport function useLanguageFilterStudioContext(): LanguageFilterStudioContextValue {\n return useContext(LanguageFilterStudioContext)\n}\n","import {useCallback, useMemo} from 'react'\n\nimport {useLanguageFilterStudioContext} from './LanguageFilterStudioContext'\nimport {getSelectableLanguages, persistLanguageIds} from './useSelectedLanguageIds'\n\nconst unique = (arr: string[]) => Array.from(new Set(arr))\n\nexport function usePaneLanguages(): {\n activeLanguages: string[]\n allSelected: boolean\n selectAll: () => void\n selectNone: () => void\n toggleLanguage: (languageId: string) => void\n} {\n const {selectedLanguageIds, setSelectedLanguageIds, options} = useLanguageFilterStudioContext()\n const {defaultLanguages = []} = options\n\n const selectableLanguages = useMemo(() => getSelectableLanguages(options), [options])\n\n const updateSelectedIds = useCallback(\n (ids: string[]) => {\n setSelectedLanguageIds(unique([...defaultLanguages, ...ids]))\n persistLanguageIds(unique([...defaultLanguages, ...ids]))\n },\n [defaultLanguages, setSelectedLanguageIds],\n )\n\n const selectAll = useCallback(\n () => updateSelectedIds(selectableLanguages.map((l) => l.id)),\n [updateSelectedIds, selectableLanguages],\n )\n\n const selectNone = useCallback(() => {\n updateSelectedIds(defaultLanguages)\n }, [defaultLanguages, updateSelectedIds])\n\n const toggleLanguage = useCallback(\n (languageId: string) => {\n let lang = selectedLanguageIds\n\n if (lang.includes(languageId)) {\n lang = lang.filter((l) => l !== languageId)\n } else {\n lang = unique([...lang, languageId])\n }\n\n updateSelectedIds(lang)\n },\n [updateSelectedIds, selectedLanguageIds],\n )\n\n const activeLanguages = useMemo(\n () => unique([...(defaultLanguages ?? []), ...selectedLanguageIds]),\n [defaultLanguages, selectedLanguageIds],\n )\n\n return {\n activeLanguages,\n allSelected:\n selectedLanguageIds.length === selectableLanguages.length + defaultLanguages.length,\n selectAll,\n selectNone,\n toggleLanguage,\n }\n}\n","import {\n CheckmarkCircleIcon,\n CircleIcon,\n EyeClosedIcon,\n EyeOpenIcon,\n TranslateIcon,\n} from '@sanity/icons'\nimport {\n Badge,\n Box,\n Button,\n Card,\n Flex,\n Popover,\n Stack,\n Text,\n TextInput,\n useClickOutsideEvent,\n} from '@sanity/ui'\nimport {type MouseEventHandler, useCallback, useState} from 'react'\nimport {TextWithTone} from 'sanity'\n\nimport {useLanguageFilterStudioContext} from './LanguageFilterStudioContext'\nimport {usePaneLanguages} from './usePaneLanguages'\n\nexport function LanguageFilterMenuButton(): React.JSX.Element {\n const {options} = useLanguageFilterStudioContext()\n\n const defaultLanguages = options.supportedLanguages.filter((l) =>\n options.defaultLanguages?.includes(l.id),\n )\n\n const languageOptions = options.supportedLanguages.filter(\n (l) => !options.defaultLanguages?.includes(l.id),\n )\n const [open, setOpen] = useState(false)\n const {activeLanguages, allSelected, selectAll, selectNone, toggleLanguage} = usePaneLanguages()\n const [button, setButton] = useState<HTMLElement | null>(null)\n const [popover, setPopover] = useState<HTMLElement | null>(null)\n\n const handleToggleAll: MouseEventHandler<HTMLButtonElement> = useCallback(\n (event) => {\n const checked = event.currentTarget.value === 'ALL'\n\n if (checked) {\n selectAll()\n } else {\n selectNone()\n }\n },\n [selectAll, selectNone],\n )\n\n const handleClick = useCallback(() => setOpen((o) => !o), [])\n\n const handleClickOutside = useCallback(() => setOpen(false), [])\n\n useClickOutsideEvent(\n handleClickOutside,\n useCallback(\n () => [button, popover].filter((el): el is HTMLElement => el !== null),\n [button, popover],\n ),\n )\n\n const langCount = options.supportedLanguages.length\n\n // Search filter query\n const [query, setQuery] = useState('')\n const handleQuery = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n if (event.currentTarget.value) {\n setQuery(event.currentTarget.value)\n } else {\n setQuery('')\n }\n }, [])\n\n const showSearch = langCount > 4\n\n const content = (\n <Box overflow=\"auto\" style={{maxHeight: 'calc(100vh - 200px)'}}>\n <Stack padding={1} space={1}>\n {defaultLanguages.length > 0 && (\n <>\n {defaultLanguages.map((l) => (\n <LanguageFilterOption key={l.id} id={l.id} title={l.title} selected />\n ))}\n <Card borderTop />\n </>\n )}\n\n <Button\n mode=\"bleed\"\n onClick={handleToggleAll}\n justify=\"flex-start\"\n value={allSelected ? 'NONE' : 'ALL'}\n disabled={!!query}\n >\n <Flex gap={3} align=\"center\">\n <Text size={2}>\n {allSelected ? (\n <TextWithTone tone=\"primary\">\n <EyeClosedIcon />\n </TextWithTone>\n ) : (\n <EyeOpenIcon />\n )}\n </Text>\n <Box flex={1}>\n <Text>{allSelected ? 'Hide all' : 'Show all'}</Text>\n </Box>\n </Flex>\n </Button>\n\n {showSearch ? (\n <TextInput onChange={handleQuery} value={query} placeholder=\"Filter languages\" />\n ) : (\n <Card borderTop />\n )}\n\n {languageOptions\n .filter((language) => {\n if (query) {\n return language.title.toLowerCase().includes(query.toLowerCase())\n }\n return true\n })\n .map((lang) => (\n <LanguageFilterOption\n id={lang.id}\n key={lang.id}\n onToggle={toggleLanguage}\n selected={activeLanguages.includes(lang.id)}\n title={lang.title}\n />\n ))}\n </Stack>\n </Box>\n )\n\n const buttonText =\n activeLanguages.length === langCount\n ? 'Showing all'\n : `Showing ${activeLanguages.length} / ${langCount}`\n return (\n <Popover animate content={content} open={open} portal ref={setPopover}>\n <Button\n text={buttonText}\n icon={TranslateIcon}\n mode=\"bleed\"\n onClick={handleClick}\n ref={setButton}\n selected={open}\n />\n </Popover>\n )\n}\n\nfunction LanguageFilterOption(props: {\n id: string\n selected: boolean\n title: string\n onToggle?: (id: string) => void\n}) {\n const {id, onToggle, selected, title} = props\n\n const handleChange = useCallback(() => {\n if (onToggle) {\n onToggle(id)\n }\n }, [id, onToggle])\n\n const disabled = !onToggle\n\n return (\n <Button mode=\"bleed\" onClick={handleChange} justify=\"flex-start\" disabled={disabled}>\n <Flex gap={3} align=\"center\">\n <Text size={2}>\n {selected ? (\n <TextWithTone tone={disabled ? 'default' : 'positive'}>\n <CheckmarkCircleIcon />\n </TextWithTone>\n ) : (\n <CircleIcon />\n )}\n </Text>\n <Box flex={1}>\n <Text>{title}</Text>\n </Box>\n <Badge>{id}</Badge>\n </Flex>\n </Button>\n )\n}\n","import {useMemo} from 'react'\nimport {type ObjectInputProps, type ObjectMember, useFormValue, useSchema} from 'sanity'\n\nimport {isLanguageFilterEnabled} from './filterField'\nimport {useLanguageFilterStudioContext} from './LanguageFilterStudioContext'\n\n// First check that this Object is in a schema type for which language-filter is enabled\nexport function FilteredObjectWrapper(props: ObjectInputProps) {\n const {options} = useLanguageFilterStudioContext()\n\n // oxlint-disable-next-line no-unsafe-type-assertion -- documentType is always a string for Sanity documents\n const documentType = useFormValue(['_type']) as string\n const schema = useSchema()\n const languageFilterEnabled = isLanguageFilterEnabled(schema.get(documentType), options)\n return languageFilterEnabled ? <FilteredObjectInput {...props} /> : props.renderDefault(props)\n}\n\n// Modify the object members based on selected languages in the filter\nfunction FilteredObjectInput(props: ObjectInputProps) {\n const {members: membersProp, schemaType, renderDefault, ...restProps} = props\n const {selectedLanguageIds, options} = useLanguageFilterStudioContext()\n const {filterField} = options\n const parentValue = props.value\n\n const members: ObjectMember[] = useMemo(() => {\n return membersProp\n .filter((member) => {\n return (\n (member.kind === 'field' &&\n filterField(schemaType, member, selectedLanguageIds, parentValue)) ||\n member.kind === 'fieldSet' ||\n member.kind === 'error'\n )\n })\n .map((member) => {\n if (member.kind === 'fieldSet') {\n return Object.assign({}, member, {\n fieldSet: Object.assign({}, member.fieldSet, {\n members: member.fieldSet.members.filter((fieldsetMember) => {\n return (\n fieldsetMember.kind === 'field' &&\n filterField(schemaType, fieldsetMember, selectedLanguageIds, parentValue)\n )\n }),\n }),\n })\n }\n return member\n })\n }, [schemaType, membersProp, filterField, selectedLanguageIds, parentValue])\n\n return renderDefault({...restProps, members, schemaType, renderDefault})\n}\n","import {\n definePlugin,\n type DocumentLanguageFilterComponent,\n isObjectSchemaType,\n type ObjectInputProps,\n} from 'sanity'\n\nimport {isLanguageFilterEnabled} from './filterField'\nimport {LanguageFilterMenuButton} from './LanguageFilterMenuButton'\nimport {FilteredObjectWrapper} from './LanguageFilterObjectInput'\nimport {defaultContextValue, LanguageFilterStudioProvider} from './LanguageFilterStudioContext'\nimport type {LanguageFilterConfig} from './types'\n\n/**\n * ## Usage in sanity.config.ts (or .js)\n *\n * ```\n * import {defineConfig} from 'sanity'\n * import {languageFilter} from '@sanity/language-filter'\n *\n * export const defineConfig({\n * /...\n * plugins: [\n * languageFilter({\n * supportedLanguages: [\n * {id: 'nb', title: 'Norwegian (Bokmål)'},\n * {id: 'nn', title: 'Norwegian (Nynorsk)'},\n * {id: 'en', title: 'English'},\n * {id: 'es', title: 'Spanish'},\n * {id: 'arb', title: 'Arabic'},\n * {id: 'pt', title: 'Portuguese'},\n * //...\n * ],\n * // Select Norwegian (Bokmål) by default\n * defaultLanguages: ['nb'],\n * // Only show language filter for document type `page` (schemaType.name)\n * // Can also enable via document-options: options.languageFilter: true\n * documentTypes: ['page'],\n * // default filter function shown\n * filterField: (enclosingType, field, selectedLanguageIds) =>\n * !enclosingType.name.startsWith('locale') || selectedLanguageIds.includes(field.name),\n * })\n * ]\n * })\n * ```\n */\n\nconst RenderLanguageFilter: DocumentLanguageFilterComponent = () => {\n return <LanguageFilterMenuButton />\n}\n\nexport const languageFilter: ReturnType<typeof definePlugin<LanguageFilterConfig>> =\n definePlugin<LanguageFilterConfig>((options) => {\n const pluginOptions = {\n ...defaultContextValue.options,\n ...options,\n }\n\n return {\n name: '@sanity/language-filter',\n studio: {\n components: {\n layout: (props) => LanguageFilterStudioProvider({...props, options: pluginOptions}),\n },\n },\n\n document: {\n unstable_languageFilter: (prev, {schemaType, schema}) => {\n if (isLanguageFilterEnabled(schema.get(schemaType), options)) {\n return [...prev, RenderLanguageFilter]\n }\n return prev\n },\n },\n\n form: {\n components: {\n input: (props) => {\n if (props.id !== 'root' && isObjectSchemaType(props.schemaType)) {\n // oxlint-disable-next-line no-unsafe-type-assertion -- isObjectSchemaType confirms the type\n return FilteredObjectWrapper(props as ObjectInputProps)\n }\n\n return props.renderDefault(props)\n },\n },\n },\n }\n })\n"],"names":["defaultFilterField","enclosingType","field","selectedLanguageIds","name","startsWith","includes","isLanguageFilterEnabled","schemaType","options","schemaFilter","isDocument","languageFilter","defaultEnabled","documentTypes","jsonType","getRootType","schema","type","storageKey","getPersistedLanguageIds","selectableLangs","getSelectableLanguages","map","l","id","selected","persistedValue","window","localStorage","getItem","JSON","parse","intersection","persistLanguageIds","languageIds","setItem","stringify","array1","array2","filter","value","supportedLanguages","defaultLanguages","Array","isArray","lang","useSelectedLanguageIds","$","_c","t0","useState","defaultContextValue","apiVersion","filterField","setSelectedLanguageIds","console","error","LanguageFilterStudioContext","createContext","LanguageFilterStudioProvider","props","for","client","useClient","t1","languages","setLanguages","t2","t3","asyncLanguages","getLanguages","supportedLanguagesCallback","useEffect","t4","t5","t6","renderDefault","t7","useLanguageFilterStudioContext","useContext","unique","arr","from","Set","usePaneLanguages","undefined","selectableLanguages","ids","updateSelectedIds","_temp","selectAll","selectNone","languageId","l_0","toggleLanguage","activeLanguages","t8","length","t9","allSelected","LanguageFilterMenuButton","languageOptions","open","setOpen","button","setButton","popover","setPopover","event","currentTarget","handleToggleAll","handleClick","handleClickOutside","_temp2","useClickOutsideEvent","langCount","query","setQuery","Symbol","event_0","handleQuery","showSearch","T0","Box","maxHeight","T1","Stack","t10","t11","_temp3","t12","t13","t14","t15","t16","t17","t18","t19","t20","language","title","toLowerCase","t21","t22","t23","t24","content","buttonText","t25","TranslateIcon","t26","l_1","el","o","LanguageFilterOption","onToggle","handleChange","disabled","FilteredObjectWrapper","documentType","useFormValue","useSchema","get","languageFilterEnabled","FilteredObjectInput","members","membersProp","restProps","parentValue","member","kind","member_0","Object","assign","fieldSet","fieldsetMember","RenderLanguageFilter","definePlugin","pluginOptions","studio","components","layout","document","unstable_languageFilter","prev","form","input","isObjectSchemaType"],"mappings":";;;;;;AAIO,MAAMA,qBAA0CA,CACrDC,eACAC,OACAC,wBACG,CAACF,cAAcG,KAAKC,WAAW,QAAQ,KAAKF,oBAAoBG,SAASJ,MAAME,IAAI;AAEjF,SAASG,wBACdC,YACAC,SACS;AACT,QAAMC;AAAAA;AAAAA,IAEJC,WAAWH,UAAU,KAAMA,YAAqCC,SAASG;AAAAA,KACrEC,iBAAiB,CAACJ,QAAQK;AAEhC,SAAO,CAAC,EACLD,kBAAkBH,iBAAiB,MACnC,CAACG,kBAAkBH,gBACnBF,cAAcC,QAAQK,eAAeR,SAASE,WAAWJ,IAAI;AAElE;AAEA,SAASO,WAAWH,YAAyB;AAC3C,SAAOA,YAAYO,aAAa,YAAYC,YAAYR,UAAU,EAAEJ,SAAS;AAC/E;AAEA,SAASY,YAAYC,QAAgC;AACnD,SAAIA,OAAOC,OACFF,YAAYC,OAAOC,IAAI,IAEzBD;AACT;AChCA,MAAME,aAAa;AAEnB,SAASC,wBAAwBX,SAAyC;AACxE,QAAMY,kBAAkBC,uBAAuBb,OAAO,EAAEc,IAAKC,CAAAA,MAAMA,EAAEC,EAAE;AAEvE,MAAIC,WAAqBL;AACzB,MAAI;AACF,UAAMM,iBAAiBC,OAAOC,aAAaC,QAAQX,UAAU;AACzDQ,uBACFD,WAAWK,KAAKC,MAAML,cAAc;AAAA,EAExC,QAAQ;AAAA,EAAC;AAGTD,SAAAA,WAAWO,aAAaP,UAAUL,eAAe,GAC1CK;AACT;AAEO,SAASQ,mBAAmBC,aAA6B;AAC9DP,SAAOC,aAAaO,QAAQjB,YAAYY,KAAKM,UAAUF,WAAW,CAAC;AACrE;AAEA,SAASF,aAAaK,QAAkBC,QAAkB;AACxD,SAAOD,OAAOE,OAAQC,CAAAA,UAAUF,OAAOjC,SAASmC,KAAK,CAAC;AACxD;AAEO,SAASnB,uBAAuB;AAAA,EACrCoB;AAAAA,EACAC;AACoB,GAAe;AACnC,SAAOC,MAAMC,QAAQH,kBAAkB,IACnCA,mBAAmBF,OAAQM,CAAAA,SAAS,CAACH,kBAAkBrC,SAASwC,KAAKrB,EAAE,CAAC,IACxE,CAAA;AACN;AAEO,SAAAsB,uBAAAtC,SAAA;AAAA,QAAAuC,IAAAC,EAAA,CAAA;AAAA,MAAAC;AAAA,SAAAF,SAAAvC,WAGWyC,KAAAA,MAAM,CAAA,GAAKzC,QAAOkC,oBAAP,CAAA,GAA8B,GAAMvB,wBAAwBX,OAAO,CAAC,GAACuC,OAAAvC,SAAAuC,OAAAE,MAAAA,KAAAF,EAAA,CAAA,GAAzFG,SAASD,EAAgF;AAAC;AChB5F,MAAME,sBAAwD;AAAA,EACnE3C,SAAS;AAAA,IACP4C,YAAY;AAAA,IACZX,oBAAoB,CAAA;AAAA,IACpBC,kBAAkB,CAAA;AAAA,IAClB7B,eAAe,CAAA;AAAA,IACfwC,aAAatD;AAAAA,EAAAA;AAAAA,EAEfG,qBAAqB,CAAA;AAAA,EACrBoD,wBAAwBA,MAAMC,QAAQC,MAAM,6CAA6C;AAC3F,GAEMC,8BACJC,cAAgDP,mBAAmB;AAO9D,SAAAQ,6BAAAC,OAAA;AAAA,QAAAb,IAAAC,EAAA,EAAA;AAAA,MAAAC;AAAAF,IAAA,CAAA,6BAAAc,IAAA,2BAAA,KAGoBZ,KAAA;AAAA,IAAAG,YAAa;AAAA,EAAA,GAAaL,OAAAE,MAAAA,KAAAF,EAAA,CAAA;AAAnD,QAAAe,SAAeC,UAAUd,EAA0B;AAAC,MAAAe;AAAAjB,IAAA,CAAA,MAAAa,MAAApD,QAAAiC,sBAElDuB,KAAArB,MAAKC,QAASgB,MAAKpD,QAAQiC,kBAA2D,IAApCmB,MAAKpD,QAAQiC,qBAA/D,CAAA,GAAuFM,EAAA,CAAA,IAAAa,MAAApD,QAAAiC,oBAAAM,OAAAiB,MAAAA,KAAAjB,EAAA,CAAA;AADzF,QAAA,CAAAkB,WAAAC,YAAA,IAAkChB,SAChCc,EACF;AAAC,MAAAG,IAAAC;AAAArB,IAAA,CAAA,MAAAe,UAAAf,SAAAa,MAAApD,QAAAiC,sBACS0B,KAAAA,MAAA;AACR,QAAAE,iBAAiC,CAAA;AAEjC,UAAAC,eAAA,eAAAC,4BAAA;AACEF,uBAAiBA,MAAME,2BAA2BT,QAAQ,CAAA,CAAE,GAC5DI,aAAaG,cAAc;AAAA,IAAC;AAGzB1B,UAAKC,QAASgB,MAAKpD,QAAQiC,kBAAmB,KAC5C6B,aAAaV,MAAKpD,QAAQiC,kBAAmB;AAAA,EACnD,GACA2B,KAAA,CAACN,QAAQF,MAAKpD,QAAQiC,kBAAmB,GAACM,OAAAe,QAAAf,EAAA,CAAA,IAAAa,MAAApD,QAAAiC,oBAAAM,OAAAoB,IAAApB,OAAAqB,OAAAD,KAAApB,EAAA,CAAA,GAAAqB,KAAArB,EAAA,CAAA,IAX7CyB,UAAUL,IAWPC,EAA0C;AAAC,MAAAK;AAAA1B,WAAAkB,aAAAlB,EAAA,CAAA,MAAAa,MAAApD,WAGrCiE,KAAA;AAAA,IAAA,GACFtB,oBAAmB3C;AAAAA,IAAQ,GAC3BoD,MAAKpD;AAAAA,IAAQiC,oBACIwB;AAAAA,EAAAA,GACrBlB,OAAAkB,WAAAlB,EAAA,CAAA,IAAAa,MAAApD,SAAAuC,OAAA0B,MAAAA,KAAA1B,EAAA,CAAA;AALH,QAAAvC,UACEiE,IAOF,CAAAvE,qBAAAoD,sBAAA,IAAsDR,uBAAuBtC,OAAO;AAAC,MAAAkE;AAAA3B,IAAA,EAAA,MAAAvC,WAAAuC,UAAA7C,uBAAA6C,EAAA,EAAA,MAAAO,0BAE5EoB,KAAA;AAAA,IAAAlE;AAAAA,IAAAN;AAAAA,IAAAoD;AAAAA,EAAAA,GAAsDP,QAAAvC,SAAAuC,QAAA7C,qBAAA6C,QAAAO,wBAAAP,QAAA2B,MAAAA,KAAA3B,EAAA,EAAA;AAD/D,QAAAP,QACSkC;AAER,MAAAC;AAAA5B,YAAAa,SAIIe,KAAAf,MAAKgB,cAAehB,KAAK,GAACb,QAAAa,OAAAb,QAAA4B,MAAAA,KAAA5B,EAAA,EAAA;AAAA,MAAA8B;AAAA,SAAA9B,EAAA,EAAA,MAAA4B,MAAA5B,UAAAP,SAD7BqC,KAAA,oBAAA,4BAAA,UAAA,EAA6CrC,OAC1CmC,UAAAA,GAAAA,CACH,GAAuC5B,QAAA4B,IAAA5B,QAAAP,OAAAO,QAAA8B,MAAAA,KAAA9B,EAAA,EAAA,GAFvC8B;AAEuC;AAQpC,SAAAC,iCAAA;AAAA,SACEC,WAAWtB,2BAA2B;AAAC;ACtFhD,MAAMuB,SAAUC,CAAAA,QAAkBtC,MAAMuC,KAAK,IAAIC,IAAIF,GAAG,CAAC;AAElD,SAAAG,mBAAA;AAAA,QAAArC,IAAAC,EAAA,EAAA,GAOL;AAAA,IAAA9C;AAAAA,IAAAoD;AAAAA,IAAA9C;AAAAA,EAAAA,IAA+DsE,kCAC/D;AAAA,IAAApC,kBAAAO;AAAAA,EAAAA,IAAgCzC;AAAO,MAAAwD;AAAAjB,WAAAE,MAAhCe,KAAAf,OAAAoC,SAAA,CAAA,IAAApC,IAAqBF,OAAAE,IAAAF,OAAAiB,MAAAA,KAAAjB,EAAA,CAAA;AAArB,QAAAL,mBAAAsB;AAAqB,MAAAG;AAAApB,WAAAvC,WAEc2D,KAAA9C,uBAAuBb,OAAO,GAACuC,OAAAvC,SAAAuC,OAAAoB,MAAAA,KAAApB,EAAA,CAAA;AAAzE,QAAAuC,sBAA0CnB;AAA2C,MAAAC;AAAArB,IAAA,CAAA,MAAAL,oBAAAK,SAAAO,0BAGnFc,KAAAmB,CAAAA,QAAA;AACEjC,2BAAuB0B,OAAO,CAAA,GAAItC,kBAAgB,GAAK6C,GAAG,CAAC,CAAC,GAC5DtD,mBAAmB+C,OAAO,CAAA,GAAItC,kBAAgB,GAAK6C,GAAG,CAAC,CAAC;AAAA,EAAC,GAC1DxC,OAAAL,kBAAAK,OAAAO,wBAAAP,OAAAqB,MAAAA,KAAArB,EAAA,CAAA;AAJH,QAAAyC,oBAA0BpB;AAMzB,MAAAK;AAAA1B,IAAA,CAAA,MAAAuC,uBAAAvC,SAAAyC,qBAGCf,KAAAA,MAAMe,kBAAkBF,oBAAmBhE,IAAKmE,OAAW,CAAC,GAAC1C,OAAAuC,qBAAAvC,OAAAyC,mBAAAzC,OAAA0B,MAAAA,KAAA1B,EAAA,CAAA;AAD/D,QAAA2C,YAAkBjB;AAGjB,MAAAC;AAAA3B,IAAA,EAAA,MAAAL,oBAAAK,UAAAyC,qBAE8Bd,KAAAA,MAAA;AAC7Bc,sBAAkB9C,gBAAgB;AAAA,EAAC,GACpCK,QAAAL,kBAAAK,QAAAyC,mBAAAzC,QAAA2B,MAAAA,KAAA3B,EAAA,EAAA;AAFD,QAAA4C,aAAmBjB;AAEsB,MAAAC;AAAA5B,IAAA,EAAA,MAAA7C,uBAAA6C,UAAAyC,qBAGvCb,KAAAiB,CAAAA,eAAA;AACE,QAAA/C,OAAW3C;AAEP2C,SAAIxC,SAAUuF,UAAU,IAC1B/C,OAAOA,KAAIN,OAAQsD,SAAOtE,QAAMqE,UAAU,IAE1C/C,OAAOmC,OAAO,IAAInC,MAAM+C,UAAU,CAAC,GAGrCJ,kBAAkB3C,IAAI;AAAA,EAAC,GACxBE,QAAA7C,qBAAA6C,QAAAyC,mBAAAzC,QAAA4B,MAAAA,KAAA5B,EAAA,EAAA;AAXH,QAAA+C,iBAAuBnB;AAatB,MAAAE;AAAA9B,IAAA,EAAA,MAAAL,oBAAAK,UAAA7C,uBAGO2E,KAAAG,OAAO,CAAA,GAAKtC,oBAAA,CAAA,GAAsB,GAAMxC,mBAAmB,CAAC,GAAC6C,QAAAL,kBAAAK,QAAA7C,qBAAA6C,QAAA8B,MAAAA,KAAA9B,EAAA,EAAA;AADrE,QAAAgD,kBACQlB,IAOJmB,KAAA9F,oBAAmB+F,WAAYX,oBAAmBW,SAAUvD,iBAAgBuD;AAAO,MAAAC;AAAA,SAAAnD,EAAA,EAAA,MAAAgD,mBAAAhD,EAAA,EAAA,MAAA2C,aAAA3C,EAAA,EAAA,MAAA4C,cAAA5C,EAAA,EAAA,MAAAiD,MAAAjD,UAAA+C,kBAHhFI,KAAA;AAAA,IAAAH;AAAAA,IAAAI,aAGHH;AAAAA,IAAmFN;AAAAA,IAAAC;AAAAA,IAAAG;AAAAA,EAAAA,GAItF/C,QAAAgD,iBAAAhD,QAAA2C,WAAA3C,QAAA4C,YAAA5C,QAAAiD,IAAAjD,QAAA+C,gBAAA/C,QAAAmD,MAAAA,KAAAnD,EAAA,EAAA,GAPMmD;AAON;AAxDI,SAAAT,QAAAlE,GAAA;AAAA,SAqBoDA,EAACC;AAAG;ACHxD,SAAA4E,2BAAA;AAAA,QAAArD,IAAAC,EAAA,EAAA,GACL;AAAA,IAAAxC;AAAAA,EAAAA,IAAkBsE,+BAAAA;AAAgC,MAAA7B;AAAAF,IAAA,CAAA,MAAAvC,QAAAkC,oBAESO,KAAA1B,CAAAA,MACzDf,QAAOkC,kBAA2BrC,SAACkB,EAACC,EAAG,GAACuB,EAAA,CAAA,IAAAvC,QAAAkC,kBAAAK,OAAAE,MAAAA,KAAAF,EAAA,CAAA;AAD1C,QAAAL,mBAAyBlC,QAAOiC,mBAAmBF,OAAQU,EAE3D;AAAC,MAAAe;AAAAjB,IAAA,CAAA,MAAAvC,QAAAkC,oBAGCsB,KAAA6B,CAAAA,QAAO,CAACrF,QAAOkC,kBAA2BrC,SAACkB,IAACC,EAAG,GAACuB,EAAA,CAAA,IAAAvC,QAAAkC,kBAAAK,OAAAiB,MAAAA,KAAAjB,EAAA,CAAA;AADlD,QAAAsD,kBAAwB7F,QAAOiC,mBAAmBF,OAChDyB,EACF,GACA,CAAAsC,MAAAC,OAAA,IAAwBrD,SAAS,EAAK,GACtC;AAAA,IAAA6C;AAAAA,IAAAI;AAAAA,IAAAT;AAAAA,IAAAC;AAAAA,IAAAG;AAAAA,EAAAA,IAA8EV,iBAAAA,GAC9E,CAAAoB,QAAAC,SAAA,IAA4BvD,SAA6B,IAAI,GAC7D,CAAAwD,SAAAC,UAAA,IAA8BzD,SAA6B,IAAI;AAAC,MAAAiB;AAAApB,IAAA,CAAA,MAAA2C,aAAA3C,SAAA4C,cAG9DxB,KAAAyC,CAAAA,UAAA;AACkBA,UAAKC,cAAcrE,UAAW,QAG5CkD,UAAAA,IAEAC,WAAAA;AAAAA,EACD,GACF5C,OAAA2C,WAAA3C,OAAA4C,YAAA5C,OAAAoB,MAAAA,KAAApB,EAAA,CAAA;AATH,QAAA+D,kBAA8D3C;AAW7D,MAAAC;AAAArB,IAAA,CAAA,6BAAAc,IAAA,2BAAA,KAE+BO,KAAAA,MAAMmC,QAAQd,KAAS,GAAC1C,OAAAqB,MAAAA,KAAArB,EAAA,CAAA;AAAxD,QAAAgE,cAAoB3C;AAAyC,MAAAK;AAAA1B,IAAA,CAAA,6BAAAc,IAAA,2BAAA,KAEtBY,KAAAA,MAAM8B,QAAQ,EAAK,GAACxD,OAAA0B,MAAAA,KAAA1B,EAAA,CAAA;AAA3D,QAAAiE,qBAA2BvC;AAAqC,MAAAC;AAAA3B,IAAA,CAAA,MAAAyD,UAAAzD,UAAA2D,WAK5DhC,KAAAA,MAAM,CAAC8B,QAAQE,OAAO,EAACnE,OAAQ0E,MAAsC,GAAClE,OAAAyD,QAAAzD,QAAA2D,SAAA3D,QAAA2B,MAAAA,KAAA3B,EAAA,EAAA,GAH1EmE,qBACEF,oBACAtC,EAIF;AAEA,QAAAyC,YAAkB3G,QAAOiC,mBAAmBwD,QAG5C,CAAAmB,OAAAC,QAAA,IAA0BnE,SAAS,EAAE;AAAC,MAAAyB;AAAA5B,IAAA,EAAA,MAAAuE,uBAAAzD,IAAA,2BAAA,KACNc,KAAA4C,CAAAA,YAAA;AAC1BX,YAAKC,cAAcrE,QACrB6E,SAAST,QAAKC,cAAcrE,KAAM,IAElC6E,SAAS,EAAE;AAAA,EACZ,GACFtE,QAAA4B,MAAAA,KAAA5B,EAAA,EAAA;AAND,QAAAyE,cAAoB7C,IAQpB8C,aAAmBN,YAAY,GAG5BO,KAAAC,KAAa9C,KAAA;AAAM,MAAAmB;AAAAjD,IAAA,EAAA,6BAAAc,IAAA,2BAAA,KAAQmC,KAAA;AAAA,IAAA4B,WAAY;AAAA,EAAA,GAAsB7E,QAAAiD,MAAAA,KAAAjD,EAAA,EAAA;AAC3D,QAAA8E,KAAAC,OAAe5B,KAAA,GAAU6B,MAAA,GACvBC,MAAAtF,iBAAgBuD,SAAU,KAA1B,qBAAA,UAAA,EAEIvD,UAAAA;AAAAA,IAAAA,iBAAgBpB,IAAK2G,MAErB;AAAA,IACD,oBAAC,MAAA,EAAK,WAAA,GAAA,CAAS;AAAA,EAAA,EAAA,CAAG,GAQbC,MAAA/B,cAAA,SAAA,OACGgC,MAAA,CAAC,CAACf;AAAK,MAAAgB;AAAArF,YAAAoD,eAGfiC,MAAA,oBAAC,MAAA,EAAW,MAAA,GACTjC,UAAAA,cACC,oBAAC,cAAA,EAAkB,MAAA,WACjB,UAAA,oBAAC,eAAA,CAAA,CAAa,EAAA,CAChB,IAEA,oBAAC,aAAA,CAAA,CAAW,EAAA,CAEhB,GAAOpD,QAAAoD,aAAApD,QAAAqF,OAAAA,MAAArF,EAAA,EAAA;AAEE,QAAAsF,MAAAlC,cAAA,aAAA;AAAqC,MAAAmC;AAAAvF,YAAAsF,OAD9CC,0BAAC,KAAA,EAAU,MAAA,GACT,UAAA,oBAAC,MAAA,EAAMD,UAAAA,IAAAA,CAAsC,GAC/C,GAAMtF,QAAAsF,KAAAtF,QAAAuF,OAAAA,MAAAvF,EAAA,EAAA;AAAA,MAAAwF;AAAAxF,IAAA,EAAA,MAAAqF,OAAArF,UAAAuF,OAZRC,2BAAC,MAAA,EAAU,KAAA,GAAS,OAAA,UAClBH,UAAAA;AAAAA,IAAAA;AAAAA,IASAE;AAAAA,EAAAA,EAAAA,CAGF,GAAOvF,QAAAqF,KAAArF,QAAAuF,KAAAvF,QAAAwF,OAAAA,MAAAxF,EAAA,EAAA;AAAA,MAAAyF;AAAAzF,IAAA,EAAA,MAAA+D,mBAAA/D,EAAA,EAAA,MAAAmF,OAAAnF,EAAA,EAAA,MAAAoF,OAAApF,UAAAwF,OApBTC,MAAA,oBAAC,QAAA,EACM,MAAA,SACI1B,SAAAA,iBACD,SAAA,cACD,OAAAoB,KACG,UAAAC,KAEVI,UAAAA,IAAAA,CAcF,GAASxF,QAAA+D,iBAAA/D,QAAAmF,KAAAnF,QAAAoF,KAAApF,QAAAwF,KAAAxF,QAAAyF,OAAAA,MAAAzF,EAAA,EAAA;AAAA,MAAA0F;AAAA1F,IAAA,EAAA,MAAAqE,SAAArE,UAAA0E,cAERgB,MAAAhB,iCACE,WAAA,EAAoBD,UAAAA,aAAoBJ,OAAAA,OAAmB,aAAA,oBAAkB,IAE9E,oBAAC,MAAA,EAAK,WAAA,GAAA,CAAS,GAChBrE,QAAAqE,OAAArE,QAAA0E,YAAA1E,QAAA0F,OAAAA,MAAA1F,EAAA,EAAA;AAAA,MAAA2F;AAAA3F,YAAAqE,SAGSsB,MAAAC,CAAAA,aACFvB,QACKuB,SAAQC,MAAMC,YAAAA,EAAcxI,SAAU+G,MAAKyB,YAAAA,CAAc,IAE3D,IACR9F,QAAAqE,OAAArE,QAAA2F,OAAAA,MAAA3F,EAAA,EAAA;AAAA,MAAA+F;AAAA/F,IAAA,EAAA,MAAAgD,mBAAAhD,UAAA+C,kBACIgD,MAAAjG,UACH,oBAAC,sBAAA,EACK,IAAAA,KAAIrB,IAEEsE,UAAAA,gBACA,UAAAC,gBAAe1F,SAAUwC,KAAIrB,EAAG,GACnC,OAAAqB,KAAI+F,MAAAA,GAHN/F,KAAIrB,EAGQ,GAEpBuB,QAAAgD,iBAAAhD,QAAA+C,gBAAA/C,QAAA+F,OAAAA,MAAA/F,EAAA,EAAA;AAfF,QAAAgG,MAAA1C,gBAAe9D,OACNmG,GAKP,EAACpH,IACGwH,GAQJ;AAAC,MAAAE;AAAAjG,IAAA,EAAA,MAAA8E,MAAA9E,EAAA,EAAA,MAAAiF,OAAAjF,EAAA,EAAA,MAAAyF,OAAAzF,EAAA,EAAA,MAAA0F,OAAA1F,UAAAgG,OAtDNC,MAAA,qBAAC,IAAA,EAAe,SAAA9C,IAAU,OAAA6B,KACvBC,UAAAA;AAAAA,IAAAA;AAAAA,IASDQ;AAAAA,IAuBCC;AAAAA,IAMAM;AAAAA,EAAAA,EAAAA,CAgBH,GAAQhG,QAAA8E,IAAA9E,QAAAiF,KAAAjF,QAAAyF,KAAAzF,QAAA0F,KAAA1F,QAAAgG,KAAAhG,QAAAiG,OAAAA,MAAAjG,EAAA,EAAA;AAAA,MAAAkG;AAAAlG,IAAA,EAAA,MAAA2E,MAAA3E,UAAAiG,OAAAjG,EAAA,EAAA,MAAAiD,MAxDViD,0BAAC,IAAA,EAAa,UAAApE,IAAc,OAAAmB,IAC1BgD,UAAAA,KAwDF,GAAMjG,QAAA2E,IAAA3E,QAAAiG,KAAAjG,QAAAiD,IAAAjD,QAAAkG,OAAAA,MAAAlG,EAAA,EAAA;AA1DR,QAAAmG,UACED,KA4DFE,aACEpD,gBAAeE,WAAYkB,YAA3B,gBAAA,WAEepB,gBAAeE,MAAO,MAAMkB,SAAS;AAAE,MAAAiC;AAAArG,IAAA,EAAA,MAAAoG,cAAApG,EAAA,EAAA,MAAAgE,eAAAhE,EAAA,EAAA,MAAAuD,QAAAvD,UAAA0D,aAGpD2C,MAAA,oBAAC,QAAA,EACOD,MAAAA,YACAE,MAAAA,eACD,MAAA,SACItC,SAAAA,aACJN,KAAAA,WACKH,UAAAA,KAAAA,CAAI,GACdvD,QAAAoG,YAAApG,QAAAgE,aAAAhE,QAAAuD,MAAAvD,QAAA0D,WAAA1D,QAAAqG,OAAAA,MAAArG,EAAA,EAAA;AAAA,MAAAuG;AAAA,SAAAvG,EAAA,EAAA,MAAAmG,WAAAnG,EAAA,EAAA,MAAAuD,QAAAvD,EAAA,EAAA,MAAA4D,cAAA5D,UAAAqG,OARJE,MAAA,oBAAC,SAAA,EAAQ,SAAA,IAAiBJ,SAAe5C,MAAM,QAAA,IAAYK,KAAAA,YACzDyC,UAAAA,IAAAA,CAQF,GAAUrG,QAAAmG,SAAAnG,QAAAuD,MAAAvD,QAAA4D,YAAA5D,QAAAqG,KAAArG,QAAAuG,OAAAA,MAAAvG,EAAA,EAAA,GATVuG;AASU;AAjIP,SAAArB,OAAAsB,KAAA;AAAA,SA4DO,oBAAC,sBAAA,EAAoC,IAAAhI,IAACC,IAAY,OAAAD,IAACqH,OAAQ,UAAA,GAAA,GAAhCrH,IAACC,EAAuC;AAAG;AA5D7E,SAAAyF,OAAAuC,IAAA;AAAA,SAmCyDA,OAAO;AAAI;AAnCpE,SAAA/D,MAAAgE,GAAA;AAAA,SA4BgD,CAACA;AAAC;AAyGzD,SAAAC,qBAAA9F,OAAA;AAAA,QAAAb,IAAAC,EAAA,EAAA,GAME;AAAA,IAAAxB;AAAAA,IAAAmI;AAAAA,IAAAlI;AAAAA,IAAAmH;AAAAA,EAAAA,IAAwChF;AAAK,MAAAX;AAAAF,IAAA,CAAA,MAAAvB,MAAAuB,SAAA4G,YAEZ1G,KAAAA,MAAA;AAC3B0G,gBACFA,SAASnI,EAAE;AAAA,EACZ,GACFuB,OAAAvB,IAAAuB,OAAA4G,UAAA5G,OAAAE,MAAAA,KAAAF,EAAA,CAAA;AAJD,QAAA6G,eAAqB3G,IAMrB4G,WAAiB,CAACF;AAAQ,MAAA3F;AAAAjB,IAAA,CAAA,MAAA8G,YAAA9G,SAAAtB,YAKpBuC,yBAAC,MAAA,EAAW,SACTvC,UAAAA,WACC,oBAAC,gBAAmB,MAAAoI,WAAA,YAAA,YAClB,UAAA,oBAAC,qBAAA,CAAA,IACH,IAEA,oBAAC,YAAA,CAAA,CAAU,GAEf,GAAO9G,OAAA8G,UAAA9G,OAAAtB,UAAAsB,OAAAiB,MAAAA,KAAAjB,EAAA,CAAA;AAAA,MAAAoB;AAAApB,WAAA6F,SACPzE,yBAAC,KAAA,EAAU,SACT,UAAA,oBAAC,MAAA,mBAAY,GACf,GAAMpB,OAAA6F,OAAA7F,OAAAoB,MAAAA,KAAApB,EAAA,CAAA;AAAA,MAAAqB;AAAArB,WAAAvB,MACN4C,yBAAC,uBAAU,GAAQrB,OAAAvB,IAAAuB,OAAAqB,MAAAA,KAAArB,EAAA,CAAA;AAAA,MAAA0B;AAAA1B,IAAA,EAAA,MAAAiB,MAAAjB,UAAAoB,MAAApB,EAAA,EAAA,MAAAqB,MAbrBK,KAAA,qBAAC,QAAU,KAAA,GAAS,OAAA,UAClBT,UAAAA;AAAAA,IAAAA;AAAAA,IASAG;AAAAA,IAGAC;AAAAA,EAAAA,GACF,GAAOrB,QAAAiB,IAAAjB,QAAAoB,IAAApB,QAAAqB,IAAArB,QAAA0B,MAAAA,KAAA1B,EAAA,EAAA;AAAA,MAAA2B;AAAA,SAAA3B,EAAA,EAAA,MAAA8G,YAAA9G,UAAA6G,gBAAA7G,EAAA,EAAA,MAAA0B,MAfTC,KAAA,oBAAC,QAAA,EAAY,MAAA,SAAiBkF,SAAAA,cAAsB,SAAA,cAAuBC,UACzEpF,UAAAA,GAAAA,CAeF,GAAS1B,QAAA8G,UAAA9G,QAAA6G,cAAA7G,QAAA0B,IAAA1B,QAAA2B,MAAAA,KAAA3B,EAAA,EAAA,GAhBT2B;AAgBS;ACxLN,SAAAoF,sBAAAlG,OAAA;AAAA,QAAAb,IAAAC,EAAA,CAAA,GACL;AAAA,IAAAxC;AAAAA,EAAAA,IAAkBsE,+BAAAA;AAAgC,MAAA7B;AAAAF,IAAA,CAAA,MAAAuE,uBAAAzD,IAAA,2BAAA,KAGhBZ,KAAA,CAAC,OAAO,GAACF,OAAAE,MAAAA,KAAAF,EAAA,CAAA;AAA3C,QAAAgH,eAAqBC,aAAa/G,EAAS,GAC3CjC,SAAeiJ,UAAAA;AAAW,MAAAjG;AAAAjB,IAAA,CAAA,MAAAgH,gBAAAhH,SAAAvC,WAAAuC,EAAA,CAAA,MAAA/B,UACIgD,KAAA1D,wBAAwBU,OAAMkJ,IAAKH,YAAY,GAAGvJ,OAAO,GAACuC,OAAAgH,cAAAhH,OAAAvC,SAAAuC,OAAA/B,QAAA+B,OAAAiB,MAAAA,KAAAjB,EAAA,CAAA;AAAxF,QAAAoH,wBAA8BnG;AAA0D,MAAAG;AAAA,SAAApB,EAAA,CAAA,MAAAoH,yBAAApH,SAAAa,SACjFO,KAAAgG,wBAAwB,oBAAC,qBAAA,EAAmB,GAAKvG,MAAAA,CAAK,IAAOA,MAAKgB,cAAehB,KAAK,GAACb,OAAAoH,uBAAApH,OAAAa,OAAAb,OAAAoB,MAAAA,KAAApB,EAAA,CAAA,GAAvFoB;AAAuF;AAIhG,SAAAiG,oBAAAxG,OAAA;AAAA,QAAAb,IAAAC,EAAA,EAAA,GACE;AAAA,IAAAqH,SAAAC;AAAAA,IAAA/J;AAAAA,IAAAqE;AAAAA,IAAA,GAAA2F;AAAAA,EAAAA,IAAwE3G,OACxE;AAAA,IAAA1D;AAAAA,IAAAM;AAAAA,EAAAA,IAAuCsE,kCACvC;AAAA,IAAAzB;AAAAA,EAAAA,IAAsB7C,SACtBgK,cAAoB5G,MAAKpB;AAAM,MAAAS;AAAA,MAAAF,EAAA,CAAA,MAAAM,eAAAN,EAAA,CAAA,MAAAuH,eAAAvH,EAAA,CAAA,MAAAyH,eAAAzH,EAAA,CAAA,MAAAxC,cAAAwC,SAAA7C,qBAAA;AAAA,QAAA8D;AAAAjB,MAAA,CAAA,MAAAM,eAAAN,EAAA,CAAA,MAAAyH,eAAAzH,EAAA,CAAA,MAAAxC,cAAAwC,SAAA7C,uBAInB8D,KAAAyG,CAAAA,WAEHA,OAAMC,SAAU,WACfrH,YAAY9C,YAAYkK,QAAQvK,qBAAqBsK,WAAW,KAClEC,OAAMC,SAAU,cAChBD,OAAMC,SAAU,SAEnB3H,OAAAM,aAAAN,OAAAyH,aAAAzH,OAAAxC,YAAAwC,OAAA7C,qBAAA6C,QAAAiB,MAAAA,KAAAjB,EAAA,EAAA;AAAA,QAAAoB;AAAApB,MAAA,EAAA,MAAAM,eAAAN,EAAA,EAAA,MAAAyH,eAAAzH,EAAA,EAAA,MAAAxC,cAAAwC,UAAA7C,uBACIiE,KAAAwG,CAAAA,aACCF,SAAMC,SAAU,aACXE,OAAMC,OAAQ,CAAA,GAAIJ,UAAQ;AAAA,MAAAK,UACrBF,OAAMC,OAAQ,CAAA,GAAIJ,SAAMK,UAAW;AAAA,QAAAT,SAClCI,SAAMK,SAAST,QAAQ9H,OAAQwI,CAAAA,mBAEpCA,eAAcL,SAAU,WACxBrH,YAAY9C,YAAYwK,gBAAgB7K,qBAAqBsK,WAAW,CAE3E;AAAA,MAAA,CACF;AAAA,IAAA,CACF,IAEIC,UACR1H,QAAAM,aAAAN,QAAAyH,aAAAzH,QAAAxC,YAAAwC,QAAA7C,qBAAA6C,QAAAoB,MAAAA,KAAApB,EAAA,EAAA,GAvBIE,KAAAqH,YAAW/H,OACRyB,EAOP,EAAC1C,IACG6C,EAcJ,GAACpB,OAAAM,aAAAN,OAAAuH,aAAAvH,OAAAyH,aAAAzH,OAAAxC,YAAAwC,OAAA7C,qBAAA6C,OAAAE;AAAAA,EAAA;AAAAA,SAAAF,EAAA,CAAA;AACsE,SAErE6B,cAAc;AAAA,IAAA,GAAI2F;AAAAA,IAASF,SA1BhCpH;AAAAA,IA0BgC1C;AAAAA,IAAAqE;AAAAA,EAAAA,CAAqC;AAAC;ACJ1E,MAAMoG,uBAAwDA,MAAA;AAAA,QAAAjI,IAAAC,EAAA,CAAA;AAAA,MAAAC;AAAA,SAAAF,EAAA,CAAA,6BAAAc,IAAA,2BAAA,KACrDZ,KAAA,oBAAC,0BAAA,CAAA,CAAwB,GAAGF,OAAAE,MAAAA,KAAAF,EAAA,CAAA,GAA5BE;AAA4B,GAGxBtC,iBACXsK,aAAoCzK,CAAAA,YAAY;AAC9C,QAAM0K,gBAAgB;AAAA,IACpB,GAAG/H,oBAAoB3C;AAAAA,IACvB,GAAGA;AAAAA,EAAAA;AAGL,SAAO;AAAA,IACLL,MAAM;AAAA,IACNgL,QAAQ;AAAA,MACNC,YAAY;AAAA,QACVC,QAASzH,WAAUD,6BAA6B;AAAA,UAAC,GAAGC;AAAAA,UAAOpD,SAAS0K;AAAAA,QAAAA,CAAc;AAAA,MAAA;AAAA,IACpF;AAAA,IAGFI,UAAU;AAAA,MACRC,yBAAyBA,CAACC,MAAM;AAAA,QAACjL;AAAAA,QAAYS;AAAAA,MAAAA,MACvCV,wBAAwBU,OAAOkJ,IAAI3J,UAAU,GAAGC,OAAO,IAClD,CAAC,GAAGgL,MAAMR,oBAAoB,IAEhCQ;AAAAA,IAAAA;AAAAA,IAIXC,MAAM;AAAA,MACJL,YAAY;AAAA,QACVM,OAAQ9H,CAAAA,UACFA,MAAMpC,OAAO,UAAUmK,mBAAmB/H,MAAMrD,UAAU,IAErDuJ,sBAAsBlG,KAAyB,IAGjDA,MAAMgB,cAAchB,KAAK;AAAA,MAAA;AAAA,IAEpC;AAAA,EACF;AAEJ,CAAC;"}