@maggioli-design-system/magma-react 2.8.0 → 2.10.0

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 (618) hide show
  1. package/AGENTS.md +10 -7
  2. package/CHANGELOG.md +108 -0
  3. package/README.md +38 -0
  4. package/agents/assets.md +1 -1
  5. package/agents/color.md +5 -3
  6. package/agents/components.md +2 -2
  7. package/agents/conventions.md +1 -1
  8. package/agents/mcp.md +78 -8
  9. package/agents/{anti-patterns.md → mistakes.md} +2 -2
  10. package/agents/patterns/actions.md +393 -0
  11. package/agents/patterns/app-shell.md +223 -0
  12. package/agents/patterns/choose-items.md +18 -0
  13. package/agents/patterns/concurrent-editing.md +17 -0
  14. package/agents/patterns/confirm-action.md +216 -0
  15. package/agents/patterns/consent-and-legal.md +16 -0
  16. package/agents/patterns/density.md +236 -0
  17. package/agents/patterns/empty-state.md +201 -0
  18. package/agents/patterns/error-recovery.md +237 -0
  19. package/agents/patterns/form-and-validation.md +16 -0
  20. package/agents/patterns/item-list.md +214 -0
  21. package/agents/patterns/labels-and-values.md +184 -0
  22. package/agents/patterns/list-with-filters.md +282 -0
  23. package/agents/patterns/loading.md +221 -0
  24. package/agents/patterns/message-placement.md +304 -0
  25. package/agents/patterns/notification-center.md +18 -0
  26. package/agents/patterns/page-header.md +201 -0
  27. package/agents/patterns/permissions.md +17 -0
  28. package/agents/patterns/previews/actions/banner.html +21 -0
  29. package/agents/patterns/previews/actions/confirm.html +11 -0
  30. package/agents/patterns/previews/actions/danger-zone.html +22 -0
  31. package/agents/patterns/previews/actions/destructive-in-menu.html +19 -0
  32. package/agents/patterns/previews/actions/dismiss-message.html +15 -0
  33. package/agents/patterns/previews/actions/dismiss.html +25 -0
  34. package/agents/patterns/previews/actions/more-in-menu.html +21 -0
  35. package/agents/patterns/previews/actions/part-primary.html +28 -0
  36. package/agents/patterns/previews/actions/primary.html +20 -0
  37. package/agents/patterns/previews/actions/remove.html +44 -0
  38. package/agents/patterns/previews/actions/secondary.html +20 -0
  39. package/agents/patterns/previews/actions/stacked.html +17 -0
  40. package/agents/patterns/previews/actions/toast.html +10 -0
  41. package/agents/patterns/previews/app-shell/back-office.html +41 -0
  42. package/agents/patterns/previews/app-shell/many-sections.html +45 -0
  43. package/agents/patterns/previews/app-shell/public-service.html +31 -0
  44. package/agents/patterns/previews/confirm-action/act-then-undo.html +44 -0
  45. package/agents/patterns/previews/confirm-action/ask-before-sending.html +25 -0
  46. package/agents/patterns/previews/confirm-action/ask-first-many.html +11 -0
  47. package/agents/patterns/previews/confirm-action/ask-first.html +14 -0
  48. package/agents/patterns/previews/confirm-action/make-reversible.html +54 -0
  49. package/agents/patterns/previews/confirm-action/send-as-shown.html +57 -0
  50. package/agents/patterns/previews/empty-state/add-the-first.html +19 -0
  51. package/agents/patterns/previews/empty-state/all-done.html +15 -0
  52. package/agents/patterns/previews/empty-state/clear-filters.html +35 -0
  53. package/agents/patterns/previews/empty-state/filled-by-others.html +15 -0
  54. package/agents/patterns/previews/empty-state/not-found.html +38 -0
  55. package/agents/patterns/previews/empty-state/one-line.html +12 -0
  56. package/agents/patterns/previews/error-recovery/action-another-way.html +35 -0
  57. package/agents/patterns/previews/error-recovery/changed-meanwhile.html +26 -0
  58. package/agents/patterns/previews/error-recovery/check-or-repeat.html +38 -0
  59. package/agents/patterns/previews/error-recovery/content-another-way.html +12 -0
  60. package/agents/patterns/previews/error-recovery/partial.html +29 -0
  61. package/agents/patterns/previews/error-recovery/retry-action.html +35 -0
  62. package/agents/patterns/previews/error-recovery/retry-content.html +40 -0
  63. package/agents/patterns/previews/error-recovery/sign-in-again.html +44 -0
  64. package/agents/patterns/previews/item-list/documents-of-a-request.html +12 -0
  65. package/agents/patterns/previews/item-list/queue-of-a-desk.html +109 -0
  66. package/agents/patterns/previews/item-list/requests-of-an-office.html +74 -0
  67. package/agents/patterns/previews/item-list/requests-to-assign.html +80 -0
  68. package/agents/patterns/previews/labels-and-values/data-of-a-contact.html +31 -0
  69. package/agents/patterns/previews/labels-and-values/payment-before-paying.html +21 -0
  70. package/agents/patterns/previews/labels-and-values/what-is-sent.html +25 -0
  71. package/agents/patterns/previews/list-with-filters/act-on-many.html +121 -0
  72. package/agents/patterns/previews/list-with-filters/find-and-open.html +109 -0
  73. package/agents/patterns/previews/list-with-filters/show-new-items.html +132 -0
  74. package/agents/patterns/previews/loading/await-and-say.html +41 -0
  75. package/agents/patterns/previews/loading/await-the-control.html +28 -0
  76. package/agents/patterns/previews/loading/first-load.html +10 -0
  77. package/agents/patterns/previews/loading/keep-while-reloading.html +80 -0
  78. package/agents/patterns/previews/loading/long-load-measured.html +16 -0
  79. package/agents/patterns/previews/loading/long-load.html +12 -0
  80. package/agents/patterns/previews/loading/progress-in-place.html +52 -0
  81. package/agents/patterns/previews/loading/run-in-background.html +24 -0
  82. package/agents/patterns/previews/message-placement/action-done-elsewhere.html +38 -0
  83. package/agents/patterns/previews/message-placement/action-done-in-page.html +53 -0
  84. package/agents/patterns/previews/message-placement/action-done-in-part.html +42 -0
  85. package/agents/patterns/previews/message-placement/action-failed-elsewhere.html +40 -0
  86. package/agents/patterns/previews/message-placement/action-failed-in-place.html +31 -0
  87. package/agents/patterns/previews/message-placement/action-later.html +24 -0
  88. package/agents/patterns/previews/message-placement/action-partial-elsewhere.html +33 -0
  89. package/agents/patterns/previews/message-placement/action-partial-in-place.html +51 -0
  90. package/agents/patterns/previews/message-placement/action-taken.html +25 -0
  91. package/agents/patterns/previews/message-placement/app-deadline.html +20 -0
  92. package/agents/patterns/previews/message-placement/app-failed.html +48 -0
  93. package/agents/patterns/previews/message-placement/app-info.html +39 -0
  94. package/agents/patterns/previews/message-placement/decision.html +49 -0
  95. package/agents/patterns/previews/message-placement/field-error.html +28 -0
  96. package/agents/patterns/previews/message-placement/field-hint.html +30 -0
  97. package/agents/patterns/previews/message-placement/field-valid.html +11 -0
  98. package/agents/patterns/previews/message-placement/region-failed.html +31 -0
  99. package/agents/patterns/previews/message-placement/region-info.html +16 -0
  100. package/agents/patterns/previews/page-header/contact-being-edited.html +25 -0
  101. package/agents/patterns/previews/page-header/members-of-a-group.html +18 -0
  102. package/agents/patterns/previews/page-header/own-profile.html +17 -0
  103. package/agents/patterns/previews/page-header/request-from-the-list.html +33 -0
  104. package/agents/patterns/previews/page-header/requests-of-an-office.html +16 -0
  105. package/agents/patterns/previews/record-detail/ask-for-words.html +72 -0
  106. package/agents/patterns/previews/record-detail/edit-data.html +104 -0
  107. package/agents/patterns/previews/record-detail/read-the-data.html +80 -0
  108. package/agents/patterns/previews/record-detail/record-changed.html +87 -0
  109. package/agents/patterns/previews/record-detail/run-at-once.html +88 -0
  110. package/agents/patterns/previews/record-detail/work-on-it.html +106 -0
  111. package/agents/patterns/previews/rhythm/between-containers.html +29 -0
  112. package/agents/patterns/previews/rhythm/between-fields.html +14 -0
  113. package/agents/patterns/previews/rhythm/between-groups.html +23 -0
  114. package/agents/patterns/previews/rhythm/between-sections.html +17 -0
  115. package/agents/patterns/previews/rhythm/content-actions.html +14 -0
  116. package/agents/patterns/previews/rhythm/inline.html +12 -0
  117. package/agents/patterns/previews/rhythm/inset.html +11 -0
  118. package/agents/patterns/previews/rhythm/label-control.html +8 -0
  119. package/agents/patterns/previews/rhythm/title-content.html +10 -0
  120. package/agents/patterns/previews/surfaces/band.html +73 -0
  121. package/agents/patterns/previews/surfaces/canvas.html +66 -0
  122. package/agents/patterns/previews/surfaces/card.html +30 -0
  123. package/agents/patterns/previews/surfaces/dialog.html +28 -0
  124. package/agents/patterns/previews/surfaces/edit-actions.html +35 -0
  125. package/agents/patterns/previews/surfaces/section.html +35 -0
  126. package/agents/patterns/previews/titles/dialog.html +18 -0
  127. package/agents/patterns/previews/titles/group.html +14 -0
  128. package/agents/patterns/previews/titles/page.html +25 -0
  129. package/agents/patterns/previews/titles/part.html +24 -0
  130. package/agents/patterns/previews/titles/section.html +14 -0
  131. package/agents/patterns/previews/widths/dialog.html +33 -0
  132. package/agents/patterns/previews/widths/field.html +20 -0
  133. package/agents/patterns/previews/widths/form.html +27 -0
  134. package/agents/patterns/previews/widths/page.html +49 -0
  135. package/agents/patterns/previews/widths/reading.html +15 -0
  136. package/agents/patterns/record-detail.md +268 -0
  137. package/agents/patterns/rhythm.md +212 -0
  138. package/agents/patterns/surfaces.md +212 -0
  139. package/agents/patterns/titles.md +208 -0
  140. package/agents/patterns/widths.md +202 -0
  141. package/agents/patterns.md +121 -0
  142. package/agents/reporting.md +6 -3
  143. package/agents/theming.md +22 -3
  144. package/agents/typography.md +27 -2
  145. package/agents/variants.md +1 -1
  146. package/dist/components.js +117 -117
  147. package/dist/components.server.js +117 -117
  148. package/dist/mds-accordion-item.js +8 -3
  149. package/dist/mds-accordion-item.server.js +7 -2
  150. package/dist/mds-accordion-timer-item.js +8 -3
  151. package/dist/mds-accordion-timer-item.server.js +7 -2
  152. package/dist/mds-accordion-timer.js +11 -4
  153. package/dist/mds-accordion-timer.server.js +7 -2
  154. package/dist/mds-accordion.js +11 -4
  155. package/dist/mds-accordion.server.js +7 -2
  156. package/dist/mds-author.js +8 -3
  157. package/dist/mds-author.server.js +7 -2
  158. package/dist/mds-avatar-stack-item.js +8 -3
  159. package/dist/mds-avatar-stack-item.server.js +7 -2
  160. package/dist/mds-avatar-stack.js +8 -3
  161. package/dist/mds-avatar-stack.server.js +7 -2
  162. package/dist/mds-avatar.js +8 -3
  163. package/dist/mds-avatar.server.js +7 -2
  164. package/dist/mds-badge.js +8 -3
  165. package/dist/mds-badge.server.js +7 -2
  166. package/dist/mds-banner.js +11 -4
  167. package/dist/mds-banner.server.js +7 -2
  168. package/dist/mds-benchmark-bar.js +8 -3
  169. package/dist/mds-benchmark-bar.server.js +7 -2
  170. package/dist/mds-bibliography.js +8 -3
  171. package/dist/mds-bibliography.server.js +7 -2
  172. package/dist/mds-book.js +8 -3
  173. package/dist/mds-book.server.js +8 -2
  174. package/dist/mds-breadcrumb-item.js +11 -4
  175. package/dist/mds-breadcrumb-item.server.js +7 -2
  176. package/dist/mds-breadcrumb.js +11 -4
  177. package/dist/mds-breadcrumb.server.js +10 -3
  178. package/dist/mds-button-dropdown.js +11 -4
  179. package/dist/mds-button-dropdown.server.js +7 -2
  180. package/dist/mds-button-group.js +8 -3
  181. package/dist/mds-button-group.server.js +7 -2
  182. package/dist/mds-button.js +8 -3
  183. package/dist/mds-button.server.js +7 -2
  184. package/dist/mds-calendar-cell.js +8 -3
  185. package/dist/mds-calendar-cell.server.js +7 -2
  186. package/dist/mds-calendar.js +8 -3
  187. package/dist/mds-calendar.server.js +7 -2
  188. package/dist/mds-card-content.js +8 -3
  189. package/dist/mds-card-content.server.js +7 -2
  190. package/dist/mds-card-footer.js +8 -3
  191. package/dist/mds-card-footer.server.js +7 -2
  192. package/dist/mds-card-header.js +8 -3
  193. package/dist/mds-card-header.server.js +7 -2
  194. package/dist/mds-card-media.js +8 -3
  195. package/dist/mds-card-media.server.js +7 -2
  196. package/dist/mds-card.js +8 -3
  197. package/dist/mds-card.server.js +10 -3
  198. package/dist/mds-chip.js +8 -3
  199. package/dist/mds-chip.server.js +7 -2
  200. package/dist/mds-details.js +11 -4
  201. package/dist/mds-details.server.js +10 -3
  202. package/dist/mds-dropdown.js +8 -3
  203. package/dist/mds-dropdown.server.js +7 -2
  204. package/dist/mds-emoji.js +8 -3
  205. package/dist/mds-emoji.server.js +10 -3
  206. package/dist/mds-entity.js +8 -3
  207. package/dist/mds-entity.server.js +7 -2
  208. package/dist/mds-file-preview.js +8 -3
  209. package/dist/mds-file-preview.server.js +7 -2
  210. package/dist/mds-file.js +11 -4
  211. package/dist/mds-file.server.js +7 -2
  212. package/dist/mds-filter-item.js +11 -4
  213. package/dist/mds-filter-item.server.js +7 -2
  214. package/dist/mds-filter.js +11 -4
  215. package/dist/mds-filter.server.js +7 -2
  216. package/dist/mds-header-bar.js +11 -4
  217. package/dist/mds-header-bar.server.js +7 -2
  218. package/dist/mds-header.js +8 -3
  219. package/dist/mds-header.server.js +7 -2
  220. package/dist/mds-help.js +8 -3
  221. package/dist/mds-help.server.js +7 -2
  222. package/dist/mds-horizontal-scroll.js +8 -3
  223. package/dist/mds-horizontal-scroll.server.js +7 -2
  224. package/dist/mds-hr.js +8 -3
  225. package/dist/mds-hr.server.js +7 -2
  226. package/dist/mds-icon.js +8 -3
  227. package/dist/mds-icon.server.js +10 -3
  228. package/dist/mds-img.js +8 -3
  229. package/dist/mds-img.server.js +7 -2
  230. package/dist/mds-input-date-range-preselection.js +8 -3
  231. package/dist/mds-input-date-range-preselection.server.js +7 -2
  232. package/dist/mds-input-date-range.js +11 -4
  233. package/dist/mds-input-date-range.server.js +7 -2
  234. package/dist/mds-input-date.js +8 -3
  235. package/dist/mds-input-date.server.js +7 -2
  236. package/dist/mds-input-field.js +8 -3
  237. package/dist/mds-input-field.server.js +8 -2
  238. package/dist/mds-input-otp.js +8 -3
  239. package/dist/mds-input-otp.server.js +7 -2
  240. package/dist/mds-input-range.js +11 -4
  241. package/dist/mds-input-range.server.js +7 -2
  242. package/dist/mds-input-select.js +11 -4
  243. package/dist/mds-input-select.server.js +7 -2
  244. package/dist/mds-input-switch.js +11 -4
  245. package/dist/mds-input-switch.server.js +7 -2
  246. package/dist/mds-input-tip-item.js +8 -3
  247. package/dist/mds-input-tip-item.server.js +7 -2
  248. package/dist/mds-input-tip.js +8 -3
  249. package/dist/mds-input-tip.server.js +7 -2
  250. package/dist/mds-input-upload.js +11 -4
  251. package/dist/mds-input-upload.server.js +7 -2
  252. package/dist/mds-input.js +8 -3
  253. package/dist/mds-input.server.js +7 -2
  254. package/dist/mds-keyboard-key.js +8 -3
  255. package/dist/mds-keyboard-key.server.js +7 -2
  256. package/dist/mds-keyboard.js +8 -3
  257. package/dist/mds-keyboard.server.js +7 -2
  258. package/dist/mds-kpi-item.js +8 -3
  259. package/dist/mds-kpi-item.server.js +7 -2
  260. package/dist/mds-kpi.js +8 -3
  261. package/dist/mds-kpi.server.js +7 -2
  262. package/dist/mds-label.js +11 -4
  263. package/dist/mds-label.server.js +7 -2
  264. package/dist/mds-link.js +8 -3
  265. package/dist/mds-link.server.js +7 -2
  266. package/dist/mds-list-item.js +8 -3
  267. package/dist/mds-list-item.server.js +7 -2
  268. package/dist/mds-list.js +8 -3
  269. package/dist/mds-list.server.js +7 -2
  270. package/dist/mds-mention.js +11 -4
  271. package/dist/mds-mention.server.js +7 -2
  272. package/dist/mds-modal.js +8 -3
  273. package/dist/mds-modal.server.js +7 -2
  274. package/dist/mds-note.js +11 -4
  275. package/dist/mds-note.server.js +7 -2
  276. package/dist/mds-notification.js +8 -3
  277. package/dist/mds-notification.server.js +10 -3
  278. package/dist/mds-paginator-item.js +8 -3
  279. package/dist/mds-paginator-item.server.js +7 -2
  280. package/dist/mds-paginator.js +11 -4
  281. package/dist/mds-paginator.server.js +7 -2
  282. package/dist/mds-policy-ai.js +8 -3
  283. package/dist/mds-policy-ai.server.js +7 -2
  284. package/dist/mds-pref-animation.js +11 -4
  285. package/dist/mds-pref-animation.server.js +7 -2
  286. package/dist/mds-pref-consumption.js +11 -4
  287. package/dist/mds-pref-consumption.server.js +7 -2
  288. package/dist/mds-pref-contrast.js +11 -4
  289. package/dist/mds-pref-contrast.server.js +7 -2
  290. package/dist/mds-pref-language-item.js +11 -4
  291. package/dist/mds-pref-language-item.server.js +7 -2
  292. package/dist/mds-pref-language.js +8 -3
  293. package/dist/mds-pref-language.server.js +7 -2
  294. package/dist/mds-pref-mode.js +11 -4
  295. package/dist/mds-pref-mode.server.js +7 -2
  296. package/dist/mds-pref-theme-item.js +11 -4
  297. package/dist/mds-pref-theme-item.server.js +7 -2
  298. package/dist/mds-pref-theme.js +8 -3
  299. package/dist/mds-pref-theme.server.js +7 -2
  300. package/dist/mds-pref.js +8 -3
  301. package/dist/mds-pref.server.js +7 -2
  302. package/dist/mds-price-table-features-cell.js +8 -3
  303. package/dist/mds-price-table-features-cell.server.js +10 -3
  304. package/dist/mds-price-table-features-row.js +8 -3
  305. package/dist/mds-price-table-features-row.server.js +7 -2
  306. package/dist/mds-price-table-features.js +8 -3
  307. package/dist/mds-price-table-features.server.js +10 -3
  308. package/dist/mds-price-table-header.js +8 -3
  309. package/dist/mds-price-table-header.server.js +7 -2
  310. package/dist/mds-price-table-list-item.js +8 -3
  311. package/dist/mds-price-table-list-item.server.js +7 -2
  312. package/dist/mds-price-table-list.js +8 -3
  313. package/dist/mds-price-table-list.server.js +7 -2
  314. package/dist/mds-price-table.js +8 -3
  315. package/dist/mds-price-table.server.js +7 -2
  316. package/dist/mds-progress.js +8 -3
  317. package/dist/mds-progress.server.js +7 -2
  318. package/dist/mds-push-notification-item.js +11 -4
  319. package/dist/mds-push-notification-item.server.js +7 -2
  320. package/dist/mds-push-notification.js +8 -3
  321. package/dist/mds-push-notification.server.js +7 -2
  322. package/dist/mds-quote.js +8 -3
  323. package/dist/mds-quote.server.js +7 -2
  324. package/dist/mds-radial-menu-item.js +8 -3
  325. package/dist/mds-radial-menu-item.server.js +7 -2
  326. package/dist/mds-radial-menu.js +8 -3
  327. package/dist/mds-radial-menu.server.js +7 -2
  328. package/dist/mds-radial-progress.js +8 -3
  329. package/dist/mds-radial-progress.server.js +7 -2
  330. package/dist/mds-separator.js +8 -3
  331. package/dist/mds-separator.server.js +7 -2
  332. package/dist/mds-spinner.js +8 -3
  333. package/dist/mds-spinner.server.js +10 -3
  334. package/dist/mds-status-bar.js +8 -3
  335. package/dist/mds-status-bar.server.js +7 -2
  336. package/dist/mds-stepper-bar-item.js +11 -4
  337. package/dist/mds-stepper-bar-item.server.js +7 -2
  338. package/dist/mds-stepper-bar.js +11 -4
  339. package/dist/mds-stepper-bar.server.js +7 -2
  340. package/dist/mds-tab-bar-item.js +11 -4
  341. package/dist/mds-tab-bar-item.server.js +7 -2
  342. package/dist/mds-tab-bar.js +11 -4
  343. package/dist/mds-tab-bar.server.js +7 -2
  344. package/dist/mds-tab-item.js +8 -3
  345. package/dist/mds-tab-item.server.js +7 -2
  346. package/dist/mds-tab.js +11 -4
  347. package/dist/mds-tab.server.js +7 -2
  348. package/dist/mds-table-body.js +8 -3
  349. package/dist/mds-table-body.server.js +7 -2
  350. package/dist/mds-table-cell.js +8 -3
  351. package/dist/mds-table-cell.server.js +10 -3
  352. package/dist/mds-table-footer.js +8 -3
  353. package/dist/mds-table-footer.server.js +10 -3
  354. package/dist/mds-table-header-cell.js +11 -4
  355. package/dist/mds-table-header-cell.server.js +7 -2
  356. package/dist/mds-table-header.js +8 -3
  357. package/dist/mds-table-header.server.js +10 -3
  358. package/dist/mds-table-row.js +8 -3
  359. package/dist/mds-table-row.server.js +7 -2
  360. package/dist/mds-table.js +11 -4
  361. package/dist/mds-table.server.js +7 -2
  362. package/dist/mds-text.js +8 -3
  363. package/dist/mds-text.server.js +7 -2
  364. package/dist/mds-toast-region.js +8 -3
  365. package/dist/mds-toast-region.server.js +7 -2
  366. package/dist/mds-toast.js +11 -4
  367. package/dist/mds-toast.server.js +7 -2
  368. package/dist/mds-tooltip.js +8 -3
  369. package/dist/mds-tooltip.server.js +7 -2
  370. package/dist/mds-tree-item.js +8 -3
  371. package/dist/mds-tree-item.server.js +7 -2
  372. package/dist/mds-tree.js +8 -3
  373. package/dist/mds-tree.server.js +7 -2
  374. package/dist/mds-url-view.js +11 -4
  375. package/dist/mds-url-view.server.js +7 -2
  376. package/dist/mds-usage.js +8 -3
  377. package/dist/mds-usage.server.js +7 -2
  378. package/dist/mds-video-wall.js +8 -3
  379. package/dist/mds-video-wall.server.js +7 -2
  380. package/dist/mds-zero.js +8 -3
  381. package/dist/mds-zero.server.js +7 -2
  382. package/dist/types/components.d.ts +117 -117
  383. package/dist/types/components.server.d.ts +118 -118
  384. package/dist/types/mds-accordion-item.d.ts +4 -8
  385. package/dist/types/mds-accordion-item.server.d.ts +4 -4
  386. package/dist/types/mds-accordion-timer-item.d.ts +4 -8
  387. package/dist/types/mds-accordion-timer-item.server.d.ts +4 -4
  388. package/dist/types/mds-accordion-timer.d.ts +4 -8
  389. package/dist/types/mds-accordion-timer.server.d.ts +4 -4
  390. package/dist/types/mds-accordion.d.ts +4 -8
  391. package/dist/types/mds-accordion.server.d.ts +4 -4
  392. package/dist/types/mds-author.d.ts +2 -6
  393. package/dist/types/mds-author.server.d.ts +3 -3
  394. package/dist/types/mds-avatar-stack-item.d.ts +2 -6
  395. package/dist/types/mds-avatar-stack-item.server.d.ts +3 -3
  396. package/dist/types/mds-avatar-stack.d.ts +2 -6
  397. package/dist/types/mds-avatar-stack.server.d.ts +3 -3
  398. package/dist/types/mds-avatar.d.ts +2 -6
  399. package/dist/types/mds-avatar.server.d.ts +3 -3
  400. package/dist/types/mds-badge.d.ts +2 -6
  401. package/dist/types/mds-badge.server.d.ts +3 -3
  402. package/dist/types/mds-banner.d.ts +4 -8
  403. package/dist/types/mds-banner.server.d.ts +4 -4
  404. package/dist/types/mds-benchmark-bar.d.ts +2 -6
  405. package/dist/types/mds-benchmark-bar.server.d.ts +3 -3
  406. package/dist/types/mds-bibliography.d.ts +2 -6
  407. package/dist/types/mds-bibliography.server.d.ts +3 -3
  408. package/dist/types/mds-book.d.ts +2 -6
  409. package/dist/types/mds-book.server.d.ts +3 -3
  410. package/dist/types/mds-breadcrumb-item.d.ts +4 -8
  411. package/dist/types/mds-breadcrumb-item.server.d.ts +4 -4
  412. package/dist/types/mds-breadcrumb.d.ts +4 -8
  413. package/dist/types/mds-breadcrumb.server.d.ts +4 -4
  414. package/dist/types/mds-button-dropdown.d.ts +4 -8
  415. package/dist/types/mds-button-dropdown.server.d.ts +4 -4
  416. package/dist/types/mds-button-group.d.ts +2 -6
  417. package/dist/types/mds-button-group.server.d.ts +3 -3
  418. package/dist/types/mds-button.d.ts +2 -6
  419. package/dist/types/mds-button.server.d.ts +3 -3
  420. package/dist/types/mds-calendar-cell.d.ts +2 -6
  421. package/dist/types/mds-calendar-cell.server.d.ts +3 -3
  422. package/dist/types/mds-calendar.d.ts +4 -8
  423. package/dist/types/mds-calendar.server.d.ts +4 -4
  424. package/dist/types/mds-card-content.d.ts +2 -6
  425. package/dist/types/mds-card-content.server.d.ts +3 -3
  426. package/dist/types/mds-card-footer.d.ts +2 -6
  427. package/dist/types/mds-card-footer.server.d.ts +3 -3
  428. package/dist/types/mds-card-header.d.ts +2 -6
  429. package/dist/types/mds-card-header.server.d.ts +3 -3
  430. package/dist/types/mds-card-media.d.ts +2 -6
  431. package/dist/types/mds-card-media.server.d.ts +3 -3
  432. package/dist/types/mds-card.d.ts +2 -6
  433. package/dist/types/mds-card.server.d.ts +3 -3
  434. package/dist/types/mds-chip.d.ts +4 -8
  435. package/dist/types/mds-chip.server.d.ts +4 -4
  436. package/dist/types/mds-details.d.ts +4 -8
  437. package/dist/types/mds-details.server.d.ts +4 -4
  438. package/dist/types/mds-dropdown.d.ts +4 -8
  439. package/dist/types/mds-dropdown.server.d.ts +4 -4
  440. package/dist/types/mds-emoji.d.ts +2 -6
  441. package/dist/types/mds-emoji.server.d.ts +3 -3
  442. package/dist/types/mds-entity.d.ts +2 -6
  443. package/dist/types/mds-entity.server.d.ts +3 -3
  444. package/dist/types/mds-file-preview.d.ts +4 -8
  445. package/dist/types/mds-file-preview.server.d.ts +4 -4
  446. package/dist/types/mds-file.d.ts +4 -8
  447. package/dist/types/mds-file.server.d.ts +4 -4
  448. package/dist/types/mds-filter-item.d.ts +4 -8
  449. package/dist/types/mds-filter-item.server.d.ts +4 -4
  450. package/dist/types/mds-filter.d.ts +4 -8
  451. package/dist/types/mds-filter.server.d.ts +4 -4
  452. package/dist/types/mds-header-bar.d.ts +4 -8
  453. package/dist/types/mds-header-bar.server.d.ts +4 -4
  454. package/dist/types/mds-header.d.ts +4 -8
  455. package/dist/types/mds-header.server.d.ts +4 -4
  456. package/dist/types/mds-help.d.ts +2 -6
  457. package/dist/types/mds-help.server.d.ts +3 -3
  458. package/dist/types/mds-horizontal-scroll.d.ts +2 -6
  459. package/dist/types/mds-horizontal-scroll.server.d.ts +3 -3
  460. package/dist/types/mds-hr.d.ts +2 -6
  461. package/dist/types/mds-hr.server.d.ts +3 -3
  462. package/dist/types/mds-icon.d.ts +2 -6
  463. package/dist/types/mds-icon.server.d.ts +3 -3
  464. package/dist/types/mds-img.d.ts +4 -8
  465. package/dist/types/mds-img.server.d.ts +4 -4
  466. package/dist/types/mds-input-date-range-preselection.d.ts +2 -6
  467. package/dist/types/mds-input-date-range-preselection.server.d.ts +3 -3
  468. package/dist/types/mds-input-date-range.d.ts +4 -8
  469. package/dist/types/mds-input-date-range.server.d.ts +4 -4
  470. package/dist/types/mds-input-date.d.ts +4 -8
  471. package/dist/types/mds-input-date.server.d.ts +4 -4
  472. package/dist/types/mds-input-field.d.ts +2 -6
  473. package/dist/types/mds-input-field.server.d.ts +3 -3
  474. package/dist/types/mds-input-otp.d.ts +2 -6
  475. package/dist/types/mds-input-otp.server.d.ts +3 -3
  476. package/dist/types/mds-input-range.d.ts +4 -8
  477. package/dist/types/mds-input-range.server.d.ts +4 -4
  478. package/dist/types/mds-input-select.d.ts +4 -8
  479. package/dist/types/mds-input-select.server.d.ts +4 -4
  480. package/dist/types/mds-input-switch.d.ts +4 -8
  481. package/dist/types/mds-input-switch.server.d.ts +4 -4
  482. package/dist/types/mds-input-tip-item.d.ts +2 -6
  483. package/dist/types/mds-input-tip-item.server.d.ts +3 -3
  484. package/dist/types/mds-input-tip.d.ts +2 -6
  485. package/dist/types/mds-input-tip.server.d.ts +3 -3
  486. package/dist/types/mds-input-upload.d.ts +4 -8
  487. package/dist/types/mds-input-upload.server.d.ts +4 -4
  488. package/dist/types/mds-input.d.ts +4 -8
  489. package/dist/types/mds-input.server.d.ts +4 -4
  490. package/dist/types/mds-keyboard-key.d.ts +2 -6
  491. package/dist/types/mds-keyboard-key.server.d.ts +3 -3
  492. package/dist/types/mds-keyboard.d.ts +2 -6
  493. package/dist/types/mds-keyboard.server.d.ts +3 -3
  494. package/dist/types/mds-kpi-item.d.ts +2 -6
  495. package/dist/types/mds-kpi-item.server.d.ts +3 -3
  496. package/dist/types/mds-kpi.d.ts +2 -6
  497. package/dist/types/mds-kpi.server.d.ts +3 -3
  498. package/dist/types/mds-label.d.ts +4 -8
  499. package/dist/types/mds-label.server.d.ts +4 -4
  500. package/dist/types/mds-link.d.ts +2 -6
  501. package/dist/types/mds-link.server.d.ts +3 -3
  502. package/dist/types/mds-list-item.d.ts +2 -6
  503. package/dist/types/mds-list-item.server.d.ts +3 -3
  504. package/dist/types/mds-list.d.ts +2 -6
  505. package/dist/types/mds-list.server.d.ts +3 -3
  506. package/dist/types/mds-mention.d.ts +4 -8
  507. package/dist/types/mds-mention.server.d.ts +4 -4
  508. package/dist/types/mds-modal.d.ts +4 -8
  509. package/dist/types/mds-modal.server.d.ts +4 -4
  510. package/dist/types/mds-note.d.ts +4 -8
  511. package/dist/types/mds-note.server.d.ts +4 -4
  512. package/dist/types/mds-notification.d.ts +2 -6
  513. package/dist/types/mds-notification.server.d.ts +3 -3
  514. package/dist/types/mds-paginator-item.d.ts +2 -6
  515. package/dist/types/mds-paginator-item.server.d.ts +3 -3
  516. package/dist/types/mds-paginator.d.ts +4 -8
  517. package/dist/types/mds-paginator.server.d.ts +4 -4
  518. package/dist/types/mds-policy-ai.d.ts +2 -6
  519. package/dist/types/mds-policy-ai.server.d.ts +3 -3
  520. package/dist/types/mds-pref-animation.d.ts +4 -8
  521. package/dist/types/mds-pref-animation.server.d.ts +4 -4
  522. package/dist/types/mds-pref-consumption.d.ts +4 -8
  523. package/dist/types/mds-pref-consumption.server.d.ts +4 -4
  524. package/dist/types/mds-pref-contrast.d.ts +4 -8
  525. package/dist/types/mds-pref-contrast.server.d.ts +4 -4
  526. package/dist/types/mds-pref-language-item.d.ts +4 -8
  527. package/dist/types/mds-pref-language-item.server.d.ts +4 -4
  528. package/dist/types/mds-pref-language.d.ts +4 -8
  529. package/dist/types/mds-pref-language.server.d.ts +4 -4
  530. package/dist/types/mds-pref-mode.d.ts +4 -8
  531. package/dist/types/mds-pref-mode.server.d.ts +4 -4
  532. package/dist/types/mds-pref-theme-item.d.ts +4 -8
  533. package/dist/types/mds-pref-theme-item.server.d.ts +4 -4
  534. package/dist/types/mds-pref-theme.d.ts +4 -8
  535. package/dist/types/mds-pref-theme.server.d.ts +4 -4
  536. package/dist/types/mds-pref.d.ts +2 -6
  537. package/dist/types/mds-pref.server.d.ts +3 -3
  538. package/dist/types/mds-price-table-features-cell.d.ts +2 -6
  539. package/dist/types/mds-price-table-features-cell.server.d.ts +3 -3
  540. package/dist/types/mds-price-table-features-row.d.ts +2 -6
  541. package/dist/types/mds-price-table-features-row.server.d.ts +3 -3
  542. package/dist/types/mds-price-table-features.d.ts +2 -6
  543. package/dist/types/mds-price-table-features.server.d.ts +3 -3
  544. package/dist/types/mds-price-table-header.d.ts +2 -6
  545. package/dist/types/mds-price-table-header.server.d.ts +3 -3
  546. package/dist/types/mds-price-table-list-item.d.ts +2 -6
  547. package/dist/types/mds-price-table-list-item.server.d.ts +3 -3
  548. package/dist/types/mds-price-table-list.d.ts +2 -6
  549. package/dist/types/mds-price-table-list.server.d.ts +3 -3
  550. package/dist/types/mds-price-table.d.ts +2 -6
  551. package/dist/types/mds-price-table.server.d.ts +3 -3
  552. package/dist/types/mds-progress.d.ts +2 -6
  553. package/dist/types/mds-progress.server.d.ts +3 -3
  554. package/dist/types/mds-push-notification-item.d.ts +4 -8
  555. package/dist/types/mds-push-notification-item.server.d.ts +4 -4
  556. package/dist/types/mds-push-notification.d.ts +4 -8
  557. package/dist/types/mds-push-notification.server.d.ts +4 -4
  558. package/dist/types/mds-quote.d.ts +2 -6
  559. package/dist/types/mds-quote.server.d.ts +3 -3
  560. package/dist/types/mds-radial-menu-item.d.ts +2 -6
  561. package/dist/types/mds-radial-menu-item.server.d.ts +3 -3
  562. package/dist/types/mds-radial-menu.d.ts +2 -6
  563. package/dist/types/mds-radial-menu.server.d.ts +3 -3
  564. package/dist/types/mds-radial-progress.d.ts +2 -6
  565. package/dist/types/mds-radial-progress.server.d.ts +3 -3
  566. package/dist/types/mds-separator.d.ts +2 -6
  567. package/dist/types/mds-separator.server.d.ts +3 -3
  568. package/dist/types/mds-spinner.d.ts +2 -6
  569. package/dist/types/mds-spinner.server.d.ts +3 -3
  570. package/dist/types/mds-status-bar.d.ts +2 -6
  571. package/dist/types/mds-status-bar.server.d.ts +3 -3
  572. package/dist/types/mds-stepper-bar-item.d.ts +4 -8
  573. package/dist/types/mds-stepper-bar-item.server.d.ts +4 -4
  574. package/dist/types/mds-stepper-bar.d.ts +4 -8
  575. package/dist/types/mds-stepper-bar.server.d.ts +4 -4
  576. package/dist/types/mds-tab-bar-item.d.ts +4 -8
  577. package/dist/types/mds-tab-bar-item.server.d.ts +4 -4
  578. package/dist/types/mds-tab-bar.d.ts +4 -8
  579. package/dist/types/mds-tab-bar.server.d.ts +4 -4
  580. package/dist/types/mds-tab-item.d.ts +4 -8
  581. package/dist/types/mds-tab-item.server.d.ts +4 -4
  582. package/dist/types/mds-tab.d.ts +4 -8
  583. package/dist/types/mds-tab.server.d.ts +4 -4
  584. package/dist/types/mds-table-body.d.ts +2 -6
  585. package/dist/types/mds-table-body.server.d.ts +3 -3
  586. package/dist/types/mds-table-cell.d.ts +2 -6
  587. package/dist/types/mds-table-cell.server.d.ts +3 -3
  588. package/dist/types/mds-table-footer.d.ts +2 -6
  589. package/dist/types/mds-table-footer.server.d.ts +3 -3
  590. package/dist/types/mds-table-header-cell.d.ts +4 -8
  591. package/dist/types/mds-table-header-cell.server.d.ts +4 -4
  592. package/dist/types/mds-table-header.d.ts +2 -6
  593. package/dist/types/mds-table-header.server.d.ts +3 -3
  594. package/dist/types/mds-table-row.d.ts +2 -6
  595. package/dist/types/mds-table-row.server.d.ts +3 -3
  596. package/dist/types/mds-table.d.ts +4 -8
  597. package/dist/types/mds-table.server.d.ts +4 -4
  598. package/dist/types/mds-text.d.ts +2 -6
  599. package/dist/types/mds-text.server.d.ts +3 -3
  600. package/dist/types/mds-toast-region.d.ts +2 -6
  601. package/dist/types/mds-toast-region.server.d.ts +3 -3
  602. package/dist/types/mds-toast.d.ts +4 -8
  603. package/dist/types/mds-toast.server.d.ts +4 -4
  604. package/dist/types/mds-tooltip.d.ts +2 -6
  605. package/dist/types/mds-tooltip.server.d.ts +3 -3
  606. package/dist/types/mds-tree-item.d.ts +4 -8
  607. package/dist/types/mds-tree-item.server.d.ts +4 -4
  608. package/dist/types/mds-tree.d.ts +2 -6
  609. package/dist/types/mds-tree.server.d.ts +3 -3
  610. package/dist/types/mds-url-view.d.ts +4 -8
  611. package/dist/types/mds-url-view.server.d.ts +4 -4
  612. package/dist/types/mds-usage.d.ts +2 -6
  613. package/dist/types/mds-usage.server.d.ts +3 -3
  614. package/dist/types/mds-video-wall.d.ts +2 -6
  615. package/dist/types/mds-video-wall.server.d.ts +3 -3
  616. package/dist/types/mds-zero.d.ts +2 -6
  617. package/dist/types/mds-zero.server.d.ts +3 -3
  618. package/package.json +3 -3
