@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.
- package/build/accordion/Accordion.js +4 -0
- package/build/accordion/Accordion.js.map +1 -1
- package/build/accordion/Accordion.mjs +4 -0
- package/build/accordion/Accordion.mjs.map +1 -1
- package/build/accordion/AccordionItem/AccordionItem.js +14 -5
- package/build/accordion/AccordionItem/AccordionItem.js.map +1 -1
- package/build/accordion/AccordionItem/AccordionItem.mjs +14 -5
- package/build/accordion/AccordionItem/AccordionItem.mjs.map +1 -1
- package/build/main.css +16 -16
- package/build/styles/accordion/Accordion.css +4 -1
- package/build/styles/main.css +16 -16
- package/build/styles/switch/Switch.css +22 -41
- package/build/styles/switchOption/SwitchOption.css +4 -0
- package/build/switch/Switch.js +7 -18
- package/build/switch/Switch.js.map +1 -1
- package/build/switch/Switch.mjs +8 -19
- package/build/switch/Switch.mjs.map +1 -1
- package/build/switchOption/SwitchOption.js +1 -0
- package/build/switchOption/SwitchOption.js.map +1 -1
- package/build/switchOption/SwitchOption.mjs +1 -0
- package/build/switchOption/SwitchOption.mjs.map +1 -1
- package/build/types/accordion/Accordion.d.ts +1 -1
- package/build/types/accordion/Accordion.d.ts.map +1 -1
- package/build/types/accordion/AccordionItem/AccordionItem.d.ts +12 -0
- package/build/types/accordion/AccordionItem/AccordionItem.d.ts.map +1 -1
- package/build/types/switch/Switch.d.ts.map +1 -1
- package/build/types/switchOption/SwitchOption.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/accordion/Accordion.css +4 -1
- package/src/accordion/Accordion.less +10 -5
- package/src/accordion/Accordion.story.tsx +30 -1
- package/src/accordion/Accordion.tsx +5 -4
- package/src/accordion/AccordionItem/AccordionItem.tsx +25 -4
- package/src/main.css +16 -16
- package/src/main.less +1 -0
- package/src/switch/Switch.css +22 -41
- package/src/switch/Switch.less +6 -12
- package/src/switch/Switch.spec.tsx +11 -9
- package/src/switch/Switch.story.tsx +158 -33
- package/src/switch/Switch.tsx +6 -15
- package/src/switchOption/SwitchOption.css +4 -0
- package/src/switchOption/SwitchOption.less +8 -0
- package/src/switchOption/SwitchOption.spec.tsx +4 -5
- package/src/switchOption/SwitchOption.story.tsx +42 -38
- package/src/switchOption/SwitchOption.tsx +1 -0
- package/src/switch/__snapshots__/Switch.spec.tsx.snap +0 -44
|
@@ -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;
|
|
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;;;;"}
|
|
@@ -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;
|
|
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 =
|
|
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,
|
|
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
|
|
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,
|
|
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,
|
|
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.
|
|
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
|
-
"@
|
|
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
|
-
|
|
51
|
-
|
|
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 =
|
|
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
|
|
93
|
+
const mediaElement = icon
|
|
78
94
|
? cloneElement(icon as React.ReactElement<IdIconProps>, { size: 24 })
|
|
79
|
-
:
|
|
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',
|
|
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={
|
|
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
|
|
5189
|
-
|
|
5190
|
-
|
|
5191
|
-
|
|
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";
|
package/src/switch/Switch.css
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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;
|
package/src/switch/Switch.less
CHANGED
|
@@ -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
|
-
|
|
41
|
-
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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', () => {
|