@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.
- package/custom-elements.json +44 -0
- package/dist/accordion.min.js +2 -2
- package/dist/ai-label.min.js +2 -2
- package/dist/ai-skeleton.min.js +2 -2
- package/dist/badge-indicator.min.js +2 -2
- package/dist/breadcrumb.min.js +2 -2
- package/dist/{button-B1zomRlI.js → button-eTloXzqX.js} +2 -2
- package/dist/{button-skeleton-B07ZbxzX.js → button-skeleton-Dk3chlBc.js} +2 -2
- package/dist/button.min.js +2 -2
- package/dist/chat-button.min.js +2 -2
- package/dist/{checkbox-B0vLnC5o.js → checkbox-cr5-wvt1.js} +2 -2
- package/dist/checkbox.min.js +2 -2
- package/dist/{class-map-D6fczokn.js → class-map-CJoc5JjN.js} +2 -2
- package/dist/code-snippet.min.js +2 -2
- package/dist/combo-box.min.js +2 -2
- package/dist/combo-button.min.js +2 -2
- package/dist/{content-switcher-item-C4k2qhq1.js → content-switcher-item-VHI7iTTP.js} +2 -2
- package/dist/content-switcher.min.js +2 -2
- package/dist/copy-button.min.js +2 -2
- package/dist/data-table.min.js +4 -4
- package/dist/date-picker.min.js +2 -2
- package/dist/{dropdown-item-Di3D8IQv.js → dropdown-item-Pt_eWt66.js} +2 -2
- package/dist/dropdown.min.js +2 -2
- package/dist/feature-flags.min.js +2 -2
- package/dist/file-uploader.min.js +2 -2
- package/dist/floating-controller-DLpRVhGd.js +28 -0
- package/dist/floating-menu.min.js +2 -2
- package/dist/fluid-text-input.min.js +2 -2
- package/dist/{focus-Cz1b3uzn.js → focus-yD1Q_pDt.js} +2 -2
- package/dist/{form-C8GJptS1.js → form-BaYTr2z0.js} +2 -2
- package/dist/form-group.min.js +2 -2
- package/dist/form.min.js +2 -2
- package/dist/grid.min.js +2 -2
- package/dist/heading.min.js +2 -2
- package/dist/{host-listener-CE9SgANI.js → host-listener-BJsBtsIt.js} +2 -2
- package/dist/icon-button.min.js +2 -2
- package/dist/icon-indicator.min.js +2 -2
- package/dist/{icon-loader-B3Da-Uq8.js → icon-loader-CqB9WRMP.js} +2 -2
- package/dist/{icon-loader-utils-BN__f45E.js → icon-loader-utils-DUl0vwdh.js} +2 -2
- package/dist/icon.min.js +2 -2
- package/dist/{if-defined-CYiNZJ6y.js → if-defined-IxozbDOJ.js} +2 -2
- package/dist/{if-non-empty-BVPYbR8i.js → if-non-empty-CqQHBHdQ.js} +2 -2
- package/dist/inline-loading.min.js +2 -2
- package/dist/layer.min.js +2 -2
- package/dist/link.min.js +2 -2
- package/dist/list.min.js +2 -2
- package/dist/{loading-icon-CcE3BBZu.js → loading-icon-CSgLYhyw.js} +2 -2
- package/dist/loading.min.js +2 -2
- package/dist/menu-button.min.js +2 -2
- package/dist/menu.min.js +2 -2
- package/dist/modal.min.js +3 -3
- package/dist/multi-select.min.js +2 -2
- package/dist/notification.min.js +2 -2
- package/dist/number-input.min.js +2 -2
- package/dist/overflow-menu.min.js +2 -2
- package/dist/page-header.min.js +2 -2
- package/dist/pagination.min.js +2 -2
- package/dist/password-input.min.js +2 -2
- package/dist/popover.min.js +10 -11
- package/dist/progress-bar.min.js +2 -2
- package/dist/progress-indicator.min.js +2 -2
- package/dist/{property-9iekpRAy.js → property-B_F7V5eB.js} +2 -2
- package/dist/{query-assigned-elements-BWBKpcF7.js → query-assigned-elements-DeMmXVMb.js} +2 -2
- package/dist/radio-button.min.js +2 -2
- package/dist/{search-uwRFrBOz.js → search-BrKCrPl3.js} +2 -2
- package/dist/search.min.js +2 -2
- package/dist/{select-DpavENph.js → select-Dwsf_c0t.js} +2 -2
- package/dist/select.min.js +2 -2
- package/dist/shape-indicator.min.js +2 -2
- package/dist/side-panel.min.js +2 -2
- package/dist/skeleton-icon.min.js +2 -2
- package/dist/skeleton-placeholder.min.js +2 -2
- package/dist/skeleton-text.min.js +2 -2
- package/dist/skip-to-content.min.js +2 -2
- package/dist/slider.min.js +2 -2
- package/dist/slug.min.js +3 -3
- package/dist/stack.min.js +2 -2
- package/dist/{state-BuG_dMhZ.js → state-CJQmj6wG.js} +2 -2
- package/dist/structured-list.min.js +2 -2
- package/dist/tabs.min.js +2 -2
- package/dist/tag.min.js +2 -2
- package/dist/tearsheet.min.js +2 -2
- package/dist/{text-input-CH2K_Vha.js → text-input-C0qeKR9e.js} +2 -2
- package/dist/text-input.min.js +2 -2
- package/dist/textarea.min.js +2 -2
- package/dist/tile.min.js +2 -2
- package/dist/time-picker.min.js +2 -2
- package/dist/toggle-tip.min.js +2 -2
- package/dist/toggle.min.js +2 -2
- package/dist/{tooltip-content-DMy2swEb.js → tooltip-content-CMbdEoxb.js} +2 -2
- package/dist/tooltip.min.js +2 -2
- package/dist/tree-view.min.js +2 -2
- package/dist/ui-shell.min.js +2 -2
- package/dist/{unsafe-html-DVA3vXNw.js → unsafe-html-Dqv0UqC_.js} +2 -2
- package/es/components/ai-label/ai-label.scss.js +1 -1
- package/es/components/ai-skeleton/ai-skeleton.scss.js +1 -1
- package/es/components/data-table/table.js +2 -2
- package/es/components/data-table/table.js.map +1 -1
- package/es/components/icon-button/icon-button.scss.js +1 -1
- package/es/components/modal/modal.scss.js +1 -1
- package/es/components/pagination/pagination.scss.js +1 -1
- package/es/components/popover/popover-content.d.ts +1 -1
- package/es/components/popover/popover-content.js +13 -15
- package/es/components/popover/popover-content.js.map +1 -1
- package/es/components/popover/popover.d.ts +18 -0
- package/es/components/popover/popover.js +80 -6
- package/es/components/popover/popover.js.map +1 -1
- package/es/components/popover/popover.scss.js +1 -1
- package/es/components/slug/slug.scss.js +1 -1
- package/es/components/toggle-tip/toggletip.scss.js +1 -1
- package/es/components/tooltip/tooltip.scss.js +1 -1
- package/es/globals/controllers/floating-controller.d.ts +4 -1
- package/es/globals/controllers/floating-controller.js +62 -10
- package/es/globals/controllers/floating-controller.js.map +1 -1
- package/es-custom/components/ai-label/ai-label.scss.js +1 -1
- package/es-custom/components/ai-skeleton/ai-skeleton.scss.js +1 -1
- package/es-custom/components/data-table/table.js +2 -2
- package/es-custom/components/data-table/table.js.map +1 -1
- package/es-custom/components/icon-button/icon-button.scss.js +1 -1
- package/es-custom/components/modal/modal.scss.js +1 -1
- package/es-custom/components/pagination/pagination.scss.js +1 -1
- package/es-custom/components/popover/popover-content.d.ts +1 -1
- package/es-custom/components/popover/popover-content.js +13 -15
- package/es-custom/components/popover/popover-content.js.map +1 -1
- package/es-custom/components/popover/popover.d.ts +18 -0
- package/es-custom/components/popover/popover.js +80 -6
- package/es-custom/components/popover/popover.js.map +1 -1
- package/es-custom/components/popover/popover.scss.js +1 -1
- package/es-custom/components/slug/slug.scss.js +1 -1
- package/es-custom/components/toggle-tip/toggletip.scss.js +1 -1
- package/es-custom/components/tooltip/tooltip.scss.js +1 -1
- package/es-custom/globals/controllers/floating-controller.d.ts +4 -1
- package/es-custom/globals/controllers/floating-controller.js +62 -10
- package/es-custom/globals/controllers/floating-controller.js.map +1 -1
- package/lib/components/popover/popover-content.d.ts +1 -1
- package/lib/components/popover/popover.d.ts +18 -0
- package/lib/globals/controllers/floating-controller.d.ts +4 -1
- package/lib/globals/controllers/floating-controller.js +61 -9
- package/lib/globals/controllers/floating-controller.js.map +1 -1
- package/package.json +3 -3
- package/scss/components/ai-skeleton/ai-skeleton.scss +14 -0
- package/scss/components/popover/popover-story.scss +2 -1
- package/scss/components/popover/popover.scss +149 -14
- package/telemetry.yml +1 -0
- package/dist/floating-controller-DjEAkoHn.js +0 -28
- package/dist/{16-fd4Ivo6o.js → 16-B3Yskhl0.js} +1 -1
- package/dist/{16-Bf5-IrA2.js → 16-B46MLj4i.js} +1 -1
- package/dist/{16-BZ-sICMc.js → 16-B7MRS_3W.js} +1 -1
- package/dist/{16-BKRNDebk.js → 16-BWlgPBcu.js} +1 -1
- package/dist/{16-5IO66qZv.js → 16-Bf2P7KMJ.js} +1 -1
- package/dist/{16-BplvdDlD.js → 16-Bxm7Omxq.js} +1 -1
- package/dist/{16-Ctf1-GU4.js → 16-CJNlj_0b.js} +1 -1
- package/dist/{16-DszCKQWk.js → 16-CdxGkvXO.js} +1 -1
- package/dist/{16-Cl1JRwhU.js → 16-DTvjc9uv.js} +1 -1
- package/dist/{16-B5nukGIX.js → 16-DhAznVKm.js} +1 -1
- package/dist/{16-BZbjCIdx.js → 16-DoN7q01_.js} +1 -1
- package/dist/{16-DussDP25.js → 16-GKRs-ALp.js} +1 -1
- package/dist/{20-BHvYOxYo.js → 20-CuEbZLGA.js} +1 -1
- package/dist/{20-dwKc_1p5.js → 20-DlknbFYR.js} +1 -1
- package/dist/{carbon-element-BZWjx64-.js → carbon-element-DDrYm3XO.js} +1 -1
- package/dist/{collection-helpers-CcXpRZP7.js → collection-helpers-_CvqQaiX.js} +1 -1
- package/dist/{consume-D8po478F.js → consume-BeeFGGfo.js} +1 -1
- package/dist/{directive-Dkgne8TP.js → directive-Dlo2OKiC.js} +1 -1
- package/dist/{host-listener-CEVyo9Gf.js → host-listener-BCnAWDV7.js} +1 -1
- package/dist/{lit-element-D-2dOK7a.js → lit-element-eFlPHqE1.js} +1 -1
- package/dist/{on-Dx8_n3Zi.js → on-DvnWS_DB.js} +1 -1
- package/dist/{query-BMt73bSi.js → query-BdmT5Ln1.js} +1 -1
- package/dist/{radio-group-manager-BFkEoNf7.js → radio-group-manager-B_pENWmT.js} +1 -1
- package/dist/{settings-1amR4med.js → settings-BBN_bDP6.js} +1 -1
- package/dist/{shared-enums-HvMnAeAT.js → shared-enums-D8TrS6Ts.js} +1 -1
- 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,
|
|
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,
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
-
(
|
|
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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"}
|
|
@@ -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,
|
|
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.
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
-
(
|
|
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
|
|
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
|
|
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": "
|
|
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,
|
|
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 {
|