@transferwise/components 0.0.0-experimental-b20133d → 0.0.0-experimental-a2f9b4e

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 (52) hide show
  1. package/build/field/Field.js +32 -60
  2. package/build/field/Field.js.map +1 -1
  3. package/build/field/Field.mjs +34 -62
  4. package/build/field/Field.mjs.map +1 -1
  5. package/build/flowNavigation/FlowNavigation.js +2 -4
  6. package/build/flowNavigation/FlowNavigation.js.map +1 -1
  7. package/build/flowNavigation/FlowNavigation.mjs +2 -4
  8. package/build/flowNavigation/FlowNavigation.mjs.map +1 -1
  9. package/build/i18n/en.json +0 -1
  10. package/build/i18n/en.json.js +0 -1
  11. package/build/i18n/en.json.js.map +1 -1
  12. package/build/i18n/en.json.mjs +0 -1
  13. package/build/i18n/en.json.mjs.map +1 -1
  14. package/build/inputs/TextArea.js +0 -5
  15. package/build/inputs/TextArea.js.map +1 -1
  16. package/build/inputs/TextArea.mjs +1 -6
  17. package/build/inputs/TextArea.mjs.map +1 -1
  18. package/build/inputs/contexts.js +0 -16
  19. package/build/inputs/contexts.js.map +1 -1
  20. package/build/inputs/contexts.mjs +2 -16
  21. package/build/inputs/contexts.mjs.map +1 -1
  22. package/build/main.css +1 -14
  23. package/build/styles/field/Field.css +1 -13
  24. package/build/styles/main.css +1 -14
  25. package/build/types/field/Field.d.ts.map +1 -1
  26. package/build/types/flowNavigation/FlowNavigation.d.ts.map +1 -1
  27. package/build/types/inputs/TextArea.d.ts.map +1 -1
  28. package/build/types/inputs/contexts.d.ts +0 -6
  29. package/build/types/inputs/contexts.d.ts.map +1 -1
  30. package/build/types/test-utils/index.d.ts +0 -2
  31. package/build/types/test-utils/index.d.ts.map +1 -1
  32. package/package.json +1 -1
  33. package/src/field/Field.css +1 -13
  34. package/src/field/Field.less +1 -11
  35. package/src/field/Field.story.tsx +1 -5
  36. package/src/field/Field.tsx +37 -80
  37. package/src/flowNavigation/FlowNavigation.test.js +2 -2
  38. package/src/flowNavigation/FlowNavigation.test.story.tsx +88 -0
  39. package/src/flowNavigation/FlowNavigation.tsx +2 -5
  40. package/src/i18n/en.json +0 -1
  41. package/src/inputs/TextArea.tsx +2 -7
  42. package/src/inputs/contexts.tsx +1 -18
  43. package/src/main.css +1 -14
  44. package/src/textareaWithDisplayFormat/TextareaWithDisplayFormat.story.tsx +0 -1
  45. package/build/field/Field.messages.js +0 -14
  46. package/build/field/Field.messages.js.map +0 -1
  47. package/build/field/Field.messages.mjs +0 -10
  48. package/build/field/Field.messages.mjs.map +0 -1
  49. package/build/types/field/Field.messages.d.ts +0 -8
  50. package/build/types/field/Field.messages.d.ts.map +0 -1
  51. package/src/field/Field.messages.ts +0 -8
  52. package/src/inputs/TextArea.story.tsx +0 -56
