@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.
Files changed (161) hide show
  1. package/Accordion/Accordion.d.ts +1 -1
  2. package/Accordion/Accordion.mdx +437 -463
  3. package/Accordion/components/AccordionContent.js.map +1 -1
  4. package/Alert/Alert.d.ts +1 -1
  5. package/Alert/Alert.js.map +1 -1
  6. package/Alert/Alert.mdx +80 -83
  7. package/AutoComplete/AutoComplete.mdx +63 -55
  8. package/Avatar/Avatar.d.ts +1 -1
  9. package/Avatar/Avatar.js.map +1 -1
  10. package/Avatar/Avatar.mdx +52 -43
  11. package/Button/Button.d.ts +1 -1
  12. package/Button/Button.js.map +1 -1
  13. package/Button/Button.mdx +50 -42
  14. package/Button/IconButton.d.ts +1 -1
  15. package/Button/IconButton.js.map +1 -1
  16. package/Card/components/CardContent.d.ts +1 -1
  17. package/Card/components/CardTitle.d.ts +1 -1
  18. package/Checkbox/Checkbox.mdx +51 -49
  19. package/Checkbox/primitives/CheckboxPrimitive.d.ts +1 -1
  20. package/CheckboxGroup/CheckboxGroup.mdx +51 -53
  21. package/CodeEditor/CodeEditor.mdx +44 -43
  22. package/ColorPicker/ColorPicker.mdx +41 -40
  23. package/Command/components/Item.d.ts +1 -1
  24. package/Command/components/Item.js.map +1 -1
  25. package/DataTable/DataTable.mdx +537 -542
  26. package/DataTable/components/ColumnSorter.d.ts +1 -1
  27. package/DataTable/components/ColumnSorter.js.map +1 -1
  28. package/Dialog/Dialog.js.map +1 -1
  29. package/Dialog/components/DialogContent.d.ts +1 -1
  30. package/Dialog/components/DialogContent.js +1 -1
  31. package/Dialog/components/DialogContent.js.map +1 -1
  32. package/Dialog/components/DialogFooter.d.ts +1 -1
  33. package/Dialog/components/DialogFooter.js.map +1 -1
  34. package/Dialog/components/DialogTitle.d.ts +1 -1
  35. package/Drawer/Drawer.js.map +1 -1
  36. package/Drawer/Drawer.mdx +73 -64
  37. package/Drawer/components/DrawerContent.d.ts +1 -1
  38. package/Drawer/components/DrawerContent.js.map +1 -1
  39. package/DropdownMenu/DropdownMenu.js.map +1 -1
  40. package/DropdownMenu/DropdownMenu.mdx +155 -256
  41. package/DropdownMenu/components/DropdownMenuCheckboxItem.js.map +1 -1
  42. package/DropdownMenu/components/DropdownMenuLabel.js.map +1 -1
  43. package/FilePicker/FilePicker.mdx +69 -69
  44. package/FilePicker/primitives/FilePickerPrimitive.d.ts +19 -19
  45. package/FilePicker/primitives/FilePickerPrimitive.js.map +1 -1
  46. package/FilePicker/primitives/components/Trigger.d.ts +1 -1
  47. package/FilePicker/primitives/components/previews/TextOnlyPreview/TextOnlyPreview.d.ts +1 -1
  48. package/FilePicker/primitives/components/previews/variants.d.ts +1 -1
  49. package/FilePicker/primitives/components/types.js.map +1 -1
  50. package/FormComponent/Description.d.ts +1 -1
  51. package/FormComponent/ErrorMessage.d.ts +1 -1
  52. package/FormComponent/Note.d.ts +1 -1
  53. package/Grid/Grid.d.ts +2 -2
  54. package/Grid/Grid.js.map +1 -1
  55. package/Grid/Grid.mdx +111 -121
  56. package/HeaderBar/HeaderBar.mdx +98 -99
  57. package/Heading/Heading.d.ts +1 -1
  58. package/Heading/Heading.js.map +1 -1
  59. package/Heading/Heading.mdx +63 -58
  60. package/Icon/Icon.d.ts +1 -1
  61. package/Icon/Icon.js.map +1 -1
  62. package/Icon/Icon.mdx +79 -147
  63. package/IconPicker/IconPicker.mdx +66 -64
  64. package/IconPicker/primitives/IconPickerPrimitive.d.ts +1 -1
  65. package/IconPicker/primitives/components/IconPickerTrigger.d.ts +1 -1
  66. package/Image/Image.js.map +1 -1
  67. package/Input/Input.mdx +67 -56
  68. package/Input/InputPrimitive.d.ts +1 -1
  69. package/Label/Label.d.ts +1 -1
  70. package/Label/Label.js.map +1 -1
  71. package/Label/Label.mdx +42 -42
  72. package/Label/components/LabelDescription.d.ts +1 -1
  73. package/Label/components/LabelRequired.d.ts +1 -1
  74. package/Label/components/LabelValue.d.ts +1 -1
  75. package/Link/Link.d.ts +1 -1
  76. package/Link/Link.mdx +129 -116
  77. package/List/List.d.ts +1 -1
  78. package/List/List.js.map +1 -1
  79. package/List/List.mdx +317 -329
  80. package/List/components/ListItem.d.ts +1 -1
  81. package/List/components/ListItem.js.map +1 -1
  82. package/Loader/Loader.d.ts +2 -2
  83. package/Loader/Loader.js.map +1 -1
  84. package/Loader/Loader.mdx +96 -91
  85. package/MultiAutoComplete/MultiAutoComplete.mdx +52 -51
  86. package/MultiAutoComplete/primitives/components/MultiAutoCompleteInput.d.ts +1 -1
  87. package/MultiAutoComplete/primitives/presenters/MultiAutoCompleteListOptionsPresenter.js.map +1 -1
  88. package/MultiAutoComplete/primitives/presenters/MultiAutoCompleteListOptionsPresenterWithUniqueValues.js.map +1 -1
  89. package/MultiAutoComplete/primitives/presenters/MultiAutoCompleteSelectedOptionsPresenter.js.map +1 -1
  90. package/MultiAutoComplete/primitives/presenters/MultiAutoCompleteTemporaryOptionPresenter.js.map +1 -1
  91. package/MultiFilePicker/MultiFilePicker.mdx +84 -80
  92. package/MultiFilePicker/primitives/MultiFilePickerPrimitive.js.map +1 -1
  93. package/Popover/Popover.mdx +112 -118
  94. package/Popover/primitives/components/PopoverArrow.d.ts +1 -1
  95. package/Popover/primitives/components/PopoverContent.d.ts +1 -1
  96. package/RadioGroup/RadioGroup.mdx +62 -59
  97. package/RadioGroup/primitives/RadioGroupPrimitive.js.map +1 -1
  98. package/RangeSlider/RangeSlider.mdx +48 -47
  99. package/RangeSlider/primitives/RangeSliderPrimitive.js.map +1 -1
  100. package/RangeSlider/primitives/components/RangeSliderValue.d.ts +1 -1
  101. package/RangeSlider/primitives/components/RangeSliderValue.js.map +1 -1
  102. package/ScrollArea/ScrollArea.js.map +1 -1
  103. package/SegmentedControl/SegmentedControl.mdx +59 -59
  104. package/SegmentedControl/primitives/SegmentedControlPrimitive.d.ts +1 -1
  105. package/SegmentedControl/primitives/SegmentedControlPrimitive.js.map +1 -1
  106. package/Select/Select.mdx +52 -43
  107. package/Select/primitives/components/SelectTrigger.d.ts +1 -1
  108. package/Select/primitives/components/SelectTrigger.js.map +1 -1
  109. package/Select/primitives/presenters/SelectPresenter.d.ts +1 -1
  110. package/Separator/Separator.d.ts +1 -1
  111. package/Separator/Separator.mdx +139 -150
  112. package/Sidebar/Sidebar.js.map +1 -1
  113. package/Sidebar/Sidebar.mdx +66 -88
  114. package/Sidebar/components/items/SidebarMenuSubItemIndentation.d.ts +1 -1
  115. package/Sidebar/components/items/SidebarMenuSubItemIndentation.js.map +1 -1
  116. package/Skeleton/Skeleton.d.ts +1 -1
  117. package/Skeleton/Skeleton.js.map +1 -1
  118. package/Skeleton/Skeleton.mdx +37 -37
  119. package/Slider/Slider.mdx +48 -47
  120. package/Slider/primitives/SliderPrimitive.js.map +1 -1
  121. package/Slider/primitives/components/SliderSideValue.d.ts +1 -1
  122. package/Slider/primitives/components/SliderSideValue.js.map +1 -1
  123. package/Slider/primitives/components/SliderTooltip.d.ts +1 -1
  124. package/SteppedProgress/components/SteppedProgressIcon.d.ts +1 -1
  125. package/SteppedProgress/components/SteppedProgressIcon.js.map +1 -1
  126. package/SteppedProgress/components/SteppedProgressIndicator.d.ts +1 -1
  127. package/SteppedProgress/components/SteppedProgressIndicator.js.map +1 -1
  128. package/Switch/Switch.mdx +44 -42
  129. package/Switch/primitives/SwitchPrimitive.d.ts +1 -1
  130. package/Table/Table.d.ts +1 -1
  131. package/Table/Table.js.map +1 -1
  132. package/Table/components/Direction.d.ts +1 -1
  133. package/Table/components/Direction.js.map +1 -1
  134. package/Table/components/Header.d.ts +1 -1
  135. package/Table/components/Header.js.map +1 -1
  136. package/Table/components/Resizer.d.ts +1 -1
  137. package/Table/components/Resizer.js.map +1 -1
  138. package/Table/components/Row.d.ts +1 -1
  139. package/Table/components/Row.js.map +1 -1
  140. package/Tabs/Tabs.mdx +297 -292
  141. package/Tabs/components/Content.d.ts +1 -1
  142. package/Tabs/components/List.d.ts +1 -1
  143. package/Tabs/components/Trigger.d.ts +1 -1
  144. package/Tag/Tag.d.ts +1 -1
  145. package/Tag/Tag.js.map +1 -1
  146. package/Tag/Tag.mdx +68 -64
  147. package/Tags/primitives/TagsPrimitive.js.map +1 -1
  148. package/Text/Text.d.ts +1 -1
  149. package/Text/Text.mdx +54 -48
  150. package/Textarea/Textarea.mdx +49 -39
  151. package/Textarea/TextareaPrimitive.d.ts +1 -1
  152. package/Textarea/TextareaPrimitive.js.map +1 -1
  153. package/Toast/Toast.mdx +63 -53
  154. package/Toast/components/ToastRoot.d.ts +1 -1
  155. package/Tooltip/Tooltip.mdx +197 -198
  156. package/Tooltip/components/TooltipArrow.d.ts +1 -1
  157. package/Tooltip/components/TooltipContent.d.ts +1 -1
  158. package/Tree/components/Item.d.ts +1 -1
  159. package/Tree/useTree.d.ts +1 -1
  160. package/Widget/components/WidgetContent.d.ts +1 -1
  161. package/package.json +15 -15
