@nvidia-elements/core 2.7.3 → 2.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/README.md +8 -0
  3. package/dist/_virtual/{_@oxc-project_runtime@0.139.0 → _@oxc-project_runtime@0.147.0}/helpers/esm/decorate.js +1 -1
  4. package/dist/accordion/accordion.examples.json +9 -9
  5. package/dist/accordion/accordion2.js +5 -5
  6. package/dist/accordion/accordion2.js.map +1 -1
  7. package/dist/alert/alert-group2.js +2 -2
  8. package/dist/alert/alert-group2.js.map +1 -1
  9. package/dist/alert/alert.examples.json +3 -3
  10. package/dist/alert/alert2.js +2 -2
  11. package/dist/alert/alert2.js.map +1 -1
  12. package/dist/avatar/avatar-group2.js +1 -1
  13. package/dist/avatar/avatar-group2.js.map +1 -1
  14. package/dist/avatar/avatar2.js +2 -2
  15. package/dist/avatar/avatar2.js.map +1 -1
  16. package/dist/badge/badge.examples.json +2 -2
  17. package/dist/badge/badge2.js +2 -2
  18. package/dist/badge/badge2.js.map +1 -1
  19. package/dist/breadcrumb/breadcrumb.examples.json +1 -1
  20. package/dist/breadcrumb/breadcrumb2.js +2 -2
  21. package/dist/breadcrumb/breadcrumb2.js.map +1 -1
  22. package/dist/bundles/index.d.ts +8 -0
  23. package/dist/bundles/index.js +6 -6
  24. package/dist/button/button.examples.json +3 -3
  25. package/dist/button/button2.js +2 -2
  26. package/dist/button/button2.js.map +1 -1
  27. package/dist/button-group/button-group2.js +2 -2
  28. package/dist/button-group/button-group2.js.map +1 -1
  29. package/dist/card/card.examples.json +2 -2
  30. package/dist/card/card2.js +5 -5
  31. package/dist/card/card2.js.map +1 -1
  32. package/dist/chat-message/chat-message.examples.json +4 -4
  33. package/dist/chat-message/chat-message2.js +2 -2
  34. package/dist/chat-message/chat-message2.js.map +1 -1
  35. package/dist/checkbox/checkbox-group2.js +2 -2
  36. package/dist/checkbox/checkbox-group2.js.map +1 -1
  37. package/dist/checkbox/checkbox2.js +2 -2
  38. package/dist/checkbox/checkbox2.js.map +1 -1
  39. package/dist/color/color2.js +2 -2
  40. package/dist/color/color2.js.map +1 -1
  41. package/dist/combobox/combobox.examples.js.map +1 -1
  42. package/dist/combobox/combobox.examples.json +5 -5
  43. package/dist/combobox/combobox2.js +7 -5
  44. package/dist/combobox/combobox2.js.map +1 -1
  45. package/dist/copy-button/copy-button.examples.json +2 -2
  46. package/dist/copy-button/copy-button2.js +2 -2
  47. package/dist/copy-button/copy-button2.js.map +1 -1
  48. package/dist/custom-elements-jsx.d.ts +5 -1
  49. package/dist/custom-elements-vue.d.ts +5 -1
  50. package/dist/custom-elements.json +50 -34
  51. package/dist/data.html.json +2 -2
  52. package/dist/date/date2.js +2 -2
  53. package/dist/date/date2.js.map +1 -1
  54. package/dist/datetime/datetime2.js +2 -2
  55. package/dist/datetime/datetime2.js.map +1 -1
  56. package/dist/dialog/dialog-footer2.js +2 -2
  57. package/dist/dialog/dialog-footer2.js.map +1 -1
  58. package/dist/dialog/dialog-header2.js +2 -2
  59. package/dist/dialog/dialog-header2.js.map +1 -1
  60. package/dist/dialog/dialog.examples.json +3 -3
  61. package/dist/dialog/dialog2.js +2 -2
  62. package/dist/dialog/dialog2.js.map +1 -1
  63. package/dist/divider/divider.examples.json +1 -1
  64. package/dist/divider/divider2.js +2 -2
  65. package/dist/divider/divider2.js.map +1 -1
  66. package/dist/dot/dot2.js +2 -2
  67. package/dist/dot/dot2.js.map +1 -1
  68. package/dist/drawer/drawer-content2.js +2 -2
  69. package/dist/drawer/drawer-content2.js.map +1 -1
  70. package/dist/drawer/drawer-footer2.js +2 -2
  71. package/dist/drawer/drawer-footer2.js.map +1 -1
  72. package/dist/drawer/drawer-header2.js +2 -2
  73. package/dist/drawer/drawer-header2.js.map +1 -1
  74. package/dist/drawer/drawer2.js +2 -2
  75. package/dist/drawer/drawer2.js.map +1 -1
  76. package/dist/dropdown/dropdown-footer2.js +2 -2
  77. package/dist/dropdown/dropdown-footer2.js.map +1 -1
  78. package/dist/dropdown/dropdown-header2.js +2 -2
  79. package/dist/dropdown/dropdown-header2.js.map +1 -1
  80. package/dist/dropdown/dropdown2.js +2 -2
  81. package/dist/dropdown/dropdown2.js.map +1 -1
  82. package/dist/dropdown-group/dropdown-group.examples.json +4 -4
  83. package/dist/dropdown-group/dropdown-group.js +2 -2
  84. package/dist/dropdown-group/dropdown-group.js.map +1 -1
  85. package/dist/dropzone/dropzone.examples.json +1 -1
  86. package/dist/dropzone/dropzone2.js +2 -2
  87. package/dist/dropzone/dropzone2.js.map +1 -1
  88. package/dist/file/file2.js +1 -1
  89. package/dist/file/file2.js.map +1 -1
  90. package/dist/format-bytes/format-bytes2.js +2 -2
  91. package/dist/format-bytes/format-bytes2.js.map +1 -1
  92. package/dist/format-datetime/format-datetime.examples.json +3 -3
  93. package/dist/format-datetime/format-datetime2.js +2 -2
  94. package/dist/format-datetime/format-datetime2.js.map +1 -1
  95. package/dist/format-number/format-number2.js +2 -2
  96. package/dist/format-number/format-number2.js.map +1 -1
  97. package/dist/format-relative-time/format-relative-time2.js +2 -2
  98. package/dist/format-relative-time/format-relative-time2.js.map +1 -1
  99. package/dist/format-truncate/format-truncate.examples.json +4 -4
  100. package/dist/format-truncate/format-truncate2.js +2 -2
  101. package/dist/format-truncate/format-truncate2.js.map +1 -1
  102. package/dist/forms/actions.examples.json +1 -1
  103. package/dist/forms/control/control.examples.json +1 -1
  104. package/dist/forms/control/control2.js +2 -2
  105. package/dist/forms/control/control2.js.map +1 -1
  106. package/dist/forms/control-group/control-group2.js +2 -2
  107. package/dist/forms/control-group/control-group2.js.map +1 -1
  108. package/dist/forms/control-message/control-message2.js +2 -2
  109. package/dist/forms/control-message/control-message2.js.map +1 -1
  110. package/dist/forms/validation.examples.js.map +1 -1
  111. package/dist/gauge/gauge.examples.json +2 -2
  112. package/dist/gauge/gauge2.js +2 -2
  113. package/dist/gauge/gauge2.js.map +1 -1
  114. package/dist/grid/cell/cell2.js +1 -1
  115. package/dist/grid/cell/cell2.js.map +1 -1
  116. package/dist/grid/column/column2.js +2 -2
  117. package/dist/grid/column/column2.js.map +1 -1
  118. package/dist/grid/footer/footer2.js +2 -2
  119. package/dist/grid/footer/footer2.js.map +1 -1
  120. package/dist/grid/grid.examples.js.map +1 -1
  121. package/dist/grid/grid.examples.json +34 -34
  122. package/dist/grid/grid2.js +2 -2
  123. package/dist/grid/grid2.js.map +1 -1
  124. package/dist/grid/header/header2.js +2 -2
  125. package/dist/grid/header/header2.js.map +1 -1
  126. package/dist/grid/placeholder/placeholder2.js +1 -1
  127. package/dist/grid/placeholder/placeholder2.js.map +1 -1
  128. package/dist/grid/row/row2.js +2 -2
  129. package/dist/grid/row/row2.js.map +1 -1
  130. package/dist/icon/icon2.js +3 -3
  131. package/dist/icon/icon2.js.map +1 -1
  132. package/dist/icon-button/icon-button2.js +2 -2
  133. package/dist/icon-button/icon-button2.js.map +1 -1
  134. package/dist/index.js +1 -1
  135. package/dist/input/input-group2.js +1 -1
  136. package/dist/input/input-group2.js.map +1 -1
  137. package/dist/input/input2.js +2 -2
  138. package/dist/input/input2.js.map +1 -1
  139. package/dist/internal/controllers/audit.controller.js +9 -7
  140. package/dist/internal/controllers/audit.controller.js.map +1 -1
  141. package/dist/internal/controllers/gesture.controller.examples.js.map +1 -1
  142. package/dist/internal/controllers/gesture.controller.js +1 -3
  143. package/dist/internal/controllers/gesture.controller.js.map +1 -1
  144. package/dist/internal/controllers/i18n.controller.examples.js.map +1 -1
  145. package/dist/internal/controllers/i18n.controller.js.map +1 -1
  146. package/dist/internal/controllers/keynav-grid.controller.examples.json +1 -1
  147. package/dist/internal/controllers/keynav-grid.controller.js.map +1 -1
  148. package/dist/internal/controllers/keynav-list.controller.examples.json +1 -1
  149. package/dist/internal/controllers/keynav-list.controller.js +1 -4
  150. package/dist/internal/controllers/keynav-list.controller.js.map +1 -1
  151. package/dist/internal/controllers/keynav-spatial.controller.js.map +1 -1
  152. package/dist/internal/controllers/popover.examples.json +2 -2
  153. package/dist/internal/controllers/state-scroll.controller.js.map +1 -1
  154. package/dist/internal/controllers/type-anchor.controller.js.map +1 -1
  155. package/dist/internal/controllers/type-closable.controller.js.map +1 -1
  156. package/dist/internal/controllers/type-expandable.controller.js.map +1 -1
  157. package/dist/internal/controllers/type-native-popover.controller.js.map +1 -1
  158. package/dist/internal/controllers/type-native-popover.utils.js +2 -2
  159. package/dist/internal/controllers/type-native-popover.utils.js.map +1 -1
  160. package/dist/internal/controllers/type-selectable.controller.js.map +1 -1
  161. package/dist/internal/controllers/type-ssr.controller.js.map +1 -1
  162. package/dist/internal/services/global.service.js +1 -1
  163. package/dist/internal/services/global.utils.js.map +1 -1
  164. package/dist/internal/services/log.service.js.map +1 -1
  165. package/dist/internal/services/transition.service.js.map +1 -1
  166. package/dist/internal/utils/dom.js +2 -1
  167. package/dist/internal/utils/dom.js.map +1 -1
  168. package/dist/internal/utils/strings.js +1 -1
  169. package/dist/internal/utils/strings.js.map +1 -1
  170. package/dist/logo/logo.examples.json +1 -1
  171. package/dist/logo/logo2.js +2 -2
  172. package/dist/logo/logo2.js.map +1 -1
  173. package/dist/menu/menu-item2.js +2 -2
  174. package/dist/menu/menu-item2.js.map +1 -1
  175. package/dist/menu/menu.examples.js.map +1 -1
  176. package/dist/menu/menu.examples.json +4 -4
  177. package/dist/menu/menu2.js +2 -2
  178. package/dist/menu/menu2.js.map +1 -1
  179. package/dist/month/month2.js +2 -2
  180. package/dist/month/month2.js.map +1 -1
  181. package/dist/notification/notification-group2.js +2 -2
  182. package/dist/notification/notification-group2.js.map +1 -1
  183. package/dist/notification/notification.examples.json +3 -3
  184. package/dist/notification/notification2.js +2 -2
  185. package/dist/notification/notification2.js.map +1 -1
  186. package/dist/page/page-panel/page-panel-content2.js +1 -1
  187. package/dist/page/page-panel/page-panel-content2.js.map +1 -1
  188. package/dist/page/page-panel/page-panel-footer2.js +2 -2
  189. package/dist/page/page-panel/page-panel-footer2.js.map +1 -1
  190. package/dist/page/page-panel/page-panel-header2.js +2 -2
  191. package/dist/page/page-panel/page-panel-header2.js.map +1 -1
  192. package/dist/page/page-panel/page-panel2.js +2 -2
  193. package/dist/page/page-panel/page-panel2.js.map +1 -1
  194. package/dist/page/page.examples.json +10 -10
  195. package/dist/page/page2.js +2 -2
  196. package/dist/page/page2.js.map +1 -1
  197. package/dist/page-header/page-header.examples.json +1 -1
  198. package/dist/page-header/page-header2.js +1 -1
  199. package/dist/page-header/page-header2.js.map +1 -1
  200. package/dist/page-loader/page-loader2.js +2 -2
  201. package/dist/page-loader/page-loader2.js.map +1 -1
  202. package/dist/pagination/pagination.examples.json +6 -6
  203. package/dist/pagination/pagination2.js +2 -2
  204. package/dist/pagination/pagination2.js.map +1 -1
  205. package/dist/panel/panel2.js +5 -5
  206. package/dist/panel/panel2.js.map +1 -1
  207. package/dist/password/password2.js +2 -2
  208. package/dist/password/password2.js.map +1 -1
  209. package/dist/polyfills/index.js +1 -1
  210. package/dist/polyfills/index.js.map +1 -1
  211. package/dist/preferences-input/preferences-input.examples.json +1 -1
  212. package/dist/preferences-input/preferences-input2.js +2 -2
  213. package/dist/preferences-input/preferences-input2.js.map +1 -1
  214. package/dist/progress-bar/progress-bar.examples.json +1 -1
  215. package/dist/progress-bar/progress-bar2.js +2 -2
  216. package/dist/progress-bar/progress-bar2.js.map +1 -1
  217. package/dist/progress-ring/progress-ring2.js +2 -2
  218. package/dist/progress-ring/progress-ring2.js.map +1 -1
  219. package/dist/progressive-filter-chip/progressive-filter-chip2.js +2 -2
  220. package/dist/progressive-filter-chip/progressive-filter-chip2.js.map +1 -1
  221. package/dist/pulse/pulse2.js +2 -2
  222. package/dist/pulse/pulse2.js.map +1 -1
  223. package/dist/radio/radio-group2.js +2 -2
  224. package/dist/radio/radio-group2.js.map +1 -1
  225. package/dist/radio/radio2.js +2 -2
  226. package/dist/radio/radio2.js.map +1 -1
  227. package/dist/range/range.examples.json +1 -1
  228. package/dist/range/range2.js +4 -4
  229. package/dist/range/range2.js.map +1 -1
  230. package/dist/resize-handle/resize-handle.examples.json +4 -4
  231. package/dist/resize-handle/resize-handle2.js +2 -2
  232. package/dist/resize-handle/resize-handle2.js.map +1 -1
  233. package/dist/search/search2.js +2 -2
  234. package/dist/search/search2.js.map +1 -1
  235. package/dist/select/select2.js +2 -2
  236. package/dist/select/select2.js.map +1 -1
  237. package/dist/skeleton/skeleton2.js +2 -2
  238. package/dist/skeleton/skeleton2.js.map +1 -1
  239. package/dist/sort-button/sort-button2.js +2 -2
  240. package/dist/sort-button/sort-button2.js.map +1 -1
  241. package/dist/sparkline/sparkline.examples.json +2 -2
  242. package/dist/sparkline/sparkline.utils.js +1 -3
  243. package/dist/sparkline/sparkline.utils.js.map +1 -1
  244. package/dist/sparkline/sparkline2.js +8 -6
  245. package/dist/sparkline/sparkline2.js.map +1 -1
  246. package/dist/star-rating/star-rating2.js +2 -2
  247. package/dist/star-rating/star-rating2.js.map +1 -1
  248. package/dist/steps/steps2.js +3 -3
  249. package/dist/steps/steps2.js.map +1 -1
  250. package/dist/switch/switch-group2.js +2 -2
  251. package/dist/switch/switch-group2.js.map +1 -1
  252. package/dist/switch/switch2.js +2 -2
  253. package/dist/switch/switch2.js.map +1 -1
  254. package/dist/tabs/tabs-group2.js +2 -2
  255. package/dist/tabs/tabs-group2.js.map +1 -1
  256. package/dist/tabs/tabs.examples.json +4 -4
  257. package/dist/tabs/tabs2.js +3 -3
  258. package/dist/tabs/tabs2.js.map +1 -1
  259. package/dist/tag/tag.d.ts +2 -0
  260. package/dist/tag/tag.examples.js.map +1 -1
  261. package/dist/tag/tag.examples.json +20 -3
  262. package/dist/tag/tag.js +1 -1
  263. package/dist/tag/tag.js.map +1 -1
  264. package/dist/tag/tag2.js +3 -3
  265. package/dist/tag/tag2.js.map +1 -1
  266. package/dist/textarea/textarea.d.ts +7 -1
  267. package/dist/textarea/textarea.examples.js.map +1 -1
  268. package/dist/textarea/textarea.examples.json +22 -0
  269. package/dist/textarea/textarea.js +1 -1
  270. package/dist/textarea/textarea.js.map +1 -1
  271. package/dist/textarea/textarea2.js +10 -3
  272. package/dist/textarea/textarea2.js.map +1 -1
  273. package/dist/time/time2.js +2 -2
  274. package/dist/time/time2.js.map +1 -1
  275. package/dist/toast/toast.examples.json +1 -1
  276. package/dist/toast/toast2.js +2 -2
  277. package/dist/toast/toast2.js.map +1 -1
  278. package/dist/toggletip/toggletip-footer2.js +2 -2
  279. package/dist/toggletip/toggletip-footer2.js.map +1 -1
  280. package/dist/toggletip/toggletip-header2.js +2 -2
  281. package/dist/toggletip/toggletip-header2.js.map +1 -1
  282. package/dist/toggletip/toggletip2.js +2 -2
  283. package/dist/toggletip/toggletip2.js.map +1 -1
  284. package/dist/toolbar/toolbar2.js +2 -2
  285. package/dist/toolbar/toolbar2.js.map +1 -1
  286. package/dist/tooltip/tooltip.examples.js.map +1 -1
  287. package/dist/tooltip/tooltip.examples.json +2 -2
  288. package/dist/tooltip/tooltip2.js +2 -2
  289. package/dist/tooltip/tooltip2.js.map +1 -1
  290. package/dist/tree/tree-node2.js +2 -2
  291. package/dist/tree/tree-node2.js.map +1 -1
  292. package/dist/tree/tree.examples.js.map +1 -1
  293. package/dist/tree/tree2.js +2 -2
  294. package/dist/tree/tree2.js.map +1 -1
  295. package/dist/week/week2.js +2 -2
  296. package/dist/week/week2.js.map +1 -1
  297. package/package.json +9 -9
@@ -1,7 +1,7 @@
1
1
  import { applySlotContentStates as e, hasHorizontalScrollBar as t } from "../internal/utils/dom.js";
2
2
  import { attachInternals as n } from "../internal/utils/a11y.js";
3
3
  import { statusStateStyles as r, supportStateStyles as i, useStyles as a } from "../internal/styles/index.js";
4
- import o from "../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorate.js";
4
+ import o from "../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorate.js";
5
5
  import s from "./toolbar.js";
6
6
  import { LitElement as c, html as l } from "lit";
7
7
  import { property as u } from "lit/decorators/property.js";