@@ -25,20 +25,6 @@ function useInputAttributes({
25
25
  function useFieldLabelRef() {
26
26
  return React.useContext(FieldLabelContext)?.ref;
27
27
  }
28
- const TextareaCharacterCountContext = /*#__PURE__*/React.createContext(undefined);
29
- const TextareaCharacterCountProvider = TextareaCharacterCountContext.Provider;
30
- function useTextareaCharacterCount(current, max) {
31
- const setCharacterCount = React.useContext(TextareaCharacterCountContext);
32
- React.useEffect(() => {
33
- if (setCharacterCount && max != null) {
34
- setCharacterCount({
35
- current,
36
- max
37
- });
38
- return () => setCharacterCount(null);
39
- }
40
- }, [setCharacterCount, current, max]);
41
- }
42
28
  function withInputAttributes(Component, args) {
43
29
  function ComponentWithInputAttributes(props) {
44
30
  return /*#__PURE__*/jsxRuntime.jsx(Component, {
@@ -54,9 +40,7 @@ exports.FieldLabelContextProvider = FieldLabelContextProvider;
54
40
  exports.InputDescribedByProvider = InputDescribedByProvider;
55
41
  exports.InputIdContextProvider = InputIdContextProvider;
56
42
  exports.InputInvalidProvider = InputInvalidProvider;
57
- exports.TextareaCharacterCountProvider = TextareaCharacterCountProvider;
58
43
  exports.useFieldLabelRef = useFieldLabelRef;
59
44
  exports.useInputAttributes = useInputAttributes;
60
- exports.useTextareaCharacterCount = useTextareaCharacterCount;
61
45
  exports.withInputAttributes = withInputAttributes;
62
46
  //# sourceMappingURL=contexts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"contexts.js","sources":["../../src/inputs/contexts.tsx"],"sourcesContent":["import { createContext, useContext, useEffect } from 'react';\n\ntype FieldLabelContextType = {\n id?: string;\n ref?: React.RefObject<HTMLLabelElement>;\n};\n\nconst FieldLabelContext = createContext<FieldLabelContextType | undefined>(undefined);\nexport const FieldLabelContextProvider = FieldLabelContext.Provider;\n\nconst InputIdContext = createContext<string | undefined>(undefined);\nexport const InputIdContextProvider = InputIdContext.Provider;\n\nconst InputDescribedByContext = createContext<string | undefined>(undefined);\nexport const InputDescribedByProvider = InputDescribedByContext.Provider;\n\nconst InputInvalidContext = createContext<boolean | undefined>(undefined);\nexport const InputInvalidProvider = InputInvalidContext.Provider;\n\ninterface UseInputAttributesArgs {\n /** Set this to `true` if the underlying element is not directly [labelable as per the HTML specification](https://html.spec.whatwg.org/multipage/forms.html#category-label). */\n nonLabelable?: boolean;\n}\n\nexport function useInputAttributes({ nonLabelable }: UseInputAttributesArgs = {}) {\n const labelId = useContext(FieldLabelContext)?.id;\n return {\n id: useContext(InputIdContext),\n 'aria-labelledby': nonLabelable ? labelId : undefined,\n 'aria-describedby': useContext(InputDescribedByContext),\n 'aria-invalid': useContext(InputInvalidContext),\n } satisfies React.HTMLAttributes<HTMLElement>;\n}\n\nexport function useFieldLabelRef() {\n return useContext(FieldLabelContext)?.ref;\n}\n\nexport type TextareaCharacterCountState = { current: number; max: number } | null;\n\nconst TextareaCharacterCountContext = createContext<\n ((state: TextareaCharacterCountState) => void) | undefined\n>(undefined);\nexport const TextareaCharacterCountProvider = TextareaCharacterCountContext.Provider;\n\nexport function useTextareaCharacterCount(current: number, max: number | undefined) {\n const setCharacterCount = useContext(TextareaCharacterCountContext);\n useEffect(() => {\n if (setCharacterCount && max != null) {\n setCharacterCount({ current, max });\n return () => setCharacterCount(null);\n }\n }, [setCharacterCount, current, max]);\n}\n\nexport interface WithInputAttributesProps {\n inputAttributes: ReturnType<typeof useInputAttributes>;\n}\n\nexport function withInputAttributes<T extends Partial<WithInputAttributesProps>>(\n Component: React.ComponentType<T>,\n args?: UseInputAttributesArgs,\n) {\n function ComponentWithInputAttributes(props: Omit<T, keyof WithInputAttributesProps>) {\n return <Component inputAttributes={useInputAttributes(args)} {...(props as T)} />;\n }\n\n ComponentWithInputAttributes.displayName = `withInputAttributes(${Component.displayName || Component.name || 'Component'})`;\n\n return ComponentWithInputAttributes;\n}\n"],"names":["FieldLabelContext","createContext","undefined","FieldLabelContextProvider","Provider","InputIdContext","InputIdContextProvider","InputDescribedByContext","InputDescribedByProvider","InputInvalidContext","InputInvalidProvider","useInputAttributes","nonLabelable","labelId","useContext","id","useFieldLabelRef","ref","TextareaCharacterCountContext","TextareaCharacterCountProvider","useTextareaCharacterCount","current","max","setCharacterCount","useEffect","withInputAttributes","Component","args","ComponentWithInputAttributes","props","_jsx","inputAttributes","displayName","name"],"mappings":";;;;;AAOA,MAAMA,iBAAiB,gBAAGC,mBAAa,CAAoCC,SAAS,CAAC;AAC9E,MAAMC,yBAAyB,GAAGH,iBAAiB,CAACI;AAE3D,MAAMC,cAAc,gBAAGJ,mBAAa,CAAqBC,SAAS,CAAC;AAC5D,MAAMI,sBAAsB,GAAGD,cAAc,CAACD;AAErD,MAAMG,uBAAuB,gBAAGN,mBAAa,CAAqBC,SAAS,CAAC;AACrE,MAAMM,wBAAwB,GAAGD,uBAAuB,CAACH;AAEhE,MAAMK,mBAAmB,gBAAGR,mBAAa,CAAsBC,SAAS,CAAC;AAClE,MAAMQ,oBAAoB,GAAGD,mBAAmB,CAACL;SAOxCO,kBAAkBA,CAAC;AAAEC,EAAAA;IAAyC,EAAE,EAAA;AAC9E,EAAA,MAAMC,OAAO,GAAGC,gBAAU,CAACd,iBAAiB,CAAC,EAAEe,EAAE;EACjD,OAAO;AACLA,IAAAA,EAAE,EAAED,gBAAU,CAACT,cAAc,CAAC;AAC9B,IAAA,iBAAiB,EAAEO,YAAY,GAAGC,OAAO,GAAGX,SAAS;AACrD,IAAA,kBAAkB,EAAEY,gBAAU,CAACP,uBAAuB,CAAC;IACvD,cAAc,EAAEO,gBAAU,CAACL,mBAAmB;GACH;AAC/C;SAEgBO,gBAAgBA,GAAA;AAC9B,EAAA,OAAOF,gBAAU,CAACd,iBAAiB,CAAC,EAAEiB,GAAG;AAC3C;AAIA,MAAMC,6BAA6B,gBAAGjB,mBAAa,CAEjDC,SAAS,CAAC;AACL,MAAMiB,8BAA8B,GAAGD,6BAA6B,CAACd;AAEtE,SAAUgB,yBAAyBA,CAACC,OAAe,EAAEC,GAAuB,EAAA;AAChF,EAAA,MAAMC,iBAAiB,GAAGT,gBAAU,CAACI,6BAA6B,CAAC;AACnEM,EAAAA,eAAS,CAAC,MAAK;AACb,IAAA,IAAID,iBAAiB,IAAID,GAAG,IAAI,IAAI,EAAE;AACpCC,MAAAA,iBAAiB,CAAC;QAAEF,OAAO;AAAEC,QAAAA;AAAG,OAAE,CAAC;AACnC,MAAA,OAAO,MAAMC,iBAAiB,CAAC,IAAI,CAAC;AACtC,IAAA;EACF,CAAC,EAAE,CAACA,iBAAiB,EAAEF,OAAO,EAAEC,GAAG,CAAC,CAAC;AACvC;AAMM,SAAUG,mBAAmBA,CACjCC,SAAiC,EACjCC,IAA6B,EAAA;EAE7B,SAASC,4BAA4BA,CAACC,KAA8C,EAAA;IAClF,oBAAOC,cAAA,CAACJ,SAAS,EAAA;AAACK,MAAAA,eAAe,EAAEpB,kBAAkB,CAACgB,IAAI,CAAE;MAAA,GAAME;AAAW,MAAI;AACnF,EAAA;AAEAD,EAAAA,4BAA4B,CAACI,WAAW,GAAG,CAAA,oBAAA,EAAuBN,SAAS,CAACM,WAAW,IAAIN,SAAS,CAACO,IAAI,IAAI,WAAW,CAAA,CAAA,CAAG;AAE3H,EAAA,OAAOL,4BAA4B;AACrC;;;;;;;;;;;;"}
1
+ {"version":3,"file":"contexts.js","sources":["../../src/inputs/contexts.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\n\ntype FieldLabelContextType = {\n id?: string;\n ref?: React.RefObject<HTMLLabelElement>;\n};\n\nconst FieldLabelContext = createContext<FieldLabelContextType | undefined>(undefined);\nexport const FieldLabelContextProvider = FieldLabelContext.Provider;\n\nconst InputIdContext = createContext<string | undefined>(undefined);\nexport const InputIdContextProvider = InputIdContext.Provider;\n\nconst InputDescribedByContext = createContext<string | undefined>(undefined);\nexport const InputDescribedByProvider = InputDescribedByContext.Provider;\n\nconst InputInvalidContext = createContext<boolean | undefined>(undefined);\nexport const InputInvalidProvider = InputInvalidContext.Provider;\n\ninterface UseInputAttributesArgs {\n /** Set this to `true` if the underlying element is not directly [labelable as per the HTML specification](https://html.spec.whatwg.org/multipage/forms.html#category-label). */\n nonLabelable?: boolean;\n}\n\nexport function useInputAttributes({ nonLabelable }: UseInputAttributesArgs = {}) {\n const labelId = useContext(FieldLabelContext)?.id;\n return {\n id: useContext(InputIdContext),\n 'aria-labelledby': nonLabelable ? labelId : undefined,\n 'aria-describedby': useContext(InputDescribedByContext),\n 'aria-invalid': useContext(InputInvalidContext),\n } satisfies React.HTMLAttributes<HTMLElement>;\n}\n\nexport function useFieldLabelRef() {\n return useContext(FieldLabelContext)?.ref;\n}\n\nexport interface WithInputAttributesProps {\n inputAttributes: ReturnType<typeof useInputAttributes>;\n}\n\nexport function withInputAttributes<T extends Partial<WithInputAttributesProps>>(\n Component: React.ComponentType<T>,\n args?: UseInputAttributesArgs,\n) {\n function ComponentWithInputAttributes(props: Omit<T, keyof WithInputAttributesProps>) {\n return <Component inputAttributes={useInputAttributes(args)} {...(props as T)} />;\n }\n\n ComponentWithInputAttributes.displayName = `withInputAttributes(${Component.displayName || Component.name || 'Component'})`;\n\n return ComponentWithInputAttributes;\n}\n"],"names":["FieldLabelContext","createContext","undefined","FieldLabelContextProvider","Provider","InputIdContext","InputIdContextProvider","InputDescribedByContext","InputDescribedByProvider","InputInvalidContext","InputInvalidProvider","useInputAttributes","nonLabelable","labelId","useContext","id","useFieldLabelRef","ref","withInputAttributes","Component","args","ComponentWithInputAttributes","props","_jsx","inputAttributes","displayName","name"],"mappings":";;;;;AAOA,MAAMA,iBAAiB,gBAAGC,mBAAa,CAAoCC,SAAS,CAAC;AAC9E,MAAMC,yBAAyB,GAAGH,iBAAiB,CAACI;AAE3D,MAAMC,cAAc,gBAAGJ,mBAAa,CAAqBC,SAAS,CAAC;AAC5D,MAAMI,sBAAsB,GAAGD,cAAc,CAACD;AAErD,MAAMG,uBAAuB,gBAAGN,mBAAa,CAAqBC,SAAS,CAAC;AACrE,MAAMM,wBAAwB,GAAGD,uBAAuB,CAACH;AAEhE,MAAMK,mBAAmB,gBAAGR,mBAAa,CAAsBC,SAAS,CAAC;AAClE,MAAMQ,oBAAoB,GAAGD,mBAAmB,CAACL;SAOxCO,kBAAkBA,CAAC;AAAEC,EAAAA;IAAyC,EAAE,EAAA;AAC9E,EAAA,MAAMC,OAAO,GAAGC,gBAAU,CAACd,iBAAiB,CAAC,EAAEe,EAAE;EACjD,OAAO;AACLA,IAAAA,EAAE,EAAED,gBAAU,CAACT,cAAc,CAAC;AAC9B,IAAA,iBAAiB,EAAEO,YAAY,GAAGC,OAAO,GAAGX,SAAS;AACrD,IAAA,kBAAkB,EAAEY,gBAAU,CAACP,uBAAuB,CAAC;IACvD,cAAc,EAAEO,gBAAU,CAACL,mBAAmB;GACH;AAC/C;SAEgBO,gBAAgBA,GAAA;AAC9B,EAAA,OAAOF,gBAAU,CAACd,iBAAiB,CAAC,EAAEiB,GAAG;AAC3C;AAMM,SAAUC,mBAAmBA,CACjCC,SAAiC,EACjCC,IAA6B,EAAA;EAE7B,SAASC,4BAA4BA,CAACC,KAA8C,EAAA;IAClF,oBAAOC,cAAA,CAACJ,SAAS,EAAA;AAACK,MAAAA,eAAe,EAAEb,kBAAkB,CAACS,IAAI,CAAE;MAAA,GAAME;AAAW,MAAI;AACnF,EAAA;AAEAD,EAAAA,4BAA4B,CAACI,WAAW,GAAG,CAAA,oBAAA,EAAuBN,SAAS,CAACM,WAAW,IAAIN,SAAS,CAACO,IAAI,IAAI,WAAW,CAAA,CAAA,CAAG;AAE3H,EAAA,OAAOL,4BAA4B;AACrC;;;;;;;;;;"}
@@ -1,4 +1,4 @@
1
- import { createContext, useContext, useEffect } from 'react';
1
+ import { createContext, useContext } from 'react';
2
2
  import { jsx } from 'react/jsx-runtime';
3
3
 
4
4
  const FieldLabelContext = /*#__PURE__*/createContext(undefined);
@@ -23,20 +23,6 @@ function useInputAttributes({
23
23
  function useFieldLabelRef() {
24
24
  return useContext(FieldLabelContext)?.ref;
25
25
  }
26
- const TextareaCharacterCountContext = /*#__PURE__*/createContext(undefined);
27
- const TextareaCharacterCountProvider = TextareaCharacterCountContext.Provider;
28
- function useTextareaCharacterCount(current, max) {
29
- const setCharacterCount = useContext(TextareaCharacterCountContext);
30
- useEffect(() => {
31
- if (setCharacterCount && max != null) {
32
- setCharacterCount({
33
- current,
34
- max
35
- });
36
- return () => setCharacterCount(null);
37
- }
38
- }, [setCharacterCount, current, max]);
39
- }
40
26
  function withInputAttributes(Component, args) {
41
27
  function ComponentWithInputAttributes(props) {
42
28
  return /*#__PURE__*/jsx(Component, {
@@ -48,5 +34,5 @@ function withInputAttributes(Component, args) {
48
34
  return ComponentWithInputAttributes;
49
35
  }
50
36
 
51
- export { FieldLabelContextProvider, InputDescribedByProvider, InputIdContextProvider, InputInvalidProvider, TextareaCharacterCountProvider, useFieldLabelRef, useInputAttributes, useTextareaCharacterCount, withInputAttributes };
37
+ export { FieldLabelContextProvider, InputDescribedByProvider, InputIdContextProvider, InputInvalidProvider, useFieldLabelRef, useInputAttributes, withInputAttributes };
52
38
  //# sourceMappingURL=contexts.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"contexts.mjs","sources":["../../src/inputs/contexts.tsx"],"sourcesContent":["import { createContext, useContext, useEffect } from 'react';\n\ntype FieldLabelContextType = {\n id?: string;\n ref?: React.RefObject<HTMLLabelElement>;\n};\n\nconst FieldLabelContext = createContext<FieldLabelContextType | undefined>(undefined);\nexport const FieldLabelContextProvider = FieldLabelContext.Provider;\n\nconst InputIdContext = createContext<string | undefined>(undefined);\nexport const InputIdContextProvider = InputIdContext.Provider;\n\nconst InputDescribedByContext = createContext<string | undefined>(undefined);\nexport const InputDescribedByProvider = InputDescribedByContext.Provider;\n\nconst InputInvalidContext = createContext<boolean | undefined>(undefined);\nexport const InputInvalidProvider = InputInvalidContext.Provider;\n\ninterface UseInputAttributesArgs {\n /** Set this to `true` if the underlying element is not directly [labelable as per the HTML specification](https://html.spec.whatwg.org/multipage/forms.html#category-label). */\n nonLabelable?: boolean;\n}\n\nexport function useInputAttributes({ nonLabelable }: UseInputAttributesArgs = {}) {\n const labelId = useContext(FieldLabelContext)?.id;\n return {\n id: useContext(InputIdContext),\n 'aria-labelledby': nonLabelable ? labelId : undefined,\n 'aria-describedby': useContext(InputDescribedByContext),\n 'aria-invalid': useContext(InputInvalidContext),\n } satisfies React.HTMLAttributes<HTMLElement>;\n}\n\nexport function useFieldLabelRef() {\n return useContext(FieldLabelContext)?.ref;\n}\n\nexport type TextareaCharacterCountState = { current: number; max: number } | null;\n\nconst TextareaCharacterCountContext = createContext<\n ((state: TextareaCharacterCountState) => void) | undefined\n>(undefined);\nexport const TextareaCharacterCountProvider = TextareaCharacterCountContext.Provider;\n\nexport function useTextareaCharacterCount(current: number, max: number | undefined) {\n const setCharacterCount = useContext(TextareaCharacterCountContext);\n useEffect(() => {\n if (setCharacterCount && max != null) {\n setCharacterCount({ current, max });\n return () => setCharacterCount(null);\n }\n }, [setCharacterCount, current, max]);\n}\n\nexport interface WithInputAttributesProps {\n inputAttributes: ReturnType<typeof useInputAttributes>;\n}\n\nexport function withInputAttributes<T extends Partial<WithInputAttributesProps>>(\n Component: React.ComponentType<T>,\n args?: UseInputAttributesArgs,\n) {\n function ComponentWithInputAttributes(props: Omit<T, keyof WithInputAttributesProps>) {\n return <Component inputAttributes={useInputAttributes(args)} {...(props as T)} />;\n }\n\n ComponentWithInputAttributes.displayName = `withInputAttributes(${Component.displayName || Component.name || 'Component'})`;\n\n return ComponentWithInputAttributes;\n}\n"],"names":["FieldLabelContext","createContext","undefined","FieldLabelContextProvider","Provider","InputIdContext","InputIdContextProvider","InputDescribedByContext","InputDescribedByProvider","InputInvalidContext","InputInvalidProvider","useInputAttributes","nonLabelable","labelId","useContext","id","useFieldLabelRef","ref","TextareaCharacterCountContext","TextareaCharacterCountProvider","useTextareaCharacterCount","current","max","setCharacterCount","useEffect","withInputAttributes","Component","args","ComponentWithInputAttributes","props","_jsx","inputAttributes","displayName","name"],"mappings":";;;AAOA,MAAMA,iBAAiB,gBAAGC,aAAa,CAAoCC,SAAS,CAAC;AAC9E,MAAMC,yBAAyB,GAAGH,iBAAiB,CAACI;AAE3D,MAAMC,cAAc,gBAAGJ,aAAa,CAAqBC,SAAS,CAAC;AAC5D,MAAMI,sBAAsB,GAAGD,cAAc,CAACD;AAErD,MAAMG,uBAAuB,gBAAGN,aAAa,CAAqBC,SAAS,CAAC;AACrE,MAAMM,wBAAwB,GAAGD,uBAAuB,CAACH;AAEhE,MAAMK,mBAAmB,gBAAGR,aAAa,CAAsBC,SAAS,CAAC;AAClE,MAAMQ,oBAAoB,GAAGD,mBAAmB,CAACL;SAOxCO,kBAAkBA,CAAC;AAAEC,EAAAA;IAAyC,EAAE,EAAA;AAC9E,EAAA,MAAMC,OAAO,GAAGC,UAAU,CAACd,iBAAiB,CAAC,EAAEe,EAAE;EACjD,OAAO;AACLA,IAAAA,EAAE,EAAED,UAAU,CAACT,cAAc,CAAC;AAC9B,IAAA,iBAAiB,EAAEO,YAAY,GAAGC,OAAO,GAAGX,SAAS;AACrD,IAAA,kBAAkB,EAAEY,UAAU,CAACP,uBAAuB,CAAC;IACvD,cAAc,EAAEO,UAAU,CAACL,mBAAmB;GACH;AAC/C;SAEgBO,gBAAgBA,GAAA;AAC9B,EAAA,OAAOF,UAAU,CAACd,iBAAiB,CAAC,EAAEiB,GAAG;AAC3C;AAIA,MAAMC,6BAA6B,gBAAGjB,aAAa,CAEjDC,SAAS,CAAC;AACL,MAAMiB,8BAA8B,GAAGD,6BAA6B,CAACd;AAEtE,SAAUgB,yBAAyBA,CAACC,OAAe,EAAEC,GAAuB,EAAA;AAChF,EAAA,MAAMC,iBAAiB,GAAGT,UAAU,CAACI,6BAA6B,CAAC;AACnEM,EAAAA,SAAS,CAAC,MAAK;AACb,IAAA,IAAID,iBAAiB,IAAID,GAAG,IAAI,IAAI,EAAE;AACpCC,MAAAA,iBAAiB,CAAC;QAAEF,OAAO;AAAEC,QAAAA;AAAG,OAAE,CAAC;AACnC,MAAA,OAAO,MAAMC,iBAAiB,CAAC,IAAI,CAAC;AACtC,IAAA;EACF,CAAC,EAAE,CAACA,iBAAiB,EAAEF,OAAO,EAAEC,GAAG,CAAC,CAAC;AACvC;AAMM,SAAUG,mBAAmBA,CACjCC,SAAiC,EACjCC,IAA6B,EAAA;EAE7B,SAASC,4BAA4BA,CAACC,KAA8C,EAAA;IAClF,oBAAOC,GAAA,CAACJ,SAAS,EAAA;AAACK,MAAAA,eAAe,EAAEpB,kBAAkB,CAACgB,IAAI,CAAE;MAAA,GAAME;AAAW,MAAI;AACnF,EAAA;AAEAD,EAAAA,4BAA4B,CAACI,WAAW,GAAG,CAAA,oBAAA,EAAuBN,SAAS,CAACM,WAAW,IAAIN,SAAS,CAACO,IAAI,IAAI,WAAW,CAAA,CAAA,CAAG;AAE3H,EAAA,OAAOL,4BAA4B;AACrC;;;;"}
1
+ {"version":3,"file":"contexts.mjs","sources":["../../src/inputs/contexts.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\n\ntype FieldLabelContextType = {\n id?: string;\n ref?: React.RefObject<HTMLLabelElement>;\n};\n\nconst FieldLabelContext = createContext<FieldLabelContextType | undefined>(undefined);\nexport const FieldLabelContextProvider = FieldLabelContext.Provider;\n\nconst InputIdContext = createContext<string | undefined>(undefined);\nexport const InputIdContextProvider = InputIdContext.Provider;\n\nconst InputDescribedByContext = createContext<string | undefined>(undefined);\nexport const InputDescribedByProvider = InputDescribedByContext.Provider;\n\nconst InputInvalidContext = createContext<boolean | undefined>(undefined);\nexport const InputInvalidProvider = InputInvalidContext.Provider;\n\ninterface UseInputAttributesArgs {\n /** Set this to `true` if the underlying element is not directly [labelable as per the HTML specification](https://html.spec.whatwg.org/multipage/forms.html#category-label). */\n nonLabelable?: boolean;\n}\n\nexport function useInputAttributes({ nonLabelable }: UseInputAttributesArgs = {}) {\n const labelId = useContext(FieldLabelContext)?.id;\n return {\n id: useContext(InputIdContext),\n 'aria-labelledby': nonLabelable ? labelId : undefined,\n 'aria-describedby': useContext(InputDescribedByContext),\n 'aria-invalid': useContext(InputInvalidContext),\n } satisfies React.HTMLAttributes<HTMLElement>;\n}\n\nexport function useFieldLabelRef() {\n return useContext(FieldLabelContext)?.ref;\n}\n\nexport interface WithInputAttributesProps {\n inputAttributes: ReturnType<typeof useInputAttributes>;\n}\n\nexport function withInputAttributes<T extends Partial<WithInputAttributesProps>>(\n Component: React.ComponentType<T>,\n args?: UseInputAttributesArgs,\n) {\n function ComponentWithInputAttributes(props: Omit<T, keyof WithInputAttributesProps>) {\n return <Component inputAttributes={useInputAttributes(args)} {...(props as T)} />;\n }\n\n ComponentWithInputAttributes.displayName = `withInputAttributes(${Component.displayName || Component.name || 'Component'})`;\n\n return ComponentWithInputAttributes;\n}\n"],"names":["FieldLabelContext","createContext","undefined","FieldLabelContextProvider","Provider","InputIdContext","InputIdContextProvider","InputDescribedByContext","InputDescribedByProvider","InputInvalidContext","InputInvalidProvider","useInputAttributes","nonLabelable","labelId","useContext","id","useFieldLabelRef","ref","withInputAttributes","Component","args","ComponentWithInputAttributes","props","_jsx","inputAttributes","displayName","name"],"mappings":";;;AAOA,MAAMA,iBAAiB,gBAAGC,aAAa,CAAoCC,SAAS,CAAC;AAC9E,MAAMC,yBAAyB,GAAGH,iBAAiB,CAACI;AAE3D,MAAMC,cAAc,gBAAGJ,aAAa,CAAqBC,SAAS,CAAC;AAC5D,MAAMI,sBAAsB,GAAGD,cAAc,CAACD;AAErD,MAAMG,uBAAuB,gBAAGN,aAAa,CAAqBC,SAAS,CAAC;AACrE,MAAMM,wBAAwB,GAAGD,uBAAuB,CAACH;AAEhE,MAAMK,mBAAmB,gBAAGR,aAAa,CAAsBC,SAAS,CAAC;AAClE,MAAMQ,oBAAoB,GAAGD,mBAAmB,CAACL;SAOxCO,kBAAkBA,CAAC;AAAEC,EAAAA;IAAyC,EAAE,EAAA;AAC9E,EAAA,MAAMC,OAAO,GAAGC,UAAU,CAACd,iBAAiB,CAAC,EAAEe,EAAE;EACjD,OAAO;AACLA,IAAAA,EAAE,EAAED,UAAU,CAACT,cAAc,CAAC;AAC9B,IAAA,iBAAiB,EAAEO,YAAY,GAAGC,OAAO,GAAGX,SAAS;AACrD,IAAA,kBAAkB,EAAEY,UAAU,CAACP,uBAAuB,CAAC;IACvD,cAAc,EAAEO,UAAU,CAACL,mBAAmB;GACH;AAC/C;SAEgBO,gBAAgBA,GAAA;AAC9B,EAAA,OAAOF,UAAU,CAACd,iBAAiB,CAAC,EAAEiB,GAAG;AAC3C;AAMM,SAAUC,mBAAmBA,CACjCC,SAAiC,EACjCC,IAA6B,EAAA;EAE7B,SAASC,4BAA4BA,CAACC,KAA8C,EAAA;IAClF,oBAAOC,GAAA,CAACJ,SAAS,EAAA;AAACK,MAAAA,eAAe,EAAEb,kBAAkB,CAACS,IAAI,CAAE;MAAA,GAAME;AAAW,MAAI;AACnF,EAAA;AAEAD,EAAAA,4BAA4B,CAACI,WAAW,GAAG,CAAA,oBAAA,EAAuBN,SAAS,CAACM,WAAW,IAAIN,SAAS,CAACO,IAAI,IAAI,WAAW,CAAA,CAAA,CAAG;AAE3H,EAAA,OAAOL,4BAA4B;AACrC;;;;"}
package/build/main.css CHANGED
@@ -30194,22 +30194,9 @@ html:not([dir="rtl"]) .np-flow-navigation--sm .np-flow-navigation__stepper {
30194
30194
  }
30195
30195
 
30196
30196
  .np-field-control,
30197
- .np-field-footer {
30198
- display: flex;
30199
- align-items: flex-start;
30197
+ .np-field__prompt {
30200
30198
  margin-top: 4px;
30201
30199
  margin-top: var(--size-4);
30202
- gap: 8px;
30203
- gap: var(--size-8);
30204
- }
30205
-
30206
- .np-field-counter {
30207
- margin-left: auto;
30208
- white-space: nowrap;
30209
- padding: 4px 0;
30210
- padding: var(--size-4) 0;
30211
- color: #768e9c;
30212
- color: var(--color-content-tertiary);
30213
30200
  }
30214
30201
 
30215
30202
  .np-field .form-group--typeahead[class],
@@ -1,19 +1,7 @@
1
1
  .np-field-control,
2
- .np-field-footer {
3
- display: flex;
4
- align-items: flex-start;
2
+ .np-field__prompt {
5
3
  margin-top: 4px;
6
4
  margin-top: var(--size-4);
7
- gap: 8px;
8
- gap: var(--size-8);
9
- }
10
- .np-field-counter {
11
- margin-left: auto;
12
- white-space: nowrap;
13
- padding: 4px 0;
14
- padding: var(--size-4) 0;
15
- color: #768e9c;
16
- color: var(--color-content-tertiary);
17
5
  }
18
6
  .np-field .form-group--typeahead[class],
19
7
  .np-field .np-checkbox-label[class] {
@@ -30194,22 +30194,9 @@ html:not([dir="rtl"]) .np-flow-navigation--sm .np-flow-navigation__stepper {
30194
30194
  }
30195
30195
 
30196
30196
  .np-field-control,
30197
- .np-field-footer {
30198
- display: flex;
30199
- align-items: flex-start;
30197
+ .np-field__prompt {
30200
30198
  margin-top: 4px;
30201
30199
  margin-top: var(--size-4);
30202
- gap: 8px;
30203
- gap: var(--size-8);
30204
- }
30205
-
30206
- .np-field-counter {
30207
- margin-left: auto;
30208
- white-space: nowrap;
30209
- padding: 4px 0;
30210
- padding: var(--size-4) 0;
30211
- color: #768e9c;
30212
- color: var(--color-content-tertiary);
30213
30200
  }
30214
30201
 
30215
30202
  .np-field .form-group--typeahead[class],
@@ -1 +1 @@
1
- {"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../../src/field/Field.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAWjE,MAAM,MAAM,UAAU,GAAG;IACvB,6IAA6I;IAC7I,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,sGAAsG;IACtG,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,oBAAoB;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kDAAkD;IAClD,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B;;;SAGK;IACL,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,8EAA8E;IAC9E,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,iCAAiC;IACjC,SAAS,CAAC,EAAE,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,KAAK,GAAI,wJAanB,UAAU,gCAkHZ,CAAC"}
1
+ {"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../../src/field/Field.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAC;AASjE,MAAM,MAAM,UAAU,GAAG;IACvB,6IAA6I;IAC7I,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,sGAAsG;IACtG,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,oBAAoB;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kDAAkD;IAClD,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B;;;SAGK;IACL,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,8EAA8E;IAC9E,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,iCAAiC;IACjC,SAAS,CAAC,EAAE,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,KAAK,GAAI,wJAanB,UAAU,gCA4EZ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"FlowNavigation.d.ts","sourceRoot":"","sources":["../../../src/flowNavigation/FlowNavigation.tsx"],"names":[],"mappings":"AAOA,OAAgB,EAAE,KAAK,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAQxD,MAAM,WAAW,mBAAmB;IAClC,iBAAiB;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,wBAAwB;IACxB,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,qBAAqB;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,2FAA2F;IAC3F,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,sIAAsI;IACtI,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,wGAAwG;IACxG,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;CACxB;AAED,QAAA,MAAM,cAAc,GAAI,+DAQrB,mBAAmB,gCAyErB,CAAC;AAEF,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"FlowNavigation.d.ts","sourceRoot":"","sources":["../../../src/flowNavigation/FlowNavigation.tsx"],"names":[],"mappings":"AAOA,OAAgB,EAAE,KAAK,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAQxD,MAAM,WAAW,mBAAmB;IAClC,iBAAiB;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,wBAAwB;IACxB,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,qBAAqB;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,2FAA2F;IAC3F,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,sIAAsI;IACtI,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,wGAAwG;IACxG,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;CACxB;AAED,QAAA,MAAM,cAAc,GAAI,+DAQrB,mBAAmB,gCAsErB,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"TextArea.d.ts","sourceRoot":"","sources":["../../../src/inputs/TextArea.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAIjC,MAAM,WAAW,aAAc,SAAQ,KAAK,CAC1C,KAAK,CAAC,qBAAqB,CAAC,UAAU,CAAC,EACvC;IACE,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CACF;CAAG;AAEJ,eAAO,MAAM,QAAQ,mIAmBnB,CAAC"}
1
+ {"version":3,"file":"TextArea.d.ts","sourceRoot":"","sources":["../../../src/inputs/TextArea.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAIjC,MAAM,WAAW,aAAc,SAAQ,KAAK,CAC1C,KAAK,CAAC,qBAAqB,CAAC,UAAU,CAAC,EACvC;IACE,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CACF;CAAG;AAEJ,eAAO,MAAM,QAAQ,mIAcnB,CAAC"}
@@ -17,12 +17,6 @@ export declare function useInputAttributes({ nonLabelable }?: UseInputAttributes
17
17
  'aria-invalid': boolean | undefined;
18
18
  };
19
19
  export declare function useFieldLabelRef(): import("react").RefObject<HTMLLabelElement> | undefined;
20
- export type TextareaCharacterCountState = {
21
- current: number;
22
- max: number;
23
- } | null;
24
- export declare const TextareaCharacterCountProvider: import("react").Provider<((state: TextareaCharacterCountState) => void) | undefined>;
25
- export declare function useTextareaCharacterCount(current: number, max: number | undefined): void;
26
20
  export interface WithInputAttributesProps {
27
21
  inputAttributes: ReturnType<typeof useInputAttributes>;
28
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"contexts.d.ts","sourceRoot":"","sources":["../../../src/inputs/contexts.tsx"],"names":[],"mappings":"AAEA,KAAK,qBAAqB,GAAG;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;CACzC,CAAC;AAGF,eAAO,MAAM,yBAAyB,6DAA6B,CAAC;AAGpE,eAAO,MAAM,sBAAsB,8CAA0B,CAAC;AAG9D,eAAO,MAAM,wBAAwB,8CAAmC,CAAC;AAGzE,eAAO,MAAM,oBAAoB,+CAA+B,CAAC;AAEjE,UAAU,sBAAsB;IAC9B,gLAAgL;IAChL,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,GAAE,sBAA2B;;;;;EAQ/E;AAED,wBAAgB,gBAAgB,4DAE/B;AAED,MAAM,MAAM,2BAA2B,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC;AAKlF,eAAO,MAAM,8BAA8B,oCAFhC,2BAA2B,KAAK,IAAI,cAEqC,CAAC;AAErF,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,QAQjF;AAED,MAAM,WAAW,wBAAwB;IACvC,eAAe,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;CACxD;AAED,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,OAAO,CAAC,wBAAwB,CAAC,EAC7E,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EACjC,IAAI,CAAC,EAAE,sBAAsB;YAEgB,IAAI,CAAC,CAAC,EAAE,MAAM,wBAAwB,CAAC;;EAOrF"}
1
+ {"version":3,"file":"contexts.d.ts","sourceRoot":"","sources":["../../../src/inputs/contexts.tsx"],"names":[],"mappings":"AAEA,KAAK,qBAAqB,GAAG;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;CACzC,CAAC;AAGF,eAAO,MAAM,yBAAyB,6DAA6B,CAAC;AAGpE,eAAO,MAAM,sBAAsB,8CAA0B,CAAC;AAG9D,eAAO,MAAM,wBAAwB,8CAAmC,CAAC;AAGzE,eAAO,MAAM,oBAAoB,+CAA+B,CAAC;AAEjE,UAAU,sBAAsB;IAC9B,gLAAgL;IAChL,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,GAAE,sBAA2B;;;;;EAQ/E;AAED,wBAAgB,gBAAgB,4DAE/B;AAED,MAAM,WAAW,wBAAwB;IACvC,eAAe,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;CACxD;AAED,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,OAAO,CAAC,wBAAwB,CAAC,EAC7E,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EACjC,IAAI,CAAC,EAAE,sBAAsB;YAEgB,IAAI,CAAC,CAAC,EAAE,MAAM,wBAAwB,CAAC;;EAOrF"}
@@ -30,7 +30,6 @@ declare function customRender(ui: ReactElement, { locale, messages, ...renderOpt
30
30
  "neptune.Expander.expandAriaLabel": string;
31
31
  "neptune.ExpressiveMoneyInput.currency.search.placeholder": string;
32
32
  "neptune.ExpressiveMoneyInput.currency.select.currency": string;
33
- "neptune.Field.characterCount": string;
34
33
  "neptune.FlowNavigation.back": string;
35
34
  "neptune.Info.ariaLabel": string;
36
35
  "neptune.Label.optional": string;
@@ -118,7 +117,6 @@ declare function customRenderHook(callback: () => unknown, { locale, messages }?
118
117
  "neptune.Expander.expandAriaLabel": string;
119
118
  "neptune.ExpressiveMoneyInput.currency.search.placeholder": string;
120
119
  "neptune.ExpressiveMoneyInput.currency.select.currency": string;
121
- "neptune.Field.characterCount": string;
122
120
  "neptune.FlowNavigation.back": string;
123
121
  "neptune.Info.ariaLabel": string;
124
122
  "neptune.Label.optional": string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/test-utils/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAM,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,MAAM,EAAc,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAMxD;;;;GAIG;AACH,iBAAS,YAAY,CACnB,EAAE,EAAE,YAAY,EAChB,EAAE,MAAuB,EAAE,QAAa,EAAE,GAAG,aAAa,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAK,GAChE,UAAU,CAAC,OAAO,MAAM,CAAC,CAK3B;AAED;;;GAGG;AACH,iBAAS,gBAAgB,CACvB,QAAQ,EAAE,MAAM,OAAO,EACvB,EAAE,MAAuB,EAAE,QAAa,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAK,uEAKhD;AAED,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,YAAY,IAAI,MAAM,EAAE,gBAAgB,IAAI,UAAU,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/test-utils/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAM,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,MAAM,EAAc,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAMxD;;;;GAIG;AACH,iBAAS,YAAY,CACnB,EAAE,EAAE,YAAY,EAChB,EAAE,MAAuB,EAAE,QAAa,EAAE,GAAG,aAAa,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAK,GAChE,UAAU,CAAC,OAAO,MAAM,CAAC,CAK3B;AAED;;;GAGG;AACH,iBAAS,gBAAgB,CACvB,QAAQ,EAAE,MAAM,OAAO,EACvB,EAAE,MAAuB,EAAE,QAAa,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAK,uEAKhD;AAED,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,YAAY,IAAI,MAAM,EAAE,gBAAgB,IAAI,UAAU,EAAE,SAAS,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@transferwise/components",
3
- "version": "0.0.0-experimental-b20133d",
3
+ "version": "0.0.0-experimental-a2f9b4e",
4
4
  "description": "Neptune React components",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -1,19 +1,7 @@
1
1
  .np-field-control,
2
- .np-field-footer {
3
- display: flex;
4
- align-items: flex-start;
2
+ .np-field__prompt {
5
3
  margin-top: 4px;
6
4
  margin-top: var(--size-4);
7
- gap: 8px;
8
- gap: var(--size-8);
9
- }
10
- .np-field-counter {
11
- margin-left: auto;
12
- white-space: nowrap;
13
- padding: 4px 0;
14
- padding: var(--size-4) 0;
15
- color: #768e9c;
16
- color: var(--color-content-tertiary);
17
5
  }
18
6
  .np-field .form-group--typeahead[class],
19
7
  .np-field .np-checkbox-label[class] {
@@ -1,17 +1,7 @@
1
1
  .np-field {
2
2
  &-control,
3
- &-footer {
4
- display: flex;
5
- align-items: flex-start;
3
+ &__prompt {
6
4
  margin-top: var(--size-4);
7
- gap: var(--size-8);
8
- }
9
-
10
- &-counter {
11
- margin-left: auto;
12
- white-space: nowrap;
13
- padding: var(--size-4) 0;
14
- color: var(--color-content-tertiary);
15
5
  }
16
6
 
17
7
  // @FIXME space between individual fields should be 24px, while some older inputs
@@ -84,11 +84,7 @@ export const Basic = (args: FieldProps) => {
84
84
  messageIconLabel={args.messageIconLabel}
85
85
  messageLoading={args.messageLoading}
86
86
  >
87
- <TextArea
88
- maxLength={200}
89
- value={value}
90
- onChange={({ target }) => setValue(target.value)}
91
- />
87
+ <TextArea />
92
88
  </Field>
93
89
 
94
90
  <Field
@@ -1,14 +1,9 @@
1
1
  import { clsx } from 'clsx';
2
- import { useCallback, useId, useRef, useState } from 'react';
3
- import { useIntl } from 'react-intl';
2
+ import { useId, useRef } from 'react';
4
3
 
5
- import Body from '../body';
6
4
  import { Sentiment } from '../common';
7
- import messages from './Field.messages';
8
5
  import { InlinePrompt, type InlinePromptProps } from '../prompt';
9
6
  import {
10
- TextareaCharacterCountProvider,
11
- type TextareaCharacterCountState,
12
7
  FieldLabelContextProvider,
13
8
  InputDescribedByProvider,
14
9
  InputIdContextProvider,
@@ -59,7 +54,6 @@ export const Field = ({
59
54
  children,
60
55
  ...props
61
56
  }: FieldProps) => {
62
- const { formatMessage } = useIntl();
63
57
  const labelRef = useRef<HTMLLabelElement>(null);
64
58
  const sentiment = props.error ? Sentiment.NEGATIVE : propType;
65
59
  const message = propMessage || props.error;
@@ -72,14 +66,6 @@ export const Field = ({
72
66
 
73
67
  const messageId = useId();
74
68
  const descriptionId = useId();
75
- const counterId = useId();
76
-
77
- const [textareaCharacterCount, setTextareaCharacterCount] =
78
- useState<TextareaCharacterCountState>(null);
79
- const handleTextareaCharacterCount = useCallback(
80
- (state: TextareaCharacterCountState) => setTextareaCharacterCount(state),
81
- [],
82
- );
83
69
 
84
70
  /**
85
71
  * form control can have multiple messages to describe it,
@@ -93,9 +79,6 @@ export const Field = ({
93
79
  if (message) {
94
80
  messageIds.push(messageId);
95
81
  }
96
- if (textareaCharacterCount) {
97
- messageIds.push(counterId);
98
- }
99
82
  return messageIds.length > 0 ? messageIds.join(' ') : undefined;
100
83
  }
101
84
 
@@ -104,69 +87,43 @@ export const Field = ({
104
87
  <InputIdContextProvider value={inputId}>
105
88
  <InputDescribedByProvider value={ariaDescribedbyByIds()}>
106
89
  <InputInvalidProvider value={hasError}>
107
- <TextareaCharacterCountProvider value={handleTextareaCharacterCount}>
108
- <div
109
- className={clsx(
110
- 'np-field form-group d-block',
111
- {
112
- 'has-success': sentiment === Sentiment.POSITIVE,
113
- 'has-warning': sentiment === Sentiment.WARNING,
114
- 'has-error': hasError,
115
- 'has-info': sentiment === Sentiment.NEUTRAL,
116
- },
117
- className,
118
- )}
119
- >
120
- {label != null ? (
121
- <>
122
- <Label ref={labelRef} id={labelId} htmlFor={inputId}>
123
- {required ? label : <Label.Optional>{label}</Label.Optional>}
124
- </Label>
125
- <Label.Description id={descriptionId}>{description}</Label.Description>
126
- <div className="np-field-control">{children}</div>
127
- </>
128
- ) : (
129
- children
130
- )}
90
+ <div
91
+ className={clsx(
92
+ 'np-field form-group d-block',
93
+ {
94
+ 'has-success': sentiment === Sentiment.POSITIVE,
95
+ 'has-warning': sentiment === Sentiment.WARNING,
96
+ 'has-error': hasError,
97
+ 'has-info': sentiment === Sentiment.NEUTRAL,
98
+ },
99
+ className,
100
+ )}
101
+ >
102
+ {label != null ? (
103
+ <>
104
+ <Label ref={labelRef} id={labelId} htmlFor={inputId}>
105
+ {required ? label : <Label.Optional>{label}</Label.Optional>}
106
+ </Label>
107
+ <Label.Description id={descriptionId}>{description}</Label.Description>
108
+ <div className="np-field-control">{children}</div>
109
+ </>
110
+ ) : (
111
+ children
112
+ )}
131
113
 
132
- {(message || textareaCharacterCount) && (
133
- <div className="np-field-footer">
134
- {message && (
135
- <InlinePrompt
136
- sentiment={sentiment}
137
- id={messageId}
138
- mediaLabel={messageIconLabel}
139
- className="np-field__prompt"
140
- loading={messageLoading}
141
- width="full"
142
- >
143
- {message}
144
- </InlinePrompt>
145
- )}
146
- {textareaCharacterCount && (
147
- <Body
148
- as="span"
149
- id={counterId}
150
- role="status"
151
- aria-live={
152
- textareaCharacterCount.current >= textareaCharacterCount.max * 0.8
153
- ? 'polite'
154
- : 'off'
155
- }
156
- aria-atomic="true"
157
- aria-label={formatMessage(messages.characterCount, {
158
- current: textareaCharacterCount.current,
159
- max: textareaCharacterCount.max,
160
- })}
161
- className="np-field-counter"
162
- >
163
- {textareaCharacterCount.current}/{textareaCharacterCount.max}
164
- </Body>
165
- )}
166
- </div>
167
- )}
168
- </div>
169
- </TextareaCharacterCountProvider>
114
+ {message && (
115
+ <InlinePrompt
116
+ sentiment={sentiment}
117
+ id={messageId}
118
+ mediaLabel={messageIconLabel}
119
+ className="np-field__prompt"
120
+ loading={messageLoading}
121
+ width="full"
122
+ >
123
+ {message}
124
+ </InlinePrompt>
125
+ )}
126
+ </div>
170
127
  </InputInvalidProvider>
171
128
  </InputDescribedByProvider>
172
129
  </InputIdContextProvider>
@@ -86,10 +86,10 @@ describe('FlowNavigation', () => {
86
86
  expect(container.querySelector('.np-flow-navigation__stepper')).not.toBeInTheDocument();
87
87
  });
88
88
 
89
- it(`renders stepper placeholder when steps is empty`, () => {
89
+ it(`does not render stepper when steps is empty`, () => {
90
90
  const { container } = render(<FlowNavigation {...props} steps={[]} />);
91
91
 
92
- expect(container.querySelector('.np-flow-navigation__stepper')).toBeInTheDocument();
92
+ expect(container.querySelector('.np-flow-navigation__stepper')).not.toBeInTheDocument();
93
93
  expect(container.querySelector('.tw-stepper')).not.toBeInTheDocument();
94
94
  });
95
95
 
@@ -0,0 +1,88 @@
1
+ import { Meta, StoryObj } from '@storybook/react-webpack5';
2
+ import AvatarView from '../avatarView';
3
+ import { ProfileType } from '../common';
4
+ import Logo from '../logo';
5
+ import { allModes } from '../../.storybook/modes';
6
+
7
+ import FlowNavigation, { FlowNavigationProps } from './FlowNavigation';
8
+
9
+ const meta: Meta<typeof FlowNavigation> = {
10
+ component: FlowNavigation,
11
+ title: 'Navigation/FlowNavigation/Tests',
12
+ tags: ['!autodocs', '!manifest'],
13
+ parameters: {
14
+ padding: '0',
15
+ },
16
+ };
17
+ export default meta;
18
+
19
+ type Story = StoryObj<typeof FlowNavigation>;
20
+
21
+ /**
22
+ * Verifies no extra spacing when steps is empty at tablet viewport.
23
+ */
24
+ export const EmptySteps: Story = {
25
+ parameters: {
26
+ chromatic: {
27
+ modes: {
28
+ tablet: allModes.tablet,
29
+ },
30
+ },
31
+ },
32
+ globals: {
33
+ viewport: 'tablet',
34
+ },
35
+ render: () => {
36
+ const commonProps: FlowNavigationProps = {
37
+ steps: [],
38
+ activeStep: 0,
39
+ avatar: <AvatarView profileType={ProfileType.PERSONAL} />,
40
+ logo: <Logo />,
41
+ onClose: () => {},
42
+ onGoBack: () => {},
43
+ };
44
+
45
+ return <FlowNavigation {...commonProps} />;
46
+ },
47
+ };
48
+
49
+ /**
50
+ * Verifies FlowNavigation handles long step labels (e.g. Hungarian) at a narrow viewport.
51
+ */
52
+ export const LongLabel: Story = {
53
+ parameters: {
54
+ chromatic: {
55
+ viewports: [360],
56
+ },
57
+ viewport: {
58
+ options: {
59
+ narrow: {
60
+ name: '360px',
61
+ styles: { width: '360px', height: '600px' },
62
+ type: 'mobile',
63
+ },
64
+ },
65
+ },
66
+ },
67
+ globals: {
68
+ viewport: 'narrow',
69
+ },
70
+ render: () => {
71
+ const commonProps: FlowNavigationProps = {
72
+ steps: [
73
+ { label: 'Amount', hoverLabel: '100 GBP', onClick: () => {} },
74
+ { label: 'You', hoverLabel: 'Elena Durante', onClick: () => {} },
75
+ { label: 'Kedvezményezett', hoverLabel: 'Daniele Tomboro', onClick: () => {} },
76
+ { label: 'Review', hoverLabel: 'Antonio Dozortevo', onClick: () => {} },
77
+ { label: 'Pay', hoverLabel: 'Enrico Gusso', onClick: () => {} },
78
+ ],
79
+ activeStep: 2,
80
+ avatar: <AvatarView profileType={ProfileType.PERSONAL} />,
81
+ logo: <Logo />,
82
+ onClose: () => {},
83
+ onGoBack: () => {},
84
+ };
85
+
86
+ return <FlowNavigation {...commonProps} />;
87
+ },
88
+ };
@@ -95,16 +95,13 @@ const FlowNavigation = ({
95
95
  </div>
96
96
  }
97
97
  bottomContent={
98
- !done &&
99
- (steps.length > 0 ? (
98
+ !done && steps.length > 0 ? (
100
99
  <Stepper
101
100
  activeStep={activeStep}
102
101
  steps={steps}
103
102
  className={clsx('np-flow-navigation__stepper')}
104
103
  />
105
- ) : (
106
- <div className="np-flow-navigation__stepper" />
107
- ))
104
+ ) : null
108
105
  }
109
106
  layout={!screenLg ? Layout.VERTICAL : Layout.HORIZONTAL}
110
107
  />
package/src/i18n/en.json CHANGED
@@ -20,7 +20,6 @@
20
20
  "neptune.Expander.expandAriaLabel": "Expand",
21
21
  "neptune.ExpressiveMoneyInput.currency.search.placeholder": "Type a currency / country",
22
22
  "neptune.ExpressiveMoneyInput.currency.select.currency": "Select currency",
23
- "neptune.Field.characterCount": "{current} of {max} characters used",
24
23
  "neptune.FlowNavigation.back": "back to previous step",
25
24
  "neptune.Info.ariaLabel": "More information",
26
25
  "neptune.Label.optional": "(Optional)",
@@ -3,7 +3,7 @@ import { forwardRef } from 'react';
3
3
 
4
4
  import { Merge } from '../utils';
5
5
  import { inputClassNameBase } from './_common';
6
- import { useTextareaCharacterCount, useInputAttributes } from './contexts';
6
+ import { useInputAttributes } from './contexts';
7
7
 
8
8
  export interface TextAreaProps extends Merge<
9
9
  React.ComponentPropsWithRef<'textarea'>,
@@ -13,20 +13,15 @@ export interface TextAreaProps extends Merge<
13
13
  > {}
14
14
 
15
15
  export const TextArea = forwardRef(function TextArea(
16
- { className, maxLength, ...restProps }: TextAreaProps,
16
+ { className, ...restProps }: TextAreaProps,
17
17
  reference: React.ForwardedRef<HTMLTextAreaElement | null>,
18
18
  ) {
19
19
  const inputAttributes = useInputAttributes();
20
- const value = restProps.value ?? restProps.defaultValue ?? '';
21
- const currentLength = typeof value === 'string' ? value.length : String(value).length;
22
-
23
- useTextareaCharacterCount(currentLength, maxLength);
24
20
 
25
21
  return (
26
22
  <textarea
27
23
  ref={reference}
28
24
  className={clsx(className, inputClassNameBase(), 'np-text-area')}
29
- maxLength={maxLength}
30
25
  {...inputAttributes}
31
26
  {...restProps}
32
27
  />