@nxgt/material 3.93.0 → 3.95.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 (414) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/README.md +8 -3
  3. package/dist/{alert-dialog-D37eph4I.js → alert-dialog-D4r0Kn9h.js} +1 -1
  4. package/dist/{async-slice-BSqwhAj-.js → async-slice-Bx438UlG.js} +1 -1
  5. package/dist/{button-CG9SBAT-.js → button-Z_xcg10A.js} +1 -1
  6. package/dist/{calculator-YD3I3y-I.js → calculator-DGxClOmW.js} +10 -10
  7. package/dist/calculator-field.js +6 -6
  8. package/dist/{calculator-segment-Cjec9zi7.js → calculator-segment-DQE1EFdw.js} +1 -1
  9. package/dist/calculator.js +1 -1
  10. package/dist/charts.js +3 -3
  11. package/dist/{chip-BbUSBl3i.js → chip-Bb9SM3Ly.js} +2 -2
  12. package/dist/{code-editor-ZEM7AAcs.js → code-editor-Cw-dOrn2.js} +4 -4
  13. package/dist/code-editor.js +4 -4
  14. package/dist/{code-language-items-CAuHPrHd.js → code-language-items-BVfxGKiv.js} +2 -2
  15. package/dist/components/components.css +7 -1
  16. package/dist/components/theme-tokens.css +7 -0
  17. package/dist/components/ui/dates/duration-field/duration-field-expressive.css +2 -63
  18. package/dist/components/ui/dates/picker-trigger/typed-box-expressive.css +30 -21
  19. package/dist/components/ui/fields/number-field/number-field-score.css +151 -0
  20. package/dist/components/ui/fields/quantity-field/quantity-field.css +117 -0
  21. package/dist/components/ui/primitives/field-box/field-box-parts.css +1 -2
  22. package/dist/components/ui/primitives/field-box/field-box-tokens.css +54 -36
  23. package/dist/components/ui/primitives/field-box/field-box.css +44 -86
  24. package/dist/components/ui/primitives/field-box/field-stepper.css +129 -0
  25. package/dist/{components-CuFTrmGy.js → components-5n6qa3vr.js} +19380 -18872
  26. package/dist/components.js +37 -38
  27. package/dist/{conversion-variant-DmEtTCSP.js → conversion-variant-BjIJep32.js} +4 -4
  28. package/dist/currency-field-DzLtJtDI.js +303 -0
  29. package/dist/{dialog-Jhpx6ulb.js → dialog-CFuONiW5.js} +3 -3
  30. package/dist/dnd.js +1 -1
  31. package/dist/{dropdown-menu-nl0Q3tQ2.js → dropdown-menu-BvtBDoSD.js} +1 -1
  32. package/dist/editor.js +442 -442
  33. package/dist/{empty-state-mrJuqph3.js → empty-state-n2zb23YG.js} +1 -1
  34. package/dist/{financial-variant-P8gFA9aI.js → financial-variant-CniddOSL.js} +7 -7
  35. package/dist/{hooks-CjSpziWf.js → hooks-zyRsvilJ.js} +2 -2
  36. package/dist/hooks.js +2 -2
  37. package/dist/{hover-card-BNb1M8ij.js → hover-card-BJ15hu7B.js} +1 -1
  38. package/dist/i18n.js +3 -3
  39. package/dist/{icon-badge-CVMHwdFm.js → icon-badge-B2ns44Cz.js} +1 -1
  40. package/dist/{icon-button-Ch0PThsa.js → icon-button-BG438okX.js} +1 -1
  41. package/dist/lib/components/ui/display/entity-header/entity-metadata.d.ts +0 -7
  42. package/dist/lib/components/ui/display/entity-header/entity-stats.d.ts +2 -1
  43. package/dist/lib/components/ui/display/markdown/markdown.d.ts +2 -2
  44. package/dist/lib/components/ui/display/markdown/rehype-katex-classes.d.ts +21 -0
  45. package/dist/lib/components/ui/fields/contacts/placeholders.d.ts +1 -1
  46. package/dist/lib/components/ui/fields/index.d.ts +1 -0
  47. package/dist/lib/components/ui/fields/markdown-textarea-field/index.d.ts +2 -0
  48. package/dist/lib/components/ui/fields/markdown-textarea-field/markdown-preview.d.ts +6 -0
  49. package/dist/lib/components/ui/fields/markdown-textarea-field/markdown-syntax-help.d.ts +4 -0
  50. package/dist/lib/components/ui/fields/markdown-textarea-field/markdown-tabs.d.ts +13 -0
  51. package/dist/lib/components/ui/fields/markdown-textarea-field/markdown-textarea-field.d.ts +23 -0
  52. package/dist/lib/components/ui/fields/markdown-textarea-field/markdown-textarea-form-field.d.ts +3 -0
  53. package/dist/lib/components/ui/fields/markdown-textarea-field/use-text-value.d.ts +6 -0
  54. package/dist/lib/components/ui/fields/number-field/number-control.d.ts +10 -3
  55. package/dist/lib/components/ui/fields/number-field/number-field-base.d.ts +2 -0
  56. package/dist/lib/components/ui/fields/number-field/number-field.d.ts +7 -1
  57. package/dist/lib/components/ui/fields/number-field/number-field.types.d.ts +13 -0
  58. package/dist/lib/components/ui/fields/number-field/number-score-control.d.ts +19 -0
  59. package/dist/lib/components/ui/fields/number-field/number-stepper.d.ts +16 -2
  60. package/dist/lib/components/ui/fields/quantity-field/quantity-field.d.ts +4 -3
  61. package/dist/lib/components/ui/fields/quantity-field/quantity-row.d.ts +5 -9
  62. package/dist/lib/components/ui/fields/quantity-field/quantity-unit-menu.d.ts +19 -0
  63. package/dist/lib/components/ui/fields/quantity-field/quantity-unit.d.ts +11 -4
  64. package/dist/lib/components/ui/fields/quantity-field/use-unit-chip-name.d.ts +14 -0
  65. package/dist/lib/components/ui/fields/switch/partials/switch-row.d.ts +2 -2
  66. package/dist/lib/components/ui/fields/switch/switch.d.ts +2 -2
  67. package/dist/lib/components/ui/fields/text-field/text-field-units.d.ts +22 -0
  68. package/dist/lib/components/ui/fields/text-field/text-field.d.ts +9 -0
  69. package/dist/lib/components/ui/fields/verification-code/partials/code-surface.d.ts +13 -6
  70. package/dist/lib/components/ui/fields/verification-code/partials/recovery-input.d.ts +1 -1
  71. package/dist/lib/components/ui/layout/app-shell/app-sidebar-group.d.ts +12 -0
  72. package/dist/lib/components/ui/layout/app-shell/types.d.ts +7 -0
  73. package/dist/lib/components/ui/primitives/input-group/input-group.d.ts +1 -1
  74. package/dist/lib/components/ui/widgets/education/questions/index.d.ts +1 -1
  75. package/dist/lib/components/ui/widgets/education/questions/partials/question-hints.d.ts +9 -0
  76. package/dist/lib/components/ui/widgets/education/questions/partials/question-reveal.d.ts +13 -0
  77. package/dist/lib/components/ui/widgets/education/questions/partials/rich-text.d.ts +17 -0
  78. package/dist/lib/components/ui/widgets/education/questions/types.d.ts +40 -1
  79. package/dist/lib/i18n/resources/en/en.d.ts +29 -0
  80. package/dist/lib/i18n/resources/en/material.json.d.ts +31 -2
  81. package/dist/lib/i18n/resources/fr/fr.d.ts +29 -0
  82. package/dist/lib/i18n/resources/fr/material.json.d.ts +31 -2
  83. package/dist/lib/i18n/resources/resources.d.ts +58 -0
  84. package/dist/lib/i18n/translator.d.ts +1 -1
  85. package/dist/lib.js +1 -1
  86. package/dist/main.js +53 -54
  87. package/dist/map.js +8 -8
  88. package/dist/material.css +1 -1
  89. package/dist/pdf-reader.js +1 -1
  90. package/dist/percent-field-CeDpzUTS.js +137 -0
  91. package/dist/{picker-surface-CoNsDWxX.js → picker-surface-Cr2n42qv.js} +4 -4
  92. package/dist/{popover-BA1U82Wk.js → popover-XBAX2Shp.js} +1 -1
  93. package/dist/{pos-types-BQqv-kb6.js → pos-types-BFVWeJki.js} +1 -1
  94. package/dist/{pos-variant-D043n5y8.js → pos-variant-DWB8Bc12.js} +4 -4
  95. package/dist/print.js +1 -1
  96. package/dist/{programmer-variant-jneMqtLs.js → programmer-variant-B-wPnDeX.js} +2 -2
  97. package/dist/{public-DgrbdeZj.js → public-D1bH-KPQ.js} +9 -9
  98. package/dist/{rich-code-block-CGNjHawR.js → rich-code-block-DP2RT7pV.js} +5 -5
  99. package/dist/{scientific-variant-1L7brNNT.js → scientific-variant-BP08Mo0g.js} +2 -2
  100. package/dist/{sortable-provider-DZLV_svg.js → sortable-provider-CHGZrS0f.js} +2 -2
  101. package/dist/{spinner-CQqRWxAW.js → spinner-rk8J5y9O.js} +1 -1
  102. package/dist/styles.css +2 -0
  103. package/dist/{tabs-DQTx3C8e.js → tabs-nuYLggwC.js} +1 -1
  104. package/dist/text-field-DxKSPY0T.js +154 -0
  105. package/dist/theme-picker.js +2 -2
  106. package/dist/{theme-toggle-3NQ3VmJH.js → theme-toggle-5waw9Wk8.js} +1 -1
  107. package/dist/{toolbar-items-BYCdJGUf.js → toolbar-items-Bo-nMzKJ.js} +4 -4
  108. package/dist/{translate-material-jxfcGlD5.js → translate-material-H5GMStyF.js} +1 -1
  109. package/dist/{translator-6XuDmqUJ.js → translator-gdpQeToI.js} +62 -4
  110. package/dist/{use-chat-composer-1eb4I1kM.js → use-chat-composer-yTODkjut.js} +24 -25
  111. package/dist/{use-heading-spy-CzPujlKr.js → use-heading-spy-n_wPa5jC.js} +4 -4
  112. package/dist/{use-material-translation-BUPqNmAg.js → use-material-translation-BW5HZMwt.js} +1 -1
  113. package/dist/{use-return-focus-B_enQxp5.js → use-return-focus-BC4sGh1b.js} +1 -1
  114. package/docs/README.md +1 -0
  115. package/docs/components/data-display.md +7 -6
  116. package/docs/components/date-and-time.md +25 -23
  117. package/docs/components/form-fields.md +119 -26
  118. package/docs/components/navigation-and-layout.md +1 -1
  119. package/docs/components/rich-widgets.md +29 -0
  120. package/docs/guides/app-shell.md +15 -0
  121. package/docs/guides/csp.md +20 -8
  122. package/docs/guides/field-look-2-x.md +10 -4
  123. package/docs/guides/field-look-refined.md +130 -0
  124. package/docs/guides/forms.md +1 -0
  125. package/docs/guides/i18n.md +1 -1
  126. package/docs/guides/layouts.md +2 -1
  127. package/docs/guides/theming.md +39 -31
  128. package/docs/previews/backgrounds-icons-quiet-band.webp +0 -0
  129. package/docs/previews/backgrounds-icons.webp +0 -0
  130. package/docs/previews/backgrounds-matrix.webp +0 -0
  131. package/docs/previews/buttons-actions-actioncard.webp +0 -0
  132. package/docs/previews/buttons-actions-backlink.webp +0 -0
  133. package/docs/previews/buttons-actions-button.webp +0 -0
  134. package/docs/previews/buttons-actions-buttongroup.webp +0 -0
  135. package/docs/previews/buttons-actions-fab.webp +0 -0
  136. package/docs/previews/buttons-actions-fabmenu.webp +0 -0
  137. package/docs/previews/buttons-actions-iconbutton.webp +0 -0
  138. package/docs/previews/buttons-actions-languageswitcher.webp +0 -0
  139. package/docs/previews/buttons-actions-linkbutton.webp +0 -0
  140. package/docs/previews/buttons-actions-loadmorebutton.webp +0 -0
  141. package/docs/previews/buttons-actions-loadmorefooter.webp +0 -0
  142. package/docs/previews/buttons-actions-responsivebutton.webp +0 -0
  143. package/docs/previews/buttons-actions-scrolltolatestbutton.webp +0 -0
  144. package/docs/previews/buttons-actions-scrolltotop.webp +0 -0
  145. package/docs/previews/buttons-actions-splitbutton.webp +0 -0
  146. package/docs/previews/buttons-actions-themetoggle.webp +0 -0
  147. package/docs/previews/buttons-actions-toolbar-density-and-keyboard.webp +0 -0
  148. package/docs/previews/buttons-actions-toolbar.webp +0 -0
  149. package/docs/previews/data-display-accordioncard.webp +0 -0
  150. package/docs/previews/data-display-apiendpoint.webp +0 -0
  151. package/docs/previews/data-display-apioperation.webp +0 -0
  152. package/docs/previews/data-display-avatar.webp +0 -0
  153. package/docs/previews/data-display-badge.webp +0 -0
  154. package/docs/previews/data-display-card-presets.webp +0 -0
  155. package/docs/previews/data-display-changehistory.webp +0 -0
  156. package/docs/previews/data-display-chip.webp +0 -0
  157. package/docs/previews/data-display-codegroup.webp +0 -0
  158. package/docs/previews/data-display-description.webp +0 -0
  159. package/docs/previews/data-display-enrolmentcard.webp +0 -0
  160. package/docs/previews/data-display-enrolmentsecret.webp +0 -0
  161. package/docs/previews/data-display-entityheader.webp +0 -0
  162. package/docs/previews/data-display-metric-cards.webp +0 -0
  163. package/docs/previews/data-display-periodcards.webp +0 -0
  164. package/docs/previews/data-display-recoverycodes.webp +0 -0
  165. package/docs/previews/data-display-recoverycodesstatus.webp +0 -0
  166. package/docs/previews/data-display-secretcard.webp +0 -0
  167. package/docs/previews/data-display-terminal.webp +0 -0
  168. package/docs/previews/data-display-timeline.webp +0 -0
  169. package/docs/previews/data-display-tonevalue.webp +0 -0
  170. package/docs/previews/data-display-votetally.webp +0 -0
  171. package/docs/previews/data-table-filter-lists-datagrid.webp +0 -0
  172. package/docs/previews/data-table-filter-lists-datatable.webp +0 -0
  173. package/docs/previews/data-table-filter-lists-daygroupedlist.webp +0 -0
  174. package/docs/previews/data-table-filter-lists-drag-and-drop.webp +0 -0
  175. package/docs/previews/data-table-filter-lists-facetgroup.webp +0 -0
  176. package/docs/previews/data-table-filter-lists-filter.webp +0 -0
  177. package/docs/previews/data-table-filter-lists-listempty.webp +0 -0
  178. package/docs/previews/data-table-filter-lists-listpane.webp +0 -0
  179. package/docs/previews/data-table-filter-lists-markinglist.webp +0 -0
  180. package/docs/previews/data-table-filter-lists-pagination.webp +0 -0
  181. package/docs/previews/data-table-filter-lists-servertable.webp +0 -0
  182. package/docs/previews/data-table-filter-lists-tree.webp +0 -0
  183. package/docs/previews/date-time-agefield.webp +0 -0
  184. package/docs/previews/date-time-calendar-expressive.webp +0 -0
  185. package/docs/previews/date-time-calendar.webp +0 -0
  186. package/docs/previews/date-time-datefield.webp +0 -0
  187. package/docs/previews/date-time-daterangefield.webp +0 -0
  188. package/docs/previews/date-time-durationfield.webp +0 -0
  189. package/docs/previews/date-time-fields-expressive.webp +0 -0
  190. package/docs/previews/date-time-halfdayrangefield.webp +0 -0
  191. package/docs/previews/date-time-nowindicator.webp +0 -0
  192. package/docs/previews/date-time-timefield.webp +0 -0
  193. package/docs/previews/date-time-timepicker-tiles.webp +0 -0
  194. package/docs/previews/date-time-timepicker.webp +0 -0
  195. package/docs/previews/feedback-status-alert.webp +0 -0
  196. package/docs/previews/feedback-status-alertdialog.webp +0 -0
  197. package/docs/previews/feedback-status-celebration.webp +0 -0
  198. package/docs/previews/feedback-status-circularprogress.webp +0 -0
  199. package/docs/previews/feedback-status-confirmationdialog.webp +0 -0
  200. package/docs/previews/feedback-status-confirmdialog.webp +0 -0
  201. package/docs/previews/feedback-status-countdowntimer.webp +0 -0
  202. package/docs/previews/feedback-status-customalertdialog.webp +0 -0
  203. package/docs/previews/feedback-status-customdialog.webp +0 -0
  204. package/docs/previews/feedback-status-emptystate.webp +0 -0
  205. package/docs/previews/feedback-status-errorstate.webp +0 -0
  206. package/docs/previews/feedback-status-hydrateloading.webp +0 -0
  207. package/docs/previews/feedback-status-illustration-education.webp +0 -0
  208. package/docs/previews/feedback-status-illustration-game.webp +0 -0
  209. package/docs/previews/feedback-status-illustration-health.webp +0 -0
  210. package/docs/previews/feedback-status-illustration.webp +0 -0
  211. package/docs/previews/feedback-status-notificationrow.webp +0 -0
  212. package/docs/previews/feedback-status-notifications.webp +0 -0
  213. package/docs/previews/feedback-status-pageloadfailed.webp +0 -0
  214. package/docs/previews/feedback-status-progress.webp +0 -0
  215. package/docs/previews/feedback-status-skeleton.webp +0 -0
  216. package/docs/previews/feedback-status-spinner.webp +0 -0
  217. package/docs/previews/feedback-status-stalenotice.webp +0 -0
  218. package/docs/previews/feedback-status-stepupdialog-retry.webp +0 -0
  219. package/docs/previews/feedback-status-stepupdialog.webp +0 -0
  220. package/docs/previews/feedback-status-toast.webp +0 -0
  221. package/docs/previews/feedback-status-typingindicator.webp +0 -0
  222. package/docs/previews/feedback-status-unsaveddialog.webp +0 -0
  223. package/docs/previews/form-fields-attributes.webp +0 -0
  224. package/docs/previews/form-fields-choicelistfield.webp +0 -0
  225. package/docs/previews/form-fields-colorfield.webp +0 -0
  226. package/docs/previews/form-fields-contacts.webp +0 -0
  227. package/docs/previews/form-fields-countryfield.webp +0 -0
  228. package/docs/previews/form-fields-currencyfield.webp +0 -0
  229. package/docs/previews/form-fields-emailfield.webp +0 -0
  230. package/docs/previews/form-fields-field.webp +0 -0
  231. package/docs/previews/form-fields-formsection.webp +0 -0
  232. package/docs/previews/form-fields-inlineedit.webp +0 -0
  233. package/docs/previews/form-fields-inputgroupfield.webp +0 -0
  234. package/docs/previews/form-fields-localizedtextfields.webp +0 -0
  235. package/docs/previews/form-fields-markdowntextareafield.webp +0 -0
  236. package/docs/previews/form-fields-numberfield.webp +0 -0
  237. package/docs/previews/form-fields-openinghours.webp +0 -0
  238. package/docs/previews/form-fields-otpfield.webp +0 -0
  239. package/docs/previews/form-fields-passwordfield.webp +0 -0
  240. package/docs/previews/form-fields-percentfield.webp +0 -0
  241. package/docs/previews/form-fields-phonefield.webp +0 -0
  242. package/docs/previews/form-fields-postaladdress.webp +0 -0
  243. package/docs/previews/form-fields-repeatablegroup.webp +0 -0
  244. package/docs/previews/form-fields-searchfield.webp +0 -0
  245. package/docs/previews/form-fields-slider.webp +0 -0
  246. package/docs/previews/form-fields-switch.webp +0 -0
  247. package/docs/previews/form-fields-textareafield.webp +0 -0
  248. package/docs/previews/form-fields-textfield.webp +0 -0
  249. package/docs/previews/form-fields-timezonefield.webp +0 -0
  250. package/docs/previews/form-fields-urlfield.webp +0 -0
  251. package/docs/previews/form-fields-verificationcode.webp +0 -0
  252. package/docs/previews/foundations-themes-gallery.webp +0 -0
  253. package/docs/previews/foundations-themes-icon-motifs.webp +0 -0
  254. package/docs/previews/foundations-themes-nesting.webp +0 -0
  255. package/docs/previews/foundations-themes-provider.webp +0 -0
  256. package/docs/previews/foundations-themes-themepicker.webp +0 -0
  257. package/docs/previews/guides-i18n-i18nprovider.webp +0 -0
  258. package/docs/previews/guides-i18n-translated-components.webp +0 -0
  259. package/docs/previews/media-files-audioplayer.webp +0 -0
  260. package/docs/previews/media-files-camera.webp +0 -0
  261. package/docs/previews/media-files-carousel.webp +0 -0
  262. package/docs/previews/media-files-filelist.webp +0 -0
  263. package/docs/previews/media-files-filelistfield.webp +0 -0
  264. package/docs/previews/media-files-filepreview.webp +0 -0
  265. package/docs/previews/media-files-gallery-image-lists.webp +0 -0
  266. package/docs/previews/media-files-gallery-video.webp +0 -0
  267. package/docs/previews/media-files-gallery-viewer.webp +0 -0
  268. package/docs/previews/media-files-gallery.webp +0 -0
  269. package/docs/previews/media-files-imagecropper.webp +0 -0
  270. package/docs/previews/media-files-imageeditor.webp +0 -0
  271. package/docs/previews/media-files-imagefield.webp +0 -0
  272. package/docs/previews/media-files-lightboxgallery.webp +0 -0
  273. package/docs/previews/media-files-map.webp +0 -0
  274. package/docs/previews/media-files-mediaplayer.webp +0 -0
  275. package/docs/previews/media-files-mediaplayerhost.webp +0 -0
  276. package/docs/previews/media-files-mediaplayerlightbox.webp +0 -0
  277. package/docs/previews/media-files-mediaplayermini.webp +0 -0
  278. package/docs/previews/media-files-minigallery.webp +0 -0
  279. package/docs/previews/media-files-pdfreader.webp +0 -0
  280. package/docs/previews/media-files-uploadfield.webp +0 -0
  281. package/docs/previews/navigation-layout-appshell-blue-moon.webp +0 -0
  282. package/docs/previews/navigation-layout-appshell-footer-icon.webp +0 -0
  283. package/docs/previews/navigation-layout-appshell-menu-badge.webp +0 -0
  284. package/docs/previews/navigation-layout-appshell-page-ground.webp +0 -0
  285. package/docs/previews/navigation-layout-appshell-themes.webp +0 -0
  286. package/docs/previews/navigation-layout-appshell.webp +0 -0
  287. package/docs/previews/navigation-layout-authcard-split.webp +0 -0
  288. package/docs/previews/navigation-layout-authcard.webp +0 -0
  289. package/docs/previews/navigation-layout-background.webp +0 -0
  290. package/docs/previews/navigation-layout-breadcrumb.webp +0 -0
  291. package/docs/previews/navigation-layout-doc-api.webp +0 -0
  292. package/docs/previews/navigation-layout-doc-blocks.webp +0 -0
  293. package/docs/previews/navigation-layout-doc.webp +0 -0
  294. package/docs/previews/navigation-layout-editorlayout.webp +0 -0
  295. package/docs/previews/navigation-layout-hero.webp +0 -0
  296. package/docs/previews/navigation-layout-landinglayout.webp +0 -0
  297. package/docs/previews/navigation-layout-listdetailslayout.webp +0 -0
  298. package/docs/previews/navigation-layout-pager.webp +0 -0
  299. package/docs/previews/navigation-layout-recordpage.webp +0 -0
  300. package/docs/previews/navigation-layout-settingslayout.webp +0 -0
  301. package/docs/previews/navigation-layout-sidebar.webp +0 -0
  302. package/docs/previews/navigation-layout-steps.webp +0 -0
  303. package/docs/previews/navigation-layout-stickyactionbar.webp +0 -0
  304. package/docs/previews/navigation-layout-threadlayout-pages.webp +0 -0
  305. package/docs/previews/navigation-layout-toc.webp +0 -0
  306. package/docs/previews/overlays-menus-contextmenu.webp +0 -0
  307. package/docs/previews/overlays-menus-dialog.webp +0 -0
  308. package/docs/previews/overlays-menus-drawer.webp +0 -0
  309. package/docs/previews/overlays-menus-dropdownmenu.webp +0 -0
  310. package/docs/previews/overlays-menus-hovercard.webp +0 -0
  311. package/docs/previews/overlays-menus-popover.webp +0 -0
  312. package/docs/previews/overlays-menus-sheet.webp +0 -0
  313. package/docs/previews/overlays-menus-tooltip.webp +0 -0
  314. package/docs/previews/primitives-accordion.webp +0 -0
  315. package/docs/previews/primitives-card.webp +0 -0
  316. package/docs/previews/primitives-collapsible.webp +0 -0
  317. package/docs/previews/primitives-extendedlabel.webp +0 -0
  318. package/docs/previews/primitives-helpertext.webp +0 -0
  319. package/docs/previews/primitives-input.webp +0 -0
  320. package/docs/previews/primitives-inputgroup.webp +0 -0
  321. package/docs/previews/primitives-label.webp +0 -0
  322. package/docs/previews/primitives-scrollarea.webp +0 -0
  323. package/docs/previews/primitives-segmentednav.webp +0 -0
  324. package/docs/previews/primitives-tabs.webp +0 -0
  325. package/docs/previews/primitives-tabsnav.webp +0 -0
  326. package/docs/previews/primitives-textarea.webp +0 -0
  327. package/docs/previews/primitives-toggle.webp +0 -0
  328. package/docs/previews/primitives-togglegroup.webp +0 -0
  329. package/docs/previews/primitives-typography.webp +0 -0
  330. package/docs/previews/rich-widgets-calculator-conversion.webp +0 -0
  331. package/docs/previews/rich-widgets-chat-action-proposal.webp +0 -0
  332. package/docs/previews/rich-widgets-chat-advanced.webp +0 -0
  333. package/docs/previews/rich-widgets-chat-composer.webp +0 -0
  334. package/docs/previews/rich-widgets-chat-inbox.webp +0 -0
  335. package/docs/previews/rich-widgets-chat-overview.webp +0 -0
  336. package/docs/previews/rich-widgets-chat-thread.webp +0 -0
  337. package/docs/previews/rich-widgets-chat-widget.webp +0 -0
  338. package/docs/previews/rich-widgets-codeeditor.webp +0 -0
  339. package/docs/previews/rich-widgets-compacteditor.webp +0 -0
  340. package/docs/previews/rich-widgets-documenteditor.webp +0 -0
  341. package/docs/previews/rich-widgets-drawing.webp +0 -0
  342. package/docs/previews/rich-widgets-emojipicker.webp +0 -0
  343. package/docs/previews/rich-widgets-eventcalendar.webp +0 -0
  344. package/docs/previews/rich-widgets-kanban-phone-layout.webp +0 -0
  345. package/docs/previews/rich-widgets-kanban.webp +0 -0
  346. package/docs/previews/rich-widgets-mentionlist.webp +0 -0
  347. package/docs/previews/rich-widgets-native-charts-areachart.webp +0 -0
  348. package/docs/previews/rich-widgets-native-charts-barchart.webp +0 -0
  349. package/docs/previews/rich-widgets-native-charts-combochart.webp +0 -0
  350. package/docs/previews/rich-widgets-native-charts-donutchart.webp +0 -0
  351. package/docs/previews/rich-widgets-native-charts-funnelchart.webp +0 -0
  352. package/docs/previews/rich-widgets-native-charts-heatmapchart.webp +0 -0
  353. package/docs/previews/rich-widgets-native-charts-linechart-reference.webp +0 -0
  354. package/docs/previews/rich-widgets-native-charts-linechart.webp +0 -0
  355. package/docs/previews/rich-widgets-native-charts-palette.webp +0 -0
  356. package/docs/previews/rich-widgets-native-charts-piechart.webp +0 -0
  357. package/docs/previews/rich-widgets-native-charts-radarchart.webp +0 -0
  358. package/docs/previews/rich-widgets-native-charts-radialbarchart.webp +0 -0
  359. package/docs/previews/rich-widgets-native-charts-scatterchart.webp +0 -0
  360. package/docs/previews/rich-widgets-questioncard-rich-content.webp +0 -0
  361. package/docs/previews/rich-widgets-questionmediaview.webp +0 -0
  362. package/docs/previews/rich-widgets-questionnavigator.webp +0 -0
  363. package/docs/previews/rich-widgets-quiz.webp +0 -0
  364. package/docs/previews/rich-widgets-richchatcomposer.webp +0 -0
  365. package/docs/previews/rich-widgets-richtexteditor.webp +0 -0
  366. package/docs/previews/rich-widgets-richtextviewer.webp +0 -0
  367. package/docs/previews/selection-choice-autocomplete.webp +0 -0
  368. package/docs/previews/selection-choice-checkbox.webp +0 -0
  369. package/docs/previews/selection-choice-checkboxgroup.webp +0 -0
  370. package/docs/previews/selection-choice-checkcardfield.webp +0 -0
  371. package/docs/previews/selection-choice-chipgroupfield.webp +0 -0
  372. package/docs/previews/selection-choice-choicecardgroup.webp +0 -0
  373. package/docs/previews/selection-choice-combobox.webp +0 -0
  374. package/docs/previews/selection-choice-comboboxfield.webp +0 -0
  375. package/docs/previews/selection-choice-optiontile.webp +0 -0
  376. package/docs/previews/selection-choice-radiogroup.webp +0 -0
  377. package/docs/previews/selection-choice-select.webp +0 -0
  378. package/docs/previews/selection-choice-selectfield.webp +0 -0
  379. package/docs/previews/selection-choice-sortablelist.webp +0 -0
  380. package/docs/previews/selection-choice-switcher.webp +0 -0
  381. package/docs/previews/selection-choice-transferlist.webp +0 -0
  382. package/docs/previews/selection-choice-treeselectfield.webp +0 -0
  383. package/docs/roadmap.md +13 -10
  384. package/docs/troubleshooting.md +66 -6
  385. package/lib/components/components.css +7 -1
  386. package/lib/components/theme-tokens.css +7 -0
  387. package/lib/components/ui/dates/duration-field/duration-field-expressive.css +2 -63
  388. package/lib/components/ui/dates/picker-trigger/typed-box-expressive.css +30 -21
  389. package/lib/components/ui/fields/number-field/number-field-score.css +151 -0
  390. package/lib/components/ui/fields/quantity-field/quantity-field.css +117 -0
  391. package/lib/components/ui/primitives/field-box/field-box-parts.css +1 -2
  392. package/lib/components/ui/primitives/field-box/field-box-tokens.css +54 -36
  393. package/lib/components/ui/primitives/field-box/field-box.css +44 -86
  394. package/lib/components/ui/primitives/field-box/field-stepper.css +129 -0
  395. package/lib/styles.css +2 -0
  396. package/lib/themes/ambre.css +5 -1
  397. package/lib/themes/ardoise.css +5 -1
  398. package/lib/themes/bleumono.css +5 -1
  399. package/lib/themes/bluemoon.css +5 -1
  400. package/lib/themes/corail.css +5 -1
  401. package/lib/themes/foret.css +5 -1
  402. package/lib/themes/lavande.css +5 -1
  403. package/lib/themes/menthe.css +5 -1
  404. package/lib/themes/ocean.css +5 -1
  405. package/lib/themes/pink.css +5 -1
  406. package/lib/themes/prune.css +5 -1
  407. package/lib/themes/sable.css +5 -1
  408. package/lib/themes/slate.css +5 -1
  409. package/lib/themes/teal.css +5 -1
  410. package/package.json +2 -2
  411. package/dist/currency-field-CabGnVO9.js +0 -289
  412. package/dist/input-group-CPMSQcBx.js +0 -70
  413. package/dist/percent-field-TWyupyr_.js +0 -14
  414. package/dist/text-field-BAdY-kpO.js +0 -59
