@carbon/web-components 2.42.0-rc.0 → 2.42.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 (171) hide show
  1. package/custom-elements.json +44 -0
  2. package/dist/accordion.min.js +2 -2
  3. package/dist/ai-label.min.js +2 -2
  4. package/dist/ai-skeleton.min.js +2 -2
  5. package/dist/badge-indicator.min.js +2 -2
  6. package/dist/breadcrumb.min.js +2 -2
  7. package/dist/{button-B1zomRlI.js → button-eTloXzqX.js} +2 -2
  8. package/dist/{button-skeleton-B07ZbxzX.js → button-skeleton-Dk3chlBc.js} +2 -2
  9. package/dist/button.min.js +2 -2
  10. package/dist/chat-button.min.js +2 -2
  11. package/dist/{checkbox-B0vLnC5o.js → checkbox-cr5-wvt1.js} +2 -2
  12. package/dist/checkbox.min.js +2 -2
  13. package/dist/{class-map-D6fczokn.js → class-map-CJoc5JjN.js} +2 -2
  14. package/dist/code-snippet.min.js +2 -2
  15. package/dist/combo-box.min.js +2 -2
  16. package/dist/combo-button.min.js +2 -2
  17. package/dist/{content-switcher-item-C4k2qhq1.js → content-switcher-item-VHI7iTTP.js} +2 -2
  18. package/dist/content-switcher.min.js +2 -2
  19. package/dist/copy-button.min.js +2 -2
  20. package/dist/data-table.min.js +4 -4
  21. package/dist/date-picker.min.js +2 -2
  22. package/dist/{dropdown-item-Di3D8IQv.js → dropdown-item-Pt_eWt66.js} +2 -2
  23. package/dist/dropdown.min.js +2 -2
  24. package/dist/feature-flags.min.js +2 -2
  25. package/dist/file-uploader.min.js +2 -2
  26. package/dist/floating-controller-DLpRVhGd.js +28 -0
  27. package/dist/floating-menu.min.js +2 -2
  28. package/dist/fluid-text-input.min.js +2 -2
  29. package/dist/{focus-Cz1b3uzn.js → focus-yD1Q_pDt.js} +2 -2
  30. package/dist/{form-C8GJptS1.js → form-BaYTr2z0.js} +2 -2
  31. package/dist/form-group.min.js +2 -2
  32. package/dist/form.min.js +2 -2
  33. package/dist/grid.min.js +2 -2
  34. package/dist/heading.min.js +2 -2
  35. package/dist/{host-listener-CE9SgANI.js → host-listener-BJsBtsIt.js} +2 -2
  36. package/dist/icon-button.min.js +2 -2
  37. package/dist/icon-indicator.min.js +2 -2
  38. package/dist/{icon-loader-B3Da-Uq8.js → icon-loader-CqB9WRMP.js} +2 -2
  39. package/dist/{icon-loader-utils-BN__f45E.js → icon-loader-utils-DUl0vwdh.js} +2 -2
  40. package/dist/icon.min.js +2 -2
  41. package/dist/{if-defined-CYiNZJ6y.js → if-defined-IxozbDOJ.js} +2 -2
  42. package/dist/{if-non-empty-BVPYbR8i.js → if-non-empty-CqQHBHdQ.js} +2 -2
  43. package/dist/inline-loading.min.js +2 -2
  44. package/dist/layer.min.js +2 -2
  45. package/dist/link.min.js +2 -2
  46. package/dist/list.min.js +2 -2
  47. package/dist/{loading-icon-CcE3BBZu.js → loading-icon-CSgLYhyw.js} +2 -2
  48. package/dist/loading.min.js +2 -2
  49. package/dist/menu-button.min.js +2 -2
  50. package/dist/menu.min.js +2 -2
  51. package/dist/modal.min.js +3 -3
  52. package/dist/multi-select.min.js +2 -2
  53. package/dist/notification.min.js +2 -2
  54. package/dist/number-input.min.js +2 -2
  55. package/dist/overflow-menu.min.js +2 -2
  56. package/dist/page-header.min.js +2 -2
  57. package/dist/pagination.min.js +2 -2
  58. package/dist/password-input.min.js +2 -2
  59. package/dist/popover.min.js +10 -11
  60. package/dist/progress-bar.min.js +2 -2
  61. package/dist/progress-indicator.min.js +2 -2
  62. package/dist/{property-9iekpRAy.js → property-B_F7V5eB.js} +2 -2
  63. package/dist/{query-assigned-elements-BWBKpcF7.js → query-assigned-elements-DeMmXVMb.js} +2 -2
  64. package/dist/radio-button.min.js +2 -2
  65. package/dist/{search-uwRFrBOz.js → search-BrKCrPl3.js} +2 -2
  66. package/dist/search.min.js +2 -2
  67. package/dist/{select-DpavENph.js → select-Dwsf_c0t.js} +2 -2
  68. package/dist/select.min.js +2 -2
  69. package/dist/shape-indicator.min.js +2 -2
  70. package/dist/side-panel.min.js +2 -2
  71. package/dist/skeleton-icon.min.js +2 -2
  72. package/dist/skeleton-placeholder.min.js +2 -2
  73. package/dist/skeleton-text.min.js +2 -2
  74. package/dist/skip-to-content.min.js +2 -2
  75. package/dist/slider.min.js +2 -2
  76. package/dist/slug.min.js +3 -3
  77. package/dist/stack.min.js +2 -2
  78. package/dist/{state-BuG_dMhZ.js → state-CJQmj6wG.js} +2 -2
  79. package/dist/structured-list.min.js +2 -2
  80. package/dist/tabs.min.js +2 -2
  81. package/dist/tag.min.js +2 -2
  82. package/dist/tearsheet.min.js +2 -2
  83. package/dist/{text-input-CH2K_Vha.js → text-input-C0qeKR9e.js} +2 -2
  84. package/dist/text-input.min.js +2 -2
  85. package/dist/textarea.min.js +2 -2
  86. package/dist/tile.min.js +2 -2
  87. package/dist/time-picker.min.js +2 -2
  88. package/dist/toggle-tip.min.js +2 -2
  89. package/dist/toggle.min.js +2 -2
  90. package/dist/{tooltip-content-DMy2swEb.js → tooltip-content-CMbdEoxb.js} +2 -2
  91. package/dist/tooltip.min.js +2 -2
  92. package/dist/tree-view.min.js +2 -2
  93. package/dist/ui-shell.min.js +2 -2
  94. package/dist/{unsafe-html-DVA3vXNw.js → unsafe-html-Dqv0UqC_.js} +2 -2
  95. package/es/components/ai-label/ai-label.scss.js +1 -1
  96. package/es/components/ai-skeleton/ai-skeleton.scss.js +1 -1
  97. package/es/components/data-table/table.js +2 -2
  98. package/es/components/data-table/table.js.map +1 -1
  99. package/es/components/icon-button/icon-button.scss.js +1 -1
  100. package/es/components/modal/modal.scss.js +1 -1
  101. package/es/components/pagination/pagination.scss.js +1 -1
  102. package/es/components/popover/popover-content.d.ts +1 -1
  103. package/es/components/popover/popover-content.js +13 -15
  104. package/es/components/popover/popover-content.js.map +1 -1
  105. package/es/components/popover/popover.d.ts +18 -0
  106. package/es/components/popover/popover.js +80 -6
  107. package/es/components/popover/popover.js.map +1 -1
  108. package/es/components/popover/popover.scss.js +1 -1
  109. package/es/components/slug/slug.scss.js +1 -1
  110. package/es/components/toggle-tip/toggletip.scss.js +1 -1
  111. package/es/components/tooltip/tooltip.scss.js +1 -1
  112. package/es/globals/controllers/floating-controller.d.ts +4 -1
  113. package/es/globals/controllers/floating-controller.js +62 -10
  114. package/es/globals/controllers/floating-controller.js.map +1 -1
  115. package/es-custom/components/ai-label/ai-label.scss.js +1 -1
  116. package/es-custom/components/ai-skeleton/ai-skeleton.scss.js +1 -1
  117. package/es-custom/components/data-table/table.js +2 -2
  118. package/es-custom/components/data-table/table.js.map +1 -1
  119. package/es-custom/components/icon-button/icon-button.scss.js +1 -1
  120. package/es-custom/components/modal/modal.scss.js +1 -1
  121. package/es-custom/components/pagination/pagination.scss.js +1 -1
  122. package/es-custom/components/popover/popover-content.d.ts +1 -1
  123. package/es-custom/components/popover/popover-content.js +13 -15
  124. package/es-custom/components/popover/popover-content.js.map +1 -1
  125. package/es-custom/components/popover/popover.d.ts +18 -0
  126. package/es-custom/components/popover/popover.js +80 -6
  127. package/es-custom/components/popover/popover.js.map +1 -1
  128. package/es-custom/components/popover/popover.scss.js +1 -1
  129. package/es-custom/components/slug/slug.scss.js +1 -1
  130. package/es-custom/components/toggle-tip/toggletip.scss.js +1 -1
  131. package/es-custom/components/tooltip/tooltip.scss.js +1 -1
  132. package/es-custom/globals/controllers/floating-controller.d.ts +4 -1
  133. package/es-custom/globals/controllers/floating-controller.js +62 -10
  134. package/es-custom/globals/controllers/floating-controller.js.map +1 -1
  135. package/lib/components/popover/popover-content.d.ts +1 -1
  136. package/lib/components/popover/popover.d.ts +18 -0
  137. package/lib/globals/controllers/floating-controller.d.ts +4 -1
  138. package/lib/globals/controllers/floating-controller.js +61 -9
  139. package/lib/globals/controllers/floating-controller.js.map +1 -1
  140. package/package.json +3 -3
  141. package/scss/components/ai-skeleton/ai-skeleton.scss +14 -0
  142. package/scss/components/popover/popover-story.scss +2 -1
  143. package/scss/components/popover/popover.scss +149 -14
  144. package/telemetry.yml +1 -0
  145. package/dist/floating-controller-DjEAkoHn.js +0 -28
  146. package/dist/{16-fd4Ivo6o.js → 16-B3Yskhl0.js} +1 -1
  147. package/dist/{16-Bf5-IrA2.js → 16-B46MLj4i.js} +1 -1
  148. package/dist/{16-BZ-sICMc.js → 16-B7MRS_3W.js} +1 -1
  149. package/dist/{16-BKRNDebk.js → 16-BWlgPBcu.js} +1 -1
  150. package/dist/{16-5IO66qZv.js → 16-Bf2P7KMJ.js} +1 -1
  151. package/dist/{16-BplvdDlD.js → 16-Bxm7Omxq.js} +1 -1
  152. package/dist/{16-Ctf1-GU4.js → 16-CJNlj_0b.js} +1 -1
  153. package/dist/{16-DszCKQWk.js → 16-CdxGkvXO.js} +1 -1
  154. package/dist/{16-Cl1JRwhU.js → 16-DTvjc9uv.js} +1 -1
  155. package/dist/{16-B5nukGIX.js → 16-DhAznVKm.js} +1 -1
  156. package/dist/{16-BZbjCIdx.js → 16-DoN7q01_.js} +1 -1
  157. package/dist/{16-DussDP25.js → 16-GKRs-ALp.js} +1 -1
  158. package/dist/{20-BHvYOxYo.js → 20-CuEbZLGA.js} +1 -1
  159. package/dist/{20-dwKc_1p5.js → 20-DlknbFYR.js} +1 -1
  160. package/dist/{carbon-element-BZWjx64-.js → carbon-element-DDrYm3XO.js} +1 -1
  161. package/dist/{collection-helpers-CcXpRZP7.js → collection-helpers-_CvqQaiX.js} +1 -1
  162. package/dist/{consume-D8po478F.js → consume-BeeFGGfo.js} +1 -1
  163. package/dist/{directive-Dkgne8TP.js → directive-Dlo2OKiC.js} +1 -1
  164. package/dist/{host-listener-CEVyo9Gf.js → host-listener-BCnAWDV7.js} +1 -1
  165. package/dist/{lit-element-D-2dOK7a.js → lit-element-eFlPHqE1.js} +1 -1
  166. package/dist/{on-Dx8_n3Zi.js → on-DvnWS_DB.js} +1 -1
  167. package/dist/{query-BMt73bSi.js → query-BdmT5Ln1.js} +1 -1
  168. package/dist/{radio-group-manager-BFkEoNf7.js → radio-group-manager-B_pENWmT.js} +1 -1
  169. package/dist/{settings-1amR4med.js → settings-BBN_bDP6.js} +1 -1
  170. package/dist/{shared-enums-HvMnAeAT.js → shared-enums-D8TrS6Ts.js} +1 -1
  171. package/dist/{validity-DMHWEVWw.js → validity-BUGyJDQ6.js} +1 -1
