@carbon/web-components 2.61.0 → 2.62.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (241) hide show
  1. package/custom-elements.json +455 -13
  2. package/es/components/action-set/action-set.d.ts +107 -0
  3. package/es/components/action-set/action-set.d.ts.map +1 -0
  4. package/es/components/action-set/action-set.js +269 -0
  5. package/es/components/action-set/action-set.js.map +1 -0
  6. package/es/components/action-set/action-set.scss.js +14 -0
  7. package/es/components/action-set/action-set.scss.js.map +1 -0
  8. package/es/components/action-set/index.d.ts +9 -0
  9. package/es/components/action-set/index.d.ts.map +1 -0
  10. package/es/components/action-set/index.js +8 -0
  11. package/es/components/button/button.d.ts.map +1 -1
  12. package/es/components/button/button.js +7 -2
  13. package/es/components/button/button.js.map +1 -1
  14. package/es/components/data-table/data-table.scss.js +1 -1
  15. package/es/components/date-picker/next/components/date-picker.scss.js +1 -1
  16. package/es/components/file-uploader/file-uploader.scss.js +1 -1
  17. package/es/components/fluid-date-picker/fluid-date-picker.scss.js +1 -1
  18. package/es/components/resizer/defs.d.ts +73 -0
  19. package/es/components/resizer/defs.d.ts.map +1 -0
  20. package/es/components/resizer/defs.js +97 -0
  21. package/es/components/resizer/defs.js.map +1 -0
  22. package/es/components/resizer/index.d.ts +11 -0
  23. package/es/components/resizer/index.d.ts.map +1 -0
  24. package/es/components/resizer/index.js +11 -0
  25. package/es/components/resizer/resizer-grid.d.ts +22 -0
  26. package/es/components/resizer/resizer-grid.d.ts.map +1 -0
  27. package/es/components/resizer/resizer-grid.js +44 -0
  28. package/es/components/resizer/resizer-grid.js.map +1 -0
  29. package/es/components/resizer/resizer-grid.scss.js +14 -0
  30. package/es/components/resizer/resizer-grid.scss.js.map +1 -0
  31. package/es/components/resizer/resizer-handle-pivot.d.ts +31 -0
  32. package/es/components/resizer/resizer-handle-pivot.d.ts.map +1 -0
  33. package/es/components/resizer/resizer-handle-pivot.js +93 -0
  34. package/es/components/resizer/resizer-handle-pivot.js.map +1 -0
  35. package/es/components/resizer/resizer-handle-pivot.scss.js +14 -0
  36. package/es/components/resizer/resizer-handle-pivot.scss.js.map +1 -0
  37. package/es/components/resizer/resizer-handle.d.ts +64 -0
  38. package/es/components/resizer/resizer-handle.d.ts.map +1 -0
  39. package/es/components/resizer/resizer-handle.js +350 -0
  40. package/es/components/resizer/resizer-handle.js.map +1 -0
  41. package/es/components/resizer/resizer-handle.scss.js +14 -0
  42. package/es/components/resizer/resizer-handle.scss.js.map +1 -0
  43. package/es/components/resizer/resizer-panel.d.ts +22 -0
  44. package/es/components/resizer/resizer-panel.d.ts.map +1 -0
  45. package/es/components/resizer/resizer-panel.js +37 -0
  46. package/es/components/resizer/resizer-panel.js.map +1 -0
  47. package/es/components/resizer/resizer-panel.scss.js +14 -0
  48. package/es/components/resizer/resizer-panel.scss.js.map +1 -0
  49. package/es/components/side-panel/_story-assets/index.d.ts +9 -0
  50. package/es/components/side-panel/_story-assets/index.d.ts.map +1 -0
  51. package/es/components/side-panel/_story-assets/index.js +246 -0
  52. package/es/components/side-panel/_story-assets/index.js.map +1 -0
  53. package/es/components/side-panel/defs.d.ts +7 -1
  54. package/es/components/side-panel/defs.d.ts.map +1 -1
  55. package/es/components/side-panel/defs.js +7 -1
  56. package/es/components/side-panel/defs.js.map +1 -1
  57. package/es/components/side-panel/index.d.ts +3 -1
  58. package/es/components/side-panel/index.d.ts.map +1 -1
  59. package/es/components/side-panel/index.js +12 -0
  60. package/es/components/side-panel/index.js.map +1 -0
  61. package/es/components/side-panel/side-panel.d.ts +60 -22
  62. package/es/components/side-panel/side-panel.d.ts.map +1 -1
  63. package/es/components/side-panel/side-panel.js +268 -126
  64. package/es/components/side-panel/side-panel.js.map +1 -1
  65. package/es/components/side-panel/side-panel.scss.js +14 -0
  66. package/es/components/side-panel/side-panel.scss.js.map +1 -0
  67. package/es/components/side-panel/story-styles.scss.js +14 -0
  68. package/es/components/side-panel/story-styles.scss.js.map +1 -0
  69. package/es/components/slider/slider.d.ts +14 -0
  70. package/es/components/slider/slider.d.ts.map +1 -1
  71. package/es/components/slider/slider.js +40 -5
  72. package/es/components/slider/slider.js.map +1 -1
  73. package/es/components/slider/slider.scss.js +1 -1
  74. package/es/components/tabs/tab.d.ts.map +1 -1
  75. package/es/components/tabs/tab.js +4 -1
  76. package/es/components/tabs/tab.js.map +1 -1
  77. package/es/components/tabs/tabs.scss.js +1 -1
  78. package/es/components/tabs/tabs.scss.js.map +1 -1
  79. package/es/components/textarea/textarea.scss.js +1 -1
  80. package/es/components/textarea/textarea.scss.js.map +1 -1
  81. package/es/components/truncated-text/index.d.ts +8 -0
  82. package/es/components/truncated-text/index.d.ts.map +1 -0
  83. package/es/components/truncated-text/index.js +8 -0
  84. package/es/components/truncated-text/truncated-text.d.ts +77 -0
  85. package/es/components/truncated-text/truncated-text.d.ts.map +1 -0
  86. package/es/components/truncated-text/truncated-text.js +216 -0
  87. package/es/components/truncated-text/truncated-text.js.map +1 -0
  88. package/es/components/truncated-text/truncated-text.scss.js +14 -0
  89. package/es/components/truncated-text/truncated-text.scss.js.map +1 -0
  90. package/es/globals/internal/icon-loader-utils.d.ts +2 -2
  91. package/es/globals/internal/icon-loader-utils.d.ts.map +1 -1
  92. package/es/globals/internal/icon-loader-utils.js +1 -1
  93. package/es/globals/internal/icon-loader-utils.js.map +1 -1
  94. package/es/index.d.ts.map +1 -1
  95. package/es-custom/components/action-set/action-set.d.ts +107 -0
  96. package/es-custom/components/action-set/action-set.d.ts.map +1 -0
  97. package/es-custom/components/action-set/action-set.js +269 -0
  98. package/es-custom/components/action-set/action-set.js.map +1 -0
  99. package/es-custom/components/action-set/action-set.scss.js +14 -0
  100. package/es-custom/components/action-set/action-set.scss.js.map +1 -0
  101. package/es-custom/components/action-set/index.d.ts +9 -0
  102. package/es-custom/components/action-set/index.d.ts.map +1 -0
  103. package/es-custom/components/action-set/index.js +8 -0
  104. package/es-custom/components/button/button.d.ts.map +1 -1
  105. package/es-custom/components/button/button.js +7 -2
  106. package/es-custom/components/button/button.js.map +1 -1
  107. package/es-custom/components/data-table/data-table.scss.js +1 -1
  108. package/es-custom/components/date-picker/next/components/date-picker.scss.js +1 -1
  109. package/es-custom/components/file-uploader/file-uploader.scss.js +1 -1
  110. package/es-custom/components/fluid-date-picker/fluid-date-picker.scss.js +1 -1
  111. package/es-custom/components/resizer/defs.d.ts +73 -0
  112. package/es-custom/components/resizer/defs.d.ts.map +1 -0
  113. package/es-custom/components/resizer/defs.js +97 -0
  114. package/es-custom/components/resizer/defs.js.map +1 -0
  115. package/es-custom/components/resizer/index.d.ts +11 -0
  116. package/es-custom/components/resizer/index.d.ts.map +1 -0
  117. package/es-custom/components/resizer/index.js +11 -0
  118. package/es-custom/components/resizer/resizer-grid.d.ts +22 -0
  119. package/es-custom/components/resizer/resizer-grid.d.ts.map +1 -0
  120. package/es-custom/components/resizer/resizer-grid.js +44 -0
  121. package/es-custom/components/resizer/resizer-grid.js.map +1 -0
  122. package/es-custom/components/resizer/resizer-grid.scss.js +14 -0
  123. package/es-custom/components/resizer/resizer-grid.scss.js.map +1 -0
  124. package/es-custom/components/resizer/resizer-handle-pivot.d.ts +31 -0
  125. package/es-custom/components/resizer/resizer-handle-pivot.d.ts.map +1 -0
  126. package/es-custom/components/resizer/resizer-handle-pivot.js +93 -0
  127. package/es-custom/components/resizer/resizer-handle-pivot.js.map +1 -0
  128. package/es-custom/components/resizer/resizer-handle-pivot.scss.js +14 -0
  129. package/es-custom/components/resizer/resizer-handle-pivot.scss.js.map +1 -0
  130. package/es-custom/components/resizer/resizer-handle.d.ts +64 -0
  131. package/es-custom/components/resizer/resizer-handle.d.ts.map +1 -0
  132. package/es-custom/components/resizer/resizer-handle.js +350 -0
  133. package/es-custom/components/resizer/resizer-handle.js.map +1 -0
  134. package/es-custom/components/resizer/resizer-handle.scss.js +14 -0
  135. package/es-custom/components/resizer/resizer-handle.scss.js.map +1 -0
  136. package/es-custom/components/resizer/resizer-panel.d.ts +22 -0
  137. package/es-custom/components/resizer/resizer-panel.d.ts.map +1 -0
  138. package/es-custom/components/resizer/resizer-panel.js +37 -0
  139. package/es-custom/components/resizer/resizer-panel.js.map +1 -0
  140. package/es-custom/components/resizer/resizer-panel.scss.js +14 -0
  141. package/es-custom/components/resizer/resizer-panel.scss.js.map +1 -0
  142. package/es-custom/components/side-panel/_story-assets/index.d.ts +9 -0
  143. package/es-custom/components/side-panel/_story-assets/index.d.ts.map +1 -0
  144. package/es-custom/components/side-panel/_story-assets/index.js +246 -0
  145. package/es-custom/components/side-panel/_story-assets/index.js.map +1 -0
  146. package/es-custom/components/side-panel/defs.d.ts +7 -1
  147. package/es-custom/components/side-panel/defs.d.ts.map +1 -1
  148. package/es-custom/components/side-panel/defs.js +7 -1
  149. package/es-custom/components/side-panel/defs.js.map +1 -1
  150. package/es-custom/components/side-panel/index.d.ts +3 -1
  151. package/es-custom/components/side-panel/index.d.ts.map +1 -1
  152. package/es-custom/components/side-panel/index.js +12 -0
  153. package/es-custom/components/side-panel/index.js.map +1 -0
  154. package/es-custom/components/side-panel/side-panel.d.ts +60 -22
  155. package/es-custom/components/side-panel/side-panel.d.ts.map +1 -1
  156. package/es-custom/components/side-panel/side-panel.js +268 -126
  157. package/es-custom/components/side-panel/side-panel.js.map +1 -1
  158. package/es-custom/components/side-panel/side-panel.scss.js +14 -0
  159. package/es-custom/components/side-panel/side-panel.scss.js.map +1 -0
  160. package/es-custom/components/side-panel/story-styles.scss.js +14 -0
  161. package/es-custom/components/side-panel/story-styles.scss.js.map +1 -0
  162. package/es-custom/components/slider/slider.d.ts +14 -0
  163. package/es-custom/components/slider/slider.d.ts.map +1 -1
  164. package/es-custom/components/slider/slider.js +40 -5
  165. package/es-custom/components/slider/slider.js.map +1 -1
  166. package/es-custom/components/slider/slider.scss.js +1 -1
  167. package/es-custom/components/tabs/tab.d.ts.map +1 -1
  168. package/es-custom/components/tabs/tab.js +4 -1
  169. package/es-custom/components/tabs/tab.js.map +1 -1
  170. package/es-custom/components/tabs/tabs.scss.js +1 -1
  171. package/es-custom/components/tabs/tabs.scss.js.map +1 -1
  172. package/es-custom/components/textarea/textarea.scss.js +1 -1
  173. package/es-custom/components/textarea/textarea.scss.js.map +1 -1
  174. package/es-custom/components/truncated-text/index.d.ts +8 -0
  175. package/es-custom/components/truncated-text/index.d.ts.map +1 -0
  176. package/es-custom/components/truncated-text/index.js +8 -0
  177. package/es-custom/components/truncated-text/truncated-text.d.ts +77 -0
  178. package/es-custom/components/truncated-text/truncated-text.d.ts.map +1 -0
  179. package/es-custom/components/truncated-text/truncated-text.js +216 -0
  180. package/es-custom/components/truncated-text/truncated-text.js.map +1 -0
  181. package/es-custom/components/truncated-text/truncated-text.scss.js +14 -0
  182. package/es-custom/components/truncated-text/truncated-text.scss.js.map +1 -0
  183. package/es-custom/globals/internal/icon-loader-utils.d.ts +2 -2
  184. package/es-custom/globals/internal/icon-loader-utils.d.ts.map +1 -1
  185. package/es-custom/globals/internal/icon-loader-utils.js +1 -1
  186. package/es-custom/globals/internal/icon-loader-utils.js.map +1 -1
  187. package/es-custom/index.d.ts.map +1 -1
  188. package/lib/components/action-set/action-set.d.ts +107 -0
  189. package/lib/components/action-set/action-set.d.ts.map +1 -0
  190. package/lib/components/action-set/index.d.ts +9 -0
  191. package/lib/components/action-set/index.d.ts.map +1 -0
  192. package/lib/components/button/button.d.ts.map +1 -1
  193. package/lib/components/resizer/defs.d.ts +73 -0
  194. package/lib/components/resizer/defs.d.ts.map +1 -0
  195. package/lib/components/resizer/defs.js +112 -0
  196. package/lib/components/resizer/defs.js.map +1 -0
  197. package/lib/components/resizer/index.d.ts +11 -0
  198. package/lib/components/resizer/index.d.ts.map +1 -0
  199. package/lib/components/resizer/resizer-grid.d.ts +22 -0
  200. package/lib/components/resizer/resizer-grid.d.ts.map +1 -0
  201. package/lib/components/resizer/resizer-handle-pivot.d.ts +31 -0
  202. package/lib/components/resizer/resizer-handle-pivot.d.ts.map +1 -0
  203. package/lib/components/resizer/resizer-handle.d.ts +64 -0
  204. package/lib/components/resizer/resizer-handle.d.ts.map +1 -0
  205. package/lib/components/resizer/resizer-panel.d.ts +22 -0
  206. package/lib/components/resizer/resizer-panel.d.ts.map +1 -0
  207. package/lib/components/side-panel/_story-assets/index.d.ts +9 -0
  208. package/lib/components/side-panel/_story-assets/index.d.ts.map +1 -0
  209. package/lib/components/side-panel/defs.d.ts +7 -1
  210. package/lib/components/side-panel/defs.d.ts.map +1 -1
  211. package/lib/components/side-panel/defs.js +7 -1
  212. package/lib/components/side-panel/defs.js.map +1 -1
  213. package/lib/components/side-panel/index.d.ts +3 -1
  214. package/lib/components/side-panel/index.d.ts.map +1 -1
  215. package/lib/components/side-panel/side-panel.d.ts +60 -22
  216. package/lib/components/side-panel/side-panel.d.ts.map +1 -1
  217. package/lib/components/slider/slider.d.ts +14 -0
  218. package/lib/components/slider/slider.d.ts.map +1 -1
  219. package/lib/components/tabs/tab.d.ts.map +1 -1
  220. package/lib/components/truncated-text/index.d.ts +8 -0
  221. package/lib/components/truncated-text/index.d.ts.map +1 -0
  222. package/lib/components/truncated-text/truncated-text.d.ts +77 -0
  223. package/lib/components/truncated-text/truncated-text.d.ts.map +1 -0
  224. package/lib/globals/internal/icon-loader-utils.d.ts +2 -2
  225. package/lib/globals/internal/icon-loader-utils.d.ts.map +1 -1
  226. package/lib/index.d.ts.map +1 -1
  227. package/package.json +7 -7
  228. package/scss/components/action-set/action-set.scss +93 -0
  229. package/scss/components/data-table/_table-core.scss +73 -20
  230. package/scss/components/data-table/_table-selection.scss +31 -14
  231. package/scss/components/resizer/resizer-grid.scss +34 -0
  232. package/scss/components/resizer/resizer-handle-pivot.scss +39 -0
  233. package/scss/components/resizer/resizer-handle.scss +127 -0
  234. package/scss/components/resizer/resizer-panel.scss +10 -0
  235. package/scss/components/side-panel/side-panel.scss +363 -0
  236. package/scss/components/side-panel/story-styles.scss +51 -0
  237. package/scss/components/tabs/tabs.scss +4 -0
  238. package/scss/components/textarea/textarea.scss +6 -0
  239. package/scss/components/truncated-text/truncated-text-story.scss +14 -0
  240. package/scss/components/truncated-text/truncated-text.scss +122 -0
  241. package/telemetry.yml +26 -0
