@cnamts/synapse 0.0.8-alpha → 0.0.10-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 (156) hide show
  1. package/dist/design-system-v3.d.ts +1152 -127
  2. package/dist/design-system-v3.js +4888 -2605
  3. package/dist/design-system-v3.umd.cjs +1 -1
  4. package/dist/style.css +1 -1
  5. package/package.json +1 -1
  6. package/src/assets/settings.scss +1 -1
  7. package/src/components/ContextualMenu/Accessibilite.mdx +14 -0
  8. package/src/components/ContextualMenu/Accessibilite.stories.ts +191 -0
  9. package/src/components/ContextualMenu/AccessibiliteItems.ts +89 -0
  10. package/src/components/ContextualMenu/constants/ExpertiseLevelEnum.ts +4 -0
  11. package/src/components/Customs/SySelect/SySelect.stories.ts +7 -7
  12. package/src/components/Customs/SySelect/SySelect.vue +9 -4
  13. package/src/components/Customs/SySelect/tests/SySelect.spec.ts +2 -2
  14. package/src/components/Customs/SyTextField/SyTextField.stories.ts +187 -2
  15. package/src/components/Customs/SyTextField/SyTextField.vue +185 -16
  16. package/src/components/Customs/SyTextField/tests/SyTextField.spec.ts +2 -4
  17. package/src/components/Customs/SyTextField/tests/__snapshots__/SyTextField.spec.ts.snap +18 -16
  18. package/src/components/Customs/SyTextField/types.d.ts +2 -2
  19. package/src/components/DatePicker/Accessibilite.mdx +14 -0
  20. package/src/components/DatePicker/Accessibilite.stories.ts +191 -0
  21. package/src/components/DatePicker/AccessibiliteItems.ts +233 -0
  22. package/src/components/DatePicker/DatePicker.mdx +186 -0
  23. package/src/components/DatePicker/DatePicker.stories.ts +787 -0
  24. package/src/components/DatePicker/DatePicker.vue +574 -0
  25. package/src/components/DatePicker/DateTextInput.vue +409 -0
  26. package/src/components/DatePicker/constants/ExpertiseLevelEnum.ts +4 -0
  27. package/src/components/DatePicker/tests/DatePicker.spec.ts +266 -0
  28. package/src/components/DialogBox/DialogBox.stories.ts +1 -1
  29. package/src/components/ExternalLinks/Accessibilite.mdx +14 -0
  30. package/src/components/ExternalLinks/Accessibilite.stories.ts +191 -0
  31. package/src/components/ExternalLinks/AccessibiliteItems.ts +197 -0
  32. package/src/components/ExternalLinks/constants/ExpertiseLevelEnum.ts +4 -0
  33. package/src/components/ExternalLinks/tests/__snapshots__/ExternalLinks.spec.ts.snap +9 -9
  34. package/src/components/FileList/FileList.mdx +103 -0
  35. package/src/components/FileList/FileList.stories.ts +562 -0
  36. package/src/components/FileList/FileList.vue +78 -0
  37. package/src/components/FileList/UploadItem/UploadItem.vue +270 -0
  38. package/src/components/FileList/UploadItem/locales.ts +9 -0
  39. package/src/components/FileList/tests/FileList.spec.ts +176 -0
  40. package/src/components/FilePreview/FilePreview.mdx +82 -0
  41. package/src/components/FilePreview/FilePreview.stories.ts +242 -0
  42. package/src/components/FilePreview/FilePreview.vue +68 -0
  43. package/src/components/FilePreview/config.ts +10 -0
  44. package/src/components/FilePreview/locales.ts +4 -0
  45. package/src/components/FilePreview/tests/FilePreview.spec.ts +124 -0
  46. package/src/components/FilePreview/tests/__snapshots__/FilePreview.spec.ts.snap +11 -0
  47. package/src/components/FileUpload/FileUpload.mdx +165 -0
  48. package/src/components/FileUpload/FileUpload.stories.ts +429 -0
  49. package/src/components/FileUpload/FileUpload.vue +195 -0
  50. package/src/components/FileUpload/FileUploadContent.vue +109 -0
  51. package/src/components/FileUpload/locales.ts +10 -0
  52. package/src/components/FileUpload/tests/FileUpload.spec.ts +332 -0
  53. package/src/components/FileUpload/tests/__snapshots__/FileUpload.spec.ts.snap +7 -0
  54. package/src/components/FileUpload/useFileDrop.ts +23 -0
  55. package/src/components/FileUpload/validateFiles.ts +39 -0
  56. package/src/components/NirField/NirField.stories.ts +1 -1
  57. package/src/components/NirField/NirField.vue +2 -1
  58. package/src/components/PasswordField/Accessibilite.mdx +14 -0
  59. package/src/components/PasswordField/Accessibilite.stories.ts +191 -0
  60. package/src/components/PasswordField/AccessibiliteItems.ts +184 -0
  61. package/src/components/PasswordField/PasswordField.vue +3 -3
  62. package/src/components/PasswordField/constants/ExpertiseLevelEnum.ts +4 -0
  63. package/src/components/PeriodField/PeriodField.mdx +32 -0
  64. package/src/components/PeriodField/PeriodField.stories.ts +807 -0
  65. package/src/components/PeriodField/PeriodField.vue +355 -0
  66. package/src/components/PeriodField/tests/PeriodField.spec.ts +348 -0
  67. package/src/components/PhoneField/PhoneField.vue +44 -60
  68. package/src/components/PhoneField/tests/PhoneField.spec.ts +0 -15
  69. package/src/components/RangeField/Accessibilite.mdx +14 -0
  70. package/src/components/RangeField/Accessibilite.stories.ts +191 -0
  71. package/src/components/RangeField/AccessibiliteItems.ts +179 -0
  72. package/src/components/RangeField/RangeField.mdx +54 -0
  73. package/src/components/RangeField/RangeField.stories.ts +189 -0
  74. package/src/components/RangeField/RangeField.vue +157 -0
  75. package/src/components/RangeField/RangeSlider/RangeSlider.vue +387 -0
  76. package/src/components/RangeField/RangeSlider/Tooltip/Tooltip.vue +64 -0
  77. package/src/components/RangeField/RangeSlider/tests/__snapshots__/rangeSlider.spec.ts.snap +27 -0
  78. package/src/components/RangeField/RangeSlider/tests/rangeSlider.spec.ts +100 -0
  79. package/src/components/RangeField/RangeSlider/tests/useDoubleSlider.spec.ts +246 -0
  80. package/src/components/RangeField/RangeSlider/tests/useMouseSlide.spec.ts +204 -0
  81. package/src/components/RangeField/RangeSlider/tests/useThumb.spec.ts +22 -0
  82. package/src/components/RangeField/RangeSlider/tests/useThumbKeyboard.spec.ts +233 -0
  83. package/src/components/RangeField/RangeSlider/tests/useTooltipsNudge.spec.ts +150 -0
  84. package/src/components/RangeField/RangeSlider/tests/useTrack.spec.ts +314 -0
  85. package/src/components/RangeField/RangeSlider/tests/vAnimateClick.spec.ts +32 -0
  86. package/src/components/RangeField/RangeSlider/types.ts +15 -0
  87. package/src/components/RangeField/RangeSlider/useMouseSlide.ts +109 -0
  88. package/src/components/RangeField/RangeSlider/useRangeSlider.ts +126 -0
  89. package/src/components/RangeField/RangeSlider/useThumb.ts +18 -0
  90. package/src/components/RangeField/RangeSlider/useThumbKeyboard.ts +84 -0
  91. package/src/components/RangeField/RangeSlider/useTooltipsNudge.ts +92 -0
  92. package/src/components/RangeField/RangeSlider/useTrack.ts +116 -0
  93. package/src/components/RangeField/RangeSlider/vAnimateClick.ts +19 -0
  94. package/src/components/RangeField/config.ts +7 -0
  95. package/src/components/RangeField/constants/ExpertiseLevelEnum.ts +4 -0
  96. package/src/components/RangeField/locales.ts +4 -0
  97. package/src/components/RangeField/tests/RangeField.spec.ts +224 -0
  98. package/src/components/RangeField/tests/__snapshots__/RangeField.spec.ts.snap +379 -0
  99. package/src/components/RatingPicker/Accessibilite.mdx +14 -0
  100. package/src/components/RatingPicker/Accessibilite.stories.ts +191 -0
  101. package/src/components/RatingPicker/AccessibiliteItems.ts +208 -0
  102. package/src/components/RatingPicker/EmotionPicker/EmotionPicker.vue +205 -0
  103. package/src/components/RatingPicker/EmotionPicker/locales.ts +3 -0
  104. package/src/components/RatingPicker/EmotionPicker/tests/EmotionPicker.spec.ts +104 -0
  105. package/src/components/RatingPicker/EmotionPicker/tests/__snapshots__/EmotionPicker.spec.ts.snap +66 -0
  106. package/src/components/RatingPicker/NumberPicker/NumberPicker.vue +159 -0
  107. package/src/components/RatingPicker/NumberPicker/locales.ts +4 -0
  108. package/src/components/RatingPicker/NumberPicker/tests/NumberPicker.spec.ts +73 -0
  109. package/src/components/RatingPicker/NumberPicker/tests/__snapshots__/NumberPicker.spec.ts.snap +105 -0
  110. package/src/components/RatingPicker/Rating.ts +45 -0
  111. package/src/components/RatingPicker/RatingPicker.mdx +56 -0
  112. package/src/components/RatingPicker/RatingPicker.stories.ts +515 -0
  113. package/src/components/RatingPicker/RatingPicker.vue +122 -0
  114. package/src/components/RatingPicker/StarsPicker/StarsPicker.vue +116 -0
  115. package/src/components/RatingPicker/StarsPicker/tests/StarsPicker.spec.ts +95 -0
  116. package/src/components/RatingPicker/StarsPicker/tests/__snapshots__/StarsPicker.spec.ts.snap +36 -0
  117. package/src/components/RatingPicker/constants/ExpertiseLevelEnum.ts +4 -0
  118. package/src/components/RatingPicker/locales.ts +3 -0
  119. package/src/components/RatingPicker/tests/Rating.spec.ts +104 -0
  120. package/src/components/RatingPicker/tests/RatingPicker.spec.ts +187 -0
  121. package/src/components/RatingPicker/tests/__snapshots__/RatingPicker.spec.ts.snap +108 -0
  122. package/src/components/SearchListField/Accessibilite.mdx +14 -0
  123. package/src/components/SearchListField/Accessibilite.stories.ts +191 -0
  124. package/src/components/SearchListField/AccessibiliteItems.ts +310 -0
  125. package/src/components/SearchListField/SearchListField.mdx +74 -0
  126. package/src/components/SearchListField/SearchListField.stories.ts +126 -0
  127. package/src/components/SearchListField/SearchListField.vue +194 -0
  128. package/src/components/SearchListField/constants/ExpertiseLevelEnum.ts +4 -0
  129. package/src/components/SearchListField/locales.ts +5 -0
  130. package/src/components/SearchListField/tests/SearchListField.spec.ts +323 -0
  131. package/src/components/SearchListField/types.d.ts +4 -0
  132. package/src/components/SelectBtnField/Accessibilite.mdx +14 -0
  133. package/src/components/SelectBtnField/Accessibilite.stories.ts +191 -0
  134. package/src/components/SelectBtnField/AccessibiliteItems.ts +191 -0
  135. package/src/components/SelectBtnField/SelectBtnField.mdx +50 -0
  136. package/src/components/SelectBtnField/SelectBtnField.stories.ts +763 -0
  137. package/src/components/SelectBtnField/SelectBtnField.vue +283 -0
  138. package/src/components/SelectBtnField/config.ts +11 -0
  139. package/src/components/SelectBtnField/constants/ExpertiseLevelEnum.ts +4 -0
  140. package/src/components/SelectBtnField/tests/SelectBtnField.spec.ts +327 -0
  141. package/src/components/SelectBtnField/tests/__snapshots__/SelectBtnField.spec.ts.snap +125 -0
  142. package/src/components/SelectBtnField/types.d.ts +11 -0
  143. package/src/components/SyAlert/SyAlert.vue +11 -9
  144. package/src/components/TableToolbar/TableToolbar.mdx +130 -0
  145. package/src/components/TableToolbar/TableToolbar.stories.ts +935 -0
  146. package/src/components/TableToolbar/TableToolbar.vue +168 -0
  147. package/src/components/TableToolbar/config.ts +24 -0
  148. package/src/components/TableToolbar/locales.ts +6 -0
  149. package/src/components/TableToolbar/tests/TableToolbar.spec.ts +166 -0
  150. package/src/components/TableToolbar/tests/__snapshots__/TableToolbar.spec.ts.snap +359 -0
  151. package/src/components/index.ts +11 -1
  152. package/src/composables/rules/useFieldValidation.ts +174 -44
  153. package/src/designTokens/index.ts +3 -3
  154. package/src/stories/Fondamentaux/CustomisationEtThemes.mdx +52 -2
  155. package/src/utils/calcHumanFileSize/index.ts +12 -0
  156. package/src/utils/calcHumanFileSize/tests/calcHumanFileSize.spec.ts +21 -0
