@besaitech/ng-design-system-mcp 0.0.10 → 0.0.12

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 +637 -4
  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.40",
3
+ "libraryVersion": "0.0.42",
4
4
  "packageName": "@besaitech/ng-design-system",
5
5
  "devImport": "saitech-design-system",
6
- "generatedAt": "2026-09-14T10:04:34.403Z",
7
- "componentCount": 31,
6
+ "generatedAt": "2026-09-19T16:33:04.483Z",
7
+ "componentCount": 34,
8
8
  "components": [
9
9
  {
10
10
  "className": "SdsAccordion",
@@ -1576,6 +1576,578 @@
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
+ },
1978
+ {
1979
+ "className": "SdsLocalizedInput",
1980
+ "selector": "sds-localized-input",
1981
+ "kind": "component",
1982
+ "group": "primitive",
1983
+ "importName": "SdsLocalizedInput",
1984
+ "description": "Un seul champ pour saisir un texte traduit (titre, libellé, description) dans plusieurs langues. Un sélecteur compact bascule la traduction éditée ; une pastille marque les langues déjà renseignées. Le champ s'ouvre sur currentLanguage (sinon la première langue). Implémente ControlValueAccessor sur la map { langue: texte }.",
1985
+ "overviewDescription": null,
1986
+ "jsdoc": "One language-aware text field for editing a translated value (a {@link SdsLocalizedValue} — a title,\nlabel or description in several languages). Only one language is edited at a time; a compact switcher\nsitting **inside the field** flips which translation you are editing, and a dot marks the languages that\nalready have content, so a partially-translated value is obvious at a glance.\n\nThe active language defaults to {@link currentLanguage} when it is one of {@link languages}, otherwise the\nfirst accepted language — so the field \"opens on the language you are working in\". Empty translations are\npruned from the emitted value, keeping the stored map clean.\n\nImplements ControlValueAccessor over the map — use with reactive forms or `[(ngModel)]`:\n`<sds-localized-input [languages]=\"['fr','nl','en']\" [(ngModel)]=\"title\" />`.",
1987
+ "example": null,
1988
+ "cva": true,
1989
+ "usesNgModel": true,
1990
+ "inputs": [
1991
+ {
1992
+ "name": "label",
1993
+ "type": "string",
1994
+ "default": "''",
1995
+ "required": false,
1996
+ "transform": null,
1997
+ "alias": null,
1998
+ "jsdoc": null
1999
+ },
2000
+ {
2001
+ "name": "hint",
2002
+ "type": "string",
2003
+ "default": "''",
2004
+ "required": false,
2005
+ "transform": null,
2006
+ "alias": null,
2007
+ "jsdoc": null
2008
+ },
2009
+ {
2010
+ "name": "placeholder",
2011
+ "type": "string",
2012
+ "default": "''",
2013
+ "required": false,
2014
+ "transform": null,
2015
+ "alias": null,
2016
+ "jsdoc": null
2017
+ },
2018
+ {
2019
+ "name": "languages",
2020
+ "type": "string[]",
2021
+ "default": "[]",
2022
+ "required": false,
2023
+ "transform": null,
2024
+ "alias": null,
2025
+ "jsdoc": "The accepted language codes, in display order (e.g. `['fr','nl','en']`)."
2026
+ },
2027
+ {
2028
+ "name": "currentLanguage",
2029
+ "type": "string | null",
2030
+ "default": "null",
2031
+ "required": false,
2032
+ "transform": null,
2033
+ "alias": null,
2034
+ "jsdoc": "Language to pre-select; used when it is one of {@link languages}, else the first accepted language."
2035
+ },
2036
+ {
2037
+ "name": "multiline",
2038
+ "type": "boolean",
2039
+ "default": "false",
2040
+ "required": false,
2041
+ "transform": "booleanAttribute",
2042
+ "alias": null,
2043
+ "jsdoc": null
2044
+ },
2045
+ {
2046
+ "name": "rows",
2047
+ "type": "number",
2048
+ "default": "3",
2049
+ "required": false,
2050
+ "transform": "numberAttribute",
2051
+ "alias": null,
2052
+ "jsdoc": null
2053
+ },
2054
+ {
2055
+ "name": "size",
2056
+ "type": "SdsLocalizedInputSize",
2057
+ "default": "'md'",
2058
+ "required": false,
2059
+ "transform": null,
2060
+ "alias": null,
2061
+ "jsdoc": null
2062
+ },
2063
+ {
2064
+ "name": "disabled",
2065
+ "type": "boolean",
2066
+ "default": "false",
2067
+ "required": false,
2068
+ "transform": "booleanAttribute",
2069
+ "alias": null,
2070
+ "jsdoc": null
2071
+ },
2072
+ {
2073
+ "name": "languageSwitcherLabel",
2074
+ "type": "string",
2075
+ "default": "'Langue'",
2076
+ "required": false,
2077
+ "transform": null,
2078
+ "alias": null,
2079
+ "jsdoc": "Accessible name for the in-field language switcher, and the \"no translation yet\" title suffix on each\nlanguage button. French defaults so existing consumers are unchanged; translate them in a multi-language\napp (the buttons are letter-only, so the title carries their meaning)."
2080
+ },
2081
+ {
2082
+ "name": "untranslatedLabel",
2083
+ "type": "string",
2084
+ "default": "'à traduire'",
2085
+ "required": false,
2086
+ "transform": null,
2087
+ "alias": null,
2088
+ "jsdoc": null
2089
+ }
2090
+ ],
2091
+ "outputs": [],
2092
+ "exportedTypes": [
2093
+ {
2094
+ "name": "SdsLocalizedValue",
2095
+ "kind": "type",
2096
+ "body": "Record<string, string>"
2097
+ },
2098
+ {
2099
+ "name": "SdsLocalizedInputSize",
2100
+ "kind": "union",
2101
+ "body": "'sm' | 'md' | 'lg'"
2102
+ }
2103
+ ],
2104
+ "projectionSlots": [],
2105
+ "hostBindings": {
2106
+ "class": "block"
2107
+ },
2108
+ "examples": [
2109
+ {
2110
+ "sectionTitle": "Basique",
2111
+ "sectionDescription": "Passez les langues acceptées ; le champ s'ouvre sur la langue courante et n'édite qu'une langue à la fois.",
2112
+ "code": "<sds-localized-input\n label=\"Titre\"\n [languages]=\"['fr', 'nl', 'en']\"\n [(ngModel)]=\"title\"\n/>\n\n// title: SdsLocalizedValue = {}; // e.g. { fr: 'Signaler un incident' }",
2113
+ "runnableExample": "<sds-localized-input label=\"Titre\" [languages]=\"['fr', 'nl', 'en']\" [(ngModel)]=\"title\" />",
2114
+ "stack": true,
2115
+ "dark": false
2116
+ },
2117
+ {
2118
+ "sectionTitle": "Valeur partiellement traduite",
2119
+ "sectionDescription": "Une pastille pleine marque les langues renseignées, une pastille creuse celles qui restent à traduire.",
2120
+ "code": "label = { fr: 'Applications & logiciels', en: 'Applications & software' };\n\n<sds-localized-input\n label=\"Libellé de catégorie\"\n [languages]=\"['fr', 'nl', 'en']\"\n [(ngModel)]=\"label\"\n/>",
2121
+ "runnableExample": "<sds-localized-input\n label=\"Libellé de catégorie\"\n [languages]=\"['fr', 'nl', 'en']\"\n [(ngModel)]=\"label\"\n />",
2122
+ "stack": true,
2123
+ "dark": false
2124
+ },
2125
+ {
2126
+ "sectionTitle": "Langue pré-sélectionnée",
2127
+ "sectionDescription": "currentLanguage ouvre le champ sur une langue précise quand elle fait partie des langues acceptées.",
2128
+ "code": "<sds-localized-input\n label=\"Titre\"\n [languages]=\"['fr', 'nl', 'en']\"\n currentLanguage=\"nl\"\n [(ngModel)]=\"title\"\n/>",
2129
+ "runnableExample": "<sds-localized-input\n label=\"Titre\"\n [languages]=\"['fr', 'nl', 'en']\"\n currentLanguage=\"nl\"\n [(ngModel)]=\"titleNl\"\n />",
2130
+ "stack": true,
2131
+ "dark": false
2132
+ },
2133
+ {
2134
+ "sectionTitle": "Multiligne",
2135
+ "sectionDescription": "multiline rend une zone de texte au lieu d'un champ simple.",
2136
+ "code": "<sds-localized-input\n label=\"Description\"\n [languages]=\"['fr', 'nl', 'en']\"\n multiline\n [rows]=\"3\"\n [(ngModel)]=\"description\"\n/>",
2137
+ "runnableExample": "<sds-localized-input\n label=\"Description\"\n [languages]=\"['fr', 'nl', 'en']\"\n multiline\n [rows]=\"3\"\n [(ngModel)]=\"description\"\n />",
2138
+ "stack": true,
2139
+ "dark": false
2140
+ },
2141
+ {
2142
+ "sectionTitle": "Désactivé",
2143
+ "sectionDescription": null,
2144
+ "code": "<sds-localized-input\n label=\"Titre\"\n [languages]=\"['fr', 'nl', 'en']\"\n [(ngModel)]=\"value\"\n disabled\n/>",
2145
+ "runnableExample": "<sds-localized-input\n label=\"Titre\"\n [languages]=\"['fr', 'nl', 'en']\"\n [ngModel]=\"label\"\n disabled\n />",
2146
+ "stack": true,
2147
+ "dark": false
2148
+ }
2149
+ ]
2150
+ },
1579
2151
  {
1580
2152
  "className": "SdsMultiSelect",
1581
2153
  "selector": "sds-multi-select",
@@ -3053,7 +3625,7 @@
3053
3625
  "sectionTitle": "Navigation",
3054
3626
  "sectionDescription": "Les items acceptent [link] (routerLink avec état actif automatique) ; ici active est défini manuellement pour la démo.",
3055
3627
  "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>",
3056
- "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>",
3628
+ "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 class=\"text-[0.68rem] text-white/40 flex justify-center items-center\">\n <div class=\"font-mono\">Saitech Design System v{{ version }}</div>\n </div>\n </sds-sidebar>\n </div>",
3057
3629
  "stack": true,
3058
3630
  "dark": false
3059
3631
  }
@@ -4013,6 +4585,52 @@
4013
4585
  }
