@transferwise/components 46.99.0 → 46.100.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 (46) hide show
  1. package/build/accordion/Accordion.js +4 -0
  2. package/build/accordion/Accordion.js.map +1 -1
  3. package/build/accordion/Accordion.mjs +4 -0
  4. package/build/accordion/Accordion.mjs.map +1 -1
  5. package/build/accordion/AccordionItem/AccordionItem.js +14 -5
  6. package/build/accordion/AccordionItem/AccordionItem.js.map +1 -1
  7. package/build/accordion/AccordionItem/AccordionItem.mjs +14 -5
  8. package/build/accordion/AccordionItem/AccordionItem.mjs.map +1 -1
  9. package/build/main.css +16 -16
  10. package/build/styles/accordion/Accordion.css +4 -1
  11. package/build/styles/main.css +16 -16
  12. package/build/styles/switch/Switch.css +22 -41
  13. package/build/styles/switchOption/SwitchOption.css +4 -0
  14. package/build/switch/Switch.js +7 -18
  15. package/build/switch/Switch.js.map +1 -1
  16. package/build/switch/Switch.mjs +8 -19
  17. package/build/switch/Switch.mjs.map +1 -1
  18. package/build/switchOption/SwitchOption.js +1 -0
  19. package/build/switchOption/SwitchOption.js.map +1 -1
  20. package/build/switchOption/SwitchOption.mjs +1 -0
  21. package/build/switchOption/SwitchOption.mjs.map +1 -1
  22. package/build/types/accordion/Accordion.d.ts +1 -1
  23. package/build/types/accordion/Accordion.d.ts.map +1 -1
  24. package/build/types/accordion/AccordionItem/AccordionItem.d.ts +12 -0
  25. package/build/types/accordion/AccordionItem/AccordionItem.d.ts.map +1 -1
  26. package/build/types/switch/Switch.d.ts.map +1 -1
  27. package/build/types/switchOption/SwitchOption.d.ts.map +1 -1
  28. package/package.json +3 -3
  29. package/src/accordion/Accordion.css +4 -1
  30. package/src/accordion/Accordion.less +10 -5
  31. package/src/accordion/Accordion.story.tsx +30 -1
  32. package/src/accordion/Accordion.tsx +5 -4
  33. package/src/accordion/AccordionItem/AccordionItem.tsx +25 -4
  34. package/src/main.css +16 -16
  35. package/src/main.less +1 -0
  36. package/src/switch/Switch.css +22 -41
  37. package/src/switch/Switch.less +6 -12
  38. package/src/switch/Switch.spec.tsx +11 -9
  39. package/src/switch/Switch.story.tsx +158 -33
  40. package/src/switch/Switch.tsx +6 -15
  41. package/src/switchOption/SwitchOption.css +4 -0
  42. package/src/switchOption/SwitchOption.less +8 -0
  43. package/src/switchOption/SwitchOption.spec.tsx +4 -5
  44. package/src/switchOption/SwitchOption.story.tsx +42 -38
  45. package/src/switchOption/SwitchOption.tsx +1 -0
  46. package/src/switch/__snapshots__/Switch.spec.tsx.snap +0 -44