@@ -4,28 +4,28 @@ import { t as n } from "./utils-BLfntITJ.js";
4
4
  import { n as r } from "./use-shape-morph-BKA_R5P5.js";
5
5
  import { n as i, o as a, t as o } from "./dist-DVRQkaTK.js";
6
6
  import { i as s, n as c, r as l, t as u } from "./dist-DWZXlCZR.js";
7
- import { _ as d, a as f, b as p, g as m, h, i as g, m as _, n as v, o as y, r as b, s as x, t as S, v as C, y as w } from "./spinner-CQqRWxAW.js";
7
+ import { _ as d, a as f, b as p, g as m, h, i as g, m as _, n as v, o as y, r as b, s as x, t as S, v as C, y as w } from "./spinner-rk8J5y9O.js";
8
8
  import { a as T, i as E, n as D, r as O, t as k } from "./dist-DHdUUM1w.js";
9
9
  import { a as A, i as ee } from "./dist-DOK3zo5C.js";
10
10
  import { i as j, n as M } from "./in-dialog-D61Yeaol.js";
11
- import { c as N, l as P, n as te, r as F, t as ne } from "./alert-dialog-D37eph4I.js";
11
+ import { c as N, l as P, n as te, r as F, t as ne } from "./alert-dialog-D4r0Kn9h.js";
12
12
  import { A as re, C as ie, D as ae, E as oe, O as se, S as I, T as ce, _ as le, a as ue, b as de, d as fe, f as pe, g as me, h as he, i as ge, k as _e, l as ve, m as ye, n as be, o as xe, p as Se, r as Ce, s as we, t as Te, u as Ee, v as De, w as Oe, x as ke, y as Ae } from "./floating-ui.dom-KkZSW8_E.js";
