@nxgt/material 3.94.0 → 3.95.1

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 (391) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/README.md +6 -2
  3. package/dist/{alert-dialog-BaqK-rmd.js → alert-dialog-D4r0Kn9h.js} +1 -1
  4. package/dist/{async-slice-BfNpIJAH.js → async-slice-Bx438UlG.js} +1 -1
  5. package/dist/{button-CozGHXAv.js → button-Z_xcg10A.js} +1 -1
  6. package/dist/{calculator-BIx6cwgU.js → calculator-BfIBMiFX.js} +10 -10
  7. package/dist/calculator-field.js +6 -6
  8. package/dist/{calculator-segment-BsaxUtzL.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-DMEUGYdC.js → chip-Bb9SM3Ly.js} +2 -2
  12. package/dist/{code-editor-BWfky-aN.js → code-editor-Cw-dOrn2.js} +4 -4
  13. package/dist/code-editor.js +4 -4
  14. package/dist/{code-language-items-BUaNYJuw.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-CZpdAQMh.js → components-DXCfO95n.js} +13787 -13699
  26. package/dist/components.js +26 -27
  27. package/dist/{conversion-variant-aIBhul_U.js → conversion-variant-Ciii9Rbh.js} +4 -4
  28. package/dist/currency-field-DipsI0Bv.js +303 -0
  29. package/dist/{dialog-H40HjqXN.js → dialog-CFuONiW5.js} +3 -3
  30. package/dist/dnd.js +1 -1
  31. package/dist/{dropdown-menu-CawkIlW8.js → dropdown-menu-BvtBDoSD.js} +1 -1
  32. package/dist/editor.js +8 -8
  33. package/dist/{empty-state-sRVjgCis.js → empty-state-n2zb23YG.js} +1 -1
  34. package/dist/{financial-variant-Bqo9-swy.js → financial-variant-CTXTLbE_.js} +7 -7
  35. package/dist/{hooks-BTj_WJm9.js → hooks-zyRsvilJ.js} +2 -2
  36. package/dist/hooks.js +2 -2
  37. package/dist/{hover-card-BZU1DWGY.js → hover-card-BJ15hu7B.js} +1 -1
  38. package/dist/i18n.js +3 -3
  39. package/dist/{icon-badge-CXgvqMsM.js → icon-badge-B2ns44Cz.js} +1 -1
  40. package/dist/{icon-button-B9WjQ3RO.js → icon-button-BG438okX.js} +1 -1
  41. package/dist/lib/components/ui/fields/contacts/placeholders.d.ts +1 -1
  42. package/dist/lib/components/ui/fields/number-field/number-control.d.ts +10 -3
  43. package/dist/lib/components/ui/fields/number-field/number-field-base.d.ts +2 -0
  44. package/dist/lib/components/ui/fields/number-field/number-field.d.ts +7 -1
  45. package/dist/lib/components/ui/fields/number-field/number-field.types.d.ts +13 -0
  46. package/dist/lib/components/ui/fields/number-field/number-score-control.d.ts +19 -0
  47. package/dist/lib/components/ui/fields/number-field/number-stepper.d.ts +16 -2
  48. package/dist/lib/components/ui/fields/quantity-field/quantity-field.d.ts +4 -3
  49. package/dist/lib/components/ui/fields/quantity-field/quantity-row.d.ts +5 -9
  50. package/dist/lib/components/ui/fields/quantity-field/quantity-unit-menu.d.ts +19 -0
  51. package/dist/lib/components/ui/fields/quantity-field/quantity-unit.d.ts +11 -4
  52. package/dist/lib/components/ui/fields/quantity-field/use-unit-chip-name.d.ts +14 -0
  53. package/dist/lib/components/ui/fields/switch/partials/switch-row.d.ts +2 -2
  54. package/dist/lib/components/ui/fields/switch/switch.d.ts +2 -2
  55. package/dist/lib/components/ui/fields/text-field/text-field-units.d.ts +24 -0
  56. package/dist/lib/components/ui/fields/text-field/text-field.d.ts +9 -0
  57. package/dist/lib/components/ui/fields/verification-code/partials/code-surface.d.ts +13 -6
  58. package/dist/lib/components/ui/fields/verification-code/partials/recovery-input.d.ts +1 -1
  59. package/dist/lib/components/ui/layout/app-shell/app-sidebar-group.d.ts +12 -0
  60. package/dist/lib/components/ui/layout/app-shell/types.d.ts +7 -0
  61. package/dist/lib/components/ui/primitives/input-group/input-group.d.ts +1 -1
  62. package/dist/lib/i18n/resources/en/en.d.ts +5 -0
  63. package/dist/lib/i18n/resources/en/material.json.d.ts +7 -2
  64. package/dist/lib/i18n/resources/fr/fr.d.ts +5 -0
  65. package/dist/lib/i18n/resources/fr/material.json.d.ts +7 -2
  66. package/dist/lib/i18n/resources/resources.d.ts +10 -0
  67. package/dist/lib/i18n/translator.d.ts +1 -1
  68. package/dist/lib.js +1 -1
  69. package/dist/main.js +32 -33
  70. package/dist/map.js +8 -8
  71. package/dist/material.css +1 -1
  72. package/dist/pdf-reader.js +1 -1
  73. package/dist/percent-field-Cjc_3pP0.js +137 -0
  74. package/dist/{picker-surface-D2aYI4v7.js → picker-surface-Cr2n42qv.js} +4 -4
  75. package/dist/{popover-QQYPWzw6.js → popover-XBAX2Shp.js} +1 -1
  76. package/dist/{pos-types-BIeZGGAs.js → pos-types-BFVWeJki.js} +1 -1
  77. package/dist/{pos-variant-Cdn1AVoA.js → pos-variant-DWB8Bc12.js} +4 -4
  78. package/dist/print.js +1 -1
  79. package/dist/{programmer-variant-CMBybkqw.js → programmer-variant-B-wPnDeX.js} +2 -2
  80. package/dist/{public-CPxFxbi4.js → public-D1bH-KPQ.js} +9 -9
  81. package/dist/{rich-code-block-DKJ8eKzL.js → rich-code-block-DP2RT7pV.js} +5 -5
  82. package/dist/{scientific-variant-CXL1ayb7.js → scientific-variant-BP08Mo0g.js} +2 -2
  83. package/dist/{sortable-provider-BYqwwyr1.js → sortable-provider-CHGZrS0f.js} +2 -2
  84. package/dist/{spinner-D7ol2n_-.js → spinner-rk8J5y9O.js} +1 -1
  85. package/dist/styles.css +2 -0
  86. package/dist/{tabs-DyiFTy5g.js → tabs-nuYLggwC.js} +1 -1
  87. package/dist/text-field-DOndWDT5.js +169 -0
  88. package/dist/theme-picker.js +2 -2
  89. package/dist/{theme-toggle-QZ0bIrg9.js → theme-toggle-5waw9Wk8.js} +1 -1
  90. package/dist/{toolbar-items-BpOEBsSt.js → toolbar-items-Bo-nMzKJ.js} +4 -4
  91. package/dist/{translate-material-DlMetRSJ.js → translate-material-H5GMStyF.js} +1 -1
  92. package/dist/{translator-VtzVrnLm.js → translator-gdpQeToI.js} +14 -4
  93. package/dist/{use-chat-composer-DQ2rTD_q.js → use-chat-composer-DEd6GM2N.js} +23 -24
  94. package/dist/{use-heading-spy-17B5xa7B.js → use-heading-spy-n_wPa5jC.js} +4 -4
  95. package/dist/{use-material-translation-Cx5u36V5.js → use-material-translation-BW5HZMwt.js} +1 -1
  96. package/dist/{use-return-focus-S7g7q_Yn.js → use-return-focus-BC4sGh1b.js} +1 -1
  97. package/docs/README.md +1 -0
  98. package/docs/components/date-and-time.md +25 -23
  99. package/docs/components/form-fields.md +80 -26
  100. package/docs/components/navigation-and-layout.md +1 -1
  101. package/docs/guides/app-shell.md +15 -0
  102. package/docs/guides/field-look-2-x.md +10 -4
  103. package/docs/guides/field-look-refined.md +130 -0
  104. package/docs/guides/layouts.md +2 -1
  105. package/docs/guides/theming.md +39 -31
  106. package/docs/previews/backgrounds-icons-quiet-band.webp +0 -0
  107. package/docs/previews/backgrounds-icons.webp +0 -0
  108. package/docs/previews/backgrounds-matrix.webp +0 -0
  109. package/docs/previews/buttons-actions-actioncard.webp +0 -0
  110. package/docs/previews/buttons-actions-backlink.webp +0 -0
  111. package/docs/previews/buttons-actions-button.webp +0 -0
  112. package/docs/previews/buttons-actions-buttongroup.webp +0 -0
  113. package/docs/previews/buttons-actions-fab.webp +0 -0
  114. package/docs/previews/buttons-actions-fabmenu.webp +0 -0
  115. package/docs/previews/buttons-actions-iconbutton.webp +0 -0
  116. package/docs/previews/buttons-actions-languageswitcher.webp +0 -0
  117. package/docs/previews/buttons-actions-linkbutton.webp +0 -0
  118. package/docs/previews/buttons-actions-loadmorebutton.webp +0 -0
  119. package/docs/previews/buttons-actions-loadmorefooter.webp +0 -0
  120. package/docs/previews/buttons-actions-responsivebutton.webp +0 -0
  121. package/docs/previews/buttons-actions-scrolltolatestbutton.webp +0 -0
  122. package/docs/previews/buttons-actions-scrolltotop.webp +0 -0
  123. package/docs/previews/buttons-actions-splitbutton.webp +0 -0
  124. package/docs/previews/buttons-actions-themetoggle.webp +0 -0
  125. package/docs/previews/buttons-actions-toolbar-density-and-keyboard.webp +0 -0
  126. package/docs/previews/buttons-actions-toolbar.webp +0 -0
  127. package/docs/previews/data-display-accordioncard.webp +0 -0
  128. package/docs/previews/data-display-apiendpoint.webp +0 -0
  129. package/docs/previews/data-display-apioperation.webp +0 -0
  130. package/docs/previews/data-display-avatar.webp +0 -0
  131. package/docs/previews/data-display-badge.webp +0 -0
  132. package/docs/previews/data-display-card-presets.webp +0 -0
  133. package/docs/previews/data-display-changehistory.webp +0 -0
  134. package/docs/previews/data-display-chip.webp +0 -0
  135. package/docs/previews/data-display-codegroup.webp +0 -0
  136. package/docs/previews/data-display-description.webp +0 -0
  137. package/docs/previews/data-display-enrolmentcard.webp +0 -0
  138. package/docs/previews/data-display-enrolmentsecret.webp +0 -0
  139. package/docs/previews/data-display-metric-cards.webp +0 -0
  140. package/docs/previews/data-display-periodcards.webp +0 -0
  141. package/docs/previews/data-display-recoverycodes.webp +0 -0
  142. package/docs/previews/data-display-recoverycodesstatus.webp +0 -0
  143. package/docs/previews/data-display-secretcard.webp +0 -0
  144. package/docs/previews/data-display-terminal.webp +0 -0
  145. package/docs/previews/data-display-timeline.webp +0 -0
  146. package/docs/previews/data-display-tonevalue.webp +0 -0
  147. package/docs/previews/data-display-votetally.webp +0 -0
  148. package/docs/previews/data-table-filter-lists-datagrid.webp +0 -0
  149. package/docs/previews/data-table-filter-lists-datatable.webp +0 -0
  150. package/docs/previews/data-table-filter-lists-daygroupedlist.webp +0 -0
  151. package/docs/previews/data-table-filter-lists-drag-and-drop.webp +0 -0
  152. package/docs/previews/data-table-filter-lists-facetgroup.webp +0 -0
  153. package/docs/previews/data-table-filter-lists-filter.webp +0 -0
  154. package/docs/previews/data-table-filter-lists-listempty.webp +0 -0
  155. package/docs/previews/data-table-filter-lists-listpane.webp +0 -0
  156. package/docs/previews/data-table-filter-lists-markinglist.webp +0 -0
  157. package/docs/previews/data-table-filter-lists-pagination.webp +0 -0
  158. package/docs/previews/data-table-filter-lists-servertable.webp +0 -0
  159. package/docs/previews/data-table-filter-lists-tree.webp +0 -0
  160. package/docs/previews/date-time-agefield.webp +0 -0
  161. package/docs/previews/date-time-calendar-expressive.webp +0 -0
  162. package/docs/previews/date-time-calendar.webp +0 -0
  163. package/docs/previews/date-time-datefield.webp +0 -0
  164. package/docs/previews/date-time-daterangefield.webp +0 -0
  165. package/docs/previews/date-time-durationfield.webp +0 -0
  166. package/docs/previews/date-time-fields-expressive.webp +0 -0
  167. package/docs/previews/date-time-halfdayrangefield.webp +0 -0
  168. package/docs/previews/date-time-nowindicator.webp +0 -0
  169. package/docs/previews/date-time-timefield.webp +0 -0
  170. package/docs/previews/date-time-timepicker-tiles.webp +0 -0
  171. package/docs/previews/date-time-timepicker.webp +0 -0
  172. package/docs/previews/feedback-status-alert.webp +0 -0
  173. package/docs/previews/feedback-status-alertdialog.webp +0 -0
  174. package/docs/previews/feedback-status-celebration.webp +0 -0
  175. package/docs/previews/feedback-status-circularprogress.webp +0 -0
  176. package/docs/previews/feedback-status-confirmationdialog.webp +0 -0
  177. package/docs/previews/feedback-status-confirmdialog.webp +0 -0
  178. package/docs/previews/feedback-status-countdowntimer.webp +0 -0
  179. package/docs/previews/feedback-status-customalertdialog.webp +0 -0
  180. package/docs/previews/feedback-status-customdialog.webp +0 -0
  181. package/docs/previews/feedback-status-emptystate.webp +0 -0
  182. package/docs/previews/feedback-status-errorstate.webp +0 -0
  183. package/docs/previews/feedback-status-hydrateloading.webp +0 -0
  184. package/docs/previews/feedback-status-illustration-education.webp +0 -0
  185. package/docs/previews/feedback-status-illustration-game.webp +0 -0
  186. package/docs/previews/feedback-status-illustration-health.webp +0 -0
  187. package/docs/previews/feedback-status-illustration.webp +0 -0
  188. package/docs/previews/feedback-status-notificationrow.webp +0 -0
  189. package/docs/previews/feedback-status-notifications.webp +0 -0
  190. package/docs/previews/feedback-status-pageloadfailed.webp +0 -0
  191. package/docs/previews/feedback-status-progress.webp +0 -0
  192. package/docs/previews/feedback-status-skeleton.webp +0 -0
  193. package/docs/previews/feedback-status-spinner.webp +0 -0
  194. package/docs/previews/feedback-status-stalenotice.webp +0 -0
  195. package/docs/previews/feedback-status-stepupdialog-retry.webp +0 -0
  196. package/docs/previews/feedback-status-stepupdialog.webp +0 -0
  197. package/docs/previews/feedback-status-toast.webp +0 -0
  198. package/docs/previews/feedback-status-typingindicator.webp +0 -0
  199. package/docs/previews/feedback-status-unsaveddialog.webp +0 -0
  200. package/docs/previews/form-fields-attributes.webp +0 -0
  201. package/docs/previews/form-fields-choicelistfield.webp +0 -0
  202. package/docs/previews/form-fields-colorfield.webp +0 -0
  203. package/docs/previews/form-fields-contacts.webp +0 -0
  204. package/docs/previews/form-fields-countryfield.webp +0 -0
  205. package/docs/previews/form-fields-currencyfield.webp +0 -0
  206. package/docs/previews/form-fields-emailfield.webp +0 -0
  207. package/docs/previews/form-fields-field.webp +0 -0
  208. package/docs/previews/form-fields-formsection.webp +0 -0
  209. package/docs/previews/form-fields-inlineedit.webp +0 -0
  210. package/docs/previews/form-fields-inputgroupfield.webp +0 -0
  211. package/docs/previews/form-fields-localizedtextfields.webp +0 -0
  212. package/docs/previews/form-fields-markdowntextareafield.webp +0 -0
  213. package/docs/previews/form-fields-numberfield.webp +0 -0
  214. package/docs/previews/form-fields-openinghours.webp +0 -0
  215. package/docs/previews/form-fields-otpfield.webp +0 -0
  216. package/docs/previews/form-fields-passwordfield.webp +0 -0
  217. package/docs/previews/form-fields-percentfield.webp +0 -0
  218. package/docs/previews/form-fields-phonefield.webp +0 -0
  219. package/docs/previews/form-fields-postaladdress.webp +0 -0
  220. package/docs/previews/form-fields-repeatablegroup.webp +0 -0
  221. package/docs/previews/form-fields-searchfield.webp +0 -0
  222. package/docs/previews/form-fields-slider.webp +0 -0
  223. package/docs/previews/form-fields-switch.webp +0 -0
  224. package/docs/previews/form-fields-textareafield.webp +0 -0
  225. package/docs/previews/form-fields-textfield.webp +0 -0
  226. package/docs/previews/form-fields-timezonefield.webp +0 -0
  227. package/docs/previews/form-fields-urlfield.webp +0 -0
  228. package/docs/previews/form-fields-verificationcode.webp +0 -0
  229. package/docs/previews/foundations-themes-gallery.webp +0 -0
  230. package/docs/previews/foundations-themes-icon-motifs.webp +0 -0
  231. package/docs/previews/foundations-themes-nesting.webp +0 -0
  232. package/docs/previews/foundations-themes-provider.webp +0 -0
  233. package/docs/previews/foundations-themes-themepicker.webp +0 -0
  234. package/docs/previews/guides-i18n-i18nprovider.webp +0 -0
  235. package/docs/previews/guides-i18n-translated-components.webp +0 -0
  236. package/docs/previews/media-files-audioplayer.webp +0 -0
  237. package/docs/previews/media-files-camera.webp +0 -0
  238. package/docs/previews/media-files-carousel.webp +0 -0
  239. package/docs/previews/media-files-filelist.webp +0 -0
  240. package/docs/previews/media-files-filelistfield.webp +0 -0
  241. package/docs/previews/media-files-filepreview.webp +0 -0
  242. package/docs/previews/media-files-gallery-image-lists.webp +0 -0
  243. package/docs/previews/media-files-gallery-video.webp +0 -0
  244. package/docs/previews/media-files-gallery-viewer.webp +0 -0
  245. package/docs/previews/media-files-gallery.webp +0 -0
  246. package/docs/previews/media-files-imagecropper.webp +0 -0
  247. package/docs/previews/media-files-imageeditor.webp +0 -0
  248. package/docs/previews/media-files-imagefield.webp +0 -0
  249. package/docs/previews/media-files-lightboxgallery.webp +0 -0
  250. package/docs/previews/media-files-map.webp +0 -0
  251. package/docs/previews/media-files-mediaplayer.webp +0 -0
  252. package/docs/previews/media-files-mediaplayerhost.webp +0 -0
  253. package/docs/previews/media-files-mediaplayerlightbox.webp +0 -0
  254. package/docs/previews/media-files-mediaplayermini.webp +0 -0
  255. package/docs/previews/media-files-minigallery.webp +0 -0
  256. package/docs/previews/media-files-pdfreader.webp +0 -0
  257. package/docs/previews/media-files-uploadfield.webp +0 -0
  258. package/docs/previews/navigation-layout-appshell-blue-moon.webp +0 -0
  259. package/docs/previews/navigation-layout-appshell-footer-icon.webp +0 -0
  260. package/docs/previews/navigation-layout-appshell-menu-badge.webp +0 -0
  261. package/docs/previews/navigation-layout-appshell-page-ground.webp +0 -0
  262. package/docs/previews/navigation-layout-appshell-themes.webp +0 -0
  263. package/docs/previews/navigation-layout-appshell.webp +0 -0
  264. package/docs/previews/navigation-layout-authcard-split.webp +0 -0
  265. package/docs/previews/navigation-layout-authcard.webp +0 -0
  266. package/docs/previews/navigation-layout-background.webp +0 -0
  267. package/docs/previews/navigation-layout-breadcrumb.webp +0 -0
  268. package/docs/previews/navigation-layout-doc-api.webp +0 -0
  269. package/docs/previews/navigation-layout-doc-blocks.webp +0 -0
  270. package/docs/previews/navigation-layout-doc.webp +0 -0
  271. package/docs/previews/navigation-layout-editorlayout.webp +0 -0
  272. package/docs/previews/navigation-layout-hero.webp +0 -0
  273. package/docs/previews/navigation-layout-landinglayout.webp +0 -0
  274. package/docs/previews/navigation-layout-listdetailslayout.webp +0 -0
  275. package/docs/previews/navigation-layout-pager.webp +0 -0
  276. package/docs/previews/navigation-layout-recordpage.webp +0 -0
  277. package/docs/previews/navigation-layout-settingslayout.webp +0 -0
  278. package/docs/previews/navigation-layout-sidebar.webp +0 -0
  279. package/docs/previews/navigation-layout-steps.webp +0 -0
  280. package/docs/previews/navigation-layout-stickyactionbar.webp +0 -0
  281. package/docs/previews/navigation-layout-threadlayout-pages.webp +0 -0
  282. package/docs/previews/navigation-layout-toc.webp +0 -0
  283. package/docs/previews/overlays-menus-contextmenu.webp +0 -0
  284. package/docs/previews/overlays-menus-dialog.webp +0 -0
  285. package/docs/previews/overlays-menus-drawer.webp +0 -0
  286. package/docs/previews/overlays-menus-dropdownmenu.webp +0 -0
  287. package/docs/previews/overlays-menus-hovercard.webp +0 -0
  288. package/docs/previews/overlays-menus-popover.webp +0 -0
  289. package/docs/previews/overlays-menus-sheet.webp +0 -0
  290. package/docs/previews/overlays-menus-tooltip.webp +0 -0
  291. package/docs/previews/primitives-accordion.webp +0 -0
  292. package/docs/previews/primitives-card.webp +0 -0
  293. package/docs/previews/primitives-collapsible.webp +0 -0
  294. package/docs/previews/primitives-extendedlabel.webp +0 -0
  295. package/docs/previews/primitives-helpertext.webp +0 -0
  296. package/docs/previews/primitives-input.webp +0 -0
  297. package/docs/previews/primitives-inputgroup.webp +0 -0
  298. package/docs/previews/primitives-label.webp +0 -0
  299. package/docs/previews/primitives-scrollarea.webp +0 -0
  300. package/docs/previews/primitives-segmentednav.webp +0 -0
  301. package/docs/previews/primitives-tabs.webp +0 -0
  302. package/docs/previews/primitives-tabsnav.webp +0 -0
  303. package/docs/previews/primitives-textarea.webp +0 -0
  304. package/docs/previews/primitives-toggle.webp +0 -0
  305. package/docs/previews/primitives-togglegroup.webp +0 -0
  306. package/docs/previews/primitives-typography.webp +0 -0
  307. package/docs/previews/rich-widgets-calculator-conversion.webp +0 -0
  308. package/docs/previews/rich-widgets-chat-action-proposal.webp +0 -0
  309. package/docs/previews/rich-widgets-chat-advanced.webp +0 -0
  310. package/docs/previews/rich-widgets-chat-composer.webp +0 -0
  311. package/docs/previews/rich-widgets-chat-inbox.webp +0 -0
  312. package/docs/previews/rich-widgets-chat-overview.webp +0 -0
  313. package/docs/previews/rich-widgets-chat-thread.webp +0 -0
  314. package/docs/previews/rich-widgets-chat-widget.webp +0 -0
  315. package/docs/previews/rich-widgets-codeeditor.webp +0 -0
  316. package/docs/previews/rich-widgets-compacteditor.webp +0 -0
  317. package/docs/previews/rich-widgets-documenteditor.webp +0 -0
  318. package/docs/previews/rich-widgets-drawing.webp +0 -0
  319. package/docs/previews/rich-widgets-emojipicker.webp +0 -0
  320. package/docs/previews/rich-widgets-eventcalendar.webp +0 -0
  321. package/docs/previews/rich-widgets-kanban-phone-layout.webp +0 -0
  322. package/docs/previews/rich-widgets-kanban.webp +0 -0
  323. package/docs/previews/rich-widgets-mentionlist.webp +0 -0
  324. package/docs/previews/rich-widgets-native-charts-areachart.webp +0 -0
  325. package/docs/previews/rich-widgets-native-charts-barchart.webp +0 -0
  326. package/docs/previews/rich-widgets-native-charts-combochart.webp +0 -0
  327. package/docs/previews/rich-widgets-native-charts-donutchart.webp +0 -0
  328. package/docs/previews/rich-widgets-native-charts-funnelchart.webp +0 -0
  329. package/docs/previews/rich-widgets-native-charts-heatmapchart.webp +0 -0
  330. package/docs/previews/rich-widgets-native-charts-linechart-reference.webp +0 -0
  331. package/docs/previews/rich-widgets-native-charts-linechart.webp +0 -0
  332. package/docs/previews/rich-widgets-native-charts-palette.webp +0 -0
  333. package/docs/previews/rich-widgets-native-charts-piechart.webp +0 -0
  334. package/docs/previews/rich-widgets-native-charts-radarchart.webp +0 -0
  335. package/docs/previews/rich-widgets-native-charts-radialbarchart.webp +0 -0
  336. package/docs/previews/rich-widgets-native-charts-scatterchart.webp +0 -0
  337. package/docs/previews/rich-widgets-questioncard-rich-content.webp +0 -0
  338. package/docs/previews/rich-widgets-questionmediaview.webp +0 -0
  339. package/docs/previews/rich-widgets-questionnavigator.webp +0 -0
  340. package/docs/previews/rich-widgets-quiz.webp +0 -0
  341. package/docs/previews/rich-widgets-richchatcomposer.webp +0 -0
  342. package/docs/previews/rich-widgets-richtexteditor.webp +0 -0
  343. package/docs/previews/rich-widgets-richtextviewer.webp +0 -0
  344. package/docs/previews/selection-choice-autocomplete.webp +0 -0
  345. package/docs/previews/selection-choice-checkbox.webp +0 -0
  346. package/docs/previews/selection-choice-checkboxgroup.webp +0 -0
  347. package/docs/previews/selection-choice-checkcardfield.webp +0 -0
  348. package/docs/previews/selection-choice-chipgroupfield.webp +0 -0
  349. package/docs/previews/selection-choice-choicecardgroup.webp +0 -0
  350. package/docs/previews/selection-choice-combobox.webp +0 -0
  351. package/docs/previews/selection-choice-comboboxfield.webp +0 -0
  352. package/docs/previews/selection-choice-optiontile.webp +0 -0
  353. package/docs/previews/selection-choice-radiogroup.webp +0 -0
  354. package/docs/previews/selection-choice-select.webp +0 -0
  355. package/docs/previews/selection-choice-selectfield.webp +0 -0
  356. package/docs/previews/selection-choice-sortablelist.webp +0 -0
  357. package/docs/previews/selection-choice-switcher.webp +0 -0
  358. package/docs/previews/selection-choice-transferlist.webp +0 -0
  359. package/docs/previews/selection-choice-treeselectfield.webp +0 -0
  360. package/docs/roadmap.md +13 -10
  361. package/docs/troubleshooting.md +44 -0
  362. package/lib/components/components.css +7 -1
  363. package/lib/components/theme-tokens.css +7 -0
  364. package/lib/components/ui/dates/duration-field/duration-field-expressive.css +2 -63
  365. package/lib/components/ui/dates/picker-trigger/typed-box-expressive.css +30 -21
  366. package/lib/components/ui/fields/number-field/number-field-score.css +151 -0
  367. package/lib/components/ui/fields/quantity-field/quantity-field.css +117 -0
  368. package/lib/components/ui/primitives/field-box/field-box-parts.css +1 -2
  369. package/lib/components/ui/primitives/field-box/field-box-tokens.css +54 -36
  370. package/lib/components/ui/primitives/field-box/field-box.css +44 -86
  371. package/lib/components/ui/primitives/field-box/field-stepper.css +129 -0
  372. package/lib/styles.css +2 -0
  373. package/lib/themes/ambre.css +5 -1
  374. package/lib/themes/ardoise.css +5 -1
  375. package/lib/themes/bleumono.css +5 -1
  376. package/lib/themes/bluemoon.css +5 -1
  377. package/lib/themes/corail.css +5 -1
  378. package/lib/themes/foret.css +5 -1
  379. package/lib/themes/lavande.css +5 -1
  380. package/lib/themes/menthe.css +5 -1
  381. package/lib/themes/ocean.css +5 -1
  382. package/lib/themes/pink.css +5 -1
  383. package/lib/themes/prune.css +5 -1
  384. package/lib/themes/sable.css +5 -1
  385. package/lib/themes/slate.css +5 -1
  386. package/lib/themes/teal.css +5 -1
  387. package/package.json +2 -2
  388. package/dist/currency-field-IcEMAcAw.js +0 -289
  389. package/dist/input-group-Df9vp2EZ.js +0 -70
  390. package/dist/percent-field-DrI4_J7x.js +0 -14
  391. package/dist/text-field-BAdY-kpO.js +0 -59
