kelt-ui-kit-react 1.9.9 → 2.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.
- package/dist/dataTable/DataTable.d.ts +1 -0
- package/dist/dataTable/dataTableRow/DataTableRow.d.ts +2 -1
- package/dist/form/Form.d.ts +2 -1
- package/dist/form/form.enum.d.ts +2 -1
- package/dist/form/form.interface.d.ts +4 -0
- package/dist/grid/col/Col.d.ts +3 -6
- package/dist/grid/col/colStyled/ColStyled.d.ts +7 -5
- package/dist/grid/grid.interface.d.ts +9 -5
- package/dist/header/header.interface.d.ts +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2926 -2766
- package/dist/menus/menu/Menu.d.ts +1 -0
- package/dist/style.css +1 -1
- package/dist/toaster/store/useToasterStore.d.ts +1 -0
- package/index.html +1 -2
- package/package.json +2 -2
- package/src/button/button.css +2 -2
- package/src/card/card.css +2 -2
- package/src/dataTable/DataTable.tsx +114 -6
- package/src/dataTable/DataTable.view.tsx +1 -0
- package/src/dataTable/dataTable.css +51 -3
- package/src/dataTable/dataTableRow/DataTableRow.tsx +85 -81
- package/src/expands/expands.css +8 -3
- package/src/form/Form.tsx +113 -10
- package/src/form/Form.view.tsx +9 -1
- package/src/form/form.css +49 -1
- package/src/form/form.enum.ts +1 -0
- package/src/form/form.interface.tsx +7 -0
- package/src/grid/col/Col.tsx +5 -7
- package/src/grid/col/colStyled/ColStyled.tsx +21 -7
- package/src/grid/grid.interface.tsx +11 -5
- package/src/header/Header.tsx +1 -1
- package/src/header/header.interface.tsx +1 -1
- package/src/index.css +58 -12
- package/src/index.ts +1 -0
- package/src/menus/Menus.tsx +1 -0
- package/src/menus/menu/Menu.tsx +2 -1
- package/src/sidebar/Sidebar.tsx +1 -0
- package/src/tabs/tabs.css +9 -3
- package/src/toaster/Toaster.tsx +7 -2
- package/src/toaster/Toaster.view.tsx +1 -0
- package/src/toaster/store/useToasterStore.tsx +2 -0
- package/src/toaster/toaster.css +7 -2
package/src/form/Form.tsx
CHANGED
|
@@ -9,9 +9,35 @@ import { Button } from "../button/Button";
|
|
|
9
9
|
import { Icon } from "../icon/Icon";
|
|
10
10
|
import { Select } from "../select/Select"; // <--- ton composant
|
|
11
11
|
import "./form.css";
|
|
12
|
-
import {
|
|
12
|
+
import {
|
|
13
|
+
FormInterface,
|
|
14
|
+
FormMode,
|
|
15
|
+
FormValuesInterface,
|
|
16
|
+
} from "./form.interface";
|
|
13
17
|
import { Input } from "./input/Input";
|
|
18
|
+
import { InputPrice } from "./inputPrice/InputPrice";
|
|
14
19
|
import { TextArea } from "./textArea/TextArea";
|
|
20
|
+
import { Col } from "../grid/col/Col";
|
|
21
|
+
import { Row } from "../grid/row/Row";
|
|
22
|
+
import { TypeInputEnum } from "./form.enum";
|
|
23
|
+
|
|
24
|
+
const euroFormatter = new Intl.NumberFormat("fr-FR", {
|
|
25
|
+
style: "currency",
|
|
26
|
+
currency: "EUR",
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
type FormFieldContainerProps = {
|
|
30
|
+
field: FormInterface;
|
|
31
|
+
gridEnabled: boolean;
|
|
32
|
+
children: React.ReactNode;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const FormFieldContainer = ({
|
|
36
|
+
field,
|
|
37
|
+
gridEnabled,
|
|
38
|
+
children,
|
|
39
|
+
}: FormFieldContainerProps) =>
|
|
40
|
+
gridEnabled ? <Col {...field.col}>{children}</Col> : <>{children}</>;
|
|
15
41
|
|
|
16
42
|
export type FormProps<
|
|
17
43
|
T extends { [key: string]: string | number | boolean | Date | string[] }
|
|
@@ -24,6 +50,7 @@ export type FormProps<
|
|
|
24
50
|
children?: React.ReactNode;
|
|
25
51
|
initialForm: FormInterface[];
|
|
26
52
|
disabledSubmit?: boolean;
|
|
53
|
+
mode?: FormMode;
|
|
27
54
|
onSubmit?: (values: FormValuesInterface<T>) => void;
|
|
28
55
|
onChange?: (values: FormValuesInterface<T>) => void;
|
|
29
56
|
};
|
|
@@ -40,6 +67,7 @@ export const DynamicForm = forwardRef(
|
|
|
40
67
|
onChange,
|
|
41
68
|
hideSubmit,
|
|
42
69
|
disabledSubmit = false,
|
|
70
|
+
mode = "edit",
|
|
43
71
|
className,
|
|
44
72
|
}: FormProps<T>,
|
|
45
73
|
ref: React.Ref<{
|
|
@@ -179,6 +207,52 @@ export const DynamicForm = forwardRef(
|
|
|
179
207
|
setBtnDisabledSubmit,
|
|
180
208
|
}));
|
|
181
209
|
|
|
210
|
+
const gridEnabled = initialForm.some((field) => field.col !== undefined);
|
|
211
|
+
const FieldsContainer = gridEnabled ? Row : React.Fragment;
|
|
212
|
+
const getReadValue = (field: FormInterface): React.ReactNode => {
|
|
213
|
+
const value = values[field.name];
|
|
214
|
+
|
|
215
|
+
if (field.formatReadValue) {
|
|
216
|
+
return field.formatReadValue(value ?? "");
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
if (field.type === TypeInputEnum.SELECT) {
|
|
220
|
+
const selectedValues = Array.isArray(value) ? value : [value];
|
|
221
|
+
const labels = selectedValues
|
|
222
|
+
.map(
|
|
223
|
+
(selectedValue) =>
|
|
224
|
+
field.options?.find((option) => option.value === selectedValue)
|
|
225
|
+
?.label ?? selectedValue,
|
|
226
|
+
)
|
|
227
|
+
.filter((selectedValue) => selectedValue !== undefined);
|
|
228
|
+
|
|
229
|
+
return labels.join(", ") || "-";
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
if (field.type === TypeInputEnum.PRICE) {
|
|
233
|
+
const amount = Number(value);
|
|
234
|
+
return value === "" || value === undefined || Number.isNaN(amount)
|
|
235
|
+
? "-"
|
|
236
|
+
: euroFormatter.format(amount);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
if (typeof value === "boolean") {
|
|
240
|
+
return value ? "Oui" : "Non";
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
if (value instanceof Date) {
|
|
244
|
+
return value.toLocaleDateString();
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
if (Array.isArray(value)) {
|
|
248
|
+
return value.join(", ") || "-";
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
return value === undefined || value === null || value === ""
|
|
252
|
+
? "-"
|
|
253
|
+
: String(value);
|
|
254
|
+
};
|
|
255
|
+
|
|
182
256
|
return (
|
|
183
257
|
<form
|
|
184
258
|
autoComplete={autoComplete ?? "off"}
|
|
@@ -186,6 +260,7 @@ export const DynamicForm = forwardRef(
|
|
|
186
260
|
className={className ?? ""}
|
|
187
261
|
>
|
|
188
262
|
<div className="form-content">
|
|
263
|
+
<FieldsContainer>
|
|
189
264
|
{initialForm.map((v, key) => {
|
|
190
265
|
const required = v.onRequired
|
|
191
266
|
? v.onRequired(v.value)
|
|
@@ -195,16 +270,26 @@ export const DynamicForm = forwardRef(
|
|
|
195
270
|
: v.disabled ?? false;
|
|
196
271
|
|
|
197
272
|
return (
|
|
198
|
-
<
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
273
|
+
<FormFieldContainer key={key} field={v} gridEnabled={gridEnabled}>
|
|
274
|
+
<div
|
|
275
|
+
className={`d-flex flex-column ${
|
|
276
|
+
v.className ?? ""
|
|
277
|
+
} form-group form-group-${v.type}`}
|
|
278
|
+
>
|
|
204
279
|
{v.label && <label>{v.label}</label>}
|
|
205
280
|
{v.icon && <Icon classIcon={v.icon} />}
|
|
206
281
|
|
|
207
|
-
{
|
|
282
|
+
{mode === "read" ? (
|
|
283
|
+
<div
|
|
284
|
+
className={`form-read-value ${
|
|
285
|
+
v.type === TypeInputEnum.TEXTAREA
|
|
286
|
+
? "form-read-value--textarea"
|
|
287
|
+
: ""
|
|
288
|
+
}`}
|
|
289
|
+
>
|
|
290
|
+
{getReadValue(v)}
|
|
291
|
+
</div>
|
|
292
|
+
) : v.type === "select" ? (
|
|
208
293
|
<Select
|
|
209
294
|
id={v.id ?? v.name}
|
|
210
295
|
label={undefined}
|
|
@@ -236,6 +321,22 @@ export const DynamicForm = forwardRef(
|
|
|
236
321
|
handleChangeTextArea(name, value, v)
|
|
237
322
|
}
|
|
238
323
|
/>
|
|
324
|
+
) : v.type === TypeInputEnum.PRICE ? (
|
|
325
|
+
<InputPrice
|
|
326
|
+
id={v.id ?? v.name}
|
|
327
|
+
ref={(el) => (inputRefs.current[v.name] = el)}
|
|
328
|
+
name={v.name}
|
|
329
|
+
placeholder={v.placeholder ?? ""}
|
|
330
|
+
autoComplete={v.autoComplete}
|
|
331
|
+
tabIndex={0}
|
|
332
|
+
disabled={disabled}
|
|
333
|
+
autoFocus={v.focus ?? false}
|
|
334
|
+
required={required}
|
|
335
|
+
value={String(values[v.name] ?? "")}
|
|
336
|
+
onChange={(value) =>
|
|
337
|
+
handleChangeTextArea(v.name, value, v)
|
|
338
|
+
}
|
|
339
|
+
/>
|
|
239
340
|
) : (
|
|
240
341
|
<Input
|
|
241
342
|
id={v.id ?? v.name}
|
|
@@ -259,13 +360,15 @@ export const DynamicForm = forwardRef(
|
|
|
259
360
|
onInvalid={v.onInvalid ? v.onInvalid : undefined}
|
|
260
361
|
/>
|
|
261
362
|
)}
|
|
262
|
-
|
|
363
|
+
</div>
|
|
364
|
+
</FormFieldContainer>
|
|
263
365
|
);
|
|
264
366
|
})}
|
|
265
367
|
{children}
|
|
368
|
+
</FieldsContainer>
|
|
266
369
|
</div>
|
|
267
370
|
<div className="d-flex justify-content-end form-footer">
|
|
268
|
-
{!hideSubmit && (
|
|
371
|
+
{mode === "edit" && !hideSubmit && (
|
|
269
372
|
<Button
|
|
270
373
|
id={`button-${id}`}
|
|
271
374
|
disabled={btnDisabledSubmit}
|
package/src/form/Form.view.tsx
CHANGED
|
@@ -18,12 +18,14 @@ export const FormView = (): JSX.Element => {
|
|
|
18
18
|
name: "nom",
|
|
19
19
|
type: TypeInputEnum.PASSWORD,
|
|
20
20
|
required: true,
|
|
21
|
+
col: { xs: 12, md: 6 },
|
|
21
22
|
},
|
|
22
23
|
{
|
|
23
24
|
value: 30,
|
|
24
25
|
label: "Age",
|
|
25
26
|
name: "age",
|
|
26
27
|
type: TypeInputEnum.NUMBER,
|
|
28
|
+
col: { xs: 12, md: 6 },
|
|
27
29
|
},
|
|
28
30
|
{
|
|
29
31
|
value: false,
|
|
@@ -55,5 +57,11 @@ export const FormView = (): JSX.Element => {
|
|
|
55
57
|
const handleSubmit = (values: FormValuesInterface<FormData>) => {
|
|
56
58
|
console.log("Form Submitted: ", values);
|
|
57
59
|
};
|
|
58
|
-
return
|
|
60
|
+
return (
|
|
61
|
+
<DynamicForm
|
|
62
|
+
mode="edit"
|
|
63
|
+
onSubmit={handleSubmit}
|
|
64
|
+
initialForm={initialValues}
|
|
65
|
+
/>
|
|
66
|
+
);
|
|
59
67
|
};
|
package/src/form/form.css
CHANGED
|
@@ -4,10 +4,12 @@ input {
|
|
|
4
4
|
border-radius: 4px;
|
|
5
5
|
margin: 0.25rem 0 0.25rem 0;
|
|
6
6
|
min-width: 250px;
|
|
7
|
+
|
|
7
8
|
&:focus-visible {
|
|
8
9
|
outline: 1px solid #9696a7;
|
|
9
10
|
}
|
|
10
11
|
}
|
|
12
|
+
|
|
11
13
|
input[type="checkbox"],
|
|
12
14
|
input[type="radio"] {
|
|
13
15
|
min-width: auto;
|
|
@@ -16,38 +18,46 @@ input[type="radio"] {
|
|
|
16
18
|
height: 18px;
|
|
17
19
|
width: 18px;
|
|
18
20
|
}
|
|
21
|
+
|
|
19
22
|
form {
|
|
20
23
|
&.form-row {
|
|
21
24
|
display: flex;
|
|
22
25
|
flex-direction: row;
|
|
23
26
|
flex-wrap: wrap;
|
|
24
27
|
align-items: center;
|
|
28
|
+
|
|
25
29
|
.form-group {
|
|
26
30
|
margin-right: 1rem;
|
|
27
31
|
flex: 1;
|
|
28
32
|
padding: 0;
|
|
33
|
+
|
|
29
34
|
.input-container {
|
|
30
35
|
min-width: auto;
|
|
36
|
+
|
|
31
37
|
input {
|
|
32
38
|
min-width: auto;
|
|
33
39
|
}
|
|
34
40
|
}
|
|
35
41
|
}
|
|
36
42
|
}
|
|
43
|
+
|
|
37
44
|
label {
|
|
38
45
|
font-weight: 600;
|
|
39
46
|
font-size: 0.85rem;
|
|
40
47
|
padding-bottom: 0.15rem;
|
|
41
48
|
}
|
|
49
|
+
|
|
42
50
|
.form-group-checkbox {
|
|
43
51
|
display: flex;
|
|
44
52
|
flex-direction: row;
|
|
45
53
|
align-items: center;
|
|
46
54
|
margin-top: 0.5rem;
|
|
55
|
+
|
|
47
56
|
label {
|
|
48
57
|
margin-right: 1rem;
|
|
49
58
|
padding: 0;
|
|
50
59
|
}
|
|
60
|
+
|
|
51
61
|
input {
|
|
52
62
|
min-width: auto;
|
|
53
63
|
padding: 0;
|
|
@@ -56,7 +66,45 @@ form {
|
|
|
56
66
|
width: 18px;
|
|
57
67
|
}
|
|
58
68
|
}
|
|
69
|
+
|
|
59
70
|
button {
|
|
60
71
|
margin-top: 1rem;
|
|
61
72
|
}
|
|
62
|
-
|
|
73
|
+
|
|
74
|
+
.form-read-value {
|
|
75
|
+
width: 100%;
|
|
76
|
+
min-width: 250px;
|
|
77
|
+
min-height: calc(1em + 1rem + 2px);
|
|
78
|
+
box-sizing: border-box;
|
|
79
|
+
border: 1px solid transparent;
|
|
80
|
+
border-radius: 4px;
|
|
81
|
+
margin: 0.25rem 0;
|
|
82
|
+
padding: 0.5rem 1rem;
|
|
83
|
+
font-size: 0.8rem;
|
|
84
|
+
line-height: normal;
|
|
85
|
+
overflow-wrap: anywhere;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.form-read-value--textarea {
|
|
89
|
+
min-height: 3.25rem;
|
|
90
|
+
white-space: pre-wrap;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.grid-row {
|
|
94
|
+
|
|
95
|
+
.form-group,
|
|
96
|
+
.input-container,
|
|
97
|
+
.select-container,
|
|
98
|
+
.form-read-value {
|
|
99
|
+
min-width: 0;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
input:not([type="checkbox"]):not([type="radio"]),
|
|
103
|
+
.form-control-textarea,
|
|
104
|
+
.form-read-value {
|
|
105
|
+
box-sizing: border-box;
|
|
106
|
+
min-width: 0;
|
|
107
|
+
width: 100%;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
package/src/form/form.enum.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { TypeInputEnum } from "./form.enum";
|
|
2
|
+
import { GridBreakpoints } from "../grid/grid.interface";
|
|
3
|
+
|
|
4
|
+
export type FormMode = "read" | "edit";
|
|
2
5
|
|
|
3
6
|
export type FormValuesInterface<
|
|
4
7
|
T extends { [key: string]: string | number | boolean | Date | string[] }
|
|
@@ -25,6 +28,10 @@ export interface FormInterface {
|
|
|
25
28
|
multiple?: boolean;
|
|
26
29
|
options?: { value: string; label: string }[]; // <--- pour les <option>
|
|
27
30
|
className?: string;
|
|
31
|
+
col?: GridBreakpoints;
|
|
32
|
+
formatReadValue?: (
|
|
33
|
+
value: string | number | boolean | Date | string[]
|
|
34
|
+
) => React.ReactNode;
|
|
28
35
|
autoComplete?: string;
|
|
29
36
|
step?: string;
|
|
30
37
|
onChange?: (
|
package/src/grid/col/Col.tsx
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
import { ColStyled } from "./colStyled/ColStyled";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
md?: number;
|
|
6
|
-
lg?: number;
|
|
2
|
+
import { GridBreakpoints } from "../grid.interface";
|
|
3
|
+
|
|
4
|
+
type ColProps = GridBreakpoints & {
|
|
7
5
|
children: React.ReactNode;
|
|
8
6
|
};
|
|
9
|
-
export const Col: React.FC<ColProps> = ({ xs, sm, md, lg, children }) => {
|
|
7
|
+
export const Col: React.FC<ColProps> = ({ xs, sm, md, lg, xl, children }) => {
|
|
10
8
|
return (
|
|
11
|
-
<ColStyled $xs={xs} $sm={sm} $md={md} $lg={lg}>
|
|
9
|
+
<ColStyled $xs={xs} $sm={sm} $md={md} $lg={lg} $xl={xl}>
|
|
12
10
|
{children}
|
|
13
11
|
</ColStyled>
|
|
14
12
|
);
|
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
import styled, { css } from "styled-components";
|
|
2
|
+
import { GridColumnSpan } from "../../grid.interface";
|
|
3
|
+
|
|
2
4
|
const getColWidth = (size = 12) => `${(size / 12) * 100}%`;
|
|
3
5
|
type ColStyledProps = {
|
|
4
|
-
$xs?:
|
|
5
|
-
$sm?:
|
|
6
|
-
$md?:
|
|
7
|
-
$lg?:
|
|
6
|
+
$xs?: GridColumnSpan;
|
|
7
|
+
$sm?: GridColumnSpan;
|
|
8
|
+
$md?: GridColumnSpan;
|
|
9
|
+
$lg?: GridColumnSpan;
|
|
10
|
+
$xl?: GridColumnSpan;
|
|
8
11
|
};
|
|
9
12
|
export const ColStyled = styled.div<ColStyledProps>`
|
|
13
|
+
box-sizing: border-box;
|
|
14
|
+
min-width: 0;
|
|
10
15
|
padding: 0 15px;
|
|
11
16
|
flex: 0 0 ${({ $xs }) => getColWidth($xs)};
|
|
12
17
|
max-width: ${({ $xs }) => getColWidth($xs)};
|
|
@@ -15,7 +20,7 @@ export const ColStyled = styled.div<ColStyledProps>`
|
|
|
15
20
|
${({ $sm }) =>
|
|
16
21
|
$sm &&
|
|
17
22
|
css`
|
|
18
|
-
@
|
|
23
|
+
@media (min-width: 576px) {
|
|
19
24
|
flex: 0 0 ${getColWidth($sm)};
|
|
20
25
|
max-width: ${getColWidth($sm)};
|
|
21
26
|
}
|
|
@@ -24,7 +29,7 @@ export const ColStyled = styled.div<ColStyledProps>`
|
|
|
24
29
|
${({ $md }) =>
|
|
25
30
|
$md &&
|
|
26
31
|
css`
|
|
27
|
-
@
|
|
32
|
+
@media (min-width: 768px) {
|
|
28
33
|
flex: 0 0 ${getColWidth($md)};
|
|
29
34
|
max-width: ${getColWidth($md)};
|
|
30
35
|
}
|
|
@@ -33,9 +38,18 @@ export const ColStyled = styled.div<ColStyledProps>`
|
|
|
33
38
|
${({ $lg }) =>
|
|
34
39
|
$lg &&
|
|
35
40
|
css`
|
|
36
|
-
@
|
|
41
|
+
@media (min-width: 992px) {
|
|
37
42
|
flex: 0 0 ${getColWidth($lg)};
|
|
38
43
|
max-width: ${getColWidth($lg)};
|
|
39
44
|
}
|
|
40
45
|
`}
|
|
46
|
+
|
|
47
|
+
${({ $xl }) =>
|
|
48
|
+
$xl &&
|
|
49
|
+
css`
|
|
50
|
+
@media (min-width: 1200px) {
|
|
51
|
+
flex: 0 0 ${getColWidth($xl)};
|
|
52
|
+
max-width: ${getColWidth($xl)};
|
|
53
|
+
}
|
|
54
|
+
`}
|
|
41
55
|
`;
|
|
@@ -1,7 +1,13 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
export type GridColumnSpan = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;
|
|
2
|
+
|
|
3
|
+
export interface GridBreakpoints {
|
|
4
|
+
xs?: GridColumnSpan;
|
|
5
|
+
sm?: GridColumnSpan;
|
|
6
|
+
md?: GridColumnSpan;
|
|
7
|
+
lg?: GridColumnSpan;
|
|
8
|
+
xl?: GridColumnSpan;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface GridInterface extends GridBreakpoints {
|
|
6
12
|
children: React.ReactNode;
|
|
7
13
|
}
|
package/src/header/Header.tsx
CHANGED
package/src/index.css
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/* variables couleur */
|
|
2
2
|
:root {
|
|
3
|
-
--primary-color: #
|
|
4
|
-
--secondary-color: #
|
|
5
|
-
--tertiary-color: #
|
|
6
|
-
--quaternary-color: #
|
|
3
|
+
--primary-color: #123852;
|
|
4
|
+
--secondary-color: #EB5E3B;
|
|
5
|
+
--tertiary-color: #30B8C2;
|
|
6
|
+
--quaternary-color: #7dc2ef;
|
|
7
7
|
--success-color: #28a745;
|
|
8
8
|
--info-color: #17a2b8;
|
|
9
9
|
--warning-color: #ec942c;
|
|
@@ -17,7 +17,10 @@
|
|
|
17
17
|
html,
|
|
18
18
|
body {
|
|
19
19
|
margin: 0;
|
|
20
|
-
font-family: "
|
|
20
|
+
font-family: "Lexend", sans-serif;
|
|
21
|
+
font-optical-sizing: auto;
|
|
22
|
+
font-style: normal;
|
|
23
|
+
font-size: 18px;
|
|
21
24
|
-webkit-font-smoothing: antialiased;
|
|
22
25
|
-moz-osx-font-smoothing: grayscale;
|
|
23
26
|
height: 100%;
|
|
@@ -28,38 +31,48 @@ body {
|
|
|
28
31
|
width: 100%;
|
|
29
32
|
background-color: #fff;
|
|
30
33
|
}
|
|
34
|
+
|
|
31
35
|
.app {
|
|
32
36
|
container: app-container/ inline-size;
|
|
33
37
|
}
|
|
34
38
|
|
|
35
39
|
input[type="number"]::-webkit-outer-spin-button,
|
|
36
40
|
input[type="number"]::-webkit-inner-spin-button {
|
|
37
|
-
-webkit-appearance: none;
|
|
41
|
+
-webkit-appearance: none;
|
|
42
|
+
/* Chrome, Safari, Edge */
|
|
38
43
|
margin: 0;
|
|
39
44
|
}
|
|
45
|
+
|
|
40
46
|
/* flex properties */
|
|
41
47
|
|
|
42
48
|
.d-flex {
|
|
43
49
|
display: flex;
|
|
44
50
|
}
|
|
51
|
+
|
|
45
52
|
.justify-content-start {
|
|
46
53
|
justify-content: start;
|
|
47
54
|
}
|
|
55
|
+
|
|
48
56
|
.justify-content-end {
|
|
49
57
|
justify-content: end;
|
|
50
58
|
}
|
|
59
|
+
|
|
51
60
|
.justify-content-center {
|
|
52
61
|
justify-content: center;
|
|
53
62
|
}
|
|
63
|
+
|
|
54
64
|
.justify-content-between {
|
|
55
65
|
justify-content: space-between;
|
|
56
66
|
}
|
|
67
|
+
|
|
57
68
|
.justify-content-around {
|
|
58
69
|
justify-content: space-around;
|
|
59
70
|
}
|
|
71
|
+
|
|
60
72
|
.justify-content-evenly {
|
|
61
73
|
justify-content: space-evenly;
|
|
62
74
|
}
|
|
75
|
+
|
|
63
76
|
.align-items-start {
|
|
64
77
|
align-items: start;
|
|
65
78
|
}
|
|
@@ -310,63 +323,83 @@ a {
|
|
|
310
323
|
.mb-3 {
|
|
311
324
|
margin-bottom: 1rem;
|
|
312
325
|
}
|
|
326
|
+
|
|
313
327
|
.pb-0 {
|
|
314
328
|
padding-bottom: 0;
|
|
315
329
|
}
|
|
330
|
+
|
|
316
331
|
.pb-1 {
|
|
317
332
|
padding-bottom: 0.25rem;
|
|
318
333
|
}
|
|
334
|
+
|
|
319
335
|
.pb-2 {
|
|
320
336
|
padding-bottom: 0.5rem;
|
|
321
337
|
}
|
|
338
|
+
|
|
322
339
|
.pb-3 {
|
|
323
340
|
padding-bottom: 1rem;
|
|
324
341
|
}
|
|
342
|
+
|
|
325
343
|
.pt-0 {
|
|
326
344
|
padding-top: 0;
|
|
327
345
|
}
|
|
346
|
+
|
|
328
347
|
.pt-1 {
|
|
329
348
|
padding-top: 0.25rem;
|
|
330
349
|
}
|
|
350
|
+
|
|
331
351
|
.pt-2 {
|
|
332
352
|
padding-top: 0.5rem;
|
|
333
353
|
}
|
|
354
|
+
|
|
334
355
|
.pt-3 {
|
|
335
356
|
padding-top: 1rem;
|
|
336
357
|
}
|
|
358
|
+
|
|
337
359
|
.pl-0 {
|
|
338
360
|
padding-left: 0;
|
|
339
361
|
}
|
|
362
|
+
|
|
340
363
|
.pl-1 {
|
|
341
364
|
padding-left: 0.25rem;
|
|
342
365
|
}
|
|
366
|
+
|
|
343
367
|
.pl-2 {
|
|
344
368
|
padding-left: 0.5rem;
|
|
345
369
|
}
|
|
370
|
+
|
|
346
371
|
.pl-3 {
|
|
347
372
|
padding-left: 1rem;
|
|
348
373
|
}
|
|
374
|
+
|
|
349
375
|
.pr-0 {
|
|
350
376
|
padding-right: 0;
|
|
351
377
|
}
|
|
378
|
+
|
|
352
379
|
.pr-1 {
|
|
353
380
|
padding-right: 0.25rem;
|
|
354
381
|
}
|
|
382
|
+
|
|
355
383
|
.pr-2 {
|
|
356
384
|
padding-right: 0.5rem;
|
|
357
385
|
}
|
|
386
|
+
|
|
358
387
|
.pr-3 {
|
|
359
388
|
padding-right: 1rem;
|
|
360
389
|
}
|
|
390
|
+
|
|
361
391
|
.p-0 {
|
|
362
392
|
padding: 0;
|
|
363
393
|
}
|
|
394
|
+
|
|
364
395
|
.p-1 {
|
|
365
396
|
padding: 0.25rem;
|
|
366
397
|
}
|
|
398
|
+
|
|
367
399
|
.p-2 {
|
|
368
400
|
padding: 0.5rem;
|
|
369
401
|
}
|
|
402
|
+
|
|
370
403
|
.p-3 {
|
|
371
404
|
padding: 1rem;
|
|
372
405
|
}
|
|
@@ -375,25 +408,32 @@ a {
|
|
|
375
408
|
.border-bottom {
|
|
376
409
|
border-bottom: 1px solid #cfbdbd;
|
|
377
410
|
}
|
|
411
|
+
|
|
378
412
|
.border-top {
|
|
379
413
|
border-top: 1px solid #cfbdbd;
|
|
380
414
|
}
|
|
415
|
+
|
|
381
416
|
.border-left {
|
|
382
417
|
border-left: 1px solid #cfbdbd;
|
|
383
418
|
}
|
|
419
|
+
|
|
384
420
|
.border-right {
|
|
385
421
|
border-right: 1px solid #cfbdbd;
|
|
386
422
|
}
|
|
423
|
+
|
|
387
424
|
/* fonts */
|
|
388
425
|
.font-weight-bold {
|
|
389
426
|
font-weight: 600;
|
|
390
427
|
}
|
|
428
|
+
|
|
391
429
|
.font-weight-light {
|
|
392
430
|
font-weight: 300;
|
|
393
431
|
}
|
|
432
|
+
|
|
394
433
|
.font-weight-normal {
|
|
395
434
|
font-weight: 400;
|
|
396
435
|
}
|
|
436
|
+
|
|
397
437
|
.font-weight-italic {
|
|
398
438
|
font-style: italic;
|
|
399
439
|
}
|
|
@@ -402,32 +442,41 @@ a {
|
|
|
402
442
|
.visible {
|
|
403
443
|
visibility: visible;
|
|
404
444
|
}
|
|
445
|
+
|
|
405
446
|
.hidden {
|
|
406
447
|
visibility: hidden;
|
|
407
448
|
}
|
|
449
|
+
|
|
408
450
|
.position-relative {
|
|
409
451
|
position: relative;
|
|
410
452
|
}
|
|
453
|
+
|
|
411
454
|
.position-absolute {
|
|
412
455
|
position: absolute;
|
|
413
456
|
}
|
|
457
|
+
|
|
414
458
|
.cursor-pointer {
|
|
415
459
|
cursor: pointer;
|
|
416
460
|
}
|
|
461
|
+
|
|
417
462
|
.w-100 {
|
|
418
463
|
width: 100%;
|
|
419
464
|
}
|
|
465
|
+
|
|
420
466
|
.min-width-auto {
|
|
421
467
|
min-width: auto;
|
|
422
468
|
}
|
|
469
|
+
|
|
423
470
|
.disabled {
|
|
424
471
|
opacity: 0.5;
|
|
425
472
|
cursor: not-allowed;
|
|
426
473
|
pointer-events: none;
|
|
427
474
|
}
|
|
475
|
+
|
|
428
476
|
.overflow-auto {
|
|
429
477
|
overflow: auto;
|
|
430
478
|
}
|
|
479
|
+
|
|
431
480
|
.toggle-btn {
|
|
432
481
|
display: flex;
|
|
433
482
|
width: 100%;
|
|
@@ -492,11 +541,8 @@ a {
|
|
|
492
541
|
/* Couleurs : gris pour la barre, transparent pour le fond */
|
|
493
542
|
}
|
|
494
543
|
|
|
495
|
-
@media (min-width: 576px) {
|
|
496
|
-
}
|
|
544
|
+
@media (min-width: 576px) {}
|
|
497
545
|
|
|
498
|
-
@media (min-width: 768px) {
|
|
499
|
-
}
|
|
546
|
+
@media (min-width: 768px) {}
|
|
500
547
|
|
|
501
|
-
@media (min-width: 992px) {
|
|
502
|
-
}
|
|
548
|
+
@media (min-width: 992px) {}
|