13
- import { D as je, E as Me, N as Ne, O as Pe, c as Fe, d as Ie, f as Le, i as Re, k as ze, m as Be, n as Ve, o as He, p as Ue, t as We, u as Ge } from "./dropdown-menu-nl0Q3tQ2.js";
13
+ import { D as je, E as Me, N as Ne, O as Pe, c as Fe, d as Ie, f as Le, i as Re, k as ze, m as Be, n as Ve, o as He, p as Ue, t as We, u as Ge } from "./dropdown-menu-BvtBDoSD.js";
14
14
  import { a as Ke, i as qe, n as Je } from "./field-blur-context-BLGgf_3z.js";
15
- import { i as Ye, n as Xe, r as Ze, t as Qe } from "./popover-BA1U82Wk.js";
15
+ import { i as Ye, n as Xe, r as Ze, t as Qe } from "./popover-XBAX2Shp.js";
16
16
  import { a as $e, i as et, n as tt, o as nt, t as rt } from "./bubble-input-CQwVSoU3.js";
17
- import { d as it, n as at, r as ot, t as st } from "./tabs-DQTx3C8e.js";
18
- import { a as ct, n as lt, o as ut, s as dt, v as ft, y as pt } from "./toolbar-items-BYCdJGUf.js";
17
+ import { d as it, n as at, r as ot, t as st } from "./tabs-nuYLggwC.js";
18
+ import { a as ct, n as lt, o as ut, s as dt, v as ft, y as pt } from "./toolbar-items-Bo-nMzKJ.js";
19
19
  import { t as mt } from "./dist-DkQbkF9T.js";