@@ -1 +1 @@
1
- {"version":3,"file":"tab.js","names":["CDSContentSwitcherItem","styles","customElement"],"sources":["../../../src/components/tabs/tab.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2019, 2026\n *\n * This source code is licensed under the Apache-2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { html } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { property, state, query } from 'lit/decorators.js';\nimport { prefix } from '../../globals/settings';\nimport CDSContentSwitcherItem from '../content-switcher/content-switcher-item';\nimport { TABS_ICON_SIZE, TABS_TYPE } from './defs';\nimport styles from './tabs.scss?lit';\nimport { carbonElement as customElement } from '../../globals/decorators/carbon-element';\nimport HostListenerMixin from '../../globals/mixins/host-listener';\nimport HostListener from '../../globals/decorators/host-listener';\nimport '../button/button';\nimport Close16 from '@carbon/icons/es/close/16.js';\nimport iconLoader from '../../globals/internal/icon-loader';\nimport { classMap } from 'lit/directives/class-map.js';\n\n/**\n * Basic tab.\n *\n * @element cds-tab\n * @fires cds-tab-beingclosed\n * The custom event fired before a tab is closed upon a user gesture.\n * Cancellation of this event stops changing the user-initiated action.\n * @fires cds-tab-closed - The custom event fired after a a tab is closed upon a user gesture.\n */\n@customElement(`${prefix}-tab`)\nexport default class CDSTab extends HostListenerMixin(CDSContentSwitcherItem) {\n /**\n * `true` if this tab should be highlighted.\n * If `true`, parent `<cds-tabs>` selects/deselects this tab upon keyboard interaction.\n *\n * @private\n */\n @property({ type: Boolean, reflect: true })\n highlighted = false;\n\n /**\n * Tab type.\n */\n @property({ reflect: true })\n type = TABS_TYPE.REGULAR;\n\n /**\n * `true` if the tab is in vertical orientation.\n * This is automatically set by the parent `<cds-tabs>` when it's in vertical mode.\n */\n @property({ type: Boolean, reflect: true })\n vertical = false;\n\n /**\n * `true` if this tab is icon-only.\n */\n @property({ type: Boolean, reflect: true, attribute: 'icon-only' })\n iconOnly = false;\n\n /**\n * Specify the icon size used by icon-only tabs.\n */\n @property({ attribute: 'icon-size', reflect: true })\n iconSize?: TABS_ICON_SIZE;\n\n /**\n * The tab text content.\n */\n @property()\n tabTitle;\n\n /**\n * An optional label to render under the primary tab label.\n * Only useful for contained tabs.\n */\n @property({ attribute: 'secondary-label', reflect: true })\n secondaryLabel?: string;\n\n /**\n * **Experimental**: Display an empty dot badge on the Tab.\n */\n @property({ type: Boolean, reflect: true, attribute: 'badge-indicator' })\n badgeIndicator = false;\n\n /**\n * `true` if the tab text is truncated with ellipsis.\n * This state is automatically updated when the component renders in vertical mode.\n */\n @state()\n truncated = false;\n\n /**\n * Whether this tab should be dismissable.\n */\n @state()\n _dismissable = false;\n\n /**\n * The index of the tab component\n */\n @state()\n _index = -1;\n\n /**\n * Reference to the label span element (only present in vertical mode).\n * @private\n */\n @query(`.${prefix}--tabs__nav-item-label`)\n private _labelElement?: HTMLElement;\n\n /**\n * Checks if the text overflow ellipsis is currently applied to the label.\n * This is useful for determining if a tooltip should be shown.\n *\n * @returns `true` if text is truncated/clamped, `false` otherwise or if not in vertical mode\n */\n isTextTruncated(): boolean {\n if (!this.vertical || !this._labelElement) {\n return false;\n }\n\n // Compare scrollHeight with clientHeight to detect if content is overflowing\n // When line-clamp is active and text exceeds 2 lines, scrollHeight > clientHeight\n return this._labelElement.scrollHeight > this._labelElement.clientHeight;\n }\n\n /**\n * Updates the truncated state after the component has rendered.\n */\n updated(changedProperties: Map<PropertyKey, unknown>) {\n super.updated(changedProperties);\n\n // Check if text is truncated and update state when in vertical mode\n if (this.vertical && this._labelElement) {\n const isTruncated = this.isTextTruncated();\n if (this.truncated !== isTruncated) {\n this.truncated = isTruncated;\n }\n }\n }\n\n /**\n * Handles `slotchange` event.\n */\n protected _handleSlotChange({ target }: Event) {\n // Retrieve content of the slot to use for aria-label.\n const content = (target as HTMLSlotElement).assignedNodes();\n const textContent = content[0]?.textContent;\n // Normalize whitespace: trim and replace multiple spaces with single space\n this.tabTitle = textContent?.trim().replace(/\\s+/g, ' ') || undefined;\n }\n\n /**\n * Handles `keydown` event on the tab.\n * Triggers tab close when Delete key is pressed on a dismissable tab.\n */\n @HostListener('keydown')\n protected _handleKeydown(event: KeyboardEvent) {\n const { key } = event;\n if (\n this._dismissable &&\n !this.disabled &&\n (key === 'Delete' || key === 'Backspace')\n ) {\n event.preventDefault();\n this._handleClose(event);\n }\n }\n\n connectedCallback() {\n if (!this.hasAttribute('role')) {\n this.setAttribute('role', 'listitem');\n }\n super.connectedCallback();\n }\n\n render() {\n const navLinkClasses = classMap({\n [`${prefix}--tabs__nav-link`]: true,\n [`${prefix}--tabs__nav-link--dismissable`]: this._dismissable,\n });\n const closeButtonClasses = classMap({\n [`${prefix}--tabs__nav-item--close`]: this._dismissable,\n [`${prefix}--tabs__nav-item--close--hidden`]: !this._dismissable,\n });\n const {\n badgeIndicator,\n disabled,\n secondaryLabel,\n selected,\n tabTitle,\n vertical,\n truncated,\n _handleSlotChange: handleSlotChange,\n _handleClick: handleClick,\n } = this;\n\n const iconButton = html`\n <cds-button\n title=\"${this.textContent?.trim()\n ? `Remove ${this.textContent.trim()} tab`\n : 'Remove tab'}\"\n class=\"${closeButtonClasses}\"\n kind=\"ghost\"\n size=\"xs\"\n @click=\"${handleClick}\"\n tab-index=\"${-1}\"\n aria-hidden=\"${this.selected && this._dismissable ? 'false' : 'true'}\"\n ?disabled=\"${disabled}\">\n ${iconLoader(Close16, { 'aria-label': 'close', slot: 'icon' })}\n </cds-button>\n `;\n\n const accessibleLabel = tabTitle || this.getAttribute('aria-label');\n const isIconOnly =\n this.iconOnly ||\n this.classList.contains(`${prefix}--tabs__nav-item--icon-only`);\n // No `href`/`tabindex` to not to make this `<a>` click-focusable\n const tabLink = html`\n <a\n class=\"${navLinkClasses}\"\n role=\"tab\"\n aria-label=\"${ifDefined(accessibleLabel || undefined)}\"\n tabindex=\"${selected ? 0 : -1}\"\n ?disabled=\"${disabled}\"\n aria-selected=\"${selected}\">\n ${vertical\n ? html`<span\n class=\"${prefix}--tabs__nav-item-label\"\n title=\"${truncated ? tabTitle.trim() : ''}\">\n <slot @slotchange=\"${handleSlotChange}\"></slot>\n </span>`\n : html`\n <span class=\"${prefix}--tabs__nav-item-label-wrapper\">\n <slot @slotchange=\"${handleSlotChange}\"></slot>\n </span>\n `}\n ${secondaryLabel\n ? html`<span\n class=\"${prefix}--tabs__nav-item-secondary-label\"\n title=\"${secondaryLabel}\"\n >${secondaryLabel}</span\n >`\n : ''}\n ${!disabled && badgeIndicator\n ? html`<cds-badge-indicator></cds-badge-indicator>`\n : ''}\n </a>\n ${iconButton}\n `;\n\n if (isIconOnly && accessibleLabel && !disabled) {\n return html`\n <cds-tooltip align=\"bottom\" class=\"${prefix}--icon-tooltip\">\n ${tabLink}\n <cds-tooltip-content>${accessibleLabel}</cds-tooltip-content>\n </cds-tooltip>\n `;\n }\n\n return tabLink;\n }\n\n /**\n * Handles the close action for the tab.\n * Dispatches before-close and close events.\n */\n protected _handleClose(event: Event) {\n event.stopPropagation();\n const init = {\n bubbles: true,\n cancelable: true,\n composed: true,\n detail: {\n index: this._index,\n },\n };\n if (\n this.dispatchEvent(\n new CustomEvent(\n (this.constructor as typeof CDSTab).eventBeforeClose,\n init\n )\n )\n ) {\n this.dispatchEvent(\n new CustomEvent((this.constructor as typeof CDSTab).eventClose, init)\n );\n }\n }\n\n /**\n * Handles click event on the close button.\n */\n _handleClick(event: Event) {\n this._handleClose(event);\n }\n\n /**\n * The name of the custom event fired before a tab is closed upon a user gesture.\n * Cancellation of this event stops changing the user-initiated action.\n */\n static get eventBeforeClose() {\n return `${prefix}-tab-beingclosed`;\n }\n\n /**\n * The name of the custom event fired after a a tab is closed upon a user gesture.\n */\n static get eventClose() {\n return `${prefix}-tab-closed`;\n }\n\n static styles = styles;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"tab.js","names":["CDSContentSwitcherItem","styles","customElement"],"sources":["../../../src/components/tabs/tab.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2019, 2026\n *\n * This source code is licensed under the Apache-2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { html } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { property, state, query } from 'lit/decorators.js';\nimport { prefix } from '../../globals/settings';\nimport CDSContentSwitcherItem from '../content-switcher/content-switcher-item';\nimport { TABS_ICON_SIZE, TABS_TYPE } from './defs';\nimport styles from './tabs.scss?lit';\nimport { carbonElement as customElement } from '../../globals/decorators/carbon-element';\nimport HostListenerMixin from '../../globals/mixins/host-listener';\nimport HostListener from '../../globals/decorators/host-listener';\nimport '../button/button';\nimport Close16 from '@carbon/icons/es/close/16.js';\nimport iconLoader from '../../globals/internal/icon-loader';\nimport { classMap } from 'lit/directives/class-map.js';\n\n/**\n * Basic tab.\n *\n * @element cds-tab\n * @fires cds-tab-beingclosed\n * The custom event fired before a tab is closed upon a user gesture.\n * Cancellation of this event stops changing the user-initiated action.\n * @fires cds-tab-closed - The custom event fired after a a tab is closed upon a user gesture.\n */\n@customElement(`${prefix}-tab`)\nexport default class CDSTab extends HostListenerMixin(CDSContentSwitcherItem) {\n /**\n * `true` if this tab should be highlighted.\n * If `true`, parent `<cds-tabs>` selects/deselects this tab upon keyboard interaction.\n *\n * @private\n */\n @property({ type: Boolean, reflect: true })\n highlighted = false;\n\n /**\n * Tab type.\n */\n @property({ reflect: true })\n type = TABS_TYPE.REGULAR;\n\n /**\n * `true` if the tab is in vertical orientation.\n * This is automatically set by the parent `<cds-tabs>` when it's in vertical mode.\n */\n @property({ type: Boolean, reflect: true })\n vertical = false;\n\n /**\n * `true` if this tab is icon-only.\n */\n @property({ type: Boolean, reflect: true, attribute: 'icon-only' })\n iconOnly = false;\n\n /**\n * Specify the icon size used by icon-only tabs.\n */\n @property({ attribute: 'icon-size', reflect: true })\n iconSize?: TABS_ICON_SIZE;\n\n /**\n * The tab text content.\n */\n @property()\n tabTitle;\n\n /**\n * An optional label to render under the primary tab label.\n * Only useful for contained tabs.\n */\n @property({ attribute: 'secondary-label', reflect: true })\n secondaryLabel?: string;\n\n /**\n * **Experimental**: Display an empty dot badge on the Tab.\n */\n @property({ type: Boolean, reflect: true, attribute: 'badge-indicator' })\n badgeIndicator = false;\n\n /**\n * `true` if the tab text is truncated with ellipsis.\n * This state is automatically updated when the component renders in vertical mode.\n */\n @state()\n truncated = false;\n\n /**\n * Whether this tab should be dismissable.\n */\n @state()\n _dismissable = false;\n\n /**\n * The index of the tab component\n */\n @state()\n _index = -1;\n\n /**\n * Reference to the label span element (only present in vertical mode).\n * @private\n */\n @query(`.${prefix}--tabs__nav-item-label`)\n private _labelElement?: HTMLElement;\n\n /**\n * Checks if the text overflow ellipsis is currently applied to the label.\n * This is useful for determining if a tooltip should be shown.\n *\n * @returns `true` if text is truncated/clamped, `false` otherwise or if not in vertical mode\n */\n isTextTruncated(): boolean {\n if (!this.vertical || !this._labelElement) {\n return false;\n }\n\n // Compare scrollHeight with clientHeight to detect if content is overflowing\n // When line-clamp is active and text exceeds 2 lines, scrollHeight > clientHeight\n return this._labelElement.scrollHeight > this._labelElement.clientHeight;\n }\n\n /**\n * Updates the truncated state after the component has rendered.\n */\n updated(changedProperties: Map<PropertyKey, unknown>) {\n super.updated(changedProperties);\n\n // Check if text is truncated and update state when in vertical mode\n if (this.vertical && this._labelElement) {\n const isTruncated = this.isTextTruncated();\n if (this.truncated !== isTruncated) {\n this.truncated = isTruncated;\n }\n }\n }\n\n /**\n * Handles `slotchange` event.\n */\n protected _handleSlotChange({ target }: Event) {\n // Retrieve content of the slot to use for aria-label.\n const content = (target as HTMLSlotElement).assignedNodes();\n const textContent = content[0]?.textContent;\n // Normalize whitespace: trim and replace multiple spaces with single space\n this.tabTitle = textContent?.trim().replace(/\\s+/g, ' ') || undefined;\n }\n\n /**\n * Handles `keydown` event on the tab.\n * Triggers tab close when Delete key is pressed on a dismissable tab.\n */\n @HostListener('keydown')\n protected _handleKeydown(event: KeyboardEvent) {\n const { key } = event;\n if (\n this._dismissable &&\n !this.disabled &&\n (key === 'Delete' || key === 'Backspace')\n ) {\n event.preventDefault();\n this._handleClose(event);\n }\n }\n\n connectedCallback() {\n if (!this.hasAttribute('role')) {\n this.setAttribute('role', 'listitem');\n }\n super.connectedCallback();\n }\n\n render() {\n const navLinkClasses = classMap({\n [`${prefix}--tabs__nav-link`]: true,\n [`${prefix}--tabs__nav-link--dismissable`]: this._dismissable,\n });\n const closeButtonClasses = classMap({\n [`${prefix}--tabs__nav-item--close`]: this._dismissable,\n [`${prefix}--tabs__nav-item--close--hidden`]: !this._dismissable,\n });\n const {\n badgeIndicator,\n disabled,\n secondaryLabel,\n selected,\n tabTitle,\n vertical,\n truncated,\n _handleSlotChange: handleSlotChange,\n _handleClick: handleClick,\n } = this;\n\n const iconButton = html`\n <cds-button\n title=\"${this.textContent?.trim()\n ? `Remove ${this.textContent.trim()} tab`\n : 'Remove tab'}\"\n class=\"${closeButtonClasses}\"\n kind=\"ghost\"\n size=\"xs\"\n @click=\"${handleClick}\"\n tab-index=\"${-1}\"\n aria-hidden=\"${this.selected && this._dismissable ? 'false' : 'true'}\"\n ?disabled=\"${disabled}\">\n ${iconLoader(Close16, { 'aria-label': 'close', slot: 'icon' })}\n </cds-button>\n `;\n\n const accessibleLabel = tabTitle || this.getAttribute('aria-label');\n const isIconOnly =\n this.iconOnly ||\n this.classList.contains(`${prefix}--tabs__nav-item--icon-only`);\n // No `href`/`tabindex` to not to make this `<a>` click-focusable\n const tabLink = html`\n <a\n class=\"${navLinkClasses}\"\n role=\"tab\"\n aria-label=\"${ifDefined(accessibleLabel || undefined)}\"\n tabindex=\"${selected ? 0 : -1}\"\n ?disabled=\"${disabled}\"\n aria-selected=\"${selected}\">\n ${vertical\n ? html`<span\n class=\"${prefix}--tabs__nav-item-label\"\n title=\"${truncated ? tabTitle.trim() : ''}\">\n <slot @slotchange=\"${handleSlotChange}\"></slot>\n </span>`\n : html`\n <span class=\"${prefix}--tabs__nav-item-label-wrapper\">\n <slot @slotchange=\"${handleSlotChange}\"></slot>\n </span>\n `}\n ${secondaryLabel\n ? html`<span\n class=\"${prefix}--tabs__nav-item-secondary-label\"\n title=\"${secondaryLabel}\"\n >${secondaryLabel}</span\n >`\n : ''}\n ${!disabled && badgeIndicator\n ? html`<cds-badge-indicator></cds-badge-indicator>`\n : ''}\n </a>\n ${iconButton}\n `;\n\n if (isIconOnly && accessibleLabel && !disabled) {\n return html`\n <cds-tooltip\n align=\"bottom\"\n class=\"${prefix}--icon-tooltip\"\n leave-delay-ms=\"0\">\n ${tabLink}\n <cds-tooltip-content>${accessibleLabel}</cds-tooltip-content>\n </cds-tooltip>\n `;\n }\n\n return tabLink;\n }\n\n /**\n * Handles the close action for the tab.\n * Dispatches before-close and close events.\n */\n protected _handleClose(event: Event) {\n event.stopPropagation();\n const init = {\n bubbles: true,\n cancelable: true,\n composed: true,\n detail: {\n index: this._index,\n },\n };\n if (\n this.dispatchEvent(\n new CustomEvent(\n (this.constructor as typeof CDSTab).eventBeforeClose,\n init\n )\n )\n ) {\n this.dispatchEvent(\n new CustomEvent((this.constructor as typeof CDSTab).eventClose, init)\n );\n }\n }\n\n /**\n * Handles click event on the close button.\n */\n _handleClick(event: Event) {\n this._handleClose(event);\n }\n\n /**\n * The name of the custom event fired before a tab is closed upon a user gesture.\n * Cancellation of this event stops changing the user-initiated action.\n */\n static get eventBeforeClose() {\n return `${prefix}-tab-beingclosed`;\n }\n\n /**\n * The name of the custom event fired after a a tab is closed upon a user gesture.\n */\n static get eventClose() {\n return `${prefix}-tab-closed`;\n }\n\n static styles = styles;\n}\n"],"mappings":"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"}