@maggioli-design-system/magma-react 2.9.0 → 2.11.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.
- package/AGENTS.md +10 -7
- package/CHANGELOG.md +109 -0
- package/README.md +38 -0
- package/agents/assets.md +2 -2
- package/agents/color.md +7 -5
- package/agents/components.md +2 -2
- package/agents/conventions.md +1 -1
- package/agents/mcp.md +78 -8
- package/agents/{anti-patterns.md → mistakes.md} +2 -2
- package/agents/patterns/actions.md +393 -0
- package/agents/patterns/app-shell.md +223 -0
- package/agents/patterns/choose-items.md +18 -0
- package/agents/patterns/concurrent-editing.md +17 -0
- package/agents/patterns/confirm-action.md +216 -0
- package/agents/patterns/consent-and-legal.md +16 -0
- package/agents/patterns/density.md +236 -0
- package/agents/patterns/empty-state.md +201 -0
- package/agents/patterns/error-recovery.md +237 -0
- package/agents/patterns/form-and-validation.md +16 -0
- package/agents/patterns/item-list.md +214 -0
- package/agents/patterns/labels-and-values.md +184 -0
- package/agents/patterns/list-with-filters.md +282 -0
- package/agents/patterns/loading.md +221 -0
- package/agents/patterns/message-placement.md +304 -0
- package/agents/patterns/notification-center.md +18 -0
- package/agents/patterns/page-header.md +201 -0
- package/agents/patterns/permissions.md +17 -0
- package/agents/patterns/previews/actions/banner.html +21 -0
- package/agents/patterns/previews/actions/confirm.html +11 -0
- package/agents/patterns/previews/actions/danger-zone.html +22 -0
- package/agents/patterns/previews/actions/destructive-in-menu.html +19 -0
- package/agents/patterns/previews/actions/dismiss-message.html +15 -0
- package/agents/patterns/previews/actions/dismiss.html +25 -0
- package/agents/patterns/previews/actions/more-in-menu.html +21 -0
- package/agents/patterns/previews/actions/part-primary.html +28 -0
- package/agents/patterns/previews/actions/primary.html +20 -0
- package/agents/patterns/previews/actions/remove.html +44 -0
- package/agents/patterns/previews/actions/secondary.html +20 -0
- package/agents/patterns/previews/actions/stacked.html +17 -0
- package/agents/patterns/previews/actions/toast.html +10 -0
- package/agents/patterns/previews/app-shell/back-office.html +41 -0
- package/agents/patterns/previews/app-shell/many-sections.html +45 -0
- package/agents/patterns/previews/app-shell/public-service.html +31 -0
- package/agents/patterns/previews/confirm-action/act-then-undo.html +44 -0
- package/agents/patterns/previews/confirm-action/ask-before-sending.html +25 -0
- package/agents/patterns/previews/confirm-action/ask-first-many.html +11 -0
- package/agents/patterns/previews/confirm-action/ask-first.html +14 -0
- package/agents/patterns/previews/confirm-action/make-reversible.html +54 -0
- package/agents/patterns/previews/confirm-action/send-as-shown.html +57 -0
- package/agents/patterns/previews/empty-state/add-the-first.html +19 -0
- package/agents/patterns/previews/empty-state/all-done.html +15 -0
- package/agents/patterns/previews/empty-state/clear-filters.html +35 -0
- package/agents/patterns/previews/empty-state/filled-by-others.html +15 -0
- package/agents/patterns/previews/empty-state/not-found.html +38 -0
- package/agents/patterns/previews/empty-state/one-line.html +12 -0
- package/agents/patterns/previews/error-recovery/action-another-way.html +35 -0
- package/agents/patterns/previews/error-recovery/changed-meanwhile.html +26 -0
- package/agents/patterns/previews/error-recovery/check-or-repeat.html +38 -0
- package/agents/patterns/previews/error-recovery/content-another-way.html +12 -0
- package/agents/patterns/previews/error-recovery/partial.html +29 -0
- package/agents/patterns/previews/error-recovery/retry-action.html +35 -0
- package/agents/patterns/previews/error-recovery/retry-content.html +40 -0
- package/agents/patterns/previews/error-recovery/sign-in-again.html +44 -0
- package/agents/patterns/previews/item-list/documents-of-a-request.html +12 -0
- package/agents/patterns/previews/item-list/queue-of-a-desk.html +109 -0
- package/agents/patterns/previews/item-list/requests-of-an-office.html +74 -0
- package/agents/patterns/previews/item-list/requests-to-assign.html +80 -0
- package/agents/patterns/previews/labels-and-values/data-of-a-contact.html +31 -0
- package/agents/patterns/previews/labels-and-values/payment-before-paying.html +21 -0
- package/agents/patterns/previews/labels-and-values/what-is-sent.html +25 -0
- package/agents/patterns/previews/list-with-filters/act-on-many.html +121 -0
- package/agents/patterns/previews/list-with-filters/find-and-open.html +109 -0
- package/agents/patterns/previews/list-with-filters/show-new-items.html +132 -0
- package/agents/patterns/previews/loading/await-and-say.html +41 -0
- package/agents/patterns/previews/loading/await-the-control.html +28 -0
- package/agents/patterns/previews/loading/first-load.html +10 -0
- package/agents/patterns/previews/loading/keep-while-reloading.html +80 -0
- package/agents/patterns/previews/loading/long-load-measured.html +16 -0
- package/agents/patterns/previews/loading/long-load.html +12 -0
- package/agents/patterns/previews/loading/progress-in-place.html +52 -0
- package/agents/patterns/previews/loading/run-in-background.html +24 -0
- package/agents/patterns/previews/message-placement/action-done-elsewhere.html +38 -0
- package/agents/patterns/previews/message-placement/action-done-in-page.html +53 -0
- package/agents/patterns/previews/message-placement/action-done-in-part.html +42 -0
- package/agents/patterns/previews/message-placement/action-failed-elsewhere.html +40 -0
- package/agents/patterns/previews/message-placement/action-failed-in-place.html +31 -0
- package/agents/patterns/previews/message-placement/action-later.html +24 -0
- package/agents/patterns/previews/message-placement/action-partial-elsewhere.html +33 -0
- package/agents/patterns/previews/message-placement/action-partial-in-place.html +51 -0
- package/agents/patterns/previews/message-placement/action-taken.html +25 -0
- package/agents/patterns/previews/message-placement/app-deadline.html +20 -0
- package/agents/patterns/previews/message-placement/app-failed.html +48 -0
- package/agents/patterns/previews/message-placement/app-info.html +39 -0
- package/agents/patterns/previews/message-placement/decision.html +49 -0
- package/agents/patterns/previews/message-placement/field-error.html +28 -0
- package/agents/patterns/previews/message-placement/field-hint.html +30 -0
- package/agents/patterns/previews/message-placement/field-valid.html +11 -0
- package/agents/patterns/previews/message-placement/region-failed.html +31 -0
- package/agents/patterns/previews/message-placement/region-info.html +16 -0
- package/agents/patterns/previews/page-header/contact-being-edited.html +25 -0
- package/agents/patterns/previews/page-header/members-of-a-group.html +18 -0
- package/agents/patterns/previews/page-header/own-profile.html +17 -0
- package/agents/patterns/previews/page-header/request-from-the-list.html +33 -0
- package/agents/patterns/previews/page-header/requests-of-an-office.html +16 -0
- package/agents/patterns/previews/record-detail/ask-for-words.html +72 -0
- package/agents/patterns/previews/record-detail/edit-data.html +104 -0
- package/agents/patterns/previews/record-detail/read-the-data.html +80 -0
- package/agents/patterns/previews/record-detail/record-changed.html +87 -0
- package/agents/patterns/previews/record-detail/run-at-once.html +88 -0
- package/agents/patterns/previews/record-detail/work-on-it.html +106 -0
- package/agents/patterns/previews/rhythm/between-containers.html +29 -0
- package/agents/patterns/previews/rhythm/between-fields.html +14 -0
- package/agents/patterns/previews/rhythm/between-groups.html +23 -0
- package/agents/patterns/previews/rhythm/between-sections.html +17 -0
- package/agents/patterns/previews/rhythm/content-actions.html +14 -0
- package/agents/patterns/previews/rhythm/inline.html +12 -0
- package/agents/patterns/previews/rhythm/inset.html +11 -0
- package/agents/patterns/previews/rhythm/label-control.html +8 -0
- package/agents/patterns/previews/rhythm/title-content.html +10 -0
- package/agents/patterns/previews/surfaces/band.html +73 -0
- package/agents/patterns/previews/surfaces/canvas.html +66 -0
- package/agents/patterns/previews/surfaces/card.html +30 -0
- package/agents/patterns/previews/surfaces/dialog.html +28 -0
- package/agents/patterns/previews/surfaces/edit-actions.html +35 -0
- package/agents/patterns/previews/surfaces/section.html +35 -0
- package/agents/patterns/previews/titles/dialog.html +18 -0
- package/agents/patterns/previews/titles/group.html +14 -0
- package/agents/patterns/previews/titles/page.html +25 -0
- package/agents/patterns/previews/titles/part.html +24 -0
- package/agents/patterns/previews/titles/section.html +14 -0
- package/agents/patterns/previews/widths/dialog.html +33 -0
- package/agents/patterns/previews/widths/field.html +20 -0
- package/agents/patterns/previews/widths/form.html +27 -0
- package/agents/patterns/previews/widths/page.html +49 -0
- package/agents/patterns/previews/widths/reading.html +15 -0
- package/agents/patterns/record-detail.md +268 -0
- package/agents/patterns/rhythm.md +212 -0
- package/agents/patterns/surfaces.md +212 -0
- package/agents/patterns/titles.md +208 -0
- package/agents/patterns/widths.md +202 -0
- package/agents/patterns.md +121 -0
- package/agents/reporting.md +6 -3
- package/agents/theming.md +36 -12
- package/agents/typography.md +27 -2
- package/agents/variants.md +1 -1
- package/dist/components.js +117 -117
- package/dist/components.server.js +117 -117
- package/dist/mds-accordion-item.js +8 -3
- package/dist/mds-accordion-item.server.js +7 -2
- package/dist/mds-accordion-timer-item.js +8 -3
- package/dist/mds-accordion-timer-item.server.js +7 -2
- package/dist/mds-accordion-timer.js +11 -4
- package/dist/mds-accordion-timer.server.js +7 -2
- package/dist/mds-accordion.js +11 -4
- package/dist/mds-accordion.server.js +7 -2
- package/dist/mds-author.js +8 -3
- package/dist/mds-author.server.js +7 -2
- package/dist/mds-avatar-stack-item.js +8 -3
- package/dist/mds-avatar-stack-item.server.js +7 -2
- package/dist/mds-avatar-stack.js +8 -3
- package/dist/mds-avatar-stack.server.js +7 -2
- package/dist/mds-avatar.js +8 -3
- package/dist/mds-avatar.server.js +7 -2
- package/dist/mds-badge.js +8 -3
- package/dist/mds-badge.server.js +7 -2
- package/dist/mds-banner.js +11 -4
- package/dist/mds-banner.server.js +7 -2
- package/dist/mds-benchmark-bar.js +8 -3
- package/dist/mds-benchmark-bar.server.js +7 -2
- package/dist/mds-bibliography.js +8 -3
- package/dist/mds-bibliography.server.js +7 -2
- package/dist/mds-book.js +8 -3
- package/dist/mds-book.server.js +7 -2
- package/dist/mds-breadcrumb-item.js +11 -4
- package/dist/mds-breadcrumb-item.server.js +7 -2
- package/dist/mds-breadcrumb.js +11 -4
- package/dist/mds-breadcrumb.server.js +10 -3
- package/dist/mds-button-dropdown.js +11 -4
- package/dist/mds-button-dropdown.server.js +7 -2
- package/dist/mds-button-group.js +8 -3
- package/dist/mds-button-group.server.js +7 -2
- package/dist/mds-button.js +8 -3
- package/dist/mds-button.server.js +7 -2
- package/dist/mds-calendar-cell.js +8 -3
- package/dist/mds-calendar-cell.server.js +7 -2
- package/dist/mds-calendar.js +8 -3
- package/dist/mds-calendar.server.js +7 -2
- package/dist/mds-card-content.js +8 -3
- package/dist/mds-card-content.server.js +7 -2
- package/dist/mds-card-footer.js +8 -3
- package/dist/mds-card-footer.server.js +7 -2
- package/dist/mds-card-header.js +8 -3
- package/dist/mds-card-header.server.js +7 -2
- package/dist/mds-card-media.js +8 -3
- package/dist/mds-card-media.server.js +7 -2
- package/dist/mds-card.js +8 -3
- package/dist/mds-card.server.js +10 -3
- package/dist/mds-chip.js +8 -3
- package/dist/mds-chip.server.js +7 -2
- package/dist/mds-details.js +11 -4
- package/dist/mds-details.server.js +10 -3
- package/dist/mds-dropdown.js +8 -3
- package/dist/mds-dropdown.server.js +7 -2
- package/dist/mds-emoji.js +8 -3
- package/dist/mds-emoji.server.js +10 -3
- package/dist/mds-entity.js +8 -3
- package/dist/mds-entity.server.js +7 -2
- package/dist/mds-file-preview.js +8 -3
- package/dist/mds-file-preview.server.js +7 -2
- package/dist/mds-file.js +11 -4
- package/dist/mds-file.server.js +7 -2
- package/dist/mds-filter-item.js +11 -4
- package/dist/mds-filter-item.server.js +7 -2
- package/dist/mds-filter.js +11 -4
- package/dist/mds-filter.server.js +7 -2
- package/dist/mds-header-bar.js +11 -4
- package/dist/mds-header-bar.server.js +7 -2
- package/dist/mds-header.js +8 -3
- package/dist/mds-header.server.js +7 -2
- package/dist/mds-help.js +8 -3
- package/dist/mds-help.server.js +7 -2
- package/dist/mds-horizontal-scroll.js +8 -3
- package/dist/mds-horizontal-scroll.server.js +7 -2
- package/dist/mds-hr.js +8 -3
- package/dist/mds-hr.server.js +7 -2
- package/dist/mds-icon.js +8 -3
- package/dist/mds-icon.server.js +10 -3
- package/dist/mds-img.js +8 -3
- package/dist/mds-img.server.js +7 -2
- package/dist/mds-input-date-range-preselection.js +8 -3
- package/dist/mds-input-date-range-preselection.server.js +7 -2
- package/dist/mds-input-date-range.js +11 -4
- package/dist/mds-input-date-range.server.js +7 -2
- package/dist/mds-input-date.js +8 -3
- package/dist/mds-input-date.server.js +7 -2
- package/dist/mds-input-field.js +8 -3
- package/dist/mds-input-field.server.js +8 -2
- package/dist/mds-input-otp.js +8 -3
- package/dist/mds-input-otp.server.js +7 -2
- package/dist/mds-input-range.js +11 -4
- package/dist/mds-input-range.server.js +7 -2
- package/dist/mds-input-select.js +11 -4
- package/dist/mds-input-select.server.js +7 -2
- package/dist/mds-input-switch.js +11 -4
- package/dist/mds-input-switch.server.js +7 -2
- package/dist/mds-input-tip-item.js +8 -3
- package/dist/mds-input-tip-item.server.js +7 -2
- package/dist/mds-input-tip.js +8 -3
- package/dist/mds-input-tip.server.js +7 -2
- package/dist/mds-input-upload.js +11 -4
- package/dist/mds-input-upload.server.js +7 -2
- package/dist/mds-input.js +8 -3
- package/dist/mds-input.server.js +7 -2
- package/dist/mds-keyboard-key.js +8 -3
- package/dist/mds-keyboard-key.server.js +7 -2
- package/dist/mds-keyboard.js +8 -3
- package/dist/mds-keyboard.server.js +7 -2
- package/dist/mds-kpi-item.js +8 -3
- package/dist/mds-kpi-item.server.js +7 -2
- package/dist/mds-kpi.js +8 -3
- package/dist/mds-kpi.server.js +7 -2
- package/dist/mds-label.js +11 -4
- package/dist/mds-label.server.js +7 -2
- package/dist/mds-link.js +8 -3
- package/dist/mds-link.server.js +7 -2
- package/dist/mds-list-item.js +8 -3
- package/dist/mds-list-item.server.js +7 -2
- package/dist/mds-list.js +8 -3
- package/dist/mds-list.server.js +7 -2
- package/dist/mds-mention.js +11 -4
- package/dist/mds-mention.server.js +7 -2
- package/dist/mds-modal.js +8 -3
- package/dist/mds-modal.server.js +7 -2
- package/dist/mds-note.js +11 -4
- package/dist/mds-note.server.js +7 -2
- package/dist/mds-notification.js +8 -3
- package/dist/mds-notification.server.js +10 -3
- package/dist/mds-paginator-item.js +8 -3
- package/dist/mds-paginator-item.server.js +7 -2
- package/dist/mds-paginator.js +11 -4
- package/dist/mds-paginator.server.js +7 -2
- package/dist/mds-policy-ai.js +8 -3
- package/dist/mds-policy-ai.server.js +7 -2
- package/dist/mds-pref-animation.js +11 -4
- package/dist/mds-pref-animation.server.js +7 -2
- package/dist/mds-pref-consumption.js +11 -4
- package/dist/mds-pref-consumption.server.js +7 -2
- package/dist/mds-pref-contrast.js +11 -4
- package/dist/mds-pref-contrast.server.js +7 -2
- package/dist/mds-pref-language-item.js +11 -4
- package/dist/mds-pref-language-item.server.js +7 -2
- package/dist/mds-pref-language.js +8 -3
- package/dist/mds-pref-language.server.js +7 -2
- package/dist/mds-pref-mode.js +11 -4
- package/dist/mds-pref-mode.server.js +7 -2
- package/dist/mds-pref-theme-item.js +11 -4
- package/dist/mds-pref-theme-item.server.js +7 -2
- package/dist/mds-pref-theme.js +8 -3
- package/dist/mds-pref-theme.server.js +7 -2
- package/dist/mds-pref.js +8 -3
- package/dist/mds-pref.server.js +7 -2
- package/dist/mds-price-table-features-cell.js +8 -3
- package/dist/mds-price-table-features-cell.server.js +10 -3
- package/dist/mds-price-table-features-row.js +8 -3
- package/dist/mds-price-table-features-row.server.js +7 -2
- package/dist/mds-price-table-features.js +8 -3
- package/dist/mds-price-table-features.server.js +10 -3
- package/dist/mds-price-table-header.js +8 -3
- package/dist/mds-price-table-header.server.js +7 -2
- package/dist/mds-price-table-list-item.js +8 -3
- package/dist/mds-price-table-list-item.server.js +7 -2
- package/dist/mds-price-table-list.js +8 -3
- package/dist/mds-price-table-list.server.js +7 -2
- package/dist/mds-price-table.js +8 -3
- package/dist/mds-price-table.server.js +7 -2
- package/dist/mds-progress.js +8 -3
- package/dist/mds-progress.server.js +7 -2
- package/dist/mds-push-notification-item.js +11 -4
- package/dist/mds-push-notification-item.server.js +7 -2
- package/dist/mds-push-notification.js +8 -3
- package/dist/mds-push-notification.server.js +7 -2
- package/dist/mds-quote.js +8 -3
- package/dist/mds-quote.server.js +7 -2
- package/dist/mds-radial-menu-item.js +8 -3
- package/dist/mds-radial-menu-item.server.js +7 -2
- package/dist/mds-radial-menu.js +8 -3
- package/dist/mds-radial-menu.server.js +7 -2
- package/dist/mds-radial-progress.js +8 -3
- package/dist/mds-radial-progress.server.js +7 -2
- package/dist/mds-separator.js +8 -3
- package/dist/mds-separator.server.js +7 -2
- package/dist/mds-spinner.js +8 -3
- package/dist/mds-spinner.server.js +10 -3
- package/dist/mds-status-bar.js +8 -3
- package/dist/mds-status-bar.server.js +7 -2
- package/dist/mds-stepper-bar-item.js +11 -4
- package/dist/mds-stepper-bar-item.server.js +7 -2
- package/dist/mds-stepper-bar.js +11 -4
- package/dist/mds-stepper-bar.server.js +7 -2
- package/dist/mds-tab-bar-item.js +11 -4
- package/dist/mds-tab-bar-item.server.js +7 -2
- package/dist/mds-tab-bar.js +11 -4
- package/dist/mds-tab-bar.server.js +7 -2
- package/dist/mds-tab-item.js +8 -3
- package/dist/mds-tab-item.server.js +7 -2
- package/dist/mds-tab.js +11 -4
- package/dist/mds-tab.server.js +7 -2
- package/dist/mds-table-body.js +8 -3
- package/dist/mds-table-body.server.js +7 -2
- package/dist/mds-table-cell.js +8 -3
- package/dist/mds-table-cell.server.js +10 -3
- package/dist/mds-table-footer.js +8 -3
- package/dist/mds-table-footer.server.js +10 -3
- package/dist/mds-table-header-cell.js +11 -4
- package/dist/mds-table-header-cell.server.js +7 -2
- package/dist/mds-table-header.js +8 -3
- package/dist/mds-table-header.server.js +10 -3
- package/dist/mds-table-row.js +8 -3
- package/dist/mds-table-row.server.js +7 -2
- package/dist/mds-table.js +11 -4
- package/dist/mds-table.server.js +7 -2
- package/dist/mds-text.js +8 -3
- package/dist/mds-text.server.js +7 -2
- package/dist/mds-toast-region.js +8 -3
- package/dist/mds-toast-region.server.js +7 -2
- package/dist/mds-toast.js +11 -4
- package/dist/mds-toast.server.js +7 -2
- package/dist/mds-tooltip.js +8 -3
- package/dist/mds-tooltip.server.js +7 -2
- package/dist/mds-tree-item.js +8 -3
- package/dist/mds-tree-item.server.js +7 -2
- package/dist/mds-tree.js +8 -3
- package/dist/mds-tree.server.js +7 -2
- package/dist/mds-url-view.js +11 -4
- package/dist/mds-url-view.server.js +7 -2
- package/dist/mds-usage.js +8 -3
- package/dist/mds-usage.server.js +7 -2
- package/dist/mds-video-wall.js +8 -3
- package/dist/mds-video-wall.server.js +7 -2
- package/dist/mds-zero.js +8 -3
- package/dist/mds-zero.server.js +7 -2
- package/dist/types/components.d.ts +117 -117
- package/dist/types/components.server.d.ts +118 -118
- package/dist/types/mds-accordion-item.d.ts +4 -8
- package/dist/types/mds-accordion-item.server.d.ts +4 -4
- package/dist/types/mds-accordion-timer-item.d.ts +4 -8
- package/dist/types/mds-accordion-timer-item.server.d.ts +4 -4
- package/dist/types/mds-accordion-timer.d.ts +4 -8
- package/dist/types/mds-accordion-timer.server.d.ts +4 -4
- package/dist/types/mds-accordion.d.ts +4 -8
- package/dist/types/mds-accordion.server.d.ts +4 -4
- package/dist/types/mds-author.d.ts +2 -6
- package/dist/types/mds-author.server.d.ts +3 -3
- package/dist/types/mds-avatar-stack-item.d.ts +2 -6
- package/dist/types/mds-avatar-stack-item.server.d.ts +3 -3
- package/dist/types/mds-avatar-stack.d.ts +2 -6
- package/dist/types/mds-avatar-stack.server.d.ts +3 -3
- package/dist/types/mds-avatar.d.ts +2 -6
- package/dist/types/mds-avatar.server.d.ts +3 -3
- package/dist/types/mds-badge.d.ts +2 -6
- package/dist/types/mds-badge.server.d.ts +3 -3
- package/dist/types/mds-banner.d.ts +4 -8
- package/dist/types/mds-banner.server.d.ts +4 -4
- package/dist/types/mds-benchmark-bar.d.ts +2 -6
- package/dist/types/mds-benchmark-bar.server.d.ts +3 -3
- package/dist/types/mds-bibliography.d.ts +2 -6
- package/dist/types/mds-bibliography.server.d.ts +3 -3
- package/dist/types/mds-book.d.ts +2 -6
- package/dist/types/mds-book.server.d.ts +3 -3
- package/dist/types/mds-breadcrumb-item.d.ts +4 -8
- package/dist/types/mds-breadcrumb-item.server.d.ts +4 -4
- package/dist/types/mds-breadcrumb.d.ts +4 -8
- package/dist/types/mds-breadcrumb.server.d.ts +4 -4
- package/dist/types/mds-button-dropdown.d.ts +4 -8
- package/dist/types/mds-button-dropdown.server.d.ts +4 -4
- package/dist/types/mds-button-group.d.ts +2 -6
- package/dist/types/mds-button-group.server.d.ts +3 -3
- package/dist/types/mds-button.d.ts +2 -6
- package/dist/types/mds-button.server.d.ts +3 -3
- package/dist/types/mds-calendar-cell.d.ts +2 -6
- package/dist/types/mds-calendar-cell.server.d.ts +3 -3
- package/dist/types/mds-calendar.d.ts +4 -8
- package/dist/types/mds-calendar.server.d.ts +4 -4
- package/dist/types/mds-card-content.d.ts +2 -6
- package/dist/types/mds-card-content.server.d.ts +3 -3
- package/dist/types/mds-card-footer.d.ts +2 -6
- package/dist/types/mds-card-footer.server.d.ts +3 -3
- package/dist/types/mds-card-header.d.ts +2 -6
- package/dist/types/mds-card-header.server.d.ts +3 -3
- package/dist/types/mds-card-media.d.ts +2 -6
- package/dist/types/mds-card-media.server.d.ts +3 -3
- package/dist/types/mds-card.d.ts +2 -6
- package/dist/types/mds-card.server.d.ts +3 -3
- package/dist/types/mds-chip.d.ts +4 -8
- package/dist/types/mds-chip.server.d.ts +4 -4
- package/dist/types/mds-details.d.ts +4 -8
- package/dist/types/mds-details.server.d.ts +4 -4
- package/dist/types/mds-dropdown.d.ts +4 -8
- package/dist/types/mds-dropdown.server.d.ts +4 -4
- package/dist/types/mds-emoji.d.ts +2 -6
- package/dist/types/mds-emoji.server.d.ts +3 -3
- package/dist/types/mds-entity.d.ts +2 -6
- package/dist/types/mds-entity.server.d.ts +3 -3
- package/dist/types/mds-file-preview.d.ts +4 -8
- package/dist/types/mds-file-preview.server.d.ts +4 -4
- package/dist/types/mds-file.d.ts +4 -8
- package/dist/types/mds-file.server.d.ts +4 -4
- package/dist/types/mds-filter-item.d.ts +4 -8
- package/dist/types/mds-filter-item.server.d.ts +4 -4
- package/dist/types/mds-filter.d.ts +4 -8
- package/dist/types/mds-filter.server.d.ts +4 -4
- package/dist/types/mds-header-bar.d.ts +4 -8
- package/dist/types/mds-header-bar.server.d.ts +4 -4
- package/dist/types/mds-header.d.ts +4 -8
- package/dist/types/mds-header.server.d.ts +4 -4
- package/dist/types/mds-help.d.ts +2 -6
- package/dist/types/mds-help.server.d.ts +3 -3
- package/dist/types/mds-horizontal-scroll.d.ts +2 -6
- package/dist/types/mds-horizontal-scroll.server.d.ts +3 -3
- package/dist/types/mds-hr.d.ts +2 -6
- package/dist/types/mds-hr.server.d.ts +3 -3
- package/dist/types/mds-icon.d.ts +2 -6
- package/dist/types/mds-icon.server.d.ts +3 -3
- package/dist/types/mds-img.d.ts +4 -8
- package/dist/types/mds-img.server.d.ts +4 -4
- package/dist/types/mds-input-date-range-preselection.d.ts +2 -6
- package/dist/types/mds-input-date-range-preselection.server.d.ts +3 -3
- package/dist/types/mds-input-date-range.d.ts +4 -8
- package/dist/types/mds-input-date-range.server.d.ts +4 -4
- package/dist/types/mds-input-date.d.ts +4 -8
- package/dist/types/mds-input-date.server.d.ts +4 -4
- package/dist/types/mds-input-field.d.ts +2 -6
- package/dist/types/mds-input-field.server.d.ts +3 -3
- package/dist/types/mds-input-otp.d.ts +2 -6
- package/dist/types/mds-input-otp.server.d.ts +3 -3
- package/dist/types/mds-input-range.d.ts +4 -8
- package/dist/types/mds-input-range.server.d.ts +4 -4
- package/dist/types/mds-input-select.d.ts +4 -8
- package/dist/types/mds-input-select.server.d.ts +4 -4
- package/dist/types/mds-input-switch.d.ts +4 -8
- package/dist/types/mds-input-switch.server.d.ts +4 -4
- package/dist/types/mds-input-tip-item.d.ts +2 -6
- package/dist/types/mds-input-tip-item.server.d.ts +3 -3
- package/dist/types/mds-input-tip.d.ts +2 -6
- package/dist/types/mds-input-tip.server.d.ts +3 -3
- package/dist/types/mds-input-upload.d.ts +4 -8
- package/dist/types/mds-input-upload.server.d.ts +4 -4
- package/dist/types/mds-input.d.ts +4 -8
- package/dist/types/mds-input.server.d.ts +4 -4
- package/dist/types/mds-keyboard-key.d.ts +2 -6
- package/dist/types/mds-keyboard-key.server.d.ts +3 -3
- package/dist/types/mds-keyboard.d.ts +2 -6
- package/dist/types/mds-keyboard.server.d.ts +3 -3
- package/dist/types/mds-kpi-item.d.ts +2 -6
- package/dist/types/mds-kpi-item.server.d.ts +3 -3
- package/dist/types/mds-kpi.d.ts +2 -6
- package/dist/types/mds-kpi.server.d.ts +3 -3
- package/dist/types/mds-label.d.ts +4 -8
- package/dist/types/mds-label.server.d.ts +4 -4
- package/dist/types/mds-link.d.ts +2 -6
- package/dist/types/mds-link.server.d.ts +3 -3
- package/dist/types/mds-list-item.d.ts +2 -6
- package/dist/types/mds-list-item.server.d.ts +3 -3
- package/dist/types/mds-list.d.ts +2 -6
- package/dist/types/mds-list.server.d.ts +3 -3
- package/dist/types/mds-mention.d.ts +4 -8
- package/dist/types/mds-mention.server.d.ts +4 -4
- package/dist/types/mds-modal.d.ts +4 -8
- package/dist/types/mds-modal.server.d.ts +4 -4
- package/dist/types/mds-note.d.ts +4 -8
- package/dist/types/mds-note.server.d.ts +4 -4
- package/dist/types/mds-notification.d.ts +2 -6
- package/dist/types/mds-notification.server.d.ts +3 -3
- package/dist/types/mds-paginator-item.d.ts +2 -6
- package/dist/types/mds-paginator-item.server.d.ts +3 -3
- package/dist/types/mds-paginator.d.ts +4 -8
- package/dist/types/mds-paginator.server.d.ts +4 -4
- package/dist/types/mds-policy-ai.d.ts +2 -6
- package/dist/types/mds-policy-ai.server.d.ts +3 -3
- package/dist/types/mds-pref-animation.d.ts +4 -8
- package/dist/types/mds-pref-animation.server.d.ts +4 -4
- package/dist/types/mds-pref-consumption.d.ts +4 -8
- package/dist/types/mds-pref-consumption.server.d.ts +4 -4
- package/dist/types/mds-pref-contrast.d.ts +4 -8
- package/dist/types/mds-pref-contrast.server.d.ts +4 -4
- package/dist/types/mds-pref-language-item.d.ts +4 -8
- package/dist/types/mds-pref-language-item.server.d.ts +4 -4
- package/dist/types/mds-pref-language.d.ts +4 -8
- package/dist/types/mds-pref-language.server.d.ts +4 -4
- package/dist/types/mds-pref-mode.d.ts +4 -8
- package/dist/types/mds-pref-mode.server.d.ts +4 -4
- package/dist/types/mds-pref-theme-item.d.ts +4 -8
- package/dist/types/mds-pref-theme-item.server.d.ts +4 -4
- package/dist/types/mds-pref-theme.d.ts +4 -8
- package/dist/types/mds-pref-theme.server.d.ts +4 -4
- package/dist/types/mds-pref.d.ts +2 -6
- package/dist/types/mds-pref.server.d.ts +3 -3
- package/dist/types/mds-price-table-features-cell.d.ts +2 -6
- package/dist/types/mds-price-table-features-cell.server.d.ts +3 -3
- package/dist/types/mds-price-table-features-row.d.ts +2 -6
- package/dist/types/mds-price-table-features-row.server.d.ts +3 -3
- package/dist/types/mds-price-table-features.d.ts +2 -6
- package/dist/types/mds-price-table-features.server.d.ts +3 -3
- package/dist/types/mds-price-table-header.d.ts +2 -6
- package/dist/types/mds-price-table-header.server.d.ts +3 -3
- package/dist/types/mds-price-table-list-item.d.ts +2 -6
- package/dist/types/mds-price-table-list-item.server.d.ts +3 -3
- package/dist/types/mds-price-table-list.d.ts +2 -6
- package/dist/types/mds-price-table-list.server.d.ts +3 -3
- package/dist/types/mds-price-table.d.ts +2 -6
- package/dist/types/mds-price-table.server.d.ts +3 -3
- package/dist/types/mds-progress.d.ts +2 -6
- package/dist/types/mds-progress.server.d.ts +3 -3
- package/dist/types/mds-push-notification-item.d.ts +4 -8
- package/dist/types/mds-push-notification-item.server.d.ts +4 -4
- package/dist/types/mds-push-notification.d.ts +4 -8
- package/dist/types/mds-push-notification.server.d.ts +4 -4
- package/dist/types/mds-quote.d.ts +2 -6
- package/dist/types/mds-quote.server.d.ts +3 -3
- package/dist/types/mds-radial-menu-item.d.ts +2 -6
- package/dist/types/mds-radial-menu-item.server.d.ts +3 -3
- package/dist/types/mds-radial-menu.d.ts +2 -6
- package/dist/types/mds-radial-menu.server.d.ts +3 -3
- package/dist/types/mds-radial-progress.d.ts +2 -6
- package/dist/types/mds-radial-progress.server.d.ts +3 -3
- package/dist/types/mds-separator.d.ts +2 -6
- package/dist/types/mds-separator.server.d.ts +3 -3
- package/dist/types/mds-spinner.d.ts +2 -6
- package/dist/types/mds-spinner.server.d.ts +3 -3
- package/dist/types/mds-status-bar.d.ts +2 -6
- package/dist/types/mds-status-bar.server.d.ts +3 -3
- package/dist/types/mds-stepper-bar-item.d.ts +4 -8
- package/dist/types/mds-stepper-bar-item.server.d.ts +4 -4
- package/dist/types/mds-stepper-bar.d.ts +4 -8
- package/dist/types/mds-stepper-bar.server.d.ts +4 -4
- package/dist/types/mds-tab-bar-item.d.ts +4 -8
- package/dist/types/mds-tab-bar-item.server.d.ts +4 -4
- package/dist/types/mds-tab-bar.d.ts +4 -8
- package/dist/types/mds-tab-bar.server.d.ts +4 -4
- package/dist/types/mds-tab-item.d.ts +4 -8
- package/dist/types/mds-tab-item.server.d.ts +4 -4
- package/dist/types/mds-tab.d.ts +4 -8
- package/dist/types/mds-tab.server.d.ts +4 -4
- package/dist/types/mds-table-body.d.ts +2 -6
- package/dist/types/mds-table-body.server.d.ts +3 -3
- package/dist/types/mds-table-cell.d.ts +2 -6
- package/dist/types/mds-table-cell.server.d.ts +3 -3
- package/dist/types/mds-table-footer.d.ts +2 -6
- package/dist/types/mds-table-footer.server.d.ts +3 -3
- package/dist/types/mds-table-header-cell.d.ts +4 -8
- package/dist/types/mds-table-header-cell.server.d.ts +4 -4
- package/dist/types/mds-table-header.d.ts +2 -6
- package/dist/types/mds-table-header.server.d.ts +3 -3
- package/dist/types/mds-table-row.d.ts +2 -6
- package/dist/types/mds-table-row.server.d.ts +3 -3
- package/dist/types/mds-table.d.ts +4 -8
- package/dist/types/mds-table.server.d.ts +4 -4
- package/dist/types/mds-text.d.ts +2 -6
- package/dist/types/mds-text.server.d.ts +3 -3
- package/dist/types/mds-toast-region.d.ts +2 -6
- package/dist/types/mds-toast-region.server.d.ts +3 -3
- package/dist/types/mds-toast.d.ts +4 -8
- package/dist/types/mds-toast.server.d.ts +4 -4
- package/dist/types/mds-tooltip.d.ts +2 -6
- package/dist/types/mds-tooltip.server.d.ts +3 -3
- package/dist/types/mds-tree-item.d.ts +4 -8
- package/dist/types/mds-tree-item.server.d.ts +4 -4
- package/dist/types/mds-tree.d.ts +2 -6
- package/dist/types/mds-tree.server.d.ts +3 -3
- package/dist/types/mds-url-view.d.ts +4 -8
- package/dist/types/mds-url-view.server.d.ts +4 -4
- package/dist/types/mds-usage.d.ts +2 -6
- package/dist/types/mds-usage.server.d.ts +3 -3
- package/dist/types/mds-video-wall.d.ts +2 -6
- package/dist/types/mds-video-wall.server.d.ts +3 -3
- package/dist/types/mds-zero.d.ts +2 -6
- package/dist/types/mds-zero.server.d.ts +3 -3
- 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`).
|