data-primals-engine 1.0.10 → 1.1.0

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 (166) hide show
  1. package/client/README.md +8 -0
  2. package/client/index.html +31 -0
  3. package/client/index.js +25 -0
  4. package/client/package-lock.json +11664 -0
  5. package/client/package.json +70 -0
  6. package/client/public/demo/26899917-d1ba-4df4-bb33-48d09a8778da.jpg +0 -0
  7. package/client/public/demo/4b9894c7-12cd-466d-8fd3-a2757b09ec96.jpg +0 -0
  8. package/client/public/demo/7ed369ac-a1a2-4b45-b0cd-4fd5bcf5a75a.jpg +0 -0
  9. package/client/public/doc/API.postman_collection.json +214 -0
  10. package/client/public/github.svg +1 -0
  11. package/client/public/profilCompany.jpg +0 -0
  12. package/client/public/profilDeveloper.jpg +0 -0
  13. package/client/public/profilEngineer.jpg +0 -0
  14. package/client/public/profilPersonal.jpg +0 -0
  15. package/client/public/profils .psd +0 -0
  16. package/client/public/react.svg +9 -0
  17. package/client/src/APIInfo.jsx +328 -0
  18. package/client/src/AddWidgetTypeModal.jsx +44 -0
  19. package/client/src/AddWidgetTypeModal.scss +87 -0
  20. package/client/src/App.css +42 -0
  21. package/client/src/App.jsx +586 -0
  22. package/client/src/App.scss +1466 -0
  23. package/client/src/AssistantChat.jsx +280 -0
  24. package/client/src/AssistantChat.scss +229 -0
  25. package/client/src/Button.jsx +12 -0
  26. package/client/src/Button.scss +197 -0
  27. package/client/src/CalculationBuilder.jsx +338 -0
  28. package/client/src/CalculationStepRow.jsx +199 -0
  29. package/client/src/CalendarConfigModal.jsx +49 -0
  30. package/client/src/ChartConfigModal.jsx +402 -0
  31. package/client/src/ConditionBuilder.jsx +622 -0
  32. package/client/src/ConditionBuilder.scss +672 -0
  33. package/client/src/ConditionBuilder2.jsx +757 -0
  34. package/client/src/ContentView.jsx +274 -0
  35. package/client/src/CronBuilder.jsx +126 -0
  36. package/client/src/CronBuilder.scss +128 -0
  37. package/client/src/CronPartBuilder.jsx +150 -0
  38. package/client/src/Dashboard.jsx +210 -0
  39. package/client/src/Dashboard.scss +445 -0
  40. package/client/src/DashboardChart.jsx +362 -0
  41. package/client/src/DashboardFlexViewItem.jsx +129 -0
  42. package/client/src/DashboardView.jsx +554 -0
  43. package/client/src/DataChart.jsx +349 -0
  44. package/client/src/DataEditor.jsx +556 -0
  45. package/client/src/DataLayout.jsx +709 -0
  46. package/client/src/DataTable.jsx +996 -0
  47. package/client/src/DataTable.scss +73 -0
  48. package/client/src/Dialog.jsx +90 -0
  49. package/client/src/Dialog.scss +117 -0
  50. package/client/src/DisplayFlexNodeRenderer.jsx +115 -0
  51. package/client/src/DocumentationPageLayout.jsx +93 -0
  52. package/client/src/DocumentationPageLayout.scss +262 -0
  53. package/client/src/Draggable.jsx +222 -0
  54. package/client/src/Draggable.scss +49 -0
  55. package/client/src/ExportDialog.jsx +172 -0
  56. package/client/src/Field.jsx +1558 -0
  57. package/client/src/FlexBuilder.jsx +269 -0
  58. package/client/src/FlexBuilder.scss +226 -0
  59. package/client/src/FlexBuilderControls.jsx +170 -0
  60. package/client/src/FlexBuilderModal.jsx +75 -0
  61. package/client/src/FlexBuilderModal.scss +109 -0
  62. package/client/src/FlexBuilderPreview.jsx +48 -0
  63. package/client/src/FlexBuilderUtils.js +84 -0
  64. package/client/src/FlexDataRenderer.jsx +170 -0
  65. package/client/src/FlexDataRenderer.scss +80 -0
  66. package/client/src/FlexNode.jsx +290 -0
  67. package/client/src/FlexTreeUtils.js +129 -0
  68. package/client/src/HiddenableCell.jsx +46 -0
  69. package/client/src/HiddenableCell.scss +36 -0
  70. package/client/src/KPIDialog.jsx +39 -0
  71. package/client/src/KPIWidget.jsx +139 -0
  72. package/client/src/KanbanCard.jsx +92 -0
  73. package/client/src/KanbanColumn.jsx +29 -0
  74. package/client/src/KanbanConfigModal.jsx +115 -0
  75. package/client/src/KanbanView.jsx +113 -0
  76. package/client/src/KanbanView.scss +107 -0
  77. package/client/src/MessageRotator.jsx +77 -0
  78. package/client/src/MessageRotator.scss +14 -0
  79. package/client/src/ModelCreator.jsx +640 -0
  80. package/client/src/ModelCreator.scss +154 -0
  81. package/client/src/ModelCreatorField.jsx +810 -0
  82. package/client/src/ModelImporter.jsx +120 -0
  83. package/client/src/ModelList.jsx +205 -0
  84. package/client/src/Notification.jsx +137 -0
  85. package/client/src/Notification.scss +126 -0
  86. package/client/src/NotificationProvider.jsx +73 -0
  87. package/client/src/PackGallery.jsx +211 -0
  88. package/client/src/PackGallery.scss +156 -0
  89. package/client/src/Pagination.jsx +141 -0
  90. package/client/src/RTE.jsx +415 -0
  91. package/client/src/RTETrans.jsx +103 -0
  92. package/client/src/RelationField.jsx +247 -0
  93. package/client/src/RelationValue.jsx +230 -0
  94. package/client/src/RestoreConfirmationModal.jsx +183 -0
  95. package/client/src/RestoreDialog.jsx +134 -0
  96. package/client/src/RestoreDialog.scss +67 -0
  97. package/client/src/RichTextEditorModal.jsx +34 -0
  98. package/client/src/RichTextEditorModal.scss +54 -0
  99. package/client/src/TourSpotlight.jsx +234 -0
  100. package/client/src/TourSpotlight.scss +100 -0
  101. package/client/src/TutorialsMenu.jsx +83 -0
  102. package/client/src/TutorialsMenu.scss +217 -0
  103. package/client/src/TutorialsRewardModal.jsx +65 -0
  104. package/client/src/Utils.jsx +78 -0
  105. package/client/src/ViewSwitcher.jsx +54 -0
  106. package/client/src/ViewSwitcher.scss +74 -0
  107. package/client/src/Webpage.jsx +69 -0
  108. package/client/src/_variables.scss +21 -0
  109. package/client/src/assets/react.svg +1 -0
  110. package/client/src/constants.js +68 -0
  111. package/client/src/contexts/AuthContext.jsx +28 -0
  112. package/client/src/contexts/ModelContext.jsx +328 -0
  113. package/client/src/contexts/UIContext.jsx +52 -0
  114. package/client/src/core/data.js +35 -0
  115. package/client/src/entry-client.jsx +15 -0
  116. package/client/src/entry-server.jsx +13 -0
  117. package/client/src/filter.js +222 -0
  118. package/client/src/hooks/data.js +101 -0
  119. package/client/src/hooks/useDebounce.js +20 -0
  120. package/client/src/hooks/useDragAndDrop.js +59 -0
  121. package/client/src/hooks/useLocalStorage.js +100 -0
  122. package/client/src/hooks/useMount.js +42 -0
  123. package/client/src/hooks/useTutorials.jsx +227 -0
  124. package/client/src/hooks/useWindowSize.js +24 -0
  125. package/client/src/i18n.js +47 -0
  126. package/client/src/index.css +90 -0
  127. package/client/src/index.js +10 -0
  128. package/client/src/main.jsx +11 -0
  129. package/client/src/translations.js +15940 -0
  130. package/client/src/tutorials.js +112 -0
  131. package/client/vite.config.js +30 -0
  132. package/eslint.config.js +50 -0
  133. package/package.json +48 -27
  134. package/server.js +9 -0
  135. package/src/constants.js +12 -23
  136. package/src/core.js +9 -8
  137. package/src/data.js +81 -80
  138. package/src/defaultModels.js +114 -115
  139. package/src/email.js +8 -9
  140. package/src/engine.js +5 -5
  141. package/src/events.js +1 -2
  142. package/src/i18n.js +5390 -211
  143. package/src/middlewares/middleware-mongodb.js +94 -93
  144. package/src/migrate.js +24 -24
  145. package/src/modules/assistant.js +55 -55
  146. package/src/modules/bucket.js +10 -9
  147. package/src/modules/data.js +387 -357
  148. package/src/modules/file.js +3 -6
  149. package/src/modules/mongodb.js +6 -7
  150. package/src/modules/user.js +24 -47
  151. package/src/modules/workflow.js +68 -67
  152. package/src/openai.jobs.js +2 -2
  153. package/src/packs.js +30 -31
  154. package/src/providers.js +101 -3
  155. package/src/setenv.js +1 -1
  156. package/src/user.js +0 -17
  157. package/src/workers/crypto-worker.js +21 -20
  158. package/src/workers/import-export-worker.js +18 -18
  159. package/test/data.backup.integration.test.js +7 -12
  160. package/test/data.integration.test.js +27 -25
  161. package/test/globalSetup.js +2 -2
  162. package/test/import_export.integration.test.js +6 -6
  163. package/test/model.integration.test.js +21 -22
  164. package/test/workflow.integration.test.js +2 -5
  165. package/test/workflow.robustness.test.js +6 -13
  166. package/vitest.config.js +2 -2
