@stack-spot/citric-react 0.35.1 → 0.37.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/dist/citric.css +2844 -2832
- package/dist/components/Accordion.d.ts +1 -1
- package/dist/components/Accordion.js +1 -1
- package/dist/components/Alert.d.ts +1 -1
- package/dist/components/Alert.js +1 -1
- package/dist/components/AsyncContent.d.ts +1 -1
- package/dist/components/AsyncContent.js +1 -1
- package/dist/components/Avatar.d.ts +1 -1
- package/dist/components/Avatar.js +1 -1
- package/dist/components/AvatarGroup.d.ts +1 -1
- package/dist/components/AvatarGroup.js +1 -1
- package/dist/components/Badge.d.ts +1 -1
- package/dist/components/Badge.js +1 -1
- package/dist/components/Blockquote.d.ts +1 -1
- package/dist/components/Blockquote.js +1 -1
- package/dist/components/Breadcrumb.d.ts +1 -1
- package/dist/components/Breadcrumb.js +1 -1
- package/dist/components/Button.d.ts +1 -1
- package/dist/components/Button.js +1 -1
- package/dist/components/ButtonLink.d.ts +1 -1
- package/dist/components/ButtonLink.js +1 -1
- package/dist/components/Card.d.ts +1 -1
- package/dist/components/Card.js +1 -1
- package/dist/components/Checkbox.d.ts +1 -1
- package/dist/components/Checkbox.js +1 -1
- package/dist/components/CheckboxGroup.d.ts +1 -1
- package/dist/components/CheckboxGroup.js +1 -1
- package/dist/components/Circle.d.ts +1 -1
- package/dist/components/Circle.js +1 -1
- package/dist/components/Divider.d.ts +1 -1
- package/dist/components/Divider.js +1 -1
- package/dist/components/ErrorBoundary.d.ts +1 -1
- package/dist/components/ErrorBoundary.js +1 -1
- package/dist/components/ErrorMessage.d.ts +1 -1
- package/dist/components/ErrorMessage.js +1 -1
- package/dist/components/FallbackBoundary.d.ts +1 -1
- package/dist/components/FallbackBoundary.js +1 -1
- package/dist/components/Favorite.d.ts +1 -1
- package/dist/components/Favorite.js +1 -1
- package/dist/components/FieldGroup.d.ts +1 -1
- package/dist/components/FieldGroup.js +1 -1
- package/dist/components/Form.d.ts +2 -2
- package/dist/components/Form.js +1 -1
- package/dist/components/FormGroup.d.ts +1 -1
- package/dist/components/FormGroup.js +1 -1
- package/dist/components/Icon.d.ts +1 -1
- package/dist/components/Icon.js +1 -1
- package/dist/components/IconBox.d.ts +3 -3
- package/dist/components/IconBox.js +1 -1
- package/dist/components/ImageBox.d.ts +3 -3
- package/dist/components/ImageBox.js +1 -1
- package/dist/components/ImageWithFallback.d.ts +1 -1
- package/dist/components/ImageWithFallback.js +1 -1
- package/dist/components/Input.d.ts +1 -1
- package/dist/components/Input.js +1 -1
- package/dist/components/Link.d.ts +1 -1
- package/dist/components/Link.js +1 -1
- package/dist/components/LoadingPanel.d.ts +1 -1
- package/dist/components/LoadingPanel.js +1 -1
- package/dist/components/MenuOverlay/Menu.d.ts +1 -1
- package/dist/components/MenuOverlay/Menu.js +1 -1
- package/dist/components/MenuOverlay/index.d.ts +1 -1
- package/dist/components/MenuOverlay/index.js +1 -1
- package/dist/components/Overlay/index.d.ts +1 -1
- package/dist/components/Overlay/index.js +1 -1
- package/dist/components/Pagination.d.ts +1 -1
- package/dist/components/Pagination.js +1 -1
- package/dist/components/ProgressBar.d.ts +1 -1
- package/dist/components/ProgressBar.js +1 -1
- package/dist/components/ProgressCircular.d.ts +1 -1
- package/dist/components/ProgressCircular.js +1 -1
- package/dist/components/RadioGroup.d.ts +1 -1
- package/dist/components/RadioGroup.js +1 -1
- package/dist/components/Rating.d.ts +17 -3
- package/dist/components/Rating.d.ts.map +1 -1
- package/dist/components/Rating.js +11 -3
- package/dist/components/Rating.js.map +1 -1
- package/dist/components/Select/MultiSelect.d.ts +1 -1
- package/dist/components/Select/MultiSelect.js +1 -1
- package/dist/components/Select/RichSelect.d.ts +1 -1
- package/dist/components/Select/RichSelect.js +1 -1
- package/dist/components/Select/SimpleSelect.d.ts +1 -1
- package/dist/components/Select/SimpleSelect.js +1 -1
- package/dist/components/Select/index.d.ts +1 -1
- package/dist/components/Select/index.js +1 -1
- package/dist/components/SelectBox.d.ts +1 -1
- package/dist/components/SelectBox.js +1 -1
- package/dist/components/Skeleton.d.ts +1 -1
- package/dist/components/Skeleton.js +1 -1
- package/dist/components/Slider.d.ts +1 -1
- package/dist/components/Slider.js +1 -1
- package/dist/components/SmartTable.d.ts +1 -1
- package/dist/components/SmartTable.js +1 -1
- package/dist/components/Stepper.d.ts +1 -1
- package/dist/components/Stepper.js +1 -1
- package/dist/components/Table.d.ts +3 -3
- package/dist/components/Table.js +1 -1
- package/dist/components/Tabs/index.d.ts +1 -1
- package/dist/components/Tabs/index.js +1 -1
- package/dist/components/Textarea.d.ts +1 -1
- package/dist/components/Textarea.js +1 -1
- package/dist/components/Tooltip.d.ts +1 -1
- package/dist/components/Tooltip.js +1 -1
- package/dist/context/CitricProvider.d.ts +1 -1
- package/dist/context/CitricProvider.js +1 -1
- package/dist/overlay.js +1 -1
- package/dist/theme.css +415 -415
- package/package.json +7 -6
- package/scripts/build-css.ts +49 -49
- package/src/components/Accordion.tsx +130 -130
- package/src/components/Alert.tsx +24 -24
- package/src/components/AsyncContent.tsx +70 -70
- package/src/components/Avatar.tsx +45 -45
- package/src/components/AvatarGroup.tsx +49 -49
- package/src/components/Badge.tsx +47 -47
- package/src/components/Blockquote.tsx +18 -18
- package/src/components/Breadcrumb.tsx +33 -33
- package/src/components/Button.tsx +105 -105
- package/src/components/ButtonLink.tsx +45 -45
- package/src/components/Card.tsx +68 -68
- package/src/components/Checkbox.tsx +51 -51
- package/src/components/CheckboxGroup.tsx +152 -152
- package/src/components/Circle.tsx +43 -43
- package/src/components/CitricComponent.ts +47 -47
- package/src/components/Divider.tsx +24 -24
- package/src/components/ErrorBoundary.tsx +75 -75
- package/src/components/ErrorMessage.tsx +11 -11
- package/src/components/FallbackBoundary.tsx +40 -40
- package/src/components/Favorite.tsx +57 -57
- package/src/components/FieldGroup.tsx +46 -46
- package/src/components/Form.tsx +36 -36
- package/src/components/FormGroup.tsx +57 -57
- package/src/components/Icon.tsx +35 -35
- package/src/components/IconBox.tsx +134 -134
- package/src/components/ImageBox.tsx +125 -125
- package/src/components/ImageWithFallback.tsx +65 -65
- package/src/components/Input.tsx +49 -49
- package/src/components/Link.tsx +55 -55
- package/src/components/LoadingPanel.tsx +8 -8
- package/src/components/MenuOverlay/Menu.tsx +158 -158
- package/src/components/MenuOverlay/context.ts +20 -20
- package/src/components/MenuOverlay/index.tsx +55 -55
- package/src/components/MenuOverlay/keyboard.ts +60 -60
- package/src/components/MenuOverlay/types.ts +171 -171
- package/src/components/Overlay/context.ts +10 -10
- package/src/components/Overlay/index.tsx +164 -164
- package/src/components/Overlay/types.ts +70 -70
- package/src/components/Pagination.tsx +113 -113
- package/src/components/ProgressBar.tsx +45 -45
- package/src/components/ProgressCircular.tsx +45 -45
- package/src/components/RadioGroup.tsx +146 -146
- package/src/components/Rating.tsx +98 -35
- package/src/components/Select/MultiSelect.tsx +217 -217
- package/src/components/Select/RichSelect.tsx +128 -128
- package/src/components/Select/SimpleSelect.tsx +73 -73
- package/src/components/Select/hooks.ts +133 -133
- package/src/components/Select/index.tsx +35 -35
- package/src/components/Select/types.ts +134 -134
- package/src/components/SelectBox.tsx +167 -167
- package/src/components/Skeleton.tsx +53 -53
- package/src/components/Slider.tsx +89 -89
- package/src/components/SmartTable.tsx +227 -227
- package/src/components/Stepper.tsx +163 -163
- package/src/components/Table.tsx +234 -234
- package/src/components/Tabs/TabController.ts +54 -54
- package/src/components/Tabs/index.tsx +87 -87
- package/src/components/Tabs/types.ts +54 -54
- package/src/components/Tabs/utils.ts +6 -6
- package/src/components/Text.ts +111 -111
- package/src/components/Textarea.tsx +27 -27
- package/src/components/Tooltip.tsx +72 -72
- package/src/components/layout.tsx +101 -101
- package/src/context/CitricContext.tsx +4 -4
- package/src/context/CitricProvider.tsx +14 -14
- package/src/context/hooks.ts +6 -6
- package/src/index.ts +58 -58
- package/src/overlay.ts +341 -341
- package/src/types.ts +216 -216
- package/src/utils/ValueController.ts +28 -28
- package/src/utils/acessibility.ts +92 -92
- package/src/utils/checkbox.ts +121 -121
- package/src/utils/css.ts +119 -119
- package/src/utils/options.ts +9 -9
- package/src/utils/radio.ts +93 -93
- package/src/utils/react.ts +6 -6
- package/tsconfig.json +10 -10
|
@@ -1,146 +1,146 @@
|
|
|
1
|
-
import { isNil } from 'lodash'
|
|
2
|
-
import { useMemo } from 'react'
|
|
3
|
-
import { WithColorScheme } from '../types'
|
|
4
|
-
import { defaultRenderKey, defaultRenderLabel } from '../utils/options'
|
|
5
|
-
import { withRef } from '../utils/react'
|
|
6
|
-
import { CitricComponent } from './CitricComponent'
|
|
7
|
-
import { Column } from './layout'
|
|
8
|
-
|
|
9
|
-
export interface BaseRadioGroupProps<T> extends WithColorScheme {
|
|
10
|
-
/**
|
|
11
|
-
* The field name.
|
|
12
|
-
*/
|
|
13
|
-
name?: string,
|
|
14
|
-
/**
|
|
15
|
-
* The current value.
|
|
16
|
-
*/
|
|
17
|
-
value?: T,
|
|
18
|
-
/**
|
|
19
|
-
* All the items (radio buttons) to render.
|
|
20
|
-
*/
|
|
21
|
-
options: T[],
|
|
22
|
-
/**
|
|
23
|
-
* Called whenever the selected radio button changes.
|
|
24
|
-
* @param value the currently selected item.
|
|
25
|
-
*/
|
|
26
|
-
onChange?: (value: T) => void,
|
|
27
|
-
/**
|
|
28
|
-
* A function to render the item label.
|
|
29
|
-
*
|
|
30
|
-
* Attention: ignored if `renderItem` is set.
|
|
31
|
-
*
|
|
32
|
-
* @example
|
|
33
|
-
* `(option) => option.name`
|
|
34
|
-
* @default "the item's toString() result."
|
|
35
|
-
* @param option the item to render.
|
|
36
|
-
* @returns a React Node to render.
|
|
37
|
-
*/
|
|
38
|
-
renderLabel?: (option: T) => React.ReactNode,
|
|
39
|
-
/**
|
|
40
|
-
* A function to render the item with the radio button. When set, `renderLabel` is ignored.
|
|
41
|
-
* @example
|
|
42
|
-
* ```
|
|
43
|
-
* (radio, option) => <label>{radio} {option.name}</label>
|
|
44
|
-
* ```
|
|
45
|
-
* @param radio the radio button.
|
|
46
|
-
* @param option the current item.
|
|
47
|
-
* @returns a React Node to render.
|
|
48
|
-
*/
|
|
49
|
-
renderItem?: (radio: React.ReactElement, option: T) => React.ReactNode,
|
|
50
|
-
/**
|
|
51
|
-
* A function to render the item value, a unique identifier for the option.
|
|
52
|
-
* @example
|
|
53
|
-
* `(option) => option.id`
|
|
54
|
-
* @default "if the item is a string or a number, the stringified item. Otherwise, undefined."
|
|
55
|
-
* @param option the item to compute a key for.
|
|
56
|
-
* @returns a string key.
|
|
57
|
-
*/
|
|
58
|
-
renderKey?: (option: T) => string | number | undefined,
|
|
59
|
-
/**
|
|
60
|
-
* If this function returns true for the item, this option is disabled.
|
|
61
|
-
* @default "nothing is disabled"
|
|
62
|
-
* @param option the item to calculate "disabled" for.
|
|
63
|
-
* @returns true if the item should be disabled, false otherwise.
|
|
64
|
-
*/
|
|
65
|
-
isDisabled?: (option: T) => boolean,
|
|
66
|
-
/**
|
|
67
|
-
* The space between options.
|
|
68
|
-
*
|
|
69
|
-
* @default "8px"
|
|
70
|
-
*/
|
|
71
|
-
gap?: string,
|
|
72
|
-
/**
|
|
73
|
-
* If set to false, the checkboxes will have tabIndex = -1.
|
|
74
|
-
*
|
|
75
|
-
* @default true
|
|
76
|
-
*/
|
|
77
|
-
focusable?: boolean,
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
export type RadioGroupProps<T> = Omit<React.JSX.IntrinsicElements['div'], 'onChange' | 'children'> & BaseRadioGroupProps<T>
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Renders a list of radio button for single-selection. One radio button is rendered for each option.
|
|
84
|
-
*
|
|
85
|
-
* Attention: single radio buttons don't make sense, this is why they're not provided by this library.
|
|
86
|
-
*
|
|
87
|
-
* This component can be heavily customized via its properties. Check the storybook for complex examples.
|
|
88
|
-
*
|
|
89
|
-
* Tip: if you need to implement features like "search", use the hook `useRadioGroupControls`.
|
|
90
|
-
*
|
|
91
|
-
* @example
|
|
92
|
-
*
|
|
93
|
-
* ```
|
|
94
|
-
* const options = useMemo(() => [
|
|
95
|
-
* { id: 1, name: 'Option 1' },
|
|
96
|
-
* { id: 2, name: 'Option 2' },
|
|
97
|
-
* { id: 3, name: 'Option 3' },
|
|
98
|
-
* ], [])
|
|
99
|
-
*
|
|
100
|
-
* const [value, setValue] = useState<(typeof options)[number] | undefined>()
|
|
101
|
-
*
|
|
102
|
-
* return <RadioGroup options={options} renderLabel={o => o.name} renderKey={o => o.id} value={value} setValue={setValue} />
|
|
103
|
-
* ```
|
|
104
|
-
*/
|
|
105
|
-
export const RadioGroup = withRef(
|
|
106
|
-
function RadioGroup<T>({
|
|
107
|
-
name,
|
|
108
|
-
value,
|
|
109
|
-
options,
|
|
110
|
-
onChange,
|
|
111
|
-
renderLabel = defaultRenderLabel,
|
|
112
|
-
renderKey = defaultRenderKey,
|
|
113
|
-
renderItem,
|
|
114
|
-
isDisabled,
|
|
115
|
-
colorScheme,
|
|
116
|
-
gap = '8px',
|
|
117
|
-
focusable = true,
|
|
118
|
-
style,
|
|
119
|
-
...props
|
|
120
|
-
}: RadioGroupProps<T>) {
|
|
121
|
-
const items = useMemo(() => {
|
|
122
|
-
const valueKey = value ? renderKey(value) : undefined
|
|
123
|
-
return options.map((o) => {
|
|
124
|
-
const key = renderKey(o)
|
|
125
|
-
const radio = <CitricComponent
|
|
126
|
-
tag="input"
|
|
127
|
-
component="radio"
|
|
128
|
-
type="radio"
|
|
129
|
-
name={name}
|
|
130
|
-
value={key}
|
|
131
|
-
checked={value === o || (!isNil(key) && valueKey === key)}
|
|
132
|
-
onChange={() => onChange?.(o)}
|
|
133
|
-
disabled={isDisabled?.(o)}
|
|
134
|
-
tabIndex={focusable ? undefined : -1}
|
|
135
|
-
/>
|
|
136
|
-
return renderItem ? renderItem(radio, o) : (
|
|
137
|
-
<CitricComponent tag="label" component="radio-row" key={key} colorScheme={colorScheme}>
|
|
138
|
-
{radio}
|
|
139
|
-
{renderLabel(o)}
|
|
140
|
-
</CitricComponent>
|
|
141
|
-
)
|
|
142
|
-
})
|
|
143
|
-
}, [options, value, name, colorScheme])
|
|
144
|
-
return <Column {...props} style={{ gap, ...style }}>{items}</Column>
|
|
145
|
-
},
|
|
146
|
-
)
|
|
1
|
+
import { isNil } from 'lodash'
|
|
2
|
+
import { useMemo } from 'react'
|
|
3
|
+
import { WithColorScheme } from '../types'
|
|
4
|
+
import { defaultRenderKey, defaultRenderLabel } from '../utils/options'
|
|
5
|
+
import { withRef } from '../utils/react'
|
|
6
|
+
import { CitricComponent } from './CitricComponent'
|
|
7
|
+
import { Column } from './layout'
|
|
8
|
+
|
|
9
|
+
export interface BaseRadioGroupProps<T> extends WithColorScheme {
|
|
10
|
+
/**
|
|
11
|
+
* The field name.
|
|
12
|
+
*/
|
|
13
|
+
name?: string,
|
|
14
|
+
/**
|
|
15
|
+
* The current value.
|
|
16
|
+
*/
|
|
17
|
+
value?: T,
|
|
18
|
+
/**
|
|
19
|
+
* All the items (radio buttons) to render.
|
|
20
|
+
*/
|
|
21
|
+
options: T[],
|
|
22
|
+
/**
|
|
23
|
+
* Called whenever the selected radio button changes.
|
|
24
|
+
* @param value the currently selected item.
|
|
25
|
+
*/
|
|
26
|
+
onChange?: (value: T) => void,
|
|
27
|
+
/**
|
|
28
|
+
* A function to render the item label.
|
|
29
|
+
*
|
|
30
|
+
* Attention: ignored if `renderItem` is set.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* `(option) => option.name`
|
|
34
|
+
* @default "the item's toString() result."
|
|
35
|
+
* @param option the item to render.
|
|
36
|
+
* @returns a React Node to render.
|
|
37
|
+
*/
|
|
38
|
+
renderLabel?: (option: T) => React.ReactNode,
|
|
39
|
+
/**
|
|
40
|
+
* A function to render the item with the radio button. When set, `renderLabel` is ignored.
|
|
41
|
+
* @example
|
|
42
|
+
* ```
|
|
43
|
+
* (radio, option) => <label>{radio} {option.name}</label>
|
|
44
|
+
* ```
|
|
45
|
+
* @param radio the radio button.
|
|
46
|
+
* @param option the current item.
|
|
47
|
+
* @returns a React Node to render.
|
|
48
|
+
*/
|
|
49
|
+
renderItem?: (radio: React.ReactElement, option: T) => React.ReactNode,
|
|
50
|
+
/**
|
|
51
|
+
* A function to render the item value, a unique identifier for the option.
|
|
52
|
+
* @example
|
|
53
|
+
* `(option) => option.id`
|
|
54
|
+
* @default "if the item is a string or a number, the stringified item. Otherwise, undefined."
|
|
55
|
+
* @param option the item to compute a key for.
|
|
56
|
+
* @returns a string key.
|
|
57
|
+
*/
|
|
58
|
+
renderKey?: (option: T) => string | number | undefined,
|
|
59
|
+
/**
|
|
60
|
+
* If this function returns true for the item, this option is disabled.
|
|
61
|
+
* @default "nothing is disabled"
|
|
62
|
+
* @param option the item to calculate "disabled" for.
|
|
63
|
+
* @returns true if the item should be disabled, false otherwise.
|
|
64
|
+
*/
|
|
65
|
+
isDisabled?: (option: T) => boolean,
|
|
66
|
+
/**
|
|
67
|
+
* The space between options.
|
|
68
|
+
*
|
|
69
|
+
* @default "8px"
|
|
70
|
+
*/
|
|
71
|
+
gap?: string,
|
|
72
|
+
/**
|
|
73
|
+
* If set to false, the checkboxes will have tabIndex = -1.
|
|
74
|
+
*
|
|
75
|
+
* @default true
|
|
76
|
+
*/
|
|
77
|
+
focusable?: boolean,
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export type RadioGroupProps<T> = Omit<React.JSX.IntrinsicElements['div'], 'onChange' | 'children'> & BaseRadioGroupProps<T>
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Renders a list of radio button for single-selection. One radio button is rendered for each option.
|
|
84
|
+
*
|
|
85
|
+
* Attention: single radio buttons don't make sense, this is why they're not provided by this library.
|
|
86
|
+
*
|
|
87
|
+
* This component can be heavily customized via its properties. Check the storybook for complex examples.
|
|
88
|
+
*
|
|
89
|
+
* Tip: if you need to implement features like "search", use the hook `useRadioGroupControls`.
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
*
|
|
93
|
+
* ```
|
|
94
|
+
* const options = useMemo(() => [
|
|
95
|
+
* { id: 1, name: 'Option 1' },
|
|
96
|
+
* { id: 2, name: 'Option 2' },
|
|
97
|
+
* { id: 3, name: 'Option 3' },
|
|
98
|
+
* ], [])
|
|
99
|
+
*
|
|
100
|
+
* const [value, setValue] = useState<(typeof options)[number] | undefined>()
|
|
101
|
+
*
|
|
102
|
+
* return <RadioGroup options={options} renderLabel={o => o.name} renderKey={o => o.id} value={value} setValue={setValue} />
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
export const RadioGroup = withRef(
|
|
106
|
+
function RadioGroup<T>({
|
|
107
|
+
name,
|
|
108
|
+
value,
|
|
109
|
+
options,
|
|
110
|
+
onChange,
|
|
111
|
+
renderLabel = defaultRenderLabel,
|
|
112
|
+
renderKey = defaultRenderKey,
|
|
113
|
+
renderItem,
|
|
114
|
+
isDisabled,
|
|
115
|
+
colorScheme,
|
|
116
|
+
gap = '8px',
|
|
117
|
+
focusable = true,
|
|
118
|
+
style,
|
|
119
|
+
...props
|
|
120
|
+
}: RadioGroupProps<T>) {
|
|
121
|
+
const items = useMemo(() => {
|
|
122
|
+
const valueKey = value ? renderKey(value) : undefined
|
|
123
|
+
return options.map((o) => {
|
|
124
|
+
const key = renderKey(o)
|
|
125
|
+
const radio = <CitricComponent
|
|
126
|
+
tag="input"
|
|
127
|
+
component="radio"
|
|
128
|
+
type="radio"
|
|
129
|
+
name={name}
|
|
130
|
+
value={key}
|
|
131
|
+
checked={value === o || (!isNil(key) && valueKey === key)}
|
|
132
|
+
onChange={() => onChange?.(o)}
|
|
133
|
+
disabled={isDisabled?.(o)}
|
|
134
|
+
tabIndex={focusable ? undefined : -1}
|
|
135
|
+
/>
|
|
136
|
+
return renderItem ? renderItem(radio, o) : (
|
|
137
|
+
<CitricComponent tag="label" component="radio-row" key={key} colorScheme={colorScheme}>
|
|
138
|
+
{radio}
|
|
139
|
+
{renderLabel(o)}
|
|
140
|
+
</CitricComponent>
|
|
141
|
+
)
|
|
142
|
+
})
|
|
143
|
+
}, [options, value, name, colorScheme])
|
|
144
|
+
return <Column {...props} style={{ gap, ...style }}>{items}</Column>
|
|
145
|
+
},
|
|
146
|
+
)
|
|
@@ -1,35 +1,98 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
1
|
+
import { useCallback } from 'react'
|
|
2
|
+
import { withRef } from '../utils/react'
|
|
3
|
+
import { CitricComponent } from './CitricComponent'
|
|
4
|
+
|
|
5
|
+
export type RatingValue = 1 | 2 | 3 | 4 | 5
|
|
6
|
+
|
|
7
|
+
export interface BaseRatingProps {
|
|
8
|
+
/**
|
|
9
|
+
* The current value of the rating.
|
|
10
|
+
*/
|
|
11
|
+
value: RatingValue | undefined,
|
|
12
|
+
/**
|
|
13
|
+
* Callback when the value changes.
|
|
14
|
+
*/
|
|
15
|
+
onChange?: (value: RatingValue) => void,
|
|
16
|
+
/**
|
|
17
|
+
* The name of this input.
|
|
18
|
+
*/
|
|
19
|
+
name?: string,
|
|
20
|
+
/**
|
|
21
|
+
* Whether the rating inputs are disabled.
|
|
22
|
+
*/
|
|
23
|
+
disabled?: boolean,
|
|
24
|
+
/**
|
|
25
|
+
* Whether the rating inputs are readonly.
|
|
26
|
+
*/
|
|
27
|
+
readonly?: boolean,
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export type RatingProps = Omit<React.JSX.IntrinsicElements['div'], 'onChange' | 'children'> & BaseRatingProps
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Renders a 5 star rating UI. The user can select 1 to 5 stars.
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```
|
|
37
|
+
* const [value, setValue] = useState<RatingValue | undefined>()
|
|
38
|
+
* return <Rating value={value} onChange={setValue} />
|
|
39
|
+
* ```
|
|
40
|
+
* In the example above, `RatingValue` is any integer from 1 to 5.
|
|
41
|
+
*/
|
|
42
|
+
export const Rating = withRef(({ value, onChange, name, disabled, readonly, ...props }: RatingProps) => {
|
|
43
|
+
const handleChange = useCallback((newValue: RatingValue) => {
|
|
44
|
+
if (!disabled && !readonly) {
|
|
45
|
+
onChange?.(newValue)
|
|
46
|
+
}
|
|
47
|
+
}, [disabled, readonly, onChange])
|
|
48
|
+
|
|
49
|
+
return (
|
|
50
|
+
<CitricComponent tag="div" component="rating" {...props}>
|
|
51
|
+
<input
|
|
52
|
+
type="radio"
|
|
53
|
+
value="1"
|
|
54
|
+
name={name}
|
|
55
|
+
checked={value === 5}
|
|
56
|
+
onChange={() => handleChange(5)}
|
|
57
|
+
disabled={disabled}
|
|
58
|
+
readOnly={readonly}
|
|
59
|
+
/>
|
|
60
|
+
<input
|
|
61
|
+
type="radio"
|
|
62
|
+
value="2"
|
|
63
|
+
name={name}
|
|
64
|
+
checked={value === 4}
|
|
65
|
+
onChange={() => handleChange(4)}
|
|
66
|
+
disabled={disabled}
|
|
67
|
+
readOnly={readonly}
|
|
68
|
+
/>
|
|
69
|
+
<input
|
|
70
|
+
type="radio"
|
|
71
|
+
value="3"
|
|
72
|
+
name={name}
|
|
73
|
+
checked={value === 3}
|
|
74
|
+
onChange={() => handleChange(3)}
|
|
75
|
+
disabled={disabled}
|
|
76
|
+
readOnly={readonly}
|
|
77
|
+
/>
|
|
78
|
+
<input
|
|
79
|
+
type="radio"
|
|
80
|
+
value="4"
|
|
81
|
+
name={name}
|
|
82
|
+
checked={value === 2}
|
|
83
|
+
onChange={() => handleChange(2)}
|
|
84
|
+
disabled={disabled}
|
|
85
|
+
readOnly={readonly}
|
|
86
|
+
/>
|
|
87
|
+
<input
|
|
88
|
+
type="radio"
|
|
89
|
+
value="5"
|
|
90
|
+
name={name}
|
|
91
|
+
checked={value === 1}
|
|
92
|
+
onChange={() => handleChange(1)}
|
|
93
|
+
disabled={disabled}
|
|
94
|
+
readOnly={readonly}
|
|
95
|
+
/>
|
|
96
|
+
</CitricComponent>
|
|
97
|
+
)
|
|
98
|
+
})
|