@@ -1,6 +1,6 @@
1
- import { Canvas, Meta, Controls } from '@storybook/addon-docs/blocks';
1
+ import { Canvas, Meta, Controls } from "@storybook/addon-docs/blocks";
2
2
 
3
- import * as RadioGroupStories from './RadioGroup.stories';
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
- const [value, setValue] = useState("");
20
- const [validation, setValidation] = useState({ isValid: true, message: "" });
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
- additionalActions={[
62
- {
63
- title: 'Open in GitHub',
64
- onClick: () => {
65
- window.open(
66
- 'https://github.com/webiny/webiny-js/blob/feat/new-admin-ui/packages/admin-ui/src/RadioGroup/RadioGroup.tsx',
67
- '_blank'
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 (*) next to the label, you need to implement the validation logic using the `validation` and `onBlur` props to handle the actual validation behavior.
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
- const [value, setValue] = useState("");
85
- const [validation, setValidation] = useState({ isValid: true, message: "" });
86
-
87
- const handleValidation = () => {
88
- if (!value) {
89
- setValidation({ isValid: false, message: "This field is required" });
90
- } else {
91
- setValidation({ isValid: true, message: "" });
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
- return (
96
- <RadioGroup
97
- label="Deployment Option"
98
- description="Choose your preferred deployment method"
99
- note="This setting will determine how your application is deployed"
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
- <img src="/images/storybook/radio-group/options.png" alt="Radio input options"/>
138
+
139
+ <img src="/images/storybook/radio-group/options.png" alt="Radio input options" />
136
140
 
137
141
  ### States
138
- <img src="/images/storybook/radio-group/states.png" alt="States"/>
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\n 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;;AA0BA,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
+ {"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 '@storybook/addon-docs/blocks';
1
+ import { Canvas, Meta, Controls } from "@storybook/addon-docs/blocks";
2
2
 
3
- import * as RangeSliderStories from './RangeSlider.stories';
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
- const [values, setValues] = useState([25, 75]);
19
- const [validation, setValidation] = useState({ isValid: true, message: "" });
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
- additionalActions={[
55
- {
56
- title: 'Open in GitHub',
57
- onClick: () => {
58
- window.open(
59
- 'https://github.com/webiny/webiny-js/blob/feat/new-admin-ui/packages/admin-ui/src/RangeSlider/RangeSlider.tsx',
60
- '_blank'
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
- const [values, setValues] = useState([25, 75]);
75
- const [validation, setValidation] = useState({ isValid: true, message: "" });
76
-
77
- const handleChange = (newValues: number[]) => {
78
- setValues(newValues);
79
-
80
- if (newValues[0] === 0 && newValues[1] === 0) {
81
- setValidation({ isValid: false, message: "Please select a range" });
82
- } else {
83
- setValidation({ isValid: true, message: "" });
84
- }
85
- };
86
-
87
- return (
88
- <div>
89
- <RangeSlider
90
- label="Price Range"
91
- description="Select the minimum and maximum price range"
92
- note="Note: The selected range will filter available products"
93
- min={0}
94
- max={100}
95
- step={1}
96
- values={values}
97
- required={true}
98
- onValuesChange={handleChange}
99
- showTooltip={true}
100
- transformValue={(value) => `$${value}`}
101
- validation={validation}
102
- />
103
- </div>
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\n extends Omit<SliderPrimitives.SliderProps, \"min\" | \"max\" | \"value\"> {\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,\n 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\n 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;AA4BvB;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;;AAcA,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":[]}
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/dist/types").ClassProp) | undefined) => string;
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>,\n 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;AAQF,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
+ {"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\n extends Omit<React.ComponentProps<typeof ScrollAreaPrimitive.Root>, \"onScroll\"> {\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;AAmBX,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
+ {"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 '@storybook/addon-docs/blocks';
1
+ import { Canvas, Meta, Controls } from "@storybook/addon-docs/blocks";
2
2
 
3
- import * as SegmentedControlStories from './SegmentedControl.stories';
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
- 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
- );
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
- 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
- />
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
- label="Select a plan"
73
- description="Choose your subscription plan"
74
- required
75
- items={plans}
76
- value={selectedPlan}
77
- onChange={setSelectedPlan}
78
- validation={{
79
- isValid: false,
80
- message: "Please select a plan"
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 | Type | Default | Description |
90
- |------|------|---------|-------------|
91
- | `items` | `SegmentedControlItemParams[]` | - | Array of items to display |
92
- | `value` | `string` | - | Currently selected value |
93
- | `onChange` | `(value: string) => void` | - | Callback when selection changes |
94
- | `variant` | `"accent" \| "ghost"` | `"accent"` | Visual style variant |
95
- | `size` | `"sm" \| "md"` | `"md"` | Size of the control |
96
- | `disabled` | `boolean` | `false` | Disable all items |
97
- | `className` | `string` | - | Additional CSS class |
98
- | `label` | `string \| React.ReactNode` | - | Form label |
99
- | `description` | `string \| React.ReactNode` | - | Form description |
100
- | `note` | `string \| React.ReactNode` | - | Form note |
101
- | `required` | `boolean` | - | Show required indicator |
102
- | `validation` | `object` | - | Validation state and message |
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 | Type | Default | Description |
107
- |------|------|---------|-------------|
108
- | `label` | `string \| React.ReactNode` | - | Item label |
109
- | `value` | `string \| number` | - | Item value |
110
- | `disabled` | `boolean` | `false` | Disable this specific item |
111
- | `icon` | `React.ReactNode` | - | Optional icon to display |
112
- | `id` | `string` | - | Optional custom 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.General} />
117
- <Canvas of={SegmentedControlStories.VariantAccent} />
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/dist/types.js").ClassProp) | undefined) => string;
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\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"value\"> {\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":[]}
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":[]}