@nxgt/material 3.45.0 → 3.47.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 (149) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/README.md +10 -3
  3. package/dist/{async-slice-D9LAUgth.js → async-slice-DlvKCKAa.js} +2 -2
  4. package/dist/{button-b_kruV_L.js → button-yaltbQmC.js} +1 -1
  5. package/dist/charts.js +3 -3
  6. package/dist/{chip-6O3t9GXt.js → chip-BqWbbr1b.js} +1 -1
  7. package/dist/{code-editor-BtDOgUET.js → code-editor-C9qBNoYb.js} +4 -4
  8. package/dist/code-editor.js +4 -4
  9. package/dist/{code-language-items-374m-OK8.js → code-language-items-DAHtfQ7W.js} +2 -2
  10. package/dist/{components-BG-BTfJP.js → components-DFPy96C3.js} +16282 -14755
  11. package/dist/components.js +26 -26
  12. package/dist/{dialog-8Ua9uuJW.js → dialog-CCCcnTIx.js} +4 -4
  13. package/dist/dnd.js +1 -1
  14. package/dist/{dropdown-menu-DJEeT1XT.js → dropdown-menu-Df8785nt.js} +1 -1
  15. package/dist/editor.js +7 -7
  16. package/dist/{empty-state-CrhrmNqn.js → empty-state-DcF4TBzi.js} +1 -1
  17. package/dist/hooks.js +28 -40
  18. package/dist/{i18n-provider-hrtFm9jD.js → i18n-provider-C0fB0sEL.js} +1 -1
  19. package/dist/i18n.js +5 -5
  20. package/dist/{icon-badge-Cpke1tCf.js → icon-badge-aJ22mKGh.js} +1 -1
  21. package/dist/lib/components/ui/display/enrolment-card/enrolment-card.d.ts +12 -0
  22. package/dist/lib/components/ui/display/enrolment-card/index.d.ts +2 -0
  23. package/dist/lib/components/ui/display/enrolment-card/partials/enrolment-header.d.ts +14 -0
  24. package/dist/lib/components/ui/display/enrolment-card/partials/enrolment-verification.d.ts +15 -0
  25. package/dist/lib/components/ui/display/enrolment-card/types.d.ts +49 -0
  26. package/dist/lib/components/ui/display/enrolment-card/use-enrolment-card-labels.d.ts +3 -0
  27. package/dist/lib/components/ui/display/index.d.ts +2 -0
  28. package/dist/lib/components/ui/display/recovery-codes-status/index.d.ts +2 -0
  29. package/dist/lib/components/ui/display/recovery-codes-status/partials/recovery-count.d.ts +11 -0
  30. package/dist/lib/components/ui/display/recovery-codes-status/recovery-codes-status.d.ts +12 -0
  31. package/dist/lib/components/ui/display/recovery-codes-status/types.d.ts +44 -0
  32. package/dist/lib/components/ui/display/recovery-codes-status/use-recovery-codes-status-labels.d.ts +3 -0
  33. package/dist/lib/components/ui/display/timeline/index.d.ts +1 -1
  34. package/dist/lib/components/ui/display/timeline/partials/timeline-day-heading.d.ts +14 -0
  35. package/dist/lib/components/ui/display/timeline/partials/timeline-empty.d.ts +8 -0
  36. package/dist/lib/components/ui/display/timeline/partials/timeline-groups.d.ts +22 -0
  37. package/dist/lib/components/ui/display/timeline/partials/timeline-item-body.d.ts +13 -0
  38. package/dist/lib/components/ui/display/timeline/partials/timeline-item-card.d.ts +5 -0
  39. package/dist/lib/components/ui/display/timeline/partials/timeline-item-rail.d.ts +8 -0
  40. package/dist/lib/components/ui/display/timeline/partials/timeline-item-time.d.ts +12 -0
  41. package/dist/lib/components/ui/display/timeline/partials/timeline-skeleton.d.ts +4 -0
  42. package/dist/lib/components/ui/display/timeline/timeline-item.d.ts +13 -2
  43. package/dist/lib/components/ui/display/timeline/timeline-marker.d.ts +12 -0
  44. package/dist/lib/components/ui/display/timeline/timeline-rows.d.ts +23 -0
  45. package/dist/lib/components/ui/display/timeline/timeline.d.ts +32 -2
  46. package/dist/lib/components/ui/display/timeline/types.d.ts +6 -0
  47. package/dist/lib/components/ui/feedback/alert/alert.d.ts +7 -1
  48. package/dist/lib/components/ui/feedback/index.d.ts +1 -0
  49. package/dist/lib/components/ui/feedback/step-up-dialog/index.d.ts +2 -0
  50. package/dist/lib/components/ui/feedback/step-up-dialog/partials/step-up-body.d.ts +15 -0
  51. package/dist/lib/components/ui/feedback/step-up-dialog/partials/step-up-footer.d.ts +22 -0
  52. package/dist/lib/components/ui/feedback/step-up-dialog/partials/step-up-header.d.ts +10 -0
  53. package/dist/lib/components/ui/feedback/step-up-dialog/step-up-dialog.d.ts +16 -0
  54. package/dist/lib/components/ui/feedback/step-up-dialog/types.d.ts +55 -0
  55. package/dist/lib/components/ui/feedback/step-up-dialog/use-step-up-labels.d.ts +3 -0
  56. package/dist/lib/components/ui/feedback/step-up-dialog/use-step-up-state.d.ts +12 -0
  57. package/dist/lib/components/ui/feedback/step-up-dialog/use-title-focus.d.ts +5 -0
  58. package/dist/lib/components/ui/fields/contacts/placeholders.d.ts +1 -1
  59. package/dist/lib/components/ui/fields/index.d.ts +1 -0
  60. package/dist/lib/components/ui/fields/verification-code/describe-verification.d.ts +53 -0
  61. package/dist/lib/components/ui/fields/verification-code/index.d.ts +4 -0
  62. package/dist/lib/components/ui/fields/verification-code/partials/code-input.d.ts +12 -0
  63. package/dist/lib/components/ui/fields/verification-code/partials/code-message.d.ts +11 -0
  64. package/dist/lib/components/ui/fields/verification-code/partials/code-slots.d.ts +18 -0
  65. package/dist/lib/components/ui/fields/verification-code/partials/code-surface.d.ts +12 -0
  66. package/dist/lib/components/ui/fields/verification-code/partials/form-actions.d.ts +14 -0
  67. package/dist/lib/components/ui/fields/verification-code/partials/label-row.d.ts +10 -0
  68. package/dist/lib/components/ui/fields/verification-code/partials/locked-alert.d.ts +17 -0
  69. package/dist/lib/components/ui/fields/verification-code/partials/method-switch.d.ts +8 -0
  70. package/dist/lib/components/ui/fields/verification-code/partials/recovery-input.d.ts +7 -0
  71. package/dist/lib/components/ui/fields/verification-code/partials/resend-line.d.ts +10 -0
  72. package/dist/lib/components/ui/fields/verification-code/partials/status-line.d.ts +10 -0
  73. package/dist/lib/components/ui/fields/verification-code/throttle.d.ts +10 -0
  74. package/dist/lib/components/ui/fields/verification-code/types.d.ts +138 -0
  75. package/dist/lib/components/ui/fields/verification-code/use-answer-focus.d.ts +32 -0
  76. package/dist/lib/components/ui/fields/verification-code/use-code-entry.d.ts +43 -0
  77. package/dist/lib/components/ui/fields/verification-code/use-code-lock.d.ts +36 -0
  78. package/dist/lib/components/ui/fields/verification-code/use-code-resend.d.ts +29 -0
  79. package/dist/lib/components/ui/fields/verification-code/use-code-submit.d.ts +23 -0
  80. package/dist/lib/components/ui/fields/verification-code/use-entry-anchors.d.ts +6 -0
  81. package/dist/lib/components/ui/fields/verification-code/use-focus-on-switch.d.ts +7 -0
  82. package/dist/lib/components/ui/fields/verification-code/use-resend-focus.d.ts +20 -0
  83. package/dist/lib/components/ui/fields/verification-code/use-resend.d.ts +11 -0
  84. package/dist/lib/components/ui/fields/verification-code/use-short-reminder.d.ts +24 -0
  85. package/dist/lib/components/ui/fields/verification-code/use-stale-answer.d.ts +52 -0
  86. package/dist/lib/components/ui/fields/verification-code/use-throttle-focus.d.ts +16 -0
  87. package/dist/lib/components/ui/fields/verification-code/use-throttle.d.ts +10 -0
  88. package/dist/lib/components/ui/fields/verification-code/use-typed-value.d.ts +18 -0
  89. package/dist/lib/components/ui/fields/verification-code/use-verification-labels.d.ts +3 -0
  90. package/dist/lib/components/ui/fields/verification-code/verification-code.d.ts +11 -0
  91. package/dist/lib/components/ui/fields/verification-code/verification-lock-provider.d.ts +54 -0
  92. package/dist/lib/components/ui/layout/stepper/partials/header-nav.d.ts +10 -0
  93. package/dist/lib/components/ui/layout/stepper/partials/header-segments.d.ts +6 -0
  94. package/dist/lib/components/ui/layout/stepper/partials/header-summary.d.ts +12 -0
  95. package/dist/lib/components/ui/layout/stepper/partials/stepper-content.d.ts +8 -0
  96. package/dist/lib/components/ui/layout/stepper/partials/stepper-step-text.d.ts +13 -0
  97. package/dist/lib/components/ui/layout/stepper/stepper-connector.d.ts +6 -0
  98. package/dist/lib/components/ui/layout/stepper/stepper-header.d.ts +12 -0
  99. package/dist/lib/components/ui/layout/stepper/stepper-icon.d.ts +5 -0
  100. package/dist/lib/components/ui/layout/stepper/stepper-layout.d.ts +25 -0
  101. package/dist/lib/components/ui/layout/stepper/stepper-step.d.ts +9 -2
  102. package/dist/lib/components/ui/layout/stepper/stepper.d.ts +13 -3
  103. package/dist/lib/components/ui/overlays/dialog/dialog-parts.d.ts +8 -1
  104. package/dist/lib/i18n/resources/en/en.d.ts +59 -0
  105. package/dist/lib/i18n/resources/en/material.json.d.ts +61 -2
  106. package/dist/lib/i18n/resources/fr/fr.d.ts +59 -0
  107. package/dist/lib/i18n/resources/fr/material.json.d.ts +61 -2
  108. package/dist/lib/i18n/resources/resources.d.ts +118 -0
  109. package/dist/lib/i18n/translator.d.ts +1 -1
  110. package/dist/lib.js +1 -1
  111. package/dist/main.js +43 -43
  112. package/dist/map.js +4 -4
  113. package/dist/material.css +1 -1
  114. package/dist/pdf-reader.js +1 -1
  115. package/dist/print.js +2 -2
  116. package/dist/{public-DPPmNtZB.js → public-zVb_Nq_D.js} +6 -6
  117. package/dist/{rich-code-block-KQYR0qt3.js → rich-code-block-DMWZZJma.js} +4 -4
  118. package/dist/{sortable-provider-hPPTMtJA.js → sortable-provider-DstbgMVf.js} +1 -1
  119. package/dist/{spinner-Dd0os4cb.js → spinner-C4CgDEYm.js} +1 -1
  120. package/dist/{stored-language-Blyb68vN.js → stored-language-IaL1Ftn_.js} +122 -4
  121. package/dist/styles.css +8 -0
  122. package/dist/theme-picker.js +2 -2
  123. package/dist/{theme-toggle-BDRRkkiA.js → theme-toggle-CGW2_K54.js} +1 -1
  124. package/dist/{toolbar-items-D3hw7XZE.js → toolbar-items-CsLGJMEJ.js} +2 -2
  125. package/dist/{translate-material-CdJBbURx.js → translate-material-v9u-e7Kd.js} +2 -2
  126. package/dist/{translator-38JuN_VD.js → translator-Dk4_qE6U.js} +1 -1
  127. package/dist/{use-chat-composer-utGkZQ6X.js → use-chat-composer-Brcb5f7r.js} +12 -12
  128. package/dist/{use-heading-spy-bTccmEMF.js → use-heading-spy-DjKixjLm.js} +43 -31
  129. package/dist/{use-material-translation-DLsfkMxp.js → use-material-translation-DOkTaWK_.js} +2 -2
  130. package/docs/README.md +1 -0
  131. package/docs/components/README.md +1 -1
  132. package/docs/components/buttons-and-actions.md +2 -1
  133. package/docs/components/data-display.md +133 -4
  134. package/docs/components/feedback-and-status.md +113 -1
  135. package/docs/components/form-fields.md +163 -0
  136. package/docs/components/navigation-and-layout.md +66 -23
  137. package/docs/components/overlays-and-menus.md +3 -1
  138. package/docs/guides/i18n.md +4 -1
  139. package/docs/guides/ssr.md +3 -1
  140. package/docs/guides/two-factor.md +78 -0
  141. package/docs/previews/data-display-enrolmentcard.webp +0 -0
  142. package/docs/previews/data-display-recoverycodesstatus.webp +0 -0
  143. package/docs/previews/data-display-timeline.webp +0 -0
  144. package/docs/previews/feedback-status-stepupdialog.webp +0 -0
  145. package/docs/previews/form-fields-verificationcode.webp +0 -0
  146. package/docs/previews/navigation-layout-stepper.webp +0 -0
  147. package/docs/roadmap.md +30 -0
  148. package/lib/styles.css +8 -0
  149. package/package.json +2 -2
