@cratis/scene.blueprint.default 4.38.0 → 4.40.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.
Files changed (167) hide show
  1. package/ComponentName.ts +27 -0
  2. package/defaultBlueprintComponents.ts +10 -1
  3. package/dist/cjs/ComponentName.js +9 -0
  4. package/dist/cjs/ComponentName.js.map +1 -1
  5. package/dist/cjs/defaultBlueprintComponents.js +19 -1
  6. package/dist/cjs/defaultBlueprintComponents.js.map +1 -1
  7. package/dist/cjs/foundation/BulkBar.js +62 -0
  8. package/dist/cjs/foundation/BulkBar.js.map +1 -0
  9. package/dist/cjs/foundation/DataList.js +436 -0
  10. package/dist/cjs/foundation/DataList.js.map +1 -0
  11. package/dist/cjs/foundation/FormScreenBody.js +447 -0
  12. package/dist/cjs/foundation/FormScreenBody.js.map +1 -0
  13. package/dist/cjs/foundation/FoundationStates.js +2 -1
  14. package/dist/cjs/foundation/FoundationStates.js.map +1 -1
  15. package/dist/cjs/foundation/GlobalSearch.js +54 -0
  16. package/dist/cjs/foundation/GlobalSearch.js.map +1 -0
  17. package/dist/cjs/foundation/KanbanBoard.js +222 -0
  18. package/dist/cjs/foundation/KanbanBoard.js.map +1 -0
  19. package/dist/cjs/foundation/NotificationsButton.js +45 -0
  20. package/dist/cjs/foundation/NotificationsButton.js.map +1 -0
  21. package/dist/cjs/foundation/SubNavigation.js +72 -0
  22. package/dist/cjs/foundation/SubNavigation.js.map +1 -0
  23. package/dist/cjs/foundation/TabSet.js +101 -0
  24. package/dist/cjs/foundation/TabSet.js.map +1 -0
  25. package/dist/cjs/foundation/WizardProgress.js +185 -0
  26. package/dist/cjs/foundation/WizardProgress.js.map +1 -0
  27. package/dist/cjs/foundation/boardModel.js +67 -0
  28. package/dist/cjs/foundation/boardModel.js.map +1 -0
  29. package/dist/cjs/foundation/formModel.js +158 -0
  30. package/dist/cjs/foundation/formModel.js.map +1 -0
  31. package/dist/cjs/foundation/foundationComponentMetadata.js +54 -0
  32. package/dist/cjs/foundation/foundationComponentMetadata.js.map +1 -1
  33. package/dist/cjs/foundation/foundationDescriptors.js +400 -0
  34. package/dist/cjs/foundation/foundationDescriptors.js.map +1 -1
  35. package/dist/cjs/foundation/foundationSamples.js +303 -0
  36. package/dist/cjs/foundation/foundationSamples.js.map +1 -1
  37. package/dist/cjs/foundation/foundationStrings.js +72 -0
  38. package/dist/cjs/foundation/foundationStrings.js.map +1 -1
  39. package/dist/cjs/foundation/listModel.js +200 -0
  40. package/dist/cjs/foundation/listModel.js.map +1 -0
  41. package/dist/cjs/foundation/tabModel.js +41 -0
  42. package/dist/cjs/foundation/tabModel.js.map +1 -0
  43. package/dist/cjs/foundation/urlState.js +57 -0
  44. package/dist/cjs/foundation/urlState.js.map +1 -0
  45. package/dist/cjs/foundation/useCompactWidth.js +23 -0
  46. package/dist/cjs/foundation/useCompactWidth.js.map +1 -0
  47. package/dist/cjs/foundation/wizardModel.js +50 -0
  48. package/dist/cjs/foundation/wizardModel.js.map +1 -0
  49. package/dist/cjs/index.js +71 -0
  50. package/dist/cjs/index.js.map +1 -1
  51. package/dist/esm/ComponentName.d.ts +10 -1
  52. package/dist/esm/ComponentName.d.ts.map +1 -1
  53. package/dist/esm/ComponentName.js +9 -0
  54. package/dist/esm/ComponentName.js.map +1 -1
  55. package/dist/esm/defaultBlueprintComponents.d.ts.map +1 -1
  56. package/dist/esm/defaultBlueprintComponents.js +19 -1
  57. package/dist/esm/defaultBlueprintComponents.js.map +1 -1
  58. package/dist/esm/foundation/BulkBar.d.ts +4 -0
  59. package/dist/esm/foundation/BulkBar.d.ts.map +1 -0
  60. package/dist/esm/foundation/BulkBar.js +59 -0
  61. package/dist/esm/foundation/BulkBar.js.map +1 -0
  62. package/dist/esm/foundation/DataList.d.ts +3 -0
  63. package/dist/esm/foundation/DataList.d.ts.map +1 -0
  64. package/dist/esm/foundation/DataList.js +434 -0
  65. package/dist/esm/foundation/DataList.js.map +1 -0
  66. package/dist/esm/foundation/FormScreenBody.d.ts +3 -0
  67. package/dist/esm/foundation/FormScreenBody.d.ts.map +1 -0
  68. package/dist/esm/foundation/FormScreenBody.js +445 -0
  69. package/dist/esm/foundation/FormScreenBody.js.map +1 -0
  70. package/dist/esm/foundation/FoundationStates.js +2 -1
  71. package/dist/esm/foundation/FoundationStates.js.map +1 -1
  72. package/dist/esm/foundation/GlobalSearch.d.ts +3 -0
  73. package/dist/esm/foundation/GlobalSearch.d.ts.map +1 -0
  74. package/dist/esm/foundation/GlobalSearch.js +52 -0
  75. package/dist/esm/foundation/GlobalSearch.js.map +1 -0
  76. package/dist/esm/foundation/KanbanBoard.d.ts +3 -0
  77. package/dist/esm/foundation/KanbanBoard.d.ts.map +1 -0
  78. package/dist/esm/foundation/KanbanBoard.js +220 -0
  79. package/dist/esm/foundation/KanbanBoard.js.map +1 -0
  80. package/dist/esm/foundation/NotificationsButton.d.ts +3 -0
  81. package/dist/esm/foundation/NotificationsButton.d.ts.map +1 -0
  82. package/dist/esm/foundation/NotificationsButton.js +43 -0
  83. package/dist/esm/foundation/NotificationsButton.js.map +1 -0
  84. package/dist/esm/foundation/SubNavigation.d.ts +3 -0
  85. package/dist/esm/foundation/SubNavigation.d.ts.map +1 -0
  86. package/dist/esm/foundation/SubNavigation.js +70 -0
  87. package/dist/esm/foundation/SubNavigation.js.map +1 -0
  88. package/dist/esm/foundation/TabSet.d.ts +3 -0
  89. package/dist/esm/foundation/TabSet.d.ts.map +1 -0
  90. package/dist/esm/foundation/TabSet.js +99 -0
  91. package/dist/esm/foundation/TabSet.js.map +1 -0
  92. package/dist/esm/foundation/WizardProgress.d.ts +3 -0
  93. package/dist/esm/foundation/WizardProgress.d.ts.map +1 -0
  94. package/dist/esm/foundation/WizardProgress.js +183 -0
  95. package/dist/esm/foundation/WizardProgress.js.map +1 -0
  96. package/dist/esm/foundation/boardModel.d.ts +22 -0
  97. package/dist/esm/foundation/boardModel.d.ts.map +1 -0
  98. package/dist/esm/foundation/boardModel.js +61 -0
  99. package/dist/esm/foundation/boardModel.js.map +1 -0
  100. package/dist/esm/foundation/formModel.d.ts +48 -0
  101. package/dist/esm/foundation/formModel.d.ts.map +1 -0
  102. package/dist/esm/foundation/formModel.js +147 -0
  103. package/dist/esm/foundation/formModel.js.map +1 -0
  104. package/dist/esm/foundation/foundationComponentMetadata.d.ts.map +1 -1
  105. package/dist/esm/foundation/foundationComponentMetadata.js +54 -0
  106. package/dist/esm/foundation/foundationComponentMetadata.js.map +1 -1
  107. package/dist/esm/foundation/foundationDescriptors.d.ts.map +1 -1
  108. package/dist/esm/foundation/foundationDescriptors.js +400 -0
  109. package/dist/esm/foundation/foundationDescriptors.js.map +1 -1
  110. package/dist/esm/foundation/foundationSamples.d.ts.map +1 -1
  111. package/dist/esm/foundation/foundationSamples.js +303 -0
  112. package/dist/esm/foundation/foundationSamples.js.map +1 -1
  113. package/dist/esm/foundation/foundationStrings.d.ts +72 -0
  114. package/dist/esm/foundation/foundationStrings.d.ts.map +1 -1
  115. package/dist/esm/foundation/foundationStrings.js +72 -0
  116. package/dist/esm/foundation/foundationStrings.js.map +1 -1
  117. package/dist/esm/foundation/index.d.ts +16 -0
  118. package/dist/esm/foundation/index.d.ts.map +1 -1
  119. package/dist/esm/foundation/index.js +16 -0
  120. package/dist/esm/foundation/index.js.map +1 -1
  121. package/dist/esm/foundation/listModel.d.ts +49 -0
  122. package/dist/esm/foundation/listModel.d.ts.map +1 -0
  123. package/dist/esm/foundation/listModel.js +183 -0
  124. package/dist/esm/foundation/listModel.js.map +1 -0
  125. package/dist/esm/foundation/tabModel.d.ts +10 -0
  126. package/dist/esm/foundation/tabModel.d.ts.map +1 -0
  127. package/dist/esm/foundation/tabModel.js +37 -0
  128. package/dist/esm/foundation/tabModel.js.map +1 -0
  129. package/dist/esm/foundation/urlState.d.ts +4 -0
  130. package/dist/esm/foundation/urlState.d.ts.map +1 -0
  131. package/dist/esm/foundation/urlState.js +53 -0
  132. package/dist/esm/foundation/urlState.js.map +1 -0
  133. package/dist/esm/foundation/useCompactWidth.d.ts +3 -0
  134. package/dist/esm/foundation/useCompactWidth.d.ts.map +1 -0
  135. package/dist/esm/foundation/useCompactWidth.js +20 -0
  136. package/dist/esm/foundation/useCompactWidth.js.map +1 -0
  137. package/dist/esm/foundation/wizardModel.d.ts +16 -0
  138. package/dist/esm/foundation/wizardModel.d.ts.map +1 -0
  139. package/dist/esm/foundation/wizardModel.js +43 -0
  140. package/dist/esm/foundation/wizardModel.js.map +1 -0
  141. package/dist/esm/index.js +16 -0
  142. package/dist/esm/index.js.map +1 -1
  143. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  144. package/foundation/BulkBar.tsx +38 -0
  145. package/foundation/DataList.tsx +208 -0
  146. package/foundation/FormScreenBody.tsx +196 -0
  147. package/foundation/FoundationStates.tsx +1 -1
  148. package/foundation/GlobalSearch.tsx +33 -0
  149. package/foundation/KanbanBoard.tsx +97 -0
  150. package/foundation/NotificationsButton.tsx +28 -0
  151. package/foundation/SubNavigation.tsx +49 -0
  152. package/foundation/TabSet.tsx +65 -0
  153. package/foundation/WizardProgress.tsx +109 -0
  154. package/foundation/boardModel.ts +64 -0
  155. package/foundation/formModel.ts +146 -0
  156. package/foundation/foundationComponentMetadata.ts +9 -0
  157. package/foundation/foundationDescriptors.ts +195 -0
  158. package/foundation/foundationSamples.ts +56 -0
  159. package/foundation/foundationStrings.ts +72 -0
  160. package/foundation/index.ts +16 -0
  161. package/foundation/listModel.ts +190 -0
  162. package/foundation/tabModel.ts +41 -0
  163. package/foundation/urlState.ts +52 -0
  164. package/foundation/useCompactWidth.ts +23 -0
  165. package/foundation/wizardModel.ts +54 -0
  166. package/package.json +8 -8
  167. package/shell/layout.css +513 -0
