@ftdata/ui 0.0.9 → 0.0.10

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 (84) hide show
  1. package/dist/components/DoubleList/DoubleList.stories.d.ts +2 -2
  2. package/dist/components/DoubleList/DoubleList.stories.js +43 -43
  3. package/dist/components/DoubleList/Row/index.d.ts +4 -0
  4. package/dist/components/DoubleList/Row/index.js +12 -0
  5. package/dist/components/DoubleList/Row/style.d.ts +1 -0
  6. package/dist/components/DoubleList/Row/style.js +31 -0
  7. package/dist/components/DoubleList/index.js +27 -35
  8. package/dist/components/DoubleList/style.d.ts +0 -1
  9. package/dist/components/DoubleList/style.js +2 -31
  10. package/dist/components/Menu/Menu.stories.d.ts +6 -0
  11. package/dist/components/Menu/Menu.stories.js +116 -0
  12. package/dist/components/Menu/index.js +29 -14
  13. package/dist/components/Menu/styles.d.ts +1 -0
  14. package/dist/components/Menu/styles.js +44 -28
  15. package/dist/components/MultiSelect/MultiSelectList/Row/index.d.ts +7 -0
  16. package/dist/components/MultiSelect/MultiSelectList/Row/index.js +26 -0
  17. package/dist/components/MultiSelect/MultiSelectList/Row/style.d.ts +6 -0
  18. package/dist/components/MultiSelect/MultiSelectList/Row/style.js +48 -0
  19. package/dist/components/MultiSelect/MultiSelectList/index.d.ts +4 -3
  20. package/dist/components/MultiSelect/MultiSelectList/index.js +51 -41
  21. package/dist/components/MultiSelect/MultiSelectList/style.d.ts +0 -1
  22. package/dist/components/MultiSelect/MultiSelectList/style.js +2 -31
  23. package/dist/components/MultiSelect/helpers/addOption.d.ts +5 -0
  24. package/dist/components/MultiSelect/helpers/addOption.js +14 -0
  25. package/dist/components/MultiSelect/helpers/computeUnselected.d.ts +2 -0
  26. package/dist/components/MultiSelect/helpers/computeUnselected.js +2 -0
  27. package/dist/components/MultiSelect/helpers/feedbackText.d.ts +5 -0
  28. package/dist/components/MultiSelect/helpers/feedbackText.js +30 -0
  29. package/dist/components/MultiSelect/helpers/filterOptions.d.ts +2 -0
  30. package/dist/components/MultiSelect/helpers/filterOptions.js +5 -0
  31. package/dist/components/MultiSelect/helpers/removeOptions.d.ts +5 -0
  32. package/dist/components/MultiSelect/helpers/removeOptions.js +9 -0
  33. package/dist/components/MultiSelect/index.d.ts +29 -14
  34. package/dist/components/MultiSelect/index.js +149 -215
  35. package/dist/components/MultiSelect/styles.d.ts +6 -5
  36. package/dist/components/MultiSelect/styles.js +20 -66
  37. package/dist/components/Select/List/Row/index.d.ts +11 -0
  38. package/dist/components/Select/List/Row/index.js +29 -0
  39. package/dist/components/{CustomSelect/CustomSelectList → Select/List/Row}/style.d.ts +0 -2
  40. package/dist/components/{CustomSelect/CustomSelectList → Select/List/Row}/style.js +1 -54
  41. package/dist/components/Select/List/index.d.ts +12 -0
  42. package/dist/components/Select/List/index.js +63 -0
  43. package/dist/components/Select/List/style.d.ts +2 -0
  44. package/dist/components/Select/List/style.js +56 -0
  45. package/dist/components/Select/index.d.ts +34 -0
  46. package/dist/components/{CustomSelect → Select}/index.js +11 -9
  47. package/dist/components/{CustomSelect → Select}/styles.d.ts +2 -2
  48. package/dist/components/{CustomSelect → Select}/styles.js +6 -8
  49. package/dist/components/fields/components/HelpText/index.d.ts +8 -0
  50. package/dist/components/fields/components/HelpText/index.js +35 -0
  51. package/dist/components/fields/components/HelpText/modifiers/colors.d.ts +4 -0
  52. package/dist/components/fields/components/HelpText/modifiers/colors.js +9 -0
  53. package/dist/components/fields/components/HelpText/styles.d.ts +2 -0
  54. package/dist/components/fields/components/HelpText/styles.js +19 -0
  55. package/dist/components/fields/components/Label/index.d.ts +8 -0
  56. package/dist/components/fields/components/Label/index.js +22 -0
  57. package/dist/components/fields/components/Label/styles.d.ts +5 -0
  58. package/dist/components/fields/components/Label/styles.js +28 -0
  59. package/dist/components/fields/components/RotateButton/index.d.ts +6 -0
  60. package/dist/components/fields/components/RotateButton/index.js +13 -0
  61. package/dist/components/fields/components/RotateButton/styles.d.ts +5 -0
  62. package/dist/components/fields/components/RotateButton/styles.js +10 -0
  63. package/dist/components/fields/helpers/getFeedbackType.d.ts +2 -0
  64. package/dist/components/fields/helpers/getFeedbackType.js +11 -0
  65. package/dist/components/fields/modifiers/color_modifiers.d.ts +2 -0
  66. package/dist/components/fields/modifiers/color_modifiers.js +7 -0
  67. package/dist/components/fields/modifiers/inputColorModifier.d.ts +2 -0
  68. package/dist/components/fields/modifiers/inputColorModifier.js +14 -0
  69. package/dist/components/fields/modifiers/selectColorModifier.d.ts +2 -0
  70. package/dist/components/fields/modifiers/selectColorModifier.js +10 -0
  71. package/dist/index.d.ts +2 -2
  72. package/dist/index.js +2 -2
  73. package/dist/style/base.css +2 -3
  74. package/dist/types/feedback.d.ts +1 -0
  75. package/package.json +2 -2
  76. package/dist/components/CustomSelect/CustomSelect.stories.d.ts +0 -73
  77. package/dist/components/CustomSelect/CustomSelect.stories.js +0 -477
  78. package/dist/components/CustomSelect/CustomSelectList/index.d.ts +0 -10
  79. package/dist/components/CustomSelect/CustomSelectList/index.js +0 -66
  80. package/dist/components/CustomSelect/index.d.ts +0 -30
  81. package/dist/components/MultiSelect/MultiSelect.stories.d.ts +0 -61
  82. package/dist/components/MultiSelect/MultiSelect.stories.js +0 -336
  83. /package/dist/components/MultiSelect/{calcTextSize.d.ts → helpers/calcTextSize.d.ts} +0 -0
  84. /package/dist/components/MultiSelect/{calcTextSize.js → helpers/calcTextSize.js} +0 -0
