@recursica/mui-adapter 0.2.0 → 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 (88) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/mui-adapter.cjs +1 -1
  3. package/dist/mui-adapter.cjs.map +1 -1
  4. package/dist/mui-adapter.css +1 -1
  5. package/dist/mui-adapter.js +286 -91
  6. package/dist/mui-adapter.js.map +1 -1
  7. package/dist/src/components/Box/Box.d.ts +2 -3
  8. package/dist/src/components/Button/Button.d.ts +40 -2
  9. package/dist/src/components/Container/Container.d.ts +8 -2
  10. package/dist/src/components/Flex/Flex.d.ts +25 -2
  11. package/dist/src/components/Group/Group.d.ts +10 -2
  12. package/dist/src/components/Link/Link.d.ts +13 -2
  13. package/dist/src/components/Loader/Loader.d.ts +9 -2
  14. package/dist/src/components/Stack/Stack.d.ts +8 -2
  15. package/dist/src/components/Text/Text.d.ts +18 -2
  16. package/dist/src/components/Title/Title.d.ts +17 -2
  17. package/dist/src/components/Typography/Typography.d.ts +27 -0
  18. package/dist/src/utils/filterStylingProps.d.ts +3 -0
  19. package/package.json +2 -1
  20. package/src/Introduction.stories.tsx +113 -110
  21. package/src/OverStyling.tsx +18 -23
  22. package/src/Version.tsx +14 -21
  23. package/src/components/Accordion/Accordion.stories.tsx +19 -0
  24. package/src/components/AssistiveElement/AssistiveElement.stories.tsx +19 -0
  25. package/src/components/Avatar/Avatar.stories.tsx +19 -0
  26. package/src/components/Badge/Badge.stories.tsx +19 -0
  27. package/src/components/Box/Box.stories.tsx +19 -10
  28. package/src/components/Box/Box.tsx +11 -14
  29. package/src/components/Box/IMPLEMENTATION_NOTES.md +5 -0
  30. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +19 -0
  31. package/src/components/Button/BUTTON_IMPLEMENTATION_NOTES.md +33 -0
  32. package/src/components/Button/Button.module.css +343 -0
  33. package/src/components/Button/Button.stories.tsx +181 -5
  34. package/src/components/Button/Button.tsx +141 -5
  35. package/src/components/Card/Card.stories.tsx +19 -0
  36. package/src/components/Checkbox/Checkbox.stories.tsx +19 -0
  37. package/src/components/Chip/Chip.stories.tsx +19 -0
  38. package/src/components/Container/Container.stories.tsx +19 -0
  39. package/src/components/Container/Container.tsx +56 -5
  40. package/src/components/Container/IMPLEMENTATION_NOTES.md +5 -0
  41. package/src/components/DatePicker/DatePicker.stories.tsx +19 -0
  42. package/src/components/Dropdown/Dropdown.stories.tsx +19 -0
  43. package/src/components/FileInput/FileInput.stories.tsx +19 -0
  44. package/src/components/FileUpload/FileUpload.stories.tsx +19 -0
  45. package/src/components/Flex/Flex.stories.tsx +19 -0
  46. package/src/components/Flex/Flex.tsx +77 -5
  47. package/src/components/FormControlLayout/FormControlLayout.stories.tsx +19 -0
  48. package/src/components/FormControlWrapper/FormControlWrapper.stories.tsx +19 -0
  49. package/src/components/Group/Group.stories.tsx +133 -5
  50. package/src/components/Group/Group.tsx +57 -5
  51. package/src/components/HoverCard/HoverCard.stories.tsx +19 -0
  52. package/src/components/Label/Label.stories.tsx +19 -0
  53. package/src/components/Link/Link.module.css +133 -0
  54. package/src/components/Link/Link.stories.tsx +52 -4
  55. package/src/components/Link/Link.tsx +47 -5
  56. package/src/components/Loader/LOADER_IMPLEMENTATION_NOTES.md +25 -0
  57. package/src/components/Loader/Loader.module.css +166 -0
  58. package/src/components/Loader/Loader.stories.tsx +93 -6
  59. package/src/components/Loader/Loader.tsx +69 -5
  60. package/src/components/Menu/Menu.stories.tsx +19 -0
  61. package/src/components/Modal/Modal.stories.tsx +19 -0
  62. package/src/components/NumberInput/NumberInput.stories.tsx +19 -0
  63. package/src/components/Pagination/Pagination.stories.tsx +19 -0
  64. package/src/components/Panel/Panel.stories.tsx +19 -0
  65. package/src/components/Radio/Radio.stories.tsx +19 -0
  66. package/src/components/ReadOnlyField/ReadOnlyField.stories.tsx +19 -0
  67. package/src/components/SegmentedControl/SegmentedControl.stories.tsx +19 -0
  68. package/src/components/Slider/Slider.stories.tsx +19 -0
  69. package/src/components/Stack/Stack.stories.tsx +118 -5
  70. package/src/components/Stack/Stack.tsx +37 -5
  71. package/src/components/Stepper/Stepper.stories.tsx +19 -0
  72. package/src/components/Switch/Switch.stories.tsx +19 -0
  73. package/src/components/Table/Table.stories.tsx +19 -0
  74. package/src/components/Tabs/Tabs.stories.tsx +19 -0
  75. package/src/components/Text/Text.stories.tsx +87 -3
  76. package/src/components/Text/Text.tsx +27 -4
  77. package/src/components/TextArea/TextArea.stories.tsx +19 -0
  78. package/src/components/TextField/TextField.stories.tsx +19 -0
  79. package/src/components/TimePicker/TimePicker.stories.tsx +19 -0
  80. package/src/components/Timeline/Timeline.stories.tsx +19 -0
  81. package/src/components/Title/Title.stories.tsx +68 -3
  82. package/src/components/Title/Title.tsx +29 -5
  83. package/src/components/Toast/Toast.stories.tsx +19 -0
  84. package/src/components/Tooltip/Tooltip.stories.tsx +19 -0
  85. package/src/components/TransferList/TransferList.stories.tsx +19 -0
  86. package/src/components/Typography/Typography.tsx +42 -0
  87. package/src/utils/ColorSchemeWrapper.tsx +1 -5
  88. package/src/utils/filterStylingProps.ts +13 -1
