@cnamts/synapse 1.0.11 → 1.0.13

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 (200) hide show
  1. package/dist/{DateFilter-QEfKOz0P.js → DateFilter-_EFzsvvM.js} +1 -1
  2. package/dist/{NumberFilter-C0h7gVzp.js → NumberFilter-CUxEbKJh.js} +1 -1
  3. package/dist/{PeriodFilter-8dVrKjju.js → PeriodFilter-D5ueqtKy.js} +1 -1
  4. package/dist/{SelectFilter-BI3QGbqb.js → SelectFilter-BciBNydy.js} +1 -1
  5. package/dist/{TextFilter-UOp1hcPp.js → TextFilter-DMN_WAQB.js} +1 -1
  6. package/dist/components/Amelipro/AmeliproAccordion/AmeliproAccordion.d.ts +7 -3
  7. package/dist/components/Amelipro/AmeliproAccordion/AmeliproAccordionTemplate/AmeliproAccordionTemplate.d.ts +1 -1
  8. package/dist/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.d.ts +2 -0
  9. package/dist/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResult.d.ts +7 -3
  10. package/dist/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResultTemplate/AmeliproAccordionResultTemplate.d.ts +1 -1
  11. package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +50 -68
  12. package/dist/components/Amelipro/AmeliproCard/AmeliproCard.d.ts +1 -1
  13. package/dist/components/Amelipro/AmeliproIcon/AmeliproIcon.d.ts +1 -1
  14. package/dist/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.d.ts +5 -5
  15. package/dist/components/Amelipro/AmeliproMultipleFoldingCard/AmeliproMultipleFoldingCard.d.ts +1 -1
  16. package/dist/components/Amelipro/AmeliproNumberedCard/AmeliproNumberedCard.d.ts +1 -1
  17. package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.d.ts +24 -32
  18. package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.d.ts +36 -48
  19. package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +50 -68
  20. package/dist/components/Amelipro/AmeliproTable/AmeliproTable.d.ts +4 -0
  21. package/dist/components/Amelipro/AmeliproTable/types.d.ts +11 -0
  22. package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +50 -68
  23. package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +0 -4
  24. package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +12 -16
  25. package/dist/components/Captcha/Captcha.d.ts +68 -0
  26. package/dist/components/Captcha/CaptchaAlert.d.ts +13 -0
  27. package/dist/components/Captcha/CaptchaBase.d.ts +55 -0
  28. package/dist/components/Captcha/CaptchaBtn.d.ts +12 -0
  29. package/dist/components/Captcha/CaptchaForm.d.ts +16 -0
  30. package/dist/components/Captcha/CaptchaImg.d.ts +12 -0
  31. package/dist/components/Captcha/CaptchaInformation.d.ts +20 -0
  32. package/dist/components/Captcha/captchaApi.d.ts +41 -0
  33. package/dist/components/Captcha/icons/volumeUp.d.ts +2 -0
  34. package/dist/components/Captcha/locales.d.ts +35 -0
  35. package/dist/components/Captcha/types.d.ts +2 -0
  36. package/dist/components/ChipList/ChipList.d.ts +2 -2
  37. package/dist/components/CookiesSelection/CookiesInformation/CookiesInformation.d.ts +14 -14
  38. package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +5 -5
  39. package/dist/components/Customs/SyForm/SyForm.d.ts +6 -3
  40. package/dist/components/Customs/SyTextField/SyTextField.d.ts +12 -16
  41. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +96 -68
  42. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +63 -38
  43. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +23 -27
  44. package/dist/components/DatePicker/composables/useDatePickerViewMode.d.ts +2 -1
  45. package/dist/components/DatePicker/tests/setup.d.ts +816 -520
  46. package/dist/components/HeaderToolbar/HeaderToolbar.d.ts +10 -10
  47. package/dist/components/NirField/NirField.d.ts +31 -34
  48. package/dist/components/NirField/locales.d.ts +1 -3
  49. package/dist/components/PasswordField/PasswordField.d.ts +2 -0
  50. package/dist/components/PeriodField/PeriodField.d.ts +192 -128
  51. package/dist/components/PhoneField/PhoneField.d.ts +13 -17
  52. package/dist/components/SearchListField/SearchListField.d.ts +5 -5
  53. package/dist/components/SyTextArea/SyTextArea.d.ts +0 -4
  54. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +5 -8
  55. package/dist/components/Tables/SyTable/SyTable.d.ts +5 -8
  56. package/dist/components/Tables/common/SyTablePagination.d.ts +5 -5
  57. package/dist/components/Tables/common/types.d.ts +4 -0
  58. package/dist/components/Tables/common/usePagination.d.ts +3 -4
  59. package/dist/components/Tables/common/useTableCheckbox.d.ts +10 -6
  60. package/dist/components/index.d.ts +1 -0
  61. package/dist/composables/validation/useFormValidation.d.ts +10 -0
  62. package/dist/composables/validation/useValidatable.d.ts +10 -2
  63. package/dist/design-system-v3.js +126 -125
  64. package/dist/design-system-v3.umd.cjs +265 -265
  65. package/dist/main-DISHlqcd.js +34217 -0
  66. package/dist/style.css +1 -1
  67. package/package.json +1 -1
  68. package/src/assets/overrides/_forms.scss +2 -0
  69. package/src/components/Amelipro/AmeliproAccordion/AmeliproAccordion.stories.ts +7 -4
  70. package/src/components/Amelipro/AmeliproAccordion/AmeliproAccordion.vue +2 -0
  71. package/src/components/Amelipro/AmeliproAccordionFrieze/AmeliproAccordionFrieze.vue +1 -0
  72. package/src/components/Amelipro/AmeliproAccordionFrieze/__tests__/__snapshots__/AmeliproAccordionFrieze.spec.ts.snap +574 -112
  73. package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.stories.ts +5 -2
  74. package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.vue +2 -1
  75. package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResult.stories.ts +6 -3
  76. package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResult.vue +2 -0
  77. package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.stories.ts +5 -2
  78. package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.vue +2 -1
  79. package/src/components/Amelipro/AmeliproCheckbox/__tests__/AmeliproCheckbox.spec.ts +175 -0
  80. package/src/components/Amelipro/AmeliproCheckbox/__tests__/__snapshots__/AmeliproCheckbox.spec.ts.snap +88 -0
  81. package/src/components/Amelipro/AmeliproCheckboxGroup/__tests__/AmeliproCheckboxGroup.spec.ts +423 -0
  82. package/src/components/Amelipro/AmeliproCheckboxGroup/{tests → __tests__}/__snapshots__/AmeliproCheckboxGroup.spec.ts.snap +112 -78
  83. package/src/components/Amelipro/AmeliproChips/__tests__/AmeliproChips.spec.ts +92 -0
  84. package/src/components/Amelipro/AmeliproChips/__tests__/__snapshots__/AmeliproChips.spec.ts.snap +81 -0
  85. package/src/components/Amelipro/AmeliproDialog/__tests__/AmeliproDialog.spec.ts +257 -0
  86. package/src/components/Amelipro/AmeliproDialog/__tests__/__snapshots__/AmeliproDialog.spec.ts.snap +61 -0
  87. package/src/components/Amelipro/AmeliproDisclosure/__tests__/AmeliproDisclosure.spec.ts +79 -0
  88. package/src/components/Amelipro/AmeliproDisclosure/__tests__/__snapshots__/AmeliproDisclosure.spec.ts.snap +89 -0
  89. package/src/components/Amelipro/AmeliproFooter/AmeliproFooter.vue +6 -7
  90. package/src/components/Amelipro/AmeliproFooter/__tests__/AmeliproFooter.spec.ts +787 -0
  91. package/src/components/Amelipro/AmeliproFooter/__tests__/__snapshots__/AmeliproFooter.spec.ts.snap +318 -0
  92. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/__tests__/AmeliproHeaderBrandSection.spec.ts +167 -0
  93. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/__tests__/__snapshots__/AmeliproHeaderBrandSection.spec.ts.snap +100 -0
  94. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/__tests__/AmeliproHeaderBar.spec.ts +312 -0
  95. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/__tests__/__snapshots__/AmeliproHeaderBar.spec.ts.snap +98 -0
  96. package/src/components/Amelipro/AmeliproHeader/__tests__/AmeliproHeader.spec.ts +361 -0
  97. package/src/components/Amelipro/AmeliproHeader/__tests__/__snapshots__/AmeliproHeader.spec.ts.snap +22 -0
  98. package/src/components/Amelipro/AmeliproMenu/__tests__/AmeliproMenu.spec.ts +168 -0
  99. package/src/components/Amelipro/AmeliproMenu/__tests__/__snapshots__/AmeliproMenu.spec.ts.snap +295 -0
  100. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproDropdownMenu/AmeliproDropdownMenuBtn/__tests__/AmeliproDropdownMenuBtn.spec.ts +128 -0
  101. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproDropdownMenu/AmeliproDropdownMenuBtn/__tests__/__snapshots__/AmeliproDropdownMenuBtn.spec.ts.snap +67 -0
  102. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproDropdownMenu/__tests__/AmeliproDropdownMenu.spec.ts +266 -0
  103. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproDropdownMenu/__tests__/__snapshots__/AmeliproDropdownMenu.spec.ts.snap +134 -0
  104. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproMessagingMenuBtn/__tests__/AmeliproMessagingMenuBtn.spec.ts +72 -0
  105. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproMessagingMenuBtn/__tests__/__snapshots__/AmeliproMessagingMenuBtn.spec.ts.snap +71 -0
  106. package/src/components/Amelipro/AmeliproPageLayout/tests/__snapshots__/AmeliproPageLayout.spec.ts.snap +12 -0
  107. package/src/components/Amelipro/AmeliproTable/AmeliproTable.stories.ts +81 -9
  108. package/src/components/Amelipro/AmeliproTable/AmeliproTable.vue +139 -61
  109. package/src/components/Amelipro/AmeliproTable/__tests__/AmeliproTable.spec.ts +10 -0
  110. package/src/components/Amelipro/AmeliproTable/__tests__/__snapshots__/AmeliproTable.spec.ts.snap +361 -187
  111. package/src/components/Amelipro/AmeliproTable/types.d.ts +11 -0
  112. package/src/components/Captcha/Captcha.mdx +72 -0
  113. package/src/components/Captcha/Captcha.stories.ts +276 -0
  114. package/src/components/Captcha/Captcha.vue +325 -0
  115. package/src/components/Captcha/CaptchaAlert.vue +60 -0
  116. package/src/components/Captcha/CaptchaBase.vue +219 -0
  117. package/src/components/Captcha/CaptchaBtn.vue +35 -0
  118. package/src/components/Captcha/CaptchaForm.vue +58 -0
  119. package/src/components/Captcha/CaptchaImg.vue +41 -0
  120. package/src/components/Captcha/CaptchaInformation.vue +64 -0
  121. package/src/components/Captcha/captchaApi.ts +111 -0
  122. package/src/components/Captcha/icons/volumeUp.vue +11 -0
  123. package/src/components/Captcha/locales.ts +35 -0
  124. package/src/components/Captcha/readme.md +5 -0
  125. package/src/components/Captcha/tests/Captcha.spec.ts +298 -0
  126. package/src/components/Captcha/tests/__snapshots__/Captcha.spec.ts.snap +716 -0
  127. package/src/components/Captcha/types.ts +2 -0
  128. package/src/components/Customs/Selects/SySelect/SySelect.vue +2 -2
  129. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +4 -0
  130. package/src/components/Customs/SyForm/SyForm.stories.ts +133 -23
  131. package/src/components/Customs/SyForm/SyForm.vue +17 -1
  132. package/src/components/Customs/SyTextField/SyTextField.vue +29 -7
  133. package/src/components/DatePicker/CalendarMode/DatePicker.vue +32 -9
  134. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +154 -18
  135. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +2 -2
  136. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +35 -4
  137. package/src/components/DatePicker/composables/tests/useDatePickerViewMode.spec.ts +107 -72
  138. package/src/components/DatePicker/composables/tests/useMonthButtonCustomization.spec.ts +6 -6
  139. package/src/components/DatePicker/composables/useDatePickerViewMode.ts +57 -7
  140. package/src/components/DatePicker/composables/useMonthButtonCustomization.ts +14 -14
  141. package/src/components/DatePicker/tests/navigation.regression.spec.ts +74 -0
  142. package/src/components/DatePicker/tests/navigation.simple.spec.ts +137 -0
  143. package/src/components/NirField/NirField.stories.ts +85 -2
  144. package/src/components/NirField/NirField.vue +55 -18
  145. package/src/components/NirField/locales.ts +1 -3
  146. package/src/components/PasswordField/PasswordField.vue +39 -7
  147. package/src/components/PhoneField/PhoneField.vue +43 -10
  148. package/src/components/RangeField/tests/RangeField.spec.ts +0 -3
  149. package/src/components/Tables/SyServerTable/SyServerTable.mdx +15 -0
  150. package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +309 -0
  151. package/src/components/Tables/SyServerTable/SyServerTable.vue +18 -3
  152. package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +67 -0
  153. package/src/components/Tables/SyTable/SyTable.mdx +15 -0
  154. package/src/components/Tables/SyTable/SyTable.stories.ts +228 -0
  155. package/src/components/Tables/SyTable/SyTable.vue +18 -3
  156. package/src/components/Tables/SyTable/tests/SyTable.spec.ts +63 -0
  157. package/src/components/Tables/common/SyTablePagination.vue +10 -8
  158. package/src/components/Tables/common/types.ts +4 -0
  159. package/src/components/Tables/common/usePagination.ts +11 -20
  160. package/src/components/Tables/common/useTableCheckbox.ts +23 -11
  161. package/src/components/index.ts +1 -0
  162. package/src/composables/validation/AvecVosComposants.mdx.old +1 -1
  163. package/src/composables/validation/FormValidation.stories.ts.old +5 -5
  164. package/src/composables/validation/useFormValidation.ts +46 -8
  165. package/src/composables/validation/useValidatable.ts +19 -8
  166. package/src/stories/Accessibilite/Introduction.mdx +1 -1
  167. package/src/stories/Demarrer/EnrichirLeDesignSystem.mdx +43 -0
  168. package/src/stories/Demarrer/EnrichirLeDesignSystem.stories.ts +239 -0
  169. package/src/stories/Demarrer/SignalerUneAnomalie.mdx +39 -0
  170. package/src/stories/Demarrer/SignalerUneAnomalie.stories.ts +261 -0
  171. package/dist/main-DyEOPqqn.js +0 -33329
  172. package/src/components/Amelipro/AmeliproCheckbox/tests/AmeliproCheckbox.spec.ts +0 -19
  173. package/src/components/Amelipro/AmeliproCheckbox/tests/__snapshots__/AmeliproCheckbox.spec.ts.snap +0 -40
  174. package/src/components/Amelipro/AmeliproCheckboxGroup/tests/AmeliproCheckboxGroup.spec.ts +0 -46
  175. package/src/components/Amelipro/AmeliproChips/tests/AmeliproChips.spec.ts +0 -16
  176. package/src/components/Amelipro/AmeliproChips/tests/__snapshots__/AmeliproChips.spec.ts.snap +0 -97
  177. package/src/components/Amelipro/AmeliproDialog/tests/AmeliproDialog.spec.ts +0 -24
  178. package/src/components/Amelipro/AmeliproDialog/tests/__snapshots__/AmeliproDialog.spec.ts.snap +0 -134
  179. package/src/components/Amelipro/AmeliproDisclosure/tests/AmeliproDisclosure.spec.ts +0 -19
  180. package/src/components/Amelipro/AmeliproDisclosure/tests/__snapshots__/AmeliproDisclosure.spec.ts.snap +0 -104
  181. package/src/components/Amelipro/AmeliproFooter/tests/AmeliproFooter.spec.ts +0 -15
  182. package/src/components/Amelipro/AmeliproFooter/tests/__snapshots__/AmeliproFooter.spec.ts.snap +0 -432
  183. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/tests/AmeliproHeaderBrandSection.spec.ts +0 -15
  184. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/tests/__snapshots__/AmeliproHeaderBrandSection.spec.ts.snap +0 -131
  185. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/tests/AmeliproHeaderBar.spec.ts +0 -15
  186. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/tests/__snapshots__/AmeliproHeaderBar.spec.ts.snap +0 -172
  187. package/src/components/Amelipro/AmeliproHeader/tests/AmeliproHeader.spec.ts +0 -159
  188. package/src/components/Amelipro/AmeliproHeader/tests/__snapshots__/AmeliproHeader.spec.ts.snap +0 -841
  189. package/src/components/Amelipro/AmeliproMenu/tests/AmeliproMenu.spec.ts +0 -85
  190. package/src/components/Amelipro/AmeliproMenu/tests/__snapshots__/AmeliproMenu.spec.ts.snap +0 -537
  191. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproDropdownMenu/AmeliproDropdownMenuBtn/tests/AmeliproDropdownMenuBtn.spec.ts +0 -16
  192. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproDropdownMenu/AmeliproDropdownMenuBtn/tests/__snapshots__/AmeliproDropdownMenuBtn.spec.ts.snap +0 -56
  193. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproDropdownMenu/tests/AmeliproDropdownMenu.spec.ts +0 -28
  194. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproDropdownMenu/tests/__snapshots__/AmeliproDropdownMenu.spec.ts.snap +0 -300
  195. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproMessagingMenuBtn/tests/AmeliproMessagingMenuBtn.spec.ts +0 -16
  196. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproMessagingMenuBtn/tests/__snapshots__/AmeliproMessagingMenuBtn.spec.ts.snap +0 -89
  197. package/src/components/BackBtn/tests/__snapshots__/BackBtn.spec.ts.snap +0 -45
  198. package/src/components/RangeField/tests/__snapshots__/RangeField.spec.ts.snap +0 -1270
  199. package/src/stories/Demarrer/CreerUneIssue.mdx +0 -67
  200. package/src/stories/Demarrer/components.stories.ts +0 -25
