paris 0.2.2 → 0.4.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 (72) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/README.md +61 -5
  3. package/package.json +27 -15
  4. package/src/helpers/renderEnhancer.tsx +21 -0
  5. package/src/pages/_app.tsx +1 -1
  6. package/src/pages/index.tsx +1 -1
  7. package/src/stories/Pagination.mdx +73 -0
  8. package/src/stories/Tokens.mdx +0 -8
  9. package/src/stories/button/Button.module.scss +23 -7
  10. package/src/stories/button/Button.stories.ts +17 -0
  11. package/src/stories/button/Button.tsx +80 -20
  12. package/src/stories/card/Card.module.scss +14 -0
  13. package/src/stories/card/Card.stories.ts +33 -0
  14. package/src/stories/card/Card.tsx +60 -0
  15. package/src/stories/card/index.ts +1 -0
  16. package/src/stories/checkbox/Checkbox.module.scss +57 -0
  17. package/src/stories/checkbox/Checkbox.stories.ts +27 -0
  18. package/src/stories/checkbox/Checkbox.tsx +58 -0
  19. package/src/stories/checkbox/index.ts +1 -0
  20. package/src/stories/combobox/Combobox.module.scss +5 -0
  21. package/src/stories/combobox/Combobox.stories.ts +84 -0
  22. package/src/stories/combobox/Combobox.tsx +264 -0
  23. package/src/stories/combobox/index.ts +1 -0
  24. package/src/stories/dialog/Dialog.module.scss +187 -0
  25. package/src/stories/dialog/Dialog.stories.tsx +70 -0
  26. package/src/stories/dialog/Dialog.tsx +279 -0
  27. package/src/stories/dialog/index.ts +1 -0
  28. package/src/stories/drawer/Drawer.module.scss +284 -0
  29. package/src/stories/drawer/Drawer.stories.tsx +94 -0
  30. package/src/stories/drawer/Drawer.tsx +339 -0
  31. package/src/stories/drawer/index.ts +1 -0
  32. package/src/stories/dropdown/Dropdown.module.scss +23 -0
  33. package/src/stories/field/Field.module.scss +5 -0
  34. package/src/stories/field/Field.stories.ts +32 -0
  35. package/src/stories/field/Field.tsx +106 -0
  36. package/src/stories/field/index.ts +1 -0
  37. package/src/stories/icon/ChevronLeft.tsx +11 -0
  38. package/src/stories/icon/ChevronRight.tsx +11 -0
  39. package/src/stories/icon/Close.tsx +11 -0
  40. package/src/stories/icon/Icon.module.scss +5 -0
  41. package/src/stories/icon/Icon.stories.ts +28 -0
  42. package/src/stories/icon/Icon.tsx +46 -0
  43. package/src/stories/icon/index.ts +4 -0
  44. package/src/stories/input/Input.module.scss +135 -0
  45. package/src/stories/input/Input.stories.ts +89 -0
  46. package/src/stories/input/Input.tsx +137 -0
  47. package/src/stories/input/index.ts +1 -0
  48. package/src/stories/pagination/index.ts +1 -0
  49. package/src/stories/pagination/usePagination.ts +106 -0
  50. package/src/stories/select/Select.module.scss +74 -0
  51. package/src/stories/select/Select.stories.ts +73 -0
  52. package/src/stories/select/Select.tsx +176 -0
  53. package/src/stories/select/index.ts +1 -0
  54. package/src/stories/text/Text.module.scss +1 -1
  55. package/src/stories/text/Text.tsx +36 -14
  56. package/src/stories/textarea/TextArea.stories.ts +19 -0
  57. package/src/stories/textarea/TextArea.tsx +120 -0
  58. package/src/stories/textarea/index.ts +1 -0
  59. package/src/stories/theme/global.scss +2 -0
  60. package/src/stories/theme/index.ts +1 -0
  61. package/src/stories/theme/themes.ts +126 -7
  62. package/src/{styles → stories/theme}/tw-preflight.css +3 -1
  63. package/src/stories/theme/util.scss +8 -0
  64. package/src/stories/tilt/Tilt.module.scss +1 -0
  65. package/src/stories/tilt/Tilt.stories.tsx +43 -0
  66. package/src/stories/tilt/Tilt.tsx +63 -0
  67. package/src/stories/tilt/index.ts +1 -0
  68. package/src/stories/utility/RemoveFromDOM.tsx +19 -0
  69. package/src/stories/utility/TextWhenString.tsx +28 -0
  70. package/src/stories/utility/VisuallyHidden.tsx +25 -0
  71. package/src/types/Enhancer.ts +3 -0
  72. package/src/styles/util.scss +0 -4