4014
4586
  ]
4015
4587
  },
4588
+ {
4589
+ "className": "SdsToastHost",
4590
+ "selector": "sds-toast-host",
4591
+ "kind": "component",
4592
+ "group": "primitive",
4593
+ "importName": "SdsToastService, SdsToastHost",
4594
+ "description": "Notifications transitoires. Le code applicatif appelle SdsToastService.success / error / info après une action ; un unique <sds-toast-host> monté dans le shell affiche la file et chaque toast disparaît tout seul. Régions live accessibles : les erreurs interrompent (assertive), les succès/infos patientent (polite).",
4595
+ "overviewDescription": null,
4596
+ "jsdoc": "Renders the {@link SdsToastService} queue, fixed bottom-centre. Mount it once, in the app shell:\n`<sds-toast-host />`. Application code pushes toasts through the injected service.\n\nAccessibility: the two live regions are ALWAYS in the DOM (even when empty), because a live region must\npre-exist for its later content changes to be announced. Errors go to an assertive `role=\"alert\"` region\nso a failure interrupts; success/info go to a polite region so they queue.",
4597
+ "example": null,
4598
+ "cva": false,
4599
+ "usesNgModel": false,
4600
+ "inputs": [
4601
+ {
4602
+ "name": "closeLabel",
4603
+ "type": "string",
4604
+ "default": "'Fermer'",
4605
+ "required": false,
4606
+ "transform": null,
4607
+ "alias": null,
4608
+ "jsdoc": "Accessible name for each toast's close button. French default so existing consumers are unchanged; the\nbutton is icon-only, so an app serving more than one language MUST translate it."
4609
+ }
4610
+ ],
4611
+ "outputs": [],
4612
+ "exportedTypes": [],
4613
+ "projectionSlots": [],
4614
+ "hostBindings": {},
4615
+ "examples": [
4616
+ {
4617
+ "sectionTitle": "Déclencher",
4618
+ "sectionDescription": "Injectez SdsToastService et appelez success / error / info. Les erreurs restent affichées plus longtemps.",
4619
+ "code": "private readonly toasts = inject(SdsToastService);\n\nsave(): void {\n this.api.save(form).subscribe({\n next: () => this.toasts.success('Formulaire enregistré.'),\n error: () => this.toasts.error('Échec de l’enregistrement.'),\n });\n}",
4620
+ "runnableExample": "<div class=\"flex flex-wrap gap-2\">\n <sds-button variant=\"secondary\" (click)=\"toasts.success('Formulaire enregistré.')\">\n Succès\n </sds-button>\n <sds-button variant=\"secondary\" (click)=\"toasts.error('Échec de l’enregistrement.')\">\n Erreur\n </sds-button>\n <sds-button variant=\"secondary\" (click)=\"toasts.info('Synchronisation en cours…')\">\n Info\n </sds-button>\n </div>",
4621
+ "stack": true,
4622
+ "dark": false
4623
+ },
4624
+ {
4625
+ "sectionTitle": "Mise en place",
4626
+ "sectionDescription": "Montez l'hôte une seule fois (dans le shell de l'application), puis poussez des toasts depuis n'importe quel service ou composant.",
4627
+ "code": "// Shell / app root — mount the host once:\n@Component({\n imports: [SdsToastHost /* … */],\n template: `\n <sds-shell> … </sds-shell>\n <sds-toast-host />\n `,\n})\nexport class AppShell {}",
4628
+ "runnableExample": "<p class=\"text-sm text-ink-soft\">\n <code class=\"rounded bg-muted px-1.5 py-0.5 text-xs\">&lt;sds-toast-host /&gt;</code>\n est monté une fois en haut de l'application ; il n'a pas de rendu propre tant qu'aucun toast n'est\n actif.\n </p>",
4629
+ "stack": true,
4630
+ "dark": false
4631
+ }
4632
+ ]
4633
+ },
4016
4634
  {
4017
4635
  "className": "SdsToggleSwitch",
4018
4636
  "selector": "sds-toggle-switch",
@@ -4395,6 +5013,18 @@
4395
5013
  ],
