@cnamts/synapse 1.0.26 → 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 (612) hide show
  1. package/README.md +1 -1
  2. package/dist/{AutocompleteFilter-BPR-a55G.js → AutocompleteFilter-DXd4szWO.js} +1 -1
  3. package/dist/{DateFilter-CknrJWs2.js → DateFilter-BD59Kgwf.js} +1 -1
  4. package/dist/{NumberFilter-DJ-yNlzv.js → NumberFilter-BSMZE7uw.js} +1 -1
  5. package/dist/{PeriodFilter-CiB5Oa9Z.js → PeriodFilter-keUdSSk0.js} +1 -1
  6. package/dist/{SelectFilter-EiafX97M.js → SelectFilter-Dhvvwazl.js} +1 -1
  7. package/dist/{TextFilter-BzOmpdxj.js → TextFilter-CU8FpXz0.js} +1 -1
  8. package/dist/apLightTheme2026-DbS7BPUf.js +612 -0
  9. package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +4 -4
  10. package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.d.ts +4 -4
  11. package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.d.ts +6 -6
  12. package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +4 -4
  13. package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +4 -4
  14. package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +4 -4
  15. package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +4 -4
  16. package/dist/components/CookiesSelection/CookiesInformation/CookiesInformation.d.ts +2 -2
  17. package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +2275 -487
  18. package/dist/components/Customs/Selects/SyAutocomplete/composables/useSyAutocompleteValidation.d.ts +18 -0
  19. package/dist/components/Customs/Selects/SyAutocomplete/utils/ariaManager.d.ts +1 -1
  20. package/dist/components/Customs/Selects/SyAutocomplete/utils/useKeyboardHandler.d.ts +3 -1
  21. package/dist/components/Customs/Selects/SyInputSelect/SyInputSelect.d.ts +1 -1
  22. package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +12 -15
  23. package/dist/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.d.ts +1 -0
  24. package/dist/components/Customs/Selects/SySelect/composables/useSySelectValidation.d.ts +15 -0
  25. package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +4 -4
  26. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +6 -6
  27. package/dist/components/Customs/SyIcon/SyIcon.d.ts +77 -1
  28. package/dist/components/Customs/SyIconButton/SyIconButton.d.ts +18 -0
  29. package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +23 -41
  30. package/dist/components/Customs/SyRadioGroup/composables/useSyRadioGroupValidation.d.ts +50 -0
  31. package/dist/components/Customs/SyTextField/SyTextField.d.ts +20 -80
  32. package/dist/components/Customs/SyTextField/locales.d.ts +7 -0
  33. package/dist/components/Customs/SyTextField/types.d.ts +67 -4
  34. package/dist/components/Customs/SyTextField/useNumberField.d.ts +23 -0
  35. package/dist/components/Customs/SyTextField/useSyTextFieldValidation.d.ts +38 -0
  36. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +253 -694
  37. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +121 -339
  38. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +54 -164
  39. package/dist/components/DatePicker/composables/index.d.ts +1 -0
  40. package/dist/components/DatePicker/composables/useDatePickerValidationBridge.d.ts +51 -0
  41. package/dist/components/FilterInline/FilterInline.d.ts +3 -3
  42. package/dist/components/FilterSideBar/FilterSideBar.d.ts +4 -4
  43. package/dist/components/MonthPicker/MonthPicker.d.ts +49 -162
  44. package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +49 -162
  45. package/dist/components/NirField/NirField.d.ts +120 -351
  46. package/dist/components/NirField/useNirValidation.d.ts +10 -20
  47. package/dist/components/PasswordField/PasswordField.d.ts +21 -40
  48. package/dist/components/PasswordField/locales.d.ts +2 -0
  49. package/dist/components/PasswordField/types.d.ts +16 -0
  50. package/dist/components/PasswordField/usePasswordFieldValidation.d.ts +38 -0
  51. package/dist/components/PeriodField/PeriodField.d.ts +485 -1365
  52. package/dist/components/PhoneField/PhoneField.d.ts +49 -162
  53. package/dist/components/SearchListField/SearchListField.d.ts +3 -3
  54. package/dist/components/SyTextArea/SyTextArea.d.ts +30 -17
  55. package/dist/components/SyTextArea/composables/useSyTextAreaValidation.d.ts +20 -0
  56. package/dist/components/SyTextArea/locales.d.ts +1 -0
  57. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +1 -0
  58. package/dist/components/Tables/SyTable/SyTable.d.ts +1 -0
  59. package/dist/components/Tables/common/SyTablePagination.d.ts +33 -34
  60. package/dist/components/Tables/common/types.d.ts +2 -0
  61. package/dist/components/index.d.ts +1 -0
  62. package/dist/composables/unifyValidation/documentationValidationProps.d.ts +160 -160
  63. package/dist/composables/unifyValidation/useValidation.d.ts +17 -23
  64. package/dist/composables/useFilterable/useFilterable.d.ts +1 -2
  65. package/dist/design-system-v3.js +81 -80
  66. package/dist/designTokens/tokens/amelipro/apContextual.d.ts +6 -6
  67. package/dist/designTokens/tokens/amelipro/apDarkTheme.d.ts +3 -1
  68. package/dist/designTokens/tokens/amelipro/apLightTheme.d.ts +54 -100
  69. package/dist/designTokens/tokens/baseContextualTokens.d.ts +0 -6
  70. package/dist/designTokens/tokens/baseTokens.d.ts +232 -0
  71. package/dist/designTokens/tokens/cnam/cnamContextual.d.ts +6 -6
  72. package/dist/designTokens/tokens/cnam/cnamDarkTheme.d.ts +1 -1
  73. package/dist/designTokens/tokens/cnam/cnamLightTheme.d.ts +57 -101
  74. package/dist/designTokens/tokens/pa/paContextual.d.ts +0 -6
  75. package/dist/designTokens/tokens/pa/paDarkTheme.d.ts +1 -1
  76. package/dist/designTokens/tokens/pa/paLightTheme.d.ts +54 -97
  77. package/dist/designTokens/tokens/pa/paSemantic.d.ts +1 -0
  78. package/dist/designTokens/tokens/semanticTokens.d.ts +112 -0
  79. package/dist/main-D8ryUoS5.js +39481 -0
  80. package/dist/synapse.css +1 -1
  81. package/dist/vuetifyConfig.js +212 -74
  82. package/package.json +8 -5
  83. package/src/assets/overrides/_icons.scss +5 -4
  84. package/src/assets/overrides/_otp.scss +4 -4
  85. package/src/assets/overrides/_typography.scss +2 -1
  86. package/src/assets/overrides/_utilities.scss +1 -42
  87. package/src/components/Accordion/tests/Accordion.visual.cy.ts +44 -0
  88. package/src/components/Accordion/tests/__snapshots__/accordion-default.snap.png +0 -0
  89. package/src/components/Accordion/tests/__snapshots__/accordion-disabled-item.snap.png +0 -0
  90. package/src/components/Accordion/tests/__snapshots__/accordion-open-first.snap.png +0 -0
  91. package/src/components/BackBtn/tests/__snapshots__/back-btn-custom-bg.snap.png +0 -0
  92. package/src/components/BackBtn/tests/__snapshots__/back-btn-default.snap.png +0 -0
  93. package/src/components/BackBtn/tests/__snapshots__/back-btn-no-icon.snap.png +0 -0
  94. package/src/components/BackToTopBtn/tests/BackToTopBtn.visual.cy.ts +34 -0
  95. package/src/components/BackToTopBtn/tests/__snapshots__/back-to-top-btn-custom-nudge.snap.png +0 -0
  96. package/src/components/BackToTopBtn/tests/__snapshots__/back-to-top-btn-default.snap.png +0 -0
  97. package/src/components/Captcha/tests/Captcha.visual.cy.ts +45 -0
  98. package/src/components/Captcha/tests/__snapshots__/Captcha.spec.ts.snap +4 -0
  99. package/src/components/Captcha/tests/__snapshots__/captcha-audio-type.snap.png +0 -0
  100. package/src/components/Captcha/tests/__snapshots__/captcha-image-type.snap.png +0 -0
  101. package/src/components/Captcha/tests/__snapshots__/captcha-no-helpdesk.snap.png +0 -0
  102. package/src/components/ChipList/ChipList.vue +30 -18
  103. package/src/components/ChipList/tests/ChipList.visual.cy.ts +46 -0
  104. package/src/components/ChipList/tests/__snapshots__/chip-list-default.snap.png +0 -0
  105. package/src/components/ChipList/tests/__snapshots__/chip-list-readonly.snap.png +0 -0
  106. package/src/components/ChipList/tests/__snapshots__/chip-list-state-icons.snap.png +0 -0
  107. package/src/components/ChipList/tests/chipList.spec.ts +4 -4
  108. package/src/components/CollapsibleList/tests/CollapsibleList.visual.cy.ts +33 -0
  109. package/src/components/CollapsibleList/tests/__snapshots__/collapsible-list-default.snap.png +0 -0
  110. package/src/components/CollapsibleList/tests/__snapshots__/collapsible-list-no-title.snap.png +0 -0
  111. package/src/components/ContextualMenu/tests/ContextualMenu.visual.cy.ts +35 -0
  112. package/src/components/ContextualMenu/tests/__snapshots__/contextual-menu-default.snap.png +0 -0
  113. package/src/components/ContextualMenu/tests/__snapshots__/contextual-menu-selected.snap.png +0 -0
  114. package/src/components/CookieBanner/tests/CookieBanner.visual.cy.ts +29 -0
  115. package/src/components/CookieBanner/tests/__snapshots__/cookie-banner-default.snap.png +0 -0
  116. package/src/components/CookieBanner/tests/__snapshots__/cookie-banner-with-items.snap.png +0 -0
  117. package/src/components/CookiesSelection/tests/CookiesSelection.visual.cy.ts +21 -0
  118. package/src/components/CookiesSelection/tests/__snapshots__/cookies-selection-default.snap.png +0 -0
  119. package/src/components/CopyBtn/CopyBtn.vue +2 -2
  120. package/src/components/CopyBtn/tests/CopyBtn.visual.cy.ts +24 -0
  121. package/src/components/CopyBtn/tests/__snapshots__/copy-btn-default.snap.png +0 -0
  122. package/src/components/CopyBtn/tests/__snapshots__/copy-btn-no-tooltip.snap.png +0 -0
  123. package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.stories.ts +4 -0
  124. package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.vue +7 -6
  125. package/src/components/Customs/Selects/SelectBtnField/tests/SelectBtnField.spec.ts +223 -0
  126. package/src/components/Customs/Selects/SelectBtnField/tests/SelectBtnField.visual.cy.ts +60 -0
  127. package/src/components/Customs/Selects/SelectBtnField/tests/__snapshots__/select-btn-field-default.snap.png +0 -0
  128. package/src/components/Customs/Selects/SelectBtnField/tests/__snapshots__/select-btn-field-inline.snap.png +0 -0
  129. package/src/components/Customs/Selects/SelectBtnField/tests/__snapshots__/select-btn-field-readonly.snap.png +0 -0
  130. package/src/components/Customs/Selects/SelectBtnField/tests/__snapshots__/select-btn-field-selected.snap.png +0 -0
  131. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +283 -351
  132. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +183 -219
  133. package/src/components/Customs/Selects/SyAutocomplete/composables/useSyAutocompleteValidation.ts +101 -0
  134. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +763 -1
  135. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.visual.cy.ts +63 -0
  136. package/src/components/Customs/Selects/SyAutocomplete/tests/__snapshots__/sy-autocomplete-default.snap.png +0 -0
  137. package/src/components/Customs/Selects/SyAutocomplete/tests/__snapshots__/sy-autocomplete-loading.snap.png +0 -0
  138. package/src/components/Customs/Selects/SyAutocomplete/tests/__snapshots__/sy-autocomplete-multiple.snap.png +0 -0
  139. package/src/components/Customs/Selects/SyAutocomplete/tests/__snapshots__/sy-autocomplete-with-value.snap.png +0 -0
  140. package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +3 -1
  141. package/src/components/Customs/Selects/SyAutocomplete/utils/useKeyboardHandler.ts +79 -5
  142. package/src/components/Customs/Selects/SyAutocomplete/validation/Validation.stories.ts +936 -0
  143. package/src/components/Customs/Selects/SyInputSelect/tests/SyInputSelect.visual.cy.ts +48 -0
  144. package/src/components/Customs/Selects/SyInputSelect/tests/__snapshots__/sy-input-select-default.snap.png +0 -0
  145. package/src/components/Customs/Selects/SyInputSelect/tests/__snapshots__/sy-input-select-required.snap.png +0 -0
  146. package/src/components/Customs/Selects/SyInputSelect/tests/__snapshots__/sy-input-select-with-value.snap.png +0 -0
  147. package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +9 -491
  148. package/src/components/Customs/Selects/SySelect/SySelect.vue +68 -126
  149. package/src/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.ts +3 -0
  150. package/src/components/Customs/Selects/SySelect/composables/useSySelectValidation.ts +64 -0
  151. package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +199 -3
  152. package/src/components/Customs/Selects/SySelect/tests/SySelect.visual.cy.ts +77 -0
  153. package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-clearable.snap.png +0 -0
  154. package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-default.snap.png +0 -0
  155. package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-multiple-chips.snap.png +0 -0
  156. package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-required.snap.png +0 -0
  157. package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-with-value.snap.png +0 -0
  158. package/src/components/Customs/Selects/SySelect/validation/Validation.stories.ts +935 -0
  159. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.stories.ts +18 -7
  160. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +3 -3
  161. package/src/components/Customs/SyCheckBoxGroup/tests/SyCheckBoxGroup.visual.cy.ts +55 -0
  162. package/src/components/Customs/SyCheckBoxGroup/tests/__snapshots__/sy-checkbox-group-default.snap.png +0 -0
  163. package/src/components/Customs/SyCheckBoxGroup/tests/__snapshots__/sy-checkbox-group-disabled.snap.png +0 -0
  164. package/src/components/Customs/SyCheckBoxGroup/tests/__snapshots__/sy-checkbox-group-selected.snap.png +0 -0
  165. package/src/components/Customs/SyCheckBoxGroup/tests/__snapshots__/sy-checkbox-group-with-label.snap.png +0 -0
  166. package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +8 -8
  167. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +9 -17
  168. package/src/components/Customs/SyCheckbox/tests/SyCheckbox.spec.ts +1 -1
  169. package/src/components/Customs/SyCheckbox/tests/SyCheckbox.visual.cy.ts +61 -0
  170. package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-checked.snap.png +0 -0
  171. package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-disabled.snap.png +0 -0
  172. package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-indeterminate.snap.png +0 -0
  173. package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-required.snap.png +0 -0
  174. package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-unchecked.snap.png +0 -0
  175. package/src/components/Customs/SyIcon/SyIcon.vue +19 -1
  176. package/src/components/Customs/SyIcon/accessibilite/Accessibility.mdx +0 -6
  177. package/src/components/Customs/SyIcon/tests/SyIcon.visual.cy.ts +83 -0
  178. package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-color-error.snap.png +0 -0
  179. package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-decorative.snap.png +0 -0
  180. package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-informative.snap.png +0 -0
  181. package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-role-button.snap.png +0 -0
  182. package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-size-large.snap.png +0 -0
  183. package/src/components/Customs/SyIcon/utils/tests/iconUtils.spec.ts +107 -0
  184. package/src/components/Customs/SyIconButton/tests/SyIconButton.visual.cy.ts +55 -0
  185. package/src/components/Customs/SyIconButton/tests/__snapshots__/sy-icon-button-default.snap.png +0 -0
  186. package/src/components/Customs/SyIconButton/tests/__snapshots__/sy-icon-button-disabled.snap.png +0 -0
  187. package/src/components/Customs/SyIconButton/tests/__snapshots__/sy-icon-button-error.snap.png +0 -0
  188. package/src/components/Customs/SyIconButton/tests/__snapshots__/sy-icon-button-large.snap.png +0 -0
  189. package/src/components/Customs/SyPagination/tests/SyPagination.visual.cy.ts +40 -0
  190. package/src/components/Customs/SyPagination/tests/__snapshots__/sy-pagination-first-page.snap.png +0 -0
  191. package/src/components/Customs/SyPagination/tests/__snapshots__/sy-pagination-middle-page.snap.png +0 -0
  192. package/src/components/Customs/SyPagination/tests/__snapshots__/sy-pagination-with-label.snap.png +0 -0
  193. package/src/components/Customs/SyRadioGroup/SyRadioGroup.mdx +2 -2
  194. package/src/components/Customs/SyRadioGroup/SyRadioGroup.stories.ts +395 -201
  195. package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +83 -127
  196. package/src/components/Customs/SyRadioGroup/composables/useSyRadioGroupValidation.ts +127 -0
  197. package/src/components/Customs/SyRadioGroup/tests/SyRadioGroup.a11y.spec.ts +93 -1
  198. package/src/components/Customs/SyRadioGroup/tests/SyRadioGroup.spec.ts +146 -9
  199. package/src/components/Customs/SyRadioGroup/tests/SyRadioGroup.visual.cy.ts +165 -0
  200. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-asterisk.snap.png +0 -0
  201. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-comfortable.snap.png +0 -0
  202. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-compact.snap.png +0 -0
  203. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-default.snap.png +0 -0
  204. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-disabled.snap.png +0 -0
  205. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-error.snap.png +0 -0
  206. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-no-details.snap.png +0 -0
  207. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-readonly.snap.png +0 -0
  208. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-selected.snap.png +0 -0
  209. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-success.snap.png +0 -0
  210. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-warning.snap.png +0 -0
  211. package/src/components/Customs/SyRadioGroup/validation/Validation.stories.ts +809 -0
  212. package/src/components/Customs/SyTabs/config.ts +3 -3
  213. package/src/components/Customs/SyTabs/tests/SyTabs.spec.ts +265 -0
  214. package/src/components/Customs/SyTabs/tests/SyTabs.visual.cy.ts +30 -0
  215. package/src/components/Customs/SyTabs/tests/__snapshots__/sy-tabs-default.snap.png +0 -0
  216. package/src/components/Customs/SyTabs/tests/__snapshots__/sy-tabs-second-active.snap.png +0 -0
  217. package/src/components/Customs/SyTabs/tests/useTabTransition.spec.ts +188 -0
  218. package/src/components/Customs/SyTextField/SyTextField.stories.ts +166 -803
  219. package/src/components/Customs/SyTextField/SyTextField.vue +191 -168
  220. package/src/components/Customs/SyTextField/Validation/Validation.stories.ts +1164 -0
  221. package/src/components/Customs/SyTextField/locales.ts +12 -0
  222. package/src/components/Customs/SyTextField/tests/SyTextField.spec.ts +174 -8
  223. package/src/components/Customs/SyTextField/tests/SyTextField.visual.cy.ts +116 -0
  224. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-clearable.snap.png +0 -0
  225. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-default.snap.png +0 -0
  226. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-number-disabled.snap.png +0 -0
  227. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-number-no-spinner.snap.png +0 -0
  228. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-number.snap.png +0 -0
  229. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-prepend-icon.snap.png +0 -0
  230. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-readonly.snap.png +0 -0
  231. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-required.snap.png +0 -0
  232. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-with-value.snap.png +0 -0
  233. package/src/components/Customs/SyTextField/types.ts +70 -0
  234. package/src/components/Customs/SyTextField/useNumberField.ts +93 -0
  235. package/src/components/Customs/SyTextField/useSyTextFieldValidation.ts +104 -0
  236. package/src/components/DataList/DataList.stories.ts +1 -1
  237. package/src/components/DataList/tests/DataList.visual.cy.ts +85 -0
  238. package/src/components/DataList/tests/__snapshots__/data-list-default.snap.png +0 -0
  239. package/src/components/DataList/tests/__snapshots__/data-list-loading.snap.png +0 -0
  240. package/src/components/DataList/tests/__snapshots__/data-list-row.snap.png +0 -0
  241. package/src/components/DataList/tests/__snapshots__/data-list-with-icons.snap.png +0 -0
  242. package/src/components/DataList/tests/__snapshots__/data-list-with-title.snap.png +0 -0
  243. package/src/components/DataListGroup/tests/DataListGroup.visual.cy.ts +51 -0
  244. package/src/components/DataListGroup/tests/__snapshots__/data-list-group-default.snap.png +0 -0
  245. package/src/components/DataListGroup/tests/__snapshots__/data-list-group-loading.snap.png +0 -0
  246. package/src/components/DataListItem/tests/DataListItem.spec.ts +3 -1
  247. package/src/components/DataListItem/tests/DataListItem.visual.cy.ts +53 -0
  248. package/src/components/DataListItem/tests/__snapshots__/data-list-item-chip.snap.png +0 -0
  249. package/src/components/DataListItem/tests/__snapshots__/data-list-item-default.snap.png +0 -0
  250. package/src/components/DataListItem/tests/__snapshots__/data-list-item-placeholder.snap.png +0 -0
  251. package/src/components/DataListItem/tests/__snapshots__/data-list-item-row.snap.png +0 -0
  252. package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +1 -1
  253. package/src/components/DatePicker/CalendarMode/DatePicker.vue +43 -148
  254. package/src/components/DatePicker/CalendarMode/tests/DatePicker.coverage.spec.ts +156 -0
  255. package/src/components/DatePicker/CalendarMode/tests/DatePicker.spec.ts +495 -4
  256. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +1 -1
  257. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +51 -71
  258. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +206 -0
  259. package/src/components/DatePicker/ComplexDatePicker/tests/bridge-integration.regression.spec.ts +210 -0
  260. package/src/components/DatePicker/ComplexDatePicker/tests/calendar-navigation.regression.spec.ts +214 -0
  261. package/src/components/DatePicker/ComplexDatePicker/tests/validation-cross.regression.spec.ts +194 -0
  262. package/src/components/DatePicker/ComplexDatePicker/tests/validation-success-messages.regression.spec.ts +83 -0
  263. package/src/components/DatePicker/DateTextInput/DateRange.stories.ts +1 -1
  264. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +131 -56
  265. package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +1 -1
  266. package/src/components/DatePicker/DateTextInput/tests/DateTextInput.spec.ts +320 -0
  267. package/src/components/DatePicker/composables/index.ts +1 -0
  268. package/src/components/DatePicker/composables/tests/useCalendarKeyboardNavigation.spec.ts +360 -0
  269. package/src/components/DatePicker/composables/tests/useDatePickerValidationBridge.spec.ts +129 -0
  270. package/src/components/DatePicker/composables/tests/useTodayButton.spec.ts +10 -10
  271. package/src/components/DatePicker/composables/useCalendarKeyboardNavigation.ts +11 -2
  272. package/src/components/DatePicker/composables/useDatePickerValidationBridge.ts +205 -0
  273. package/src/components/DatePicker/docExamples/BidirectionalComplexValidation.vue +1 -1
  274. package/src/components/DatePicker/docExamples/DatePickerBidirectionalValidation.vue +1 -1
  275. package/src/components/DatePicker/tests/exposed-methods.coverage.spec.ts +75 -0
  276. package/src/components/DeclarationAccessibilityPage/tests/DeclarationAccessibilityPage.visual.cy.ts +35 -0
  277. package/src/components/DeclarationAccessibilityPage/tests/__snapshots__/declaration-a11y-page-default.snap.png +0 -0
  278. package/src/components/DeclarationAccessibilityPage/tests/__snapshots__/declaration-a11y-page-full.snap.png +0 -0
  279. package/src/components/DiacriticPicker/tests/DiacriticPicker.visual.cy.ts +24 -0
  280. package/src/components/DiacriticPicker/tests/__snapshots__/diacritic-picker-custom-title.snap.png +0 -0
  281. package/src/components/DiacriticPicker/tests/__snapshots__/diacritic-picker-default.snap.png +0 -0
  282. package/src/components/DialogBox/DialogBox.vue +1 -1
  283. package/src/components/DialogBox/tests/__snapshots__/dialog-box-custom-texts.snap.png +0 -0
  284. package/src/components/DialogBox/tests/__snapshots__/dialog-box-default.snap.png +0 -0
  285. package/src/components/DialogBox/tests/__snapshots__/dialog-box-no-actions.snap.png +0 -0
  286. package/src/components/DownloadBtn/tests/DownloadBtn.spec.ts +2 -2
  287. package/src/components/DownloadBtn/tests/DownloadBtn.visual.cy.ts +38 -0
  288. package/src/components/DownloadBtn/tests/__snapshots__/download-btn-dark.snap.png +0 -0
  289. package/src/components/DownloadBtn/tests/__snapshots__/download-btn-idle.snap.png +0 -0
  290. package/src/components/ErrorPage/tests/ErrorPage.visual.cy.ts +32 -0
  291. package/src/components/ErrorPage/tests/__snapshots__/error-page-custom.snap.png +0 -0
  292. package/src/components/ErrorPage/tests/__snapshots__/error-page-default.snap.png +0 -0
  293. package/src/components/ErrorPage/tests/__snapshots__/error-page-no-btn.snap.png +0 -0
  294. package/src/components/ExternalLinks/tests/ExternalLinks.visual.cy.ts +30 -0
  295. package/src/components/ExternalLinks/tests/__snapshots__/external-links-default.snap.png +0 -0
  296. package/src/components/ExternalLinks/tests/__snapshots__/external-links-fixed.snap.png +0 -0
  297. package/src/components/FileList/UploadItem/UploadItem.vue +4 -4
  298. package/src/components/FileList/tests/FileList.visual.cy.ts +31 -0
  299. package/src/components/FileList/tests/__snapshots__/file-list-default.snap.png +0 -0
  300. package/src/components/FileList/tests/__snapshots__/file-list-with-delete.snap.png +0 -0
  301. package/src/components/FilePreview/accessibilite/Accessibility.mdx +86 -8
  302. package/src/components/FileUpload/FileUpload.vue +2 -2
  303. package/src/components/FileUpload/FileUploadContent.vue +1 -1
  304. package/src/components/FileUpload/tests/FileUpload.visual.cy.ts +36 -0
  305. package/src/components/FileUpload/tests/__snapshots__/file-upload-default.snap.png +0 -0
  306. package/src/components/FileUpload/tests/__snapshots__/file-upload-disabled.snap.png +0 -0
  307. package/src/components/FileUpload/tests/__snapshots__/file-upload-multiple.snap.png +0 -0
  308. package/src/components/FilterInline/FilterInline.mdx +2 -2
  309. package/src/components/FilterInline/FilterInline.stories.ts +2 -0
  310. package/src/components/FilterInline/FilterInline.vue +10 -5
  311. package/src/components/FilterInline/tests/FilterInline.visual.cy.ts +25 -0
  312. package/src/components/FilterInline/tests/__snapshots__/filter-inline-default.snap.png +0 -0
  313. package/src/components/FilterSideBar/FilterSideBar.stories.ts +5 -2
  314. package/src/components/FilterSideBar/FilterSideBar.vue +13 -8
  315. package/src/components/FilterSideBar/tests/FilterSideBar.visual.cy.ts +37 -0
  316. package/src/components/FilterSideBar/tests/__snapshots__/filter-sidebar-default.snap.png +0 -0
  317. package/src/components/FilterSideBar/tests/__snapshots__/filter-sidebar-modale.snap.png +0 -0
  318. package/src/components/FooterBar/FooterBar.vue +7 -7
  319. package/src/components/FooterBar/tests/FooterBar.visual.cy.ts +37 -0
  320. package/src/components/FooterBar/tests/__snapshots__/footer-bar-default.snap.png +0 -0
  321. package/src/components/FooterBar/tests/__snapshots__/footer-bar-no-logo.snap.png +0 -0
  322. package/src/components/FooterBar/tests/__snapshots__/footer-bar-no-social.snap.png +0 -0
  323. package/src/components/FooterBar/tests/__snapshots__/footer-bar-version.snap.png +0 -0
  324. package/src/components/FranceConnectBtn/FranceConnectBtn.vue +1 -1
  325. package/src/components/FranceConnectBtn/tests/FranceConnectBtn.visual.cy.ts +38 -0
  326. package/src/components/FranceConnectBtn/tests/__snapshots__/france-connect-btn-dark.snap.png +0 -0
  327. package/src/components/FranceConnectBtn/tests/__snapshots__/france-connect-btn-default.snap.png +0 -0
  328. package/src/components/FranceConnectBtn/tests/__snapshots__/france-connect-btn-plus.snap.png +0 -0
  329. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.vue +2 -2
  330. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.vue +7 -7
  331. package/src/components/HeaderBar/HeaderBurgerMenu/tests/HeaderBurgerMenu.spec.ts +4 -4
  332. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated-submenu-open.snap.png +0 -0
  333. package/src/components/HeaderBar/HeaderMenuBtn/HeaderMenuBtn.vue +2 -2
  334. package/src/components/HeaderBar/tests/__snapshots__/header-bar-custom-width.snap.png +0 -0
  335. package/src/components/HeaderBar/tests/__snapshots__/header-bar-default.snap.png +0 -0
  336. package/src/components/HeaderBar/tests/__snapshots__/header-bar-no-sticky.snap.png +0 -0
  337. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-prepend.snap.png +0 -0
  338. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-side.snap.png +0 -0
  339. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-subtitle.snap.png +0 -0
  340. package/src/components/HeaderLoading/tests/HeaderLoading.spec.ts +87 -8
  341. package/src/components/HeaderLoading/tests/HeaderLoading.visual.cy.ts +34 -0
  342. package/src/components/HeaderLoading/tests/__snapshots__/header-loading-custom-size.snap.png +0 -0
  343. package/src/components/HeaderLoading/tests/__snapshots__/header-loading-default.snap.png +0 -0
  344. package/src/components/HeaderLoading/tests/__snapshots__/header-loading-standalone.snap.png +0 -0
  345. package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +3 -3
  346. package/src/components/HeaderNavigationBar/HorizontalNavbar/tests/HorizontalNavbar.spec.ts +589 -0
  347. package/src/components/HeaderNavigationBar/tests/HeaderNavigationBar.spec.ts +4 -4
  348. package/src/components/HeaderNavigationBar/tests/HeaderNavigationBar.visual.cy.ts +34 -0
  349. package/src/components/HeaderNavigationBar/tests/__snapshots__/header-navigation-bar-default.snap.png +0 -0
  350. package/src/components/HeaderNavigationBar/tests/__snapshots__/header-navigation-bar-subtitle.snap.png +0 -0
  351. package/src/components/HeaderToolbar/tests/HeaderToolBar.spec.ts +153 -1
  352. package/src/components/HeaderToolbar/tests/HeaderToolbar.visual.cy.ts +25 -0
  353. package/src/components/HeaderToolbar/tests/__snapshots__/header-toolbar-custom.snap.png +0 -0
  354. package/src/components/HeaderToolbar/tests/__snapshots__/header-toolbar-default.snap.png +0 -0
  355. package/src/components/HeaderToolbar/tests/useMobileRightMenu.spec.ts +258 -0
  356. package/src/components/LangBtn/tests/LangBtn.visual.cy.ts +33 -0
  357. package/src/components/LangBtn/tests/__snapshots__/lang-btn-default.snap.png +0 -0
  358. package/src/components/LangBtn/tests/__snapshots__/lang-btn-english.snap.png +0 -0
  359. package/src/components/LangBtn/tests/__snapshots__/lang-btn-no-arrow.snap.png +0 -0
  360. package/src/components/Logo/tests/__snapshots__/logo-avatar.snap.png +0 -0
  361. package/src/components/Logo/tests/__snapshots__/logo-default.snap.png +0 -0
  362. package/src/components/Logo/tests/__snapshots__/logo-no-organism.snap.png +0 -0
  363. package/src/components/Logo/tests/__snapshots__/logo-no-signature.snap.png +0 -0
  364. package/src/components/Logo/tests/__snapshots__/logo-risque-pro.snap.png +0 -0
  365. package/src/components/LogoBrandSection/tests/LogoBrandSection.spec.ts +2 -2
  366. package/src/components/LogoBrandSection/tests/LogoBrandSection.visual.cy.ts +43 -0
  367. package/src/components/LogoBrandSection/tests/__snapshots__/LogoBrandSection.spec.ts.snap +1 -1
  368. package/src/components/LogoBrandSection/tests/__snapshots__/logo-brand-section-default.snap.png +0 -0
  369. package/src/components/LogoBrandSection/tests/__snapshots__/logo-brand-section-mobile.snap.png +0 -0
  370. package/src/components/LogoBrandSection/tests/__snapshots__/logo-brand-section-reduced.snap.png +0 -0
  371. package/src/components/LogoBrandSection/tests/__snapshots__/logo-brand-section-with-title.snap.png +0 -0
  372. package/src/components/LunarCalendar/tests/LunarCalendar.visual.cy.ts +36 -0
  373. package/src/components/LunarCalendar/tests/__snapshots__/lunar-calendar-default.snap.png +0 -0
  374. package/src/components/LunarCalendar/tests/__snapshots__/lunar-calendar-required.snap.png +0 -0
  375. package/src/components/LunarCalendar/tests/__snapshots__/lunar-calendar-with-value.snap.png +0 -0
  376. package/src/components/LunarCalendar/tests/useLunarCalendarRules.spec.ts +184 -0
  377. package/src/components/MaintenancePage/tests/MaintenancePage.visual.cy.ts +22 -0
  378. package/src/components/MaintenancePage/tests/__snapshots__/maintenance-page-custom.snap.png +0 -0
  379. package/src/components/MaintenancePage/tests/__snapshots__/maintenance-page-default.snap.png +0 -0
  380. package/src/components/MonthPicker/MonthPickerVisual/MonthSelector.vue +3 -3
  381. package/src/components/MonthPicker/MonthPickerVisual/VisualPickerFooter.vue +1 -1
  382. package/src/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.vue +2 -2
  383. package/src/components/MonthPicker/MonthPickerVisual/YearSelector.vue +1 -1
  384. package/src/components/MonthPicker/tests/MonthPicker.visual.cy.ts +37 -0
  385. package/src/components/MonthPicker/tests/__snapshots__/MonthPicker.spec.ts.snap +2 -0
  386. package/src/components/MonthPicker/tests/__snapshots__/month-picker-default.snap.png +0 -0
  387. package/src/components/MonthPicker/tests/__snapshots__/month-picker-disabled.snap.png +0 -0
  388. package/src/components/MonthPicker/tests/__snapshots__/month-picker-readonly.snap.png +0 -0
  389. package/src/components/MonthPicker/tests/__snapshots__/month-picker-with-value.snap.png +0 -0
  390. package/src/components/NirField/NirField.stories.ts +40 -682
  391. package/src/components/NirField/NirField.vue +101 -35
  392. package/src/components/NirField/tests/NirField.spec.ts +135 -14
  393. package/src/components/NirField/tests/NirField.visual.cy.ts +28 -0
  394. package/src/components/NirField/tests/__snapshots__/nir-field-complex.snap.png +0 -0
  395. package/src/components/NirField/tests/__snapshots__/nir-field-default.snap.png +0 -0
  396. package/src/components/NirField/tests/__snapshots__/nir-field-with-key.snap.png +0 -0
  397. package/src/components/NirField/tests/useNirValidation.spec.ts +168 -0
  398. package/src/components/NirField/useNirValidation.ts +28 -2
  399. package/src/components/NirField/validation/Validation.stories.ts +866 -0
  400. package/src/components/NotFoundPage/tests/NotFoundPage.visual.cy.ts +28 -0
  401. package/src/components/NotFoundPage/tests/__snapshots__/not-found-page-custom-btn.snap.png +0 -0
  402. package/src/components/NotFoundPage/tests/__snapshots__/not-found-page-default.snap.png +0 -0
  403. package/src/components/NotFoundPage/tests/__snapshots__/not-found-page-no-btn.snap.png +0 -0
  404. package/src/components/NotificationBar/Notification/Notification.vue +12 -12
  405. package/src/components/NotificationBar/NotificationBar.stories.ts +8 -8
  406. package/src/components/NotificationBar/tests/NotificationBar.visual.cy.ts +54 -0
  407. package/src/components/NotificationBar/tests/__snapshots__/notification-bar-bottom.snap.png +0 -0
  408. package/src/components/NotificationBar/tests/__snapshots__/notification-bar-info.snap.png +0 -0
  409. package/src/components/NotificationBar/tests/__snapshots__/notification-bar-multiple.snap.png +0 -0
  410. package/src/components/PageContainer/tests/PageContainer.visual.cy.ts +33 -0
  411. package/src/components/PageContainer/tests/__snapshots__/page-container-color.snap.png +0 -0
  412. package/src/components/PageContainer/tests/__snapshots__/page-container-default.snap.png +0 -0
  413. package/src/components/PageContainer/tests/__snapshots__/page-container-md.snap.png +0 -0
  414. package/src/components/PaginatedTable/Pagination.vue +2 -2
  415. package/src/components/PaginatedTable/accessibilite/Accessibility.mdx +99 -7
  416. package/src/components/PaginatedTable/tests/PaginatedTable.visual.cy.ts +41 -0
  417. package/src/components/PaginatedTable/tests/__snapshots__/paginated-table-default.snap.png +0 -0
  418. package/src/components/PaginatedTable/tests/__snapshots__/paginated-table-server.snap.png +0 -0
  419. package/src/components/PasswordField/PasswordField.mdx +5 -52
  420. package/src/components/PasswordField/PasswordField.stories.ts +74 -931
  421. package/src/components/PasswordField/PasswordField.vue +128 -199
  422. package/src/components/PasswordField/Validation/Validation.stories.ts +1295 -0
  423. package/src/components/PasswordField/locales.ts +2 -0
  424. package/src/components/PasswordField/tests/PasswordField.spec.ts +147 -109
  425. package/src/components/PasswordField/tests/PasswordField.visual.cy.ts +49 -0
  426. package/src/components/PasswordField/tests/__snapshots__/password-field-default.snap.png +0 -0
  427. package/src/components/PasswordField/tests/__snapshots__/password-field-disabled.snap.png +0 -0
  428. package/src/components/PasswordField/tests/__snapshots__/password-field-required.snap.png +0 -0
  429. package/src/components/PasswordField/tests/__snapshots__/password-field-underlined.snap.png +0 -0
  430. package/src/components/PasswordField/types.ts +17 -0
  431. package/src/components/PasswordField/usePasswordFieldValidation.ts +100 -0
  432. package/src/components/PeriodField/PeriodField.stories.ts +3 -1
  433. package/src/components/PeriodField/PeriodField.vue +1 -1
  434. package/src/components/PeriodField/tests/PeriodField.visual.cy.ts +39 -0
  435. package/src/components/PeriodField/tests/__snapshots__/period-field-default.snap.png +0 -0
  436. package/src/components/PeriodField/tests/__snapshots__/period-field-no-calendar.snap.png +0 -0
  437. package/src/components/PeriodField/tests/__snapshots__/period-field-required.snap.png +0 -0
  438. package/src/components/PeriodField/tests/__snapshots__/period-field-with-value.snap.png +0 -0
  439. package/src/components/PhoneField/PhoneField.vue +2 -2
  440. package/src/components/PhoneField/tests/PhoneField.spec.ts +1 -0
  441. package/src/components/PhoneField/tests/PhoneField.visual.cy.ts +28 -0
  442. package/src/components/PhoneField/tests/__snapshots__/phone-field-default.snap.png +0 -0
  443. package/src/components/PhoneField/tests/__snapshots__/phone-field-with-country-code.snap.png +0 -0
  444. package/src/components/PhoneField/tests/__snapshots__/phone-field-with-value.snap.png +0 -0
  445. package/src/components/RangeField/RangeSlider/RangeSlider.vue +2 -2
  446. package/src/components/RangeField/RangeSlider/Tooltip/Tooltip.vue +1 -1
  447. package/src/components/RangeField/tests/__snapshots__/range-field-custom-bg.snap.png +0 -0
  448. package/src/components/RangeField/tests/__snapshots__/range-field-custom-range.snap.png +0 -0
  449. package/src/components/RangeField/tests/__snapshots__/range-field-default.snap.png +0 -0
  450. package/src/components/RangeField/tests/__snapshots__/range-field-step.snap.png +0 -0
  451. package/src/components/RangeField/tests/__snapshots__/range-field-with-label.snap.png +0 -0
  452. package/src/components/RatingPicker/tests/RatingPicker.visual.cy.ts +52 -0
  453. package/src/components/RatingPicker/tests/__snapshots__/rating-picker-emotion.snap.png +0 -0
  454. package/src/components/RatingPicker/tests/__snapshots__/rating-picker-number.snap.png +0 -0
  455. package/src/components/RatingPicker/tests/__snapshots__/rating-picker-readonly.snap.png +0 -0
  456. package/src/components/RatingPicker/tests/__snapshots__/rating-picker-stars.snap.png +0 -0
  457. package/src/components/SearchListField/SearchListField.mdx +1 -1
  458. package/src/components/SearchListField/SearchListField.stories.ts +1 -1
  459. package/src/components/SearchListField/SearchListField.vue +9 -4
  460. package/src/components/SearchListField/tests/SearchListField.spec.ts +127 -0
  461. package/src/components/SearchListField/tests/SearchListField.visual.cy.ts +35 -0
  462. package/src/components/SearchListField/tests/__snapshots__/search-list-field-default.snap.png +0 -0
  463. package/src/components/SearchListField/tests/__snapshots__/search-list-field-with-selection.snap.png +0 -0
  464. package/src/components/SkipLink/tests/SkipLink.visual.cy.ts +16 -0
  465. package/src/components/SkipLink/tests/__snapshots__/skip-link-focused.snap.png +0 -0
  466. package/src/components/SocialMediaLinks/tests/SocialMediaLinks.visual.cy.ts +33 -0
  467. package/src/components/SocialMediaLinks/tests/__snapshots__/social-media-links-default.snap.png +0 -0
  468. package/src/components/SocialMediaLinks/tests/__snapshots__/social-media-links-no-native-heading.snap.png +0 -0
  469. package/src/components/StatusPage/tests/StatusPage.spec.ts +149 -0
  470. package/src/components/StatusPage/tests/StatusPage.visual.cy.ts +47 -0
  471. package/src/components/StatusPage/tests/__snapshots__/status-page-default.snap.png +0 -0
  472. package/src/components/StatusPage/tests/__snapshots__/status-page-full.snap.png +0 -0
  473. package/src/components/StatusPage/tests/__snapshots__/status-page-no-btn.snap.png +0 -0
  474. package/src/components/SubHeader/SubHeader.vue +1 -1
  475. package/src/components/SubHeader/tests/SubHeader.visual.cy.ts +48 -0
  476. package/src/components/SubHeader/tests/__snapshots__/sub-header-default.snap.png +0 -0
  477. package/src/components/SubHeader/tests/__snapshots__/sub-header-loading.snap.png +0 -0
  478. package/src/components/SubHeader/tests/__snapshots__/sub-header-no-back-btn.snap.png +0 -0
  479. package/src/components/SubHeader/tests/__snapshots__/sub-header-with-subtitle.snap.png +0 -0
  480. package/src/components/SyAlert/SyAlert.vue +23 -23
  481. package/src/components/SyAlert/tests/__snapshots__/sy-alert-closable.snap.png +0 -0
  482. package/src/components/SyAlert/tests/__snapshots__/sy-alert-error.snap.png +0 -0
  483. package/src/components/SyAlert/tests/__snapshots__/sy-alert-info.snap.png +0 -0
  484. package/src/components/SyAlert/tests/__snapshots__/sy-alert-success.snap.png +0 -0
  485. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-outlined.snap.png +0 -0
  486. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-tonal.snap.png +0 -0
  487. package/src/components/SyAlert/tests/__snapshots__/sy-alert-warning.snap.png +0 -0
  488. package/src/components/SyHeading/tests/SyHeading.visual.cy.ts +33 -0
  489. package/src/components/SyHeading/tests/__snapshots__/sy-heading-level-1.snap.png +0 -0
  490. package/src/components/SyHeading/tests/__snapshots__/sy-heading-level-2.snap.png +0 -0
  491. package/src/components/SyHeading/tests/__snapshots__/sy-heading-level-3.snap.png +0 -0
  492. package/src/components/SyTextArea/SyTextArea.stories.ts +202 -131
  493. package/src/components/SyTextArea/SyTextArea.vue +242 -83
  494. package/src/components/SyTextArea/composables/useSyTextAreaValidation.ts +81 -0
  495. package/src/components/SyTextArea/locales.ts +1 -0
  496. package/src/components/SyTextArea/tests/SyTextArea.a11y.spec.ts +18 -0
  497. package/src/components/SyTextArea/tests/SyTextArea.spec.ts +583 -1
  498. package/src/components/SyTextArea/tests/SyTextArea.visual.cy.ts +48 -0
  499. package/src/components/SyTextArea/tests/__snapshots__/sy-textarea-default.snap.png +0 -0
  500. package/src/components/SyTextArea/tests/__snapshots__/sy-textarea-filled.snap.png +0 -0
  501. package/src/components/SyTextArea/tests/__snapshots__/sy-textarea-required.snap.png +0 -0
  502. package/src/components/SyTextArea/tests/__snapshots__/sy-textarea-with-value.snap.png +0 -0
  503. package/src/components/SyTextArea/useDefaultValidationRules.ts +2 -7
  504. package/src/components/SyTextArea/validation/Validation.stories.ts +776 -0
  505. package/src/components/TableToolbar/TableToolbar.vue +6 -6
  506. package/src/components/TableToolbar/accessibilite/Accessibility.mdx +81 -7
  507. package/src/components/TableToolbar/tests/TableToolbar.visual.cy.ts +49 -0
  508. package/src/components/TableToolbar/tests/__snapshots__/table-toolbar-default.snap.png +0 -0
  509. package/src/components/TableToolbar/tests/__snapshots__/table-toolbar-filtered.snap.png +0 -0
  510. package/src/components/TableToolbar/tests/__snapshots__/table-toolbar-loading.snap.png +0 -0
  511. package/src/components/TableToolbar/tests/__snapshots__/table-toolbar-with-add-btn.snap.png +0 -0
  512. package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +163 -0
  513. package/src/components/Tables/SyServerTable/SyServerTable.vue +5 -4
  514. package/src/components/Tables/SyServerTable/accessibilite/Accessibility.mdx +114 -7
  515. package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +67 -0
  516. package/src/components/Tables/SyServerTable/tests/SyServerTable.visual.cy.ts +58 -0
  517. package/src/components/Tables/SyServerTable/tests/__snapshots__/sy-server-table-default.snap.png +0 -0
  518. package/src/components/Tables/SyServerTable/tests/__snapshots__/sy-server-table-loading.snap.png +0 -0
  519. package/src/components/Tables/SyServerTable/tests/__snapshots__/sy-server-table-with-select.snap.png +0 -0
  520. package/src/components/Tables/SyTable/SyTable.stories.ts +94 -0
  521. package/src/components/Tables/SyTable/SyTable.vue +2 -1
  522. package/src/components/Tables/SyTable/accessibilite/Accessibility.mdx +116 -7
  523. package/src/components/Tables/SyTable/tests/SyTable.spec.ts +64 -0
  524. package/src/components/Tables/SyTable/tests/SyTable.visual.cy.ts +70 -0
  525. package/src/components/Tables/SyTable/tests/__snapshots__/sy-table-compact.snap.png +0 -0
  526. package/src/components/Tables/SyTable/tests/__snapshots__/sy-table-default.snap.png +0 -0
  527. package/src/components/Tables/SyTable/tests/__snapshots__/sy-table-striped.snap.png +0 -0
  528. package/src/components/Tables/SyTable/tests/__snapshots__/sy-table-with-select.snap.png +0 -0
  529. package/src/components/Tables/common/TableHeader.vue +2 -2
  530. package/src/components/Tables/common/filters/logics/tests/NumberFilterLogic.spec.ts +176 -0
  531. package/src/components/Tables/common/filters/logics/tests/SelectFilterLogic.spec.ts +111 -0
  532. package/src/components/Tables/common/tableStyles.scss +10 -10
  533. package/src/components/Tables/common/tests/SyTableFilter.spec.ts +8 -1
  534. package/src/components/Tables/common/tests/filterByRange.spec.ts +23 -22
  535. package/src/components/Tables/common/types.ts +2 -0
  536. package/src/components/ToolbarContainer/tests/ToolbarContainer.visual.cy.ts +34 -0
  537. package/src/components/ToolbarContainer/tests/__snapshots__/toolbar-container-default.snap.png +0 -0
  538. package/src/components/ToolbarContainer/tests/__snapshots__/toolbar-container-links.snap.png +0 -0
  539. package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +3 -2
  540. package/src/components/UploadWorkflow/tests/UploadWorkflow.visual.cy.ts +39 -0
  541. package/src/components/UploadWorkflow/tests/__snapshots__/upload-workflow-default.snap.png +0 -0
  542. package/src/components/UploadWorkflow/tests/__snapshots__/upload-workflow-with-title.snap.png +0 -0
  543. package/src/components/UserMenuBtn/tests/UserMenuBtn.visual.cy.ts +42 -0
  544. package/src/components/UserMenuBtn/tests/__snapshots__/user-menu-btn-default.snap.png +0 -0
  545. package/src/components/UserMenuBtn/tests/__snapshots__/user-menu-btn-no-logout.snap.png +0 -0
  546. package/src/components/UserMenuBtn/tests/__snapshots__/user-menu-btn-with-name.snap.png +0 -0
  547. package/src/components/index.ts +1 -0
  548. package/src/composables/date/tests/useDateFormatDayjs.spec.ts +31 -0
  549. package/src/composables/date/tests/useHolidayDay.spec.ts +109 -0
  550. package/src/composables/rules/tests/useFieldValidation.spec.ts +374 -0
  551. package/src/composables/tests/useError.spec.ts +30 -0
  552. package/src/composables/tests/useFormFieldErrorHandling.spec.ts +234 -0
  553. package/src/composables/unifyValidation/documentationValidationProps.ts +6 -6
  554. package/src/composables/unifyValidation/tests/documentationValidationProps.spec.ts +177 -0
  555. package/src/composables/unifyValidation/tests/useCustomValidation.spec.ts +30 -0
  556. package/src/composables/unifyValidation/tests/useValidation.spec.ts +6 -2
  557. package/src/composables/unifyValidation/useCustomValidation.ts +19 -9
  558. package/src/composables/unifyValidation/useValidation.ts +35 -32
  559. package/src/composables/useFilterable/useFilterable.spec.ts +139 -134
  560. package/src/composables/useFilterable/useFilterable.ts +17 -24
  561. package/src/composables/useFormFieldErrorHandling.ts +3 -3
  562. package/src/composables/validation/tests/useFormValidation.spec.ts +11 -2
  563. package/src/composables/validation/tests/useValidatable.spec.ts +16 -6
  564. package/src/composables/validation/tests/useValidation.spec.ts +2 -2
  565. package/src/composables/validation/useValidation.ts +1 -1
  566. package/src/composantsVuetify/VBtn/VBtn.mdx +9 -39
  567. package/src/composantsVuetify/VBtn/v-btn.stories.ts +26 -86
  568. package/src/composantsVuetify/VCard/VCard.mdx +8 -0
  569. package/src/composantsVuetify/VCard/v-card.stories.ts +191 -1
  570. package/src/composantsVuetify/VStepper/VStepper.mdx +56 -0
  571. package/src/composantsVuetify/VStepper/v-stepper.stories.ts +563 -0
  572. package/src/designTokens/tokens/amelipro/apContextual.ts +6 -0
  573. package/src/designTokens/tokens/amelipro/apDarkTheme.ts +2 -2
  574. package/src/designTokens/tokens/amelipro/apLightTheme.ts +73 -103
  575. package/src/designTokens/tokens/amelipro/apSemantic.ts +2 -2
  576. package/src/designTokens/tokens/baseContextualTokens.ts +1 -6
  577. package/src/designTokens/tokens/baseTokens.ts +232 -0
  578. package/src/designTokens/tokens/cnam/cnamContextual.ts +6 -0
  579. package/src/designTokens/tokens/cnam/cnamDarkTheme.ts +2 -2
  580. package/src/designTokens/tokens/cnam/cnamLightTheme.ts +76 -104
  581. package/src/designTokens/tokens/pa/paDarkTheme.ts +2 -2
  582. package/src/designTokens/tokens/pa/paLightTheme.ts +74 -99
  583. package/src/designTokens/tokens/pa/paSemantic.ts +2 -0
  584. package/src/designTokens/tokens/semanticTokens.ts +114 -0
  585. package/src/stories/Accessibilite/DesignSystem/a11y-status.json +1 -1
  586. package/src/stories/Components/Components.stories.ts +68 -13
  587. package/src/stories/Demarrer/Releases.stories.ts +45 -2
  588. package/src/stories/DesignTokens/ColorIntegrationExample.vue +2 -3
  589. package/src/stories/DesignTokens/Colors.mdx +8 -8
  590. package/src/stories/DesignTokens/colors.stories.ts +257 -1081
  591. package/src/stories/EcoConception/EcoBestPracticesDoc.vue +930 -0
  592. package/src/stories/EcoConception/EcoBestPratices.mdx +38 -0
  593. package/src/stories/EcoConception/Introduction.mdx +8 -1
  594. package/src/stories/EcoConception/datas/bonnes_pratiques_essentielles.json +1018 -0
  595. package/src/stories/EcoConception/ecoconception-best-practices.stories.ts +20 -0
  596. package/src/stories/GuideDuDev/Amelipro.mdx +9 -1
  597. package/src/stories/GuideDuDev/Amelipro.stories.ts +955 -168
  598. package/src/stories/GuideDuDev/PortailAgent.stories.ts +0 -1
  599. package/src/utils/amelipro/toKebabCase/tests/toKebabCase.spec.ts +52 -0
  600. package/src/utils/formatNir/tests/formatNir.spec.ts +34 -0
  601. package/src/utils/functions/deepCopy/index.ts +2 -3
  602. package/src/utils/tests/insertAt.spec.ts +44 -0
  603. package/dist/apLightTheme-DS0Uy44H.js +0 -954
  604. package/dist/components/Customs/SyCheckbox/locales.d.ts +0 -3
  605. package/dist/components/RatingPicker/tests/RatingPicker.a11y.spect.d.ts +0 -1
  606. package/dist/components/SyHeading/SyHeading.a11y.test.d.ts +0 -1
  607. package/dist/components/SyHeading/SyHeading.test.d.ts +0 -1
  608. package/dist/main-BsJ9ec3i.js +0 -38954
  609. package/src/components/Customs/SyCheckbox/locales.ts +0 -3
  610. package/src/components/Customs/SyTextField/types.d.ts +0 -4
  611. package/src/components/DatePicker/CalendarMode/tests/DatePicker.events.spec.ts +0 -178
  612. /package/src/components/RatingPicker/tests/{RatingPicker.a11y.spect.ts → RatingPicker.a11y.spec.ts} +0 -0
