@nvidia-elements/core 0.1.1 → 0.1.2

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 (332) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/_virtual/{_@oxc-project_runtime@0.128.0 → _@oxc-project_runtime@0.130.0}/helpers/decorate.js +1 -1
  3. package/dist/accordion/accordion2.js +5 -5
  4. package/dist/accordion/accordion2.js.map +1 -1
  5. package/dist/accordion/define.js.map +1 -1
  6. package/dist/alert/alert-group2.js +2 -2
  7. package/dist/alert/alert-group2.js.map +1 -1
  8. package/dist/alert/alert2.js +2 -2
  9. package/dist/alert/alert2.js.map +1 -1
  10. package/dist/alert/define.js.map +1 -1
  11. package/dist/avatar/avatar-group2.js +1 -1
  12. package/dist/avatar/avatar-group2.js.map +1 -1
  13. package/dist/avatar/avatar2.js +2 -2
  14. package/dist/avatar/avatar2.js.map +1 -1
  15. package/dist/avatar/define.js.map +1 -1
  16. package/dist/badge/badge2.js +2 -2
  17. package/dist/badge/badge2.js.map +1 -1
  18. package/dist/badge/define.js.map +1 -1
  19. package/dist/breadcrumb/breadcrumb2.js +2 -2
  20. package/dist/breadcrumb/breadcrumb2.js.map +1 -1
  21. package/dist/breadcrumb/define.js.map +1 -1
  22. package/dist/bundles/index.js +4 -4
  23. package/dist/button/button.js +1 -1
  24. package/dist/button/button.js.map +1 -1
  25. package/dist/button/button2.js +2 -2
  26. package/dist/button/button2.js.map +1 -1
  27. package/dist/button/define.js.map +1 -1
  28. package/dist/button-group/button-group2.js +2 -2
  29. package/dist/button-group/button-group2.js.map +1 -1
  30. package/dist/button-group/define.js.map +1 -1
  31. package/dist/card/card2.js +5 -5
  32. package/dist/card/card2.js.map +1 -1
  33. package/dist/card/define.js.map +1 -1
  34. package/dist/chat-message/chat-message2.js +2 -2
  35. package/dist/chat-message/chat-message2.js.map +1 -1
  36. package/dist/chat-message/define.js.map +1 -1
  37. package/dist/checkbox/checkbox-group2.js +2 -2
  38. package/dist/checkbox/checkbox-group2.js.map +1 -1
  39. package/dist/checkbox/checkbox2.js +2 -2
  40. package/dist/checkbox/checkbox2.js.map +1 -1
  41. package/dist/checkbox/define.js.map +1 -1
  42. package/dist/color/color2.js +2 -2
  43. package/dist/color/color2.js.map +1 -1
  44. package/dist/color/define.js.map +1 -1
  45. package/dist/combobox/combobox2.js +2 -2
  46. package/dist/combobox/combobox2.js.map +1 -1
  47. package/dist/combobox/define.js.map +1 -1
  48. package/dist/copy-button/copy-button2.js +2 -2
  49. package/dist/copy-button/copy-button2.js.map +1 -1
  50. package/dist/copy-button/define.js.map +1 -1
  51. package/dist/custom-elements.json +0 -12
  52. package/dist/data.snippets.json +18 -18
  53. package/dist/date/date2.js +2 -2
  54. package/dist/date/date2.js.map +1 -1
  55. package/dist/date/define.js.map +1 -1
  56. package/dist/datetime/datetime2.js +2 -2
  57. package/dist/datetime/datetime2.js.map +1 -1
  58. package/dist/datetime/define.js.map +1 -1
  59. package/dist/dialog/define.js.map +1 -1
  60. package/dist/dialog/dialog-footer2.js +2 -2
  61. package/dist/dialog/dialog-footer2.js.map +1 -1
  62. package/dist/dialog/dialog-header2.js +2 -2
  63. package/dist/dialog/dialog-header2.js.map +1 -1
  64. package/dist/dialog/dialog2.js +2 -2
  65. package/dist/dialog/dialog2.js.map +1 -1
  66. package/dist/divider/define.js.map +1 -1
  67. package/dist/divider/divider2.js +2 -2
  68. package/dist/divider/divider2.js.map +1 -1
  69. package/dist/dot/define.js.map +1 -1
  70. package/dist/dot/dot2.js +2 -2
  71. package/dist/dot/dot2.js.map +1 -1
  72. package/dist/drawer/define.js.map +1 -1
  73. package/dist/drawer/drawer-content2.js +2 -2
  74. package/dist/drawer/drawer-content2.js.map +1 -1
  75. package/dist/drawer/drawer-footer2.js +2 -2
  76. package/dist/drawer/drawer-footer2.js.map +1 -1
  77. package/dist/drawer/drawer-header2.js +2 -2
  78. package/dist/drawer/drawer-header2.js.map +1 -1
  79. package/dist/drawer/drawer2.js +2 -2
  80. package/dist/drawer/drawer2.js.map +1 -1
  81. package/dist/dropdown/define.js.map +1 -1
  82. package/dist/dropdown/dropdown-footer2.js +2 -2
  83. package/dist/dropdown/dropdown-footer2.js.map +1 -1
  84. package/dist/dropdown/dropdown-header2.js +2 -2
  85. package/dist/dropdown/dropdown-header2.js.map +1 -1
  86. package/dist/dropdown/dropdown2.js +2 -2
  87. package/dist/dropdown/dropdown2.js.map +1 -1
  88. package/dist/dropdown-group/define.js.map +1 -1
  89. package/dist/dropdown-group/dropdown-group.js +2 -2
  90. package/dist/dropdown-group/dropdown-group.js.map +1 -1
  91. package/dist/dropzone/define.js.map +1 -1
  92. package/dist/dropzone/dropzone.util.js.map +1 -1
  93. package/dist/dropzone/dropzone2.js +2 -2
  94. package/dist/dropzone/dropzone2.js.map +1 -1
  95. package/dist/file/define.js.map +1 -1
  96. package/dist/file/file2.js +1 -1
  97. package/dist/file/file2.js.map +1 -1
  98. package/dist/format-datetime/define.js.map +1 -1
  99. package/dist/format-datetime/format-datetime2.js +2 -2
  100. package/dist/format-datetime/format-datetime2.js.map +1 -1
  101. package/dist/format-number/define.js.map +1 -1
  102. package/dist/format-number/format-number2.js +2 -2
  103. package/dist/format-number/format-number2.js.map +1 -1
  104. package/dist/format-relative-time/define.js.map +1 -1
  105. package/dist/format-relative-time/format-relative-time2.js +2 -2
  106. package/dist/format-relative-time/format-relative-time2.js.map +1 -1
  107. package/dist/forms/control/control2.js +2 -2
  108. package/dist/forms/control/control2.js.map +1 -1
  109. package/dist/forms/control-group/control-group2.js +2 -2
  110. package/dist/forms/control-group/control-group2.js.map +1 -1
  111. package/dist/forms/control-message/control-message2.js +2 -2
  112. package/dist/forms/control-message/control-message2.js.map +1 -1
  113. package/dist/forms/define.js.map +1 -1
  114. package/dist/forms/utils/layout.js.map +1 -1
  115. package/dist/forms/utils/states.js.map +1 -1
  116. package/dist/grid/cell/cell2.js +1 -1
  117. package/dist/grid/cell/cell2.js.map +1 -1
  118. package/dist/grid/column/column2.js +2 -2
  119. package/dist/grid/column/column2.js.map +1 -1
  120. package/dist/grid/define.js.map +1 -1
  121. package/dist/grid/footer/footer2.js +2 -2
  122. package/dist/grid/footer/footer2.js.map +1 -1
  123. package/dist/grid/grid2.js +2 -2
  124. package/dist/grid/grid2.js.map +1 -1
  125. package/dist/grid/header/header2.js +2 -2
  126. package/dist/grid/header/header2.js.map +1 -1
  127. package/dist/grid/placeholder/placeholder2.js +1 -1
  128. package/dist/grid/placeholder/placeholder2.js.map +1 -1
  129. package/dist/grid/row/row2.js +2 -2
  130. package/dist/grid/row/row2.js.map +1 -1
  131. package/dist/icon/define.js.map +1 -1
  132. package/dist/icon/icon2.js +3 -3
  133. package/dist/icon/icon2.js.map +1 -1
  134. package/dist/icon/icons.js.map +1 -1
  135. package/dist/icon/server.js.map +1 -1
  136. package/dist/icon-button/define.js.map +1 -1
  137. package/dist/icon-button/icon-button2.js +2 -2
  138. package/dist/icon-button/icon-button2.js.map +1 -1
  139. package/dist/index.js +1 -1
  140. package/dist/input/define.js.map +1 -1
  141. package/dist/input/input-group2.js +1 -1
  142. package/dist/input/input-group2.js.map +1 -1
  143. package/dist/input/input2.js +2 -2
  144. package/dist/input/input2.js.map +1 -1
  145. package/dist/internal/base/button.js +1 -1
  146. package/dist/internal/base/button.js.map +1 -1
  147. package/dist/internal/controllers/audit.controller.js.map +1 -1
  148. package/dist/internal/controllers/i18n.controller.js.map +1 -1
  149. package/dist/internal/controllers/keynav-grid.controller.js.map +1 -1
  150. package/dist/internal/controllers/keynav-list.controller.js.map +1 -1
  151. package/dist/internal/controllers/state-active.controller.js.map +1 -1
  152. package/dist/internal/controllers/state-current.controller.js.map +1 -1
  153. package/dist/internal/controllers/state-disabled.controller.js.map +1 -1
  154. package/dist/internal/controllers/state-expanded.controller.js.map +1 -1
  155. package/dist/internal/controllers/state-highlighted.controller.js.map +1 -1
  156. package/dist/internal/controllers/state-pressed.controller.js.map +1 -1
  157. package/dist/internal/controllers/state-scroll.controller.js.map +1 -1
  158. package/dist/internal/controllers/state-selected.controller.js.map +1 -1
  159. package/dist/internal/controllers/type-anchor.controller.js.map +1 -1
  160. package/dist/internal/controllers/type-button.controller.js.map +1 -1
  161. package/dist/internal/controllers/type-closable.controller.js.map +1 -1
  162. package/dist/internal/controllers/type-command.controller.js.map +1 -1
  163. package/dist/internal/controllers/type-expandable.controller.js.map +1 -1
  164. package/dist/internal/controllers/type-interest.controller.js.map +1 -1
  165. package/dist/internal/controllers/type-native-popover-trigger.controller.js.map +1 -1
  166. package/dist/internal/controllers/type-native-popover.controller.js.map +1 -1
  167. package/dist/internal/controllers/type-native-popover.utils.js.map +1 -1
  168. package/dist/internal/controllers/type-selectable.controller.js.map +1 -1
  169. package/dist/internal/controllers/type-ssr.controller.js.map +1 -1
  170. package/dist/internal/controllers/type-submit.controller.js.map +1 -1
  171. package/dist/internal/controllers/type-touch.controller.js.map +1 -1
  172. package/dist/internal/decorators/host-attr.js.map +1 -1
  173. package/dist/internal/decorators/scoped-registry.js.map +1 -1
  174. package/dist/internal/services/global.service.js +1 -1
  175. package/dist/internal/services/global.service.js.map +1 -1
  176. package/dist/internal/services/global.utils.js +6 -8
  177. package/dist/internal/services/global.utils.js.map +1 -1
  178. package/dist/internal/services/i18n.service.js.map +1 -1
  179. package/dist/internal/services/log.service.js.map +1 -1
  180. package/dist/internal/services/transition.service.js.map +1 -1
  181. package/dist/internal/styles/index.js.map +1 -1
  182. package/dist/internal/styles/popover2.js.map +1 -1
  183. package/dist/internal/types/index.js.map +1 -1
  184. package/dist/internal/utils/a11y.js.map +1 -1
  185. package/dist/internal/utils/audit-logs.d.ts +0 -1
  186. package/dist/internal/utils/audit-logs.js +1 -4
  187. package/dist/internal/utils/audit-logs.js.map +1 -1
  188. package/dist/internal/utils/audit.js.map +1 -1
  189. package/dist/internal/utils/dom.js.map +1 -1
  190. package/dist/internal/utils/events.js.map +1 -1
  191. package/dist/internal/utils/focus.js.map +1 -1
  192. package/dist/internal/utils/keynav.js.map +1 -1
  193. package/dist/internal/utils/objects.js.map +1 -1
  194. package/dist/internal/utils/strings.js.map +1 -1
  195. package/dist/internal/utils/supports.js.map +1 -1
  196. package/dist/logo/define.js.map +1 -1
  197. package/dist/logo/logo2.js +2 -2
  198. package/dist/logo/logo2.js.map +1 -1
  199. package/dist/menu/define.js.map +1 -1
  200. package/dist/menu/menu-item2.js +2 -2
  201. package/dist/menu/menu-item2.js.map +1 -1
  202. package/dist/menu/menu2.js +2 -2
  203. package/dist/menu/menu2.js.map +1 -1
  204. package/dist/month/define.js.map +1 -1
  205. package/dist/month/month2.js +2 -2
  206. package/dist/month/month2.js.map +1 -1
  207. package/dist/notification/define.js.map +1 -1
  208. package/dist/notification/notification-group2.js +2 -2
  209. package/dist/notification/notification-group2.js.map +1 -1
  210. package/dist/notification/notification2.js +2 -2
  211. package/dist/notification/notification2.js.map +1 -1
  212. package/dist/page/define.js.map +1 -1
  213. package/dist/page/page-panel/page-panel-content2.js +1 -1
  214. package/dist/page/page-panel/page-panel-content2.js.map +1 -1
  215. package/dist/page/page-panel/page-panel-footer2.js +2 -2
  216. package/dist/page/page-panel/page-panel-footer2.js.map +1 -1
  217. package/dist/page/page-panel/page-panel-header2.js +2 -2
  218. package/dist/page/page-panel/page-panel-header2.js.map +1 -1
  219. package/dist/page/page-panel/page-panel2.js +2 -2
  220. package/dist/page/page-panel/page-panel2.js.map +1 -1
  221. package/dist/page/page2.js +2 -2
  222. package/dist/page/page2.js.map +1 -1
  223. package/dist/page-header/define.js.map +1 -1
  224. package/dist/page-header/page-header2.js +1 -1
  225. package/dist/page-header/page-header2.js.map +1 -1
  226. package/dist/page-loader/define.js.map +1 -1
  227. package/dist/page-loader/page-loader2.js +2 -2
  228. package/dist/page-loader/page-loader2.js.map +1 -1
  229. package/dist/pagination/define.js.map +1 -1
  230. package/dist/pagination/pagination2.js +2 -2
  231. package/dist/pagination/pagination2.js.map +1 -1
  232. package/dist/panel/define.js.map +1 -1
  233. package/dist/panel/panel2.js +5 -5
  234. package/dist/panel/panel2.js.map +1 -1
  235. package/dist/password/define.js.map +1 -1
  236. package/dist/password/password2.js +2 -2
  237. package/dist/password/password2.js.map +1 -1
  238. package/dist/polyfills/custom-state-set.js.map +1 -1
  239. package/dist/polyfills/index.js.map +1 -1
  240. package/dist/preferences-input/define.js.map +1 -1
  241. package/dist/preferences-input/preferences-input2.js +2 -2
  242. package/dist/preferences-input/preferences-input2.js.map +1 -1
  243. package/dist/progress-bar/define.js.map +1 -1
  244. package/dist/progress-bar/progress-bar2.js +2 -2
  245. package/dist/progress-bar/progress-bar2.js.map +1 -1
  246. package/dist/progress-ring/define.js.map +1 -1
  247. package/dist/progress-ring/progress-ring2.js +2 -2
  248. package/dist/progress-ring/progress-ring2.js.map +1 -1
  249. package/dist/progressive-filter-chip/define.js.map +1 -1
  250. package/dist/progressive-filter-chip/progressive-filter-chip2.js +2 -2
  251. package/dist/progressive-filter-chip/progressive-filter-chip2.js.map +1 -1
  252. package/dist/pulse/define.js.map +1 -1
  253. package/dist/pulse/pulse2.js +2 -2
  254. package/dist/pulse/pulse2.js.map +1 -1
  255. package/dist/radio/define.js.map +1 -1
  256. package/dist/radio/radio-group2.js +2 -2
  257. package/dist/radio/radio-group2.js.map +1 -1
  258. package/dist/radio/radio2.js +2 -2
  259. package/dist/radio/radio2.js.map +1 -1
  260. package/dist/range/define.js.map +1 -1
  261. package/dist/range/range2.js +2 -2
  262. package/dist/range/range2.js.map +1 -1
  263. package/dist/resize-handle/define.js.map +1 -1
  264. package/dist/resize-handle/resize-handle2.js +2 -2
  265. package/dist/resize-handle/resize-handle2.js.map +1 -1
  266. package/dist/search/define.js.map +1 -1
  267. package/dist/search/search2.js +2 -2
  268. package/dist/search/search2.js.map +1 -1
  269. package/dist/select/define.js.map +1 -1
  270. package/dist/select/select2.js +2 -2
  271. package/dist/select/select2.js.map +1 -1
  272. package/dist/skeleton/define.js.map +1 -1
  273. package/dist/skeleton/skeleton2.js +2 -2
  274. package/dist/skeleton/skeleton2.js.map +1 -1
  275. package/dist/sort-button/define.js.map +1 -1
  276. package/dist/sort-button/sort-button2.js +2 -2
  277. package/dist/sort-button/sort-button2.js.map +1 -1
  278. package/dist/sparkline/define.js.map +1 -1
  279. package/dist/sparkline/sparkline.utils.js.map +1 -1
  280. package/dist/sparkline/sparkline2.js +2 -2
  281. package/dist/sparkline/sparkline2.js.map +1 -1
  282. package/dist/star-rating/define.js.map +1 -1
  283. package/dist/star-rating/star-rating2.js +2 -2
  284. package/dist/star-rating/star-rating2.js.map +1 -1
  285. package/dist/steps/define.js.map +1 -1
  286. package/dist/steps/steps2.js +3 -3
  287. package/dist/steps/steps2.js.map +1 -1
  288. package/dist/switch/define.js.map +1 -1
  289. package/dist/switch/switch-group2.js +2 -2
  290. package/dist/switch/switch-group2.js.map +1 -1
  291. package/dist/switch/switch2.js +2 -2
  292. package/dist/switch/switch2.js.map +1 -1
  293. package/dist/tabs/define.js.map +1 -1
  294. package/dist/tabs/tabs-group2.js +2 -2
  295. package/dist/tabs/tabs-group2.js.map +1 -1
  296. package/dist/tabs/tabs2.js +3 -3
  297. package/dist/tabs/tabs2.js.map +1 -1
  298. package/dist/tag/define.js.map +1 -1
  299. package/dist/tag/tag2.js +2 -2
  300. package/dist/tag/tag2.js.map +1 -1
  301. package/dist/textarea/define.js.map +1 -1
  302. package/dist/textarea/textarea2.js +1 -1
  303. package/dist/textarea/textarea2.js.map +1 -1
  304. package/dist/time/define.js.map +1 -1
  305. package/dist/time/time2.js +2 -2
  306. package/dist/time/time2.js.map +1 -1
  307. package/dist/toast/define.js.map +1 -1
  308. package/dist/toast/toast2.js +2 -2
  309. package/dist/toast/toast2.js.map +1 -1
  310. package/dist/toggletip/define.js.map +1 -1
  311. package/dist/toggletip/toggletip-footer2.js +2 -2
  312. package/dist/toggletip/toggletip-footer2.js.map +1 -1
  313. package/dist/toggletip/toggletip-header2.js +2 -2
  314. package/dist/toggletip/toggletip-header2.js.map +1 -1
  315. package/dist/toggletip/toggletip2.js +2 -2
  316. package/dist/toggletip/toggletip2.js.map +1 -1
  317. package/dist/toolbar/define.js.map +1 -1
  318. package/dist/toolbar/toolbar2.js +2 -2
  319. package/dist/toolbar/toolbar2.js.map +1 -1
  320. package/dist/tooltip/define.js.map +1 -1
  321. package/dist/tooltip/tooltip2.js +2 -2
  322. package/dist/tooltip/tooltip2.js.map +1 -1
  323. package/dist/tree/define.js.map +1 -1
  324. package/dist/tree/tree-node2.js +2 -2
  325. package/dist/tree/tree-node2.js.map +1 -1
  326. package/dist/tree/tree2.js +2 -2
  327. package/dist/tree/tree2.js.map +1 -1
  328. package/dist/tree/utils.js.map +1 -1
  329. package/dist/week/define.js.map +1 -1
  330. package/dist/week/week2.js +2 -2
  331. package/dist/week/week2.js.map +1 -1
  332. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"format-number2.js","names":["#rawValue","#resolvedLocale","#parsedNumber","#formatOptions","#formattedNumber","#onSlotChange"],"sources":["../../src/format-number/format-number.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport { useStyles, typeSSR, LogService } from '@nvidia-elements/core/internal';\nimport styles from './format-number.css?inline';\n\nexport type FormatNumberStyle = 'decimal' | 'currency' | 'percent' | 'unit';\nexport type CurrencyDisplayOption = 'symbol' | 'code' | 'name' | 'narrowSymbol';\nexport type CurrencySignOption = 'standard' | 'accounting';\nexport type NotationOption = 'standard' | 'scientific' | 'engineering' | 'compact';\nexport type CompactDisplayOption = 'short' | 'long';\nexport type UnitDisplayOption = 'short' | 'long' | 'narrow';\nexport type SignDisplayOption = 'auto' | 'never' | 'always' | 'exceptZero';\n\nconst STRING_KEYS: [keyof FormatNumber, string][] = [\n ['currency', 'currency'],\n ['currencyDisplay', 'currencyDisplay'],\n ['currencySign', 'currencySign'],\n ['notation', 'notation'],\n ['compactDisplay', 'compactDisplay'],\n ['unit', 'unit'],\n ['unitDisplay', 'unitDisplay'],\n ['signDisplay', 'signDisplay']\n];\n\nconst NUMBER_KEYS: [keyof FormatNumber, string][] = [\n ['minimumFractionDigits', 'minimumFractionDigits'],\n ['maximumFractionDigits', 'maximumFractionDigits'],\n ['minimumIntegerDigits', 'minimumIntegerDigits']\n];\n\n/**\n * @element nve-format-number\n * @description A localized number formatter for currencies, percentages, units, and compact notation, backed by Intl.NumberFormat.\n * Provide a `currency` attribute when `formatStyle` is `currency`, and a `unit` attribute when `formatStyle` is `unit`.\n * @since 0.0.0\n * @entrypoint \\@nvidia-elements/core/format-number\n * @slot - Numeric string to format (such as 1234567 or 1234.56). Serves as fallback before hydration.\n */\n@typeSSR()\nexport class FormatNumber extends LitElement {\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-format-number',\n version: '0.0.0'\n };\n\n /**\n * Optional numeric string for values supplied by JavaScript or bound data.\n * By default, the component formats the element's text content, which also serves as the SSR fallback.\n * When both are present, this property takes precedence.\n */\n @property({ type: String }) number?: string;\n\n /**\n * Language tag (such as en-US, de-DE). Defaults to document.documentElement.lang or browser default.\n */\n @property({ type: String }) locale?: string;\n\n /**\n * Formatting style: 'decimal' | 'currency' | 'percent' | 'unit'.\n */\n @property({ type: String, attribute: 'format-style' }) formatStyle: FormatNumberStyle = 'decimal';\n\n /**\n * ISO 4217 currency code (such as USD or EUR). Required when formatStyle is currency.\n */\n @property({ type: String }) currency?: string;\n\n /**\n * Currency sign style: 'standard' | 'accounting'.\n */\n @property({ type: String, attribute: 'currency-sign' }) currencySign?: CurrencySignOption;\n\n /**\n * Currency display style: 'symbol' | 'code' | 'name' | 'narrowSymbol'.\n */\n @property({ type: String, attribute: 'currency-display' }) currencyDisplay?: CurrencyDisplayOption;\n\n /**\n * Unit identifier (such as kilometer or byte). Required when formatStyle is unit.\n */\n @property({ type: String }) unit?: string;\n\n /**\n * Unit display style: 'short' | 'long' | 'narrow'.\n */\n @property({ type: String, attribute: 'unit-display' }) unitDisplay?: UnitDisplayOption;\n\n /**\n * Number notation: 'standard' | 'scientific' | 'engineering' | 'compact'.\n */\n @property({ type: String }) notation?: NotationOption;\n\n /**\n * Compact notation display: 'short' | 'long'. Only applies when notation is compact.\n */\n @property({ type: String, attribute: 'compact-display' }) compactDisplay?: CompactDisplayOption;\n\n /**\n * Sign display: 'auto' | 'never' | 'always' | 'exceptZero'.\n */\n @property({ type: String, attribute: 'sign-display' }) signDisplay?: SignDisplayOption;\n\n /**\n * Grouping separators: 'auto' | 'always' | 'min2' | 'true' | 'false'.\n */\n @property({ type: String, attribute: 'use-grouping' }) useGrouping?: string;\n\n /**\n * Pad fraction output to at least this many digits (0-20).\n */\n @property({ type: Number, attribute: 'minimum-fraction-digits' }) minimumFractionDigits?: number;\n\n /**\n * Round fraction output to at most this many digits (0-20).\n */\n @property({ type: Number, attribute: 'maximum-fraction-digits' }) maximumFractionDigits?: number;\n\n /**\n * Pad integer output to at least this many digits (1-21).\n */\n @property({ type: Number, attribute: 'minimum-integer-digits' }) minimumIntegerDigits?: number;\n\n get #rawValue(): string {\n return this.number ?? this.textContent?.trim() ?? '';\n }\n\n get #resolvedLocale(): string | undefined {\n return this.locale ?? (globalThis.document?.documentElement?.lang || undefined);\n }\n\n get #parsedNumber(): number | null {\n const raw = this.#rawValue;\n if (!raw) return null;\n\n const numericValue = Number(raw);\n if (Number.isFinite(numericValue)) return numericValue;\n\n LogService.warn(`format-number: invalid numeric value \"${raw}\"`);\n return null;\n }\n\n get #formatOptions(): Intl.NumberFormatOptions {\n const options: Intl.NumberFormatOptions = { style: this.formatStyle };\n\n for (const [prop, key] of STRING_KEYS) {\n const value = this[prop] as string | undefined;\n if (value !== undefined) (options as Record<string, unknown>)[key] = value;\n }\n\n for (const [prop, key] of NUMBER_KEYS) {\n const value = this[prop] as number | undefined;\n if (value !== undefined) (options as Record<string, unknown>)[key] = value;\n }\n\n if (this.useGrouping !== undefined) {\n const grouping = this.useGrouping === 'false' ? false : this.useGrouping === 'true' ? true : this.useGrouping;\n (options as Record<string, unknown>).useGrouping = grouping;\n }\n\n return options;\n }\n\n get #formattedNumber(): string {\n const raw = this.#rawValue;\n if (!raw) return '';\n\n const numericValue = this.#parsedNumber;\n if (numericValue === null) return raw;\n\n try {\n return new Intl.NumberFormat(this.#resolvedLocale, this.#formatOptions).format(numericValue);\n } catch (e) {\n LogService.warn(`format-number: ${(e as Error).message}`);\n return raw;\n }\n }\n\n render() {\n return html`<data internal-host value=${this.#rawValue}>${this.#formattedNumber}<slot @slotchange=${this.#onSlotChange} hidden></slot></data>`;\n }\n\n #onSlotChange() {\n this.requestUpdate();\n }\n}\n"],"mappings":";;;;;;;;AAgBA,IAAM,IAA8C;CAClD,CAAC,YAAY,WAAW;CACxB,CAAC,mBAAmB,kBAAkB;CACtC,CAAC,gBAAgB,eAAe;CAChC,CAAC,YAAY,WAAW;CACxB,CAAC,kBAAkB,iBAAiB;CACpC,CAAC,QAAQ,OAAO;CAChB,CAAC,eAAe,cAAc;CAC9B,CAAC,eAAe,cAAA;CACjB,EAEK,IAA8C;CAClD,CAAC,yBAAyB,wBAAwB;CAClD,CAAC,yBAAyB,wBAAwB;CAClD,CAAC,wBAAwB,uBAAA;CAC1B,EAWM,IAAA,cAA2B,EAAW;;kCAuB6C;;;gBAtBxE,EAAU,CAAC,EAAO,CAAC;;;kBAER;GACzB,KAAK;GACL,SAAS;GACV;;CA+ED,IAAIA,KAAoB;EACtB,OAAO,KAAK,UAAU,KAAK,aAAa,MAAM,IAAI;;CAGpD,IAAIC,KAAsC;EACxC,OAAO,KAAK,WAAW,WAAW,UAAU,iBAAiB,QAAQ,KAAA;;CAGvE,IAAIC,KAA+B;EACjC,IAAM,IAAM,KAAKF;EACjB,IAAI,CAAC,GAAK,OAAO;EAEjB,IAAM,IAAe,OAAO,EAAI;EAIhC,OAHI,OAAO,SAAS,EAAa,GAAS,KAE1C,EAAW,KAAK,yCAAyC,EAAI,GAAG,EACzD;;CAGT,IAAIG,KAA2C;EAC7C,IAAM,IAAoC,EAAE,OAAO,KAAK,aAAa;EAErE,KAAK,IAAM,CAAC,GAAM,MAAQ,GAAa;GACrC,IAAM,IAAQ,KAAK;GACnB,AAAI,MAAU,KAAA,MAAW,EAAqC,KAAO;;EAGvE,KAAK,IAAM,CAAC,GAAM,MAAQ,GAAa;GACrC,IAAM,IAAQ,KAAK;GACnB,AAAI,MAAU,KAAA,MAAW,EAAqC,KAAO;;EAQvE,OALI,KAAK,gBAAgB,KAAA,MAEvB,EAAqC,cADpB,KAAK,gBAAgB,UAAU,KAAQ,KAAK,gBAAgB,SAAS,KAAO,KAAK,cAI7F;;CAGT,IAAIC,KAA2B;EAC7B,IAAM,IAAM,KAAKJ;EACjB,IAAI,CAAC,GAAK,OAAO;EAEjB,IAAM,IAAe,KAAKE;EAC1B,IAAI,MAAiB,MAAM,OAAO;EAElC,IAAI;GACF,OAAO,IAAI,KAAK,aAAa,KAAKD,IAAiB,KAAKE,GAAe,CAAC,OAAO,EAAa;WACrF,GAAG;GAEV,OADA,EAAW,KAAK,kBAAmB,EAAY,UAAU,EAClD;;;CAIX,SAAS;EACP,OAAO,CAAI,8BAA6B,KAAKH,GAAU,IAAG,KAAKI,GAAiB,qBAAoB,KAAKC,GAAc;;CAGzH,KAAgB;EACd,KAAK,eAAe;;;GApIrB,EAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,EAAA,WAAA,UAAA,KAAA,EAAA,KAK1B,EAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,EAAA,WAAA,UAAA,KAAA,EAAA,KAK1B,EAAS;CAAE,MAAM;CAAQ,WAAW;CAAgB,CAAC,CAAA,EAAA,EAAA,WAAA,eAAA,KAAA,EAAA,KAKrD,EAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,EAAA,WAAA,YAAA,KAAA,EAAA,KAK1B,EAAS;CAAE,MAAM;CAAQ,WAAW;CAAiB,CAAC,CAAA,EAAA,EAAA,WAAA,gBAAA,KAAA,EAAA,KAKtD,EAAS;CAAE,MAAM;CAAQ,WAAW;CAAoB,CAAC,CAAA,EAAA,EAAA,WAAA,mBAAA,KAAA,EAAA,KAKzD,EAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,EAAA,WAAA,QAAA,KAAA,EAAA,KAK1B,EAAS;CAAE,MAAM;CAAQ,WAAW;CAAgB,CAAC,CAAA,EAAA,EAAA,WAAA,eAAA,KAAA,EAAA,KAKrD,EAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,EAAA,WAAA,YAAA,KAAA,EAAA,KAK1B,EAAS;CAAE,MAAM;CAAQ,WAAW;CAAmB,CAAC,CAAA,EAAA,EAAA,WAAA,kBAAA,KAAA,EAAA,KAKxD,EAAS;CAAE,MAAM;CAAQ,WAAW;CAAgB,CAAC,CAAA,EAAA,EAAA,WAAA,eAAA,KAAA,EAAA,KAKrD,EAAS;CAAE,MAAM;CAAQ,WAAW;CAAgB,CAAC,CAAA,EAAA,EAAA,WAAA,eAAA,KAAA,EAAA,KAKrD,EAAS;CAAE,MAAM;CAAQ,WAAW;CAA2B,CAAC,CAAA,EAAA,EAAA,WAAA,yBAAA,KAAA,EAAA,KAKhE,EAAS;CAAE,MAAM;CAAQ,WAAW;CAA2B,CAAC,CAAA,EAAA,EAAA,WAAA,yBAAA,KAAA,EAAA,KAKhE,EAAS;CAAE,MAAM;CAAQ,WAAW;CAA0B,CAAC,CAAA,EAAA,EAAA,WAAA,wBAAA,KAAA,EAAA,SApFjE,GAAS,CAAA,EAAA,EAAA"}