@@ -1,3 +1,3 @@
1
- import { t as e } from "./public-DPPmNtZB.js";
1
+ import { t as e } from "./public-zVb_Nq_D.js";
2
2
  import { configurePdfReader as t } from "@nxgt/material-core/pdf-reader";
3
3
  export { e as PdfReader, t as configurePdfReader };
package/dist/print.js CHANGED
@@ -1,5 +1,5 @@
1
- import { r as e } from "./i18n-provider-hrtFm9jD.js";
2
- import { t } from "./translate-material-CdJBbURx.js";
1
+ import { r as e } from "./i18n-provider-C0fB0sEL.js";
2
+ import { t } from "./translate-material-v9u-e7Kd.js";
3
3
  import { Children as n, createContext as r, isValidElement as i, useCallback as a, useContext as o, useEffect as s, useMemo as c, useState as l } from "react";
4
4
  import { jsx as u, jsxs as d } from "react/jsx-runtime";
5
5
  import { resolvePdfFileName as f } from "@nxgt/material-core/pdf-file-name";
@@ -6,18 +6,18 @@ import { c as i, i as a, l as o, n as s, o as c, s as l } from "./dist-lmHmz_bu.
6
6
  import { a as u, o as d } from "./tooltip-CkttDIab.js";
7
7
  import { i as f } from "./dist-C4wtXCjf.js";