@@ -0,0 +1,1018 @@
1
+ [
2
+ {
3
+ "id": "media-choice",
4
+ "actionNumbers": [
5
+ 48
6
+ ],
7
+ "title": "Choisir les médias les plus sobres",
8
+ "audience": "UX / UI",
9
+ "pillar": {
10
+ "id": "contents",
11
+ "title": "Optimiser les contenus"
12
+
13
+ },
14
+ "summary": "Limiter le volume de données transférées en choisissant le média le plus léger qui permet d’atteindre l’objectif UX et métier.",
15
+ "objective": "Limiter le volume de données transférées en choisissant le média le plus léger qui permet d’atteindre l’objectif UX et métier.",
16
+ "do": [
17
+ "Privilégier le texte ou un schéma simple si cela suffit à expliquer la démarche ou l’information.",
18
+ "Si une image est nécessaire, l’optimiser : format adapté, recadrage, compression, limitation du nombre par écran.",
19
+ "Utiliser l’audio plutôt que la vidéo si l’apport visuel est faible."
20
+ ],
21
+ "dont": [
22
+ "Ajouter des vidéos ou carrousels d’images sans bénéfice clair pour l’utilisateur.",
23
+ "Multiplier les médias décoratifs qui n’apportent rien à la compréhension.",
24
+ "Utiliser systématiquement la vidéo pour moderniser l’interface."
25
+ ],
26
+ "control": [],
27
+ "tables": [],
28
+ "impacts": [],
29
+ "sourcePages": [
30
+ 2
31
+ ],
32
+ "priority": "Moyenne",
33
+ "difficulty": "Faible",
34
+ "essential": true
35
+ },
36
+ {
37
+ "id": "autoplay",
38
+ "actionNumbers": [
39
+ 39
40
+ ],
41
+ "title": "Désactiver la lecture automatique des médias",
42
+ "audience": "UX / UI",
43
+ "pillar": {
44
+ "id": "contents",
45
+ "title": "Optimiser les contenus"
46
+ },
47
+ "summary": "Empêcher le chargement et la lecture de médias lourds sans action explicite de l’utilisateur.",
48
+ "objective": "Empêcher le chargement et la lecture de médias lourds sans action explicite de l’utilisateur, pour réduire la consommation de données et améliorer le confort d’usage.",
49
+ "do": [
50
+ "Afficher une image de prévisualisation légère avec un bouton « Lire la vidéo ».",
51
+ "Charger la vidéo ou l’audio uniquement à l’interaction.",
52
+ "Mettre en avant clairement les contrôles de lecture, pause, volume et sous-titres."
53
+ ],
54
+ "dont": [
55
+ "Lancer automatiquement une vidéo ou un audio à l’ouverture de la page.",
56
+ "Boucler des animations vidéo en arrière-plan.",
57
+ "Désactiver ou masquer les contrôles utilisateurs."
58
+ ],
59
+ "control": [],
60
+ "tables": [],
61
+ "impacts": [],
62
+ "sourcePages": [
63
+ 3
64
+ ],
65
+ "priority": "Haute",
66
+ "difficulty": "Faible",
67
+ "essential": true
68
+ },
69
+ {
70
+ "id": "audio-only",
71
+ "actionNumbers": [
72
+ 59
73
+ ],
74
+ "title": "Proposer un mode « écoute seule » pour les vidéos",
75
+ "audience": "UX / UI",
76
+ "pillar": {
77
+ "id": "contents",
78
+ "title": "Optimiser les contenus"
79
+ },
80
+ "summary": "Permettre l’accès au contenu sans charger la vidéo complète lorsque le visuel n’est pas indispensable.",
81
+ "objective": "Permettre l’accès au contenu sans charger la vidéo complète, particulièrement utile pour les connexions limitées, les utilisateurs mobiles et les besoins d’accessibilité.",
82
+ "do": [
83
+ "Proposer une version audio ou un mode « écouter uniquement » lorsque le visuel n’est pas indispensable.",
84
+ "Ajouter une transcription textuelle du contenu clé pour permettre une consultation encore plus sobre.",
85
+ "Informer l’utilisateur de la différence de poids entre la version vidéo et la version audio."
86
+ ],
87
+ "dont": [
88
+ "Proposer uniquement la vidéo pour des contenus majoritairement oraux.",
89
+ "Forcer le téléchargement du flux complet alors que l’utilisateur souhaite seulement écouter.",
90
+ "Multiplier les formats sans expliquer lequel est le plus économe."
91
+ ],
92
+ "control": [],
93
+ "tables": [],
94
+ "impacts": [],
95
+ "sourcePages": [
96
+ 4
97
+ ],
98
+ "priority": "Moyenne",
99
+ "difficulty": "Moyenne",
100
+ "essential": false
101
+ },
102
+ {
103
+ "id": "animations",
104
+ "actionNumbers": [],
105
+ "title": "Limiter les animations et micro-animations",
106
+ "audience": "UX / UI",
107
+ "pillar": {
108
+ "id": "contents",
109
+ "title": "Optimiser les contenus"
110
+ },
111
+ "summary": "Réduire les calculs graphiques et scripts côté client, améliorer l’accessibilité et éviter les distractions.",
112
+ "objective": "Réduire les calculs graphiques et scripts côté client, améliorer l’accessibilité et éviter les distractions.",
113
+ "do": [
114
+ "Utiliser des transitions simples et courtes uniquement pour aider à la compréhension.",
115
+ "Tester les animations sur des matériels modestes pour vérifier qu’elles ne dégradent pas les performances."
116
+ ],
117
+ "dont": [
118
+ "Créer des animations continues ou décoratives sans utilité fonctionnelle.",
119
+ "Multiplier les micro-interactions sur chaque hover ou scroll.",
120
+ "Basculer des contenus importants dans des animations impossibles à lire sans mouvement."
121
+ ],
122
+ "control": [],
123
+ "tables": [],
124
+ "impacts": [],
125
+ "sourcePages": [
126
+ 5
127
+ ],
128
+ "priority": "Moyenne",
129
+ "difficulty": "Faible",
130
+ "essential": false
131
+ },
132
+ {
133
+ "id": "design-system",
134
+ "actionNumbers": [],
135
+ "title": "Utiliser le Design System",
136
+ "audience": "UX / UI",
137
+ "pillar": {
138
+ "id": "contents",
139
+ "title": "Optimiser les contenus"
140
+
141
+ },
142
+ "summary": "Réduire les temps de conception et de développement, limiter les composants redondants et la dette technique.",
143
+ "objective": "Réduire les temps de conception et de développement, limiter la création de composants redondants et donc la dette technique, pour un service plus sobre et plus maintenable.",
144
+ "do": [
145
+ "Utiliser en priorité les composants et patterns validés du design system.",
146
+ "Mutualiser les besoins et réintégrer un nouveau composant utile dans le design system.",
147
+ "S’aligner sur les styles existants pour éviter les variantes inutiles."
148
+ ],
149
+ "dont": [
150
+ "Créer des composants sur mesure pour chaque projet sans vérifier l’existant.",
151
+ "Multiplier les variations de styles inutiles.",
152
+ "Développer en parallèle plusieurs bibliothèques de composants non synchronisées."
153
+ ],
154
+ "control": [],
155
+ "tables": [],
156
+ "impacts": [],
157
+ "sourcePages": [
158
+ 6
159
+ ],
160
+ "priority": "Moyenne",
161
+ "difficulty": "Moyenne",
162
+ "essential": false
163
+ },
164
+ {
165
+ "id": "images-compression",
166
+ "actionNumbers": [
167
+ 56
168
+ ],
169
+ "title": "Proposer des images dont le niveau de compression est adapté au contenu et au contexte",
170
+ "audience": "Dev Front",
171
+ "pillar": {
172
+ "id": "contents",
173
+ "title": "Optimiser les contenus"
174
+ },
175
+ "summary": "Adapter format, poids et niveau de compression des images à l’usage réel.",
176
+ "objective": "Réduire le poids des images tout en conservant une qualité adaptée au contexte d’affichage.",
177
+ "do": [
178
+ "Choisir le type de compression en fonction du contenu.",
179
+ "Compresser les images avec des outils adaptés.",
180
+ "Tester la qualité après compression sur différents terminaux."
181
+ ],
182
+ "dont": [
183
+ "Utiliser du PNG pour les photos ou images complexes si possible.",
184
+ "Servir des images 4K pour le web sauf si nécessaire.",
185
+ "Appliquer une compression trop agressive rendant les artefacts visibles."
186
+ ],
187
+ "control": [
188
+ "Plugin Green IT Analysis : vérifier l’audit « Optimiser les images bitmap » et l’audit « Optimiser les images SVG ».",
189
+ "L’audit est réussi si les images bitmap et SVG sont optimisées.",
190
+ "L’audit échoue s’il existe une ou plusieurs images à optimiser."
191
+ ],
192
+ "tables": [
193
+ {
194
+ "title": "Compression cible et format en fonction du contexte",
195
+ "headers": [
196
+ "Contexte",
197
+ "Icônes/Logos",
198
+ "Photos",
199
+ "Arrières-plans",
200
+ "Visuels"
201
+ ],
202
+ "rows": [
203
+ [
204
+ "Format",
205
+ "CSS si possible / SVG",
206
+ "WebP qualité 70-80% / JPEG progressive",
207
+ "WebP qualité 50-60%",
208
+ "WebP qualité 80-90% / AVIF"
209
+ ],
210
+ [
211
+ "Poids cible",
212
+ "< 10 Ko",
213
+ "50-150 Ko",
214
+ "< 100 Ko",
215
+ "< 300 Ko"
216
+ ]
217
+ ]
218
+ }
219
+ ],
220
+ "impacts": [
221
+ {
222
+ "label": "Impact écologique",
223
+ "before": "Image non optimisée de 1 Mo vue par 1 M de visiteurs : ~ 1 tonne de CO₂",
224
+ "after": "Image optimisée de 200 Ko : ~ 200 kg de CO₂",
225
+ "gain": "soit -80% d’émission"
226
+ },
227
+ {
228
+ "label": "Impact performance",
229
+ "before": "Image non optimisée de 1 Mo : ~ 2 à 3 s",
230
+ "after": "Image optimisée de 200 Ko : ~ 1 à 1,5 s",
231
+ "gain": "soit 2x moins de temps"
232
+ }
233
+ ],
234
+ "sourcePages": [
235
+ 7,
236
+ 8,
237
+ 9
238
+ ],
239
+ "priority": "Haute",
240
+ "difficulty": "Moyenne",
241
+ "essential": true
242
+ },
243
+ {
244
+ "id": "videos-compression",
245
+ "actionNumbers": [
246
+ 58
247
+ ],
248
+ "title": "Proposer des vidéos dont le niveau de compression est adapté au contenu et au contexte de visualisation",
249
+ "audience": "Dev Front",
250
+ "pillar": {
251
+ "id": "contents",
252
+ "title": "Optimiser les contenus"
253
+
254
+ },
255
+ "summary": "Choisir codec, format et débit adaptés au terminal, au contenu et à la durée.",
256
+ "objective": "Réduire le poids des vidéos tout en conservant une qualité adaptée au contexte de visualisation.",
257
+ "do": [
258
+ "Choisir le bon format : WebM VP9 pour le web, MP4 H.264 pour compatibilité.",
259
+ "Compresser les vidéos avec des outils adaptés.",
260
+ "Redimensionner la vidéo avant l’upload.",
261
+ "Ajouter un poster pour prévisualiser sans charger la vidéo."
262
+ ],
263
+ "dont": [
264
+ "Proposer des vidéos 4K par défaut, surtout sur mobile.",
265
+ "Activer l’autoplay avec son.",
266
+ "Servir des vidéos à bitrate trop élevé pour le web.",
267
+ "Utiliser des GIF animés lourds."
268
+ ],
269
+ "control": [
270
+ "Plugin Green IT Analysis : vérifier que les ressources compressées sont supérieures ou égales à 95%.",
271
+ "L’audit est réussi si 95 à 100% des ressources sont compressées.",
272
+ "Si moins de 95% des ressources sont compressées, il y a échec."
273
+ ],
274
+ "tables": [
275
+ {
276
+ "title": "Compression cible et format en fonction du contexte",
277
+ "headers": [
278
+ "Contexte",
279
+ "Prévention (15/30 sec)",
280
+ "Tutoriel (5/10 min)",
281
+ "Streaming (60 min)"
282
+ ],
283
+ "rows": [
284
+ [
285
+ "Format",
286
+ "WebM (VP9)",
287
+ "MP4 (H.264)",
288
+ "HLS (m3u8) ou DASH"
289
+ ],
290
+ [
291
+ "Poids cible",
292
+ "< 5 Mo",
293
+ "< 50 Mo",
294
+ "< 100 Mo/h"
295
+ ],
296
+ [
297
+ "Astuce",
298
+ "Désactiver l’autoplay",
299
+ "Ajouter des chapitres pour faciliter la navigation",
300
+ ""
301
+ ]
302
+ ]
303
+ }
304
+ ],
305
+ "impacts": [
306
+ {
307
+ "label": "Impact écologique",
308
+ "before": "Vidéo non optimisée de 18 Mo vue par 10 000 visiteurs : ~ 180 kg de CO₂",
309
+ "after": "Vidéo optimisée de 3 Mo : ~ 30 kg de CO₂",
310
+ "gain": "soit 6x moins d’émission"
311
+ },
312
+ {
313
+ "label": "Impact performance",
314
+ "before": "Vidéo non optimisée de 18 Mo : ~ 6 s",
315
+ "after": "Vidéo optimisée de 3 Mo : ~ 1 s",
316
+ "gain": "soit 6x moins de temps"
317
+ }
318
+ ],
319
+ "sourcePages": [
320
+ 10,
321
+ 11,
322
+ 12
323
+ ],
324
+ "priority": "Haute",
325
+ "difficulty": "Moyenne",
326
+ "essential": true
327
+ },
328
+ {
329
+ "id": "media-size",
330
+ "actionNumbers": [
331
+ 66
332
+ ],
333
+ "title": "Dimensionner les éléments graphiques et les médias correspondants au contexte d’affichage",
334
+ "audience": "Dev Front",
335
+ "pillar": {
336
+ "id": "contents",
337
+ "title": "Optimiser les contenus"
338
+
339
+ },
340
+ "summary": "Éviter de servir une ressource plus grande que nécessaire.",
341
+ "objective": "Adapter les dimensions des images et vidéos au contexte réel d’affichage.",
342
+ "do": [
343
+ "Redimensionner les images et vidéos à la taille maximale nécessaire.",
344
+ "Utiliser srcset pour servir plusieurs tailles.",
345
+ "Servir des images différentes selon la résolution de l’écran.",
346
+ "Adapter la qualité selon le réseau."
347
+ ],
348
+ "dont": [
349
+ "Servir des images en 4K par défaut.",
350
+ "Ignorer la densité des écrans."
351
+ ],
352
+ "control": [
353
+ "Plugin Green IT Analysis : vérifier l’audit « Ne pas retailler les images dans le navigateur ».",
354
+ "L’audit est réussi s’il n’y a aucune image retaillée dans le navigateur.",
355
+ "L’audit échoue s’il y a une ou plusieurs images retaillées dans le navigateur."
356
+ ],
357
+ "tables": [
358
+ {
359
+ "title": "Dimension cible en fonction du contexte",
360
+ "headers": [
361
+ "Contexte",
362
+ "Mobile étroit",
363
+ "Mobile large",
364
+ "Tablette",
365
+ "Desktop courant"
366
+ ],
367
+ "rows": [
368
+ [
369
+ "Largeur CSS du slot",
370
+ "100 à 360 px",
371
+ "360 à 600 px",
372
+ "600 à 900 px",
373
+ "900 à 1400 px"
374
+ ],
375
+ [
376
+ "Taille source conseillée",
377
+ "320 / 480 px",
378
+ "480 / 640 px",
379
+ "640 / 960 px",
380
+ "960 / 1280 px"
381
+ ]
382
+ ]
383
+ }
384
+ ],
385
+ "impacts": [
386
+ {
387
+ "label": "Impact écologique",
388
+ "before": "Image non redimensionnée de 1 Mo vue par 1 M de visiteurs : ~ 1 tonne de CO₂",
389
+ "after": "Image redimensionnée de 200 Ko : ~ 200 kg de CO₂",
390
+ "gain": "soit -80% d’émission"
391
+ },
392
+ {
393
+ "label": "Impact performance",
394
+ "before": "Image non redimensionnée de 1 Mo : ~ 2 à 3 s",
395
+ "after": "Image redimensionnée de 200 Ko : ~ 1 à 1,5 s",
396
+ "gain": "soit 2x moins de temps"
397
+ }
398
+ ],
399
+ "sourcePages": [
400
+ 13,
401
+ 14,
402
+ 15
403
+ ],
404
+ "priority": "Moyenne",
405
+ "difficulty": "Moyenne",
406
+ "essential": true
407
+ },
408
+ {
409
+ "id": "responsive",
410
+ "actionNumbers": [
411
+ 11
412
+ ],
413
+ "title": "S’adapter à différents types de terminaux d’affichage",
414
+ "audience": "UX / UI",
415
+ "pillar": {
416
+ "id": "interaction",
417
+ "title": "Optimiser l’interaction utilisateur"
418
+ },
419
+ "summary": "Garantir une interface utilisable sur différents écrans sans multiplier les versions.",
420
+ "objective": "Garantir une interface utilisable sur des écrans variés sans multiplier les versions de pages, tout en évitant des mises en page lourdes et complexes.",
421
+ "do": [
422
+ "Concevoir d’abord pour des écrans modestes avec des pages sobres.",
423
+ "Adapter les contenus aux différents breakpoints en limitant les éléments visibles au strict nécessaire.",
424
+ "Tester la lisibilité et la navigation sur différents appareils."
425
+ ],
426
+ "dont": [
427
+ "Créer une version desktop très riche puis la réduire artificiellement pour le mobile.",
428
+ "Charger les mêmes images très lourdes pour tous les écrans sans adaptation."
429
+ ],
430
+ "control": [],
431
+ "tables": [],
432
+ "impacts": [],
433
+ "sourcePages": [
434
+ 16
435
+ ],
436
+ "priority": "Haute",
437
+ "difficulty": "Moyenne",
438
+ "essential": true
439
+ },
440
+ {
441
+ "id": "form-requests",
442
+ "actionNumbers": [
443
+ 18
444
+ ],
445
+ "title": "Optimiser les requêtes dans les formulaires",
446
+ "audience": "UX / UI",
447
+ "pillar": {
448
+ "id": "interaction",
449
+ "title": "Optimiser l’interaction utilisateur"
450
+ },
451
+ "summary": "Limiter les allers-retours réseau lors de la saisie utilisateur.",
452
+ "objective": "Limiter le nombre d’allers-retours réseau en regroupant les informations nécessaires dans une même requête, pour réduire la charge serveur et le temps de traitement.",
453
+ "do": [
454
+ "Concevoir des formulaires qui valident plusieurs champs en une seule requête.",
455
+ "Utiliser des aides à la saisie côté client pour limiter les erreurs et les renvois.",
456
+ "Regrouper les étapes logiques en écrans cohérents plutôt qu’en nombreuses micro-étapes."
457
+ ],
458
+ "dont": [
459
+ "Appeler le serveur à chaque caractère tapé pour des vérifications non critiques.",
460
+ "Fragmenter excessivement un formulaire en une multitude d’écrans sans gain UX réel.",
461
+ "Recharger toute la page pour valider une seule information."
462
+ ],
463
+ "control": [],
464
+ "tables": [],
465
+ "impacts": [],
466
+ "sourcePages": [
467
+ 17
468
+ ],
469
+ "priority": "Moyenne",
470
+ "difficulty": "Moyenne",
471
+ "essential": false
472
+ },
473
+ {
474
+ "id": "notifications",
475
+ "actionNumbers": [
476
+ 45
477
+ ],
478
+ "title": "Limiter les notifications",
479
+ "audience": "UX / UI",
480
+ "pillar": {
481
+ "id": "interaction",
482
+ "title": "Optimiser l’interaction utilisateur"
483
+ },
484
+ "summary": "Notifier uniquement ce qui est utile et laisser le contrôle à l’utilisateur.",
485
+ "objective": "Réduire le trafic réseau et la sollicitation cognitive, tout en évitant une consultation compulsive du service.",
486
+ "do": [
487
+ "Proposer uniquement des notifications réellement utiles pour l’usage.",
488
+ "Regrouper les notifications plutôt que d’envoyer un message pour chaque micro-événement.",
489
+ "Permettre à l’utilisateur de configurer la fréquence et le type de notifications."
490
+ ],
491
+ "dont": [
492
+ "Activer par défaut toutes les notifications disponibles.",
493
+ "Multiplier les alertes temps réel pour des informations non critiques."
494
+ ],
495
+ "control": [],
496
+ "tables": [],
497
+ "impacts": [],
498
+ "sourcePages": [
499
+ 18
500
+ ],
501
+ "priority": "Haute",
502
+ "difficulty": "Faible",
503
+ "essential": true
504
+ },
505
+ {
506
+ "id": "search-results",
507
+ "actionNumbers": [],
508
+ "title": "Optimiser le moteur de recherche et l’affichage des résultats",
509
+ "audience": "UX / UI",
510
+ "pillar": {
511
+ "id": "requests",
512
+ "title": "Limiter les requêtes et le poids"
513
+ },
514
+ "summary": "Filtrer avant recherche, paginer et éviter les résultats massifs.",
515
+ "objective": "Limiter les volumes de données renvoyés par le serveur et affichés à l’écran, en aidant l’utilisateur à cibler sa recherche avant de lancer la requête.",
516
+ "do": [
517
+ "Proposer des filtres pertinents avant le lancement de la recherche.",
518
+ "Afficher les résultats par pages ou chargement progressif avec un nombre raisonnable de résultats par page.",
519
+ "Afficher clairement le nombre de résultats et les options pour affiner la recherche."
520
+ ],
521
+ "dont": [
522
+ "Afficher d’emblée des milliers de résultats sur une même page avec un scroll infini.",
523
+ "Relancer la recherche à chaque modification mineure sans action explicite de l’utilisateur.",
524
+ "Proposer des filtres trop nombreux ou trop techniques."
525
+ ],
526
+ "control": [],
527
+ "tables": [],
528
+ "impacts": [],
529
+ "sourcePages": [
530
+ 19
531
+ ],
532
+ "priority": "Moyenne",
533
+ "difficulty": "Moyenne",
534
+ "essential": false
535
+ },
536
+ {
537
+ "id": "minify",
538
+ "actionNumbers": [
539
+ 81,
540
+ 82,
541
+ 65,
542
+ 91
543
+ ],
544
+ "title": "Compresser et minifier les fichiers CSS, JavaScript, HTML et SVG",
545
+ "audience": "Dev Front",
546
+ "pillar": {
547
+ "id": "requests",
548
+ "title": "Limiter les requêtes et le poids"
549
+ },
550
+ "summary": "Réduire le poids transféré et activer la compression côté serveur.",
551
+ "objective": "Réduire le poids des fichiers texte transférés au client.",
552
+ "do": [
553
+ "Minifier et compresser automatiquement les fichiers en production.",
554
+ "Activer la compression Gzip/Brotli côté serveur.",
555
+ "Supprimer le code mort et les dépendances inutilisées."
556
+ ],
557
+ "dont": [
558
+ "Minifier en développement au point de rendre le code illisible.",
559
+ "Charger des librairies entières pour une seule fonction.",
560
+ "Négliger la mise en cache des fichiers minifiés.",
561
+ "Utiliser des outils obsolètes."
562
+ ],
563
+ "control": [
564
+ "Plugin Green IT Analysis : vérifier les audits « Compresser les ressources » et « Minifier les CSS et JS ».",
565
+ "L’audit compression est réussi si au moins 95% des ressources sont compressées.",
566
+ "L’audit minification est réussi s’il n’y a aucun fichier CSS ou JS à minifier."
567
+ ],
568
+ "tables": [],
569
+ "impacts": [
570
+ {
571
+ "label": "Impact écologique",
572
+ "before": "Page avec éléments non compressés et non minifiés de 200 Ko vue par 1 M de visiteurs : ~ 200 kg de CO₂",
573
+ "after": "Page avec éléments compressés et minifiés de 30 Ko : ~ 30 kg de CO₂",
574
+ "gain": "soit 6,6x moins d’émission"
575
+ },
576
+ {
577
+ "label": "Impact performance",
578
+ "before": "Page non compressée et non minifiée de 200 Ko : ~ 1 à 1,5 s",
579
+ "after": "Page compressée et minifiée de 30 Ko : ~ 0,15 à 0,20 s",
580
+ "gain": "gain important sur le temps d’affichage"
581
+ }
582
+ ],
583
+ "sourcePages": [
584
+ 20,
585
+ 21,
586
+ 22
587
+ ],
588
+ "priority": "Haute",
589
+ "difficulty": "Faible",
590
+ "essential": true
591
+ },
592
+ {
593
+ "id": "budget",
594
+ "actionNumbers": [
595
+ 63
596
+ ],
597
+ "title": "S’astreindre à un poids maximum par écran et une limite de requête par écran",
598
+ "audience": "Dev Front",
599
+ "pillar": {
600
+ "id": "requests",
601
+ "title": "Limiter les requêtes et le poids"
602
+ },
603
+ "summary": "Définir des budgets mesurables par écran ou parcours.",
604
+ "objective": "Fixer des limites de poids et de requêtes afin de maîtriser les ressources transférées.",
605
+ "do": [
606
+ "Fixer des budgets stricts de poids par écran.",
607
+ "Fixer une limite de requête par page.",
608
+ "Vérifier le respect de ces limites."
609
+ ],
610
+ "dont": [
611
+ "Dépasser 2 Mo par écran sans justification.",
612
+ "Multiplier les requêtes HTTP."
613
+ ],
614
+ "control": [
615
+ "Plugin Green IT Analysis : vérifier les audits « Nombre de requête » et « Taille de la page »."
616
+ ],
617
+ "tables": [
618
+ {
619
+ "title": "Poids et nombre de requête cible en fonction du contexte",
620
+ "headers": [
621
+ "Type d’IHM",
622
+ "Exemple",
623
+ "Poids total cible",
624
+ "Requête cible"
625
+ ],
626
+ "rows": [
627
+ [
628
+ "Page institutionnelle standard",
629
+ "Page d’accueil, page d’explication d’un droit ou service",
630
+ "800 Ko à 1,2 Mo",
631
+ "25 à 40"
632
+ ],
633
+ [
634
+ "Page de parcours usager",
635
+ "Connexion, simulation, prise de rdv, contact",
636
+ "1,2 à 1,8 Mo",
637
+ "35 à 55"
638
+ ],
639
+ [
640
+ "Tableau de bord / espace connecté",
641
+ "Accueil assuré, pro de santé, entreprise",
642
+ "1,5 à 2,5 Mo",
643
+ "40 à 70"
644
+ ],
645
+ [
646
+ "Moteur de recherche et résultats",
647
+ "Annuaire, recherche de paiements, liste de documents",
648
+ "1,5 à 2,5 Mo",
649
+ "40 à 70"
650
+ ],
651
+ [
652
+ "Formulaire complexe",
653
+ "Déclarations, saisie multi-étapes, téléservices",
654
+ "1,5 à 2,5 Mo",
655
+ "40 à 80"
656
+ ],
657
+ [
658
+ "Fiche riche / page média",
659
+ "Page avec contenus éditoriaux, graphiques, cartes, aides contextuelles",
660
+ "1,5 à 3 Mo",
661
+ "40 à 80"
662
+ ]
663
+ ]
664
+ }
665
+ ],
666
+ "impacts": [
667
+ {
668
+ "label": "Impact écologique",
669
+ "before": "Page avec poids de 1 Mo vue par 1 M de visiteurs : ~ 1 tonne de CO₂",
670
+ "after": "Page optimisée de 200 Ko : ~ 200 kg de CO₂",
671
+ "gain": "soit -80% d’émission"
672
+ },
673
+ {
674
+ "label": "Impact performance",
675
+ "before": "Page de 1 Mo : ~ 2 à 3 s",
676
+ "after": "Page optimisée de 200 Ko : ~ 1 à 1,5 s",
677
+ "gain": "soit 2x moins de temps"
678
+ }
679
+ ],
680
+ "sourcePages": [
681
+ 23,
682
+ 24,
683
+ 25
684
+ ],
685
+ "priority": "Haute",
686
+ "difficulty": "Moyenne",
687
+ "essential": true
688
+ },
689
+ {
690
+ "id": "upload-download",
691
+ "actionNumbers": [
692
+ 54
693
+ ],
694
+ "title": "Optimiser l’upload et le download",
695
+ "audience": "UX / UI",
696
+ "pillar": {
697
+ "id": "heavy",
698
+ "title": "Optimiser les traitements “lourds”"
699
+ },
700
+ "summary": "Informer sur les formats et poids acceptés, et éviter les téléchargements complets inutiles.",
701
+ "objective": "Réduire les échecs de téléchargement et les transferts inutiles en cadrant les formats acceptés et en permettant une gestion plus fine des gros fichiers.",
702
+ "do": [
703
+ "Pour l’upload : indiquer clairement le poids maximal et les formats acceptés dès le début du parcours.",
704
+ "Pour l’upload : proposer des aides vers des outils de compression ou des recommandations de formats.",
705
+ "Pour le download : permettre un chapitrage, un upload par lots ou un aperçu dans le cas de gros dossiers."
706
+ ],
707
+ "dont": [
708
+ "Laisser l’utilisateur découvrir les limites de poids ou de format uniquement au moment de l’erreur.",
709
+ "Imposer l’upload d’un unique gros fichier sans alternative.",
710
+ "Effacer la totalité des fichiers déjà transférés en cas d’échec partiel."
711
+ ],
712
+ "control": [],
713
+ "tables": [],
714
+ "impacts": [],
715
+ "sourcePages": [
716
+ 26
717
+ ],
718
+ "priority": "Moyenne",
719
+ "difficulty": "Moyenne",
720
+ "essential": false
721
+ },
722
+ {
723
+ "id": "static-hosting",
724
+ "actionNumbers": [
725
+ 27
726
+ ],
727
+ "title": "Héberger les ressources statiques dont on est l’émetteur sur un même domaine",
728
+ "audience": "Dev Front",
729
+ "pillar": {
730
+ "id": "heavy",
731
+ "title": "Optimiser les traitements “lourds”"
732
+ },
733
+ "summary": "Limiter les domaines et maîtriser les ressources statiques.",
734
+ "objective": "Regrouper les ressources statiques maîtrisées afin de limiter les domaines, les cookies et les transferts inutiles.",
735
+ "do": [
736
+ "Regrouper les ressources statiques sur le domaine principal.",
737
+ "Utiliser un sous-domaine statique sans cookies si nécessaire.",
738
+ "Documenter la règle dans l’architecture et la CI/CD.",
739
+ "Mutualiser les ressources entre pages ou applications du même domaine."
740
+ ],
741
+ "dont": [
742
+ "Héberger ses propres assets sur des domaines tiers non maîtrisés.",
743
+ "Multiplier les domaines pour des petites ressources dispersées.",
744
+ "Servir les ressources statiques depuis un domaine envoyant des cookies applicatifs.",
745
+ "Changer régulièrement de domaines pour les assets."
746
+ ],
747
+ "control": [
748
+ "Plugin Green IT Analysis : vérifier l’audit « Pas de cookie pour les ressources statiques ».",
749
+ "L’audit est réussi s’il n’y a aucun cookie pour les ressources statiques.",
750
+ "L’audit est en échec s’il y a un ou plusieurs cookies pour les ressources statiques."
751
+ ],
752
+ "tables": [],
753
+ "impacts": [
754
+ {
755
+ "label": "Impact écologique",
756
+ "before": "Page de 2 Mo appelant 15 domaines pour charger des ressources statiques : ~ 1,6 tonnes de CO₂",
757
+ "after": "Page n’appelant qu’un domaine : ~ 1,2 tonnes de CO₂",
758
+ "gain": "soit -25% d’émission"
759
+ },
760
+ {
761
+ "label": "Impact performance",
762
+ "before": "First Contentful Paint avec 15 domaines : ~ 3 s",
763
+ "after": "First Contentful Paint avec 1 domaine : ~ 2 s",
764
+ "gain": "soit -34% de temps"
765
+ }
766
+ ],
767
+ "sourcePages": [
768
+ 27,
769
+ 28,
770
+ 29
771
+ ],
772
+ "priority": "Moyenne",
773
+ "difficulty": "Moyenne",
774
+ "essential": false
775
+ },
776
+ {
777
+ "id": "cache",
778
+ "actionNumbers": [
779
+ 64
780
+ ],
781
+ "title": "Instaurer des mécanismes de mise en cache pour les contenus transférés",
782
+ "audience": "Dev Front",
783
+ "pillar": {
784
+ "id": "heavy",
785
+ "title": "Optimiser les traitements “lourds”"
786
+ },
787
+ "summary": "Éviter les recalculs et transferts inutiles grâce à une stratégie de cache.",
788
+ "objective": "Mettre en cache les ressources et contenus transférés dont le service numérique a le contrôle.",
789
+ "do": [
790
+ "Configurer Cache-Control long pour les assets statiques.",
791
+ "Utiliser le cache-busting via hash de build.",
792
+ "Activer le cache conditionnel avec ETag ou Last-Modified.",
793
+ "Configurer CDN avec des règles cache par type."
794
+ ],
795
+ "dont": [
796
+ "Mettre no-cache ou no-store sur les ressources statiques.",
797
+ "Oublier le cache-busting sur assets versionnés.",
798
+ "Cacher du HTML sans stratégie d’invalidation.",
799
+ "Désactiver les cookies sur domaines statiques sans stratégie claire."
800
+ ],
801
+ "control": [
802
+ "Plugin Green IT Analysis : vérifier l’audit « Ajouter expire ou des cache-control headers ».",
803
+ "L’audit est réussi s’il n’y a aucun cookie pour les ressources statiques.",
804
+ "L’audit est un échec s’il y a un ou plusieurs cookies pour les ressources statiques."
805
+ ],
806
+ "tables": [],
807
+ "impacts": [
808
+ {
809
+ "label": "Impact écologique",
810
+ "before": "Page de 2 Mo sans stratégie de mise en cache vue par 1 M de visiteurs : ~ 10 tonnes de CO₂",
811
+ "after": "Page avec cache ne pesant plus que 400 Ko : ~ 2 tonnes de CO₂",
812
+ "gain": "soit -80% d’émission"
813
+ },
814
+ {
815
+ "label": "Impact performance",
816
+ "before": "First Contentful Paint sans cache : ~ 4,8 s",
817
+ "after": "Avec cache : ~ 1,2 s",
818
+ "gain": "soit 4x moins de temps"
819
+ }
820
+ ],
821
+ "sourcePages": [
822
+ 30,
823
+ 31,
824
+ 32
825
+ ],
826
+ "priority": "Haute",
827
+ "difficulty": "Moyenne",
828
+ "essential": true
829
+ },
830
+ {
831
+ "id": "lazy-resources",
832
+ "actionNumbers": [
833
+ 68
834
+ ],
835
+ "title": "Éviter de déclencher le chargement de ressources et de contenus inutilisés pour chaque fonctionnalité",
836
+ "audience": "Dev Front",
837
+ "pillar": {
838
+ "id": "heavy",
839
+ "title": "Optimiser les traitements “lourds”"
840
+ },
841
+ "summary": "Charger au bon moment, seulement pour les fonctionnalités utilisées.",
842
+ "objective": "Éviter de charger du code, des images ou des styles inutilisés avant que l’utilisateur en ait besoin.",
843
+ "do": [
844
+ "Découper le JavaScript par page.",
845
+ "Charger les images seulement quand on arrive dessus.",
846
+ "Mettre le CSS important en premier, le reste après.",
847
+ "Vérifier avant de charger une librairie lourde."
848
+ ],
849
+ "dont": [
850
+ "Balancer tout le JavaScript sur chaque page.",
851
+ "Mettre des photos géantes partout.",
852
+ "Charger des bibliothèques au cas où.",
853
+ "Précharger des trucs non essentiels."
854
+ ],
855
+ "control": [
856
+ "Plugin Green IT Analysis : vérifier les audits « Limiter le nombre de fichiers CSS » et « Ne télécharger pas des images inutilement ».",
857
+ "L’audit CSS est réussi si le nombre de fichiers CSS est inférieur ou égal à 10.",
858
+ "L’audit images est réussi si aucune image n’est téléchargée inutilement."
859
+ ],
860
+ "tables": [],
861
+ "impacts": [
862
+ {
863
+ "label": "Impact écologique",
864
+ "before": "Page de 1 Mo sans stratégie de non déclenchement : ~ 5 tonnes de CO₂",
865
+ "after": "Page avec stratégie et poids plus que 500 Ko : ~ 2,5 tonnes de CO₂",
866
+ "gain": "soit -50% d’émission"
867
+ },
868
+ {
869
+ "label": "Impact performance",
870
+ "before": "Largest Contentful Paint sans stratégie : ~ 5,2 s",
871
+ "after": "Avec stratégie : ~ 1,8 s",
872
+ "gain": "soit 2,88x moins de temps"
873
+ }
874
+ ],
875
+ "sourcePages": [
876
+ 33,
877
+ 34,
878
+ 35
879
+ ],
880
+ "priority": "Haute",
881
+ "difficulty": "Moyenne",
882
+ "essential": true
883
+ },
884
+ {
885
+ "id": "dom",
886
+ "actionNumbers": [
887
+ 74
888
+ ],
889
+ "title": "Réduire les accès au DOM via JavaScript",
890
+ "audience": "Dev Front",
891
+ "pillar": {
892
+ "id": "heavy",
893
+ "title": "Optimiser les traitements “lourds”"
894
+ },
895
+ "summary": "Limiter les repaint/reflow et regrouper les modifications DOM.",
896
+ "objective": "Réduire les manipulations DOM coûteuses et répétées.",
897
+ "do": [
898
+ "Stocker les éléments du DOM dans des variables JavaScript réutilisables dès la première récupération.",
899
+ "Privilégier la délégation d’événements sur un parent unique plutôt que d’attacher à chaque enfant."
900
+ ],
901
+ "dont": [
902
+ "Rechercher le même élément du DOM en boucle.",
903
+ "Modifier le style ou le contenu à chaque petit changement.",
904
+ "Lire des infos dans le DOM alors que tu les as déjà en JS.",
905
+ "Surcharger le DOM avec des éléments inutiles."
906
+ ],
907
+ "control": [
908
+ "Plugin Green IT Analysis : vérifier l’audit « Taille du DOM ».",
909
+ "La taille du DOM mesure le nombre total d’éléments HTML dans l’arbre du Document Object Model.",
910
+ "Plus le DOM est grand, plus le navigateur passe du temps à rendre la page."
911
+ ],
912
+ "tables": [
913
+ {
914
+ "title": "Taille du DOM en fonction du type de page",
915
+ "headers": [
916
+ "Type d’IHM",
917
+ "Exemple",
918
+ "Poids total cible"
919
+ ],
920
+ "rows": [
921
+ [
922
+ "Page statique",
923
+ "Accueil simple avec hero + menu + CTA",
924
+ "< 400"
925
+ ],
926
+ [
927
+ "Page contenu article",
928
+ "Blog post avec 3 images, paragraphes",
929
+ "< 800"
930
+ ],
931
+ [
932
+ "Liste/filtres dashboard",
933
+ "Projets avec chips + pagination",
934
+ "< 1000"
935
+ ],
936
+ [
937
+ "Formulaires complexes",
938
+ "Déclarations, saisie multi-étapes, téléservices",
939
+ "< 1200"
940
+ ],
941
+ [
942
+ "Fiche riche / page média",
943
+ "Page avec contenu éditorial, graphiques, cartes, aides contextuelles",
944
+ "1,5 à 3 Mo"
945
+ ]
946
+ ]
947
+ }
948
+ ],
949
+ "impacts": [
950
+ {
951
+ "label": "Impact écologique",
952
+ "before": "Page de 500 Ko avec accès DOM répétés : ~ 200 kg de CO₂",
953
+ "after": "Page avec bundle optimisé et total : ~ 190 kg de CO₂",
954
+ "gain": "soit -5% d’émission"
955
+ },
956
+ {
957
+ "label": "Impact performance",
958
+ "before": "Largest Contentful Paint avec accès DOM répétés : ~ 2,1 s",
959
+ "after": "Avec accès DOM réduits : ~ 1,6 s",
960
+ "gain": "gain sur le temps de rendu"
961
+ }
962
+ ],
963
+ "sourcePages": [
964
+ 36,
965
+ 37,
966
+ 38
967
+ ],
968
+ "priority": "Moyenne",
969
+ "difficulty": "Moyenne",
970
+ "essential": false
971
+ },
972
+ {
973
+ "id": "async-processing",
974
+ "actionNumbers": [
975
+ 75
976
+ ],
977
+ "title": "Proposer un traitement asynchrone lorsque c’est possible",
978
+ "audience": "Dev Front",
979
+ "pillar": {
980
+ "id": "async",
981
+ "title": "Favoriser les traitements asynchrones"
982
+ },
983
+ "summary": "Déporter les traitements longs et éviter le blocage utilisateur.",
984
+ "objective": "Favoriser les traitements asynchrones lorsque cela est possible afin d’éviter les blocages et les surcharges.",
985
+ "do": [
986
+ "Déclencher le traitement lourd côté serveur et notifier l’utilisateur par email avec un lien de récupération.",
987
+ "Implémenter des workers ou queues pour traiter par lots en arrière-plan.",
988
+ "Lisser la charge serveur via batching."
989
+ ],
990
+ "dont": [
991
+ "Bloquer l’utilisateur avec un traitement synchrone long.",
992
+ "N’exécuter que des tâches CPU-intensives ou I/O lourdes directement dans la réponse HTTP synchrone.",
993
+ "Surcharger les serveurs de présentation avec des pics de charge non lissés."
994
+ ],
995
+ "control": [],
996
+ "tables": [],
997
+ "impacts": [
998
+ {
999
+ "label": "Impact écologique",
1000
+ "before": "Page de 1 Mo sans traitements asynchrones : ~ 5 tonnes de CO₂",
1001
+ "after": "Page avec traitements asynchrones : ~ 2,5 tonnes de CO₂",
1002
+ "gain": "soit -50% d’émission"
1003
+ },
1004
+ {
1005
+ "label": "Impact performance",
1006
+ "before": "Largest Contentful Paint sans traitement asynchrone : ~ 2,3 s",
1007
+ "after": "Avec traitement asynchrone : ~ 1,9 s",
1008
+ "gain": "soit -23% de temps"
1009
+ }
1010
+ ],
1011
+ "sourcePages": [
1012
+ 39
1013
+ ],
1014
+ "priority": "Haute",
1015
+ "difficulty": "Faible",
1016
+ "essential": true
1017
+ }
1018
+ ]