allaw-ui 0.1.44 → 0.1.45

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.
@@ -52,11 +52,19 @@
52
52
  flex-direction: column;
53
53
  align-items: flex-start;
54
54
  border-radius: 8px;
55
- border: 1px solid rgba(114, 142, 167, 1);
55
+ border: 3px solid var(--grey-venom, #e6edf5);
56
56
  background: var(--Primary-Blanc, #fff);
57
57
  padding: 10px;
58
58
  }
59
59
 
60
+ .Input-default .Input-input:hover {
61
+ border-color: var(--venom-grey-dark, #d1dce8);
62
+ }
63
+
64
+ .Input-default .Input-input:focus-within {
65
+ border-color: var(--mid-grey, #728ea7);
66
+ }
67
+
60
68
  .Input-default .Input-input input {
61
69
  width: 100%;
62
70
  border: none;
@@ -88,11 +96,19 @@
88
96
  flex-direction: column;
89
97
  align-items: flex-start;
90
98
  border-radius: 8px;
91
- border: 1px solid rgba(114, 142, 167, 1);
99
+ border: 3px solid var(--grey-venom, #e6edf5);
92
100
  background: var(--Primary-Blanc, #fff);
93
101
  padding: 10px;
94
102
  }
95
103
 
104
+ .Input-variation .Input-input:hover {
105
+ border-color: var(--venom-grey-dark, #d1dce8);
106
+ }
107
+
108
+ .Input-variation .Input-input:focus-within {
109
+ border-color: var(--mid-grey, #728ea7);
110
+ }
111
+
96
112
  .Input-variation .Input-input input {
97
113
  width: 100%;
98
114
  border: none;
@@ -143,11 +159,19 @@
143
159
  justify-content: space-between;
144
160
  align-items: center;
145
161
  border-radius: 8px;
146
- border: 1px solid rgba(114, 142, 167, 1);
162
+ border: 3px solid var(--grey-venom, #e6edf5);
147
163
  background: var(--Primary-Blanc, #fff);
148
164
  padding: 10px;
149
165
  }
150
166
 
167
+ .Input-password .Input-container:hover {
168
+ border-color: var(--venom-grey-dark, #d1dce8);
169
+ }
170
+
171
+ .Input-password .Input-container:focus-within {
172
+ border-color: var(--mid-grey, #728ea7);
173
+ }
174
+
151
175
  .Input-password .Input-input {
152
176
  display: flex;
153
177
  flex: 1;
@@ -0,0 +1,141 @@
1
+ /* ComboBox.css */
2
+ .combo-box-container {
3
+ position: relative;
4
+ display: flex;
5
+ flex-direction: column;
6
+ gap: 8px;
7
+ }
8
+
9
+ .combo-box-title-container {
10
+ display: flex;
11
+ align-items: center;
12
+ }
13
+
14
+ .combo-box-required {
15
+ color: var(--dark-grey, #456073);
16
+ }
17
+
18
+ .combo-box-input-container {
19
+ display: flex;
20
+ align-items: center;
21
+ position: relative;
22
+ }
23
+
24
+ .combo-box {
25
+ display: flex;
26
+ padding: 8px 16px;
27
+ justify-content: space-between;
28
+ align-items: center;
29
+ gap: 8px;
30
+ border-radius: 10px;
31
+ border: 3px solid var(--grey-venom, #e6edf5);
32
+ background: var(--Primary-Blanc, #fff);
33
+ cursor: pointer;
34
+ outline: none;
35
+ font-family: "Open Sans";
36
+ font-size: 14px;
37
+ font-style: normal;
38
+ font-weight: 500;
39
+ line-height: normal;
40
+ color: var(--Primary-Mid-black, var(--primary-black, #171e25));
41
+ width: 100%;
42
+ }
43
+
44
+ .combo-box-chevron {
45
+ position: absolute;
46
+ right: 12px;
47
+ top: 5px;
48
+ color: var(--venom-grey-dark, #d1dce8);
49
+ cursor: pointer;
50
+ z-index: 1;
51
+ padding-top: 8px;
52
+ padding-bottom: 8px;
53
+ padding-left: 14px;
54
+ padding-right: 14px;
55
+ transition: transform 0.3s ease-in-out;
56
+ }
57
+
58
+ .combo-box:hover {
59
+ border-color: var(--venom-grey-dark, #d1dce8);
60
+ }
61
+
62
+ .combo-box-chevron:hover {
63
+ color: var(--mid-grey, #728ea7);
64
+ }
65
+
66
+ .allaw-icon-chevron {
67
+ transition: transform 0.3s ease-in-out;
68
+ }
69
+
70
+ .chevron-down {
71
+ transform: rotate(0deg);
72
+ }
73
+
74
+ .chevron-up {
75
+ transform: rotate(180deg);
76
+ }
77
+
78
+ .combo-box-list {
79
+ display: none;
80
+ flex-direction: column;
81
+ background: var(--secondary-light-grey, #f4f7fb);
82
+ border-radius: 12px;
83
+ margin-top: 8px;
84
+ padding: 3px 5px;
85
+ color: var(--Primary-Mid-black, var(--primary-black, #171e25));
86
+ font-family: "Open Sans";
87
+ font-size: 14px;
88
+ font-style: normal;
89
+ font-weight: 500;
90
+ line-height: normal;
91
+ max-height: 600px;
92
+ overflow-y: auto;
93
+ position: absolute;
94
+ top: 100%;
95
+ left: 0;
96
+ z-index: 1000;
97
+ border: 1px solid var(--grey-venom, #e6edf5);
98
+ box-shadow: 0px 4px 8px 0px rgba(9, 30, 66, 0.15);
99
+ scroll-behavior: auto;
100
+ }
101
+
102
+ .combo-box-pressed .combo-box-list {
103
+ display: flex;
104
+ opacity: 1;
105
+ transform: translateY(0) scale(1);
106
+ }
107
+
108
+ .combo-box-item {
109
+ display: flex;
110
+ align-items: center;
111
+ padding: 8px 12px;
112
+ margin: 2px 0;
113
+ cursor: pointer;
114
+ width: 100%;
115
+ }
116
+
117
+ .combo-box-item:hover {
118
+ background: var(--venom-grey-dark, #d1dce8);
119
+ border-radius: 8px;
120
+ }
121
+
122
+ .combo-box-item-text {
123
+ white-space: nowrap;
124
+ overflow: hidden;
125
+ text-overflow: ellipsis;
126
+ width: 100%;
127
+ }
128
+
129
+ .error-message {
130
+ padding-top: 4px;
131
+ padding-left: 14px;
132
+ }
133
+
134
+ .combo-box-item.highlighted {
135
+ background-color: var(--venom-grey-dark, #d1dce8);
136
+ border-radius: 8px;
137
+ }
138
+
139
+ .combo-box-hovered {
140
+ border-color: var(--venom-grey-dark, #d1dce8);
141
+ }
@@ -0,0 +1,26 @@
1
+ import React from "react";
2
+ import "./ComboBox.css";
3
+ import "../../../styles/global.css";
4
+ export interface SelectItem {
5
+ label: string;
6
+ value: string;
7
+ }
8
+ export interface ComboBoxProps {
9
+ items: SelectItem[];
10
+ selectedItem?: string;
11
+ placeholder?: string;
12
+ isRequired?: boolean;
13
+ showError?: boolean;
14
+ width?: number;
15
+ onChange?: (selected: string) => void;
16
+ onError?: (error: string) => void;
17
+ openOnMount?: boolean;
18
+ title?: string;
19
+ }
20
+ export interface ComboBoxRef {
21
+ validate: () => boolean;
22
+ }
23
+ declare const _default: (props: ComboBoxProps & {
24
+ ref?: React.Ref<ComboBoxRef>;
25
+ }) => React.ReactElement;
26
+ export default _default;
@@ -0,0 +1,149 @@
1
+ import React, { useState, useEffect, useRef, useImperativeHandle, forwardRef, } from "react";
2
+ import "./ComboBox.css";
3
+ import "../../../styles/global.css";
4
+ import TinyInfo from "../typography/TinyInfo";
5
+ import Paragraph from "../typography/Paragraph";
6
+ function ComboBox(_a, ref) {
7
+ var items = _a.items, selectedItem = _a.selectedItem, _b = _a.placeholder, placeholder = _b === void 0 ? "Sélectionner..." : _b, _c = _a.isRequired, isRequired = _c === void 0 ? false : _c, _d = _a.showError, showError = _d === void 0 ? false : _d, _e = _a.width, width = _e === void 0 ? 100 : _e, onChange = _a.onChange, onError = _a.onError, _f = _a.openOnMount, openOnMount = _f === void 0 ? true : _f, title = _a.title;
8
+ var _g = useState(openOnMount), isOpen = _g[0], setIsOpen = _g[1];
9
+ var _h = useState(""), inputValue = _h[0], setInputValue = _h[1];
10
+ var _j = useState(items), filteredItems = _j[0], setFilteredItems = _j[1];
11
+ var _k = useState(""), error = _k[0], setError = _k[1];
12
+ var _l = useState(false), isHovered = _l[0], setIsHovered = _l[1];
13
+ var _m = useState(-1), selectedIndex = _m[0], setSelectedIndex = _m[1];
14
+ var comboBoxRef = useRef(null);
15
+ var inputContainerRef = useRef(null);
16
+ var listRef = useRef(null);
17
+ var inputRef = useRef(null);
18
+ var chevronRef = useRef(null);
19
+ var _o = useState(true), isInputValid = _o[0], setIsInputValid = _o[1];
20
+ useEffect(function () {
21
+ if (selectedItem) {
22
+ var selectedItemData = items.find(function (item) { return item.value === selectedItem; });
23
+ setInputValue(selectedItemData ? selectedItemData.label : "");
24
+ }
25
+ else {
26
+ setInputValue("");
27
+ }
28
+ setFilteredItems(items);
29
+ }, [selectedItem, items]);
30
+ useEffect(function () {
31
+ var handleClickOutside = function (event) {
32
+ if (inputContainerRef.current &&
33
+ !inputContainerRef.current.contains(event.target) &&
34
+ listRef.current &&
35
+ !listRef.current.contains(event.target)) {
36
+ setIsOpen(false);
37
+ }
38
+ };
39
+ document.addEventListener("mousedown", handleClickOutside);
40
+ return function () {
41
+ document.removeEventListener("mousedown", handleClickOutside);
42
+ };
43
+ }, []);
44
+ var handleInputChange = function (event) {
45
+ var value = event.target.value;
46
+ setInputValue(value);
47
+ var filtered = items.filter(function (item) {
48
+ return item.label.toLowerCase().includes(value.toLowerCase());
49
+ });
50
+ setFilteredItems(filtered);
51
+ setIsInputValid(filtered.length > 0 || value === "");
52
+ setIsOpen(true);
53
+ };
54
+ var handleInputFocus = function () {
55
+ setIsOpen(true);
56
+ };
57
+ var handleSelect = function (item, index) {
58
+ // console.log("Élément sélectionné :", item);
59
+ setInputValue(item.label);
60
+ setSelectedIndex(index);
61
+ setFilteredItems(items);
62
+ setIsOpen(false);
63
+ onChange === null || onChange === void 0 ? void 0 : onChange(item.value);
64
+ validateSelect(item.value);
65
+ };
66
+ var validateSelect = function (value) {
67
+ var isEmpty = value === "";
68
+ var errorMessage = isRequired && isEmpty ? "Ce champ est requis" : "";
69
+ // console.log("Validation de la sélection :", errorMessage);
70
+ setError(errorMessage);
71
+ onError === null || onError === void 0 ? void 0 : onError(errorMessage);
72
+ return !errorMessage;
73
+ };
74
+ useImperativeHandle(ref, function () { return ({
75
+ validate: function () { return validateSelect(inputValue); },
76
+ }); });
77
+ var handleChevronClick = function () {
78
+ if (!isInputValid) {
79
+ setInputValue("");
80
+ setFilteredItems(items);
81
+ setIsInputValid(true);
82
+ }
83
+ else {
84
+ setIsOpen(!isOpen);
85
+ }
86
+ };
87
+ var handleMouseEnter = function () {
88
+ setIsHovered(true);
89
+ };
90
+ var handleMouseLeave = function () {
91
+ setIsHovered(false);
92
+ };
93
+ var handleItemClick = function (item, index) {
94
+ // console.log("Clic sur l'élément :", item);
95
+ handleSelect(item, index);
96
+ };
97
+ var handleKeyDown = function (event) {
98
+ if (isOpen) {
99
+ switch (event.key) {
100
+ case "ArrowUp":
101
+ event.preventDefault();
102
+ setSelectedIndex(function (prevIndex) {
103
+ return prevIndex <= 0 ? filteredItems.length - 1 : prevIndex - 1;
104
+ });
105
+ break;
106
+ case "ArrowDown":
107
+ event.preventDefault();
108
+ setSelectedIndex(function (prevIndex) {
109
+ return prevIndex >= filteredItems.length - 1 ? 0 : prevIndex + 1;
110
+ });
111
+ break;
112
+ case "Enter":
113
+ event.preventDefault();
114
+ if (selectedIndex !== -1) {
115
+ handleSelect(filteredItems[selectedIndex], selectedIndex);
116
+ }
117
+ break;
118
+ default:
119
+ break;
120
+ }
121
+ }
122
+ };
123
+ useEffect(function () {
124
+ var handleKeyDownWrapper = function (event) {
125
+ if (inputRef.current && event.target === inputRef.current) {
126
+ handleKeyDown(event);
127
+ }
128
+ };
129
+ document.addEventListener("keydown", handleKeyDownWrapper);
130
+ return function () {
131
+ document.removeEventListener("keydown", handleKeyDownWrapper);
132
+ };
133
+ }, [isOpen, filteredItems, selectedIndex]);
134
+ return (React.createElement("div", { ref: comboBoxRef, className: "combo-box-container ".concat(isOpen ? "combo-box-pressed" : "", " ").concat(isHovered ? "combo-box-hovered" : ""), style: { width: "".concat(width, "%") }, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave },
135
+ title && (React.createElement("div", { className: "combo-box-title-container" },
136
+ React.createElement(Paragraph, { variant: "semiBold", color: "noir", text: title }),
137
+ isRequired && (React.createElement("span", { className: "combo-box-required" },
138
+ "\u00A0",
139
+ "*")))),
140
+ React.createElement("div", { ref: inputContainerRef, className: "combo-box-input-container" },
141
+ React.createElement("input", { ref: inputRef, className: "combo-box ".concat(isOpen ? "combo-box-pressed" : "combo-box-default", " ").concat(isHovered ? "combo-box-hovered" : ""), placeholder: placeholder, value: inputValue, onChange: handleInputChange, onFocus: handleInputFocus, style: { width: "100%" } }),
142
+ React.createElement("div", { ref: chevronRef, className: "combo-box-chevron ".concat(isHovered ? "combo-box-hovered" : ""), onClick: handleChevronClick },
143
+ React.createElement("i", { className: "allaw-icon-".concat(isInputValid ? "chevron-down" : "close") }))),
144
+ isOpen && filteredItems.length > 0 && (React.createElement("div", { ref: listRef, className: "combo-box-list", style: { width: "100%" } }, filteredItems.map(function (item, index) { return (React.createElement("div", { key: item.value, "data-value": item.value, className: "combo-box-item ".concat(index === selectedIndex ? "highlighted" : ""), onClick: function () { return handleItemClick(item, index); } },
145
+ React.createElement("span", { className: "combo-box-item-text" }, item.label))); }))),
146
+ isRequired && showError && error && (React.createElement("div", { className: "error-message" },
147
+ React.createElement(TinyInfo, { variant: "medium12", color: "actions-error", text: error })))));
148
+ }
149
+ export default forwardRef(ComboBox);
@@ -1,2 +1,4 @@
1
- export { default } from "./Select";
1
+ export { default as Select } from "./Select";
2
2
  export type { SelectItem, SelectProps, SelectRef } from "./Select";
3
+ export { default as ComboBox } from "./ComboBox";
4
+ export type { ComboBoxProps, ComboBoxRef } from "./ComboBox";
@@ -1 +1,2 @@
1
- export { default } from "./Select";
1
+ export { default as Select } from "./Select";
2
+ export { default as ComboBox } from "./ComboBox";
package/dist/index.d.ts CHANGED
@@ -21,6 +21,8 @@ export { default as RadioButton } from "./components/atoms/radios/RadioButton";
21
21
  export { default as SingleFilter } from "./components/atoms/filters/SingleFilter";
22
22
  export { default as Select } from "./components/atoms/selects/Select";
23
23
  export type { SelectItem, SelectProps, SelectRef, } from "./components/atoms/selects/Select";
24
+ export { default as ComboBox } from "./components/atoms/selects/ComboBox";
25
+ export type { ComboBoxProps, ComboBoxRef, } from "./components/atoms/selects/ComboBox";
24
26
  export { default as AppointementStatusTag } from "./components/atoms/tags/AppointementStatusTag";
25
27
  export { default as FolderStatusTag } from "./components/atoms/tags/FolderStatusTag";
26
28
  export { default as OtherStatusTag } from "./components/atoms/tags/OtherStatusTag";
package/dist/index.js CHANGED
@@ -26,6 +26,7 @@ export { default as RadioButton } from "./components/atoms/radios/RadioButton";
26
26
  export { default as SingleFilter } from "./components/atoms/filters/SingleFilter";
27
27
  // Selects
28
28
  export { default as Select } from "./components/atoms/selects/Select";
29
+ export { default as ComboBox } from "./components/atoms/selects/ComboBox";
29
30
  // Tags
30
31
  export { default as AppointementStatusTag } from "./components/atoms/tags/AppointementStatusTag";
31
32
  export { default as FolderStatusTag } from "./components/atoms/tags/FolderStatusTag";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "allaw-ui",
3
- "version": "0.1.44",
3
+ "version": "0.1.45",
4
4
  "description": "Composants UI pour l'application Allaw",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",