@hyphen/hyphen-components 4.12.0 → 5.0.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 (42) hide show
  1. package/dist/components/Formik/{FormikToggle/FormikToggle.d.ts → FormikSwitch/FormikSwitch.d.ts} +2 -2
  2. package/dist/components/Formik/FormikToggleGroup/FormikToggleGroup.d.ts +17 -0
  3. package/dist/components/Switch/Switch.d.ts +64 -0
  4. package/dist/components/Switch/Switch.stories.d.ts +12 -0
  5. package/dist/components/Toggle/Toggle.d.ts +7 -64
  6. package/dist/components/Toggle/Toggle.stories.d.ts +3 -5
  7. package/dist/components/ToggleGroup/ToggleGroup.d.ts +19 -0
  8. package/dist/components/ToggleGroup/ToggleGroup.stories.d.ts +11 -0
  9. package/dist/css/index.css +3 -1
  10. package/dist/css/utilities.css +205 -1
  11. package/dist/css/variables.css +10 -2
  12. package/dist/hyphen-components.cjs.development.js +335 -239
  13. package/dist/hyphen-components.cjs.development.js.map +1 -1
  14. package/dist/hyphen-components.cjs.production.min.js +1 -1
  15. package/dist/hyphen-components.cjs.production.min.js.map +1 -1
  16. package/dist/hyphen-components.esm.js +329 -239
  17. package/dist/hyphen-components.esm.js.map +1 -1
  18. package/dist/index.d.ts +4 -1
  19. package/dist/lib/tokens.d.ts +3 -3
  20. package/package.json +18 -16
  21. package/src/components/Box/Box.stories.tsx +49 -0
  22. package/src/components/Formik/Formik.stories.tsx +39 -2
  23. package/src/components/Formik/{FormikToggle/FormikToggle.test.tsx → FormikSwitch/FormikSwitch.test.tsx} +3 -3
  24. package/src/components/Formik/{FormikToggle/FormikToggle.tsx → FormikSwitch/FormikSwitch.tsx} +4 -4
  25. package/src/components/Formik/FormikToggleGroup/FormikToggleGroup.test.tsx +117 -0
  26. package/src/components/Formik/FormikToggleGroup/FormikToggleGroup.tsx +55 -0
  27. package/src/components/Switch/Switch.mdx +47 -0
  28. package/src/components/Switch/Switch.module.scss +294 -0
  29. package/src/components/Switch/Switch.stories.tsx +128 -0
  30. package/src/components/{Toggle/Toggle.test.tsx → Switch/Switch.test.tsx} +75 -75
  31. package/src/components/Switch/Switch.tsx +185 -0
  32. package/src/components/Toggle/Toggle.mdx +11 -31
  33. package/src/components/Toggle/Toggle.module.scss +32 -280
  34. package/src/components/Toggle/Toggle.stories.tsx +28 -113
  35. package/src/components/Toggle/Toggle.tsx +27 -180
  36. package/src/components/ToggleGroup/ToggleGroup.mdx +39 -0
  37. package/src/components/ToggleGroup/ToggleGroup.module.scss +46 -0
  38. package/src/components/ToggleGroup/ToggleGroup.stories.tsx +103 -0
  39. package/src/components/ToggleGroup/ToggleGroup.tsx +88 -0
  40. package/src/docs/Brands.mdx +31 -1
  41. package/src/docs/DesignTokens.mdx +1 -1
  42. package/src/index.ts +4 -1