@@ -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'
@@ -0,0 +1,14 @@
1
+ import { Meta, Story } from '@storybook/addon-docs';
2
+ import * as AccessStories from './Accessibilite.stories.ts';
3
+
4
+ <Meta of={AccessStories} />
5
+
6
+ Accessibilité
7
+ =============
8
+ <Story of={AccessStories.Legende} />
9
+ <br />
10
+
11
+ --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
12
+
13
+ <Story of={AccessStories.AccessibilitePanel} />
14
+ <br />
@@ -0,0 +1,191 @@
1
+ import { VExpansionPanels, VExpansionPanel, VExpansionPanelTitle, VExpansionPanelText, VDataTable, VIcon } from 'vuetify/components'
2
+ import type { StoryObj } from '@storybook/vue3'
3
+ import { AccessibiliteItemsIndeterminate, AccessibiliteItemsValidated } from './AccessibiliteItems'
4
+ import { mdiCheckboxMarkedCircle, mdiLink, mdiEye } from '@mdi/js'
5
+
6
+ const checkIcon = mdiCheckboxMarkedCircle
7
+ const iconEye = mdiEye
8
+ const linkICon = mdiLink
9
+
10
+ export default {
11
+ title: 'Composants/Formulaires/DatePicker/Accessibilité',
12
+ }
13
+
14
+ export const AccessibilitePanel: StoryObj = {
15
+
16
+ render: () => {
17
+ return {
18
+ components: { VExpansionPanels, VExpansionPanel, VExpansionPanelTitle, VExpansionPanelText, VDataTable, VIcon },
19
+
20
+ setup() {
21
+ const icon = checkIcon
22
+
23
+ return { AccessibiliteItemsIndeterminate, AccessibiliteItemsValidated, icon, linkICon, iconEye }
24
+ },
25
+ template: `
26
+ <div class="accessibiliteItems" style="display:flex; max-width: none !important;">
27
+ <v-col cols="6">
28
+ <div style="display:flex; margin-bottom: 10px; justify-content: space-between; align-items: center;">
29
+ <h5>{{ AccessibiliteItemsIndeterminate.length }} critères à prendre en charge par le projet</h5>
30
+ <div style="display: flex; align-items: center;">
31
+ <v-btn variant="tonal" color="red" size="x-small" style="margin: 4px;font-size: 8px;"
32
+ rounded>Tanaguru
33
+ </v-btn>
34
+ </div>
35
+ </div>
36
+
37
+ <v-expansion-panels value="opened" multiple>
38
+ <v-expansion-panel v-for="(item, index) in AccessibiliteItemsIndeterminate" :key="index" style="background-color: rgba(42, 96, 158, 0.1); margin-bottom: 10px;">
39
+ <v-expansion-panel-title>
40
+ <VIcon :icon="iconEye" style="margin-right: 5px; color:#5778b7;"/>
41
+ {{ item.title }}
42
+ </v-expansion-panel-title>
43
+ <v-expansion-panel-text>
44
+ <v-expansion-panels>
45
+ <v-expansion-panel v-for="(i, index) in item.items2" :key="i" style="margin-bottom: 10px;">
46
+ <v-expansion-panel-title
47
+ style="font-weight: bold; font-size: 13px; line-height: 16px;">
48
+ {{ i.subtitle}}
49
+ </v-expansion-panel-title>
50
+ <v-expansion-panel-text>
51
+ <div>
52
+ <p style="font-size: 13px;line-height: 16px;">
53
+ {{ i.precision }}
54
+ </p>
55
+ <div v-for="(value, index) in i.solution"
56
+ style="margin-top:15px; font-size: 13px;line-height: 16px;">
57
+ <p style="font-weight: bold;">Méthodologie du test : <a
58
+ href="{{i.link}}" target="blank">
59
+ <VIcon :icon="linkICon"/>
60
+ </a></p>
61
+ <p>{{ value.info1 }}</p>
62
+ <p>{{ value.info2 }}</p>
63
+ <p>{{ value.info3 }}</p>
64
+ <p>{{ value.info4 }}</p>
65
+
66
+ </div>
67
+ <span style="display:flex; justify-content:center; margin-bottom:5px;">______</span>
68
+ </div>
69
+ </v-expansion-panel-text>
70
+ </v-expansion-panel>
71
+ <v-expansion-panel >
72
+ <v-expansion-panel-title
73
+ style="font-weight: bold; font-size: 13px; line-height: 16px;">
74
+ {{ item.subtitle }}
75
+ </v-expansion-panel-title>
76
+ <v-expansion-panel-text>
77
+ <div v-for="(value, i) in item.items" :key="i">
78
+ <p style="font-size: 13px;line-height: 16px;">
79
+ {{ value.precision }}
80
+ </p>
81
+ <div v-for="element in value.solution"
82
+ style="margin-top:15px; font-size: 13px;line-height: 16px;">
83
+ <p style="font-weight: bold;">Méthodologie du test : <a
84
+ href="value.link" target="blank">
85
+ <VIcon :icon="linkICon"/>
86
+ </a></p>
87
+ <p>{{ element.info1 }}</p>
88
+ <p>{{ element.info2 }}</p>
89
+ <p>{{ element.info3 }}</p>
90
+ </div>
91
+ <span style="display:flex; justify-content:center; margin-bottom:5px;">______</span>
92
+ </div>
93
+ </v-expansion-panel-text>
94
+ </v-expansion-panel>
95
+ </v-expansion-panels>
96
+ </v-expansion-panel-text>
97
+ </v-expansion-panel>
98
+ </v-expansion-panels>
99
+ </v-col>
100
+ <v-col cols="6">
101
+ <div style="display:flex; margin-bottom: 10px; justify-content: space-between; align-items: center;">
102
+ <h5>{{ AccessibiliteItemsValidated.length }} critères pris en charge par l'équipe Design System</h5>
103
+ <div style="display: flex; align-items: center;">
104
+ <v-btn variant="tonal" color="red" size="x-small" style="margin: 4px;font-size: 8px;"
105
+ rounded>Tanaguru
106
+ </v-btn>
107
+ </div>
108
+ </div>
109
+ <v-expansion-panels v-if="AccessibiliteItemsValidated.length > 0" value="opened" multiple>
110
+ <v-expansion-panel
111
+ v-for="(item, index) in AccessibiliteItemsValidated"
112
+ :key="index" style="background-color: rgba(53,135,0,0.1); margin-bottom: 10px;">
113
+ <v-expansion-panel-title>
114
+ <VIcon color="green" :icon="icon" style="margin-right: 5px;"/>
115
+ {{ item.title }}
116
+ </v-expansion-panel-title>
117
+ <v-expansion-panel-text>
118
+ <v-expansion-panels>
119
+ <v-expansion-panel>
120
+ <v-expansion-panel-title style="font-weight: bold;font-size: 13px; line-height: 16px;">
121
+ {{ item.subtitle }}
122
+ </v-expansion-panel-title>
123
+ <v-expansion-panel-text>
124
+ <div v-for="(value, i) in item.items" :key="i">
125
+ <p style="font-size: 13px;line-height: 16px;">
126
+ {{ value.precision }}
127
+ </p>
128
+ <div v-for="element in value.solution"
129
+ style="margin-top:15px; font-size: 13px;line-height: 16px;">
130
+ <p style="font-weight: bold;">Méthodologie du test : <a
131
+ href="value.link" target="blank">
132
+ <VIcon :icon="linkICon"/>
133
+ </a></p>
134
+ <p>{{ element.info1 }}</p>
135
+ <p>{{ element.info2 }}</p>
136
+ <p>{{ element.info3 }}</p>
137
+ </div>
138
+ <span style="display:flex; justify-content:center; margin-bottom:5px;">______</span>
139
+ </div>
140
+ </v-expansion-panel-text>
141
+ </v-expansion-panel>
142
+ </v-expansion-panels>
143
+ </v-expansion-panel-text>
144
+ </v-expansion-panel>
145
+ </v-expansion-panels>
146
+ <div v-else style="display: flex;justify-content: center;"><span style="text-align:center;" >Pas de critère d'accessibilité bloquant</span></div>
147
+ </v-col>
148
+ </div>
149
+ `,
150
+ }
151
+ },
152
+ tags: ['!dev'],
153
+ }
154
+
155
+ export const Legende: StoryObj = {
156
+ args: {
157
+ icon: checkIcon,
158
+ },
159
+ render: (args) => {
160
+ return {
161
+ components: { VIcon },
162
+ setup() {
163
+ return { args }
164
+ },
165
+ template: `
166
+ <p style="color: grey;font-size: 11px; margin-bottom: 12px;">Date de conception: 20/11/2024</p>
167
+ <div>
168
+ <p>Le tableau ci-dessous liste nos recommandations suivant les <a target="blank" style="color:#0C41BD;" href="https://www.numerique.gouv.fr/publications/rgaa-accessibilite/#contenu">catégories du RGAA</a>.</p>
169
+ <p style="margin-bottom: 12px;font-weight:bold;">Pour rappel le composant seul ne garantie pas
170
+ l'accessibilité du site.</p>
171
+ <div style="font-size: 14px">
172
+ <p>Nous avons deux façons de relever les problèmes d'accessibilité des composants :</p>
173
+ <div>
174
+ <v-btn variant="tonal" color="grey" size="x-small" style="margin: 2px;font-size: 8px;" rounded>
175
+ Audit
176
+ </v-btn>
177
+ Problèmes relevés par le projet
178
+ </div>
179
+ <div>
180
+ <v-btn variant="tonal" color="red" size="x-small" style="margin: 2px;font-size: 8px;" rounded>
181
+ Tanaguru
182
+ </v-btn>
183
+ Problèmes relevés par Tanaguru
184
+ </div>
185
+ </div>
186
+ </div>
187
+ `,
188
+ }
189
+ },
190
+ tags: ['!dev'],
191
+ }