@carbon/ibm-products-web-components 0.45.0 → 0.46.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 +494 -19
- package/es/components/add-select/add-select-body.d.ts +15 -10
- package/es/components/add-select/add-select-body.d.ts.map +1 -1
- package/es/components/add-select/add-select-body.js +95 -73
- package/es/components/add-select/add-select-body.js.map +1 -1
- package/es/components/add-select/add-select-body.scss.js +1 -1
- package/es/components/add-select/add-select-body.scss.js.map +1 -1
- package/es/components/add-select/add-select-column.d.ts +83 -0
- package/es/components/add-select/add-select-column.d.ts.map +1 -0
- package/es/components/add-select/add-select-column.js +217 -0
- package/es/components/add-select/add-select-column.js.map +1 -0
- package/es/components/add-select/add-select-column.scss.js +14 -0
- package/es/components/add-select/add-select-column.scss.js.map +1 -0
- package/es/components/add-select/add-select-item-panel.d.ts +58 -0
- package/es/components/add-select/add-select-item-panel.d.ts.map +1 -0
- package/es/components/add-select/add-select-item-panel.js +162 -0
- package/es/components/add-select/add-select-item-panel.js.map +1 -0
- package/es/components/add-select/add-select-item-panel.scss.js +14 -0
- package/es/components/add-select/add-select-item-panel.scss.js.map +1 -0
- package/es/components/add-select/add-select-row.d.ts +42 -2
- package/es/components/add-select/add-select-row.d.ts.map +1 -1
- package/es/components/add-select/add-select-row.js +143 -23
- package/es/components/add-select/add-select-row.js.map +1 -1
- package/es/components/add-select/add-select-row.scss.js +1 -1
- package/es/components/add-select/add-select-row.scss.js.map +1 -1
- package/es/components/add-select/add-select-selection-summary-item.d.ts +64 -0
- package/es/components/add-select/add-select-selection-summary-item.d.ts.map +1 -0
- package/es/components/add-select/add-select-selection-summary-item.js +279 -0
- package/es/components/add-select/add-select-selection-summary-item.js.map +1 -0
- package/es/components/add-select/add-select-selection-summary-item.scss.js +14 -0
- package/es/components/add-select/add-select-selection-summary-item.scss.js.map +1 -0
- package/es/components/add-select/add-select-selection-summary.d.ts +48 -0
- package/es/components/add-select/add-select-selection-summary.d.ts.map +1 -0
- package/es/components/add-select/add-select-selection-summary.js +118 -0
- package/es/components/add-select/add-select-selection-summary.js.map +1 -0
- package/es/components/add-select/add-select-selection-summary.scss.js +14 -0
- package/es/components/add-select/add-select-selection-summary.scss.js.map +1 -0
- package/es/components/add-select/add-select.scss.js +1 -1
- package/es/components/add-select/index.d.ts +4 -1
- package/es/components/add-select/index.d.ts.map +1 -1
- package/es/components/add-select/index.js +4 -1
- package/es/components/coachmark/coachmark-header.js +2 -2
- package/es/components/coachmark/coachmark-header.js.map +1 -1
- package/es/components/edit-in-place/edit-in-place.js +2 -2
- package/es/components/edit-in-place/edit-in-place.js.map +1 -1
- package/es/components/guide-banner/guide-banner.js +2 -2
- package/es/components/guide-banner/guide-banner.js.map +1 -1
- package/es/components/notification-panel/notification.js +2 -2
- package/es/components/notification-panel/notification.js.map +1 -1
- package/es/components/side-panel/side-panel.js +2 -2
- package/es/components/side-panel/side-panel.js.map +1 -1
- package/es/components/tearsheet/tearsheet.scss.js +1 -1
- package/es/ibm-products-utilities/src/utils/add-select/add-select-data.js.map +1 -1
- package/es/ibm-products-web-components/package.js +1 -1
- package/es-custom/components/add-select/add-select-body.js +95 -73
- package/es-custom/components/add-select/add-select-body.js.map +1 -1
- package/es-custom/components/add-select/add-select-body.scss.js +1 -1
- package/es-custom/components/add-select/add-select-body.scss.js.map +1 -1
- package/es-custom/components/add-select/add-select-column.js +217 -0
- package/es-custom/components/add-select/add-select-column.js.map +1 -0
- package/es-custom/components/add-select/add-select-column.scss.js +14 -0
- package/es-custom/components/add-select/add-select-column.scss.js.map +1 -0
- package/es-custom/components/add-select/add-select-item-panel.js +162 -0
- package/es-custom/components/add-select/add-select-item-panel.js.map +1 -0
- package/es-custom/components/add-select/add-select-item-panel.scss.js +14 -0
- package/es-custom/components/add-select/add-select-item-panel.scss.js.map +1 -0
- package/es-custom/components/add-select/add-select-row.js +143 -23
- package/es-custom/components/add-select/add-select-row.js.map +1 -1
- package/es-custom/components/add-select/add-select-row.scss.js +1 -1
- package/es-custom/components/add-select/add-select-row.scss.js.map +1 -1
- package/es-custom/components/add-select/add-select-selection-summary-item.js +279 -0
- package/es-custom/components/add-select/add-select-selection-summary-item.js.map +1 -0
- package/es-custom/components/add-select/add-select-selection-summary-item.scss.js +14 -0
- package/es-custom/components/add-select/add-select-selection-summary-item.scss.js.map +1 -0
- package/es-custom/components/add-select/add-select-selection-summary.js +118 -0
- package/es-custom/components/add-select/add-select-selection-summary.js.map +1 -0
- package/es-custom/components/add-select/add-select-selection-summary.scss.js +14 -0
- package/es-custom/components/add-select/add-select-selection-summary.scss.js.map +1 -0
- package/es-custom/components/add-select/add-select.scss.js +1 -1
- package/es-custom/components/add-select/index.js +4 -1
- package/es-custom/components/coachmark/coachmark-header.js +2 -2
- package/es-custom/components/coachmark/coachmark-header.js.map +1 -1
- package/es-custom/components/edit-in-place/edit-in-place.js +2 -2
- package/es-custom/components/edit-in-place/edit-in-place.js.map +1 -1
- package/es-custom/components/guide-banner/guide-banner.js +2 -2
- package/es-custom/components/guide-banner/guide-banner.js.map +1 -1
- package/es-custom/components/notification-panel/notification.js +2 -2
- package/es-custom/components/notification-panel/notification.js.map +1 -1
- package/es-custom/components/side-panel/side-panel.js +2 -2
- package/es-custom/components/side-panel/side-panel.js.map +1 -1
- package/es-custom/components/tearsheet/tearsheet.scss.js +1 -1
- package/es-custom/ibm-products-utilities/src/utils/add-select/add-select-data.js.map +1 -1
- package/es-custom/ibm-products-web-components/package.js +1 -1
- package/lib/components/add-select/add-select-body.d.ts +15 -10
- package/lib/components/add-select/add-select-body.d.ts.map +1 -1
- package/lib/components/add-select/add-select-column.d.ts +83 -0
- package/lib/components/add-select/add-select-column.d.ts.map +1 -0
- package/lib/components/add-select/add-select-item-panel.d.ts +58 -0
- package/lib/components/add-select/add-select-item-panel.d.ts.map +1 -0
- package/lib/components/add-select/add-select-row.d.ts +42 -2
- package/lib/components/add-select/add-select-row.d.ts.map +1 -1
- package/lib/components/add-select/add-select-selection-summary-item.d.ts +64 -0
- package/lib/components/add-select/add-select-selection-summary-item.d.ts.map +1 -0
- package/lib/components/add-select/add-select-selection-summary.d.ts +48 -0
- package/lib/components/add-select/add-select-selection-summary.d.ts.map +1 -0
- package/lib/components/add-select/index.d.ts +4 -1
- package/lib/components/add-select/index.d.ts.map +1 -1
- package/package.json +7 -6
- package/scss/components/add-select/add-select-body.scss +36 -4
- package/scss/components/add-select/add-select-column.scss +81 -0
- package/scss/components/add-select/add-select-item-panel.scss +85 -0
- package/scss/components/add-select/add-select-row.scss +76 -9
- package/scss/components/add-select/add-select-selection-summary-item.scss +227 -0
- package/scss/components/add-select/add-select-selection-summary.scss +58 -0
- package/telemetry.yml +34 -5
- package/es/components/add-select/add-select-content.d.ts +0 -57
- package/es/components/add-select/add-select-content.d.ts.map +0 -1
- package/es/components/add-select/add-select-content.js +0 -188
- package/es/components/add-select/add-select-content.js.map +0 -1
- package/es/components/add-select/add-select-content.scss.js +0 -14
- package/es/components/add-select/add-select-content.scss.js.map +0 -1
- package/es-custom/components/add-select/add-select-content.js +0 -188
- package/es-custom/components/add-select/add-select-content.js.map +0 -1
- package/es-custom/components/add-select/add-select-content.scss.js +0 -14
- package/es-custom/components/add-select/add-select-content.scss.js.map +0 -1
- package/lib/components/add-select/add-select-content.d.ts +0 -57
- package/lib/components/add-select/add-select-content.d.ts.map +0 -1
- package/scss/components/add-select/add-select-content.scss +0 -42
package/telemetry.yml
CHANGED
|
@@ -21,15 +21,16 @@ collect:
|
|
|
21
21
|
- expand-label
|
|
22
22
|
- expandText
|
|
23
23
|
- hide-close-button
|
|
24
|
+
- hide-search
|
|
24
25
|
- id
|
|
25
26
|
- influencer-width
|
|
26
27
|
- is-flush
|
|
28
|
+
- item-count
|
|
27
29
|
- kind
|
|
28
30
|
- label
|
|
29
31
|
- label-text
|
|
30
32
|
- lines
|
|
31
|
-
-
|
|
32
|
-
- onc4p-add-select-row-select
|
|
33
|
+
- multi
|
|
33
34
|
- open
|
|
34
35
|
- overflow-aria-label
|
|
35
36
|
- prevent-close-on-click-outside
|
|
@@ -56,22 +57,50 @@ collect:
|
|
|
56
57
|
- version
|
|
57
58
|
# c4p-action-set
|
|
58
59
|
- disable-stacking
|
|
59
|
-
# c4p-add-select
|
|
60
|
-
- multi
|
|
61
60
|
# c4p-add-select-body
|
|
62
61
|
- global-search-label
|
|
63
62
|
- global-search-placeholder
|
|
64
|
-
- item-count
|
|
65
63
|
- items-label
|
|
64
|
+
- onc4p-add-select-body-breadcrumb-click
|
|
66
65
|
- onc4p-add-select-body-search
|
|
67
66
|
- path
|
|
68
67
|
- search-results-title
|
|
68
|
+
# c4p-add-select-column
|
|
69
|
+
- all-indeterminate
|
|
70
|
+
- all-selected
|
|
71
|
+
- onc4p-add-select-column-search
|
|
72
|
+
- onc4p-add-select-column-select-all
|
|
73
|
+
- search-label
|
|
74
|
+
- search-placeholder
|
|
75
|
+
- show-select-all
|
|
76
|
+
# c4p-add-select-item-panel
|
|
77
|
+
- onc4p-add-select-item-panel-close
|
|
78
|
+
- show-close-button
|
|
69
79
|
# c4p-add-select-row
|
|
80
|
+
- _column-multi
|
|
70
81
|
- disabled
|
|
71
82
|
- has-children
|
|
83
|
+
- has-item-panel
|
|
84
|
+
- indeterminate
|
|
72
85
|
- item-id
|
|
86
|
+
- item-panel-icon-description
|
|
87
|
+
- item-panel-open
|
|
88
|
+
- onc4p-add-select-row-item-panel-click
|
|
89
|
+
- onc4p-add-select-row-navigate
|
|
90
|
+
- onc4p-add-select-row-select
|
|
73
91
|
- parent-id
|
|
74
92
|
- selected
|
|
93
|
+
- skeleton
|
|
94
|
+
# c4p-add-select-selection-summary
|
|
95
|
+
- edit-icon-description
|
|
96
|
+
- onc4p-add-select-selection-summary-edit
|
|
97
|
+
- selected-item-count
|
|
98
|
+
- show-edit-icon
|
|
99
|
+
# c4p-add-select-selection-summary-item
|
|
100
|
+
- hide-remove-button
|
|
101
|
+
- onc4p-add-select-selection-summary-item-remove
|
|
102
|
+
- remove-button-label
|
|
103
|
+
- use-accordion
|
|
75
104
|
# c4p-big-number
|
|
76
105
|
- fraction-digits
|
|
77
106
|
- loading
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
*
|
|
4
|
-
* Copyright IBM Corp. 2026
|
|
5
|
-
*
|
|
6
|
-
* This source code is licensed under the Apache-2.0 license found in the
|
|
7
|
-
* LICENSE file in the root directory of this source tree.
|
|
8
|
-
*/
|
|
9
|
-
import { LitElement } from 'lit';
|
|
10
|
-
/**
|
|
11
|
-
* Add Select Content component - contains the list of selectable items
|
|
12
|
-
* @element c4p-add-select-content
|
|
13
|
-
* @slot default - Contains c4p-add-select-row components
|
|
14
|
-
*/
|
|
15
|
-
declare class CDSAddSelectContent extends LitElement {
|
|
16
|
-
/**
|
|
17
|
-
* Whether this is a multi-select list (inherited from parent c4p-add-select)
|
|
18
|
-
* @private
|
|
19
|
-
*/
|
|
20
|
-
private get _multi();
|
|
21
|
-
/**
|
|
22
|
-
* Current focused item index
|
|
23
|
-
*/
|
|
24
|
-
private _focusedIndex;
|
|
25
|
-
/**
|
|
26
|
-
* Track if user has interacted with keyboard navigation
|
|
27
|
-
*/
|
|
28
|
-
private _hasKeyboardInteraction;
|
|
29
|
-
/**
|
|
30
|
-
* Get all item elements
|
|
31
|
-
*/
|
|
32
|
-
private _getItems;
|
|
33
|
-
/**
|
|
34
|
-
* Update focus on items - only one item should have tabindex="0"
|
|
35
|
-
*/
|
|
36
|
-
private _updateItemFocus;
|
|
37
|
-
/**
|
|
38
|
-
* Handle keyboard navigation
|
|
39
|
-
*/
|
|
40
|
-
private _handleKeyDown;
|
|
41
|
-
/**
|
|
42
|
-
* Initialize focus management after first update
|
|
43
|
-
*/
|
|
44
|
-
firstUpdated(): void;
|
|
45
|
-
/**
|
|
46
|
-
* Handle slot change to update focus management
|
|
47
|
-
*/
|
|
48
|
-
private _handleSlotChange;
|
|
49
|
-
/**
|
|
50
|
-
* Update lifecycle - ensure focus is maintained when items change
|
|
51
|
-
*/
|
|
52
|
-
updated(changedProperties: Map<string, any>): void;
|
|
53
|
-
render(): import("lit-html").TemplateResult<1>;
|
|
54
|
-
static styles: any;
|
|
55
|
-
}
|
|
56
|
-
export default CDSAddSelectContent;
|
|
57
|
-
//# sourceMappingURL=add-select-content.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"add-select-content.d.ts","sourceRoot":"","sources":["../../../src/components/add-select/add-select-content.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAQ,MAAM,KAAK,CAAC;AAQvC;;;;GAIG;AACH,cACM,mBAAoB,SAAQ,UAAU;IAC1C;;;OAGG;IACH,OAAO,KAAK,MAAM,GAGjB;IAED;;OAEG;IACH,OAAO,CAAC,aAAa,CAAK;IAE1B;;OAEG;IACH,OAAO,CAAC,uBAAuB,CAAS;IAExC;;OAEG;IACH,OAAO,CAAC,SAAS;IAYjB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAqBxB;;OAEG;IACH,OAAO,CAAC,cAAc;IAgGtB;;OAEG;IACH,YAAY;IAKZ;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAazB;;OAEG;IACH,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;IAiB3C,MAAM;IAyBN,MAAM,CAAC,MAAM,MAAU;CACxB;AAED,eAAe,mBAAmB,CAAC"}
|
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright IBM Corp. 2020, 2026
|
|
3
|
-
*
|
|
4
|
-
* This source code is licensed under the Apache-2.0 license found in the
|
|
5
|
-
* LICENSE file in the root directory of this source tree.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import "../../globals/settings.js";
|
|
9
|
-
import { __decorate } from "../../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.js";
|
|
10
|
-
import add_select_content_default$1 from "./add-select-content.scss.js";
|
|
11
|
-
import { classMap } from "lit/directives/class-map.js";
|
|
12
|
-
import { LitElement, html } from "lit";
|
|
13
|
-
import { carbonElement } from "@carbon/web-components/es/globals/decorators/carbon-element.js";
|
|
14
|
-
//#region src/components/add-select/add-select-content.ts
|
|
15
|
-
/**
|
|
16
|
-
* @license
|
|
17
|
-
*
|
|
18
|
-
* Copyright IBM Corp. 2026
|
|
19
|
-
*
|
|
20
|
-
* This source code is licensed under the Apache-2.0 license found in the
|
|
21
|
-
* LICENSE file in the root directory of this source tree.
|
|
22
|
-
*/
|
|
23
|
-
const blockClass = `c4p--add-select__next-list`;
|
|
24
|
-
/**
|
|
25
|
-
* Add Select Content component - contains the list of selectable items
|
|
26
|
-
* @element c4p-add-select-content
|
|
27
|
-
* @slot default - Contains c4p-add-select-row components
|
|
28
|
-
*/
|
|
29
|
-
let CDSAddSelectContent = class CDSAddSelectContent extends LitElement {
|
|
30
|
-
constructor(..._args) {
|
|
31
|
-
super(..._args);
|
|
32
|
-
this._focusedIndex = 0;
|
|
33
|
-
this._hasKeyboardInteraction = false;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Whether this is a multi-select list (inherited from parent c4p-add-select)
|
|
37
|
-
* @private
|
|
38
|
-
*/
|
|
39
|
-
get _multi() {
|
|
40
|
-
return this.closest(`c4p-add-select`)?.multi ?? false;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Get all item elements
|
|
44
|
-
*/
|
|
45
|
-
_getItems() {
|
|
46
|
-
const slot = this.shadowRoot?.querySelector("slot");
|
|
47
|
-
if (!slot) return [];
|
|
48
|
-
return slot.assignedElements({ flatten: true }).filter((el) => el.tagName.toLowerCase() === `c4p-add-select-row`);
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Update focus on items - only one item should have tabindex="0"
|
|
52
|
-
*/
|
|
53
|
-
_updateItemFocus(focusIndex, shouldFocus = true) {
|
|
54
|
-
const items = this._getItems();
|
|
55
|
-
if (items.length === 0) return;
|
|
56
|
-
this._focusedIndex = Math.max(0, Math.min(focusIndex, items.length - 1));
|
|
57
|
-
items.forEach((item, index) => {
|
|
58
|
-
if (index === this._focusedIndex) {
|
|
59
|
-
item.setAttribute("tabindex", "0");
|
|
60
|
-
if (shouldFocus) item.focus();
|
|
61
|
-
} else item.setAttribute("tabindex", "-1");
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Handle keyboard navigation
|
|
66
|
-
*/
|
|
67
|
-
_handleKeyDown(event) {
|
|
68
|
-
const items = this._getItems();
|
|
69
|
-
if (items.length === 0) return;
|
|
70
|
-
this._hasKeyboardInteraction = true;
|
|
71
|
-
const currentItem = items[this._focusedIndex];
|
|
72
|
-
let handled = false;
|
|
73
|
-
switch (event.key) {
|
|
74
|
-
case "ArrowDown":
|
|
75
|
-
event.preventDefault();
|
|
76
|
-
this._updateItemFocus(this._focusedIndex + 1);
|
|
77
|
-
handled = true;
|
|
78
|
-
break;
|
|
79
|
-
case "ArrowUp":
|
|
80
|
-
event.preventDefault();
|
|
81
|
-
this._updateItemFocus(this._focusedIndex - 1);
|
|
82
|
-
handled = true;
|
|
83
|
-
break;
|
|
84
|
-
case "ArrowRight":
|
|
85
|
-
if (currentItem && currentItem.hasAttribute("has-children")) {
|
|
86
|
-
event.preventDefault();
|
|
87
|
-
const navigateEvent = new CustomEvent("c4p-add-select-row-navigate", {
|
|
88
|
-
bubbles: true,
|
|
89
|
-
composed: true,
|
|
90
|
-
detail: {
|
|
91
|
-
itemId: currentItem.getAttribute("item-id"),
|
|
92
|
-
title: currentItem.getAttribute("title"),
|
|
93
|
-
parentId: currentItem.getAttribute("parent-id") || ""
|
|
94
|
-
}
|
|
95
|
-
});
|
|
96
|
-
currentItem.dispatchEvent(navigateEvent);
|
|
97
|
-
handled = true;
|
|
98
|
-
}
|
|
99
|
-
break;
|
|
100
|
-
case "Enter":
|
|
101
|
-
case " ":
|
|
102
|
-
event.preventDefault();
|
|
103
|
-
if (currentItem) {
|
|
104
|
-
const newSelected = !currentItem.hasAttribute("selected");
|
|
105
|
-
if (newSelected) currentItem.setAttribute("selected", "");
|
|
106
|
-
else currentItem.removeAttribute("selected");
|
|
107
|
-
const selectEvent = new CustomEvent("c4p-add-select-row-select", {
|
|
108
|
-
bubbles: true,
|
|
109
|
-
composed: true,
|
|
110
|
-
detail: {
|
|
111
|
-
itemId: currentItem.getAttribute("item-id"),
|
|
112
|
-
selected: newSelected,
|
|
113
|
-
value: currentItem.getAttribute("value")
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
currentItem.dispatchEvent(selectEvent);
|
|
117
|
-
}
|
|
118
|
-
handled = true;
|
|
119
|
-
break;
|
|
120
|
-
case "Home":
|
|
121
|
-
if (event.ctrlKey) {
|
|
122
|
-
event.preventDefault();
|
|
123
|
-
this._updateItemFocus(0);
|
|
124
|
-
handled = true;
|
|
125
|
-
}
|
|
126
|
-
break;
|
|
127
|
-
case "End":
|
|
128
|
-
if (event.ctrlKey) {
|
|
129
|
-
event.preventDefault();
|
|
130
|
-
this._updateItemFocus(items.length - 1);
|
|
131
|
-
handled = true;
|
|
132
|
-
}
|
|
133
|
-
break;
|
|
134
|
-
}
|
|
135
|
-
if (handled) event.stopPropagation();
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Initialize focus management after first update
|
|
139
|
-
*/
|
|
140
|
-
firstUpdated() {
|
|
141
|
-
this._updateItemFocus(0, false);
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* Handle slot change to update focus management
|
|
145
|
-
*/
|
|
146
|
-
_handleSlotChange() {
|
|
147
|
-
const items = this._getItems();
|
|
148
|
-
if (items.length > 0) {
|
|
149
|
-
if (this._focusedIndex >= items.length) this._focusedIndex = 0;
|
|
150
|
-
this._updateItemFocus(this._focusedIndex, this._hasKeyboardInteraction);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Update lifecycle - ensure focus is maintained when items change
|
|
155
|
-
*/
|
|
156
|
-
updated(changedProperties) {
|
|
157
|
-
super.updated(changedProperties);
|
|
158
|
-
const items = this._getItems();
|
|
159
|
-
if (items.length > 0) {
|
|
160
|
-
if (!items.some((item) => item.getAttribute("tabindex") === "0")) this._updateItemFocus(0, this._hasKeyboardInteraction);
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
render() {
|
|
164
|
-
const { _handleKeyDown: handleKeyDown, _handleSlotChange: handleSlotChange } = this;
|
|
165
|
-
return html`
|
|
166
|
-
<div
|
|
167
|
-
class=${classMap({ [`${blockClass}-list`]: true })}
|
|
168
|
-
role="grid"
|
|
169
|
-
aria-multiselectable=${this._multi}
|
|
170
|
-
tabindex="0"
|
|
171
|
-
@keydown=${handleKeyDown}
|
|
172
|
-
>
|
|
173
|
-
<div class="${blockClass}-list-body">
|
|
174
|
-
<slot @slotchange=${handleSlotChange}></slot>
|
|
175
|
-
</div>
|
|
176
|
-
</div>
|
|
177
|
-
`;
|
|
178
|
-
}
|
|
179
|
-
static {
|
|
180
|
-
this.styles = add_select_content_default$1;
|
|
181
|
-
}
|
|
182
|
-
};
|
|
183
|
-
CDSAddSelectContent = __decorate([carbonElement(`c4p-add-select-content`)], CDSAddSelectContent);
|
|
184
|
-
var add_select_content_default = CDSAddSelectContent;
|
|
185
|
-
//#endregion
|
|
186
|
-
export { add_select_content_default as default };
|
|
187
|
-
|
|
188
|
-
//# sourceMappingURL=add-select-content.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"add-select-content.js","names":["styles","customElement"],"sources":["../../../src/components/add-select/add-select-content.ts"],"sourcesContent":["/**\n * @license\n *\n * Copyright IBM Corp. 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 { LitElement, html } from 'lit';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { carbonElement as customElement } from '@carbon/web-components/es/globals/decorators/carbon-element.js';\nimport { prefix } from '../../globals/settings';\nimport styles from './add-select-content.scss?lit';\n\nconst blockClass = `${prefix}--add-select__next-list`;\n\n/**\n * Add Select Content component - contains the list of selectable items\n * @element c4p-add-select-content\n * @slot default - Contains c4p-add-select-row components\n */\n@customElement(`${prefix}-add-select-content`)\nclass CDSAddSelectContent extends LitElement {\n /**\n * Whether this is a multi-select list (inherited from parent c4p-add-select)\n * @private\n */\n private get _multi(): boolean {\n const parent = this.closest(`${prefix}-add-select`) as any;\n return parent?.multi ?? false;\n }\n\n /**\n * Current focused item index\n */\n private _focusedIndex = 0;\n\n /**\n * Track if user has interacted with keyboard navigation\n */\n private _hasKeyboardInteraction = false;\n\n /**\n * Get all item elements\n */\n private _getItems(): HTMLElement[] {\n const slot = this.shadowRoot?.querySelector('slot');\n if (!slot) {\n return [];\n }\n\n const assignedElements = slot.assignedElements({ flatten: true });\n return assignedElements.filter(\n (el) => el.tagName.toLowerCase() === `${prefix}-add-select-row`\n ) as HTMLElement[];\n }\n\n /**\n * Update focus on items - only one item should have tabindex=\"0\"\n */\n private _updateItemFocus(focusIndex: number, shouldFocus = true) {\n const items = this._getItems();\n if (items.length === 0) {\n return;\n }\n\n // Ensure focusIndex is within bounds\n this._focusedIndex = Math.max(0, Math.min(focusIndex, items.length - 1));\n\n items.forEach((item, index) => {\n if (index === this._focusedIndex) {\n item.setAttribute('tabindex', '0');\n if (shouldFocus) {\n item.focus();\n }\n } else {\n item.setAttribute('tabindex', '-1');\n }\n });\n }\n\n /**\n * Handle keyboard navigation\n */\n private _handleKeyDown(event: KeyboardEvent) {\n const items = this._getItems();\n if (items.length === 0) {\n return;\n }\n\n // Mark that keyboard interaction has occurred\n this._hasKeyboardInteraction = true;\n\n const currentItem = items[this._focusedIndex];\n let handled = false;\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this._updateItemFocus(this._focusedIndex + 1);\n handled = true;\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n this._updateItemFocus(this._focusedIndex - 1);\n handled = true;\n break;\n\n case 'ArrowRight':\n // Check if current item has children\n if (currentItem && currentItem.hasAttribute('has-children')) {\n event.preventDefault();\n // Trigger the item's navigate event\n const navigateEvent = new CustomEvent('c4p-add-select-row-navigate', {\n bubbles: true,\n composed: true,\n detail: {\n itemId: currentItem.getAttribute('item-id'),\n title: currentItem.getAttribute('title'),\n parentId: currentItem.getAttribute('parent-id') || '',\n },\n });\n currentItem.dispatchEvent(navigateEvent);\n handled = true;\n }\n break;\n\n case 'Enter':\n case ' ':\n event.preventDefault();\n // Trigger the item's selection\n if (currentItem) {\n const isSelected = currentItem.hasAttribute('selected');\n const newSelected = !isSelected;\n\n // Update the item's selected attribute\n if (newSelected) {\n currentItem.setAttribute('selected', '');\n } else {\n currentItem.removeAttribute('selected');\n }\n\n // Dispatch selection event\n const selectEvent = new CustomEvent('c4p-add-select-row-select', {\n bubbles: true,\n composed: true,\n detail: {\n itemId: currentItem.getAttribute('item-id'),\n selected: newSelected,\n value: currentItem.getAttribute('value'),\n },\n });\n currentItem.dispatchEvent(selectEvent);\n }\n handled = true;\n break;\n\n case 'Home':\n if (event.ctrlKey) {\n event.preventDefault();\n this._updateItemFocus(0);\n handled = true;\n }\n break;\n\n case 'End':\n if (event.ctrlKey) {\n event.preventDefault();\n this._updateItemFocus(items.length - 1);\n handled = true;\n }\n break;\n }\n\n if (handled) {\n event.stopPropagation();\n }\n }\n\n /**\n * Initialize focus management after first update\n */\n firstUpdated() {\n // Set initial tabindex but don't focus\n this._updateItemFocus(0, false);\n }\n\n /**\n * Handle slot change to update focus management\n */\n private _handleSlotChange() {\n // Ensure focus is maintained when items change\n const items = this._getItems();\n if (items.length > 0) {\n // Reset to first item if current index is out of bounds\n if (this._focusedIndex >= items.length) {\n this._focusedIndex = 0;\n }\n // Re-apply focus management to new items, but only actually focus if keyboard interaction occurred\n this._updateItemFocus(this._focusedIndex, this._hasKeyboardInteraction);\n }\n }\n\n /**\n * Update lifecycle - ensure focus is maintained when items change\n */\n updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties);\n\n // Re-initialize focus when items might have changed\n const items = this._getItems();\n if (items.length > 0) {\n // Ensure at least one item has tabindex=\"0\"\n const hasFocusableItem = items.some(\n (item) => item.getAttribute('tabindex') === '0'\n );\n if (!hasFocusableItem) {\n // Set tabindex but don't focus unless keyboard interaction occurred\n this._updateItemFocus(0, this._hasKeyboardInteraction);\n }\n }\n }\n\n render() {\n const {\n _handleKeyDown: handleKeyDown,\n _handleSlotChange: handleSlotChange,\n } = this;\n\n const listClasses = classMap({\n [`${blockClass}-list`]: true,\n });\n\n return html`\n <div\n class=${listClasses}\n role=\"grid\"\n aria-multiselectable=${this._multi}\n tabindex=\"0\"\n @keydown=${handleKeyDown}\n >\n <div class=\"${blockClass}-list-body\">\n <slot @slotchange=${handleSlotChange}></slot>\n </div>\n </div>\n `;\n }\n\n static styles = styles;\n}\n\nexport default CDSAddSelectContent;\n"],"mappings":"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"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright IBM Corp. 2020, 2026
|
|
3
|
-
*
|
|
4
|
-
* This source code is licensed under the Apache-2.0 license found in the
|
|
5
|
-
* LICENSE file in the root directory of this source tree.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { css } from "lit";
|
|
9
|
-
//#region src/components/add-select/add-select-content.scss?lit
|
|
10
|
-
var add_select_content_default = css([".c4p--add-select__next{position:relative}.c4p--add-select__next,.c4p--add-select__next__body{block-size:100%;display:flex;flex-direction:column;inline-size:100%}.c4p--add-select__next__header{border-block-end:1px solid var(--cds-border-subtle-01,#c6c6c6);padding-block-end:.5rem;padding-block-start:1rem;padding-inline:1rem}.c4p--add-select__next__search{margin-block-end:1rem}.c4p--add-select__next__search--with-actions{align-items:flex-end;display:flex}.c4p--add-select__next__search-input{flex:1}.c4p--add-select__next__global-actions{align-items:flex-end;display:flex}.c4p--add-select__next__sub-header{align-items:center;display:flex;justify-content:space-between}.c4p--add-select__next__tags{align-items:center;display:flex;gap:.5rem}.c4p--add-select__next__tags-label{color:var(--cds-text-primary,#161616);font-size:var(--cds-heading-compact-02-font-size,1rem);font-weight:var(--cds-heading-compact-02-font-weight,600);letter-spacing:var(--cds-heading-compact-02-letter-spacing,0);line-height:var(--cds-heading-compact-02-line-height,1.375);margin:0}.c4p--add-select__next__sub-header-actions{align-items:center;display:flex;gap:.5rem;margin-inline-start:1rem}.c4p--add-select__next__content{display:flex;flex:1;flex-direction:column;overflow:auto}.c4p--add-select__next-list{display:flex;flex:1;flex-direction:column;overflow-y:auto}@supports (overflow-block:auto){.c4p--add-select__next-list{overflow-block:auto}}.c4p--add-select__next-list:focus{outline:none}.c4p--add-select__next-list-body{display:flex;flex-direction:column}.c4p--add-select__next-list-body--horizontal{align-items:stretch;block-size:100%;flex-direction:row}.c4p--add-select__next-list-body--horizontal .c4p--add-select__next-column{padding-block:1rem;padding-inline:1rem}.c4p--add-select__next-row{border-inline-start:.125rem solid transparent;display:flex;transition:background-color 70ms cubic-bezier(.2,0,.38,.9)}.c4p--add-select__next-row:focus{outline:.125rem solid var(--cds-focus,#0f62fe);outline-offset:-.125rem}.c4p--add-select__next-row:focus:not(:focus-visible){outline:none}.c4p--add-select__next-row--selected{background-color:var(--cds-layer-selected-01,#e0e0e0)}.c4p--add-select__next-row--selected .c4p--add-select__next-row__cell-wrapper{border-block-end-color:var(--cds-border-subtle-selected-01,#c6c6c6)}.c4p--add-select__next-row--disabled{cursor:not-allowed}.c4p--add-select__next-row--disabled .c4p--add-select__next-row__subtitle,.c4p--add-select__next-row--disabled .c4p--add-select__next-row__title{color:var(--cds-text-disabled,hsla(0,0%,9%,.25))}.c4p--add-select__next-row--disabled .c4p--add-select__next-row__icon svg,.c4p--add-select__next-row--disabled .c4p--add-select__next-row__nav-indicator svg,.c4p--add-select__next-row--disabled .c4p--add-select__next-row__view-item-panel svg{fill:var(--cds-icon-disabled,hsla(0,0%,9%,.25))}.c4p--add-select__next-row:hover:not(.c4p--add-select__next-row--disabled){background:var(--cds-layer-hover-01,#e8e8e8)}.c4p--add-select__next-row:hover:not(.c4p--add-select__next-row--disabled) .c4p--add-select__next-row__title{color:var(--cds-link-primary,#0f62fe)}.c4p--add-select__next-row:hover:not(.c4p--add-select__next-row--disabled) .c4p--add-select__next-row__nav-indicator svg,.c4p--add-select__next-row:hover:not(.c4p--add-select__next-row--disabled) .c4p--add-select__next-row__view-item-panel svg{fill:var(--cds-icon-disabled,hsla(0,0%,9%,.25))}.c4p--add-select__next-row--selected:hover:not(.c4p--add-select__next-row--disabled){background:var(--cds-layer-selected-hover-01,#d1d1d1)}.c4p--add-select__next-row--selected:hover:not(.c4p--add-select__next-row--disabled) .c4p--add-select__next-row__title{color:var(--cds-text-primary,#161616)}.c4p--add-select__next-row--selected:hover:not(.c4p--add-select__next-row--disabled) .c4p--add-select__next-row__nav-indicator svg,.c4p--add-select__next-row--selected:hover:not(.c4p--add-select__next-row--disabled) .c4p--add-select__next-row__view-item-panel svg{fill:var(--cds-icon-primary,#161616)}.c4p--add-select__next-row__cell{display:flex;flex:1;flex-direction:column}.c4p--add-select__next-row__cell-wrapper{align-items:center;border-block-end:1px solid var(--cds-border-subtle-01,#c6c6c6);display:flex;justify-content:space-between;min-block-size:3rem;padding-block:.5rem;padding-inline:1rem}.c4p--add-select__next-row__content{align-items:center;align-self:center;display:flex;flex:1}.c4p--add-select__next-row__checkbox{align-self:center;flex:none;margin-inline-end:1rem}.c4p--add-select__next-row__radio{align-self:center}.c4p--add-select__next-row__radio .cds--radio-button__appearance{margin-inline-end:0}.c4p--add-select__next-row__icon{align-items:center;display:flex;margin-inline-end:.5rem}.c4p--add-select__next-row__text{display:flex;flex:1;flex-direction:column}.c4p--add-select__next-row__title{color:var(--cds-text-primary,#161616);display:block;font-size:var(--cds-body-compact-01-font-size,.875rem);font-weight:var(--cds-body-compact-01-font-weight,400);letter-spacing:var(--cds-body-compact-01-letter-spacing,.16px);line-height:var(--cds-body-compact-01-line-height,1.28572)}.c4p--add-select__next-row__subtitle{color:var(--cds-text-secondary,#525252);display:block;font-size:var(--cds-helper-text-01-font-size,.75rem);letter-spacing:var(--cds-helper-text-01-letter-spacing,.32px);line-height:var(--cds-helper-text-01-line-height,1.33333)}.c4p--add-select__next-row__meta{align-items:center;display:flex;margin-inline-start:.5rem}.c4p--add-select__next-row__view-item-panel{margin-inline-start:auto}.c4p--add-select__next-row-item-panel--selected{background-color:var(--cds-layer-hover-01,#e8e8e8);border-inline-start:.125rem solid var(--cds-interactive,#0f62fe)}@media screen and (prefers-reduced-motion:reduce){.c4p--add-select__next-row__nav-indicator{align-items:center;cursor:pointer;display:flex;justify-content:center;margin-inline-start:.5rem;padding-block:.25rem;padding-inline:.25rem;transition:none}.c4p--add-select__next-row__nav-indicator:hover{background-color:var(--cds-background-hover,hsla(0,0%,55%,.12))}.c4p--add-select__next-row__nav-indicator:focus{outline:.125rem solid var(--cds-focus,#0f62fe);outline-offset:-.125rem}.c4p--add-select__next-row__nav-indicator svg{fill:var(--cds-icon-primary,#161616)}}.c4p--add-select__next-row__nav-indicator{align-items:center;cursor:pointer;display:flex;justify-content:center;margin-inline-start:.5rem;padding-block:.25rem;padding-inline:.25rem;transition:background-color 70ms cubic-bezier(.2,0,.38,.9)}.c4p--add-select__next-row__nav-indicator:hover{background-color:var(--cds-background-hover,hsla(0,0%,55%,.12))}.c4p--add-select__next-row__nav-indicator:focus{outline:.125rem solid var(--cds-focus,#0f62fe);outline-offset:-.125rem}.c4p--add-select__next-row__nav-indicator svg{fill:var(--cds-icon-primary,#161616)}.c4p--add-select__next-row--skeleton{cursor:default;pointer-events:none}.c4p--add-select__next-row--skeleton:hover{background:none}.c4p--add-select__next-row--skeleton .c4p--add-select__next-row__skeleton-control{background-color:var(--cds-skeleton-element,#c6c6c6);block-size:1rem;border-radius:.125rem;flex:none;inline-size:1rem;margin-inline-end:1rem}.c4p--add-select__next-row--skeleton .c4p--add-select__next-row__icon .cds--icon--skeleton{block-size:2rem;border-radius:50%;inline-size:2rem}.c4p--add-select__next-row--skeleton .c4p--add-select__next-row__icon .cds--icon--skeleton:before{animation:none;border-radius:50%}.c4p--add-select__next-row--skeleton .c4p--add-select__next-row__skeleton-title{margin-block-end:0}.c4p--add-select__next-column{block-size:100%;border-inline-end:1px solid var(--cds-border-subtle-01,#c6c6c6);display:flex;flex-direction:column;min-inline-size:300px;padding-block:1rem;padding-inline:1rem}.c4p--add-select__next-column:last-child{border-inline-end:none}.c4p--add-select__next-list-body--horizontal .c4p--add-select__next-column:last-child{border-inline-end:1px solid var(--cds-border-subtle-01,#c6c6c6)}.c4p--add-select__next-column__actions,.c4p--add-select__next-column__search--with-actions{align-items:flex-end;display:flex}.c4p--add-select__next-column__search-bar{padding-block-end:0;padding-block-start:1rem;padding-inline:1rem}.c4p--add-select__next-column__search-wrapper{align-items:center;display:flex;gap:0}.c4p--add-select__next-column__search-input{flex:1}.c4p--add-select__next-column__controls{align-items:center;display:flex;gap:0}.c4p--add-select__next-column__filter-button,.c4p--add-select__next-column__sort-button{flex:none}.c4p--add-select__next-column__filter-popover{padding-block:1rem;padding-inline:1rem}.c4p--add-select__next-column__filter-popover .cds--checkbox-wrapper{margin-block-end:.5rem}.c4p--add-select__next-column__filter-popover .cds--checkbox-wrapper:last-child{margin-block-end:0}.c4p--add-select__next-column__header{align-items:center;border-block-end:1px solid var(--cds-border-subtle-01,#c6c6c6);display:flex;padding-block:1rem;padding-inline:1rem}.c4p--add-select__next-column__select-all .cds--checkbox-label{align-items:center;display:flex;gap:0}.c4p--add-select__next-column__select-all .cds--checkbox-label-text{align-items:center;display:flex;gap:.5rem;margin-inline-start:.5rem}.c4p--add-select__next-column__title-wrapper{align-items:center;display:flex;gap:.5rem}.c4p--add-select__next-column__title{font-size:var(--cds-heading-compact-01-font-size,.875rem);font-weight:var(--cds-heading-compact-01-font-weight,600);letter-spacing:var(--cds-heading-compact-01-letter-spacing,.16px);line-height:var(--cds-heading-compact-01-line-height,1.28572)}.c4p--add-select__next-column__rows{display:flex;flex:1;flex-direction:column;overflow-y:auto}@supports (overflow-block:auto){.c4p--add-select__next-column__rows{overflow-block:auto}}.c4p--add-select__next__breadcrumbs{flex-wrap:wrap}.c4p--add-select__next__breadcrumb-item,.c4p--add-select__next__breadcrumbs{align-items:center;display:flex;gap:.25rem}.c4p--add-select__next__breadcrumb-button{background:none;border:none;color:var(--cds-link-primary,#0f62fe);cursor:pointer;font-size:var(--cds-body-compact-01-font-size,.875rem);font-weight:var(--cds-body-compact-01-font-weight,400);letter-spacing:var(--cds-body-compact-01-letter-spacing,.16px);line-height:var(--cds-body-compact-01-line-height,1.28572);padding-block:0;padding-inline:0;text-decoration:none}.c4p--add-select__next__breadcrumb-button:hover{color:var(--cds-link-primary-hover,#0043ce);text-decoration:underline}.c4p--add-select__next__breadcrumb-button:focus{outline:.125rem solid var(--cds-focus,#0f62fe);outline-offset:.125rem}.c4p--add-select__next__breadcrumb-separator{align-items:center;color:var(--cds-text-secondary,#525252);display:flex}.c4p--add-select__next__breadcrumb-separator svg{fill:currentColor}.c4p--add-select__next__breadcrumb-current{color:var(--cds-text-primary,#161616);font-size:var(--cds-body-compact-01-font-size,.875rem);font-weight:var(--cds-body-compact-01-font-weight,400);letter-spacing:var(--cds-body-compact-01-letter-spacing,.16px);line-height:var(--cds-body-compact-01-line-height,1.28572)}.c4p--add-select__next__selection-summary{display:flex;flex-direction:column}.c4p--add-select__next__selection-summary-header{align-items:center;border-block-end:1px solid var(--cds-layer-accent-01,#e0e0e0);display:flex;padding-block-end:.5rem;padding-block-start:1.5rem;padding-inline:1rem}.c4p--add-select__next__selection-summary-title{font-size:var(--cds-heading-compact-02-font-size,1rem);font-weight:var(--cds-heading-compact-02-font-weight,600);letter-spacing:var(--cds-heading-compact-02-letter-spacing,0);line-height:var(--cds-heading-compact-02-line-height,1.375);margin-inline-end:.5rem}.c4p--add-select__next__selection-summary-header-actions{align-items:center;display:flex;gap:.5rem;margin-inline-start:auto}.c4p--add-select__next__selection-summary-item-default{border-block-end:1px solid var(--cds-border-subtle-01,#c6c6c6);padding-block:.75rem;padding-inline:1rem}.c4p--add-select__next__selection-summary-item-default-title{color:var(--cds-text-primary,#161616);font-size:var(--cds-body-compact-01-font-size,.875rem);font-weight:var(--cds-body-compact-01-font-weight,400);letter-spacing:var(--cds-body-compact-01-letter-spacing,.16px);line-height:var(--cds-body-compact-01-line-height,1.28572)}.c4p--add-select__next__selection-summary-item-default-subtitle{color:var(--cds-text-secondary,#525252);font-size:var(--cds-body-01-font-size,.875rem);font-weight:var(--cds-body-01-font-weight,400);letter-spacing:var(--cds-body-01-letter-spacing,.16px);line-height:var(--cds-body-01-line-height,1.42857)}.c4p--add-select__next__selection-summary-item{background-color:var(--cds-layer-01,#f4f4f4);border-block-end:1px solid var(--cds-border-subtle-01,#c6c6c6);position:relative}.c4p--add-select__next__selection-summary-item:hover{background-color:var(--cds-layer-hover-01,#e8e8e8)}.c4p--add-select__next__selection-summary-item--accordion .cds--accordion__item,.c4p--add-select__next__selection-summary-item--accordion .cds--accordion__item:last-child{border-block-end:none;border-block-start:none}.c4p--add-select__next__selection-summary-item--accordion .cds--accordion__heading{min-block-size:unset;padding-block:.75rem;padding-inline-end:1rem}.c4p--add-select__next__selection-summary-item--default .c4p--add-select__next__selection-summary-item-title-wrapper{align-items:center;display:flex;justify-content:space-between;padding-block:.75rem;padding-inline:1rem}.c4p--add-select__next__selection-summary-item--default .c4p--add-select__next__selection-summary-item-content{padding-block-end:.75rem;padding-inline:1rem}.c4p--add-select__next__selection-summary-item--default .c4p--add-select__next__selection-summary-item-title{font-size:var(--cds-heading-compact-01-font-size,.875rem);font-weight:var(--cds-heading-compact-01-font-weight,600);letter-spacing:var(--cds-heading-compact-01-letter-spacing,.16px);line-height:var(--cds-heading-compact-01-line-height,1.28572)}.c4p--add-select__next__selection-summary-item-title-wrapper{align-items:center;display:flex;justify-content:space-between}.c4p--add-select__next__selection-summary-item-selected-item{flex:1}.c4p--add-select__next__selection-summary-item-title{color:var(--cds-text-primary,#161616);font-size:var(--cds-body-compact-01-font-size,.875rem);font-weight:var(--cds-body-compact-01-font-weight,400);letter-spacing:var(--cds-body-compact-01-letter-spacing,.16px);line-height:var(--cds-body-compact-01-line-height,1.28572)}.c4p--add-select__next__selection-summary-item-subtitle{color:var(--cds-text-secondary,#525252);font-size:var(--cds-body-01-font-size,.875rem);font-weight:var(--cds-body-01-font-weight,400);letter-spacing:var(--cds-body-01-letter-spacing,.16px);line-height:var(--cds-body-01-line-height,1.42857)}.c4p--add-select__next__selection-summary-item-entry{margin-block-end:1rem}.c4p--add-select__next__selection-summary-item-header{color:var(--cds-text-secondary,#525252);font-size:var(--cds-label-01-font-size,.75rem);font-weight:var(--cds-label-01-font-weight,400);letter-spacing:var(--cds-label-01-letter-spacing,.32px);line-height:var(--cds-label-01-line-height,1.33333);margin-block-end:.5rem}.c4p--add-select__next__selection-summary-item-body{font-size:var(--cds-body-01-font-size,.875rem);font-weight:var(--cds-body-01-font-weight,400);letter-spacing:var(--cds-body-01-letter-spacing,.16px);line-height:var(--cds-body-01-line-height,1.42857);margin-block-end:1rem}.c4p--add-select__next__selection-summary-item-remove-button-container{align-items:center;display:inline-flex;justify-content:center;padding-inline-start:.5rem}.c4p--add-select__next__selection-summary-item--accordion .c4p--add-select__next__selection-summary-item-remove-button-container{inset-block-start:50%;inset-inline-end:1rem;padding-inline-start:0;position:absolute;transform:translateY(-50%)}.c4p--add-select__next__selection-summary-item-remove-button{opacity:0;transition:opacity 70ms cubic-bezier(.2,0,.38,.9)}@media screen and (prefers-reduced-motion:reduce){.c4p--add-select__next__selection-summary-item-remove-button{transition:none}}.c4p--add-select__next__selection-summary-item:focus-within .c4p--add-select__next__selection-summary-item-remove-button,.c4p--add-select__next__selection-summary-item:hover .c4p--add-select__next__selection-summary-item-remove-button{opacity:1}.c4p--add-select__next__selection-summary-item-content{margin-block-start:0}.c4p--add-select__next__selection-summary .cds--accordion__arrow{transform:rotate(90deg)}.c4p--add-select__next__selection-summary .cds--accordion__item--active .cds--accordion__arrow{transform:rotate(-90deg)}.c4p--add-select__next__selection-summary .cds--accordion--start .cds--accordion__arrow{margin-block:0;margin-inline-end:0;margin-inline-start:1rem}.c4p--add-select__next__selection-summary .cds--accordion--start .cds--accordion__title{margin-inline-end:0;margin-inline-start:.5rem;padding-inline-end:2rem}.c4p--add-select__next__selection-summary .cds--accordion__item--active .cds--accordion__content{margin-block-start:0;padding-block:1rem;padding-inline:1rem}.c4p--add-select__next__item-summary-panel-header{align-items:center;border-block-end:1px solid var(--cds-layer-accent-01,#e0e0e0);display:flex;gap:.5rem;justify-content:space-between;padding-block-end:.5rem;padding-block-start:2rem;padding-inline:1rem}.c4p--add-select__next__item-summary-panel-title{font-size:var(--cds-heading-compact-02-font-size,1rem);font-weight:var(--cds-heading-compact-02-font-weight,600);letter-spacing:var(--cds-heading-compact-02-letter-spacing,0);line-height:var(--cds-heading-compact-02-line-height,1.375)}.c4p--add-select__next__item-summary-panel-body{padding-block:1rem;padding-inline:1rem}.c4p--add-select__next__item-summary-panel-entry{margin-block-end:1rem}.c4p--add-select__next__item-summary-panel-entry-title{font-size:var(--cds-heading-compact-01-font-size,.875rem);font-weight:var(--cds-heading-compact-01-font-weight,600);letter-spacing:var(--cds-heading-compact-01-letter-spacing,.16px);line-height:var(--cds-heading-compact-01-line-height,1.28572)}.c4p--add-select__next__item-summary-panel-entry-body{font-size:var(--cds-body-compact-01-font-size,.875rem);font-weight:var(--cds-body-compact-01-font-weight,400);letter-spacing:var(--cds-body-compact-01-letter-spacing,.16px);line-height:var(--cds-body-compact-01-line-height,1.28572)}:host(c4p-add-select-content){display:block}:host(c4p-add-select-content) .c4p--add-select__next-list{display:flex;flex-direction:column;overflow-y:auto}@supports (overflow-block:auto){:host(c4p-add-select-content) .c4p--add-select__next-list{overflow-block:auto}}:host(c4p-add-select-content) .c4p--add-select__next-list:focus{outline:none}:host(c4p-add-select-content) .c4p--add-select__next-list-body{display:flex;flex-direction:column}"]);
|
|
11
|
-
//#endregion
|
|
12
|
-
export { add_select_content_default as default };
|
|
13
|
-
|
|
14
|
-
//# sourceMappingURL=add-select-content.scss.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"add-select-content.scss.js","names":[],"sources":["../../../src/components/add-select/add-select-content.scss?lit"],"sourcesContent":["/**\n * Copyright IBM Corp. 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\n$css--plex: true !default;\n\n/* Carbon and IBM Products styles */\n@use '@carbon/styles/scss/theme' as *;\n@use '@carbon/styles/scss/spacing' as *;\n\n$prefix: 'c4p';\n\n/* Import shared AddSelect composable/next styles from ibm-products-styles */\n@use '@carbon/ibm-products-styles/scss/components/AddSelect/add-select_next'\n as *;\n\n/* Web Component specific overrides */\n:host(#{$prefix}-add-select-content) {\n display: block;\n\n /* Apply shared styles within shadow DOM */\n .#{$block-class__next}-list {\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n @supports (overflow-block: auto) {\n overflow-block: auto;\n }\n\n &:focus {\n outline: none;\n }\n }\n\n .#{$block-class__next}-list-body {\n display: flex;\n flex-direction: column;\n }\n}\n"],"mappings":""}
|
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright IBM Corp. 2020, 2026
|
|
3
|
-
*
|
|
4
|
-
* This source code is licensed under the Apache-2.0 license found in the
|
|
5
|
-
* LICENSE file in the root directory of this source tree.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import "../../globals/settings.js";
|
|
9
|
-
import { __decorate } from "../../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.js";
|
|
10
|
-
import add_select_content_default$1 from "./add-select-content.scss.js";
|
|
11
|
-
import { classMap } from "lit/directives/class-map.js";
|
|
12
|
-
import { LitElement, html } from "lit";
|
|
13
|
-
import { carbonElement } from "@carbon/web-components/es/globals/decorators/carbon-element.js";
|
|
14
|
-
//#region src/components/add-select/add-select-content.ts
|
|
15
|
-
/**
|
|
16
|
-
* @license
|
|
17
|
-
*
|
|
18
|
-
* Copyright IBM Corp. 2026
|
|
19
|
-
*
|
|
20
|
-
* This source code is licensed under the Apache-2.0 license found in the
|
|
21
|
-
* LICENSE file in the root directory of this source tree.
|
|
22
|
-
*/
|
|
23
|
-
const blockClass = `c4p--add-select__next-list`;
|
|
24
|
-
/**
|
|
25
|
-
* Add Select Content component - contains the list of selectable items
|
|
26
|
-
* @element c4p-add-select-content
|
|
27
|
-
* @slot default - Contains c4p-add-select-row components
|
|
28
|
-
*/
|
|
29
|
-
let CDSAddSelectContent = class CDSAddSelectContent extends LitElement {
|
|
30
|
-
constructor(..._args) {
|
|
31
|
-
super(..._args);
|
|
32
|
-
this._focusedIndex = 0;
|
|
33
|
-
this._hasKeyboardInteraction = false;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Whether this is a multi-select list (inherited from parent c4p-add-select)
|
|
37
|
-
* @private
|
|
38
|
-
*/
|
|
39
|
-
get _multi() {
|
|
40
|
-
return this.closest(`c4p-add-select`)?.multi ?? false;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Get all item elements
|
|
44
|
-
*/
|
|
45
|
-
_getItems() {
|
|
46
|
-
const slot = this.shadowRoot?.querySelector("slot");
|
|
47
|
-
if (!slot) return [];
|
|
48
|
-
return slot.assignedElements({ flatten: true }).filter((el) => el.tagName.toLowerCase() === `c4p-add-select-row`);
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Update focus on items - only one item should have tabindex="0"
|
|
52
|
-
*/
|
|
53
|
-
_updateItemFocus(focusIndex, shouldFocus = true) {
|
|
54
|
-
const items = this._getItems();
|
|
55
|
-
if (items.length === 0) return;
|
|
56
|
-
this._focusedIndex = Math.max(0, Math.min(focusIndex, items.length - 1));
|
|
57
|
-
items.forEach((item, index) => {
|
|
58
|
-
if (index === this._focusedIndex) {
|
|
59
|
-
item.setAttribute("tabindex", "0");
|
|
60
|
-
if (shouldFocus) item.focus();
|
|
61
|
-
} else item.setAttribute("tabindex", "-1");
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Handle keyboard navigation
|
|
66
|
-
*/
|
|
67
|
-
_handleKeyDown(event) {
|
|
68
|
-
const items = this._getItems();
|
|
69
|
-
if (items.length === 0) return;
|
|
70
|
-
this._hasKeyboardInteraction = true;
|
|
71
|
-
const currentItem = items[this._focusedIndex];
|
|
72
|
-
let handled = false;
|
|
73
|
-
switch (event.key) {
|
|
74
|
-
case "ArrowDown":
|
|
75
|
-
event.preventDefault();
|
|
76
|
-
this._updateItemFocus(this._focusedIndex + 1);
|
|
77
|
-
handled = true;
|
|
78
|
-
break;
|
|
79
|
-
case "ArrowUp":
|
|
80
|
-
event.preventDefault();
|
|
81
|
-
this._updateItemFocus(this._focusedIndex - 1);
|
|
82
|
-
handled = true;
|
|
83
|
-
break;
|
|
84
|
-
case "ArrowRight":
|
|
85
|
-
if (currentItem && currentItem.hasAttribute("has-children")) {
|
|
86
|
-
event.preventDefault();
|
|
87
|
-
const navigateEvent = new CustomEvent("c4p-add-select-row-navigate", {
|
|
88
|
-
bubbles: true,
|
|
89
|
-
composed: true,
|
|
90
|
-
detail: {
|
|
91
|
-
itemId: currentItem.getAttribute("item-id"),
|
|
92
|
-
title: currentItem.getAttribute("title"),
|
|
93
|
-
parentId: currentItem.getAttribute("parent-id") || ""
|
|
94
|
-
}
|
|
95
|
-
});
|
|
96
|
-
currentItem.dispatchEvent(navigateEvent);
|
|
97
|
-
handled = true;
|
|
98
|
-
}
|
|
99
|
-
break;
|
|
100
|
-
case "Enter":
|
|
101
|
-
case " ":
|
|
102
|
-
event.preventDefault();
|
|
103
|
-
if (currentItem) {
|
|
104
|
-
const newSelected = !currentItem.hasAttribute("selected");
|
|
105
|
-
if (newSelected) currentItem.setAttribute("selected", "");
|
|
106
|
-
else currentItem.removeAttribute("selected");
|
|
107
|
-
const selectEvent = new CustomEvent("c4p-add-select-row-select", {
|
|
108
|
-
bubbles: true,
|
|
109
|
-
composed: true,
|
|
110
|
-
detail: {
|
|
111
|
-
itemId: currentItem.getAttribute("item-id"),
|
|
112
|
-
selected: newSelected,
|
|
113
|
-
value: currentItem.getAttribute("value")
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
currentItem.dispatchEvent(selectEvent);
|
|
117
|
-
}
|
|
118
|
-
handled = true;
|
|
119
|
-
break;
|
|
120
|
-
case "Home":
|
|
121
|
-
if (event.ctrlKey) {
|
|
122
|
-
event.preventDefault();
|
|
123
|
-
this._updateItemFocus(0);
|
|
124
|
-
handled = true;
|
|
125
|
-
}
|
|
126
|
-
break;
|
|
127
|
-
case "End":
|
|
128
|
-
if (event.ctrlKey) {
|
|
129
|
-
event.preventDefault();
|
|
130
|
-
this._updateItemFocus(items.length - 1);
|
|
131
|
-
handled = true;
|
|
132
|
-
}
|
|
133
|
-
break;
|
|
134
|
-
}
|
|
135
|
-
if (handled) event.stopPropagation();
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Initialize focus management after first update
|
|
139
|
-
*/
|
|
140
|
-
firstUpdated() {
|
|
141
|
-
this._updateItemFocus(0, false);
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* Handle slot change to update focus management
|
|
145
|
-
*/
|
|
146
|
-
_handleSlotChange() {
|
|
147
|
-
const items = this._getItems();
|
|
148
|
-
if (items.length > 0) {
|
|
149
|
-
if (this._focusedIndex >= items.length) this._focusedIndex = 0;
|
|
150
|
-
this._updateItemFocus(this._focusedIndex, this._hasKeyboardInteraction);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Update lifecycle - ensure focus is maintained when items change
|
|
155
|
-
*/
|
|
156
|
-
updated(changedProperties) {
|
|
157
|
-
super.updated(changedProperties);
|
|
158
|
-
const items = this._getItems();
|
|
159
|
-
if (items.length > 0) {
|
|
160
|
-
if (!items.some((item) => item.getAttribute("tabindex") === "0")) this._updateItemFocus(0, this._hasKeyboardInteraction);
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
render() {
|
|
164
|
-
const { _handleKeyDown: handleKeyDown, _handleSlotChange: handleSlotChange } = this;
|
|
165
|
-
return html`
|
|
166
|
-
<div
|
|
167
|
-
class=${classMap({ [`${blockClass}-list`]: true })}
|
|
168
|
-
role="grid"
|
|
169
|
-
aria-multiselectable=${this._multi}
|
|
170
|
-
tabindex="0"
|
|
171
|
-
@keydown=${handleKeyDown}
|
|
172
|
-
>
|
|
173
|
-
<div class="${blockClass}-list-body">
|
|
174
|
-
<slot @slotchange=${handleSlotChange}></slot>
|
|
175
|
-
</div>
|
|
176
|
-
</div>
|
|
177
|
-
`;
|
|
178
|
-
}
|
|
179
|
-
static {
|
|
180
|
-
this.styles = add_select_content_default$1;
|
|
181
|
-
}
|
|
182
|
-
};
|
|
183
|
-
CDSAddSelectContent = __decorate([carbonElement(`c4p-add-select-content`)], CDSAddSelectContent);
|
|
184
|
-
var add_select_content_default = CDSAddSelectContent;
|
|
185
|
-
//#endregion
|
|
186
|
-
export { add_select_content_default as default };
|
|
187
|
-
|
|
188
|
-
//# sourceMappingURL=add-select-content.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"add-select-content.js","names":["styles","customElement"],"sources":["../../../src/components/add-select/add-select-content.ts"],"sourcesContent":["/**\n * @license\n *\n * Copyright IBM Corp. 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 { LitElement, html } from 'lit';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { carbonElement as customElement } from '@carbon/web-components/es/globals/decorators/carbon-element.js';\nimport { prefix } from '../../globals/settings';\nimport styles from './add-select-content.scss?lit';\n\nconst blockClass = `${prefix}--add-select__next-list`;\n\n/**\n * Add Select Content component - contains the list of selectable items\n * @element c4p-add-select-content\n * @slot default - Contains c4p-add-select-row components\n */\n@customElement(`${prefix}-add-select-content`)\nclass CDSAddSelectContent extends LitElement {\n /**\n * Whether this is a multi-select list (inherited from parent c4p-add-select)\n * @private\n */\n private get _multi(): boolean {\n const parent = this.closest(`${prefix}-add-select`) as any;\n return parent?.multi ?? false;\n }\n\n /**\n * Current focused item index\n */\n private _focusedIndex = 0;\n\n /**\n * Track if user has interacted with keyboard navigation\n */\n private _hasKeyboardInteraction = false;\n\n /**\n * Get all item elements\n */\n private _getItems(): HTMLElement[] {\n const slot = this.shadowRoot?.querySelector('slot');\n if (!slot) {\n return [];\n }\n\n const assignedElements = slot.assignedElements({ flatten: true });\n return assignedElements.filter(\n (el) => el.tagName.toLowerCase() === `${prefix}-add-select-row`\n ) as HTMLElement[];\n }\n\n /**\n * Update focus on items - only one item should have tabindex=\"0\"\n */\n private _updateItemFocus(focusIndex: number, shouldFocus = true) {\n const items = this._getItems();\n if (items.length === 0) {\n return;\n }\n\n // Ensure focusIndex is within bounds\n this._focusedIndex = Math.max(0, Math.min(focusIndex, items.length - 1));\n\n items.forEach((item, index) => {\n if (index === this._focusedIndex) {\n item.setAttribute('tabindex', '0');\n if (shouldFocus) {\n item.focus();\n }\n } else {\n item.setAttribute('tabindex', '-1');\n }\n });\n }\n\n /**\n * Handle keyboard navigation\n */\n private _handleKeyDown(event: KeyboardEvent) {\n const items = this._getItems();\n if (items.length === 0) {\n return;\n }\n\n // Mark that keyboard interaction has occurred\n this._hasKeyboardInteraction = true;\n\n const currentItem = items[this._focusedIndex];\n let handled = false;\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this._updateItemFocus(this._focusedIndex + 1);\n handled = true;\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n this._updateItemFocus(this._focusedIndex - 1);\n handled = true;\n break;\n\n case 'ArrowRight':\n // Check if current item has children\n if (currentItem && currentItem.hasAttribute('has-children')) {\n event.preventDefault();\n // Trigger the item's navigate event\n const navigateEvent = new CustomEvent('c4p-add-select-row-navigate', {\n bubbles: true,\n composed: true,\n detail: {\n itemId: currentItem.getAttribute('item-id'),\n title: currentItem.getAttribute('title'),\n parentId: currentItem.getAttribute('parent-id') || '',\n },\n });\n currentItem.dispatchEvent(navigateEvent);\n handled = true;\n }\n break;\n\n case 'Enter':\n case ' ':\n event.preventDefault();\n // Trigger the item's selection\n if (currentItem) {\n const isSelected = currentItem.hasAttribute('selected');\n const newSelected = !isSelected;\n\n // Update the item's selected attribute\n if (newSelected) {\n currentItem.setAttribute('selected', '');\n } else {\n currentItem.removeAttribute('selected');\n }\n\n // Dispatch selection event\n const selectEvent = new CustomEvent('c4p-add-select-row-select', {\n bubbles: true,\n composed: true,\n detail: {\n itemId: currentItem.getAttribute('item-id'),\n selected: newSelected,\n value: currentItem.getAttribute('value'),\n },\n });\n currentItem.dispatchEvent(selectEvent);\n }\n handled = true;\n break;\n\n case 'Home':\n if (event.ctrlKey) {\n event.preventDefault();\n this._updateItemFocus(0);\n handled = true;\n }\n break;\n\n case 'End':\n if (event.ctrlKey) {\n event.preventDefault();\n this._updateItemFocus(items.length - 1);\n handled = true;\n }\n break;\n }\n\n if (handled) {\n event.stopPropagation();\n }\n }\n\n /**\n * Initialize focus management after first update\n */\n firstUpdated() {\n // Set initial tabindex but don't focus\n this._updateItemFocus(0, false);\n }\n\n /**\n * Handle slot change to update focus management\n */\n private _handleSlotChange() {\n // Ensure focus is maintained when items change\n const items = this._getItems();\n if (items.length > 0) {\n // Reset to first item if current index is out of bounds\n if (this._focusedIndex >= items.length) {\n this._focusedIndex = 0;\n }\n // Re-apply focus management to new items, but only actually focus if keyboard interaction occurred\n this._updateItemFocus(this._focusedIndex, this._hasKeyboardInteraction);\n }\n }\n\n /**\n * Update lifecycle - ensure focus is maintained when items change\n */\n updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties);\n\n // Re-initialize focus when items might have changed\n const items = this._getItems();\n if (items.length > 0) {\n // Ensure at least one item has tabindex=\"0\"\n const hasFocusableItem = items.some(\n (item) => item.getAttribute('tabindex') === '0'\n );\n if (!hasFocusableItem) {\n // Set tabindex but don't focus unless keyboard interaction occurred\n this._updateItemFocus(0, this._hasKeyboardInteraction);\n }\n }\n }\n\n render() {\n const {\n _handleKeyDown: handleKeyDown,\n _handleSlotChange: handleSlotChange,\n } = this;\n\n const listClasses = classMap({\n [`${blockClass}-list`]: true,\n });\n\n return html`\n <div\n class=${listClasses}\n role=\"grid\"\n aria-multiselectable=${this._multi}\n tabindex=\"0\"\n @keydown=${handleKeyDown}\n >\n <div class=\"${blockClass}-list-body\">\n <slot @slotchange=${handleSlotChange}></slot>\n </div>\n </div>\n `;\n }\n\n static styles = styles;\n}\n\nexport default CDSAddSelectContent;\n"],"mappings":"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"}
|