@cnamts/synapse 1.0.1 → 1.0.2

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 (217) hide show
  1. package/README.md +1 -1
  2. package/dist/{DateFilter-BmRuzQ9Z.js → DateFilter-YWOTbfeL.js} +1 -1
  3. package/dist/{NumberFilter-CnIPDHqx.js → NumberFilter-DMmMgALM.js} +1 -1
  4. package/dist/{PeriodFilter-CZwZ8CnQ.js → PeriodFilter-Bok5BHcn.js} +1 -1
  5. package/dist/SelectFilter-BKud2WhN.js +136 -0
  6. package/dist/{TextFilter-DTxZHJwX.js → TextFilter-DvMf2thH.js} +1 -1
  7. package/dist/components/Accordion/Accordion.d.ts +2 -1
  8. package/dist/components/Accordion/composables/useAccordionGroupCommunication.d.ts +5 -0
  9. package/dist/components/Accordion/composables/useAccordionKeyboardNavigation.d.ts +12 -0
  10. package/dist/components/Accordion/composables/useAccordionState.d.ts +13 -0
  11. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +85 -0
  12. package/dist/components/Customs/SyInputSelect/SyInputSelect.d.ts +2 -0
  13. package/dist/components/Customs/SySelect/SySelect.d.ts +33 -13
  14. package/dist/components/Customs/SyTextField/SyTextField.d.ts +2 -2
  15. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +1585 -1452
  16. package/dist/components/DatePicker/DatePicker/DatePicker.d.ts +16 -2
  17. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +3 -1
  18. package/dist/components/DatePicker/composables/index.d.ts +2 -0
  19. package/dist/components/DatePicker/composables/useAsteriskDisplay.d.ts +14 -0
  20. package/dist/components/DatePicker/composables/useDateAutoClamp.d.ts +16 -0
  21. package/dist/components/DatePicker/composables/useDateRangeInput.d.ts +1 -1
  22. package/dist/components/DatePicker/composables/useDisplayedDateString.d.ts +3 -0
  23. package/dist/components/DatePicker/composables/useInputBlurHandler.d.ts +1 -0
  24. package/dist/components/DatePicker/composables/useMonthButtonCustomization.d.ts +5 -2
  25. package/dist/components/NirField/NirField.d.ts +7 -3
  26. package/dist/components/NirField/nirValidation.d.ts +1 -1
  27. package/dist/components/PasswordField/PasswordField.d.ts +2 -0
  28. package/dist/components/PeriodField/PeriodField.d.ts +52 -8
  29. package/dist/components/PhoneField/PhoneField.d.ts +2 -2
  30. package/dist/components/RangeField/RangeField.d.ts +2 -0
  31. package/dist/components/SearchListField/SearchListField.d.ts +9 -0
  32. package/dist/components/SyTextArea/SyTextArea.d.ts +2 -0
  33. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +14 -9
  34. package/dist/components/Tables/SyTable/SyTable.d.ts +12 -7
  35. package/dist/components/Tables/common/SyTablePagination.d.ts +1636 -0
  36. package/dist/components/Tables/common/TableHeader.d.ts +2 -20
  37. package/dist/components/Tables/common/filters/SelectFilter.d.ts +5 -5
  38. package/dist/components/Tables/common/filters/getFilterComponent.d.ts +1 -0
  39. package/dist/components/Tables/common/filters/locales.d.ts +4 -0
  40. package/dist/components/Tables/common/filters/logics/date.d.ts +1 -0
  41. package/dist/components/Tables/common/filters/logics/number.d.ts +1 -0
  42. package/dist/components/Tables/common/filters/logics/period.d.ts +1 -0
  43. package/dist/components/Tables/common/filters/logics/select.d.ts +1 -0
  44. package/dist/components/Tables/common/filters/logics/text.d.ts +1 -0
  45. package/dist/components/Tables/common/locales.d.ts +21 -0
  46. package/dist/components/Tables/common/organizeColumns/OrganizeColumns.d.ts +267 -0
  47. package/dist/components/Tables/common/organizeColumns/sortHeaders.d.ts +2 -0
  48. package/dist/components/Tables/common/tableFilterUtils.d.ts +1 -0
  49. package/dist/components/Tables/common/tableStorageUtils.d.ts +41 -1
  50. package/dist/components/Tables/common/tableUtils.d.ts +42 -5
  51. package/dist/components/Tables/common/types.d.ts +19 -8
  52. package/dist/components/Tables/common/usePagination.d.ts +22 -0
  53. package/dist/components/Tables/common/useTableCheckbox.d.ts +20 -0
  54. package/dist/components/Tables/common/useTableHeaders.d.ts +76 -0
  55. package/dist/components/Tables/common/useTableItems.d.ts +24 -0
  56. package/dist/components/Tables/common/useTableOptions.d.ts +18 -0
  57. package/dist/components/ToolbarContainer/ToolbarContainer.d.ts +11 -0
  58. package/dist/components/UserMenuBtn/UserMenuBtn.d.ts +9 -2
  59. package/dist/components/index.d.ts +8 -6
  60. package/dist/design-system-v3.js +58 -56
  61. package/dist/design-system-v3.umd.cjs +22 -22
  62. package/dist/main-Cx8qG7YR.js +16344 -0
  63. package/dist/stories/Accessibilite/Vuetify/VuetifyItems.d.ts +14 -2
  64. package/dist/stories/DesignTokens/StylesTypographiques.stories.new.d.ts +8 -0
  65. package/dist/stories/DesignTokens/TypographyDisplay.d.ts +28 -0
  66. package/dist/stories/DesignTokens/vue-shims.d.ts +6 -0
  67. package/dist/style.css +1 -1
  68. package/package.json +1 -1
  69. package/src/common/imgs/accessibility-svgrepo-com.svg +4 -0
  70. package/src/components/Accordion/Accessibilite/AccessibilityGuide.mdx +249 -0
  71. package/src/components/Accordion/Accordion.vue +48 -76
  72. package/src/components/Accordion/composables/__tests__/useAccordionGroupCommunication.spec.ts +146 -0
  73. package/src/components/Accordion/composables/__tests__/useAccordionKeyboardNavigation.spec.ts +209 -0
  74. package/src/components/Accordion/composables/__tests__/useAccordionState.spec.ts +144 -0
  75. package/src/components/Accordion/composables/useAccordionGroupCommunication.ts +52 -0
  76. package/src/components/Accordion/composables/useAccordionKeyboardNavigation.ts +111 -0
  77. package/src/components/Accordion/composables/useAccordionState.ts +59 -0
  78. package/src/components/Accordion/tests/__snapshots__/accordion.spec.ts.snap +3 -0
  79. package/src/components/Customs/SyCheckbox/Accessibilite.mdx +303 -0
  80. package/src/components/Customs/SyCheckbox/SyCheckbox.mdx +50 -0
  81. package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +630 -0
  82. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +326 -0
  83. package/src/components/Customs/SyCheckbox/tests/SyCheckbox.spec.ts +201 -0
  84. package/src/components/Customs/SyInputSelect/SyInputSelect.stories.ts +1 -0
  85. package/src/components/Customs/SyInputSelect/SyInputSelect.vue +8 -1
  86. package/src/components/Customs/SySelect/SySelect.stories.ts +160 -0
  87. package/src/components/Customs/SySelect/SySelect.vue +291 -32
  88. package/src/components/Customs/SySelect/tests/SySelect.spec.ts +230 -0
  89. package/src/components/Customs/SyTextField/SyTextField.stories.ts +3 -2
  90. package/src/components/Customs/SyTextField/SyTextField.vue +19 -8
  91. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +241 -31
  92. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +305 -57
  93. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.events.spec.ts +161 -0
  94. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +4 -2
  95. package/src/components/DatePicker/DatePicker/DatePicker.stories.ts +259 -137
  96. package/src/components/DatePicker/DatePicker/DatePicker.vue +153 -25
  97. package/src/components/DatePicker/DatePicker/tests/DatePicker.events.spec.ts +189 -0
  98. package/src/components/DatePicker/DatePicker/{DatePicker.spec.ts → tests/DatePicker.spec.ts} +1 -15
  99. package/src/components/DatePicker/DateTextInput/DateRange.stories.ts +24 -14
  100. package/src/components/DatePicker/DateTextInput/DateTextInput.events.spec.ts +148 -0
  101. package/src/components/DatePicker/DateTextInput/DateTextInput.spec.ts +3 -1
  102. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +200 -5
  103. package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +241 -31
  104. package/src/components/DatePicker/composables/index.ts +2 -0
  105. package/src/components/DatePicker/composables/tests/useDateAutoClamp.spec.ts +190 -0
  106. package/src/components/DatePicker/composables/tests/useInputBlurHandler.spec.ts +182 -4
  107. package/src/components/DatePicker/composables/tests/useMonthButtonCustomization.spec.ts +105 -80
  108. package/src/components/DatePicker/composables/useAsteriskDisplay.ts +31 -0
  109. package/src/components/DatePicker/composables/useDateAutoClamp.ts +136 -0
  110. package/src/components/DatePicker/composables/useDateRangeInput.ts +21 -18
  111. package/src/components/DatePicker/composables/useDisplayedDateString.ts +13 -1
  112. package/src/components/DatePicker/composables/useInputBlurHandler.ts +84 -20
  113. package/src/components/DatePicker/composables/useMonthButtonCustomization.ts +149 -51
  114. package/src/components/DiacriticPicker/DiacriticPicker.stories.ts +10 -0
  115. package/src/components/ErrorPage/Accessibilite.stories.ts +8 -0
  116. package/src/components/ErrorPage/ErrorPage.vue +12 -6
  117. package/src/components/ErrorPage/tests/__snapshots__/ErrorPage.spec.ts.snap +4 -4
  118. package/src/components/NirField/NirField.mdx +22 -9
  119. package/src/components/NirField/NirField.stories.ts +26 -2
  120. package/src/components/NirField/NirField.vue +209 -22
  121. package/src/components/NirField/nirValidation.ts +17 -3
  122. package/src/components/NirField/tests/NirField.spec.ts +2 -2
  123. package/src/components/NotFoundPage/Accessibilite.stories.ts +8 -0
  124. package/src/components/NotFoundPage/NotFoundPage.vue +2 -1
  125. package/src/components/NotFoundPage/tests/__snapshots__/NotFoundPage.spec.ts.snap +8 -6
  126. package/src/components/PaginatedTable/PaginatedTable.mdx +2 -0
  127. package/src/components/PasswordField/PasswordField.stories.ts +4 -0
  128. package/src/components/PasswordField/PasswordField.vue +3 -0
  129. package/src/components/PeriodField/PeriodField.vue +2 -0
  130. package/src/components/PhoneField/PhoneField.stories.ts +15 -15
  131. package/src/components/PhoneField/PhoneField.vue +1 -1
  132. package/src/components/RangeField/RangeField.stories.ts +9 -0
  133. package/src/components/RangeField/RangeField.vue +4 -0
  134. package/src/components/RangeField/tests/__snapshots__/RangeField.spec.ts.snap +12 -0
  135. package/src/components/SearchListField/SearchListField.vue +5 -0
  136. package/src/components/SyTextArea/SyTextArea.vue +3 -0
  137. package/src/components/SyTextArea/tests/SyTextArea.spec.ts +0 -1
  138. package/src/components/Tables/SyServerTable/FilterRules.stories.ts +632 -15
  139. package/src/components/Tables/SyServerTable/SyServerTable.mdx +15 -5
  140. package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +2844 -1377
  141. package/src/components/Tables/SyServerTable/SyServerTable.vue +155 -66
  142. package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +256 -4
  143. package/src/components/Tables/SyTable/FilterRules.stories.ts +183 -0
  144. package/src/components/Tables/SyTable/SyTable.mdx +14 -4
  145. package/src/components/Tables/SyTable/SyTable.stories.ts +1265 -477
  146. package/src/components/Tables/SyTable/SyTable.vue +152 -72
  147. package/src/components/Tables/SyTable/tests/SyTable.spec.ts +366 -4
  148. package/src/components/Tables/common/SyTableFilter.vue +3 -56
  149. package/src/components/Tables/common/SyTablePagination.vue +375 -0
  150. package/src/components/Tables/common/TableHeader.vue +10 -26
  151. package/src/components/Tables/common/filters/SelectFilter.vue +131 -22
  152. package/src/components/Tables/common/filters/getFilterComponent.ts +54 -0
  153. package/src/components/Tables/common/filters/locales.ts +4 -0
  154. package/src/components/Tables/common/filters/logics/date.ts +12 -0
  155. package/src/components/Tables/common/filters/logics/number.ts +48 -0
  156. package/src/components/Tables/common/filters/logics/period.ts +25 -0
  157. package/src/components/Tables/common/filters/logics/select.ts +27 -0
  158. package/src/components/Tables/common/filters/logics/tests/TextFilterLogic.spec.ts +177 -0
  159. package/src/components/Tables/common/filters/logics/text.ts +62 -0
  160. package/src/components/Tables/common/filters/tests/TextFilter.spec.ts +11 -11
  161. package/src/components/Tables/common/locales.ts +24 -0
  162. package/src/components/Tables/common/organizeColumns/OrganizeColumns.vue +269 -0
  163. package/src/components/Tables/common/organizeColumns/sortHeaders.ts +9 -0
  164. package/src/components/Tables/common/tableFilterUtils.ts +43 -295
  165. package/src/components/Tables/common/tableStorageUtils.ts +27 -2
  166. package/src/components/Tables/common/tableStyles.scss +26 -0
  167. package/src/components/Tables/common/tableUtils.ts +3 -16
  168. package/src/components/Tables/common/tests/SyTablePagination.spec.ts +170 -0
  169. package/src/components/Tables/common/tests/filterByRange.spec.ts +215 -0
  170. package/src/components/Tables/common/tests/tableFilterUtils.spec.ts +0 -14
  171. package/src/components/Tables/common/tests/tableUtils.spec.ts +7 -51
  172. package/src/components/Tables/common/types.ts +17 -6
  173. package/src/components/Tables/common/usePagination.ts +83 -0
  174. package/src/components/Tables/common/useTableCheckbox.ts +58 -0
  175. package/src/components/Tables/common/useTableHeaders.ts +88 -0
  176. package/src/components/Tables/common/useTableItems.ts +87 -0
  177. package/src/components/Tables/common/useTableOptions.ts +93 -0
  178. package/src/components/ToolbarContainer/ToolbarContainer.mdx +16 -0
  179. package/src/components/ToolbarContainer/ToolbarContainer.stories.ts +675 -0
  180. package/src/components/ToolbarContainer/ToolbarContainer.vue +128 -0
  181. package/src/components/ToolbarContainer/tests/ToolbarContainer.spec.ts +156 -0
  182. package/src/components/UserMenuBtn/UserMenuBtn.stories.ts +74 -0
  183. package/src/components/UserMenuBtn/UserMenuBtn.vue +19 -17
  184. package/src/components/index.ts +8 -6
  185. package/src/stories/Accessibilite/Aculturation/AuditDesignSystem.mdx +293 -20
  186. package/src/stories/Accessibilite/Aculturation/SensibilisationAccessibilite.mdx +448 -54
  187. package/src/stories/Accessibilite/Audit/RGAA.mdx +231 -23
  188. package/src/stories/Accessibilite/Avancement/Avancement.mdx +591 -7
  189. package/src/stories/Accessibilite/Avancement/Avancement.stories.ts +139 -38
  190. package/src/stories/Accessibilite/Introduction.mdx +258 -18
  191. package/src/stories/Accessibilite/KitDePreAudit/Echantillonnage.mdx +221 -31
  192. package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +204 -22
  193. package/src/stories/Accessibilite/KitDePreAudit/Outils/Introduction.mdx +537 -24
  194. package/src/stories/Accessibilite/KitDePreAudit/Outils/LecteursDEcran.mdx +577 -70
  195. package/src/stories/Accessibilite/KitDePreAudit/Outils/Tanaguru.mdx +382 -31
  196. package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +419 -81
  197. package/src/stories/Accessibilite/Vuetify/Vuetify.mdx +132 -6
  198. package/src/stories/Accessibilite/Vuetify/Vuetify.stories.ts +370 -146
  199. package/src/stories/Accessibilite/Vuetify/VuetifyItems.ts +35 -57
  200. package/src/stories/Demarrer/Accueil.stories.ts +20 -5
  201. package/src/stories/DesignTokens/StylesTypographiques.mdx +10 -9
  202. package/src/stories/DesignTokens/StylesTypographiques.stories.new.ts +397 -0
  203. package/src/stories/DesignTokens/StylesTypographiques.stories.ts +397 -0
  204. package/src/stories/DesignTokens/TypographyDisplay.vue +155 -0
  205. package/src/stories/DesignTokens/vue-shims.d.ts +6 -0
  206. package/src/stories/GuideDuDev/LesBreackingChanges.mdx +0 -2
  207. package/src/stories/GuideDuDev/MigrationDepuisBridge.mdx +1 -1
  208. package/src/stories/GuideDuDev/MigrationDepuisVue2.mdx +1 -1
  209. package/src/stories/GuideDuDev/PortailAgent.mdx +10 -0
  210. package/src/stories/GuideDuDev/PortailAgent.stories.ts +506 -0
  211. package/src/stories/GuideDuDev/Theme.mdx +41 -0
  212. package/dist/SelectFilter-Cj-GW2Cc.js +0 -97
  213. package/dist/main-WDqeoGM-.js +0 -14788
  214. package/src/components/PaginatedTable/tests/__snapshots__/PaginatedTable.spec.ts.snap +0 -886
  215. package/src/components/Tables/SyServerTable/tests/__snapshots__/SyServerTable.spec.ts.snap +0 -521
  216. package/src/components/Tables/SyTable/tests/__snapshots__/SyTable.spec.ts.snap +0 -521
  217. package/src/stories/DesignTokens/ThemePA.mdx +0 -35