@@ -46,6 +46,7 @@ const SwitchOption = ({
46
46
  };
47
47
  return /*#__PURE__*/jsxRuntime.jsx(Option.default, {
48
48
  ...sharedProps,
49
+ className: "np-switch-option",
49
50
  button: /*#__PURE__*/jsxRuntime.jsx(Switch.default, {
50
51
  id: id,
51
52
  checked: checked,
@@ -1 +1 @@
1
- {"version":3,"file":"SwitchOption.js","sources":["../../src/switchOption/SwitchOption.tsx"],"sourcesContent":["import { MouseEvent } from 'react';\n\nimport Option from '../common/Option';\nimport Switch from '../switch';\n\nexport type SwitchOptionProps = {\n checked?: boolean;\n complex?: boolean;\n content?: React.ReactNode;\n disabled?: boolean;\n showMediaCircle?: boolean;\n showMediaAtAllSizes?: boolean;\n isContainerAligned?: boolean;\n id?: string;\n media?: React.ReactNode;\n onChange: (newValue: boolean) => void;\n title: React.ReactNode;\n 'aria-label': string;\n};\n\nconst stopPropagation = (event?: MouseEvent<HTMLSpanElement>) => {\n if (event) {\n event.stopPropagation();\n event.preventDefault();\n event.nativeEvent?.stopImmediatePropagation?.();\n }\n};\n\nconst SwitchOption = ({\n checked,\n complex,\n content,\n disabled,\n id,\n media,\n onChange,\n title,\n showMediaCircle,\n showMediaAtAllSizes,\n isContainerAligned,\n 'aria-label': ariaLabel,\n}: SwitchOptionProps) => {\n const sharedProps = {\n media,\n title,\n content,\n complex,\n disabled,\n showMediaCircle,\n showMediaAtAllSizes,\n isContainerAligned,\n };\n const toggle = (event?: MouseEvent<HTMLSpanElement>) => {\n stopPropagation(event);\n if (disabled) {\n return;\n }\n\n onChange(!checked);\n };\n\n return (\n <Option\n {...sharedProps}\n button={\n <Switch\n id={id}\n checked={checked}\n disabled={disabled}\n aria-label={ariaLabel}\n onClick={toggle}\n />\n }\n onClick={toggle}\n />\n );\n};\n\nexport default SwitchOption;\n"],"names":["stopPropagation","event","preventDefault","nativeEvent","stopImmediatePropagation","SwitchOption","checked","complex","content","disabled","id","media","onChange","title","showMediaCircle","showMediaAtAllSizes","isContainerAligned","ariaLabel","sharedProps","toggle","_jsx","Option","button","Switch","onClick"],"mappings":";;;;;;;;AAoBA,MAAMA,eAAe,GAAIC,KAAmC,IAAI;AAC9D,EAAA,IAAIA,KAAK,EAAE;IACTA,KAAK,CAACD,eAAe,EAAE;IACvBC,KAAK,CAACC,cAAc,EAAE;AACtBD,IAAAA,KAAK,CAACE,WAAW,EAAEC,wBAAwB,IAAI;AACjD;AACF,CAAC;AAEKC,MAAAA,YAAY,GAAGA,CAAC;EACpBC,OAAO;EACPC,OAAO;EACPC,OAAO;EACPC,QAAQ;EACRC,EAAE;EACFC,KAAK;EACLC,QAAQ;EACRC,KAAK;EACLC,eAAe;EACfC,mBAAmB;EACnBC,kBAAkB;AAClB,EAAA,YAAY,EAAEC;AAAS,CACL,KAAI;AACtB,EAAA,MAAMC,WAAW,GAAG;IAClBP,KAAK;IACLE,KAAK;IACLL,OAAO;IACPD,OAAO;IACPE,QAAQ;IACRK,eAAe;IACfC,mBAAmB;AACnBC,IAAAA;GACD;EACD,MAAMG,MAAM,GAAIlB,KAAmC,IAAI;IACrDD,eAAe,CAACC,KAAK,CAAC;AACtB,IAAA,IAAIQ,QAAQ,EAAE;AACZ,MAAA;AACF;IAEAG,QAAQ,CAAC,CAACN,OAAO,CAAC;GACnB;EAED,oBACEc,cAAA,CAACC,cAAM,EAAA;AAAA,IAAA,GACDH,WAAW;IACfI,MAAM,eACJF,cAAA,CAACG,cAAM,EAAA;AACLb,MAAAA,EAAE,EAAEA,EAAG;AACPJ,MAAAA,OAAO,EAAEA,OAAQ;AACjBG,MAAAA,QAAQ,EAAEA,QAAS;AACnB,MAAA,YAAA,EAAYQ,SAAU;AACtBO,MAAAA,OAAO,EAAEL;AAAO,KAEpB,CAAC;AACDK,IAAAA,OAAO,EAAEL;AAAO,GAChB,CAAA;AAEN;;;;"}
1
+ {"version":3,"file":"SwitchOption.js","sources":["../../src/switchOption/SwitchOption.tsx"],"sourcesContent":["import { MouseEvent } from 'react';\n\nimport Option from '../common/Option';\nimport Switch from '../switch';\n\nexport type SwitchOptionProps = {\n checked?: boolean;\n complex?: boolean;\n content?: React.ReactNode;\n disabled?: boolean;\n showMediaCircle?: boolean;\n showMediaAtAllSizes?: boolean;\n isContainerAligned?: boolean;\n id?: string;\n media?: React.ReactNode;\n onChange: (newValue: boolean) => void;\n title: React.ReactNode;\n 'aria-label': string;\n};\n\nconst stopPropagation = (event?: MouseEvent<HTMLSpanElement>) => {\n if (event) {\n event.stopPropagation();\n event.preventDefault();\n event.nativeEvent?.stopImmediatePropagation?.();\n }\n};\n\nconst SwitchOption = ({\n checked,\n complex,\n content,\n disabled,\n id,\n media,\n onChange,\n title,\n showMediaCircle,\n showMediaAtAllSizes,\n isContainerAligned,\n 'aria-label': ariaLabel,\n}: SwitchOptionProps) => {\n const sharedProps = {\n media,\n title,\n content,\n complex,\n disabled,\n showMediaCircle,\n showMediaAtAllSizes,\n isContainerAligned,\n };\n const toggle = (event?: MouseEvent<HTMLSpanElement>) => {\n stopPropagation(event);\n if (disabled) {\n return;\n }\n\n onChange(!checked);\n };\n\n return (\n <Option\n {...sharedProps}\n className=\"np-switch-option\"\n button={\n <Switch\n id={id}\n checked={checked}\n disabled={disabled}\n aria-label={ariaLabel}\n onClick={toggle}\n />\n }\n onClick={toggle}\n />\n );\n};\n\nexport default SwitchOption;\n"],"names":["stopPropagation","event","preventDefault","nativeEvent","stopImmediatePropagation","SwitchOption","checked","complex","content","disabled","id","media","onChange","title","showMediaCircle","showMediaAtAllSizes","isContainerAligned","ariaLabel","sharedProps","toggle","_jsx","Option","className","button","Switch","onClick"],"mappings":";;;;;;;;AAoBA,MAAMA,eAAe,GAAIC,KAAmC,IAAI;AAC9D,EAAA,IAAIA,KAAK,EAAE;IACTA,KAAK,CAACD,eAAe,EAAE;IACvBC,KAAK,CAACC,cAAc,EAAE;AACtBD,IAAAA,KAAK,CAACE,WAAW,EAAEC,wBAAwB,IAAI;AACjD;AACF,CAAC;AAEKC,MAAAA,YAAY,GAAGA,CAAC;EACpBC,OAAO;EACPC,OAAO;EACPC,OAAO;EACPC,QAAQ;EACRC,EAAE;EACFC,KAAK;EACLC,QAAQ;EACRC,KAAK;EACLC,eAAe;EACfC,mBAAmB;EACnBC,kBAAkB;AAClB,EAAA,YAAY,EAAEC;AAAS,CACL,KAAI;AACtB,EAAA,MAAMC,WAAW,GAAG;IAClBP,KAAK;IACLE,KAAK;IACLL,OAAO;IACPD,OAAO;IACPE,QAAQ;IACRK,eAAe;IACfC,mBAAmB;AACnBC,IAAAA;GACD;EACD,MAAMG,MAAM,GAAIlB,KAAmC,IAAI;IACrDD,eAAe,CAACC,KAAK,CAAC;AACtB,IAAA,IAAIQ,QAAQ,EAAE;AACZ,MAAA;AACF;IAEAG,QAAQ,CAAC,CAACN,OAAO,CAAC;GACnB;EAED,oBACEc,cAAA,CAACC,cAAM,EAAA;AAAA,IAAA,GACDH,WAAW;AACfI,IAAAA,SAAS,EAAC,kBAAkB;IAC5BC,MAAM,eACJH,cAAA,CAACI,cAAM,EAAA;AACLd,MAAAA,EAAE,EAAEA,EAAG;AACPJ,MAAAA,OAAO,EAAEA,OAAQ;AACjBG,MAAAA,QAAQ,EAAEA,QAAS;AACnB,MAAA,YAAA,EAAYQ,SAAU;AACtBQ,MAAAA,OAAO,EAAEN;AAAO,KAEpB,CAAC;AACDM,IAAAA,OAAO,EAAEN;AAAO,GAChB,CAAA;AAEN;;;;"}
@@ -42,6 +42,7 @@ const SwitchOption = ({
42
42
  };
43
43
  return /*#__PURE__*/jsx(Option, {
44
44
  ...sharedProps,
45
+ className: "np-switch-option",
45
46
  button: /*#__PURE__*/jsx(Switch, {
46
47
  id: id,
47
48
  checked: checked,
@@ -1 +1 @@
1
- {"version":3,"file":"SwitchOption.mjs","sources":["../../src/switchOption/SwitchOption.tsx"],"sourcesContent":["import { MouseEvent } from 'react';\n\nimport Option from '../common/Option';\nimport Switch from '../switch';\n\nexport type SwitchOptionProps = {\n checked?: boolean;\n complex?: boolean;\n content?: React.ReactNode;\n disabled?: boolean;\n showMediaCircle?: boolean;\n showMediaAtAllSizes?: boolean;\n isContainerAligned?: boolean;\n id?: string;\n media?: React.ReactNode;\n onChange: (newValue: boolean) => void;\n title: React.ReactNode;\n 'aria-label': string;\n};\n\nconst stopPropagation = (event?: MouseEvent<HTMLSpanElement>) => {\n if (event) {\n event.stopPropagation();\n event.preventDefault();\n event.nativeEvent?.stopImmediatePropagation?.();\n }\n};\n\nconst SwitchOption = ({\n checked,\n complex,\n content,\n disabled,\n id,\n media,\n onChange,\n title,\n showMediaCircle,\n showMediaAtAllSizes,\n isContainerAligned,\n 'aria-label': ariaLabel,\n}: SwitchOptionProps) => {\n const sharedProps = {\n media,\n title,\n content,\n complex,\n disabled,\n showMediaCircle,\n showMediaAtAllSizes,\n isContainerAligned,\n };\n const toggle = (event?: MouseEvent<HTMLSpanElement>) => {\n stopPropagation(event);\n if (disabled) {\n return;\n }\n\n onChange(!checked);\n };\n\n return (\n <Option\n {...sharedProps}\n button={\n <Switch\n id={id}\n checked={checked}\n disabled={disabled}\n aria-label={ariaLabel}\n onClick={toggle}\n />\n }\n onClick={toggle}\n />\n );\n};\n\nexport default SwitchOption;\n"],"names":["stopPropagation","event","preventDefault","nativeEvent","stopImmediatePropagation","SwitchOption","checked","complex","content","disabled","id","media","onChange","title","showMediaCircle","showMediaAtAllSizes","isContainerAligned","ariaLabel","sharedProps","toggle","_jsx","Option","button","Switch","onClick"],"mappings":";;;;AAoBA,MAAMA,eAAe,GAAIC,KAAmC,IAAI;AAC9D,EAAA,IAAIA,KAAK,EAAE;IACTA,KAAK,CAACD,eAAe,EAAE;IACvBC,KAAK,CAACC,cAAc,EAAE;AACtBD,IAAAA,KAAK,CAACE,WAAW,EAAEC,wBAAwB,IAAI;AACjD;AACF,CAAC;AAEKC,MAAAA,YAAY,GAAGA,CAAC;EACpBC,OAAO;EACPC,OAAO;EACPC,OAAO;EACPC,QAAQ;EACRC,EAAE;EACFC,KAAK;EACLC,QAAQ;EACRC,KAAK;EACLC,eAAe;EACfC,mBAAmB;EACnBC,kBAAkB;AAClB,EAAA,YAAY,EAAEC;AAAS,CACL,KAAI;AACtB,EAAA,MAAMC,WAAW,GAAG;IAClBP,KAAK;IACLE,KAAK;IACLL,OAAO;IACPD,OAAO;IACPE,QAAQ;IACRK,eAAe;IACfC,mBAAmB;AACnBC,IAAAA;GACD;EACD,MAAMG,MAAM,GAAIlB,KAAmC,IAAI;IACrDD,eAAe,CAACC,KAAK,CAAC;AACtB,IAAA,IAAIQ,QAAQ,EAAE;AACZ,MAAA;AACF;IAEAG,QAAQ,CAAC,CAACN,OAAO,CAAC;GACnB;EAED,oBACEc,GAAA,CAACC,MAAM,EAAA;AAAA,IAAA,GACDH,WAAW;IACfI,MAAM,eACJF,GAAA,CAACG,MAAM,EAAA;AACLb,MAAAA,EAAE,EAAEA,EAAG;AACPJ,MAAAA,OAAO,EAAEA,OAAQ;AACjBG,MAAAA,QAAQ,EAAEA,QAAS;AACnB,MAAA,YAAA,EAAYQ,SAAU;AACtBO,MAAAA,OAAO,EAAEL;AAAO,KAEpB,CAAC;AACDK,IAAAA,OAAO,EAAEL;AAAO,GAChB,CAAA;AAEN;;;;"}
1
+ {"version":3,"file":"SwitchOption.mjs","sources":["../../src/switchOption/SwitchOption.tsx"],"sourcesContent":["import { MouseEvent } from 'react';\n\nimport Option from '../common/Option';\nimport Switch from '../switch';\n\nexport type SwitchOptionProps = {\n checked?: boolean;\n complex?: boolean;\n content?: React.ReactNode;\n disabled?: boolean;\n showMediaCircle?: boolean;\n showMediaAtAllSizes?: boolean;\n isContainerAligned?: boolean;\n id?: string;\n media?: React.ReactNode;\n onChange: (newValue: boolean) => void;\n title: React.ReactNode;\n 'aria-label': string;\n};\n\nconst stopPropagation = (event?: MouseEvent<HTMLSpanElement>) => {\n if (event) {\n event.stopPropagation();\n event.preventDefault();\n event.nativeEvent?.stopImmediatePropagation?.();\n }\n};\n\nconst SwitchOption = ({\n checked,\n complex,\n content,\n disabled,\n id,\n media,\n onChange,\n title,\n showMediaCircle,\n showMediaAtAllSizes,\n isContainerAligned,\n 'aria-label': ariaLabel,\n}: SwitchOptionProps) => {\n const sharedProps = {\n media,\n title,\n content,\n complex,\n disabled,\n showMediaCircle,\n showMediaAtAllSizes,\n isContainerAligned,\n };\n const toggle = (event?: MouseEvent<HTMLSpanElement>) => {\n stopPropagation(event);\n if (disabled) {\n return;\n }\n\n onChange(!checked);\n };\n\n return (\n <Option\n {...sharedProps}\n className=\"np-switch-option\"\n button={\n <Switch\n id={id}\n checked={checked}\n disabled={disabled}\n aria-label={ariaLabel}\n onClick={toggle}\n />\n }\n onClick={toggle}\n />\n );\n};\n\nexport default SwitchOption;\n"],"names":["stopPropagation","event","preventDefault","nativeEvent","stopImmediatePropagation","SwitchOption","checked","complex","content","disabled","id","media","onChange","title","showMediaCircle","showMediaAtAllSizes","isContainerAligned","ariaLabel","sharedProps","toggle","_jsx","Option","className","button","Switch","onClick"],"mappings":";;;;AAoBA,MAAMA,eAAe,GAAIC,KAAmC,IAAI;AAC9D,EAAA,IAAIA,KAAK,EAAE;IACTA,KAAK,CAACD,eAAe,EAAE;IACvBC,KAAK,CAACC,cAAc,EAAE;AACtBD,IAAAA,KAAK,CAACE,WAAW,EAAEC,wBAAwB,IAAI;AACjD;AACF,CAAC;AAEKC,MAAAA,YAAY,GAAGA,CAAC;EACpBC,OAAO;EACPC,OAAO;EACPC,OAAO;EACPC,QAAQ;EACRC,EAAE;EACFC,KAAK;EACLC,QAAQ;EACRC,KAAK;EACLC,eAAe;EACfC,mBAAmB;EACnBC,kBAAkB;AAClB,EAAA,YAAY,EAAEC;AAAS,CACL,KAAI;AACtB,EAAA,MAAMC,WAAW,GAAG;IAClBP,KAAK;IACLE,KAAK;IACLL,OAAO;IACPD,OAAO;IACPE,QAAQ;IACRK,eAAe;IACfC,mBAAmB;AACnBC,IAAAA;GACD;EACD,MAAMG,MAAM,GAAIlB,KAAmC,IAAI;IACrDD,eAAe,CAACC,KAAK,CAAC;AACtB,IAAA,IAAIQ,QAAQ,EAAE;AACZ,MAAA;AACF;IAEAG,QAAQ,CAAC,CAACN,OAAO,CAAC;GACnB;EAED,oBACEc,GAAA,CAACC,MAAM,EAAA;AAAA,IAAA,GACDH,WAAW;AACfI,IAAAA,SAAS,EAAC,kBAAkB;IAC5BC,MAAM,eACJH,GAAA,CAACI,MAAM,EAAA;AACLd,MAAAA,EAAE,EAAEA,EAAG;AACPJ,MAAAA,OAAO,EAAEA,OAAQ;AACjBG,MAAAA,QAAQ,EAAEA,QAAS;AACnB,MAAA,YAAA,EAAYQ,SAAU;AACtBQ,MAAAA,OAAO,EAAEN;AAAO,KAEpB,CAAC;AACDM,IAAAA,OAAO,EAAEN;AAAO,GAChB,CAAA;AAEN;;;;"}
@@ -1,6 +1,6 @@
1
1
  import { FC } from 'react';
2
2
  import { AccordionItemProps } from './AccordionItem';
3
- export type AccordionItem = Pick<AccordionItemProps, 'id' | 'title' | 'subtitle' | 'content' | 'icon'>;
3
+ export type AccordionItem = Omit<AccordionItemProps, 'onClick' | 'open' | 'theme'>;
4
4
  export interface AccordionProps {
5
5
  /** The index of the item that should be open by default. */
6
6
  indexOpen?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"Accordion.d.ts","sourceRoot":"","sources":["../../../src/accordion/Accordion.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,EAAE,EAAE,MAAM,OAAO,CAAC;AAErC,OAAsB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEpE,MAAM,MAAM,aAAa,GAAG,IAAI,CAC9B,kBAAkB,EAClB,IAAI,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CACjD,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;IAChC,kEAAkE;IAClE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,kBAAkB;IAClB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,QAAA,MAAM,SAAS,EAAE,EAAE,CAAC,cAAc,CAkCjC,CAAC;AAEF,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"Accordion.d.ts","sourceRoot":"","sources":["../../../src/accordion/Accordion.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,EAAE,EAAE,MAAM,OAAO,CAAC;AAErC,OAAsB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEpE,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;AAEnF,MAAM,WAAW,cAAc;IAC7B,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;IAChC,kEAAkE;IAClE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,kBAAkB;IAClB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,QAAA,MAAM,SAAS,EAAE,EAAE,CAAC,cAAc,CAsCjC,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -16,6 +16,14 @@ export interface AccordionItemProps {
16
16
  open: boolean;
17
17
  /** An optional icon to display next to the accordion item title. */
18
18
  icon?: ReactNode;
19
+ /** An optional media element to display next to the accordion item title. */
20
+ media?: ReactNode;
21
+ /** An optional showMediaAtAllSizes with media available at all sizes of the screen. */
22
+ showMediaAtAllSizes?: boolean;
23
+ /** An optional showMediaCircle to display media within the circle. */
24
+ showMediaCircle?: boolean;
25
+ /** An optional isContainerAligned to display media aligned with the container. */
26
+ isContainerAligned?: boolean;
19
27
  /** @deprecated ... */
20
28
  theme?: 'light' | 'dark';
21
29
  }
@@ -33,6 +41,10 @@ export interface AccordionItemProps {
33
41
  * @param {Function} onClick - A callback function that is called when the accordion item is clicked.
34
42
  * @param {boolean} open - Whether the accordion item is currently open or closed.
35
43
  * @param {ReactNode} [icon] - An optional icon to display next to the accordion item title.
44
+ * @param {ReactNode} [media] - An optional media to display next to the accordion item.
45
+ * @param {boolean} [showMediaAtAllSizes] - An optional showMediaAtAllSizes with media available at all sizes of the screen.
46
+ * @param {boolean} [showMediaCircle] - An optional showMediaCircle to display media within the circle.
47
+ * @param {boolean} [isContainerAligned] - An optional isContainerAligned to display media aligned with the container.
36
48
  * @example
37
49
  * // Example usage:
38
50
  *
@@ -1 +1 @@
1
- {"version":3,"file":"AccordionItem.d.ts","sourceRoot":"","sources":["../../../../src/accordion/AccordionItem/AccordionItem.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAE,SAAS,EAAuB,MAAM,OAAO,CAAC;AAO3D,MAAM,WAAW,kBAAkB;IACjC,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,uCAAuC;IACvC,KAAK,EAAE,SAAS,CAAC;IACjB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,yCAAyC;IACzC,OAAO,EAAE,SAAS,CAAC;IACnB,6EAA6E;IAC7E,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,8DAA8D;IAC9D,IAAI,EAAE,OAAO,CAAC;IACd,oEAAoE;IACpE,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,sBAAsB;IACtB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,QAAA,MAAM,aAAa,EAAE,EAAE,CAAC,kBAAkB,CAoDzC,CAAC;AAEF,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"AccordionItem.d.ts","sourceRoot":"","sources":["../../../../src/accordion/AccordionItem/AccordionItem.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAE,SAAS,EAAuB,MAAM,OAAO,CAAC;AAO3D,MAAM,WAAW,kBAAkB;IACjC,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,uCAAuC;IACvC,KAAK,EAAE,SAAS,CAAC;IACjB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,yCAAyC;IACzC,OAAO,EAAE,SAAS,CAAC;IACnB,6EAA6E;IAC7E,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,8DAA8D;IAC9D,IAAI,EAAE,OAAO,CAAC;IACd,oEAAoE;IACpE,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,uFAAuF;IACvF,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,sEAAsE;IACtE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kFAAkF;IAClF,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,sBAAsB;IACtB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,QAAA,MAAM,aAAa,EAAE,EAAE,CAAC,kBAAkB,CA6DzC,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Switch.d.ts","sourceRoot":"","sources":["../../../src/switch/Switch.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAwB,UAAU,EAAE,MAAM,OAAO,CAAC;AAE9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG7C,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG;IACtC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yGAAyG;IACzG,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,2CAA2C;IAC3C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0CAA0C;IAC1C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,iDAAiD;IACjD,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC;CACxD,CAAC;AAEF,QAAA,MAAM,MAAM,GAAI,OAAO,WAAW,gCAiDjC,CAAC;AAEF,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"Switch.d.ts","sourceRoot":"","sources":["../../../src/switch/Switch.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAwB,UAAU,EAAE,MAAM,OAAO,CAAC;AAE9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG7C,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG;IACtC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yGAAyG;IACzG,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,2CAA2C;IAC3C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0CAA0C;IAC1C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,iDAAiD;IACjD,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC;CACxD,CAAC;AAEF,QAAA,MAAM,MAAM,GAAI,OAAO,WAAW,gCAwCjC,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"SwitchOption.d.ts","sourceRoot":"","sources":["../../../src/switchOption/SwitchOption.tsx"],"names":[],"mappings":"AAKA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAUF,QAAA,MAAM,YAAY,GAAI,yJAanB,iBAAiB,gCAmCnB,CAAC;AAEF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"SwitchOption.d.ts","sourceRoot":"","sources":["../../../src/switchOption/SwitchOption.tsx"],"names":[],"mappings":"AAKA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAUF,QAAA,MAAM,YAAY,GAAI,yJAanB,iBAAiB,gCAoCnB,CAAC;AAEF,eAAe,YAAY,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@transferwise/components",
3
- "version": "46.99.0",
3
+ "version": "46.100.0",
4
4
  "description": "Neptune React components",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -91,10 +91,10 @@
91
91
  "rollup": "^4.43.0",
92
92
  "rollup-preserve-directives": "^1.1.3",
93
93
  "storybook": "^8.6.14",
94
- "@transferwise/less-config": "3.1.2",
95
94
  "@transferwise/neptune-css": "14.24.4",
95
+ "@wise/components-theming": "1.6.3",
96
96
  "@wise/wds-configs": "0.0.0",
97
- "@wise/components-theming": "1.6.3"
97
+ "@transferwise/less-config": "3.1.2"
98
98
  },
99
99
  "peerDependencies": {
100
100
  "@transferwise/icons": "^3.22.0",
@@ -27,10 +27,13 @@
27
27
  }.np-accordion-item .np-option .np-option__title {
28
28
  font-weight: 600;
29
29
  font-weight: var(--font-weight-semi-bold);
30
+ }.np-theme-personal .np-accordion-item--with-media .media {
31
+ display: flex;
32
+ align-items: center;
30
33
  }.np-theme-personal .np-accordion-item--with-icon .np-accordion-item__content {
31
34
  padding: 0 56px 16px;
32
35
  padding: 0 var(--size-56) var(--size-16);
33
- }.np-theme-personal .np-accordion-item .media {
36
+ }.np-theme-personal .np-accordion-item--with-icon .media {
34
37
  display: flex;
35
38
  align-items: flex-start;
36
39
  }.np-theme-personal .np-accordion-item .decision__title {
@@ -41,15 +41,20 @@
41
41
  }
42
42
 
43
43
  .np-theme-personal & {
44
+ &--with-media {
45
+ .media {
46
+ display: flex;
47
+ align-items: center;
48
+ }
49
+ }
44
50
  &--with-icon {
45
51
  .np-accordion-item__content {
46
52
  padding: 0 var(--size-56) var(--size-16);
47
53
  }
48
- }
49
-
50
- .media {
51
- display: flex;
52
- align-items: flex-start;
54
+ .media {
55
+ display: flex;
56
+ align-items: flex-start;
57
+ }
53
58
  }
54
59
 
55
60
  .decision__title {
@@ -1,5 +1,5 @@
1
1
  import { Meta, StoryObj } from '@storybook/react';
2
- import { FastFlag as FastFlagIcon } from '@transferwise/icons';
2
+ import { FastFlag as FastFlagIcon, CardWise as CardWiseIcon } from '@transferwise/icons';
3
3
 
4
4
  import { Scroll, Size } from '../common';
5
5
  import Modal from '../modal';
@@ -53,6 +53,34 @@ const meta: Meta<typeof Accordion> = {
53
53
  id: 'Item 5',
54
54
  icon: <FastFlagIcon size={24} />,
55
55
  },
56
+ {
57
+ title: 'Item 6',
58
+ subtitle: 'Sixth item',
59
+ content: lorem10,
60
+ id: 'Item 6',
61
+ icon: <CardWiseIcon size={24} />,
62
+ media: (
63
+ <img
64
+ src="https://wise.com/public-resources/assets/spend/card/asset//digital_card_2023.png"
65
+ alt=""
66
+ />
67
+ ),
68
+ },
69
+ {
70
+ title: 'Item 7',
71
+ subtitle: 'Seventh item',
72
+ content: lorem10,
73
+ id: 'Item 7',
74
+ media: (
75
+ <img
76
+ src="https://wise.com/public-resources/assets/spend/card/asset//digital_card_2023.png"
77
+ alt=""
78
+ />
79
+ ),
80
+ showMediaAtAllSizes: false,
81
+ showMediaCircle: false,
82
+ isContainerAligned: false,
83
+ },
56
84
  ],
57
85
  },
58
86
  };
@@ -81,6 +109,7 @@ export const Multiple: Story = {
81
109
  <Accordion {...args} items={[items[0]]} />
82
110
  <Accordion {...args} items={[items[0]]} indexOpen={0} />
83
111
  <Accordion {...args} items={items} />
112
+ <Accordion {...args} items={[items[6]]} indexOpen={0} />
84
113
  </>
85
114
  );
86
115
  },
@@ -2,10 +2,7 @@ import { useState, FC } from 'react';
2
2
 
3
3
  import AccordionItem, { AccordionItemProps } from './AccordionItem';
4
4
 
5
- export type AccordionItem = Pick<
6
- AccordionItemProps,
7
- 'id' | 'title' | 'subtitle' | 'content' | 'icon'
8
- >;
5
+ export type AccordionItem = Omit<AccordionItemProps, 'onClick' | 'open' | 'theme'>;
9
6
 
10
7
  export interface AccordionProps {
11
8
  /** The index of the item that should be open by default. */
@@ -89,6 +86,10 @@ const Accordion: FC<AccordionProps> = ({ indexOpen = -1, items, onClick, theme =
89
86
  subtitle={item.subtitle}
90
87
  content={item.content}
91
88
  icon={item.icon}
89
+ media={item.media}
90
+ showMediaAtAllSizes={item.showMediaAtAllSizes}
91
+ showMediaCircle={item.showMediaCircle}
92
+ isContainerAligned={item.isContainerAligned}
92
93
  onClick={() => handleOnClick(index)}
93
94
  />
94
95
  ))}
@@ -24,6 +24,14 @@ export interface AccordionItemProps {
24
24
  open: boolean;
25
25
  /** An optional icon to display next to the accordion item title. */
26
26
  icon?: ReactNode;
27
+ /** An optional media element to display next to the accordion item title. */
28
+ media?: ReactNode;
29
+ /** An optional showMediaAtAllSizes with media available at all sizes of the screen. */
30
+ showMediaAtAllSizes?: boolean;
31
+ /** An optional showMediaCircle to display media within the circle. */
32
+ showMediaCircle?: boolean;
33
+ /** An optional isContainerAligned to display media aligned with the container. */
34
+ isContainerAligned?: boolean;
27
35
  /** @deprecated ... */
28
36
  theme?: 'light' | 'dark';
29
37
  }
@@ -42,6 +50,10 @@ export interface AccordionItemProps {
42
50
  * @param {Function} onClick - A callback function that is called when the accordion item is clicked.
43
51
  * @param {boolean} open - Whether the accordion item is currently open or closed.
44
52
  * @param {ReactNode} [icon] - An optional icon to display next to the accordion item title.
53
+ * @param {ReactNode} [media] - An optional media to display next to the accordion item.
54
+ * @param {boolean} [showMediaAtAllSizes] - An optional showMediaAtAllSizes with media available at all sizes of the screen.
55
+ * @param {boolean} [showMediaCircle] - An optional showMediaCircle to display media within the circle.
56
+ * @param {boolean} [isContainerAligned] - An optional isContainerAligned to display media aligned with the container.
45
57
  * @example
46
58
  * // Example usage:
47
59
  *
@@ -72,25 +84,31 @@ const AccordionItem: FC<AccordionItemProps> = ({
72
84
  onClick,
73
85
  open,
74
86
  icon,
87
+ media,
88
+ showMediaAtAllSizes,
89
+ showMediaCircle,
90
+ isContainerAligned,
75
91
  theme = 'light',
76
92
  }) => {
77
- const iconElement = icon
93
+ const mediaElement = icon
78
94
  ? cloneElement(icon as React.ReactElement<IdIconProps>, { size: 24 })
79
- : null;
95
+ : media;
80
96
  const fallbackId = useId();
81
97
  const accordionId = id ?? fallbackId;
82
98
 
83
99
  return (
84
100
  <div
85
101
  id={accordionId}
86
- className={clsx('np-accordion-item', iconElement ? 'np-accordion-item--with-icon' : null, {
102
+ className={clsx('np-accordion-item', {
87
103
  'np-accordion-item--open': open,
104
+ 'np-accordion-item--with-icon': Boolean(icon),
105
+ 'np-accordion-item--with-media': Boolean(media),
88
106
  })}
89
107
  >
90
108
  <Option
91
109
  aria-label={ariaLabel}
92
110
  as="button"
93
- media={iconElement}
111
+ media={mediaElement}
94
112
  title={title}
95
113
  content={subtitle}
96
114
  button={<Chevron orientation={open ? Position.TOP : Position.BOTTOM} size={Size.MEDIUM} />}
@@ -98,6 +116,9 @@ const AccordionItem: FC<AccordionItemProps> = ({
98
116
  aria-expanded={open}
99
117
  aria-controls={`${accordionId}-section`}
100
118
  id={`${accordionId}-control`}
119
+ showMediaCircle={showMediaCircle}
120
+ showMediaAtAllSizes={showMediaAtAllSizes}
121
+ isContainerAligned={isContainerAligned}
101
122
  onClick={onClick}
102
123
  />
103
124
  {open && (
package/src/main.css CHANGED
@@ -72,11 +72,15 @@
72
72
  font-weight: 600;
73
73
  font-weight: var(--font-weight-semi-bold);
74
74
  }
75
+ .np-theme-personal .np-accordion-item--with-media .media {
76
+ display: flex;
77
+ align-items: center;
78
+ }
75
79
  .np-theme-personal .np-accordion-item--with-icon .np-accordion-item__content {
76
80
  padding: 0 56px 16px;
77
81
  padding: 0 var(--size-56) var(--size-16);
78
82
  }
79
- .np-theme-personal .np-accordion-item .media {
83
+ .np-theme-personal .np-accordion-item--with-icon .media {
80
84
  display: flex;
81
85
  align-items: flex-start;
82
86
  }
@@ -5145,6 +5149,8 @@ html:not([dir="rtl"]) .np-navigation-option {
5145
5149
  margin-top: var(--size-24);
5146
5150
  }
5147
5151
  .np-switch {
5152
+ all: unset;
5153
+ box-sizing: border-box;
5148
5154
  display: inline-flex;
5149
5155
  overflow: hidden;
5150
5156
  width: 50px;
@@ -5153,6 +5159,7 @@ html:not([dir="rtl"]) .np-navigation-option {
5153
5159
  -webkit-user-select: none;
5154
5160
  -moz-user-select: none;
5155
5161
  user-select: none;
5162
+ cursor: pointer;
5156
5163
  }
5157
5164
  .np-switch:focus {
5158
5165
  outline: none;
@@ -5185,21 +5192,10 @@ html:not([dir="rtl"]) .np-navigation-option {
5185
5192
  [dir="rtl"] .np-switch--checked .np-switch--thumb {
5186
5193
  transform: translateX(-20px) ;
5187
5194
  }
5188
- .np-switch input {
5189
- position: absolute;
5190
- left: -100%;
5191
- display: none;
5192
- width: 0;
5193
- height: 0;
5194
- opacity: 0;
5195
- }
5196
- [dir="rtl"] .np-switch input {
5197
- right: -100%;
5198
- left: auto;
5199
- left: initial;
5200
- }
5201
- .np-switch:not([aria-disabled]) {
5202
- cursor: pointer;
5195
+ .np-switch.disabled {
5196
+ filter: grayscale(1);
5197
+ opacity: 0.45;
5198
+ cursor: not-allowed !important;
5203
5199
  }
5204
5200
  .np-theme-personal .np-switch {
5205
5201
  padding: 1px 2px;
@@ -5215,6 +5211,10 @@ html:not([dir="rtl"]) .np-navigation-option {
5215
5211
  background-color: #ffffff;
5216
5212
  background-color: var(--color-background-screen);
5217
5213
  }
5214
+ .np-switch-option.disabled .np-switch {
5215
+ filter: none;
5216
+ opacity: 1;
5217
+ }
5218
5218
  .tabs {
5219
5219
  position: relative;
5220
5220
  }
package/src/main.less CHANGED
@@ -65,6 +65,7 @@
65
65
  @import "./segmentedControl/SegmentedControl.less";
66
66
  @import "./summary/Summary.less";
67
67
  @import "./switch/Switch.less";
68
+ @import "./switchOption/SwitchOption.less";
68
69
  @import "./tabs/Tabs.less";
69
70
  @import "./table/Table.less";
70
71
  @import "./tile/Tile.less";
@@ -1,4 +1,8 @@
1
- .np-switch {
1
+ @media (min-width: 768px) {
2
+ }@media (min-width: 768px) {
3
+ }.np-switch {
4
+ all: unset;
5
+ box-sizing: border-box;
2
6
  display: inline-flex;
3
7
  overflow: hidden;
4
8
  width: 50px;
@@ -7,61 +11,38 @@
7
11
  -webkit-user-select: none;
8
12
  -moz-user-select: none;
9
13
  user-select: none;
10
- }
11
- .np-switch:focus {
14
+ cursor: pointer;
15
+ }.np-switch:focus {
12
16
  outline: none;
13
- }
14
- .np-switch:focus-visible {
17
+ }.np-switch:focus-visible {
15
18
  outline: var(--ring-outline-color) solid var(--ring-outline-width);
16
19
  outline-offset: var(--ring-outline-offset);
17
- }
18
- .np-switch--thumb {
20
+ }.np-switch--thumb {
19
21
  display: flex;
20
22
  transition: transform cubic-bezier(0, 0.94, 0.62, 1) 350ms;
21
- }
22
- .np-switch--thumb .tw-icon {
23
+ }.np-switch--thumb .tw-icon {
23
24
  color: #fff;
24
- }
25
- .np-switch--unchecked {
25
+ }.np-switch--unchecked {
26
26
  background: #c9cbce;
27
27
  background: var(--color-interactive-secondary);
28
- }
29
- .np-switch--unchecked .switch--thumb {
28
+ }.np-switch--unchecked .switch--thumb {
30
29
  transform: translateX(0);
31
- }
32
- .np-switch--checked {
30
+ }.np-switch--checked {
33
31
  background: #00a2dd;
34
32
  background: var(--color-interactive-accent);
35
- }
36
- .np-switch--checked .np-switch--thumb {
33
+ }.np-switch--checked .np-switch--thumb {
37
34
  transform: translateX(20px) ;
38
- }
39
- [dir="rtl"] .np-switch--checked .np-switch--thumb {
35
+ }[dir="rtl"] .np-switch--checked .np-switch--thumb {
40
36
  transform: translateX(-20px) ;
41
- }
42
- .np-switch input {
43
- position: absolute;
44
- left: -100%;
45
- display: none;
46
- width: 0;
47
- height: 0;
48
- opacity: 0;
49
- }
50
- [dir="rtl"] .np-switch input {
51
- right: -100%;
52
- left: auto;
53
- left: initial;
54
- }
55
- .np-switch:not([aria-disabled]) {
56
- cursor: pointer;
57
- }
58
- .np-theme-personal .np-switch {
37
+ }.np-switch.disabled {
38
+ filter: grayscale(1);
39
+ opacity: 0.45;
40
+ cursor: not-allowed !important;
41
+ }.np-theme-personal .np-switch {
59
42
  padding: 1px 2px;
60
- }
61
- .np-theme-personal .np-switch--checked {
43
+ }.np-theme-personal .np-switch--checked {
62
44
  background: var(--color-interactive-primary);
63
- }
64
- .np-theme-personal .np-switch--thumb {
45
+ }.np-theme-personal .np-switch--thumb {
65
46
  width: 20px;
66
47
  height: 20px;
67
48
  margin: 3px;
@@ -1,14 +1,18 @@
1
1
  @import (reference) "../../node_modules/@transferwise/neptune-css/src/variables/neptune-tokens.less";
2
2
  @import (reference) "../../node_modules/@transferwise/neptune-css/src/less/mixins/_logical-properties.less";
3
3
  @import (reference) "../../node_modules/@transferwise/neptune-css/src/less/ring.less";
4
+ @import (reference) "../../node_modules/@transferwise/neptune-css/src/less/core/_scaffolding.less";
4
5
 
5
6
  .np-switch {
7
+ all: unset;
8
+ box-sizing: border-box;
6
9
  display: inline-flex;
7
10
  overflow: hidden;
8
11
  width: 50px;
9
12
  padding: 2px;
10
13
  border-radius: 16px;
11
14
  user-select: none;
15
+ cursor: pointer;
12
16
 
13
17
  .focus-ring();
14
18
 
@@ -37,18 +41,8 @@
37
41
  }
38
42
  }
39
43
 
40
- input {
41
- position: absolute;
42
- .left(-100%);
43
-
44
- display: none;
45
- width: 0;
46
- height: 0;
47
- opacity: 0;
48
- }
49
-
50
- &:not([aria-disabled]) {
51
- cursor: pointer;
44
+ &.disabled{
45
+ .disabled();
52
46
  }
53
47
  }
54
48
 
@@ -1,5 +1,5 @@
1
1
  import { Field } from '../field/Field';
2
- import { render, fireEvent, screen } from '../test-utils';
2
+ import { render, userEvent, fireEvent, screen } from '../test-utils';
3
3
 
4
4
  import Switch from './Switch';
5
5
 
@@ -22,7 +22,7 @@ describe('Switch', () => {
22
22
  onClick={props.onClick}
23
23
  />,
24
24
  );
25
- expect(container).toMatchSnapshot();
25
+ expect(screen.getByRole('switch')).toBeChecked();
26
26
  });
27
27
 
28
28
  it('renders component associated with label', () => {
@@ -54,25 +54,27 @@ describe('Switch', () => {
54
54
  onClick={props.onClick}
55
55
  />,
56
56
  );
57
- expect(container).toMatchSnapshot();
57
+ expect(screen.getByLabelText(props['aria-label'])).not.toBeChecked();
58
58
  });
59
59
 
60
- it('calls onClick when user press space key', () => {
60
+ it('calls onClick when user press space or enter key', async () => {
61
61
  render(
62
62
  <Switch
63
- checked={props.checked}
64
63
  className={props.className}
65
- id={props.id}
66
64
  aria-label={props['aria-label']}
67
65
  onClick={props.onClick}
68
66
  />,
69
67
  );
70
68
 
71
- const input = screen.getAllByRole('checkbox')[0];
72
- fireEvent.keyDown(input, { key: 'Enter' });
73
69
  expect(props.onClick).not.toHaveBeenCalled();
74
- fireEvent.keyDown(input, { key: ' ' });
70
+
71
+ await userEvent.tab();
72
+
73
+ await userEvent.keyboard(' ');
75
74
  expect(props.onClick).toHaveBeenCalledTimes(1);
75
+
76
+ await userEvent.keyboard('{Enter}');
77
+ expect(props.onClick).toHaveBeenCalledTimes(2);
76
78
  });
77
79
 
78
80
  it('should not call onClick if disabled', () => {