@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,184 @@
1
+ ---
2
+ # A Magma building block: the format and the commands are in docs/PATTERNS.md, "A building block".
3
+ id: labels-and-values
4
+ kind: block
5
+ title: Labels and values
6
+ group: data
7
+ layer: magma
8
+ status: decided
9
+ need: >-
10
+ The person reads the data of an item, each value under the name of what it is.
11
+ principle: Each value stands under its label, row by row, in two columns where there is room.
12
+ keywords: [labels and values, data, details, description list, dl, key value, key-value pairs, fields of a record, read-only data, summary of the data, properties]
13
+ not-for:
14
+ - need: changing the data (a form, its fields and their errors)
15
+ use: form-and-validation
16
+ - need: many items, each with the same properties (a table)
17
+ use: item-list
18
+ high-stakes: false
19
+ components: [mds-text]
20
+ used-by: [record-detail, confirm-action]
21
+ related: [record-detail, confirm-action, item-list, form-and-validation]
22
+ validated-on: []
23
+
24
+ variables:
25
+ place: { values: [section, inside], means: "section: the data is a section of a page, with a title of its own; inside: the data is inside a container that names it already (the window of a dialog, a card, a form above its row of actions)" }
26
+
27
+ regions:
28
+ - { id: title, when: { place: section }, what: "the title of the section, which names the group of data (\"Dati anagrafici\", \"Recapiti\")", use: ["mds-text typography=section tag=h2"] }
29
+ - { id: pairs, required: true, what: "the list of the data: for each one its label, then its value, in the order the person reads them; a long value takes the whole row; a value not given says so", use: ["mds-text typography=label tag=dt", "mds-text tag=dd"] }
30
+
31
+ always-true:
32
+ - id: label-above-value
33
+ rule: "Each value stands under its label: a dl with one div for each pair, the label (dt) in the muted foreground, the value (dd) in the default one; never a table of two columns, never a form."
34
+ checked-by: review
35
+ - id: columns-by-room
36
+ rule: "Two columns where the list has room, one under it, at the threshold of the halves of a form (28rem, field-group): the data and the fields that change it go to one column together; never a number of columns fixed on the page."
37
+ checked-by: review
38
+ - id: long-value-whole-row
39
+ rule: "A long value (a text, an address on several lines, a list) takes the whole row, at every width."
40
+ checked-by: review
41
+ - id: missing-says-so
42
+ rule: "A value not given says so, \"Non indicato\", in the muted foreground; never an empty space or a dash."
43
+ checked-by: review
44
+ - id: read-not-disabled
45
+ rule: "Data the person cannot change here is read as labels and values, never shown as fields disabled or read-only; changing it is a form of its own (record-detail, edit-data)."
46
+ checked-by: review
47
+ - id: section
48
+ from: titles
49
+ - id: title-content
50
+ from: rhythm
51
+ - id: label-control
52
+ from: rhythm
53
+ - id: between-fields
54
+ from: rhythm
55
+
56
+ open-choices: []
57
+
58
+ situations:
59
+ - { id: data-of-a-contact, situation: "The personal data of a contact, a section of its page", place: section }
60
+ - { id: what-is-sent, situation: "What a reminder sends and to whom, in the dialog that asks before sending it", place: inside }
61
+ - { id: payment-before-paying, situation: "The data of a payment, above the button that pays it", place: inside }
62
+ ---
63
+
64
+ # Labels and values
65
+
66
+ **Each value stands under its label, row by row, in two columns where there is room.**
67
+
68
+ ## When to use it
69
+
70
+ Wherever a page or a container shows the data of one item to read: the personal data of a
71
+ contact, what a message sends and to whom before it goes, the amount of a payment above the
72
+ button that pays it. It came out of the round of the building blocks (2026-11-03): the list of
73
+ labels and values comes back in `record-detail` (the data of the record, section by section)
74
+ and in `confirm-action` (`ask-before-sending`: the recipient and the text), and the previews of
75
+ `error-recovery` and `loading` write it too. Not for changing the data (a form,
76
+ `form-and-validation`), and not for many items with the same properties (a table, `item-list`).
77
+
78
+ ## What decides it
79
+
80
+ One question: whether the data is a section of the page, with a title of its own, or stands
81
+ inside a container that names it already.
82
+
83
+ ## Regions
84
+
85
+ <!-- Generated from the frontmatter: edit it there, then run nx run stencil:generate.pattern -- --sync. -->
86
+
87
+ | Variable | Values | Means |
88
+ | --- | --- | --- |
89
+ | `place` | `section`, `inside` | section: the data is a section of a page, with a title of its own; inside: the data is inside a container that names it already (the window of a dialog, a card, a form above its row of actions) |
90
+
91
+ A region shows where its When holds, in this order: a required one always, the others when there is something to put in them.
92
+
93
+ | Region | When | Required | What | Use |
94
+ | --- | --- | --- | --- | --- |
95
+ | `title` | place: section | | the title of the section, which names the group of data ("Dati anagrafici", "Recapiti") | `mds-text typography=section tag=h2` |
96
+ | `pairs` | any | yes | the list of the data: for each one its label, then its value, in the order the person reads them; a long value takes the whole row; a value not given says so | `mds-text typography=label tag=dt`, `mds-text tag=dd` |
97
+
98
+ ## Layout
99
+
100
+ - The list is a `dl` with one `div` for each pair; in each pair the label, then the value,
101
+ `gap-label-control` (300) between them (`rhythm/label-control`), as the label and the control
102
+ of a field.
103
+ - The pairs are rows of data: `gap-between-fields` (600) between them (`rhythm/between-fields`),
104
+ in both directions.
105
+ - Two columns from 28rem of the list, one under it: the threshold of `field-group`, so the data
106
+ and the form that changes it break at the same width; the pairs fill the rows in reading
107
+ order, each starting at the top of its row (`items-start`, as `field-group`). A long value
108
+ spans the row (`col-span-full`, never `col-span-2`, which adds a track on one column).
109
+ - Until Magma carries the columns (Magma gaps): `@md:grid-cols-2` on the `dl`, measured by a
110
+ container as wide as the list: a `section` is one; any other parent takes `@container` (a
111
+ `form`, the `div` that holds the tabs of a record and their panels); inside `mds-banner` a
112
+ `div class="@container"` wraps the list (the banner measures its close button too).
113
+ - In a section of a page the list stands in the column of a form (`max-w-form`): the shape it
114
+ has in a dialog and in the form that changes it.
115
+ - With a title (`place: section`), the title and the list are `gap-title-content` (300) apart
116
+ (`rhythm/title-content`), and the section stands from the next one as the sections of a page
117
+ do (`rhythm/between-sections`).
118
+ - Inside a container, the list takes its width and its inset; in a form, it stands above the
119
+ fields or the row of actions, `gap-content-actions` from the row (`rhythm/content-actions`).
120
+
121
+ ## Always true
122
+
123
+ <!-- Generated from the frontmatter: edit it there, then run nx run stencil:generate.pattern -- --sync. -->
124
+
125
+ These hold in every product: a product layer cannot change them.
126
+
127
+ | Id | Rule | Checked by |
128
+ | --- | --- | --- |
129
+ | `label-above-value` | Each value stands under its label: a dl with one div for each pair, the label (dt) in the muted foreground, the value (dd) in the default one; never a table of two columns, never a form. | review |
130
+ | `columns-by-room` | Two columns where the list has room, one under it, at the threshold of the halves of a form (28rem, field-group): the data and the fields that change it go to one column together; never a number of columns fixed on the page. | review |
131
+ | `long-value-whole-row` | A long value (a text, an address on several lines, a list) takes the whole row, at every width. | review |
132
+ | `missing-says-so` | A value not given says so, "Non indicato", in the muted foreground; never an empty space or a dash. | review |
133
+ | `read-not-disabled` | Data the person cannot change here is read as labels and values, never shown as fields disabled or read-only; changing it is a form of its own (record-detail, edit-data). | review |
134
+ | `section` | the style `h5` (20px), the tag of its place in the outline (`h2` under the page) (from `titles`) | |
135
+ | `title-content` | `gap-title-content` (300) between a title and the content it names (from `rhythm`) | |
136
+ | `label-control` | `gap-label-control` (300) between the label of a field, its control and its message (from `rhythm`) | |
137
+ | `between-fields` | `gap-between-fields` (600) between two fields of a form, or two rows of data (from `rhythm`) | |
138
+
139
+ ## Situations
140
+
141
+ <!-- Generated from the frontmatter: edit it there, then run nx run stencil:generate.pattern -- --sync. -->
142
+
143
+ 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.
144
+
145
+ | Id | Situation | Regions |
146
+ | --- | --- | --- |
147
+ | `data-of-a-contact` | The personal data of a contact, a section of its page | `title`, `pairs` |
148
+ | `what-is-sent` | What a reminder sends and to whom, in the dialog that asks before sending it | `pairs` |
149
+ | `payment-before-paying` | The data of a payment, above the button that pays it | `pairs` |
150
+
151
+ ## Accessibility
152
+
153
+ - A `dl` with `dt` and `dd` (`mds-text tag="dt"`, `tag="dd"`): a screen reader announces a
154
+ list of terms and reads each label with its value.
155
+ - The title of a section is a heading of the outline of the page (`h2` under the `h1` of the
156
+ page, `titles/section`).
157
+ - A value that is a link names where it goes; a status is an `mds-badge` with its label.
158
+
159
+ ## Content
160
+
161
+ - A label names the datum in a few words, with a capital and no colon: "Codice fiscale",
162
+ "Nato il", "Destinatario".
163
+ - A value is written as the person reads it, not as the system stores it: "1 gennaio 1980",
164
+ "16,00 euro", never `1980-01-01` or `16.0`.
165
+ - A value not given: "Non indicato".
166
+
167
+ ## Magma gaps
168
+
169
+ - No component nor carrier for labels and values: a `dl` of `mds-text`, laid out with Tailwind.
170
+ `@md` copies the threshold of `field-group` by its value, which `widths/by-role` forbids, and
171
+ in px (448): with a root font other than 16 px the two part (measured at 17 px: a list of
172
+ 449 px, one column in `field-group`, two with `@md`). A class with the tracks of
173
+ `field-group`, whose children take one track unless they span the row, would carry them; or
174
+ a container size in rem with a variant of its own, as `--magma-container-actions` does.
175
+ - The base styles of Magma keep the margins the browser gives `dl` and `dd` (the indent of
176
+ `dd`): `m-0` on both.
177
+
178
+ ## Decisions
179
+
180
+ | Date | Decision | Why |
181
+ | --- | --- | --- |
182
+ | 2026-11-03 | Labels and values are a block: they come back in `record-detail` and `confirm-action` | The round of the building blocks, from the previews of the patterns; `record-detail` listed the missing component among its Magma gaps. |
183
+ | 2026-11-03 | Two columns from the threshold of `field-group`, one under it | The previews fixed two columns on the page, which squeeze a long value on a phone; the threshold of the halves of a form keeps the data and its form together. |
184
+ | 2026-11-03 | In a section of a page the list stands in the column of a form, `max-w-form` | The shape it has in a dialog and in the form that changes it; across the whole section at 1024 px its columns were 476 px for values of a few words. The maintainer's choice A in the review of round 3. |
@@ -0,0 +1,282 @@
1
+ ---
2
+ # A Magma pattern: the format and the commands are in docs/PATTERNS.md.
3
+ id: list-with-filters
4
+ kind: pattern
5
+ title: List with filters
6
+ group: data
7
+ layer: magma
8
+ status: decided
9
+ need: >-
10
+ The person finds the items they need in a long list, by searching, filtering and paging.
11
+ principle: The back end finds the items, the address keeps the query, and nothing on screen moves until the person asks.
12
+ keywords: [list, search, filter, filters, results, table, pages, pagination, sort, select rows, bulk actions, batch actions, queue, new items]
13
+ not-for:
14
+ - need: choosing items from a list for something else (members to add to a group, documents to attach)
15
+ use: choose-items
16
+ - need: choosing one value for a field of a form (the recipient of a message)
17
+ use: form-and-validation
18
+ - need: a list with nothing to show
19
+ use: empty-state
20
+ - need: a list that is loading
21
+ use: loading
22
+ - need: a list that could not be loaded
23
+ use: error-recovery
24
+ - need: where the outcome of an action on the list is told
25
+ use: message-placement
26
+ - need: what a role may not see or do in the list
27
+ use: permissions
28
+ assumptions:
29
+ - The back end can search, count, sort and page the set.
30
+ - The application knows whether other people or systems change the set while it is on screen.
31
+ high-stakes: false
32
+ components: [mds-input, mds-input-field, mds-input-select, mds-filter, mds-filter-item, mds-table, mds-table-header-cell, mds-paginator, mds-notification, mds-text, mds-badge, mds-button, mds-card]
33
+ related: [loading, empty-state, error-recovery, message-placement, confirm-action, record-detail, choose-items, page-header, item-list, app-shell]
34
+ validated-on: []
35
+
36
+ variables:
37
+ goal: { values: [open, act], means: "open: the person opens one item at a time (a request, to work on it); act: the person acts on several items at once (archive, assign, delete)" }
38
+ changes: { values: ["no", by-others], means: "by-others: other people or systems add or change items while the list is on screen (a queue of incoming requests)" }
39
+
40
+ cases:
41
+ - { id: find-and-open, goal: open, changes: "no", where: "the title of the list, a search form, the summary, the results and the pages; the name or the number of each item is the link to its page", use: ["mds-input type=search", "mds-filter", "mds-input-select", "mds-table sorting=external", "mds-table-header-cell sortable sort-key", "mds-paginator"] }
42
+ - { id: act-on-many, goal: act, changes: "no", where: "a checkbox on each row and the bar of the batch actions, with how many are selected; the selection is the page on screen; an action that cannot be taken back asks first, saying how many; the outcome is told as message-placement says, a partial one as error-recovery says", use: ["mds-table selectable", "mds-button slot=batch-action"], see: confirm-action }
43
+ - { id: show-new-items, changes: by-others, where: "nothing on screen moves by itself: at the end of the line of the summary, how many items are new or changed, the count in an info dot that pulses three times when it grows and the words in the info colour, and Show, which loads the list again with the same query; the line keeps its place while there is nothing new, so the results never move; the count is read out without moving the focus; Show hides once pressed, and the focus goes to the heading of the list", use: ["mds-notification variant=info pulse", "mds-text typography=detail", "mds-button variant=info tone=outline size=sm"] }
44
+ gaps: []
45
+ not-applicable: []
46
+
47
+ always-true:
48
+ - id: server-does-the-work
49
+ rule: The back end searches, counts, sorts and pages the items; the page receives one page of results.
50
+ checked-by: review
51
+ - id: query-in-address
52
+ rule: "Search, filters, order and page are in the address, the defaults left out: a reload, a link or Back shows the same results."
53
+ checked-by: review
54
+ - id: filters-reset-page
55
+ rule: Any change but the page goes back to the first page; a page past the end gives the last one.
56
+ checked-by: review
57
+ - id: sort-the-whole-set
58
+ rule: A list with pages is sorted by the back end, never only the rows on screen.
59
+ checked-by: review
60
+ - id: summary-says-how-many
61
+ rule: The summary says which items are on screen out of how many, and is read out after every change.
62
+ checked-by: review
63
+ - id: link-names-the-item
64
+ rule: Each item is opened by a link that names it, never by an Open repeated on every row.
65
+ checked-by: review
66
+ - id: selection-on-screen
67
+ rule: "A selection holds only items on screen: a new page, filter or search empties it."
68
+ checked-by: review
69
+ - id: nothing-moves-by-itself
70
+ rule: Items added or changed by others never move what is on screen; they wait until the person asks for them.
71
+ checked-by: review
72
+ - id: newest-wins
73
+ from: loading
74
+ - id: no-flash-empty
75
+ from: loading
76
+ - id: not-an-error
77
+ from: empty-state
78
+
79
+ open-choices:
80
+ - { id: page-size, default: "10 items, as the example of the docs site", may: "show more items in a page, the same in every list of the product" }
81
+ - { id: select-all-matching, default: "none: the selection is the page on screen", may: "offer Select all N that match, for an action the back end runs on the query" }
82
+
83
+ situations:
84
+ - { situation: A person opens the list of their requests and searches one by number, case: find-and-open }
85
+ - { situation: "Back from a request, the list is as it was", case: find-and-open }
86
+ - { situation: "The documents of a case, in a section of its page", case: find-and-open, note: "under the heading of the section; its query in the address too, with names of its own" }
87
+ - { situation: Export the requests that match the filters, case: find-and-open, note: "Export acts on the query, from the header of the page; a long export runs in the background (loading)" }
88
+ - { situation: An operator archives 12 requests at once, case: act-on-many }
89
+ - { situation: 12 items are deleted for good, case: act-on-many, note: "the dialog says how many (confirm-action)" }
90
+ - { situation: New requests arrive while an operator works through the queue, case: show-new-items }
91
+ - { situation: Members are added to a group from the list of users, use: choose-items }
92
+ - { situation: "A recipient is chosen for a message, in a form", use: form-and-validation }
93
+ ---
94
+
95
+ # List with filters
96
+
97
+ **The back end finds the items, the address keeps the query, and nothing on screen moves until the person asks.**
98
+
99
+ ## When to use it
100
+
101
+ People look for items in a set too large to read through: dozens of items or more, with a few
102
+ properties worth filtering on (the requests of an office, the documents of a case, the users of
103
+ an organisation). With a handful of items, show them all: search, filters and pages only get in
104
+ the way. When the items are seen rather than read (images, documents to preview), the results
105
+ are cards in a grid; the search, the filters and the pages stay the same. Not choosing items for
106
+ something else (`choose-items`), not an empty list (`empty-state`), a list that is loading
107
+ (`loading`) or one that failed (`error-recovery`): this pattern sends to them.
108
+
109
+ ## What decides it
110
+
111
+ Two questions: what the person does with the items (opens one at a time, or acts on several at
112
+ once), and whether other people change the set while it is on screen.
113
+
114
+ ## Cases
115
+
116
+ <!-- Generated from the frontmatter: edit it there, then run nx run stencil:generate.pattern -- --sync. -->
117
+
118
+ | Variable | Values | Means |
119
+ | --- | --- | --- |
120
+ | `goal` | `open`, `act` | open: the person opens one item at a time (a request, to work on it); act: the person acts on several items at once (archive, assign, delete) |
121
+ | `changes` | `no`, `by-others` | by-others: other people or systems add or change items while the list is on screen (a queue of incoming requests) |
122
+
123
+ A case that leaves a variable out holds for any of its values.
124
+
125
+ | Case | When | Where | Use |
126
+ | --- | --- | --- | --- |
127
+ | `find-and-open` | goal: open; changes: no | the title of the list, a search form, the summary, the results and the pages; the name or the number of each item is the link to its page | `mds-input type=search`, `mds-filter`, `mds-input-select`, `mds-table sorting=external`, `mds-table-header-cell sortable sort-key`, `mds-paginator` |
128
+ | `act-on-many` | goal: act; changes: no | a checkbox on each row and the bar of the batch actions, with how many are selected; the selection is the page on screen; an action that cannot be taken back asks first, saying how many; the outcome is told as message-placement says, a partial one as error-recovery says; see `confirm-action` | `mds-table selectable`, `mds-button slot=batch-action` |
129
+ | `show-new-items` | changes: by-others | nothing on screen moves by itself: at the end of the line of the summary, how many items are new or changed, the count in an info dot that pulses three times when it grows and the words in the info colour, and Show, which loads the list again with the same query; the line keeps its place while there is nothing new, so the results never move; the count is read out without moving the focus; Show hides once pressed, and the focus goes to the heading of the list | `mds-notification variant=info pulse`, `mds-text typography=detail`, `mds-button variant=info tone=outline size=sm` |
130
+
131
+ No gaps: every combination has a case or is not applicable.
132
+
133
+ ## Parts
134
+
135
+ - **The title** of the list, in the plural, as the heading of the page (`h1`), or of its section.
136
+ Actions on the whole set (New, Export) sit next to it: the block `page-header`.
137
+ - **The search form**, `role="search"`: a field that searches the number and the name
138
+ (`mds-input type="search"` in `mds-input-field`), a select for each property with a few values
139
+ (`mds-input-select`).
140
+ - **The order**: the headers of the columns that can sort (`sortable` and `sort-key` on
141
+ `mds-table-header-cell`), never a field of the search form.
142
+ - **The status filter**: the statuses as `mds-filter`, one at a time, each with the number of
143
+ items it would show (`count` on `mds-filter-item`).
144
+ - **The summary**: which items are on screen out of how many ("11-20 of 46 requests"), with
145
+ Clear filters ("Rimuovi i filtri", the words of `mds-filter`) when there are any;
146
+ `role="status"`. When nothing matches, Clear filters is only in the panel of `clear-filters`
147
+ (`empty-state`), not in the summary too.
148
+ - **The results**: one row per item in `mds-table`, its number or name the link to its page; or
149
+ cards in a grid (`mds-card`) when the items are seen rather than read. What was searched is
150
+ marked in each result (`loading`, `keep-while-reloading`).
151
+ - **The pages**: `mds-paginator`, only when there is more than one page.
152
+ - The search form, the summary, the results and the pages stand as the block `item-list` lays
153
+ them out, around the page in the block `app-shell`.
154
+ - When the person acts on several items: `selectable` on `mds-table`, and the actions as
155
+ `mds-button` in its `batch-action` slot; the bar says how many are selected.
156
+ - When others change the set: at the end of the line of the summary, how many items are new: the
157
+ count as the `value` of `mds-notification variant="info" pulse`, the words after it in the
158
+ info colour (`--magma-info-fg`), `gap-inline` between them, then Show (`mds-button
159
+ variant="info" tone="outline" size="sm"`). The line keeps its place while there is nothing
160
+ new: Show is hidden (`visibility: hidden`), not removed, the dot is `dismissed`, and on a
161
+ narrow screen the line sits under the summary from the start, so neither its arrival nor its
162
+ count moves the results.
163
+
164
+ ## Behaviour over time
165
+
166
+ - The search waits for a pause in the typing (300 ms); a new query cancels the one still
167
+ running (`newest-wins`).
168
+ - The results stay while the next ones load: `await` on the search field, `aria-busy` on the
169
+ table (`no-flash-empty`).
170
+ - Any change of the filters goes back to the first page; the address is replaced, not pushed,
171
+ so Back leaves the list instead of walking through every filter.
172
+ - The counts of the statuses follow the search and the other filters, so an empty status shows
173
+ before it is picked.
174
+ - A new page, filter or search empties the selection: an action never reaches items the person
175
+ cannot see.
176
+ - After an action on several items, the list loads again on the same page, with the same query.
177
+ - Items added or changed by others: the line says how many ("3 new requests"), and its count
178
+ grows while they come; at each new count the dot pulses three times and stops (3 seconds,
179
+ under the 5 of WCAG 2.2.2), and not at all when the animation is reduced
180
+ (`pref-animation-reduce`, or the system with no preference of Magma). Show loads the list
181
+ again, with the same query, empties the selection and empties the line; Show is gone, so the
182
+ focus goes to the heading of the list. Nothing moves before that.
183
+ - Nothing matches: the `clear-filters` case of `empty-state`, never an error. The request fails:
184
+ `retry-content` of `error-recovery`, never "No requests match".
185
+
186
+ ## Always true
187
+
188
+ <!-- Generated from the frontmatter: edit it there, then run nx run stencil:generate.pattern -- --sync. -->
189
+
190
+ These hold in every product: a product layer cannot change them.
191
+
192
+ | Id | Rule | Checked by |
193
+ | --- | --- | --- |
194
+ | `server-does-the-work` | The back end searches, counts, sorts and pages the items; the page receives one page of results. | review |
195
+ | `query-in-address` | Search, filters, order and page are in the address, the defaults left out: a reload, a link or Back shows the same results. | review |
196
+ | `filters-reset-page` | Any change but the page goes back to the first page; a page past the end gives the last one. | review |
197
+ | `sort-the-whole-set` | A list with pages is sorted by the back end, never only the rows on screen. | review |
198
+ | `summary-says-how-many` | The summary says which items are on screen out of how many, and is read out after every change. | review |
199
+ | `link-names-the-item` | Each item is opened by a link that names it, never by an Open repeated on every row. | review |
200
+ | `selection-on-screen` | A selection holds only items on screen: a new page, filter or search empties it. | review |
201
+ | `nothing-moves-by-itself` | Items added or changed by others never move what is on screen; they wait until the person asks for them. | review |
202
+ | `newest-wins` | An older answer never replaces a newer one. (from `loading`) | review |
203
+ | `no-flash-empty` | A reload never empties what is on screen. (from `loading`) | review |
204
+ | `not-an-error` | A part that failed to load is an error, never an empty state. (from `empty-state`) | review |
205
+
206
+ ## Open choices
207
+
208
+ <!-- Generated from the frontmatter: edit it there, then run nx run stencil:generate.pattern -- --sync. -->
209
+
210
+ The default decides these; a product layer may narrow them.
211
+
212
+ | Id | Default | A product may |
213
+ | --- | --- | --- |
214
+ | `page-size` | 10 items, as the example of the docs site | show more items in a page, the same in every list of the product |
215
+ | `select-all-matching` | none: the selection is the page on screen | offer Select all N that match, for an action the back end runs on the query |
216
+
217
+ ## Situations
218
+
219
+ <!-- Generated from the frontmatter: edit it there, then run nx run stencil:generate.pattern -- --sync. -->
220
+
221
+ 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.
222
+
223
+ | Situation | Case |
224
+ | --- | --- |
225
+ | A person opens the list of their requests and searches one by number | `find-and-open` |
226
+ | Back from a request, the list is as it was | `find-and-open` |
227
+ | The documents of a case, in a section of its page | `find-and-open`: under the heading of the section; its query in the address too, with names of its own |
228
+ | Export the requests that match the filters | `find-and-open`: Export acts on the query, from the header of the page; a long export runs in the background (loading) |
229
+ | An operator archives 12 requests at once | `act-on-many` |
230
+ | 12 items are deleted for good | `act-on-many`: the dialog says how many (confirm-action) |
231
+ | New requests arrive while an operator works through the queue | `show-new-items` |
232
+ | Members are added to a group from the list of users | not here: `choose-items` |
233
+ | A recipient is chosen for a message, in a form | not here: `form-and-validation` |
234
+
235
+ ## Accessibility
236
+
237
+ - The search form is a landmark (`role="search"`); every control has a visible label given by
238
+ `mds-input-field`: the placeholder is an example, not the label.
239
+ - The summary is a status region: after each change screen readers read out which items are
240
+ shown out of how many, while the focus stays on the control just used.
241
+ - The line of the new items is read out when it appears and when its count changes, without
242
+ moving the focus: its count sits in a status region that is always on the page (a live region
243
+ added together with its text is not read reliably); the dot is the count, read with the words
244
+ after it (an `mds-notification` with no `target` is plain text).
245
+ - The status of each item is the text of its badge, not only its colour.
246
+ - The table keeps its column headers; on a narrow screen it scrolls sideways instead of
247
+ squeezing the columns.
248
+
249
+ ## Content
250
+
251
+ - The list is named after what it holds, in the plural: "Requests", not "Request list" or
252
+ "Search".
253
+ - The label of the search field says what it is; the placeholder says what it searches:
254
+ "Number or subject".
255
+ - The statuses have the names the page of an item gives them, in the order of the process.
256
+ - Count the results, with the singular for one: "1 request", "11-20 of 46 requests".
257
+ - The line of the new items says how many and of what: "3 new requests", "1 request changed".
258
+ - Dates in the format of the language of the page.
259
+
260
+ ## Magma gaps
261
+
262
+ - No combobox: a search with facets (many properties, values to search among) waits for it;
263
+ until then, a select for each property with a few values.
264
+ - `mds-card` has no selection: acting on several items works on rows (`mds-table`) only.
265
+ - The bar of the batch actions of `mds-table` is a column at the end of the table, about 190 px
266
+ wide, taken from the columns: without `white-space: nowrap` on the cells, words break inside
267
+ ("Anagraf-e") and `mds-badge` breaks its own label (seen on the render of 2026-10-29).
268
+ - `mds-table` sorts the rows in the DOM by default (`sorting="internal"`): a list with pages
269
+ must set `sorting="external"`, or a click on a header sorts only the page on screen.
270
+
271
+ ## Decisions
272
+
273
+ | Date | Decision | Why |
274
+ | --- | --- | --- |
275
+ | 2026-10-29 | The back end does the work, the query is in the address, a new filter goes back to the first page, one query at a time, the results stay while the next load, no results is not an error | The draft page of the docs site, `patterns/list-with-filters`, and its example. |
276
+ | 2026-10-29 | Draft with variables; the items added by others and choosing items left as gaps; how far a selection reaches to decide | The sources do not settle them. |
277
+ | 2026-10-29 | A selection holds only the page on screen; a new page, filter or search empties it; Select all N that match is a product's choice (`select-all-matching`) | An action never reaches items the person cannot see; `mds-table` selects the rows it shows. |
278
+ | 2026-10-29 | Items added or changed by others wait behind a line with how many and Show (`show-new-items`) | What the person is about to click never moves; the person decides when the list changes. |
279
+ | 2026-10-31 | The line of the new items sits at the end of the line of the summary, no longer an info `mds-banner` above the results: a dot that pulses three times when the count grows, the count in the info colour, Show `variant="info" tone="outline" size="sm"`; the line keeps its place while empty | The banner pushed the results down by 167 px when it appeared, against the case itself; in the line of the summary nothing moves, on a phone too. A line with no dot was too quiet (vittorio); the pulse stops after three beats (WCAG 2.2.2) and honours a reduced animation. Show is outlined as the action of a toast (`actions/toast`, #1189). Chosen live against the banner and the plain line (#1210). |
280
+ | 2026-10-29 | Choosing items for something else is a pattern of its own, the candidate `choose-items` | The selection lives across searches and ends in a choice, not in work on the items; each pattern stays shorter. |
281
+ | 2026-11-04 | The dot of the new items is `mds-notification variant="info" pulse`, the count its `value`, before the words of the line inside its status region; Show `dismissed` it | Magma carries it since #1216 (PR #1239): the pulse follows `value`, so the dot shows the count, and the count is in the info colour as decided on 2026-10-31; a product never writes the animation itself. It replaces the dot the render of 2026-10-31 drew by hand. |
282
+ | 2026-11-03 | The order is chosen from the headers of the columns, not from the search form; Clear filters is in the summary, but only in the panel when nothing matches; after Show the focus goes to the heading; what was searched is marked in the results | What the previews of the cases showed, confirmed in review round 2 of the previews: https://github.com/magma-design-system/magma/issues/1233 |