@wise/dynamic-flow-client 4.7.1 → 4.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,7 +6,7 @@
6
6
  "dynamicFlows.ArraySchema.minItemsError": "Voeg minimaal {minItems} toe.",
7
7
  "dynamicFlows.ArraySchema.removeItem": "Verwijderen",
8
8
  "dynamicFlows.CameraCapture.CameraConnectionIssue.action": "Opnieuw proberen",
9
- "dynamicFlows.CameraCapture.CameraConnectionIssue.paragraph": "Controleer of de camera verbonden is en probeer opnieuw.",
9
+ "dynamicFlows.CameraCapture.CameraConnectionIssue.paragraph": "Controleer of de camera verbonden is en probeer het opnieuw.",
10
10
  "dynamicFlows.CameraCapture.CameraConnectionIssue.title": "We hebben geen toegang tot je camera",
11
11
  "dynamicFlows.CameraCapture.CameraNotSupported.paragraph": "Je browser ondersteunt geen camera's. Probeer een andere browser of apparaat of download onze mobiele app.",
12
12
  "dynamicFlows.CameraCapture.CameraNotSupported.title": "Camera wordt niet ondersteund",
@@ -29,22 +29,22 @@
29
29
  "dynamicFlows.ControlFeedback.type": "Onjuist type",
30
30
  "dynamicFlows.DefaultErrorMessages.required": "Vul dit veld in.",
31
31
  "dynamicFlows.DynamicExternal.retryTitle": "Venster opnieuw openen",
32
- "dynamicFlows.DynamicParagraph.copied": "Naar klembord gekopiëerd",
32
+ "dynamicFlows.DynamicParagraph.copied": "Naar klembord gekopieerd",
33
33
  "dynamicFlows.DynamicParagraph.copy": "Kopiëren",
34
34
  "dynamicFlows.ErrorBoundary.errorAlert": "Er is iets misgegaan.",
35
35
  "dynamicFlows.ErrorBoundary.retry": "Opnieuw proberen",
36
36
  "dynamicFlows.ExternalConfirmation.cancel": "Annuleren",
37
37
  "dynamicFlows.ExternalConfirmation.description": "Bevestig dat je **{origin}** in een nieuw browsertabblad wilt openen.",
38
38
  "dynamicFlows.ExternalConfirmation.open": "In nieuw tabblad openen",
39
- "dynamicFlows.ExternalConfirmation.title": "Bevestig",
39
+ "dynamicFlows.ExternalConfirmation.title": "Bevestigen",
40
40
  "dynamicFlows.FileUploadSchema.maxFileSizeError": "Het bestand is te groot. Upload een kleiner bestand.",
41
41
  "dynamicFlows.FileUploadSchema.wrongFileTypeError": "De bestandsindeling wordt niet ondersteund. Upload een ander bestand.",
42
42
  "dynamicFlows.Help.ariaLabel": "Klik hier voor meer informatie.",
43
43
  "dynamicFlows.MultiSelect.summary": "{first} en nog {count}",
44
44
  "dynamicFlows.MultipleFileUploadSchema.maxFileSizeError": "Het bestand is te groot. Upload een kleiner bestand.",
45
45
  "dynamicFlows.MultipleFileUploadSchema.maxItemsError": "Upload {maxItems} of minder bestanden.",
46
- "dynamicFlows.MultipleFileUploadSchema.minItemsError": "Upload mimimaal {minItems} bestand(en).",
47
- "dynamicFlows.PersistAsyncSchema.genericError": "Er ging iets mis, probeer het a. u. b. opnieuw.",
46
+ "dynamicFlows.MultipleFileUploadSchema.minItemsError": "Upload minimaal {minItems} bestand(en).",
47
+ "dynamicFlows.PersistAsyncSchema.genericError": "Er is iets misgegaan, probeer het opnieuw.",
48
48
  "dynamicFlows.ReadOnlySchema.no": "Nee",
49
49
  "dynamicFlows.ReadOnlySchema.yes": "Ja",
50
50
  "dynamicFlows.SearchLayout.loading": "Laden..."
package/build/main.css CHANGED
@@ -287,39 +287,63 @@ button.df-back-btn {
287
287
  height: auto;
288
288
  width: 100%;
289
289
  }
290
- /* narrow screens */
290
+ /* wide screens (or default) */
291
291
  .df-image.xs img {
292
- width: 50px;
292
+ width: 100px;
293
293
  }
294
294
  .df-image.sm img {
295
- width: 100px;
295
+ width: 200px;
296
296
  }
