@besaitech/ng-design-system-mcp 0.0.5

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.
package/data/docs.json ADDED
@@ -0,0 +1,4110 @@
1
+ {
2
+ "schemaVersion": "1.0.0",
3
+ "libraryVersion": "0.0.29",
4
+ "packageName": "@besaitech/ng-design-system",
5
+ "devImport": "saitech-design-system",
6
+ "generatedAt": "2026-08-31T22:12:44.950Z",
7
+ "componentCount": 30,
8
+ "components": [
9
+ {
10
+ "className": "SdsAccordion",
11
+ "selector": "sds-accordion",
12
+ "kind": "component",
13
+ "group": "data",
14
+ "importName": "SdsAccordion, SdsAccordionPanel, SdsAccordionHeader, SdsAccordionContent",
15
+ "description": "Panneaux dépliables composables. <sds-accordion> coordonne ses <sds-accordion-panel> ; chaque panneau porte un [value] et contient un <sds-accordion-header> et un <sds-accordion-content>. Le panneau ouvert est la valeur [value] (liaison bidirectionnelle [(value)]). [multiple] autorise plusieurs panneaux ouverts (la valeur devient un tableau). Repli animé, navigation clavier (flèches, Début, Fin).",
16
+ "overviewDescription": "Panneaux dépliables : mode simple ou multiple, clavier.",
17
+ "jsdoc": "Root of an accordion. Compose with <sds-accordion-panel> children, each\nholding an <sds-accordion-header> and an <sds-accordion-content>. The open\npanel is the [value], matched against each panel's [value]; it is two-way\nbindable via [(value)]. With [multiple], several panels may be open at once\nand [value] is an array.",
18
+ "example": "<sds-accordion [(value)]=\"open\">\n <sds-accordion-panel value=\"0\">\n <sds-accordion-header>Section 1</sds-accordion-header>\n <sds-accordion-content>…</sds-accordion-content>\n </sds-accordion-panel>\n</sds-accordion>",
19
+ "cva": false,
20
+ "usesNgModel": false,
21
+ "inputs": [
22
+ {
23
+ "name": "value",
24
+ "type": "SdsAccordionActive",
25
+ "default": "null",
26
+ "required": false,
27
+ "transform": null,
28
+ "alias": null,
29
+ "jsdoc": "Open panel value, or array of values in multiple mode (two-way)."
30
+ },
31
+ {
32
+ "name": "multiple",
33
+ "type": "boolean",
34
+ "default": "false",
35
+ "required": false,
36
+ "transform": "booleanAttribute",
37
+ "alias": null,
38
+ "jsdoc": "Allow more than one panel open at a time."
39
+ }
40
+ ],
41
+ "outputs": [
42
+ {
43
+ "name": "valueChange",
44
+ "type": "SdsAccordionActive",
45
+ "fromModel": true
46
+ }
47
+ ],
48
+ "exportedTypes": [],
49
+ "projectionSlots": [],
50
+ "hostBindings": {
51
+ "class": "block divide-y divide-border overflow-hidden rounded-card border border-border bg-surface",
52
+ "(keydown)": "onKeydown($event)"
53
+ },
54
+ "examples": [
55
+ {
56
+ "sectionTitle": "Basique",
57
+ "sectionDescription": "Mode simple : un seul panneau ouvert ; recliquer le replie.",
58
+ "code": "<sds-accordion value=\"0\">\n <sds-accordion-panel value=\"0\">\n <sds-accordion-header>Admission du patient</sds-accordion-header>\n <sds-accordion-content>…</sds-accordion-content>\n </sds-accordion-panel>\n <sds-accordion-panel value=\"1\">\n <sds-accordion-header>Dossier médical</sds-accordion-header>\n <sds-accordion-content>…</sds-accordion-content>\n </sds-accordion-panel>\n</sds-accordion>",
59
+ "runnableExample": "<sds-accordion value=\"0\">\n <sds-accordion-panel value=\"0\">\n <sds-accordion-header>Admission du patient</sds-accordion-header>\n <sds-accordion-content>\n Procédure d'enregistrement : identité, couverture mutuelle et\n affectation au service compétent.\n </sds-accordion-content>\n </sds-accordion-panel>\n <sds-accordion-panel value=\"1\">\n <sds-accordion-header>Dossier médical</sds-accordion-header>\n <sds-accordion-content>\n Antécédents, allergies et traitements en cours, consultables par\n l'équipe soignante autorisée.\n </sds-accordion-content>\n </sds-accordion-panel>\n <sds-accordion-panel value=\"2\">\n <sds-accordion-header>Sortie & suivi</sds-accordion-header>\n <sds-accordion-content>\n Compte rendu d'hospitalisation, ordonnances et planification du\n suivi ambulatoire.\n </sds-accordion-content>\n </sds-accordion-panel>\n </sds-accordion>",
60
+ "stack": true,
61
+ "dark": false
62
+ },
63
+ {
64
+ "sectionTitle": "Multiple",
65
+ "sectionDescription": "[multiple] autorise plusieurs panneaux ouverts ; [value] est un tableau.",
66
+ "code": "<sds-accordion multiple [value]=\"['0', '1']\">\n <sds-accordion-panel value=\"0\">\n <sds-accordion-header>Cardiologie</sds-accordion-header>\n <sds-accordion-content>…</sds-accordion-content>\n </sds-accordion-panel>\n <sds-accordion-panel value=\"1\">…</sds-accordion-panel>\n <sds-accordion-panel value=\"2\">…</sds-accordion-panel>\n</sds-accordion>",
67
+ "runnableExample": "<sds-accordion multiple [value]=\"['0', '1']\">\n <sds-accordion-panel value=\"0\">\n <sds-accordion-header>Cardiologie</sds-accordion-header>\n <sds-accordion-content>Unité de soins intensifs cardiologiques.</sds-accordion-content>\n </sds-accordion-panel>\n <sds-accordion-panel value=\"1\">\n <sds-accordion-header>Pédiatrie</sds-accordion-header>\n <sds-accordion-content>Hospitalisation et consultations pédiatriques.</sds-accordion-content>\n </sds-accordion-panel>\n <sds-accordion-panel value=\"2\">\n <sds-accordion-header>Radiologie</sds-accordion-header>\n <sds-accordion-content>Imagerie médicale : IRM, scanner et échographie.</sds-accordion-content>\n </sds-accordion-panel>\n </sds-accordion>",
68
+ "stack": true,
69
+ "dark": false
70
+ },
71
+ {
72
+ "sectionTitle": "En-têtes avec icônes",
73
+ "sectionDescription": "Projetez un <sds-icon> dans l'en-tête.",
74
+ "code": "<sds-accordion value=\"profile\">\n <sds-accordion-panel value=\"profile\">\n <sds-accordion-header><sds-icon name=\"circle-user\" [size]=\"18\" /> Profil</sds-accordion-header>\n <sds-accordion-content>…</sds-accordion-content>\n </sds-accordion-panel>\n …\n</sds-accordion>",
75
+ "runnableExample": "<sds-accordion value=\"profile\">\n <sds-accordion-panel value=\"profile\">\n <sds-accordion-header><sds-icon name=\"circle-user\" [size]=\"18\" /> Profil</sds-accordion-header>\n <sds-accordion-content>Nom, fonction et coordonnées du membre du personnel.</sds-accordion-content>\n </sds-accordion-panel>\n <sds-accordion-panel value=\"notifications\">\n <sds-accordion-header><sds-icon name=\"bell\" [size]=\"18\" /> Notifications</sds-accordion-header>\n <sds-accordion-content>Préférences d'alertes et de rappels.</sds-accordion-content>\n </sds-accordion-panel>\n <sds-accordion-panel value=\"security\">\n <sds-accordion-header><sds-icon name=\"settings\" [size]=\"18\" /> Sécurité</sds-accordion-header>\n <sds-accordion-content>Mot de passe, double authentification et sessions actives.</sds-accordion-content>\n </sds-accordion-panel>\n </sds-accordion>",
76
+ "stack": true,
77
+ "dark": false
78
+ },
79
+ {
80
+ "sectionTitle": "Panneau désactivé",
81
+ "sectionDescription": null,
82
+ "code": "<sds-accordion value=\"0\">\n <sds-accordion-panel value=\"0\">…</sds-accordion-panel>\n <sds-accordion-panel value=\"1\" disabled>\n <sds-accordion-header>Indisponible</sds-accordion-header>\n <sds-accordion-content>…</sds-accordion-content>\n </sds-accordion-panel>\n</sds-accordion>",
83
+ "runnableExample": "<sds-accordion value=\"0\">\n <sds-accordion-panel value=\"0\">\n <sds-accordion-header>Disponible</sds-accordion-header>\n <sds-accordion-content>Ce panneau est accessible.</sds-accordion-content>\n </sds-accordion-panel>\n <sds-accordion-panel value=\"1\" disabled>\n <sds-accordion-header>Indisponible</sds-accordion-header>\n <sds-accordion-content>Ce contenu ne peut pas être ouvert.</sds-accordion-content>\n </sds-accordion-panel>\n <sds-accordion-panel value=\"2\">\n <sds-accordion-header>Archives</sds-accordion-header>\n <sds-accordion-content>Documents archivés du dossier.</sds-accordion-content>\n </sds-accordion-panel>\n </sds-accordion>",
84
+ "stack": true,
85
+ "dark": false
86
+ },
87
+ {
88
+ "sectionTitle": "Contrôlé (two-way)",
89
+ "sectionDescription": "Liaison [(value)] vers un signal ; pilotable depuis l'extérieur.",
90
+ "code": "<sds-button (click)=\"open.set('a')\">Ouvrir A</sds-button>\n<sds-button (click)=\"open.set(null)\">Tout replier</sds-button>\n\n<sds-accordion [(value)]=\"open\">\n <sds-accordion-panel value=\"a\">\n <sds-accordion-header>Panneau A</sds-accordion-header>\n <sds-accordion-content>Contenu A</sds-accordion-content>\n </sds-accordion-panel>\n …\n</sds-accordion>\n\n// open = signal<SdsAccordionActive>('a');",
91
+ "runnableExample": "<div class=\"flex flex-wrap items-center gap-2\">\n <sds-button size=\"sm\" variant=\"secondary\" (click)=\"open.set('a')\">Ouvrir A</sds-button>\n <sds-button size=\"sm\" variant=\"secondary\" (click)=\"open.set('c')\">Ouvrir C</sds-button>\n <sds-button size=\"sm\" variant=\"ghost\" (click)=\"open.set(null)\">Tout replier</sds-button>\n <span class=\"text-sm text-ink-soft\">\n Ouvert : <span class=\"font-medium text-ink\">{{ open() ?? '—' }}</span>\n </span>\n </div>\n\n <sds-accordion [(value)]=\"open\">\n <sds-accordion-panel value=\"a\">\n <sds-accordion-header>Panneau A</sds-accordion-header>\n <sds-accordion-content>Contenu A</sds-accordion-content>\n </sds-accordion-panel>\n <sds-accordion-panel value=\"b\">\n <sds-accordion-header>Panneau B</sds-accordion-header>\n <sds-accordion-content>Contenu B</sds-accordion-content>\n </sds-accordion-panel>\n <sds-accordion-panel value=\"c\">\n <sds-accordion-header>Panneau C</sds-accordion-header>\n <sds-accordion-content>Contenu C</sds-accordion-content>\n </sds-accordion-panel>\n </sds-accordion>",
92
+ "stack": true,
93
+ "dark": false
94
+ },
95
+ {
96
+ "sectionTitle": "Dynamique (FAQ)",
97
+ "sectionDescription": "Générez les panneaux avec @for.",
98
+ "code": "<sds-accordion multiple>\n @for (f of faqs; track f.value) {\n <sds-accordion-panel [value]=\"f.value\">\n <sds-accordion-header>{{ f.question }}</sds-accordion-header>\n <sds-accordion-content>{{ f.answer }}</sds-accordion-content>\n </sds-accordion-panel>\n }\n</sds-accordion>",
99
+ "runnableExample": "<sds-accordion multiple>\n @for (f of faqs; track f.value) {\n <sds-accordion-panel [value]=\"f.value\">\n <sds-accordion-header>{{ f.question }}</sds-accordion-header>\n <sds-accordion-content>{{ f.answer }}</sds-accordion-content>\n </sds-accordion-panel>\n }\n </sds-accordion>",
100
+ "stack": true,
101
+ "dark": false
102
+ }
103
+ ]
104
+ },
105
+ {
106
+ "className": "SdsAccordionContent",
107
+ "selector": "sds-accordion-content",
108
+ "kind": "component",
109
+ "group": "data",
110
+ "importName": "SdsAccordionContent",
111
+ "description": null,
112
+ "overviewDescription": null,
113
+ "jsdoc": "Collapsible content region of an accordion panel. Animates open/closed with a\nCSS grid-rows transition; while closed it is `inert` (not focusable, hidden\nfrom assistive tech) but kept in the DOM, so its state persists.",
114
+ "example": null,
115
+ "cva": false,
116
+ "usesNgModel": false,
117
+ "inputs": [],
118
+ "outputs": [],
119
+ "exportedTypes": [],
120
+ "projectionSlots": [],
121
+ "hostBindings": {
122
+ "class": "block"
123
+ },
124
+ "examples": []
125
+ },
126
+ {
127
+ "className": "SdsAccordionHeader",
128
+ "selector": "sds-accordion-header",
129
+ "kind": "component",
130
+ "group": "data",
131
+ "importName": "SdsAccordionHeader",
132
+ "description": null,
133
+ "overviewDescription": null,
134
+ "jsdoc": "Clickable header of an accordion panel. Project the label text and,\noptionally, an <sds-icon>. Renders a chevron that rotates when open.",
135
+ "example": null,
136
+ "cva": false,
137
+ "usesNgModel": false,
138
+ "inputs": [],
139
+ "outputs": [],
140
+ "exportedTypes": [],
141
+ "projectionSlots": [],
142
+ "hostBindings": {
143
+ "class": "block"
144
+ },
145
+ "examples": []
146
+ },
147
+ {
148
+ "className": "SdsAccordionPanel",
149
+ "selector": "sds-accordion-panel",
150
+ "kind": "component",
151
+ "group": "data",
152
+ "importName": "SdsAccordionPanel",
153
+ "description": null,
154
+ "overviewDescription": null,
155
+ "jsdoc": "One accordion section. Holds the [value] and optional [disabled] state shared\nwith its projected <sds-accordion-header> and <sds-accordion-content>.",
156
+ "example": null,
157
+ "cva": false,
158
+ "usesNgModel": false,
159
+ "inputs": [
160
+ {
161
+ "name": "value",
162
+ "type": "SdsAccordionValue",
163
+ "default": null,
164
+ "required": true,
165
+ "transform": null,
166
+ "alias": null,
167
+ "jsdoc": null
168
+ },
169
+ {
170
+ "name": "disabled",
171
+ "type": "boolean",
172
+ "default": "false",
173
+ "required": false,
174
+ "transform": "booleanAttribute",
175
+ "alias": null,
176
+ "jsdoc": null
177
+ }
178
+ ],
179
+ "outputs": [],
180
+ "exportedTypes": [],
181
+ "projectionSlots": [],
182
+ "hostBindings": {
183
+ "class": "block"
184
+ },
185
+ "examples": []
186
+ },
187
+ {
188
+ "className": "SdsAvatar",
189
+ "selector": "sds-avatar",
190
+ "kind": "component",
191
+ "group": "primitive",
192
+ "importName": "SdsAvatar",
193
+ "description": "Avatar circulaire affichant une image ou des initiales, avec pastille de statut optionnelle.",
194
+ "overviewDescription": "Avatars avec initiales, image et indicateur de statut.",
195
+ "jsdoc": "Circular avatar showing an image or initials, with an optional status dot.",
196
+ "example": null,
197
+ "cva": false,
198
+ "usesNgModel": false,
199
+ "inputs": [
200
+ {
201
+ "name": "name",
202
+ "type": "string",
203
+ "default": "''",
204
+ "required": false,
205
+ "transform": null,
206
+ "alias": null,
207
+ "jsdoc": null
208
+ },
209
+ {
210
+ "name": "initials",
211
+ "type": "string",
212
+ "default": "''",
213
+ "required": false,
214
+ "transform": null,
215
+ "alias": null,
216
+ "jsdoc": null
217
+ },
218
+ {
219
+ "name": "src",
220
+ "type": "string | null",
221
+ "default": "null",
222
+ "required": false,
223
+ "transform": null,
224
+ "alias": null,
225
+ "jsdoc": null
226
+ },
227
+ {
228
+ "name": "size",
229
+ "type": "number",
230
+ "default": "36",
231
+ "required": false,
232
+ "transform": null,
233
+ "alias": null,
234
+ "jsdoc": null
235
+ },
236
+ {
237
+ "name": "status",
238
+ "type": "SdsAvatarStatus | null",
239
+ "default": "null",
240
+ "required": false,
241
+ "transform": null,
242
+ "alias": null,
243
+ "jsdoc": null
244
+ },
245
+ {
246
+ "name": "bgClass",
247
+ "type": "string",
248
+ "default": "'bg-brand-400'",
249
+ "required": false,
250
+ "transform": null,
251
+ "alias": null,
252
+ "jsdoc": "Tailwind bg utility for the initials background."
253
+ }
254
+ ],
255
+ "outputs": [],
256
+ "exportedTypes": [
257
+ {
258
+ "name": "SdsAvatarStatus",
259
+ "kind": "union",
260
+ "body": "'online' | 'offline' | 'busy' | 'away'"
261
+ }
262
+ ],
263
+ "projectionSlots": [],
264
+ "hostBindings": {
265
+ "class": "inline-block shrink-0 align-middle"
266
+ },
267
+ "examples": [
268
+ {
269
+ "sectionTitle": "Initiales",
270
+ "sectionDescription": null,
271
+ "code": "<sds-avatar initials=\"AS\"></sds-avatar>\n<sds-avatar name=\"Marie Curie\"></sds-avatar>",
272
+ "runnableExample": "<sds-avatar initials=\"AS\"></sds-avatar>\n <sds-avatar name=\"Marie Curie\"></sds-avatar>",
273
+ "stack": false,
274
+ "dark": false
275
+ },
276
+ {
277
+ "sectionTitle": "Tailles",
278
+ "sectionDescription": null,
279
+ "code": "<sds-avatar name=\"Sophie Bernard\" [size]=\"28\"></sds-avatar>\n<sds-avatar name=\"Sophie Bernard\" [size]=\"36\"></sds-avatar>\n<sds-avatar name=\"Sophie Bernard\" [size]=\"48\"></sds-avatar>\n<sds-avatar name=\"Sophie Bernard\" [size]=\"64\"></sds-avatar>",
280
+ "runnableExample": "<sds-avatar name=\"Sophie Bernard\" [size]=\"28\"></sds-avatar>\n <sds-avatar name=\"Sophie Bernard\" [size]=\"36\"></sds-avatar>\n <sds-avatar name=\"Sophie Bernard\" [size]=\"48\"></sds-avatar>\n <sds-avatar name=\"Sophie Bernard\" [size]=\"64\"></sds-avatar>",
281
+ "stack": false,
282
+ "dark": false
283
+ },
284
+ {
285
+ "sectionTitle": "Statut",
286
+ "sectionDescription": null,
287
+ "code": "<sds-avatar name=\"Léa Dubois\" status=\"online\"></sds-avatar>\n<sds-avatar name=\"Léa Dubois\" status=\"busy\"></sds-avatar>\n<sds-avatar name=\"Léa Dubois\" status=\"away\"></sds-avatar>\n<sds-avatar name=\"Léa Dubois\" status=\"offline\"></sds-avatar>",
288
+ "runnableExample": "<sds-avatar name=\"Léa Dubois\" status=\"online\"></sds-avatar>\n <sds-avatar name=\"Léa Dubois\" status=\"busy\"></sds-avatar>\n <sds-avatar name=\"Léa Dubois\" status=\"away\"></sds-avatar>\n <sds-avatar name=\"Léa Dubois\" status=\"offline\"></sds-avatar>",
289
+ "stack": false,
290
+ "dark": false
291
+ },
292
+ {
293
+ "sectionTitle": "Couleur de fond",
294
+ "sectionDescription": null,
295
+ "code": "<sds-avatar name=\"Inès Moreau\" bgClass=\"bg-accent-indigo\"></sds-avatar>\n<sds-avatar name=\"Gaël Petit\" bgClass=\"bg-accent-green\"></sds-avatar>\n<sds-avatar name=\"Yann Roux\" bgClass=\"bg-accent-amber\"></sds-avatar>",
296
+ "runnableExample": "<sds-avatar name=\"Inès Moreau\" bgClass=\"bg-accent-indigo\"></sds-avatar>\n <sds-avatar name=\"Gaël Petit\" bgClass=\"bg-accent-green\"></sds-avatar>\n <sds-avatar name=\"Yann Roux\" bgClass=\"bg-accent-amber\"></sds-avatar>",
297
+ "stack": false,
298
+ "dark": false
299
+ }
300
+ ]
301
+ },
302
+ {
303
+ "className": "SdsBadge",
304
+ "selector": "sds-badge",
305
+ "kind": "component",
306
+ "group": "primitive",
307
+ "importName": "SdsBadge",
308
+ "description": "Petite pastille d'état ou d'étiquette, avec variantes de couleur, deux tailles et un point indicateur optionnel.",
309
+ "overviewDescription": "Pastilles de statut et étiquettes.",
310
+ "jsdoc": "Small status/label pill. Used e.g. for the \"TEST V.1.0.0\" version chip.",
311
+ "example": null,
312
+ "cva": false,
313
+ "usesNgModel": false,
314
+ "inputs": [
315
+ {
316
+ "name": "variant",
317
+ "type": "SdsBadgeVariant",
318
+ "default": "'neutral'",
319
+ "required": false,
320
+ "transform": null,
321
+ "alias": null,
322
+ "jsdoc": null
323
+ },
324
+ {
325
+ "name": "size",
326
+ "type": "SdsBadgeSize",
327
+ "default": "'md'",
328
+ "required": false,
329
+ "transform": null,
330
+ "alias": null,
331
+ "jsdoc": null
332
+ },
333
+ {
334
+ "name": "dot",
335
+ "type": "boolean",
336
+ "default": "false",
337
+ "required": false,
338
+ "transform": "booleanAttribute",
339
+ "alias": null,
340
+ "jsdoc": null
341
+ }
342
+ ],
343
+ "outputs": [],
344
+ "exportedTypes": [
345
+ {
346
+ "name": "SdsBadgeVariant",
347
+ "kind": "union",
348
+ "body": "| 'neutral' | 'brand' | 'info' | 'success' | 'warning' | 'danger'"
349
+ },
350
+ {
351
+ "name": "SdsBadgeSize",
352
+ "kind": "union",
353
+ "body": "'sm' | 'md'"
354
+ }
355
+ ],
356
+ "projectionSlots": [],
357
+ "hostBindings": {
358
+ "class": "inline-flex"
359
+ },
360
+ "examples": [
361
+ {
362
+ "sectionTitle": "Variantes",
363
+ "sectionDescription": null,
364
+ "code": "<sds-badge variant=\"neutral\">Neutre</sds-badge>\n<sds-badge variant=\"brand\">Service</sds-badge>\n<sds-badge variant=\"info\">Information</sds-badge>\n<sds-badge variant=\"success\">Validé</sds-badge>\n<sds-badge variant=\"warning\">En attente</sds-badge>\n<sds-badge variant=\"danger\">Urgent</sds-badge>",
365
+ "runnableExample": "<sds-badge variant=\"neutral\">Neutre</sds-badge>\n <sds-badge variant=\"brand\">Service</sds-badge>\n <sds-badge variant=\"info\">Information</sds-badge>\n <sds-badge variant=\"success\">Validé</sds-badge>\n <sds-badge variant=\"warning\">En attente</sds-badge>\n <sds-badge variant=\"danger\">Urgent</sds-badge>",
366
+ "stack": false,
367
+ "dark": false
368
+ },
369
+ {
370
+ "sectionTitle": "Avec point",
371
+ "sectionDescription": null,
372
+ "code": "<sds-badge variant=\"success\" dot>Actif</sds-badge>\n<sds-badge variant=\"warning\" dot>Test V.1.0.0</sds-badge>\n<sds-badge variant=\"danger\" dot>Hors service</sds-badge>\n<sds-badge variant=\"info\" dot>En cours</sds-badge>",
373
+ "runnableExample": "<sds-badge variant=\"success\" dot>Actif</sds-badge>\n <sds-badge variant=\"warning\" dot>Test V.1.0.0</sds-badge>\n <sds-badge variant=\"danger\" dot>Hors service</sds-badge>\n <sds-badge variant=\"info\" dot>En cours</sds-badge>",
374
+ "stack": false,
375
+ "dark": false
376
+ },
377
+ {
378
+ "sectionTitle": "Tailles",
379
+ "sectionDescription": null,
380
+ "code": "<sds-badge variant=\"brand\" size=\"sm\">Petite</sds-badge>\n<sds-badge variant=\"brand\" size=\"md\">Moyenne</sds-badge>",
381
+ "runnableExample": "<sds-badge variant=\"brand\" size=\"sm\">Petite</sds-badge>\n <sds-badge variant=\"brand\" size=\"md\">Moyenne</sds-badge>",
382
+ "stack": false,
383
+ "dark": false
384
+ }
385
+ ]
386
+ },
387
+ {
388
+ "className": "SdsButton",
389
+ "selector": "sds-button",
390
+ "kind": "component",
391
+ "group": "primitive",
392
+ "importName": "SdsButton",
393
+ "description": "Bouton d'action avec variantes, tailles, états de chargement et icônes.",
394
+ "overviewDescription": "Boutons d'action : variantes, tailles, états et icônes.",
395
+ "jsdoc": "Brand button. Project an <sds-icon sdsIconLeading/> or <sds-icon sdsIconTrailing/>\nfor icons, or set [iconOnly]=\"true\" for a square icon button.",
396
+ "example": "<sds-button variant=\"primary\" (click)=\"save()\">Enregistrer</sds-button>",
397
+ "cva": false,
398
+ "usesNgModel": false,
399
+ "inputs": [
400
+ {
401
+ "name": "variant",
402
+ "type": "SdsButtonVariant",
403
+ "default": "'primary'",
404
+ "required": false,
405
+ "transform": null,
406
+ "alias": null,
407
+ "jsdoc": null
408
+ },
409
+ {
410
+ "name": "size",
411
+ "type": "SdsButtonSize",
412
+ "default": "'md'",
413
+ "required": false,
414
+ "transform": null,
415
+ "alias": null,
416
+ "jsdoc": null
417
+ },
418
+ {
419
+ "name": "type",
420
+ "type": "'button' | 'submit' | 'reset'",
421
+ "default": "'button'",
422
+ "required": false,
423
+ "transform": null,
424
+ "alias": null,
425
+ "jsdoc": null
426
+ },
427
+ {
428
+ "name": "disabled",
429
+ "type": "boolean",
430
+ "default": "false",
431
+ "required": false,
432
+ "transform": "booleanAttribute",
433
+ "alias": null,
434
+ "jsdoc": null
435
+ },
436
+ {
437
+ "name": "loading",
438
+ "type": "boolean",
439
+ "default": "false",
440
+ "required": false,
441
+ "transform": "booleanAttribute",
442
+ "alias": null,
443
+ "jsdoc": null
444
+ },
445
+ {
446
+ "name": "block",
447
+ "type": "boolean",
448
+ "default": "false",
449
+ "required": false,
450
+ "transform": "booleanAttribute",
451
+ "alias": null,
452
+ "jsdoc": "Full-width button."
453
+ },
454
+ {
455
+ "name": "iconOnly",
456
+ "type": "boolean",
457
+ "default": "false",
458
+ "required": false,
459
+ "transform": "booleanAttribute",
460
+ "alias": null,
461
+ "jsdoc": "Square icon-only button (provide [ariaLabel] for accessibility)."
462
+ },
463
+ {
464
+ "name": "ariaLabel",
465
+ "type": "string | null",
466
+ "default": "null",
467
+ "required": false,
468
+ "transform": null,
469
+ "alias": null,
470
+ "jsdoc": null
471
+ }
472
+ ],
473
+ "outputs": [],
474
+ "exportedTypes": [
475
+ {
476
+ "name": "SdsButtonVariant",
477
+ "kind": "union",
478
+ "body": "| 'primary' | 'secondary' | 'tertiary' | 'ghost' | 'danger'"
479
+ },
480
+ {
481
+ "name": "SdsButtonSize",
482
+ "kind": "union",
483
+ "body": "'sm' | 'md' | 'lg'"
484
+ }
485
+ ],
486
+ "projectionSlots": [
487
+ "[sdsIconLeading]",
488
+ "[sdsIconTrailing]"
489
+ ],
490
+ "hostBindings": {
491
+ "[class]": "hostClass()",
492
+ "[attr.aria-disabled]": "(disabled() || loading()) ? \"true\" : null",
493
+ "[style.pointer-events]": "(disabled() || loading()) ? \"none\" : null",
494
+ "(click)": "onHostClick($event)"
495
+ },
496
+ "examples": [
497
+ {
498
+ "sectionTitle": "Variantes",
499
+ "sectionDescription": null,
500
+ "code": "<sds-button variant=\"primary\">Primary</sds-button>\n<sds-button variant=\"secondary\">Secondary</sds-button>\n<sds-button variant=\"tertiary\">Tertiary</sds-button>\n<sds-button variant=\"ghost\">Ghost</sds-button>\n<sds-button variant=\"danger\">Danger</sds-button>",
501
+ "runnableExample": "<sds-button variant=\"primary\">Primary</sds-button>\n <sds-button variant=\"secondary\">Secondary</sds-button>\n <sds-button variant=\"tertiary\">Tertiary</sds-button>\n <sds-button variant=\"ghost\">Ghost</sds-button>\n <sds-button variant=\"danger\">Danger</sds-button>",
502
+ "stack": false,
503
+ "dark": false
504
+ },
505
+ {
506
+ "sectionTitle": "Tailles",
507
+ "sectionDescription": null,
508
+ "code": "<sds-button size=\"sm\">Small</sds-button>\n<sds-button size=\"md\">Medium</sds-button>\n<sds-button size=\"lg\">Large</sds-button>",
509
+ "runnableExample": "<sds-button size=\"sm\">Small</sds-button>\n <sds-button size=\"md\">Medium</sds-button>\n <sds-button size=\"lg\">Large</sds-button>",
510
+ "stack": false,
511
+ "dark": false
512
+ },
513
+ {
514
+ "sectionTitle": "États",
515
+ "sectionDescription": null,
516
+ "code": "<sds-button disabled>Désactivé</sds-button>\n<sds-button loading>Chargement</sds-button>",
517
+ "runnableExample": "<sds-button disabled>Désactivé</sds-button>\n <sds-button loading>Chargement</sds-button>",
518
+ "stack": false,
519
+ "dark": false
520
+ },
521
+ {
522
+ "sectionTitle": "Avec icônes",
523
+ "sectionDescription": null,
524
+ "code": "<sds-button variant=\"primary\">\n <sds-icon sdsIconLeading name=\"user-plus\" [size]=\"18\" />\n Créer un membre\n</sds-button>\n\n<sds-button variant=\"secondary\">\n Suivant\n <sds-icon sdsIconTrailing name=\"chevron-right\" [size]=\"18\" />\n</sds-button>",
525
+ "runnableExample": "<sds-button variant=\"primary\">\n <sds-icon sdsIconLeading name=\"user-plus\" [size]=\"18\" />\n Créer un membre\n </sds-button>\n <sds-button variant=\"secondary\">\n Suivant\n <sds-icon sdsIconTrailing name=\"chevron-right\" [size]=\"18\" />\n </sds-button>",
526
+ "stack": false,
527
+ "dark": false
528
+ },
529
+ {
530
+ "sectionTitle": "Bouton icône seul",
531
+ "sectionDescription": "Fournissez ariaLabel pour l'accessibilité.",
532
+ "code": "<sds-button iconOnly ariaLabel=\"Paramètres\" variant=\"secondary\">\n <sds-icon sdsIconLeading name=\"settings\" [size]=\"18\" />\n</sds-button>",
533
+ "runnableExample": "<sds-button iconOnly ariaLabel=\"Paramètres\" variant=\"secondary\">\n <sds-icon sdsIconLeading name=\"settings\" [size]=\"18\" />\n </sds-button>\n <sds-button iconOnly ariaLabel=\"Rechercher\" variant=\"ghost\">\n <sds-icon sdsIconLeading name=\"search\" [size]=\"18\" />\n </sds-button>",
534
+ "stack": false,
535
+ "dark": false
536
+ },
537
+ {
538
+ "sectionTitle": "Pleine largeur",
539
+ "sectionDescription": null,
540
+ "code": "<sds-button block variant=\"primary\">Enregistrer</sds-button>",
541
+ "runnableExample": "<sds-button block variant=\"primary\">Enregistrer</sds-button>",
542
+ "stack": true,
543
+ "dark": false
544
+ }
545
+ ]
546
+ },
547
+ {
548
+ "className": "SdsCalendar",
549
+ "selector": "sds-calendar",
550
+ "kind": "component",
551
+ "group": "form",
552
+ "importName": "SdsCalendar",
553
+ "description": null,
554
+ "overviewDescription": null,
555
+ "jsdoc": "Inline month calendar with day → month → year drill-down navigation,\nmin/max bounds and keyboard support. Used standalone (inline) or inside\n<sds-date-picker>.",
556
+ "example": null,
557
+ "cva": false,
558
+ "usesNgModel": false,
559
+ "inputs": [
560
+ {
561
+ "name": "value",
562
+ "type": "Date | null",
563
+ "default": "null",
564
+ "required": false,
565
+ "transform": null,
566
+ "alias": null,
567
+ "jsdoc": null
568
+ },
569
+ {
570
+ "name": "min",
571
+ "type": "Date | null",
572
+ "default": "null",
573
+ "required": false,
574
+ "transform": null,
575
+ "alias": null,
576
+ "jsdoc": null
577
+ },
578
+ {
579
+ "name": "max",
580
+ "type": "Date | null",
581
+ "default": "null",
582
+ "required": false,
583
+ "transform": null,
584
+ "alias": null,
585
+ "jsdoc": null
586
+ },
587
+ {
588
+ "name": "firstDayOfWeek",
589
+ "type": "0 | 1",
590
+ "default": "1",
591
+ "required": false,
592
+ "transform": null,
593
+ "alias": null,
594
+ "jsdoc": "0 = Sunday, 1 = Monday (default, European)."
595
+ },
596
+ {
597
+ "name": "locale",
598
+ "type": "string",
599
+ "default": "'fr-FR'",
600
+ "required": false,
601
+ "transform": null,
602
+ "alias": null,
603
+ "jsdoc": null
604
+ },
605
+ {
606
+ "name": "showActions",
607
+ "type": "boolean",
608
+ "default": "true",
609
+ "required": false,
610
+ "transform": null,
611
+ "alias": null,
612
+ "jsdoc": null
613
+ }
614
+ ],
615
+ "outputs": [
616
+ {
617
+ "name": "valueChange",
618
+ "type": "Date | null",
619
+ "fromModel": true
620
+ },
621
+ {
622
+ "name": "dateSelect",
623
+ "type": "Date",
624
+ "fromModel": false
625
+ }
626
+ ],
627
+ "exportedTypes": [],
628
+ "projectionSlots": [],
629
+ "hostBindings": {
630
+ "class": "block"
631
+ },
632
+ "examples": []
633
+ },
634
+ {
635
+ "className": "SdsCard",
636
+ "selector": "sds-card",
637
+ "kind": "component",
638
+ "group": "primitive",
639
+ "importName": "SdsCard",
640
+ "description": "Conteneur de surface générique avec variantes, padding configurable et affordance interactive au survol.",
641
+ "overviewDescription": "Conteneurs de surface : élevé, contour, subtil.",
642
+ "jsdoc": "Generic surface container. Set [interactive]=\"true\" for hover affordance\n(used by the dashboard action cards).",
643
+ "example": null,
644
+ "cva": false,
645
+ "usesNgModel": false,
646
+ "inputs": [
647
+ {
648
+ "name": "variant",
649
+ "type": "SdsCardVariant",
650
+ "default": "'elevated'",
651
+ "required": false,
652
+ "transform": null,
653
+ "alias": null,
654
+ "jsdoc": null
655
+ },
656
+ {
657
+ "name": "padding",
658
+ "type": "string",
659
+ "default": "'p-5'",
660
+ "required": false,
661
+ "transform": null,
662
+ "alias": null,
663
+ "jsdoc": "Inner padding utility (override with e.g. \"p-4\")."
664
+ },
665
+ {
666
+ "name": "interactive",
667
+ "type": "boolean",
668
+ "default": "false",
669
+ "required": false,
670
+ "transform": "booleanAttribute",
671
+ "alias": null,
672
+ "jsdoc": null
673
+ }
674
+ ],
675
+ "outputs": [],
676
+ "exportedTypes": [
677
+ {
678
+ "name": "SdsCardVariant",
679
+ "kind": "union",
680
+ "body": "'elevated' | 'outlined' | 'subtle'"
681
+ }
682
+ ],
683
+ "projectionSlots": [],
684
+ "hostBindings": {
685
+ "[class]": "hostClass()"
686
+ },
687
+ "examples": [
688
+ {
689
+ "sectionTitle": "Variantes",
690
+ "sectionDescription": null,
691
+ "code": "<sds-card variant=\"elevated\">\n <div class=\"text-ink font-semibold\">Effectif du service</div>\n <div class=\"text-sm text-ink-soft\">\n 24 soignants planifiés aujourd'hui sur l'unité de cardiologie.\n </div>\n</sds-card>\n<sds-card variant=\"outlined\">\n <div class=\"text-ink font-semibold\">Demandes de congés</div>\n <div class=\"text-sm text-ink-soft\">\n 3 demandes en attente de validation par le cadre de santé.\n </div>\n</sds-card>\n<sds-card variant=\"subtle\">\n <div class=\"text-ink font-semibold\">Heures supplémentaires</div>\n <div class=\"text-sm text-ink-soft\">\n Total cumulé de 18 h sur la semaine pour l'équipe de nuit.\n </div>\n</sds-card>",
692
+ "runnableExample": "<sds-card variant=\"elevated\">\n <div class=\"text-ink font-semibold\">Effectif du service</div>\n <div class=\"text-sm text-ink-soft\">\n 24 soignants planifiés aujourd'hui sur l'unité de cardiologie.\n </div>\n </sds-card>\n <sds-card variant=\"outlined\">\n <div class=\"text-ink font-semibold\">Demandes de congés</div>\n <div class=\"text-sm text-ink-soft\">\n 3 demandes en attente de validation par le cadre de santé.\n </div>\n </sds-card>\n <sds-card variant=\"subtle\">\n <div class=\"text-ink font-semibold\">Heures supplémentaires</div>\n <div class=\"text-sm text-ink-soft\">\n Total cumulé de 18 h sur la semaine pour l'équipe de nuit.\n </div>\n </sds-card>",
693
+ "stack": true,
694
+ "dark": false
695
+ },
696
+ {
697
+ "sectionTitle": "Interactif",
698
+ "sectionDescription": null,
699
+ "code": "<sds-card interactive>\n <div class=\"text-ink font-semibold\">Planifier une garde</div>\n <div class=\"text-sm text-ink-soft\">\n Survolez cette carte pour afficher l'affordance de clic, puis ouvrez le planning du service.\n </div>\n</sds-card>",
700
+ "runnableExample": "<sds-card interactive>\n <div class=\"text-ink font-semibold\">Planifier une garde</div>\n <div class=\"text-sm text-ink-soft\">\n Survolez cette carte pour afficher l'affordance de clic, puis ouvrez le planning du service.\n </div>\n </sds-card>",
701
+ "stack": true,
702
+ "dark": false
703
+ },
704
+ {
705
+ "sectionTitle": "Padding personnalisé",
706
+ "sectionDescription": null,
707
+ "code": "<sds-card variant=\"outlined\" padding=\"p-8\">\n <div class=\"text-ink font-semibold\">Note du cadre de santé</div>\n <div class=\"text-sm text-ink-soft\">\n Espacement intérieur élargi (p-8) pour les contenus mis en avant.\n </div>\n</sds-card>",
708
+ "runnableExample": "<sds-card variant=\"outlined\" padding=\"p-8\">\n <div class=\"text-ink font-semibold\">Note du cadre de santé</div>\n <div class=\"text-sm text-ink-soft\">\n Espacement intérieur élargi (p-8) pour les contenus mis en avant.\n </div>\n </sds-card>",
709
+ "stack": true,
710
+ "dark": false
711
+ }
712
+ ]
713
+ },
714
+ {
715
+ "className": "SdsCheckbox",
716
+ "selector": "sds-checkbox",
717
+ "kind": "component",
718
+ "group": "form",
719
+ "importName": "SdsCheckbox",
720
+ "description": null,
721
+ "overviewDescription": null,
722
+ "jsdoc": "Boolean checkbox. Implements ControlValueAccessor — use with reactive forms\nor `[(ngModel)]`. Renders a styled box (brand-filled with a check when on)\nand an optional inline label.",
723
+ "example": "<sds-checkbox label=\"Fusion automatique\" [(ngModel)]=\"autoMerge\" />",
724
+ "cva": true,
725
+ "usesNgModel": true,
726
+ "inputs": [
727
+ {
728
+ "name": "label",
729
+ "type": "string",
730
+ "default": "''",
731
+ "required": false,
732
+ "transform": null,
733
+ "alias": null,
734
+ "jsdoc": null
735
+ },
736
+ {
737
+ "name": "ariaLabel",
738
+ "type": "string",
739
+ "default": "''",
740
+ "required": false,
741
+ "transform": null,
742
+ "alias": null,
743
+ "jsdoc": "Accessible name used when no visible [label] is provided."
744
+ },
745
+ {
746
+ "name": "size",
747
+ "type": "SdsCheckboxSize",
748
+ "default": "'md'",
749
+ "required": false,
750
+ "transform": null,
751
+ "alias": null,
752
+ "jsdoc": null
753
+ },
754
+ {
755
+ "name": "disabled",
756
+ "type": "boolean",
757
+ "default": "false",
758
+ "required": false,
759
+ "transform": "booleanAttribute",
760
+ "alias": null,
761
+ "jsdoc": null
762
+ }
763
+ ],
764
+ "outputs": [],
765
+ "exportedTypes": [
766
+ {
767
+ "name": "SdsCheckboxSize",
768
+ "kind": "union",
769
+ "body": "'sm' | 'md'"
770
+ }
771
+ ],
772
+ "projectionSlots": [],
773
+ "hostBindings": {
774
+ "class": "inline-flex"
775
+ },
776
+ "examples": []
777
+ },
778
+ {
779
+ "className": "SdsDatePicker",
780
+ "selector": "sds-date-picker",
781
+ "kind": "component",
782
+ "group": "form",
783
+ "importName": "SdsDatePicker",
784
+ "description": "Sélecteur de date : champ avec calendrier en surimpression (navigation jour → mois → année), ou calendrier en ligne. Bornes min/max, effacement, et support clavier. Implémente ControlValueAccessor (valeur Date | null).",
785
+ "overviewDescription": "Sélecteur de date avec calendrier, bornes et mode inline.",
786
+ "jsdoc": "Date picker: a read-only field that opens a calendar overlay, or an inline\ncalendar. Implements ControlValueAccessor — use with reactive forms or\n[(ngModel)]; the value is a `Date | null`.",
787
+ "example": "<sds-date-picker label=\"Date de garde\" [(ngModel)]=\"date\" />",
788
+ "cva": true,
789
+ "usesNgModel": true,
790
+ "inputs": [
791
+ {
792
+ "name": "label",
793
+ "type": "string",
794
+ "default": "''",
795
+ "required": false,
796
+ "transform": null,
797
+ "alias": null,
798
+ "jsdoc": null
799
+ },
800
+ {
801
+ "name": "ariaLabel",
802
+ "type": "string",
803
+ "default": "''",
804
+ "required": false,
805
+ "transform": null,
806
+ "alias": null,
807
+ "jsdoc": null
808
+ },
809
+ {
810
+ "name": "placeholder",
811
+ "type": "string",
812
+ "default": "'jj/mm/aaaa'",
813
+ "required": false,
814
+ "transform": null,
815
+ "alias": null,
816
+ "jsdoc": null
817
+ },
818
+ {
819
+ "name": "hint",
820
+ "type": "string",
821
+ "default": "''",
822
+ "required": false,
823
+ "transform": null,
824
+ "alias": null,
825
+ "jsdoc": null
826
+ },
827
+ {
828
+ "name": "error",
829
+ "type": "string",
830
+ "default": "''",
831
+ "required": false,
832
+ "transform": null,
833
+ "alias": null,
834
+ "jsdoc": null
835
+ },
836
+ {
837
+ "name": "size",
838
+ "type": "SdsDatePickerSize",
839
+ "default": "'md'",
840
+ "required": false,
841
+ "transform": null,
842
+ "alias": null,
843
+ "jsdoc": null
844
+ },
845
+ {
846
+ "name": "min",
847
+ "type": "Date | null",
848
+ "default": "null",
849
+ "required": false,
850
+ "transform": null,
851
+ "alias": null,
852
+ "jsdoc": null
853
+ },
854
+ {
855
+ "name": "max",
856
+ "type": "Date | null",
857
+ "default": "null",
858
+ "required": false,
859
+ "transform": null,
860
+ "alias": null,
861
+ "jsdoc": null
862
+ },
863
+ {
864
+ "name": "firstDayOfWeek",
865
+ "type": "0 | 1",
866
+ "default": "1",
867
+ "required": false,
868
+ "transform": null,
869
+ "alias": null,
870
+ "jsdoc": null
871
+ },
872
+ {
873
+ "name": "locale",
874
+ "type": "string",
875
+ "default": "'fr-FR'",
876
+ "required": false,
877
+ "transform": null,
878
+ "alias": null,
879
+ "jsdoc": null
880
+ },
881
+ {
882
+ "name": "inline",
883
+ "type": "boolean",
884
+ "default": "false",
885
+ "required": false,
886
+ "transform": "booleanAttribute",
887
+ "alias": null,
888
+ "jsdoc": null
889
+ },
890
+ {
891
+ "name": "clearable",
892
+ "type": "boolean",
893
+ "default": "true",
894
+ "required": false,
895
+ "transform": "booleanAttribute",
896
+ "alias": null,
897
+ "jsdoc": null
898
+ },
899
+ {
900
+ "name": "showActions",
901
+ "type": "boolean",
902
+ "default": "true",
903
+ "required": false,
904
+ "transform": "booleanAttribute",
905
+ "alias": null,
906
+ "jsdoc": null
907
+ },
908
+ {
909
+ "name": "disabled",
910
+ "type": "boolean",
911
+ "default": "false",
912
+ "required": false,
913
+ "transform": "booleanAttribute",
914
+ "alias": null,
915
+ "jsdoc": null
916
+ },
917
+ {
918
+ "name": "format",
919
+ "type": "(d: Date) => string",
920
+ "default": "formatDdMmYyyy",
921
+ "required": false,
922
+ "transform": null,
923
+ "alias": null,
924
+ "jsdoc": "Custom display formatter (default dd/MM/yyyy)."
925
+ }
926
+ ],
927
+ "outputs": [],
928
+ "exportedTypes": [
929
+ {
930
+ "name": "SdsDatePickerSize",
931
+ "kind": "union",
932
+ "body": "'sm' | 'md' | 'lg'"
933
+ }
934
+ ],
935
+ "projectionSlots": [],
936
+ "hostBindings": {
937
+ "class": "block",
938
+ "(document:click)": "onDocumentClick($event)",
939
+ "(keydown.escape)": "close(true)"
940
+ },
941
+ "examples": [
942
+ {
943
+ "sectionTitle": "Basique",
944
+ "sectionDescription": null,
945
+ "code": "<sds-date-picker label=\"Date de garde\" placeholder=\"jj/mm/aaaa\" />",
946
+ "runnableExample": "<sds-date-picker label=\"Date de garde\" placeholder=\"jj/mm/aaaa\" />",
947
+ "stack": true,
948
+ "dark": false
949
+ },
950
+ {
951
+ "sectionTitle": "Lié au formulaire (ngModel)",
952
+ "sectionDescription": "La valeur est un objet Date.",
953
+ "code": "<sds-date-picker label=\"Date de garde\" [(ngModel)]=\"date\" />\n<p>Sélection : {{ date ? display(date) : '—' }}</p>\n\n// date: Date | null = null;",
954
+ "runnableExample": "<sds-date-picker label=\"Date de garde\" [(ngModel)]=\"date\" />\n <p class=\"text-sm text-ink-soft\">\n Sélection : <span class=\"font-medium text-ink\">{{ date ? display(date) : '—' }}</span>\n </p>",
955
+ "stack": true,
956
+ "dark": false
957
+ },
958
+ {
959
+ "sectionTitle": "Bornes (min / max)",
960
+ "sectionDescription": "Les dates hors de l'intervalle sont désactivées.",
961
+ "code": "<sds-date-picker label=\"Dans les 45 prochains jours\" [min]=\"min\" [max]=\"max\" />\n\n// min = new Date(); // aujourd'hui\n// max = new Date(); max.setDate(max.getDate() + 45);",
962
+ "runnableExample": "<sds-date-picker label=\"Dans les 45 prochains jours\" [min]=\"min\" [max]=\"max\" />",
963
+ "stack": true,
964
+ "dark": false
965
+ },
966
+ {
967
+ "sectionTitle": "Calendrier en ligne (inline)",
968
+ "sectionDescription": null,
969
+ "code": "<sds-date-picker inline [(ngModel)]=\"date2\" />",
970
+ "runnableExample": "<sds-date-picker inline [(ngModel)]=\"date2\" />",
971
+ "stack": true,
972
+ "dark": false
973
+ },
974
+ {
975
+ "sectionTitle": "Désactivé",
976
+ "sectionDescription": null,
977
+ "code": "<sds-date-picker label=\"Indisponible\" disabled />",
978
+ "runnableExample": "<sds-date-picker label=\"Indisponible\" disabled />",
979
+ "stack": true,
980
+ "dark": false
981
+ }
982
+ ]
983
+ },
984
+ {
985
+ "className": "SdsIcon",
986
+ "selector": "sds-icon",
987
+ "kind": "component",
988
+ "group": "primitive",
989
+ "importName": "SdsIcon",
990
+ "description": "Icône SVG vectorielle issue d'un registre interne, avec taille et épaisseur de trait ajustables.",
991
+ "overviewDescription": "Bibliothèque d'icônes SVG intégrée.",
992
+ "jsdoc": "Inline SVG icon backed by a curated, dependency-free registry.",
993
+ "example": "<sds-icon name=\"search\" />\n<sds-icon name=\"home\" [size]=\"18\" />",
994
+ "cva": false,
995
+ "usesNgModel": false,
996
+ "inputs": [
997
+ {
998
+ "name": "name",
999
+ "type": "SdsIconName",
1000
+ "default": null,
1001
+ "required": true,
1002
+ "transform": null,
1003
+ "alias": null,
1004
+ "jsdoc": "Icon identifier from the registry."
1005
+ },
1006
+ {
1007
+ "name": "size",
1008
+ "type": "number | string",
1009
+ "default": "20",
1010
+ "required": false,
1011
+ "transform": "toIconPx",
1012
+ "alias": null,
1013
+ "jsdoc": "Square size: a pixel number, a numeric string, or a keyword (sm·md·lg·xl)."
1014
+ },
1015
+ {
1016
+ "name": "strokeWidth",
1017
+ "type": "number",
1018
+ "default": "2",
1019
+ "required": false,
1020
+ "transform": null,
1021
+ "alias": null,
1022
+ "jsdoc": "Stroke width of the line icon."
1023
+ }
1024
+ ],
1025
+ "outputs": [],
1026
+ "exportedTypes": [
1027
+ {
1028
+ "name": "SdsIconSize",
1029
+ "kind": "union",
1030
+ "body": "'sm' | 'md' | 'lg' | 'xl'"
1031
+ }
1032
+ ],
1033
+ "projectionSlots": [],
1034
+ "hostBindings": {
1035
+ "class": "sds-icon inline-flex shrink-0 items-center justify-center",
1036
+ "[style.width.px]": "size()",
1037
+ "[style.height.px]": "size()",
1038
+ "[innerHTML]": "svg()",
1039
+ "[attr.aria-hidden]": "\"true\""
1040
+ },
1041
+ "examples": [
1042
+ {
1043
+ "sectionTitle": "Usage",
1044
+ "sectionDescription": null,
1045
+ "code": "<sds-icon name=\"home\" />\n<sds-icon name=\"search\" />\n<sds-icon name=\"user-plus\" />\n<sds-icon name=\"bell\" />",
1046
+ "runnableExample": "<sds-icon name=\"home\" />\n <sds-icon name=\"search\" />\n <sds-icon name=\"user-plus\" />\n <sds-icon name=\"bell\" />",
1047
+ "stack": false,
1048
+ "dark": false
1049
+ },
1050
+ {
1051
+ "sectionTitle": "Tailles",
1052
+ "sectionDescription": null,
1053
+ "code": "<sds-icon name=\"calendar\" [size]=\"16\" />\n<sds-icon name=\"calendar\" [size]=\"20\" />\n<sds-icon name=\"calendar\" [size]=\"24\" />\n<sds-icon name=\"calendar\" [size]=\"32\" />",
1054
+ "runnableExample": "<sds-icon name=\"calendar\" [size]=\"16\" />\n <sds-icon name=\"calendar\" [size]=\"20\" />\n <sds-icon name=\"calendar\" [size]=\"24\" />\n <sds-icon name=\"calendar\" [size]=\"32\" />",
1055
+ "stack": false,
1056
+ "dark": false
1057
+ },
1058
+ {
1059
+ "sectionTitle": "Épaisseur du trait",
1060
+ "sectionDescription": null,
1061
+ "code": "<sds-icon name=\"users\" [strokeWidth]=\"1\" />\n<sds-icon name=\"users\" [strokeWidth]=\"1.5\" />\n<sds-icon name=\"users\" [strokeWidth]=\"2\" />\n<sds-icon name=\"users\" [strokeWidth]=\"2.5\" />",
1062
+ "runnableExample": "<sds-icon name=\"users\" [strokeWidth]=\"1\" />\n <sds-icon name=\"users\" [strokeWidth]=\"1.5\" />\n <sds-icon name=\"users\" [strokeWidth]=\"2\" />\n <sds-icon name=\"users\" [strokeWidth]=\"2.5\" />",
1063
+ "stack": false,
1064
+ "dark": false
1065
+ }
1066
+ ]
1067
+ },
1068
+ {
1069
+ "className": "SdsInput",
1070
+ "selector": "sds-input",
1071
+ "kind": "component",
1072
+ "group": "form",
1073
+ "importName": "SdsInput",
1074
+ "description": "Champ de saisie avec label, aide, erreur, tailles, icônes et bouton d'effacement. Implémente ControlValueAccessor.",
1075
+ "overviewDescription": "Champs de saisie avec label, aide, erreur et icônes.",
1076
+ "jsdoc": "Text input with label, hint/error, optional leading/trailing icons and a\nclear button. Implements ControlValueAccessor — use with reactive forms or\n[(ngModel)]. The `on-brand` appearance is tuned for dark surfaces (e.g. the\nsidebar search field).",
1077
+ "example": null,
1078
+ "cva": true,
1079
+ "usesNgModel": true,
1080
+ "inputs": [
1081
+ {
1082
+ "name": "label",
1083
+ "type": "string",
1084
+ "default": "''",
1085
+ "required": false,
1086
+ "transform": null,
1087
+ "alias": null,
1088
+ "jsdoc": null
1089
+ },
1090
+ {
1091
+ "name": "ariaLabel",
1092
+ "type": "string",
1093
+ "default": "''",
1094
+ "required": false,
1095
+ "transform": null,
1096
+ "alias": null,
1097
+ "jsdoc": "Accessible name used when no visible [label] is provided."
1098
+ },
1099
+ {
1100
+ "name": "placeholder",
1101
+ "type": "string",
1102
+ "default": "''",
1103
+ "required": false,
1104
+ "transform": null,
1105
+ "alias": null,
1106
+ "jsdoc": null
1107
+ },
1108
+ {
1109
+ "name": "hint",
1110
+ "type": "string",
1111
+ "default": "''",
1112
+ "required": false,
1113
+ "transform": null,
1114
+ "alias": null,
1115
+ "jsdoc": null
1116
+ },
1117
+ {
1118
+ "name": "error",
1119
+ "type": "string",
1120
+ "default": "''",
1121
+ "required": false,
1122
+ "transform": null,
1123
+ "alias": null,
1124
+ "jsdoc": null
1125
+ },
1126
+ {
1127
+ "name": "type",
1128
+ "type": "SdsInputType",
1129
+ "default": "'text'",
1130
+ "required": false,
1131
+ "transform": null,
1132
+ "alias": null,
1133
+ "jsdoc": "`search` is the semantically right type for a search field, and the template strips the WebKit\nsearch decorations that come with it. Without that, a `search` field with {@link clearable} draws\nTWO clear buttons — the component's and the browser's own, which no stylesheet can reach and which\nsits outside the field's own padding."
1134
+ },
1135
+ {
1136
+ "name": "size",
1137
+ "type": "SdsInputSize",
1138
+ "default": "'md'",
1139
+ "required": false,
1140
+ "transform": null,
1141
+ "alias": null,
1142
+ "jsdoc": null
1143
+ },
1144
+ {
1145
+ "name": "appearance",
1146
+ "type": "SdsInputAppearance",
1147
+ "default": "'default'",
1148
+ "required": false,
1149
+ "transform": null,
1150
+ "alias": null,
1151
+ "jsdoc": "`filled` is a borderless field on a muted ground, for a search box that has to sit inside a page\nrather than announce itself as a form control — a storefront's search pill above all.\n`on-brand` is the same field tuned for a dark surface."
1152
+ },
1153
+ {
1154
+ "name": "shape",
1155
+ "type": "SdsInputShape",
1156
+ "default": "'control'",
1157
+ "required": false,
1158
+ "transform": null,
1159
+ "alias": null,
1160
+ "jsdoc": "`pill` fully rounds the field. Separate from {@link appearance} on purpose: a bordered pill and a\nfilled box are both real designs, and folding the two axes into one enum would forbid half of them."
1161
+ },
1162
+ {
1163
+ "name": "disabled",
1164
+ "type": "boolean",
1165
+ "default": "false",
1166
+ "required": false,
1167
+ "transform": "booleanAttribute",
1168
+ "alias": null,
1169
+ "jsdoc": null
1170
+ },
1171
+ {
1172
+ "name": "clearable",
1173
+ "type": "boolean",
1174
+ "default": "false",
1175
+ "required": false,
1176
+ "transform": "booleanAttribute",
1177
+ "alias": null,
1178
+ "jsdoc": null
1179
+ },
1180
+ {
1181
+ "name": "clearLabel",
1182
+ "type": "string",
1183
+ "default": "'Effacer'",
1184
+ "required": false,
1185
+ "transform": null,
1186
+ "alias": null,
1187
+ "jsdoc": "Accessible name for the clear button. French default so existing consumers are unchanged, but an\napp serving more than one language MUST translate it — it is an icon-only control, so this string\nis its only name."
1188
+ },
1189
+ {
1190
+ "name": "leadingIcon",
1191
+ "type": "SdsIconName | null",
1192
+ "default": "null",
1193
+ "required": false,
1194
+ "transform": null,
1195
+ "alias": null,
1196
+ "jsdoc": null
1197
+ },
1198
+ {
1199
+ "name": "trailingIcon",
1200
+ "type": "SdsIconName | null",
1201
+ "default": "null",
1202
+ "required": false,
1203
+ "transform": null,
1204
+ "alias": null,
1205
+ "jsdoc": null
1206
+ },
1207
+ {
1208
+ "name": "trailingAction",
1209
+ "type": "SdsIconName | null",
1210
+ "default": "null",
1211
+ "required": false,
1212
+ "transform": null,
1213
+ "alias": null,
1214
+ "jsdoc": "A CLICKABLE trailing icon, for the affordances that belong to the field itself — password reveal\nabove all. Distinct from {@link trailingIcon}, which is decorative and explicitly\n`pointer-events-none`; a consumer who needed a working control previously had to abandon\n`sds-input` and rebuild the whole field, losing the label/error/aria wiring with it.\n\nAlways pair it with {@link trailingActionLabel} — an icon-only button with no accessible name is\nunusable by a screen reader. For a toggle, also bind {@link trailingActionPressed}."
1215
+ },
1216
+ {
1217
+ "name": "trailingActionLabel",
1218
+ "type": "string",
1219
+ "default": "''",
1220
+ "required": false,
1221
+ "transform": null,
1222
+ "alias": null,
1223
+ "jsdoc": "Accessible name for {@link trailingAction}. Translate it in the consuming app."
1224
+ },
1225
+ {
1226
+ "name": "trailingActionPressed",
1227
+ "type": "boolean | null",
1228
+ "default": "null",
1229
+ "required": false,
1230
+ "transform": null,
1231
+ "alias": null,
1232
+ "jsdoc": "`aria-pressed` for a toggling action (e.g. show/hide password). Null renders no attribute."
1233
+ }
1234
+ ],
1235
+ "outputs": [
1236
+ {
1237
+ "name": "trailingActionClick",
1238
+ "type": "void",
1239
+ "fromModel": false
1240
+ }
1241
+ ],
1242
+ "exportedTypes": [
1243
+ {
1244
+ "name": "SdsInputSize",
1245
+ "kind": "union",
1246
+ "body": "'sm' | 'md' | 'lg'"
1247
+ },
1248
+ {
1249
+ "name": "SdsInputAppearance",
1250
+ "kind": "union",
1251
+ "body": "'default' | 'filled' | 'on-brand'"
1252
+ },
1253
+ {
1254
+ "name": "SdsInputShape",
1255
+ "kind": "union",
1256
+ "body": "'control' | 'pill'"
1257
+ },
1258
+ {
1259
+ "name": "SdsInputType",
1260
+ "kind": "union",
1261
+ "body": "| 'text' | 'email' | 'password' | 'number' | 'tel' | 'search' | 'url'"
1262
+ }
1263
+ ],
1264
+ "projectionSlots": [],
1265
+ "hostBindings": {
1266
+ "class": "block"
1267
+ },
1268
+ "examples": [
1269
+ {
1270
+ "sectionTitle": "Basique",
1271
+ "sectionDescription": null,
1272
+ "code": "<sds-input label=\"Nom du soignant\" placeholder=\"Ex. Marie Dupont\" />",
1273
+ "runnableExample": "<sds-input label=\"Nom du soignant\" placeholder=\"Ex. Marie Dupont\" />",
1274
+ "stack": true,
1275
+ "dark": false
1276
+ },
1277
+ {
1278
+ "sectionTitle": "Avec aide",
1279
+ "sectionDescription": null,
1280
+ "code": "<sds-input\n label=\"Matricule\"\n placeholder=\"Ex. STK-04821\"\n hint=\"Identifiant interne figurant sur le badge.\"\n/>",
1281
+ "runnableExample": "<sds-input\n label=\"Matricule\"\n placeholder=\"Ex. STK-04821\"\n hint=\"Identifiant interne figurant sur le badge.\"\n />",
1282
+ "stack": true,
1283
+ "dark": false
1284
+ },
1285
+ {
1286
+ "sectionTitle": "Erreur",
1287
+ "sectionDescription": null,
1288
+ "code": "<sds-input\n label=\"Adresse email\"\n type=\"email\"\n placeholder=\"prenom.nom@chu.fr\"\n [error]=\"'Adresse email requise.'\"\n/>",
1289
+ "runnableExample": "<sds-input\n label=\"Adresse email\"\n type=\"email\"\n placeholder=\"prenom.nom@chu.fr\"\n [error]=\"'Adresse email requise.'\"\n />",
1290
+ "stack": true,
1291
+ "dark": false
1292
+ },
1293
+ {
1294
+ "sectionTitle": "Icônes",
1295
+ "sectionDescription": null,
1296
+ "code": "<sds-input\n label=\"Rechercher un agent\"\n placeholder=\"Nom, service, matricule…\"\n leadingIcon=\"search\"\n/>\n<sds-input\n label=\"Date de garde\"\n placeholder=\"JJ/MM/AAAA\"\n trailingIcon=\"calendar\"\n/>\n<sds-input\n label=\"Filtrer le planning\"\n placeholder=\"Filtrer…\"\n clearable\n [(ngModel)]=\"query\"\n/>",
1297
+ "runnableExample": "<sds-input\n label=\"Rechercher un agent\"\n placeholder=\"Nom, service, matricule…\"\n leadingIcon=\"search\"\n />\n <sds-input\n label=\"Date de garde\"\n placeholder=\"JJ/MM/AAAA\"\n trailingIcon=\"calendar\"\n />\n <sds-input\n label=\"Filtrer le planning\"\n placeholder=\"Filtrer…\"\n clearable\n [(ngModel)]=\"query\"\n />",
1298
+ "stack": true,
1299
+ "dark": false
1300
+ },
1301
+ {
1302
+ "sectionTitle": "Tailles",
1303
+ "sectionDescription": null,
1304
+ "code": "<sds-input size=\"sm\" label=\"Petit (sm)\" placeholder=\"Service\" />\n<sds-input size=\"md\" label=\"Moyen (md)\" placeholder=\"Service\" />\n<sds-input size=\"lg\" label=\"Grand (lg)\" placeholder=\"Service\" />",
1305
+ "runnableExample": "<sds-input size=\"sm\" label=\"Petit (sm)\" placeholder=\"Service\" />\n <sds-input size=\"md\" label=\"Moyen (md)\" placeholder=\"Service\" />\n <sds-input size=\"lg\" label=\"Grand (lg)\" placeholder=\"Service\" />",
1306
+ "stack": true,
1307
+ "dark": false
1308
+ },
1309
+ {
1310
+ "sectionTitle": "Désactivé",
1311
+ "sectionDescription": null,
1312
+ "code": "<sds-input\n label=\"Établissement\"\n placeholder=\"CHU de Lille\"\n disabled\n/>",
1313
+ "runnableExample": "<sds-input\n label=\"Établissement\"\n placeholder=\"CHU de Lille\"\n disabled\n />",
1314
+ "stack": true,
1315
+ "dark": false
1316
+ },
1317
+ {
1318
+ "sectionTitle": "Sur fond foncé (on-brand)",
1319
+ "sectionDescription": null,
1320
+ "code": "<sds-input\n appearance=\"on-brand\"\n ariaLabel=\"Rechercher dans WebApp\"\n placeholder=\"Rechercher…\"\n trailingIcon=\"search\"\n/>\n<sds-input\n appearance=\"on-brand\"\n label=\"Code d'accès\"\n placeholder=\"••••••\"\n/>",
1321
+ "runnableExample": "<sds-input\n appearance=\"on-brand\"\n ariaLabel=\"Rechercher dans WebApp\"\n placeholder=\"Rechercher…\"\n trailingIcon=\"search\"\n />\n <sds-input\n appearance=\"on-brand\"\n label=\"Code d'accès\"\n placeholder=\"••••••\"\n />",
1322
+ "stack": true,
1323
+ "dark": true
1324
+ }
1325
+ ]
1326
+ },
1327
+ {
1328
+ "className": "SdsMultiSelect",
1329
+ "selector": "sds-multi-select",
1330
+ "kind": "component",
1331
+ "group": "form",
1332
+ "importName": "SdsMultiSelect",
1333
+ "description": "Liste déroulante à sélection multiple (la valeur est un tableau). Cases à cocher par option, « Tout sélectionner », affichage en puces ou en texte, filtre, effacement et navigation clavier. Overlay attaché au <body>. Implémente ControlValueAccessor.",
1334
+ "overviewDescription": "Sélection multiple : puces, « tout sélectionner » et filtre.",
1335
+ "jsdoc": "Multi-select dropdown (value is an array). Options may be primitives or\nobjects (configure via [optionLabel]/[optionValue]/[optionDisabled]). The\noverlay is appended to <body>. Supports a \"select all\" toggle, per-option\ncheckboxes, chip or comma display, filtering, clearing and keyboard nav.\nImplements ControlValueAccessor — use with reactive forms or [(ngModel)].\n\nFor object options, set [optionValue] or [dataKey] so written values match by\nkey; otherwise matching falls back to reference equality.",
1336
+ "example": "<sds-multi-select [options]=\"services\" optionLabel=\"name\" optionValue=\"code\"\n display=\"chip\" filter [(ngModel)]=\"codes\" />",
1337
+ "cva": true,
1338
+ "usesNgModel": true,
1339
+ "inputs": [
1340
+ {
1341
+ "name": "options",
1342
+ "type": "readonly unknown[]",
1343
+ "default": "[]",
1344
+ "required": false,
1345
+ "transform": null,
1346
+ "alias": null,
1347
+ "jsdoc": null
1348
+ },
1349
+ {
1350
+ "name": "optionLabel",
1351
+ "type": "string",
1352
+ "default": "'label'",
1353
+ "required": false,
1354
+ "transform": null,
1355
+ "alias": null,
1356
+ "jsdoc": null
1357
+ },
1358
+ {
1359
+ "name": "optionValue",
1360
+ "type": "string",
1361
+ "default": "''",
1362
+ "required": false,
1363
+ "transform": null,
1364
+ "alias": null,
1365
+ "jsdoc": null
1366
+ },
1367
+ {
1368
+ "name": "optionDisabled",
1369
+ "type": "string",
1370
+ "default": "'disabled'",
1371
+ "required": false,
1372
+ "transform": null,
1373
+ "alias": null,
1374
+ "jsdoc": null
1375
+ },
1376
+ {
1377
+ "name": "dataKey",
1378
+ "type": "string",
1379
+ "default": "''",
1380
+ "required": false,
1381
+ "transform": null,
1382
+ "alias": null,
1383
+ "jsdoc": null
1384
+ },
1385
+ {
1386
+ "name": "placeholder",
1387
+ "type": "string",
1388
+ "default": "'Sélectionner…'",
1389
+ "required": false,
1390
+ "transform": null,
1391
+ "alias": null,
1392
+ "jsdoc": null
1393
+ },
1394
+ {
1395
+ "name": "label",
1396
+ "type": "string",
1397
+ "default": "''",
1398
+ "required": false,
1399
+ "transform": null,
1400
+ "alias": null,
1401
+ "jsdoc": null
1402
+ },
1403
+ {
1404
+ "name": "ariaLabel",
1405
+ "type": "string",
1406
+ "default": "''",
1407
+ "required": false,
1408
+ "transform": null,
1409
+ "alias": null,
1410
+ "jsdoc": null
1411
+ },
1412
+ {
1413
+ "name": "hint",
1414
+ "type": "string",
1415
+ "default": "''",
1416
+ "required": false,
1417
+ "transform": null,
1418
+ "alias": null,
1419
+ "jsdoc": null
1420
+ },
1421
+ {
1422
+ "name": "error",
1423
+ "type": "string",
1424
+ "default": "''",
1425
+ "required": false,
1426
+ "transform": null,
1427
+ "alias": null,
1428
+ "jsdoc": null
1429
+ },
1430
+ {
1431
+ "name": "size",
1432
+ "type": "SdsMultiSelectSize",
1433
+ "default": "'md'",
1434
+ "required": false,
1435
+ "transform": null,
1436
+ "alias": null,
1437
+ "jsdoc": null
1438
+ },
1439
+ {
1440
+ "name": "display",
1441
+ "type": "SdsMultiSelectDisplay",
1442
+ "default": "'comma'",
1443
+ "required": false,
1444
+ "transform": null,
1445
+ "alias": null,
1446
+ "jsdoc": null
1447
+ },
1448
+ {
1449
+ "name": "maxSelectedLabels",
1450
+ "type": "number",
1451
+ "default": "3",
1452
+ "required": false,
1453
+ "transform": "numberAttribute",
1454
+ "alias": null,
1455
+ "jsdoc": "In comma mode, show a count label once more than this many are selected."
1456
+ },
1457
+ {
1458
+ "name": "selectedItemsLabel",
1459
+ "type": "string",
1460
+ "default": "'{0} éléments sélectionnés'",
1461
+ "required": false,
1462
+ "transform": null,
1463
+ "alias": null,
1464
+ "jsdoc": null
1465
+ },
1466
+ {
1467
+ "name": "showToggleAll",
1468
+ "type": "boolean",
1469
+ "default": "true",
1470
+ "required": false,
1471
+ "transform": "booleanAttribute",
1472
+ "alias": null,
1473
+ "jsdoc": null
1474
+ },
1475
+ {
1476
+ "name": "disabled",
1477
+ "type": "boolean",
1478
+ "default": "false",
1479
+ "required": false,
1480
+ "transform": "booleanAttribute",
1481
+ "alias": null,
1482
+ "jsdoc": null
1483
+ },
1484
+ {
1485
+ "name": "clearable",
1486
+ "type": "boolean",
1487
+ "default": "false",
1488
+ "required": false,
1489
+ "transform": "booleanAttribute",
1490
+ "alias": null,
1491
+ "jsdoc": null
1492
+ },
1493
+ {
1494
+ "name": "filter",
1495
+ "type": "boolean",
1496
+ "default": "false",
1497
+ "required": false,
1498
+ "transform": "booleanAttribute",
1499
+ "alias": null,
1500
+ "jsdoc": null
1501
+ },
1502
+ {
1503
+ "name": "filterPlaceholder",
1504
+ "type": "string",
1505
+ "default": "'Rechercher…'",
1506
+ "required": false,
1507
+ "transform": null,
1508
+ "alias": null,
1509
+ "jsdoc": null
1510
+ },
1511
+ {
1512
+ "name": "emptyMessage",
1513
+ "type": "string",
1514
+ "default": "'Aucun résultat'",
1515
+ "required": false,
1516
+ "transform": null,
1517
+ "alias": null,
1518
+ "jsdoc": null
1519
+ }
1520
+ ],
1521
+ "outputs": [],
1522
+ "exportedTypes": [
1523
+ {
1524
+ "name": "SdsMultiSelectSize",
1525
+ "kind": "union",
1526
+ "body": "'sm' | 'md' | 'lg'"
1527
+ },
1528
+ {
1529
+ "name": "SdsMultiSelectDisplay",
1530
+ "kind": "union",
1531
+ "body": "'comma' | 'chip'"
1532
+ }
1533
+ ],
1534
+ "projectionSlots": [],
1535
+ "hostBindings": {
1536
+ "class": "block",
1537
+ "(document:click)": "onDocumentClick($event)"
1538
+ },
1539
+ "examples": [
1540
+ {
1541
+ "sectionTitle": "Basique",
1542
+ "sectionDescription": "Affichage des libellés séparés par des virgules.",
1543
+ "code": "<sds-multi-select [options]=\"roles\" placeholder=\"Choisir des rôles\" />\n\n// roles = ['Médecin', 'Infirmier', 'Aide-soignant', 'Cadre de santé'];",
1544
+ "runnableExample": "<sds-multi-select [options]=\"roles\" placeholder=\"Choisir des rôles\" />",
1545
+ "stack": true,
1546
+ "dark": false
1547
+ },
1548
+ {
1549
+ "sectionTitle": "Affichage en puces (chip)",
1550
+ "sectionDescription": null,
1551
+ "code": "<sds-multi-select\n [options]=\"services\"\n optionLabel=\"name\"\n optionValue=\"code\"\n display=\"chip\"\n placeholder=\"Choisir des services\"\n/>",
1552
+ "runnableExample": "<sds-multi-select\n [options]=\"services\"\n optionLabel=\"name\"\n optionValue=\"code\"\n display=\"chip\"\n placeholder=\"Choisir des services\"\n />",
1553
+ "stack": true,
1554
+ "dark": false
1555
+ },
1556
+ {
1557
+ "sectionTitle": "Filtre + Tout sélectionner",
1558
+ "sectionDescription": null,
1559
+ "code": "<sds-multi-select\n [options]=\"services\"\n optionLabel=\"name\"\n optionValue=\"code\"\n filter\n placeholder=\"Choisir des services\"\n/>",
1560
+ "runnableExample": "<sds-multi-select\n [options]=\"services\"\n optionLabel=\"name\"\n optionValue=\"code\"\n filter\n placeholder=\"Choisir des services\"\n />",
1561
+ "stack": true,
1562
+ "dark": false
1563
+ },
1564
+ {
1565
+ "sectionTitle": "Effaçable + lié (ngModel)",
1566
+ "sectionDescription": null,
1567
+ "code": "<sds-multi-select\n [options]=\"services\"\n optionLabel=\"name\"\n optionValue=\"code\"\n display=\"chip\"\n filter\n clearable\n [(ngModel)]=\"codes\"\n/>\n<p>Codes : {{ codes.length ? codes.join(', ') : '—' }}</p>\n\n// codes: string[] = [];",
1568
+ "runnableExample": "<sds-multi-select\n [options]=\"services\"\n optionLabel=\"name\"\n optionValue=\"code\"\n display=\"chip\"\n filter\n clearable\n [(ngModel)]=\"codes\"\n />\n <p class=\"text-sm text-ink-soft\">\n Codes : <span class=\"font-medium text-ink\">{{ codes.length ? codes.join(', ') : '—' }}</span>\n </p>",
1569
+ "stack": true,
1570
+ "dark": false
1571
+ },
1572
+ {
1573
+ "sectionTitle": "Étiquette de comptage",
1574
+ "sectionDescription": "Au-delà de [maxSelectedLabels], un libellé de comptage remplace la liste.",
1575
+ "code": "<sds-multi-select\n [options]=\"services\"\n optionLabel=\"name\"\n optionValue=\"code\"\n [maxSelectedLabels]=\"2\"\n placeholder=\"Choisir des services\"\n/>",
1576
+ "runnableExample": "<sds-multi-select\n [options]=\"services\"\n optionLabel=\"name\"\n optionValue=\"code\"\n [maxSelectedLabels]=\"2\"\n placeholder=\"Choisir des services\"\n />",
1577
+ "stack": true,
1578
+ "dark": false
1579
+ },
1580
+ {
1581
+ "sectionTitle": "Désactivé",
1582
+ "sectionDescription": null,
1583
+ "code": "<sds-multi-select [options]=\"roles\" placeholder=\"Indisponible\" disabled />",
1584
+ "runnableExample": "<sds-multi-select [options]=\"roles\" placeholder=\"Indisponible\" disabled />",
1585
+ "stack": true,
1586
+ "dark": false
1587
+ }
1588
+ ]
1589
+ },
1590
+ {
1591
+ "className": "SdsNavGroup",
1592
+ "selector": "sds-nav-group",
1593
+ "kind": "component",
1594
+ "group": "layout",
1595
+ "importName": "SdsNavGroup",
1596
+ "description": null,
1597
+ "overviewDescription": null,
1598
+ "jsdoc": "Groups nav items under an optional uppercase section label.\n\nTwo modes:\n- **Section** (default) — a static label over its items. The label is replaced by a divider when\n the rail is collapsed.\n- **Collapsible** (`[collapsible]`) — the label becomes a button that expands and collapses the\n group. Set `[basePath]` and the group opens itself whenever the active route is inside it, so a\n deep link or a browser Back lands with the right section already open instead of the person\n having to find and re-open it.\n\nCollapsible mode exists because a flat rail stops scaling somewhere around a dozen destinations,\nand the alternative — showing every child of every section at once — buries the ones in use.\n\nOn the collapsed desktop rail there is nowhere to put a header, so a collapsible group renders\nexactly like a section: divider, children visible. Hiding them there would leave the rail with\nunreachable destinations and no affordance to reveal them.",
1599
+ "example": null,
1600
+ "cva": false,
1601
+ "usesNgModel": false,
1602
+ "inputs": [
1603
+ {
1604
+ "name": "label",
1605
+ "type": "string",
1606
+ "default": "''",
1607
+ "required": false,
1608
+ "transform": null,
1609
+ "alias": null,
1610
+ "jsdoc": null
1611
+ },
1612
+ {
1613
+ "name": "collapsible",
1614
+ "type": "boolean",
1615
+ "default": "false",
1616
+ "required": false,
1617
+ "transform": "booleanAttribute",
1618
+ "alias": null,
1619
+ "jsdoc": "Turn the label into an expand/collapse control."
1620
+ },
1621
+ {
1622
+ "name": "icon",
1623
+ "type": "SdsIconName | null",
1624
+ "default": "null",
1625
+ "required": false,
1626
+ "transform": null,
1627
+ "alias": null,
1628
+ "jsdoc": "Icon for a collapsible header, so it reads at the same weight as the items it sits among."
1629
+ },
1630
+ {
1631
+ "name": "basePath",
1632
+ "type": "string | null",
1633
+ "default": "null",
1634
+ "required": false,
1635
+ "transform": null,
1636
+ "alias": null,
1637
+ "jsdoc": "URL prefix owned by this group, e.g. `/payments`. While the active route starts with it the\ngroup counts as active and opens itself — unless the person has explicitly toggled it since."
1638
+ }
1639
+ ],
1640
+ "outputs": [
1641
+ {
1642
+ "name": "expandedChange",
1643
+ "type": "boolean",
1644
+ "fromModel": false
1645
+ }
1646
+ ],
1647
+ "exportedTypes": [],
1648
+ "projectionSlots": [],
1649
+ "hostBindings": {
1650
+ "class": "block"
1651
+ },
1652
+ "examples": []
1653
+ },
1654
+ {
1655
+ "className": "SdsNavItem",
1656
+ "selector": "sds-nav-item",
1657
+ "kind": "component",
1658
+ "group": "layout",
1659
+ "importName": "SdsNavItem",
1660
+ "description": null,
1661
+ "overviewDescription": null,
1662
+ "jsdoc": "A single sidebar navigation entry. Renders an anchor when [link] is set\n(with automatic active state via routerLinkActive) or a button otherwise.\n\nRequires the host application to provide the Angular Router (`provideRouter`),\nas it depends on RouterLink/RouterLinkActive even when used as a button.",
1663
+ "example": "<sds-nav-item icon=\"home\" label=\"Accueil\" link=\"/\" [exact]=\"true\" />",
1664
+ "cva": false,
1665
+ "usesNgModel": false,
1666
+ "inputs": [
1667
+ {
1668
+ "name": "icon",
1669
+ "type": "SdsIconName | null",
1670
+ "default": "null",
1671
+ "required": false,
1672
+ "transform": null,
1673
+ "alias": null,
1674
+ "jsdoc": null
1675
+ },
1676
+ {
1677
+ "name": "label",
1678
+ "type": "string",
1679
+ "default": null,
1680
+ "required": true,
1681
+ "transform": null,
1682
+ "alias": null,
1683
+ "jsdoc": null
1684
+ },
1685
+ {
1686
+ "name": "link",
1687
+ "type": "string | unknown[] | null",
1688
+ "default": "null",
1689
+ "required": false,
1690
+ "transform": null,
1691
+ "alias": null,
1692
+ "jsdoc": "Router link target; when null, the item behaves as a button."
1693
+ },
1694
+ {
1695
+ "name": "exact",
1696
+ "type": "boolean",
1697
+ "default": "false",
1698
+ "required": false,
1699
+ "transform": "booleanAttribute",
1700
+ "alias": null,
1701
+ "jsdoc": null
1702
+ },
1703
+ {
1704
+ "name": "active",
1705
+ "type": "boolean",
1706
+ "default": "false",
1707
+ "required": false,
1708
+ "transform": "booleanAttribute",
1709
+ "alias": null,
1710
+ "jsdoc": "Manual active state (combined with routerLinkActive when a link is set)."
1711
+ }
1712
+ ],
1713
+ "outputs": [
1714
+ {
1715
+ "name": "select",
1716
+ "type": "void",
1717
+ "fromModel": false
1718
+ }
1719
+ ],
1720
+ "exportedTypes": [],
1721
+ "projectionSlots": [],
1722
+ "hostBindings": {
1723
+ "class": "block"
1724
+ },
1725
+ "examples": []
1726
+ },
1727
+ {
1728
+ "className": "SdsPaginator",
1729
+ "selector": "sds-paginator",
1730
+ "kind": "component",
1731
+ "group": "data",
1732
+ "importName": "SdsPaginator",
1733
+ "description": "Pagination avec fenêtre glissante de pages, navigation première / précédente / suivante / dernière, choix du nombre de lignes par page, rapport de page courante et saisie directe. État exposé via [(first)] et [(rows)] ; l'événement (pageChange) fournit l'état complet.",
1734
+ "overviewDescription": "Pagination : fenêtre de pages, lignes par page et rapport.",
1735
+ "jsdoc": "Pagination control (mirrors PrimeNG's paginator). Drives a sliding window of\npage links with first/prev/next/last navigation, an optional rows-per-page\ndropdown (reuses <sds-select>), a current-page report and a jump-to-page input.\n\nState is exposed as two-way models: [first] (zero-based index of the first\nrecord on the page) and [rows] (page size). A combined (pageChange) event\ncarries the full {@link SdsPaginatorState} on every change.",
1736
+ "example": "<sds-paginator\n [totalRecords]=\"120\"\n [(first)]=\"first\"\n [(rows)]=\"rows\"\n [rowsPerPageOptions]=\"[10, 20, 50]\"\n showCurrentPageReport\n (pageChange)=\"load($event)\"\n/>",
1737
+ "cva": false,
1738
+ "usesNgModel": false,
1739
+ "inputs": [
1740
+ {
1741
+ "name": "totalRecords",
1742
+ "type": "number",
1743
+ "default": "0",
1744
+ "required": false,
1745
+ "transform": "numberAttribute",
1746
+ "alias": null,
1747
+ "jsdoc": "Total number of records to paginate."
1748
+ },
1749
+ {
1750
+ "name": "first",
1751
+ "type": "number",
1752
+ "default": "0",
1753
+ "required": false,
1754
+ "transform": null,
1755
+ "alias": null,
1756
+ "jsdoc": "Zero-based index of the first record on the current page (two-way)."
1757
+ },
1758
+ {
1759
+ "name": "rows",
1760
+ "type": "number",
1761
+ "default": "10",
1762
+ "required": false,
1763
+ "transform": null,
1764
+ "alias": null,
1765
+ "jsdoc": "Rows displayed per page (two-way)."
1766
+ },
1767
+ {
1768
+ "name": "rowsPerPageOptions",
1769
+ "type": "number[]",
1770
+ "default": "[]",
1771
+ "required": false,
1772
+ "transform": null,
1773
+ "alias": null,
1774
+ "jsdoc": "When non-empty, renders a rows-per-page dropdown with these choices."
1775
+ },
1776
+ {
1777
+ "name": "pageLinkSize",
1778
+ "type": "number",
1779
+ "default": "5",
1780
+ "required": false,
1781
+ "transform": "numberAttribute",
1782
+ "alias": null,
1783
+ "jsdoc": "Maximum count of numbered page links shown in the sliding window."
1784
+ },
1785
+ {
1786
+ "name": "showFirstLastIcon",
1787
+ "type": "boolean",
1788
+ "default": "true",
1789
+ "required": false,
1790
+ "transform": "booleanAttribute",
1791
+ "alias": null,
1792
+ "jsdoc": null
1793
+ },
1794
+ {
1795
+ "name": "showPageLinks",
1796
+ "type": "boolean",
1797
+ "default": "true",
1798
+ "required": false,
1799
+ "transform": "booleanAttribute",
1800
+ "alias": null,
1801
+ "jsdoc": null
1802
+ },
1803
+ {
1804
+ "name": "showCurrentPageReport",
1805
+ "type": "boolean",
1806
+ "default": "false",
1807
+ "required": false,
1808
+ "transform": "booleanAttribute",
1809
+ "alias": null,
1810
+ "jsdoc": null
1811
+ },
1812
+ {
1813
+ "name": "currentPageReportTemplate",
1814
+ "type": "string",
1815
+ "default": "'{first} – {last} sur {totalRecords}'",
1816
+ "required": false,
1817
+ "transform": null,
1818
+ "alias": null,
1819
+ "jsdoc": "Tokens: {first} {last} {totalRecords} {currentPage} {totalPages} {rows}."
1820
+ },
1821
+ {
1822
+ "name": "showJumpToPageInput",
1823
+ "type": "boolean",
1824
+ "default": "false",
1825
+ "required": false,
1826
+ "transform": "booleanAttribute",
1827
+ "alias": null,
1828
+ "jsdoc": null
1829
+ },
1830
+ {
1831
+ "name": "rowsPerPageLabel",
1832
+ "type": "string",
1833
+ "default": "'Lignes par page'",
1834
+ "required": false,
1835
+ "transform": null,
1836
+ "alias": null,
1837
+ "jsdoc": null
1838
+ },
1839
+ {
1840
+ "name": "jumpToPageLabel",
1841
+ "type": "string",
1842
+ "default": "'Aller à'",
1843
+ "required": false,
1844
+ "transform": null,
1845
+ "alias": null,
1846
+ "jsdoc": null
1847
+ },
1848
+ {
1849
+ "name": "size",
1850
+ "type": "SdsPaginatorSize",
1851
+ "default": "'md'",
1852
+ "required": false,
1853
+ "transform": null,
1854
+ "alias": null,
1855
+ "jsdoc": null
1856
+ },
1857
+ {
1858
+ "name": "disabled",
1859
+ "type": "boolean",
1860
+ "default": "false",
1861
+ "required": false,
1862
+ "transform": "booleanAttribute",
1863
+ "alias": null,
1864
+ "jsdoc": null
1865
+ }
1866
+ ],
1867
+ "outputs": [
1868
+ {
1869
+ "name": "firstChange",
1870
+ "type": "number",
1871
+ "fromModel": true
1872
+ },
1873
+ {
1874
+ "name": "rowsChange",
1875
+ "type": "number",
1876
+ "fromModel": true
1877
+ },
1878
+ {
1879
+ "name": "pageChange",
1880
+ "type": "SdsPaginatorState",
1881
+ "fromModel": false
1882
+ }
1883
+ ],
1884
+ "exportedTypes": [
1885
+ {
1886
+ "name": "SdsPaginatorSize",
1887
+ "kind": "union",
1888
+ "body": "'sm' | 'md' | 'lg'"
1889
+ },
1890
+ {
1891
+ "name": "SdsPaginatorState",
1892
+ "kind": "interface",
1893
+ "body": "interface SdsPaginatorState { /** Zero-based index of the current page. */ page: number; /** Zero-based index of the first record on the current page. */ first: number; /** Rows displayed per page. */ rows: number; /** Total number of pages. */ pageCount: number; /** Total number of records. */ totalRecords: number; }"
1894
+ }
1895
+ ],
1896
+ "projectionSlots": [],
1897
+ "hostBindings": {
1898
+ "[class]": "hostClass()"
1899
+ },
1900
+ "examples": [
1901
+ {
1902
+ "sectionTitle": "Basique",
1903
+ "sectionDescription": "120 enregistrements, 10 par page.",
1904
+ "code": "<sds-paginator [totalRecords]=\"120\" />",
1905
+ "runnableExample": "<sds-paginator [totalRecords]=\"120\" />",
1906
+ "stack": true,
1907
+ "dark": false
1908
+ },
1909
+ {
1910
+ "sectionTitle": "Lignes par page",
1911
+ "sectionDescription": "Fournissez rowsPerPageOptions pour afficher la liste déroulante (réutilise sds-select).",
1912
+ "code": "<sds-paginator [totalRecords]=\"120\" [rowsPerPageOptions]=\"[10, 20, 50]\" />",
1913
+ "runnableExample": "<sds-paginator [totalRecords]=\"120\" [rowsPerPageOptions]=\"[10, 20, 50]\" />",
1914
+ "stack": true,
1915
+ "dark": false
1916
+ },
1917
+ {
1918
+ "sectionTitle": "Rapport de page courante",
1919
+ "sectionDescription": "currentPageReportTemplate accepte {first} {last} {totalRecords} {currentPage} {totalPages} {rows}.",
1920
+ "code": "<sds-paginator\n [totalRecords]=\"248\"\n [rowsPerPageOptions]=\"[10, 25, 50]\"\n showCurrentPageReport\n currentPageReportTemplate=\"{first} – {last} sur {totalRecords}\"\n/>",
1921
+ "runnableExample": "<sds-paginator\n [totalRecords]=\"248\"\n [rowsPerPageOptions]=\"[10, 25, 50]\"\n showCurrentPageReport\n currentPageReportTemplate=\"{first} – {last} sur {totalRecords}\"\n />",
1922
+ "stack": true,
1923
+ "dark": false
1924
+ },
1925
+ {
1926
+ "sectionTitle": "Saisie de page",
1927
+ "sectionDescription": "Saisie directe du numéro de page.",
1928
+ "code": "<sds-paginator [totalRecords]=\"300\" showJumpToPageInput />",
1929
+ "runnableExample": "<sds-paginator [totalRecords]=\"300\" showJumpToPageInput />",
1930
+ "stack": true,
1931
+ "dark": false
1932
+ },
1933
+ {
1934
+ "sectionTitle": "Lié au modèle (pageChange)",
1935
+ "sectionDescription": "Liaison bidirectionnelle [(first)] / [(rows)] et événement combiné.",
1936
+ "code": "<sds-paginator\n [totalRecords]=\"people.length\"\n [(first)]=\"first\"\n [(rows)]=\"rows\"\n [rowsPerPageOptions]=\"[5, 10, 20]\"\n showCurrentPageReport\n (pageChange)=\"onPage($event)\"\n/>\n\n// first = signal(0); rows = signal(5);\n// visiblePeople = () => people.slice(first(), first() + rows());",
1937
+ "runnableExample": "<sds-paginator\n [totalRecords]=\"people.length\"\n [(first)]=\"first\"\n [(rows)]=\"rows\"\n [rowsPerPageOptions]=\"[5, 10, 20]\"\n showCurrentPageReport\n (pageChange)=\"onPage($event)\"\n />\n\n <ul class=\"divide-y divide-border overflow-hidden rounded-card border border-border bg-surface\">\n @for (p of visiblePeople(); track p) {\n <li class=\"px-4 py-2.5 text-sm text-ink\">{{ p }}</li>\n }\n </ul>\n\n <p class=\"text-sm text-ink-soft\">\n Page <span class=\"font-medium text-ink\">{{ lastState()?.page ?? 0 }}</span> ·\n first <span class=\"font-medium text-ink\">{{ first() }}</span> ·\n rows <span class=\"font-medium text-ink\">{{ rows() }}</span>\n </p>",
1938
+ "stack": true,
1939
+ "dark": false
1940
+ },
1941
+ {
1942
+ "sectionTitle": "Tailles",
1943
+ "sectionDescription": "size : sm · md (défaut) · lg.",
1944
+ "code": "<sds-paginator [totalRecords]=\"80\" size=\"sm\" />\n<sds-paginator [totalRecords]=\"80\" size=\"md\" />\n<sds-paginator [totalRecords]=\"80\" size=\"lg\" />",
1945
+ "runnableExample": "<sds-paginator [totalRecords]=\"80\" size=\"sm\" />\n <sds-paginator [totalRecords]=\"80\" size=\"md\" />\n <sds-paginator [totalRecords]=\"80\" size=\"lg\" />",
1946
+ "stack": true,
1947
+ "dark": false
1948
+ },
1949
+ {
1950
+ "sectionTitle": "Désactivé",
1951
+ "sectionDescription": null,
1952
+ "code": "<sds-paginator [totalRecords]=\"120\" [rowsPerPageOptions]=\"[10, 20]\" disabled />",
1953
+ "runnableExample": "<sds-paginator [totalRecords]=\"120\" [rowsPerPageOptions]=\"[10, 20]\" disabled />",
1954
+ "stack": true,
1955
+ "dark": false
1956
+ }
1957
+ ]
1958
+ },
1959
+ {
1960
+ "className": "SdsPhoneInput",
1961
+ "selector": "sds-phone-input",
1962
+ "kind": "component",
1963
+ "group": "form",
1964
+ "importName": "SdsPhoneInput",
1965
+ "description": "Saisie de numéro de téléphone international : sélecteur de pays (code ISO + indicatif) avec liste déroulante recherchable, et champ national formaté automatiquement selon le pays. La valeur liée est au format E.164 (« +32470123456 ») ; la longueur nationale est validée par pays (Validator + ControlValueAccessor).",
1966
+ "overviewDescription": "Numéro international : sélecteur de pays, format et validation.",
1967
+ "jsdoc": "International phone number input: a country selector (ISO chip + dial code)\nwith a searchable, body-appended dropdown, plus a formatted national-number\nfield. Implements ControlValueAccessor (value is an E.164 string such as\n'+32470123456') and Validator (national length is checked per country).",
1968
+ "example": "<sds-phone-input label=\"Téléphone\" defaultCountry=\"BE\"\n [preferredCountries]=\"['BE','FR','LU']\"\n [(ngModel)]=\"phone\" required />",
1969
+ "cva": true,
1970
+ "usesNgModel": true,
1971
+ "inputs": [
1972
+ {
1973
+ "name": "label",
1974
+ "type": "string",
1975
+ "default": "''",
1976
+ "required": false,
1977
+ "transform": null,
1978
+ "alias": null,
1979
+ "jsdoc": null
1980
+ },
1981
+ {
1982
+ "name": "hint",
1983
+ "type": "string",
1984
+ "default": "''",
1985
+ "required": false,
1986
+ "transform": null,
1987
+ "alias": null,
1988
+ "jsdoc": null
1989
+ },
1990
+ {
1991
+ "name": "error",
1992
+ "type": "string",
1993
+ "default": "''",
1994
+ "required": false,
1995
+ "transform": null,
1996
+ "alias": null,
1997
+ "jsdoc": "External error message; overrides the built-in validation message."
1998
+ },
1999
+ {
2000
+ "name": "size",
2001
+ "type": "SdsPhoneInputSize",
2002
+ "default": "'md'",
2003
+ "required": false,
2004
+ "transform": null,
2005
+ "alias": null,
2006
+ "jsdoc": null
2007
+ },
2008
+ {
2009
+ "name": "disabled",
2010
+ "type": "boolean",
2011
+ "default": "false",
2012
+ "required": false,
2013
+ "transform": "booleanAttribute",
2014
+ "alias": null,
2015
+ "jsdoc": null
2016
+ },
2017
+ {
2018
+ "name": "required",
2019
+ "type": "boolean",
2020
+ "default": "false",
2021
+ "required": false,
2022
+ "transform": "booleanAttribute",
2023
+ "alias": null,
2024
+ "jsdoc": null
2025
+ },
2026
+ {
2027
+ "name": "clearable",
2028
+ "type": "boolean",
2029
+ "default": "false",
2030
+ "required": false,
2031
+ "transform": "booleanAttribute",
2032
+ "alias": null,
2033
+ "jsdoc": null
2034
+ },
2035
+ {
2036
+ "name": "defaultCountry",
2037
+ "type": "string",
2038
+ "default": "'BE'",
2039
+ "required": false,
2040
+ "transform": null,
2041
+ "alias": null,
2042
+ "jsdoc": "Initial country (ISO2) when no value is written."
2043
+ },
2044
+ {
2045
+ "name": "preferredCountries",
2046
+ "type": "string[]",
2047
+ "default": "[]",
2048
+ "required": false,
2049
+ "transform": null,
2050
+ "alias": null,
2051
+ "jsdoc": "ISO2 codes shown first in the list."
2052
+ },
2053
+ {
2054
+ "name": "onlyCountries",
2055
+ "type": "string[]",
2056
+ "default": "[]",
2057
+ "required": false,
2058
+ "transform": null,
2059
+ "alias": null,
2060
+ "jsdoc": "Restrict the list to these ISO2 codes (empty = all)."
2061
+ },
2062
+ {
2063
+ "name": "showExampleHint",
2064
+ "type": "boolean",
2065
+ "default": "true",
2066
+ "required": false,
2067
+ "transform": "booleanAttribute",
2068
+ "alias": null,
2069
+ "jsdoc": "Show an example number as a hint when no [hint] is provided."
2070
+ },
2071
+ {
2072
+ "name": "requiredMessage",
2073
+ "type": "string",
2074
+ "default": "'Numéro de téléphone requis'",
2075
+ "required": false,
2076
+ "transform": null,
2077
+ "alias": null,
2078
+ "jsdoc": null
2079
+ }
2080
+ ],
2081
+ "outputs": [
2082
+ {
2083
+ "name": "phoneChange",
2084
+ "type": "SdsPhoneValue",
2085
+ "fromModel": false
2086
+ }
2087
+ ],
2088
+ "exportedTypes": [
2089
+ {
2090
+ "name": "SdsPhoneInputSize",
2091
+ "kind": "union",
2092
+ "body": "'sm' | 'md' | 'lg'"
2093
+ },
2094
+ {
2095
+ "name": "SdsPhoneValue",
2096
+ "kind": "interface",
2097
+ "body": "interface SdsPhoneValue { /** E.164 string, e.g. '+32470123456' (empty when no number is entered). */ e164: string; /** Selected country ISO2 code. */ country: string; /** Dial code without '+', e.g. '32'. */ dialCode: string; /** National-significant digits, e.g. '470123456'. */ national: string; /** Whether the national number matches an expected length for the country. */ valid: boolean; }"
2098
+ }
2099
+ ],
2100
+ "projectionSlots": [],
2101
+ "hostBindings": {
2102
+ "class": "block",
2103
+ "(document:click)": "onDocumentClick($event)"
2104
+ },
2105
+ "examples": [
2106
+ {
2107
+ "sectionTitle": "Basique",
2108
+ "sectionDescription": "Pays par défaut : Belgique. Le champ se formate à la frappe.",
2109
+ "code": "<sds-phone-input label=\"Téléphone\" [(ngModel)]=\"phone\" />\n\n// phone === '+32470123456' (E.164)",
2110
+ "runnableExample": "<sds-phone-input label=\"Téléphone\" [(ngModel)]=\"phone\" />\n <p class=\"text-sm text-ink-soft\">\n Valeur (E.164) : <span class=\"font-medium text-ink\">{{ phone || '—' }}</span>\n </p>",
2111
+ "stack": true,
2112
+ "dark": false
2113
+ },
2114
+ {
2115
+ "sectionTitle": "Pays par défaut & pays préférés",
2116
+ "sectionDescription": "defaultCountry définit la sélection initiale ; preferredCountries les place en tête de liste.",
2117
+ "code": "<sds-phone-input\n label=\"Mobile\"\n defaultCountry=\"FR\"\n [preferredCountries]=\"['BE', 'FR', 'LU', 'NL']\"\n/>",
2118
+ "runnableExample": "<sds-phone-input\n label=\"Mobile\"\n defaultCountry=\"FR\"\n [preferredCountries]=\"['BE', 'FR', 'LU', 'NL']\"\n />",
2119
+ "stack": true,
2120
+ "dark": false
2121
+ },
2122
+ {
2123
+ "sectionTitle": "Liste restreinte",
2124
+ "sectionDescription": "onlyCountries limite les pays proposés.",
2125
+ "code": "<sds-phone-input\n label=\"Téléphone (zone Benelux)\"\n defaultCountry=\"BE\"\n [onlyCountries]=\"['BE', 'NL', 'LU']\"\n/>",
2126
+ "runnableExample": "<sds-phone-input\n label=\"Téléphone (zone Benelux)\"\n defaultCountry=\"BE\"\n [onlyCountries]=\"['BE', 'NL', 'LU']\"\n />",
2127
+ "stack": true,
2128
+ "dark": false
2129
+ },
2130
+ {
2131
+ "sectionTitle": "Validation (longueur par pays)",
2132
+ "sectionDescription": "required + validation de longueur. L'erreur s'affiche après le premier blur.",
2133
+ "code": "<sds-phone-input\n label=\"Téléphone professionnel\"\n defaultCountry=\"BE\"\n required\n clearable\n (phoneChange)=\"onChange($event)\"\n/>\n\n// $event: { e164, country, dialCode, national, valid }\n// Validator: { phoneInvalid: { expectedLengths, actualLength } } | { required }",
2134
+ "runnableExample": "<sds-phone-input\n label=\"Téléphone professionnel\"\n defaultCountry=\"BE\"\n required\n clearable\n (phoneChange)=\"last.set($event)\"\n />\n @if (last(); as v) {\n <div class=\"rounded-control bg-muted px-3 py-2 text-sm text-ink-soft\">\n <div>E.164 : <span class=\"font-medium text-ink\">{{ v.e164 || '—' }}</span></div>\n <div>Pays : <span class=\"font-medium text-ink\">{{ v.country }}</span> · National : {{ v.national || '—' }}</div>\n <div>\n Valide :\n <span class=\"font-medium\" [class]=\"v.valid ? 'text-success' : 'text-danger'\">\n {{ v.valid ? 'oui' : 'non' }}\n </span>\n </div>\n </div>\n }",
2135
+ "stack": true,
2136
+ "dark": false
2137
+ },
2138
+ {
2139
+ "sectionTitle": "Tailles",
2140
+ "sectionDescription": null,
2141
+ "code": "<sds-phone-input size=\"sm\" defaultCountry=\"BE\" label=\"Small\" />\n<sds-phone-input size=\"md\" defaultCountry=\"BE\" label=\"Medium\" />\n<sds-phone-input size=\"lg\" defaultCountry=\"BE\" label=\"Large\" />",
2142
+ "runnableExample": "<sds-phone-input size=\"sm\" defaultCountry=\"BE\" label=\"Small\" />\n <sds-phone-input size=\"md\" defaultCountry=\"BE\" label=\"Medium\" />\n <sds-phone-input size=\"lg\" defaultCountry=\"BE\" label=\"Large\" />",
2143
+ "stack": true,
2144
+ "dark": false
2145
+ },
2146
+ {
2147
+ "sectionTitle": "Désactivé",
2148
+ "sectionDescription": null,
2149
+ "code": "<sds-phone-input label=\"Téléphone\" [ngModel]=\"'+32470123456'\" disabled />",
2150
+ "runnableExample": "<sds-phone-input label=\"Téléphone\" defaultCountry=\"BE\" [ngModel]=\"'+32470123456'\" disabled />",
2151
+ "stack": true,
2152
+ "dark": false
2153
+ }
2154
+ ]
2155
+ },
2156
+ {
2157
+ "className": "SdsSelect",
2158
+ "selector": "sds-select",
2159
+ "kind": "component",
2160
+ "group": "form",
2161
+ "importName": "SdsSelect",
2162
+ "description": "Liste déroulante à sélection unique. Options primitives ou objets (via optionLabel / optionValue / optionDisabled). Overlay attaché au <body>, filtre, effacement et navigation clavier complète. Implémente ControlValueAccessor.",
2163
+ "overviewDescription": "Liste déroulante avec filtre, effacement et navigation clavier.",
2164
+ "jsdoc": "Single-select dropdown. Options may be primitives or objects (configure via\n[optionLabel]/[optionValue]/[optionDisabled]). The overlay is appended to\n<body>. Supports filtering, clearing, and full keyboard navigation.\nImplements ControlValueAccessor — use with reactive forms or [(ngModel)].\n\nFor object options, set [optionValue] or [dataKey] so written values match by\nkey; otherwise selection matching falls back to reference equality (a written\ncopy of an option will not match).",
2165
+ "example": "<sds-select [options]=\"services\" optionLabel=\"name\" optionValue=\"id\"\n placeholder=\"Choisir un service\" [(ngModel)]=\"serviceId\" filter clearable />",
2166
+ "cva": true,
2167
+ "usesNgModel": true,
2168
+ "inputs": [
2169
+ {
2170
+ "name": "options",
2171
+ "type": "readonly unknown[]",
2172
+ "default": "[]",
2173
+ "required": false,
2174
+ "transform": null,
2175
+ "alias": null,
2176
+ "jsdoc": null
2177
+ },
2178
+ {
2179
+ "name": "optionLabel",
2180
+ "type": "string",
2181
+ "default": "'label'",
2182
+ "required": false,
2183
+ "transform": null,
2184
+ "alias": null,
2185
+ "jsdoc": null
2186
+ },
2187
+ {
2188
+ "name": "optionValue",
2189
+ "type": "string",
2190
+ "default": "''",
2191
+ "required": false,
2192
+ "transform": null,
2193
+ "alias": null,
2194
+ "jsdoc": null
2195
+ },
2196
+ {
2197
+ "name": "optionDisabled",
2198
+ "type": "string",
2199
+ "default": "'disabled'",
2200
+ "required": false,
2201
+ "transform": null,
2202
+ "alias": null,
2203
+ "jsdoc": null
2204
+ },
2205
+ {
2206
+ "name": "dataKey",
2207
+ "type": "string",
2208
+ "default": "''",
2209
+ "required": false,
2210
+ "transform": null,
2211
+ "alias": null,
2212
+ "jsdoc": "Key used to compare object values for selection equality."
2213
+ },
2214
+ {
2215
+ "name": "placeholder",
2216
+ "type": "string",
2217
+ "default": "'Sélectionner…'",
2218
+ "required": false,
2219
+ "transform": null,
2220
+ "alias": null,
2221
+ "jsdoc": null
2222
+ },
2223
+ {
2224
+ "name": "label",
2225
+ "type": "string",
2226
+ "default": "''",
2227
+ "required": false,
2228
+ "transform": null,
2229
+ "alias": null,
2230
+ "jsdoc": null
2231
+ },
2232
+ {
2233
+ "name": "ariaLabel",
2234
+ "type": "string",
2235
+ "default": "''",
2236
+ "required": false,
2237
+ "transform": null,
2238
+ "alias": null,
2239
+ "jsdoc": null
2240
+ },
2241
+ {
2242
+ "name": "hint",
2243
+ "type": "string",
2244
+ "default": "''",
2245
+ "required": false,
2246
+ "transform": null,
2247
+ "alias": null,
2248
+ "jsdoc": null
2249
+ },
2250
+ {
2251
+ "name": "error",
2252
+ "type": "string",
2253
+ "default": "''",
2254
+ "required": false,
2255
+ "transform": null,
2256
+ "alias": null,
2257
+ "jsdoc": null
2258
+ },
2259
+ {
2260
+ "name": "size",
2261
+ "type": "SdsSelectSize",
2262
+ "default": "'md'",
2263
+ "required": false,
2264
+ "transform": null,
2265
+ "alias": null,
2266
+ "jsdoc": null
2267
+ },
2268
+ {
2269
+ "name": "disabled",
2270
+ "type": "boolean",
2271
+ "default": "false",
2272
+ "required": false,
2273
+ "transform": "booleanAttribute",
2274
+ "alias": null,
2275
+ "jsdoc": null
2276
+ },
2277
+ {
2278
+ "name": "clearable",
2279
+ "type": "boolean",
2280
+ "default": "false",
2281
+ "required": false,
2282
+ "transform": "booleanAttribute",
2283
+ "alias": null,
2284
+ "jsdoc": null
2285
+ },
2286
+ {
2287
+ "name": "filter",
2288
+ "type": "boolean",
2289
+ "default": "false",
2290
+ "required": false,
2291
+ "transform": "booleanAttribute",
2292
+ "alias": null,
2293
+ "jsdoc": null
2294
+ },
2295
+ {
2296
+ "name": "filterPlaceholder",
2297
+ "type": "string",
2298
+ "default": "'Rechercher…'",
2299
+ "required": false,
2300
+ "transform": null,
2301
+ "alias": null,
2302
+ "jsdoc": null
2303
+ },
2304
+ {
2305
+ "name": "emptyMessage",
2306
+ "type": "string",
2307
+ "default": "'Aucun résultat'",
2308
+ "required": false,
2309
+ "transform": null,
2310
+ "alias": null,
2311
+ "jsdoc": null
2312
+ }
2313
+ ],
2314
+ "outputs": [],
2315
+ "exportedTypes": [
2316
+ {
2317
+ "name": "SdsSelectSize",
2318
+ "kind": "union",
2319
+ "body": "'sm' | 'md' | 'lg'"
2320
+ }
2321
+ ],
2322
+ "projectionSlots": [],
2323
+ "hostBindings": {
2324
+ "class": "block",
2325
+ "(document:click)": "onDocumentClick($event)"
2326
+ },
2327
+ "examples": [
2328
+ {
2329
+ "sectionTitle": "Basique",
2330
+ "sectionDescription": "Options sous forme de chaînes simples.",
2331
+ "code": "<sds-select [options]=\"roles\" placeholder=\"Choisir un rôle\" />\n\n// roles = ['Médecin', 'Infirmier', 'Aide-soignant', 'Cadre de santé'];",
2332
+ "runnableExample": "<sds-select [options]=\"roles\" placeholder=\"Choisir un rôle\" />",
2333
+ "stack": true,
2334
+ "dark": false
2335
+ },
2336
+ {
2337
+ "sectionTitle": "Objets (optionLabel / optionValue)",
2338
+ "sectionDescription": "La valeur liée est le code ; l'étiquette affichée est le nom.",
2339
+ "code": "<sds-select\n [options]=\"services\"\n optionLabel=\"name\"\n optionValue=\"code\"\n placeholder=\"Choisir un service\"\n/>\n\n// services = [{ name: 'Cardiologie', code: 'CARD' }, …];",
2340
+ "runnableExample": "<sds-select\n [options]=\"services\"\n optionLabel=\"name\"\n optionValue=\"code\"\n placeholder=\"Choisir un service\"\n />",
2341
+ "stack": true,
2342
+ "dark": false
2343
+ },
2344
+ {
2345
+ "sectionTitle": "Avec filtre",
2346
+ "sectionDescription": null,
2347
+ "code": "<sds-select\n [options]=\"services\"\n optionLabel=\"name\"\n optionValue=\"code\"\n placeholder=\"Choisir un service\"\n filter\n/>",
2348
+ "runnableExample": "<sds-select\n [options]=\"services\"\n optionLabel=\"name\"\n optionValue=\"code\"\n placeholder=\"Choisir un service\"\n filter\n />",
2349
+ "stack": true,
2350
+ "dark": false
2351
+ },
2352
+ {
2353
+ "sectionTitle": "Effaçable",
2354
+ "sectionDescription": "Affiche un bouton d'effacement quand une valeur est sélectionnée.",
2355
+ "code": "<sds-select\n [options]=\"roles\"\n placeholder=\"Choisir un rôle\"\n clearable\n [(ngModel)]=\"role\"\n/>",
2356
+ "runnableExample": "<sds-select\n [options]=\"roles\"\n placeholder=\"Choisir un rôle\"\n clearable\n [(ngModel)]=\"role\"\n />",
2357
+ "stack": true,
2358
+ "dark": false
2359
+ },
2360
+ {
2361
+ "sectionTitle": "Lié au formulaire (ngModel)",
2362
+ "sectionDescription": null,
2363
+ "code": "<sds-select\n [options]=\"services\"\n optionLabel=\"name\"\n optionValue=\"code\"\n placeholder=\"Choisir un service\"\n filter\n clearable\n [(ngModel)]=\"serviceCode\"\n/>\n<p>Code sélectionné : {{ serviceCode || '—' }}</p>",
2364
+ "runnableExample": "<sds-select\n [options]=\"services\"\n optionLabel=\"name\"\n optionValue=\"code\"\n placeholder=\"Choisir un service\"\n filter\n clearable\n [(ngModel)]=\"serviceCode\"\n />\n <p class=\"text-sm text-ink-soft\">\n Code sélectionné : <span class=\"font-medium text-ink\">{{ serviceCode || '—' }}</span>\n </p>",
2365
+ "stack": true,
2366
+ "dark": false
2367
+ },
2368
+ {
2369
+ "sectionTitle": "Option désactivée",
2370
+ "sectionDescription": "« Maternité » est désactivée (optionDisabled).",
2371
+ "code": "<sds-select\n [options]=\"services\"\n optionLabel=\"name\"\n optionValue=\"code\"\n optionDisabled=\"disabled\"\n placeholder=\"Choisir un service\"\n/>\n\n// { name: 'Maternité', code: 'MAT', disabled: true }",
2372
+ "runnableExample": "<sds-select\n [options]=\"services\"\n optionLabel=\"name\"\n optionValue=\"code\"\n optionDisabled=\"disabled\"\n placeholder=\"Choisir un service\"\n />",
2373
+ "stack": true,
2374
+ "dark": false
2375
+ },
2376
+ {
2377
+ "sectionTitle": "Désactivé",
2378
+ "sectionDescription": null,
2379
+ "code": "<sds-select [options]=\"roles\" placeholder=\"Indisponible\" disabled />",
2380
+ "runnableExample": "<sds-select [options]=\"roles\" placeholder=\"Indisponible\" disabled />",
2381
+ "stack": true,
2382
+ "dark": false
2383
+ }
2384
+ ]
2385
+ },
2386
+ {
2387
+ "className": "SdsShell",
2388
+ "selector": "sds-shell",
2389
+ "kind": "component",
2390
+ "group": "layout",
2391
+ "importName": "SdsShell",
2392
+ "description": "Disposition globale de l'application : une colonne pleine hauteur avec la barre supérieure en haut, puis une rangée contenant la sidebar et le contenu défilant. Vous le voyez à l'œuvre tout autour de cette page.",
2393
+ "overviewDescription": "Disposition globale : barre + sidebar + contenu.",
2394
+ "jsdoc": "App layout shell: a full-height column with the top bar across the top and a\nrow below holding the sidebar and the scrollable main content.",
2395
+ "example": "<sds-shell>\n <sds-topbar sdsTopbar … />\n <sds-sidebar sdsSidebar> … </sds-sidebar>\n <!-- routed page content -->\n <router-outlet />\n</sds-shell>",
2396
+ "cva": false,
2397
+ "usesNgModel": false,
2398
+ "inputs": [],
2399
+ "outputs": [],
2400
+ "exportedTypes": [],
2401
+ "projectionSlots": [
2402
+ "[sdsTopbar]",
2403
+ "[sdsSidebar]"
2404
+ ],
2405
+ "hostBindings": {
2406
+ "class": "block"
2407
+ },
2408
+ "examples": [
2409
+ {
2410
+ "sectionTitle": "Structure",
2411
+ "sectionDescription": "Projetez la barre via [sdsTopbar], la sidebar via [sdsSidebar], et le contenu (souvent un <router-outlet />) dans l'emplacement par défaut.",
2412
+ "code": "<sds-shell>\n <sds-topbar sdsTopbar appName=\"WebApp\" />\n\n <sds-sidebar sdsSidebar>\n <sds-nav-group label=\"Membres\">\n <sds-nav-item icon=\"user-plus\" label=\"Créer un membre\" link=\"/membres/creer\" />\n </sds-nav-group>\n </sds-sidebar>\n\n <router-outlet />\n</sds-shell>",
2413
+ "runnableExample": "<div class=\"w-full overflow-hidden rounded-card border border-border\">\n <div class=\"flex h-8 items-center bg-linear-to-r from-brand-800 via-brand-700 to-brand-600 px-3 text-xs font-semibold text-white\">\n sdsTopbar\n </div>\n <div class=\"flex h-52\">\n <div class=\"flex w-32 items-start justify-center bg-brand-900 p-3 text-xs font-medium text-white/70\">\n sdsSidebar\n </div>\n <div class=\"flex flex-1 items-center justify-center bg-canvas text-xs text-ink-faint\">\n &lt;router-outlet /&gt;\n </div>\n </div>\n </div>",
2414
+ "stack": true,
2415
+ "dark": false
2416
+ }
2417
+ ]
2418
+ },
2419
+ {
2420
+ "className": "SdsSidebar",
2421
+ "selector": "sds-sidebar",
2422
+ "kind": "component",
2423
+ "group": "layout",
2424
+ "importName": "SdsSidebar, SdsNavGroup, SdsNavItem, SidebarStore",
2425
+ "description": "Rail de navigation repliable. Projetez des <sds-nav-group> / <sds-nav-item> et un pied de page via [sdsFooter]. L'état replié est partagé par SidebarStore. Utilisez le bouton en haut du rail pour replier.",
2426
+ "overviewDescription": "Navigation latérale repliable et groupée.",
2427
+ "jsdoc": "Collapsible navigation rail. Project <sds-nav-group>/<sds-nav-item> as the\ndefault content, and pin a footer (e.g. search + version badge) via the\n[sdsFooter] slot. Collapse state is shared through SidebarStore.",
2428
+ "example": "<sds-sidebar>\n <sds-nav-group label=\"Membres\">\n <sds-nav-item icon=\"user-plus\" label=\"Créer un membre\" link=\"/membres/new\" />\n </sds-nav-group>\n <div sdsFooter>…</div>\n</sds-sidebar>",
2429
+ "cva": false,
2430
+ "usesNgModel": false,
2431
+ "inputs": [
2432
+ {
2433
+ "name": "collapseLabel",
2434
+ "type": "string",
2435
+ "default": "'Replier le menu'",
2436
+ "required": false,
2437
+ "transform": null,
2438
+ "alias": null,
2439
+ "jsdoc": "Accessible names for the rail's three icon-only controls. French defaults keep existing consumers\nunchanged; a multilingual app must pass translated values, since an icon-only button's aria-label\nis its only name."
2440
+ },
2441
+ {
2442
+ "name": "expandLabel",
2443
+ "type": "string",
2444
+ "default": "'Déplier le menu'",
2445
+ "required": false,
2446
+ "transform": null,
2447
+ "alias": null,
2448
+ "jsdoc": null
2449
+ },
2450
+ {
2451
+ "name": "closeLabel",
2452
+ "type": "string",
2453
+ "default": "'Fermer le menu'",
2454
+ "required": false,
2455
+ "transform": null,
2456
+ "alias": null,
2457
+ "jsdoc": null
2458
+ }
2459
+ ],
2460
+ "outputs": [],
2461
+ "exportedTypes": [],
2462
+ "projectionSlots": [
2463
+ "[sdsFooter]"
2464
+ ],
2465
+ "hostBindings": {
2466
+ "class": "block h-full"
2467
+ },
2468
+ "examples": [
2469
+ {
2470
+ "sectionTitle": "Navigation",
2471
+ "sectionDescription": "Les items acceptent [link] (routerLink avec état actif automatique) ; ici active est défini manuellement pour la démo.",
2472
+ "code": "<sds-sidebar>\n <sds-nav-group>\n <sds-nav-item icon=\"home\" label=\"Accueil\" link=\"/\" exact />\n </sds-nav-group>\n\n <sds-nav-group label=\"Membres\">\n <sds-nav-item icon=\"user-plus\" label=\"Créer un membre\" link=\"/membres/creer\" />\n <sds-nav-item icon=\"building-2\" label=\"Recherche Occupants\" link=\"/membres/occupants\" />\n </sds-nav-group>\n\n <div sdsFooter>\n <sds-badge variant=\"warning\" dot>TEST V.1.0.0</sds-badge>\n </div>\n</sds-sidebar>",
2473
+ "runnableExample": "<div class=\"h-[460px] w-fit overflow-hidden rounded-card border border-border\">\n <sds-sidebar>\n <sds-nav-group>\n <sds-nav-item icon=\"home\" label=\"Accueil\" active />\n </sds-nav-group>\n\n <sds-nav-group label=\"Membres\">\n <sds-nav-item icon=\"user-plus\" label=\"Créer un membre\" />\n <sds-nav-item icon=\"building-2\" label=\"Recherche Occupants\" />\n </sds-nav-group>\n\n <sds-nav-group label=\"Dotations\">\n <sds-nav-item icon=\"package-plus\" label=\"Créer une dotation\" />\n <sds-nav-item icon=\"rotate-ccw\" label=\"Retour de dotation\" />\n </sds-nav-group>\n\n <div sdsFooter>\n <sds-badge variant=\"warning\" dot>TEST V.1.0.0</sds-badge>\n </div>\n </sds-sidebar>\n </div>",
2474
+ "stack": true,
2475
+ "dark": false
2476
+ }
2477
+ ]
2478
+ },
2479
+ {
2480
+ "className": "SdsTab",
2481
+ "selector": "sds-tab",
2482
+ "kind": "component",
2483
+ "group": "data",
2484
+ "importName": "SdsTab",
2485
+ "description": null,
2486
+ "overviewDescription": null,
2487
+ "jsdoc": "A single tab header (role=\"tab\"). Project the label and, optionally, an\n<sds-icon> for an icon + text header. Set [disabled] to make it unselectable.",
2488
+ "example": null,
2489
+ "cva": false,
2490
+ "usesNgModel": false,
2491
+ "inputs": [
2492
+ {
2493
+ "name": "value",
2494
+ "type": "SdsTabValue",
2495
+ "default": null,
2496
+ "required": true,
2497
+ "transform": null,
2498
+ "alias": null,
2499
+ "jsdoc": null
2500
+ },
2501
+ {
2502
+ "name": "disabled",
2503
+ "type": "boolean",
2504
+ "default": "false",
2505
+ "required": false,
2506
+ "transform": "booleanAttribute",
2507
+ "alias": null,
2508
+ "jsdoc": null
2509
+ }
2510
+ ],
2511
+ "outputs": [],
2512
+ "exportedTypes": [],
2513
+ "projectionSlots": [],
2514
+ "hostBindings": {
2515
+ "class": "contents"
2516
+ },
2517
+ "examples": []
2518
+ },
2519
+ {
2520
+ "className": "SdsTable",
2521
+ "selector": "sds-table",
2522
+ "kind": "component",
2523
+ "group": "data",
2524
+ "importName": "SdsTable, SdsTableCell",
2525
+ "description": "Tableau de données côté client : tri, pagination (réutilise sds-paginator), recherche globale, sélection simple/multiple, modèles de cellules personnalisés, états de chargement/vide et variantes visuelles. Activez « lazy » pour déléguer tri/filtre/pagination au parent via (lazyLoad).",
2526
+ "overviewDescription": "Tableau : tri, pagination, filtre, sélection, cellules.",
2527
+ "jsdoc": "Client-side data table mirroring PrimeNG's table, scoped to a strong local\nfeature set: sorting, pagination (reuses {@link SdsPaginator}), global filter,\nsingle/multiple selection, custom cell templates (via {@link SdsTableCell}),\nloading/empty states and visual variants. Set `lazy` to delegate\nsort/filter/paging to the host through `(lazyLoad)`.",
2528
+ "example": "<sds-table [value]=\"staff\" [columns]=\"cols\" dataKey=\"id\"\n sortable paginator [rows]=\"10\" globalFilter\n selectionMode=\"multiple\" [(selection)]=\"selected\">\n <ng-template sdsCell=\"statut\" let-value let-row=\"row\">\n <sds-badge [variant]=\"row.actif ? 'success' : 'neutral'\">{{ value }}</sds-badge>\n </ng-template>\n</sds-table>",
2529
+ "cva": false,
2530
+ "usesNgModel": false,
2531
+ "inputs": [
2532
+ {
2533
+ "name": "value",
2534
+ "type": "readonly any[]",
2535
+ "default": "[]",
2536
+ "required": false,
2537
+ "transform": null,
2538
+ "alias": null,
2539
+ "jsdoc": null
2540
+ },
2541
+ {
2542
+ "name": "columns",
2543
+ "type": "SdsTableColumn[]",
2544
+ "default": "[]",
2545
+ "required": false,
2546
+ "transform": null,
2547
+ "alias": null,
2548
+ "jsdoc": null
2549
+ },
2550
+ {
2551
+ "name": "dataKey",
2552
+ "type": "string",
2553
+ "default": "''",
2554
+ "required": false,
2555
+ "transform": null,
2556
+ "alias": null,
2557
+ "jsdoc": null
2558
+ },
2559
+ {
2560
+ "name": "size",
2561
+ "type": "SdsTableSize",
2562
+ "default": "'md'",
2563
+ "required": false,
2564
+ "transform": null,
2565
+ "alias": null,
2566
+ "jsdoc": null
2567
+ },
2568
+ {
2569
+ "name": "striped",
2570
+ "type": "boolean",
2571
+ "default": "false",
2572
+ "required": false,
2573
+ "transform": "booleanAttribute",
2574
+ "alias": null,
2575
+ "jsdoc": null
2576
+ },
2577
+ {
2578
+ "name": "gridlines",
2579
+ "type": "boolean",
2580
+ "default": "false",
2581
+ "required": false,
2582
+ "transform": "booleanAttribute",
2583
+ "alias": null,
2584
+ "jsdoc": null
2585
+ },
2586
+ {
2587
+ "name": "hoverable",
2588
+ "type": "boolean",
2589
+ "default": "true",
2590
+ "required": false,
2591
+ "transform": "booleanAttribute",
2592
+ "alias": null,
2593
+ "jsdoc": null
2594
+ },
2595
+ {
2596
+ "name": "sortable",
2597
+ "type": "boolean",
2598
+ "default": "true",
2599
+ "required": false,
2600
+ "transform": "booleanAttribute",
2601
+ "alias": null,
2602
+ "jsdoc": "Master sort switch; per-column `sortable` is still required."
2603
+ },
2604
+ {
2605
+ "name": "paginator",
2606
+ "type": "boolean",
2607
+ "default": "false",
2608
+ "required": false,
2609
+ "transform": "booleanAttribute",
2610
+ "alias": null,
2611
+ "jsdoc": null
2612
+ },
2613
+ {
2614
+ "name": "rows",
2615
+ "type": "number",
2616
+ "default": "10",
2617
+ "required": false,
2618
+ "transform": "numberAttribute",
2619
+ "alias": null,
2620
+ "jsdoc": null
2621
+ },
2622
+ {
2623
+ "name": "rowsPerPageOptions",
2624
+ "type": "number[]",
2625
+ "default": "[10, 20, 50]",
2626
+ "required": false,
2627
+ "transform": null,
2628
+ "alias": null,
2629
+ "jsdoc": null
2630
+ },
2631
+ {
2632
+ "name": "showCurrentPageReport",
2633
+ "type": "boolean",
2634
+ "default": "true",
2635
+ "required": false,
2636
+ "transform": "booleanAttribute",
2637
+ "alias": null,
2638
+ "jsdoc": null
2639
+ },
2640
+ {
2641
+ "name": "globalFilter",
2642
+ "type": "boolean",
2643
+ "default": "false",
2644
+ "required": false,
2645
+ "transform": "booleanAttribute",
2646
+ "alias": null,
2647
+ "jsdoc": null
2648
+ },
2649
+ {
2650
+ "name": "globalFilterPlaceholder",
2651
+ "type": "string",
2652
+ "default": "'Rechercher…'",
2653
+ "required": false,
2654
+ "transform": null,
2655
+ "alias": null,
2656
+ "jsdoc": null
2657
+ },
2658
+ {
2659
+ "name": "globalFilterAriaLabel",
2660
+ "type": "string",
2661
+ "default": "'Rechercher dans le tableau'",
2662
+ "required": false,
2663
+ "transform": null,
2664
+ "alias": null,
2665
+ "jsdoc": "Accessible name for the global-filter input."
2666
+ },
2667
+ {
2668
+ "name": "globalFilterFields",
2669
+ "type": "string[]",
2670
+ "default": "[]",
2671
+ "required": false,
2672
+ "transform": null,
2673
+ "alias": null,
2674
+ "jsdoc": "Fields searched by the global filter. Empty = every column field."
2675
+ },
2676
+ {
2677
+ "name": "selectionMode",
2678
+ "type": "SdsSelectionMode",
2679
+ "default": "null",
2680
+ "required": false,
2681
+ "transform": null,
2682
+ "alias": null,
2683
+ "jsdoc": null
2684
+ },
2685
+ {
2686
+ "name": "selection",
2687
+ "type": "any",
2688
+ "default": "null",
2689
+ "required": false,
2690
+ "transform": null,
2691
+ "alias": null,
2692
+ "jsdoc": "Two-way: a single row (single mode) or an array of rows (multiple)."
2693
+ },
2694
+ {
2695
+ "name": "loading",
2696
+ "type": "boolean",
2697
+ "default": "false",
2698
+ "required": false,
2699
+ "transform": "booleanAttribute",
2700
+ "alias": null,
2701
+ "jsdoc": null
2702
+ },
2703
+ {
2704
+ "name": "emptyMessage",
2705
+ "type": "string",
2706
+ "default": "'Aucune donnée'",
2707
+ "required": false,
2708
+ "transform": null,
2709
+ "alias": null,
2710
+ "jsdoc": null
2711
+ },
2712
+ {
2713
+ "name": "caption",
2714
+ "type": "string",
2715
+ "default": "''",
2716
+ "required": false,
2717
+ "transform": null,
2718
+ "alias": null,
2719
+ "jsdoc": null
2720
+ },
2721
+ {
2722
+ "name": "ariaLabel",
2723
+ "type": "string",
2724
+ "default": "'Tableau de données'",
2725
+ "required": false,
2726
+ "transform": null,
2727
+ "alias": null,
2728
+ "jsdoc": "Fallback accessible name for the `<table>` when no `caption` is set."
2729
+ },
2730
+ {
2731
+ "name": "scrollHeight",
2732
+ "type": "string",
2733
+ "default": "''",
2734
+ "required": false,
2735
+ "transform": null,
2736
+ "alias": null,
2737
+ "jsdoc": "When set, the body scrolls vertically with a sticky header, e.g. `'320px'`."
2738
+ },
2739
+ {
2740
+ "name": "lazy",
2741
+ "type": "boolean",
2742
+ "default": "false",
2743
+ "required": false,
2744
+ "transform": "booleanAttribute",
2745
+ "alias": null,
2746
+ "jsdoc": "When true: skip internal sort/filter/slice; emit (lazyLoad) instead."
2747
+ },
2748
+ {
2749
+ "name": "totalRecords",
2750
+ "type": "number",
2751
+ "default": "0",
2752
+ "required": false,
2753
+ "transform": "numberAttribute",
2754
+ "alias": null,
2755
+ "jsdoc": "Total records for the paginator when `lazy`."
2756
+ },
2757
+ {
2758
+ "name": "expandable",
2759
+ "type": "boolean",
2760
+ "default": "false",
2761
+ "required": false,
2762
+ "transform": "booleanAttribute",
2763
+ "alias": null,
2764
+ "jsdoc": "Adds a leading expander column; details come from `<ng-template sdsRowExpansion>`."
2765
+ },
2766
+ {
2767
+ "name": "resizableColumns",
2768
+ "type": "boolean",
2769
+ "default": "false",
2770
+ "required": false,
2771
+ "transform": "booleanAttribute",
2772
+ "alias": null,
2773
+ "jsdoc": "Drag the right edge of a column header to resize it."
2774
+ },
2775
+ {
2776
+ "name": "reorderableColumns",
2777
+ "type": "boolean",
2778
+ "default": "false",
2779
+ "required": false,
2780
+ "transform": "booleanAttribute",
2781
+ "alias": null,
2782
+ "jsdoc": "Drag a column header to reorder columns."
2783
+ }
2784
+ ],
2785
+ "outputs": [
2786
+ {
2787
+ "name": "selectionChange",
2788
+ "type": "any",
2789
+ "fromModel": true
2790
+ },
2791
+ {
2792
+ "name": "sortChange",
2793
+ "type": "SdsTableSortEvent",
2794
+ "fromModel": false
2795
+ },
2796
+ {
2797
+ "name": "pageChange",
2798
+ "type": "SdsPaginatorState",
2799
+ "fromModel": false
2800
+ },
2801
+ {
2802
+ "name": "rowSelect",
2803
+ "type": "any",
2804
+ "fromModel": false
2805
+ },
2806
+ {
2807
+ "name": "rowUnselect",
2808
+ "type": "any",
2809
+ "fromModel": false
2810
+ },
2811
+ {
2812
+ "name": "lazyLoad",
2813
+ "type": "SdsTableLazyEvent",
2814
+ "fromModel": false
2815
+ },
2816
+ {
2817
+ "name": "rowClick",
2818
+ "type": "any",
2819
+ "fromModel": false
2820
+ },
2821
+ {
2822
+ "name": "rowExpand",
2823
+ "type": "any",
2824
+ "fromModel": false
2825
+ },
2826
+ {
2827
+ "name": "rowCollapse",
2828
+ "type": "any",
2829
+ "fromModel": false
2830
+ },
2831
+ {
2832
+ "name": "colReorder",
2833
+ "type": "{ field: string; fromIndex: number; toIndex: number }",
2834
+ "fromModel": false
2835
+ }
2836
+ ],
2837
+ "exportedTypes": [
2838
+ {
2839
+ "name": "SdsTableSize",
2840
+ "kind": "union",
2841
+ "body": "'sm' | 'md' | 'lg'"
2842
+ },
2843
+ {
2844
+ "name": "SdsSortOrder",
2845
+ "kind": "union",
2846
+ "body": "1 | -1 | 0"
2847
+ },
2848
+ {
2849
+ "name": "SdsTableColumn",
2850
+ "kind": "interface",
2851
+ "body": "interface SdsTableColumn { /** Row field rendered in this column. Supports dot-paths. */ field: string; /** Header label. */ header: string; /** Allow sorting on this column (also requires the table's `sortable`). */ sortable?: boolean; /** Text alignment for header + body cells. */ align?: 'left' | 'center' | 'right'; /** Fixed column width, e.g. `'120px'` or `'20%'`. */ width?: string; }"
2852
+ },
2853
+ {
2854
+ "name": "SdsTableSortEvent",
2855
+ "kind": "interface",
2856
+ "body": "interface SdsTableSortEvent { field: string; order: SdsSortOrder; }"
2857
+ },
2858
+ {
2859
+ "name": "SdsTableLazyEvent",
2860
+ "kind": "interface",
2861
+ "body": "interface SdsTableLazyEvent { first: number; rows: number; sortField: string | null; sortOrder: SdsSortOrder; globalFilter: string; }"
2862
+ }
2863
+ ],
2864
+ "projectionSlots": [],
2865
+ "hostBindings": {
2866
+ "class": "block"
2867
+ },
2868
+ "examples": [
2869
+ {
2870
+ "sectionTitle": "Basique",
2871
+ "sectionDescription": "Données (value) et configuration des colonnes (columns).",
2872
+ "code": "<sds-table [value]=\"staff\" [columns]=\"columns\" />\n\n// columns = [\n// { field: 'nom', header: 'Nom' },\n// { field: 'service', header: 'Service' },\n// { field: 'role', header: 'Rôle' },\n// { field: 'statut', header: 'Statut' },\n// ];",
2873
+ "runnableExample": "<sds-table [value]=\"staff\" [columns]=\"columns\" />",
2874
+ "stack": true,
2875
+ "dark": false
2876
+ },
2877
+ {
2878
+ "sectionTitle": "Tri",
2879
+ "sectionDescription": "Colonnes triables : clic pour cycler croissant → décroissant → aucun.",
2880
+ "code": "<sds-table [value]=\"staff\" [columns]=\"sortableColumns\" sortable />\n\n// { field: 'nom', header: 'Nom', sortable: true }, …",
2881
+ "runnableExample": "<sds-table [value]=\"staff\" [columns]=\"sortableColumns\" sortable />",
2882
+ "stack": true,
2883
+ "dark": false
2884
+ },
2885
+ {
2886
+ "sectionTitle": "Pagination",
2887
+ "sectionDescription": "paginator + rows + rowsPerPageOptions + showCurrentPageReport.",
2888
+ "code": "<sds-table\n [value]=\"staff\"\n [columns]=\"columns\"\n paginator\n [rows]=\"5\"\n [rowsPerPageOptions]=\"[5, 10, 20]\"\n showCurrentPageReport\n/>",
2889
+ "runnableExample": "<sds-table\n [value]=\"staff\"\n [columns]=\"columns\"\n paginator\n [rows]=\"5\"\n [rowsPerPageOptions]=\"[5, 10, 20]\"\n showCurrentPageReport\n />",
2890
+ "stack": true,
2891
+ "dark": false
2892
+ },
2893
+ {
2894
+ "sectionTitle": "Recherche globale",
2895
+ "sectionDescription": "Filtre toutes les colonnes (ou globalFilterFields).",
2896
+ "code": "<sds-table\n [value]=\"staff\"\n [columns]=\"sortableColumns\"\n sortable\n globalFilter\n paginator\n [rows]=\"5\"\n globalFilterPlaceholder=\"Rechercher un membre…\"\n/>",
2897
+ "runnableExample": "<sds-table\n [value]=\"staff\"\n [columns]=\"sortableColumns\"\n sortable\n globalFilter\n paginator\n [rows]=\"5\"\n globalFilterPlaceholder=\"Rechercher un membre…\"\n />",
2898
+ "stack": true,
2899
+ "dark": false
2900
+ },
2901
+ {
2902
+ "sectionTitle": "Sélection multiple",
2903
+ "sectionDescription": "selectionMode='multiple', dataKey='id', [(selection)].",
2904
+ "code": "<sds-table\n [value]=\"staff\"\n [columns]=\"columns\"\n dataKey=\"id\"\n selectionMode=\"multiple\"\n [(selection)]=\"selected\"\n paginator\n [rows]=\"5\"\n/>\n<p>Sélection : {{ selected.length }} ligne(s)</p>",
2905
+ "runnableExample": "<sds-table\n [value]=\"staff\"\n [columns]=\"columns\"\n dataKey=\"id\"\n selectionMode=\"multiple\"\n [(selection)]=\"selected\"\n paginator\n [rows]=\"5\"\n />\n <p class=\"text-sm text-ink-soft\">\n Sélection :\n <span class=\"font-medium text-ink\">{{ selected.length }}</span> ligne(s)\n </p>",
2906
+ "stack": true,
2907
+ "dark": false
2908
+ },
2909
+ {
2910
+ "sectionTitle": "Cellules personnalisées",
2911
+ "sectionDescription": "Modèles via <ng-template sdsCell=…> : un badge de statut et une colonne d'actions.",
2912
+ "code": "<sds-table [value]=\"staff\" [columns]=\"templateColumns\" dataKey=\"id\">\n <ng-template sdsCell=\"statut\" let-value let-row=\"row\">\n <sds-badge [variant]=\"statutVariant(row.statut)\">{{ value }}</sds-badge>\n </ng-template>\n\n <ng-template sdsCell=\"dispo\" let-value>\n @if (value) {\n <span class=\"inline-flex items-center gap-1 text-success\">\n <sds-icon name=\"check\" [size]=\"16\" /> Disponible\n </span>\n } @else {\n <span class=\"inline-flex items-center gap-1 text-ink-faint\">\n <sds-icon name=\"x\" [size]=\"16\" /> Non\n </span>\n }\n </ng-template>\n\n <ng-template sdsCell=\"actions\" let-row=\"row\">\n <div class=\"flex justify-end gap-2\">\n <sds-button size=\"sm\" variant=\"secondary\" (click)=\"edit(row)\">Modifier</sds-button>\n <sds-button size=\"sm\" variant=\"ghost\" (click)=\"remove(row)\">Supprimer</sds-button>\n </div>\n </ng-template>\n</sds-table>\n\n// templateColumns inclut { field: 'actions', header: '', align: 'right' }",
2913
+ "runnableExample": "<sds-table [value]=\"staff\" [columns]=\"templateColumns\" dataKey=\"id\">\n <ng-template sdsCell=\"statut\" let-value let-row=\"row\">\n <sds-badge [variant]=\"statutVariant(row.statut)\">{{ value }}</sds-badge>\n </ng-template>\n\n <ng-template sdsCell=\"dispo\" let-value>\n @if (value) {\n <span class=\"inline-flex items-center gap-1 text-success\">\n <sds-icon name=\"check\" [size]=\"16\" /> Disponible\n </span>\n } @else {\n <span class=\"inline-flex items-center gap-1 text-ink-faint\">\n <sds-icon name=\"x\" [size]=\"16\" /> Non\n </span>\n }\n </ng-template>\n\n <ng-template sdsCell=\"actions\" let-row=\"row\">\n <div class=\"flex justify-end gap-2\">\n <sds-button size=\"sm\" variant=\"secondary\" (click)=\"edit(row)\">Modifier</sds-button>\n <sds-button size=\"sm\" variant=\"ghost\" (click)=\"remove(row)\">Supprimer</sds-button>\n </div>\n </ng-template>\n </sds-table>",
2914
+ "stack": true,
2915
+ "dark": false
2916
+ },
2917
+ {
2918
+ "sectionTitle": "Variantes",
2919
+ "sectionDescription": "striped, gridlines et tailles (sm / md / lg).",
2920
+ "code": "<sds-table\n [value]=\"staff\"\n [columns]=\"columns\"\n striped\n gridlines\n size=\"sm\"\n/>",
2921
+ "runnableExample": "<sds-table [value]=\"staff.slice(0, 5)\" [columns]=\"columns\" striped gridlines size=\"sm\" />",
2922
+ "stack": true,
2923
+ "dark": false
2924
+ },
2925
+ {
2926
+ "sectionTitle": "États",
2927
+ "sectionDescription": "Chargement (overlay) et tableau vide.",
2928
+ "code": "<!-- Chargement -->\n<sds-table [value]=\"staff\" [columns]=\"columns\" [loading]=\"loading()\" />\n\n<!-- Vide -->\n<sds-table [value]=\"[]\" [columns]=\"columns\" emptyMessage=\"Aucun membre du personnel\" />",
2929
+ "runnableExample": "<div class=\"flex items-center gap-3\">\n <sds-button size=\"sm\" variant=\"secondary\" (click)=\"toggleLoading()\">\n {{ loading() ? 'Arrêter' : 'Simuler le chargement' }}\n </sds-button>\n </div>\n <sds-table [value]=\"staff.slice(0, 5)\" [columns]=\"columns\" [loading]=\"loading()\" />\n\n <p class=\"text-sm font-medium text-ink-soft\">Tableau vide :</p>\n <sds-table [value]=\"[]\" [columns]=\"columns\" emptyMessage=\"Aucun membre du personnel\" />",
2930
+ "stack": true,
2931
+ "dark": false
2932
+ },
2933
+ {
2934
+ "sectionTitle": "Lignes extensibles",
2935
+ "sectionDescription": "expandable + <ng-template sdsRowExpansion> : cliquez le chevron pour afficher le détail d'un membre.",
2936
+ "code": "<sds-table [value]=\"staff\" [columns]=\"columns\" dataKey=\"id\" expandable>\n <ng-template sdsRowExpansion let-row>\n <div class=\"flex items-center gap-6 text-sm text-ink-soft\">\n <span>\n <sds-icon name=\"calendar\" [size]=\"16\" /> Embauché le {{ row.embauche }}\n </span>\n <sds-badge [variant]=\"statutVariant(row.statut)\">{{ row.statut }}</sds-badge>\n </div>\n </ng-template>\n</sds-table>\n\n// (rowExpand)/(rowCollapse) émettent la ligne concernée.",
2937
+ "runnableExample": "<sds-table [value]=\"staff.slice(0, 6)\" [columns]=\"columns\" dataKey=\"id\" expandable>\n <ng-template sdsRowExpansion let-row>\n <div class=\"flex flex-wrap items-center gap-x-6 gap-y-2 text-sm text-ink-soft\">\n <span class=\"inline-flex items-center gap-1.5\">\n <sds-icon name=\"calendar\" [size]=\"16\" class=\"text-ink-faint\" />\n Embauché le <span class=\"font-medium text-ink\">{{ row.embauche }}</span>\n </span>\n <span class=\"inline-flex items-center gap-1.5\">\n <sds-icon name=\"building-2\" [size]=\"16\" class=\"text-ink-faint\" />\n <span class=\"font-medium text-ink\">{{ row.service }}</span>\n </span>\n <sds-badge [variant]=\"statutVariant(row.statut)\">{{ row.statut }}</sds-badge>\n @if (row.dispo) {\n <sds-badge variant=\"success\">Disponible</sds-badge>\n } @else {\n <sds-badge variant=\"neutral\">Indisponible</sds-badge>\n }\n </div>\n </ng-template>\n </sds-table>",
2938
+ "stack": true,
2939
+ "dark": false
2940
+ },
2941
+ {
2942
+ "sectionTitle": "Colonnes redimensionnables",
2943
+ "sectionDescription": "resizableColumns : glissez le bord droit d'un en-tête pour ajuster sa largeur.",
2944
+ "code": "<sds-table\n [value]=\"staff\"\n [columns]=\"sortableColumns\"\n sortable\n resizableColumns\n/>\n\n<!-- Glissez le bord droit d'un en-tête pour le redimensionner. -->",
2945
+ "runnableExample": "<sds-table [value]=\"staff.slice(0, 6)\" [columns]=\"sortableColumns\" sortable resizableColumns />",
2946
+ "stack": true,
2947
+ "dark": false
2948
+ },
2949
+ {
2950
+ "sectionTitle": "Colonnes réordonnables",
2951
+ "sectionDescription": "reorderableColumns : glissez un en-tête de colonne pour le déplacer.",
2952
+ "code": "<sds-table\n [value]=\"staff\"\n [columns]=\"sortableColumns\"\n sortable\n reorderableColumns\n (colReorder)=\"onReorder($event)\"\n/>\n\n<!-- Glissez un en-tête de colonne pour le déplacer. -->",
2953
+ "runnableExample": "<sds-table\n [value]=\"staff.slice(0, 6)\"\n [columns]=\"sortableColumns\"\n sortable\n reorderableColumns\n />",
2954
+ "stack": true,
2955
+ "dark": false
2956
+ },
2957
+ {
2958
+ "sectionTitle": "Données serveur (lazy)",
2959
+ "sectionDescription": "lazy + totalRecords + loading : tri/filtre/pagination délégués au parent via (lazyLoad). Ici un faux backend (setTimeout) sur les mêmes données.",
2960
+ "code": "<sds-table\n [value]=\"lazyRows()\"\n [columns]=\"sortableColumns\"\n lazy\n [totalRecords]=\"lazyTotal()\"\n [loading]=\"lazyLoading()\"\n paginator\n [rows]=\"5\"\n [rowsPerPageOptions]=\"[5, 10]\"\n sortable\n globalFilter\n (lazyLoad)=\"onLazyLoad($event)\"\n/>\n\n// loadLazy(e) { setTimeout(() => { /* filtre -> tri -> slice */ }, 600); }",
2961
+ "runnableExample": "<sds-table\n [value]=\"lazyRows()\"\n [columns]=\"sortableColumns\"\n lazy\n [totalRecords]=\"lazyTotal()\"\n [loading]=\"lazyLoading()\"\n paginator\n [rows]=\"5\"\n [rowsPerPageOptions]=\"[5, 10]\"\n sortable\n globalFilter\n globalFilterPlaceholder=\"Rechercher (côté serveur)…\"\n (lazyLoad)=\"onLazyLoad($event)\"\n />",
2962
+ "stack": true,
2963
+ "dark": false
2964
+ }
2965
+ ]
2966
+ },
2967
+ {
2968
+ "className": "SdsTabList",
2969
+ "selector": "sds-tab-list",
2970
+ "kind": "component",
2971
+ "group": "data",
2972
+ "importName": "SdsTabList",
2973
+ "description": null,
2974
+ "overviewDescription": null,
2975
+ "jsdoc": "Container (role=\"tablist\") for the <sds-tab> headers. Renders the bottom rule\nand handles roving-focus keyboard navigation (Arrow keys, Home, End) with\nautomatic activation.",
2976
+ "example": null,
2977
+ "cva": false,
2978
+ "usesNgModel": false,
2979
+ "inputs": [],
2980
+ "outputs": [],
2981
+ "exportedTypes": [],
2982
+ "projectionSlots": [],
2983
+ "hostBindings": {
2984
+ "role": "tablist",
2985
+ "[class]": "listClass()",
2986
+ "(keydown)": "onKeydown($event)"
2987
+ },
2988
+ "examples": []
2989
+ },
2990
+ {
2991
+ "className": "SdsTabPanel",
2992
+ "selector": "sds-tab-panel",
2993
+ "kind": "component",
2994
+ "group": "data",
2995
+ "importName": "SdsTabPanel",
2996
+ "description": null,
2997
+ "overviewDescription": null,
2998
+ "jsdoc": "Content for one tab (role=\"tabpanel\"); shown only while its [value] matches\nthe active tab. Inactive panels are not rendered (their content is created\non activation), so panel state does not persist across switches.",
2999
+ "example": null,
3000
+ "cva": false,
3001
+ "usesNgModel": false,
3002
+ "inputs": [
3003
+ {
3004
+ "name": "value",
3005
+ "type": "SdsTabValue",
3006
+ "default": null,
3007
+ "required": true,
3008
+ "transform": null,
3009
+ "alias": null,
3010
+ "jsdoc": null
3011
+ }
3012
+ ],
3013
+ "outputs": [],
3014
+ "exportedTypes": [],
3015
+ "projectionSlots": [],
3016
+ "hostBindings": {
3017
+ "class": "block"
3018
+ },
3019
+ "examples": []
3020
+ },
3021
+ {
3022
+ "className": "SdsTabPanels",
3023
+ "selector": "sds-tab-panels",
3024
+ "kind": "component",
3025
+ "group": "data",
3026
+ "importName": "SdsTabPanels",
3027
+ "description": null,
3028
+ "overviewDescription": null,
3029
+ "jsdoc": "Wrapper for the <sds-tab-panel> content blocks of a tab set.",
3030
+ "example": null,
3031
+ "cva": false,
3032
+ "usesNgModel": false,
3033
+ "inputs": [],
3034
+ "outputs": [],
3035
+ "exportedTypes": [],
3036
+ "projectionSlots": [],
3037
+ "hostBindings": {
3038
+ "class": "block"
3039
+ },
3040
+ "examples": []
3041
+ },
3042
+ {
3043
+ "className": "SdsTabs",
3044
+ "selector": "sds-tabs",
3045
+ "kind": "component",
3046
+ "group": "data",
3047
+ "importName": "SdsTabs, SdsTabList, SdsTab, SdsTabPanels, SdsTabPanel",
3048
+ "description": "Onglets composables. <sds-tabs> coordonne <sds-tab-list> (en-têtes) et <sds-tab-panels> (contenus) ; l'onglet actif est la valeur [value], appariée par [value] sur chaque <sds-tab> / <sds-tab-panel>. Liaison bidirectionnelle [(value)], en-têtes avec icônes, défilement horizontal et navigation clavier (flèches, Début, Fin).",
3049
+ "overviewDescription": "Onglets composables : icônes, défilement et navigation clavier.",
3050
+ "jsdoc": "Root of a tab set. Compose with <sds-tab-list> (headers) and <sds-tab-panels>\n(content). The active tab is the [value], matched against each <sds-tab> /\n<sds-tab-panel> [value]; it is two-way bindable via [(value)]. When omitted,\nthe first registered tab is selected.",
3051
+ "example": "<sds-tabs [(value)]=\"active\">\n <sds-tab-list>\n <sds-tab value=\"0\">Détails</sds-tab>\n <sds-tab value=\"1\">Historique</sds-tab>\n </sds-tab-list>\n <sds-tab-panels>\n <sds-tab-panel value=\"0\">…</sds-tab-panel>\n <sds-tab-panel value=\"1\">…</sds-tab-panel>\n </sds-tab-panels>\n</sds-tabs>",
3052
+ "cva": false,
3053
+ "usesNgModel": false,
3054
+ "inputs": [
3055
+ {
3056
+ "name": "value",
3057
+ "type": "SdsTabValue",
3058
+ "default": "null",
3059
+ "required": false,
3060
+ "transform": null,
3061
+ "alias": null,
3062
+ "jsdoc": "Value of the active tab (two-way)."
3063
+ },
3064
+ {
3065
+ "name": "scrollable",
3066
+ "type": "boolean",
3067
+ "default": "false",
3068
+ "required": false,
3069
+ "transform": "booleanAttribute",
3070
+ "alias": null,
3071
+ "jsdoc": "Let the tab list scroll horizontally instead of overflowing."
3072
+ }
3073
+ ],
3074
+ "outputs": [
3075
+ {
3076
+ "name": "valueChange",
3077
+ "type": "SdsTabValue",
3078
+ "fromModel": true
3079
+ }
3080
+ ],
3081
+ "exportedTypes": [],
3082
+ "projectionSlots": [],
3083
+ "hostBindings": {
3084
+ "class": "block"
3085
+ },
3086
+ "examples": [
3087
+ {
3088
+ "sectionTitle": "Basique",
3089
+ "sectionDescription": "Le premier onglet est sélectionné par défaut.",
3090
+ "code": "<sds-tabs value=\"0\">\n <sds-tab-list>\n <sds-tab value=\"0\">Détails</sds-tab>\n <sds-tab value=\"1\">Historique</sds-tab>\n <sds-tab value=\"2\">Documents</sds-tab>\n </sds-tab-list>\n <sds-tab-panels>\n <sds-tab-panel value=\"0\">…</sds-tab-panel>\n <sds-tab-panel value=\"1\">…</sds-tab-panel>\n <sds-tab-panel value=\"2\">…</sds-tab-panel>\n </sds-tab-panels>\n</sds-tabs>",
3091
+ "runnableExample": "<sds-tabs value=\"0\">\n <sds-tab-list>\n <sds-tab value=\"0\">Détails</sds-tab>\n <sds-tab value=\"1\">Historique</sds-tab>\n <sds-tab value=\"2\">Documents</sds-tab>\n </sds-tab-list>\n <sds-tab-panels>\n <sds-tab-panel value=\"0\">\n <p class=\"text-sm leading-relaxed text-ink-soft\">\n Informations générales du dossier patient : identité, service et\n médecin référent.\n </p>\n </sds-tab-panel>\n <sds-tab-panel value=\"1\">\n <p class=\"text-sm leading-relaxed text-ink-soft\">\n Historique des admissions, consultations et actes réalisés.\n </p>\n </sds-tab-panel>\n <sds-tab-panel value=\"2\">\n <p class=\"text-sm leading-relaxed text-ink-soft\">\n Comptes rendus, ordonnances et résultats d'examens téléversés.\n </p>\n </sds-tab-panel>\n </sds-tab-panels>\n </sds-tabs>",
3092
+ "stack": true,
3093
+ "dark": false
3094
+ },
3095
+ {
3096
+ "sectionTitle": "En-têtes avec icônes",
3097
+ "sectionDescription": "Projetez un <sds-icon> dans l'en-tête.",
3098
+ "code": "<sds-tabs value=\"overview\">\n <sds-tab-list>\n <sds-tab value=\"overview\"><sds-icon name=\"book-open\" [size]=\"16\" /> Vue d'ensemble</sds-tab>\n <sds-tab value=\"team\"><sds-icon name=\"users\" [size]=\"16\" /> Équipe</sds-tab>\n <sds-tab value=\"settings\"><sds-icon name=\"settings\" [size]=\"16\" /> Paramètres</sds-tab>\n </sds-tab-list>\n <sds-tab-panels>…</sds-tab-panels>\n</sds-tabs>",
3099
+ "runnableExample": "<sds-tabs value=\"overview\">\n <sds-tab-list>\n <sds-tab value=\"overview\"><sds-icon name=\"book-open\" [size]=\"16\" /> Vue d'ensemble</sds-tab>\n <sds-tab value=\"team\"><sds-icon name=\"users\" [size]=\"16\" /> Équipe</sds-tab>\n <sds-tab value=\"settings\"><sds-icon name=\"settings\" [size]=\"16\" /> Paramètres</sds-tab>\n </sds-tab-list>\n <sds-tab-panels>\n <sds-tab-panel value=\"overview\">\n <p class=\"text-sm leading-relaxed text-ink-soft\">Synthèse de l'unité de soins.</p>\n </sds-tab-panel>\n <sds-tab-panel value=\"team\">\n <p class=\"text-sm leading-relaxed text-ink-soft\">Membres de l'équipe et plannings.</p>\n </sds-tab-panel>\n <sds-tab-panel value=\"settings\">\n <p class=\"text-sm leading-relaxed text-ink-soft\">Préférences et droits d'accès.</p>\n </sds-tab-panel>\n </sds-tab-panels>\n </sds-tabs>",
3100
+ "stack": true,
3101
+ "dark": false
3102
+ },
3103
+ {
3104
+ "sectionTitle": "Onglet désactivé",
3105
+ "sectionDescription": null,
3106
+ "code": "<sds-tabs value=\"0\">\n <sds-tab-list>\n <sds-tab value=\"0\">Actif</sds-tab>\n <sds-tab value=\"1\" disabled>Indisponible</sds-tab>\n <sds-tab value=\"2\">Archives</sds-tab>\n </sds-tab-list>\n <sds-tab-panels>…</sds-tab-panels>\n</sds-tabs>",
3107
+ "runnableExample": "<sds-tabs value=\"0\">\n <sds-tab-list>\n <sds-tab value=\"0\">Actif</sds-tab>\n <sds-tab value=\"1\" disabled>Indisponible</sds-tab>\n <sds-tab value=\"2\">Archives</sds-tab>\n </sds-tab-list>\n <sds-tab-panels>\n <sds-tab-panel value=\"0\">\n <p class=\"text-sm leading-relaxed text-ink-soft\">Contenu de l'onglet actif.</p>\n </sds-tab-panel>\n <sds-tab-panel value=\"2\">\n <p class=\"text-sm leading-relaxed text-ink-soft\">Contenu des archives.</p>\n </sds-tab-panel>\n </sds-tab-panels>\n </sds-tabs>",
3108
+ "stack": true,
3109
+ "dark": false
3110
+ },
3111
+ {
3112
+ "sectionTitle": "Défilement",
3113
+ "sectionDescription": "scrollable garde les en-têtes sur une seule ligne avec défilement horizontal.",
3114
+ "code": "<sds-tabs value=\"s1\" scrollable>\n <sds-tab-list>\n @for (s of services; track s) {\n <sds-tab [value]=\"s.value\">{{ s.title }}</sds-tab>\n }\n </sds-tab-list>\n <sds-tab-panels>\n @for (s of services; track s) {\n <sds-tab-panel [value]=\"s.value\">…</sds-tab-panel>\n }\n </sds-tab-panels>\n</sds-tabs>",
3115
+ "runnableExample": "<sds-tabs value=\"s1\" scrollable>\n <sds-tab-list>\n @for (s of services; track s) {\n <sds-tab [value]=\"s.value\">{{ s.title }}</sds-tab>\n }\n </sds-tab-list>\n <sds-tab-panels>\n @for (s of services; track s) {\n <sds-tab-panel [value]=\"s.value\">\n <p class=\"text-sm leading-relaxed text-ink-soft\">Service : {{ s.title }}</p>\n </sds-tab-panel>\n }\n </sds-tab-panels>\n </sds-tabs>",
3116
+ "stack": true,
3117
+ "dark": false
3118
+ },
3119
+ {
3120
+ "sectionTitle": "Contrôlé (two-way)",
3121
+ "sectionDescription": "Liaison [(value)] vers un signal ; pilotable depuis l'extérieur.",
3122
+ "code": "<sds-button (click)=\"active.set('a')\">Aller à A</sds-button>\n<sds-button (click)=\"active.set('c')\">Aller à C</sds-button>\n\n<sds-tabs [(value)]=\"active\">\n <sds-tab-list>\n <sds-tab value=\"a\">Onglet A</sds-tab>\n <sds-tab value=\"b\">Onglet B</sds-tab>\n <sds-tab value=\"c\">Onglet C</sds-tab>\n </sds-tab-list>\n <sds-tab-panels>…</sds-tab-panels>\n</sds-tabs>\n\n// active = signal<SdsTabValue>('a');",
3123
+ "runnableExample": "<div class=\"flex flex-wrap items-center gap-2\">\n <sds-button size=\"sm\" variant=\"secondary\" (click)=\"active.set('a')\">Aller à A</sds-button>\n <sds-button size=\"sm\" variant=\"secondary\" (click)=\"active.set('c')\">Aller à C</sds-button>\n <span class=\"text-sm text-ink-soft\">\n Onglet actif : <span class=\"font-medium text-ink\">{{ active() }}</span>\n </span>\n </div>\n\n <sds-tabs [(value)]=\"active\">\n <sds-tab-list>\n <sds-tab value=\"a\">Onglet A</sds-tab>\n <sds-tab value=\"b\">Onglet B</sds-tab>\n <sds-tab value=\"c\">Onglet C</sds-tab>\n </sds-tab-list>\n <sds-tab-panels>\n <sds-tab-panel value=\"a\"><p class=\"text-sm text-ink-soft\">Panneau A</p></sds-tab-panel>\n <sds-tab-panel value=\"b\"><p class=\"text-sm text-ink-soft\">Panneau B</p></sds-tab-panel>\n <sds-tab-panel value=\"c\"><p class=\"text-sm text-ink-soft\">Panneau C</p></sds-tab-panel>\n </sds-tab-panels>\n </sds-tabs>",
3124
+ "stack": true,
3125
+ "dark": false
3126
+ },
3127
+ {
3128
+ "sectionTitle": "Onglets dynamiques",
3129
+ "sectionDescription": "Générez en-têtes et panneaux avec @for.",
3130
+ "code": "<sds-tabs [value]=\"dynamicTabs[0].value\">\n <sds-tab-list>\n @for (t of dynamicTabs; track t.value) {\n <sds-tab [value]=\"t.value\">{{ t.title }}</sds-tab>\n }\n </sds-tab-list>\n <sds-tab-panels>\n @for (t of dynamicTabs; track t.value) {\n <sds-tab-panel [value]=\"t.value\">{{ t.body }}</sds-tab-panel>\n }\n </sds-tab-panels>\n</sds-tabs>",
3131
+ "runnableExample": "<sds-tabs [value]=\"dynamicTabs[0].value\">\n <sds-tab-list>\n @for (t of dynamicTabs; track t.value) {\n <sds-tab [value]=\"t.value\">{{ t.title }}</sds-tab>\n }\n </sds-tab-list>\n <sds-tab-panels>\n @for (t of dynamicTabs; track t.value) {\n <sds-tab-panel [value]=\"t.value\">\n <p class=\"text-sm leading-relaxed text-ink-soft\">{{ t.body }}</p>\n </sds-tab-panel>\n }\n </sds-tab-panels>\n </sds-tabs>",
3132
+ "stack": true,
3133
+ "dark": false
3134
+ }
3135
+ ]
3136
+ },
3137
+ {
3138
+ "className": "SdsTextarea",
3139
+ "selector": "sds-textarea",
3140
+ "kind": "component",
3141
+ "group": "form",
3142
+ "importName": "SdsTextarea",
3143
+ "description": "Champ de saisie multiligne avec label, aide, erreur, tailles, redimensionnement automatique et compteur de caractères. Implémente ControlValueAccessor — utilisable avec les formulaires réactifs ou [(ngModel)].",
3144
+ "overviewDescription": "Saisie multiligne : auto-redimensionnement et compteur.",
3145
+ "jsdoc": "Multi-line text field with label, hint/error, character counter and optional\nauto-resize. Implements ControlValueAccessor — use with reactive forms or\n[(ngModel)].",
3146
+ "example": null,
3147
+ "cva": true,
3148
+ "usesNgModel": true,
3149
+ "inputs": [
3150
+ {
3151
+ "name": "label",
3152
+ "type": "string",
3153
+ "default": "''",
3154
+ "required": false,
3155
+ "transform": null,
3156
+ "alias": null,
3157
+ "jsdoc": null
3158
+ },
3159
+ {
3160
+ "name": "ariaLabel",
3161
+ "type": "string",
3162
+ "default": "''",
3163
+ "required": false,
3164
+ "transform": null,
3165
+ "alias": null,
3166
+ "jsdoc": "Accessible name used when no visible [label] is provided."
3167
+ },
3168
+ {
3169
+ "name": "placeholder",
3170
+ "type": "string",
3171
+ "default": "''",
3172
+ "required": false,
3173
+ "transform": null,
3174
+ "alias": null,
3175
+ "jsdoc": null
3176
+ },
3177
+ {
3178
+ "name": "hint",
3179
+ "type": "string",
3180
+ "default": "''",
3181
+ "required": false,
3182
+ "transform": null,
3183
+ "alias": null,
3184
+ "jsdoc": null
3185
+ },
3186
+ {
3187
+ "name": "error",
3188
+ "type": "string",
3189
+ "default": "''",
3190
+ "required": false,
3191
+ "transform": null,
3192
+ "alias": null,
3193
+ "jsdoc": null
3194
+ },
3195
+ {
3196
+ "name": "size",
3197
+ "type": "SdsTextareaSize",
3198
+ "default": "'md'",
3199
+ "required": false,
3200
+ "transform": null,
3201
+ "alias": null,
3202
+ "jsdoc": null
3203
+ },
3204
+ {
3205
+ "name": "disabled",
3206
+ "type": "boolean",
3207
+ "default": "false",
3208
+ "required": false,
3209
+ "transform": "booleanAttribute",
3210
+ "alias": null,
3211
+ "jsdoc": null
3212
+ },
3213
+ {
3214
+ "name": "readonly",
3215
+ "type": "boolean",
3216
+ "default": "false",
3217
+ "required": false,
3218
+ "transform": "booleanAttribute",
3219
+ "alias": null,
3220
+ "jsdoc": null
3221
+ },
3222
+ {
3223
+ "name": "required",
3224
+ "type": "boolean",
3225
+ "default": "false",
3226
+ "required": false,
3227
+ "transform": "booleanAttribute",
3228
+ "alias": null,
3229
+ "jsdoc": null
3230
+ },
3231
+ {
3232
+ "name": "rows",
3233
+ "type": "number",
3234
+ "default": "3",
3235
+ "required": false,
3236
+ "transform": "numberAttribute",
3237
+ "alias": null,
3238
+ "jsdoc": "Minimum visible rows."
3239
+ },
3240
+ {
3241
+ "name": "autoResize",
3242
+ "type": "boolean",
3243
+ "default": "false",
3244
+ "required": false,
3245
+ "transform": "booleanAttribute",
3246
+ "alias": null,
3247
+ "jsdoc": "Grow the field to fit its content as the user types."
3248
+ },
3249
+ {
3250
+ "name": "maxLength",
3251
+ "type": "number",
3252
+ "default": "0",
3253
+ "required": false,
3254
+ "transform": "numberAttribute",
3255
+ "alias": null,
3256
+ "jsdoc": "Hard character cap; 0 means no limit."
3257
+ },
3258
+ {
3259
+ "name": "showCount",
3260
+ "type": "boolean",
3261
+ "default": "false",
3262
+ "required": false,
3263
+ "transform": "booleanAttribute",
3264
+ "alias": null,
3265
+ "jsdoc": "Show a character counter row."
3266
+ },
3267
+ {
3268
+ "name": "resize",
3269
+ "type": "SdsTextareaResize",
3270
+ "default": "'vertical'",
3271
+ "required": false,
3272
+ "transform": null,
3273
+ "alias": null,
3274
+ "jsdoc": null
3275
+ }
3276
+ ],
3277
+ "outputs": [],
3278
+ "exportedTypes": [
3279
+ {
3280
+ "name": "SdsTextareaSize",
3281
+ "kind": "union",
3282
+ "body": "'sm' | 'md' | 'lg'"
3283
+ },
3284
+ {
3285
+ "name": "SdsTextareaResize",
3286
+ "kind": "union",
3287
+ "body": "'none' | 'vertical' | 'both'"
3288
+ }
3289
+ ],
3290
+ "projectionSlots": [],
3291
+ "hostBindings": {
3292
+ "class": "block"
3293
+ },
3294
+ "examples": [
3295
+ {
3296
+ "sectionTitle": "Basique",
3297
+ "sectionDescription": null,
3298
+ "code": "<sds-textarea\n label=\"Motif d'admission\"\n placeholder=\"Décrivez le motif de l'admission du patient…\"\n/>",
3299
+ "runnableExample": "<sds-textarea\n label=\"Motif d'admission\"\n placeholder=\"Décrivez le motif de l'admission du patient…\"\n />",
3300
+ "stack": true,
3301
+ "dark": false
3302
+ },
3303
+ {
3304
+ "sectionTitle": "Avec aide",
3305
+ "sectionDescription": null,
3306
+ "code": "<sds-textarea\n label=\"Consignes de soins\"\n placeholder=\"Ex. surveillance tensionnelle toutes les 4 h…\"\n hint=\"Visible par l'ensemble de l'équipe soignante du service.\"\n/>",
3307
+ "runnableExample": "<sds-textarea\n label=\"Consignes de soins\"\n placeholder=\"Ex. surveillance tensionnelle toutes les 4 h…\"\n hint=\"Visible par l'ensemble de l'équipe soignante du service.\"\n />",
3308
+ "stack": true,
3309
+ "dark": false
3310
+ },
3311
+ {
3312
+ "sectionTitle": "Lignes (rows)",
3313
+ "sectionDescription": "Définit le nombre minimal de lignes visibles.",
3314
+ "code": "<sds-textarea\n label=\"Compte rendu d'intervention\"\n placeholder=\"Saisissez le compte rendu complet…\"\n [rows]=\"6\"\n/>",
3315
+ "runnableExample": "<sds-textarea\n label=\"Compte rendu d'intervention\"\n placeholder=\"Saisissez le compte rendu complet…\"\n [rows]=\"6\"\n />",
3316
+ "stack": true,
3317
+ "dark": false
3318
+ },
3319
+ {
3320
+ "sectionTitle": "Redimensionnement auto",
3321
+ "sectionDescription": "Le champ s'agrandit automatiquement au fil de la saisie.",
3322
+ "code": "<sds-textarea\n label=\"Transmissions infirmières\"\n placeholder=\"Ajoutez vos transmissions…\"\n autoResize\n [rows]=\"2\"\n/>",
3323
+ "runnableExample": "<sds-textarea\n label=\"Transmissions infirmières\"\n placeholder=\"Ajoutez vos transmissions…\"\n autoResize\n [rows]=\"2\"\n />",
3324
+ "stack": true,
3325
+ "dark": false
3326
+ },
3327
+ {
3328
+ "sectionTitle": "Compteur de caractères",
3329
+ "sectionDescription": "Affiche le nombre de caractères saisis, avec une limite optionnelle.",
3330
+ "code": "<sds-textarea\n label=\"Note de synthèse\"\n placeholder=\"280 caractères maximum…\"\n [maxLength]=\"280\"\n showCount\n [(ngModel)]=\"summary\"\n/>\n<p>Longueur : {{ summary.length }} caractère(s)</p>",
3331
+ "runnableExample": "<sds-textarea\n label=\"Note de synthèse\"\n placeholder=\"280 caractères maximum…\"\n [maxLength]=\"280\"\n showCount\n [(ngModel)]=\"summary\"\n />\n <p class=\"text-sm text-ink-soft\">\n Longueur : <span class=\"font-medium text-ink\">{{ summary.length }}</span>\n caractère(s)\n </p>",
3332
+ "stack": true,
3333
+ "dark": false
3334
+ },
3335
+ {
3336
+ "sectionTitle": "Erreur / requis",
3337
+ "sectionDescription": null,
3338
+ "code": "<sds-textarea\n label=\"Allergies connues\"\n placeholder=\"Listez les allergies du patient…\"\n required\n [error]=\"'Ce champ est obligatoire avant validation du dossier.'\"\n/>",
3339
+ "runnableExample": "<sds-textarea\n label=\"Allergies connues\"\n placeholder=\"Listez les allergies du patient…\"\n required\n [error]=\"'Ce champ est obligatoire avant validation du dossier.'\"\n />",
3340
+ "stack": true,
3341
+ "dark": false
3342
+ },
3343
+ {
3344
+ "sectionTitle": "Désactivé",
3345
+ "sectionDescription": null,
3346
+ "code": "<sds-textarea\n label=\"Antécédents (verrouillés)\"\n placeholder=\"Renseignés par le médecin référent.\"\n disabled\n/>",
3347
+ "runnableExample": "<sds-textarea\n label=\"Antécédents (verrouillés)\"\n placeholder=\"Renseignés par le médecin référent.\"\n disabled\n />",
3348
+ "stack": true,
3349
+ "dark": false
3350
+ },
3351
+ {
3352
+ "sectionTitle": "Tailles",
3353
+ "sectionDescription": null,
3354
+ "code": "<sds-textarea size=\"sm\" label=\"Petit (sm)\" placeholder=\"Observation courte…\" />\n<sds-textarea size=\"md\" label=\"Moyen (md)\" placeholder=\"Observation…\" />\n<sds-textarea size=\"lg\" label=\"Grand (lg)\" placeholder=\"Observation détaillée…\" />",
3355
+ "runnableExample": "<sds-textarea size=\"sm\" label=\"Petit (sm)\" placeholder=\"Observation courte…\" />\n <sds-textarea size=\"md\" label=\"Moyen (md)\" placeholder=\"Observation…\" />\n <sds-textarea size=\"lg\" label=\"Grand (lg)\" placeholder=\"Observation détaillée…\" />",
3356
+ "stack": true,
3357
+ "dark": false
3358
+ }
3359
+ ]
3360
+ },
3361
+ {
3362
+ "className": "SdsToggleSwitch",
3363
+ "selector": "sds-toggle-switch",
3364
+ "kind": "component",
3365
+ "group": "form",
3366
+ "importName": "SdsToggleSwitch",
3367
+ "description": "Interrupteur on/off avec label optionnel, tailles, icônes sur le bouton, valeurs personnalisées, aide et erreur. Implémente ControlValueAccessor — utilisable avec les formulaires réactifs ou [(ngModel)].",
3368
+ "overviewDescription": "Interrupteur on/off : tailles, icônes et valeurs.",
3369
+ "jsdoc": "On/off switch styled as a sliding toggle. Implements ControlValueAccessor —\nuse with reactive forms or [(ngModel)]. Supports an optional visible label,\ncustom `trueValue`/`falseValue`, and optional knob icons for the on/off\nstates.",
3370
+ "example": null,
3371
+ "cva": true,
3372
+ "usesNgModel": true,
3373
+ "inputs": [
3374
+ {
3375
+ "name": "label",
3376
+ "type": "string",
3377
+ "default": "''",
3378
+ "required": false,
3379
+ "transform": null,
3380
+ "alias": null,
3381
+ "jsdoc": null
3382
+ },
3383
+ {
3384
+ "name": "ariaLabel",
3385
+ "type": "string",
3386
+ "default": "''",
3387
+ "required": false,
3388
+ "transform": null,
3389
+ "alias": null,
3390
+ "jsdoc": "Accessible name used when no visible [label] is provided."
3391
+ },
3392
+ {
3393
+ "name": "size",
3394
+ "type": "SdsToggleSwitchSize",
3395
+ "default": "'md'",
3396
+ "required": false,
3397
+ "transform": null,
3398
+ "alias": null,
3399
+ "jsdoc": null
3400
+ },
3401
+ {
3402
+ "name": "disabled",
3403
+ "type": "boolean",
3404
+ "default": "false",
3405
+ "required": false,
3406
+ "transform": "booleanAttribute",
3407
+ "alias": null,
3408
+ "jsdoc": null
3409
+ },
3410
+ {
3411
+ "name": "required",
3412
+ "type": "boolean",
3413
+ "default": "false",
3414
+ "required": false,
3415
+ "transform": "booleanAttribute",
3416
+ "alias": null,
3417
+ "jsdoc": null
3418
+ },
3419
+ {
3420
+ "name": "trueValue",
3421
+ "type": "unknown",
3422
+ "default": "true",
3423
+ "required": false,
3424
+ "transform": null,
3425
+ "alias": null,
3426
+ "jsdoc": "Value emitted/stored when the switch is on."
3427
+ },
3428
+ {
3429
+ "name": "falseValue",
3430
+ "type": "unknown",
3431
+ "default": "false",
3432
+ "required": false,
3433
+ "transform": null,
3434
+ "alias": null,
3435
+ "jsdoc": "Value emitted/stored when the switch is off."
3436
+ },
3437
+ {
3438
+ "name": "onIcon",
3439
+ "type": "SdsIconName | null",
3440
+ "default": "null",
3441
+ "required": false,
3442
+ "transform": null,
3443
+ "alias": null,
3444
+ "jsdoc": "Icon shown on the knob when checked."
3445
+ },
3446
+ {
3447
+ "name": "offIcon",
3448
+ "type": "SdsIconName | null",
3449
+ "default": "null",
3450
+ "required": false,
3451
+ "transform": null,
3452
+ "alias": null,
3453
+ "jsdoc": "Icon shown on the knob when unchecked."
3454
+ },
3455
+ {
3456
+ "name": "hint",
3457
+ "type": "string",
3458
+ "default": "''",
3459
+ "required": false,
3460
+ "transform": null,
3461
+ "alias": null,
3462
+ "jsdoc": null
3463
+ },
3464
+ {
3465
+ "name": "error",
3466
+ "type": "string",
3467
+ "default": "''",
3468
+ "required": false,
3469
+ "transform": null,
3470
+ "alias": null,
3471
+ "jsdoc": null
3472
+ }
3473
+ ],
3474
+ "outputs": [],
3475
+ "exportedTypes": [
3476
+ {
3477
+ "name": "SdsToggleSwitchSize",
3478
+ "kind": "union",
3479
+ "body": "'sm' | 'md' | 'lg'"
3480
+ }
3481
+ ],
3482
+ "projectionSlots": [],
3483
+ "hostBindings": {
3484
+ "class": "block"
3485
+ },
3486
+ "examples": [
3487
+ {
3488
+ "sectionTitle": "Basique",
3489
+ "sectionDescription": "Un interrupteur sans label visible (fournir un ariaLabel pour l'accessibilité).",
3490
+ "code": "<sds-toggle-switch ariaLabel=\"Activer les notifications\" />",
3491
+ "runnableExample": "<sds-toggle-switch ariaLabel=\"Activer les notifications\" />",
3492
+ "stack": true,
3493
+ "dark": false
3494
+ },
3495
+ {
3496
+ "sectionTitle": "Avec label",
3497
+ "sectionDescription": "Le label est cliquable et bascule l'interrupteur.",
3498
+ "code": "<sds-toggle-switch label=\"Recevoir les alertes de garde\" />",
3499
+ "runnableExample": "<sds-toggle-switch label=\"Recevoir les alertes de garde\" />",
3500
+ "stack": true,
3501
+ "dark": false
3502
+ },
3503
+ {
3504
+ "sectionTitle": "Tailles",
3505
+ "sectionDescription": null,
3506
+ "code": "<sds-toggle-switch size=\"sm\" label=\"Petit (sm)\" />\n<sds-toggle-switch size=\"md\" label=\"Moyen (md)\" />\n<sds-toggle-switch size=\"lg\" label=\"Grand (lg)\" />",
3507
+ "runnableExample": "<sds-toggle-switch size=\"sm\" label=\"Petit (sm)\" />\n <sds-toggle-switch size=\"md\" label=\"Moyen (md)\" />\n <sds-toggle-switch size=\"lg\" label=\"Grand (lg)\" />",
3508
+ "stack": true,
3509
+ "dark": false
3510
+ },
3511
+ {
3512
+ "sectionTitle": "Avec icônes",
3513
+ "sectionDescription": "Affiche une icône sur le bouton selon l'état (onIcon / offIcon).",
3514
+ "code": "<sds-toggle-switch\n label=\"Disponibilité de l'agent\"\n onIcon=\"check\"\n offIcon=\"x\"\n [(ngModel)]=\"available\"\n/>",
3515
+ "runnableExample": "<sds-toggle-switch\n label=\"Disponibilité de l'agent\"\n onIcon=\"check\"\n offIcon=\"x\"\n [(ngModel)]=\"available\"\n />",
3516
+ "stack": true,
3517
+ "dark": false
3518
+ },
3519
+ {
3520
+ "sectionTitle": "Valeurs personnalisées",
3521
+ "sectionDescription": "trueValue / falseValue stockent une valeur autre que les booléens.",
3522
+ "code": "<sds-toggle-switch\n label=\"Statut du lit\"\n [trueValue]=\"'actif'\"\n [falseValue]=\"'inactif'\"\n [(ngModel)]=\"bedStatus\"\n/>\n<p>Statut : {{ bedStatus }}</p>\n\n// bedStatus = 'actif';",
3523
+ "runnableExample": "<sds-toggle-switch\n label=\"Statut du lit\"\n [trueValue]=\"'actif'\"\n [falseValue]=\"'inactif'\"\n [(ngModel)]=\"bedStatus\"\n />\n <p class=\"text-sm text-ink-soft\">\n Statut : <span class=\"font-medium text-ink\">{{ bedStatus }}</span>\n </p>",
3524
+ "stack": true,
3525
+ "dark": false
3526
+ },
3527
+ {
3528
+ "sectionTitle": "Désactivé",
3529
+ "sectionDescription": null,
3530
+ "code": "<sds-toggle-switch label=\"Mode maintenance\" disabled />\n<sds-toggle-switch\n label=\"Synchronisation automatique\"\n disabled\n [ngModel]=\"true\"\n/>",
3531
+ "runnableExample": "<sds-toggle-switch label=\"Mode maintenance\" disabled />\n <sds-toggle-switch\n label=\"Synchronisation automatique\"\n disabled\n [ngModel]=\"true\"\n />",
3532
+ "stack": true,
3533
+ "dark": false
3534
+ },
3535
+ {
3536
+ "sectionTitle": "Lié au modèle (ngModel)",
3537
+ "sectionDescription": null,
3538
+ "code": "<sds-toggle-switch\n label=\"Afficher les agents en congé\"\n hint=\"Inclut les soignants absents dans le planning.\"\n [(ngModel)]=\"showOnLeave\"\n/>\n<p>Valeur : {{ showOnLeave ? 'true' : 'false' }}</p>",
3539
+ "runnableExample": "<sds-toggle-switch\n label=\"Afficher les agents en congé\"\n hint=\"Inclut les soignants absents dans le planning.\"\n [(ngModel)]=\"showOnLeave\"\n />\n <p class=\"text-sm text-ink-soft\">\n Valeur :\n <span class=\"font-medium text-ink\">{{ showOnLeave ? 'true' : 'false' }}</span>\n </p>",
3540
+ "stack": true,
3541
+ "dark": false
3542
+ }
3543
+ ]
3544
+ },
3545
+ {
3546
+ "className": "SdsTopbar",
3547
+ "selector": "sds-topbar",
3548
+ "kind": "component",
3549
+ "group": "layout",
3550
+ "importName": "SdsTopbar",
3551
+ "description": "Barre supérieure de l'application : dégradé de marque avec vague décorative, emplacement logo, nom de l'application et emplacement [sdsActions] libre à droite.",
3552
+ "overviewDescription": "Barre supérieure de l'application avec marque et utilisateur.",
3553
+ "jsdoc": "Application top bar: a logo slot, the app name, and three slots the app fills.\n\nTwo appearances. `brand` is the gradient-and-wave bar an internal tool wants. `surface` is white on\na hairline border, for a bar that has to sit under a customer-facing page without dominating it —\na storefront header is a bar, but it is not a banner. The slots and the layout are identical in\nboth; only the paint differs, so a consumer app gets the same structure without the brand fill.\n\nIt deliberately owns NO account UI. It used to render the signed-in user and a logout button, which\nforced every consumer into one shape — no dropdown, no email, no menu, no busy state, and an\nicon-only button whose accessible name the library had to guess a language for. What an app needs\nbeside its own brand bar differs per app, so the bar supplies the surface and the app supplies the\ncontents: project them into `[sdsActions]`.\n\nSlots, left to right: `[sdsLogo]`, `[sdsLead]` (beside the name — a location or workspace picker),\n`[sdsCenter]` (the flexible middle — a search field), `[sdsActions]` (the right edge).",
3554
+ "example": "<sds-topbar appName=\"WebApp\">\n <img sdsLogo src=\"logo.svg\" alt=\"\" />\n <my-address-picker sdsLead />\n <my-search sdsCenter />\n <my-account-menu sdsActions />\n</sds-topbar>",
3555
+ "cva": false,
3556
+ "usesNgModel": false,
3557
+ "inputs": [
3558
+ {
3559
+ "name": "appName",
3560
+ "type": "string",
3561
+ "default": "''",
3562
+ "required": false,
3563
+ "transform": null,
3564
+ "alias": null,
3565
+ "jsdoc": null
3566
+ },
3567
+ {
3568
+ "name": "contentWidth",
3569
+ "type": "string",
3570
+ "default": "'w-full'",
3571
+ "required": false,
3572
+ "transform": null,
3573
+ "alias": null,
3574
+ "jsdoc": "Width of the bar's CONTENTS, as Tailwind width utilities — e.g. `\"w-full max-w-7xl\"`.\n\nThe coloured band always spans the viewport; this constrains only what sits on it, so the logo and\nthe actions line up with a page whose own content is centred at the same width. Default is empty,\ni.e. contents run edge to edge, which is right for a full-bleed dashboard shell.\n\nA class string rather than an enum on purpose: apps already state their content width as a Tailwind\nutility, and this way the bar is given the SAME string rather than a name that has to be kept in\nsync with it."
3575
+ },
3576
+ {
3577
+ "name": "menuButton",
3578
+ "type": "boolean",
3579
+ "default": "true",
3580
+ "required": false,
3581
+ "transform": "booleanAttribute",
3582
+ "alias": null,
3583
+ "jsdoc": "Show the mobile hamburger that toggles the sidebar drawer (< lg)."
3584
+ },
3585
+ {
3586
+ "name": "menuLabel",
3587
+ "type": "string",
3588
+ "default": "'Ouvrir le menu'",
3589
+ "required": false,
3590
+ "transform": null,
3591
+ "alias": null,
3592
+ "jsdoc": "Accessible name for the hamburger. Defaults to French so nothing changes for existing consumers,\nbut any app serving more than one language MUST pass a translated value — an icon-only control's\naria-label is its only name, and a hardcoded one is simply wrong in every other locale."
3593
+ },
3594
+ {
3595
+ "name": "appearance",
3596
+ "type": "SdsTopbarAppearance",
3597
+ "default": "'brand'",
3598
+ "required": false,
3599
+ "transform": null,
3600
+ "alias": null,
3601
+ "jsdoc": "`brand` (default) paints the gradient and the wave; `surface` is white on a hairline border."
3602
+ }
3603
+ ],
3604
+ "outputs": [],
3605
+ "exportedTypes": [
3606
+ {
3607
+ "name": "SdsTopbarAppearance",
3608
+ "kind": "union",
3609
+ "body": "'brand' | 'surface'"
3610
+ }
3611
+ ],
3612
+ "projectionSlots": [
3613
+ "[sdsLogo]",
3614
+ "[sdsLead]",
3615
+ "[sdsCenter]",
3616
+ "[sdsActions]"
3617
+ ],
3618
+ "hostBindings": {
3619
+ "class": "block"
3620
+ },
3621
+ "examples": [
3622
+ {
3623
+ "sectionTitle": "Complète",
3624
+ "sectionDescription": "Logo ([sdsLogo]), nom d'application, et contenu libre à droite ([sdsActions]). La barre ne fournit aucune UI de compte : chaque application projette la sienne.",
3625
+ "code": "<sds-topbar appName=\"WebApp\">\n <img sdsLogo src=\"showcase-logo.svg\" alt=\"Saitech\" class=\"h-11 w-auto\" />\n\n <!-- Anything the app wants on the right: menu, avatar, notifications, language… -->\n <div sdsActions class=\"flex items-center gap-3\">\n <sds-avatar name=\"AIT SAID Souhail\" initials=\"AS\" [size]=\"38\" bgClass=\"bg-white/15\" />\n </div>\n</sds-topbar>",
3626
+ "runnableExample": "<div class=\"w-full overflow-hidden rounded-card border border-border\">\n <sds-topbar appName=\"WebApp\">\n <img sdsLogo src=\"showcase-logo.svg\" alt=\"Saitech\" class=\"h-11 w-auto\" />\n <div sdsActions class=\"flex items-center gap-3\">\n <span class=\"hidden text-sm font-medium sm:block\">{{ user.name }}</span>\n <sds-avatar [name]=\"user.name\" [initials]=\"user.initials\" [size]=\"38\" bgClass=\"bg-white/15\" />\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-9 items-center justify-center rounded-control text-white/85 hover:bg-white/10 hover:text-white\"\n aria-label=\"Se déconnecter\"\n >\n <sds-icon name=\"log-out\" [size]=\"20\" />\n </button>\n </div>\n </sds-topbar>\n </div>",
3627
+ "stack": true,
3628
+ "dark": false
3629
+ },
3630
+ {
3631
+ "sectionTitle": "Largeur du contenu",
3632
+ "sectionDescription": "[contentWidth] contraint le contenu de la barre (le bandeau reste pleine largeur), pour l'aligner sur une page centrée.",
3633
+ "code": "<!-- Le bandeau reste pleine largeur ; seul son contenu est contraint. -->\n<sds-topbar appName=\"WebApp\" contentWidth=\"w-full max-w-3xl\">\n <img sdsLogo src=\"showcase-logo.svg\" alt=\"Saitech\" class=\"h-11 w-auto\" />\n</sds-topbar>",
3634
+ "runnableExample": "<div class=\"w-full overflow-hidden rounded-card border border-border\">\n <sds-topbar appName=\"WebApp\" contentWidth=\"w-full max-w-3xl\">\n <img sdsLogo src=\"showcase-logo.svg\" alt=\"Saitech\" class=\"h-11 w-auto\" />\n <div sdsActions class=\"flex items-center gap-3\">\n <sds-avatar [name]=\"user.name\" [initials]=\"user.initials\" [size]=\"38\" bgClass=\"bg-white/15\" />\n </div>\n </sds-topbar>\n </div>",
3635
+ "stack": true,
3636
+ "dark": false
3637
+ },
3638
+ {
3639
+ "sectionTitle": "Nom seul",
3640
+ "sectionDescription": "Sans contenu projeté.",
3641
+ "code": "<sds-topbar appName=\"WebApp\" />",
3642
+ "runnableExample": "<div class=\"w-full overflow-hidden rounded-card border border-border\">\n <sds-topbar appName=\"WebApp\" />\n </div>",
3643
+ "stack": true,
3644
+ "dark": false
3645
+ }
3646
+ ]
3647
+ }
3648
+ ],
3649
+ "directives": [
3650
+ {
3651
+ "className": "SdsTableCell",
3652
+ "selector": "ng-template[sdsCell]",
3653
+ "kind": "directive",
3654
+ "group": "data",
3655
+ "importName": "SdsTableCell",
3656
+ "description": null,
3657
+ "overviewDescription": null,
3658
+ "jsdoc": "Supplies a custom cell template for a single table column, matched by its\nfield key. Use as a structural template inside `<sds-table>`:",
3659
+ "example": "<sds-table [value]=\"rows\" [columns]=\"cols\">\n <ng-template sdsCell=\"statut\" let-value let-row=\"row\">\n <sds-badge [variant]=\"row.actif ? 'success' : 'neutral'\">{{ value }}</sds-badge>\n </ng-template>\n</sds-table>",
3660
+ "cva": false,
3661
+ "usesNgModel": false,
3662
+ "inputs": [
3663
+ {
3664
+ "name": "sdsCell",
3665
+ "type": "string",
3666
+ "default": null,
3667
+ "required": true,
3668
+ "transform": null,
3669
+ "alias": "sdsCell",
3670
+ "jsdoc": "The column `field` this template renders."
3671
+ }
3672
+ ],
3673
+ "outputs": [],
3674
+ "exportedTypes": [
3675
+ {
3676
+ "name": "SdsTableCellContext",
3677
+ "kind": "interface",
3678
+ "body": "interface SdsTableCellContext { /** Same as {@link value} — enables the `let-value` (implicit) binding. */ $implicit: unknown; /** Resolved cell value for this column (via the table's getValue). */ value: unknown; /** The full row object. */ row: any; /** The column definition the cell belongs to. */ column: SdsTableColumn; /** Zero-based index of the row within the currently displayed page. */ index: number; }"
3679
+ }
3680
+ ],
3681
+ "projectionSlots": [],
3682
+ "hostBindings": {},
3683
+ "examples": []
3684
+ },
3685
+ {
3686
+ "className": "SdsTableRowExpansion",
3687
+ "selector": "ng-template[sdsRowExpansion]",
3688
+ "kind": "directive",
3689
+ "group": "data",
3690
+ "importName": "SdsTableRowExpansion",
3691
+ "description": null,
3692
+ "overviewDescription": null,
3693
+ "jsdoc": "Supplies the detail template rendered beneath an expanded row when the host\n`<sds-table>` has `expandable`. Use as a structural template inside the table:",
3694
+ "example": "<sds-table [value]=\"rows\" [columns]=\"cols\" expandable>\n <ng-template sdsRowExpansion let-row>\n <div>Détails de {{ row.nom }}</div>\n </ng-template>\n</sds-table>",
3695
+ "cva": false,
3696
+ "usesNgModel": false,
3697
+ "inputs": [],
3698
+ "outputs": [],
3699
+ "exportedTypes": [
3700
+ {
3701
+ "name": "SdsTableRowExpansionContext",
3702
+ "kind": "interface",
3703
+ "body": "interface SdsTableRowExpansionContext { /** Same as {@link row} — enables the `let-row` (implicit) binding. */ $implicit: any; /** The full row object whose details are being shown. */ row: any; /** Zero-based index of the row within the currently displayed page. */ index: number; }"
3704
+ }
3705
+ ],
3706
+ "projectionSlots": [],
3707
+ "hostBindings": {},
3708
+ "examples": []
3709
+ }
3710
+ ],
3711
+ "services": [
3712
+ {
3713
+ "className": "SdsAccordionStore",
3714
+ "providedIn": "component",
3715
+ "exports": [
3716
+ "id",
3717
+ "multiple",
3718
+ "connect()",
3719
+ "isOpen()",
3720
+ "toggle()",
3721
+ "headerId()",
3722
+ "contentId()"
3723
+ ],
3724
+ "jsdoc": "Coordinates a single <sds-accordion>: holds the open value(s) (shared from the\nhost's two-way model), the multiple-open flag, and generates the ARIA ids that\nlink each header to its content region.\n\nProvided at the <sds-accordion> component level so every accordion is isolated."
3725
+ },
3726
+ {
3727
+ "className": "SdsTabsStore",
3728
+ "providedIn": "component",
3729
+ "exports": [
3730
+ "id",
3731
+ "scrollable",
3732
+ "connect()",
3733
+ "activeValue()",
3734
+ "isActive()",
3735
+ "select()",
3736
+ "registerTab()",
3737
+ "unregisterTab()",
3738
+ "tabId()",
3739
+ "panelId()"
3740
+ ],
3741
+ "jsdoc": "Coordinates a single <sds-tabs> instance: holds the active value (shared from\nthe host's two-way model), tracks registered tabs for default selection and\ngenerates the ARIA ids that link each tab to its panel.\n\nProvided at the <sds-tabs> component level so every tab set is isolated."
3742
+ },
3743
+ {
3744
+ "className": "SidebarStore",
3745
+ "providedIn": "root",
3746
+ "exports": [
3747
+ "collapsed",
3748
+ "mobileOpen",
3749
+ "toggle()",
3750
+ "setCollapsed()",
3751
+ "openMobile()",
3752
+ "closeMobile()",
3753
+ "toggleMobile()"
3754
+ ],
3755
+ "jsdoc": "Shared collapse state for the sidebar and its nav items.\n\nProvided in root so the sidebar, projected nav groups/items and any layout\ncode observe a single source of truth without prop-drilling. For apps with\nmultiple independent sidebars, provide it at a component level instead."
3756
+ }
3757
+ ],
3758
+ "icons": {
3759
+ "names": [
3760
+ "alert-circle",
3761
+ "align-left",
3762
+ "arrow-down",
3763
+ "arrow-right",
3764
+ "arrow-up",
3765
+ "arrows-clockwise",
3766
+ "bar-chart-3",
3767
+ "bell",
3768
+ "bike",
3769
+ "book-open",
3770
+ "building-2",
3771
+ "calendar",
3772
+ "chart-column",
3773
+ "check",
3774
+ "check-circle",
3775
+ "chevron-down",
3776
+ "chevron-left",
3777
+ "chevron-right",
3778
+ "chevrons-left",
3779
+ "chevrons-right",
3780
+ "chevrons-up-down",
3781
+ "circle-user",
3782
+ "clipboard-list",
3783
+ "copy",
3784
+ "credit-card",
3785
+ "external-link",
3786
+ "eye",
3787
+ "eye-off",
3788
+ "file-text",
3789
+ "filter",
3790
+ "hand",
3791
+ "hash",
3792
+ "home",
3793
+ "inbox",
3794
+ "info",
3795
+ "languages",
3796
+ "layout-grid",
3797
+ "loader-circle",
3798
+ "log-out",
3799
+ "map-pin",
3800
+ "megaphone",
3801
+ "menu",
3802
+ "monitor",
3803
+ "package",
3804
+ "package-open",
3805
+ "package-plus",
3806
+ "palette",
3807
+ "panel-left",
3808
+ "panel-left-close",
3809
+ "panel-left-open",
3810
+ "panel-top",
3811
+ "panels-top-left",
3812
+ "phone",
3813
+ "refresh-cw",
3814
+ "rotate-ccw",
3815
+ "rows-3",
3816
+ "search",
3817
+ "settings",
3818
+ "square",
3819
+ "store",
3820
+ "table",
3821
+ "tag",
3822
+ "toggle-left",
3823
+ "type",
3824
+ "user",
3825
+ "user-plus",
3826
+ "user-round",
3827
+ "users",
3828
+ "x"
3829
+ ],
3830
+ "outliers": [
3831
+ "hand"
3832
+ ]
3833
+ },
3834
+ "tokens": [
3835
+ {
3836
+ "token": "color-canvas",
3837
+ "family": "surface",
3838
+ "tailwindUtility": "bg-canvas",
3839
+ "cssVar": "var(--color-canvas)",
3840
+ "semanticNote": null
3841
+ },
3842
+ {
3843
+ "token": "color-surface",
3844
+ "family": "surface",
3845
+ "tailwindUtility": "bg-surface",
3846
+ "cssVar": "var(--color-surface)",
3847
+ "semanticNote": null
3848
+ },
3849
+ {
3850
+ "token": "color-muted",
3851
+ "family": "surface",
3852
+ "tailwindUtility": "bg-muted",
3853
+ "cssVar": "var(--color-muted)",
3854
+ "semanticNote": null
3855
+ },
3856
+ {
3857
+ "token": "color-border",
3858
+ "family": "surface",
3859
+ "tailwindUtility": "border-border",
3860
+ "cssVar": "var(--color-border)",
3861
+ "semanticNote": null
3862
+ },
3863
+ {
3864
+ "token": "color-ink",
3865
+ "family": "ink",
3866
+ "tailwindUtility": "text-ink",
3867
+ "cssVar": "var(--color-ink)",
3868
+ "semanticNote": null
3869
+ },
3870
+ {
3871
+ "token": "color-ink-soft",
3872
+ "family": "ink",
3873
+ "tailwindUtility": "text-ink-soft",
3874
+ "cssVar": "var(--color-ink-soft)",
3875
+ "semanticNote": null
3876
+ },
3877
+ {
3878
+ "token": "color-ink-faint",
3879
+ "family": "ink",
3880
+ "tailwindUtility": "text-ink-faint",
3881
+ "cssVar": "var(--color-ink-faint)",
3882
+ "semanticNote": null
3883
+ },
3884
+ {
3885
+ "token": "color-accent-blue",
3886
+ "family": "accent",
3887
+ "tailwindUtility": "bg-accent-blue",
3888
+ "cssVar": "var(--color-accent-blue)",
3889
+ "semanticNote": null
3890
+ },
3891
+ {
3892
+ "token": "color-accent-blue-soft",
3893
+ "family": "accent",
3894
+ "tailwindUtility": "bg-accent-blue-soft",
3895
+ "cssVar": "var(--color-accent-blue-soft)",
3896
+ "semanticNote": null
3897
+ },
3898
+ {
3899
+ "token": "color-accent-green",
3900
+ "family": "accent",
3901
+ "tailwindUtility": "bg-accent-green",
3902
+ "cssVar": "var(--color-accent-green)",
3903
+ "semanticNote": null
3904
+ },
3905
+ {
3906
+ "token": "color-accent-green-soft",
3907
+ "family": "accent",
3908
+ "tailwindUtility": "bg-accent-green-soft",
3909
+ "cssVar": "var(--color-accent-green-soft)",
3910
+ "semanticNote": null
3911
+ },
3912
+ {
3913
+ "token": "color-accent-amber",
3914
+ "family": "accent",
3915
+ "tailwindUtility": "bg-accent-amber",
3916
+ "cssVar": "var(--color-accent-amber)",
3917
+ "semanticNote": null
3918
+ },
3919
+ {
3920
+ "token": "color-accent-amber-soft",
3921
+ "family": "accent",
3922
+ "tailwindUtility": "bg-accent-amber-soft",
3923
+ "cssVar": "var(--color-accent-amber-soft)",
3924
+ "semanticNote": null
3925
+ },
3926
+ {
3927
+ "token": "color-accent-red",
3928
+ "family": "accent",
3929
+ "tailwindUtility": "bg-accent-red",
3930
+ "cssVar": "var(--color-accent-red)",
3931
+ "semanticNote": null
3932
+ },
3933
+ {
3934
+ "token": "color-accent-red-soft",
3935
+ "family": "accent",
3936
+ "tailwindUtility": "bg-accent-red-soft",
3937
+ "cssVar": "var(--color-accent-red-soft)",
3938
+ "semanticNote": null
3939
+ },
3940
+ {
3941
+ "token": "color-accent-indigo",
3942
+ "family": "accent",
3943
+ "tailwindUtility": "bg-accent-indigo",
3944
+ "cssVar": "var(--color-accent-indigo)",
3945
+ "semanticNote": null
3946
+ },
3947
+ {
3948
+ "token": "color-accent-indigo-soft",
3949
+ "family": "accent",
3950
+ "tailwindUtility": "bg-accent-indigo-soft",
3951
+ "cssVar": "var(--color-accent-indigo-soft)",
3952
+ "semanticNote": null
3953
+ },
3954
+ {
3955
+ "token": "color-success",
3956
+ "family": "status",
3957
+ "tailwindUtility": "text-success",
3958
+ "cssVar": "var(--color-success)",
3959
+ "semanticNote": null
3960
+ },
3961
+ {
3962
+ "token": "color-warning",
3963
+ "family": "status",
3964
+ "tailwindUtility": "text-warning",
3965
+ "cssVar": "var(--color-warning)",
3966
+ "semanticNote": null
3967
+ },
3968
+ {
3969
+ "token": "color-danger",
3970
+ "family": "status",
3971
+ "tailwindUtility": "text-danger",
3972
+ "cssVar": "var(--color-danger)",
3973
+ "semanticNote": null
3974
+ },
3975
+ {
3976
+ "token": "radius-control",
3977
+ "family": "radius",
3978
+ "tailwindUtility": "rounded-control",
3979
+ "cssVar": "var(--radius-control)",
3980
+ "semanticNote": null
3981
+ },
3982
+ {
3983
+ "token": "radius-card",
3984
+ "family": "radius",
3985
+ "tailwindUtility": "rounded-card",
3986
+ "cssVar": "var(--radius-card)",
3987
+ "semanticNote": null
3988
+ },
3989
+ {
3990
+ "token": "font-sans",
3991
+ "family": "font",
3992
+ "tailwindUtility": "font-sans",
3993
+ "cssVar": "var(--font-sans)",
3994
+ "semanticNote": null
3995
+ },
3996
+ {
3997
+ "token": "sds-topbar-h",
3998
+ "family": "layout",
3999
+ "tailwindUtility": null,
4000
+ "cssVar": "var(--sds-topbar-h)",
4001
+ "semanticNote": null
4002
+ },
4003
+ {
4004
+ "token": "sds-sidebar-w",
4005
+ "family": "layout",
4006
+ "tailwindUtility": null,
4007
+ "cssVar": "var(--sds-sidebar-w)",
4008
+ "semanticNote": null
4009
+ },
4010
+ {
4011
+ "token": "sds-sidebar-w-collapsed",
4012
+ "family": "layout",
4013
+ "tailwindUtility": null,
4014
+ "cssVar": "var(--sds-sidebar-w-collapsed)",
4015
+ "semanticNote": null
4016
+ },
4017
+ {
4018
+ "token": "color-brand-50",
4019
+ "family": "brand",
4020
+ "tailwindUtility": "bg-brand-50",
4021
+ "cssVar": "var(--color-brand-50)",
4022
+ "semanticNote": null
4023
+ },
4024
+ {
4025
+ "token": "color-brand-100",
4026
+ "family": "brand",
4027
+ "tailwindUtility": "bg-brand-100",
4028
+ "cssVar": "var(--color-brand-100)",
4029
+ "semanticNote": null
4030
+ },
4031
+ {
4032
+ "token": "color-brand-200",
4033
+ "family": "brand",
4034
+ "tailwindUtility": "bg-brand-200",
4035
+ "cssVar": "var(--color-brand-200)",
4036
+ "semanticNote": null
4037
+ },
4038
+ {
4039
+ "token": "color-brand-300",
4040
+ "family": "brand",
4041
+ "tailwindUtility": "bg-brand-300",
4042
+ "cssVar": "var(--color-brand-300)",
4043
+ "semanticNote": null
4044
+ },
4045
+ {
4046
+ "token": "color-brand-400",
4047
+ "family": "brand",
4048
+ "tailwindUtility": "bg-brand-400",
4049
+ "cssVar": "var(--color-brand-400)",
4050
+ "semanticNote": null
4051
+ },
4052
+ {
4053
+ "token": "color-brand-500",
4054
+ "family": "brand",
4055
+ "tailwindUtility": "bg-brand-500",
4056
+ "cssVar": "var(--color-brand-500)",
4057
+ "semanticNote": "active nav highlight"
4058
+ },
4059
+ {
4060
+ "token": "color-brand-600",
4061
+ "family": "brand",
4062
+ "tailwindUtility": "bg-brand-600",
4063
+ "cssVar": "var(--color-brand-600)",
4064
+ "semanticNote": "primary button"
4065
+ },
4066
+ {
4067
+ "token": "color-brand-700",
4068
+ "family": "brand",
4069
+ "tailwindUtility": "bg-brand-700",
4070
+ "cssVar": "var(--color-brand-700)",
4071
+ "semanticNote": "top bar base"
4072
+ },
4073
+ {
4074
+ "token": "color-brand-800",
4075
+ "family": "brand",
4076
+ "tailwindUtility": "bg-brand-800",
4077
+ "cssVar": "var(--color-brand-800)",
4078
+ "semanticNote": null
4079
+ },
4080
+ {
4081
+ "token": "color-brand-900",
4082
+ "family": "brand",
4083
+ "tailwindUtility": "bg-brand-900",
4084
+ "cssVar": "var(--color-brand-900)",
4085
+ "semanticNote": "sidebar background"
4086
+ },
4087
+ {
4088
+ "token": "color-brand-950",
4089
+ "family": "brand",
4090
+ "tailwindUtility": "bg-brand-950",
4091
+ "cssVar": "var(--color-brand-950)",
4092
+ "semanticNote": null
4093
+ }
4094
+ ],
4095
+ "install": {
4096
+ "installCommand": "npm install @besaitech/ng-design-system",
4097
+ "tailwindImport": "@import \"tailwindcss\";",
4098
+ "sourceDirective": "@source \"../node_modules/@besaitech/ng-design-system\"; /* lets Tailwind v4 scan the library templates (it ignores node_modules by default) */",
4099
+ "themeBlock": "@import \"@besaitech/ng-design-system/themes/base.css\"; /* surfaces, ink, accents, status, radius */\n@import \"@besaitech/ng-design-system/themes/saitech.css\"; /* brand ramp — or themes/belvigo.css */",
4100
+ "peerDeps": [
4101
+ "@angular/common ^20.3.0 || ^21.0.0 || ^22.0.0",
4102
+ "@angular/core ^20.3.0 || ^21.0.0 || ^22.0.0",
4103
+ "@angular/forms ^20.3.0 || ^21.0.0 || ^22.0.0",
4104
+ "@angular/platform-browser ^20.3.0 || ^21.0.0 || ^22.0.0",
4105
+ "@angular/router ^20.3.0 || ^21.0.0 || ^22.0.0",
4106
+ "tailwindcss ^4 (required in the consuming app — the package ships NO compiled CSS)"
4107
+ ],
4108
+ "standaloneNote": "All components are standalone — import the class directly into a component's `imports` array (no NgModule). Form controls implement ControlValueAccessor: bind their value with [(ngModel)] (FormsModule) or formControlName (ReactiveFormsModule), never [value]. CRITICAL: the library is styled with Tailwind utilities baked into its templates, so the consuming app must run Tailwind v4 with @import \"tailwindcss\", the @source directive above, and a brand theme preset (@import \"@besaitech/ng-design-system/themes/saitech.css\" or themes/belvigo.css) plus the surface/ink tokens — otherwise components render unstyled. The preset must be imported AFTER @import \"tailwindcss\"."
4109
+ }
4110
+ }