@@ -0,0 +1,135 @@
1
+ .inputContainer {
2
+ display: flex;
3
+ flex-direction: row;
4
+ align-items: center;
5
+ gap: 12px;
6
+ min-height: 36px;
7
+
8
+ background-color: var(--pte-colors-backgroundSecondary);
9
+
10
+ //height: 36px;
11
+ width: 100%;
12
+ padding: calc(7.5px - var(--pte-typography-verticalMetricsAdjust)) 15px 7.5px;
13
+
14
+ font-size: var(--pte-typography-styles-paragraphSmall-fontSize);
15
+ font-style: var(--pte-typography-styles-paragraphSmall-fontStyle);
16
+ font-weight: var(--pte-typography-styles-paragraphSmall-fontWeight);
17
+ letter-spacing: var(--pte-typography-styles-paragraphSmall-letterSpacing);
18
+ line-height: var(--pte-typography-styles-paragraphSmall-lineHeight);
19
+ text-transform: var(--pte-typography-styles-paragraphSmall-textTransform);
20
+
21
+ border-width: 1px;
22
+ border-style: solid;
23
+ border-color: var(--pte-colors-backgroundSecondary);
24
+ border-radius: var(--pte-borders-radius-rectangle);
25
+
26
+ transition: var(--pte-animations-interaction);
27
+
28
+ &:focus-within {
29
+ outline: none;
30
+ border-color: var(--pte-colors-borderSelected);
31
+ background-color: var(--pte-colors-backgroundTertiary);
32
+ }
33
+
34
+ &[data-status="disabled"] {
35
+ border-color: var(--pte-colors-backgroundTertiary);
36
+ background-color: var(--pte-colors-backgroundTertiary);
37
+ color: var(--pte-colors-contentDisabled);
38
+ pointer-events: none;
39
+ cursor: default;
40
+
41
+ &:focus-within {
42
+ border-color: var(--pte-colors-backgroundTertiary) !important;
43
+ }
44
+ }
45
+
46
+ &[data-status="error"] {
47
+ border-color: var(--pte-colors-borderNegative);
48
+ background-color: var(--pte-colors-backgroundNegative);
49
+ color: var(--pte-colors-contentNegative);
50
+
51
+ &:focus-within {
52
+ color: var(--pte-colors-contentPrimary);
53
+ }
54
+ }
55
+
56
+ &[data-status="success"] {
57
+ border-color: var(--pte-colors-borderPositive);
58
+ background-color: var(--pte-colors-backgroundPositive);
59
+ color: var(--pte-colors-contentPositive);
60
+
61
+ &:focus-within {
62
+ color: var(--pte-colors-contentPrimary);
63
+ }
64
+ }
65
+
66
+ & input, & textarea {
67
+ width: 100%;
68
+ background-color: transparent;
69
+ padding: 0;
70
+ margin: 0;
71
+ border: none;
72
+ outline: none;
73
+
74
+ &::placeholder {
75
+ color: var(--pte-colors-contentTertiary);
76
+ }
77
+
78
+ &[aria-disabled=true] {
79
+ color: var(--pte-colors-contentDisabled);
80
+ cursor: default;
81
+
82
+ &::placeholder {
83
+ color: var(--pte-colors-contentDisabled);
84
+ }
85
+ }
86
+
87
+ &[type="color"]::-webkit-color-swatch {
88
+ border: 1px solid var(--pte-colors-borderSelected);
89
+ border-radius: var(--pte-borders-radius-circle);
90
+ }
91
+
92
+ &[type="color"]::-webkit-color-swatch-wrapper {
93
+ width: 16px;
94
+ height: 100%;
95
+ }
96
+
97
+ &[type="file"]::-webkit-file-upload-button {
98
+ display: none;
99
+ }
100
+ }
101
+ }
102
+
103
+ .enhancer {
104
+ color: var(--pte-colors-contentSecondary);
105
+ margin-block-start: -0.5px;
106
+ font-size: var(--pte-typography-styles-paragraphSmall-fontSize);
107
+ font-style: var(--pte-typography-styles-paragraphSmall-fontStyle);
108
+ font-weight: var(--pte-typography-styles-paragraphSmall-fontWeight);
109
+ letter-spacing: var(--pte-typography-styles-paragraphSmall-letterSpacing);
110
+ line-height: var(--pte-typography-styles-paragraphSmall-lineHeight);
111
+ text-transform: var(--pte-typography-styles-paragraphSmall-textTransform);
112
+ }
113
+
114
+ .container {
115
+ user-select: var(--pte-utils-defaultUserSelect);
116
+ cursor: default;
117
+ display: flex;
118
+ flex-direction: column;
119
+ gap: 8px;
120
+ }
121
+
122
+ // Use double selector to ensure specificity is higher than the default styles
123
+ .label.label {
124
+ color: var(--pte-colors-contentPrimary);
125
+ font-weight: var(--pte-typography-boldFontWeight);
126
+ }
127
+
128
+ // Use double selector to ensure specificity is higher than the default styles
129
+ .description.description {
130
+ color: var(--pte-colors-contentTertiary);
131
+ }
132
+
133
+ .hidden {
134
+ display: none;
135
+ }
@@ -0,0 +1,89 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { createElement } from 'react';
3
+ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
4
+ import { faSearch } from '@fortawesome/free-solid-svg-icons';
5
+ import { Input } from './Input';
6
+
7
+ const meta: Meta<typeof Input> = {
8
+ title: 'Inputs/Input',
9
+ component: Input,
10
+ tags: ['autodocs'],
11
+ };
12
+
13
+ export default meta;
14
+ type Story = StoryObj<typeof Input>;
15
+
16
+ export const Default: Story = {
17
+ args: {
18
+ placeholder: 'Billie Eilish',
19
+ label: 'Name',
20
+ description: 'Type your full name here.',
21
+ },
22
+ };
23
+
24
+ export const Password: Story = {
25
+ args: {
26
+ type: 'password',
27
+ placeholder: 'Password',
28
+ label: 'Password',
29
+ hideLabel: true,
30
+ },
31
+ };
32
+
33
+ export const Success: Story = {
34
+ args: {
35
+ placeholder: 'billie@eilish.com',
36
+ value: 'valid@email.com',
37
+ onChange: () => {},
38
+ type: 'email',
39
+ label: 'Email',
40
+ description: 'Enter your email address.',
41
+ status: 'success',
42
+ },
43
+ };
44
+
45
+ export const Error: Story = {
46
+ args: {
47
+ placeholder: 'billie@eilish.com',
48
+ value: 'notavalid@email',
49
+ onChange: () => {},
50
+ type: 'email',
51
+ label: 'Email',
52
+ description: 'Enter your email address.',
53
+ status: 'error',
54
+ },
55
+ };
56
+
57
+ export const Disabled: Story = {
58
+ args: {
59
+ placeholder: 'billie@eilish.com',
60
+ type: 'email',
61
+ label: 'Email',
62
+ description: 'Enter your email address.',
63
+ disabled: true,
64
+ },
65
+ };
66
+
67
+ export const WithEnhancer: Story = {
68
+ args: {
69
+ placeholder: 'Billie Eilish',
70
+ label: 'Name',
71
+ description: 'Type your full name here.',
72
+ startEnhancer: ({ size }) => createElement(FontAwesomeIcon, {
73
+ icon: faSearch,
74
+ width: `${size}px`,
75
+ }),
76
+ },
77
+ };
78
+
79
+ export const WithEndEnhancer: Story = {
80
+ args: {
81
+ placeholder: 'Billie Eilish',
82
+ label: 'Name',
83
+ description: 'Type your full name here.',
84
+ endEnhancer: ({ size }) => createElement(FontAwesomeIcon, {
85
+ icon: faSearch,
86
+ width: `${size}px`,
87
+ }),
88
+ },
89
+ };
@@ -0,0 +1,137 @@
1
+ 'use client';
2
+
3
+ import { useId } from 'react';
4
+ import type { FC, ComponentPropsWithoutRef } from 'react';
5
+ import clsx from 'clsx';
6
+ import styles from './Input.module.scss';
7
+ import type { TextProps } from '../text';
8
+ import { Text } from '../text';
9
+ import type { Enhancer } from '../../types/Enhancer';
10
+ import { pget, theme } from '../theme';
11
+ import { MemoizedEnhancer } from '../../helpers/renderEnhancer';
12
+ import type { FieldProps } from '../field';
13
+ import { Field } from '../field';
14
+
15
+ export type InputProps = {
16
+ /**
17
+ * A label for the input field. This is required for accessibility, but can be visually hidden using the `hideLabel` prop.
18
+ */
19
+ label: string;
20
+ /**
21
+ * The status of the input field.
22
+ * @default default
23
+ */
24
+ status?: 'default' | 'error' | 'success';
25
+ /**
26
+ * The input type. All HTML5 input types are supported, but some may require additional props to be set for full accessibility or aesthetic.
27
+ * @default text
28
+ */
29
+ type?: 'button' | 'checkbox' | 'color' | 'date' | 'datetime-local' | 'email' | 'file' | 'hidden' | 'image' | 'month' | 'number' | 'password' | 'radio' | 'range' | 'reset' | 'search' | 'submit' | 'tel' | 'text' | 'time' | 'url' | 'week';
30
+ /**
31
+ * The placeholder for the input.
32
+ */
33
+ placeholder?: string;
34
+ /**
35
+ * An icon or other element to render before the Input element. A `{ size }` argument is passed that should be used to determine the width & height of the content displayed.
36
+ */
37
+ startEnhancer?: Enhancer;
38
+ /**
39
+ * An icon or other element to render after the Input element. A `{ size }` argument is passed that should be used to determine the width & height of the content displayed.
40
+ */
41
+ endEnhancer?: Enhancer;
42
+ /**
43
+ * Prop overrides for other rendered elements. Overrides for the input itself should be passed directly to the component.
44
+ */
45
+ overrides?: {
46
+ container?: ComponentPropsWithoutRef<'div'>;
47
+ label?: TextProps<'label'>;
48
+ description?: TextProps<'p'>;
49
+ startEnhancerContainer?: ComponentPropsWithoutRef<'div'>;
50
+ endEnhancerContainer?: ComponentPropsWithoutRef<'div'>;
51
+ }
52
+ } & FieldProps;
53
+
54
+ /**
55
+ * An `Input` is used to collect user input, such as text, numbers, or dates.
56
+ *
57
+ * > `overrides` available: `container`, `label`, `description`, `startEnhancerContainer`, `endEnhancerContainer`
58
+ *
59
+ * <hr />
60
+ *
61
+ * To use the `Input` component, import it as follows:
62
+ *
63
+ * ```js
64
+ * import { Input } from 'paris/input';
65
+ * ```
66
+ * @constructor
67
+ */
68
+ export const Input: FC<InputProps & ComponentPropsWithoutRef<'input'>> = ({
69
+ label,
70
+ status,
71
+ type,
72
+ hideLabel,
73
+ description,
74
+ hideDescription,
75
+ startEnhancer,
76
+ endEnhancer,
77
+ disabled,
78
+ overrides,
79
+ ...props
80
+ }) => {
81
+ const inputID = useId();
82
+ return (
83
+ <Field
84
+ htmlFor={inputID}
85
+ label={label}
86
+ hideLabel={hideLabel}
87
+ description={description}
88
+ hideDescription={hideDescription}
89
+ disabled={disabled}
90
+ overrides={{
91
+ container: overrides?.container,
92
+ label: overrides?.label,
93
+ description: overrides?.description,
94
+ }}
95
+ >
96
+ <div
97
+ className={styles.inputContainer}
98
+ data-status={status}
99
+ data-disabled={disabled}
100
+ >
101
+ {!!startEnhancer && (
102
+ <div {...overrides?.startEnhancerContainer} className={clsx(styles.enhancer, overrides?.startEnhancerContainer?.className)}>
103
+ {!!startEnhancer && (
104
+ <MemoizedEnhancer
105
+ enhancer={startEnhancer}
106
+ size={parseInt(pget('typography.styles.paragraphSmall.fontSize') || theme.typography.styles.paragraphSmall.fontSize, 10)}
107
+ />
108
+ )}
109
+ </div>
110
+ )}
111
+ <input
112
+ {...props}
113
+ id={inputID}
114
+ type={type || 'text'}
115
+ aria-label={label}
116
+ aria-describedby={`${inputID}-description`}
117
+ aria-disabled={disabled}
118
+ readOnly={disabled}
119
+ className={clsx(
120
+ props.className,
121
+ styles.input,
122
+ )}
123
+ />
124
+ {!!endEnhancer && (
125
+ <div {...overrides?.endEnhancerContainer} className={clsx(styles.enhancer, overrides?.endEnhancerContainer?.className)}>
126
+ {!!endEnhancer && (
127
+ <MemoizedEnhancer
128
+ enhancer={endEnhancer}
129
+ size={parseInt(pget('typography.styles.paragraphSmall.fontSize') || theme.typography.styles.paragraphSmall.fontSize, 10)}
130
+ />
131
+ )}
132
+ </div>
133
+ )}
134
+ </div>
135
+ </Field>
136
+ );
137
+ };
@@ -0,0 +1 @@
1
+ export * from './Input';
@@ -0,0 +1 @@
1
+ export * from './usePagination';
@@ -0,0 +1,106 @@
1
+ import { useState } from 'react';
2
+
3
+ export type PaginationState<T extends string[] | readonly string[] = string[]> = {
4
+ /**
5
+ * The current page key.
6
+ */
7
+ currentPage: T[number],
8
+
9
+ /**
10
+ * Open a page and add it to the history.
11
+ * @param page - The page's unique key.
12
+ */
13
+ open: (page: T[number]) => void,
14
+
15
+ /**
16
+ * Check if the current page can go back.
17
+ */
18
+ canGoBack: () => boolean,
19
+
20
+ /**
21
+ * Go back to the previous page.
22
+ *
23
+ * If the current page is the first page, nothing happens.
24
+ */
25
+ back: () => void,
26
+
27
+ /**
28
+ * Check if the current page can go forward.
29
+ */
30
+ canGoForward: () => boolean,
31
+
32
+ /**
33
+ * Go forward to the next page.
34
+ *
35
+ * If there is no next page, nothing happens.
36
+ */
37
+ forward: () => void,
38
+
39
+ /**
40
+ * The page history.
41
+ */
42
+ history: T[number][],
43
+ };
44
+
45
+ /**
46
+ * A hook to create a page history and navigate between pages.
47
+ *
48
+ * In TypeScript, you can pass in a string array to the generic type to explicitly define the page keys, which will add type safety and auto-completion for each method.
49
+ *
50
+ * @param initialPage - The initial page key.
51
+ */
52
+ export const usePagination = <T extends string[] | readonly string[] = string[]>(
53
+ initialPage: T[number],
54
+ ): PaginationState<T> => {
55
+ // The current page.
56
+ const [currentPage, setCurrentPage] = useState<T[number]>(initialPage);
57
+
58
+ // The page history.
59
+ const [history, setHistory] = useState<T[number][]>([initialPage]);
60
+
61
+ const open = (page: T[number]): void => {
62
+ // Do nothing if the page is already open.
63
+ if (page === currentPage) {
64
+ return;
65
+ }
66
+
67
+ // Open the page and add it to the history, removing all pages after it.
68
+ const index = history.indexOf(currentPage);
69
+ setCurrentPage(page);
70
+ setHistory((hist) => hist.slice(0, index + 1).concat(page));
71
+ };
72
+
73
+ const canGoBack = (): boolean => {
74
+ const index = history.indexOf(currentPage);
75
+ return index > 0;
76
+ };
77
+
78
+ const back = (): void => {
79
+ if (canGoBack()) {
80
+ const index = history.indexOf(currentPage);
81
+ setCurrentPage(history[index - 1]);
82
+ }
83
+ };
84
+
85
+ const canGoForward = (): boolean => {
86
+ const index = history.indexOf(currentPage);
87
+ return index < history.length - 1;
88
+ };
89
+
90
+ const forward = (): void => {
91
+ if (canGoForward()) {
92
+ const index = history.indexOf(currentPage);
93
+ setCurrentPage(history[index + 1]);
94
+ }
95
+ };
96
+
97
+ return {
98
+ currentPage,
99
+ open,
100
+ canGoBack,
101
+ back,
102
+ canGoForward,
103
+ forward,
104
+ history,
105
+ } as PaginationState<T>;
106
+ };
@@ -0,0 +1,74 @@
1
+ .container {
2
+ position: relative;
3
+ user-select: var(--pte-utils-defaultUserSelect);
4
+
5
+ & > * {
6
+ cursor: default;
7
+ }
8
+ }
9
+
10
+ .field {
11
+ display: flex;
12
+ flex-direction: row;
13
+ justify-content: space-between;
14
+ align-items: center;
15
+ }
16
+
17
+ .options {
18
+ position: absolute;
19
+ top: 100%;
20
+ left: 0;
21
+ right: 0;
22
+ z-index: 10;
23
+
24
+ display: flex;
25
+ flex-direction: column;
26
+
27
+ background-color: var(--pte-colors-backgroundPrimary);
28
+
29
+ border-width: 1px;
30
+ border-style: solid;
31
+ border-radius: var(--pte-borders-radius-rectangle);
32
+ border-color: var(--pte-borders-dropdown-color);
33
+ box-shadow: var(--pte-borders-dropdown-shadow);
34
+
35
+ transition: var(--pte-animations-interaction);
36
+
37
+ &:focus-within {
38
+ outline: none;
39
+ }
40
+ }
41
+
42
+ .option {
43
+ display: flex;
44
+ flex-direction: row;
45
+ justify-content: flex-start;
46
+ align-items: center;
47
+ gap: 8px;
48
+
49
+ padding: 8px 16px;
50
+ margin: -1px;
51
+
52
+ border: 1px solid var(--pte-borders-dropdown-color);
53
+ //border-right: 1px solid var(--pte-borders-dropdown-color);
54
+
55
+ transition: var(--pte-animations-interaction);
56
+
57
+ &:hover, &[data-headlessui-state="active"] {
58
+ background-color: var(--pte-colors-backgroundSecondary);
59
+ }
60
+
61
+ &[data-selected=true] {
62
+ background-color: var(--pte-colors-backgroundTertiary);
63
+ }
64
+
65
+ &[data-disabled=true] {
66
+ color: var(--pte-colors-contentDisabled);
67
+ pointer-events: none;
68
+ cursor: default;
69
+ }
70
+ }
71
+
72
+ .content {
73
+ width: 100%;
74
+ }
@@ -0,0 +1,73 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { createElement, useState } from 'react';
3
+ import { Select } from './Select';
4
+ import { Text } from '../text';
5
+
6
+ const meta: Meta<typeof Select> = {
7
+ title: 'Inputs/Select',
8
+ component: Select,
9
+ tags: ['autodocs'],
10
+ };
11
+
12
+ export default meta;
13
+ type Story = StoryObj<typeof Select>;
14
+
15
+ const render: Story['render'] = (args) => {
16
+ // eslint-disable-next-line react-hooks/rules-of-hooks
17
+ const [selected, setSelected] = useState<string | null>(null);
18
+ return createElement('div', {
19
+ style: { minHeight: '200px' },
20
+ }, createElement(Select, {
21
+ ...args,
22
+ value: selected,
23
+ onChange: (e) => setSelected(e),
24
+ }));
25
+ };
26
+
27
+ export const Default: Story = {
28
+ args: {
29
+ label: 'Release type',
30
+ description: 'Select the type of release you want to create.',
31
+ options: [
32
+ { id: '1', node: 'Single' },
33
+ { id: '2', node: 'EP' },
34
+ { id: '3', node: 'Album (LP)' },
35
+ ],
36
+ },
37
+ render,
38
+ };
39
+
40
+ export const WithCustomNodes: Story = {
41
+ args: {
42
+ options: [
43
+ {
44
+ id: '1',
45
+ // eslint-disable-next-line react/no-children-prop
46
+ node: createElement(Text, {
47
+ as: 'span',
48
+ kind: 'displaySmall',
49
+ children: 'Option 1',
50
+ }),
51
+ },
52
+ {
53
+ id: '2',
54
+ // eslint-disable-next-line react/no-children-prop
55
+ node: createElement(Text, {
56
+ as: 'span',
57
+ kind: 'paragraphXXSmall',
58
+ children: 'Option 2',
59
+ }),
60
+ },
61
+ {
62
+ id: '3',
63
+ // eslint-disable-next-line react/no-children-prop
64
+ node: createElement(Text, {
65
+ as: 'span',
66
+ kind: 'labelXLarge',
67
+ children: 'Option 3',
68
+ }),
69
+ },
70
+ ],
71
+ },
72
+ render,
73
+ };