20
20
  import { o as ht, s as gt, t as _t } from "./use-click-lock-Bwg_caHO.js";
21
21
  import { a as vt, r as yt } from "./icon-sprites-CaYXzOL4.js";
22
22
  import { t as bt } from "./warn-once-C_e47JM8.js";
23
- import { r as xt, t as St } from "./button-CG9SBAT-.js";
24
- import { a as Ct } from "./translator-6XuDmqUJ.js";
23
+ import { r as xt, t as St } from "./button-Z_xcg10A.js";
24
+ import { a as Ct } from "./translator-gdpQeToI.js";
25
25
  import { h as wt } from "./get-CTzJAwfc.js";
26
26
  import { t as Tt } from "./isEmpty-F_g3jLf8.js";
27
- import { t as L } from "./use-material-translation-BUPqNmAg.js";
28
- import { t as R } from "./icon-button-Ch0PThsa.js";
27
+ import { t as L } from "./use-material-translation-BW5HZMwt.js";
28
+ import { t as R } from "./icon-button-BG438okX.js";
29
29
  import { t as Et } from "./use-ssr-media-query-C6M5m8sf.js";
30
30
  import { n as Dt, t as Ot } from "./typography-CYEquVeb.js";
31
31
  import { n as kt, t as At } from "./util-4heV2LPI.js";
@@ -36,15 +36,14 @@ import { a as Bt } from "./toggle-group-CVMxEpWi.js";
36
36
  import { n as Vt } from "./use-slice-reducer-BGkeGtML.js";
37
37
  import { t as Ht } from "./browser-only-DQ94lWF8.js";
38
38
  import { t as Ut } from "./compose-refs-G4J4kaUA.js";
39
- import { n as Wt, r as Gt, t as Kt } from "./chip-BbUSBl3i.js";
39
+ import { n as Wt, r as Gt, t as Kt } from "./chip-Bb9SM3Ly.js";
40
40
  import { c as qt, o as Jt, r as Yt, s as Xt, t as Zt } from "./input-CC2joTjB.js";
41
- import { i as Qt, n as $t, t as en } from "./input-group-CPMSQcBx.js";
42
- import { t as tn } from "./text-field-BAdY-kpO.js";
41
+ import { a as Qt, n as $t, r as en, t as tn } from "./text-field-DxKSPY0T.js";
43
42
  import { r as nn } from "./use-csp-nonce-ZKs9k-ov.js";
44
- import { t as rn } from "./empty-state-mrJuqph3.js";
43
+ import { t as rn } from "./empty-state-n2zb23YG.js";
45
44
  import { t as an } from "./skeleton-DSdtr2qc.js";
46
- import { l as on, n as sn, o as cn, r as ln, s as un, t as dn, u as fn } from "./dialog-Jhpx6ulb.js";
47
- import { t as pn } from "./icon-badge-CVMHwdFm.js";
45
+ import { l as on, n as sn, o as cn, r as ln, s as un, t as dn, u as fn } from "./dialog-CFuONiW5.js";
46
+ import { t as pn } from "./icon-badge-B2ns44Cz.js";
48
47
  import { H as mn, V as hn, X as gn, bt as _n, it as vn, lt as yn, n as bn, t as xn, xt as Sn, yt as Cn } from "./dist-moutbfbd.js";
49
48
  import { t as wn } from "./markdown-Dw_uH7j7.js";
50
49
  import { r as Tn, t as En } from "./create-store-Dqp-PLLn.js";
@@ -7094,7 +7093,7 @@ function j_({ className: e, children: t, ...r }) {
7094
7093
  }
