@cnamts/synapse 0.0.7-alpha → 0.0.9-alpha

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 (198) hide show
  1. package/dist/design-system-v3.d.ts +785 -372
  2. package/dist/design-system-v3.js +4993 -3357
  3. package/dist/design-system-v3.umd.cjs +1 -10
  4. package/dist/style.css +1 -1
  5. package/package.json +10 -2
  6. package/src/assets/settings.scss +2 -2
  7. package/src/assets/tokens.scss +107 -112
  8. package/src/components/BackBtn/BackBtn.vue +4 -4
  9. package/src/components/BackToTopBtn/BackToTopBtn.vue +1 -0
  10. package/src/components/CollapsibleList/CollapsibleList.mdx +1 -1
  11. package/src/components/CollapsibleList/CollapsibleList.vue +43 -44
  12. package/src/components/ContextualMenu/Accessibilite.mdx +14 -0
  13. package/src/components/ContextualMenu/Accessibilite.stories.ts +191 -0
  14. package/src/components/ContextualMenu/AccessibiliteItems.ts +89 -0
  15. package/src/components/ContextualMenu/ContextualMenu.mdx +118 -0
  16. package/src/components/ContextualMenu/ContextualMenu.stories.ts +430 -0
  17. package/src/components/ContextualMenu/ContextualMenu.vue +101 -0
  18. package/src/components/ContextualMenu/constants/ExpertiseLevelEnum.ts +4 -0
  19. package/src/components/ContextualMenu/tests/ContextualMenu.spec.ts +115 -0
  20. package/src/components/ContextualMenu/tests/__snapshots__/ContextualMenu.spec.ts.snap +10 -0
  21. package/src/components/ContextualMenu/types.ts +5 -0
  22. package/src/components/CookieBanner/CookieBanner.stories.ts +1 -2
  23. package/src/components/CookieBanner/CookieBanner.vue +13 -10
  24. package/src/components/CookieBanner/tests/__snapshots__/CookieBanner.spec.ts.snap +17 -15
  25. package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +6 -1
  26. package/src/components/CookiesSelection/CookiesInformation/locales.ts +1 -0
  27. package/src/components/CookiesSelection/CookiesTable/CookiesTable.vue +1 -0
  28. package/src/components/CookiesSelection/tests/__snapshots__/CookiesSelection.spec.ts.snap +17 -15
  29. package/src/components/CopyBtn/CopyBtn.vue +7 -7
  30. package/src/components/Customs/SyBtnSelect/SyBtnSelect.vue +26 -26
  31. package/src/components/Customs/SyInputSelect/SyInputSelect.vue +24 -24
  32. package/src/components/Customs/SySelect/SySelect.stories.ts +7 -7
  33. package/src/components/Customs/SySelect/SySelect.vue +36 -30
  34. package/src/components/Customs/SySelect/tests/SySelect.spec.ts +2 -2
  35. package/src/components/Customs/SyTextField/SyTextField.stories.ts +187 -2
  36. package/src/components/Customs/SyTextField/SyTextField.vue +185 -16
  37. package/src/components/Customs/SyTextField/tests/SyTextField.spec.ts +2 -4
  38. package/src/components/Customs/SyTextField/tests/__snapshots__/SyTextField.spec.ts.snap +18 -16
  39. package/src/components/Customs/SyTextField/types.d.ts +2 -2
  40. package/src/components/DataList/DataList.stories.ts +3 -2
  41. package/src/components/DataList/DataList.vue +1 -1
  42. package/src/components/DataListGroup/DataListGroup.stories.ts +3 -2
  43. package/src/components/DataListItem/DataListItem.vue +12 -12
  44. package/src/components/DatePicker/DatePicker.mdx +191 -0
  45. package/src/components/DatePicker/DatePicker.stories.ts +787 -0
  46. package/src/components/DatePicker/DatePicker.vue +560 -0
  47. package/src/components/DatePicker/DateTextInput.vue +409 -0
  48. package/src/components/DatePicker/tests/DatePicker.spec.ts +266 -0
  49. package/src/components/DialogBox/DialogBox.mdx +28 -2
  50. package/src/components/DialogBox/DialogBox.stories.ts +2 -2
  51. package/src/components/DialogBox/DialogBox.vue +3 -2
  52. package/src/components/DownloadBtn/DownloadBtn.vue +2 -1
  53. package/src/components/ExternalLinks/Accessibilite.mdx +14 -0
  54. package/src/components/ExternalLinks/Accessibilite.stories.ts +191 -0
  55. package/src/components/ExternalLinks/AccessibiliteItems.ts +197 -0
  56. package/src/components/ExternalLinks/ExternalLinks.mdx +86 -0
  57. package/src/components/ExternalLinks/ExternalLinks.stories.ts +553 -0
  58. package/src/components/ExternalLinks/ExternalLinks.vue +200 -0
  59. package/src/components/ExternalLinks/config.ts +34 -0
  60. package/src/components/ExternalLinks/constants/ExpertiseLevelEnum.ts +4 -0
  61. package/src/components/ExternalLinks/locales.ts +4 -0
  62. package/src/components/ExternalLinks/tests/ExternalLinks.spec.ts +154 -0
  63. package/src/components/ExternalLinks/tests/__snapshots__/ExternalLinks.spec.ts.snap +159 -0
  64. package/src/components/FileUpload/FileUpload.mdx +165 -0
  65. package/src/components/FileUpload/FileUpload.stories.ts +429 -0
  66. package/src/components/FileUpload/FileUpload.vue +195 -0
  67. package/src/components/FileUpload/FileUploadContent.vue +109 -0
  68. package/src/components/FileUpload/locales.ts +10 -0
  69. package/src/components/FileUpload/tests/FileUpload.spec.ts +332 -0
  70. package/src/components/FileUpload/tests/__snapshots__/FileUpload.spec.ts.snap +7 -0
  71. package/src/components/FileUpload/useFileDrop.ts +23 -0
  72. package/src/components/FileUpload/validateFiles.ts +39 -0
  73. package/src/components/FooterBar/FooterBar.vue +105 -80
  74. package/src/components/FranceConnectBtn/FranceConnectBtn.vue +14 -13
  75. package/src/components/HeaderBar/HeaderBar.vue +3 -3
  76. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderBurgerMenu.vue +11 -7
  77. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.vue +5 -5
  78. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuSection/HeaderMenuSection.vue +2 -2
  79. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.vue +10 -8
  80. package/src/components/HeaderBar/HeaderLogo/HeaderLogo.vue +2 -2
  81. package/src/components/HeaderBar/HeaderLogo/logos/Logo-mobile.vue +2 -1
  82. package/src/components/HeaderBar/HeaderLogo/logos/Logo.vue +2 -1
  83. package/src/components/HeaderBar/HeaderMenuBtn/HeaderMenuBtn.vue +10 -10
  84. package/src/components/HeaderBar/consts.scss +1 -1
  85. package/src/components/HeaderLoading/HeaderLoading.vue +12 -11
  86. package/src/components/HeaderNavigationBar/HeaderNavigationBar.vue +2 -1
  87. package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +9 -9
  88. package/src/components/HeaderToolbar/HeaderToolbar.vue +215 -202
  89. package/src/components/LangBtn/LangBtn.vue +8 -6
  90. package/src/components/LogoBrandSection/LogoBrandSection.stories.ts +2 -2
  91. package/src/components/NirField/NirField.stories.ts +8 -8
  92. package/src/components/NirField/NirField.vue +46 -48
  93. package/src/components/NotFoundPage/NotFoundPage.stories.ts +33 -2
  94. package/src/components/NotFoundPage/NotFoundPage.vue +17 -0
  95. package/src/components/NotificationBar/NotificationBar.mdx +5 -5
  96. package/src/components/NotificationBar/NotificationBar.stories.ts +410 -314
  97. package/src/components/NotificationBar/NotificationBar.vue +43 -41
  98. package/src/components/PageContainer/PageContainer.vue +4 -4
  99. package/src/components/PasswordField/Accessibilite.mdx +14 -0
  100. package/src/components/PasswordField/Accessibilite.stories.ts +191 -0
  101. package/src/components/PasswordField/AccessibiliteItems.ts +184 -0
  102. package/src/components/PasswordField/PasswordField.mdx +70 -0
  103. package/src/components/PasswordField/PasswordField.stories.ts +213 -0
  104. package/src/components/PasswordField/PasswordField.vue +189 -0
  105. package/src/components/PasswordField/config.ts +11 -0
  106. package/src/components/PasswordField/constants/ExpertiseLevelEnum.ts +4 -0
  107. package/src/components/PasswordField/locales.ts +4 -0
  108. package/src/components/PasswordField/tests/PasswordField.spec.ts +96 -0
  109. package/src/components/PhoneField/PhoneField.mdx +0 -2
  110. package/src/components/PhoneField/PhoneField.stories.ts +10 -50
  111. package/src/components/PhoneField/PhoneField.vue +77 -93
  112. package/src/components/PhoneField/tests/PhoneField.spec.ts +0 -15
  113. package/src/components/RangeField/RangeField.mdx +54 -0
  114. package/src/components/RangeField/RangeField.stories.ts +189 -0
  115. package/src/components/RangeField/RangeField.vue +157 -0
  116. package/src/components/RangeField/RangeSlider/RangeSlider.vue +387 -0
  117. package/src/components/RangeField/RangeSlider/Tooltip/Tooltip.vue +64 -0
  118. package/src/components/RangeField/RangeSlider/tests/__snapshots__/rangeSlider.spec.ts.snap +27 -0
  119. package/src/components/RangeField/RangeSlider/tests/rangeSlider.spec.ts +100 -0
  120. package/src/components/RangeField/RangeSlider/tests/useDoubleSlider.spec.ts +246 -0
  121. package/src/components/RangeField/RangeSlider/tests/useMouseSlide.spec.ts +204 -0
  122. package/src/components/RangeField/RangeSlider/tests/useThumb.spec.ts +22 -0
  123. package/src/components/RangeField/RangeSlider/tests/useThumbKeyboard.spec.ts +233 -0
  124. package/src/components/RangeField/RangeSlider/tests/useTooltipsNudge.spec.ts +150 -0
  125. package/src/components/RangeField/RangeSlider/tests/useTrack.spec.ts +314 -0
  126. package/src/components/RangeField/RangeSlider/tests/vAnimateClick.spec.ts +32 -0
  127. package/src/components/RangeField/RangeSlider/types.ts +15 -0
  128. package/src/components/RangeField/RangeSlider/useMouseSlide.ts +109 -0
  129. package/src/components/RangeField/RangeSlider/useRangeSlider.ts +126 -0
  130. package/src/components/RangeField/RangeSlider/useThumb.ts +18 -0
  131. package/src/components/RangeField/RangeSlider/useThumbKeyboard.ts +84 -0
  132. package/src/components/RangeField/RangeSlider/useTooltipsNudge.ts +92 -0
  133. package/src/components/RangeField/RangeSlider/useTrack.ts +116 -0
  134. package/src/components/RangeField/RangeSlider/vAnimateClick.ts +19 -0
  135. package/src/components/RangeField/config.ts +7 -0
  136. package/src/components/RangeField/locales.ts +4 -0
  137. package/src/components/RangeField/tests/RangeField.spec.ts +224 -0
  138. package/src/components/RangeField/tests/__snapshots__/RangeField.spec.ts.snap +379 -0
  139. package/src/components/RatingPicker/EmotionPicker/EmotionPicker.vue +205 -0
  140. package/src/components/RatingPicker/EmotionPicker/locales.ts +3 -0
  141. package/src/components/RatingPicker/EmotionPicker/tests/EmotionPicker.spec.ts +104 -0
  142. package/src/components/RatingPicker/EmotionPicker/tests/__snapshots__/EmotionPicker.spec.ts.snap +66 -0
  143. package/src/components/RatingPicker/NumberPicker/NumberPicker.vue +159 -0
  144. package/src/components/RatingPicker/NumberPicker/locales.ts +4 -0
  145. package/src/components/RatingPicker/NumberPicker/tests/NumberPicker.spec.ts +73 -0
  146. package/src/components/RatingPicker/NumberPicker/tests/__snapshots__/NumberPicker.spec.ts.snap +105 -0
  147. package/src/components/RatingPicker/Rating.ts +45 -0
  148. package/src/components/RatingPicker/RatingPicker.mdx +56 -0
  149. package/src/components/RatingPicker/RatingPicker.stories.ts +515 -0
  150. package/src/components/RatingPicker/RatingPicker.vue +122 -0
  151. package/src/components/RatingPicker/StarsPicker/StarsPicker.vue +116 -0
  152. package/src/components/RatingPicker/StarsPicker/tests/StarsPicker.spec.ts +95 -0
  153. package/src/components/RatingPicker/StarsPicker/tests/__snapshots__/StarsPicker.spec.ts.snap +36 -0
  154. package/src/components/RatingPicker/locales.ts +3 -0
  155. package/src/components/RatingPicker/tests/Rating.spec.ts +104 -0
  156. package/src/components/RatingPicker/tests/RatingPicker.spec.ts +187 -0
  157. package/src/components/RatingPicker/tests/__snapshots__/RatingPicker.spec.ts.snap +108 -0
  158. package/src/components/SearchListField/SearchListField.mdx +74 -0
  159. package/src/components/SearchListField/SearchListField.stories.ts +126 -0
  160. package/src/components/SearchListField/SearchListField.vue +194 -0
  161. package/src/components/SearchListField/locales.ts +5 -0
  162. package/src/components/SearchListField/tests/SearchListField.spec.ts +323 -0
  163. package/src/components/SearchListField/types.d.ts +4 -0
  164. package/src/components/SelectBtnField/SelectBtnField.mdx +50 -0
  165. package/src/components/SelectBtnField/SelectBtnField.stories.ts +763 -0
  166. package/src/components/SelectBtnField/SelectBtnField.vue +283 -0
  167. package/src/components/SelectBtnField/config.ts +11 -0
  168. package/src/components/SelectBtnField/tests/SelectBtnField.spec.ts +327 -0
  169. package/src/components/SelectBtnField/tests/__snapshots__/SelectBtnField.spec.ts.snap +125 -0
  170. package/src/components/SelectBtnField/types.d.ts +11 -0
  171. package/src/components/SkipLink/SkipLink.vue +10 -10
  172. package/src/components/SocialMediaLinks/SocialMediaLinks.vue +28 -26
  173. package/src/components/SubHeader/SubHeader.vue +32 -31
  174. package/src/components/SyAlert/SyAlert.vue +12 -12
  175. package/src/components/UserMenuBtn/UserMenuBtn.vue +1 -1
  176. package/src/components/UserMenuBtn/config.ts +1 -1
  177. package/src/components/index.ts +17 -7
  178. package/src/composables/rules/useFieldValidation.ts +172 -44
  179. package/src/designTokens/index.ts +6 -4
  180. package/src/designTokens/{bootstrapColors.md → paColors.md} +1 -1
  181. package/src/designTokens/tokens/cnam/cnamLightTheme.ts +2 -0
  182. package/src/designTokens/tokens/pa/paColors.ts +171 -0
  183. package/src/designTokens/tokens/pa/paContextual.ts +58 -0
  184. package/src/designTokens/tokens/pa/paDarkTheme.ts +5 -0
  185. package/src/designTokens/tokens/pa/paLightTheme.ts +123 -0
  186. package/src/designTokens/tokens/pa/paSemantic.ts +87 -0
  187. package/src/stories/Fondamentaux/CustomisationEtThemes.mdx +52 -2
  188. package/src/stories/GuideDuDev/CreerUneIssue.mdx +64 -0
  189. package/src/stories/GuideDuDev/{CommentUtiliserLesRules.mdx → UtiliserLesRules.mdx} +2 -2
  190. package/src/stories/GuideDuDev/components.stories.ts +9 -7
  191. package/src/stories/Guidelines/Vuetify/Vuetify.stories.ts +163 -88
  192. package/src/stories/Guidelines/Vuetify/VuetifyItems.ts +250 -23
  193. package/src/temp/TestDTComponent.vue +5 -6
  194. package/src/utils/calcHumanFileSize/index.ts +12 -0
  195. package/src/utils/calcHumanFileSize/tests/calcHumanFileSize.spec.ts +21 -0
  196. package/src/designTokens/tokens/bootstrap/bootstrapColors.ts +0 -158
  197. package/src/designTokens/tokens/bootstrap/bootstrapLightTheme.ts +0 -22
  198. package/src/stories/GuideDuDev/CommentContribuer.mdx +0 -22