4396
5014
  "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."
4397
5015
  },
5016
+ {
5017
+ "className": "SdsToastService",
5018
+ "providedIn": "root",
5019
+ "exports": [
5020
+ "toasts",
5021
+ "success()",
5022
+ "error()",
5023
+ "info()",
5024
+ "dismiss()"
5025
+ ],
5026
+ "jsdoc": "A tiny transient-notification bus. Application code calls {@link success} / {@link error} / {@link info}\nafter an action; a single {@link SdsToastHost} mounted in the app shell renders the queue and each toast\nauto-dismisses. Deliberately minimal — no positions, no actions-in-toast — because it exists to confirm\nan action, not to be a notification centre.\n\n`providedIn: 'root'`, so injecting it anywhere shares one queue:\n\n```ts\nprivate readonly toasts = inject(SdsToastService);\nthis.toasts.success('Enregistré.');\n```\n\nMount the host once (e.g. in the shell): `<sds-toast-host />`."
5027
+ },
4398
5028
  {
4399
5029
  "className": "SidebarStore",
4400
5030
  "providedIn": "root",
@@ -4431,6 +5061,7 @@
4431
5061
  "chevron-down",
4432
5062
  "chevron-left",
4433
5063
  "chevron-right",
5064
+ "chevron-up",
4434
5065
  "chevrons-left",
4435
5066
  "chevrons-right",
4436
5067
  "chevrons-up-down",
@@ -4455,6 +5086,7 @@
4455
5086
  "map-pin",
4456
5087
  "megaphone",
4457
5088
  "menu",
5089
+ "minus",
4458
5090
  "monitor",
4459
5091
  "package",
4460
5092
  "package-open",
@@ -4466,6 +5098,7 @@
4466
5098
  "panel-top",
4467
5099
  "panels-top-left",
4468
5100
  "phone",
5101
+ "plus",
4469
5102
  "refresh-cw",
4470
5103
  "rotate-ccw",
4471
5104
  "rows-3",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@besaitech/ng-design-system-mcp",
3
- "version": "0.0.10",
3
+ "version": "0.0.12",
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": {