@ftdata/ui 0.0.1

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 (265) hide show
  1. package/README.md +23 -0
  2. package/dist/assets/AddIcon.d.ts +3 -0
  3. package/dist/assets/AddIcon.js +35 -0
  4. package/dist/assets/ArrowLeftIcon.d.ts +2 -0
  5. package/dist/assets/ArrowLeftIcon.js +26 -0
  6. package/dist/assets/BackArrowIcon.d.ts +3 -0
  7. package/dist/assets/BackArrowIcon.js +35 -0
  8. package/dist/assets/BellIcon.d.ts +2 -0
  9. package/dist/assets/BellIcon.js +43 -0
  10. package/dist/assets/BuildingIcon.d.ts +2 -0
  11. package/dist/assets/BuildingIcon.js +15 -0
  12. package/dist/assets/BurgerMenu.d.ts +3 -0
  13. package/dist/assets/BurgerMenu.js +41 -0
  14. package/dist/assets/CancelSquareIcon.d.ts +3 -0
  15. package/dist/assets/CancelSquareIcon.js +36 -0
  16. package/dist/assets/CarretDownIcon.d.ts +3 -0
  17. package/dist/assets/CarretDownIcon.js +32 -0
  18. package/dist/assets/CavetDown.d.ts +2 -0
  19. package/dist/assets/CavetDown.js +18 -0
  20. package/dist/assets/CavetRight.d.ts +2 -0
  21. package/dist/assets/CavetRight.js +18 -0
  22. package/dist/assets/CavetUp.d.ts +2 -0
  23. package/dist/assets/CavetUp.js +18 -0
  24. package/dist/assets/CheckMarkIcon.d.ts +3 -0
  25. package/dist/assets/CheckMarkIcon.js +39 -0
  26. package/dist/assets/CheckmarkDone.d.ts +3 -0
  27. package/dist/assets/CheckmarkDone.js +27 -0
  28. package/dist/assets/CloseIcon.d.ts +2 -0
  29. package/dist/assets/CloseIcon.js +27 -0
  30. package/dist/assets/CommandIcon.d.ts +2 -0
  31. package/dist/assets/CommandIcon.js +77 -0
  32. package/dist/assets/DoneCircleIcon.d.ts +3 -0
  33. package/dist/assets/DoneCircleIcon.js +29 -0
  34. package/dist/assets/EmptyAlertDetail.d.ts +2 -0
  35. package/dist/assets/EmptyAlertDetail.js +451 -0
  36. package/dist/assets/EmptyPage.d.ts +3 -0
  37. package/dist/assets/EmptyPage.js +551 -0
  38. package/dist/assets/EyeIcon.d.ts +2 -0
  39. package/dist/assets/EyeIcon.js +35 -0
  40. package/dist/assets/FenceIcon.d.ts +2 -0
  41. package/dist/assets/FenceIcon.js +70 -0
  42. package/dist/assets/FolderCheckmark.d.ts +3 -0
  43. package/dist/assets/FolderCheckmark.js +44 -0
  44. package/dist/assets/FulltrackLogo.d.ts +3 -0
  45. package/dist/assets/FulltrackLogo.js +37 -0
  46. package/dist/assets/GlobeIcon.d.ts +2 -0
  47. package/dist/assets/GlobeIcon.js +61 -0
  48. package/dist/assets/GoogleIcon.d.ts +2 -0
  49. package/dist/assets/GoogleIcon.js +18 -0
  50. package/dist/assets/Group.js +2 -0
  51. package/dist/assets/MinusMarkIcon.d.ts +3 -0
  52. package/dist/assets/MinusMarkIcon.js +40 -0
  53. package/dist/assets/MosaicIcon.d.ts +3 -0
  54. package/dist/assets/MosaicIcon.js +41 -0
  55. package/dist/assets/NavLogo.d.ts +3 -0
  56. package/dist/assets/NavLogo.js +73 -0
  57. package/dist/assets/PinLocation.d.ts +2 -0
  58. package/dist/assets/PinLocation.js +31 -0
  59. package/dist/assets/PlusAddIcon.d.ts +2 -0
  60. package/dist/assets/PlusAddIcon.js +42 -0
  61. package/dist/assets/RefreshIcon.d.ts +2 -0
  62. package/dist/assets/RefreshIcon.js +16 -0
  63. package/dist/assets/SearchIcon.d.ts +3 -0
  64. package/dist/assets/SearchIcon.js +30 -0
  65. package/dist/assets/SendIcon.d.ts +3 -0
  66. package/dist/assets/SendIcon.js +20 -0
  67. package/dist/assets/StreetView.d.ts +2 -0
  68. package/dist/assets/StreetView.js +52 -0
  69. package/dist/assets/SwitchCheckMarkIcon.d.ts +3 -0
  70. package/dist/assets/SwitchCheckMarkIcon.js +40 -0
  71. package/dist/assets/WarningIcon.d.ts +2 -0
  72. package/dist/assets/WarningIcon.js +34 -0
  73. package/dist/assets/gif/how-to-use.js +2 -0
  74. package/dist/assets/iconMenu/SettingsIcon.d.ts +2 -0
  75. package/dist/assets/iconMenu/SettingsIcon.js +30 -0
  76. package/dist/assets/img/cover.js +2 -0
  77. package/dist/assets/img/map-sample.js +2 -0
  78. package/dist/assets/img/photo-goes-here.js +2 -0
  79. package/dist/assets/svg/chat.js +2 -0
  80. package/dist/assets/svg/colored-item.js +2 -0
  81. package/dist/assets/svg/mailbox-bro.js +2 -0
  82. package/dist/assets/svg/star-favorite.js +2 -0
  83. package/dist/assets/travolta.js +2 -0
  84. package/dist/components/Avatar/Avatar.stories.d.ts +33 -0
  85. package/dist/components/Avatar/Avatar.stories.js +177 -0
  86. package/dist/components/Avatar/index.d.ts +7 -0
  87. package/dist/components/Avatar/index.js +28 -0
  88. package/dist/components/Avatar/styles.d.ts +4 -0
  89. package/dist/components/Avatar/styles.js +37 -0
  90. package/dist/components/Avatar/utils/getAvatarColors.d.ts +6 -0
  91. package/dist/components/Avatar/utils/getAvatarColors.js +48 -0
  92. package/dist/components/Breadcrumb/Breadcrumb.stories.d.ts +17 -0
  93. package/dist/components/Breadcrumb/Breadcrumb.stories.js +51 -0
  94. package/dist/components/Breadcrumb/index.d.ts +10 -0
  95. package/dist/components/Breadcrumb/index.js +34 -0
  96. package/dist/components/Breadcrumb/styles.d.ts +9 -0
  97. package/dist/components/Breadcrumb/styles.js +43 -0
  98. package/dist/components/Button/Button.stories.d.ts +58 -0
  99. package/dist/components/Button/Button.stories.js +284 -0
  100. package/dist/components/Button/index.d.ts +26 -0
  101. package/dist/components/Button/index.js +69 -0
  102. package/dist/components/Button/modifiers.d.ts +8 -0
  103. package/dist/components/Button/modifiers.js +41 -0
  104. package/dist/components/Button/styles.d.ts +25 -0
  105. package/dist/components/Button/styles.js +111 -0
  106. package/dist/components/Checkbox/CheckMarkIcon.d.ts +3 -0
  107. package/dist/components/Checkbox/CheckMarkIcon.js +38 -0
  108. package/dist/components/Checkbox/Checkbox.stories.d.ts +35 -0
  109. package/dist/components/Checkbox/Checkbox.stories.js +101 -0
  110. package/dist/components/Checkbox/MinusMarkIcon.d.ts +3 -0
  111. package/dist/components/Checkbox/MinusMarkIcon.js +39 -0
  112. package/dist/components/Checkbox/index.d.ts +9 -0
  113. package/dist/components/Checkbox/index.js +40 -0
  114. package/dist/components/Checkbox/styles.d.ts +12 -0
  115. package/dist/components/Checkbox/styles.js +41 -0
  116. package/dist/components/Collapse/Colapse.stories.d.ts +10 -0
  117. package/dist/components/Collapse/Colapse.stories.js +108 -0
  118. package/dist/components/Collapse/index.d.ts +15 -0
  119. package/dist/components/Collapse/index.js +61 -0
  120. package/dist/components/Collapse/styles.d.ts +11 -0
  121. package/dist/components/Collapse/styles.js +23 -0
  122. package/dist/components/CustomSelect/CustomSelect.stories.d.ts +73 -0
  123. package/dist/components/CustomSelect/CustomSelect.stories.js +477 -0
  124. package/dist/components/CustomSelect/CustomSelectList/index.d.ts +10 -0
  125. package/dist/components/CustomSelect/CustomSelectList/index.js +66 -0
  126. package/dist/components/CustomSelect/CustomSelectList/style.d.ts +8 -0
  127. package/dist/components/CustomSelect/CustomSelectList/style.js +95 -0
  128. package/dist/components/CustomSelect/index.d.ts +30 -0
  129. package/dist/components/CustomSelect/index.js +193 -0
  130. package/dist/components/CustomSelect/styles.d.ts +22 -0
  131. package/dist/components/CustomSelect/styles.js +93 -0
  132. package/dist/components/DoubleList/DoubleList.stories.d.ts +13 -0
  133. package/dist/components/DoubleList/DoubleList.stories.js +82 -0
  134. package/dist/components/DoubleList/index.d.ts +9 -0
  135. package/dist/components/DoubleList/index.js +70 -0
  136. package/dist/components/DoubleList/style.d.ts +5 -0
  137. package/dist/components/DoubleList/style.js +92 -0
  138. package/dist/components/EmptyState/Empty.stories.d.ts +26 -0
  139. package/dist/components/EmptyState/Empty.stories.js +72 -0
  140. package/dist/components/EmptyState/index.d.ts +10 -0
  141. package/dist/components/EmptyState/index.js +48 -0
  142. package/dist/components/EmptyState/styles.d.ts +3 -0
  143. package/dist/components/EmptyState/styles.js +39 -0
  144. package/dist/components/Grid/Column/Column.stories.d.ts +26 -0
  145. package/dist/components/Grid/Column/Column.stories.js +335 -0
  146. package/dist/components/Grid/Column/index.d.ts +15 -0
  147. package/dist/components/Grid/Column/index.js +10 -0
  148. package/dist/components/Grid/Container/Container.stories.d.ts +11 -0
  149. package/dist/components/Grid/Container/Container.stories.js +114 -0
  150. package/dist/components/Grid/Container/index.d.ts +6 -0
  151. package/dist/components/Grid/Container/index.js +11 -0
  152. package/dist/components/Grid/Row/Row.stories.d.ts +22 -0
  153. package/dist/components/Grid/Row/Row.stories.js +248 -0
  154. package/dist/components/Grid/Row/index.d.ts +20 -0
  155. package/dist/components/Grid/Row/index.js +10 -0
  156. package/dist/components/Grid/index.d.ts +38 -0
  157. package/dist/components/Grid/index.js +121 -0
  158. package/dist/components/Grid/utils.d.ts +1 -0
  159. package/dist/components/Grid/utils.js +18 -0
  160. package/dist/components/Loading/Loading/index.d.ts +7 -0
  161. package/dist/components/Loading/Loading/index.js +9 -0
  162. package/dist/components/Loading/Loading.stories.d.ts +24 -0
  163. package/dist/components/Loading/Loading.stories.js +145 -0
  164. package/dist/components/Loading/index.d.ts +16 -0
  165. package/dist/components/Loading/index.js +98 -0
  166. package/dist/components/Menu/constants/icons.d.ts +17 -0
  167. package/dist/components/Menu/constants/icons.js +61 -0
  168. package/dist/components/Menu/helpers/createMenus.d.ts +2 -0
  169. package/dist/components/Menu/helpers/createMenus.js +20 -0
  170. package/dist/components/Menu/helpers/createSubMenus.d.ts +2 -0
  171. package/dist/components/Menu/helpers/createSubMenus.js +13 -0
  172. package/dist/components/Menu/helpers/generateColorScale.d.ts +1 -0
  173. package/dist/components/Menu/helpers/generateColorScale.js +62 -0
  174. package/dist/components/Menu/helpers/getLuminance.d.ts +1 -0
  175. package/dist/components/Menu/helpers/getLuminance.js +9 -0
  176. package/dist/components/Menu/index.d.ts +12 -0
  177. package/dist/components/Menu/index.js +108 -0
  178. package/dist/components/Menu/styles.d.ts +17 -0
  179. package/dist/components/Menu/styles.js +202 -0
  180. package/dist/components/Menu/types/IconKeysType.d.ts +2 -0
  181. package/dist/components/Menu/types/IconKeysType.js +0 -0
  182. package/dist/components/Menu/types/MenuItem.d.ts +26 -0
  183. package/dist/components/Menu/types/MenuItem.js +0 -0
  184. package/dist/components/MultiSelect/Badge/index.d.ts +6 -0
  185. package/dist/components/MultiSelect/Badge/index.js +31 -0
  186. package/dist/components/MultiSelect/Badge/styles.d.ts +1 -0
  187. package/dist/components/MultiSelect/Badge/styles.js +57 -0
  188. package/dist/components/MultiSelect/MultiSelect.stories.d.ts +61 -0
  189. package/dist/components/MultiSelect/MultiSelect.stories.js +336 -0
  190. package/dist/components/MultiSelect/MultiSelectList/index.d.ts +10 -0
  191. package/dist/components/MultiSelect/MultiSelectList/index.js +59 -0
  192. package/dist/components/MultiSelect/MultiSelectList/style.d.ts +3 -0
  193. package/dist/components/MultiSelect/MultiSelectList/style.js +82 -0
  194. package/dist/components/MultiSelect/calcTextSize.d.ts +1 -0
  195. package/dist/components/MultiSelect/calcTextSize.js +10 -0
  196. package/dist/components/MultiSelect/index.d.ts +24 -0
  197. package/dist/components/MultiSelect/index.js +284 -0
  198. package/dist/components/MultiSelect/styles.d.ts +24 -0
  199. package/dist/components/MultiSelect/styles.js +165 -0
  200. package/dist/components/Radio/Radio.stories.d.ts +18 -0
  201. package/dist/components/Radio/Radio.stories.js +30 -0
  202. package/dist/components/Radio/index.d.ts +7 -0
  203. package/dist/components/Radio/index.js +27 -0
  204. package/dist/components/Radio/story.d.ts +5 -0
  205. package/dist/components/Radio/story.js +47 -0
  206. package/dist/components/Radio/styles.d.ts +8 -0
  207. package/dist/components/Radio/styles.js +43 -0
  208. package/dist/components/StateAlert/StateAlert.stories.d.ts +46 -0
  209. package/dist/components/StateAlert/StateAlert.stories.js +189 -0
  210. package/dist/components/StateAlert/index.d.ts +22 -0
  211. package/dist/components/StateAlert/index.js +56 -0
  212. package/dist/components/StateAlert/styles.d.ts +7 -0
  213. package/dist/components/StateAlert/styles.js +124 -0
  214. package/dist/components/Switch/Switch.stories.d.ts +26 -0
  215. package/dist/components/Switch/Switch.stories.js +81 -0
  216. package/dist/components/Switch/index.d.ts +8 -0
  217. package/dist/components/Switch/index.js +26 -0
  218. package/dist/components/Switch/styles.d.ts +15 -0
  219. package/dist/components/Switch/styles.js +33 -0
  220. package/dist/components/Text/Paragraph/Paragraph.stories.d.ts +29 -0
  221. package/dist/components/Text/Paragraph/Paragraph.stories.js +124 -0
  222. package/dist/components/Text/Title/Title.stories.d.ts +41 -0
  223. package/dist/components/Text/Title/Title.stories.js +106 -0
  224. package/dist/components/Text/index.d.ts +3 -0
  225. package/dist/components/Text/index.js +17 -0
  226. package/dist/components/Text/styles.d.ts +23 -0
  227. package/dist/components/Text/styles.js +70 -0
  228. package/dist/components/TextArea/Textarea.stories.d.ts +33 -0
  229. package/dist/components/TextArea/Textarea.stories.js +65 -0
  230. package/dist/components/TextArea/index.d.ts +10 -0
  231. package/dist/components/TextArea/index.js +39 -0
  232. package/dist/components/TextArea/styles.d.ts +18 -0
  233. package/dist/components/TextArea/styles.js +88 -0
  234. package/dist/components/TooltipWrapper/Tooltip.stories.d.ts +21 -0
  235. package/dist/components/TooltipWrapper/Tooltip.stories.js +54 -0
  236. package/dist/components/TooltipWrapper/index.d.ts +20 -0
  237. package/dist/components/TooltipWrapper/index.js +56 -0
  238. package/dist/components/TooltipWrapper/styles.d.ts +6 -0
  239. package/dist/components/TooltipWrapper/styles.js +20 -0
  240. package/dist/components/Tooltips/Tooltips.stories.d.ts +25 -0
  241. package/dist/components/Tooltips/Tooltips.stories.js +139 -0
  242. package/dist/components/Tooltips/index.d.ts +8 -0
  243. package/dist/components/Tooltips/index.js +28 -0
  244. package/dist/components/Tooltips/styles.d.ts +5 -0
  245. package/dist/components/Tooltips/styles.js +37 -0
  246. package/dist/components/UserMenu/UserMenu.stories.d.ts +26 -0
  247. package/dist/components/UserMenu/UserMenu.stories.js +174 -0
  248. package/dist/components/UserMenu/index.d.ts +19 -0
  249. package/dist/components/UserMenu/index.js +64 -0
  250. package/dist/components/UserMenu/style.d.ts +2 -0
  251. package/dist/components/UserMenu/style.js +44 -0
  252. package/dist/index.d.ts +3 -0
  253. package/dist/index.js +3 -0
  254. package/dist/static/image/cover.png +0 -0
  255. package/dist/static/image/how-to-use.gif +0 -0
  256. package/dist/static/image/map-sample.png +0 -0
  257. package/dist/static/image/photo-goes-here.png +0 -0
  258. package/dist/static/image/travolta.jpg +0 -0
  259. package/dist/static/svg/Group.svg +5 -0
  260. package/dist/static/svg/chat.svg +10 -0
  261. package/dist/static/svg/colored-item.svg +9 -0
  262. package/dist/static/svg/mailbox-bro.svg +102 -0
  263. package/dist/static/svg/star-favorite.svg +3 -0
  264. package/dist/style/_reset.css +205 -0
  265. package/package.json +43 -0
