@webiny/admin-ui 6.2.0-beta.0 → 6.3.0-beta.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/Accordion/Accordion.d.ts +1 -1
- package/Accordion/Accordion.mdx +437 -463
- package/Accordion/components/AccordionContent.js.map +1 -1
- package/Alert/Alert.d.ts +1 -1
- package/Alert/Alert.js.map +1 -1
- package/Alert/Alert.mdx +80 -83
- package/AutoComplete/AutoComplete.mdx +63 -55
- package/Avatar/Avatar.d.ts +1 -1
- package/Avatar/Avatar.js.map +1 -1
- package/Avatar/Avatar.mdx +52 -43
- package/Button/Button.d.ts +1 -1
- package/Button/Button.js.map +1 -1
- package/Button/Button.mdx +50 -42
- package/Button/IconButton.d.ts +1 -1
- package/Button/IconButton.js.map +1 -1
- package/Card/components/CardContent.d.ts +1 -1
- package/Card/components/CardTitle.d.ts +1 -1
- package/Checkbox/Checkbox.mdx +51 -49
- package/Checkbox/primitives/CheckboxPrimitive.d.ts +1 -1
- package/CheckboxGroup/CheckboxGroup.mdx +51 -53
- package/CodeEditor/CodeEditor.mdx +44 -43
- package/ColorPicker/ColorPicker.mdx +41 -40
- package/Command/components/Item.d.ts +1 -1
- package/Command/components/Item.js.map +1 -1
- package/DataTable/DataTable.mdx +537 -542
- package/DataTable/components/ColumnSorter.d.ts +1 -1
- package/DataTable/components/ColumnSorter.js.map +1 -1
- package/Dialog/Dialog.js.map +1 -1
- package/Dialog/components/DialogContent.d.ts +1 -1
- package/Dialog/components/DialogContent.js +1 -1
- package/Dialog/components/DialogContent.js.map +1 -1
- package/Dialog/components/DialogFooter.d.ts +1 -1
- package/Dialog/components/DialogFooter.js.map +1 -1
- package/Dialog/components/DialogTitle.d.ts +1 -1
- package/Drawer/Drawer.js.map +1 -1
- package/Drawer/Drawer.mdx +73 -64
- package/Drawer/components/DrawerContent.d.ts +1 -1
- package/Drawer/components/DrawerContent.js.map +1 -1
- package/DropdownMenu/DropdownMenu.js.map +1 -1
- package/DropdownMenu/DropdownMenu.mdx +155 -256
- package/DropdownMenu/components/DropdownMenuCheckboxItem.js.map +1 -1
- package/DropdownMenu/components/DropdownMenuLabel.js.map +1 -1
- package/FilePicker/FilePicker.mdx +69 -69
- package/FilePicker/primitives/FilePickerPrimitive.d.ts +19 -19
- package/FilePicker/primitives/FilePickerPrimitive.js.map +1 -1
- package/FilePicker/primitives/components/Trigger.d.ts +1 -1
- package/FilePicker/primitives/components/previews/TextOnlyPreview/TextOnlyPreview.d.ts +1 -1
- package/FilePicker/primitives/components/previews/variants.d.ts +1 -1
- package/FilePicker/primitives/components/types.js.map +1 -1
- package/FormComponent/Description.d.ts +1 -1
- package/FormComponent/ErrorMessage.d.ts +1 -1
- package/FormComponent/Note.d.ts +1 -1
- package/Grid/Grid.d.ts +2 -2
- package/Grid/Grid.js.map +1 -1
- package/Grid/Grid.mdx +111 -121
- package/HeaderBar/HeaderBar.mdx +98 -99
- package/Heading/Heading.d.ts +1 -1
- package/Heading/Heading.js.map +1 -1
- package/Heading/Heading.mdx +63 -58
- package/Icon/Icon.d.ts +1 -1
- package/Icon/Icon.js.map +1 -1
- package/Icon/Icon.mdx +79 -147
- package/IconPicker/IconPicker.mdx +66 -64
- package/IconPicker/primitives/IconPickerPrimitive.d.ts +1 -1
- package/IconPicker/primitives/components/IconPickerTrigger.d.ts +1 -1
- package/Image/Image.js.map +1 -1
- package/Input/Input.mdx +67 -56
- package/Input/InputPrimitive.d.ts +1 -1
- package/Label/Label.d.ts +1 -1
- package/Label/Label.js.map +1 -1
- package/Label/Label.mdx +42 -42
- package/Label/components/LabelDescription.d.ts +1 -1
- package/Label/components/LabelRequired.d.ts +1 -1
- package/Label/components/LabelValue.d.ts +1 -1
- package/Link/Link.d.ts +1 -1
- package/Link/Link.mdx +129 -116
- package/List/List.d.ts +1 -1
- package/List/List.js.map +1 -1
- package/List/List.mdx +317 -329
- package/List/components/ListItem.d.ts +1 -1
- package/List/components/ListItem.js.map +1 -1
- package/Loader/Loader.d.ts +2 -2
- package/Loader/Loader.js.map +1 -1
- package/Loader/Loader.mdx +96 -91
- package/MultiAutoComplete/MultiAutoComplete.mdx +52 -51
- package/MultiAutoComplete/primitives/components/MultiAutoCompleteInput.d.ts +1 -1
- package/MultiAutoComplete/primitives/presenters/MultiAutoCompleteListOptionsPresenter.js.map +1 -1
- package/MultiAutoComplete/primitives/presenters/MultiAutoCompleteListOptionsPresenterWithUniqueValues.js.map +1 -1
- package/MultiAutoComplete/primitives/presenters/MultiAutoCompleteSelectedOptionsPresenter.js.map +1 -1
- package/MultiAutoComplete/primitives/presenters/MultiAutoCompleteTemporaryOptionPresenter.js.map +1 -1
- package/MultiFilePicker/MultiFilePicker.mdx +84 -80
- package/MultiFilePicker/primitives/MultiFilePickerPrimitive.js.map +1 -1
- package/Popover/Popover.mdx +112 -118
- package/Popover/primitives/components/PopoverArrow.d.ts +1 -1
- package/Popover/primitives/components/PopoverContent.d.ts +1 -1
- package/RadioGroup/RadioGroup.mdx +62 -59
- package/RadioGroup/primitives/RadioGroupPrimitive.js.map +1 -1
- package/RangeSlider/RangeSlider.mdx +48 -47
- package/RangeSlider/primitives/RangeSliderPrimitive.js.map +1 -1
- package/RangeSlider/primitives/components/RangeSliderValue.d.ts +1 -1
- package/RangeSlider/primitives/components/RangeSliderValue.js.map +1 -1
- package/ScrollArea/ScrollArea.js.map +1 -1
- package/SegmentedControl/SegmentedControl.mdx +59 -59
- package/SegmentedControl/primitives/SegmentedControlPrimitive.d.ts +1 -1
- package/SegmentedControl/primitives/SegmentedControlPrimitive.js.map +1 -1
- package/Select/Select.mdx +52 -43
- package/Select/primitives/components/SelectTrigger.d.ts +1 -1
- package/Select/primitives/components/SelectTrigger.js.map +1 -1
- package/Select/primitives/presenters/SelectPresenter.d.ts +1 -1
- package/Separator/Separator.d.ts +1 -1
- package/Separator/Separator.mdx +139 -150
- package/Sidebar/Sidebar.js.map +1 -1
- package/Sidebar/Sidebar.mdx +66 -88
- package/Sidebar/components/items/SidebarMenuSubItemIndentation.d.ts +1 -1
- package/Sidebar/components/items/SidebarMenuSubItemIndentation.js.map +1 -1
- package/Skeleton/Skeleton.d.ts +1 -1
- package/Skeleton/Skeleton.js.map +1 -1
- package/Skeleton/Skeleton.mdx +37 -37
- package/Slider/Slider.mdx +48 -47
- package/Slider/primitives/SliderPrimitive.js.map +1 -1
- package/Slider/primitives/components/SliderSideValue.d.ts +1 -1
- package/Slider/primitives/components/SliderSideValue.js.map +1 -1
- package/Slider/primitives/components/SliderTooltip.d.ts +1 -1
- package/SteppedProgress/components/SteppedProgressIcon.d.ts +1 -1
- package/SteppedProgress/components/SteppedProgressIcon.js.map +1 -1
- package/SteppedProgress/components/SteppedProgressIndicator.d.ts +1 -1
- package/SteppedProgress/components/SteppedProgressIndicator.js.map +1 -1
- package/Switch/Switch.mdx +44 -42
- package/Switch/primitives/SwitchPrimitive.d.ts +1 -1
- package/Table/Table.d.ts +1 -1
- package/Table/Table.js.map +1 -1
- package/Table/components/Direction.d.ts +1 -1
- package/Table/components/Direction.js.map +1 -1
- package/Table/components/Header.d.ts +1 -1
- package/Table/components/Header.js.map +1 -1
- package/Table/components/Resizer.d.ts +1 -1
- package/Table/components/Resizer.js.map +1 -1
- package/Table/components/Row.d.ts +1 -1
- package/Table/components/Row.js.map +1 -1
- package/Tabs/Tabs.mdx +297 -292
- package/Tabs/components/Content.d.ts +1 -1
- package/Tabs/components/List.d.ts +1 -1
- package/Tabs/components/Trigger.d.ts +1 -1
- package/Tag/Tag.d.ts +1 -1
- package/Tag/Tag.js.map +1 -1
- package/Tag/Tag.mdx +68 -64
- package/Tags/primitives/TagsPrimitive.js.map +1 -1
- package/Text/Text.d.ts +1 -1
- package/Text/Text.mdx +54 -48
- package/Textarea/Textarea.mdx +49 -39
- package/Textarea/TextareaPrimitive.d.ts +1 -1
- package/Textarea/TextareaPrimitive.js.map +1 -1
- package/Toast/Toast.mdx +63 -53
- package/Toast/components/ToastRoot.d.ts +1 -1
- package/Tooltip/Tooltip.mdx +197 -198
- package/Tooltip/components/TooltipArrow.d.ts +1 -1
- package/Tooltip/components/TooltipContent.d.ts +1 -1
- package/Tree/components/Item.d.ts +1 -1
- package/Tree/useTree.d.ts +1 -1
- package/Widget/components/WidgetContent.d.ts +1 -1
- package/package.json +15 -15
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Canvas, Meta, Controls } from
|
|
1
|
+
import { Canvas, Meta, Controls } from "@storybook/addon-docs/blocks";
|
|
2
2
|
|
|
3
|
-
import * as RadioGroupStories from
|
|
3
|
+
import * as RadioGroupStories from "./RadioGroup.stories";
|
|
4
4
|
|
|
5
5
|
<Meta of={RadioGroupStories} />
|
|
6
6
|
|
|
@@ -16,8 +16,8 @@ import React, { useState } from "react";
|
|
|
16
16
|
import { RadioGroup } from "@webiny/admin-ui";
|
|
17
17
|
|
|
18
18
|
const RadioGroupExample = () => {
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
const [value, setValue] = useState("");
|
|
20
|
+
const [validation, setValidation] = useState({ isValid: true, message: "" });
|
|
21
21
|
|
|
22
22
|
const handleValidation = () => {
|
|
23
23
|
if (!value) {
|
|
@@ -53,27 +53,28 @@ const RadioGroupExample = () => {
|
|
|
53
53
|
onBlur={handleValidation}
|
|
54
54
|
/>
|
|
55
55
|
);
|
|
56
|
+
|
|
56
57
|
};
|
|
57
58
|
|
|
58
59
|
export default RadioGroupExample;
|
|
59
60
|
|
|
60
61
|
`} }
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
62
|
+
additionalActions={[
|
|
63
|
+
{
|
|
64
|
+
title: 'Open in GitHub',
|
|
65
|
+
onClick: () => {
|
|
66
|
+
window.open(
|
|
67
|
+
'https://github.com/webiny/webiny-js/blob/feat/new-admin-ui/packages/admin-ui/src/RadioGroup/RadioGroup.tsx',
|
|
68
|
+
'_blank'
|
|
69
|
+
);
|
|
70
|
+
},
|
|
71
|
+
}
|
|
72
|
+
]}
|
|
72
73
|
/>
|
|
73
74
|
|
|
74
75
|
<Controls of={RadioGroupStories.Documentation} />
|
|
75
76
|
|
|
76
|
-
> **Note:** While the `required` prop will show the required indicator (
|
|
77
|
+
> **Note:** While the `required` prop will show the required indicator (\*) next to the label, you need to implement the validation logic using the `validation` and `onBlur` props to handle the actual validation behavior.
|
|
77
78
|
|
|
78
79
|
```jsx
|
|
79
80
|
import React, { useState } from "react";
|
|
@@ -81,43 +82,43 @@ import React, { useState } from "react";
|
|
|
81
82
|
import { RadioGroup } from "@webiny/admin-ui";
|
|
82
83
|
|
|
83
84
|
const RadioGroupExample = () => {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
85
|
+
const [value, setValue] = useState("");
|
|
86
|
+
const [validation, setValidation] = useState({ isValid: true, message: "" });
|
|
87
|
+
|
|
88
|
+
const handleValidation = () => {
|
|
89
|
+
if (!value) {
|
|
90
|
+
setValidation({ isValid: false, message: "This field is required" });
|
|
91
|
+
} else {
|
|
92
|
+
setValidation({ isValid: true, message: "" });
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
return (
|
|
97
|
+
<RadioGroup
|
|
98
|
+
label="Deployment Option"
|
|
99
|
+
description="Choose your preferred deployment method"
|
|
100
|
+
note="This setting will determine how your application is deployed"
|
|
101
|
+
required={true}
|
|
102
|
+
items={[
|
|
103
|
+
{
|
|
104
|
+
label: "Automatic Deployment",
|
|
105
|
+
value: "automatic"
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
label: "Manual Deployment",
|
|
109
|
+
value: "manual"
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
label: "Scheduled Deployment",
|
|
113
|
+
value: "scheduled"
|
|
92
114
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
required={true}
|
|
101
|
-
items={[
|
|
102
|
-
{
|
|
103
|
-
label: "Automatic Deployment",
|
|
104
|
-
value: "automatic"
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
label: "Manual Deployment",
|
|
108
|
-
value: "manual"
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
label: "Scheduled Deployment",
|
|
112
|
-
value: "scheduled"
|
|
113
|
-
}
|
|
114
|
-
]}
|
|
115
|
-
value={value}
|
|
116
|
-
validation={validation}
|
|
117
|
-
onChange={newValue => setValue(newValue)}
|
|
118
|
-
onBlur={handleValidation}
|
|
119
|
-
/>
|
|
120
|
-
);
|
|
115
|
+
]}
|
|
116
|
+
value={value}
|
|
117
|
+
validation={validation}
|
|
118
|
+
onChange={newValue => setValue(newValue)}
|
|
119
|
+
onBlur={handleValidation}
|
|
120
|
+
/>
|
|
121
|
+
);
|
|
121
122
|
};
|
|
122
123
|
|
|
123
124
|
export default RadioGroupExample;
|
|
@@ -126,23 +127,25 @@ export default RadioGroupExample;
|
|
|
126
127
|
## Anatomy
|
|
127
128
|
|
|
128
129
|
### General
|
|
130
|
+
|
|
129
131
|
Radio input enable users to select a single item from a list of offered choices. A radio input group organizes related radio input options together for better clarity and functionality.
|
|
130
132
|
|
|
131
|
-
<img src="/images/storybook/radio-group/anatomy.png" alt="Anatomy"/>
|
|
133
|
+
<img src="/images/storybook/radio-group/anatomy.png" alt="Anatomy" />
|
|
132
134
|
|
|
133
135
|
### Radio input options
|
|
136
|
+
|
|
134
137
|
Radio inputs can exist in two different states: Selected and Not Selected. When a radio input is used for bulk selection, all other options must be excluded since the very purpose of a radio input is to provide only one selectable option.
|
|
135
|
-
|
|
138
|
+
|
|
139
|
+
<img src="/images/storybook/radio-group/options.png" alt="Radio input options" />
|
|
136
140
|
|
|
137
141
|
### States
|
|
138
|
-
|
|
142
|
+
|
|
143
|
+
<img src="/images/storybook/radio-group/states.png" alt="States" />
|
|
139
144
|
|
|
140
145
|
## Usage
|
|
141
146
|
|
|
142
147
|
### Text overflow
|
|
143
|
-
When the radio item text content is too long for the horizontal space available, the content should wrap to form another line aligning the text and checkbox on top.
|
|
144
|
-
|
|
145
|
-
<img src="/images/storybook/radio-group/text-overflow.png" alt="Text overflow"/>
|
|
146
|
-
|
|
147
148
|
|
|
149
|
+
When the radio item text content is too long for the horizontal space available, the content should wrap to form another line aligning the text and checkbox on top.
|
|
148
150
|
|
|
151
|
+
<img src="/images/storybook/radio-group/text-overflow.png" alt="Text overflow" />
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","RadioGroup","RadioGroupPrimitives","cn","Radio","useRadioGroup","RadioGroupRoot","className","props","createElement","Root","Object","assign","RadioGroupRenderer","items","changeValue","value","disabled","onValueChange","map","item","id","key","label","RadioGroupPrimitive","vm","DeprecatedRadioGroup"],"sources":["RadioGroupPrimitive.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { RadioGroup as RadioGroupPrimitives } from \"radix-ui\";\nimport { cn } from \"~/utils.js\";\nimport { Radio } from \"./Radio.js\";\nimport type { RadioItemParams, RadioItemFormatted } from \"../domains/index.js\";\nimport { useRadioGroup } from \"./useRadioGroup.js\";\n\n/**\n * Radio Group Root\n */\nconst RadioGroupRoot = ({ className, ...props }: RadioGroupPrimitives.RadioGroupProps) => {\n return (\n <RadioGroupPrimitives.Root\n className={cn(\"grid gap-sm-extra py-xs-plus\", className)}\n {...props}\n />\n );\n};\n\n/**\n * Radio Group Renderer\n */\ninterface RadioGroupPrimitiveProps
|
|
1
|
+
{"version":3,"names":["React","RadioGroup","RadioGroupPrimitives","cn","Radio","useRadioGroup","RadioGroupRoot","className","props","createElement","Root","Object","assign","RadioGroupRenderer","items","changeValue","value","disabled","onValueChange","map","item","id","key","label","RadioGroupPrimitive","vm","DeprecatedRadioGroup"],"sources":["RadioGroupPrimitive.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { RadioGroup as RadioGroupPrimitives } from \"radix-ui\";\nimport { cn } from \"~/utils.js\";\nimport { Radio } from \"./Radio.js\";\nimport type { RadioItemParams, RadioItemFormatted } from \"../domains/index.js\";\nimport { useRadioGroup } from \"./useRadioGroup.js\";\n\n/**\n * Radio Group Root\n */\nconst RadioGroupRoot = ({ className, ...props }: RadioGroupPrimitives.RadioGroupProps) => {\n return (\n <RadioGroupPrimitives.Root\n className={cn(\"grid gap-sm-extra py-xs-plus\", className)}\n {...props}\n />\n );\n};\n\n/**\n * Radio Group Renderer\n */\ninterface RadioGroupPrimitiveProps extends Omit<\n RadioGroupPrimitives.RadioGroupProps,\n \"defaultValue\" | \"onChange\" | \"onValueChange\" | \"value\"\n> {\n items: RadioItemParams[];\n /**\n * Callback triggered when the selected value changes.\n */\n onChange?: (value: string) => void;\n /**\n * Optional selected item.\n */\n value?: string;\n}\n\ninterface RadioGroupVm {\n items: RadioItemFormatted[];\n}\n\ninterface RadioGroupRendererProps extends Omit<RadioGroupPrimitiveProps, \"onChange\"> {\n items: RadioItemFormatted[];\n changeValue: (value: string) => void;\n}\n\nconst RadioGroupRenderer = ({ items, changeValue, value, disabled }: RadioGroupRendererProps) => {\n return (\n <RadioGroupRoot\n value={value ?? \"\"}\n onValueChange={value => changeValue(value)}\n disabled={disabled}\n >\n {items.map(item => (\n <Radio\n id={item.id}\n value={item.value}\n key={item.id}\n label={item.label}\n disabled={item.disabled}\n />\n ))}\n </RadioGroupRoot>\n );\n};\n\n/**\n * Radio Group Primitive\n */\nconst RadioGroupPrimitive = (props: RadioGroupPrimitiveProps) => {\n const { vm, changeValue } = useRadioGroup(props);\n return <RadioGroupRenderer {...props} items={vm.items} changeValue={changeValue} />;\n};\n\n/**\n * @deprecated\n * This component is retained in @webiny/admin-ui and used in @webiny/ui solely as a compatibility layer.\n * It is marked as deprecated because nesting `Radio` components inside `RadioGroup` is no longer the recommended approach.\n * Instead, we now pass an array of `RadioItemDto` directly to `RadioGroup` for better maintainability.\n */\nconst DeprecatedRadioGroup = RadioGroupRoot;\n\nexport {\n RadioGroupPrimitive,\n RadioGroupRenderer,\n DeprecatedRadioGroup,\n type RadioGroupPrimitiveProps,\n type RadioGroupVm\n};\n"],"mappings":"AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAC9B,SAASC,UAAU,IAAIC,oBAAoB,QAAQ,UAAU;AAC7D,SAASC,EAAE;AACX,SAASC,KAAK;AAEd,SAASC,aAAa;;AAEtB;AACA;AACA;AACA,MAAMC,cAAc,GAAGA,CAAC;EAAEC,SAAS;EAAE,GAAGC;AAA4C,CAAC,KAAK;EACtF,oBACIR,KAAA,CAAAS,aAAA,CAACP,oBAAoB,CAACQ,IAAI,EAAAC,MAAA,CAAAC,MAAA;IACtBL,SAAS,EAAEJ,EAAE,CAAC,8BAA8B,EAAEI,SAAS;EAAE,GACrDC,KAAK,CACZ,CAAC;AAEV,CAAC;;AAED;AACA;AACA;;AAyBA,MAAMK,kBAAkB,GAAGA,CAAC;EAAEC,KAAK;EAAEC,WAAW;EAAEC,KAAK;EAAEC;AAAkC,CAAC,KAAK;EAC7F,oBACIjB,KAAA,CAAAS,aAAA,CAACH,cAAc;IACXU,KAAK,EAAEA,KAAK,IAAI,EAAG;IACnBE,aAAa,EAAEF,KAAK,IAAID,WAAW,CAACC,KAAK,CAAE;IAC3CC,QAAQ,EAAEA;EAAS,GAElBH,KAAK,CAACK,GAAG,CAACC,IAAI,iBACXpB,KAAA,CAAAS,aAAA,CAACL,KAAK;IACFiB,EAAE,EAAED,IAAI,CAACC,EAAG;IACZL,KAAK,EAAEI,IAAI,CAACJ,KAAM;IAClBM,GAAG,EAAEF,IAAI,CAACC,EAAG;IACbE,KAAK,EAAEH,IAAI,CAACG,KAAM;IAClBN,QAAQ,EAAEG,IAAI,CAACH;EAAS,CAC3B,CACJ,CACW,CAAC;AAEzB,CAAC;;AAED;AACA;AACA;AACA,MAAMO,mBAAmB,GAAIhB,KAA+B,IAAK;EAC7D,MAAM;IAAEiB,EAAE;IAAEV;EAAY,CAAC,GAAGV,aAAa,CAACG,KAAK,CAAC;EAChD,oBAAOR,KAAA,CAAAS,aAAA,CAACI,kBAAkB,EAAAF,MAAA,CAAAC,MAAA,KAAKJ,KAAK;IAAEM,KAAK,EAAEW,EAAE,CAACX,KAAM;IAACC,WAAW,EAAEA;EAAY,EAAE,CAAC;AACvF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,MAAMW,oBAAoB,GAAGpB,cAAc;AAE3C,SACIkB,mBAAmB,EACnBX,kBAAkB,EAClBa,oBAAoB","ignoreList":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Canvas, Meta, Controls } from
|
|
1
|
+
import { Canvas, Meta, Controls } from "@storybook/addon-docs/blocks";
|
|
2
2
|
|
|
3
|
-
import * as RangeSliderStories from
|
|
3
|
+
import * as RangeSliderStories from "./RangeSlider.stories";
|
|
4
4
|
|
|
5
5
|
<Meta of={RangeSliderStories} />
|
|
6
6
|
|
|
@@ -15,8 +15,8 @@ import React, { useState } from "react";
|
|
|
15
15
|
import { RangeSlider } from "@webiny/admin-ui";
|
|
16
16
|
|
|
17
17
|
const RangeSliderExample = () => {
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
const [values, setValues] = useState([25, 75]);
|
|
19
|
+
const [validation, setValidation] = useState({ isValid: true, message: "" });
|
|
20
20
|
|
|
21
21
|
const handleChange = (newValues: number[]) => {
|
|
22
22
|
setValues(newValues);
|
|
@@ -46,62 +46,63 @@ const RangeSliderExample = () => {
|
|
|
46
46
|
/>
|
|
47
47
|
</div>
|
|
48
48
|
);
|
|
49
|
+
|
|
49
50
|
};
|
|
50
51
|
|
|
51
52
|
export default RangeSliderExample;
|
|
52
53
|
|
|
53
54
|
` } }
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
55
|
+
additionalActions={[
|
|
56
|
+
{
|
|
57
|
+
title: 'Open in GitHub',
|
|
58
|
+
onClick: () => {
|
|
59
|
+
window.open(
|
|
60
|
+
'https://github.com/webiny/webiny-js/blob/feat/new-admin-ui/packages/admin-ui/src/RangeSlider/RangeSlider.tsx',
|
|
61
|
+
'_blank'
|
|
62
|
+
);
|
|
63
|
+
},
|
|
64
|
+
}
|
|
65
|
+
]}
|
|
65
66
|
/>
|
|
66
67
|
|
|
67
|
-
<Controls of={RangeSliderStories.Documentation} exclude={["onValuesChange", "onValuesCommit"]}/>
|
|
68
|
+
<Controls of={RangeSliderStories.Documentation} exclude={["onValuesChange", "onValuesCommit"]} />
|
|
68
69
|
|
|
69
70
|
```tsx
|
|
70
71
|
import React, { useState } from "react";
|
|
71
72
|
import { RangeSlider } from "@webiny/admin-ui";
|
|
72
73
|
|
|
73
74
|
const RangeSliderExample = () => {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
75
|
+
const [values, setValues] = useState([25, 75]);
|
|
76
|
+
const [validation, setValidation] = useState({ isValid: true, message: "" });
|
|
77
|
+
|
|
78
|
+
const handleChange = (newValues: number[]) => {
|
|
79
|
+
setValues(newValues);
|
|
80
|
+
|
|
81
|
+
if (newValues[0] === 0 && newValues[1] === 0) {
|
|
82
|
+
setValidation({ isValid: false, message: "Please select a range" });
|
|
83
|
+
} else {
|
|
84
|
+
setValidation({ isValid: true, message: "" });
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
return (
|
|
89
|
+
<div>
|
|
90
|
+
<RangeSlider
|
|
91
|
+
label="Price Range"
|
|
92
|
+
description="Select the minimum and maximum price range"
|
|
93
|
+
note="Note: The selected range will filter available products"
|
|
94
|
+
min={0}
|
|
95
|
+
max={100}
|
|
96
|
+
step={1}
|
|
97
|
+
values={values}
|
|
98
|
+
required={true}
|
|
99
|
+
onValuesChange={handleChange}
|
|
100
|
+
showTooltip={true}
|
|
101
|
+
transformValue={value => `$${value}`}
|
|
102
|
+
validation={validation}
|
|
103
|
+
/>
|
|
104
|
+
</div>
|
|
105
|
+
);
|
|
105
106
|
};
|
|
106
107
|
|
|
107
108
|
export default RangeSliderExample;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","SliderRoot","SliderThumb","SliderTrack","useRangeSlider","RangeSliderPrimitiveRenderer","tooltipSide","textValues","showTooltip","values","sliderProps","createElement","className","Object","assign","value","textValue","RangeSliderPrimitive","props","transformValue","onValuesChange","onValuesCommit","restProps","vm","changeValues","commitValues","onValueChange","onValueCommit"],"sources":["RangeSliderPrimitive.tsx"],"sourcesContent":["import * as React from \"react\";\nimport type { Slider as SliderPrimitives } from \"radix-ui\";\nimport { SliderRoot, SliderThumb, type SliderThumbProps, SliderTrack } from \"~/Slider/index.js\";\nimport { useRangeSlider } from \"./useRangeSlider.js\";\n\ninterface RangeSliderPrimitiveRootProps
|
|
1
|
+
{"version":3,"names":["React","SliderRoot","SliderThumb","SliderTrack","useRangeSlider","RangeSliderPrimitiveRenderer","tooltipSide","textValues","showTooltip","values","sliderProps","createElement","className","Object","assign","value","textValue","RangeSliderPrimitive","props","transformValue","onValuesChange","onValuesCommit","restProps","vm","changeValues","commitValues","onValueChange","onValueCommit"],"sources":["RangeSliderPrimitive.tsx"],"sourcesContent":["import * as React from \"react\";\nimport type { Slider as SliderPrimitives } from \"radix-ui\";\nimport { SliderRoot, SliderThumb, type SliderThumbProps, SliderTrack } from \"~/Slider/index.js\";\nimport { useRangeSlider } from \"./useRangeSlider.js\";\n\ninterface RangeSliderPrimitiveRootProps extends Omit<\n SliderPrimitives.SliderProps,\n \"min\" | \"max\" | \"value\"\n> {\n /**\n * Array of numbers representing the current values of the range slider.\n */\n values: number[];\n /**\n * Minimum value of the range slider.\n */\n min: number;\n /**\n * Maximum value of the range slider.\n */\n max: number;\n}\n\ninterface RangeSliderPrimitiveThumbProps extends Omit<SliderThumbProps, \"labelValue\"> {\n textValues: string[];\n}\n\ninterface RangeSliderPrimitiveVm\n extends RangeSliderPrimitiveRootProps, Omit<RangeSliderPrimitiveThumbProps, \"textValue\"> {\n textValues: string[];\n}\n\n/**\n * RangeSliderRenderer\n */\n\nconst RangeSliderPrimitiveRenderer = ({\n tooltipSide,\n textValues,\n showTooltip,\n values,\n ...sliderProps\n}: RangeSliderPrimitiveVm) => {\n return (\n <div className={\"flex h-md w-full\"}>\n <SliderRoot {...sliderProps} value={values}>\n <SliderTrack />\n <SliderThumb\n showTooltip={showTooltip}\n tooltipSide={tooltipSide}\n textValue={textValues[0]}\n />\n <SliderThumb\n showTooltip={showTooltip}\n tooltipSide={tooltipSide}\n textValue={textValues[1]}\n />\n </SliderRoot>\n </div>\n );\n};\n\n/**\n * RangeSlider\n */\ninterface RangeSliderPrimitiveProps extends Omit<\n SliderPrimitives.SliderProps,\n \"defaultValue\" | \"value\" | \"onValueChange\" | \"onValueCommit\"\n> {\n onValuesChange: (values: number[]) => void;\n onValuesCommit?: (values: number[]) => void;\n showTooltip?: boolean;\n tooltipSide?: \"top\" | \"bottom\";\n transformValue?: (value: number) => string;\n values?: number[];\n}\n\nconst RangeSliderPrimitive = (props: RangeSliderPrimitiveProps) => {\n const { transformValue, onValuesChange, onValuesCommit, ...restProps } = props; // Rename transformValue to _ to avoid ESLint warning\n const { vm, changeValues, commitValues } = useRangeSlider({\n ...restProps,\n transformValue,\n onValuesChange,\n onValuesCommit\n });\n\n return (\n <RangeSliderPrimitiveRenderer\n {...restProps}\n {...vm}\n onValueChange={changeValues}\n onValueCommit={commitValues}\n />\n );\n};\n\nexport {\n RangeSliderPrimitive,\n RangeSliderPrimitiveRenderer,\n type RangeSliderPrimitiveProps,\n type RangeSliderPrimitiveVm\n};\n"],"mappings":"AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAE9B,SAASC,UAAU,EAAEC,WAAW,EAAyBC,WAAW;AACpE,SAASC,cAAc;AA6BvB;AACA;AACA;;AAEA,MAAMC,4BAA4B,GAAGA,CAAC;EAClCC,WAAW;EACXC,UAAU;EACVC,WAAW;EACXC,MAAM;EACN,GAAGC;AACiB,CAAC,KAAK;EAC1B,oBACIV,KAAA,CAAAW,aAAA;IAAKC,SAAS,EAAE;EAAmB,gBAC/BZ,KAAA,CAAAW,aAAA,CAACV,UAAU,EAAAY,MAAA,CAAAC,MAAA,KAAKJ,WAAW;IAAEK,KAAK,EAAEN;EAAO,iBACvCT,KAAA,CAAAW,aAAA,CAACR,WAAW,MAAE,CAAC,eACfH,KAAA,CAAAW,aAAA,CAACT,WAAW;IACRM,WAAW,EAAEA,WAAY;IACzBF,WAAW,EAAEA,WAAY;IACzBU,SAAS,EAAET,UAAU,CAAC,CAAC;EAAE,CAC5B,CAAC,eACFP,KAAA,CAAAW,aAAA,CAACT,WAAW;IACRM,WAAW,EAAEA,WAAY;IACzBF,WAAW,EAAEA,WAAY;IACzBU,SAAS,EAAET,UAAU,CAAC,CAAC;EAAE,CAC5B,CACO,CACX,CAAC;AAEd,CAAC;;AAED;AACA;AACA;;AAaA,MAAMU,oBAAoB,GAAIC,KAAgC,IAAK;EAC/D,MAAM;IAAEC,cAAc;IAAEC,cAAc;IAAEC,cAAc;IAAE,GAAGC;EAAU,CAAC,GAAGJ,KAAK,CAAC,CAAC;EAChF,MAAM;IAAEK,EAAE;IAAEC,YAAY;IAAEC;EAAa,CAAC,GAAGrB,cAAc,CAAC;IACtD,GAAGkB,SAAS;IACZH,cAAc;IACdC,cAAc;IACdC;EACJ,CAAC,CAAC;EAEF,oBACIrB,KAAA,CAAAW,aAAA,CAACN,4BAA4B,EAAAQ,MAAA,CAAAC,MAAA,KACrBQ,SAAS,EACTC,EAAE;IACNG,aAAa,EAAEF,YAAa;IAC5BG,aAAa,EAAEF;EAAa,EAC/B,CAAC;AAEV,CAAC;AAED,SACIR,oBAAoB,EACpBZ,4BAA4B","ignoreList":[]}
|
|
@@ -2,7 +2,7 @@ import * as React from "react";
|
|
|
2
2
|
import { type VariantProps } from "../../../utils.js";
|
|
3
3
|
declare const rangeSliderValueVariants: (props?: ({
|
|
4
4
|
disabled?: boolean | null | undefined;
|
|
5
|
-
} & import("class-variance-authority/
|
|
5
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
6
6
|
interface RangeSliderValueProps extends React.HTMLAttributes<HTMLSpanElement>, VariantProps<typeof rangeSliderValueVariants> {
|
|
7
7
|
value: string;
|
|
8
8
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","cn","cva","rangeSliderValueVariants","variants","disabled","true","RangeSliderValue","value","className","createElement"],"sources":["RangeSliderValue.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn, cva, type VariantProps } from \"~/utils.js\";\n\nconst rangeSliderValueVariants = cva(\"font-normal text-sm leading-none\", {\n variants: {\n disabled: {\n true: \"text-neutral-disabled cursor-not-allowed\"\n }\n }\n});\n\ninterface RangeSliderValueProps\n extends React.HTMLAttributes<HTMLSpanElement
|
|
1
|
+
{"version":3,"names":["React","cn","cva","rangeSliderValueVariants","variants","disabled","true","RangeSliderValue","value","className","createElement"],"sources":["RangeSliderValue.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn, cva, type VariantProps } from \"~/utils.js\";\n\nconst rangeSliderValueVariants = cva(\"font-normal text-sm leading-none\", {\n variants: {\n disabled: {\n true: \"text-neutral-disabled cursor-not-allowed\"\n }\n }\n});\n\ninterface RangeSliderValueProps\n extends React.HTMLAttributes<HTMLSpanElement>, VariantProps<typeof rangeSliderValueVariants> {\n value: string;\n}\n\nconst RangeSliderValue = ({ value, disabled, className }: RangeSliderValueProps) => {\n if (!value) {\n return null;\n }\n return <span className={cn(rangeSliderValueVariants({ disabled }), className)}>{value}</span>;\n};\n\nexport { RangeSliderValue, type RangeSliderValueProps };\n"],"mappings":"AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAC9B,SAASC,EAAE,EAAEC,GAAG;AAEhB,MAAMC,wBAAwB,GAAGD,GAAG,CAAC,kCAAkC,EAAE;EACrEE,QAAQ,EAAE;IACNC,QAAQ,EAAE;MACNC,IAAI,EAAE;IACV;EACJ;AACJ,CAAC,CAAC;AAOF,MAAMC,gBAAgB,GAAGA,CAAC;EAAEC,KAAK;EAAEH,QAAQ;EAAEI;AAAiC,CAAC,KAAK;EAChF,IAAI,CAACD,KAAK,EAAE;IACR,OAAO,IAAI;EACf;EACA,oBAAOR,KAAA,CAAAU,aAAA;IAAMD,SAAS,EAAER,EAAE,CAACE,wBAAwB,CAAC;MAAEE;IAAS,CAAC,CAAC,EAAEI,SAAS;EAAE,GAAED,KAAY,CAAC;AACjG,CAAC;AAED,SAASD,gBAAgB","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","ScrollAreaPrimitive","cn","ScrollArea","className","children","onScrollPositionChange","onScroll","props","viewportRef","useRef","useEffect","viewport","current","handleScroll","scrollTop","scrollLeft","scrollHeight","scrollWidth","clientHeight","clientWidth","position","top","left","addEventListener","removeEventListener","createElement","Root","Object","assign","Viewport","ref","ScrollBar","Corner","orientation","ScrollAreaScrollbar","ScrollAreaThumb"],"sources":["ScrollArea.tsx"],"sourcesContent":["import * as React from \"react\";\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\";\nimport { cn } from \"~/utils.js\";\n\nexport interface ScrollPosition {\n top: number;\n left: number;\n scrollTop: number;\n scrollLeft: number;\n scrollHeight: number;\n scrollWidth: number;\n clientHeight: number;\n clientWidth: number;\n}\n\ninterface ScrollAreaProps
|
|
1
|
+
{"version":3,"names":["React","ScrollAreaPrimitive","cn","ScrollArea","className","children","onScrollPositionChange","onScroll","props","viewportRef","useRef","useEffect","viewport","current","handleScroll","scrollTop","scrollLeft","scrollHeight","scrollWidth","clientHeight","clientWidth","position","top","left","addEventListener","removeEventListener","createElement","Root","Object","assign","Viewport","ref","ScrollBar","Corner","orientation","ScrollAreaScrollbar","ScrollAreaThumb"],"sources":["ScrollArea.tsx"],"sourcesContent":["import * as React from \"react\";\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\";\nimport { cn } from \"~/utils.js\";\n\nexport interface ScrollPosition {\n top: number;\n left: number;\n scrollTop: number;\n scrollLeft: number;\n scrollHeight: number;\n scrollWidth: number;\n clientHeight: number;\n clientWidth: number;\n}\n\ninterface ScrollAreaProps extends Omit<\n React.ComponentProps<typeof ScrollAreaPrimitive.Root>,\n \"onScroll\"\n> {\n onScrollPositionChange?: (position: ScrollPosition) => void;\n onScroll?: (position: ScrollPosition) => void;\n}\n\nfunction ScrollArea({\n className,\n children,\n onScrollPositionChange,\n onScroll,\n ...props\n}: ScrollAreaProps) {\n const viewportRef = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n const viewport = viewportRef.current;\n if (!viewport || (!onScrollPositionChange && !onScroll)) {\n return;\n }\n\n // The Viewport component itself is the scrollable element.\n const handleScroll = () => {\n const { scrollTop, scrollLeft, scrollHeight, scrollWidth, clientHeight, clientWidth } =\n viewport;\n\n const position: ScrollPosition = {\n top: scrollHeight > clientHeight ? scrollTop / (scrollHeight - clientHeight) : 0,\n left: scrollWidth > clientWidth ? scrollLeft / (scrollWidth - clientWidth) : 0,\n scrollTop,\n scrollLeft,\n scrollHeight,\n scrollWidth,\n clientHeight,\n clientWidth\n };\n\n onScrollPositionChange?.(position);\n onScroll?.(position);\n };\n\n // Call handleScroll initially to provide initial position.\n handleScroll();\n\n viewport.addEventListener(\"scroll\", handleScroll);\n return () => viewport.removeEventListener(\"scroll\", handleScroll);\n }, [onScrollPositionChange, onScroll]);\n\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn(\"relative\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n ref={viewportRef}\n data-slot=\"scroll-area-viewport\"\n className=\"focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1\"\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n );\n}\n\nfunction ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-area-scrollbar\"\n orientation={orientation}\n className={cn(\n \"flex touch-none transition-colors select-none\",\n orientation === \"vertical\" && \"h-full w-[8px] border-l border-l-transparent\",\n orientation === \"horizontal\" && \"h-[8px] flex-col border-t border-t-transparent\",\n className\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className=\"bg-neutral-strong/70 relative flex-1 rounded-full\"\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n );\n}\n\nexport { ScrollArea, ScrollBar };\n"],"mappings":"AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAC9B,OAAO,KAAKC,mBAAmB,MAAM,6BAA6B;AAClE,SAASC,EAAE;AAqBX,SAASC,UAAUA,CAAC;EAChBC,SAAS;EACTC,QAAQ;EACRC,sBAAsB;EACtBC,QAAQ;EACR,GAAGC;AACU,CAAC,EAAE;EAChB,MAAMC,WAAW,GAAGT,KAAK,CAACU,MAAM,CAAiB,IAAI,CAAC;EAEtDV,KAAK,CAACW,SAAS,CAAC,MAAM;IAClB,MAAMC,QAAQ,GAAGH,WAAW,CAACI,OAAO;IACpC,IAAI,CAACD,QAAQ,IAAK,CAACN,sBAAsB,IAAI,CAACC,QAAS,EAAE;MACrD;IACJ;;IAEA;IACA,MAAMO,YAAY,GAAGA,CAAA,KAAM;MACvB,MAAM;QAAEC,SAAS;QAAEC,UAAU;QAAEC,YAAY;QAAEC,WAAW;QAAEC,YAAY;QAAEC;MAAY,CAAC,GACjFR,QAAQ;MAEZ,MAAMS,QAAwB,GAAG;QAC7BC,GAAG,EAAEL,YAAY,GAAGE,YAAY,GAAGJ,SAAS,IAAIE,YAAY,GAAGE,YAAY,CAAC,GAAG,CAAC;QAChFI,IAAI,EAAEL,WAAW,GAAGE,WAAW,GAAGJ,UAAU,IAAIE,WAAW,GAAGE,WAAW,CAAC,GAAG,CAAC;QAC9EL,SAAS;QACTC,UAAU;QACVC,YAAY;QACZC,WAAW;QACXC,YAAY;QACZC;MACJ,CAAC;MAEDd,sBAAsB,GAAGe,QAAQ,CAAC;MAClCd,QAAQ,GAAGc,QAAQ,CAAC;IACxB,CAAC;;IAED;IACAP,YAAY,CAAC,CAAC;IAEdF,QAAQ,CAACY,gBAAgB,CAAC,QAAQ,EAAEV,YAAY,CAAC;IACjD,OAAO,MAAMF,QAAQ,CAACa,mBAAmB,CAAC,QAAQ,EAAEX,YAAY,CAAC;EACrE,CAAC,EAAE,CAACR,sBAAsB,EAAEC,QAAQ,CAAC,CAAC;EAEtC,oBACIP,KAAA,CAAA0B,aAAA,CAACzB,mBAAmB,CAAC0B,IAAI,EAAAC,MAAA,CAAAC,MAAA;IACrB,aAAU,aAAa;IACvBzB,SAAS,EAAEF,EAAE,CAAC,UAAU,EAAEE,SAAS;EAAE,GACjCI,KAAK,gBAETR,KAAA,CAAA0B,aAAA,CAACzB,mBAAmB,CAAC6B,QAAQ;IACzBC,GAAG,EAAEtB,WAAY;IACjB,aAAU,sBAAsB;IAChCL,SAAS,EAAC;EAAoJ,GAE7JC,QACyB,CAAC,eAC/BL,KAAA,CAAA0B,aAAA,CAACM,SAAS,MAAE,CAAC,eACbhC,KAAA,CAAA0B,aAAA,CAACzB,mBAAmB,CAACgC,MAAM,MAAE,CACP,CAAC;AAEnC;AAEA,SAASD,SAASA,CAAC;EACf5B,SAAS;EACT8B,WAAW,GAAG,UAAU;EACxB,GAAG1B;AAC+D,CAAC,EAAE;EACrE,oBACIR,KAAA,CAAA0B,aAAA,CAACzB,mBAAmB,CAACkC,mBAAmB,EAAAP,MAAA,CAAAC,MAAA;IACpC,aAAU,uBAAuB;IACjCK,WAAW,EAAEA,WAAY;IACzB9B,SAAS,EAAEF,EAAE,CACT,+CAA+C,EAC/CgC,WAAW,KAAK,UAAU,IAAI,8CAA8C,EAC5EA,WAAW,KAAK,YAAY,IAAI,gDAAgD,EAChF9B,SACJ;EAAE,GACEI,KAAK,gBAETR,KAAA,CAAA0B,aAAA,CAACzB,mBAAmB,CAACmC,eAAe;IAChC,aAAU,mBAAmB;IAC7BhC,SAAS,EAAC;EAAmD,CAChE,CACoC,CAAC;AAElD;AAEA,SAASD,UAAU,EAAE6B,SAAS","ignoreList":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Canvas, Meta, Controls } from
|
|
1
|
+
import { Canvas, Meta, Controls } from "@storybook/addon-docs/blocks";
|
|
2
2
|
|
|
3
|
-
import * as SegmentedControlStories from
|
|
3
|
+
import * as SegmentedControlStories from "./SegmentedControl.stories";
|
|
4
4
|
|
|
5
5
|
<Meta of={SegmentedControlStories} />
|
|
6
6
|
|
|
@@ -24,19 +24,19 @@ import { SegmentedControl } from "@webiny/admin-ui";
|
|
|
24
24
|
import { useState } from "react";
|
|
25
25
|
|
|
26
26
|
const MyComponent = () => {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
27
|
+
const [value, setValue] = useState("option1");
|
|
28
|
+
|
|
29
|
+
return (
|
|
30
|
+
<SegmentedControl
|
|
31
|
+
items={[
|
|
32
|
+
{ label: "Option 1", value: "option1" },
|
|
33
|
+
{ label: "Option 2", value: "option2" },
|
|
34
|
+
{ label: "Option 3", value: "option3" }
|
|
35
|
+
]}
|
|
36
|
+
value={value}
|
|
37
|
+
onChange={setValue}
|
|
38
|
+
/>
|
|
39
|
+
);
|
|
40
40
|
};
|
|
41
41
|
```
|
|
42
42
|
|
|
@@ -47,38 +47,40 @@ import { SegmentedControl } from "@webiny/admin-ui";
|
|
|
47
47
|
import { Icon } from "@webiny/admin-ui";
|
|
48
48
|
|
|
49
49
|
<SegmentedControl
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
50
|
+
items={[
|
|
51
|
+
{ label: "Lock", value: "lock", icon: <Icon name="lock" /> },
|
|
52
|
+
{ label: "Unlock", value: "unlock", icon: <Icon name="lock-open" /> },
|
|
53
|
+
{ label: "Settings", value: "settings", icon: <Icon name="settings" /> }
|
|
54
|
+
]}
|
|
55
|
+
value={value}
|
|
56
|
+
onChange={setValue}
|
|
57
|
+
/>;
|
|
58
58
|
```
|
|
59
59
|
|
|
60
60
|
## Variants
|
|
61
61
|
|
|
62
62
|
### Accent (Default)
|
|
63
|
+
|
|
63
64
|
The accent variant uses the primary color for the selected state.
|
|
64
65
|
|
|
65
66
|
### Ghost
|
|
67
|
+
|
|
66
68
|
The ghost variant is designed for use on dark backgrounds, using a more subtle appearance.
|
|
67
69
|
|
|
68
70
|
## Form Integration
|
|
69
71
|
|
|
70
72
|
```tsx
|
|
71
73
|
<SegmentedControl
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
74
|
+
label="Select a plan"
|
|
75
|
+
description="Choose your subscription plan"
|
|
76
|
+
required
|
|
77
|
+
items={plans}
|
|
78
|
+
value={selectedPlan}
|
|
79
|
+
onChange={setSelectedPlan}
|
|
80
|
+
validation={{
|
|
81
|
+
isValid: false,
|
|
82
|
+
message: "Please select a plan"
|
|
83
|
+
}}
|
|
82
84
|
/>
|
|
83
85
|
```
|
|
84
86
|
|
|
@@ -86,38 +88,36 @@ The ghost variant is designed for use on dark backgrounds, using a more subtle a
|
|
|
86
88
|
|
|
87
89
|
### SegmentedControl Props
|
|
88
90
|
|
|
89
|
-
| Prop
|
|
90
|
-
|
|
91
|
-
| `items`
|
|
92
|
-
| `value`
|
|
93
|
-
| `onChange`
|
|
94
|
-
| `variant`
|
|
95
|
-
| `size`
|
|
96
|
-
| `disabled`
|
|
97
|
-
| `className`
|
|
98
|
-
| `label`
|
|
99
|
-
| `description` | `string \| React.ReactNode`
|
|
100
|
-
| `note`
|
|
101
|
-
| `required`
|
|
102
|
-
| `validation`
|
|
91
|
+
| Prop | Type | Default | Description |
|
|
92
|
+
| ------------- | ------------------------------ | ---------- | ------------------------------- |
|
|
93
|
+
| `items` | `SegmentedControlItemParams[]` | - | Array of items to display |
|
|
94
|
+
| `value` | `string` | - | Currently selected value |
|
|
95
|
+
| `onChange` | `(value: string) => void` | - | Callback when selection changes |
|
|
96
|
+
| `variant` | `"accent" \| "ghost"` | `"accent"` | Visual style variant |
|
|
97
|
+
| `size` | `"sm" \| "md"` | `"md"` | Size of the control |
|
|
98
|
+
| `disabled` | `boolean` | `false` | Disable all items |
|
|
99
|
+
| `className` | `string` | - | Additional CSS class |
|
|
100
|
+
| `label` | `string \| React.ReactNode` | - | Form label |
|
|
101
|
+
| `description` | `string \| React.ReactNode` | - | Form description |
|
|
102
|
+
| `note` | `string \| React.ReactNode` | - | Form note |
|
|
103
|
+
| `required` | `boolean` | - | Show required indicator |
|
|
104
|
+
| `validation` | `object` | - | Validation state and message |
|
|
103
105
|
|
|
104
106
|
### SegmentedControlItemParams
|
|
105
107
|
|
|
106
|
-
| Prop
|
|
107
|
-
|
|
108
|
-
| `label`
|
|
109
|
-
| `value`
|
|
110
|
-
| `disabled` | `boolean`
|
|
111
|
-
| `icon`
|
|
112
|
-
| `id`
|
|
108
|
+
| Prop | Type | Default | Description |
|
|
109
|
+
| ---------- | --------------------------- | ------- | -------------------------- |
|
|
110
|
+
| `label` | `string \| React.ReactNode` | - | Item label |
|
|
111
|
+
| `value` | `string \| number` | - | Item value |
|
|
112
|
+
| `disabled` | `boolean` | `false` | Disable this specific item |
|
|
113
|
+
| `icon` | `React.ReactNode` | - | Optional icon to display |
|
|
114
|
+
| `id` | `string` | - | Optional custom ID |
|
|
113
115
|
|
|
114
116
|
## Examples
|
|
115
117
|
|
|
116
|
-
<Canvas of={SegmentedControlStories.
|
|
117
|
-
<Canvas of={SegmentedControlStories.
|
|
118
|
+
<Canvas of={SegmentedControlStories.Default} />
|
|
119
|
+
<Canvas of={SegmentedControlStories.VariantLight} />
|
|
120
|
+
<Canvas of={SegmentedControlStories.VariantDimmed} />
|
|
118
121
|
<Canvas of={SegmentedControlStories.VariantGhost} />
|
|
119
|
-
<Canvas of={SegmentedControlStories.StatesAccent} />
|
|
120
|
-
<Canvas of={SegmentedControlStories.StatesGhost} />
|
|
121
122
|
<Canvas of={SegmentedControlStories.WithFormComponent} />
|
|
122
123
|
<Canvas of={SegmentedControlStories.Disabled} />
|
|
123
|
-
|
|
@@ -6,7 +6,7 @@ import type { SegmentedControlItemParams, SegmentedControlItemFormatted } from "
|
|
|
6
6
|
*/
|
|
7
7
|
declare const segmentedControlItemVariants: (props?: ({
|
|
8
8
|
variant?: "ghost" | "dimmed" | "light" | null | undefined;
|
|
9
|
-
} & import("class-variance-authority/
|
|
9
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
10
10
|
/**
|
|
11
11
|
* Segmented Control Primitive
|
|
12
12
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","cn","cva","useSegmentedControl","Icon","segmentedControlItemVariants","variants","variant","light","dimmed","ghost","defaultVariants","segmentedControlRootVariants","SegmentedControlItemButton","item","isActive","onValueChange","className","props","createElement","Object","assign","type","role","disabled","onClick","value","icon","size","label","String","color","SegmentedControlRenderer","items","changeValue","map","key","id","SegmentedControlPrimitive","vm"],"sources":["SegmentedControlPrimitive.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn, cva, type VariantProps } from \"~/utils.js\";\nimport type {\n SegmentedControlItemParams,\n SegmentedControlItemFormatted\n} from \"../domains/index.js\";\nimport { useSegmentedControl } from \"./useSegmentedControl.js\";\nimport { Icon } from \"~/Icon/index.js\";\n\n/**\n * Segmented Control Item Button\n */\nconst segmentedControlItemVariants = cva(\n [\n \"inline-flex items-center justify-center whitespace-nowrap transition-colors cursor-pointer relative rounded-md\",\n \"text-md px-sm-extra py-xs [&>svg]:size-md gap-xs\",\n \"focus-visible:outline-none focus-visible:ring-md focus-visible:ring-primary-dimmed focus-visible:ring-offset-0\",\n \"disabled:opacity-50 disabled:pointer-events-none disabled:cursor-not-allowed\"\n ],\n {\n variants: {\n variant: {\n light: [\n \"text-neutral-strong fill-neutral-xstrong\",\n \"data-[state=active]:text-neutral-primary data-[state=active]:fill-neutral-xstrong data-[state=active]:bg-neutral-base/80\",\n \"hover:data-[state=inactive]:text-neutral-primary\",\n \"hover:data-[state=inactive]:bg-neutral-base/80\",\n \"active:data-[state=inactive]:bg-neutral-base/80\"\n ],\n dimmed: [\n \"text-neutral-strong fill-neutral-xstrong\",\n \"data-[state=active]:text-neutral-primary data-[state=active]:fill-neutral-xstrong data-[state=active]:bg-neutral-base/80\",\n \"hover:data-[state=inactive]:text-neutral-primary\",\n \"hover:data-[state=inactive]:bg-neutral-base/80\",\n \"active:data-[state=inactive]:bg-neutral-base/80\"\n ],\n ghost: [\n \"text-neutral-strong fill-neutral-xstrong\",\n \"data-[state=active]:bg-neutral-dark/5\",\n \"hover:data-[state=inactive]:bg-neutral-dark/5\",\n \"active:data-[state=inactive]:bg-neutral-dark/5\"\n ]\n }\n },\n defaultVariants: {\n variant: \"light\"\n }\n }\n);\n\nconst segmentedControlRootVariants = cva(\"inline-flex rounded-md p-xxs gap-xs\", {\n variants: {\n variant: {\n light: \"bg-neutral-light\",\n dimmed: \"bg-neutral-dimmed\",\n ghost: \"\"\n }\n },\n defaultVariants: {\n variant: \"light\"\n }\n});\n\ninterface SegmentedControlItemProps
|
|
1
|
+
{"version":3,"names":["React","cn","cva","useSegmentedControl","Icon","segmentedControlItemVariants","variants","variant","light","dimmed","ghost","defaultVariants","segmentedControlRootVariants","SegmentedControlItemButton","item","isActive","onValueChange","className","props","createElement","Object","assign","type","role","disabled","onClick","value","icon","size","label","String","color","SegmentedControlRenderer","items","changeValue","map","key","id","SegmentedControlPrimitive","vm"],"sources":["SegmentedControlPrimitive.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn, cva, type VariantProps } from \"~/utils.js\";\nimport type {\n SegmentedControlItemParams,\n SegmentedControlItemFormatted\n} from \"../domains/index.js\";\nimport { useSegmentedControl } from \"./useSegmentedControl.js\";\nimport { Icon } from \"~/Icon/index.js\";\n\n/**\n * Segmented Control Item Button\n */\nconst segmentedControlItemVariants = cva(\n [\n \"inline-flex items-center justify-center whitespace-nowrap transition-colors cursor-pointer relative rounded-md\",\n \"text-md px-sm-extra py-xs [&>svg]:size-md gap-xs\",\n \"focus-visible:outline-none focus-visible:ring-md focus-visible:ring-primary-dimmed focus-visible:ring-offset-0\",\n \"disabled:opacity-50 disabled:pointer-events-none disabled:cursor-not-allowed\"\n ],\n {\n variants: {\n variant: {\n light: [\n \"text-neutral-strong fill-neutral-xstrong\",\n \"data-[state=active]:text-neutral-primary data-[state=active]:fill-neutral-xstrong data-[state=active]:bg-neutral-base/80\",\n \"hover:data-[state=inactive]:text-neutral-primary\",\n \"hover:data-[state=inactive]:bg-neutral-base/80\",\n \"active:data-[state=inactive]:bg-neutral-base/80\"\n ],\n dimmed: [\n \"text-neutral-strong fill-neutral-xstrong\",\n \"data-[state=active]:text-neutral-primary data-[state=active]:fill-neutral-xstrong data-[state=active]:bg-neutral-base/80\",\n \"hover:data-[state=inactive]:text-neutral-primary\",\n \"hover:data-[state=inactive]:bg-neutral-base/80\",\n \"active:data-[state=inactive]:bg-neutral-base/80\"\n ],\n ghost: [\n \"text-neutral-strong fill-neutral-xstrong\",\n \"data-[state=active]:bg-neutral-dark/5\",\n \"hover:data-[state=inactive]:bg-neutral-dark/5\",\n \"active:data-[state=inactive]:bg-neutral-dark/5\"\n ]\n }\n },\n defaultVariants: {\n variant: \"light\"\n }\n }\n);\n\nconst segmentedControlRootVariants = cva(\"inline-flex rounded-md p-xxs gap-xs\", {\n variants: {\n variant: {\n light: \"bg-neutral-light\",\n dimmed: \"bg-neutral-dimmed\",\n ghost: \"\"\n }\n },\n defaultVariants: {\n variant: \"light\"\n }\n});\n\ninterface SegmentedControlItemProps extends Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n \"value\"\n> {\n item: SegmentedControlItemFormatted;\n isActive: boolean;\n onValueChange: (value: string) => void;\n variant?: VariantProps<typeof segmentedControlItemVariants>[\"variant\"];\n}\n\nconst SegmentedControlItemButton = ({\n item,\n isActive,\n onValueChange,\n variant,\n className,\n ...props\n}: SegmentedControlItemProps) => {\n return (\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={isActive}\n data-state={isActive ? \"active\" : \"inactive\"}\n disabled={item.disabled}\n onClick={() => onValueChange(item.value)}\n className={cn(segmentedControlItemVariants({ variant }), className)}\n {...props}\n >\n {item.icon && (\n <Icon\n icon={item.icon}\n size={\"sm\"}\n label={String(item.label)}\n color={\"neutral-strong\"}\n />\n )}\n {item.label}\n </button>\n );\n};\n\n/**\n * Segmented Control Primitive\n */\ninterface SegmentedControlPrimitiveProps {\n items: SegmentedControlItemParams[];\n /**\n * Callback triggered when the selected value changes.\n */\n onChange?: (value: string) => void;\n /**\n * The selected value.\n */\n value?: string;\n /**\n * Visual style variant.\n */\n variant?: VariantProps<typeof segmentedControlItemVariants>[\"variant\"];\n /**\n * Additional class name.\n */\n className?: string;\n /**\n * Disabled state for all items.\n */\n disabled?: boolean;\n}\n\ninterface SegmentedControlVm {\n items: SegmentedControlItemFormatted[];\n}\n\ninterface SegmentedControlRendererProps extends SegmentedControlPrimitiveProps {\n items: SegmentedControlItemFormatted[];\n changeValue: (value: string) => void;\n}\n\nconst SegmentedControlRenderer = ({\n items,\n changeValue,\n value,\n variant = \"light\",\n className,\n disabled\n}: SegmentedControlRendererProps) => {\n return (\n <div role=\"radiogroup\" className={cn(segmentedControlRootVariants({ variant }), className)}>\n {items.map(item => (\n <SegmentedControlItemButton\n key={item.id}\n item={{ ...item, disabled: disabled || item.disabled }}\n isActive={value === item.value}\n onValueChange={changeValue}\n variant={variant}\n />\n ))}\n </div>\n );\n};\n\n/**\n * Segmented Control Primitive Component\n */\nconst SegmentedControlPrimitive = (props: SegmentedControlPrimitiveProps) => {\n const { vm, changeValue } = useSegmentedControl(props);\n return <SegmentedControlRenderer {...props} items={vm.items} changeValue={changeValue} />;\n};\n\nexport {\n SegmentedControlPrimitive,\n SegmentedControlRenderer,\n type SegmentedControlPrimitiveProps,\n type SegmentedControlVm\n};\n"],"mappings":"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","ignoreList":[]}
|