@wise/dynamic-flow-client-internal 5.20.0-exp-box-cq-da65c19 → 5.20.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/build/main.css CHANGED
@@ -52,92 +52,6 @@
52
52
  width: 66.66%;
53
53
  }
54
54
  }
55
- @media screen and (width >=768px) {
56
- /* container queries (when .df-prefer-container-queries is set on a parent) */
57
- /* In container-query mode, ignore viewport-based width overrides by resetting to narrow defaults. */
58
- .df-prefer-container-queries .df-box-renderer-border {
59
- padding: var(--size-16);
60
- }
61
-
62
- .df-prefer-container-queries .df-box-renderer-width-xs,
63
- .df-prefer-container-queries .df-box-renderer-width-sm,
64
- .df-prefer-container-queries .df-box-renderer-width-md,
65
- .df-prefer-container-queries .df-box-renderer-width-lg {
66
- width: 100%;
67
- }
68
-
69
- @container (min-width: 480px) {
70
- .df-prefer-container-queries .df-box-renderer-border {
71
- padding: var(--size-24);
72
- }
73
-
74
- .df-prefer-container-queries .df-box-renderer-width-xs {
75
- width: 33.33%;
76
- }
77
-
78
- .df-prefer-container-queries .df-box-renderer-width-sm {
79
- width: 50%;
80
- }
81
-
82
- .df-prefer-container-queries .df-box-renderer-width-md {
83
- width: 66.66%;
84
- }
85
-
86
- .df-prefer-container-queries .df-box-renderer-width-lg {
87
- width: 83.33%;
88
- }
89
- }
90
-
91
- @container (min-width: 576px) {
92
- .df-prefer-container-queries .df-box-renderer-width-xs {
93
- width: 25%;
94
- }
95
-
96
- .df-prefer-container-queries .df-box-renderer-width-sm {
97
- width: 33.33%;
98
- }
99
-
100
- .df-prefer-container-queries .df-box-renderer-width-md {
101
- width: 50%;
102
- }
103
-
104
- .df-prefer-container-queries .df-box-renderer-width-lg {
105
- width: 66.66%;
106
- }
107
- }
108
- }
109
- @media screen and (width >=990px) {
110
- /* container queries (when .df-prefer-container-queries is set on a parent) */
111
- /* In container-query mode, ignore viewport-based width overrides by resetting to narrow defaults. */
112
- .df-prefer-container-queries .df-box-renderer-border {
113
- padding: var(--size-16);
114
- }
115
-
116
- .df-prefer-container-queries .df-box-renderer-width-xs,
117
- .df-prefer-container-queries .df-box-renderer-width-sm,
118
- .df-prefer-container-queries .df-box-renderer-width-md,
119
- .df-prefer-container-queries .df-box-renderer-width-lg {
120
- width: 100%;
121
- }
122
-
123
- @container (min-width: 480px) {
124
- .df-prefer-container-queries .df-box-renderer-width-xs {
125
- width: 25%;
126
- }
127
-
128
- .df-prefer-container-queries .df-box-renderer-width-sm {
129
- width: 33.33%;
130
- }
131
-
132
- .df-prefer-container-queries .df-box-renderer-width-md {
133
- width: 50%;
134
- }
135
-
136
- .df-prefer-container-queries .df-box-renderer-width-lg {
137
- width: 66.66%;
138
- }
139
- }
140
- }
141
55
  .df-columns-renderer-container {
142
56
  display: flex;
143
57
  gap: var(--size-4);
@@ -223,6 +137,13 @@
223
137
  width: 300px;
224
138
  }
225
139
  }
140
+ /**
141
+ * This speficies the container for container queries about width.
142
+ * We don't use it by default, but integrations can specify it using the className prop in the DF component.
143
+ */
144
+ .df-prefer-container-queries {
145
+ container-type: inline-size;
146
+ }
226
147
  /* narrow container */