@@ -0,0 +1,447 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var react = require('react');
5
+ var scene_react = require('@cratis/scene.react');
6
+ var ActionButton = require('./ActionButton.js');
7
+ var ComponentState = require('./ComponentState.js');
8
+ var formModel = require('./formModel.js');
9
+ var formatting = require('./formatting.js');
10
+ var foundationStrings = require('./foundationStrings.js');
11
+ var PermissionRule = require('./PermissionRule.js');
12
+ var FoundationIcon = require('./FoundationIcon.js');
13
+ var StateFrame = require('./StateFrame.js');
14
+
15
+ function FieldInput({ field, value, error, readOnly, locale, required, choose, set, blur }) {
16
+ const id = react.useId();
17
+ const describedBy = [
18
+ field.help ? `${id}-help` : undefined,
19
+ error ? `${id}-error` : undefined
20
+ ].filter(Boolean).join(' ') || undefined;
21
+ const common = {
22
+ id,
23
+ 'aria-invalid': error ? true : undefined,
24
+ 'aria-required': field.required || undefined,
25
+ 'aria-describedby': describedBy,
26
+ disabled: readOnly,
27
+ onBlur: blur
28
+ };
29
+ const text = typeof value === 'string' || typeof value === 'number' ? String(value) : '';
30
+ let input;
31
+ switch(field.type){
32
+ case formModel.FormFieldType.Toggle:
33
+ input = /*#__PURE__*/ jsxRuntime.jsx("input", {
34
+ ...common,
35
+ type: "checkbox",
36
+ role: "switch",
37
+ checked: value === true,
38
+ onChange: (event)=>set(event.target.checked)
39
+ });
40
+ break;
41
+ case formModel.FormFieldType.Select:
42
+ case formModel.FormFieldType.Lookup:
43
+ input = /*#__PURE__*/ jsxRuntime.jsxs("select", {
44
+ ...common,
45
+ value: text,
46
+ onChange: (event)=>set(event.target.value),
47
+ children: [
48
+ /*#__PURE__*/ jsxRuntime.jsx("option", {
49
+ value: "",
50
+ children: choose
51
+ }),
52
+ field.options.map((option)=>/*#__PURE__*/ jsxRuntime.jsx("option", {
53
+ value: option,
54
+ children: option
55
+ }, option))
56
+ ]
57
+ });
58
+ break;
59
+ case formModel.FormFieldType.MultiSelect:
60
+ input = /*#__PURE__*/ jsxRuntime.jsx("fieldset", {
61
+ className: "foundation-fieldset",
62
+ "aria-describedby": describedBy,
63
+ disabled: readOnly,
64
+ children: field.options.map((option)=>/*#__PURE__*/ jsxRuntime.jsxs("label", {
65
+ className: "foundation-check",
66
+ children: [
67
+ /*#__PURE__*/ jsxRuntime.jsx("input", {
68
+ type: "checkbox",
69
+ checked: Array.isArray(value) && value.includes(option),
70
+ onBlur: blur,
71
+ onChange: (event)=>set(event.target.checked ? [
72
+ ...Array.isArray(value) ? value : [],
73
+ option
74
+ ] : (Array.isArray(value) ? value : []).filter((candidate)=>candidate !== option))
75
+ }),
76
+ /*#__PURE__*/ jsxRuntime.jsx("span", {
77
+ children: option
78
+ })
79
+ ]
80
+ }, option))
81
+ });
82
+ break;
83
+ case formModel.FormFieldType.RichText:
84
+ input = /*#__PURE__*/ jsxRuntime.jsx("textarea", {
85
+ ...common,
86
+ rows: 5,
87
+ value: text,
88
+ placeholder: field.placeholder,
89
+ onChange: (event)=>set(event.target.value)
90
+ });
91
+ break;
92
+ case formModel.FormFieldType.File:
93
+ input = /*#__PURE__*/ jsxRuntime.jsx("input", {
94
+ ...common,
95
+ type: "file",
96
+ onChange: (event)=>set(Array.from(event.target.files ?? []).map((file)=>file.name))
97
+ });
98
+ break;
99
+ case formModel.FormFieldType.Address:
100
+ {
101
+ const lines = typeof value === 'object' && value !== null ? value : {};
102
+ input = /*#__PURE__*/ jsxRuntime.jsx("div", {
103
+ className: "foundation-address",
104
+ role: "group",
105
+ "aria-describedby": describedBy,
106
+ children: formModel.addressLines.map((line)=>/*#__PURE__*/ jsxRuntime.jsx("input", {
107
+ type: "text",
108
+ "aria-label": `${field.label}: ${line}`,
109
+ placeholder: line,
110
+ disabled: readOnly,
111
+ value: lines[line] ?? '',
112
+ onBlur: blur,
113
+ onChange: (event)=>set({
114
+ ...lines,
115
+ [line]: event.target.value
116
+ })
117
+ }, line))
118
+ });
119
+ break;
120
+ }
121
+ case formModel.FormFieldType.Number:
122
+ case formModel.FormFieldType.Currency:
123
+ input = /*#__PURE__*/ jsxRuntime.jsx("input", {
124
+ ...common,
125
+ type: "number",
126
+ inputMode: "decimal",
127
+ value: text,
128
+ placeholder: field.placeholder,
129
+ onChange: (event)=>set(event.target.value === '' ? '' : Number(event.target.value))
130
+ });
131
+ break;
132
+ case formModel.FormFieldType.Date:
133
+ input = /*#__PURE__*/ jsxRuntime.jsx("input", {
134
+ ...common,
135
+ type: "date",
136
+ lang: locale,
137
+ value: text,
138
+ onChange: (event)=>set(event.target.value)
139
+ });
140
+ break;
141
+ default:
142
+ input = /*#__PURE__*/ jsxRuntime.jsx("input", {
143
+ ...common,
144
+ type: "text",
145
+ value: text,
146
+ placeholder: field.placeholder,
147
+ onChange: (event)=>set(event.target.value)
148
+ });
149
+ }
150
+ const grouped = field.type === formModel.FormFieldType.MultiSelect || field.type === formModel.FormFieldType.Address;
151
+ return /*#__PURE__*/ jsxRuntime.jsxs("div", {
152
+ className: "foundation-field",
153
+ style: {
154
+ gridColumn: `span ${field.span}`
155
+ },
156
+ "data-invalid": error ? true : undefined,
157
+ children: [
158
+ grouped ? /*#__PURE__*/ jsxRuntime.jsxs("span", {
159
+ className: "foundation-field-label",
160
+ id: `${id}-label`,
161
+ children: [
162
+ field.label,
163
+ field.required && /*#__PURE__*/ jsxRuntime.jsxs("span", {
164
+ className: "foundation-required",
165
+ title: required,
166
+ children: [
167
+ " *",
168
+ /*#__PURE__*/ jsxRuntime.jsxs("span", {
169
+ className: "foundation-visually-hidden",
170
+ children: [
171
+ " (",
172
+ required,
173
+ ")"
174
+ ]
175
+ })
176
+ ]
177
+ })
178
+ ]
179
+ }) : /*#__PURE__*/ jsxRuntime.jsxs("label", {
180
+ htmlFor: id,
181
+ className: "foundation-field-label",
182
+ children: [
183
+ field.label,
184
+ field.required && /*#__PURE__*/ jsxRuntime.jsxs("span", {
185
+ className: "foundation-required",
186
+ title: required,
187
+ children: [
188
+ " *",
189
+ /*#__PURE__*/ jsxRuntime.jsxs("span", {
190
+ className: "foundation-visually-hidden",
191
+ children: [
192
+ " (",
193
+ required,
194
+ ")"
195
+ ]
196
+ })
197
+ ]
198
+ })
199
+ ]
200
+ }),
201
+ input,
202
+ field.help && /*#__PURE__*/ jsxRuntime.jsx("span", {
203
+ id: `${id}-help`,
204
+ className: "foundation-count",
205
+ children: field.help
206
+ }),
207
+ error && /*#__PURE__*/ jsxRuntime.jsx("span", {
208
+ id: `${id}-error`,
209
+ className: "foundation-field-error",
210
+ role: "alert",
211
+ children: error
212
+ })
213
+ ]
214
+ });
215
+ }
216
+ /**
217
+ * The `formScreenBody` component: titled sections of fields in a one-to-three column grid, validated, with the Save / Save and new / Cancel bar and the
218
+ * unsaved-changes guard.
219
+ *
220
+ * `sections` (`title`, `columns`, `fields`) and `values` come from the screen; a field is `text`, `number`, `currency`, `date`, `select`, `multiSelect`, `lookup`,
221
+ * `toggle`, `file`, `richText` or `address`. Validation is inline on blur and a summary on submit (an alert listing each field as a link back to it); a server's
222
+ * `errors` map onto the fields, and one for a field the form lacks is shown as a general error so it is never lost. Required fields are marked with an asterisk
223
+ * *and* the word. `mode` is `create`, `edit`, `readOnly` or `settings` - settings has one Save for each section. The edited values are the `value` output; Save
224
+ * runs the behaviors attached to the element. While values differ from the saved ones the form says so, warns the browser before the page is left, and offers
225
+ * "Discard changes". The action bar sticks to the bottom as the form scrolls.
226
+ */ function FormScreenBody({ element, interactions, bindingOutputs }) {
227
+ const sections = react.useMemo(()=>formModel.readFormSections(element.properties.sections), [
228
+ element.properties.sections
229
+ ]);
230
+ const mode = formModel.readFormMode(element.properties.mode);
231
+ const suppliedValues = typeof element.properties.values === 'object' && element.properties.values !== null && !Array.isArray(element.properties.values) ? element.properties.values : {};
232
+ const suppliedKey = JSON.stringify(suppliedValues);
233
+ const [saved, setSaved] = react.useState(suppliedValues);
234
+ const [values, setValues] = react.useState(suppliedValues);
235
+ const [touched, setTouched] = react.useState(new Set());
236
+ const [submitted, setSubmitted] = react.useState(false);
237
+ const [justSaved, setJustSaved] = react.useState(false);
238
+ const summary = react.useRef(null);
239
+ const strings = foundationStrings.readFoundationStrings(element);
240
+ const locale = formatting.readLocale(element);
241
+ const state = ComponentState.readComponentState(element, sections.length > 0);
242
+ const readOnly = mode === formModel.FormMode.ReadOnly || PermissionRule.readPermissionRule(element, 'editPermission') !== 'enabled';
243
+ const canSave = PermissionRule.readPermissionRule(element, 'savePermission');
244
+ const problems = formModel.validate(sections, values);
245
+ const server = react.useMemo(()=>formModel.mapServerErrors(sections, element.properties.errors), [
246
+ sections,
247
+ element.properties.errors
248
+ ]);
249
+ const dirty = !formModel.sameValues(values, saved);
250
+ const labelOf = (name)=>sections.flatMap((section)=>section.fields).find((field)=>field.name === name)?.label ?? name;
251
+ const wording = (name, kind)=>foundationStrings.formatText(kind === 'required' ? strings.formRequiredField : strings.formInvalidField, {
252
+ label: labelOf(name)
253
+ });
254
+ const errorOf = (name)=>server.byField[name] ?? ((touched.has(name) || submitted) && problems[name] ? wording(name, problems[name]) : undefined);
255
+ const invalid = Object.keys(problems);
256
+ react.useEffect(()=>{
257
+ setSaved(suppliedValues);
258
+ setValues(suppliedValues);
259
+ setTouched(new Set());
260
+ setSubmitted(false);
261
+ }, [
262
+ suppliedKey
263
+ ]);
264
+ scene_react.useValueOutput(bindingOutputs, values);
265
+ react.useEffect(()=>{
266
+ if (!dirty || typeof window === 'undefined') return;
267
+ const guard = (event)=>{
268
+ event.preventDefault();
269
+ event.returnValue = '';
270
+ };
271
+ window.addEventListener('beforeunload', guard);
272
+ return ()=>window.removeEventListener('beforeunload', guard);
273
+ }, [
274
+ dirty
275
+ ]);
276
+ const submit = (scope)=>{
277
+ setSubmitted(true);
278
+ const scoped = scope ? scope.fields.filter((field)=>problems[field.name]) : invalid.map((name)=>({
279
+ name
280
+ }));
281
+ if (scoped.length > 0) {
282
+ requestAnimationFrame(()=>summary.current?.focus());
283
+ return;
284
+ }
285
+ setSaved(values);
286
+ setJustSaved(true);
287
+ interactions?.onClick?.({
288
+ stopPropagation: ()=>undefined
289
+ });
290
+ };
291
+ const edit = (name, value)=>{
292
+ setValues((current)=>({
293
+ ...current,
294
+ [name]: value
295
+ }));
296
+ setJustSaved(false);
297
+ interactions?.onChange?.();
298
+ };
299
+ return /*#__PURE__*/ jsxRuntime.jsx(StateFrame.FoundationFrame, {
300
+ element: element,
301
+ interactions: interactions,
302
+ name: "form-screen",
303
+ state: state,
304
+ skeleton: [
305
+ 40,
306
+ 100,
307
+ 100,
308
+ 70
309
+ ],
310
+ children: state !== ComponentState.ComponentState.Loading && /*#__PURE__*/ jsxRuntime.jsxs("form", {
311
+ noValidate: true,
312
+ onSubmit: (event)=>{
313
+ event.preventDefault();
314
+ if (mode !== formModel.FormMode.Settings) submit();
315
+ },
316
+ children: [
317
+ readOnly && mode === formModel.FormMode.ReadOnly && /*#__PURE__*/ jsxRuntime.jsx("p", {
318
+ className: "foundation-count",
319
+ role: "status",
320
+ children: strings.formReadOnly
321
+ }),
322
+ (submitted && invalid.length > 0 || server.general.length > 0) && /*#__PURE__*/ jsxRuntime.jsxs("div", {
323
+ ref: summary,
324
+ tabIndex: -1,
325
+ role: "alert",
326
+ className: "foundation-message",
327
+ "data-tone": "danger",
328
+ children: [
329
+ /*#__PURE__*/ jsxRuntime.jsx(FoundationIcon.FoundationIcon, {
330
+ name: "alert"
331
+ }),
332
+ /*#__PURE__*/ jsxRuntime.jsxs("div", {
333
+ className: "foundation-message-text",
334
+ children: [
335
+ /*#__PURE__*/ jsxRuntime.jsx("strong", {
336
+ children: invalid.length === 1 ? strings.formSummaryOne : foundationStrings.formatText(strings.formSummary, {
337
+ count: invalid.length
338
+ })
339
+ }),
340
+ /*#__PURE__*/ jsxRuntime.jsxs("ul", {
341
+ children: [
342
+ invalid.map((name)=>/*#__PURE__*/ jsxRuntime.jsx("li", {
343
+ children: wording(name, problems[name])
344
+ }, name)),
345
+ server.general.map((message)=>/*#__PURE__*/ jsxRuntime.jsx("li", {
346
+ children: message
347
+ }, message))
348
+ ]
349
+ })
350
+ ]
351
+ })
352
+ ]
353
+ }),
354
+ sections.map((section)=>/*#__PURE__*/ jsxRuntime.jsxs("fieldset", {
355
+ className: "foundation-form-section",
356
+ disabled: false,
357
+ children: [
358
+ section.title && /*#__PURE__*/ jsxRuntime.jsx("legend", {
359
+ children: section.title
360
+ }),
361
+ /*#__PURE__*/ jsxRuntime.jsx("div", {
362
+ className: "foundation-form-grid",
363
+ style: {
364
+ gridTemplateColumns: `repeat(${section.columns}, minmax(0, 1fr))`
365
+ },
366
+ "data-columns": section.columns,
367
+ children: section.fields.map((field)=>/*#__PURE__*/ jsxRuntime.jsx(FieldInput, {
368
+ field: field,
369
+ value: values[field.name],
370
+ error: errorOf(field.name),
371
+ readOnly: readOnly,
372
+ locale: locale,
373
+ required: strings.formRequired,
374
+ choose: strings.formChoose,
375
+ set: (value)=>edit(field.name, value),
376
+ blur: ()=>setTouched((current)=>new Set(current).add(field.name))
377
+ }, field.name))
378
+ }),
379
+ mode === formModel.FormMode.Settings && !readOnly && /*#__PURE__*/ jsxRuntime.jsx("div", {
380
+ className: "foundation-form-section-actions",
381
+ children: /*#__PURE__*/ jsxRuntime.jsx(ActionButton.ActionButton, {
382
+ rule: canSave,
383
+ emphasis: "secondary",
384
+ disabledReason: strings.disabledNoPermission,
385
+ onClick: ()=>submit(section),
386
+ children: foundationStrings.formatText(strings.formSectionSave, {
387
+ section: section.title
388
+ })
389
+ })
390
+ })
391
+ ]
392
+ }, section.id)),
393
+ mode !== formModel.FormMode.Settings && mode !== formModel.FormMode.ReadOnly && /*#__PURE__*/ jsxRuntime.jsxs("div", {
394
+ className: "foundation-form-actions",
395
+ role: "group",
396
+ "aria-label": strings.listActions,
397
+ children: [
398
+ /*#__PURE__*/ jsxRuntime.jsx("span", {
399
+ role: "status",
400
+ className: "foundation-count",
401
+ children: dirty ? strings.formUnsaved : justSaved ? strings.formSaved : ''
402
+ }),
403
+ /*#__PURE__*/ jsxRuntime.jsx("span", {
404
+ className: "foundation-wizard-spacer"
405
+ }),
406
+ dirty && /*#__PURE__*/ jsxRuntime.jsx(ActionButton.ActionButton, {
407
+ emphasis: "quiet",
408
+ disabledReason: strings.disabledNoPermission,
409
+ onClick: ()=>{
410
+ setValues(saved);
411
+ setTouched(new Set());
412
+ setSubmitted(false);
413
+ },
414
+ children: strings.formDiscard
415
+ }),
416
+ /*#__PURE__*/ jsxRuntime.jsx(ActionButton.ActionButton, {
417
+ emphasis: "secondary",
418
+ disabledReason: strings.disabledNoPermission,
419
+ onClick: ()=>interactions?.onClick?.({
420
+ stopPropagation: ()=>undefined
421
+ }),
422
+ children: strings.formCancel
423
+ }),
424
+ mode === formModel.FormMode.Create && /*#__PURE__*/ jsxRuntime.jsx(ActionButton.ActionButton, {
425
+ rule: canSave,
426
+ emphasis: "secondary",
427
+ disabledReason: strings.disabledNoPermission,
428
+ onClick: ()=>{
429
+ submit();
430
+ },
431
+ children: strings.formSaveAndNew
432
+ }),
433
+ /*#__PURE__*/ jsxRuntime.jsx(ActionButton.ActionButton, {
434
+ rule: canSave,
435
+ disabledReason: strings.disabledNoPermission,
436
+ onClick: ()=>submit(),
437
+ children: strings.formSave
438
+ })
439
+ ]
440
+ })
441
+ ]
442
+ })
443
+ });
444
+ }
445
+
446
+ exports.FormScreenBody = FormScreenBody;
447
+ //# sourceMappingURL=FormScreenBody.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormScreenBody.js","sources":["../../../foundation/FormScreenBody.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { RegisteredComponentProps, useValueOutput } from '@cratis/scene.react';\nimport { ActionButton } from './ActionButton';\nimport { ComponentState, readComponentState } from './ComponentState';\nimport { FormField, FormFieldType, FormMode, FormSection, FormValues, addressLines, mapServerErrors, readFormMode, readFormSections, sameValues, validate } from './formModel';\nimport { readLocale } from './formatting';\nimport { formatText, readFoundationStrings } from './foundationStrings';\nimport { readPermissionRule } from './PermissionRule';\nimport { FoundationIcon } from './FoundationIcon';\nimport { FoundationFrame } from './StateFrame';\n\ninterface FieldProps {\n field: FormField;\n value: unknown;\n error?: string;\n readOnly: boolean;\n locale: string;\n required: string;\n choose: string;\n set(value: unknown): void;\n blur(): void;\n}\n\nfunction FieldInput({ field, value, error, readOnly, locale, required, choose, set, blur }: FieldProps) {\n const id = useId();\n const describedBy = [field.help ? `${id}-help` : undefined, error ? `${id}-error` : undefined].filter(Boolean).join(' ') || undefined;\n const common = { id, 'aria-invalid': error ? true : undefined, 'aria-required': field.required || undefined, 'aria-describedby': describedBy, disabled: readOnly, onBlur: blur } as const;\n const text = typeof value === 'string' || typeof value === 'number' ? String(value) : '';\n let input;\n\n switch (field.type) {\n case FormFieldType.Toggle:\n input = <input {...common} type='checkbox' role='switch' checked={value === true} onChange={event => set(event.target.checked)} />;\n break;\n case FormFieldType.Select:\n case FormFieldType.Lookup:\n input = <select {...common} value={text} onChange={event => set(event.target.value)}><option value=''>{choose}</option>{field.options.map(option => <option key={option} value={option}>{option}</option>)}</select>;\n break;\n case FormFieldType.MultiSelect:\n input = (\n <fieldset className='foundation-fieldset' aria-describedby={describedBy} disabled={readOnly}>\n {field.options.map(option => (\n <label key={option} className='foundation-check'>\n <input type='checkbox' checked={Array.isArray(value) && value.includes(option)} onBlur={blur}\n onChange={event => set(event.target.checked ? [...(Array.isArray(value) ? value : []), option] : (Array.isArray(value) ? value : []).filter(candidate => candidate !== option))} />\n <span>{option}</span>\n </label>\n ))}\n </fieldset>\n );\n break;\n case FormFieldType.RichText:\n input = <textarea {...common} rows={5} value={text} placeholder={field.placeholder} onChange={event => set(event.target.value)} />;\n break;\n case FormFieldType.File:\n input = <input {...common} type='file' onChange={event => set(Array.from(event.target.files ?? []).map(file => file.name))} />;\n break;\n case FormFieldType.Address: {\n const lines = typeof value === 'object' && value !== null ? (value as Record<string, string>) : {};\n input = (\n <div className='foundation-address' role='group' aria-describedby={describedBy}>\n {addressLines.map(line => (\n <input key={line} type='text' aria-label={`${field.label}: ${line}`} placeholder={line} disabled={readOnly} value={lines[line] ?? ''} onBlur={blur} onChange={event => set({ ...lines, [line]: event.target.value })} />\n ))}\n </div>\n );\n break;\n }\n case FormFieldType.Number:\n case FormFieldType.Currency:\n input = <input {...common} type='number' inputMode='decimal' value={text} placeholder={field.placeholder} onChange={event => set(event.target.value === '' ? '' : Number(event.target.value))} />;\n break;\n case FormFieldType.Date:\n input = <input {...common} type='date' lang={locale} value={text} onChange={event => set(event.target.value)} />;\n break;\n default:\n input = <input {...common} type='text' value={text} placeholder={field.placeholder} onChange={event => set(event.target.value)} />;\n }\n\n const grouped = field.type === FormFieldType.MultiSelect || field.type === FormFieldType.Address;\n return (\n <div className='foundation-field' style={{ gridColumn: `span ${field.span}` }} data-invalid={error ? true : undefined}>\n {grouped ? <span className='foundation-field-label' id={`${id}-label`}>{field.label}{field.required && <span className='foundation-required' title={required}> *<span className='foundation-visually-hidden'> ({required})</span></span>}</span>\n : <label htmlFor={id} className='foundation-field-label'>{field.label}{field.required && <span className='foundation-required' title={required}> *<span className='foundation-visually-hidden'> ({required})</span></span>}</label>}\n {input}\n {field.help && <span id={`${id}-help`} className='foundation-count'>{field.help}</span>}\n {error && <span id={`${id}-error`} className='foundation-field-error' role='alert'>{error}</span>}\n </div>\n );\n}\n\n/**\n * The `formScreenBody` component: titled sections of fields in a one-to-three column grid, validated, with the Save / Save and new / Cancel bar and the\n * unsaved-changes guard.\n *\n * `sections` (`title`, `columns`, `fields`) and `values` come from the screen; a field is `text`, `number`, `currency`, `date`, `select`, `multiSelect`, `lookup`,\n * `toggle`, `file`, `richText` or `address`. Validation is inline on blur and a summary on submit (an alert listing each field as a link back to it); a server's\n * `errors` map onto the fields, and one for a field the form lacks is shown as a general error so it is never lost. Required fields are marked with an asterisk\n * *and* the word. `mode` is `create`, `edit`, `readOnly` or `settings` - settings has one Save for each section. The edited values are the `value` output; Save\n * runs the behaviors attached to the element. While values differ from the saved ones the form says so, warns the browser before the page is left, and offers\n * \"Discard changes\". The action bar sticks to the bottom as the form scrolls.\n */\nexport function FormScreenBody({ element, interactions, bindingOutputs }: RegisteredComponentProps) {\n const sections = useMemo(() => readFormSections(element.properties.sections), [element.properties.sections]);\n const mode = readFormMode(element.properties.mode);\n const suppliedValues = (typeof element.properties.values === 'object' && element.properties.values !== null && !Array.isArray(element.properties.values) ? element.properties.values : {}) as FormValues;\n const suppliedKey = JSON.stringify(suppliedValues);\n const [saved, setSaved] = useState<FormValues>(suppliedValues);\n const [values, setValues] = useState<FormValues>(suppliedValues);\n const [touched, setTouched] = useState<Set<string>>(new Set());\n const [submitted, setSubmitted] = useState(false);\n const [justSaved, setJustSaved] = useState(false);\n const summary = useRef<HTMLDivElement>(null);\n const strings = readFoundationStrings(element);\n const locale = readLocale(element);\n const state = readComponentState(element, sections.length > 0);\n const readOnly = mode === FormMode.ReadOnly || readPermissionRule(element, 'editPermission') !== 'enabled';\n const canSave = readPermissionRule(element, 'savePermission');\n const problems = validate(sections, values);\n const server = useMemo(() => mapServerErrors(sections, element.properties.errors), [sections, element.properties.errors]);\n const dirty = !sameValues(values, saved);\n const labelOf = (name: string) => sections.flatMap(section => section.fields).find(field => field.name === name)?.label ?? name;\n const wording = (name: string, kind: 'required' | 'invalid') => formatText(kind === 'required' ? strings.formRequiredField : strings.formInvalidField, { label: labelOf(name) });\n const errorOf = (name: string) => server.byField[name] ?? ((touched.has(name) || submitted) && problems[name] ? wording(name, problems[name]) : undefined);\n const invalid = Object.keys(problems);\n\n useEffect(() => { setSaved(suppliedValues); setValues(suppliedValues); setTouched(new Set()); setSubmitted(false); }, [suppliedKey]);\n useValueOutput(bindingOutputs, values);\n useEffect(() => {\n if (!dirty || typeof window === 'undefined') return;\n const guard = (event: BeforeUnloadEvent) => { event.preventDefault(); event.returnValue = ''; };\n window.addEventListener('beforeunload', guard);\n return () => window.removeEventListener('beforeunload', guard);\n }, [dirty]);\n\n const submit = (scope?: FormSection) => {\n setSubmitted(true);\n const scoped = scope ? scope.fields.filter(field => problems[field.name]) : invalid.map(name => ({ name }));\n if (scoped.length > 0) { requestAnimationFrame(() => summary.current?.focus()); return; }\n setSaved(values);\n setJustSaved(true);\n interactions?.onClick?.({ stopPropagation: () => undefined });\n };\n const edit = (name: string, value: unknown) => { setValues(current => ({ ...current, [name]: value })); setJustSaved(false); interactions?.onChange?.(); };\n\n return (\n <FoundationFrame element={element} interactions={interactions} name='form-screen' state={state} skeleton={[40, 100, 100, 70]}>\n {state !== ComponentState.Loading && (\n <form noValidate onSubmit={event => { event.preventDefault(); if (mode !== FormMode.Settings) submit(); }}>\n {readOnly && mode === FormMode.ReadOnly && <p className='foundation-count' role='status'>{strings.formReadOnly}</p>}\n {(submitted && invalid.length > 0 || server.general.length > 0) && (\n <div ref={summary} tabIndex={-1} role='alert' className='foundation-message' data-tone='danger'>\n <FoundationIcon name='alert' />\n <div className='foundation-message-text'>\n <strong>{invalid.length === 1 ? strings.formSummaryOne : formatText(strings.formSummary, { count: invalid.length })}</strong>\n <ul>\n {invalid.map(name => <li key={name}>{wording(name, problems[name])}</li>)}\n {server.general.map(message => <li key={message}>{message}</li>)}\n </ul>\n </div>\n </div>\n )}\n {sections.map(section => (\n <fieldset key={section.id} className='foundation-form-section' disabled={false}>\n {section.title && <legend>{section.title}</legend>}\n <div className='foundation-form-grid' style={{ gridTemplateColumns: `repeat(${section.columns}, minmax(0, 1fr))` }} data-columns={section.columns}>\n {section.fields.map(field => (\n <FieldInput key={field.name} field={field} value={values[field.name]} error={errorOf(field.name)} readOnly={readOnly} locale={locale} required={strings.formRequired} choose={strings.formChoose}\n set={value => edit(field.name, value)} blur={() => setTouched(current => new Set(current).add(field.name))} />\n ))}\n </div>\n {mode === FormMode.Settings && !readOnly && (\n <div className='foundation-form-section-actions'>\n <ActionButton rule={canSave} emphasis='secondary' disabledReason={strings.disabledNoPermission} onClick={() => submit(section)}>{formatText(strings.formSectionSave, { section: section.title })}</ActionButton>\n </div>\n )}\n </fieldset>\n ))}\n {mode !== FormMode.Settings && mode !== FormMode.ReadOnly && (\n <div className='foundation-form-actions' role='group' aria-label={strings.listActions}>\n <span role='status' className='foundation-count'>{dirty ? strings.formUnsaved : justSaved ? strings.formSaved : ''}</span>\n <span className='foundation-wizard-spacer' />\n {dirty && <ActionButton emphasis='quiet' disabledReason={strings.disabledNoPermission} onClick={() => { setValues(saved); setTouched(new Set()); setSubmitted(false); }}>{strings.formDiscard}</ActionButton>}\n <ActionButton emphasis='secondary' disabledReason={strings.disabledNoPermission} onClick={() => interactions?.onClick?.({ stopPropagation: () => undefined })}>{strings.formCancel}</ActionButton>\n {mode === FormMode.Create && <ActionButton rule={canSave} emphasis='secondary' disabledReason={strings.disabledNoPermission} onClick={() => { submit(); }}>{strings.formSaveAndNew}</ActionButton>}\n <ActionButton rule={canSave} disabledReason={strings.disabledNoPermission} onClick={() => submit()}>{strings.formSave}</ActionButton>\n </div>\n )}\n </form>\n )}\n </FoundationFrame>\n );\n}\n"],"names":["FieldInput","field","value","error","readOnly","locale","required","choose","set","blur","id","useId","describedBy","help","undefined","filter","Boolean","join","common","disabled","onBlur","text","String","input","type","FormFieldType","Toggle","_jsx","role","checked","onChange","event","target","Select","Lookup","_jsxs","select","option","options","map","MultiSelect","fieldset","className","aria-describedby","label","Array","isArray","includes","candidate","span","RichText","textarea","rows","placeholder","File","from","files","file","name","Address","lines","div","addressLines","line","aria-label","Number","Currency","inputMode","Date","lang","grouped","style","gridColumn","data-invalid","title","htmlFor","FormScreenBody","element","interactions","bindingOutputs","sections","useMemo","readFormSections","properties","mode","readFormMode","suppliedValues","values","suppliedKey","JSON","stringify","saved","setSaved","useState","setValues","touched","setTouched","Set","submitted","setSubmitted","justSaved","setJustSaved","summary","useRef","strings","readFoundationStrings","readLocale","state","readComponentState","length","FormMode","ReadOnly","readPermissionRule","canSave","problems","validate","server","mapServerErrors","errors","dirty","sameValues","labelOf","flatMap","section","fields","find","wording","kind","formatText","formRequiredField","formInvalidField","errorOf","byField","has","invalid","Object","keys","useEffect","useValueOutput","window","guard","preventDefault","returnValue","addEventListener","removeEventListener","submit","scope","scoped","requestAnimationFrame","current","focus","onClick","stopPropagation","edit","FoundationFrame","skeleton","ComponentState","Loading","form","noValidate","onSubmit","Settings","p","formReadOnly","general","ref","tabIndex","data-tone","FoundationIcon","strong","formSummaryOne","formSummary","count","ul","li","message","legend","gridTemplateColumns","columns","data-columns","formRequired","formChoose","add","ActionButton","rule","emphasis","disabledReason","disabledNoPermission","formSectionSave","listActions","formUnsaved","formSaved","formDiscard","formCancel","Create","formSaveAndNew","formSave"],"mappings":";;;;;;;;;;;;;;AA0BA,SAASA,WAAW,EAAEC,KAAK,EAAEC,KAAK,EAAEC,KAAK,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,GAAG,EAAEC,IAAI,EAAc,EAAA;AAClG,IAAA,MAAMC,EAAAA,GAAKC,WAAAA,EAAAA;AACX,IAAA,MAAMC,WAAAA,GAAc;AAACX,QAAAA,KAAAA,CAAMY,IAAI,GAAG,CAAA,EAAGH,EAAAA,CAAG,KAAK,CAAC,GAAGI,SAAAA;AAAWX,QAAAA,KAAAA,GAAQ,CAAA,EAAGO,EAAAA,CAAG,MAAM,CAAC,GAAGI;AAAU,KAAA,CAACC,MAAM,CAACC,OAAAA,CAAAA,CAASC,IAAI,CAAC,GAAA,CAAA,IAAQH,SAAAA;AAC5H,IAAA,MAAMI,MAAAA,GAAS;AAAER,QAAAA,EAAAA;AAAI,QAAA,cAAA,EAAgBP,QAAQ,IAAA,GAAOW,SAAAA;QAAW,eAAA,EAAiBb,KAAAA,CAAMK,QAAQ,IAAIQ,SAAAA;QAAW,kBAAA,EAAoBF,WAAAA;QAAaO,QAAAA,EAAUf,QAAAA;QAAUgB,MAAAA,EAAQX;AAAK,KAAA;IAC/K,MAAMY,IAAAA,GAAO,OAAOnB,KAAAA,KAAU,QAAA,IAAY,OAAOA,KAAAA,KAAU,QAAA,GAAWoB,OAAOpB,KAAAA,CAAAA,GAAS,EAAA;IACtF,IAAIqB,KAAAA;AAEJ,IAAA,OAAQtB,MAAMuB,IAAI;AACd,QAAA,KAAKC,wBAAcC,MAAM;AACrBH,YAAAA,KAAAA,iBAAQI,cAAA,CAACJ,OAAAA,EAAAA;AAAO,gBAAA,GAAGL,MAAM;gBAAEM,IAAAA,EAAK,UAAA;gBAAWI,IAAAA,EAAK,QAAA;AAASC,gBAAAA,OAAAA,EAAS3B,KAAAA,KAAU,IAAA;AAAM4B,gBAAAA,QAAAA,EAAUC,CAAAA,KAAAA,GAASvB,GAAAA,CAAIuB,KAAAA,CAAMC,MAAM,CAACH,OAAO;;AAC7H,YAAA;AACJ,QAAA,KAAKJ,wBAAcQ,MAAM;AACzB,QAAA,KAAKR,wBAAcS,MAAM;AACrBX,YAAAA,KAAAA,iBAAQY,eAAA,CAACC,QAAAA,EAAAA;AAAQ,gBAAA,GAAGlB,MAAM;gBAAEhB,KAAAA,EAAOmB,IAAAA;AAAMS,gBAAAA,QAAAA,EAAUC,CAAAA,KAAAA,GAASvB,GAAAA,CAAIuB,KAAAA,CAAMC,MAAM,CAAC9B,KAAK,CAAA;;kCAAGyB,cAAA,CAACU,QAAAA,EAAAA;wBAAOnC,KAAAA,EAAM,EAAA;AAAIK,wBAAAA,QAAAA,EAAAA;;AAAiBN,oBAAAA,KAAAA,CAAMqC,OAAO,CAACC,GAAG,CAACF,CAAAA,uBAAUV,cAAA,CAACU,QAAAA,EAAAA;4BAAoBnC,KAAAA,EAAOmC,MAAAA;AAASA,4BAAAA,QAAAA,EAAAA;AAAxBA,yBAAAA,EAAAA,MAAAA,CAAAA;;;AACjK,YAAA;AACJ,QAAA,KAAKZ,wBAAce,WAAW;AAC1BjB,YAAAA,KAAAA,iBACII,cAAA,CAACc,UAAAA,EAAAA;gBAASC,SAAAA,EAAU,qBAAA;gBAAsBC,kBAAAA,EAAkB/B,WAAAA;gBAAaO,QAAAA,EAAUf,QAAAA;AAC9EH,gBAAAA,QAAAA,EAAAA,KAAAA,CAAMqC,OAAO,CAACC,GAAG,CAACF,CAAAA,uBACfF,eAAA,CAACS,OAAAA,EAAAA;wBAAmBF,SAAAA,EAAU,kBAAA;;0CAC1Bf,cAAA,CAACJ,OAAAA,EAAAA;gCAAMC,IAAAA,EAAK,UAAA;AAAWK,gCAAAA,OAAAA,EAASgB,MAAMC,OAAO,CAAC5C,KAAAA,CAAAA,IAAUA,KAAAA,CAAM6C,QAAQ,CAACV,MAAAA,CAAAA;gCAASjB,MAAAA,EAAQX,IAAAA;AACpFqB,gCAAAA,QAAAA,EAAUC,CAAAA,KAAAA,GAASvB,GAAAA,CAAIuB,MAAMC,MAAM,CAACH,OAAO,GAAG;AAAKgB,wCAAAA,GAAAA,KAAAA,CAAMC,OAAO,CAAC5C,KAAAA,CAAAA,GAASA,KAAAA,GAAQ,EAAE;AAAGmC,wCAAAA;AAAO,qCAAA,GAAG,CAACQ,KAAAA,CAAMC,OAAO,CAAC5C,KAAAA,CAAAA,GAASA,KAAAA,GAAQ,EAAC,EAAGa,MAAM,CAACiC,CAAAA,YAAaA,SAAAA,KAAcX,MAAAA,CAAAA;;0CAC3KV,cAAA,CAACsB,MAAAA,EAAAA;AAAMZ,gCAAAA,QAAAA,EAAAA;;;AAHCA,qBAAAA,EAAAA,MAAAA,CAAAA;;AAQxB,YAAA;AACJ,QAAA,KAAKZ,wBAAcyB,QAAQ;AACvB3B,YAAAA,KAAAA,iBAAQI,cAAA,CAACwB,UAAAA,EAAAA;AAAU,gBAAA,GAAGjC,MAAM;gBAAEkC,IAAAA,EAAM,CAAA;gBAAGlD,KAAAA,EAAOmB,IAAAA;AAAMgC,gBAAAA,WAAAA,EAAapD,MAAMoD,WAAW;AAAEvB,gBAAAA,QAAAA,EAAUC,CAAAA,KAAAA,GAASvB,GAAAA,CAAIuB,KAAAA,CAAMC,MAAM,CAAC9B,KAAK;;AAC7H,YAAA;AACJ,QAAA,KAAKuB,wBAAc6B,IAAI;AACnB/B,YAAAA,KAAAA,iBAAQI,cAAA,CAACJ,OAAAA,EAAAA;AAAO,gBAAA,GAAGL,MAAM;gBAAEM,IAAAA,EAAK,MAAA;AAAOM,gBAAAA,QAAAA,EAAUC,CAAAA,KAAAA,GAASvB,GAAAA,CAAIqC,MAAMU,IAAI,CAACxB,MAAMC,MAAM,CAACwB,KAAK,IAAI,EAAE,CAAA,CAAEjB,GAAG,CAACkB,CAAAA,IAAAA,GAAQA,KAAKC,IAAI,CAAA;;AACxH,YAAA;AACJ,QAAA,KAAKjC,wBAAckC,OAAO;AAAE,YAAA;AACxB,gBAAA,MAAMC,QAAQ,OAAO1D,KAAAA,KAAU,YAAYA,KAAAA,KAAU,IAAA,GAAQA,QAAmC,EAAC;AACjGqB,gBAAAA,KAAAA,iBACII,cAAA,CAACkC,KAAAA,EAAAA;oBAAInB,SAAAA,EAAU,oBAAA;oBAAqBd,IAAAA,EAAK,OAAA;oBAAQe,kBAAAA,EAAkB/B,WAAAA;AAC9DkD,oBAAAA,QAAAA,EAAAA,sBAAAA,CAAavB,GAAG,CAACwB,CAAAA,IAAAA,iBACdpC,cAAA,CAACJ,OAAAA,EAAAA;4BAAiBC,IAAAA,EAAK,MAAA;AAAOwC,4BAAAA,YAAAA,EAAY,GAAG/D,KAAAA,CAAM2C,KAAK,CAAC,EAAE,EAAEmB,IAAAA,CAAAA,CAAM;4BAAEV,WAAAA,EAAaU,IAAAA;4BAAM5C,QAAAA,EAAUf,QAAAA;4BAAUF,KAAAA,EAAO0D,KAAK,CAACG,IAAAA,CAAK,IAAI,EAAA;4BAAI3C,MAAAA,EAAQX,IAAAA;4BAAMqB,QAAAA,EAAUC,CAAAA,QAASvB,GAAAA,CAAI;AAAE,oCAAA,GAAGoD,KAAK;AAAE,oCAAA,CAACG,IAAAA,GAAOhC,KAAAA,CAAMC,MAAM,CAAC9B;AAAM,iCAAA;AAAtM6D,yBAAAA,EAAAA,IAAAA,CAAAA;;AAIxB,gBAAA;AACJ,YAAA;AACA,QAAA,KAAKtC,wBAAcwC,MAAM;AACzB,QAAA,KAAKxC,wBAAcyC,QAAQ;AACvB3C,YAAAA,KAAAA,iBAAQI,cAAA,CAACJ,OAAAA,EAAAA;AAAO,gBAAA,GAAGL,MAAM;gBAAEM,IAAAA,EAAK,QAAA;gBAAS2C,SAAAA,EAAU,SAAA;gBAAUjE,KAAAA,EAAOmB,IAAAA;AAAMgC,gBAAAA,WAAAA,EAAapD,MAAMoD,WAAW;AAAEvB,gBAAAA,QAAAA,EAAUC,CAAAA,KAAAA,GAASvB,GAAAA,CAAIuB,KAAAA,CAAMC,MAAM,CAAC9B,KAAK,KAAK,EAAA,GAAK,EAAA,GAAK+D,MAAAA,CAAOlC,KAAAA,CAAMC,MAAM,CAAC9B,KAAK,CAAA;;AAC3L,YAAA;AACJ,QAAA,KAAKuB,wBAAc2C,IAAI;AACnB7C,YAAAA,KAAAA,iBAAQI,cAAA,CAACJ,OAAAA,EAAAA;AAAO,gBAAA,GAAGL,MAAM;gBAAEM,IAAAA,EAAK,MAAA;gBAAO6C,IAAAA,EAAMhE,MAAAA;gBAAQH,KAAAA,EAAOmB,IAAAA;AAAMS,gBAAAA,QAAAA,EAAUC,CAAAA,KAAAA,GAASvB,GAAAA,CAAIuB,KAAAA,CAAMC,MAAM,CAAC9B,KAAK;;AAC3G,YAAA;AACJ,QAAA;AACIqB,YAAAA,KAAAA,iBAAQI,cAAA,CAACJ,OAAAA,EAAAA;AAAO,gBAAA,GAAGL,MAAM;gBAAEM,IAAAA,EAAK,MAAA;gBAAOtB,KAAAA,EAAOmB,IAAAA;AAAMgC,gBAAAA,WAAAA,EAAapD,MAAMoD,WAAW;AAAEvB,gBAAAA,QAAAA,EAAUC,CAAAA,KAAAA,GAASvB,GAAAA,CAAIuB,KAAAA,CAAMC,MAAM,CAAC9B,KAAK;;AACrI;IAEA,MAAMoE,OAAAA,GAAUrE,KAAAA,CAAMuB,IAAI,KAAKC,uBAAAA,CAAce,WAAW,IAAIvC,KAAAA,CAAMuB,IAAI,KAAKC,uBAAAA,CAAckC,OAAO;AAChG,IAAA,qBACIxB,eAAA,CAAC0B,KAAAA,EAAAA;QAAInB,SAAAA,EAAU,kBAAA;QAAmB6B,KAAAA,EAAO;AAAEC,YAAAA,UAAAA,EAAY,CAAC,KAAK,EAAEvE,KAAAA,CAAMgD,IAAI,CAAA;AAAG,SAAA;AAAGwB,QAAAA,cAAAA,EAActE,QAAQ,IAAA,GAAOW,SAAAA;;AACvGwD,YAAAA,OAAAA,iBAAUnC,eAAA,CAACc,MAAAA,EAAAA;gBAAKP,SAAAA,EAAU,wBAAA;gBAAyBhC,EAAAA,EAAI,CAAA,EAAGA,EAAAA,CAAG,MAAM,CAAC;;AAAGT,oBAAAA,KAAAA,CAAM2C,KAAK;oBAAE3C,KAAAA,CAAMK,QAAQ,kBAAI6B,eAAA,CAACc,MAAAA,EAAAA;wBAAKP,SAAAA,EAAU,qBAAA;wBAAsBgC,KAAAA,EAAOpE,QAAAA;;AAAU,4BAAA,IAAA;0CAAE6B,eAAA,CAACc,MAAAA,EAAAA;gCAAKP,SAAAA,EAAU,4BAAA;;AAA6B,oCAAA,IAAA;AAAGpC,oCAAAA,QAAAA;AAAS,oCAAA;;;;;;+BACnN6B,eAAA,CAACS,OAAAA,EAAAA;gBAAM+B,OAAAA,EAASjE,EAAAA;gBAAIgC,SAAAA,EAAU,wBAAA;;AAA0BzC,oBAAAA,KAAAA,CAAM2C,KAAK;oBAAE3C,KAAAA,CAAMK,QAAQ,kBAAI6B,eAAA,CAACc,MAAAA,EAAAA;wBAAKP,SAAAA,EAAU,qBAAA;wBAAsBgC,KAAAA,EAAOpE,QAAAA;;AAAU,4BAAA,IAAA;0CAAE6B,eAAA,CAACc,MAAAA,EAAAA;gCAAKP,SAAAA,EAAU,4BAAA;;AAA6B,oCAAA,IAAA;AAAGpC,oCAAAA,QAAAA;AAAS,oCAAA;;;;;;;AAC9MiB,YAAAA,KAAAA;YACAtB,KAAAA,CAAMY,IAAI,kBAAIc,cAAA,CAACsB,MAAAA,EAAAA;gBAAKvC,EAAAA,EAAI,CAAA,EAAGA,EAAAA,CAAG,KAAK,CAAC;gBAAEgC,SAAAA,EAAU,kBAAA;AAAoBzC,gBAAAA,QAAAA,EAAAA,KAAAA,CAAMY;;AAC1EV,YAAAA,KAAAA,kBAASwB,cAAA,CAACsB,MAAAA,EAAAA;gBAAKvC,EAAAA,EAAI,CAAA,EAAGA,EAAAA,CAAG,MAAM,CAAC;gBAAEgC,SAAAA,EAAU,wBAAA;gBAAyBd,IAAAA,EAAK,OAAA;AAASzB,gBAAAA,QAAAA,EAAAA;;;;AAGhG;AAEA;;;;;;;;;;IAWO,SAASyE,cAAAA,CAAe,EAAEC,OAAO,EAAEC,YAAY,EAAEC,cAAc,EAA4B,EAAA;IAC9F,MAAMC,QAAAA,GAAWC,cAAQ,IAAMC,0BAAAA,CAAiBL,QAAQM,UAAU,CAACH,QAAQ,CAAA,EAAG;QAACH,OAAAA,CAAQM,UAAU,CAACH;AAAS,KAAA,CAAA;AAC3G,IAAA,MAAMI,IAAAA,GAAOC,sBAAAA,CAAaR,OAAAA,CAAQM,UAAU,CAACC,IAAI,CAAA;AACjD,IAAA,MAAME,cAAAA,GAAkB,OAAOT,OAAAA,CAAQM,UAAU,CAACI,MAAM,KAAK,QAAA,IAAYV,OAAAA,CAAQM,UAAU,CAACI,MAAM,KAAK,IAAA,IAAQ,CAAC1C,KAAAA,CAAMC,OAAO,CAAC+B,OAAAA,CAAQM,UAAU,CAACI,MAAM,CAAA,GAAIV,OAAAA,CAAQM,UAAU,CAACI,MAAM,GAAG,EAAC;IACxL,MAAMC,WAAAA,GAAcC,IAAAA,CAAKC,SAAS,CAACJ,cAAAA,CAAAA;AACnC,IAAA,MAAM,CAACK,KAAAA,EAAOC,QAAAA,CAAS,GAAGC,cAAAA,CAAqBP,cAAAA,CAAAA;AAC/C,IAAA,MAAM,CAACC,MAAAA,EAAQO,SAAAA,CAAU,GAAGD,cAAAA,CAAqBP,cAAAA,CAAAA;AACjD,IAAA,MAAM,CAACS,OAAAA,EAASC,UAAAA,CAAW,GAAGH,eAAsB,IAAII,GAAAA,EAAAA,CAAAA;AACxD,IAAA,MAAM,CAACC,SAAAA,EAAWC,YAAAA,CAAa,GAAGN,cAAAA,CAAS,KAAA,CAAA;AAC3C,IAAA,MAAM,CAACO,SAAAA,EAAWC,YAAAA,CAAa,GAAGR,cAAAA,CAAS,KAAA,CAAA;AAC3C,IAAA,MAAMS,UAAUC,YAAAA,CAAuB,IAAA,CAAA;AACvC,IAAA,MAAMC,UAAUC,uCAAAA,CAAsB5B,OAAAA,CAAAA;AACtC,IAAA,MAAMxE,SAASqG,qBAAAA,CAAW7B,OAAAA,CAAAA;AAC1B,IAAA,MAAM8B,KAAAA,GAAQC,iCAAAA,CAAmB/B,OAAAA,EAASG,QAAAA,CAAS6B,MAAM,GAAG,CAAA,CAAA;AAC5D,IAAA,MAAMzG,WAAWgF,IAAAA,KAAS0B,kBAAAA,CAASC,QAAQ,IAAIC,iCAAAA,CAAmBnC,SAAS,gBAAA,CAAA,KAAsB,SAAA;IACjG,MAAMoC,OAAAA,GAAUD,kCAAmBnC,OAAAA,EAAS,gBAAA,CAAA;IAC5C,MAAMqC,QAAAA,GAAWC,mBAASnC,QAAAA,EAAUO,MAAAA,CAAAA;IACpC,MAAM6B,MAAAA,GAASnC,cAAQ,IAAMoC,yBAAAA,CAAgBrC,UAAUH,OAAAA,CAAQM,UAAU,CAACmC,MAAM,CAAA,EAAG;AAACtC,QAAAA,QAAAA;QAAUH,OAAAA,CAAQM,UAAU,CAACmC;AAAO,KAAA,CAAA;IACxH,MAAMC,KAAAA,GAAQ,CAACC,oBAAAA,CAAWjC,MAAAA,EAAQI,KAAAA,CAAAA;AAClC,IAAA,MAAM8B,UAAU,CAAC/D,IAAAA,GAAiBsB,SAAS0C,OAAO,CAACC,CAAAA,OAAAA,GAAWA,OAAAA,CAAQC,MAAM,CAAA,CAAEC,IAAI,CAAC5H,CAAAA,KAAAA,GAASA,MAAMyD,IAAI,KAAKA,OAAOd,KAAAA,IAASc,IAAAA;AAC3H,IAAA,MAAMoE,OAAAA,GAAU,CAACpE,IAAAA,EAAcqE,IAAAA,GAAiCC,4BAAAA,CAAWD,IAAAA,KAAS,UAAA,GAAavB,OAAAA,CAAQyB,iBAAiB,GAAGzB,OAAAA,CAAQ0B,gBAAgB,EAAE;AAAEtF,YAAAA,KAAAA,EAAO6E,OAAAA,CAAQ/D,IAAAA;AAAM,SAAA,CAAA;IAC9K,MAAMyE,OAAAA,GAAU,CAACzE,IAAAA,GAAiB0D,MAAAA,CAAOgB,OAAO,CAAC1E,IAAAA,CAAK,KAAK,CAACqC,OAAAA,CAAQsC,GAAG,CAAC3E,IAAAA,CAAAA,IAASwC,SAAQ,KAAMgB,QAAQ,CAACxD,IAAAA,CAAK,GAAGoE,OAAAA,CAAQpE,IAAAA,EAAMwD,QAAQ,CAACxD,IAAAA,CAAK,CAAA,GAAI5C,SAAQ,CAAA;IACxJ,MAAMwH,OAAAA,GAAUC,MAAAA,CAAOC,IAAI,CAACtB,QAAAA,CAAAA;IAE5BuB,eAAAA,CAAU,IAAA;QAAQ7C,QAAAA,CAASN,cAAAA,CAAAA;QAAiBQ,SAAAA,CAAUR,cAAAA,CAAAA;AAAiBU,QAAAA,UAAAA,CAAW,IAAIC,GAAAA,EAAAA,CAAAA;QAAQE,YAAAA,CAAa,KAAA,CAAA;IAAQ,CAAA,EAAG;AAACX,QAAAA;AAAY,KAAA,CAAA;AACnIkD,IAAAA,0BAAAA,CAAe3D,cAAAA,EAAgBQ,MAAAA,CAAAA;IAC/BkD,eAAAA,CAAU,IAAA;AACN,QAAA,IAAI,CAAClB,KAAAA,IAAS,OAAOoB,MAAAA,KAAW,WAAA,EAAa;AAC7C,QAAA,MAAMC,QAAQ,CAAC7G,KAAAA,GAAAA;AAA+BA,YAAAA,KAAAA,CAAM8G,cAAc,EAAA;AAAI9G,YAAAA,KAAAA,CAAM+G,WAAW,GAAG,EAAA;AAAI,QAAA,CAAA;QAC9FH,MAAAA,CAAOI,gBAAgB,CAAC,cAAA,EAAgBH,KAAAA,CAAAA;AACxC,QAAA,OAAO,IAAMD,MAAAA,CAAOK,mBAAmB,CAAC,cAAA,EAAgBJ,KAAAA,CAAAA;IAC5D,CAAA,EAAG;AAACrB,QAAAA;AAAM,KAAA,CAAA;AAEV,IAAA,MAAM0B,SAAS,CAACC,KAAAA,GAAAA;QACZ/C,YAAAA,CAAa,IAAA,CAAA;QACb,MAAMgD,MAAAA,GAASD,QAAQA,KAAAA,CAAMtB,MAAM,CAAC7G,MAAM,CAACd,CAAAA,KAAAA,GAASiH,QAAQ,CAACjH,KAAAA,CAAMyD,IAAI,CAAC,CAAA,GAAI4E,OAAAA,CAAQ/F,GAAG,CAACmB,CAAAA,QAAS;AAAEA,gBAAAA;aAAK,CAAA,CAAA;QACxG,IAAIyF,MAAAA,CAAOtC,MAAM,GAAG,CAAA,EAAG;YAAEuC,qBAAAA,CAAsB,IAAM9C,OAAAA,CAAQ+C,OAAO,EAAEC,KAAAA,EAAAA,CAAAA;AAAU,YAAA;AAAQ,QAAA;QACxF1D,QAAAA,CAASL,MAAAA,CAAAA;QACTc,YAAAA,CAAa,IAAA,CAAA;AACbvB,QAAAA,YAAAA,EAAcyE,OAAAA,GAAU;AAAEC,YAAAA,eAAAA,EAAiB,IAAM1I;AAAU,SAAA,CAAA;AAC/D,IAAA,CAAA;IACA,MAAM2I,IAAAA,GAAO,CAAC/F,IAAAA,EAAcxD,KAAAA,GAAAA;QAAqB4F,SAAAA,CAAUuD,CAAAA,WAAY;AAAE,gBAAA,GAAGA,OAAO;AAAE,gBAAA,CAAC3F,OAAOxD;aAAM,CAAA,CAAA;QAAKmG,YAAAA,CAAa,KAAA,CAAA;QAAQvB,YAAAA,EAAchD,QAAAA,IAAAA;AAAc,IAAA,CAAA;AAEzJ,IAAA,qBACIH,cAAA,CAAC+H,0BAAAA,EAAAA;QAAgB7E,OAAAA,EAASA,OAAAA;QAASC,YAAAA,EAAcA,YAAAA;QAAcpB,IAAAA,EAAK,aAAA;QAAciD,KAAAA,EAAOA,KAAAA;QAAOgD,QAAAA,EAAU;AAAC,YAAA,EAAA;AAAI,YAAA,GAAA;AAAK,YAAA,GAAA;AAAK,YAAA;AAAG,SAAA;kBACvHhD,KAAAA,KAAUiD,6BAAAA,CAAeC,OAAO,kBAC7B1H,eAAA,CAAC2H,MAAAA,EAAAA;YAAKC,UAAU,EAAA,IAAA;AAACC,YAAAA,QAAAA,EAAUjI,CAAAA,KAAAA,GAAAA;AAAWA,gBAAAA,KAAAA,CAAM8G,cAAc,EAAA;gBAAI,IAAIzD,IAAAA,KAAS0B,kBAAAA,CAASmD,QAAQ,EAAEhB,MAAAA,EAAAA;AAAU,YAAA,CAAA;;AACnG7I,gBAAAA,QAAAA,IAAYgF,IAAAA,KAAS0B,kBAAAA,CAASC,QAAQ,kBAAIpF,cAAA,CAACuI,GAAAA,EAAAA;oBAAExH,SAAAA,EAAU,kBAAA;oBAAmBd,IAAAA,EAAK,QAAA;AAAU4E,oBAAAA,QAAAA,EAAAA,OAAAA,CAAQ2D;;AAChGjE,gBAAAA,CAAAA,SAAAA,IAAaoC,OAAAA,CAAQzB,MAAM,GAAG,CAAA,IAAKO,MAAAA,CAAOgD,OAAO,CAACvD,MAAM,GAAG,CAAA,mBACzD1E,eAAA,CAAC0B,KAAAA,EAAAA;oBAAIwG,GAAAA,EAAK/D,OAAAA;AAASgE,oBAAAA,QAAAA,EAAU,EAAC;oBAAG1I,IAAAA,EAAK,OAAA;oBAAQc,SAAAA,EAAU,oBAAA;oBAAqB6H,WAAAA,EAAU,QAAA;;sCACnF5I,cAAA,CAAC6I,6BAAAA,EAAAA;4BAAe9G,IAAAA,EAAK;;sCACrBvB,eAAA,CAAC0B,KAAAA,EAAAA;4BAAInB,SAAAA,EAAU,yBAAA;;8CACXf,cAAA,CAAC8I,QAAAA,EAAAA;8CAAQnC,OAAAA,CAAQzB,MAAM,KAAK,CAAA,GAAIL,OAAAA,CAAQkE,cAAc,GAAG1C,4BAAAA,CAAWxB,OAAAA,CAAQmE,WAAW,EAAE;AAAEC,wCAAAA,KAAAA,EAAOtC,QAAQzB;AAAO,qCAAA;;8CACjH1E,eAAA,CAAC0I,IAAAA,EAAAA;;AACIvC,wCAAAA,OAAAA,CAAQ/F,GAAG,CAACmB,CAAAA,IAAAA,iBAAQ/B,cAAA,CAACmJ,IAAAA,EAAAA;0DAAehD,OAAAA,CAAQpE,IAAAA,EAAMwD,QAAQ,CAACxD,IAAAA,CAAK;AAAnCA,6CAAAA,EAAAA,IAAAA,CAAAA,CAAAA;AAC7B0D,wCAAAA,MAAAA,CAAOgD,OAAO,CAAC7H,GAAG,CAACwI,CAAAA,wBAAWpJ,cAAA,CAACmJ,IAAAA,EAAAA;AAAkBC,gDAAAA,QAAAA,EAAAA;AAAVA,6CAAAA,EAAAA,OAAAA,CAAAA;;;;;;;AAKvD/F,gBAAAA,QAAAA,CAASzC,GAAG,CAACoF,CAAAA,OAAAA,iBACVxF,eAAA,CAACM,UAAAA,EAAAA;wBAA0BC,SAAAA,EAAU,yBAAA;wBAA0BvB,QAAAA,EAAU,KAAA;;4BACpEwG,OAAAA,CAAQjD,KAAK,kBAAI/C,cAAA,CAACqJ,QAAAA,EAAAA;AAAQrD,gCAAAA,QAAAA,EAAAA,OAAAA,CAAQjD;;0CACnC/C,cAAA,CAACkC,KAAAA,EAAAA;gCAAInB,SAAAA,EAAU,sBAAA;gCAAuB6B,KAAAA,EAAO;AAAE0G,oCAAAA,mBAAAA,EAAqB,CAAC,OAAO,EAAEtD,QAAQuD,OAAO,CAAC,iBAAiB;AAAE,iCAAA;AAAGC,gCAAAA,cAAAA,EAAcxD,QAAQuD,OAAO;AAC5IvD,gCAAAA,QAAAA,EAAAA,OAAAA,CAAQC,MAAM,CAACrF,GAAG,CAACtC,CAAAA,sBAChB0B,cAAA,CAAC3B,UAAAA,EAAAA;wCAA4BC,KAAAA,EAAOA,KAAAA;AAAOC,wCAAAA,KAAAA,EAAOqF,MAAM,CAACtF,KAAAA,CAAMyD,IAAI,CAAC;wCAAEvD,KAAAA,EAAOgI,OAAAA,CAAQlI,MAAMyD,IAAI,CAAA;wCAAGtD,QAAAA,EAAUA,QAAAA;wCAAUC,MAAAA,EAAQA,MAAAA;AAAQC,wCAAAA,QAAAA,EAAUkG,QAAQ4E,YAAY;AAAE7K,wCAAAA,MAAAA,EAAQiG,QAAQ6E,UAAU;AAC5L7K,wCAAAA,GAAAA,EAAKN,CAAAA,KAAAA,GAASuJ,IAAAA,CAAKxJ,KAAAA,CAAMyD,IAAI,EAAExD,KAAAA,CAAAA;wCAAQO,IAAAA,EAAM,IAAMuF,UAAAA,CAAWqD,CAAAA,OAAAA,GAAW,IAAIpD,IAAIoD,OAAAA,CAAAA,CAASiC,GAAG,CAACrL,KAAAA,CAAMyD,IAAI,CAAA;AAD3FzD,qCAAAA,EAAAA,KAAAA,CAAMyD,IAAI,CAAA;;AAIlC0B,4BAAAA,IAAAA,KAAS0B,kBAAAA,CAASmD,QAAQ,IAAI,CAAC7J,0BAC5BuB,cAAA,CAACkC,KAAAA,EAAAA;gCAAInB,SAAAA,EAAU,iCAAA;AACX,gCAAA,QAAA,gBAAAf,cAAA,CAAC4J,yBAAAA,EAAAA;oCAAaC,IAAAA,EAAMvE,OAAAA;oCAASwE,QAAAA,EAAS,WAAA;AAAYC,oCAAAA,cAAAA,EAAgBlF,QAAQmF,oBAAoB;AAAEpC,oCAAAA,OAAAA,EAAS,IAAMN,MAAAA,CAAOtB,OAAAA,CAAAA;8CAAWK,4BAAAA,CAAWxB,OAAAA,CAAQoF,eAAe,EAAE;AAAEjE,wCAAAA,OAAAA,EAASA,QAAQjD;AAAM,qCAAA;;;;AAV3LiD,qBAAAA,EAAAA,OAAAA,CAAQjH,EAAE,CAAA,CAAA;AAe5B0E,gBAAAA,IAAAA,KAAS0B,mBAASmD,QAAQ,IAAI7E,SAAS0B,kBAAAA,CAASC,QAAQ,kBACrD5E,eAAA,CAAC0B,KAAAA,EAAAA;oBAAInB,SAAAA,EAAU,yBAAA;oBAA0Bd,IAAAA,EAAK,OAAA;AAAQoC,oBAAAA,YAAAA,EAAYwC,QAAQqF,WAAW;;sCACjFlK,cAAA,CAACsB,MAAAA,EAAAA;4BAAKrB,IAAAA,EAAK,QAAA;4BAASc,SAAAA,EAAU,kBAAA;AAAoB6E,4BAAAA,QAAAA,EAAAA,KAAAA,GAAQf,QAAQsF,WAAW,GAAG1F,SAAAA,GAAYI,OAAAA,CAAQuF,SAAS,GAAG;;sCAChHpK,cAAA,CAACsB,MAAAA,EAAAA;4BAAKP,SAAAA,EAAU;;AACf6E,wBAAAA,KAAAA,kBAAS5F,cAAA,CAAC4J,yBAAAA,EAAAA;4BAAaE,QAAAA,EAAS,OAAA;AAAQC,4BAAAA,cAAAA,EAAgBlF,QAAQmF,oBAAoB;4BAAEpC,OAAAA,EAAS,IAAA;gCAAQzD,SAAAA,CAAUH,KAAAA,CAAAA;AAAQK,gCAAAA,UAAAA,CAAW,IAAIC,GAAAA,EAAAA,CAAAA;gCAAQE,YAAAA,CAAa,KAAA,CAAA;AAAQ,4BAAA,CAAA;AAAIK,4BAAAA,QAAAA,EAAAA,OAAAA,CAAQwF;;sCAClLrK,cAAA,CAAC4J,yBAAAA,EAAAA;4BAAaE,QAAAA,EAAS,WAAA;AAAYC,4BAAAA,cAAAA,EAAgBlF,QAAQmF,oBAAoB;4BAAEpC,OAAAA,EAAS,IAAMzE,cAAcyE,OAAAA,GAAU;AAAEC,oCAAAA,eAAAA,EAAiB,IAAM1I;AAAU,iCAAA,CAAA;AAAK0F,4BAAAA,QAAAA,EAAAA,OAAAA,CAAQyF;;wBACvK7G,IAAAA,KAAS0B,kBAAAA,CAASoF,MAAM,kBAAIvK,cAAA,CAAC4J,yBAAAA,EAAAA;4BAAaC,IAAAA,EAAMvE,OAAAA;4BAASwE,QAAAA,EAAS,WAAA;AAAYC,4BAAAA,cAAAA,EAAgBlF,QAAQmF,oBAAoB;4BAAEpC,OAAAA,EAAS,IAAA;AAAQN,gCAAAA,MAAAA,EAAAA;AAAU,4BAAA,CAAA;AAAIzC,4BAAAA,QAAAA,EAAAA,OAAAA,CAAQ2F;;sCACpKxK,cAAA,CAAC4J,yBAAAA,EAAAA;4BAAaC,IAAAA,EAAMvE,OAAAA;AAASyE,4BAAAA,cAAAA,EAAgBlF,QAAQmF,oBAAoB;AAAEpC,4BAAAA,OAAAA,EAAS,IAAMN,MAAAA,EAAAA;AAAWzC,4BAAAA,QAAAA,EAAAA,OAAAA,CAAQ4F;;;;;;;AAOzI;;"}
@@ -34,7 +34,8 @@ var foundationSamples = require('./foundationSamples.js');
34
34
  },
