@quillsql/react 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. package/.eslintrc.json +19 -0
  2. package/.prettierrc +11 -0
  3. package/example/README.md +46 -0
  4. package/example/package-lock.json +12111 -0
  5. package/example/package.json +43 -0
  6. package/example/public/favicon.ico +0 -0
  7. package/example/public/index.html +43 -0
  8. package/example/public/logo192.png +0 -0
  9. package/example/public/logo512.png +0 -0
  10. package/example/public/manifest.json +25 -0
  11. package/example/public/robots.txt +3 -0
  12. package/example/src/App.css +38 -0
  13. package/example/src/App.test.tsx +9 -0
  14. package/example/src/App.tsx +46 -0
  15. package/example/src/index.css +13 -0
  16. package/example/src/index.tsx +19 -0
  17. package/example/src/logo.svg +1 -0
  18. package/example/src/react-app-env.d.ts +1 -0
  19. package/example/src/reportWebVitals.ts +15 -0
  20. package/example/src/setupTests.ts +5 -0
  21. package/example/tsconfig.json +26 -0
  22. package/lib/AppContext.d.ts +29 -0
  23. package/lib/AppContext.js +94 -0
  24. package/lib/AppContext.js.map +1 -0
  25. package/lib/BarList.d.ts +17 -0
  26. package/lib/BarList.js +81 -0
  27. package/lib/BarList.js.map +1 -0
  28. package/lib/Button.d.ts +26 -0
  29. package/lib/Button.js +151 -0
  30. package/lib/Button.js.map +1 -0
  31. package/lib/Chart.d.ts +26 -0
  32. package/lib/Chart.js +532 -0
  33. package/lib/Chart.js.map +1 -0
  34. package/lib/Context.d.ts +28 -0
  35. package/lib/Context.js +126 -0
  36. package/lib/Context.js.map +1 -0
  37. package/lib/ContextProvider.d.ts +28 -0
  38. package/lib/ContextProvider.js +93 -0
  39. package/lib/ContextProvider.js.map +1 -0
  40. package/lib/Dashboard.d.ts +9 -0
  41. package/lib/Dashboard.js +271 -0
  42. package/lib/Dashboard.js.map +1 -0
  43. package/lib/DateRangePicker/Calendar.d.ts +15 -0
  44. package/lib/DateRangePicker/Calendar.js +94 -0
  45. package/lib/DateRangePicker/Calendar.js.map +1 -0
  46. package/lib/DateRangePicker/DateRangePicker.d.ts +31 -0
  47. package/lib/DateRangePicker/DateRangePicker.js +105 -0
  48. package/lib/DateRangePicker/DateRangePicker.js.map +1 -0
  49. package/lib/DateRangePicker/DateRangePickerButton.d.ts +21 -0
  50. package/lib/DateRangePicker/DateRangePickerButton.js +39 -0
  51. package/lib/DateRangePicker/DateRangePickerButton.js.map +1 -0
  52. package/lib/DateRangePicker/dateRangePickerUtils.d.ts +13 -0
  53. package/lib/DateRangePicker/dateRangePickerUtils.js +313 -0
  54. package/lib/DateRangePicker/dateRangePickerUtils.js.map +1 -0
  55. package/lib/DateRangePicker/index.d.ts +2 -0
  56. package/lib/DateRangePicker/index.js +2 -0
  57. package/lib/DateRangePicker/index.js.map +1 -0
  58. package/lib/DateRangePicker.d.ts +32 -0
  59. package/lib/DateRangePicker.js +105 -0
  60. package/lib/DateRangePicker.js.map +1 -0
  61. package/lib/PieChart.d.ts +63 -0
  62. package/lib/PieChart.js +589 -0
  63. package/lib/PieChart.js.map +1 -0
  64. package/lib/QuillProvider.d.ts +13 -0
  65. package/lib/QuillProvider.js +19 -0
  66. package/lib/QuillProvider.js.map +1 -0
  67. package/lib/assets/ArrowDownHeadIcon.d.ts +5 -0
  68. package/lib/assets/ArrowDownHeadIcon.js +29 -0
  69. package/lib/assets/ArrowDownHeadIcon.js.map +1 -0
  70. package/lib/assets/ArrowDownIcon.d.ts +5 -0
  71. package/lib/assets/ArrowDownIcon.js +29 -0
  72. package/lib/assets/ArrowDownIcon.js.map +1 -0
  73. package/lib/assets/ArrowDownRightIcon.d.ts +5 -0
  74. package/lib/assets/ArrowDownRightIcon.js +29 -0
  75. package/lib/assets/ArrowDownRightIcon.js.map +1 -0
  76. package/lib/assets/ArrowLeftHeadIcon.d.ts +5 -0
  77. package/lib/assets/ArrowLeftHeadIcon.js +29 -0
  78. package/lib/assets/ArrowLeftHeadIcon.js.map +1 -0
  79. package/lib/assets/ArrowRightHeadIcon.d.ts +5 -0
  80. package/lib/assets/ArrowRightHeadIcon.js +29 -0
  81. package/lib/assets/ArrowRightHeadIcon.js.map +1 -0
  82. package/lib/assets/ArrowRightIcon.d.ts +5 -0
  83. package/lib/assets/ArrowRightIcon.js +29 -0
  84. package/lib/assets/ArrowRightIcon.js.map +1 -0
  85. package/lib/assets/ArrowUpHeadIcon.d.ts +5 -0
  86. package/lib/assets/ArrowUpHeadIcon.js +29 -0
  87. package/lib/assets/ArrowUpHeadIcon.js.map +1 -0
  88. package/lib/assets/ArrowUpIcon.d.ts +5 -0
  89. package/lib/assets/ArrowUpIcon.js +29 -0
  90. package/lib/assets/ArrowUpIcon.js.map +1 -0
  91. package/lib/assets/ArrowUpRightIcon.d.ts +5 -0
  92. package/lib/assets/ArrowUpRightIcon.js +29 -0
  93. package/lib/assets/ArrowUpRightIcon.js.map +1 -0
  94. package/lib/assets/CalendarIcon.d.ts +5 -0
  95. package/lib/assets/CalendarIcon.js +29 -0
  96. package/lib/assets/CalendarIcon.js.map +1 -0
  97. package/lib/assets/DoubleArrowLeftHeadIcon.d.ts +5 -0
  98. package/lib/assets/DoubleArrowLeftHeadIcon.js +29 -0
  99. package/lib/assets/DoubleArrowLeftHeadIcon.js.map +1 -0
  100. package/lib/assets/DoubleArrowRightHeadIcon.d.ts +5 -0
  101. package/lib/assets/DoubleArrowRightHeadIcon.js +29 -0
  102. package/lib/assets/DoubleArrowRightHeadIcon.js.map +1 -0
  103. package/lib/assets/ExclamationFilledIcon.d.ts +5 -0
  104. package/lib/assets/ExclamationFilledIcon.js +29 -0
  105. package/lib/assets/ExclamationFilledIcon.js.map +1 -0
  106. package/lib/assets/LoadingSpinner.d.ts +5 -0
  107. package/lib/assets/LoadingSpinner.js +29 -0
  108. package/lib/assets/LoadingSpinner.js.map +1 -0
  109. package/lib/assets/SearchIcon.d.ts +5 -0
  110. package/lib/assets/SearchIcon.js +29 -0
  111. package/lib/assets/SearchIcon.js.map +1 -0
  112. package/lib/assets/XCircleIcon.d.ts +5 -0
  113. package/lib/assets/XCircleIcon.js +29 -0
  114. package/lib/assets/XCircleIcon.js.map +1 -0
  115. package/lib/assets/index.d.ts +16 -0
  116. package/lib/assets/index.js +17 -0
  117. package/lib/assets/index.js.map +1 -0
  118. package/lib/components/Dropdown/Dropdown.d.ts +12 -0
  119. package/lib/components/Dropdown/Dropdown.js +60 -0
  120. package/lib/components/Dropdown/Dropdown.js.map +1 -0
  121. package/lib/components/Dropdown/DropdownItem.d.ts +8 -0
  122. package/lib/components/Dropdown/DropdownItem.js +54 -0
  123. package/lib/components/Dropdown/DropdownItem.js.map +1 -0
  124. package/lib/components/Dropdown/index.d.ts +2 -0
  125. package/lib/components/Dropdown/index.js +3 -0
  126. package/lib/components/Dropdown/index.js.map +1 -0
  127. package/lib/components/Modal/Dropdown/Dropdown.d.ts +12 -0
  128. package/lib/components/Modal/Dropdown/Dropdown.js +52 -0
  129. package/lib/components/Modal/Dropdown/Dropdown.js.map +1 -0
  130. package/lib/components/Modal/Dropdown/DropdownItem.d.ts +8 -0
  131. package/lib/components/Modal/Dropdown/DropdownItem.js +51 -0
  132. package/lib/components/Modal/Dropdown/DropdownItem.js.map +1 -0
  133. package/lib/components/Modal/Dropdown/index.d.ts +2 -0
  134. package/lib/components/Modal/Dropdown/index.js +3 -0
  135. package/lib/components/Modal/Dropdown/index.js.map +1 -0
  136. package/lib/components/Modal/Modal.d.ts +13 -0
  137. package/lib/components/Modal/Modal.js +71 -0
  138. package/lib/components/Modal/Modal.js.map +1 -0
  139. package/lib/components/Modal/index.d.ts +1 -0
  140. package/lib/components/Modal/index.js +2 -0
  141. package/lib/components/Modal/index.js.map +1 -0
  142. package/lib/components/selectUtils.d.ts +9 -0
  143. package/lib/components/selectUtils.js +37 -0
  144. package/lib/components/selectUtils.js.map +1 -0
  145. package/lib/contexts/BaseColorContext.d.ts +3 -0
  146. package/lib/contexts/BaseColorContext.js +5 -0
  147. package/lib/contexts/BaseColorContext.js.map +1 -0
  148. package/lib/contexts/HoveredValueContext.d.ts +7 -0
  149. package/lib/contexts/HoveredValueContext.js +6 -0
  150. package/lib/contexts/HoveredValueContext.js.map +1 -0
  151. package/lib/contexts/RootStylesContext.d.ts +3 -0
  152. package/lib/contexts/RootStylesContext.js +4 -0
  153. package/lib/contexts/RootStylesContext.js.map +1 -0
  154. package/lib/contexts/SelectedValueContext.d.ts +7 -0
  155. package/lib/contexts/SelectedValueContext.js +7 -0
  156. package/lib/contexts/SelectedValueContext.js.map +1 -0
  157. package/lib/contexts/index.d.ts +4 -0
  158. package/lib/contexts/index.js +5 -0
  159. package/lib/contexts/index.js.map +1 -0
  160. package/lib/hooks/index.d.ts +4 -0
  161. package/lib/hooks/index.js +5 -0
  162. package/lib/hooks/index.js.map +1 -0
  163. package/lib/hooks/useInternalState.d.ts +3 -0
  164. package/lib/hooks/useInternalState.js +15 -0
  165. package/lib/hooks/useInternalState.js.map +1 -0
  166. package/lib/hooks/useOnClickOutside.d.ts +2 -0
  167. package/lib/hooks/useOnClickOutside.js +19 -0
  168. package/lib/hooks/useOnClickOutside.js.map +1 -0
  169. package/lib/hooks/useOnWindowResize.d.ts +4 -0
  170. package/lib/hooks/useOnWindowResize.js +15 -0
  171. package/lib/hooks/useOnWindowResize.js.map +1 -0
  172. package/lib/hooks/useSelectOnKeyDown.d.ts +2 -0
  173. package/lib/hooks/useSelectOnKeyDown.js +64 -0
  174. package/lib/hooks/useSelectOnKeyDown.js.map +1 -0
  175. package/lib/index.d.ts +3 -0
  176. package/lib/index.js +5 -0
  177. package/lib/index.js.map +1 -0
  178. package/lib/lib/colorClassNames.d.ts +19 -0
  179. package/lib/lib/colorClassNames.js +3175 -0
  180. package/lib/lib/colorClassNames.js.map +1 -0
  181. package/lib/lib/constants.d.ts +16 -0
  182. package/lib/lib/constants.js +47 -0
  183. package/lib/lib/constants.js.map +1 -0
  184. package/lib/lib/font.d.ts +13 -0
  185. package/lib/lib/font.js +14 -0
  186. package/lib/lib/font.js.map +1 -0
  187. package/lib/lib/hexColors.d.ts +3 -0
  188. package/lib/lib/hexColors.js +29 -0
  189. package/lib/lib/hexColors.js.map +1 -0
  190. package/lib/lib/index.d.ts +10 -0
  191. package/lib/lib/index.js +11 -0
  192. package/lib/lib/index.js.map +1 -0
  193. package/lib/lib/inputTypes.d.ts +20 -0
  194. package/lib/lib/inputTypes.js +37 -0
  195. package/lib/lib/inputTypes.js.map +1 -0
  196. package/lib/lib/shape.d.ts +73 -0
  197. package/lib/lib/shape.js +74 -0
  198. package/lib/lib/shape.js.map +1 -0
  199. package/lib/lib/sizing.d.ts +46 -0
  200. package/lib/lib/sizing.js +43 -0
  201. package/lib/lib/sizing.js.map +1 -0
  202. package/lib/lib/spacing.d.ts +264 -0
  203. package/lib/lib/spacing.js +265 -0
  204. package/lib/lib/spacing.js.map +1 -0
  205. package/lib/lib/theme.d.ts +22 -0
  206. package/lib/lib/theme.js +46 -0
  207. package/lib/lib/theme.js.map +1 -0
  208. package/lib/lib/utils.d.ts +12 -0
  209. package/lib/lib/utils.js +69 -0
  210. package/lib/lib/utils.js.map +1 -0
  211. package/lib/styles.css +12019 -0
  212. package/package.json +48 -0
  213. package/postcss.config.js +6 -0
  214. package/src/BarList.tsx +236 -0
  215. package/src/Chart.tsx +934 -0
  216. package/src/Context.tsx +204 -0
  217. package/src/Dashboard.tsx +379 -0
  218. package/src/DateRangePicker/Calendar.tsx +425 -0
  219. package/src/DateRangePicker/DateRangePicker.tsx +251 -0
  220. package/src/DateRangePicker/DateRangePickerButton.tsx +176 -0
  221. package/src/DateRangePicker/dateRangePickerUtils.tsx +460 -0
  222. package/src/DateRangePicker/index.ts +3 -0
  223. package/src/PieChart.tsx +838 -0
  224. package/src/QuillProvider.tsx +28 -0
  225. package/src/assets/ArrowDownHeadIcon.tsx +11 -0
  226. package/src/assets/ArrowDownIcon.tsx +14 -0
  227. package/src/assets/ArrowDownRightIcon.tsx +14 -0
  228. package/src/assets/ArrowLeftHeadIcon.tsx +11 -0
  229. package/src/assets/ArrowRightHeadIcon.tsx +11 -0
  230. package/src/assets/ArrowRightIcon.tsx +14 -0
  231. package/src/assets/ArrowUpHeadIcon.tsx +11 -0
  232. package/src/assets/ArrowUpIcon.tsx +14 -0
  233. package/src/assets/ArrowUpRightIcon.tsx +14 -0
  234. package/src/assets/CalendarIcon.tsx +14 -0
  235. package/src/assets/DoubleArrowLeftHeadIcon.tsx +18 -0
  236. package/src/assets/DoubleArrowRightHeadIcon.tsx +20 -0
  237. package/src/assets/ExclamationFilledIcon.tsx +14 -0
  238. package/src/assets/LoadingSpinner.tsx +11 -0
  239. package/src/assets/SearchIcon.tsx +14 -0
  240. package/src/assets/XCircleIcon.tsx +14 -0
  241. package/src/assets/index.ts +16 -0
  242. package/src/components/Dropdown/Dropdown.tsx +179 -0
  243. package/src/components/Dropdown/DropdownItem.tsx +86 -0
  244. package/src/components/Dropdown/index.ts +2 -0
  245. package/src/components/Modal/Modal.tsx +113 -0
  246. package/src/components/Modal/index.ts +1 -0
  247. package/src/components/selectUtils.ts +67 -0
  248. package/src/contexts/BaseColorContext.tsx +8 -0
  249. package/src/contexts/HoveredValueContext.tsx +12 -0
  250. package/src/contexts/RootStylesContext.tsx +5 -0
  251. package/src/contexts/SelectedValueContext.tsx +13 -0
  252. package/src/contexts/index.ts +4 -0
  253. package/src/hooks/index.ts +4 -0
  254. package/src/hooks/useInternalState.tsx +18 -0
  255. package/src/hooks/useOnClickOutside.tsx +23 -0
  256. package/src/hooks/useOnWindowResize.tsx +17 -0
  257. package/src/hooks/useSelectOnKeyDown.tsx +80 -0
  258. package/src/index.ts +4 -0
  259. package/src/lib/colorClassNames.ts +3191 -0
  260. package/src/lib/constants.ts +52 -0
  261. package/src/lib/font.ts +14 -0
  262. package/src/lib/hexColors.ts +28 -0
  263. package/src/lib/index.ts +10 -0
  264. package/src/lib/inputTypes.ts +62 -0
  265. package/src/lib/shape.ts +75 -0
  266. package/src/lib/sizing.ts +47 -0
  267. package/src/lib/spacing.ts +264 -0
  268. package/src/lib/theme.ts +49 -0
  269. package/src/lib/utils.tsx +81 -0
  270. package/src/styles.css +5 -0
  271. package/tailwind.config.js +16 -0
  272. package/tsconfig.json +22 -0