@@ -1,53 +1,5 @@
1
1
  import styled_components from "styled-components";
2
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
3
  const OptionContainer = styled_components.div`
52
4
  background-color: ${({ isSelected })=>isSelected ? COLOR_NEUTRAL_LIGHTER : COLOR_NEUTRAL_DAY};
53
5
  box-sizing: border-box;
@@ -77,11 +29,6 @@ const OptionContainer = styled_components.div`
77
29
  position: relative;
78
30
  }
79
31
  `;
80
- const LoadingContainer = styled_components.div`
81
- background-color: ${COLOR_NEUTRAL_DAY};
82
- height: 10rem;
83
- width: 100%;
84
- `;
85
32
  const CustomAction = styled_components(OptionContainer)`
86
33
  color: ${COLOR_ACCENT_MEDIUM};
87
34
  font-weight: 500;
@@ -92,4 +39,4 @@ const CustomAction = styled_components(OptionContainer)`
92
39
  color: ${COLOR_ACCENT_DARK};
93
40
  }
94
41
  `;
95
- export { CustomAction, LoadingContainer, OptionContainer, SelectDropdown };
42
+ export { CustomAction, OptionContainer };
@@ -0,0 +1,12 @@
1
+ import React from "react";
2
+ import { ISelectOption } from "..";
3
+ interface SelectListProps {
4
+ onClickOption?: (event: React.MouseEvent<HTMLDivElement>, option: ISelectOption) => void;
5
+ options: ISelectOption[];
6
+ selectedOption?: ISelectOption | null;
7
+ isLoading?: boolean;
8
+ handleCustomAction: (action: () => void) => void;
9
+ onLoadMore?: () => Promise<void>;
10
+ }
11
+ declare const SelectList: React.FC<SelectListProps>;
12
+ export default SelectList;
@@ -0,0 +1,63 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { useCallback, useState } from "react";
3
+ import { List } from "react-window";
4
+ import { LoadingContainer, SelectDropdown } from "./style.js";
5
+ import Loading from "../../Loading/index.js";
6
+ import { TooltipWrapper } from "../../TooltipWrapper/index.js";
7
+ import Row from "./Row/index.js";
8
+ const SelectList = ({ options, onClickOption, selectedOption, isLoading, onLoadMore, handleCustomAction })=>{
9
+ const [lastIndex, setLastIndex] = useState(0);
10
+ const [loadingMore, setLoadingMore] = useState(false);
11
+ const OPTION_SIZE = 36;
12
+ const optionLength = options.length;
13
+ const height = OPTION_SIZE * (0 === optionLength ? 1 : optionLength >= 7 ? 7 : optionLength);
14
+ const onItemsRendered = useCallback(async ({ stopIndex })=>{
15
+ const isAtEnd = stopIndex >= options.length - 1;
16
+ console.log(lastIndex, stopIndex, isAtEnd);
17
+ if (loadingMore) return;
18
+ try {
19
+ setLoadingMore(true);
20
+ if (lastIndex !== stopIndex && isAtEnd) {
21
+ if (onLoadMore) await onLoadMore();
22
+ setLastIndex(stopIndex);
23
+ }
24
+ } finally{
25
+ setLoadingMore(false);
26
+ }
27
+ }, [
28
+ options.length,
29
+ onLoadMore,
30
+ lastIndex
31
+ ]);
32
+ return /*#__PURE__*/ jsx(SelectDropdown, {
33
+ children: isLoading ? /*#__PURE__*/ jsx(LoadingContainer, {
34
+ children: /*#__PURE__*/ jsx(Loading, {
35
+ size: "lg",
36
+ variant: "light"
37
+ })
38
+ }) : /*#__PURE__*/ jsx(TooltipWrapper, {
39
+ spacing: 18,
40
+ children: ({ showTooltip, hideTooltip })=>/*#__PURE__*/ jsx(List, {
41
+ rowComponent: Row,
42
+ rowCount: options.length,
43
+ rowHeight: OPTION_SIZE,
44
+ rowProps: {
45
+ data: options,
46
+ onClickOption,
47
+ selectedOption,
48
+ showTooltip,
49
+ hideTooltip,
50
+ handleCustomAction
51
+ },
52
+ style: {
53
+ height: `${height / 16}rem`,
54
+ width: "100%"
55
+ },
56
+ onRowsRendered: onItemsRendered,
57
+ overscanCount: 0
58
+ })
59
+ })
60
+ });
61
+ };
62
+ const Select_List = SelectList;
63
+ export { Select_List as default };
@@ -0,0 +1,2 @@
1
+ export declare const SelectDropdown: 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 LoadingContainer: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;
@@ -0,0 +1,56 @@
1
+ import styled_components from "styled-components";
2
+ import { COLOR_ACCENT_MEDIUM, COLOR_NEUTRAL_DAY, COLOR_NEUTRAL_DUSK } 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 LoadingContainer = styled_components.div`
52
+ background-color: ${COLOR_NEUTRAL_DAY};
53
+ height: 10rem;
54
+ width: 100%;
55
+ `;
56
+ export { LoadingContainer, SelectDropdown };
@@ -0,0 +1,34 @@
1
+ import React, { InputHTMLAttributes, JSX } from "react";
2
+ export interface ISelectOption {
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
+ type InputPropsWithoutOnToggle = Omit<InputHTMLAttributes<HTMLInputElement>, "onToggle">;
13
+ export interface SelectProps extends InputPropsWithoutOnToggle {
14
+ t: (key: string) => string;
15
+ helpText?: string;
16
+ isError?: boolean;
17
+ isSuccess?: boolean;
18
+ label?: string;
19
+ isRequired?: boolean;
20
+ name?: string;
21
+ options: ISelectOption[] | [];
22
+ placeholder?: string;
23
+ search?: (query: string) => void;
24
+ isLoading?: boolean;
25
+ icon?: JSX.Element;
26
+ variation?: "default" | "searchable";
27
+ selected: ISelectOption | null;
28
+ setSelected: React.Dispatch<React.SetStateAction<ISelectOption | null>>;
29
+ onLoadMore?: () => Promise<void>;
30
+ onToggle?: (open: boolean) => void;
31
+ }
32
+ export default function Select({ helpText, isError, isSuccess, label, name, isRequired, options, placeholder, icon, isLoading, search, t, variation, selected, setSelected, onLoadMore, onToggle, ...rest }: SelectProps): import("react/jsx-runtime").JSX.Element;
33
+ export declare const normalizeOptions: (options: ISelectOption[]) => ISelectOption[];
34
+ export {};
@@ -2,8 +2,8 @@ import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { useEffect, useRef, useState } from "react";
3
3
  import { CavetButton, HelpText, IconContainer, InputWrapper, SelectContainer, StyledInput, StyledLabel } from "./styles.js";
4
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 }) {
5
+ import List from "./List/index.js";
6
+ function Select({ helpText, isError, isSuccess, label, name, isRequired, options, placeholder, icon, isLoading, search, t, variation = "default", selected, setSelected, onLoadMore, onToggle, ...rest }) {
7
7
  const [showList, setShowList] = useState(false);
8
8
  const [currentValue, setCurrentValue] = useState("");
9
9
  const [filtered, setFiltered] = useState([]);
@@ -69,14 +69,14 @@ function CustomSelect({ helpText, isError, isSuccess, label, name, isRequired, o
69
69
  ]);
70
70
  };
71
71
  const handleChange = (event)=>{
72
- setShowList(true);
73
- if (selected) setSelected(null);
74
72
  const query = event.target.value;
73
+ setCurrentValue(query);
74
+ setShowList(true);
75
75
  if ("searchable" === variation) {
76
76
  if (search) search(query);
77
- filter(query);
77
+ if (!search && !onLoadMore) filter(query);
78
78
  }
79
- setCurrentValue(query);
79
+ if (selected && "" === query.trim()) setSelected(null);
80
80
  };
81
81
  const addSelectedByEnter = (option)=>{
82
82
  setFiltered([]);
@@ -96,6 +96,7 @@ function CustomSelect({ helpText, isError, isSuccess, label, name, isRequired, o
96
96
  selected
97
97
  ]);
98
98
  useEffect(()=>{
99
+ if (onToggle) onToggle(showList);
99
100
  if (showList) document.addEventListener("click", handleClickOutside, true);
100
101
  return ()=>{
101
102
  document.removeEventListener("click", handleClickOutside, true);
@@ -158,14 +159,15 @@ function CustomSelect({ helpText, isError, isSuccess, label, name, isRequired, o
158
159
  size: "1.5rem"
159
160
  })
160
161
  }),
161
- showList && /*#__PURE__*/ jsx(CustomSelectList, {
162
+ showList && /*#__PURE__*/ jsx(List, {
162
163
  options: computedOptions() || [
163
164
  notFound
164
165
  ],
165
166
  onClickOption: options.length ? handleClickOption : ()=>null,
166
167
  selectedOption: selected,
167
168
  isLoading: isLoading,
168
- handleCustomAction: handleCustomAction
169
+ handleCustomAction: handleCustomAction,
170
+ onLoadMore: onLoadMore
169
171
  })
170
172
  ]
171
173
  }),
@@ -190,4 +192,4 @@ const normalizeOptions = (options)=>{
190
192
  const newOptions = options ? options.filter((option)=>option && option.label && option.value) : [];
191
193
  return newOptions;
192
194
  };
193
- export { CustomSelect as default, normalizeOptions };
195
+ export { Select as default, normalizeOptions };
@@ -1,4 +1,4 @@
1
- import { CustomSelectProps } from ".";
1
+ import { SelectProps } from ".";
2
2
  interface CustomSelect {
3
3
  isError?: boolean;
4
4
  isSuccess?: boolean;
@@ -12,7 +12,7 @@ interface CavetButtonProps {
12
12
  isListOpen: boolean;
13
13
  }
14
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">> {
15
+ interface StyledInputProps extends Partial<Omit<SelectProps, "t" | "options">> {
16
16
  t?: () => void;
17
17
  options?: [];
18
18
  }
@@ -1,5 +1,5 @@
1
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";
2
+ import { COLOR_ACCENT_MEDIUM, COLOR_DANGER_MEDIUM, COLOR_NEUTRAL_DARK, COLOR_NEUTRAL_DARKER, COLOR_NEUTRAL_DAY, COLOR_NEUTRAL_DUSK, COLOR_NEUTRAL_LIGHTER, COLOR_NEUTRAL_MEDIUM, COLOR_SUCCESS_MEDIUM, FONT_WEIGHT_BOLD, FONT_WEIGHT_MEDIUM } from "@ftdata/f-tokens";
3
3
  const SelectContainer = styled_components.div`
4
4
  display: flex;
5
5
  flex-direction: column;
@@ -35,20 +35,20 @@ const CavetButton = styled_components.button`
35
35
  right: 0.5rem;
36
36
  top: 0.5rem;
37
37
  width: 1.5rem;
38
-
39
- svg {
40
- transform: ${({ isListOpen })=>isListOpen ? "rotate(180deg)" : "none"};
41
- }
38
+ transition: all 0.15s ease-in-out;
39
+ transform: ${({ isListOpen })=>isListOpen ? "rotate(-180deg)" : "none"};
42
40
  `;
43
41
  const StyledInput = styled_components.input`
42
+ background-color: ${({ disabled })=>disabled ? COLOR_NEUTRAL_LIGHTER : COLOR_NEUTRAL_DAY};
44
43
  border-radius: 0.25rem;
45
44
  box-shadow: 0px 0px 0px 1px
46
45
  ${({ isError, isSuccess })=>isError ? COLOR_DANGER_MEDIUM : isSuccess ? COLOR_SUCCESS_MEDIUM : COLOR_NEUTRAL_MEDIUM};
47
46
  color: ${COLOR_NEUTRAL_DUSK};
48
- cursor: ${({ variation })=>"default" === variation ? "pointer" : "insert"};
47
+ cursor: ${({ variation, disabled })=>disabled ? "not-allowed" : "default" === variation ? "pointer" : "insert"};
49
48
  font-weight: ${FONT_WEIGHT_MEDIUM};
50
49
  padding: ${({ icon })=>icon ? "0.5rem 2.5rem 0.5rem 3rem" : "0.5rem 2.5rem 0.5rem 1rem"};
51
50
  outline: none;
51
+ opacity: ${({ disabled })=>disabled ? "0.5" : "1"};
52
52
  width: 100%;
53
53
  ${({ variation })=>"default" === variation && "pointer-events: none;"}
54
54
  ${({ variation })=>"default" === variation && "user-select: none;"}
@@ -87,7 +87,5 @@ const ChipExemple = styled_components.div`
87
87
  height: 1.25rem;
88
88
  line-height: 1.25rem;
89
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
90
  `;
93
91
  export { CavetButton, ChipExemple, HelpText, IconContainer, InputWrapper, SelectContainer, StyledInput, StyledLabel };
@@ -0,0 +1,8 @@
1
+ import { IconsNames } from "@ftdata/f-icons";
2
+ export type HelpTextFeedbackType = "danger" | "success" | "warning" | "info" | "disabled";
3
+ export interface HelpTextProps {
4
+ feedback?: HelpTextFeedbackType;
5
+ text: string;
6
+ icon?: IconsNames;
7
+ }
8
+ export default function HelpText({ feedback, text, icon }: HelpTextProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,35 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Icon } from "@ftdata/f-icons";
3
+ import { HelpTextContainer } from "./styles.js";
4
+ const DEFAULT_ICONS = {
5
+ danger: "ui info-information",
6
+ success: "ui done-check-checkmark",
7
+ warning: "ui warning-triangle"
8
+ };
9
+ const getFeedbackIcon = (feedback)=>{
10
+ if ("info" === feedback || "disabled" === feedback || !feedback) return;
11
+ return /*#__PURE__*/ jsx(Icon, {
12
+ name: DEFAULT_ICONS[feedback],
13
+ color: "currentColor",
14
+ size: "1rem",
15
+ weight: "2.5"
16
+ });
17
+ };
18
+ function HelpText({ feedback, text, icon }) {
19
+ return /*#__PURE__*/ jsxs(HelpTextContainer, {
20
+ feedback: feedback,
21
+ children: [
22
+ icon && /*#__PURE__*/ jsx(Icon, {
23
+ name: icon,
24
+ color: "currentColor",
25
+ size: "1rem"
26
+ }),
27
+ " ",
28
+ !icon && getFeedbackIcon(feedback),
29
+ /*#__PURE__*/ jsx("span", {
30
+ children: text
31
+ })
32
+ ]
33
+ });
34
+ }
35
+ export { HelpText as default };
@@ -0,0 +1,4 @@
1
+ import { HelpTextFeedbackType } from "..";
2
+ type HelpTextColorModifierType = Record<HelpTextFeedbackType, string>;
3
+ export declare const HELP_TEXT_COLOR_MODIFIER: HelpTextColorModifierType;
4
+ export {};
@@ -0,0 +1,9 @@
1
+ import { COLOR_DANGER_MEDIUM, COLOR_NEUTRAL_DUSK, COLOR_NEUTRAL_MEDIUM, COLOR_SUCCESS_MEDIUM, COLOR_WARNING_MEDIUM } from "@ftdata/f-tokens";
2
+ const HELP_TEXT_COLOR_MODIFIER = {
3
+ danger: COLOR_DANGER_MEDIUM,
4
+ warning: COLOR_WARNING_MEDIUM,
5
+ success: COLOR_SUCCESS_MEDIUM,
6
+ info: COLOR_NEUTRAL_DUSK,
7
+ disabled: COLOR_NEUTRAL_MEDIUM
8
+ };
9
+ export { HELP_TEXT_COLOR_MODIFIER };
@@ -0,0 +1,2 @@
1
+ import { HelpTextProps } from ".";
2
+ export declare const HelpTextContainer: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, Partial<HelpTextProps>>> & string;
@@ -0,0 +1,19 @@
1
+ import styled_components from "styled-components";
2
+ import { HELP_TEXT_COLOR_MODIFIER } from "./modifiers/colors.js";
3
+ const HelpTextContainer = styled_components.div`
4
+ display: flex;
5
+ align-items: center;
6
+ gap: 0.25rem;
7
+ color: ${({ feedback = "info" })=>HELP_TEXT_COLOR_MODIFIER[feedback]};
8
+ transition: all 0.18s ease;
9
+
10
+ span {
11
+ font-size: 0.875rem;
12
+ line-height: 1.25rem;
13
+ font-weight: 500;
14
+ overflow: hidden;
15
+ text-overflow: ellipsis;
16
+ white-space: nowrap;
17
+ }
18
+ `;
19
+ export { HelpTextContainer };
@@ -0,0 +1,8 @@
1
+ interface LabelProps {
2
+ text: string;
3
+ subtext?: string;
4
+ required?: boolean;
5
+ htmlFor?: string;
6
+ }
7
+ export default function Label({ text, subtext, required, htmlFor, }: LabelProps): import("react/jsx-runtime").JSX.Element;
8
+ export {};
@@ -0,0 +1,22 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { LabelContainer } from "./styles.js";
3
+ function Label({ text, subtext, required, htmlFor }) {
4
+ return /*#__PURE__*/ jsx(LabelContainer, {
5
+ required: required,
6
+ children: /*#__PURE__*/ jsxs("div", {
7
+ children: [
8
+ /*#__PURE__*/ jsx("label", {
9
+ htmlFor: htmlFor,
10
+ children: text
11
+ }),
12
+ subtext && /*#__PURE__*/ jsx("span", {
13
+ children: subtext
14
+ }),
15
+ required && /*#__PURE__*/ jsx("span", {
16
+ children: "*"
17
+ })
18
+ ]
19
+ })
20
+ });
21
+ }
22
+ export { Label as default };
@@ -0,0 +1,5 @@
1
+ interface labelProps {
2
+ required?: boolean;
3
+ }
4
+ export declare const LabelContainer: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, labelProps>> & string;
5
+ export {};
@@ -0,0 +1,28 @@
1
+ import styled_components from "styled-components";
2
+ import { COLOR_DANGER_MEDIUM, COLOR_NEUTRAL_DARK, COLOR_NEUTRAL_DUSK, FONT_WEIGHT_BOLD } from "@ftdata/f-tokens";
3
+ const LabelContainer = styled_components.div`
4
+ display: flex;
5
+ gap: ${({ required })=>required ? "0" : "0.5rem"};
6
+ position: relative;
7
+ justify-content: space-between;
8
+ align-items: flex-end;
9
+
10
+ label {
11
+ color: ${COLOR_NEUTRAL_DUSK};
12
+ font-size: 0.875rem;
13
+ font-weight: ${FONT_WEIGHT_BOLD};
14
+ line-height: 1rem;
15
+ white-space: normal;
16
+ word-wrap: break-word;
17
+ overflow-wrap: break-word;
18
+ }
19
+
20
+ span {
21
+ margin-left: ${({ required })=>required ? "0" : "0.5rem"};
22
+ color: ${({ required })=>required ? COLOR_DANGER_MEDIUM : COLOR_NEUTRAL_DARK};
23
+ font-size: 0.875rem;
24
+ font-weight: ${FONT_WEIGHT_BOLD};
25
+ line-height: 1rem;
26
+ }
27
+ `;
28
+ export { LabelContainer };
@@ -0,0 +1,6 @@
1
+ import { ButtonHTMLAttributes } from "react";
2
+ interface RotateButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
3
+ rotate?: boolean;
4
+ }
5
+ export default function RotateButton({ rotate }: RotateButtonProps): import("react/jsx-runtime").JSX.Element;
6
+ export {};
@@ -0,0 +1,13 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { Icon } from "@ftdata/f-icons";
3
+ import { Rotate } from "./styles.js";
4
+ function RotateButton({ rotate }) {
5
+ return /*#__PURE__*/ jsx(Rotate, {
6
+ rotate: rotate,
7
+ children: /*#__PURE__*/ jsx(Icon, {
8
+ name: "arw caret-down",
9
+ color: "currentColor"
10
+ })
11
+ });
12
+ }
13
+ export { RotateButton as default };
@@ -0,0 +1,5 @@
1
+ interface RotateProps {
2
+ rotate?: boolean;
3
+ }
4
+ export declare const Rotate: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, RotateProps>> & string;
5
+ export {};
@@ -0,0 +1,10 @@
1
+ import styled_components from "styled-components";
2
+ import { COLOR_NEUTRAL_DARKER } from "@ftdata/f-tokens";
3
+ const Rotate = styled_components.button`
4
+ color: ${COLOR_NEUTRAL_DARKER};
5
+ height: 1.5rem;
6
+ width: 1.5rem;
7
+ transition: rotate 0.18s ease-in-out;
8
+ rotate: ${({ rotate })=>rotate ? "-180deg" : "0deg"};
9
+ `;
10
+ export { Rotate };
@@ -0,0 +1,2 @@
1
+ import { HelpTextFeedbackType } from "../components/HelpText";
2
+ export declare function getHelpTextFeedbackType(feedback?: HelpTextFeedbackType, disabled?: boolean): HelpTextFeedbackType;
@@ -0,0 +1,11 @@
1
+ const FEEDBACK_MAP = {
2
+ danger: "danger",
3
+ success: "success",
4
+ warning: "warning",
5
+ info: "info"
6
+ };
7
+ function getHelpTextFeedbackType(feedback, disabled) {
8
+ const feedBackHelpText = disabled ? "disabled" : FEEDBACK_MAP[feedback ?? "info"];
9
+ return feedBackHelpText;
10
+ }
11
+ export { getHelpTextFeedbackType };
@@ -0,0 +1,2 @@
1
+ import { FieldFeedbackType } from "../../../types/feedback";
2
+ export declare const FEEDBACK_COLORS: Record<FieldFeedbackType, string>;
@@ -0,0 +1,7 @@
1
+ import { COLOR_DANGER_MEDIUM, COLOR_SUCCESS_MEDIUM, COLOR_WARNING_MEDIUM } from "@ftdata/f-tokens";
2
+ const FEEDBACK_COLORS = {
3
+ danger: COLOR_DANGER_MEDIUM,
4
+ success: COLOR_SUCCESS_MEDIUM,
5
+ warning: COLOR_WARNING_MEDIUM
6
+ };
7
+ export { FEEDBACK_COLORS };
@@ -0,0 +1,2 @@
1
+ import { FieldFeedbackType } from "../../../types/feedback";
2
+ export declare const fieldColorModifier: (feedback?: FieldFeedbackType) => "" | import("styled-components").RuleSet<object>;
@@ -0,0 +1,14 @@
1
+ import { css } from "styled-components";
2
+ import { FEEDBACK_COLORS } from "./color_modifiers.js";
3
+ const fieldColorModifier = (feedback)=>{
4
+ if (!feedback) return "";
5
+ const color = FEEDBACK_COLORS[feedback];
6
+ return css`
7
+ box-shadow: 0 0 0 1px ${color};
8
+
9
+ &:focus-within {
10
+ box-shadow: 0 0 0 2px ${color};
11
+ }
12
+ `;
13
+ };
14
+ export { fieldColorModifier };
@@ -0,0 +1,2 @@
1
+ import { FieldFeedbackType } from "../../../types/feedback";
2
+ export declare function selectColorModifier(feedback?: FieldFeedbackType, active?: boolean): "" | import("styled-components").RuleSet<object>;
@@ -0,0 +1,10 @@
1
+ import { css } from "styled-components";
2
+ import { FEEDBACK_COLORS } from "./color_modifiers.js";
3
+ function selectColorModifier(feedback, active) {
4
+ if (!feedback) return "";
5
+ const color = FEEDBACK_COLORS[feedback];
6
+ return css`
7
+ box-shadow: 0 0 0 ${active ? "2px" : "1px"} ${color};
8
+ `;
9
+ }
10
+ export { selectColorModifier };
package/dist/index.d.ts CHANGED
@@ -12,8 +12,8 @@ export { default as EmptyState } from "./components/EmptyState";
12
12
  export { default as Tooltips } from "./components/Tooltips";
13
13
  export { default as Collapse } from "./components/Collapse";
14
14
  export { default as UserMenu } from "./components/UserMenu";
15
- export { default as CustomSelect } from "./components/CustomSelect";
16
- export type { ICustomSelectOption } from "./components/CustomSelect";
15
+ export { default as Select } from "./components/Select";
16
+ export type { ISelectOption } from "./components/Select";
17
17
  export { default as StateAlert } from "./components/StateAlert";
18
18
  export { default as MultiSelect } from "./components/MultiSelect";
19
19
  export type { IMultiSelectOption } from "./components/MultiSelect";