@nvidia-elements/core 2.23.3 → 2.23.5

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 (274) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/accordion/accordion2.js +49 -49
  3. package/dist/accordion/accordion2.js.map +1 -1
  4. package/dist/alert/alert-group2.js +22 -21
  5. package/dist/alert/alert-group2.js.map +1 -1
  6. package/dist/alert/alert2.js +29 -28
  7. package/dist/alert/alert2.js.map +1 -1
  8. package/dist/avatar/avatar-group2.js +9 -9
  9. package/dist/avatar/avatar-group2.js.map +1 -1
  10. package/dist/avatar/avatar2.js +12 -11
  11. package/dist/avatar/avatar2.js.map +1 -1
  12. package/dist/badge/badge2.js +27 -26
  13. package/dist/badge/badge2.js.map +1 -1
  14. package/dist/breadcrumb/breadcrumb2.js +17 -17
  15. package/dist/breadcrumb/breadcrumb2.js.map +1 -1
  16. package/dist/bundles/index.js +6 -6
  17. package/dist/button/button2.js +12 -12
  18. package/dist/button/button2.js.map +1 -1
  19. package/dist/button-group/button-group2.js +18 -18
  20. package/dist/button-group/button-group2.js.map +1 -1
  21. package/dist/card/card2.js +28 -28
  22. package/dist/card/card2.js.map +1 -1
  23. package/dist/chat-message/chat-message2.js +15 -14
  24. package/dist/chat-message/chat-message2.js.map +1 -1
  25. package/dist/checkbox/checkbox-group2.js +8 -8
  26. package/dist/checkbox/checkbox-group2.js.map +1 -1
  27. package/dist/checkbox/checkbox2.js +8 -8
  28. package/dist/checkbox/checkbox2.js.map +1 -1
  29. package/dist/color/color2.js +21 -21
  30. package/dist/color/color2.js.map +1 -1
  31. package/dist/combobox/combobox2.js +37 -37
  32. package/dist/combobox/combobox2.js.map +1 -1
  33. package/dist/copy-button/copy-button.d.ts +1 -1
  34. package/dist/copy-button/copy-button2.js +21 -21
  35. package/dist/copy-button/copy-button2.js.map +1 -1
  36. package/dist/custom-elements.json +0 -76
  37. package/dist/data.snippets.json +27 -27
  38. package/dist/date/date2.js +19 -19
  39. package/dist/date/date2.js.map +1 -1
  40. package/dist/datetime/datetime2.js +19 -19
  41. package/dist/datetime/datetime2.js.map +1 -1
  42. package/dist/dialog/dialog-footer2.js +7 -7
  43. package/dist/dialog/dialog-footer2.js.map +1 -1
  44. package/dist/dialog/dialog-header2.js +7 -7
  45. package/dist/dialog/dialog-header2.js.map +1 -1
  46. package/dist/dialog/dialog.js +1 -1
  47. package/dist/dialog/dialog.js.map +1 -1
  48. package/dist/dialog/dialog2.js +25 -25
  49. package/dist/dialog/dialog2.js.map +1 -1
  50. package/dist/divider/divider2.js +12 -12
  51. package/dist/divider/divider2.js.map +1 -1
  52. package/dist/dot/dot2.js +17 -16
  53. package/dist/dot/dot2.js.map +1 -1
  54. package/dist/drag-handle/drag-handle2.js +12 -12
  55. package/dist/drag-handle/drag-handle2.js.map +1 -1
  56. package/dist/drawer/drawer-content2.js +7 -7
  57. package/dist/drawer/drawer-content2.js.map +1 -1
  58. package/dist/drawer/drawer-footer2.js +7 -7
  59. package/dist/drawer/drawer-footer2.js.map +1 -1
  60. package/dist/drawer/drawer-header2.js +7 -7
  61. package/dist/drawer/drawer-header2.js.map +1 -1
  62. package/dist/drawer/drawer.js +1 -1
  63. package/dist/drawer/drawer.js.map +1 -1
  64. package/dist/drawer/drawer2.js +21 -21
  65. package/dist/drawer/drawer2.js.map +1 -1
  66. package/dist/dropdown/dropdown-footer2.js +7 -7
  67. package/dist/dropdown/dropdown-footer2.js.map +1 -1
  68. package/dist/dropdown/dropdown-header2.js +7 -7
  69. package/dist/dropdown/dropdown-header2.js.map +1 -1
  70. package/dist/dropdown/dropdown2.js +21 -21
  71. package/dist/dropdown/dropdown2.js.map +1 -1
  72. package/dist/dropdown-group/dropdown-group.js +10 -10
  73. package/dist/dropdown-group/dropdown-group.js.map +1 -1
  74. package/dist/dropzone/dropzone2.js +19 -19
  75. package/dist/dropzone/dropzone2.js.map +1 -1
  76. package/dist/file/file2.js +8 -8
  77. package/dist/file/file2.js.map +1 -1
  78. package/dist/format-bytes/format-bytes2.js +13 -13
  79. package/dist/format-bytes/format-bytes2.js.map +1 -1
  80. package/dist/format-datetime/format-datetime2.js +14 -14
  81. package/dist/format-datetime/format-datetime2.js.map +1 -1
  82. package/dist/format-number/format-number2.js +20 -20
  83. package/dist/format-number/format-number2.js.map +1 -1
  84. package/dist/format-relative-time/format-relative-time2.js +11 -11
  85. package/dist/format-relative-time/format-relative-time2.js.map +1 -1
  86. package/dist/format-truncate/format-truncate2.js +21 -21
  87. package/dist/format-truncate/format-truncate2.js.map +1 -1
  88. package/dist/forms/control/control2.js +30 -29
  89. package/dist/forms/control/control2.js.map +1 -1
  90. package/dist/forms/control-group/control-group2.js +19 -18
  91. package/dist/forms/control-group/control-group2.js.map +1 -1
  92. package/dist/forms/control-message/control-message2.js +15 -15
  93. package/dist/forms/control-message/control-message2.js.map +1 -1
  94. package/dist/gauge/gauge2.js +20 -20
  95. package/dist/gauge/gauge2.js.map +1 -1
  96. package/dist/ghost/ghost2.js +10 -10
  97. package/dist/ghost/ghost2.js.map +1 -1
  98. package/dist/grid/cell/cell2.js +9 -9
  99. package/dist/grid/cell/cell2.js.map +1 -1
  100. package/dist/grid/column/column2.js +16 -16
  101. package/dist/grid/column/column2.js.map +1 -1
  102. package/dist/grid/footer/footer2.js +12 -12
  103. package/dist/grid/footer/footer2.js.map +1 -1
  104. package/dist/grid/grid2.js +30 -30
  105. package/dist/grid/grid2.js.map +1 -1
  106. package/dist/grid/header/header2.js +20 -20
  107. package/dist/grid/header/header2.js.map +1 -1
  108. package/dist/grid/placeholder/placeholder2.js +9 -9
  109. package/dist/grid/placeholder/placeholder2.js.map +1 -1
  110. package/dist/grid/row/row2.js +15 -15
  111. package/dist/grid/row/row2.js.map +1 -1
  112. package/dist/icon/icon2.js +40 -40
  113. package/dist/icon/icon2.js.map +1 -1
  114. package/dist/icon-button/icon-button2.js +17 -17
  115. package/dist/icon-button/icon-button2.js.map +1 -1
  116. package/dist/iframe/iframe2.js +7 -7
  117. package/dist/iframe/iframe2.js.map +1 -1
  118. package/dist/index.js +1 -1
  119. package/dist/input/input-group2.js +8 -8
  120. package/dist/input/input-group2.js.map +1 -1
  121. package/dist/input/input2.js +10 -10
  122. package/dist/input/input2.js.map +1 -1
  123. package/dist/internal/controllers/state-expanded.controller.js +1 -1
  124. package/dist/internal/controllers/state-expanded.controller.js.map +1 -1
  125. package/dist/internal/controllers/state-highlighted.controller.js +1 -1
  126. package/dist/internal/controllers/state-highlighted.controller.js.map +1 -1
  127. package/dist/internal/controllers/state-scroll.controller.js +1 -1
  128. package/dist/internal/controllers/state-scroll.controller.js.map +1 -1
  129. package/dist/internal/controllers/state-selected.controller.js +1 -1
  130. package/dist/internal/controllers/state-selected.controller.js.map +1 -1
  131. package/dist/internal/controllers/type-anchor.controller.js +1 -1
  132. package/dist/internal/controllers/type-anchor.controller.js.map +1 -1
  133. package/dist/internal/controllers/type-closable.controller.js +1 -1
  134. package/dist/internal/controllers/type-closable.controller.js.map +1 -1
  135. package/dist/internal/controllers/type-expandable.controller.js +1 -1
  136. package/dist/internal/controllers/type-expandable.controller.js.map +1 -1
  137. package/dist/internal/controllers/type-native-popover.controller.js +6 -6
  138. package/dist/internal/controllers/type-native-popover.controller.js.map +1 -1
  139. package/dist/internal/controllers/type-popover.controller.examples.js.map +1 -1
  140. package/dist/internal/controllers/type-selectable.controller.js +1 -1
  141. package/dist/internal/controllers/type-selectable.controller.js.map +1 -1
  142. package/dist/internal/index.d.ts +0 -1
  143. package/dist/internal/index.js +57 -61
  144. package/dist/internal/index.js.map +1 -1
  145. package/dist/internal/styles/index.d.ts +0 -1
  146. package/dist/internal/styles/index.js +5 -15
  147. package/dist/internal/styles/index.js.map +1 -1
  148. package/dist/internal/utils/a11y.d.ts +0 -3
  149. package/dist/internal/utils/a11y.js +6 -9
  150. package/dist/internal/utils/a11y.js.map +1 -1
  151. package/dist/joystick/joystick2.js +19 -19
  152. package/dist/joystick/joystick2.js.map +1 -1
  153. package/dist/logo/logo2.js +14 -13
  154. package/dist/logo/logo2.js.map +1 -1
  155. package/dist/menu/menu-group2.js +20 -20
  156. package/dist/menu/menu-group2.js.map +1 -1
  157. package/dist/menu/menu-item2.js +11 -11
  158. package/dist/menu/menu-item2.js.map +1 -1
  159. package/dist/menu/menu2.js +14 -14
  160. package/dist/menu/menu2.js.map +1 -1
  161. package/dist/month/month2.js +19 -19
  162. package/dist/month/month2.js.map +1 -1
  163. package/dist/notification/notification-group2.js +13 -13
  164. package/dist/notification/notification-group2.js.map +1 -1
  165. package/dist/notification/notification2.js +31 -31
  166. package/dist/notification/notification2.js.map +1 -1
  167. package/dist/page/page-panel/page-panel-content2.js +7 -7
  168. package/dist/page/page-panel/page-panel-content2.js.map +1 -1
  169. package/dist/page/page-panel/page-panel-footer2.js +9 -9
  170. package/dist/page/page-panel/page-panel-footer2.js.map +1 -1
  171. package/dist/page/page-panel/page-panel-header2.js +9 -9
  172. package/dist/page/page-panel/page-panel-header2.js.map +1 -1
  173. package/dist/page/page-panel/page-panel2.js +15 -15
  174. package/dist/page/page-panel/page-panel2.js.map +1 -1
  175. package/dist/page/page2.js +13 -13
  176. package/dist/page/page2.js.map +1 -1
  177. package/dist/page-header/page-header2.js +10 -10
  178. package/dist/page-header/page-header2.js.map +1 -1
  179. package/dist/page-loader/page-loader2.js +13 -13
  180. package/dist/page-loader/page-loader2.js.map +1 -1
  181. package/dist/pagination/pagination2.js +34 -34
  182. package/dist/pagination/pagination2.js.map +1 -1
  183. package/dist/panel/panel2.js +36 -36
  184. package/dist/panel/panel2.js.map +1 -1
  185. package/dist/password/password2.js +19 -19
  186. package/dist/password/password2.js.map +1 -1
  187. package/dist/preferences-input/preferences-input.d.ts +1 -1
  188. package/dist/preferences-input/preferences-input2.js +25 -25
  189. package/dist/preferences-input/preferences-input2.js.map +1 -1
  190. package/dist/progress-bar/progress-bar2.js +13 -13
  191. package/dist/progress-bar/progress-bar2.js.map +1 -1
  192. package/dist/progress-dot/progress-dot2.js +15 -15
  193. package/dist/progress-dot/progress-dot2.js.map +1 -1
  194. package/dist/progress-ring/progress-ring2.js +20 -20
  195. package/dist/progress-ring/progress-ring2.js.map +1 -1
  196. package/dist/progressive-filter-chip/progressive-filter-chip2.js +28 -28
  197. package/dist/progressive-filter-chip/progressive-filter-chip2.js.map +1 -1
  198. package/dist/pulse/pulse2.js +15 -15
  199. package/dist/pulse/pulse2.js.map +1 -1
  200. package/dist/radio/radio-group2.js +8 -8
  201. package/dist/radio/radio-group2.js.map +1 -1
  202. package/dist/radio/radio2.js +8 -8
  203. package/dist/radio/radio2.js.map +1 -1
  204. package/dist/range/range2.js +16 -16
  205. package/dist/range/range2.js.map +1 -1
  206. package/dist/resize-handle/resize-handle2.js +17 -17
  207. package/dist/resize-handle/resize-handle2.js.map +1 -1
  208. package/dist/search/search2.js +20 -20
  209. package/dist/search/search2.js.map +1 -1
  210. package/dist/select/select2.js +32 -32
  211. package/dist/select/select2.js.map +1 -1
  212. package/dist/skeleton/skeleton2.js +14 -14
  213. package/dist/skeleton/skeleton2.js.map +1 -1
  214. package/dist/sort-button/sort-button.d.ts +1 -1
  215. package/dist/sort-button/sort-button2.js +16 -16
  216. package/dist/sort-button/sort-button2.js.map +1 -1
  217. package/dist/sparkline/sparkline2.js +45 -44
  218. package/dist/sparkline/sparkline2.js.map +1 -1
  219. package/dist/star-rating/star-rating2.js +14 -14
  220. package/dist/star-rating/star-rating2.js.map +1 -1
  221. package/dist/steps/steps2.js +32 -32
  222. package/dist/steps/steps2.js.map +1 -1
  223. package/dist/switch/switch-group2.js +8 -8
  224. package/dist/switch/switch-group2.js.map +1 -1
  225. package/dist/switch/switch2.js +8 -8
  226. package/dist/switch/switch2.js.map +1 -1
  227. package/dist/tabs/tabs-group2.js +18 -18
  228. package/dist/tabs/tabs-group2.js.map +1 -1
  229. package/dist/tabs/tabs-item-group2.js +9 -9
  230. package/dist/tabs/tabs-item-group2.js.map +1 -1
  231. package/dist/tabs/tabs2.js +28 -28
  232. package/dist/tabs/tabs2.js.map +1 -1
  233. package/dist/tag/tag2.js +19 -18
  234. package/dist/tag/tag2.js.map +1 -1
  235. package/dist/textarea/textarea2.js +9 -9
  236. package/dist/textarea/textarea2.js.map +1 -1
  237. package/dist/time/time2.js +19 -19
  238. package/dist/time/time2.js.map +1 -1
  239. package/dist/toast/toast2.js +28 -28
  240. package/dist/toast/toast2.js.map +1 -1
  241. package/dist/toggletip/toggletip-footer2.js +7 -7
  242. package/dist/toggletip/toggletip-footer2.js.map +1 -1
  243. package/dist/toggletip/toggletip-header2.js +7 -7
  244. package/dist/toggletip/toggletip-header2.js.map +1 -1
  245. package/dist/toggletip/toggletip2.js +23 -23
  246. package/dist/toggletip/toggletip2.js.map +1 -1
  247. package/dist/toolbar/toolbar2.js +20 -19
  248. package/dist/toolbar/toolbar2.js.map +1 -1
  249. package/dist/tooltip/tooltip2.js +20 -20
  250. package/dist/tooltip/tooltip2.js.map +1 -1
  251. package/dist/tree/tree-node2.js +39 -39
  252. package/dist/tree/tree-node2.js.map +1 -1
  253. package/dist/tree/tree2.js +20 -20
  254. package/dist/tree/tree2.js.map +1 -1
  255. package/dist/week/week2.js +19 -19
  256. package/dist/week/week2.js.map +1 -1
  257. package/dist/workspace/panel/panel2.js +14 -14
  258. package/dist/workspace/panel/panel2.js.map +1 -1
  259. package/dist/workspace/panel-content/panel-content2.js +7 -7
  260. package/dist/workspace/panel-content/panel-content2.js.map +1 -1
  261. package/dist/workspace/panel-footer/panel-footer2.js +9 -9
  262. package/dist/workspace/panel-footer/panel-footer2.js.map +1 -1
  263. package/dist/workspace/panel-header/panel-header2.js +16 -16
  264. package/dist/workspace/panel-header/panel-header2.js.map +1 -1
  265. package/dist/workspace/workspace2.js +97 -97
  266. package/dist/workspace/workspace2.js.map +1 -1
  267. package/package.json +2 -2
  268. package/dist/internal/decorators/scoped-registry.d.ts +0 -2
  269. package/dist/internal/decorators/scoped-registry.js +0 -36
  270. package/dist/internal/decorators/scoped-registry.js.map +0 -1
  271. package/dist/internal/styles/base.js +0 -5
  272. package/dist/internal/styles/base.js.map +0 -1
  273. package/dist/internal/styles/interaction-state.js +0 -5
  274. package/dist/internal/styles/interaction-state.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"tabs-group2.js","names":["styles","_decorate","__decorate","tabs_group_default","_TabsGroup","TabsGroup","LitElement","_args","#handleDefaultSlotChange","#observeTabs","#syncFromTabs","#handlePanelSlotChange","#syncPanels","#handleCommand","event","value","tabItems","#getTabItems","tabItem","#isSelectableTab","item","#setActiveTab","useStyles","attachInternals","#tabsObserver","changedProperties","props","tabs","#getTabsElement","nextPanelValues","uniqueNonEmptyStrings","selectedTab","#resolveSelectedTab","#commitState","options","changed","nextTab","emitEvent","sameOrderedStringArray","nextSelectedValue","tabMap","#getPanelSlots","#syncPanelSlot","slot","panels","generateId","index","panel","el","element","Tabs","getTabItems","queryAssignedElements","property","state","audit"],"sources":["../../src/tabs/tabs-group.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { PropertyValues } from 'lit';\nimport { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport { queryAssignedElements } from 'lit/decorators/query-assigned-elements.js';\nimport { state } from 'lit/decorators/state.js';\nimport {\n attachInternals,\n audit,\n generateId,\n sameOrderedStringArray,\n uniqueNonEmptyStrings,\n useStyles\n} from '@nvidia-elements/core/internal';\nimport { Tabs, type TabsItem } from './tabs.js';\nimport styles from './tabs-group.css?inline';\nimport { getTabItems } from './utils.js';\n\n/** Invoker command source for `--toggle` (e.g. `nve-tabs-item` with `value`). */\ntype TabsGroupCommandSource = HTMLElement & {\n disabled?: boolean;\n value?: string | null;\n};\n\n/** `command` event from Invoker Commands; `source` is the control that fired. */\ntype TabsGroupCommandEvent = Event & {\n command?: string;\n source?: TabsGroupCommandSource | null;\n};\n\n/** Payload for the composed `select` event when the active tab value changes via command. */\ntype TabsGroupSelectDetail = { value: string };\n\n/** Arranges the tab strip and slot-matched panels: stacked column (`top`), or sidebar row with tabs at inline-start (`start`) or inline-end (`end`). */\nexport type TabsGroupAlignment = 'top' | 'start' | 'end';\n\n/**\n * @element nve-tabs-group\n * @description Coordinates tabs with matching panel content using Invoker Commands and slot-matched panels.\n * @documentation https://nvidia.github.io/elements/docs/elements/tabs/\n * @since 1.67.0\n * @entrypoint \\@nvidia-elements/core/tabs\n * @command --toggle - Select the matching tab and reveal the panel whose slot matches the invoker value.\n * @event select - Dispatched when the selected tab value changes after an invoker `--toggle` updates selection\n * @slot - Default slot for a single nve-tabs element. Do not use behavior-select on nve-tabs when using this group.\n * @slot {value} - Named panel content where the slot name matches a nve-tabs-item value.\n * @cssprop --padding\n * @aria https://www.w3.org/WAI/ARIA/apg/patterns/tabs/\n * @responsive false\n */\n@audit()\nexport class TabsGroup extends LitElement {\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-tabs-group',\n version: '0.0.0',\n children: ['nve-tabs']\n };\n\n /** Options for observing the slotted `nve-tabs` subtree (tab list / item attribute changes). */\n protected static readonly subtreeObserverInit = {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['disabled', 'id', 'selected', 'value']\n } as const satisfies MutationObserverInit;\n\n @queryAssignedElements({ flatten: true }) private defaultSlotElements!: HTMLElement[];\n\n /**\n * Arranges the tab strip relative to slot-matched panels: stacked column (`top`), or sidebar row with tabs at\n * inline-start (`start`) or inline-end (`end`) beside the panel region.\n */\n @property({ type: String, reflect: true }) alignment: TabsGroupAlignment = 'top';\n\n @state() private panelValues: string[] = [];\n\n @state() private selectedValue = '';\n\n /** @private */\n declare _internals: ElementInternals;\n\n #tabsObserver?: MutationObserver;\n\n /**\n * Renders the default slot (single `nve-tabs`) plus one named `<slot name={value}>` per distinct selectable\n * `nve-tabs-item` value. `#syncPanelSlot` applies panel visibility and ARIA from `selectedValue`.\n */\n render() {\n return html`\n <div internal-host>\n <slot @slotchange=${this.#handleDefaultSlotChange}></slot>\n ${this.panelValues.map(value => html`<slot name=${value} @slotchange=${this.#handlePanelSlotChange}></slot>`)}\n </div>\n `;\n }\n\n // --- Lifecycle & command ---\n\n connectedCallback() {\n super.connectedCallback();\n attachInternals(this);\n this._internals.role = 'group';\n this.addEventListener('command', this.#handleCommand as EventListener);\n }\n\n firstUpdated() {\n void this.updateComplete.then(() => {\n if (!this.isConnected) {\n return;\n }\n\n this.#syncFromTabs();\n });\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('command', this.#handleCommand as EventListener);\n this.#tabsObserver?.disconnect();\n }\n\n updated(changedProperties: PropertyValues<this>) {\n super.updated(changedProperties);\n\n if (!this.#tabsObserver) {\n this.#observeTabs();\n }\n\n // `@state()` fields are not in `PropertyValues<this>` keys; cast for membership checks.\n const props = changedProperties as ReadonlyMap<PropertyKey, unknown>;\n if (props.has('panelValues') || props.has('selectedValue')) {\n this.#syncPanels();\n }\n }\n\n #handleDefaultSlotChange = (): void => {\n this.#observeTabs();\n this.#syncFromTabs();\n };\n\n #handlePanelSlotChange = (): void => {\n this.#syncPanels();\n };\n\n /**\n * Handles Invoker `--toggle` on a tab item: selects the matching `nve-tabs-item` and syncs panels.\n * Ignores non-toggle commands and invokers without a non-empty string `value`.\n */\n #handleCommand = (event: TabsGroupCommandEvent): void => {\n if (event.command !== '--toggle') {\n return;\n }\n\n const value = event.source?.value;\n if (typeof value !== 'string' || !value.length) {\n return;\n }\n\n const tabItems = this.#getTabItems();\n const tabItem = tabItems.find(item => this.#isSelectableTab(item) && item.value === value);\n if (!tabItem) {\n return;\n }\n\n this.#setActiveTab(tabItems, tabItem, { emitEvent: true });\n };\n\n // --- Tab strip sync (tabs → state) ---\n\n /** Attaches a single `MutationObserver` on the slotted `nve-tabs` element to mirror tab list changes into state. */\n #observeTabs(): void {\n this.#tabsObserver?.disconnect();\n\n const tabs = this.#getTabsElement();\n if (!tabs) {\n return;\n }\n\n this.#tabsObserver = new MutationObserver(() => this.#syncFromTabs());\n this.#tabsObserver.observe(tabs, TabsGroup.subtreeObserverInit);\n }\n\n /**\n * Reads the current tab items: derives ordered `panelValues` for render, resolves which tab should be active,\n * and commits selection. Called on slot change, subtree mutations, and after mount.\n */\n #syncFromTabs(): void {\n const tabItems = this.#getTabItems();\n const nextPanelValues = uniqueNonEmptyStrings(tabItems.map(item => item.value));\n\n const selectedTab = this.#resolveSelectedTab(tabItems);\n\n if (!selectedTab) {\n tabItems.forEach(item => (item.selected = false));\n this.#commitState(nextPanelValues, '');\n return;\n }\n\n this.#setActiveTab(tabItems, selectedTab, { emitEvent: false, nextPanelValues });\n }\n\n /**\n * Sets exactly one selected tab, updates `panelValues` / `selectedValue`, and optionally dispatches `select`.\n *\n * @param emitEvent - When true (command path), dispatches `select` if selection actually changed.\n */\n #setActiveTab(\n tabItems: TabsItem[],\n nextTab: TabsItem,\n options: { emitEvent: boolean; nextPanelValues?: string[] }\n ): void {\n const { emitEvent } = options;\n const nextPanelValues = options.nextPanelValues ?? uniqueNonEmptyStrings(tabItems.map(item => item.value));\n // True when the effective selection differs from the prior committed state (value, flags, or multi-select).\n // `select` is only dispatched when both `emitEvent` (invoker/command path) and `changed` are true.\n const changed =\n this.selectedValue !== nextTab.value ||\n !nextTab.selected ||\n tabItems.some(item => item !== nextTab && item.selected);\n\n tabItems.forEach(item => {\n item.selected = item === nextTab;\n });\n\n this.#commitState(nextPanelValues, nextTab.value);\n\n if (emitEvent && changed) {\n this.dispatchEvent(\n new CustomEvent<TabsGroupSelectDetail>('select', {\n bubbles: true,\n composed: true,\n detail: { value: nextTab.value }\n })\n );\n }\n }\n\n /** Updates reactive state for panel slot names and the active tab value without touching the tab items. */\n #commitState(nextPanelValues: string[], nextSelectedValue: string): void {\n if (!sameOrderedStringArray(this.panelValues, nextPanelValues)) {\n this.panelValues = nextPanelValues;\n }\n\n if (this.selectedValue !== nextSelectedValue) {\n this.selectedValue = nextSelectedValue;\n }\n }\n\n // --- Panel sync (state → panels & ARIA) ---\n\n /** For each named panel slot, wires `hidden` and tab↔panel ARIA ids to match `selectedValue`. */\n #syncPanels(): void {\n const tabItems = this.#getTabItems();\n const tabMap = new Map(\n tabItems.filter(item => this.#isSelectableTab(item)).map(item => [item.value, item] satisfies [string, TabsItem])\n );\n\n this.#getPanelSlots().forEach(slot => {\n this.#syncPanelSlot(slot, tabMap);\n });\n }\n\n /**\n * If no selectable tab exists for `slot.name`, hides all assigned nodes. Otherwise shows only the panel(s)\n * for the active value and assigns `role=\"tabpanel\"` / `aria-labelledby` when missing.\n */\n #syncPanelSlot(slot: HTMLSlotElement, tabMap: ReadonlyMap<string, TabsItem>): void {\n const tabItem = tabMap.get(slot.name);\n const panels = slot.assignedElements({ flatten: true }) as HTMLElement[];\n\n if (!tabItem) {\n panels.forEach(panel => {\n panel.hidden = true;\n });\n return;\n }\n\n tabItem.id ||= generateId();\n\n panels.forEach((panel, index) => {\n panel.id ||= generateId();\n\n if (!tabItem.hasAttribute('aria-controls') && index === 0) {\n tabItem.setAttribute('aria-controls', panel.id);\n }\n\n if (!panel.hasAttribute('aria-labelledby')) {\n panel.setAttribute('aria-labelledby', tabItem.id);\n }\n\n if (!panel.hasAttribute('role')) {\n panel.setAttribute('role', 'tabpanel');\n }\n\n const isActive = slot.name === this.selectedValue;\n panel.hidden = !isActive;\n });\n }\n\n // --- DOM queries ---\n\n /** Resolves the single slotted `nve-tabs` (default slot), with a light-DOM fallback for edge timing. */\n #getTabsElement(): Tabs | undefined {\n const el =\n this.defaultSlotElements.find(element => element.localName === Tabs.metadata.tag) ??\n this.querySelector(Tabs.metadata.tag);\n return el instanceof Tabs ? el : undefined;\n }\n\n #getTabItems(): TabsItem[] {\n return getTabItems(Array.from(this.#getTabsElement()?.children ?? []));\n }\n\n #getPanelSlots(): HTMLSlotElement[] {\n return Array.from(this.renderRoot.querySelectorAll<HTMLSlotElement>('slot[name]'));\n }\n\n /** Selectable tabs have a non-empty `value` and are not `disabled`. */\n #isSelectableTab(tabItem: TabsItem): tabItem is TabsItem & { value: string } {\n return typeof tabItem.value === 'string' && tabItem.value.length > 0 && !tabItem.disabled;\n }\n\n /** Prefer the selectable tab that is already selected; otherwise the first selectable tab. */\n #resolveSelectedTab(tabItems: readonly TabsItem[]): TabsItem | undefined {\n return (\n tabItems.find(item => this.#isSelectableTab(item) && item.selected) ??\n tabItems.find(item => this.#isSelectableTab(item))\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"tabs-group2.js","names":["styles","_decorate","__decorate","tabs_group_default","_TabsGroup","TabsGroup","LitElement","_args","#handleDefaultSlotChange","#observeTabs","#syncFromTabs","#handlePanelSlotChange","#syncPanels","#handleCommand","event","value","tabItems","#getTabItems","tabItem","#isSelectableTab","item","#setActiveTab","useStyles","attachInternals","#tabsObserver","changedProperties","props","tabs","#getTabsElement","nextPanelValues","uniqueNonEmptyStrings","selectedTab","#resolveSelectedTab","#commitState","options","changed","nextTab","emitEvent","sameOrderedStringArray","nextSelectedValue","tabMap","#getPanelSlots","#syncPanelSlot","slot","panels","generateId","index","panel","el","element","Tabs","getTabItems","queryAssignedElements","property","state","audit"],"sources":["../../src/tabs/tabs-group.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { PropertyValues } from 'lit';\nimport { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport { queryAssignedElements } from 'lit/decorators/query-assigned-elements.js';\nimport { state } from 'lit/decorators/state.js';\nimport { audit, generateId, sameOrderedStringArray, uniqueNonEmptyStrings } from '@nvidia-elements/core/internal';\nimport { attachInternals } from '@nvidia-elements/foundations/internal/a11y';\nimport { useStyles } from '@nvidia-elements/foundations/internal/styles';\nimport { Tabs, type TabsItem } from './tabs.js';\nimport styles from './tabs-group.css?inline';\nimport { getTabItems } from './utils.js';\n\n/** Invoker command source for `--toggle` (e.g. `nve-tabs-item` with `value`). */\ntype TabsGroupCommandSource = HTMLElement & {\n disabled?: boolean;\n value?: string | null;\n};\n\n/** `command` event from Invoker Commands; `source` is the control that fired. */\ntype TabsGroupCommandEvent = Event & {\n command?: string;\n source?: TabsGroupCommandSource | null;\n};\n\n/** Payload for the composed `select` event when the active tab value changes via command. */\ntype TabsGroupSelectDetail = { value: string };\n\n/** Arranges the tab strip and slot-matched panels: stacked column (`top`), or sidebar row with tabs at inline-start (`start`) or inline-end (`end`). */\nexport type TabsGroupAlignment = 'top' | 'start' | 'end';\n\n/**\n * @element nve-tabs-group\n * @description Coordinates tabs with matching panel content using Invoker Commands and slot-matched panels.\n * @documentation https://nvidia.github.io/elements/docs/elements/tabs/\n * @since 1.67.0\n * @entrypoint \\@nvidia-elements/core/tabs\n * @command --toggle - Select the matching tab and reveal the panel whose slot matches the invoker value.\n * @event select - Dispatched when the selected tab value changes after an invoker `--toggle` updates selection\n * @slot - Default slot for a single nve-tabs element. Do not use behavior-select on nve-tabs when using this group.\n * @slot {value} - Named panel content where the slot name matches a nve-tabs-item value.\n * @cssprop --padding\n * @aria https://www.w3.org/WAI/ARIA/apg/patterns/tabs/\n * @responsive false\n */\n@audit()\nexport class TabsGroup extends LitElement {\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-tabs-group',\n version: '0.0.0',\n children: ['nve-tabs']\n };\n\n /** Options for observing the slotted `nve-tabs` subtree (tab list / item attribute changes). */\n protected static readonly subtreeObserverInit = {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['disabled', 'id', 'selected', 'value']\n } as const satisfies MutationObserverInit;\n\n @queryAssignedElements({ flatten: true }) private defaultSlotElements!: HTMLElement[];\n\n /**\n * Arranges the tab strip relative to slot-matched panels: stacked column (`top`), or sidebar row with tabs at\n * inline-start (`start`) or inline-end (`end`) beside the panel region.\n */\n @property({ type: String, reflect: true }) alignment: TabsGroupAlignment = 'top';\n\n @state() private panelValues: string[] = [];\n\n @state() private selectedValue = '';\n\n /** @private */\n declare _internals: ElementInternals;\n\n #tabsObserver?: MutationObserver;\n\n /**\n * Renders the default slot (single `nve-tabs`) plus one named `<slot name={value}>` per distinct selectable\n * `nve-tabs-item` value. `#syncPanelSlot` applies panel visibility and ARIA from `selectedValue`.\n */\n render() {\n return html`\n <div internal-host>\n <slot @slotchange=${this.#handleDefaultSlotChange}></slot>\n ${this.panelValues.map(value => html`<slot name=${value} @slotchange=${this.#handlePanelSlotChange}></slot>`)}\n </div>\n `;\n }\n\n // --- Lifecycle & command ---\n\n connectedCallback() {\n super.connectedCallback();\n attachInternals(this);\n this._internals.role = 'group';\n this.addEventListener('command', this.#handleCommand as EventListener);\n }\n\n firstUpdated() {\n void this.updateComplete.then(() => {\n if (!this.isConnected) {\n return;\n }\n\n this.#syncFromTabs();\n });\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('command', this.#handleCommand as EventListener);\n this.#tabsObserver?.disconnect();\n }\n\n updated(changedProperties: PropertyValues<this>) {\n super.updated(changedProperties);\n\n if (!this.#tabsObserver) {\n this.#observeTabs();\n }\n\n // `@state()` fields are not in `PropertyValues<this>` keys; cast for membership checks.\n const props = changedProperties as ReadonlyMap<PropertyKey, unknown>;\n if (props.has('panelValues') || props.has('selectedValue')) {\n this.#syncPanels();\n }\n }\n\n #handleDefaultSlotChange = (): void => {\n this.#observeTabs();\n this.#syncFromTabs();\n };\n\n #handlePanelSlotChange = (): void => {\n this.#syncPanels();\n };\n\n /**\n * Handles Invoker `--toggle` on a tab item: selects the matching `nve-tabs-item` and syncs panels.\n * Ignores non-toggle commands and invokers without a non-empty string `value`.\n */\n #handleCommand = (event: TabsGroupCommandEvent): void => {\n if (event.command !== '--toggle') {\n return;\n }\n\n const value = event.source?.value;\n if (typeof value !== 'string' || !value.length) {\n return;\n }\n\n const tabItems = this.#getTabItems();\n const tabItem = tabItems.find(item => this.#isSelectableTab(item) && item.value === value);\n if (!tabItem) {\n return;\n }\n\n this.#setActiveTab(tabItems, tabItem, { emitEvent: true });\n };\n\n // --- Tab strip sync (tabs → state) ---\n\n /** Attaches a single `MutationObserver` on the slotted `nve-tabs` element to mirror tab list changes into state. */\n #observeTabs(): void {\n this.#tabsObserver?.disconnect();\n\n const tabs = this.#getTabsElement();\n if (!tabs) {\n return;\n }\n\n this.#tabsObserver = new MutationObserver(() => this.#syncFromTabs());\n this.#tabsObserver.observe(tabs, TabsGroup.subtreeObserverInit);\n }\n\n /**\n * Reads the current tab items: derives ordered `panelValues` for render, resolves which tab should be active,\n * and commits selection. Called on slot change, subtree mutations, and after mount.\n */\n #syncFromTabs(): void {\n const tabItems = this.#getTabItems();\n const nextPanelValues = uniqueNonEmptyStrings(tabItems.map(item => item.value));\n\n const selectedTab = this.#resolveSelectedTab(tabItems);\n\n if (!selectedTab) {\n tabItems.forEach(item => (item.selected = false));\n this.#commitState(nextPanelValues, '');\n return;\n }\n\n this.#setActiveTab(tabItems, selectedTab, { emitEvent: false, nextPanelValues });\n }\n\n /**\n * Sets exactly one selected tab, updates `panelValues` / `selectedValue`, and optionally dispatches `select`.\n *\n * @param emitEvent - When true (command path), dispatches `select` if selection actually changed.\n */\n #setActiveTab(\n tabItems: TabsItem[],\n nextTab: TabsItem,\n options: { emitEvent: boolean; nextPanelValues?: string[] }\n ): void {\n const { emitEvent } = options;\n const nextPanelValues = options.nextPanelValues ?? uniqueNonEmptyStrings(tabItems.map(item => item.value));\n // True when the effective selection differs from the prior committed state (value, flags, or multi-select).\n // `select` is only dispatched when both `emitEvent` (invoker/command path) and `changed` are true.\n const changed =\n this.selectedValue !== nextTab.value ||\n !nextTab.selected ||\n tabItems.some(item => item !== nextTab && item.selected);\n\n tabItems.forEach(item => {\n item.selected = item === nextTab;\n });\n\n this.#commitState(nextPanelValues, nextTab.value);\n\n if (emitEvent && changed) {\n this.dispatchEvent(\n new CustomEvent<TabsGroupSelectDetail>('select', {\n bubbles: true,\n composed: true,\n detail: { value: nextTab.value }\n })\n );\n }\n }\n\n /** Updates reactive state for panel slot names and the active tab value without touching the tab items. */\n #commitState(nextPanelValues: string[], nextSelectedValue: string): void {\n if (!sameOrderedStringArray(this.panelValues, nextPanelValues)) {\n this.panelValues = nextPanelValues;\n }\n\n if (this.selectedValue !== nextSelectedValue) {\n this.selectedValue = nextSelectedValue;\n }\n }\n\n // --- Panel sync (state → panels & ARIA) ---\n\n /** For each named panel slot, wires `hidden` and tab↔panel ARIA ids to match `selectedValue`. */\n #syncPanels(): void {\n const tabItems = this.#getTabItems();\n const tabMap = new Map(\n tabItems.filter(item => this.#isSelectableTab(item)).map(item => [item.value, item] satisfies [string, TabsItem])\n );\n\n this.#getPanelSlots().forEach(slot => {\n this.#syncPanelSlot(slot, tabMap);\n });\n }\n\n /**\n * If no selectable tab exists for `slot.name`, hides all assigned nodes. Otherwise shows only the panel(s)\n * for the active value and assigns `role=\"tabpanel\"` / `aria-labelledby` when missing.\n */\n #syncPanelSlot(slot: HTMLSlotElement, tabMap: ReadonlyMap<string, TabsItem>): void {\n const tabItem = tabMap.get(slot.name);\n const panels = slot.assignedElements({ flatten: true }) as HTMLElement[];\n\n if (!tabItem) {\n panels.forEach(panel => {\n panel.hidden = true;\n });\n return;\n }\n\n tabItem.id ||= generateId();\n\n panels.forEach((panel, index) => {\n panel.id ||= generateId();\n\n if (!tabItem.hasAttribute('aria-controls') && index === 0) {\n tabItem.setAttribute('aria-controls', panel.id);\n }\n\n if (!panel.hasAttribute('aria-labelledby')) {\n panel.setAttribute('aria-labelledby', tabItem.id);\n }\n\n if (!panel.hasAttribute('role')) {\n panel.setAttribute('role', 'tabpanel');\n }\n\n const isActive = slot.name === this.selectedValue;\n panel.hidden = !isActive;\n });\n }\n\n // --- DOM queries ---\n\n /** Resolves the single slotted `nve-tabs` (default slot), with a light-DOM fallback for edge timing. */\n #getTabsElement(): Tabs | undefined {\n const el =\n this.defaultSlotElements.find(element => element.localName === Tabs.metadata.tag) ??\n this.querySelector(Tabs.metadata.tag);\n return el instanceof Tabs ? el : undefined;\n }\n\n #getTabItems(): TabsItem[] {\n return getTabItems(Array.from(this.#getTabsElement()?.children ?? []));\n }\n\n #getPanelSlots(): HTMLSlotElement[] {\n return Array.from(this.renderRoot.querySelectorAll<HTMLSlotElement>('slot[name]'));\n }\n\n /** Selectable tabs have a non-empty `value` and are not `disabled`. */\n #isSelectableTab(tabItem: TabsItem): tabItem is TabsItem & { value: string } {\n return typeof tabItem.value === 'string' && tabItem.value.length > 0 && !tabItem.disabled;\n }\n\n /** Prefer the selectable tab that is already selected; otherwise the first selectable tab. */\n #resolveSelectedTab(tabItems: readonly TabsItem[]): TabsItem | undefined {\n return (\n tabItems.find(item => this.#isSelectableTab(item) && item.selected) ??\n tabItems.find(item => this.#isSelectableTab(item))\n );\n }\n}\n"],"mappings":"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"}
@@ -1,33 +1,33 @@
1
1
  import { audit as e } from "../internal/controllers/audit.controller.js";
2
- import { useStyles as t } from "../internal/styles/index.js";
3
- import n from "../_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/decorate.js";
4
- import r from "./tabs-item-group.js";
5
- import { LitElement as i, html as a, nothing as o } from "lit";
2
+ import t from "../_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/decorate.js";
3
+ import n from "./tabs-item-group.js";
4
+ import { LitElement as r, html as i, nothing as a } from "lit";
5
+ import { useStyles as o } from "@nvidia-elements/foundations/internal/styles";
6
6
  import { state as s } from "lit/decorators/state.js";
7
7
  // src/tabs/tabs-item-group.ts
8
- var c = class extends i {
8
+ var c = class extends r {
9
9
  constructor(...e) {
10
10
  super(...e), this.accessoryTabEnabled = !0;
11
11
  }
12
12
  static {
13
- this.styles = t([r]);
13
+ this.styles = o([n]);
14
14
  }
15
15
  static {
16
16
  this.metadata = {
17
17
  tag: "nve-tabs-item-group",
18
- version: "2.23.3",
18
+ version: "2.23.5",
19
19
  parents: ["nve-tabs"],
20
20
  children: ["nve-tabs-item"]
21
21
  };
22
22
  }
23
23
  render() {
24
- return a`<div internal-host><slot name="prefix" tabindex="${this.accessoryTabEnabled ? o : -1}"></slot><slot></slot><slot name="suffix" tabindex="${this.accessoryTabEnabled ? o : -1}"></slot></div>`;
24
+ return i`<div internal-host><slot name="prefix" tabindex="${this.accessoryTabEnabled ? a : -1}"></slot><slot></slot><slot name="suffix" tabindex="${this.accessoryTabEnabled ? a : -1}"></slot></div>`;
25
25
  }
26
26
  disconnectedCallback() {
27
27
  super.disconnectedCallback(), this.accessoryTabEnabled = !0;
28
28
  }
29
29
  };
30
- n([s()], c.prototype, "accessoryTabEnabled", void 0), c = n([e()], c);
30
+ t([s()], c.prototype, "accessoryTabEnabled", void 0), c = t([e()], c);
31
31
  export { c as TabsItemGroup };
32
32
 
33
33
  //# sourceMappingURL=tabs-item-group2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tabs-item-group2.js","names":["styles","_decorate","__decorate","tabs_item_group_default","TabsItemGroup","LitElement","_args","useStyles","nothing","state","audit"],"sources":["../../src/tabs/tabs-item-group.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 { audit, useStyles } from '@nvidia-elements/core/internal';\nimport styles from './tabs-item-group.css?inline';\n\n/**\n * @element nve-tabs-item-group\n * @description Groups a tab item with application-owned accessory controls.\n * @documentation https://nvidia.github.io/elements/docs/elements/tabs/\n * @since 0.0.0\n * @entrypoint \\@nvidia-elements/core/tabs\n * @slot - A single nve-tabs-item.\n * @slot prefix - Controls before the tab item.\n * @slot suffix - Controls after the tab item.\n * @cssprop --gap - Spacing between the tab item and accessories.\n * @cssprop --height\n * @cssprop --padding\n * @cssprop --width\n * @cssprop --border-radius\n */\n@audit()\nexport class TabsItemGroup extends LitElement {\n /** @private */\n @state() accessoryTabEnabled = true;\n\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-tabs-item-group',\n version: '0.0.0',\n parents: ['nve-tabs'],\n children: ['nve-tabs-item']\n };\n\n render() {\n return html`\n <div internal-host>\n <slot name=\"prefix\" tabindex=${this.accessoryTabEnabled ? nothing : -1}></slot>\n <slot></slot>\n <slot name=\"suffix\" tabindex=${this.accessoryTabEnabled ? nothing : -1}></slot>\n </div>\n `;\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.accessoryTabEnabled = true;\n }\n}\n"],"mappings":";;;;;;;AAwBO,IAAMI,IAAN,cAA4BC,EAAW;;EAEb,A,aAAA,KAAA,sBAAA;;;EAEf,KAAA,SAAAE,EAAU,CAACP,CAAM,CAAC;;;EAEP,KAAA,WAAA;GACzB,KAAK;GACL,SAAS;GACT,SAAS,CAAC,UAAU;GACpB,UAAU,CAAC,eAAe;EAC5B;;CAEA,SAAS;EACP,OAAO,CAAI,oDAEwB,KAAK,sBAAsBQ,IAAU,GAAG,sDAExC,KAAK,sBAAsBA,IAAU,GAAG;CAG7E;CAEA,uBAAuB;EAErB,AADA,MAAM,qBAAqB,GAC3B,KAAK,sBAAsB;CAC7B;AACF;AAzBGP,EAAA,CAAAQ,EAAM,CAAA,GAAAL,EAAA,WAAA,uBAAA,KAAA,CAAA,GAHR,IAAAH,EAAA,CAAAS,EAAM,CAAA,GAAAN,CAAA"}
1
+ {"version":3,"file":"tabs-item-group2.js","names":["styles","_decorate","__decorate","tabs_item_group_default","TabsItemGroup","LitElement","_args","useStyles","nothing","state","audit"],"sources":["../../src/tabs/tabs-item-group.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 { audit } from '@nvidia-elements/core/internal';\nimport { useStyles } from '@nvidia-elements/foundations/internal/styles';\nimport styles from './tabs-item-group.css?inline';\n\n/**\n * @element nve-tabs-item-group\n * @description Groups a tab item with application-owned accessory controls.\n * @documentation https://nvidia.github.io/elements/docs/elements/tabs/\n * @since 0.0.0\n * @entrypoint \\@nvidia-elements/core/tabs\n * @slot - A single nve-tabs-item.\n * @slot prefix - Controls before the tab item.\n * @slot suffix - Controls after the tab item.\n * @cssprop --gap - Spacing between the tab item and accessories.\n * @cssprop --height\n * @cssprop --padding\n * @cssprop --width\n * @cssprop --border-radius\n */\n@audit()\nexport class TabsItemGroup extends LitElement {\n /** @private */\n @state() accessoryTabEnabled = true;\n\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-tabs-item-group',\n version: '0.0.0',\n parents: ['nve-tabs'],\n children: ['nve-tabs-item']\n };\n\n render() {\n return html`\n <div internal-host>\n <slot name=\"prefix\" tabindex=${this.accessoryTabEnabled ? nothing : -1}></slot>\n <slot></slot>\n <slot name=\"suffix\" tabindex=${this.accessoryTabEnabled ? nothing : -1}></slot>\n </div>\n `;\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.accessoryTabEnabled = true;\n }\n}\n"],"mappings":";;;;;;;AAyBO,IAAMI,IAAN,cAA4BC,EAAW;;EAEb,A,aAAA,KAAA,sBAAA;;;EAEf,KAAA,SAAAE,EAAU,CAACP,CAAM,CAAC;;;EAEP,KAAA,WAAA;GACzB,KAAK;GACL,SAAS;GACT,SAAS,CAAC,UAAU;GACpB,UAAU,CAAC,eAAe;EAC5B;;CAEA,SAAS;EACP,OAAO,CAAI,oDAEwB,KAAK,sBAAsBQ,IAAU,GAAG,sDAExC,KAAK,sBAAsBA,IAAU,GAAG;CAG7E;CAEA,uBAAuB;EAErB,AADA,MAAM,qBAAqB,GAC3B,KAAK,sBAAsB;CAC7B;AACF;AAzBGP,EAAA,CAAAQ,EAAM,CAAA,GAAAL,EAAA,WAAA,uBAAA,KAAA,CAAA,GAHR,IAAAH,EAAA,CAAAS,EAAM,CAAA,GAAAN,CAAA"}
@@ -1,32 +1,32 @@
1
1
  import { audit as e } from "../internal/controllers/audit.controller.js";
2
2
  import { appendAnchorName as t, appendRootNodeStyle as n, removeAnchorName as r } from "../internal/utils/dom.js";
3
3
  import { KeyNavigationListController as i } from "../internal/controllers/keynav-list.controller.js";
4
- import { attachInternals as a } from "../internal/utils/a11y.js";
5
- import { stateSelected as o } from "../internal/controllers/state-selected.controller.js";
6
- import { useStyles as s } from "../internal/styles/index.js";
7
- import c from "../_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/decorate.js";
8
- import { getTabItems as l, isTabItemTabbable as u } from "./utils.js";
9
- import d from "./tabs.global.js";
10
- import f from "./tabs-item.js";
11
- import p from "./tabs.js";
12
- import { LitElement as m, html as h } from "lit";
13
- import { property as g } from "lit/decorators/property.js";
4
+ import { stateSelected as a } from "../internal/controllers/state-selected.controller.js";
5
+ import o from "../_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/decorate.js";
6
+ import { getTabItems as s, isTabItemTabbable as c } from "./utils.js";
7
+ import l from "./tabs.global.js";
8
+ import u from "./tabs-item.js";
9
+ import d from "./tabs.js";
10
+ import { attachInternals as f } from "@nvidia-elements/foundations/internal/a11y";
11
+ import { LitElement as p, html as m } from "lit";
12
+ import { property as h } from "lit/decorators/property.js";
13
+ import { useStyles as g } from "@nvidia-elements/foundations/internal/styles";
14
14
  import { ButtonFormControlMixin as _ } from "@nvidia-elements/forms/mixins";
15
15
  import { queryAssignedElements as v } from "lit/decorators/query-assigned-elements.js";
16
16
  // src/tabs/tabs.ts
17
- var y = class extends _(m) {
17
+ var y = class extends _(p) {
18
18
  static {
19
- this.styles = s([f]);
19
+ this.styles = g([u]);
20
20
  }
21
21
  static {
22
22
  this.metadata = {
23
23
  tag: "nve-tabs-item",
24
- version: "2.23.3",
24
+ version: "2.23.5",
25
25
  parents: ["nve-tabs", "nve-tabs-item-group"]
26
26
  };
27
27
  }
28
28
  render() {
29
- return h`<div internal-host focus-within><slot name="prefix"></slot><div id="label"><slot></slot></div><slot name="suffix"></slot></div>`;
29
+ return m`<div internal-host focus-within><slot name="prefix"></slot><div id="label"><slot></slot></div><slot name="suffix"></slot></div>`;
30
30
  }
31
31
  constructor() {
32
32
  super(), this.selected = !1, this.type = "button";
@@ -38,11 +38,11 @@ var y = class extends _(m) {
38
38
  super.updated(e), e.has("selected") && (this.selected ? t(this, "--selected") : r(this, "--selected"));
39
39
  }
40
40
  };
41
- c([g({
41
+ o([h({
42
42
  type: Boolean,
43
43
  reflect: !0
44
- })], y.prototype, "selected", void 0), y = c([e(), o()], y);
45
- var b = class extends m {
44
+ })], y.prototype, "selected", void 0), y = o([e(), a()], y);
45
+ var b = class extends p {
46
46
  constructor(...e) {
47
47
  super(...e), this.vertical = !1, this.borderless = !1, this.behaviorSelect = !1, this.#t = new i(this), this.#n = [], this.#a = (e) => {
48
48
  e.some((e) => e.type === "childList" || e.attributeName === "slot") ? this.#o() : e.some((e) => this.#e.some((t) => t.contains(e.target))) && this.#s();
@@ -60,12 +60,12 @@ var b = class extends m {
60
60
  };
61
61
  }
62
62
  static {
63
- this.styles = s([p]);
63
+ this.styles = g([d]);
64
64
  }
65
65
  static {
66
66
  this.metadata = {
67
67
  tag: "nve-tabs",
68
- version: "2.23.3",
68
+ version: "2.23.5",
69
69
  children: ["nve-tabs-item", "nve-tabs-item-group"]
70
70
  };
71
71
  }
@@ -79,16 +79,16 @@ var b = class extends m {
79
79
  };
80
80
  }
81
81
  get #e() {
82
- return l(this.entries ?? []);
82
+ return s(this.entries ?? []);
83
83
  }
84
84
  #t;
85
85
  #n;
86
86
  #r;
87
87
  render() {
88
- return h`<div internal-host><slot @slotchange="${this.#o}"></slot></div>`;
88
+ return m`<div internal-host><slot @slotchange="${this.#o}"></slot></div>`;
89
89
  }
90
90
  connectedCallback() {
91
- super.connectedCallback(), n(this, d), a(this), this._internals.role = "tablist", this.addEventListener("click", this.#l), this.#i(), this.hasUpdated && this.#s();
91
+ super.connectedCallback(), n(this, l), f(this), this._internals.role = "tablist", this.addEventListener("click", this.#l), this.#i(), this.hasUpdated && this.#s();
92
92
  }
93
93
  disconnectedCallback() {
94
94
  super.disconnectedCallback(), this.removeEventListener("click", this.#l), this.#r?.disconnect();
@@ -115,8 +115,8 @@ var b = class extends m {
115
115
  #o;
116
116
  #s() {
117
117
  this.querySelectorAll(":scope > nve-tabs-item-group").forEach((e) => {
118
- let t = l([e])[0];
119
- e.accessoryTabEnabled = !!t && u(t);
118
+ let t = s([e])[0];
119
+ e.accessoryTabEnabled = !!t && c(t);
120
120
  });
121
121
  }
122
122
  #c(e) {
@@ -124,16 +124,16 @@ var b = class extends m {
124
124
  }
125
125
  #l;
126
126
  };
127
- c([g({
127
+ o([h({
128
128
  type: Boolean,
129
129
  reflect: !0
130
- })], b.prototype, "vertical", void 0), c([g({
130
+ })], b.prototype, "vertical", void 0), o([h({
131
131
  type: Boolean,
132
132
  reflect: !0
133
- })], b.prototype, "borderless", void 0), c([g({
133
+ })], b.prototype, "borderless", void 0), o([h({
134
134
  type: Boolean,
135
135
  attribute: "behavior-select"
136
- })], b.prototype, "behaviorSelect", void 0), c([v()], b.prototype, "entries", void 0), b = c([e()], b);
136
+ })], b.prototype, "behaviorSelect", void 0), o([v()], b.prototype, "entries", void 0), b = o([e()], b);
137
137
  export { b as Tabs, y as TabsItem };
138
138
 
139
139
  //# sourceMappingURL=tabs2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tabs2.js","names":["tabsItemStyleSheet","_decorate","tabsStyleSheet","globalStyles","__decorate","tabs_global_default","tabs_item_default","tabs_default","TabsItem","ButtonFormControlMixin","LitElement","useStyles","props","appendAnchorName","removeAnchorName","property","audit","stateSelected","Tabs","_args","#keynavController","KeyNavigationListController","#knownItems","#syncFromItems","records","record","#syncItems","#items","item","#syncAccessoryTabState","items","index","previousItems","#onClick","path","event","candidate","#selectTab","getTabItems","appendRootNodeStyle","attachInternals","#observeItems","#itemsObserver","group","isTabItemTabbable","tabItem","queryAssignedElements"],"sources":["../../src/tabs/tabs.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 { ButtonFormControlMixin } from '@nvidia-elements/forms/mixins';\nimport type { KeynavListConfig } from '@nvidia-elements/core/internal';\nimport {\n stateSelected,\n useStyles,\n KeyNavigationListController,\n attachInternals,\n audit,\n appendRootNodeStyle,\n appendAnchorName,\n removeAnchorName\n} from '@nvidia-elements/core/internal';\nimport type { TabsItemGroup } from './tabs-item-group.js';\nimport { getTabItems, isTabItemTabbable } from './utils.js';\nimport globalStyles from './tabs.global.css?inline';\nimport tabsItemStyleSheet from './tabs-item.css?inline';\nimport tabsStyleSheet from './tabs.css?inline';\n\n/**\n * @element nve-tabs-item\n * @description Represents an individual tab within a tablist, providing a selectable button for switching between content views.\n * @documentation https://nvidia.github.io/elements/docs/elements/tabs/\n * @since 0.10.0\n * @entrypoint \\@nvidia-elements/core/tabs\n * @slot - The label displayed for the tab.\n * @slot prefix - Decoration before the label.\n * @slot suffix - Supporting content after the label.\n * @cssprop --gap - Spacing between the label and decoration.\n * @cssprop --font-size\n * @cssprop --width\n * @cssprop --padding\n * @cssprop --font-size\n * @cssprop --font-weight\n * @cssprop --border-radius\n * @cssprop --color\n * @cssprop --height\n * @cssprop --cursor\n * @cssprop --text-transform\n * @aria https://www.w3.org/WAI/ARIA/apg/patterns/tabs/\n * @responsive false\n */\n@audit()\n@stateSelected<TabsItem>()\nexport class TabsItem extends ButtonFormControlMixin(LitElement) {\n /**\n * Determines which tab item the user selects, defaults to false.\n */\n @property({ type: Boolean, reflect: true }) selected = false;\n\n static styles = useStyles([tabsItemStyleSheet]);\n\n static readonly metadata = {\n tag: 'nve-tabs-item',\n version: '0.0.0',\n parents: ['nve-tabs', 'nve-tabs-item-group']\n };\n\n render() {\n return html`\n <div internal-host focus-within>\n <slot name=\"prefix\"></slot>\n <div id=\"label\"><slot></slot></div>\n <slot name=\"suffix\"></slot>\n </div>\n `;\n }\n\n constructor() {\n super();\n this.type = 'button';\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._internals.role = 'tab';\n }\n\n updated(props: PropertyValues<this>) {\n super.updated(props);\n\n if (props.has('selected')) {\n if (this.selected) {\n appendAnchorName(this, '--selected');\n } else {\n removeAnchorName(this, '--selected');\n }\n }\n }\n}\n\n/**\n * @element nve-tabs\n * @description Tabs provide a selection UX, typically used for swapping content shown on a page, or within a navigation context.\n * @documentation https://nvidia.github.io/elements/docs/elements/tabs/\n * @since 0.10.0\n * @entrypoint \\@nvidia-elements/core/tabs\n * @slot - default slot for tab-item\n * @cssprop --gap\n * @cssprop --indicator-animation-duration - Duration of selection indicator movement.\n * @cssprop --indicator-background\n * @cssprop --indicator-border-radius\n * @cssprop --indicator-height\n * @cssprop --border-inset\n * @aria https://www.w3.org/WAI/ARIA/apg/patterns/tabs/\n * @responsive false\n */\n@audit()\nexport class Tabs extends LitElement {\n /**\n * Determines whether the tabs should display in a vertical layout vs. defaulting to horizontal.\n */\n @property({ type: Boolean, reflect: true }) vertical = false;\n\n /**\n * Determines whether the tabs should display a border on selected items vs. defaults to show border.\n */\n @property({ type: Boolean, reflect: true }) borderless = false;\n\n /**\n * Determines whether the tabs should handle selection behavior vs. defaults to off.\n */\n @property({ type: Boolean, attribute: 'behavior-select' }) behaviorSelect = false;\n\n static styles = useStyles([tabsStyleSheet]);\n\n static readonly metadata = {\n tag: 'nve-tabs',\n version: '0.0.0',\n children: ['nve-tabs-item', 'nve-tabs-item-group']\n };\n\n /** @private */\n get keynavListConfig(): KeynavListConfig {\n const items = this.#items;\n return {\n items,\n initialItem: items.find(item => item.selected),\n layout: this.vertical ? 'vertical' : 'horizontal',\n dir: getComputedStyle(this).direction\n };\n }\n\n @queryAssignedElements() private entries!: HTMLElement[];\n\n get #items(): TabsItem[] {\n return getTabItems(this.entries ?? []);\n }\n\n #keynavController = new KeyNavigationListController(this);\n #knownItems: TabsItem[] = [];\n #itemsObserver?: MutationObserver;\n\n /** @private */\n declare _internals: ElementInternals;\n\n render() {\n return html`\n <div internal-host>\n <slot @slotchange=${this.#syncItems}></slot>\n </div>\n `;\n }\n\n connectedCallback() {\n super.connectedCallback();\n appendRootNodeStyle(this, globalStyles);\n attachInternals(this);\n this._internals.role = 'tablist';\n this.addEventListener('click', this.#onClick);\n this.#observeItems();\n if (this.hasUpdated) this.#syncAccessoryTabState();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('click', this.#onClick);\n this.#itemsObserver?.disconnect();\n }\n\n firstUpdated() {\n this.#itemsObserver = new MutationObserver(this.#syncFromItems);\n this.#observeItems();\n }\n\n updated(props: PropertyValues<this>) {\n super.updated(props);\n this._internals.ariaOrientation = this.vertical ? 'vertical' : 'horizontal';\n }\n\n #observeItems() {\n this.#itemsObserver?.observe(this, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['tabindex', 'href', 'slot']\n });\n }\n\n #syncFromItems = (records: MutationRecord[]) => {\n if (records.some(record => record.type === 'childList' || record.attributeName === 'slot')) {\n void this.#syncItems();\n } else if (records.some(record => this.#items.some(item => item.contains(record.target)))) {\n this.#syncAccessoryTabState();\n }\n };\n\n #syncItems = async () => {\n const items = this.#items;\n if (items.length === this.#knownItems.length && items.every((item, index) => item === this.#knownItems[index])) {\n this.#syncAccessoryTabState();\n return;\n }\n\n const previousItems = this.#knownItems;\n this.#knownItems = items;\n await Promise.all(items.map(item => item.updateComplete));\n if (items !== this.#knownItems) return;\n\n this.#keynavController.refreshItems(previousItems);\n this.#syncAccessoryTabState();\n };\n\n #syncAccessoryTabState() {\n this.querySelectorAll<TabsItemGroup>(':scope > nve-tabs-item-group').forEach(group => {\n const item = getTabItems([group])[0];\n group.accessoryTabEnabled = !!item && isTabItemTabbable(item);\n });\n }\n\n #selectTab(tabItem: HTMLElement & { matches: Element['matches']; disabled?: boolean; selected?: boolean }) {\n if (!this.behaviorSelect || !tabItem.matches('nve-tabs-item') || tabItem.disabled) {\n return;\n }\n\n this.keynavListConfig.items.forEach((i: HTMLElement) => ((i as TabsItem).selected = false));\n tabItem.selected = true;\n }\n\n #onClick = (event: Event) => {\n const path = event.composedPath();\n const item = this.#items.find(candidate => path.includes(candidate));\n if (item) this.#selectTab(item);\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"tabs2.js","names":["tabsItemStyleSheet","_decorate","tabsStyleSheet","globalStyles","__decorate","tabs_global_default","tabs_item_default","tabs_default","TabsItem","ButtonFormControlMixin","LitElement","useStyles","props","appendAnchorName","removeAnchorName","property","audit","stateSelected","Tabs","_args","#keynavController","KeyNavigationListController","#knownItems","#syncFromItems","records","record","#syncItems","#items","item","#syncAccessoryTabState","items","index","previousItems","#onClick","path","event","candidate","#selectTab","getTabItems","appendRootNodeStyle","attachInternals","#observeItems","#itemsObserver","group","isTabItemTabbable","tabItem","queryAssignedElements"],"sources":["../../src/tabs/tabs.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 { ButtonFormControlMixin } from '@nvidia-elements/forms/mixins';\nimport type { KeynavListConfig } from '@nvidia-elements/core/internal';\nimport {\n stateSelected,\n KeyNavigationListController,\n audit,\n appendRootNodeStyle,\n appendAnchorName,\n removeAnchorName\n} from '@nvidia-elements/core/internal';\nimport { attachInternals } from '@nvidia-elements/foundations/internal/a11y';\nimport { useStyles } from '@nvidia-elements/foundations/internal/styles';\nimport type { TabsItemGroup } from './tabs-item-group.js';\nimport { getTabItems, isTabItemTabbable } from './utils.js';\nimport globalStyles from './tabs.global.css?inline';\nimport tabsItemStyleSheet from './tabs-item.css?inline';\nimport tabsStyleSheet from './tabs.css?inline';\n\n/**\n * @element nve-tabs-item\n * @description Represents an individual tab within a tablist, providing a selectable button for switching between content views.\n * @documentation https://nvidia.github.io/elements/docs/elements/tabs/\n * @since 0.10.0\n * @entrypoint \\@nvidia-elements/core/tabs\n * @slot - The label displayed for the tab.\n * @slot prefix - Decoration before the label.\n * @slot suffix - Supporting content after the label.\n * @cssprop --gap - Spacing between the label and decoration.\n * @cssprop --font-size\n * @cssprop --width\n * @cssprop --padding\n * @cssprop --font-size\n * @cssprop --font-weight\n * @cssprop --border-radius\n * @cssprop --color\n * @cssprop --height\n * @cssprop --cursor\n * @cssprop --text-transform\n * @aria https://www.w3.org/WAI/ARIA/apg/patterns/tabs/\n * @responsive false\n */\n@audit()\n@stateSelected<TabsItem>()\nexport class TabsItem extends ButtonFormControlMixin(LitElement) {\n /**\n * Determines which tab item the user selects, defaults to false.\n */\n @property({ type: Boolean, reflect: true }) selected = false;\n\n static styles = useStyles([tabsItemStyleSheet]);\n\n static readonly metadata = {\n tag: 'nve-tabs-item',\n version: '0.0.0',\n parents: ['nve-tabs', 'nve-tabs-item-group']\n };\n\n render() {\n return html`\n <div internal-host focus-within>\n <slot name=\"prefix\"></slot>\n <div id=\"label\"><slot></slot></div>\n <slot name=\"suffix\"></slot>\n </div>\n `;\n }\n\n constructor() {\n super();\n this.type = 'button';\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._internals.role = 'tab';\n }\n\n updated(props: PropertyValues<this>) {\n super.updated(props);\n\n if (props.has('selected')) {\n if (this.selected) {\n appendAnchorName(this, '--selected');\n } else {\n removeAnchorName(this, '--selected');\n }\n }\n }\n}\n\n/**\n * @element nve-tabs\n * @description Tabs provide a selection UX, typically used for swapping content shown on a page, or within a navigation context.\n * @documentation https://nvidia.github.io/elements/docs/elements/tabs/\n * @since 0.10.0\n * @entrypoint \\@nvidia-elements/core/tabs\n * @slot - default slot for tab-item\n * @cssprop --gap\n * @cssprop --indicator-animation-duration - Duration of selection indicator movement.\n * @cssprop --indicator-background\n * @cssprop --indicator-border-radius\n * @cssprop --indicator-height\n * @cssprop --border-inset\n * @aria https://www.w3.org/WAI/ARIA/apg/patterns/tabs/\n * @responsive false\n */\n@audit()\nexport class Tabs extends LitElement {\n /**\n * Determines whether the tabs should display in a vertical layout vs. defaulting to horizontal.\n */\n @property({ type: Boolean, reflect: true }) vertical = false;\n\n /**\n * Determines whether the tabs should display a border on selected items vs. defaults to show border.\n */\n @property({ type: Boolean, reflect: true }) borderless = false;\n\n /**\n * Determines whether the tabs should handle selection behavior vs. defaults to off.\n */\n @property({ type: Boolean, attribute: 'behavior-select' }) behaviorSelect = false;\n\n static styles = useStyles([tabsStyleSheet]);\n\n static readonly metadata = {\n tag: 'nve-tabs',\n version: '0.0.0',\n children: ['nve-tabs-item', 'nve-tabs-item-group']\n };\n\n /** @private */\n get keynavListConfig(): KeynavListConfig {\n const items = this.#items;\n return {\n items,\n initialItem: items.find(item => item.selected),\n layout: this.vertical ? 'vertical' : 'horizontal',\n dir: getComputedStyle(this).direction\n };\n }\n\n @queryAssignedElements() private entries!: HTMLElement[];\n\n get #items(): TabsItem[] {\n return getTabItems(this.entries ?? []);\n }\n\n #keynavController = new KeyNavigationListController(this);\n #knownItems: TabsItem[] = [];\n #itemsObserver?: MutationObserver;\n\n /** @private */\n declare _internals: ElementInternals;\n\n render() {\n return html`\n <div internal-host>\n <slot @slotchange=${this.#syncItems}></slot>\n </div>\n `;\n }\n\n connectedCallback() {\n super.connectedCallback();\n appendRootNodeStyle(this, globalStyles);\n attachInternals(this);\n this._internals.role = 'tablist';\n this.addEventListener('click', this.#onClick);\n this.#observeItems();\n if (this.hasUpdated) this.#syncAccessoryTabState();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('click', this.#onClick);\n this.#itemsObserver?.disconnect();\n }\n\n firstUpdated() {\n this.#itemsObserver = new MutationObserver(this.#syncFromItems);\n this.#observeItems();\n }\n\n updated(props: PropertyValues<this>) {\n super.updated(props);\n this._internals.ariaOrientation = this.vertical ? 'vertical' : 'horizontal';\n }\n\n #observeItems() {\n this.#itemsObserver?.observe(this, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['tabindex', 'href', 'slot']\n });\n }\n\n #syncFromItems = (records: MutationRecord[]) => {\n if (records.some(record => record.type === 'childList' || record.attributeName === 'slot')) {\n void this.#syncItems();\n } else if (records.some(record => this.#items.some(item => item.contains(record.target)))) {\n this.#syncAccessoryTabState();\n }\n };\n\n #syncItems = async () => {\n const items = this.#items;\n if (items.length === this.#knownItems.length && items.every((item, index) => item === this.#knownItems[index])) {\n this.#syncAccessoryTabState();\n return;\n }\n\n const previousItems = this.#knownItems;\n this.#knownItems = items;\n await Promise.all(items.map(item => item.updateComplete));\n if (items !== this.#knownItems) return;\n\n this.#keynavController.refreshItems(previousItems);\n this.#syncAccessoryTabState();\n };\n\n #syncAccessoryTabState() {\n this.querySelectorAll<TabsItemGroup>(':scope > nve-tabs-item-group').forEach(group => {\n const item = getTabItems([group])[0];\n group.accessoryTabEnabled = !!item && isTabItemTabbable(item);\n });\n }\n\n #selectTab(tabItem: HTMLElement & { matches: Element['matches']; disabled?: boolean; selected?: boolean }) {\n if (!this.behaviorSelect || !tabItem.matches('nve-tabs-item') || tabItem.disabled) {\n return;\n }\n\n this.keynavListConfig.items.forEach((i: HTMLElement) => ((i as TabsItem).selected = false));\n tabItem.selected = true;\n }\n\n #onClick = (event: Event) => {\n const path = event.composedPath();\n const item = this.#items.find(candidate => path.includes(candidate));\n if (item) this.#selectTab(item);\n };\n}\n"],"mappings":"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"}
package/dist/tag/tag2.js CHANGED
@@ -1,44 +1,45 @@
1
1
  import { TypeClosableController as e } from "../internal/controllers/type-closable.controller.js";
2
- import { scopedRegistry as t } from "../internal/decorators/scoped-registry.js";
3
- import { colorStateStyles as n, useStyles as r } from "../internal/styles/index.js";
4
- import i from "../_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/decorate.js";
5
- import { Icon as a } from "../icon/icon2.js";
6
- import o from "./tag.js";
7
- import { LitElement as s, html as c } from "lit";
8
- import { property as l } from "lit/decorators/property.js";
9
- import { I18nController as u } from "@nvidia-elements/foundations/internal/i18n";
10
- import { ifDefined as d } from "lit/directives/if-defined.js";
2
+ import { colorStateStyles as t } from "../internal/styles/index.js";
3
+ import n from "../_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/decorate.js";
4
+ import { Icon as r } from "../icon/icon2.js";
5
+ import i from "./tag.js";
6
+ import { LitElement as a, html as o } from "lit";
7
+ import { property as s } from "lit/decorators/property.js";
8
+ import { I18nController as c } from "@nvidia-elements/foundations/internal/i18n";
9
+ import { ifDefined as l } from "lit/directives/if-defined.js";
10
+ import { scopedRegistry as u } from "@nvidia-elements/foundations/internal/decorators";
11
+ import { useStyles as d } from "@nvidia-elements/foundations/internal/styles";
11
12
  import { ButtonFormControlMixin as f } from "@nvidia-elements/forms/mixins";
12
13
  // src/tag/tag.ts
13
- var p = { close: "close" }, m = class extends f(s) {
14
+ var p = { close: "close" }, m = class extends f(a) {
14
15
  static {
15
- this.styles = r([n, o]);
16
+ this.styles = d([t, i]);
16
17
  }
17
18
  static {
18
19
  this.metadata = {
19
20
  tag: "nve-tag",
20
- version: "2.23.3"
21
+ version: "2.23.5"
21
22
  };
22
23
  }
23
24
  static {
24
- this.elementDefinitions = { [a.metadata.tag]: a };
25
+ this.elementDefinitions = { [r.metadata.tag]: r };
25
26
  }
26
27
  #e;
27
28
  #t;
28
29
  render() {
29
- return c`<div internal-host interaction-state focus-within><slot name="prefix"></slot><slot></slot><slot name="suffix"></slot>${this.closable ? c`<nve-icon part="icon" @click="${() => this.#t.close()}" container="flat" name="cancel" size="sm" role="img" aria-label="${d(this.i18n.close)}"></nve-icon>` : ""}</div>`;
30
+ return o`<div internal-host interaction-state focus-within><slot name="prefix"></slot><slot></slot><slot name="suffix"></slot>${this.closable ? o`<nve-icon part="icon" @click="${() => this.#t.close()}" container="flat" name="cancel" size="sm" role="img" aria-label="${l(this.i18n.close)}"></nve-icon>` : ""}</div>`;
30
31
  }
31
32
  constructor() {
32
- super(), this.closable = !1, this.#e = new u(this, p), this.i18n = this.#e.i18n, this.#t = new e(this), this.type = "button";
33
+ super(), this.closable = !1, this.#e = new c(this, p), this.i18n = this.#e.i18n, this.#t = new e(this), this.type = "button";
33
34
  }
34
35
  };
35
- i([l({ type: Boolean })], m.prototype, "closable", void 0), i([l({
36
+ n([s({ type: Boolean })], m.prototype, "closable", void 0), n([s({
36
37
  type: String,
37
38
  reflect: !0
38
- })], m.prototype, "color", void 0), i([l({
39
+ })], m.prototype, "color", void 0), n([s({
39
40
  type: String,
40
41
  reflect: !0
41
- })], m.prototype, "prominence", void 0), i([l({ type: Object })], m.prototype, "i18n", void 0), m = i([t()], m);
42
+ })], m.prototype, "prominence", void 0), n([s({ type: Object })], m.prototype, "i18n", void 0), m = n([u()], m);
42
43
  export { m as Tag };
43
44
 
44
45
  //# sourceMappingURL=tag2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tag2.js","names":["styles","_decorate","__decorate","tag_default","i18nDefaults","Tag","ButtonFormControlMixin","LitElement","useStyles","colorStateStyles","Icon","#typeClosableController","ifDefined","#i18nController","I18nController","TypeClosableController","property","scopedRegistry"],"sources":["../../src/tag/tag.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 { ifDefined } from 'lit/directives/if-defined.js';\nimport { ButtonFormControlMixin } from '@nvidia-elements/forms/mixins';\nimport type { Color, Prominence } from '@nvidia-elements/core/internal';\nimport { TypeClosableController, useStyles, colorStateStyles, scopedRegistry } from '@nvidia-elements/core/internal';\nimport { I18nController, type I18nDefaults } from '@nvidia-elements/foundations/internal/i18n';\nimport { Icon } from '@nvidia-elements/core/icon';\nimport styles from './tag.css?inline';\n\nconst i18nDefaults = {\n close: 'close'\n} satisfies I18nDefaults;\n\n/**\n * @element nve-tag\n * @description A interactive element that represents a category or group of content. Typically used to filter or organize content for one to many relations.\n * @documentation https://nvidia.github.io/elements/docs/elements/tag/\n * @since 0.10.0\n * @entrypoint \\@nvidia-elements/core/tag\n * @slot - Text or other content that identifies the category or group.\n * @slot prefix - Optional prefix content, such as a status nve-icon.\n * @slot suffix - Optional suffix content, such as a nve-dot counter.\n * @cssprop --background\n * @cssprop --color\n * @cssprop --gap\n * @cssprop --font-size\n * @cssprop --padding\n * @cssprop --border\n * @cssprop --border-radius\n * @cssprop --font-weight\n * @cssprop --cursor\n * @cssprop --height\n * @cssprop --width\n * @cssprop --max-width\n * @cssprop --text-decoration\n * @csspart icon - The icon element\n * @aria https://www.w3.org/WAI/ARIA/apg/patterns/button/\n */\n@scopedRegistry()\nexport class Tag extends ButtonFormControlMixin(LitElement) {\n static styles = useStyles([colorStateStyles, styles]);\n\n static readonly metadata = {\n tag: 'nve-tag',\n version: '0.0.0'\n };\n\n static elementDefinitions = {\n [Icon.metadata.tag]: Icon\n };\n\n /** Determines if tag is closable, if true, the component renders a close icon. */\n @property({ type: Boolean }) closable = false;\n\n /** Determines the color of the tag. */\n @property({ type: String, reflect: true }) color: Color;\n\n /** Determines the visual prominence or weight */\n @property({ type: String, reflect: true }) prominence?: Extract<Prominence, 'emphasis'>;\n\n #i18nController: I18nController<this> = new I18nController<this>(this, i18nDefaults);\n\n /** Updates internal string values for internationalization. */\n @property({ type: Object }) i18n = this.#i18nController.i18n;\n\n #typeClosableController = new TypeClosableController(this);\n\n render() {\n return html`\n <div internal-host interaction-state focus-within>\n <slot name=\"prefix\"></slot>\n <slot></slot>\n <slot name=\"suffix\"></slot>\n ${this.closable ? html`<nve-icon part=\"icon\" @click=${() => this.#typeClosableController.close()} container=\"flat\" name=\"cancel\" size=\"sm\" role=\"img\" aria-label=${ifDefined(this.i18n.close)}></nve-icon>` : ''}\n </div>\n `;\n }\n\n constructor() {\n super();\n this.type = 'button';\n }\n}\n"],"mappings":";;;;;;;;;;;;AAaA,IAAMI,IAAe,EACnB,OAAO,QACT,GA4BaC,IAAN,cAAkBC,EAAuBC,CAAU,CAAC,CAAC;;EAC1C,KAAA,SAAAC,EAAU,CAACC,GAAkBT,CAAM,CAAC;;;EAEzB,KAAA,WAAA;GACzB,KAAK;GACL,SAAS;EACX;;;EAE4B,KAAA,qBAAA,GACzBU,EAAK,SAAS,MAAMA,EACvB;;CAWA;CAKA;CAEA,SAAS;EACP,OAAO,CAAI,wHAKL,KAAK,WAAW,CAAI,uCAAsC,KAAKC,GAAwB,MAAM,EAAE,oEAAkEC,EAAU,KAAK,KAAK,KAAK,EAAE,iBAAgB,GAAG;CAGvN;CAEA,cAAc;EAEZ,AADA,MAAM,GA3BgC,KAAA,WAAA,IAQA,KAAAC,KAAA,IAAIC,EAAqB,MAAMV,CAAY,GAGhD,KAAA,OAAA,KAAKS,GAAgB,MAE9B,KAAAF,KAAA,IAAII,EAAuB,IAAI,GAevD,KAAK,OAAO;CACd;AACF;AA9BGd,EAAA,CAAAe,EAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAAX,EAAA,WAAA,YAAA,KAAA,CAAA,GAG1BJ,EAAA,CAAAe,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAAX,EAAA,WAAA,SAAA,KAAA,CAAA,GAGxCJ,EAAA,CAAAe,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAAX,EAAA,WAAA,cAAA,KAAA,CAAA,GAKxCJ,EAAA,CAAAe,EAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAAX,EAAA,WAAA,QAAA,KAAA,CAAA,GAzB3B,IAAAJ,EAAA,CAAAgB,EAAe,CAAA,GAAAZ,CAAA"}
1
+ {"version":3,"file":"tag2.js","names":["styles","_decorate","__decorate","tag_default","i18nDefaults","Tag","ButtonFormControlMixin","LitElement","useStyles","colorStateStyles","Icon","#typeClosableController","ifDefined","#i18nController","I18nController","TypeClosableController","property","scopedRegistry"],"sources":["../../src/tag/tag.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 { ifDefined } from 'lit/directives/if-defined.js';\nimport { ButtonFormControlMixin } from '@nvidia-elements/forms/mixins';\nimport type { Color, Prominence } from '@nvidia-elements/core/internal';\nimport { TypeClosableController, colorStateStyles } from '@nvidia-elements/core/internal';\nimport { scopedRegistry } from '@nvidia-elements/foundations/internal/decorators';\nimport { useStyles } from '@nvidia-elements/foundations/internal/styles';\nimport { I18nController, type I18nDefaults } from '@nvidia-elements/foundations/internal/i18n';\nimport { Icon } from '@nvidia-elements/core/icon';\nimport styles from './tag.css?inline';\n\nconst i18nDefaults = {\n close: 'close'\n} satisfies I18nDefaults;\n\n/**\n * @element nve-tag\n * @description A interactive element that represents a category or group of content. Typically used to filter or organize content for one to many relations.\n * @documentation https://nvidia.github.io/elements/docs/elements/tag/\n * @since 0.10.0\n * @entrypoint \\@nvidia-elements/core/tag\n * @slot - Text or other content that identifies the category or group.\n * @slot prefix - Optional prefix content, such as a status nve-icon.\n * @slot suffix - Optional suffix content, such as a nve-dot counter.\n * @cssprop --background\n * @cssprop --color\n * @cssprop --gap\n * @cssprop --font-size\n * @cssprop --padding\n * @cssprop --border\n * @cssprop --border-radius\n * @cssprop --font-weight\n * @cssprop --cursor\n * @cssprop --height\n * @cssprop --width\n * @cssprop --max-width\n * @cssprop --text-decoration\n * @csspart icon - The icon element\n * @aria https://www.w3.org/WAI/ARIA/apg/patterns/button/\n */\n@scopedRegistry()\nexport class Tag extends ButtonFormControlMixin(LitElement) {\n static styles = useStyles([colorStateStyles, styles]);\n\n static readonly metadata = {\n tag: 'nve-tag',\n version: '0.0.0'\n };\n\n static elementDefinitions = {\n [Icon.metadata.tag]: Icon\n };\n\n /** Determines if tag is closable, if true, the component renders a close icon. */\n @property({ type: Boolean }) closable = false;\n\n /** Determines the color of the tag. */\n @property({ type: String, reflect: true }) color: Color;\n\n /** Determines the visual prominence or weight */\n @property({ type: String, reflect: true }) prominence?: Extract<Prominence, 'emphasis'>;\n\n #i18nController: I18nController<this> = new I18nController<this>(this, i18nDefaults);\n\n /** Updates internal string values for internationalization. */\n @property({ type: Object }) i18n = this.#i18nController.i18n;\n\n #typeClosableController = new TypeClosableController(this);\n\n render() {\n return html`\n <div internal-host interaction-state focus-within>\n <slot name=\"prefix\"></slot>\n <slot></slot>\n <slot name=\"suffix\"></slot>\n ${this.closable ? html`<nve-icon part=\"icon\" @click=${() => this.#typeClosableController.close()} container=\"flat\" name=\"cancel\" size=\"sm\" role=\"img\" aria-label=${ifDefined(this.i18n.close)}></nve-icon>` : ''}\n </div>\n `;\n }\n\n constructor() {\n super();\n this.type = 'button';\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAeA,IAAMI,IAAe,EACnB,OAAO,QACT,GA4BaC,IAAN,cAAkBC,EAAuBC,CAAU,CAAC,CAAC;;EAC1C,KAAA,SAAAC,EAAU,CAACC,GAAkBT,CAAM,CAAC;;;EAEzB,KAAA,WAAA;GACzB,KAAK;GACL,SAAS;EACX;;;EAE4B,KAAA,qBAAA,GACzBU,EAAK,SAAS,MAAMA,EACvB;;CAWA;CAKA;CAEA,SAAS;EACP,OAAO,CAAI,wHAKL,KAAK,WAAW,CAAI,uCAAsC,KAAKC,GAAwB,MAAM,EAAE,oEAAkEC,EAAU,KAAK,KAAK,KAAK,EAAE,iBAAgB,GAAG;CAGvN;CAEA,cAAc;EAEZ,AADA,MAAM,GA3BgC,KAAA,WAAA,IAQA,KAAAC,KAAA,IAAIC,EAAqB,MAAMV,CAAY,GAGhD,KAAA,OAAA,KAAKS,GAAgB,MAE9B,KAAAF,KAAA,IAAII,EAAuB,IAAI,GAevD,KAAK,OAAO;CACd;AACF;AA9BGd,EAAA,CAAAe,EAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAAX,EAAA,WAAA,YAAA,KAAA,CAAA,GAG1BJ,EAAA,CAAAe,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAAX,EAAA,WAAA,SAAA,KAAA,CAAA,GAGxCJ,EAAA,CAAAe,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAAX,EAAA,WAAA,cAAA,KAAA,CAAA,GAKxCJ,EAAA,CAAAe,EAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAAX,EAAA,WAAA,QAAA,KAAA,CAAA,GAzB3B,IAAAJ,EAAA,CAAAgB,EAAe,CAAA,GAAAZ,CAAA"}
@@ -1,22 +1,22 @@
1
- import { useStyles as e } from "../internal/styles/index.js";
2
- import { Control as t } from "../forms/control/control2.js";
3
- import n from "./textarea.js";
4
- import { html as r } from "lit";
1
+ import { Control as e } from "../forms/control/control2.js";
2
+ import t from "./textarea.js";
3
+ import { html as n } from "lit";
4
+ import { useStyles as r } from "@nvidia-elements/foundations/internal/styles";
5
5
  // src/textarea/textarea.ts
6
- var i = class extends t {
6
+ var i = class extends e {
7
7
  static {
8
- this.styles = e([...t.styles, n]);
8
+ this.styles = r([...e.styles, t]);
9
9
  }
10
10
  get prefixContent() {
11
- return r`<slot name="prefix"></slot>`;
11
+ return n`<slot name="prefix"></slot>`;
12
12
  }
13
13
  get suffixContent() {
14
- return r`<slot name="suffix"></slot>`;
14
+ return n`<slot name="suffix"></slot>`;
15
15
  }
16
16
  static {
17
17
  this.metadata = {
18
18
  tag: "nve-textarea",
19
- version: "2.23.3"
19
+ version: "2.23.5"
20
20
  };
21
21
  }
22
22
  };
@@ -1 +1 @@
1
- {"version":3,"file":"textarea2.js","names":["styles","textarea_default","Textarea","Control","useStyles"],"sources":["../../src/textarea/textarea.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html, type CSSResult } from 'lit';\nimport { useStyles } from '@nvidia-elements/core/internal';\nimport { Control } from '@nvidia-elements/core/forms';\nimport styles from './textarea.css?inline';\n\n/**\n * @element nve-textarea\n * @description A textarea is a control that enables users to enter and edit text.\n * @documentation https://nvidia.github.io/elements/docs/elements/textarea/\n * @since 0.3.0\n * @entrypoint \\@nvidia-elements/core/textarea\n * @slot prefix - Content to display before the textarea.\n * @slot suffix - Content to display after the textarea.\n * @cssprop --padding\n * @cssprop --font-size\n * @cssprop --height\n * @cssprop --width\n * @cssprop --min-height\n * @cssprop --background\n * @cssprop --border-radius\n * @cssprop --cursor\n * @cssprop --border\n * @cssprop --color\n * @aria https://developer.mozilla.org/en-US/docs/Web/HTML/Element/textarea\n */\nexport class Textarea extends Control {\n static styles: CSSResult[] = useStyles([...Control.styles, styles]);\n\n /** @private */\n protected get prefixContent() {\n return html`<slot name=\"prefix\"></slot>`;\n }\n\n /** @private */\n protected get suffixContent() {\n return html`<slot name=\"suffix\"></slot>`;\n }\n\n static readonly metadata = {\n tag: 'nve-textarea',\n version: '0.0.0'\n };\n}\n"],"mappings":";;;;;AA4BA,IAAaE,IAAb,cAA8BC,EAAQ;;EACP,KAAA,SAAAC,EAAU,CAAC,GAAGD,EAAQ,QAAQH,CAAM,CAAC;;CAGlE,IAAc,gBAAgB;EAC5B,OAAO,CAAI;CACb;CAGA,IAAc,gBAAgB;EAC5B,OAAO,CAAI;CACb;;EAE2B,KAAA,WAAA;GACzB,KAAK;GACL,SAAS;EACX;;AACF"}
1
+ {"version":3,"file":"textarea2.js","names":["styles","textarea_default","Textarea","Control","useStyles"],"sources":["../../src/textarea/textarea.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html, type CSSResult } from 'lit';\nimport { useStyles } from '@nvidia-elements/foundations/internal/styles';\nimport { Control } from '@nvidia-elements/core/forms';\nimport styles from './textarea.css?inline';\n\n/**\n * @element nve-textarea\n * @description A textarea is a control that enables users to enter and edit text.\n * @documentation https://nvidia.github.io/elements/docs/elements/textarea/\n * @since 0.3.0\n * @entrypoint \\@nvidia-elements/core/textarea\n * @slot prefix - Content to display before the textarea.\n * @slot suffix - Content to display after the textarea.\n * @cssprop --padding\n * @cssprop --font-size\n * @cssprop --height\n * @cssprop --width\n * @cssprop --min-height\n * @cssprop --background\n * @cssprop --border-radius\n * @cssprop --cursor\n * @cssprop --border\n * @cssprop --color\n * @aria https://developer.mozilla.org/en-US/docs/Web/HTML/Element/textarea\n */\nexport class Textarea extends Control {\n static styles: CSSResult[] = useStyles([...Control.styles, styles]);\n\n /** @private */\n protected get prefixContent() {\n return html`<slot name=\"prefix\"></slot>`;\n }\n\n /** @private */\n protected get suffixContent() {\n return html`<slot name=\"suffix\"></slot>`;\n }\n\n static readonly metadata = {\n tag: 'nve-textarea',\n version: '0.0.0'\n };\n}\n"],"mappings":";;;;;AA4BA,IAAaE,IAAb,cAA8BC,EAAQ;;EACP,KAAA,SAAAC,EAAU,CAAC,GAAGD,EAAQ,QAAQH,CAAM,CAAC;;CAGlE,IAAc,gBAAgB;EAC5B,OAAO,CAAI;CACb;CAGA,IAAc,gBAAgB;EAC5B,OAAO,CAAI;CACb;;EAE2B,KAAA,WAAA;GACzB,KAAK;GACL,SAAS;EACX;;AACF"}
@@ -1,41 +1,41 @@
1
- import { scopedRegistry as e } from "../internal/decorators/scoped-registry.js";
2
- import { useStyles as t } from "../internal/styles/index.js";
3
- import n from "../_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/decorate.js";
4
- import { IconButton as r } from "../icon-button/icon-button2.js";
5
- import { Control as i } from "../forms/control/control2.js";
6
- import { inputStyles as a } from "../input/input2.js";
7
- import o from "./time.js";
8
- import { html as s } from "lit";
9
- import { property as c } from "lit/decorators/property.js";
1
+ import e from "../_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/decorate.js";
2
+ import { IconButton as t } from "../icon-button/icon-button2.js";
3
+ import { Control as n } from "../forms/control/control2.js";
4
+ import { inputStyles as r } from "../input/input2.js";
5
+ import i from "./time.js";
6
+ import { html as a } from "lit";
7
+ import { property as o } from "lit/decorators/property.js";
8
+ import { scopedRegistry as s } from "@nvidia-elements/foundations/internal/decorators";
9
+ import { useStyles as c } from "@nvidia-elements/foundations/internal/styles";
10
10
  // src/time/time.ts
11
- var l = { expand: "expand" }, u = class extends i {
11
+ var l = { expand: "expand" }, u = class extends n {
12
12
  get i18nDefaults() {
13
13
  return l;
14
14
  }
15
15
  static {
16
- this.styles = t([
17
- ...i.styles,
18
- a,
19
- o
16
+ this.styles = c([
17
+ ...n.styles,
18
+ r,
19
+ i
20
20
  ]);
21
21
  }
22
22
  static {
23
23
  this.metadata = {
24
24
  tag: "nve-time",
25
- version: "2.23.3"
25
+ version: "2.23.5"
26
26
  };
27
27
  }
28
28
  static {
29
- this.elementDefinitions = { [r.metadata.tag]: r };
29
+ this.elementDefinitions = { [t.metadata.tag]: t };
30
30
  }
31
31
  get suffixContent() {
32
- return s`<nve-icon-button part="icon-button" .ariaLabel="${this.i18n.expand}" icon-name="clock" container="inline" @click="${this.showPicker}"></nve-icon-button>`;
32
+ return a`<nve-icon-button part="icon-button" .ariaLabel="${this.i18n.expand}" icon-name="clock" container="inline" @click="${this.showPicker}"></nve-icon-button>`;
33
33
  }
34
34
  };
35
- n([c({
35
+ e([o({
36
36
  type: String,
37
37
  reflect: !0
38
- })], u.prototype, "container", void 0), u = n([e()], u);
38
+ })], u.prototype, "container", void 0), u = e([s()], u);
39
39
  export { u as Time };
40
40
 
41
41
  //# sourceMappingURL=time2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"time2.js","names":["styles","_decorate","__decorate","time_default","i18nDefaults","Time","Control","useStyles","inputStyles","IconButton","property","scopedRegistry"],"sources":["../../src/time/time.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 type { I18nDefaults } from '@nvidia-elements/foundations/internal/i18n';\nimport styles from './time.css?inline';\n\nconst i18nDefaults = {\n expand: 'expand'\n} satisfies I18nDefaults;\n\n/**\n * @element nve-time\n * @description A time picker is a control that enables users to choose a time value.\n * @documentation https://nvidia.github.io/elements/docs/elements/time/\n * @since 0.3.0\n * @entrypoint \\@nvidia-elements/core/time\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 clock icon button element\n * @aria https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/time\n */\n@scopedRegistry()\nexport class Time extends Control implements ContainerElement {\n protected override get i18nDefaults(): I18nDefaults {\n return i18nDefaults;\n }\n\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-time',\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 part=\"icon-button\" .ariaLabel=${this.i18n.expand} icon-name=\"clock\" container=\"inline\" @click=${this.showPicker}></nve-icon-button>`;\n }\n}\n"],"mappings":";;;;;;;;;;AAaA,IAAMI,IAAe,EACnB,QAAQ,SACV,GAmBaC,IAAN,cAAmBC,EAAoC;CAC5D,IAAuB,eAA6B;EAClD,OAAOF;CACT;;EAQgB,KAAA,SAAAG,EAAU;GAAC,GAAGD,EAAQ;GAAQE;GAAaR;EAAM,CAAC;;;EAEvC,KAAA,WAAA;GACzB,KAAK;GACL,SAAS;EACX;;;EAE4B,KAAA,qBAAA,GACzBS,EAAW,SAAS,MAAMA,EAC7B;;CAEA,IAAc,gBAAgB;EAC5B,OAAO,CAAI,mDAAkD,KAAK,KAAK,OAAO,iDAA+C,KAAK,WAAW;CAC/I;AACF;AAhBGR,EAAA,CAAAS,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAAL,EAAA,WAAA,aAAA,KAAA,CAAA,GAV1C,IAAAJ,EAAA,CAAAU,EAAe,CAAA,GAAAN,CAAA"}
1
+ {"version":3,"file":"time2.js","names":["styles","_decorate","__decorate","time_default","i18nDefaults","Time","Control","useStyles","inputStyles","IconButton","property","scopedRegistry"],"sources":["../../src/time/time.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 } from '@nvidia-elements/foundations/internal/decorators';\nimport { useStyles } from '@nvidia-elements/foundations/internal/styles';\nimport { Control } from '@nvidia-elements/core/forms';\nimport { IconButton } from '@nvidia-elements/core/icon-button';\nimport { inputStyles } from '@nvidia-elements/core/input';\nimport type { I18nDefaults } from '@nvidia-elements/foundations/internal/i18n';\nimport styles from './time.css?inline';\n\nconst i18nDefaults = {\n expand: 'expand'\n} satisfies I18nDefaults;\n\n/**\n * @element nve-time\n * @description A time picker is a control that enables users to choose a time value.\n * @documentation https://nvidia.github.io/elements/docs/elements/time/\n * @since 0.3.0\n * @entrypoint \\@nvidia-elements/core/time\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 clock icon button element\n * @aria https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/time\n */\n@scopedRegistry()\nexport class Time extends Control implements ContainerElement {\n protected override get i18nDefaults(): I18nDefaults {\n return i18nDefaults;\n }\n\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-time',\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 part=\"icon-button\" .ariaLabel=${this.i18n.expand} icon-name=\"clock\" container=\"inline\" @click=${this.showPicker}></nve-icon-button>`;\n }\n}\n"],"mappings":";;;;;;;;;;AAcA,IAAMI,IAAe,EACnB,QAAQ,SACV,GAmBaC,IAAN,cAAmBC,EAAoC;CAC5D,IAAuB,eAA6B;EAClD,OAAOF;CACT;;EAQgB,KAAA,SAAAG,EAAU;GAAC,GAAGD,EAAQ;GAAQE;GAAaR;EAAM,CAAC;;;EAEvC,KAAA,WAAA;GACzB,KAAK;GACL,SAAS;EACX;;;EAE4B,KAAA,qBAAA,GACzBS,EAAW,SAAS,MAAMA,EAC7B;;CAEA,IAAc,gBAAgB;EAC5B,OAAO,CAAI,mDAAkD,KAAK,KAAK,OAAO,iDAA+C,KAAK,WAAW;CAC/I;AACF;AAhBGR,EAAA,CAAAS,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAAL,EAAA,WAAA,aAAA,KAAA,CAAA,GAV1C,IAAAJ,EAAA,CAAAU,EAAe,CAAA,GAAAN,CAAA"}