@stack-spot/citric-react 0.38.0 → 0.39.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 (189) hide show
  1. package/CHANGELOG.md +13 -13
  2. package/dist/citric.css +2844 -2844
  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/Avatar.d.ts +1 -1
  10. package/dist/components/Avatar.js +1 -1
  11. package/dist/components/AvatarGroup.d.ts +1 -1
  12. package/dist/components/AvatarGroup.js +1 -1
  13. package/dist/components/Badge.d.ts +1 -1
  14. package/dist/components/Badge.js +1 -1
  15. package/dist/components/Blockquote.d.ts +1 -1
  16. package/dist/components/Blockquote.js +1 -1
  17. package/dist/components/Breadcrumb.d.ts +1 -1
  18. package/dist/components/Breadcrumb.js +1 -1
  19. package/dist/components/Button.d.ts +1 -1
  20. package/dist/components/Button.js +1 -1
  21. package/dist/components/ButtonLink.d.ts +1 -1
  22. package/dist/components/ButtonLink.js +1 -1
  23. package/dist/components/Card.d.ts +1 -1
  24. package/dist/components/Card.js +1 -1
  25. package/dist/components/Checkbox.d.ts +1 -1
  26. package/dist/components/Checkbox.js +1 -1
  27. package/dist/components/CheckboxGroup.d.ts +1 -1
  28. package/dist/components/CheckboxGroup.d.ts.map +1 -1
  29. package/dist/components/CheckboxGroup.js +2 -2
  30. package/dist/components/CheckboxGroup.js.map +1 -1
  31. package/dist/components/Circle.d.ts +1 -1
  32. package/dist/components/Circle.js +1 -1
  33. package/dist/components/Divider.d.ts +1 -1
  34. package/dist/components/Divider.js +1 -1
  35. package/dist/components/ErrorBoundary.d.ts +1 -1
  36. package/dist/components/ErrorBoundary.js +1 -1
  37. package/dist/components/ErrorMessage.d.ts +1 -1
  38. package/dist/components/ErrorMessage.js +1 -1
  39. package/dist/components/FallbackBoundary.d.ts +1 -1
  40. package/dist/components/FallbackBoundary.js +1 -1
  41. package/dist/components/Favorite.d.ts +1 -1
  42. package/dist/components/Favorite.js +1 -1
  43. package/dist/components/FieldGroup.d.ts +1 -1
  44. package/dist/components/FieldGroup.js +1 -1
  45. package/dist/components/Form.d.ts +2 -2
  46. package/dist/components/Form.js +1 -1
  47. package/dist/components/FormGroup.d.ts +1 -1
  48. package/dist/components/FormGroup.js +1 -1
  49. package/dist/components/Icon.d.ts +1 -1
  50. package/dist/components/Icon.js +1 -1
  51. package/dist/components/IconBox.d.ts +3 -3
  52. package/dist/components/IconBox.js +1 -1
  53. package/dist/components/ImageBox.d.ts +3 -3
  54. package/dist/components/ImageBox.js +1 -1
  55. package/dist/components/ImageWithFallback.d.ts +1 -1
  56. package/dist/components/ImageWithFallback.js +1 -1
  57. package/dist/components/Input.d.ts +1 -1
  58. package/dist/components/Input.js +1 -1
  59. package/dist/components/Link.d.ts +1 -1
  60. package/dist/components/Link.js +1 -1
  61. package/dist/components/LoadingPanel.d.ts +1 -1
  62. package/dist/components/LoadingPanel.js +1 -1
  63. package/dist/components/MenuOverlay/Menu.d.ts +1 -1
  64. package/dist/components/MenuOverlay/Menu.js +1 -1
  65. package/dist/components/MenuOverlay/index.d.ts +1 -1
  66. package/dist/components/MenuOverlay/index.js +1 -1
  67. package/dist/components/Overlay/index.d.ts +4 -1
  68. package/dist/components/Overlay/index.d.ts.map +1 -1
  69. package/dist/components/Overlay/index.js +4 -1
  70. package/dist/components/Overlay/index.js.map +1 -1
  71. package/dist/components/Pagination.d.ts +1 -1
  72. package/dist/components/Pagination.js +1 -1
  73. package/dist/components/ProgressBar.d.ts +1 -1
  74. package/dist/components/ProgressBar.js +1 -1
  75. package/dist/components/ProgressCircular.d.ts +1 -1
  76. package/dist/components/ProgressCircular.js +1 -1
  77. package/dist/components/RadioGroup.d.ts +1 -1
  78. package/dist/components/RadioGroup.js +1 -1
  79. package/dist/components/Rating.d.ts +1 -1
  80. package/dist/components/Rating.js +1 -1
  81. package/dist/components/Select/MultiSelect.d.ts +1 -1
  82. package/dist/components/Select/MultiSelect.js +1 -1
  83. package/dist/components/Select/RichSelect.d.ts +1 -1
  84. package/dist/components/Select/RichSelect.js +1 -1
  85. package/dist/components/Select/SimpleSelect.d.ts +1 -1
  86. package/dist/components/Select/SimpleSelect.js +1 -1
  87. package/dist/components/Select/index.d.ts +1 -1
  88. package/dist/components/Select/index.js +1 -1
  89. package/dist/components/SelectBox.d.ts +1 -1
  90. package/dist/components/SelectBox.js +1 -1
  91. package/dist/components/Skeleton.d.ts +1 -1
  92. package/dist/components/Skeleton.js +1 -1
  93. package/dist/components/Slider.d.ts +1 -1
  94. package/dist/components/Slider.js +1 -1
  95. package/dist/components/SmartTable.d.ts +1 -1
  96. package/dist/components/SmartTable.js +1 -1
  97. package/dist/components/Stepper.d.ts +1 -1
  98. package/dist/components/Stepper.js +1 -1
  99. package/dist/components/Table.d.ts +3 -3
  100. package/dist/components/Table.js +1 -1
  101. package/dist/components/Tabs/index.d.ts +1 -1
  102. package/dist/components/Tabs/index.js +1 -1
  103. package/dist/components/Textarea.d.ts +1 -1
  104. package/dist/components/Textarea.js +1 -1
  105. package/dist/components/Tooltip.d.ts +1 -1
  106. package/dist/components/Tooltip.js +1 -1
  107. package/dist/context/CitricProvider.d.ts +1 -1
  108. package/dist/context/CitricProvider.js +1 -1
  109. package/dist/overlay.js +1 -1
  110. package/dist/theme.css +415 -415
  111. package/package.json +1 -1
  112. package/scripts/build-css.ts +49 -49
  113. package/src/components/Accordion.tsx +130 -130
  114. package/src/components/Alert.tsx +24 -24
  115. package/src/components/AsyncContent.tsx +70 -70
  116. package/src/components/Avatar.tsx +45 -45
  117. package/src/components/AvatarGroup.tsx +49 -49
  118. package/src/components/Badge.tsx +47 -47
  119. package/src/components/Blockquote.tsx +18 -18
  120. package/src/components/Breadcrumb.tsx +33 -33
  121. package/src/components/Button.tsx +105 -105
  122. package/src/components/ButtonLink.tsx +45 -45
  123. package/src/components/Card.tsx +68 -68
  124. package/src/components/Checkbox.tsx +51 -51
  125. package/src/components/CheckboxGroup.tsx +153 -152
  126. package/src/components/Circle.tsx +43 -43
  127. package/src/components/CitricComponent.ts +47 -47
  128. package/src/components/Divider.tsx +24 -24
  129. package/src/components/ErrorBoundary.tsx +75 -75
  130. package/src/components/ErrorMessage.tsx +11 -11
  131. package/src/components/FallbackBoundary.tsx +40 -40
  132. package/src/components/Favorite.tsx +57 -57
  133. package/src/components/FieldGroup.tsx +46 -46
  134. package/src/components/Form.tsx +36 -36
  135. package/src/components/FormGroup.tsx +57 -57
  136. package/src/components/Icon.tsx +35 -35
  137. package/src/components/IconBox.tsx +134 -134
  138. package/src/components/ImageBox.tsx +125 -125
  139. package/src/components/ImageWithFallback.tsx +65 -65
  140. package/src/components/Input.tsx +49 -49
  141. package/src/components/Link.tsx +55 -55
  142. package/src/components/LoadingPanel.tsx +8 -8
  143. package/src/components/MenuOverlay/Menu.tsx +158 -158
  144. package/src/components/MenuOverlay/context.ts +20 -20
  145. package/src/components/MenuOverlay/index.tsx +55 -55
  146. package/src/components/MenuOverlay/keyboard.ts +60 -60
  147. package/src/components/MenuOverlay/types.ts +171 -171
  148. package/src/components/Overlay/context.ts +10 -10
  149. package/src/components/Overlay/index.tsx +167 -164
  150. package/src/components/Overlay/types.ts +70 -70
  151. package/src/components/Pagination.tsx +133 -133
  152. package/src/components/ProgressBar.tsx +45 -45
  153. package/src/components/ProgressCircular.tsx +45 -45
  154. package/src/components/RadioGroup.tsx +146 -146
  155. package/src/components/Rating.tsx +98 -98
  156. package/src/components/Select/MultiSelect.tsx +217 -217
  157. package/src/components/Select/RichSelect.tsx +128 -128
  158. package/src/components/Select/SimpleSelect.tsx +73 -73
  159. package/src/components/Select/hooks.ts +133 -133
  160. package/src/components/Select/index.tsx +35 -35
  161. package/src/components/Select/types.ts +134 -134
  162. package/src/components/SelectBox.tsx +167 -167
  163. package/src/components/Skeleton.tsx +53 -53
  164. package/src/components/Slider.tsx +89 -89
  165. package/src/components/SmartTable.tsx +227 -227
  166. package/src/components/Stepper.tsx +163 -163
  167. package/src/components/Table.tsx +234 -234
  168. package/src/components/Tabs/TabController.ts +54 -54
  169. package/src/components/Tabs/index.tsx +87 -87
  170. package/src/components/Tabs/types.ts +54 -54
  171. package/src/components/Tabs/utils.ts +6 -6
  172. package/src/components/Text.ts +111 -111
  173. package/src/components/Textarea.tsx +27 -27
  174. package/src/components/Tooltip.tsx +72 -72
  175. package/src/components/layout.tsx +101 -101
  176. package/src/context/CitricContext.tsx +4 -4
  177. package/src/context/CitricProvider.tsx +14 -14
  178. package/src/context/hooks.ts +6 -6
  179. package/src/index.ts +58 -58
  180. package/src/overlay.ts +341 -341
  181. package/src/types.ts +216 -216
  182. package/src/utils/ValueController.ts +28 -28
  183. package/src/utils/acessibility.ts +92 -92
  184. package/src/utils/checkbox.ts +121 -121
  185. package/src/utils/css.ts +119 -119
  186. package/src/utils/options.ts +9 -9
  187. package/src/utils/radio.ts +93 -93
  188. package/src/utils/react.ts +6 -6
  189. package/tsconfig.json +10 -10