8
8
  import { r as p, t as m } from "./in-dialog-Vwkyp-M5.js";
9
- import { C as h, D as g, E as _, O as v, S as y, T as b, _ as x, f as S, g as ee, k as te, r as ne, t as C, u as re, w } from "./dialog-8Ua9uuJW.js";
10
- import { c as T, d as ie, f as E, i as ae, l as oe, n as se, o as D, t as ce, u as O } from "./dropdown-menu-DJEeT1XT.js";
11
- import { S as le, a as k, d as A, g as ue, h as de, i as fe, m as pe, n as j, r as me, t as M, u as he, w as ge } from "./toolbar-items-D3hw7XZE.js";
12
- import { t as N } from "./use-material-translation-DLsfkMxp.js";
13
- import { t as _e } from "./button-b_kruV_L.js";
9
+ import { C as h, D as g, E as _, O as v, S as y, T as b, _ as x, f as S, g as ee, k as te, r as ne, t as C, u as re, w } from "./dialog-CCCcnTIx.js";
10
+ import { c as T, d as ie, f as E, i as ae, l as oe, n as se, o as D, t as ce, u as O } from "./dropdown-menu-Df8785nt.js";
11
+ import { S as le, a as k, d as A, g as ue, h as de, i as fe, m as pe, n as j, r as me, t as M, u as he, w as ge } from "./toolbar-items-CsLGJMEJ.js";
12
+ import { t as N } from "./use-material-translation-DOkTaWK_.js";
13
+ import { t as _e } from "./button-yaltbQmC.js";
14
14
  import { n as ve, t as ye } from "./icon-button-CN9r5TNE.js";
15
15
  import { t as be } from "./useEvent-2fKq-6w8.js";
16
16
  import { n as xe, t as Se } from "./toggle-group-BMJNcFAC.js";
17
17
  import { o as Ce } from "./escape-owner-C4W_sOAU.js";
18
18
  import { n as we } from "./use-slice-reducer-BGkeGtML.js";
19
19
  import { r as Te } from "./use-csp-nonce-ZKs9k-ov.js";
20
- import { n as Ee, t as De } from "./empty-state-CrhrmNqn.js";
20
+ import { n as Ee, t as De } from "./empty-state-DcF4TBzi.js";
21
21
  import { t as Oe } from "./client-only.utils-3nHNzCki.js";
22
22
  import { t as ke } from "./use-scroll-away-PQRFZkT2.js";
23
23
  import { ArrowLeft as Ae, BookOpenText as je, ChevronDown as Me, ChevronLeft as Ne, ChevronRight as Pe, ChevronUp as Fe, Download as Ie, Eraser as Le, FileText as Re, FileWarning as ze, FileX2 as Be, Highlighter as Ve, KeyRound as He, LayoutGrid as Ue, List as We, Loader2 as Ge, Maximize as Ke, MessageSquareText as qe, Minimize as Je, MoreVertical as Ye, MousePointer2 as Xe, MoveHorizontal as Ze, PanelLeft as Qe, Pen as $e, PencilLine as et, Printer as tt, RotateCw as nt, Search as rt, StickyNote as it, Type as at, Underline as ot, Undo2 as st, Volume2 as ct, X as lt, XIcon as ut, ZoomIn as dt, ZoomOut as ft } from "lucide-react";
@@ -1,7 +1,7 @@
1
1
  import { t as e } from "./tooltip-CkttDIab.js";
2
- import { c as t, n, t as r } from "./dropdown-menu-DJEeT1XT.js";
3
- import { t as i } from "./use-material-translation-DLsfkMxp.js";
4
- import { a, i as o, n as s, o as c, t as l } from "./code-language-items-374m-OK8.js";
2
+ import { c as t, n, t as r } from "./dropdown-menu-Df8785nt.js";
3
+ import { t as i } from "./use-material-translation-DOkTaWK_.js";
4
+ import { a, i as o, n as s, o as c, t as l } from "./code-language-items-DAHtfQ7W.js";
5
5
  import { i as u, n as d, r as f, s as p } from "./dist-C3GR7kJd.js";
6
6
  import { t as m } from "./code-block-spec-CGLKRhwD.js";
7
7
  import { Check as h, ChevronDown as g, Copy as _, Maximize2 as v, WrapText as y } from "lucide-react";