@@ -0,0 +1,630 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3'
2
+ import SyCheckbox from '@/components/Customs/SyCheckbox/SyCheckbox.vue'
3
+ import { ref, watch } from 'vue'
4
+
5
+ const meta = {
6
+ title: 'Composants/Formulaires/SyCheckbox',
7
+ component: SyCheckbox,
8
+ decorators: [
9
+ () => ({
10
+ template: '<div style="padding: 20px;"><story/></div>',
11
+ }),
12
+ ],
13
+ parameters: {
14
+ layout: 'fullscreen',
15
+ controls: { exclude: ['modelValue', 'errorMessages', 'warningMessages', 'successMessages'] },
16
+ docs: {
17
+ description: {
18
+ component: `SyCheckbox est un composant de case à cocher tri-état qui étend le composant VCheckbox de Vuetify avec des fonctionnalités supplémentaires comme la validation personnalisée et l'état indéterminé.`,
19
+ },
20
+ },
21
+ },
22
+ argTypes: {
23
+ modelValue: { control: 'boolean' },
24
+ label: {
25
+ description: 'Texte affiché comme label de la case à cocher',
26
+ control: 'text',
27
+ },
28
+ color: {
29
+ control: 'select',
30
+ options: ['primary', 'secondary', 'success', 'error', 'warning'],
31
+ description: 'Couleur de la case à cocher',
32
+ },
33
+ indeterminate: {
34
+ description: 'État indéterminé de la case à cocher',
35
+ control: 'boolean',
36
+ },
37
+ disabled: {
38
+ description: 'Désactive la case à cocher',
39
+ control: 'boolean',
40
+ },
41
+ readonly: {
42
+ description: 'Rend la case à cocher en lecture seule',
43
+ control: 'boolean',
44
+ },
45
+ required: {
46
+ description: 'Rend la case à cocher obligatoire',
47
+ control: 'boolean',
48
+ },
49
+ hideDetails: {
50
+ description: 'Masque les détails (messages d\'erreur, etc.)',
51
+ control: 'boolean',
52
+ },
53
+ density: {
54
+ control: 'select',
55
+ options: ['default', 'comfortable', 'compact'],
56
+ description: 'Densité de la case à cocher',
57
+ },
58
+ customRules: {
59
+ description: 'Règles de validation personnalisées',
60
+ control: 'object',
61
+ },
62
+ customWarningRules: {
63
+ description: 'Règles d\'avertissement personnalisées',
64
+ control: 'object',
65
+ },
66
+ customSuccessRules: {
67
+ description: 'Règles de succès personnalisées',
68
+ control: 'object',
69
+ },
70
+ showSuccessMessages: {
71
+ description: 'Afficher les messages de succès',
72
+ control: 'boolean',
73
+ },
74
+ isValidateOnBlur: {
75
+ description: 'Vérifie la validité lors de la perte de focus',
76
+ control: 'boolean',
77
+ default: true,
78
+ },
79
+ disableErrorHandling: {
80
+ control: 'boolean',
81
+ description: 'Désactive complètement la validation des règles et l\'affichage des erreurs',
82
+ },
83
+ controlsIds: {
84
+ description: 'IDs des éléments contrôlés par cette case à cocher (pour l\'état indéterminé)',
85
+ control: 'object',
86
+ },
87
+ },
88
+ } as Meta<typeof SyCheckbox>
89
+
90
+ export default meta
91
+
92
+ type Story = StoryObj<typeof SyCheckbox>
93
+
94
+ export const Default: Story = {
95
+ parameters: {
96
+ sourceCode: [
97
+ {
98
+ name: 'Template',
99
+ code: `<SyCheckbox v-model="checked" label="Case à cocher" />`,
100
+ },
101
+ ],
102
+ },
103
+ render: args => ({
104
+ components: { SyCheckbox },
105
+ setup() {
106
+ const checked = ref(false)
107
+ return { args, checked }
108
+ },
109
+ template: `<SyCheckbox v-model="checked" v-bind="args" label="Case à cocher" />`,
110
+ }),
111
+ }
112
+
113
+ export const Required: Story = {
114
+ args: {
115
+ ...Default.args,
116
+ required: true,
117
+ isValidateOnBlur: false,
118
+ },
119
+ render: args => ({
120
+ components: { SyCheckbox },
121
+ setup() {
122
+ const checked = ref(false)
123
+ return { args, checked }
124
+ },
125
+ template: `<SyCheckbox v-model="checked" v-bind="args" label="Case à cocher obligatoire" :is-validate-on-blur="false" />`,
126
+ }),
127
+ parameters: {
128
+ sourceCode: [
129
+ {
130
+ name: 'Template',
131
+ code: `<SyCheckbox v-model="checked" label="Case à cocher obligatoire" required :is-validate-on-blur="false" />`,
132
+ },
133
+ ],
134
+ docs: {
135
+ description: {
136
+ story: `
137
+ ### Case à cocher obligatoire
138
+ Cette case à cocher est marquée comme obligatoire, ce qui déclenchera une validation si elle n'est pas cochée.
139
+ `,
140
+ },
141
+ },
142
+ },
143
+ }
144
+
145
+ export const Indeterminate: Story = {
146
+ args: {
147
+ ...Default.args,
148
+ indeterminate: true,
149
+ },
150
+ render: args => ({
151
+ components: { SyCheckbox },
152
+ setup() {
153
+ const checked = ref(false)
154
+ const indeterminate = ref(true)
155
+ return { args, checked, indeterminate }
156
+ },
157
+ template: `<SyCheckbox v-model="checked" :indeterminate="indeterminate" v-bind="args" label="Case à cocher indéterminée" />`,
158
+ }),
159
+ parameters: {
160
+ sourceCode: [
161
+ {
162
+ name: 'Template',
163
+ code: `
164
+ <template>
165
+ <SyCheckbox
166
+ v-model="checked"
167
+ :indeterminate="indeterminate"
168
+ label="Case à cocher indéterminée"
169
+ />
170
+ </template>
171
+
172
+ <script setup>
173
+ import { ref } from 'vue'
174
+
175
+ const checked = ref(false)
176
+ const indeterminate = ref(true)
177
+ </script>`,
178
+ },
179
+ ],
180
+ docs: {
181
+ description: {
182
+ story: `
183
+ ### Case à cocher avec état indéterminé
184
+ Cette case à cocher est dans un état indéterminé, généralement utilisé lorsque certains éléments d'un groupe sont sélectionnés mais pas tous.
185
+ `,
186
+ },
187
+ },
188
+ },
189
+ }
190
+
191
+ export const WithControlsIds: Story = {
192
+ parameters: {
193
+ sourceCode: [
194
+ {
195
+ name: 'Template',
196
+ code: `
197
+ <template>
198
+ <div>
199
+ <SyCheckbox
200
+ v-model="parentChecked"
201
+ :indeterminate="parentIndeterminate"
202
+ @update:indeterminate="parentIndeterminate = $event"
203
+ :controls-ids="['child-1', 'child-2', 'child-3']"
204
+ label="Parent"
205
+ />
206
+ <div style="margin-left: 24px;">
207
+ <SyCheckbox v-model="childChecked1" id="child-1" label="Enfant 1" />
208
+ <SyCheckbox v-model="childChecked2" id="child-2" label="Enfant 2" />
209
+ <SyCheckbox v-model="childChecked3" id="child-3" label="Enfant 3" />
210
+ </div>
211
+ </div>
212
+ </template>
213
+
214
+ <script setup>
215
+ import { ref, watch } from 'vue'
216
+
217
+ const parentChecked = ref(false)
218
+ const parentIndeterminate = ref(false)
219
+ const childChecked1 = ref(false)
220
+ const childChecked2 = ref(false)
221
+ const childChecked3 = ref(false)
222
+
223
+ // Logique pour gérer l'état indéterminé du parent
224
+ const updateParentState = () => {
225
+ const checkedCount = [childChecked1.value, childChecked2.value, childChecked3.value].filter(Boolean).length
226
+
227
+ if (checkedCount === 0) {
228
+ parentChecked.value = false
229
+ parentIndeterminate.value = false
230
+ } else if (checkedCount === 3) {
231
+ parentChecked.value = true
232
+ parentIndeterminate.value = false
233
+ } else {
234
+ parentChecked.value = false
235
+ parentIndeterminate.value = true
236
+ }
237
+ }
238
+
239
+ // Observer les changements des enfants
240
+ watch(childChecked1, updateParentState)
241
+ watch(childChecked2, updateParentState)
242
+ watch(childChecked3, updateParentState)
243
+
244
+ // Mettre à jour les enfants lorsque le parent change
245
+ watch(parentChecked, () => {
246
+ if (!parentIndeterminate.value) {
247
+ childChecked1.value = parentChecked.value
248
+ childChecked2.value = parentChecked.value
249
+ childChecked3.value = parentChecked.value
250
+ }
251
+ })
252
+ </script>`,
253
+ },
254
+ {
255
+ name: 'Script',
256
+ code: `
257
+ <script setup>
258
+ import { ref, watch } from 'vue'
259
+
260
+ const parentChecked = ref(false)
261
+ const parentIndeterminate = ref(false)
262
+ const childChecked1 = ref(false)
263
+ const childChecked2 = ref(false)
264
+ const childChecked3 = ref(false)
265
+
266
+ // Logique pour gérer l'état indéterminé du parent
267
+ const updateParentState = () => {
268
+ const checkedCount = [childChecked1.value, childChecked2.value, childChecked3.value].filter(Boolean).length
269
+
270
+ if (checkedCount === 0) {
271
+ parentChecked.value = false
272
+ parentIndeterminate.value = false
273
+ } else if (checkedCount === 3) {
274
+ parentChecked.value = true
275
+ parentIndeterminate.value = false
276
+ } else {
277
+ parentChecked.value = false
278
+ parentIndeterminate.value = true
279
+ }
280
+ }
281
+
282
+ // Observer les changements des enfants
283
+ watch(childChecked1, updateParentState)
284
+ watch(childChecked2, updateParentState)
285
+ watch(childChecked3, updateParentState)
286
+
287
+ // Mettre à jour les enfants lorsque le parent change
288
+ watch(parentChecked, () => {
289
+ if (!parentIndeterminate.value) {
290
+ childChecked1.value = parentChecked.value
291
+ childChecked2.value = parentChecked.value
292
+ childChecked3.value = parentChecked.value
293
+ }
294
+ })
295
+ </script>
296
+ `,
297
+ },
298
+ ],
299
+ docs: {
300
+ description: {
301
+ story: `
302
+ ### Case à cocher avec contrôle d'éléments enfants
303
+ Cette case à cocher contrôle un groupe d'éléments enfants. Elle utilise la propriété \`controlsIds\` pour établir la relation entre le parent et les enfants.
304
+ Lorsque certains enfants sont cochés mais pas tous, le parent passe automatiquement en état indéterminé.
305
+
306
+ La propriété \`controlsIds\` permet de créer une relation sémantique entre une case à cocher parent et ses enfants, ce qui est important pour l'accessibilité. Cette relation est établie via les attributs \`aria-controls\` et les identifiants des cases à cocher enfants.
307
+ `,
308
+ },
309
+ },
310
+ },
311
+ render: args => ({
312
+ components: { SyCheckbox },
313
+ setup() {
314
+ const parentChecked = ref(false)
315
+ const parentIndeterminate = ref(false)
316
+ const childChecked1 = ref(false)
317
+ const childChecked2 = ref(false)
318
+ const childChecked3 = ref(false)
319
+
320
+ // Logique pour gérer l'état indéterminé du parent
321
+ function updateParentState() {
322
+ const checkedCount = [
323
+ childChecked1.value,
324
+ childChecked2.value,
325
+ childChecked3.value,
326
+ ].filter(Boolean).length
327
+
328
+ if (checkedCount === 0) {
329
+ parentChecked.value = false
330
+ parentIndeterminate.value = false
331
+ }
332
+ else if (checkedCount === 3) {
333
+ parentChecked.value = true
334
+ parentIndeterminate.value = false
335
+ }
336
+ else {
337
+ parentChecked.value = false
338
+ parentIndeterminate.value = true
339
+ }
340
+ }
341
+
342
+ // Observer les changements des enfants
343
+ const watchChild = () => {
344
+ updateParentState()
345
+ }
346
+
347
+ // Mettre à jour les enfants lorsque le parent change
348
+ const watchParent = () => {
349
+ if (!parentIndeterminate.value) {
350
+ childChecked1.value = parentChecked.value
351
+ childChecked2.value = parentChecked.value
352
+ childChecked3.value = parentChecked.value
353
+ }
354
+ }
355
+
356
+ // Configurer les observateurs
357
+ watch(childChecked1, watchChild)
358
+ watch(childChecked2, watchChild)
359
+ watch(childChecked3, watchChild)
360
+ watch(parentChecked, watchParent)
361
+
362
+ return {
363
+ args,
364
+ parentChecked,
365
+ parentIndeterminate,
366
+ childChecked1,
367
+ childChecked2,
368
+ childChecked3,
369
+ }
370
+ },
371
+ template: `
372
+ <div>
373
+ <SyCheckbox
374
+ v-model="parentChecked"
375
+ :indeterminate="parentIndeterminate"
376
+ @update:indeterminate="parentIndeterminate = $event"
377
+ :controls-ids="['child-1', 'child-2', 'child-3']"
378
+ label="Parent"
379
+ />
380
+ <div style="margin-left: 24px;">
381
+ <SyCheckbox v-model="childChecked1" id="child-1" label="Enfant 1" />
382
+ <SyCheckbox v-model="childChecked2" id="child-2" label="Enfant 2" />
383
+ <SyCheckbox v-model="childChecked3" id="child-3" label="Enfant 3" />
384
+ </div>
385
+ </div>
386
+ `,
387
+ }),
388
+ }
389
+
390
+ export const ValidationRules: Story = {
391
+ parameters: {
392
+ sourceCode: [
393
+ {
394
+ name: 'Template',
395
+ code: `
396
+ <template>
397
+ <SyCheckbox
398
+ v-model="checked"
399
+ label="J'accepte les conditions générales d'utilisation"
400
+ :custom-rules="rules"
401
+ :is-validate-on-blur="false"
402
+ />
403
+ </template>
404
+
405
+ <script setup>
406
+ import { ref } from 'vue'
407
+
408
+ const checked = ref(false)
409
+ const rules = [
410
+ {
411
+ type: 'custom',
412
+ options: {
413
+ message: 'Cette case doit être cochée pour continuer.',
414
+ validate: (value) => value === true,
415
+ },
416
+ },
417
+ ]
418
+ </script>`,
419
+ },
420
+ {
421
+ name: 'Script',
422
+ code: `
423
+ // Composition API
424
+ export default {
425
+ setup() {
426
+ const checked = ref(false)
427
+ const rules = [
428
+ {
429
+ type: 'custom',
430
+ options: {
431
+ message: 'Cette case doit être cochée pour continuer.',
432
+ validate: (value) => value === true,
433
+ },
434
+ },
435
+ ]
436
+
437
+ return {
438
+ checked,
439
+ rules,
440
+ }
441
+ }
442
+ }`,
443
+ },
444
+ ],
445
+ docs: {
446
+ description: {
447
+ story: `
448
+ ### Case à cocher avec règles de validation personnalisées
449
+ Cette case à cocher utilise des règles de validation personnalisées pour vérifier si elle est cochée.
450
+ `,
451
+ },
452
+ },
453
+ },
454
+ render: args => ({
455
+ components: { SyCheckbox },
456
+ setup() {
457
+ const checked = ref(false)
458
+ return {
459
+ args,
460
+ checked,
461
+ rules: [
462
+ {
463
+ type: 'custom',
464
+ options: {
465
+ message: 'Cette case doit être cochée pour continuer.',
466
+ validate: (value: boolean) => value === true,
467
+ },
468
+ },
469
+ ],
470
+ isValidateOnBlur: false,
471
+ }
472
+ },
473
+ template: `
474
+ <SyCheckbox
475
+ v-model="checked"
476
+ label="J'accepte les conditions générales d'utilisation"
477
+ :custom-rules="rules"
478
+ :is-validate-on-blur="false"
479
+ />
480
+ `,
481
+ }),
482
+ }
483
+
484
+ export const DisabledState: Story = {
485
+ args: {
486
+ ...Default.args,
487
+ disabled: true,
488
+ },
489
+ render: args => ({
490
+ components: { SyCheckbox },
491
+ setup() {
492
+ const checked = ref(true)
493
+ return { args, checked }
494
+ },
495
+ template: `<SyCheckbox v-model="checked" v-bind="args" label="Case à cocher désactivée" />`,
496
+ }),
497
+ parameters: {
498
+ sourceCode: [
499
+ {
500
+ name: 'Template',
501
+ code: `<SyCheckbox v-model="checked" disabled label="Case à cocher désactivée" />`,
502
+ },
503
+ ],
504
+ docs: {
505
+ description: {
506
+ story: `
507
+ ### Case à cocher désactivée
508
+ Cette case à cocher est désactivée et ne peut pas être modifiée par l'utilisateur.
509
+ `,
510
+ },
511
+ },
512
+ },
513
+ }
514
+
515
+ export const ReadonlyState: Story = {
516
+ args: {
517
+ ...Default.args,
518
+ readonly: true,
519
+ },
520
+ render: args => ({
521
+ components: { SyCheckbox },
522
+ setup() {
523
+ const checked = ref(true)
524
+ return { args, checked }
525
+ },
526
+ template: `<SyCheckbox v-model="checked" v-bind="args" label="Case à cocher en lecture seule" />`,
527
+ }),
528
+ parameters: {
529
+ sourceCode: [
530
+ {
531
+ name: 'Template',
532
+ code: `<SyCheckbox v-model="checked" readonly label="Case à cocher en lecture seule" />`,
533
+ },
534
+ ],
535
+ docs: {
536
+ description: {
537
+ story: `
538
+ ### Case à cocher en lecture seule
539
+ Cette case à cocher est en lecture seule et ne peut pas être modifiée par l'utilisateur, mais elle n'est pas visuellement désactivée comme la version disabled.
540
+ `,
541
+ },
542
+ },
543
+ },
544
+ }
545
+
546
+ export const DifferentDensities: Story = {
547
+ parameters: {
548
+ sourceCode: [
549
+ {
550
+ name: 'Template',
551
+ code: `
552
+ <div>
553
+ <SyCheckbox v-model="checked1" label="Densité par défaut" />
554
+ <SyCheckbox v-model="checked2" label="Densité confortable" density="comfortable" />
555
+ <SyCheckbox v-model="checked3" label="Densité compacte" density="compact" />
556
+ </div>`,
557
+ },
558
+ ],
559
+ docs: {
560
+ description: {
561
+ story: `
562
+ ### Différentes densités
563
+ Le composant SyCheckbox prend en charge différentes densités pour s'adapter à différents contextes d'interface utilisateur.
564
+ `,
565
+ },
566
+ },
567
+ },
568
+ render: args => ({
569
+ components: { SyCheckbox },
570
+ setup() {
571
+ const checked1 = ref(false)
572
+ const checked2 = ref(false)
573
+ const checked3 = ref(false)
574
+ return { args, checked1, checked2, checked3 }
575
+ },
576
+ template: `
577
+ <div>
578
+ <SyCheckbox v-model="checked1" label="Densité par défaut" />
579
+ <SyCheckbox v-model="checked2" label="Densité confortable" density="comfortable" />
580
+ <SyCheckbox v-model="checked3" label="Densité compacte" density="compact" />
581
+ </div>
582
+ `,
583
+ }),
584
+ }
585
+
586
+ export const CustomColors: Story = {
587
+ parameters: {
588
+ sourceCode: [
589
+ {
590
+ name: 'Template',
591
+ code: `
592
+ <div>
593
+ <SyCheckbox v-model="checked1" label="Couleur primaire (par défaut)" />
594
+ <SyCheckbox v-model="checked2" label="Couleur secondaire" color="secondary" />
595
+ <SyCheckbox v-model="checked3" label="Couleur succès" color="success" />
596
+ <SyCheckbox v-model="checked4" label="Couleur erreur" color="error" />
597
+ <SyCheckbox v-model="checked5" label="Couleur avertissement" color="warning" />
598
+ </div>`,
599
+ },
600
+ ],
601
+ docs: {
602
+ description: {
603
+ story: `
604
+ ### Couleurs personnalisées
605
+ Le composant SyCheckbox peut être personnalisé avec différentes couleurs pour s'adapter à votre thème.
606
+ `,
607
+ },
608
+ },
609
+ },
610
+ render: args => ({
611
+ components: { SyCheckbox },
612
+ setup() {
613
+ const checked1 = ref(true)
614
+ const checked2 = ref(true)
615
+ const checked3 = ref(true)
616
+ const checked4 = ref(true)
617
+ const checked5 = ref(true)
618
+ return { args, checked1, checked2, checked3, checked4, checked5 }
619
+ },
620
+ template: `
621
+ <div>
622
+ <SyCheckbox v-model="checked1" label="Couleur primaire (par défaut)" />
623
+ <SyCheckbox v-model="checked2" label="Couleur secondaire" color="secondary" />
624
+ <SyCheckbox v-model="checked3" label="Couleur succès" color="success" />
625
+ <SyCheckbox v-model="checked4" label="Couleur erreur" color="error" />
626
+ <SyCheckbox v-model="checked5" label="Couleur avertissement" color="warning" />
627
+ </div>
628
+ `,
629
+ }),
630
+ }