@@ -3,7 +3,7 @@
3
3
  defineOptions({
4
4
  inheritAttrs: false,
5
5
  })
6
- import { mdiInformation, mdiMenuDown, mdiCloseCircle } from '@mdi/js'
6
+ import { mdiInformation, mdiChevronDown, mdiCloseCircle } from '@mdi/js'
7
7
  import { ref, watch, onMounted, computed, nextTick, type PropType } from 'vue'
8
8
  import { useSySelectKeyboard } from './composables/useSySelectKeyboard'
9
9
  import { vRgaaSvgFix } from '../../../../directives/rgaaSvgFix'
@@ -839,7 +839,7 @@
839
839
  </button>
840
840
  <SyIcon
841
841
  class="arrow"
842
- :icon="mdiMenuDown"
842
+ :icon="mdiChevronDown"
843
843
  :decorative="true"
844
844
  />
845
845
  </template>
@@ -364,6 +364,10 @@
364
364
  cursor: pointer;
365
365
  }
366
366
 
367
+ :deep(.v-label) {
368
+ margin-left: 8px;
369
+ }
370
+
367
371
  :deep(.v-selection-control--disabled .v-selection-control__input) {
368
372
  cursor: not-allowed;
369
373
  }
@@ -33,7 +33,7 @@ export const Basic: Story = {
33
33
  setup() {
34
34
  const name = ref('')
35
35
  const email = ref('')
36
- const form = ref<{ validate: () => Promise<boolean> } | null>(null)
36
+ const form = ref<{ validate: () => Promise<boolean>, reset: () => void, clearValidation: () => void } | null>(null)
37
37
 
38
38
  // Règles de validation selon le design system
39
39
  const emailRules = [
@@ -56,9 +56,11 @@ export const Basic: Story = {
56
56
  template: `
57
57
  <SyForm ref="form" v-bind="args" @submit="submitForm">
58
58
  <div class="d-flex flex-column gap-4">
59
- <SyTextField v-model="name" label="Nom" required />
60
- <SyTextField v-model="email" label="Email" :custom-rules="emailRules" />
61
- <v-btn type="submit" color="primary">Soumettre</v-btn>
59
+ <SyTextField v-model="name" label="Nom" required class="mb-2" />
60
+ <SyTextField v-model="email" label="Email" :custom-rules="emailRules" class="mb-2" />
61
+ <div class="d-flex gap-3">
62
+ <v-btn type="submit" color="primary">Soumettre</v-btn>
63
+ </div>
62
64
  </div>
63
65
  </SyForm>
64
66
  `,
@@ -74,9 +76,11 @@ export const Basic: Story = {
74
76
  <template>
75
77
  <SyForm ref="form" v-bind="args" @submit="submitForm">
76
78
  <div class="d-flex flex-column gap-4">
77
- <SyTextField v-model="name" label="Nom" required />
78
- <SyTextField v-model="email" label="Email" :custom-rules="emailRules" />
79
- <v-btn type="submit" color="primary">Soumettre</v-btn>
79
+ <SyTextField v-model="name" label="Nom" required class="mb-2" />
80
+ <SyTextField v-model="email" label="Email" :custom-rules="emailRules" class="mb-2" />
81
+ <div class="d-flex gap-3">
82
+ <v-btn type="submit" color="primary">Soumettre</v-btn>
83
+ </div>
80
84
  </div>
81
85
  </SyForm>
82
86
  </template>
@@ -118,7 +122,7 @@ export const CustomValidation: Story = {
118
122
  const username = ref('')
119
123
  const password = ref('')
120
124
  const confirmPassword = ref('')
121
- const form = ref<{ validate: () => Promise<boolean> } | null>(null)
125
+ const form = ref<{ validate: () => Promise<boolean>, reset: () => void, clearValidation: () => void } | null>(null)
122
126
 
123
127
  // Règles de validation
124
128
  const passwordRules = computed(() => [
@@ -160,17 +164,18 @@ export const CustomValidation: Story = {
160
164
  <div>
161
165
  <SyForm ref="form" v-bind="args" @submit="submitForm">
162
166
  <div class="d-flex flex-column gap-4">
163
- <SyTextField v-model="username" label="Nom d'utilisateur" required />
164
- <SyTextField v-model="password" label="Mot de passe" type="password" :custom-rules="passwordRules" />
167
+ <SyTextField v-model="username" label="Nom d'utilisateur" required class="mb-2" />
168
+ <SyTextField v-model="password" label="Mot de passe" type="password" :custom-rules="passwordRules" class="mb-2" />
165
169
  <SyTextField
166
170
  v-model="confirmPassword"
167
171
  label="Confirmer le mot de passe"
168
172
  type="password"
169
173
  required
170
- :custom-rules="confirmPasswordRules"
174
+ :custom-rules="confirmPasswordRules"
175
+ class="mb-2"
171
176
  />
172
177
  <div class="d-flex gap-3">
173
- <v-btn type="submit" color="primary">S'inscrire</v-btn>
178
+ <v-btn type="submit" color="primary" class="mr-2">S'inscrire</v-btn>
174
179
  <v-btn @click="validateManually" color="secondary">Valider sans soumettre</v-btn>
175
180
  </div>
176
181
  </div>
@@ -187,16 +192,17 @@ export const CustomValidation: Story = {
187
192
  <div>
188
193
  <SyForm ref="form" @submit="onSubmit">
189
194
  <div class="d-flex flex-column gap-4">
190
- <SyTextField v-model="username" label="Nom d'utilisateur" required />
191
- <SyTextField v-model="password" label="Mot de passe" type="password" :custom-rules="passwordRules" />
195
+ <SyTextField v-model="username" label="Nom d'utilisateur" required class="mb-2" />
196
+ <SyTextField v-model="password" label="Mot de passe" type="password" :custom-rules="passwordRules" class="mb-2" />
192
197
  <SyTextField
193
198
  v-model="confirmPassword"
194
199
  label="Confirmer le mot de passe"
195
200
  type="password"
196
201
  :custom-rules="confirmPasswordRules"
202
+ class="mb-2"
197
203
  />
198
204
  <div class="d-flex gap-3">
199
- <v-btn type="submit" color="primary">S'inscrire</v-btn>
205
+ <v-btn type="submit" color="primary" class="mr-2">S'inscrire</v-btn>
200
206
  <v-btn @click="validateManually" color="secondary">Valider sans soumettre</v-btn>
201
207
  </div>
202
208
  </div>
@@ -296,10 +302,12 @@ export const MixedFields: Story = {
296
302
  template: `
297
303
  <SyForm ref="form" v-bind="args" @submit="submitForm">
298
304
  <div class="d-flex flex-column gap-4">
299
- <SyTextField v-model="formData.name" label="Nom complet" required />
300
- <SyTextField v-model="formData.email" label="Email" :custom-rules="emailCustomRules" />
301
- <SySelect v-model="formData.country" :items="countries" label="Pays" required />
302
- <v-btn type="submit" color="primary">Enregistrer</v-btn>
305
+ <SyTextField v-model="formData.name" label="Nom complet" required class="mb-2" />
306
+ <SyTextField v-model="formData.email" label="Email" :custom-rules="emailCustomRules" class="mb-2" />
307
+ <SySelect v-model="formData.country" :items="countries" label="Pays" required class="mb-2" />
308
+ <div class="d-flex gap-3">
309
+ <v-btn type="submit" color="primary">Enregistrer</v-btn>
310
+ </div>
303
311
  </div>
304
312
  </SyForm>
305
313
  `,
@@ -312,10 +320,12 @@ export const MixedFields: Story = {
312
320
  <template>
313
321
  <SyForm ref="form" v-bind="args" @submit="submitForm">
314
322
  <div class="d-flex flex-column gap-4">
315
- <SyTextField v-model="formData.name" label="Nom complet" required />
316
- <SyTextField v-model="formData.email" label="Email" :customRules="emailCustomRules" />
317
- <SySelect v-model="formData.country" :items="countries" label="Pays" required />
318
- <v-btn type="submit" color="primary">Enregistrer</v-btn>
323
+ <SyTextField v-model="formData.name" label="Nom complet" required class="mb-2" />
324
+ <SyTextField v-model="formData.email" label="Email" :customRules="emailCustomRules" class="mb-2" />
325
+ <SySelect v-model="formData.country" :items="countries" label="Pays" required class="mb-2" />
326
+ <div class="d-flex gap-3">
327
+ <v-btn type="submit" color="primary">Enregistrer</v-btn>
328
+ </div>
319
329
  </div>
320
330
  </SyForm>
321
331
  </template>
@@ -361,3 +371,103 @@ export const MixedFields: Story = {
361
371
  ],
362
372
  },
363
373
  }
374
+
375
+ export const Reset: Story = {
376
+ render: args => ({
377
+ components: { SyForm, SyTextField, VBtn },
378
+ setup() {
379
+ const name = ref('')
380
+ const email = ref('')
381
+ const form = ref<{ validate: () => Promise<boolean>, reset: () => void, clearValidation: () => void } | null>(null)
382
+
383
+ // Règles de validation selon le design system
384
+ const emailRules = [
385
+ { type: 'email', options: { message: 'Format d\'email invalide' } },
386
+ { type: 'required', options: { message: 'L\'email est obligatoire' } },
387
+ ]
388
+
389
+ const submitForm = async () => {
390
+ const isValid = await form.value?.validate()
391
+ if (isValid) {
392
+ alert('Formulaire valide !')
393
+ }
394
+ else {
395
+ alert('Formulaire invalide, veuillez corriger les erreurs.')
396
+ }
397
+ }
398
+
399
+ function clearAll() {
400
+ form.value?.reset()
401
+ form.value?.clearValidation()
402
+ }
403
+
404
+ return { name, email, emailRules, form, submitForm, clearAll, args }
405
+ },
406
+ template: `
407
+ <SyForm ref="form" v-bind="args" @submit="submitForm" @reset="onFormReset">
408
+ <div class="d-flex flex-column gap-4">
409
+ <SyTextField v-model="name" label="Nom" required class="mb-2" />
410
+ <SyTextField v-model="email" label="Email" :custom-rules="emailRules" class="mb-2" />
411
+ <div class="d-flex gap-3">
412
+ <v-btn color="secondary" class="mr-2" @click="clearAll">Reset</v-btn>
413
+ <v-btn type="submit" color="primary">Soumettre</v-btn>
414
+ </div>
415
+ </div>
416
+ </SyForm>
417
+ `,
418
+ }),
419
+ args: {
420
+ validateOnSubmit: true,
421
+ },
422
+ parameters: {
423
+ sourceCode: [
424
+ {
425
+ name: 'Template',
426
+ code: `
427
+ <template>
428
+ <SyForm ref="form" v-bind="args" @submit="submitForm" @reset="onFormReset">
429
+ <div class="d-flex flex-column gap-4">
430
+ <SyTextField v-model="name" label="Nom" required class="mb-2" />
431
+ <SyTextField v-model="email" label="Email" :custom-rules="emailRules" class="mb-2" />
432
+ <div class="d-flex gap-3">
433
+ <v-btn color="secondary" class="mr-2" @click="clearAll">Reset</v-btn>
434
+ <v-btn type="submit" color="primary">Soumettre</v-btn>
435
+ </div>
436
+ </div>
437
+ </SyForm>
438
+ </template>
439
+ `,
440
+ },
441
+ {
442
+ name: 'Script',
443
+ code: `
444
+ <script setup lang="ts">
445
+ import { ref } from 'vue'
446
+ const name = ref('')
447
+ const email = ref('')
448
+
449
+ // Règles de validation selon le design system
450
+ const emailRules = [
451
+ { type: 'email', options: { message: "Format d'email invalide" } },
452
+ { type: 'required', options: { message: "L'email est obligatoire" } },
453
+ ]
454
+
455
+ const onSubmit = (event: { isValid: boolean }) => {
456
+ if (event.isValid) {
457
+ alert('Formulaire valide !')
458
+ }
459
+ else {
460
+ alert('Formulaire invalide, veuillez corriger les erreurs.')
461
+ }
462
+ }
463
+
464
+ function clearAll() {
465
+ form.value?.reset()
466
+ form.value?.clearValidation()
467
+ }
468
+ </script>
469
+ `,
470
+ },
471
+ ],
472
+ },
473
+ }
@@ -8,12 +8,13 @@
8
8
 
9
9
  const emit = defineEmits<{
10
10
  (e: 'submit', value: { isValid: boolean }): void
11
+ (e: 'reset'): void
11
12
  }>()
12
13
 
13
14
  // Reference vers le formulaire Vuetify
14
15
  const form = ref<InstanceType<typeof import('vuetify/components').VForm> | null>(null)
15
16
 
16
- const { validateAll } = useFormValidation()
17
+ const { validateAll, clearAll, resetAll } = useFormValidation()
17
18
 
18
19
  // Methode de validation globale qui combine Vuetify et nos composants personnalises
19
20
  const validate = async () => {
@@ -48,7 +49,21 @@
48
49
  }
49
50
 
50
51
  const reset = () => {
52
+ // Reset custom components values
53
+ resetAll()
54
+ // Reset field values and validations for Vuetify form
51
55
  form.value?.reset()
56
+ form.value?.resetValidation()
57
+ // Notify consumers so they can clear external models (e.g., v-model refs)
58
+ emit('reset')
59
+ }
60
+
61
+ // Clear only validation states (keep current values)
62
+ const clearValidation = () => {
63
+ // Clear Vuetify internal validation state
64
+ form.value?.resetValidation()
65
+ // Clear custom components validation states registered in the form
66
+ clearAll()
52
67
  }
53
68
 
54
69
  // Gestion de la soumission du formulaire
@@ -65,6 +80,7 @@
65
80
  defineExpose({
66
81
  validate,
67
82
  reset,
83
+ clearValidation,
68
84
  form,
69
85
  })
70
86
  </script>
@@ -1,5 +1,5 @@
1
1
  <script lang="ts" setup>
2
- // Prevent display-asterisk from being passed to the DOM
2
+ // Prevent display-asterisk from being passed to the DOM
3
3
  defineOptions({
4
4
  inheritAttrs: false,
5
5
  })
@@ -8,7 +8,7 @@
8
8
  mdiCheck,
9
9
  mdiInformationOutline,
10
10
  mdiClose,
11
- mdiInformation,
11
+ mdiAlertCircle,
12
12
  mdiCalendar,
13
13
  } from '@mdi/js'
14
14
  import { computed, onMounted, ref, watch, nextTick, type ComponentPublicInstance } from 'vue'
@@ -166,7 +166,7 @@
166
166
  info: mdiInformationOutline,
167
167
  success: mdiCheck,
168
168
  warning: mdiAlertOutline,
169
- error: mdiInformation,
169
+ error: mdiAlertCircle,
170
170
  close: mdiClose,
171
171
  calendar: mdiCalendar,
172
172
  }
@@ -189,6 +189,16 @@
189
189
 
190
190
  const isBlurred = ref(false)
191
191
 
192
+ const showClear = computed(() => {
193
+ if (!props.isClearable) return false
194
+ if (props.readonly || props.disabled) return false
195
+ return model.value !== undefined && model.value !== null && String(model.value) !== '' && String(model.value) !== '__/__/____'
196
+ })
197
+
198
+ const clearField = () => {
199
+ model.value = ''
200
+ }
201
+
192
202
  // Initialisation du composable de validation
193
203
  const validation = useValidation({
194
204
  customRules: props.customRules,
@@ -274,7 +284,7 @@
274
284
  const hasWarning = computed(() => validation.hasWarning.value || props.hasWarning)
275
285
  const hasSuccess = computed(() => (validation.hasSuccess.value && !hasError.value && !hasWarning.value) || props.hasSuccess)
276
286
 
277
- const errors = computed(() => validation.errors.value)
287
+ const errors = computed(() => [...validation.errors.value, ...(props.errorMessages || [])])
278
288
  const warnings = computed(() => validation.warnings.value)
279
289
  const successes = computed(() => validation.successes.value)
280
290
 
@@ -351,7 +361,7 @@
351
361
  const syTextFieldRef = ref<ComponentPublicInstance | null>(null)
352
362
 
353
363
  // Intégration avec le système de validation du formulaire
354
- useValidatable(validateOnSubmit)
364
+ useValidatable(validateOnSubmit, validation.clearValidation)
355
365
 
356
366
  onMounted(() => {
357
367
  nextTick(() => {
@@ -549,8 +559,6 @@
549
559
  :base-color="props.baseColor"
550
560
  :bg-color="props.bgColor"
551
561
  :center-affix="props.centerAffix"
552
- :clear-icon="ICONS.close"
553
- :clearable="props.isClearable"
554
562
  :color="props.color"
555
563
  :counter-value="props.counterValue"
556
564
  :density="props.density"
@@ -695,6 +703,16 @@
695
703
  <!-- Append inner -->
696
704
  <template #append-inner>
697
705
  <slot name="append-inner">
706
+ <!-- Keyboard-focusable clear button -->
707
+ <VBtn
708
+ v-if="showClear"
709
+ class="v-btn v-btn--density-compact mr-1"
710
+ :aria-label="props.label ? `Vider ${props.label}` : 'Vider'"
711
+ :title="props.label ? `Vider ${props.label}` : 'Vider'"
712
+ :icon="mdiClose"
713
+ variant="text"
714
+ @click="clearField"
715
+ />
698
716
  <SyIcon
699
717
  v-if="validationIcon && !props.appendInnerIcon"
700
718
  :icon="validationIcon"
@@ -788,6 +806,10 @@
788
806
  opacity: 1 !important;
789
807
  }
790
808
 
809
+ :deep(.v-icon__svg) {
810
+ fill: tokens.$colors-text-success !important;
811
+ }
812
+
791
813
  :deep(.v-field) {
792
814
  color: tokens.$colors-border-success !important;
793
815
 
@@ -71,6 +71,8 @@
71
71
  }
72
72
  autoClamp?: boolean
73
73
  isValidateOnBlur?: boolean
74
+ hint?: string
75
+ persistentHint?: boolean
74
76
  }>(), {
75
77
  modelValue: undefined,
76
78
  label: DATE_PICKER_MESSAGES.LABEL_DEFAULT,
@@ -108,6 +110,8 @@
108
110
  period: () => ({ min: '', max: '' }),
109
111
  autoClamp: false,
110
112
  isValidateOnBlur: true,
113
+ hint: undefined,
114
+ persistentHint: false,
111
115
  })
112
116
 
113
117
  // La compatibilité entre isBirthDate et birthDate est gérée directement dans l'appel au composable
@@ -588,7 +592,7 @@
588
592
  }
589
593
 
590
594
  // Intégration avec le système de validation du formulaire
591
- useValidatable(validateOnSubmit)
595
+ useValidatable(validateOnSubmit, clearValidation)
592
596
 
593
597
  const openDatePicker = () => {
594
598
  if (props.disabled || props.readonly) return
@@ -597,9 +601,8 @@
597
601
  }
598
602
  }
599
603
 
600
- // Fonction pour mettre à jour le mois
604
+ // Fonction pour mettre à jour le mois quand on navigue via les flèches
601
605
  const onUpdateMonth = (month: string) => {
602
- // Éviter les mises à jour inutiles si le mois n'a pas changé
603
606
  if (currentMonth.value === month) return
604
607
  currentMonth.value = month
605
608
  currentMonthName.value = dayjs().month(parseInt(month, 10)).format('MMMM')
@@ -612,14 +615,12 @@
612
615
  })
613
616
  }
614
617
 
615
- // Fonction pour mettre à jour l'année
618
+ // Fonction pour mettre à jour l'année quand on navigue via les flèches
616
619
  const onUpdateYear = (year: string) => {
617
620
  currentYear.value = year
618
621
  currentYearName.value = year
619
- markHolidayDays()
620
622
 
621
623
  handleYearUpdate()
622
- handleMonthUpdate()
623
624
  nextTick(() => {
624
625
  if (isDatePickerVisible.value) {
625
626
  customizeMonthButton()
@@ -685,6 +686,8 @@
685
686
  const { currentViewMode, handleViewModeUpdate, handleYearUpdate, handleMonthUpdate, resetViewMode } = useDatePickerViewMode(
686
687
  // Fonction qui retourne la valeur actuelle de isBirthDate (combinaison de isBirthDate et birthDate)
687
688
  () => props.isBirthDate || props.birthDate,
689
+ // Fonction qui retourne l'état de la date sélectionnée
690
+ () => selectedDates.value,
688
691
  )
689
692
 
690
693
  const handleInputBlur = () => {
@@ -697,6 +700,8 @@
697
700
 
698
701
  watch(isDatePickerVisible, async (isVisible) => {
699
702
  if (isVisible) {
703
+ // Réinitialiser le view mode à l'ouverture pour éviter les problèmes de navigation
704
+ resetViewMode()
700
705
  // Marquer les jours fériés lorsque le calendrier devient visible
701
706
  markHolidayDays()
702
707
  }
@@ -804,6 +809,17 @@
804
809
  }
805
810
  }, { immediate: true })
806
811
 
812
+ // Reset month/year names when clearing the date
813
+ watch(selectedDates, (newValue) => {
814
+ if (!newValue) {
815
+ const today = new Date()
816
+ currentMonth.value = today.getMonth().toString()
817
+ currentMonthName.value = dayjs(today).format('MMMM')
818
+ currentYear.value = today.getFullYear().toString()
819
+ currentYearName.value = today.getFullYear().toString()
820
+ }
821
+ })
822
+
807
823
  const toggleDatePicker = () => {
808
824
  if (props.disabled || props.readonly) return
809
825
 
@@ -892,7 +908,7 @@
892
908
  :no-icon="props.noIcon"
893
909
  :is-outlined="props.isOutlined"
894
910
  :readonly="props.readonly"
895
- :title="props.title || undefined"
911
+ :title="props.title || props.placeholder || undefined"
896
912
  :width="props.width"
897
913
  :disable-error-handling="props.disableErrorHandling"
898
914
  :show-success-messages="props.showSuccessMessages"
@@ -903,6 +919,8 @@
903
919
  :auto-clamp="props.autoClamp"
904
920
  :display-asterisk="props.displayAsterisk"
905
921
  :is-validate-on-blur="props.isValidateOnBlur"
922
+ :hint="props.hint"
923
+ :persistent-hint="props.persistentHint"
906
924
  @update:model-value="handleDateTextInputUpdate"
907
925
  @date-selected="handleDateTextInputSelection"
908
926
  @blur="handleInputBlur"
@@ -938,12 +956,14 @@
938
956
  :show-week-number="props.showWeekNumber"
939
957
  :is-birth-date="props.isBirthDate || props.birthDate"
940
958
  :text-field-activator="props.textFieldActivator"
941
- :title="props.title || undefined"
959
+ :title="props.title || props.placeholder || undefined"
942
960
  :period="period"
943
961
  :auto-clamp="props.autoClamp"
944
962
  :label="props.label"
945
963
  :placeholder="props.placeholder"
946
964
  :is-validate-on-blur="props.isValidateOnBlur"
965
+ :hint="props.hint"
966
+ :persistent-hint="props.persistentHint"
947
967
  @update:model-value="emit('update:modelValue', $event)"
948
968
  @focus="emit('focus')"
949
969
  @blur="emit('blur')"
@@ -992,7 +1012,9 @@
992
1012
  :display-asterisk="props.displayAsterisk"
993
1013
  :is-clearable="!props.readonly"
994
1014
  :auto-clamp="props.autoClamp"
995
- :title="props.title || undefined"
1015
+ :title="props.title || props.placeholder || undefined"
1016
+ :hint="props.hint"
1017
+ :persistent-hint="props.persistentHint"
996
1018
  @click="openDatePickerOnClick"
997
1019
  @focus="openDatePickerOnFocus"
998
1020
  @blur="handleInputBlur"
@@ -1206,4 +1228,5 @@
1206
1228
  :deep(.v-btn--variant-text .v-btn__overlay) {
1207
1229
  padding: 13px;
1208
1230
  }
1231
+
1209
1232
  </style>