7095
7094
  function M_({ className: e, children: t, disabled: r = !1, showTrigger: i = !0, showClear: a = !1, size: o = "default", leading: s, suffix: c, labelId: l, anchorRef: u, ...d }) {
7096
7095
  let f = z.useContext(f_), p = __();
7097
- return /* @__PURE__ */ K(en, {
7096
+ return /* @__PURE__ */ K($t, {
7098
7097
  ref: Ut(u, f ?? void 0),
7099
7098
  ...qt({
7100
7099
  size: o,
@@ -7102,7 +7101,7 @@ function M_({ className: e, children: t, disabled: r = !1, showTrigger: i = !0,
7102
7101
  }),
7103
7102
  className: n("w-full", o === "sm" && "h-9 pointer-coarse:h-11", o === "lg" && "h-13 md:*:data-[slot=input-group-control]:text-base", e),
7104
7103
  children: [
7105
- s ? /* @__PURE__ */ G($t, {
7104
+ s ? /* @__PURE__ */ G(en, {
7106
7105
  align: "inline-start",
7107
7106
  className: "ps-2.5",
7108
7107
  children: /* @__PURE__ */ G("span", {
@@ -7116,12 +7115,12 @@ function M_({ className: e, children: t, disabled: r = !1, showTrigger: i = !0,
7116
7115
  className: n("h-full", !s && "ps-3"),
7117
7116
  ...d
7118
7117
  }),
7119
- c ? /* @__PURE__ */ G($t, {
7118
+ c ? /* @__PURE__ */ G(en, {
7120
7119
  align: "inline-end",
7121
7120
  className: "pe-1",
7122
7121
  children: c
7123
7122
  }) : null,
7124
- i || a ? /* @__PURE__ */ G($t, {
7123
+ i || a ? /* @__PURE__ */ G(en, {
7125
7124
  align: "inline-end",
7126
7125
  className: "gap-0.5 pe-1.5 has-[>button]:pe-1.5",
7127
7126
  children: /* @__PURE__ */ G(m_, {
@@ -11180,7 +11179,7 @@ var eS = (e = {}) => Tn({
11180
11179
  let [{ default: t }, { lowlight: n }, { richCodeBlock: r }] = await Promise.all([
11181
11180
  import("./dist-CRMFGjng.js"),
11182
11181
  import("./lowlight-OtcjU2Sa.js"),
11183
- import("./rich-code-block-CGNjHawR.js")
11182
+ import("./rich-code-block-DP2RT7pV.js")
11184
11183
  ]);
11185
11184
  return [r(t, {
11186
11185
  lowlight: n,
@@ -12417,7 +12416,7 @@ var gC = () => Tn({
12417
12416
  //#region lib/components/ui/fields/search-field/search-field-end.tsx
12418
12417
  function xC({ shortcut: e, loading: t, filled: n, disabled: r, onClear: i }) {
12419
12418
  let { t: a } = L(), o = e && !n && !t && !r, s = n && !t && !r;
12420
- return !o && !s && !t ? null : /* @__PURE__ */ K($t, {
12419
+ return !o && !s && !t ? null : /* @__PURE__ */ K(en, {
12421
12420
  align: "inline-end",
12422
12421
  className: "pe-2.5 has-[>button]:pe-2.5 has-[>kbd]:pe-[0.275rem]",
12423
12422
  children: [
@@ -12453,10 +12452,10 @@ function xC({ shortcut: e, loading: t, filled: n, disabled: r, onClear: i }) {
12453
12452
  //#region lib/components/ui/fields/search-field/search-box.tsx
12454
12453
  function SC({ search: e, error: t, loading: n, shortcut: r, placeholder: i, disabled: a, ...o }) {
12455
12454
  let { t: s } = L();
12456
- return /* @__PURE__ */ K(en, {
12455
+ return /* @__PURE__ */ K($t, {
12457
12456
  "data-disabled": a || void 0,
12458
12457
  children: [
12459
- /* @__PURE__ */ G($t, {
12458
+ /* @__PURE__ */ G(en, {
12460
12459
  align: "inline-start",
12461
12460
  className: "ps-2.5",
12462
12461
  children: /* @__PURE__ */ G("span", {
@@ -23886,4 +23885,4 @@ function PL({ value: e, onSend: t, placeholder: n, disabled: r, isLoading: i, se
23886
23885
  };
23887
23886
  }
23888
23887
  //#endregion
23889
- export { rP as $, gv as $n, vg as $r, PT as $t, zF as A, Hl as Ai, mb as An, b_ as Ar, dk as At, dF as B, zs as Bi, Vy as Bn, n_ as Br, xD as Bt, GI as C, q as Ci, $b as Cn, j_ as Cr, Zk as Ct, rI as D, ql as Di, gb as Dn, C_ as Dr, Ok as Dt, oI as E, Yl as Ei, xb as En, k_ as Er, Mk as Et, bF as F, xl as Fi, Wy as Fn, d_ as Fr, AD as Ft, jP as G, Qv as Gn, Jg as Gr, jE as Gt, oF as H, gs as Hi, Ay as Hn, e_ as Hr, RE as Ht, _F as I, bl as Ii, qy as In, l_ as Ir, ED as It, EP as J, Tv as Jn, Vg as Jr, fE as Jt, AP as K, Yv as Kn, Gg as Kr, mE as Kt, hF as L, Hs as Li, Gy as Ln, c_ as Lr, DD as Lt, SF as M, Pl as Mi, Zy as Mn, v_ as Mr, zO as Mt, CF as N, Nl as Ni, Yy as Nn, g_ as Nr, kD as Nt, JF as O, Wl as Oi, pb as On, T_ as Or, Tk as Ot, yF as P, Sl as Pi, Jy as Pn, u_ as Pr, jD as Pt, uP as Q, bv as Qn, yg as Qr, FT as Qt, fF as R, Is as Ri, Ky as Rn, a_ as Rr, OD as Rt, qI as S, J as Si, nx as Sn, M_ as Sr, Qk as St, uI as T, Zl as Ti, Pb as Tn, E_ as Tr, Ik as Tt, cF as U, _s as Ui, ty as Un, $g as Ur, FE as Ut, lF as V, Cs as Vi, My as Vn, t_ as Vr, yD as Vt, sF as W, oy as Wn, Qg as Wr, PE as Wt, xP as X, kv as Xn, Tg as Xr, $ as Xt, SP as Y, Cv as Yn, zg as Yr, dE as Yt, vP as Z, Sv as Zn, Sg as Zr, IT as Zt, gL as _, Vf as _i, Kx as _n, P_ as _r, uA as _t, AL as a, ng as ai, LC as an, fv as ar, kj as at, sL as b, ld as bi, px as bn, N_ as br, iA as bt, DL as c, Bh as ci, AC as cn, av as cr, gj as ct, wL as d, Z as di, vC as dn, J_ as dr, sj as dt, mg as ei, NT as en, vv as er, QN as et, SL as f, ph as fi, gC as fn, G_ as fr, tj as ft, bL as g, Bf as gi, Qx as gn, F_ as gr, hA as gt, xL as h, X as hi, eS as hn, L_ as hr, _A as ht, ML as i, ag as ii, UC as in, dv as ir, Aj as it, OF as j, Fl as ji, ob as jn, S_ as jr, $O as jt, GF as k, Ul as ki, hb as kn, x_ as kr, mk as kt, EL as l, Fh as li, DC as ln, Y_ as lr, hj as lt, yL as m, Qm as mi, dC as mn, B_ as mr, FA as mt, PL as n, dg as ni, AT as nn, hv as nr, sM as nt, kL as o, eg as oi, MC as on, ov as or, Oj as ot, vL as p, dh as pi, fC as pn, K_ as pr, ZA as pt, DP as q, wv as qn, Wg as qr, pE as qt, jL as r, lg as ri, kT as rn, uv as rr, Bj as rt, OL as s, Yh as si, jC as sn, sv as sr, Dj as st, NL as t, fg as ti, jT as tn, mv as tr, cM as tt, TL as u, Mh as ui, wC as un, q_ as ur, fj as ut, _L as v, Jd as vi, Sx as vn, I_ as vr, lA as vt, WI as w, eu as wi, Wb as wn, A_ as wr, Hk as wt, QI as x, Xu as xi, ux as xn, z_ as xr, tA as xt, hL as y, Rd as yi, xx as yn, R_ as yr, cA as yt, uF as z, Ps as zi, Hy as zn, r_ as zr, TD as zt };
23888
+ export { rP as $, bv as $n, yg as $r, PT as $t, zF as A, Ul as Ai, mb as An, x_ as Ar, dk as At, dF as B, Ps as Bi, Hy as Bn, r_ as Br, xD as Bt, GI as C, J as Ci, $b as Cn, M_ as Cr, Zk as Ct, rI as D, Yl as Di, gb as Dn, k_ as Dr, Ok as Dt, oI as E, Zl as Ei, xb as En, E_ as Er, Mk as Et, bF as F, Sl as Fi, Jy as Fn, u_ as Fr, AD as Ft, jP as G, oy as Gn, Qg as Gr, jE as Gt, oF as H, Cs as Hi, My as Hn, t_ as Hr, RE as Ht, _F as I, xl as Ii, Wy as In, d_ as Ir, ED as It, EP as J, wv as Jn, Wg as Jr, fE as Jt, AP as K, Qv as Kn, Jg as Kr, mE as Kt, hF as L, bl as Li, qy as Ln, l_ as Lr, DD as Lt, SF as M, Fl as Mi, Zy as Mn, S_ as Mr, zO as Mt, CF as N, Pl as Ni, Xy as Nn, v_ as Nr, kD as Nt, JF as O, ql as Oi, pb as On, C_ as Or, Tk as Ot, yF as P, Nl as Pi, Yy as Pn, g_ as Pr, jD as Pt, uP as Q, Sv as Qn, Sg as Qr, FT as Qt, fF as R, Hs as Ri, Gy as Rn, c_ as Rr, OD as Rt, qI as S, Xu as Si, nx as Sn, z_ as Sr, Qk as St, uI as T, eu as Ti, Pb as Tn, A_ as Tr, Ik as Tt, cF as U, gs as Ui, Ay as Un, e_ as Ur, FE as Ut, lF as V, zs as Vi, Vy as Vn, n_ as Vr, yD as Vt, sF as W, _s as Wi, ty as Wn, $g as Wr, PE as Wt, xP as X, Cv as Xn, zg as Xr, $ as Xt, SP as Y, Tv as Yn, Vg as Yr, dE as Yt, vP as Z, kv as Zn, Tg as Zr, IT as Zt, gL as _, Bf as _i, Kx as _n, F_ as _r, uA as _t, AL as a, ag as ai, LC as an, dv as ar, kj as at, sL as b, Rd as bi, px as bn, R_ as br, iA as bt, DL as c, Yh as ci, AC as cn, sv as cr, gj as ct, wL as d, Mh as di, vC as dn, q_ as dr, sj as dt, vg as ei, NT as en, gv as er, QN as et, SL as f, Z as fi, gC as fn, J_ as fr, tj as ft, bL as g, X as gi, Qx as gn, L_ as gr, hA as gt, xL as h, Qm as hi, eS as hn, B_ as hr, _A as ht, ML as i, lg as ii, UC as in, uv as ir, Aj as it, OF as j, Hl as ji, ob as jn, b_ as jr, $O as jt, GF as k, Wl as ki, hb as kn, T_ as kr, mk as kt, EL as l, Bh as li, DC as ln, av as lr, hj as lt, yL as m, dh as mi, dC as mn, K_ as mr, FA as mt, PL as n, fg as ni, AT as nn, mv as nr, sM as nt, kL as o, ng as oi, MC as on, fv as or, Oj as ot, vL as p, ph as pi, fC as pn, G_ as pr, ZA as pt, DP as q, Yv as qn, Gg as qr, pE as qt, jL as r, dg as ri, kT as rn, hv as rr, Bj as rt, OL as s, eg as si, jC as sn, ov as sr, Dj as st, NL as t, mg as ti, jT as tn, vv as tr, cM as tt, TL as u, Fh as ui, wC as un, Y_ as ur, fj as ut, _L as v, Vf as vi, Sx as vn, P_ as vr, lA as vt, WI as w, q as wi, Wb as wn, j_ as wr, Hk as wt, QI as x, ld as xi, ux as xn, N_ as xr, tA as xt, hL as y, Jd as yi, xx as yn, I_ as yr, cA as yt, uF as z, Is as zi, Ky as zn, a_ as zr, TD as zt };
@@ -1,8 +1,8 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
- import { a as t, c as n, d as r, i, n as a, r as o, t as s, u as c } from "./alert-dialog-D37eph4I.js";
3
- import { a as l } from "./button-CG9SBAT-.js";
4
- import { i as u } from "./translate-material-jxfcGlD5.js";
5
- import { t as d } from "./use-material-translation-BUPqNmAg.js";
2
+ import { a as t, c as n, d as r, i, n as a, r as o, t as s, u as c } from "./alert-dialog-D4r0Kn9h.js";
3
+ import { a as l } from "./button-Z_xcg10A.js";
4
+ import { i as u } from "./translate-material-H5GMStyF.js";
5
+ import { t as d } from "./use-material-translation-BW5HZMwt.js";
6
6
  import { _ as f, g as p, h as m, t as h, v as g, y as _ } from "./date.utils-JTEIo3mM.js";
7
7
  import { useCallback as v, useEffect as y, useMemo as b, useRef as x, useState as S } from "react";
8
8
  import { Fragment as C, jsx as w, jsxs as T } from "react/jsx-runtime";
@@ -1,4 +1,4 @@
1
- import { i as e, t } from "./translate-material-jxfcGlD5.js";
1
+ import { i as e, t } from "./translate-material-H5GMStyF.js";
2
2
  import { useCallback as n } from "react";
3
3
  //#region lib/i18n/use-material-translation.ts
4
4
  function r() {
@@ -1,6 +1,6 @@
1
1
  import { o as e, r as t } from "./dist-DVRQkaTK.js";
2
2
  import { i as n, n as r, r as i, t as a } from "./dist-DWZXlCZR.js";
3
- import { C as o, S as s, x as c } from "./spinner-CQqRWxAW.js";
3
+ import { C as o, S as s, x as c } from "./spinner-rk8J5y9O.js";
4
4
  import { a as l, i as u, r as d } from "./dist-DHdUUM1w.js";
5
5
  import { c as f, i as p, l as m, o as h, r as g, s as ee } from "./in-dialog-D61Yeaol.js";
6
6
  import { r as te } from "./escape-owner-DpaP0lm1.js";
package/docs/README.md CHANGED
@@ -36,6 +36,7 @@ detail: every option, the second example, and the traps.
36
36
  | [Moving to TopAppBar](guides/migrating-to-top-app-bar.md) | Your app uses `AppHeader`, `TopAppBar`'s `variant` / `headline`, the shell's `'center'` / `'medium'` / `'large'` header values or the `app-header*` slots: each old spelling and its replacement, the visual changes, the slot rename planned for the next major |
37
37
  | [Migrating to 3.0](guides/migrating-to-3.md) | You are upgrading from 2.x: the React 19.3 and React Router 8.5 peers, `ActivityLayout`'s default route transition, `use(browser())` in server HTML, and each API removed in 3.0 with what replaces it |
38
38
  | [Date and time fields: from 2.x](guides/date-time-fields-2-x.md) | Your app used `DateField`, `DateRangeField`, `TimeField` or `TimePicker` before their redesign: each change in look and behaviour, the 2.x ways back that 3.0 removed, and what to change in tests |
39
+ | [The Refined field look](guides/field-look-refined.md) | Your fields look different after the Refined release (card surface, 3:1 border, 4px focus ring, no filled tint, `NumberField` steppers inside the box, `QuantityField` in one box) and you want the states, the test changes, the tokens, or a detail of the earlier look back |
39
40
  | [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 |
40
41
  | [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 |
41
42
  | [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` |
@@ -1053,12 +1053,12 @@ import { Badge, EntityHeader } from '@nxgt/material/components';
1053
1053
  | `headingLevel` | `1 \| 2 \| 3` | `1` | the title's heading level: pass `2` or `3` when the page already has its `h1` (a list title beside a detail header); the look does not change |
1054
1054
  | `icon`, `status` | `ReactNode` | — | before and after the title; `icon` is decoration, shown in an `aria-hidden` badge, so put nothing meaningful or focusable there; for a control, use `leading` |
1055
1055
  | `leading` | `ReactNode` | — | an interactive control at the band's start, such as a [Switcher](selection-and-choice.md#switcher) of either variant: drawn as it is, at its natural size (at most 18rem wide beside the title, from a 384px band; narrower, it takes the band's width), in the accessibility tree, with no badge and no `aria-hidden`; on a phone it takes the band's width above the title. **It replaces `icon` when both are given** (a development warning says so). Root `data-slot="entity-header-leading"` |
1056
- | `metadata` | `{ label: string; value: ReactNode }[]` | `[]` | facts under the title, a description list: a muted label beside its value, no colon; a link in a value is drawn in the primary text colour (`text-primary-text`), not the prose link's info blue, and `nxgt-plain-link` still opts out |
1056
+ | `metadata` | `{ label: string; value: ReactNode }[]` | `[]` | facts under the title, a description list laid out as a grid of equal columns (as many as the width allows, one per 9.5rem at least): a small muted label above its value, no colon, a long value wraps inside its column; a link or a text button in a value keeps the text's height (its own `min-h-11` is dropped; on a touch pointer its 44px tap target is a hit area that adds no height), and a link in a value is drawn in the primary text colour (`text-primary-text`), not the prose link's info blue, and `nxgt-plain-link` still opts out |
1057
1057
  | `stats` | `EntityStat[]` | `[]` | figures (counts, a mean) as compact `size="sm"` [StatCard](#statcard) tiles in a `StatCardGroup` (2×2 on a phone, a wrapping row beside) under the metadata; a `tone` paints a tile, `0` is a figure, an empty value drops the tile (see Stats below) |
1058
1058
  | `actions` | `ResponsiveButtonProps[] \| ReactNode` | `[]` | an array becomes responsive buttons (icon-only on phones) |
1059
1059
  | `surface` | `'card' \| 'none'` | `'card'` | `'none'` draws the header flat (no background, padding or shadow) for a header that sits directly on a page band or inside a surface of its own, so surfaces do not nest; the layout is unchanged |
1060
1060
 
1061
- The root carries `data-slot="entity-header"`; the metadata is a `dl` with `data-slot="entity-metadata"` (a muted `dt` label beside its `dd` value, no colon), and the actions sit in `data-slot="entity-header-actions"` (absent when there are none). Inside an EntityHeader that replaces the old `summary-data` slot and its `Label:` text, so update a selector or a test that read "Label: value".
1061
+ The root carries `data-slot="entity-header"`; the metadata is a `dl` with `data-slot="entity-metadata"` (a muted `dt` label above its `dd` value in a grid cell, no colon), and the actions sit in `data-slot="entity-header-actions"` (absent when there are none). Inside an EntityHeader that replaces the old `summary-data` slot and its `Label:` text, so update a selector or a test that read "Label: value".
1062
1062
 
1063
1063
  **Flat, on a page band.** `surface="none"` drops the header's own card; `className` still merges.
1064
1064
 
@@ -1696,10 +1696,11 @@ The full `Markdown` (maths, diagrams and highlighted code) runs under a strict
1696
1696
  nonce CSP with no `unsafe-inline`, no `unsafe-eval`, no `style-src-attr` and no
1697
1697
  `img-src data:` (`img-src blob:` for the diagrams): wrap the app in `NonceProvider` and see the
1698
1698
  [CSP guide](../guides/csp.md#markdown-katex-mermaid-and-code-under-a-strict-csp)
1699
- (`Data display/Markdown > StrictCsp` plays it under that policy). Two things
1700
- only: a server-rendered page that has math needs `style-src-attr 'unsafe-inline'`
1701
- (KaTeX's server markup carries inline `style` attributes), and mermaid's mindmap
1702
- and architecture diagrams add a `<style>` to `<head>`. `math={false}` and
1699
+ (`Data display/Markdown > StrictCsp` plays it under that policy). Server-rendered
1700
+ math included: KaTeX's inline `style` attributes become classes plus one
1701
+ `<style>` that takes the `NonceProvider` nonce, so math needs `NonceProvider`
1702
+ under a nonce policy. One thing is left: mermaid's mindmap and architecture
1703
+ diagrams add an un-nonced `<style>` to `<head>`. `math={false}` and
1703
1704
  `mermaid={false}` stay for a restricted GFM-only mode.
1704
1705
 
1705
1706
  Mermaid diagrams render in the browser only, after mount; on the server the
@@ -359,21 +359,21 @@ Storybook: `Date & time/Pickers surfaces/Phone sheet`, `/Popover` and `/Cancel`.
359
359
  ### The tonal field
360
360
 
361
361
  `DateField`, `DateRangeField` and `TimeField` (and their `*FormField`
362
- wrappers) share one style: a box tinted with the primary colour, no
363
- border at rest, and a 2px primary boundary while a segment has focus or the
364
- picker is open. While the box has focus every segment is a tint chip, and the
365
- focused one a primary pill (bold, a little larger, on a spring; none of it
366
- with `prefers-reduced-motion`). The open button is a tint circle, primary
367
- while the picker is open. An invalid field gets an error boundary and tint, a
368
- disabled one the plain disabled box. On a phone the chips are drawn text-wide inside the 44px segments.
369
- In forced colours the box keeps a 1px system border and the pill is
370
- `Highlight`.
371
-
372
- At rest the box has no boundary, which WCAG 1.4.11 allows because the field is
373
- identified by its label, its text (the placeholder reaches 4.5:1 against the
374
- fill) and its open button (the icon reaches 3:1). The focus boundary reaches 3:1
375
- against the page, and the pill 3:1 against the fill (`Date & time/Fields
376
- expressive` → Contrast).
362
+ wrappers) share one style, the field box of the text fields: the card as
363
+ surface, a 1px border at rest, and the primary border with a 4px ring while a
364
+ segment has focus or the picker is open (an error takes the error border and
365
+ ring, read-only is dashed, disabled recessed). While the box has focus every
366
+ segment is a tint chip, and the focused one a primary pill (bold, a little
367
+ larger, on a spring; none of it with `prefers-reduced-motion`). The open button
368
+ is a tint circle, primary while the picker is open. An invalid field gets the
369
+ error border and ring, a disabled one the plain disabled box. On a phone the
370
+ chips are drawn text-wide inside the 44px segments. In forced colours the box
371
+ keeps a system border and the pill is `Highlight`.
372
+
373
+ At rest the box has a 1px border that reaches 3:1 against the card (WCAG
374
+ 1.4.11), and the placeholder reaches 4.5:1 against the fill and the open
375
+ button's icon 3:1. The focus ring reaches 3:1 against the page, and the pill
376
+ 3:1 against the fill (`Date & time/Fields expressive` → Contrast).
377
377
 
378
378
  The field's calendar and picker share it.
379
379
 
@@ -686,8 +686,9 @@ value shows the segments' placeholders. The box is the shared field box
686
686
  `data-focused` (while a segment has focus), `data-invalid` and
687
687
  `data-disabled`, set only when true, and the field box draws the filled
688
688
  tint, the open and focus looks and the red border of an invalid field from
689
- them; the field draws its own tonal box over it (see [The tonal
690
- field](#the-tonal-field)). With no value, the first pick in a column
689
+ them. The typed box only adds the ring while the picker is open and while a
690
+ trigger button around it has keyboard focus; the error look is the shared
691
+ field box's (see [The tonal field](#the-tonal-field)). With no value, the first pick in a column
691
692
  (`variant="columns"`) starts from midnight today. In the tiles, a tile with no value starts from its lowest
692
693
  value on an increase and its highest on a decrease.
693
694
 
@@ -841,13 +842,14 @@ export function DueAt() {
841
842
  (`material.age-field.unit-day`, `unit-week`, `unit-month`, `unit-year`: "1 month",
842
843
  "2 months", « 2 mois »), and a polite status says the whole age when it changes
843
844
  (`material.age-field.reading`). `ageReading(t, 2, 'month')` gives the same text
844
- for your own use. The unit picker is named "Age unit" (`material.age-field.unit`).
845
+ for your own use. The unit chip reads "Age unit: months" and the menu it opens
846
+ is named "Age unit" (`material.age-field.unit`).
845
847
 
846
848
  **In tests.** One `group` named by the label, a `spinbutton` for the number
847
- and a `combobox` named "Age unit":
849
+ and a `button` named "Age unit: months" (the chip) that opens a menu of options:
848
850
 
849
851
  ```ts
850
- await user.click(screen.getByRole('combobox', { name: 'Age unit' }));
852
+ await user.click(screen.getByRole('button', { name: /^Age unit/ }));
851
853
  await user.click(await screen.findByRole('option', { name: 'years' }));
852
854
  ```
853
855
 
@@ -919,9 +921,9 @@ its number pad). A button at its limit is `aria-disabled`, not `disabled`, so
919
921
  a focused one keeps the focus.
920
922
 
921
923
  **Look.** The tonal box of the date fields, a leading timer icon
922
- (decorative), then the amounts and the pair: no border at rest, a 2px primary
923
- boundary while anything inside has focus, an error boundary and tint when
924
- invalid, the disabled box as the other fields. Every focus ring is drawn
924
+ (decorative), then the amounts and the pair: the field box's border at rest,
925
+ the primary border and 4px ring while anything inside has focus, the error
926
+ border and ring when invalid, the disabled box as the other fields. Every focus ring is drawn
925
927
  inside the field. The buttons are 32px (44px on a coarse pointer, where the
926
928
  field grows to 52px so they keep 4px around them); every segment has a 44px
927
929
  hit area on a phone. The segments read left to right in every direction, as
@@ -7,6 +7,12 @@ them into a form, and [what each field emits](../guides/forms.md#what-each-field
7
7
  for the value type each one writes. Everything is imported from
8
8
  `@nxgt/material/components`.
9
9
 
10
+ The text-like fields share one box, drawn in the Refined look (the card
11
+ surface, a 3:1 border, a 1px primary border with a 4px ring on focus, no tint
12
+ once filled). [The Refined field look](../guides/field-look-refined.md) has
13
+ its states, what moved for tests (the `NumberField` and `QuantityField` tab
14
+ order and roles) and the tokens that tune it.
15
+
10
16
  | | Component | What it does |
11
17
  | --- | --- | --- |
12
18
  | <img src="../previews/form-fields-field.webp" width="96" alt=""> | [Field](#field) | Renders the field matching a config `type` |
@@ -15,6 +21,7 @@ for the value type each one writes. Everything is imported from
15
21
  | <img src="../previews/form-fields-choicelistfield.webp" width="96" alt=""> | [ChoiceListField](#choicelistfield) | An editable list of answer choices with correct marks |
16
22
  | <img src="../previews/form-fields-textfield.webp" width="96" alt=""> | [TextField](#textfield) | Labelled input with adornments and helper text |
17
23
  | <img src="../previews/form-fields-textareafield.webp" width="96" alt=""> | [TextareaField](#textareafield) | Labelled textarea with row sizing and a counter |
24
+ | <img src="../previews/form-fields-markdowntextareafield.webp" width="96" alt=""> | [MarkdownTextareaField](#markdowntextareafield) | Textarea for Markdown and math with a Write / Preview tab list |
18
25
  | <img src="../previews/form-fields-emailfield.webp" width="96" alt=""> | [EmailField](#emailfield) | Validates on blur, `mailto:` button |
19
26
  | <img src="../previews/form-fields-passwordfield.webp" width="96" alt=""> | [PasswordField](#passwordfield) | Show / hide toggle and a strength meter |
20
27
  | <img src="../previews/form-fields-numberfield.webp" width="96" alt=""> | [NumberField](#numberfield) | `number \| null` with clamping and +/− buttons |
@@ -484,7 +491,7 @@ import { User } from 'lucide-react';
484
491
  | `label` | `ReactNode` | — | shown above the input |
485
492
  | `helperText` | `ReactNode` | — | hint under the input; the error message when `error` |
486
493
  | `error` | `boolean` | — | error outline and helper colour |
487
- | `leading`, `trailing` | `ReactNode` | — | adornments inside the input: an element (icon, button) is its own 32px well; text (`"/ 20"`) goes in a well as tall as the field, centred on the value |
494
+ | `leading`, `trailing` | `ReactNode` | — | adornments inside the input: an element (icon, button) is muted with no well fill, 32px (44px on touch); text (`"/ 20"`) is a muted unit in the same box that hugs the value (the input is sized to it) |
488
495
 
489
496
  Every other prop is the native `<input>`'s.
490
497
 
@@ -524,6 +531,44 @@ stores `string`.
524
531
 
525
532
  ---
526
533
 
534
+ ## MarkdownTextareaField
535
+
536
+ ![MarkdownTextareaField](../previews/form-fields-markdowntextareafield.webp)
537
+
538
+ Textarea for Markdown and KaTeX math with a **Write / Preview** tab list, the
539
+ usual label, helper text, error and `maxLength` counter, and a collapsed
540
+ formatting help (bold, list, code, `$…$`, `$$…$$`, escaping `\$`). The preview
541
+ is rendered by [`Markdown`](./data-display.md#markdown); raw HTML is never rendered.
542
+
543
+ ```tsx
544
+ import { MarkdownTextareaField, MarkdownTextareaFormField } from '@nxgt/material/components';
545
+
546
+ <MarkdownTextareaField label="Prompt" maxLength={4000} helperText="Markdown and $math$." />
547
+
548
+ <MarkdownTextareaFormField control={control} name="prompt" label="Prompt" maxLength={4000} />
549
+ ```
550
+
551
+ | Prop | Type | Default | Effect |
552
+ | --- | --- | --- | --- |
553
+ | `minRows` | `number` | `6` | minimum height of the textarea and the preview, in lines |
554
+ | `maxLength` | `number` | — | shows an `n/max` counter, red when over |
555
+ | `showCount` | `boolean` | `true` when `maxLength` is set | force the counter on or off |
556
+ | `math` | `boolean` | `true` | render `$…$` and `$$…$$` in the preview |
557
+ | `mermaid` | `boolean` | `false` | draw ```` ```mermaid ```` fences in the preview |
558
+ | `showHelp` | `boolean` | `true` | the formatting help under the field |
559
+ | `previewClassName` | `string` | — | class of the preview panel |
560
+ | `error` | `boolean` | — | error outline and helper colour |
561
+
562
+ The Write / Preview toggle is a `tablist` (arrow keys move between the tabs);
563
+ the textarea stays mounted while Preview shows. Text labels use the
564
+ `material.markdown-textarea-field.*` i18n keys.
565
+
566
+ **Emits:** the native `ChangeEvent<HTMLTextAreaElement>`; `MarkdownTextareaFormField`
567
+ stores `string`.
568
+ **Form wrapper:** `MarkdownTextareaFormField` — `control` and `name`, see
569
+ [forms](../guides/forms.md#the-pair) and [what each field emits](../guides/forms.md#what-each-field-emits).
570
+ **Storybook:** `Form fields/MarkdownTextareaField` · **Vue:** none yet
571
+
527
572
  ## EmailField
528
573
 
529
574
  ![EmailField](../previews/form-fields-emailfield.webp)
@@ -597,13 +642,47 @@ export function Quantity() {
597
642
  | `min`, `max` | `number` | — | clamps typed and stepped values |
598
643
  | `step` | `number` | `1` | the +/− increment |
599
644
  | `hideSteppers` | `boolean` | `false` | hides the +/− buttons |
600
- | `suffix` | `ReactNode` | — | unit shown inside the input box, at its end |
645
+ | `suffix` | `ReactNode` | — | unit shown inside the input box, at its end (the max of a `score`) |
646
+ | `variant` | `'default' \| 'score'` | `'default'` | `score` is a big tabular value with its max, no box at rest and no steppers (see below) |
647
+ | `tone` | `Tone` | none (neutral band) | `score` only: one of the eight named tones or an [app tone](../guides/theming.md#app-tones-on-shape-fab-avatar-statcard-and-the-metric-cards), drawn as text colour plus a shape marker |
648
+ | `locked` | `boolean` | `false` | `score` only: read-only, muted, dashed frame and a lock |
649
+ | `lockedReason` | `ReactNode` | — | `score` only: why it is locked; shown under the value and wired by `aria-describedby` |
601
650
  | `aria-label` | `string` | — | names the input when it has no `label` (a part of a larger field) |
602
651
  | `aria-labelledby` | `string` | — | names the input by another element's id (a part of a larger field) |
603
652
  | `aria-describedby` | `string` | — | more ids describing the input, after its `helperText` (an error the larger field shows) |
604
653
  | `onBlur` | `FocusEventHandler` | — | after the typed text is read and `onChange` called |
605
654
  | `ref` | `Ref<HTMLInputElement>` | — | reaches the text input (React Hook Form's `field.ref`) |
606
655
 
656
+ **Score variant.** `variant="score"` draws a result the user types, such as
657
+ a mark out of 20, a rating or a points total: a big value in tabular figures
658
+ with the maximum (`suffix`, "/ 20") hugging it on the baseline. There is no box
659
+ at rest (a quiet band, about 6% of the tone), a 1px frame on hover and the field
660
+ focus ring on focus; it has no steppers (`hideSteppers` is implied). The tone is
661
+ yours (`tone="success"`, `"warning"`, an app tone...) and is never colour alone:
662
+ the text takes the tone's text colour and a small shape marker precedes the value
663
+ (success a circle, warning a triangle, error a diamond, every other tone a
664
+ square; the marker is `aria-hidden`, so say what the tone means in the label or
665
+ the helper text). An `error` draws the error tone with a border and its
666
+ `helperText` describes the input. `locked` makes the input read-only with a muted
667
+ value, a dashed frame and a lock icon; `lockedReason` shows under the value and
668
+ is added to the input's `aria-describedby`. A locked score keeps a visible focus frame, and a locked score in `error` keeps the error colour on its dashed frame. The styles ship in `styles.css`
669
+ (`number-field-score.css`); `NumberFormField` forwards all of them.
670
+
671
+ ```tsx
672
+ <NumberField
673
+ variant="score"
674
+ label="Result"
675
+ suffix="/ 20"
676
+ min={0}
677
+ max={20}
678
+ step={0.5}
679
+ tone={mark >= 10 ? 'success' : 'warning'}
680
+ value={mark}
681
+ onChange={setMark}
682
+ />
683
+ <NumberField variant="score" label="Result" suffix="/ 20" value={16} locked lockedReason="Closed on 3 June." />
684
+ ```
685
+
607
686
  **Stepper names.** Each +/− button is named after its field: "Increase
608
687
  Quantity" / "Decrease Quantity" (`material.number-field.increase-named` and
609
688
  `decrease-named`, with the `label` interpolated), so a form with several number
@@ -612,11 +691,21 @@ plain-text `label`, else from `aria-label`; with neither (a field named only
612
691
  through `aria-labelledby` included), the buttons keep the bare "Increase" /
613
692
  "Decrease".
614
693
 
694
+ **Layout and focus.** The box is one `role="group"` with the input and, at its
695
+ end, the Decrease and Increase buttons as a tinted round pair, no dividers
696
+ (32px circles, a 44px target on a coarse pointer; the look is shared with
697
+ `DurationField` through `field-stepper.css`). At `min` or `max` a button is
698
+ `aria-disabled`, so it keeps focus. The value is end-aligned in tabular figures, and a
699
+ `suffix` sits right after it. The input never gets narrower than about 7
700
+ digits. Tab goes input, Decrease, Increase (with a `CalculatorField`: input,
701
+ Open calculator, Decrease, Increase). A test that queries an unnamed
702
+ `getByRole('group')` now also matches the number box: name the group you mean.
703
+
615
704
  **Stepper tooltips.** Each +/− button shows its name in a tooltip on hover and
616
705
  on keyboard focus (`:focus-visible`). Focus that a script moves onto it, such
617
706
  as a `Sheet` or `Dialog` putting its initial focus on the first tabbable
618
707
  control, does not open the tooltip once the user has used the pointer (the browser does not treat that focus as `:focus-visible`), so it does not cover the field's label. The
619
- buttons stay in the tab order and keep their accessible names. `QuantityField`
708
+ buttons stay in the tab order (input, Decrease, Increase) and keep their accessible names. `QuantityField`
620
709
  shares this (React only; the Vue steppers are unchanged, #2264).
621
710
 
622
711
  **Decimal separator.** After blur (and after +/−) the value is shown with the
@@ -632,7 +721,7 @@ Form's `field.ref` the input itself: `setFocus('amount')` and
632
721
  **Emits:** `number | null`.
633
722
  **Form wrapper:** `NumberFormField` — `control` and `name`, see
634
723
  [forms](../guides/forms.md#the-pair) and [what each field emits](../guides/forms.md#what-each-field-emits).
635
- **Storybook:** `Form fields/NumberField` · **Vue:** `NumberField`, `NumberFormField` (the language separator is React only for now, #763; the stepper names, #2060)
724
+ **Storybook:** `Form fields/NumberField` (`Score`) · **Vue:** `NumberField`, `NumberFormField` (the language separator is React only for now, #763; the stepper names, #2060; the `score` variant is React only)
636
725
 
637
726
  ---
638
727
 
@@ -664,8 +753,9 @@ ratio (`0.15`).
664
753
  ![QuantityField](../previews/form-fields-quantityfield.webp)
665
754
 
666
755
  One labelled field holding an amount and its unit ("2 capsule", "500 mg"): a
667
- [`NumberField`](#numberfield)'s number beside a unit picker, under one label
668
- and one error message. The value is `{ value: number | null, unit: string }`.
756
+ [`NumberField`](#numberfield)'s number and a unit chip in ONE field box (value
757
+ at the start, the unit as a soft chip with a ⇅ icon, then the round −/+ pair),
758
+ under one label and one error message. The value is `{ value: number | null, unit: string }`.
669
759
  `QuantityFormField` wires it to react-hook-form.
670
760
 
671
761
  ```tsx
@@ -702,8 +792,7 @@ Without a form library, `QuantityField` takes `value` and `onChange` (or
702
792
  `defaultValue`). The number is the one `NumberField` has: the language's
703
793
  decimal separator, `min`, `max` and `step` (clamped on blur), and steppers
704
794
  named after the field ("Increase Dose"). Both parts stay on one line on a
705
- phone: the unit is sized to its longest label and shrinks first, the
706
- number keeps 9rem (see Unit width below).
795
+ phone: the chip truncates before the value does (see The unit chip below).
707
796
 
708
797
  | Prop | Type | Default | What it does |
709
798
  | --- | --- | --- | --- |
@@ -711,27 +800,31 @@ number keeps 9rem (see Unit width below).
711
800
  | `value`, `defaultValue`, `onChange` | `QuantityValue`, `(value) => void` | empty | the amount and its unit; `onChange` gets both on each change |
712
801
  | `label` | `ReactNode` | none | the one label; it names the group |
713
802
  | `units` | `{ value, label }[]` | none | the units offered |
714
- | `allowCustomUnit` | `boolean` | `false` | the unit is typed in a text input and `units` are suggestions; otherwise it is picked from `units` |
803
+ | `allowCustomUnit` | `boolean` | `false` | the unit menu gets a "Search or type a unit" input and a "Use “x”" item, so a unit outside `units` can be typed; otherwise it is a plain listbox of `units` |
715
804
  | `min`, `max`, `step`, `hideSteppers` | | `step` 1 | as `NumberField` |
716
- | `unitLabel`, `unitPlaceholder` | `string` | "<label> unit" | the unit part's accessible name and its placeholder |
805
+ | `unitLabel`, `unitPlaceholder` | `string` | "<label> unit" | `unitLabel` names the unit part (the menu's name; the chip reads "<unitLabel>: mg"); `unitPlaceholder` shows while no unit is chosen |
717
806
  | `helperText`, `error` | `ReactNode`, `boolean` | none | the one message under the pair; in a form, an error on `name`, `name.value` or `name.unit` shows there |
718
807
  | `className`, `aria-label` | `string` | none | `className` goes on the group; `aria-label` names it when `label` is not plain text |
719
808
  | `name`, `onBlur` | | none | `QuantityField` only (the form field takes them from the form): `name` names the parts `<name>.value` and `<name>.unit`; `onBlur` fires when the number input loses focus |
720
- | `required`, `disabled`, `placeholder`, `id`, `ref` | | | `placeholder`, `id` and `ref` reach the number input (React Hook Form's `field.ref` focuses it on an error) |
809
+ | `required`, `disabled`, `placeholder`, `id`, `ref` | | | `required` applies to the number only; to require a unit, validate `unit` in the form schema. `placeholder`, `id` and `ref` reach the number input (React Hook Form's `field.ref` focuses it on an error) |
721
810
 
722
811
  - **Semantics:** a `<fieldset>` (role `group`) named by the label; the number
723
- is a textbox named after the label, the unit a combobox (or, with
724
- `allowCustomUnit`, a text input) named "Dose unit". The message describes
725
- the group, the number and the unit, and both are `aria-invalid` on an error.
726
- - **Unit width:** the unit part is sized to the longest label of `units`
727
- (never under 7rem, never over 55% of the row). It shrinks before the number
728
- does: the number's cell keeps 9rem (two 44px steppers and a 44px input), so
729
- the input stays a tap target at 375px, also in a padded side sheet. Beyond
730
- the cap the label is cut with an ellipsis and the full label
731
- is the select's `title` (the `units` select only; a free unit typed past
732
- the cap scrolls in its input). No inline style is used for it.
733
- - **Translations:** `material.quantity-field.unit` and `.unit-named` (English
734
- and French) name the unit part.
812
+ is a textbox named after the label, the unit chip a button named "Unit: mg"
813
+ (`aria-expanded`; it opens a popover), the menu a listbox named
814
+ "Dose unit". The message describes the group, the number and the chip, and
815
+ the number is `aria-invalid` on an error.
816
+ - **Keyboard:** Tab goes value, unit chip, Decrease, Increase. Enter, Space or
817
+ ArrowDown on the chip opens the menu (focus lands on the list, or on the
818
+ search with `allowCustomUnit`); the arrows move, Enter picks, Esc closes and
819
+ returns focus to the chip.
820
+ - **The unit chip:** one focus ring for the whole box, whichever part has
821
+ focus. The chip is capped at 52% of the box and truncates a long label with
822
+ an ellipsis (the full label is its `title`); the value keeps room for about
823
+ 4 digits at 360px. A coarse pointer gets 44px targets. Disabled, the chip
824
+ and the steppers lose their tint. A unit outside `units` shows as typed.
825
+ The unit still posts as `<name>.unit` (a hidden input) in a native form.
826
+ - **Translations:** `material.quantity-field.unit`, `.unit-named`, `.unit-chip`
827
+ ("Unit: {label}"), `.search` and `.use-typed` (English and French).
735
828
 
736
829
  **Emits:** `{ value: number | null, unit: string }`.
737
830
  **Form wrapper:** `QuantityFormField` — `control` and `name`, see
@@ -1723,9 +1816,9 @@ describes the switch too, and an `aria-describedby` you pass is kept beside
1723
1816
  these. With `required`, the switch has `aria-required` and the label's asterisk
1724
1817
  is drawn by CSS, so the name and the label text stay "Terms", not "Terms*".
1725
1818
  Without an `id` one is generated, under `SwitchFormField` too (it used to be
1726
- the field's `name`, which two forms on one page shared). The row is tinted
1727
- while the switch is on, from `checked` or, uncontrolled, from `defaultChecked` and each toggle, and carries
1728
- `data-checked="true"` / `"false"`, so select rows that are on with
1819
+ the field's `name`, which two forms on one page shared). The row carries
1820
+ `data-checked="true"` / `"false"` (the checked state is the track, the thumb
1821
+ and the primary label, with no row tint), so select rows that are on with
1729
1822
  `[data-checked="true"]` (a bare `[data-checked]` also matches rows that are
1730
1823
  off).
1731
1824
 
@@ -81,7 +81,7 @@ phone's menu sheet pad clear of `env(safe-area-inset-*)`, as classes; see the
81
81
 
82
82
  | Prop | Type | Default | Effect |
83
83
  | --- | --- | --- | --- |
84
- | `items` | `MenuItem[]` | — | `label` (already translated), `url`, `icon`, `footer`, `display` (`'icon'`: a round icon-only button, the label as tooltip and name, in the rail and the expanded sidebar; the phone's menu sheet always shows icon and label; see the [app shell guide](../guides/app-shell.md)), `badge` (`true` a dot, a number a count up to "99+"), `badgeLabel` (see [Badges](../guides/app-shell.md#badges)), and `children` (read by `navigation="top"`, which opens them in a dropdown under a parent that is then only a trigger; by `navigation="two-level"`, which lists them in the panel beside the rail, one level deep; by the phone's menu sheet and the expanded sidebar, which nest them under the parent's own link, unless the entry sets `childrenIn: 'sidebar'`, which keeps them to the sidebar and the top dropdown), `childrenIn`, `group`, `bar`, `priority` for the navigation presets that read them (the drawer reads `group`, the bar `bar` and `priority`; the floating toolbar, not drawn yet, is the only preset still to read them) |
84
+ | `items` | `MenuItem[]` | — | `label` (already translated), `url`, `icon`, `footer`, `display` (`'icon'`: a round icon-only button, the label as tooltip and name, in the rail and the expanded sidebar; the phone's menu sheet always shows icon and label; see the [app shell guide](../guides/app-shell.md)), `badge` (`true` a dot, a number a count up to "99+"), `badgeLabel` (see [Badges](../guides/app-shell.md#badges)), and `children` (read by `navigation="top"`, which opens them in a dropdown under a parent that is then only a trigger; by `navigation="two-level"`, which lists them in the panel beside the rail, one level deep; by the phone's menu sheet and the expanded sidebar, which nest them under the parent's own link, unless the entry sets `childrenIn: 'sidebar'`, which keeps them to the sidebar and the top dropdown), `childrenIn`, `defaultExpanded` (the expanded sidebar folds the entry's children from a chevron button, open at first when `true`, folded when `false`; unset, they are always listed), `group`, `bar`, `priority` for the navigation presets that read them (the drawer reads `group`, the bar `bar` and `priority`; the floating toolbar, not drawn yet, is the only preset still to read them) |
85
85
  | `linkComponent` | `AppShellLinkComponent` | React Router `Link` | The link each menu entry renders, given `href`; see the [app shell guide](../guides/app-shell.md). Defaults to the [`LinkComponentProvider`](./primitives.md#linkcomponentprovider)'s link when one is set. |
86
86
  | `logo`, `name` | `AppLogo` (`ReactNode \| string \| AppLogoImage`, `AppLogoImage` = `{ src, alt? }`), `string` | — | the app's logo alone in the collapsed rail, named by `name` (also its tooltip); logo and name side by side in the phone's menu sheet |
87
87
  | `context` | `ReactNode` | — | a line at the top of the phone's menu sheet, above the brand: the current tenant's name; `name` stays the app's brand; `AppHeader` and `AppSidebar` take it too (see the [app shell guide](../guides/app-shell.md#the-brand-logo-and-name)) |
@@ -2834,8 +2834,37 @@ French bundle — see [i18n](../guides/i18n.md).
2834
2834
  | `QuestionCard` `preview` | `boolean` | `false` | an author's preview, `<QuestionCard question={q} preview />`: forces `revealed` and `readOnly`, drops `onValueChange`, and shows the marks (the `question.correct` options marked, the expected text or number filled in) and the `explanation`, with no verdict banner. `verdict` and `showFeedback` are always ignored in a preview; `value` is ignored when the question has a `correct` — an `open` or `code` question has none, so pass its reference answer as `value`. Not for a learner's attempt |
2835
2835
  | `QuestionCard` `readOnly` / `busy` | `boolean` | `false` | `readOnly`: an answer already submitted, shown without the revealed marks; `busy`: read-only and `aria-busy` while it is saved; every kind honours both |
2836
2836
  | new strings | `material.education.kind-open`, `kind-code`, `code-placeholder` | — | English fallbacks and a French bundle |
2837
+ | `Question` `markdown` | `boolean` | `false` | draws the `prompt`, the string option labels, `explanation`, option explanations and hints as Markdown with math (`$x^2$`), through the safe `Markdown` (raw HTML is not rendered, mermaid off). The prompt, option labels and the verdict's "Correct answer" use an inline form (paragraph unwrapped, no lists or headings) so the HTML stays valid in a `<legend>` or a label; explanations and hints keep blocks |
2838
+ | `Question` `hints` | `string[]` | — | revealed one at a time behind a "Show hint 1 of N" button; the focus moves to the hint just shown and the hint's name is "Hint 1 of N" (one announcement). Hidden once revealed. The single `hint` is deprecated (kept: a Show / Hide toggle), ignored when `hints` is set |
2839
+ | `QuestionOption` `explanation` | `string` | — | why this option is right or wrong; a list "About each answer" under the card once revealed or in a `preview` |
2840
+ | `Question` `references` | `{ title: string; url?: string }[]` | — | a labelled "References" list once revealed or in a `preview`; a safe `url` is a link, an external one with `rel="noopener noreferrer"` |
2841
+ | `Question` `kind: 'code'` | `starterCode?`, `examples?: { input, expected }[]` | — | `starterCode` fills the field while there is no draft (`value` null or undefined; an empty string is a draft), it reaches `onValueChange` on the first edit only; `examples` is a table (Input, Expected) above the field |
2842
+ | new strings | `material.quiz.rich.*` | — | English fallbacks and a French bundle (React only for now) |
2837
2843
  | `QuestionCard` `variant` / `density` / `showShortcuts` / `number` / `showFeedback` | — | `'card'`, `'comfortable'`, `false`, —, `true` | framed or plain, spacing, key badges, "Question 2", the verdict banner (for a card with marks and no banner, use `preview`) |
2838
2844
 
2845
+ A quiz question with Markdown, math, progressive hints and references:
2846
+
2847
+ ```tsx
2848
+ <QuestionCard
2849
+ question={{
2850
+ id: 'q1',
2851
+ kind: 'choice',
2852
+ markdown: true,
2853
+ prompt: 'Solve $2x + 6 = 14$',
2854
+ options: [
2855
+ { id: 'a', label: '$x = 4$', explanation: 'Subtract 6, then divide by 2.' },
2856
+ { id: 'b', label: '$x = 10$', explanation: 'You added 6 instead.' },
2857
+ ],
2858
+ correct: 'a',
2859
+ hints: ['Isolate $x$.', 'Subtract 6 from both sides.'],
2860
+ references: [{ title: 'Linear equations', url: 'https://example.org/linear' }],
2861
+ }}
2862
+ value={value}
2863
+ onValueChange={setValue}
2864
+ revealed={checked}
2865
+ />
2866
+ ```
2867
+
2839
2868
  An open answer and a code answer, with the code editor from its own subpath
2840
2869
  (it is client-only, so load it lazily in an SSR app):
2841
2870