@maggioli-design-system/magma 2.0.0-beta.2 → 2.0.0-beta.3

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 (1150) hide show
  1. package/README.md +11 -3
  2. package/dist/cjs/{floating-controller-DA8xyqCa.js → floating-controller-CXEVR1wX.js} +5 -5
  3. package/dist/cjs/loader.cjs.js +1 -1
  4. package/dist/cjs/magma-components.cjs.js +1 -1
  5. package/dist/cjs/mds-accordion-item.cjs.entry.js +24 -2
  6. package/dist/cjs/mds-accordion-timer-item.cjs.entry.js +12 -2
  7. package/dist/cjs/mds-accordion-timer.cjs.entry.js +1 -1
  8. package/dist/cjs/mds-accordion.cjs.entry.js +32 -5
  9. package/dist/cjs/mds-author.cjs.entry.js +1 -1
  10. package/dist/cjs/mds-avatar-stack-item.cjs.entry.js +1 -1
  11. package/dist/cjs/mds-avatar-stack.cjs.entry.js +1 -1
  12. package/dist/cjs/mds-avatar.cjs.entry.js +27 -11
  13. package/dist/cjs/mds-badge.cjs.entry.js +24 -2
  14. package/dist/cjs/mds-banner_3.cjs.entry.js +49 -10
  15. package/dist/cjs/mds-benchmark-bar.cjs.entry.js +1 -1
  16. package/dist/cjs/mds-bibliography.cjs.entry.js +1 -1
  17. package/dist/cjs/mds-breadcrumb-item.cjs.entry.js +1 -1
  18. package/dist/cjs/mds-breadcrumb.cjs.entry.js +7 -7
  19. package/dist/cjs/mds-button-dropdown.cjs.entry.js +1 -1
  20. package/dist/cjs/mds-button-group.cjs.entry.js +1 -1
  21. package/dist/cjs/mds-button_3.cjs.entry.js +30 -9
  22. package/dist/cjs/mds-calendar_2.cjs.entry.js +69 -67
  23. package/dist/cjs/mds-card-content.cjs.entry.js +1 -1
  24. package/dist/cjs/mds-card-footer.cjs.entry.js +1 -1
  25. package/dist/cjs/mds-card-header.cjs.entry.js +1 -1
  26. package/dist/cjs/mds-card-media.cjs.entry.js +1 -1
  27. package/dist/cjs/mds-card.cjs.entry.js +22 -4
  28. package/dist/cjs/mds-details.cjs.entry.js +14 -2
  29. package/dist/cjs/mds-dropdown.cjs.entry.js +41 -21
  30. package/dist/cjs/mds-emoji.cjs.entry.js +1 -1
  31. package/dist/cjs/mds-entity.cjs.entry.js +20 -2
  32. package/dist/cjs/mds-file-preview.cjs.entry.js +25 -3
  33. package/dist/cjs/mds-file.cjs.entry.js +26 -4
  34. package/dist/cjs/mds-filter-item.cjs.entry.js +22 -2
  35. package/dist/cjs/mds-filter.cjs.entry.js +24 -2
  36. package/dist/cjs/mds-header-bar.cjs.entry.js +24 -2
  37. package/dist/cjs/mds-header.cjs.entry.js +20 -4
  38. package/dist/cjs/mds-horizontal-scroll.cjs.entry.js +1 -1
  39. package/dist/cjs/mds-hr.cjs.entry.js +16 -2
  40. package/dist/cjs/mds-img.cjs.entry.js +5 -4
  41. package/dist/cjs/mds-input-date-range-preselection.cjs.entry.js +1 -1
  42. package/dist/cjs/mds-input-date-range.cjs.entry.js +31 -14
  43. package/dist/cjs/mds-input-date.cjs.entry.js +38 -14
  44. package/dist/cjs/mds-input-field.cjs.entry.js +1 -1
  45. package/dist/cjs/mds-input-otp.cjs.entry.js +1 -1
  46. package/dist/cjs/mds-input-range.cjs.entry.js +24 -2
  47. package/dist/cjs/mds-input-select.cjs.entry.js +25 -3
  48. package/dist/cjs/mds-input-switch_2.cjs.entry.js +27 -4
  49. package/dist/cjs/mds-input-tip_2.cjs.entry.js +28 -5
  50. package/dist/cjs/mds-input-upload.cjs.entry.js +17 -7
  51. package/dist/cjs/mds-input.cjs.entry.js +26 -3
  52. package/dist/cjs/mds-keyboard-key.cjs.entry.js +1 -1
  53. package/dist/cjs/mds-keyboard.cjs.entry.js +30 -11
  54. package/dist/cjs/mds-kpi-item.cjs.entry.js +24 -2
  55. package/dist/cjs/mds-kpi.cjs.entry.js +1 -1
  56. package/dist/cjs/mds-label.cjs.entry.js +18 -2
  57. package/dist/cjs/mds-list-item.cjs.entry.js +12 -2
  58. package/dist/cjs/mds-list.cjs.entry.js +1 -1
  59. package/dist/cjs/mds-mention.cjs.entry.js +1 -1
  60. package/dist/cjs/mds-modal.cjs.entry.js +121 -43
  61. package/dist/cjs/mds-note.cjs.entry.js +22 -2
  62. package/dist/cjs/mds-notification.cjs.entry.js +14 -4
  63. package/dist/cjs/mds-paginator-item.cjs.entry.js +18 -2
  64. package/dist/cjs/mds-paginator.cjs.entry.js +39 -2
  65. package/dist/cjs/mds-policy-ai.cjs.entry.js +5 -2
  66. package/dist/cjs/mds-pref-animation.cjs.entry.js +15 -8
  67. package/dist/cjs/mds-pref-consumption.cjs.entry.js +15 -8
  68. package/dist/cjs/mds-pref-contrast.cjs.entry.js +15 -8
  69. package/dist/cjs/mds-pref-language-item.cjs.entry.js +2 -2
  70. package/dist/cjs/mds-pref-language.cjs.entry.js +2 -2
  71. package/dist/cjs/mds-pref-theme-variant-item.cjs.entry.js +2 -2
  72. package/dist/cjs/mds-pref-theme-variant.cjs.entry.js +2 -2
  73. package/dist/cjs/mds-pref-theme.cjs.entry.js +27 -18
  74. package/dist/cjs/mds-pref.cjs.entry.js +2 -2
  75. package/dist/cjs/mds-price-table-features-cell.cjs.entry.js +24 -2
  76. package/dist/cjs/mds-price-table-features-row.cjs.entry.js +24 -2
  77. package/dist/cjs/mds-price-table-features.cjs.entry.js +24 -2
  78. package/dist/cjs/mds-price-table-header.cjs.entry.js +2 -2
  79. package/dist/cjs/mds-price-table-list-item.cjs.entry.js +2 -2
  80. package/dist/cjs/mds-price-table-list.cjs.entry.js +24 -2
  81. package/dist/cjs/mds-price-table.cjs.entry.js +2 -2
  82. package/dist/cjs/mds-progress_2.cjs.entry.js +26 -4
  83. package/dist/cjs/mds-push-notification-item.cjs.entry.js +28 -6
  84. package/dist/cjs/mds-push-notification.cjs.entry.js +16 -2
  85. package/dist/cjs/mds-quote.cjs.entry.js +12 -2
  86. package/dist/cjs/mds-radial-menu-item.cjs.entry.js +2 -2
  87. package/dist/cjs/mds-radial-menu.cjs.entry.js +3 -3
  88. package/dist/cjs/mds-separator.cjs.entry.js +20 -2
  89. package/dist/cjs/mds-status-bar.cjs.entry.js +25 -3
  90. package/dist/cjs/mds-stepper-bar-item.cjs.entry.js +10 -2
  91. package/dist/cjs/mds-stepper-bar.cjs.entry.js +2 -2
  92. package/dist/cjs/mds-tab-bar-item.cjs.entry.js +24 -2
  93. package/dist/cjs/mds-tab-bar.cjs.entry.js +24 -2
  94. package/dist/cjs/mds-tab_2.cjs.entry.js +56 -6
  95. package/dist/cjs/mds-table-body.cjs.entry.js +12 -2
  96. package/dist/cjs/mds-table-footer.cjs.entry.js +12 -2
  97. package/dist/cjs/mds-table-header-cell.cjs.entry.js +12 -2
  98. package/dist/cjs/mds-table-header.cjs.entry.js +12 -2
  99. package/dist/cjs/mds-table-row.cjs.entry.js +12 -4
  100. package/dist/cjs/mds-table.cjs.entry.js +26 -4
  101. package/dist/cjs/mds-text.cjs.entry.js +12 -2
  102. package/dist/cjs/mds-toast.cjs.entry.js +24 -2
  103. package/dist/cjs/mds-tooltip.cjs.entry.js +37 -17
  104. package/dist/cjs/mds-tree-item.cjs.entry.js +26 -2
  105. package/dist/cjs/mds-tree.cjs.entry.js +34 -2
  106. package/dist/cjs/mds-url-view.cjs.entry.js +22 -2
  107. package/dist/cjs/mds-usage.cjs.entry.js +24 -2
  108. package/dist/cjs/mds-video-wall.cjs.entry.js +2 -2
  109. package/dist/cjs/mds-zero.cjs.entry.js +24 -2
  110. package/dist/cjs/preference-BdpIXWLP.js +81 -0
  111. package/dist/collection/common/floating-controller.js +5 -5
  112. package/dist/collection/common/preference.js +78 -0
  113. package/dist/collection/components/mds-accordion/mds-accordion.css +16 -16
  114. package/dist/collection/components/mds-accordion/mds-accordion.js +43 -9
  115. package/dist/collection/components/mds-accordion/test/mds-accordion.stories.js +4 -3
  116. package/dist/collection/components/mds-accordion-item/mds-accordion-item.css +38 -27
  117. package/dist/collection/components/mds-accordion-item/mds-accordion-item.js +31 -1
  118. package/dist/collection/components/mds-accordion-timer/mds-accordion-timer.css +0 -11
  119. package/dist/collection/components/mds-accordion-timer-item/mds-accordion-timer-item.css +16 -8
  120. package/dist/collection/components/mds-accordion-timer-item/mds-accordion-timer-item.js +16 -1
  121. package/dist/collection/components/mds-author/mds-author.css +1 -1
  122. package/dist/collection/components/mds-avatar/mds-avatar.css +27 -19
  123. package/dist/collection/components/mds-avatar/mds-avatar.js +28 -10
  124. package/dist/collection/components/mds-avatar-stack/mds-avatar-stack.css +25 -0
  125. package/dist/collection/components/mds-avatar-stack-item/mds-avatar-stack-item.css +5 -113
  126. package/dist/collection/components/mds-badge/mds-badge.css +41 -21
  127. package/dist/collection/components/mds-badge/mds-badge.js +31 -1
  128. package/dist/collection/components/mds-banner/mds-banner.css +36 -15
  129. package/dist/collection/components/mds-banner/mds-banner.js +31 -7
  130. package/dist/collection/components/mds-banner/test/mds-banner.stories.js +3 -3
  131. package/dist/collection/components/mds-bibliography/mds-bibliography.css +2 -2
  132. package/dist/collection/components/mds-breadcrumb/mds-breadcrumb.css +0 -12
  133. package/dist/collection/components/mds-breadcrumb/mds-breadcrumb.js +10 -10
  134. package/dist/collection/components/mds-breadcrumb/test/mds-breadcrumb.stories.js +2 -2
  135. package/dist/collection/components/mds-button/mds-button.css +27 -29
  136. package/dist/collection/components/mds-button/mds-button.js +22 -1
  137. package/dist/collection/components/mds-button-group/mds-button-group.css +15 -0
  138. package/dist/collection/components/mds-calendar/mds-calendar.js +67 -65
  139. package/dist/collection/components/mds-card/mds-card.css +17 -6
  140. package/dist/collection/components/mds-card/mds-card.js +28 -7
  141. package/dist/collection/components/mds-card/test/mds-card.stories.js +3 -3
  142. package/dist/collection/components/mds-chip/mds-chip.css +38 -24
  143. package/dist/collection/components/mds-chip/mds-chip.js +25 -1
  144. package/dist/collection/components/mds-details/mds-details.css +23 -10
  145. package/dist/collection/components/mds-details/mds-details.js +15 -1
  146. package/dist/collection/components/mds-dropdown/mds-dropdown.css +40 -19
  147. package/dist/collection/components/mds-dropdown/mds-dropdown.js +63 -35
  148. package/dist/collection/components/mds-dropdown/test/mds-dropdown.stories.js +15 -15
  149. package/dist/collection/components/mds-entity/mds-entity.css +19 -10
  150. package/dist/collection/components/mds-entity/mds-entity.js +26 -1
  151. package/dist/collection/components/mds-file/mds-file.css +32 -20
  152. package/dist/collection/components/mds-file/mds-file.js +33 -7
  153. package/dist/collection/components/mds-file/test/mds-file.stories.js +2 -2
  154. package/dist/collection/components/mds-file-preview/mds-file-preview.css +41 -23
  155. package/dist/collection/components/mds-file-preview/mds-file-preview.js +28 -2
  156. package/dist/collection/components/mds-filter/mds-filter.css +43 -26
  157. package/dist/collection/components/mds-filter/mds-filter.js +27 -1
  158. package/dist/collection/components/mds-filter-item/mds-filter-item.css +33 -13
  159. package/dist/collection/components/mds-filter-item/mds-filter-item.js +29 -1
  160. package/dist/collection/components/mds-header/mds-header.css +18 -7
  161. package/dist/collection/components/mds-header/mds-header.js +27 -8
  162. package/dist/collection/components/mds-header/test/mds-header.stories.js +2 -2
  163. package/dist/collection/components/mds-header-bar/mds-header-bar.css +33 -13
  164. package/dist/collection/components/mds-header-bar/mds-header-bar.js +27 -1
  165. package/dist/collection/components/mds-help/mds-help.js +7 -7
  166. package/dist/collection/components/mds-horizontal-scroll/mds-horizontal-scroll.css +11 -15
  167. package/dist/collection/components/mds-hr/mds-hr.css +9 -3
  168. package/dist/collection/components/mds-hr/mds-hr.js +21 -1
  169. package/dist/collection/components/mds-icon/mds-icon.js +2 -4
  170. package/dist/collection/components/mds-img/mds-img.js +4 -3
  171. package/dist/collection/components/mds-input/mds-input.css +34 -60
  172. package/dist/collection/components/mds-input/mds-input.js +29 -2
  173. package/dist/collection/components/mds-input-date/mds-input-date.css +35 -16
  174. package/dist/collection/components/mds-input-date/mds-input-date.js +41 -13
  175. package/dist/collection/components/mds-input-date-range/mds-input-date-range.css +35 -15
  176. package/dist/collection/components/mds-input-date-range/mds-input-date-range.js +34 -13
  177. package/dist/collection/components/mds-input-field/mds-input-field.css +48 -0
  178. package/dist/collection/components/mds-input-range/mds-input-range.css +37 -36
  179. package/dist/collection/components/mds-input-range/mds-input-range.js +28 -2
  180. package/dist/collection/components/mds-input-select/mds-input-select.css +40 -28
  181. package/dist/collection/components/mds-input-select/mds-input-select.js +28 -2
  182. package/dist/collection/components/mds-input-switch/mds-input-switch.css +9 -3
  183. package/dist/collection/components/mds-input-switch/mds-input-switch.js +17 -1
  184. package/dist/collection/components/mds-input-tip/mds-input-tip.css +16 -7
  185. package/dist/collection/components/mds-input-tip/mds-input-tip.js +16 -1
  186. package/dist/collection/components/mds-input-tip-item/mds-input-tip-item.css +29 -16
  187. package/dist/collection/components/mds-input-tip-item/mds-input-tip-item.js +18 -2
  188. package/dist/collection/components/mds-input-upload/mds-input-upload.css +2 -5
  189. package/dist/collection/components/mds-input-upload/mds-input-upload.js +16 -6
  190. package/dist/collection/components/mds-keyboard/mds-keyboard.css +9 -3
  191. package/dist/collection/components/mds-keyboard/mds-keyboard.js +31 -10
  192. package/dist/collection/components/mds-kpi-item/mds-kpi-item.css +47 -43
  193. package/dist/collection/components/mds-kpi-item/mds-kpi-item.js +27 -1
  194. package/dist/collection/components/mds-label/mds-label.css +17 -6
  195. package/dist/collection/components/mds-label/mds-label.js +20 -1
  196. package/dist/collection/components/mds-list/mds-list.css +4 -5
  197. package/dist/collection/components/mds-list-item/mds-list-item.css +11 -8
  198. package/dist/collection/components/mds-list-item/mds-list-item.js +16 -1
  199. package/dist/collection/components/mds-modal/mds-modal.css +198 -67
  200. package/dist/collection/components/mds-modal/mds-modal.js +133 -74
  201. package/dist/collection/components/mds-modal/test/mds-modal.stories.js +44 -3
  202. package/dist/collection/components/mds-note/mds-note.css +47 -35
  203. package/dist/collection/components/mds-note/mds-note.js +25 -1
  204. package/dist/collection/components/mds-notification/mds-notification.css +34 -26
  205. package/dist/collection/components/mds-notification/mds-notification.js +22 -7
  206. package/dist/collection/components/mds-notification/test/mds-notification.stories.js +7 -7
  207. package/dist/collection/components/mds-paginator/mds-paginator.css +48 -28
  208. package/dist/collection/components/mds-paginator/mds-paginator.js +46 -1
  209. package/dist/collection/components/mds-paginator-item/mds-paginator-item.css +29 -15
  210. package/dist/collection/components/mds-paginator-item/mds-paginator-item.js +24 -1
  211. package/dist/collection/components/mds-policy-ai/mds-policy-ai.css +10 -7
  212. package/dist/collection/components/mds-policy-ai/mds-policy-ai.js +4 -1
  213. package/dist/collection/components/mds-pref/mds-pref.js +1 -1
  214. package/dist/collection/components/mds-pref-animation/mds-pref-animation.css +8 -3
  215. package/dist/collection/components/mds-pref-animation/mds-pref-animation.js +15 -7
  216. package/dist/collection/components/mds-pref-consumption/mds-pref-consumption.css +8 -3
  217. package/dist/collection/components/mds-pref-consumption/mds-pref-consumption.js +15 -7
  218. package/dist/collection/components/mds-pref-contrast/mds-pref-contrast.css +8 -3
  219. package/dist/collection/components/mds-pref-contrast/mds-pref-contrast.js +15 -7
  220. package/dist/collection/components/mds-pref-language/mds-pref-language.js +1 -1
  221. package/dist/collection/components/mds-pref-language-item/mds-pref-language-item.js +1 -1
  222. package/dist/collection/components/mds-pref-theme/mds-pref-theme.css +3 -3
  223. package/dist/collection/components/mds-pref-theme/mds-pref-theme.js +29 -17
  224. package/dist/collection/components/mds-pref-theme-variant/mds-pref-theme-variant.js +1 -1
  225. package/dist/collection/components/mds-pref-theme-variant-item/mds-pref-theme-variant-item.js +1 -1
  226. package/dist/collection/components/mds-price-table/mds-price-table.js +1 -1
  227. package/dist/collection/components/mds-price-table-features/mds-price-table-features.css +35 -16
  228. package/dist/collection/components/mds-price-table-features/mds-price-table-features.js +31 -1
  229. package/dist/collection/components/mds-price-table-features-cell/mds-price-table-features-cell.css +39 -24
  230. package/dist/collection/components/mds-price-table-features-cell/mds-price-table-features-cell.js +31 -1
  231. package/dist/collection/components/mds-price-table-features-row/mds-price-table-features-row.css +37 -17
  232. package/dist/collection/components/mds-price-table-features-row/mds-price-table-features-row.js +28 -2
  233. package/dist/collection/components/mds-price-table-header/mds-price-table-header.js +1 -1
  234. package/dist/collection/components/mds-price-table-list/mds-price-table-list.css +41 -28
  235. package/dist/collection/components/mds-price-table-list/mds-price-table-list.js +28 -2
  236. package/dist/collection/components/mds-price-table-list-item/mds-price-table-list-item.css +4 -5
  237. package/dist/collection/components/mds-price-table-list-item/mds-price-table-list-item.js +1 -1
  238. package/dist/collection/components/mds-progress/mds-progress.css +37 -19
  239. package/dist/collection/components/mds-progress/mds-progress.js +27 -1
  240. package/dist/collection/components/mds-push-notification/mds-push-notification.css +14 -8
  241. package/dist/collection/components/mds-push-notification/mds-push-notification.js +21 -1
  242. package/dist/collection/components/mds-push-notification-item/mds-push-notification-item.css +51 -38
  243. package/dist/collection/components/mds-push-notification-item/mds-push-notification-item.js +33 -7
  244. package/dist/collection/components/mds-push-notification-item/test/mds-push-notification-item.stories.js +2 -2
  245. package/dist/collection/components/mds-quote/mds-quote.css +9 -5
  246. package/dist/collection/components/mds-quote/mds-quote.js +16 -1
  247. package/dist/collection/components/mds-radial-menu/mds-radial-menu.js +1 -1
  248. package/dist/collection/components/mds-radial-menu-item/mds-radial-menu-item.js +1 -1
  249. package/dist/collection/components/mds-radial-progress/mds-radial-progress.js +1 -1
  250. package/dist/collection/components/mds-separator/mds-separator.css +19 -9
  251. package/dist/collection/components/mds-separator/mds-separator.js +26 -1
  252. package/dist/collection/components/mds-spinner/mds-spinner.css +29 -23
  253. package/dist/collection/components/mds-spinner/mds-spinner.js +16 -1
  254. package/dist/collection/components/mds-status-bar/mds-status-bar.css +22 -19
  255. package/dist/collection/components/mds-status-bar/mds-status-bar.js +32 -2
  256. package/dist/collection/components/mds-stepper-bar/mds-stepper-bar.css +13 -32
  257. package/dist/collection/components/mds-stepper-bar/mds-stepper-bar.js +1 -1
  258. package/dist/collection/components/mds-stepper-bar-item/mds-stepper-bar-item.css +34 -44
  259. package/dist/collection/components/mds-stepper-bar-item/mds-stepper-bar-item.js +10 -1
  260. package/dist/collection/components/mds-tab/mds-tab.css +50 -20
  261. package/dist/collection/components/mds-tab/mds-tab.js +40 -3
  262. package/dist/collection/components/mds-tab-bar/mds-tab-bar.css +35 -14
  263. package/dist/collection/components/mds-tab-bar/mds-tab-bar.js +31 -1
  264. package/dist/collection/components/mds-tab-bar-item/mds-tab-bar-item.css +36 -16
  265. package/dist/collection/components/mds-tab-bar-item/mds-tab-bar-item.js +27 -1
  266. package/dist/collection/components/mds-tab-item/mds-tab-item.css +11 -6
  267. package/dist/collection/components/mds-tab-item/mds-tab-item.js +74 -1
  268. package/dist/collection/components/mds-table/mds-table.css +39 -19
  269. package/dist/collection/components/mds-table/mds-table.js +29 -3
  270. package/dist/collection/components/mds-table-body/mds-table-body.css +18 -9
  271. package/dist/collection/components/mds-table-body/mds-table-body.js +16 -1
  272. package/dist/collection/components/mds-table-cell/mds-table-cell.css +17 -8
  273. package/dist/collection/components/mds-table-cell/mds-table-cell.js +16 -1
  274. package/dist/collection/components/mds-table-footer/mds-table-footer.css +18 -8
  275. package/dist/collection/components/mds-table-footer/mds-table-footer.js +16 -1
  276. package/dist/collection/components/mds-table-header/mds-table-header.css +18 -8
  277. package/dist/collection/components/mds-table-header/mds-table-header.js +12 -1
  278. package/dist/collection/components/mds-table-header-cell/mds-table-header-cell.css +20 -10
  279. package/dist/collection/components/mds-table-header-cell/mds-table-header-cell.js +13 -2
  280. package/dist/collection/components/mds-table-row/mds-table-row.css +25 -14
  281. package/dist/collection/components/mds-table-row/mds-table-row.js +31 -3
  282. package/dist/collection/components/mds-text/mds-text.css +7 -5
  283. package/dist/collection/components/mds-text/mds-text.js +16 -1
  284. package/dist/collection/components/mds-toast/mds-toast.css +51 -26
  285. package/dist/collection/components/mds-toast/mds-toast.js +32 -2
  286. package/dist/collection/components/mds-tooltip/mds-tooltip.css +39 -22
  287. package/dist/collection/components/mds-tooltip/mds-tooltip.js +54 -26
  288. package/dist/collection/components/mds-tooltip/test/mds-tooltip.stories.js +11 -11
  289. package/dist/collection/components/mds-tree/mds-tree.css +2 -2
  290. package/dist/collection/components/mds-tree/mds-tree.js +33 -1
  291. package/dist/collection/components/mds-tree-item/mds-tree-item.css +47 -76
  292. package/dist/collection/components/mds-tree-item/mds-tree-item.js +95 -1
  293. package/dist/collection/components/mds-url-view/mds-url-view.css +43 -31
  294. package/dist/collection/components/mds-url-view/mds-url-view.js +25 -1
  295. package/dist/collection/components/mds-usage/mds-usage.css +44 -26
  296. package/dist/collection/components/mds-usage/mds-usage.js +27 -1
  297. package/dist/collection/components/mds-video-wall/mds-video-wall.css +13 -14
  298. package/dist/collection/components/mds-video-wall/mds-video-wall.js +2 -1
  299. package/dist/collection/components/mds-zero/mds-zero.css +36 -20
  300. package/dist/collection/components/mds-zero/mds-zero.js +31 -1
  301. package/dist/collection/storybook/color-scale.stories.js +1 -1
  302. package/dist/components/floating-controller.js +1 -1
  303. package/dist/components/mds-accordion-item.js +1 -1
  304. package/dist/components/mds-accordion-timer-item.js +1 -1
  305. package/dist/components/mds-accordion-timer.js +1 -1
  306. package/dist/components/mds-accordion.js +1 -1
  307. package/dist/components/mds-author.js +1 -1
  308. package/dist/components/mds-avatar-stack-item2.js +1 -1
  309. package/dist/components/mds-avatar-stack.js +1 -1
  310. package/dist/components/mds-avatar2.js +1 -1
  311. package/dist/components/mds-badge2.js +1 -1
  312. package/dist/components/mds-banner2.js +1 -1
  313. package/dist/components/mds-benchmark-bar.js +1 -1
  314. package/dist/components/mds-bibliography.js +1 -1
  315. package/dist/components/mds-breadcrumb-item.js +1 -1
  316. package/dist/components/mds-breadcrumb.js +1 -1
  317. package/dist/components/mds-button-dropdown.js +1 -1
  318. package/dist/components/mds-button-group.js +1 -1
  319. package/dist/components/mds-button2.js +1 -1
  320. package/dist/components/mds-calendar-cell2.js +1 -1
  321. package/dist/components/mds-calendar2.js +1 -1
  322. package/dist/components/mds-card-content.js +1 -1
  323. package/dist/components/mds-card-footer.js +1 -1
  324. package/dist/components/mds-card-header.js +1 -1
  325. package/dist/components/mds-card-media.js +1 -1
  326. package/dist/components/mds-card.js +1 -1
  327. package/dist/components/mds-chip2.js +1 -1
  328. package/dist/components/mds-details.js +1 -1
  329. package/dist/components/mds-dropdown2.js +1 -1
  330. package/dist/components/mds-emoji.js +1 -1
  331. package/dist/components/mds-entity.js +1 -1
  332. package/dist/components/mds-file-preview2.js +2 -2
  333. package/dist/components/mds-file.js +3 -3
  334. package/dist/components/mds-filter-item2.js +1 -1
  335. package/dist/components/mds-filter.js +1 -1
  336. package/dist/components/mds-header-bar.js +1 -1
  337. package/dist/components/mds-header.js +1 -1
  338. package/dist/components/mds-help2.js +1 -1
  339. package/dist/components/mds-horizontal-scroll.js +1 -1
  340. package/dist/components/mds-hr.js +1 -1
  341. package/dist/components/mds-icon2.js +1 -1
  342. package/dist/components/mds-img2.js +1 -1
  343. package/dist/components/mds-input-date-range-preselection.js +1 -1
  344. package/dist/components/mds-input-date-range.js +1 -1
  345. package/dist/components/mds-input-date.js +1 -1
  346. package/dist/components/mds-input-field.js +1 -1
  347. package/dist/components/mds-input-otp.js +1 -1
  348. package/dist/components/mds-input-range.js +1 -1
  349. package/dist/components/mds-input-select.js +1 -1
  350. package/dist/components/mds-input-switch2.js +1 -1
  351. package/dist/components/mds-input-tip-item2.js +1 -1
  352. package/dist/components/mds-input-tip2.js +1 -1
  353. package/dist/components/mds-input-upload.js +1 -1
  354. package/dist/components/mds-input2.js +1 -1
  355. package/dist/components/mds-keyboard-key.js +1 -1
  356. package/dist/components/mds-keyboard.js +1 -1
  357. package/dist/components/mds-kpi-item.js +1 -1
  358. package/dist/components/mds-kpi.js +1 -1
  359. package/dist/components/mds-label.js +1 -1
  360. package/dist/components/mds-list-item.js +1 -1
  361. package/dist/components/mds-list.js +1 -1
  362. package/dist/components/mds-mention.js +1 -1
  363. package/dist/components/mds-modal2.js +1 -1
  364. package/dist/components/mds-note.js +1 -1
  365. package/dist/components/mds-notification.js +1 -1
  366. package/dist/components/mds-paginator-item2.js +1 -1
  367. package/dist/components/mds-paginator.js +1 -1
  368. package/dist/components/mds-policy-ai.js +1 -1
  369. package/dist/components/mds-pref-animation.js +1 -1
  370. package/dist/components/mds-pref-consumption.js +1 -1
  371. package/dist/components/mds-pref-contrast.js +1 -1
  372. package/dist/components/mds-pref-language-item.js +1 -1
  373. package/dist/components/mds-pref-language.js +1 -1
  374. package/dist/components/mds-pref-theme-variant-item.js +1 -1
  375. package/dist/components/mds-pref-theme-variant.js +1 -1
  376. package/dist/components/mds-pref-theme.js +1 -1
  377. package/dist/components/mds-pref.js +1 -1
  378. package/dist/components/mds-price-table-features-cell.js +1 -1
  379. package/dist/components/mds-price-table-features-row.js +1 -1
  380. package/dist/components/mds-price-table-features.js +1 -1
  381. package/dist/components/mds-price-table-header.js +1 -1
  382. package/dist/components/mds-price-table-list-item.js +1 -1
  383. package/dist/components/mds-price-table-list.js +1 -1
  384. package/dist/components/mds-price-table.js +1 -1
  385. package/dist/components/mds-progress2.js +1 -1
  386. package/dist/components/mds-push-notification-item.js +1 -1
  387. package/dist/components/mds-push-notification.js +1 -1
  388. package/dist/components/mds-quote.js +1 -1
  389. package/dist/components/mds-radial-menu-item.js +1 -1
  390. package/dist/components/mds-radial-menu.js +1 -1
  391. package/dist/components/mds-radial-progress2.js +1 -1
  392. package/dist/components/mds-separator2.js +1 -1
  393. package/dist/components/mds-spinner2.js +1 -1
  394. package/dist/components/mds-status-bar.js +1 -1
  395. package/dist/components/mds-stepper-bar-item.js +1 -1
  396. package/dist/components/mds-stepper-bar.js +1 -1
  397. package/dist/components/mds-tab-bar-item.js +1 -1
  398. package/dist/components/mds-tab-bar.js +1 -1
  399. package/dist/components/mds-tab-item2.js +1 -1
  400. package/dist/components/mds-tab2.js +1 -1
  401. package/dist/components/mds-table-body.js +1 -1
  402. package/dist/components/mds-table-cell2.js +1 -1
  403. package/dist/components/mds-table-footer.js +1 -1
  404. package/dist/components/mds-table-header-cell2.js +1 -1
  405. package/dist/components/mds-table-header.js +1 -1
  406. package/dist/components/mds-table-row.js +1 -1
  407. package/dist/components/mds-table.js +1 -1
  408. package/dist/components/mds-text2.js +1 -1
  409. package/dist/components/mds-toast.js +1 -1
  410. package/dist/components/mds-tooltip2.js +1 -1
  411. package/dist/components/mds-tree-item.js +1 -1
  412. package/dist/components/mds-tree.js +1 -1
  413. package/dist/components/mds-url-view.js +1 -1
  414. package/dist/components/mds-usage.js +1 -1
  415. package/dist/components/mds-video-wall.js +1 -1
  416. package/dist/components/mds-zero.js +1 -1
  417. package/dist/components/preference.js +1 -0
  418. package/dist/documentation.json +488 -382
  419. package/dist/esm/{floating-controller-CP3-OFb9.js → floating-controller-D5eXU5Mk.js} +5 -5
  420. package/dist/esm/loader.js +1 -1
  421. package/dist/esm/magma-components.js +1 -1
  422. package/dist/esm/mds-accordion-item.entry.js +24 -2
  423. package/dist/esm/mds-accordion-timer-item.entry.js +12 -2
  424. package/dist/esm/mds-accordion-timer.entry.js +1 -1
  425. package/dist/esm/mds-accordion.entry.js +32 -5
  426. package/dist/esm/mds-author.entry.js +1 -1
  427. package/dist/esm/mds-avatar-stack-item.entry.js +1 -1
  428. package/dist/esm/mds-avatar-stack.entry.js +1 -1
  429. package/dist/esm/mds-avatar.entry.js +27 -11
  430. package/dist/esm/mds-badge.entry.js +24 -2
  431. package/dist/esm/mds-banner_3.entry.js +49 -10
  432. package/dist/esm/mds-benchmark-bar.entry.js +1 -1
  433. package/dist/esm/mds-bibliography.entry.js +1 -1
  434. package/dist/esm/mds-breadcrumb-item.entry.js +1 -1
  435. package/dist/esm/mds-breadcrumb.entry.js +7 -7
  436. package/dist/esm/mds-button-dropdown.entry.js +1 -1
  437. package/dist/esm/mds-button-group.entry.js +1 -1
  438. package/dist/esm/mds-button_3.entry.js +30 -9
  439. package/dist/esm/mds-calendar_2.entry.js +69 -67
  440. package/dist/esm/mds-card-content.entry.js +1 -1
  441. package/dist/esm/mds-card-footer.entry.js +1 -1
  442. package/dist/esm/mds-card-header.entry.js +1 -1
  443. package/dist/esm/mds-card-media.entry.js +1 -1
  444. package/dist/esm/mds-card.entry.js +22 -4
  445. package/dist/esm/mds-details.entry.js +14 -2
  446. package/dist/esm/mds-dropdown.entry.js +41 -21
  447. package/dist/esm/mds-emoji.entry.js +1 -1
  448. package/dist/esm/mds-entity.entry.js +20 -2
  449. package/dist/esm/mds-file-preview.entry.js +25 -3
  450. package/dist/esm/mds-file.entry.js +26 -4
  451. package/dist/esm/mds-filter-item.entry.js +22 -2
  452. package/dist/esm/mds-filter.entry.js +24 -2
  453. package/dist/esm/mds-header-bar.entry.js +24 -2
  454. package/dist/esm/mds-header.entry.js +20 -4
  455. package/dist/esm/mds-horizontal-scroll.entry.js +1 -1
  456. package/dist/esm/mds-hr.entry.js +16 -2
  457. package/dist/esm/mds-img.entry.js +5 -4
  458. package/dist/esm/mds-input-date-range-preselection.entry.js +1 -1
  459. package/dist/esm/mds-input-date-range.entry.js +31 -14
  460. package/dist/esm/mds-input-date.entry.js +38 -14
  461. package/dist/esm/mds-input-field.entry.js +1 -1
  462. package/dist/esm/mds-input-otp.entry.js +1 -1
  463. package/dist/esm/mds-input-range.entry.js +24 -2
  464. package/dist/esm/mds-input-select.entry.js +25 -3
  465. package/dist/esm/mds-input-switch_2.entry.js +27 -4
  466. package/dist/esm/mds-input-tip_2.entry.js +28 -5
  467. package/dist/esm/mds-input-upload.entry.js +17 -7
  468. package/dist/esm/mds-input.entry.js +26 -3
  469. package/dist/esm/mds-keyboard-key.entry.js +1 -1
  470. package/dist/esm/mds-keyboard.entry.js +30 -11
  471. package/dist/esm/mds-kpi-item.entry.js +24 -2
  472. package/dist/esm/mds-kpi.entry.js +1 -1
  473. package/dist/esm/mds-label.entry.js +18 -2
  474. package/dist/esm/mds-list-item.entry.js +12 -2
  475. package/dist/esm/mds-list.entry.js +1 -1
  476. package/dist/esm/mds-mention.entry.js +1 -1
  477. package/dist/esm/mds-modal.entry.js +121 -43
  478. package/dist/esm/mds-note.entry.js +22 -2
  479. package/dist/esm/mds-notification.entry.js +14 -4
  480. package/dist/esm/mds-paginator-item.entry.js +18 -2
  481. package/dist/esm/mds-paginator.entry.js +39 -2
  482. package/dist/esm/mds-policy-ai.entry.js +5 -2
  483. package/dist/esm/mds-pref-animation.entry.js +15 -8
  484. package/dist/esm/mds-pref-consumption.entry.js +15 -8
  485. package/dist/esm/mds-pref-contrast.entry.js +15 -8
  486. package/dist/esm/mds-pref-language-item.entry.js +2 -2
  487. package/dist/esm/mds-pref-language.entry.js +2 -2
  488. package/dist/esm/mds-pref-theme-variant-item.entry.js +2 -2
  489. package/dist/esm/mds-pref-theme-variant.entry.js +2 -2
  490. package/dist/esm/mds-pref-theme.entry.js +27 -18
  491. package/dist/esm/mds-pref.entry.js +2 -2
  492. package/dist/esm/mds-price-table-features-cell.entry.js +24 -2
  493. package/dist/esm/mds-price-table-features-row.entry.js +24 -2
  494. package/dist/esm/mds-price-table-features.entry.js +24 -2
  495. package/dist/esm/mds-price-table-header.entry.js +2 -2
  496. package/dist/esm/mds-price-table-list-item.entry.js +2 -2
  497. package/dist/esm/mds-price-table-list.entry.js +24 -2
  498. package/dist/esm/mds-price-table.entry.js +2 -2
  499. package/dist/esm/mds-progress_2.entry.js +26 -4
  500. package/dist/esm/mds-push-notification-item.entry.js +28 -6
  501. package/dist/esm/mds-push-notification.entry.js +16 -2
  502. package/dist/esm/mds-quote.entry.js +12 -2
  503. package/dist/esm/mds-radial-menu-item.entry.js +2 -2
  504. package/dist/esm/mds-radial-menu.entry.js +3 -3
  505. package/dist/esm/mds-separator.entry.js +20 -2
  506. package/dist/esm/mds-status-bar.entry.js +25 -3
  507. package/dist/esm/mds-stepper-bar-item.entry.js +10 -2
  508. package/dist/esm/mds-stepper-bar.entry.js +2 -2
  509. package/dist/esm/mds-tab-bar-item.entry.js +24 -2
  510. package/dist/esm/mds-tab-bar.entry.js +24 -2
  511. package/dist/esm/mds-tab_2.entry.js +56 -6
  512. package/dist/esm/mds-table-body.entry.js +12 -2
  513. package/dist/esm/mds-table-footer.entry.js +12 -2
  514. package/dist/esm/mds-table-header-cell.entry.js +12 -2
  515. package/dist/esm/mds-table-header.entry.js +12 -2
  516. package/dist/esm/mds-table-row.entry.js +12 -4
  517. package/dist/esm/mds-table.entry.js +26 -4
  518. package/dist/esm/mds-text.entry.js +12 -2
  519. package/dist/esm/mds-toast.entry.js +24 -2
  520. package/dist/esm/mds-tooltip.entry.js +37 -17
  521. package/dist/esm/mds-tree-item.entry.js +26 -2
  522. package/dist/esm/mds-tree.entry.js +34 -2
  523. package/dist/esm/mds-url-view.entry.js +22 -2
  524. package/dist/esm/mds-usage.entry.js +24 -2
  525. package/dist/esm/mds-video-wall.entry.js +2 -2
  526. package/dist/esm/mds-zero.entry.js +24 -2
  527. package/dist/esm/preference-fMwnXhio.js +79 -0
  528. package/dist/esm-es5/floating-controller-D5eXU5Mk.js +1 -0
  529. package/dist/esm-es5/loader.js +1 -1
  530. package/dist/esm-es5/magma-components.js +1 -1
  531. package/dist/esm-es5/mds-accordion-item.entry.js +1 -1
  532. package/dist/esm-es5/mds-accordion-timer-item.entry.js +1 -1
  533. package/dist/esm-es5/mds-accordion-timer.entry.js +1 -1
  534. package/dist/esm-es5/mds-accordion.entry.js +1 -1
  535. package/dist/esm-es5/mds-author.entry.js +1 -1
  536. package/dist/esm-es5/mds-avatar-stack-item.entry.js +1 -1
  537. package/dist/esm-es5/mds-avatar-stack.entry.js +1 -1
  538. package/dist/esm-es5/mds-avatar.entry.js +1 -1
  539. package/dist/esm-es5/mds-badge.entry.js +1 -1
  540. package/dist/esm-es5/mds-banner_3.entry.js +1 -1
  541. package/dist/esm-es5/mds-benchmark-bar.entry.js +1 -1
  542. package/dist/esm-es5/mds-bibliography.entry.js +1 -1
  543. package/dist/esm-es5/mds-breadcrumb-item.entry.js +1 -1
  544. package/dist/esm-es5/mds-breadcrumb.entry.js +1 -1
  545. package/dist/esm-es5/mds-button-dropdown.entry.js +1 -1
  546. package/dist/esm-es5/mds-button-group.entry.js +1 -1
  547. package/dist/esm-es5/mds-button_3.entry.js +1 -1
  548. package/dist/esm-es5/mds-calendar_2.entry.js +1 -1
  549. package/dist/esm-es5/mds-card-content.entry.js +1 -1
  550. package/dist/esm-es5/mds-card-footer.entry.js +1 -1
  551. package/dist/esm-es5/mds-card-header.entry.js +1 -1
  552. package/dist/esm-es5/mds-card-media.entry.js +1 -1
  553. package/dist/esm-es5/mds-card.entry.js +1 -1
  554. package/dist/esm-es5/mds-details.entry.js +1 -1
  555. package/dist/esm-es5/mds-dropdown.entry.js +1 -1
  556. package/dist/esm-es5/mds-emoji.entry.js +1 -1
  557. package/dist/esm-es5/mds-entity.entry.js +1 -1
  558. package/dist/esm-es5/mds-file-preview.entry.js +2 -2
  559. package/dist/esm-es5/mds-file.entry.js +3 -3
  560. package/dist/esm-es5/mds-filter-item.entry.js +1 -1
  561. package/dist/esm-es5/mds-filter.entry.js +1 -1
  562. package/dist/esm-es5/mds-header-bar.entry.js +1 -1
  563. package/dist/esm-es5/mds-header.entry.js +1 -1
  564. package/dist/esm-es5/mds-horizontal-scroll.entry.js +1 -1
  565. package/dist/esm-es5/mds-hr.entry.js +1 -1
  566. package/dist/esm-es5/mds-img.entry.js +1 -1
  567. package/dist/esm-es5/mds-input-date-range-preselection.entry.js +1 -1
  568. package/dist/esm-es5/mds-input-date-range.entry.js +1 -1
  569. package/dist/esm-es5/mds-input-date.entry.js +1 -1
  570. package/dist/esm-es5/mds-input-field.entry.js +1 -1
  571. package/dist/esm-es5/mds-input-otp.entry.js +1 -1
  572. package/dist/esm-es5/mds-input-range.entry.js +1 -1
  573. package/dist/esm-es5/mds-input-select.entry.js +1 -1
  574. package/dist/esm-es5/mds-input-switch_2.entry.js +1 -1
  575. package/dist/esm-es5/mds-input-tip_2.entry.js +1 -1
  576. package/dist/esm-es5/mds-input-upload.entry.js +1 -1
  577. package/dist/esm-es5/mds-input.entry.js +1 -1
  578. package/dist/esm-es5/mds-keyboard-key.entry.js +1 -1
  579. package/dist/esm-es5/mds-keyboard.entry.js +1 -1
  580. package/dist/esm-es5/mds-kpi-item.entry.js +1 -1
  581. package/dist/esm-es5/mds-kpi.entry.js +1 -1
  582. package/dist/esm-es5/mds-label.entry.js +1 -1
  583. package/dist/esm-es5/mds-list-item.entry.js +1 -1
  584. package/dist/esm-es5/mds-list.entry.js +1 -1
  585. package/dist/esm-es5/mds-mention.entry.js +1 -1
  586. package/dist/esm-es5/mds-modal.entry.js +1 -1
  587. package/dist/esm-es5/mds-note.entry.js +1 -1
  588. package/dist/esm-es5/mds-notification.entry.js +1 -1
  589. package/dist/esm-es5/mds-paginator-item.entry.js +1 -1
  590. package/dist/esm-es5/mds-paginator.entry.js +1 -1
  591. package/dist/esm-es5/mds-policy-ai.entry.js +1 -1
  592. package/dist/esm-es5/mds-pref-animation.entry.js +1 -1
  593. package/dist/esm-es5/mds-pref-consumption.entry.js +1 -1
  594. package/dist/esm-es5/mds-pref-contrast.entry.js +1 -1
  595. package/dist/esm-es5/mds-pref-language-item.entry.js +1 -1
  596. package/dist/esm-es5/mds-pref-language.entry.js +1 -1
  597. package/dist/esm-es5/mds-pref-theme-variant-item.entry.js +1 -1
  598. package/dist/esm-es5/mds-pref-theme-variant.entry.js +1 -1
  599. package/dist/esm-es5/mds-pref-theme.entry.js +1 -1
  600. package/dist/esm-es5/mds-pref.entry.js +1 -1
  601. package/dist/esm-es5/mds-price-table-features-cell.entry.js +1 -1
  602. package/dist/esm-es5/mds-price-table-features-row.entry.js +1 -1
  603. package/dist/esm-es5/mds-price-table-features.entry.js +1 -1
  604. package/dist/esm-es5/mds-price-table-header.entry.js +1 -1
  605. package/dist/esm-es5/mds-price-table-list-item.entry.js +1 -1
  606. package/dist/esm-es5/mds-price-table-list.entry.js +1 -1
  607. package/dist/esm-es5/mds-price-table.entry.js +1 -1
  608. package/dist/esm-es5/mds-progress_2.entry.js +1 -1
  609. package/dist/esm-es5/mds-push-notification-item.entry.js +1 -1
  610. package/dist/esm-es5/mds-push-notification.entry.js +1 -1
  611. package/dist/esm-es5/mds-quote.entry.js +1 -1
  612. package/dist/esm-es5/mds-radial-menu-item.entry.js +1 -1
  613. package/dist/esm-es5/mds-radial-menu.entry.js +1 -1
  614. package/dist/esm-es5/mds-separator.entry.js +1 -1
  615. package/dist/esm-es5/mds-status-bar.entry.js +1 -1
  616. package/dist/esm-es5/mds-stepper-bar-item.entry.js +1 -1
  617. package/dist/esm-es5/mds-stepper-bar.entry.js +1 -1
  618. package/dist/esm-es5/mds-tab-bar-item.entry.js +1 -1
  619. package/dist/esm-es5/mds-tab-bar.entry.js +1 -1
  620. package/dist/esm-es5/mds-tab_2.entry.js +1 -1
  621. package/dist/esm-es5/mds-table-body.entry.js +1 -1
  622. package/dist/esm-es5/mds-table-footer.entry.js +1 -1
  623. package/dist/esm-es5/mds-table-header-cell.entry.js +1 -1
  624. package/dist/esm-es5/mds-table-header.entry.js +1 -1
  625. package/dist/esm-es5/mds-table-row.entry.js +1 -1
  626. package/dist/esm-es5/mds-table.entry.js +1 -1
  627. package/dist/esm-es5/mds-text.entry.js +1 -1
  628. package/dist/esm-es5/mds-toast.entry.js +1 -1
  629. package/dist/esm-es5/mds-tooltip.entry.js +1 -1
  630. package/dist/esm-es5/mds-tree-item.entry.js +1 -1
  631. package/dist/esm-es5/mds-tree.entry.js +1 -1
  632. package/dist/esm-es5/mds-url-view.entry.js +1 -1
  633. package/dist/esm-es5/mds-usage.entry.js +1 -1
  634. package/dist/esm-es5/mds-video-wall.entry.js +1 -1
  635. package/dist/esm-es5/mds-zero.entry.js +1 -1
  636. package/dist/esm-es5/preference-fMwnXhio.js +1 -0
  637. package/dist/hydrate/index.js +2084 -527
  638. package/dist/hydrate/index.mjs +2084 -527
  639. package/dist/magma-components/magma-components.esm.js +1 -1
  640. package/dist/magma-components/p-0105d7c7.entry.js +8 -0
  641. package/dist/magma-components/p-022defe8.entry.js +1 -0
  642. package/dist/magma-components/p-02d858d0.entry.js +1 -0
  643. package/dist/magma-components/p-0607a2b3.entry.js +1 -0
  644. package/dist/magma-components/{p-0b11f03b.entry.js → p-0af4d0ef.entry.js} +1 -1
  645. package/dist/magma-components/p-0b91aae4.entry.js +1 -0
  646. package/dist/magma-components/p-0bb29dbd.system.entry.js +1 -0
  647. package/dist/magma-components/p-0c1a5df0.entry.js +1 -0
  648. package/dist/magma-components/p-0e986d85.entry.js +18 -0
  649. package/dist/magma-components/p-0ea42813.entry.js +1 -0
  650. package/dist/magma-components/p-0fe5aeaf.system.entry.js +1 -0
  651. package/dist/magma-components/p-10ddec99.system.entry.js +1 -0
  652. package/dist/magma-components/p-11567740.entry.js +1 -0
  653. package/dist/magma-components/p-116238cf.system.entry.js +1 -0
  654. package/dist/magma-components/p-1239667c.system.entry.js +1 -0
  655. package/dist/magma-components/p-1518fda3.system.entry.js +1 -0
  656. package/dist/magma-components/p-16c94506.system.entry.js +1 -0
  657. package/dist/magma-components/p-18823bfc.system.entry.js +1 -0
  658. package/dist/magma-components/p-188e94ef.system.entry.js +1 -0
  659. package/dist/magma-components/p-19446c9e.entry.js +1 -0
  660. package/dist/magma-components/p-1a73c7b0.system.entry.js +1 -0
  661. package/dist/magma-components/p-1ad03ee9.entry.js +1 -0
  662. package/dist/magma-components/p-1c4038f7.system.entry.js +1 -0
  663. package/dist/magma-components/p-2035564c.system.entry.js +1 -0
  664. package/dist/magma-components/p-2128ce5a.system.entry.js +1 -0
  665. package/dist/magma-components/p-21ee64ec.entry.js +1 -0
  666. package/dist/magma-components/p-224d2f55.entry.js +1 -0
  667. package/dist/magma-components/p-23791e85.system.entry.js +1 -0
  668. package/dist/magma-components/p-248c1b2c.system.entry.js +1 -0
  669. package/dist/magma-components/p-249b80a5.entry.js +1 -0
  670. package/dist/magma-components/p-262daf4f.entry.js +1 -0
  671. package/dist/magma-components/p-288ce251.entry.js +1 -0
  672. package/dist/magma-components/p-2a804b82.entry.js +1 -0
  673. package/dist/magma-components/p-2aff9851.system.entry.js +1 -0
  674. package/dist/magma-components/p-2b0667f6.system.entry.js +1 -0
  675. package/dist/magma-components/p-2bd03b3d.system.entry.js +1 -0
  676. package/dist/magma-components/p-2bfa7ed9.system.entry.js +1 -0
  677. package/dist/magma-components/p-2c6c80e8.entry.js +1 -0
  678. package/dist/magma-components/p-2e88e014.system.entry.js +1 -0
  679. package/dist/magma-components/p-2f5cc981.system.entry.js +1 -0
  680. package/dist/magma-components/p-31403b12.entry.js +1 -0
  681. package/dist/magma-components/p-31616d0b.entry.js +1 -0
  682. package/dist/magma-components/p-33b03c17.system.entry.js +1 -0
  683. package/dist/magma-components/p-353f30cc.system.entry.js +1 -0
  684. package/dist/magma-components/p-35482f9d.system.entry.js +1 -0
  685. package/dist/magma-components/p-35b5889a.system.entry.js +1 -0
  686. package/dist/magma-components/p-36d9d329.system.entry.js +1 -0
  687. package/dist/magma-components/p-36fd1ed7.system.entry.js +1 -0
  688. package/dist/magma-components/p-377c94ee.system.entry.js +1 -0
  689. package/dist/magma-components/p-385f395d.system.entry.js +1 -0
  690. package/dist/magma-components/p-39c09a42.system.entry.js +1 -0
  691. package/dist/magma-components/p-3_AKUQtJ.system.js +1 -0
  692. package/dist/magma-components/p-3c306ed0.system.entry.js +1 -0
  693. package/dist/magma-components/p-3de6fa18.entry.js +1 -0
  694. package/dist/magma-components/p-41da539f.entry.js +1 -0
  695. package/dist/magma-components/p-422bb9e2.system.entry.js +1 -0
  696. package/dist/magma-components/p-447c2d1b.entry.js +1 -0
  697. package/dist/magma-components/p-44e2965d.entry.js +1 -0
  698. package/dist/magma-components/p-46266f27.entry.js +1 -0
  699. package/dist/magma-components/p-4630472f.entry.js +1 -0
  700. package/dist/magma-components/{p-8b3065b4.entry.js → p-4671336c.entry.js} +1 -1
  701. package/dist/magma-components/p-4803d24f.system.entry.js +1 -0
  702. package/dist/magma-components/p-4a929c1c.entry.js +1 -0
  703. package/dist/magma-components/p-4bc7756a.system.entry.js +1 -0
  704. package/dist/magma-components/p-4f8ae676.system.entry.js +1 -0
  705. package/dist/magma-components/p-50c922ad.system.entry.js +1 -0
  706. package/dist/magma-components/p-50cdb70c.system.entry.js +1 -0
  707. package/dist/magma-components/p-52c10dbf.system.entry.js +1 -0
  708. package/dist/magma-components/p-52e35c13.system.entry.js +1 -0
  709. package/dist/magma-components/p-56a8f1d0.system.entry.js +1 -0
  710. package/dist/magma-components/p-5724212b.entry.js +1 -0
  711. package/dist/magma-components/p-5be1c273.entry.js +1 -0
  712. package/dist/magma-components/p-5d05fa1a.entry.js +1 -0
  713. package/dist/magma-components/p-5de4bf4f.entry.js +1 -0
  714. package/dist/magma-components/p-5e626696.entry.js +1 -0
  715. package/dist/magma-components/p-5f1532c0.system.entry.js +1 -0
  716. package/dist/magma-components/{p-dd860de4.entry.js → p-5fe8c814.entry.js} +1 -1
  717. package/dist/magma-components/{p-7306b02e.system.entry.js → p-60e8812c.system.entry.js} +1 -1
  718. package/dist/magma-components/p-611fa0a4.entry.js +1 -0
  719. package/dist/magma-components/p-61fefe1b.system.entry.js +1 -0
  720. package/dist/magma-components/p-62c9216f.system.entry.js +1 -0
  721. package/dist/magma-components/p-652b4e43.entry.js +1 -0
  722. package/dist/magma-components/p-6a92f533.entry.js +1 -0
  723. package/dist/magma-components/p-6b3569a0.entry.js +1 -0
  724. package/dist/magma-components/p-6b9175f1.system.entry.js +1 -0
  725. package/dist/magma-components/p-6ecfec17.entry.js +1 -0
  726. package/dist/magma-components/p-6ed096d3.system.entry.js +1 -0
  727. package/dist/magma-components/p-6ee86191.entry.js +1 -0
  728. package/dist/magma-components/{p-94713401.entry.js → p-70719b58.entry.js} +1 -1
  729. package/dist/magma-components/p-70e1a436.entry.js +1 -0
  730. package/dist/magma-components/p-725d9e09.entry.js +1 -0
  731. package/dist/magma-components/p-726a76f0.entry.js +1 -0
  732. package/dist/magma-components/p-72d91c6f.system.entry.js +1 -0
  733. package/dist/magma-components/{p-68f57bb1.entry.js → p-73926a10.entry.js} +1 -1
  734. package/dist/magma-components/p-7499262d.system.entry.js +1 -0
  735. package/dist/magma-components/p-750214a3.entry.js +1 -0
  736. package/dist/magma-components/p-7590a160.entry.js +1 -0
  737. package/dist/magma-components/p-75fa7e6f.system.entry.js +1 -0
  738. package/dist/magma-components/p-765447d4.system.entry.js +1 -0
  739. package/dist/magma-components/p-76cb480d.entry.js +1 -0
  740. package/dist/magma-components/p-79e12ac8.entry.js +1 -0
  741. package/dist/magma-components/p-7b4b9b88.system.entry.js +1 -0
  742. package/dist/magma-components/p-7c464f28.entry.js +1 -0
  743. package/dist/magma-components/p-7d338f59.system.entry.js +1 -0
  744. package/dist/magma-components/p-81e16f90.system.entry.js +1 -0
  745. package/dist/magma-components/p-82c6cdb9.system.entry.js +1 -0
  746. package/dist/magma-components/p-83b01f8e.system.entry.js +1 -0
  747. package/dist/magma-components/p-8546f46f.system.entry.js +1 -0
  748. package/dist/magma-components/p-85a2d99d.entry.js +1 -0
  749. package/dist/magma-components/p-8620f425.entry.js +1 -0
  750. package/dist/magma-components/p-89581b08.system.entry.js +1 -0
  751. package/dist/magma-components/p-8964a9fe.entry.js +1 -0
  752. package/dist/magma-components/p-899cd759.entry.js +1 -0
  753. package/dist/magma-components/p-8b2408b2.entry.js +1 -0
  754. package/dist/magma-components/p-8b9f6896.entry.js +1 -0
  755. package/dist/magma-components/p-8bde0c42.entry.js +1 -0
  756. package/dist/magma-components/p-8d5955ca.system.entry.js +1 -0
  757. package/dist/magma-components/p-91a1d3d5.entry.js +1 -0
  758. package/dist/magma-components/p-93538408.system.entry.js +1 -0
  759. package/dist/magma-components/p-94ff105b.system.entry.js +1 -0
  760. package/dist/magma-components/p-96f7ec63.entry.js +1 -0
  761. package/dist/magma-components/p-97144490.entry.js +1 -0
  762. package/dist/magma-components/p-999b0698.system.entry.js +1 -0
  763. package/dist/magma-components/p-9e533765.system.entry.js +18 -0
  764. package/dist/magma-components/p-DTZViJWJ.system.js +1 -1
  765. package/dist/magma-components/p-DssKRrAV.system.js +1 -0
  766. package/dist/magma-components/p-MSUJeuJp.js +1 -0
  767. package/dist/magma-components/p-a24d6d4a.system.entry.js +1 -0
  768. package/dist/magma-components/p-a24dadaa.system.entry.js +1 -0
  769. package/dist/magma-components/p-a2b84011.system.entry.js +1 -0
  770. package/dist/magma-components/p-a2d761d6.entry.js +1 -0
  771. package/dist/magma-components/p-a379adca.entry.js +1 -0
  772. package/dist/magma-components/p-a46f7424.system.entry.js +1 -0
  773. package/dist/magma-components/p-a47708f1.system.entry.js +1 -0
  774. package/dist/magma-components/p-a4d11055.system.entry.js +1 -0
  775. package/dist/magma-components/{p-7595afcf.entry.js → p-a5ef9d32.entry.js} +1 -1
  776. package/dist/magma-components/p-a6103622.entry.js +1 -0
  777. package/dist/magma-components/p-a6b8b861.entry.js +1 -0
  778. package/dist/magma-components/p-a6bdaa85.entry.js +1 -0
  779. package/dist/magma-components/p-a716833c.system.entry.js +1 -0
  780. package/dist/magma-components/p-a877906d.system.entry.js +1 -0
  781. package/dist/magma-components/p-a8a2d90e.system.entry.js +1 -0
  782. package/dist/magma-components/p-a92edada.entry.js +1 -0
  783. package/dist/magma-components/p-aafec5fe.entry.js +1 -0
  784. package/dist/magma-components/p-abce0c57.system.entry.js +1 -0
  785. package/dist/magma-components/p-ac2ee475.entry.js +1 -0
  786. package/dist/magma-components/p-ac5baffa.system.entry.js +1 -0
  787. package/dist/magma-components/p-ad1ad433.system.entry.js +1 -0
  788. package/dist/magma-components/p-ae433eb9.entry.js +1 -0
  789. package/dist/magma-components/p-afaef9a1.entry.js +1 -0
  790. package/dist/magma-components/p-b257222c.system.entry.js +1 -0
  791. package/dist/magma-components/p-b472ed3c.entry.js +1 -0
  792. package/dist/magma-components/p-b4fc19e9.entry.js +1 -0
  793. package/dist/magma-components/p-b53ef2c1.entry.js +1 -0
  794. package/dist/magma-components/p-b7dedc9f.entry.js +1 -0
  795. package/dist/magma-components/p-b97edfb5.entry.js +1 -0
  796. package/dist/magma-components/p-bc851caf.entry.js +1 -0
  797. package/dist/magma-components/p-bc8ef479.system.entry.js +9 -0
  798. package/dist/magma-components/p-bdc54840.system.entry.js +1 -0
  799. package/dist/magma-components/p-bf29ca5a.entry.js +1 -0
  800. package/dist/magma-components/p-bfc29d3b.system.entry.js +1 -0
  801. package/dist/magma-components/p-bff1e84c.system.entry.js +1 -0
  802. package/dist/magma-components/p-c01c49b6.entry.js +1 -0
  803. package/dist/magma-components/p-c0296d86.system.entry.js +1 -0
  804. package/dist/magma-components/p-c036f516.entry.js +1 -0
  805. package/dist/magma-components/p-c3d8aa52.entry.js +1 -0
  806. package/dist/magma-components/{p-d1eea8ca.system.entry.js → p-c4e7b103.system.entry.js} +1 -1
  807. package/dist/magma-components/p-c7a0a746.system.entry.js +1 -0
  808. package/dist/magma-components/p-c92a772e.entry.js +1 -0
  809. package/dist/magma-components/p-ca09ab1d.system.entry.js +1 -0
  810. package/dist/magma-components/p-cc9212ce.system.entry.js +1 -0
  811. package/dist/magma-components/p-cc95225c.system.entry.js +1 -0
  812. package/dist/magma-components/p-cd49c455.entry.js +1 -0
  813. package/dist/magma-components/p-d0542487.entry.js +1 -0
  814. package/dist/magma-components/p-d0dfe659.entry.js +1 -0
  815. package/dist/magma-components/p-d0eb94ea.system.entry.js +1 -0
  816. package/dist/magma-components/p-d3e5c4eb.system.entry.js +1 -0
  817. package/dist/magma-components/p-d4295773.entry.js +1 -0
  818. package/dist/magma-components/p-d5700423.system.entry.js +1 -0
  819. package/dist/magma-components/{p-292f4566.system.entry.js → p-d838cb1c.system.entry.js} +1 -1
  820. package/dist/magma-components/p-d9605a5d.system.entry.js +1 -0
  821. package/dist/magma-components/p-daa8f835.entry.js +1 -0
  822. package/dist/magma-components/p-db4e2a0b.system.entry.js +1 -0
  823. package/dist/magma-components/p-de0dac8f.entry.js +1 -0
  824. package/dist/magma-components/p-de8204f9.entry.js +1 -0
  825. package/dist/magma-components/p-e0b841e3.entry.js +1 -0
  826. package/dist/magma-components/p-e35ab355.entry.js +1 -0
  827. package/dist/magma-components/p-e44e2652.system.entry.js +1 -0
  828. package/dist/magma-components/p-e48d23f4.system.entry.js +1 -0
  829. package/dist/magma-components/p-e570aec5.system.entry.js +1 -0
  830. package/dist/magma-components/p-e57698df.system.entry.js +1 -0
  831. package/dist/magma-components/p-e669739e.entry.js +1 -0
  832. package/dist/magma-components/p-e8fa7a07.entry.js +1 -0
  833. package/dist/magma-components/{p-19f99447.entry.js → p-ea2c8dd1.entry.js} +1 -1
  834. package/dist/magma-components/p-ea881c45.system.entry.js +1 -0
  835. package/dist/magma-components/p-ebfb6963.system.entry.js +1 -0
  836. package/dist/magma-components/p-eca8523b.system.entry.js +1 -0
  837. package/dist/magma-components/p-ef142420.system.entry.js +1 -0
  838. package/dist/magma-components/p-ef56af85.system.entry.js +1 -0
  839. package/dist/magma-components/p-f0762290.entry.js +1 -0
  840. package/dist/magma-components/p-f1832c1e.system.entry.js +1 -0
  841. package/dist/magma-components/p-f4b1974a.entry.js +1 -0
  842. package/dist/magma-components/p-f7cfc9a7.system.entry.js +1 -0
  843. package/dist/magma-components/p-f83a9e08.entry.js +1 -0
  844. package/dist/magma-components/p-f8ee5fec.system.entry.js +1 -0
  845. package/dist/magma-components/p-f91dab2b.entry.js +1 -0
  846. package/dist/magma-components/p-fMwnXhio.js +1 -0
  847. package/dist/magma-components/p-fa61d03c.entry.js +1 -0
  848. package/dist/magma-components/p-fbf423a7.system.entry.js +1 -0
  849. package/dist/magma-components/p-fbfb589c.entry.js +1 -0
  850. package/dist/magma-components/p-fc56d9ae.entry.js +1 -0
  851. package/dist/magma-components/p-fc862fe2.system.entry.js +1 -0
  852. package/dist/magma-components/{p-59d65cff.entry.js → p-fd574e21.entry.js} +1 -1
  853. package/dist/magma-components/p-fd649ac2.entry.js +1 -0
  854. package/dist/magma-components/p-fed36619.entry.js +1 -0
  855. package/dist/stats.json +4297 -2219
  856. package/dist/types/common/floating-controller.d.ts +3 -3
  857. package/dist/types/common/preference.d.ts +22 -0
  858. package/dist/types/components/mds-accordion/mds-accordion.d.ts +10 -2
  859. package/dist/types/components/mds-accordion/test/mds-accordion.stories.d.ts +3 -2
  860. package/dist/types/components/mds-accordion-item/mds-accordion-item.d.ts +10 -0
  861. package/dist/types/components/mds-accordion-timer-item/mds-accordion-timer-item.d.ts +4 -0
  862. package/dist/types/components/mds-avatar/mds-avatar.d.ts +8 -0
  863. package/dist/types/components/mds-badge/mds-badge.d.ts +10 -0
  864. package/dist/types/components/mds-banner/mds-banner.d.ts +11 -2
  865. package/dist/types/components/mds-banner/test/mds-banner.stories.d.ts +2 -2
  866. package/dist/types/components/mds-breadcrumb/mds-breadcrumb.d.ts +2 -2
  867. package/dist/types/components/mds-breadcrumb/test/mds-breadcrumb.stories.d.ts +1 -1
  868. package/dist/types/components/mds-button/mds-button.d.ts +6 -0
  869. package/dist/types/components/mds-calendar/mds-calendar.d.ts +6 -0
  870. package/dist/types/components/mds-card/mds-card.d.ts +10 -2
  871. package/dist/types/components/mds-card/test/mds-card.stories.d.ts +2 -2
  872. package/dist/types/components/mds-chip/mds-chip.d.ts +9 -0
  873. package/dist/types/components/mds-details/mds-details.d.ts +5 -0
  874. package/dist/types/components/mds-dropdown/mds-dropdown.d.ts +20 -11
  875. package/dist/types/components/mds-dropdown/test/mds-dropdown.stories.d.ts +10 -10
  876. package/dist/types/components/mds-entity/mds-entity.d.ts +8 -0
  877. package/dist/types/components/mds-file/mds-file.d.ts +12 -2
  878. package/dist/types/components/mds-file/test/mds-file.stories.d.ts +1 -1
  879. package/dist/types/components/mds-file-preview/mds-file-preview.d.ts +10 -0
  880. package/dist/types/components/mds-filter/mds-filter.d.ts +10 -0
  881. package/dist/types/components/mds-filter-item/mds-filter-item.d.ts +9 -0
  882. package/dist/types/components/mds-header/mds-header.d.ts +9 -2
  883. package/dist/types/components/mds-header/test/mds-header.stories.d.ts +1 -1
  884. package/dist/types/components/mds-header-bar/mds-header-bar.d.ts +10 -0
  885. package/dist/types/components/mds-help/mds-help.d.ts +2 -2
  886. package/dist/types/components/mds-hr/mds-hr.d.ts +6 -0
  887. package/dist/types/components/mds-icon/mds-icon.d.ts +0 -1
  888. package/dist/types/components/mds-img/mds-img.d.ts +1 -0
  889. package/dist/types/components/mds-input/mds-input.d.ts +10 -0
  890. package/dist/types/components/mds-input-date/mds-input-date.d.ts +12 -0
  891. package/dist/types/components/mds-input-date-range/mds-input-date-range.d.ts +11 -0
  892. package/dist/types/components/mds-input-range/mds-input-range.d.ts +10 -0
  893. package/dist/types/components/mds-input-select/mds-input-select.d.ts +10 -0
  894. package/dist/types/components/mds-input-switch/mds-input-switch.d.ts +6 -0
  895. package/dist/types/components/mds-input-tip/mds-input-tip.d.ts +4 -0
  896. package/dist/types/components/mds-input-tip-item/mds-input-tip-item.d.ts +6 -0
  897. package/dist/types/components/mds-input-upload/mds-input-upload.d.ts +3 -0
  898. package/dist/types/components/mds-keyboard/mds-keyboard.d.ts +6 -1
  899. package/dist/types/components/mds-kpi-item/mds-kpi-item.d.ts +10 -0
  900. package/dist/types/components/mds-label/mds-label.d.ts +7 -0
  901. package/dist/types/components/mds-list-item/mds-list-item.d.ts +4 -0
  902. package/dist/types/components/mds-modal/mds-modal.d.ts +23 -12
  903. package/dist/types/components/mds-modal/meta/types.d.ts +0 -1
  904. package/dist/types/components/mds-modal/test/mds-modal.stories.d.ts +16 -2
  905. package/dist/types/components/mds-note/mds-note.d.ts +9 -0
  906. package/dist/types/components/mds-notification/mds-notification.d.ts +5 -2
  907. package/dist/types/components/mds-notification/test/mds-notification.stories.d.ts +6 -6
  908. package/dist/types/components/mds-paginator/mds-paginator.d.ts +15 -0
  909. package/dist/types/components/mds-paginator-item/mds-paginator-item.d.ts +7 -0
  910. package/dist/types/components/mds-policy-ai/mds-policy-ai.d.ts +1 -0
  911. package/dist/types/components/mds-pref-animation/mds-pref-animation.d.ts +5 -0
  912. package/dist/types/components/mds-pref-consumption/mds-pref-consumption.d.ts +5 -0
  913. package/dist/types/components/mds-pref-contrast/mds-pref-contrast.d.ts +5 -0
  914. package/dist/types/components/mds-pref-theme/mds-pref-theme.d.ts +9 -0
  915. package/dist/types/components/mds-price-table-features/mds-price-table-features.d.ts +10 -0
  916. package/dist/types/components/mds-price-table-features-cell/mds-price-table-features-cell.d.ts +10 -0
  917. package/dist/types/components/mds-price-table-features-row/mds-price-table-features-row.d.ts +10 -0
  918. package/dist/types/components/mds-price-table-list/mds-price-table-list.d.ts +10 -0
  919. package/dist/types/components/mds-progress/mds-progress.d.ts +10 -0
  920. package/dist/types/components/mds-push-notification/mds-push-notification.d.ts +6 -0
  921. package/dist/types/components/mds-push-notification-item/mds-push-notification-item.d.ts +11 -1
  922. package/dist/types/components/mds-quote/mds-quote.d.ts +4 -0
  923. package/dist/types/components/mds-separator/mds-separator.d.ts +8 -0
  924. package/dist/types/components/mds-spinner/mds-spinner.d.ts +4 -0
  925. package/dist/types/components/mds-status-bar/mds-status-bar.d.ts +10 -0
  926. package/dist/types/components/mds-stepper-bar-item/mds-stepper-bar-item.d.ts +3 -0
  927. package/dist/types/components/mds-tab/mds-tab.d.ts +11 -1
  928. package/dist/types/components/mds-tab-bar/mds-tab-bar.d.ts +10 -0
  929. package/dist/types/components/mds-tab-bar-item/mds-tab-bar-item.d.ts +10 -0
  930. package/dist/types/components/mds-tab-item/mds-tab-item.d.ts +20 -0
  931. package/dist/types/components/mds-table/mds-table.d.ts +9 -0
  932. package/dist/types/components/mds-table-body/mds-table-body.d.ts +4 -0
  933. package/dist/types/components/mds-table-cell/mds-table-cell.d.ts +4 -0
  934. package/dist/types/components/mds-table-footer/mds-table-footer.d.ts +4 -0
  935. package/dist/types/components/mds-table-header/mds-table-header.d.ts +4 -0
  936. package/dist/types/components/mds-table-header-cell/mds-table-header-cell.d.ts +4 -0
  937. package/dist/types/components/mds-table-row/mds-table-row.d.ts +8 -0
  938. package/dist/types/components/mds-text/mds-text.d.ts +4 -0
  939. package/dist/types/components/mds-toast/mds-toast.d.ts +10 -0
  940. package/dist/types/components/mds-tooltip/mds-tooltip.d.ts +17 -8
  941. package/dist/types/components/mds-tooltip/test/mds-tooltip.stories.d.ts +8 -8
  942. package/dist/types/components/mds-tree/mds-tree.d.ts +5 -0
  943. package/dist/types/components/mds-tree-item/mds-tree-item.d.ts +25 -1
  944. package/dist/types/components/mds-url-view/mds-url-view.d.ts +9 -0
  945. package/dist/types/components/mds-usage/mds-usage.d.ts +10 -0
  946. package/dist/types/components/mds-zero/mds-zero.d.ts +10 -0
  947. package/dist/types/components.d.ts +200 -160
  948. package/package.json +6 -3
  949. package/dist/esm-es5/floating-controller-CP3-OFb9.js +0 -1
  950. package/dist/magma-components/p-00313884.entry.js +0 -1
  951. package/dist/magma-components/p-01dc43dd.entry.js +0 -1
  952. package/dist/magma-components/p-01dca5e8.entry.js +0 -1
  953. package/dist/magma-components/p-030d45e3.entry.js +0 -1
  954. package/dist/magma-components/p-0328a23e.system.entry.js +0 -1
  955. package/dist/magma-components/p-08c6869a.entry.js +0 -1
  956. package/dist/magma-components/p-09de9fc5.system.entry.js +0 -1
  957. package/dist/magma-components/p-0acb46c8.entry.js +0 -1
  958. package/dist/magma-components/p-0b10ef9f.system.entry.js +0 -1
  959. package/dist/magma-components/p-0be56202.system.entry.js +0 -1
  960. package/dist/magma-components/p-0de58147.entry.js +0 -1
  961. package/dist/magma-components/p-0e481e5c.system.entry.js +0 -1
  962. package/dist/magma-components/p-0f104850.system.entry.js +0 -1
  963. package/dist/magma-components/p-1073bf63.entry.js +0 -1
  964. package/dist/magma-components/p-11490a89.entry.js +0 -1
  965. package/dist/magma-components/p-137b0bbe.system.entry.js +0 -1
  966. package/dist/magma-components/p-14a98729.entry.js +0 -1
  967. package/dist/magma-components/p-14d858f8.system.entry.js +0 -1
  968. package/dist/magma-components/p-14e918de.system.entry.js +0 -1
  969. package/dist/magma-components/p-154ef5b9.entry.js +0 -1
  970. package/dist/magma-components/p-158af6e3.entry.js +0 -1
  971. package/dist/magma-components/p-17427d8a.system.entry.js +0 -1
  972. package/dist/magma-components/p-1805592d.entry.js +0 -1
  973. package/dist/magma-components/p-18563022.entry.js +0 -1
  974. package/dist/magma-components/p-1a56d383.system.entry.js +0 -1
  975. package/dist/magma-components/p-1bb7895a.system.entry.js +0 -1
  976. package/dist/magma-components/p-1ce791c1.system.entry.js +0 -1
  977. package/dist/magma-components/p-1da904c3.system.entry.js +0 -1
  978. package/dist/magma-components/p-20961bf1.entry.js +0 -1
  979. package/dist/magma-components/p-24a9ed63.system.entry.js +0 -1
  980. package/dist/magma-components/p-26b131cf.entry.js +0 -1
  981. package/dist/magma-components/p-28ebb626.entry.js +0 -1
  982. package/dist/magma-components/p-2a1d3680.system.entry.js +0 -1
  983. package/dist/magma-components/p-2ab75334.system.entry.js +0 -1
  984. package/dist/magma-components/p-2ccc796b.system.entry.js +0 -1
  985. package/dist/magma-components/p-2d9d0887.system.entry.js +0 -1
  986. package/dist/magma-components/p-2df01d02.system.entry.js +0 -1
  987. package/dist/magma-components/p-3145c7eb.entry.js +0 -1
  988. package/dist/magma-components/p-34018dfe.entry.js +0 -1
  989. package/dist/magma-components/p-35a9f1b4.system.entry.js +0 -18
  990. package/dist/magma-components/p-35ec8bbd.entry.js +0 -1
  991. package/dist/magma-components/p-370f9463.system.entry.js +0 -1
  992. package/dist/magma-components/p-387948c4.system.entry.js +0 -1
  993. package/dist/magma-components/p-3aeecbba.system.entry.js +0 -1
  994. package/dist/magma-components/p-3af9132f.system.entry.js +0 -1
  995. package/dist/magma-components/p-3bfd085f.system.entry.js +0 -1
  996. package/dist/magma-components/p-3c246a39.entry.js +0 -1
  997. package/dist/magma-components/p-3c2bf79b.entry.js +0 -1
  998. package/dist/magma-components/p-3ce52f3c.entry.js +0 -1
  999. package/dist/magma-components/p-3e5993b4.entry.js +0 -1
  1000. package/dist/magma-components/p-3ef80cd4.system.entry.js +0 -1
  1001. package/dist/magma-components/p-3fc3b8b4.entry.js +0 -1
  1002. package/dist/magma-components/p-423955d1.system.entry.js +0 -1
  1003. package/dist/magma-components/p-42f336df.system.entry.js +0 -1
  1004. package/dist/magma-components/p-45a85712.system.entry.js +0 -1
  1005. package/dist/magma-components/p-460cd731.system.entry.js +0 -1
  1006. package/dist/magma-components/p-473f6954.entry.js +0 -1
  1007. package/dist/magma-components/p-47fa0ecf.entry.js +0 -1
  1008. package/dist/magma-components/p-4b07fe37.entry.js +0 -1
  1009. package/dist/magma-components/p-4b884441.entry.js +0 -1
  1010. package/dist/magma-components/p-4ba583c9.entry.js +0 -1
  1011. package/dist/magma-components/p-4c08fe3e.entry.js +0 -1
  1012. package/dist/magma-components/p-4f490917.entry.js +0 -1
  1013. package/dist/magma-components/p-4f98fdba.system.entry.js +0 -1
  1014. package/dist/magma-components/p-50553954.system.entry.js +0 -1
  1015. package/dist/magma-components/p-523d4716.entry.js +0 -1
  1016. package/dist/magma-components/p-52ccfafc.system.entry.js +0 -1
  1017. package/dist/magma-components/p-52e2f903.entry.js +0 -1
  1018. package/dist/magma-components/p-53195d95.system.entry.js +0 -1
  1019. package/dist/magma-components/p-5488f51f.system.entry.js +0 -1
  1020. package/dist/magma-components/p-553927f9.system.entry.js +0 -1
  1021. package/dist/magma-components/p-55b4bbba.entry.js +0 -1
  1022. package/dist/magma-components/p-583f5ffa.entry.js +0 -1
  1023. package/dist/magma-components/p-59f53701.system.entry.js +0 -1
  1024. package/dist/magma-components/p-5b881091.entry.js +0 -1
  1025. package/dist/magma-components/p-5c44d208.entry.js +0 -1
  1026. package/dist/magma-components/p-5fdcd8e2.system.entry.js +0 -1
  1027. package/dist/magma-components/p-5fe7b875.system.entry.js +0 -1
  1028. package/dist/magma-components/p-614e7f83.system.entry.js +0 -1
  1029. package/dist/magma-components/p-62cf9003.system.entry.js +0 -1
  1030. package/dist/magma-components/p-63898681.entry.js +0 -1
  1031. package/dist/magma-components/p-663a510e.entry.js +0 -1
  1032. package/dist/magma-components/p-6ae4df92.system.entry.js +0 -1
  1033. package/dist/magma-components/p-6d268a59.entry.js +0 -1
  1034. package/dist/magma-components/p-75011fed.system.entry.js +0 -9
  1035. package/dist/magma-components/p-77e9bd68.entry.js +0 -1
  1036. package/dist/magma-components/p-7d836722.entry.js +0 -1
  1037. package/dist/magma-components/p-7e037cf3.entry.js +0 -8
  1038. package/dist/magma-components/p-8106dbfd.system.entry.js +0 -1
  1039. package/dist/magma-components/p-82deeaa0.system.entry.js +0 -1
  1040. package/dist/magma-components/p-83589b83.entry.js +0 -1
  1041. package/dist/magma-components/p-83721814.entry.js +0 -18
  1042. package/dist/magma-components/p-83de0e53.system.entry.js +0 -1
  1043. package/dist/magma-components/p-849760e7.system.entry.js +0 -1
  1044. package/dist/magma-components/p-85ac6e54.system.entry.js +0 -1
  1045. package/dist/magma-components/p-87f8a213.entry.js +0 -1
  1046. package/dist/magma-components/p-89bf698e.system.entry.js +0 -1
  1047. package/dist/magma-components/p-89f96753.system.entry.js +0 -1
  1048. package/dist/magma-components/p-8bec8ad6.system.entry.js +0 -1
  1049. package/dist/magma-components/p-8d76853c.system.entry.js +0 -1
  1050. package/dist/magma-components/p-8f1ce3f1.system.entry.js +0 -1
  1051. package/dist/magma-components/p-9021fa60.entry.js +0 -1
  1052. package/dist/magma-components/p-90b72c1c.system.entry.js +0 -1
  1053. package/dist/magma-components/p-90d5b6df.system.entry.js +0 -1
  1054. package/dist/magma-components/p-913372ff.entry.js +0 -1
  1055. package/dist/magma-components/p-94093140.system.entry.js +0 -1
  1056. package/dist/magma-components/p-944d9b27.system.entry.js +0 -1
  1057. package/dist/magma-components/p-956b5ae6.entry.js +0 -1
  1058. package/dist/magma-components/p-95eae04e.entry.js +0 -1
  1059. package/dist/magma-components/p-961a2531.entry.js +0 -1
  1060. package/dist/magma-components/p-9658cb0c.entry.js +0 -1
  1061. package/dist/magma-components/p-96d1a168.entry.js +0 -1
  1062. package/dist/magma-components/p-96f6a646.entry.js +0 -1
  1063. package/dist/magma-components/p-98435b90.system.entry.js +0 -1
  1064. package/dist/magma-components/p-988b0c7c.entry.js +0 -1
  1065. package/dist/magma-components/p-98a05642.system.entry.js +0 -1
  1066. package/dist/magma-components/p-99f7a1b6.system.entry.js +0 -1
  1067. package/dist/magma-components/p-9a1940c1.system.entry.js +0 -1
  1068. package/dist/magma-components/p-9a89bc78.system.entry.js +0 -1
  1069. package/dist/magma-components/p-9ad586a7.system.entry.js +0 -1
  1070. package/dist/magma-components/p-9b52918e.system.entry.js +0 -1
  1071. package/dist/magma-components/p-9yaIBCJC.system.js +0 -1
  1072. package/dist/magma-components/p-CxU_BeBE.js +0 -1
  1073. package/dist/magma-components/p-a1af65e8.entry.js +0 -1
  1074. package/dist/magma-components/p-a5473293.system.entry.js +0 -1
  1075. package/dist/magma-components/p-a6caafcb.system.entry.js +0 -1
  1076. package/dist/magma-components/p-a7bd4585.entry.js +0 -1
  1077. package/dist/magma-components/p-a88fba47.system.entry.js +0 -1
  1078. package/dist/magma-components/p-a959ade4.entry.js +0 -1
  1079. package/dist/magma-components/p-aa7d8972.entry.js +0 -1
  1080. package/dist/magma-components/p-aa98652f.entry.js +0 -1
  1081. package/dist/magma-components/p-aaeb0ee3.system.entry.js +0 -1
  1082. package/dist/magma-components/p-ab89bf5b.system.entry.js +0 -1
  1083. package/dist/magma-components/p-abc720e3.entry.js +0 -1
  1084. package/dist/magma-components/p-abe87810.entry.js +0 -1
  1085. package/dist/magma-components/p-ac80aca8.entry.js +0 -1
  1086. package/dist/magma-components/p-acb07134.system.entry.js +0 -1
  1087. package/dist/magma-components/p-acd4f96a.entry.js +0 -1
  1088. package/dist/magma-components/p-af49bca2.entry.js +0 -1
  1089. package/dist/magma-components/p-af670eaf.entry.js +0 -1
  1090. package/dist/magma-components/p-b14a94e0.system.entry.js +0 -1
  1091. package/dist/magma-components/p-b2bc194a.entry.js +0 -1
  1092. package/dist/magma-components/p-b2e76c18.system.entry.js +0 -1
  1093. package/dist/magma-components/p-b37dff80.system.entry.js +0 -1
  1094. package/dist/magma-components/p-b3e3226e.entry.js +0 -1
  1095. package/dist/magma-components/p-b40f1153.entry.js +0 -1
  1096. package/dist/magma-components/p-b4709a95.entry.js +0 -1
  1097. package/dist/magma-components/p-b5db6527.system.entry.js +0 -1
  1098. package/dist/magma-components/p-b764defa.entry.js +0 -1
  1099. package/dist/magma-components/p-b9b2501e.system.entry.js +0 -1
  1100. package/dist/magma-components/p-b9b5bcdd.system.entry.js +0 -1
  1101. package/dist/magma-components/p-ba2a0bc1.system.entry.js +0 -1
  1102. package/dist/magma-components/p-bb4380cd.entry.js +0 -1
  1103. package/dist/magma-components/p-bce3a8b0.system.entry.js +0 -1
  1104. package/dist/magma-components/p-bd2998e6.system.entry.js +0 -1
  1105. package/dist/magma-components/p-bd3dbc2d.entry.js +0 -1
  1106. package/dist/magma-components/p-bed57abb.entry.js +0 -1
  1107. package/dist/magma-components/p-bfed0b7a.entry.js +0 -1
  1108. package/dist/magma-components/p-c6177cb9.system.entry.js +0 -1
  1109. package/dist/magma-components/p-c638556c.entry.js +0 -1
  1110. package/dist/magma-components/p-c6fa4a21.entry.js +0 -1
  1111. package/dist/magma-components/p-c8e99385.system.entry.js +0 -1
  1112. package/dist/magma-components/p-c9231987.entry.js +0 -1
  1113. package/dist/magma-components/p-c9c51ba6.system.entry.js +0 -1
  1114. package/dist/magma-components/p-cc53b30c.entry.js +0 -1
  1115. package/dist/magma-components/p-ccc0521c.entry.js +0 -1
  1116. package/dist/magma-components/p-cd71630e.system.entry.js +0 -1
  1117. package/dist/magma-components/p-cd879243.system.entry.js +0 -1
  1118. package/dist/magma-components/p-ce064d47.entry.js +0 -1
  1119. package/dist/magma-components/p-d2537229.system.entry.js +0 -1
  1120. package/dist/magma-components/p-d2617a1a.entry.js +0 -1
  1121. package/dist/magma-components/p-d41c4637.system.entry.js +0 -1
  1122. package/dist/magma-components/p-d88f44aa.entry.js +0 -1
  1123. package/dist/magma-components/p-dae9ae8e.system.entry.js +0 -1
  1124. package/dist/magma-components/p-df87e2f5.system.entry.js +0 -1
  1125. package/dist/magma-components/p-dfe082be.system.entry.js +0 -1
  1126. package/dist/magma-components/p-e00ba5a0.entry.js +0 -1
  1127. package/dist/magma-components/p-e0d12fa2.system.entry.js +0 -1
  1128. package/dist/magma-components/p-e2cd11c3.entry.js +0 -1
  1129. package/dist/magma-components/p-e5fb3081.system.entry.js +0 -1
  1130. package/dist/magma-components/p-e67a6452.entry.js +0 -1
  1131. package/dist/magma-components/p-e6d8c9e3.system.entry.js +0 -1
  1132. package/dist/magma-components/p-e71aecc1.entry.js +0 -1
  1133. package/dist/magma-components/p-eac692ea.system.entry.js +0 -1
  1134. package/dist/magma-components/p-ecf2e98d.system.entry.js +0 -1
  1135. package/dist/magma-components/p-ed6d1453.system.entry.js +0 -1
  1136. package/dist/magma-components/p-f289eb5a.entry.js +0 -1
  1137. package/dist/magma-components/p-f3604c99.entry.js +0 -1
  1138. package/dist/magma-components/p-f3dbca34.entry.js +0 -1
  1139. package/dist/magma-components/p-f4b4bdf2.system.entry.js +0 -1
  1140. package/dist/magma-components/p-f56d16f7.entry.js +0 -1
  1141. package/dist/magma-components/p-f8014852.system.entry.js +0 -1
  1142. package/dist/magma-components/p-f851100d.entry.js +0 -1
  1143. package/dist/magma-components/p-f8d5adce.entry.js +0 -1
  1144. package/dist/magma-components/p-fa427f75.system.entry.js +0 -1
  1145. package/dist/magma-components/p-fa6a05b5.entry.js +0 -1
  1146. package/dist/magma-components/p-fb8b0104.entry.js +0 -1
  1147. package/dist/magma-components/p-fcf59139.system.entry.js +0 -1
  1148. package/dist/magma-components/p-fe3d5720.system.entry.js +0 -1
  1149. package/dist/magma-components/p-fe85ad8e.system.entry.js +0 -1
  1150. package/dist/magma-components/p-ffae137a.entry.js +0 -1
@@ -1,5 +1,5 @@
1
1
  {
2
- "timestamp": "2026-06-19T18:24:43",
2
+ "timestamp": "2026-07-03T14:20:50",
3
3
  "compiler": {
4
4
  "name": "@stencil/core",
5
5
  "version": "4.43.5",
@@ -19,13 +19,13 @@
19
19
  }
20
20
  ],
21
21
  "usage": {
22
- "1. Description": "The `<mds-accordion>` web component is the compound container of the Magma Design System that groups and orchestrates a set of collapsible `<mds-accordion-item>` panels. It acts as the coordination layer that decides which children are selected.\n\n#### Semantic Behavior\n\n- **Compound parent/child**: The default slot accepts only `<mds-accordion-item>` elements.\n- **Single vs. multiple selection**: By default opening one item collapses the others. With `multiple` set, any number of children may stay open at once and selection state is reported as a comma-separated list of indices.\n- **Mandatory selection**: When `closable` is `false`, the user cannot collapse the currently open item by clicking it again - one panel always remains open.\n- **Emitted event**: `mdsAccordionChange` whenever the selected child set changes, carrying the live `children` NodeList and the `selected` index/indices as a string.\n\n#### Properties & Visual Configurations\n\nThis component has no shared `variant` / `tone` / `size` props; its two booleans control selection semantics rather than appearance.\n\n#### Other behavioral props\n\n- **`multiple`** switches the group from accordion behavior (one panel at a time) to independent toggles, allowing several panels open simultaneously.\n- **`closable`** governs whether the active panel can be dismissed; set it to `false` to force at least one panel to stay expanded at all times.\n\nPer-panel presentation - the visible `label`, heading `typography`, and the slotted body content - is configured on each `<mds-accordion-item>` child, not on the accordion itself.\n",
23
- "2. Pattern": "Correct and idiomatic ways to use the `<mds-accordion>` component, ordered from most common to most specialized. Patterns assume a working knowledge of compound component rules documented in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md) and the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n\n#### Basic Accordion\n\nThe canonical form. Place one or more [`mds-accordion-item`](../../mds-accordion-item) elements as direct children. Each item requires a `label` for its always-visible header.\n\n```html\n<mds-accordion>\n <mds-accordion-item label=\"Informazioni generali\">\n <mds-text>Contenuto della prima sezione.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Requisiti tecnici\">\n <mds-text>Contenuto della seconda sezione.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Contatti\">\n <mds-text>Contenuto della terza sezione.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Pre-selected Item on Load\n\nSet the `selected` attribute on a child to have that panel start open. Only one item should be pre-selected in single-selection mode (the default).\n\n```html\n<mds-accordion>\n <mds-accordion-item label=\"Panoramica\" selected>\n <mds-text>Questa sezione e' aperta per impostazione predefinita.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Dettagli\">\n <mds-text>Questa sezione e' chiusa inizialmente.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Multiple Selection Mode\n\nSet `multiple` to allow any number of panels to be open at the same time. The `mdsAccordionChange` event then reports a comma-separated list of open indices.\n\n```html\n<mds-accordion multiple>\n <mds-accordion-item label=\"Documentazione\" selected>\n <mds-text>Scarica la guida utente in formato PDF.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Video tutorial\" selected>\n <mds-text>Guarda i video di formazione nel portale.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"FAQ\">\n <mds-text>Consulta le domande frequenti.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Mandatory Selection (Non-closable)\n\nSet `closable=\"false\"` to prevent the open panel from being collapsed. The currently expanded item stays open even when the user clicks its header again - exactly one panel is always visible.\n\n```html\n<mds-accordion closable=\"false\">\n <mds-accordion-item label=\"Passaggio 1 - Dati anagrafici\" selected>\n <mds-text>Inserisci nome, cognome e codice fiscale.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Passaggio 2 - Residenza\">\n <mds-text>Inserisci indirizzo e comune di residenza.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Passaggio 3 - Riepilogo\">\n <mds-text>Verifica i dati inseriti prima di inviare.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Heading Typography on Items\n\nSet `typography` on each `mds-accordion-item` to align the header level with the document outline. Defaults to `h5`; use a heavier heading for more prominent section headers.\n\n```html\n<mds-accordion>\n <mds-accordion-item label=\"Sezione principale\" typography=\"h3\">\n <mds-text>Contenuto della sezione principale.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Sottosezione\" typography=\"h4\">\n <mds-text>Contenuto della sottosezione.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Listening to the Change Event\n\nListen for `mdsAccordionChange` to react when the active panel changes. The event detail carries `children` (the full NodeList) and `selected` (a string index or comma-separated indices when `multiple` is set).\n\n```html\n<mds-accordion id=\"faq-accordion\">\n <mds-accordion-item label=\"Cos'e' Magma?\">\n <mds-text>Magma e' il design system di Maggioli.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Come si installa?\">\n <mds-text>Segui le istruzioni nel file README del pacchetto.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n\n<script>\n document.getElementById('faq-accordion').addEventListener('mdsAccordionChange', (event) => {\n console.log('Pannello aperto:', event.detail.selected);\n });\n</script>\n```\n\n#### Rich Slotted Content in Items\n\nThe default slot of each `mds-accordion-item` accepts text, HTML elements, and other Magma components - use this to build complex content panels.\n\n```html\n<mds-accordion>\n <mds-accordion-item label=\"Dettagli del documento\">\n <mds-text typography=\"label\">Nome file</mds-text>\n <mds-text>Relazione_annuale_2024.pdf</mds-text>\n <mds-hr></mds-hr>\n <mds-text typography=\"label\">Dimensione</mds-text>\n <mds-text>2,4 MB</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Azioni disponibili\">\n <mds-button label=\"Scarica\" icon=\"mi/baseline/download\" variant=\"primary\"></mds-button>\n <mds-button label=\"Condividi\" icon=\"mi/baseline/share\" variant=\"secondary\" tone=\"outline\"></mds-button>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Styling Customization\n\nStyle the accordion only through its documented `--mds-accordion-*` CSS custom properties. The properties cascade into all child `mds-accordion-item` elements from the host.\n\n```css\n.custom-faq mds-accordion {\n --mds-accordion-border-color: rgb(var(--variant-primary-05));\n --mds-accordion-border-width: 1px;\n --mds-accordion-color: rgb(var(--tone-neutral-02));\n --mds-accordion-description-color: rgb(var(--tone-neutral-04));\n --mds-accordion-duration: 200ms;\n --mds-accordion-padding-selected: var(--spacing-600) 0 var(--spacing-800) 0;\n --mds-accordion-padding-unselected: var(--spacing-400) 0;\n}\n```\n",
24
- "3. Antipattern": "Common incorrect uses of `<mds-accordion>`. Each entry pairs the wrong form with the right one and a one-line reason. System-wide rules (boolean-as-string, shadow piercing, Tailwind color utilities, raw native event listening) live in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md#system-level-anti-patterns) - they apply here too but are not repeated.\n\n#### Do Not Place Non-Item Children Directly in the Accordion Slot\n\nThe default slot of `<mds-accordion>` is designed exclusively for `<mds-accordion-item>` elements. Placing raw HTML or other components there bypasses the parent's selection coordination and breaks the compound component communication.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-accordion>\n <div>\n <h3>Sezione uno</h3>\n <p>Contenuto della sezione.</p>\n </div>\n</mds-accordion>\n\n<!-- ✅ CORRECT -->\n<mds-accordion>\n <mds-accordion-item label=\"Sezione uno\">\n <mds-text>Contenuto della sezione.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Do Not Use `mds-accordion-item` Outside `mds-accordion`\n\n`<mds-accordion-item>` is a compound child and relies on the parent to assign its `id` and manage selection state. Used standalone it has no coordinator and its `mdsAccordionItemSelect` / `mdsAccordionItemUnselect` events go unanswered.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-accordion-item label=\"Domanda frequente\">\n <mds-text>Risposta alla domanda.</mds-text>\n</mds-accordion-item>\n\n<!-- ✅ CORRECT -->\n<mds-accordion>\n <mds-accordion-item label=\"Domanda frequente\">\n <mds-text>Risposta alla domanda.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Do Not Set `closable` to the String `\"false\"`\n\n`closable` is a boolean prop. In HTML, any non-empty attribute value - including the string `\"false\"` - is truthy, so `closable=\"false\"` does NOT disable the closable behavior; it is identical to `closable=\"true\"`. Remove the attribute entirely to let the default (`true`) apply, or omit it on purpose when you want `closable` enforced.\n\n```html\n<!-- 🚫 INCORRECT - still closable, this is a no-op -->\n<mds-accordion closable=\"false\">\n <mds-accordion-item label=\"Passaggio obbligatorio\" selected>\n <mds-text>Questo pannello dovrebbe restare sempre aperto.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n\n<!-- ✅ CORRECT - use the attribute without a value (boolean form) -->\n<!-- Note: to DISABLE closable, set the prop to false in JS, or use a framework binding -->\n<!-- In plain HTML there is no boolean \"false\" form; control it via JS: -->\n<mds-accordion id=\"mandatory-accordion\">\n <mds-accordion-item label=\"Passaggio obbligatorio\" selected>\n <mds-text>Questo pannello resta sempre aperto.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n<script>\n document.getElementById('mandatory-accordion').closable = false;\n</script>\n```\n\n#### Do Not Listen to Native `click` or `toggle` Instead of `mdsAccordionChange`\n\nThe selection logic lives inside shadow DOM. Native `click` events from inside the shadow root may not propagate as expected, and there is no native `toggle` event on this component. Always listen for `mdsAccordionChange` to react to open/close changes.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-accordion id=\"my-accordion\">\n <mds-accordion-item label=\"Sezione A\">\n <mds-text>Contenuto A.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n<script>\n document.getElementById('my-accordion').addEventListener('click', (e) => {\n // unreliable - shadow DOM events may not surface correctly\n console.log('clicked');\n });\n</script>\n\n<!-- ✅ CORRECT -->\n<mds-accordion id=\"my-accordion\">\n <mds-accordion-item label=\"Sezione A\">\n <mds-text>Contenuto A.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n<script>\n document.getElementById('my-accordion').addEventListener('mdsAccordionChange', (e) => {\n console.log('Selezione corrente:', e.detail.selected);\n });\n</script>\n```\n\n#### Do Not Mix `mds-accordion-item` and `mds-accordion-timer-item`\n\n[`mds-accordion-timer`](../../mds-accordion-timer) and its child [`mds-accordion-timer-item`](../../mds-accordion-timer-item) are a separate compound pair. Slotting timer items into a plain accordion (or vice versa) breaks internal event wiring because each parent only listens for its own child's events.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-accordion>\n <mds-accordion-timer-item label=\"Avanzamento automatico\">\n <mds-text>Contenuto con timer.</mds-text>\n </mds-accordion-timer-item>\n</mds-accordion>\n\n<!-- ✅ CORRECT - use mds-accordion-timer with mds-accordion-timer-item -->\n<mds-accordion-timer>\n <mds-accordion-timer-item label=\"Avanzamento automatico\">\n <mds-text>Contenuto con timer.</mds-text>\n </mds-accordion-timer-item>\n</mds-accordion-timer>\n```\n\n#### Do Not Pierce Shadow DOM to Style Internals\n\nThe only supported customization surface is the `--mds-accordion-*` CSS custom properties and the documented `::part()` names on `mds-accordion-item` (`content`, `icon`, `label`). Targeting undocumented internals via `>>>` or deep class selectors couples code to the Shadow DOM implementation and breaks on minor releases.\n\n```css\n/* 🚫 INCORRECT */\nmds-accordion >>> .action {\n font-weight: bold;\n}\nmds-accordion-item::part(spinner) {\n display: none;\n}\n\n/* ✅ CORRECT */\nmds-accordion {\n --mds-accordion-color: rgb(var(--tone-neutral-02));\n --mds-accordion-border-color: rgb(var(--variant-primary-05));\n}\nmds-accordion-item::part(label) {\n font-style: italic;\n}\n```\n"
22
+ "1. Description": "The `<mds-accordion>` web component is the compound container of the Magma Design System that groups and orchestrates a set of collapsible `<mds-accordion-item>` panels. It acts as the coordination layer that decides which children are selected.\n\n#### Semantic Behavior\n\n- **Compound parent/child**: The default slot accepts only `<mds-accordion-item>` elements.\n- **Single vs. multiple selection**: By default opening one item collapses the others. With `multiple` set, any number of children may stay open at once and selection state is reported as a comma-separated list of indices.\n- **Mandatory selection**: When `disable-close` is set, the user cannot collapse the currently open item by clicking it again - one panel always remains open.\n- **Emitted event**: `mdsAccordionChange` whenever the selected child set changes, carrying the live `children` NodeList and the `selected` index/indices as a string.\n\n#### Properties & Visual Configurations\n\nThis component has no shared `variant` / `tone` / `size` props; its two booleans control selection semantics rather than appearance.\n\n#### Other behavioral props\n\n- **`multiple`** switches the group from accordion behavior (one panel at a time) to independent toggles, allowing several panels open simultaneously.\n- **`disableClose`** prevents the active panel from being dismissed; set it to force at least one panel to stay expanded at all times.\n\nPer-panel presentation - the visible `label`, heading `typography`, and the slotted body content - is configured on each `<mds-accordion-item>` child, not on the accordion itself.\n",
23
+ "2. Pattern": "Correct and idiomatic ways to use the `<mds-accordion>` component, ordered from most common to most specialized. Patterns assume a working knowledge of compound component rules documented in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md) and the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n\n#### Basic Accordion\n\nThe canonical form. Place one or more [`mds-accordion-item`](../../mds-accordion-item) elements as direct children. Each item requires a `label` for its always-visible header.\n\n```html\n<mds-accordion>\n <mds-accordion-item label=\"Informazioni generali\">\n <mds-text>Contenuto della prima sezione.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Requisiti tecnici\">\n <mds-text>Contenuto della seconda sezione.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Contatti\">\n <mds-text>Contenuto della terza sezione.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Pre-selected Item on Load\n\nSet the `selected` attribute on a child to have that panel start open. Only one item should be pre-selected in single-selection mode (the default).\n\n```html\n<mds-accordion>\n <mds-accordion-item label=\"Panoramica\" selected>\n <mds-text>Questa sezione e' aperta per impostazione predefinita.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Dettagli\">\n <mds-text>Questa sezione e' chiusa inizialmente.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Multiple Selection Mode\n\nSet `multiple` to allow any number of panels to be open at the same time. The `mdsAccordionChange` event then reports a comma-separated list of open indices.\n\n```html\n<mds-accordion multiple>\n <mds-accordion-item label=\"Documentazione\" selected>\n <mds-text>Scarica la guida utente in formato PDF.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Video tutorial\" selected>\n <mds-text>Guarda i video di formazione nel portale.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"FAQ\">\n <mds-text>Consulta le domande frequenti.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Mandatory Selection (Non-closable)\n\nSet `disable-close` to prevent the open panel from being collapsed. The currently expanded item stays open even when the user clicks its header again - exactly one panel is always visible.\n\n```html\n<mds-accordion disable-close>\n <mds-accordion-item label=\"Passaggio 1 - Dati anagrafici\" selected>\n <mds-text>Inserisci nome, cognome e codice fiscale.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Passaggio 2 - Residenza\">\n <mds-text>Inserisci indirizzo e comune di residenza.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Passaggio 3 - Riepilogo\">\n <mds-text>Verifica i dati inseriti prima di inviare.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Heading Typography on Items\n\nSet `typography` on each `mds-accordion-item` to align the header level with the document outline. Defaults to `h5`; use a heavier heading for more prominent section headers.\n\n```html\n<mds-accordion>\n <mds-accordion-item label=\"Sezione principale\" typography=\"h3\">\n <mds-text>Contenuto della sezione principale.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Sottosezione\" typography=\"h4\">\n <mds-text>Contenuto della sottosezione.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Listening to the Change Event\n\nListen for `mdsAccordionChange` to react when the active panel changes. The event detail carries `children` (the full NodeList) and `selected` (a string index or comma-separated indices when `multiple` is set).\n\n```html\n<mds-accordion id=\"faq-accordion\">\n <mds-accordion-item label=\"Cos'e' Magma?\">\n <mds-text>Magma e' il design system di Maggioli.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Come si installa?\">\n <mds-text>Segui le istruzioni nel file README del pacchetto.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n\n<script>\n document.getElementById('faq-accordion').addEventListener('mdsAccordionChange', (event) => {\n console.log('Pannello aperto:', event.detail.selected);\n });\n</script>\n```\n\n#### Rich Slotted Content in Items\n\nThe default slot of each `mds-accordion-item` accepts text, HTML elements, and other Magma components - use this to build complex content panels.\n\n```html\n<mds-accordion>\n <mds-accordion-item label=\"Dettagli del documento\">\n <mds-text typography=\"label\">Nome file</mds-text>\n <mds-text>Relazione_annuale_2024.pdf</mds-text>\n <mds-hr></mds-hr>\n <mds-text typography=\"label\">Dimensione</mds-text>\n <mds-text>2,4 MB</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Azioni disponibili\">\n <mds-button label=\"Scarica\" icon=\"mi/baseline/download\" variant=\"primary\"></mds-button>\n <mds-button label=\"Condividi\" icon=\"mi/baseline/share\" variant=\"secondary\" tone=\"outline\"></mds-button>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Styling Customization\n\nStyle the accordion only through its documented `--mds-accordion-*` CSS custom properties. The properties cascade into all child `mds-accordion-item` elements from the host.\n\n```css\n.custom-faq mds-accordion {\n --mds-accordion-border-color: rgb(var(--variant-primary-05));\n --mds-accordion-border-width: 1px;\n --mds-accordion-color: rgb(var(--tone-neutral-02));\n --mds-accordion-description-color: rgb(var(--tone-neutral-04));\n --mds-accordion-duration: 200ms;\n --mds-accordion-padding-selected: var(--spacing-600) 0 var(--spacing-800) 0;\n --mds-accordion-padding-unselected: var(--spacing-400) 0;\n}\n```\n",
24
+ "3. Antipattern": "Common incorrect uses of `<mds-accordion>`. Each entry pairs the wrong form with the right one and a one-line reason. System-wide rules (boolean-as-string, shadow piercing, Tailwind color utilities, raw native event listening) live in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md#system-level-anti-patterns) - they apply here too but are not repeated.\n\n#### Do Not Place Non-Item Children Directly in the Accordion Slot\n\nThe default slot of `<mds-accordion>` is designed exclusively for `<mds-accordion-item>` elements. Placing raw HTML or other components there bypasses the parent's selection coordination and breaks the compound component communication.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-accordion>\n <div>\n <h3>Sezione uno</h3>\n <p>Contenuto della sezione.</p>\n </div>\n</mds-accordion>\n\n<!-- ✅ CORRECT -->\n<mds-accordion>\n <mds-accordion-item label=\"Sezione uno\">\n <mds-text>Contenuto della sezione.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Do Not Use `mds-accordion-item` Outside `mds-accordion`\n\n`<mds-accordion-item>` is a compound child and relies on the parent to assign its `id` and manage selection state. Used standalone it has no coordinator and its `mdsAccordionItemSelect` / `mdsAccordionItemUnselect` events go unanswered.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-accordion-item label=\"Domanda frequente\">\n <mds-text>Risposta alla domanda.</mds-text>\n</mds-accordion-item>\n\n<!-- ✅ CORRECT -->\n<mds-accordion>\n <mds-accordion-item label=\"Domanda frequente\">\n <mds-text>Risposta alla domanda.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Do Not Listen to Native `click` or `toggle` Instead of `mdsAccordionChange`\n\nThe selection logic lives inside shadow DOM. Native `click` events from inside the shadow root may not propagate as expected, and there is no native `toggle` event on this component. Always listen for `mdsAccordionChange` to react to open/close changes.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-accordion id=\"my-accordion\">\n <mds-accordion-item label=\"Sezione A\">\n <mds-text>Contenuto A.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n<script>\n document.getElementById('my-accordion').addEventListener('click', (e) => {\n // unreliable - shadow DOM events may not surface correctly\n console.log('clicked');\n });\n</script>\n\n<!-- ✅ CORRECT -->\n<mds-accordion id=\"my-accordion\">\n <mds-accordion-item label=\"Sezione A\">\n <mds-text>Contenuto A.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n<script>\n document.getElementById('my-accordion').addEventListener('mdsAccordionChange', (e) => {\n console.log('Selezione corrente:', e.detail.selected);\n });\n</script>\n```\n\n#### Do Not Mix `mds-accordion-item` and `mds-accordion-timer-item`\n\n[`mds-accordion-timer`](../../mds-accordion-timer) and its child [`mds-accordion-timer-item`](../../mds-accordion-timer-item) are a separate compound pair. Slotting timer items into a plain accordion (or vice versa) breaks internal event wiring because each parent only listens for its own child's events.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-accordion>\n <mds-accordion-timer-item label=\"Avanzamento automatico\">\n <mds-text>Contenuto con timer.</mds-text>\n </mds-accordion-timer-item>\n</mds-accordion>\n\n<!-- ✅ CORRECT - use mds-accordion-timer with mds-accordion-timer-item -->\n<mds-accordion-timer>\n <mds-accordion-timer-item label=\"Avanzamento automatico\">\n <mds-text>Contenuto con timer.</mds-text>\n </mds-accordion-timer-item>\n</mds-accordion-timer>\n```\n\n#### Do Not Pierce Shadow DOM to Style Internals\n\nThe only supported customization surface is the `--mds-accordion-*` CSS custom properties and the documented `::part()` names on `mds-accordion-item` (`content`, `icon`, `label`). Targeting undocumented internals via `>>>` or deep class selectors couples code to the Shadow DOM implementation and breaks on minor releases.\n\n```css\n/* 🚫 INCORRECT */\nmds-accordion >>> .action {\n font-weight: bold;\n}\nmds-accordion-item::part(spinner) {\n display: none;\n}\n\n/* ✅ CORRECT */\nmds-accordion {\n --mds-accordion-color: rgb(var(--tone-neutral-02));\n --mds-accordion-border-color: rgb(var(--variant-primary-05));\n}\nmds-accordion-item::part(label) {\n font-style: italic;\n}\n```\n"
25
25
  },
26
26
  "props": [
27
27
  {
28
- "name": "closable",
28
+ "name": "disableClose",
29
29
  "type": "boolean | undefined",
30
30
  "complexType": {
31
31
  "original": "boolean",
@@ -33,16 +33,16 @@
33
33
  "references": {}
34
34
  },
35
35
  "mutable": false,
36
- "attr": "closable",
36
+ "attr": "disable-close",
37
37
  "reflectToAttr": false,
38
- "docs": "Specifies if an item can be closed by user",
38
+ "docs": "Prevents the user from closing the currently open item, forcing at least one panel to stay expanded",
39
39
  "docsTags": [
40
40
  {
41
41
  "name": "default",
42
- "text": "true"
42
+ "text": "false"
43
43
  }
44
44
  ],
45
- "default": "true",
45
+ "default": "false",
46
46
  "values": [
47
47
  {
48
48
  "type": "boolean"
@@ -195,7 +195,7 @@
195
195
  ],
196
196
  "usage": {
197
197
  "1. Description": "The `<mds-accordion-item>` web component is a single collapsible panel of the Magma Design System, designed to be slotted inside its parent [`<mds-accordion>`](../../mds-accordion). It renders a header button paired with an expandable content region; the parent controls which items are open.\n\n#### Semantic Behavior\n\n- **Compound child only**: Must be placed as a direct default-slot child of `<mds-accordion>`; it is not used standalone, and the parent's slot should hold only `mds-accordion-item` elements, not mixed child types.\n- **Parent-driven selection**: Clicking the header requests a toggle, but the authoritative open/closed state is resolved by the parent - in single mode opening one item closes its siblings, while in `multiple` mode each item toggles independently.\n- **Emitted events**: `mdsAccordionItemSelect` on open, `mdsAccordionItemUnselect` on close, and `mdsAccordionItemChange` on any toggle, each carrying `{ id, selected }`.\n- **Default slot**: Holds the collapsible body content (text, HTML, or components).\n\n#### Properties & Visual Configurations\n\n- **`label`** sets the always-visible header text shown whether the item is open or closed.\n- **`selected`** controls whether the panel is expanded; leave it to the parent to manage in coordinated accordions, or set it initially to have a panel start open.\n- **`typography`** picks the title style applied to the header label, defaulting to `h5`. Choose a heavier heading level (`h1`–`h4`) for more prominent section headers or `action` for a compact, control-like header; match it to the document's heading hierarchy so the accordion reads correctly to assistive technology.\n",
198
- "2. Pattern": "Correct and idiomatic ways to use the `<mds-accordion-item>` component, ordered from most common to most specialized. Patterns assume a working knowledge of compound component rules documented in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md) and the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n\n#### Basic Accordion\n\nThe canonical form. Place one or more `<mds-accordion-item>` elements as direct children of [`<mds-accordion>`](../../mds-accordion). Provide `label` for the header text and put the body content in the default slot.\n\n```html\n<mds-accordion>\n <mds-accordion-item label=\"Cos'e' Magma?\">\n <mds-text>Magma e' il design system di Maggioli, basato su web components.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Come si installa?\">\n <mds-text>Importa il loader e chiama defineCustomElements() nell'entry point.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"E' compatibile con React?\">\n <mds-text>Si', usa il pacchetto @maggioli-design-system/magma-react.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Panel Open by Default\n\nSet `selected` on the item you want pre-expanded. The parent resolves conflicts on load in single mode, so only set it on one item unless `multiple` is also set on the parent.\n\n```html\n<mds-accordion>\n <mds-accordion-item label=\"Introduzione\" selected>\n <mds-text>Questa sezione e' aperta per impostazione predefinita.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Prerequisiti\">\n <mds-text>Node.js 18+ e un package manager npm o pnpm.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Multiple Panels Open Simultaneously\n\nAdd `multiple` to `<mds-accordion>` so the user can expand more than one panel at once. Individual items do not change - the parent mode governs the behaviour.\n\n```html\n<mds-accordion multiple>\n <mds-accordion-item label=\"Configurazione di base\">\n <mds-text>Imposta i token di colore e il tema nell'entry point dell'applicazione.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Configurazione avanzata\" selected>\n <mds-text>Personalizza i CSS custom properties per adattare il tema al brand.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Integrazione CI/CD\" selected>\n <mds-text>Configura il job di build per generare documentation.json e readme.md.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Non-closable Accordion\n\nSet the parent `closable` prop to `false` via JavaScript to prevent the user from collapsing an open panel. An open item then stays open until another item is clicked (single mode only). Because `closable` defaults to `true`, do not set it via the HTML attribute - assign it through the element property instead.\n\n```html\n<mds-accordion id=\"steps\">\n <mds-accordion-item label=\"Passo 1 - Installazione\" selected>\n <mds-text>Esegui npm install @maggioli-design-system/magma per aggiungere il pacchetto.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Passo 2 - Configurazione\">\n <mds-text>Importa defineCustomElements e registra i componenti nell'app.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n\n<script>\n document.querySelector('#steps').closable = false;\n</script>\n```\n\n#### Typography for Section Headers\n\nUse `typography` to match the panel header to the surrounding document hierarchy. Default is `h5`; use `h3` or `h4` for top-level FAQ sections, `action` for compact control-bar items.\n\n```html\n<!-- FAQ section at heading level 3 -->\n<mds-accordion>\n <mds-accordion-item label=\"Come gestisco gli aggiornamenti?\" typography=\"h3\">\n <mds-text>Ogni release e' documentata nel changelog con note di migrazione.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Posso personalizzare i colori?\" typography=\"h3\">\n <mds-text>Si', tramite i CSS custom properties esposti da ogni componente.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Rich Slot Content\n\nThe default slot accepts any HTML or components - not just text. Use it for structured content such as lists, forms, or nested components.\n\n```html\n<mds-accordion>\n <mds-accordion-item label=\"Dettagli del progetto\">\n <mds-text typography=\"h6\">Tecnologie utilizzate</mds-text>\n <mds-list>\n <mds-list-item label=\"StencilJS\"></mds-list-item>\n <mds-list-item label=\"TypeScript\"></mds-list-item>\n <mds-list-item label=\"Storybook\"></mds-list-item>\n </mds-list>\n </mds-accordion-item>\n <mds-accordion-item label=\"Contatti del team\">\n <mds-text>Scrivi a design-system@maggioli.it per supporto tecnico.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Listening to Item Events\n\n`mdsAccordionItemChange` fires on every toggle; `mdsAccordionItemSelect` fires only on open; `mdsAccordionItemUnselect` fires only on close. Use `mdsAccordionItemChange` when you only need to react to any state change, or the specific event when you need to handle open and close differently.\n\n```html\n<mds-accordion id=\"faq\">\n <mds-accordion-item id=\"item-faq-1\" label=\"Domanda frequente 1\">\n <mds-text>Risposta alla prima domanda.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item id=\"item-faq-2\" label=\"Domanda frequente 2\">\n <mds-text>Risposta alla seconda domanda.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n\n<script>\n document.querySelector('#faq').addEventListener('mdsAccordionItemChange', (e) => {\n console.log('item changed:', e.detail.id, 'selected:', e.detail.selected);\n });\n\n document.querySelector('#item-faq-1').addEventListener('mdsAccordionItemSelect', (e) => {\n console.log('faq-1 opened');\n });\n</script>\n```\n\n#### Styling Customization\n\nStyle each item only through its documented `--mds-accordion-item-*` CSS custom properties. Setting vars on the parent `<mds-accordion>` propagates to all children via the `--mds-accordion-*` cascade variables the items consume.\n\n```css\n/* Customize all items via the parent */\nmds-accordion {\n --mds-accordion-border-color: rgb(var(--variant-primary-05));\n --mds-accordion-border-width: 1px;\n --mds-accordion-duration: 200ms;\n}\n\n/* Or target a single item directly */\n.sidebar mds-accordion-item {\n --mds-accordion-item-color: rgb(var(--tone-neutral-02));\n --mds-accordion-item-padding-selected: 1.5rem 0 2.5rem 0;\n --mds-accordion-item-padding-unselected: 1rem 0;\n}\n```\n",
198
+ "2. Pattern": "Correct and idiomatic ways to use the `<mds-accordion-item>` component, ordered from most common to most specialized. Patterns assume a working knowledge of compound component rules documented in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md) and the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n\n#### Basic Accordion\n\nThe canonical form. Place one or more `<mds-accordion-item>` elements as direct children of [`<mds-accordion>`](../../mds-accordion). Provide `label` for the header text and put the body content in the default slot.\n\n```html\n<mds-accordion>\n <mds-accordion-item label=\"Cos'e' Magma?\">\n <mds-text>Magma e' il design system di Maggioli, basato su web components.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Come si installa?\">\n <mds-text>Importa il loader e chiama defineCustomElements() nell'entry point.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"E' compatibile con React?\">\n <mds-text>Si', usa il pacchetto @maggioli-design-system/magma-react.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Panel Open by Default\n\nSet `selected` on the item you want pre-expanded. The parent resolves conflicts on load in single mode, so only set it on one item unless `multiple` is also set on the parent.\n\n```html\n<mds-accordion>\n <mds-accordion-item label=\"Introduzione\" selected>\n <mds-text>Questa sezione e' aperta per impostazione predefinita.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Prerequisiti\">\n <mds-text>Node.js 18+ e un package manager npm o pnpm.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Multiple Panels Open Simultaneously\n\nAdd `multiple` to `<mds-accordion>` so the user can expand more than one panel at once. Individual items do not change - the parent mode governs the behaviour.\n\n```html\n<mds-accordion multiple>\n <mds-accordion-item label=\"Configurazione di base\">\n <mds-text>Imposta i token di colore e il tema nell'entry point dell'applicazione.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Configurazione avanzata\" selected>\n <mds-text>Personalizza i CSS custom properties per adattare il tema al brand.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Integrazione CI/CD\" selected>\n <mds-text>Configura il job di build per generare documentation.json e readme.md.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Non-closable Accordion\n\nSet the parent `disable-close` attribute to prevent the user from collapsing an open panel. An open item then stays open until another item is clicked (single mode only). Because `disableClose` defaults to `false`, just add the boolean attribute to enable mandatory selection.\n\n```html\n<mds-accordion disable-close>\n <mds-accordion-item label=\"Passo 1 - Installazione\" selected>\n <mds-text>Esegui npm install @maggioli-design-system/magma per aggiungere il pacchetto.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Passo 2 - Configurazione\">\n <mds-text>Importa defineCustomElements e registra i componenti nell'app.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Typography for Section Headers\n\nUse `typography` to match the panel header to the surrounding document hierarchy. Default is `h5`; use `h3` or `h4` for top-level FAQ sections, `action` for compact control-bar items.\n\n```html\n<!-- FAQ section at heading level 3 -->\n<mds-accordion>\n <mds-accordion-item label=\"Come gestisco gli aggiornamenti?\" typography=\"h3\">\n <mds-text>Ogni release e' documentata nel changelog con note di migrazione.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item label=\"Posso personalizzare i colori?\" typography=\"h3\">\n <mds-text>Si', tramite i CSS custom properties esposti da ogni componente.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Rich Slot Content\n\nThe default slot accepts any HTML or components - not just text. Use it for structured content such as lists, forms, or nested components.\n\n```html\n<mds-accordion>\n <mds-accordion-item label=\"Dettagli del progetto\">\n <mds-text typography=\"h6\">Tecnologie utilizzate</mds-text>\n <mds-list>\n <mds-list-item label=\"StencilJS\"></mds-list-item>\n <mds-list-item label=\"TypeScript\"></mds-list-item>\n <mds-list-item label=\"Storybook\"></mds-list-item>\n </mds-list>\n </mds-accordion-item>\n <mds-accordion-item label=\"Contatti del team\">\n <mds-text>Scrivi a design-system@maggioli.it per supporto tecnico.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Listening to Item Events\n\n`mdsAccordionItemChange` fires on every toggle; `mdsAccordionItemSelect` fires only on open; `mdsAccordionItemUnselect` fires only on close. Use `mdsAccordionItemChange` when you only need to react to any state change, or the specific event when you need to handle open and close differently.\n\n```html\n<mds-accordion id=\"faq\">\n <mds-accordion-item id=\"item-faq-1\" label=\"Domanda frequente 1\">\n <mds-text>Risposta alla prima domanda.</mds-text>\n </mds-accordion-item>\n <mds-accordion-item id=\"item-faq-2\" label=\"Domanda frequente 2\">\n <mds-text>Risposta alla seconda domanda.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n\n<script>\n document.querySelector('#faq').addEventListener('mdsAccordionItemChange', (e) => {\n console.log('item changed:', e.detail.id, 'selected:', e.detail.selected);\n });\n\n document.querySelector('#item-faq-1').addEventListener('mdsAccordionItemSelect', (e) => {\n console.log('faq-1 opened');\n });\n</script>\n```\n\n#### Styling Customization\n\nStyle each item only through its documented `--mds-accordion-item-*` CSS custom properties. Setting vars on the parent `<mds-accordion>` propagates to all children via the `--mds-accordion-*` cascade variables the items consume.\n\n```css\n/* Customize all items via the parent */\nmds-accordion {\n --mds-accordion-border-color: rgb(var(--variant-primary-05));\n --mds-accordion-border-width: 1px;\n --mds-accordion-duration: 200ms;\n}\n\n/* Or target a single item directly */\n.sidebar mds-accordion-item {\n --mds-accordion-item-color: rgb(var(--tone-neutral-02));\n --mds-accordion-item-padding-selected: 1.5rem 0 2.5rem 0;\n --mds-accordion-item-padding-unselected: 1rem 0;\n}\n```\n",
199
199
  "3. Antipattern": "Common incorrect uses of `<mds-accordion-item>`. Each entry pairs the wrong form with the right one and a one-line reason. System-wide rules (boolean-as-string, shadow piercing, Tailwind color utilities, raw native event listening) live in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md#system-level-anti-patterns) - they apply here too but are not repeated.\n\n#### Do Not Use `mds-accordion-item` Outside `mds-accordion`\n\nThe item relies on the parent to assign its `id`, manage sibling state, and emit coordinated change events. Placing it standalone breaks selection, event coordination, and accessibility labelling.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-accordion-item label=\"Sezione autonoma\">\n <mds-text>Contenuto senza accordeon genitore.</mds-text>\n</mds-accordion-item>\n\n<!-- ✅ CORRECT -->\n<mds-accordion>\n <mds-accordion-item label=\"Sezione autonoma\">\n <mds-text>Contenuto all'interno del genitore corretto.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Do Not Wrap `mds-accordion-item` in Extra Elements\n\nThe parent queries its children directly with `querySelectorAll('mds-accordion-item')`; an intervening wrapper breaks that query, so items are never assigned an `id` and events are never coordinated.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-accordion>\n <div class=\"group\">\n <mds-accordion-item label=\"FAQ 1\">\n <mds-text>Risposta alla prima domanda.</mds-text>\n </mds-accordion-item>\n </div>\n</mds-accordion>\n\n<!-- ✅ CORRECT -->\n<mds-accordion>\n <mds-accordion-item label=\"FAQ 1\">\n <mds-text>Risposta alla prima domanda.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Do Not Set `label` via the Default Slot\n\n`label` is a required prop that drives the header button text, `aria-expanded`, and keyboard focus; the default slot holds only the collapsible body content. Putting header text in the slot places it inside the body region and leaves the required `label` prop empty, breaking both layout and accessibility.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-accordion>\n <mds-accordion-item>\n Dettagli dell'ordine\n </mds-accordion-item>\n</mds-accordion>\n\n<!-- ✅ CORRECT -->\n<mds-accordion>\n <mds-accordion-item label=\"Dettagli dell'ordine\">\n <mds-text>Numero ordine: 12345, data: 01/06/2026.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n```\n\n#### Do Not Override Open/Close State by Piercing the Shadow DOM\n\n`selected` is reflected as a host attribute and is writable via JavaScript. Targeting the internal `.content` div or `.icon` element via `::part()`, `>>>`, or undocumented class names to show/hide content manually bypasses the coordinated state machine and breaks sibling sync.\n\n```css\n/* 🚫 INCORRECT */\nmds-accordion-item::part(content) {\n display: block !important;\n}\nmds-accordion-item >>> .content {\n grid-template-rows: 1fr;\n}\n```\n\n```js\n/* ✅ CORRECT - toggle via the reflected property */\nconst item = document.querySelector('mds-accordion-item#item-0');\nitem.selected = true;\n```\n\n#### Do Not Listen for Native `click` or `change` Events Instead of the Documented `mds*` Events\n\nThe header click is handled inside the shadow DOM; the native `click` event does not bubble out reliably. The documented events `mdsAccordionItemChange`, `mdsAccordionItemSelect`, and `mdsAccordionItemUnselect` are the designed surface.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-accordion id=\"faq\">\n <mds-accordion-item id=\"q1\" label=\"Domanda 1\">\n <mds-text>Risposta 1.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n\n<script>\n document.querySelector('#q1').addEventListener('click', () => {\n console.log('clicked - unreliable from outside shadow DOM');\n });\n</script>\n\n<!-- ✅ CORRECT -->\n<script>\n document.querySelector('#q1').addEventListener('mdsAccordionItemChange', (e) => {\n console.log('stato:', e.detail.selected);\n });\n</script>\n```\n\n#### Do Not Use `<details>`/`<summary>` Inside the Slot as a Second Disclosure Layer\n\nThe item already is a styled disclosure widget. Nesting a native `<details>` inside the slot creates redundant expand/collapse semantics, duplicates keyboard interactions, and produces conflicting visual states.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-accordion>\n <mds-accordion-item label=\"Configurazione\">\n <details>\n <summary>Mostra dettagli</summary>\n <p>Parametri avanzati di configurazione.</p>\n </details>\n </mds-accordion-item>\n</mds-accordion>\n\n<!-- ✅ CORRECT - put content directly in the slot -->\n<mds-accordion>\n <mds-accordion-item label=\"Configurazione\">\n <mds-text typography=\"h6\">Parametri avanzati</mds-text>\n <mds-text>Descrizione dei parametri di configurazione avanzata.</mds-text>\n </mds-accordion-item>\n</mds-accordion>\n```\n"
200
200
  },
201
201
  "props": [
@@ -1838,36 +1838,6 @@
1838
1838
  "annotation": "prop",
1839
1839
  "docs": "Text color for the count badge in the stack"
1840
1840
  },
1841
- {
1842
- "name": "--mds-avatar-stack-item-lg-border",
1843
- "annotation": "prop",
1844
- "docs": "Border width for large avatars"
1845
- },
1846
- {
1847
- "name": "--mds-avatar-stack-item-lg-offset",
1848
- "annotation": "prop",
1849
- "docs": "Overlap factor for large avatars (higher = more overlap)"
1850
- },
1851
- {
1852
- "name": "--mds-avatar-stack-item-lg-size",
1853
- "annotation": "prop",
1854
- "docs": "Size of large avatars in the stack"
1855
- },
1856
- {
1857
- "name": "--mds-avatar-stack-item-md-border",
1858
- "annotation": "prop",
1859
- "docs": "Border width for medium avatars"
1860
- },
1861
- {
1862
- "name": "--mds-avatar-stack-item-md-offset",
1863
- "annotation": "prop",
1864
- "docs": "Overlap factor for medium avatars"
1865
- },
1866
- {
1867
- "name": "--mds-avatar-stack-item-md-size",
1868
- "annotation": "prop",
1869
- "docs": "Size of medium avatars in the stack"
1870
- },
1871
1841
  {
1872
1842
  "name": "--mds-avatar-stack-item-offset",
1873
1843
  "annotation": "prop",
@@ -1882,21 +1852,6 @@
1882
1852
  "name": "--mds-avatar-stack-item-size",
1883
1853
  "annotation": "prop",
1884
1854
  "docs": "Computed active size (based on selected size)"
1885
- },
1886
- {
1887
- "name": "--mds-avatar-stack-item-sm-border",
1888
- "annotation": "prop",
1889
- "docs": "Border width for small avatars"
1890
- },
1891
- {
1892
- "name": "--mds-avatar-stack-item-sm-offset",
1893
- "annotation": "prop",
1894
- "docs": "Overlap factor for small avatars"
1895
- },
1896
- {
1897
- "name": "--mds-avatar-stack-item-sm-size",
1898
- "annotation": "prop",
1899
- "docs": "Size of small avatars in the stack"
1900
1855
  }
1901
1856
  ],
1902
1857
  "slots": [],
@@ -2259,13 +2214,13 @@
2259
2214
  }
2260
2215
  ],
2261
2216
  "usage": {
2262
- "1. Description": "The `<mds-banner>` web component is the Magma Design System surface for contextual, in-page messages - informational notices, status callouts, and alerts - pairing an optional icon, headline, body text, and inline actions inside a single themed box.\n\n#### Semantic Behavior\n\n- **Variant-driven ARIA**: The announcement role is derived from `variant`, not set manually. `error` and `warning` announce assertively (`role=\"alert\"`); `ai`, `info`, `primary`, and `success` announce politely (`role=\"status\"`); `light` and `dark` are decorative and silent.\n- **Headline as label**: When `headline` is set it also becomes the banner's accessible label.\n- **Dismissal**: When `deletable` is true a close button is rendered; activating it emits `mdsBannerClose` and, if the banner sits inside an `mds-modal`, closes that modal.\n- **Localized close button**: The close button title is localized (el/en/es/it) from the host language.\n- **Action slot**: The `action` region is rendered only when a direct `[slot=\"action\"]` child is present, so banners without actions produce no empty container.\n\n#### Properties & Visual Configurations\n\nThis component uses the shared `variant` / `tone` ladders defined in [`projects/stencil/SPEC.md`](../../../../SPEC.md#tone-and-variant-system); pick the `variant` according to the message's semantic weight, since it also governs the ARIA behavior described above. `tone` is limited to the minimal-box set (`'weak'`, `'strong'`, `'box'`), defaulting to `'weak'`.\n\n#### Other behavioral props\n\n- **`cockade`** (default `true`) wraps the leading `icon` in a colored decorative badge; disable it for a flatter icon presentation.\n- **`icon`** is a Magma icon library slug shown at the top-left, surfaced as decorative.\n- **`deletable`** opts the banner into being dismissible - choose it for transient or user-acknowledged messages rather than persistent context.\n- The **default slot** carries the body text/markup; the **`action` slot** holds inline controls, with `mds-button` the recommended element.\n",
2263
- "2. Pattern": "Correct and idiomatic ways to use the `<mds-banner>` component, ordered from most common to most specialized. Patterns assume a working knowledge of the variant / tone ladders documented in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md) and the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n\n#### Informational Banner\n\nThe baseline usage. Provide `variant=\"info\"` and place the body copy in the default slot. The component derives `role=\"status\"` and `aria-live=\"polite\"` automatically from the variant.\n\n```html\n<mds-banner variant=\"info\">\n <mds-text typography=\"detail\">\n Il sistema e in manutenzione programmata dalle 22:00 alle 23:00.\n </mds-text>\n</mds-banner>\n```\n\n#### Status Variants\n\nPick the variant that matches the message's semantic weight. `error` and `warning` set `role=\"alert\"` with assertive live region; the others use `role=\"status\"` with polite announcement.\n\n```html\n<!-- Esito positivo -->\n<mds-banner variant=\"success\">\n <mds-text typography=\"detail\">Dati salvati correttamente.</mds-text>\n</mds-banner>\n\n<!-- Avviso non bloccante -->\n<mds-banner variant=\"warning\">\n <mds-text typography=\"detail\">La sessione scadra tra 5 minuti.</mds-text>\n</mds-banner>\n\n<!-- Errore bloccante -->\n<mds-banner variant=\"error\">\n <mds-text typography=\"detail\">Impossibile completare l'operazione. Riprovare.</mds-text>\n</mds-banner>\n```\n\n#### Banner with Headline\n\nUse the `headline` prop to add a title above the body text. The headline is also used as the banner's accessible label (`aria-label`).\n\n```html\n<mds-banner variant=\"warning\" headline=\"Licenza in scadenza\">\n <mds-text typography=\"detail\">\n La licenza del servizio scadra tra 7 giorni. Rinnova ora per non interrompere il servizio.\n </mds-text>\n</mds-banner>\n```\n\n#### Banner with Icon\n\nSet `icon` to a Magma icon slug. The icon is decorative (`aria-hidden=\"true\"`). `cockade` is `true` by default, wrapping the icon in a colored badge; set `cockade=\"false\"` for a flatter look.\n\n```html\n<!-- Con cockade (default) -->\n<mds-banner variant=\"info\" icon=\"mi/baseline/info\" headline=\"Aggiornamento disponibile\">\n <mds-text typography=\"detail\">E disponibile una nuova versione dell'applicazione.</mds-text>\n</mds-banner>\n\n<!-- Senza cockade -->\n<mds-banner variant=\"success\" icon=\"mi/baseline/check-circle\" cockade=\"false\">\n <mds-text typography=\"detail\">Operazione completata.</mds-text>\n</mds-banner>\n```\n\n#### Dismissible Banner\n\nSet `deletable` to show a close button. The button emits `mdsBannerClose` when activated. Listen for the event to remove the banner from the DOM or update application state.\n\n```html\n<mds-banner variant=\"info\" deletable id=\"promo-banner\">\n <mds-text typography=\"detail\">\n Scopri le nuove funzioni premium disponibili nel tuo piano.\n </mds-text>\n</mds-banner>\n\n<script>\n document.querySelector('#promo-banner').addEventListener('mdsBannerClose', () => {\n document.querySelector('#promo-banner').remove();\n });\n</script>\n```\n\n#### Banner with Action Buttons\n\nSlot `<mds-button>` elements with `slot=\"action\"` to add inline controls. The action region is rendered only when at least one `[slot=\"action\"]` child is present. Match the button variant to the banner variant for visual consistency.\n\n```html\n<mds-banner variant=\"warning\" headline=\"Abbonamento scaduto\">\n <mds-text typography=\"detail\">\n La licenza di questo servizio e scaduta. Il servizio continua a funzionare\n ma non puoi utilizzare le funzioni premium.\n </mds-text>\n <mds-button slot=\"action\" variant=\"warning\" tone=\"outline\">Annulla</mds-button>\n <mds-button slot=\"action\" variant=\"warning\" tone=\"strong\">Rinnova abbonamento</mds-button>\n</mds-banner>\n```\n\n#### Tone for Visual Emphasis\n\n`tone` controls emphasis without changing the semantic variant. Use `strong` for maximum contrast, `weak` (default) for subtle background tints, and `box` for high-contrast placements. `mds-banner` accepts only `weak`, `strong`, and `box` - not `outline` or `text`.\n\n```html\n<!-- Bassa enfasi (default) -->\n<mds-banner variant=\"error\" tone=\"weak\">\n <mds-text typography=\"detail\">Errore di validazione nei campi del modulo.</mds-text>\n</mds-banner>\n\n<!-- Alta enfasi -->\n<mds-banner variant=\"error\" tone=\"strong\">\n <mds-text typography=\"detail\">Account bloccato per attivita sospetta. Contatta il supporto.</mds-text>\n</mds-banner>\n```\n\n#### Dark and Light Decorative Variants\n\n`variant=\"dark\"` and `variant=\"light\"` are neutral, decorative banners without an ARIA live region (`role=\"presentation\"`). Use them for non-critical UI chrome - announcements or promotional content that does not require immediate attention.\n\n```html\n<mds-banner variant=\"dark\" tone=\"strong\" headline=\"Novita del mese\">\n <mds-text typography=\"detail\">\n Tre nuovi moduli sono stati aggiunti alla piattaforma.\n </mds-text>\n <mds-button slot=\"action\" variant=\"light\" tone=\"text\">Scopri</mds-button>\n</mds-banner>\n```\n\n#### AI Variant\n\nUse `variant=\"ai\"` to mark banners that present AI-generated content or AI-powered suggestions. The variant emits a polite `role=\"status\"` live announcement.\n\n```html\n<mds-banner variant=\"ai\" icon=\"mi/baseline/auto-awesome\" headline=\"Suggerimento IA\">\n <mds-text typography=\"detail\">\n L'analisi ha rilevato tre anomalie nel documento caricato.\n </mds-text>\n <mds-button slot=\"action\" variant=\"ai\" tone=\"outline\">Visualizza dettagli</mds-button>\n</mds-banner>\n```\n\n#### Dismissible Banner inside mds-modal\n\nWhen `deletable` is set and the banner lives inside an `<mds-modal>`, activating the close button emits `mdsBannerClose` and also closes the modal automatically - no extra JavaScript needed.\n\n```html\n<mds-modal opened>\n <mds-banner variant=\"warning\" deletable headline=\"Attenzione\">\n <mds-text typography=\"detail\">\n Stai per eliminare tutti i dati. L'azione non e reversibile.\n </mds-text>\n <mds-button slot=\"action\" variant=\"warning\" tone=\"outline\">Annulla</mds-button>\n <mds-button slot=\"action\" variant=\"warning\" tone=\"strong\">Elimina</mds-button>\n </mds-banner>\n</mds-modal>\n```\n\n#### CSS Custom Property Customization\n\nOverride appearance only through the documented `--mds-banner-*` custom properties. Set them on the host or a parent selector; use Magma color tokens via `rgb(var(--<token>))` so dark mode and high-contrast modes keep working.\n\n```css\n.featured-notice mds-banner {\n --mds-banner-background: rgb(var(--variant-primary-03));\n --mds-banner-color: rgb(var(--tone-kaolin-10));\n --mds-banner-headline-color: rgb(var(--tone-kaolin-10));\n --mds-banner-radius: var(--radius-sm);\n --mds-banner-shadow: 0 4px 16px rgb(var(--tone-neutral-02) / 0.15);\n}\n```\n",
2217
+ "1. Description": "The `<mds-banner>` web component is the Magma Design System surface for contextual, in-page messages - informational notices, status callouts, and alerts - pairing an optional icon, headline, body text, and inline actions inside a single themed box.\n\n#### Semantic Behavior\n\n- **Variant-driven ARIA**: The announcement role is derived from `variant`, not set manually. `error` and `warning` announce assertively (`role=\"alert\"`); `ai`, `info`, `primary`, and `success` announce politely (`role=\"status\"`); `light` and `dark` are decorative and silent.\n- **Headline as label**: When `headline` is set it also becomes the banner's accessible label.\n- **Dismissal**: When `deletable` is true a close button is rendered; activating it emits `mdsBannerClose` and, if the banner sits inside an `mds-modal`, closes that modal.\n- **Localized close button**: The close button title is localized (el/en/es/it) from the host language.\n- **Action slot**: The `action` region is rendered only when a direct `[slot=\"action\"]` child is present, so banners without actions produce no empty container.\n\n#### Properties & Visual Configurations\n\nThis component uses the shared `variant` / `tone` ladders defined in [`projects/stencil/SPEC.md`](../../../../SPEC.md#tone-and-variant-system); pick the `variant` according to the message's semantic weight, since it also governs the ARIA behavior described above. `tone` is limited to the minimal-box set (`'weak'`, `'strong'`, `'box'`), defaulting to `'weak'`.\n\n#### Other behavioral props\n\n- **`hideCockade`** (default `false`) removes the colored decorative badge wrapping the leading `icon`; set it for a flatter icon presentation.\n- **`icon`** is a Magma icon library slug shown at the top-left, surfaced as decorative.\n- **`deletable`** opts the banner into being dismissible - choose it for transient or user-acknowledged messages rather than persistent context.\n- The **default slot** carries the body text/markup; the **`action` slot** holds inline controls, with `mds-button` the recommended element.\n",
2218
+ "2. Pattern": "Correct and idiomatic ways to use the `<mds-banner>` component, ordered from most common to most specialized. Patterns assume a working knowledge of the variant / tone ladders documented in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md) and the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n\n#### Informational Banner\n\nThe baseline usage. Provide `variant=\"info\"` and place the body copy in the default slot. The component derives `role=\"status\"` and `aria-live=\"polite\"` automatically from the variant.\n\n```html\n<mds-banner variant=\"info\">\n <mds-text typography=\"detail\">\n Il sistema e in manutenzione programmata dalle 22:00 alle 23:00.\n </mds-text>\n</mds-banner>\n```\n\n#### Status Variants\n\nPick the variant that matches the message's semantic weight. `error` and `warning` set `role=\"alert\"` with assertive live region; the others use `role=\"status\"` with polite announcement.\n\n```html\n<!-- Esito positivo -->\n<mds-banner variant=\"success\">\n <mds-text typography=\"detail\">Dati salvati correttamente.</mds-text>\n</mds-banner>\n\n<!-- Avviso non bloccante -->\n<mds-banner variant=\"warning\">\n <mds-text typography=\"detail\">La sessione scadra tra 5 minuti.</mds-text>\n</mds-banner>\n\n<!-- Errore bloccante -->\n<mds-banner variant=\"error\">\n <mds-text typography=\"detail\">Impossibile completare l'operazione. Riprovare.</mds-text>\n</mds-banner>\n```\n\n#### Banner with Headline\n\nUse the `headline` prop to add a title above the body text. The headline is also used as the banner's accessible label (`aria-label`).\n\n```html\n<mds-banner variant=\"warning\" headline=\"Licenza in scadenza\">\n <mds-text typography=\"detail\">\n La licenza del servizio scadra tra 7 giorni. Rinnova ora per non interrompere il servizio.\n </mds-text>\n</mds-banner>\n```\n\n#### Banner with Icon\n\nSet `icon` to a Magma icon slug. The icon is decorative (`aria-hidden=\"true\"`). The colored badge wrapping the icon is shown by default; add `hide-cockade` for a flatter look.\n\n```html\n<!-- Con cockade (default) -->\n<mds-banner variant=\"info\" icon=\"mi/baseline/info\" headline=\"Aggiornamento disponibile\">\n <mds-text typography=\"detail\">E disponibile una nuova versione dell'applicazione.</mds-text>\n</mds-banner>\n\n<!-- Senza cockade -->\n<mds-banner variant=\"success\" icon=\"mi/baseline/check-circle\" hide-cockade>\n <mds-text typography=\"detail\">Operazione completata.</mds-text>\n</mds-banner>\n```\n\n#### Dismissible Banner\n\nSet `deletable` to show a close button. The button emits `mdsBannerClose` when activated. Listen for the event to remove the banner from the DOM or update application state.\n\n```html\n<mds-banner variant=\"info\" deletable id=\"promo-banner\">\n <mds-text typography=\"detail\">\n Scopri le nuove funzioni premium disponibili nel tuo piano.\n </mds-text>\n</mds-banner>\n\n<script>\n document.querySelector('#promo-banner').addEventListener('mdsBannerClose', () => {\n document.querySelector('#promo-banner').remove();\n });\n</script>\n```\n\n#### Banner with Action Buttons\n\nSlot `<mds-button>` elements with `slot=\"action\"` to add inline controls. The action region is rendered only when at least one `[slot=\"action\"]` child is present. Match the button variant to the banner variant for visual consistency.\n\n```html\n<mds-banner variant=\"warning\" headline=\"Abbonamento scaduto\">\n <mds-text typography=\"detail\">\n La licenza di questo servizio e scaduta. Il servizio continua a funzionare\n ma non puoi utilizzare le funzioni premium.\n </mds-text>\n <mds-button slot=\"action\" variant=\"warning\" tone=\"outline\">Annulla</mds-button>\n <mds-button slot=\"action\" variant=\"warning\" tone=\"strong\">Rinnova abbonamento</mds-button>\n</mds-banner>\n```\n\n#### Tone for Visual Emphasis\n\n`tone` controls emphasis without changing the semantic variant. Use `strong` for maximum contrast, `weak` (default) for subtle background tints, and `box` for high-contrast placements. `mds-banner` accepts only `weak`, `strong`, and `box` - not `outline` or `text`.\n\n```html\n<!-- Bassa enfasi (default) -->\n<mds-banner variant=\"error\" tone=\"weak\">\n <mds-text typography=\"detail\">Errore di validazione nei campi del modulo.</mds-text>\n</mds-banner>\n\n<!-- Alta enfasi -->\n<mds-banner variant=\"error\" tone=\"strong\">\n <mds-text typography=\"detail\">Account bloccato per attivita sospetta. Contatta il supporto.</mds-text>\n</mds-banner>\n```\n\n#### Dark and Light Decorative Variants\n\n`variant=\"dark\"` and `variant=\"light\"` are neutral, decorative banners without an ARIA live region (`role=\"presentation\"`). Use them for non-critical UI chrome - announcements or promotional content that does not require immediate attention.\n\n```html\n<mds-banner variant=\"dark\" tone=\"strong\" headline=\"Novita del mese\">\n <mds-text typography=\"detail\">\n Tre nuovi moduli sono stati aggiunti alla piattaforma.\n </mds-text>\n <mds-button slot=\"action\" variant=\"light\" tone=\"text\">Scopri</mds-button>\n</mds-banner>\n```\n\n#### AI Variant\n\nUse `variant=\"ai\"` to mark banners that present AI-generated content or AI-powered suggestions. The variant emits a polite `role=\"status\"` live announcement.\n\n```html\n<mds-banner variant=\"ai\" icon=\"mi/baseline/auto-awesome\" headline=\"Suggerimento IA\">\n <mds-text typography=\"detail\">\n L'analisi ha rilevato tre anomalie nel documento caricato.\n </mds-text>\n <mds-button slot=\"action\" variant=\"ai\" tone=\"outline\">Visualizza dettagli</mds-button>\n</mds-banner>\n```\n\n#### Dismissible Banner inside mds-modal\n\nWhen `deletable` is set and the banner lives inside an `<mds-modal>`, activating the close button emits `mdsBannerClose` and also closes the modal automatically - no extra JavaScript needed.\n\n```html\n<mds-modal opened>\n <mds-banner variant=\"warning\" deletable headline=\"Attenzione\">\n <mds-text typography=\"detail\">\n Stai per eliminare tutti i dati. L'azione non e reversibile.\n </mds-text>\n <mds-button slot=\"action\" variant=\"warning\" tone=\"outline\">Annulla</mds-button>\n <mds-button slot=\"action\" variant=\"warning\" tone=\"strong\">Elimina</mds-button>\n </mds-banner>\n</mds-modal>\n```\n\n#### CSS Custom Property Customization\n\nOverride appearance only through the documented `--mds-banner-*` custom properties. Set them on the host or a parent selector; use Magma color tokens via `rgb(var(--<token>))` so dark mode and high-contrast modes keep working.\n\n```css\n.featured-notice mds-banner {\n --mds-banner-background: rgb(var(--variant-primary-03));\n --mds-banner-color: rgb(var(--tone-kaolin-10));\n --mds-banner-headline-color: rgb(var(--tone-kaolin-10));\n --mds-banner-radius: var(--radius-sm);\n --mds-banner-shadow: 0 4px 16px rgb(var(--tone-neutral-02) / 0.15);\n}\n```\n",
2264
2219
  "3. Antipattern": "Common incorrect uses of `<mds-banner>`. Each entry pairs the wrong form with the right one and a one-line reason. System-wide rules (boolean-as-string, shadow piercing, Tailwind color utilities, raw native event listening) live in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md#system-level-anti-patterns) - they apply here too but are not repeated.\n\n#### Do Not Use an Invalid `tone` Value\n\n`mds-banner.tone` is typed as `ToneMinimalBoxVariantType`, which allows only `weak`, `strong`, and `box`. Values like `outline` or `text` are not accepted and will silently fall back to the default.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-banner variant=\"info\" tone=\"outline\">\n <mds-text typography=\"detail\">Informazione di sistema.</mds-text>\n</mds-banner>\n\n<!-- ✅ CORRECT -->\n<mds-banner variant=\"info\" tone=\"weak\">\n <mds-text typography=\"detail\">Informazione di sistema.</mds-text>\n</mds-banner>\n```\n\n#### Do Not Override the ARIA Role Manually\n\nThe component derives `role` and `aria-live` from `variant` - overriding them breaks the intentional severity mapping (`error`/`warning` assertive, others polite).\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-banner variant=\"info\" role=\"alert\" aria-live=\"assertive\">\n <mds-text typography=\"detail\">Aggiornamento disponibile.</mds-text>\n</mds-banner>\n\n<!-- ✅ CORRECT - let variant drive the ARIA behavior -->\n<mds-banner variant=\"info\">\n <mds-text typography=\"detail\">Aggiornamento disponibile.</mds-text>\n</mds-banner>\n```\n\n#### Do Not Slot an `mds-button` into the Default Slot to Add Actions\n\nThe `action` named slot is the correct place for inline controls. Placing buttons in the default slot renders them inside the text region, breaks layout, and loses the flex wrapping the action row provides.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-banner variant=\"warning\">\n <mds-text typography=\"detail\">La licenza sta per scadere.</mds-text>\n <mds-button variant=\"warning\">Rinnova</mds-button>\n</mds-banner>\n\n<!-- ✅ CORRECT -->\n<mds-banner variant=\"warning\">\n <mds-text typography=\"detail\">La licenza sta per scadere.</mds-text>\n <mds-button slot=\"action\" variant=\"warning\" tone=\"strong\">Rinnova</mds-button>\n</mds-banner>\n```\n\n#### Do Not Set `deletable=\"false\"` to Hide the Close Button\n\n`deletable` is a boolean prop. Setting it to the string `\"false\"` evaluates as truthy in HTML and shows the close button. Remove the attribute (or omit it) to hide the button.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-banner variant=\"error\" deletable=\"false\">\n <mds-text typography=\"detail\">Errore permanente - non dismissibile.</mds-text>\n</mds-banner>\n\n<!-- ✅ CORRECT -->\n<mds-banner variant=\"error\">\n <mds-text typography=\"detail\">Errore permanente - non dismissibile.</mds-text>\n</mds-banner>\n```\n\n#### Do Not Use `dark` or `light` for Status Messages\n\n`variant=\"dark\"` and `variant=\"light\"` produce `role=\"presentation\"` with no live region - they are silent to assistive tech. Using them for error, warning, or informational content means screen reader users never receive the announcement.\n\n```html\n<!-- 🚫 INCORRECT - errore silenzioso per tecnologie assistive -->\n<mds-banner variant=\"dark\">\n <mds-text typography=\"detail\">Errore: impossibile caricare il documento.</mds-text>\n</mds-banner>\n\n<!-- ✅ CORRECT -->\n<mds-banner variant=\"error\">\n <mds-text typography=\"detail\">Errore: impossibile caricare il documento.</mds-text>\n</mds-banner>\n```\n\n#### Do Not Pierce Shadow DOM to Style Internals\n\nThe only supported customization surface is the `--mds-banner-*` CSS custom properties plus the `::part(text)` shadow part. Targeting internal class names with `>>>` or undocumented `::part()` names couples your code to the implementation and breaks on minor releases.\n\n```css\n/* 🚫 INCORRECT */\nmds-banner >>> .headline {\n font-size: 1.5rem;\n}\nmds-banner::part(content) {\n padding: 0;\n}\n\n/* ✅ CORRECT */\nmds-banner {\n --mds-banner-headline-color: rgb(var(--variant-primary-03));\n --mds-banner-radius: var(--radius-sm);\n}\nmds-banner::part(text) {\n line-height: 1.6;\n}\n```\n\n#### Do Not Listen to the Native `click` Event for Dismissal\n\nThe component fires `mdsBannerClose` when the close button is activated (both pointer and keyboard). Listening to the native `click` event may miss keyboard activations and does not bubble out of Shadow DOM reliably.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-banner variant=\"info\" deletable id=\"notice\">\n <mds-text typography=\"detail\">Avviso temporaneo.</mds-text>\n</mds-banner>\n<script>\n document.querySelector('#notice').addEventListener('click', () => {\n document.querySelector('#notice').remove();\n });\n</script>\n\n<!-- ✅ CORRECT -->\n<mds-banner variant=\"info\" deletable id=\"notice\">\n <mds-text typography=\"detail\">Avviso temporaneo.</mds-text>\n</mds-banner>\n<script>\n document.querySelector('#notice').addEventListener('mdsBannerClose', () => {\n document.querySelector('#notice').remove();\n });\n</script>\n```\n"
2265
2220
  },
2266
2221
  "props": [
2267
2222
  {
2268
- "name": "cockade",
2223
+ "name": "deletable",
2269
2224
  "type": "boolean | undefined",
2270
2225
  "complexType": {
2271
2226
  "original": "boolean",
@@ -2273,16 +2228,10 @@
2273
2228
  "references": {}
2274
2229
  },
2275
2230
  "mutable": false,
2276
- "attr": "cockade",
2277
- "reflectToAttr": true,
2278
- "docs": "Shows a decoration around the banner icon",
2279
- "docsTags": [
2280
- {
2281
- "name": "default",
2282
- "text": "true"
2283
- }
2284
- ],
2285
- "default": "true",
2231
+ "attr": "deletable",
2232
+ "reflectToAttr": false,
2233
+ "docs": "Shows the cross icon to perform cancel/delete action on element",
2234
+ "docsTags": [],
2286
2235
  "values": [
2287
2236
  {
2288
2237
  "type": "boolean"
@@ -2297,21 +2246,21 @@
2297
2246
  "setter": false
2298
2247
  },
2299
2248
  {
2300
- "name": "deletable",
2301
- "type": "boolean | undefined",
2249
+ "name": "headline",
2250
+ "type": "string | undefined",
2302
2251
  "complexType": {
2303
- "original": "boolean",
2304
- "resolved": "boolean | undefined",
2252
+ "original": "string",
2253
+ "resolved": "string | undefined",
2305
2254
  "references": {}
2306
2255
  },
2307
2256
  "mutable": false,
2308
- "attr": "deletable",
2257
+ "attr": "headline",
2309
2258
  "reflectToAttr": false,
2310
- "docs": "Shows the cross icon to perform cancel/delete action on element",
2259
+ "docs": "The title on the top of the banner",
2311
2260
  "docsTags": [],
2312
2261
  "values": [
2313
2262
  {
2314
- "type": "boolean"
2263
+ "type": "string"
2315
2264
  },
2316
2265
  {
2317
2266
  "type": "undefined"
@@ -2323,21 +2272,27 @@
2323
2272
  "setter": false
2324
2273
  },
2325
2274
  {
2326
- "name": "headline",
2327
- "type": "string | undefined",
2275
+ "name": "hideCockade",
2276
+ "type": "boolean | undefined",
2328
2277
  "complexType": {
2329
- "original": "string",
2330
- "resolved": "string | undefined",
2278
+ "original": "boolean",
2279
+ "resolved": "boolean | undefined",
2331
2280
  "references": {}
2332
2281
  },
2333
2282
  "mutable": false,
2334
- "attr": "headline",
2335
- "reflectToAttr": false,
2336
- "docs": "The title on the top of the banner",
2337
- "docsTags": [],
2283
+ "attr": "hide-cockade",
2284
+ "reflectToAttr": true,
2285
+ "docs": "Hides the decoration around the banner icon",
2286
+ "docsTags": [
2287
+ {
2288
+ "name": "default",
2289
+ "text": "false"
2290
+ }
2291
+ ],
2292
+ "default": "false",
2338
2293
  "values": [
2339
2294
  {
2340
- "type": "string"
2295
+ "type": "boolean"
2341
2296
  },
2342
2297
  {
2343
2298
  "type": "undefined"
@@ -3350,13 +3305,13 @@
3350
3305
  }
3351
3306
  ],
3352
3307
  "usage": {
3353
- "1. Description": "The `<mds-breadcrumb>` web component is the navigation-trail container of the Magma Design System. It is a compound parent that arranges a sequence of slotted `<mds-breadcrumb-item>` children into a hierarchical path and adds an optional back-navigation control.\n\n#### Semantic Behavior\n\n- **Compound parent/child**: The default slot accepts only `<mds-breadcrumb-item>` children.\n- **Selection tracking**: When a child is selected it becomes the single current depth and the others are cleared.\n- **Back button**: When `back` is enabled the host renders a leading arrow that steps selection to the previous item; it auto-disables whenever the first item is current.\n- **Change event**: `mdsBreadcrumbChange` fires after any selection change - via a child click or the back arrow - carrying the new index `id` and the originating `caller` item.\n- **Localized back button**: The back button's `title` is resolved per document language (el/en/es/it).\n\n#### Properties & Visual Configurations\n\nThis component exposes a single behavioral prop:\n\n- **`back`** toggles the leading arrow control. Leave it enabled (the default) for multi-level trails where users benefit from a one-tap step backwards; disable it for shallow or display-only breadcrumbs where reverse navigation adds no value.\n\nVisual styling (button colors, current-depth color, separator arrow color) is driven by the CSS custom properties documented in [`readme.md`](../readme.md), not by props. The shared `variant` / `tone` / `size` ladders defined in [`projects/stencil/SPEC.md`](../../../../SPEC.md#tone-and-variant-system) do not apply here; per-item labels and selection state live on the `<mds-breadcrumb-item>` children.\n",
3354
- "2. Pattern": "Correct and idiomatic ways to use the `<mds-breadcrumb>` component, ordered from most common to most specialized. Patterns assume a working knowledge of the compound-component rules documented in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md) and the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n\n#### Basic Navigation Trail\n\nThe canonical form. Slot one `<mds-breadcrumb-item>` per level and mark the current depth with `selected`. The back arrow is shown by default.\n\n```html\n<mds-breadcrumb>\n <mds-breadcrumb-item label=\"Home\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Archivio pratiche\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Pratica 2024/001\" selected></mds-breadcrumb-item>\n</mds-breadcrumb>\n```\n\n#### Without the Back Arrow\n\nSet `back=\"false\"` - or remove the attribute - for display-only or shallow breadcrumbs where reverse navigation adds no value. Note: `back` defaults to `true`, so you must explicitly opt out.\n\n```html\n<!-- back is boolean; to disable it, pass the prop as false in frameworks\n or omit / bind it. In plain HTML use :back=\"false\" (framework) or\n control it programmatically. -->\n<mds-breadcrumb>\n <mds-breadcrumb-item label=\"Impostazioni\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Profilo utente\" selected></mds-breadcrumb-item>\n</mds-breadcrumb>\n```\n\nIn a JavaScript context:\n\n```js\ndocument.querySelector('mds-breadcrumb').back = false;\n```\n\n#### Listening for Navigation Changes\n\n`mdsBreadcrumbChange` fires whenever a child item is clicked or the back arrow is activated. The detail carries the zero-based `id` string of the newly selected item and the originating `caller` element.\n\n```html\n<mds-breadcrumb id=\"nav\">\n <mds-breadcrumb-item label=\"Dashboard\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Documenti\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Fatture\" selected></mds-breadcrumb-item>\n</mds-breadcrumb>\n\n<script>\n document.getElementById('nav').addEventListener('mdsBreadcrumbChange', (e) => {\n console.log('Livello selezionato:', e.detail.id);\n console.log('Elemento:', e.detail.caller);\n });\n</script>\n```\n\n#### Programmatic Selection\n\nSet `selected` on the item you want active - the component will deselect the others and update the back button state automatically.\n\n```html\n<mds-breadcrumb>\n <mds-breadcrumb-item label=\"Progetto Alpha\" selected></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Sprint 3\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Attivita\"></mds-breadcrumb-item>\n</mds-breadcrumb>\n```\n\n#### Item Label via `label` Prop\n\nAlways prefer the `label` prop on `<mds-breadcrumb-item>` over the default text slot. The prop is reflected as an HTML attribute, enabling CSS attribute selectors and framework bindings.\n\n```html\n<mds-breadcrumb>\n <mds-breadcrumb-item label=\"Area riservata\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Gestione utenti\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Nuovo utente\" selected></mds-breadcrumb-item>\n</mds-breadcrumb>\n```\n\n#### Styling Customization via CSS Custom Properties\n\nApply `--mds-breadcrumb-*` vars on the host to retheme the whole trail at once. Use Magma color tokens wrapped in `rgb(var(--<token>))` so dark mode and high-contrast modes keep working. Changes on the parent propagate into the child items because the item vars inherit from the parent vars.\n\n```css\n.sidebar-nav mds-breadcrumb {\n --mds-breadcrumb-button-color: rgb(var(--variant-secondary-03));\n --mds-breadcrumb-button-color-hover: rgb(var(--variant-secondary-01));\n --mds-breadcrumb-button-background-current: rgb(var(--variant-secondary-09));\n --mds-breadcrumb-button-color-current: rgb(var(--variant-secondary-01));\n --mds-breadcrumb-arrow-depth-color: rgb(var(--variant-secondary-05));\n}\n```\n\n#### Per-Item Styling via `::part(button)`\n\nWhen you need to restyle a single item's inner button beyond what the CSS vars allow, target the documented `::part(button)` on `<mds-breadcrumb-item>`. This is the only supported shadow-part surface on the child component.\n\n```css\nmds-breadcrumb-item[selected]::part(button) {\n font-weight: bold;\n letter-spacing: 0.02em;\n}\n```\n",
3355
- "3. Antipattern": "Common incorrect uses of `<mds-breadcrumb>`. Each entry pairs the wrong form with the right one and a one-line reason. System-wide rules (boolean-as-string, shadow piercing, raw native event listening) live in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md#system-level-anti-patterns) - they apply here too but are not repeated.\n\n#### Do Not Slot Raw HTML Inside `<mds-breadcrumb>`\n\nThe default slot accepts only `<mds-breadcrumb-item>` elements; slotting arbitrary HTML breaks the internal selection-tracking and back-button logic.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-breadcrumb>\n <a href=\"/home\">Home</a>\n <span>Archivio</span>\n <strong>Documento corrente</strong>\n</mds-breadcrumb>\n\n<!-- ✅ CORRECT -->\n<mds-breadcrumb>\n <mds-breadcrumb-item label=\"Home\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Archivio\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Documento corrente\" selected></mds-breadcrumb-item>\n</mds-breadcrumb>\n```\n\n#### Do Not Disable the Back Button with `back=\"false\"`\n\n`back` is a boolean prop. In HTML, any non-empty string attribute value is truthy - `back=\"false\"` keeps the button visible. Set the prop to `false` via JavaScript, or omit the attribute entirely.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-breadcrumb back=\"false\">\n <mds-breadcrumb-item label=\"Home\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Sezione\" selected></mds-breadcrumb-item>\n</mds-breadcrumb>\n\n<!-- ✅ CORRECT (set via JS) -->\n<mds-breadcrumb id=\"bc\">\n <mds-breadcrumb-item label=\"Home\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Sezione\" selected></mds-breadcrumb-item>\n</mds-breadcrumb>\n<script>document.getElementById('bc').back = false;</script>\n```\n\n#### Do Not Use `<mds-breadcrumb-item>` Outside `<mds-breadcrumb>`\n\nChild items rely on the parent for ID assignment and selection-state management. Rendering them standalone breaks both keyboard navigation and the change event.\n\n```html\n<!-- 🚫 INCORRECT -->\n<div class=\"my-nav\">\n <mds-breadcrumb-item label=\"Home\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Sezione\" selected></mds-breadcrumb-item>\n</div>\n\n<!-- ✅ CORRECT -->\n<mds-breadcrumb>\n <mds-breadcrumb-item label=\"Home\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Sezione\" selected></mds-breadcrumb-item>\n</mds-breadcrumb>\n```\n\n#### Do Not Pass Text or HTML as `<mds-breadcrumb-item>` Children\n\n`<mds-breadcrumb-item>` has no default slot; the `label` prop is the only way to set the visible text. Text or HTML placed between the tags is ignored and never rendered.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-breadcrumb>\n <mds-breadcrumb-item>\n <strong>Categoria</strong>\n </mds-breadcrumb-item>\n <mds-breadcrumb-item selected>\n <span class=\"active\">Sottocategoria</span>\n </mds-breadcrumb-item>\n</mds-breadcrumb>\n\n<!-- ✅ CORRECT -->\n<mds-breadcrumb>\n <mds-breadcrumb-item label=\"Categoria\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Sottocategoria\" selected></mds-breadcrumb-item>\n</mds-breadcrumb>\n```\n\n#### Do Not Manage Selection State Manually by Toggling Classes\n\nThe parent tracks which item is selected internally; toggling CSS classes or `aria-current` on the host bypasses that logic and leaves the back button in an inconsistent state. Use the `selected` prop instead.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-breadcrumb>\n <mds-breadcrumb-item label=\"Home\" class=\"is-active\" aria-current=\"page\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Archivio\"></mds-breadcrumb-item>\n</mds-breadcrumb>\n\n<!-- ✅ CORRECT -->\n<mds-breadcrumb>\n <mds-breadcrumb-item label=\"Home\" selected></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Archivio\"></mds-breadcrumb-item>\n</mds-breadcrumb>\n```\n\n#### Do Not Pierce the Shadow DOM to Style the Internal Back Button\n\nThe back button rendered inside `<mds-breadcrumb>` is a private implementation detail. Use the documented `--mds-breadcrumb-*` CSS custom properties to control its appearance.\n\n```css\n/* 🚫 INCORRECT */\nmds-breadcrumb >>> .back {\n background: red;\n}\nmds-breadcrumb::part(back) {\n display: none;\n}\n\n/* ✅ CORRECT */\nmds-breadcrumb {\n --mds-breadcrumb-button-background-disabled: transparent;\n --mds-breadcrumb-button-color-disabled: rgb(var(--tone-neutral-08));\n}\n```\n"
3308
+ "1. Description": "The `<mds-breadcrumb>` web component is the navigation-trail container of the Magma Design System. It is a compound parent that arranges a sequence of slotted `<mds-breadcrumb-item>` children into a hierarchical path and adds an optional back-navigation control.\n\n#### Semantic Behavior\n\n- **Compound parent/child**: The default slot accepts only `<mds-breadcrumb-item>` children.\n- **Selection tracking**: When a child is selected it becomes the single current depth and the others are cleared.\n- **Back button**: Unless `hide-back` is set the host renders a leading arrow that steps selection to the previous item; it auto-disables whenever the first item is current.\n- **Change event**: `mdsBreadcrumbChange` fires after any selection change - via a child click or the back arrow - carrying the new index `id` and the originating `caller` item.\n- **Localized back button**: The back button's `title` is resolved per document language (el/en/es/it).\n\n#### Properties & Visual Configurations\n\nThis component exposes a single behavioral prop:\n\n- **`hideBack`** removes the leading arrow control. Leave it off (the default) for multi-level trails where users benefit from a one-tap step backwards; set it for shallow or display-only breadcrumbs where reverse navigation adds no value.\n\nVisual styling (button colors, current-depth color, separator arrow color) is driven by the CSS custom properties documented in [`readme.md`](../readme.md), not by props. The shared `variant` / `tone` / `size` ladders defined in [`projects/stencil/SPEC.md`](../../../../SPEC.md#tone-and-variant-system) do not apply here; per-item labels and selection state live on the `<mds-breadcrumb-item>` children.\n",
3309
+ "2. Pattern": "Correct and idiomatic ways to use the `<mds-breadcrumb>` component, ordered from most common to most specialized. Patterns assume a working knowledge of the compound-component rules documented in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md) and the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n\n#### Basic Navigation Trail\n\nThe canonical form. Slot one `<mds-breadcrumb-item>` per level and mark the current depth with `selected`. The back arrow is shown by default.\n\n```html\n<mds-breadcrumb>\n <mds-breadcrumb-item label=\"Home\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Archivio pratiche\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Pratica 2024/001\" selected></mds-breadcrumb-item>\n</mds-breadcrumb>\n```\n\n#### Without the Back Arrow\n\nAdd the `hide-back` attribute for display-only or shallow breadcrumbs where reverse navigation adds no value. The back arrow is shown by default, so this is an explicit opt-out.\n\n```html\n<mds-breadcrumb hide-back>\n <mds-breadcrumb-item label=\"Impostazioni\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Profilo utente\" selected></mds-breadcrumb-item>\n</mds-breadcrumb>\n```\n\n#### Listening for Navigation Changes\n\n`mdsBreadcrumbChange` fires whenever a child item is clicked or the back arrow is activated. The detail carries the zero-based `id` string of the newly selected item and the originating `caller` element.\n\n```html\n<mds-breadcrumb id=\"nav\">\n <mds-breadcrumb-item label=\"Dashboard\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Documenti\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Fatture\" selected></mds-breadcrumb-item>\n</mds-breadcrumb>\n\n<script>\n document.getElementById('nav').addEventListener('mdsBreadcrumbChange', (e) => {\n console.log('Livello selezionato:', e.detail.id);\n console.log('Elemento:', e.detail.caller);\n });\n</script>\n```\n\n#### Programmatic Selection\n\nSet `selected` on the item you want active - the component will deselect the others and update the back button state automatically.\n\n```html\n<mds-breadcrumb>\n <mds-breadcrumb-item label=\"Progetto Alpha\" selected></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Sprint 3\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Attivita\"></mds-breadcrumb-item>\n</mds-breadcrumb>\n```\n\n#### Item Label via `label` Prop\n\nAlways prefer the `label` prop on `<mds-breadcrumb-item>` over the default text slot. The prop is reflected as an HTML attribute, enabling CSS attribute selectors and framework bindings.\n\n```html\n<mds-breadcrumb>\n <mds-breadcrumb-item label=\"Area riservata\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Gestione utenti\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Nuovo utente\" selected></mds-breadcrumb-item>\n</mds-breadcrumb>\n```\n\n#### Styling Customization via CSS Custom Properties\n\nApply `--mds-breadcrumb-*` vars on the host to retheme the whole trail at once. Use Magma color tokens wrapped in `rgb(var(--<token>))` so dark mode and high-contrast modes keep working. Changes on the parent propagate into the child items because the item vars inherit from the parent vars.\n\n```css\n.sidebar-nav mds-breadcrumb {\n --mds-breadcrumb-button-color: rgb(var(--variant-secondary-03));\n --mds-breadcrumb-button-color-hover: rgb(var(--variant-secondary-01));\n --mds-breadcrumb-button-background-current: rgb(var(--variant-secondary-09));\n --mds-breadcrumb-button-color-current: rgb(var(--variant-secondary-01));\n --mds-breadcrumb-arrow-depth-color: rgb(var(--variant-secondary-05));\n}\n```\n\n#### Per-Item Styling via `::part(button)`\n\nWhen you need to restyle a single item's inner button beyond what the CSS vars allow, target the documented `::part(button)` on `<mds-breadcrumb-item>`. This is the only supported shadow-part surface on the child component.\n\n```css\nmds-breadcrumb-item[selected]::part(button) {\n font-weight: bold;\n letter-spacing: 0.02em;\n}\n```\n",
3310
+ "3. Antipattern": "Common incorrect uses of `<mds-breadcrumb>`. Each entry pairs the wrong form with the right one and a one-line reason. System-wide rules (boolean-as-string, shadow piercing, raw native event listening) live in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md#system-level-anti-patterns) - they apply here too but are not repeated.\n\n#### Do Not Slot Raw HTML Inside `<mds-breadcrumb>`\n\nThe default slot accepts only `<mds-breadcrumb-item>` elements; slotting arbitrary HTML breaks the internal selection-tracking and back-button logic.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-breadcrumb>\n <a href=\"/home\">Home</a>\n <span>Archivio</span>\n <strong>Documento corrente</strong>\n</mds-breadcrumb>\n\n<!-- ✅ CORRECT -->\n<mds-breadcrumb>\n <mds-breadcrumb-item label=\"Home\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Archivio\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Documento corrente\" selected></mds-breadcrumb-item>\n</mds-breadcrumb>\n```\n\n#### Do Not Use `<mds-breadcrumb-item>` Outside `<mds-breadcrumb>`\n\nChild items rely on the parent for ID assignment and selection-state management. Rendering them standalone breaks both keyboard navigation and the change event.\n\n```html\n<!-- 🚫 INCORRECT -->\n<div class=\"my-nav\">\n <mds-breadcrumb-item label=\"Home\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Sezione\" selected></mds-breadcrumb-item>\n</div>\n\n<!-- ✅ CORRECT -->\n<mds-breadcrumb>\n <mds-breadcrumb-item label=\"Home\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Sezione\" selected></mds-breadcrumb-item>\n</mds-breadcrumb>\n```\n\n#### Do Not Pass Text or HTML as `<mds-breadcrumb-item>` Children\n\n`<mds-breadcrumb-item>` has no default slot; the `label` prop is the only way to set the visible text. Text or HTML placed between the tags is ignored and never rendered.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-breadcrumb>\n <mds-breadcrumb-item>\n <strong>Categoria</strong>\n </mds-breadcrumb-item>\n <mds-breadcrumb-item selected>\n <span class=\"active\">Sottocategoria</span>\n </mds-breadcrumb-item>\n</mds-breadcrumb>\n\n<!-- ✅ CORRECT -->\n<mds-breadcrumb>\n <mds-breadcrumb-item label=\"Categoria\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Sottocategoria\" selected></mds-breadcrumb-item>\n</mds-breadcrumb>\n```\n\n#### Do Not Manage Selection State Manually by Toggling Classes\n\nThe parent tracks which item is selected internally; toggling CSS classes or `aria-current` on the host bypasses that logic and leaves the back button in an inconsistent state. Use the `selected` prop instead.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-breadcrumb>\n <mds-breadcrumb-item label=\"Home\" class=\"is-active\" aria-current=\"page\"></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Archivio\"></mds-breadcrumb-item>\n</mds-breadcrumb>\n\n<!-- ✅ CORRECT -->\n<mds-breadcrumb>\n <mds-breadcrumb-item label=\"Home\" selected></mds-breadcrumb-item>\n <mds-breadcrumb-item label=\"Archivio\"></mds-breadcrumb-item>\n</mds-breadcrumb>\n```\n\n#### Do Not Pierce the Shadow DOM to Style the Internal Back Button\n\nThe back button rendered inside `<mds-breadcrumb>` is a private implementation detail. Use the documented `--mds-breadcrumb-*` CSS custom properties to control its appearance.\n\n```css\n/* 🚫 INCORRECT */\nmds-breadcrumb >>> .back {\n background: red;\n}\nmds-breadcrumb::part(back) {\n display: none;\n}\n\n/* ✅ CORRECT */\nmds-breadcrumb {\n --mds-breadcrumb-button-background-disabled: transparent;\n --mds-breadcrumb-button-color-disabled: rgb(var(--tone-neutral-08));\n}\n```\n"
3356
3311
  },
3357
3312
  "props": [
3358
3313
  {
3359
- "name": "back",
3314
+ "name": "hideBack",
3360
3315
  "type": "boolean | undefined",
3361
3316
  "complexType": {
3362
3317
  "original": "boolean",
@@ -3364,16 +3319,16 @@
3364
3319
  "references": {}
3365
3320
  },
3366
3321
  "mutable": false,
3367
- "attr": "back",
3322
+ "attr": "hide-back",
3368
3323
  "reflectToAttr": false,
3369
- "docs": "Choose to display or not the back arrow button",
3324
+ "docs": "Hides the back arrow button",
3370
3325
  "docsTags": [
3371
3326
  {
3372
3327
  "name": "default",
3373
- "text": "true"
3328
+ "text": "false"
3374
3329
  }
3375
3330
  ],
3376
- "default": "true",
3331
+ "default": "false",
3377
3332
  "values": [
3378
3333
  {
3379
3334
  "type": "boolean"
@@ -6290,13 +6245,13 @@
6290
6245
  }
6291
6246
  ],
6292
6247
  "usage": {
6293
- "1. Description": "The `<mds-card>` web component is the surface container of the Magma Design System: a styled, self-contained panel that groups related media, heading, body and action content into a single bounded region. It is a pure layout shell built on named slots and compound children rather than a replacement for any single HTML primitive.\n\n#### Semantic Behavior\n\n- **Layout is inferred, not declared**: The card detects which of the `media` / `header` / `content` / `footer` regions are present and reshapes itself to whatever content you provide.\n- **Compound parent/child relationship**: `<mds-card-media>`, `<mds-card-header>`, `<mds-card-content>` and `<mds-card-footer>` are recognized by tag name and mapped onto the corresponding region, so they slot in without an explicit `slot` attribute. Plain elements still work when given the matching `slot` value.\n- **Responsive by width**: The card's internal layout switches between stacked and media-beside-content arrangements based on the card's own width, independent of viewport or theme.\n- **Slot regions are fixed**: Only the four named regions are rendered; there is no default (unnamed) slot, so loose text or elements without a recognized slot/tag are not laid out.\n\n#### Properties & Visual Configurations\n\n`<mds-card>` does not use the shared `variant` / `tone` ladders defined in [`projects/stencil/SPEC.md`](../../../../SPEC.md#tone-and-variant-system); it exposes a single behavioral prop.\n\n- **`autoGrid`** (default `true`) toggles the intrinsic responsive grid. Leave it enabled to let the card own the placement and reflow of its regions; set it to `false` to opt out of the managed grid and lay the slotted content out yourself.\n\nSpacing is tuned through the `--mds-card-gap` and `--mds-card-padding` CSS custom properties rather than props.\n",
6294
- "2. Pattern": "Correct and idiomatic ways to use the `<mds-card>` component, ordered from most common to most specialized. Patterns assume a working knowledge of the compound-component rules documented in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md) and the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n\n#### Full Card with All Four Regions\n\nThe most common form. Use `<mds-card-header>`, `<mds-card-media>`, `<mds-card-content>`, and `<mds-card-footer>` as direct children. Each compound child self-assigns to its slot - no explicit `slot` attribute needed.\n\n```html\n<mds-card>\n <mds-card-header>\n <mds-text typography=\"h6\">Titolo della scheda</mds-text>\n </mds-card-header>\n <mds-card-media>\n <mds-img src=\"/immagini/copertina.jpg\" class=\"object-cover\"></mds-img>\n </mds-card-media>\n <mds-card-content>\n <mds-text>\n Descrizione dettagliata del contenuto della scheda.\n </mds-text>\n </mds-card-content>\n <mds-card-footer>\n <mds-button variant=\"dark\" tone=\"text\" label=\"Annulla\"></mds-button>\n <mds-button variant=\"primary\" tone=\"strong\" label=\"Conferma\"></mds-button>\n </mds-card-footer>\n</mds-card>\n```\n\n#### Header + Content (No Media)\n\nOmit the regions you do not need - the card detects which regions are present and adapts its grid layout accordingly. A header-and-content-only card stays single-column.\n\n```html\n<mds-card>\n <mds-card-header>\n <mds-text typography=\"h6\">Riepilogo ordine</mds-text>\n </mds-card-header>\n <mds-card-content>\n <mds-text>\n Il tuo ordine e' stato elaborato correttamente.\n </mds-text>\n </mds-card-content>\n</mds-card>\n```\n\n#### Media + Content + Footer (No Header)\n\nOmitting the header region shifts media to the top and content immediately below. Useful for image-led catalog cards.\n\n```html\n<mds-card>\n <mds-card-media>\n <mds-img src=\"/immagini/prodotto.jpg\" class=\"object-cover\"></mds-img>\n </mds-card-media>\n <mds-card-content>\n <mds-text>Descrizione prodotto disponibile nella gamma autunnale.</mds-text>\n </mds-card-content>\n <mds-card-footer>\n <mds-button variant=\"primary\" label=\"Aggiungi al carrello\"></mds-button>\n </mds-card-footer>\n</mds-card>\n```\n\n#### Header with Action Button via `mds-card-header`\n\n`<mds-card-header>` has a dedicated `action` slot for icon buttons placed in the trailing position. Use it instead of laying out the button manually.\n\n```html\n<mds-card>\n <mds-card-header>\n <mds-text typography=\"h6\">Profilo utente</mds-text>\n <mds-button\n slot=\"action\"\n icon=\"mi/round/more-vert\"\n aria-label=\"Altre azioni\"\n variant=\"dark\"\n tone=\"text\"\n ></mds-button>\n </mds-card-header>\n <mds-card-content>\n <mds-text>Mario Rossi - Amministratore di sistema</mds-text>\n </mds-card-content>\n</mds-card>\n```\n\n#### Media with Overlay Content via `mds-card-media`\n\n`<mds-card-media>` exposes a `content` slot that renders in front of the media element. Use it for captions, badges, or status chips overlaid on an image.\n\n```html\n<mds-card>\n <mds-card-media>\n <mds-img src=\"/immagini/evento.jpg\" class=\"object-cover\"></mds-img>\n <mds-badge slot=\"content\" variant=\"primary\" tone=\"strong\">In corso</mds-badge>\n </mds-card-media>\n <mds-card-content>\n <mds-text typography=\"h6\">Conferenza annuale 2025</mds-text>\n </mds-card-content>\n</mds-card>\n```\n\n#### Using Raw Slot Attributes Instead of Compound Children\n\nWhen the compound children (`mds-card-*`) do not fit the use case, assign the `slot` attribute directly on any element. The layout engine recognizes the same four values: `media`, `header`, `content`, and `footer`.\n\n```html\n<mds-card>\n <div slot=\"header\" class=\"flex items-center gap-400 px-400 py-400\">\n <mds-avatar initials=\"LB\"></mds-avatar>\n <mds-text typography=\"h6\">Luca Bianchi</mds-text>\n </div>\n <mds-img slot=\"media\" src=\"/immagini/lavoro.jpg\" class=\"object-cover\"></mds-img>\n <mds-text slot=\"content\" class=\"px-400\">\n Responsabile del progetto infrastrutture.\n </mds-text>\n</mds-card>\n```\n\n#### Disabling the Auto-Grid\n\nSet `auto-grid=\"false\"` to opt out of the managed responsive grid. All four regions stack in document order and you own all layout decisions.\n\n```html\n<mds-card auto-grid=\"false\">\n <mds-card-header>\n <mds-text typography=\"h6\">Layout personalizzato</mds-text>\n </mds-card-header>\n <mds-card-content>\n <mds-text>Il contenuto e' disposto senza griglia automatica.</mds-text>\n </mds-card-content>\n</mds-card>\n```\n\n#### Styling Customization via CSS Custom Properties\n\nSet `--mds-card-gap` and `--mds-card-padding` on the host or a parent selector. Use Magma spacing tokens so the values remain consistent across themes.\n\n```css\n.scheda-articolo mds-card {\n --mds-card-gap: var(--spacing-200);\n --mds-card-padding: var(--spacing-400);\n}\n```\n\n#### Customizing the Layout Part\n\nThe inner grid element is exposed as `::part(layout)`. Use it only for layout-level overrides that the CSS custom properties cannot cover, such as overriding the `border-radius` of the inner container.\n\n```css\n.scheda-highlight mds-card::part(layout) {\n border-radius: var(--radius-xl);\n}\n```\n",
6248
+ "1. Description": "The `<mds-card>` web component is the surface container of the Magma Design System: a styled, self-contained panel that groups related media, heading, body and action content into a single bounded region. It is a pure layout shell built on named slots and compound children rather than a replacement for any single HTML primitive.\n\n#### Semantic Behavior\n\n- **Layout is inferred, not declared**: The card detects which of the `media` / `header` / `content` / `footer` regions are present and reshapes itself to whatever content you provide.\n- **Compound parent/child relationship**: `<mds-card-media>`, `<mds-card-header>`, `<mds-card-content>` and `<mds-card-footer>` are recognized by tag name and mapped onto the corresponding region, so they slot in without an explicit `slot` attribute. Plain elements still work when given the matching `slot` value.\n- **Responsive by width**: The card's internal layout switches between stacked and media-beside-content arrangements based on the card's own width, independent of viewport or theme.\n- **Slot regions are fixed**: Only the four named regions are rendered; there is no default (unnamed) slot, so loose text or elements without a recognized slot/tag are not laid out.\n\n#### Properties & Visual Configurations\n\n`<mds-card>` does not use the shared `variant` / `tone` ladders defined in [`projects/stencil/SPEC.md`](../../../../SPEC.md#tone-and-variant-system); it exposes a single behavioral prop.\n\n- **`disableAutoGrid`** (default `false`) toggles the intrinsic responsive grid. Leave it off to let the card own the placement and reflow of its regions; set it to opt out of the managed grid and lay the slotted content out yourself.\n\nSpacing is tuned through the `--mds-card-gap` and `--mds-card-padding` CSS custom properties rather than props.\n",
6249
+ "2. Pattern": "Correct and idiomatic ways to use the `<mds-card>` component, ordered from most common to most specialized. Patterns assume a working knowledge of the compound-component rules documented in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md) and the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n\n#### Full Card with All Four Regions\n\nThe most common form. Use `<mds-card-header>`, `<mds-card-media>`, `<mds-card-content>`, and `<mds-card-footer>` as direct children. Each compound child self-assigns to its slot - no explicit `slot` attribute needed.\n\n```html\n<mds-card>\n <mds-card-header>\n <mds-text typography=\"h6\">Titolo della scheda</mds-text>\n </mds-card-header>\n <mds-card-media>\n <mds-img src=\"/immagini/copertina.jpg\" class=\"object-cover\"></mds-img>\n </mds-card-media>\n <mds-card-content>\n <mds-text>\n Descrizione dettagliata del contenuto della scheda.\n </mds-text>\n </mds-card-content>\n <mds-card-footer>\n <mds-button variant=\"dark\" tone=\"text\" label=\"Annulla\"></mds-button>\n <mds-button variant=\"primary\" tone=\"strong\" label=\"Conferma\"></mds-button>\n </mds-card-footer>\n</mds-card>\n```\n\n#### Header + Content (No Media)\n\nOmit the regions you do not need - the card detects which regions are present and adapts its grid layout accordingly. A header-and-content-only card stays single-column.\n\n```html\n<mds-card>\n <mds-card-header>\n <mds-text typography=\"h6\">Riepilogo ordine</mds-text>\n </mds-card-header>\n <mds-card-content>\n <mds-text>\n Il tuo ordine e' stato elaborato correttamente.\n </mds-text>\n </mds-card-content>\n</mds-card>\n```\n\n#### Media + Content + Footer (No Header)\n\nOmitting the header region shifts media to the top and content immediately below. Useful for image-led catalog cards.\n\n```html\n<mds-card>\n <mds-card-media>\n <mds-img src=\"/immagini/prodotto.jpg\" class=\"object-cover\"></mds-img>\n </mds-card-media>\n <mds-card-content>\n <mds-text>Descrizione prodotto disponibile nella gamma autunnale.</mds-text>\n </mds-card-content>\n <mds-card-footer>\n <mds-button variant=\"primary\" label=\"Aggiungi al carrello\"></mds-button>\n </mds-card-footer>\n</mds-card>\n```\n\n#### Header with Action Button via `mds-card-header`\n\n`<mds-card-header>` has a dedicated `action` slot for icon buttons placed in the trailing position. Use it instead of laying out the button manually.\n\n```html\n<mds-card>\n <mds-card-header>\n <mds-text typography=\"h6\">Profilo utente</mds-text>\n <mds-button\n slot=\"action\"\n icon=\"mi/round/more-vert\"\n aria-label=\"Altre azioni\"\n variant=\"dark\"\n tone=\"text\"\n ></mds-button>\n </mds-card-header>\n <mds-card-content>\n <mds-text>Mario Rossi - Amministratore di sistema</mds-text>\n </mds-card-content>\n</mds-card>\n```\n\n#### Media with Overlay Content via `mds-card-media`\n\n`<mds-card-media>` exposes a `content` slot that renders in front of the media element. Use it for captions, badges, or status chips overlaid on an image.\n\n```html\n<mds-card>\n <mds-card-media>\n <mds-img src=\"/immagini/evento.jpg\" class=\"object-cover\"></mds-img>\n <mds-badge slot=\"content\" variant=\"primary\" tone=\"strong\">In corso</mds-badge>\n </mds-card-media>\n <mds-card-content>\n <mds-text typography=\"h6\">Conferenza annuale 2025</mds-text>\n </mds-card-content>\n</mds-card>\n```\n\n#### Using Raw Slot Attributes Instead of Compound Children\n\nWhen the compound children (`mds-card-*`) do not fit the use case, assign the `slot` attribute directly on any element. The layout engine recognizes the same four values: `media`, `header`, `content`, and `footer`.\n\n```html\n<mds-card>\n <div slot=\"header\" class=\"flex items-center gap-400 px-400 py-400\">\n <mds-avatar initials=\"LB\"></mds-avatar>\n <mds-text typography=\"h6\">Luca Bianchi</mds-text>\n </div>\n <mds-img slot=\"media\" src=\"/immagini/lavoro.jpg\" class=\"object-cover\"></mds-img>\n <mds-text slot=\"content\" class=\"px-400\">\n Responsabile del progetto infrastrutture.\n </mds-text>\n</mds-card>\n```\n\n#### Disabling the Auto-Grid\n\nSet `disable-auto-grid` to opt out of the managed responsive grid. All four regions stack in document order and you own all layout decisions.\n\n```html\n<mds-card disable-auto-grid>\n <mds-card-header>\n <mds-text typography=\"h6\">Layout personalizzato</mds-text>\n </mds-card-header>\n <mds-card-content>\n <mds-text>Il contenuto e' disposto senza griglia automatica.</mds-text>\n </mds-card-content>\n</mds-card>\n```\n\n#### Styling Customization via CSS Custom Properties\n\nSet `--mds-card-gap` and `--mds-card-padding` on the host or a parent selector. Use Magma spacing tokens so the values remain consistent across themes.\n\n```css\n.scheda-articolo mds-card {\n --mds-card-gap: var(--spacing-200);\n --mds-card-padding: var(--spacing-400);\n}\n```\n\n#### Customizing the Layout Part\n\nThe inner grid element is exposed as `::part(layout)`. Use it only for layout-level overrides that the CSS custom properties cannot cover, such as overriding the `border-radius` of the inner container.\n\n```css\n.scheda-highlight mds-card::part(layout) {\n border-radius: var(--radius-xl);\n}\n```\n",
6295
6250
  "3. Antipattern": "Common incorrect uses of `<mds-card>`. Each entry pairs the wrong form with the right one and a one-line reason. System-wide rules (boolean-as-string, shadow piercing, Tailwind color utilities, raw native event listening) live in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md#system-level-anti-patterns) - they apply here too but are not repeated.\n\n#### Do Not Put Content Outside the Four Named Slots\n\n`<mds-card>` has no default (unnamed) slot. Loose text or elements placed without a recognized `slot` attribute - or without using an `mds-card-*` compound child - are silently ignored and never rendered.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-card>\n <p>Questo testo non verra' mai visualizzato.</p>\n <mds-button label=\"Azione\"></mds-button>\n</mds-card>\n\n<!-- ✅ CORRECT -->\n<mds-card>\n <mds-card-content>\n <mds-text>Questo testo e' correttamente posizionato nel content slot.</mds-text>\n </mds-card-content>\n <mds-card-footer>\n <mds-button label=\"Azione\" variant=\"primary\"></mds-button>\n </mds-card-footer>\n</mds-card>\n```\n\n#### Do Not Use `mds-card-*` Children Outside `<mds-card>`\n\nCompound children (`mds-card-header`, `mds-card-media`, `mds-card-content`, `mds-card-footer`) rely on `<mds-card>` for layout context. Used standalone they render without the managed grid and without the card's visual chrome.\n\n```html\n<!-- 🚫 INCORRECT -->\n<div class=\"mia-sezione\">\n <mds-card-header>\n <mds-text typography=\"h6\">Titolo standalone</mds-text>\n </mds-card-header>\n</div>\n\n<!-- ✅ CORRECT -->\n<mds-card>\n <mds-card-header>\n <mds-text typography=\"h6\">Titolo nella scheda</mds-text>\n </mds-card-header>\n</mds-card>\n```\n\n#### Do Not Pierce the Shadow DOM with Undocumented Selectors\n\nThe only supported customization surface is `--mds-card-gap`, `--mds-card-padding`, and `::part(layout)`. Targeting internal class names with `>>>`, `/deep/`, or any selector that reaches inside the shadow root couples your code to implementation details and will break on minor releases.\n\n```css\n/* 🚫 INCORRECT */\nmds-card >>> .layout {\n padding: 16px;\n}\nmds-card .layout--cfhm {\n grid-template-columns: 1fr 1fr;\n}\n\n/* ✅ CORRECT */\nmds-card {\n --mds-card-padding: var(--spacing-400);\n}\nmds-card::part(layout) {\n border-radius: var(--radius-xl);\n}\n```\n\n#### Do Not Assign an Explicit `slot` Attribute to `mds-card-*` Children\n\n`mds-card-header`, `mds-card-media`, `mds-card-content`, and `mds-card-footer` already set their own `slot` attribute on the host element from inside the component. Adding it again from the outside is redundant and may conflict with internal wiring.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-card>\n <mds-card-header slot=\"header\">...</mds-card-header>\n <mds-card-content slot=\"content\">...</mds-card-content>\n</mds-card>\n\n<!-- ✅ CORRECT -->\n<mds-card>\n <mds-card-header>...</mds-card-header>\n <mds-card-content>...</mds-card-content>\n</mds-card>\n```\n\n#### Do Not Put Media Elements Directly in the `header` Slot\n\nThe `header` slot is intended for title and action controls. Placing an `<mds-img>` or `<img>` directly there bypasses the media region's responsive two-column behavior. Use the `media` slot (or `<mds-card-media>`) for images and videos.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-card>\n <mds-card-header>\n <mds-img src=\"/immagini/banner.jpg\"></mds-img>\n </mds-card-header>\n</mds-card>\n\n<!-- ✅ CORRECT -->\n<mds-card>\n <mds-card-media>\n <mds-img src=\"/immagini/banner.jpg\" class=\"object-cover\"></mds-img>\n </mds-card-media>\n <mds-card-header>\n <mds-text typography=\"h6\">Titolo della scheda</mds-text>\n </mds-card-header>\n</mds-card>\n```\n\n#### Do Not Override Card Dimensions with Inline Styles\n\n`<mds-card>` manages its own min-height and responsive grid. Overriding `width`, `height`, or `min-height` inline breaks the container-query breakpoints and the proportional media column.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-card style=\"width: 300px; height: 200px;\">\n ...\n</mds-card>\n\n<!-- ✅ CORRECT: size the card from a parent container or CSS custom properties -->\n<div class=\"w-[300px]\">\n <mds-card>\n ...\n </mds-card>\n</div>\n```\n"
6296
6251
  },
6297
6252
  "props": [
6298
6253
  {
6299
- "name": "autoGrid",
6254
+ "name": "disableAutoGrid",
6300
6255
  "type": "boolean",
6301
6256
  "complexType": {
6302
6257
  "original": "boolean",
@@ -6304,16 +6259,16 @@
6304
6259
  "references": {}
6305
6260
  },
6306
6261
  "mutable": false,
6307
- "attr": "auto-grid",
6262
+ "attr": "disable-auto-grid",
6308
6263
  "reflectToAttr": true,
6309
- "docs": "Enables automatic responsive behavior based on container queries",
6264
+ "docs": "Disables the automatic responsive behavior based on container queries",
6310
6265
  "docsTags": [
6311
6266
  {
6312
6267
  "name": "default",
6313
- "text": "true"
6268
+ "text": "false"
6314
6269
  }
6315
6270
  ],
6316
- "default": "true",
6271
+ "default": "false",
6317
6272
  "values": [
6318
6273
  {
6319
6274
  "type": "boolean"
@@ -6382,8 +6337,8 @@
6382
6337
  }
6383
6338
  ],
6384
6339
  "usage": {
6385
- "1. Description": "The `<mds-card-content>` web component is the body region of a [`<mds-card>`](../../mds-card), grouping the primary textual or component content of a card. It is a thin layout wrapper with no HTML primitive equivalent: it exposes a single default slot and assigns itself to the parent card's `content` region automatically.\n\n#### Semantic Behavior\n\n- **Compound child only**: `<mds-card-content>` must be placed as a direct child of `<mds-card>`; it is not used standalone, and a card's content region is expected to be a dedicated `mds-card-*` child rather than mixed loose markup.\n- **Automatic slot targeting**: It lands in the parent's `content` region without the developer having to set the `slot` attribute manually.\n- **Presence affects parent layout**: The parent card adapts its responsive layout to whichever `mds-card-*` regions are present, so including or omitting the content region changes how the card arranges itself.\n- **No state, events, or ARIA**: The component declares no props or emitted events and applies no role or ARIA attributes; it is purely structural and inherits semantics from whatever is slotted into it.\n\n#### Slot semantics and layout role\n\nThis component is intentionally prop-free. Its only API is the **default slot**, which accepts text strings, HTML elements, or other components that make up the card's main content. All visual configuration (responsive behavior, grid layout) is governed by the parent `<mds-card>` through its `autoGrid` prop and the `--mds-card-gap` / `--mds-card-padding` custom properties; see the compound-component and slot rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n",
6386
- "2. Pattern": "Correct and idiomatic ways to use the `<mds-card-content>` component, ordered from most common to most specialized. Patterns assume a working knowledge of compound-component composition documented in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md) and the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n\n#### Basic Card with Content\n\nThe most common use: a card with only a content region. Place `<mds-card-content>` as a direct child of `<mds-card>` - no `slot` attribute needed, the component self-assigns to the parent's `content` region.\n\n```html\n<mds-card>\n <mds-card-content>\n <mds-text typography=\"label\">Comune di Roma</mds-text>\n <mds-text typography=\"body\">Aggiornato il 5 giugno 2026</mds-text>\n </mds-card-content>\n</mds-card>\n```\n\n#### Full Card Composition\n\nUse `<mds-card-content>` alongside [`<mds-card-header>`](../../mds-card-header), [`<mds-card-media>`](../../mds-card-media), and [`<mds-card-footer>`](../../mds-card-footer) to build a complete card. The parent arranges them in a responsive grid automatically when `auto-grid` is enabled (the default).\n\n```html\n<mds-card>\n <mds-card-media>\n <mds-img src=\"copertina.jpg\" alt=\"Immagine documento\"></mds-img>\n </mds-card-media>\n <mds-card-header label=\"Delibera n. 42\"></mds-card-header>\n <mds-card-content>\n <mds-text typography=\"body\">\n Approvazione del piano triennale delle opere pubbliche per il periodo 2026-2028.\n </mds-text>\n </mds-card-content>\n <mds-card-footer>\n <mds-button label=\"Scarica PDF\" icon=\"mi/baseline/download\" variant=\"primary\"></mds-button>\n </mds-card-footer>\n</mds-card>\n```\n\n#### Mixed Rich Content\n\nThe default slot accepts any HTML or components. Use it for structured content like lists, banners, or data visualizations that make up the card body.\n\n```html\n<mds-card>\n <mds-card-header label=\"Riepilogo pratiche\"></mds-card-header>\n <mds-card-content>\n <mds-banner variant=\"warning\" tone=\"weak\" label=\"3 pratiche in scadenza oggi\"></mds-banner>\n <mds-list>\n <mds-list-item label=\"Pratica SUAP 2026-001\"></mds-list-item>\n <mds-list-item label=\"Pratica SUAP 2026-002\"></mds-list-item>\n <mds-list-item label=\"Pratica SUAP 2026-003\"></mds-list-item>\n </mds-list>\n </mds-card-content>\n</mds-card>\n```\n\n#### Content-Only Card Without a Header\n\nOmitting sibling regions is valid. A card holding only `<mds-card-content>` renders the content at full height in the grid's single-column layout. This is common for KPI panels or compact info tiles.\n\n```html\n<mds-card>\n <mds-card-content>\n <mds-kpi>\n <mds-kpi-item label=\"Pratiche aperte\" value=\"142\" variant=\"info\"></mds-kpi-item>\n </mds-kpi>\n </mds-card-content>\n</mds-card>\n```\n\n#### Adjusting Card Spacing via Parent Custom Properties\n\n`<mds-card-content>` has no CSS custom properties of its own. Control the gap and padding of the card composition - including the content region - through the parent's `--mds-card-gap` and `--mds-card-padding` properties. Set them on the `<mds-card>` host or on a parent selector.\n\n```css\n.card-compatta mds-card {\n --mds-card-gap: var(--spacing-200);\n --mds-card-padding: var(--spacing-300);\n}\n```\n",
6340
+ "1. Description": "The `<mds-card-content>` web component is the body region of a [`<mds-card>`](../../mds-card), grouping the primary textual or component content of a card. It is a thin layout wrapper with no HTML primitive equivalent: it exposes a single default slot and assigns itself to the parent card's `content` region automatically.\n\n#### Semantic Behavior\n\n- **Compound child only**: `<mds-card-content>` must be placed as a direct child of `<mds-card>`; it is not used standalone, and a card's content region is expected to be a dedicated `mds-card-*` child rather than mixed loose markup.\n- **Automatic slot targeting**: It lands in the parent's `content` region without the developer having to set the `slot` attribute manually.\n- **Presence affects parent layout**: The parent card adapts its responsive layout to whichever `mds-card-*` regions are present, so including or omitting the content region changes how the card arranges itself.\n- **No state, events, or ARIA**: The component declares no props or emitted events and applies no role or ARIA attributes; it is purely structural and inherits semantics from whatever is slotted into it.\n\n#### Slot semantics and layout role\n\nThis component is intentionally prop-free. Its only API is the **default slot**, which accepts text strings, HTML elements, or other components that make up the card's main content. All visual configuration (responsive behavior, grid layout) is governed by the parent `<mds-card>` through its `disableAutoGrid` prop and the `--mds-card-gap` / `--mds-card-padding` custom properties; see the compound-component and slot rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n",
6341
+ "2. Pattern": "Correct and idiomatic ways to use the `<mds-card-content>` component, ordered from most common to most specialized. Patterns assume a working knowledge of compound-component composition documented in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md) and the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n\n#### Basic Card with Content\n\nThe most common use: a card with only a content region. Place `<mds-card-content>` as a direct child of `<mds-card>` - no `slot` attribute needed, the component self-assigns to the parent's `content` region.\n\n```html\n<mds-card>\n <mds-card-content>\n <mds-text typography=\"label\">Comune di Roma</mds-text>\n <mds-text typography=\"body\">Aggiornato il 5 giugno 2026</mds-text>\n </mds-card-content>\n</mds-card>\n```\n\n#### Full Card Composition\n\nUse `<mds-card-content>` alongside [`<mds-card-header>`](../../mds-card-header), [`<mds-card-media>`](../../mds-card-media), and [`<mds-card-footer>`](../../mds-card-footer) to build a complete card. The parent arranges them in a responsive grid automatically by default (unless `disable-auto-grid` is set on the parent).\n\n```html\n<mds-card>\n <mds-card-media>\n <mds-img src=\"copertina.jpg\" alt=\"Immagine documento\"></mds-img>\n </mds-card-media>\n <mds-card-header label=\"Delibera n. 42\"></mds-card-header>\n <mds-card-content>\n <mds-text typography=\"body\">\n Approvazione del piano triennale delle opere pubbliche per il periodo 2026-2028.\n </mds-text>\n </mds-card-content>\n <mds-card-footer>\n <mds-button label=\"Scarica PDF\" icon=\"mi/baseline/download\" variant=\"primary\"></mds-button>\n </mds-card-footer>\n</mds-card>\n```\n\n#### Mixed Rich Content\n\nThe default slot accepts any HTML or components. Use it for structured content like lists, banners, or data visualizations that make up the card body.\n\n```html\n<mds-card>\n <mds-card-header label=\"Riepilogo pratiche\"></mds-card-header>\n <mds-card-content>\n <mds-banner variant=\"warning\" tone=\"weak\" label=\"3 pratiche in scadenza oggi\"></mds-banner>\n <mds-list>\n <mds-list-item label=\"Pratica SUAP 2026-001\"></mds-list-item>\n <mds-list-item label=\"Pratica SUAP 2026-002\"></mds-list-item>\n <mds-list-item label=\"Pratica SUAP 2026-003\"></mds-list-item>\n </mds-list>\n </mds-card-content>\n</mds-card>\n```\n\n#### Content-Only Card Without a Header\n\nOmitting sibling regions is valid. A card holding only `<mds-card-content>` renders the content at full height in the grid's single-column layout. This is common for KPI panels or compact info tiles.\n\n```html\n<mds-card>\n <mds-card-content>\n <mds-kpi>\n <mds-kpi-item label=\"Pratiche aperte\" value=\"142\" variant=\"info\"></mds-kpi-item>\n </mds-kpi>\n </mds-card-content>\n</mds-card>\n```\n\n#### Adjusting Card Spacing via Parent Custom Properties\n\n`<mds-card-content>` has no CSS custom properties of its own. Control the gap and padding of the card composition - including the content region - through the parent's `--mds-card-gap` and `--mds-card-padding` properties. Set them on the `<mds-card>` host or on a parent selector.\n\n```css\n.card-compatta mds-card {\n --mds-card-gap: var(--spacing-200);\n --mds-card-padding: var(--spacing-300);\n}\n```\n",
6387
6342
  "3. Antipattern": "Common incorrect uses of `<mds-card-content>`. Each entry pairs the wrong form with the right one and a one-line reason. System-wide rules (boolean-as-string, shadow piercing, Tailwind color utilities, raw native event listening) live in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md#system-level-anti-patterns) - they apply here too but are not repeated.\n\n#### Do Not Use `<mds-card-content>` Outside `<mds-card>`\n\n`<mds-card-content>` is a compound child and relies on `<mds-card>`'s slot infrastructure and grid layout. Used standalone it renders with no container context and produces unpredictable visual output.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-card-content>\n <mds-text typography=\"body\">Testo senza contesto.</mds-text>\n</mds-card-content>\n\n<!-- ✅ CORRECT -->\n<mds-card>\n <mds-card-content>\n <mds-text typography=\"body\">Testo senza contesto.</mds-text>\n </mds-card-content>\n</mds-card>\n```\n\n#### Do Not Set the `slot` Attribute Manually\n\n`<mds-card-content>` self-assigns `slot=\"content\"` in its `Host` render. Adding the attribute externally is redundant and can produce a double-assignment that breaks the grid-area resolution.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-card>\n <mds-card-content slot=\"content\">\n <mds-text typography=\"body\">Intestazione sezione principale.</mds-text>\n </mds-card-content>\n</mds-card>\n\n<!-- ✅ CORRECT -->\n<mds-card>\n <mds-card-content>\n <mds-text typography=\"body\">Intestazione sezione principale.</mds-text>\n </mds-card-content>\n</mds-card>\n```\n\n#### Do Not Replace `<mds-card-content>` with a Raw `<div slot=\"content\">`\n\nA raw element placed directly in `slot=\"content\"` bypasses the card-content component's internal grid and consistent padding, producing a layout that diverges from the design system baseline and breaks on card-region composition changes.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-card>\n <div slot=\"content\" style=\"padding: 16px;\">\n <p>Descrizione pratica edilizia.</p>\n </div>\n</mds-card>\n\n<!-- ✅ CORRECT -->\n<mds-card>\n <mds-card-content>\n <mds-text typography=\"body\">Descrizione pratica edilizia.</mds-text>\n </mds-card-content>\n</mds-card>\n```\n\n#### Do Not Try to Style Spacing via `<mds-card-content>` CSS Vars\n\n`<mds-card-content>` exposes no `--mds-card-content-*` custom properties. Setting them has no effect. Spacing is controlled through `--mds-card-gap` and `--mds-card-padding` on the parent `<mds-card>`.\n\n```css\n/* 🚫 INCORRECT - has no effect */\nmds-card-content {\n --mds-card-content-padding: var(--spacing-600);\n --mds-card-content-gap: var(--spacing-400);\n}\n\n/* ✅ CORRECT - set on the parent card host */\nmds-card {\n --mds-card-gap: var(--spacing-200);\n --mds-card-padding: var(--spacing-400);\n}\n```\n\n#### Do Not Place Multiple `<mds-card-content>` Elements in One Card\n\nOnly one content region per card is supported. Multiple instances produce overlapping slot assignments and unpredictable grid output; consolidate all body content inside a single `<mds-card-content>`.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-card>\n <mds-card-content>\n <mds-text typography=\"label\">Sezione A</mds-text>\n </mds-card-content>\n <mds-card-content>\n <mds-text typography=\"label\">Sezione B</mds-text>\n </mds-card-content>\n</mds-card>\n\n<!-- ✅ CORRECT -->\n<mds-card>\n <mds-card-content>\n <mds-text typography=\"label\">Sezione A</mds-text>\n <mds-text typography=\"label\">Sezione B</mds-text>\n </mds-card-content>\n</mds-card>\n```\n"
6388
6343
  },
6389
6344
  "props": [],
@@ -6497,7 +6452,7 @@
6497
6452
  ],
6498
6453
  "usage": {
6499
6454
  "1. Description": "The `<mds-card-media>` web component is the media region of a [`<mds-card>`](../../mds-card): it wraps an image, video or other visual asset and provides an optional overlay layer for text or controls rendered on top of that asset. It is a layout child with no HTML primitive equivalent - it exists purely to occupy and style the card's `media` region.\n\n#### Semantic Behavior\n\n- **Compound child only**: `<mds-card-media>` is designed to live as a direct child of `<mds-card>` and must not be used standalone or mixed in as a different card region.\n- **Self-slotting into the parent**: It lands in the card's `media` region automatically without the author setting any `slot`, and its presence is factored into the card layout.\n- **Two-layer composition**: The default slot holds the media asset itself (recommended `mds-img` or another media component), while the named `content` slot overlays that asset, bottom-aligned and centered, so overlay text/actions float in front of the media.\n- **No interactive state**: The component holds no props, state, events, ARIA roles or focus behavior of its own - it is a passive presentational wrapper, and any semantics come from the elements slotted into it.\n\n#### Slot semantics and layout role\n\n`<mds-card-media>` exposes no configurable properties; its behavior is entirely defined by its two slots and its position inside the card.\n\n- **default slot**: the media surface. Place the actual visual asset here (an `mds-img`, video, or equivalent component). This layer fills the host.\n- **`content` slot**: an overlay layer (exposed as the `content` shadow part) positioned over the media, aligned to the bottom and horizontally centered, intended for captions, titles, or action controls that should appear in front of the media rather than beside it.\n\nThe host paints a neutral background, so the media region keeps a defined surface even before its asset loads. For the shared variant/tone system that governs the parent card, see [`projects/stencil/SPEC.md`](../../../../SPEC.md#tone-and-variant-system).\n",
6500
- "2. Pattern": "Correct and idiomatic ways to use the `<mds-card-media>` component, ordered from most common to most specialized. Patterns assume a working knowledge of the compound-component rules in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md) and the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n\n#### Basic Media Region with `mds-img`\n\nPlace `<mds-card-media>` as a direct child of `<mds-card>`. No `slot` attribute is needed - the component self-assigns into the card's `media` region. Put the visual asset in the default slot; `mds-img` is the recommended choice.\n\n```html\n<mds-card>\n <mds-card-media>\n <mds-img src=\"/img/copertina.jpg\" alt=\"Copertina articolo\"></mds-img>\n </mds-card-media>\n</mds-card>\n```\n\n#### Media with an Overlay Caption via the `content` Slot\n\nUse the named `content` slot for text or controls that should float in front of the media asset. The overlay is absolutely positioned over the media, bottom-aligned and horizontally centered.\n\n```html\n<mds-card>\n <mds-card-media>\n <mds-img src=\"/img/evento.jpg\" alt=\"Evento annuale\"></mds-img>\n <mds-text slot=\"content\" typography=\"label\">12 giugno 2026</mds-text>\n </mds-card-media>\n</mds-card>\n```\n\n#### Media with an Overlay Action Control\n\nThe `content` slot accepts any element or component. Use it to place a badge, chip, or button on top of the media when the design calls for an interactive overlay.\n\n```html\n<mds-card>\n <mds-card-media>\n <mds-img src=\"/img/prodotto.jpg\" alt=\"Scheda prodotto\"></mds-img>\n <mds-badge slot=\"content\" label=\"Novita'\" variant=\"primary\" tone=\"strong\"></mds-badge>\n </mds-card-media>\n</mds-card>\n```\n\n#### Card with All Regions Composed Together\n\n`<mds-card-media>` composes alongside `mds-card-header`, `mds-card-content`, and `mds-card-footer` inside `mds-card`. Each region self-assigns its slot; the card's `auto-grid` prop drives the responsive layout automatically.\n\n```html\n<mds-card>\n <mds-card-media>\n <mds-img src=\"/img/notizia.jpg\" alt=\"Immagine della notizia\"></mds-img>\n </mds-card-media>\n <mds-card-header label=\"Titolo della notizia\"></mds-card-header>\n <mds-card-content>\n <mds-text>Descrizione breve della notizia.</mds-text>\n </mds-card-content>\n <mds-card-footer>\n <mds-button label=\"Leggi di piu'\" variant=\"primary\" tone=\"text\"></mds-button>\n </mds-card-footer>\n</mds-card>\n```\n\n#### Video in the Default Slot\n\nThe default slot accepts any media element or component. Use a native `<video>` when the design calls for motion content rather than a still image.\n\n```html\n<mds-card>\n <mds-card-media>\n <video src=\"/media/presentazione.mp4\" autoplay muted loop playsinline></video>\n </mds-card-media>\n</mds-card>\n```\n\n#### Styling the Overlay Part via `::part(content)`\n\nThe `content` overlay div is exposed as the `content` shadow part. Use it for layout adjustments that the host's positioning rules do not cover - for example, changing alignment or adding a gradient scrim. Set the style on the host or a parent selector; do not pierce shadow DOM with `>>>` or undocumented class names.\n\n```css\n.card-destacada mds-card-media::part(content) {\n align-items: flex-start;\n background: linear-gradient(to top, rgb(var(--tone-neutral-01) / 0.7), transparent);\n padding: var(--spacing-600);\n}\n```\n",
6455
+ "2. Pattern": "Correct and idiomatic ways to use the `<mds-card-media>` component, ordered from most common to most specialized. Patterns assume a working knowledge of the compound-component rules in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md) and the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n\n#### Basic Media Region with `mds-img`\n\nPlace `<mds-card-media>` as a direct child of `<mds-card>`. No `slot` attribute is needed - the component self-assigns into the card's `media` region. Put the visual asset in the default slot; `mds-img` is the recommended choice.\n\n```html\n<mds-card>\n <mds-card-media>\n <mds-img src=\"/img/copertina.jpg\" alt=\"Copertina articolo\"></mds-img>\n </mds-card-media>\n</mds-card>\n```\n\n#### Media with an Overlay Caption via the `content` Slot\n\nUse the named `content` slot for text or controls that should float in front of the media asset. The overlay is absolutely positioned over the media, bottom-aligned and horizontally centered.\n\n```html\n<mds-card>\n <mds-card-media>\n <mds-img src=\"/img/evento.jpg\" alt=\"Evento annuale\"></mds-img>\n <mds-text slot=\"content\" typography=\"label\">12 giugno 2026</mds-text>\n </mds-card-media>\n</mds-card>\n```\n\n#### Media with an Overlay Action Control\n\nThe `content` slot accepts any element or component. Use it to place a badge, chip, or button on top of the media when the design calls for an interactive overlay.\n\n```html\n<mds-card>\n <mds-card-media>\n <mds-img src=\"/img/prodotto.jpg\" alt=\"Scheda prodotto\"></mds-img>\n <mds-badge slot=\"content\" label=\"Novita'\" variant=\"primary\" tone=\"strong\"></mds-badge>\n </mds-card-media>\n</mds-card>\n```\n\n#### Card with All Regions Composed Together\n\n`<mds-card-media>` composes alongside `mds-card-header`, `mds-card-content`, and `mds-card-footer` inside `mds-card`. Each region self-assigns its slot; the card drives the responsive layout automatically unless `disable-auto-grid` is set.\n\n```html\n<mds-card>\n <mds-card-media>\n <mds-img src=\"/img/notizia.jpg\" alt=\"Immagine della notizia\"></mds-img>\n </mds-card-media>\n <mds-card-header label=\"Titolo della notizia\"></mds-card-header>\n <mds-card-content>\n <mds-text>Descrizione breve della notizia.</mds-text>\n </mds-card-content>\n <mds-card-footer>\n <mds-button label=\"Leggi di piu'\" variant=\"primary\" tone=\"text\"></mds-button>\n </mds-card-footer>\n</mds-card>\n```\n\n#### Video in the Default Slot\n\nThe default slot accepts any media element or component. Use a native `<video>` when the design calls for motion content rather than a still image.\n\n```html\n<mds-card>\n <mds-card-media>\n <video src=\"/media/presentazione.mp4\" autoplay muted loop playsinline></video>\n </mds-card-media>\n</mds-card>\n```\n\n#### Styling the Overlay Part via `::part(content)`\n\nThe `content` overlay div is exposed as the `content` shadow part. Use it for layout adjustments that the host's positioning rules do not cover - for example, changing alignment or adding a gradient scrim. Set the style on the host or a parent selector; do not pierce shadow DOM with `>>>` or undocumented class names.\n\n```css\n.card-destacada mds-card-media::part(content) {\n align-items: flex-start;\n background: linear-gradient(to top, rgb(var(--tone-neutral-01) / 0.7), transparent);\n padding: var(--spacing-600);\n}\n```\n",
6501
6456
  "3. Antipattern": "Common incorrect uses of `<mds-card-media>`. Each entry pairs the wrong form with the right one and a one-line reason. System-wide rules (boolean-as-string, shadow piercing, Tailwind color utilities, raw native event listening) live in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md#system-level-anti-patterns) - they apply here too but are not repeated.\n\n#### Do Not Use `<mds-card-media>` Outside `<mds-card>`\n\n`<mds-card-media>` is a compound child designed to live inside `<mds-card>`. Using it standalone produces unstyled output and breaks the card layout algorithm, which derives its responsive grid from the presence of its region children.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-card-media>\n <mds-img src=\"/img/foto.jpg\" alt=\"Foto\"></mds-img>\n</mds-card-media>\n\n<!-- ✅ CORRECT -->\n<mds-card>\n <mds-card-media>\n <mds-img src=\"/img/foto.jpg\" alt=\"Foto\"></mds-img>\n </mds-card-media>\n</mds-card>\n```\n\n#### Do Not Set `slot=\"media\"` Manually\n\n`<mds-card-media>` self-assigns into the card's `media` region via its internal `Host slot=\"media\"`. Adding `slot=\"media\"` on the element is redundant and signals a misunderstanding of the component's self-slotting contract.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-card>\n <mds-card-media slot=\"media\">\n <mds-img src=\"/img/copertina.jpg\" alt=\"Copertina\"></mds-img>\n </mds-card-media>\n</mds-card>\n\n<!-- ✅ CORRECT -->\n<mds-card>\n <mds-card-media>\n <mds-img src=\"/img/copertina.jpg\" alt=\"Copertina\"></mds-img>\n </mds-card-media>\n</mds-card>\n```\n\n#### Do Not Put the Overlay Text in the Default Slot\n\nText or controls that should appear in front of the media must go in the `content` named slot. Content placed in the default slot renders behind or beside the media asset, not as an overlay.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-card>\n <mds-card-media>\n <mds-img src=\"/img/foto.jpg\" alt=\"Foto\"></mds-img>\n <mds-text>Didascalia</mds-text>\n </mds-card-media>\n</mds-card>\n\n<!-- ✅ CORRECT -->\n<mds-card>\n <mds-card-media>\n <mds-img src=\"/img/foto.jpg\" alt=\"Foto\"></mds-img>\n <mds-text slot=\"content\">Didascalia</mds-text>\n </mds-card-media>\n</mds-card>\n```\n\n#### Do Not Place `<mds-card-media>` Inside a Wrapper Element\n\n`mds-card` reads its direct children to compute the layout grid. Wrapping `<mds-card-media>` in a `<div>` or any other element hides it from that detection pass and breaks the responsive layout.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-card>\n <div class=\"media-wrapper\">\n <mds-card-media>\n <mds-img src=\"/img/foto.jpg\" alt=\"Foto\"></mds-img>\n </mds-card-media>\n </div>\n</mds-card>\n\n<!-- ✅ CORRECT -->\n<mds-card>\n <mds-card-media>\n <mds-img src=\"/img/foto.jpg\" alt=\"Foto\"></mds-img>\n </mds-card-media>\n</mds-card>\n```\n\n#### Do Not Use a Raw `<img>` Instead of `<mds-img>`\n\nPlacing a raw `<img>` in the default slot works visually but bypasses the lazy loading, error state, consumption-preference handling, and accessible-name fallback that `mds-img` provides.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-card>\n <mds-card-media>\n <img src=\"/img/prodotto.jpg\" alt=\"Prodotto\">\n </mds-card-media>\n</mds-card>\n\n<!-- ✅ CORRECT -->\n<mds-card>\n <mds-card-media>\n <mds-img src=\"/img/prodotto.jpg\" alt=\"Prodotto\"></mds-img>\n </mds-card-media>\n</mds-card>\n```\n\n#### Do Not Pierce Shadow DOM to Style the Overlay Container\n\nThe `content` div inside the shadow root is exposed as the `content` shadow part. Use `::part(content)` for style overrides, not `>>>`, `/deep/`, or internal class selectors - the latter couple your code to the implementation and break on minor releases.\n\n```css\n/* 🚫 INCORRECT */\nmds-card-media >>> .content {\n align-items: flex-start;\n}\n\n/* ✅ CORRECT */\nmds-card-media::part(content) {\n align-items: flex-start;\n}\n```\n"
6502
6457
  },
6503
6458
  "props": [],
@@ -7212,62 +7167,94 @@
7212
7167
  }
7213
7168
  ],
7214
7169
  "usage": {
7215
- "1. Description": "The `<mds-dropdown>` web component is a floating overlay surface of the Magma Design System that anchors arbitrary slotted content next to an external trigger element. It has no built-in trigger of its own: it attaches to a separate caller resolved via `target` and positions, flips and shifts itself around that element.\n\n#### Semantic Behavior\n\n- **Caller binding**: The dropdown does not render a trigger; it resolves its caller from the `target` selector and wires the chosen interaction onto that external element. Changing `target` re-binds the caller.\n- **Visibility is the single source of truth**: The `visible` prop drives the whole lifecycle - it positions the floating element, optionally shows the backdrop, and emits the events; setting it back to `false` dismisses it.\n- **Outside-click dismissal**: While open, clicking outside both the host and the caller closes the dropdown.\n- **Escape to close**: Pressing Escape hides the dropdown.\n- **Backdrop**: When `backdrop` is set, a backdrop is shown while the dropdown is visible and removed on close.\n- **Emitted events**: `mdsDropdownChange` fires on every visibility transition; `mdsDropdownVisible` and `mdsDropdownHide` fire on open and close respectively. Each detail carries the resolved `caller` and the current `visible` state.\n- **Default slot is the panel content**: Anything in the default slot (text, HTML, or other components) is the surface shown when the dropdown is triggered.\n\n#### Properties & Visual Configurations\n\n- **`interaction`** decides how the caller opens the panel: `'click'` toggles on caller click (with outside-click and Escape dismissal), `'mouseover'` opens on hover and closes on mouse leave, and `'none'` disables all automatic wiring so visibility is controlled programmatically through `visible`.\n- **`target`** (required) is the CSS selector of the external element the dropdown attaches to and positions against.\n\n#### Other behavioral props\n\n- **`placement`** sets the preferred side relative to the caller; **`autoPlacement`** chooses the best side automatically, **`flip`** allows falling back to the opposite side when space runs out, and **`shift`** / **`shiftPadding`** keep the panel inside the viewport with a safe margin.\n- **`offset`** controls the gap between the panel and the caller; **`arrow`** toggles the pointer toward the caller and **`arrowPadding`** insets it from the panel edges.\n- **`smooth`** keeps the panel tracking the caller as the page scrolls; **`strategy`** chooses the CSS positioning mode (`'absolute'` vs `'fixed'`) and **`zIndex`** sets the stacking order.\n",
7216
- "2. Pattern": "Correct and idiomatic ways to use the `<mds-dropdown>` component, ordered from most common to most specialized. Patterns assume a working knowledge of the conventions documented in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md) and the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n\n#### Basic Dropdown Menu\n\nThe minimal required setup: a trigger element with a unique `id` and a `<mds-dropdown>` with `target` pointing at it. The dropdown binds to the caller on `click` by default and dismisses on outside-click or Escape.\n\n```html\n<mds-button id=\"menu-utente\" label=\"Profilo\" icon=\"mi/baseline/account-circle\" variant=\"secondary\" tone=\"weak\"></mds-button>\n\n<mds-dropdown target=\"#menu-utente\">\n <mds-button icon=\"mi/baseline/settings\" variant=\"dark\" tone=\"text\" label=\"Impostazioni account\"></mds-button>\n <mds-button icon=\"mi/baseline/logout\" variant=\"error\" tone=\"text\" label=\"Esci\"></mds-button>\n</mds-dropdown>\n```\n\n#### Dropdown with Arrow Pointer\n\n`arrow` is `true` by default. Use it to visually connect the panel to its caller. Adjust `arrow-padding` when the panel is narrow and the arrow would clip the rounded corners.\n\n```html\n<mds-button id=\"aiuto-contestuale\" label=\"Aiuto\" icon=\"mi/baseline/help-outline\" variant=\"secondary\" tone=\"outline\"></mds-button>\n\n<mds-dropdown target=\"#aiuto-contestuale\" arrow arrow-padding=\"16\">\n <mds-text typography=\"h6\">Come funziona?</mds-text>\n <mds-text typography=\"detail\">Seleziona un campo per vedere la guida contestuale.</mds-text>\n</mds-dropdown>\n```\n\n#### Dropdown with Backdrop\n\nUse `backdrop` to dim the rest of the page while the panel is open. This is appropriate for panels with a higher modal weight, such as user-account menus or multi-step pickers.\n\n```html\n<mds-button id=\"selezione-filtri\" label=\"Filtra risultati\" icon=\"mi/baseline/filter-list\" variant=\"primary\"></mds-button>\n\n<mds-dropdown target=\"#selezione-filtri\" backdrop>\n <mds-text typography=\"h6\">Filtra per categoria</mds-text>\n <mds-filter>\n <mds-filter-item label=\"Documenti\"></mds-filter-item>\n <mds-filter-item label=\"Immagini\"></mds-filter-item>\n <mds-filter-item label=\"Video\"></mds-filter-item>\n </mds-filter>\n</mds-dropdown>\n```\n\n#### Mouseover Interaction\n\nSet `interaction=\"mouseover\"` for navigation mega-menus or info tooltips that should open on hover. The component adds a configurable delay (default 0.5 s, controlled by `--mds-dropdown-mouseover-delay`) before opening and closing.\n\n```html\n<mds-button id=\"info-progetto\" label=\"Dettagli progetto\" variant=\"dark\" tone=\"text\"></mds-button>\n\n<mds-dropdown target=\"#info-progetto\" interaction=\"mouseover\">\n <mds-entity icon=\"mi/baseline/folder\">\n <mds-text>Progetto Alfa - In corso</mds-text>\n </mds-entity>\n</mds-dropdown>\n```\n\n#### Programmatic Control via `visible`\n\nSet `interaction=\"none\"` to disable automatic wiring and drive visibility yourself. This is useful when the trigger logic lives in app code - for example, opening on a keyboard shortcut or a programmatic state change.\n\n```html\n<mds-button id=\"apri-manuale\" label=\"Apri pannello\" variant=\"secondary\"></mds-button>\n\n<mds-dropdown id=\"pannello-opzioni\" target=\"#apri-manuale\" interaction=\"none\">\n <mds-text typography=\"detail\">Pannello gestito dal codice applicativo.</mds-text>\n</mds-dropdown>\n\n<script>\n const dropdown = document.querySelector('#pannello-opzioni');\n document.querySelector('#apri-manuale').addEventListener('click', () => {\n dropdown.visible = !dropdown.visible;\n });\n</script>\n```\n\n#### Placement and Auto-Placement\n\nUse `placement` to anchor the panel to a specific side of the caller. Enable `auto-placement` to let the component choose the best available side automatically based on viewport space.\n\n```html\n<!-- Explicit right-start placement -->\n<mds-button id=\"azioni-riga\" label=\"Azioni\" icon=\"mi/baseline/more-vert\" variant=\"dark\" tone=\"text\"></mds-button>\n\n<mds-dropdown target=\"#azioni-riga\" placement=\"right-start\">\n <mds-button icon=\"mi/baseline/edit\" variant=\"dark\" tone=\"text\" label=\"Modifica\"></mds-button>\n <mds-button icon=\"mi/baseline/delete\" variant=\"error\" tone=\"text\" label=\"Elimina\"></mds-button>\n</mds-dropdown>\n\n<!-- Auto-placement for constrained viewports -->\n<mds-button id=\"opzioni-voce\" label=\"Opzioni\" variant=\"secondary\" tone=\"weak\"></mds-button>\n<mds-dropdown target=\"#opzioni-voce\" auto-placement>\n <mds-button label=\"Duplica\" icon=\"mi/baseline/content-copy\" variant=\"dark\" tone=\"text\"></mds-button>\n</mds-dropdown>\n```\n\n#### Flip and Shift for Viewport Safety\n\nEnable `flip` to let the panel jump to the opposite side when there is not enough space in the preferred direction. Enable `shift` (on by default) together with `shift-padding` to keep the panel inside the viewport when near an edge.\n\n```html\n<mds-button id=\"btn-edge\" label=\"Vicino al bordo\" variant=\"primary\"></mds-button>\n\n<mds-dropdown target=\"#btn-edge\" placement=\"top\" flip shift shift-padding=\"16\">\n <mds-text typography=\"detail\">Questo pannello si sposta automaticamente se manca spazio.</mds-text>\n</mds-dropdown>\n```\n\n#### Listening to Visibility Events\n\nListen for `mdsDropdownVisible`, `mdsDropdownHide`, or `mdsDropdownChange` to react to open/close transitions. Each event detail contains `caller` (the resolved trigger element) and `visible` (the new state).\n\n```html\n<mds-button id=\"btn-notifica\" label=\"Notifiche\" icon=\"mi/baseline/notifications\" variant=\"secondary\"></mds-button>\n\n<mds-dropdown id=\"pannello-notifiche\" target=\"#btn-notifica\">\n <mds-text typography=\"detail\">Nessuna nuova notifica.</mds-text>\n</mds-dropdown>\n\n<script>\n document.querySelector('#pannello-notifiche').addEventListener('mdsDropdownVisible', (e) => {\n console.log('Aperto. Trigger:', e.detail.caller);\n });\n document.querySelector('#pannello-notifiche').addEventListener('mdsDropdownHide', () => {\n console.log('Chiuso.');\n });\n</script>\n```\n\n#### Strategy `fixed` Inside Scrolling or Stacked Containers\n\nUse `strategy=\"fixed\"` when the dropdown is placed inside a scroll container, a sticky header, or a modal. With `strategy=\"absolute\"` (the default) the panel may be clipped by `overflow: hidden` ancestors.\n\n```html\n<!-- Inside a modal or a sticky nav - use fixed positioning -->\n<mds-button id=\"menu-header\" label=\"Menu\" variant=\"secondary\" tone=\"weak\"></mds-button>\n\n<mds-dropdown target=\"#menu-header\" strategy=\"fixed\">\n <mds-button label=\"Pagina principale\" icon=\"mi/baseline/home\" variant=\"dark\" tone=\"text\"></mds-button>\n <mds-button label=\"Impostazioni\" icon=\"mi/baseline/settings\" variant=\"dark\" tone=\"text\"></mds-button>\n</mds-dropdown>\n```\n\n#### DOM Placement at the Document Root\n\nPlace `<mds-dropdown>` as a direct child of `<body>` (or as close as possible to the root) when the caller lives deep inside a stacking context. Nesting the dropdown inside the same transformed or `overflow: hidden` ancestor as the caller can break positioning and backdrop rendering.\n\n```html\n<body>\n <!-- Trigger lives inside a complex layout -->\n <div class=\"app-layout\">\n <nav>\n <mds-button id=\"btn-profilo\" label=\"Profilo\" variant=\"secondary\"></mds-button>\n </nav>\n </div>\n\n <!-- Dropdown is a sibling of the layout root, not nested inside it -->\n <mds-dropdown target=\"#btn-profilo\" strategy=\"fixed\" backdrop>\n <mds-text typography=\"h6\">Mario Rossi</mds-text>\n <mds-button label=\"Esci\" icon=\"mi/baseline/logout\" variant=\"error\" tone=\"text\"></mds-button>\n </mds-dropdown>\n</body>\n```\n\n#### Styling Customization\n\nCustomize the dropdown only through its documented `--mds-dropdown-*` CSS custom properties. Use Magma color tokens via `rgb(var(--<token>))` to preserve dark-mode and high-contrast behavior.\n\n```css\n.my-context mds-dropdown {\n --mds-dropdown-background: rgb(var(--tone-neutral-09));\n --mds-dropdown-drop-shadow-color-rgb: var(--variant-primary-03);\n --mds-dropdown-duration: 0.3s;\n --mds-dropdown-mouseover-delay: 0.2s;\n --mds-dropdown-z-index: 5000;\n}\n```\n",
7170
+ "1. Description": "The `<mds-dropdown>` web component is a floating overlay surface of the Magma Design System that anchors arbitrary slotted content next to an external trigger element. It has no built-in trigger of its own: it attaches to a separate caller resolved via `target` and positions, flips and shifts itself around that element.\n\n#### Semantic Behavior\n\n- **Caller binding**: The dropdown does not render a trigger; it resolves its caller from the `target` selector and wires the chosen interaction onto that external element. Changing `target` re-binds the caller.\n- **Visibility is the single source of truth**: The `visible` prop drives the whole lifecycle - it positions the floating element, optionally shows the backdrop, and emits the events; setting it back to `false` dismisses it.\n- **Outside-click dismissal**: While open, clicking outside both the host and the caller closes the dropdown.\n- **Escape to close**: Pressing Escape hides the dropdown.\n- **Backdrop**: When `backdrop` is set, a backdrop is shown while the dropdown is visible and removed on close.\n- **Emitted events**: `mdsDropdownChange` fires on every visibility transition; `mdsDropdownVisible` and `mdsDropdownHide` fire on open and close respectively. Each detail carries the resolved `caller` and the current `visible` state.\n- **Default slot is the panel content**: Anything in the default slot (text, HTML, or other components) is the surface shown when the dropdown is triggered.\n\n#### Properties & Visual Configurations\n\n- **`interaction`** decides how the caller opens the panel: `'click'` toggles on caller click (with outside-click and Escape dismissal), `'mouseover'` opens on hover and closes on mouse leave, and `'none'` disables all automatic wiring so visibility is controlled programmatically through `visible`.\n- **`target`** (required) is the CSS selector of the external element the dropdown attaches to and positions against.\n\n#### Other behavioral props\n\n- **`placement`** sets the preferred side relative to the caller; the best side is chosen automatically by default (**`disableAutoPlacement`** opts out and pins to `placement`), **`flip`** allows falling back to the opposite side when space runs out, and the panel is shifted to stay inside the viewport with a safe margin by default — **`disableShift`** opts out of this and **`shiftPadding`** tunes the margin.\n- **`offset`** controls the gap between the panel and the caller; the pointer toward the caller is shown by default (**`hideArrow`** removes it) and **`arrowPadding`** insets it from the panel edges.\n- the panel tracks the caller smoothly as the page scrolls by default (**`disableSmooth`** opts out); **`strategy`** chooses the CSS positioning mode (`'absolute'` vs `'fixed'`) and **`zIndex`** sets the stacking order.\n",
7171
+ "2. Pattern": "Correct and idiomatic ways to use the `<mds-dropdown>` component, ordered from most common to most specialized. Patterns assume a working knowledge of the conventions documented in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md) and the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n\n#### Basic Dropdown Menu\n\nThe minimal required setup: a trigger element with a unique `id` and a `<mds-dropdown>` with `target` pointing at it. The dropdown binds to the caller on `click` by default and dismisses on outside-click or Escape.\n\n```html\n<mds-button id=\"menu-utente\" label=\"Profilo\" icon=\"mi/baseline/account-circle\" variant=\"secondary\" tone=\"weak\"></mds-button>\n\n<mds-dropdown target=\"#menu-utente\">\n <mds-button icon=\"mi/baseline/settings\" variant=\"dark\" tone=\"text\" label=\"Impostazioni account\"></mds-button>\n <mds-button icon=\"mi/baseline/logout\" variant=\"error\" tone=\"text\" label=\"Esci\"></mds-button>\n</mds-dropdown>\n```\n\n#### Dropdown with Arrow Pointer\n\nThe arrow pointer is shown by default to visually connect the panel to its caller; add `hide-arrow` to remove it. Adjust `arrow-padding` when the panel is narrow and the arrow would clip the rounded corners.\n\n```html\n<mds-button id=\"aiuto-contestuale\" label=\"Aiuto\" icon=\"mi/baseline/help-outline\" variant=\"secondary\" tone=\"outline\"></mds-button>\n\n<mds-dropdown target=\"#aiuto-contestuale\" arrow-padding=\"16\">\n <mds-text typography=\"h6\">Come funziona?</mds-text>\n <mds-text typography=\"detail\">Seleziona un campo per vedere la guida contestuale.</mds-text>\n</mds-dropdown>\n```\n\n#### Dropdown with Backdrop\n\nUse `backdrop` to dim the rest of the page while the panel is open. This is appropriate for panels with a higher modal weight, such as user-account menus or multi-step pickers.\n\n```html\n<mds-button id=\"selezione-filtri\" label=\"Filtra risultati\" icon=\"mi/baseline/filter-list\" variant=\"primary\"></mds-button>\n\n<mds-dropdown target=\"#selezione-filtri\" backdrop>\n <mds-text typography=\"h6\">Filtra per categoria</mds-text>\n <mds-filter>\n <mds-filter-item label=\"Documenti\"></mds-filter-item>\n <mds-filter-item label=\"Immagini\"></mds-filter-item>\n <mds-filter-item label=\"Video\"></mds-filter-item>\n </mds-filter>\n</mds-dropdown>\n```\n\n#### Mouseover Interaction\n\nSet `interaction=\"mouseover\"` for navigation mega-menus or info tooltips that should open on hover. The component adds a configurable delay (default 0.5 s, controlled by `--mds-dropdown-mouseover-delay`) before opening and closing.\n\n```html\n<mds-button id=\"info-progetto\" label=\"Dettagli progetto\" variant=\"dark\" tone=\"text\"></mds-button>\n\n<mds-dropdown target=\"#info-progetto\" interaction=\"mouseover\">\n <mds-entity icon=\"mi/baseline/folder\">\n <mds-text>Progetto Alfa - In corso</mds-text>\n </mds-entity>\n</mds-dropdown>\n```\n\n#### Programmatic Control via `visible`\n\nSet `interaction=\"none\"` to disable automatic wiring and drive visibility yourself. This is useful when the trigger logic lives in app code - for example, opening on a keyboard shortcut or a programmatic state change.\n\n```html\n<mds-button id=\"apri-manuale\" label=\"Apri pannello\" variant=\"secondary\"></mds-button>\n\n<mds-dropdown id=\"pannello-opzioni\" target=\"#apri-manuale\" interaction=\"none\">\n <mds-text typography=\"detail\">Pannello gestito dal codice applicativo.</mds-text>\n</mds-dropdown>\n\n<script>\n const dropdown = document.querySelector('#pannello-opzioni');\n document.querySelector('#apri-manuale').addEventListener('click', () => {\n dropdown.visible = !dropdown.visible;\n });\n</script>\n```\n\n#### Placement and Auto-Placement\n\nUse `placement` to anchor the panel to a specific side of the caller. Auto-placement is on by default, letting the component choose the best available side based on viewport space; add `disable-auto-placement` to pin the panel strictly to `placement`.\n\n```html\n<!-- Pinned right-start placement (auto-placement disabled) -->\n<mds-button id=\"azioni-riga\" label=\"Azioni\" icon=\"mi/baseline/more-vert\" variant=\"dark\" tone=\"text\"></mds-button>\n\n<mds-dropdown target=\"#azioni-riga\" placement=\"right-start\" disable-auto-placement>\n <mds-button icon=\"mi/baseline/edit\" variant=\"dark\" tone=\"text\" label=\"Modifica\"></mds-button>\n <mds-button icon=\"mi/baseline/delete\" variant=\"error\" tone=\"text\" label=\"Elimina\"></mds-button>\n</mds-dropdown>\n\n<!-- Auto-placement (default) for constrained viewports -->\n<mds-button id=\"opzioni-voce\" label=\"Opzioni\" variant=\"secondary\" tone=\"weak\"></mds-button>\n<mds-dropdown target=\"#opzioni-voce\">\n <mds-button label=\"Duplica\" icon=\"mi/baseline/content-copy\" variant=\"dark\" tone=\"text\"></mds-button>\n</mds-dropdown>\n```\n\n#### Flip and Shift for Viewport Safety\n\nEnable `flip` to let the panel jump to the opposite side when there is not enough space in the preferred direction. Shifting the panel to keep it inside the viewport is on by default; tune the safe margin with `shift-padding` (or set `disable-shift` to opt out).\n\n```html\n<mds-button id=\"btn-edge\" label=\"Vicino al bordo\" variant=\"primary\"></mds-button>\n\n<mds-dropdown target=\"#btn-edge\" placement=\"top\" flip shift-padding=\"16\">\n <mds-text typography=\"detail\">Questo pannello si sposta automaticamente se manca spazio.</mds-text>\n</mds-dropdown>\n```\n\n#### Listening to Visibility Events\n\nListen for `mdsDropdownVisible`, `mdsDropdownHide`, or `mdsDropdownChange` to react to open/close transitions. Each event detail contains `caller` (the resolved trigger element) and `visible` (the new state).\n\n```html\n<mds-button id=\"btn-notifica\" label=\"Notifiche\" icon=\"mi/baseline/notifications\" variant=\"secondary\"></mds-button>\n\n<mds-dropdown id=\"pannello-notifiche\" target=\"#btn-notifica\">\n <mds-text typography=\"detail\">Nessuna nuova notifica.</mds-text>\n</mds-dropdown>\n\n<script>\n document.querySelector('#pannello-notifiche').addEventListener('mdsDropdownVisible', (e) => {\n console.log('Aperto. Trigger:', e.detail.caller);\n });\n document.querySelector('#pannello-notifiche').addEventListener('mdsDropdownHide', () => {\n console.log('Chiuso.');\n });\n</script>\n```\n\n#### Strategy `fixed` Inside Scrolling or Stacked Containers\n\nUse `strategy=\"fixed\"` when the dropdown is placed inside a scroll container, a sticky header, or a modal. With `strategy=\"absolute\"` (the default) the panel may be clipped by `overflow: hidden` ancestors.\n\n```html\n<!-- Inside a modal or a sticky nav - use fixed positioning -->\n<mds-button id=\"menu-header\" label=\"Menu\" variant=\"secondary\" tone=\"weak\"></mds-button>\n\n<mds-dropdown target=\"#menu-header\" strategy=\"fixed\">\n <mds-button label=\"Pagina principale\" icon=\"mi/baseline/home\" variant=\"dark\" tone=\"text\"></mds-button>\n <mds-button label=\"Impostazioni\" icon=\"mi/baseline/settings\" variant=\"dark\" tone=\"text\"></mds-button>\n</mds-dropdown>\n```\n\n#### DOM Placement at the Document Root\n\nPlace `<mds-dropdown>` as a direct child of `<body>` (or as close as possible to the root) when the caller lives deep inside a stacking context. Nesting the dropdown inside the same transformed or `overflow: hidden` ancestor as the caller can break positioning and backdrop rendering.\n\n```html\n<body>\n <!-- Trigger lives inside a complex layout -->\n <div class=\"app-layout\">\n <nav>\n <mds-button id=\"btn-profilo\" label=\"Profilo\" variant=\"secondary\"></mds-button>\n </nav>\n </div>\n\n <!-- Dropdown is a sibling of the layout root, not nested inside it -->\n <mds-dropdown target=\"#btn-profilo\" strategy=\"fixed\" backdrop>\n <mds-text typography=\"h6\">Mario Rossi</mds-text>\n <mds-button label=\"Esci\" icon=\"mi/baseline/logout\" variant=\"error\" tone=\"text\"></mds-button>\n </mds-dropdown>\n</body>\n```\n\n#### Styling Customization\n\nCustomize the dropdown only through its documented `--mds-dropdown-*` CSS custom properties. Use Magma color tokens via `rgb(var(--<token>))` to preserve dark-mode and high-contrast behavior.\n\n```css\n.my-context mds-dropdown {\n --mds-dropdown-background: rgb(var(--tone-neutral-09));\n --mds-dropdown-drop-shadow-color-rgb: var(--variant-primary-03);\n --mds-dropdown-duration: 0.3s;\n --mds-dropdown-mouseover-delay: 0.2s;\n --mds-dropdown-z-index: 5000;\n}\n```\n",
7217
7172
  "3. Antipattern": "Common incorrect uses of `<mds-dropdown>`. Each entry pairs the wrong form with the right one and a one-line reason. System-wide rules (boolean-as-string, shadow piercing, Tailwind color utilities, raw native event listening) live in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md#system-level-anti-patterns) - they apply here too but are not repeated.\n\n#### Do Not Place the Dropdown Deep Inside a Scroll or Stacking Context\n\nNesting `<mds-dropdown>` inside a transformed, sticky, or `overflow: hidden` ancestor breaks floating positioning and backdrop rendering. Place it as close to `<body>` as the page structure allows, or switch to `strategy=\"fixed\"`.\n\n```html\n<!-- 🚫 INCORRECT -->\n<div style=\"overflow: hidden; position: relative;\">\n <mds-button id=\"trigger\" label=\"Apri\" variant=\"primary\"></mds-button>\n <mds-dropdown target=\"#trigger\" backdrop>\n <mds-text>Contenuto</mds-text>\n </mds-dropdown>\n</div>\n\n<!-- ✅ CORRECT -->\n<div style=\"overflow: hidden; position: relative;\">\n <mds-button id=\"trigger\" label=\"Apri\" variant=\"primary\"></mds-button>\n</div>\n<mds-dropdown target=\"#trigger\" strategy=\"fixed\" backdrop>\n <mds-text>Contenuto</mds-text>\n</mds-dropdown>\n```\n\n#### Do Not Use `visible=\"false\"` to Close the Dropdown\n\n`visible` is a boolean prop. Setting it to the string `\"false\"` is truthy in HTML - the dropdown stays open. Remove the attribute or set the property to `false` in JavaScript to close it.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-dropdown target=\"#btn\" visible=\"false\">\n <mds-text>Contenuto</mds-text>\n</mds-dropdown>\n\n<!-- ✅ CORRECT -->\n<mds-dropdown target=\"#btn\">\n <mds-text>Contenuto</mds-text>\n</mds-dropdown>\n```\n\n```js\n// ✅ CORRECT - closing programmatically\ndocument.querySelector('mds-dropdown').visible = false;\n```\n\n#### Do Not Listen for Native `click` on the Target Instead of Dropdown Events\n\nThe dropdown manages its own interaction and emits `mdsDropdownVisible`, `mdsDropdownHide`, and `mdsDropdownChange`. Attaching a raw `click` listener to the caller can interfere with inside-click handling and may fire before the dropdown has updated its state.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-button id=\"btn-info\" label=\"Info\" variant=\"secondary\"></mds-button>\n<mds-dropdown target=\"#btn-info\">...</mds-dropdown>\n\n<script>\n // raw native event on the caller - races with dropdown internals\n document.querySelector('#btn-info').addEventListener('click', () => {\n console.log('cliccato');\n });\n</script>\n\n<!-- ✅ CORRECT -->\n<mds-button id=\"btn-info\" label=\"Info\" variant=\"secondary\"></mds-button>\n<mds-dropdown id=\"dd-info\" target=\"#btn-info\">...</mds-dropdown>\n\n<script>\n document.querySelector('#dd-info').addEventListener('mdsDropdownVisible', (e) => {\n console.log('dropdown aperto', e.detail.visible);\n });\n</script>\n```\n\n#### Do Not Use `target` Without a Matching Element in the DOM\n\n`target` is resolved with `querySelector` at `componentDidLoad` time. If the selector does not match any element the dropdown has no caller and cannot position or open itself. Always verify the `id` is present in the DOM before the component loads.\n\n```html\n<!-- 🚫 INCORRECT - typo: button has id \"btn-salva\", target points to \"#salva\" -->\n<mds-button id=\"btn-salva\" label=\"Salva\" variant=\"primary\"></mds-button>\n<mds-dropdown target=\"#salva\">\n <mds-text>Opzioni di salvataggio</mds-text>\n</mds-dropdown>\n\n<!-- ✅ CORRECT -->\n<mds-button id=\"btn-salva\" label=\"Salva\" variant=\"primary\"></mds-button>\n<mds-dropdown target=\"#btn-salva\">\n <mds-text>Opzioni di salvataggio</mds-text>\n</mds-dropdown>\n```\n\n#### Do Not Use `<mds-button-dropdown>` and `<mds-dropdown>` Interchangeably\n\n[`mds-button-dropdown`](../../mds-button-dropdown) is a compound component that already embeds a trigger button and a dropdown. Use it for a simple action-button-plus-menu. Use `<mds-dropdown>` directly only when the caller is not an `mds-button`, or when you need full control over the trigger element.\n\n```html\n<!-- 🚫 INCORRECT - re-implementing what mds-button-dropdown already does -->\n<mds-button id=\"btn-azioni\" label=\"Azioni\" icon=\"mi/baseline/expand-more\" variant=\"primary\"></mds-button>\n<mds-dropdown target=\"#btn-azioni\">\n <mds-button label=\"Modifica\" variant=\"dark\" tone=\"text\"></mds-button>\n <mds-button label=\"Elimina\" variant=\"error\" tone=\"text\"></mds-button>\n</mds-dropdown>\n\n<!-- ✅ CORRECT - use the dedicated compound component -->\n<mds-button-dropdown label=\"Azioni\" variant=\"primary\">\n <mds-button label=\"Modifica\" variant=\"dark\" tone=\"text\"></mds-button>\n <mds-button label=\"Elimina\" variant=\"error\" tone=\"text\"></mds-button>\n</mds-button-dropdown>\n```\n\n#### Do Not Customize via Undocumented Shadow Internals\n\nThe supported customization surface is the `--mds-dropdown-*` CSS custom properties. Targeting internal elements via `::part()` on non-documented parts, `>>>`, or class-name selectors couples your code to the Shadow DOM structure and breaks on any internal refactor.\n\n```css\n/* 🚫 INCORRECT */\nmds-dropdown::part(panel) {\n border: 2px solid red;\n}\nmds-dropdown >>> .arrow {\n display: none;\n}\n\n/* ✅ CORRECT */\nmds-dropdown {\n --mds-dropdown-background: rgb(var(--tone-neutral-08));\n --mds-dropdown-z-index: 6000;\n}\n```\n"
7218
7173
  },
7219
7174
  "props": [
7220
7175
  {
7221
- "name": "arrow",
7222
- "type": "boolean",
7176
+ "name": "arrowPadding",
7177
+ "type": "number",
7178
+ "complexType": {
7179
+ "original": "number",
7180
+ "resolved": "number",
7181
+ "references": {}
7182
+ },
7183
+ "mutable": false,
7184
+ "attr": "arrow-padding",
7185
+ "reflectToAttr": false,
7186
+ "docs": "Sets the distance between arrow and dropdown margins.",
7187
+ "docsTags": [
7188
+ {
7189
+ "name": "default",
7190
+ "text": "24"
7191
+ }
7192
+ ],
7193
+ "default": "24",
7194
+ "values": [
7195
+ {
7196
+ "type": "number"
7197
+ }
7198
+ ],
7199
+ "optional": false,
7200
+ "required": false,
7201
+ "getter": false,
7202
+ "setter": false
7203
+ },
7204
+ {
7205
+ "name": "backdrop",
7206
+ "type": "boolean | undefined",
7223
7207
  "complexType": {
7224
7208
  "original": "boolean",
7225
- "resolved": "boolean",
7209
+ "resolved": "boolean | undefined",
7226
7210
  "references": {}
7227
7211
  },
7228
7212
  "mutable": false,
7229
- "attr": "arrow",
7213
+ "attr": "backdrop",
7230
7214
  "reflectToAttr": true,
7231
- "docs": "If set, the component will have an arrow pointing to the caller.",
7215
+ "docs": "Specifies if the component has a backdrop background",
7232
7216
  "docsTags": [
7233
7217
  {
7234
7218
  "name": "default",
7235
- "text": "true"
7219
+ "text": "false"
7236
7220
  }
7237
7221
  ],
7238
- "default": "true",
7222
+ "default": "false",
7239
7223
  "values": [
7240
7224
  {
7241
7225
  "type": "boolean"
7226
+ },
7227
+ {
7228
+ "type": "undefined"
7242
7229
  }
7243
7230
  ],
7244
- "optional": false,
7231
+ "optional": true,
7245
7232
  "required": false,
7246
7233
  "getter": false,
7247
7234
  "setter": false
7248
7235
  },
7249
7236
  {
7250
- "name": "arrowPadding",
7251
- "type": "number",
7237
+ "name": "disableAutoPlacement",
7238
+ "type": "boolean",
7252
7239
  "complexType": {
7253
- "original": "number",
7254
- "resolved": "number",
7240
+ "original": "boolean",
7241
+ "resolved": "boolean",
7255
7242
  "references": {}
7256
7243
  },
7257
7244
  "mutable": false,
7258
- "attr": "arrow-padding",
7245
+ "attr": "disable-auto-placement",
7259
7246
  "reflectToAttr": false,
7260
- "docs": "Sets the distance between arrow and dropdown margins.",
7247
+ "docs": "If set, the component will not be placed automatically near it's caller.",
7261
7248
  "docsTags": [
7262
7249
  {
7263
7250
  "name": "default",
7264
- "text": "24"
7251
+ "text": "false"
7265
7252
  }
7266
7253
  ],
7267
- "default": "24",
7254
+ "default": "false",
7268
7255
  "values": [
7269
7256
  {
7270
- "type": "number"
7257
+ "type": "boolean"
7271
7258
  }
7272
7259
  ],
7273
7260
  "optional": false,
@@ -7276,7 +7263,7 @@
7276
7263
  "setter": false
7277
7264
  },
7278
7265
  {
7279
- "name": "autoPlacement",
7266
+ "name": "disableShift",
7280
7267
  "type": "boolean",
7281
7268
  "complexType": {
7282
7269
  "original": "boolean",
@@ -7284,9 +7271,9 @@
7284
7271
  "references": {}
7285
7272
  },
7286
7273
  "mutable": false,
7287
- "attr": "auto-placement",
7274
+ "attr": "disable-shift",
7288
7275
  "reflectToAttr": false,
7289
- "docs": "If set, the component will be placed automatically near it's caller.",
7276
+ "docs": "If set, the component will not be kept inside the viewport.",
7290
7277
  "docsTags": [
7291
7278
  {
7292
7279
  "name": "default",
@@ -7305,17 +7292,17 @@
7305
7292
  "setter": false
7306
7293
  },
7307
7294
  {
7308
- "name": "backdrop",
7309
- "type": "boolean | undefined",
7295
+ "name": "disableSmooth",
7296
+ "type": "boolean",
7310
7297
  "complexType": {
7311
7298
  "original": "boolean",
7312
- "resolved": "boolean | undefined",
7299
+ "resolved": "boolean",
7313
7300
  "references": {}
7314
7301
  },
7315
7302
  "mutable": false,
7316
- "attr": "backdrop",
7317
- "reflectToAttr": true,
7318
- "docs": "Specifies if the component has a backdrop background",
7303
+ "attr": "disable-smooth",
7304
+ "reflectToAttr": false,
7305
+ "docs": "If set, the component will not follow the caller smoothly when the page scrolls.",
7319
7306
  "docsTags": [
7320
7307
  {
7321
7308
  "name": "default",
@@ -7326,12 +7313,9 @@
7326
7313
  "values": [
7327
7314
  {
7328
7315
  "type": "boolean"
7329
- },
7330
- {
7331
- "type": "undefined"
7332
7316
  }
7333
7317
  ],
7334
- "optional": true,
7318
+ "optional": false,
7335
7319
  "required": false,
7336
7320
  "getter": false,
7337
7321
  "setter": false
@@ -7365,6 +7349,35 @@
7365
7349
  "getter": false,
7366
7350
  "setter": false
7367
7351
  },
7352
+ {
7353
+ "name": "hideArrow",
7354
+ "type": "boolean",
7355
+ "complexType": {
7356
+ "original": "boolean",
7357
+ "resolved": "boolean",
7358
+ "references": {}
7359
+ },
7360
+ "mutable": false,
7361
+ "attr": "hide-arrow",
7362
+ "reflectToAttr": true,
7363
+ "docs": "If set, the component will not have an arrow pointing to the caller.",
7364
+ "docsTags": [
7365
+ {
7366
+ "name": "default",
7367
+ "text": "false"
7368
+ }
7369
+ ],
7370
+ "default": "false",
7371
+ "values": [
7372
+ {
7373
+ "type": "boolean"
7374
+ }
7375
+ ],
7376
+ "optional": false,
7377
+ "required": false,
7378
+ "getter": false,
7379
+ "setter": false
7380
+ },
7368
7381
  {
7369
7382
  "name": "interaction",
7370
7383
  "type": "\"click\" | \"mouseover\" | \"none\"",
@@ -7520,35 +7533,6 @@
7520
7533
  "getter": false,
7521
7534
  "setter": false
7522
7535
  },
7523
- {
7524
- "name": "shift",
7525
- "type": "boolean",
7526
- "complexType": {
7527
- "original": "boolean",
7528
- "resolved": "boolean",
7529
- "references": {}
7530
- },
7531
- "mutable": false,
7532
- "attr": "shift",
7533
- "reflectToAttr": false,
7534
- "docs": "If set, the component will be kept inside the viewport.",
7535
- "docsTags": [
7536
- {
7537
- "name": "default",
7538
- "text": "true"
7539
- }
7540
- ],
7541
- "default": "true",
7542
- "values": [
7543
- {
7544
- "type": "boolean"
7545
- }
7546
- ],
7547
- "optional": false,
7548
- "required": false,
7549
- "getter": false,
7550
- "setter": false
7551
- },
7552
7536
  {
7553
7537
  "name": "shiftPadding",
7554
7538
  "type": "number",
@@ -7578,35 +7562,6 @@
7578
7562
  "getter": false,
7579
7563
  "setter": false
7580
7564
  },
7581
- {
7582
- "name": "smooth",
7583
- "type": "boolean",
7584
- "complexType": {
7585
- "original": "boolean",
7586
- "resolved": "boolean",
7587
- "references": {}
7588
- },
7589
- "mutable": false,
7590
- "attr": "smooth",
7591
- "reflectToAttr": false,
7592
- "docs": "If set, the component will follow the caller smoothly, visible when the page scrolls.",
7593
- "docsTags": [
7594
- {
7595
- "name": "default",
7596
- "text": "true"
7597
- }
7598
- ],
7599
- "default": "true",
7600
- "values": [
7601
- {
7602
- "type": "boolean"
7603
- }
7604
- ],
7605
- "optional": false,
7606
- "required": false,
7607
- "getter": false,
7608
- "setter": false
7609
- },
7610
7565
  {
7611
7566
  "name": "strategy",
7612
7567
  "type": "\"absolute\" | \"fixed\"",
@@ -8737,9 +8692,9 @@
8737
8692
  "docs": "This is a web-component from Maggioli Design System [Magma](https://magma.maggiolicloud.it), built with StencilJS, TypeScript, Storybook. It's based on the web-component standard and it's designed to be agnostic from the JavaScript framework you are using.",
8738
8693
  "docsTags": [],
8739
8694
  "usage": {
8740
- "1. Description": "The `<mds-file>` web component is the Magma Design System control for representing a downloadable file as a rich, clickable card. It pairs a filename with an auto-detected file-type icon, badge, and human-readable description, and tracks whether the file has already been downloaded.\n\n#### Semantic Behavior\n\n- **Clickable card**: The whole host is focusable and clicking it emits `mdsFileDownload`; the component itself does not fetch or download - the consumer wires the actual download to that event.\n- **Download event payload**: `mdsFileDownload` carries the resolved `description`, `extension`, `filename`, the host element as `target`, and the detected `type`/format.\n- **Downloaded persistence**: On click the component remembers the file as downloaded and shows a \"done\" indicator on subsequent renders; the state survives reloads.\n- **Automatic file-type recognition**: From `filename` it derives the format icon, badge variant, and default description; `suffix` overrides this detection.\n- **Localization**: Descriptions and the \"already downloaded\" tooltip are resolved against the active locale.\n\n#### Properties & Visual Configurations\n\n- **`filename`** is the primary input: it provides the displayed title and drives icon, badge, suffix, and description detection. The name and extension are rendered separately, with the extension shown only when not explicitly overridden by `suffix`.\n- **`suffix`** forces a specific file type from the supported format set when the filename's extension is missing or wrong; it bypasses automatic recognition.\n- **`description`** overrides the derived, localized file-type description when a custom label is needed.\n- **`preview`** supplies an image URL (logo or thumbnail) rendered as the preview surface instead of the generic format icon - use it when a meaningful visual of the file exists.\n- **`showDownloadedIcon`** (default `true`) toggles the persisted \"already downloaded\" indicator; set it to `false` to suppress that affordance.\n- **`format`** is normally populated by the component itself from detection rather than set by the consumer.\n",
8741
- "2. Pattern": "Correct and idiomatic ways to use the `<mds-file>` component, ordered from most common to most specialized. Patterns assume a working knowledge of the conventions documented in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md) and the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n\n#### Basic File Card\n\nThe minimal form. Pass `filename` with a real filename (including extension) and the component auto-detects the format icon, badge color, and localized description.\n\n```html\n<mds-file filename=\"relazione-annuale.pdf\"></mds-file>\n```\n\n#### Handling the Download Event\n\nThe component does not fetch or download anything by itself. Listen for `mdsFileDownload` and trigger the actual download in the event handler. The event detail carries `filename`, `extension`, `type`, `description`, and `target`.\n\n```html\n<mds-file filename=\"contratto-servizio.docx\" id=\"file-card\"></mds-file>\n\n<script>\n document.getElementById('file-card').addEventListener('mdsFileDownload', (event) => {\n const { filename, extension, type } = event.detail;\n console.log(`Download avviato: ${filename} (${type})`);\n // avvia il download effettivo dal server\n });\n</script>\n```\n\n#### Forcing a File Type with `suffix`\n\nWhen the filename lacks an extension or carries a misleading one, use `suffix` to force a specific format from the supported set.\n\n```html\n<!-- filename senza estensione - forza il riconoscimento come PDF -->\n<mds-file filename=\"documento-firmato\" suffix=\"pdf\"></mds-file>\n\n<!-- estensione sconosciuta - forzata come archivio ZIP -->\n<mds-file filename=\"backup.bkp\" suffix=\"zip\"></mds-file>\n```\n\n#### Custom Description\n\nOverride the localized auto-generated description with a specific label relevant to the document context. Use `description` when the default type label (e.g. \"Documento PDF\") is not informative enough.\n\n```html\n<mds-file\n filename=\"verbale-cda-2024.pdf\"\n description=\"Verbale approvato dal Consiglio di Amministrazione\"\n></mds-file>\n```\n\n#### Image Preview\n\nProvide `preview` with an image URL when a meaningful visual thumbnail is available - a logo, a reduced version of an image file, or a document cover. The preview replaces the generic format icon in the left panel.\n\n```html\n<mds-file\n filename=\"logo-aziendale.png\"\n preview=\"https://cdn.example.com/thumbnails/logo-aziendale-128.png\"\n></mds-file>\n```\n\n#### Hiding the \"Already Downloaded\" Indicator\n\nBy default the component persists a \"done\" indicator once the file has been downloaded. Set `show-downloaded-icon=\"false\"` to suppress it when the affordance is not appropriate for the context (e.g. a list where every file is always shown as fresh).\n\n```html\n<mds-file filename=\"modulo-richiesta.xlsx\" show-downloaded-icon=\"false\"></mds-file>\n```\n\nNote: this is the only valid way to turn the indicator off - do not set it to the string `\"false\"` (see the Antipattern file).\n\n#### Rendering a List of Files\n\nPlace multiple `<mds-file>` cards inside a container and attach a single delegated event listener when the file list is dynamic.\n\n```html\n<div class=\"file-list\">\n <mds-file filename=\"allegato-1.pdf\"></mds-file>\n <mds-file filename=\"allegato-2.docx\"></mds-file>\n <mds-file filename=\"allegato-3.xlsx\"></mds-file>\n</div>\n\n<script>\n document.querySelector('.file-list').addEventListener('mdsFileDownload', (event) => {\n const { filename } = event.detail;\n avviaDownload(filename);\n });\n</script>\n```\n\n#### Styling Customization\n\nStyle the preview panel only through the three documented `--mds-file-*` CSS custom properties. Use Magma color tokens via `rgb(var(--<token>))` so dark mode and high-contrast modes keep working.\n\n```css\n.archivio-documenti mds-file {\n --mds-file-preview-icon-color: rgb(var(--variant-primary-04));\n --mds-file-preview-icon-bacground: rgb(var(--variant-primary-10));\n --mds-file-preview-color: rgb(var(--variant-primary-04));\n}\n```\n",
8742
- "3. Antipattern": "Common incorrect uses of `<mds-file>`. Each entry pairs the wrong form with the right one and a one-line reason. System-wide rules (boolean-as-string, shadow piercing, Tailwind color utilities, raw native event listening) live in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md#system-level-anti-patterns) - they apply here too but are not repeated.\n\n#### Do Not Expect the Component to Perform the Download\n\n`<mds-file>` is a display card, not a download trigger. It emits `mdsFileDownload` and the consumer must wire the actual download logic to that event.\n\n```html\n<!-- 🚫 INCORRECT - expecting the component to handle the download itself -->\n<mds-file filename=\"report.pdf\" href=\"/files/report.pdf\"></mds-file>\n\n<!-- ✅ CORRECT - consumer listens to the event and handles the download -->\n<mds-file filename=\"report.pdf\" id=\"card-report\"></mds-file>\n\n<script>\n document.getElementById('card-report').addEventListener('mdsFileDownload', (e) => {\n window.location.href = '/files/' + e.detail.filename;\n });\n</script>\n```\n\n#### Do Not Set `show-downloaded-icon` to the String \"false\"\n\n`showDownloadedIcon` is a boolean prop. Setting the attribute to the string `\"false\"` evaluates as truthy in HTML and leaves the indicator enabled. Remove the attribute or set the prop to `false` in your framework binding.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-file filename=\"modulo.pdf\" show-downloaded-icon=\"false\"></mds-file>\n\n<!-- ✅ CORRECT (HTML attribute absent = disabled) -->\n<mds-file filename=\"modulo.pdf\"></mds-file>\n```\n\n#### Do Not Set `format` Manually\n\n`format` is an internal reflected attribute automatically derived from the filename and suffix. Setting it directly has no guaranteed effect because the component overwrites it during `componentWillLoad` and on every `filename` change. Use `suffix` to control type detection.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-file filename=\"archivio\" format=\"document\"></mds-file>\n\n<!-- ✅ CORRECT - use suffix to override file-type detection -->\n<mds-file filename=\"archivio\" suffix=\"pdf\"></mds-file>\n```\n\n#### Do Not Pierce Shadow DOM to Style the Preview Panel\n\nThe supported customization surface is `--mds-file-preview-*` CSS custom properties. Targeting internal elements with `>>>`, `/deep/`, or undocumented selectors couples your code to the Shadow DOM structure and will break on minor releases.\n\n```css\n/* 🚫 INCORRECT */\nmds-file >>> .preview {\n background-color: blue;\n}\n\n/* ✅ CORRECT */\nmds-file {\n --mds-file-preview-icon-bacground: rgb(var(--variant-primary-10));\n --mds-file-preview-icon-color: rgb(var(--variant-primary-04));\n}\n```\n\n#### Do Not Wrap `<mds-file>` in a Native Anchor or Button\n\nThe host is already focusable, keyboard-accessible, and emits its own interaction event. Wrapping it in `<a>` or `<button>` creates nested interactive controls and breaks keyboard semantics.\n\n```html\n<!-- 🚫 INCORRECT -->\n<a href=\"/download/report.pdf\">\n <mds-file filename=\"report.pdf\"></mds-file>\n</a>\n\n<!-- ✅ CORRECT - use the mdsFileDownload event to trigger navigation or download -->\n<mds-file filename=\"report.pdf\" id=\"file-report\"></mds-file>\n\n<script>\n document.getElementById('file-report').addEventListener('mdsFileDownload', () => {\n window.location.href = '/download/report.pdf';\n });\n</script>\n```\n\n#### Do Not Use a Raw `<div>` or `<li>` as a File Row When `<mds-file>` Exists\n\n`<mds-file>` handles format detection, theming, accessibility focus, download persistence, and localization. Rolling a custom file row loses all of these affordances.\n\n```html\n<!-- 🚫 INCORRECT -->\n<div class=\"file-row\" onclick=\"download('report.pdf')\">\n <img src=\"pdf-icon.svg\" alt=\"PDF\" />\n <span>report.pdf</span>\n</div>\n\n<!-- ✅ CORRECT -->\n<mds-file filename=\"report.pdf\"></mds-file>\n```\n"
8695
+ "1. Description": "The `<mds-file>` web component is the Magma Design System control for representing a downloadable file as a rich, clickable card. It pairs a filename with an auto-detected file-type icon, badge, and human-readable description, and tracks whether the file has already been downloaded.\n\n#### Semantic Behavior\n\n- **Clickable card**: The whole host is focusable and clicking it emits `mdsFileDownload`; the component itself does not fetch or download - the consumer wires the actual download to that event.\n- **Download event payload**: `mdsFileDownload` carries the resolved `description`, `extension`, `filename`, the host element as `target`, and the detected `type`/format.\n- **Downloaded persistence**: On click the component remembers the file as downloaded and shows a \"done\" indicator on subsequent renders; the state survives reloads.\n- **Automatic file-type recognition**: From `filename` it derives the format icon, badge variant, and default description; `suffix` overrides this detection.\n- **Localization**: Descriptions and the \"already downloaded\" tooltip are resolved against the active locale.\n\n#### Properties & Visual Configurations\n\n- **`filename`** is the primary input: it provides the displayed title and drives icon, badge, suffix, and description detection. The name and extension are rendered separately, with the extension shown only when not explicitly overridden by `suffix`.\n- **`suffix`** forces a specific file type from the supported format set when the filename's extension is missing or wrong; it bypasses automatic recognition.\n- **`description`** overrides the derived, localized file-type description when a custom label is needed.\n- **`preview`** supplies an image URL (logo or thumbnail) rendered as the preview surface instead of the generic format icon - use it when a meaningful visual of the file exists.\n- **`hideDownloadedIcon`** (default `false`) suppresses the persisted \"already downloaded\" indicator; set it when that affordance is not appropriate.\n- **`format`** is normally populated by the component itself from detection rather than set by the consumer.\n",
8696
+ "2. Pattern": "Correct and idiomatic ways to use the `<mds-file>` component, ordered from most common to most specialized. Patterns assume a working knowledge of the conventions documented in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md) and the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n\n#### Basic File Card\n\nThe minimal form. Pass `filename` with a real filename (including extension) and the component auto-detects the format icon, badge color, and localized description.\n\n```html\n<mds-file filename=\"relazione-annuale.pdf\"></mds-file>\n```\n\n#### Handling the Download Event\n\nThe component does not fetch or download anything by itself. Listen for `mdsFileDownload` and trigger the actual download in the event handler. The event detail carries `filename`, `extension`, `type`, `description`, and `target`.\n\n```html\n<mds-file filename=\"contratto-servizio.docx\" id=\"file-card\"></mds-file>\n\n<script>\n document.getElementById('file-card').addEventListener('mdsFileDownload', (event) => {\n const { filename, extension, type } = event.detail;\n console.log(`Download avviato: ${filename} (${type})`);\n // avvia il download effettivo dal server\n });\n</script>\n```\n\n#### Forcing a File Type with `suffix`\n\nWhen the filename lacks an extension or carries a misleading one, use `suffix` to force a specific format from the supported set.\n\n```html\n<!-- filename senza estensione - forza il riconoscimento come PDF -->\n<mds-file filename=\"documento-firmato\" suffix=\"pdf\"></mds-file>\n\n<!-- estensione sconosciuta - forzata come archivio ZIP -->\n<mds-file filename=\"backup.bkp\" suffix=\"zip\"></mds-file>\n```\n\n#### Custom Description\n\nOverride the localized auto-generated description with a specific label relevant to the document context. Use `description` when the default type label (e.g. \"Documento PDF\") is not informative enough.\n\n```html\n<mds-file\n filename=\"verbale-cda-2024.pdf\"\n description=\"Verbale approvato dal Consiglio di Amministrazione\"\n></mds-file>\n```\n\n#### Image Preview\n\nProvide `preview` with an image URL when a meaningful visual thumbnail is available - a logo, a reduced version of an image file, or a document cover. The preview replaces the generic format icon in the left panel.\n\n```html\n<mds-file\n filename=\"logo-aziendale.png\"\n preview=\"https://cdn.example.com/thumbnails/logo-aziendale-128.png\"\n></mds-file>\n```\n\n#### Hiding the \"Already Downloaded\" Indicator\n\nBy default the component persists a \"done\" indicator once the file has been downloaded. Add `hide-downloaded-icon` to suppress it when the affordance is not appropriate for the context (e.g. a list where every file is always shown as fresh).\n\n```html\n<mds-file filename=\"modulo-richiesta.xlsx\" hide-downloaded-icon></mds-file>\n```\n\nNote: this is the only valid way to turn the indicator off - do not set it to the string `\"false\"` (see the Antipattern file).\n\n#### Rendering a List of Files\n\nPlace multiple `<mds-file>` cards inside a container and attach a single delegated event listener when the file list is dynamic.\n\n```html\n<div class=\"file-list\">\n <mds-file filename=\"allegato-1.pdf\"></mds-file>\n <mds-file filename=\"allegato-2.docx\"></mds-file>\n <mds-file filename=\"allegato-3.xlsx\"></mds-file>\n</div>\n\n<script>\n document.querySelector('.file-list').addEventListener('mdsFileDownload', (event) => {\n const { filename } = event.detail;\n avviaDownload(filename);\n });\n</script>\n```\n\n#### Styling Customization\n\nStyle the preview panel only through the three documented `--mds-file-*` CSS custom properties. Use Magma color tokens via `rgb(var(--<token>))` so dark mode and high-contrast modes keep working.\n\n```css\n.archivio-documenti mds-file {\n --mds-file-preview-icon-color: rgb(var(--variant-primary-04));\n --mds-file-preview-icon-bacground: rgb(var(--variant-primary-10));\n --mds-file-preview-color: rgb(var(--variant-primary-04));\n}\n```\n",
8697
+ "3. Antipattern": "Common incorrect uses of `<mds-file>`. Each entry pairs the wrong form with the right one and a one-line reason. System-wide rules (boolean-as-string, shadow piercing, Tailwind color utilities, raw native event listening) live in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md#system-level-anti-patterns) - they apply here too but are not repeated.\n\n#### Do Not Expect the Component to Perform the Download\n\n`<mds-file>` is a display card, not a download trigger. It emits `mdsFileDownload` and the consumer must wire the actual download logic to that event.\n\n```html\n<!-- 🚫 INCORRECT - expecting the component to handle the download itself -->\n<mds-file filename=\"report.pdf\" href=\"/files/report.pdf\"></mds-file>\n\n<!-- ✅ CORRECT - consumer listens to the event and handles the download -->\n<mds-file filename=\"report.pdf\" id=\"card-report\"></mds-file>\n\n<script>\n document.getElementById('card-report').addEventListener('mdsFileDownload', (e) => {\n window.location.href = '/files/' + e.detail.filename;\n });\n</script>\n```\n\n#### Do Not Set `format` Manually\n\n`format` is an internal reflected attribute automatically derived from the filename and suffix. Setting it directly has no guaranteed effect because the component overwrites it during `componentWillLoad` and on every `filename` change. Use `suffix` to control type detection.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-file filename=\"archivio\" format=\"document\"></mds-file>\n\n<!-- ✅ CORRECT - use suffix to override file-type detection -->\n<mds-file filename=\"archivio\" suffix=\"pdf\"></mds-file>\n```\n\n#### Do Not Pierce Shadow DOM to Style the Preview Panel\n\nThe supported customization surface is `--mds-file-preview-*` CSS custom properties. Targeting internal elements with `>>>`, `/deep/`, or undocumented selectors couples your code to the Shadow DOM structure and will break on minor releases.\n\n```css\n/* 🚫 INCORRECT */\nmds-file >>> .preview {\n background-color: blue;\n}\n\n/* ✅ CORRECT */\nmds-file {\n --mds-file-preview-icon-bacground: rgb(var(--variant-primary-10));\n --mds-file-preview-icon-color: rgb(var(--variant-primary-04));\n}\n```\n\n#### Do Not Wrap `<mds-file>` in a Native Anchor or Button\n\nThe host is already focusable, keyboard-accessible, and emits its own interaction event. Wrapping it in `<a>` or `<button>` creates nested interactive controls and breaks keyboard semantics.\n\n```html\n<!-- 🚫 INCORRECT -->\n<a href=\"/download/report.pdf\">\n <mds-file filename=\"report.pdf\"></mds-file>\n</a>\n\n<!-- ✅ CORRECT - use the mdsFileDownload event to trigger navigation or download -->\n<mds-file filename=\"report.pdf\" id=\"file-report\"></mds-file>\n\n<script>\n document.getElementById('file-report').addEventListener('mdsFileDownload', () => {\n window.location.href = '/download/report.pdf';\n });\n</script>\n```\n\n#### Do Not Use a Raw `<div>` or `<li>` as a File Row When `<mds-file>` Exists\n\n`<mds-file>` handles format detection, theming, accessibility focus, download persistence, and localization. Rolling a custom file row loses all of these affordances.\n\n```html\n<!-- 🚫 INCORRECT -->\n<div class=\"file-row\" onclick=\"download('report.pdf')\">\n <img src=\"pdf-icon.svg\" alt=\"PDF\" />\n <span>report.pdf</span>\n</div>\n\n<!-- ✅ CORRECT -->\n<mds-file filename=\"report.pdf\"></mds-file>\n```\n"
8743
8698
  },
8744
8699
  "props": [
8745
8700
  {
@@ -8817,6 +8772,38 @@
8817
8772
  "getter": false,
8818
8773
  "setter": false
8819
8774
  },
8775
+ {
8776
+ "name": "hideDownloadedIcon",
8777
+ "type": "boolean | undefined",
8778
+ "complexType": {
8779
+ "original": "boolean",
8780
+ "resolved": "boolean | undefined",
8781
+ "references": {}
8782
+ },
8783
+ "mutable": false,
8784
+ "attr": "hide-downloaded-icon",
8785
+ "reflectToAttr": false,
8786
+ "docs": "Hides the download icon",
8787
+ "docsTags": [
8788
+ {
8789
+ "name": "default",
8790
+ "text": "false"
8791
+ }
8792
+ ],
8793
+ "default": "false",
8794
+ "values": [
8795
+ {
8796
+ "type": "boolean"
8797
+ },
8798
+ {
8799
+ "type": "undefined"
8800
+ }
8801
+ ],
8802
+ "optional": true,
8803
+ "required": false,
8804
+ "getter": false,
8805
+ "setter": false
8806
+ },
8820
8807
  {
8821
8808
  "name": "preview",
8822
8809
  "type": "string | undefined",
@@ -8843,38 +8830,6 @@
8843
8830
  "getter": false,
8844
8831
  "setter": false
8845
8832
  },
8846
- {
8847
- "name": "showDownloadedIcon",
8848
- "type": "boolean | undefined",
8849
- "complexType": {
8850
- "original": "boolean",
8851
- "resolved": "boolean | undefined",
8852
- "references": {}
8853
- },
8854
- "mutable": false,
8855
- "attr": "show-downloaded-icon",
8856
- "reflectToAttr": false,
8857
- "docs": "Sets if the download icon must be shown or not",
8858
- "docsTags": [
8859
- {
8860
- "name": "default",
8861
- "text": "true"
8862
- }
8863
- ],
8864
- "default": "true",
8865
- "values": [
8866
- {
8867
- "type": "boolean"
8868
- },
8869
- {
8870
- "type": "undefined"
8871
- }
8872
- ],
8873
- "optional": true,
8874
- "required": false,
8875
- "getter": false,
8876
- "setter": false
8877
- },
8878
8833
  {
8879
8834
  "name": "suffix",
8880
8835
  "type": "\"7z\" | \"ace\" | \"ai\" | \"db\" | \"default\" | \"dmg\" | \"doc\" | \"docm\" | \"docx\" | \"eml\" | \"eps\" | \"exe\" | \"flac\" | \"gif\" | \"heic\" | \"htm\" | \"html\" | \"jpe\" | \"jpeg\" | \"jpg\" | \"js\" | \"json\" | \"jsx\" | \"m2v\" | \"mp2\" | \"mp3\" | \"mp4\" | \"mp4v\" | \"mpeg\" | \"mpg\" | \"mpg4\" | \"mpga\" | \"odf\" | \"odp\" | \"ods\" | \"odt\" | \"ole\" | \"p7m\" | \"pdf\" | \"php\" | \"png\" | \"ppt\" | \"rar\" | \"rtf\" | \"sass\" | \"shtml\" | \"svg\" | \"tar\" | \"tiff\" | \"ts\" | \"tsd\" | \"txt\" | \"wav\" | \"webp\" | \"xar\" | \"xls\" | \"xlsx\" | \"xml\" | \"zip\" | undefined",
@@ -10503,9 +10458,9 @@
10503
10458
  }
10504
10459
  ],
10505
10460
  "usage": {
10506
- "1. Description": "The `<mds-header>` web component is the top-level page header container of the Magma Design System. It is a compound parent that wraps one or more `<mds-header-bar>` elements, orchestrating their scroll-driven appearance, auto-hide visibility, and an optional mobile menu rendered as a side modal.\n\n#### Semantic Behavior\n\n- **Compound parent**: Hosts `<mds-header-bar>` children in the default slot and relays its `menu` and `nav` settings down to the bar.\n- **Mobile menu**: A `[slot=\"menu\"]` child is rendered inside a right-positioned modal; when absent, the bar's menu mode is forced to `'none'`.\n- **Open/close control**: The menu modal is opened programmatically via the `setOpened()` method; closing it emits `mdsHeaderClose` (with the bound bar).\n- **Scroll-driven appearance**: When `appearanceSet` defines a threshold, `appearance` swaps between its initial and changed values as the page scrolls past the configured pixel threshold.\n- **Auto-hide on scroll**: When `autoHide` is set, scrolling down past that pixel offset hides the bar and scrolling up reveals it again, governed by `threshold` as the directional margin.\n- **Visibility event**: Any change to `visibility` (`'visible'`/`'hidden'`) emits `mdsHeaderVisibilityChange`.\n\n#### Properties & Visual Configurations\n\n- **`appearance`** is the bar's current visual mode (`'stripe'` or `'inline'`) and is mutable because the component rewrites it as the page scrolls.\n- **`appearanceSet`** is a space/comma-separated string declaring scroll behavior as three tokens: initial appearance, changed appearance, and the `scrollY` pixel threshold (e.g. `\"stripe, inline 200\"`). Use it instead of `appearance` when the header should transform on scroll; `appearance` alone keeps a fixed look.\n- **`autoHide`** is the pixel offset past which the bar starts hiding on downward scroll; leave it unset to keep the bar always present.\n- **`threshold`** tunes how many pixels of opposite-direction scroll are required to flip the auto-hide state - raise it to make hide/show less twitchy.\n- **`menu`** and **`nav`** select on which viewports the hamburger menu and the navigation are shown (`'all'`, `'desktop'`, `'mobile'`, `'none'`); they are relayed to the child bar.\n- **`backdrop`** toggles the blurred backdrop layer shown behind the bar when its appearance is `'inline'`.\n- **`visibility`** reflects the current shown/hidden state of the bar and can be set to force it.\n",
10507
- "2. Pattern": "Correct and idiomatic ways to use the `<mds-header>` component, ordered from most common to most specialized. Patterns assume a working knowledge of the compound-component rules in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md) and the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n\n#### Minimal Header with Navigation Bar\n\nThe default form. Place exactly one `<mds-header-bar>` in the default slot. The bar receives the `menu` and `nav` breakpoint settings from the parent automatically.\n\n```html\n<mds-header>\n <mds-header-bar>\n <mds-img class=\"w-800\" src=\"/logo.svg\" alt=\"Logo\"></mds-img>\n <mds-button slot=\"nav\" label=\"Accedi\" variant=\"dark\" tone=\"outline\"></mds-button>\n <mds-button slot=\"nav\" label=\"Registrati\" variant=\"primary\" tone=\"strong\"></mds-button>\n </mds-header-bar>\n</mds-header>\n```\n\n#### Mobile Menu via the `menu` Slot\n\nProvide a `[slot=\"menu\"]` child to enable the hamburger-triggered side modal. When this slot is filled, the mobile menu icon is shown according to the `menu` breakpoint prop; when absent, `menu` is forced to `'none'` automatically.\n\n```html\n<mds-header menu=\"mobile\">\n <mds-header-bar>\n <mds-img class=\"w-800\" src=\"/logo.svg\" alt=\"Logo\"></mds-img>\n <mds-button slot=\"nav\" label=\"Accedi\" variant=\"dark\" tone=\"outline\"></mds-button>\n </mds-header-bar>\n\n <div slot=\"menu\">\n <div class=\"p-600\">\n <mds-button label=\"Accedi\" variant=\"dark\" tone=\"outline\"></mds-button>\n <mds-button label=\"Registrati\" variant=\"primary\" tone=\"strong\"></mds-button>\n </div>\n </div>\n</mds-header>\n```\n\n#### Inline Appearance (Floating Bar)\n\nSet `appearance=\"inline\"` to detach the bar from the top edge and give it a rounded, floating look. A blurred backdrop is shown by default; set `backdrop` to `false` to remove it.\n\n```html\n<mds-header appearance=\"inline\">\n <mds-header-bar>\n <mds-img class=\"w-800\" src=\"/logo.svg\" alt=\"Logo\"></mds-img>\n <mds-button slot=\"nav\" label=\"Accedi\" variant=\"dark\" tone=\"outline\"></mds-button>\n </mds-header-bar>\n</mds-header>\n```\n\n#### Scroll-Driven Appearance Change via `appearance-set`\n\nUse `appearance-set` to declare an initial appearance, a changed appearance, and a scroll threshold in pixels. The component swaps `appearance` automatically as the page scrolls past the threshold - no JavaScript needed. Do not combine `appearance-set` with manual writes to `appearance`.\n\n```html\n<!-- Starts inline (floating), switches to stripe (full-width) after 300 px of scroll -->\n<mds-header appearance-set=\"inline, stripe 300\" appearance=\"inline\">\n <mds-header-bar>\n <mds-img class=\"w-800\" src=\"/logo.svg\" alt=\"Logo\"></mds-img>\n </mds-header-bar>\n</mds-header>\n```\n\n#### Auto-Hide on Downward Scroll\n\nSet `auto-hide` to the pixel offset at which the bar should start hiding when the user scrolls down. The bar reappears when the user scrolls back up. Use `threshold` (default `1`) to control how many pixels of reverse-scroll are required before the bar snaps back - raise it to reduce twitchiness.\n\n```html\n<mds-header auto-hide=\"300\" threshold=\"10\">\n <mds-header-bar>\n <mds-img class=\"w-800\" src=\"/logo.svg\" alt=\"Logo\"></mds-img>\n <mds-button slot=\"nav\" label=\"Accedi\" variant=\"dark\" tone=\"outline\"></mds-button>\n </mds-header-bar>\n</mds-header>\n```\n\n#### Controlling Menu and Nav Breakpoints\n\n`menu` controls on which viewports the hamburger icon is visible; `nav` controls on which viewports the inline navigation is visible. Both accept `'all'`, `'desktop'`, `'mobile'`, or `'none'`.\n\n```html\n<!-- Hamburger shown on all screen sizes; inline nav shown only on desktop -->\n<mds-header menu=\"all\" nav=\"desktop\">\n <mds-header-bar>\n <mds-img class=\"w-800\" src=\"/logo.svg\" alt=\"Logo\"></mds-img>\n <mds-button slot=\"nav\" label=\"Accedi\" variant=\"dark\" tone=\"outline\"></mds-button>\n </mds-header-bar>\n\n <div slot=\"menu\">\n <div class=\"p-600\">\n <mds-button label=\"Accedi\" variant=\"dark\" tone=\"outline\"></mds-button>\n </div>\n </div>\n</mds-header>\n```\n\n#### Reacting to Visibility Changes\n\nListen for `mdsHeaderVisibilityChange` to know when the bar is hidden or shown by auto-hide. The event detail carries a `visibility` boolean.\n\n```html\n<mds-header auto-hide=\"200\" id=\"siteHeader\">\n <mds-header-bar>\n <mds-img class=\"w-800\" src=\"/logo.svg\" alt=\"Logo\"></mds-img>\n </mds-header-bar>\n</mds-header>\n\n<script>\n document.getElementById('siteHeader').addEventListener('mdsHeaderVisibilityChange', (e) => {\n console.log('header visibile:', e.detail.visibility);\n });\n</script>\n```\n\n#### Reacting to Mobile Menu Close\n\nListen for `mdsHeaderClose` to run cleanup logic when the side modal is dismissed. The event detail carries the bound `<mds-header-bar>` reference.\n\n```html\n<mds-header id=\"siteHeader\">\n <mds-header-bar>\n <mds-img class=\"w-800\" src=\"/logo.svg\" alt=\"Logo\"></mds-img>\n </mds-header-bar>\n <div slot=\"menu\">\n <mds-button label=\"Accedi\" variant=\"dark\" tone=\"outline\"></mds-button>\n </div>\n</mds-header>\n\n<script>\n document.getElementById('siteHeader').addEventListener('mdsHeaderClose', (e) => {\n console.log('menu chiuso, bar:', e.detail.bar);\n });\n</script>\n```\n\n#### Programmatic Open/Close via `setOpened()`\n\nUse the `setOpened()` method to open or close the mobile menu from JavaScript - for example after a navigation event inside the menu panel.\n\n```html\n<mds-header id=\"siteHeader\">\n <mds-header-bar>\n <mds-img class=\"w-800\" src=\"/logo.svg\" alt=\"Logo\"></mds-img>\n </mds-header-bar>\n <div slot=\"menu\">\n <mds-button label=\"Vai alla home\" id=\"homeBtn\" variant=\"primary\" tone=\"strong\"></mds-button>\n </div>\n</mds-header>\n\n<script>\n document.getElementById('homeBtn').addEventListener('click', async () => {\n window.location.href = '/';\n await document.getElementById('siteHeader').setOpened(false);\n });\n</script>\n```\n\n#### Styling Customization\n\nCustomize the header through its documented `--mds-header-*` CSS custom properties. Use Magma color tokens via `rgb(var(--<token>))` so dark mode and high-contrast continue to work.\n\n```css\nmds-header {\n --mds-header-color: rgb(var(--tone-neutral));\n --mds-header-icon-color: rgb(var(--variant-primary-03));\n --mds-header-z-index: 200;\n}\n\n/* Inline appearance: wider floating margin on desktop */\nmds-header[appearance='inline'] {\n --mds-header-inline-margin: 2rem;\n --mds-header-backdrop-blur-strength: 4px;\n}\n```\n",
10508
- "3. Antipattern": "Common incorrect uses of `<mds-header>`. Each entry pairs the wrong form with the right one and a one-line reason. System-wide rules (boolean-as-string, shadow piercing, Tailwind color utilities, raw native event listening) live in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md#system-level-anti-patterns) - they apply here too but are not repeated.\n\n#### Do Not Place `<mds-header-bar>` Outside `<mds-header>`\n\n`<mds-header-bar>` is a compound child; it must be a direct slot child of `<mds-header>`, which relays breakpoint and appearance state down to it. Using the bar standalone breaks that communication and leaves `menu`, `nav`, and auto-hide inoperative.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-header-bar>\n <mds-img src=\"/logo.svg\" alt=\"Logo\"></mds-img>\n</mds-header-bar>\n\n<!-- ✅ CORRECT -->\n<mds-header>\n <mds-header-bar>\n <mds-img src=\"/logo.svg\" alt=\"Logo\"></mds-img>\n </mds-header-bar>\n</mds-header>\n```\n\n#### Do Not Set `backdrop=\"false\"` to Disable the Backdrop\n\n`backdrop` is a boolean prop. Setting it to the string `\"false\"` is truthy in HTML and keeps the backdrop visible. Remove the attribute entirely to disable it.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-header appearance=\"inline\" backdrop=\"false\">\n <mds-header-bar>...</mds-header-bar>\n</mds-header>\n\n<!-- ✅ CORRECT -->\n<mds-header appearance=\"inline\">\n <mds-header-bar>...</mds-header-bar>\n</mds-header>\n```\n\n#### Do Not Drive Scroll Appearance with JavaScript When `appearance-set` Is Available\n\nManually toggling `appearance` on a scroll listener duplicates what `appearance-set` already handles declaratively and risks conflicts with the component's own watcher.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-header id=\"hdr\" appearance=\"inline\">\n <mds-header-bar>...</mds-header-bar>\n</mds-header>\n<script>\n window.addEventListener('scroll', () => {\n document.getElementById('hdr').appearance = window.scrollY > 300 ? 'stripe' : 'inline';\n });\n</script>\n\n<!-- ✅ CORRECT -->\n<mds-header appearance-set=\"inline, stripe 300\" appearance=\"inline\">\n <mds-header-bar>...</mds-header-bar>\n</mds-header>\n```\n\n#### Do Not Omit the `menu` Slot When Providing a Hamburger-Only Nav\n\nIf no `[slot=\"menu\"]` child is present, the component forces `menu=\"none\"` on the bar, so the hamburger icon never appears regardless of the `menu` prop. Always provide menu content when you want the mobile toggle to be visible.\n\n```html\n<!-- 🚫 INCORRECT: hamburger icon will never show -->\n<mds-header menu=\"mobile\">\n <mds-header-bar>\n <mds-img src=\"/logo.svg\" alt=\"Logo\"></mds-img>\n <mds-button slot=\"nav\" label=\"Accedi\" variant=\"dark\" tone=\"outline\"></mds-button>\n </mds-header-bar>\n</mds-header>\n\n<!-- ✅ CORRECT -->\n<mds-header menu=\"mobile\">\n <mds-header-bar>\n <mds-img src=\"/logo.svg\" alt=\"Logo\"></mds-img>\n <mds-button slot=\"nav\" label=\"Accedi\" variant=\"dark\" tone=\"outline\"></mds-button>\n </mds-header-bar>\n <div slot=\"menu\">\n <mds-button label=\"Accedi\" variant=\"dark\" tone=\"outline\"></mds-button>\n </div>\n</mds-header>\n```\n\n#### Do Not Listen to Native `scroll` Events to Detect Auto-Hide State\n\nThe component already emits `mdsHeaderVisibilityChange` when the bar flips between hidden and visible. Attaching a second `scroll` listener couples your code to the same threshold logic and risks running out of sync.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-header auto-hide=\"300\" id=\"hdr\">\n <mds-header-bar>...</mds-header-bar>\n</mds-header>\n<script>\n window.addEventListener('scroll', () => {\n const hidden = window.scrollY > 300;\n document.body.classList.toggle('header-hidden', hidden);\n });\n</script>\n\n<!-- ✅ CORRECT -->\n<mds-header auto-hide=\"300\" id=\"hdr\">\n <mds-header-bar>...</mds-header-bar>\n</mds-header>\n<script>\n document.getElementById('hdr').addEventListener('mdsHeaderVisibilityChange', (e) => {\n document.body.classList.toggle('header-hidden', !e.detail.visibility);\n });\n</script>\n```\n\n#### Do Not Pierce Shadow DOM to Style the Internal Modal\n\nThe side-modal container is exposed as `::part(menu)` and its colors are controllable via `--mds-header-*` CSS custom properties. Do not use `>>>`, `/deep/`, or undocumented internal selectors.\n\n```css\n/* 🚫 INCORRECT */\nmds-header >>> .menu mds-modal {\n background: red;\n}\n\n/* ✅ CORRECT */\nmds-header {\n --mds-header-z-index: 500;\n}\nmds-header::part(menu) {\n /* documented part - safe to target */\n}\n```\n"
10461
+ "1. Description": "The `<mds-header>` web component is the top-level page header container of the Magma Design System. It is a compound parent that wraps one or more `<mds-header-bar>` elements, orchestrating their scroll-driven appearance, auto-hide visibility, and an optional mobile menu rendered as a side modal.\n\n#### Semantic Behavior\n\n- **Compound parent**: Hosts `<mds-header-bar>` children in the default slot and relays its `menu` and `nav` settings down to the bar.\n- **Mobile menu**: A `[slot=\"menu\"]` child is rendered inside a right-positioned modal; when absent, the bar's menu mode is forced to `'none'`.\n- **Open/close control**: The menu modal is opened programmatically via the `setOpened()` method; closing it emits `mdsHeaderClose` (with the bound bar).\n- **Scroll-driven appearance**: When `appearanceSet` defines a threshold, `appearance` swaps between its initial and changed values as the page scrolls past the configured pixel threshold.\n- **Auto-hide on scroll**: When `autoHide` is set, scrolling down past that pixel offset hides the bar and scrolling up reveals it again, governed by `threshold` as the directional margin.\n- **Visibility event**: Any change to `visibility` (`'visible'`/`'hidden'`) emits `mdsHeaderVisibilityChange`.\n\n#### Properties & Visual Configurations\n\n- **`appearance`** is the bar's current visual mode (`'stripe'` or `'inline'`) and is mutable because the component rewrites it as the page scrolls.\n- **`appearanceSet`** is a space/comma-separated string declaring scroll behavior as three tokens: initial appearance, changed appearance, and the `scrollY` pixel threshold (e.g. `\"stripe, inline 200\"`). Use it instead of `appearance` when the header should transform on scroll; `appearance` alone keeps a fixed look.\n- **`autoHide`** is the pixel offset past which the bar starts hiding on downward scroll; leave it unset to keep the bar always present.\n- **`threshold`** tunes how many pixels of opposite-direction scroll are required to flip the auto-hide state - raise it to make hide/show less twitchy.\n- **`menu`** and **`nav`** select on which viewports the hamburger menu and the navigation are shown (`'all'`, `'desktop'`, `'mobile'`, `'none'`); they are relayed to the child bar.\n- **`hideBackdrop`** removes the blurred backdrop layer shown behind the bar when its appearance is `'inline'`.\n- **`visibility`** reflects the current shown/hidden state of the bar and can be set to force it.\n",
10462
+ "2. Pattern": "Correct and idiomatic ways to use the `<mds-header>` component, ordered from most common to most specialized. Patterns assume a working knowledge of the compound-component rules in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md) and the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n\n#### Minimal Header with Navigation Bar\n\nThe default form. Place exactly one `<mds-header-bar>` in the default slot. The bar receives the `menu` and `nav` breakpoint settings from the parent automatically.\n\n```html\n<mds-header>\n <mds-header-bar>\n <mds-img class=\"w-800\" src=\"/logo.svg\" alt=\"Logo\"></mds-img>\n <mds-button slot=\"nav\" label=\"Accedi\" variant=\"dark\" tone=\"outline\"></mds-button>\n <mds-button slot=\"nav\" label=\"Registrati\" variant=\"primary\" tone=\"strong\"></mds-button>\n </mds-header-bar>\n</mds-header>\n```\n\n#### Mobile Menu via the `menu` Slot\n\nProvide a `[slot=\"menu\"]` child to enable the hamburger-triggered side modal. When this slot is filled, the mobile menu icon is shown according to the `menu` breakpoint prop; when absent, `menu` is forced to `'none'` automatically.\n\n```html\n<mds-header menu=\"mobile\">\n <mds-header-bar>\n <mds-img class=\"w-800\" src=\"/logo.svg\" alt=\"Logo\"></mds-img>\n <mds-button slot=\"nav\" label=\"Accedi\" variant=\"dark\" tone=\"outline\"></mds-button>\n </mds-header-bar>\n\n <div slot=\"menu\">\n <div class=\"p-600\">\n <mds-button label=\"Accedi\" variant=\"dark\" tone=\"outline\"></mds-button>\n <mds-button label=\"Registrati\" variant=\"primary\" tone=\"strong\"></mds-button>\n </div>\n </div>\n</mds-header>\n```\n\n#### Inline Appearance (Floating Bar)\n\nSet `appearance=\"inline\"` to detach the bar from the top edge and give it a rounded, floating look. A blurred backdrop is shown by default; add `hide-backdrop` to remove it.\n\n```html\n<mds-header appearance=\"inline\">\n <mds-header-bar>\n <mds-img class=\"w-800\" src=\"/logo.svg\" alt=\"Logo\"></mds-img>\n <mds-button slot=\"nav\" label=\"Accedi\" variant=\"dark\" tone=\"outline\"></mds-button>\n </mds-header-bar>\n</mds-header>\n```\n\n#### Scroll-Driven Appearance Change via `appearance-set`\n\nUse `appearance-set` to declare an initial appearance, a changed appearance, and a scroll threshold in pixels. The component swaps `appearance` automatically as the page scrolls past the threshold - no JavaScript needed. Do not combine `appearance-set` with manual writes to `appearance`.\n\n```html\n<!-- Starts inline (floating), switches to stripe (full-width) after 300 px of scroll -->\n<mds-header appearance-set=\"inline, stripe 300\" appearance=\"inline\">\n <mds-header-bar>\n <mds-img class=\"w-800\" src=\"/logo.svg\" alt=\"Logo\"></mds-img>\n </mds-header-bar>\n</mds-header>\n```\n\n#### Auto-Hide on Downward Scroll\n\nSet `auto-hide` to the pixel offset at which the bar should start hiding when the user scrolls down. The bar reappears when the user scrolls back up. Use `threshold` (default `1`) to control how many pixels of reverse-scroll are required before the bar snaps back - raise it to reduce twitchiness.\n\n```html\n<mds-header auto-hide=\"300\" threshold=\"10\">\n <mds-header-bar>\n <mds-img class=\"w-800\" src=\"/logo.svg\" alt=\"Logo\"></mds-img>\n <mds-button slot=\"nav\" label=\"Accedi\" variant=\"dark\" tone=\"outline\"></mds-button>\n </mds-header-bar>\n</mds-header>\n```\n\n#### Controlling Menu and Nav Breakpoints\n\n`menu` controls on which viewports the hamburger icon is visible; `nav` controls on which viewports the inline navigation is visible. Both accept `'all'`, `'desktop'`, `'mobile'`, or `'none'`.\n\n```html\n<!-- Hamburger shown on all screen sizes; inline nav shown only on desktop -->\n<mds-header menu=\"all\" nav=\"desktop\">\n <mds-header-bar>\n <mds-img class=\"w-800\" src=\"/logo.svg\" alt=\"Logo\"></mds-img>\n <mds-button slot=\"nav\" label=\"Accedi\" variant=\"dark\" tone=\"outline\"></mds-button>\n </mds-header-bar>\n\n <div slot=\"menu\">\n <div class=\"p-600\">\n <mds-button label=\"Accedi\" variant=\"dark\" tone=\"outline\"></mds-button>\n </div>\n </div>\n</mds-header>\n```\n\n#### Reacting to Visibility Changes\n\nListen for `mdsHeaderVisibilityChange` to know when the bar is hidden or shown by auto-hide. The event detail carries a `visibility` boolean.\n\n```html\n<mds-header auto-hide=\"200\" id=\"siteHeader\">\n <mds-header-bar>\n <mds-img class=\"w-800\" src=\"/logo.svg\" alt=\"Logo\"></mds-img>\n </mds-header-bar>\n</mds-header>\n\n<script>\n document.getElementById('siteHeader').addEventListener('mdsHeaderVisibilityChange', (e) => {\n console.log('header visibile:', e.detail.visibility);\n });\n</script>\n```\n\n#### Reacting to Mobile Menu Close\n\nListen for `mdsHeaderClose` to run cleanup logic when the side modal is dismissed. The event detail carries the bound `<mds-header-bar>` reference.\n\n```html\n<mds-header id=\"siteHeader\">\n <mds-header-bar>\n <mds-img class=\"w-800\" src=\"/logo.svg\" alt=\"Logo\"></mds-img>\n </mds-header-bar>\n <div slot=\"menu\">\n <mds-button label=\"Accedi\" variant=\"dark\" tone=\"outline\"></mds-button>\n </div>\n</mds-header>\n\n<script>\n document.getElementById('siteHeader').addEventListener('mdsHeaderClose', (e) => {\n console.log('menu chiuso, bar:', e.detail.bar);\n });\n</script>\n```\n\n#### Programmatic Open/Close via `setOpened()`\n\nUse the `setOpened()` method to open or close the mobile menu from JavaScript - for example after a navigation event inside the menu panel.\n\n```html\n<mds-header id=\"siteHeader\">\n <mds-header-bar>\n <mds-img class=\"w-800\" src=\"/logo.svg\" alt=\"Logo\"></mds-img>\n </mds-header-bar>\n <div slot=\"menu\">\n <mds-button label=\"Vai alla home\" id=\"homeBtn\" variant=\"primary\" tone=\"strong\"></mds-button>\n </div>\n</mds-header>\n\n<script>\n document.getElementById('homeBtn').addEventListener('click', async () => {\n window.location.href = '/';\n await document.getElementById('siteHeader').setOpened(false);\n });\n</script>\n```\n\n#### Styling Customization\n\nCustomize the header through its documented `--mds-header-*` CSS custom properties. Use Magma color tokens via `rgb(var(--<token>))` so dark mode and high-contrast continue to work.\n\n```css\nmds-header {\n --mds-header-color: rgb(var(--tone-neutral));\n --mds-header-icon-color: rgb(var(--variant-primary-03));\n --mds-header-z-index: 200;\n}\n\n/* Inline appearance: wider floating margin on desktop */\nmds-header[appearance='inline'] {\n --mds-header-inline-margin: 2rem;\n --mds-header-backdrop-blur-strength: 4px;\n}\n```\n",
10463
+ "3. Antipattern": "Common incorrect uses of `<mds-header>`. Each entry pairs the wrong form with the right one and a one-line reason. System-wide rules (boolean-as-string, shadow piercing, Tailwind color utilities, raw native event listening) live in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md#system-level-anti-patterns) - they apply here too but are not repeated.\n\n#### Do Not Place `<mds-header-bar>` Outside `<mds-header>`\n\n`<mds-header-bar>` is a compound child; it must be a direct slot child of `<mds-header>`, which relays breakpoint and appearance state down to it. Using the bar standalone breaks that communication and leaves `menu`, `nav`, and auto-hide inoperative.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-header-bar>\n <mds-img src=\"/logo.svg\" alt=\"Logo\"></mds-img>\n</mds-header-bar>\n\n<!-- ✅ CORRECT -->\n<mds-header>\n <mds-header-bar>\n <mds-img src=\"/logo.svg\" alt=\"Logo\"></mds-img>\n </mds-header-bar>\n</mds-header>\n```\n\n#### Do Not Drive Scroll Appearance with JavaScript When `appearance-set` Is Available\n\nManually toggling `appearance` on a scroll listener duplicates what `appearance-set` already handles declaratively and risks conflicts with the component's own watcher.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-header id=\"hdr\" appearance=\"inline\">\n <mds-header-bar>...</mds-header-bar>\n</mds-header>\n<script>\n window.addEventListener('scroll', () => {\n document.getElementById('hdr').appearance = window.scrollY > 300 ? 'stripe' : 'inline';\n });\n</script>\n\n<!-- ✅ CORRECT -->\n<mds-header appearance-set=\"inline, stripe 300\" appearance=\"inline\">\n <mds-header-bar>...</mds-header-bar>\n</mds-header>\n```\n\n#### Do Not Omit the `menu` Slot When Providing a Hamburger-Only Nav\n\nIf no `[slot=\"menu\"]` child is present, the component forces `menu=\"none\"` on the bar, so the hamburger icon never appears regardless of the `menu` prop. Always provide menu content when you want the mobile toggle to be visible.\n\n```html\n<!-- 🚫 INCORRECT: hamburger icon will never show -->\n<mds-header menu=\"mobile\">\n <mds-header-bar>\n <mds-img src=\"/logo.svg\" alt=\"Logo\"></mds-img>\n <mds-button slot=\"nav\" label=\"Accedi\" variant=\"dark\" tone=\"outline\"></mds-button>\n </mds-header-bar>\n</mds-header>\n\n<!-- ✅ CORRECT -->\n<mds-header menu=\"mobile\">\n <mds-header-bar>\n <mds-img src=\"/logo.svg\" alt=\"Logo\"></mds-img>\n <mds-button slot=\"nav\" label=\"Accedi\" variant=\"dark\" tone=\"outline\"></mds-button>\n </mds-header-bar>\n <div slot=\"menu\">\n <mds-button label=\"Accedi\" variant=\"dark\" tone=\"outline\"></mds-button>\n </div>\n</mds-header>\n```\n\n#### Do Not Listen to Native `scroll` Events to Detect Auto-Hide State\n\nThe component already emits `mdsHeaderVisibilityChange` when the bar flips between hidden and visible. Attaching a second `scroll` listener couples your code to the same threshold logic and risks running out of sync.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-header auto-hide=\"300\" id=\"hdr\">\n <mds-header-bar>...</mds-header-bar>\n</mds-header>\n<script>\n window.addEventListener('scroll', () => {\n const hidden = window.scrollY > 300;\n document.body.classList.toggle('header-hidden', hidden);\n });\n</script>\n\n<!-- ✅ CORRECT -->\n<mds-header auto-hide=\"300\" id=\"hdr\">\n <mds-header-bar>...</mds-header-bar>\n</mds-header>\n<script>\n document.getElementById('hdr').addEventListener('mdsHeaderVisibilityChange', (e) => {\n document.body.classList.toggle('header-hidden', !e.detail.visibility);\n });\n</script>\n```\n\n#### Do Not Pierce Shadow DOM to Style the Internal Modal\n\nThe side-modal container is exposed as `::part(menu)` and its colors are controllable via `--mds-header-*` CSS custom properties. Do not use `>>>`, `/deep/`, or undocumented internal selectors.\n\n```css\n/* 🚫 INCORRECT */\nmds-header >>> .menu mds-modal {\n background: red;\n}\n\n/* ✅ CORRECT */\nmds-header {\n --mds-header-z-index: 500;\n}\nmds-header::part(menu) {\n /* documented part - safe to target */\n}\n```\n"
10509
10464
  },
10510
10465
  "props": [
10511
10466
  {
@@ -10590,7 +10545,7 @@
10590
10545
  "setter": false
10591
10546
  },
10592
10547
  {
10593
- "name": "backdrop",
10548
+ "name": "hideBackdrop",
10594
10549
  "type": "boolean | undefined",
10595
10550
  "complexType": {
10596
10551
  "original": "boolean",
@@ -10598,16 +10553,16 @@
10598
10553
  "references": {}
10599
10554
  },
10600
10555
  "mutable": false,
10601
- "attr": "backdrop",
10556
+ "attr": "hide-backdrop",
10602
10557
  "reflectToAttr": true,
10603
- "docs": "Sets if the backdrop is shown when the mds-header-bar attribute appearace is set to `inline`",
10558
+ "docs": "Hides the backdrop shown when the mds-header-bar attribute appearace is set to `inline`",
10604
10559
  "docsTags": [
10605
10560
  {
10606
10561
  "name": "default",
10607
- "text": "true"
10562
+ "text": "false"
10608
10563
  }
10609
10564
  ],
10610
- "default": "true",
10565
+ "default": "false",
10611
10566
  "values": [
10612
10567
  {
10613
10568
  "type": "boolean"
@@ -11219,13 +11174,13 @@
11219
11174
  }
11220
11175
  ],
11221
11176
  "usage": {
11222
- "1. Description": "The `<mds-help>` web component is a contextual help affordance of the Magma Design System: a small help icon that reveals an explanatory tooltip on interaction. It composes [`mds-icon`](../../mds-icon) and [`mds-tooltip`](../../mds-tooltip) into a single drop-in element, so there is no native HTML primitive it replaces.\n\n#### Semantic Behavior\n\n- **Tooltip-on-icon**: The host always renders a help icon and anchors a tooltip to it; the slotted text becomes the tooltip body and is shown on hover/focus of the icon.\n- **Auto-placement**: With `autoPlacement` enabled (the default), the tooltip repositions itself to stay near its caller and within the viewport, overriding the static `placement` when space is constrained.\n- **Default-slot is text**: The default slot is intended for a plain text string only; HTML elements or components in the slot are discouraged because the content is rendered inside the tooltip.\n\n#### Properties & Visual Configurations\n\n- **`icon`** is an SVG filename slug from the Magma icon library; when omitted, the component falls back to the standard outline help glyph, so set it only to convey a help affordance other than the default question mark.\n- **`placement`** sets the preferred side of the icon on which the tooltip appears (e.g. `'top'`, `'bottom-start'`). It is the starting position; `autoPlacement` may move the tooltip away from this preference at runtime.\n- **`autoPlacement`** toggles dynamic repositioning. Keep it enabled in scrollable or edge-of-viewport contexts; disable it only when you need the tooltip pinned strictly to the `placement` side.\n\nThe tooltip's dimensions and reveal timing are tuned via the CSS custom properties documented in [`readme.md`](../readme.md) (`--mds-help-tooltip-width`, `--mds-help-tooltip-min-width`, `--mds-help-tooltip-max-width`, `--mds-help-tooltip-delay`).\n",
11223
- "2. Pattern": "Correct and idiomatic ways to use the `<mds-help>` component, ordered from most common to most specialized. Patterns assume a working knowledge of the variant / tone ladders documented in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md) and the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n\n#### Basic Inline Help\n\nThe canonical form. Drop `<mds-help>` inline next to a label or piece of text and slot in a plain string explaining the concept. The tooltip appears on hover or focus of the help icon.\n\n```html\n<mds-text>\n Periodo di fatturazione\n <mds-help>Il ciclo di fatturazione inizia il primo giorno del mese e termina l'ultimo.</mds-help>\n</mds-text>\n```\n\n#### Placement Preference\n\nUse the `placement` prop to suggest a preferred side for the tooltip. The default is `top`; change it when the element sits near a viewport edge.\n\n```html\n<!-- Default: tooltip above the icon -->\n<mds-help placement=\"top\">Inserire il codice fiscale a 16 caratteri.</mds-help>\n\n<!-- Tooltip to the right, useful for left-aligned form labels -->\n<mds-help placement=\"right\">Il campo e' obbligatorio per la registrazione.</mds-help>\n\n<!-- Tooltip below, e.g. inside a sticky header bar -->\n<mds-help placement=\"bottom\">Clicca per espandere il pannello dei filtri.</mds-help>\n```\n\n#### Disabling Auto-Placement\n\n`autoPlacement` is enabled by default and overrides `placement` when space is constrained. Disable it only when you need the tooltip pinned strictly to one side - for example in a fixed overlay where you control the available space. In plain HTML, omit the attribute entirely to turn it off; in a framework binding, set the prop to `undefined`.\n\n```html\n<!-- Omit the attribute to disable auto-placement and pin the tooltip to placement=\"bottom\" -->\n<mds-help placement=\"bottom\">\n Questa descrizione deve sempre apparire in basso.\n</mds-help>\n```\n\n#### Custom Icon\n\nOverride the default question-mark glyph with any slug from the Magma icon library by setting the `icon` prop. Use this to match a specific visual context - for example a warning glyph when the help text explains a potentially destructive action.\n\n```html\n<mds-help icon=\"mi/baseline/info\">\n Questa operazione puo' richiedere alcuni minuti.\n</mds-help>\n\n<mds-help icon=\"mi/baseline/warning\">\n Attenzione: la modifica sara' applicata a tutti i documenti selezionati.\n</mds-help>\n```\n\n#### Tooltip Width Customization\n\nControl the tooltip dimensions with `--mds-help-tooltip-width`, `--mds-help-tooltip-min-width`, and `--mds-help-tooltip-max-width`. Useful when the help text is very short (narrow the tooltip) or contains several sentences (widen it).\n\n```css\n/* Wider tooltip for a multi-sentence explanation */\n.configurazione-avanzata mds-help {\n --mds-help-tooltip-max-width: 480px;\n --mds-help-tooltip-min-width: 300px;\n}\n\n/* Narrow tooltip for a short label */\n.campo-codice mds-help {\n --mds-help-tooltip-max-width: 180px;\n --mds-help-tooltip-min-width: 120px;\n}\n```\n\n#### Reveal Delay Customization\n\nIncrease `--mds-help-tooltip-delay` to prevent accidental tooltip flicker when users move their pointer across a dense form, or decrease it for touch-primary interfaces where hover is not applicable.\n\n```css\n/* Slower reveal for dense data tables */\n.tabella-dati mds-help {\n --mds-help-tooltip-delay: 0.6s;\n}\n\n/* Faster reveal in a step-by-step wizard */\n.wizard-step mds-help {\n --mds-help-tooltip-delay: 0.1s;\n}\n```\n\n#### Icon Part Customization\n\nTint the help icon to match a surrounding context using the documented `::part(icon)` surface. Keep using Magma color tokens so dark mode and high-contrast modes continue to work.\n\n```css\n/* Match the icon color to a warning banner context */\n.banner-warning mds-help::part(icon) {\n fill: rgb(var(--status-warning-05));\n}\n```\n",
11224
- "3. Antipattern": "Common incorrect uses of `<mds-help>`. Each entry pairs the wrong form with the right one and a one-line reason. System-wide rules (boolean-as-string, shadow piercing, Tailwind color utilities, raw native event listening) live in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md#system-level-anti-patterns) - they apply here too but are not repeated.\n\n#### Do Not Put HTML Elements in the Default Slot\n\nThe default slot is text-only; the content is rendered inside [`mds-tooltip`](../../mds-tooltip), which expects a plain string. Nested elements or components may be stripped or break the tooltip layout.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-help>\n <strong>Attenzione:</strong> il limite massimo e' <em>100 caratteri</em>.\n</mds-help>\n\n<!-- ✅ CORRECT -->\n<mds-help>Attenzione: il limite massimo e' 100 caratteri.</mds-help>\n```\n\n#### Do Not Disable Auto-Placement with a String \"false\"\n\n`autoPlacement` is a boolean prop. Setting it to the string `\"false\"` leaves it truthy - any non-empty attribute value is truthy in HTML. Remove the attribute to disable it.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-help placement=\"right\" auto-placement=\"false\">\n Informazioni aggiuntive.\n</mds-help>\n\n<!-- ✅ CORRECT -->\n<mds-help placement=\"right\">\n Informazioni aggiuntive.\n</mds-help>\n```\n\n#### Do Not Pierce Shadow DOM to Style the Icon\n\nThe only supported customization surface is `--mds-help-*` CSS custom properties and the documented `::part(icon)` shadow part. Targeting internal elements via `>>>` or undocumented selectors couples your code to the shadow DOM implementation.\n\n```css\n/* 🚫 INCORRECT */\nmds-help >>> mds-icon {\n fill: red;\n}\n\n/* ✅ CORRECT */\nmds-help::part(icon) {\n fill: rgb(var(--status-warning-05));\n}\n```\n\n#### Do Not Use `<mds-help>` as a Generic Tooltip Anchor\n\n`<mds-help>` always renders its own help icon and wraps [`mds-tooltip`](../../mds-tooltip) internally. It is not a generic popover wrapper. If you need a tooltip on an arbitrary element, use [`mds-tooltip`](../../mds-tooltip) directly with a `target` selector.\n\n```html\n<!-- 🚫 INCORRECT: slotting a custom trigger to replace the icon -->\n<mds-help>\n <mds-button slot=\"default\" label=\"Dettagli\"></mds-button>\n Testo di spiegazione.\n</mds-help>\n\n<!-- ✅ CORRECT: use mds-tooltip with a target for a custom trigger -->\n<mds-button id=\"info-btn\" label=\"Dettagli\"></mds-button>\n<mds-tooltip target=\"#info-btn\">Testo di spiegazione.</mds-tooltip>\n```\n\n#### Do Not Override Width with Inline Styles Instead of CSS Custom Properties\n\nSetting `style=\"width: ...\"` on the host bypasses the component's layout contract. Use the documented `--mds-help-tooltip-*` CSS custom properties to size the tooltip, and leave the host dimensions alone.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-help style=\"width: 400px;\">Descrizione del campo.</mds-help>\n\n<!-- ✅ CORRECT -->\n<style>\n .sezione-avanzata mds-help {\n --mds-help-tooltip-max-width: 400px;\n }\n</style>\n<mds-help class=\"sezione-avanzata\">Descrizione del campo.</mds-help>\n```\n"
11177
+ "1. Description": "The `<mds-help>` web component is a contextual help affordance of the Magma Design System: a small help icon that reveals an explanatory tooltip on interaction. It composes [`mds-icon`](../../mds-icon) and [`mds-tooltip`](../../mds-tooltip) into a single drop-in element, so there is no native HTML primitive it replaces.\n\n#### Semantic Behavior\n\n- **Tooltip-on-icon**: The host always renders a help icon and anchors a tooltip to it; the slotted text becomes the tooltip body and is shown on hover/focus of the icon.\n- **Auto-placement**: Unless `disableAutoPlacement` is set (auto-placement is on by default), the tooltip repositions itself to stay near its caller and within the viewport, overriding the static `placement` when space is constrained.\n- **Default-slot is text**: The default slot is intended for a plain text string only; HTML elements or components in the slot are discouraged because the content is rendered inside the tooltip.\n\n#### Properties & Visual Configurations\n\n- **`icon`** is an SVG filename slug from the Magma icon library; when omitted, the component falls back to the standard outline help glyph, so set it only to convey a help affordance other than the default question mark.\n- **`placement`** sets the preferred side of the icon on which the tooltip appears (e.g. `'top'`, `'bottom-start'`). It is the starting position; auto-placement may move the tooltip away from this preference at runtime.\n- **`disableAutoPlacement`** turns off dynamic repositioning. Leave it off in scrollable or edge-of-viewport contexts; set it only when you need the tooltip pinned strictly to the `placement` side.\n\nThe tooltip's dimensions and reveal timing are tuned via the CSS custom properties documented in [`readme.md`](../readme.md) (`--mds-help-tooltip-width`, `--mds-help-tooltip-min-width`, `--mds-help-tooltip-max-width`, `--mds-help-tooltip-delay`).\n",
11178
+ "2. Pattern": "Correct and idiomatic ways to use the `<mds-help>` component, ordered from most common to most specialized. Patterns assume a working knowledge of the variant / tone ladders documented in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md) and the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n\n#### Basic Inline Help\n\nThe canonical form. Drop `<mds-help>` inline next to a label or piece of text and slot in a plain string explaining the concept. The tooltip appears on hover or focus of the help icon.\n\n```html\n<mds-text>\n Periodo di fatturazione\n <mds-help>Il ciclo di fatturazione inizia il primo giorno del mese e termina l'ultimo.</mds-help>\n</mds-text>\n```\n\n#### Placement Preference\n\nUse the `placement` prop to suggest a preferred side for the tooltip. The default is `top`; change it when the element sits near a viewport edge.\n\n```html\n<!-- Default: tooltip above the icon -->\n<mds-help placement=\"top\">Inserire il codice fiscale a 16 caratteri.</mds-help>\n\n<!-- Tooltip to the right, useful for left-aligned form labels -->\n<mds-help placement=\"right\">Il campo e' obbligatorio per la registrazione.</mds-help>\n\n<!-- Tooltip below, e.g. inside a sticky header bar -->\n<mds-help placement=\"bottom\">Clicca per espandere il pannello dei filtri.</mds-help>\n```\n\n#### Disabling Auto-Placement\n\nAuto-placement is enabled by default and overrides `placement` when space is constrained. Add `disable-auto-placement` only when you need the tooltip pinned strictly to one side - for example in a fixed overlay where you control the available space.\n\n```html\n<!-- Add disable-auto-placement to pin the tooltip to placement=\"bottom\" -->\n<mds-help placement=\"bottom\" disable-auto-placement>\n Questa descrizione deve sempre apparire in basso.\n</mds-help>\n```\n\n#### Custom Icon\n\nOverride the default question-mark glyph with any slug from the Magma icon library by setting the `icon` prop. Use this to match a specific visual context - for example a warning glyph when the help text explains a potentially destructive action.\n\n```html\n<mds-help icon=\"mi/baseline/info\">\n Questa operazione puo' richiedere alcuni minuti.\n</mds-help>\n\n<mds-help icon=\"mi/baseline/warning\">\n Attenzione: la modifica sara' applicata a tutti i documenti selezionati.\n</mds-help>\n```\n\n#### Tooltip Width Customization\n\nControl the tooltip dimensions with `--mds-help-tooltip-width`, `--mds-help-tooltip-min-width`, and `--mds-help-tooltip-max-width`. Useful when the help text is very short (narrow the tooltip) or contains several sentences (widen it).\n\n```css\n/* Wider tooltip for a multi-sentence explanation */\n.configurazione-avanzata mds-help {\n --mds-help-tooltip-max-width: 480px;\n --mds-help-tooltip-min-width: 300px;\n}\n\n/* Narrow tooltip for a short label */\n.campo-codice mds-help {\n --mds-help-tooltip-max-width: 180px;\n --mds-help-tooltip-min-width: 120px;\n}\n```\n\n#### Reveal Delay Customization\n\nIncrease `--mds-help-tooltip-delay` to prevent accidental tooltip flicker when users move their pointer across a dense form, or decrease it for touch-primary interfaces where hover is not applicable.\n\n```css\n/* Slower reveal for dense data tables */\n.tabella-dati mds-help {\n --mds-help-tooltip-delay: 0.6s;\n}\n\n/* Faster reveal in a step-by-step wizard */\n.wizard-step mds-help {\n --mds-help-tooltip-delay: 0.1s;\n}\n```\n\n#### Icon Part Customization\n\nTint the help icon to match a surrounding context using the documented `::part(icon)` surface. Keep using Magma color tokens so dark mode and high-contrast modes continue to work.\n\n```css\n/* Match the icon color to a warning banner context */\n.banner-warning mds-help::part(icon) {\n fill: rgb(var(--status-warning-05));\n}\n```\n",
11179
+ "3. Antipattern": "Common incorrect uses of `<mds-help>`. Each entry pairs the wrong form with the right one and a one-line reason. System-wide rules (boolean-as-string, shadow piercing, Tailwind color utilities, raw native event listening) live in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md#system-level-anti-patterns) - they apply here too but are not repeated.\n\n#### Do Not Put HTML Elements in the Default Slot\n\nThe default slot is text-only; the content is rendered inside [`mds-tooltip`](../../mds-tooltip), which expects a plain string. Nested elements or components may be stripped or break the tooltip layout.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-help>\n <strong>Attenzione:</strong> il limite massimo e' <em>100 caratteri</em>.\n</mds-help>\n\n<!-- ✅ CORRECT -->\n<mds-help>Attenzione: il limite massimo e' 100 caratteri.</mds-help>\n```\n\n#### Do Not Pierce Shadow DOM to Style the Icon\n\nThe only supported customization surface is `--mds-help-*` CSS custom properties and the documented `::part(icon)` shadow part. Targeting internal elements via `>>>` or undocumented selectors couples your code to the shadow DOM implementation.\n\n```css\n/* 🚫 INCORRECT */\nmds-help >>> mds-icon {\n fill: red;\n}\n\n/* ✅ CORRECT */\nmds-help::part(icon) {\n fill: rgb(var(--status-warning-05));\n}\n```\n\n#### Do Not Use `<mds-help>` as a Generic Tooltip Anchor\n\n`<mds-help>` always renders its own help icon and wraps [`mds-tooltip`](../../mds-tooltip) internally. It is not a generic popover wrapper. If you need a tooltip on an arbitrary element, use [`mds-tooltip`](../../mds-tooltip) directly with a `target` selector.\n\n```html\n<!-- 🚫 INCORRECT: slotting a custom trigger to replace the icon -->\n<mds-help>\n <mds-button slot=\"default\" label=\"Dettagli\"></mds-button>\n Testo di spiegazione.\n</mds-help>\n\n<!-- ✅ CORRECT: use mds-tooltip with a target for a custom trigger -->\n<mds-button id=\"info-btn\" label=\"Dettagli\"></mds-button>\n<mds-tooltip target=\"#info-btn\">Testo di spiegazione.</mds-tooltip>\n```\n\n#### Do Not Override Width with Inline Styles Instead of CSS Custom Properties\n\nSetting `style=\"width: ...\"` on the host bypasses the component's layout contract. Use the documented `--mds-help-tooltip-*` CSS custom properties to size the tooltip, and leave the host dimensions alone.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-help style=\"width: 400px;\">Descrizione del campo.</mds-help>\n\n<!-- ✅ CORRECT -->\n<style>\n .sezione-avanzata mds-help {\n --mds-help-tooltip-max-width: 400px;\n }\n</style>\n<mds-help class=\"sezione-avanzata\">Descrizione del campo.</mds-help>\n```\n"
11225
11180
  },
11226
11181
  "props": [
11227
11182
  {
11228
- "name": "autoPlacement",
11183
+ "name": "disableAutoPlacement",
11229
11184
  "type": "boolean | undefined",
11230
11185
  "complexType": {
11231
11186
  "original": "boolean",
@@ -11233,16 +11188,16 @@
11233
11188
  "references": {}
11234
11189
  },
11235
11190
  "mutable": false,
11236
- "attr": "auto-placement",
11191
+ "attr": "disable-auto-placement",
11237
11192
  "reflectToAttr": true,
11238
- "docs": "If set, the component will be placed automatically near it's caller.",
11193
+ "docs": "If set, the component will not be placed automatically near it's caller.",
11239
11194
  "docsTags": [
11240
11195
  {
11241
11196
  "name": "default",
11242
- "text": "true"
11197
+ "text": "false"
11243
11198
  }
11244
11199
  ],
11245
- "default": "true",
11200
+ "default": "false",
11246
11201
  "values": [
11247
11202
  {
11248
11203
  "type": "boolean"
@@ -19414,59 +19369,11 @@
19414
19369
  }
19415
19370
  ],
19416
19371
  "usage": {
19417
- "1. Description": "The `<mds-modal>` web component is the Magma Design System overlay container for dialogs, presenting content in a windowed surface layered above the page with an optional backdrop. It is the system equivalent of the native `<dialog>` element, adding managed open/close animations, body scroll locking, positioning, and a built-in close affordance.\n\n#### Semantic Behavior\n\n- **Open state**: Visibility is driven by the `opened` prop. Setting it `true` runs the intro animation and emits `mdsModalOpen`; clearing it runs the outro animation and emits `mdsModalClose`.\n- **Programmatic close**: Exposes an async `close()` method that dismisses the modal regardless of `interaction`, mirroring the close-button action.\n- **Show/hide events**: `mdsModalShow` fires when the intro finishes (fully visible) and `mdsModalHide` when the outro finishes (fully hidden), the latter being the safe point to detach the modal to reclaim memory.\n- **Backdrop dismissal**: With `interaction=\"relaxed\"` (default) a click on the backdrop closes the modal; with `interaction=\"strict\"` only the close button or `close()` can dismiss it.\n- **Body scroll lock**: When `overflow=\"auto\"` the component locks body scroll while open and restores it on close.\n- **Touch dismissal**: On touch devices a horizontal swipe past a threshold closes the modal, respecting the swipe direction implied by edge `position` values.\n- **Slot-driven layout**: With no `window` slot, the default slot renders centered content framed by optional `top` (header) and `bottom` (footer) slots, and a close button is rendered automatically. Slotting a `window` element suppresses the built-in chrome and close button so the consumer supplies the entire surface.\n\n#### Properties & Visual Configurations\n\nThis component does not use the shared `variant` / `tone` ladders; its configuration is structural and motion-oriented.\n\n#### Other behavioral props\n\n- **`position`** sets where the window animates from and rests, from `'center'` to edge and corner anchors (`'top'`, `'bottom-left'`, etc.); edge positions also define the valid swipe-to-dismiss direction.\n- **`animation`** selects the motion style of the window: `'slide'` (default), `'3d'`, or `'custom'` (driven entirely by CSS custom properties).\n- **`interaction`** governs how forgiving dismissal is - `'relaxed'` allows backdrop clicks, `'strict'` requires the close button.\n- **`overflow`** chooses whether the component manages body scroll locking (`'auto'`) or leaves it to the consumer (`'manual'`).\n- **`backdrop`** toggles the dimmed overlay behind the window.\n- **`animating`** is a read-only runtime state used for transition styling, not a configuration knob.\n",
19418
- "2. Pattern": "Correct and idiomatic ways to use the `<mds-modal>` component, ordered from most common to most specialized. Patterns assume a working knowledge of the overlay conventions documented in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md) and the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n\n#### Basic Modal with Inline Content\n\nThe simplest form: toggle `opened` from JavaScript to show the dialog. The built-in close button and backdrop dismiss the modal automatically with `interaction=\"relaxed\"` (default). React to the `mdsModalClose` event to sync your state.\n\n```html\n<mds-button id=\"btn-apri\">Apri dialogo</mds-button>\n\n<mds-modal id=\"dialogo\">\n <div class=\"p-400\">\n <mds-text>Sei sicuro di voler continuare?</mds-text>\n </div>\n</mds-modal>\n\n<script>\n const btn = document.getElementById('btn-apri');\n const modal = document.getElementById('dialogo');\n btn.addEventListener('mdsButtonClick', () => { modal.opened = true; });\n modal.addEventListener('mdsModalClose', () => { modal.opened = undefined; });\n</script>\n```\n\n#### Fixed Header and Footer via `top` / `bottom` Slots\n\nUse the `top` slot for a sticky header and the `bottom` slot for a sticky footer (e.g. action buttons). The default slot renders scrollable body content between them.\n\n```html\n<mds-modal id=\"modifica-utente\" position=\"right\">\n <header slot=\"top\" class=\"p-400 bg-tone-neutral shadow-outline-light\">\n <mds-text typography=\"h5\">Modifica utente</mds-text>\n </header>\n\n <div class=\"p-400 grid gap-400\">\n <mds-input name=\"nome\" label=\"Nome\"></mds-input>\n <mds-input name=\"cognome\" label=\"Cognome\"></mds-input>\n </div>\n\n <footer slot=\"bottom\" class=\"p-400 flex gap-300 justify-end bg-tone-neutral shadow-outline-light\">\n <mds-button variant=\"dark\" tone=\"outline\" id=\"btn-annulla\">Annulla</mds-button>\n <mds-button variant=\"primary\" tone=\"strong\" id=\"btn-salva\">Salva</mds-button>\n </footer>\n</mds-modal>\n```\n\n#### Edge and Corner Positions\n\n`position` anchors the window to an edge or corner and drives the slide-in direction. Use `right` or `left` for side panels, `bottom` for mobile drawers.\n\n```html\n<!-- Side panel from the right (default in most app shells) -->\n<mds-modal id=\"pannello-laterale\" position=\"right\">\n <div class=\"p-400\">\n <mds-text>Dettagli del documento</mds-text>\n </div>\n</mds-modal>\n\n<!-- Drawer from the bottom (mobile) -->\n<mds-modal id=\"drawer-mobile\" position=\"bottom\">\n <div class=\"p-400\">\n <mds-text>Azioni disponibili</mds-text>\n </div>\n</mds-modal>\n```\n\n#### Strict Interaction Mode\n\nSet `interaction=\"strict\"` when the user must explicitly confirm or cancel before the dialog closes - for example, a form with unsaved changes. Backdrop clicks are ignored; only the close button or the `close()` method can dismiss the modal.\n\n```html\n<mds-modal id=\"conferma-elimina\" interaction=\"strict\">\n <div class=\"p-400 grid gap-400\">\n <mds-text typography=\"h5\">Eliminare il documento?</mds-text>\n <mds-text>Questa operazione non e' reversibile.</mds-text>\n <div class=\"flex gap-300 justify-end\">\n <mds-button variant=\"dark\" tone=\"outline\" id=\"btn-no\">Annulla</mds-button>\n <mds-button variant=\"error\" tone=\"strong\" id=\"btn-si\">Elimina</mds-button>\n </div>\n </div>\n</mds-modal>\n\n<script>\n document.getElementById('btn-no').addEventListener('mdsButtonClick', () => {\n document.getElementById('conferma-elimina').close();\n });\n</script>\n```\n\n#### Programmatic Close via `close()` Method\n\nCall the async `close()` method from JavaScript when you need to dismiss the modal from outside its UI - for example, after a successful async operation.\n\n```html\n<mds-modal id=\"salvataggio\">\n <div class=\"p-400\">\n <mds-text>Salvataggio in corso...</mds-text>\n </div>\n</mds-modal>\n\n<script>\n async function salva() {\n const modal = document.getElementById('salvataggio');\n modal.opened = true;\n await salvaRisorsa();\n await modal.close();\n }\n</script>\n```\n\n#### Listening to Animation Events\n\n`mdsModalShow` fires when the intro animation completes (the modal is fully visible). Use it to focus the first interactive element. `mdsModalHide` fires when the outro animation completes; use it to detach the element or reset content.\n\n```html\n<mds-modal id=\"modal-focus\" position=\"right\">\n <div class=\"p-400\">\n <mds-input id=\"input-ricerca\" label=\"Cerca\"></mds-input>\n </div>\n</mds-modal>\n\n<script>\n const modal = document.getElementById('modal-focus');\n const input = document.getElementById('input-ricerca');\n\n modal.addEventListener('mdsModalShow', () => {\n input.setFocus();\n });\n modal.addEventListener('mdsModalHide', () => {\n // safe point to detach or reset content\n modal.opened = undefined;\n });\n</script>\n```\n\n#### Custom Animation Styles\n\n`animation` selects the motion style. `'slide'` (default) translates from the entry edge; `'3d'` adds a perspective tilt; `'custom'` delegates entirely to the CSS custom properties `--mds-modal-custom-closed-transform` and `--mds-modal-custom-window-distance`.\n\n```html\n<!-- 3D perspective tilt animation -->\n<mds-modal id=\"modal-3d\" animation=\"3d\" position=\"center\">\n <div class=\"p-400\">\n <mds-text>Animazione 3D</mds-text>\n </div>\n</mds-modal>\n\n<!-- Custom animation driven by CSS vars -->\n<mds-modal id=\"modal-custom\" animation=\"custom\" position=\"center\">\n <div class=\"p-400\">\n <mds-text>Animazione personalizzata</mds-text>\n </div>\n</mds-modal>\n```\n\n#### Custom Window via `window` Slot\n\nSlot any element with `slot=\"window\"` to completely replace the built-in chrome (the white window surface and the close button). The slotted element receives `role=\"dialog\"` automatically. Use this when a completely bespoke surface is needed - for example, a full-screen banner.\n\n```html\n<mds-modal id=\"modal-banner\" animation=\"custom\">\n <mds-banner\n slot=\"window\"\n class=\"max-w-md w-full mx-400\"\n tone=\"box\"\n deletable\n headline=\"Azione richiesta\"\n >\n <mds-text typography=\"detail\">Conferma la tua identita' per procedere.</mds-text>\n <mds-button slot=\"actions\" variant=\"primary\" tone=\"text\">Annulla</mds-button>\n <mds-button slot=\"actions\" variant=\"primary\" tone=\"strong\">Conferma</mds-button>\n </mds-banner>\n</mds-modal>\n```\n\n#### Disabling the Backdrop\n\nSet `backdrop` to absent (or `undefined`) to render the modal without the dimmed overlay - useful for non-blocking side panels that coexist with interactive page content.\n\n```html\n<mds-modal id=\"pannello-info\" position=\"right\">\n <div class=\"p-400\">\n <mds-text>Informazioni contestuali</mds-text>\n </div>\n</mds-modal>\n```\n\n```javascript\n// Remove the backdrop at runtime\ndocument.getElementById('pannello-info').backdrop = undefined;\n```\n\n#### CSS Customization\n\nStyle the window surface only through the documented `--mds-modal-*` CSS custom properties. Set them on the host element.\n\n```css\n/* Rounded card-style center modal */\n#modal-card {\n --mds-modal-window-radius: var(--radius-xl);\n --mds-modal-window-distance: var(--spacing-600);\n --mds-modal-window-overflow: hidden;\n --mds-modal-window-background: rgb(var(--tone-neutral));\n --mds-modal-window-shadow: var(--shadow-2xl);\n --mds-modal-window-max-width: 480px;\n}\n\n/* Full-width drawer */\n#drawer-bottom {\n --mds-modal-window-radius: var(--radius-lg) var(--radius-lg) 0 0;\n --mds-modal-window-max-width: 100%;\n --mds-modal-window-min-width: 100%;\n}\n```\n",
19419
- "3. Antipattern": "Common incorrect uses of `<mds-modal>`. Each entry pairs the wrong form with the right one and a one-line reason. System-wide rules (boolean-as-string, shadow piercing, Tailwind color utilities, raw native event listening) live in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md#system-level-anti-patterns) - they apply here too but are not repeated.\n\n#### Do Not Set `opened=\"false\"` to Close the Modal\n\nBoolean props in Stencil treat any non-empty string as truthy. Setting `opened=\"false\"` keeps the modal open instead of closing it. Remove the attribute or set the prop to `undefined`.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-modal id=\"dialogo\" opened=\"false\"></mds-modal>\n\n<!-- ✅ CORRECT -->\n<mds-modal id=\"dialogo\"></mds-modal>\n```\n\n```javascript\n// 🚫 INCORRECT\nmodal.opened = false;\n\n// ✅ CORRECT\nmodal.opened = undefined;\n```\n\n#### Do Not Put Content in the `window` Slot Without Replacing the Entire Chrome\n\nThe `window` slot completely bypasses the built-in surface, header/footer regions, and close button. Do not use it to add a header element while expecting the default content area and close button to still render - they will not.\n\n```html\n<!-- 🚫 INCORRECT: only the slotted header renders; default slot and close button are suppressed -->\n<mds-modal id=\"modal\">\n <header slot=\"window\" class=\"p-400\">Titolo</header>\n <div>Contenuto del dialogo</div>\n</mds-modal>\n\n<!-- ✅ CORRECT: use slot=\"top\" for a sticky header, default slot for body -->\n<mds-modal id=\"modal\">\n <header slot=\"top\" class=\"p-400 bg-tone-neutral\">Titolo</header>\n <div class=\"p-400\">Contenuto del dialogo</div>\n</mds-modal>\n```\n\n#### Do Not Reach Into Shadow Parts to Style the Window\n\nThe only supported customization surface is `--mds-modal-*` CSS custom properties and the two documented shadow parts (`window`, `action-close`). Targeting internal shadow selectors couples your code to implementation details that will break on minor releases.\n\n```css\n/* 🚫 INCORRECT */\nmds-modal >>> .window-content {\n padding: 0;\n}\nmds-modal::part(window) > div {\n border: 2px solid red;\n}\n\n/* ✅ CORRECT */\nmds-modal {\n --mds-modal-window-background: rgb(var(--tone-neutral));\n --mds-modal-window-radius: var(--radius-xl);\n --mds-modal-window-distance: var(--spacing-400);\n}\n```\n\n#### Do Not Listen for Native `click` on the Backdrop to Close\n\n`mds-modal` emits `mdsModalClose` when it closes (and `mdsModalHide` when the animation finishes). Listening for a raw `click` on the host or backdrop is fragile - the event target varies by browser and shadow DOM boundary, and `interaction=\"strict\"` will silently break your handler.\n\n```javascript\n// 🚫 INCORRECT\ndocument.getElementById('modal').addEventListener('click', (e) => {\n if (e.target === e.currentTarget) modal.opened = undefined;\n});\n\n// ✅ CORRECT\ndocument.getElementById('modal').addEventListener('mdsModalClose', () => {\n modal.opened = undefined;\n});\n```\n\n#### Do Not Skip the `close()` Method When Dismissing Programmatically from Strict Modals\n\nWhen `interaction=\"strict\"` is set, the internal `closeModal` guard prevents backdrop-click dismissal. Manually setting `opened = undefined` bypasses the guard but skips the `mdsModalClose` event and animation teardown. Use the `close()` method instead.\n\n```javascript\n// 🚫 INCORRECT (skips event emission when interaction=\"strict\")\ndocument.getElementById('modal-strict').opened = undefined;\n\n// ✅ CORRECT\nawait document.getElementById('modal-strict').close();\n```\n\n#### Do Not Use `backdrop` to Toggle the Backdrop at Runtime via String\n\n`backdrop` is a boolean prop. Passing the string `\"false\"` is truthy and leaves the backdrop visible. To hide the backdrop, set the prop to `undefined` (remove the attribute in HTML).\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-modal backdrop=\"false\"></mds-modal>\n\n<!-- ✅ CORRECT (no attribute = no backdrop) -->\n<mds-modal></mds-modal>\n```\n\n#### Do Not Use `<dialog>` Directly When `<mds-modal>` Is Available\n\nUsing a raw `<dialog>` element bypasses the system's managed animation, body-scroll locking, touch-swipe dismissal, and design-token theming. Always use `<mds-modal>` for overlays in a Magma application.\n\n```html\n<!-- 🚫 INCORRECT -->\n<dialog id=\"raw-dialog\">\n <p>Contenuto del dialogo</p>\n <button>Chiudi</button>\n</dialog>\n\n<!-- ✅ CORRECT -->\n<mds-modal id=\"modal\">\n <div class=\"p-400\">\n <mds-text>Contenuto del dialogo</mds-text>\n </div>\n</mds-modal>\n```\n"
19372
+ "1. Description": "The `<mds-modal>` web component is the Magma Design System overlay container for dialogs, presenting content in a windowed surface layered above the page with an optional backdrop. It is the system equivalent of the native `<dialog>` element, adding managed open/close animations, body scroll locking, positioning, and a built-in close affordance.\n\n#### Semantic Behavior\n\n- **Open state**: Visibility is driven by the `opened` prop. Setting it `true` runs the intro animation and emits `mdsModalOpen`; clearing it runs the outro animation and emits `mdsModalClose`.\n- **Programmatic close**: Exposes an async `close()` method that dismisses the modal regardless of `interaction`, mirroring the close-button action.\n- **Show/hide events**: `mdsModalShow` fires when the intro finishes (fully visible) and `mdsModalHide` when the outro finishes (fully hidden), the latter being the safe point to detach the modal to reclaim memory.\n- **Backdrop dismissal**: With `interaction=\"relaxed\"` (default) a click on the backdrop closes the modal; with `interaction=\"strict\"` only the close button or `close()` can dismiss it.\n- **Body scroll lock**: When `overflow=\"auto\"` the component locks body scroll while open and restores it on close.\n- **Touch dismissal**: On touch devices a horizontal swipe past a threshold closes the modal, respecting the swipe direction implied by edge `position` values.\n- **Slot-driven layout**: With no `window` slot, the default slot renders centered content framed by optional `top` (header) and `bottom` (footer) slots, and a close button is rendered automatically. Slotting a `window` element suppresses the built-in chrome and close button so the consumer supplies the entire surface.\n\n#### Properties & Visual Configurations\n\nThis component does not use the shared `variant` / `tone` ladders; its configuration is structural and motion-oriented.\n\n#### Other behavioral props\n\n- **`position`** sets where the window animates from and rests, from `'center'` to edge and corner anchors (`'top'`, `'bottom-left'`, etc.); edge positions also define the valid swipe-to-dismiss direction.\n- **`animation`** selects the motion style of the window: `'slide'` (default), `'3d'`, or `'custom'` (driven entirely by CSS custom properties).\n- **`interaction`** governs how forgiving dismissal is - `'relaxed'` allows backdrop clicks, `'strict'` requires the close button.\n- **`overflow`** chooses whether the component manages body scroll locking (`'auto'`) or leaves it to the consumer (`'manual'`).\n- **`hideBackdrop`** removes the dimmed overlay behind the window (shown by default).\n",
19373
+ "2. Pattern": "Correct and idiomatic ways to use the `<mds-modal>` component, ordered from most common to most specialized. Patterns assume a working knowledge of the overlay conventions documented in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md) and the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n\n#### Basic Modal with Inline Content\n\nThe simplest form: toggle `opened` from JavaScript to show the dialog. The built-in close button and backdrop dismiss the modal automatically with `interaction=\"relaxed\"` (default). React to the `mdsModalClose` event to sync your state.\n\n```html\n<mds-button id=\"btn-apri\">Apri dialogo</mds-button>\n\n<mds-modal id=\"dialogo\">\n <div class=\"p-400\">\n <mds-text>Sei sicuro di voler continuare?</mds-text>\n </div>\n</mds-modal>\n\n<script>\n const btn = document.getElementById('btn-apri');\n const modal = document.getElementById('dialogo');\n btn.addEventListener('mdsButtonClick', () => { modal.opened = true; });\n modal.addEventListener('mdsModalClose', () => { modal.opened = undefined; });\n</script>\n```\n\n#### Fixed Header and Footer via `top` / `bottom` Slots\n\nUse the `top` slot for a sticky header and the `bottom` slot for a sticky footer (e.g. action buttons). The default slot renders scrollable body content between them.\n\n```html\n<mds-modal id=\"modifica-utente\" position=\"right\">\n <header slot=\"top\" class=\"p-400 bg-tone-neutral shadow-outline-light\">\n <mds-text typography=\"h5\">Modifica utente</mds-text>\n </header>\n\n <div class=\"p-400 grid gap-400\">\n <mds-input name=\"nome\" label=\"Nome\"></mds-input>\n <mds-input name=\"cognome\" label=\"Cognome\"></mds-input>\n </div>\n\n <footer slot=\"bottom\" class=\"p-400 flex gap-300 justify-end bg-tone-neutral shadow-outline-light\">\n <mds-button variant=\"dark\" tone=\"outline\" id=\"btn-annulla\">Annulla</mds-button>\n <mds-button variant=\"primary\" tone=\"strong\" id=\"btn-salva\">Salva</mds-button>\n </footer>\n</mds-modal>\n```\n\n#### Edge and Corner Positions\n\n`position` anchors the window to an edge or corner and drives the slide-in direction. Use `right` or `left` for side panels, `bottom` for mobile drawers.\n\n```html\n<!-- Side panel from the right (default in most app shells) -->\n<mds-modal id=\"pannello-laterale\" position=\"right\">\n <div class=\"p-400\">\n <mds-text>Dettagli del documento</mds-text>\n </div>\n</mds-modal>\n\n<!-- Drawer from the bottom (mobile) -->\n<mds-modal id=\"drawer-mobile\" position=\"bottom\">\n <div class=\"p-400\">\n <mds-text>Azioni disponibili</mds-text>\n </div>\n</mds-modal>\n```\n\n#### Strict Interaction Mode\n\nSet `interaction=\"strict\"` when the user must explicitly confirm or cancel before the dialog closes - for example, a form with unsaved changes. Backdrop clicks are ignored; only the close button or the `close()` method can dismiss the modal.\n\n```html\n<mds-modal id=\"conferma-elimina\" interaction=\"strict\">\n <div class=\"p-400 grid gap-400\">\n <mds-text typography=\"h5\">Eliminare il documento?</mds-text>\n <mds-text>Questa operazione non e' reversibile.</mds-text>\n <div class=\"flex gap-300 justify-end\">\n <mds-button variant=\"dark\" tone=\"outline\" id=\"btn-no\">Annulla</mds-button>\n <mds-button variant=\"error\" tone=\"strong\" id=\"btn-si\">Elimina</mds-button>\n </div>\n </div>\n</mds-modal>\n\n<script>\n document.getElementById('btn-no').addEventListener('mdsButtonClick', () => {\n document.getElementById('conferma-elimina').close();\n });\n</script>\n```\n\n#### Programmatic Close via `close()` Method\n\nCall the async `close()` method from JavaScript when you need to dismiss the modal from outside its UI - for example, after a successful async operation.\n\n```html\n<mds-modal id=\"salvataggio\">\n <div class=\"p-400\">\n <mds-text>Salvataggio in corso...</mds-text>\n </div>\n</mds-modal>\n\n<script>\n async function salva() {\n const modal = document.getElementById('salvataggio');\n modal.opened = true;\n await salvaRisorsa();\n await modal.close();\n }\n</script>\n```\n\n#### Listening to Animation Events\n\n`mdsModalShow` fires when the intro animation completes (the modal is fully visible). Use it to focus the first interactive element. `mdsModalHide` fires when the outro animation completes; use it to detach the element or reset content.\n\n```html\n<mds-modal id=\"modal-focus\" position=\"right\">\n <div class=\"p-400\">\n <mds-input id=\"input-ricerca\" label=\"Cerca\"></mds-input>\n </div>\n</mds-modal>\n\n<script>\n const modal = document.getElementById('modal-focus');\n const input = document.getElementById('input-ricerca');\n\n modal.addEventListener('mdsModalShow', () => {\n input.setFocus();\n });\n modal.addEventListener('mdsModalHide', () => {\n // safe point to detach or reset content\n modal.opened = undefined;\n });\n</script>\n```\n\n#### Custom Animation Styles\n\n`animation` selects the motion style. `'slide'` (default) translates from the entry edge; `'3d'` adds a perspective tilt; `'custom'` delegates entirely to the CSS custom properties `--mds-modal-custom-closed-transform` and `--mds-modal-custom-window-distance`.\n\n```html\n<!-- 3D perspective tilt animation -->\n<mds-modal id=\"modal-3d\" animation=\"3d\" position=\"center\">\n <div class=\"p-400\">\n <mds-text>Animazione 3D</mds-text>\n </div>\n</mds-modal>\n\n<!-- Custom animation driven by CSS vars -->\n<mds-modal id=\"modal-custom\" animation=\"custom\" position=\"center\">\n <div class=\"p-400\">\n <mds-text>Animazione personalizzata</mds-text>\n </div>\n</mds-modal>\n```\n\n#### Custom Window via `window` Slot\n\nSlot any element with `slot=\"window\"` to completely replace the built-in chrome (the white window surface and the close button). The slotted element receives `role=\"dialog\"` automatically. Use this when a completely bespoke surface is needed - for example, a full-screen banner.\n\n```html\n<mds-modal id=\"modal-banner\" animation=\"custom\">\n <mds-banner\n slot=\"window\"\n class=\"max-w-md w-full mx-400\"\n tone=\"box\"\n deletable\n headline=\"Azione richiesta\"\n >\n <mds-text typography=\"detail\">Conferma la tua identita' per procedere.</mds-text>\n <mds-button slot=\"actions\" variant=\"primary\" tone=\"text\">Annulla</mds-button>\n <mds-button slot=\"actions\" variant=\"primary\" tone=\"strong\">Conferma</mds-button>\n </mds-banner>\n</mds-modal>\n```\n\n#### Disabling the Backdrop\n\nAdd `hide-backdrop` to render the modal without the dimmed overlay - useful for non-blocking side panels that coexist with interactive page content.\n\n```html\n<mds-modal id=\"pannello-info\" position=\"right\" hide-backdrop>\n <div class=\"p-400\">\n <mds-text>Informazioni contestuali</mds-text>\n </div>\n</mds-modal>\n```\n\n```javascript\n// Remove the backdrop at runtime\ndocument.getElementById('pannello-info').hideBackdrop = true;\n```\n\n#### CSS Customization\n\nStyle the window surface only through the documented `--mds-modal-*` CSS custom properties. Set them on the host element.\n\n```css\n/* Rounded card-style center modal */\n#modal-card {\n --mds-modal-window-radius: var(--radius-xl);\n --mds-modal-window-distance: var(--spacing-600);\n --mds-modal-window-overflow: hidden;\n --mds-modal-window-background: rgb(var(--tone-neutral));\n --mds-modal-window-shadow: var(--shadow-2xl);\n --mds-modal-window-max-width: 480px;\n}\n\n/* Full-width drawer */\n#drawer-bottom {\n --mds-modal-window-radius: var(--radius-lg) var(--radius-lg) 0 0;\n --mds-modal-window-max-width: 100%;\n --mds-modal-window-min-width: 100%;\n}\n```\n",
19374
+ "3. Antipattern": "Common incorrect uses of `<mds-modal>`. Each entry pairs the wrong form with the right one and a one-line reason. System-wide rules (boolean-as-string, shadow piercing, Tailwind color utilities, raw native event listening) live in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md#system-level-anti-patterns) - they apply here too but are not repeated.\n\n#### Do Not Set `opened=\"false\"` to Close the Modal\n\nBoolean props in Stencil treat any non-empty string as truthy. Setting `opened=\"false\"` keeps the modal open instead of closing it. Remove the attribute or set the prop to `undefined`.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-modal id=\"dialogo\" opened=\"false\"></mds-modal>\n\n<!-- ✅ CORRECT -->\n<mds-modal id=\"dialogo\"></mds-modal>\n```\n\n```javascript\n// 🚫 INCORRECT\nmodal.opened = false;\n\n// ✅ CORRECT\nmodal.opened = undefined;\n```\n\n#### Do Not Put Content in the `window` Slot Without Replacing the Entire Chrome\n\nThe `window` slot completely bypasses the built-in surface, header/footer regions, and close button. Do not use it to add a header element while expecting the default content area and close button to still render - they will not.\n\n```html\n<!-- 🚫 INCORRECT: only the slotted header renders; default slot and close button are suppressed -->\n<mds-modal id=\"modal\">\n <header slot=\"window\" class=\"p-400\">Titolo</header>\n <div>Contenuto del dialogo</div>\n</mds-modal>\n\n<!-- ✅ CORRECT: use slot=\"top\" for a sticky header, default slot for body -->\n<mds-modal id=\"modal\">\n <header slot=\"top\" class=\"p-400 bg-tone-neutral\">Titolo</header>\n <div class=\"p-400\">Contenuto del dialogo</div>\n</mds-modal>\n```\n\n#### Do Not Reach Into Shadow Parts to Style the Window\n\nThe only supported customization surface is `--mds-modal-*` CSS custom properties and the two documented shadow parts (`window`, `action-close`). Targeting internal shadow selectors couples your code to implementation details that will break on minor releases.\n\n```css\n/* 🚫 INCORRECT */\nmds-modal >>> .window-content {\n padding: 0;\n}\nmds-modal::part(window) > div {\n border: 2px solid red;\n}\n\n/* ✅ CORRECT */\nmds-modal {\n --mds-modal-window-background: rgb(var(--tone-neutral));\n --mds-modal-window-radius: var(--radius-xl);\n --mds-modal-window-distance: var(--spacing-400);\n}\n```\n\n#### Do Not Listen for Native `click` on the Backdrop to Close\n\n`mds-modal` emits `mdsModalClose` when it closes (and `mdsModalHide` when the animation finishes). Listening for a raw `click` on the host or backdrop is fragile - the event target varies by browser and shadow DOM boundary, and `interaction=\"strict\"` will silently break your handler.\n\n```javascript\n// 🚫 INCORRECT\ndocument.getElementById('modal').addEventListener('click', (e) => {\n if (e.target === e.currentTarget) modal.opened = undefined;\n});\n\n// ✅ CORRECT\ndocument.getElementById('modal').addEventListener('mdsModalClose', () => {\n modal.opened = undefined;\n});\n```\n\n#### Do Not Skip the `close()` Method When Dismissing Programmatically from Strict Modals\n\nWhen `interaction=\"strict\"` is set, the internal `closeModal` guard prevents backdrop-click dismissal. Manually setting `opened = undefined` bypasses the guard but skips the `mdsModalClose` event and animation teardown. Use the `close()` method instead.\n\n```javascript\n// 🚫 INCORRECT (skips event emission when interaction=\"strict\")\ndocument.getElementById('modal-strict').opened = undefined;\n\n// ✅ CORRECT\nawait document.getElementById('modal-strict').close();\n```\n\n#### Do Not Use `<dialog>` Directly When `<mds-modal>` Is Available\n\nUsing a raw `<dialog>` element bypasses the system's managed animation, body-scroll locking, touch-swipe dismissal, and design-token theming. Always use `<mds-modal>` for overlays in a Magma application.\n\n```html\n<!-- 🚫 INCORRECT -->\n<dialog id=\"raw-dialog\">\n <p>Contenuto del dialogo</p>\n <button>Chiudi</button>\n</dialog>\n\n<!-- ✅ CORRECT -->\n<mds-modal id=\"modal\">\n <div class=\"p-400\">\n <mds-text>Contenuto del dialogo</mds-text>\n </div>\n</mds-modal>\n```\n"
19420
19375
  },
19421
19376
  "props": [
19422
- {
19423
- "name": "animating",
19424
- "type": "\"intro\" | \"none\" | \"outro\" | undefined",
19425
- "complexType": {
19426
- "original": "ModalAnimationStateType",
19427
- "resolved": "\"intro\" | \"none\" | \"outro\" | undefined",
19428
- "references": {
19429
- "ModalAnimationStateType": {
19430
- "location": "import",
19431
- "path": "./meta/types",
19432
- "id": "src/components/mds-modal/meta/types.ts::ModalAnimationStateType",
19433
- "referenceLocation": "ModalAnimationStateType"
19434
- }
19435
- }
19436
- },
19437
- "mutable": true,
19438
- "attr": "animating",
19439
- "reflectToAttr": true,
19440
- "docs": "Specifies if the component is animating itself or not",
19441
- "docsTags": [
19442
- {
19443
- "name": "default",
19444
- "text": "'none'"
19445
- }
19446
- ],
19447
- "default": "'none'",
19448
- "values": [
19449
- {
19450
- "value": "intro",
19451
- "type": "string"
19452
- },
19453
- {
19454
- "value": "none",
19455
- "type": "string"
19456
- },
19457
- {
19458
- "value": "outro",
19459
- "type": "string"
19460
- },
19461
- {
19462
- "type": "undefined"
19463
- }
19464
- ],
19465
- "optional": true,
19466
- "required": false,
19467
- "getter": false,
19468
- "setter": false
19469
- },
19470
19377
  {
19471
19378
  "name": "animation",
19472
19379
  "type": "\"3d\" | \"custom\" | \"slide\" | undefined",
@@ -19485,7 +19392,7 @@
19485
19392
  "mutable": false,
19486
19393
  "attr": "animation",
19487
19394
  "reflectToAttr": true,
19488
- "docs": "Specifies if the component is animating itself or not",
19395
+ "docs": "Specifies the animation style of the modal window",
19489
19396
  "docsTags": [
19490
19397
  {
19491
19398
  "name": "default",
@@ -19516,7 +19423,7 @@
19516
19423
  "setter": false
19517
19424
  },
19518
19425
  {
19519
- "name": "backdrop",
19426
+ "name": "hideBackdrop",
19520
19427
  "type": "boolean | undefined",
19521
19428
  "complexType": {
19522
19429
  "original": "boolean",
@@ -19524,16 +19431,16 @@
19524
19431
  "references": {}
19525
19432
  },
19526
19433
  "mutable": true,
19527
- "attr": "backdrop",
19434
+ "attr": "hide-backdrop",
19528
19435
  "reflectToAttr": true,
19529
- "docs": "Specifies if the modal shows the backdrop",
19436
+ "docs": "Hides the modal backdrop",
19530
19437
  "docsTags": [
19531
19438
  {
19532
19439
  "name": "default",
19533
- "text": "true"
19440
+ "text": "false"
19534
19441
  }
19535
19442
  ],
19536
- "default": "true",
19443
+ "default": "false",
19537
19444
  "values": [
19538
19445
  {
19539
19446
  "type": "boolean"
@@ -19912,6 +19819,10 @@
19912
19819
  "name": "action-close",
19913
19820
  "docs": "Selects the close button of the modal."
19914
19821
  },
19822
+ {
19823
+ "name": "dialog",
19824
+ "docs": ""
19825
+ },
19915
19826
  {
19916
19827
  "name": "window",
19917
19828
  "docs": "Selects the default window element of the modal when used."
@@ -20180,15 +20091,44 @@
20180
20091
  "filePath": "src/components/mds-notification/mds-notification.tsx",
20181
20092
  "encapsulation": "shadow",
20182
20093
  "tag": "mds-notification",
20183
- "readme": "# mds-notification\n\n<!-- Start script-generated Magma Docs -->\n\n# Install\n\nInstall the component via `npm` by running the following command\n\n```bash\nnpm install @maggioli-design-system/mds-notification\n```\n\nThis package works also with yarn:\n\n```bash\nyarn add @maggioli-design-system/mds-notification\n```\n\n#### Import\n\nImport the components in your project via `TypeScript` as follows:\n\n```typescript\nimport { defineCustomElements as dceMdsNotification } from '@maggioli-design-system/mds-notification/loader'\n\ndceMdsNotification()\n```\n\n`MdsNotification` depends on `MdsText`, so you will have to import it as well:\n\n```typescript\nimport { defineCustomElements as dceMdsText } from '@maggioli-design-system/mds-text/loader'\n\ndceMdsText()\n```\n\nYou will have to import also the css style from `@maggioli-design-system` as follows:\n\n```css\n@import '~@maggioli-design-system/styles/dist/css/colors-rgb.css`\n```\n\nIf you need to support older browsers (i.e. IE or early version of Edge), you can wrap the `defineCustomElements` in another utility awailable in the same package:\n\n```typescript\nimport { applyPolyfills as apMdsNotification, defineCustomElements as dceMdsNotification } from '@maggioli-design-system/mds-notification/loader'\n\napMdsNotification().then(dceMdsNotification())\n```\n\nUse alias for `defineCustomElements` method to initialize multiple web components in the same place:\n\n```typescript\nimport { defineCustomElements as dceMdsComponentOne } from '@maggioli-design-system/mds-component-one/loader'\nimport { defineCustomElements as dceMdsComponentTwo } from '@maggioli-design-system/mds-component-two/loader'\n\ndceMdsComponentOne()\ndceMdsComponentTwo()\n```\n\nYou can check how browser support works at [this page][stencil-browser-support].\n\n# Integration\n\n<!-- This section is useful to describe usages and configurations -->\n\n#### How to use it in HTML\n\n`MdsNotification` is meant to be used to support another HTML component (like an icon or a button) to notify the user of pending notifications.\n\nThe component accepts the following attributes:\n- `target`: (mandatory) specifies the id of the element to which is attached\n- `value`: specifies the number of notification to display (if set to the element will be hidden)\n- `visible`: specifies if the notification should be visible or not\n\n```html\n<mds-notification target='my-button' value=22 visible=true></mds-notification>\n<button id='my-button'>Click here!</button>\n```\n\nYou can try it out on the component's [Storybook website][storybook]!\n\n[storybook]: https://magma.maggiolicloud.it/storybook/?path=/story/ui-notification--default\n[stencil-browser-support]: https://stenciljs.com/docs/browser-support\n\n<!-- End script-generated Magma Docs -->\n\nThis is a web-component from Maggioli Design System [Magma](https://magma.maggiolicloud.it), built with StencilJS, TypeScript, Storybook. It's based on the web-component standard and it's designed to be agnostic from the JavaScript framework you are using.\n",
20094
+ "readme": "# mds-notification\n\n<!-- Start script-generated Magma Docs -->\n\n# Install\n\nInstall the component via `npm` by running the following command\n\n```bash\nnpm install @maggioli-design-system/mds-notification\n```\n\nThis package works also with yarn:\n\n```bash\nyarn add @maggioli-design-system/mds-notification\n```\n\n#### Import\n\nImport the components in your project via `TypeScript` as follows:\n\n```typescript\nimport { defineCustomElements as dceMdsNotification } from '@maggioli-design-system/mds-notification/loader'\n\ndceMdsNotification()\n```\n\n`MdsNotification` depends on `MdsText`, so you will have to import it as well:\n\n```typescript\nimport { defineCustomElements as dceMdsText } from '@maggioli-design-system/mds-text/loader'\n\ndceMdsText()\n```\n\nYou will have to import also the css style from `@maggioli-design-system` as follows:\n\n```css\n@import '~@maggioli-design-system/styles/dist/css/colors-rgb.css`\n```\n\nIf you need to support older browsers (i.e. IE or early version of Edge), you can wrap the `defineCustomElements` in another utility awailable in the same package:\n\n```typescript\nimport { applyPolyfills as apMdsNotification, defineCustomElements as dceMdsNotification } from '@maggioli-design-system/mds-notification/loader'\n\napMdsNotification().then(dceMdsNotification())\n```\n\nUse alias for `defineCustomElements` method to initialize multiple web components in the same place:\n\n```typescript\nimport { defineCustomElements as dceMdsComponentOne } from '@maggioli-design-system/mds-component-one/loader'\nimport { defineCustomElements as dceMdsComponentTwo } from '@maggioli-design-system/mds-component-two/loader'\n\ndceMdsComponentOne()\ndceMdsComponentTwo()\n```\n\nYou can check how browser support works at [this page][stencil-browser-support].\n\n# Integration\n\n<!-- This section is useful to describe usages and configurations -->\n\n#### How to use it in HTML\n\n`MdsNotification` is meant to be used to support another HTML component (like an icon or a button) to notify the user of pending notifications.\n\nThe component accepts the following attributes:\n- `target`: (mandatory) specifies the id of the element to which is attached\n- `value`: specifies the number of notification to display (if set to `0` the badge is hidden)\n- `dismissed`: specifies if the notification is dismissed (hidden); the badge is shown by default\n\n```html\n<mds-notification target='my-button' value=22></mds-notification>\n<button id='my-button'>Click here!</button>\n```\n\nYou can try it out on the component's [Storybook website][storybook]!\n\n[storybook]: https://magma.maggiolicloud.it/storybook/?path=/story/ui-notification--default\n[stencil-browser-support]: https://stenciljs.com/docs/browser-support\n\n<!-- End script-generated Magma Docs -->\n\nThis is a web-component from Maggioli Design System [Magma](https://magma.maggiolicloud.it), built with StencilJS, TypeScript, Storybook. It's based on the web-component standard and it's designed to be agnostic from the JavaScript framework you are using.\n",
20184
20095
  "docs": "<!-- Start script-generated Magma Docs -->",
20185
20096
  "docsTags": [],
20186
20097
  "usage": {
20187
- "1. Description": "The `<mds-notification>` web component is a numeric badge/dot indicator of the Magma Design System that attaches to another element (an icon, a button, an avatar) to signal a count of pending items. It has no HTML primitive equivalent: it positions itself relative to a target element rather than wrapping content of its own.\n\n#### Semantic Behavior\n\n- **Target attachment**: The component anchors to the element matched by the `target` selector and tracks it as it scrolls or resizes.\n- **Missing target falls back**: If `target` is not set, positioning is disabled; if `target` is set but resolves to no element, it throws `No valid target found`.\n- **Zero-value hiding**: When `value` is `0` the badge renders empty, so it effectively disappears until there is a count to show.\n- **Count overflow**: When `max` is set and `value` exceeds it, the displayed text becomes `+max` (e.g. `+9`) instead of the raw number; otherwise the value is locale-formatted.\n- **Accessibility**: The badge labels its target with the current value.\n\n#### Properties & Visual Configurations\n\n- **`target`** is the CSS selector of the element the badge anchors to; it is effectively mandatory for positioned rendering.\n- **`value`** is the count shown in the badge and also the source of the accessible label; `0` hides the badge.\n- **`max`** caps the visible number - pick it when raw counts could grow large and you want a compact `+N` ceiling.\n- **`visible`** toggles whether the badge is shown independently of its value.\n\n#### Other behavioral props\n\n- **`strategy`** selects the positioning mode (`'fixed'` by default, `'absolute'`, or `'disabled'`). Use `'disabled'` to opt out of dynamic tracking; it is also set automatically when no `target` is provided.\n",
20188
- "2. Pattern": "Correct and idiomatic ways to use the `<mds-notification>` component, ordered from most common to most specialized. Patterns assume a working knowledge of the variant / tone ladders documented in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md) and the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n\n#### Badge Inside `mds-button` via Named Slot\n\nThe most common usage. Drop `<mds-notification>` into the `notification` slot of [`mds-button`](../../mds-button) so the badge is positioned and animated automatically by the button's internal layout. Set `strategy=\"disabled\"` because the button handles placement; the component is no longer responsible for floating positioning.\n\n```html\n<mds-button label=\"Messaggi\" icon=\"mdi/email\" variant=\"secondary\" tone=\"weak\">\n <mds-notification slot=\"notification\" value=\"5\" strategy=\"disabled\"></mds-notification>\n</mds-button>\n```\n\n#### Floating Badge Anchored to an Arbitrary Element\n\nUse the `target` prop with a CSS selector to attach a floating badge to any element on the page. The component uses `position: fixed` by default and tracks the target through scroll and resize automatically.\n\n```html\n<mds-notification target=\"#icona-notifiche\" value=\"12\"></mds-notification>\n<mds-icon id=\"icona-notifiche\" name=\"mi/baseline/notifications\"></mds-icon>\n```\n\n#### Count Overflow via `max`\n\nWhen raw counts can grow large, set `max` to cap the visible number. Values above the cap display as `+max` (e.g. `+99`), keeping the badge compact.\n\n```html\n<mds-notification target=\"#posta-in-arrivo\" value=\"127\" max=\"99\"></mds-notification>\n<mds-icon id=\"posta-in-arrivo\" name=\"mi/baseline/mail\"></mds-icon>\n```\n\n#### Hiding and Showing the Badge\n\nUse the `visible` prop to show or hide the badge independently of its count. This is useful when the notification state is known but should not be displayed yet - for example while a panel is already open.\n\n```html\n<!-- Badge nascosto anche se ha un valore -->\n<mds-notification target=\"#avatar-utente\" value=\"3\" visible=\"false\"></mds-notification>\n\n<!-- Badge visibile (valore predefinito) -->\n<mds-notification target=\"#avatar-utente\" value=\"3\"></mds-notification>\n```\n\n#### Zero Value Produces an Empty Dot\n\nWhen `value` is `0` the badge renders without a number, appearing as a plain dot. Use this when you need a presence indicator without a count - for example to signal new activity without exposing a specific number.\n\n```html\n<mds-notification target=\"#attivita-recente\" value=\"0\"></mds-notification>\n<mds-button id=\"attivita-recente\" label=\"Attivita\" variant=\"secondary\" tone=\"weak\"></mds-button>\n```\n\n#### Absolute Positioning Strategy\n\nUse `strategy=\"absolute\"` when the badge must be positioned relative to a scrolling container rather than the viewport. The target element must have `position: relative` (or another non-static position) set on its nearest containing block.\n\n```html\n<div style=\"position: relative; overflow: auto;\">\n <mds-notification target=\"#elemento-lista\" value=\"2\" strategy=\"absolute\"></mds-notification>\n <mds-button id=\"elemento-lista\" label=\"Documenti\" variant=\"secondary\"></mds-button>\n</div>\n```\n\n#### Disabled Strategy for Manual Placement\n\nUse `strategy=\"disabled\"` when you want to position the badge yourself with utility classes or CSS instead of delegating to the floating-UI engine. This is the right choice whenever the badge lives inside a slot (the slot's host already controls layout) or when you use Tailwind position utilities.\n\n```html\n<mds-button label=\"Avvisi\" icon=\"mi/baseline/notifications\" variant=\"primary\" tone=\"strong\">\n <mds-notification\n slot=\"notification\"\n value=\"4\"\n strategy=\"disabled\"\n ></mds-notification>\n</mds-button>\n```\n\n#### Styling Customization via CSS Custom Properties\n\nCustomize the badge only through the documented `--mds-notification-*` CSS custom properties. Set them on the host element or a parent selector. Use the Magma color tokens with `rgb(var(--<token>))` so dark mode and high-contrast stay consistent.\n\n```css\n/* Colore di sfondo personalizzato, cerchio senza bordo */\n.header-nav mds-notification {\n --mds-notification-dot-background: rgb(var(--status-warning-05));\n --mds-notification-color: rgb(var(--tone-kaolin-10));\n --mds-notification-ring-size: 0px;\n --mds-notification-size: 18px;\n}\n```\n",
20189
- "3. Antipattern": "Common incorrect uses of `<mds-notification>`. Each entry pairs the wrong form with the right one and a one-line reason. System-wide rules (boolean-as-string, shadow piercing, Tailwind color utilities, raw native event listening) live in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md#system-level-anti-patterns) - they apply here too but are not repeated.\n\n#### Do Not Use a Floating Strategy When Slotted Inside `mds-button`\n\nWhen `<mds-notification>` sits inside the `notification` slot of [`mds-button`](../../mds-button), the button's own layout handles placement. Keeping `strategy=\"fixed\"` (the default) causes the badge to escape the slot and position itself relative to the viewport instead.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-button label=\"Messaggi\" icon=\"mdi/email\" variant=\"secondary\">\n <mds-notification slot=\"notification\" value=\"5\"></mds-notification>\n</mds-button>\n\n<!-- ✅ CORRECT -->\n<mds-button label=\"Messaggi\" icon=\"mdi/email\" variant=\"secondary\">\n <mds-notification slot=\"notification\" value=\"5\" strategy=\"disabled\"></mds-notification>\n</mds-button>\n```\n\n#### Do Not Omit `target` When Using a Floating Strategy\n\nWithout `target`, the component cannot locate its anchor, automatically falls back to `strategy=\"disabled\"`, and renders in document flow wherever the tag appears - usually in the wrong place.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-notification value=\"3\"></mds-notification>\n<mds-icon id=\"icona-posta\" name=\"mi/baseline/mail\"></mds-icon>\n\n<!-- ✅ CORRECT -->\n<mds-notification target=\"#icona-posta\" value=\"3\"></mds-notification>\n<mds-icon id=\"icona-posta\" name=\"mi/baseline/mail\"></mds-icon>\n```\n\n#### Do Not Set `visible=\"false\"` to Hide the Badge When the Count Is Zero\n\nSetting `value=\"0\"` already collapses the visible dot. Mixing `visible=\"false\"` (a string, not a boolean) with a non-zero value also triggers the boolean-as-string system anti-pattern: the string `\"false\"` is truthy in HTML and the component will not treat it as `false`.\n\n```html\n<!-- 🚫 INCORRECT - boolean passed as string -->\n<mds-notification target=\"#elemento\" value=\"0\" visible=\"false\"></mds-notification>\n\n<!-- ✅ CORRECT - remove the attribute or let value=0 do the work -->\n<mds-notification target=\"#elemento\" value=\"0\"></mds-notification>\n```\n\n#### Do Not Use `<mds-notification>` as a Status Dot Without a Count\n\n`<mds-notification>` is a numeric counter badge. For a purely visual status indicator with no count, use [`mds-badge`](../../mds-badge) instead, which is designed for dot, icon, and label status scenarios.\n\n```html\n<!-- 🚫 INCORRECT - abusing notification as a plain dot indicator -->\n<mds-notification target=\"#utente-online\" value=\"0\"></mds-notification>\n\n<!-- ✅ CORRECT - use mds-badge for status dots -->\n<mds-badge variant=\"success\"></mds-badge>\n```\n\n#### Do Not Wrap the Target in a Relative Container and Use `strategy=\"fixed\"`\n\n`strategy=\"fixed\"` anchors the badge to the viewport coordinate system. If the target sits inside a CSS-transformed or `position: relative` parent, `fixed` positioning will not track it correctly. Switch to `strategy=\"absolute\"` and ensure the containing block has a non-static position.\n\n```html\n<!-- 🚫 INCORRECT - fixed badge inside transformed container -->\n<div style=\"transform: translateX(0);\">\n <mds-notification target=\"#btn-azioni\" value=\"2\" strategy=\"fixed\"></mds-notification>\n <mds-button id=\"btn-azioni\" label=\"Azioni\"></mds-button>\n</div>\n\n<!-- ✅ CORRECT - absolute strategy with positioned containing block -->\n<div style=\"position: relative;\">\n <mds-notification target=\"#btn-azioni\" value=\"2\" strategy=\"absolute\"></mds-notification>\n <mds-button id=\"btn-azioni\" label=\"Azioni\"></mds-button>\n</div>\n```\n\n#### Do Not Pierce Shadow DOM to Style the Inner Dot\n\nThe internal `.dot` element is not a documented `::part()`. Targeting it with `::part(dot)` or deep-selector hacks breaks on any internal refactor. Use the documented `--mds-notification-*` CSS custom properties instead.\n\n```css\n/* 🚫 INCORRECT */\nmds-notification::part(dot) {\n background-color: purple;\n}\n\n/* ✅ CORRECT */\nmds-notification {\n --mds-notification-dot-background: rgb(var(--status-warning-05));\n}\n```\n"
20098
+ "1. Description": "The `<mds-notification>` web component is a numeric badge/dot indicator of the Magma Design System that attaches to another element (an icon, a button, an avatar) to signal a count of pending items. It has no HTML primitive equivalent: it positions itself relative to a target element rather than wrapping content of its own.\n\n#### Semantic Behavior\n\n- **Target attachment**: The component anchors to the element matched by the `target` selector and tracks it as it scrolls or resizes.\n- **Missing target falls back**: If `target` is not set, positioning is disabled; if `target` is set but resolves to no element, it throws `No valid target found`.\n- **Zero-value hiding**: When `value` is `0` the badge renders empty, so it effectively disappears until there is a count to show.\n- **Count overflow**: When `max` is set and `value` exceeds it, the displayed text becomes `+max` (e.g. `+9`) instead of the raw number; otherwise the value is locale-formatted.\n- **Accessibility**: The badge labels its target with the current value.\n\n#### Properties & Visual Configurations\n\n- **`target`** is the CSS selector of the element the badge anchors to; it is effectively mandatory for positioned rendering.\n- **`value`** is the count shown in the badge and also the source of the accessible label; `0` hides the badge.\n- **`max`** caps the visible number - pick it when raw counts could grow large and you want a compact `+N` ceiling.\n- **`dismissed`** hides the badge independently of its value (the badge is shown by default).\n\n#### Other behavioral props\n\n- **`strategy`** selects the positioning mode (`'fixed'` by default, `'absolute'`, or `'disabled'`). Use `'disabled'` to opt out of dynamic tracking; it is also set automatically when no `target` is provided.\n",
20099
+ "2. Pattern": "Correct and idiomatic ways to use the `<mds-notification>` component, ordered from most common to most specialized. Patterns assume a working knowledge of the variant / tone ladders documented in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md) and the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n\n#### Badge Inside `mds-button` via Named Slot\n\nThe most common usage. Drop `<mds-notification>` into the `notification` slot of [`mds-button`](../../mds-button) so the badge is positioned and animated automatically by the button's internal layout. Set `strategy=\"disabled\"` because the button handles placement; the component is no longer responsible for floating positioning.\n\n```html\n<mds-button label=\"Messaggi\" icon=\"mdi/email\" variant=\"secondary\" tone=\"weak\">\n <mds-notification slot=\"notification\" value=\"5\" strategy=\"disabled\"></mds-notification>\n</mds-button>\n```\n\n#### Floating Badge Anchored to an Arbitrary Element\n\nUse the `target` prop with a CSS selector to attach a floating badge to any element on the page. The component uses `position: fixed` by default and tracks the target through scroll and resize automatically.\n\n```html\n<mds-notification target=\"#icona-notifiche\" value=\"12\"></mds-notification>\n<mds-icon id=\"icona-notifiche\" name=\"mi/baseline/notifications\"></mds-icon>\n```\n\n#### Count Overflow via `max`\n\nWhen raw counts can grow large, set `max` to cap the visible number. Values above the cap display as `+max` (e.g. `+99`), keeping the badge compact.\n\n```html\n<mds-notification target=\"#posta-in-arrivo\" value=\"127\" max=\"99\"></mds-notification>\n<mds-icon id=\"posta-in-arrivo\" name=\"mi/baseline/mail\"></mds-icon>\n```\n\n#### Hiding and Showing the Badge\n\nAdd the `dismissed` prop to hide the badge independently of its count. This is useful when the notification state is known but should not be displayed yet - for example while a panel is already open.\n\n```html\n<!-- Badge nascosto anche se ha un valore -->\n<mds-notification target=\"#avatar-utente\" value=\"3\" dismissed></mds-notification>\n\n<!-- Badge visibile (valore predefinito) -->\n<mds-notification target=\"#avatar-utente\" value=\"3\"></mds-notification>\n```\n\n#### Zero Value Produces an Empty Dot\n\nWhen `value` is `0` the badge renders without a number, appearing as a plain dot. Use this when you need a presence indicator without a count - for example to signal new activity without exposing a specific number.\n\n```html\n<mds-notification target=\"#attivita-recente\" value=\"0\"></mds-notification>\n<mds-button id=\"attivita-recente\" label=\"Attivita\" variant=\"secondary\" tone=\"weak\"></mds-button>\n```\n\n#### Absolute Positioning Strategy\n\nUse `strategy=\"absolute\"` when the badge must be positioned relative to a scrolling container rather than the viewport. The target element must have `position: relative` (or another non-static position) set on its nearest containing block.\n\n```html\n<div style=\"position: relative; overflow: auto;\">\n <mds-notification target=\"#elemento-lista\" value=\"2\" strategy=\"absolute\"></mds-notification>\n <mds-button id=\"elemento-lista\" label=\"Documenti\" variant=\"secondary\"></mds-button>\n</div>\n```\n\n#### Disabled Strategy for Manual Placement\n\nUse `strategy=\"disabled\"` when you want to position the badge yourself with utility classes or CSS instead of delegating to the floating-UI engine. This is the right choice whenever the badge lives inside a slot (the slot's host already controls layout) or when you use Tailwind position utilities.\n\n```html\n<mds-button label=\"Avvisi\" icon=\"mi/baseline/notifications\" variant=\"primary\" tone=\"strong\">\n <mds-notification\n slot=\"notification\"\n value=\"4\"\n strategy=\"disabled\"\n ></mds-notification>\n</mds-button>\n```\n\n#### Styling Customization via CSS Custom Properties\n\nCustomize the badge only through the documented `--mds-notification-*` CSS custom properties. Set them on the host element or a parent selector. Use the Magma color tokens with `rgb(var(--<token>))` so dark mode and high-contrast stay consistent.\n\n```css\n/* Colore di sfondo personalizzato, cerchio senza bordo */\n.header-nav mds-notification {\n --mds-notification-dot-background: rgb(var(--status-warning-05));\n --mds-notification-color: rgb(var(--tone-kaolin-10));\n --mds-notification-ring-size: 0px;\n --mds-notification-size: 18px;\n}\n```\n",
20100
+ "3. Antipattern": "Common incorrect uses of `<mds-notification>`. Each entry pairs the wrong form with the right one and a one-line reason. System-wide rules (boolean-as-string, shadow piercing, Tailwind color utilities, raw native event listening) live in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md#system-level-anti-patterns) - they apply here too but are not repeated.\n\n#### Do Not Use a Floating Strategy When Slotted Inside `mds-button`\n\nWhen `<mds-notification>` sits inside the `notification` slot of [`mds-button`](../../mds-button), the button's own layout handles placement. Keeping `strategy=\"fixed\"` (the default) causes the badge to escape the slot and position itself relative to the viewport instead.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-button label=\"Messaggi\" icon=\"mdi/email\" variant=\"secondary\">\n <mds-notification slot=\"notification\" value=\"5\"></mds-notification>\n</mds-button>\n\n<!-- ✅ CORRECT -->\n<mds-button label=\"Messaggi\" icon=\"mdi/email\" variant=\"secondary\">\n <mds-notification slot=\"notification\" value=\"5\" strategy=\"disabled\"></mds-notification>\n</mds-button>\n```\n\n#### Do Not Omit `target` When Using a Floating Strategy\n\nWithout `target`, the component cannot locate its anchor, automatically falls back to `strategy=\"disabled\"`, and renders in document flow wherever the tag appears - usually in the wrong place.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-notification value=\"3\"></mds-notification>\n<mds-icon id=\"icona-posta\" name=\"mi/baseline/mail\"></mds-icon>\n\n<!-- ✅ CORRECT -->\n<mds-notification target=\"#icona-posta\" value=\"3\"></mds-notification>\n<mds-icon id=\"icona-posta\" name=\"mi/baseline/mail\"></mds-icon>\n```\n\n#### Do Not Use `<mds-notification>` as a Status Dot Without a Count\n\n`<mds-notification>` is a numeric counter badge. For a purely visual status indicator with no count, use [`mds-badge`](../../mds-badge) instead, which is designed for dot, icon, and label status scenarios.\n\n```html\n<!-- 🚫 INCORRECT - abusing notification as a plain dot indicator -->\n<mds-notification target=\"#utente-online\" value=\"0\"></mds-notification>\n\n<!-- ✅ CORRECT - use mds-badge for status dots -->\n<mds-badge variant=\"success\"></mds-badge>\n```\n\n#### Do Not Wrap the Target in a Relative Container and Use `strategy=\"fixed\"`\n\n`strategy=\"fixed\"` anchors the badge to the viewport coordinate system. If the target sits inside a CSS-transformed or `position: relative` parent, `fixed` positioning will not track it correctly. Switch to `strategy=\"absolute\"` and ensure the containing block has a non-static position.\n\n```html\n<!-- 🚫 INCORRECT - fixed badge inside transformed container -->\n<div style=\"transform: translateX(0);\">\n <mds-notification target=\"#btn-azioni\" value=\"2\" strategy=\"fixed\"></mds-notification>\n <mds-button id=\"btn-azioni\" label=\"Azioni\"></mds-button>\n</div>\n\n<!-- ✅ CORRECT - absolute strategy with positioned containing block -->\n<div style=\"position: relative;\">\n <mds-notification target=\"#btn-azioni\" value=\"2\" strategy=\"absolute\"></mds-notification>\n <mds-button id=\"btn-azioni\" label=\"Azioni\"></mds-button>\n</div>\n```\n\n#### Do Not Pierce Shadow DOM to Style the Inner Dot\n\nThe internal `.dot` element is not a documented `::part()`. Targeting it with `::part(dot)` or deep-selector hacks breaks on any internal refactor. Use the documented `--mds-notification-*` CSS custom properties instead.\n\n```css\n/* 🚫 INCORRECT */\nmds-notification::part(dot) {\n background-color: purple;\n}\n\n/* ✅ CORRECT */\nmds-notification {\n --mds-notification-dot-background: rgb(var(--status-warning-05));\n}\n```\n"
20190
20101
  },
20191
20102
  "props": [
20103
+ {
20104
+ "name": "dismissed",
20105
+ "type": "boolean",
20106
+ "complexType": {
20107
+ "original": "boolean",
20108
+ "resolved": "boolean",
20109
+ "references": {}
20110
+ },
20111
+ "mutable": true,
20112
+ "attr": "dismissed",
20113
+ "reflectToAttr": true,
20114
+ "docs": "Specifies if the notification is dismissed",
20115
+ "docsTags": [
20116
+ {
20117
+ "name": "default",
20118
+ "text": "false"
20119
+ }
20120
+ ],
20121
+ "default": "false",
20122
+ "values": [
20123
+ {
20124
+ "type": "boolean"
20125
+ }
20126
+ ],
20127
+ "optional": false,
20128
+ "required": false,
20129
+ "getter": false,
20130
+ "setter": false
20131
+ },
20192
20132
  {
20193
20133
  "name": "max",
20194
20134
  "type": "number | undefined",
@@ -20311,35 +20251,6 @@
20311
20251
  "required": false,
20312
20252
  "getter": false,
20313
20253
  "setter": false
20314
- },
20315
- {
20316
- "name": "visible",
20317
- "type": "boolean",
20318
- "complexType": {
20319
- "original": "boolean",
20320
- "resolved": "boolean",
20321
- "references": {}
20322
- },
20323
- "mutable": true,
20324
- "attr": "visible",
20325
- "reflectToAttr": true,
20326
- "docs": "Specifies if the notification is visible",
20327
- "docsTags": [
20328
- {
20329
- "name": "default",
20330
- "text": "true"
20331
- }
20332
- ],
20333
- "default": "true",
20334
- "values": [
20335
- {
20336
- "type": "boolean"
20337
- }
20338
- ],
20339
- "optional": false,
20340
- "required": false,
20341
- "getter": false,
20342
- "setter": false
20343
20254
  }
20344
20255
  ],
20345
20256
  "methods": [],
@@ -23956,9 +23867,9 @@
23956
23867
  }
23957
23868
  ],
23958
23869
  "usage": {
23959
- "1. Description": "The `<mds-push-notification-item>` web component is a single notification card rendered inside its parent container [`<mds-push-notification>`](../../mds-push-notification). It composes an avatar/image, a subject, a relative or formatted timestamp, a message body and an optional dismiss control into one toast-like row.\n\n#### Semantic Behavior\n\n- **Compound child only**: It must be placed as a direct default-slot child of `<mds-push-notification>`; it is not used standalone or mixed with other child types, since the parent animates intro/outro and manages stacking.\n- **Dismiss reports up, removal happens in the parent**: Clicking the built-in close button emits the bubbling `mdsPushNotificationItemClose` event; the parent runs the outro animation and removes the item. The item never removes itself.\n- **Parent-driven visibility lifecycle**: When the last item closes, the parent auto-hides the whole notification area.\n- **Timestamp rendering**: With `dateFormat=\"timeago\"` `datetime` shows a localized relative time (\"2 minutes ago\"); otherwise the value is treated as a date-format string for a static date.\n- **Localization**: The relative-time strings and the dismiss button title are localized (el/en/es/it).\n- **Conditional avatar vs. picture**: An `<mds-avatar>` is rendered when `icon` is set or `preview=\"avatar\"`; when `src` is set and `preview` is not `avatar`, a full-width `<mds-img>` preview is rendered instead.\n- **Slot detection**: The `badge` and `action` named slots are only wired into the layout when matching slotted children exist, so empty slots add no markup.\n\n#### Properties & Visual Configurations\n\n- **`deletable`** (default `true`): Controls whether the dismiss button is shown. Keep it on for user-removable notifications; set `false` for items the user should not close manually.\n- **`preview`**: Pick `avatar` to show the `src` image (or `initials`/`icon` fallback) as a compact round avatar, or `image` (default) to show `src` as a larger inline picture preview.\n- **`initials`**: Provided as the avatar fallback when no image is available; it overrides `tone`/`variant` styling so the user stays visually recognizable.\n- **`dateFormat`**: Use `timeago` for a live relative timestamp, or any date-format token string for a fixed display date.\n\nFor `tone` and `variant`, this component consumes the shared color ladders defined in [`projects/stencil/SPEC.md`](../../../../SPEC.md#tone-and-variant-system); the values are forwarded to the underlying `<mds-avatar>` and follow the avatar tone/variant set rather than adding component-specific values.\n",
23960
- "2. Pattern": "Correct and idiomatic ways to use the `<mds-push-notification-item>` component, ordered from most common to most specialized. Patterns assume a working knowledge of the variant / tone ladders documented in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md) and the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n\n#### Basic Message Notification\n\nThe minimal form: a message body with an icon and a relative timestamp. Always nest the item inside [`mds-push-notification`](../../mds-push-notification), which manages stacking and animation.\n\n```html\n<mds-push-notification>\n <mds-push-notification-item\n icon=\"mi/baseline/email\"\n subject=\"Nuovo messaggio\"\n message=\"Hai ricevuto 3 nuovi messaggi da account diversi\"\n datetime=\"2024-06-01T10:30:00\"\n ></mds-push-notification-item>\n</mds-push-notification>\n```\n\n#### Variant for Semantic Status\n\nUse `variant` to communicate meaning - success, warning, error, info - and `tone` to set visual weight. The values are forwarded to the internal `<mds-avatar>`.\n\n```html\n<mds-push-notification>\n <mds-push-notification-item\n icon=\"mi/baseline/check-circle\"\n subject=\"Salvataggio completato\"\n message=\"Il documento e' stato salvato con successo\"\n datetime=\"2024-06-01T10:31:00\"\n variant=\"success\"\n tone=\"strong\"\n ></mds-push-notification-item>\n\n <mds-push-notification-item\n icon=\"mi/baseline/warning\"\n subject=\"Attenzione\"\n message=\"La sessione scadra' tra 5 minuti\"\n datetime=\"2024-06-01T10:32:00\"\n variant=\"warning\"\n tone=\"weak\"\n ></mds-push-notification-item>\n</mds-push-notification>\n```\n\n#### Non-Dismissable Notification\n\nBind `deletable` to `false` via a framework or JavaScript property to hide the dismiss button for system notifications the user must not close manually.\n\n```html\n<!-- Framework binding (React / Angular / Vue) -->\n<mds-push-notification>\n <mds-push-notification-item\n icon=\"mi/baseline/info\"\n subject=\"Aggiornamento di sistema\"\n message=\"Il sistema verra' riavviato alle 23:00\"\n datetime=\"2024-06-01T09:00:00\"\n variant=\"info\"\n :deletable=\"false\"\n ></mds-push-notification-item>\n</mds-push-notification>\n```\n\n```javascript\n// Vanilla JS property assignment\nconst item = document.querySelector('mds-push-notification-item');\nitem.deletable = false;\n```\n\n#### Action Buttons via the `action` Slot\n\nSlot one or more `<mds-button>` elements into `slot=\"action\"` for in-notification CTAs. Use `size=\"sm\"` to keep the actions compact.\n\n```html\n<mds-push-notification>\n <mds-push-notification-item\n icon=\"mi/baseline/person\"\n subject=\"Mario Giannini\"\n message=\"Ciao, sono Mario, questo e' il mio contatto, buona giornata!\"\n datetime=\"2024-06-01T10:25:00\"\n variant=\"primary\"\n tone=\"strong\"\n >\n <mds-button slot=\"action\" variant=\"success\" tone=\"weak\" size=\"sm\" label=\"Accetta\"></mds-button>\n <mds-button slot=\"action\" variant=\"error\" tone=\"weak\" size=\"sm\" label=\"Ignora\"></mds-button>\n </mds-push-notification-item>\n</mds-push-notification>\n```\n\n#### Badge Label via the `badge` Slot\n\nSlot an `<mds-badge>` into `slot=\"badge\"` to show a category or type label above the subject line.\n\n```html\n<mds-push-notification>\n <mds-push-notification-item\n icon=\"mi/baseline/attach-file\"\n subject=\"Nuovo allegato\"\n message=\"Hai ricevuto un nuovo file allegato da Luca Bianchi\"\n datetime=\"2024-06-01T10:20:00\"\n variant=\"primary\"\n >\n <mds-badge slot=\"badge\" variant=\"amaranth\" tone=\"weak\">pdf</mds-badge>\n <mds-button slot=\"action\" tone=\"outline\" size=\"sm\" label=\"Scarica\"></mds-button>\n </mds-push-notification-item>\n</mds-push-notification>\n```\n\n#### Avatar Mode with Image\n\nSet `src` and `preview=\"avatar\"` to display a user photo as a round avatar instead of the default full-width image preview.\n\n```html\n<mds-push-notification>\n <mds-push-notification-item\n src=\"./avatar-sarah.jpeg\"\n preview=\"avatar\"\n subject=\"Sarah Ho\"\n message=\"Ciao, sono Sarah, questo e' il mio contatto, buona giornata!\"\n datetime=\"2024-06-01T10:15:00\"\n variant=\"primary\"\n tone=\"strong\"\n >\n <mds-button slot=\"action\" variant=\"success\" tone=\"weak\" size=\"sm\" label=\"Scrivi\"></mds-button>\n </mds-push-notification-item>\n</mds-push-notification>\n```\n\n#### Avatar Mode with Initials Fallback\n\nWhen no image is available, set `initials` and `preview=\"avatar\"`. The initials override `tone` and `variant` coloring so the user stays visually distinguishable.\n\n```html\n<mds-push-notification>\n <mds-push-notification-item\n initials=\"MG\"\n preview=\"avatar\"\n subject=\"Mario Giannini\"\n message=\"Ha modificato il documento condiviso\"\n datetime=\"2024-06-01T10:10:00\"\n ></mds-push-notification-item>\n</mds-push-notification>\n```\n\n#### Inline Image Preview\n\nOmit `preview=\"avatar\"` (or keep the default `image`) and supply `src` to show the image as a larger inline thumbnail - useful for file or media notifications.\n\n```html\n<mds-push-notification>\n <mds-push-notification-item\n src=\"./book-cover-01.webp\"\n subject=\"Anteprima immagine\"\n message=\"La copertina e' stata aggiornata\"\n datetime=\"2024-06-01T10:05:00\"\n ></mds-push-notification-item>\n</mds-push-notification>\n```\n\n#### Fixed Date Format\n\nUse any `dayjs`-compatible format string as `date-format` to show a static date instead of the default relative \"time ago\" display.\n\n```html\n<mds-push-notification>\n <mds-push-notification-item\n icon=\"mi/baseline/event\"\n subject=\"Promemoria riunione\"\n message=\"La riunione di progetto e' fissata per domani\"\n datetime=\"2024-06-01T09:00:00\"\n date-format=\"DD/MM/YYYY\"\n ></mds-push-notification-item>\n</mds-push-notification>\n```\n\n#### Listening to the Dismiss Event\n\nListen to `mdsPushNotificationItemClose` to handle cleanup when the user dismisses the item. The parent `<mds-push-notification>` does this automatically, but you can also add your own logic (e.g. marking the notification read in the server).\n\n```javascript\ndocument\n .querySelector('mds-push-notification-item')\n .addEventListener('mdsPushNotificationItemClose', (event) => {\n const { id } = event.detail;\n markNotificationRead(id);\n });\n```\n\n#### Styling Customization\n\nCustomize the item only through its documented `--mds-push-notification-item-*` CSS custom properties.\n\n```css\n.app-notifications mds-push-notification-item {\n --mds-push-notification-item-shadow: var(--shadow-md-sharp);\n --mds-push-notification-item-message-line-clamp: 3;\n --mds-push-notification-item-subject-line-clamp: 2;\n --mds-push-notification-item-icon-background-color: rgb(var(--variant-primary-03));\n --mds-push-notification-item-icon-color: rgb(var(--tone-neutral));\n}\n```\n",
23961
- "3. Antipattern": "Common incorrect uses of `<mds-push-notification-item>`. Each entry pairs the wrong form with the right one and a one-line reason. System-wide rules (boolean-as-string, shadow piercing, Tailwind color utilities, raw native event listening) live in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md#system-level-anti-patterns) - they apply here too but are not repeated.\n\n#### Do Not Use the Item Outside Its Parent\n\n`<mds-push-notification-item>` is a compound child that must live inside [`<mds-push-notification>`](../../mds-push-notification). The parent drives entry / exit animation, stacking, and auto-hide when the last item closes.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-push-notification-item\n icon=\"mi/baseline/email\"\n subject=\"Nuovo messaggio\"\n message=\"Hai ricevuto un nuovo messaggio\"\n></mds-push-notification-item>\n\n<!-- ✅ CORRECT -->\n<mds-push-notification>\n <mds-push-notification-item\n icon=\"mi/baseline/email\"\n subject=\"Nuovo messaggio\"\n message=\"Hai ricevuto un nuovo messaggio\"\n ></mds-push-notification-item>\n</mds-push-notification>\n```\n\n#### Do Not Rely on `deletable=\"false\"` in Plain HTML to Hide the Dismiss Button\n\nThe `deletable` prop defaults to `true`, so omitting the attribute still shows the dismiss button. To hide it, set the prop to `false` via a framework binding or a JavaScript property assignment - do not try to unset it by omitting the attribute.\n\n```html\n<!-- 🚫 INCORRECT - attribute absent but default is true, so dismiss button still shows -->\n<mds-push-notification-item\n subject=\"Aggiornamento di sistema\"\n message=\"Il sistema verra' riavviato alle 23:00\"\n></mds-push-notification-item>\n\n<!-- ✅ CORRECT - JavaScript property set to false -->\n```\n\n```javascript\n// Vanilla JS\ndocument.querySelector('mds-push-notification-item').deletable = false;\n```\n\n```html\n<!-- ✅ CORRECT - framework binding -->\n<mds-push-notification-item\n subject=\"Aggiornamento di sistema\"\n message=\"Il sistema verra' riavviato alle 23:00\"\n :deletable=\"false\"\n></mds-push-notification-item>\n```\n\n#### Do Not Put Content in the Default Slot\n\n`<mds-push-notification-item>` has no default slot. All text content goes through the `message` and `subject` props; interactive content goes into the named `action` or `badge` slots.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-push-notification-item>\n Hai un nuovo messaggio\n</mds-push-notification-item>\n\n<!-- ✅ CORRECT -->\n<mds-push-notification-item\n message=\"Hai un nuovo messaggio\"\n subject=\"Posta in arrivo\"\n></mds-push-notification-item>\n```\n\n#### Do Not Slot Arbitrary Content Into `action` Without `mds-button`\n\nThe `action` slot is designed for `<mds-button>` elements at `size=\"sm\"`. Slotting raw `<button>` or large components breaks layout alignment and loses Magma theming and keyboard semantics.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-push-notification-item subject=\"Richiesta\" message=\"Approva la richiesta di accesso\">\n <button slot=\"action\" class=\"btn\">Approva</button>\n</mds-push-notification-item>\n\n<!-- ✅ CORRECT -->\n<mds-push-notification-item subject=\"Richiesta\" message=\"Approva la richiesta di accesso\">\n <mds-button slot=\"action\" variant=\"success\" tone=\"weak\" size=\"sm\" label=\"Approva\"></mds-button>\n</mds-push-notification-item>\n```\n\n#### Do Not Mix `icon` and `src` With `preview=\"image\"`\n\nWhen `icon` is set, the component always renders an `<mds-avatar>` for the icon. If `src` is also set and `preview` is not `\"avatar\"`, a full-width `<mds-img>` is rendered as well - producing two media areas side by side, which is almost never the intended layout. Pick one visual mode per notification.\n\n```html\n<!-- 🚫 INCORRECT - both an icon avatar and a full-width image preview render simultaneously -->\n<mds-push-notification-item\n icon=\"mi/baseline/photo\"\n src=\"./cover.jpg\"\n preview=\"image\"\n subject=\"Nuova foto\"\n message=\"La copertina e' stata aggiornata\"\n></mds-push-notification-item>\n\n<!-- ✅ CORRECT - icon only, no image -->\n<mds-push-notification-item\n icon=\"mi/baseline/photo\"\n subject=\"Nuova foto\"\n message=\"La copertina e' stata aggiornata\"\n></mds-push-notification-item>\n\n<!-- ✅ CORRECT - image preview only, no icon -->\n<mds-push-notification-item\n src=\"./cover.jpg\"\n subject=\"Nuova foto\"\n message=\"La copertina e' stata aggiornata\"\n></mds-push-notification-item>\n```\n\n#### Do Not Listen for the Native `close` DOM Event\n\nThe component emits `mdsPushNotificationItemClose`, not a native `close`. Listening for `close` or `click` on the dismiss button will not fire reliably because the button is inside shadow DOM.\n\n```javascript\n// 🚫 INCORRECT\nelement.addEventListener('close', handler);\n\n// ✅ CORRECT\nelement.addEventListener('mdsPushNotificationItemClose', handler);\n```\n\n#### Customize via Documented Vars, Not Internal Selectors\n\nThe supported customization surface is `--mds-push-notification-item-*` CSS custom properties and documented shadow parts (`actions`, `content`, `picture`). Targeting shadow-DOM internals via `::part()` on undocumented parts or via `>>>` will break on minor releases.\n\n```css\n/* 🚫 INCORRECT */\nmds-push-notification-item::part(header) {\n font-weight: bold;\n}\nmds-push-notification-item >>> .message {\n color: red;\n}\n\n/* ✅ CORRECT */\nmds-push-notification-item {\n --mds-push-notification-item-message-line-clamp: 3;\n --mds-push-notification-item-shadow: var(--shadow-md-sharp);\n}\nmds-push-notification-item::part(content) {\n gap: var(--spacing-200);\n}\n```\n"
23870
+ "1. Description": "The `<mds-push-notification-item>` web component is a single notification card rendered inside its parent container [`<mds-push-notification>`](../../mds-push-notification). It composes an avatar/image, a subject, a relative or formatted timestamp, a message body and an optional dismiss control into one toast-like row.\n\n#### Semantic Behavior\n\n- **Compound child only**: It must be placed as a direct default-slot child of `<mds-push-notification>`; it is not used standalone or mixed with other child types, since the parent animates intro/outro and manages stacking.\n- **Dismiss reports up, removal happens in the parent**: Clicking the built-in close button emits the bubbling `mdsPushNotificationItemClose` event; the parent runs the outro animation and removes the item. The item never removes itself.\n- **Parent-driven visibility lifecycle**: When the last item closes, the parent auto-hides the whole notification area.\n- **Timestamp rendering**: With `dateFormat=\"timeago\"` `datetime` shows a localized relative time (\"2 minutes ago\"); otherwise the value is treated as a date-format string for a static date.\n- **Localization**: The relative-time strings and the dismiss button title are localized (el/en/es/it).\n- **Conditional avatar vs. picture**: An `<mds-avatar>` is rendered when `icon` is set or `preview=\"avatar\"`; when `src` is set and `preview` is not `avatar`, a full-width `<mds-img>` preview is rendered instead.\n- **Slot detection**: The `badge` and `action` named slots are only wired into the layout when matching slotted children exist, so empty slots add no markup.\n\n#### Properties & Visual Configurations\n\n- **`deletable`** (default `false`): Controls whether the dismiss button is shown. Add it to let the user close the notification manually; leave it off for items the user should not close.\n- **`preview`**: Pick `avatar` to show the `src` image (or `initials`/`icon` fallback) as a compact round avatar, or `image` (default) to show `src` as a larger inline picture preview.\n- **`initials`**: Provided as the avatar fallback when no image is available; it overrides `tone`/`variant` styling so the user stays visually recognizable.\n- **`dateFormat`**: Use `timeago` for a live relative timestamp, or any date-format token string for a fixed display date.\n\nFor `tone` and `variant`, this component consumes the shared color ladders defined in [`projects/stencil/SPEC.md`](../../../../SPEC.md#tone-and-variant-system); the values are forwarded to the underlying `<mds-avatar>` and follow the avatar tone/variant set rather than adding component-specific values.\n",
23871
+ "2. Pattern": "Correct and idiomatic ways to use the `<mds-push-notification-item>` component, ordered from most common to most specialized. Patterns assume a working knowledge of the variant / tone ladders documented in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md) and the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md).\n\n#### Basic Message Notification\n\nThe minimal form: a message body with an icon and a relative timestamp. Always nest the item inside [`mds-push-notification`](../../mds-push-notification), which manages stacking and animation.\n\n```html\n<mds-push-notification>\n <mds-push-notification-item\n icon=\"mi/baseline/email\"\n subject=\"Nuovo messaggio\"\n message=\"Hai ricevuto 3 nuovi messaggi da account diversi\"\n datetime=\"2024-06-01T10:30:00\"\n ></mds-push-notification-item>\n</mds-push-notification>\n```\n\n#### Variant for Semantic Status\n\nUse `variant` to communicate meaning - success, warning, error, info - and `tone` to set visual weight. The values are forwarded to the internal `<mds-avatar>`.\n\n```html\n<mds-push-notification>\n <mds-push-notification-item\n icon=\"mi/baseline/check-circle\"\n subject=\"Salvataggio completato\"\n message=\"Il documento e' stato salvato con successo\"\n datetime=\"2024-06-01T10:31:00\"\n variant=\"success\"\n tone=\"strong\"\n ></mds-push-notification-item>\n\n <mds-push-notification-item\n icon=\"mi/baseline/warning\"\n subject=\"Attenzione\"\n message=\"La sessione scadra' tra 5 minuti\"\n datetime=\"2024-06-01T10:32:00\"\n variant=\"warning\"\n tone=\"weak\"\n ></mds-push-notification-item>\n</mds-push-notification>\n```\n\n#### Dismissable Notification\n\nAdd the `deletable` attribute to show the dismiss button, letting the user close the notification manually. Without it the notification cannot be dismissed by the user - keep it off for system notifications the user must not close.\n\n```html\n<mds-push-notification>\n <mds-push-notification-item\n deletable\n icon=\"mi/baseline/email\"\n subject=\"Nuovo messaggio\"\n message=\"Hai ricevuto un nuovo messaggio\"\n datetime=\"2024-06-01T09:00:00\"\n variant=\"info\"\n ></mds-push-notification-item>\n</mds-push-notification>\n```\n\n#### Action Buttons via the `action` Slot\n\nSlot one or more `<mds-button>` elements into `slot=\"action\"` for in-notification CTAs. Use `size=\"sm\"` to keep the actions compact.\n\n```html\n<mds-push-notification>\n <mds-push-notification-item\n icon=\"mi/baseline/person\"\n subject=\"Mario Giannini\"\n message=\"Ciao, sono Mario, questo e' il mio contatto, buona giornata!\"\n datetime=\"2024-06-01T10:25:00\"\n variant=\"primary\"\n tone=\"strong\"\n >\n <mds-button slot=\"action\" variant=\"success\" tone=\"weak\" size=\"sm\" label=\"Accetta\"></mds-button>\n <mds-button slot=\"action\" variant=\"error\" tone=\"weak\" size=\"sm\" label=\"Ignora\"></mds-button>\n </mds-push-notification-item>\n</mds-push-notification>\n```\n\n#### Badge Label via the `badge` Slot\n\nSlot an `<mds-badge>` into `slot=\"badge\"` to show a category or type label above the subject line.\n\n```html\n<mds-push-notification>\n <mds-push-notification-item\n icon=\"mi/baseline/attach-file\"\n subject=\"Nuovo allegato\"\n message=\"Hai ricevuto un nuovo file allegato da Luca Bianchi\"\n datetime=\"2024-06-01T10:20:00\"\n variant=\"primary\"\n >\n <mds-badge slot=\"badge\" variant=\"amaranth\" tone=\"weak\">pdf</mds-badge>\n <mds-button slot=\"action\" tone=\"outline\" size=\"sm\" label=\"Scarica\"></mds-button>\n </mds-push-notification-item>\n</mds-push-notification>\n```\n\n#### Avatar Mode with Image\n\nSet `src` and `preview=\"avatar\"` to display a user photo as a round avatar instead of the default full-width image preview.\n\n```html\n<mds-push-notification>\n <mds-push-notification-item\n src=\"./avatar-sarah.jpeg\"\n preview=\"avatar\"\n subject=\"Sarah Ho\"\n message=\"Ciao, sono Sarah, questo e' il mio contatto, buona giornata!\"\n datetime=\"2024-06-01T10:15:00\"\n variant=\"primary\"\n tone=\"strong\"\n >\n <mds-button slot=\"action\" variant=\"success\" tone=\"weak\" size=\"sm\" label=\"Scrivi\"></mds-button>\n </mds-push-notification-item>\n</mds-push-notification>\n```\n\n#### Avatar Mode with Initials Fallback\n\nWhen no image is available, set `initials` and `preview=\"avatar\"`. The initials override `tone` and `variant` coloring so the user stays visually distinguishable.\n\n```html\n<mds-push-notification>\n <mds-push-notification-item\n initials=\"MG\"\n preview=\"avatar\"\n subject=\"Mario Giannini\"\n message=\"Ha modificato il documento condiviso\"\n datetime=\"2024-06-01T10:10:00\"\n ></mds-push-notification-item>\n</mds-push-notification>\n```\n\n#### Inline Image Preview\n\nOmit `preview=\"avatar\"` (or keep the default `image`) and supply `src` to show the image as a larger inline thumbnail - useful for file or media notifications.\n\n```html\n<mds-push-notification>\n <mds-push-notification-item\n src=\"./book-cover-01.webp\"\n subject=\"Anteprima immagine\"\n message=\"La copertina e' stata aggiornata\"\n datetime=\"2024-06-01T10:05:00\"\n ></mds-push-notification-item>\n</mds-push-notification>\n```\n\n#### Fixed Date Format\n\nUse any `dayjs`-compatible format string as `date-format` to show a static date instead of the default relative \"time ago\" display.\n\n```html\n<mds-push-notification>\n <mds-push-notification-item\n icon=\"mi/baseline/event\"\n subject=\"Promemoria riunione\"\n message=\"La riunione di progetto e' fissata per domani\"\n datetime=\"2024-06-01T09:00:00\"\n date-format=\"DD/MM/YYYY\"\n ></mds-push-notification-item>\n</mds-push-notification>\n```\n\n#### Listening to the Dismiss Event\n\nListen to `mdsPushNotificationItemClose` to handle cleanup when the user dismisses the item. The parent `<mds-push-notification>` does this automatically, but you can also add your own logic (e.g. marking the notification read in the server).\n\n```javascript\ndocument\n .querySelector('mds-push-notification-item')\n .addEventListener('mdsPushNotificationItemClose', (event) => {\n const { id } = event.detail;\n markNotificationRead(id);\n });\n```\n\n#### Styling Customization\n\nCustomize the item only through its documented `--mds-push-notification-item-*` CSS custom properties.\n\n```css\n.app-notifications mds-push-notification-item {\n --mds-push-notification-item-shadow: var(--shadow-md-sharp);\n --mds-push-notification-item-message-line-clamp: 3;\n --mds-push-notification-item-subject-line-clamp: 2;\n --mds-push-notification-item-icon-background-color: rgb(var(--variant-primary-03));\n --mds-push-notification-item-icon-color: rgb(var(--tone-neutral));\n}\n```\n",
23872
+ "3. Antipattern": "Common incorrect uses of `<mds-push-notification-item>`. Each entry pairs the wrong form with the right one and a one-line reason. System-wide rules (boolean-as-string, shadow piercing, Tailwind color utilities, raw native event listening) live in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md#system-level-anti-patterns) - they apply here too but are not repeated.\n\n#### Do Not Use the Item Outside Its Parent\n\n`<mds-push-notification-item>` is a compound child that must live inside [`<mds-push-notification>`](../../mds-push-notification). The parent drives entry / exit animation, stacking, and auto-hide when the last item closes.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-push-notification-item\n icon=\"mi/baseline/email\"\n subject=\"Nuovo messaggio\"\n message=\"Hai ricevuto un nuovo messaggio\"\n></mds-push-notification-item>\n\n<!-- ✅ CORRECT -->\n<mds-push-notification>\n <mds-push-notification-item\n icon=\"mi/baseline/email\"\n subject=\"Nuovo messaggio\"\n message=\"Hai ricevuto un nuovo messaggio\"\n ></mds-push-notification-item>\n</mds-push-notification>\n```\n\n#### Do Not Put Content in the Default Slot\n\n`<mds-push-notification-item>` has no default slot. All text content goes through the `message` and `subject` props; interactive content goes into the named `action` or `badge` slots.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-push-notification-item>\n Hai un nuovo messaggio\n</mds-push-notification-item>\n\n<!-- ✅ CORRECT -->\n<mds-push-notification-item\n message=\"Hai un nuovo messaggio\"\n subject=\"Posta in arrivo\"\n></mds-push-notification-item>\n```\n\n#### Do Not Slot Arbitrary Content Into `action` Without `mds-button`\n\nThe `action` slot is designed for `<mds-button>` elements at `size=\"sm\"`. Slotting raw `<button>` or large components breaks layout alignment and loses Magma theming and keyboard semantics.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-push-notification-item subject=\"Richiesta\" message=\"Approva la richiesta di accesso\">\n <button slot=\"action\" class=\"btn\">Approva</button>\n</mds-push-notification-item>\n\n<!-- ✅ CORRECT -->\n<mds-push-notification-item subject=\"Richiesta\" message=\"Approva la richiesta di accesso\">\n <mds-button slot=\"action\" variant=\"success\" tone=\"weak\" size=\"sm\" label=\"Approva\"></mds-button>\n</mds-push-notification-item>\n```\n\n#### Do Not Mix `icon` and `src` With `preview=\"image\"`\n\nWhen `icon` is set, the component always renders an `<mds-avatar>` for the icon. If `src` is also set and `preview` is not `\"avatar\"`, a full-width `<mds-img>` is rendered as well - producing two media areas side by side, which is almost never the intended layout. Pick one visual mode per notification.\n\n```html\n<!-- 🚫 INCORRECT - both an icon avatar and a full-width image preview render simultaneously -->\n<mds-push-notification-item\n icon=\"mi/baseline/photo\"\n src=\"./cover.jpg\"\n preview=\"image\"\n subject=\"Nuova foto\"\n message=\"La copertina e' stata aggiornata\"\n></mds-push-notification-item>\n\n<!-- ✅ CORRECT - icon only, no image -->\n<mds-push-notification-item\n icon=\"mi/baseline/photo\"\n subject=\"Nuova foto\"\n message=\"La copertina e' stata aggiornata\"\n></mds-push-notification-item>\n\n<!-- ✅ CORRECT - image preview only, no icon -->\n<mds-push-notification-item\n src=\"./cover.jpg\"\n subject=\"Nuova foto\"\n message=\"La copertina e' stata aggiornata\"\n></mds-push-notification-item>\n```\n\n#### Do Not Listen for the Native `close` DOM Event\n\nThe component emits `mdsPushNotificationItemClose`, not a native `close`. Listening for `close` or `click` on the dismiss button will not fire reliably because the button is inside shadow DOM.\n\n```javascript\n// 🚫 INCORRECT\nelement.addEventListener('close', handler);\n\n// ✅ CORRECT\nelement.addEventListener('mdsPushNotificationItemClose', handler);\n```\n\n#### Customize via Documented Vars, Not Internal Selectors\n\nThe supported customization surface is `--mds-push-notification-item-*` CSS custom properties and documented shadow parts (`actions`, `content`, `picture`). Targeting shadow-DOM internals via `::part()` on undocumented parts or via `>>>` will break on minor releases.\n\n```css\n/* 🚫 INCORRECT */\nmds-push-notification-item::part(header) {\n font-weight: bold;\n}\nmds-push-notification-item >>> .message {\n color: red;\n}\n\n/* ✅ CORRECT */\nmds-push-notification-item {\n --mds-push-notification-item-message-line-clamp: 3;\n --mds-push-notification-item-shadow: var(--shadow-md-sharp);\n}\nmds-push-notification-item::part(content) {\n gap: var(--spacing-200);\n}\n```\n"
23962
23873
  },
23963
23874
  "props": [
23964
23875
  {
@@ -24034,14 +23945,14 @@
24034
23945
  "mutable": true,
24035
23946
  "attr": "deletable",
24036
23947
  "reflectToAttr": true,
24037
- "docs": "Specifies if the component is dismissable or not, it should be set to true by default is used with it's parent component `mds-push-notification-items`",
23948
+ "docs": "Specifies if the component is dismissable; when set, a dismiss button is shown.",
24038
23949
  "docsTags": [
24039
23950
  {
24040
23951
  "name": "default",
24041
- "text": "true"
23952
+ "text": "false"
24042
23953
  }
24043
23954
  ],
24044
- "default": "true",
23955
+ "default": "false",
24045
23956
  "values": [
24046
23957
  {
24047
23958
  "type": "boolean"
@@ -27564,6 +27475,44 @@
27564
27475
  "3. Antipattern": "Common incorrect uses of `<mds-tab-item>`. Each entry pairs the wrong form with the right one and a one-line reason. System-wide rules (boolean-as-string, shadow piercing, Tailwind color utilities, raw native event listening) live in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md#system-level-anti-patterns) - they apply here too but are not repeated.\n\n#### Do Not Use `<mds-tab-item>` Outside `<mds-tab>`\n\nThe item communicates with its parent through Stencil's internal listener (`mdsTabItemSelect`); used standalone it has no tab-switching behavior and no aria context.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-tab-item label=\"Dettagli\" selected></mds-tab-item>\n\n<!-- ✅ CORRECT -->\n<mds-tab>\n <mds-tab-item label=\"Dettagli\" selected></mds-tab-item>\n <div slot=\"content\"><p>Contenuto dei dettagli.</p></div>\n</mds-tab>\n```\n\n#### Do Not Wrap `<mds-tab-item>` in a Div or Other Element\n\nThe parent queries direct children with `querySelectorAll('mds-tab-item')`; a wrapper breaks the slot pairing between items and content panels.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-tab>\n <div class=\"tab-group\">\n <mds-tab-item label=\"Uno\" selected></mds-tab-item>\n <mds-tab-item label=\"Due\"></mds-tab-item>\n </div>\n <div slot=\"content\">...</div>\n <div slot=\"content\">...</div>\n</mds-tab>\n\n<!-- ✅ CORRECT -->\n<mds-tab>\n <mds-tab-item label=\"Uno\" selected></mds-tab-item>\n <mds-tab-item label=\"Due\"></mds-tab-item>\n <div slot=\"content\">...</div>\n <div slot=\"content\">...</div>\n</mds-tab>\n```\n\n#### Do Not Set `selected=\"false\"` to Deselect\n\n`selected` is a boolean attribute; the string `\"false\"` is truthy in HTML and will keep the item selected. Remove the attribute entirely to deselect.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-tab-item label=\"Archivio\" selected=\"false\"></mds-tab-item>\n\n<!-- ✅ CORRECT -->\n<mds-tab-item label=\"Archivio\"></mds-tab-item>\n```\n\n#### Do Not Slot `<mds-icon>` or HTML to Add an Icon\n\n`<mds-tab-item>` has no documented default slot for content; it is a button-like leaf element. Use the `icon` prop to add a glyph.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-tab-item>\n <mds-icon name=\"mi/baseline/settings\"></mds-icon>\n Impostazioni\n</mds-tab-item>\n\n<!-- ✅ CORRECT -->\n<mds-tab-item label=\"Impostazioni\" icon=\"mi/baseline/settings\"></mds-tab-item>\n```\n\n#### Do Not Override `size` on Individual Items When a Parent Size Is Set\n\nThe parent pushes its `size` down to every child item on load and whenever `size` changes. Setting `size` on individual items is overwritten and creates confusion about the source of truth.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-tab size=\"sm\">\n <mds-tab-item label=\"Uno\" size=\"lg\" selected></mds-tab-item>\n <mds-tab-item label=\"Due\" size=\"sm\"></mds-tab-item>\n <div slot=\"content\">...</div>\n <div slot=\"content\">...</div>\n</mds-tab>\n\n<!-- ✅ CORRECT -->\n<mds-tab size=\"sm\">\n <mds-tab-item label=\"Uno\" selected></mds-tab-item>\n <mds-tab-item label=\"Due\"></mds-tab-item>\n <div slot=\"content\">...</div>\n <div slot=\"content\">...</div>\n</mds-tab>\n```\n\n#### Do Not Pierce the Shadow DOM to Style the Inner Button\n\nThe only supported customization surface is the `--mds-tab-item-*` CSS custom properties and the documented `button` shadow part. Targeting internals via `::part(button) >>> .button` or undocumented selectors couples your code to the implementation.\n\n```css\n/* 🚫 INCORRECT */\nmds-tab-item::part(button) >>> .text {\n font-weight: 900;\n}\n\n/* ✅ CORRECT */\nmds-tab-item {\n --mds-tab-item-selected-background: rgb(var(--variant-primary-02));\n}\nmds-tab-item::part(button) {\n border-radius: var(--radius-lg);\n}\n```\n\n#### Do Not Mix Content Panels and Tab Items Without a 1-to-1 Pairing\n\nThe parent resolves each content panel by index, matching it to the `mds-tab-item` at the same position. A mismatch (more or fewer `slot=\"content\"` elements than tab items) silently shows the wrong panel.\n\n```html\n<!-- 🚫 INCORRECT - two items, one content panel -->\n<mds-tab>\n <mds-tab-item label=\"Uno\" selected></mds-tab-item>\n <mds-tab-item label=\"Due\"></mds-tab-item>\n <div slot=\"content\"><p>Contenuto unico.</p></div>\n</mds-tab>\n\n<!-- ✅ CORRECT - one content panel per tab item -->\n<mds-tab>\n <mds-tab-item label=\"Uno\" selected></mds-tab-item>\n <mds-tab-item label=\"Due\"></mds-tab-item>\n <div slot=\"content\"><p>Contenuto del tab Uno.</p></div>\n <div slot=\"content\"><p>Contenuto del tab Due.</p></div>\n</mds-tab>\n```\n"
27565
27476
  },
27566
27477
  "props": [
27478
+ {
27479
+ "name": "animation",
27480
+ "type": "\"fade\" | \"slide\" | undefined",
27481
+ "complexType": {
27482
+ "original": "HorizontalActionsAnimationType",
27483
+ "resolved": "\"fade\" | \"slide\" | undefined",
27484
+ "references": {
27485
+ "HorizontalActionsAnimationType": {
27486
+ "location": "import",
27487
+ "path": "@type/animation",
27488
+ "id": "src/type/animation.ts::HorizontalActionsAnimationType",
27489
+ "referenceLocation": "HorizontalActionsAnimationType"
27490
+ }
27491
+ }
27492
+ },
27493
+ "mutable": false,
27494
+ "attr": "animation",
27495
+ "reflectToAttr": true,
27496
+ "docs": "Reflects the parent tab selection animation (set by mds-tab); drives the\nslide-variant styling without :host-context",
27497
+ "docsTags": [],
27498
+ "values": [
27499
+ {
27500
+ "value": "fade",
27501
+ "type": "string"
27502
+ },
27503
+ {
27504
+ "value": "slide",
27505
+ "type": "string"
27506
+ },
27507
+ {
27508
+ "type": "undefined"
27509
+ }
27510
+ ],
27511
+ "optional": true,
27512
+ "required": false,
27513
+ "getter": false,
27514
+ "setter": false
27515
+ },
27567
27516
  {
27568
27517
  "name": "await",
27569
27518
  "type": "boolean",
@@ -27587,6 +27536,44 @@
27587
27536
  "getter": false,
27588
27537
  "setter": false
27589
27538
  },
27539
+ {
27540
+ "name": "direction",
27541
+ "type": "\"horizontal\" | \"vertical\" | undefined",
27542
+ "complexType": {
27543
+ "original": "DirectionType",
27544
+ "resolved": "\"horizontal\" | \"vertical\" | undefined",
27545
+ "references": {
27546
+ "DirectionType": {
27547
+ "location": "import",
27548
+ "path": "@component/mds-tab/meta/type",
27549
+ "id": "src/components/mds-tab/meta/type.ts::DirectionType",
27550
+ "referenceLocation": "DirectionType"
27551
+ }
27552
+ }
27553
+ },
27554
+ "mutable": false,
27555
+ "attr": "direction",
27556
+ "reflectToAttr": true,
27557
+ "docs": "Reflects the parent tab layout direction (set by mds-tab); drives the\nvertical layout without :host-context",
27558
+ "docsTags": [],
27559
+ "values": [
27560
+ {
27561
+ "value": "horizontal",
27562
+ "type": "string"
27563
+ },
27564
+ {
27565
+ "value": "vertical",
27566
+ "type": "string"
27567
+ },
27568
+ {
27569
+ "type": "undefined"
27570
+ }
27571
+ ],
27572
+ "optional": true,
27573
+ "required": false,
27574
+ "getter": false,
27575
+ "setter": false
27576
+ },
27590
27577
  {
27591
27578
  "name": "disabled",
27592
27579
  "type": "boolean | undefined",
@@ -29007,6 +28994,32 @@
29007
28994
  "getter": false,
29008
28995
  "setter": false
29009
28996
  },
28997
+ {
28998
+ "name": "selection",
28999
+ "type": "boolean | undefined",
29000
+ "complexType": {
29001
+ "original": "boolean",
29002
+ "resolved": "boolean | undefined",
29003
+ "references": {}
29004
+ },
29005
+ "mutable": false,
29006
+ "attr": "selection",
29007
+ "reflectToAttr": true,
29008
+ "docs": "Reflects the parent table selection state (set by mds-table); drives the\nrow action background without :host-context",
29009
+ "docsTags": [],
29010
+ "values": [
29011
+ {
29012
+ "type": "boolean"
29013
+ },
29014
+ {
29015
+ "type": "undefined"
29016
+ }
29017
+ ],
29018
+ "optional": true,
29019
+ "required": false,
29020
+ "getter": false,
29021
+ "setter": false
29022
+ },
29010
29023
  {
29011
29024
  "name": "value",
29012
29025
  "type": "number | string | undefined",
@@ -30198,13 +30211,13 @@
30198
30211
  }
30199
30212
  ],
30200
30213
  "usage": {
30201
- "1. Description": "The `<mds-tooltip>` web component is the floating contextual hint of the Magma Design System. It renders a small text bubble that attaches to a separate trigger element identified by a CSS selector, rather than relying on the native `title` attribute.\n\n#### Semantic Behavior\n\n- **Detached trigger model**: The tooltip is not wrapped around its trigger; the required `target` selector is resolved and the component binds itself to the first matching caller.\n- **Hover-driven visibility**: The bubble appears and disappears as the pointer enters and leaves the trigger.\n- **Visibility is the source of truth**: Setting `visible` programmatically shows or dismisses the bubble, allowing the tooltip to be controlled without a hover.\n- **Live repositioning**: Changing any layout prop (`placement`, `offset`, `shift`, `shiftPadding`, `strategy`, `flip`, `autoPlacement`, `arrow`) recomputes the floating position on the fly.\n- **Text-only default slot**: The default slot is meant for a plain text string (exposed as the `text` shadow part); HTML elements or components should not be slotted in.\n\n#### Properties & Visual Configurations\n\n- **`target`** (required) is the CSS selector of the trigger element the tooltip listens to and anchors against; the first match wins.\n- **`placement`** chooses the preferred side and alignment relative to the caller (e.g. `'top'`, `'bottom-start'`), while **`autoPlacement`** lets the system pick the best side automatically and **`flip`** allows falling back to the opposite side when the preferred one lacks space.\n- **`shift`** keeps the bubble inside the viewport, with **`shiftPadding`** reserving a safe gap from the viewport edges; **`offset`** sets the distance between the bubble and the caller.\n- **`strategy`** selects the CSS positioning strategy: `'fixed'` (default) escapes clipping ancestors, `'absolute'` anchors within the nearest positioned ancestor.\n- **`typography`** picks the text scale of the bubble (`'tip'`, `'caption'`, `'detail'`), where `'tip'` is the default compact hint sizing.\n",
30202
- "2. Pattern": "Correct and idiomatic ways to use the `<mds-tooltip>` component, ordered from most common to most specialized. Patterns assume a working knowledge of the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md) and the component catalogue in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md).\n\n#### Basic Tooltip on a Button\n\nThe most common form. Give the trigger element an `id` (or any unique CSS selector) and point `target` at it. The tooltip listens for hover events on the trigger and positions itself automatically.\n\n```html\n<mds-button id=\"salva-btn\" label=\"Salva documento\" variant=\"primary\" tone=\"strong\"></mds-button>\n<mds-tooltip target=\"#salva-btn\">Salva le modifiche correnti</mds-tooltip>\n```\n\n#### Tooltip on a Non-Interactive Element\n\n`target` accepts any CSS selector, not just `#id`. Use a class or attribute selector when the trigger is a static element such as a status icon.\n\n```html\n<mds-icon class=\"stato-icona\" name=\"mi/baseline/info\"></mds-icon>\n<mds-tooltip target=\".stato-icona\">Ultima sincronizzazione: oggi alle 08:30</mds-tooltip>\n```\n\n#### Placement and Preferred Side\n\nOverride the default `top` placement with `placement` when layout requires a different side. Set `auto-placement=\"false\"` to lock the side and prevent the system from overriding it.\n\n```html\n<mds-button id=\"dettagli-btn\" label=\"Dettagli\" variant=\"secondary\" tone=\"outline\"></mds-button>\n<mds-tooltip target=\"#dettagli-btn\" placement=\"right\" auto-placement=\"false\">\n Apre il pannello laterale con i dettagli completi\n</mds-tooltip>\n```\n\nAccepted values: `top`, `top-start`, `top-end`, `bottom`, `bottom-start`, `bottom-end`, `left`, `left-start`, `left-end`, `right`, `right-start`, `right-end`.\n\n#### Flip Fallback When Space is Tight\n\nEnable `flip` so the tooltip moves to the opposite side if the preferred placement collides with the viewport edge. Combine with `auto-placement=\"false\"` to keep a preferred side while allowing a single-axis fallback.\n\n```html\n<mds-button id=\"azione-btn\" label=\"Azione\" variant=\"primary\"></mds-button>\n<mds-tooltip target=\"#azione-btn\" placement=\"top\" auto-placement=\"false\" flip>\n Esegui l'operazione selezionata\n</mds-tooltip>\n```\n\n#### Viewport-Safe Shift\n\n`shift` (default `true`) slides the tooltip along its axis so it stays inside the viewport. Increase `shift-padding` to keep a wider safe margin from the viewport edges.\n\n```html\n<mds-button id=\"bordo-btn\" label=\"Vicino al bordo\" variant=\"dark\" tone=\"outline\"></mds-button>\n<mds-tooltip target=\"#bordo-btn\" shift shift-padding=\"24\">\n Questa azione e' irreversibile\n</mds-tooltip>\n```\n\n#### Custom Offset Distance\n\nIncrease `offset` when additional breathing room between the trigger and the bubble is required - for example inside dense toolbars or on elements with large focus rings.\n\n```html\n<mds-button id=\"info-btn\" label=\"Info\" variant=\"info\" tone=\"weak\"></mds-button>\n<mds-tooltip target=\"#info-btn\" offset=\"20\">\n Informazioni aggiuntive sul campo\n</mds-tooltip>\n```\n\n#### Programmatic Visibility\n\nSet the `visible` attribute (or property) to control the tooltip without hover. Useful for guided tours, onboarding hints, or error annotations that appear on demand.\n\n```html\n<mds-button id=\"primo-accesso\" label=\"Inizia\" variant=\"primary\"></mds-button>\n<mds-tooltip id=\"hint\" target=\"#primo-accesso\" visible>\n Benvenuto! Clicca qui per iniziare la configurazione.\n</mds-tooltip>\n\n<script>\n const hint = document.querySelector('#hint');\n // Dismiss programmatically when the user acknowledges the hint\n document.querySelector('#primo-accesso').addEventListener('click', () => {\n hint.visible = false;\n });\n</script>\n```\n\n#### Typography Scale\n\n`typography` adjusts the text scale inside the bubble. Use `'tip'` (default) for compact hints, `'caption'` for slightly larger labels, and `'detail'` for the smallest footnote-style text.\n\n```html\n<!-- Default compact hint -->\n<mds-tooltip target=\"#campo-nome\" typography=\"tip\">Massimo 64 caratteri</mds-tooltip>\n\n<!-- Slightly larger label -->\n<mds-tooltip target=\"#campo-data\" typography=\"caption\">Formato: GG/MM/AAAA</mds-tooltip>\n```\n\n#### Positioning Strategy\n\nUse `strategy=\"absolute\"` when the tooltip must be contained within a scrolling ancestor instead of the viewport. The default `strategy=\"fixed\"` escapes any clipping or overflow-hidden parent.\n\n```html\n<!-- Inside a scrollable panel with overflow:hidden ancestors -->\n<mds-tooltip target=\"#voce-lista\" strategy=\"absolute\">Trascina per riordinare</mds-tooltip>\n```\n\n#### Styling Customization\n\nStyle the tooltip only through its documented `--mds-tooltip-*` CSS custom properties. Set them on the host element or a parent selector; use the Magma color tokens via `rgb(var(--<token>))` so dark mode and high-contrast modes keep working.\n\n```css\n.onboarding-hint mds-tooltip {\n --mds-tooltip-background: rgb(var(--variant-primary-03));\n --mds-tooltip-arrow-background: rgb(var(--variant-primary-03));\n --mds-tooltip-delay: 0.25s;\n --mds-tooltip-duration: 0.3s;\n --mds-tooltip-z-index: 5000;\n}\n```\n",
30214
+ "1. Description": "The `<mds-tooltip>` web component is the floating contextual hint of the Magma Design System. It renders a small text bubble that attaches to a separate trigger element identified by a CSS selector, rather than relying on the native `title` attribute.\n\n#### Semantic Behavior\n\n- **Detached trigger model**: The tooltip is not wrapped around its trigger; the required `target` selector is resolved and the component binds itself to the first matching caller.\n- **Hover-driven visibility**: The bubble appears and disappears as the pointer enters and leaves the trigger.\n- **Visibility is the source of truth**: Setting `visible` programmatically shows or dismisses the bubble, allowing the tooltip to be controlled without a hover.\n- **Live repositioning**: Changing any layout prop (`placement`, `offset`, `disableShift`, `shiftPadding`, `strategy`, `flip`, `disableAutoPlacement`, `hideArrow`) recomputes the floating position on the fly.\n- **Text-only default slot**: The default slot is meant for a plain text string (exposed as the `text` shadow part); HTML elements or components should not be slotted in.\n\n#### Properties & Visual Configurations\n\n- **`target`** (required) is the CSS selector of the trigger element the tooltip listens to and anchors against; the first match wins.\n- **`placement`** chooses the preferred side and alignment relative to the caller (e.g. `'top'`, `'bottom-start'`); the system picks the best side automatically by default (**`disableAutoPlacement`** opts out and pins to `placement`) and **`flip`** allows falling back to the opposite side when the preferred one lacks space.\n- the bubble is kept inside the viewport by default (**`disableShift`** opts out), with **`shiftPadding`** reserving a safe gap from the viewport edges; **`offset`** sets the distance between the bubble and the caller.\n- **`strategy`** selects the CSS positioning strategy: `'fixed'` (default) escapes clipping ancestors, `'absolute'` anchors within the nearest positioned ancestor.\n- **`typography`** picks the text scale of the bubble (`'tip'`, `'caption'`, `'detail'`), where `'tip'` is the default compact hint sizing.\n",
30215
+ "2. Pattern": "Correct and idiomatic ways to use the `<mds-tooltip>` component, ordered from most common to most specialized. Patterns assume a working knowledge of the generic stencil rules in [`projects/stencil/SPEC.md`](../../../../SPEC.md) and the component catalogue in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md).\n\n#### Basic Tooltip on a Button\n\nThe most common form. Give the trigger element an `id` (or any unique CSS selector) and point `target` at it. The tooltip listens for hover events on the trigger and positions itself automatically.\n\n```html\n<mds-button id=\"salva-btn\" label=\"Salva documento\" variant=\"primary\" tone=\"strong\"></mds-button>\n<mds-tooltip target=\"#salva-btn\">Salva le modifiche correnti</mds-tooltip>\n```\n\n#### Tooltip on a Non-Interactive Element\n\n`target` accepts any CSS selector, not just `#id`. Use a class or attribute selector when the trigger is a static element such as a status icon.\n\n```html\n<mds-icon class=\"stato-icona\" name=\"mi/baseline/info\"></mds-icon>\n<mds-tooltip target=\".stato-icona\">Ultima sincronizzazione: oggi alle 08:30</mds-tooltip>\n```\n\n#### Placement and Preferred Side\n\nOverride the default `top` placement with `placement` when layout requires a different side. Add `disable-auto-placement` to lock the side and prevent the system from overriding it.\n\n```html\n<mds-button id=\"dettagli-btn\" label=\"Dettagli\" variant=\"secondary\" tone=\"outline\"></mds-button>\n<mds-tooltip target=\"#dettagli-btn\" placement=\"right\" disable-auto-placement>\n Apre il pannello laterale con i dettagli completi\n</mds-tooltip>\n```\n\nAccepted values: `top`, `top-start`, `top-end`, `bottom`, `bottom-start`, `bottom-end`, `left`, `left-start`, `left-end`, `right`, `right-start`, `right-end`.\n\n#### Flip Fallback When Space is Tight\n\nEnable `flip` so the tooltip moves to the opposite side if the preferred placement collides with the viewport edge. Combine with `disable-auto-placement` to keep a preferred side while allowing a single-axis fallback.\n\n```html\n<mds-button id=\"azione-btn\" label=\"Azione\" variant=\"primary\"></mds-button>\n<mds-tooltip target=\"#azione-btn\" placement=\"top\" disable-auto-placement flip>\n Esegui l'operazione selezionata\n</mds-tooltip>\n```\n\n#### Viewport-Safe Shift\n\nBy default the tooltip slides along its axis so it stays inside the viewport (set `disable-shift` to opt out). Increase `shift-padding` to keep a wider safe margin from the viewport edges.\n\n```html\n<mds-button id=\"bordo-btn\" label=\"Vicino al bordo\" variant=\"dark\" tone=\"outline\"></mds-button>\n<mds-tooltip target=\"#bordo-btn\" shift-padding=\"24\">\n Questa azione e' irreversibile\n</mds-tooltip>\n```\n\n#### Custom Offset Distance\n\nIncrease `offset` when additional breathing room between the trigger and the bubble is required - for example inside dense toolbars or on elements with large focus rings.\n\n```html\n<mds-button id=\"info-btn\" label=\"Info\" variant=\"info\" tone=\"weak\"></mds-button>\n<mds-tooltip target=\"#info-btn\" offset=\"20\">\n Informazioni aggiuntive sul campo\n</mds-tooltip>\n```\n\n#### Programmatic Visibility\n\nSet the `visible` attribute (or property) to control the tooltip without hover. Useful for guided tours, onboarding hints, or error annotations that appear on demand.\n\n```html\n<mds-button id=\"primo-accesso\" label=\"Inizia\" variant=\"primary\"></mds-button>\n<mds-tooltip id=\"hint\" target=\"#primo-accesso\" visible>\n Benvenuto! Clicca qui per iniziare la configurazione.\n</mds-tooltip>\n\n<script>\n const hint = document.querySelector('#hint');\n // Dismiss programmatically when the user acknowledges the hint\n document.querySelector('#primo-accesso').addEventListener('click', () => {\n hint.visible = false;\n });\n</script>\n```\n\n#### Typography Scale\n\n`typography` adjusts the text scale inside the bubble. Use `'tip'` (default) for compact hints, `'caption'` for slightly larger labels, and `'detail'` for the smallest footnote-style text.\n\n```html\n<!-- Default compact hint -->\n<mds-tooltip target=\"#campo-nome\" typography=\"tip\">Massimo 64 caratteri</mds-tooltip>\n\n<!-- Slightly larger label -->\n<mds-tooltip target=\"#campo-data\" typography=\"caption\">Formato: GG/MM/AAAA</mds-tooltip>\n```\n\n#### Positioning Strategy\n\nUse `strategy=\"absolute\"` when the tooltip must be contained within a scrolling ancestor instead of the viewport. The default `strategy=\"fixed\"` escapes any clipping or overflow-hidden parent.\n\n```html\n<!-- Inside a scrollable panel with overflow:hidden ancestors -->\n<mds-tooltip target=\"#voce-lista\" strategy=\"absolute\">Trascina per riordinare</mds-tooltip>\n```\n\n#### Styling Customization\n\nStyle the tooltip only through its documented `--mds-tooltip-*` CSS custom properties. Set them on the host element or a parent selector; use the Magma color tokens via `rgb(var(--<token>))` so dark mode and high-contrast modes keep working.\n\n```css\n.onboarding-hint mds-tooltip {\n --mds-tooltip-background: rgb(var(--variant-primary-03));\n --mds-tooltip-arrow-background: rgb(var(--variant-primary-03));\n --mds-tooltip-delay: 0.25s;\n --mds-tooltip-duration: 0.3s;\n --mds-tooltip-z-index: 5000;\n}\n```\n",
30203
30216
  "3. Antipattern": "Common incorrect uses of `<mds-tooltip>`. Each entry pairs the wrong form with the right one and a one-line reason. System-wide rules (boolean-as-string, shadow piercing, Tailwind color utilities, raw native event listening) live in [`docs/COMPONENTS.md`](../../../../../../docs/COMPONENTS.md#system-level-anti-patterns) - they apply here too but are not repeated.\n\n#### Do Not Use a Bare ID String as `target`\n\nBefore Magma 4.0 the `target` attribute accepted a bare id without the `#` prefix. This is no longer valid; the value is now passed directly to `querySelector`, so a CSS selector is required.\n\n```html\n<!-- 🚫 INCORRECT (Magma 3.x style) -->\n<span id=\"hint-trigger\">Aiuto</span>\n<mds-tooltip target=\"hint-trigger\">Testo di aiuto</mds-tooltip>\n\n<!-- ✅ CORRECT (Magma 4.x querySelector selector) -->\n<span id=\"hint-trigger\">Aiuto</span>\n<mds-tooltip target=\"#hint-trigger\">Testo di aiuto</mds-tooltip>\n```\n\n#### Do Not Slot HTML Elements or Components\n\nThe default slot is text-only. Nesting HTML elements or Magma components breaks the inner layout and may produce unexpected rendering because the slot is wrapped in `<mds-text>`.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-tooltip target=\"#voce\">\n <mds-icon name=\"mi/baseline/warning\"></mds-icon>\n <strong>Attenzione:</strong> campo obbligatorio\n</mds-tooltip>\n\n<!-- ✅ CORRECT -->\n<mds-tooltip target=\"#voce\">Attenzione: campo obbligatorio</mds-tooltip>\n```\n\n#### Do Not Wrap the Trigger Inside the Tooltip\n\n`<mds-tooltip>` uses a detached trigger model - the tooltip is placed as a sibling in the DOM and linked via `target`, not wrapped around its trigger. Nesting the trigger breaks the floating position logic.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-tooltip target=\"#btn\">\n <mds-button id=\"btn\" label=\"Elimina\"></mds-button>\n Elimina il record selezionato\n</mds-tooltip>\n\n<!-- ✅ CORRECT -->\n<mds-button id=\"btn\" label=\"Elimina\" variant=\"error\" tone=\"text\"></mds-button>\n<mds-tooltip target=\"#btn\">Elimina il record selezionato</mds-tooltip>\n```\n\n#### Do Not Set `visible=\"false\"` to Hide the Tooltip\n\n`visible` is a boolean attribute; setting it to the string `\"false\"` is truthy in HTML and keeps the tooltip visible. Remove the attribute (or set the property to `false`) to hide it.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-tooltip target=\"#campo\" visible=\"false\">Testo nascosto</mds-tooltip>\n\n<!-- ✅ CORRECT -->\n<mds-tooltip target=\"#campo\">Testo nascosto</mds-tooltip>\n```\n\n```js\n// ✅ CORRECT (programmatic)\ndocument.querySelector('mds-tooltip').visible = false;\n```\n\n#### Do Not Pierce the Shadow DOM to Style Internal Parts\n\nThe only supported customization surface is the set of `--mds-tooltip-*` CSS custom properties and the documented `text` shadow part. Targeting undocumented internal selectors couples your code to the implementation and will break on minor releases.\n\n```css\n/* 🚫 INCORRECT */\nmds-tooltip >>> .text {\n font-style: italic;\n}\nmds-tooltip::part(arrow) {\n fill: red;\n}\n\n/* ✅ CORRECT */\nmds-tooltip {\n --mds-tooltip-background: rgb(var(--variant-primary-03));\n --mds-tooltip-delay: 0.5s;\n}\nmds-tooltip::part(text) {\n font-style: italic;\n}\n```\n\n#### Do Not Replace `<mds-tooltip>` with a Native `title` Attribute\n\nThe native `title` tooltip is not keyboard-accessible, not styleable, and not announced consistently by screen readers on touch devices. Use `<mds-tooltip>` for all contextual hints.\n\n```html\n<!-- 🚫 INCORRECT -->\n<mds-button label=\"Elimina\" title=\"Elimina il record selezionato\"></mds-button>\n\n<!-- ✅ CORRECT -->\n<mds-button id=\"elimina-btn\" label=\"Elimina\" variant=\"error\" tone=\"text\"></mds-button>\n<mds-tooltip target=\"#elimina-btn\">Elimina il record selezionato</mds-tooltip>\n```\n"
30204
30217
  },
30205
30218
  "props": [
30206
30219
  {
30207
- "name": "autoPlacement",
30220
+ "name": "disableAutoPlacement",
30208
30221
  "type": "boolean",
30209
30222
  "complexType": {
30210
30223
  "original": "boolean",
@@ -30212,16 +30225,45 @@
30212
30225
  "references": {}
30213
30226
  },
30214
30227
  "mutable": false,
30215
- "attr": "auto-placement",
30228
+ "attr": "disable-auto-placement",
30216
30229
  "reflectToAttr": true,
30217
- "docs": "If set, the component will be placed automatically near it's caller.",
30230
+ "docs": "If set, the component will not be placed automatically near it's caller.",
30218
30231
  "docsTags": [
30219
30232
  {
30220
30233
  "name": "default",
30221
- "text": "true"
30234
+ "text": "false"
30222
30235
  }
30223
30236
  ],
30224
- "default": "true",
30237
+ "default": "false",
30238
+ "values": [
30239
+ {
30240
+ "type": "boolean"
30241
+ }
30242
+ ],
30243
+ "optional": false,
30244
+ "required": false,
30245
+ "getter": false,
30246
+ "setter": false
30247
+ },
30248
+ {
30249
+ "name": "disableShift",
30250
+ "type": "boolean",
30251
+ "complexType": {
30252
+ "original": "boolean",
30253
+ "resolved": "boolean",
30254
+ "references": {}
30255
+ },
30256
+ "mutable": false,
30257
+ "attr": "disable-shift",
30258
+ "reflectToAttr": false,
30259
+ "docs": "If set, the component will not be kept inside the viewport.",
30260
+ "docsTags": [
30261
+ {
30262
+ "name": "default",
30263
+ "text": "false"
30264
+ }
30265
+ ],
30266
+ "default": "false",
30225
30267
  "values": [
30226
30268
  {
30227
30269
  "type": "boolean"
@@ -30371,35 +30413,6 @@
30371
30413
  "getter": false,
30372
30414
  "setter": false
30373
30415
  },
30374
- {
30375
- "name": "shift",
30376
- "type": "boolean",
30377
- "complexType": {
30378
- "original": "boolean",
30379
- "resolved": "boolean",
30380
- "references": {}
30381
- },
30382
- "mutable": false,
30383
- "attr": "shift",
30384
- "reflectToAttr": false,
30385
- "docs": "If set, the component will be kept inside the viewport.",
30386
- "docsTags": [
30387
- {
30388
- "name": "default",
30389
- "text": "true"
30390
- }
30391
- ],
30392
- "default": "true",
30393
- "values": [
30394
- {
30395
- "type": "boolean"
30396
- }
30397
- ],
30398
- "optional": false,
30399
- "required": false,
30400
- "getter": false,
30401
- "setter": false
30402
- },
30403
30416
  {
30404
30417
  "name": "shiftPadding",
30405
30418
  "type": "number",
@@ -31195,6 +31208,44 @@
31195
31208
  "getter": false,
31196
31209
  "setter": false
31197
31210
  },
31211
+ {
31212
+ "name": "appearance",
31213
+ "type": "\"depth\" | \"none\" | undefined",
31214
+ "complexType": {
31215
+ "original": "TreeAppearance",
31216
+ "resolved": "\"depth\" | \"none\" | undefined",
31217
+ "references": {
31218
+ "TreeAppearance": {
31219
+ "location": "import",
31220
+ "path": "@type/tree",
31221
+ "id": "src/type/tree.ts::TreeAppearance",
31222
+ "referenceLocation": "TreeAppearance"
31223
+ }
31224
+ }
31225
+ },
31226
+ "mutable": false,
31227
+ "attr": "appearance",
31228
+ "reflectToAttr": true,
31229
+ "docs": "Reflects the parent tree appearance (set by mds-tree); drives the depth/none\nlayout without :host-context",
31230
+ "docsTags": [],
31231
+ "values": [
31232
+ {
31233
+ "value": "depth",
31234
+ "type": "string"
31235
+ },
31236
+ {
31237
+ "value": "none",
31238
+ "type": "string"
31239
+ },
31240
+ {
31241
+ "type": "undefined"
31242
+ }
31243
+ ],
31244
+ "optional": true,
31245
+ "required": false,
31246
+ "getter": false,
31247
+ "setter": false
31248
+ },
31198
31249
  {
31199
31250
  "name": "async",
31200
31251
  "type": "boolean | undefined",
@@ -31360,6 +31411,44 @@
31360
31411
  "getter": false,
31361
31412
  "setter": false
31362
31413
  },
31414
+ {
31415
+ "name": "togglePosition",
31416
+ "type": "\"left\" | \"right\" | undefined",
31417
+ "complexType": {
31418
+ "original": "ButtonIconPositionType",
31419
+ "resolved": "\"left\" | \"right\" | undefined",
31420
+ "references": {
31421
+ "ButtonIconPositionType": {
31422
+ "location": "import",
31423
+ "path": "@type/button",
31424
+ "id": "src/type/button.ts::ButtonIconPositionType",
31425
+ "referenceLocation": "ButtonIconPositionType"
31426
+ }
31427
+ }
31428
+ },
31429
+ "mutable": false,
31430
+ "attr": "toggle-position",
31431
+ "reflectToAttr": true,
31432
+ "docs": "Reflects the parent tree toggle icon position (set by mds-tree); drives the\ntoggle-icon layout without :host-context",
31433
+ "docsTags": [],
31434
+ "values": [
31435
+ {
31436
+ "value": "left",
31437
+ "type": "string"
31438
+ },
31439
+ {
31440
+ "value": "right",
31441
+ "type": "string"
31442
+ },
31443
+ {
31444
+ "type": "undefined"
31445
+ }
31446
+ ],
31447
+ "optional": true,
31448
+ "required": false,
31449
+ "getter": false,
31450
+ "setter": false
31451
+ },
31363
31452
  {
31364
31453
  "name": "truncate",
31365
31454
  "type": "\"all\" | \"none\" | \"word\" | undefined",
@@ -31432,6 +31521,28 @@
31432
31521
  "docs": "Expands the tree item, revealing its children.",
31433
31522
  "docsTags": []
31434
31523
  },
31524
+ {
31525
+ "name": "refreshActions",
31526
+ "returns": {
31527
+ "type": "Promise<void>",
31528
+ "docs": ""
31529
+ },
31530
+ "complexType": {
31531
+ "signature": "() => Promise<void>",
31532
+ "parameters": [],
31533
+ "references": {
31534
+ "Promise": {
31535
+ "location": "global",
31536
+ "id": "global::Promise"
31537
+ }
31538
+ },
31539
+ "return": "Promise<void>"
31540
+ },
31541
+ "signature": "refreshActions() => Promise<void>",
31542
+ "parameters": [],
31543
+ "docs": "`internal` Re-resolves the effective actions; called by mds-tree when its own\nactions changes so items that inherit it stay in sync.",
31544
+ "docsTags": []
31545
+ },
31435
31546
  {
31436
31547
  "name": "updateLang",
31437
31548
  "returns": {
@@ -32878,11 +32989,6 @@
32878
32989
  "docstring": "",
32879
32990
  "path": "src/components/mds-modal/meta/types.ts"
32880
32991
  },
32881
- "src/components/mds-modal/meta/types.ts::ModalAnimationStateType": {
32882
- "declaration": "export type ModalAnimationStateType = 'intro' | 'none' | 'outro';",
32883
- "docstring": "",
32884
- "path": "src/components/mds-modal/meta/types.ts"
32885
- },
32886
32992
  "src/components/mds-modal/meta/types.ts::ModalAnimationStyleType": {
32887
32993
  "declaration": "export type ModalAnimationStyleType = 'slide' | 'custom' | '3d';",
32888
32994
  "docstring": "",
@@ -32934,7 +33040,7 @@
32934
33040
  "path": "src/event-detail/preference.ts"
32935
33041
  },
32936
33042
  "src/type/preference.ts::ConsumptionModeType": {
32937
- "declaration": "\"high\" | \"medium\" | \"low\"",
33043
+ "declaration": "\"low\" | \"medium\" | \"high\"",
32938
33044
  "docstring": "",
32939
33045
  "path": "src/type/preference.ts"
32940
33046
  },
@@ -32954,7 +33060,7 @@
32954
33060
  "path": "src/type/preference.ts"
32955
33061
  },
32956
33062
  "src/type/preference.ts::PreferenceThemeTransitionType": {
32957
- "declaration": "\"none\" | \"smooth\" | \"flash\"",
33063
+ "declaration": "\"none\" | \"flash\" | \"smooth\"",
32958
33064
  "docstring": "",
32959
33065
  "path": "src/type/preference.ts"
32960
33066
  },