@@ -1,128 +1,128 @@
1
- import { listToClass } from '@stack-spot/portal-theme'
2
- import { useTranslate } from '@stack-spot/portal-translate'
3
- import { useCallback, useMemo, useRef, useState } from 'react'
4
- import { applyCSSVariable } from '../../utils/css'
5
- import { defaultRenderKey, defaultRenderLabel } from '../../utils/options'
6
- import { withRef } from '../../utils/react'
7
- import { CitricComponent } from '../CitricComponent'
8
- import { Input } from '../Input'
9
- import { ProgressCircular } from '../ProgressCircular'
10
- import { useDisabledEffect, useFocusEffect, useOpenPanelEffect } from './hooks'
11
- import { SimpleSelect } from './SimpleSelect'
12
- import { SelectProps } from './types'
13
-
14
- export const RichSelect = withRef(
15
- function RichSelect<T>({
16
- ref,
17
- options,
18
- value,
19
- onChange,
20
- renderLabel = defaultRenderLabel,
21
- renderKey = defaultRenderKey,
22
- required = true,
23
- disabled,
24
- loading,
25
- renderOption,
26
- renderHeader,
27
- searchable,
28
- maxHeight,
29
- style,
30
- className,
31
- onFocus,
32
- onBlur,
33
- showArrow,
34
- placeholder,
35
- ...props
36
- }: SelectProps<T> & { type?: 'rich' },
37
- ) {
38
- const [search, setSearch] = useState<string | undefined>('')
39
- const _element = useRef<HTMLDivElement | null>(null)
40
- const element = ref ?? _element
41
- const [open, setOpen] = useState(false)
42
- const [focused, setFocused] = useState(false)
43
- const t = useTranslate(dictionary)
44
-
45
- const change = useCallback((option: T | undefined) => () => {
46
- onChange?.(option)
47
- setOpen(false)
48
- }, [])
49
-
50
- const renderedOptions = useMemo(() => {
51
- const items = required
52
- ? []
53
- : [<li key="" className="empty option" onClick={change(undefined)}>{renderLabel(undefined) || t.empty}</li>]
54
- options.forEach((o) => {
55
- const key = renderKey(o)
56
- const label = renderLabel(o)
57
- if (!search?.trim() || label.toLocaleLowerCase().includes(search?.trim().toLocaleLowerCase())) {
58
- items.push(
59
- <li key={key} onClick={change(o)} className="option">
60
- {renderOption?.(o) ?? label}
61
- </li>,
62
- )
63
- }
64
- })
65
- return items
66
- }, [options, value, required, search])
67
-
68
- useOpenPanelEffect({ open, setOpen, setSearch, element, searchable })
69
- useFocusEffect({ element, focused, setFocused, setOpen })
70
- useDisabledEffect({ disabled, setOpen, setFocused })
71
-
72
- return (
73
- <CitricComponent
74
- tag="div"
75
- component="rich-select"
76
- style={maxHeight ? applyCSSVariable(style, 'max-height', `${maxHeight}px`) : style}
77
- className={listToClass([className, showArrow === false && 'hide-arrow', open && 'open', focused && 'focused'])}
78
- ref={element}
79
- aria-busy={loading}
80
- {...props}
81
- >
82
- <SimpleSelect
83
- options={options}
84
- value={value}
85
- renderLabel={renderLabel}
86
- renderKey={renderKey}
87
- required={required}
88
- disabled={disabled}
89
- onChange={onChange}
90
- onFocus={onFocus}
91
- onBlur={onBlur}
92
- wrap={false}
93
- />
94
- <header
95
- onClick={() => {
96
- if (disabled) return
97
- setFocused(true)
98
- setOpen(true)
99
- }}
100
- aria-hidden
101
- >
102
- {value === undefined
103
- ? <span className="placeholder header-text">{placeholder}</span>
104
- : (renderHeader?.(value) ?? <span className="header-text">{renderOption?.(value) ?? renderLabel(value)}</span>)}
105
- {loading && <ProgressCircular size="xs" className="loader" />}
106
- </header>
107
- <div className="selection-panel" aria-hidden>
108
- {searchable && <div className="search-bar">
109
- <div data-citric="field-group" className="auto">
110
- <i data-citric="icon-box" className="citric-icon outline Search"></i>
111
- <Input type="search" value={search} onChange={setSearch} tabIndex={-1} />
112
- </div>
113
- </div>}
114
- <ul className="options">{renderedOptions}</ul>
115
- </div>
116
- </CitricComponent>
117
- )
118
- },
119
- )
120
-
121
- const dictionary = {
122
- en: {
123
- empty: 'Empty',
124
- },
125
- pt: {
126
- empty: 'Vazio',
127
- },
128
- }
1
+ import { listToClass } from '@stack-spot/portal-theme'
2
+ import { useTranslate } from '@stack-spot/portal-translate'
3
+ import { useCallback, useMemo, useRef, useState } from 'react'
4
+ import { applyCSSVariable } from '../../utils/css'
5
+ import { defaultRenderKey, defaultRenderLabel } from '../../utils/options'
6
+ import { withRef } from '../../utils/react'
7
+ import { CitricComponent } from '../CitricComponent'
8
+ import { Input } from '../Input'
9
+ import { ProgressCircular } from '../ProgressCircular'
10
+ import { useDisabledEffect, useFocusEffect, useOpenPanelEffect } from './hooks'
11
+ import { SimpleSelect } from './SimpleSelect'
12
+ import { SelectProps } from './types'
13
+
14
+ export const RichSelect = withRef(
15
+ function RichSelect<T>({
16
+ ref,
17
+ options,
18
+ value,
19
+ onChange,
20
+ renderLabel = defaultRenderLabel,
21
+ renderKey = defaultRenderKey,
22
+ required = true,
23
+ disabled,
24
+ loading,
25
+ renderOption,
26
+ renderHeader,
27
+ searchable,
28
+ maxHeight,
29
+ style,
30
+ className,
31
+ onFocus,
32
+ onBlur,
33
+ showArrow,
34
+ placeholder,
35
+ ...props
36
+ }: SelectProps<T> & { type?: 'rich' },
37
+ ) {
38
+ const [search, setSearch] = useState<string | undefined>('')
39
+ const _element = useRef<HTMLDivElement | null>(null)
40
+ const element = ref ?? _element
41
+ const [open, setOpen] = useState(false)
42
+ const [focused, setFocused] = useState(false)
43
+ const t = useTranslate(dictionary)
44
+
45
+ const change = useCallback((option: T | undefined) => () => {
46
+ onChange?.(option)
47
+ setOpen(false)
48
+ }, [])
49
+
50
+ const renderedOptions = useMemo(() => {
51
+ const items = required
52
+ ? []
53
+ : [<li key="" className="empty option" onClick={change(undefined)}>{renderLabel(undefined) || t.empty}</li>]
54
+ options.forEach((o) => {
55
+ const key = renderKey(o)
56
+ const label = renderLabel(o)
57
+ if (!search?.trim() || label.toLocaleLowerCase().includes(search?.trim().toLocaleLowerCase())) {
58
+ items.push(
59
+ <li key={key} onClick={change(o)} className="option">
60
+ {renderOption?.(o) ?? label}
61
+ </li>,
62
+ )
63
+ }
64
+ })
65
+ return items
66
+ }, [options, value, required, search])
67
+
68
+ useOpenPanelEffect({ open, setOpen, setSearch, element, searchable })
69
+ useFocusEffect({ element, focused, setFocused, setOpen })
70
+ useDisabledEffect({ disabled, setOpen, setFocused })
71
+
72
+ return (
73
+ <CitricComponent
74
+ tag="div"
75
+ component="rich-select"
76
+ style={maxHeight ? applyCSSVariable(style, 'max-height', `${maxHeight}px`) : style}
77
+ className={listToClass([className, showArrow === false && 'hide-arrow', open && 'open', focused && 'focused'])}
78
+ ref={element}
79
+ aria-busy={loading}
80
+ {...props}
81
+ >
82
+ <SimpleSelect
83
+ options={options}
84
+ value={value}
85
+ renderLabel={renderLabel}
86
+ renderKey={renderKey}
87
+ required={required}
88
+ disabled={disabled}
89
+ onChange={onChange}
90
+ onFocus={onFocus}
91
+ onBlur={onBlur}
92
+ wrap={false}
93
+ />
94
+ <header
95
+ onClick={() => {
96
+ if (disabled) return
97
+ setFocused(true)
98
+ setOpen(true)
99
+ }}
100
+ aria-hidden
101
+ >
102
+ {value === undefined
103
+ ? <span className="placeholder header-text">{placeholder}</span>
104
+ : (renderHeader?.(value) ?? <span className="header-text">{renderOption?.(value) ?? renderLabel(value)}</span>)}
105
+ {loading && <ProgressCircular size="xs" className="loader" />}
106
+ </header>
107
+ <div className="selection-panel" aria-hidden>
108
+ {searchable && <div className="search-bar">
109
+ <div data-citric="field-group" className="auto">
110
+ <i data-citric="icon-box" className="citric-icon outline Search"></i>
111
+ <Input type="search" value={search} onChange={setSearch} tabIndex={-1} />
112
+ </div>
113
+ </div>}
114
+ <ul className="options">{renderedOptions}</ul>
115
+ </div>
116
+ </CitricComponent>
117
+ )
118
+ },
119
+ )
120
+
121
+ const dictionary = {
122
+ en: {
123
+ empty: 'Empty',
124
+ },
125
+ pt: {
126
+ empty: 'Vazio',
127
+ },
128
+ }
@@ -1,73 +1,73 @@
1
- import { MutableRefObject, useCallback, useMemo } from 'react'
2
- import { defaultRenderKey, defaultRenderLabel } from '../../utils/options'
3
- import { withRef } from '../../utils/react'
4
- import { CitricComponent } from '../CitricComponent'
5
- import { ProgressCircular } from '../ProgressCircular'
6
- import { SelectProps } from './types'
7
-
8
- export const SimpleSelect = withRef(
9
- function SimpleSelect<T>({
10
- ref,
11
- options,
12
- value,
13
- onChange,
14
- renderLabel = defaultRenderLabel,
15
- renderKey = defaultRenderKey,
16
- required = true,
17
- loading,
18
- disabled,
19
- onBlur,
20
- onFocus,
21
- wrap,
22
- ...props
23
- }: SelectProps<T> & { wrap?: boolean },
24
- ) {
25
- const handleChange = useCallback((e: React.ChangeEvent<HTMLSelectElement>) => {
26
- const selectedIndex = e.target.options.selectedIndex - (e.target.options.length > options.length ? 1 : 0)
27
- onChange?.(selectedIndex >= 0 ? options[selectedIndex] : undefined)
28
- }, [options])
29
-
30
- const renderedOptions = useMemo(() => {
31
- const items = (!value || !required) ? [<option key="">{renderLabel(undefined)}</option>] : []
32
- options.forEach((o) => {
33
- const key = renderKey(o)
34
- items.push(
35
- <option key={key} value={key}>
36
- {renderLabel(o)}
37
- </option>,
38
- )
39
- })
40
- return items
41
- }, [options, value, required])
42
-
43
- return wrap === false ? (
44
- <CitricComponent
45
- tag="select"
46
- ref={ref as MutableRefObject<HTMLSelectElement | null>}
47
- required={required}
48
- onChange={handleChange}
49
- disabled={disabled || loading}
50
- component="select"
51
- onFocus={onFocus}
52
- onBlur={onBlur}
53
- value={value ? renderKey(value) : ''}
54
- >
55
- {renderedOptions}
56
- </CitricComponent>
57
- ) : (
58
- <CitricComponent ref={ref as MutableRefObject<HTMLDivElement | null>} tag="div" component="select" aria-busy={loading} {...props}>
59
- <select
60
- value={value ? renderKey(value) : undefined}
61
- required={required}
62
- onChange={handleChange}
63
- disabled={disabled || loading}
64
- onFocus={onFocus}
65
- onBlur={onBlur}
66
- >
67
- {renderedOptions}
68
- </select>
69
- {loading && <ProgressCircular className="loader" size="xs" />}
70
- </CitricComponent>
71
- )
72
- },
73
- )
1
+ import { MutableRefObject, useCallback, useMemo } from 'react'
2
+ import { defaultRenderKey, defaultRenderLabel } from '../../utils/options'
3
+ import { withRef } from '../../utils/react'
4
+ import { CitricComponent } from '../CitricComponent'
5
+ import { ProgressCircular } from '../ProgressCircular'
6
+ import { SelectProps } from './types'
7
+
8
+ export const SimpleSelect = withRef(
9
+ function SimpleSelect<T>({
10
+ ref,
11
+ options,
12
+ value,
13
+ onChange,
14
+ renderLabel = defaultRenderLabel,
15
+ renderKey = defaultRenderKey,
16
+ required = true,
17
+ loading,
18
+ disabled,
19
+ onBlur,
20
+ onFocus,
21
+ wrap,
22
+ ...props
23
+ }: SelectProps<T> & { wrap?: boolean },
24
+ ) {
25
+ const handleChange = useCallback((e: React.ChangeEvent<HTMLSelectElement>) => {
26
+ const selectedIndex = e.target.options.selectedIndex - (e.target.options.length > options.length ? 1 : 0)
27
+ onChange?.(selectedIndex >= 0 ? options[selectedIndex] : undefined)
28
+ }, [options])
29
+
30
+ const renderedOptions = useMemo(() => {
31
+ const items = (!value || !required) ? [<option key="">{renderLabel(undefined)}</option>] : []
32
+ options.forEach((o) => {
33
+ const key = renderKey(o)
34
+ items.push(
35
+ <option key={key} value={key}>
36
+ {renderLabel(o)}
37
+ </option>,
38
+ )
39
+ })
40
+ return items
41
+ }, [options, value, required])
42
+
43
+ return wrap === false ? (
44
+ <CitricComponent
45
+ tag="select"
46
+ ref={ref as MutableRefObject<HTMLSelectElement | null>}
47
+ required={required}
48
+ onChange={handleChange}
49
+ disabled={disabled || loading}
50
+ component="select"
51
+ onFocus={onFocus}
52
+ onBlur={onBlur}
53
+ value={value ? renderKey(value) : ''}
54
+ >
55
+ {renderedOptions}
56
+ </CitricComponent>
57
+ ) : (
58
+ <CitricComponent ref={ref as MutableRefObject<HTMLDivElement | null>} tag="div" component="select" aria-busy={loading} {...props}>
59
+ <select
60
+ value={value ? renderKey(value) : undefined}
61
+ required={required}
62
+ onChange={handleChange}
63
+ disabled={disabled || loading}
64
+ onFocus={onFocus}
65
+ onBlur={onBlur}
66
+ >
67
+ {renderedOptions}
68
+ </select>
69
+ {loading && <ProgressCircular className="loader" size="xs" />}
70
+ </CitricComponent>
71
+ )
72
+ },
73
+ )