stargazer-ui 1.5.13 → 1.5.15

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 (372) hide show
  1. package/Bar/Bar.type.d.ts +6 -0
  2. package/Bar/index.js +2 -0
  3. package/Bar/index.js.map +1 -0
  4. package/Bar/package.json +1 -0
  5. package/Button/Button.js +15 -0
  6. package/Button/Button.js.map +1 -0
  7. package/{types/components/Button → Button}/Button.types.d.ts +1 -2
  8. package/Button/index.d.ts +3 -0
  9. package/Button/index.js +7 -0
  10. package/Button/index.js.map +1 -0
  11. package/Button/package.json +1 -0
  12. package/ButtonGroup/ButtonGroup.d.ts +4 -0
  13. package/ButtonGroup/ButtonGroup.js +11 -0
  14. package/ButtonGroup/ButtonGroup.js.map +1 -0
  15. package/ButtonGroup/ButtonGroup.types.d.ts +7 -0
  16. package/ButtonGroup/index.d.ts +3 -0
  17. package/ButtonGroup/index.js +7 -0
  18. package/ButtonGroup/index.js.map +1 -0
  19. package/ButtonGroup/package.json +1 -0
  20. package/{types/components/Card → Card}/Card.d.ts +12 -12
  21. package/Card/Card.js +42 -0
  22. package/Card/Card.js.map +1 -0
  23. package/{types/components/Card → Card}/Card.types.d.ts +3 -1
  24. package/Card/index.d.ts +3 -0
  25. package/Card/index.js +7 -0
  26. package/Card/index.js.map +1 -0
  27. package/Card/package.json +1 -0
  28. package/CloseButton/CloseButton.js +11 -0
  29. package/CloseButton/CloseButton.js.map +1 -0
  30. package/{types/components/CloseButton → CloseButton}/CloseButton.types.d.ts +1 -1
  31. package/CloseButton/index.d.ts +3 -0
  32. package/CloseButton/index.js +7 -0
  33. package/CloseButton/index.js.map +1 -0
  34. package/CloseButton/package.json +1 -0
  35. package/Dropdown/Dropdown.d.ts +135 -0
  36. package/Dropdown/Dropdown.js +379 -0
  37. package/Dropdown/Dropdown.js.map +1 -0
  38. package/{types/components/Dropdown → Dropdown}/Dropdown.types.d.ts +12 -11
  39. package/Dropdown/DropdownOld.d.ts +135 -0
  40. package/Dropdown/index.d.ts +4 -0
  41. package/Dropdown/index.js +8 -0
  42. package/Dropdown/index.js.map +1 -0
  43. package/Dropdown/package.json +1 -0
  44. package/FileUploadButton/FileUploadButton.d.ts +4 -0
  45. package/FileUploadButton/FileUploadButton.js +20 -0
  46. package/FileUploadButton/FileUploadButton.js.map +1 -0
  47. package/FileUploadButton/FileUploadButton.types.d.ts +7 -0
  48. package/FileUploadButton/index.d.ts +3 -0
  49. package/FileUploadButton/index.js +7 -0
  50. package/FileUploadButton/index.js.map +1 -0
  51. package/FileUploadButton/package.json +1 -0
  52. package/FloatingLabel/FloatingLabel.js +15 -0
  53. package/FloatingLabel/FloatingLabel.js.map +1 -0
  54. package/{types/components/FloatingLabel → FloatingLabel}/FloatingLabel.types.d.ts +1 -1
  55. package/FloatingLabel/index.d.ts +3 -0
  56. package/FloatingLabel/index.js +7 -0
  57. package/FloatingLabel/index.js.map +1 -0
  58. package/FloatingLabel/package.json +1 -0
  59. package/Form/Form.d.ts +38 -0
  60. package/Form/Form.js +227 -0
  61. package/Form/Form.js.map +1 -0
  62. package/Form/Form.types.d.ts +159 -0
  63. package/Form/FormSelect.d.ts +14 -0
  64. package/Form/FormSelect.js +436 -0
  65. package/Form/FormSelect.js.map +1 -0
  66. package/Form/index.d.ts +4 -0
  67. package/Form/index.js +8 -0
  68. package/Form/index.js.map +1 -0
  69. package/Form/package.json +1 -0
  70. package/InputGroup/InputGroup.d.ts +7 -0
  71. package/InputGroup/InputGroup.js +31 -0
  72. package/InputGroup/InputGroup.js.map +1 -0
  73. package/InputGroup/InputGroup.types.d.ts +17 -0
  74. package/InputGroup/index.d.ts +4 -0
  75. package/InputGroup/index.js +7 -0
  76. package/InputGroup/index.js.map +1 -0
  77. package/InputGroup/package.json +1 -0
  78. package/List/List.d.ts +14 -0
  79. package/List/List.js +77 -0
  80. package/List/List.js.map +1 -0
  81. package/List/List.types.d.ts +28 -0
  82. package/List/index.d.ts +3 -0
  83. package/List/index.js +7 -0
  84. package/List/index.js.map +1 -0
  85. package/List/package.json +1 -0
  86. package/{types/components/Modal → Modal}/Modal.d.ts +19 -19
  87. package/Modal/Modal.js +157 -0
  88. package/Modal/Modal.js.map +1 -0
  89. package/{types/components/Modal → Modal}/Modal.types.d.ts +3 -2
  90. package/Modal/index.d.ts +3 -0
  91. package/Modal/index.js +7 -0
  92. package/Modal/index.js.map +1 -0
  93. package/Modal/package.json +1 -0
  94. package/{types/components/Nav → Nav}/Nav.d.ts +12 -12
  95. package/Nav/Nav.js +29 -0
  96. package/Nav/Nav.js.map +1 -0
  97. package/{types/components/Nav → Nav}/Nav.types.d.ts +1 -1
  98. package/Nav/index.d.ts +4 -0
  99. package/Nav/index.js +7 -0
  100. package/Nav/index.js.map +1 -0
  101. package/Nav/package.json +1 -0
  102. package/{types/components/NavBar → NavBar}/Navbar.d.ts +7 -8
  103. package/NavBar/Navbar.js +36 -0
  104. package/NavBar/Navbar.js.map +1 -0
  105. package/{types/components/NavBar → NavBar}/Navbar.types.d.ts +2 -1
  106. package/NavBar/index.d.ts +4 -0
  107. package/NavBar/index.js +8 -0
  108. package/NavBar/index.js.map +1 -0
  109. package/NavBar/package.json +1 -0
  110. package/NavDropdown/NavDropdown.d.ts +99 -0
  111. package/NavDropdown/NavDropdown.js +75 -0
  112. package/NavDropdown/NavDropdown.js.map +1 -0
  113. package/NavDropdown/index.d.ts +3 -0
  114. package/NavDropdown/index.js +7 -0
  115. package/NavDropdown/index.js.map +1 -0
  116. package/NavDropdown/package.json +1 -0
  117. package/Overlay/Overlay.d.ts +4 -0
  118. package/Overlay/Overlay.js +242 -0
  119. package/Overlay/Overlay.js.map +1 -0
  120. package/Overlay/Overlay.types.d.ts +22 -0
  121. package/{src/Overlay/index.ts → Overlay/index.d.ts} +3 -3
  122. package/Overlay/index.js +7 -0
  123. package/Overlay/index.js.map +1 -0
  124. package/Overlay/package.json +1 -0
  125. package/{types/components/Popout → Popout}/Popout.d.ts +6 -6
  126. package/Popout/Popout.js +111 -0
  127. package/Popout/Popout.js.map +1 -0
  128. package/{types/components/Popout → Popout}/Popout.types.d.ts +1 -1
  129. package/Popout/index.d.ts +3 -0
  130. package/Popout/index.js +7 -0
  131. package/Popout/index.js.map +1 -0
  132. package/Popout/package.json +1 -0
  133. package/Spinner/Spinner.js +11 -0
  134. package/Spinner/Spinner.js.map +1 -0
  135. package/Spinner/index.d.ts +3 -0
  136. package/Spinner/index.js +7 -0
  137. package/Spinner/index.js.map +1 -0
  138. package/Spinner/package.json +1 -0
  139. package/Table/Table.js +12 -0
  140. package/Table/Table.js.map +1 -0
  141. package/{types/components/Table → Table}/Table.types.d.ts +1 -1
  142. package/Table/index.d.ts +3 -0
  143. package/Table/index.js +7 -0
  144. package/Table/index.js.map +1 -0
  145. package/Table/package.json +1 -0
  146. package/Tabs/Tabs.js +162 -0
  147. package/Tabs/Tabs.js.map +1 -0
  148. package/{types/components/Tabs → Tabs}/Tabs.types.d.ts +12 -2
  149. package/Tabs/index.d.ts +3 -0
  150. package/Tabs/index.js +7 -0
  151. package/Tabs/index.js.map +1 -0
  152. package/Tabs/package.json +1 -0
  153. package/ToggleButton/ToggleButton.d.ts +4 -0
  154. package/ToggleButton/ToggleButton.js +18 -0
  155. package/ToggleButton/ToggleButton.js.map +1 -0
  156. package/ToggleButton/ToggleButton.types.d.ts +7 -0
  157. package/ToggleButton/index.d.ts +3 -0
  158. package/ToggleButton/index.js +7 -0
  159. package/ToggleButton/index.js.map +1 -0
  160. package/ToggleButton/package.json +1 -0
  161. package/{src/hooks/index.ts → hooks/index.d.ts} +6 -7
  162. package/hooks/index.js +7 -0
  163. package/hooks/index.js.map +1 -0
  164. package/hooks/package.json +1 -0
  165. package/hooks/useClassname.d.ts +2 -0
  166. package/hooks/useClassname.js +7 -0
  167. package/hooks/useClassname.js.map +1 -0
  168. package/hooks/useDraggable.d.ts +23 -0
  169. package/hooks/useDraggable.js +147 -0
  170. package/hooks/useDraggable.js.map +1 -0
  171. package/hooks/useKeepElementFocused.d.ts +2 -0
  172. package/hooks/useKeepElementFocused.js +37 -0
  173. package/hooks/useKeepElementFocused.js.map +1 -0
  174. package/hooks/useQueryParams.d.ts +2 -0
  175. package/hooks/useQueryParams.js +13 -0
  176. package/hooks/useQueryParams.js.map +1 -0
  177. package/hooks/useScreenSize.d.ts +5 -0
  178. package/hooks/useScreenSize.js +21 -0
  179. package/hooks/useScreenSize.js.map +1 -0
  180. package/index.d.ts +18 -0
  181. package/index.js +19 -0
  182. package/index.js.map +1 -0
  183. package/package.json +1 -79
  184. package/styles/stargazerui.css +6552 -0
  185. package/styles/stargazerui.css.map +1 -0
  186. package/{src/utils/BaseTypes.ts → utils/BaseTypes.d.ts} +25 -32
  187. package/utils/ContrastingColor.d.ts +1 -0
  188. package/utils/CreateSyntheticEvent.d.ts +2 -0
  189. package/utils/CreateSyntheticEvent.js +33 -0
  190. package/utils/CreateSyntheticEvent.js.map +1 -0
  191. package/utils/IsInputKey.d.ts +7 -0
  192. package/utils/IsInputKey.js +20 -0
  193. package/utils/IsInputKey.js.map +1 -0
  194. package/utils/MergeClassnames.d.ts +2 -0
  195. package/utils/MergeClassnames.js +7 -0
  196. package/utils/MergeClassnames.js.map +1 -0
  197. package/utils/MergeRefs.d.ts +1 -0
  198. package/utils/MergeRefs.js +16 -0
  199. package/utils/MergeRefs.js.map +1 -0
  200. package/.babelrc.json +0 -10
  201. package/.eslintrc.cjs +0 -18
  202. package/.gitattributes +0 -2
  203. package/LICENSE +0 -21
  204. package/dev/index.html +0 -12
  205. package/dev/index.jsx +0 -46
  206. package/dev/index.scss +0 -74
  207. package/dev/pages/ButtonPage.jsx +0 -44
  208. package/dev/pages/CardPage.jsx +0 -81
  209. package/dev/pages/DropdownPage.jsx +0 -32
  210. package/dev/pages/FormPage.jsx +0 -155
  211. package/dev/pages/ListPage.jsx +0 -52
  212. package/dev/pages/ModalPage.jsx +0 -38
  213. package/dev/pages/OverlayPage.jsx +0 -39
  214. package/dev/pages/components.jsx +0 -19
  215. package/dev/stargazerui.css +0 -3762
  216. package/dev/stargazerui.css.map +0 -1
  217. package/dev/test.jsx +0 -87
  218. package/rollup.config.js +0 -140
  219. package/scripts/writePackageJsons.js +0 -42
  220. package/src/Bar/Bar.tsx +0 -0
  221. package/src/Bar/Bar.type.ts +0 -9
  222. package/src/Bar/index.ts +0 -0
  223. package/src/Button/Button.tsx +0 -20
  224. package/src/Button/Button.types.ts +0 -8
  225. package/src/Button/index.ts +0 -3
  226. package/src/ButtonGroup/ButtonGroup.tsx +0 -14
  227. package/src/ButtonGroup/ButtonGroup.types.ts +0 -8
  228. package/src/ButtonGroup/index.ts +0 -3
  229. package/src/Card/Card.tsx +0 -70
  230. package/src/Card/Card.types.ts +0 -33
  231. package/src/Card/index.ts +0 -3
  232. package/src/CloseButton/CloseButton.tsx +0 -14
  233. package/src/CloseButton/CloseButton.types.ts +0 -6
  234. package/src/CloseButton/index.ts +0 -3
  235. package/src/Dropdown/Dropdown.tsx +0 -440
  236. package/src/Dropdown/Dropdown.types.ts +0 -60
  237. package/src/Dropdown/DropdownOld.tsx +0 -409
  238. package/src/Dropdown/index.ts +0 -4
  239. package/src/FileUploadButton/FileUploadButton.tsx +0 -27
  240. package/src/FileUploadButton/FileUploadButton.types.ts +0 -9
  241. package/src/FileUploadButton/index.ts +0 -3
  242. package/src/FloatingLabel/FloatingLabel.tsx +0 -22
  243. package/src/FloatingLabel/FloatingLabel.types.ts +0 -11
  244. package/src/FloatingLabel/index.ts +0 -3
  245. package/src/Form/Form.tsx +0 -398
  246. package/src/Form/Form.types.ts +0 -169
  247. package/src/Form/FormSelect.tsx +0 -527
  248. package/src/Form/index.ts +0 -4
  249. package/src/InputGroup/InputGroup.tsx +0 -46
  250. package/src/InputGroup/InputGroup.types.ts +0 -22
  251. package/src/InputGroup/index.ts +0 -4
  252. package/src/List/List.tsx +0 -112
  253. package/src/List/List.types.ts +0 -34
  254. package/src/List/index.ts +0 -4
  255. package/src/Modal/Modal.tsx +0 -229
  256. package/src/Modal/Modal.types.ts +0 -49
  257. package/src/Modal/index.ts +0 -4
  258. package/src/Nav/Nav.tsx +0 -43
  259. package/src/Nav/Nav.types.ts +0 -21
  260. package/src/Nav/index.ts +0 -4
  261. package/src/NavBar/Navbar.tsx +0 -57
  262. package/src/NavBar/Navbar.types.ts +0 -24
  263. package/src/NavBar/index.ts +0 -4
  264. package/src/NavDropdown/NavDropdown.tsx +0 -93
  265. package/src/NavDropdown/NavDropdown.types.ts +0 -6
  266. package/src/NavDropdown/index.ts +0 -3
  267. package/src/Overlay/Overlay.tsx +0 -309
  268. package/src/Overlay/Overlay.types.ts +0 -24
  269. package/src/Popout/Popout.tsx +0 -155
  270. package/src/Popout/Popout.types.ts +0 -42
  271. package/src/Popout/index.ts +0 -3
  272. package/src/Spinner/Spinner.tsx +0 -15
  273. package/src/Spinner/Spinner.types.ts +0 -7
  274. package/src/Spinner/index.ts +0 -3
  275. package/src/Table/Table.tsx +0 -16
  276. package/src/Table/Table.types.ts +0 -9
  277. package/src/Table/index.ts +0 -3
  278. package/src/Tabs/Tabs.tsx +0 -233
  279. package/src/Tabs/Tabs.types.ts +0 -52
  280. package/src/Tabs/index.ts +0 -3
  281. package/src/ToggleButton/ToggleButton.tsx +0 -21
  282. package/src/ToggleButton/ToggleButton.types.ts +0 -8
  283. package/src/ToggleButton/index.ts +0 -3
  284. package/src/assets/tooltip-pointer.svg +0 -3
  285. package/src/assets/warning.svg +0 -39
  286. package/src/hooks/useClassname.ts +0 -5
  287. package/src/hooks/useDraggable.ts +0 -186
  288. package/src/hooks/useKeepElementFocused.ts +0 -37
  289. package/src/hooks/useQueryParams.ts +0 -12
  290. package/src/hooks/useScreenSize.ts +0 -24
  291. package/src/index.ts +0 -21
  292. package/src/styles/_Card.scss +0 -166
  293. package/src/styles/_CloseButton.scss +0 -51
  294. package/src/styles/_CustomButton.scss +0 -134
  295. package/src/styles/_Dropdown.scss +0 -127
  296. package/src/styles/_FloatingLabel.scss +0 -56
  297. package/src/styles/_Forms.scss +0 -7
  298. package/src/styles/_Grid.scss +0 -178
  299. package/src/styles/_InputGroup.scss +0 -71
  300. package/src/styles/_List.scss +0 -62
  301. package/src/styles/_Modal.scss +0 -234
  302. package/src/styles/_ModalOld.scss +0 -242
  303. package/src/styles/_Nav.scss +0 -36
  304. package/src/styles/_NavBar.scss +0 -116
  305. package/src/styles/_NavDropdown.scss +0 -33
  306. package/src/styles/_OffCanvas.scss +0 -260
  307. package/src/styles/_OverLay.scss +0 -64
  308. package/src/styles/_Popout.scss +0 -75
  309. package/src/styles/_Spinner.scss +0 -19
  310. package/src/styles/_Table.scss +0 -34
  311. package/src/styles/_Tabs.scss +0 -129
  312. package/src/styles/_colors.scss +0 -510
  313. package/src/styles/_components.scss +0 -40
  314. package/src/styles/_functions.scss +0 -134
  315. package/src/styles/_mixins.scss +0 -26
  316. package/src/styles/_reset.scss +0 -237
  317. package/src/styles/_utilities.scss +0 -2480
  318. package/src/styles/_variables.scss +0 -164
  319. package/src/styles/forms/_FormCheck.scss +0 -270
  320. package/src/styles/forms/_FormControl.scss +0 -135
  321. package/src/styles/forms/_FormGroup.scss +0 -26
  322. package/src/styles/forms/_FormLabel.scss +0 -3
  323. package/src/styles/forms/_FormSelect.scss +0 -196
  324. package/src/styles/forms/_FormSlider.scss +0 -116
  325. package/src/styles/forms/_FormText.scss +0 -6
  326. package/src/utils/ContrastingColor.ts +0 -25
  327. package/src/utils/CreateSyntheticEvent.ts +0 -30
  328. package/src/utils/FileImportExport.js +0 -50
  329. package/src/utils/IsInputKey.ts +0 -18
  330. package/src/utils/MergeClassnames.ts +0 -5
  331. package/src/utils/MergeRefs.ts +0 -12
  332. package/src/vite-env.d.ts +0 -1
  333. package/tsconfig-build.json +0 -4
  334. package/tsconfig.json +0 -79
  335. package/tsconfig.node.json +0 -10
  336. package/types/BaseTypes.d.ts +0 -19
  337. package/types/components/Button/index.d.ts +0 -1
  338. package/types/components/Card/index.d.ts +0 -1
  339. package/types/components/CloseButton/index.d.ts +0 -1
  340. package/types/components/Dropdown/Dropdown.d.ts +0 -71
  341. package/types/components/Dropdown/index.d.ts +0 -1
  342. package/types/components/FloatingLabel/index.d.ts +0 -1
  343. package/types/components/Form/Form.d.ts +0 -17
  344. package/types/components/Form/Form.types.d.ts +0 -50
  345. package/types/components/Form/index.d.ts +0 -1
  346. package/types/components/InputGroup/InputGroup.d.ts +0 -6
  347. package/types/components/InputGroup/InputGroup.types.d.ts +0 -10
  348. package/types/components/InputGroup/index.d.ts +0 -1
  349. package/types/components/Modal/index.d.ts +0 -1
  350. package/types/components/Nav/index.d.ts +0 -1
  351. package/types/components/NavBar/index.d.ts +0 -1
  352. package/types/components/NavDropdown/NavDropdown.d.ts +0 -35
  353. package/types/components/NavDropdown/index.d.ts +0 -1
  354. package/types/components/Popout/index.d.ts +0 -1
  355. package/types/components/Spinner/index.d.ts +0 -1
  356. package/types/components/Table/index.d.ts +0 -1
  357. package/types/components/Tabs/index.d.ts +0 -1
  358. package/types/components/ToggleButton/ToggleButton.d.ts +0 -9
  359. package/types/components/ToggleButton/ToggleButton.types.d.ts +0 -0
  360. package/types/components/ToggleButton/index.d.ts +0 -1
  361. package/types/components/index.d.ts +0 -16
  362. package/types/index.d.ts +0 -1
  363. package/vite.config.js +0 -57
  364. package/vite.config.js.timestamp-1708777378490-e94428ceb2bf9.mjs +0 -42
  365. /package/{types/components/Button → Button}/Button.d.ts +0 -0
  366. /package/{types/components/CloseButton → CloseButton}/CloseButton.d.ts +0 -0
  367. /package/{types/components/FloatingLabel → FloatingLabel}/FloatingLabel.d.ts +0 -0
  368. /package/{types/components/NavDropdown → NavDropdown}/NavDropdown.types.d.ts +0 -0
  369. /package/{types/components/Spinner → Spinner}/Spinner.d.ts +0 -0
  370. /package/{types/components/Spinner → Spinner}/Spinner.types.d.ts +0 -0
  371. /package/{types/components/Table → Table}/Table.d.ts +0 -0
  372. /package/{types/components/Tabs → Tabs}/Tabs.d.ts +0 -0
