stargazer-ui 1.2.1 → 1.2.2

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 (349) 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 +12 -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 +10 -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/Card/Card.js +41 -0
  21. package/Card/Card.js.map +1 -0
  22. package/{types/components/Card → Card}/Card.types.d.ts +3 -1
  23. package/Card/index.d.ts +3 -0
  24. package/Card/index.js +7 -0
  25. package/Card/index.js.map +1 -0
  26. package/Card/package.json +1 -0
  27. package/CloseButton/CloseButton.js +11 -0
  28. package/CloseButton/CloseButton.js.map +1 -0
  29. package/{types/components/CloseButton → CloseButton}/CloseButton.types.d.ts +1 -1
  30. package/CloseButton/index.d.ts +3 -0
  31. package/CloseButton/index.js +7 -0
  32. package/CloseButton/index.js.map +1 -0
  33. package/CloseButton/package.json +1 -0
  34. package/Dropdown/Dropdown.js +301 -0
  35. package/Dropdown/Dropdown.js.map +1 -0
  36. package/{types/components/Dropdown → Dropdown}/Dropdown.types.d.ts +3 -10
  37. package/Dropdown/index.d.ts +4 -0
  38. package/Dropdown/index.js +8 -0
  39. package/Dropdown/index.js.map +1 -0
  40. package/Dropdown/package.json +1 -0
  41. package/FileUploadButton/FileUploadButton.d.ts +4 -0
  42. package/FileUploadButton/FileUploadButton.js +21 -0
  43. package/FileUploadButton/FileUploadButton.js.map +1 -0
  44. package/FileUploadButton/FileUploadButton.types.d.ts +7 -0
  45. package/FileUploadButton/index.d.ts +3 -0
  46. package/FileUploadButton/index.js +7 -0
  47. package/FileUploadButton/index.js.map +1 -0
  48. package/FileUploadButton/package.json +1 -0
  49. package/FloatingLabel/FloatingLabel.js +17 -0
  50. package/FloatingLabel/FloatingLabel.js.map +1 -0
  51. package/{types/components/FloatingLabel → FloatingLabel}/FloatingLabel.types.d.ts +1 -1
  52. package/FloatingLabel/index.d.ts +3 -0
  53. package/FloatingLabel/index.js +7 -0
  54. package/FloatingLabel/index.js.map +1 -0
  55. package/FloatingLabel/package.json +1 -0
  56. package/Form/Form.d.ts +38 -0
  57. package/Form/Form.js +308 -0
  58. package/Form/Form.js.map +1 -0
  59. package/Form/Form.types.d.ts +105 -0
  60. package/Form/index.d.ts +4 -0
  61. package/Form/index.js +8 -0
  62. package/Form/index.js.map +1 -0
  63. package/Form/package.json +1 -0
  64. package/InputGroup/InputGroup.d.ts +7 -0
  65. package/InputGroup/InputGroup.js +31 -0
  66. package/InputGroup/InputGroup.js.map +1 -0
  67. package/InputGroup/InputGroup.types.d.ts +16 -0
  68. package/InputGroup/index.d.ts +4 -0
  69. package/InputGroup/index.js +7 -0
  70. package/InputGroup/index.js.map +1 -0
  71. package/InputGroup/package.json +1 -0
  72. package/List/List.d.ts +14 -0
  73. package/List/List.js +76 -0
  74. package/List/List.js.map +1 -0
  75. package/List/List.types.d.ts +28 -0
  76. package/List/index.d.ts +3 -0
  77. package/List/index.js +7 -0
  78. package/List/index.js.map +1 -0
  79. package/List/package.json +1 -0
  80. package/{types/components/Modal → Modal}/Modal.d.ts +1 -1
  81. package/Modal/Modal.js +160 -0
  82. package/Modal/Modal.js.map +1 -0
  83. package/{types/components/Modal → Modal}/Modal.types.d.ts +3 -2
  84. package/Modal/index.d.ts +3 -0
  85. package/Modal/index.js +7 -0
  86. package/Modal/index.js.map +1 -0
  87. package/Modal/package.json +1 -0
  88. package/Nav/Nav.js +28 -0
  89. package/Nav/Nav.js.map +1 -0
  90. package/{types/components/Nav → Nav}/Nav.types.d.ts +1 -1
  91. package/Nav/index.d.ts +4 -0
  92. package/Nav/index.js +7 -0
  93. package/Nav/index.js.map +1 -0
  94. package/Nav/package.json +1 -0
  95. package/{types/components/NavBar → NavBar}/Navbar.d.ts +1 -2
  96. package/NavBar/Navbar.js +36 -0
  97. package/NavBar/Navbar.js.map +1 -0
  98. package/{types/components/NavBar → NavBar}/Navbar.types.d.ts +2 -1
  99. package/NavBar/index.d.ts +4 -0
  100. package/NavBar/index.js +8 -0
  101. package/NavBar/index.js.map +1 -0
  102. package/NavBar/package.json +1 -0
  103. package/{types/components/NavDropdown → NavDropdown}/NavDropdown.d.ts +2 -2
  104. package/NavDropdown/NavDropdown.js +77 -0
  105. package/NavDropdown/NavDropdown.js.map +1 -0
  106. package/NavDropdown/index.d.ts +3 -0
  107. package/NavDropdown/index.js +7 -0
  108. package/NavDropdown/index.js.map +1 -0
  109. package/NavDropdown/package.json +1 -0
  110. package/Overlay/Overlay.d.ts +4 -0
  111. package/Overlay/Overlay.js +228 -0
  112. package/Overlay/Overlay.js.map +1 -0
  113. package/Overlay/Overlay.types.d.ts +18 -0
  114. package/{src/Overlay/index.ts → Overlay/index.d.ts} +3 -3
  115. package/Overlay/index.js +7 -0
  116. package/Overlay/index.js.map +1 -0
  117. package/Overlay/package.json +1 -0
  118. package/Popout/Popout.js +110 -0
  119. package/Popout/Popout.js.map +1 -0
  120. package/{types/components/Popout → Popout}/Popout.types.d.ts +1 -1
  121. package/Popout/index.d.ts +3 -0
  122. package/Popout/index.js +7 -0
  123. package/Popout/index.js.map +1 -0
  124. package/Popout/package.json +1 -0
  125. package/Spinner/Spinner.js +12 -0
  126. package/Spinner/Spinner.js.map +1 -0
  127. package/Spinner/index.d.ts +3 -0
  128. package/Spinner/index.js +7 -0
  129. package/Spinner/index.js.map +1 -0
  130. package/Spinner/package.json +1 -0
  131. package/Table/Table.js +11 -0
  132. package/Table/Table.js.map +1 -0
  133. package/{types/components/Table → Table}/Table.types.d.ts +1 -1
  134. package/Table/index.d.ts +3 -0
  135. package/Table/index.js +7 -0
  136. package/Table/index.js.map +1 -0
  137. package/Table/package.json +1 -0
  138. package/Tabs/Tabs.js +158 -0
  139. package/Tabs/Tabs.js.map +1 -0
  140. package/{types/components/Tabs → Tabs}/Tabs.types.d.ts +9 -1
  141. package/Tabs/index.d.ts +3 -0
  142. package/Tabs/index.js +7 -0
  143. package/Tabs/index.js.map +1 -0
  144. package/Tabs/package.json +1 -0
  145. package/ToggleButton/ToggleButton.d.ts +4 -0
  146. package/ToggleButton/ToggleButton.js +17 -0
  147. package/ToggleButton/ToggleButton.js.map +1 -0
  148. package/ToggleButton/ToggleButton.types.d.ts +7 -0
  149. package/ToggleButton/index.d.ts +3 -0
  150. package/ToggleButton/index.js +7 -0
  151. package/ToggleButton/index.js.map +1 -0
  152. package/ToggleButton/package.json +1 -0
  153. package/{src/hooks/index.ts → hooks/index.d.ts} +5 -6
  154. package/hooks/index.js +6 -0
  155. package/hooks/index.js.map +1 -0
  156. package/hooks/package.json +1 -0
  157. package/hooks/useClassname.d.ts +2 -0
  158. package/hooks/useClassname.js +7 -0
  159. package/hooks/useClassname.js.map +1 -0
  160. package/hooks/useDraggable.d.ts +23 -0
  161. package/hooks/useDraggable.js +147 -0
  162. package/hooks/useDraggable.js.map +1 -0
  163. package/hooks/useKeepElementFocused.d.ts +2 -0
  164. package/hooks/useKeepElementFocused.js +37 -0
  165. package/hooks/useKeepElementFocused.js.map +1 -0
  166. package/hooks/useScreenSize.d.ts +5 -0
  167. package/hooks/useScreenSize.js +21 -0
  168. package/hooks/useScreenSize.js.map +1 -0
  169. package/index.d.ts +18 -0
  170. package/index.js +19 -0
  171. package/index.js.map +1 -0
  172. package/package.json +1 -79
  173. package/{dev → styles}/stargazerui.css +3099 -395
  174. package/styles/stargazerui.css.map +1 -0
  175. package/{src/utils/BaseTypes.ts → utils/BaseTypes.d.ts} +23 -30
  176. package/utils/ContrastingColor.d.ts +1 -0
  177. package/utils/MergeClassnames.d.ts +2 -0
  178. package/utils/MergeClassnames.js +7 -0
  179. package/utils/MergeClassnames.js.map +1 -0
  180. package/utils/MergeRefs.d.ts +2 -0
  181. package/utils/MergeRefs.js +16 -0
  182. package/utils/MergeRefs.js.map +1 -0
  183. package/.babelrc.json +0 -10
  184. package/.eslintrc.cjs +0 -18
  185. package/.gitattributes +0 -2
  186. package/LICENSE +0 -21
  187. package/dev/index.html +0 -12
  188. package/dev/index.jsx +0 -49
  189. package/dev/index.scss +0 -59
  190. package/dev/pages/ButtonPage.jsx +0 -44
  191. package/dev/pages/CardPage.jsx +0 -81
  192. package/dev/pages/DropdownPage.jsx +0 -31
  193. package/dev/pages/FormPage.jsx +0 -130
  194. package/dev/pages/ListPage.jsx +0 -52
  195. package/dev/pages/ModalPage.jsx +0 -37
  196. package/dev/pages/OverlayPage.jsx +0 -35
  197. package/dev/pages/components.jsx +0 -19
  198. package/dev/stargazerui.css.map +0 -1
  199. package/dev/test.jsx +0 -88
  200. package/rollup.config.js +0 -140
  201. package/scripts/writePackageJsons.js +0 -42
  202. package/src/Bar/Bar.tsx +0 -0
  203. package/src/Bar/Bar.type.ts +0 -9
  204. package/src/Bar/index.ts +0 -0
  205. package/src/Button/Button.tsx +0 -17
  206. package/src/Button/Button.types.ts +0 -8
  207. package/src/Button/index.ts +0 -3
  208. package/src/ButtonGroup/ButtonGroup.tsx +0 -14
  209. package/src/ButtonGroup/ButtonGroup.types.ts +0 -8
  210. package/src/ButtonGroup/index.ts +0 -3
  211. package/src/Card/Card.tsx +0 -70
  212. package/src/Card/Card.types.ts +0 -33
  213. package/src/Card/index.ts +0 -3
  214. package/src/CloseButton/CloseButton.tsx +0 -14
  215. package/src/CloseButton/CloseButton.types.ts +0 -6
  216. package/src/CloseButton/index.ts +0 -3
  217. package/src/Dropdown/Dropdown.tsx +0 -358
  218. package/src/Dropdown/Dropdown.types.ts +0 -52
  219. package/src/Dropdown/index.ts +0 -4
  220. package/src/FileUploadButton/FileUploadButton.tsx +0 -27
  221. package/src/FileUploadButton/FileUploadButton.types.ts +0 -9
  222. package/src/FileUploadButton/index.ts +0 -3
  223. package/src/FloatingLabel/FloatingLabel.tsx +0 -22
  224. package/src/FloatingLabel/FloatingLabel.types.ts +0 -11
  225. package/src/FloatingLabel/index.ts +0 -3
  226. package/src/Form/Form.tsx +0 -445
  227. package/src/Form/Form.types.ts +0 -117
  228. package/src/Form/index.ts +0 -4
  229. package/src/InputGroup/InputGroup.tsx +0 -46
  230. package/src/InputGroup/InputGroup.types.ts +0 -21
  231. package/src/InputGroup/index.ts +0 -4
  232. package/src/List/List.tsx +0 -112
  233. package/src/List/List.types.ts +0 -34
  234. package/src/List/index.ts +0 -4
  235. package/src/Modal/Modal.tsx +0 -220
  236. package/src/Modal/Modal.types.ts +0 -49
  237. package/src/Modal/index.ts +0 -4
  238. package/src/Nav/Nav.tsx +0 -43
  239. package/src/Nav/Nav.types.ts +0 -21
  240. package/src/Nav/index.ts +0 -4
  241. package/src/NavBar/Navbar.tsx +0 -57
  242. package/src/NavBar/Navbar.types.ts +0 -24
  243. package/src/NavBar/index.ts +0 -4
  244. package/src/NavDropdown/NavDropdown.tsx +0 -93
  245. package/src/NavDropdown/NavDropdown.types.ts +0 -6
  246. package/src/NavDropdown/index.ts +0 -3
  247. package/src/Overlay/Overlay.tsx +0 -277
  248. package/src/Overlay/Overlay.types.ts +0 -20
  249. package/src/Popout/Popout.tsx +0 -155
  250. package/src/Popout/Popout.types.ts +0 -42
  251. package/src/Popout/index.ts +0 -3
  252. package/src/Spinner/Spinner.tsx +0 -15
  253. package/src/Spinner/Spinner.types.ts +0 -7
  254. package/src/Spinner/index.ts +0 -3
  255. package/src/Table/Table.tsx +0 -16
  256. package/src/Table/Table.types.ts +0 -9
  257. package/src/Table/index.ts +0 -3
  258. package/src/Tabs/Tabs.tsx +0 -215
  259. package/src/Tabs/Tabs.types.ts +0 -49
  260. package/src/Tabs/index.ts +0 -3
  261. package/src/ToggleButton/ToggleButton.tsx +0 -21
  262. package/src/ToggleButton/ToggleButton.types.ts +0 -8
  263. package/src/ToggleButton/index.ts +0 -3
  264. package/src/hooks/useClassname.ts +0 -5
  265. package/src/hooks/useDraggable.ts +0 -186
  266. package/src/hooks/useKeepElementFocused.ts +0 -37
  267. package/src/hooks/useScreenSize.ts +0 -24
  268. package/src/index.ts +0 -21
  269. package/src/styles/_Card.scss +0 -166
  270. package/src/styles/_CloseButton.scss +0 -51
  271. package/src/styles/_CustomButton.scss +0 -132
  272. package/src/styles/_Dropdown.scss +0 -120
  273. package/src/styles/_FloatingLabel.scss +0 -56
  274. package/src/styles/_Forms.scss +0 -7
  275. package/src/styles/_Grid.scss +0 -178
  276. package/src/styles/_InputGroup.scss +0 -71
  277. package/src/styles/_List.scss +0 -62
  278. package/src/styles/_Modal.scss +0 -234
  279. package/src/styles/_ModalOld.scss +0 -242
  280. package/src/styles/_Nav.scss +0 -36
  281. package/src/styles/_NavBar.scss +0 -116
  282. package/src/styles/_NavDropdown.scss +0 -34
  283. package/src/styles/_OffCanvas.scss +0 -260
  284. package/src/styles/_OverLay.scss +0 -56
  285. package/src/styles/_Popout.scss +0 -75
  286. package/src/styles/_Spinner.scss +0 -19
  287. package/src/styles/_Table.scss +0 -34
  288. package/src/styles/_Tabs.scss +0 -129
  289. package/src/styles/_colors.scss +0 -510
  290. package/src/styles/_components.scss +0 -40
  291. package/src/styles/_functions.scss +0 -134
  292. package/src/styles/_mixins.scss +0 -26
  293. package/src/styles/_reset.scss +0 -231
  294. package/src/styles/_utilities.scss +0 -2480
  295. package/src/styles/_variables.scss +0 -146
  296. package/src/styles/forms/_FormCheck.scss +0 -269
  297. package/src/styles/forms/_FormControl.scss +0 -102
  298. package/src/styles/forms/_FormGroup.scss +0 -21
  299. package/src/styles/forms/_FormLabel.scss +0 -3
  300. package/src/styles/forms/_FormSelect.scss +0 -164
  301. package/src/styles/forms/_FormSlider.scss +0 -116
  302. package/src/styles/forms/_FormText.scss +0 -6
  303. package/src/utils/ContrastingColor.ts +0 -25
  304. package/src/utils/FileImportExport.js +0 -50
  305. package/src/utils/MergeClassnames.ts +0 -5
  306. package/src/utils/MergeRefs.ts +0 -12
  307. package/src/vite-env.d.ts +0 -1
  308. package/tsconfig-build.json +0 -4
  309. package/tsconfig.json +0 -79
  310. package/tsconfig.node.json +0 -10
  311. package/types/BaseTypes.d.ts +0 -19
  312. package/types/components/Button/index.d.ts +0 -1
  313. package/types/components/Card/index.d.ts +0 -1
  314. package/types/components/CloseButton/index.d.ts +0 -1
  315. package/types/components/Dropdown/index.d.ts +0 -1
  316. package/types/components/FloatingLabel/index.d.ts +0 -1
  317. package/types/components/Form/Form.d.ts +0 -17
  318. package/types/components/Form/Form.types.d.ts +0 -50
  319. package/types/components/Form/index.d.ts +0 -1
  320. package/types/components/InputGroup/InputGroup.d.ts +0 -6
  321. package/types/components/InputGroup/InputGroup.types.d.ts +0 -10
  322. package/types/components/InputGroup/index.d.ts +0 -1
  323. package/types/components/Modal/index.d.ts +0 -1
  324. package/types/components/Nav/index.d.ts +0 -1
  325. package/types/components/NavBar/index.d.ts +0 -1
  326. package/types/components/NavDropdown/index.d.ts +0 -1
  327. package/types/components/Popout/index.d.ts +0 -1
  328. package/types/components/Spinner/index.d.ts +0 -1
  329. package/types/components/Table/index.d.ts +0 -1
  330. package/types/components/Tabs/index.d.ts +0 -1
  331. package/types/components/ToggleButton/ToggleButton.d.ts +0 -9
  332. package/types/components/ToggleButton/ToggleButton.types.d.ts +0 -0
  333. package/types/components/ToggleButton/index.d.ts +0 -1
  334. package/types/components/index.d.ts +0 -16
  335. package/types/index.d.ts +0 -1
  336. package/vite.config.js +0 -57
  337. package/vite.config.js.timestamp-1708777378490-e94428ceb2bf9.mjs +0 -42
  338. /package/{types/components/Button → Button}/Button.d.ts +0 -0
  339. /package/{types/components/Card → Card}/Card.d.ts +0 -0
  340. /package/{types/components/CloseButton → CloseButton}/CloseButton.d.ts +0 -0
  341. /package/{types/components/Dropdown → Dropdown}/Dropdown.d.ts +0 -0
  342. /package/{types/components/FloatingLabel → FloatingLabel}/FloatingLabel.d.ts +0 -0
  343. /package/{types/components/Nav → Nav}/Nav.d.ts +0 -0
  344. /package/{types/components/NavDropdown → NavDropdown}/NavDropdown.types.d.ts +0 -0
  345. /package/{types/components/Popout → Popout}/Popout.d.ts +0 -0
  346. /package/{types/components/Spinner → Spinner}/Spinner.d.ts +0 -0
  347. /package/{types/components/Spinner → Spinner}/Spinner.types.d.ts +0 -0
  348. /package/{types/components/Table → Table}/Table.d.ts +0 -0
  349. /package/{types/components/Tabs → Tabs}/Tabs.d.ts +0 -0