@@ -0,0 +1,39 @@
1
+ import { Canvas, Meta, ArgTypes } from '@storybook/blocks';
2
+ import { ToggleGroup } from './ToggleGroup';
3
+ import * as Stories from './ToggleGroup.stories';
4
+
5
+ <Meta of={Stories} />
6
+
7
+ # ToggleGroup
8
+
9
+ A set of two-state buttons that can be toggled on or off.
10
+
11
+ This component is extended from [Radix](https://www.radix-ui.com/primitives/docs/components/toggle-group).
12
+
13
+ [API Reference](https://www.radix-ui.com/primitives/docs/components/toggle-group#api-reference)
14
+
15
+ <Canvas of={Stories.Uncontrolled} />
16
+
17
+ ## Multiple
18
+
19
+ By default, one value is allowed, but you can allow for multiple selections by setting the `type` to `multiple`.
20
+
21
+ <Canvas of={Stories.Multiple} />
22
+
23
+ ## Controlled
24
+
25
+ The `onChange` prop can be used to handle changes to the selected value.
26
+
27
+ <Canvas of={Stories.Controlled} />
28
+
29
+ ## Variants
30
+
31
+ An outlined alternative variant is available.
32
+
33
+ <Canvas of={Stories.Outlined} />
34
+
35
+ ## Disabled
36
+
37
+ The `disabled` prop can be used to disable the ToggleGroup component, preventing user interaction. Individual item may also be disabled.
38
+
39
+ <Canvas of={Stories.Disabled} />
@@ -0,0 +1,46 @@
1
+ @import '@hyphen/hyphen-design-tokens/build/scss/variables';
2
+
3
+ .item {
4
+ display: flex;
5
+ align-items: center;
6
+ gap: var(--size-spacing-sm);
7
+ line-height: 1;
8
+ border-radius: var(--size-border-radius-sm);
9
+ padding: var(--size-spacing-sm);
10
+ color: var(--color-font-secondary);
11
+ font-size: var(--size-font-size-sm);
12
+ background-color: var(--color-background-transparent);
13
+ border-width: 0;
14
+ cursor: pointer;
15
+
16
+ &:hover {
17
+ background-color: var(--color-background-toggle-group-item-hover);
18
+ }
19
+ &[data-state='on'] {
20
+ background-color: var(--color-background-toggle-group-item-active);
21
+ color: var(--color-font-base);
22
+ }
23
+ &:focus-visible {
24
+ position: relative;
25
+ box-shadow: 0 0 0 2px black;
26
+ }
27
+
28
+ &:disabled {
29
+ opacity: 0.5;
30
+ pointer-events: none;
31
+ }
32
+ }
33
+
34
+ .outline {
35
+ border: 1px solid var(--color-border-default);
36
+ box-shadow: var(--size-box-shadow-xs);
37
+
38
+ &:disabled,
39
+ &[data-state='on'] {
40
+ box-shadow: none;
41
+ }
42
+
43
+ &:disabled {
44
+ pointer-events: none;
45
+ }
46
+ }
@@ -0,0 +1,103 @@
1
+ import React from 'react';
2
+ import type { Meta } from '@storybook/react';
3
+
4
+ import { ToggleGroup, ToggleGroupItem } from './ToggleGroup';
5
+ import { Box } from '../Box/Box';
6
+
7
+ const meta: Meta<typeof ToggleGroup> = {
8
+ title: 'Components/ToggleGroup',
9
+ component: ToggleGroup,
10
+ };
11
+
12
+ export default meta;
13
+
14
+ export const Uncontrolled = () => (
15
+ <ToggleGroup type="single" defaultValue="option2">
16
+ <ToggleGroupItem value="option1">99%</ToggleGroupItem>
17
+ <ToggleGroupItem value="option2">99.9%</ToggleGroupItem>
18
+ <ToggleGroupItem value="option3">99.99%</ToggleGroupItem>
19
+ <ToggleGroupItem value="option4">99.999%</ToggleGroupItem>
20
+ </ToggleGroup>
21
+ );
22
+
23
+ export const Multiple = () => (
24
+ <ToggleGroup type="multiple">
25
+ <ToggleGroupItem value="option1">99%</ToggleGroupItem>
26
+ <ToggleGroupItem value="option2">99.9%</ToggleGroupItem>
27
+ <ToggleGroupItem value="option3">99.99%</ToggleGroupItem>
28
+ <ToggleGroupItem value="option4">99.999%</ToggleGroupItem>
29
+ </ToggleGroup>
30
+ );
31
+
32
+ export const Controlled = () => {
33
+ const [value, setValue] = React.useState('option1');
34
+
35
+ const handleValueChange = (newValue: string) => {
36
+ setValue(newValue);
37
+ };
38
+
39
+ return (
40
+ <ToggleGroup type="single" value={value} onValueChange={handleValueChange}>
41
+ <ToggleGroupItem value="option1">99%</ToggleGroupItem>
42
+ <ToggleGroupItem value="option2">99.9%</ToggleGroupItem>
43
+ <ToggleGroupItem value="option3">99.99%</ToggleGroupItem>
44
+ <ToggleGroupItem value="option4">99.999%</ToggleGroupItem>
45
+ </ToggleGroup>
46
+ );
47
+ };
48
+
49
+ export const Outlined = () => (
50
+ <ToggleGroup type="single" variant="outline" defaultValue="option1">
51
+ <ToggleGroupItem value="option1">99%</ToggleGroupItem>
52
+ <ToggleGroupItem value="option2">99.9%</ToggleGroupItem>
53
+ <ToggleGroupItem value="option3">99.99%</ToggleGroupItem>
54
+ <ToggleGroupItem value="option4">99.999%</ToggleGroupItem>
55
+ </ToggleGroup>
56
+ );
57
+
58
+ export const Disabled = () => (
59
+ <ToggleGroup type="single" disabled>
60
+ <ToggleGroupItem value="option1">99%</ToggleGroupItem>
61
+ <ToggleGroupItem value="option2">99.9%</ToggleGroupItem>
62
+ <ToggleGroupItem value="option3">99.99%</ToggleGroupItem>
63
+ <ToggleGroupItem value="option4">99.999%</ToggleGroupItem>
64
+ </ToggleGroup>
65
+ );
66
+
67
+ export const BackgroundTest = () => (
68
+ <>
69
+ <Box background="primary" padding="2xl">
70
+ <ToggleGroup type="single" defaultValue="option2">
71
+ <ToggleGroupItem value="option1">99%</ToggleGroupItem>
72
+ <ToggleGroupItem value="option2">99.9%</ToggleGroupItem>
73
+ <ToggleGroupItem value="option3">99.99%</ToggleGroupItem>
74
+ <ToggleGroupItem value="option4">99.999%</ToggleGroupItem>
75
+ <ToggleGroupItem value="disabled" disabled>
76
+ disabled
77
+ </ToggleGroupItem>
78
+ </ToggleGroup>
79
+ </Box>
80
+ <Box background="secondary" padding="2xl">
81
+ <ToggleGroup type="single" defaultValue="option2">
82
+ <ToggleGroupItem value="option1">99%</ToggleGroupItem>
83
+ <ToggleGroupItem value="option2">99.9%</ToggleGroupItem>
84
+ <ToggleGroupItem value="option3">99.99%</ToggleGroupItem>
85
+ <ToggleGroupItem value="option4">99.999%</ToggleGroupItem>
86
+ <ToggleGroupItem value="disabled" disabled>
87
+ disabled
88
+ </ToggleGroupItem>
89
+ </ToggleGroup>
90
+ </Box>
91
+ <Box background="tertiary" padding="2xl">
92
+ <ToggleGroup type="single" defaultValue="option2">
93
+ <ToggleGroupItem value="option1">99%</ToggleGroupItem>
94
+ <ToggleGroupItem value="option2">99.9%</ToggleGroupItem>
95
+ <ToggleGroupItem value="option3">99.99%</ToggleGroupItem>
96
+ <ToggleGroupItem value="option4">99.999%</ToggleGroupItem>
97
+ <ToggleGroupItem value="disabled" disabled>
98
+ disabled
99
+ </ToggleGroupItem>
100
+ </ToggleGroup>
101
+ </Box>
102
+ </>
103
+ );
@@ -0,0 +1,88 @@
1
+ import React, { createContext, useContext, forwardRef, ReactNode } from 'react';
2
+ import * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group';
3
+ import styles from './ToggleGroup.module.scss';
4
+
5
+ import classNames from 'classnames';
6
+ import { InputValidationMessage } from '../InputValidationMessage/InputValidationMessage';
7
+ import { BaseSpacing, ResponsiveProp } from '../../types';
8
+ import { cssShorthandToClasses } from '../../lib';
9
+
10
+ type ToggleVariant = 'default' | 'outline';
11
+
12
+ const ToggleGroupContext = createContext<{ variant: ToggleVariant }>({
13
+ variant: 'default',
14
+ });
15
+
16
+ type ToggleGroupProps = React.ComponentPropsWithoutRef<
17
+ typeof ToggleGroupPrimitive.Root
18
+ > & {
19
+ variant?: ToggleVariant;
20
+ name?: string;
21
+ gap?: BaseSpacing | ResponsiveProp<BaseSpacing>;
22
+ /**
23
+ * Mark the toggle group as invalid and display a validation message.
24
+ * Pass a string or node to render a validation message below the input.
25
+ */
26
+ error?: ReactNode;
27
+ };
28
+
29
+ const ToggleGroup = forwardRef<
30
+ React.ElementRef<typeof ToggleGroupPrimitive.Root>,
31
+ ToggleGroupProps
32
+ >(
33
+ (
34
+ { className, variant = 'default', children, gap = 'xs', error, ...props },
35
+ ref
36
+ ) => (
37
+ <div>
38
+ <ToggleGroupPrimitive.Root
39
+ ref={ref}
40
+ className={classNames(
41
+ 'display-flex align-items-center justify-content-start',
42
+ className,
43
+ cssShorthandToClasses('g', gap)
44
+ )}
45
+ {...props}
46
+ >
47
+ <ToggleGroupContext.Provider value={{ variant }}>
48
+ {children}
49
+ </ToggleGroupContext.Provider>
50
+ </ToggleGroupPrimitive.Root>
51
+
52
+ {error && <InputValidationMessage>{error}</InputValidationMessage>}
53
+ </div>
54
+ )
55
+ );
56
+
57
+ type ToggleGroupItemProps = React.ComponentPropsWithoutRef<
58
+ typeof ToggleGroupPrimitive.Item
59
+ > & {
60
+ variant?: ToggleVariant;
61
+ };
62
+
63
+ const ToggleGroupItem = forwardRef<
64
+ React.ElementRef<typeof ToggleGroupPrimitive.Item>,
65
+ ToggleGroupItemProps
66
+ >(({ className, children, value, variant, ...props }, ref) => {
67
+ const { variant: contextVariant } = useContext(ToggleGroupContext);
68
+ const appliedVariant = variant || contextVariant;
69
+
70
+ return (
71
+ <ToggleGroupPrimitive.Item
72
+ ref={ref}
73
+ className={classNames(
74
+ styles.item,
75
+ appliedVariant === 'outline' && styles.outline,
76
+ className
77
+ )}
78
+ value={value}
79
+ {...props}
80
+ >
81
+ {children}
82
+ </ToggleGroupPrimitive.Item>
83
+ );
84
+ });
85
+
86
+ ToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName;
87
+
88
+ export { ToggleGroup, ToggleGroupItem };
@@ -10,6 +10,9 @@ import LinkLogoRgbPositive from '@hyphen/hyphen-design-tokens/build/assets/image
10
10
  import LinkLogoRgbNegative from '@hyphen/hyphen-design-tokens/build/assets/images/react/LinkLogoRgbNegative';
11
11
  import ToggleLogoHorizontalRgbPositive from '@hyphen/hyphen-design-tokens/build/assets/images/react/ToggleLogoHorizontalRgbPositive';
12
12
  import ToggleLogoHorizontalRgbNegative from '@hyphen/hyphen-design-tokens/build/assets/images/react/ToggleLogoHorizontalRgbNegative';
13
+ import DeployLogoHorizontalPositive from '@hyphen/hyphen-design-tokens/build/assets/images/react/DeployLogoHorizontalPositive';
14
+ import DeployLogoHorizontalNegative from '@hyphen/hyphen-design-tokens/build/assets/images/react/DeployLogoHorizontalNegative';
15
+
13
16
 
14
17
  import { Box } from '../components/Box/Box';
15
18
 
@@ -150,4 +153,31 @@ import { Box } from '../components/Box/Box';
150
153
  </Box>
151
154
  </Box>
152
155
 
153
- {/* <img src={ToggleLogo} /> */}
156
+
157
+
158
+ ## Deploy
159
+
160
+ <Box direction="row">
161
+ <Box
162
+ background="secondary"
163
+ padding="4xl"
164
+ width="50"
165
+ height="7xl"
166
+ alignItems="center"
167
+ justifyContent="center"
168
+ gap="xl"
169
+ >
170
+ <DeployLogoHorizontalPositive width="160px" />
171
+ </Box>
172
+ <Box
173
+ background="dark-purple"
174
+ padding="4xl"
175
+ width="50"
176
+ height="7xl"
177
+ alignItems="center"
178
+ justifyContent="center"
179
+ gap="xl"
180
+ >
181
+ <DeployLogoHorizontalNegative width="160px" />
182
+ </Box>
183
+ </Box>
@@ -154,7 +154,7 @@ Dimension tokens are intended for use with `width` and `height` properties. They
154
154
  <td>
155
155
  {name === 'base'
156
156
  ? '16'
157
- : ['inherit', 'auto'].includes(name)
157
+ : ['inherit', 'auto', 'fit', 'min', 'max'].includes(name)
158
158
  ? ''
159
159
  : entry.original.value * 16}
160
160
  </td>
package/src/index.ts CHANGED
@@ -24,7 +24,8 @@ export * from './components/Formik/FormikTextInput/FormikTextInput';
24
24
  export * from './components/Formik/FormikTextareaInput/FormikTextareaInput';
25
25
  export * from './components/Formik/FormikTimePicker/FormikTimePicker';
26
26
  export * from './components/Formik/FormikTimePickerNative/FormikTimePickerNative';
27
- export * from './components/Formik/FormikToggle/FormikToggle';
27
+ export * from './components/Formik/FormikSwitch/FormikSwitch';
28
+ export * from './components/Formik/FormikToggleGroup/FormikToggleGroup';
28
29
  export * from './components/FormLabel/FormLabel';
29
30
  export * from './components/Heading/Heading';
30
31
  export * from './components/Icon/Icon';
@@ -39,6 +40,7 @@ export * from './components/SelectInputInset/SelectInputInset';
39
40
  export * from './components/SelectInputNative/SelectInputNative';
40
41
  export * from './components/Sidebar/Sidebar';
41
42
  export * from './components/Spinner/Spinner';
43
+ export * from './components/Switch/Switch';
42
44
  export * from './components/Table/Table';
43
45
  export * from './components/TextareaInput/TextareaInput';
44
46
  export * from './components/TextareaInputInset/TextareaInputInset';
@@ -49,5 +51,6 @@ export * from './components/TimePicker/TimePicker';
49
51
  export * from './components/TimePickerNative/TimePickerNative';
50
52
  export * from './components/Toast';
51
53
  export * from './components/Toggle/Toggle';
54
+ export * from './components/ToggleGroup/ToggleGroup';
52
55
  export * from './components/Tooltip/Tooltip';
53
56
  export * from './hooks';