@@ -37,6 +37,181 @@ const meta = {
37
37
  color: {
38
38
  control: 'select',
39
39
  options: ['primary', 'secondary', 'success', 'error', 'warning'],
40
+ description: 'Couleur du champ',
41
+ },
42
+ density: {
43
+ control: 'select',
44
+ options: ['default', 'comfortable', 'compact'],
45
+ description: 'Densité du champ',
46
+ },
47
+ direction: {
48
+ control: 'select',
49
+ options: ['horizontal', 'vertical'],
50
+ description: 'Direction d\'affichage',
51
+ },
52
+ type: {
53
+ control: 'select',
54
+ options: ['text', 'number', 'password', 'email', 'tel', 'url', 'search', 'date', 'time', 'datetime-local'],
55
+ description: 'Type d\'input HTML',
56
+ },
57
+ baseColor: {
58
+ control: 'color',
59
+ description: 'Couleur de base personnalisée',
60
+ },
61
+ bgColor: {
62
+ control: 'color',
63
+ description: 'Couleur de fond personnalisée',
64
+ },
65
+ width: {
66
+ control: 'text',
67
+ description: 'Largeur du champ (px, %, vh, etc.)',
68
+ },
69
+ maxWidth: {
70
+ control: 'text',
71
+ description: 'Largeur maximale (px, %, vh, etc.)',
72
+ },
73
+ minWidth: {
74
+ control: 'text',
75
+ description: 'Largeur minimale (px, %, vh, etc.)',
76
+ },
77
+ rounded: {
78
+ control: 'select',
79
+ options: [true, false, 0, 'sm', 'lg', 'xl', 'pill'],
80
+ description: 'Style des coins arrondis',
81
+ },
82
+ required: {
83
+ control: 'boolean',
84
+ description: 'Champ obligatoire',
85
+ },
86
+ isReadOnly: {
87
+ control: 'boolean',
88
+ description: 'Mode lecture seule',
89
+ },
90
+ isDisabled: {
91
+ control: 'boolean',
92
+ description: 'Désactive le champ',
93
+ },
94
+ isClearable: {
95
+ control: 'boolean',
96
+ description: 'Affiche un bouton pour effacer',
97
+ },
98
+ isTiled: {
99
+ control: 'boolean',
100
+ description: 'Style tuile',
101
+ },
102
+ isFlat: {
103
+ control: 'boolean',
104
+ description: 'Sans élévation',
105
+ },
106
+ isActive: {
107
+ control: 'boolean',
108
+ description: 'Force l\'état actif',
109
+ },
110
+ isFocused: {
111
+ control: 'boolean',
112
+ description: 'Force l\'état focus',
113
+ },
114
+ isDirty: {
115
+ control: 'boolean',
116
+ description: 'Indique si modifié',
117
+ },
118
+ isOnError: {
119
+ control: 'boolean',
120
+ description: 'Force l\'état erreur',
121
+ },
122
+ displayAsterisk: {
123
+ control: 'boolean',
124
+ description: 'Affiche l\'astérisque requis',
125
+ },
126
+ displayPersistentClear: {
127
+ control: 'boolean',
128
+ description: 'Bouton effacer toujours visible',
129
+ },
130
+ displayPersistentCounter: {
131
+ control: 'boolean',
132
+ description: 'Compteur toujours visible',
133
+ },
134
+ displayPersistentHint: {
135
+ control: 'boolean',
136
+ description: 'Aide toujours visible',
137
+ },
138
+ displayPersistentPlaceholder: {
139
+ control: 'boolean',
140
+ description: 'Placeholder toujours visible',
141
+ },
142
+ areDetailsHidden: {
143
+ control: 'select',
144
+ options: [true, false, 'auto'],
145
+ description: 'Masque les détails',
146
+ },
147
+ areSpinButtonsHidden: {
148
+ control: 'boolean',
149
+ description: 'Masque les boutons number',
150
+ },
151
+ noIcon: {
152
+ control: 'boolean',
153
+ description: 'Masque toutes les icônes',
154
+ },
155
+ centerAffix: {
156
+ control: 'boolean',
157
+ description: 'Centre les affixes',
158
+ },
159
+ counter: {
160
+ control: 'select',
161
+ options: [true, false, 'words', 'characters'],
162
+ description: 'Type de compteur',
163
+ },
164
+ counterValue: {
165
+ control: 'number',
166
+ description: 'Valeur du compteur',
167
+ },
168
+ maxErrors: {
169
+ control: 'number',
170
+ description: 'Nombre max d\'erreurs',
171
+ },
172
+ errorMessages: {
173
+ control: 'object',
174
+ description: 'Messages d\'erreur',
175
+ },
176
+ messages: {
177
+ control: 'object',
178
+ description: 'Messages additionnels',
179
+ },
180
+ hint: {
181
+ control: 'text',
182
+ description: 'Message d\'aide',
183
+ },
184
+ placeholder: {
185
+ control: 'text',
186
+ description: 'Texte indicatif',
187
+ },
188
+ prefix: {
189
+ control: 'text',
190
+ description: 'Texte avant la valeur',
191
+ },
192
+ suffix: {
193
+ control: 'text',
194
+ description: 'Texte après la valeur',
195
+ },
196
+ id: {
197
+ control: 'text',
198
+ description: 'ID HTML',
199
+ },
200
+ name: {
201
+ control: 'text',
202
+ description: 'Nom du champ',
203
+ },
204
+ role: {
205
+ control: 'text',
206
+ description: 'Rôle ARIA',
207
+ },
208
+ theme: {
209
+ control: 'text',
210
+ description: 'Thème personnalisé',
211
+ },
212
+ loading: {
213
+ control: 'boolean',
214
+ description: 'État de chargement',
40
215
  },
41
216
  },