@@ -0,0 +1,67 @@
1
+ import {
2
+ BaseColors,
3
+ DEFAULT_COLOR,
4
+ WHITE,
5
+ colorClassNames,
6
+ colorPalette,
7
+ getColorClassNames,
8
+ } from '../lib';
9
+ import React from 'react';
10
+ import { twMerge } from 'tailwind-merge';
11
+
12
+ export interface SelectItemProps {
13
+ value: string;
14
+ text?: string;
15
+ }
16
+
17
+ export function constructValueToNameMapping(
18
+ children: React.ReactElement[] | React.ReactElement
19
+ ) {
20
+ const valueToNameMapping = new Map<string, string>();
21
+ React.Children.map(children, (child: { props: SelectItemProps }) => {
22
+ valueToNameMapping.set(
23
+ child.props.value,
24
+ child.props.text ?? child.props.value
25
+ );
26
+ });
27
+ return valueToNameMapping;
28
+ }
29
+
30
+ export function getFilteredOptions(
31
+ searchQuery: string,
32
+ options: SelectItemProps[]
33
+ ): SelectItemProps[] {
34
+ return searchQuery === ''
35
+ ? options
36
+ : options.filter((option: SelectItemProps) => {
37
+ const optionText = option.text ?? option.value;
38
+ return optionText.toLowerCase().includes(searchQuery.toLowerCase());
39
+ });
40
+ }
41
+
42
+ export const getSelectButtonColors = (
43
+ hasSelection: boolean,
44
+ isDisabled: boolean,
45
+ hasError = false
46
+ ) => {
47
+ return twMerge(
48
+ isDisabled
49
+ ? getColorClassNames(DEFAULT_COLOR, colorPalette.canvasBackground).bgColor
50
+ : getColorClassNames(WHITE, colorPalette.background).bgColor,
51
+ !isDisabled &&
52
+ getColorClassNames(DEFAULT_COLOR, colorPalette.canvasBackground)
53
+ .hoverBgColor,
54
+ hasSelection
55
+ ? getColorClassNames(DEFAULT_COLOR, colorPalette.darkText).textColor
56
+ : getColorClassNames(DEFAULT_COLOR, colorPalette.text).textColor,
57
+ isDisabled &&
58
+ getColorClassNames(DEFAULT_COLOR, colorPalette.lightText).textColor,
59
+ hasError && colorClassNames[BaseColors.Rose][colorPalette.text].textColor,
60
+ hasError
61
+ ? colorClassNames[BaseColors.Rose][colorPalette.ring].borderColor
62
+ : getColorClassNames(DEFAULT_COLOR, colorPalette.ring).borderColor
63
+ );
64
+ };
65
+
66
+ export const hasValue = (value: string | null | undefined) =>
67
+ value !== null && value !== undefined && value !== '';
@@ -0,0 +1,8 @@
1
+ import { createContext } from 'react';
2
+
3
+ import { BaseColors } from '../lib';
4
+ import { Color } from '../lib/inputTypes';
5
+
6
+ const BaseColorContext = createContext<Color>(BaseColors.Blue);
7
+
8
+ export default BaseColorContext;
@@ -0,0 +1,12 @@
1
+ import { Dispatch, SetStateAction, createContext } from 'react';
2
+
3
+ export interface HoveredValueContextValue {
4
+ hoveredValue: any | undefined;
5
+ setHoveredValue?: Dispatch<SetStateAction<any>>;
6
+ }
7
+
8
+ const HoveredValueContext = createContext<HoveredValueContextValue>({
9
+ hoveredValue: undefined,
10
+ });
11
+
12
+ export default HoveredValueContext;
@@ -0,0 +1,5 @@
1
+ import { createContext } from 'react';
2
+
3
+ const RootStylesContext = createContext<string | undefined>(undefined);
4
+
5
+ export default RootStylesContext;
@@ -0,0 +1,13 @@
1
+ import { createContext } from 'react';
2
+
3
+ export interface SelectedValueContextValue {
4
+ selectedValue: any;
5
+ handleValueChange: ((value: any) => void) | undefined;
6
+ }
7
+
8
+ const SelectedValueContext = createContext<SelectedValueContextValue>({
9
+ selectedValue: undefined,
10
+ handleValueChange: undefined,
11
+ });
12
+
13
+ export default SelectedValueContext;
@@ -0,0 +1,4 @@
1
+ export { default as BaseColorContext } from './BaseColorContext';
2
+ export { default as HoveredValueContext } from './HoveredValueContext';
3
+ export { default as RootStylesContext } from './RootStylesContext';
4
+ export { default as SelectedValueContext } from './SelectedValueContext';
@@ -0,0 +1,4 @@
1
+ export { default as useInternalState } from "./useInternalState";
2
+ export { default as useOnClickOutside } from "./useOnClickOutside";
3
+ export { default as useOnWindowResize } from "./useOnWindowResize";
4
+ export { default as useSelectOnKeyDown } from "./useSelectOnKeyDown";
@@ -0,0 +1,18 @@
1
+ import { useState } from "react";
2
+
3
+ const useInternalState = <T,>(defaultValueProp: T, valueProp: T) => {
4
+ const isControlled = valueProp !== undefined;
5
+ const [valueState, setValueState] = useState(defaultValueProp);
6
+
7
+ const value = isControlled ? valueProp : valueState;
8
+ const setValue = (nextValue: T) => {
9
+ if (isControlled) {
10
+ return;
11
+ }
12
+ setValueState(nextValue);
13
+ };
14
+
15
+ return [value, setValue] as [T, React.Dispatch<React.SetStateAction<T>>];
16
+ };
17
+
18
+ export default useInternalState;
@@ -0,0 +1,23 @@
1
+ import { useEffect } from "react";
2
+
3
+ const useOnClickOutside = (
4
+ ref: React.RefObject<HTMLDivElement>,
5
+ handler: { (event: any): void },
6
+ ) => {
7
+ useEffect(() => {
8
+ const listener = (event: any) => {
9
+ if (!ref.current || ref.current.contains(event.target)) {
10
+ return;
11
+ }
12
+ handler(event);
13
+ };
14
+ document.addEventListener("mousedown", listener);
15
+ document.addEventListener("touchstart", listener);
16
+ return () => {
17
+ document.removeEventListener("mousedown", listener);
18
+ document.removeEventListener("touchstart", listener);
19
+ };
20
+ }, [ref, handler]);
21
+ };
22
+
23
+ export default useOnClickOutside;
@@ -0,0 +1,17 @@
1
+ import { useEffect, useState } from "react";
2
+
3
+ const useOnWindowResize = (handler: { (): void }, initialWindowSize?: number) => {
4
+ const [windowSize, setWindowSize] = useState<undefined | number>(initialWindowSize);
5
+ useEffect(() => {
6
+ const handleResize = () => {
7
+ setWindowSize(window.innerWidth);
8
+ handler();
9
+ };
10
+ handleResize();
11
+ window.addEventListener("resize", handleResize);
12
+
13
+ return () => window.removeEventListener("resize", handleResize);
14
+ }, [handler, windowSize]);
15
+ };
16
+
17
+ export default useOnWindowResize;
@@ -0,0 +1,80 @@
1
+ import { useEffect, useState } from "react";
2
+
3
+ const useSelectOnKeyDown = (
4
+ onValueChange: (value: string) => void,
5
+ optionValues: string[],
6
+ isFocused: boolean,
7
+ handleFocusChange: (isFocused: boolean) => void,
8
+ value?: string,
9
+ ): [
10
+ string | null | undefined,
11
+ (e: React.KeyboardEvent<HTMLDivElement | HTMLButtonElement>) => void,
12
+ ] => {
13
+ const NO_SELECTION_IDX = -1;
14
+ const [hoveredIdx, setHoveredIdx] = useState(NO_SELECTION_IDX);
15
+
16
+ const getHoveredValue = (hoveredIdx: number, optionValues: string[]) => {
17
+ if (hoveredIdx < 0) return undefined;
18
+ return optionValues[hoveredIdx];
19
+ };
20
+
21
+ useEffect(() => {
22
+ const getIndexOfSelectedValue = () => {
23
+ if (!isFocused) {
24
+ setHoveredIdx(NO_SELECTION_IDX);
25
+ }
26
+ if (!value) return NO_SELECTION_IDX;
27
+ const indexOfValue = optionValues.indexOf(value);
28
+ return indexOfValue === -1 ? NO_SELECTION_IDX : indexOfValue;
29
+ };
30
+
31
+ setHoveredIdx(getIndexOfSelectedValue());
32
+ }, [value, isFocused]);
33
+
34
+ const hoveredValue = getHoveredValue(hoveredIdx, optionValues);
35
+
36
+ const getNextIdx = () => {
37
+ const nextIdx = hoveredIdx + 1;
38
+ return Math.min(nextIdx, optionValues.length - 1);
39
+ };
40
+
41
+ const getPrevIdx = () => {
42
+ const prevIdx = hoveredIdx - 1;
43
+ return Math.max(prevIdx, 0);
44
+ };
45
+
46
+ const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement | HTMLButtonElement>) => {
47
+ if (!isFocused) {
48
+ return;
49
+ }
50
+
51
+ switch (e.key) {
52
+ case "ArrowUp": {
53
+ e.preventDefault();
54
+ setHoveredIdx(getPrevIdx());
55
+ break;
56
+ }
57
+ case "ArrowDown": {
58
+ e.preventDefault();
59
+ setHoveredIdx(getNextIdx());
60
+ break;
61
+ }
62
+ case "Enter": {
63
+ e.preventDefault();
64
+ if (hoveredValue) {
65
+ onValueChange(hoveredValue);
66
+ }
67
+ break;
68
+ }
69
+ case "Escape": {
70
+ e.preventDefault();
71
+ handleFocusChange(false);
72
+ setHoveredIdx(NO_SELECTION_IDX);
73
+ break;
74
+ }
75
+ }
76
+ };
77
+ return [hoveredValue, handleKeyDown];
78
+ };
79
+
80
+ export default useSelectOnKeyDown;
package/src/index.ts ADDED
@@ -0,0 +1,4 @@
1
+ // src/index.ts
2
+ export { default as Dashboard } from './Dashboard';
3
+ export { default as QuillProvider } from './QuillProvider';
4
+ export { default as Chart } from './Chart';