@besaitech/ng-design-system-mcp 0.0.11 → 0.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/data/docs.json +554 -7
  2. package/package.json +1 -1
package/data/docs.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "libraryVersion": "0.0.41",
3
+ "libraryVersion": "0.0.44",
4
4
  "packageName": "@besaitech/ng-design-system",
5
5
  "devImport": "saitech-design-system",
6
- "generatedAt": "2026-09-15T12:45:18.055Z",
7
- "componentCount": 33,
6
+ "generatedAt": "2026-09-20T21:22:32.121Z",
7
+ "componentCount": 34,
8
8
  "components": [
9
9
  {
10
10
  "className": "SdsAccordion",
@@ -1576,6 +1576,405 @@
1576
1576
  }
1577
1577
  ]
1578
1578
  },
1579
+ {
1580
+ "className": "SdsInputNumber",
1581
+ "selector": "sds-input-number",
1582
+ "kind": "component",
1583
+ "group": "form",
1584
+ "importName": "SdsInputNumber",
1585
+ "description": "Champ numérique avec formatage localisé, devise, préfixe/suffixe, bornes min/max/pas et boutons d'incrément. La valeur est un number | null via ControlValueAccessor. Le formatage est appliqué en direct pendant la saisie : symbole monétaire, séparateurs de milliers et affixes restent visibles, et le curseur est préservé.",
1586
+ "overviewDescription": "Saisie numérique : devise, préfixe/suffixe, bornes et incrémenteur.",
1587
+ "jsdoc": "Numeric input with locale-aware formatting, optional currency, prefix/suffix affixes, min/max/step\nboundaries and spinner buttons — the design-system counterpart of PrimeNG's `InputNumber`.\n\nThe value is a `number | null` bound through ControlValueAccessor, so it works with reactive forms\nor `[(ngModel)]`: `<sds-input-number [(ngModel)]=\"amount\" mode=\"currency\" currency=\"EUR\" />`.\n\nThe field formats **live as you type**: the currency symbol, grouping separators and prefix/suffix\nstay visible on every keystroke, and the caret is kept where it belongs. The value is clamped to\n{@link min}/{@link max} on blur and on every spinner step; ArrowUp / ArrowDown also step it.",
1588
+ "example": null,
1589
+ "cva": true,
1590
+ "usesNgModel": true,
1591
+ "inputs": [
1592
+ {
1593
+ "name": "label",
1594
+ "type": "string",
1595
+ "default": "''",
1596
+ "required": false,
1597
+ "transform": null,
1598
+ "alias": null,
1599
+ "jsdoc": null
1600
+ },
1601
+ {
1602
+ "name": "ariaLabel",
1603
+ "type": "string",
1604
+ "default": "''",
1605
+ "required": false,
1606
+ "transform": null,
1607
+ "alias": null,
1608
+ "jsdoc": "Accessible name used when no visible [label] is provided."
1609
+ },
1610
+ {
1611
+ "name": "placeholder",
1612
+ "type": "string",
1613
+ "default": "''",
1614
+ "required": false,
1615
+ "transform": null,
1616
+ "alias": null,
1617
+ "jsdoc": null
1618
+ },
1619
+ {
1620
+ "name": "hint",
1621
+ "type": "string",
1622
+ "default": "''",
1623
+ "required": false,
1624
+ "transform": null,
1625
+ "alias": null,
1626
+ "jsdoc": null
1627
+ },
1628
+ {
1629
+ "name": "error",
1630
+ "type": "string",
1631
+ "default": "''",
1632
+ "required": false,
1633
+ "transform": null,
1634
+ "alias": null,
1635
+ "jsdoc": null
1636
+ },
1637
+ {
1638
+ "name": "size",
1639
+ "type": "SdsInputNumberSize",
1640
+ "default": "'md'",
1641
+ "required": false,
1642
+ "transform": null,
1643
+ "alias": null,
1644
+ "jsdoc": null
1645
+ },
1646
+ {
1647
+ "name": "appearance",
1648
+ "type": "SdsInputNumberAppearance",
1649
+ "default": "'default'",
1650
+ "required": false,
1651
+ "transform": null,
1652
+ "alias": null,
1653
+ "jsdoc": "`filled` is a borderless field on a muted ground; `default` is the bordered white field."
1654
+ },
1655
+ {
1656
+ "name": "disabled",
1657
+ "type": "boolean",
1658
+ "default": "false",
1659
+ "required": false,
1660
+ "transform": "booleanAttribute",
1661
+ "alias": null,
1662
+ "jsdoc": null
1663
+ },
1664
+ {
1665
+ "name": "readonly",
1666
+ "type": "boolean",
1667
+ "default": "false",
1668
+ "required": false,
1669
+ "transform": "booleanAttribute",
1670
+ "alias": null,
1671
+ "jsdoc": "Read-only: the value is shown and selectable but cannot be typed or stepped."
1672
+ },
1673
+ {
1674
+ "name": "mode",
1675
+ "type": "SdsInputNumberMode",
1676
+ "default": "'decimal'",
1677
+ "required": false,
1678
+ "transform": null,
1679
+ "alias": null,
1680
+ "jsdoc": null
1681
+ },
1682
+ {
1683
+ "name": "locale",
1684
+ "type": "string",
1685
+ "default": "''",
1686
+ "required": false,
1687
+ "transform": null,
1688
+ "alias": null,
1689
+ "jsdoc": "BCP 47 locale for grouping/decimal symbols (e.g. `fr-FR`). Empty follows the runtime locale."
1690
+ },
1691
+ {
1692
+ "name": "currency",
1693
+ "type": "string",
1694
+ "default": "''",
1695
+ "required": false,
1696
+ "transform": null,
1697
+ "alias": null,
1698
+ "jsdoc": "ISO 4217 code, required when {@link mode} is `currency` (e.g. `EUR`, `USD`)."
1699
+ },
1700
+ {
1701
+ "name": "currencyDisplay",
1702
+ "type": "SdsInputNumberCurrencyDisplay",
1703
+ "default": "'symbol'",
1704
+ "required": false,
1705
+ "transform": null,
1706
+ "alias": null,
1707
+ "jsdoc": null
1708
+ },
1709
+ {
1710
+ "name": "useGrouping",
1711
+ "type": "boolean",
1712
+ "default": "true",
1713
+ "required": false,
1714
+ "transform": "booleanAttribute",
1715
+ "alias": null,
1716
+ "jsdoc": "Thousands/grouping separators."
1717
+ },
1718
+ {
1719
+ "name": "minFractionDigits",
1720
+ "type": "number | null",
1721
+ "default": "null",
1722
+ "required": false,
1723
+ "transform": null,
1724
+ "alias": null,
1725
+ "jsdoc": null
1726
+ },
1727
+ {
1728
+ "name": "maxFractionDigits",
1729
+ "type": "number | null",
1730
+ "default": "null",
1731
+ "required": false,
1732
+ "transform": null,
1733
+ "alias": null,
1734
+ "jsdoc": null
1735
+ },
1736
+ {
1737
+ "name": "prefix",
1738
+ "type": "string",
1739
+ "default": "''",
1740
+ "required": false,
1741
+ "transform": null,
1742
+ "alias": null,
1743
+ "jsdoc": "Text shown before the value (e.g. `↑ `)."
1744
+ },
1745
+ {
1746
+ "name": "suffix",
1747
+ "type": "string",
1748
+ "default": "''",
1749
+ "required": false,
1750
+ "transform": null,
1751
+ "alias": null,
1752
+ "jsdoc": "Text shown after the value (e.g. ` kg`, `%`)."
1753
+ },
1754
+ {
1755
+ "name": "min",
1756
+ "type": "number | null",
1757
+ "default": "null",
1758
+ "required": false,
1759
+ "transform": null,
1760
+ "alias": null,
1761
+ "jsdoc": null
1762
+ },
1763
+ {
1764
+ "name": "max",
1765
+ "type": "number | null",
1766
+ "default": "null",
1767
+ "required": false,
1768
+ "transform": null,
1769
+ "alias": null,
1770
+ "jsdoc": null
1771
+ },
1772
+ {
1773
+ "name": "step",
1774
+ "type": "number",
1775
+ "default": "1",
1776
+ "required": false,
1777
+ "transform": "numberAttribute",
1778
+ "alias": null,
1779
+ "jsdoc": null
1780
+ },
1781
+ {
1782
+ "name": "showButtons",
1783
+ "type": "boolean",
1784
+ "default": "false",
1785
+ "required": false,
1786
+ "transform": "booleanAttribute",
1787
+ "alias": null,
1788
+ "jsdoc": "Show the increment/decrement spinner buttons."
1789
+ },
1790
+ {
1791
+ "name": "buttonLayout",
1792
+ "type": "SdsInputNumberButtonLayout",
1793
+ "default": "'stacked'",
1794
+ "required": false,
1795
+ "transform": null,
1796
+ "alias": null,
1797
+ "jsdoc": null
1798
+ },
1799
+ {
1800
+ "name": "incrementIcon",
1801
+ "type": "SdsIconName | null",
1802
+ "default": "null",
1803
+ "required": false,
1804
+ "transform": null,
1805
+ "alias": null,
1806
+ "jsdoc": "Override the increment button icon (defaults: chevron-up when stacked, plus otherwise)."
1807
+ },
1808
+ {
1809
+ "name": "decrementIcon",
1810
+ "type": "SdsIconName | null",
1811
+ "default": "null",
1812
+ "required": false,
1813
+ "transform": null,
1814
+ "alias": null,
1815
+ "jsdoc": "Override the decrement button icon (defaults: chevron-down when stacked, minus otherwise)."
1816
+ },
1817
+ {
1818
+ "name": "allowEmpty",
1819
+ "type": "boolean",
1820
+ "default": "true",
1821
+ "required": false,
1822
+ "transform": "booleanAttribute",
1823
+ "alias": null,
1824
+ "jsdoc": "Allow an empty (null) value. When false, blurring an empty field falls back to {@link min} or 0."
1825
+ },
1826
+ {
1827
+ "name": "clearable",
1828
+ "type": "boolean",
1829
+ "default": "false",
1830
+ "required": false,
1831
+ "transform": "booleanAttribute",
1832
+ "alias": null,
1833
+ "jsdoc": null
1834
+ },
1835
+ {
1836
+ "name": "clearLabel",
1837
+ "type": "string",
1838
+ "default": "'Effacer'",
1839
+ "required": false,
1840
+ "transform": null,
1841
+ "alias": null,
1842
+ "jsdoc": "Accessible names for the icon-only controls. French defaults so existing consumers are unchanged;\ntranslate them in a multi-language app."
1843
+ },
1844
+ {
1845
+ "name": "incrementLabel",
1846
+ "type": "string",
1847
+ "default": "'Augmenter'",
1848
+ "required": false,
1849
+ "transform": null,
1850
+ "alias": null,
1851
+ "jsdoc": null
1852
+ },
1853
+ {
1854
+ "name": "decrementLabel",
1855
+ "type": "string",
1856
+ "default": "'Diminuer'",
1857
+ "required": false,
1858
+ "transform": null,
1859
+ "alias": null,
1860
+ "jsdoc": null
1861
+ }
1862
+ ],
1863
+ "outputs": [],
1864
+ "exportedTypes": [
1865
+ {
1866
+ "name": "SdsInputNumberSize",
1867
+ "kind": "union",
1868
+ "body": "'sm' | 'md' | 'lg'"
1869
+ },
1870
+ {
1871
+ "name": "SdsInputNumberAppearance",
1872
+ "kind": "union",
1873
+ "body": "'default' | 'filled'"
1874
+ },
1875
+ {
1876
+ "name": "SdsInputNumberMode",
1877
+ "kind": "union",
1878
+ "body": "'decimal' | 'currency'"
1879
+ },
1880
+ {
1881
+ "name": "SdsInputNumberCurrencyDisplay",
1882
+ "kind": "union",
1883
+ "body": "'symbol' | 'code' | 'name'"
1884
+ },
1885
+ {
1886
+ "name": "SdsInputNumberButtonLayout",
1887
+ "kind": "union",
1888
+ "body": "'stacked' | 'horizontal' | 'vertical'"
1889
+ }
1890
+ ],
1891
+ "projectionSlots": [],
1892
+ "hostBindings": {
1893
+ "class": "block"
1894
+ },
1895
+ "examples": [
1896
+ {
1897
+ "sectionTitle": "Basique",
1898
+ "sectionDescription": "Regroupement des milliers selon la locale ; la valeur émise reste un nombre simple.",
1899
+ "code": "<sds-input-number label=\"Lits disponibles\" [(ngModel)]=\"beds\" />\n\n// beds = 42723; → affiché « 42 723 »",
1900
+ "runnableExample": "<sds-input-number label=\"Lits disponibles\" [(ngModel)]=\"beds\" />",
1901
+ "stack": true,
1902
+ "dark": false
1903
+ },
1904
+ {
1905
+ "sectionTitle": "Devise",
1906
+ "sectionDescription": "mode='currency' avec un code ISO 4217 ; currencyDisplay choisit le symbole, le code ou le nom.",
1907
+ "code": "<sds-input-number\n label=\"Budget mensuel\"\n mode=\"currency\"\n currency=\"EUR\"\n locale=\"fr-FR\"\n [(ngModel)]=\"budget\"\n/>\n<sds-input-number\n label=\"Facturation (US)\"\n mode=\"currency\"\n currency=\"USD\"\n currencyDisplay=\"code\"\n locale=\"en-US\"\n [(ngModel)]=\"invoice\"\n/>",
1908
+ "runnableExample": "<sds-input-number\n label=\"Budget mensuel\"\n mode=\"currency\"\n currency=\"EUR\"\n locale=\"fr-FR\"\n [(ngModel)]=\"budget\"\n />\n <sds-input-number\n label=\"Facturation (US)\"\n mode=\"currency\"\n currency=\"USD\"\n currencyDisplay=\"code\"\n locale=\"en-US\"\n [(ngModel)]=\"invoice\"\n />",
1909
+ "stack": true,
1910
+ "dark": false
1911
+ },
1912
+ {
1913
+ "sectionTitle": "Préfixe & suffixe",
1914
+ "sectionDescription": "Des affixes texte pour les pourcentages, unités ou libellés — sur un nombre simple.",
1915
+ "code": "<sds-input-number label=\"Taux d'occupation\" suffix=\" %\" [min]=\"0\" [max]=\"100\" [(ngModel)]=\"occupancy\" />\n<sds-input-number label=\"Poids du patient\" suffix=\" kg\" [minFractionDigits]=\"1\" [(ngModel)]=\"weight\" />\n<sds-input-number label=\"Température\" prefix=\"↑ \" suffix=\" ℃\" [(ngModel)]=\"temperature\" />",
1916
+ "runnableExample": "<sds-input-number label=\"Taux d'occupation\" suffix=\" %\" [min]=\"0\" [max]=\"100\" [(ngModel)]=\"occupancy\" />\n <sds-input-number label=\"Poids du patient\" suffix=\" kg\" [minFractionDigits]=\"1\" [(ngModel)]=\"weight\" />\n <sds-input-number label=\"Température\" prefix=\"↑ \" suffix=\" ℃\" [(ngModel)]=\"temperature\" />",
1917
+ "stack": true,
1918
+ "dark": false
1919
+ },
1920
+ {
1921
+ "sectionTitle": "Bornes & pas",
1922
+ "sectionDescription": "min, max et step encadrent la valeur ; le dépassement est corrigé à la validation et à chaque incrément.",
1923
+ "code": "<sds-input-number\n label=\"Dose (0–10, pas 0,5)\"\n [min]=\"0\"\n [max]=\"10\"\n [step]=\"0.5\"\n showButtons\n [(ngModel)]=\"dose\"\n/>",
1924
+ "runnableExample": "<sds-input-number\n label=\"Dose (0–10, pas 0,5)\"\n [min]=\"0\"\n [max]=\"10\"\n [step]=\"0.5\"\n showButtons\n [(ngModel)]=\"dose\"\n />",
1925
+ "stack": true,
1926
+ "dark": false
1927
+ },
1928
+ {
1929
+ "sectionTitle": "Boutons",
1930
+ "sectionDescription": "showButtons ajoute un incrémenteur ; buttonLayout le dispose en pile, à l'horizontale ou à la verticale.",
1931
+ "code": "<sds-input-number label=\"Empilé\" showButtons [(ngModel)]=\"qty\" />\n<sds-input-number label=\"Horizontal\" showButtons buttonLayout=\"horizontal\" [(ngModel)]=\"qty\" />\n<sds-input-number label=\"Vertical\" showButtons buttonLayout=\"vertical\" [(ngModel)]=\"qty\" />",
1932
+ "runnableExample": "<sds-input-number label=\"Empilé\" showButtons [(ngModel)]=\"qtyStacked\" />\n <sds-input-number label=\"Horizontal\" showButtons buttonLayout=\"horizontal\" [(ngModel)]=\"qtyHorizontal\" />\n <sds-input-number label=\"Vertical\" showButtons buttonLayout=\"vertical\" [(ngModel)]=\"qtyVertical\" />",
1933
+ "stack": false,
1934
+ "dark": false
1935
+ },
1936
+ {
1937
+ "sectionTitle": "Décimales & groupement",
1938
+ "sectionDescription": "minFractionDigits / maxFractionDigits contrôlent la précision ; useGrouping='false' retire les séparateurs.",
1939
+ "code": "<sds-input-number\n label=\"Résultat de laboratoire\"\n [minFractionDigits]=\"2\"\n [maxFractionDigits]=\"4\"\n [(ngModel)]=\"labResult\"\n/>\n<sds-input-number label=\"Référence dossier\" [useGrouping]=\"false\" [(ngModel)]=\"reference\" />",
1940
+ "runnableExample": "<sds-input-number\n label=\"Résultat de laboratoire\"\n [minFractionDigits]=\"2\"\n [maxFractionDigits]=\"4\"\n [(ngModel)]=\"labResult\"\n />\n <sds-input-number label=\"Référence dossier\" [useGrouping]=\"false\" [(ngModel)]=\"reference\" />",
1941
+ "stack": true,
1942
+ "dark": false
1943
+ },
1944
+ {
1945
+ "sectionTitle": "Effaçable",
1946
+ "sectionDescription": "clearable affiche un bouton d'effacement quand une valeur est saisie.",
1947
+ "code": "<sds-input-number\n label=\"Plafond de dépense\"\n mode=\"currency\"\n currency=\"EUR\"\n locale=\"fr-FR\"\n clearable\n [(ngModel)]=\"cap\"\n/>",
1948
+ "runnableExample": "<sds-input-number label=\"Plafond de dépense\" mode=\"currency\" currency=\"EUR\" locale=\"fr-FR\" clearable [(ngModel)]=\"cap\" />",
1949
+ "stack": true,
1950
+ "dark": false
1951
+ },
1952
+ {
1953
+ "sectionTitle": "Tailles",
1954
+ "sectionDescription": null,
1955
+ "code": "<sds-input-number size=\"sm\" label=\"Petit (sm)\" [(ngModel)]=\"value\" />\n<sds-input-number size=\"md\" label=\"Moyen (md)\" [(ngModel)]=\"value\" />\n<sds-input-number size=\"lg\" label=\"Grand (lg)\" [(ngModel)]=\"value\" />",
1956
+ "runnableExample": "<sds-input-number size=\"sm\" label=\"Petit (sm)\" [(ngModel)]=\"sizeSm\" />\n <sds-input-number size=\"md\" label=\"Moyen (md)\" [(ngModel)]=\"sizeMd\" />\n <sds-input-number size=\"lg\" label=\"Grand (lg)\" [(ngModel)]=\"sizeLg\" />",
1957
+ "stack": true,
1958
+ "dark": false
1959
+ },
1960
+ {
1961
+ "sectionTitle": "Rempli & erreur",
1962
+ "sectionDescription": null,
1963
+ "code": "<sds-input-number appearance=\"filled\" label=\"Rempli\" [(ngModel)]=\"value\" />\n<sds-input-number label=\"Nombre requis\" [error]=\"'Veuillez saisir un nombre.'\" [(ngModel)]=\"value\" />",
1964
+ "runnableExample": "<sds-input-number appearance=\"filled\" label=\"Rempli\" [(ngModel)]=\"filled\" />\n <sds-input-number label=\"Nombre requis\" [error]=\"'Veuillez saisir un nombre.'\" [(ngModel)]=\"required\" />",
1965
+ "stack": true,
1966
+ "dark": false
1967
+ },
1968
+ {
1969
+ "sectionTitle": "Désactivé",
1970
+ "sectionDescription": null,
1971
+ "code": "<sds-input-number label=\"Capacité verrouillée\" [ngModel]=\"120\" disabled />",
1972
+ "runnableExample": "<sds-input-number label=\"Capacité verrouillée\" [ngModel]=\"120\" disabled />",
1973
+ "stack": true,
1974
+ "dark": false
1975
+ }
1976
+ ]
1977
+ },
1579
1978
  {
1580
1979
  "className": "SdsLocalizedInput",
1581
1980
  "selector": "sds-localized-input",
@@ -1757,8 +2156,8 @@
1757
2156
  "importName": "SdsMultiSelect",
1758
2157
  "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.",
1759
2158
  "overviewDescription": "Sélection multiple : puces, « tout sélectionner » et filtre.",
1760
- "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.",
1761
- "example": "<sds-multi-select [options]=\"services\" optionLabel=\"name\" optionValue=\"code\"\n display=\"chip\" filter [(ngModel)]=\"codes\" />",
2159
+ "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.\n\nProject template directives to customise the panel:\n- `<ng-template sdsSelectOption let-option>` — the content of each option row, after its\n checkbox (see {@link SdsSelectOption}); context: the raw `option` (implicit), plus `label`,\n `value`, `selected`, `disabled`, `index`.\n- `<ng-template sdsSelectEmpty let-query>` — replaces the \"no results\" message (see {@link SdsSelectEmpty}).\n- `<ng-template sdsSelectFooter let-close=\"close\">` — a sticky footer action (see {@link SdsSelectFooter});\n `close()` dismisses the panel.",
2160
+ "example": "<sds-multi-select [options]=\"tags\" optionLabel=\"name\" optionValue=\"id\" [(ngModel)]=\"tagIds\">\n <ng-template sdsSelectOption let-option>\n <span class=\"dot\" [style.background]=\"option.color\"></span> {{ option.name }}\n </ng-template>\n</sds-multi-select>",
1762
2161
  "cva": true,
1763
2162
  "usesNgModel": true,
1764
2163
  "inputs": [
@@ -1994,6 +2393,22 @@
1994
2393
  "stack": true,
1995
2394
  "dark": false
1996
2395
  },
2396
+ {
2397
+ "sectionTitle": "Gabarit d'option (sdsSelectOption)",
2398
+ "sectionDescription": "Projetez un <ng-template sdsSelectOption> pour rendre chaque ligne d'option après sa case à cocher. Le contexte expose l'option brute (implicite), plus label, value, selected, disabled et index.",
2399
+ "code": "<sds-multi-select\n [options]=\"services\"\n optionLabel=\"name\"\n optionValue=\"code\"\n display=\"chip\"\n filter\n [(ngModel)]=\"codes\"\n placeholder=\"Choisir des services\"\n>\n <!-- Rendered after each option's checkbox. let-option is the raw option. -->\n <ng-template sdsSelectOption let-option>\n <span class=\"h-2.5 w-2.5 shrink-0 rounded-full\" [style.background]=\"option.color\"></span>\n <span class=\"truncate\">{{ option.name }}</span>\n </ng-template>\n</sds-multi-select>\n\n// services = [{ name: 'Cardiologie', code: 'CARD', color: '#ef4444' }, …];",
2400
+ "runnableExample": "<sds-multi-select\n [options]=\"coloredServices\"\n optionLabel=\"name\"\n optionValue=\"code\"\n display=\"chip\"\n filter\n [(ngModel)]=\"codes\"\n placeholder=\"Choisir des services\"\n >\n <ng-template sdsSelectOption let-option>\n <span class=\"h-2.5 w-2.5 shrink-0 rounded-full\" [style.background]=\"option.color\"></span>\n <span class=\"truncate\">{{ option.name }}</span>\n </ng-template>\n </sds-multi-select>",
2401
+ "stack": true,
2402
+ "dark": false
2403
+ },
2404
+ {
2405
+ "sectionTitle": "Gabarits vide et pied de liste (sdsSelectEmpty / sdsSelectFooter)",
2406
+ "sectionDescription": "Personnalisez l'état « aucun résultat » et ajoutez une action collante ; le pied reçoit close() pour refermer le panneau.",
2407
+ "code": "<sds-multi-select [options]=\"services\" optionLabel=\"name\" optionValue=\"code\" filter>\n <ng-template sdsSelectEmpty let-query>\n Aucun service pour « {{ query }} ».\n </ng-template>\n <ng-template sdsSelectFooter let-close=\"close\">\n <button type=\"button\" class=\"w-full px-3 py-2 text-brand-700\" (click)=\"addService(); close()\">\n + Nouveau service\n </button>\n </ng-template>\n</sds-multi-select>",
2408
+ "runnableExample": "<sds-multi-select\n [options]=\"services\"\n optionLabel=\"name\"\n optionValue=\"code\"\n filter\n placeholder=\"Choisir des services\"\n >\n <ng-template sdsSelectEmpty let-query>\n <span class=\"text-ink-faint\">Aucun service pour « {{ query }} ».</span>\n </ng-template>\n <ng-template sdsSelectFooter let-close=\"close\">\n <button\n type=\"button\"\n class=\"flex w-full items-center gap-2 px-3 py-2 text-sm font-medium text-brand-700 hover:bg-brand-50\"\n (click)=\"close()\"\n >\n + Nouveau service\n </button>\n </ng-template>\n </sds-multi-select>",
2409
+ "stack": true,
2410
+ "dark": false
2411
+ },
1997
2412
  {
1998
2413
  "sectionTitle": "Étiquette de comptage",
1999
2414
  "sectionDescription": "Au-delà de [maxSelectedLabels], un libellé de comptage remplace la liste.",
@@ -2903,8 +3318,8 @@
2903
3318
  "importName": "SdsSelect",
2904
3319
  "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.",
2905
3320
  "overviewDescription": "Liste déroulante avec filtre, effacement et navigation clavier.",
2906
- "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).",
2907
- "example": "<sds-select [options]=\"services\" optionLabel=\"name\" optionValue=\"id\"\n placeholder=\"Choisir un service\" [(ngModel)]=\"serviceId\" filter clearable />",
3321
+ "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).\n\nOptions render as plain text by default. To render richer options (an icon,\nan avatar, a two-line row…) project template directives — the same content\nalso renders in the trigger for the selected value:\n- `<ng-template sdsSelectOption let-option>` — one option row (see {@link SdsSelectOption});\n context: the raw `option` (implicit), plus `label`, `value`, `selected`, `disabled`, `index`.\n- `<ng-template sdsSelectEmpty let-query>` — replaces the \"no results\" message (see {@link SdsSelectEmpty}).\n- `<ng-template sdsSelectFooter let-close=\"close\">` — a sticky footer action, e.g. \"+ New…\"\n (see {@link SdsSelectFooter}); `close()` dismisses the panel.",
3322
+ "example": "<sds-select [options]=\"categories\" optionLabel=\"name\" optionValue=\"id\" [(ngModel)]=\"categoryId\">\n <ng-template sdsSelectOption let-option>\n <span class=\"dot\" [style.background]=\"option.color\"></span> {{ option.name }}\n </ng-template>\n</sds-select>",
2908
3323
  "cva": true,
2909
3324
  "usesNgModel": true,
2910
3325
  "inputs": [
@@ -3105,6 +3520,30 @@
3105
3520
  "stack": true,
3106
3521
  "dark": false
3107
3522
  },
3523
+ {
3524
+ "sectionTitle": "Gabarit d'option (sdsSelectOption)",
3525
+ "sectionDescription": "Projetez un <ng-template sdsSelectOption> pour rendre chaque option — et la valeur sélectionnée dans le champ — à votre guise. Le contexte expose l'option brute (implicite), plus label, value, selected, disabled et index.",
3526
+ "code": "<sds-select\n [options]=\"services\"\n optionLabel=\"name\"\n optionValue=\"code\"\n filter\n clearable\n [(ngModel)]=\"serviceCode\"\n placeholder=\"Choisir un service\"\n>\n <!-- Rendered for each option AND for the selected value in the field.\n let-option is the raw option; also: let-selected=\"selected\", let-label=\"label\", … -->\n <ng-template sdsSelectOption let-option>\n <span class=\"h-2.5 w-2.5 shrink-0 rounded-full\" [style.background]=\"option.color\"></span>\n <span class=\"truncate\">{{ option.name }}</span>\n </ng-template>\n</sds-select>\n\n// services = [{ name: 'Cardiologie', code: 'CARD', color: '#ef4444' }, …];",
3527
+ "runnableExample": "<sds-select\n [options]=\"coloredServices\"\n optionLabel=\"name\"\n optionValue=\"code\"\n filter\n clearable\n [(ngModel)]=\"serviceCode\"\n placeholder=\"Choisir un service\"\n >\n <ng-template sdsSelectOption let-option>\n <span class=\"h-2.5 w-2.5 shrink-0 rounded-full\" [style.background]=\"option.color\"></span>\n <span class=\"truncate\">{{ option.name }}</span>\n </ng-template>\n </sds-select>",
3528
+ "stack": true,
3529
+ "dark": false
3530
+ },
3531
+ {
3532
+ "sectionTitle": "Gabarit vide (sdsSelectEmpty)",
3533
+ "sectionDescription": "Remplace le message « aucun résultat » ; le contexte fournit la requête de filtre courante.",
3534
+ "code": "<sds-select [options]=\"services\" optionLabel=\"name\" optionValue=\"code\" filter>\n <ng-template sdsSelectEmpty let-query>\n Aucun service pour « {{ query }} ».\n </ng-template>\n</sds-select>",
3535
+ "runnableExample": "<sds-select\n [options]=\"services\"\n optionLabel=\"name\"\n optionValue=\"code\"\n filter\n placeholder=\"Choisir un service\"\n >\n <ng-template sdsSelectEmpty let-query>\n <span class=\"text-ink-faint\">Aucun service pour « {{ query }} ».</span>\n </ng-template>\n </sds-select>",
3536
+ "stack": true,
3537
+ "dark": false
3538
+ },
3539
+ {
3540
+ "sectionTitle": "Pied de liste (sdsSelectFooter)",
3541
+ "sectionDescription": "Ajoute une action collante sous la liste (ex. « Nouveau… ») ; le contexte fournit close() pour refermer le panneau.",
3542
+ "code": "<sds-select [options]=\"services\" optionLabel=\"name\" optionValue=\"code\" filter>\n <!-- close() dismisses the panel after the action. -->\n <ng-template sdsSelectFooter let-close=\"close\">\n <button type=\"button\" class=\"w-full px-3 py-2 text-brand-700\" (click)=\"addService(); close()\">\n + Nouveau service\n </button>\n </ng-template>\n</sds-select>",
3543
+ "runnableExample": "<sds-select\n [options]=\"services\"\n optionLabel=\"name\"\n optionValue=\"code\"\n filter\n placeholder=\"Choisir un service\"\n >\n <ng-template sdsSelectFooter let-close=\"close\">\n <button\n type=\"button\"\n class=\"flex w-full items-center gap-2 px-3 py-2 text-sm font-medium text-brand-700 hover:bg-brand-50\"\n (click)=\"close()\"\n >\n + Nouveau service\n </button>\n </ng-template>\n </sds-select>",
3544
+ "stack": true,
3545
+ "dark": false
3546
+ },
3108
3547
  {
3109
3548
  "sectionTitle": "Effaçable",
3110
3549
  "sectionDescription": "Affiche un bouton d'effacement quand une valeur est sélectionnée.",
@@ -4521,6 +4960,111 @@
4521
4960
  }
4522
4961
  ],
4523
4962
  "directives": [
4963
+ {
4964
+ "className": "SdsSelectEmpty",
4965
+ "selector": "ng-template[sdsSelectEmpty]",
4966
+ "kind": "directive",
4967
+ "group": "form",
4968
+ "importName": "SdsSelectEmpty",
4969
+ "description": null,
4970
+ "overviewDescription": null,
4971
+ "jsdoc": "Supplies a custom template shown in place of the default \"no results\" message\nwhen a select has no (matching) options.",
4972
+ "example": "<ng-template sdsSelectEmpty let-q>No category matches \"{{ q }}\".</ng-template>",
4973
+ "cva": false,
4974
+ "usesNgModel": false,
4975
+ "inputs": [],
4976
+ "outputs": [],
4977
+ "exportedTypes": [
4978
+ {
4979
+ "name": "SdsSelectOptionContext",
4980
+ "kind": "interface",
4981
+ "body": "interface SdsSelectOptionContext { /** Same as {@link option} — enables the implicit `let-option` binding. Typed `any` so consumer templates * can read their own option fields (e.g. `option.color`) without casting. */ $implicit: any; /** The raw option object (or primitive) from the `options` array. */ option: any; /** The resolved display label (via optionLabel). */ label: string; /** The resolved option value (via optionValue). */ value: unknown; /** Whether this option is currently selected. */ selected: boolean; /** Whether this option is disabled. */ disabled: boolean; /** Zero-based inde"
4982
+ },
4983
+ {
4984
+ "name": "SdsSelectEmptyContext",
4985
+ "kind": "interface",
4986
+ "body": "interface SdsSelectEmptyContext { /** Same as {@link filterText} — enables the implicit `let-filterText` binding. */ $implicit: string; /** The current filter query (empty when the field isn't filterable or is blank). */ filterText: string; }"
4987
+ },
4988
+ {
4989
+ "name": "SdsSelectFooterContext",
4990
+ "kind": "interface",
4991
+ "body": "interface SdsSelectFooterContext { /** Same as {@link filterText} — enables the implicit `let-filterText` binding. */ $implicit: string; /** The current filter query. */ filterText: string; /** Closes the open panel — handy for a footer action (e.g. \"+ New…\"). */ close: () => void; }"
4992
+ }
4993
+ ],
4994
+ "projectionSlots": [],
4995
+ "hostBindings": {},
4996
+ "examples": []
4997
+ },
4998
+ {
4999
+ "className": "SdsSelectFooter",
5000
+ "selector": "ng-template[sdsSelectFooter]",
5001
+ "kind": "directive",
5002
+ "group": "form",
5003
+ "importName": "SdsSelectFooter",
5004
+ "description": null,
5005
+ "overviewDescription": null,
5006
+ "jsdoc": "Supplies a custom sticky footer rendered below the option list — e.g. a\n\"+ Create new\" action. The `close` context callback dismisses the panel.",
5007
+ "example": "<ng-template sdsSelectFooter let-close=\"close\">\n <button (click)=\"createCategory(); close()\">+ New category</button>\n</ng-template>",
5008
+ "cva": false,
5009
+ "usesNgModel": false,
5010
+ "inputs": [],
5011
+ "outputs": [],
5012
+ "exportedTypes": [
5013
+ {
5014
+ "name": "SdsSelectOptionContext",
5015
+ "kind": "interface",
5016
+ "body": "interface SdsSelectOptionContext { /** Same as {@link option} — enables the implicit `let-option` binding. Typed `any` so consumer templates * can read their own option fields (e.g. `option.color`) without casting. */ $implicit: any; /** The raw option object (or primitive) from the `options` array. */ option: any; /** The resolved display label (via optionLabel). */ label: string; /** The resolved option value (via optionValue). */ value: unknown; /** Whether this option is currently selected. */ selected: boolean; /** Whether this option is disabled. */ disabled: boolean; /** Zero-based inde"
5017
+ },
5018
+ {
5019
+ "name": "SdsSelectEmptyContext",
5020
+ "kind": "interface",
5021
+ "body": "interface SdsSelectEmptyContext { /** Same as {@link filterText} — enables the implicit `let-filterText` binding. */ $implicit: string; /** The current filter query (empty when the field isn't filterable or is blank). */ filterText: string; }"
5022
+ },
5023
+ {
5024
+ "name": "SdsSelectFooterContext",
5025
+ "kind": "interface",
5026
+ "body": "interface SdsSelectFooterContext { /** Same as {@link filterText} — enables the implicit `let-filterText` binding. */ $implicit: string; /** The current filter query. */ filterText: string; /** Closes the open panel — handy for a footer action (e.g. \"+ New…\"). */ close: () => void; }"
5027
+ }
5028
+ ],
5029
+ "projectionSlots": [],
5030
+ "hostBindings": {},
5031
+ "examples": []
5032
+ },
5033
+ {
5034
+ "className": "SdsSelectOption",
5035
+ "selector": "ng-template[sdsSelectOption]",
5036
+ "kind": "directive",
5037
+ "group": "form",
5038
+ "importName": "SdsSelectOption",
5039
+ "description": null,
5040
+ "overviewDescription": null,
5041
+ "jsdoc": "Supplies a custom template for each option row (and the selected value shown\nin the trigger) of an `<sds-select>` / `<sds-multi-select>`. Use as a\nstructural template projected into the select:",
5042
+ "example": "<sds-select [options]=\"categories\" optionLabel=\"name\" optionValue=\"id\" [(ngModel)]=\"catId\">\n <ng-template sdsSelectOption let-option let-selected=\"selected\">\n <span class=\"dot\" [style.background]=\"option.color\"></span>\n <span class=\"truncate\">{{ option.name }}</span>\n </ng-template>\n</sds-select>",
5043
+ "cva": false,
5044
+ "usesNgModel": false,
5045
+ "inputs": [],
5046
+ "outputs": [],
5047
+ "exportedTypes": [
5048
+ {
5049
+ "name": "SdsSelectOptionContext",
5050
+ "kind": "interface",
5051
+ "body": "interface SdsSelectOptionContext { /** Same as {@link option} — enables the implicit `let-option` binding. Typed `any` so consumer templates * can read their own option fields (e.g. `option.color`) without casting. */ $implicit: any; /** The raw option object (or primitive) from the `options` array. */ option: any; /** The resolved display label (via optionLabel). */ label: string; /** The resolved option value (via optionValue). */ value: unknown; /** Whether this option is currently selected. */ selected: boolean; /** Whether this option is disabled. */ disabled: boolean; /** Zero-based inde"
5052
+ },
5053
+ {
5054
+ "name": "SdsSelectEmptyContext",
5055
+ "kind": "interface",
5056
+ "body": "interface SdsSelectEmptyContext { /** Same as {@link filterText} — enables the implicit `let-filterText` binding. */ $implicit: string; /** The current filter query (empty when the field isn't filterable or is blank). */ filterText: string; }"
5057
+ },
5058
+ {
5059
+ "name": "SdsSelectFooterContext",
5060
+ "kind": "interface",
5061
+ "body": "interface SdsSelectFooterContext { /** Same as {@link filterText} — enables the implicit `let-filterText` binding. */ $implicit: string; /** The current filter query. */ filterText: string; /** Closes the open panel — handy for a footer action (e.g. \"+ New…\"). */ close: () => void; }"
5062
+ }
5063
+ ],
5064
+ "projectionSlots": [],
5065
+ "hostBindings": {},
5066
+ "examples": []
5067
+ },
4524
5068
  {
4525
5069
  "className": "SdsTableCell",
4526
5070
  "selector": "ng-template[sdsCell]",
@@ -4662,6 +5206,7 @@
4662
5206
  "chevron-down",
4663
5207
  "chevron-left",
4664
5208
  "chevron-right",
5209
+ "chevron-up",
4665
5210
  "chevrons-left",
4666
5211
  "chevrons-right",
4667
5212
  "chevrons-up-down",
@@ -4686,6 +5231,7 @@
4686
5231
  "map-pin",
4687
5232
  "megaphone",
4688
5233
  "menu",
5234
+ "minus",
4689
5235
  "monitor",
4690
5236
  "package",
4691
5237
  "package-open",
@@ -4697,6 +5243,7 @@
4697
5243
  "panel-top",
4698
5244
  "panels-top-left",
4699
5245
  "phone",
5246
+ "plus",
4700
5247
  "refresh-cw",
4701
5248
  "rotate-ccw",
4702
5249
  "rows-3",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@besaitech/ng-design-system-mcp",
3
- "version": "0.0.11",
3
+ "version": "0.0.13",
4
4
  "description": "MCP server that exposes the @besaitech/ng-design-system Angular component library documentation (API, examples, tokens, icons, setup) to AI coding tools.",
5
5
  "type": "module",
6
6
  "bin": {