@@ -1,10 +1,11 @@
1
1
  /**
2
- * Copyright IBM Corp. 2024
2
+ * Copyright IBM Corp. 2024, 2025
3
3
  *
4
4
  * This source code is licensed under the Apache-2.0 license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
  import { ReactiveController, ReactiveElement } from 'lit';
8
+ import { type Boundary } from '@floating-ui/dom';
8
9
  type FloatingControllerOptions = {
9
10
  target: HTMLElement;
10
11
  trigger: HTMLElement;
@@ -16,6 +17,8 @@ type FloatingControllerOptions = {
16
17
  matchWidth?: boolean;
17
18
  open: boolean;
18
19
  alignmentAxisOffset?: number;
20
+ autoAlignBoundary?: Boundary;
21
+ isTabTip?: boolean;
19
22
  };
20
23
  /**
21
24
  * Controller for positioning the menu using Floating UI.
@@ -5,10 +5,10 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- import { autoUpdate, flip, offset, arrow, size, computePosition } from '@floating-ui/dom';
8
+ import { autoUpdate, offset, flip, size, arrow, hide, computePosition } from '@floating-ui/dom';
9
9
 
10
10
  /**
11
- * Copyright IBM Corp. 2024
11
+ * Copyright IBM Corp. 2024, 2025
12
12
  *
13
13
  * This source code is licensed under the Apache-2.0 license found in the
14
14
  * LICENSE file in the root directory of this source tree.
@@ -34,8 +34,8 @@ class FloatingController {
34
34
  this.cleanup = autoUpdate(trigger, target, this.updatePlacement);
35
35
  }
36
36
  async computePlacement() {
37
- var _a;
38
- const { arrowElement, alignment, caret, trigger, target, styleElement, matchWidth, open, flipArguments, alignmentAxisOffset, } = this.options;
37
+ var _a, _b, _c;
38
+ const { arrowElement, alignment, caret, trigger, target, styleElement, matchWidth, open, alignmentAxisOffset, autoAlignBoundary, isTabTip, } = this.options;
39
39
  const element = styleElement !== null && styleElement !== void 0 ? styleElement : target;
40
40
  if (!element)
41
41
  return;
@@ -69,12 +69,56 @@ class FloatingController {
69
69
  shimmedAlign = alignment;
70
70
  break;
71
71
  }
72
+ const cs = getComputedStyle(element);
73
+ const toPx = (val) => {
74
+ const raw = parseFloat(val);
75
+ return val.trim().endsWith('rem') ? raw * 16 : raw;
76
+ };
77
+ const offsetPx = !isTabTip
78
+ ? ((_a = toPx(cs.getPropertyValue('--cds-popover-offset').trim())) !== null && _a !== void 0 ? _a : 10)
79
+ : 0;
72
80
  const middleware = [
73
- flip(flipArguments),
74
- offset((alignmentAxisOffset !== null && alignmentAxisOffset !== void 0 ? alignmentAxisOffset : 0) + (caret ? 10 : 0)),
75
- ...(caret && arrowElement
76
- ? [arrow({ element: arrowElement, padding: 15 })]
77
- : []),
81
+ offset(caret && !isTabTip
82
+ ? { alignmentAxis: alignmentAxisOffset, mainAxis: offsetPx }
83
+ : 0),
84
+ flip({
85
+ fallbackPlacements: isTabTip
86
+ ? shimmedAlign.includes('bottom')
87
+ ? ['bottom-start', 'bottom-end', 'top-start', 'top-end']
88
+ : ['top-start', 'top-end', 'bottom-start', 'bottom-end']
89
+ : shimmedAlign.includes('bottom')
90
+ ? [
91
+ 'bottom',
92
+ 'bottom-start',
93
+ 'bottom-end',
94
+ 'right',
95
+ 'right-start',
96
+ 'right-end',
97
+ 'left',
98
+ 'left-start',
99
+ 'left-end',
100
+ 'top',
101
+ 'top-start',
102
+ 'top-end',
103
+ ]
104
+ : [
105
+ 'top',
106
+ 'top-start',
107
+ 'top-end',
108
+ 'left',
109
+ 'left-start',
110
+ 'left-end',
111
+ 'right',
112
+ 'right-start',
113
+ 'right-end',
114
+ 'bottom',
115
+ 'bottom-start',
116
+ 'bottom-end',
117
+ ],
118
+ fallbackStrategy: 'initialPlacement',
119
+ fallbackAxisSideDirection: 'start',
120
+ boundary: autoAlignBoundary,
121
+ }),
78
122
  ...(matchWidth && (shimmedAlign === 'bottom' || shimmedAlign === 'top')
79
123
  ? [
80
124
  size({
@@ -90,6 +134,10 @@ class FloatingController {
90
134
  },
91
135
  }),
92
136
  ]),
137
+ ...(caret && arrowElement
138
+ ? [arrow({ element: arrowElement, padding: 15 })]
139
+ : []),
140
+ ...[hide()],
93
141
  ];
94
142
  if (open) {
95
143
  const { x, y, placement, middlewareData, strategy } = await computePosition(trigger, element, {
@@ -97,9 +145,13 @@ class FloatingController {
97
145
  middleware,
98
146
  placement: shimmedAlign,
99
147
  });
148
+ element.setAttribute('align', placement);
100
149
  element.style.left = `${x}px`;
101
150
  element.style.top = `${y}px`;
102
151
  element.style.position = `${strategy}`;
152
+ element.style.visibility = ((_b = middlewareData.hide) === null || _b === void 0 ? void 0 : _b.referenceHidden)
153
+ ? 'hidden'
154
+ : 'visible';
103
155
  if (arrowElement) {
104
156
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- https://github.com/carbon-design-system/carbon/issues/20452
105
157
  // @ts-ignore
@@ -122,7 +174,7 @@ class FloatingController {
122
174
  // TODO: remove reference to slug in v12
123
175
  if (this.host.tagName === 'CDS-AI-LABEL' ||
124
176
  this.host.tagName === 'CDS-SLUG') {
125
- (_a = this.host) === null || _a === void 0 ? void 0 : _a.setAttribute('alignment', placement);
177
+ (_c = this.host) === null || _c === void 0 ? void 0 : _c.setAttribute('alignment', placement);
126
178
  }
127
179
  }
128
180
  }
@@ -1 +1 @@
1
- {"version":3,"file":"floating-controller.js","sources":["../../../src/globals/controllers/floating-controller.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2024\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 { ReactiveController, ReactiveElement } from 'lit';\nimport {\n computePosition,\n flip,\n size,\n offset,\n arrow,\n autoUpdate,\n Placement,\n} from '@floating-ui/dom';\n\ntype FloatingControllerOptions = {\n target: HTMLElement;\n trigger: HTMLElement;\n alignment: string;\n\n arrowElement?: HTMLElement | undefined;\n flipArguments?: object;\n caret?: boolean;\n\n styleElement?: HTMLElement;\n matchWidth?: boolean;\n open: boolean;\n alignmentAxisOffset?: number;\n};\n\n/**\n * Controller for positioning the menu using Floating UI.\n */\nexport default class FloatingController implements ReactiveController {\n /**\n * Host component\n */\n private host: ReactiveElement;\n /**\n * Floating-ui options to pass to `computePlacement()`\n */\n private options!: FloatingControllerOptions;\n /**\n * cleanup function to stop auto updates\n */\n private cleanup?: () => void;\n\n /**\n * register with host component\n * @param host host component\n */\n constructor(host: ReactiveElement) {\n this.host = host;\n host.addController(this);\n }\n\n async setPlacement(options: FloatingControllerOptions = this.options) {\n this.options = options;\n const { trigger, target } = options;\n this.cleanup = autoUpdate(trigger, target, this.updatePlacement);\n }\n\n updatePlacement = (): void => {\n this.computePlacement();\n };\n\n async computePlacement() {\n const {\n arrowElement,\n alignment,\n caret,\n trigger,\n target,\n styleElement,\n matchWidth,\n open,\n flipArguments,\n alignmentAxisOffset,\n } = this.options;\n\n const element = styleElement ?? target;\n\n if (!element) return;\n\n let shimmedAlign;\n switch (alignment) {\n case 'top-left':\n shimmedAlign = 'top-start';\n break;\n case 'top-right':\n shimmedAlign = 'top-end';\n break;\n case 'bottom-left':\n shimmedAlign = 'bottom-start';\n break;\n case 'bottom-right':\n shimmedAlign = 'bottom-end';\n break;\n case 'left-bottom':\n shimmedAlign = 'left-end';\n break;\n case 'left-top':\n shimmedAlign = 'left-start';\n break;\n case 'right-bottom':\n shimmedAlign = 'right-end';\n break;\n case 'right-top':\n shimmedAlign = 'right-start';\n break;\n default:\n shimmedAlign = alignment;\n break;\n }\n\n const middleware = [\n flip(flipArguments),\n offset((alignmentAxisOffset ?? 0) + (caret ? 10 : 0)),\n ...(caret && arrowElement\n ? [arrow({ element: arrowElement, padding: 15 })]\n : []),\n ...(matchWidth && (shimmedAlign === 'bottom' || shimmedAlign === 'top')\n ? [\n size({\n apply({ rects, elements }) {\n elements.floating.style.width = `${rects.reference.width}px`;\n },\n }),\n ]\n : [\n size({\n apply({ elements }) {\n elements.floating.style.removeProperty('width');\n },\n }),\n ]),\n ];\n\n if (open) {\n const { x, y, placement, middlewareData, strategy } =\n await computePosition(trigger, element, {\n strategy: 'fixed',\n middleware,\n placement: shimmedAlign as Placement,\n });\n\n element.style.left = `${x}px`;\n element.style.top = `${y}px`;\n element.style.position = `${strategy}`;\n\n if (arrowElement) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- https://github.com/carbon-design-system/carbon/issues/20452\n // @ts-ignore\n const { x: arrowX, y: arrowY } = middlewareData.arrow;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- https://github.com/carbon-design-system/carbon/issues/20452\n const staticSide: any = {\n top: 'bottom',\n right: 'left',\n bottom: 'top',\n left: 'right',\n }[placement.split('-')[0]];\n\n arrowElement.style.left = arrowX != null ? `${arrowX}px` : '';\n arrowElement.style.top = arrowY != null ? `${arrowY}px` : '';\n arrowElement.style.right = '';\n arrowElement.style.bottom = '';\n arrowElement.style[staticSide] = `${-arrowElement.offsetWidth / 2}px`;\n }\n\n // adding specific case here where the style of the caret/arrow\n // is dependent on the placement\n // TODO: remove reference to slug in v12\n if (\n this.host.tagName === 'CDS-AI-LABEL' ||\n this.host.tagName === 'CDS-SLUG'\n ) {\n this.host?.setAttribute('alignment', placement);\n }\n }\n }\n\n hostUpdated(): void {\n if (!this.host.hasAttribute('open')) {\n this.cleanup?.();\n this.cleanup = undefined;\n }\n }\n\n hostDisconnected(): void {\n this.cleanup?.();\n this.cleanup = undefined;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"floating-controller.js","sources":["../../../src/globals/controllers/floating-controller.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2024, 2025\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 { ReactiveController, ReactiveElement } from 'lit';\nimport {\n computePosition,\n flip,\n size,\n offset,\n arrow,\n autoUpdate,\n hide,\n Placement,\n type Boundary,\n} from '@floating-ui/dom';\n\ntype FloatingControllerOptions = {\n target: HTMLElement;\n trigger: HTMLElement;\n alignment: string;\n\n arrowElement?: HTMLElement | undefined;\n flipArguments?: object;\n caret?: boolean;\n\n styleElement?: HTMLElement;\n matchWidth?: boolean;\n open: boolean;\n alignmentAxisOffset?: number;\n autoAlignBoundary?: Boundary;\n isTabTip?: boolean;\n};\n\n/**\n * Controller for positioning the menu using Floating UI.\n */\nexport default class FloatingController implements ReactiveController {\n /**\n * Host component\n */\n private host: ReactiveElement;\n /**\n * Floating-ui options to pass to `computePlacement()`\n */\n private options!: FloatingControllerOptions;\n /**\n * cleanup function to stop auto updates\n */\n private cleanup?: () => void;\n\n /**\n * register with host component\n * @param host host component\n */\n constructor(host: ReactiveElement) {\n this.host = host;\n host.addController(this);\n }\n\n async setPlacement(options: FloatingControllerOptions = this.options) {\n this.options = options;\n const { trigger, target } = options;\n this.cleanup = autoUpdate(trigger, target, this.updatePlacement);\n }\n\n updatePlacement = (): void => {\n this.computePlacement();\n };\n\n async computePlacement() {\n const {\n arrowElement,\n alignment,\n caret,\n trigger,\n target,\n styleElement,\n matchWidth,\n open,\n alignmentAxisOffset,\n autoAlignBoundary,\n isTabTip,\n } = this.options;\n\n const element = styleElement ?? target;\n\n if (!element) return;\n\n let shimmedAlign;\n switch (alignment) {\n case 'top-left':\n shimmedAlign = 'top-start';\n break;\n case 'top-right':\n shimmedAlign = 'top-end';\n break;\n case 'bottom-left':\n shimmedAlign = 'bottom-start';\n break;\n case 'bottom-right':\n shimmedAlign = 'bottom-end';\n break;\n case 'left-bottom':\n shimmedAlign = 'left-end';\n break;\n case 'left-top':\n shimmedAlign = 'left-start';\n break;\n case 'right-bottom':\n shimmedAlign = 'right-end';\n break;\n case 'right-top':\n shimmedAlign = 'right-start';\n break;\n default:\n shimmedAlign = alignment;\n break;\n }\n const cs = getComputedStyle(element);\n const toPx = (val: string) => {\n const raw = parseFloat(val);\n return val.trim().endsWith('rem') ? raw * 16 : raw;\n };\n const offsetPx = !isTabTip\n ? (toPx(cs.getPropertyValue('--cds-popover-offset').trim()) ?? 10)\n : 0;\n\n const middleware = [\n offset(\n caret && !isTabTip\n ? { alignmentAxis: alignmentAxisOffset, mainAxis: offsetPx }\n : 0\n ),\n flip({\n fallbackPlacements: isTabTip\n ? shimmedAlign.includes('bottom')\n ? ['bottom-start', 'bottom-end', 'top-start', 'top-end']\n : ['top-start', 'top-end', 'bottom-start', 'bottom-end']\n : shimmedAlign.includes('bottom')\n ? [\n 'bottom',\n 'bottom-start',\n 'bottom-end',\n 'right',\n 'right-start',\n 'right-end',\n 'left',\n 'left-start',\n 'left-end',\n 'top',\n 'top-start',\n 'top-end',\n ]\n : [\n 'top',\n 'top-start',\n 'top-end',\n 'left',\n 'left-start',\n 'left-end',\n 'right',\n 'right-start',\n 'right-end',\n 'bottom',\n 'bottom-start',\n 'bottom-end',\n ],\n\n fallbackStrategy: 'initialPlacement',\n fallbackAxisSideDirection: 'start',\n boundary: autoAlignBoundary,\n }),\n ...(matchWidth && (shimmedAlign === 'bottom' || shimmedAlign === 'top')\n ? [\n size({\n apply({ rects, elements }) {\n elements.floating.style.width = `${rects.reference.width}px`;\n },\n }),\n ]\n : [\n size({\n apply({ elements }) {\n elements.floating.style.removeProperty('width');\n },\n }),\n ]),\n\n ...(caret && arrowElement\n ? [arrow({ element: arrowElement, padding: 15 })]\n : []),\n\n ...[hide()],\n ];\n\n if (open) {\n const { x, y, placement, middlewareData, strategy } =\n await computePosition(trigger, element, {\n strategy: 'fixed',\n middleware,\n placement: shimmedAlign as Placement,\n });\n\n element.setAttribute('align', placement);\n\n element.style.left = `${x}px`;\n element.style.top = `${y}px`;\n element.style.position = `${strategy}`;\n\n element.style.visibility = middlewareData.hide?.referenceHidden\n ? 'hidden'\n : 'visible';\n\n if (arrowElement) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- https://github.com/carbon-design-system/carbon/issues/20452\n // @ts-ignore\n const { x: arrowX, y: arrowY } = middlewareData.arrow;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- https://github.com/carbon-design-system/carbon/issues/20452\n const staticSide: any = {\n top: 'bottom',\n right: 'left',\n bottom: 'top',\n left: 'right',\n }[placement.split('-')[0]];\n\n arrowElement.style.left = arrowX != null ? `${arrowX}px` : '';\n arrowElement.style.top = arrowY != null ? `${arrowY}px` : '';\n arrowElement.style.right = '';\n arrowElement.style.bottom = '';\n arrowElement.style[staticSide] = `${-arrowElement.offsetWidth / 2}px`;\n }\n\n // adding specific case here where the style of the caret/arrow\n // is dependent on the placement\n // TODO: remove reference to slug in v12\n if (\n this.host.tagName === 'CDS-AI-LABEL' ||\n this.host.tagName === 'CDS-SLUG'\n ) {\n this.host?.setAttribute('alignment', placement);\n }\n }\n }\n\n hostUpdated(): void {\n if (!this.host.hasAttribute('open')) {\n this.cleanup?.();\n this.cleanup = undefined;\n }\n }\n\n hostDisconnected(): void {\n this.cleanup?.();\n this.cleanup = undefined;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Copyright IBM Corp. 2019, 2024
2
+ * Copyright IBM Corp. 2019, 2025
3
3
  *
4
4
  * This source code is licensed under the Apache-2.0 license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -392,6 +392,10 @@ declare class CDSPopover extends CDSPopover_base {
392
392
  * Specify direction of alignment
393
393
  */
394
394
  align: string;
395
+ /**
396
+ * **Experimental:** Provide an offset value for alignment axis. Only takes effect when `autoalign` is enabled.
397
+ */
398
+ alignmentAxisOffset?: number;
395
399
  /**
396
400
  * Specify whether a auto align functionality should be applied
397
401
  */
@@ -424,6 +428,12 @@ declare class CDSPopover extends CDSPopover_base {
424
428
  * Specify the background token to use. Default is 'layer'.
425
429
  */
426
430
  backgroundToken: POPOVER_BACKGROUND_TOKEN;
431
+ /**
432
+ * Specify a bounding element to be used for autoAlign calculations. The viewport is used by default.
433
+ * Takes one of the following: 'clippingAncestors', '#elementid', '#elementid_1, #elementid_2', 'rect(x, y, width, height)'
434
+ * This prop is currently experimental and is subject to future changes.
435
+ */
436
+ autoAlignBoundary?: string;
427
437
  /**
428
438
  * Handles `slotchange` event.
429
439
  */
@@ -433,6 +443,14 @@ declare class CDSPopover extends CDSPopover_base {
433
443
  constructor();
434
444
  connectedCallback(): void;
435
445
  disconnectedCallback(): void;
446
+ /**
447
+ * This function resolves the string passed in for `autoAlignBoundary` to either:
448
+ * "clippingAncestors"
449
+ * An element (found via #id)
450
+ * An array of elements (found via #id1, #id2, #id3, separated by ",")
451
+ * A rect, input format should be 'rect(x,y,width,height)'
452
+ */
453
+ private _resolveAutoAlignBoundary;
436
454
  updated(changedProperties: any): void;
437
455
  render(): import("lit-html").TemplateResult<1>;
438
456
  /**
@@ -1,10 +1,11 @@
1
1
  /**
2
- * Copyright IBM Corp. 2024
2
+ * Copyright IBM Corp. 2024, 2025
3
3
  *
4
4
  * This source code is licensed under the Apache-2.0 license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
  import { ReactiveController, ReactiveElement } from 'lit';
8
+ import { type Boundary } from '@floating-ui/dom';
8
9
  type FloatingControllerOptions = {
9
10
  target: HTMLElement;
10
11
  trigger: HTMLElement;
@@ -16,6 +17,8 @@ type FloatingControllerOptions = {
16
17
  matchWidth?: boolean;
17
18
  open: boolean;
18
19
  alignmentAxisOffset?: number;
20
+ autoAlignBoundary?: Boundary;
21
+ isTabTip?: boolean;
19
22
  };
20
23
  /**
21
24
  * Controller for positioning the menu using Floating UI.
@@ -12,7 +12,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
12
12
  var dom = require('@floating-ui/dom');
13
13
 
14
14
  /**
15
- * Copyright IBM Corp. 2024
15
+ * Copyright IBM Corp. 2024, 2025
16
16
  *
17
17
  * This source code is licensed under the Apache-2.0 license found in the
18
18
  * LICENSE file in the root directory of this source tree.
@@ -38,8 +38,8 @@ class FloatingController {
38
38
  this.cleanup = dom.autoUpdate(trigger, target, this.updatePlacement);
39
39
  }
40
40
  async computePlacement() {
41
- var _a;
42
- const { arrowElement, alignment, caret, trigger, target, styleElement, matchWidth, open, flipArguments, alignmentAxisOffset, } = this.options;
41
+ var _a, _b, _c;
42
+ const { arrowElement, alignment, caret, trigger, target, styleElement, matchWidth, open, alignmentAxisOffset, autoAlignBoundary, isTabTip, } = this.options;
43
43
  const element = styleElement !== null && styleElement !== void 0 ? styleElement : target;
44
44
  if (!element)
45
45
  return;
@@ -73,12 +73,56 @@ class FloatingController {
73
73
  shimmedAlign = alignment;
74
74
  break;
75
75
  }
76
+ const cs = getComputedStyle(element);
77
+ const toPx = (val) => {
78
+ const raw = parseFloat(val);
79
+ return val.trim().endsWith('rem') ? raw * 16 : raw;
80
+ };
81
+ const offsetPx = !isTabTip
82
+ ? ((_a = toPx(cs.getPropertyValue('--cds-popover-offset').trim())) !== null && _a !== void 0 ? _a : 10)
83
+ : 0;
76
84
  const middleware = [
77
- dom.flip(flipArguments),
78
- dom.offset((alignmentAxisOffset !== null && alignmentAxisOffset !== void 0 ? alignmentAxisOffset : 0) + (caret ? 10 : 0)),
79
- ...(caret && arrowElement
80
- ? [dom.arrow({ element: arrowElement, padding: 15 })]
81
- : []),
85
+ dom.offset(caret && !isTabTip
86
+ ? { alignmentAxis: alignmentAxisOffset, mainAxis: offsetPx }
87
+ : 0),
88
+ dom.flip({
89
+ fallbackPlacements: isTabTip
90
+ ? shimmedAlign.includes('bottom')
91
+ ? ['bottom-start', 'bottom-end', 'top-start', 'top-end']
92
+ : ['top-start', 'top-end', 'bottom-start', 'bottom-end']
93
+ : shimmedAlign.includes('bottom')
94
+ ? [
95
+ 'bottom',
96
+ 'bottom-start',
97
+ 'bottom-end',
98
+ 'right',
99
+ 'right-start',
100
+ 'right-end',
101
+ 'left',
102
+ 'left-start',
103
+ 'left-end',
104
+ 'top',
105
+ 'top-start',
106
+ 'top-end',
107
+ ]
108
+ : [
109
+ 'top',
110
+ 'top-start',
111
+ 'top-end',
112
+ 'left',
113
+ 'left-start',
114
+ 'left-end',
115
+ 'right',
116
+ 'right-start',
117
+ 'right-end',
118
+ 'bottom',
119
+ 'bottom-start',
120
+ 'bottom-end',
121
+ ],
122
+ fallbackStrategy: 'initialPlacement',
123
+ fallbackAxisSideDirection: 'start',
124
+ boundary: autoAlignBoundary,
125
+ }),
82
126
  ...(matchWidth && (shimmedAlign === 'bottom' || shimmedAlign === 'top')
83
127
  ? [
84
128
  dom.size({
@@ -94,6 +138,10 @@ class FloatingController {
94
138
  },
95
139
  }),
96
140
  ]),
141
+ ...(caret && arrowElement
142
+ ? [dom.arrow({ element: arrowElement, padding: 15 })]
143
+ : []),
144
+ ...[dom.hide()],
97
145
  ];
98
146
  if (open) {
99
147
  const { x, y, placement, middlewareData, strategy } = await dom.computePosition(trigger, element, {
@@ -101,9 +149,13 @@ class FloatingController {
101
149
  middleware,
102
150
  placement: shimmedAlign,
103
151
  });
152
+ element.setAttribute('align', placement);
104
153
  element.style.left = `${x}px`;
105
154
  element.style.top = `${y}px`;
106
155
  element.style.position = `${strategy}`;
156
+ element.style.visibility = ((_b = middlewareData.hide) === null || _b === void 0 ? void 0 : _b.referenceHidden)
157
+ ? 'hidden'
158
+ : 'visible';
107
159
  if (arrowElement) {
108
160
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- https://github.com/carbon-design-system/carbon/issues/20452
109
161
  // @ts-ignore
@@ -126,7 +178,7 @@ class FloatingController {
126
178
  // TODO: remove reference to slug in v12
127
179
  if (this.host.tagName === 'CDS-AI-LABEL' ||
128
180
  this.host.tagName === 'CDS-SLUG') {
129
- (_a = this.host) === null || _a === void 0 ? void 0 : _a.setAttribute('alignment', placement);
181
+ (_c = this.host) === null || _c === void 0 ? void 0 : _c.setAttribute('alignment', placement);
130
182
  }
131
183
  }
132
184
  }
@@ -1 +1 @@
1
- {"version":3,"file":"floating-controller.js","sources":["../../../src/globals/controllers/floating-controller.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2024\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 { ReactiveController, ReactiveElement } from 'lit';\nimport {\n computePosition,\n flip,\n size,\n offset,\n arrow,\n autoUpdate,\n Placement,\n} from '@floating-ui/dom';\n\ntype FloatingControllerOptions = {\n target: HTMLElement;\n trigger: HTMLElement;\n alignment: string;\n\n arrowElement?: HTMLElement | undefined;\n flipArguments?: object;\n caret?: boolean;\n\n styleElement?: HTMLElement;\n matchWidth?: boolean;\n open: boolean;\n alignmentAxisOffset?: number;\n};\n\n/**\n * Controller for positioning the menu using Floating UI.\n */\nexport default class FloatingController implements ReactiveController {\n /**\n * Host component\n */\n private host: ReactiveElement;\n /**\n * Floating-ui options to pass to `computePlacement()`\n */\n private options!: FloatingControllerOptions;\n /**\n * cleanup function to stop auto updates\n */\n private cleanup?: () => void;\n\n /**\n * register with host component\n * @param host host component\n */\n constructor(host: ReactiveElement) {\n this.host = host;\n host.addController(this);\n }\n\n async setPlacement(options: FloatingControllerOptions = this.options) {\n this.options = options;\n const { trigger, target } = options;\n this.cleanup = autoUpdate(trigger, target, this.updatePlacement);\n }\n\n updatePlacement = (): void => {\n this.computePlacement();\n };\n\n async computePlacement() {\n const {\n arrowElement,\n alignment,\n caret,\n trigger,\n target,\n styleElement,\n matchWidth,\n open,\n flipArguments,\n alignmentAxisOffset,\n } = this.options;\n\n const element = styleElement ?? target;\n\n if (!element) return;\n\n let shimmedAlign;\n switch (alignment) {\n case 'top-left':\n shimmedAlign = 'top-start';\n break;\n case 'top-right':\n shimmedAlign = 'top-end';\n break;\n case 'bottom-left':\n shimmedAlign = 'bottom-start';\n break;\n case 'bottom-right':\n shimmedAlign = 'bottom-end';\n break;\n case 'left-bottom':\n shimmedAlign = 'left-end';\n break;\n case 'left-top':\n shimmedAlign = 'left-start';\n break;\n case 'right-bottom':\n shimmedAlign = 'right-end';\n break;\n case 'right-top':\n shimmedAlign = 'right-start';\n break;\n default:\n shimmedAlign = alignment;\n break;\n }\n\n const middleware = [\n flip(flipArguments),\n offset((alignmentAxisOffset ?? 0) + (caret ? 10 : 0)),\n ...(caret && arrowElement\n ? [arrow({ element: arrowElement, padding: 15 })]\n : []),\n ...(matchWidth && (shimmedAlign === 'bottom' || shimmedAlign === 'top')\n ? [\n size({\n apply({ rects, elements }) {\n elements.floating.style.width = `${rects.reference.width}px`;\n },\n }),\n ]\n : [\n size({\n apply({ elements }) {\n elements.floating.style.removeProperty('width');\n },\n }),\n ]),\n ];\n\n if (open) {\n const { x, y, placement, middlewareData, strategy } =\n await computePosition(trigger, element, {\n strategy: 'fixed',\n middleware,\n placement: shimmedAlign as Placement,\n });\n\n element.style.left = `${x}px`;\n element.style.top = `${y}px`;\n element.style.position = `${strategy}`;\n\n if (arrowElement) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- https://github.com/carbon-design-system/carbon/issues/20452\n // @ts-ignore\n const { x: arrowX, y: arrowY } = middlewareData.arrow;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- https://github.com/carbon-design-system/carbon/issues/20452\n const staticSide: any = {\n top: 'bottom',\n right: 'left',\n bottom: 'top',\n left: 'right',\n }[placement.split('-')[0]];\n\n arrowElement.style.left = arrowX != null ? `${arrowX}px` : '';\n arrowElement.style.top = arrowY != null ? `${arrowY}px` : '';\n arrowElement.style.right = '';\n arrowElement.style.bottom = '';\n arrowElement.style[staticSide] = `${-arrowElement.offsetWidth / 2}px`;\n }\n\n // adding specific case here where the style of the caret/arrow\n // is dependent on the placement\n // TODO: remove reference to slug in v12\n if (\n this.host.tagName === 'CDS-AI-LABEL' ||\n this.host.tagName === 'CDS-SLUG'\n ) {\n this.host?.setAttribute('alignment', placement);\n }\n }\n }\n\n hostUpdated(): void {\n if (!this.host.hasAttribute('open')) {\n this.cleanup?.();\n this.cleanup = undefined;\n }\n }\n\n hostDisconnected(): void {\n this.cleanup?.();\n this.cleanup = undefined;\n }\n}\n"],"names":["autoUpdate","flip","offset","arrow","size","computePosition"],"mappings":"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"}
1
+ {"version":3,"file":"floating-controller.js","sources":["../../../src/globals/controllers/floating-controller.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2024, 2025\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 { ReactiveController, ReactiveElement } from 'lit';\nimport {\n computePosition,\n flip,\n size,\n offset,\n arrow,\n autoUpdate,\n hide,\n Placement,\n type Boundary,\n} from '@floating-ui/dom';\n\ntype FloatingControllerOptions = {\n target: HTMLElement;\n trigger: HTMLElement;\n alignment: string;\n\n arrowElement?: HTMLElement | undefined;\n flipArguments?: object;\n caret?: boolean;\n\n styleElement?: HTMLElement;\n matchWidth?: boolean;\n open: boolean;\n alignmentAxisOffset?: number;\n autoAlignBoundary?: Boundary;\n isTabTip?: boolean;\n};\n\n/**\n * Controller for positioning the menu using Floating UI.\n */\nexport default class FloatingController implements ReactiveController {\n /**\n * Host component\n */\n private host: ReactiveElement;\n /**\n * Floating-ui options to pass to `computePlacement()`\n */\n private options!: FloatingControllerOptions;\n /**\n * cleanup function to stop auto updates\n */\n private cleanup?: () => void;\n\n /**\n * register with host component\n * @param host host component\n */\n constructor(host: ReactiveElement) {\n this.host = host;\n host.addController(this);\n }\n\n async setPlacement(options: FloatingControllerOptions = this.options) {\n this.options = options;\n const { trigger, target } = options;\n this.cleanup = autoUpdate(trigger, target, this.updatePlacement);\n }\n\n updatePlacement = (): void => {\n this.computePlacement();\n };\n\n async computePlacement() {\n const {\n arrowElement,\n alignment,\n caret,\n trigger,\n target,\n styleElement,\n matchWidth,\n open,\n alignmentAxisOffset,\n autoAlignBoundary,\n isTabTip,\n } = this.options;\n\n const element = styleElement ?? target;\n\n if (!element) return;\n\n let shimmedAlign;\n switch (alignment) {\n case 'top-left':\n shimmedAlign = 'top-start';\n break;\n case 'top-right':\n shimmedAlign = 'top-end';\n break;\n case 'bottom-left':\n shimmedAlign = 'bottom-start';\n break;\n case 'bottom-right':\n shimmedAlign = 'bottom-end';\n break;\n case 'left-bottom':\n shimmedAlign = 'left-end';\n break;\n case 'left-top':\n shimmedAlign = 'left-start';\n break;\n case 'right-bottom':\n shimmedAlign = 'right-end';\n break;\n case 'right-top':\n shimmedAlign = 'right-start';\n break;\n default:\n shimmedAlign = alignment;\n break;\n }\n const cs = getComputedStyle(element);\n const toPx = (val: string) => {\n const raw = parseFloat(val);\n return val.trim().endsWith('rem') ? raw * 16 : raw;\n };\n const offsetPx = !isTabTip\n ? (toPx(cs.getPropertyValue('--cds-popover-offset').trim()) ?? 10)\n : 0;\n\n const middleware = [\n offset(\n caret && !isTabTip\n ? { alignmentAxis: alignmentAxisOffset, mainAxis: offsetPx }\n : 0\n ),\n flip({\n fallbackPlacements: isTabTip\n ? shimmedAlign.includes('bottom')\n ? ['bottom-start', 'bottom-end', 'top-start', 'top-end']\n : ['top-start', 'top-end', 'bottom-start', 'bottom-end']\n : shimmedAlign.includes('bottom')\n ? [\n 'bottom',\n 'bottom-start',\n 'bottom-end',\n 'right',\n 'right-start',\n 'right-end',\n 'left',\n 'left-start',\n 'left-end',\n 'top',\n 'top-start',\n 'top-end',\n ]\n : [\n 'top',\n 'top-start',\n 'top-end',\n 'left',\n 'left-start',\n 'left-end',\n 'right',\n 'right-start',\n 'right-end',\n 'bottom',\n 'bottom-start',\n 'bottom-end',\n ],\n\n fallbackStrategy: 'initialPlacement',\n fallbackAxisSideDirection: 'start',\n boundary: autoAlignBoundary,\n }),\n ...(matchWidth && (shimmedAlign === 'bottom' || shimmedAlign === 'top')\n ? [\n size({\n apply({ rects, elements }) {\n elements.floating.style.width = `${rects.reference.width}px`;\n },\n }),\n ]\n : [\n size({\n apply({ elements }) {\n elements.floating.style.removeProperty('width');\n },\n }),\n ]),\n\n ...(caret && arrowElement\n ? [arrow({ element: arrowElement, padding: 15 })]\n : []),\n\n ...[hide()],\n ];\n\n if (open) {\n const { x, y, placement, middlewareData, strategy } =\n await computePosition(trigger, element, {\n strategy: 'fixed',\n middleware,\n placement: shimmedAlign as Placement,\n });\n\n element.setAttribute('align', placement);\n\n element.style.left = `${x}px`;\n element.style.top = `${y}px`;\n element.style.position = `${strategy}`;\n\n element.style.visibility = middlewareData.hide?.referenceHidden\n ? 'hidden'\n : 'visible';\n\n if (arrowElement) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- https://github.com/carbon-design-system/carbon/issues/20452\n // @ts-ignore\n const { x: arrowX, y: arrowY } = middlewareData.arrow;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- https://github.com/carbon-design-system/carbon/issues/20452\n const staticSide: any = {\n top: 'bottom',\n right: 'left',\n bottom: 'top',\n left: 'right',\n }[placement.split('-')[0]];\n\n arrowElement.style.left = arrowX != null ? `${arrowX}px` : '';\n arrowElement.style.top = arrowY != null ? `${arrowY}px` : '';\n arrowElement.style.right = '';\n arrowElement.style.bottom = '';\n arrowElement.style[staticSide] = `${-arrowElement.offsetWidth / 2}px`;\n }\n\n // adding specific case here where the style of the caret/arrow\n // is dependent on the placement\n // TODO: remove reference to slug in v12\n if (\n this.host.tagName === 'CDS-AI-LABEL' ||\n this.host.tagName === 'CDS-SLUG'\n ) {\n this.host?.setAttribute('alignment', placement);\n }\n }\n }\n\n hostUpdated(): void {\n if (!this.host.hasAttribute('open')) {\n this.cleanup?.();\n this.cleanup = undefined;\n }\n }\n\n hostDisconnected(): void {\n this.cleanup?.();\n this.cleanup = undefined;\n }\n}\n"],"names":["autoUpdate","offset","flip","size","arrow","hide","computePosition"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@carbon/web-components",
3
3
  "description": "Web components for the Carbon Design System",
4
- "version": "2.42.0-rc.0",
4
+ "version": "2.42.0",
5
5
  "license": "Apache-2.0",
6
6
  "main": "es/index.js",
7
7
  "module": "es/index.js",
@@ -67,7 +67,7 @@
67
67
  },
68
68
  "dependencies": {
69
69
  "@carbon/icon-helpers": "10.47.0",
70
- "@carbon/styles": "^1.94.0-rc.0",
70
+ "@carbon/styles": "^1.94.0",
71
71
  "@floating-ui/dom": "^1.6.3",
72
72
  "@ibm/telemetry-js": "^1.10.2",
73
73
  "@lit/context": "^1.1.3",
@@ -130,5 +130,5 @@
130
130
  }
131
131
  ]
132
132
  },
133
- "gitHead": "ba9072cd72b1d664f26a3c984e2f7d694280175b"
133
+ "gitHead": "4bb1c57e936fa6a1527a4d6483668ecf3cfff51f"
134
134
  }
@@ -5,6 +5,20 @@
5
5
  // LICENSE file in the root directory of this source tree.
6
6
  //
7
7
 
8
+ @use '@carbon/styles/scss/config' as *;
8
9
  @use '../skeleton-text/skeleton-text';
9
10
  @use '../skeleton-icon/skeleton-icon';
10
11
  @use '../skeleton-placeholder/skeleton-placeholder';
12
+
13
+ :host(#{$prefix}-ai-skeleton-text) {
14
+ display: block;
15
+ inline-size: 100%;
16
+ }
17
+
18
+ :host(#{$prefix}-ai-skeleton-placeholder) {
19
+ display: block;
20
+ }
21
+
22
+ :host(#{$prefix}-ai-skeleton-icon) {
23
+ display: inline-block;
24
+ }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Copyright IBM Corp. 2019, 2024
2
+ * Copyright IBM Corp. 2019, 2025
3
3
  *
4
4
  * This source code is licensed under the Apache-2.0 license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -90,6 +90,7 @@
90
90
  @include type.type-style('heading-compact-01');
91
91
 
92
92
  margin-block-end: $spacing-01;
93
+ text-align: start;
93
94
  }
94
95
 
95
96
  #{$prefix}-popover .popover-details {