@recursica/adapter-mantine-v8 1.3.3 → 1.3.4
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/CHANGELOG.md +8 -0
- package/docs/PHILOSOPHY.md +4 -0
- package/package.json +4 -8
- package/.storybook/commonArgTypes.ts +0 -148
- package/recursica_brand.json +0 -2610
- package/recursica_tokens.json +0 -769
- package/recursica_ui-kit.json +0 -9049
- package/recursica_variables_scoped.css +0 -6178
- package/src/Introduction.stories.tsx +0 -149
- package/src/components/Accordion/Accordion.stories.tsx +0 -189
- package/src/components/AssistiveElement/AssistiveElement.stories.tsx +0 -68
- package/src/components/AutoComplete/AutoComplete.stories.tsx +0 -336
- package/src/components/Avatar/Avatar.stories.tsx +0 -92
- package/src/components/Badge/Badge.stories.tsx +0 -78
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +0 -114
- package/src/components/Button/Button.stories.tsx +0 -192
- package/src/components/Card/Card.stories.tsx +0 -76
- package/src/components/Checkbox/Checkbox.stories.tsx +0 -97
- package/src/components/Checkbox/CheckboxGroup.stories.tsx +0 -139
- package/src/components/Chip/Chip.stories.tsx +0 -128
- package/src/components/Container/Container.stories.tsx +0 -118
- package/src/components/DatePicker/DatePicker.stories.tsx +0 -158
- package/src/components/Dropdown/Dropdown.stories.tsx +0 -252
- package/src/components/FileInput/FileInput.stories.tsx +0 -313
- package/src/components/FileUpload/FileUpload.stories.tsx +0 -362
- package/src/components/Flex/Flex.stories.tsx +0 -128
- package/src/components/FormControlLayout/FormControlLayout.stories.tsx +0 -118
- package/src/components/FormControlWrapper/FormControlWrapper.stories.tsx +0 -129
- package/src/components/Group/Group.stories.tsx +0 -120
- package/src/components/Heading/Heading.stories.tsx +0 -112
- package/src/components/HoverCard/HoverCard.stories.tsx +0 -172
- package/src/components/Label/Label.stories.tsx +0 -131
- package/src/components/LayoutGrid/LayoutGrid.stories.tsx +0 -61
- package/src/components/Link/Link.stories.tsx +0 -58
- package/src/components/Loader/Loader.stories.tsx +0 -123
- package/src/components/Menu/Menu.stories.tsx +0 -370
- package/src/components/Modal/Modal.stories.tsx +0 -105
- package/src/components/NumberInput/NumberInput.stories.tsx +0 -96
- package/src/components/Pagination/Pagination.stories.tsx +0 -48
- package/src/components/Panel/Panel.stories.tsx +0 -219
- package/src/components/Popover/Popover.stories.tsx +0 -133
- package/src/components/Radio/Radio.stories.tsx +0 -93
- package/src/components/Radio/RadioGroup.stories.tsx +0 -117
- package/src/components/ReadOnlyField/ReadOnlyField.stories.tsx +0 -163
- package/src/components/SegmentedControl/SegmentedControl.stories.tsx +0 -106
- package/src/components/Slider/Slider.stories.tsx +0 -282
- package/src/components/Stack/Stack.stories.tsx +0 -108
- package/src/components/Stepper/Stepper.stories.tsx +0 -148
- package/src/components/Switch/Switch.stories.tsx +0 -114
- package/src/components/Switch/SwitchGroup.stories.tsx +0 -132
- package/src/components/Table/Table.stories.tsx +0 -140
- package/src/components/Tabs/Tabs.stories.tsx +0 -154
- package/src/components/Text/Text.stories.tsx +0 -148
- package/src/components/TextArea/TextArea.stories.tsx +0 -94
- package/src/components/TextField/TextField.stories.tsx +0 -162
- package/src/components/TimePicker/TimePicker.stories.tsx +0 -141
- package/src/components/Timeline/Timeline.stories.tsx +0 -128
- package/src/components/Toast/Toast.stories.tsx +0 -67
- package/src/components/Tooltip/Tooltip.stories.tsx +0 -165
- package/src/components/TransferList/TransferList.stories.tsx +0 -121
- package/src/components/Tree/Tree.stories.tsx +0 -104
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
import { useState } from "react";
|
|
2
|
-
import type { Meta, StoryObj } from "@storybook/react";
|
|
3
|
-
import { Panel, type PanelProps } from "./Panel";
|
|
4
|
-
import { Button } from "../Button";
|
|
5
|
-
import { Text } from "../Text/Text";
|
|
6
|
-
|
|
7
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
8
|
-
type PanelStoryArgs = Record<string, any>;
|
|
9
|
-
|
|
10
|
-
const meta: Meta = {
|
|
11
|
-
title: "UI-Kit/Panel",
|
|
12
|
-
component: Panel,
|
|
13
|
-
tags: ["autodocs"],
|
|
14
|
-
argTypes: {
|
|
15
|
-
placement: {
|
|
16
|
-
control: "select",
|
|
17
|
-
options: ["left", "right", "top", "bottom"],
|
|
18
|
-
description: "Side of the screen the panel slides in from.",
|
|
19
|
-
},
|
|
20
|
-
title: {
|
|
21
|
-
control: "text",
|
|
22
|
-
description: "Panel title displayed in the header.",
|
|
23
|
-
},
|
|
24
|
-
withCloseButton: {
|
|
25
|
-
control: "boolean",
|
|
26
|
-
description: "Whether to display the close button in the header.",
|
|
27
|
-
},
|
|
28
|
-
wrapHeaderText: {
|
|
29
|
-
control: "boolean",
|
|
30
|
-
description:
|
|
31
|
-
"If true, forces the header text to a single line and truncates with an ellipsis.",
|
|
32
|
-
},
|
|
33
|
-
// Hide auto-detected HTML attributes
|
|
34
|
-
defaultChecked: { table: { disable: true } },
|
|
35
|
-
defaultValue: { table: { disable: true } },
|
|
36
|
-
suppressContentEditableWarning: { table: { disable: true } },
|
|
37
|
-
suppressHydrationWarning: { table: { disable: true } },
|
|
38
|
-
},
|
|
39
|
-
parameters: {
|
|
40
|
-
layout: "fullscreen",
|
|
41
|
-
docs: {
|
|
42
|
-
description: {
|
|
43
|
-
component: `
|
|
44
|
-
The \`Panel\` component slides in or expands from the edge of the screen to reveal additional content or functionality. Built on Mantine's \`Drawer\`, it enforces Recursica design tokens for styling.
|
|
45
|
-
|
|
46
|
-
### Anatomy
|
|
47
|
-
1. **Header** — Title and close icon, remains fixed on scroll
|
|
48
|
-
2. **Divider** — Separates header/footer from content
|
|
49
|
-
3. **Body (Slot)** — Scrollable content area for custom content
|
|
50
|
-
4. **Footer** — Fixed action buttons (Recursica-specific)
|
|
51
|
-
|
|
52
|
-
### Usage
|
|
53
|
-
\`\`\`tsx
|
|
54
|
-
const [opened, { open, close }] = useDisclosure(false);
|
|
55
|
-
|
|
56
|
-
<Button onClick={open}>Open Panel</Button>
|
|
57
|
-
<Panel opened={opened} onClose={close} title="Settings" placement="right">
|
|
58
|
-
Content goes here
|
|
59
|
-
<Panel.Footer>
|
|
60
|
-
<Button variant="outline">Cancel</Button>
|
|
61
|
-
<Button variant="solid">Save</Button>
|
|
62
|
-
</Panel.Footer>
|
|
63
|
-
</Panel>
|
|
64
|
-
\`\`\`
|
|
65
|
-
`,
|
|
66
|
-
},
|
|
67
|
-
},
|
|
68
|
-
},
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
export default meta;
|
|
72
|
-
|
|
73
|
-
type Story = StoryObj<PanelStoryArgs>;
|
|
74
|
-
|
|
75
|
-
export const Default: Story = {
|
|
76
|
-
args: {
|
|
77
|
-
placement: "right",
|
|
78
|
-
title: "Panel Title",
|
|
79
|
-
withCloseButton: true,
|
|
80
|
-
wrapHeaderText: false,
|
|
81
|
-
},
|
|
82
|
-
render: ({ wrapHeaderText, ...args }: PanelStoryArgs) => {
|
|
83
|
-
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
84
|
-
const [opened, setOpened] = useState(true);
|
|
85
|
-
|
|
86
|
-
return (
|
|
87
|
-
<>
|
|
88
|
-
<Button variant="solid" onClick={() => setOpened(true)}>
|
|
89
|
-
Open Panel
|
|
90
|
-
</Button>
|
|
91
|
-
<Panel
|
|
92
|
-
{...(args as PanelProps)}
|
|
93
|
-
opened={opened}
|
|
94
|
-
onClose={() => setOpened(false)}
|
|
95
|
-
title="Panel Title"
|
|
96
|
-
placement="right"
|
|
97
|
-
wrapHeaderText={wrapHeaderText}
|
|
98
|
-
>
|
|
99
|
-
<Text>
|
|
100
|
-
This is the panel body content area. Panels slide in from the edge
|
|
101
|
-
of the screen to reveal supplementary information, navigation
|
|
102
|
-
options, or toolsets.
|
|
103
|
-
</Text>
|
|
104
|
-
<Panel.Footer>
|
|
105
|
-
<Button variant="outline" onClick={() => setOpened(false)}>
|
|
106
|
-
Cancel
|
|
107
|
-
</Button>
|
|
108
|
-
<Button variant="solid">Save</Button>
|
|
109
|
-
</Panel.Footer>
|
|
110
|
-
</Panel>
|
|
111
|
-
</>
|
|
112
|
-
);
|
|
113
|
-
},
|
|
114
|
-
};
|
|
115
|
-
|
|
116
|
-
export const LeftPlacement: Story = {
|
|
117
|
-
args: {
|
|
118
|
-
placement: "left",
|
|
119
|
-
title: "Navigation",
|
|
120
|
-
withCloseButton: true,
|
|
121
|
-
wrapHeaderText: false,
|
|
122
|
-
},
|
|
123
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
124
|
-
render: ({ withLayer, layer, ...args }: PanelStoryArgs) => {
|
|
125
|
-
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
126
|
-
const [opened, setOpened] = useState(true);
|
|
127
|
-
|
|
128
|
-
return (
|
|
129
|
-
<>
|
|
130
|
-
<Button variant="outline" onClick={() => setOpened(true)}>
|
|
131
|
-
Open Left Panel
|
|
132
|
-
</Button>
|
|
133
|
-
<Panel
|
|
134
|
-
{...(args as PanelProps)}
|
|
135
|
-
opened={opened}
|
|
136
|
-
onClose={() => setOpened(false)}
|
|
137
|
-
>
|
|
138
|
-
<Text>
|
|
139
|
-
A panel sliding in from the left, commonly used for navigation menus
|
|
140
|
-
or sidebars.
|
|
141
|
-
</Text>
|
|
142
|
-
</Panel>
|
|
143
|
-
</>
|
|
144
|
-
);
|
|
145
|
-
},
|
|
146
|
-
};
|
|
147
|
-
|
|
148
|
-
export const ScrollableContent: Story = {
|
|
149
|
-
args: {
|
|
150
|
-
placement: "right",
|
|
151
|
-
title: "Scrollable Panel",
|
|
152
|
-
withCloseButton: true,
|
|
153
|
-
wrapHeaderText: false,
|
|
154
|
-
},
|
|
155
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
156
|
-
render: ({ withLayer, layer, ...args }: PanelStoryArgs) => {
|
|
157
|
-
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
158
|
-
const [opened, setOpened] = useState(true);
|
|
159
|
-
|
|
160
|
-
return (
|
|
161
|
-
<>
|
|
162
|
-
<Button variant="solid" onClick={() => setOpened(true)}>
|
|
163
|
-
Open Scrollable Panel
|
|
164
|
-
</Button>
|
|
165
|
-
<Panel
|
|
166
|
-
{...(args as PanelProps)}
|
|
167
|
-
opened={opened}
|
|
168
|
-
onClose={() => setOpened(false)}
|
|
169
|
-
>
|
|
170
|
-
{Array.from({ length: 20 }).map((_, i) => (
|
|
171
|
-
<p key={i} style={{ marginBottom: "1rem" }}>
|
|
172
|
-
Paragraph {i + 1}: This is sample content to demonstrate the
|
|
173
|
-
scrollable behavior of the panel when content exceeds the viewport
|
|
174
|
-
height.
|
|
175
|
-
</p>
|
|
176
|
-
))}
|
|
177
|
-
<Panel.Footer>
|
|
178
|
-
<Button variant="outline" onClick={() => setOpened(false)}>
|
|
179
|
-
Close
|
|
180
|
-
</Button>
|
|
181
|
-
<Button variant="solid">Apply</Button>
|
|
182
|
-
</Panel.Footer>
|
|
183
|
-
</Panel>
|
|
184
|
-
</>
|
|
185
|
-
);
|
|
186
|
-
},
|
|
187
|
-
};
|
|
188
|
-
|
|
189
|
-
export const LongTitle: Story = {
|
|
190
|
-
args: {
|
|
191
|
-
placement: "right",
|
|
192
|
-
title:
|
|
193
|
-
"This is a ridiculously long panel title designed to test how the header CSS handles text overflow and whether it truncates correctly or breaks the layout",
|
|
194
|
-
withCloseButton: true,
|
|
195
|
-
wrapHeaderText: true,
|
|
196
|
-
},
|
|
197
|
-
render: ({ ...args }: PanelStoryArgs) => {
|
|
198
|
-
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
199
|
-
const [opened, setOpened] = useState(true);
|
|
200
|
-
|
|
201
|
-
return (
|
|
202
|
-
<>
|
|
203
|
-
<Button variant="solid" onClick={() => setOpened(true)}>
|
|
204
|
-
Open Long Title Panel
|
|
205
|
-
</Button>
|
|
206
|
-
<Panel
|
|
207
|
-
{...(args as PanelProps)}
|
|
208
|
-
opened={opened}
|
|
209
|
-
onClose={() => setOpened(false)}
|
|
210
|
-
>
|
|
211
|
-
<Text>
|
|
212
|
-
Check the header to see if the long title is handled gracefully
|
|
213
|
-
without pushing the close button off screen.
|
|
214
|
-
</Text>
|
|
215
|
-
</Panel>
|
|
216
|
-
</>
|
|
217
|
-
);
|
|
218
|
-
},
|
|
219
|
-
};
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
-
import { Popover } from "./Popover";
|
|
3
|
-
import { Button } from "../Button";
|
|
4
|
-
import { Text } from "../Text/Text";
|
|
5
|
-
import { Stack } from "../Stack/Stack";
|
|
6
|
-
|
|
7
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
8
|
-
type PopoverStoryArgs = Record<string, any>;
|
|
9
|
-
|
|
10
|
-
const meta = {
|
|
11
|
-
title: "UI-Kit/Popover",
|
|
12
|
-
component: Popover,
|
|
13
|
-
tags: ["autodocs"],
|
|
14
|
-
parameters: {
|
|
15
|
-
docs: {
|
|
16
|
-
description: {
|
|
17
|
-
component:
|
|
18
|
-
"The `Popover` component is a composable wrapper around Mantine's Popover. It displays a dropdown panel when the user clicks or interacts with a target element.",
|
|
19
|
-
},
|
|
20
|
-
},
|
|
21
|
-
},
|
|
22
|
-
argTypes: {
|
|
23
|
-
withBeak: {
|
|
24
|
-
control: "boolean",
|
|
25
|
-
description:
|
|
26
|
-
"Whether to display a beak (arrow) pointing from the dropdown to the target.",
|
|
27
|
-
},
|
|
28
|
-
position: {
|
|
29
|
-
control: "select",
|
|
30
|
-
options: [
|
|
31
|
-
"top",
|
|
32
|
-
"top-start",
|
|
33
|
-
"top-end",
|
|
34
|
-
"bottom",
|
|
35
|
-
"bottom-start",
|
|
36
|
-
"bottom-end",
|
|
37
|
-
"left",
|
|
38
|
-
"left-start",
|
|
39
|
-
"left-end",
|
|
40
|
-
"right",
|
|
41
|
-
"right-start",
|
|
42
|
-
"right-end",
|
|
43
|
-
],
|
|
44
|
-
description: "Dropdown position relative to target",
|
|
45
|
-
},
|
|
46
|
-
defaultOpened: {
|
|
47
|
-
control: "boolean",
|
|
48
|
-
description: "Initial opened state",
|
|
49
|
-
},
|
|
50
|
-
},
|
|
51
|
-
} satisfies Meta<typeof Popover>;
|
|
52
|
-
|
|
53
|
-
export default meta;
|
|
54
|
-
type Story = StoryObj<typeof meta>;
|
|
55
|
-
|
|
56
|
-
export const Default: Story = {
|
|
57
|
-
args: {
|
|
58
|
-
withBeak: true,
|
|
59
|
-
position: "top",
|
|
60
|
-
},
|
|
61
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
62
|
-
render: ({ withLayer, layer, ...args }: PopoverStoryArgs) => {
|
|
63
|
-
return (
|
|
64
|
-
<Popover width={250} {...args}>
|
|
65
|
-
<Popover.Target>
|
|
66
|
-
<Button variant="solid">Toggle Popover</Button>
|
|
67
|
-
</Popover.Target>
|
|
68
|
-
<Popover.Dropdown>
|
|
69
|
-
<Text size="rec-sm">
|
|
70
|
-
This is the popover content. It can contain any elements you want to
|
|
71
|
-
display when the user clicks the target.
|
|
72
|
-
</Text>
|
|
73
|
-
</Popover.Dropdown>
|
|
74
|
-
</Popover>
|
|
75
|
-
);
|
|
76
|
-
},
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
export const SolidDefault: Story = {
|
|
80
|
-
args: {
|
|
81
|
-
withBeak: true,
|
|
82
|
-
position: "top",
|
|
83
|
-
defaultOpened: true,
|
|
84
|
-
},
|
|
85
|
-
parameters: {
|
|
86
|
-
controls: { disable: true },
|
|
87
|
-
},
|
|
88
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
89
|
-
render: ({ withLayer, layer, ...args }: PopoverStoryArgs) => {
|
|
90
|
-
return (
|
|
91
|
-
<Stack align="center" justify="center" style={{ padding: "100px" }}>
|
|
92
|
-
<Popover width={200} {...args}>
|
|
93
|
-
<Popover.Target>
|
|
94
|
-
<Button variant="solid">Toggle Popover</Button>
|
|
95
|
-
</Popover.Target>
|
|
96
|
-
<Popover.Dropdown>
|
|
97
|
-
<Text size="rec-sm">
|
|
98
|
-
This is a static representation of an opened popover with a beak.
|
|
99
|
-
</Text>
|
|
100
|
-
</Popover.Dropdown>
|
|
101
|
-
</Popover>
|
|
102
|
-
</Stack>
|
|
103
|
-
);
|
|
104
|
-
},
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
export const WithoutBeak: Story = {
|
|
108
|
-
args: {
|
|
109
|
-
withBeak: false,
|
|
110
|
-
position: "bottom",
|
|
111
|
-
defaultOpened: true,
|
|
112
|
-
},
|
|
113
|
-
parameters: {
|
|
114
|
-
controls: { disable: true },
|
|
115
|
-
},
|
|
116
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
117
|
-
render: ({ withLayer, layer, ...args }: PopoverStoryArgs) => {
|
|
118
|
-
return (
|
|
119
|
-
<Stack align="center" justify="center" style={{ padding: "100px" }}>
|
|
120
|
-
<Popover width={200} {...args}>
|
|
121
|
-
<Popover.Target>
|
|
122
|
-
<Button variant="outline">Bottom Popover</Button>
|
|
123
|
-
</Popover.Target>
|
|
124
|
-
<Popover.Dropdown>
|
|
125
|
-
<Text size="rec-sm">
|
|
126
|
-
This popover is positioned at the bottom and has no beak.
|
|
127
|
-
</Text>
|
|
128
|
-
</Popover.Dropdown>
|
|
129
|
-
</Popover>
|
|
130
|
-
</Stack>
|
|
131
|
-
);
|
|
132
|
-
},
|
|
133
|
-
};
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
-
import { Radio } from "./Radio";
|
|
3
|
-
|
|
4
|
-
const meta: Meta<typeof Radio> = {
|
|
5
|
-
title: "UI-Kit/Radio",
|
|
6
|
-
component: Radio,
|
|
7
|
-
tags: ["autodocs"],
|
|
8
|
-
parameters: {
|
|
9
|
-
docs: {
|
|
10
|
-
description: {
|
|
11
|
-
component: `
|
|
12
|
-
The \`Radio\` component represents a fundamental standalone boolean selection node mapping to the native HTML \`<input type="radio">\`.
|
|
13
|
-
|
|
14
|
-
> [!WARNING]
|
|
15
|
-
> This component represents the isolated primitive structure. If you need macro form configurations, standard vertical alignments, side-by-side array wrappers, or integrated assistive text and error borders natively, you MUST use the \`<Radio.Group>\` orchestrator instead!
|
|
16
|
-
`,
|
|
17
|
-
},
|
|
18
|
-
},
|
|
19
|
-
},
|
|
20
|
-
argTypes: {
|
|
21
|
-
disabled: {
|
|
22
|
-
control: "boolean",
|
|
23
|
-
},
|
|
24
|
-
checked: {
|
|
25
|
-
control: "boolean",
|
|
26
|
-
},
|
|
27
|
-
readOnly: {
|
|
28
|
-
control: "boolean",
|
|
29
|
-
},
|
|
30
|
-
error: {
|
|
31
|
-
control: "boolean",
|
|
32
|
-
},
|
|
33
|
-
defaultChecked: {
|
|
34
|
-
control: "boolean",
|
|
35
|
-
},
|
|
36
|
-
controlMaxWidth: { table: { disable: true } },
|
|
37
|
-
controlMinWidth: { table: { disable: true } },
|
|
38
|
-
},
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
export default meta;
|
|
42
|
-
|
|
43
|
-
type Story = StoryObj<typeof Radio>;
|
|
44
|
-
|
|
45
|
-
export const Default: Story = {
|
|
46
|
-
args: {
|
|
47
|
-
label: "Standard Radio Primitive",
|
|
48
|
-
},
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
export const SideBySideLayout: Story = {
|
|
52
|
-
args: {
|
|
53
|
-
label: "Opt-in form alignment",
|
|
54
|
-
formLayout: "side-by-side",
|
|
55
|
-
},
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
export const CheckedState: Story = {
|
|
59
|
-
args: {
|
|
60
|
-
...Default.args,
|
|
61
|
-
defaultChecked: true,
|
|
62
|
-
},
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
export const DisabledUnchecked: Story = {
|
|
66
|
-
args: {
|
|
67
|
-
...Default.args,
|
|
68
|
-
disabled: true,
|
|
69
|
-
},
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
export const DisabledChecked: Story = {
|
|
73
|
-
args: {
|
|
74
|
-
...Default.args,
|
|
75
|
-
disabled: true,
|
|
76
|
-
defaultChecked: true,
|
|
77
|
-
},
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
export const ReadOnly: Story = {
|
|
81
|
-
args: {},
|
|
82
|
-
render: () => (
|
|
83
|
-
<div
|
|
84
|
-
style={{
|
|
85
|
-
display: "flex",
|
|
86
|
-
flexDirection: "column",
|
|
87
|
-
gap: "24px",
|
|
88
|
-
}}
|
|
89
|
-
>
|
|
90
|
-
<Radio label="Account Type" defaultChecked readOnly />
|
|
91
|
-
</div>
|
|
92
|
-
),
|
|
93
|
-
};
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
-
import { Radio } from "./Radio";
|
|
3
|
-
import { RadioGroup } from "./RadioGroup";
|
|
4
|
-
import { useState } from "react";
|
|
5
|
-
import { formControlArgTypes } from "../../../.storybook/commonArgTypes";
|
|
6
|
-
|
|
7
|
-
const meta: Meta<typeof RadioGroup> = {
|
|
8
|
-
title: "UI-Kit/RadioGroup",
|
|
9
|
-
component: RadioGroup,
|
|
10
|
-
tags: ["autodocs"],
|
|
11
|
-
parameters: {
|
|
12
|
-
docs: {
|
|
13
|
-
description: {
|
|
14
|
-
component: `
|
|
15
|
-
The \`RadioGroup\` component is the mandatory organizational wrapper aggregating multiple \`Radio\` primitives into structurally bound unified selection arrays. It inherently leverages the \`FormControlWrapper\` granting native access to macroscopic layout structuring, assistive descriptions, and strict flex arrays.
|
|
16
|
-
|
|
17
|
-
We exclusively utilize the \`formLayout\` parameter to control macro-level form flow:
|
|
18
|
-
- **\`formLayout="stacked"\`**: Top-to-bottom layout cascading the Label bounding box down vertically into a standard stacked radio column array.
|
|
19
|
-
- **\`formLayout="side-by-side"\`**: Flow architecture pulling the grouping Label dynamically to the left while structurally organizing the internal radios cleanly alongside it horizontally.
|
|
20
|
-
`,
|
|
21
|
-
},
|
|
22
|
-
},
|
|
23
|
-
},
|
|
24
|
-
argTypes: {
|
|
25
|
-
...formControlArgTypes,
|
|
26
|
-
readOnly: {
|
|
27
|
-
control: "boolean",
|
|
28
|
-
description:
|
|
29
|
-
"Toggles structural read-only data presentation bypassing interaction boundaries completely.",
|
|
30
|
-
},
|
|
31
|
-
},
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
export default meta;
|
|
35
|
-
|
|
36
|
-
type Story = StoryObj<typeof RadioGroup>;
|
|
37
|
-
|
|
38
|
-
export const Default: Story = {
|
|
39
|
-
args: {
|
|
40
|
-
formLayout: "stacked",
|
|
41
|
-
label: "Standard Group",
|
|
42
|
-
},
|
|
43
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
|
|
44
|
-
render: function StoryRender({ withLayer, layer, ...args }: any) {
|
|
45
|
-
const [value, setValue] = useState<string>("");
|
|
46
|
-
return (
|
|
47
|
-
<RadioGroup {...args} value={value} onChange={setValue}>
|
|
48
|
-
<Radio value="1" label="Option 1" />
|
|
49
|
-
<Radio value="2" label="Option 2" />
|
|
50
|
-
</RadioGroup>
|
|
51
|
-
);
|
|
52
|
-
},
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
export const StackedLayout: Story = {
|
|
56
|
-
args: {
|
|
57
|
-
formLayout: "stacked",
|
|
58
|
-
required: true,
|
|
59
|
-
label: "Hosting Provider",
|
|
60
|
-
error: "You must select a deployment provider.",
|
|
61
|
-
},
|
|
62
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
|
|
63
|
-
render: function StoryRender({ withLayer, layer, ...args }: any) {
|
|
64
|
-
const [value, setValue] = useState<string>("aws");
|
|
65
|
-
return (
|
|
66
|
-
<RadioGroup {...args} value={value} onChange={setValue}>
|
|
67
|
-
<Radio value="aws" label="Amazon Web Services" />
|
|
68
|
-
<Radio
|
|
69
|
-
value="gcp"
|
|
70
|
-
label="Google Cloud Platform (with completely distributed edge computing environments bridging local runtime boundaries seamlessly.)"
|
|
71
|
-
/>
|
|
72
|
-
<Radio value="azure" label="Microsoft Azure" />
|
|
73
|
-
</RadioGroup>
|
|
74
|
-
);
|
|
75
|
-
},
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
export const SideBySideLayout: Story = {
|
|
79
|
-
args: {
|
|
80
|
-
formLayout: "side-by-side",
|
|
81
|
-
labelOptionalText: "Recommended",
|
|
82
|
-
labelWithEditIcon: true,
|
|
83
|
-
label: "Deployment Region",
|
|
84
|
-
assistiveText: "Select the data center closest to your user base.",
|
|
85
|
-
},
|
|
86
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
|
|
87
|
-
render: function StoryRender({ withLayer, layer, ...args }: any) {
|
|
88
|
-
const [value, setValue] = useState<string>("us-east");
|
|
89
|
-
return (
|
|
90
|
-
<RadioGroup {...args} value={value} onChange={setValue}>
|
|
91
|
-
<Radio value="us-east" label="US East (N. Virginia)" />
|
|
92
|
-
<Radio value="us-west" label="US West (Oregon)" />
|
|
93
|
-
<Radio value="eu-central" label="EU Central (Frankfurt)" />
|
|
94
|
-
</RadioGroup>
|
|
95
|
-
);
|
|
96
|
-
},
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
export const ReadOnly: Story = {
|
|
100
|
-
args: {
|
|
101
|
-
readOnly: true,
|
|
102
|
-
formLayout: "stacked",
|
|
103
|
-
required: true,
|
|
104
|
-
label: "Selected Framework",
|
|
105
|
-
assistiveText: "This selection cannot be changed after initialization.",
|
|
106
|
-
},
|
|
107
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
|
|
108
|
-
render: function StoryRender({ withLayer, layer, ...args }: any) {
|
|
109
|
-
const [value, setValue] = useState<string>("react");
|
|
110
|
-
return (
|
|
111
|
-
<RadioGroup {...args} value={value} onChange={setValue}>
|
|
112
|
-
<Radio value="react" label="React" />
|
|
113
|
-
<Radio value="vue" label="Vue" />
|
|
114
|
-
</RadioGroup>
|
|
115
|
-
);
|
|
116
|
-
},
|
|
117
|
-
};
|