42
217
  } as Meta<typeof SyTextField>
@@ -71,16 +246,18 @@ export const Default: Story = {
71
246
  color: 'primary',
72
247
  isClearable: true,
73
248
  label: 'Label',
249
+ modelValue: '',
74
250
  },
75
251
  render: (args) => {
76
252
  return {
77
253
  components: { SyTextField, VIcon },
78
254
  setup() {
79
- return { args }
255
+ const value = ref('')
256
+ return { args, value }
80
257
  },
81
258
  template: `
82
259
  <div class="d-flex flex-wrap align-center pa-4">
83
- <SyTextField v-bind="args" />
260
+ <SyTextField v-bind="args" v-model="value" />
84
261
  </div>
85
262
  `,
86
263
  }
@@ -118,6 +295,7 @@ export const Required: Story = {
118
295
  isClearable: true,
119
296
  label: 'Label',
120
297
  required: true,
298
+ modelValue: '',
121
299
  },
122
300
  render: (args) => {
123
301
  return {
@@ -174,6 +352,7 @@ export const WithCustomError: Story = {
174
352
  isClearable: true,
175
353
  label: 'Label',
176
354
  required: false,
355
+ modelValue: '',
177
356
  },
178
357
  render: (args) => {
179
358
  return {
@@ -229,6 +408,7 @@ export const SlotPrepend: Story = {
229
408
  label: 'Label',
230
409
  color: 'primary',
231
410
  prependIcon: 'info',
411
+ modelValue: '',
232
412
  },
233
413
  render: (args) => {
234
414
  return {
@@ -280,6 +460,7 @@ export const SlotAppend: Story = {
280
460
  label: 'champs de text',
281
461
  color: 'primary',
282
462
  appendIcon: 'success',
463
+ modelValue: '',
283
464
  },
284
465
  render: (args) => {
285
466
  return {
@@ -330,6 +511,7 @@ export const SlotPrependInner: Story = {
330
511
  label: 'Label',
331
512
  color: 'primary',
332
513
  prependInnerIcon: 'info',
514
+ modelValue: '',
333
515
  },
334
516
  render: (args) => {
335
517
  return {
@@ -381,6 +563,7 @@ export const SlotPrependInnerDivider: Story = {
381
563
  label: 'Label',
382
564
  color: 'primary',
383
565
  prependInnerIcon: 'info',
566
+ modelValue: '',
384
567
  },
385
568
  render: (args) => {
386
569
  return {
@@ -432,6 +615,7 @@ export const SlotAppendInner: Story = {
432
615
  label: 'Label',
433
616
  color: 'primary',
434
617
  appendInnerIcon: 'success',
618
+ modelValue: '',
435
619
  },
436
620
  render: (args) => {
437
621
  return {
@@ -487,6 +671,7 @@ export const SlotCustomIcon: Story = {
487
671
  showDivider: false,
488
672
  label: 'Label',
489
673
  color: 'primary',
674
+ modelValue: '',
490
675
  },
491
676
  render: (args) => {
492
677
  return {
@@ -1,5 +1,5 @@
1
1
  <script lang="ts" setup>
2
- import { computed, ref } from 'vue'
2
+ import { computed, ref, watch } from 'vue'
3
3
  import type { IconType, VariantStyle, ColorType } from './types'
4
4
  import {
5
5
  mdiAlertOutline,
@@ -7,12 +7,12 @@
7
7
  mdiInformationOutline,
8
8
  mdiClose,
9
9
  mdiInformation,
10
+ mdiCalendar,
10
11
  } from '@mdi/js'
11
12
 
12
- // only variantStyle need a default value
13
- /* eslint-disable vue/require-default-prop */
14
13
  const props = withDefaults(
15
14
  defineProps<{
15
+ modelValue?: string | number | null
16
16
  prependIcon?: IconType
17
17
  appendIcon?: IconType
18
18
  prependInnerIcon?: IconType
@@ -23,22 +23,121 @@
23
23
  showDivider?: boolean
24
24
  label?: string
25
25
  required?: boolean
26
- errorMessages?: string[]
26
+ errorMessages?: string[] | null
27
+ isReadOnly?: boolean
28
+ isActive?: boolean
29
+ baseColor?: string
30
+ bgColor?: string
31
+ centerAffix?: boolean
32
+ counter?: string | number | boolean
33
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
34
+ counterValue?: number | ((value: any) => number)
35
+ density?: 'default' | 'comfortable' | 'compact'
36
+ direction?: 'horizontal' | 'vertical'
37
+ isDirty?: boolean
38
+ isDisabled?: boolean
39
+ isOnError?: boolean
40
+ isFlat?: boolean
41
+ isFocused?: boolean
42
+ areDetailsHidden?: boolean | 'auto'
43
+ areSpinButtonsHidden?: boolean
44
+ hint?: string
45
+ id?: string
46
+ loading?: string | boolean
47
+ maxErrors?: string | number
48
+ maxWidth?: string | number
49
+ messages?: string | string[]
50
+ minWidth?: string | number
51
+ name?: string
52
+ displayPersistentClear?: boolean
53
+ displayPersistentCounter?: boolean
54
+ displayPersistentHint?: boolean
55
+ displayPersistentPlaceholder?: boolean
56
+ placeholder?: string
57
+ prefix?: string
58
+ isReversed?: boolean
59
+ role?: string
60
+ rounded?: string | number | boolean
61
+ isOnSingleLine?: boolean
62
+ suffix?: string
63
+ theme?: string
64
+ isTiled?: boolean
65
+ type?: string
66
+ width?: string | number
67
+ displayAsterisk?: boolean
68
+ noIcon?: boolean
27
69
  }>(),
28
70
  {
29
- variantStyle: 'outlined', // Remplacez par la valeur par défaut souhaitée
71
+ modelValue: undefined,
72
+ prependIcon: undefined,
73
+ appendIcon: undefined,
74
+ appendInnerIcon: undefined,
75
+ prependInnerIcon: undefined,
76
+ variantStyle: 'outlined',
77
+ color: 'primary',
78
+ label: 'custom label',
79
+ errorMessages: null,
80
+ isReadOnly: false,
81
+ isClearable: false,
82
+ isActive: false,
83
+ baseColor: undefined,
84
+ bgColor: undefined,
85
+ centerAffix: undefined,
86
+ counter: false,
87
+ counterValue: undefined,
88
+ density: 'default',
89
+ direction: 'horizontal',
90
+ isDirty: false,
91
+ isDisabled: false,
92
+ isOnError: false,
93
+ isFlat: false,
94
+ isFocused: false,
95
+ areDetailsHidden: false,
96
+ areSpinButtonsHidden: false,
97
+ hint: undefined,
98
+ id: undefined,
99
+ loading: false,
100
+ maxErrors: 2,
101
+ maxWidth: undefined,
102
+ messages: undefined,
103
+ minWidth: undefined,
104
+ name: undefined,
105
+ displayPersistentClear: false,
106
+ displayPersistentCounter: false,
107
+ displayPersistentHint: false,
108
+ displayPersistentPlaceholder: false,
109
+ placeholder: undefined,
110
+ prefix: undefined,
111
+ isReversed: false,
112
+ role: undefined,
113
+ rounded: undefined,
114
+ isOnSingleLine: false,
115
+ suffix: undefined,
116
+ theme: undefined,
117
+ isTiled: false,
118
+ type: 'text',
119
+ width: undefined,
120
+ displayAsterisk: false,
121
+ noIcon: false,
30
122
  },
31
123
  )
32
124
 
33
- const ICONS: Record<IconType, string> = {
125
+ const ICONS: Record<NonNullable<IconType>, string> = {
34
126
  info: mdiInformationOutline,
35
127
  success: mdiCheck,
36
128
  warning: mdiAlertOutline,
37
129
  error: mdiInformation,
38
130
  close: mdiClose,
131
+ calendar: mdiCalendar,
39
132
  }
40
133
 
41
- const model = ref('')
134
+ const model = computed({
135
+ get: () => props.modelValue,
136
+ set: (value) => {
137
+ emit('update:model-value', value)
138
+ },
139
+ })
140
+
42
141
  const isBlurred = ref(false)
43
142
 
44
143
  const hasError = computed(() => {
@@ -50,11 +149,19 @@
50
149
  }
51
150
 
52
151
  const appendInnerIconColor = computed(() => {
53
- return props.appendInnerIcon === 'error' || props.appendInnerIcon === 'success'
152
+ return props.appendInnerIcon === 'error' || props.appendInnerIcon === 'success' || props.appendInnerIcon === 'warning'
54
153
  ? props.appendInnerIcon
55
154
  : 'black'
56
155
  })
57
156
 
157
+ const isShouldDisplayAsterisk = computed(() => {
158
+ return props.displayAsterisk && props.required
159
+ })
160
+
161
+ const labelWithAsterisk = computed(() => {
162
+ return isShouldDisplayAsterisk.value ? `${props.label} *` : props.label
163
+ })
164
+
58
165
  const dividerProps = {
59
166
  thickness: 2,
60
167
  length: '25px',
@@ -62,6 +169,14 @@
62
169
  opacity: '1',
63
170
  }
64
171
 
172
+ const emit = defineEmits(['update:model-value', 'clear', 'prepend-icon-click', 'append-icon-click'])
173
+
174
+ watch(model, (newValue) => {
175
+ if (props.isClearable && newValue === '') {
176
+ emit('clear')
177
+ }
178
+ })
179
+
65
180
  defineExpose({
66
181
  appendInnerIconColor,
67
182
  })
@@ -69,37 +184,90 @@
69
184
 
70
185
  <template>
71
186
  <VTextField
187
+ :id="props.id"
72
188
  v-model="model"
189
+ :active="props.isActive"
73
190
  :aria-label="props.label"
191
+ :base-color="props.baseColor"
192
+ :bg-color="props.bgColor"
193
+ :center-affix="props.centerAffix"
74
194
  :clear-icon="ICONS.close"
75
195
  :clearable="props.isClearable"
76
196
  :color="props.color"
197
+ :counter-value="props.counterValue"
198
+ :density="props.density"
199
+ :direction="props.direction"
200
+ :dirty="props.isDirty"
201
+ :disabled="props.isDisabled"
202
+ :display-asterisk="isShouldDisplayAsterisk"
203
+ :error="props.isOnError"
77
204
  :error-messages="props.errorMessages"
78
- :label="props.label"
205
+ :flat="props.isFlat"
206
+ :focused="props.isFocused"
207
+ :hide-details="props.areDetailsHidden"
208
+ :hide-spin-buttons="props.areSpinButtonsHidden"
209
+ :hint="props.hint"
210
+ :label="labelWithAsterisk"
211
+ :loading="props.loading"
212
+ :max-errors="props.maxErrors"
213
+ :max-width="props.maxWidth"
214
+ :messages="props.messages"
215
+ :min-width="props.minWidth"
216
+ :name="props.name"
217
+ :no-icon="props.noIcon"
218
+ :persistent-clear="props.displayPersistentClear"
219
+ :persistent-counter="props.displayPersistentCounter"
220
+ :persistent-hint="props.displayPersistentHint"
221
+ :persistent-placeholder="displayPersistentPlaceholder"
222
+ :placeholder="props.placeholder"
223
+ :prefix="props.prefix"
224
+ :readonly="props.isReadOnly"
225
+ :reverse="props.isReversed"
226
+ :role="props.role"
227
+ :rounded="props.rounded"
79
228
  :rules="props.required ? ['Le champ est requis.'] : []"
229
+ :single-line="props.isOnSingleLine"
230
+ :suffix="props.suffix"
231
+ :theme="props.theme"
232
+ :tile="props.isTiled"
233
+ :type="props.type"
80
234
  :variant="props.variantStyle"
235
+ :width="props.width"
81
236
  @blur="checkErrorOnBlur"
82
237
  >
83
- <template #prepend>
238
+ <template
239
+ v-if="props.prependIcon && !props.noIcon"
240
+ #prepend
241
+ >
84
242
  <slot name="prepend">
85
243
  <VIcon
86
- v-if="props.prependIcon"
244
+ :aria-label="props.label ? `${props.label} - bouton ${props.prependIcon}` : `Bouton ${props.prependIcon}`"
245
+ :color="appendInnerIconColor"
87
246
  :icon="ICONS[props.prependIcon]"
247
+ role="button"
248
+ @click="$emit('prepend-icon-click')"
88
249
  />
89
250
  </slot>
90
251
  </template>
91
- <template #append>
252
+ <template
253
+ v-if="props.appendIcon && !props.noIcon"
254
+ #append
255
+ >
92
256
  <slot name="append">
93
257
  <VIcon
94
- v-if="props.appendIcon"
258
+ :aria-label="props.label ? `${props.label} - bouton ${props.appendIcon}` : `Bouton ${props.appendIcon}`"
259
+ :color="appendInnerIconColor"
95
260
  :icon="ICONS[props.appendIcon]"
261
+ role="button"
262
+ @click="$emit('append-icon-click')"
96
263
  />
97
264
  </slot>
98
265
  </template>
99
266
  <template #prepend-inner>
100
267
  <slot name="prepend-inner">
101
268
  <VIcon
102
- v-if="props.prependInnerIcon"
269
+ v-if="props.prependInnerIcon && !props.noIcon"
270
+ :aria-label="props.label ? `${props.label} - bouton ${props.prependInnerIcon}` : `Bouton ${props.prependInnerIcon}`"
103
271
  :icon="ICONS[props.prependInnerIcon]"
104
272
  />
105
273
  </slot>
@@ -112,11 +280,12 @@
112
280
  </template>
113
281
  <template #append-inner>
114
282
  <slot name="append-inner">
115
- <VIcon v-if="hasError">
283
+ <VIcon v-if="hasError && !props.appendInnerIcon">
116
284
  {{ mdiInformation }}
117
285
  </VIcon>
118
286
  <VIcon
119
- v-if="props.appendInnerIcon"
287
+ v-if="props.appendInnerIcon && !props.noIcon"
288
+ :aria-label="props.label ? `${props.label} - bouton ${props.appendInnerIcon}` : `Bouton ${props.appendInnerIcon}`"
120
289
  :class="{ 'error-icon': props.appendInnerIcon === 'error' }"
121
290
  :color="appendInnerIconColor"
122
291
  :icon="ICONS[props.appendInnerIcon]"
@@ -33,13 +33,11 @@ describe('SyTextField', () => {
33
33
  append: '<div data-testid="append-slot">Append Slot Content</div>',
34
34
  })
35
35
 
36
- const prependSlot = wrapper.find('[data-testid="prepend-slot"]')
37
- const appendSlot = wrapper.find('[data-testid="append-slot"]')
36
+ const prependSlot = wrapper.find('.v-field--prepended')
37
+ const appendSlot = wrapper.find('.v-field--appended')
38
38
 
39
39
  expect(prependSlot.exists()).toBe(true)
40
- expect(prependSlot.text()).toBe('Prepend Slot Content')
41
40
  expect(appendSlot.exists()).toBe(true)
42
- expect(appendSlot.text()).toBe('Append Slot Content')
43
41
  })
44
42
 
45
43
  it('renders inner slots correctly', () => {
@@ -2,41 +2,43 @@
2
2
 
3
3
  exports[`SyTextField > matches snapshot 1`] = `
4
4
  "<div class="v-input v-input--horizontal v-input--center-affix v-input--density-default v-theme--light v-locale--is-ltr v-text-field">
5
- <div class="v-input__prepend"><i class="M11,9H13V7H11M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20,12C20,16.41 16.41,20 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M11,17H13V11H11V17Z mdi v-icon notranslate v-theme--light v-icon--size-default" aria-hidden="true"></i>
5
+ <div class="v-input__prepend"><i class="M11,9H13V7H11M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20,12C20,16.41 16.41,20 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M11,17H13V11H11V17Z mdi v-icon notranslate v-theme--light v-icon--size-default text-error v-icon--clickable" role="button" aria-hidden="false" tabindex="0" aria-label="custom label - bouton info"></i>
6
6
  <!---->
7
7
  </div>
8
8
  <div class="v-input__control">
9
- <div class="v-field v-field--appended v-field--center-affix v-field--prepended v-field--no-label v-field--variant-filled v-theme--light v-locale--is-ltr">
9
+ <div class="v-field v-field--appended v-field--center-affix v-field--prepended v-field--variant-filled v-theme--light v-locale--is-ltr">
10
10
  <div class="v-field__overlay"></div>
11
11
  <div class="v-field__loader">
12
12
  <div class="v-progress-linear v-theme--light v-locale--is-ltr" style="top: 0px; height: 0px; --v-progress-linear-height: 2px;" role="progressbar" aria-hidden="true" aria-valuemin="0" aria-valuemax="100">
13
13
  <!---->
14
- <div class="v-progress-linear__background" style="opacity: NaN;"></div>
15
- <div class="v-progress-linear__buffer" style="opacity: NaN; width: 0%;"></div>
14
+ <div class="v-progress-linear__background bg-primary" style="opacity: NaN;"></div>
15
+ <div class="v-progress-linear__buffer bg-primary" style="opacity: NaN; width: 0%;"></div>
16
16
  <transition-stub name="fade-transition" appear="false" persisted="false" css="true">
17
17
  <div class="v-progress-linear__indeterminate">
18
- <div class="v-progress-linear__indeterminate long"></div>
19
- <div class="v-progress-linear__indeterminate short"></div>
18
+ <div class="v-progress-linear__indeterminate long bg-primary"></div>
19
+ <div class="v-progress-linear__indeterminate short bg-primary"></div>
20
20
  </div>
21
21
  </transition-stub>
22
22
  <!---->
23
23
  </div>
24
24
  </div>
25
25
  <div class="v-field__prepend-inner">
26
- <!----><i class="M12,2L1,21H23M12,6L19.53,19H4.47M11,10V14H13V10M11,16V18H13V16 mdi v-icon notranslate v-theme--light v-icon--size-default" aria-hidden="true"></i>
26
+ <!----><i class="M12,2L1,21H23M12,6L19.53,19H4.47M11,10V14H13V10M11,16V18H13V16 mdi v-icon notranslate v-theme--light v-icon--size-default" aria-hidden="true" aria-label="custom label - bouton warning"></i>
27
27
  <hr class="v-divider v-divider--vertical v-theme--light text-primary mt-4 pa-1" style="height: 25px; border-right-width: 2px; --v-border-opacity: 1;" aria-orientation="vertical" role="separator">
28
28
  </div>
29
- <div class="v-field__field" data-no-activator="">
30
- <!---->
31
- <!---->
32
- <!----><input size="1" type="text" id="input-0" aria-describedby="input-0-messages" class="v-field__input" value="">
29
+ <div class="v-field__field" data-no-activator=""><label class="v-label v-field-label v-field-label--floating" aria-hidden="true" for="input-0">
30
+ <!---->custom label
31
+ </label><label class="v-label v-field-label" for="input-0">
32
+ <!---->custom label
33
+ </label>
34
+ <!----><input size="1" type="text" id="input-0" aria-describedby="input-0-messages" aria-label="custom label" display-asterisk="false" no-icon="false" class="v-field__input">
33
35
  <!---->
34
36
  </div>
35
37
  <transition-stub name="expand-x-transition" appear="false" persisted="false" css="true">
36
- <div class="v-field__clearable" style="display: none;"><i class="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z mdi v-icon notranslate v-theme--light v-icon--size-default v-icon--clickable" role="button" aria-hidden="false" tabindex="0" aria-label="Clear "></i></div>
38
+ <div class="v-field__clearable" style="display: none;"><i class="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z mdi v-icon notranslate v-theme--light v-icon--size-default v-icon--clickable" role="button" aria-hidden="false" tabindex="0" aria-label="Clear custom label"></i></div>
37
39
  </transition-stub>
38
40
  <div class="v-field__append-inner">
39
- <!--v-if--><i class="M13,9H11V7H13M13,17H11V11H13M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z mdi v-icon notranslate v-theme--light v-icon--size-default text-error error-icon" aria-hidden="true"></i>
41
+ <!--v-if--><i class="M13,9H11V7H13M13,17H11V11H13M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z mdi v-icon notranslate v-theme--light v-icon--size-default text-error error-icon" aria-hidden="true" aria-label="custom label - bouton error"></i>
40
42
  <!---->
41
43
  </div>
42
44
  <div class="v-field__outline">
@@ -46,10 +48,10 @@ exports[`SyTextField > matches snapshot 1`] = `
46
48
  </div>
47
49
  </div>
48
50
  <div class="v-input__append">
49
- <!----><i class="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z mdi v-icon notranslate v-theme--light v-icon--size-default" aria-hidden="true"></i>
51
+ <!----><i class="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z mdi v-icon notranslate v-theme--light v-icon--size-default text-error v-icon--clickable" role="button" aria-hidden="false" tabindex="0" aria-label="custom label - bouton success"></i>
50
52
  </div>
51
- <div class="v-input__details">
52
- <transition-group-stub name="slide-y-transition" tag="div" appear="false" persisted="false" css="true" class="v-messages" role="alert" aria-live="polite" id="input-0-messages">
53
+ <div id="input-0-messages" class="v-input__details" role="alert" aria-live="polite">
54
+ <transition-group-stub name="slide-y-transition" tag="div" appear="false" persisted="false" css="true" class="v-messages">
53
55
  <!---->
54
56
  </transition-group-stub>
55
57
  <!---->
@@ -1,3 +1,3 @@
1
- export type IconType = 'info' | 'success' | 'warning' | 'error' | 'close'
2
- export type VariantStyle = 'outlined' | 'filled' | 'solo' | 'solo-inverted' | 'solo-filled'
1
+ export type IconType = 'info' | 'success' | 'warning' | 'error' | 'close' | 'calendar' | undefined
2
+ export type VariantStyle = 'outlined' | 'filled' | 'solo' | 'solo-inverted' | 'solo-filled' | 'underlined'
3
3
  export type ColorType = 'primary' | 'secondary' | 'success' | 'info' | 'warning' | 'error'
@@ -421,8 +421,9 @@ export const ActionBtn: Story = {
421
421
  code: `
422
422
  <script setup lang="ts">
423
423
  import { DataList } from '@cnamts/synapse'
424
+ import { ref } from 'vue'
424
425
 
425
- const items = [
426
+ const items = ref([
426
427
  {
427
428
  key: 'Nom',
428
429
  value: 'Dupont',
@@ -436,7 +437,7 @@ export const ActionBtn: Story = {
436
437
  value: '24/09/1970',
437
438
  action: 'Modifier',
438
439
  },
439
- ]
440
+ ])
440
441
 
441
442
  const updateBirthdate = (index: number) => {
442
443
  items[index].value = '25/09/1970'
@@ -135,6 +135,6 @@
135
135
 
136
136
  <style lang="scss" scoped>
137
137
  :deep(ul) {
138
- list-style: none;
138
+ list-style: none;
139
139
  }
140
140
  </style>