@@ -143,7 +143,7 @@ function M({ node: e, editor: t, updateAttributes: n, editable: r, wrap: a, onWr
143
143
  }
144
144
  //#endregion
145
145
  //#region lib/components/ui/widgets/editor/extensions/code/code-block-open.tsx
146
- var N = x(() => import("./code-editor-BtDOgUET.js").then((e) => e.n).then((e) => ({ default: e.CodeEditor })));
146
+ var N = x(() => import("./code-editor-C9qBNoYb.js").then((e) => e.n).then((e) => ({ default: e.CodeEditor })));
147
147
  function P() {
148
148
  let { t: e } = i();
149
149
  return /* @__PURE__ */ T("div", {
@@ -1,6 +1,6 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
2
  import { t } from "./dist-DVRQkaTK.js";
3
- import { t as n } from "./use-material-translation-DLsfkMxp.js";
3
+ import { t as n } from "./use-material-translation-DOkTaWK_.js";
4
4
  import { t as r } from "./icon-button-CN9r5TNE.js";
5
5
  import { t as i } from "./compose-refs-DZ0iIVF-.js";
6
6
  import { GripVertical as a } from "lucide-react";
@@ -1,6 +1,6 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
2
  import { o as t } from "./tooltip-CkttDIab.js";
3
- import { t as n } from "./use-material-translation-DLsfkMxp.js";
3
+ import { t as n } from "./use-material-translation-DOkTaWK_.js";
4
4
  import { jsx as r } from "react/jsx-runtime";
5
5
  //#region lib/components/ui/feedback/spinner/spinner.tsx
6
6
  var i = t("transition-all duration-500", {
@@ -727,6 +727,58 @@ var t = {
727
727
  },
728
728
  buttons: { close: "Close" }
729
729
  },
730
+ "verification-code": {
731
+ label: "Code",
732
+ "recovery-label": "Recovery code",
733
+ "use-recovery": "Use a recovery code",
734
+ "use-app": "Use my authenticator app",
735
+ "use-email": "Use the code sent to you",
736
+ confirm: "Confirm",
737
+ resend: "Resend the code",
738
+ resent: "A new code was sent.",
739
+ sending: "Sending a new code…",
740
+ "new-code": "New code",
741
+ "try-again": "Try again",
742
+ wrong: "Wrong code.",
743
+ "tries-left": "{count, plural, one {# try left.} other {# tries left.}}",
744
+ incomplete: "Enter all {count} digits.",
745
+ "incomplete-recovery": "Enter your recovery code.",
746
+ expired: "This code has expired.",
747
+ failed: "The code could not be checked. Try again.",
748
+ locked: "Too many wrong codes. Try again later.",
749
+ throttled: "Too many requests. Wait a moment and try again.",
750
+ "throttled-minutes": "Wait {n} min before asking for a new code.",
751
+ "throttled-seconds": "Wait {n} s before asking for a new code.",
752
+ "throttled-minutes-app": "Wait {n} min before trying again.",
753
+ "throttled-seconds-app": "Wait {n} s before trying again.",
754
+ "locked-badge": "Locked"
755
+ },
756
+ "step-up-dialog": {
757
+ title: "Confirm it's you",
758
+ description: "For your security, confirm it's you to continue.",
759
+ "description-app": "Enter the code from your authenticator app to continue.",
760
+ "description-email": "Enter the code we sent you to continue.",
761
+ "description-email-to": "Enter the code we sent to {destination} to continue.",
762
+ requesting: "Sending you a code…",
763
+ cancel: "Cancel",
764
+ confirmed: "Confirmed. Finishing up…"
765
+ },
766
+ "enrolment-card": {
767
+ title: "Set up your authenticator app",
768
+ description: "Scan the QR code with your authenticator app, then type the code it shows.",
769
+ activate: "Activate",
770
+ cancel: "Cancel",
771
+ "sessions-notice": "Turning this on signs you out on your other devices."
772
+ },
773
+ "recovery-codes-status": {
774
+ title: "Recovery codes",
775
+ description: "Each code signs you in once if you lose access to your authenticator app.",
776
+ remaining: "{count, plural, one {# recovery code left} other {# recovery codes left}}",
777
+ "none-left": "No recovery codes left",
778
+ "none-left-hint": "Make a new set now, or you could be locked out if you lose your authenticator app.",
779
+ "new-codes": "New codes",
780
+ "new-codes-hint": "A new set replaces the old codes, which stop working."
781
+ },
730
782
  zod: {
731
783
  required: "This field is required.",
732
784
  invalid_type: {
@@ -1115,7 +1167,8 @@ var t = {
1115
1167
  "now-indicator": { label: "Current time: {time}" },
1116
1168
  timeline: {
1117
1169
  label: "Timeline",
1118
- empty: "No activity yet"
1170
+ empty: "No activity yet",
1171
+ events: "{count, plural, one {# event} other {# events}}"
1119
1172
  },
1120
1173
  copy: {
1121
1174
  copy: "Copy",
@@ -1238,7 +1291,13 @@ var t = {
1238
1291
  stepper: {
1239
1292
  step: "Step {step}",
1240
1293
  completed: "Completed",
1241
- error: "Error"
1294
+ error: "Error",
1295
+ "step-of": "Step {step} of {total}",
1296
+ back: "Back",
1297
+ next: "Next",
1298
+ optional: "Optional",
1299
+ attention: "Needs attention",
1300
+ failed: "Steps needing attention: {count}"
1242
1301
  },
1243
1302
  "location-field": {
1244
1303
  placeholder: "No location selected",
@@ -3500,6 +3559,58 @@ var t = {
3500
3559
  },
3501
3560
  buttons: { close: "Fermer" }
3502
3561
  },
3562
+ "verification-code": {
3563
+ label: "Code",
3564
+ "recovery-label": "Code de récupération",
3565
+ "use-recovery": "Utiliser un code de récupération",
3566
+ "use-app": "Utiliser mon application d'authentification",
3567
+ "use-email": "Utiliser le code envoyé",
3568
+ confirm: "Confirmer",
3569
+ resend: "Renvoyer le code",
3570
+ resent: "Un nouveau code a été envoyé.",
3571
+ sending: "Envoi d'un nouveau code…",
3572
+ "new-code": "Nouveau code",
3573
+ "try-again": "Réessayer",
3574
+ wrong: "Code incorrect.",
3575
+ "tries-left": "{count, plural, one {# essai restant.} other {# essais restants.}}",
3576
+ incomplete: "Saisissez les {count} chiffres.",
3577
+ "incomplete-recovery": "Saisissez votre code de récupération.",
3578
+ expired: "Ce code a expiré.",
3579
+ failed: "Le code n'a pas pu être vérifié. Réessayez.",
3580
+ locked: "Trop de codes incorrects. Réessayez plus tard.",
3581
+ throttled: "Trop de demandes. Patientez un instant avant de réessayer.",
3582
+ "throttled-minutes": "Patientez {n} min avant de redemander un code.",
3583
+ "throttled-seconds": "Patientez {n} s avant de redemander un code.",
3584
+ "throttled-minutes-app": "Patientez {n} min avant de réessayer.",
3585
+ "throttled-seconds-app": "Patientez {n} s avant de réessayer.",
3586
+ "locked-badge": "Verrouillé"
3587
+ },
3588
+ "step-up-dialog": {
3589
+ title: "Confirmez que c'est bien vous",
3590
+ description: "Pour votre sécurité, confirmez que c'est bien vous pour continuer.",
3591
+ "description-app": "Saisissez le code de votre application d'authentification pour continuer.",
3592
+ "description-email": "Saisissez le code que nous vous avons envoyé pour continuer.",
3593
+ "description-email-to": "Saisissez le code envoyé à {destination} pour continuer.",
3594
+ requesting: "Envoi d'un code…",
3595
+ cancel: "Annuler",
3596
+ confirmed: "Confirmé. Finalisation…"
3597
+ },
3598
+ "enrolment-card": {
3599
+ title: "Configurez votre application d'authentification",
3600
+ description: "Scannez le code QR avec votre application d'authentification, puis saisissez le code qu'elle affiche.",
3601
+ activate: "Activer",
3602
+ cancel: "Annuler",
3603
+ "sessions-notice": "L'activation vous déconnecte de vos autres appareils."
3604
+ },
3605
+ "recovery-codes-status": {
3606
+ title: "Codes de récupération",
3607
+ description: "Chaque code vous connecte une seule fois si vous perdez l'accès à votre application d'authentification.",
3608
+ remaining: "{count, plural, one {# code de récupération restant} other {# codes de récupération restants}}",
3609
+ "none-left": "Plus aucun code de récupération",
3610
+ "none-left-hint": "Créez dès maintenant un nouveau lot, sinon vous risquez d'être bloqué si vous perdez votre application d'authentification.",
3611
+ "new-codes": "Nouveaux codes",
3612
+ "new-codes-hint": "Un nouveau lot remplace les anciens codes, qui cessent de fonctionner."
3613
+ },
3503
3614
  zod: {
3504
3615
  required: "Ce champ est requis.",
3505
3616
  invalid_type: {
@@ -3888,7 +3999,8 @@ var t = {
3888
3999
  "now-indicator": { label: "Heure actuelle : {time}" },
3889
4000
  timeline: {
3890
4001
  label: "Chronologie",
3891
- empty: "Aucune activité"
4002
+ empty: "Aucune activité",
4003
+ events: "{count, plural, one {# événement} other {# événements}}"
3892
4004
  },
3893
4005
  copy: {
3894
4006
  copy: "Copier",
@@ -4011,7 +4123,13 @@ var t = {
4011
4123
  stepper: {
4012
4124
  step: "Étape {step}",
4013
4125
  completed: "Terminée",
4014
- error: "Erreur"
4126
+ error: "Erreur",
4127
+ "step-of": "Étape {step} sur {total}",
4128
+ back: "Précédent",
4129
+ next: "Suivant",
4130
+ optional: "Facultative",
4131
+ attention: "À corriger",
4132
+ failed: "Étapes à corriger : {count}"
4015
4133
  },
4016
4134
  "location-field": {
4017
4135
  placeholder: "Aucun emplacement sélectionné",
package/dist/styles.css CHANGED
@@ -157,3 +157,11 @@
157
157
  bottom: -0.1875rem;
158
158
  transform: rotate(-45deg) scale(0.75);
159
159
  }
160
+
161
+ /* A state change on a Stepper's shape: a small spring-in (no motion under
162
+ * prefers-reduced-motion: the catalogue's reduced-motion rule ends it). */
163
+ @keyframes nxgt-pop {
164
+ from {
165
+ transform: scale(0.55);
166
+ }
167
+ }
@@ -1,10 +1,10 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
2
  import { a as t, i as n, n as r, o as i, r as a, t as o } from "./bubble-input-B7BVd9fX.js";
3
- import { t as s } from "./use-material-translation-DLsfkMxp.js";
3
+ import { t as s } from "./use-material-translation-DOkTaWK_.js";
4
4
  import { a as c, r as l } from "./icon-sprites-CaYXzOL4.js";
5
5
  import { t as u } from "./use-theme-DMcyJ52N.js";
6
6
  import { a as d, r as f } from "./theme-context-Cofk6vgs.js";
7
- import { t as p } from "./theme-toggle-BDRRkkiA.js";
7
+ import { t as p } from "./theme-toggle-CGW2_K54.js";
8
8
  import { n as m, t as h } from "./nxgt-theme-ZS945iMP.js";
9
9
  import { Check as g } from "lucide-react";
10
10
  import { useContext as _ } from "react";
@@ -1,4 +1,4 @@
1
- import { t as e } from "./use-material-translation-DLsfkMxp.js";
1
+ import { t as e } from "./use-material-translation-DOkTaWK_.js";
2
2
  import { i as t } from "./theme-store-CSl51uNH.js";
3
3
  import { n, t as r } from "./use-theme-DMcyJ52N.js";
4
4
  import { r as i } from "./theme-context-Cofk6vgs.js";
@@ -4,9 +4,9 @@ import { a as i, c as a, i as o, l as s, r as c, s as l } from "./dist-lmHmz_bu.
4
4
  import { b as u, c as d, d as f, f as p, l as m, t as h, u as g, x as _ } from "./tooltip-CkttDIab.js";
5
5
  import { i as v, n as y, r as b, t as x } from "./dist-C4wtXCjf.js";
6
6
  import { a as S, c as C, l as w, o as T, r as ee, s as te, t as E } from "./in-dialog-Vwkyp-M5.js";
7
- import { A as ne, M as re, N as ie, b as ae, d as oe, f as se, i as ce, j as le, l as ue, n as de, o as fe, r as pe, t as me, u as he, y as ge } from "./dropdown-menu-DJEeT1XT.js";
7
+ import { A as ne, M as re, N as ie, b as ae, d as oe, f as se, i as ce, j as le, l as ue, n as de, o as fe, r as pe, t as me, u as he, y as ge } from "./dropdown-menu-Df8785nt.js";
8
8
  import { a as _e, n as ve, r as ye, t as be } from "./dist-B7RjY7SL.js";
9
- import { t as xe } from "./use-material-translation-DLsfkMxp.js";
9
+ import { t as xe } from "./use-material-translation-DOkTaWK_.js";
10
10
  import { t as Se } from "./warn-once-C_e47JM8.js";
11
11
  import { o as Ce } from "./escape-owner-C4W_sOAU.js";
12
12
  import { ChevronLeft as we, ChevronRightIcon as Te, MoreVertical as Ee } from "lucide-react";
@@ -1,5 +1,5 @@
1
- import "./stored-language-Blyb68vN.js";
2
- import { a as e, r as t } from "./translator-38JuN_VD.js";
1
+ import "./stored-language-IaL1Ftn_.js";
2
+ import { a as e, r as t } from "./translator-Dk4_qE6U.js";
3
3
  //#region lib/i18n/translate-material.ts
4
4
  function n(n, r, i, a) {
5
5
  if (n) for (let e of /* @__PURE__ */ new Set([n, n.split("-")[0]])) {
@@ -1,5 +1,5 @@
1
1
  import { t as e } from "./is-production-GLw59WU8.js";
2
- import { a as t, i as n, r, t as i } from "./stored-language-Blyb68vN.js";
2
+ import { a as t, i as n, r, t as i } from "./stored-language-IaL1Ftn_.js";
3
3
  import { t as a } from "./get-CTzJAwfc.js";
4
4
  //#region ../../node_modules/@formatjs/fast-memoize/index.js
5
5
  function o(e, t) {
@@ -7,21 +7,21 @@ import { a as o, c as s, i as c, l, n as u, o as d, r as f, s as p, t as m } fro
7
7
  import { _ as h, a as g, g as _, h as v, m as y, o as b, p as x, t as S, v as C, y as w } from "./tooltip-CkttDIab.js";
8
8
  import { a as T, i as E, n as D, r as O, t as k } from "./dist-C4wtXCjf.js";
9
9
  import { i as A, n as ee, t as j } from "./in-dialog-Vwkyp-M5.js";
10
- import { A as M, C as N, D as te, E as ne, O as P, S as re, T as ie, _ as F, b as ae, f as oe, g as se, k as I, l as ce, m as le, n as ue, o as de, r as fe, s as pe, t as me, u as he, v as ge, w as _e, x as ve, y as ye } from "./dialog-8Ua9uuJW.js";
10
+ import { A as M, C as N, D as te, E as ne, O as P, S as re, T as ie, _ as F, b as ae, f as oe, g as se, k as I, l as ce, m as le, n as ue, o as de, r as fe, s as pe, t as me, u as he, v as ge, w as _e, x as ve, y as ye } from "./dialog-CCCcnTIx.js";
11
11
  import { A as be, C as xe, D as Se, E as Ce, O as we, S as Te, T as Ee, _ as De, a as Oe, b as ke, d as Ae, f as je, g as Me, h as Ne, i as Pe, k as Fe, l as Ie, m as Le, n as Re, o as ze, p as Be, r as Ve, s as He, t as Ue, u as We, v as Ge, w as Ke, x as qe, y as Je } from "./floating-ui.dom-KkZSW8_E.js";
12
- import { D as Ye, E as Xe, N as Ze, O as Qe, c as $e, d as et, f as tt, i as nt, k as rt, m as it, n as at, o as ot, p as st, t as ct, u as lt } from "./dropdown-menu-DJEeT1XT.js";
12
+ import { D as Ye, E as Xe, N as Ze, O as Qe, c as $e, d as et, f as tt, i as nt, k as rt, m as it, n as at, o as ot, p as st, t as ct, u as lt } from "./dropdown-menu-Df8785nt.js";
13
13
  import { a as ut, i as dt, n as ft } from "./field-blur-context-Cft9s7Hg.js";
14
- import { C as pt, S as mt, a as ht, c as gt, d as _t, l as vt, n as yt, o as bt, s as xt, u as St } from "./toolbar-items-D3hw7XZE.js";
14
+ import { C as pt, S as mt, a as ht, c as gt, d as _t, l as vt, n as yt, o as bt, s as xt, u as St } from "./toolbar-items-CsLGJMEJ.js";
15
15
  import { a as Ct, i as wt, n as Tt, o as Et, t as Dt } from "./bubble-input-B7BVd9fX.js";
16
16
  import { i as Ot } from "./dist-B7RjY7SL.js";
17
- import "./stored-language-Blyb68vN.js";
18
- import { a as kt } from "./translator-38JuN_VD.js";
17
+ import "./stored-language-IaL1Ftn_.js";
18
+ import { a as kt } from "./translator-Dk4_qE6U.js";
19
19
  import { h as At } from "./get-CTzJAwfc.js";
20
20
  import { t as jt } from "./isEmpty-F_g3jLf8.js";
21
- import { t as L } from "./use-material-translation-DLsfkMxp.js";
22
- import { t as Mt } from "./spinner-Dd0os4cb.js";
21
+ import { t as L } from "./use-material-translation-DOkTaWK_.js";
22
+ import { t as Mt } from "./spinner-C4CgDEYm.js";
23
23
  import { a as Nt } from "./button-tones-BwuVvAmd.js";
24
- import { a as Pt, i as Ft, o as It, r as Lt, t as Rt } from "./button-b_kruV_L.js";
24
+ import { a as Pt, i as Ft, o as It, r as Lt, t as Rt } from "./button-yaltbQmC.js";
25
25
  import { t as R } from "./icon-button-CN9r5TNE.js";
26
26
  import { a as zt, r as Bt } from "./icon-sprites-CaYXzOL4.js";
27
27
  import { t as Vt } from "./use-ssr-media-query-C6M5m8sf.js";
@@ -35,10 +35,10 @@ import { a as tn, i as nn, o as rn } from "./escape-owner-C4W_sOAU.js";
35
35
  import { n as an } from "./use-slice-reducer-BGkeGtML.js";
36
36
  import { t as on } from "./browser-only-DQ94lWF8.js";
37
37
  import { t as sn } from "./compose-refs-DZ0iIVF-.js";
38
- import { n as cn, r as ln, t as un } from "./chip-6O3t9GXt.js";
39
- import { n as dn, t as fn } from "./icon-badge-Cpke1tCf.js";
38
+ import { n as cn, r as ln, t as un } from "./chip-BqWbbr1b.js";
39
+ import { n as dn, t as fn } from "./icon-badge-aJ22mKGh.js";
40
40
  import { r as pn } from "./use-csp-nonce-ZKs9k-ov.js";
41
- import { t as mn } from "./empty-state-CrhrmNqn.js";
41
+ import { t as mn } from "./empty-state-DcF4TBzi.js";
42
42
  import { t as hn } from "./skeleton-DSdtr2qc.js";
43
43
  import { H as gn, V as _n, X as vn, bt as yn, it as bn, lt as xn, n as Sn, t as Cn, xt as wn, yt as Tn } from "./dist-moutbfbd.js";
44
44
  import { t as En } from "./markdown-Dw_uH7j7.js";
@@ -11082,7 +11082,7 @@ var RS = (e = {}) => Dn({
11082
11082
  let [{ default: t }, { lowlight: n }, { richCodeBlock: r }] = await Promise.all([
11083
11083
  import("./dist-CRMFGjng.js"),
11084
11084
  import("./lowlight-OtcjU2Sa.js"),
11085
- import("./rich-code-block-KQYR0qt3.js")
11085
+ import("./rich-code-block-DMWZZJma.js")
11086
11086
  ]);
11087
11087
  return [r(t, {
11088
11088
  lowlight: n,
@@ -1,8 +1,9 @@
1
- import { r as e } from "./i18n-provider-hrtFm9jD.js";
1
+ import { r as e } from "./i18n-provider-C0fB0sEL.js";
2
2
  import { _ as t, g as n, h as r, n as i, v as a, y as o } from "./number.utils-BG_eEt5g.js";
3
- import { useCallback as s, useEffect as c, useMemo as l, useRef as u } from "react";
3
+ import { useCallback as s, useEffect as c, useMemo as l, useRef as u, useState as d } from "react";
4
+ import { busySettler as f, busySettler as p, createSubmitGuard as m, createSubmitGuard as h } from "@nxgt/material-core/submit-guard";
4
5
  //#region ../../node_modules/date-fns/locale/fr/_lib/formatDistance.js
5
- var d = {
6
+ var g = {
6
7
  lessThanXSeconds: {
7
8
  one: "moins d’une seconde",
8
9
  other: "moins de {{count}} secondes"
@@ -64,10 +65,10 @@ var d = {
64
65
  one: "presqu’un an",
65
66
  other: "presque {{count}} ans"
66
67
  }
67
- }, f = (e, t, n) => {
68
- let r, i = d[e];
68
+ }, _ = (e, t, n) => {
69
+ let r, i = g[e];
69
70
  return r = typeof i == "string" ? i : t === 1 ? i.one : i.other.replace("{{count}}", String(t)), n?.addSuffix ? n.comparison && n.comparison > 0 ? "dans " + r : "il y a " + r : r;
70
- }, p = {
71
+ }, v = {
71
72
  date: o({
72
73
  formats: {
73
74
  full: "EEEE d MMMM y",
@@ -95,18 +96,18 @@ var d = {
95
96
  },
96
97
  defaultWidth: "full"
97
98
  })
98
- }, m = {
99
+ }, y = {
99
100
  lastWeek: "eeee 'dernier à' p",
100
101
  yesterday: "'hier à' p",
101
102
  today: "'aujourd’hui à' p",
102
103
  tomorrow: "'demain à' p'",
103
104
  nextWeek: "eeee 'prochain à' p",
104
105
  other: "P"
105
- }, h = (e, t, n, r) => m[e], g = {
106
+ }, b = (e, t, n, r) => y[e], x = {
106
107
  narrow: ["av. J.-C", "ap. J.-C"],
107
108
  abbreviated: ["av. J.-C", "ap. J.-C"],
108
109
  wide: ["avant Jésus-Christ", "après Jésus-Christ"]
109
- }, _ = {
110
+ }, S = {
110
111
  narrow: [
111
112
  "T1",
112
113
  "T2",
@@ -125,7 +126,7 @@ var d = {
125
126
  "3ème trimestre",
126
127
  "4ème trimestre"
127
128
  ]
128
- }, v = {
129
+ }, C = {
129
130
  narrow: [
130
131
  "J",
131
132
  "F",
@@ -168,7 +169,7 @@ var d = {
168
169
  "novembre",
169
170
  "décembre"
170
171
  ]
171
- }, y = {
172
+ }, w = {
172
173
  narrow: [
173
174
  "D",
174
175
  "L",
@@ -205,7 +206,7 @@ var d = {
205
206
  "vendredi",
206
207
  "samedi"
207
208
  ]
208
- }, b = {
209
+ }, T = {
209
210
  narrow: {
210
211
  am: "AM",
211
212
  pm: "PM",
@@ -236,7 +237,7 @@ var d = {
236
237
  evening: "du soir",
237
238
  night: "du matin"
238
239
  }
239
- }, x = (e, t) => {
240
+ }, E = (e, t) => {
240
241
  let n = Number(e), r = t?.unit;
241
242
  if (n === 0) return "0";
242
243
  let i = [
@@ -247,38 +248,38 @@ var d = {
247
248
  "second"
248
249
  ], a;
249
250
  return a = n === 1 ? r && i.includes(r) ? "ère" : "er" : "ème", n + a;
250
- }, S = ["MMM", "MMMM"], C = {
251
+ }, D = ["MMM", "MMMM"], O = {
251
252
  en: r,
252
253
  fr: {
253
254
  code: "fr",
254
- formatDistance: f,
255
- formatLong: p,
256
- formatRelative: h,
255
+ formatDistance: _,
256
+ formatLong: v,
257
+ formatRelative: b,
257
258
  localize: {
258
- preprocessor: (e, t) => e.getDate() === 1 || !t.some((e) => e.isToken && S.includes(e.value)) ? t : t.map((e) => e.isToken && e.value === "do" ? {
259
+ preprocessor: (e, t) => e.getDate() === 1 || !t.some((e) => e.isToken && D.includes(e.value)) ? t : t.map((e) => e.isToken && e.value === "do" ? {
259
260
  isToken: !0,
260
261
  value: "d"
261
262
  } : e),
262
- ordinalNumber: x,
263
+ ordinalNumber: E,
263
264
  era: a({
264
- values: g,
265
+ values: x,
265
266
  defaultWidth: "wide"
266
267
  }),
267
268
  quarter: a({
268
- values: _,
269
+ values: S,
269
270
  defaultWidth: "wide",
270
271
  argumentCallback: (e) => e - 1
271
272
  }),
272
273
  month: a({
273
- values: v,
274
+ values: C,
274
275
  defaultWidth: "wide"
275
276
  }),
276
277
  day: a({
277
- values: y,
278
+ values: w,
278
279
  defaultWidth: "wide"
279
280
  }),
280
281
  dayPeriod: a({
281
- values: b,
282
+ values: T,
282
283
  defaultWidth: "wide"
283
284
  })
284
285
  },
@@ -408,8 +409,8 @@ var d = {
408
409
  }
409
410
  }
410
411
  };
411
- function w() {
412
- let t = e()?.language ?? "en", n = l(() => C[t] ?? r, [t]);
412
+ function k() {
413
+ let t = e()?.language ?? "en", n = l(() => O[t] ?? r, [t]);
413
414
  return {
414
415
  language: t,
415
416
  locale: n,
@@ -418,17 +419,28 @@ function w() {
418
419
  }
419
420
  //#endregion
420
421
  //#region lib/hooks/use-focus-on-mount.ts
421
- function T(e = !0) {
422
+ function A(e = !0) {
422
423
  let t = u(null);
423
424
  return c(() => {
424
425
  e && t.current?.focus();
425
426
  }, [e]), t;
426
427
  }
427
428
  //#endregion
429
+ //#region lib/hooks/use-submit-once.ts
430
+ function j(e) {
431
+ let [t] = d(m), [n] = d(() => f(t)), r = e !== void 0;
432
+ return c(() => {
433
+ e !== void 0 && n(e);
434
+ }, [e, n]), s((e, n) => t.once(e, {
435
+ settleSync: !r,
436
+ ...n
437
+ }), [t, r]);
438
+ }
439
+ //#endregion
428
440
  //#region lib/hooks/use-heading-spy.ts
429
- var E = "0px 0px -65% 0px", D = [0, 1];
430
- function O(e, t, n) {
431
- let r = n?.rootMargin ?? E, i = n?.threshold ?? D;
441
+ var M = "0px 0px -65% 0px", N = [0, 1];
442
+ function P(e, t, n) {
443
+ let r = n?.rootMargin ?? M, i = n?.threshold ?? N;
432
444
  c(() => {
433
445
  if (e.length === 0) return;
434
446
  let n = e.map((e) => document.getElementById(e)).filter((e) => e != null);
@@ -450,4 +462,4 @@ function O(e, t, n) {
450
462
  ]);
451
463
  }
452
464
  //#endregion
453
- export { T as n, w as r, O as t };
465
+ export { A as a, j as i, p as n, k as o, h as r, P as t };
@@ -1,5 +1,5 @@
1
- import { r as e } from "./i18n-provider-hrtFm9jD.js";
2
- import { t } from "./translate-material-CdJBbURx.js";
1
+ import { r as e } from "./i18n-provider-C0fB0sEL.js";
2
+ import { t } from "./translate-material-v9u-e7Kd.js";
3
3
  import { useCallback as n } from "react";
4
4
  //#region lib/i18n/use-material-translation.ts
5
5
  function r() {
package/docs/README.md CHANGED
@@ -34,6 +34,7 @@ detail: every option, the second example, and the traps.
34
34
  | [The field look (2.x)](guides/field-look-2-x.md) | Your fields or pickers look different after an upgrade (8px corners, the focus halo, a dashed read-only, a 44px `NativeSelect`, a list connected to its trigger, a `CountryField` with no chip, new group headers, the date and time fields' boxes) and you want to know what changed or get the earlier look back |
35
35
  | [Migrating to the Vite plugin](guides/migrate-to-vite-plugin.md) | Your app has its own CSP header, nonce, `zod-config`, Inter import or PDF bundling, and you move it to `nxgtMaterial()`: search → replace pairs, each with how to verify |
36
36
  | [Server lists in the URL](guides/server-lists-url.md) | A list's filter lives in the URL: parse it in a React Router loader with the codec in `@nxgt/material-core/filter`, feed the `Filter` bar's `query`, write it back on `onQueryChange` |
37
+ | [Two-step verification](guides/two-factor.md) | You ask for a one-time code (sign-in, "confirm it's you", turning an authenticator app on, recovery codes): which component for each moment, the page-wide lock, and what replaces an app's own step-up dialog, code input and enrolment card |
37
38
  | [Helpers](guides/helpers.md) | You need a utility, hook, slice factory or type from `/lib`, `/hooks`, `/i18n`, `/models`, `/types` or `/dnd` |
38
39
  | [Troubleshooting](troubleshooting.md) | Something failed and you have an error message or a symptom |
39
40
  | [Roadmap](roadmap.md) | You want to know what is planned, what shipped, and what will not be done |
@@ -35,7 +35,7 @@ Anything you press that is not a field: buttons, split buttons, floating action
35
35
 
36
36
  ## [Form fields](form-fields.md)
37
37
 
38
- Labelled inputs with a value, each with its form-library wrapper, and the composite values (attributes, contacts, address, opening hours), the titled sections a long form is laid out in, and the rows a user adds and removes. 26 entries.
38
+ Labelled inputs with a value, each with its form-library wrapper, and the composite values (attributes, contacts, address, opening hours), the titled sections a long form is laid out in, the rows a user adds and removes, and the one-time code form. 28 entries.
39
39
 
40
40
  [<img src="../previews/form-fields-textfield.webp" height="72" alt="TextField">](form-fields.md#textfield)
41
41
  [<img src="../previews/form-fields-phonefield.webp" height="72" alt="PhoneField">](form-fields.md#phonefield)
@@ -84,7 +84,8 @@ the confirming action is `filled` and the Cancel, Close or Discard beside it
84
84
  is `tonal`: two clear buttons, one weight apart, where a text or outlined
85
85
  Cancel read poorly and left its hit area invisible. The library draws its own
86
86
  Cancel buttons that way (`AlertDialogCancel`, `ConfirmDialog`,
87
- `ConfirmationDialog`, the field dialogs, `ImageCropper`, the filter sheet…),
87
+ `ConfirmationDialog`, `StepUpDialog`, `EnrolmentCard`, the field dialogs,
88
+ `ImageCropper`, the filter sheet…),
88
89
  and each takes `cancelVariant` (a `Button` `variant`, default `'tonal'`) to
89
90
  restore `'outlined'` or `'ghost'`. Write yours the same way. An icon-only ✕ in
90
91
  a corner, a toolbar button and a text link stay as they are; a destructive