@@ -0,0 +1,1466 @@
1
+ @import "_variables.scss";
2
+ img {
3
+ margin: 0 auto;
4
+ max-width: 100%;
5
+ width: auto;
6
+ }
7
+
8
+ body {
9
+ font-family: "Nunito Sans", sans-serif;
10
+ line-height: 1.6; // Améliore la lisibilité
11
+ background-color: $light-color;
12
+ color: $dark-color;
13
+ margin: 0;
14
+ padding: 0;
15
+ }
16
+
17
+ .flex {
18
+ display: flex;
19
+ flex-wrap: wrap;
20
+ align-items: center;
21
+ &.flex-fw {
22
+ width: 100%;
23
+ }
24
+ &.flex-start {
25
+ align-items: start;
26
+ }
27
+ .flex-left {
28
+ justify-content: flex-start;
29
+ }
30
+ &.flex-no-wrap {
31
+ flex-wrap: nowrap;
32
+ }
33
+ &.flex-no-gap {
34
+ gap: 0px;
35
+ }
36
+ &.flex-mini-gap {
37
+ gap: 4px;
38
+ }
39
+ &.flex-big-gap {
40
+ gap: 32px;
41
+ }
42
+ &.flex-stretch {
43
+ align-items: stretch;
44
+ }
45
+ &.flex-centered{
46
+ margin-left: auto;
47
+ margin-right: auto;
48
+ width: fit-content;
49
+ justify-content: center;
50
+ }
51
+ &.flex-border {
52
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
53
+ padding: 4px;
54
+ }
55
+ &.flex-row {
56
+ flex-direction: column;
57
+ }
58
+ gap: 4px;
59
+ @media only screen and (min-width: 480px){
60
+ gap: 12px;
61
+ }
62
+
63
+ }
64
+ .flex-1 {
65
+ flex: 1;
66
+ }
67
+ .flex-2 {
68
+ flex: 2;
69
+ }
70
+ .flex-3 {
71
+ flex: 3;
72
+ }
73
+ .flex-4 {
74
+ flex: 4;
75
+ }
76
+
77
+ h1, h2, h3 {
78
+ color: #333; // Couleur de titre consistante et lisible
79
+ }
80
+ h2 {
81
+ box-sizing: border-box;
82
+ margin: 4px;
83
+ color: #575656;
84
+ border-bottom: 1px solid #969696;
85
+ }
86
+
87
+ .prior {
88
+ position: relative;
89
+ text-align: center;
90
+ max-width: 640px;
91
+ font-size: 75%;
92
+ flex-direction: column;
93
+ @media only screen and (min-width: 480px){
94
+ font-size: 100%;
95
+ flex-direction: row;
96
+ }
97
+ img {
98
+ align-self: flex-start;
99
+ margin: 0 auto;
100
+ max-width: 100%;
101
+ width: auto;
102
+ max-height: 160px;
103
+ }
104
+ &.tiny {
105
+ position: fixed;
106
+ bottom: 48px;
107
+ right: 0;
108
+ background-color: white;
109
+ border-radius: 100%;
110
+ line-height: 100%;
111
+ cursor: pointer;
112
+ padding: 2px;
113
+ border: 1px solid grey;
114
+ width: 64px;
115
+ height: 64px;
116
+ @media only screen and (max-width: 479px){
117
+ width: 42px;
118
+ height: 42px;
119
+ }
120
+ }
121
+
122
+ .bubble {
123
+ position: static;
124
+ margin: 8px;
125
+ .inner {
126
+ border-radius: 12px;
127
+ color: $dark-color;
128
+ padding: 8px;
129
+ border: 1px solid grey;
130
+ background-color: white;
131
+ }
132
+ }
133
+
134
+ .close {
135
+ font-size: 140%;
136
+ position: absolute;
137
+ top: 0;
138
+ right: 0;
139
+ cursor: pointer;
140
+ }
141
+ }
142
+
143
+ .model-list {
144
+ max-height: 30vh;
145
+
146
+ @media only screen and (min-height: 768px){
147
+ max-height:50vh;
148
+ }
149
+ overflow-y: scroll;
150
+ overflow-x: hidden;
151
+ padding: 0 8px;
152
+ background-color: white;
153
+ border-radius: 5px;
154
+ margin: 20px 0;
155
+
156
+ h2 {
157
+ margin-bottom: 10px;
158
+ }
159
+ .btns {
160
+ opacity: 0.35;
161
+ }
162
+
163
+ ul {
164
+ list-style: none;
165
+ margin: 0;
166
+ padding: 0;
167
+ display: flex;
168
+ flex-direction: column;
169
+ li {
170
+ flex: 1;
171
+ display: flex;
172
+ cursor: pointer;
173
+ padding: 10px;
174
+ align-items: center;
175
+ border-bottom: 1px solid #eee;
176
+
177
+ &:last-child {
178
+ border-bottom: none;
179
+ }
180
+
181
+ &:hover, &.active {
182
+ background-color: #f5f5f5;
183
+ transform: translateX(2px);
184
+ transition: transform 0.2s ease;
185
+
186
+ .btns {
187
+ opacity: 1;
188
+ &:hover {
189
+ opacity: 1;
190
+ }
191
+ button {
192
+ }
193
+ }
194
+ }
195
+ }
196
+ }
197
+ }
198
+
199
+ form, .form {
200
+ background-color: white;
201
+ border-radius: 12px;
202
+ box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1);
203
+
204
+ padding: 16px;
205
+
206
+ label {
207
+ display: block;
208
+ margin-bottom: 0;
209
+ color: $primary-color;
210
+ font-weight: 500;
211
+ }
212
+
213
+
214
+ input,
215
+ textarea,
216
+ select {
217
+ width: 100%;
218
+ max-width: 100%;
219
+ padding: 10px;
220
+ border: 1px solid #ccc;
221
+ border-radius: 5px;
222
+ box-sizing: border-box;
223
+ transition: border-color 0.3s ease, box-shadow 0.3s ease;
224
+ &:focus, &:-webkit-autofill {
225
+ border-color: $secondary-color;
226
+ background-color: #eaeaea !important;
227
+ outline: none;
228
+ }
229
+
230
+ &:focus {
231
+ box-shadow: 0 0 5px rgba(var(--input-focus-border-color), 0.5); /* Added a glow effect */
232
+ outline: none; /* Removed the default outline */
233
+ }
234
+
235
+ &.input-fit {
236
+ flex: 1
237
+ }
238
+ }
239
+
240
+ textarea {
241
+ height: 120px;
242
+ }
243
+ input[type=number]{
244
+ max-width: 150px;
245
+ }
246
+
247
+ .btn {
248
+ background-color: $primary-color;
249
+ color: white;
250
+ padding: 10px 20px;
251
+ border: none;
252
+ border-radius: 5px;
253
+ cursor: pointer;
254
+ transition: background-color 0.3s ease, transform 0.2s ease; /* Added transitions */
255
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); /* Added a subtle shadow */
256
+ &:hover {
257
+ transform: translateY(-2px); /* Added a slight lift effect */
258
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.2); /* Increased shadow on hover */
259
+ }
260
+ &:active {
261
+ transform: translateY(1px); /* Added a slight push effect */
262
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); /* Reduced shadow on click */
263
+ }
264
+ }
265
+ }
266
+
267
+
268
+ input,
269
+ textarea, select {
270
+ background-color: #f0f0f0; // Gris légèrement plus foncé au survol
271
+ border-color: #ccc;
272
+ color: black;
273
+ }
274
+
275
+ input,
276
+ textarea {
277
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); // Ombre légère
278
+ }
279
+
280
+ input[type=checkbox]{
281
+ box-shadow: none;
282
+ }
283
+ select {
284
+ height: 3em;
285
+ max-width: 480px;
286
+ }
287
+ input[type=checkbox]{
288
+ width: auto;
289
+ }
290
+ input[type="datetime-local"]::-webkit-calendar-picker-indicator, input[type="date"]::-webkit-calendar-picker-indicator {
291
+ cursor: pointer;
292
+ border-radius: 4px;
293
+ color-scheme: light;
294
+ padding: 6px;
295
+ margin: 0;
296
+ &:hover {
297
+ color-scheme: dark;
298
+ background-color: $primary-color;
299
+ }
300
+ }
301
+
302
+ input[type=color] {
303
+ padding: 0 2px;
304
+ min-width: 80px;
305
+ height: 30px;
306
+ }
307
+ .models {
308
+ width: 100%;
309
+ @media only screen and (min-width: 1024px){
310
+ max-width: 320px;
311
+ }
312
+ }
313
+
314
+ table {
315
+ background-color: white;
316
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
317
+ width: 100%;
318
+ border-collapse: collapse;
319
+ text-align: center;
320
+ border: 1px solid #ddd; /* Added a border */
321
+ border-radius: 8px; /* Added rounded corners */
322
+ overflow: hidden; /* Hide overflow for rounded corners */
323
+ th, td {
324
+ word-wrap: break-word;
325
+ padding: 12px; /* Increased padding */
326
+ border-bottom: 1px solid #eee; /* Changed the border style */
327
+ max-width: 480px;
328
+ }
329
+ thead tr {
330
+ background-color: #f3f3f3;
331
+ th:not(:first-child) {
332
+ border-left: 1px solid #ddd;
333
+ }
334
+ th:hover{
335
+ background-color: #f3f3f3;
336
+ }
337
+ }
338
+ tr {
339
+ &:nth-child(even) {
340
+ background-color: #f8f8f8;
341
+ }
342
+ &:hover {
343
+ background-color: #f1f1f1;
344
+ }
345
+ }
346
+ td {
347
+ border: 1px dotted #cccccc;
348
+ &.notmet {
349
+ background:#ffeedb8f;
350
+ }
351
+ }
352
+ }
353
+
354
+ dt {
355
+ font-weight: bold;
356
+ }
357
+ dd {
358
+ font-size: 100%;
359
+ margin-bottom: 16px;
360
+ }
361
+
362
+ .datatable {
363
+ width: 100%;
364
+ .reversed {
365
+ .flex.flex-row {
366
+ flex-direction: column-reverse;
367
+ }
368
+ }
369
+ tr:not(.reversed) th {
370
+ border-bottom-right-radius: 0;
371
+ border-bottom-left-radius: 0;
372
+ }
373
+ .reversed th {
374
+ border-top-right-radius: 0;
375
+ border-top-left-radius: 0;
376
+ }
377
+ table{
378
+ background-color: transparent;
379
+ }
380
+ .rte img {
381
+ max-width: 100%;
382
+ }
383
+ > .table-wrapper{
384
+ overflow-x: auto;
385
+ }
386
+ th {
387
+ padding: 4px;
388
+ min-width: 100px;
389
+ }
390
+ }
391
+ /* ensures the increment/decrement arrows always display */
392
+ input[type=number]::-webkit-inner-spin-button,
393
+ input[type=number]::-webkit-outer-spin-button {
394
+ opacity: 1;
395
+ }
396
+
397
+ form .field {
398
+ width: 100%;
399
+ .help {
400
+ color: #575757;
401
+ padding: 4px;
402
+ }
403
+ }
404
+
405
+ form .field-checkbox {
406
+ .inline {
407
+ display: flex;
408
+ text-align: left;
409
+ }
410
+ label {
411
+ flex:1;
412
+ cursor: pointer;
413
+ }
414
+ input {
415
+ cursor: pointer;
416
+ }
417
+ }
418
+
419
+ form .field-checkbox {
420
+ .inline2 {
421
+ flex-direction: row-reverse;
422
+ }
423
+ }
424
+
425
+ label + .field, label + input, label + select {
426
+ margin-bottom: 12px;
427
+ }
428
+ .flex {
429
+ > label + .field, label + input, label + select {
430
+ margin-bottom: 0;
431
+ }
432
+ }
433
+
434
+ .field-relation {
435
+ position: relative;
436
+ width: fit-content;
437
+ margin-bottom: 16px;
438
+ .inner {
439
+ display: flex;
440
+ width: auto;
441
+ position: relative;
442
+ }
443
+ input[type=text]{
444
+ height: 3em;
445
+ }
446
+ select {
447
+ display: none;
448
+ }
449
+ .results {
450
+ position: absolute;
451
+ top: 2.8em;
452
+ z-index: 10;
453
+ width: 100%;
454
+ background-color: white;
455
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
456
+ left: 0;
457
+ max-height: 220px;
458
+ overflow-y: auto;
459
+ }
460
+ .selected-values {
461
+ width: 100%;
462
+ .selected-value {
463
+ width: 100%;
464
+ padding: 4px;
465
+ margin: 0;
466
+ &:hover {
467
+ background-color: #F8F8F8;
468
+ }
469
+ }
470
+ }
471
+ .item{
472
+ cursor: pointer;
473
+ padding: 4px;
474
+ &:hover {
475
+ background-color: #F8F8F8;
476
+ }
477
+ }
478
+ }
479
+
480
+ .cursor-pointer {
481
+ cursor: pointer;
482
+ }
483
+
484
+ .datas {
485
+ flex: 1;
486
+ min-width: 320px;
487
+ @media only screen and (min-width: 480px){
488
+ min-width: 480px;
489
+ }
490
+ }
491
+
492
+
493
+ /* website*/
494
+ #content {
495
+ margin-top: 40px;
496
+ padding: 0;
497
+ h1 {
498
+ margin: 24px 8px;
499
+ }
500
+ h2 {
501
+ margin: 20px 4px;
502
+ }
503
+ h3 {
504
+ margin: 16px 4px;
505
+ }
506
+ h4 {
507
+ margin: 12px 2px;
508
+ }
509
+ h5 {
510
+ margin: 8px 2px;
511
+ }
512
+ h6 {
513
+ margin: 2px;
514
+ }
515
+ }
516
+ .languages {
517
+ display: none;
518
+ gap: 8px;
519
+ @media only screen and (min-width: 480px){
520
+ display: flex;
521
+ }
522
+ .field {
523
+ margin: 0 auto;
524
+ select {
525
+ max-width: 180px;
526
+ margin: 0;
527
+ }
528
+ }
529
+ }
530
+ .sections {
531
+ display: flex;
532
+ gap: 16px;
533
+ align-items: center;
534
+ }
535
+ .blocs-prez{
536
+ display: grid;
537
+ grid-template-columns: repeat(auto-fit, minmax(364px, 1fr));
538
+ gap: 64px;
539
+ margin-top: 2rem;
540
+ @media only screen and (min-width: 480px){
541
+ padding: 0px 32px;
542
+ }
543
+ }
544
+
545
+ #content .bloc-prez {
546
+ &.tech{
547
+ align-self: flex-start;
548
+ }
549
+ ul {
550
+ list-style: none;
551
+ padding: 0;
552
+ margin-top: 1rem;
553
+
554
+ li {
555
+ margin-bottom: 0.5rem;
556
+ position: relative;
557
+ padding-left: 1.5rem;
558
+
559
+ &::before {
560
+ content: '✓';
561
+ position: absolute;
562
+ left: 0;
563
+ color: $secondary-color;
564
+
565
+ }
566
+ }
567
+ }
568
+
569
+ background-color: white;
570
+ border-radius: 12px;
571
+ padding: 2rem;
572
+ box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1);
573
+ transition: transform 0.3s ease;
574
+ box-sizing: border-box;
575
+
576
+ &:hover {
577
+ transform: translateY(-5px);
578
+ }
579
+ img {
580
+ display: block; // Pour que la transformation s'applique bien
581
+ transition: transform 0.3s ease-out;
582
+ &:hover {
583
+ transform: scale(1.03); // Léger zoom sur l'image au survol
584
+ }
585
+ }
586
+ h2 {
587
+ color: $dark-gray;
588
+ margin-top: 0;
589
+ margin-bottom: 15px;
590
+ border-bottom: none; // Enlever la bordure par défaut si non désirée ici
591
+ }
592
+ position: relative;
593
+ .icon-header {
594
+ font-size: 3rem;
595
+ color: $primary-color;
596
+ margin-bottom: 1rem;
597
+ position: absolute;
598
+ top: -25px;
599
+ right: 20px;
600
+ opacity: 0.8;
601
+ @media only screen and (min-width: 480px){
602
+ right: -28px;
603
+ top: -32px;
604
+ font-size: 350%;
605
+ }
606
+ }
607
+
608
+ img {
609
+ border-radius: 8px; // Coins arrondis pour l'image
610
+ margin-bottom: 15px;
611
+ max-width: 100%;
612
+ height: auto; // Assurer la proportion
613
+ }
614
+ .logolink {
615
+ flex: 1;
616
+ min-width: 128px;
617
+ }
618
+ .logolinks {
619
+ flex-wrap: wrap;
620
+ }
621
+ }
622
+
623
+ .rtl #content .bloc-prez {
624
+ ul {
625
+ li {
626
+ &::before{
627
+ right: -20px;
628
+ }
629
+ }
630
+ }
631
+ }
632
+ .rtl {
633
+ direction: rtl;
634
+ }
635
+ .ltr {
636
+ direction: ltr;
637
+ }
638
+ .hint {
639
+ white-space: break-spaces;
640
+ max-width: 720px;
641
+ font-size: 90%;
642
+ margin: 0 0 4px 0;
643
+ padding: 2px 10px;
644
+ background: #f9f9f9;
645
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
646
+ }
647
+
648
+ .hint-icon {
649
+ color: $primary-color;
650
+ cursor: pointer;
651
+ display: flex;
652
+ }
653
+
654
+ .rte {
655
+ width: 100%;
656
+ padding: 8px;
657
+ border: 1px solid #ccc;
658
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
659
+ button {
660
+ padding: 2px 4px;
661
+ &.is-active {
662
+ background-color: $primary-color-darker;
663
+ color: white;
664
+ }
665
+ }
666
+
667
+ }
668
+
669
+ .rte-value {
670
+ width: 100%;
671
+ display: block;
672
+ overflow-x: hidden;
673
+ overflow-y: auto;
674
+ max-height: 250px;
675
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
676
+ }
677
+
678
+ .model-desc {
679
+ margin: 20px 0;
680
+ }
681
+
682
+
683
+
684
+ a {
685
+ font-weight: 500;
686
+ color: $primary-color;
687
+ text-decoration: inherit;
688
+ }
689
+ a:hover {
690
+ color: #1e669a;
691
+ }
692
+
693
+ .api-info {
694
+ background-color: #fff;
695
+ border-radius: 5px;
696
+ padding: 20px;
697
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
698
+ margin-top: 20px;
699
+ h2 {
700
+ color: $primary-color;
701
+ }
702
+
703
+ h3 {
704
+ margin-top: 10px;
705
+ }
706
+
707
+ h4{
708
+ margin-bottom: 4px;
709
+ }
710
+
711
+ .query {
712
+ }
713
+
714
+ .endpoint {
715
+ font-weight: bold;
716
+ color: $primary-color;
717
+ }
718
+ .api-endpoints {
719
+ .api-endpoint {
720
+ margin-bottom: 15px;
721
+ padding: 10px;
722
+ border: 1px solid #eee;
723
+ border-radius: 5px;
724
+
725
+ .response {
726
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
727
+ padding: 4px;
728
+ background-color: white;
729
+ }
730
+ .method {
731
+ font-weight: bold;
732
+ font-size: 120%;
733
+ margin-right: 10px;
734
+ padding: 2px 5px;
735
+ border-radius: 3px;
736
+ &::before{
737
+ content: '[';
738
+ }
739
+ &::after{
740
+ content: ']';
741
+ }
742
+ &.GET {
743
+ background-color: #2ecc71;
744
+ color: #fff;
745
+ }
746
+ &.POST {
747
+ background-color: #3498db;
748
+ color: #fff;
749
+ }
750
+ &.PUT {
751
+ background-color: #f39c12;
752
+ color: #fff;
753
+ }
754
+ &.DELETE {
755
+ background-color: #e74c3c;
756
+ color: #fff;
757
+ }
758
+ }
759
+
760
+ .description {
761
+ margin-top: 5px;
762
+ }
763
+ pre{
764
+ white-space: pre-wrap;
765
+ max-width: 100%;
766
+ overflow: auto;
767
+ background-color: #f8f8f8;
768
+ }
769
+ }
770
+ }
771
+ }
772
+
773
+ .dialog-modal {
774
+ max-width: 720px;
775
+ width: 100%;
776
+ }
777
+
778
+ .fs-mini {
779
+ word-break: break-all;
780
+ direction: ltr;
781
+ overflow-wrap: break-word;
782
+ font-size: 90%;
783
+
784
+ line-height: 70%;
785
+ max-height: 480px;
786
+ overflow-y: scroll;
787
+ code{
788
+ white-space: pre-wrap !important;
789
+ }
790
+ }
791
+
792
+ .fs-regular{
793
+ font-size: 140%;
794
+ }
795
+
796
+ .data-add {
797
+ flex: 1;
798
+ min-width: 320px;
799
+ }
800
+
801
+ .mg-1 {
802
+ margin: 8px;
803
+ }
804
+ .mg-v-1 {
805
+ margin: 8px 0 ;
806
+ }
807
+ .mg-h-1 {
808
+ margin: 0 8px;
809
+ }
810
+ .mg-2 {
811
+ margin: 16px;
812
+ }
813
+
814
+ span.required {
815
+ color: red;
816
+ font-weight: bold;
817
+ }
818
+
819
+ .primalsbar .left {
820
+ font-size: 80%;
821
+ .website{
822
+ direction: ltr;
823
+ }
824
+ .rtl .website .title{
825
+ direction: ltr;
826
+ }
827
+ @media only screen and (min-width: 480px){
828
+ font-size: 100%;
829
+ }
830
+ .svg {
831
+ max-width: 32px;
832
+ }
833
+ a {
834
+ color: rgb(52, 152, 219);
835
+ }
836
+ }
837
+
838
+
839
+ label{
840
+ padding: 4px;
841
+ }
842
+ .checkbox-label {
843
+ background: #f0f0f0;
844
+ cursor: pointer;
845
+ border: 1px solid transparent;
846
+ &:hover,&:focus,&:active {
847
+ border: 1px solid #c8c8c8;
848
+ }
849
+ margin: 8px 0;
850
+ input {
851
+ margin-left: auto;
852
+ }
853
+ }
854
+
855
+ .flex.actions {
856
+ margin: 16px 0;
857
+ justify-content: center;
858
+ gap: 8px;
859
+ display: flex;
860
+ &.left {
861
+ justify-content: flex-start;
862
+ }
863
+ &.center {
864
+ justify-content: center;
865
+ }
866
+ }
867
+
868
+ h1 {
869
+ text-align: center;
870
+ padding: 8px;
871
+ @media only screen and (min-width: 480px){
872
+ padding: 16px;
873
+ font-size: 200%;
874
+ }
875
+ }
876
+
877
+ .hidden-anchor {
878
+ scroll-margin: 50px;
879
+ @media only screen and (min-width: 1024px){
880
+ position: relative;
881
+ }
882
+ }
883
+
884
+ footer {
885
+ margin-top: 40px; // Espace avant le footer
886
+ padding: 20px;
887
+ text-align: center;
888
+ color: $dark-gray;
889
+ border-top: 1px solid $medium-gray;
890
+ svg {
891
+ vertical-align: middle;
892
+ }
893
+ }
894
+
895
+ .ui {
896
+ pointer-events: all;
897
+ }
898
+ .ui-locked {
899
+ pointer-events: none;
900
+ }
901
+
902
+ .model-importer-item {
903
+ border: 1px solid #dedede;
904
+ padding: 8px;
905
+ margin: 24px 0;
906
+ cursor: pointer;
907
+ label {
908
+ margin: 8px;
909
+ font-size: 120%;
910
+ font-weight: bolder;
911
+ }
912
+ &:hover,&.active {
913
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
914
+ background-color: white;
915
+ label {
916
+ }
917
+ }
918
+ }
919
+
920
+ .break-word {
921
+ word-break: break-word;
922
+ }
923
+
924
+ .filter-active .filter-field {
925
+ > .flex {
926
+ width: 100%;
927
+ min-height: 122px;
928
+ }
929
+ }
930
+ .filter-field {
931
+ align-items: flex-end;
932
+ overflow: hidden;
933
+ .title{
934
+ text-overflow: ellipsis;
935
+ overflow: hidden;
936
+ white-space: nowrap;
937
+ max-width: 460px;
938
+ padding: 0 4px;
939
+ }
940
+ .filter {
941
+ width: 100%;
942
+ label, input, select {
943
+ margin: 4px;
944
+ width: 100%;
945
+ }
946
+ > .flex {
947
+ width: 100%;
948
+ }
949
+ }
950
+ button {
951
+ opacity: 0.4;
952
+ }
953
+ button.active {
954
+ opacity: 1;
955
+ }
956
+ }
957
+ .filter {
958
+ .field {
959
+ flex:1;
960
+ }
961
+ }
962
+
963
+
964
+ .link-value {
965
+ width: 350px;
966
+ overflow: hidden;
967
+ white-space: nowrap;
968
+ display: block;
969
+ text-overflow: ellipsis;
970
+ margin: 0 auto;
971
+ }
972
+
973
+ #ui .msg {
974
+ padding: 8px;
975
+ margin: 16px 0;
976
+ }
977
+ #ui .msg.msg-info {
978
+ background-color: #2f7caf;
979
+ color: #fdfdfd;
980
+ }
981
+ #ui .msg.msg-valid {
982
+ background-color: #4f9b2a;
983
+ color: #fdfdfd;
984
+ }
985
+
986
+ .shadow{
987
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
988
+ background-color: white;
989
+ }
990
+
991
+ h2.shadow {
992
+ padding: 8px;
993
+ color: #727272;
994
+ }
995
+ .model-importer-item {
996
+ label {
997
+ color: #898989;
998
+ }
999
+ &.active {
1000
+ label {
1001
+ color: #727272;
1002
+ }
1003
+ }
1004
+ }
1005
+
1006
+ .mini input[type=checkbox] {
1007
+ cursor: pointer;
1008
+ width: 15px;
1009
+ height: 15px;
1010
+ }
1011
+
1012
+ .pagination-wrapper {
1013
+ justify-self: flex-end;
1014
+ .pagination {
1015
+ flex:1;
1016
+ }
1017
+ .elementsPerPage {
1018
+ padding: 8px;
1019
+ font-size: 80%;
1020
+ input {
1021
+ max-width: 60px;
1022
+ }
1023
+ }
1024
+ }
1025
+
1026
+ .spinner-loader{
1027
+ display: block;
1028
+ position: relative;
1029
+ height: 10px;
1030
+ width: 70px;
1031
+ background-image:
1032
+ linear-gradient(#3c3c3c 20px, transparent 0),
1033
+ linear-gradient(#3c3c3c 20px, transparent 0),
1034
+ linear-gradient(#3c3c3c 20px, transparent 0),
1035
+ linear-gradient(#3c3c3c 20px, transparent 0);
1036
+ background-repeat: no-repeat;
1037
+ background-size: 10px auto;
1038
+ background-position: 0 0, 20px 0, 40px 0, 60px 0;
1039
+ animation: pgfill 1s linear infinite;
1040
+ }
1041
+ @keyframes pgfill {
1042
+ 0% { background-image: linear-gradient(#3c3c3c 10px, transparent 0), linear-gradient(#3c3c3c 10px, transparent 0), linear-gradient(#3c3c3c 10px, transparent 0), linear-gradient(#3c3c3c 10px, transparent 0); }
1043
+ 25% { background-image: linear-gradient(#686868 10px, transparent 0), linear-gradient(#3c3c3c 10px, transparent 0), linear-gradient(#3c3c3c 10px, transparent 0), linear-gradient(#3c3c3c 10px, transparent 0); }
1044
+ 50% { background-image: linear-gradient(#3c3c3c 10px, transparent 0), linear-gradient(#686868 10px, transparent 0), linear-gradient(#3c3c3c 10px, transparent 0), linear-gradient(#3c3c3c 10px, transparent 0); }
1045
+ 75% { background-image: linear-gradient(#3c3c3c 10px, transparent 0), linear-gradient(#3c3c3c 10px, transparent 0), linear-gradient(#686868 10px, transparent 0), linear-gradient(#3c3c3c 10px, transparent 0); }
1046
+ 100% { background-image: linear-gradient(#3c3c3c 10px, transparent 0), linear-gradient(#3c3c3c 10px, transparent 0), linear-gradient(#3c3c3c 10px, transparent 0), linear-gradient(#686868 10px, transparent 0); }
1047
+ }
1048
+
1049
+ .datas .relation-value {
1050
+ background: #ededed;
1051
+ color: #5a5a5a;
1052
+ border-radius: 9px;
1053
+ cursor: pointer;
1054
+ padding: 2px 8px 2px 8px;
1055
+ &:hover {
1056
+ box-shadow: none;
1057
+ outline: 1px solid #5a5a5a;
1058
+ }
1059
+
1060
+ }
1061
+
1062
+ .condition-details {
1063
+ padding-left: 20px; // Indentation
1064
+ border-left: 2px solid #eee; // Ligne visuelle
1065
+ margin-left: 10px;
1066
+ margin-top: 5px;
1067
+ margin-bottom: 10px;
1068
+ gap: 5px; // Espacement entre les éléments de condition
1069
+ }
1070
+
1071
+ .code-editor-wrapper {
1072
+ position: relative;
1073
+ min-height: 200px;
1074
+ }
1075
+ .code-editor {
1076
+ position: absolute;
1077
+ left: 0;
1078
+ top: 0;
1079
+ width: 100%;
1080
+ height: 100%;
1081
+ margin: 0;
1082
+ padding: 0;
1083
+ overflow: hidden;
1084
+ }
1085
+
1086
+ .code {
1087
+ text-align: left;
1088
+ font-size: 75%;
1089
+ direction: ltr;
1090
+ }
1091
+
1092
+ .react-tooltip{
1093
+ z-index: 9999;
1094
+ max-width: 280px;
1095
+ }
1096
+ .profiles {
1097
+ width: 100%;
1098
+ .profile-link {
1099
+ margin: 0;
1100
+ padding: 0;
1101
+ display: flex;
1102
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
1103
+ }
1104
+ }
1105
+
1106
+ .ws-pre-line {
1107
+ white-space: pre-line;
1108
+ }
1109
+
1110
+ form .cm-editor {
1111
+ max-width: 600px;
1112
+ }
1113
+
1114
+ td .gallery{
1115
+ width: 360px;
1116
+ display: flex;
1117
+ gap: 4px;
1118
+ }
1119
+
1120
+ .image {
1121
+ width: 100%;
1122
+ max-width: 256px;
1123
+ }
1124
+
1125
+ .codefield {
1126
+ width: 100%;
1127
+ direction: ltr;
1128
+
1129
+ }
1130
+
1131
+ .react-international-phone-country-selector {
1132
+ width: 44px;
1133
+ }
1134
+ .datatable .react-international-phone-country-selector-dropdown {
1135
+ position: static;
1136
+ }
1137
+
1138
+ select[multiple]{
1139
+ height: 250px;
1140
+ min-width: 280px;
1141
+ }
1142
+
1143
+ // Exemple de styles pour ModelList
1144
+ .model-list-container {
1145
+ display: flex;
1146
+ flex-direction: column;
1147
+ gap: 1rem; // Espace entre la barre de recherche et la liste
1148
+
1149
+ .model-list-search-bar-container {
1150
+ margin-top: 12px;
1151
+ // background-color: #f8f9fa; // Optionnel: un fond léger
1152
+ // border-bottom: 1px solid #dee2e6; // Optionnel: une bordure
1153
+ }
1154
+
1155
+ .model-list-search-input {
1156
+ width: 100%;
1157
+ padding: 0.5rem 0.75rem;
1158
+ font-size: 1rem;
1159
+ border: 1px solid #ced4da;
1160
+ border-radius: 0.25rem;
1161
+ box-sizing: border-box; // Important pour que padding ne s'ajoute pas à la largeur
1162
+
1163
+ &:focus {
1164
+ border-color: #80bdff;
1165
+ outline: 0;
1166
+ box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
1167
+ }
1168
+ }
1169
+
1170
+ .model-list {
1171
+ list-style: none;
1172
+ padding: 0;
1173
+ margin: 0;
1174
+ overflow-y: auto;
1175
+
1176
+ .model-list-item {
1177
+ padding: 0.75rem 1rem;
1178
+ border-bottom: 1px solid #eee;
1179
+ cursor: pointer;
1180
+ transition: background-color 0.2s ease-in-out;
1181
+
1182
+ &:last-child {
1183
+ border-bottom: none;
1184
+ }
1185
+
1186
+ &:hover {
1187
+ background-color: #f1f1f1;
1188
+ }
1189
+
1190
+ &.selected {
1191
+ background-color: #007bff;
1192
+ color: white;
1193
+ font-weight: bold;
1194
+
1195
+ .model-item-description { // Si vous affichez la description
1196
+ color: #e0e0e0;
1197
+ }
1198
+ }
1199
+
1200
+ .model-name {
1201
+ display: block; // Ou flex pour aligner avec description
1202
+ }
1203
+ .model-item-description {
1204
+ font-size: 0.85em;
1205
+ color: #6c757d;
1206
+ margin-top: 0.25rem;
1207
+ display: block;
1208
+ }
1209
+ }
1210
+ }
1211
+
1212
+ .no-models-found, .loading-models {
1213
+ padding: 1rem;
1214
+ text-align: center;
1215
+ color: #6c757d;
1216
+ }
1217
+ }
1218
+ #content .home-header {
1219
+ background: #126f9b;
1220
+ color: white;
1221
+ flex-direction: column;
1222
+ padding: 16px 4px;
1223
+ box-sizing: border-box;
1224
+ width: 100%;
1225
+ gap:8px;
1226
+
1227
+ .link-top {
1228
+ text-align: right;
1229
+ width: 100%;
1230
+ }
1231
+ @media only screen and (min-width: 480px){
1232
+ padding: 30px;
1233
+ }
1234
+ h1 {
1235
+ margin: 0;
1236
+ color: white;
1237
+ font-size: 140%;
1238
+ }
1239
+ > * {
1240
+ flex:1;
1241
+ }
1242
+ }
1243
+
1244
+ .badge {
1245
+ background-color: #d9d9d9;
1246
+ padding: 4px 16px;
1247
+ border-radius: 16px;
1248
+ border: 1px solid #929292;
1249
+ }
1250
+
1251
+ .yarl__portal {
1252
+ z-index: 9999999 !important;
1253
+ }
1254
+
1255
+ .data-add {
1256
+ input[type=text], input[type=password]{
1257
+ min-width: 240px;
1258
+ }
1259
+ }
1260
+
1261
+ .model-creator {
1262
+ .field-checkbox {
1263
+ .inline {
1264
+ flex-direction: row-reverse;
1265
+ }
1266
+ }
1267
+ }
1268
+
1269
+ .datalayout {
1270
+ padding: 0 16px;
1271
+ }
1272
+
1273
+ .main-menu {
1274
+ padding: 16px 0;
1275
+ @media only screen and (max-width: 479px) {
1276
+ &.flex.flex-centered{
1277
+ width: 100%;
1278
+ }
1279
+ }
1280
+ .btn.btn-nav {
1281
+ @media only screen and (max-width: 479px) {
1282
+ display: block;
1283
+ width: 100%;
1284
+ margin: 0;
1285
+ border-radius: 0;
1286
+ padding: 5px;
1287
+ }
1288
+ }
1289
+ }
1290
+
1291
+
1292
+ // client/src/AIHomePagePrompt.scss
1293
+ .ai-home-prompt-section {
1294
+ background-color: #f4f7f9;
1295
+ border-radius: 8px;
1296
+ text-align: center;
1297
+ margin: 0 auto;
1298
+ max-width: 700px;
1299
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
1300
+
1301
+ padding: 1rem;
1302
+ @media only screen and (min-width: 480px){
1303
+ padding: 2rem;
1304
+ }
1305
+ textarea {
1306
+ width: 100%;
1307
+ min-height: 120px;
1308
+ margin-bottom: 1.5rem;
1309
+ padding: 8px;
1310
+ }
1311
+
1312
+ button {
1313
+ padding: 12px 24px;
1314
+ font-size: 1rem;
1315
+ cursor: pointer;
1316
+ }
1317
+ }
1318
+
1319
+ #content .ai-home-prompt-section{
1320
+
1321
+ h2 {
1322
+ margin: 0 0 1.5rem 0;
1323
+ font-size: 110%;
1324
+ color: $primary-color;
1325
+ @media only screen and (min-width: 480px){
1326
+ font-size: 140%;
1327
+ }
1328
+ }
1329
+ }
1330
+
1331
+ .home-header {
1332
+ background: linear-gradient(135deg, #126f9b 0%, #0d4b6e 100%);
1333
+ color: white;
1334
+ padding: 4rem 2rem;
1335
+ text-align: center;
1336
+ position: relative;
1337
+ overflow: hidden;
1338
+
1339
+ h1 {
1340
+ font-size: 3rem;
1341
+ font-weight: 700;
1342
+ margin-bottom: 1rem;
1343
+ text-shadow: 0 2px 4px rgba(0,0,0,0.2);
1344
+ position: relative;
1345
+ }
1346
+
1347
+ .message-rotator {
1348
+ font-size: 1.2rem;
1349
+ margin: 2rem auto;
1350
+ max-width: 800px;
1351
+ padding: 1rem;
1352
+ background: rgba(255,255,255,0.1);
1353
+ border-radius: 50px;
1354
+ backdrop-filter: blur(5px);
1355
+ }
1356
+ }
1357
+
1358
+
1359
+ .btn {
1360
+ transition: all 0.3s ease;
1361
+ position: relative;
1362
+ overflow: hidden;
1363
+
1364
+ &::after {
1365
+ content: '';
1366
+ position: absolute;
1367
+ top: 50%;
1368
+ left: 50%;
1369
+ width: 5px;
1370
+ height: 5px;
1371
+ background: rgba(255,255,255,0.5);
1372
+ opacity: 0;
1373
+ border-radius: 100%;
1374
+ transform: scale(1, 1) translate(-50%, -50%);
1375
+ transform-origin: 50% 50%;
1376
+ }
1377
+
1378
+ &:hover::after {
1379
+ animation: ripple 1s ease-out;
1380
+ }
1381
+ }
1382
+
1383
+ @keyframes ripple {
1384
+ 0% {
1385
+ transform: scale(0, 0);
1386
+ opacity: 0.5;
1387
+ }
1388
+ 100% {
1389
+ transform: scale(20, 20);
1390
+ opacity: 0;
1391
+ }
1392
+ }
1393
+
1394
+ .suggested-prompts {
1395
+ text-align: left;
1396
+ color: $dark-gray;
1397
+
1398
+ p {
1399
+ font-weight: 500;
1400
+ margin-bottom: 0.75rem;
1401
+ color: lighten($dark-gray, 30%);
1402
+ }
1403
+
1404
+ ul {
1405
+ list-style: none;
1406
+ padding: 0;
1407
+ margin: 0;
1408
+ display: grid;
1409
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
1410
+ gap: 1rem;
1411
+ }
1412
+
1413
+ li {
1414
+ background-color: #ffffff;
1415
+ padding: 1rem;
1416
+ border-radius: 6px;
1417
+ border: 1px solid $medium-gray;
1418
+ cursor: pointer;
1419
+ transition: all 0.2s ease-in-out;
1420
+ box-shadow: 0 2px 4px $shadow-color;
1421
+ display: flex;
1422
+ flex-direction: column;
1423
+
1424
+ &:hover {
1425
+ transform: translateY(-3px);
1426
+ box-shadow: 0 4px 8px $shadow-color-hover;
1427
+ border-color: $primary-color;
1428
+ }
1429
+
1430
+ strong {
1431
+ display: block;
1432
+ font-weight: 600;
1433
+ color: $primary-color;
1434
+ margin-bottom: 0.5rem;
1435
+ }
1436
+
1437
+ span {
1438
+ font-size: 0.9em;
1439
+ color: $dark-gray;
1440
+ line-height: 1.5;
1441
+ opacity: 0.9;
1442
+ flex-grow: 1; // Permet aux cartes d'une même ligne d'avoir la même hauteur
1443
+ }
1444
+ }
1445
+ }
1446
+
1447
+ .kpi-selection-list {
1448
+ list-style: none;
1449
+ padding: 0;
1450
+ margin: 0;
1451
+ max-height: 300px;
1452
+ overflow-y: auto;
1453
+ }
1454
+ .kpi-selection-list li {
1455
+ padding: 10px;
1456
+ border-bottom: 1px solid #eee;
1457
+ cursor: pointer;
1458
+ }
1459
+ .kpi-selection-list li:hover {
1460
+ background-color: #f5f5f5;
1461
+ }
1462
+ .kpi-selection-list li:last-child {
1463
+ border-bottom: none;
1464
+ }
1465
+
1466
+