35
35
  children: states.map((state)=>/*#__PURE__*/ jsxRuntime.jsxs("figure", {
36
36
  style: {
37
- margin: 0
37
+ margin: 0,
38
+ minInlineSize: 0
38
39
  },
39
40
  children: [
40
41
  /*#__PURE__*/ jsxRuntime.jsx("figcaption", {
@@ -1 +1 @@
1
- {"version":3,"file":"FoundationStates.js","sources":["../../../foundation/FoundationStates.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { componentRegistryKey, SceneThemeProvider } from '@cratis/scene.react';\nimport { defaultBlueprintComponents } from '../defaultBlueprintComponents';\nimport { defaultBlueprintName } from '../packageName';\nimport { darkTheme, lightTheme } from '../themes';\nimport { ComponentState, componentStates } from './ComponentState';\nimport { foundationElement, foundationSamples } from './foundationSamples';\n\nexport interface FoundationStatesProps {\n /** The bare name of the foundation component. */\n component: string;\n\n /** The theme the states are drawn in. */\n theme: 'light' | 'dark';\n\n /** Properties to lay over the sample, to show a variant. */\n properties?: Record<string, unknown>;\n\n /** Whether the page reads right to left. */\n rightToLeft?: boolean;\n}\n\n/**\n * Every standard state of one foundation component side by side in one theme: the preview of spec Part B 6 (\"all standard states\n * implemented and previewable\"), used by the stories and by the gallery.\n */\nexport function FoundationStates({ component, theme, properties, rightToLeft }: FoundationStatesProps) {\n const Component = defaultBlueprintComponents[componentRegistryKey(defaultBlueprintName, component)];\n const sample = foundationSamples[component];\n const states = sample?.stateful ? componentStates : [ComponentState.Ready];\n\n return (\n <SceneThemeProvider theme={theme === 'dark' ? darkTheme : lightTheme}>\n <div dir={rightToLeft ? 'rtl' : 'ltr'} className='foundation-states' style={{ display: 'grid', gap: '1rem', padding: '1rem', gridTemplateColumns: 'repeat(auto-fill, minmax(18rem, 1fr))', background: 'var(--scene-surface-background)', color: 'var(--scene-text-color)' }}>\n {states.map(state => (\n <figure key={state} style={{ margin: 0 }}>\n <figcaption style={{ fontSize: '0.75rem', textTransform: 'uppercase', marginBlockEnd: '0.5rem' }}>{state}</figcaption>\n <Component element={foundationElement(component, { ...sample?.properties, ...properties }, state === ComponentState.Ready ? undefined : state)} slots={{}} />\n </figure>\n ))}\n </div>\n </SceneThemeProvider>\n );\n}\n"],"names":["FoundationStates","component","theme","properties","rightToLeft","Component","defaultBlueprintComponents","componentRegistryKey","defaultBlueprintName","sample","foundationSamples","states","stateful","componentStates","ComponentState","Ready","_jsx","SceneThemeProvider","darkTheme","lightTheme","div","dir","className","style","display","gap","padding","gridTemplateColumns","background","color","map","state","_jsxs","figure","margin","figcaption","fontSize","textTransform","marginBlockEnd","element","foundationElement","undefined","slots"],"mappings":";;;;;;;;;;;;AAwBA;;;IAIO,SAASA,gBAAAA,CAAiB,EAAEC,SAAS,EAAEC,KAAK,EAAEC,UAAU,EAAEC,WAAW,EAAyB,EAAA;AACjG,IAAA,MAAMC,SAAAA,GAAYC,qDAA0B,CAACC,gCAAAA,CAAqBC,kCAAsBP,SAAAA,CAAAA,CAAW;IACnG,MAAMQ,MAAAA,GAASC,mCAAiB,CAACT,SAAAA,CAAU;IAC3C,MAAMU,MAAAA,GAASF,MAAAA,EAAQG,QAAAA,GAAWC,8BAAAA,GAAkB;AAACC,QAAAA,6BAAAA,CAAeC;AAAM,KAAA;AAE1E,IAAA,qBACIC,cAAA,CAACC,8BAAAA,EAAAA;QAAmBf,KAAAA,EAAOA,KAAAA,KAAU,SAASgB,cAAAA,GAAYC,gBAAAA;AACtD,QAAA,QAAA,gBAAAH,cAAA,CAACI,KAAAA,EAAAA;AAAIC,YAAAA,GAAAA,EAAKjB,cAAc,KAAA,GAAQ,KAAA;YAAOkB,SAAAA,EAAU,mBAAA;YAAoBC,KAAAA,EAAO;gBAAEC,OAAAA,EAAS,MAAA;gBAAQC,GAAAA,EAAK,MAAA;gBAAQC,OAAAA,EAAS,MAAA;gBAAQC,mBAAAA,EAAqB,uCAAA;gBAAyCC,UAAAA,EAAY,iCAAA;gBAAmCC,KAAAA,EAAO;AAA0B,aAAA;AACtQlB,YAAAA,QAAAA,EAAAA,MAAAA,CAAOmB,GAAG,CAACC,CAAAA,KAAAA,iBACRC,eAAA,CAACC,QAAAA,EAAAA;oBAAmBV,KAAAA,EAAO;wBAAEW,MAAAA,EAAQ;AAAE,qBAAA;;sCACnClB,cAAA,CAACmB,YAAAA,EAAAA;4BAAWZ,KAAAA,EAAO;gCAAEa,QAAAA,EAAU,SAAA;gCAAWC,aAAAA,EAAe,WAAA;gCAAaC,cAAAA,EAAgB;AAAS,6BAAA;AAAIP,4BAAAA,QAAAA,EAAAA;;sCACnGf,cAAA,CAACX,SAAAA,EAAAA;AAAUkC,4BAAAA,OAAAA,EAASC,oCAAkBvC,SAAAA,EAAW;AAAE,gCAAA,GAAGQ,QAAQN,UAAU;AAAE,gCAAA,GAAGA;AAAW,6BAAA,EAAG4B,KAAAA,KAAUjB,6BAAAA,CAAeC,KAAK,GAAG0B,SAAAA,GAAYV,KAAAA,CAAAA;AAAQW,4BAAAA,KAAAA,EAAO;;;AAF9IX,iBAAAA,EAAAA,KAAAA,CAAAA;;;AAQjC;;"}
1
+ {"version":3,"file":"FoundationStates.js","sources":["../../../foundation/FoundationStates.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { componentRegistryKey, SceneThemeProvider } from '@cratis/scene.react';\nimport { defaultBlueprintComponents } from '../defaultBlueprintComponents';\nimport { defaultBlueprintName } from '../packageName';\nimport { darkTheme, lightTheme } from '../themes';\nimport { ComponentState, componentStates } from './ComponentState';\nimport { foundationElement, foundationSamples } from './foundationSamples';\n\nexport interface FoundationStatesProps {\n /** The bare name of the foundation component. */\n component: string;\n\n /** The theme the states are drawn in. */\n theme: 'light' | 'dark';\n\n /** Properties to lay over the sample, to show a variant. */\n properties?: Record<string, unknown>;\n\n /** Whether the page reads right to left. */\n rightToLeft?: boolean;\n}\n\n/**\n * Every standard state of one foundation component side by side in one theme: the preview of spec Part B 6 (\"all standard states\n * implemented and previewable\"), used by the stories and by the gallery.\n */\nexport function FoundationStates({ component, theme, properties, rightToLeft }: FoundationStatesProps) {\n const Component = defaultBlueprintComponents[componentRegistryKey(defaultBlueprintName, component)];\n const sample = foundationSamples[component];\n const states = sample?.stateful ? componentStates : [ComponentState.Ready];\n\n return (\n <SceneThemeProvider theme={theme === 'dark' ? darkTheme : lightTheme}>\n <div dir={rightToLeft ? 'rtl' : 'ltr'} className='foundation-states' style={{ display: 'grid', gap: '1rem', padding: '1rem', gridTemplateColumns: 'repeat(auto-fill, minmax(18rem, 1fr))', background: 'var(--scene-surface-background)', color: 'var(--scene-text-color)' }}>\n {states.map(state => (\n <figure key={state} style={{ margin: 0, minInlineSize: 0 }}>\n <figcaption style={{ fontSize: '0.75rem', textTransform: 'uppercase', marginBlockEnd: '0.5rem' }}>{state}</figcaption>\n <Component element={foundationElement(component, { ...sample?.properties, ...properties }, state === ComponentState.Ready ? undefined : state)} slots={{}} />\n </figure>\n ))}\n </div>\n </SceneThemeProvider>\n );\n}\n"],"names":["FoundationStates","component","theme","properties","rightToLeft","Component","defaultBlueprintComponents","componentRegistryKey","defaultBlueprintName","sample","foundationSamples","states","stateful","componentStates","ComponentState","Ready","_jsx","SceneThemeProvider","darkTheme","lightTheme","div","dir","className","style","display","gap","padding","gridTemplateColumns","background","color","map","state","_jsxs","figure","margin","minInlineSize","figcaption","fontSize","textTransform","marginBlockEnd","element","foundationElement","undefined","slots"],"mappings":";;;;;;;;;;;;AAwBA;;;IAIO,SAASA,gBAAAA,CAAiB,EAAEC,SAAS,EAAEC,KAAK,EAAEC,UAAU,EAAEC,WAAW,EAAyB,EAAA;AACjG,IAAA,MAAMC,SAAAA,GAAYC,qDAA0B,CAACC,gCAAAA,CAAqBC,kCAAsBP,SAAAA,CAAAA,CAAW;IACnG,MAAMQ,MAAAA,GAASC,mCAAiB,CAACT,SAAAA,CAAU;IAC3C,MAAMU,MAAAA,GAASF,MAAAA,EAAQG,QAAAA,GAAWC,8BAAAA,GAAkB;AAACC,QAAAA,6BAAAA,CAAeC;AAAM,KAAA;AAE1E,IAAA,qBACIC,cAAA,CAACC,8BAAAA,EAAAA;QAAmBf,KAAAA,EAAOA,KAAAA,KAAU,SAASgB,cAAAA,GAAYC,gBAAAA;AACtD,QAAA,QAAA,gBAAAH,cAAA,CAACI,KAAAA,EAAAA;AAAIC,YAAAA,GAAAA,EAAKjB,cAAc,KAAA,GAAQ,KAAA;YAAOkB,SAAAA,EAAU,mBAAA;YAAoBC,KAAAA,EAAO;gBAAEC,OAAAA,EAAS,MAAA;gBAAQC,GAAAA,EAAK,MAAA;gBAAQC,OAAAA,EAAS,MAAA;gBAAQC,mBAAAA,EAAqB,uCAAA;gBAAyCC,UAAAA,EAAY,iCAAA;gBAAmCC,KAAAA,EAAO;AAA0B,aAAA;AACtQlB,YAAAA,QAAAA,EAAAA,MAAAA,CAAOmB,GAAG,CAACC,CAAAA,KAAAA,iBACRC,eAAA,CAACC,QAAAA,EAAAA;oBAAmBV,KAAAA,EAAO;wBAAEW,MAAAA,EAAQ,CAAA;wBAAGC,aAAAA,EAAe;AAAE,qBAAA;;sCACrDnB,cAAA,CAACoB,YAAAA,EAAAA;4BAAWb,KAAAA,EAAO;gCAAEc,QAAAA,EAAU,SAAA;gCAAWC,aAAAA,EAAe,WAAA;gCAAaC,cAAAA,EAAgB;AAAS,6BAAA;AAAIR,4BAAAA,QAAAA,EAAAA;;sCACnGf,cAAA,CAACX,SAAAA,EAAAA;AAAUmC,4BAAAA,OAAAA,EAASC,oCAAkBxC,SAAAA,EAAW;AAAE,gCAAA,GAAGQ,QAAQN,UAAU;AAAE,gCAAA,GAAGA;AAAW,6BAAA,EAAG4B,KAAAA,KAAUjB,6BAAAA,CAAeC,KAAK,GAAG2B,SAAAA,GAAYX,KAAAA,CAAAA;AAAQY,4BAAAA,KAAAA,EAAO;;;AAF9IZ,iBAAAA,EAAAA,KAAAA,CAAAA;;;AAQjC;;"}
@@ -0,0 +1,54 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var scene_react = require('@cratis/scene.react');
5
+ var elementProperties = require('../shell/elementProperties.js');
6
+ var FoundationIcon = require('./FoundationIcon.js');
7
+ var foundationStrings = require('./foundationStrings.js');
8
+ var urlState = require('./urlState.js');
9
+
10
+ /**
11
+ * The `globalSearch` component: a search box for the topbar or a list's toolbar.
12
+ *
13
+ * It is a `search` landmark around a labelled field; the text is the `value` output and, with `urlKey`, is kept in the address so a search is
14
+ * a shareable link. Pressing Escape clears it. The placeholder and the accessible name come from `placeholder` and `label`, and from the
15
+ * strings table when absent, so nothing is hard-coded.
16
+ */ function GlobalSearch({ element, interactions, bindingOutputs }) {
17
+ const strings = foundationStrings.readFoundationStrings(element);
18
+ const [text, setText] = urlState.useUrlState(elementProperties.readOptionalString(element, 'urlKey'), elementProperties.readOptionalString(element, 'text'));
19
+ const label = elementProperties.readOptionalString(element, 'label') ?? strings.searchLabel;
20
+ scene_react.useValueOutput(bindingOutputs, text ?? '');
21
+ return /*#__PURE__*/ jsxRuntime.jsxs("form", {
22
+ role: "search",
23
+ className: "foundation foundation-search",
24
+ "data-scene-id": element.id,
25
+ onSubmit: (event)=>{
26
+ event.preventDefault();
27
+ interactions?.onChange?.();
28
+ },
29
+ children: [
30
+ /*#__PURE__*/ jsxRuntime.jsx(FoundationIcon.FoundationIcon, {
31
+ name: "filter"
32
+ }),
33
+ /*#__PURE__*/ jsxRuntime.jsx("input", {
34
+ type: "search",
35
+ "aria-label": label,
36
+ placeholder: elementProperties.readOptionalString(element, 'placeholder') ?? strings.searchPlaceholder,
37
+ value: text ?? '',
38
+ onChange: (event)=>{
39
+ setText(event.target.value);
40
+ interactions?.onChange?.();
41
+ },
42
+ onKeyDown: (event)=>{
43
+ if (event.key === 'Escape' && (text ?? '').length > 0) {
44
+ event.preventDefault();
45
+ setText(undefined);
46
+ }
47
+ }
48
+ })
49
+ ]
50
+ });
51
+ }
52
+
53
+ exports.GlobalSearch = GlobalSearch;
54
+ //# sourceMappingURL=GlobalSearch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GlobalSearch.js","sources":["../../../foundation/GlobalSearch.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n\nimport { RegisteredComponentProps, useValueOutput } from '@cratis/scene.react';\nimport { readOptionalString } from '../shell/elementProperties';\nimport { FoundationIcon } from './FoundationIcon';\nimport { readFoundationStrings } from './foundationStrings';\nimport { useUrlState } from './urlState';\n\n/**\n * The `globalSearch` component: a search box for the topbar or a list's toolbar.\n *\n * It is a `search` landmark around a labelled field; the text is the `value` output and, with `urlKey`, is kept in the address so a search is\n * a shareable link. Pressing Escape clears it. The placeholder and the accessible name come from `placeholder` and `label`, and from the\n * strings table when absent, so nothing is hard-coded.\n */\nexport function GlobalSearch({ element, interactions, bindingOutputs }: RegisteredComponentProps) {\n const strings = readFoundationStrings(element);\n const [text, setText] = useUrlState(readOptionalString(element, 'urlKey'), readOptionalString(element, 'text'));\n const label = readOptionalString(element, 'label') ?? strings.searchLabel;\n\n useValueOutput(bindingOutputs, text ?? '');\n\n return (\n <form role='search' className='foundation foundation-search' data-scene-id={element.id} onSubmit={event => { event.preventDefault(); interactions?.onChange?.(); }}>\n <FoundationIcon name='filter' />\n <input type='search' aria-label={label} placeholder={readOptionalString(element, 'placeholder') ?? strings.searchPlaceholder} value={text ?? ''}\n onChange={event => { setText(event.target.value); interactions?.onChange?.(); }}\n onKeyDown={event => { if (event.key === 'Escape' && (text ?? '').length > 0) { event.preventDefault(); setText(undefined); } }} />\n </form>\n );\n}\n"],"names":["GlobalSearch","element","interactions","bindingOutputs","strings","readFoundationStrings","text","setText","useUrlState","readOptionalString","label","searchLabel","useValueOutput","_jsxs","form","role","className","data-scene-id","id","onSubmit","event","preventDefault","onChange","_jsx","FoundationIcon","name","input","type","aria-label","placeholder","searchPlaceholder","value","target","onKeyDown","key","length","undefined"],"mappings":";;;;;;;;;AAUA;;;;;;IAOO,SAASA,YAAAA,CAAa,EAAEC,OAAO,EAAEC,YAAY,EAAEC,cAAc,EAA4B,EAAA;AAC5F,IAAA,MAAMC,UAAUC,uCAAAA,CAAsBJ,OAAAA,CAAAA;IACtC,MAAM,CAACK,MAAMC,OAAAA,CAAQ,GAAGC,qBAAYC,oCAAAA,CAAmBR,OAAAA,EAAS,QAAA,CAAA,EAAWQ,oCAAAA,CAAmBR,OAAAA,EAAS,MAAA,CAAA,CAAA;AACvG,IAAA,MAAMS,KAAAA,GAAQD,oCAAAA,CAAmBR,OAAAA,EAAS,OAAA,CAAA,IAAYG,QAAQO,WAAW;AAEzEC,IAAAA,0BAAAA,CAAeT,gBAAgBG,IAAAA,IAAQ,EAAA,CAAA;AAEvC,IAAA,qBACIO,eAAA,CAACC,MAAAA,EAAAA;QAAKC,IAAAA,EAAK,QAAA;QAASC,SAAAA,EAAU,8BAAA;AAA+BC,QAAAA,eAAAA,EAAehB,QAAQiB,EAAE;AAAEC,QAAAA,QAAAA,EAAUC,CAAAA,KAAAA,GAAAA;AAAWA,YAAAA,KAAAA,CAAMC,cAAc,EAAA;YAAInB,YAAAA,EAAcoB,QAAAA,IAAAA;AAAc,QAAA,CAAA;;0BAC7JC,cAAA,CAACC,6BAAAA,EAAAA;gBAAeC,IAAAA,EAAK;;0BACrBF,cAAA,CAACG,OAAAA,EAAAA;gBAAMC,IAAAA,EAAK,QAAA;gBAASC,YAAAA,EAAYlB,KAAAA;AAAOmB,gBAAAA,WAAAA,EAAapB,oCAAAA,CAAmBR,OAAAA,EAAS,aAAA,CAAA,IAAkBG,OAAAA,CAAQ0B,iBAAiB;AAAEC,gBAAAA,KAAAA,EAAOzB,IAAAA,IAAQ,EAAA;AACzIgB,gBAAAA,QAAAA,EAAUF,CAAAA,KAAAA,GAAAA;oBAAWb,OAAAA,CAAQa,KAAAA,CAAMY,MAAM,CAACD,KAAK,CAAA;oBAAG7B,YAAAA,EAAcoB,QAAAA,IAAAA;AAAc,gBAAA,CAAA;AAC9EW,gBAAAA,SAAAA,EAAWb,CAAAA,KAAAA,GAAAA;oBAAW,IAAIA,KAAAA,CAAMc,GAAG,KAAK,QAAA,IAAa5B,CAAAA,IAAAA,IAAQ,EAAC,EAAG6B,MAAM,GAAG,CAAA,EAAG;AAAEf,wBAAAA,KAAAA,CAAMC,cAAc,EAAA;wBAAId,OAAAA,CAAQ6B,SAAAA,CAAAA;AAAY,oBAAA;AAAE,gBAAA;;;;AAG7I;;"}