package/CHANGELOG.md CHANGED
@@ -1,5 +1,47 @@
1
1
  # @nxgt/material
2
2
 
3
+ ## 3.95.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#2762](https://github.com/softistx/nxgt-material/pull/2762) [`061477e`](https://github.com/softistx/nxgt-material/commit/061477e2c8f111b4debf726aa4cfb46a4d6666de) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Fix: the input of a `TextField` with a text `leading` or `trailing` unit is at least 44px wide on a touch screen (the unit still follows the value), so tap-target checks that measure the input itself pass.
8
+
9
+ - [#2760](https://github.com/softistx/nxgt-material/pull/2760) [`eec0cad`](https://github.com/softistx/nxgt-material/commit/eec0cad48fd726208bd89a07aef6356afbb99f50) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Fix: a `TextField` with a text `leading` or `trailing` unit (3.95.0) hands the caller's `ref` to its input again (react-hook-form's `setFocus` and `ref.current.focus()` work), and a tap anywhere in the field box, not only on the content-sized input, focuses the input, so the tap target on a phone is the whole 44px box.
10
+
11
+ ## 3.95.0
12
+
13
+ ### Minor Changes
14
+
15
+ - [#2754](https://github.com/softistx/nxgt-material/pull/2754) [`6012a70`](https://github.com/softistx/nxgt-material/commit/6012a70a19962c5d01022b2d4f709dfe2135dc06) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Theme: add `--success-text` and `--warning-text` (`text-success-text`, `text-warning-text`), the success and warning colours drawn as text. Like `--error-text`, the theme generator solves them for every theme and preset so they keep 4.5:1 or more on `--background` and `--card` in light and dark, and the shipped preset stylesheets carry them. Regenerate a custom theme's stylesheet (`nxgt-theme` or the Vite plugin) to get them. [#2645](https://github.com/softistx/nxgt-material/issues/2645)
16
+
17
+ Fields: the field box (Input, Textarea, InputGroup, Select, Combobox, Autocomplete, TreeSelect, NativeSelect, PhoneField, the sheet and typed boxes) is drawn in the Refined look. The surface is the card, the rest border keeps 3:1 against it, hover firms the border, focus is a 1px primary border with a 4px ring (it replaces the 3px halo), an error is an error-text border with a 1px line inside, read-only is dashed and disabled is recessed. A filled field no longer takes the primary tint: `data-filled` stays, and the `--nxgt-field-bg-filled` tokens alias the rest ones (a read resolves; an override no longer paints, so style on `data-filled`). **A checked Switch row and a filled UploadField lose their primary tint too:** the row carries `data-checked` / `data-filled`, and the checked state is the track, the thumb and the primary label. Every `--nxgt-field-*` token keeps its name; `--nxgt-field-bg-disabled`, `--nxgt-field-border-readonly`, `--nxgt-field-border-disabled` and `--nxgt-field-error` are new. Forced colours are unchanged.
18
+
19
+ TextField: the icon or action in `leading` / `trailing` is muted with no well fill, and a text unit ("/ 20", a currency code) sits inline at the end of the box in muted text instead of a filled well. CurrencyField's trailing code and action follow.
20
+
21
+ Fields with their own box (the OTP slots, the verification code slots and recovery input, the inline edit display, the Switcher search, the ColorField swatch) take the field box tokens: `--nxgt-field-border` at rest, `--nxgt-field-border-hover` on hover, and the 1px `--nxgt-field-focus` border with the 4px `--nxgt-field-halo` ring on focus (an error takes `--nxgt-field-error` and `--nxgt-field-halo-invalid`). The verification code slots sit on the card fill instead of the tint. No API change. [#2650](https://github.com/softistx/nxgt-material/issues/2650)
22
+
23
+ NumberField: the box is one InputGroup (`role="group"`). The value is end-aligned in tabular figures, the suffix hugs it, and the "Decrease" and "Increase" buttons are the tinted round pair DurationField uses, together at the end of the box with no dividers (32px circles, a 44px target on a coarse pointer, their names kept; the two fields share one stylesheet, `field-stepper.css`). The steppers are ghost buttons in the box, no longer outlined buttons around it, so **the tab order is now the input, Decrease, Increase** (it was Decrease, input, Increase) and the number box is a `group` for assistive technology (groups now nest: a test that queries an unnamed `getByRole('group')` also matches number boxes, so name the one it means). With a CalculatorField the order is input, Open calculator, Decrease, Increase. The value input no longer carries `text-center` (it is `text-end`) and keeps room for about 7 digits. PercentField, QuantityField's number (through NumberControl; its number cell is 10.5rem wide so the whole value shows at 320px), CalculatorField, the Slider's readout, the Filter's number editors, the Attributes default inputs, the calculator's financial parts and DurationField's `fields` variant follow, as they all render NumberField. [#2648](https://github.com/softistx/nxgt-material/issues/2648)
24
+
25
+ DateField, DateRangeField, TimeField and DurationField: the typed box takes the field box's Refined focus instead of its own 2px inset boundary: the 1px primary border with the 4px ring while a segment (or, for DurationField, a button) has focus or the picker is open, the error border with the error ring when invalid, a dashed hairline when read-only and the recessed surface when disabled. The segment chips, the open button and the forced-colours and reduced-motion behaviour are unchanged. [#2649](https://github.com/softistx/nxgt-material/issues/2649)
26
+
27
+ QuantityField: the value, the unit and the −/+ pair are drawn in ONE field box. The value sits at the start in tabular figures, the unit is a soft chip (the steppers' tint, a ⇅ icon, capped at 52% of the box, a long label truncates with its `title`) before the round pair, and the box shows one focus ring whether the value or the unit has focus. The unit menu opens end-aligned under the chip: a listbox of `units` with the chosen one checked, or with `allowCustomUnit` a "Search or type a unit" input and a "Use “x”" item (it replaces the typed unit input and its datalist). **The unit no longer carries `required` or `aria-invalid`: a required unit is now the schema's job, not the field's.** Props, the `{ value, unit }` value, `unitLabel`, `unitPlaceholder`, the `<name>.unit` form input and QuantityFormField are unchanged. **The unit part is no longer a `combobox` (nor a text input with `allowCustomUnit`): it is a button named "Unit: mg" that opens a menu** (`unitLabel` or "<label> unit" now names the listbox, and the chip when no unit is chosen); tests that queried the unit by `combobox` role query the button. The tab order is value, unit, Decrease, Increase. New keys `material.quantity-field.unit-chip`, `.search` and `.use-typed` (en, fr). AgeField follows (its unit chip reads "Age unit: months"). [#2689](https://github.com/softistx/nxgt-material/issues/2689)
28
+
29
+ NumberField: new `variant?: 'default' | 'score'`, `tone?`, `locked?` and `lockedReason?`. A `score` is a big tabular value with its maximum (`suffix`, "/ 20") hugging it on the baseline: no box at rest (a quiet band, 6% of the tone), a 1px frame on hover, the field focus ring on focus, no steppers. The tone is the caller's and is text colour plus an `aria-hidden` shape marker, never colour alone (success a circle, warning a triangle, error a diamond, any other tone a square); an `error` draws the error tone with a border. `locked` is read-only with a muted value, a dashed frame and a lock, and `lockedReason` is shown under the value and added to `aria-describedby`. The default variant is unchanged. Styles ship in `number-field-score.css`. React only. [#2651](https://github.com/softistx/nxgt-material/issues/2651)
30
+
31
+ - [#2750](https://github.com/softistx/nxgt-material/pull/2750) [`10fc8c5`](https://github.com/softistx/nxgt-material/commit/10fc8c50461e1bf578d2767f3e5b3a48a5b8d922) Thanks [@SteveGT96](https://github.com/SteveGT96)! - feat(app-shell): `MenuItem.defaultExpanded` makes an entry's `children` foldable in the expanded sidebar, from a chevron button after the entry: `true` opens them at first, `false` folds them. Unset, they stay always listed. The phone's menu sheet and the other presets ignore it ([#2746](https://github.com/softistx/nxgt-material/issues/2746)). New keys `material.navigation.group-collapse` and `group-expand`.
32
+
33
+ ### Patch Changes
34
+
35
+ - [#2753](https://github.com/softistx/nxgt-material/pull/2753) [`d8b2e5b`](https://github.com/softistx/nxgt-material/commit/d8b2e5bc9970d3cf72b54ae50f475175fd928900) Thanks [@SteveGT96](https://github.com/SteveGT96)! - fix(navigation): `NavigationBar` and `NavigationToolbar` mark the entry a child page belongs to as current, even when the child's url is not under the entry's url.
36
+
37
+ - [#2754](https://github.com/softistx/nxgt-material/pull/2754) [`6012a70`](https://github.com/softistx/nxgt-material/commit/6012a70a19962c5d01022b2d4f709dfe2135dc06) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Docs: new `Guides/Recipes/Entry sheet` story — one row per person with a mark out of a total, a comment behind a toggle, locked rows, one sticky Save, per-row refusals and a stale-row notice — with its code in the plugin's `screen-recipes` skill.
38
+
39
+ - [#2754](https://github.com/softistx/nxgt-material/pull/2754) [`6012a70`](https://github.com/softistx/nxgt-material/commit/6012a70a19962c5d01022b2d4f709dfe2135dc06) Thanks [@SteveGT96](https://github.com/SteveGT96)! - Fix: `MarkdownTextareaFormField` marks the field touched when focus leaves the whole field, not when it moves from the textarea to the Write or Preview tab.
40
+
41
+ - [#2748](https://github.com/softistx/nxgt-material/pull/2748) [`2b5e1ab`](https://github.com/softistx/nxgt-material/commit/2b5e1ab0fb06370d560202d59eb302882707eaa0) Thanks [@SteveGT96](https://github.com/SteveGT96)! - fix(app-shell): the collapsed `AppSidebar` marks the entry a child page belongs to as current, even when the child's url is not under the entry's url.
42
+ - Updated dependencies [[`6012a70`](https://github.com/softistx/nxgt-material/commit/6012a70a19962c5d01022b2d4f709dfe2135dc06)]:
43
+ - @nxgt/material-core@0.55.0
44
+
3
45
  ## 3.94.0
4
46
 
5
47
  ### Minor Changes
package/README.md CHANGED
@@ -122,6 +122,9 @@ missing and the UI renders unstyled.
122
122
  Every field shares one radius, `--nxgt-field-radius`; set it once to change
123
123
  them all, and give a field of your own the same corners with `rounded-field`
124
124
  ([Theming, the field box](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/theming.md#the-field-box)).
125
+ The fields are drawn in the Refined look: the card surface, a border that keeps 3:1
126
+ against it, a 1px primary border with a 4px ring on focus, and no tint once filled
127
+ ([The Refined field look](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/field-look-refined.md)).
125
128
 
126
129
  `styles.css` also ships `.nxgt-touch-target`, which gives a small control of
127
130
  your own 44px of hit area on a coarse pointer ([Theming, touch targets](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/theming.md#touch-targets)).
@@ -568,6 +571,7 @@ Each area a consumer starts from has its own page under `docs/guides/`.
568
571
  | [SSR](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/ssr.md) | rendering on a server: what the barrels guarantee, and `import()` + `clientOnly` (React's `use(browser())`) for browser-only code |
569
572
  | [Content Security Policy](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/csp.md) | serving a strict CSP: the directives, `NonceProvider` and the per-request nonce, the components that still inject a `<style>`, the zod and KaTeX settings, a self-hosted font |
570
573
  | [The Vite plugin](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/vite-plugin.md) | adding `nxgtMaterial()` to `vite.config.ts`: the CSP by hash or nonce, self-hosted fonts, a build that checks the stylesheet, and each option's opt-out |
574
+ | [The Refined field look](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/field-look-refined.md) | the fields' current look (card surface, 3:1 border, 4px focus ring, no filled tint), what moved for tests (`NumberField` tab order, `QuantityField` unit button) and the tokens to tune it or bring a detail back |
571
575
  | [The field look (2.x)](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/field-look-2-x.md) | what changed in the fields' look during 2.x (corners, surface, hover, focus halo, error, read-only; the `Select`, `Combobox`, `Autocomplete` and `TreeSelectField` triggers and their connected lists, the 44px `NativeSelect`, the country, time-zone and phone fields, `SearchField`, the date and time fields' boxes and triggers, and the lists' headers, descriptions and empty state) and how to get the earlier look back |
572
576
  | [Moving to TopAppBar](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/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, its replacement, the visual changes (heights, flat bar) and the slot rename planned for the next major |
573
577
  | [Migrating to 3.0](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/guides/migrating-to-3.md) | upgrading from 2.x: the React 19.3 and React Router 8.5 peers, `ActivityLayout`'s default route transition (`routeTransition`), and each API removed in 3.0 with what replaces it, as search → replace pairs |
@@ -670,9 +674,9 @@ Not components: what the stylesheet gives any element.
670
674
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/form-fields-markdowntextareafield.webp" width="120" alt="MarkdownTextareaField"> | [`MarkdownTextareaField`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/form-fields.md#markdowntextareafield) · `MarkdownTextareaFormField` | Textarea for Markdown and math with a Write / Preview tab list. | not yet (#2719) |
671
675
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/form-fields-emailfield.webp" width="120" alt="EmailField"> | [`EmailField`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/form-fields.md#emailfield) · `EmailFormField` | Validates on blur; shows a `mailto:` button once the address is valid. | `EmailField`, `EmailFormField` |
672
676
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/form-fields-passwordfield.webp" width="120" alt="PasswordField"> | [`PasswordField`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/form-fields.md#passwordfield) · `PasswordFormField` | Show / hide toggle and an optional strength meter (`scorePassword`). | `PasswordField`, `PasswordFormField` |
673
- | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/form-fields-numberfield.webp" width="120" alt="NumberField"> | [`NumberField`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/form-fields.md#numberfield) · `NumberFormField` | Emits `number \| null`, with min / max / step clamping, +/− buttons and a suffix. | `NumberField`, `NumberFormField` |
677
+ | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/form-fields-numberfield.webp" width="120" alt="NumberField"> | [`NumberField`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/form-fields.md#numberfield) · `NumberFormField` | Emits `number \| null`, with min / max / step clamping, +/− buttons and a suffix; `variant="score"` (with `tone`, `locked`, `lockedReason`) is a big value out of its max. | `NumberField`, `NumberFormField` |
674
678
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/form-fields-percentfield.webp" width="120" alt="PercentField"> | [`PercentField`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/form-fields.md#percentfield) · `PercentFormField` | `NumberField` with a `%` suffix. | `PercentField`, `PercentFormField` |
675
- | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/form-fields-quantityfield.webp" width="120" alt="QuantityField"> | [`QuantityField`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/form-fields.md#quantityfield) · `QuantityFormField` | One labelled field holding an amount and its unit: a `NumberField` and a unit picker (or a typed unit) in one group, with one error message. | not yet |
679
+ | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/form-fields-quantityfield.webp" width="120" alt="QuantityField"> | [`QuantityField`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/form-fields.md#quantityfield) · `QuantityFormField` | One labelled field holding an amount and its unit: one box with a unit chip that opens a menu (or a typed unit), with one error message. | not yet |
676
680
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/form-fields-currencyfield.webp" width="120" alt="CurrencyField"> | [`CurrencyField`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/form-fields.md#currencyfield) · `CurrencyFormField` | Amount formatted to the locale on blur, with the currency's own decimals and a currency suffix (EUR by default). | `CurrencyField`, `CurrencyFormField` |
677
681
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/form-fields-phonefield.webp" width="120" alt="PhoneField"> | [`PhoneField`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/form-fields.md#phonefield) · `PhoneFormField` | International number with a country picker (the code a 32px pill in a 44px field box, its list connected); emits E.164; `PhoneFormField` refuses a half-typed number (`onValidityChange`, `isIncompletePhone`). | `PhoneField`, `PhoneFormField` |
678
682
  | <img src="https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/previews/form-fields-urlfield.webp" width="120" alt="UrlField"> | [`UrlField`](https://cdn.jsdelivr.net/npm/@nxgt/material@3/docs/components/form-fields.md#urlfield) · `UrlFormField` | Validates on blur; open-in-new-tab and copy buttons. | `UrlField`, `UrlFormField` |
@@ -4,7 +4,7 @@ import { o as n } from "./dist-DVRQkaTK.js";
4
4
  import { r } from "./dist-DWZXlCZR.js";
5
5
  import { a as i } from "./dist-DHdUUM1w.js";
6
6
  import { t as a } from "./in-dialog-D61Yeaol.js";
7
- import { a as o, c as s, d as c, i as l, l as u, n as d, o as f, r as p, s as m, t as h, u as g } from "./use-return-focus-S7g7q_Yn.js";
7
+ import { a as o, c as s, d as c, i as l, l as u, n as d, o as f, r as p, s as m, t as h, u as g } from "./use-return-focus-BC4sGh1b.js";
8
8
  import { i as _ } from "./escape-owner-DpaP0lm1.js";
9
9
  import * as v from "react";
10
10
  import { Fragment as y, isValidElement as b } from "react";
@@ -1,4 +1,4 @@
1
- import { l as e, r as t, s as n, u as r } from "./translator-VtzVrnLm.js";
1
+ import { l as e, r as t, s as n, u as r } from "./translator-gdpQeToI.js";
2
2
  import { t as i } from "./_baseIsEqual-C6ksIHya.js";
3
3
  import { useMemo as a } from "react";
4
4
  import { asyncThunkCreator as o, buildCreateSlice as s } from "@reduxjs/toolkit";
@@ -1,6 +1,6 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
2
  import { n as t, t as n } from "./dist-DVRQkaTK.js";
3
- import { n as r, t as i } from "./spinner-D7ol2n_-.js";
3
+ import { n as r, t as i } from "./spinner-rk8J5y9O.js";
4
4
  import { t as a } from "./dist-DkQbkF9T.js";
5
5
  import { a as o, i as s, n as c, o as l, s as u, t as d } from "./use-click-lock-Bwg_caHO.js";
6
6
  import { t as f } from "./is-production-GLw59WU8.js";
@@ -1,8 +1,8 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
- import { d as t, n, r, t as i } from "./tabs-DyiFTy5g.js";
3
- import { t as a } from "./button-CozGHXAv.js";
4
- import { t as o } from "./use-material-translation-Cx5u36V5.js";
5
- import { t as s } from "./icon-button-B9WjQ3RO.js";
2
+ import { d as t, n, r, t as i } from "./tabs-nuYLggwC.js";
3
+ import { t as a } from "./button-Z_xcg10A.js";
4
+ import { t as o } from "./use-material-translation-BW5HZMwt.js";
5
+ import { t as s } from "./icon-button-BG438okX.js";
6
6
  import { t as c } from "./copy-to-clipboard-Be5Ffvs_.js";
7
7
  import { t as l } from "./useEvent-2fKq-6w8.js";
8
8
  import { t as u } from "./useLatest-C2PnQEeD.js";
@@ -11,7 +11,7 @@ import { t as f } from "./skeleton-DSdtr2qc.js";
11
11
  import { t as p } from "./live-status-BGPaN8r8.js";
12
12
  import { n as m, t as h } from "./calculator-context-BugcKuVG.js";
13
13
  import { a as g, c as _, i as v, l as y, n as b, o as ee, r as te, s as ne } from "./calculator-announce-DRd2c6Dq.js";
14
- import { i as re, t as ie } from "./pos-types-BIeZGGAs.js";
14
+ import { i as re, t as ie } from "./pos-types-BFVWeJki.js";
15
15
  import { a as ae, r as oe } from "./key-layout-cR79xfGE.js";
16
16
  import { n as x, r as se, t as ce } from "./programmer-word-CNCF7DJF.js";
17
17
  import { t as le } from "./standard-layout-BuSRr3TY.js";
@@ -279,11 +279,11 @@ function Le({ helpId: e }) {
279
279
  //#endregion
280
280
  //#region lib/components/ui/widgets/calculator/variants/variant-loader.ts
281
281
  var Re = {
282
- scientific: () => import("./scientific-variant-CXL1ayb7.js"),
283
- pos: () => import("./pos-variant-Cdn1AVoA.js"),
284
- programmer: () => import("./programmer-variant-CMBybkqw.js"),
285
- financial: () => import("./financial-variant-Bqo9-swy.js"),
286
- conversion: () => import("./conversion-variant-aIBhul_U.js")
282
+ scientific: () => import("./scientific-variant-BP08Mo0g.js"),
283
+ pos: () => import("./pos-variant-DWB8Bc12.js"),
284
+ programmer: () => import("./programmer-variant-B-wPnDeX.js"),
285
+ financial: () => import("./financial-variant-CTXTLbE_.js"),
286
+ conversion: () => import("./conversion-variant-Ciii9Rbh.js")
287
287
  }, B = "failed", V = /* @__PURE__ */ new Map(), H = /* @__PURE__ */ new Map(), U = /* @__PURE__ */ new Set(), W = () => {
288
288
  for (let e of U) e();
289
289
  };
@@ -1,11 +1,11 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
- import { t } from "./button-CozGHXAv.js";
3
- import { t as n } from "./use-material-translation-Cx5u36V5.js";
4
- import { t as r } from "./icon-button-B9WjQ3RO.js";
5
- import { a as i, i as a, n as o, r as s, t as c } from "./picker-surface-D2aYI4v7.js";
6
- import { r as l, t as u } from "./currency-field-IcEMAcAw.js";
2
+ import { t } from "./button-Z_xcg10A.js";
3
+ import { t as n } from "./use-material-translation-BW5HZMwt.js";
4
+ import { t as r } from "./icon-button-BG438okX.js";
5
+ import { a as i, i as a, n as o, r as s, t as c } from "./picker-surface-Cr2n42qv.js";
6
+ import { r as l, t as u } from "./currency-field-DipsI0Bv.js";
7
7
  import { r as d, t as f } from "./field-blur-DkiZOVNV.js";
8
- import { t as p } from "./calculator-BIx6cwgU.js";
8
+ import { t as p } from "./calculator-BfIBMiFX.js";
9
9
  import { useId as m, useState as h } from "react";
10
10
  import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
11
11
  import { Calculator as y } from "lucide-react";
@@ -1,4 +1,4 @@
1
- import { t as e } from "./use-material-translation-Cx5u36V5.js";
1
+ import { t as e } from "./use-material-translation-BW5HZMwt.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region lib/components/ui/widgets/calculator/partials/calculator-segment.tsx
4
4
  function n({ label: n, choices: r, value: i, nameKey: a, onChange: o }) {
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "./calculator-BIx6cwgU.js";
1
+ import { n as e, t } from "./calculator-BfIBMiFX.js";
2
2
  export { e as CALCULATOR_VARIANTS, t as Calculator };
package/dist/charts.js CHANGED
@@ -1,12 +1,12 @@
1
1
  import { t as e } from "./ui.utils-CAnKTCw5.js";
2
2
  import { t } from "./utils-BLfntITJ.js";
3
3
  import { t as n } from "./warn-once-C_e47JM8.js";
4
- import { t as r } from "./button-CozGHXAv.js";
5
- import { t as i } from "./use-material-translation-Cx5u36V5.js";
4
+ import { t as r } from "./button-Z_xcg10A.js";
5
+ import { t as i } from "./use-material-translation-BW5HZMwt.js";
6
6
  import { t as a } from "./use-ssr-media-query-C6M5m8sf.js";
7
7
  import { i as o, n as s, r as c, t as l } from "./util-4heV2LPI.js";
8
8
  import { t as u } from "./useIsomorphicLayoutEffect-DfgAhWcH.js";
9
- import { t as d } from "./chip-DMEUGYdC.js";
9
+ import { t as d } from "./chip-Bb9SM3Ly.js";
10
10
  import { c as f, d as p, f as m, i as h, o as g, p as _, s as v, t as y } from "./line-path-C5pZGC49.js";
11
11
  import { t as b } from "./live-status-BGPaN8r8.js";
12
12
  import { t as x } from "./linear-G97mfnKF.js";
@@ -1,7 +1,7 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
- import { n as t } from "./spinner-D7ol2n_-.js";
2
+ import { n as t } from "./spinner-rk8J5y9O.js";
3
3
  import { s as n } from "./use-click-lock-Bwg_caHO.js";
4
- import { t as r } from "./use-material-translation-Cx5u36V5.js";
4
+ import { t as r } from "./use-material-translation-BW5HZMwt.js";
5
5
  import { t as i } from "./react-node-text-Crkpfpco.js";
6
6
  import { cloneElement as a, isValidElement as o } from "react";
7
7
  import { Fragment as s, jsx as c, jsxs as l } from "react/jsx-runtime";
@@ -1,12 +1,12 @@
1
1
  import { r as e } from "./rolldown-runtime-BFFgcFxR.js";
2
2
  import { t } from "./utils-BLfntITJ.js";
3
3
  import { t as n } from "./dist-DWZXlCZR.js";
4
- import { c as r, d as i, f as a, n as o, t as s } from "./dropdown-menu-CawkIlW8.js";
4
+ import { c as r, d as i, f as a, n as o, t as s } from "./dropdown-menu-BvtBDoSD.js";
5
5
  import { a as c, i as l, n as u } from "./field-blur-context-BLGgf_3z.js";
6
- import { a as d, o as f, r as p, s as m, t as h } from "./toolbar-items-BpOEBsSt.js";
6
+ import { a as d, o as f, r as p, s as m, t as h } from "./toolbar-items-Bo-nMzKJ.js";
7
7
  import { t as g } from "./is-production-GLw59WU8.js";
8
- import { t as _ } from "./use-material-translation-Cx5u36V5.js";
9
- import { i as v, n as y, o as b, t as x } from "./code-language-items-BUaNYJuw.js";
8
+ import { t as _ } from "./use-material-translation-BW5HZMwt.js";
9
+ import { i as v, n as y, o as b, t as x } from "./code-language-items-BVfxGKiv.js";
10
10
  import { t as S } from "./useIsomorphicLayoutEffect-DfgAhWcH.js";
11
11
  import { n as C, t as w } from "./escape-owner-DpaP0lm1.js";
12
12
  import { t as T } from "./skeleton-DSdtr2qc.js";
@@ -1,13 +1,13 @@
1
1
  import { t as e } from "./utils-BLfntITJ.js";
2
2
  import { t } from "./dist-DWZXlCZR.js";
3
- import { o as n, r, s as i, t as a } from "./toolbar-items-BpOEBsSt.js";
4
- import { t as o } from "./use-material-translation-Cx5u36V5.js";
5
- import { i as s, n as c, o as l } from "./code-language-items-BUaNYJuw.js";
3
+ import { o as n, r, s as i, t as a } from "./toolbar-items-Bo-nMzKJ.js";
4
+ import { t as o } from "./use-material-translation-BW5HZMwt.js";
5
+ import { i as s, n as c, o as l } from "./code-language-items-BVfxGKiv.js";
6
6
  import { t as u } from "./skeleton-DSdtr2qc.js";
7
7
  import { t as d } from "./live-status-BGPaN8r8.js";
8
8
  import { t as f } from "./use-mobile-BDro060N.js";
9
9
  import { t as p } from "./react-node-text-Crkpfpco.js";
10
- import { a as m, c as h, d as g, f as _, i as v, l as y, m as b, o as x, p as S, r as C, s as w, t as T, u as E } from "./code-editor-BWfky-aN.js";
10
+ import { a as m, c as h, d as g, f as _, i as v, l as y, m as b, o as x, p as S, r as C, s as w, t as T, u as E } from "./code-editor-Cw-dOrn2.js";
11
11
  import { r as D, t as O } from "./field-blur-DkiZOVNV.js";
12
12
  import { useEffect as k, useRef as A, useState as j } from "react";
13
13
  import { Fragment as M, jsx as N, jsxs as P } from "react/jsx-runtime";
@@ -1,5 +1,5 @@
1
- import { d as e, f as t } from "./dropdown-menu-CawkIlW8.js";
2
- import { t as n } from "./use-material-translation-Cx5u36V5.js";
1
+ import { d as e, f as t } from "./dropdown-menu-BvtBDoSD.js";
2
+ import { t as n } from "./use-material-translation-BW5HZMwt.js";
3
3
  import { t as r } from "./copy-to-clipboard-Be5Ffvs_.js";
4
4
  import { t as i } from "./live-status-BGPaN8r8.js";
5
5
  import { useEffect as a, useRef as o, useState as s } from "react";
@@ -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
+ }