@@ -0,0 +1,166 @@
1
+ .root {
2
+ /* Default inheritance mapped from component variables if not explicitly overridden by variants */
3
+ --loader-color: var(
4
+ --recursica_ui-kit_components_loader_properties_indicator-color,
5
+ currentColor
6
+ );
7
+ box-sizing: border-box;
8
+ }
9
+ .root * {
10
+ box-sizing: border-box;
11
+ }
12
+
13
+ /* data-size mapping */
14
+
15
+ /* SMALL */
16
+ .root[data-size="small"] {
17
+ --loader-size: var(
18
+ --recursica_ui-kit_components_loader_variants_sizes_small_properties_size
19
+ );
20
+ }
21
+ .root[data-size="small"][data-variant="oval"] {
22
+ --loader-thickness: var(
23
+ --recursica_ui-kit_components_loader_variants_sizes_small_properties_thickness
24
+ );
25
+ }
26
+ .root[data-size="small"]:not([data-variant="oval"]) span {
27
+ border-radius: var(
28
+ --recursica_ui-kit_components_loader_variants_sizes_small_properties_border-radius
29
+ );
30
+ }
31
+
32
+ /* DEFAULT */
33
+ .root[data-size="default"] {
34
+ --loader-size: var(
35
+ --recursica_ui-kit_components_loader_variants_sizes_default_properties_size
36
+ );
37
+ }
38
+ .root[data-size="default"][data-variant="oval"] {
39
+ --loader-thickness: var(
40
+ --recursica_ui-kit_components_loader_variants_sizes_default_properties_thickness
41
+ );
42
+ }
43
+ .root[data-size="default"]:not([data-variant="oval"]) span {
44
+ border-radius: var(
45
+ --recursica_ui-kit_components_loader_variants_sizes_default_properties_border-radius
46
+ );
47
+ }
48
+
49
+ /* LARGE */
50
+ .root[data-size="large"] {
51
+ --loader-size: var(
52
+ --recursica_ui-kit_components_loader_variants_sizes_large_properties_size
53
+ );
54
+ }
55
+ .root[data-size="large"][data-variant="oval"] {
56
+ --loader-thickness: var(
57
+ --recursica_ui-kit_components_loader_variants_sizes_large_properties_thickness
58
+ );
59
+ }
60
+ .root[data-size="large"]:not([data-variant="oval"]) span {
61
+ border-radius: var(
62
+ --recursica_ui-kit_components_loader_variants_sizes_large_properties_border-radius
63
+ );
64
+ }
65
+
66
+ /* ----- Oval loader ----- */
67
+ @keyframes oval-spin {
68
+ 0% {
69
+ transform: rotate(0deg);
70
+ }
71
+ 100% {
72
+ transform: rotate(360deg);
73
+ }
74
+ }
75
+
76
+ .root[data-variant="oval"] {
77
+ display: inline-block;
78
+ width: var(--loader-size);
79
+ height: var(--loader-size);
80
+ }
81
+ .root[data-variant="oval"]::after {
82
+ content: "";
83
+ display: block;
84
+ width: var(--loader-size);
85
+ height: var(--loader-size);
86
+ border-radius: 10000px;
87
+ border-width: var(--loader-thickness);
88
+ border-style: solid;
89
+ border-color: var(--loader-color) var(--loader-color) var(--loader-color)
90
+ transparent;
91
+ animation: oval-spin 1.2s linear infinite;
92
+ }
93
+
94
+ /* ----- Bars loader ----- */
95
+ @keyframes bars-bounce {
96
+ 0% {
97
+ transform: scale(0.6);
98
+ opacity: 0;
99
+ }
100
+ 50%,
101
+ 100% {
102
+ transform: scale(1);
103
+ opacity: 1;
104
+ }
105
+ }
106
+
107
+ .root[data-variant="bars"] {
108
+ position: relative;
109
+ width: var(--loader-size);
110
+ height: var(--loader-size);
111
+ display: flex;
112
+ align-items: center;
113
+ justify-content: center;
114
+ gap: calc(var(--loader-size) / 5);
115
+ }
116
+
117
+ .root[data-variant="bars"] span {
118
+ flex: 1;
119
+ height: 100%;
120
+ background: var(--loader-color);
121
+ animation: bars-bounce 1.2s cubic-bezier(0, 0.5, 0.5, 1) infinite;
122
+ }
123
+
124
+ .root[data-variant="bars"] span:nth-of-type(1) {
125
+ animation-delay: -240ms;
126
+ }
127
+ .root[data-variant="bars"] span:nth-of-type(2) {
128
+ animation-delay: -120ms;
129
+ }
130
+ .root[data-variant="bars"] span:nth-of-type(3) {
131
+ animation-delay: 0;
132
+ }
133
+
134
+ /* ----- Dots loader ----- */
135
+ @keyframes dots-pulse {
136
+ 0%,
137
+ 100% {
138
+ transform: scale(1);
139
+ opacity: 1;
140
+ }
141
+ 50% {
142
+ transform: scale(0.6);
143
+ opacity: 0.5;
144
+ }
145
+ }
146
+
147
+ .root[data-variant="dots"] {
148
+ display: flex;
149
+ justify-content: center;
150
+ align-items: center;
151
+ gap: calc(var(--loader-size) / 10);
152
+ position: relative;
153
+ width: var(--loader-size);
154
+ height: var(--loader-size);
155
+ }
156
+
157
+ .root[data-variant="dots"] span {
158
+ width: calc(var(--loader-size) / 3 - var(--loader-size) / 15);
159
+ height: calc(var(--loader-size) / 3 - var(--loader-size) / 15);
160
+ background: var(--loader-color);
161
+ animation: dots-pulse 0.8s infinite linear;
162
+ }
163
+
164
+ .root[data-variant="dots"] span:nth-child(2) {
165
+ animation-delay: 0.4s;
166
+ }
@@ -1,16 +1,103 @@
1
+ import React from "react";
1
2
  import type { Meta, StoryObj } from "@storybook/react";
