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.
Files changed (43) hide show
  1. package/dist/dataTable/DataTable.d.ts +1 -0
  2. package/dist/dataTable/dataTableRow/DataTableRow.d.ts +2 -1
  3. package/dist/form/Form.d.ts +2 -1
  4. package/dist/form/form.enum.d.ts +2 -1
  5. package/dist/form/form.interface.d.ts +4 -0
  6. package/dist/grid/col/Col.d.ts +3 -6
  7. package/dist/grid/col/colStyled/ColStyled.d.ts +7 -5
  8. package/dist/grid/grid.interface.d.ts +9 -5
  9. package/dist/header/header.interface.d.ts +1 -1
  10. package/dist/index.d.ts +1 -0
  11. package/dist/index.js +2926 -2766
  12. package/dist/menus/menu/Menu.d.ts +1 -0
  13. package/dist/style.css +1 -1
  14. package/dist/toaster/store/useToasterStore.d.ts +1 -0
  15. package/index.html +1 -2
  16. package/package.json +2 -2
  17. package/src/button/button.css +2 -2
  18. package/src/card/card.css +2 -2
  19. package/src/dataTable/DataTable.tsx +114 -6
  20. package/src/dataTable/DataTable.view.tsx +1 -0
  21. package/src/dataTable/dataTable.css +51 -3
  22. package/src/dataTable/dataTableRow/DataTableRow.tsx +85 -81
  23. package/src/expands/expands.css +8 -3
  24. package/src/form/Form.tsx +113 -10
  25. package/src/form/Form.view.tsx +9 -1
  26. package/src/form/form.css +49 -1
  27. package/src/form/form.enum.ts +1 -0
  28. package/src/form/form.interface.tsx +7 -0
  29. package/src/grid/col/Col.tsx +5 -7
  30. package/src/grid/col/colStyled/ColStyled.tsx +21 -7
  31. package/src/grid/grid.interface.tsx +11 -5
  32. package/src/header/Header.tsx +1 -1
  33. package/src/header/header.interface.tsx +1 -1
  34. package/src/index.css +58 -12
  35. package/src/index.ts +1 -0
  36. package/src/menus/Menus.tsx +1 -0
  37. package/src/menus/menu/Menu.tsx +2 -1
  38. package/src/sidebar/Sidebar.tsx +1 -0
  39. package/src/tabs/tabs.css +9 -3
  40. package/src/toaster/Toaster.tsx +7 -2
  41. package/src/toaster/Toaster.view.tsx +1 -0
  42. package/src/toaster/store/useToasterStore.tsx +2 -0
  43. 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 { FormInterface, FormValuesInterface } from "./form.interface";
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
- <div
199
- key={key}
200
- className={`d-flex flex-column ${
201
- v.className ?? ""
202
- } form-group form-group-${v.type}`}
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
- {v.type === "select" ? (
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
- </div>
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}
@@ -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 <DynamicForm onSubmit={handleSubmit} initialForm={initialValues} />;
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
+ }
@@ -10,4 +10,5 @@ export enum TypeInputEnum {
10
10
  DATE = "date",
11
11
  SELECT = "select",
12
12
  TEXTAREA = "textarea",
13
+ PRICE = "price",
13
14
  }
@@ -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?: (
@@ -1,14 +1,12 @@
1
1
  import { ColStyled } from "./colStyled/ColStyled";
2
- type ColProps = {
3
- xs?: number;
4
- sm?: number;
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?: number;
5
- $sm?: number;
6
- $md?: number;
7
- $lg?: number;
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
- @container (min-width: 576px) {
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
- @container (min-width: 768px) {
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
- @container (min-width: 992px) {
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 interface GridInterface {
2
- sm?: number;
3
- xs?: number;
4
- md?: number;
5
- lg?: number;
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
  }
@@ -40,7 +40,7 @@ export const Header = ({
40
40
  className={`header-logo ${onClickLogo && "cursor-pointer"} `}
41
41
  onClick={onClickLogo}
42
42
  >
43
- {logo && <img src={logo} alt="logo" />}
43
+ {logo && logo}
44
44
  </span>
45
45
  </div>
46
46
  <div className="d-flex align-items-center">
@@ -1,5 +1,5 @@
1
1
  export interface HeaderInterface {
2
- logo?: string;
2
+ logo?: React.ReactNode;
3
3
  children?: React.ReactNode;
4
4
  positionFixed?: boolean;
5
5
  onClickMenu?: () => void;
package/src/index.css CHANGED
@@ -1,9 +1,9 @@
1
1
  /* variables couleur */
2
2
  :root {
3
- --primary-color: #004aad;
4
- --secondary-color: #ff914d;
5
- --tertiary-color: #00ada1;
6
- --quaternary-color: #0082ad;
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: "Raleway", sans-serif !important;
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; /* Chrome, Safari, Edge */
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) {}