stargazer-ui 1.5.13 → 1.5.14

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 +377 -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,440 +0,0 @@
1
- import React, { createContext, forwardRef, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
2
- import { createPortal } from 'react-dom';
3
-
4
- import { DropdownContextType, DropdownItemType, DropdownDividerType, DropdownMenuType, DropdownToggleType, DropdownType } from "./Dropdown.types";
5
- import mergeRefs from "../utils/MergeRefs";
6
- //automatic menu placement function
7
-
8
- const getDropdownMenuPlacement = (controlId: string, drop: string="down", align: string="start") => {
9
- const dropPossible = ["down", "up", "right", "left"]
10
- const alignPossible = ["start", "end", "center"]
11
- const placement = (dropPossible.find(item => item === drop) ? drop : "down") + "-" + (alignPossible.find(item => item === align) ? align : "start")
12
- const button = document.getElementById(controlId)!
13
- const {width: buttonWidth, height: buttonHeight, x: buttonLeft, y: buttonTop } = button.getBoundingClientRect()
14
- //console.log(buttonLeft)
15
- const menu = document.getElementById(controlId+"-menu")!
16
- const {width: menuWidth, height: menuHeight} = menu.getBoundingClientRect()
17
-
18
- const navbars = Array.from(document.querySelectorAll(".sg-navbar"))
19
- if(navbars) {
20
- for (const navbar of navbars) {
21
- if(navbar.contains(button)) {
22
- menu.style.setProperty("position", "absolute")
23
- }
24
- }
25
- }
26
- const position:React.CSSProperties = {}
27
-
28
- const offset = 2//"4px"
29
- switch(drop) {
30
- case "down":
31
- //position.top = `calc(100% + ${offset})`
32
- position.top = buttonTop + buttonHeight + offset
33
- break
34
- case "up":
35
- //position.bottom = `calc(100% + ${offset})`
36
- position.top = buttonTop - menuHeight - offset
37
- break
38
- case "right":
39
- //position.left = `calc(100% + ${offset})`
40
- position.left = buttonLeft + buttonWidth + offset
41
- break
42
- case "left":
43
- //position.right = `calc(100% + ${offset})`
44
- position.left = buttonLeft - menuWidth - offset
45
- break
46
- }
47
- switch (placement) {
48
- case "down-start":
49
- case "up-start":
50
- //position.left = -2
51
- position.left = buttonLeft
52
- break
53
- case "down-center":
54
- case "up-center":
55
- position.left = buttonLeft + -1 * (menuWidth - buttonWidth)/2
56
- break
57
- case "down-end":
58
- case "up-end":
59
- position.left = buttonLeft + -1 * (menuWidth - buttonWidth)
60
- break
61
- case "right-start":
62
- case "left-start":
63
- position.top = buttonTop
64
- break
65
- case "right-center":
66
- case "left-center":
67
- position.top = buttonTop + -1 * (menuHeight - buttonHeight)/2
68
- break
69
- case "right-end":
70
- case "left-end":
71
- position.top = buttonTop + -1 * (menuHeight - buttonHeight)
72
- }
73
-
74
-
75
- return position
76
- }
77
- // is click event on the menu
78
- const isEventOnMenu = (event:MouseEvent, controlId:string = "") => {
79
- const element = event.target as HTMLElement
80
- const eventIsOnMenu = document.getElementById(controlId+"-menu")!.contains(element)
81
- return eventIsOnMenu
82
- }
83
-
84
- export const DropdownContext = createContext<DropdownContextType | null>(null)
85
- export const DropdownContextProvider = ({children, value}:{children: React.ReactNode, value:DropdownContextType}) => {
86
- return (
87
- <DropdownContext.Provider value={value}>
88
- {children}
89
- </DropdownContext.Provider>
90
- )
91
- }
92
- export const useDropdownContext = () => {
93
- const context = useContext(DropdownContext)
94
- if(!context) {
95
- throw new Error(
96
- "useDropdownContext has to be used within DropdownContextProvider!"
97
- )
98
- }
99
- return context
100
- }
101
-
102
-
103
- const Dropdown = forwardRef<HTMLAnchorElement | HTMLButtonElement, DropdownType>((
104
- {
105
- children, className, onSelect, onToggle, controlId, navDropdown=false,
106
- drop="down", align="start", autoClose=true, show="default",
107
- label, as="button", variant="primary", menuRef, menuProps,
108
- ...restProps
109
- }, ref) => {
110
-
111
- const [showInternal, setShowInternal] = useState<boolean>(show === "default" ? false : show as boolean)
112
-
113
- // this is an object like {index: string} because we need it to rerender even if the case is the same
114
- // aka we use a "next/previous" case to navigate through the dropdown menu so need to rerender consecutive "next" cases
115
- const [activeDescendant, setActiveDescendant] = useState<{case:string}>({case:""})
116
-
117
- const internalOnToggle = useCallback((event: MouseEvent) => {
118
- event.stopPropagation()
119
- //console.log("toggle")
120
- setShowInternal(prev => !prev)
121
- }, [])
122
-
123
- const contextValue = useMemo(() => ({
124
- align,
125
- drop,
126
- showInternal: show != "default" && onToggle ? show as boolean : showInternal,
127
- handleToggle: show != "default" && onToggle ? onToggle : internalOnToggle,
128
- controlId: controlId,
129
- activeDescendant,
130
- setActiveDescendant,
131
- navDropdown:navDropdown
132
- }), [align, drop, show, showInternal, onToggle, controlId, activeDescendant, setActiveDescendant, navDropdown])
133
-
134
- let computedClassName = className? className+" sg-dropdown" :"sg-dropdown"
135
- computedClassName += navDropdown ? " sg-nav-item" : ""
136
-
137
- return (
138
- <DropdownContextProvider value={contextValue}>
139
- <Toggle ref={ref} className={computedClassName} label={label} data-nav={navDropdown ? "true":null} {...restProps}>
140
- <Menu ref={menuRef} {...menuProps}>
141
- {children}
142
- </Menu>
143
- </Toggle>
144
- </DropdownContextProvider>
145
- )
146
- })
147
- Dropdown.displayName = "Dropdown"
148
-
149
-
150
- export const Toggle = forwardRef<HTMLAnchorElement | HTMLButtonElement, DropdownToggleType>( ({
151
- children, className, as="button", variant="primary", label="add label",
152
- onClick, onBlur, ...restProps}, ref
153
- ) => {
154
- const internalRef = useRef(null)
155
- const { controlId, handleToggle, setActiveDescendant, showInternal, navDropdown, drop } = useDropdownContext()
156
- const Component = as
157
- const handleKeyPress = (event: KeyboardEvent) => {
158
- let flag = false
159
- switch (event.key) {
160
- case "ArrowDown":
161
- flag = true
162
- if(showInternal) {
163
- setActiveDescendant(prev => ({...prev, case:"next"}))
164
- }
165
- else {
166
- handleToggle(event)
167
- setActiveDescendant(prev => ({...prev, case:"first"}))
168
- }
169
- break
170
- case "ArrowUp":
171
- flag = true
172
- if(showInternal) {
173
- setActiveDescendant(prev => ({...prev, case:"previous"}))
174
- } else {
175
- handleToggle(event)
176
- setActiveDescendant(prev => ({...prev, case:"last"}))
177
- }
178
- break
179
- case "Home":
180
- flag = true
181
- if(showInternal) {
182
- setActiveDescendant(prev => ({...prev, case:"first"}))
183
- }
184
- break
185
- case "End":
186
- flag = true
187
- if(showInternal) {
188
- setActiveDescendant(prev => ({...prev, case:"last"}))
189
- }
190
- break
191
- case "Tab":
192
- if(showInternal) {
193
- handleToggle(event)
194
- }
195
- break
196
- case "Escape":
197
- flag = true
198
- if(showInternal) {
199
- handleToggle(event)
200
- }
201
- break
202
- case "Enter":
203
- case " ":
204
- if(showInternal) {
205
- flag = true
206
- const activeElement = document.querySelector(".sg-dropdown-item-visual-focus") as HTMLElement
207
- activeElement.click()
208
- handleToggle(event)
209
- break
210
- }
211
- else {
212
- setActiveDescendant(prev => ({...prev, case:"first"}))
213
- break
214
- }
215
- }
216
- if(flag) {
217
- event.stopPropagation()
218
- event.preventDefault()
219
- }
220
- }
221
-
222
- const handleMouseUp = (event: MouseEvent) => {
223
- if(!showInternal) return
224
- if((event.target as HTMLElement).id === controlId) return
225
-
226
- if(!isEventOnMenu(event, controlId)) {
227
- handleToggle(event)
228
- }
229
- else if(isEventOnMenu(event, controlId)) {
230
- event.stopPropagation()
231
- handleToggle(event)
232
- const toggleElement: HTMLElement | null = document.getElementById(controlId)
233
- toggleElement?.focus()
234
- }
235
- }
236
- useEffect(() => {
237
- const toggleElement: HTMLElement = document.getElementById(controlId) as HTMLElement
238
- toggleElement.addEventListener("keydown", handleKeyPress, true)
239
- document.addEventListener("mouseup", handleMouseUp, true)
240
- return function cleanup() {
241
- toggleElement.removeEventListener("keydown", handleKeyPress, true)
242
- document.removeEventListener("mouseup", handleMouseUp, true)
243
- }
244
- }, [handleKeyPress, controlId])
245
-
246
- const toggleButtonClick = (event: keyof typeof onClick) => {
247
- handleToggle(event)
248
- if(!showInternal) {
249
- setActiveDescendant(prev => ({...prev, case:"first"}))
250
- }
251
- if(onClick) onClick(event)
252
- }
253
- const handleBlur = (event: keyof typeof onBlur) => {
254
- //handleToggle(event)
255
- if(onBlur) onBlur(event)
256
- }
257
-
258
- let classNamesComputed = `sg-button sg-button${variant ? "-"+variant:"-primary"} sg-dropdown-toggle${className ? " "+className:""}`
259
- if (Component === "a" || navDropdown) {
260
- classNamesComputed = `sg-nav-dropdown-toggle sg-dropdown-toggle${className ? " "+className:""}`
261
- }
262
- return (
263
- <Component tabIndex="0" type="button" aria-haspopup="true" aria-controls={controlId+"-menu"} aria-expanded={showInternal} id={controlId}
264
- ref={mergeRefs([ref, internalRef])} className={classNamesComputed} data-drop={drop}
265
- onClick={toggleButtonClick} onBlur={handleBlur} {...restProps}
266
- >
267
- {label}
268
- {children}
269
- </Component>
270
- )
271
- })
272
- Toggle.displayName = "DropdownToggle"
273
-
274
- const isValidListElement = (elementList: HTMLCollection, startIndex: number, direction: "forward" | "backward" ) => {
275
- let testIndex = startIndex
276
-
277
- let count = 0
278
- let stop = false
279
- while(!stop) {
280
- const test1 = elementList[testIndex].children[0] ? true : false
281
-
282
- const liItem = elementList[testIndex]
283
- const test2 = getComputedStyle(liItem).getPropertyValue("display") != "none"
284
- const test3 = test1 ? getComputedStyle(liItem.children[0]).getPropertyValue("display") != "none" : false
285
- if(test1 && test2 && test3) {
286
- stop = true
287
- break
288
- }
289
-
290
- if(direction === "forward" && testIndex === elementList.length - 1) {
291
- testIndex = 0
292
- } else if (direction === "backward" && testIndex === 0) {
293
- testIndex = elementList.length - 1
294
- } else {
295
- testIndex += direction === "forward" ? 1 : -1
296
- }
297
-
298
- count += 1
299
- if(count >= 100) {
300
- stop = true
301
- }
302
- }
303
-
304
- return testIndex
305
- }
306
-
307
- export const Menu = forwardRef<HTMLUListElement, DropdownMenuType>( ({children, className, style = {}, ...restProps}, ref) => {
308
- const { controlId, showInternal, activeDescendant, navDropdown, align, drop } = useDropdownContext()
309
- const [ computedStyle, setComputedStyle ] = useState({})
310
- useLayoutEffect(() => {
311
- if(showInternal) {
312
- const basePosition = getDropdownMenuPlacement(controlId, drop, align)
313
- setComputedStyle(basePosition)
314
- }
315
- }, [showInternal, drop, align, controlId])
316
- const handleResize = (event: UIEvent | Event) => {
317
- const basePosition = getDropdownMenuPlacement(controlId, drop, align)
318
- setComputedStyle(basePosition)
319
- }
320
- useEffect(() => {
321
- if(showInternal) {
322
- const menu = document.getElementById(controlId+"-menu") as HTMLElement
323
- const menuChildren = document.getElementById(controlId+"-menu")!.children
324
- const menuChildrenLast = menuChildren.length - 1
325
- const elementWithVisualFocus = document.querySelector(".sg-dropdown-item-visual-focus")
326
- let currentIndex = 0, currentChild = menuChildren[0].children[0]
327
- if(elementWithVisualFocus != null) {
328
- elementWithVisualFocus.classList.remove("sg-dropdown-item-visual-focus")
329
- for(let i=0; i<menuChildren.length; i++) {
330
- if(menuChildren[i] === elementWithVisualFocus.parentElement) {
331
- currentIndex = i
332
- break
333
- }
334
- }
335
- }
336
- switch (activeDescendant.case) {
337
- case "first":
338
- currentIndex = isValidListElement(menuChildren, 0, "forward")
339
- currentChild = menuChildren[currentIndex].children[0]
340
- break
341
- case "last":
342
- currentIndex = isValidListElement(menuChildren, menuChildrenLast, "backward")
343
- currentChild = menuChildren[currentIndex].children[0]
344
- break
345
- case "next":
346
- currentIndex = isValidListElement(menuChildren, currentIndex === menuChildrenLast ? 0 : currentIndex + 1, "forward")
347
- currentChild = menuChildren[currentIndex].children[0]
348
- break
349
- case "previous":
350
- currentIndex = isValidListElement(menuChildren, currentIndex === 0 ? menuChildrenLast : currentIndex - 1, "backward")
351
- currentChild = menuChildren[currentIndex].children[0]
352
- break
353
- }
354
- menu.setAttribute("aria-activedescendant", currentChild.id)
355
- menuChildren[currentIndex].children[0].classList.add("sg-dropdown-item-visual-focus")
356
-
357
- //makes it so that the menu stays with the button
358
- window.addEventListener("resize", event => handleResize(event), true)
359
- window.addEventListener("scroll", event => handleResize(event), true)
360
- } else {
361
- const menu = document.getElementById(controlId+"-menu") as HTMLElement
362
- menu.setAttribute("aria-activedescendant", "")
363
- }
364
- return function cleanup() {
365
- window.removeEventListener("resize", handleResize, true)
366
- window.removeEventListener("scroll", event => handleResize(event), true)
367
- }
368
- }, [controlId, showInternal, activeDescendant])
369
-
370
- const handleMouseOver = (event: MouseEvent) => {
371
- const target = event.target as HTMLElement
372
- const active = target.classList.contains("sg-dropdown-item-visual-focus")
373
- const menuId = controlId+"-menu"
374
- const menu = document.getElementById(menuId) as HTMLElement
375
- if(active) {
376
- return
377
- } else {
378
- document.querySelector(".sg-dropdown-item-visual-focus")?.classList.remove("sg-dropdown-item-visual-focus")
379
- menu.setAttribute("aria-activedescendant", "")
380
- target.classList.add("sg-dropdown-item-visual-focus")
381
- menu.setAttribute("aria-activedescendant", target.id)
382
- }
383
- }
384
- useEffect(() => {
385
- const menu = document.getElementById(controlId+"-menu") as HTMLElement
386
- for (let i=0; i< menu.children.length; i++) {
387
- if(menu.children[i].children[0]) { (menu.children[i] as HTMLElement).addEventListener("mouseover", handleMouseOver, true) }
388
- }
389
- return function cleanup() {
390
- for (let i=0; i< menu.children.length; i++) {
391
- if(menu.children[i].children[0]) { (menu.children[i] as HTMLElement).addEventListener("mouseover", handleMouseOver, true) }
392
- }
393
- }
394
- }, [])
395
- return (
396
- createPortal(
397
- <ul id={controlId+"-menu"} role="menu" tabIndex={-1} aria-labelledby={controlId} data-navdropdown={navDropdown ? "true":"false"}
398
- ref={ref} className={`sg-dropdown-list${className ? " "+className:""}${showInternal ? " show":""}`}
399
- style={{...computedStyle, ...style}} {...restProps}
400
- >
401
- {children}
402
- </ul>
403
- , document.body)
404
- )
405
- })
406
- Menu.displayName = "DropdownMenu"
407
-
408
-
409
- export const Item = forwardRef<HTMLAnchorElement | HTMLButtonElement, DropdownItemType>( ({children, as="button", className, liProps, onClick, ...restProps}, ref) => {
410
- const { navDropdown, activeDescendant } = useDropdownContext()
411
- const Component = navDropdown ? "a" : as
412
- const handleClick = (event: React.MouseEvent<HTMLButtonElement> & React.MouseEvent<HTMLAnchorElement>) => {
413
- event.stopPropagation()
414
- event.preventDefault()
415
- if(onClick) onClick(event)
416
- }
417
- return (
418
- <li role="none" {...liProps}>
419
- <Component ref={ref} role="menuitem" tabIndex="-1" onClick={handleClick} className={`sg-dropdown-item${className ? " "+className:""}`} {...restProps}>
420
- {children}
421
- </Component >
422
- </li>
423
- )
424
- })
425
- Item.displayName = "DropdownItem"
426
-
427
- export const Divider = forwardRef<HTMLHRElement, DropdownDividerType>( ({className="", ...restProps}, ref) => {
428
- return (
429
- <hr ref={ref} className={`.sg-dropdown-divider${className}`} {...restProps}></hr>
430
- )
431
- })
432
- Divider.displayName = "DropdownDivider"
433
-
434
- export default Object.assign(Dropdown, {
435
- Toggle: Toggle,
436
- Menu: Menu,
437
- Item: Item,
438
- //Text: Text,
439
- Divider: Divider
440
- })
@@ -1,60 +0,0 @@
1
- import { ReactNode } from "react";
2
-
3
- import { BaseDivType, BaseAnchorType, BaseButtonType, BaseUListType, BaseHrType, BaseElementType, BaseLItemType } from "../utils/BaseTypes";
4
-
5
- export type DropdownContextType = {
6
- align: string,
7
- drop: string,
8
- showInternal: boolean,
9
- handleToggle: Function,
10
- controlId: string,
11
- activeDescendant: {
12
- case:string
13
- },
14
- setActiveDescendant: React.Dispatch<React.SetStateAction<{case:string}>>,
15
- navDropdown: boolean
16
- }
17
- export type DropdownType = {
18
- children: ReactNode,
19
- className?: string,
20
- navDropdown?: boolean,
21
- onSelect?: Function,
22
- onToggle?: Function,
23
- controlId: string,
24
- drop?: string,
25
- align?: string,
26
- autoClose?: boolean,
27
- show?:boolean,
28
- label: string,
29
- as?: React.ElementType,
30
- variant?: string,
31
- menuRef?: any,
32
- menuProps: DropdownMenuType
33
- } & (BaseAnchorType | BaseButtonType | BaseElementType)
34
-
35
- export type DropdownToggleType = {
36
- children: ReactNode,
37
- className?: string,
38
- onClick?: (event: React.MouseEvent) => void,
39
- navDropdown?: boolean,
40
- as?: React.ElementType,
41
- variant?: string,
42
- label: string
43
- } & (BaseAnchorType | BaseButtonType | BaseElementType)
44
-
45
- export type DropdownMenuType = {
46
- children: ReactNode,
47
- className?: string,
48
- style?: React.CSSProperties | undefined
49
- } & BaseUListType
50
-
51
- export type DropdownItemType = {
52
- children: ReactNode,
53
- as?: React.ElementType,
54
- className?: string,
55
- liProps: BaseLItemType
56
- } & (BaseAnchorType | BaseButtonType)
57
-
58
- export type DropdownDividerType = {
59
- className?: string,
60
- } & BaseHrType