1
+ {"version":3,"file":"format-number2.js","names":["#rawValue","#resolvedLocale","#parsedNumber","#formatOptions","#formattedNumber","#onSlotChange"],"sources":["../../src/format-number/format-number.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport { useStyles, typeSSR, LogService } from '@nvidia-elements/core/internal';\nimport styles from './format-number.css?inline';\n\nexport type FormatNumberStyle = 'decimal' | 'currency' | 'percent' | 'unit';\nexport type CurrencyDisplayOption = 'symbol' | 'code' | 'name' | 'narrowSymbol';\nexport type CurrencySignOption = 'standard' | 'accounting';\nexport type NotationOption = 'standard' | 'scientific' | 'engineering' | 'compact';\nexport type CompactDisplayOption = 'short' | 'long';\nexport type UnitDisplayOption = 'short' | 'long' | 'narrow';\nexport type SignDisplayOption = 'auto' | 'never' | 'always' | 'exceptZero';\n\nconst STRING_KEYS: [keyof FormatNumber, string][] = [\n ['currency', 'currency'],\n ['currencyDisplay', 'currencyDisplay'],\n ['currencySign', 'currencySign'],\n ['notation', 'notation'],\n ['compactDisplay', 'compactDisplay'],\n ['unit', 'unit'],\n ['unitDisplay', 'unitDisplay'],\n ['signDisplay', 'signDisplay']\n];\n\nconst NUMBER_KEYS: [keyof FormatNumber, string][] = [\n ['minimumFractionDigits', 'minimumFractionDigits'],\n ['maximumFractionDigits', 'maximumFractionDigits'],\n ['minimumIntegerDigits', 'minimumIntegerDigits']\n];\n\n/**\n * @element nve-format-number\n * @description A localized number formatter for currencies, percentages, units, and compact notation, backed by Intl.NumberFormat.\n * Provide a `currency` attribute when `formatStyle` is `currency`, and a `unit` attribute when `formatStyle` is `unit`.\n * @since 0.0.0\n * @entrypoint \\@nvidia-elements/core/format-number\n * @slot - Numeric string to format (such as 1234567 or 1234.56). Serves as fallback before hydration.\n */\n@typeSSR()\nexport class FormatNumber extends LitElement {\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-format-number',\n version: '0.0.0'\n };\n\n /**\n * Optional numeric string for values supplied by JavaScript or bound data.\n * By default, the component formats the element's text content, which also serves as the SSR fallback.\n * When both are present, this property takes precedence.\n */\n @property({ type: String }) number?: string;\n\n /**\n * Language tag (such as en-US, de-DE). Defaults to document.documentElement.lang or browser default.\n */\n @property({ type: String }) locale?: string;\n\n /**\n * Formatting style: 'decimal' | 'currency' | 'percent' | 'unit'.\n */\n @property({ type: String, attribute: 'format-style' }) formatStyle: FormatNumberStyle = 'decimal';\n\n /**\n * ISO 4217 currency code (such as USD or EUR). Required when formatStyle is currency.\n */\n @property({ type: String }) currency?: string;\n\n /**\n * Currency sign style: 'standard' | 'accounting'.\n */\n @property({ type: String, attribute: 'currency-sign' }) currencySign?: CurrencySignOption;\n\n /**\n * Currency display style: 'symbol' | 'code' | 'name' | 'narrowSymbol'.\n */\n @property({ type: String, attribute: 'currency-display' }) currencyDisplay?: CurrencyDisplayOption;\n\n /**\n * Unit identifier (such as kilometer or byte). Required when formatStyle is unit.\n */\n @property({ type: String }) unit?: string;\n\n /**\n * Unit display style: 'short' | 'long' | 'narrow'.\n */\n @property({ type: String, attribute: 'unit-display' }) unitDisplay?: UnitDisplayOption;\n\n /**\n * Number notation: 'standard' | 'scientific' | 'engineering' | 'compact'.\n */\n @property({ type: String }) notation?: NotationOption;\n\n /**\n * Compact notation display: 'short' | 'long'. Only applies when notation is compact.\n */\n @property({ type: String, attribute: 'compact-display' }) compactDisplay?: CompactDisplayOption;\n\n /**\n * Sign display: 'auto' | 'never' | 'always' | 'exceptZero'.\n */\n @property({ type: String, attribute: 'sign-display' }) signDisplay?: SignDisplayOption;\n\n /**\n * Grouping separators: 'auto' | 'always' | 'min2' | 'true' | 'false'.\n */\n @property({ type: String, attribute: 'use-grouping' }) useGrouping?: string;\n\n /**\n * Pad fraction output to at least this many digits (0-20).\n */\n @property({ type: Number, attribute: 'minimum-fraction-digits' }) minimumFractionDigits?: number;\n\n /**\n * Round fraction output to at most this many digits (0-20).\n */\n @property({ type: Number, attribute: 'maximum-fraction-digits' }) maximumFractionDigits?: number;\n\n /**\n * Pad integer output to at least this many digits (1-21).\n */\n @property({ type: Number, attribute: 'minimum-integer-digits' }) minimumIntegerDigits?: number;\n\n get #rawValue(): string {\n return this.number ?? this.textContent?.trim() ?? '';\n }\n\n get #resolvedLocale(): string | undefined {\n return this.locale ?? (globalThis.document?.documentElement?.lang || undefined);\n }\n\n get #parsedNumber(): number | null {\n const raw = this.#rawValue;\n if (!raw) return null;\n\n const numericValue = Number(raw);\n if (Number.isFinite(numericValue)) return numericValue;\n\n LogService.warn(`format-number: invalid numeric value \"${raw}\"`);\n return null;\n }\n\n get #formatOptions(): Intl.NumberFormatOptions {\n const options: Intl.NumberFormatOptions = { style: this.formatStyle };\n\n for (const [prop, key] of STRING_KEYS) {\n const value = this[prop] as string | undefined;\n if (value !== undefined) (options as Record<string, unknown>)[key] = value;\n }\n\n for (const [prop, key] of NUMBER_KEYS) {\n const value = this[prop] as number | undefined;\n if (value !== undefined) (options as Record<string, unknown>)[key] = value;\n }\n\n if (this.useGrouping !== undefined) {\n const grouping = this.useGrouping === 'false' ? false : this.useGrouping === 'true' ? true : this.useGrouping;\n (options as Record<string, unknown>).useGrouping = grouping;\n }\n\n return options;\n }\n\n get #formattedNumber(): string {\n const raw = this.#rawValue;\n if (!raw) return '';\n\n const numericValue = this.#parsedNumber;\n if (numericValue === null) return raw;\n\n try {\n return new Intl.NumberFormat(this.#resolvedLocale, this.#formatOptions).format(numericValue);\n } catch (e) {\n LogService.warn(`format-number: ${(e as Error).message}`);\n return raw;\n }\n }\n\n render() {\n return html`<data internal-host value=${this.#rawValue}>${this.#formattedNumber}<slot @slotchange=${this.#onSlotChange} hidden></slot></data>`;\n }\n\n #onSlotChange() {\n this.requestUpdate();\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"define.js","names":[],"sources":["../../src/format-relative-time/define.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { define } from '@nvidia-elements/core/internal';\nimport { FormatRelativeTime } from '@nvidia-elements/core/format-relative-time';\n\ndefine(FormatRelativeTime);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nve-format-relative-time': FormatRelativeTime;\n }\n}\n"],"mappings":";;;AAMA,EAAO,EAAmB"}
1
+ {"version":3,"file":"define.js","names":[],"sources":["../../src/format-relative-time/define.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { define } from '@nvidia-elements/core/internal';\nimport { FormatRelativeTime } from '@nvidia-elements/core/format-relative-time';\n\ndefine(FormatRelativeTime);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nve-format-relative-time': FormatRelativeTime;\n }\n}\n"],"mappings":";;;AAMA,EAAO,CAAkB"}
@@ -1,5 +1,5 @@
1
1
  import { LogService as e } from "../internal/services/log.service.js";
2
- import { __decorate as t } from "../_virtual/_@oxc-project_runtime@0.128.0/helpers/decorate.js";
2
+ import { __decorate as t } from "../_virtual/_@oxc-project_runtime@0.130.0/helpers/decorate.js";
3
3
  import { typeSSR as n } from "../internal/controllers/type-ssr.controller.js";
4
4
  import { useStyles as r } from "../internal/styles/index.js";
5
5
  import i from "./format-relative-time.js";
@@ -53,7 +53,7 @@ var c = {
53
53
  static {
54
54
  this.metadata = {
55
55
  tag: "nve-format-relative-time",
56
- version: "0.1.1"
56
+ version: "0.1.2"
57
57
  };
58
58
  }
59
59
  #e;
@@ -1 +1 @@
1
- {"version":3,"file":"format-relative-time2.js","names":["#dateValue","#resolvedLocale","#computeUnit","#computeExplicitUnit","#formattedRelativeTime","#resolveValueAndUnit","#stopSync","#timer","#startSync","#getSyncInterval","#onSlotChange"],"sources":["../../src/format-relative-time/format-relative-time.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport { useStyles, typeSSR, LogService } from '@nvidia-elements/core/internal';\nimport styles from './format-relative-time.css?inline';\n\ntype TimeUnitOption = 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year';\n\nconst UNIT_DIVISORS: Record<TimeUnitOption, number> = {\n second: 1000,\n minute: 60000,\n hour: 3600000,\n day: 86400000,\n week: 604800000,\n month: 2592000000,\n year: 31536000000\n};\n\nconst THRESHOLDS: { unit: TimeUnitOption; max: number }[] = [\n { unit: 'second', max: 60 },\n { unit: 'minute', max: 60 },\n { unit: 'hour', max: 24 },\n { unit: 'day', max: 7 },\n { unit: 'week', max: 4 },\n { unit: 'month', max: 12 },\n { unit: 'year', max: Number.POSITIVE_INFINITY }\n];\n\n/**\n * @element nve-format-relative-time\n * @description Formats a date/time value as localized relative text using the Intl.RelativeTimeFormat API. Renders inside a semantic time element.\n * Options mirror the Intl.RelativeTimeFormat API. When unit is 'auto', the component selects the best unit based on the time difference.\n * @since 0.0.0\n * @entrypoint \\@nvidia-elements/core/format-relative-time\n * @slot - Date string to format (such as 2023-07-28T04:20:17.434Z). Serves as fallback before hydration.\n */\n@typeSSR()\nexport class FormatRelativeTime extends LitElement {\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-format-relative-time',\n version: '0.0.0'\n };\n\n /**\n * Optional date string for values supplied by JavaScript or bound data.\n * By default, the component formats the element's text content, which also serves as the SSR fallback.\n * When both are present, this property takes precedence.\n */\n @property({ type: String }) date?: string;\n\n /**\n * Language tag (such as en-US, de-DE). Defaults to document.documentElement.lang or browser default.\n */\n @property({ type: String }) locale?: string;\n\n /**\n * Numeric formatting: 'always' | 'auto'. When 'auto', enables natural language forms such as 'yesterday' instead of '1 day ago'.\n */\n @property({ type: String }) numeric: 'always' | 'auto' = 'always';\n\n /**\n * Formatting length: 'long' | 'short' | 'narrow'. Controls verbosity (such as '3 days ago' vs '3d ago'). Maps to Intl.RelativeTimeFormat style option.\n */\n @property({ type: String, attribute: 'format-style' }) formatStyle: 'long' | 'short' | 'narrow' = 'long';\n\n /**\n * Time unit: 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year' | 'auto'. Use 'auto' to let the component select the most appropriate unit based on the time difference.\n */\n @property({ type: String }) unit: 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year' | 'auto' = 'auto';\n\n /**\n * When present, auto-updates the displayed relative time at appropriate intervals.\n */\n @property({ type: Boolean }) sync = false;\n\n #timer?: ReturnType<typeof setTimeout>;\n\n get #dateValue(): string {\n return this.date ?? this.textContent?.trim() ?? '';\n }\n\n get #resolvedLocale(): string | undefined {\n return this.locale ?? (globalThis.document?.documentElement?.lang || undefined);\n }\n\n #computeUnit(diffMs: number): { value: number; unit: Intl.RelativeTimeFormatUnit } {\n const absDiff = Math.abs(diffMs);\n const sign = diffMs < 0 ? -1 : 1;\n\n for (const { unit, max } of THRESHOLDS) {\n const value = Math.round(absDiff / UNIT_DIVISORS[unit]);\n if (value < max) return { value: sign * value, unit };\n }\n throw new Error('format-relative-time: no relative time threshold matched');\n }\n\n #computeExplicitUnit(diffMs: number, unit: TimeUnitOption): number {\n return Math.round(diffMs / UNIT_DIVISORS[unit]);\n }\n\n #resolveValueAndUnit(diffMs: number): { value: number; unit: Intl.RelativeTimeFormatUnit } {\n if (this.unit === 'auto') {\n return this.#computeUnit(diffMs);\n }\n return { unit: this.unit, value: this.#computeExplicitUnit(diffMs, this.unit) };\n }\n\n get #formattedRelativeTime(): string {\n const iso = this.#dateValue;\n if (!iso) return '';\n\n const target = new Date(iso);\n if (isNaN(target.getTime())) {\n LogService.warn(`format-relative-time: invalid date value \"${iso}\"`);\n return iso;\n }\n\n const { value, unit: resolvedUnit } = this.#resolveValueAndUnit(target.getTime() - Date.now());\n\n try {\n return new Intl.RelativeTimeFormat(this.#resolvedLocale, {\n numeric: this.numeric,\n style: this.formatStyle\n }).format(value, resolvedUnit);\n } catch (e) {\n LogService.warn(`format-relative-time: ${(e as Error).message}`);\n return iso;\n }\n }\n\n #getSyncInterval(): number {\n const iso = this.#dateValue;\n if (!iso) return 60000;\n\n const absDiff = Math.abs(new Date(iso).getTime() - Date.now());\n if (absDiff < 60000) return 10000;\n if (absDiff < 3600000) return 30000;\n if (absDiff < 86400000) return 300000;\n return 3600000;\n }\n\n #startSync() {\n this.#stopSync();\n if (!this.sync) return;\n\n this.#timer = setTimeout(() => {\n this.requestUpdate();\n this.#startSync();\n }, this.#getSyncInterval());\n }\n\n #stopSync() {\n if (this.#timer !== undefined) {\n clearTimeout(this.#timer);\n this.#timer = undefined;\n }\n }\n\n connectedCallback() {\n super.connectedCallback();\n if (this.sync) this.#startSync();\n }\n\n disconnectedCallback() {\n this.#stopSync();\n super.disconnectedCallback();\n }\n\n updated(changed: Map<string, unknown>) {\n if (changed.has('sync')) {\n if (this.sync) {\n this.#startSync();\n } else {\n this.#stopSync();\n }\n }\n }\n\n render() {\n return html`<time internal-host datetime=${this.#dateValue}>${this.#formattedRelativeTime}<slot @slotchange=${this.#onSlotChange} hidden></slot></time>`;\n }\n\n #onSlotChange() {\n this.requestUpdate();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"format-relative-time2.js","names":["#dateValue","#resolvedLocale","#computeUnit","#computeExplicitUnit","#formattedRelativeTime","#resolveValueAndUnit","#stopSync","#timer","#startSync","#getSyncInterval","#onSlotChange"],"sources":["../../src/format-relative-time/format-relative-time.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport { useStyles, typeSSR, LogService } from '@nvidia-elements/core/internal';\nimport styles from './format-relative-time.css?inline';\n\ntype TimeUnitOption = 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year';\n\nconst UNIT_DIVISORS: Record<TimeUnitOption, number> = {\n second: 1000,\n minute: 60000,\n hour: 3600000,\n day: 86400000,\n week: 604800000,\n month: 2592000000,\n year: 31536000000\n};\n\nconst THRESHOLDS: { unit: TimeUnitOption; max: number }[] = [\n { unit: 'second', max: 60 },\n { unit: 'minute', max: 60 },\n { unit: 'hour', max: 24 },\n { unit: 'day', max: 7 },\n { unit: 'week', max: 4 },\n { unit: 'month', max: 12 },\n { unit: 'year', max: Number.POSITIVE_INFINITY }\n];\n\n/**\n * @element nve-format-relative-time\n * @description Formats a date/time value as localized relative text using the Intl.RelativeTimeFormat API. Renders inside a semantic time element.\n * Options mirror the Intl.RelativeTimeFormat API. When unit is 'auto', the component selects the best unit based on the time difference.\n * @since 0.0.0\n * @entrypoint \\@nvidia-elements/core/format-relative-time\n * @slot - Date string to format (such as 2023-07-28T04:20:17.434Z). Serves as fallback before hydration.\n */\n@typeSSR()\nexport class FormatRelativeTime extends LitElement {\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-format-relative-time',\n version: '0.0.0'\n };\n\n /**\n * Optional date string for values supplied by JavaScript or bound data.\n * By default, the component formats the element's text content, which also serves as the SSR fallback.\n * When both are present, this property takes precedence.\n */\n @property({ type: String }) date?: string;\n\n /**\n * Language tag (such as en-US, de-DE). Defaults to document.documentElement.lang or browser default.\n */\n @property({ type: String }) locale?: string;\n\n /**\n * Numeric formatting: 'always' | 'auto'. When 'auto', enables natural language forms such as 'yesterday' instead of '1 day ago'.\n */\n @property({ type: String }) numeric: 'always' | 'auto' = 'always';\n\n /**\n * Formatting length: 'long' | 'short' | 'narrow'. Controls verbosity (such as '3 days ago' vs '3d ago'). Maps to Intl.RelativeTimeFormat style option.\n */\n @property({ type: String, attribute: 'format-style' }) formatStyle: 'long' | 'short' | 'narrow' = 'long';\n\n /**\n * Time unit: 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year' | 'auto'. Use 'auto' to let the component select the most appropriate unit based on the time difference.\n */\n @property({ type: String }) unit: 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year' | 'auto' = 'auto';\n\n /**\n * When present, auto-updates the displayed relative time at appropriate intervals.\n */\n @property({ type: Boolean }) sync = false;\n\n #timer?: ReturnType<typeof setTimeout>;\n\n get #dateValue(): string {\n return this.date ?? this.textContent?.trim() ?? '';\n }\n\n get #resolvedLocale(): string | undefined {\n return this.locale ?? (globalThis.document?.documentElement?.lang || undefined);\n }\n\n #computeUnit(diffMs: number): { value: number; unit: Intl.RelativeTimeFormatUnit } {\n const absDiff = Math.abs(diffMs);\n const sign = diffMs < 0 ? -1 : 1;\n\n for (const { unit, max } of THRESHOLDS) {\n const value = Math.round(absDiff / UNIT_DIVISORS[unit]);\n if (value < max) return { value: sign * value, unit };\n }\n throw new Error('format-relative-time: no relative time threshold matched');\n }\n\n #computeExplicitUnit(diffMs: number, unit: TimeUnitOption): number {\n return Math.round(diffMs / UNIT_DIVISORS[unit]);\n }\n\n #resolveValueAndUnit(diffMs: number): { value: number; unit: Intl.RelativeTimeFormatUnit } {\n if (this.unit === 'auto') {\n return this.#computeUnit(diffMs);\n }\n return { unit: this.unit, value: this.#computeExplicitUnit(diffMs, this.unit) };\n }\n\n get #formattedRelativeTime(): string {\n const iso = this.#dateValue;\n if (!iso) return '';\n\n const target = new Date(iso);\n if (isNaN(target.getTime())) {\n LogService.warn(`format-relative-time: invalid date value \"${iso}\"`);\n return iso;\n }\n\n const { value, unit: resolvedUnit } = this.#resolveValueAndUnit(target.getTime() - Date.now());\n\n try {\n return new Intl.RelativeTimeFormat(this.#resolvedLocale, {\n numeric: this.numeric,\n style: this.formatStyle\n }).format(value, resolvedUnit);\n } catch (e) {\n LogService.warn(`format-relative-time: ${(e as Error).message}`);\n return iso;\n }\n }\n\n #getSyncInterval(): number {\n const iso = this.#dateValue;\n if (!iso) return 60000;\n\n const absDiff = Math.abs(new Date(iso).getTime() - Date.now());\n if (absDiff < 60000) return 10000;\n if (absDiff < 3600000) return 30000;\n if (absDiff < 86400000) return 300000;\n return 3600000;\n }\n\n #startSync() {\n this.#stopSync();\n if (!this.sync) return;\n\n this.#timer = setTimeout(() => {\n this.requestUpdate();\n this.#startSync();\n }, this.#getSyncInterval());\n }\n\n #stopSync() {\n if (this.#timer !== undefined) {\n clearTimeout(this.#timer);\n this.#timer = undefined;\n }\n }\n\n connectedCallback() {\n super.connectedCallback();\n if (this.sync) this.#startSync();\n }\n\n disconnectedCallback() {\n this.#stopSync();\n super.disconnectedCallback();\n }\n\n updated(changed: Map<string, unknown>) {\n if (changed.has('sync')) {\n if (this.sync) {\n this.#startSync();\n } else {\n this.#stopSync();\n }\n }\n }\n\n render() {\n return html`<time internal-host datetime=${this.#dateValue}>${this.#formattedRelativeTime}<slot @slotchange=${this.#onSlotChange} hidden></slot></time>`;\n }\n\n #onSlotChange() {\n this.requestUpdate();\n }\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { appendRootNodeStyle as e, getAttributeListChanges as t } from "../../internal/utils/dom.js";
2
2
  import { associateAriaDescribedBy as n, associateDataList as r, associateLabel as i, attachInternals as a } from "../../internal/utils/a11y.js";
3
- import { __decorate as o } from "../../_virtual/_@oxc-project_runtime@0.128.0/helpers/decorate.js";
3
+ import { __decorate as o } from "../../_virtual/_@oxc-project_runtime@0.130.0/helpers/decorate.js";
4
4
  import { I18nController as s } from "../../internal/controllers/i18n.controller.js";
5
5
  import { typeSSR as c } from "../../internal/controllers/type-ssr.controller.js";
6
6
  import { hostAttr as l } from "../../internal/decorators/host-attr.js";
@@ -50,7 +50,7 @@ var C = class extends v {
50
50
  static {
51
51
  this.metadata = {
52
52
  tag: "nve-control",
53
- version: "0.1.1"
53
+ version: "0.1.2"
54
54
  };
55
55
  }
56
56
  render() {
@@ -1 +1 @@
1
- {"version":3,"file":"control2.js","names":["#i18nController","#updateStyleStates","#observers","#setupInput","#setupFitText","#updateAssociations","#getCharacterWidth","#label","#messages","#input","#onRootSlotchange","#onInputSlotchange","#onFitTextUpdate","#polyfillShowPicker","#assignLabel"],"sources":["../../../src/forms/control/control.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { TemplateResult } from 'lit';\nimport { LitElement, html, nothing, isServer } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport {\n attachInternals,\n useStyles,\n associateLabel,\n associateAriaDescribedBy,\n associateDataList,\n appendRootNodeStyle,\n getAttributeListChanges,\n I18nController,\n hostAttr,\n typeSSR\n} from '@nvidia-elements/core/internal';\nimport type { ControlMessage } from '../control-message/control-message.js';\nimport {\n setupControlValidationStates,\n setupControlStates,\n setupControlStatusStates,\n inputQuery\n} from '../utils/states.js';\nimport { setupControlLayoutStates } from '../utils/layout.js';\nimport globalStyles from './control.global.css?inline';\nimport styles from './control.css?inline';\n\n/**\n * @element nve-control\n * @description Wraps a form input with its associated label and validation messages, managing layout and accessibility associations.\n * @since 0.3.0\n * @entrypoint \\@nvidia-elements/core/forms\n * @slot - Control input element\n * @slot label - Label element\n * @cssprop --cursor\n * @cssprop --accent-color\n * @cssprop --color\n * @cssprop --label-color\n * @cssprop --label-width\n * @cssprop --label-font-weight\n * @cssprop --label-font-size\n * @cssprop --control-width\n * @cssprop --control-height\n\n * @aria https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals\n * @package true\n */\n@typeSSR()\nexport class Control extends LitElement {\n /** Set current visual state for control. This overrides any validation states active. */\n @property({ type: String }) status: 'warning' | 'error' | 'success' | 'disabled';\n\n /** Set current control + label + control message layout. Layouts will collapse based on available container space. */\n @property({ type: String, reflect: true }) layout:\n | 'vertical'\n | 'vertical-inline'\n | 'horizontal'\n | 'horizontal-inline';\n\n /** Sets the input to match the width of the active text content of the control value. Only applicable to vertical input box type controls (input, select) */\n @property({ type: Boolean, reflect: true, attribute: 'fit-text' }) fitText = false;\n\n /** Sets the input to match native default content block */\n @property({ type: Boolean, reflect: true, attribute: 'fit-content' }) fitContent = false;\n\n #i18nController: I18nController<this> = new I18nController<this>(this);\n\n /** Enables internal string values to update for internationalization. */\n @property({ type: Object }) i18n = this.#i18nController.i18n;\n\n /** Set the visual prominence of the control */\n @property({ type: String, reflect: true }) prominence: 'muted';\n\n get #label() {\n return this.shadowRoot\n ?.querySelector<HTMLSlotElement>('slot[name=\"label\"]')\n ?.assignedElements({ flatten: true })?.[0] as HTMLLabelElement;\n }\n\n get #messages() {\n return (this.shadowRoot\n ?.querySelector<HTMLSlotElement>('slot[name=\"messages\"]')\n ?.assignedElements({ flatten: true }) ?? []) as ControlMessage[];\n }\n\n #input: HTMLInputElement;\n\n /** @private */\n get input(): HTMLInputElement {\n if (!isServer && !this.#input) {\n const slotted =\n this.querySelector('slot')\n ?.assignedElements()\n ?.find(i => i.matches(inputQuery)) ??\n Array.from(this.shadowRoot!.querySelector('slot')?.assignedElements({ flatten: true }) ?? []).find(i =>\n i.matches(inputQuery)\n );\n this.#input = (slotted ? slotted : this.querySelector(inputQuery)) as HTMLInputElement;\n }\n\n return this.#input;\n }\n\n /** @private */\n protected get prefixContent(): typeof nothing | TemplateResult {\n return nothing;\n }\n\n /** @private */\n protected get suffixContent(): typeof nothing | TemplateResult {\n return nothing;\n }\n\n @hostAttr({ attribute: 'nve-control' }) protected nveControl = '';\n\n /** @private */\n declare _internals: ElementInternals;\n\n #observers: (MutationObserver | ResizeObserver)[] = [];\n\n protected _associateDatalist = true;\n\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-control',\n version: '0.0.0'\n };\n\n render() {\n return this.nveControl !== 'inline'\n ? html`\n <div internal-host part=\"_internal-host\">\n <slot name=\"label\" part=\"_label\"></slot>\n <div input part=\"_input\">\n ${this.prefixContent}\n <slot></slot>\n ${this.suffixContent}\n </div>\n <slot name=\"messages\" part=\"_messages\"></slot>\n </div>\n `\n : html`\n <div internal-host part=\"_internal-host\">\n <div input part=\"_input\"><slot interaction-state></slot></div>\n <slot name=\"label\" part=\"_label\"></slot>\n <slot name=\"messages\" part=\"_messages\"></slot>\n </div>\n `;\n }\n\n connectedCallback() {\n super.connectedCallback();\n attachInternals(this);\n appendRootNodeStyle(this, globalStyles);\n this.shadowRoot!.addEventListener('slotchange', this.#onRootSlotchange);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.shadowRoot!.removeEventListener('slotchange', this.#onRootSlotchange);\n this.shadowRoot!.removeEventListener('slotchange', this.#onInputSlotchange);\n if (this.fitText && this.input) {\n this.input.removeEventListener('input', this.#onFitTextUpdate);\n this.input.removeEventListener('change', this.#onFitTextUpdate);\n }\n this.#observers.forEach(observer => observer.disconnect());\n this.#observers.length = 0;\n }\n\n #onRootSlotchange = () => {\n this.#updateStyleStates();\n\n if (this.input && this.#observers.length === 0) {\n this.#setupInput();\n this.#setupFitText();\n }\n };\n\n /** Resets control value to initial attribute value and clears any active validation rules. */\n reset() {\n this.input.value = this.input.getAttribute('value') ?? '';\n this.requestUpdate();\n this.dispatchEvent(new CustomEvent('reset', { bubbles: true, composed: true }));\n }\n\n #setupInput() {\n setupControlValidationStates(this, this.#messages);\n\n this.#observers.push(\n ...setupControlStates(this),\n ...setupControlStatusStates(this, this.#messages),\n setupControlLayoutStates(this),\n getAttributeListChanges(this, ['hidden', 'status'], () => this.#updateStyleStates())\n );\n\n this.#polyfillShowPicker();\n this.#updateAssociations();\n this.shadowRoot!.addEventListener('slotchange', this.#onInputSlotchange);\n }\n\n #onInputSlotchange = () => {\n this.#updateStyleStates();\n this.#updateAssociations();\n };\n\n #setupFitText() {\n if (this.fitText) {\n this.#getCharacterWidth();\n this.input.addEventListener('input', this.#onFitTextUpdate);\n this.input.addEventListener('change', this.#onFitTextUpdate);\n }\n }\n\n #onFitTextUpdate = () => {\n this.#getCharacterWidth();\n };\n\n #getCharacterWidth() {\n if (this.input.tagName === 'INPUT') {\n const offset = this.input.type !== 'text' ? 4 : 0;\n this.style.setProperty('--control-width', `${this.input.value.length + offset}ch`);\n this.input.style.setProperty('max-width', `${this.input.value.length + 2}ch`, 'important');\n } else if (this.input.tagName === 'SELECT') {\n this.style.setProperty(\n '--control-width',\n `${(this.input as unknown as HTMLSelectElement).options[(this.input as unknown as HTMLSelectElement).selectedIndex]!.textContent!.length + 4}ch`\n );\n }\n }\n\n #polyfillShowPicker() {\n if (!this.input.showPicker) {\n this.input.showPicker = () => this.input.focus();\n }\n }\n\n #updateStyleStates() {\n if (this.input) {\n this.toggleAttribute('multiple', this.input?.multiple);\n this.input?.hasAttribute('size') ? this.setAttribute('size', '') : this.removeAttribute('size');\n }\n }\n\n #updateAssociations() {\n this.#assignLabel();\n associateLabel(this.#label, this.input);\n associateAriaDescribedBy(Array.from(this.#messages), this.input);\n\n if (this._associateDatalist) {\n associateDataList(this.querySelector<HTMLDataListElement>('datalist')!, this.input);\n }\n }\n\n #assignLabel() {\n const label =\n this.querySelector('label') ||\n (this.shadowRoot!.querySelector('slot')!\n .assignedNodes({ flatten: true })\n .find((i: Node) => (i as HTMLElement).tagName === 'LABEL') as HTMLLabelElement);\n if (label) {\n label.slot = 'label';\n }\n }\n\n protected showPicker() {\n try {\n this.input.showPicker();\n } catch {\n //\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"control2.js","names":["#i18nController","#updateStyleStates","#observers","#setupInput","#setupFitText","#updateAssociations","#getCharacterWidth","#label","#messages","#input","#onRootSlotchange","#onInputSlotchange","#onFitTextUpdate","#polyfillShowPicker","#assignLabel"],"sources":["../../../src/forms/control/control.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { TemplateResult } from 'lit';\nimport { LitElement, html, nothing, isServer } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport {\n attachInternals,\n useStyles,\n associateLabel,\n associateAriaDescribedBy,\n associateDataList,\n appendRootNodeStyle,\n getAttributeListChanges,\n I18nController,\n hostAttr,\n typeSSR\n} from '@nvidia-elements/core/internal';\nimport type { ControlMessage } from '../control-message/control-message.js';\nimport {\n setupControlValidationStates,\n setupControlStates,\n setupControlStatusStates,\n inputQuery\n} from '../utils/states.js';\nimport { setupControlLayoutStates } from '../utils/layout.js';\nimport globalStyles from './control.global.css?inline';\nimport styles from './control.css?inline';\n\n/**\n * @element nve-control\n * @description Wraps a form input with its associated label and validation messages, managing layout and accessibility associations.\n * @since 0.3.0\n * @entrypoint \\@nvidia-elements/core/forms\n * @slot - Control input element\n * @slot label - Label element\n * @cssprop --cursor\n * @cssprop --accent-color\n * @cssprop --color\n * @cssprop --label-color\n * @cssprop --label-width\n * @cssprop --label-font-weight\n * @cssprop --label-font-size\n * @cssprop --control-width\n * @cssprop --control-height\n\n * @aria https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals\n * @package true\n */\n@typeSSR()\nexport class Control extends LitElement {\n /** Set current visual state for control. This overrides any validation states active. */\n @property({ type: String }) status: 'warning' | 'error' | 'success' | 'disabled';\n\n /** Set current control + label + control message layout. Layouts will collapse based on available container space. */\n @property({ type: String, reflect: true }) layout:\n | 'vertical'\n | 'vertical-inline'\n | 'horizontal'\n | 'horizontal-inline';\n\n /** Sets the input to match the width of the active text content of the control value. Only applicable to vertical input box type controls (input, select) */\n @property({ type: Boolean, reflect: true, attribute: 'fit-text' }) fitText = false;\n\n /** Sets the input to match native default content block */\n @property({ type: Boolean, reflect: true, attribute: 'fit-content' }) fitContent = false;\n\n #i18nController: I18nController<this> = new I18nController<this>(this);\n\n /** Enables internal string values to update for internationalization. */\n @property({ type: Object }) i18n = this.#i18nController.i18n;\n\n /** Set the visual prominence of the control */\n @property({ type: String, reflect: true }) prominence: 'muted';\n\n get #label() {\n return this.shadowRoot\n ?.querySelector<HTMLSlotElement>('slot[name=\"label\"]')\n ?.assignedElements({ flatten: true })?.[0] as HTMLLabelElement;\n }\n\n get #messages() {\n return (this.shadowRoot\n ?.querySelector<HTMLSlotElement>('slot[name=\"messages\"]')\n ?.assignedElements({ flatten: true }) ?? []) as ControlMessage[];\n }\n\n #input: HTMLInputElement;\n\n /** @private */\n get input(): HTMLInputElement {\n if (!isServer && !this.#input) {\n const slotted =\n this.querySelector('slot')\n ?.assignedElements()\n ?.find(i => i.matches(inputQuery)) ??\n Array.from(this.shadowRoot!.querySelector('slot')?.assignedElements({ flatten: true }) ?? []).find(i =>\n i.matches(inputQuery)\n );\n this.#input = (slotted ? slotted : this.querySelector(inputQuery)) as HTMLInputElement;\n }\n\n return this.#input;\n }\n\n /** @private */\n protected get prefixContent(): typeof nothing | TemplateResult {\n return nothing;\n }\n\n /** @private */\n protected get suffixContent(): typeof nothing | TemplateResult {\n return nothing;\n }\n\n @hostAttr({ attribute: 'nve-control' }) protected nveControl = '';\n\n /** @private */\n declare _internals: ElementInternals;\n\n #observers: (MutationObserver | ResizeObserver)[] = [];\n\n protected _associateDatalist = true;\n\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-control',\n version: '0.0.0'\n };\n\n render() {\n return this.nveControl !== 'inline'\n ? html`\n <div internal-host part=\"_internal-host\">\n <slot name=\"label\" part=\"_label\"></slot>\n <div input part=\"_input\">\n ${this.prefixContent}\n <slot></slot>\n ${this.suffixContent}\n </div>\n <slot name=\"messages\" part=\"_messages\"></slot>\n </div>\n `\n : html`\n <div internal-host part=\"_internal-host\">\n <div input part=\"_input\"><slot interaction-state></slot></div>\n <slot name=\"label\" part=\"_label\"></slot>\n <slot name=\"messages\" part=\"_messages\"></slot>\n </div>\n `;\n }\n\n connectedCallback() {\n super.connectedCallback();\n attachInternals(this);\n appendRootNodeStyle(this, globalStyles);\n this.shadowRoot!.addEventListener('slotchange', this.#onRootSlotchange);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.shadowRoot!.removeEventListener('slotchange', this.#onRootSlotchange);\n this.shadowRoot!.removeEventListener('slotchange', this.#onInputSlotchange);\n if (this.fitText && this.input) {\n this.input.removeEventListener('input', this.#onFitTextUpdate);\n this.input.removeEventListener('change', this.#onFitTextUpdate);\n }\n this.#observers.forEach(observer => observer.disconnect());\n this.#observers.length = 0;\n }\n\n #onRootSlotchange = () => {\n this.#updateStyleStates();\n\n if (this.input && this.#observers.length === 0) {\n this.#setupInput();\n this.#setupFitText();\n }\n };\n\n /** Resets control value to initial attribute value and clears any active validation rules. */\n reset() {\n this.input.value = this.input.getAttribute('value') ?? '';\n this.requestUpdate();\n this.dispatchEvent(new CustomEvent('reset', { bubbles: true, composed: true }));\n }\n\n #setupInput() {\n setupControlValidationStates(this, this.#messages);\n\n this.#observers.push(\n ...setupControlStates(this),\n ...setupControlStatusStates(this, this.#messages),\n setupControlLayoutStates(this),\n getAttributeListChanges(this, ['hidden', 'status'], () => this.#updateStyleStates())\n );\n\n this.#polyfillShowPicker();\n this.#updateAssociations();\n this.shadowRoot!.addEventListener('slotchange', this.#onInputSlotchange);\n }\n\n #onInputSlotchange = () => {\n this.#updateStyleStates();\n this.#updateAssociations();\n };\n\n #setupFitText() {\n if (this.fitText) {\n this.#getCharacterWidth();\n this.input.addEventListener('input', this.#onFitTextUpdate);\n this.input.addEventListener('change', this.#onFitTextUpdate);\n }\n }\n\n #onFitTextUpdate = () => {\n this.#getCharacterWidth();\n };\n\n #getCharacterWidth() {\n if (this.input.tagName === 'INPUT') {\n const offset = this.input.type !== 'text' ? 4 : 0;\n this.style.setProperty('--control-width', `${this.input.value.length + offset}ch`);\n this.input.style.setProperty('max-width', `${this.input.value.length + 2}ch`, 'important');\n } else if (this.input.tagName === 'SELECT') {\n this.style.setProperty(\n '--control-width',\n `${(this.input as unknown as HTMLSelectElement).options[(this.input as unknown as HTMLSelectElement).selectedIndex]!.textContent!.length + 4}ch`\n );\n }\n }\n\n #polyfillShowPicker() {\n if (!this.input.showPicker) {\n this.input.showPicker = () => this.input.focus();\n }\n }\n\n #updateStyleStates() {\n if (this.input) {\n this.toggleAttribute('multiple', this.input?.multiple);\n this.input?.hasAttribute('size') ? this.setAttribute('size', '') : this.removeAttribute('size');\n }\n }\n\n #updateAssociations() {\n this.#assignLabel();\n associateLabel(this.#label, this.input);\n associateAriaDescribedBy(Array.from(this.#messages), this.input);\n\n if (this._associateDatalist) {\n associateDataList(this.querySelector<HTMLDataListElement>('datalist')!, this.input);\n }\n }\n\n #assignLabel() {\n const label =\n this.querySelector('label') ||\n (this.shadowRoot!.querySelector('slot')!\n .assignedNodes({ flatten: true })\n .find((i: Node) => (i as HTMLElement).tagName === 'LABEL') as HTMLLabelElement);\n if (label) {\n label.slot = 'label';\n }\n }\n\n protected showPicker() {\n try {\n this.input.showPicker();\n } catch {\n //\n }\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { associateAriaDescribedBy as e, associateAriaLabel as t, associateControlGroup as n, attachInternals as r } from "../../internal/utils/a11y.js";
2
- import { __decorate as i } from "../../_virtual/_@oxc-project_runtime@0.128.0/helpers/decorate.js";
2
+ import { __decorate as i } from "../../_virtual/_@oxc-project_runtime@0.130.0/helpers/decorate.js";
3
3
  import { useStyles as a } from "../../internal/styles/index.js";
4
4
  import { inputQuery as o, setupControlGroupStates as s, setupControlStatusStates as c } from "../utils/states.js";
5
5
  import { setupControlLayoutStates as l } from "../utils/layout.js";
@@ -24,7 +24,7 @@ var m = class extends d {
24
24
  static {
25
25
  this.metadata = {
26
26
  tag: "nve-control-group",
27
- version: "0.1.1"
27
+ version: "0.1.2"
28
28
  };
29
29
  }
30
30
  render() {
@@ -1 +1 @@
1
- {"version":3,"file":"control-group2.js","names":["#messages","#observers","#updateAssociations","#assignLabel"],"sources":["../../../src/forms/control-group/control-group.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { PropertyValues } from 'lit';\nimport { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport {\n attachInternals,\n useStyles,\n associateAriaLabel,\n associateAriaDescribedBy,\n associateControlGroup\n} from '@nvidia-elements/core/internal';\nimport type { ControlMessage } from '../control-message/control-message.js';\nimport { setupControlStatusStates, setupControlGroupStates, inputQuery } from '../utils/states.js';\nimport { setupControlLayoutStates } from '../utils/layout.js';\nimport styles from './control-group.css?inline';\n\n/**\n * @element nve-control-group\n * @description Groups many related form controls under a shared label and validation context for semantically linked inputs.\n * @since 0.3.0\n * @entrypoint \\@nvidia-elements/core/forms\n * @slot - Control input elements\n * @cssprop --color\n * @cssprop --label-color\n * @cssprop --label-text-transform\n * @cssprop --label-font-weight\n * @cssprop --label-font-size\n * @aria https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals\n * @package true\n */\nexport class ControlGroup extends LitElement {\n /** Set each slotted control + label + control message layout */\n @property({ type: String, reflect: true }) layout:\n | 'vertical'\n | 'vertical-inline'\n | 'horizontal'\n | 'horizontal-inline';\n\n /** Set the visual prominence of the control group */\n @property({ type: String, reflect: true }) prominence: 'muted';\n\n get label() {\n return this.querySelector?.<HTMLLabelElement>('label');\n }\n\n get inputs() {\n return this.querySelectorAll ? Array.from(this.querySelectorAll<HTMLInputElement>(inputQuery)) : [];\n }\n\n get #messages() {\n return this.querySelectorAll ? Array.from(this.querySelectorAll<ControlMessage>('nve-control-message')) : [];\n }\n\n #observers: (MutationObserver | ResizeObserver)[] = [];\n\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-control-group',\n version: '0.0.0'\n };\n\n /** @private */\n declare _internals: ElementInternals;\n\n render() {\n return html`\n <div internal-host class=\"${this.#messages.length ? '' : 'no-messages'} ${this.label ? '' : 'no-label'}\">\n <slot name=\"label\"></slot>\n <slot class=\"input-slot\"></slot>\n <slot name=\"messages\"></slot>\n </div>\n `;\n }\n\n connectedCallback() {\n super.connectedCallback();\n attachInternals(this);\n this._internals.role = 'group';\n }\n\n firstUpdated(props: PropertyValues<this>) {\n super.firstUpdated(props);\n this.#observers = [\n setupControlGroupStates(this),\n setupControlLayoutStates(this),\n ...setupControlStatusStates(this, this.#messages)\n ];\n this.#updateAssociations();\n this.shadowRoot!.addEventListener('slotchange', () => this.#updateAssociations());\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.#observers.forEach(observer => observer.disconnect());\n }\n\n #updateAssociations() {\n this.#assignLabel();\n associateAriaLabel(this.label as HTMLElement, this);\n associateAriaDescribedBy(Array.from(this.querySelectorAll<ControlMessage>('nve-control-message')), this);\n associateControlGroup(Array.from(this.inputs));\n }\n\n #assignLabel() {\n if (this.label) {\n this.label.slot = 'label';\n }\n }\n}\n"],"mappings":";;;;;;;;;AAgCA,IAAa,IAAb,cAAkC,EAAW;CAW3C,IAAI,QAAQ;EACV,OAAO,KAAK,gBAAkC,QAAQ;;CAGxD,IAAI,SAAS;EACX,OAAO,KAAK,mBAAmB,MAAM,KAAK,KAAK,iBAAmC,EAAW,CAAC,GAAG,EAAE;;CAGrG,IAAIA,KAAY;EACd,OAAO,KAAK,mBAAmB,MAAM,KAAK,KAAK,iBAAiC,sBAAsB,CAAC,GAAG,EAAE;;CAG9G,KAAoD,EAAE;;gBAEtC,EAAU,CAAC,EAAO,CAAC;;;kBAER;GACzB,KAAK;GACL,SAAS;GACV;;CAKD,SAAS;EACP,OAAO,CAAI,6BACmB,KAAKA,GAAU,SAAS,KAAK,cAAc,GAAG,KAAK,QAAQ,KAAK,WAAW;;CAQ3G,oBAAoB;EAGlB,AAFA,MAAM,mBAAmB,EACzB,EAAgB,KAAK,EACrB,KAAK,WAAW,OAAO;;CAGzB,aAAa,GAA6B;EAQxC,AAPA,MAAM,aAAa,EAAM,EACzB,KAAKC,KAAa;GAChB,EAAwB,KAAK;GAC7B,EAAyB,KAAK;GAC9B,GAAG,EAAyB,MAAM,KAAKD,GAAAA;GACxC,EACD,KAAKE,IAAqB,EAC1B,KAAK,WAAY,iBAAiB,oBAAoB,KAAKA,IAAqB,CAAC;;CAGnF,uBAAuB;EAErB,AADA,MAAM,sBAAsB,EAC5B,KAAKD,GAAW,SAAQ,MAAY,EAAS,YAAY,CAAC;;CAG5D,KAAsB;EAIpB,AAHA,KAAKE,IAAc,EACnB,EAAmB,KAAK,OAAsB,KAAK,EACnD,EAAyB,MAAM,KAAK,KAAK,iBAAiC,sBAAsB,CAAC,EAAE,KAAK,EACxG,EAAsB,MAAM,KAAK,KAAK,OAAO,CAAC;;CAGhD,KAAe;EACb,AAAI,KAAK,UACP,KAAK,MAAM,OAAO;;;GA1ErB,EAAS;CAAE,MAAM;CAAQ,SAAS;CAAM,CAAC,CAAA,EAAA,EAAA,WAAA,UAAA,KAAA,EAAA,KAOzC,EAAS;CAAE,MAAM;CAAQ,SAAS;CAAM,CAAC,CAAA,EAAA,EAAA,WAAA,cAAA,KAAA,EAAA"}
1
+ {"version":3,"file":"control-group2.js","names":["#messages","#observers","#updateAssociations","#assignLabel"],"sources":["../../../src/forms/control-group/control-group.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { PropertyValues } from 'lit';\nimport { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport {\n attachInternals,\n useStyles,\n associateAriaLabel,\n associateAriaDescribedBy,\n associateControlGroup\n} from '@nvidia-elements/core/internal';\nimport type { ControlMessage } from '../control-message/control-message.js';\nimport { setupControlStatusStates, setupControlGroupStates, inputQuery } from '../utils/states.js';\nimport { setupControlLayoutStates } from '../utils/layout.js';\nimport styles from './control-group.css?inline';\n\n/**\n * @element nve-control-group\n * @description Groups many related form controls under a shared label and validation context for semantically linked inputs.\n * @since 0.3.0\n * @entrypoint \\@nvidia-elements/core/forms\n * @slot - Control input elements\n * @cssprop --color\n * @cssprop --label-color\n * @cssprop --label-text-transform\n * @cssprop --label-font-weight\n * @cssprop --label-font-size\n * @aria https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals\n * @package true\n */\nexport class ControlGroup extends LitElement {\n /** Set each slotted control + label + control message layout */\n @property({ type: String, reflect: true }) layout:\n | 'vertical'\n | 'vertical-inline'\n | 'horizontal'\n | 'horizontal-inline';\n\n /** Set the visual prominence of the control group */\n @property({ type: String, reflect: true }) prominence: 'muted';\n\n get label() {\n return this.querySelector?.<HTMLLabelElement>('label');\n }\n\n get inputs() {\n return this.querySelectorAll ? Array.from(this.querySelectorAll<HTMLInputElement>(inputQuery)) : [];\n }\n\n get #messages() {\n return this.querySelectorAll ? Array.from(this.querySelectorAll<ControlMessage>('nve-control-message')) : [];\n }\n\n #observers: (MutationObserver | ResizeObserver)[] = [];\n\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-control-group',\n version: '0.0.0'\n };\n\n /** @private */\n declare _internals: ElementInternals;\n\n render() {\n return html`\n <div internal-host class=\"${this.#messages.length ? '' : 'no-messages'} ${this.label ? '' : 'no-label'}\">\n <slot name=\"label\"></slot>\n <slot class=\"input-slot\"></slot>\n <slot name=\"messages\"></slot>\n </div>\n `;\n }\n\n connectedCallback() {\n super.connectedCallback();\n attachInternals(this);\n this._internals.role = 'group';\n }\n\n firstUpdated(props: PropertyValues<this>) {\n super.firstUpdated(props);\n this.#observers = [\n setupControlGroupStates(this),\n setupControlLayoutStates(this),\n ...setupControlStatusStates(this, this.#messages)\n ];\n this.#updateAssociations();\n this.shadowRoot!.addEventListener('slotchange', () => this.#updateAssociations());\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.#observers.forEach(observer => observer.disconnect());\n }\n\n #updateAssociations() {\n this.#assignLabel();\n associateAriaLabel(this.label as HTMLElement, this);\n associateAriaDescribedBy(Array.from(this.querySelectorAll<ControlMessage>('nve-control-message')), this);\n associateControlGroup(Array.from(this.inputs));\n }\n\n #assignLabel() {\n if (this.label) {\n this.label.slot = 'label';\n }\n }\n}\n"],"mappings":";;;;;;;;;AAgCA,IAAa,IAAb,cAAkC,EAAW;CAW3C,IAAI,QAAQ;EACV,OAAO,KAAK,gBAAkC,OAAO;CACvD;CAEA,IAAI,SAAS;EACX,OAAO,KAAK,mBAAmB,MAAM,KAAK,KAAK,iBAAmC,CAAU,CAAC,IAAI,CAAC;CACpG;CAEA,IAAIA,KAAY;EACd,OAAO,KAAK,mBAAmB,MAAM,KAAK,KAAK,iBAAiC,qBAAqB,CAAC,IAAI,CAAC;CAC7G;CAEA,KAAoD,CAAC;;gBAErC,EAAU,CAAC,CAAM,CAAC;;;kBAEP;GACzB,KAAK;GACL,SAAS;EACX;;CAKA,SAAS;EACP,OAAO,CAAI,6BACmB,KAAKA,GAAU,SAAS,KAAK,cAAc,GAAG,KAAK,QAAQ,KAAK,WAAW;CAM3G;CAEA,oBAAoB;EAGlB,AAFA,MAAM,kBAAkB,GACxB,EAAgB,IAAI,GACpB,KAAK,WAAW,OAAO;CACzB;CAEA,aAAa,GAA6B;EAQxC,AAPA,MAAM,aAAa,CAAK,GACxB,KAAKC,KAAa;GAChB,EAAwB,IAAI;GAC5B,EAAyB,IAAI;GAC7B,GAAG,EAAyB,MAAM,KAAKD,EAAS;EAClD,GACA,KAAKE,GAAoB,GACzB,KAAK,WAAY,iBAAiB,oBAAoB,KAAKA,GAAoB,CAAC;CAClF;CAEA,uBAAuB;EAErB,AADA,MAAM,qBAAqB,GAC3B,KAAKD,GAAW,SAAQ,MAAY,EAAS,WAAW,CAAC;CAC3D;CAEA,KAAsB;EAIpB,AAHA,KAAKE,GAAa,GAClB,EAAmB,KAAK,OAAsB,IAAI,GAClD,EAAyB,MAAM,KAAK,KAAK,iBAAiC,qBAAqB,CAAC,GAAG,IAAI,GACvG,EAAsB,MAAM,KAAK,KAAK,MAAM,CAAC;CAC/C;CAEA,KAAe;EACb,AAAI,KAAK,UACP,KAAK,MAAM,OAAO;CAEtB;AACF;GA7EG,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,UAAA,KAAA,CAAA,MAOxC,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,cAAA,KAAA,CAAA"}
@@ -1,4 +1,4 @@
1
- import { __decorate as e } from "../../_virtual/_@oxc-project_runtime@0.128.0/helpers/decorate.js";
1
+ import { __decorate as e } from "../../_virtual/_@oxc-project_runtime@0.130.0/helpers/decorate.js";
2
2
  import { hostAttr as t } from "../../internal/decorators/host-attr.js";
3
3
  import { scopedRegistry as n } from "../../internal/decorators/scoped-registry.js";
4
4
  import { useStyles as r } from "../../internal/styles/index.js";
@@ -23,7 +23,7 @@ var l = {
23
23
  static {
24
24
  this.metadata = {
25
25
  tag: "nve-control-message",
26
- version: "0.1.1"
26
+ version: "0.1.2"
27
27
  };
28
28
  }
29
29
  static {
@@ -1 +1 @@
1
- {"version":3,"file":"control-message2.js","names":[],"sources":["../../../src/forms/control-message/control-message.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { LitElement, html } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport { hostAttr, scopedRegistry, useStyles } from '@nvidia-elements/core/internal';\nimport { Icon } from '@nvidia-elements/core/icon';\nimport { type ValidityStateError } from '../utils/types.js';\nimport styles from './control-message.css?inline';\n\nconst statusIcons = {\n undefined: 'information-circle-stroke',\n disabled: 'information-circle-stroke',\n warning: 'exclamation-triangle',\n success: 'checkmark-circle',\n error: 'exclamation-circle'\n} as const;\n\n/**\n * @element nve-control-message\n * @description Defining a Validity State on a control-message allows messages to show conditionally based on the current HTML5 validity state.\n * @since 0.3.0\n * @entrypoint \\@nvidia-elements/core/forms\n * @slot - default slot for content\n * @cssprop --color\n * @cssprop --font-weight\n * @cssprop --font-size\n * @csspart icon - The icon element\n * @aria https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals\n * @package true\n */\n@scopedRegistry()\nexport class ControlMessage extends LitElement {\n /**\n * Visual treatment for current form control validation status\n */\n @property({ type: String, reflect: true }) status?: 'warning' | 'error' | 'success' | 'disabled';\n\n /**\n * Validation error code for current form control\n * https://developer.mozilla.org/en-US/docs/Web/API/ValidityState\n */\n @property({ type: String, reflect: true }) error: ValidityStateError | null = null;\n\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-control-message',\n version: '0.0.0'\n };\n\n static elementDefinitions = {\n [Icon.metadata.tag]: Icon\n };\n\n @hostAttr() slot = 'messages';\n\n render() {\n return html`\n <div internal-host>\n <slot name=\"icon\"><nve-icon part=\"icon\" name=${this.error ? statusIcons.error : statusIcons[this.status!]}></nve-icon></slot>\n <slot></slot>\n </div>\n `;\n }\n}\n"],"mappings":";;;;;;;;;AAUA,IAAM,IAAc;CAClB,WAAW;CACX,UAAU;CACV,SAAS;CACT,SAAS;CACT,OAAO;CACR,EAgBM,IAAA,cAA6B,EAAW;;4BAUiC,kBAa3D;;;gBAXH,EAAU,CAAC,EAAO,CAAC;;;kBAER;GACzB,KAAK;GACL,SAAS;GACV;;;4BAE2B,GACzB,EAAK,SAAS,MAAM,GACtB;;CAID,SAAS;EACP,OAAO,CAAI,oEAEwC,KAAK,QAAQ,EAAY,QAAQ,EAAY,KAAK,QAAS;;;GAxB/G,EAAS;CAAE,MAAM;CAAQ,SAAS;CAAM,CAAC,CAAA,EAAA,EAAA,WAAA,UAAA,KAAA,EAAA,KAMzC,EAAS;CAAE,MAAM;CAAQ,SAAS;CAAM,CAAC,CAAA,EAAA,EAAA,WAAA,SAAA,KAAA,EAAA,KAazC,GAAU,CAAA,EAAA,EAAA,WAAA,QAAA,KAAA,EAAA,SAxBZ,GAAgB,CAAA,EAAA,EAAA"}
1
+ {"version":3,"file":"control-message2.js","names":[],"sources":["../../../src/forms/control-message/control-message.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { LitElement, html } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport { hostAttr, scopedRegistry, useStyles } from '@nvidia-elements/core/internal';\nimport { Icon } from '@nvidia-elements/core/icon';\nimport { type ValidityStateError } from '../utils/types.js';\nimport styles from './control-message.css?inline';\n\nconst statusIcons = {\n undefined: 'information-circle-stroke',\n disabled: 'information-circle-stroke',\n warning: 'exclamation-triangle',\n success: 'checkmark-circle',\n error: 'exclamation-circle'\n} as const;\n\n/**\n * @element nve-control-message\n * @description Defining a Validity State on a control-message allows messages to show conditionally based on the current HTML5 validity state.\n * @since 0.3.0\n * @entrypoint \\@nvidia-elements/core/forms\n * @slot - default slot for content\n * @cssprop --color\n * @cssprop --font-weight\n * @cssprop --font-size\n * @csspart icon - The icon element\n * @aria https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals\n * @package true\n */\n@scopedRegistry()\nexport class ControlMessage extends LitElement {\n /**\n * Visual treatment for current form control validation status\n */\n @property({ type: String, reflect: true }) status?: 'warning' | 'error' | 'success' | 'disabled';\n\n /**\n * Validation error code for current form control\n * https://developer.mozilla.org/en-US/docs/Web/API/ValidityState\n */\n @property({ type: String, reflect: true }) error: ValidityStateError | null = null;\n\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-control-message',\n version: '0.0.0'\n };\n\n static elementDefinitions = {\n [Icon.metadata.tag]: Icon\n };\n\n @hostAttr() slot = 'messages';\n\n render() {\n return html`\n <div internal-host>\n <slot name=\"icon\"><nve-icon part=\"icon\" name=${this.error ? statusIcons.error : statusIcons[this.status!]}></nve-icon></slot>\n <slot></slot>\n </div>\n `;\n }\n}\n"],"mappings":";;;;;;;;;AAUA,IAAM,IAAc;CAClB,WAAW;CACX,UAAU;CACV,SAAS;CACT,SAAS;CACT,OAAO;AACT,GAgBO,IAAA,cAA6B,EAAW;;4BAUiC,kBAa3D;;;gBAXH,EAAU,CAAC,CAAM,CAAC;;;kBAEP;GACzB,KAAK;GACL,SAAS;EACX;;;4BAE4B,GACzB,EAAK,SAAS,MAAM,EACvB;;CAIA,SAAS;EACP,OAAO,CAAI,oEAEwC,KAAK,QAAQ,EAAY,QAAQ,EAAY,KAAK,QAAS;CAIhH;AACF;GA7BG,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,UAAA,KAAA,CAAA,MAMxC,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,SAAA,KAAA,CAAA,MAaxC,EAAS,CAAA,GAAA,EAAA,WAAA,QAAA,KAAA,CAAA,UAxBX,EAAe,CAAA,GAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"define.js","names":[],"sources":["../../src/forms/define.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { define } from '@nvidia-elements/core/internal';\nimport { Control, ControlGroup, ControlMessage } from '@nvidia-elements/core/forms';\n\ndefine(Control);\ndefine(ControlGroup);\ndefine(ControlMessage);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nve-control': Control;\n 'nve-control-group': ControlGroup;\n 'nve-control-message': ControlMessage;\n }\n}\n"],"mappings":";;;;AAMA,EAAO,EAAQ,EACf,EAAO,EAAa,EACpB,EAAO,EAAe"}
1
+ {"version":3,"file":"define.js","names":[],"sources":["../../src/forms/define.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { define } from '@nvidia-elements/core/internal';\nimport { Control, ControlGroup, ControlMessage } from '@nvidia-elements/core/forms';\n\ndefine(Control);\ndefine(ControlGroup);\ndefine(ControlMessage);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nve-control': Control;\n 'nve-control-group': ControlGroup;\n 'nve-control-message': ControlMessage;\n }\n}\n"],"mappings":";;;;AAMA,EAAO,CAAO,GACd,EAAO,CAAY,GACnB,EAAO,CAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"layout.js","names":[],"sources":["../../../src/forms/utils/layout.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ControlGroup } from '../control-group/control-group.js';\nimport type { Control } from '../control/control.js';\n\nexport const breakpoints = {\n vertical: 300,\n verticalInline: 400,\n horizontal: 500,\n horizontalInline: 600\n};\n\nexport function setupControlLayoutStates(control: Control | ControlGroup) {\n const initalLayout = control.layout;\n const resizeObserver = new ResizeObserver(entries => {\n if (!(control as Control).fitContent) {\n control.layout = getControlLayout(entries[0]!.contentRect.width, initalLayout);\n }\n });\n resizeObserver.observe(control);\n return resizeObserver;\n}\n\ntype ControlLayouts = 'vertical' | 'vertical-inline' | 'horizontal' | 'horizontal-inline';\n\nexport function getControlLayout(width: number, initalLayout: ControlLayouts) {\n let layout: ControlLayouts = initalLayout;\n if (width < breakpoints.vertical) {\n layout = 'vertical';\n } else if (width < breakpoints.verticalInline) {\n layout = 'vertical-inline';\n } else if (width < breakpoints.horizontal) {\n layout = 'horizontal';\n } else if (width < breakpoints.horizontalInline) {\n layout = 'horizontal-inline';\n }\n\n const layouts: ControlLayouts[] = ['vertical', 'vertical-inline', 'horizontal', 'horizontal-inline'];\n if (layouts.indexOf(initalLayout) < layouts.indexOf(layout)) {\n layout = initalLayout;\n }\n\n return layout;\n}\n\nexport function isInlineInputType(input: HTMLInputElement) {\n return input.type === 'radio' || input.type === 'checkbox';\n}\n"],"mappings":";AAMA,IAAa,IAAc;CACzB,UAAU;CACV,gBAAgB;CAChB,YAAY;CACZ,kBAAkB;CACnB;AAED,SAAgB,EAAyB,GAAiC;CACxE,IAAM,IAAe,EAAQ,QACvB,IAAiB,IAAI,gBAAe,MAAW;EACnD,AAAM,EAAoB,eACxB,EAAQ,SAAS,EAAiB,EAAQ,GAAI,YAAY,OAAO,EAAa;GAEhF;CAEF,OADA,EAAe,QAAQ,EAAQ,EACxB;;AAKT,SAAgB,EAAiB,GAAe,GAA8B;CAC5E,IAAI,IAAyB;CAC7B,AAAI,IAAQ,EAAY,WACtB,IAAS,aACA,IAAQ,EAAY,iBAC7B,IAAS,oBACA,IAAQ,EAAY,aAC7B,IAAS,eACA,IAAQ,EAAY,qBAC7B,IAAS;CAGX,IAAM,IAA4B;EAAC;EAAY;EAAmB;EAAc;EAAoB;CAKpG,OAJI,EAAQ,QAAQ,EAAa,GAAG,EAAQ,QAAQ,EAAO,KACzD,IAAS,IAGJ"}
1
+ {"version":3,"file":"layout.js","names":[],"sources":["../../../src/forms/utils/layout.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ControlGroup } from '../control-group/control-group.js';\nimport type { Control } from '../control/control.js';\n\nexport const breakpoints = {\n vertical: 300,\n verticalInline: 400,\n horizontal: 500,\n horizontalInline: 600\n};\n\nexport function setupControlLayoutStates(control: Control | ControlGroup) {\n const initalLayout = control.layout;\n const resizeObserver = new ResizeObserver(entries => {\n if (!(control as Control).fitContent) {\n control.layout = getControlLayout(entries[0]!.contentRect.width, initalLayout);\n }\n });\n resizeObserver.observe(control);\n return resizeObserver;\n}\n\ntype ControlLayouts = 'vertical' | 'vertical-inline' | 'horizontal' | 'horizontal-inline';\n\nexport function getControlLayout(width: number, initalLayout: ControlLayouts) {\n let layout: ControlLayouts = initalLayout;\n if (width < breakpoints.vertical) {\n layout = 'vertical';\n } else if (width < breakpoints.verticalInline) {\n layout = 'vertical-inline';\n } else if (width < breakpoints.horizontal) {\n layout = 'horizontal';\n } else if (width < breakpoints.horizontalInline) {\n layout = 'horizontal-inline';\n }\n\n const layouts: ControlLayouts[] = ['vertical', 'vertical-inline', 'horizontal', 'horizontal-inline'];\n if (layouts.indexOf(initalLayout) < layouts.indexOf(layout)) {\n layout = initalLayout;\n }\n\n return layout;\n}\n\nexport function isInlineInputType(input: HTMLInputElement) {\n return input.type === 'radio' || input.type === 'checkbox';\n}\n"],"mappings":";AAMA,IAAa,IAAc;CACzB,UAAU;CACV,gBAAgB;CAChB,YAAY;CACZ,kBAAkB;AACpB;AAEA,SAAgB,EAAyB,GAAiC;CACxE,IAAM,IAAe,EAAQ,QACvB,IAAiB,IAAI,gBAAe,MAAW;EACnD,AAAM,EAAoB,eACxB,EAAQ,SAAS,EAAiB,EAAQ,GAAI,YAAY,OAAO,CAAY;CAEjF,CAAC;CAED,OADA,EAAe,QAAQ,CAAO,GACvB;AACT;AAIA,SAAgB,EAAiB,GAAe,GAA8B;CAC5E,IAAI,IAAyB;CAC7B,AAAI,IAAQ,EAAY,WACtB,IAAS,aACA,IAAQ,EAAY,iBAC7B,IAAS,oBACA,IAAQ,EAAY,aAC7B,IAAS,eACA,IAAQ,EAAY,qBAC7B,IAAS;CAGX,IAAM,IAA4B;EAAC;EAAY;EAAmB;EAAc;CAAmB;CAKnG,OAJI,EAAQ,QAAQ,CAAY,IAAI,EAAQ,QAAQ,CAAM,MACxD,IAAS,IAGJ;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"states.js","names":[],"sources":["../../../src/forms/utils/states.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n getAttributeChanges,\n getAttributeListChanges,\n getElementUpdate,\n matchesElementName\n} from '@nvidia-elements/core/internal';\nimport type { ControlGroup } from '../control-group/control-group.js';\nimport { ControlMessage } from '../control-message/control-message.js';\nimport type { Control } from '../control/control.js';\n\nexport const inputQuery = 'input, select, selectmenu, textarea, [nve-control]';\n\n/**\n * Adds validation states to custom element\n * :state(valid) form control is in a valid state\n * :state(invalid) form control is in a invalid state\n */\n// eslint-disable-next-line max-lines-per-function\nexport function setupControlValidationStates(control: Control, messages: ControlMessage[]) {\n if (\n !control.input.form?.noValidate &&\n !control.input.formNoValidate &&\n !control.input.hasAttribute('formnovalidate')\n ) {\n hideAllValidationMessages(messages);\n\n /**\n * updateValidityState() logic triggered by input blur() or input() change events\n */\n const updateValidityState = () => {\n if (control.input.validity?.valid) {\n control._internals.states.delete('invalid');\n control._internals.states.add('valid');\n control.status = null!;\n }\n\n hideInactiveValidationMessages(control, messages);\n };\n\n const resetValidityState = () => {\n control.status = null!;\n control._internals.states.delete('valid');\n control._internals.states.delete('invalid');\n hideAllValidationMessages(messages);\n };\n\n control.input.addEventListener('blur', () => {\n control.input.checkValidity();\n updateValidityState();\n });\n\n control.input.addEventListener('input', () => {\n updateValidityState();\n });\n\n control.input.addEventListener('invalid', () => {\n if (messages.find(m => m.error)) {\n hideAllValidationMessages(messages);\n showActiveValidationMessages(control, messages);\n }\n\n control.status = 'error';\n control._internals.states.delete('valid');\n control._internals.states.add('invalid');\n });\n\n control.addEventListener('reset', () => resetValidityState());\n control.input.form?.addEventListener('reset', () => resetValidityState());\n }\n\n control.shadowRoot!.addEventListener('slotchange', () => {\n const current = Array.from(control.querySelectorAll<ControlMessage>(ControlMessage.metadata.tag));\n control._internals.states.delete('valid');\n control._internals.states.delete('invalid');\n if (current.find(m => !m.hidden && (m.status === 'error' || m.error))) {\n control._internals.states.add('invalid');\n } else {\n control._internals.states.add('valid');\n }\n });\n}\n\n/**\n * Adds control interaction states to custom element\n * :state(checked) form control is in a checked state\n * :state(disabled) form control is in a disabled state\n * :state(readonly) form control is in a readonly state\n * :state(touched) form control received focus and then blurred\n * :state(dirty) user modified the form control\n */\nexport function setupControlStates(control: Control) {\n const observers: MutationObserver[] = [];\n const states = control._internals.states;\n control.input.checked ? states.add('checked') : states.delete('checked');\n control.input.indeterminate ? states.add('indeterminate') : states.delete('indeterminate');\n control.input.addEventListener('focus', () => control._internals.states.add('focus'));\n control.input.addEventListener('input', () => control._internals.states.add('dirty'));\n control.input.addEventListener('blur', () => {\n control._internals.states.add('touched');\n control._internals.states.delete('focus');\n });\n\n control.input.getRootNode().addEventListener('change', (e: Event) => {\n if ((e.target as HTMLInputElement).name === control.input?.name) {\n control.input.checked ? states.add('checked') : states.delete('checked');\n }\n });\n\n control.input.form?.addEventListener('reset', () => {\n control._internals.states.delete('touched');\n control._internals.states.delete('dirty');\n control._internals.states.delete('error');\n control._internals.states.delete('success');\n control.requestUpdate();\n });\n\n observers.push(\n getElementUpdate(control.input, 'readonly', value =>\n (value === '' ? true : value) ? states.add('readonly') : states.delete('readonly')\n ),\n getElementUpdate(control.input, 'checked', () =>\n control.input.checked ? states.add('checked') : states.delete('checked')\n ),\n getElementUpdate(control.input, 'disabled', value =>\n (value === '' ? true : value) ? states.add('disabled') : states.delete('disabled')\n ),\n getElementUpdate(control.input, 'indeterminate', () =>\n control.input.indeterminate ? states.add('indeterminate') : states.delete('indeterminate')\n )\n );\n return observers;\n}\n\n/**\n * Adds control group interaction states to custom element\n * :state(disabled) any form control within group is in a disabled state\n */\nexport function setupControlGroupStates(controlGroup: ControlGroup) {\n toggleControlGroupDisabledState(controlGroup);\n return getAttributeChanges(controlGroup, 'disabled', () => toggleControlGroupDisabledState(controlGroup));\n}\n\nfunction toggleControlGroupDisabledState(controlGroup: ControlGroup) {\n if (Array.from(controlGroup.inputs).find(i => i.disabled)) {\n controlGroup._internals.states.add('disabled');\n } else {\n controlGroup._internals.states.delete('disabled');\n }\n}\n\n/**\n * Adds control status states to custom element\n * :state(error) form control is in a error state\n * :state(success) form control is in a success state\n */\nexport function setupControlStatusStates(control: Control | ControlGroup, messages: ControlMessage[]) {\n updateControlStatusState(control, messages.find(m => !m.hidden)!);\n const observers: MutationObserver[] = [];\n observers.push(\n getAttributeListChanges(control, ['hidden', 'status'], mutation => {\n const target = mutation.target as ControlMessage;\n if (matchesElementName(target, ControlMessage)) {\n updateControlStatusState(control, target);\n }\n })\n );\n\n control.shadowRoot!.addEventListener('slotchange', () => {\n const current = Array.from(control.querySelectorAll<ControlMessage>(ControlMessage.metadata.tag));\n const message = current.find(m => m.status && !m.hidden);\n control._internals.states.delete('error');\n control._internals.states.delete('success');\n if (message) {\n control._internals.states.add(message.status!);\n }\n });\n\n return observers;\n}\n\nexport function updateControlStatusState(control: Control | ControlGroup, message: ControlMessage) {\n control._internals.states.delete('error');\n control._internals.states.delete('success');\n\n if (message?.status?.length && !message?.hidden) {\n control._internals.states.add(message.status);\n }\n}\n\nexport function showNonValidationMessages(messages: ControlMessage[]) {\n messages.filter(m => !m.hasAttribute('error')).forEach(m => m.removeAttribute('hidden'));\n}\n\nexport function hideAllValidationMessages(messages: ControlMessage[]) {\n messages.filter(m => m.hasAttribute('error')).forEach(m => m.setAttribute('hidden', ''));\n}\n\nexport function showActiveValidationMessages(control: Control, messages: ControlMessage[]) {\n messages.find(m => m.error && control.input.validity[m.error])?.removeAttribute('hidden');\n}\n\nexport function hideInactiveValidationMessages(control: Control, messages: ControlMessage[]) {\n if (messages.find(m => m.error) && control.input.validity.valid) {\n messages.filter(m => m.error && !control.input.validity[m.error!]).forEach(m => m.setAttribute('hidden', ''));\n }\n}\n"],"mappings":";;;AAaA,IAAa,IAAa;AAQ1B,SAAgB,EAA6B,GAAkB,GAA4B;CACzF,IACE,CAAC,EAAQ,MAAM,MAAM,cACrB,CAAC,EAAQ,MAAM,kBACf,CAAC,EAAQ,MAAM,aAAa,iBAAiB,EAC7C;EACA,EAA0B,EAAS;EAKnC,IAAM,UAA4B;GAOhC,AANI,EAAQ,MAAM,UAAU,UAC1B,EAAQ,WAAW,OAAO,OAAO,UAAU,EAC3C,EAAQ,WAAW,OAAO,IAAI,QAAQ,EACtC,EAAQ,SAAS,OAGnB,EAA+B,GAAS,EAAS;KAG7C,UAA2B;GAI/B,AAHA,EAAQ,SAAS,MACjB,EAAQ,WAAW,OAAO,OAAO,QAAQ,EACzC,EAAQ,WAAW,OAAO,OAAO,UAAU,EAC3C,EAA0B,EAAS;;EAwBrC,AArBA,EAAQ,MAAM,iBAAiB,cAAc;GAE3C,AADA,EAAQ,MAAM,eAAe,EAC7B,GAAqB;IACrB,EAEF,EAAQ,MAAM,iBAAiB,eAAe;GAC5C,GAAqB;IACrB,EAEF,EAAQ,MAAM,iBAAiB,iBAAiB;GAQ9C,AAPI,EAAS,MAAK,MAAK,EAAE,MAAM,KAC7B,EAA0B,EAAS,EACnC,EAA6B,GAAS,EAAS,GAGjD,EAAQ,SAAS,SACjB,EAAQ,WAAW,OAAO,OAAO,QAAQ,EACzC,EAAQ,WAAW,OAAO,IAAI,UAAU;IACxC,EAEF,EAAQ,iBAAiB,eAAe,GAAoB,CAAC,EAC7D,EAAQ,MAAM,MAAM,iBAAiB,eAAe,GAAoB,CAAC;;CAG3E,EAAQ,WAAY,iBAAiB,oBAAoB;EACvD,IAAM,IAAU,MAAM,KAAK,EAAQ,iBAAiC,EAAe,SAAS,IAAI,CAAC;EAGjG,AAFA,EAAQ,WAAW,OAAO,OAAO,QAAQ,EACzC,EAAQ,WAAW,OAAO,OAAO,UAAU,EACvC,EAAQ,MAAK,MAAK,CAAC,EAAE,WAAW,EAAE,WAAW,WAAW,EAAE,OAAO,GACnE,EAAQ,WAAW,OAAO,IAAI,UAAU,GAExC,EAAQ,WAAW,OAAO,IAAI,QAAQ;GAExC;;AAWJ,SAAgB,EAAmB,GAAkB;CACnD,IAAM,IAAgC,EAAE,EAClC,IAAS,EAAQ,WAAW;CAsClC,OArCA,EAAQ,MAAM,UAAU,EAAO,IAAI,UAAU,GAAG,EAAO,OAAO,UAAU,EACxE,EAAQ,MAAM,gBAAgB,EAAO,IAAI,gBAAgB,GAAG,EAAO,OAAO,gBAAgB,EAC1F,EAAQ,MAAM,iBAAiB,eAAe,EAAQ,WAAW,OAAO,IAAI,QAAQ,CAAC,EACrF,EAAQ,MAAM,iBAAiB,eAAe,EAAQ,WAAW,OAAO,IAAI,QAAQ,CAAC,EACrF,EAAQ,MAAM,iBAAiB,cAAc;EAE3C,AADA,EAAQ,WAAW,OAAO,IAAI,UAAU,EACxC,EAAQ,WAAW,OAAO,OAAO,QAAQ;GACzC,EAEF,EAAQ,MAAM,aAAa,CAAC,iBAAiB,WAAW,MAAa;EACnE,AAAK,EAAE,OAA4B,SAAS,EAAQ,OAAO,SACzD,EAAQ,MAAM,UAAU,EAAO,IAAI,UAAU,GAAG,EAAO,OAAO,UAAU;GAE1E,EAEF,EAAQ,MAAM,MAAM,iBAAiB,eAAe;EAKlD,AAJA,EAAQ,WAAW,OAAO,OAAO,UAAU,EAC3C,EAAQ,WAAW,OAAO,OAAO,QAAQ,EACzC,EAAQ,WAAW,OAAO,OAAO,QAAQ,EACzC,EAAQ,WAAW,OAAO,OAAO,UAAU,EAC3C,EAAQ,eAAe;GACvB,EAEF,EAAU,KACR,EAAiB,EAAQ,OAAO,aAAY,MACzC,MAAU,MAAY,IAAS,EAAO,IAAI,WAAW,GAAG,EAAO,OAAO,WAAW,CACnF,EACD,EAAiB,EAAQ,OAAO,iBAC9B,EAAQ,MAAM,UAAU,EAAO,IAAI,UAAU,GAAG,EAAO,OAAO,UAAU,CACzE,EACD,EAAiB,EAAQ,OAAO,aAAY,MACzC,MAAU,MAAY,IAAS,EAAO,IAAI,WAAW,GAAG,EAAO,OAAO,WAAW,CACnF,EACD,EAAiB,EAAQ,OAAO,uBAC9B,EAAQ,MAAM,gBAAgB,EAAO,IAAI,gBAAgB,GAAG,EAAO,OAAO,gBAAgB,CAC3F,CACF,EACM;;AAOT,SAAgB,EAAwB,GAA4B;CAElE,OADA,EAAgC,EAAa,EACtC,EAAoB,GAAc,kBAAkB,EAAgC,EAAa,CAAC;;AAG3G,SAAS,EAAgC,GAA4B;CACnE,AAAI,MAAM,KAAK,EAAa,OAAO,CAAC,MAAK,MAAK,EAAE,SAAS,GACvD,EAAa,WAAW,OAAO,IAAI,WAAW,GAE9C,EAAa,WAAW,OAAO,OAAO,WAAW;;AASrD,SAAgB,EAAyB,GAAiC,GAA4B;CACpG,EAAyB,GAAS,EAAS,MAAK,MAAK,CAAC,EAAE,OAAO,CAAE;CACjE,IAAM,IAAgC,EAAE;CAoBxC,OAnBA,EAAU,KACR,EAAwB,GAAS,CAAC,UAAU,SAAS,GAAE,MAAY;EACjE,IAAM,IAAS,EAAS;EACxB,AAAI,EAAmB,GAAQ,EAAe,IAC5C,EAAyB,GAAS,EAAO;GAE3C,CACH,EAED,EAAQ,WAAY,iBAAiB,oBAAoB;EAEvD,IAAM,IADU,MAAM,KAAK,EAAQ,iBAAiC,EAAe,SAAS,IAAI,CAChF,CAAQ,MAAK,MAAK,EAAE,UAAU,CAAC,EAAE,OAAO;EAGxD,AAFA,EAAQ,WAAW,OAAO,OAAO,QAAQ,EACzC,EAAQ,WAAW,OAAO,OAAO,UAAU,EACvC,KACF,EAAQ,WAAW,OAAO,IAAI,EAAQ,OAAQ;GAEhD,EAEK;;AAGT,SAAgB,EAAyB,GAAiC,GAAyB;CAIjG,AAHA,EAAQ,WAAW,OAAO,OAAO,QAAQ,EACzC,EAAQ,WAAW,OAAO,OAAO,UAAU,EAEvC,GAAS,QAAQ,UAAU,CAAC,GAAS,UACvC,EAAQ,WAAW,OAAO,IAAI,EAAQ,OAAO;;AAQjD,SAAgB,EAA0B,GAA4B;CACpE,EAAS,QAAO,MAAK,EAAE,aAAa,QAAQ,CAAC,CAAC,SAAQ,MAAK,EAAE,aAAa,UAAU,GAAG,CAAC;;AAG1F,SAAgB,EAA6B,GAAkB,GAA4B;CACzF,EAAS,MAAK,MAAK,EAAE,SAAS,EAAQ,MAAM,SAAS,EAAE,OAAO,EAAE,gBAAgB,SAAS;;AAG3F,SAAgB,EAA+B,GAAkB,GAA4B;CAC3F,AAAI,EAAS,MAAK,MAAK,EAAE,MAAM,IAAI,EAAQ,MAAM,SAAS,SACxD,EAAS,QAAO,MAAK,EAAE,SAAS,CAAC,EAAQ,MAAM,SAAS,EAAE,OAAQ,CAAC,SAAQ,MAAK,EAAE,aAAa,UAAU,GAAG,CAAC"}
1
+ {"version":3,"file":"states.js","names":[],"sources":["../../../src/forms/utils/states.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n getAttributeChanges,\n getAttributeListChanges,\n getElementUpdate,\n matchesElementName\n} from '@nvidia-elements/core/internal';\nimport type { ControlGroup } from '../control-group/control-group.js';\nimport { ControlMessage } from '../control-message/control-message.js';\nimport type { Control } from '../control/control.js';\n\nexport const inputQuery = 'input, select, selectmenu, textarea, [nve-control]';\n\n/**\n * Adds validation states to custom element\n * :state(valid) form control is in a valid state\n * :state(invalid) form control is in a invalid state\n */\n// eslint-disable-next-line max-lines-per-function\nexport function setupControlValidationStates(control: Control, messages: ControlMessage[]) {\n if (\n !control.input.form?.noValidate &&\n !control.input.formNoValidate &&\n !control.input.hasAttribute('formnovalidate')\n ) {\n hideAllValidationMessages(messages);\n\n /**\n * updateValidityState() logic triggered by input blur() or input() change events\n */\n const updateValidityState = () => {\n if (control.input.validity?.valid) {\n control._internals.states.delete('invalid');\n control._internals.states.add('valid');\n control.status = null!;\n }\n\n hideInactiveValidationMessages(control, messages);\n };\n\n const resetValidityState = () => {\n control.status = null!;\n control._internals.states.delete('valid');\n control._internals.states.delete('invalid');\n hideAllValidationMessages(messages);\n };\n\n control.input.addEventListener('blur', () => {\n control.input.checkValidity();\n updateValidityState();\n });\n\n control.input.addEventListener('input', () => {\n updateValidityState();\n });\n\n control.input.addEventListener('invalid', () => {\n if (messages.find(m => m.error)) {\n hideAllValidationMessages(messages);\n showActiveValidationMessages(control, messages);\n }\n\n control.status = 'error';\n control._internals.states.delete('valid');\n control._internals.states.add('invalid');\n });\n\n control.addEventListener('reset', () => resetValidityState());\n control.input.form?.addEventListener('reset', () => resetValidityState());\n }\n\n control.shadowRoot!.addEventListener('slotchange', () => {\n const current = Array.from(control.querySelectorAll<ControlMessage>(ControlMessage.metadata.tag));\n control._internals.states.delete('valid');\n control._internals.states.delete('invalid');\n if (current.find(m => !m.hidden && (m.status === 'error' || m.error))) {\n control._internals.states.add('invalid');\n } else {\n control._internals.states.add('valid');\n }\n });\n}\n\n/**\n * Adds control interaction states to custom element\n * :state(checked) form control is in a checked state\n * :state(disabled) form control is in a disabled state\n * :state(readonly) form control is in a readonly state\n * :state(touched) form control received focus and then blurred\n * :state(dirty) user modified the form control\n */\nexport function setupControlStates(control: Control) {\n const observers: MutationObserver[] = [];\n const states = control._internals.states;\n control.input.checked ? states.add('checked') : states.delete('checked');\n control.input.indeterminate ? states.add('indeterminate') : states.delete('indeterminate');\n control.input.addEventListener('focus', () => control._internals.states.add('focus'));\n control.input.addEventListener('input', () => control._internals.states.add('dirty'));\n control.input.addEventListener('blur', () => {\n control._internals.states.add('touched');\n control._internals.states.delete('focus');\n });\n\n control.input.getRootNode().addEventListener('change', (e: Event) => {\n if ((e.target as HTMLInputElement).name === control.input?.name) {\n control.input.checked ? states.add('checked') : states.delete('checked');\n }\n });\n\n control.input.form?.addEventListener('reset', () => {\n control._internals.states.delete('touched');\n control._internals.states.delete('dirty');\n control._internals.states.delete('error');\n control._internals.states.delete('success');\n control.requestUpdate();\n });\n\n observers.push(\n getElementUpdate(control.input, 'readonly', value =>\n (value === '' ? true : value) ? states.add('readonly') : states.delete('readonly')\n ),\n getElementUpdate(control.input, 'checked', () =>\n control.input.checked ? states.add('checked') : states.delete('checked')\n ),\n getElementUpdate(control.input, 'disabled', value =>\n (value === '' ? true : value) ? states.add('disabled') : states.delete('disabled')\n ),\n getElementUpdate(control.input, 'indeterminate', () =>\n control.input.indeterminate ? states.add('indeterminate') : states.delete('indeterminate')\n )\n );\n return observers;\n}\n\n/**\n * Adds control group interaction states to custom element\n * :state(disabled) any form control within group is in a disabled state\n */\nexport function setupControlGroupStates(controlGroup: ControlGroup) {\n toggleControlGroupDisabledState(controlGroup);\n return getAttributeChanges(controlGroup, 'disabled', () => toggleControlGroupDisabledState(controlGroup));\n}\n\nfunction toggleControlGroupDisabledState(controlGroup: ControlGroup) {\n if (Array.from(controlGroup.inputs).find(i => i.disabled)) {\n controlGroup._internals.states.add('disabled');\n } else {\n controlGroup._internals.states.delete('disabled');\n }\n}\n\n/**\n * Adds control status states to custom element\n * :state(error) form control is in a error state\n * :state(success) form control is in a success state\n */\nexport function setupControlStatusStates(control: Control | ControlGroup, messages: ControlMessage[]) {\n updateControlStatusState(control, messages.find(m => !m.hidden)!);\n const observers: MutationObserver[] = [];\n observers.push(\n getAttributeListChanges(control, ['hidden', 'status'], mutation => {\n const target = mutation.target as ControlMessage;\n if (matchesElementName(target, ControlMessage)) {\n updateControlStatusState(control, target);\n }\n })\n );\n\n control.shadowRoot!.addEventListener('slotchange', () => {\n const current = Array.from(control.querySelectorAll<ControlMessage>(ControlMessage.metadata.tag));\n const message = current.find(m => m.status && !m.hidden);\n control._internals.states.delete('error');\n control._internals.states.delete('success');\n if (message) {\n control._internals.states.add(message.status!);\n }\n });\n\n return observers;\n}\n\nexport function updateControlStatusState(control: Control | ControlGroup, message: ControlMessage) {\n control._internals.states.delete('error');\n control._internals.states.delete('success');\n\n if (message?.status?.length && !message?.hidden) {\n control._internals.states.add(message.status);\n }\n}\n\nexport function showNonValidationMessages(messages: ControlMessage[]) {\n messages.filter(m => !m.hasAttribute('error')).forEach(m => m.removeAttribute('hidden'));\n}\n\nexport function hideAllValidationMessages(messages: ControlMessage[]) {\n messages.filter(m => m.hasAttribute('error')).forEach(m => m.setAttribute('hidden', ''));\n}\n\nexport function showActiveValidationMessages(control: Control, messages: ControlMessage[]) {\n messages.find(m => m.error && control.input.validity[m.error])?.removeAttribute('hidden');\n}\n\nexport function hideInactiveValidationMessages(control: Control, messages: ControlMessage[]) {\n if (messages.find(m => m.error) && control.input.validity.valid) {\n messages.filter(m => m.error && !control.input.validity[m.error!]).forEach(m => m.setAttribute('hidden', ''));\n }\n}\n"],"mappings":";;;AAaA,IAAa,IAAa;AAQ1B,SAAgB,EAA6B,GAAkB,GAA4B;CACzF,IACE,CAAC,EAAQ,MAAM,MAAM,cACrB,CAAC,EAAQ,MAAM,kBACf,CAAC,EAAQ,MAAM,aAAa,gBAAgB,GAC5C;EACA,EAA0B,CAAQ;EAKlC,IAAM,UAA4B;GAOhC,AANI,EAAQ,MAAM,UAAU,UAC1B,EAAQ,WAAW,OAAO,OAAO,SAAS,GAC1C,EAAQ,WAAW,OAAO,IAAI,OAAO,GACrC,EAAQ,SAAS,OAGnB,EAA+B,GAAS,CAAQ;EAClD,GAEM,UAA2B;GAI/B,AAHA,EAAQ,SAAS,MACjB,EAAQ,WAAW,OAAO,OAAO,OAAO,GACxC,EAAQ,WAAW,OAAO,OAAO,SAAS,GAC1C,EAA0B,CAAQ;EACpC;EAuBA,AArBA,EAAQ,MAAM,iBAAiB,cAAc;GAE3C,AADA,EAAQ,MAAM,cAAc,GAC5B,EAAoB;EACtB,CAAC,GAED,EAAQ,MAAM,iBAAiB,eAAe;GAC5C,EAAoB;EACtB,CAAC,GAED,EAAQ,MAAM,iBAAiB,iBAAiB;GAQ9C,AAPI,EAAS,MAAK,MAAK,EAAE,KAAK,MAC5B,EAA0B,CAAQ,GAClC,EAA6B,GAAS,CAAQ,IAGhD,EAAQ,SAAS,SACjB,EAAQ,WAAW,OAAO,OAAO,OAAO,GACxC,EAAQ,WAAW,OAAO,IAAI,SAAS;EACzC,CAAC,GAED,EAAQ,iBAAiB,eAAe,EAAmB,CAAC,GAC5D,EAAQ,MAAM,MAAM,iBAAiB,eAAe,EAAmB,CAAC;CAC1E;CAEA,EAAQ,WAAY,iBAAiB,oBAAoB;EACvD,IAAM,IAAU,MAAM,KAAK,EAAQ,iBAAiC,EAAe,SAAS,GAAG,CAAC;EAGhG,AAFA,EAAQ,WAAW,OAAO,OAAO,OAAO,GACxC,EAAQ,WAAW,OAAO,OAAO,SAAS,GACtC,EAAQ,MAAK,MAAK,CAAC,EAAE,WAAW,EAAE,WAAW,WAAW,EAAE,MAAM,IAClE,EAAQ,WAAW,OAAO,IAAI,SAAS,IAEvC,EAAQ,WAAW,OAAO,IAAI,OAAO;CAEzC,CAAC;AACH;AAUA,SAAgB,EAAmB,GAAkB;CACnD,IAAM,IAAgC,CAAC,GACjC,IAAS,EAAQ,WAAW;CAsClC,OArCA,EAAQ,MAAM,UAAU,EAAO,IAAI,SAAS,IAAI,EAAO,OAAO,SAAS,GACvE,EAAQ,MAAM,gBAAgB,EAAO,IAAI,eAAe,IAAI,EAAO,OAAO,eAAe,GACzF,EAAQ,MAAM,iBAAiB,eAAe,EAAQ,WAAW,OAAO,IAAI,OAAO,CAAC,GACpF,EAAQ,MAAM,iBAAiB,eAAe,EAAQ,WAAW,OAAO,IAAI,OAAO,CAAC,GACpF,EAAQ,MAAM,iBAAiB,cAAc;EAE3C,AADA,EAAQ,WAAW,OAAO,IAAI,SAAS,GACvC,EAAQ,WAAW,OAAO,OAAO,OAAO;CAC1C,CAAC,GAED,EAAQ,MAAM,YAAY,EAAE,iBAAiB,WAAW,MAAa;EACnE,AAAK,EAAE,OAA4B,SAAS,EAAQ,OAAO,SACzD,EAAQ,MAAM,UAAU,EAAO,IAAI,SAAS,IAAI,EAAO,OAAO,SAAS;CAE3E,CAAC,GAED,EAAQ,MAAM,MAAM,iBAAiB,eAAe;EAKlD,AAJA,EAAQ,WAAW,OAAO,OAAO,SAAS,GAC1C,EAAQ,WAAW,OAAO,OAAO,OAAO,GACxC,EAAQ,WAAW,OAAO,OAAO,OAAO,GACxC,EAAQ,WAAW,OAAO,OAAO,SAAS,GAC1C,EAAQ,cAAc;CACxB,CAAC,GAED,EAAU,KACR,EAAiB,EAAQ,OAAO,aAAY,MACzC,MAAU,MAAY,IAAS,EAAO,IAAI,UAAU,IAAI,EAAO,OAAO,UAAU,CACnF,GACA,EAAiB,EAAQ,OAAO,iBAC9B,EAAQ,MAAM,UAAU,EAAO,IAAI,SAAS,IAAI,EAAO,OAAO,SAAS,CACzE,GACA,EAAiB,EAAQ,OAAO,aAAY,MACzC,MAAU,MAAY,IAAS,EAAO,IAAI,UAAU,IAAI,EAAO,OAAO,UAAU,CACnF,GACA,EAAiB,EAAQ,OAAO,uBAC9B,EAAQ,MAAM,gBAAgB,EAAO,IAAI,eAAe,IAAI,EAAO,OAAO,eAAe,CAC3F,CACF,GACO;AACT;AAMA,SAAgB,EAAwB,GAA4B;CAElE,OADA,EAAgC,CAAY,GACrC,EAAoB,GAAc,kBAAkB,EAAgC,CAAY,CAAC;AAC1G;AAEA,SAAS,EAAgC,GAA4B;CACnE,AAAI,MAAM,KAAK,EAAa,MAAM,EAAE,MAAK,MAAK,EAAE,QAAQ,IACtD,EAAa,WAAW,OAAO,IAAI,UAAU,IAE7C,EAAa,WAAW,OAAO,OAAO,UAAU;AAEpD;AAOA,SAAgB,EAAyB,GAAiC,GAA4B;CACpG,EAAyB,GAAS,EAAS,MAAK,MAAK,CAAC,EAAE,MAAM,CAAE;CAChE,IAAM,IAAgC,CAAC;CAoBvC,OAnBA,EAAU,KACR,EAAwB,GAAS,CAAC,UAAU,QAAQ,IAAG,MAAY;EACjE,IAAM,IAAS,EAAS;EACxB,AAAI,EAAmB,GAAQ,CAAc,KAC3C,EAAyB,GAAS,CAAM;CAE5C,CAAC,CACH,GAEA,EAAQ,WAAY,iBAAiB,oBAAoB;EAEvD,IAAM,IADU,MAAM,KAAK,EAAQ,iBAAiC,EAAe,SAAS,GAAG,CAC/E,EAAQ,MAAK,MAAK,EAAE,UAAU,CAAC,EAAE,MAAM;EAGvD,AAFA,EAAQ,WAAW,OAAO,OAAO,OAAO,GACxC,EAAQ,WAAW,OAAO,OAAO,SAAS,GACtC,KACF,EAAQ,WAAW,OAAO,IAAI,EAAQ,MAAO;CAEjD,CAAC,GAEM;AACT;AAEA,SAAgB,EAAyB,GAAiC,GAAyB;CAIjG,AAHA,EAAQ,WAAW,OAAO,OAAO,OAAO,GACxC,EAAQ,WAAW,OAAO,OAAO,SAAS,GAEtC,GAAS,QAAQ,UAAU,CAAC,GAAS,UACvC,EAAQ,WAAW,OAAO,IAAI,EAAQ,MAAM;AAEhD;AAMA,SAAgB,EAA0B,GAA4B;CACpE,EAAS,QAAO,MAAK,EAAE,aAAa,OAAO,CAAC,EAAE,SAAQ,MAAK,EAAE,aAAa,UAAU,EAAE,CAAC;AACzF;AAEA,SAAgB,EAA6B,GAAkB,GAA4B;CACzF,EAAS,MAAK,MAAK,EAAE,SAAS,EAAQ,MAAM,SAAS,EAAE,MAAM,GAAG,gBAAgB,QAAQ;AAC1F;AAEA,SAAgB,EAA+B,GAAkB,GAA4B;CAC3F,AAAI,EAAS,MAAK,MAAK,EAAE,KAAK,KAAK,EAAQ,MAAM,SAAS,SACxD,EAAS,QAAO,MAAK,EAAE,SAAS,CAAC,EAAQ,MAAM,SAAS,EAAE,MAAO,EAAE,SAAQ,MAAK,EAAE,aAAa,UAAU,EAAE,CAAC;AAEhH"}
@@ -10,7 +10,7 @@ var a = class extends r {
10
10
  static {
11
11
  this.metadata = {
12
12
  tag: "nve-grid-cell",
13
- version: "0.1.1"
13
+ version: "0.1.2"
14
14
  };
15
15
  }
16
16
  render() {
@@ -1 +1 @@
1
- {"version":3,"file":"cell2.js","names":[],"sources":["../../../src/grid/cell/cell.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html, LitElement } from 'lit';\nimport { useStyles, attachInternals } from '@nvidia-elements/core/internal';\nimport styles from './cell.css?inline';\n\n/**\n * @element nve-grid-cell\n * @description Represents an individual data cell within a grid row, displaying content aligned to its parent column.\n * @since 0.11.0\n * @entrypoint \\@nvidia-elements/core/grid\n * @slot - default slot for content\n * @cssprop --background\n * @cssprop --color\n * @cssprop --padding\n * @cssprop --min-height\n * @cssprop --min-width\n * @cssprop --font-weight\n * @cssprop --font-size\n * @cssprop --height\n * @cssprop --border-left\n * @cssprop --border-right\n * @cssprop --justify-content\n * @aria https://www.w3.org/WAI/ARIA/apg/patterns/grid/\n */\nexport class GridCell extends LitElement {\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-grid-cell',\n version: '0.0.0'\n };\n\n /** @private */\n declare _internals: ElementInternals;\n\n render() {\n return html`\n <div internal-host focusable=\"active\">\n <slot></slot>\n </div>\n `;\n }\n\n connectedCallback() {\n super.connectedCallback();\n attachInternals(this);\n this._internals.role = 'gridcell';\n }\n}\n"],"mappings":";;;;;AA0BA,IAAa,IAAb,cAA8B,EAAW;;gBACvB,EAAU,CAAC,EAAO,CAAC;;;kBAER;GACzB,KAAK;GACL,SAAS;GACV;;CAKD,SAAS;EACP,OAAO,CAAI;;CAOb,oBAAoB;EAGlB,AAFA,MAAM,mBAAmB,EACzB,EAAgB,KAAK,EACrB,KAAK,WAAW,OAAO"}
1
+ {"version":3,"file":"cell2.js","names":[],"sources":["../../../src/grid/cell/cell.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html, LitElement } from 'lit';\nimport { useStyles, attachInternals } from '@nvidia-elements/core/internal';\nimport styles from './cell.css?inline';\n\n/**\n * @element nve-grid-cell\n * @description Represents an individual data cell within a grid row, displaying content aligned to its parent column.\n * @since 0.11.0\n * @entrypoint \\@nvidia-elements/core/grid\n * @slot - default slot for content\n * @cssprop --background\n * @cssprop --color\n * @cssprop --padding\n * @cssprop --min-height\n * @cssprop --min-width\n * @cssprop --font-weight\n * @cssprop --font-size\n * @cssprop --height\n * @cssprop --border-left\n * @cssprop --border-right\n * @cssprop --justify-content\n * @aria https://www.w3.org/WAI/ARIA/apg/patterns/grid/\n */\nexport class GridCell extends LitElement {\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-grid-cell',\n version: '0.0.0'\n };\n\n /** @private */\n declare _internals: ElementInternals;\n\n render() {\n return html`\n <div internal-host focusable=\"active\">\n <slot></slot>\n </div>\n `;\n }\n\n connectedCallback() {\n super.connectedCallback();\n attachInternals(this);\n this._internals.role = 'gridcell';\n }\n}\n"],"mappings":";;;;;AA0BA,IAAa,IAAb,cAA8B,EAAW;;gBACvB,EAAU,CAAC,CAAM,CAAC;;;kBAEP;GACzB,KAAK;GACL,SAAS;EACX;;CAKA,SAAS;EACP,OAAO,CAAI;CAKb;CAEA,oBAAoB;EAGlB,AAFA,MAAM,kBAAkB,GACxB,EAAgB,IAAI,GACpB,KAAK,WAAW,OAAO;CACzB;AACF"}
@@ -1,6 +1,6 @@
1
1
  import { appendRootNodeStyle as e } from "../../internal/utils/dom.js";
2
2
  import { attachInternals as t } from "../../internal/utils/a11y.js";
3
- import { __decorate as n } from "../../_virtual/_@oxc-project_runtime@0.128.0/helpers/decorate.js";
3
+ import { __decorate as n } from "../../_virtual/_@oxc-project_runtime@0.130.0/helpers/decorate.js";
4
4
  import { useStyles as r } from "../../internal/styles/index.js";
5
5
  import i from "./column.js";
6
6
  import { LitElement as a, html as o } from "lit";
@@ -13,7 +13,7 @@ var c = class n extends a {
13
13
  static {
14
14
  this.metadata = {
15
15
  tag: "nve-grid-column",
16
- version: "0.1.1"
16
+ version: "0.1.2"
17
17
  };
18
18
  }
19
19
  get #e() {
@@ -1 +1 @@
1
- {"version":3,"file":"column2.js","names":["#grid","#onSort","#computeColumnAlignment","#computeColumnPositions","#positionStylesheet","#buildFixedStyles","#buildBorderStyle"],"sources":["../../../src/grid/column/column.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { PropertyValues } from 'lit';\nimport { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport { useStyles, attachInternals, appendRootNodeStyle } from '@nvidia-elements/core/internal';\nimport type { Grid } from '@nvidia-elements/core/grid';\nimport styles from './column.css?inline';\n\n/**\n * @element nve-grid-column\n * @description Defines a column header within a grid, specifying the column's label, width, and alignment for all cells beneath it.\n * @since 0.11.0\n * @entrypoint \\@nvidia-elements/core/grid\n * @slot - default slot for content\n * @slot actions - slot for column actions\n * @cssprop --color\n * @cssprop --padding\n * @cssprop --font-weight\n * @cssprop --font-size\n * @cssprop --height\n * @cssprop --min-width\n * @cssprop --justify-content\n * @cssprop --border-left\n * @cssprop --border-right\n * @aria https://www.w3.org/WAI/ARIA/apg/patterns/grid/\n */\nexport class GridColumn extends LitElement {\n /**\n * Only set a fixed px width when you know the grid width. Most cases this should remain unset.\n * If the total width of all columns is less than the grid width then the last column fills the remaining space.\n * By default column widths are evenly divided unless width is explicitly provided.\n */\n @property({ type: String, reflect: true }) width: string;\n\n /**\n * Set the `position` property or attribute to `fixed` or `sticky` to make the column fixed or sticky.\n * Fixed columns do not scroll horizontally with the grid. Sticky columns scroll horizontally with the grid\n * until the column reaches the edge of the grid.\n */\n @property({ type: String, reflect: true }) position: 'fixed' | 'sticky' | '';\n\n /**\n * Control the content alignment within a given column.\n */\n @property({ type: String, reflect: true, attribute: 'column-align' }) columnAlign: 'start' | 'center' | 'end';\n\n /**\n * @private\n */\n @property({ type: String, reflect: true, attribute: 'aria-colindex' }) ariaColIndex: string; // eslint-disable-line local/reserved-property-names\n\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-grid-column',\n version: '0.0.0'\n };\n\n /** @private */\n declare _internals: ElementInternals;\n\n get #grid() {\n return this.parentElement!.parentElement as Grid;\n }\n\n render() {\n return html`\n <div internal-host focusable=\"active\">\n <slot></slot>\n <slot name=\"actions\"></slot>\n </div>\n `;\n }\n\n connectedCallback() {\n super.connectedCallback();\n attachInternals(this);\n this._internals.role = 'columnheader';\n this.addEventListener('sort', this.#onSort);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('sort', this.#onSort);\n }\n\n #onSort = (e: Event) => {\n this.ariaSort = (e as CustomEvent<{ next: string }>).detail.next;\n };\n\n willUpdate(props: PropertyValues<this>) {\n if (props.has('width') && this.width && Number.isFinite(Number(this.width))) {\n this.width = `${this.width}px`; // eslint-disable-line local/stateless-property\n }\n }\n\n async updated(props: PropertyValues<this>) {\n super.updated(props);\n\n if (props.get('columnAlign') !== this.columnAlign) {\n this.#computeColumnAlignment();\n }\n\n if (props.get('position') !== this.position) {\n this.#computeColumnPositions();\n }\n\n if (props.get('ariaColIndex') !== this.ariaColIndex) {\n this.#computeColumnPositions();\n this.#computeColumnAlignment();\n }\n\n if (props.get('width') !== this.width) {\n this.dispatchEvent(new CustomEvent('nve-grid-column-resize', { bubbles: true, composed: true }));\n }\n }\n\n #positionStylesheet: CSSStyleSheet;\n\n #computeColumnPositions() {\n if (this.position !== 'fixed') {\n this.removeAttribute('left');\n this.removeAttribute('right');\n this.#positionStylesheet?.replaceSync('');\n return;\n }\n\n const { side, positionStyle, borderStyle } = this.#buildFixedStyles();\n const combinedStyle = `${positionStyle}\\n${borderStyle}`;\n\n if (this.#positionStylesheet) {\n this.#positionStylesheet.replaceSync(combinedStyle);\n } else {\n this.#positionStylesheet = appendRootNodeStyle(this.#grid, combinedStyle);\n }\n\n this.setAttribute(side, '');\n }\n\n #buildFixedStyles() {\n const columns = Array.from(this.parentElement!.querySelectorAll<GridColumn>(GridColumn.metadata.tag));\n const rightColumns = columns.slice(columns.indexOf(this) + 1, columns.length);\n const position = this.getBoundingClientRect();\n const gridPosition = this.#grid.getBoundingClientRect();\n const side = this.offsetLeft < gridPosition.width / 2 ? 'left' : 'right';\n const leftStyle = position.left - gridPosition.left;\n const rightStyle = rightColumns.reduce((width, c) => width + c.getBoundingClientRect().width, 0);\n const selector = `[id='${this.#grid.id}'] nve-grid-column:nth-of-type(${this.ariaColIndex}),\n [id='${this.#grid.id}'] nve-grid-cell:nth-of-type(${this.ariaColIndex})`;\n\n const positionStyle = `\n ${selector} {\n position: sticky;\n z-index: 99;\n ${side === 'left' ? `left: ${leftStyle}px;` : `right: ${rightStyle}px;`}\n }\n `;\n\n const borderStyle = this.#buildBorderStyle(selector, side);\n return { side, positionStyle, borderStyle };\n }\n\n #buildBorderStyle(selector: string, side: 'left' | 'right') {\n const isLastLeft = side === 'left' && (this.nextElementSibling as GridColumn)?.position !== this.position;\n const isLastRight = side === 'right' && (this.previousElementSibling as GridColumn)?.position !== this.position;\n\n if (!isLastLeft && !isLastRight) {\n return '';\n }\n\n return `\n ${selector} {\n box-shadow: var(--scroll-shadow);\n clip-path: inset(0px ${isLastLeft ? '-4px' : '0'} 0px ${isLastRight ? '-4px' : '0'});\n --border-${side === 'right' ? 'left' : 'right'}: var(--nve-ref-border-width-sm) solid var(--nve-ref-border-color-muted);\n }\n `;\n }\n\n #computeColumnAlignment() {\n if (this.columnAlign !== undefined) {\n appendRootNodeStyle(\n this.#grid,\n `[id='${this.#grid.id}'] nve-grid-column:nth-of-type(${this.ariaColIndex}),\n [id='${this.#grid.id}'] nve-grid-cell:nth-of-type(${this.ariaColIndex}) {\n --justify-content: ${this.columnAlign}\n }`\n );\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"column2.js","names":["#grid","#onSort","#computeColumnAlignment","#computeColumnPositions","#positionStylesheet","#buildFixedStyles","#buildBorderStyle"],"sources":["../../../src/grid/column/column.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { PropertyValues } from 'lit';\nimport { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport { useStyles, attachInternals, appendRootNodeStyle } from '@nvidia-elements/core/internal';\nimport type { Grid } from '@nvidia-elements/core/grid';\nimport styles from './column.css?inline';\n\n/**\n * @element nve-grid-column\n * @description Defines a column header within a grid, specifying the column's label, width, and alignment for all cells beneath it.\n * @since 0.11.0\n * @entrypoint \\@nvidia-elements/core/grid\n * @slot - default slot for content\n * @slot actions - slot for column actions\n * @cssprop --color\n * @cssprop --padding\n * @cssprop --font-weight\n * @cssprop --font-size\n * @cssprop --height\n * @cssprop --min-width\n * @cssprop --justify-content\n * @cssprop --border-left\n * @cssprop --border-right\n * @aria https://www.w3.org/WAI/ARIA/apg/patterns/grid/\n */\nexport class GridColumn extends LitElement {\n /**\n * Only set a fixed px width when you know the grid width. Most cases this should remain unset.\n * If the total width of all columns is less than the grid width then the last column fills the remaining space.\n * By default column widths are evenly divided unless width is explicitly provided.\n */\n @property({ type: String, reflect: true }) width: string;\n\n /**\n * Set the `position` property or attribute to `fixed` or `sticky` to make the column fixed or sticky.\n * Fixed columns do not scroll horizontally with the grid. Sticky columns scroll horizontally with the grid\n * until the column reaches the edge of the grid.\n */\n @property({ type: String, reflect: true }) position: 'fixed' | 'sticky' | '';\n\n /**\n * Control the content alignment within a given column.\n */\n @property({ type: String, reflect: true, attribute: 'column-align' }) columnAlign: 'start' | 'center' | 'end';\n\n /**\n * @private\n */\n @property({ type: String, reflect: true, attribute: 'aria-colindex' }) ariaColIndex: string; // eslint-disable-line local/reserved-property-names\n\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-grid-column',\n version: '0.0.0'\n };\n\n /** @private */\n declare _internals: ElementInternals;\n\n get #grid() {\n return this.parentElement!.parentElement as Grid;\n }\n\n render() {\n return html`\n <div internal-host focusable=\"active\">\n <slot></slot>\n <slot name=\"actions\"></slot>\n </div>\n `;\n }\n\n connectedCallback() {\n super.connectedCallback();\n attachInternals(this);\n this._internals.role = 'columnheader';\n this.addEventListener('sort', this.#onSort);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('sort', this.#onSort);\n }\n\n #onSort = (e: Event) => {\n this.ariaSort = (e as CustomEvent<{ next: string }>).detail.next;\n };\n\n willUpdate(props: PropertyValues<this>) {\n if (props.has('width') && this.width && Number.isFinite(Number(this.width))) {\n this.width = `${this.width}px`; // eslint-disable-line local/stateless-property\n }\n }\n\n async updated(props: PropertyValues<this>) {\n super.updated(props);\n\n if (props.get('columnAlign') !== this.columnAlign) {\n this.#computeColumnAlignment();\n }\n\n if (props.get('position') !== this.position) {\n this.#computeColumnPositions();\n }\n\n if (props.get('ariaColIndex') !== this.ariaColIndex) {\n this.#computeColumnPositions();\n this.#computeColumnAlignment();\n }\n\n if (props.get('width') !== this.width) {\n this.dispatchEvent(new CustomEvent('nve-grid-column-resize', { bubbles: true, composed: true }));\n }\n }\n\n #positionStylesheet: CSSStyleSheet;\n\n #computeColumnPositions() {\n if (this.position !== 'fixed') {\n this.removeAttribute('left');\n this.removeAttribute('right');\n this.#positionStylesheet?.replaceSync('');\n return;\n }\n\n const { side, positionStyle, borderStyle } = this.#buildFixedStyles();\n const combinedStyle = `${positionStyle}\\n${borderStyle}`;\n\n if (this.#positionStylesheet) {\n this.#positionStylesheet.replaceSync(combinedStyle);\n } else {\n this.#positionStylesheet = appendRootNodeStyle(this.#grid, combinedStyle);\n }\n\n this.setAttribute(side, '');\n }\n\n #buildFixedStyles() {\n const columns = Array.from(this.parentElement!.querySelectorAll<GridColumn>(GridColumn.metadata.tag));\n const rightColumns = columns.slice(columns.indexOf(this) + 1, columns.length);\n const position = this.getBoundingClientRect();\n const gridPosition = this.#grid.getBoundingClientRect();\n const side = this.offsetLeft < gridPosition.width / 2 ? 'left' : 'right';\n const leftStyle = position.left - gridPosition.left;\n const rightStyle = rightColumns.reduce((width, c) => width + c.getBoundingClientRect().width, 0);\n const selector = `[id='${this.#grid.id}'] nve-grid-column:nth-of-type(${this.ariaColIndex}),\n [id='${this.#grid.id}'] nve-grid-cell:nth-of-type(${this.ariaColIndex})`;\n\n const positionStyle = `\n ${selector} {\n position: sticky;\n z-index: 99;\n ${side === 'left' ? `left: ${leftStyle}px;` : `right: ${rightStyle}px;`}\n }\n `;\n\n const borderStyle = this.#buildBorderStyle(selector, side);\n return { side, positionStyle, borderStyle };\n }\n\n #buildBorderStyle(selector: string, side: 'left' | 'right') {\n const isLastLeft = side === 'left' && (this.nextElementSibling as GridColumn)?.position !== this.position;\n const isLastRight = side === 'right' && (this.previousElementSibling as GridColumn)?.position !== this.position;\n\n if (!isLastLeft && !isLastRight) {\n return '';\n }\n\n return `\n ${selector} {\n box-shadow: var(--scroll-shadow);\n clip-path: inset(0px ${isLastLeft ? '-4px' : '0'} 0px ${isLastRight ? '-4px' : '0'});\n --border-${side === 'right' ? 'left' : 'right'}: var(--nve-ref-border-width-sm) solid var(--nve-ref-border-color-muted);\n }\n `;\n }\n\n #computeColumnAlignment() {\n if (this.columnAlign !== undefined) {\n appendRootNodeStyle(\n this.#grid,\n `[id='${this.#grid.id}'] nve-grid-column:nth-of-type(${this.ariaColIndex}),\n [id='${this.#grid.id}'] nve-grid-cell:nth-of-type(${this.ariaColIndex}) {\n --justify-content: ${this.columnAlign}\n }`\n );\n }\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"define.js","names":[],"sources":["../../src/grid/define.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { define } from '@nvidia-elements/core/internal';\nimport {\n Grid,\n GridColumn,\n GridRow,\n GridCell,\n GridFooter,\n GridHeader,\n GridPlaceholder\n} from '@nvidia-elements/core/grid';\n\ndefine(Grid);\ndefine(GridColumn);\ndefine(GridRow);\ndefine(GridCell);\ndefine(GridFooter);\ndefine(GridHeader);\ndefine(GridPlaceholder);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nve-grid': Grid;\n 'nve-grid-column': GridColumn;\n 'nve-grid-row': GridRow;\n 'nve-grid-cell': GridCell;\n 'nve-grid-footer': GridFooter;\n 'nve-grid-header': GridHeader;\n 'nve-grid-placeholder': GridPlaceholder;\n }\n}\n"],"mappings":";;;;;;;;AAcA,EAAO,EAAK,EACZ,EAAO,EAAW,EAClB,EAAO,EAAQ,EACf,EAAO,EAAS,EAChB,EAAO,EAAW,EAClB,EAAO,EAAW,EAClB,EAAO,EAAgB"}
1
+ {"version":3,"file":"define.js","names":[],"sources":["../../src/grid/define.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { define } from '@nvidia-elements/core/internal';\nimport {\n Grid,\n GridColumn,\n GridRow,\n GridCell,\n GridFooter,\n GridHeader,\n GridPlaceholder\n} from '@nvidia-elements/core/grid';\n\ndefine(Grid);\ndefine(GridColumn);\ndefine(GridRow);\ndefine(GridCell);\ndefine(GridFooter);\ndefine(GridHeader);\ndefine(GridPlaceholder);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nve-grid': Grid;\n 'nve-grid-column': GridColumn;\n 'nve-grid-row': GridRow;\n 'nve-grid-cell': GridCell;\n 'nve-grid-footer': GridFooter;\n 'nve-grid-header': GridHeader;\n 'nve-grid-placeholder': GridPlaceholder;\n }\n}\n"],"mappings":";;;;;;;;AAcA,EAAO,CAAI,GACX,EAAO,CAAU,GACjB,EAAO,CAAO,GACd,EAAO,CAAQ,GACf,EAAO,CAAU,GACjB,EAAO,CAAU,GACjB,EAAO,CAAe"}
@@ -1,5 +1,5 @@
1
1
  import { attachInternals as e } from "../../internal/utils/a11y.js";
2
- import { __decorate as t } from "../../_virtual/_@oxc-project_runtime@0.128.0/helpers/decorate.js";
2
+ import { __decorate as t } from "../../_virtual/_@oxc-project_runtime@0.130.0/helpers/decorate.js";
3
3
  import { hostAttr as n } from "../../internal/decorators/host-attr.js";
4
4
  import { useStyles as r } from "../../internal/styles/index.js";
5
5
  import i from "./footer.js";
@@ -15,7 +15,7 @@ var s = class extends a {
15
15
  static {
16
16
  this.metadata = {
17
17
  tag: "nve-grid-footer",
18
- version: "0.1.1"
18
+ version: "0.1.2"
19
19
  };
20
20
  }
21
21
  static {
@@ -1 +1 @@
1
- {"version":3,"file":"footer2.js","names":[],"sources":["../../../src/grid/footer/footer.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html, LitElement } from 'lit';\nimport { useStyles, attachInternals, hostAttr } from '@nvidia-elements/core/internal';\nimport styles from './footer.css?inline';\n\n/**\n * @element nve-grid-footer\n * @since 0.11.0\n * @entrypoint \\@nvidia-elements/core/grid\n * @description Grid footer displays contextual information or user actions such as pagination.\n * @slot - default slot for content\n * @cssprop --background\n * @cssprop --color\n * @cssprop --padding\n * @cssprop --height\n * @aria https://www.w3.org/WAI/ARIA/apg/patterns/grid/\n */\nexport class GridFooter extends LitElement {\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-grid-footer',\n version: '0.0.0'\n };\n\n static elementDefinitions = {};\n\n /** @private */\n _internals: ElementInternals;\n\n @hostAttr() slot = 'footer';\n\n render() {\n return html`\n <div internal-host role=\"gridcell\">\n <slot></slot>\n </div>\n `;\n }\n\n connectedCallback() {\n super.connectedCallback();\n attachInternals(this);\n this._internals.role = 'row';\n }\n}\n"],"mappings":";;;;;;;AAmBA,IAAa,IAAb,cAAgC,EAAW;;2BAatB;;;gBAZH,EAAU,CAAC,EAAO,CAAC;;;kBAER;GACzB,KAAK;GACL,SAAS;GACV;;;4BAE2B,EAAE;;CAO9B,SAAS;EACP,OAAO,CAAI;;CAOb,oBAAoB;EAGlB,AAFA,MAAM,mBAAmB,EACzB,EAAgB,KAAK,EACrB,KAAK,WAAW,OAAO;;;GAbxB,GAAU,CAAA,EAAA,EAAA,WAAA,QAAA,KAAA,EAAA"}
1
+ {"version":3,"file":"footer2.js","names":[],"sources":["../../../src/grid/footer/footer.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html, LitElement } from 'lit';\nimport { useStyles, attachInternals, hostAttr } from '@nvidia-elements/core/internal';\nimport styles from './footer.css?inline';\n\n/**\n * @element nve-grid-footer\n * @since 0.11.0\n * @entrypoint \\@nvidia-elements/core/grid\n * @description Grid footer displays contextual information or user actions such as pagination.\n * @slot - default slot for content\n * @cssprop --background\n * @cssprop --color\n * @cssprop --padding\n * @cssprop --height\n * @aria https://www.w3.org/WAI/ARIA/apg/patterns/grid/\n */\nexport class GridFooter extends LitElement {\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-grid-footer',\n version: '0.0.0'\n };\n\n static elementDefinitions = {};\n\n /** @private */\n _internals: ElementInternals;\n\n @hostAttr() slot = 'footer';\n\n render() {\n return html`\n <div internal-host role=\"gridcell\">\n <slot></slot>\n </div>\n `;\n }\n\n connectedCallback() {\n super.connectedCallback();\n attachInternals(this);\n this._internals.role = 'row';\n }\n}\n"],"mappings":";;;;;;;AAmBA,IAAa,IAAb,cAAgC,EAAW;;2BAatB;;;gBAZH,EAAU,CAAC,CAAM,CAAC;;;kBAEP;GACzB,KAAK;GACL,SAAS;EACX;;;4BAE4B,CAAC;;CAO7B,SAAS;EACP,OAAO,CAAI;CAKb;CAEA,oBAAoB;EAGlB,AAFA,MAAM,kBAAkB,GACxB,EAAgB,IAAI,GACpB,KAAK,WAAW,OAAO;CACzB;AACF;GAfG,EAAS,CAAA,GAAA,EAAA,WAAA,QAAA,KAAA,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import { appendRootNodeStyle as e, generateId as t } from "../internal/utils/dom.js";
2
2
  import { attachInternals as n } from "../internal/utils/a11y.js";
3
- import { __decorate as r } from "../_virtual/_@oxc-project_runtime@0.128.0/helpers/decorate.js";
3
+ import { __decorate as r } from "../_virtual/_@oxc-project_runtime@0.130.0/helpers/decorate.js";
4
4
  import { audit as i } from "../internal/controllers/audit.controller.js";
5
5
  import { keyNavigationGrid as a } from "../internal/controllers/keynav-grid.controller.js";
6
6
  import { useStyles as o } from "../internal/styles/index.js";
@@ -22,7 +22,7 @@ var v = class extends h {
22
22
  static {
23
23
  this.metadata = {
24
24
  tag: "nve-grid",
25
- version: "0.1.1",
25
+ version: "0.1.2",
26
26
  children: [
27
27
  u.metadata.tag,
28
28
  d.metadata.tag,
@@ -1 +1 @@
1
- {"version":3,"file":"grid2.js","names":["#columns","#header","#rows","#cells"],"sources":["../../src/grid/grid.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport type { ContainerElement } from '@nvidia-elements/core/internal';\nimport {\n keyNavigationGrid,\n useStyles,\n attachInternals,\n appendRootNodeStyle,\n generateId,\n audit\n} from '@nvidia-elements/core/internal';\nimport { GridPlaceholder } from './placeholder/placeholder.js';\nimport { GridHeader } from './header/header.js';\nimport { GridColumn } from './column/column.js';\nimport { GridFooter } from './footer/footer.js';\nimport { GridRow } from './row/row.js';\nimport { GridCell } from './cell/cell.js';\nimport styles from './grid.css?inline';\nimport globalStyles from './grid.global.css?inline';\n\n/**\n * @element nve-grid\n * @description A versatile table/datagrid component with built-in keyboard navigation for displaying and interacting with structured data. Use it for anything from simple read-only tables to fully interactive, spreadsheet experiences.\n * @since 0.11.0\n * @entrypoint \\@nvidia-elements/core/grid\n * @slot - default slot for content\n * @slot footer - slot for grid-footer or toolbar\n * @cssprop --background\n * @cssprop --color\n * @cssprop --border-radius\n * @cssprop --box-shadow\n * @cssprop --font-size\n * @cssprop --row-height - fixed height of each row\n * @cssprop --scroll-height - height of the scrollable area\n\n * @aria https://www.w3.org/WAI/ARIA/apg/patterns/grid/\n */\n@audit()\n@keyNavigationGrid<Grid>()\nexport class Grid extends LitElement implements ContainerElement {\n /**\n * Determines the container styles of component. Flat nests the grid within other containers. Full spans the full edge-to-edge viewport width.\n */\n @property({ type: String, reflect: true }) container?: 'flat' | 'full';\n\n /**\n * Determine style variant stripe rows\n */\n @property({ type: Boolean, reflect: true }) stripe: boolean;\n\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-grid',\n version: '0.0.0',\n children: [GridRow.metadata.tag, GridHeader.metadata.tag, GridFooter.metadata.tag, GridPlaceholder.metadata.tag]\n };\n\n static elementDefinitions = {};\n\n get keynavGridConfig() {\n return {\n columns: this.#columns,\n rows: [this.#header!, ...this.#rows],\n cells: [...this.#columns, ...this.#cells]\n };\n }\n\n get #rows() {\n return Array.from(this.querySelectorAll<GridRow>(GridRow.metadata.tag));\n }\n\n get #header() {\n return this.querySelector<GridHeader>(GridHeader.metadata.tag);\n }\n\n get #columns() {\n return Array.from(this.querySelectorAll<GridColumn>(GridColumn.metadata.tag));\n }\n\n get #cells() {\n return Array.from(this.querySelectorAll<GridCell>(GridCell.metadata.tag));\n }\n\n /** @private */\n declare _internals: ElementInternals;\n\n render() {\n return html`\n <div internal-host>\n <div part=\"_scrollbox\">\n <slot></slot>\n </div>\n <slot name=\"footer\"></slot>\n </div>\n `;\n }\n\n connectedCallback() {\n super.connectedCallback();\n attachInternals(this);\n this._internals.role = 'grid';\n this.id ||= generateId();\n appendRootNodeStyle(this, globalStyles);\n }\n\n /**\n * Scroll to a specific position in the grid.\n */\n scrollTo(options?: ScrollToOptions): Promise<void>;\n scrollTo(x: number, y: number): Promise<void>;\n async scrollTo(...args: [options?: ScrollToOptions] | [x: number, y: number]): Promise<void> {\n await this.shadowRoot!.querySelector('[part=\"_scrollbox\"]')?.scrollTo(...(args as [ScrollToOptions]));\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA0CO,IAAA,IAAA,cAAmB,EAAuC;;gBAW/C,EAAU,CAAC,EAAO,CAAC;;;kBAER;GACzB,KAAK;GACL,SAAS;GACT,UAAU;IAAC,EAAQ,SAAS;IAAK,EAAW,SAAS;IAAK,EAAW,SAAS;IAAK,EAAgB,SAAS;;GAC7G;;;4BAE2B,EAAE;;CAE9B,IAAI,mBAAmB;EACrB,OAAO;GACL,SAAS,KAAKA;GACd,MAAM,CAAC,KAAKC,IAAU,GAAG,KAAKC,GAAM;GACpC,OAAO,CAAC,GAAG,KAAKF,IAAU,GAAG,KAAKG,GAAAA;GACnC;;CAGH,IAAID,KAAQ;EACV,OAAO,MAAM,KAAK,KAAK,iBAA0B,EAAQ,SAAS,IAAI,CAAC;;CAGzE,IAAID,KAAU;EACZ,OAAO,KAAK,cAA0B,EAAW,SAAS,IAAI;;CAGhE,IAAID,KAAW;EACb,OAAO,MAAM,KAAK,KAAK,iBAA6B,EAAW,SAAS,IAAI,CAAC;;CAG/E,IAAIG,KAAS;EACX,OAAO,MAAM,KAAK,KAAK,iBAA2B,EAAS,SAAS,IAAI,CAAC;;CAM3E,SAAS;EACP,OAAO,CAAI;;CAUb,oBAAoB;EAKlB,AAJA,MAAM,mBAAmB,EACzB,EAAgB,KAAK,EACrB,KAAK,WAAW,OAAO,QACvB,KAAK,OAAO,GAAY,EACxB,EAAoB,MAAM,EAAa;;CAQzC,MAAM,SAAS,GAAG,GAA2E;EAC3F,MAAM,KAAK,WAAY,cAAc,wBAAsB,EAAE,SAAS,GAAI,EAA2B;;;GArEtG,EAAS;CAAE,MAAM;CAAQ,SAAS;CAAM,CAAC,CAAA,EAAA,EAAA,WAAA,aAAA,KAAA,EAAA,KAKzC,EAAS;CAAE,MAAM;CAAS,SAAS;CAAM,CAAC,CAAA,EAAA,EAAA,WAAA,UAAA,KAAA,EAAA,SAX5C,GAAO,EACP,GAAyB,CAAA,EAAA,EAAA"}
1
+ {"version":3,"file":"grid2.js","names":["#columns","#header","#rows","#cells"],"sources":["../../src/grid/grid.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport type { ContainerElement } from '@nvidia-elements/core/internal';\nimport {\n keyNavigationGrid,\n useStyles,\n attachInternals,\n appendRootNodeStyle,\n generateId,\n audit\n} from '@nvidia-elements/core/internal';\nimport { GridPlaceholder } from './placeholder/placeholder.js';\nimport { GridHeader } from './header/header.js';\nimport { GridColumn } from './column/column.js';\nimport { GridFooter } from './footer/footer.js';\nimport { GridRow } from './row/row.js';\nimport { GridCell } from './cell/cell.js';\nimport styles from './grid.css?inline';\nimport globalStyles from './grid.global.css?inline';\n\n/**\n * @element nve-grid\n * @description A versatile table/datagrid component with built-in keyboard navigation for displaying and interacting with structured data. Use it for anything from simple read-only tables to fully interactive, spreadsheet experiences.\n * @since 0.11.0\n * @entrypoint \\@nvidia-elements/core/grid\n * @slot - default slot for content\n * @slot footer - slot for grid-footer or toolbar\n * @cssprop --background\n * @cssprop --color\n * @cssprop --border-radius\n * @cssprop --box-shadow\n * @cssprop --font-size\n * @cssprop --row-height - fixed height of each row\n * @cssprop --scroll-height - height of the scrollable area\n\n * @aria https://www.w3.org/WAI/ARIA/apg/patterns/grid/\n */\n@audit()\n@keyNavigationGrid<Grid>()\nexport class Grid extends LitElement implements ContainerElement {\n /**\n * Determines the container styles of component. Flat nests the grid within other containers. Full spans the full edge-to-edge viewport width.\n */\n @property({ type: String, reflect: true }) container?: 'flat' | 'full';\n\n /**\n * Determine style variant stripe rows\n */\n @property({ type: Boolean, reflect: true }) stripe: boolean;\n\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-grid',\n version: '0.0.0',\n children: [GridRow.metadata.tag, GridHeader.metadata.tag, GridFooter.metadata.tag, GridPlaceholder.metadata.tag]\n };\n\n static elementDefinitions = {};\n\n get keynavGridConfig() {\n return {\n columns: this.#columns,\n rows: [this.#header!, ...this.#rows],\n cells: [...this.#columns, ...this.#cells]\n };\n }\n\n get #rows() {\n return Array.from(this.querySelectorAll<GridRow>(GridRow.metadata.tag));\n }\n\n get #header() {\n return this.querySelector<GridHeader>(GridHeader.metadata.tag);\n }\n\n get #columns() {\n return Array.from(this.querySelectorAll<GridColumn>(GridColumn.metadata.tag));\n }\n\n get #cells() {\n return Array.from(this.querySelectorAll<GridCell>(GridCell.metadata.tag));\n }\n\n /** @private */\n declare _internals: ElementInternals;\n\n render() {\n return html`\n <div internal-host>\n <div part=\"_scrollbox\">\n <slot></slot>\n </div>\n <slot name=\"footer\"></slot>\n </div>\n `;\n }\n\n connectedCallback() {\n super.connectedCallback();\n attachInternals(this);\n this._internals.role = 'grid';\n this.id ||= generateId();\n appendRootNodeStyle(this, globalStyles);\n }\n\n /**\n * Scroll to a specific position in the grid.\n */\n scrollTo(options?: ScrollToOptions): Promise<void>;\n scrollTo(x: number, y: number): Promise<void>;\n async scrollTo(...args: [options?: ScrollToOptions] | [x: number, y: number]): Promise<void> {\n await this.shadowRoot!.querySelector('[part=\"_scrollbox\"]')?.scrollTo(...(args as [ScrollToOptions]));\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA0CO,IAAA,IAAA,cAAmB,EAAuC;;gBAW/C,EAAU,CAAC,CAAM,CAAC;;;kBAEP;GACzB,KAAK;GACL,SAAS;GACT,UAAU;IAAC,EAAQ,SAAS;IAAK,EAAW,SAAS;IAAK,EAAW,SAAS;IAAK,EAAgB,SAAS;GAAG;EACjH;;;4BAE4B,CAAC;;CAE7B,IAAI,mBAAmB;EACrB,OAAO;GACL,SAAS,KAAKA;GACd,MAAM,CAAC,KAAKC,IAAU,GAAG,KAAKC,EAAK;GACnC,OAAO,CAAC,GAAG,KAAKF,IAAU,GAAG,KAAKG,EAAM;EAC1C;CACF;CAEA,IAAID,KAAQ;EACV,OAAO,MAAM,KAAK,KAAK,iBAA0B,EAAQ,SAAS,GAAG,CAAC;CACxE;CAEA,IAAID,KAAU;EACZ,OAAO,KAAK,cAA0B,EAAW,SAAS,GAAG;CAC/D;CAEA,IAAID,KAAW;EACb,OAAO,MAAM,KAAK,KAAK,iBAA6B,EAAW,SAAS,GAAG,CAAC;CAC9E;CAEA,IAAIG,KAAS;EACX,OAAO,MAAM,KAAK,KAAK,iBAA2B,EAAS,SAAS,GAAG,CAAC;CAC1E;CAKA,SAAS;EACP,OAAO,CAAI;CAQb;CAEA,oBAAoB;EAKlB,AAJA,MAAM,kBAAkB,GACxB,EAAgB,IAAI,GACpB,KAAK,WAAW,OAAO,QACvB,KAAK,OAAO,EAAW,GACvB,EAAoB,MAAM,CAAY;CACxC;CAOA,MAAM,SAAS,GAAG,GAA2E;EAC3F,MAAM,KAAK,WAAY,cAAc,uBAAqB,GAAG,SAAS,GAAI,CAA0B;CACtG;AACF;GAvEG,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,aAAA,KAAA,CAAA,MAKxC,EAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,UAAA,KAAA,CAAA,UAX3C,EAAM,GACN,EAAwB,CAAA,GAAA,CAAA"}