@@ -21,7 +21,7 @@ var f = class extends c {
21
21
  static {
22
22
  this.metadata = {
23
23
  tag: "nve-toolbar",
24
- version: "2.7.3"
24
+ version: "2.8.1"
25
25
  };
26
26
  }
27
27
  static {
@@ -1 +1 @@
1
- {"version":3,"file":"toolbar2.js","names":["#scrollbox","#slottedElements","#slotchange","#setupScrollbarListener","#updateContainers","#updateOrientation","#observers","#setScrollbarState"],"sources":["../../src/toolbar/toolbar.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 { queryAssignedElements } from 'lit/decorators/query-assigned-elements.js';\nimport type { ContainerElement } from '@nvidia-elements/core/internal';\nimport {\n useStyles,\n statusStateStyles,\n supportStateStyles,\n attachInternals,\n applySlotContentStates,\n hasHorizontalScrollBar\n} from '@nvidia-elements/core/internal';\nimport styles from './toolbar.css?inline';\n\n/**\n * @element nve-toolbar\n * @description A toolbar is a container for grouping a set of controls, such as buttons, icon buttons and combobox search.\n * @documentation https://nvidia.github.io/elements/docs/elements/toolbar/\n * @since 0.19.0\n * @entrypoint \\@nvidia-elements/core/toolbar\n * @slot - Primary buttons, inputs, and other toolbar controls.\n * @slot prefix - slot for prefix content\n * @slot suffix - slot for suffix content\n * @cssprop --background\n * @cssprop --color\n * @cssprop --padding\n * @cssprop --min-height\n * @cssprop --border-radius\n * @cssprop --gap\n * @cssprop --border-bottom\n * @cssprop --box-shadow\n * @cssprop --width\n * @aria https://www.w3.org/WAI/ARIA/apg/patterns/toolbar/\n */\nexport class Toolbar extends LitElement implements ContainerElement {\n static styles = useStyles([styles, statusStateStyles, supportStateStyles]);\n\n static readonly metadata = {\n tag: 'nve-toolbar',\n version: '0.0.0'\n };\n\n static elementDefinitions = {};\n\n /**\n * Determines the container styles of component. Flat applies when nesting elements within other containers or for a more muted style. Full applies when the element expands the full width of the viewport.\n */\n @property({ type: String, reflect: true }) container?: 'flat' | 'inset' | 'full';\n\n /**\n * Determines the primary content overflow behavior.\n */\n @property({ type: String, reflect: true }) content?: 'scroll' | 'wrap' = 'scroll';\n\n /**\n * Determines the orientation direction of the toolbar. Vertical toolbars support icon buttons only.\n */\n @property({ type: String, reflect: true }) orientation?: 'horizontal' | 'vertical' = 'horizontal';\n\n /**\n * Visual treatment to represent accent color for interactive selections\n */\n @property({ type: String, reflect: true }) status: 'accent';\n\n /** @private */\n declare _internals: ElementInternals;\n\n #observers: (MutationObserver | ResizeObserver)[] = [];\n\n get #scrollbox() {\n return this.shadowRoot!.querySelector<HTMLSlotElement>('slot:not([name])');\n }\n\n @queryAssignedElements({ slot: 'prefix' }) private prefixElements!: HTMLElement[];\n\n @queryAssignedElements({ slot: 'suffix' }) private suffixElements!: HTMLElement[];\n\n @queryAssignedElements() private defaultElements!: HTMLElement[];\n\n get #slottedElements() {\n return [...this.prefixElements, ...this.defaultElements, ...this.suffixElements];\n }\n\n render() {\n return html`\n <div internal-host @slotchange=${this.#slotchange}>\n <slot name=\"prefix\"></slot>\n <slot></slot>\n <slot name=\"suffix\"></slot>\n </div>\n `;\n }\n\n connectedCallback() {\n super.connectedCallback();\n attachInternals(this);\n this._internals.role = 'toolbar';\n }\n\n firstUpdated(props: PropertyValues<this>) {\n super.firstUpdated(props);\n this.#setupScrollbarListener();\n }\n\n updated(props: PropertyValues<this>) {\n super.updated(props);\n this.#updateContainers();\n this.#updateOrientation();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.#observers.forEach(observer => observer.disconnect());\n }\n\n #slotchange(e: Event) {\n applySlotContentStates(e.target as HTMLSlotElement, this);\n this.#updateContainers();\n this.#updateOrientation();\n this.#setScrollbarState();\n }\n\n #setupScrollbarListener() {\n this.#setScrollbarState();\n const observer = new ResizeObserver(() => this.#setScrollbarState());\n this.#observers.push(observer);\n observer.observe(this);\n }\n\n #setScrollbarState() {\n if (hasHorizontalScrollBar(this.#scrollbox as HTMLElement)) {\n this._internals.states.add('scrollbar');\n } else {\n this._internals.states.delete('scrollbar');\n }\n }\n\n #updateContainers() {\n const slottedElements = this.#slottedElements as (HTMLElement & { container: string })[];\n slottedElements\n .filter(e =>\n e.matches(\n 'nve-button-group, nve-input, nve-search, nve-combobox, nve-button, nve-select, nve-icon-button, nve-copy-button'\n )\n )\n .forEach(e => (e.container = 'flat'));\n }\n\n #updateOrientation() {\n const slottedElements = this.#slottedElements as (HTMLElement & { orientation: string })[];\n slottedElements\n .filter(e => e.matches('nve-divider'))\n .forEach(divider => (divider.orientation = this.orientation === 'horizontal' ? 'vertical' : 'horizontal'));\n slottedElements\n .filter(e => e.matches('nve-button-group'))\n .forEach(group => (group.orientation = this.orientation!));\n }\n}\n"],"mappings":";;;;;;;;;AAsCA,IAAa,IAAb,cAA6B,EAAuC;;8BAkBO,6BAKY,wBAUjC,CAAC;;;gBAhCrC,EAAU;GAAC;GAAQ;GAAmB;EAAkB,CAAC;;;kBAE9C;GACzB,KAAK;GACL,SAAS;EACX;;;4BAE4B,CAAC;;CAyB7B;CAEA,IAAIA,KAAa;EACf,OAAO,KAAK,WAAY,cAA+B,kBAAkB;CAC3E;CAQA,IAAIC,KAAmB;EACrB,OAAO;GAAC,GAAG,KAAK;GAAgB,GAAG,KAAK;GAAiB,GAAG,KAAK;EAAc;CACjF;CAEA,SAAS;EACP,OAAO,CAAI,mCACwB,KAAKC,GAAY;CAMtD;CAEA,oBAAoB;EAGlB,AAFA,MAAM,kBAAkB,GACxB,EAAgB,IAAI,GACpB,KAAK,WAAW,OAAO;CACzB;CAEA,aAAa,GAA6B;EAExC,AADA,MAAM,aAAa,CAAK,GACxB,KAAKC,GAAwB;CAC/B;CAEA,QAAQ,GAA6B;EAGnC,AAFA,MAAM,QAAQ,CAAK,GACnB,KAAKC,GAAkB,GACvB,KAAKC,GAAmB;CAC1B;CAEA,uBAAuB;EAErB,AADA,MAAM,qBAAqB,GAC3B,KAAKC,GAAW,SAAQ,MAAY,EAAS,WAAW,CAAC;CAC3D;CAEA,GAAY,GAAU;EAIpB,AAHA,EAAuB,EAAE,QAA2B,IAAI,GACxD,KAAKF,GAAkB,GACvB,KAAKC,GAAmB,GACxB,KAAKE,GAAmB;CAC1B;CAEA,KAA0B;EACxB,KAAKA,GAAmB;EACxB,IAAM,IAAW,IAAI,qBAAqB,KAAKA,GAAmB,CAAC;EAEnE,AADA,KAAKD,GAAW,KAAK,CAAQ,GAC7B,EAAS,QAAQ,IAAI;CACvB;CAEA,KAAqB;EACnB,AAAI,EAAuB,KAAKN,EAAyB,IACvD,KAAK,WAAW,OAAO,IAAI,WAAW,IAEtC,KAAK,WAAW,OAAO,OAAO,WAAW;CAE7C;CAEA,KAAoB;EAElB,KAD6BC,GAE1B,QAAO,MACN,EAAE,QACA,iHACF,CACF,CAAC,CACA,SAAQ,MAAM,EAAE,YAAY,MAAO;CACxC;CAEA,KAAqB;EACnB,IAAM,IAAkB,KAAKA;EAI7B,AAHA,EACG,QAAO,MAAK,EAAE,QAAQ,aAAa,CAAC,CAAC,CACrC,SAAQ,MAAY,EAAQ,cAAc,KAAK,gBAAgB,eAAe,aAAa,YAAa,GAC3G,EACG,QAAO,MAAK,EAAE,QAAQ,kBAAkB,CAAC,CAAC,CAC1C,SAAQ,MAAU,EAAM,cAAc,KAAK,WAAa;CAC7D;AACF;GA9GG,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,aAAA,KAAA,CAAA,MAKxC,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,WAAA,KAAA,CAAA,MAKxC,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,eAAA,KAAA,CAAA,MAKxC,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,UAAA,KAAA,CAAA,MAWxC,EAAsB,EAAE,MAAM,SAAS,CAAC,CAAA,GAAA,EAAA,WAAA,kBAAA,KAAA,CAAA,MAExC,EAAsB,EAAE,MAAM,SAAS,CAAC,CAAA,GAAA,EAAA,WAAA,kBAAA,KAAA,CAAA,MAExC,EAAsB,CAAA,GAAA,EAAA,WAAA,mBAAA,KAAA,CAAA"}
1
+ {"version":3,"file":"toolbar2.js","names":[],"sources":["../../src/toolbar/toolbar.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 { queryAssignedElements } from 'lit/decorators/query-assigned-elements.js';\nimport type { ContainerElement } from '@nvidia-elements/core/internal';\nimport {\n useStyles,\n statusStateStyles,\n supportStateStyles,\n attachInternals,\n applySlotContentStates,\n hasHorizontalScrollBar\n} from '@nvidia-elements/core/internal';\nimport styles from './toolbar.css?inline';\n\n/**\n * @element nve-toolbar\n * @description A toolbar is a container for grouping a set of controls, such as buttons, icon buttons and combobox search.\n * @documentation https://nvidia.github.io/elements/docs/elements/toolbar/\n * @since 0.19.0\n * @entrypoint \\@nvidia-elements/core/toolbar\n * @slot - Primary buttons, inputs, and other toolbar controls.\n * @slot prefix - slot for prefix content\n * @slot suffix - slot for suffix content\n * @cssprop --background\n * @cssprop --color\n * @cssprop --padding\n * @cssprop --min-height\n * @cssprop --border-radius\n * @cssprop --gap\n * @cssprop --border-bottom\n * @cssprop --box-shadow\n * @cssprop --width\n * @aria https://www.w3.org/WAI/ARIA/apg/patterns/toolbar/\n */\nexport class Toolbar extends LitElement implements ContainerElement {\n static styles = useStyles([styles, statusStateStyles, supportStateStyles]);\n\n static readonly metadata = {\n tag: 'nve-toolbar',\n version: '0.0.0'\n };\n\n static elementDefinitions = {};\n\n /**\n * Determines the container styles of component. Flat applies when nesting elements within other containers or for a more muted style. Full applies when the element expands the full width of the viewport.\n */\n @property({ type: String, reflect: true }) container?: 'flat' | 'inset' | 'full';\n\n /**\n * Determines the primary content overflow behavior.\n */\n @property({ type: String, reflect: true }) content?: 'scroll' | 'wrap' = 'scroll';\n\n /**\n * Determines the orientation direction of the toolbar. Vertical toolbars support icon buttons only.\n */\n @property({ type: String, reflect: true }) orientation?: 'horizontal' | 'vertical' = 'horizontal';\n\n /**\n * Visual treatment to represent accent color for interactive selections\n */\n @property({ type: String, reflect: true }) status: 'accent';\n\n /** @private */\n declare _internals: ElementInternals;\n\n #observers: (MutationObserver | ResizeObserver)[] = [];\n\n get #scrollbox() {\n return this.shadowRoot!.querySelector<HTMLSlotElement>('slot:not([name])');\n }\n\n @queryAssignedElements({ slot: 'prefix' }) private prefixElements!: HTMLElement[];\n\n @queryAssignedElements({ slot: 'suffix' }) private suffixElements!: HTMLElement[];\n\n @queryAssignedElements() private defaultElements!: HTMLElement[];\n\n get #slottedElements() {\n return [...this.prefixElements, ...this.defaultElements, ...this.suffixElements];\n }\n\n render() {\n return html`\n <div internal-host @slotchange=${this.#slotchange}>\n <slot name=\"prefix\"></slot>\n <slot></slot>\n <slot name=\"suffix\"></slot>\n </div>\n `;\n }\n\n connectedCallback() {\n super.connectedCallback();\n attachInternals(this);\n this._internals.role = 'toolbar';\n }\n\n firstUpdated(props: PropertyValues<this>) {\n super.firstUpdated(props);\n this.#setupScrollbarListener();\n }\n\n updated(props: PropertyValues<this>) {\n super.updated(props);\n this.#updateContainers();\n this.#updateOrientation();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.#observers.forEach(observer => observer.disconnect());\n }\n\n #slotchange(e: Event) {\n applySlotContentStates(e.target as HTMLSlotElement, this);\n this.#updateContainers();\n this.#updateOrientation();\n this.#setScrollbarState();\n }\n\n #setupScrollbarListener() {\n this.#setScrollbarState();\n const observer = new ResizeObserver(() => this.#setScrollbarState());\n this.#observers.push(observer);\n observer.observe(this);\n }\n\n #setScrollbarState() {\n if (hasHorizontalScrollBar(this.#scrollbox as HTMLElement)) {\n this._internals.states.add('scrollbar');\n } else {\n this._internals.states.delete('scrollbar');\n }\n }\n\n #updateContainers() {\n const slottedElements = this.#slottedElements as (HTMLElement & { container: string })[];\n slottedElements\n .filter(e =>\n e.matches(\n 'nve-button-group, nve-input, nve-search, nve-combobox, nve-button, nve-select, nve-icon-button, nve-copy-button'\n )\n )\n .forEach(e => (e.container = 'flat'));\n }\n\n #updateOrientation() {\n const slottedElements = this.#slottedElements as (HTMLElement & { orientation: string })[];\n slottedElements\n .filter(e => e.matches('nve-divider'))\n .forEach(divider => (divider.orientation = this.orientation === 'horizontal' ? 'vertical' : 'horizontal'));\n slottedElements\n .filter(e => e.matches('nve-button-group'))\n .forEach(group => (group.orientation = this.orientation!));\n }\n}\n"],"mappings":";;;;;;;;;AAsCA,IAAa,IAAb,cAA6B,EAAuC;;EAiCd,aAfqB,KAAA,UAAA,UAKY,KAAA,cAAA,cAUjC,KAAA,KAAA,CAAC;;;EAhCrC,KAAA,SAAA,EAAU;GAAC;GAAQ;GAAmB;EAAkB,CAAC;;;EAE9C,KAAA,WAAA;GACzB,KAAK;GACL,SAAS;EACX;;;EAE4B,KAAA,qBAAA,CAAC;;CAyB7B;CAEA,IAAI,KAAa;EACf,OAAO,KAAK,WAAY,cAA+B,kBAAkB;CAC3E;CAQA,IAAI,KAAmB;EACrB,OAAO;GAAC,GAAG,KAAK;GAAgB,GAAG,KAAK;GAAiB,GAAG,KAAK;EAAc;CACjF;CAEA,SAAS;EACP,OAAO,CAAI,mCACwB,KAAK,GAAY;CAMtD;CAEA,oBAAoB;EAGlB,AAFA,MAAM,kBAAkB,GACxB,EAAgB,IAAI,GACpB,KAAK,WAAW,OAAO;CACzB;CAEA,aAAa,GAA6B;EAExC,AADA,MAAM,aAAa,CAAK,GACxB,KAAK,GAAwB;CAC/B;CAEA,QAAQ,GAA6B;EAGnC,AAFA,MAAM,QAAQ,CAAK,GACnB,KAAK,GAAkB,GACvB,KAAK,GAAmB;CAC1B;CAEA,uBAAuB;EAErB,AADA,MAAM,qBAAqB,GAC3B,KAAK,GAAW,SAAQ,MAAY,EAAS,WAAW,CAAC;CAC3D;CAEA,GAAY,GAAU;EAIpB,AAHA,EAAuB,EAAE,QAA2B,IAAI,GACxD,KAAK,GAAkB,GACvB,KAAK,GAAmB,GACxB,KAAK,GAAmB;CAC1B;CAEA,KAA0B;EACxB,KAAK,GAAmB;EACxB,IAAM,IAAW,IAAI,qBAAqB,KAAK,GAAmB,CAAC;EAEnE,AADA,KAAK,GAAW,KAAK,CAAQ,GAC7B,EAAS,QAAQ,IAAI;CACvB;CAEA,KAAqB;EACnB,AAAI,EAAuB,KAAK,EAAyB,IACvD,KAAK,WAAW,OAAO,IAAI,WAAW,IAEtC,KAAK,WAAW,OAAO,OAAO,WAAW;CAE7C;CAEA,KAAoB;EAElB,KAD6B,GAE1B,QAAO,MACN,EAAE,QACA,iHACF,CACF,CAAC,CACA,SAAQ,MAAM,EAAE,YAAY,MAAO;CACxC;CAEA,KAAqB;EACnB,IAAM,IAAkB,KAAK;EAI7B,AAHA,EACG,QAAO,MAAK,EAAE,QAAQ,aAAa,CAAC,CAAC,CACrC,SAAQ,MAAY,EAAQ,cAAc,KAAK,gBAAgB,eAAe,aAAa,YAAa,GAC3G,EACG,QAAO,MAAK,EAAE,QAAQ,kBAAkB,CAAC,CAAC,CAC1C,SAAQ,MAAU,EAAM,cAAc,KAAK,WAAa;CAC7D;AACF;AA9GG,EAAA,CAAA,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,aAAA,KAAA,CAAA,GAKxC,EAAA,CAAA,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,WAAA,KAAA,CAAA,GAKxC,EAAA,CAAA,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,eAAA,KAAA,CAAA,GAKxC,EAAA,CAAA,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,UAAA,KAAA,CAAA,GAWxC,EAAA,CAAA,EAAsB,EAAE,MAAM,SAAS,CAAC,CAAA,GAAA,EAAA,WAAA,kBAAA,KAAA,CAAA,GAExC,EAAA,CAAA,EAAsB,EAAE,MAAM,SAAS,CAAC,CAAA,GAAA,EAAA,WAAA,kBAAA,KAAA,CAAA,GAExC,EAAA,CAAA,EAAsB,CAAA,GAAA,EAAA,WAAA,mBAAA,KAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip.examples.js","names":["#badge"],"sources":["../../src/tooltip/tooltip.examples.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, css, LitElement } from 'lit';\nimport type { Ref} from 'lit/directives/ref.js';\nimport { ref, createRef } from 'lit/directives/ref.js';\nimport { customElement } from 'lit/decorators/custom-element.js';\nimport '@nvidia-elements/core/card/define.js';\nimport '@nvidia-elements/core/tooltip/define.js';\nimport '@nvidia-elements/core/toast/define.js';\nimport '@nvidia-elements/core/button/define.js';\nimport '@nvidia-elements/core/badge/define.js';\nimport '@nvidia-elements/core/icon/define.js';\nimport '@nvidia-elements/core/icon-button/define.js';\nimport '@nvidia-elements/core/dialog/define.js';\nimport '@nvidia-elements/core/dropdown/define.js';\nimport type { Badge } from '@nvidia-elements/core/badge';\n\nexport default {\n title: 'Elements/Tooltip',\n component: 'nve-tooltip',\n parameters: {\n layout: 'centered'\n }\n};\n\n/* eslint-disable @nvidia-elements/lint/no-missing-popover-trigger */\n\n/**\n * @summary Basic tooltip triggered by popovertarget attribute. Use for providing brief, contextual information on hover or focus without cluttering the interface.\n */\nexport const Default = {\n render: () => html`\n<nve-tooltip id=\"tooltip\">hello there</nve-tooltip>\n<nve-button interestfor=\"tooltip\">button</nve-button>\n `\n};\n\n/**\n * @summary Tooltip using anchor attribute to reference the trigger element. Use when you need to explicitly connect tooltips to their triggers by ID for better control over relationships.\n * @tags test-case\n */\nexport const Visual = {\n render: () => html`\n<nve-tooltip anchor=\"btn\">hello there</nve-tooltip>\n<nve-button id=\"btn\">button</nve-button>\n `\n};\n\n/**\n * @summary Tooltip positioning options for optimal placement relative to trigger elements. Use different positions based on available screen space and content layout to ensure tooltips remain visible and don't obscure important content.\n * @tags test-case\n */\nexport const Position = {\n render: () => html`\n<nve-tooltip anchor=\"btn\" position=\"top\">top</nve-tooltip>\n<nve-tooltip anchor=\"btn\" position=\"right\">right</nve-tooltip>\n<nve-tooltip anchor=\"btn\" position=\"bottom\">bottom</nve-tooltip>\n<nve-tooltip anchor=\"btn\" position=\"left\">left</nve-tooltip>\n<nve-button id=\"btn\">button</nve-button>\n `\n};\n\n/**\n * @summary Fine-grained tooltip alignment combined with positioning for precise placement control. Use to align tooltips to specific edges of trigger elements, improving visual hierarchy and reducing overlap with other UI elements.\n * @tags test-case\n */\nexport const Alignment = {\n render: () => html`\n<nve-tooltip anchor=\"card\" position=\"top\" alignment=\"start\">top start</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"top\">top center</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"top\" alignment=\"end\">top end</nve-tooltip>\n\n<nve-tooltip anchor=\"card\" position=\"right\" alignment=\"start\">right start</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"right\">right center</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"right\" alignment=\"end\">right end</nve-tooltip>\n\n<nve-tooltip anchor=\"card\" position=\"bottom\" alignment=\"start\">bottom start</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"bottom\">bottom center</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"bottom\" alignment=\"end\">bottom end</nve-tooltip>\n\n<nve-tooltip anchor=\"card\" position=\"left\" alignment=\"start\">left start</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"left\">left center</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"left\" alignment=\"end\">left end</nve-tooltip>\n\n<nve-card id=\"card\" style=\"width: 400px; height: 200px;\"></nve-card>\n `\n};\n\n/**\n * @summary Event handling for tooltip lifecycle events. Useful for adding custom behavior when tooltip state changes.\n */\nexport const Events = {\n render: () => html`\n<nve-tooltip id=\"tooltip\">hello there</nve-tooltip>\n<nve-button interestfor=\"tooltip\">button</nve-button>\n<script type=\"module\">\n const tooltip = document.querySelector('nve-tooltip');\n tooltip.addEventListener('beforetoggle', () => console.log('beforetoggle'));\n tooltip.addEventListener('toggle', () => console.log('toggle'));\n tooltip.addEventListener('close', () => console.log('close'));\n tooltip.addEventListener('open', () => console.log('open'));\n</script>\n `\n};\n\n/**\n * @summary Tooltip with structured content including title and body text. Use for tooltips that need hierarchical information, but keep content brief to maintain tooltip's lightweight nature.\n */\nexport const Content = {\n render: () => html`\n<nve-tooltip anchor=\"btn\" position=\"bottom\">\n <h3 nve-text=\"label\">Title</h3>\n <p nve-text=\"body\">some text content</p>\n</nve-tooltip>\n<nve-button id=\"btn\">button</nve-button>\n `\n};\n\n/**\n * @summary Single tooltip shared across many triggers with dynamic content updates. Use to reduce DOM nodes and improve performance when many similar elements need contextual help, updating tooltip content based on which trigger activated it.\n */\nexport const DynamicTrigger = {\n render: () => html`\n<nve-tooltip id=\"dynamic-popover\"></nve-tooltip>\n\n<div nve-layout=\"row gap:sm align:center\">\n <nve-button interestfor=\"dynamic-popover\">one</nve-button>\n <nve-button interestfor=\"dynamic-popover\">two</nve-button>\n <nve-button interestfor=\"dynamic-popover\">three</nve-button>\n</div>\n\n<script type=\"module\">\n document.querySelector('#dynamic-popover').addEventListener('toggle', e => {\n if (e.newState === 'open') {\n e.target.textContent = 'tooltip ' + e.source.textContent;\n }\n });\n</script>\n `\n};\n\n/**\n * @summary Tooltip as a hint icon pattern for providing contextual help next to labels or headings. Perfect for explaining features or terminology without cluttering the main interface, allowing users to discover information on demand.\n */\nexport const Hint = {\n render: () => html`\n<div nve-layout=\"row gap:xs align:vertical-center\">\n <h2 nve-text=\"heading sm\">Preview</h2>\n <nve-icon-button container=\"flat\" icon-name=\"information-circle\" interestfor=\"hint\"></nve-icon-button>\n <nve-tooltip id=\"hint\" position=\"right\">Preview in progress CI tasks for the active host</nve-tooltip>\n</div>\n `\n};\n\n/**\n * @summary Tooltip with muted status variant for subtle, low-emphasis contextual information. Use muted tooltips when the information is supplementary and shouldn't draw attention away from primary content.\n */\nexport const Status = {\n render: () => html`\n<div nve-layout=\"row align:center\" style=\"height: 250px\">\n <nve-tooltip anchor=\"btn\">default status</nve-tooltip>\n <nve-tooltip anchor=\"btn\" position=\"bottom\" status=\"muted\">muted status</nve-tooltip>\n <nve-button id=\"btn\">button</nve-button>\n</div>\n `\n};\n\n/**\n * @summary Tooltip with constrained width for controlled text wrapping. Use when tooltip content is longer than a single line, but prefer keeping tooltips brief for better scannability and user experience.\n * @tags test-case\n */\nexport const Wrap = {\n render: () => html`\n<nve-tooltip anchor=\"btn\" style=\"--width: 200px\">\n Tooltips provide contextual help for interface elements. Keep content brief and descriptive to help users understand available actions.\n</nve-tooltip>\n<nve-button id=\"btn\">button</nve-button>\n `\n};\n\n/**\n * @summary Tooltip anchoring to a dynamically created anchor element.\n * @tags test-case\n */\nexport const AsyncTrigger = {\n render: () => html`\n<div id=\"async-trigger-demo\">\n <nve-tooltip id=\"tooltip\">hello there</nve-tooltip>\n <template><nve-button interestfor=\"tooltip\">button</nve-button></template>\n</div>\n<script type=\"module\">\n import '@nvidia-elements/core/button/define.js';\n import '@nvidia-elements/core/tooltip/define.js';\n const template = document.querySelector('#async-trigger-demo template');\n const instance = template.content.cloneNode(true);\n setTimeout(() => {\n document.querySelector('#async-trigger-demo').appendChild(instance);\n }, 1000);\n</script>\n `\n};\n\n/**\n * @summary Tooltip with absolute positioning strategy for precise placement in complex layouts. Use when default fixed positioning causes issues with scrolling containers or nested positioning contexts.\n * @tags test-case\n */\nexport const PositionStrategyAbsolute = {\n render: () => html`\n<nve-button interestfor=\"tooltip\">button</nve-button>\n<nve-tooltip id=\"tooltip\">hello there</nve-tooltip>\n `\n};\n\n/**\n * @summary Tooltip behavior within scrollable containers with automatic repositioning. Tooltips maintain visibility and proper positioning even when anchor elements scroll, ensuring consistent user experience in scrollable interfaces.\n * @tags test-case\n */\nexport const ScrollContainer = {\n render: () => html`\n<style>\n #scroll-container {\n display: flex;\n flex-direction: column;\n height: 300px;\n width: 200px;\n overflow-y: auto;\n border: 1px solid #ccc;\n margin: 20vh;\n\n & > button {\n min-height: 50px;\n width: 100%;\n }\n }\n</style>\n<section id=\"scroll-container\">\n <button interestfor=\"tooltip\">1</button>\n <button interestfor=\"tooltip\">2</button>\n <button interestfor=\"tooltip\">3</button>\n <button interestfor=\"tooltip\">4</button>\n <button interestfor=\"tooltip\">5</button>\n <button interestfor=\"tooltip\">6</button>\n <button interestfor=\"tooltip\">7</button>\n <button interestfor=\"tooltip\">8</button>\n <button interestfor=\"tooltip\">9</button>\n <button interestfor=\"tooltip\">10</button>\n</section>\n<nve-tooltip id=\"tooltip\" position=\"left\">hello there</nve-tooltip>\n `\n};\n\n@customElement('dynamic-anchor-position-demo')\nclass DynamicAnchorPositionDemo extends LitElement { /* eslint no-unused-vars: 0 */\n static styles = [css`\n :host {\n position: relative;\n width: 97vw;\n height: 97vh;\n display: block;\n left: 0;\n transition: left 1s linear;\n }\n\n #anchor {\n top: 50vh;\n left: 50vw;\n width: 1px;\n height: 1px;\n position: absolute;\n }\n `];\n\n #badge: Ref<Badge> = createRef();\n\n render() {\n return html`\n <div ${ref(this.#badge)} id=\"anchor\"></div>\n <nve-tooltip anchor=\"anchor\">tooltip</nve-tooltip>\n `;\n }\n\n firstUpdated(props: PropertyValues<this>) {\n super.firstUpdated(props);\n this.addEventListener('mousemove', e => this.#badge.value.style.inset = `${e.clientY - 15}px auto auto ${e.clientX - 15}px`);\n }\n}\n\n/**\n * @summary Tooltip that follows a dynamically positioned anchor element. Real-time tooltip repositioning as the anchor moves, useful for cursor-following tooltips or drag-and-drop interfaces.\n * @deprecated\n * @tags test-case\n */\nexport const DynamicAnchorPosition = {\n render: () => html`\n<dynamic-anchor-position-demo></dynamic-anchor-position-demo>\n `\n};\n\n/* eslint-disable @nvidia-elements/lint/no-deprecated-popover-attributes */\n\n/**\n * @deprecated\n * @summary Legacy pattern for dynamic tooltip triggers using behavior-trigger attribute. Programmatic anchor and trigger reassignment for backward compatibility with older implementations.\n * @deprecated\n * @tags test-case\n */\nexport const LegacyDynamicTrigger = {\n render: () => html`\n<div id=\"dynamic-trigger-demo\" nve-layout=\"row align:center\" style=\"height: 250px\">\n <nve-tooltip behavior-trigger hidden>hello there</nve-tooltip>\n <div nve-layout=\"row gap:xl\">\n <nve-button>button</nve-button>\n <nve-button>button</nve-button>\n <nve-button>button</nve-button>\n </div>\n <script type=\"module\">\n const tooltip = document.querySelector('#dynamic-trigger-demo nve-tooltip');\n document.querySelector('#dynamic-trigger-demo').addEventListener('mouseover', e => {\n if (e.target.tagName === 'NVE-BUTTON') {\n tooltip.anchor = e.target;\n tooltip.trigger = e.target;\n }\n });\n </script>\n</div>\n `\n};\n\n/**\n * @deprecated\n * @summary Legacy trigger pattern with manual event handling and hidden attribute management. Older implementation approach for backward compatibility; prefer using popovertarget for new implementations.\n * @deprecated\n * @tags test-case\n */\nexport const LegacyTrigger = {\n render: () => html`\n<div nve-layout=\"row align:center\" style=\"height: 250px\">\n <nve-tooltip anchor=\"action-btn\" trigger=\"action-btn\" hidden>hello there</nve-tooltip>\n <nve-button id=\"action-btn\">button</nve-button>\n <script type=\"module\">\n const tooltip = document.querySelector('nve-tooltip[anchor=\"action-btn\"]');\n tooltip.addEventListener('close', () => tooltip.hidden = true);\n tooltip.addEventListener('open', () => tooltip.hidden = false);\n </script>\n</div>\n `\n};\n\n/**\n * @deprecated\n * @summary Legacy behavior-trigger pattern for automatic tooltip lifecycle management. Deprecated approach that auto-manages visibility, prefer modern popovertarget API for new implementations.\n * @deprecated\n * @tags test-case\n */\nexport const LegacyBehaviorTrigger = {\n render: () => html`\n<nve-tooltip behavior-trigger anchor=\"action-btn\" trigger=\"action-btn\" hidden>hello there</nve-tooltip>\n<nve-button id=\"action-btn\">button</nve-button>\n `\n};\n\n/**\n * @deprecated\n * @summary Legacy implementation combining behavior-trigger with open-delay for many tooltips. Older pattern for delayed tooltip appearance; prefer modern popovertarget with open-delay attribute.\n * @deprecated\n * @tags test-case\n */\nexport const LegacyOpenDelay = {\n render: () => html`\n<nve-tooltip behavior-trigger anchor=\"delay-tooltip-1\" trigger=\"delay-tooltip-1\" open-delay=\"500\" hidden>delayed tooltip</nve-tooltip>\n<nve-button id=\"delay-tooltip-1\">button</nve-button>\n\n<nve-tooltip behavior-trigger anchor=\"delay-tooltip-2\" trigger=\"delay-tooltip-2\" open-delay=\"500\" hidden>delayed tooltip</nve-tooltip>\n<nve-button id=\"delay-tooltip-2\">button</nve-button>\n\n<nve-tooltip behavior-trigger anchor=\"delay-tooltip-3\" trigger=\"delay-tooltip-3\" open-delay=\"500\" hidden>delayed tooltip</nve-tooltip>\n<nve-button id=\"delay-tooltip-3\">button</nve-button>\n `\n};\n\n/**\n * @summary Tooltip functionality within modal dialogs with many triggers. Ensures tooltips work correctly in layered UI contexts, maintaining proper stacking order and interaction behavior within modal overlays.\n * @tags test-case\n */\nexport const NestedDynamic = {\n render: () => html`\n<nve-button popovertarget=\"dialog\">open</nve-button>\n<nve-dialog id=\"dialog\" size=\"lg\" modal closable>\n <nve-button interestfor=\"tooltip\">button</nve-button>\n <section>\n <button interestfor=\"tooltip\">button</button>\n </section>\n</nve-dialog>\n<nve-tooltip id=\"tooltip\">test</nve-tooltip>\n `\n};\n\n/**\n * @summary Button combining interestfor and popovertarget for coordinated tooltip and dropdown behavior.\n */\nexport const PopoverInterest = {\n render: () => html`\n<nve-button interestfor=\"tooltip\" popovertarget=\"dropdown\">Button</nve-button>\n<nve-tooltip id=\"tooltip\">tooltip</nve-tooltip>\n<nve-dropdown id=\"dropdown\">dropdown content</nve-dropdown>\n `\n};\n\n/**\n * @summary Tooltip functionality using interest invokers to control tooltip visibility on hover and focus.\n * @tags test-case\n */\nexport const InterestInvokers = {\n render: () => html`\n<section nve-layout=\"row gap:md align:center\">\n <button popovertarget=\"dropdown\" interestfor=\"tooltip\">open</button>\n <nve-button popovertarget=\"dropdown\" interestfor=\"tooltip\">open</nve-button>\n <nve-dropdown id=\"dropdown\">dropdown content</nve-dropdown>\n <nve-tooltip id=\"tooltip\">tooltip content</nve-tooltip>\n\n <div id=\"div\">static</div>\n <nve-tooltip trigger=\"div\" hidden>static</nve-tooltip>\n</section>\n `\n};\n\n/**\n * @summary Tooltip with delayed appearance to reduce visual noise during quick mouse movements. Use open-delay for better user experience when tooltips are dense, preventing tooltips from flashing during cursor transitions.\n * @deprecated\n * @tags test-case\n */\nexport const OpenDelay = {\n render: () => html`\n<nve-tooltip id=\"delay-tooltip\" open-delay=\"500\">delayed tooltip</nve-tooltip>\n<nve-button interestfor=\"delay-tooltip\">button</nve-button>\n `\n};\n\n/**\n * @summary Legacy behavior that allowed tooltip triggering via popovertarget attribute instead of interestfor attribute with hover events.\n * @deprecated\n * @tags test-case\n */\nexport const LegacyPopoverTarget = {\n render: () => html`\n <nve-button popovertarget=\"tooltip\">open</nve-button>\n <nve-tooltip id=\"tooltip\">tooltip content</nve-tooltip>\n `\n};\n"],"mappings":";AAIA,IAAA,IAAe"}
1
+ {"version":3,"file":"tooltip.examples.js","names":[],"sources":["../../src/tooltip/tooltip.examples.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, css, LitElement } from 'lit';\nimport type { Ref} from 'lit/directives/ref.js';\nimport { ref, createRef } from 'lit/directives/ref.js';\nimport { customElement } from 'lit/decorators/custom-element.js';\nimport '@nvidia-elements/core/card/define.js';\nimport '@nvidia-elements/core/tooltip/define.js';\nimport '@nvidia-elements/core/toast/define.js';\nimport '@nvidia-elements/core/button/define.js';\nimport '@nvidia-elements/core/badge/define.js';\nimport '@nvidia-elements/core/icon/define.js';\nimport '@nvidia-elements/core/icon-button/define.js';\nimport '@nvidia-elements/core/dialog/define.js';\nimport '@nvidia-elements/core/dropdown/define.js';\nimport type { Badge } from '@nvidia-elements/core/badge';\n\nexport default {\n title: 'Elements/Tooltip',\n component: 'nve-tooltip',\n parameters: {\n layout: 'centered'\n }\n};\n\n/* eslint-disable @nvidia-elements/lint/no-missing-popover-trigger */\n\n/**\n * @summary Basic tooltip triggered by popovertarget attribute. Use for providing brief, contextual information on hover or focus without cluttering the interface.\n */\nexport const Default = {\n render: () => html`\n<nve-tooltip id=\"tooltip\">hello there</nve-tooltip>\n<nve-button interestfor=\"tooltip\">button</nve-button>\n `\n};\n\n/**\n * @summary Tooltip using anchor attribute to reference the trigger element. Use when you need to explicitly connect tooltips to their triggers by ID for better control over relationships.\n * @tags test-case\n */\nexport const Visual = {\n render: () => html`\n<nve-tooltip anchor=\"btn\">hello there</nve-tooltip>\n<nve-button id=\"btn\">button</nve-button>\n `\n};\n\n/**\n * @summary Tooltip positioning options for optimal placement relative to trigger elements. Use different positions based on available screen space and content layout to ensure tooltips remain visible and don't obscure important content.\n * @tags test-case\n */\nexport const Position = {\n render: () => html`\n<nve-tooltip anchor=\"btn\" position=\"top\">top</nve-tooltip>\n<nve-tooltip anchor=\"btn\" position=\"right\">right</nve-tooltip>\n<nve-tooltip anchor=\"btn\" position=\"bottom\">bottom</nve-tooltip>\n<nve-tooltip anchor=\"btn\" position=\"left\">left</nve-tooltip>\n<nve-button id=\"btn\">button</nve-button>\n `\n};\n\n/**\n * @summary Fine-grained tooltip alignment combined with positioning for precise placement control. Use to align tooltips to specific edges of trigger elements, improving visual hierarchy and reducing overlap with other UI elements.\n * @tags test-case\n */\nexport const Alignment = {\n render: () => html`\n<nve-tooltip anchor=\"card\" position=\"top\" alignment=\"start\">top start</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"top\">top center</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"top\" alignment=\"end\">top end</nve-tooltip>\n\n<nve-tooltip anchor=\"card\" position=\"right\" alignment=\"start\">right start</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"right\">right center</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"right\" alignment=\"end\">right end</nve-tooltip>\n\n<nve-tooltip anchor=\"card\" position=\"bottom\" alignment=\"start\">bottom start</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"bottom\">bottom center</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"bottom\" alignment=\"end\">bottom end</nve-tooltip>\n\n<nve-tooltip anchor=\"card\" position=\"left\" alignment=\"start\">left start</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"left\">left center</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"left\" alignment=\"end\">left end</nve-tooltip>\n\n<nve-card id=\"card\" style=\"width: 400px; height: 200px;\"></nve-card>\n `\n};\n\n/**\n * @summary Event handling for tooltip lifecycle events. Useful for adding custom behavior when tooltip state changes.\n */\nexport const Events = {\n render: () => html`\n<nve-tooltip id=\"tooltip\">hello there</nve-tooltip>\n<nve-button interestfor=\"tooltip\">button</nve-button>\n<script type=\"module\">\n const tooltip = document.querySelector('nve-tooltip');\n tooltip.addEventListener('beforetoggle', () => console.log('beforetoggle'));\n tooltip.addEventListener('toggle', () => console.log('toggle'));\n tooltip.addEventListener('close', () => console.log('close'));\n tooltip.addEventListener('open', () => console.log('open'));\n</script>\n `\n};\n\n/**\n * @summary Tooltip with structured content including title and body text. Use for tooltips that need hierarchical information, but keep content brief to maintain tooltip's lightweight nature.\n */\nexport const Content = {\n render: () => html`\n<nve-tooltip anchor=\"btn\" position=\"bottom\">\n <h3 nve-text=\"label\">Title</h3>\n <p nve-text=\"body\">some text content</p>\n</nve-tooltip>\n<nve-button id=\"btn\">button</nve-button>\n `\n};\n\n/**\n * @summary Single tooltip shared across many triggers with dynamic content updates. Use to reduce DOM nodes and improve performance when many similar elements need contextual help, updating tooltip content based on which trigger activated it.\n */\nexport const DynamicTrigger = {\n render: () => html`\n<nve-tooltip id=\"dynamic-popover\"></nve-tooltip>\n\n<div nve-layout=\"row gap:sm align:center\">\n <nve-button interestfor=\"dynamic-popover\">one</nve-button>\n <nve-button interestfor=\"dynamic-popover\">two</nve-button>\n <nve-button interestfor=\"dynamic-popover\">three</nve-button>\n</div>\n\n<script type=\"module\">\n document.querySelector('#dynamic-popover').addEventListener('toggle', e => {\n if (e.newState === 'open') {\n e.target.textContent = 'tooltip ' + e.source.textContent;\n }\n });\n</script>\n `\n};\n\n/**\n * @summary Tooltip as a hint icon pattern for providing contextual help next to labels or headings. Perfect for explaining features or terminology without cluttering the main interface, allowing users to discover information on demand.\n */\nexport const Hint = {\n render: () => html`\n<div nve-layout=\"row gap:xs align:vertical-center\">\n <h2 nve-text=\"heading sm\">Preview</h2>\n <nve-icon-button container=\"flat\" icon-name=\"information-circle\" interestfor=\"hint\"></nve-icon-button>\n <nve-tooltip id=\"hint\" position=\"right\">Preview in progress CI tasks for the active host</nve-tooltip>\n</div>\n `\n};\n\n/**\n * @summary Tooltip with muted status variant for subtle, low-emphasis contextual information. Use muted tooltips when the information is supplementary and shouldn't draw attention away from primary content.\n */\nexport const Status = {\n render: () => html`\n<div nve-layout=\"row align:center\" style=\"height: 250px\">\n <nve-tooltip anchor=\"btn\">default status</nve-tooltip>\n <nve-tooltip anchor=\"btn\" position=\"bottom\" status=\"muted\">muted status</nve-tooltip>\n <nve-button id=\"btn\">button</nve-button>\n</div>\n `\n};\n\n/**\n * @summary Tooltip with constrained width for controlled text wrapping. Use when tooltip content is longer than a single line, but prefer keeping tooltips brief for better scannability and user experience.\n * @tags test-case\n */\nexport const Wrap = {\n render: () => html`\n<nve-tooltip anchor=\"btn\" style=\"--width: 200px\">\n Tooltips provide contextual help for interface elements. Keep content brief and descriptive to help users understand available actions.\n</nve-tooltip>\n<nve-button id=\"btn\">button</nve-button>\n `\n};\n\n/**\n * @summary Tooltip anchoring to a dynamically created anchor element.\n * @tags test-case\n */\nexport const AsyncTrigger = {\n render: () => html`\n<div id=\"async-trigger-demo\">\n <nve-tooltip id=\"tooltip\">hello there</nve-tooltip>\n <template><nve-button interestfor=\"tooltip\">button</nve-button></template>\n</div>\n<script type=\"module\">\n import '@nvidia-elements/core/button/define.js';\n import '@nvidia-elements/core/tooltip/define.js';\n const template = document.querySelector('#async-trigger-demo template');\n const instance = template.content.cloneNode(true);\n setTimeout(() => {\n document.querySelector('#async-trigger-demo').appendChild(instance);\n }, 1000);\n</script>\n `\n};\n\n/**\n * @summary Tooltip with absolute positioning strategy for precise placement in complex layouts. Use when default fixed positioning causes issues with scrolling containers or nested positioning contexts.\n * @tags test-case\n */\nexport const PositionStrategyAbsolute = {\n render: () => html`\n<nve-button interestfor=\"tooltip\">button</nve-button>\n<nve-tooltip id=\"tooltip\">hello there</nve-tooltip>\n `\n};\n\n/**\n * @summary Tooltip behavior within scrollable containers with automatic repositioning. Tooltips maintain visibility and proper positioning even when anchor elements scroll, ensuring consistent user experience in scrollable interfaces.\n * @tags test-case\n */\nexport const ScrollContainer = {\n render: () => html`\n<style>\n #scroll-container {\n display: flex;\n flex-direction: column;\n height: 300px;\n width: 200px;\n overflow-y: auto;\n border: 1px solid #ccc;\n margin: 20vh;\n\n & > button {\n min-height: 50px;\n width: 100%;\n }\n }\n</style>\n<section id=\"scroll-container\">\n <button interestfor=\"tooltip\">1</button>\n <button interestfor=\"tooltip\">2</button>\n <button interestfor=\"tooltip\">3</button>\n <button interestfor=\"tooltip\">4</button>\n <button interestfor=\"tooltip\">5</button>\n <button interestfor=\"tooltip\">6</button>\n <button interestfor=\"tooltip\">7</button>\n <button interestfor=\"tooltip\">8</button>\n <button interestfor=\"tooltip\">9</button>\n <button interestfor=\"tooltip\">10</button>\n</section>\n<nve-tooltip id=\"tooltip\" position=\"left\">hello there</nve-tooltip>\n `\n};\n\n@customElement('dynamic-anchor-position-demo')\nclass DynamicAnchorPositionDemo extends LitElement { /* eslint no-unused-vars: 0 */\n static styles = [css`\n :host {\n position: relative;\n width: 97vw;\n height: 97vh;\n display: block;\n left: 0;\n transition: left 1s linear;\n }\n\n #anchor {\n top: 50vh;\n left: 50vw;\n width: 1px;\n height: 1px;\n position: absolute;\n }\n `];\n\n #badge: Ref<Badge> = createRef();\n\n render() {\n return html`\n <div ${ref(this.#badge)} id=\"anchor\"></div>\n <nve-tooltip anchor=\"anchor\">tooltip</nve-tooltip>\n `;\n }\n\n firstUpdated(props: PropertyValues<this>) {\n super.firstUpdated(props);\n this.addEventListener('mousemove', e => this.#badge.value.style.inset = `${e.clientY - 15}px auto auto ${e.clientX - 15}px`);\n }\n}\n\n/**\n * @summary Tooltip that follows a dynamically positioned anchor element. Real-time tooltip repositioning as the anchor moves, useful for cursor-following tooltips or drag-and-drop interfaces.\n * @deprecated\n * @tags test-case\n */\nexport const DynamicAnchorPosition = {\n render: () => html`\n<dynamic-anchor-position-demo></dynamic-anchor-position-demo>\n `\n};\n\n/* eslint-disable @nvidia-elements/lint/no-deprecated-popover-attributes */\n\n/**\n * @deprecated\n * @summary Legacy pattern for dynamic tooltip triggers using behavior-trigger attribute. Programmatic anchor and trigger reassignment for backward compatibility with older implementations.\n * @deprecated\n * @tags test-case\n */\nexport const LegacyDynamicTrigger = {\n render: () => html`\n<div id=\"dynamic-trigger-demo\" nve-layout=\"row align:center\" style=\"height: 250px\">\n <nve-tooltip behavior-trigger hidden>hello there</nve-tooltip>\n <div nve-layout=\"row gap:xl\">\n <nve-button>button</nve-button>\n <nve-button>button</nve-button>\n <nve-button>button</nve-button>\n </div>\n <script type=\"module\">\n const tooltip = document.querySelector('#dynamic-trigger-demo nve-tooltip');\n document.querySelector('#dynamic-trigger-demo').addEventListener('mouseover', e => {\n if (e.target.tagName === 'NVE-BUTTON') {\n tooltip.anchor = e.target;\n tooltip.trigger = e.target;\n }\n });\n </script>\n</div>\n `\n};\n\n/**\n * @deprecated\n * @summary Legacy trigger pattern with manual event handling and hidden attribute management. Older implementation approach for backward compatibility; prefer using popovertarget for new implementations.\n * @deprecated\n * @tags test-case\n */\nexport const LegacyTrigger = {\n render: () => html`\n<div nve-layout=\"row align:center\" style=\"height: 250px\">\n <nve-tooltip anchor=\"action-btn\" trigger=\"action-btn\" hidden>hello there</nve-tooltip>\n <nve-button id=\"action-btn\">button</nve-button>\n <script type=\"module\">\n const tooltip = document.querySelector('nve-tooltip[anchor=\"action-btn\"]');\n tooltip.addEventListener('close', () => tooltip.hidden = true);\n tooltip.addEventListener('open', () => tooltip.hidden = false);\n </script>\n</div>\n `\n};\n\n/**\n * @deprecated\n * @summary Legacy behavior-trigger pattern for automatic tooltip lifecycle management. Deprecated approach that auto-manages visibility, prefer modern popovertarget API for new implementations.\n * @deprecated\n * @tags test-case\n */\nexport const LegacyBehaviorTrigger = {\n render: () => html`\n<nve-tooltip behavior-trigger anchor=\"action-btn\" trigger=\"action-btn\" hidden>hello there</nve-tooltip>\n<nve-button id=\"action-btn\">button</nve-button>\n `\n};\n\n/**\n * @deprecated\n * @summary Legacy implementation combining behavior-trigger with open-delay for many tooltips. Older pattern for delayed tooltip appearance; prefer modern popovertarget with open-delay attribute.\n * @deprecated\n * @tags test-case\n */\nexport const LegacyOpenDelay = {\n render: () => html`\n<nve-tooltip behavior-trigger anchor=\"delay-tooltip-1\" trigger=\"delay-tooltip-1\" open-delay=\"500\" hidden>delayed tooltip</nve-tooltip>\n<nve-button id=\"delay-tooltip-1\">button</nve-button>\n\n<nve-tooltip behavior-trigger anchor=\"delay-tooltip-2\" trigger=\"delay-tooltip-2\" open-delay=\"500\" hidden>delayed tooltip</nve-tooltip>\n<nve-button id=\"delay-tooltip-2\">button</nve-button>\n\n<nve-tooltip behavior-trigger anchor=\"delay-tooltip-3\" trigger=\"delay-tooltip-3\" open-delay=\"500\" hidden>delayed tooltip</nve-tooltip>\n<nve-button id=\"delay-tooltip-3\">button</nve-button>\n `\n};\n\n/**\n * @summary Tooltip functionality within modal dialogs with many triggers. Ensures tooltips work correctly in layered UI contexts, maintaining proper stacking order and interaction behavior within modal overlays.\n * @tags test-case\n */\nexport const NestedDynamic = {\n render: () => html`\n<nve-button popovertarget=\"dialog\">open</nve-button>\n<nve-dialog id=\"dialog\" size=\"lg\" modal closable>\n <nve-button interestfor=\"tooltip\">button</nve-button>\n <section>\n <button interestfor=\"tooltip\">button</button>\n </section>\n</nve-dialog>\n<nve-tooltip id=\"tooltip\">test</nve-tooltip>\n `\n};\n\n/**\n * @summary Button combining interestfor and popovertarget for coordinated tooltip and dropdown behavior.\n */\nexport const PopoverInterest = {\n render: () => html`\n<nve-button interestfor=\"tooltip\" popovertarget=\"dropdown\">Button</nve-button>\n<nve-tooltip id=\"tooltip\">tooltip</nve-tooltip>\n<nve-dropdown id=\"dropdown\">dropdown content</nve-dropdown>\n `\n};\n\n/**\n * @summary Tooltip functionality using interest invokers to control tooltip visibility on hover and focus.\n * @tags test-case\n */\nexport const InterestInvokers = {\n render: () => html`\n<section nve-layout=\"row gap:md align:center\">\n <button popovertarget=\"dropdown\" interestfor=\"tooltip\">open</button>\n <nve-button popovertarget=\"dropdown\" interestfor=\"tooltip\">open</nve-button>\n <nve-dropdown id=\"dropdown\">dropdown content</nve-dropdown>\n <nve-tooltip id=\"tooltip\">tooltip content</nve-tooltip>\n\n <div id=\"div\">static</div>\n <nve-tooltip trigger=\"div\" hidden>static</nve-tooltip>\n</section>\n `\n};\n\n/**\n * @summary Tooltip with delayed appearance to reduce visual noise during quick mouse movements. Use open-delay for better user experience when tooltips are dense, preventing tooltips from flashing during cursor transitions.\n * @deprecated\n * @tags test-case\n */\nexport const OpenDelay = {\n render: () => html`\n<nve-tooltip id=\"delay-tooltip\" open-delay=\"500\">delayed tooltip</nve-tooltip>\n<nve-button interestfor=\"delay-tooltip\">button</nve-button>\n `\n};\n\n/**\n * @summary Legacy behavior that allowed tooltip triggering via popovertarget attribute instead of interestfor attribute with hover events.\n * @deprecated\n * @tags test-case\n */\nexport const LegacyPopoverTarget = {\n render: () => html`\n <nve-button popovertarget=\"tooltip\">open</nve-button>\n <nve-tooltip id=\"tooltip\">tooltip content</nve-tooltip>\n `\n};\n"],"mappings":";AAIA,IAAA,IAAe"}
@@ -92,7 +92,7 @@
92
92
  {
93
93
  "id": "tooltip-wrap",
94
94
  "name": "Wrap",
95
- "template": "<nve-tooltip anchor=\"btn\" style=\"--width: 200px\">\n Tooltips provide contextual help for interface elements. Keep content brief and descriptive to help users understand\n available actions.\n</nve-tooltip>\n<nve-button id=\"btn\">button</nve-button>\n",
95
+ "template": "<nve-tooltip anchor=\"btn\" style=\"--width: 200px\"> Tooltips provide contextual help for interface elements. Keep content brief and descriptive to help users understand available actions. </nve-tooltip>\n<nve-button id=\"btn\">button</nve-button>\n",
96
96
  "summary": "Tooltip with constrained width for controlled text wrapping. Use when tooltip content is longer than a single line, but prefer keeping tooltips brief for better scannability and user experience.",
97
97
  "description": "",
98
98
  "composition": false,
@@ -184,7 +184,7 @@
184
184
  {
185
185
  "id": "tooltip-legacy-open-delay",
186
186
  "name": "LegacyOpenDelay",
187
- "template": "<nve-tooltip behavior-trigger anchor=\"delay-tooltip-1\" trigger=\"delay-tooltip-1\" open-delay=\"500\" hidden\n >delayed tooltip</nve-tooltip\n>\n<nve-button id=\"delay-tooltip-1\">button</nve-button>\n<nve-tooltip behavior-trigger anchor=\"delay-tooltip-2\" trigger=\"delay-tooltip-2\" open-delay=\"500\" hidden\n >delayed tooltip</nve-tooltip\n>\n<nve-button id=\"delay-tooltip-2\">button</nve-button>\n<nve-tooltip behavior-trigger anchor=\"delay-tooltip-3\" trigger=\"delay-tooltip-3\" open-delay=\"500\" hidden\n >delayed tooltip</nve-tooltip\n>\n<nve-button id=\"delay-tooltip-3\">button</nve-button>\n",
187
+ "template": "<nve-tooltip behavior-trigger anchor=\"delay-tooltip-1\" trigger=\"delay-tooltip-1\" open-delay=\"500\" hidden>delayed tooltip</nve-tooltip>\n<nve-button id=\"delay-tooltip-1\">button</nve-button>\n<nve-tooltip behavior-trigger anchor=\"delay-tooltip-2\" trigger=\"delay-tooltip-2\" open-delay=\"500\" hidden>delayed tooltip</nve-tooltip>\n<nve-button id=\"delay-tooltip-2\">button</nve-button>\n<nve-tooltip behavior-trigger anchor=\"delay-tooltip-3\" trigger=\"delay-tooltip-3\" open-delay=\"500\" hidden>delayed tooltip</nve-tooltip>\n<nve-button id=\"delay-tooltip-3\">button</nve-button>\n",
188
188
  "summary": "Legacy implementation combining behavior-trigger with open-delay for many tooltips. Older pattern for delayed tooltip appearance; prefer modern popovertarget with open-delay attribute.",
189
189
  "description": "",
190
190
  "deprecated": true,
@@ -3,7 +3,7 @@ import { attachInternals as t } from "../internal/utils/a11y.js";
3
3
  import { TypeNativePopoverController as n } from "../internal/controllers/type-native-popover.controller.js";
4
4
  import { useStyles as r } from "../internal/styles/index.js";
5
5
  import { popoverStyles as i } from "../internal/styles/popover2.js";
6
- import a from "../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorate.js";
6
+ import a from "../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorate.js";
7
7
  import o from "./tooltip.js";
8
8
  import { LitElement as s, html as c } from "lit";
9
9
  import { property as l } from "lit/decorators/property.js";
@@ -19,7 +19,7 @@ var d = class extends s {
19
19
  static {
20
20
  this.metadata = {
21
21
  tag: "nve-tooltip",
22
- version: "2.7.3"
22
+ version: "2.8.1"
23
23
  };
24
24
  }
25
25
  render() {
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip2.js","names":[],"sources":["../../src/tooltip/tooltip.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 { query } from 'lit/decorators/query.js';\nimport type { PopoverAlign, PopoverPosition, PopoverType } from '@nvidia-elements/core/internal';\nimport {\n attachInternals,\n audit,\n excessiveInstanceLimit,\n popoverStyles,\n TypeNativePopoverController,\n useStyles\n} from '@nvidia-elements/core/internal';\nimport styles from './tooltip.css?inline';\n\n/**\n * @element nve-tooltip\n * @description A contextual popup that displays a plaintext description. Trigger tooltips by hovering, focusing, or tapping an element and cannot have interactive elements within them.\n * @documentation https://nvidia.github.io/elements/docs/elements/tooltip/\n * @since 0.6.0\n * @entrypoint \\@nvidia-elements/core/tooltip\n * @event beforetoggle - Dispatched on a popover just before showing or hiding. [MDN](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/beforetoggle_event)\n * @event toggle - Dispatched on a popover element just after showing or hiding. [MDN](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/toggle_event)\n * @event open - Dispatched when the tooltip opens.\n * @event close - Dispatched when the tooltip closes.\n * @slot - Noninteractive text or other descriptive content shown in the tooltip.\n * @cssprop --border-radius\n * @cssprop --background\n * @cssprop --color\n * @cssprop --padding\n * @cssprop --box-shadow\n * @cssprop --font-size\n * @cssprop --font-weight\n * @cssprop --arrow-transform\n * @cssprop --width\n * @cssprop --height\n * @cssprop --border\n * @csspart arrow\n * @cssprop --animation-duration - Duration of tooltip open/close animations\n * @aria https://www.w3.org/WAI/ARIA/apg/patterns/tooltip/\n */\n@audit({ excessiveInstanceLimit })\nexport class Tooltip extends LitElement {\n static styles = useStyles([popoverStyles, styles]);\n\n static readonly metadata = {\n tag: 'nve-tooltip',\n version: '0.0.0'\n };\n\n /**\n * (optional) By default the popover automatically anchors itself relative to the trigger element.\n * Pass an optional custom anchor element as an idref string within the same render root or a HTMLElement DOM reference.\n */\n @property({ type: String }) anchor: string | HTMLElement;\n\n /**\n * @deprecated Use the popover API instead.\n * The trigger defines what element triggers an `open` interaction event.\n * A trigger can accept a idref string within the same render root or a HTMLElement DOM reference.\n */\n @property({ type: String }) trigger: string | HTMLElement;\n\n /**\n * Sets the side position of the popover relative to the provided anchor element.\n */\n @property({ type: String, reflect: true }) position: PopoverPosition = 'top';\n\n /**\n * Sets the alignment of the popover relative to the provided anchor element.\n */\n @property({ type: String, reflect: true }) alignment: PopoverAlign;\n\n /**\n * @deprecated Use the popover API instead.\n * Determines if popover visibility behavior should be automatically controlled by the trigger.\n */\n @property({ type: Boolean, reflect: true, attribute: 'behavior-trigger' }) behaviorTrigger: boolean;\n\n /**\n * visual treatment to represent a ongoing task or support status\n */\n @property({ type: String, reflect: true }) status: 'muted';\n\n /**\n * @deprecated Use interest-delay-start css property instead\n */\n @property({ type: Number, attribute: 'open-delay' }) openDelay: number;\n\n /** @private */\n @query('.arrow') popoverArrow: HTMLElement;\n\n /** @private */\n readonly popoverType: PopoverType = 'hint';\n\n protected typeNativePopoverController = new TypeNativePopoverController<Tooltip>(this);\n\n /** @private */\n declare _internals: ElementInternals;\n\n /* eslint-disable local/no-invalid-css-parts */\n render() {\n return html`\n <div internal-host>\n <slot></slot>\n </div>\n <div part=\"arrow\" class=\"arrow\"></div>\n `;\n }\n\n connectedCallback() {\n super.connectedCallback();\n attachInternals(this);\n this._internals.role = 'tooltip';\n }\n}\n"],"mappings":";;;;;;;;;;;AA4CO,IAAA,IAAA,cAAsB,EAAW;;+BAwBiC,0BA2BnC,2CAEI,IAAI,EAAqC,IAAI;;;gBApDrE,EAAU,CAAC,GAAe,CAAM,CAAC;;;kBAEtB;GACzB,KAAK;GACL,SAAS;EACX;;CAqDA,SAAS;EACP,OAAO,CAAI;CAMb;CAEA,oBAAoB;EAGlB,AAFA,MAAM,kBAAkB,GACxB,EAAgB,IAAI,GACpB,KAAK,WAAW,OAAO;CACzB;AACF;GA7DG,EAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,EAAA,WAAA,UAAA,KAAA,CAAA,MAOzB,EAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,EAAA,WAAA,WAAA,KAAA,CAAA,MAKzB,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,YAAA,KAAA,CAAA,MAKxC,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,aAAA,KAAA,CAAA,MAMxC,EAAS;CAAE,MAAM;CAAS,SAAS;CAAM,WAAW;AAAmB,CAAC,CAAA,GAAA,EAAA,WAAA,mBAAA,KAAA,CAAA,MAKxE,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,UAAA,KAAA,CAAA,MAKxC,EAAS;CAAE,MAAM;CAAQ,WAAW;AAAa,CAAC,CAAA,GAAA,EAAA,WAAA,aAAA,KAAA,CAAA,MAGlD,EAAM,QAAQ,CAAA,GAAA,EAAA,WAAA,gBAAA,KAAA,CAAA,UAjDhB,EAAM,EAAE,wBAAA,GAAuB,CAAC,CAAA,GAAA,CAAA"}
1
+ {"version":3,"file":"tooltip2.js","names":[],"sources":["../../src/tooltip/tooltip.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 { query } from 'lit/decorators/query.js';\nimport type { PopoverAlign, PopoverPosition, PopoverType } from '@nvidia-elements/core/internal';\nimport {\n attachInternals,\n audit,\n excessiveInstanceLimit,\n popoverStyles,\n TypeNativePopoverController,\n useStyles\n} from '@nvidia-elements/core/internal';\nimport styles from './tooltip.css?inline';\n\n/**\n * @element nve-tooltip\n * @description A contextual popup that displays a plaintext description. Trigger tooltips by hovering, focusing, or tapping an element and cannot have interactive elements within them.\n * @documentation https://nvidia.github.io/elements/docs/elements/tooltip/\n * @since 0.6.0\n * @entrypoint \\@nvidia-elements/core/tooltip\n * @event beforetoggle - Dispatched on a popover just before showing or hiding. [MDN](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/beforetoggle_event)\n * @event toggle - Dispatched on a popover element just after showing or hiding. [MDN](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/toggle_event)\n * @event open - Dispatched when the tooltip opens.\n * @event close - Dispatched when the tooltip closes.\n * @slot - Noninteractive text or other descriptive content shown in the tooltip.\n * @cssprop --border-radius\n * @cssprop --background\n * @cssprop --color\n * @cssprop --padding\n * @cssprop --box-shadow\n * @cssprop --font-size\n * @cssprop --font-weight\n * @cssprop --arrow-transform\n * @cssprop --width\n * @cssprop --height\n * @cssprop --border\n * @csspart arrow\n * @cssprop --animation-duration - Duration of tooltip open/close animations\n * @aria https://www.w3.org/WAI/ARIA/apg/patterns/tooltip/\n */\n@audit({ excessiveInstanceLimit })\nexport class Tooltip extends LitElement {\n static styles = useStyles([popoverStyles, styles]);\n\n static readonly metadata = {\n tag: 'nve-tooltip',\n version: '0.0.0'\n };\n\n /**\n * (optional) By default the popover automatically anchors itself relative to the trigger element.\n * Pass an optional custom anchor element as an idref string within the same render root or a HTMLElement DOM reference.\n */\n @property({ type: String }) anchor: string | HTMLElement;\n\n /**\n * @deprecated Use the popover API instead.\n * The trigger defines what element triggers an `open` interaction event.\n * A trigger can accept a idref string within the same render root or a HTMLElement DOM reference.\n */\n @property({ type: String }) trigger: string | HTMLElement;\n\n /**\n * Sets the side position of the popover relative to the provided anchor element.\n */\n @property({ type: String, reflect: true }) position: PopoverPosition = 'top';\n\n /**\n * Sets the alignment of the popover relative to the provided anchor element.\n */\n @property({ type: String, reflect: true }) alignment: PopoverAlign;\n\n /**\n * @deprecated Use the popover API instead.\n * Determines if popover visibility behavior should be automatically controlled by the trigger.\n */\n @property({ type: Boolean, reflect: true, attribute: 'behavior-trigger' }) behaviorTrigger: boolean;\n\n /**\n * visual treatment to represent a ongoing task or support status\n */\n @property({ type: String, reflect: true }) status: 'muted';\n\n /**\n * @deprecated Use interest-delay-start css property instead\n */\n @property({ type: Number, attribute: 'open-delay' }) openDelay: number;\n\n /** @private */\n @query('.arrow') popoverArrow: HTMLElement;\n\n /** @private */\n readonly popoverType: PopoverType = 'hint';\n\n protected typeNativePopoverController = new TypeNativePopoverController<Tooltip>(this);\n\n /** @private */\n declare _internals: ElementInternals;\n\n /* eslint-disable local/no-invalid-css-parts */\n render() {\n return html`\n <div internal-host>\n <slot></slot>\n </div>\n <div part=\"arrow\" class=\"arrow\"></div>\n `;\n }\n\n connectedCallback() {\n super.connectedCallback();\n attachInternals(this);\n this._internals.role = 'tooltip';\n }\n}\n"],"mappings":";;;;;;;;;;;AA4CO,IAAM,IAAN,cAAsB,EAAW;;EAqDE,aA7B+B,KAAA,WAAA,OA2BnC,KAAA,cAAA,QAEI,KAAA,8BAAA,IAAI,EAAqC,IAAI;;;EApDrE,KAAA,SAAA,EAAU,CAAC,GAAe,CAAM,CAAC;;;EAEtB,KAAA,WAAA;GACzB,KAAK;GACL,SAAS;EACX;;CAqDA,SAAS;EACP,OAAO,CAAI;CAMb;CAEA,oBAAoB;EAGlB,AAFA,MAAM,kBAAkB,GACxB,EAAgB,IAAI,GACpB,KAAK,WAAW,OAAO;CACzB;AACF;AA7DG,EAAA,CAAA,EAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,EAAA,WAAA,UAAA,KAAA,CAAA,GAOzB,EAAA,CAAA,EAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,EAAA,WAAA,WAAA,KAAA,CAAA,GAKzB,EAAA,CAAA,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,YAAA,KAAA,CAAA,GAKxC,EAAA,CAAA,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,aAAA,KAAA,CAAA,GAMxC,EAAA,CAAA,EAAS;CAAE,MAAM;CAAS,SAAS;CAAM,WAAW;AAAmB,CAAC,CAAA,GAAA,EAAA,WAAA,mBAAA,KAAA,CAAA,GAKxE,EAAA,CAAA,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,UAAA,KAAA,CAAA,GAKxC,EAAA,CAAA,EAAS;CAAE,MAAM;CAAQ,WAAW;AAAa,CAAC,CAAA,GAAA,EAAA,WAAA,aAAA,KAAA,CAAA,GAGlD,EAAA,CAAA,EAAM,QAAQ,CAAA,GAAA,EAAA,WAAA,gBAAA,KAAA,CAAA,GAjDhB,IAAA,EAAA,CAAA,EAAM,EAAE,wBAAA,GAAuB,CAAC,CAAA,GAAA,CAAA"}
@@ -12,7 +12,7 @@ import { typeSSR as u } from "../internal/controllers/type-ssr.controller.js";
12
12
  import { hostAttr as d } from "../internal/decorators/host-attr.js";
13
13
  import { scopedRegistry as f } from "../internal/decorators/scoped-registry.js";
14
14
  import { useStyles as p } from "../internal/styles/index.js";
15
- import m from "../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorate.js";
15
+ import m from "../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorate.js";
16
16
  import { Icon as h } from "../icon/icon2.js";
17
17
  import { IconButton as g } from "../icon-button/icon-button2.js";
18
18
  import { updateNodeSelection as _ } from "./utils.js";
@@ -44,7 +44,7 @@ var E = class extends b {
44
44
  static {
45
45
  this.metadata = {
46
46
  tag: "nve-tree-node",
47
- version: "2.7.3",
47
+ version: "2.8.1",
48
48
  parents: ["nve-tree", "nve-tree-node"]
49
49
  };
50
50
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tree-node2.js","names":["#i18nController","#isExpandable","#toggleSelection","#tree","#nodeUpdate","#toggleExpand","#toggleMultiSelection","#nodeHeaderClick","#onKeydown","#onKeyup","#typeExpandableController","#toggleExpandableState","#toggleSingleSelection","#typeSelectableController"],"sources":["../../src/tree/tree-node.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { LitElement, html, nothing } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport { state } from 'lit/decorators/state.js';\nimport { queryAssignedElements } from 'lit/decorators/query-assigned-elements.js';\nimport {\n I18nController,\n TypeExpandableController,\n TypeSelectableController,\n attachInternals,\n audit,\n getFlattenedFocusableItems,\n hostAttr,\n scopedRegistry,\n stateExpanded,\n stateHighlighted,\n stateSelected,\n typeAnchor,\n typeSSR,\n useStyles\n} from '@nvidia-elements/core/internal';\nimport { IconButton } from '@nvidia-elements/core/icon-button';\nimport { Icon } from '@nvidia-elements/core/icon';\nimport { Checkbox } from '@nvidia-elements/core/checkbox';\nimport type { Tree } from './tree.js';\nimport styles from './tree-node.css?inline';\nimport { updateNodeSelection } from './utils.js';\n\n/**\n * @element nve-tree-node\n * @description A tree view widget presents a hierarchical list. Any item in the hierarchy may have child items, and items that have children can expand or collapse to show or hide the children.\n * @documentation https://nvidia.github.io/elements/docs/elements/tree/\n * @since 1.2.0\n * @entrypoint \\@nvidia-elements/core/tree\n * @event open - Dispatched when the node opens.\n * @event close - Dispatched when the node closes.\n * @event select - Dispatched when the node selection state changes.\n * @command --select - use to select the node\n * @command --deselect - use to deselect the node\n * @command --toggle-select - use to toggle the node selection state\n * @command --open - use to open the node\n * @command --close - use to close the node\n * @command --toggle - use to toggle open / closed state of the node\n * @slot - Use default slot for basic text content or nested <nve-tree-node> elements.\n * @slot content - Use only for extended long form content containing interactive elements or form inputs.\n * @cssprop --color\n * @cssprop --border-radius\n * @cssprop --font-size\n * @cssprop --min-height\n * @cssprop --text-wrap\n * @cssprop --font-weight\n * @cssprop --width\n\n * @csspart icon-button - The icon button element\n * @csspart icon - The icon element\n * @csspart checkbox - The checkbox element\n\n * @aria https://www.w3.org/WAI/ARIA/apg/patterns/treeview/\n *\n */\n@audit()\n@typeSSR({ log: false }) // warning about ssr mismatch disabled as tree node will never be a 1:1 match in ssr due to performance constraints and slot complexity\n@typeAnchor()\n@stateSelected()\n@stateExpanded()\n@scopedRegistry()\n@stateHighlighted()\nexport class TreeNode extends LitElement {\n /**\n * Determines if node is in an expanded state.\n */\n @property({ type: Boolean, reflect: true }) expanded = false;\n\n /**\n * Determines whether if node is in a selected state.\n */\n @property({ type: Boolean, reflect: true }) selected = false;\n\n /**\n * Determines whether a node can be expandable. Expandable by default if slotted nodes exist.\n */\n @property({ type: Boolean }) expandable = false;\n\n /**\n * Determines whether a node can be in a selected state. Nodes can be in a single or multi select state.\n */\n @property({ type: String }) selectable: 'single' | 'multi';\n\n /**\n * Determines the highlighted state of the element. Highlighted states serve non-interactive selections where nodes may relate to other selected portions of the UI.\n */\n @property({ type: Boolean }) highlighted = false;\n\n #i18nController: I18nController<this> = new I18nController<this>(this);\n\n /**\n * Updates internal string values for internationalization.\n */\n @property({ type: Object }) i18n = this.#i18nController.i18n;\n\n /** @private */\n @hostAttr() slot = 'nodes';\n\n get #tree() {\n return this.closest<Tree>('nve-tree');\n }\n\n /**\n * Returns list of child nodes\n */\n @queryAssignedElements({ slot: 'nodes' }) readonly nodes!: TreeNode[];\n\n /** @private */\n @state() indeterminate = false;\n\n /** @private */\n @state() behaviorExpand = false;\n\n /** @private */\n @state() behaviorSelect = false;\n\n #typeExpandableController = new TypeExpandableController(this);\n\n #typeSelectableController = new TypeSelectableController(this);\n\n get #isExpandable() {\n return this.expandable || this.expanded || !!this.nodes?.length;\n }\n\n static metadata = {\n tag: 'nve-tree-node',\n version: '0.0.0',\n parents: ['nve-tree', 'nve-tree-node']\n };\n\n static elementDefinitions = {\n [IconButton.metadata.tag]: IconButton,\n [Icon.metadata.tag]: Icon,\n [Checkbox.metadata.tag]: Checkbox\n };\n\n static styles = useStyles([styles]);\n\n declare _internals: ElementInternals;\n\n /* eslint-disable @nvidia-elements/lint/no-missing-control-label */\n render() {\n return html`\n <div internal-host @slotchange=${this.#nodeUpdate}>\n <div part=\"_node\">\n ${\n this.#isExpandable\n ? html`\n <nve-icon-button part=\"icon-button\" exportparts=\"icon:icon-button-icon\" @pointerup=${this.#toggleExpand} role=\"presentation\" tabindex=\"-1\" size=\"sm\" container=\"inline\" nofocus>\n <nve-icon part=\"icon\" name=\"caret\" direction=${this.expanded ? 'down' : 'right'} size=\"sm\"></nve-icon>\n </nve-icon-button>`\n : nothing\n }\n ${\n this.selectable === 'multi'\n ? html`\n <nve-checkbox part=\"checkbox\" nofocus>\n <input type=\"checkbox\" @change=${this.#toggleMultiSelection} .checked=${this.selected} .indeterminate=${this.indeterminate} .ariaLabel=${this.i18n.expand} tabindex=\"-1\" />\n </nve-checkbox>`\n : nothing\n }\n <div tabindex=\"0\" part=\"_node-header\">\n <slot class=\"node-title\" @click=${this.#nodeHeaderClick}></slot>\n <slot name=\"content\" part=\"_content\"></slot>\n </div>\n </div>\n <div role=\"group\" part=\"_nodes\"><slot name=\"nodes\"></slot></div>\n </div>\n `;\n }\n\n connectedCallback() {\n super.connectedCallback();\n attachInternals(this);\n this._internals.role = 'treeitem';\n this.addEventListener('keydown', this.#onKeydown);\n this.addEventListener('keyup', this.#onKeyup);\n this.#nodeUpdate();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('keydown', this.#onKeydown);\n this.removeEventListener('keyup', this.#onKeyup);\n }\n\n /** opens and sets the expanded state automatically if behaviorExpand is true */\n open() {\n this.#typeExpandableController.open();\n }\n\n /** closes and sets the expanded state automatically if behaviorExpand is true */\n close() {\n this.#typeExpandableController.close();\n }\n\n #nodeUpdate() {\n this.requestUpdate();\n this.#toggleExpandableState();\n }\n\n #toggleExpandableState() {\n this.#isExpandable ? this._internals.states.add('is-expandable') : this._internals.states.delete('is-expandable');\n }\n\n #onKeydown = (e: KeyboardEvent) => {\n const isSelectionKey = this.selectable && e.code === 'Space';\n const isExpansionKey = this.#isExpandable && (e.code === 'ArrowLeft' || e.code === 'ArrowRight');\n\n if (e.target === this && (isSelectionKey || isExpansionKey)) {\n e.preventDefault();\n }\n };\n\n #onKeyup = (e: KeyboardEvent) => {\n if (this.#isExpandable && e.code === 'ArrowLeft' && e.target === this) {\n this.close();\n }\n\n if (this.#isExpandable && e.code === 'ArrowRight' && e.target === this) {\n this.open();\n }\n\n if (e.code === 'Space' && e.target === this && this.selectable) {\n this.#toggleSelection();\n }\n };\n\n #nodeHeaderClick(e: Event) {\n const hasFocusableElements = getFlattenedFocusableItems(e.currentTarget as HTMLElement).length;\n if (this.#isExpandable && !this.selectable && !hasFocusableElements) {\n this.#toggleExpand();\n }\n\n if (this.selectable && (!hasFocusableElements || (e.target as HTMLElement).localName === 'a')) {\n this.#toggleSelection();\n }\n }\n\n #toggleExpand() {\n this.#typeExpandableController.toggle();\n }\n\n #toggleSelection() {\n if (this.selectable === 'single') {\n this.#toggleSingleSelection();\n }\n\n if (this.selectable === 'multi') {\n this.#toggleMultiSelection();\n }\n }\n\n #toggleSingleSelection() {\n this.#typeSelectableController.toggle();\n if (this.behaviorSelect) {\n this.#tree!.nodes.filter(n => n !== this).forEach(n => (n.selected = false));\n }\n }\n\n #toggleMultiSelection() {\n this.#typeSelectableController.toggle();\n\n if (this.behaviorSelect) {\n this.nodes.forEach(n => {\n n.selected = this.selected;\n n.indeterminate = false;\n });\n this.#tree!.nodes.forEach(node => updateNodeSelection(node));\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAqEO,IAAA,IAAA,cAAuB,EAAW;;+BAIgB,oBAKA,sBAKb,uBAUC,cAEH,IAAI,EAAqB,IAAI,eAKlC,KAAKA,GAAgB,kBAGrC,8BAYM,0BAGC,0BAGA,cAEE,IAAI,EAAyB,IAAI,aAEjC,IAAI,EAAyB,IAAI,cAuF/C,MAAqB;GACjC,IAAM,IAAiB,KAAK,cAAc,EAAE,SAAS,SAC/C,IAAiB,KAAKC,OAAkB,EAAE,SAAS,eAAe,EAAE,SAAS;GAEnF,AAAI,EAAE,WAAW,SAAS,KAAkB,MAC1C,EAAE,eAAe;EAErB,cAEY,MAAqB;GAS/B,AARI,KAAKA,MAAiB,EAAE,SAAS,eAAe,EAAE,WAAW,QAC/D,KAAK,MAAM,GAGT,KAAKA,MAAiB,EAAE,SAAS,gBAAgB,EAAE,WAAW,QAChE,KAAK,KAAK,GAGR,EAAE,SAAS,WAAW,EAAE,WAAW,QAAQ,KAAK,cAClD,KAAKC,GAAiB;EAE1B;;CA1IA;CAUA,IAAIC,KAAQ;EACV,OAAO,KAAK,QAAc,UAAU;CACtC;CAgBA;CAEA;CAEA,IAAIF,KAAgB;EAClB,OAAO,KAAK,cAAc,KAAK,YAAY,CAAC,CAAC,KAAK,OAAO;CAC3D;;kBAEkB;GAChB,KAAK;GACL,SAAS;GACT,SAAS,CAAC,YAAY,eAAe;EACvC;;;4BAE4B;IACzB,EAAW,SAAS,MAAM;IAC1B,EAAK,SAAS,MAAM;IACpB,EAAS,SAAS,MAAM;EAC3B;;;gBAEgB,EAAU,CAAC,CAAM,CAAC;;CAKlC,SAAS;EACP,OAAO,CAAI,mCACwB,KAAKG,GAAY,sBAG5C,KAAKH,KACD,CAAI,uFAC6E,KAAKI,GAAc,yHACvD,KAAK,WAAW,SAAS,QAAQ,6CAE9E,EACL,GAEC,KAAK,eAAe,UAChB,CAAI,yEAE2B,KAAKC,GAAsB,cAAY,KAAK,SAAS,oBAAkB,KAAK,cAAc,gBAAc,KAAK,KAAK,OAAO,mCAExJ,EACL,yEAEmC,KAAKC,GAAiB;CAOlE;CAEA,oBAAoB;EAMlB,AALA,MAAM,kBAAkB,GACxB,EAAgB,IAAI,GACpB,KAAK,WAAW,OAAO,YACvB,KAAK,iBAAiB,WAAW,KAAKC,EAAU,GAChD,KAAK,iBAAiB,SAAS,KAAKC,EAAQ,GAC5C,KAAKL,GAAY;CACnB;CAEA,uBAAuB;EAGrB,AAFA,MAAM,qBAAqB,GAC3B,KAAK,oBAAoB,WAAW,KAAKI,EAAU,GACnD,KAAK,oBAAoB,SAAS,KAAKC,EAAQ;CACjD;CAGA,OAAO;EACL,KAAKC,GAA0B,KAAK;CACtC;CAGA,QAAQ;EACN,KAAKA,GAA0B,MAAM;CACvC;CAEA,KAAc;EAEZ,AADA,KAAK,cAAc,GACnB,KAAKC,GAAuB;CAC9B;CAEA,KAAyB;EACvB,KAAKV,KAAgB,KAAK,WAAW,OAAO,IAAI,eAAe,IAAI,KAAK,WAAW,OAAO,OAAO,eAAe;CAClH;CAEA;CASA;CAcA,GAAiB,GAAU;EACzB,IAAM,IAAuB,EAA2B,EAAE,aAA4B,CAAC,CAAC;EAKxF,AAJI,KAAKA,MAAiB,CAAC,KAAK,cAAc,CAAC,KAC7C,KAAKI,GAAc,GAGjB,KAAK,eAAe,CAAC,KAAyB,EAAE,OAAuB,cAAc,QACvF,KAAKH,GAAiB;CAE1B;CAEA,KAAgB;EACd,KAAKQ,GAA0B,OAAO;CACxC;CAEA,KAAmB;EAKjB,AAJI,KAAK,eAAe,YACtB,KAAKE,GAAuB,GAG1B,KAAK,eAAe,WACtB,KAAKN,GAAsB;CAE/B;CAEA,KAAyB;EAEvB,AADA,KAAKO,GAA0B,OAAO,GAClC,KAAK,kBACP,KAAKV,GAAO,MAAM,QAAO,MAAK,MAAM,IAAI,CAAC,CAAC,SAAQ,MAAM,EAAE,WAAW,EAAM;CAE/E;CAEA,KAAwB;EAGtB,AAFA,KAAKU,GAA0B,OAAO,GAElC,KAAK,mBACP,KAAK,MAAM,SAAQ,MAAK;GAEtB,AADA,EAAE,WAAW,KAAK,UAClB,EAAE,gBAAgB;EACpB,CAAC,GACD,KAAKV,GAAO,MAAM,SAAQ,MAAQ,EAAoB,CAAI,CAAC;CAE/D;AACF;GA7MG,EAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,YAAA,KAAA,CAAA,MAKzC,EAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,YAAA,KAAA,CAAA,MAKzC,EAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,EAAA,WAAA,cAAA,KAAA,CAAA,MAK1B,EAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,EAAA,WAAA,cAAA,KAAA,CAAA,MAKzB,EAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,EAAA,WAAA,eAAA,KAAA,CAAA,MAO1B,EAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,EAAA,WAAA,QAAA,KAAA,CAAA,MAGzB,EAAS,CAAA,GAAA,EAAA,WAAA,QAAA,KAAA,CAAA,MAST,EAAsB,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,EAAA,WAAA,SAAA,KAAA,CAAA,MAGvC,EAAM,CAAA,GAAA,EAAA,WAAA,iBAAA,KAAA,CAAA,MAGN,EAAM,CAAA,GAAA,EAAA,WAAA,kBAAA,KAAA,CAAA,MAGN,EAAM,CAAA,GAAA,EAAA,WAAA,kBAAA,KAAA,CAAA;CA3DR,EAAM;CACN,EAAQ,EAAE,KAAK,GAAM,CAAC;CACtB,EAAW;CACX,EAAc;CACd,EAAc;CACd,EAAe;CACf,EAAiB"}
1
+ {"version":3,"file":"tree-node2.js","names":[],"sources":["../../src/tree/tree-node.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { LitElement, html, nothing } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport { state } from 'lit/decorators/state.js';\nimport { queryAssignedElements } from 'lit/decorators/query-assigned-elements.js';\nimport {\n I18nController,\n TypeExpandableController,\n TypeSelectableController,\n attachInternals,\n audit,\n getFlattenedFocusableItems,\n hostAttr,\n scopedRegistry,\n stateExpanded,\n stateHighlighted,\n stateSelected,\n typeAnchor,\n typeSSR,\n useStyles\n} from '@nvidia-elements/core/internal';\nimport { IconButton } from '@nvidia-elements/core/icon-button';\nimport { Icon } from '@nvidia-elements/core/icon';\nimport { Checkbox } from '@nvidia-elements/core/checkbox';\nimport type { Tree } from './tree.js';\nimport styles from './tree-node.css?inline';\nimport { updateNodeSelection } from './utils.js';\n\n/**\n * @element nve-tree-node\n * @description A tree view widget presents a hierarchical list. Any item in the hierarchy may have child items, and items that have children can expand or collapse to show or hide the children.\n * @documentation https://nvidia.github.io/elements/docs/elements/tree/\n * @since 1.2.0\n * @entrypoint \\@nvidia-elements/core/tree\n * @event open - Dispatched when the node opens.\n * @event close - Dispatched when the node closes.\n * @event select - Dispatched when the node selection state changes.\n * @command --select - use to select the node\n * @command --deselect - use to deselect the node\n * @command --toggle-select - use to toggle the node selection state\n * @command --open - use to open the node\n * @command --close - use to close the node\n * @command --toggle - use to toggle open / closed state of the node\n * @slot - Use default slot for basic text content or nested <nve-tree-node> elements.\n * @slot content - Use only for extended long form content containing interactive elements or form inputs.\n * @cssprop --color\n * @cssprop --border-radius\n * @cssprop --font-size\n * @cssprop --min-height\n * @cssprop --text-wrap\n * @cssprop --font-weight\n * @cssprop --width\n\n * @csspart icon-button - The icon button element\n * @csspart icon - The icon element\n * @csspart checkbox - The checkbox element\n\n * @aria https://www.w3.org/WAI/ARIA/apg/patterns/treeview/\n *\n */\n@audit()\n@typeSSR({ log: false }) // warning about ssr mismatch disabled as tree node will never be a 1:1 match in ssr due to performance constraints and slot complexity\n@typeAnchor()\n@stateSelected()\n@stateExpanded()\n@scopedRegistry()\n@stateHighlighted()\nexport class TreeNode extends LitElement {\n /**\n * Determines if node is in an expanded state.\n */\n @property({ type: Boolean, reflect: true }) expanded = false;\n\n /**\n * Determines whether if node is in a selected state.\n */\n @property({ type: Boolean, reflect: true }) selected = false;\n\n /**\n * Determines whether a node can be expandable. Expandable by default if slotted nodes exist.\n */\n @property({ type: Boolean }) expandable = false;\n\n /**\n * Determines whether a node can be in a selected state. Nodes can be in a single or multi select state.\n */\n @property({ type: String }) selectable: 'single' | 'multi';\n\n /**\n * Determines the highlighted state of the element. Highlighted states serve non-interactive selections where nodes may relate to other selected portions of the UI.\n */\n @property({ type: Boolean }) highlighted = false;\n\n #i18nController: I18nController<this> = new I18nController<this>(this);\n\n /**\n * Updates internal string values for internationalization.\n */\n @property({ type: Object }) i18n = this.#i18nController.i18n;\n\n /** @private */\n @hostAttr() slot = 'nodes';\n\n get #tree() {\n return this.closest<Tree>('nve-tree');\n }\n\n /**\n * Returns list of child nodes\n */\n @queryAssignedElements({ slot: 'nodes' }) readonly nodes!: TreeNode[];\n\n /** @private */\n @state() indeterminate = false;\n\n /** @private */\n @state() behaviorExpand = false;\n\n /** @private */\n @state() behaviorSelect = false;\n\n #typeExpandableController = new TypeExpandableController(this);\n\n #typeSelectableController = new TypeSelectableController(this);\n\n get #isExpandable() {\n return this.expandable || this.expanded || !!this.nodes?.length;\n }\n\n static metadata = {\n tag: 'nve-tree-node',\n version: '0.0.0',\n parents: ['nve-tree', 'nve-tree-node']\n };\n\n static elementDefinitions = {\n [IconButton.metadata.tag]: IconButton,\n [Icon.metadata.tag]: Icon,\n [Checkbox.metadata.tag]: Checkbox\n };\n\n static styles = useStyles([styles]);\n\n declare _internals: ElementInternals;\n\n /* eslint-disable @nvidia-elements/lint/no-missing-control-label */\n render() {\n return html`\n <div internal-host @slotchange=${this.#nodeUpdate}>\n <div part=\"_node\">\n ${\n this.#isExpandable\n ? html`\n <nve-icon-button part=\"icon-button\" exportparts=\"icon:icon-button-icon\" @pointerup=${this.#toggleExpand} role=\"presentation\" tabindex=\"-1\" size=\"sm\" container=\"inline\" nofocus>\n <nve-icon part=\"icon\" name=\"caret\" direction=${this.expanded ? 'down' : 'right'} size=\"sm\"></nve-icon>\n </nve-icon-button>`\n : nothing\n }\n ${\n this.selectable === 'multi'\n ? html`\n <nve-checkbox part=\"checkbox\" nofocus>\n <input type=\"checkbox\" @change=${this.#toggleMultiSelection} .checked=${this.selected} .indeterminate=${this.indeterminate} .ariaLabel=${this.i18n.expand} tabindex=\"-1\" />\n </nve-checkbox>`\n : nothing\n }\n <div tabindex=\"0\" part=\"_node-header\">\n <slot class=\"node-title\" @click=${this.#nodeHeaderClick}></slot>\n <slot name=\"content\" part=\"_content\"></slot>\n </div>\n </div>\n <div role=\"group\" part=\"_nodes\"><slot name=\"nodes\"></slot></div>\n </div>\n `;\n }\n\n connectedCallback() {\n super.connectedCallback();\n attachInternals(this);\n this._internals.role = 'treeitem';\n this.addEventListener('keydown', this.#onKeydown);\n this.addEventListener('keyup', this.#onKeyup);\n this.#nodeUpdate();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('keydown', this.#onKeydown);\n this.removeEventListener('keyup', this.#onKeyup);\n }\n\n /** opens and sets the expanded state automatically if behaviorExpand is true */\n open() {\n this.#typeExpandableController.open();\n }\n\n /** closes and sets the expanded state automatically if behaviorExpand is true */\n close() {\n this.#typeExpandableController.close();\n }\n\n #nodeUpdate() {\n this.requestUpdate();\n this.#toggleExpandableState();\n }\n\n #toggleExpandableState() {\n this.#isExpandable ? this._internals.states.add('is-expandable') : this._internals.states.delete('is-expandable');\n }\n\n #onKeydown = (e: KeyboardEvent) => {\n const isSelectionKey = this.selectable && e.code === 'Space';\n const isExpansionKey = this.#isExpandable && (e.code === 'ArrowLeft' || e.code === 'ArrowRight');\n\n if (e.target === this && (isSelectionKey || isExpansionKey)) {\n e.preventDefault();\n }\n };\n\n #onKeyup = (e: KeyboardEvent) => {\n if (this.#isExpandable && e.code === 'ArrowLeft' && e.target === this) {\n this.close();\n }\n\n if (this.#isExpandable && e.code === 'ArrowRight' && e.target === this) {\n this.open();\n }\n\n if (e.code === 'Space' && e.target === this && this.selectable) {\n this.#toggleSelection();\n }\n };\n\n #nodeHeaderClick(e: Event) {\n const hasFocusableElements = getFlattenedFocusableItems(e.currentTarget as HTMLElement).length;\n if (this.#isExpandable && !this.selectable && !hasFocusableElements) {\n this.#toggleExpand();\n }\n\n if (this.selectable && (!hasFocusableElements || (e.target as HTMLElement).localName === 'a')) {\n this.#toggleSelection();\n }\n }\n\n #toggleExpand() {\n this.#typeExpandableController.toggle();\n }\n\n #toggleSelection() {\n if (this.selectable === 'single') {\n this.#toggleSingleSelection();\n }\n\n if (this.selectable === 'multi') {\n this.#toggleMultiSelection();\n }\n }\n\n #toggleSingleSelection() {\n this.#typeSelectableController.toggle();\n if (this.behaviorSelect) {\n this.#tree!.nodes.filter(n => n !== this).forEach(n => (n.selected = false));\n }\n }\n\n #toggleMultiSelection() {\n this.#typeSelectableController.toggle();\n\n if (this.behaviorSelect) {\n this.nodes.forEach(n => {\n n.selected = this.selected;\n n.indeterminate = false;\n });\n this.#tree!.nodes.forEach(node => updateNodeSelection(node));\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAqEO,IAAM,IAAN,cAAuB,EAAW;;EAwJ3B,aApJ2C,KAAA,WAAA,IAKA,KAAA,WAAA,IAKb,KAAA,aAAA,IAUC,KAAA,cAAA,IAEH,KAAA,KAAA,IAAI,EAAqB,IAAI,GAKlC,KAAA,OAAA,KAAK,GAAgB,MAGrC,KAAA,OAAA,SAYM,KAAA,gBAAA,IAGC,KAAA,iBAAA,IAGA,KAAA,iBAAA,IAEE,KAAA,KAAA,IAAI,EAAyB,IAAI,GAEjC,KAAA,KAAA,IAAI,EAAyB,IAAI,GAuF/C,KAAA,MAAA,MAAqB;GACjC,IAAM,IAAiB,KAAK,cAAc,EAAE,SAAS,SAC/C,IAAiB,KAAK,OAAkB,EAAE,SAAS,eAAe,EAAE,SAAS;GAEnF,AAAI,EAAE,WAAW,SAAS,KAAkB,MAC1C,EAAE,eAAe;EAErB,GAEY,KAAA,MAAA,MAAqB;GAS/B,AARI,KAAK,MAAiB,EAAE,SAAS,eAAe,EAAE,WAAW,QAC/D,KAAK,MAAM,GAGT,KAAK,MAAiB,EAAE,SAAS,gBAAgB,EAAE,WAAW,QAChE,KAAK,KAAK,GAGR,EAAE,SAAS,WAAW,EAAE,WAAW,QAAQ,KAAK,cAClD,KAAK,GAAiB;EAE1B;;CA1IA;CAUA,IAAI,KAAQ;EACV,OAAO,KAAK,QAAc,UAAU;CACtC;CAgBA;CAEA;CAEA,IAAI,KAAgB;EAClB,OAAO,KAAK,cAAc,KAAK,YAAY,CAAC,CAAC,KAAK,OAAO;CAC3D;;EAEkB,KAAA,WAAA;GAChB,KAAK;GACL,SAAS;GACT,SAAS,CAAC,YAAY,eAAe;EACvC;;;EAE4B,KAAA,qBAAA;IACzB,EAAW,SAAS,MAAM;IAC1B,EAAK,SAAS,MAAM;IACpB,EAAS,SAAS,MAAM;EAC3B;;;EAEgB,KAAA,SAAA,EAAU,CAAC,CAAM,CAAC;;CAKlC,SAAS;EACP,OAAO,CAAI,mCACwB,KAAK,GAAY,sBAG5C,KAAK,KACD,CAAI,uFAC6E,KAAK,GAAc,yHACvD,KAAK,WAAW,SAAS,QAAQ,6CAE9E,EACL,GAEC,KAAK,eAAe,UAChB,CAAI,yEAE2B,KAAK,GAAsB,cAAY,KAAK,SAAS,oBAAkB,KAAK,cAAc,gBAAc,KAAK,KAAK,OAAO,mCAExJ,EACL,yEAEmC,KAAK,GAAiB;CAOlE;CAEA,oBAAoB;EAMlB,AALA,MAAM,kBAAkB,GACxB,EAAgB,IAAI,GACpB,KAAK,WAAW,OAAO,YACvB,KAAK,iBAAiB,WAAW,KAAK,EAAU,GAChD,KAAK,iBAAiB,SAAS,KAAK,EAAQ,GAC5C,KAAK,GAAY;CACnB;CAEA,uBAAuB;EAGrB,AAFA,MAAM,qBAAqB,GAC3B,KAAK,oBAAoB,WAAW,KAAK,EAAU,GACnD,KAAK,oBAAoB,SAAS,KAAK,EAAQ;CACjD;CAGA,OAAO;EACL,KAAK,GAA0B,KAAK;CACtC;CAGA,QAAQ;EACN,KAAK,GAA0B,MAAM;CACvC;CAEA,KAAc;EAEZ,AADA,KAAK,cAAc,GACnB,KAAK,GAAuB;CAC9B;CAEA,KAAyB;EACvB,KAAK,KAAgB,KAAK,WAAW,OAAO,IAAI,eAAe,IAAI,KAAK,WAAW,OAAO,OAAO,eAAe;CAClH;CAEA;CASA;CAcA,GAAiB,GAAU;EACzB,IAAM,IAAuB,EAA2B,EAAE,aAA4B,CAAC,CAAC;EAKxF,AAJI,KAAK,MAAiB,CAAC,KAAK,cAAc,CAAC,KAC7C,KAAK,GAAc,GAGjB,KAAK,eAAe,CAAC,KAAyB,EAAE,OAAuB,cAAc,QACvF,KAAK,GAAiB;CAE1B;CAEA,KAAgB;EACd,KAAK,GAA0B,OAAO;CACxC;CAEA,KAAmB;EAKjB,AAJI,KAAK,eAAe,YACtB,KAAK,GAAuB,GAG1B,KAAK,eAAe,WACtB,KAAK,GAAsB;CAE/B;CAEA,KAAyB;EAEvB,AADA,KAAK,GAA0B,OAAO,GAClC,KAAK,kBACP,KAAK,GAAO,MAAM,QAAO,MAAK,MAAM,IAAI,CAAC,CAAC,SAAQ,MAAM,EAAE,WAAW,EAAM;CAE/E;CAEA,KAAwB;EAGtB,AAFA,KAAK,GAA0B,OAAO,GAElC,KAAK,mBACP,KAAK,MAAM,SAAQ,MAAK;GAEtB,AADA,EAAE,WAAW,KAAK,UAClB,EAAE,gBAAgB;EACpB,CAAC,GACD,KAAK,GAAO,MAAM,SAAQ,MAAQ,EAAoB,CAAI,CAAC;CAE/D;AACF;AA7MG,EAAA,CAAA,EAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,YAAA,KAAA,CAAA,GAKzC,EAAA,CAAA,EAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,YAAA,KAAA,CAAA,GAKzC,EAAA,CAAA,EAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,EAAA,WAAA,cAAA,KAAA,CAAA,GAK1B,EAAA,CAAA,EAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,EAAA,WAAA,cAAA,KAAA,CAAA,GAKzB,EAAA,CAAA,EAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,EAAA,WAAA,eAAA,KAAA,CAAA,GAO1B,EAAA,CAAA,EAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,EAAA,WAAA,QAAA,KAAA,CAAA,GAGzB,EAAA,CAAA,EAAS,CAAA,GAAA,EAAA,WAAA,QAAA,KAAA,CAAA,GAST,EAAA,CAAA,EAAsB,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,EAAA,WAAA,SAAA,KAAA,CAAA,GAGvC,EAAA,CAAA,EAAM,CAAA,GAAA,EAAA,WAAA,iBAAA,KAAA,CAAA,GAGN,EAAA,CAAA,EAAM,CAAA,GAAA,EAAA,WAAA,kBAAA,KAAA,CAAA,GAGN,EAAA,CAAA,EAAM,CAAA,GAAA,EAAA,WAAA,kBAAA,KAAA,CAAA;CA3DR,EAAM;CACN,EAAQ,EAAE,KAAK,GAAM,CAAC;CACtB,EAAW;CACX,EAAc;CACd,EAAc;CACd,EAAe;CACf,EAAiB"}
@@ -1 +1 @@
1
- {"version":3,"file":"tree.examples.js","names":["#getNodeList","#open","#close"],"sources":["../../src/tree/tree.examples.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html, LitElement, nothing } from 'lit';\nimport { state } from 'lit/decorators/state.js';\nimport '@nvidia-elements/core/tree/define.js';\nimport '@nvidia-elements/core/checkbox/define.js';\nimport '@nvidia-elements/core/input/define.js';\nimport '@nvidia-elements/core/radio/define.js';\nimport '@nvidia-elements/core/progress-ring/define.js';\n\nexport default {\n title: 'Elements/Tree',\n component: 'nve-tree',\n};\n\n/**\n * @summary Basic tree component with expandable nodes, providing hierarchical data display and navigation for structured content organization.\n */\nexport const Default = {\n render: () => html`\n <nve-tree behavior-expand>\n <nve-tree-node expanded>\n node 1\n <nve-tree-node>node 1-1</nve-tree-node>\n <nve-tree-node>node 1-2</nve-tree-node>\n <nve-tree-node>\n node 1-3\n <nve-tree-node>node 1-3-1</nve-tree-node>\n <nve-tree-node>node 1-3-2</nve-tree-node>\n <nve-tree-node>node 1-3-3</nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n node 2\n <nve-tree-node>node 2-1</nve-tree-node>\n <nve-tree-node>node 2-2</nve-tree-node>\n <nve-tree-node>node 2-3</nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n node 3\n <nve-tree-node>node 3-1</nve-tree-node>\n <nve-tree-node>node 3-2</nve-tree-node>\n <nve-tree-node>\n node 3-3\n <nve-tree-node>node 3-3-1</nve-tree-node>\n <nve-tree-node>node 3-3-2</nve-tree-node>\n <nve-tree-node>node 3-3-3</nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree>\n `\n};\n\n/**\n * @summary Tree with border styling for enhanced visual separation and container definition, improving content structure perception.\n */\nexport const Border = {\n render: () => html`\n <nve-tree behavior-expand border>\n <nve-tree-node expanded>\n node 1\n <nve-tree-node>node 1-1</nve-tree-node>\n <nve-tree-node>node 1-2</nve-tree-node>\n <nve-tree-node>\n node 1-3\n <nve-tree-node>node 1-3-1</nve-tree-node>\n <nve-tree-node>node 1-3-2</nve-tree-node>\n <nve-tree-node>node 1-3-3</nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n node 2\n <nve-tree-node>node 2-1</nve-tree-node>\n <nve-tree-node>node 2-2</nve-tree-node>\n <nve-tree-node>node 2-3</nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n node 3\n <nve-tree-node>node 3-1</nve-tree-node>\n <nve-tree-node>node 3-2</nve-tree-node>\n <nve-tree-node>\n node 3-3\n <nve-tree-node>node 3-3-1</nve-tree-node>\n <nve-tree-node>node 3-3-2</nve-tree-node>\n <nve-tree-node>node 3-3-3</nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree>\n `\n};\n\n/**\n * @summary Single-selection tree for choosing one item from hierarchical options, enabling focused navigation and content selection.\n */\nexport const Selectable = {\n render: () => html`\n <nve-tree selectable=\"single\" behavior-expand behavior-select border>\n <nve-tree-node expanded>\n node 1\n <nve-tree-node selected>node 1-1</nve-tree-node>\n <nve-tree-node>node 1-2</nve-tree-node>\n <nve-tree-node>\n node 1-3\n <nve-tree-node>node 1-3-1</nve-tree-node>\n <nve-tree-node>node 1-3-2</nve-tree-node>\n <nve-tree-node>node 1-3-3</nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n node 2\n <nve-tree-node>node 2-1</nve-tree-node>\n <nve-tree-node>node 2-2</nve-tree-node>\n <nve-tree-node>node 2-3</nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n node 3\n <nve-tree-node>node 3-1</nve-tree-node>\n <nve-tree-node>node 3-2</nve-tree-node>\n <nve-tree-node>\n node 3-3\n <nve-tree-node>node 3-3-1</nve-tree-node>\n <nve-tree-node>node 3-3-2</nve-tree-node>\n <nve-tree-node>node 3-3-3</nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree>\n `\n};\n\n/**\n * @summary Multi-selection tree for choosing many items from hierarchical options, enabling bulk operations and comprehensive content management.\n */\nexport const SelectableMultiple = {\n render: () => html`\n <nve-tree selectable=\"multi\" behavior-expand behavior-select border>\n <nve-tree-node expanded>\n node 1\n <nve-tree-node>node 1-1</nve-tree-node>\n <nve-tree-node selected>node 1-2</nve-tree-node>\n <nve-tree-node expanded>\n node 1-3\n <nve-tree-node>node 1-3-1</nve-tree-node>\n <nve-tree-node>node 1-3-2</nve-tree-node>\n <nve-tree-node>node 1-3-3</nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n node 2\n <nve-tree-node>node 2-1</nve-tree-node>\n <nve-tree-node>node 2-2</nve-tree-node>\n <nve-tree-node>node 2-3</nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n node 3\n <nve-tree-node>node 3-1</nve-tree-node>\n <nve-tree-node>node 3-2</nve-tree-node>\n <nve-tree-node>\n node 3-3\n <nve-tree-node>node 3-3-1</nve-tree-node>\n <nve-tree-node>node 3-3-2</nve-tree-node>\n <nve-tree-node>node 3-3-3</nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree>\n `\n};\n\n/**\n * @summary Interactive selection handling using the select event, with callbacks for node selection changes.\n * @tags test-case\n */\nexport const SelectEvent = {\n render: () => html`\n <div nve-layout=\"column gap:md\">\n <div nve-layout=\"row gap:md\">\n <nve-tree id=\"select-event-tree\" selectable=\"single\" behavior-expand behavior-select border>\n <nve-tree-node expanded>\n Documents\n <nve-tree-node>Annual Report.pdf</nve-tree-node>\n <nve-tree-node>Budget.xlsx</nve-tree-node>\n <nve-tree-node expanded>\n Projects\n <nve-tree-node>Project Alpha</nve-tree-node>\n <nve-tree-node>Project Beta</nve-tree-node>\n <nve-tree-node>Project Gamma</nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n Images\n <nve-tree-node>photo-001.jpg</nve-tree-node>\n <nve-tree-node>photo-002.jpg</nve-tree-node>\n <nve-tree-node>screenshot.png</nve-tree-node>\n </nve-tree-node>\n </nve-tree>\n <div nve-layout=\"column gap:sm\">\n <p nve-text=\"body sm\"><strong>Selected:</strong> <span id=\"selected-node\">None</span></p>\n <p nve-text=\"body sm\"><strong>History:</strong></p>\n <ul id=\"selection-history\" nve-text=\"body sm\">\n <li>No selections yet</li>\n </ul>\n </div>\n </div>\n </div>\n <script type=\"module\">\n const tree = document.querySelector('#select-event-tree');\n const selectedDisplay = document.querySelector('#selected-node');\n const historyList = document.querySelector('#selection-history');\n const history = [];\n tree.addEventListener('select', (e) => {\n const node = e.detail;\n const nodeText = node.textContent?.trim().split('\\\\n')[0] ?? 'Unknown';\n selectedDisplay.textContent = nodeText;\n history.push(nodeText);\n if (history.length > 5) history.shift();\n historyList.innerHTML = history.map(item => '<li>' + item + '</li>').join('');\n });\n </script>\n `\n};\n\n/**\n * @summary Tree with highlighted nodes for emphasizing specific items, providing visual focus and search result signal in hierarchical data.\n */\nexport const Highlight = {\n render: () => html`\n <nve-tree behavior-expand border>\n <nve-tree-node expanded>\n node 1\n <nve-tree-node highlighted>node 1-1</nve-tree-node>\n <nve-tree-node>node 1-2</nve-tree-node>\n <nve-tree-node expanded>\n node 1-3\n <nve-tree-node highlighted>node 1-3-1</nve-tree-node>\n <nve-tree-node highlighted>node 1-3-2</nve-tree-node>\n <nve-tree-node>node 1-3-3</nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n node 2\n <nve-tree-node>node 2-1</nve-tree-node>\n <nve-tree-node>node 2-2</nve-tree-node>\n <nve-tree-node>node 2-3</nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n node 3\n <nve-tree-node>node 3-1</nve-tree-node>\n <nve-tree-node>node 3-2</nve-tree-node>\n <nve-tree-node>\n node 3-3\n <nve-tree-node>node 3-3-1</nve-tree-node>\n <nve-tree-node>node 3-3-2</nve-tree-node>\n <nve-tree-node>node 3-3-3</nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree>\n `\n};\n\n/**\n * @summary Tree with navigation links for hierarchical menu systems, enabling structured site navigation and content discovery.\n */\nexport const Links = {\n render: () => html`\n <nve-tree behavior-expand>\n <nve-tree-node><a href=\"#\">Documentation</a></nve-tree-node>\n <nve-tree-node><a href=\"#\">Support</a></nve-tree-node>\n <nve-tree-node expanded>\n Elements\n <nve-tree-node><a href=\"#\">Alert</a></nve-tree-node>\n <nve-tree-node><a href=\"#\">Badge</a></nve-tree-node>\n <nve-tree-node><a href=\"#\">Dialog</a></nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n Frameworks\n <nve-tree-node><a href=\"#\">Angular</a></nve-tree-node>\n <nve-tree-node><a href=\"#\">React</a></nve-tree-node>\n <nve-tree-node><a href=\"#\">Vue</a></nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n Languages\n <nve-tree-node><a href=\"#\">JavaScript</a></nve-tree-node>\n <nve-tree-node><a href=\"#\">HTML</a></nve-tree-node>\n <nve-tree-node><a href=\"#\">CSS</a></nve-tree-node>\n </nve-tree-node>\n </nve-tree>\n `\n};\n\n/**\n * @summary Tree with loading states for asynchronous data, including progress indicators and dynamic content loading in hierarchical structures.\n */\nexport const Async = {\n render: () => html`\n <nve-tree border>\n <nve-tree-node expanded>\n node 1\n <nve-tree-node>node 1-1</nve-tree-node>\n <nve-tree-node>node 1-2</nve-tree-node>\n <nve-tree-node expanded>\n node 1-3\n <nve-tree-node>\n <div nve-layout=\"row gap:xs\">\n <nve-progress-ring status=\"accent\" size=\"xs\"></nve-progress-ring> loading\n </div>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n node 2\n <nve-tree-node>node 2-1</nve-tree-node>\n <nve-tree-node>node 2-2</nve-tree-node>\n <nve-tree-node>node 2-3</nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n node 3\n <nve-tree-node>node 3-1</nve-tree-node>\n <nve-tree-node>node 3-2</nve-tree-node>\n <nve-tree-node>\n node 3-3\n <nve-tree-node>node 3-3-1</nve-tree-node>\n <nve-tree-node>node 3-3-2</nve-tree-node>\n <nve-tree-node>node 3-3-3</nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree>\n `\n};\n\n/**\n * @summary Tree with rich node content including forms, controls, and interactive elements, enabling complex data management within hierarchical structures.\n */\nexport const NodeContent = {\n render: () => html`\n <nve-tree selectable=\"multi\" border behavior-expand behavior-select>\n <nve-tree-node expanded>\n text content\n <nve-tree-node>\n <a href=\".\" nve-text=\"link\">node link</a>\n </nve-tree-node>\n <nve-tree-node>\n inline content <nve-dot status=\"success\" size=\"sm\"></nve-dot>\n </nve-tree-node>\n <nve-tree-node>\n <div nve-text=\"body sm muted\" nve-layout=\"pad-bottom:xs\">block</div>\n <p nve-text=\"body sm\">content</p>\n </nve-tree-node>\n <nve-tree-node>\n long form content\n <div slot=\"content\" nve-layout=\"column gap:sm\">\n <a href=\"#\" nve-text=\"link\">This is some longer content in a tree node.</a>\n <a href=\"#\" nve-text=\"link\">This is some longer content in a tree node.</a>\n <a href=\"#\" nve-text=\"link\">This is some longer content in a tree node.</a>\n </div>\n </nve-tree-node>\n <nve-tree-node>\n interactive content\n <div slot=\"content\" nve-layout=\"column gap:sm\">\n <p nve-text=\"body sm\">This is some longer content in a tree node.</p>\n <nve-button>hello there</nve-button>\n </div>\n </nve-tree-node>\n <nve-tree-node>\n input control\n <div slot=\"content\" nve-layout=\"column gap:sm\">\n <nve-input>\n <label>label</label>\n <input type=\"text\" />\n </nve-input>\n <nve-input>\n <label>label</label>\n <input type=\"text\" />\n </nve-input>\n </div>\n </nve-tree-node>\n <nve-tree-node>\n node content checkbox group\n <nve-checkbox-group slot=\"content\">\n <label>label</label>\n <nve-checkbox>\n <label>checkbox 1</label>\n <input type=\"checkbox\" checked />\n </nve-checkbox>\n\n <nve-checkbox>\n <label>checkbox 2</label>\n <input type=\"checkbox\" />\n </nve-checkbox>\n\n <nve-checkbox>\n <label>checkbox 3</label>\n <input type=\"checkbox\" />\n </nve-checkbox>\n </nve-checkbox-group>\n </nve-tree-node>\n <nve-tree-node>\n node content radio group\n <nve-radio-group slot=\"content\">\n <label>label</label>\n <nve-radio>\n <label>radio 1</label>\n <input type=\"radio\" checked />\n </nve-radio>\n\n <nve-radio>\n <label>radio 2</label>\n <input type=\"radio\" />\n </nve-radio>\n\n <nve-radio>\n <label>radio 3</label>\n <input type=\"radio\" />\n </nve-radio>\n </nve-radio-group>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree>\n `\n};\n\n/**\n * @summary Dynamic tree with programmatic node creation and management, for scalable hierarchical data handling with large datasets.\n * @tags test-case\n */\nexport const DynamicTree = {\n render: () => html`<test-dynamic-tree></test-dynamic-tree>`\n};\n\n/**\n * @summary Tree with scrollable container for handling deep hierarchies and large datasets, ensuring optimal space usage and navigation.\n * @tags test-case\n */\nexport const Overflow = {\n render: () => html`\n <div style=\"width: 300px; height: 500px; overflow: auto; outline: 1px solid #ccc; padding: 12px\">\n <nve-tree border behavior-expand>\n <nve-tree-node expanded>\n node 1\n <nve-tree-node>node 1-1</nve-tree-node>\n <nve-tree-node>node 1-2</nve-tree-node>\n <nve-tree-node expanded>\n node 1-3\n <nve-tree-node>node 1-3-1</nve-tree-node>\n <nve-tree-node>node 1-3-2</nve-tree-node>\n <nve-tree-node expanded>\n node 1-3-3\n <nve-tree-node>node 1-3-3-1</nve-tree-node>\n <nve-tree-node>node 1-3-3-2</nve-tree-node>\n <nve-tree-node expanded>\n node 1-3-3-3\n <nve-tree-node>node 1-3-3-3-1</nve-tree-node>\n <nve-tree-node>node 1-3-3-3-2</nve-tree-node>\n <nve-tree-node expanded>\n node 1-3-3-3-3\n <nve-tree-node>node 1-3-3-3-3-1</nve-tree-node>\n <nve-tree-node>node 1-3-3-3-3-2</nve-tree-node>\n <nve-tree-node expanded>\n node 1-3-3-3-3-3\n <nve-tree-node>node 1-3-3-3-3-3-1</nve-tree-node>\n <nve-tree-node>node 1-3-3-3-3-3-2</nve-tree-node>\n <nve-tree-node expanded>\n node 1-3-3-3-3-3-3\n <nve-tree-node>node 1-3-3-3-3-3-3-1</nve-tree-node>\n <nve-tree-node>node 1-3-3-3-3-3-3-2</nve-tree-node>\n <nve-tree-node expanded>\n node 1-3-3-3-3-3-3-3\n <nve-tree-node>node 1-3-3-3-3-3-3-3-1</nve-tree-node>\n <nve-tree-node>node 1-3-3-3-3-3-3-3-2</nve-tree-node>\n <nve-tree-node expanded>\n node 1-3-3-3-3-3-3-3-3\n <nve-tree-node>node 1-3-3-3-3-3-3-3-3-1</nve-tree-node>\n <nve-tree-node>node 1-3-3-3-3-3-3-3-3-2</nve-tree-node>\n <nve-tree-node>node 1-3-3-3-3-3-3-3-3-3</nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n <nve-tree-node expanded>\n node 2\n <nve-tree-node>node 2-1</nve-tree-node>\n <nve-tree-node>node 2-2</nve-tree-node>\n <nve-tree-node>node 2-3</nve-tree-node>\n </nve-tree-node>\n </nve-tree>\n </div>\n `\n};\n\n/**\n * @summary Tree with bulk node creation for performance testing, verifying efficient handling of large numbers of nodes and dynamic expansion.\n * @tags test-case performance\n */\nexport const BulkCreation = {\n render: () => html`\n <nve-tree>\n <nve-tree-node id=\"root\" expandable>Test</nve-tree-node>\n </nve-tree>\n <script type=\"module\">\n const rootEl = document.querySelector('nve-tree-node#root');\n\n rootEl.addEventListener('open', () => {\n const fragment = document.createDocumentFragment();\n for (let i = 0; i < 400; i++) {\n rootEl.expanded = true;\n const childEl = document.createElement('nve-tree-node');\n childEl.innerText = 'Child ' + i;\n fragment.append(childEl);\n }\n rootEl.append(fragment);\n });\n\n rootEl.addEventListener('close', () => {\n rootEl.expanded = false;\n rootEl.replaceChildren(document.createTextNode('Test'));\n });\n </script>\n `\n};\n\n/**\n * @summary Examples of invalid tree usage patterns for testing and documentation purposes, showing what not to do when implementing trees.\n * @tags anti-pattern\n */\nexport const Audit = {\n render: () => html`\n <div>\n <nve-tree-node>node</nve-tree-node>\n </div>\n `\n};\n\nexport class TestDynamicTree extends LitElement {\n @state() nodes = createTree();\n\n render() {\n return html`\n <p nve-text=\"body\">total nodes: 10,000</p>\n <nve-tree border expandable>\n ${this.nodes.map(node => this.#getNodeList(node))}\n </nve-tree>`;\n }\n\n #getNodeList(node) {\n return html`<nve-tree-node .expandable=${node.nodes.length} .expanded=${node.expanded} @open=${e => this.#open(e, node)} @close=${e => this.#close(e, node)}>\n ${node.label} node\n ${node.expanded ? node.nodes.map(n => html`${this.#getNodeList(n)}`) : nothing}\n </nve-tree-node>`\n }\n\n #open(e, node) {\n e.stopPropagation();\n node.expanded = true;\n this.nodes = [...this.nodes];\n this.requestUpdate();\n }\n\n #close(e, node) {\n e.stopPropagation();\n node.expanded = false;\n this.nodes = [...this.nodes];\n this.requestUpdate();\n }\n}\n\n/** generates a tree with 10 nodes with 4 layers */\nfunction createTree() {\n return createNodeList(10).map(i => {\n i.nodes = createNodeList(10);\n i.nodes.forEach(j => {\n j.nodes = createNodeList(10);\n j.nodes.forEach(k => {\n k.nodes = createNodeList(10);\n })\n })\n return i;\n });\n}\n\nfunction createNodeList(nodes: number) {\n return new Array(nodes).fill('').map((_, i) => ({ label: `${i}`, expanded: false, nodes: [] }));\n}\n\ncustomElements.get('test-dynamic-tree') || customElements.define('test-dynamic-tree', TestDynamicTree);"],"mappings":";AAGA,IAAA,IAAe"}
1
+ {"version":3,"file":"tree.examples.js","names":[],"sources":["../../src/tree/tree.examples.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html, LitElement, nothing } from 'lit';\nimport { state } from 'lit/decorators/state.js';\nimport '@nvidia-elements/core/tree/define.js';\nimport '@nvidia-elements/core/checkbox/define.js';\nimport '@nvidia-elements/core/input/define.js';\nimport '@nvidia-elements/core/radio/define.js';\nimport '@nvidia-elements/core/progress-ring/define.js';\n\nexport default {\n title: 'Elements/Tree',\n component: 'nve-tree',\n};\n\n/**\n * @summary Basic tree component with expandable nodes, providing hierarchical data display and navigation for structured content organization.\n */\nexport const Default = {\n render: () => html`\n <nve-tree behavior-expand>\n <nve-tree-node expanded>\n node 1\n <nve-tree-node>node 1-1</nve-tree-node>\n <nve-tree-node>node 1-2</nve-tree-node>\n <nve-tree-node>\n node 1-3\n <nve-tree-node>node 1-3-1</nve-tree-node>\n <nve-tree-node>node 1-3-2</nve-tree-node>\n <nve-tree-node>node 1-3-3</nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n node 2\n <nve-tree-node>node 2-1</nve-tree-node>\n <nve-tree-node>node 2-2</nve-tree-node>\n <nve-tree-node>node 2-3</nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n node 3\n <nve-tree-node>node 3-1</nve-tree-node>\n <nve-tree-node>node 3-2</nve-tree-node>\n <nve-tree-node>\n node 3-3\n <nve-tree-node>node 3-3-1</nve-tree-node>\n <nve-tree-node>node 3-3-2</nve-tree-node>\n <nve-tree-node>node 3-3-3</nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree>\n `\n};\n\n/**\n * @summary Tree with border styling for enhanced visual separation and container definition, improving content structure perception.\n */\nexport const Border = {\n render: () => html`\n <nve-tree behavior-expand border>\n <nve-tree-node expanded>\n node 1\n <nve-tree-node>node 1-1</nve-tree-node>\n <nve-tree-node>node 1-2</nve-tree-node>\n <nve-tree-node>\n node 1-3\n <nve-tree-node>node 1-3-1</nve-tree-node>\n <nve-tree-node>node 1-3-2</nve-tree-node>\n <nve-tree-node>node 1-3-3</nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n node 2\n <nve-tree-node>node 2-1</nve-tree-node>\n <nve-tree-node>node 2-2</nve-tree-node>\n <nve-tree-node>node 2-3</nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n node 3\n <nve-tree-node>node 3-1</nve-tree-node>\n <nve-tree-node>node 3-2</nve-tree-node>\n <nve-tree-node>\n node 3-3\n <nve-tree-node>node 3-3-1</nve-tree-node>\n <nve-tree-node>node 3-3-2</nve-tree-node>\n <nve-tree-node>node 3-3-3</nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree>\n `\n};\n\n/**\n * @summary Single-selection tree for choosing one item from hierarchical options, enabling focused navigation and content selection.\n */\nexport const Selectable = {\n render: () => html`\n <nve-tree selectable=\"single\" behavior-expand behavior-select border>\n <nve-tree-node expanded>\n node 1\n <nve-tree-node selected>node 1-1</nve-tree-node>\n <nve-tree-node>node 1-2</nve-tree-node>\n <nve-tree-node>\n node 1-3\n <nve-tree-node>node 1-3-1</nve-tree-node>\n <nve-tree-node>node 1-3-2</nve-tree-node>\n <nve-tree-node>node 1-3-3</nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n node 2\n <nve-tree-node>node 2-1</nve-tree-node>\n <nve-tree-node>node 2-2</nve-tree-node>\n <nve-tree-node>node 2-3</nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n node 3\n <nve-tree-node>node 3-1</nve-tree-node>\n <nve-tree-node>node 3-2</nve-tree-node>\n <nve-tree-node>\n node 3-3\n <nve-tree-node>node 3-3-1</nve-tree-node>\n <nve-tree-node>node 3-3-2</nve-tree-node>\n <nve-tree-node>node 3-3-3</nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree>\n `\n};\n\n/**\n * @summary Multi-selection tree for choosing many items from hierarchical options, enabling bulk operations and comprehensive content management.\n */\nexport const SelectableMultiple = {\n render: () => html`\n <nve-tree selectable=\"multi\" behavior-expand behavior-select border>\n <nve-tree-node expanded>\n node 1\n <nve-tree-node>node 1-1</nve-tree-node>\n <nve-tree-node selected>node 1-2</nve-tree-node>\n <nve-tree-node expanded>\n node 1-3\n <nve-tree-node>node 1-3-1</nve-tree-node>\n <nve-tree-node>node 1-3-2</nve-tree-node>\n <nve-tree-node>node 1-3-3</nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n node 2\n <nve-tree-node>node 2-1</nve-tree-node>\n <nve-tree-node>node 2-2</nve-tree-node>\n <nve-tree-node>node 2-3</nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n node 3\n <nve-tree-node>node 3-1</nve-tree-node>\n <nve-tree-node>node 3-2</nve-tree-node>\n <nve-tree-node>\n node 3-3\n <nve-tree-node>node 3-3-1</nve-tree-node>\n <nve-tree-node>node 3-3-2</nve-tree-node>\n <nve-tree-node>node 3-3-3</nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree>\n `\n};\n\n/**\n * @summary Interactive selection handling using the select event, with callbacks for node selection changes.\n * @tags test-case\n */\nexport const SelectEvent = {\n render: () => html`\n <div nve-layout=\"column gap:md\">\n <div nve-layout=\"row gap:md\">\n <nve-tree id=\"select-event-tree\" selectable=\"single\" behavior-expand behavior-select border>\n <nve-tree-node expanded>\n Documents\n <nve-tree-node>Annual Report.pdf</nve-tree-node>\n <nve-tree-node>Budget.xlsx</nve-tree-node>\n <nve-tree-node expanded>\n Projects\n <nve-tree-node>Project Alpha</nve-tree-node>\n <nve-tree-node>Project Beta</nve-tree-node>\n <nve-tree-node>Project Gamma</nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n Images\n <nve-tree-node>photo-001.jpg</nve-tree-node>\n <nve-tree-node>photo-002.jpg</nve-tree-node>\n <nve-tree-node>screenshot.png</nve-tree-node>\n </nve-tree-node>\n </nve-tree>\n <div nve-layout=\"column gap:sm\">\n <p nve-text=\"body sm\"><strong>Selected:</strong> <span id=\"selected-node\">None</span></p>\n <p nve-text=\"body sm\"><strong>History:</strong></p>\n <ul id=\"selection-history\" nve-text=\"body sm\">\n <li>No selections yet</li>\n </ul>\n </div>\n </div>\n </div>\n <script type=\"module\">\n const tree = document.querySelector('#select-event-tree');\n const selectedDisplay = document.querySelector('#selected-node');\n const historyList = document.querySelector('#selection-history');\n const history = [];\n tree.addEventListener('select', (e) => {\n const node = e.detail;\n const nodeText = node.textContent?.trim().split('\\\\n')[0] ?? 'Unknown';\n selectedDisplay.textContent = nodeText;\n history.push(nodeText);\n if (history.length > 5) history.shift();\n historyList.innerHTML = history.map(item => '<li>' + item + '</li>').join('');\n });\n </script>\n `\n};\n\n/**\n * @summary Tree with highlighted nodes for emphasizing specific items, providing visual focus and search result signal in hierarchical data.\n */\nexport const Highlight = {\n render: () => html`\n <nve-tree behavior-expand border>\n <nve-tree-node expanded>\n node 1\n <nve-tree-node highlighted>node 1-1</nve-tree-node>\n <nve-tree-node>node 1-2</nve-tree-node>\n <nve-tree-node expanded>\n node 1-3\n <nve-tree-node highlighted>node 1-3-1</nve-tree-node>\n <nve-tree-node highlighted>node 1-3-2</nve-tree-node>\n <nve-tree-node>node 1-3-3</nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n node 2\n <nve-tree-node>node 2-1</nve-tree-node>\n <nve-tree-node>node 2-2</nve-tree-node>\n <nve-tree-node>node 2-3</nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n node 3\n <nve-tree-node>node 3-1</nve-tree-node>\n <nve-tree-node>node 3-2</nve-tree-node>\n <nve-tree-node>\n node 3-3\n <nve-tree-node>node 3-3-1</nve-tree-node>\n <nve-tree-node>node 3-3-2</nve-tree-node>\n <nve-tree-node>node 3-3-3</nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree>\n `\n};\n\n/**\n * @summary Tree with navigation links for hierarchical menu systems, enabling structured site navigation and content discovery.\n */\nexport const Links = {\n render: () => html`\n <nve-tree behavior-expand>\n <nve-tree-node><a href=\"#\">Documentation</a></nve-tree-node>\n <nve-tree-node><a href=\"#\">Support</a></nve-tree-node>\n <nve-tree-node expanded>\n Elements\n <nve-tree-node><a href=\"#\">Alert</a></nve-tree-node>\n <nve-tree-node><a href=\"#\">Badge</a></nve-tree-node>\n <nve-tree-node><a href=\"#\">Dialog</a></nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n Frameworks\n <nve-tree-node><a href=\"#\">Angular</a></nve-tree-node>\n <nve-tree-node><a href=\"#\">React</a></nve-tree-node>\n <nve-tree-node><a href=\"#\">Vue</a></nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n Languages\n <nve-tree-node><a href=\"#\">JavaScript</a></nve-tree-node>\n <nve-tree-node><a href=\"#\">HTML</a></nve-tree-node>\n <nve-tree-node><a href=\"#\">CSS</a></nve-tree-node>\n </nve-tree-node>\n </nve-tree>\n `\n};\n\n/**\n * @summary Tree with loading states for asynchronous data, including progress indicators and dynamic content loading in hierarchical structures.\n */\nexport const Async = {\n render: () => html`\n <nve-tree border>\n <nve-tree-node expanded>\n node 1\n <nve-tree-node>node 1-1</nve-tree-node>\n <nve-tree-node>node 1-2</nve-tree-node>\n <nve-tree-node expanded>\n node 1-3\n <nve-tree-node>\n <div nve-layout=\"row gap:xs\">\n <nve-progress-ring status=\"accent\" size=\"xs\"></nve-progress-ring> loading\n </div>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n node 2\n <nve-tree-node>node 2-1</nve-tree-node>\n <nve-tree-node>node 2-2</nve-tree-node>\n <nve-tree-node>node 2-3</nve-tree-node>\n </nve-tree-node>\n <nve-tree-node>\n node 3\n <nve-tree-node>node 3-1</nve-tree-node>\n <nve-tree-node>node 3-2</nve-tree-node>\n <nve-tree-node>\n node 3-3\n <nve-tree-node>node 3-3-1</nve-tree-node>\n <nve-tree-node>node 3-3-2</nve-tree-node>\n <nve-tree-node>node 3-3-3</nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree>\n `\n};\n\n/**\n * @summary Tree with rich node content including forms, controls, and interactive elements, enabling complex data management within hierarchical structures.\n */\nexport const NodeContent = {\n render: () => html`\n <nve-tree selectable=\"multi\" border behavior-expand behavior-select>\n <nve-tree-node expanded>\n text content\n <nve-tree-node>\n <a href=\".\" nve-text=\"link\">node link</a>\n </nve-tree-node>\n <nve-tree-node>\n inline content <nve-dot status=\"success\" size=\"sm\"></nve-dot>\n </nve-tree-node>\n <nve-tree-node>\n <div nve-text=\"body sm muted\" nve-layout=\"pad-bottom:xs\">block</div>\n <p nve-text=\"body sm\">content</p>\n </nve-tree-node>\n <nve-tree-node>\n long form content\n <div slot=\"content\" nve-layout=\"column gap:sm\">\n <a href=\"#\" nve-text=\"link\">This is some longer content in a tree node.</a>\n <a href=\"#\" nve-text=\"link\">This is some longer content in a tree node.</a>\n <a href=\"#\" nve-text=\"link\">This is some longer content in a tree node.</a>\n </div>\n </nve-tree-node>\n <nve-tree-node>\n interactive content\n <div slot=\"content\" nve-layout=\"column gap:sm\">\n <p nve-text=\"body sm\">This is some longer content in a tree node.</p>\n <nve-button>hello there</nve-button>\n </div>\n </nve-tree-node>\n <nve-tree-node>\n input control\n <div slot=\"content\" nve-layout=\"column gap:sm\">\n <nve-input>\n <label>label</label>\n <input type=\"text\" />\n </nve-input>\n <nve-input>\n <label>label</label>\n <input type=\"text\" />\n </nve-input>\n </div>\n </nve-tree-node>\n <nve-tree-node>\n node content checkbox group\n <nve-checkbox-group slot=\"content\">\n <label>label</label>\n <nve-checkbox>\n <label>checkbox 1</label>\n <input type=\"checkbox\" checked />\n </nve-checkbox>\n\n <nve-checkbox>\n <label>checkbox 2</label>\n <input type=\"checkbox\" />\n </nve-checkbox>\n\n <nve-checkbox>\n <label>checkbox 3</label>\n <input type=\"checkbox\" />\n </nve-checkbox>\n </nve-checkbox-group>\n </nve-tree-node>\n <nve-tree-node>\n node content radio group\n <nve-radio-group slot=\"content\">\n <label>label</label>\n <nve-radio>\n <label>radio 1</label>\n <input type=\"radio\" checked />\n </nve-radio>\n\n <nve-radio>\n <label>radio 2</label>\n <input type=\"radio\" />\n </nve-radio>\n\n <nve-radio>\n <label>radio 3</label>\n <input type=\"radio\" />\n </nve-radio>\n </nve-radio-group>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree>\n `\n};\n\n/**\n * @summary Dynamic tree with programmatic node creation and management, for scalable hierarchical data handling with large datasets.\n * @tags test-case\n */\nexport const DynamicTree = {\n render: () => html`<test-dynamic-tree></test-dynamic-tree>`\n};\n\n/**\n * @summary Tree with scrollable container for handling deep hierarchies and large datasets, ensuring optimal space usage and navigation.\n * @tags test-case\n */\nexport const Overflow = {\n render: () => html`\n <div style=\"width: 300px; height: 500px; overflow: auto; outline: 1px solid #ccc; padding: 12px\">\n <nve-tree border behavior-expand>\n <nve-tree-node expanded>\n node 1\n <nve-tree-node>node 1-1</nve-tree-node>\n <nve-tree-node>node 1-2</nve-tree-node>\n <nve-tree-node expanded>\n node 1-3\n <nve-tree-node>node 1-3-1</nve-tree-node>\n <nve-tree-node>node 1-3-2</nve-tree-node>\n <nve-tree-node expanded>\n node 1-3-3\n <nve-tree-node>node 1-3-3-1</nve-tree-node>\n <nve-tree-node>node 1-3-3-2</nve-tree-node>\n <nve-tree-node expanded>\n node 1-3-3-3\n <nve-tree-node>node 1-3-3-3-1</nve-tree-node>\n <nve-tree-node>node 1-3-3-3-2</nve-tree-node>\n <nve-tree-node expanded>\n node 1-3-3-3-3\n <nve-tree-node>node 1-3-3-3-3-1</nve-tree-node>\n <nve-tree-node>node 1-3-3-3-3-2</nve-tree-node>\n <nve-tree-node expanded>\n node 1-3-3-3-3-3\n <nve-tree-node>node 1-3-3-3-3-3-1</nve-tree-node>\n <nve-tree-node>node 1-3-3-3-3-3-2</nve-tree-node>\n <nve-tree-node expanded>\n node 1-3-3-3-3-3-3\n <nve-tree-node>node 1-3-3-3-3-3-3-1</nve-tree-node>\n <nve-tree-node>node 1-3-3-3-3-3-3-2</nve-tree-node>\n <nve-tree-node expanded>\n node 1-3-3-3-3-3-3-3\n <nve-tree-node>node 1-3-3-3-3-3-3-3-1</nve-tree-node>\n <nve-tree-node>node 1-3-3-3-3-3-3-3-2</nve-tree-node>\n <nve-tree-node expanded>\n node 1-3-3-3-3-3-3-3-3\n <nve-tree-node>node 1-3-3-3-3-3-3-3-3-1</nve-tree-node>\n <nve-tree-node>node 1-3-3-3-3-3-3-3-3-2</nve-tree-node>\n <nve-tree-node>node 1-3-3-3-3-3-3-3-3-3</nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n </nve-tree-node>\n <nve-tree-node expanded>\n node 2\n <nve-tree-node>node 2-1</nve-tree-node>\n <nve-tree-node>node 2-2</nve-tree-node>\n <nve-tree-node>node 2-3</nve-tree-node>\n </nve-tree-node>\n </nve-tree>\n </div>\n `\n};\n\n/**\n * @summary Tree with bulk node creation for performance testing, verifying efficient handling of large numbers of nodes and dynamic expansion.\n * @tags test-case performance\n */\nexport const BulkCreation = {\n render: () => html`\n <nve-tree>\n <nve-tree-node id=\"root\" expandable>Test</nve-tree-node>\n </nve-tree>\n <script type=\"module\">\n const rootEl = document.querySelector('nve-tree-node#root');\n\n rootEl.addEventListener('open', () => {\n const fragment = document.createDocumentFragment();\n for (let i = 0; i < 400; i++) {\n rootEl.expanded = true;\n const childEl = document.createElement('nve-tree-node');\n childEl.innerText = 'Child ' + i;\n fragment.append(childEl);\n }\n rootEl.append(fragment);\n });\n\n rootEl.addEventListener('close', () => {\n rootEl.expanded = false;\n rootEl.replaceChildren(document.createTextNode('Test'));\n });\n </script>\n `\n};\n\n/**\n * @summary Examples of invalid tree usage patterns for testing and documentation purposes, showing what not to do when implementing trees.\n * @tags anti-pattern\n */\nexport const Audit = {\n render: () => html`\n <div>\n <nve-tree-node>node</nve-tree-node>\n </div>\n `\n};\n\nexport class TestDynamicTree extends LitElement {\n @state() nodes = createTree();\n\n render() {\n return html`\n <p nve-text=\"body\">total nodes: 10,000</p>\n <nve-tree border expandable>\n ${this.nodes.map(node => this.#getNodeList(node))}\n </nve-tree>`;\n }\n\n #getNodeList(node) {\n return html`<nve-tree-node .expandable=${node.nodes.length} .expanded=${node.expanded} @open=${e => this.#open(e, node)} @close=${e => this.#close(e, node)}>\n ${node.label} node\n ${node.expanded ? node.nodes.map(n => html`${this.#getNodeList(n)}`) : nothing}\n </nve-tree-node>`\n }\n\n #open(e, node) {\n e.stopPropagation();\n node.expanded = true;\n this.nodes = [...this.nodes];\n this.requestUpdate();\n }\n\n #close(e, node) {\n e.stopPropagation();\n node.expanded = false;\n this.nodes = [...this.nodes];\n this.requestUpdate();\n }\n}\n\n/** generates a tree with 10 nodes with 4 layers */\nfunction createTree() {\n return createNodeList(10).map(i => {\n i.nodes = createNodeList(10);\n i.nodes.forEach(j => {\n j.nodes = createNodeList(10);\n j.nodes.forEach(k => {\n k.nodes = createNodeList(10);\n })\n })\n return i;\n });\n}\n\nfunction createNodeList(nodes: number) {\n return new Array(nodes).fill('').map((_, i) => ({ label: `${i}`, expanded: false, nodes: [] }));\n}\n\ncustomElements.get('test-dynamic-tree') || customElements.define('test-dynamic-tree', TestDynamicTree);"],"mappings":";AAGA,IAAA,IAAe"}
@@ -4,7 +4,7 @@ import { appendRootNodeStyle as n } from "../internal/utils/dom.js";
4
4
  import { keyNavigationList as r } from "../internal/controllers/keynav-list.controller.js";
5
5
  import { attachInternals as i } from "../internal/utils/a11y.js";
6
6
  import { useStyles as a } from "../internal/styles/index.js";
7
- import o from "../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorate.js";
7
+ import o from "../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorate.js";
8
8
  import { updateNodeSelection as s } from "./utils.js";
9
9
  import { TreeNode as c } from "./tree-node2.js";
10
10
  import l from "./tree.js";
@@ -22,7 +22,7 @@ var m = class extends d {
22
22
  static {
23
23
  this.metadata = {
24
24
  tag: "nve-tree",
25
- version: "2.7.3",
25
+ version: "2.8.1",
26
26
  children: ["nve-tree-node"]
27
27
  };
28
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tree2.js","names":["#observers","#syncNodes","#syncNodeOptions","#syncNodeSelections"],"sources":["../../src/tree/tree.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 type { KeynavListConfig } from '@nvidia-elements/core/internal';\nimport {\n appendRootNodeStyle,\n attachInternals,\n audit,\n keyNavigationList,\n onChildListMutation,\n useStyles\n} from '@nvidia-elements/core/internal';\nimport { updateNodeSelection } from './utils.js';\nimport { TreeNode } from './tree-node.js';\nimport styles from './tree.css?inline';\nimport globalStyles from './tree.global.css?inline';\n\n/**\n * @element nve-tree\n * @description A tree view widget presents a hierarchical list. Any item in the hierarchy may have child items, and items that have children can expand or collapse to show or hide the children.\n * @documentation https://nvidia.github.io/elements/docs/elements/tree/\n * @since 1.2.0\n * @entrypoint \\@nvidia-elements/core/tree\n * @slot - tree nodes\n * @cssprop --max-width\n * @cssprop --node-border - Border style for tree node depth indicator\n * @event open - Dispatched from a child nve-tree-node when opened.\n * @event close - Dispatched from a child nve-tree-node when closed.\n * @event select - Dispatched from a child nve-tree-node when its selection state changes.\n * @aria https://www.w3.org/WAI/ARIA/apg/patterns/treeview/\n *\n */\n@audit()\n@keyNavigationList<Tree>()\nexport class Tree extends LitElement {\n /**\n * Determines whether all nodes can be in a selected state. Nodes can be in a single or multi select state.\n */\n @property({ type: String }) selectable: 'single' | 'multi';\n\n /**\n * Determines whether the tree nodes should handle auto-expanding behavior.\n */\n @property({ type: Boolean, attribute: 'behavior-expand' }) behaviorExpand = false;\n\n /**\n * Determines whether the tree nodes should handle auto-select behavior.\n */\n @property({ type: Boolean, attribute: 'behavior-select' }) behaviorSelect = false;\n\n /**\n * Determines if the node depth border renders.\n */\n @property({ type: Boolean, reflect: true }) border = false;\n\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-tree',\n version: '0.0.0',\n children: ['nve-tree-node']\n };\n\n _internals: ElementInternals;\n\n get nodes() {\n return Array.from(this.querySelectorAll<TreeNode>(TreeNode.metadata.tag));\n }\n\n /** @private */\n get keynavListConfig(): KeynavListConfig {\n return {\n items: this.openNodes\n .map(node => node.shadowRoot!.querySelector('[part=\"_node-header\"]'))\n .filter((el): el is HTMLElement => el !== null),\n layout: 'vertical'\n };\n }\n\n /** @private */\n get openNodes(): TreeNode[] {\n return this.nodes.filter(\n node => node.expanded || (node.parentNode as TreeNode).expanded || (node.parentNode as Tree) === this\n );\n }\n\n render() {\n return html`\n <div internal-host>\n <slot name=\"nodes\"></slot>\n </div>\n `;\n }\n\n #observers: MutationObserver[] = [];\n\n connectedCallback() {\n super.connectedCallback();\n attachInternals(this);\n appendRootNodeStyle(this, globalStyles);\n this._internals.role = 'tree';\n\n this.#observers.push(\n onChildListMutation(\n this,\n () => {\n this.#syncNodes();\n },\n { subtree: true }\n )\n );\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.#observers.forEach(o => o.disconnect());\n }\n\n async updated(props: PropertyValues<this>) {\n super.updated(props);\n await this.updateComplete;\n this.#syncNodes();\n }\n\n #syncNodes() {\n this.#syncNodeOptions();\n this.#syncNodeSelections();\n }\n\n #syncNodeOptions() {\n this.nodes.forEach(node => {\n node.selectable = this.selectable;\n node.behaviorExpand = this.behaviorExpand;\n node.behaviorSelect = this.behaviorSelect;\n });\n }\n\n #syncNodeSelections() {\n if (this.behaviorSelect && this.selectable === 'multi') {\n this.nodes.forEach(node => updateNodeSelection(node));\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAqCO,IAAA,IAAA,cAAmB,EAAW;;qCASyC,0BAKA,kBAKvB,cAyCpB,CAAC;;;gBAvClB,EAAU,CAAC,CAAM,CAAC;;;kBAEP;GACzB,KAAK;GACL,SAAS;GACT,UAAU,CAAC,eAAe;EAC5B;;CAIA,IAAI,QAAQ;EACV,OAAO,MAAM,KAAK,KAAK,iBAA2B,EAAS,SAAS,GAAG,CAAC;CAC1E;CAGA,IAAI,mBAAqC;EACvC,OAAO;GACL,OAAO,KAAK,UACT,KAAI,MAAQ,EAAK,WAAY,cAAc,yBAAuB,CAAC,CAAC,CACpE,QAAQ,MAA0B,MAAO,IAAI;GAChD,QAAQ;EACV;CACF;CAGA,IAAI,YAAwB;EAC1B,OAAO,KAAK,MAAM,QAChB,MAAQ,EAAK,YAAa,EAAK,WAAwB,YAAa,EAAK,eAAwB,IACnG;CACF;CAEA,SAAS;EACP,OAAO,CAAI;CAKb;CAEA;CAEA,oBAAoB;EAMlB,AALA,MAAM,kBAAkB,GACxB,EAAgB,IAAI,GACpB,EAAoB,MAAM,CAAY,GACtC,KAAK,WAAW,OAAO,QAEvB,KAAKA,GAAW,KACd,EACE,YACM;GACJ,KAAKC,GAAW;EAClB,GACA,EAAE,SAAS,GAAK,CAClB,CACF;CACF;CAEA,uBAAuB;EAErB,AADA,MAAM,qBAAqB,GAC3B,KAAKD,GAAW,SAAQ,MAAK,EAAE,WAAW,CAAC;CAC7C;CAEA,MAAM,QAAQ,GAA6B;EAGzC,AAFA,MAAM,QAAQ,CAAK,GACnB,MAAM,KAAK,gBACX,KAAKC,GAAW;CAClB;CAEA,KAAa;EAEX,AADA,KAAKC,GAAiB,GACtB,KAAKC,GAAoB;CAC3B;CAEA,KAAmB;EACjB,KAAK,MAAM,SAAQ,MAAQ;GAGzB,AAFA,EAAK,aAAa,KAAK,YACvB,EAAK,iBAAiB,KAAK,gBAC3B,EAAK,iBAAiB,KAAK;EAC7B,CAAC;CACH;CAEA,KAAsB;EACpB,AAAI,KAAK,kBAAkB,KAAK,eAAe,WAC7C,KAAK,MAAM,SAAQ,MAAQ,EAAoB,CAAI,CAAC;CAExD;AACF;GAxGG,EAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,EAAA,WAAA,cAAA,KAAA,CAAA,MAKzB,EAAS;CAAE,MAAM;CAAS,WAAW;AAAkB,CAAC,CAAA,GAAA,EAAA,WAAA,kBAAA,KAAA,CAAA,MAKxD,EAAS;CAAE,MAAM;CAAS,WAAW;AAAkB,CAAC,CAAA,GAAA,EAAA,WAAA,kBAAA,KAAA,CAAA,MAKxD,EAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,UAAA,KAAA,CAAA,UArB3C,EAAM,GACN,EAAwB,CAAA,GAAA,CAAA"}
1
+ {"version":3,"file":"tree2.js","names":[],"sources":["../../src/tree/tree.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 type { KeynavListConfig } from '@nvidia-elements/core/internal';\nimport {\n appendRootNodeStyle,\n attachInternals,\n audit,\n keyNavigationList,\n onChildListMutation,\n useStyles\n} from '@nvidia-elements/core/internal';\nimport { updateNodeSelection } from './utils.js';\nimport { TreeNode } from './tree-node.js';\nimport styles from './tree.css?inline';\nimport globalStyles from './tree.global.css?inline';\n\n/**\n * @element nve-tree\n * @description A tree view widget presents a hierarchical list. Any item in the hierarchy may have child items, and items that have children can expand or collapse to show or hide the children.\n * @documentation https://nvidia.github.io/elements/docs/elements/tree/\n * @since 1.2.0\n * @entrypoint \\@nvidia-elements/core/tree\n * @slot - tree nodes\n * @cssprop --max-width\n * @cssprop --node-border - Border style for tree node depth indicator\n * @event open - Dispatched from a child nve-tree-node when opened.\n * @event close - Dispatched from a child nve-tree-node when closed.\n * @event select - Dispatched from a child nve-tree-node when its selection state changes.\n * @aria https://www.w3.org/WAI/ARIA/apg/patterns/treeview/\n *\n */\n@audit()\n@keyNavigationList<Tree>()\nexport class Tree extends LitElement {\n /**\n * Determines whether all nodes can be in a selected state. Nodes can be in a single or multi select state.\n */\n @property({ type: String }) selectable: 'single' | 'multi';\n\n /**\n * Determines whether the tree nodes should handle auto-expanding behavior.\n */\n @property({ type: Boolean, attribute: 'behavior-expand' }) behaviorExpand = false;\n\n /**\n * Determines whether the tree nodes should handle auto-select behavior.\n */\n @property({ type: Boolean, attribute: 'behavior-select' }) behaviorSelect = false;\n\n /**\n * Determines if the node depth border renders.\n */\n @property({ type: Boolean, reflect: true }) border = false;\n\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-tree',\n version: '0.0.0',\n children: ['nve-tree-node']\n };\n\n _internals: ElementInternals;\n\n get nodes() {\n return Array.from(this.querySelectorAll<TreeNode>(TreeNode.metadata.tag));\n }\n\n /** @private */\n get keynavListConfig(): KeynavListConfig {\n return {\n items: this.openNodes\n .map(node => node.shadowRoot!.querySelector('[part=\"_node-header\"]'))\n .filter((el): el is HTMLElement => el !== null),\n layout: 'vertical'\n };\n }\n\n /** @private */\n get openNodes(): TreeNode[] {\n return this.nodes.filter(\n node => node.expanded || (node.parentNode as TreeNode).expanded || (node.parentNode as Tree) === this\n );\n }\n\n render() {\n return html`\n <div internal-host>\n <slot name=\"nodes\"></slot>\n </div>\n `;\n }\n\n #observers: MutationObserver[] = [];\n\n connectedCallback() {\n super.connectedCallback();\n attachInternals(this);\n appendRootNodeStyle(this, globalStyles);\n this._internals.role = 'tree';\n\n this.#observers.push(\n onChildListMutation(\n this,\n () => {\n this.#syncNodes();\n },\n { subtree: true }\n )\n );\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.#observers.forEach(o => o.disconnect());\n }\n\n async updated(props: PropertyValues<this>) {\n super.updated(props);\n await this.updateComplete;\n this.#syncNodes();\n }\n\n #syncNodes() {\n this.#syncNodeOptions();\n this.#syncNodeSelections();\n }\n\n #syncNodeOptions() {\n this.nodes.forEach(node => {\n node.selectable = this.selectable;\n node.behaviorExpand = this.behaviorExpand;\n node.behaviorSelect = this.behaviorSelect;\n });\n }\n\n #syncNodeSelections() {\n if (this.behaviorSelect && this.selectable === 'multi') {\n this.nodes.forEach(node => updateNodeSelection(node));\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAqCO,IAAM,IAAN,cAAmB,EAAW;;EA4DF,aAnD2C,KAAA,iBAAA,IAKA,KAAA,iBAAA,IAKvB,KAAA,SAAA,IAyCpB,KAAA,KAAA,CAAC;;;EAvClB,KAAA,SAAA,EAAU,CAAC,CAAM,CAAC;;;EAEP,KAAA,WAAA;GACzB,KAAK;GACL,SAAS;GACT,UAAU,CAAC,eAAe;EAC5B;;CAIA,IAAI,QAAQ;EACV,OAAO,MAAM,KAAK,KAAK,iBAA2B,EAAS,SAAS,GAAG,CAAC;CAC1E;CAGA,IAAI,mBAAqC;EACvC,OAAO;GACL,OAAO,KAAK,UACT,KAAI,MAAQ,EAAK,WAAY,cAAc,yBAAuB,CAAC,CAAC,CACpE,QAAQ,MAA0B,MAAO,IAAI;GAChD,QAAQ;EACV;CACF;CAGA,IAAI,YAAwB;EAC1B,OAAO,KAAK,MAAM,QAChB,MAAQ,EAAK,YAAa,EAAK,WAAwB,YAAa,EAAK,eAAwB,IACnG;CACF;CAEA,SAAS;EACP,OAAO,CAAI;CAKb;CAEA;CAEA,oBAAoB;EAMlB,AALA,MAAM,kBAAkB,GACxB,EAAgB,IAAI,GACpB,EAAoB,MAAM,CAAY,GACtC,KAAK,WAAW,OAAO,QAEvB,KAAK,GAAW,KACd,EACE,YACM;GACJ,KAAK,GAAW;EAClB,GACA,EAAE,SAAS,GAAK,CAClB,CACF;CACF;CAEA,uBAAuB;EAErB,AADA,MAAM,qBAAqB,GAC3B,KAAK,GAAW,SAAQ,MAAK,EAAE,WAAW,CAAC;CAC7C;CAEA,MAAM,QAAQ,GAA6B;EAGzC,AAFA,MAAM,QAAQ,CAAK,GACnB,MAAM,KAAK,gBACX,KAAK,GAAW;CAClB;CAEA,KAAa;EAEX,AADA,KAAK,GAAiB,GACtB,KAAK,GAAoB;CAC3B;CAEA,KAAmB;EACjB,KAAK,MAAM,SAAQ,MAAQ;GAGzB,AAFA,EAAK,aAAa,KAAK,YACvB,EAAK,iBAAiB,KAAK,gBAC3B,EAAK,iBAAiB,KAAK;EAC7B,CAAC;CACH;CAEA,KAAsB;EACpB,AAAI,KAAK,kBAAkB,KAAK,eAAe,WAC7C,KAAK,MAAM,SAAQ,MAAQ,EAAoB,CAAI,CAAC;CAExD;AACF;AAxGG,EAAA,CAAA,EAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,EAAA,WAAA,cAAA,KAAA,CAAA,GAKzB,EAAA,CAAA,EAAS;CAAE,MAAM;CAAS,WAAW;AAAkB,CAAC,CAAA,GAAA,EAAA,WAAA,kBAAA,KAAA,CAAA,GAKxD,EAAA,CAAA,EAAS;CAAE,MAAM;CAAS,WAAW;AAAkB,CAAC,CAAA,GAAA,EAAA,WAAA,kBAAA,KAAA,CAAA,GAKxD,EAAA,CAAA,EAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,UAAA,KAAA,CAAA,GArB3C,IAAA,EAAA,CAAA,EAAM,GACN,EAAwB,CAAA,GAAA,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import { scopedRegistry as e } from "../internal/decorators/scoped-registry.js";
2
2
  import { useStyles as t } from "../internal/styles/index.js";
3
- import n from "../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorate.js";
3
+ import n from "../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorate.js";
4
4
  import { Control as r } from "../forms/control/control2.js";
5
5
  import { IconButton as i } from "../icon-button/icon-button2.js";
6
6
  import { inputStyles as a } from "../input/input2.js";
@@ -19,7 +19,7 @@ var l = class extends r {
19
19
  static {
20
20
  this.metadata = {
21
21
  tag: "nve-week",
22
- version: "2.7.3"
22
+ version: "2.8.1"
23
23
  };
24
24
  }
25
25
  static {
@@ -1 +1 @@
1
- {"version":3,"file":"week2.js","names":[],"sources":["../../src/week/week.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport type { ContainerElement } from '@nvidia-elements/core/internal';\nimport { scopedRegistry, useStyles } from '@nvidia-elements/core/internal';\nimport { Control } from '@nvidia-elements/core/forms';\nimport { IconButton } from '@nvidia-elements/core/icon-button';\nimport { inputStyles } from '@nvidia-elements/core/input';\nimport styles from './week.css?inline';\n\n/**\n * @element nve-week\n * @description A week picker is a control that enables users to choose a week value.\n * @documentation https://nvidia.github.io/elements/docs/elements/week/\n * @since 0.3.0\n * @entrypoint \\@nvidia-elements/core/week\n * @cssprop --padding\n * @cssprop --font-size\n * @cssprop --height\n * @cssprop --background\n * @cssprop --border-radius\n * @cssprop --border\n * @cssprop --cursor\n * @csspart icon-button - The calendar icon button element\n * @aria https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/week\n */\n@scopedRegistry()\nexport class Week extends Control implements ContainerElement {\n /**\n * Reduces the visual container for a minimal borderless appearance while preserving whitespace bounds.\n * Use when embedding within another container such as a toolbar.\n */\n @property({ type: String, reflect: true }) container?: 'flat';\n\n static styles = useStyles([...Control.styles, inputStyles, styles]);\n\n static readonly metadata = {\n tag: 'nve-week',\n version: '0.0.0'\n };\n\n static elementDefinitions = {\n [IconButton.metadata.tag]: IconButton\n };\n\n protected get suffixContent() {\n return html`<nve-icon-button exportparts=\"icon:icon-button-icon\" part=\"icon-button\" .ariaLabel=${this.i18n.expand} icon-name=\"calendar\" container=\"inline\" @click=${this.showPicker}></nve-icon-button>`;\n }\n}\n"],"mappings":";;;;;;;;;;AA6BO,IAAA,IAAA,cAAmB,EAAoC;;gBAO5C,EAAU;GAAC,GAAG,EAAQ;GAAQ;GAAa;EAAM,CAAC;;;kBAEvC;GACzB,KAAK;GACL,SAAS;EACX;;;4BAE4B,GACzB,EAAW,SAAS,MAAM,EAC7B;;CAEA,IAAc,gBAAgB;EAC5B,OAAO,CAAI,uFAAsF,KAAK,KAAK,OAAO,oDAAkD,KAAK,WAAW;CACtL;AACF;GAhBG,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,aAAA,KAAA,CAAA,UAN1C,EAAe,CAAA,GAAA,CAAA"}
1
+ {"version":3,"file":"week2.js","names":[],"sources":["../../src/week/week.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport type { ContainerElement } from '@nvidia-elements/core/internal';\nimport { scopedRegistry, useStyles } from '@nvidia-elements/core/internal';\nimport { Control } from '@nvidia-elements/core/forms';\nimport { IconButton } from '@nvidia-elements/core/icon-button';\nimport { inputStyles } from '@nvidia-elements/core/input';\nimport styles from './week.css?inline';\n\n/**\n * @element nve-week\n * @description A week picker is a control that enables users to choose a week value.\n * @documentation https://nvidia.github.io/elements/docs/elements/week/\n * @since 0.3.0\n * @entrypoint \\@nvidia-elements/core/week\n * @cssprop --padding\n * @cssprop --font-size\n * @cssprop --height\n * @cssprop --background\n * @cssprop --border-radius\n * @cssprop --border\n * @cssprop --cursor\n * @csspart icon-button - The calendar icon button element\n * @aria https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/week\n */\n@scopedRegistry()\nexport class Week extends Control implements ContainerElement {\n /**\n * Reduces the visual container for a minimal borderless appearance while preserving whitespace bounds.\n * Use when embedding within another container such as a toolbar.\n */\n @property({ type: String, reflect: true }) container?: 'flat';\n\n static styles = useStyles([...Control.styles, inputStyles, styles]);\n\n static readonly metadata = {\n tag: 'nve-week',\n version: '0.0.0'\n };\n\n static elementDefinitions = {\n [IconButton.metadata.tag]: IconButton\n };\n\n protected get suffixContent() {\n return html`<nve-icon-button exportparts=\"icon:icon-button-icon\" part=\"icon-button\" .ariaLabel=${this.i18n.expand} icon-name=\"calendar\" container=\"inline\" @click=${this.showPicker}></nve-icon-button>`;\n }\n}\n"],"mappings":";;;;;;;;;;AA6BO,IAAM,IAAN,cAAmB,EAAoC;;EAO5C,KAAA,SAAA,EAAU;GAAC,GAAG,EAAQ;GAAQ;GAAa;EAAM,CAAC;;;EAEvC,KAAA,WAAA;GACzB,KAAK;GACL,SAAS;EACX;;;EAE4B,KAAA,qBAAA,GACzB,EAAW,SAAS,MAAM,EAC7B;;CAEA,IAAc,gBAAgB;EAC5B,OAAO,CAAI,uFAAsF,KAAK,KAAK,OAAO,oDAAkD,KAAK,WAAW;CACtL;AACF;AAhBG,EAAA,CAAA,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,aAAA,KAAA,CAAA,GAN1C,IAAA,EAAA,CAAA,EAAe,CAAA,GAAA,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nvidia-elements/core",
3
- "version": "2.7.3",
3
+ "version": "2.8.1",
4
4
  "release": {
5
5
  "extends": "../../release.config.js"
6
6
  },
@@ -980,24 +980,24 @@
980
980
  "@internals/testing": "0.0.0",
981
981
  "@internals/vite": "0.0.0",
982
982
  "@lit-labs/virtualizer": "2.1.1",
983
- "@nvidia-elements/lint": "2.5.2",
983
+ "@nvidia-elements/lint": "2.7.0",
984
984
  "@nvidia-elements/styles": "^2.1.3",
985
985
  "@typescript/lib-dom": "npm:@types/web@0.0.312",
986
- "@vitest/browser": "4.1.10",
987
- "@vitest/coverage-istanbul": "4.1.10",
986
+ "@vitest/browser": "5.0.0",
987
+ "@vitest/coverage-istanbul": "5.0.0",
988
988
  "axe-core": "4.11.0",
989
- "eslint": "10.8.0",
989
+ "eslint": "10.10.0",
990
990
  "lit": "3.3.3",
991
991
  "lit-analyzer": "2.0.3",
992
992
  "lit-html": "3.3.3",
993
- "publint": "0.3.23",
993
+ "publint": "0.3.24",
994
994
  "stylelint": "17.14.1",
995
995
  "stylelint-config-standard": "40.0.0",
996
- "svgo": "4.0.2",
996
+ "svgo": "4.1.0",
997
997
  "ts-lit-plugin": "2.0.2",
998
998
  "typescript": "6.0.3",
999
- "vite": "8.1.4",
1000
- "vitest": "4.1.10"
999
+ "vite": "8.2.2",
1000
+ "vitest": "5.0.0"
1001
1001
  },
1002
1002
  "wireit": {
1003
1003
  "ci": {