2
3
  import { Loader } from "./Loader";
3
- import { ComingSoon } from "@recursica/storybook-template";
4
+ import { Layer } from "@recursica/adapter-common";
4
5
 
5
- const meta: Meta<typeof Loader> = {
6
- title: "UI-Kit/🚧 Loader",
7
- component: Loader,
6
+ type LoaderStoryArgs = React.ComponentProps<typeof Loader> & {
7
+ layer?: 0 | 1 | 2 | 3;
8
+ };
9
+
10
+ const meta: Meta<LoaderStoryArgs> = {
11
+ title: "UI-Kit/Loader",
12
+ component: Loader as React.ComponentType<LoaderStoryArgs>,
8
13
  tags: ["autodocs"],
14
+ parameters: {
15
+ docs: {
16
+ description: {
17
+ component:
18
+ "The Loader bridges the Recursica UI-Kit `loader` variables to the generic primitive, rendering deterministic sizes and variants visually mapped strictly from the explicit design boundary tokens.",
19
+ },
20
+ },
21
+ },
22
+ argTypes: {
23
+ variant: {
24
+ control: "select",
25
+ options: ["oval", "bars", "dots"],
26
+ description: "The structural layout variant of the loading indicator",
27
+ },
28
+ size: {
29
+ control: "select",
30
+ options: ["sm", "md", "lg", "small", "default", "large"],
31
+ description:
32
+ "Scales the dimensional and thickness layout constrained to the explicit UI variables",
33
+ },
34
+ color: {
35
+ control: "color",
36
+ description:
37
+ "Optional inline dynamic color override spanning the token defaults",
38
+ },
39
+ layer: {
40
+ control: { type: "range", min: 0, max: 3, step: 1 },
41
+ description:
42
+ "Applies a wrapping context to observe rendering logic externally",
43
+ },
44
+ },
9
45
  };
10
46
 
11
47
  export default meta;
12
- type Story = StoryObj<typeof Loader>;
48
+
49
+ type Story = StoryObj<LoaderStoryArgs>;
13
50
 
14
51
  export const Default: Story = {
15
- render: () => <ComingSoon componentName="Loader" />,
52
+ args: {
53
+ variant: "oval",
54
+ size: "default",
55
+ layer: 0,
56
+ },
57
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
58
+ render: ({ withLayer, layer, ...args }: any) => (
59
+ <Layer layer={layer ?? 0} style={{ padding: "24px" }}>
60
+ <Loader {...args} />
61
+ </Layer>
62
+ ),
63
+ };
64
+
65
+ export const StaticOvalDefault: Story = {
66
+ args: {
67
+ variant: "oval",
68
+ size: "default",
69
+ },
70
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
71
+ render: ({ withLayer, layer, ...args }: any) => <Loader {...args} />,
72
+ };
73
+
74
+ export const StaticBarsLarge: Story = {
75
+ args: {
76
+ variant: "bars",
77
+ size: "large",
78
+ },
79
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
80
+ render: ({ withLayer, layer, ...args }: any) => <Loader {...args} />,
81
+ };
82
+
83
+ export const StaticDotsSmall: Story = {
84
+ args: {
85
+ variant: "dots",
86
+ size: "sm",
87
+ },
88
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
89
+ render: ({ withLayer, layer, ...args }: any) => <Loader {...args} />,
90
+ };
91
+
92
+ export const LayerTwoOval: Story = {
93
+ args: {
94
+ variant: "oval",
95
+ size: "default",
96
+ },
97
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
98
+ render: ({ withLayer, layer, ...args }: any) => (
99
+ <Layer layer={2} style={{ padding: "24px" }}>
100
+ <Loader {...args} />
101
+ </Layer>
102
+ ),
16
103
  };
@@ -1,7 +1,71 @@
1
- import React from "react";
1
+ import React, { forwardRef } from "react";
2
+ import {
3
+ filterStylingProps,
4
+ type RecursicaOverStyled,
5
+ type RecursicaSize,
6
+ } from "../../utils/filterStylingProps";
7
+ import styles from "./Loader.module.css";
2
8
 
3
- export type LoaderProps = React.HTMLAttributes<HTMLDivElement>;
9
+ export interface RecursicaLoaderProps {
10
+ /** Map to the component styles defined in variables */
11
+ variant?: "oval" | "bars" | "dots";
12
+ /** Map to Recursica sizes */
13
+ size?: "sm" | "md" | "lg" | RecursicaSize;
14
+ }
4
15
 
5
- export const Loader: React.FC<LoaderProps> = (props) => {
6
- return <div {...props}>Loader</div>;
7
- };
16
+ export type LoaderProps = RecursicaOverStyled<
17
+ React.HTMLAttributes<HTMLSpanElement> & RecursicaLoaderProps
18
+ >;
19
+
20
+ export const Loader = forwardRef<HTMLSpanElement, LoaderProps>(function Loader(
21
+ { variant = "oval", size = "default", overStyled = false, ...rest },
22
+ ref,
23
+ ) {
24
+ const mapSize = {
25
+ sm: "small",
26
+ md: "default",
27
+ lg: "large",
28
+ small: "small",
29
+ default: "default",
30
+ large: "large",
31
+ } as const;
32
+
33
+ const resolvedSize = mapSize[size] || "default";
34
+
35
+ // Strip all visual override injections unless developer has specifically opted into overStyling.
36
+ // External layout props like margins are safely preserved.
37
+ const sanitizedProps = filterStylingProps(rest, overStyled);
38
+
39
+ const classNameProp = (sanitizedProps as Record<string, unknown>)
40
+ .className as string | undefined;
41
+ const finalClass = classNameProp
42
+ ? `${styles.root} ${classNameProp}`
43
+ : styles.root;
44
+
45
+ const renderChildren = () => {
46
+ if (variant === "bars" || variant === "dots") {
47
+ return (
48
+ <>
49
+ <span />
50
+ <span />
51
+ <span />
52
+ </>
53
+ );
54
+ }
55
+ return null; // Oval is handled purely via CSS ::after
56
+ };
57
+
58
+ return (
59
+ <span
60
+ ref={ref}
61
+ data-variant={variant}
62
+ data-size={resolvedSize}
63
+ {...sanitizedProps}
64
+ className={finalClass}
65
+ >
66
+ {renderChildren()}
67
+ </span>
68
+ );
69
+ });
70
+
71
+ Loader.displayName = "Loader";
@@ -6,6 +6,25 @@ const meta: Meta<typeof Menu> = {
6
6
  title: "UI-Kit/🚧 Menu",
7
7
  component: Menu,
8
8
  tags: ["autodocs"],
9
+ parameters: {
10
+ controls: {
11
+ include: [
12
+ "layer",
13
+ "withLayer",
14
+ "children",
15
+ "component",
16
+ "variant",
17
+ "size",
18
+ "icon",
19
+ "disabled",
20
+ "href",
21
+ "onClick",
22
+ "onChange",
23
+ "value",
24
+ "checked",
25
+ ],
26
+ },
27
+ },
9
28
  };
10
29
 
11
30
  export default meta;
@@ -6,6 +6,25 @@ const meta: Meta<typeof Modal> = {
6
6
  title: "UI-Kit/🚧 Modal",
7
7
  component: Modal,
8
8
  tags: ["autodocs"],
9
+ parameters: {
10
+ controls: {
11
+ include: [
12
+ "layer",
13
+ "withLayer",
14
+ "children",
15
+ "component",
16
+ "variant",
17
+ "size",
18
+ "icon",
19
+ "disabled",
20
+ "href",
21
+ "onClick",
22
+ "onChange",
23
+ "value",
24
+ "checked",
25
+ ],
26
+ },
27
+ },
9
28
  };
10
29
 
11
30
  export default meta;
@@ -6,6 +6,25 @@ const meta: Meta<typeof NumberInput> = {
6
6
  title: "UI-Kit/🚧 NumberInput",
7
7
  component: NumberInput,
8
8
  tags: ["autodocs"],
9
+ parameters: {
10
+ controls: {
11
+ include: [
12
+ "layer",
13
+ "withLayer",
14
+ "children",
15
+ "component",
16
+ "variant",
17
+ "size",
18
+ "icon",
19
+ "disabled",
20
+ "href",
21
+ "onClick",
22
+ "onChange",
23
+ "value",
24
+ "checked",
25
+ ],
26
+ },
27
+ },
9
28
  };
10
29
 
11
30
  export default meta;
@@ -6,6 +6,25 @@ const meta: Meta<typeof Pagination> = {
6
6
  title: "UI-Kit/🚧 Pagination",
7
7
  component: Pagination,
8
8
  tags: ["autodocs"],
9
+ parameters: {
10
+ controls: {
11
+ include: [
12
+ "layer",
13
+ "withLayer",
14
+ "children",
15
+ "component",
16
+ "variant",
17
+ "size",
18
+ "icon",
19
+ "disabled",
20
+ "href",
21
+ "onClick",
22
+ "onChange",
23
+ "value",
24
+ "checked",
25
+ ],
26
+ },
27
+ },
9
28
  };
10
29
 
11
30
  export default meta;
@@ -6,6 +6,25 @@ const meta: Meta<typeof Panel> = {
6
6
  title: "UI-Kit/🚧 Panel",
7
7
  component: Panel,
8
8
  tags: ["autodocs"],
9
+ parameters: {
10
+ controls: {
11
+ include: [
12
+ "layer",
13
+ "withLayer",
14
+ "children",
15
+ "component",
16
+ "variant",
17
+ "size",
18
+ "icon",
19
+ "disabled",
20
+ "href",
21
+ "onClick",
22
+ "onChange",
23
+ "value",
24
+ "checked",
25
+ ],
26
+ },
27
+ },
9
28
  };
10
29
 
11
30
  export default meta;
@@ -6,6 +6,25 @@ const meta: Meta<typeof Radio> = {
6
6
  title: "UI-Kit/🚧 Radio",
7
7
  component: Radio,
8
8
  tags: ["autodocs"],
9
+ parameters: {
10
+ controls: {
11
+ include: [
12
+ "layer",
13
+ "withLayer",
14
+ "children",
15
+ "component",
16
+ "variant",
17
+ "size",
18
+ "icon",
19
+ "disabled",
20
+ "href",
21
+ "onClick",
22
+ "onChange",
23
+ "value",
24
+ "checked",
25
+ ],
26
+ },
27
+ },
9
28
  };
10
29
 
11
30
  export default meta;
@@ -6,6 +6,25 @@ const meta: Meta<typeof ReadOnlyField> = {
6
6
  title: "UI-Kit/🚧 ReadOnlyField",
7
7
  component: ReadOnlyField,
8
8
  tags: ["autodocs"],
9
+ parameters: {
10
+ controls: {
11
+ include: [
12
+ "layer",
13
+ "withLayer",
14
+ "children",
15
+ "component",
16
+ "variant",
17
+ "size",
18
+ "icon",
19
+ "disabled",
20
+ "href",
21
+ "onClick",
22
+ "onChange",
23
+ "value",
24
+ "checked",
25
+ ],
26
+ },
27
+ },
9
28
  };
10
29
 
11
30
  export default meta;
@@ -6,6 +6,25 @@ const meta: Meta<typeof SegmentedControl> = {
6
6
  title: "UI-Kit/🚧 SegmentedControl",
7
7
  component: SegmentedControl,
8
8
  tags: ["autodocs"],
9
+ parameters: {
10
+ controls: {
11
+ include: [
12
+ "layer",
13
+ "withLayer",
14
+ "children",
15
+ "component",
16
+ "variant",
17
+ "size",
18
+ "icon",
19
+ "disabled",
20
+ "href",
21
+ "onClick",
22
+ "onChange",
23
+ "value",
24
+ "checked",
25
+ ],
26
+ },
27
+ },
9
28
  };
10
29
 
11
30
  export default meta;
@@ -6,6 +6,25 @@ const meta: Meta<typeof Slider> = {
6
6
  title: "UI-Kit/🚧 Slider",
7
7
  component: Slider,
8
8
  tags: ["autodocs"],
9
+ parameters: {
10
+ controls: {
11
+ include: [
12
+ "layer",
13
+ "withLayer",
14
+ "children",
15
+ "component",
16
+ "variant",
17
+ "size",
18
+ "icon",
19
+ "disabled",
20
+ "href",
21
+ "onClick",
22
+ "onChange",
23
+ "value",
24
+ "checked",
25
+ ],
26
+ },
27
+ },
9
28
  };
10
29
 
11
30
  export default meta;