@@ -1,3 +0,0 @@
1
- import CloseButton from "./CloseButton"
2
- export default CloseButton
3
- export type { CloseButtonType } from "./CloseButton.types"
@@ -1,358 +0,0 @@
1
- import React, { createContext, forwardRef, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useState } from "react";
2
-
3
- import { DropdownContextType, DropdownItemType, DropdownDividerType, DropdownMenuType, DropdownToggleType, DropdownType } from "./Dropdown.types";
4
- //automatic menu placement function
5
- const getDropdownMenuPlacement = (controlId: string, drop: string="down", align: string="start") => {
6
- const dropPossible = ["down", "up", "right", "left"]
7
- const alignPossible = ["start", "end", "center"]
8
- let placement = (dropPossible.find(item => item === drop) ? drop : "down") + "-" + (alignPossible.find(item => item === align) ? align : "start")
9
- const topOffset = drop === "down" || drop === "up" ? 5 : 0
10
- const leftOffset = drop === "right" || drop === "left" ? 5 : 0
11
-
12
- const button = document.getElementById(controlId)!
13
- const buttonLeftBase = button.getBoundingClientRect().left
14
- const buttonTopBase = button.getBoundingClientRect().top + button.clientHeight
15
-
16
- const menu = document.getElementById(controlId+"-menu")!
17
- let position = {
18
- top: drop === "up" ? buttonTopBase - (menu.clientHeight + button.clientHeight + topOffset) : buttonTopBase + topOffset,
19
- left: drop === "right" ? buttonLeftBase + button.clientWidth + leftOffset: (drop === "left" ? buttonLeftBase - menu.clientWidth - leftOffset : buttonLeftBase)
20
- }
21
-
22
- switch (placement) {
23
- case "down-start":
24
- case "up-start":
25
- break
26
- case "down-center":
27
- case "up-center":
28
- position.left += -1 * (menu.clientWidth - button.clientWidth)/2
29
- break
30
- case "down-end":
31
- case "up-end":
32
- position.left += -1 * (menu.clientWidth - button.clientWidth)
33
- break
34
-
35
- case "right-start":
36
- case "left-start":
37
- position.top += -1 * button.clientHeight
38
- break
39
- case "right-center":
40
- case "left-center":
41
- position.top += -1 * button.clientHeight/2 - menu.clientHeight/2
42
- break
43
- case "right-end":
44
- case "left-end":
45
- position.top += -1 * menu.clientHeight
46
-
47
- }
48
- return position
49
- }
50
- // is click event on the menu
51
- const isEventOnMenu = (event:MouseEvent, controlId:string = "") => {
52
- const element = event.target as HTMLElement
53
- const eventIsOnMenu = document.getElementById(controlId+"-menu")!.contains(element)
54
- return eventIsOnMenu
55
- }
56
-
57
- export const DropdownContext = createContext<DropdownContextType | null>(null)
58
- export const DropdownContextProvider = ({children, value}:{children: React.ReactNode, value:DropdownContextType}) => {
59
- return (
60
- <DropdownContext.Provider value={value}>
61
- {children}
62
- </DropdownContext.Provider>
63
- )
64
- }
65
- export const useDropdownContext = () => {
66
- const context = useContext(DropdownContext)
67
- if(!context) {
68
- throw new Error(
69
- "useDropdownContext has to be used within DropdownContextProvider!"
70
- )
71
- }
72
- return context
73
- }
74
-
75
-
76
- const Dropdown = forwardRef<HTMLDivElement, DropdownType>((
77
- {
78
- children, className, onSelect, onToggle, controlId, navDropdown=false,
79
- drop="down", align="start", autoClose=true, show="default", ...restProps
80
- }, ref) => {
81
-
82
- const [showInternal, setShowInternal] = useState<boolean>(show === "default" ? false : show as boolean)
83
-
84
- // this is an object like {index: string} because we need it to rerender even if the case is the same
85
- // aka we use a "next/previous" case to navigate through the dropdown menu so need to rerender consecutive "next" cases
86
- const [activeDescendant, setActiveDescendant] = useState<{case:string}>({case:""})
87
-
88
- const internalOnToggle = useCallback((event: MouseEvent) => {
89
- event.stopPropagation()
90
- setShowInternal(prev => !prev)
91
- }, [])
92
-
93
- const contextValue = useMemo(() => ({
94
- align,
95
- drop,
96
- showInternal: show != "default" && onToggle ? show as boolean : showInternal,
97
- handleToggle: show != "default" && onToggle ? onToggle : internalOnToggle,
98
- controlId: controlId,
99
- activeDescendant,
100
- setActiveDescendant,
101
- navDropdown:navDropdown
102
- }), [align, drop, show, showInternal, onToggle, controlId, activeDescendant, setActiveDescendant, navDropdown])
103
-
104
- let computedClassName = `sg-dropdown${className? " "+className:""}`
105
- computedClassName += navDropdown ? " sg-nav-item" : ""
106
-
107
- return (
108
- <div id={controlId+"-wrapper"} ref={ref} className={computedClassName} data-nav={navDropdown ? "true":null} {...restProps} >
109
- <DropdownContextProvider value={contextValue}>
110
- {children}
111
- </DropdownContextProvider>
112
- </div>
113
- )
114
- })
115
- Dropdown.displayName = "Dropdown"
116
-
117
-
118
- export const Toggle = forwardRef<HTMLAnchorElement | HTMLButtonElement, DropdownToggleType>( ({children, className, as="button", variant="primary", ...restProps}, ref) => {
119
- const { controlId, handleToggle, setActiveDescendant, showInternal, navDropdown, drop } = useDropdownContext()
120
- const Component = as
121
- const handleKeyPress = (event: KeyboardEvent) => {
122
- let flag = false
123
- console.log(event.key)
124
- switch (event.key) {
125
- case "ArrowDown":
126
- flag = true
127
- if(showInternal) {
128
- setActiveDescendant(prev => ({...prev, case:"next"}))
129
- }
130
- else {
131
- handleToggle(event)
132
- setActiveDescendant(prev => ({...prev, case:"first"}))
133
- }
134
- break
135
- case "ArrowUp":
136
- flag = true
137
- if(showInternal) {
138
- setActiveDescendant(prev => ({...prev, case:"previous"}))
139
- } else {
140
- handleToggle(event)
141
- setActiveDescendant(prev => ({...prev, case:"last"}))
142
- }
143
- break
144
- case "Home":
145
- flag = true
146
- if(showInternal) {
147
- setActiveDescendant(prev => ({...prev, case:"first"}))
148
- }
149
- break
150
- case "End":
151
- flag = true
152
- if(showInternal) {
153
- setActiveDescendant(prev => ({...prev, case:"last"}))
154
- }
155
- break
156
- case "Tab":
157
- if(showInternal) {
158
- handleToggle(event)
159
- }
160
- break
161
- case "Escape":
162
- flag = true
163
- if(showInternal) {
164
- handleToggle(event)
165
- }
166
- break
167
- case "Enter":
168
- case " ":
169
- if(showInternal) {
170
- flag = true
171
- const activeElement = document.querySelector(".sg-dropdown-item-visual-focus") as HTMLElement
172
- activeElement.click()
173
- handleToggle(event)
174
- break
175
- }
176
- else {
177
- setActiveDescendant(prev => ({...prev, case:"first"}))
178
- break
179
- }
180
- }
181
- if(flag) {
182
- event.stopPropagation()
183
- event.preventDefault()
184
- }
185
- }
186
- const handleClick = (event: MouseEvent) => {
187
- if(!showInternal) return
188
- if((event.target as HTMLElement).id === controlId) return
189
-
190
- if(!isEventOnMenu(event, controlId)) {
191
- handleToggle(event)
192
- }
193
- else if(isEventOnMenu(event, controlId)) {
194
- handleToggle(event)
195
- const toggleElement: HTMLElement | null = document.getElementById(controlId)
196
- toggleElement?.focus()
197
- }
198
- }
199
- useEffect(() => {
200
- const toggleElement: HTMLElement = document.getElementById(controlId) as HTMLElement
201
- toggleElement.addEventListener("keydown", handleKeyPress, true)
202
- document.addEventListener("mouseup", handleClick, true)
203
- return function cleanup() {
204
- toggleElement.removeEventListener("keydown", handleKeyPress, true)
205
- document.removeEventListener("mouseup", handleClick, true)
206
- }
207
- }, [handleKeyPress, controlId])
208
-
209
- const toggleButtonClick = (event: MouseEvent) => {
210
- handleToggle(event)
211
- if(!showInternal) {
212
- setActiveDescendant(prev => ({...prev, case:"first"}))
213
- }
214
- }
215
-
216
- let classNamesComputed = `sg-button sg-button${variant ? "-"+variant:"-primary"} sg-dropdown-toggle${className ? " "+className:""}`
217
- if (Component === "a" || navDropdown) {
218
- classNamesComputed = `sg-nav-dropdown-toggle sg-dropdown-toggle${className ? " "+className:""}`
219
- }
220
- return (
221
- <Component tabIndex="0" type="button" aria-haspopup="true" aria-controls={controlId+"-menu"} aria-expanded={showInternal} id={controlId}
222
- ref={ref} className={classNamesComputed} data-drop={drop}
223
- onClick={(event: MouseEvent) => toggleButtonClick(event)} {...restProps}
224
- >
225
- {children}
226
- </Component>
227
- )
228
- })
229
- Toggle.displayName = "DropdownToggle"
230
-
231
-
232
- export const Menu = forwardRef<HTMLUListElement, DropdownMenuType>( ({children, className, style = {}, ...restProps}, ref) => {
233
- const { controlId, showInternal, activeDescendant, navDropdown, align, drop } = useDropdownContext()
234
- const [ computedStyle, setComputedStyle ] = useState({})
235
- useLayoutEffect(() => {
236
- if(showInternal) {
237
- const basePosition = getDropdownMenuPlacement(controlId, drop, align)
238
- const menu = document.getElementById(controlId+"-menu") as HTMLElement
239
-
240
- setComputedStyle(basePosition)
241
- }
242
- }, [showInternal])
243
-
244
- useEffect(() => {
245
- const handleResize = (event: UIEvent) => {
246
- const basePosition = getDropdownMenuPlacement(controlId, drop, align)
247
- setComputedStyle(basePosition)
248
- }
249
- if(showInternal) {
250
- const menu = document.getElementById(controlId+"-menu") as HTMLElement
251
- const menuChildren = document.getElementById(controlId+"-menu")!.children
252
- const menuChildrenLast = menuChildren.length - 1
253
- const elementWithVisualFocus = document.querySelector(".sg-dropdown-item-visual-focus")
254
- let currentIndex = 0, currentChild = menuChildren[0].children[0]
255
- if(elementWithVisualFocus != null) {
256
- elementWithVisualFocus.classList.remove("sg-dropdown-item-visual-focus")
257
- for(let i=0; i<menuChildren.length; i++) {
258
- if(menuChildren[i] === elementWithVisualFocus.parentElement) {
259
- currentIndex = i
260
- break
261
- }
262
- }
263
- }
264
- switch (activeDescendant.case) {
265
- case "first":
266
- currentChild = menuChildren[0].children[0]
267
- currentIndex = 0
268
- break
269
- case "last":
270
- currentChild = menuChildren[menuChildrenLast].children[0]
271
- currentIndex = menuChildrenLast
272
- break
273
- case "next":
274
- currentIndex = currentIndex === menuChildrenLast ? 0 : currentIndex + 1
275
- currentChild = menuChildren[currentIndex].children[0]
276
- break
277
- case "previous":
278
- currentIndex = currentIndex === 0 ? menuChildrenLast : currentIndex - 1
279
- currentChild = menuChildren[currentIndex].children[0]
280
- break
281
- }
282
- menu.setAttribute("aria-activedescendant", currentChild.id)
283
- menuChildren[currentIndex].children[0].classList.add("sg-dropdown-item-visual-focus")
284
-
285
- //makes it so that the menu stays with the button
286
- window.addEventListener("resize", handleResize, true)
287
- } else {
288
- const menu = document.getElementById(controlId+"-menu") as HTMLElement
289
- menu.setAttribute("aria-activedescendant", "")
290
- }
291
- return function cleanup() {
292
- window.removeEventListener("resize", handleResize, true)
293
- }
294
- }, [controlId, showInternal, activeDescendant])
295
-
296
- const handleMouseOver = (event: MouseEvent) => {
297
- const target = event.target as HTMLElement
298
- let active=target.classList.contains("sg-dropdown-item-visual-focus")
299
- const menu = document.getElementById(controlId+"-menu") as HTMLElement
300
- if(active) {
301
- return
302
- } else {
303
- document.querySelector(".sg-dropdown-item-visual-focus")?.classList.remove("sg-dropdown-item-visual-focus")
304
- menu.setAttribute("aria-activedescendant", "")
305
- target.classList.add("sg-dropdown-item-visual-focus")
306
- menu.setAttribute("aria-activedescendant", target.id)
307
- }
308
- }
309
- useEffect(() => {
310
- const menu = document.getElementById(controlId+"-menu") as HTMLElement
311
- for (let i=0; i< menu.children.length; i++) {
312
- (menu.children[i] as HTMLElement).addEventListener("mouseover", handleMouseOver, true)
313
- }
314
- return function cleanup() {
315
- for (let i=0; i< menu.children.length; i++) {
316
- (menu.children[i] as HTMLElement).addEventListener("mouseover", handleMouseOver, true)
317
- }
318
- }
319
- }, [])
320
- return (
321
- <ul id={controlId+"-menu"} role="menu" tabIndex={-1} aria-labelledby={controlId} data-navdropdown={navDropdown ? "true":"false"}
322
- ref={ref} className={`sg-dropdown-list${className ? " "+className:""}${showInternal ? " show":""}`}
323
- style={{...computedStyle, ...style}} {...restProps}
324
- >
325
- {children}
326
- </ul>
327
- )
328
- })
329
- Menu.displayName = "DropdownMenu"
330
-
331
-
332
- export const Item = forwardRef<HTMLAnchorElement | HTMLButtonElement, DropdownItemType>( ({children, as="button", className, ...restProps}, ref) => {
333
- const { navDropdown } = useDropdownContext()
334
- const Component = navDropdown ? "a" : as
335
- return (
336
- <li role="none">
337
- <Component ref={ref} role="menuitem" tabIndex="-1" className={`sg-dropdown-item${className ? " "+className:""}`} {...restProps}>
338
- {children}
339
- </Component >
340
- </li>
341
- )
342
- })
343
- Item.displayName = "DropdownItem"
344
-
345
- export const Divider = forwardRef<HTMLHRElement, DropdownDividerType>( ({className="", ...restProps}, ref) => {
346
- return (
347
- <hr ref={ref} className={`.sg-dropdown-divider${className}`} {...restProps}></hr>
348
- )
349
- })
350
- Divider.displayName = "DropdownDivider"
351
-
352
- export default Object.assign(Dropdown, {
353
- Toggle: Toggle,
354
- Menu: Menu,
355
- Item: Item,
356
- //Text: Text,
357
- Divider: Divider
358
- })
@@ -1,52 +0,0 @@
1
- import { ReactNode } from "react";
2
-
3
- import { BaseDivType, BaseAnchorType, BaseButtonType, BaseUListType, BaseHrType, BaseElementType } 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
- } & BaseDivType
29
-
30
- export type DropdownToggleType = {
31
- children: ReactNode,
32
- className?: string,
33
- navDropdown?: boolean,
34
- as?: React.ElementType,
35
- variant?: string
36
- } & (BaseAnchorType | BaseButtonType | BaseElementType)
37
-
38
- export type DropdownMenuType = {
39
- children: ReactNode,
40
- className?: string,
41
- style?: React.CSSProperties | undefined
42
- } & BaseUListType
43
-
44
- export type DropdownItemType = {
45
- children: ReactNode,
46
- as?: React.ElementType,
47
- className?: string
48
- } & (BaseAnchorType | BaseButtonType)
49
-
50
- export type DropdownDividerType = {
51
- className?: string,
52
- } & BaseHrType
@@ -1,4 +0,0 @@
1
- import Dropdown from "./Dropdown"
2
- export default Dropdown
3
- export { DropdownContext, DropdownContextProvider, useDropdownContext} from "./Dropdown"
4
- export type { DropdownContextType, DropdownDividerType, DropdownItemType, DropdownMenuType, DropdownToggleType, DropdownType} from "./Dropdown.types"
@@ -1,27 +0,0 @@
1
- import React, { useRef, forwardRef, useImperativeHandle } from "react"
2
-
3
- import { FileUploadButtonType } from "./FileUploadButton.types"
4
- import Button, { ButtonType } from "../Button"
5
- import mergeRefs from "../utils/MergeRefs"
6
-
7
- const FileUploadButton = forwardRef<HTMLButtonElement, FileUploadButtonType>( ({children, onClick, onFileUpload, controlId, ...props}, ref) => {
8
- const inputRef = useRef<HTMLInputElement>(null)
9
- const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {
10
- if(!inputRef.current) return
11
- inputRef.current.click()
12
- if(onClick) {
13
- onClick(event)
14
- }
15
- }
16
-
17
- return (
18
- <>
19
- <Button ref={ref} id={controlId} onClick={handleClick} {...props}>
20
- {children}
21
- </Button>
22
- <input aria-labelledby={controlId} ref={inputRef} className="custom-upload" type="file" onChange={onFileUpload}></input>
23
- </>
24
- )
25
- })
26
-
27
- export default FileUploadButton
@@ -1,9 +0,0 @@
1
- import { ReactNode } from "react"
2
- import { BaseButtonType } from "../utils/BaseTypes"
3
- import { ButtonType } from "../Button"
4
-
5
- export type FileUploadButtonType = {
6
- children: ReactNode,
7
- onFileUpload: React.ChangeEventHandler<HTMLInputElement>,
8
- controlId: string
9
- } & ButtonType
@@ -1,3 +0,0 @@
1
- import FileUploadButton from "./FileUploadButton"
2
- export default FileUploadButton
3
- export { FileUploadButtonType } from "./FileUploadButton.types"
@@ -1,22 +0,0 @@
1
- import React, { forwardRef, useMemo } from "react";
2
-
3
- import { FormContextProvider } from "../Form/Form";
4
- import { FormContextType } from "../Form/Form.types";
5
- import { FloatingLabelType } from "./FloatingLabel.types";
6
-
7
- const FloatingLabel = forwardRef<HTMLLabelElement, FloatingLabelType>( ({children, label, controlId, className, htmlFor,...restProps}, ref) => {
8
- const context = useMemo<FormContextType>(() => {
9
- return {controlId: controlId}
10
- }, [controlId])
11
- return (
12
- <FormContextProvider value={context} >
13
- <div className={`sg-form-floating`}>
14
- {children}
15
- <label ref={ref} htmlFor={controlId} className="sg-form-floating-label" {...restProps}>{label}</label>
16
- </div>
17
- </FormContextProvider>
18
- )
19
- })
20
- FloatingLabel.displayName = "FloatingLabel"
21
-
22
- export default FloatingLabel
@@ -1,11 +0,0 @@
1
- import { ReactNode } from "react";
2
-
3
- import { BaseLabelType } from "../utils/BaseTypes";
4
-
5
- export type FloatingLabelType = {
6
- children: ReactNode,
7
- className?:string,
8
- htmlFor?:string,
9
- label: string,
10
- controlId: string
11
- } & BaseLabelType
@@ -1,3 +0,0 @@
1
- import FloatingLabel from "./FloatingLabel"
2
- export default FloatingLabel
3
- export type {FloatingLabelType} from "./FloatingLabel.types"