@@ -0,0 +1,95 @@
1
+ import styled_components from "styled-components";
2
+ import { COLOR_ACCENT_DARK, COLOR_ACCENT_MEDIUM, COLOR_NEUTRAL_DARKER, COLOR_NEUTRAL_DAY, COLOR_NEUTRAL_DUSK, COLOR_NEUTRAL_LIGHTER, FONT_FAMILY_01, FONT_WEIGHT_MEDIUM } from "@ftdata/f-tokens";
3
+ const SelectDropdown = styled_components.div`
4
+ background-color: ${COLOR_NEUTRAL_DAY};
5
+ border-radius: 0.25rem;
6
+ box-shadow: 0px 2px 4px rgba(107, 117, 124, 0.32);
7
+ color: ${COLOR_NEUTRAL_DUSK};
8
+ position: absolute;
9
+ top: calc(100% + 0.5rem);
10
+ width: 100%;
11
+ height: auto;
12
+ z-index: 3;
13
+
14
+ .action {
15
+ span {
16
+ font-weight: 600;
17
+ color: ${COLOR_ACCENT_MEDIUM};
18
+ }
19
+
20
+ &:hover {
21
+ span {
22
+ color: ${COLOR_ACCENT_MEDIUM};
23
+ }
24
+ }
25
+ }
26
+
27
+ & > div {
28
+ border-radius: 0.25rem;
29
+ }
30
+
31
+ & > div > div {
32
+ border-radius: 0.25rem;
33
+ }
34
+
35
+ *::-webkit-scrollbar-track {
36
+ background-color: #f4f4f4;
37
+ border-radius: 0 0.25rem 0.25rem 0;
38
+ }
39
+
40
+ *::-webkit-scrollbar {
41
+ width: 10px;
42
+ background: #f4f4f4;
43
+ border-radius: 0 0.25rem 0.25rem 0;
44
+ }
45
+
46
+ *::-webkit-scrollbar-thumb {
47
+ border-radius: 10px;
48
+ background: #d5d8da;
49
+ }
50
+ `;
51
+ const OptionContainer = styled_components.div`
52
+ background-color: ${({ isSelected })=>isSelected ? COLOR_NEUTRAL_LIGHTER : COLOR_NEUTRAL_DAY};
53
+ box-sizing: border-box;
54
+ cursor: pointer;
55
+ display: flex;
56
+ gap: 0.5rem;
57
+ padding: 0.5rem 1rem;
58
+ width: 100%;
59
+
60
+ &:hover {
61
+ background-color: ${COLOR_NEUTRAL_LIGHTER};
62
+
63
+ span {
64
+ color: ${COLOR_NEUTRAL_DUSK};
65
+ }
66
+ }
67
+
68
+ span {
69
+ color: ${({ isSelected })=>isSelected ? COLOR_NEUTRAL_DUSK : COLOR_NEUTRAL_DARKER};
70
+ font-size: 0.875rem;
71
+ line-height: 1.25rem;
72
+ font-family: ${FONT_FAMILY_01};
73
+ font-weight: ${FONT_WEIGHT_MEDIUM};
74
+ white-space: nowrap;
75
+ overflow: hidden;
76
+ text-overflow: ellipsis;
77
+ position: relative;
78
+ }
79
+ `;
80
+ const LoadingContainer = styled_components.div`
81
+ background-color: ${COLOR_NEUTRAL_DAY};
82
+ height: 10rem;
83
+ width: 100%;
84
+ `;
85
+ const CustomAction = styled_components(OptionContainer)`
86
+ color: ${COLOR_ACCENT_MEDIUM};
87
+ font-weight: 500;
88
+ margin-bottom: 8px;
89
+
90
+ &:hover {
91
+ background-color: ${COLOR_NEUTRAL_DAY};
92
+ color: ${COLOR_ACCENT_DARK};
93
+ }
94
+ `;
95
+ export { CustomAction, LoadingContainer, OptionContainer, SelectDropdown };
@@ -0,0 +1,30 @@
1
+ import React, { InputHTMLAttributes, JSX } from "react";
2
+ export interface ICustomSelectOption {
3
+ label: string;
4
+ value: string;
5
+ chip?: JSX.Element;
6
+ action?: () => void;
7
+ }
8
+ export interface IAction {
9
+ label: string;
10
+ action: () => void;
11
+ }
12
+ export interface CustomSelectProps extends InputHTMLAttributes<HTMLInputElement> {
13
+ t: (key: string) => string;
14
+ helpText?: string;
15
+ isError?: boolean;
16
+ isSuccess?: boolean;
17
+ label?: string;
18
+ isRequired?: boolean;
19
+ name?: string;
20
+ options: ICustomSelectOption[] | [];
21
+ placeholder?: string;
22
+ search?: (query: string) => void;
23
+ isLoading?: boolean;
24
+ icon?: JSX.Element;
25
+ variation?: "default" | "searchable";
26
+ selected: ICustomSelectOption | null;
27
+ setSelected: React.Dispatch<React.SetStateAction<ICustomSelectOption | null>>;
28
+ }
29
+ export default function CustomSelect({ helpText, isError, isSuccess, label, name, isRequired, options, placeholder, icon, isLoading, search, t, variation, selected, setSelected, ...rest }: CustomSelectProps): import("react/jsx-runtime").JSX.Element;
30
+ export declare const normalizeOptions: (options: ICustomSelectOption[]) => ICustomSelectOption[];
@@ -0,0 +1,193 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from "react";
3
+ import { CavetButton, HelpText, IconContainer, InputWrapper, SelectContainer, StyledInput, StyledLabel } from "./styles.js";
4
+ import { Icon } from "@ftdata/f-icons";
5
+ import CustomSelectList from "./CustomSelectList/index.js";
6
+ function CustomSelect({ helpText, isError, isSuccess, label, name, isRequired, options, placeholder, icon, isLoading, search, t, variation = "default", selected, setSelected, ...rest }) {
7
+ const [showList, setShowList] = useState(false);
8
+ const [currentValue, setCurrentValue] = useState("");
9
+ const [filtered, setFiltered] = useState([]);
10
+ const inputRef = useRef(null);
11
+ const cavetRef = useRef(null);
12
+ const selectRef = useRef(null);
13
+ const { readOnly, disabled } = rest;
14
+ const notFound = {
15
+ value: "",
16
+ label: t("no_data_was_found")
17
+ };
18
+ const empty = {
19
+ value: "",
20
+ label: t("no_data_is_available")
21
+ };
22
+ const computedOptions = ()=>{
23
+ if (0 === options.length) return [
24
+ empty
25
+ ];
26
+ if (filtered.length) return filtered;
27
+ return options;
28
+ };
29
+ const handleClickOutside = (event)=>{
30
+ if (selectRef.current && selectRef.current.contains(event.target)) return;
31
+ setShowList(false);
32
+ };
33
+ const handleClick = (event)=>{
34
+ if (cavetRef.current) {
35
+ if (cavetRef.current === event.target) return;
36
+ }
37
+ if (disabled || readOnly) return;
38
+ setShowList((prev)=>!prev);
39
+ if (!inputRef.current) return;
40
+ inputRef.current.focus();
41
+ };
42
+ const handleClickCavet = (event)=>{
43
+ if (cavetRef.current) {
44
+ if (cavetRef.current !== event.target) return;
45
+ }
46
+ if (disabled || readOnly) return;
47
+ setShowList((prev)=>!prev);
48
+ if (!inputRef.current) return;
49
+ inputRef.current.focus();
50
+ };
51
+ const handleClickOption = (event, option)=>{
52
+ event.stopPropagation();
53
+ setSelected(option);
54
+ setCurrentValue(option.label);
55
+ setFiltered([]);
56
+ setShowList(false);
57
+ if (inputRef.current) inputRef.current.blur();
58
+ };
59
+ const filter = (query)=>{
60
+ if (!query) return void setFiltered([]);
61
+ const valueNormalized = query.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "");
62
+ const newFiltered = options.filter((option)=>{
63
+ const labelNormalized = option.label.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "");
64
+ return labelNormalized.includes(valueNormalized);
65
+ });
66
+ if (newFiltered.length > 0) return void setFiltered(newFiltered);
67
+ setFiltered([
68
+ notFound
69
+ ]);
70
+ };
71
+ const handleChange = (event)=>{
72
+ setShowList(true);
73
+ if (selected) setSelected(null);
74
+ const query = event.target.value;
75
+ if ("searchable" === variation) {
76
+ if (search) search(query);
77
+ filter(query);
78
+ }
79
+ setCurrentValue(query);
80
+ };
81
+ const addSelectedByEnter = (option)=>{
82
+ setFiltered([]);
83
+ setShowList(false);
84
+ setSelected(option);
85
+ };
86
+ const handleKeyDown = (event)=>{
87
+ if ("Enter" === event.key) {
88
+ if (filtered.length > 0) return void addSelectedByEnter(filtered[0]);
89
+ if (options.length > 0) return void addSelectedByEnter(options[0]);
90
+ }
91
+ };
92
+ useEffect(()=>{
93
+ if (!selected) return void setCurrentValue("");
94
+ setCurrentValue(selected.label);
95
+ }, [
96
+ selected
97
+ ]);
98
+ useEffect(()=>{
99
+ if (showList) document.addEventListener("click", handleClickOutside, true);
100
+ return ()=>{
101
+ document.removeEventListener("click", handleClickOutside, true);
102
+ };
103
+ }, [
104
+ showList
105
+ ]);
106
+ const handleCustomAction = (action)=>{
107
+ setSelected(null);
108
+ setCurrentValue("");
109
+ action();
110
+ };
111
+ useEffect(()=>{
112
+ if (filtered.length) setSelected(null);
113
+ }, [
114
+ filtered
115
+ ]);
116
+ return /*#__PURE__*/ jsxs(SelectContainer, {
117
+ onClick: handleClick,
118
+ ref: selectRef,
119
+ children: [
120
+ /*#__PURE__*/ jsxs(StyledLabel, {
121
+ htmlFor: name,
122
+ isRequired: isRequired,
123
+ children: [
124
+ label,
125
+ isRequired && /*#__PURE__*/ jsx("span", {
126
+ children: "*"
127
+ })
128
+ ]
129
+ }),
130
+ /*#__PURE__*/ jsxs(InputWrapper, {
131
+ children: [
132
+ /*#__PURE__*/ jsx(IconContainer, {
133
+ children: icon
134
+ }),
135
+ /*#__PURE__*/ jsx(StyledInput, {
136
+ ref: inputRef,
137
+ placeholder: placeholder,
138
+ name: name,
139
+ disabled: disabled,
140
+ required: isRequired,
141
+ value: currentValue,
142
+ onChange: handleChange,
143
+ icon: icon,
144
+ isError: isError,
145
+ isSuccess: isSuccess,
146
+ variation: variation,
147
+ onKeyDown: handleKeyDown,
148
+ readOnly: readOnly ? readOnly : "default" === variation,
149
+ ...rest
150
+ }),
151
+ /*#__PURE__*/ jsx(CavetButton, {
152
+ onClick: handleClickCavet,
153
+ isListOpen: showList,
154
+ ref: cavetRef,
155
+ children: /*#__PURE__*/ jsx(Icon, {
156
+ name: "arw caret-down",
157
+ color: "currentColor",
158
+ size: "1.5rem"
159
+ })
160
+ }),
161
+ showList && /*#__PURE__*/ jsx(CustomSelectList, {
162
+ options: computedOptions() || [
163
+ notFound
164
+ ],
165
+ onClickOption: options.length ? handleClickOption : ()=>null,
166
+ selectedOption: selected,
167
+ isLoading: isLoading,
168
+ handleCustomAction: handleCustomAction
169
+ })
170
+ ]
171
+ }),
172
+ helpText && /*#__PURE__*/ jsxs(HelpText, {
173
+ isError: isError,
174
+ isSuccess: isSuccess,
175
+ children: [
176
+ isError && /*#__PURE__*/ jsx(Icon, {
177
+ name: "ui warning-circle",
178
+ size: "1rem",
179
+ color: "currentColor"
180
+ }),
181
+ /*#__PURE__*/ jsx("span", {
182
+ children: helpText
183
+ })
184
+ ]
185
+ })
186
+ ]
187
+ });
188
+ }
189
+ const normalizeOptions = (options)=>{
190
+ const newOptions = options ? options.filter((option)=>option && option.label && option.value) : [];
191
+ return newOptions;
192
+ };
193
+ export { CustomSelect as default, normalizeOptions };
@@ -0,0 +1,22 @@
1
+ import { CustomSelectProps } from ".";
2
+ interface CustomSelect {
3
+ isError?: boolean;
4
+ isSuccess?: boolean;
5
+ isRequired?: boolean;
6
+ }
7
+ export declare const SelectContainer: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;
8
+ export declare const StyledLabel: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").LabelHTMLAttributes<HTMLLabelElement>, HTMLLabelElement>, CustomSelect>> & string;
9
+ export declare const InputWrapper: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;
10
+ export declare const IconContainer: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;
11
+ interface CavetButtonProps {
12
+ isListOpen: boolean;
13
+ }
14
+ export declare const CavetButton: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, CavetButtonProps>> & string;
15
+ interface StyledInputProps extends Partial<Omit<CustomSelectProps, "t" | "options">> {
16
+ t?: () => void;
17
+ options?: [];
18
+ }
19
+ export declare const StyledInput: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>, StyledInputProps>> & string;
20
+ export declare const HelpText: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, CustomSelect>> & string;
21
+ export declare const ChipExemple: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;
22
+ export {};
@@ -0,0 +1,93 @@
1
+ import styled_components from "styled-components";
2
+ import { COLOR_ACCENT_MEDIUM, COLOR_DANGER_MEDIUM, COLOR_NEUTRAL_DARK, COLOR_NEUTRAL_DARKER, COLOR_NEUTRAL_DAY, COLOR_NEUTRAL_DUSK, COLOR_NEUTRAL_MEDIUM, COLOR_SUCCESS_MEDIUM, FONT_WEIGHT_BOLD, FONT_WEIGHT_MEDIUM } from "@ftdata/f-tokens";
3
+ const SelectContainer = styled_components.div`
4
+ display: flex;
5
+ flex-direction: column;
6
+ `;
7
+ const StyledLabel = styled_components.label`
8
+ color: ${COLOR_NEUTRAL_DUSK};
9
+ display: flex;
10
+ font-size: 0.875rem;
11
+ font-weight: ${FONT_WEIGHT_BOLD};
12
+ line-height: 1rem;
13
+ margin-bottom: 0.5rem;
14
+
15
+ span {
16
+ color: ${COLOR_DANGER_MEDIUM};
17
+ }
18
+ `;
19
+ const InputWrapper = styled_components.div`
20
+ position: relative;
21
+ width: 100%;
22
+ `;
23
+ const IconContainer = styled_components.div`
24
+ left: 1rem;
25
+ position: absolute;
26
+ top: 0.5rem;
27
+ `;
28
+ const CavetButton = styled_components.button`
29
+ align-items: center;
30
+ color: ${COLOR_NEUTRAL_DARKER};
31
+ display: flex;
32
+ justify-content: center;
33
+ position: absolute;
34
+ height: 1.5rem;
35
+ right: 0.5rem;
36
+ top: 0.5rem;
37
+ width: 1.5rem;
38
+
39
+ svg {
40
+ transform: ${({ isListOpen })=>isListOpen ? "rotate(180deg)" : "none"};
41
+ }
42
+ `;
43
+ const StyledInput = styled_components.input`
44
+ border-radius: 0.25rem;
45
+ box-shadow: 0px 0px 0px 1px
46
+ ${({ isError, isSuccess })=>isError ? COLOR_DANGER_MEDIUM : isSuccess ? COLOR_SUCCESS_MEDIUM : COLOR_NEUTRAL_MEDIUM};
47
+ color: ${COLOR_NEUTRAL_DUSK};
48
+ cursor: ${({ variation })=>"default" === variation ? "pointer" : "insert"};
49
+ font-weight: ${FONT_WEIGHT_MEDIUM};
50
+ padding: ${({ icon })=>icon ? "0.5rem 2.5rem 0.5rem 3rem" : "0.5rem 2.5rem 0.5rem 1rem"};
51
+ outline: none;
52
+ width: 100%;
53
+ ${({ variation })=>"default" === variation && "pointer-events: none;"}
54
+ ${({ variation })=>"default" === variation && "user-select: none;"}
55
+ ${({ variation })=>"default" === variation && "cursor: pointer;"}
56
+
57
+ &::placeholder {
58
+ color: ${COLOR_NEUTRAL_MEDIUM};
59
+ font-size: 1rem;
60
+ line-height: 1.5rem;
61
+ }
62
+
63
+ &:focus {
64
+ box-shadow: 0px 0px 0px 2px ${COLOR_NEUTRAL_DARK};
65
+ }
66
+ `;
67
+ const HelpText = styled_components.div`
68
+ color: ${({ isError, isSuccess })=>isError ? COLOR_DANGER_MEDIUM : isSuccess ? COLOR_SUCCESS_MEDIUM : COLOR_NEUTRAL_DARK};
69
+ display: flex;
70
+ gap: 0.25rem;
71
+ margin-top: 0.5rem;
72
+
73
+ span {
74
+ font-size: 0.875rem;
75
+ line-height: 1rem;
76
+ font-weight: ${FONT_WEIGHT_MEDIUM};
77
+ }
78
+ `;
79
+ const ChipExemple = styled_components.div`
80
+ align-items: center;
81
+ background-color: ${COLOR_ACCENT_MEDIUM};
82
+ border-radius: 1rem;
83
+ color: ${COLOR_NEUTRAL_DAY};
84
+ display: flex;
85
+ font-size: 0.75rem;
86
+ font-weight: ${FONT_WEIGHT_BOLD};
87
+ height: 1.25rem;
88
+ line-height: 1.25rem;
89
+ padding: 0 0.375rem;
90
+ /* position: absolute; // se quiser que fique fixo no fim
91
+ left: 0.5rem; // se quiser que fique fixo no fim */
92
+ `;
93
+ export { CavetButton, ChipExemple, HelpText, IconContainer, InputWrapper, SelectContainer, StyledInput, StyledLabel };
@@ -0,0 +1,13 @@
1
+ import { Meta, StoryObj } from "@storybook/react";
2
+ import FilterList from ".";
3
+ /**
4
+ * DoubleList exibe duas listas separadas, permitindo ao usuário visualizar diferentes itens simultaneamente.
5
+
6
+ */
7
+ declare const meta: Meta<typeof FilterList>;
8
+ export default meta;
9
+ type Story = StoryObj<typeof meta>;
10
+ /**
11
+ * Variação da lista com apenas apenas propriedeades essenciais.
12
+ */
13
+ export declare const Default: Story;
@@ -0,0 +1,82 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import index from "./index.js";
3
+ const meta = {
4
+ title: "DESIGN COMPONENTS/FilterList",
5
+ component: index,
6
+ tags: [
7
+ "autodocs"
8
+ ],
9
+ decorators: [
10
+ (Story)=>/*#__PURE__*/ jsx("div", {
11
+ style: {
12
+ background: "#fff",
13
+ width: "32rem",
14
+ borderRadius: "0.5rem",
15
+ display: "flex",
16
+ justifyContent: "center",
17
+ alignItems: "center",
18
+ padding: "1rem"
19
+ },
20
+ children: /*#__PURE__*/ jsx(Story, {})
21
+ })
22
+ ],
23
+ parameters: {
24
+ layout: "centered"
25
+ },
26
+ argTypes: {
27
+ total: {
28
+ description: "Recebe a quantidade total de intens."
29
+ },
30
+ options: {
31
+ description: "Recebe um Array de strings que ser\xe3o renderizadas nas listas."
32
+ },
33
+ listHeight: {
34
+ description: "Define a quantidade de op\xe7\xf5es que aparecem por vez nas listas."
35
+ },
36
+ title: {
37
+ description: "Define o titulo acima do componente."
38
+ },
39
+ selected: {
40
+ description: "Define a quantidade que foi selecionada."
41
+ }
42
+ }
43
+ };
44
+ const DoubleList_stories = meta;
45
+ const placas = [
46
+ "XJZ874",
47
+ "TRK951",
48
+ "LMP230",
49
+ "QWV615",
50
+ "BNC472",
51
+ "DFT389",
52
+ "GHR526",
53
+ "VXZ731",
54
+ "JFK198",
55
+ "MNL543",
56
+ "ZXC741",
57
+ "PLM852",
58
+ "QWE963",
59
+ "TYU357",
60
+ "BNM147",
61
+ "ASD951",
62
+ "GHJ635",
63
+ "XCV284",
64
+ "LKJ578",
65
+ "POI963",
66
+ "MNB753",
67
+ "WER852",
68
+ "OIU246",
69
+ "YTR159",
70
+ "ZXA6345",
71
+ "QWERTY",
72
+ "PLACAEXEMPLO",
73
+ "EXEMPLO123",
74
+ "TESTEPLACAGRANDETESTEPLACAGRANDETESTEPLACAGRANDE",
75
+ "AB"
76
+ ];
77
+ const Default = {
78
+ args: {
79
+ options: placas
80
+ }
81
+ };
82
+ export { Default, DoubleList_stories as default };
@@ -0,0 +1,9 @@
1
+ interface DoubleList {
2
+ options: string[];
3
+ listHeight?: number;
4
+ title: string;
5
+ selected?: number;
6
+ total?: number;
7
+ }
8
+ export default function DoubleList({ options, listHeight, title, selected, total, ...rest }: DoubleList): import("react/jsx-runtime").JSX.Element;
9
+ export {};
@@ -0,0 +1,70 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { FixedSizeList } from "react-window";
3
+ import { DoubleListContainer, HeadingContainer, ListContainer, ListsContainer, OptionContainer } from "./style.js";
4
+ const renderRow = ({ data, index, style })=>{
5
+ const label = data[index];
6
+ return /*#__PURE__*/ jsx(OptionContainer, {
7
+ style: style,
8
+ children: /*#__PURE__*/ jsx("span", {
9
+ children: label
10
+ })
11
+ });
12
+ };
13
+ function DoubleList({ options, listHeight = 5, title, selected, total, ...rest }) {
14
+ const OPTION_SIZE = 36;
15
+ const height = listHeight * OPTION_SIZE;
16
+ const halfIndex = Math.ceil(options.length / 2);
17
+ const firstHalf = options.slice(0, halfIndex);
18
+ const secondHalf = options.slice(halfIndex);
19
+ const showSelected = void 0 !== selected && void 0 !== total;
20
+ return /*#__PURE__*/ jsxs(DoubleListContainer, {
21
+ ...rest,
22
+ children: [
23
+ /*#__PURE__*/ jsxs(HeadingContainer, {
24
+ children: [
25
+ /*#__PURE__*/ jsx("h3", {
26
+ children: title
27
+ }),
28
+ showSelected && /*#__PURE__*/ jsx("span", {
29
+ children: `${selected}/${total}`
30
+ })
31
+ ]
32
+ }),
33
+ /*#__PURE__*/ jsxs(ListsContainer, {
34
+ children: [
35
+ /*#__PURE__*/ jsx(ListContainer, {
36
+ children: /*#__PURE__*/ jsx(FixedSizeList, {
37
+ itemCount: firstHalf.length,
38
+ itemData: firstHalf,
39
+ itemSize: 36,
40
+ height: height,
41
+ width: "100%",
42
+ itemKey: (index)=>options[index] || index,
43
+ children: ({ index, style, data })=>renderRow({
44
+ data,
45
+ index,
46
+ style
47
+ })
48
+ })
49
+ }),
50
+ /*#__PURE__*/ jsx(ListContainer, {
51
+ children: /*#__PURE__*/ jsx(FixedSizeList, {
52
+ itemCount: secondHalf.length,
53
+ itemData: secondHalf,
54
+ itemSize: 36,
55
+ height: height,
56
+ width: "100%",
57
+ itemKey: (index)=>options[index] || index,
58
+ children: ({ index, style, data })=>renderRow({
59
+ data,
60
+ index,
61
+ style
62
+ })
63
+ })
64
+ })
65
+ ]
66
+ })
67
+ ]
68
+ });
69
+ }
70
+ export { DoubleList as default };
@@ -0,0 +1,5 @@
1
+ export declare const DoubleListContainer: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;
2
+ export declare const HeadingContainer: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;
3
+ export declare const ListsContainer: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;
4
+ export declare const ListContainer: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;
5
+ export declare const OptionContainer: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;