@@ -1,527 +0,0 @@
1
- import { forwardRef, useState, useEffect, useLayoutEffect, useRef, useMemo, createContext, useContext } from "react"
2
- import { FormSelectType, FormSelectControlType, FormSelectInputType, FormSelectListType, FormSelectOptionType, SelectContextType } from "./Form.types"
3
-
4
- import Overlay from "../Overlay"
5
-
6
- import { useFormContext, useFormTagContext, ErrorMessage, HintMessage } from "./Form"
7
- import mergeRefs from "../utils/MergeRefs"
8
- import mergeClassnames from "../utils/MergeClassnames"
9
- import createSyntheticEvent from "../utils/CreateSyntheticEvent"
10
- import { InputKeyType, isValidInputKey } from "../utils/IsInputKey"
11
-
12
- export const SelectContext = createContext<SelectContextType | null>(null)
13
- export const SelectContextProvider = ({children, value} : {children: React.ReactNode, value:SelectContextType}) => {
14
- return (
15
- <SelectContext.Provider value={value}>
16
- {children}
17
- </SelectContext.Provider>
18
- )
19
- }
20
- export const useSelectContext = () => {
21
- const context = useContext(SelectContext)
22
- if(!context) {
23
- throw new Error("UseSelectContext must be used within a SelectContextProvider!")
24
- }
25
- return context
26
- }
27
-
28
- const useCustomState = (test: any, middleware?: any):([any, (callback: any, options?: any) => void]) => {
29
- const [state, setState] = useState(test)
30
- const customSetState = (callback: any, options: any = {middleware:true}) => {
31
- let newValue
32
- if( (typeof callback) === "function") {
33
- newValue = callback(state)
34
- } else {
35
- newValue = callback
36
- }
37
- if(middleware && options.middleware === true) middleware(newValue)
38
- setState(newValue)
39
- }
40
- return [state, customSetState]
41
- }
42
-
43
- const inputKeys: InputKeyType[] = [
44
- {
45
- id: "ArrowDown",
46
- alt: true
47
- },
48
- {
49
- id: "ArrowUp",
50
- alt: true
51
- },
52
- { id: "Home" }, { id: "End" }, { id: "Enter" }, { id: "Escape" },
53
- { id: "PageDown" }, { id: "PageUp" }, { id: " " }, { id: "Tab" }
54
- ]
55
-
56
-
57
- const Select = forwardRef<HTMLButtonElement, FormSelectType>( ({
58
- children, className, id, required=false, disabled=false, value, label,
59
- errorAsOverlay, error, hint, "aria-describedby":ariaDescribedby, loading=false,
60
- onClick, onBlur, onKeyUp, onKeyDown, onChange,
61
- ...restProps
62
- }, ref) => {
63
-
64
- if(Array.isArray(children)) {
65
- children = children.flat(Infinity).filter(child => child !== null && child !== undefined)
66
- } else {
67
- children = [children].filter(child => child !== null && child !== undefined)
68
- }
69
-
70
-
71
- const { noValidate } = useFormTagContext()
72
- const { controlId, isInputGroup, isFLoatingLabel } = useFormContext()
73
-
74
- const isOverlay = isInputGroup || isFLoatingLabel || errorAsOverlay
75
- const computedClassName = mergeClassnames(
76
- "sg-form-select", className, error ? "invalid":"", disabled ? "disabled":""
77
- )
78
-
79
- const elementId = controlId ?? id
80
- if(elementId === undefined) {
81
- throw new Error(
82
- "Form.Select needs to have an id, either provided directly through the 'id' property or wrapped in a Form.Group with a 'controlId' !"
83
- )
84
- }
85
-
86
- const hasValidChildren = useMemo(() => {
87
- if(!children || !Array.isArray(children)) return false
88
- if(children.length < 1) return false
89
-
90
- let isValid = true
91
- children.forEach(child => {
92
- if(child.props.value === undefined || child.props.value === null) {
93
- isValid = false
94
- }
95
- })
96
-
97
- if(children[0].props.value && children[0].props.value != "") {
98
- console.warn("It is recommended to have the first select option in a 'Form.Select' to be a placeholder like 'Select option...' with a value of an empty string")
99
- }
100
- return isValid
101
- }, [children])
102
- if(!hasValidChildren || !Array.isArray(children)) {
103
- throw new Error(
104
- "Form.Select needs to have 1 or more 'Form.Select.Option' children, each with value attributes!"
105
- )
106
- }
107
-
108
- const errorMessageId = error ? elementId+"-error-message":undefined
109
- const hintMessageId = hint ? elementId+"-hint-message":undefined
110
- const tooltipMessage = isOverlay && (error || hint) ?
111
- <div className="sg-form-control-description tooltip">
112
- {error? <ErrorMessage id={errorMessageId} message={error.message} /> : null}
113
- {hint? <HintMessage id={hintMessageId} message={hint.message} /> : null}
114
- </div> : undefined// "Testing a tooltip with a long message. This messsage is so long it hsould in theory trigger a wrap."
115
-
116
- const describedby = mergeClassnames(ariaDescribedby, errorMessageId, hintMessageId)
117
-
118
- const internalSelectControlRef = useRef<HTMLButtonElement>(null)
119
- const [ showList, setShowList ] = useState<boolean>(false)
120
-
121
- const initialValue = value ?
122
- {
123
- value: value,
124
- label: children.find(child => child.props.value === value) ? children.find(child => child.props.value === value).props.children : "no label found"
125
- }:
126
- {
127
- value: children[0].props.value ?? "",
128
- label: children[0].props.children ?? "no label found"
129
- }
130
- const handleChange = (newValue: any) => {
131
- if(!internalSelectControlRef.current) return
132
-
133
- const target = internalSelectControlRef.current
134
- target.value = newValue.value;
135
- const event = new Event('change', { bubbles: true });
136
- Object.defineProperty(event, 'target', { writable: false, value: target })
137
- const syntheticEvent = createSyntheticEvent(event) as React.ChangeEvent<typeof target>;
138
- if(onChange) onChange(syntheticEvent);
139
- }
140
- const [ activeDescendant, setActiveDescendant ] = useState<any>(initialValue.value)
141
- const [ selectedDescendant, setSelectedDescendant ] = useCustomState(initialValue, handleChange)
142
- const [ inputValue, setInputValue ] = useState<string>("")
143
-
144
- if(!loading) {
145
- const isChild = children.find(child => child.props.value === value)
146
- const isDefaultChild = children.find(child => child.props.value === "")
147
- const computedLabel = isChild ? isChild.props.children : (isDefaultChild ? isDefaultChild.props.children : "no label found")
148
- if(selectedDescendant.label != computedLabel) {
149
- setSelectedDescendant((prev: any) => ({
150
- ...prev,
151
- label: computedLabel
152
- }), {middleware: false})
153
- }
154
- }
155
-
156
- if(value != undefined && value != null && value !== selectedDescendant.value && !loading) {
157
- const isChild = children.find(child => child.props.value === value)
158
- const isDefaultChild = children.find(child => child.props.value === "")
159
- const computedLabel = isChild ? isChild.props.children : (isDefaultChild ? isDefaultChild.props.children : "no label found")
160
- const computedValue = isChild ? value : ""
161
- console.log(value, computedLabel)
162
- setSelectedDescendant({
163
- value: value,
164
- label: computedLabel
165
- }, {middleware: false})
166
- }
167
-
168
- const resetFocus = () => {
169
- setActiveDescendant(selectedDescendant.value)
170
- }
171
- const handleSetShowList = (show: boolean | ((show:boolean) => boolean)) => {
172
- if(!showList) {
173
- resetFocus()
174
- }
175
- setShowList(show)
176
- }
177
-
178
- const handleClick = (event?: React.MouseEvent<HTMLButtonElement>) => {
179
- handleSetShowList(prev => !prev)
180
- /*
181
- if(!showList) {
182
- const firstChildValue = children[0].props.value ?? ""
183
- console.log(firstChildValue)
184
- setActiveDescendant(firstChildValue)
185
- }
186
- */
187
- if(onClick && event) onClick(event)
188
- }
189
- const handleBlur = (event: React.FocusEvent<HTMLButtonElement>, hasOnBlur=true) => {
190
- handleSetShowList(false)
191
- if(onBlur && hasOnBlur) onBlur(event)
192
- }
193
- useEffect(() => {
194
- const select = internalSelectControlRef.current
195
- window.addEventListener("pointerdown", event => {
196
- if(!select?.contains(event.target as HTMLElement)) handleSetShowList(false)
197
- }, true)
198
- window.addEventListener("resize", event => handleSetShowList(false), true)
199
- return function cleanup () {
200
- window.removeEventListener("pointerdown", event => {
201
- if(select?.contains(event.target as HTMLElement)) handleSetShowList(false)
202
- }, true)
203
- window.removeEventListener("resize", event => handleSetShowList(false), true)
204
- }
205
- }, [])
206
-
207
- const changeActiveDescendant = (number: number, type: string) => {
208
- const maxIndex = (children as any).length - 1
209
- const minIndex = 0
210
- const currentIndex = (children as any).indexOf((children as any).find((child:any) => child.props.value === activeDescendant))
211
- let newIndex, temp
212
- switch (type) {
213
- case "add":
214
- temp = currentIndex + number
215
- newIndex = temp > maxIndex ? maxIndex : temp
216
- break
217
- case "sub":
218
- temp = currentIndex - number
219
- newIndex = temp < minIndex ? minIndex : temp
220
- break
221
- case "set":
222
- newIndex = number > maxIndex ? maxIndex : (number < minIndex ? 0 : number)
223
- break
224
- default:
225
- newIndex = 0
226
- break
227
- }
228
- setActiveDescendant((children as any)[newIndex].props.value)
229
- }
230
- const handleKeyDown = (event: React.KeyboardEvent<HTMLButtonElement>) => {
231
- const isInputKey = isValidInputKey(event, inputKeys)
232
- if(onKeyDown) onKeyDown(event)
233
- if(!isInputKey) return
234
-
235
- let isPreventDefault = true
236
- let isStopPropagation = true
237
-
238
- switch (event.key) {
239
- case "ArrowDown":
240
- if(showList) changeActiveDescendant(1, "add")
241
- break
242
- case "ArrowUp":
243
- if(showList) changeActiveDescendant(1, "sub")
244
- break
245
- case "Tab":
246
- if(!showList) {
247
- isPreventDefault = false
248
- isStopPropagation = false
249
- }
250
- }
251
- if(isPreventDefault) event.preventDefault()
252
- if(isStopPropagation) event.stopPropagation()
253
- }
254
- const handleKeyUp = (event: React.KeyboardEvent<HTMLButtonElement>) => {
255
- const isInputKey = isValidInputKey(event, inputKeys)
256
- if(onKeyUp) onKeyUp(event)
257
- if(!isInputKey) return
258
-
259
- let isPreventDefault = true
260
- let isStopPropagation = true
261
- switch(event.key) {
262
- case "ArrowDown":
263
- if(!showList) {
264
- handleSetShowList(true)
265
- }
266
- break
267
- case "ArrowUp":
268
- if(!showList) {
269
- handleSetShowList(true)
270
- changeActiveDescendant(0, "set")
271
- }
272
- break
273
- case "Home":
274
- if(!showList) {
275
- handleSetShowList(true)
276
- }
277
- changeActiveDescendant(0, "set")
278
- break
279
- case "End":
280
- if(!showList) {
281
- handleSetShowList(true)
282
- }
283
- changeActiveDescendant((children as any).length - 1, "set")
284
- break
285
- case "Enter":
286
- case " ":
287
- handleClick()
288
- if(showList) {
289
- const focusElement = document.getElementById(elementId+"-list-item-"+activeDescendant)
290
- focusElement?.click()
291
- }
292
- break
293
- case "Escape":
294
- if(showList) {
295
- handleSetShowList(false)
296
- }
297
- break
298
- case "PageDown":
299
- changeActiveDescendant(10, "add")
300
- break
301
- case "PageUp":
302
- changeActiveDescendant(10, "sub")
303
- break
304
- case "Tab":
305
- if(showList) {
306
- handleClick()
307
- const focusElement = document.getElementById(elementId+"-list-item-"+activeDescendant)
308
- focusElement?.click()
309
- }
310
- isPreventDefault = false
311
- isStopPropagation = false
312
- break
313
- }
314
- if(event.key === "Tab") console.log(isPreventDefault)
315
- if(isPreventDefault) event.preventDefault()
316
- if(isStopPropagation) event.stopPropagation()
317
- }
318
-
319
- const context = useMemo(() => ({
320
- internalId: elementId,
321
- showList,
322
- setShowList: handleSetShowList,
323
- activeDescendant,
324
- setActiveDescendant,
325
- inputValue,
326
- setInputValue,
327
- selectedDescendant,
328
- setSelectedDescendant,
329
- children,
330
- handleBlur
331
- }), [elementId, showList, activeDescendant, inputValue ])
332
-
333
- return (
334
- <SelectContextProvider value={context}>
335
- <Overlay trigger={"focus"} position="bottom" tooltip={tooltipMessage}>
336
- <SelectControl
337
- value={selectedDescendant.value} label={selectedDescendant.label}
338
- className={computedClassName} id={elementId} required={(required && !noValidate) ?? undefined} disabled={disabled}
339
- aria-required={required ?? undefined} aria-invalid={error ? "true":"false"} aria-describedby={describedby != "" ? describedby : undefined}
340
- onClick={handleClick} onBlur={handleBlur} onKeyDown={handleKeyDown} onKeyUp={handleKeyUp}
341
- {...restProps} ref={mergeRefs([ref, internalSelectControlRef])}
342
- >
343
- <SelectList>
344
- {!loading ?
345
- children
346
- :
347
- <SelectOption disabled={true} key="loading" value="">
348
- Loading...
349
- </SelectOption>
350
- }
351
- </SelectList>
352
- </SelectControl>
353
- </Overlay>
354
- <div className="sg-form-control-description">
355
- {error && !isOverlay ?
356
- <ErrorMessage id={elementId} message={error.message} style={error.style} className={error.className}/>
357
- : null }
358
- {hint && !isOverlay ?
359
- <HintMessage id={elementId} message={hint.message} style={hint.style} className={hint.className}/>
360
- : null }
361
- </div>
362
- </SelectContextProvider>
363
- )
364
- })
365
- Select.displayName = "FormSelect"
366
-
367
- const SelectInput = forwardRef<HTMLInputElement, FormSelectInputType>( ({className, id, value, onChange, ...restProps}, ref ) => {
368
- const { showList, setShowList, inputValue, setInputValue, internalId } = useSelectContext()
369
-
370
- const debouncedInput = (value: string) => {
371
- setTimeout(()=>{
372
- setInputValue(value)
373
- }, 300)
374
- }
375
- const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
376
- console.log(event)
377
- if(!showList) { setShowList(true) }
378
- if(onChange) { onChange(event) }
379
- //debouncedInput(event.target.value)
380
- setInputValue(event.target.value)
381
- }
382
- const handleKeyUp = (event: React.KeyboardEvent) => {
383
- const key = event.key
384
- switch(key) {
385
- case "ArrowDown":
386
- console.log("down arrow")
387
- break
388
- case "ArrowUp":
389
- console.log("up arrow")
390
- break
391
- }
392
- }
393
-
394
-
395
- return (
396
- <input value={inputValue} ref={ref}
397
- onKeyUp={handleKeyUp} onChange={handleChange}
398
- className={mergeClassnames("sg-select-input", className)}
399
- {...restProps}
400
- />
401
- )
402
- })
403
- SelectInput.displayName = "FormSelectInput"
404
-
405
- const SelectControl = forwardRef<HTMLButtonElement, FormSelectControlType>( ({children, className, value, label, searchable=false, required=false, onChange, ...restProps}, ref) => {
406
- const { activeDescendant, showList, internalId } = useSelectContext()
407
- const internalButtonRef = useRef<HTMLButtonElement>(null)
408
-
409
- const computedClassName = mergeClassnames(className, "sg-select-control")
410
-
411
- return (
412
- <button
413
- role="combobox" aria-controls={internalId+"list"} aria-expanded={showList} aria-activedescendant={activeDescendant === false ? "":internalId+"-list-item-"+activeDescendant}
414
- ref={mergeRefs([ref, internalButtonRef])} value={value} type="button"
415
- className={computedClassName} id={internalId+"-control"}
416
- {...restProps}
417
- >
418
- <span>{label}</span>
419
- {children}
420
- </button>
421
- )
422
- })
423
- SelectControl.displayName = "FormSelectControl"
424
-
425
- const listPositionSetter = (listRef: any) => {
426
- const listElement = listRef.current
427
- if(!listElement) return
428
- const parent = listElement.parentElement
429
- if(!parent) return
430
- let position: React.CSSProperties = {}
431
- const {height: listHeight } = listElement.getBoundingClientRect()
432
- const { top, bottom} = parent.getBoundingClientRect()
433
- const {innerHeight} = window
434
-
435
- const isTop = top > listHeight
436
- const isBottom = innerHeight - bottom > listHeight
437
- const coordinate = "calc(100% + 4px)"
438
- if(isBottom) {
439
- position = {top: coordinate, bottom: "unset"}
440
- } else if (isTop) {
441
- position = {bottom:coordinate, top: "unset"}
442
- } else {
443
- const height = innerHeight - bottom - 2
444
- position = {top: coordinate, maxHeight: height}
445
- }
446
- if(!listElement.children) return
447
- const listChildren = listElement.children
448
- const numberChildren = listChildren.length
449
- const numberOfRenderedChildren = numberChildren > 5 ? 5 : numberChildren
450
- let renderedListHeight = 0
451
- for (let i=0; i< numberOfRenderedChildren; i++) {
452
- renderedListHeight += listChildren[i].getBoundingClientRect().height
453
- }
454
- renderedListHeight += 4
455
- position.height = renderedListHeight ?? "auto"
456
-
457
- return position
458
- }
459
-
460
- const SelectList = forwardRef<HTMLUListElement, FormSelectListType>( ({children, className, id, ...restProps}, ref) => {
461
- const { showList, internalId } = useSelectContext()
462
-
463
- const [computedStyle, setComputedStyle] = useState<React.CSSProperties>({})
464
-
465
- const listRef = useRef<HTMLUListElement>(null)
466
- useLayoutEffect(() => {
467
- if(!showList) {
468
- return
469
- }
470
- const newPosition = listPositionSetter(listRef)
471
- setComputedStyle(newPosition!)
472
- }, [showList, listRef.current])
473
-
474
- return (
475
- <ul
476
- role="listbox" ref={mergeRefs([ref, listRef])} id={internalId+"-list"}
477
- className={mergeClassnames("sg-select-list", className)} style={showList ? {...computedStyle} : {display:"none"}}
478
- {...restProps}
479
- >
480
- {children}
481
- </ul>
482
- )
483
- })
484
- SelectList.displayName = "FormSelectList"
485
-
486
- const SelectOption = forwardRef<HTMLLIElement, FormSelectOptionType>(({
487
- children, className, id, value, disabled, label, selected,
488
- onPointerDown, onPointerOver, onClick, ...restProps
489
- }, ref) => {
490
- const { internalId, activeDescendant, setActiveDescendant, selectedDescendant, setSelectedDescendant, setShowList } = useSelectContext()
491
- const handlePointerEnter = (event: React.PointerEvent<HTMLLIElement>) => {
492
- if(!event.target) return
493
- setActiveDescendant(value)
494
- if(onPointerOver) onPointerOver(event)
495
- }
496
- const handleCLick = (event: React.MouseEvent<HTMLLIElement>) => {
497
- event.stopPropagation()
498
- if(disabled) return
499
-
500
- setSelectedDescendant( (prev:any) => ({
501
- value: value,
502
- label: children
503
- }))
504
- setShowList(false)
505
-
506
- if(onClick) onClick(event)
507
- }
508
-
509
- const computedClassName = mergeClassnames("sg-select-list-item", className, activeDescendant === value ? "focus":"")
510
- return (
511
- <li role="option" aria-selected={selectedDescendant.value === value ? true:false}
512
- ref={ref} id={internalId+"-list-item-"+value} className={computedClassName}
513
- onPointerOver={handlePointerEnter} onClick={handleCLick}
514
- {...restProps}
515
- >
516
- {children}
517
- </li>
518
- )
519
- })
520
- SelectOption.displayName = "FormSelectOption"
521
-
522
- export default Object.assign(Select, {
523
- Control: SelectControl,
524
- Input: SelectInput,
525
- Options: SelectList,
526
- Option: SelectOption
527
- })
package/src/Form/index.ts DELETED
@@ -1,4 +0,0 @@
1
- import Form from "./Form"
2
- export default Form
3
- export {FormContextProvider, useFormContext} from "./Form"
4
- export type {FormCheckType, FormContextType, FormControlType, FormGroupType, FormLabelType, FormSelectType, FormTextType, FormType} from "./Form.types"
@@ -1,46 +0,0 @@
1
- import React, { forwardRef, useMemo } from "react"
2
-
3
- import { InputGroupText, InputGroupType, InputGroupGridType } from "./InputGroup.types"
4
-
5
- import { FormContextProvider, useFormContext } from "../Form"
6
- import { useClassname } from "../hooks"
7
-
8
- const InputGroup = forwardRef<HTMLDivElement, InputGroupType>(({children, className, controlId, ...restProps}, ref) => {
9
- const context = useMemo(() => {
10
- return {controlId: controlId, isInputGroup: true}
11
- }, [controlId])
12
- return (
13
- <div ref={ref} className={useClassname("sg-input-group", className)} {...restProps}>
14
- <FormContextProvider value={context}>
15
- {children}
16
- </FormContextProvider>
17
- </div>
18
- )
19
- })
20
- InputGroup.displayName = "InputGroup"
21
-
22
- const Grid = forwardRef<HTMLDivElement, InputGroupGridType>( ({children, className, ...restProps}, ref) => {
23
- return (
24
- <div ref={ref} className={useClassname("sg-input-group-grid", className)} {...restProps}>
25
- {children}
26
- </div>
27
- )
28
- })
29
- Grid.displayName = "InputGroupGrid"
30
-
31
- const Text = forwardRef<HTMLLabelElement, InputGroupText>( ({children, className, htmlFor, ...restProps}, ref) => {
32
- const { controlId } = useFormContext()
33
-
34
- const computedHtmlFor = controlId ?? htmlFor
35
- return (
36
- <label ref={ref} htmlFor={computedHtmlFor} className={useClassname("sg-input-group-text", className)} {...restProps}>
37
- {children}
38
- </label>
39
- )
40
- })
41
- Text.displayName = "InputGroupText"
42
-
43
- export default Object.assign(InputGroup, {
44
- Text: Text,
45
- Grid: Grid
46
- })
@@ -1,22 +0,0 @@
1
- import { ReactNode } from "react";
2
-
3
- import { BaseDivType, BaseLabelType } from "../utils/BaseTypes";
4
-
5
- export type InputGroupType = {
6
- children: ReactNode,
7
- className?: string,
8
- controlId: string
9
- } & BaseDivType
10
-
11
- export type InputGroupText = {
12
- children: ReactNode,
13
- className?: string,
14
- htmlFor?: string,
15
- as?: string
16
- } & BaseLabelType
17
-
18
- export type InputGroupGridType = {
19
- children: ReactNode,
20
- className?:string,
21
-
22
- } & BaseDivType
@@ -1,4 +0,0 @@
1
- import InputGroup from "./InputGroup"
2
- export default InputGroup
3
- export * from "./InputGroup"
4
- export type { InputGroupText, InputGroupType} from "./InputGroup.types"