297
297
  .df-image.md img {
298
- width: 200px;
298
+ width: 300px;
299
299
  }
300
300
  .df-image.lg img {
301
- width: 300px;
301
+ width: 500px;
302
302
  }
303
- /* wide screens */
304
- @media (width >=576px) {
303
+ .df-image.xl img {
304
+ max-width: 600px;
305
+ }
306
+ /* narrow screens */
307
+ @media (width <576px) {
305
308
  .df-image.xs img {
306
- width: 100px;
309
+ width: 50px;
307
310
  }
308
311
 
309
312
  .df-image.sm img {
310
- width: 200px;
313
+ width: 100px;
311
314
  }
312
315
 
313
316
  .df-image.md img {
314
- width: 300px;
317
+ width: 200px;
315
318
  }
316
319
 
317
320
  .df-image.lg img {
318
- width: 500px;
321
+ width: 300px;
322
+ }
323
+ }
324
+ /**
325
+ * This speficies the container for container queries about width.
326
+ * We don't use it by default, but integrations can specify it using the className prop in the DF component.
327
+ */
328
+ .df-prefer-container-queries {
329
+ container-type: inline-size;
330
+ }
331
+ /* narrow container */
332
+ @container (max-width: 576px) {
333
+ .df-image.xs img {
334
+ width: 50px;
319
335
  }
320
336
 
321
- .df-image.xl img {
322
- max-width: 600px;
337
+ .df-image.sm img {
338
+ width: 100px;
339
+ }
340
+
341
+ .df-image.md img {
342
+ width: 200px;
343
+ }
344
+
345
+ .df-image.lg img {
346
+ width: 300px;
323
347
  }
324
348
  }
325
349
  .df-back-btn .tw-avatar__content {
package/build/main.js CHANGED
@@ -1100,6 +1100,8 @@ function getChildren(node) {
1100
1100
  return node.editableItemProps ? [node.editableItemProps] : [];
1101
1101
  case "input-select":
1102
1102
  return node.childrenProps ? [node.childrenProps] : [];
1103
+ case "tabs":
1104
+ return node.tabs.flatMap((c) => c.childrenProps);
1103
1105
  case "alert":
1104
1106
  case "button":
1105
1107
  case "input-checkbox":
@@ -1791,6 +1793,22 @@ var uploadInputComponentToProps = (component, rendererMapperProps) => {
1791
1793
  });
1792
1794
  };
1793
1795
 
1796
+ // src/revamp/renderers/mappers/tabsComponentToProps.ts
1797
+ var tabsComponentToProps = (component, rendererMapperProps) => {
1798
+ const tabs = component.tabs.map(({ components, tag, title }) => {
1799
+ const childrenProps = components.map((c) => componentToRendererProps(c, rendererMapperProps));
1800
+ return {
1801
+ title,
1802
+ tag,
1803
+ childrenProps,
1804
+ children: childrenProps.map(rendererMapperProps.render)
1805
+ };
1806
+ });
1807
+ return __spreadProps(__spreadValues(__spreadValues({}, pick(component, "uid", "type", "control", "margin")), rendererMapperProps), {
1808
+ tabs
1809
+ });
1810
+ };
1811
+
1794
1812
  // src/revamp/renderers/mappers/componentToRendererProps.ts
1795
1813
  var componentToRendererProps = (component, rendererMapperProps) => {
1796
1814
  if (isHiddenComponent(component)) {
@@ -1881,6 +1899,8 @@ var getComponentProps = (component, rendererMapperProps) => {
1881
1899
  return selectInputComponentToProps(component, rendererMapperProps);
1882
1900
  case "status-list":
1883
1901
  return statusListComponentToProps(component, rendererMapperProps);
1902
+ case "tabs":
1903
+ return tabsComponentToProps(component, rendererMapperProps);
1884
1904
  case "text":
1885
1905
  return textInputComponentToProps(component, rendererMapperProps);
1886
1906
  case "tuple":
@@ -2868,6 +2888,30 @@ var sectionLayoutToComponent = (uid, { control, title, components, callToAction,
2868
2888
  });
2869
2889
  };
2870
2890
 
2891
+ // src/revamp/domain/components/TabsComponent.ts
2892
+ var createTabsComponent = (tabsProps) => __spreadProps(__spreadValues({}, tabsProps), {
2893
+ type: "tabs"
2894
+ });
2895
+
2896
+ // src/revamp/domain/mappers/layout/tabsLayoutToComponent.ts
2897
+ var tabsLayoutToComponent = (uid, { control, margin = "md", tabs }, mapperProps, schemaComponents) => createTabsComponent({
2898
+ uid,
2899
+ control,
2900
+ margin,
2901
+ tabs: tabs.map(({ components, tag, title }, tabIndex) => ({
2902
+ tag,
2903
+ title,
2904
+ components: components.map(
2905
+ (c, componentIndex) => mapLayoutToComponent(
2906
+ `${uid}.tabs-${tabIndex}-${componentIndex}`,
2907
+ c,
2908
+ mapperProps,
2909
+ schemaComponents
2910
+ )
2911
+ )
2912
+ }))
2913
+ });
2914
+
2871
2915
  // src/revamp/domain/mappers/mapLayoutToComponent.ts
2872
2916
  var mapLayoutToComponent = (uid, layout, mapperProps, schemaComponents) => {
2873
2917
  switch (layout.type) {
@@ -2911,6 +2955,8 @@ var mapLayoutToComponent = (uid, layout, mapperProps, schemaComponents) => {
2911
2955
  return sectionLayoutToComponent(uid, layout, mapperProps, schemaComponents);
2912
2956
  case "status-list":
2913
2957
  return statusListLayoutToComponent(uid, layout, mapperProps);
2958
+ case "tabs":
2959
+ return tabsLayoutToComponent(uid, layout, mapperProps, schemaComponents);
2914
2960
  default:
2915
2961
  throw new Error(`Invalid layout type in ${JSON.stringify(layout)}`);
2916
2962
  }
package/build/main.mjs CHANGED
@@ -1057,6 +1057,8 @@ function getChildren(node) {
1057
1057
  return node.editableItemProps ? [node.editableItemProps] : [];
1058
1058
  case "input-select":
1059
1059
  return node.childrenProps ? [node.childrenProps] : [];
1060
+ case "tabs":
1061
+ return node.tabs.flatMap((c) => c.childrenProps);
1060
1062
  case "alert":
1061
1063
  case "button":
1062
1064
  case "input-checkbox":
@@ -1748,6 +1750,22 @@ var uploadInputComponentToProps = (component, rendererMapperProps) => {
1748
1750
  });
1749
1751
  };
1750
1752
 
1753
+ // src/revamp/renderers/mappers/tabsComponentToProps.ts
1754
+ var tabsComponentToProps = (component, rendererMapperProps) => {
1755
+ const tabs = component.tabs.map(({ components, tag, title }) => {
1756
+ const childrenProps = components.map((c) => componentToRendererProps(c, rendererMapperProps));
1757
+ return {
1758
+ title,
1759
+ tag,
1760
+ childrenProps,
1761
+ children: childrenProps.map(rendererMapperProps.render)
1762
+ };
1763
+ });
1764
+ return __spreadProps(__spreadValues(__spreadValues({}, pick(component, "uid", "type", "control", "margin")), rendererMapperProps), {
1765
+ tabs
1766
+ });
1767
+ };
1768
+
1751
1769
  // src/revamp/renderers/mappers/componentToRendererProps.ts
1752
1770
  var componentToRendererProps = (component, rendererMapperProps) => {
1753
1771
  if (isHiddenComponent(component)) {
@@ -1838,6 +1856,8 @@ var getComponentProps = (component, rendererMapperProps) => {
1838
1856
  return selectInputComponentToProps(component, rendererMapperProps);
1839
1857
  case "status-list":
1840
1858
  return statusListComponentToProps(component, rendererMapperProps);
1859
+ case "tabs":
1860
+ return tabsComponentToProps(component, rendererMapperProps);
1841
1861
  case "text":
1842
1862
  return textInputComponentToProps(component, rendererMapperProps);
1843
1863
  case "tuple":
@@ -2825,6 +2845,30 @@ var sectionLayoutToComponent = (uid, { control, title, components, callToAction,
2825
2845
  });
2826
2846
  };
2827
2847
 
2848
+ // src/revamp/domain/components/TabsComponent.ts
2849
+ var createTabsComponent = (tabsProps) => __spreadProps(__spreadValues({}, tabsProps), {
2850
+ type: "tabs"
2851
+ });
2852
+
2853
+ // src/revamp/domain/mappers/layout/tabsLayoutToComponent.ts
2854
+ var tabsLayoutToComponent = (uid, { control, margin = "md", tabs }, mapperProps, schemaComponents) => createTabsComponent({
2855
+ uid,
2856
+ control,
2857
+ margin,
2858
+ tabs: tabs.map(({ components, tag, title }, tabIndex) => ({
2859
+ tag,
2860
+ title,
2861
+ components: components.map(
2862
+ (c, componentIndex) => mapLayoutToComponent(
2863
+ `${uid}.tabs-${tabIndex}-${componentIndex}`,
2864
+ c,
2865
+ mapperProps,
2866
+ schemaComponents
2867
+ )
2868
+ )
2869
+ }))
2870
+ });
2871
+
2828
2872
  // src/revamp/domain/mappers/mapLayoutToComponent.ts
2829
2873
  var mapLayoutToComponent = (uid, layout, mapperProps, schemaComponents) => {
2830
2874
  switch (layout.type) {
@@ -2868,6 +2912,8 @@ var mapLayoutToComponent = (uid, layout, mapperProps, schemaComponents) => {
2868
2912
  return sectionLayoutToComponent(uid, layout, mapperProps, schemaComponents);
2869
2913
  case "status-list":
2870
2914
  return statusListLayoutToComponent(uid, layout, mapperProps);
2915
+ case "tabs":
2916
+ return tabsLayoutToComponent(uid, layout, mapperProps, schemaComponents);
2871
2917
  default:
2872
2918
  throw new Error(`Invalid layout type in ${JSON.stringify(layout)}`);
2873
2919
  }
@@ -0,0 +1,11 @@
1
+ import { BaseLayoutComponent, DomainComponent } from '../types';
2
+ export type TabsComponent = BaseLayoutComponent & {
3
+ type: 'tabs';
4
+ tabs: Tab[];
5
+ };
6
+ export type Tab = {
7
+ title: string;
8
+ components: DomainComponent[];
9
+ tag?: string;
10
+ };
11
+ export declare const createTabsComponent: (tabsProps: Pick<TabsComponent, "uid" | "control" | "margin" | "tabs">) => TabsComponent;
@@ -0,0 +1,5 @@
1
+ import { TabsLayout } from '@wise/dynamic-flow-types/build/next';
2
+ import { TabsComponent } from '../../components/TabsComponent';
3
+ import { MapperProps } from '../schema/types';
4
+ import { SchemaComponent } from '../../types';
5
+ export declare const tabsLayoutToComponent: (uid: string, { control, margin, tabs }: TabsLayout, mapperProps: MapperProps, schemaComponents: SchemaComponent[]) => TabsComponent;
@@ -38,9 +38,10 @@ import type { StepDomainComponent } from './components/step/StepDomainComponent'
38
38
  import type { TextInputComponent } from './components/TextInputComponent';
39
39
  import type { TupleComponent } from './components/TupleComponent';
40
40
  import type { UploadInputComponent } from './components/UploadInputComponent';
41
+ import { TabsComponent } from './components/TabsComponent';
41
42
  export type DomainComponent = SchemaComponent | LayoutComponent | RootDomainComponent | StepDomainComponent;
42
43
  export type SchemaComponent = PersistAsyncComponent | AllOfComponent | BooleanInputComponent | ConstComponent | DateInputComponent | IntegerInputComponent | MultiSelectComponent | MultiUploadInputComponent | NumberInputComponent | ObjectComponent | RepeatableComponent | SelectInputComponent | TextInputComponent | TupleComponent | UploadInputComponent;
43
- export type LayoutComponent = AlertComponent | BoxComponent | ButtonComponent | ColumnsComponent | ContainerComponent | DecisionComponent | DividerComponent | ExternalConfirmationComponent | FormComponent | HeadingComponent | ImageComponent | InstructionsComponent | ListComponent | LoadingIndicatorComponent | MarkdownComponent | ModalComponent | ModalContentComponent | ParagraphComponent | ReviewComponent | SearchComponent | SectionComponent | StatusListComponent;
44
+ export type LayoutComponent = AlertComponent | BoxComponent | ButtonComponent | ColumnsComponent | ContainerComponent | DecisionComponent | DividerComponent | ExternalConfirmationComponent | FormComponent | HeadingComponent | ImageComponent | InstructionsComponent | ListComponent | LoadingIndicatorComponent | MarkdownComponent | ModalComponent | ModalContentComponent | ParagraphComponent | ReviewComponent | SearchComponent | SectionComponent | StatusListComponent | TabsComponent;
44
45
  export type LocalValue = LocalValuePrimitive | LocalValueObject | LocalValueArray;
45
46
  export type LocalValuePrimitive = string | number | boolean | File | null;
46
47
  export interface LocalValueObject extends Record<string, LocalValuePrimitive | LocalValueObject | LocalValueArray> {
@@ -0,0 +1,4 @@
1
+ import { TabsRendererProps } from '@wise/dynamic-flow-types/build/renderers';
2
+ import { TabsComponent } from '../../domain/components/TabsComponent';
3
+ import { RendererMapperProps } from './componentToRendererProps';
4
+ export declare const tabsComponentToProps: (component: TabsComponent, rendererMapperProps: RendererMapperProps) => TabsRendererProps;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wise/dynamic-flow-client",
3
- "version": "4.7.1",
3
+ "version": "4.8.1",
4
4
  "description": "Dynamic Flow web client",
5
5
  "license": "Apache-2.0",
6
6
  "main": "./build/main.js",
@@ -36,43 +36,43 @@
36
36
  "@babel/preset-env": "7.27.2",
37
37
  "@babel/preset-react": "7.27.1",
38
38
  "@babel/preset-typescript": "7.27.1",
39
- "@chromatic-com/storybook": "4.0.0",
39
+ "@chromatic-com/storybook": "4.0.1",
40
40
  "@formatjs/cli": "^6.7.2",
41
- "@storybook/addon-a11y": "^9.0.10",
42
- "@storybook/addon-docs": "^9.0.10",
43
- "@storybook/addon-links": "^9.0.10",
44
- "@storybook/react-vite": "9.0.10",
41
+ "@storybook/addon-a11y": "^9.0.12",
42
+ "@storybook/addon-docs": "^9.0.12",
43
+ "@storybook/addon-links": "^9.0.12",
44
+ "@storybook/react-vite": "9.0.12",
45
45
  "@testing-library/dom": "10.4.0",
46
46
  "@testing-library/jest-dom": "6.6.3",
47
47
  "@testing-library/react": "16.3.0",
48
48
  "@testing-library/user-event": "14.6.1",
49
49
  "@transferwise/components": "46.98.1",
50
50
  "@transferwise/formatting": "^2.13.1",
51
- "@transferwise/icons": "3.22.0",
51
+ "@transferwise/icons": "3.22.2",
52
52
  "@transferwise/neptune-css": "14.24.4",
53
53
  "@types/jest": "29.5.14",
54
- "@types/node": "22.15.31",
54
+ "@types/node": "22.15.32",
55
55
  "@types/react": "18.3.23",
56
56
  "@types/react-dom": "18.3.7",
57
57
  "@types/react-intl": "3.0.0",
58
58
  "@wise/art": "2.21.2",
59
59
  "@wise/components-theming": "^1.6.3",
60
- "babel-jest": "29.7.0",
60
+ "babel-jest": "30.0.2",
61
61
  "esbuild": "0.25.5",
62
- "eslint-plugin-storybook": "9.0.10",
63
- "jest": "29.7.0",
64
- "jest-environment-jsdom": "29.7.0",
62
+ "eslint-plugin-storybook": "9.0.12",
63
+ "jest": "30.0.2",
64
+ "jest-environment-jsdom": "30.0.2",
65
65
  "jest-fetch-mock": "^3.0.3",
66
- "jest-watch-typeahead": "^2.2.2",
66
+ "jest-watch-typeahead": "^3.0.1",
67
67
  "npm-run-all2": "7.0.2",
68
- "postcss": "^8.5.5",
68
+ "postcss": "^8.5.6",
69
69
  "postcss-cli": "^11.0.1",
70
- "postcss-import": "^16.1.0",
70
+ "postcss-import": "^16.1.1",
71
71
  "react": "18.3.1",
72
72
  "react-dom": "18.3.1",
73
73
  "react-intl": "6.8.9",
74
- "storybook": "^9.0.10",
75
- "stylelint": "16.20.0",
74
+ "storybook": "^9.0.12",
75
+ "stylelint": "16.21.0",
76
76
  "stylelint-config-standard": "36.0.1",
77
77
  "stylelint-no-unsupported-browser-features": "8.0.4",
78
78
  "stylelint-value-no-unknown-custom-properties": "6.0.1",
@@ -95,7 +95,7 @@
95
95
  "classnames": "2.5.1",
96
96
  "react-webcam": "^7.2.0",
97
97
  "screenfull": "^5.2.0",
98
- "@wise/dynamic-flow-types": "3.5.1"
98
+ "@wise/dynamic-flow-types": "3.6.1"
99
99
  },
100
100
  "scripts": {
101
101
  "dev": "pnpm build:visual-tests && storybook dev -p 3003",