@stack-spot/citric-react 0.41.1 → 0.42.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 (206) hide show
  1. package/CHANGELOG.md +13 -13
  2. package/dist/citric.css +3090 -2846
  3. package/dist/components/Accordion.d.ts +1 -1
  4. package/dist/components/Accordion.js +1 -1
  5. package/dist/components/Alert.d.ts +1 -1
  6. package/dist/components/Alert.js +1 -1
  7. package/dist/components/AsyncContent.d.ts +1 -1
  8. package/dist/components/AsyncContent.js +1 -1
  9. package/dist/components/Autocomplete/Autocomplete.d.ts +211 -0
  10. package/dist/components/Autocomplete/Autocomplete.d.ts.map +1 -0
  11. package/dist/components/Autocomplete/Autocomplete.js +409 -0
  12. package/dist/components/Autocomplete/Autocomplete.js.map +1 -0
  13. package/dist/components/Autocomplete/index.d.ts +3 -0
  14. package/dist/components/Autocomplete/index.d.ts.map +1 -0
  15. package/dist/components/Autocomplete/index.js +2 -0
  16. package/dist/components/Autocomplete/index.js.map +1 -0
  17. package/dist/components/Avatar.d.ts +1 -1
  18. package/dist/components/Avatar.js +1 -1
  19. package/dist/components/AvatarGroup.d.ts +1 -1
  20. package/dist/components/AvatarGroup.js +1 -1
  21. package/dist/components/Badge.d.ts +1 -1
  22. package/dist/components/Badge.js +1 -1
  23. package/dist/components/Blockquote.d.ts +1 -1
  24. package/dist/components/Blockquote.js +1 -1
  25. package/dist/components/Breadcrumb.d.ts +1 -1
  26. package/dist/components/Breadcrumb.js +1 -1
  27. package/dist/components/Button.d.ts +1 -1
  28. package/dist/components/Button.js +1 -1
  29. package/dist/components/ButtonLink.d.ts +1 -1
  30. package/dist/components/ButtonLink.js +1 -1
  31. package/dist/components/Card.d.ts +1 -1
  32. package/dist/components/Card.js +1 -1
  33. package/dist/components/Checkbox.d.ts +1 -1
  34. package/dist/components/Checkbox.d.ts.map +1 -1
  35. package/dist/components/Checkbox.js +2 -2
  36. package/dist/components/Checkbox.js.map +1 -1
  37. package/dist/components/CheckboxGroup.d.ts +1 -1
  38. package/dist/components/CheckboxGroup.js +1 -1
  39. package/dist/components/Circle.d.ts +1 -1
  40. package/dist/components/Circle.js +1 -1
  41. package/dist/components/CitricComponent.d.ts +1 -1
  42. package/dist/components/CitricComponent.d.ts.map +1 -1
  43. package/dist/components/Divider.d.ts +1 -1
  44. package/dist/components/Divider.js +1 -1
  45. package/dist/components/ErrorBoundary.d.ts +1 -1
  46. package/dist/components/ErrorBoundary.js +1 -1
  47. package/dist/components/ErrorMessage.d.ts +1 -1
  48. package/dist/components/ErrorMessage.js +1 -1
  49. package/dist/components/FallbackBoundary.d.ts +1 -1
  50. package/dist/components/FallbackBoundary.js +1 -1
  51. package/dist/components/Favorite.d.ts +1 -1
  52. package/dist/components/Favorite.js +1 -1
  53. package/dist/components/FieldGroup.d.ts +1 -1
  54. package/dist/components/FieldGroup.js +1 -1
  55. package/dist/components/Form.d.ts +2 -2
  56. package/dist/components/Form.js +1 -1
  57. package/dist/components/FormGroup.d.ts +1 -1
  58. package/dist/components/FormGroup.js +1 -1
  59. package/dist/components/Icon.d.ts +1 -1
  60. package/dist/components/Icon.js +1 -1
  61. package/dist/components/IconBox.d.ts +3 -3
  62. package/dist/components/IconBox.js +1 -1
  63. package/dist/components/ImageBox.d.ts +3 -3
  64. package/dist/components/ImageBox.js +1 -1
  65. package/dist/components/ImageWithFallback.d.ts +1 -1
  66. package/dist/components/ImageWithFallback.js +1 -1
  67. package/dist/components/Input.d.ts +1 -1
  68. package/dist/components/Input.js +1 -1
  69. package/dist/components/Link.d.ts +1 -1
  70. package/dist/components/Link.js +1 -1
  71. package/dist/components/LoadingPanel.d.ts +1 -1
  72. package/dist/components/LoadingPanel.js +1 -1
  73. package/dist/components/MenuOverlay/Menu.d.ts +1 -1
  74. package/dist/components/MenuOverlay/Menu.js +1 -1
  75. package/dist/components/MenuOverlay/index.d.ts +1 -1
  76. package/dist/components/MenuOverlay/index.js +1 -1
  77. package/dist/components/Overlay/index.d.ts +1 -1
  78. package/dist/components/Overlay/index.d.ts.map +1 -1
  79. package/dist/components/Overlay/index.js +7 -6
  80. package/dist/components/Overlay/index.js.map +1 -1
  81. package/dist/components/Pagination.d.ts +1 -1
  82. package/dist/components/Pagination.js +1 -1
  83. package/dist/components/ProgressBar.d.ts +1 -1
  84. package/dist/components/ProgressBar.js +1 -1
  85. package/dist/components/ProgressCircular.d.ts +1 -1
  86. package/dist/components/ProgressCircular.js +1 -1
  87. package/dist/components/RadioGroup.d.ts +1 -1
  88. package/dist/components/RadioGroup.js +1 -1
  89. package/dist/components/Rating.d.ts +1 -1
  90. package/dist/components/Rating.js +1 -1
  91. package/dist/components/Select/MultiSelect.d.ts +1 -1
  92. package/dist/components/Select/MultiSelect.js +1 -1
  93. package/dist/components/Select/RichSelect.d.ts +1 -1
  94. package/dist/components/Select/RichSelect.js +1 -1
  95. package/dist/components/Select/SimpleSelect.d.ts +1 -1
  96. package/dist/components/Select/SimpleSelect.js +1 -1
  97. package/dist/components/Select/index.d.ts +1 -1
  98. package/dist/components/Select/index.js +1 -1
  99. package/dist/components/SelectBox.d.ts +1 -1
  100. package/dist/components/SelectBox.js +1 -1
  101. package/dist/components/Skeleton.d.ts +1 -1
  102. package/dist/components/Skeleton.js +1 -1
  103. package/dist/components/Slider.d.ts +1 -1
  104. package/dist/components/Slider.js +1 -1
  105. package/dist/components/SmartTable.d.ts +1 -1
  106. package/dist/components/SmartTable.js +1 -1
  107. package/dist/components/Stepper.d.ts +1 -1
  108. package/dist/components/Stepper.js +1 -1
  109. package/dist/components/Table.d.ts +3 -3
  110. package/dist/components/Table.js +1 -1
  111. package/dist/components/Tabs/index.d.ts +1 -1
  112. package/dist/components/Tabs/index.js +1 -1
  113. package/dist/components/Textarea.d.ts +1 -1
  114. package/dist/components/Textarea.js +1 -1
  115. package/dist/components/Tooltip.d.ts +1 -1
  116. package/dist/components/Tooltip.js +1 -1
  117. package/dist/context/CitricProvider.d.ts +1 -1
  118. package/dist/context/CitricProvider.js +1 -1
  119. package/dist/index.d.ts +1 -0
  120. package/dist/index.d.ts.map +1 -1
  121. package/dist/index.js +1 -0
  122. package/dist/index.js.map +1 -1
  123. package/dist/overlay.js +1 -1
  124. package/dist/theme.css +415 -415
  125. package/package.json +1 -1
  126. package/scripts/build-css.ts +49 -49
  127. package/src/components/Accordion.tsx +130 -130
  128. package/src/components/Alert.tsx +24 -24
  129. package/src/components/AsyncContent.tsx +75 -75
  130. package/src/components/Autocomplete/Autocomplete.tsx +794 -0
  131. package/src/components/Autocomplete/index.ts +3 -0
  132. package/src/components/Avatar.tsx +45 -45
  133. package/src/components/AvatarGroup.tsx +49 -49
  134. package/src/components/Badge.tsx +47 -47
  135. package/src/components/Blockquote.tsx +18 -18
  136. package/src/components/Breadcrumb.tsx +33 -33
  137. package/src/components/Button.tsx +105 -105
  138. package/src/components/ButtonLink.tsx +45 -45
  139. package/src/components/Card.tsx +68 -68
  140. package/src/components/Checkbox.tsx +52 -51
  141. package/src/components/CheckboxGroup.tsx +153 -153
  142. package/src/components/Circle.tsx +43 -43
  143. package/src/components/CitricComponent.ts +47 -47
  144. package/src/components/Divider.tsx +24 -24
  145. package/src/components/ErrorBoundary.tsx +75 -75
  146. package/src/components/ErrorMessage.tsx +11 -11
  147. package/src/components/FallbackBoundary.tsx +40 -40
  148. package/src/components/Favorite.tsx +57 -57
  149. package/src/components/FieldGroup.tsx +46 -46
  150. package/src/components/Form.tsx +36 -36
  151. package/src/components/FormGroup.tsx +57 -57
  152. package/src/components/Icon.tsx +35 -35
  153. package/src/components/IconBox.tsx +134 -134
  154. package/src/components/ImageBox.tsx +125 -125
  155. package/src/components/ImageWithFallback.tsx +65 -65
  156. package/src/components/Input.tsx +49 -49
  157. package/src/components/Link.tsx +55 -55
  158. package/src/components/LoadingPanel.tsx +12 -12
  159. package/src/components/MenuOverlay/Menu.tsx +158 -158
  160. package/src/components/MenuOverlay/context.ts +20 -20
  161. package/src/components/MenuOverlay/index.tsx +55 -55
  162. package/src/components/MenuOverlay/keyboard.ts +60 -60
  163. package/src/components/MenuOverlay/types.ts +171 -171
  164. package/src/components/Overlay/context.ts +10 -10
  165. package/src/components/Overlay/index.tsx +182 -181
  166. package/src/components/Overlay/types.ts +75 -75
  167. package/src/components/Pagination.tsx +133 -133
  168. package/src/components/ProgressBar.tsx +45 -45
  169. package/src/components/ProgressCircular.tsx +45 -45
  170. package/src/components/RadioGroup.tsx +147 -147
  171. package/src/components/Rating.tsx +98 -98
  172. package/src/components/Select/MultiSelect.tsx +217 -217
  173. package/src/components/Select/RichSelect.tsx +128 -128
  174. package/src/components/Select/SimpleSelect.tsx +73 -73
  175. package/src/components/Select/hooks.ts +133 -133
  176. package/src/components/Select/index.tsx +35 -35
  177. package/src/components/Select/types.ts +134 -134
  178. package/src/components/SelectBox.tsx +167 -167
  179. package/src/components/Skeleton.tsx +53 -53
  180. package/src/components/Slider.tsx +89 -89
  181. package/src/components/SmartTable.tsx +227 -227
  182. package/src/components/Stepper.tsx +163 -163
  183. package/src/components/Table.tsx +234 -234
  184. package/src/components/Tabs/TabController.ts +54 -54
  185. package/src/components/Tabs/index.tsx +106 -106
  186. package/src/components/Tabs/types.ts +67 -67
  187. package/src/components/Tabs/utils.ts +6 -6
  188. package/src/components/Text.ts +111 -111
  189. package/src/components/Textarea.tsx +27 -27
  190. package/src/components/Tooltip.tsx +83 -83
  191. package/src/components/layout.tsx +101 -101
  192. package/src/context/CitricContext.tsx +4 -4
  193. package/src/context/CitricProvider.tsx +14 -14
  194. package/src/context/hooks.ts +6 -6
  195. package/src/index.ts +59 -58
  196. package/src/overlay.ts +348 -348
  197. package/src/types.ts +235 -235
  198. package/src/utils/ValueController.ts +28 -28
  199. package/src/utils/acessibility.ts +92 -92
  200. package/src/utils/checkbox.ts +121 -121
  201. package/src/utils/css.ts +119 -119
  202. package/src/utils/options.ts +9 -9
  203. package/src/utils/radio.ts +93 -93
  204. package/src/utils/react.ts +6 -6
  205. package/src/utils/time.ts +5 -5
  206. package/tsconfig.json +10 -10