227
148
  @container (max-width: 576px) {
228
149
  .df-image.xs img.df-reserve-space {
@@ -309,13 +230,6 @@
309
230
  margin-left: auto;
310
231
  margin-right: auto;
311
232
  }
312
- /**
313
- * This specifies the container for container queries about width.
314
- * We don't use it by default, but integrations can specify it using the className prop in the DF component.
315
- */
316
- .df-prefer-container-queries {
317
- container-type: inline-size;
318
- }
319
233
  .df-context-menu {
320
234
  position: fixed;
321
235
  z-index: 10;
package/build/main.js CHANGED
@@ -145,7 +145,7 @@ var import_dynamic_flow_client4 = require("@wise/dynamic-flow-client");
145
145
  // src/dynamicFlow/telemetry/app-version.ts
146
146
  var appVersion = (
147
147
  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
148
- typeof process !== "undefined" ? "5.19.3" : "0.0.0"
148
+ typeof process !== "undefined" ? "5.20.0" : "0.0.0"
149
149
  );
150
150
 
151
151
  // src/dynamicFlow/context-menu/useContextMenu.tsx
@@ -934,16 +934,18 @@ function FieldInput({
934
934
  description,
935
935
  help,
936
936
  loadingState = "idle",
937
- inlineAlert
937
+ inlineAlert,
938
+ features
938
939
  }) {
939
940
  const labelContent = label && help ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(LabelContentWithHelp, { text: label, help }) : label;
940
941
  const message = validation == null ? void 0 : validation.message;
941
942
  const ref = (0, import_react4.useRef)(null);
943
+ const shouldScrollToError = features.scrollToError !== false;
942
944
  (0, import_react4.useEffect)(() => {
943
- if (message) {
945
+ if (message && shouldScrollToError) {
944
946
  scrollToIfNotVisible(ref.current);
945
947
  }
946
- }, [message]);
948
+ }, [message, shouldScrollToError]);
947
949
  return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { ref, children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
948
950
  import_components8.Field,
949
951
  {
@@ -1044,6 +1046,7 @@ var CheckboxComponent = (props) => {
1044
1046
  help,
1045
1047
  inlineAlert: rest.inlineAlert,
1046
1048
  loadingState: rest.fieldLoadingState,
1049
+ features: rest.features,
1047
1050
  children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_components11.Checkbox, __spreadValues({ id }, checkboxProps))
1048
1051
  }
1049
1052
  );
@@ -1241,6 +1244,7 @@ var DateInputRenderer = {
1241
1244
  inlineAlert: props.inlineAlert,
1242
1245
  loadingState: props.fieldLoadingState,
1243
1246
  help,
1247
+ features: props.features,
1244
1248
  children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(VariableDateInput_default, { control, inputProps })
1245
1249
  }
1246
1250
  );
@@ -1930,6 +1934,7 @@ var IntegerInputRenderer = {
1930
1934
  inlineAlert: props.inlineAlert,
1931
1935
  loadingState: props.fieldLoadingState,
1932
1936
  help,
1937
+ features: props.features,
1933
1938
  children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_components23.InputGroup, { addonStart: getInputGroupAddonStart(media), children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
1934
1939
  import_components23.Input,
1935
1940
  __spreadValues({
@@ -2193,6 +2198,7 @@ function MoneyInputRendererComponent(props) {
2193
2198
  description,
2194
2199
  validation: validationState,
2195
2200
  help,
2201
+ features: props.features,
2196
2202
  children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
2197
2203
  import_components31.MoneyInput,
2198
2204
  {
@@ -2262,6 +2268,7 @@ function InlineComponent(props) {
2262
2268
  id,
2263
2269
  description,
2264
2270
  disabled,
2271
+ features,
2265
2272
  help,
2266
2273
  options,
2267
2274
  selectedIndices,
@@ -2277,6 +2284,7 @@ function InlineComponent(props) {
2277
2284
  help,
2278
2285
  description,
2279
2286
  validation: validationState,
2287
+ features,
2280
2288
  children: options.map((option, index) => {
2281
2289
  var _a;
2282
2290
  const {
@@ -2344,6 +2352,7 @@ function DefaultComponent(props) {
2344
2352
  autoComplete,
2345
2353
  description,
2346
2354
  disabled,
2355
+ features,
2347
2356
  help,
2348
2357
  options,
2349
2358
  placeholder,
@@ -2389,6 +2398,7 @@ function DefaultComponent(props) {
2389
2398
  help,
2390
2399
  description,
2391
2400
  validation: validationState,
2401
+ features,
2392
2402
  children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
2393
2403
  import_components33.SelectInput,
2394
2404
  __spreadValues({
@@ -2435,6 +2445,7 @@ function InlineCheckboxComponent(props) {
2435
2445
  id,
2436
2446
  description,
2437
2447
  disabled,
2448
+ features,
2438
2449
  help,
2439
2450
  options,
2440
2451
  selectedIndices,
@@ -2450,6 +2461,7 @@ function InlineCheckboxComponent(props) {
2450
2461
  help,
2451
2462
  description,
2452
2463
  validation: validationState,
2464
+ features,
2453
2465
  children: options.map((option, index) => {
2454
2466
  var _a;
2455
2467
  const {
@@ -2496,9 +2508,9 @@ var MultiSelectInputRenderer = {
2496
2508
  var import_components36 = require("@transferwise/components");
2497
2509
 
2498
2510
  // ../renderers/src/components/UploadFieldInput.tsx
2499
- var import_react13 = require("react");
2500
2511
  var import_components35 = require("@transferwise/components");
2501
2512
  var import_classnames4 = __toESM(require_classnames());
2513
+ var import_react13 = require("react");
2502
2514
  var import_jsx_runtime57 = require("react/jsx-runtime");
2503
2515
  function UploadFieldInput({
2504
2516
  id,
@@ -2506,17 +2518,19 @@ function UploadFieldInput({
2506
2518
  label,
2507
2519
  description,
2508
2520
  help,
2509
- validation
2521
+ validation,
2522
+ features
2510
2523
  }) {
2511
2524
  const labelContent = label && help ? /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(LabelContentWithHelp, { text: label, help }) : label;
2512
2525
  const descriptionId = description ? `${id}-description` : void 0;
2513
2526
  const message = validation == null ? void 0 : validation.message;
2514
2527
  const ref = (0, import_react13.useRef)(null);
2528
+ const shouldScrollToError = features.scrollToError !== false;
2515
2529
  (0, import_react13.useEffect)(() => {
2516
- if (message) {
2530
+ if (message && shouldScrollToError) {
2517
2531
  scrollToIfNotVisible(ref.current);
2518
2532
  }
2519
- }, [message]);
2533
+ }, [message, shouldScrollToError]);
2520
2534
  return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
2521
2535
  "div",
2522
2536
  {
@@ -2573,6 +2587,7 @@ var MultiUploadInputRenderer = {
2573
2587
  title,
2574
2588
  description,
2575
2589
  disabled,
2590
+ features,
2576
2591
  maxSize,
2577
2592
  maxItems,
2578
2593
  uploadLabel,
@@ -2595,6 +2610,7 @@ var MultiUploadInputRenderer = {
2595
2610
  description,
2596
2611
  validation: validationState,
2597
2612
  help,
2613
+ features,
2598
2614
  children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
2599
2615
  import_components36.UploadInput,
2600
2616
  {
@@ -2648,6 +2664,7 @@ var NumberInputRenderer = {
2648
2664
  inlineAlert: props.inlineAlert,
2649
2665
  loadingState: props.fieldLoadingState,
2650
2666
  help,
2667
+ features: props.features,
2651
2668
  children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_components37.InputGroup, { addonStart: getInputGroupAddonStart(media), children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
2652
2669
  import_components37.Input,
2653
2670
  __spreadValues({
@@ -3092,6 +3109,7 @@ function BlockSearchRendererComponent({
3092
3109
  id,
3093
3110
  hint,
3094
3111
  isLoading,
3112
+ features,
3095
3113
  margin,
3096
3114
  query,
3097
3115
  state,
@@ -3102,23 +3120,34 @@ function BlockSearchRendererComponent({
3102
3120
  const [hasSearched, setHasSearched] = (0, import_react16.useState)(false);
3103
3121
  const { formatMessage } = (0, import_react_intl22.useIntl)();
3104
3122
  return /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)("div", { className: getMargin(margin), children: [
3105
- /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(FieldInput_default, { id, description: "", validation: void 0, help: "", label: title, children: /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(import_components45.InputGroup, { addonStart: { content: /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(import_icons3.Search, { size: 24 }) }, children: /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
3106
- import_components45.Input,
3123
+ /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
3124
+ FieldInput_default,
3107
3125
  {
3108
3126
  id,
3109
- name: id,
3110
- placeholder: hint,
3111
- type: "text",
3112
- value: query,
3113
- onChange: ({ currentTarget: { value } }) => {
3114
- if (!hasSearched) {
3115
- setHasSearched(true);
3116
- trackEvent("Search Started");
3127
+ description: "",
3128
+ validation: void 0,
3129
+ help: "",
3130
+ label: title,
3131
+ features,
3132
+ children: /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(import_components45.InputGroup, { addonStart: { content: /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(import_icons3.Search, { size: 24 }) }, children: /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
3133
+ import_components45.Input,
3134
+ {
3135
+ id,
3136
+ name: id,
3137
+ placeholder: hint,
3138
+ type: "text",
3139
+ value: query,
3140
+ onChange: ({ currentTarget: { value } }) => {
3141
+ if (!hasSearched) {
3142
+ setHasSearched(true);
3143
+ trackEvent("Search Started");
3144
+ }
3145
+ onChange(value);
3146
+ }
3117
3147
  }
3118
- onChange(value);
3119
- }
3148
+ ) })
3120
3149
  }
3121
- ) }) }),
3150
+ ),
3122
3151
  isLoading ? /* @__PURE__ */ (0, import_jsx_runtime66.jsx)("span", { children: formatMessage(search_messages_default.loading) }) : /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(SearchResultContent, { state, trackEvent })
3123
3152
  ] });
3124
3153
  }
@@ -3187,50 +3216,62 @@ function InlineSearchRenderer({
3187
3216
  id,
3188
3217
  hint,
3189
3218
  isLoading,
3219
+ features,
3190
3220
  margin,
3191
- onChange,
3192
3221
  state,
3193
3222
  title,
3223
+ onChange,
3194
3224
  trackEvent
3195
3225
  }) {
3196
3226
  const [hasSearched, setHasSearched] = (0, import_react17.useState)(false);
3197
3227
  const intl = (0, import_react_intl23.useIntl)();
3198
- return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("div", { className: getMargin(margin), children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(FieldInput_default, { id, description: "", validation: void 0, help: "", label: title, children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
3199
- import_components46.Typeahead,
3228
+ return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("div", { className: getMargin(margin), children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
3229
+ FieldInput_default,
3200
3230
  {
3201
- id: "typeahead-input-id",
3202
- intl,
3203
- name: "typeahead-input-name",
3204
- size: "md",
3205
- placeholder: hint,
3206
- maxHeight: 100,
3207
- footer: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(TypeaheadFooter, { state, isLoading }),
3208
- multiple: false,
3209
- clearable: false,
3210
- addon: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_icons4.Search, { size: 24 }),
3211
- options: state.type === "results" ? state.results.map(mapResultToTypeaheadOption) : [],
3212
- minQueryLength: 1,
3213
- onChange: (values) => {
3214
- if (values.length > 0) {
3215
- const [updatedValue] = values;
3216
- const { value: result } = updatedValue;
3217
- if (result) {
3218
- trackEvent("Search Result Selected", __spreadValues({
3219
- type: result.type
3220
- }, result.type === "action" ? { actionId: result.id } : {}));
3221
- result.onClick();
3231
+ id,
3232
+ description: "",
3233
+ validation: void 0,
3234
+ help: "",
3235
+ label: title,
3236
+ features,
3237
+ children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
3238
+ import_components46.Typeahead,
3239
+ {
3240
+ id: "typeahead-input-id",
3241
+ intl,
3242
+ name: "typeahead-input-name",
3243
+ size: "md",
3244
+ placeholder: hint,
3245
+ maxHeight: 100,
3246
+ footer: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(TypeaheadFooter, { state, isLoading }),
3247
+ multiple: false,
3248
+ clearable: false,
3249
+ addon: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_icons4.Search, { size: 24 }),
3250
+ options: state.type === "results" ? state.results.map(mapResultToTypeaheadOption) : [],
3251
+ minQueryLength: 1,
3252
+ onChange: (values) => {
3253
+ if (values.length > 0) {
3254
+ const [updatedValue] = values;
3255
+ const { value: result } = updatedValue;
3256
+ if (result) {
3257
+ trackEvent("Search Result Selected", __spreadValues({
3258
+ type: result.type
3259
+ }, result.type === "action" ? { actionId: result.id } : {}));
3260
+ result.onClick();
3261
+ }
3262
+ }
3263
+ },
3264
+ onInputChange: (query) => {
3265
+ if (!hasSearched) {
3266
+ setHasSearched(true);
3267
+ trackEvent("Search Started");
3268
+ }
3269
+ onChange(query);
3222
3270
  }
3223
3271
  }
3224
- },
3225
- onInputChange: (query) => {
3226
- if (!hasSearched) {
3227
- setHasSearched(true);
3228
- trackEvent("Search Started");
3229
- }
3230
- onChange(query);
3231
- }
3272
+ )
3232
3273
  }
3233
- ) }) });
3274
+ ) });
3234
3275
  }
3235
3276
  function mapResultToTypeaheadOption(result) {
3236
3277
  return {
@@ -3313,6 +3354,7 @@ function RadioInputRendererComponent(props) {
3313
3354
  children,
3314
3355
  description,
3315
3356
  disabled,
3357
+ features,
3316
3358
  help,
3317
3359
  title,
3318
3360
  options,
@@ -3329,6 +3371,7 @@ function RadioInputRendererComponent(props) {
3329
3371
  help,
3330
3372
  description,
3331
3373
  validation: validationState,
3374
+ features,
3332
3375
  children: /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("span", { children: /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
3333
3376
  import_components48.RadioGroup,
3334
3377
  {
@@ -3361,6 +3404,7 @@ function TabInputRendererComponent(props) {
3361
3404
  children,
3362
3405
  description,
3363
3406
  disabled,
3407
+ features,
3364
3408
  help,
3365
3409
  title,
3366
3410
  options,
@@ -3382,6 +3426,7 @@ function TabInputRendererComponent(props) {
3382
3426
  help,
3383
3427
  description,
3384
3428
  validation: validationState,
3429
+ features,
3385
3430
  children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
3386
3431
  import_components49.Tabs,
3387
3432
  {
@@ -3414,6 +3459,7 @@ function SelectInputRendererComponent(props) {
3414
3459
  children,
3415
3460
  description,
3416
3461
  disabled,
3462
+ features,
3417
3463
  help,
3418
3464
  title,
3419
3465
  options,
@@ -3460,6 +3506,7 @@ function SelectInputRendererComponent(props) {
3460
3506
  help,
3461
3507
  description,
3462
3508
  validation: validationState,
3509
+ features,
3463
3510
  children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
3464
3511
  import_components50.SelectInput,
3465
3512
  __spreadValues({
@@ -3489,6 +3536,7 @@ function SegmentedInputRendererComponent(props) {
3489
3536
  id,
3490
3537
  children,
3491
3538
  description,
3539
+ features,
3492
3540
  help,
3493
3541
  title,
3494
3542
  options,
@@ -3510,6 +3558,7 @@ function SegmentedInputRendererComponent(props) {
3510
3558
  help,
3511
3559
  description,
3512
3560
  validation: validationState,
3561
+ features,
3513
3562
  children: /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(
3514
3563
  import_components51.SegmentedControl,
3515
3564
  {
@@ -4094,6 +4143,7 @@ var TextInputRenderer = {
4094
4143
  inlineAlert: props.inlineAlert,
4095
4144
  loadingState: props.fieldLoadingState,
4096
4145
  help,
4146
+ features: props.features,
4097
4147
  children: /* @__PURE__ */ (0, import_jsx_runtime87.jsx)(import_components61.InputGroup, { addonStart: getInputGroupAddonStart(media), children: /* @__PURE__ */ (0, import_jsx_runtime87.jsx)(VariableTextInput, __spreadValues({}, inputProps)) })
4098
4148
  }
4099
4149
  );
@@ -4112,7 +4162,18 @@ var import_jsx_runtime88 = require("react/jsx-runtime");
4112
4162
  var UploadInputRenderer = {
4113
4163
  canRenderType: "input-upload",
4114
4164
  render: (props) => {
4115
- const { id, accepts, title, description, disabled, maxSize, validationState, value, onUpload } = props;
4165
+ const {
4166
+ id,
4167
+ accepts,
4168
+ title,
4169
+ description,
4170
+ disabled,
4171
+ features,
4172
+ maxSize,
4173
+ validationState,
4174
+ value,
4175
+ onUpload
4176
+ } = props;
4116
4177
  const onUploadFile = async (formData) => {
4117
4178
  const file = formData.get("file");
4118
4179
  return onUpload(file).then(() => ({
@@ -4131,6 +4192,7 @@ var UploadInputRenderer = {
4131
4192
  label: void 0,
4132
4193
  description: void 0,
4133
4194
  validation: validationState,
4195
+ features,
4134
4196
  children: /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(
4135
4197
  import_components62.UploadInput,
4136
4198
  {
@@ -4171,6 +4233,7 @@ var LargeUploadRenderer = {
4171
4233
  type,
4172
4234
  validationState,
4173
4235
  maxSize = null,
4236
+ features,
4174
4237
  onUpload
4175
4238
  } = _a, rest = __objRest(_a, [
4176
4239
  "id",
@@ -4183,6 +4246,7 @@ var LargeUploadRenderer = {
4183
4246
  "type",
4184
4247
  "validationState",
4185
4248
  "maxSize",
4249
+ "features",
4186
4250
  "onUpload"
4187
4251
  ]);
4188
4252
  const uploadProps = __spreadProps(__spreadValues({}, rest), { id, name: id, maxSize });
@@ -4205,6 +4269,7 @@ var LargeUploadRenderer = {
4205
4269
  description,
4206
4270
  validation: validationState,
4207
4271
  help,
4272
+ features,
4208
4273
  children: /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(
4209
4274
  import_components62.Upload,
4210
4275
  __spreadProps(__spreadValues({}, uploadProps), {