@@ -0,0 +1,223 @@
1
+ ---
2
+ # A Magma building block: the format and the commands are in docs/PATTERNS.md, "A building block".
3
+ id: app-shell
4
+ kind: block
5
+ title: Application shell
6
+ group: navigation
7
+ layer: magma
8
+ status: decided
9
+ need: >-
10
+ The person knows which application they are in, reaches each of its sections from any page,
11
+ and sees who they are signed in as.
12
+ principle: One bar names the application and opens its sections at every width; each page lives in one main under it.
13
+ keywords: [application shell, app shell, application bar, top bar, navigation bar, main navigation, sections of the application, menu, hamburger, account menu, sign in, sign out, frame of the page]
14
+ not-for:
15
+ - need: the head of the content of a page, its title and its actions
16
+ use: page-header
17
+ assumptions:
18
+ - Each section of the application is a page of its own, with an address.
19
+ - The application knows who is signed in, or that nobody is.
20
+ high-stakes: false
21
+ components: [mds-header, mds-header-bar, mds-text, mds-button, mds-dropdown, mds-separator]
22
+ used-by: [list-with-filters, record-detail, empty-state, message-placement]
23
+ related: [page-header, list-with-filters, record-detail, empty-state, message-placement]
24
+ validated-on: []
25
+
26
+ variables:
27
+ sections: { values: [few, many], means: "few: the sections of the application fit in the bar, five at most with short names; many: more than five, or names too long for the bar" }
28
+ person: { values: [signed-in, guest], means: "signed-in: someone is signed in (a back office, always); guest: nobody is signed in yet (a public service before the sign-in)" }
29
+
30
+ regions:
31
+ - { id: product, required: true, what: "the name of the application at the start of the bar, as text; a product may put its logo in its place (logo)", use: ["mds-text typography=h6 tag=p"] }
32
+ - { id: sections, when: { sections: few }, what: "the sections of the application as links, in the order of the work, the current one marked: aria-current=page and a look of its own; in the bar from the width of the desktop, in the menu under it", use: ["mds-button slot=nav href variant=dark tone=text"] }
33
+ - { id: person, when: { person: signed-in }, what: "the last element of the bar: a button named after the person signed in, which opens their menu: their name, Profilo, then Esci after a separator", use: ["mds-button slot=nav icon variant=dark tone=text", "mds-dropdown", "mds-separator"] }
34
+ - { id: sign-in, when: { person: guest }, what: "the last element of the bar: Accedi, a link to the sign-in", use: ["mds-button slot=nav href variant=dark tone=outline"] }
35
+ - { id: menu, what: "the menu of the bar, opened by its button: the sections, the current one marked, then after a separator the name of the person, Profilo and Esci, or Accedi, which keeps its outline; under the width of the desktop with few sections, at every width with many", use: ["mds-header menu", "mds-button href variant=dark tone=text", "mds-button href variant=dark tone=outline", "mds-separator"] }
36
+ - { id: main, required: true, what: "the content of the page, under the bar: one main in the frame of the page, its header first (page-header), then its sections" }
37
+
38
+ always-true:
39
+ - id: one-bar
40
+ rule: "The application has one bar: mds-header with one mds-header-bar, first in the page; the page starts under it, with no room reserved by hand."
41
+ checked-by: review
42
+ - id: sections-are-links
43
+ rule: "The sections are links to their pages (mds-button with href), the current one marked with aria-current=\"page\"; never a button that runs a script to change page."
44
+ checked-by: review
45
+ - id: every-width
46
+ rule: "Every section is reached at every width: in the bar from the width of the desktop, in the menu of the bar under it; never menu=\"none\" on a bar with sections."
47
+ checked-by: review
48
+ - id: person-named
49
+ rule: "The button of the person is named after them (\"Account di Mario Rossi\") and their menu opens with their name: the person always sees who is signed in."
50
+ checked-by: review
51
+ - id: one-main
52
+ rule: "The content of a page is one main under the bar, in the frame of the page, its header first; the bar never holds the title or the actions of a page."
53
+ checked-by: review
54
+ - id: not-the-app-bar
55
+ from: page-header
56
+ - id: page
57
+ from: widths
58
+ - id: start-edge
59
+ from: widths
60
+ - id: band
61
+ from: surfaces
62
+ - id: between-sections
63
+ from: rhythm
64
+
65
+ open-choices:
66
+ - { id: logo, default: "the name of the application, as text", may: "put the logo of the product in its place, an mds-img with the name of the application as its alt" }
67
+
68
+ situations:
69
+ - { id: back-office, situation: "A back office with four sections, an operator signed in", sections: few, person: signed-in }
70
+ - { id: many-sections, situation: "An application with a dozen sections, an operator signed in", sections: many, person: signed-in }
71
+ - { id: public-service, situation: "A public service a citizen opens before signing in", sections: few, person: guest }
72
+ ---
73
+
74
+ # Application shell
75
+
76
+ **One bar names the application and opens its sections at every width; each page lives in one main under it.**
77
+
78
+ ## When to use it
79
+
80
+ Around every page of an application: the bar on top, with the name of the application, its
81
+ sections and the person signed in, and the main under it, where the page lays out its header
82
+ and its sections. It came out of the round of the building blocks (2026-11-03): every
83
+ whole-page preview of `list-with-filters`, `record-detail`, `empty-state` (`not-found`) and
84
+ `message-placement` (`app-failed`) wrote the bar and the frame by hand, each a little
85
+ differently, with the sections as buttons with no address, none of them marked as the current
86
+ one, and none reachable on a phone. Not the head of the content of a page, its title and its
87
+ actions (`page-header`), and not the views of a page: tabs are a section of their own, under
88
+ the header.
89
+
90
+ ## What decides it
91
+
92
+ Two questions: whether the sections fit in the bar (then they stand in it on a wide screen and
93
+ in its menu on a narrow one), and whether someone is signed in (then the bar ends with their
94
+ menu, otherwise with Accedi).
95
+
96
+ ## Regions
97
+
98
+ <!-- Generated from the frontmatter: edit it there, then run nx run stencil:generate.pattern -- --sync. -->
99
+
100
+ | Variable | Values | Means |
101
+ | --- | --- | --- |
102
+ | `sections` | `few`, `many` | few: the sections of the application fit in the bar, five at most with short names; many: more than five, or names too long for the bar |
103
+ | `person` | `signed-in`, `guest` | signed-in: someone is signed in (a back office, always); guest: nobody is signed in yet (a public service before the sign-in) |
104
+
105
+ A region shows where its When holds, in this order: a required one always, the others when there is something to put in them.
106
+
107
+ | Region | When | Required | What | Use |
108
+ | --- | --- | --- | --- | --- |
109
+ | `product` | any | yes | the name of the application at the start of the bar, as text; a product may put its logo in its place (logo) | `mds-text typography=h6 tag=p` |
110
+ | `sections` | sections: few | | the sections of the application as links, in the order of the work, the current one marked: aria-current=page and a look of its own; in the bar from the width of the desktop, in the menu under it | `mds-button slot=nav href variant=dark tone=text` |
111
+ | `person` | person: signed-in | | the last element of the bar: a button named after the person signed in, which opens their menu: their name, Profilo, then Esci after a separator | `mds-button slot=nav icon variant=dark tone=text`, `mds-dropdown`, `mds-separator` |
112
+ | `sign-in` | person: guest | | the last element of the bar: Accedi, a link to the sign-in | `mds-button slot=nav href variant=dark tone=outline` |
113
+ | `menu` | any | | the menu of the bar, opened by its button: the sections, the current one marked, then after a separator the name of the person, Profilo and Esci, or Accedi, which keeps its outline; under the width of the desktop with few sections, at every width with many | `mds-header menu`, `mds-button href variant=dark tone=text`, `mds-button href variant=dark tone=outline`, `mds-separator` |
114
+ | `main` | any | yes | the content of the page, under the bar: one main in the frame of the page, its header first (page-header), then its sections | |
115
+
116
+ ## Layout
117
+
118
+ - The bar is `mds-header` with one `mds-header-bar`, the first element of the page: a band that
119
+ stays put at the top, in the flow, so the page starts under it (`surfaces/band`).
120
+ - In the bar: the name of the application at the start (the default slot of the bar), then in
121
+ its `nav` slot the sections and, last, the button of the person or Accedi, with the gap the
122
+ bar gives them.
123
+ - With few sections, `mds-header` keeps its defaults (`menu="mobile"`, `nav="desktop"`): from
124
+ the width of a tablet (768 px) the sections and the person stand in the bar, and under 1024 px
125
+ the button of the menu opens them too (Magma gaps). With many, `menu="all"`: the sections
126
+ live only in the menu, at every width; the bar keeps the name and, from 768 px, the person,
127
+ who is in the menu under it.
128
+ - The menu (`slot="menu"` of `mds-header`) is one column at its inset (`p-inset`): the sections
129
+ as links as wide as the menu, aligned to the start, the current one marked, then an
130
+ `mds-separator`, then the name of the person, Profilo and Esci, or Accedi; `gap-inline` (300)
131
+ between the entries, as between the actions of a row, until the rhythm names a relation for
132
+ a column of links. A long menu scrolls inside its panel.
133
+ - The main is `page-frame` (`widths/page`): the column the bar gives its own content, with
134
+ `gap-between-sections` between its sections and as its padding at the top and the bottom
135
+ (`py-between-sections`, `rhythm/between-sections`); its first section is the header of the
136
+ page (`page-header`). Everything in it starts at the start edge of the frame, on the edge of
137
+ the name of the application (`widths/start-edge`).
138
+
139
+ ## Always true
140
+
141
+ <!-- Generated from the frontmatter: edit it there, then run nx run stencil:generate.pattern -- --sync. -->
142
+
143
+ These hold in every product: a product layer cannot change them.
144
+
145
+ | Id | Rule | Checked by |
146
+ | --- | --- | --- |
147
+ | `one-bar` | The application has one bar: mds-header with one mds-header-bar, first in the page; the page starts under it, with no room reserved by hand. | review |
148
+ | `sections-are-links` | The sections are links to their pages (mds-button with href), the current one marked with aria-current="page"; never a button that runs a script to change page. | review |
149
+ | `every-width` | Every section is reached at every width: in the bar from the width of the desktop, in the menu of the bar under it; never menu="none" on a bar with sections. | review |
150
+ | `person-named` | The button of the person is named after them ("Account di Mario Rossi") and their menu opens with their name: the person always sees who is signed in. | review |
151
+ | `one-main` | The content of a page is one main under the bar, in the frame of the page, its header first; the bar never holds the title or the actions of a page. | review |
152
+ | `not-the-app-bar` | The page header is the head of the main content, under the bar of the application; the navigation of the application is never in it. (from `page-header`) | review |
153
+ | `page` | `page-frame` on the page: at most 1280 px, centred in the window, a gutter of `600` outside it, the column the bar gives its own content; everything inside starts at the start edge of the frame, and a table or a list takes the whole frame (from `widths`) | |
154
+ | `start-edge` | Capped content (text, forms) stands at the start edge of its frame, never centred inside it: the title, the text, the form and the table of a page start on the edge of the content of the bar. (from `widths`) | review |
155
+ | `band` | a band, a strip of surface as wide as the page, drawn by the component that stays put, which keeps its room: the bar of the application (mds-header-bar in mds-header, `surface-raised`, `shadow-md-sharp`, in the flow at the top and sticky, so the page starts under it), the actions of an edit (mds-status-bar, `surface-overlay`, `shadow-md`, its room kept at the end of the page); never the header of the page (`section`) made sticky (from `surfaces`) | |
156
+ | `between-sections` | `gap-between-sections` (1600) between two sections of a page, each with its title (from `rhythm`) | |
157
+
158
+ ## Open choices
159
+
160
+ <!-- Generated from the frontmatter: edit it there, then run nx run stencil:generate.pattern -- --sync. -->
161
+
162
+ The default decides these; a product layer may narrow them.
163
+
164
+ | Id | Default | A product may |
165
+ | --- | --- | --- |
166
+ | `logo` | the name of the application, as text | put the logo of the product in its place, an mds-img with the name of the application as its alt |
167
+
168
+ ## Situations
169
+
170
+ <!-- Generated from the frontmatter: edit it there, then run nx run stencil:generate.pattern -- --sync. -->
171
+
172
+ Situations every application has, each with the regions it shows: they give the examples, the texts and the keywords. The situations of a product's own domain go in its layer.
173
+
174
+ | Id | Situation | Regions |
175
+ | --- | --- | --- |
176
+ | `back-office` | A back office with four sections, an operator signed in | `product`, `sections`, `person`, `menu`, `main` |
177
+ | `many-sections` | An application with a dozen sections, an operator signed in | `product`, `person`, `menu`, `main` |
178
+ | `public-service` | A public service a citizen opens before signing in | `product`, `sections`, `sign-in`, `menu`, `main` |
179
+
180
+ ## Accessibility
181
+
182
+ - `mds-header-bar` draws the `nav` landmark around its `nav` slot; the content of the page is
183
+ the one `main` landmark.
184
+ - The current section carries `aria-current="page"` on its `mds-button`, which keeps the role
185
+ of link on its host; its look is not the only sign of it.
186
+ - The button of the person has an `aria-label` that names them, and opens its menu with
187
+ `mds-dropdown`, a `menu` by default: the arrows walk its entries, Esc closes it and gives the
188
+ focus back to the button.
189
+ - The menu of the bar opens in the `mds-modal` of `mds-header`, whose button Magma names
190
+ ("Apri il menu" in Italian).
191
+
192
+ ## Content
193
+
194
+ - The name of the application is what the people who use it call it ("Servizi demografici"),
195
+ not the name of the company or of the product line.
196
+ - A section is the plural of what it holds ("Pratiche", "Contatti", "Scadenze"), in the order of
197
+ the work, the most used first.
198
+ - The menu of the person: their name and surname, then "Profilo", then "Esci" after the
199
+ separator. Nobody signed in: "Accedi".
200
+
201
+ ## Magma gaps
202
+
203
+ - `mds-button` has no state for the current section of a bar: `active` is the pressed look, which
204
+ the button clears when the pointer is released. The look of the current section is a decision
205
+ of the round of the building blocks, written with the props Magma has: `tone="weak"`, a filled shape, which still stands at 1.45:1 against the bar in the light mode and 2.48:1 in the dark, under the 3:1 of a state.
206
+ - No side navigation: with many sections, the menu of the bar holds them at every width, and
207
+ they are not in view beside the page.
208
+ - No link that skips the bar to the content: a screen reader jumps to the `main` landmark, a
209
+ keyboard passes the sections first.
210
+ - The two breakpoints of `mds-header` do not meet: `nav="desktop"` shows the sections from
211
+ 768 px, `menu="mobile"` hides the button of the menu only from 1024 px, so between them the
212
+ bar shows both; at 768 px five sections wrap the name of the application on two lines.
213
+ - `mds-dropdown` gives `role="menuitem"` to every child, the name of the person and the
214
+ separator too, so the arrows stop on them, while its `mds-button href` entries keep
215
+ `role="link"` and `tabindex="0"`, in the Tab order of a `menu`.
216
+
217
+ ## Decisions
218
+
219
+ | Date | Decision | Why |
220
+ | --- | --- | --- |
221
+ | 2026-11-03 | The application shell is a block: the bar and the frame of the page come back in `list-with-filters`, `record-detail`, `empty-state` and `message-placement` | The round of the building blocks: every whole-page preview wrote them by hand, each a little differently; the docs site already names the app shell among the building blocks (`plan/DIRECTION.md`, Patterns section, Navigation). |
222
+ | 2026-11-03 | The sections are links with the current one marked, and they reach a phone through the menu of the bar | The previews had buttons with no address, no current section and `menu="none"`, which hides every section under the width of the desktop (`nav="desktop"` is the default of `mds-header`). |
223
+ | 2026-11-03 | The current section is `variant="dark" tone="weak"`, the others `tone="text"`, in the bar and in the menu | A filled shape, not only a colour: `primary text` (B) changed only the ink, and in the dark mode the accent is near the other sections (1.22:1), so the current one could not be seen. Neither reaches 3:1 against the bar: a Magma gap. The maintainer's choice A in the review of round 3. |
@@ -0,0 +1,18 @@
1
+ ---
2
+ # A Magma pattern: the format and the commands are in docs/PATTERNS.md.
3
+ id: choose-items
4
+ kind: pattern
5
+ title: Choose items
6
+ group: data
7
+ layer: magma
8
+ status: candidate
9
+ need: >-
10
+ The person picks items from a long list to use them for something else, such as members to
11
+ add to a group or documents to attach.
12
+ ---
13
+
14
+ # Choose items
15
+
16
+ A candidate: a need Magma knows and has not defined yet, split from `list-with-filters` on
17
+ 2026-10-29. Until it is defined, the agent says that no default covers it, and proposes the
18
+ pattern (`get_guide reporting`).
@@ -0,0 +1,17 @@
1
+ ---
2
+ # A Magma pattern: the format and the commands are in docs/PATTERNS.md.
3
+ id: concurrent-editing
4
+ kind: pattern
5
+ title: Concurrent editing
6
+ group: data
7
+ layer: magma
8
+ status: candidate
9
+ need: >-
10
+ Two people change the same record at the same time, and neither loses their changes.
11
+ ---
12
+
13
+ # Concurrent editing
14
+
15
+ A candidate: a need Magma knows and has not defined yet, cited by `error-recovery` (`changed-
16
+ meanwhile`). Until it is defined, the agent says that no default covers it, and proposes the
17
+ pattern (`get_guide reporting`).
@@ -0,0 +1,216 @@
1
+ ---
2
+ # A Magma pattern: the format and the commands are in docs/PATTERNS.md.
3
+ id: confirm-action
4
+ kind: pattern
5
+ title: Confirm an action
6
+ group: messages-and-states
7
+ layer: magma
8
+ status: decided
9
+ need: >-
10
+ The person is about to do something that cannot be taken back, and must decide knowing what
11
+ will happen.
12
+ principle: An action that cannot be taken back asks first, naming the item and the consequence.
13
+ keywords: [confirm, are you sure, delete, remove, undo, cannot be undone, irreversible, permanently]
14
+ not-for:
15
+ - need: where the outcome of the action is told
16
+ use: message-placement
17
+ - need: payments, signatures and consent
18
+ use: consent-and-legal
19
+ assumptions:
20
+ - The action starts from a control the person chose (a button, a menu item).
21
+ high-stakes: true
22
+ components: [mds-modal, mds-button, mds-banner, mds-toast]
23
+ related: [message-placement, error-recovery, notification-center, labels-and-values]
24
+ validated-on: []
25
+
26
+ variables:
27
+ reversible: { values: ["yes", "no"], means: "can the person undo it afterwards" }
28
+ reaches-others: { values: ["no", "yes"], means: "does it send something to other people or systems, which cannot be called back" }
29
+ items: { values: [one, many], means: "how many items the action acts on" }
30
+ frequency: { values: [occasional, frequent], means: "how often the same person does it in a working day" }
31
+ stakes: { values: [normal, legal], means: "legal: money, a signature or consent, which have rules of their own" }
32
+ preview: { values: [seen, unseen], means: "does the person see what goes and to whom when acting" }
33
+
34
+ cases:
35
+ - { id: act-then-undo, reversible: "yes", reaches-others: "no", stakes: normal, where: "act at once, then a toast with Undo, the default light toast, which stays until closed", use: ["mds-toast duration=0 dismissible", "mds-button slot=action size=sm variant=dark tone=outline"] }
36
+ - { id: ask-first, reversible: "no", reaches-others: "no", items: one, frequency: occasional, stakes: normal, where: "a dialog before acting: the question names the item, the text says the consequence", use: ["mds-modal"] }
37
+ - { id: make-reversible, reversible: "no", reaches-others: "no", items: one, frequency: frequent, stakes: normal, where: "make it reversible: act at once, then a toast with Undo; the item is kept for a while to restore it", use: ["mds-toast duration=0 dismissible", "mds-button slot=action size=sm variant=dark tone=outline"], see: act-then-undo }
38
+ - { id: ask-first-many, reversible: "no", reaches-others: "no", items: many, stakes: normal, where: "a dialog before acting that says how many", use: ["mds-modal"] }
39
+ - { id: send-as-shown, reaches-others: "yes", preview: seen, stakes: normal, where: "no dialog: the Send button, with what and to whom in front of the person, is the confirmation; once sent, a success banner takes the place of the form, so nothing goes twice, and its action brings back an empty form", use: ["mds-button type=submit await", "mds-banner variant=success tone=strong", "mds-button slot=action"] }
40
+ - { id: ask-before-sending, reaches-others: "yes", preview: unseen, stakes: normal, where: "a dialog that shows what goes and to whom before sending", use: ["mds-modal"] }
41
+ gaps: []
42
+ not-applicable:
43
+ - { stakes: legal, why: "payments, signatures and consent have legal rules of their own: the candidate consent-and-legal" }
44
+
45
+ always-true:
46
+ - id: irreversible-asks
47
+ rule: An action that cannot be taken back asks first.
48
+ checked-by: review
49
+ - id: names-item-and-consequence
50
+ rule: The question names the item, the text says the consequence.
51
+ checked-by: review
52
+ - id: verb-not-ok
53
+ rule: The confirm button repeats the verb ("Delete"), never "OK" or "Yes".
54
+ checked-by: review
55
+ note: a lint on the known words is possible
56
+ - id: cancel-is-safe
57
+ rule: Cancel and Esc never do the action.
58
+ checked-by: review
59
+
60
+ open-choices:
61
+ - { id: typed-confirmation, default: "none: the dialog that names the item and says how many is enough", may: "ask to type the name or the number for its gravest cases" }
62
+
63
+ situations:
64
+ - { situation: A document is removed from a draft, case: act-then-undo }
65
+ - { situation: An item is deleted for good, case: ask-first }
66
+ - { situation: 12 items are deleted for good, case: ask-first-many }
67
+ - { situation: "An item is archived, and can be restored", case: act-then-undo }
68
+ - { situation: "An operator closes dozens of tickets a day, for good", case: make-reversible }
69
+ - { situation: "A message is sent from its form, with the text and the recipient on screen", case: send-as-shown }
70
+ - { situation: A reminder is sent to a person from the menu of a row, case: ask-before-sending }
71
+ - { situation: A payment is confirmed, use: consent-and-legal }
72
+ ---
73
+
74
+ # Confirm an action
75
+
76
+ **An action that cannot be taken back asks first, naming the item and the consequence.**
77
+
78
+ ## When to use it
79
+
80
+ An action the person chose that cannot be taken back, or that sends something to other people:
81
+ delete for good, close for good, send. Not where its outcome is told (`message-placement`), not
82
+ payments, signatures and consent (`consent-and-legal`).
83
+
84
+ ## What decides it
85
+
86
+ Six questions: whether the person can undo the action afterwards, whether it sends something
87
+ to other people or systems, whether it acts on one item or many, how often the same person does
88
+ it in a working day, whether money, a signature or consent is at stake, and whether the person
89
+ sees what goes and to whom when acting.
90
+
91
+ ## Cases
92
+
93
+ <!-- Generated from the frontmatter: edit it there, then run nx run stencil:generate.pattern -- --sync. -->
94
+
95
+ | Variable | Values | Means |
96
+ | --- | --- | --- |
97
+ | `reversible` | `yes`, `no` | can the person undo it afterwards |
98
+ | `reaches-others` | `no`, `yes` | does it send something to other people or systems, which cannot be called back |
99
+ | `items` | `one`, `many` | how many items the action acts on |
100
+ | `frequency` | `occasional`, `frequent` | how often the same person does it in a working day |
101
+ | `stakes` | `normal`, `legal` | legal: money, a signature or consent, which have rules of their own |
102
+ | `preview` | `seen`, `unseen` | does the person see what goes and to whom when acting |
103
+
104
+ A case that leaves a variable out holds for any of its values.
105
+
106
+ | Case | When | Where | Use |
107
+ | --- | --- | --- | --- |
108
+ | `act-then-undo` | reversible: yes; reaches-others: no; stakes: normal | act at once, then a toast with Undo, the default light toast, which stays until closed | `mds-toast duration=0 dismissible`, `mds-button slot=action size=sm variant=dark tone=outline` |
109
+ | `ask-first` | reversible: no; reaches-others: no; items: one; frequency: occasional; stakes: normal | a dialog before acting: the question names the item, the text says the consequence | `mds-modal` |
110
+ | `make-reversible` | reversible: no; reaches-others: no; items: one; frequency: frequent; stakes: normal | make it reversible: act at once, then a toast with Undo; the item is kept for a while to restore it; see `act-then-undo` | `mds-toast duration=0 dismissible`, `mds-button slot=action size=sm variant=dark tone=outline` |
111
+ | `ask-first-many` | reversible: no; reaches-others: no; items: many; stakes: normal | a dialog before acting that says how many | `mds-modal` |
112
+ | `send-as-shown` | reaches-others: yes; stakes: normal; preview: seen | no dialog: the Send button, with what and to whom in front of the person, is the confirmation; once sent, a success banner takes the place of the form, so nothing goes twice, and its action brings back an empty form | `mds-button type=submit await`, `mds-banner variant=success tone=strong`, `mds-button slot=action` |
113
+ | `ask-before-sending` | reaches-others: yes; stakes: normal; preview: unseen | a dialog that shows what goes and to whom before sending | `mds-modal` |
114
+
115
+ Not applicable:
116
+
117
+ | When | Why |
118
+ | --- | --- |
119
+ | stakes: legal | payments, signatures and consent have legal rules of their own: the candidate consent-and-legal |
120
+
121
+ No gaps: every combination has a case or is not applicable.
122
+
123
+ ## Parts
124
+
125
+ The dialog of `ask-first` and `ask-first-many`:
126
+
127
+ - the title is the question, with the name of the item ("Delete Mario Rossi?") or how many
128
+ ("Delete 12 items?"); it is also the accessible name of the dialog;
129
+ - a sentence with the consequence ("They will no longer be able to sign in. Their changes
130
+ stay, under their name.");
131
+ - an error banner, hidden, for when the action fails, `tone="strong"`, right above the row
132
+ (`message-placement`, `action-failed-in-place`);
133
+ - at the end, Cancel (`variant="dark" tone="outline"`), then the action with its verb
134
+ (`variant="error"` when it destroys).
135
+
136
+ The dialog of `ask-before-sending` is the same, with what goes and to whom in place of the
137
+ consequence (the recipient and the text, as labels and values), and the action with its verb in
138
+ the default `primary strong`: sending does not destroy.
139
+
140
+ The toast with Undo of `act-then-undo` and `make-reversible` is the default `light` toast, with
141
+ Undo as `mds-button size="sm" variant="dark" tone="outline"` in its `action` slot.
142
+
143
+ After `send-as-shown`, a success banner (`tone="strong"`) takes the place of the form: it names
144
+ what went and to whom, and its action ("Write another message") brings back the form, empty.
145
+
146
+ ## Behaviour over time
147
+
148
+ - On the action: `await` on its button, which cannot be pressed again.
149
+ - A message sent from its form (`send-as-shown`): the form goes when the message went, so the
150
+ same message cannot be sent twice by pressing again; the banner that takes its place is read
151
+ out, and the focus goes to the title of the page.
152
+ - It works: the dialog closes, a toast that names what went, the default `light` toast of a
153
+ removal (`message-placement`, `removal-toast-neutral`); if the element that opened the dialog
154
+ is gone, the focus goes to the title of the page.
155
+ - It fails: the banner in the dialog, "Nothing was changed"; the dialog stays open.
156
+ - Cancel or Esc: the dialog closes (to verify on `mds-modal`: the focus goes back to what
157
+ opened it).
158
+ - On opening, the focus is on Cancel, the safe choice; Esc means Cancel, so the dialog is not
159
+ `strict`.
160
+ - The toast with Undo stays until it is closed, as every toast with an action
161
+ (`message-placement`, `toast-action-stays`): the time limit to undo is kept by the
162
+ application, which keeps the item for a while, not by the toast.
163
+
164
+ ## Always true
165
+
166
+ <!-- Generated from the frontmatter: edit it there, then run nx run stencil:generate.pattern -- --sync. -->
167
+
168
+ These hold in every product: a product layer cannot change them.
169
+
170
+ | Id | Rule | Checked by |
171
+ | --- | --- | --- |
172
+ | `irreversible-asks` | An action that cannot be taken back asks first. | review |
173
+ | `names-item-and-consequence` | The question names the item, the text says the consequence. | review |
174
+ | `verb-not-ok` | The confirm button repeats the verb ("Delete"), never "OK" or "Yes". | review; a lint on the known words is possible |
175
+ | `cancel-is-safe` | Cancel and Esc never do the action. | review |
176
+
177
+ ## Open choices
178
+
179
+ <!-- Generated from the frontmatter: edit it there, then run nx run stencil:generate.pattern -- --sync. -->
180
+
181
+ The default decides these; a product layer may narrow them.
182
+
183
+ | Id | Default | A product may |
184
+ | --- | --- | --- |
185
+ | `typed-confirmation` | none: the dialog that names the item and says how many is enough | ask to type the name or the number for its gravest cases |
186
+
187
+ ## Situations
188
+
189
+ <!-- Generated from the frontmatter: edit it there, then run nx run stencil:generate.pattern -- --sync. -->
190
+
191
+ Situations every application has, each with its case: they give the examples, the texts and the keywords. The situations of a product's own domain go in its layer.
192
+
193
+ | Situation | Case |
194
+ | --- | --- |
195
+ | A document is removed from a draft | `act-then-undo` |
196
+ | An item is deleted for good | `ask-first` |
197
+ | 12 items are deleted for good | `ask-first-many` |
198
+ | An item is archived, and can be restored | `act-then-undo` |
199
+ | An operator closes dozens of tickets a day, for good | `make-reversible` |
200
+ | A message is sent from its form, with the text and the recipient on screen | `send-as-shown` |
201
+ | A reminder is sent to a person from the menu of a row | `ask-before-sending` |
202
+ | A payment is confirmed | not here: `consent-and-legal` |
203
+
204
+ ## Decisions
205
+
206
+ | Date | Decision | Why |
207
+ | --- | --- | --- |
208
+ | 2026-10-16 | Proposed: an irreversible action always asks, naming the item and the consequence | Open decision of the docs site, `agents/patterns.md`. |
209
+ | 2026-10-28 | Draft with variables; the frequent irreversible action and the action that reaches others left as gaps | The sources do not settle them. |
210
+ | 2026-10-28 | An irreversible action done many times a day is made reversible, with Undo (`make-reversible`) | Asking every time teaches to confirm without reading, where the confirmation matters most. |
211
+ | 2026-10-28 | An action that reaches others asks only when the person does not see what goes and to whom (`send-as-shown`, `ask-before-sending`) | With the content and the recipient in front of them, the Send button is already the confirmation. |
212
+ | 2026-10-28 | The toast with Undo stays until closed | The rule of every toast with an action, there for accessibility; the time limit is the application's. |
213
+ | 2026-10-28 | No typed confirmation in the default; a product may add it (`typed-confirmation`) | The dialog that names the item and says how many is enough for a default. |
214
+ | 2026-11-01 | The toast of a removal, with Undo or after a confirmation, is the default `light` toast, not `success` (`act-then-undo`, `make-reversible`) | A removal is a loss the person wanted, and green celebrates it; on the neutral toast no colour judges the removal or Undo (`removal-toast-neutral` of `message-placement`). https://github.com/magma-design-system/magma/issues/1189#issuecomment-6556983924 |
215
+ | 2026-11-03 | Cancel is `dark outline`, the error banner of the dialog `tone="strong"` right above the row; the action of the toast with Undo is `size="sm" variant="dark" tone="outline"` | The rules of the domain Actions (`secondary`, `failed`, `toast`), which are newer than this pattern. Applied in review round 2 of the previews: https://github.com/magma-design-system/magma/issues/1233 |
216
+ | 2026-11-03 | After `send-as-shown`, a success banner takes the place of the form, and its action brings back an empty form; no toast | With the text still on screen and a toast that goes, the person may send the same message again in a few seconds without knowing it went. Asked in review round 2 of the previews: https://github.com/magma-design-system/magma/issues/1233 |
@@ -0,0 +1,16 @@
1
+ ---
2
+ # A Magma pattern: the format and the commands are in docs/PATTERNS.md.
3
+ id: consent-and-legal
4
+ kind: pattern
5
+ title: Consent and legal steps
6
+ group: input
7
+ layer: magma
8
+ status: candidate
9
+ need: >-
10
+ The person pays, signs or gives consent: steps with legal rules of their own.
11
+ ---
12
+
13
+ # Consent and legal steps
14
+
15
+ A candidate: a need Magma knows and has not defined yet, cited by `confirm-action`. Until it is
16
+ defined, the agent says that no default covers it, and proposes the pattern (`get_guide reporting`).