@@ -1,167 +1,167 @@
1
- import { listToClass } from '@stack-spot/portal-theme'
2
- import { useMemo } from 'react'
3
- import { WithColorPalette, WithColorScheme } from '../types'
4
- import { defaultRenderKey, defaultRenderLabel } from '../utils/options'
5
- import { withRef } from '../utils/react'
6
- import { CitricComponent } from './CitricComponent'
7
- import { layout } from './layout'
8
-
9
- export interface SelectBoxLabel {
10
- icon?: React.ReactElement,
11
- title: string,
12
- description?: string,
13
- }
14
-
15
- export interface CommonSelectBoxProps<T> extends WithColorPalette, WithColorScheme {
16
- /**
17
- * If multiple is true, checkboxes will be rendered instead of radio buttons.
18
- *
19
- * @default false
20
- */
21
- multiple?: boolean,
22
- /**
23
- * The name for all checkboxes or radio buttons.
24
- */
25
- name?: string,
26
- /**
27
- * The options to show as select boxes.
28
- */
29
- options: T[],
30
- /**
31
- * A function that returns the data to render a select box for an option.
32
- *
33
- * @default "extracts the title by converting the option to a string"
34
- */
35
- renderLabel?: (option: T) => SelectBoxLabel,
36
- /**
37
- * A function that returns a unique identifier for an option.
38
- *
39
- * @default "if the option is a string, uses it as the key. Otherwise, the key won't be specified."
40
- */
41
- renderKey?: (option: T) => string | number | undefined,
42
- /**
43
- * A function that receives an option and decides if it's disabled or not.
44
- */
45
- isDisabled?: (option: T) => boolean,
46
- /**
47
- * Whether to render a row (horizontal) or a column (vertical).
48
- *
49
- * @default 'horizontal'
50
- */
51
- direction?: 'horizontal' | 'vertical',
52
- /**
53
- * The background color level.
54
- *
55
- * @default 300
56
- */
57
- bgLevel?: 300 | 400 | 500 | 600 | 700,
58
- }
59
-
60
- interface CheckboxProps<T> extends CommonSelectBoxProps<T> {
61
- multiple: true,
62
- value?: T[],
63
- onChange?: (value: T[]) => void,
64
- }
65
-
66
- interface RadioProps<T> extends CommonSelectBoxProps<T> {
67
- multiple?: false,
68
- value?: T,
69
- onChange?: (value: T) => void,
70
- }
71
-
72
- export type BaseSelectBoxProps<T> = RadioProps<T> | CheckboxProps<T>
73
-
74
- export type SelectBoxProps<T> = Omit<React.JSX.IntrinsicElements['div'], 'onChange' | 'children'> & BaseSelectBoxProps<T>
75
-
76
- /**
77
- * This component does exactly the same thing as "CheckboxGroup" and "RadioGroup", but with different visuals and less customization.
78
- *
79
- * Each option is rendered as a selectable card. The user can select a single option (radio buttons) or multiple options (checkboxes),
80
- * depending on the value of the property "multiple", which is false by default.
81
- *
82
- * Use `renderLabel` to determine what to render inside each card. This is not a free react element, it must return an object containing an
83
- * icon, a title and a description.
84
- *
85
- * @example
86
- *
87
- * ```
88
- * const options = useMemo(() => [
89
- * { id: 1, image: 'https://images.com/1.png', name: 'Basic plan', price: 59 },
90
- * { id: 2, image: 'https://images.com/2.png', name: 'Gold plan', price: 69 },
91
- * { id: 3, image: 'https://images.com/3.png', name: 'Safira plan', price: 79' },
92
- * { id: 4, image: 'https://images.com/4.png', name: 'Diamond plan', price: 99 },
93
- * ], [])
94
- *
95
- * return <SelectBox
96
- * options={options}
97
- * renderKey={o => o.id}
98
- * renderLabel={o => ({
99
- * icon: <img src={o.image} />,
100
- * title: o.name,
101
- * description: `$${price.toFixed(2)}`,
102
- * })}
103
- * />
104
- * ```
105
- */
106
- export const SelectBox = withRef(
107
- function SelectBox<T>({
108
- multiple,
109
- name,
110
- value,
111
- options,
112
- onChange,
113
- renderLabel = o => ({ title: defaultRenderLabel(o) }),
114
- renderKey = defaultRenderKey,
115
- isDisabled,
116
- className,
117
- style,
118
- direction,
119
- bgLevel,
120
- colorPalette,
121
- colorScheme,
122
- ...props
123
- }: SelectBoxProps<T>) {
124
- const items = useMemo(() => {
125
- const valueAsArray = value ? (Array.isArray(value) ? value : [value]) : []
126
- const valueKeys = valueAsArray.map(renderKey)
127
- return options.map((o) => {
128
- const key = renderKey(o)
129
- const label = renderLabel(o)
130
- return (
131
- <CitricComponent key={key} tag="label" component="select-box" className={bgLevel ? `bg-${bgLevel}` : undefined}>
132
- <input
133
- type={multiple ? 'checkbox' : 'radio'}
134
- name={name}
135
- value={key}
136
- checked={value ? valueKeys.includes(key) : undefined}
137
- disabled={isDisabled?.(o)}
138
- onChange={onChange ? (e) => {
139
- if (multiple) {
140
- onChange(e.target.checked ? [...valueAsArray, o] : valueAsArray.filter(v => renderKey(v) !== key))
141
- } else {
142
- onChange(o)
143
- }
144
- } : undefined}
145
- />
146
- <div className="option">
147
- {label.icon}
148
- <p className="title">{label.title}</p>
149
- {label.description && <p className="description">{label.description}</p>}
150
- </div>
151
- </CitricComponent>
152
- )
153
- })
154
- }, [options, value, name, multiple, bgLevel])
155
- return (
156
- <div
157
- data-color-palette={colorPalette}
158
- data-color-scheme={colorScheme}
159
- className={listToClass([className, direction === 'vertical' ? layout.column : layout.row])}
160
- style={{ gap: '5px', ...style }}
161
- {...props}
162
- >
163
- {items}
164
- </div>
165
- )
166
- },
167
- )
1
+ import { listToClass } from '@stack-spot/portal-theme'
2
+ import { useMemo } from 'react'
3
+ import { WithColorPalette, WithColorScheme } from '../types'
4
+ import { defaultRenderKey, defaultRenderLabel } from '../utils/options'
5
+ import { withRef } from '../utils/react'
6
+ import { CitricComponent } from './CitricComponent'
7
+ import { layout } from './layout'
8
+
9
+ export interface SelectBoxLabel {
10
+ icon?: React.ReactElement,
11
+ title: string,
12
+ description?: string,
13
+ }
14
+
15
+ export interface CommonSelectBoxProps<T> extends WithColorPalette, WithColorScheme {
16
+ /**
17
+ * If multiple is true, checkboxes will be rendered instead of radio buttons.
18
+ *
19
+ * @default false
20
+ */
21
+ multiple?: boolean,
22
+ /**
23
+ * The name for all checkboxes or radio buttons.
24
+ */
25
+ name?: string,
26
+ /**
27
+ * The options to show as select boxes.
28
+ */
29
+ options: T[],
30
+ /**
31
+ * A function that returns the data to render a select box for an option.
32
+ *
33
+ * @default "extracts the title by converting the option to a string"
34
+ */
35
+ renderLabel?: (option: T) => SelectBoxLabel,
36
+ /**
37
+ * A function that returns a unique identifier for an option.
38
+ *
39
+ * @default "if the option is a string, uses it as the key. Otherwise, the key won't be specified."
40
+ */
41
+ renderKey?: (option: T) => string | number | undefined,
42
+ /**
43
+ * A function that receives an option and decides if it's disabled or not.
44
+ */
45
+ isDisabled?: (option: T) => boolean,
46
+ /**
47
+ * Whether to render a row (horizontal) or a column (vertical).
48
+ *
49
+ * @default 'horizontal'
50
+ */
51
+ direction?: 'horizontal' | 'vertical',
52
+ /**
53
+ * The background color level.
54
+ *
55
+ * @default 300
56
+ */
57
+ bgLevel?: 300 | 400 | 500 | 600 | 700,
58
+ }
59
+
60
+ interface CheckboxProps<T> extends CommonSelectBoxProps<T> {
61
+ multiple: true,
62
+ value?: T[],
63
+ onChange?: (value: T[]) => void,
64
+ }
65
+
66
+ interface RadioProps<T> extends CommonSelectBoxProps<T> {
67
+ multiple?: false,
68
+ value?: T,
69
+ onChange?: (value: T) => void,
70
+ }
71
+
72
+ export type BaseSelectBoxProps<T> = RadioProps<T> | CheckboxProps<T>
73
+
74
+ export type SelectBoxProps<T> = Omit<React.JSX.IntrinsicElements['div'], 'onChange' | 'children'> & BaseSelectBoxProps<T>
75
+
76
+ /**
77
+ * This component does exactly the same thing as "CheckboxGroup" and "RadioGroup", but with different visuals and less customization.
78
+ *
79
+ * Each option is rendered as a selectable card. The user can select a single option (radio buttons) or multiple options (checkboxes),
80
+ * depending on the value of the property "multiple", which is false by default.
81
+ *
82
+ * Use `renderLabel` to determine what to render inside each card. This is not a free react element, it must return an object containing an
83
+ * icon, a title and a description.
84
+ *
85
+ * @example
86
+ *
87
+ * ```
88
+ * const options = useMemo(() => [
89
+ * { id: 1, image: 'https://images.com/1.png', name: 'Basic plan', price: 59 },
90
+ * { id: 2, image: 'https://images.com/2.png', name: 'Gold plan', price: 69 },
91
+ * { id: 3, image: 'https://images.com/3.png', name: 'Safira plan', price: 79' },
92
+ * { id: 4, image: 'https://images.com/4.png', name: 'Diamond plan', price: 99 },
93
+ * ], [])
94
+ *
95
+ * return <SelectBox
96
+ * options={options}
97
+ * renderKey={o => o.id}
98
+ * renderLabel={o => ({
99
+ * icon: <img src={o.image} />,
100
+ * title: o.name,
101
+ * description: `$${price.toFixed(2)}`,
102
+ * })}
103
+ * />
104
+ * ```
105
+ */
106
+ export const SelectBox = withRef(
107
+ function SelectBox<T>({
108
+ multiple,
109
+ name,
110
+ value,
111
+ options,
112
+ onChange,
113
+ renderLabel = o => ({ title: defaultRenderLabel(o) }),
114
+ renderKey = defaultRenderKey,
115
+ isDisabled,
116
+ className,
117
+ style,
118
+ direction,
119
+ bgLevel,
120
+ colorPalette,
121
+ colorScheme,
122
+ ...props
123
+ }: SelectBoxProps<T>) {
124
+ const items = useMemo(() => {
125
+ const valueAsArray = value ? (Array.isArray(value) ? value : [value]) : []
126
+ const valueKeys = valueAsArray.map(renderKey)
127
+ return options.map((o) => {
128
+ const key = renderKey(o)
129
+ const label = renderLabel(o)
130
+ return (
131
+ <CitricComponent key={key} tag="label" component="select-box" className={bgLevel ? `bg-${bgLevel}` : undefined}>
132
+ <input
133
+ type={multiple ? 'checkbox' : 'radio'}
134
+ name={name}
135
+ value={key}
136
+ checked={value ? valueKeys.includes(key) : undefined}
137
+ disabled={isDisabled?.(o)}
138
+ onChange={onChange ? (e) => {
139
+ if (multiple) {
140
+ onChange(e.target.checked ? [...valueAsArray, o] : valueAsArray.filter(v => renderKey(v) !== key))
141
+ } else {
142
+ onChange(o)
143
+ }
144
+ } : undefined}
145
+ />
146
+ <div className="option">
147
+ {label.icon}
148
+ <p className="title">{label.title}</p>
149
+ {label.description && <p className="description">{label.description}</p>}
150
+ </div>
151
+ </CitricComponent>
152
+ )
153
+ })
154
+ }, [options, value, name, multiple, bgLevel])
155
+ return (
156
+ <div
157
+ data-color-palette={colorPalette}
158
+ data-color-scheme={colorScheme}
159
+ className={listToClass([className, direction === 'vertical' ? layout.column : layout.row])}
160
+ style={{ gap: '5px', ...style }}
161
+ {...props}
162
+ >
163
+ {items}
164
+ </div>
165
+ )
166
+ },
167
+ )
@@ -1,53 +1,53 @@
1
- import { listToClass } from '@stack-spot/portal-theme'
2
- import { withRef } from '../utils/react'
3
- import { CitricComponent } from './CitricComponent'
4
-
5
- export interface BaseSkeletonProps {
6
- /**
7
- * The skeleton's appearance.
8
- *
9
- * @default 'square'
10
- */
11
- appearance?: 'square' | 'circle',
12
- /**
13
- * The skeleton's width.
14
- *
15
- * @default "the available width if 'square', 50px if 'circle'".
16
- */
17
- width?: string,
18
- /**
19
- * The skeleton's width.
20
- *
21
- * @default "32px if 'square', 50px if 'circle'".
22
- */
23
- height?: string,
24
- /**
25
- * The background color level.
26
- *
27
- * @default 500
28
- */
29
- bgLevel?: 400 | 500 | 600,
30
- }
31
-
32
- export type SkeletonProps = React.JSX.IntrinsicElements['div'] & BaseSkeletonProps
33
-
34
- /**
35
- * A loading feedback with a discrete animation. Use this to replace elements on the page that are still loading and will be replaced by
36
- * the same shape when the loading ends.
37
- *
38
- * Use the property "bgLevel" to manage how light/dark the background is.
39
- *
40
- * @example
41
- * ```
42
- * <Skeleton width="100%" height="20px" />
43
- * ```
44
- */
45
- export const Skeleton = withRef(({ appearance, className, style, width, height, bgLevel, ...props }: SkeletonProps) =>
46
- <CitricComponent
47
- tag="div"
48
- component="skeleton"
49
- className={listToClass([appearance, bgLevel && `bg-${bgLevel}`, className])}
50
- style={{ width, height, ...style }}
51
- {...props}
52
- />,
53
- )
1
+ import { listToClass } from '@stack-spot/portal-theme'
2
+ import { withRef } from '../utils/react'
3
+ import { CitricComponent } from './CitricComponent'
4
+
5
+ export interface BaseSkeletonProps {
6
+ /**
7
+ * The skeleton's appearance.
8
+ *
9
+ * @default 'square'
10
+ */
11
+ appearance?: 'square' | 'circle',
12
+ /**
13
+ * The skeleton's width.
14
+ *
15
+ * @default "the available width if 'square', 50px if 'circle'".
16
+ */
17
+ width?: string,
18
+ /**
19
+ * The skeleton's width.
20
+ *
21
+ * @default "32px if 'square', 50px if 'circle'".
22
+ */
23
+ height?: string,
24
+ /**
25
+ * The background color level.
26
+ *
27
+ * @default 500
28
+ */
29
+ bgLevel?: 400 | 500 | 600,
30
+ }
31
+
32
+ export type SkeletonProps = React.JSX.IntrinsicElements['div'] & BaseSkeletonProps
33
+
34
+ /**
35
+ * A loading feedback with a discrete animation. Use this to replace elements on the page that are still loading and will be replaced by
36
+ * the same shape when the loading ends.
37
+ *
38
+ * Use the property "bgLevel" to manage how light/dark the background is.
39
+ *
40
+ * @example
41
+ * ```
42
+ * <Skeleton width="100%" height="20px" />
43
+ * ```
44
+ */
45
+ export const Skeleton = withRef(({ appearance, className, style, width, height, bgLevel, ...props }: SkeletonProps) =>
46
+ <CitricComponent
47
+ tag="div"
48
+ component="skeleton"
49
+ className={listToClass([appearance, bgLevel && `bg-${bgLevel}`, className])}
50
+ style={{ width, height, ...style }}
51
+ {...props}
52
+ />,
53
+ )
@@ -1,89 +1,89 @@
1
- import { listToClass } from '@stack-spot/portal-theme'
2
- import { ControlledInput, WithColorPalette, WithColorScheme } from '../types'
3
- import { applyCSSVariable } from '../utils/css'
4
- import { withRef } from '../utils/react'
5
- import { CitricComponent } from './CitricComponent'
6
-
7
- export interface BaseSliderProps extends WithColorScheme, WithColorPalette {
8
- value: number,
9
- /**
10
- * The minimum value in the numeric range.
11
- *
12
- * @default 0
13
- */
14
- min?: number,
15
- /**
16
- * The maximum value in the numeric range.
17
- *
18
- * @default 100
19
- */
20
- max?: number,
21
- onChange: (value: number) => void,
22
- /**
23
- * When should we render the current value of the input?
24
- *
25
- * @default 'always'
26
- */
27
- showValue?: 'always' | 'hover' | 'never',
28
- /**
29
- * A function to customize how the value of the input is rendered.
30
- *
31
- * @default "{value}% if 'min' and 'max' are not provided. {value} otherwise."
32
- */
33
- renderValue?: (value: number) => string,
34
- }
35
-
36
- export type SliderProps = ControlledInput & BaseSliderProps
37
-
38
- /**
39
- * A UI element where the user can slide a knob over a bar to select a number. By default, a number between 0 and 100 can be selected, use
40
- * the properties "min" and "max" to change this.
41
- *
42
- * Attention: "onChange" receives the new value (number) instead of the event.
43
- *
44
- * @example
45
- * ```
46
- * const [value, setValue] = useState(0)
47
- * return <Slider value={value} setValue={setValue} />
48
- * ```
49
- */
50
- export const Slider = withRef((
51
- { value, onChange, min, max, style, showValue, renderValue, colorPalette, colorScheme, className, ...props }: SliderProps,
52
- ) => {
53
- const percent = Math.floor((value / ((max ?? 100) - (min ?? 0))) * 100)
54
- style = applyCSSVariable(style, 'percent', percent)
55
- const rangeProps = {
56
- value,
57
- min,
58
- max,
59
- onChange: (e: React.ChangeEvent<HTMLInputElement>) => onChange(parseInt(e.target.value)),
60
- ...props,
61
- }
62
-
63
- return showValue === 'never'
64
- ? <CitricComponent
65
- tag="input"
66
- type="range"
67
- component="slider"
68
- style={style}
69
- className={className}
70
- colorPalette={colorPalette}
71
- colorScheme={colorScheme}
72
- {...rangeProps}
73
- />
74
- : (
75
- <CitricComponent
76
- tag="div"
77
- component="labeled-slider"
78
- style={style}
79
- colorPalette={colorPalette}
80
- colorScheme={colorScheme}
81
- className={listToClass([className, showValue === 'hover' && 'value-on-hover'])}
82
- >
83
- <input type="range" {...rangeProps} />
84
- <div className="value">
85
- {renderValue ? renderValue(value) : `${value}${min === undefined && max === undefined ? '%' : ''}`}
86
- </div>
87
- </CitricComponent>
88
- )
89
- })
1
+ import { listToClass } from '@stack-spot/portal-theme'
2
+ import { ControlledInput, WithColorPalette, WithColorScheme } from '../types'
3
+ import { applyCSSVariable } from '../utils/css'
4
+ import { withRef } from '../utils/react'
5
+ import { CitricComponent } from './CitricComponent'
6
+
7
+ export interface BaseSliderProps extends WithColorScheme, WithColorPalette {
8
+ value: number,
9
+ /**
10
+ * The minimum value in the numeric range.
11
+ *
12
+ * @default 0
13
+ */
14
+ min?: number,
15
+ /**
16
+ * The maximum value in the numeric range.
17
+ *
18
+ * @default 100
19
+ */
20
+ max?: number,
21
+ onChange: (value: number) => void,
22
+ /**
23
+ * When should we render the current value of the input?
24
+ *
25
+ * @default 'always'
26
+ */
27
+ showValue?: 'always' | 'hover' | 'never',
28
+ /**
29
+ * A function to customize how the value of the input is rendered.
30
+ *
31
+ * @default "{value}% if 'min' and 'max' are not provided. {value} otherwise."
32
+ */
33
+ renderValue?: (value: number) => string,
34
+ }
35
+
36
+ export type SliderProps = ControlledInput & BaseSliderProps
37
+
38
+ /**
39
+ * A UI element where the user can slide a knob over a bar to select a number. By default, a number between 0 and 100 can be selected, use
40
+ * the properties "min" and "max" to change this.
41
+ *
42
+ * Attention: "onChange" receives the new value (number) instead of the event.
43
+ *
44
+ * @example
45
+ * ```
46
+ * const [value, setValue] = useState(0)
47
+ * return <Slider value={value} setValue={setValue} />
48
+ * ```
49
+ */
50
+ export const Slider = withRef((
51
+ { value, onChange, min, max, style, showValue, renderValue, colorPalette, colorScheme, className, ...props }: SliderProps,
52
+ ) => {
53
+ const percent = Math.floor((value / ((max ?? 100) - (min ?? 0))) * 100)
54
+ style = applyCSSVariable(style, 'percent', percent)
55
+ const rangeProps = {
56
+ value,
57
+ min,
58
+ max,
59
+ onChange: (e: React.ChangeEvent<HTMLInputElement>) => onChange(parseInt(e.target.value)),
60
+ ...props,
61
+ }
62
+
63
+ return showValue === 'never'
64
+ ? <CitricComponent
65
+ tag="input"
66
+ type="range"
67
+ component="slider"
68
+ style={style}
69
+ className={className}
70
+ colorPalette={colorPalette}
71
+ colorScheme={colorScheme}
72
+ {...rangeProps}
73
+ />
74
+ : (
75
+ <CitricComponent
76
+ tag="div"
77
+ component="labeled-slider"
78
+ style={style}
79
+ colorPalette={colorPalette}
80
+ colorScheme={colorScheme}
81
+ className={listToClass([className, showValue === 'hover' && 'value-on-hover'])}
82
+ >
83
+ <input type="range" {...rangeProps} />
84
+ <div className="value">
85
+ {renderValue ? renderValue(value) : `${value}${min === undefined && max === undefined ? '%' : ''}`}
86
+ </div>
87
+ </CitricComponent>
88
+ )
89
+ })