@flipdish/ui-library 0.36.2 → 0.37.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/dist/components/atoms/Toggle/Toggle.styles.cjs +41 -0
- package/dist/components/atoms/Toggle/Toggle.styles.cjs.map +1 -0
- package/dist/components/atoms/Toggle/Toggle.styles.d.ts +35 -0
- package/dist/components/atoms/Toggle/Toggle.styles.d.ts.map +1 -0
- package/dist/components/atoms/Toggle/Toggle.styles.js +39 -0
- package/dist/components/atoms/Toggle/Toggle.styles.js.map +1 -0
- package/dist/components/atoms/Toggle/index.cjs +5 -41
- package/dist/components/atoms/Toggle/index.cjs.map +1 -1
- package/dist/components/atoms/Toggle/index.d.ts +4 -3
- package/dist/components/atoms/Toggle/index.d.ts.map +1 -1
- package/dist/components/atoms/Toggle/index.js +5 -41
- package/dist/components/atoms/Toggle/index.js.map +1 -1
- package/dist/components/atoms/Toggle/toggle.types.d.ts +2 -0
- package/dist/components/atoms/Toggle/toggle.types.d.ts.map +1 -0
- package/dist/native/components/__internal__/selectionControl/SelectionControlText.d.ts +11 -0
- package/dist/native/components/__internal__/selectionControl/SelectionControlText.d.ts.map +1 -0
- package/dist/native/components/__internal__/selectionControl/SelectionControlText.js +22 -0
- package/dist/native/components/__internal__/selectionControl/SelectionControlText.js.map +1 -0
- package/dist/native/components/atoms/Toggle/Toggle.styles.d.ts +35 -0
- package/dist/native/components/atoms/Toggle/Toggle.styles.d.ts.map +1 -0
- package/dist/native/components/atoms/Toggle/Toggle.styles.js +39 -0
- package/dist/native/components/atoms/Toggle/Toggle.styles.js.map +1 -0
- package/dist/native/components/atoms/Toggle/index.d.ts +34 -9
- package/dist/native/components/atoms/Toggle/index.d.ts.map +1 -0
- package/dist/native/components/atoms/Toggle/index.js +49 -0
- package/dist/native/components/atoms/Toggle/index.js.map +1 -0
- package/dist/native/components/atoms/Toggle/toggle.types.d.ts +2 -0
- package/dist/native/components/atoms/Toggle/toggle.types.d.ts.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var cx = require('@flipdish/ui-library/utilities/cx');
|
|
4
|
+
|
|
5
|
+
const styles = cx.sortCx({
|
|
6
|
+
track: {
|
|
7
|
+
default: {
|
|
8
|
+
sm: 'h-5 w-9 p-0.5',
|
|
9
|
+
md: 'h-6 w-11 p-0.5',
|
|
10
|
+
},
|
|
11
|
+
slim: {
|
|
12
|
+
sm: 'h-4 w-8',
|
|
13
|
+
md: 'h-5 w-10',
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
knob: {
|
|
17
|
+
sm: 'size-4',
|
|
18
|
+
md: 'size-5',
|
|
19
|
+
},
|
|
20
|
+
knobSelected: {
|
|
21
|
+
sm: 'translate-x-4',
|
|
22
|
+
md: 'translate-x-5',
|
|
23
|
+
},
|
|
24
|
+
sizes: {
|
|
25
|
+
sm: {
|
|
26
|
+
root: 'gap-2',
|
|
27
|
+
textWrapper: '',
|
|
28
|
+
label: 'text-sm font-medium',
|
|
29
|
+
hint: 'text-sm',
|
|
30
|
+
},
|
|
31
|
+
md: {
|
|
32
|
+
root: 'gap-3',
|
|
33
|
+
textWrapper: 'gap-0.5',
|
|
34
|
+
label: 'text-md font-medium',
|
|
35
|
+
hint: 'text-md',
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
exports.styles = styles;
|
|
41
|
+
//# sourceMappingURL=Toggle.styles.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toggle.styles.cjs","sources":["../../../../src/components/atoms/Toggle/Toggle.styles.ts"],"sourcesContent":[null],"names":["sortCx"],"mappings":";;;;AAGO,MAAM,MAAM,GAAGA,SAAM,CAAC;AAC3B,IAAA,KAAK,EAAE;AACL,QAAA,OAAO,EAAE;AACP,YAAA,EAAE,EAAE,eAAe;AACnB,YAAA,EAAE,EAAE,gBAAgB;AACrB,SAAA;AACD,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,SAAS;AACb,YAAA,EAAE,EAAE,UAAU;AACf,SAAA;AAC+D,KAAA;AAClE,IAAA,IAAI,EAAE;AACJ,QAAA,EAAE,EAAE,QAAQ;AACZ,QAAA,EAAE,EAAE,QAAQ;AACwB,KAAA;AACtC,IAAA,YAAY,EAAE;AACZ,QAAA,EAAE,EAAE,eAAe;AACnB,QAAA,EAAE,EAAE,eAAe;AACiB,KAAA;AACtC,IAAA,KAAK,EAAE;AACL,QAAA,EAAE,EAAE;AACF,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,WAAW,EAAE,EAAE;AACf,YAAA,KAAK,EAAE,qBAAqB;AAC5B,YAAA,IAAI,EAAE,SAAS;AAChB,SAAA;AACD,QAAA,EAAE,EAAE;AACF,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,WAAW,EAAE,SAAS;AACtB,YAAA,KAAK,EAAE,qBAAqB;AAC5B,YAAA,IAAI,EAAE,SAAS;AAChB,SAAA;AACsF,KAAA;AAC1F,CAAA;;"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export declare const styles: {
|
|
2
|
+
track: {
|
|
3
|
+
default: {
|
|
4
|
+
sm: string;
|
|
5
|
+
md: string;
|
|
6
|
+
};
|
|
7
|
+
slim: {
|
|
8
|
+
sm: string;
|
|
9
|
+
md: string;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
knob: {
|
|
13
|
+
sm: string;
|
|
14
|
+
md: string;
|
|
15
|
+
};
|
|
16
|
+
knobSelected: {
|
|
17
|
+
sm: string;
|
|
18
|
+
md: string;
|
|
19
|
+
};
|
|
20
|
+
sizes: {
|
|
21
|
+
sm: {
|
|
22
|
+
root: string;
|
|
23
|
+
textWrapper: string;
|
|
24
|
+
label: string;
|
|
25
|
+
hint: string;
|
|
26
|
+
};
|
|
27
|
+
md: {
|
|
28
|
+
root: string;
|
|
29
|
+
textWrapper: string;
|
|
30
|
+
label: string;
|
|
31
|
+
hint: string;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=Toggle.styles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toggle.styles.d.ts","sourceRoot":"","sources":["../../../../src/components/atoms/Toggle/Toggle.styles.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCjB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { sortCx } from '@flipdish/ui-library/utilities/cx';
|
|
2
|
+
|
|
3
|
+
const styles = sortCx({
|
|
4
|
+
track: {
|
|
5
|
+
default: {
|
|
6
|
+
sm: 'h-5 w-9 p-0.5',
|
|
7
|
+
md: 'h-6 w-11 p-0.5',
|
|
8
|
+
},
|
|
9
|
+
slim: {
|
|
10
|
+
sm: 'h-4 w-8',
|
|
11
|
+
md: 'h-5 w-10',
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
knob: {
|
|
15
|
+
sm: 'size-4',
|
|
16
|
+
md: 'size-5',
|
|
17
|
+
},
|
|
18
|
+
knobSelected: {
|
|
19
|
+
sm: 'translate-x-4',
|
|
20
|
+
md: 'translate-x-5',
|
|
21
|
+
},
|
|
22
|
+
sizes: {
|
|
23
|
+
sm: {
|
|
24
|
+
root: 'gap-2',
|
|
25
|
+
textWrapper: '',
|
|
26
|
+
label: 'text-sm font-medium',
|
|
27
|
+
hint: 'text-sm',
|
|
28
|
+
},
|
|
29
|
+
md: {
|
|
30
|
+
root: 'gap-3',
|
|
31
|
+
textWrapper: 'gap-0.5',
|
|
32
|
+
label: 'text-md font-medium',
|
|
33
|
+
hint: 'text-md',
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
export { styles };
|
|
39
|
+
//# sourceMappingURL=Toggle.styles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toggle.styles.js","sources":["../../../../src/components/atoms/Toggle/Toggle.styles.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAGO,MAAM,MAAM,GAAG,MAAM,CAAC;AAC3B,IAAA,KAAK,EAAE;AACL,QAAA,OAAO,EAAE;AACP,YAAA,EAAE,EAAE,eAAe;AACnB,YAAA,EAAE,EAAE,gBAAgB;AACrB,SAAA;AACD,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,SAAS;AACb,YAAA,EAAE,EAAE,UAAU;AACf,SAAA;AAC+D,KAAA;AAClE,IAAA,IAAI,EAAE;AACJ,QAAA,EAAE,EAAE,QAAQ;AACZ,QAAA,EAAE,EAAE,QAAQ;AACwB,KAAA;AACtC,IAAA,YAAY,EAAE;AACZ,QAAA,EAAE,EAAE,eAAe;AACnB,QAAA,EAAE,EAAE,eAAe;AACiB,KAAA;AACtC,IAAA,KAAK,EAAE;AACL,QAAA,EAAE,EAAE;AACF,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,WAAW,EAAE,EAAE;AACf,YAAA,KAAK,EAAE,qBAAqB;AAC5B,YAAA,IAAI,EAAE,SAAS;AAChB,SAAA;AACD,QAAA,EAAE,EAAE;AACF,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,WAAW,EAAE,SAAS;AACtB,YAAA,KAAK,EAAE,qBAAqB;AAC5B,YAAA,IAAI,EAAE,SAAS;AAChB,SAAA;AACsF,KAAA;AAC1F,CAAA;;"}
|
|
@@ -4,49 +4,13 @@ var jsxRuntime = require('react/jsx-runtime');
|
|
|
4
4
|
var cx = require('@flipdish/ui-library/utilities/cx');
|
|
5
5
|
var testIdUtils = require('@flipdish/ui-library/utilities/testIdUtils');
|
|
6
6
|
var reactAriaComponents = require('react-aria-components');
|
|
7
|
+
var Toggle_styles = require('./Toggle.styles.cjs');
|
|
7
8
|
|
|
8
9
|
/** Visual-only switch track and knob with no input behaviour, for building custom controls; `Toggle` renders it inside a react-aria `Switch`. */
|
|
9
10
|
const ToggleBase = ({ className, isHovered, isDisabled, isFocusVisible, isSelected, slim, size = 'sm' }) => {
|
|
10
|
-
|
|
11
|
-
default: {
|
|
12
|
-
sm: {
|
|
13
|
-
root: 'h-5 w-9 p-0.5',
|
|
14
|
-
switch: cx.cx('size-4', isSelected && 'translate-x-4'),
|
|
15
|
-
},
|
|
16
|
-
md: {
|
|
17
|
-
root: 'h-6 w-11 p-0.5',
|
|
18
|
-
switch: cx.cx('size-5', isSelected && 'translate-x-5'),
|
|
19
|
-
},
|
|
20
|
-
},
|
|
21
|
-
slim: {
|
|
22
|
-
sm: {
|
|
23
|
-
root: 'h-4 w-8',
|
|
24
|
-
switch: cx.cx('size-4', isSelected && 'translate-x-4'),
|
|
25
|
-
},
|
|
26
|
-
md: {
|
|
27
|
-
root: 'h-5 w-10',
|
|
28
|
-
switch: cx.cx('size-5', isSelected && 'translate-x-5'),
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
|
-
};
|
|
32
|
-
const classes = slim ? styles.slim[size] : styles.default[size];
|
|
33
|
-
return (jsxRuntime.jsx("div", { className: cx.cx('cursor-pointer rounded-full bg-tertiary ring-[0.5px] ring-secondary outline-focus-ring transition duration-150 ease-linear ring-inset', isSelected && 'bg-brand-solid', isSelected && isHovered && 'bg-brand-solid_hover', isDisabled && 'cursor-not-allowed opacity-50', isFocusVisible && 'outline-2 outline-offset-2', slim && 'ring-1', slim && isSelected && 'ring-transparent', classes.root, className), children: jsxRuntime.jsx("div", { style: {
|
|
11
|
+
return (jsxRuntime.jsx("div", { className: cx.cx('cursor-pointer rounded-full bg-tertiary ring-[0.5px] ring-secondary outline-focus-ring transition duration-150 ease-linear ring-inset', isSelected && 'bg-brand-solid', isSelected && isHovered && 'bg-brand-solid_hover', isDisabled && 'cursor-not-allowed opacity-50', isFocusVisible && 'outline-2 outline-offset-2', slim && 'ring-1', slim && isSelected && 'ring-transparent', Toggle_styles.styles.track[slim ? 'slim' : 'default'][size], className), children: jsxRuntime.jsx("div", { style: {
|
|
34
12
|
transition: 'transform 0.15s ease-in-out, translate 0.15s ease-in-out, border-color 0.1s linear, background-color 0.1s linear',
|
|
35
|
-
}, className: cx.cx('rounded-full bg-fg-white shadow-sm', slim && 'shadow-xs', slim && 'border border-toggle-border', slim && isSelected && 'border-toggle-slim-border_pressed', slim && isSelected && isHovered && 'border-toggle-slim-border_pressed-hover',
|
|
36
|
-
};
|
|
37
|
-
const styles = {
|
|
38
|
-
sm: {
|
|
39
|
-
root: 'gap-2',
|
|
40
|
-
textWrapper: '',
|
|
41
|
-
label: 'text-sm font-medium',
|
|
42
|
-
hint: 'text-sm',
|
|
43
|
-
},
|
|
44
|
-
md: {
|
|
45
|
-
root: 'gap-3',
|
|
46
|
-
textWrapper: 'gap-0.5',
|
|
47
|
-
label: 'text-md font-medium',
|
|
48
|
-
hint: 'text-md',
|
|
49
|
-
},
|
|
13
|
+
}, className: cx.cx('rounded-full bg-fg-white shadow-sm', slim && 'shadow-xs', slim && 'border border-toggle-border', slim && isSelected && 'border-toggle-slim-border_pressed', slim && isSelected && isHovered && 'border-toggle-slim-border_pressed-hover', Toggle_styles.styles.knob[size], isSelected && Toggle_styles.styles.knobSelected[size]) }) }));
|
|
50
14
|
};
|
|
51
15
|
/**
|
|
52
16
|
* Switch control for toggling a single setting on or off, with optional label and hint.
|
|
@@ -55,10 +19,10 @@ const styles = {
|
|
|
55
19
|
*/
|
|
56
20
|
const Toggle = ({ label, hint, className, size = 'sm', slim, 'data-testid': dataTestId, ...ariaSwitchProps }) => {
|
|
57
21
|
const toggleTestId = testIdUtils.useResolvedTestId({ testId: dataTestId, segment: 'toggle', rootName: 'toggle' });
|
|
58
|
-
return (jsxRuntime.jsx(reactAriaComponents.Switch, { ...ariaSwitchProps, "data-testid": toggleTestId, className: (state) => cx.cx('relative flex w-max items-start', state.isDisabled && 'cursor-not-allowed', styles[size].root, typeof className === 'function' ? className(state) : className), children: ({ isSelected, isDisabled, isFocusVisible, isHovered }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(ToggleBase, { slim: slim, size: size, isHovered: isHovered, isDisabled: isDisabled, isFocusVisible: isFocusVisible, isSelected: isSelected, className: slim ? 'mt-0.5' : '' }), (label || hint) && (jsxRuntime.jsxs("div", { className: cx.cx('flex flex-col', styles[size].textWrapper), children: [label && jsxRuntime.jsx("p", { className: cx.cx('text-secondary select-none', styles[size].label), children: label }), hint && (
|
|
22
|
+
return (jsxRuntime.jsx(reactAriaComponents.Switch, { ...ariaSwitchProps, "data-testid": toggleTestId, className: (state) => cx.cx('relative flex w-max items-start', state.isDisabled && 'cursor-not-allowed', Toggle_styles.styles.sizes[size].root, typeof className === 'function' ? className(state) : className), children: ({ isSelected, isDisabled, isFocusVisible, isHovered }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(ToggleBase, { slim: slim, size: size, isHovered: isHovered, isDisabled: isDisabled, isFocusVisible: isFocusVisible, isSelected: isSelected, className: slim ? 'mt-0.5' : '' }), (label || hint) && (jsxRuntime.jsxs("div", { className: cx.cx('flex flex-col', Toggle_styles.styles.sizes[size].textWrapper), children: [label && jsxRuntime.jsx("p", { className: cx.cx('text-secondary select-none', Toggle_styles.styles.sizes[size].label), children: label }), hint && (
|
|
59
23
|
// biome-ignore lint/a11y/noStaticElementInteractions: This is a hint that is not interactive
|
|
60
24
|
// biome-ignore lint/a11y/useKeyWithClickEvents: This is a hint that is not interactive
|
|
61
|
-
jsxRuntime.jsx("span", { className: cx.cx('text-tertiary', styles[size].hint), onClick: (event) => event.stopPropagation(), children: hint }))] }))] })) }));
|
|
25
|
+
jsxRuntime.jsx("span", { className: cx.cx('text-tertiary', Toggle_styles.styles.sizes[size].hint), onClick: (event) => event.stopPropagation(), children: hint }))] }))] })) }));
|
|
62
26
|
};
|
|
63
27
|
|
|
64
28
|
exports.Toggle = Toggle;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/components/atoms/Toggle/index.tsx"],"sourcesContent":[null],"names":["cx","
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/components/atoms/Toggle/index.tsx"],"sourcesContent":[null],"names":["_jsx","cx","styles","useResolvedTestId","AriaSwitch","_jsxs","_Fragment"],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { ReactNode } from 'react';
|
|
2
2
|
import type { SwitchProps as AriaSwitchProps } from 'react-aria-components';
|
|
3
|
+
import type { ToggleSize } from './toggle.types';
|
|
4
|
+
export type { ToggleSize } from './toggle.types';
|
|
3
5
|
interface ToggleBaseProps {
|
|
4
|
-
size?:
|
|
6
|
+
size?: ToggleSize;
|
|
5
7
|
slim?: boolean;
|
|
6
8
|
className?: string;
|
|
7
9
|
isHovered?: boolean;
|
|
@@ -13,7 +15,7 @@ interface ToggleBaseProps {
|
|
|
13
15
|
export declare const ToggleBase: ({ className, isHovered, isDisabled, isFocusVisible, isSelected, slim, size }: ToggleBaseProps) => import("react").JSX.Element;
|
|
14
16
|
export interface ToggleProps extends AriaSwitchProps {
|
|
15
17
|
/** Sets the switch size and the label and hint text size. */
|
|
16
|
-
size?:
|
|
18
|
+
size?: ToggleSize;
|
|
17
19
|
/** Text shown beside the switch; clicking it toggles the setting. */
|
|
18
20
|
label?: string;
|
|
19
21
|
/** Supporting text shown below the label. */
|
|
@@ -29,5 +31,4 @@ export interface ToggleProps extends AriaSwitchProps {
|
|
|
29
31
|
* @summary on/off switch for a single setting
|
|
30
32
|
*/
|
|
31
33
|
export declare const Toggle: ({ label, hint, className, size, slim, "data-testid": dataTestId, ...ariaSwitchProps }: ToggleProps) => import("react").JSX.Element;
|
|
32
|
-
export {};
|
|
33
34
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/atoms/Toggle/index.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG5E,UAAU,eAAe;IACvB,IAAI,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/atoms/Toggle/index.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,YAAY,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,UAAU,eAAe;IACvB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,iJAAiJ;AACjJ,eAAO,MAAM,UAAU,GAAI,8EAAqF,eAAe,gCAkC9H,CAAC;AAEF,MAAM,WAAW,WAAY,SAAQ,eAAe;IAClD,6DAA6D;IAC7D,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,qFAAqF;IACrF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,6DAA6D;IAC7D,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,eAAO,MAAM,MAAM,GAAI,uFAA8F,WAAW,gCA4C/H,CAAC"}
|
|
@@ -2,49 +2,13 @@ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
|
2
2
|
import { cx } from '@flipdish/ui-library/utilities/cx';
|
|
3
3
|
import { useResolvedTestId } from '@flipdish/ui-library/utilities/testIdUtils';
|
|
4
4
|
import { Switch } from 'react-aria-components';
|
|
5
|
+
import { styles } from './Toggle.styles.js';
|
|
5
6
|
|
|
6
7
|
/** Visual-only switch track and knob with no input behaviour, for building custom controls; `Toggle` renders it inside a react-aria `Switch`. */
|
|
7
8
|
const ToggleBase = ({ className, isHovered, isDisabled, isFocusVisible, isSelected, slim, size = 'sm' }) => {
|
|
8
|
-
|
|
9
|
-
default: {
|
|
10
|
-
sm: {
|
|
11
|
-
root: 'h-5 w-9 p-0.5',
|
|
12
|
-
switch: cx('size-4', isSelected && 'translate-x-4'),
|
|
13
|
-
},
|
|
14
|
-
md: {
|
|
15
|
-
root: 'h-6 w-11 p-0.5',
|
|
16
|
-
switch: cx('size-5', isSelected && 'translate-x-5'),
|
|
17
|
-
},
|
|
18
|
-
},
|
|
19
|
-
slim: {
|
|
20
|
-
sm: {
|
|
21
|
-
root: 'h-4 w-8',
|
|
22
|
-
switch: cx('size-4', isSelected && 'translate-x-4'),
|
|
23
|
-
},
|
|
24
|
-
md: {
|
|
25
|
-
root: 'h-5 w-10',
|
|
26
|
-
switch: cx('size-5', isSelected && 'translate-x-5'),
|
|
27
|
-
},
|
|
28
|
-
},
|
|
29
|
-
};
|
|
30
|
-
const classes = slim ? styles.slim[size] : styles.default[size];
|
|
31
|
-
return (jsx("div", { className: cx('cursor-pointer rounded-full bg-tertiary ring-[0.5px] ring-secondary outline-focus-ring transition duration-150 ease-linear ring-inset', isSelected && 'bg-brand-solid', isSelected && isHovered && 'bg-brand-solid_hover', isDisabled && 'cursor-not-allowed opacity-50', isFocusVisible && 'outline-2 outline-offset-2', slim && 'ring-1', slim && isSelected && 'ring-transparent', classes.root, className), children: jsx("div", { style: {
|
|
9
|
+
return (jsx("div", { className: cx('cursor-pointer rounded-full bg-tertiary ring-[0.5px] ring-secondary outline-focus-ring transition duration-150 ease-linear ring-inset', isSelected && 'bg-brand-solid', isSelected && isHovered && 'bg-brand-solid_hover', isDisabled && 'cursor-not-allowed opacity-50', isFocusVisible && 'outline-2 outline-offset-2', slim && 'ring-1', slim && isSelected && 'ring-transparent', styles.track[slim ? 'slim' : 'default'][size], className), children: jsx("div", { style: {
|
|
32
10
|
transition: 'transform 0.15s ease-in-out, translate 0.15s ease-in-out, border-color 0.1s linear, background-color 0.1s linear',
|
|
33
|
-
}, className: cx('rounded-full bg-fg-white shadow-sm', slim && 'shadow-xs', slim && 'border border-toggle-border', slim && isSelected && 'border-toggle-slim-border_pressed', slim && isSelected && isHovered && 'border-toggle-slim-border_pressed-hover',
|
|
34
|
-
};
|
|
35
|
-
const styles = {
|
|
36
|
-
sm: {
|
|
37
|
-
root: 'gap-2',
|
|
38
|
-
textWrapper: '',
|
|
39
|
-
label: 'text-sm font-medium',
|
|
40
|
-
hint: 'text-sm',
|
|
41
|
-
},
|
|
42
|
-
md: {
|
|
43
|
-
root: 'gap-3',
|
|
44
|
-
textWrapper: 'gap-0.5',
|
|
45
|
-
label: 'text-md font-medium',
|
|
46
|
-
hint: 'text-md',
|
|
47
|
-
},
|
|
11
|
+
}, className: cx('rounded-full bg-fg-white shadow-sm', slim && 'shadow-xs', slim && 'border border-toggle-border', slim && isSelected && 'border-toggle-slim-border_pressed', slim && isSelected && isHovered && 'border-toggle-slim-border_pressed-hover', styles.knob[size], isSelected && styles.knobSelected[size]) }) }));
|
|
48
12
|
};
|
|
49
13
|
/**
|
|
50
14
|
* Switch control for toggling a single setting on or off, with optional label and hint.
|
|
@@ -53,10 +17,10 @@ const styles = {
|
|
|
53
17
|
*/
|
|
54
18
|
const Toggle = ({ label, hint, className, size = 'sm', slim, 'data-testid': dataTestId, ...ariaSwitchProps }) => {
|
|
55
19
|
const toggleTestId = useResolvedTestId({ testId: dataTestId, segment: 'toggle', rootName: 'toggle' });
|
|
56
|
-
return (jsx(Switch, { ...ariaSwitchProps, "data-testid": toggleTestId, className: (state) => cx('relative flex w-max items-start', state.isDisabled && 'cursor-not-allowed', styles[size].root, typeof className === 'function' ? className(state) : className), children: ({ isSelected, isDisabled, isFocusVisible, isHovered }) => (jsxs(Fragment, { children: [jsx(ToggleBase, { slim: slim, size: size, isHovered: isHovered, isDisabled: isDisabled, isFocusVisible: isFocusVisible, isSelected: isSelected, className: slim ? 'mt-0.5' : '' }), (label || hint) && (jsxs("div", { className: cx('flex flex-col', styles[size].textWrapper), children: [label && jsx("p", { className: cx('text-secondary select-none', styles[size].label), children: label }), hint && (
|
|
20
|
+
return (jsx(Switch, { ...ariaSwitchProps, "data-testid": toggleTestId, className: (state) => cx('relative flex w-max items-start', state.isDisabled && 'cursor-not-allowed', styles.sizes[size].root, typeof className === 'function' ? className(state) : className), children: ({ isSelected, isDisabled, isFocusVisible, isHovered }) => (jsxs(Fragment, { children: [jsx(ToggleBase, { slim: slim, size: size, isHovered: isHovered, isDisabled: isDisabled, isFocusVisible: isFocusVisible, isSelected: isSelected, className: slim ? 'mt-0.5' : '' }), (label || hint) && (jsxs("div", { className: cx('flex flex-col', styles.sizes[size].textWrapper), children: [label && jsx("p", { className: cx('text-secondary select-none', styles.sizes[size].label), children: label }), hint && (
|
|
57
21
|
// biome-ignore lint/a11y/noStaticElementInteractions: This is a hint that is not interactive
|
|
58
22
|
// biome-ignore lint/a11y/useKeyWithClickEvents: This is a hint that is not interactive
|
|
59
|
-
jsx("span", { className: cx('text-tertiary', styles[size].hint), onClick: (event) => event.stopPropagation(), children: hint }))] }))] })) }));
|
|
23
|
+
jsx("span", { className: cx('text-tertiary', styles.sizes[size].hint), onClick: (event) => event.stopPropagation(), children: hint }))] }))] })) }));
|
|
60
24
|
};
|
|
61
25
|
|
|
62
26
|
export { Toggle, ToggleBase };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/atoms/Toggle/index.tsx"],"sourcesContent":[null],"names":["_jsx","AriaSwitch","_jsxs","_Fragment"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/atoms/Toggle/index.tsx"],"sourcesContent":[null],"names":["_jsx","AriaSwitch","_jsxs","_Fragment"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toggle.types.d.ts","sourceRoot":"","sources":["../../../../src/components/atoms/Toggle/toggle.types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
type SelectionControlSize = 'sm' | 'md';
|
|
3
|
+
interface SelectionControlTextProps {
|
|
4
|
+
size: SelectionControlSize;
|
|
5
|
+
label?: ReactNode;
|
|
6
|
+
hint?: ReactNode;
|
|
7
|
+
}
|
|
8
|
+
/** Label and hint column shared by the native `Toggle`, `Checkbox` and `RadioButton`, matching their web text styles. */
|
|
9
|
+
export declare const SelectionControlText: ({ size, label, hint }: SelectionControlTextProps) => import("react").JSX.Element | null;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=SelectionControlText.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectionControlText.d.ts","sourceRoot":"","sources":["../../../../../src/components/__internal__/selectionControl/SelectionControlText.native.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,KAAK,oBAAoB,GAAG,IAAI,GAAG,IAAI,CAAC;AAaxC,UAAU,yBAAyB;IACjC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED,yHAAyH;AACzH,eAAO,MAAM,oBAAoB,GAAI,uBAAuB,yBAAyB,uCASpF,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { cx } from '../../../utilities/cx/index.js';
|
|
3
|
+
import { View, Text } from 'react-native';
|
|
4
|
+
|
|
5
|
+
// `Text` className is ignored by the current `react-native-css` preview (see Avatar), so label
|
|
6
|
+
// typography goes through `style`. Mirrors `text-sm`/`text-md` + `font-medium`.
|
|
7
|
+
const TEXT_SIZE = {
|
|
8
|
+
sm: { fontSize: 14, lineHeight: 20 },
|
|
9
|
+
md: { fontSize: 16, lineHeight: 24 },
|
|
10
|
+
};
|
|
11
|
+
// Light-mode hex of `text-secondary` (neutral-700) and `text-tertiary` (neutral-600); the app has no dark mode yet.
|
|
12
|
+
const LABEL_COLOR = '#404040';
|
|
13
|
+
const HINT_COLOR = '#525252';
|
|
14
|
+
/** Label and hint column shared by the native `Toggle`, `Checkbox` and `RadioButton`, matching their web text styles. */
|
|
15
|
+
const SelectionControlText = ({ size, label, hint }) => {
|
|
16
|
+
if (!label && !hint)
|
|
17
|
+
return null;
|
|
18
|
+
return (jsxs(View, { className: cx('shrink flex-col', size === 'md' && 'gap-0.5'), children: [label ? jsx(Text, { style: { ...TEXT_SIZE[size], fontWeight: '500', color: LABEL_COLOR }, children: label }) : null, hint ? jsx(Text, { style: { ...TEXT_SIZE[size], color: HINT_COLOR }, children: hint }) : null] }));
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export { SelectionControlText };
|
|
22
|
+
//# sourceMappingURL=SelectionControlText.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectionControlText.js","sources":["../../../../../../src/components/__internal__/selectionControl/SelectionControlText.native.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx"],"mappings":";;;;AAMA;AACA;AACA,MAAM,SAAS,GAA2E;IACxF,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;IACpC,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;CACrC;AAED;AACA,MAAM,WAAW,GAAG,SAAS;AAC7B,MAAM,UAAU,GAAG,SAAS;AAQ5B;AACO,MAAM,oBAAoB,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAA6B,KAAI;AACvF,IAAA,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,IAAI;AAEhC,IAAA,QACEA,IAAA,CAAC,IAAI,EAAA,EAAC,SAAS,EAAE,EAAE,CAAC,iBAAiB,EAAE,IAAI,KAAK,IAAI,IAAI,SAAS,CAAC,EAAA,QAAA,EAAA,CAC/D,KAAK,GAAGC,GAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,YAAG,KAAK,EAAA,CAAQ,GAAG,IAAI,EACzG,IAAI,GAAGA,GAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,EAAA,QAAA,EAAG,IAAI,GAAQ,GAAG,IAAI,CAAA,EAAA,CAC/E;AAEX;;"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export declare const styles: {
|
|
2
|
+
track: {
|
|
3
|
+
default: {
|
|
4
|
+
sm: string;
|
|
5
|
+
md: string;
|
|
6
|
+
};
|
|
7
|
+
slim: {
|
|
8
|
+
sm: string;
|
|
9
|
+
md: string;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
knob: {
|
|
13
|
+
sm: string;
|
|
14
|
+
md: string;
|
|
15
|
+
};
|
|
16
|
+
knobSelected: {
|
|
17
|
+
sm: string;
|
|
18
|
+
md: string;
|
|
19
|
+
};
|
|
20
|
+
sizes: {
|
|
21
|
+
sm: {
|
|
22
|
+
root: string;
|
|
23
|
+
textWrapper: string;
|
|
24
|
+
label: string;
|
|
25
|
+
hint: string;
|
|
26
|
+
};
|
|
27
|
+
md: {
|
|
28
|
+
root: string;
|
|
29
|
+
textWrapper: string;
|
|
30
|
+
label: string;
|
|
31
|
+
hint: string;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=Toggle.styles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toggle.styles.d.ts","sourceRoot":"","sources":["../../../../../src/components/atoms/Toggle/Toggle.styles.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCjB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { sortCx } from '../../../utilities/cx/index.js';
|
|
2
|
+
|
|
3
|
+
const styles = sortCx({
|
|
4
|
+
track: {
|
|
5
|
+
default: {
|
|
6
|
+
sm: 'h-5 w-9 p-0.5',
|
|
7
|
+
md: 'h-6 w-11 p-0.5',
|
|
8
|
+
},
|
|
9
|
+
slim: {
|
|
10
|
+
sm: 'h-4 w-8',
|
|
11
|
+
md: 'h-5 w-10',
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
knob: {
|
|
15
|
+
sm: 'size-4',
|
|
16
|
+
md: 'size-5',
|
|
17
|
+
},
|
|
18
|
+
knobSelected: {
|
|
19
|
+
sm: 'translate-x-4',
|
|
20
|
+
md: 'translate-x-5',
|
|
21
|
+
},
|
|
22
|
+
sizes: {
|
|
23
|
+
sm: {
|
|
24
|
+
root: 'gap-2',
|
|
25
|
+
textWrapper: '',
|
|
26
|
+
label: 'text-sm font-medium',
|
|
27
|
+
hint: 'text-sm',
|
|
28
|
+
},
|
|
29
|
+
md: {
|
|
30
|
+
root: 'gap-3',
|
|
31
|
+
textWrapper: 'gap-0.5',
|
|
32
|
+
label: 'text-md font-medium',
|
|
33
|
+
hint: 'text-md',
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
export { styles };
|
|
39
|
+
//# sourceMappingURL=Toggle.styles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toggle.styles.js","sources":["../../../../../../src/components/atoms/Toggle/Toggle.styles.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAGO,MAAM,MAAM,GAAG,MAAM,CAAC;AAC3B,IAAA,KAAK,EAAE;AACL,QAAA,OAAO,EAAE;AACP,YAAA,EAAE,EAAE,eAAe;AACnB,YAAA,EAAE,EAAE,gBAAgB;AACrB,SAAA;AACD,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,SAAS;AACb,YAAA,EAAE,EAAE,UAAU;AACf,SAAA;AAC+D,KAAA;AAClE,IAAA,IAAI,EAAE;AACJ,QAAA,EAAE,EAAE,QAAQ;AACZ,QAAA,EAAE,EAAE,QAAQ;AACwB,KAAA;AACtC,IAAA,YAAY,EAAE;AACZ,QAAA,EAAE,EAAE,eAAe;AACnB,QAAA,EAAE,EAAE,eAAe;AACiB,KAAA;AACtC,IAAA,KAAK,EAAE;AACL,QAAA,EAAE,EAAE;AACF,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,WAAW,EAAE,EAAE;AACf,YAAA,KAAK,EAAE,qBAAqB;AAC5B,YAAA,IAAI,EAAE,SAAS;AAChB,SAAA;AACD,QAAA,EAAE,EAAE;AACF,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,WAAW,EAAE,SAAS;AACtB,YAAA,KAAK,EAAE,qBAAqB;AAC5B,YAAA,IAAI,EAAE,SAAS;AAChB,SAAA;AACsF,KAAA;AAC1F,CAAA;;"}
|
|
@@ -1,12 +1,37 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import type { ToggleSize } from './toggle.types';
|
|
3
|
+
export type { ToggleSize } from './toggle.types';
|
|
4
|
+
export interface ToggleProps {
|
|
5
|
+
/** Sets the switch size and the label and hint text size. */
|
|
6
|
+
size?: ToggleSize;
|
|
7
|
+
/** Text shown beside the switch; pressing it toggles the setting. */
|
|
8
|
+
label?: string;
|
|
9
|
+
/** Supporting text shown below the label. */
|
|
10
|
+
hint?: ReactNode;
|
|
11
|
+
/** Uses the slim style: a shorter track the knob overhangs, with a bordered knob. */
|
|
12
|
+
slim?: boolean;
|
|
13
|
+
/** Controlled selected state — the toggle is on when true. */
|
|
14
|
+
isSelected?: boolean;
|
|
15
|
+
/** Initial selected state for uncontrolled usage. */
|
|
16
|
+
defaultSelected?: boolean;
|
|
17
|
+
/** Disables interaction and shows a reduced-opacity state. */
|
|
18
|
+
isDisabled?: boolean;
|
|
19
|
+
/** Called with the new selected state whenever the user toggles it. */
|
|
20
|
+
onChange?: (isSelected: boolean) => void;
|
|
21
|
+
/** Extra classes merged onto the root `Pressable`. */
|
|
22
|
+
className?: string;
|
|
23
|
+
/** Web-style accessible name, used as `accessibilityLabel` so shared call sites work on both platforms. */
|
|
24
|
+
'aria-label'?: string;
|
|
25
|
+
/** Overrides the generated `testID` (defaults to `fd-toggle`). */
|
|
26
|
+
'data-testid'?: string;
|
|
27
|
+
}
|
|
1
28
|
/**
|
|
2
|
-
* `Toggle`
|
|
29
|
+
* React Native `Toggle` — the same track, knob, label and hint as web, built from `Pressable`
|
|
30
|
+
* and `View` instead of a react-aria `Switch`. Pressed styles stand in for `hover:`, the knob
|
|
31
|
+
* slides and the brand fill fades in on the native driver (an `Animated` value rather than
|
|
32
|
+
* web's CSS transition), and the web `ring-inset` is an absolutely positioned border.
|
|
3
33
|
*
|
|
4
|
-
*
|
|
5
|
-
* that importing `@flipdish/ui-library/components/atoms/Toggle` from React Native fails at
|
|
6
|
-
* compile time rather than resolving to the web build's types. There is no
|
|
7
|
-
* matching `index.js`, so Metro cannot bundle this module either.
|
|
8
|
-
*
|
|
9
|
-
* To make `Toggle` available on React Native, add an `index.native.tsx` beside
|
|
10
|
-
* its `index.tsx` — the build picks it up automatically and this stub disappears.
|
|
34
|
+
* @summary on/off switch for a single setting (React Native)
|
|
11
35
|
*/
|
|
12
|
-
export declare const
|
|
36
|
+
export declare const Toggle: ({ label, hint, className, size, slim, isSelected: isSelectedProp, defaultSelected, isDisabled, onChange, "aria-label": ariaLabel, "data-testid": dataTestId, }: ToggleProps) => import("react").JSX.Element;
|
|
37
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/atoms/Toggle/index.native.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAA+B,MAAM,OAAO,CAAC;AAIpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,YAAY,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,WAAW,WAAW;IAC1B,6DAA6D;IAC7D,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,qFAAqF;IACrF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qDAAqD;IACrD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2GAA2G;IAC3G,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAOD;;;;;;;GAOG;AACH,eAAO,MAAM,MAAM,GAAI,gKAYpB,WAAW,gCAyEb,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { cx } from '../../../utilities/cx/index.js';
|
|
3
|
+
import { useResolvedTestId } from '../../../utilities/testIdUtils/index.js';
|
|
4
|
+
import { useState, useRef, useEffect } from 'react';
|
|
5
|
+
import { Animated, Easing, Pressable, View } from 'react-native';
|
|
6
|
+
import { SelectionControlText } from '../../__internal__/selectionControl/SelectionControlText.js';
|
|
7
|
+
import { styles } from './Toggle.styles.js';
|
|
8
|
+
|
|
9
|
+
// Matches the web knob's 150ms ease-in-out slide.
|
|
10
|
+
const SLIDE_DURATION_MS = 150;
|
|
11
|
+
// Knob travel at a 16px rem (`translate-x-4` / `translate-x-5`); replaced by the measured value once the track lays out.
|
|
12
|
+
const DEFAULT_TRAVEL = { sm: 16, md: 20 };
|
|
13
|
+
/**
|
|
14
|
+
* React Native `Toggle` — the same track, knob, label and hint as web, built from `Pressable`
|
|
15
|
+
* and `View` instead of a react-aria `Switch`. Pressed styles stand in for `hover:`, the knob
|
|
16
|
+
* slides and the brand fill fades in on the native driver (an `Animated` value rather than
|
|
17
|
+
* web's CSS transition), and the web `ring-inset` is an absolutely positioned border.
|
|
18
|
+
*
|
|
19
|
+
* @summary on/off switch for a single setting (React Native)
|
|
20
|
+
*/
|
|
21
|
+
const Toggle = ({ label, hint, className, size = 'sm', slim, isSelected: isSelectedProp, defaultSelected = false, isDisabled, onChange, 'aria-label': ariaLabel, 'data-testid': dataTestId, }) => {
|
|
22
|
+
const toggleTestId = useResolvedTestId({ testId: dataTestId, segment: 'toggle', rootName: 'toggle' });
|
|
23
|
+
const [uncontrolledSelected, setUncontrolledSelected] = useState(defaultSelected);
|
|
24
|
+
const [pressed, setPressed] = useState(false);
|
|
25
|
+
const isSelected = isSelectedProp ?? uncontrolledSelected;
|
|
26
|
+
const [travel, setTravel] = useState(DEFAULT_TRAVEL[size]);
|
|
27
|
+
const progress = useRef(new Animated.Value(isSelected ? 1 : 0)).current;
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
Animated.timing(progress, {
|
|
30
|
+
toValue: isSelected ? 1 : 0,
|
|
31
|
+
duration: SLIDE_DURATION_MS,
|
|
32
|
+
easing: Easing.inOut(Easing.ease),
|
|
33
|
+
useNativeDriver: true,
|
|
34
|
+
}).start();
|
|
35
|
+
}, [isSelected, progress]);
|
|
36
|
+
// The knob is square and fills the track's content box, so its travel is that box's width minus its height.
|
|
37
|
+
const handleKnobAreaLayout = ({ nativeEvent }) => setTravel(nativeEvent.layout.width - nativeEvent.layout.height);
|
|
38
|
+
const translateX = progress.interpolate({ inputRange: [0, 1], outputRange: [0, travel] });
|
|
39
|
+
const handlePress = () => {
|
|
40
|
+
const next = !isSelected;
|
|
41
|
+
if (isSelectedProp === undefined)
|
|
42
|
+
setUncontrolledSelected(next);
|
|
43
|
+
onChange?.(next);
|
|
44
|
+
};
|
|
45
|
+
return (jsxs(Pressable, { testID: toggleTestId, disabled: isDisabled, onPress: handlePress, onPressIn: () => setPressed(true), onPressOut: () => setPressed(false), accessibilityRole: "switch", accessibilityLabel: ariaLabel ?? label, accessibilityState: { checked: isSelected, disabled: Boolean(isDisabled) }, className: cx('relative flex flex-row items-start self-start', styles.sizes[size].root, className), children: [jsxs(View, { className: cx('flex-row rounded-full bg-tertiary', isDisabled && 'opacity-50', slim && 'mt-0.5', styles.track[slim ? 'slim' : 'default'][size]), children: [jsx(Animated.View, { pointerEvents: "none", style: { position: 'absolute', top: 0, right: 0, bottom: 0, left: 0, opacity: progress }, children: jsx(View, { className: cx('flex-1 rounded-full bg-brand-solid', pressed && 'bg-brand-solid_hover') }) }), jsx(View, { pointerEvents: "none", className: cx('absolute inset-0 rounded-full border-secondary', slim && isSelected && 'border-transparent'), style: { borderWidth: slim ? 1 : 0.5 } }), jsx(View, { className: "flex-1 flex-row", onLayout: handleKnobAreaLayout, children: jsx(Animated.View, { style: { transform: [{ translateX }] }, children: jsx(View, { className: cx('rounded-full bg-fg-white shadow-sm', slim && 'border border-toggle-border shadow-xs', slim && isSelected && 'border-toggle-slim-border_pressed', slim && isSelected && pressed && 'border-toggle-slim-border_pressed-hover', styles.knob[size]) }) }) })] }), jsx(SelectionControlText, { size: size, label: label, hint: hint })] }));
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
export { Toggle };
|
|
49
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../../src/components/atoms/Toggle/index.native.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toggle.types.d.ts","sourceRoot":"","sources":["../../../../../src/components/atoms/Toggle/toggle.types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC"}
|