@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
@@ -23,6 +23,8 @@ words in your error.
23
23
  - [`is missing the following properties from type 'Pick<any, "variant" | "color">'`](#is-missing-the-following-properties-from-type-pickany-variant--color)
24
24
  - [`Types have separate declarations of a private property` on a `RichTextEditor` `onUpdate` or `onCreate` handler](#types-have-separate-declarations-of-a-private-property-on-a-richtexteditor-onupdate-or-oncreate-handler)
25
25
  - [`error TS2305: Module '"@nxgt/material/components"' has no exported member 'Button'`](#error-ts2305-module-nxgtmaterialcomponents-has-no-exported-member-button)
26
+ - [`Unable to find an accessible element with the role "combobox"`](#unable-to-find-an-accessible-element-with-the-role-combobox) (a `QuantityField` or `AgeField` unit in a test)
27
+ - [A test finds an extra `group`, or tabs in the wrong order, in a `NumberField`](#a-test-finds-an-extra-group-or-tabs-in-the-wrong-order-in-a-numberfield)
26
28
 
27
29
  **Styles & assets**
28
30
 
@@ -43,6 +45,7 @@ words in your error.
43
45
  - [`IconRefError` from `IconSpritesProvider`](#iconreferror-from-iconspritesprovider)
44
46
  - [An accessibility audit reports low contrast on a badge, a button, a toast or a menu entry](#an-accessibility-audit-reports-low-contrast-on-a-badge-a-button-a-toast-or-a-menu-entry)
45
47
  - [`ARIA hidden element must not be focusable or contain focusable elements`](#aria-hidden-element-must-not-be-focusable-or-contain-focusable-elements)
48
+ - [An `EntityHeader` metadata test that measured the label beside its value now fails](#an-entityheader-metadata-test-that-measured-the-label-beside-its-value-now-fails)
46
49
  - [A control in an `EntityHeader`'s `icon` is hidden from assistive tech, squashed, and reports `aria-hidden-focus`](#a-control-in-an-entityheaders-icon-is-hidden-from-assistive-tech-squashed-and-reports-aria-hidden-focus)
47
50
  - [A `Switcher` in link mode leaves focus on the trigger after a navigation, and the new page's title never gets it](#a-switcher-in-link-mode-leaves-focus-on-the-trigger-after-a-navigation-and-the-new-pages-title-never-gets-it)
48
51
  - [An accessibility audit reports low contrast on a tonal or outlined button, a selected list tile or a hovered badge link](#an-accessibility-audit-reports-low-contrast-on-a-tonal-or-outlined-button-a-selected-list-tile-or-a-hovered-badge-link)
@@ -67,6 +70,7 @@ words in your error.
67
70
  - [A Button's label overflows a card on a phone](#a-buttons-label-overflows-a-card-on-a-phone)
68
71
  - [A ResponsiveButton no longer shows its tooltip next to its visible label](#a-responsivebutton-no-longer-shows-its-tooltip-next-to-its-visible-label)
69
72
  - [An input now has `placeholder=" "` in the DOM](#an-input-now-has-placeholder--in-the-dom)
73
+ - [A filled field has no primary tint after upgrading](#a-filled-field-has-no-primary-tint-after-upgrading)
70
74
  - ["Select all" runs under the sort, "Filters" or the actions in a cards or tiles list on a phone](#select-all-runs-under-the-sort-filters-or-the-actions-in-a-cards-or-tiles-list-on-a-phone)
71
75
  - [A dialog or sheet scrolls, or clips a child, after upgrading](#a-dialog-or-sheet-scrolls-or-clips-a-child-after-upgrading)
72
76
  - [A `DialogBody`'s header and footer do not stay pinned](#a-dialogbodys-header-and-footer-do-not-stay-pinned)
@@ -789,8 +793,37 @@ Vite and React Router apps use:
789
793
  { "compilerOptions": { "module": "esnext", "moduleResolution": "bundler" } }
790
794
  ```
791
795
 
796
+ ### `Unable to find an accessible element with the role "combobox"`
797
+
798
+ **When:** a test of a `QuantityField` or `AgeField` unit fails after upgrading.
799
+ **Why:** the unit is no longer a select or a text input: it is a chip, a
800
+ `button` named "Unit: mg" ("Age unit: months"), that opens a menu of options.
801
+ **Fix:** click the button, then pick the option:
802
+
803
+ ```ts
804
+ await user.click(screen.getByRole('button', { name: /^Dose unit|^Unit:/ }));
805
+ await user.click(await screen.findByRole('option', { name: 'mL' }));
806
+ ```
807
+
808
+ With `allowCustomUnit`, type into the search box inside the menu
809
+ (`screen.getByPlaceholderText('Search or type a unit')`), then pick
810
+ `Use “sachet”`.
811
+
792
812
  ## Styles & assets
793
813
 
814
+ ### A test finds an extra `group`, or tabs in the wrong order, in a `NumberField`
815
+
816
+ **When:** after the Refined field release, `getByRole('group')` matches more than one element, or a test that tabs through a `NumberField` lands on a different control.
817
+ **Why:** the number box is now one `role="group"` with the input first and the Decrease and Increase buttons after it (it was Decrease, input, Increase). With a `CalculatorField` the order is input, Open calculator, Decrease, Increase.
818
+ **Fix:** name the group you mean, and tab in the new order.
819
+
820
+ ```ts
821
+ screen.getByRole('group', { name: 'Quantity' });
822
+ await user.tab(); // the input, then Decrease, then Increase
823
+ ```
824
+
825
+ [Tab order and roles](guides/field-look-refined.md#tab-order-and-roles-for-tests) has the list.
826
+
794
827
  ### The backdrop shapes disappeared between the cards (3.22+)
795
828
 
796
829
  **When:** an `ActivityLayout` with `backdrop={<Background preset="shapes" ... />}`
@@ -1152,6 +1185,21 @@ Elements mounted after the layer opens are not made inert: mount them
1152
1185
  first, or pass them to `inertOthers` in `keep` when they must stay
1153
1186
  reachable.
1154
1187
 
1188
+ ### An `EntityHeader` metadata test that measured the label beside its value now fails
1189
+
1190
+ **When:** after the metadata became a grid, a test reads the label and the value
1191
+ of an `EntityHeader` on one line, or measures their positions or heights.
1192
+ **Why:** each fact is now a grid cell with the label (`dt`) above its value
1193
+ (`dd`), as many columns as the width allows; a link or a text button in a value
1194
+ keeps the text's height.
1195
+ **Fix:** update the numbers, or assert on the text and on
1196
+ `data-slot="entity-metadata"` instead of the geometry.
1197
+
1198
+ ```tsx
1199
+ const meta = container.querySelector('[data-slot="entity-metadata"]');
1200
+ expect(meta).toHaveTextContent('Owner');
1201
+ ```
1202
+
1155
1203
  ### A control in an `EntityHeader`'s `icon` is hidden from assistive tech, squashed, and reports `aria-hidden-focus`
1156
1204
 
1157
1205
  **When:** an `EntityHeader` gets a `Switcher`, a button or a link as its `icon`.
@@ -1746,6 +1794,18 @@ page.locator('[data-slot=chip]').getByRole('button', { name: 'Remove Design' });
1746
1794
  **Why:** the "filled" tint relies on `:placeholder-shown`, which only matches a field that has a placeholder. A text field without one (or with `placeholder=""`) now renders a blank `placeholder=" "`, so an empty field is not tinted as if it held a value. It draws nothing and is not announced.
1747
1795
  **Fix:** select by role and accessible name (`getByRole('textbox', { name: ... })`) rather than by the missing attribute, and update the snapshot.
1748
1796
 
1797
+ ### A filled field has no primary tint after upgrading
1798
+
1799
+ **When:** after the Refined field release, a field that holds a value looks the same as an empty one, a style or a screenshot that expected the primary tint no longer matches, or setting `--nxgt-field-bg-filled` changes nothing.
1800
+ **Why:** the field box dropped the filled tint on purpose: the surface is the card and a border that keeps 3:1 says where the field is. `data-filled` is still set on a box that holds a value, and the `--nxgt-field-bg-filled` tokens still exist but alias the rest surface, so nothing paints from them.
1801
+ **Fix:** to bring a tint back, style on `data-filled` after the import (an unlayered rule beats the field box's layer); the dark theme needs its own rule. [The Refined field look](guides/field-look-refined.md#getting-a-detail-of-the-earlier-look-back) has both.
1802
+
1803
+ ```css
1804
+ .nxgt-field-box[data-filled]:not([data-filled="false"]) {
1805
+ background-color: color-mix(in oklab, var(--primary) 10%, transparent);
1806
+ }
1807
+ ```
1808
+
1749
1809
  ### Shaped Gallery tiles are plain rounded squares
1750
1810
 
1751
1811
  **When:** `<Gallery preset="shaped" />` or `shape="cookie-9"` shows ordinary rounded tiles, and the tile does not morph on hover.
@@ -8086,14 +8146,14 @@ with `style-src-elem` for a `<style>` element and `style-src-attr` for a
8086
8146
  **Why:** a `<style>` element needs the page's nonce, an attribute cannot carry
8087
8147
  one. The usual sources are the components listed in
8088
8148
  [the guide](guides/csp.md#style-elements-the-components-inject).
8089
- `ScrollArea`, `Select`, `RichTextEditor` and the scroll lock of dialogs and
8149
+ `ScrollArea`, `Select`, `RichTextEditor`, `Markdown` (math) and the scroll lock of dialogs and
8090
8150
  sheets take the nonce from `NonceProvider`, and report this when the app has
8091
- none (or gives it another nonce than the header's). Mermaid and KaTeX
8092
- need none of this on a client render
8151
+ none (or gives it another nonce than the header's). Math needs no
8152
+ `style-src-attr` on the server or the client, but needs `NonceProvider` (its
8153
+ `mk-` rules are one nonce'd `<style>`)
8093
8154
  ([Markdown under a strict CSP](guides/csp.md#markdown-katex-mermaid-and-code-under-a-strict-csp));
8094
- the two left are a server-rendered page with math (KaTeX's `style` attributes
8095
- need `style-src-attr 'unsafe-inline'`) and the `<style>` cytoscape adds to
8096
- `<head>` for mermaid's mindmap and architecture diagrams.
8155
+ the one left is the `<style>` cytoscape adds to `<head>` for mermaid's mindmap
8156
+ and architecture diagrams.
8097
8157
  `Toaster`, `Drawer`,
8098
8158
  `InputOTP`, `ImageCropper`, `Spinner` and `PdfReader` create none: their CSS is in the stylesheet, so if one of them looks unstyled, the
8099
8159
  app imports neither `styles.css` nor `dist/material.css`.
@@ -197,7 +197,13 @@
197
197
  @import "./ui/primitives/segmented-input/segmented-input-expressive.css";
198
198
  @import "./ui/dates/picker-trigger/typed-box-expressive.css";
199
199
  @import "./ui/dates/picker-popover/picker-surface-expressive.css";
200
- /* DurationField's one-line field: units and the −/+ pair. */
200
+ /* The −/+ pair shared by DurationField and NumberField. */
201
+ @import "./ui/primitives/field-box/field-stepper.css";
202
+ /* QuantityField: the unit chip inside its one box. */
203
+ @import "./ui/fields/quantity-field/quantity-field.css";
204
+ /* NumberField `variant="score"`. */
205
+ @import "./ui/fields/number-field/number-field-score.css";
206
+ /* DurationField's one-line field: units. */
201
207
  @import "./ui/dates/duration-field/duration-field-expressive.css";
202
208
  @import "./ui/feedback/toast/toast.css";
203
209
  @import "./ui/feedback/toast/toast-expressive.css";
@@ -66,12 +66,16 @@
66
66
  text (4.5:1) on them, and for the same colours used as text on white. */
67
67
  --success: oklch(0.46 0.118 184.704);
68
68
  --success-foreground: oklch(0.984 0.003 247.858);
69
+ /* Success and warning drawn as text on --background and --card (a field's
70
+ valid or caution message), like --error-text: 92 % of the colour toward black. */
71
+ --success-text: color-mix(in oklab, var(--success) 92%, black);
69
72
  --info: oklch(0.48 0.165 254.624);
70
73
  --info-foreground: oklch(0.984 0.003 247.858);
71
74
  /* Amber, a hue apart from --error (27): a warning must not read as a
72
75
  failure. 5.7:1 as text on white, 5.0:1 on its 10% tint, 5.5:1 under near-white text. */
73
76
  --warning: oklch(0.52 0.13 62);
74
77
  --warning-foreground: oklch(0.984 0.003 247.858);
78
+ --warning-text: color-mix(in oklab, var(--warning) 92%, black);
75
79
  --destructive: var(--error);
76
80
  --border: oklch(0.912 0.016 293.7);
77
81
  --input: oklch(0.912 0.016 293.7);
@@ -172,6 +176,8 @@
172
176
  7.1:1, info 5.6:1, error 9.1:1). */
173
177
  --success: oklch(0.6 0.118 184.704);
174
178
  --success-foreground: oklch(0.995 0.002 291.3);
179
+ /* Dark: lightened toward white like --error-text, 5.3:1 on --background and --card. */
180
+ --success-text: color-mix(in oklab, var(--success) 76%, white);
175
181
  --info: oklch(0.707 0.165 254.624);
176
182
  --info-foreground: oklch(0.995 0.002 291.3);
177
183
  /* Amber too, as text: 7.2:1 on --background and 6.3:1 on --card, 6.4:1 and
@@ -179,6 +185,7 @@
179
185
  6.1:1 on a page and 5.6:1 on a Card. */
180
186
  --warning: oklch(0.7 0.15 70);
181
187
  --warning-foreground: oklch(0.995 0.002 291.3);
188
+ --warning-text: color-mix(in oklab, var(--warning) 76%, white);
182
189
  --destructive: oklch(0.704 0.191 22.216);
183
190
  --border: oklch(0.289 0.025 291.4);
184
191
  --input: oklch(0.328 0.027 291.4);
@@ -2,7 +2,7 @@
2
2
  * the date fields' shared bordered box (typed-box-expressive.css) and its segments
3
3
  * (segmented-input-expressive.css): "1 h 29 min", each amount followed by
4
4
  * its muted unit, then one −/+ pair. Every focus ring is drawn inside the
5
- * field (an inset outline), never clipped. The box keeps its focus boundary
5
+ * field (an inset outline), never clipped. The box keeps its focus ring
6
6
  * while a button has focus; the segments' chip tint only shows while a
7
7
  * segment has it. A coarse pointer gets 44px buttons; the 52px box (4px
8
8
  * around them) is its utilities' (duration-segments.tsx). */
@@ -67,7 +67,7 @@
67
67
  }
68
68
  }
69
69
 
70
- /* A button has focus: the box keeps its boundary, no segment its chip. */
70
+ /* A button has focus: the box keeps its ring, no segment its chip. */
71
71
  @media not ((pointer: coarse) or (max-width: 767.98px)) {
72
72
  .nxgt-duration-box.nxgt-field-box[data-tonal][data-focused]:not(
73
73
  :has(.nxgt-segment:focus)
@@ -84,65 +84,4 @@
84
84
  background: transparent;
85
85
  }
86
86
  }
87
-
88
- /* The −/+ pair: round, 4px apart, a ring inside each button. */
89
- .nxgt-duration-step {
90
- display: grid;
91
- flex: none;
92
- place-items: center;
93
- inline-size: var(--_dd-step);
94
- block-size: var(--_dd-step);
95
- border-radius: var(--nxgt-shape-corner-full);
96
- background: var(--_dd-btn);
97
- color: var(--primary-text);
98
- cursor: pointer;
99
- transition: background-color var(--nxgt-motion-effects-default-duration)
100
- var(--nxgt-motion-effects-default);
101
- }
102
- .nxgt-duration-step + .nxgt-duration-step {
103
- margin-inline-start: -0.25rem;
104
- }
105
- .nxgt-duration-step:hover:not(:disabled, [aria-disabled="true"]) {
106
- background: var(--_dd-btn-hover);
107
- }
108
- .nxgt-duration-step:focus-visible {
109
- outline: 2px solid var(--_fx-line, var(--nxgt-field-focus));
110
- outline-offset: -2px;
111
- }
112
- .nxgt-duration-step:is(:disabled, [aria-disabled="true"]) {
113
- cursor: not-allowed;
114
- }
115
- .nxgt-duration-step[aria-disabled="true"]:not(:disabled) {
116
- opacity: 0.38;
117
- }
118
- .nxgt-duration-box[data-disabled] .nxgt-duration-step {
119
- background: transparent;
120
- }
121
- .nxgt-duration-step svg {
122
- inline-size: 1rem;
123
- block-size: 1rem;
124
- }
125
-
126
- @media (prefers-reduced-motion: reduce) {
127
- .nxgt-duration-step {
128
- transition: none;
129
- }
130
- }
131
- @media (forced-colors: active) {
132
- .nxgt-duration-step {
133
- forced-color-adjust: none;
134
- border: 1px solid ButtonBorder;
135
- background: ButtonFace;
136
- color: ButtonText;
137
- }
138
- .nxgt-duration-step[aria-disabled="true"],
139
- .nxgt-duration-step:disabled {
140
- border-color: GrayText;
141
- color: GrayText;
142
- opacity: 1;
143
- }
144
- .nxgt-duration-step:focus-visible {
145
- outline-color: Highlight;
146
- }
147
- }
148
87
  }
@@ -1,8 +1,9 @@
1
1
  /* The date, range and time fields' box, over the field box. The same box at
2
- * rest as a text field (surface, hairline border, radius, hover and filled
3
- * tint: the shared bordered box, #2406), with a 2px primary boundary
4
- * while a segment has focus or the picker is open and an error boundary when
5
- * invalid. The segments are in segmented-input-expressive.css.
2
+ * rest as a text field (surface, hairline border, radius, hover: the
3
+ * shared bordered box), with the shared focus ring (1px primary
4
+ * border, 4px ring) while a segment has focus or the picker is open, and the
5
+ * shared error border when invalid. The segments are in
6
+ * segmented-input-expressive.css.
6
7
  * `data-tonal` belongs to the date and time fields: the typed box and
7
8
  * the sheet entry box. No other field sets it. */
8
9
  @layer components {
@@ -11,35 +12,43 @@
11
12
  --_fx-pill: var(--primary);
12
13
  --_fx-pill-fg: var(--primary-foreground);
13
14
  --_fx-line: var(--primary-text);
14
- --_fx-err: var(--error);
15
15
  }
16
16
  :is(.dark, [data-theme="dark"]) .nxgt-field-box.nxgt-field-box[data-tonal] {
17
17
  --_fx-tint: color-mix(in oklab, var(--primary) 34%, var(--background));
18
18
  --_fx-pill: var(--primary-text);
19
19
  --_fx-pill-fg: var(--background);
20
20
  }
21
- .nxgt-field-box.nxgt-field-box[data-tonal]:is(
22
- [data-focused],
23
- [data-open]:not([data-open="false"])
21
+ /* Focus, error, read-only and disabled are the shared field box's
22
+ * (field-box.css): the 1px primary border with the 4px ring, the error
23
+ * border, the dashed hairline, the recessed surface. Two cases the box
24
+ * does not see itself get the same ring here: the picker open, and a
25
+ * button around the box (a trigger) with keyboard focus. */
26
+ .nxgt-field-box.nxgt-field-box[data-tonal][data-open]:not(
27
+ [data-open="false"]
24
28
  ),
25
29
  button:focus-visible > .nxgt-field-box.nxgt-field-box[data-tonal] {
26
- border-color: var(--_fx-line);
27
- box-shadow: inset 0 0 0 1px var(--_fx-line);
30
+ border-color: var(--nxgt-field-focus);
31
+ box-shadow:
32
+ 0 0 0 1px var(--nxgt-field-focus),
33
+ 0 0 0 4px var(--nxgt-field-halo);
28
34
  }
29
35
  .nxgt-field-box.nxgt-field-box.nxgt-field-box[data-tonal][data-invalid]:not(
30
36
  [data-invalid="false"]
31
- ) {
32
- border-color: var(--_fx-err);
37
+ ):is([data-open]:not([data-open="false"])),
38
+ button:focus-visible
39
+ > .nxgt-field-box.nxgt-field-box.nxgt-field-box[data-tonal][data-invalid]:not(
40
+ [data-invalid="false"]
41
+ ) {
42
+ border-color: var(--nxgt-field-error);
43
+ box-shadow:
44
+ 0 0 0 1px var(--nxgt-field-error),
45
+ 0 0 0 4px var(--nxgt-field-halo-invalid);
33
46
  }
34
- .nxgt-field-box.nxgt-field-box.nxgt-field-box[data-tonal][data-invalid]:not(
35
- [data-invalid="false"]
36
- ):is([data-focused], [data-open]) {
37
- box-shadow: inset 0 0 0 1px var(--_fx-err);
38
- }
39
- .nxgt-field-box.nxgt-field-box[data-tonal][data-disabled] {
40
- border-color: var(--nxgt-field-border);
41
- background-color: var(--nxgt-field-bg);
42
- box-shadow: none;
47
+
48
+ @media (forced-colors: active) {
49
+ button:focus-visible > .nxgt-field-box.nxgt-field-box[data-tonal] {
50
+ outline: 2px solid Highlight;
51
+ }
43
52
  }
44
53
 
45
54
  /* The button that opens the picker: a tint circle, primary while open. */
@@ -0,0 +1,151 @@
1
+ /* NumberField `variant="score"`: a big tabular value with its maximum on the
2
+ * same baseline. No box at rest (a quiet band, 6% of the tone), a 1px frame on
3
+ * hover, the field focus ring on focus. A tone is text colour plus a shape
4
+ * marker (circle, triangle, diamond, square), never colour alone. Locked is a
5
+ * dashed frame with a lock; an error is the tone text with a border. The frame
6
+ * is one border on all sides (no start-side border on a rounded box). */
7
+ @layer components {
8
+ .nxgt-score {
9
+ --_sc-tone: var(--nxgt-tone-text, var(--foreground));
10
+ --_sc-frame: transparent;
11
+ display: inline-flex;
12
+ align-items: baseline;
13
+ gap: 0.375rem;
14
+ inline-size: fit-content;
15
+ max-inline-size: 100%;
16
+ padding: 0.25rem 0.75rem;
17
+ border: 1px solid var(--_sc-frame);
18
+ border-radius: var(--nxgt-field-radius, 0.5rem);
19
+ background: color-mix(in oklab, var(--_sc-tone) 6%, transparent);
20
+ color: var(--_sc-tone);
21
+ transition:
22
+ border-color var(--nxgt-motion-effects-default-duration)
23
+ var(--nxgt-motion-effects-default),
24
+ box-shadow var(--nxgt-motion-effects-default-duration)
25
+ var(--nxgt-motion-effects-default);
26
+ }
27
+ .nxgt-score:not([data-tone]) {
28
+ --_sc-tone: var(--foreground);
29
+ }
30
+ .nxgt-score:hover:not([data-disabled], [data-locked]) {
31
+ --_sc-frame: var(--nxgt-field-border-hover, var(--border));
32
+ }
33
+ .nxgt-score:focus-within {
34
+ --_sc-frame: var(--nxgt-field-focus);
35
+ box-shadow:
36
+ 0 0 0 1px var(--nxgt-field-focus),
37
+ 0 0 0 4px var(--nxgt-field-halo);
38
+ }
39
+ .nxgt-score[data-invalid] {
40
+ --_sc-frame: var(--nxgt-field-error);
41
+ box-shadow: inset 0 0 0 1px var(--nxgt-field-error);
42
+ }
43
+ .nxgt-score[data-invalid]:focus-within {
44
+ box-shadow:
45
+ 0 0 0 1px var(--nxgt-field-error),
46
+ 0 0 0 4px var(--nxgt-field-halo-invalid);
47
+ }
48
+
49
+ .nxgt-score-input {
50
+ field-sizing: content;
51
+ min-inline-size: 1ch;
52
+ max-inline-size: 100%;
53
+ padding: 0;
54
+ border: 0;
55
+ outline: 0;
56
+ background: transparent;
57
+ color: inherit;
58
+ font: inherit;
59
+ font-size: 1.75rem;
60
+ font-weight: 600;
61
+ line-height: 1.2;
62
+ font-variant-numeric: tabular-nums;
63
+ text-align: start;
64
+ }
65
+ .nxgt-score-input::placeholder {
66
+ color: var(--muted-foreground);
67
+ font-weight: 400;
68
+ }
69
+ .nxgt-score-max {
70
+ color: var(--muted-foreground);
71
+ font-size: 1rem;
72
+ font-variant-numeric: tabular-nums;
73
+ white-space: nowrap;
74
+ }
75
+
76
+ /* The tone's shape, filled with the text colour and centred on the value. */
77
+ .nxgt-score-shape {
78
+ align-self: center;
79
+ flex: none;
80
+ inline-size: 0.625rem;
81
+ block-size: 0.625rem;
82
+ background: currentColor;
83
+ }
84
+ .nxgt-score-shape[data-shape="circle"] {
85
+ border-radius: 50%;
86
+ }
87
+ .nxgt-score-shape[data-shape="triangle"] {
88
+ clip-path: polygon(50% 0, 100% 100%, 0 100%);
89
+ }
90
+ .nxgt-score-shape[data-shape="diamond"] {
91
+ clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%);
92
+ }
93
+
94
+ /* Locked: read-only, muted, a dashed frame and a lock. */
95
+ .nxgt-score[data-locked] {
96
+ --_sc-tone: var(--muted-foreground);
97
+ /* The dashed frame keeps 3:1 against the page (1.4.11). */
98
+ --_sc-frame: var(--nxgt-field-border, var(--border));
99
+ border-style: dashed;
100
+ background: transparent;
101
+ cursor: default;
102
+ }
103
+ /* Locked and invalid: the error colour, still dashed. */
104
+ .nxgt-score[data-locked][data-invalid] {
105
+ --_sc-frame: var(--nxgt-field-error);
106
+ }
107
+ .nxgt-score[data-locked] .nxgt-score-input {
108
+ cursor: default;
109
+ }
110
+ .nxgt-score-lock {
111
+ align-self: center;
112
+ flex: none;
113
+ inline-size: 0.875rem;
114
+ block-size: 0.875rem;
115
+ }
116
+ .nxgt-score[data-disabled] {
117
+ opacity: 0.6;
118
+ cursor: not-allowed;
119
+ }
120
+ .nxgt-score[data-disabled] .nxgt-score-input {
121
+ cursor: not-allowed;
122
+ }
123
+
124
+ /* No field-sizing: the markup sets `size` to the text's length, so the
125
+ * input stays as wide as its value and the max still hugs it. */
126
+ @supports not (field-sizing: content) {
127
+ .nxgt-score-input {
128
+ inline-size: auto;
129
+ min-inline-size: 1ch;
130
+ }
131
+ }
132
+
133
+ @media (forced-colors: active) {
134
+ .nxgt-score {
135
+ border-color: ButtonBorder;
136
+ background: transparent;
137
+ color: CanvasText;
138
+ }
139
+ .nxgt-score:focus-within {
140
+ border-color: Highlight;
141
+ outline: 2px solid Highlight;
142
+ }
143
+ .nxgt-score[data-invalid] {
144
+ border-color: Mark;
145
+ }
146
+ .nxgt-score-shape {
147
+ background: CanvasText;
148
+ forced-color-adjust: none;
149
+ }
150
+ }
151
+ }
@@ -0,0 +1,117 @@
1
+ /* QuantityField: the unit as a soft chip inside the field's one box, before the
2
+ * −/+ pair (field-stepper.css). The chip takes the steppers' tint; a focus on
3
+ * it draws the box's focus ring; a coarse pointer gets a 44px target. */
4
+ @layer components {
5
+ .nxgt-quantity-unit-addon {
6
+ --_dd-btn: color-mix(in oklab, var(--primary) 14%, var(--background));
7
+ --_dd-btn-hover: color-mix(in oklab, var(--primary) 22%, var(--background));
8
+ --_qty-chip: 1.75rem;
9
+ align-self: stretch;
10
+ margin-inline: 0.25rem;
11
+ cursor: default;
12
+ }
13
+ :is(.dark, [data-theme="dark"]) .nxgt-quantity-unit-addon {
14
+ --_dd-btn: color-mix(in oklab, var(--primary) 34%, var(--background));
15
+ --_dd-btn-hover: color-mix(in oklab, var(--primary) 44%, var(--background));
16
+ }
17
+
18
+ .nxgt-quantity-unit {
19
+ position: relative;
20
+ display: inline-flex;
21
+ align-items: center;
22
+ gap: 0.25rem;
23
+ min-inline-size: 0;
24
+ max-inline-size: 100%;
25
+ block-size: var(--_qty-chip);
26
+ padding-inline: 0.625rem 0.5rem;
27
+ border-radius: var(--nxgt-shape-corner-full);
28
+ background: var(--_dd-btn);
29
+ color: var(--primary-text);
30
+ font-size: 0.75rem;
31
+ font-weight: 600;
32
+ cursor: pointer;
33
+ outline: none;
34
+ transition: background-color var(--nxgt-motion-effects-default-duration)
35
+ var(--nxgt-motion-effects-default);
36
+ }
37
+ .nxgt-quantity-unit > span {
38
+ min-inline-size: 0;
39
+ overflow: hidden;
40
+ text-overflow: ellipsis;
41
+ white-space: nowrap;
42
+ }
43
+ .nxgt-quantity-unit svg {
44
+ flex: none;
45
+ inline-size: 0.875rem;
46
+ block-size: 0.875rem;
47
+ }
48
+ .nxgt-quantity-unit:hover:not(:disabled),
49
+ .nxgt-quantity-unit[aria-expanded="true"] {
50
+ background: var(--_dd-btn-hover);
51
+ }
52
+ .nxgt-quantity-unit:focus-visible {
53
+ outline: 2px solid var(--_fx-line, var(--nxgt-field-focus));
54
+ outline-offset: -2px;
55
+ }
56
+ .nxgt-quantity-unit:disabled {
57
+ cursor: not-allowed;
58
+ }
59
+ .nxgt-quantity-unit-addon[data-disabled] .nxgt-quantity-unit {
60
+ background: transparent;
61
+ color: var(--muted-foreground);
62
+ }
63
+
64
+ @media (pointer: coarse) {
65
+ .nxgt-quantity-unit-addon {
66
+ --_qty-chip: 2.25rem;
67
+ }
68
+ /* A transparent 44px target around the 36px chip. */
69
+ .nxgt-quantity-unit::after {
70
+ content: "";
71
+ position: absolute;
72
+ inset: -0.25rem -0.125rem;
73
+ }
74
+ }
75
+
76
+ /* The box's focus ring while the chip (not the value) has focus. */
77
+ .nxgt-field-box:where(:has(.nxgt-quantity-unit:focus-visible)) {
78
+ border-color: var(--nxgt-field-focus);
79
+ box-shadow:
80
+ 0 0 0 1px var(--nxgt-field-focus),
81
+ 0 0 0 4px var(--nxgt-field-halo);
82
+ }
83
+ .nxgt-field-box:where(
84
+ :has([data-slot][aria-invalid="true"]):has(
85
+ .nxgt-quantity-unit:focus-visible
86
+ )
87
+ ) {
88
+ border-color: var(--nxgt-field-error);
89
+ box-shadow:
90
+ 0 0 0 1px var(--nxgt-field-error),
91
+ 0 0 0 4px var(--nxgt-field-halo-invalid);
92
+ }
93
+
94
+ @media (prefers-reduced-motion: reduce) {
95
+ .nxgt-quantity-unit {
96
+ transition: none;
97
+ }
98
+ }
99
+ @media (forced-colors: active) {
100
+ .nxgt-quantity-unit {
101
+ forced-color-adjust: none;
102
+ border: 1px solid ButtonBorder;
103
+ background: ButtonFace;
104
+ color: ButtonText;
105
+ }
106
+ .nxgt-quantity-unit:focus-visible {
107
+ outline-color: Highlight;
108
+ }
109
+ .nxgt-quantity-unit[aria-expanded="true"] {
110
+ border-color: Highlight;
111
+ }
112
+ .nxgt-quantity-unit:disabled {
113
+ border-color: GrayText;
114
+ color: GrayText;
115
+ }
116
+ }
117
+ }
@@ -28,7 +28,6 @@
28
28
  .nxgt-field-box[data-size] {
29
29
  min-height: var(--nxgt-field-h);
30
30
  }
31
-
32
31
  .nxgt-field-box[data-open]:not([data-open="false"]) {
33
32
  border-color: var(--nxgt-field-focus);
34
33
  }
@@ -198,7 +197,7 @@
198
197
  font-variant-numeric: tabular-nums;
199
198
  }
200
199
  /* A soft chip in a box (a chips box) takes the page's surface, so it
201
- * reads apart from the box's tint. */
200
+ * reads apart from the box's surface. */
202
201
  .nxgt-field-box .nxgt-chip[data-look="soft"][data-tone="neutral"] {
203
202
  --chip-bg: var(--background);
204
203
  --chip-bg-hover: color-mix(